From 12c906397f40c1533b263d056e89faaf4dc3944f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cchange=E2=80=9D?= <“927578985@qq.com”> Date: Sat, 28 Sep 2024 16:53:57 +0800 Subject: [PATCH] init --- .gitignore | 1 + .gitmodules | 25 + CODE_OF_CONDUCT.md | 9 + LICENSE | 21 + README.md | 209 + README_ori.md | 271 + SECURITY.md | 41 + Speech2C/README.md | 145 + Speech2C/speech2c/__init__.py | 1 + Speech2C/speech2c/config/base_100h.yaml | 93 + Speech2C/speech2c/config/base_10h.yaml | 104 + .../config/speech2c_base_librispeech.yaml | 100 + Speech2C/speech2c/criterions/__init__.py | 10 + Speech2C/speech2c/criterions/ctc_ce.py | 404 + .../speech2c/criterions/speech2c_criterion.py | 261 + Speech2C/speech2c/data/speech2c_dataset.py | 145 + .../models/modules/ctc_prefix_score.py | 93 + .../models/modules/multihead_attention.py | 341 + .../models/modules/relative_pos_enc.py | 35 + .../models/modules/transformer_decoder.py | 485 + .../modules/transformer_decoder_layer.py | 215 + .../models/modules/transformer_encoder.py | 278 + Speech2C/speech2c/models/speech2c.py | 321 + Speech2C/speech2c/models/speech2c_asr.py | 276 + Speech2C/speech2c/models/t5_transformer_lm.py | 25 + Speech2C/speech2c/squence_generator.py | 1028 ++ .../speech2c/tasks/speech2c_pretraining.py | 91 + Speech2S/README.md | 64 + Speech2S/speech2s/__init__.py | 1 + .../finetune_asr/speechut_base_100h.yaml | 101 + .../finetune_asr/speechut_large_100h.yaml | 102 + .../finetune_asr/speechut_large_960h.yaml | 100 + .../pretrain/speechut_base_librispeech.yaml | 153 + .../pretrain/speechut_large_librilight.yaml | 159 + Speech2S/speech2s/criterions/__init__.py | 9 + Speech2S/speech2s/criterions/ctc_ce.py | 414 + .../speech2s/criterions/speechut_criterion.py | 384 + Speech2S/speech2s/data/concat_dataset.py | 129 + Speech2S/speech2s/data/hubert_dataset.py | 597 + .../speech2s/data/language_trible_dataset.py | 669 ++ .../speech2s/data/load_langpair_dataset.py | 172 + .../data/multimodal_corpus_dataset.py | 368 + Speech2S/speech2s/models/__init__.py | 0 Speech2S/speech2s/models/speechut.py | 785 ++ Speech2S/speech2s/models/speechut_asr.py | 165 + Speech2S/speech2s/models/speechut_st.py | 221 + Speech2S/speech2s/models/t5_transformer_lm.py | 25 + Speech2S/speech2s/modules/__init__.py | 27 + Speech2S/speech2s/modules/ctc_prefix_score.py | 93 + .../modules/learned_positional_embedding.py | 69 + .../speech2s/modules/multihead_attention.py | 346 + Speech2S/speech2s/modules/relative_pos_enc.py | 33 + .../speech2s/modules/transformer_decoder.py | 543 + .../speech2s/modules/transformer_encoder.py | 401 + .../speech2s/modules/transformer_layer.py | 330 + Speech2S/speech2s/modules/w2v_encoder.py | 281 + .../base_speechut_for_asr.sh | 40 + .../pretrain_speechut/base_speechut_for_st.sh | 47 + .../base_speechut_for_st_enfr.sh | 48 + .../large_speechut_for_asr.sh | 41 + .../finetune960h_large_edctc.sh | 45 + .../tune_speechut_asr/finetune_base_edctc.sh | 45 + .../tune_speechut_asr/inference_edctc.sh | 61 + .../tune_speechut_asr/inference_edctclm.sh | 66 + .../tune_speechut_asr/inference_lm_nj.sh | 74 + .../tune_speechut_asr/inference_nj.sh | 69 + .../finetune_base_mustc_enxx.sh | 77 + .../tune_speechut_st/inference_st.sh | 44 + Speech2S/speech2s/scripts/__init__.py | 0 .../speech2s/scripts/average_checkpoints.py | 160 + .../speech2s/scripts/build_sym_alignment.py | 97 + .../speech2s/scripts/compare_namespaces.py | 46 + .../speech2s/scripts/compound_split_bleu.sh | 20 + .../speech2s/scripts/constraints/extract.py | 90 + .../speech2s/scripts/constraints/validate.py | 34 + .../speech2s/scripts/convert_dictionary.lua | 34 + Speech2S/speech2s/scripts/convert_model.lua | 108 + Speech2S/speech2s/scripts/count_docs.py | 58 + Speech2S/speech2s/scripts/read_binarized.py | 48 + Speech2S/speech2s/scripts/rm_pt.py | 141 + Speech2S/speech2s/scripts/sacrebleu.sh | 27 + Speech2S/speech2s/scripts/shard_docs.py | 54 + .../scripts/split_train_valid_docs.py | 86 + Speech2S/speech2s/scripts/spm_decode.py | 53 + Speech2S/speech2s/scripts/spm_encode.py | 119 + Speech2S/speech2s/scripts/spm_train.py | 16 + Speech2S/speech2s/scripts/test_fsdp.sh | 24 + .../stpretrain_scripts/base_sc2c_enes.sh | 64 + .../stpretrain_scripts/base_sc2c_esen.sh | 64 + .../speech2s/stpretrain_scripts/config.yaml | 4 + .../config/finetune_asr/base_100h.yaml | 101 + .../config/finetune_asr/large_960h.yaml | 98 + .../config/pretrain/mbart.yaml | 120 + .../pretrain/sc2t_base_librispeech.yaml | 137 + .../config/translation/text2code.yaml | 81 + .../stpretrain_scripts/config_mbart.yaml | 120 + .../extract_hubert_feature_itp.sh | 41 + .../data_process/merge_code.py | 14 + .../data_process/txt2idx.sh | 43 + .../data_process/txt2spm.sh | 33 + .../data_process/wmt/normalize_en_text.py | 46 + .../data_process/wmt/normalize_es_text.py | 49 + .../decode_text2code_beam2.sh | 50 + Speech2S/speech2s/stpretrain_scripts/eval2.sh | 12 + Speech2S/speech2s/stpretrain_scripts/eval3.sh | 4 + .../stpretrain_scripts/finetune_enes.sh | 85 + .../stpretrain_scripts/finetune_esen.sh | 85 + .../stpretrain_scripts/inference_ed.sh | 38 + ...base_ReleaseIter2_text2unicode_from400k.sh | 70 + ...e_ReleaseIter2_text2unicode_from400k_es.sh | 70 + ..._ReleaseIter2_text2unicode_from400k_es2.sh | 70 + .../train_text2code/decode_text2code.sh | 51 + .../train_text2code/decode_text2code_beam2.sh | 52 + .../train_text2code/inference_code_bleu.sh | 52 + .../train_text2code/inference_code_wer.sh | 53 + .../speech2s/tasks/joint_sc2t_pretrain.py | 1004 ++ SpeechLM/README.md | 268 + SpeechLM/SpeechLM.py | 667 ++ .../v4/en/en-de/config_base_ende.yaml | 14 + .../v4/en/en-de/config_large_ende.yaml | 14 + .../en/en-de/dev-sample100_st_en_de_local.tsv | 100 + .../v4/en/en-de/spm_char_st_en_de.model | Bin 0 -> 239480 bytes .../v4/en/en-de/spm_char_st_en_de.txt | 164 + .../v4/en/en-de/spm_char_st_en_de.vocab | 168 + .../LibriLM/hidden_unit/bin-idx/config.yaml | 3 + .../LibriLM/hidden_unit/bin-idx/dict.km.txt | 500 + .../LibriLM/hidden_unit/bin-idx/dict.ltr.txt | 29 + .../LibriLM/phone_unit/bin-idx/config.yaml | 3 + .../LibriLM/phone_unit/bin-idx/dict.ltr.txt | 29 + .../LibriLM/phone_unit/bin-idx/dict.phn.txt | 364 + SpeechLM/dataset/LibriSpeech/asr/dict.ltr.txt | 29 + .../LibriSpeech/asr/train_sample100.ltr | 100 + .../LibriSpeech/asr/train_sample100.tsv | 101 + .../LibriSpeech/fast_phone2unit/config.yaml | 13 + .../fast_phone2unit/config_generate.yaml | 13 + .../LibriSpeech/fast_phone2unit/dict.PHN.txt | 42 + .../LibriSpeech/fast_phone2unit/dict.km.txt | 500 + .../fast_phone2unit/genset_examples.tsv | 101 + .../fast_phone2unit/train_exmples.tsv | 100 + .../LibriSpeech/hidden_unit/dict.km.txt | 500 + .../hidden_unit/train_sample100.km | 100 + .../hidden_unit/train_sample100.tsv | 101 + .../LibriSpeech/phone_unit/dict.phn.txt | 364 + .../phone_unit/train_sample100.phn | 100 + .../phone_unit/train_sample100.tsv | 101 + SpeechLM/modules.py | 2130 ++++ SpeechLM/speechlm/__init__.py | 1 + .../speechlm/config/decode/infer_fsqlm.yaml | 44 + .../speechlm/config/decode/infer_kenlm.yaml | 44 + .../speechlm/config/decode/infer_viterbi.yaml | 37 + .../config/finetune/speechlm_base_100h.yaml | 99 + .../config/finetune/speechlm_large_960h.yaml | 98 + .../pretrain/speechlm_base_librispeech.yaml | 139 + .../pretrain/speechlm_large_librilight.yaml | 144 + .../config/pretrain/speechlmp_base_cfg.pt | Bin 0 -> 31407 bytes SpeechLM/speechlm/criterions/__init__.py | 9 + .../speechlm/criterions/fasttext2unit_loss.py | 181 + .../speechlm/criterions/speechlm_criterion.py | 352 + SpeechLM/speechlm/data/concat_dataset.py | 131 + SpeechLM/speechlm/data/hubert_dataset.py | 599 + .../speechlm/data/language_trible_dataset.py | 671 ++ .../speechlm/data/load_langpair_dataset.py | 174 + .../data/multimodal_corpus_dataset.py | 370 + .../speechlm/data/text_to_unit_dataset.py | 293 + .../data_process/covost2/mp3_to_wav.py | 42 + .../covost2/prepare_covost_data.py | 295 + .../data_process/filter_paireddata_by_len.py | 48 + .../speechlm/data_process/get_t2u_manifest.py | 119 + .../data_process/get_t2u_manifest_textonly.py | 67 + .../data_process/phoneize_with_sil.py | 132 + .../phoneme_tokenizer/ltr2kaldi_phn_sil025.py | 77 + .../mean5_and_std25_sil14_spn32.dict | 1 + .../repeat_withou_insert_sil_less_4375.py | 41 + .../data_process/prepare_covost2_enxx.sh | 45 + .../data_process/prepare_phn2ltr_librilm.sh | 57 + SpeechLM/speechlm/data_process/txt2idx.sh | 30 + SpeechLM/speechlm/data_process/wrd2ltr.py | 12 + SpeechLM/speechlm/generate_unit.py | 412 + SpeechLM/speechlm/infer.py | 486 + SpeechLM/speechlm/models/__init__.py | 0 SpeechLM/speechlm/models/fasttext2unit.py | 226 + SpeechLM/speechlm/models/speechlm.py | 720 ++ SpeechLM/speechlm/models/speechlm_ctcasr.py | 56 + SpeechLM/speechlm/models/speechlm_st.py | 268 + SpeechLM/speechlm/modules/__init__.py | 23 + .../modules/learned_positional_embedding.py | 68 + .../speechlm/modules/multihead_attention.py | 348 + SpeechLM/speechlm/modules/relative_pos_enc.py | 35 + .../speechlm/modules/transformer_decoder.py | 544 + .../speechlm/modules/transformer_encoder.py | 403 + .../speechlm/modules/transformer_layer.py | 329 + SpeechLM/speechlm/modules/w2v_encoder.py | 283 + .../pretrain_speechlm/base_speechlmh.sh | 43 + .../pretrain_speechlm/base_speechlmp.sh | 43 + .../pretrain_speechlm/large_speechlmp.sh | 44 + .../scripts/tokenizer_fastT2U/generate.sh | 42 + .../scripts/tokenizer_fastT2U/infer.sh | 41 + .../scripts/tokenizer_fastT2U/train_s_5e-4.sh | 39 + .../tune_speechlm_asr/finetune_base_ctc.sh | 48 + .../tune_speechlm_asr/finetune_large_ctc.sh | 48 + .../tune_speechlm_asr/inference_ctc.sh | 40 + .../tune_speechlm_asr/inference_ctc_kenlm.sh | 48 + .../tune_speechlm_asr/inference_ctc_large.sh | 36 + .../inference_ctc_large_fsqlm.sh | 46 + .../tune_speechlm_st/ft_base_covost_enxx.sh | 80 + .../tune_speechlm_st/ft_large_covost_enxx.sh | 80 + .../tune_speechlm_st/inference_base.sh | 46 + .../tune_speechlm_st/inference_large.sh | 46 + SpeechLM/speechlm/tasks/fast_text_to_unit.py | 174 + .../speechlm/tasks/joint_sc2t_pretrain.py | 976 ++ SpeechLM/speechlm/unit_generator.py | 66 + SpeechT5/README.md | 706 ++ SpeechT5/asr_train/train.ltr | 2674 +++++ SpeechT5/asr_train/train.tsv | 2675 +++++ SpeechT5/asr_train/train.txt | 2674 +++++ SpeechT5/asr_train/valid.ltr | 29 + SpeechT5/asr_train/valid.tsv | 30 + SpeechT5/asr_train/valid.txt | 29 + SpeechT5/fairseq/.github/ISSUE_TEMPLATE.md | 3 + .../.github/ISSUE_TEMPLATE/bug_report.md | 43 + .../.github/ISSUE_TEMPLATE/documentation.md | 15 + .../.github/ISSUE_TEMPLATE/feature_request.md | 24 + .../.github/ISSUE_TEMPLATE/how-to-question.md | 33 + .../fairseq/.github/PULL_REQUEST_TEMPLATE.md | 16 + SpeechT5/fairseq/.github/stale.yml | 30 + SpeechT5/fairseq/.github/workflows/build.yml | 55 + .../.github/workflows/build_wheels.yml | 41 + SpeechT5/fairseq/.gitignore | 136 + SpeechT5/fairseq/.gitmodules | 4 + SpeechT5/fairseq/CODE_OF_CONDUCT.md | 77 + SpeechT5/fairseq/CONTRIBUTING.md | 28 + SpeechT5/fairseq/LICENSE | 21 + SpeechT5/fairseq/README.md | 222 + SpeechT5/fairseq/docs/Makefile | 20 + .../fairseq/docs/_static/theme_overrides.css | 9 + SpeechT5/fairseq/docs/command_line_tools.rst | 85 + SpeechT5/fairseq/docs/conf.py | 134 + SpeechT5/fairseq/docs/criterions.rst | 31 + SpeechT5/fairseq/docs/data.rst | 58 + SpeechT5/fairseq/docs/docutils.conf | 2 + SpeechT5/fairseq/docs/fairseq.gif | Bin 0 -> 2664833 bytes SpeechT5/fairseq/docs/fairseq_logo.png | Bin 0 -> 73036 bytes SpeechT5/fairseq/docs/getting_started.rst | 216 + SpeechT5/fairseq/docs/hydra_integration.md | 284 + SpeechT5/fairseq/docs/index.rst | 49 + SpeechT5/fairseq/docs/lr_scheduler.rst | 34 + SpeechT5/fairseq/docs/make.bat | 36 + SpeechT5/fairseq/docs/models.rst | 104 + SpeechT5/fairseq/docs/modules.rst | 9 + SpeechT5/fairseq/docs/optim.rst | 38 + SpeechT5/fairseq/docs/overview.rst | 74 + SpeechT5/fairseq/docs/requirements.txt | 2 + SpeechT5/fairseq/docs/tasks.rst | 61 + .../docs/tutorial_classifying_names.rst | 415 + .../fairseq/docs/tutorial_simple_lstm.rst | 518 + SpeechT5/fairseq/examples/.gitignore | 2 + SpeechT5/fairseq/examples/__init__.py | 9 + .../fairseq/examples/adaptive_span/README.md | 90 + .../examples/adaptive_span/__init__.py | 19 + .../adaptive_span/adagrad_with_grad_clip.py | 128 + .../adaptive_span/adaptive_span_attention.py | 160 + .../adaptive_span/adaptive_span_loss.py | 106 + .../adaptive_span/adaptive_span_model.py | 263 + .../adaptive_span_model_wrapper.py | 145 + .../adaptive_span/truncated_bptt_lm_task.py | 281 + .../examples/backtranslation/README.md | 297 + .../backtranslation/deduplicate_lines.py | 41 + .../backtranslation/extract_bt_data.py | 72 + .../backtranslation/prepare-de-monolingual.sh | 98 + .../backtranslation/prepare-wmt18en2de.sh | 135 + .../examples/backtranslation/sacrebleu.sh | 37 + .../backtranslation/tokenized_bleu.sh | 46 + SpeechT5/fairseq/examples/bart/README.glue.md | 99 + SpeechT5/fairseq/examples/bart/README.md | 228 + .../examples/bart/README.summarization.md | 102 + SpeechT5/fairseq/examples/bart/summarize.py | 100 + .../fairseq/examples/byte_level_bpe/README.md | 88 + .../examples/byte_level_bpe/get_bitext.py | 254 + .../examples/byte_level_bpe/get_data.sh | 47 + .../byte_level_bpe/gru_transformer.py | 107 + SpeechT5/fairseq/examples/camembert/README.md | 75 + .../examples/constrained_decoding/README.md | 123 + .../constrained_decoding/normalize.py | 27 + .../examples/constrained_decoding/tok.py | 34 + .../fairseq/examples/conv_seq2seq/README.md | 25 + SpeechT5/fairseq/examples/criss/README.md | 61 + .../download_and_preprocess_flores_test.sh | 64 + .../criss/download_and_preprocess_tatoeba.sh | 46 + .../fairseq/examples/criss/mining/mine.py | 240 + .../examples/criss/mining/mine_example.sh | 103 + .../fairseq/examples/criss/save_encoder.py | 213 + .../sentence_retrieval/encoder_analysis.py | 92 + .../sentence_retrieval_tatoeba.sh | 59 + .../examples/criss/unsupervised_mt/eval.sh | 37 + .../cross_lingual_language_model/README.md | 77 + .../examples/fast_noisy_channel/README.md | 345 + .../examples/fast_noisy_channel/__init__.py | 8 + .../noisy_channel_beam_search.py | 71 + .../noisy_channel_sequence_generator.py | 842 ++ .../noisy_channel_translation.py | 127 + SpeechT5/fairseq/examples/flores101/README.md | 223 + .../examples/flores101/flores_logo.png | Bin 0 -> 33184 bytes .../fully_sharded_data_parallel/README.md | 177 + SpeechT5/fairseq/examples/gottbert/README.md | 64 + SpeechT5/fairseq/examples/hubert/README.md | 116 + .../hubert/config/decode/ax_sweep/ngram.yaml | 33 + .../config/decode/ax_sweep/transformer.yaml | 33 + .../hubert/config/decode/infer_fsqlm.yaml | 36 + .../hubert/config/decode/infer_kenlm.yaml | 36 + .../hubert/config/decode/infer_viterbi.yaml | 31 + .../config/decode/run/submitit_slurm.yaml | 17 + .../decode/run/submitit_slurm_8gpu.yaml | 17 + .../hubert/config/finetune/base_10h.yaml | 100 + .../hubert/config/finetune/ckpt/it1.yaml | 7 + .../hubert/config/finetune/lm/ls_4gram.yaml | 7 + .../config/finetune/run/submitit_reg.yaml | 20 + .../hubert/config/pretrain/data/iter1.yaml | 8 + .../hubert/config/pretrain/data/iter2.yaml | 8 + .../pretrain/hubert_base_librispeech.yaml | 97 + .../pretrain/hubert_large_librivox.yaml | 101 + .../pretrain/hubert_xlarge_librivox.yaml | 101 + .../config/pretrain/run/submitit_reg.yaml | 20 + .../hubert/measure_teacher_quality.py | 241 + .../examples/hubert/simple_kmeans/README.md | 71 + .../simple_kmeans/dump_hubert_feature.py | 133 + .../simple_kmeans/dump_hubert_feature_s2t.py | 126 + .../hubert/simple_kmeans/dump_km_label.py | 98 + .../hubert/simple_kmeans/dump_mfcc_feature.py | 116 + .../hubert/simple_kmeans/learn_kmeans.py | 146 + .../fairseq/examples/hubert/update_ckpt.py | 22 + .../joint_alignment_translation/README.md | 89 + ...t18en2de_no_norm_no_escape_no_agressive.sh | 118 + .../language_model/README.adaptive_inputs.md | 39 + .../examples/language_model/README.conv.md | 40 + .../fairseq/examples/language_model/README.md | 123 + .../language_model/prepare-wikitext-103.sh | 33 + SpeechT5/fairseq/examples/laser/README.md | 144 + .../examples/laser/laser_src/__init__.py | 8 + .../examples/laser/laser_src/laser_lstm.py | 585 + .../examples/laser/laser_src/laser_task.py | 326 + .../laser/laser_src/laser_transformer.py | 354 + .../laser/laser_src/multitask_data_utils.py | 143 + .../fairseq/examples/latent_depth/README.md | 77 + .../latent_depth/latent_depth_src/__init__.py | 9 + .../latent_depth_src/loss/__init__.py | 0 .../latent_depth_src/loss/latent_depth.py | 99 + .../latent_depth_src/models/__init__.py | 0 .../models/latent_multilingual_transformer.py | 75 + .../models/latent_transformer.py | 156 + .../latent_depth_src/modules/__init__.py | 0 .../latent_depth_src/modules/latent_layers.py | 75 + .../multilingual_translation_latent_depth.py | 194 + SpeechT5/fairseq/examples/layerdrop/README.md | 154 + SpeechT5/fairseq/examples/linformer/README.md | 22 + .../linformer/linformer_src/__init__.py | 6 + .../linformer_src/models/__init__.py | 0 .../linformer_src/models/linformer_roberta.py | 119 + .../linformer_src/modules/__init__.py | 0 .../modules/linformer_sentence_encoder.py | 54 + .../linformer_sentence_encoder_layer.py | 65 + .../modules/multihead_linear_attention.py | 481 + SpeechT5/fairseq/examples/m2m_100/README.md | 241 + .../examples/m2m_100/install_dependecies.sh | 78 + .../m2m_100/process_data/clean_histogram.py | 52 + .../m2m_100/process_data/dedup_data.py | 91 + .../process_data/remove_too_much_punc.py | 36 + SpeechT5/fairseq/examples/m2m_100/tok.sh | 83 + .../examples/m2m_100/tokenizers/README.md | 18 + .../examples/m2m_100/tokenizers/seg_ja.sh | 11 + .../examples/m2m_100/tokenizers/seg_ko.sh | 12 + .../m2m_100/tokenizers/thirdparty/.gitignore | 12 + .../m2m_100/tokenizers/tokenize_indic.py | 23 + .../m2m_100/tokenizers/tokenize_thai.py | 13 + .../m2m_100/tokenizers/tokenize_zh.py | 14 + .../m2m_100/tokenizers/tokenizer_ar.sh | 27 + SpeechT5/fairseq/examples/mbart/README.md | 123 + .../fairseq/examples/megatron_11b/README.md | 161 + .../fairseq/examples/megatron_11b/detok.py | 32 + .../examples/multilingual/ML50_langs.txt | 52 + .../fairseq/examples/multilingual/README.md | 158 + .../multilingual/data_scripts/README.md | 24 + .../multilingual/data_scripts/binarize.py | 200 + .../data_scripts/check_iswlt_test_data.py | 67 + .../data_scripts/check_self_overlaps.py | 103 + .../data_scripts/check_valid_test_overlaps.py | 124 + .../multilingual/data_scripts/dedup_all.py | 52 + .../data_scripts/download_ML50_v1.sh | 30 + .../data_scripts/download_af_xh.sh | 164 + .../data_scripts/download_flores_data.sh | 246 + .../data_scripts/download_iitb.sh | 35 + .../download_iwslt_and_extract.sh | 225 + .../data_scripts/download_lotus.sh | 46 + .../data_scripts/download_ted_and_extract.py | 338 + .../data_scripts/download_wat19_my.sh | 36 + .../data_scripts/download_wmt19_and_before.py | 899 ++ .../data_scripts/download_wmt20.sh | 547 + .../data_scripts/preprocess_ML50_v1.sh | 27 + .../remove_valid_test_in_train.py | 290 + .../multilingual/data_scripts/requirement.txt | 2 + .../multilingual/data_scripts/utils/dedup.py | 41 + .../utils/fasttext_multi_filter.py | 63 + .../data_scripts/utils/strip_sgm.sh | 1 + .../finetune_multilingual_model.sh | 32 + .../multilingual/multilingual_fairseq_gen.sh | 26 + .../multilingual/train_multilingual_model.sh | 28 + .../fairseq/examples/noisychannel/README.md | 72 + .../fairseq/examples/noisychannel/__init__.py | 6 + .../fairseq/examples/noisychannel/rerank.py | 428 + .../examples/noisychannel/rerank_generate.py | 397 + .../examples/noisychannel/rerank_options.py | 149 + .../examples/noisychannel/rerank_score_bw.py | 143 + .../examples/noisychannel/rerank_score_lm.py | 81 + .../examples/noisychannel/rerank_tune.py | 102 + .../examples/noisychannel/rerank_utils.py | 850 ++ .../nonautoregressive_translation/README.md | 146 + .../nonautoregressive_translation/scripts.md | 179 + .../fairseq/examples/paraphraser/README.md | 46 + .../examples/paraphraser/paraphrase.py | 85 + .../pay_less_attention_paper/README.md | 176 + .../examples/pointer_generator/README.md | 82 + .../examples/pointer_generator/README.xsum.md | 180 + .../pointer_generator_src/__init__.py | 6 + .../pointer_generator_src/transformer_pg.py | 518 + .../examples/pointer_generator/postprocess.py | 96 + .../examples/pointer_generator/preprocess.py | 102 + .../fairseq/examples/quant_noise/README.md | 298 + .../transformer_quantization_config.yaml | 33 + .../roberta/README.custom_classification.md | 168 + .../fairseq/examples/roberta/README.glue.md | 99 + SpeechT5/fairseq/examples/roberta/README.md | 296 + .../examples/roberta/README.pretraining.md | 98 + .../fairseq/examples/roberta/README.race.md | 68 + .../examples/roberta/commonsense_qa/README.md | 99 + .../roberta/commonsense_qa/__init__.py | 6 + .../commonsense_qa/commonsense_qa_task.py | 190 + .../commonsense_qa/download_cqa_data.sh | 14 + .../roberta/multiprocessing_bpe_encoder.py | 130 + .../examples/roberta/preprocess_GLUE_tasks.sh | 185 + .../examples/roberta/preprocess_RACE.py | 102 + .../examples/roberta/preprocess_RACE.sh | 59 + .../fairseq/examples/roberta/wsc/README.md | 125 + .../fairseq/examples/roberta/wsc/__init__.py | 7 + .../examples/roberta/wsc/wsc_criterion.py | 167 + .../fairseq/examples/roberta/wsc/wsc_task.py | 401 + .../fairseq/examples/roberta/wsc/wsc_utils.py | 241 + SpeechT5/fairseq/examples/rxf/README.md | 52 + SpeechT5/fairseq/examples/rxf/__init__.py | 6 + .../fairseq/examples/rxf/rxf_src/__init__.py | 6 + .../label_smoothed_cross_entropy_r3f.py | 157 + .../rxf/rxf_src/sentence_prediction_r3f.py | 170 + .../fairseq/examples/scaling_nmt/README.md | 114 + .../simultaneous_translation/README.md | 5 + .../simultaneous_translation/__init__.py | 6 + .../simultaneous_translation/docs/ende-mma.md | 74 + .../docs/enja-waitk.md | 106 + .../eval/agents/simul_t2t_enja.py | 226 + .../models/__init__.py | 15 + .../models/convtransformer_simul_trans.py | 204 + .../models/transformer_monotonic_attention.py | 315 + .../modules/__init__.py | 24 + .../modules/fixed_pre_decision.py | 254 + .../modules/monotonic_multihead_attention.py | 910 ++ .../modules/monotonic_transformer_layer.py | 198 + .../utils/__init__.py | 14 + .../utils/data_utils.py | 100 + .../utils/functions.py | 149 + .../simultaneous_translation/utils/latency.py | 451 + .../utils/p_choose_strategy.py | 124 + .../examples/speech_recognition/README.md | 83 + .../examples/speech_recognition/__init__.py | 1 + .../speech_recognition/criterions/ASG_loss.py | 170 + .../speech_recognition/criterions/__init__.py | 17 + .../criterions/cross_entropy_acc.py | 130 + .../speech_recognition/data/__init__.py | 11 + .../speech_recognition/data/asr_dataset.py | 122 + .../speech_recognition/data/collaters.py | 131 + .../speech_recognition/data/data_utils.py | 100 + .../speech_recognition/data/replabels.py | 70 + .../datasets/asr_prep_json.py | 125 + .../datasets/prepare-librispeech.sh | 88 + .../examples/speech_recognition/infer.py | 427 + .../speech_recognition/kaldi/__init__.py | 0 .../kaldi/add-self-loop-simple.cc | 94 + .../kaldi/config/kaldi_initializer.yaml | 8 + .../speech_recognition/kaldi/kaldi_decoder.py | 244 + .../kaldi/kaldi_initializer.py | 698 ++ .../speech_recognition/models/__init__.py | 8 + .../models/vggtransformer.py | 1019 ++ .../models/w2l_conv_glu_enc.py | 177 + .../examples/speech_recognition/new/README.md | 43 + .../speech_recognition/new/__init__.py | 0 .../new/conf/hydra/sweeper/ax.yaml | 26 + .../speech_recognition/new/conf/infer.yaml | 25 + .../new/decoders/__init__.py | 0 .../new/decoders/base_decoder.py | 62 + .../new/decoders/decoder.py | 32 + .../new/decoders/decoder_config.py | 70 + .../new/decoders/flashlight_decoder.py | 431 + .../new/decoders/viterbi_decoder.py | 24 + .../examples/speech_recognition/new/infer.py | 471 + .../speech_recognition/tasks/__init__.py | 8 + .../tasks/speech_recognition.py | 157 + .../speech_recognition/utils/wer_utils.py | 381 + .../speech_recognition/w2l_decoder.py | 486 + .../fairseq/examples/speech_to_text/README.md | 77 + .../examples/speech_to_text/data_utils.py | 339 + .../speech_to_text/docs/covost_example.md | 102 + .../docs/librispeech_example.md | 69 + .../speech_to_text/docs/mtedx_example.md | 200 + .../speech_to_text/docs/mustc_example.md | 155 + .../docs/simulst_mustc_example.md | 190 + .../speech_to_text/prep_covost_data.py | 280 + .../speech_to_text/prep_librispeech_data.py | 118 + .../speech_to_text/prep_mtedx_data.py | 238 + .../speech_to_text/prep_mustc_data.py | 264 + .../examples/speech_to_text/seg_mustc_data.py | 54 + .../agents/fairseq_simul_st_agent.py | 363 + SpeechT5/fairseq/examples/stories/README.md | 66 + .../fairseq/examples/translation/README.md | 301 + .../examples/translation/prepare-iwslt14.sh | 115 + .../prepare-iwslt17-multilingual.sh | 133 + .../translation/prepare-wmt14en2de.sh | 142 + .../translation/prepare-wmt14en2fr.sh | 136 + .../examples/translation_moe/README.md | 89 + .../fairseq/examples/translation_moe/score.py | 197 + .../translation_moe_src/__init__.py | 6 + .../translation_moe_src/logsumexp_moe.py | 26 + .../mean_pool_gating_network.py | 50 + .../translation_moe_src/translation_moe.py | 258 + .../fairseq/examples/truncated_bptt/README.md | 70 + .../examples/truncated_bptt/__init__.py | 6 + .../truncated_bptt/transformer_xl_model.py | 155 + .../truncated_bptt/truncated_bptt_lm_task.py | 281 + .../unsupervised_quality_estimation/README.md | 126 + .../aggregate_scores.py | 41 + .../unsupervised_quality_estimation/meteor.py | 109 + .../repeat_lines.py | 28 + SpeechT5/fairseq/examples/wav2vec/README.md | 369 + SpeechT5/fairseq/examples/wav2vec/__init__.py | 0 .../wav2vec/config/finetuning/base_100h.yaml | 59 + .../wav2vec/config/finetuning/base_10h.yaml | 64 + .../wav2vec/config/finetuning/base_10m.yaml | 64 + .../wav2vec/config/finetuning/base_1h.yaml | 64 + .../wav2vec/config/finetuning/base_960h.yaml | 58 + .../wav2vec/config/finetuning/vox_100h.yaml | 59 + .../wav2vec/config/finetuning/vox_10h.yaml | 64 + .../wav2vec/config/finetuning/vox_10m.yaml | 64 + .../wav2vec/config/finetuning/vox_1h.yaml | 64 + .../wav2vec/config/finetuning/vox_960h.yaml | 58 + .../wav2vec2_base_librispeech.yaml | 57 + .../pretraining/wav2vec2_large_librivox.yaml | 69 + .../wav2vec2_large_librivox_tpu-pod.yaml | 72 + .../wav2vec2_large_librivox_tpu.yaml | 72 + .../fairseq/examples/wav2vec/libri_labels.py | 56 + .../wav2vec/scripts/binarize_manifest.sh | 33 + .../examples/wav2vec/unsupervised/README.md | 103 + .../examples/wav2vec/unsupervised/__init__.py | 0 .../config/finetuning/w2v_finetune.yaml | 62 + .../wav2vec/unsupervised/config/gan/w2vu.yaml | 115 + .../unsupervised/config/generate/viterbi.yaml | 21 + .../config/timit_matched/test.uid | 192 + .../config/timit_matched/train.uid | 3696 ++++++ .../config/timit_matched/train_text.uid | 3696 ++++++ .../config/timit_matched/valid.uid | 400 + .../config/timit_unmatched/test.uid | 1680 +++ .../config/timit_unmatched/train.uid | 3000 +++++ .../config/timit_unmatched/train_text.uid | 1000 ++ .../config/timit_unmatched/valid.uid | 620 + .../wav2vec/unsupervised/data/__init__.py | 13 + .../data/extracted_features_dataset.py | 144 + .../unsupervised/data/random_input_dataset.py | 62 + .../unsupervised/kaldi_self_train/README.md | 56 + .../unsupervised/kaldi_self_train/st/cmd.sh | 15 + .../kaldi_self_train/st/decode_phone.sh | 33 + .../kaldi_self_train/st/decode_word_step1.sh | 46 + .../kaldi_self_train/st/decode_word_step2.sh | 30 + .../st/local/copy_aligned_text.py | 4 + .../kaldi_self_train/st/local/decode.sh | 38 + .../st/local/prepare_data_from_w2v.py | 56 + .../kaldi_self_train/st/local/prepare_lang.sh | 37 + .../st/local/prepare_lang_word.sh | 35 + .../kaldi_self_train/st/local/prepare_lm.sh | 35 + .../kaldi_self_train/st/local/score.sh | 63 + .../kaldi_self_train/st/local/show_wer.sh | 52 + .../st/local/train_subset_lgbeam.sh | 129 + .../kaldi_self_train/st/local/unsup_select.py | 135 + .../st/local/unsup_select_decode.sh | 37 + .../st/local/unsup_select_decode_word.sh | 35 + .../unsupervised/kaldi_self_train/st/path.sh | 5 + .../st/steps_gan/train_deltas.sh | 175 + .../st/steps_gan/train_lda_mllt.sh | 239 + .../st/steps_gan/train_sat.sh | 281 + .../unsupervised/kaldi_self_train/st/train.sh | 43 + .../wav2vec/unsupervised/models/__init__.py | 11 + .../wav2vec/unsupervised/models/wav2vec_u.py | 637 ++ .../wav2vec/unsupervised/scripts/apply_pca.py | 76 + .../unsupervised/scripts/copy_labels.py | 10 + .../unsupervised/scripts/filter_lexicon.py | 40 + .../unsupervised/scripts/filter_tsv.py | 37 + .../unsupervised/scripts/g2p_wrd_to_phn.py | 45 + .../unsupervised/scripts/ltr_to_wrd.py | 16 + .../wav2vec/unsupervised/scripts/mean_pool.py | 99 + .../unsupervised/scripts/merge_clusters.py | 114 + .../scripts/normalize_and_filter_text.py | 72 + .../unsupervised/scripts/normalize_text.py | 22 + .../wav2vec/unsupervised/scripts/pca.py | 53 + .../scripts/phonemize_with_sil.py | 83 + .../unsupervised/scripts/prepare_audio.sh | 78 + .../unsupervised/scripts/prepare_text.sh | 82 + .../unsupervised/scripts/prepare_timit.sh | 79 + .../unsupervised/scripts/remove_silence.py | 63 + .../wav2vec/unsupervised/scripts/vads.py | 98 + .../scripts/wav2vec_apply_cluster_faiss.py | 128 + .../scripts/wav2vec_cluster_faiss.py | 210 + .../scripts/wav2vec_extract_features.py | 119 + .../wav2vec/unsupervised/scripts/wer.py | 82 + .../unsupervised/scripts/wrd_to_ltr.py | 16 + .../wav2vec/unsupervised/tasks/__init__.py | 11 + .../unsupervised/tasks/unpaired_audio_text.py | 447 + .../wav2vec/unsupervised/w2vu_generate.py | 709 ++ .../examples/wav2vec/vq-wav2vec_featurize.py | 250 + .../examples/wav2vec/wav2vec_featurize.py | 249 + .../examples/wav2vec/wav2vec_manifest.py | 87 + SpeechT5/fairseq/examples/wmt19/README.md | 85 + SpeechT5/fairseq/examples/wmt20/README.md | 72 + SpeechT5/fairseq/examples/xlmr/README.md | 144 + SpeechT5/fairseq/fairseq/__init__.py | 44 + .../fairseq/fairseq/benchmark/__init__.py | 7 + .../fairseq/benchmark/dummy_dataset.py | 36 + .../fairseq/fairseq/benchmark/dummy_lm.py | 83 + .../fairseq/benchmark/dummy_masked_lm.py | 94 + .../fairseq/fairseq/benchmark/dummy_model.py | 96 + .../fairseq/fairseq/benchmark/dummy_mt.py | 119 + SpeechT5/fairseq/fairseq/binarizer.py | 114 + SpeechT5/fairseq/fairseq/checkpoint_utils.py | 798 ++ .../clib/cuda/ngram_repeat_block_cuda.cpp | 47 + .../cuda/ngram_repeat_block_cuda_kernel.cu | 76 + .../clib/libbase/balanced_assignment.cpp | 95 + .../fairseq/fairseq/clib/libbleu/libbleu.cpp | 141 + .../fairseq/fairseq/clib/libbleu/module.cpp | 37 + .../fairseq/fairseq/clib/libnat/edit_dist.cpp | 231 + .../fairseq/clib/libnat_cuda/binding.cpp | 60 + .../fairseq/clib/libnat_cuda/edit_dist.cu | 332 + .../fairseq/clib/libnat_cuda/edit_dist.h | 25 + SpeechT5/fairseq/fairseq/config/__init__.py | 4 + SpeechT5/fairseq/fairseq/config/config.yaml | 18 + .../transformer_lm_baevski_gbw.yaml | 36 + .../transformer_lm_baevski_wiki103.yaml | 36 + .../transformer_lm/transformer_lm_big.yaml | 36 + .../transformer_lm/transformer_lm_gbw.yaml | 36 + .../transformer_lm/transformer_lm_gpt.yaml | 36 + .../transformer_lm_gpt2_big.yaml | 36 + .../transformer_lm_gpt2_medium.yaml | 36 + .../transformer_lm_gpt2_small.yaml | 36 + .../transformer_lm_wiki103.yaml | 36 + .../model/wav2vec/vq_wav2vec_gumbel.yaml | 5 + .../config/model/wav2vec2/wav2vec2_base.yaml | 8 + .../config/model/wav2vec2/wav2vec2_large.yaml | 20 + .../fairseq/fairseq/criterions/__init__.py | 36 + .../fairseq/criterions/adaptive_loss.py | 123 + .../fairseq/criterions/composite_loss.py | 100 + .../fairseq/criterions/cross_entropy.py | 90 + SpeechT5/fairseq/fairseq/criterions/ctc.py | 295 + .../fairseq/criterions/fairseq_criterion.py | 120 + .../fairseq/criterions/hubert_criterion.py | 177 + .../label_smoothed_cross_entropy.py | 170 + ...moothed_cross_entropy_latency_augmented.py | 108 + ...l_smoothed_cross_entropy_with_alignment.py | 125 + .../fairseq/criterions/legacy_masked_lm.py | 177 + .../fairseq/fairseq/criterions/masked_lm.py | 91 + .../fairseq/criterions/model_criterion.py | 138 + .../fairseq/fairseq/criterions/nat_loss.py | 180 + .../fairseq/criterions/sentence_prediction.py | 99 + .../fairseq/criterions/sentence_ranking.py | 120 + .../fairseq/criterions/wav2vec_criterion.py | 229 + SpeechT5/fairseq/fairseq/data/__init__.py | 128 + .../fairseq/data/add_target_dataset.py | 70 + .../fairseq/data/append_token_dataset.py | 41 + .../fairseq/fairseq/data/audio/__init__.py | 0 .../fairseq/fairseq/data/audio/audio_utils.py | 174 + .../data/audio/feature_transforms/__init__.py | 82 + .../audio/feature_transforms/global_cmvn.py | 29 + .../audio/feature_transforms/specaugment.py | 131 + .../feature_transforms/utterance_cmvn.py | 40 + .../fairseq/data/audio/hubert_dataset.py | 358 + .../fairseq/data/audio/raw_audio_dataset.py | 386 + .../data/audio/speech_to_text_dataset.py | 511 + .../fairseq/data/backtranslation_dataset.py | 165 + .../fairseq/data/base_wrapper_dataset.py | 78 + .../fairseq/data/bucket_pad_length_dataset.py | 78 + .../fairseq/fairseq/data/colorize_dataset.py | 25 + .../fairseq/fairseq/data/concat_dataset.py | 124 + .../fairseq/data/concat_sentences_dataset.py | 54 + SpeechT5/fairseq/fairseq/data/data_utils.py | 595 + .../fairseq/fairseq/data/data_utils_fast.pyx | 178 + .../fairseq/fairseq/data/denoising_dataset.py | 436 + SpeechT5/fairseq/fairseq/data/dictionary.py | 395 + .../fairseq/fairseq/data/encoders/__init__.py | 29 + .../fairseq/fairseq/data/encoders/byte_bpe.py | 48 + .../fairseq/data/encoders/byte_utils.py | 51 + .../fairseq/fairseq/data/encoders/bytes.py | 34 + .../fairseq/data/encoders/characters.py | 30 + .../fairseq/fairseq/data/encoders/fastbpe.py | 36 + .../fairseq/fairseq/data/encoders/gpt2_bpe.py | 45 + .../fairseq/data/encoders/gpt2_bpe_utils.py | 140 + .../fairseq/data/encoders/hf_bert_bpe.py | 50 + .../fairseq/data/encoders/hf_byte_bpe.py | 50 + .../fairseq/data/encoders/moses_tokenizer.py | 49 + .../fairseq/data/encoders/nltk_tokenizer.py | 24 + .../data/encoders/sentencepiece_bpe.py | 48 + .../fairseq/data/encoders/space_tokenizer.py | 21 + .../fairseq/data/encoders/subword_nmt_bpe.py | 54 + .../fairseq/fairseq/data/encoders/utils.py | 30 + .../fairseq/fairseq/data/fairseq_dataset.py | 205 + .../fairseq/fairseq/data/fasta_dataset.py | 107 + SpeechT5/fairseq/fairseq/data/id_dataset.py | 19 + .../fairseq/fairseq/data/indexed_dataset.py | 576 + SpeechT5/fairseq/fairseq/data/iterators.py | 640 ++ .../fairseq/data/language_pair_dataset.py | 471 + .../fairseq/fairseq/data/legacy/__init__.py | 16 + .../fairseq/data/legacy/block_pair_dataset.py | 311 + .../fairseq/data/legacy/masked_lm_dataset.py | 303 + .../data/legacy/masked_lm_dictionary.py | 60 + SpeechT5/fairseq/fairseq/data/list_dataset.py | 32 + .../fairseq/data/lm_context_window_dataset.py | 97 + .../fairseq/fairseq/data/lru_cache_dataset.py | 21 + .../fairseq/data/mask_tokens_dataset.py | 220 + .../fairseq/data/monolingual_dataset.py | 253 + .../fairseq/data/multi_corpus_dataset.py | 240 + .../data/multi_corpus_sampled_dataset.py | 152 + .../fairseq/data/multilingual/__init__.py | 4 + .../multilingual/multilingual_data_manager.py | 1131 ++ .../data/multilingual/multilingual_utils.py | 63 + .../multilingual/sampled_multi_dataset.py | 467 + .../sampled_multi_epoch_dataset.py | 199 + .../data/multilingual/sampling_method.py | 78 + .../fairseq/data/nested_dictionary_dataset.py | 125 + SpeechT5/fairseq/fairseq/data/noising.py | 335 + .../fairseq/data/num_samples_dataset.py | 17 + .../fairseq/fairseq/data/numel_dataset.py | 31 + .../fairseq/data/offset_tokens_dataset.py | 15 + SpeechT5/fairseq/fairseq/data/pad_dataset.py | 28 + SpeechT5/fairseq/fairseq/data/plasma_utils.py | 197 + .../fairseq/fairseq/data/prepend_dataset.py | 28 + .../fairseq/data/prepend_token_dataset.py | 41 + .../fairseq/fairseq/data/raw_label_dataset.py | 23 + .../fairseq/fairseq/data/replace_dataset.py | 36 + .../fairseq/data/resampling_dataset.py | 139 + SpeechT5/fairseq/fairseq/data/roll_dataset.py | 18 + .../fairseq/data/round_robin_zip_datasets.py | 160 + .../fairseq/fairseq/data/shorten_dataset.py | 78 + SpeechT5/fairseq/fairseq/data/sort_dataset.py | 21 + .../fairseq/data/strip_token_dataset.py | 20 + .../fairseq/fairseq/data/subsample_dataset.py | 72 + .../fairseq/data/token_block_dataset.py | 202 + .../fairseq/data/token_block_utils_fast.pyx | 187 + .../fairseq/data/transform_eos_dataset.py | 120 + .../data/transform_eos_lang_pair_dataset.py | 111 + .../fairseq/fairseq/dataclass/__init__.py | 13 + SpeechT5/fairseq/fairseq/dataclass/configs.py | 990 ++ .../fairseq/fairseq/dataclass/constants.py | 54 + .../fairseq/fairseq/dataclass/initialize.py | 61 + SpeechT5/fairseq/fairseq/dataclass/utils.py | 476 + .../fairseq/fairseq/distributed/__init__.py | 21 + .../distributed_timeout_wrapper.py | 94 + .../fully_sharded_data_parallel.py | 135 + .../legacy_distributed_data_parallel.py | 165 + .../distributed/module_proxy_wrapper.py | 55 + .../tpu_distributed_data_parallel.py | 43 + SpeechT5/fairseq/fairseq/distributed/utils.py | 805 ++ SpeechT5/fairseq/fairseq/file_io.py | 194 + SpeechT5/fairseq/fairseq/file_utils.py | 369 + SpeechT5/fairseq/fairseq/hub_utils.py | 303 + .../fairseq/incremental_decoding_utils.py | 51 + .../fairseq/iterative_refinement_generator.py | 359 + SpeechT5/fairseq/fairseq/logging/__init__.py | 0 SpeechT5/fairseq/fairseq/logging/meters.py | 323 + SpeechT5/fairseq/fairseq/logging/metrics.py | 314 + .../fairseq/fairseq/logging/progress_bar.py | 490 + .../fairseq/model_parallel/__init__.py | 6 + .../model_parallel/criterions/__init__.py | 14 + .../vocab_parallel_cross_entropy.py | 87 + .../model_parallel/megatron_trainer.py | 71 + .../fairseq/model_parallel/models/__init__.py | 20 + .../pipeline_parallel_transformer/__init__.py | 6 + .../pipeline_parallel_transformer/layers.py | 600 + .../pipeline_parallel_transformer/model.py | 767 ++ .../model_parallel/models/roberta/__init__.py | 6 + .../model_parallel/models/roberta/model.py | 225 + .../model_parallel/models/transformer.py | 121 + .../model_parallel/models/transformer_lm.py | 174 + .../model_parallel/modules/__init__.py | 17 + .../modules/multihead_attention.py | 349 + .../modules/transformer_layer.py | 78 + SpeechT5/fairseq/fairseq/models/__init__.py | 225 + .../fairseq/fairseq/models/bart/__init__.py | 7 + .../fairseq/models/bart/hub_interface.py | 208 + SpeechT5/fairseq/fairseq/models/bart/model.py | 384 + .../fairseq/models/composite_encoder.py | 57 + .../models/distributed_fairseq_model.py | 145 + .../fairseq/fairseq/models/fairseq_decoder.py | 105 + .../fairseq/fairseq/models/fairseq_encoder.py | 92 + .../models/fairseq_incremental_decoder.py | 118 + .../fairseq/fairseq/models/fairseq_model.py | 569 + SpeechT5/fairseq/fairseq/models/fconv.py | 756 ++ SpeechT5/fairseq/fairseq/models/fconv_lm.py | 135 + .../fairseq/fairseq/models/fconv_self_att.py | 674 ++ .../fairseq/fairseq/models/hubert/__init__.py | 7 + .../fairseq/fairseq/models/hubert/hubert.py | 563 + .../fairseq/models/hubert/hubert_asr.py | 373 + .../fairseq/models/huggingface/__init__.py | 20 + .../fairseq/models/huggingface/hf_gpt2.py | 168 + SpeechT5/fairseq/fairseq/models/lightconv.py | 1018 ++ .../fairseq/fairseq/models/lightconv_lm.py | 306 + SpeechT5/fairseq/fairseq/models/lstm.py | 753 ++ SpeechT5/fairseq/fairseq/models/lstm_lm.py | 142 + SpeechT5/fairseq/fairseq/models/masked_lm.py | 403 + .../fairseq/fairseq/models/model_utils.py | 92 + .../models/multilingual_transformer.py | 228 + .../fairseq/fairseq/models/nat/__init__.py | 13 + .../fairseq/models/nat/cmlm_transformer.py | 162 + .../fairseq/models/nat/fairseq_nat_model.py | 170 + .../models/nat/insertion_transformer.py | 280 + ...iterative_nonautoregressive_transformer.py | 228 + .../models/nat/levenshtein_transformer.py | 509 + .../fairseq/models/nat/levenshtein_utils.py | 293 + .../fairseq/models/nat/nat_crf_transformer.py | 121 + .../models/nat/nonautoregressive_ensembles.py | 253 + .../nat/nonautoregressive_transformer.py | 456 + .../fairseq/models/roberta/__init__.py | 11 + .../fairseq/models/roberta/alignment_utils.py | 118 + .../fairseq/fairseq/models/roberta/enc_dec.py | 192 + .../fairseq/models/roberta/hub_interface.py | 235 + .../fairseq/fairseq/models/roberta/model.py | 582 + .../fairseq/models/roberta/model_camembert.py | 50 + .../fairseq/models/roberta/model_gottbert.py | 49 + .../fairseq/models/roberta/model_xlmr.py | 46 + .../fairseq/models/speech_to_text/__init__.py | 8 + .../fairseq/models/speech_to_text/berard.py | 606 + .../models/speech_to_text/convtransformer.py | 448 + .../modules/augmented_memory_attention.py | 488 + .../models/speech_to_text/modules/emformer.py | 1837 +++ .../models/speech_to_text/s2t_transformer.py | 496 + .../fairseq/models/speech_to_text/utils.py | 564 + .../fairseq/fairseq/models/transformer.py | 1187 ++ .../fairseq/models/transformer_align.py | 93 + .../models/transformer_from_pretrained_xlm.py | 152 + .../fairseq/fairseq/models/transformer_lm.py | 544 + .../fairseq/models/wav2vec/__init__.py | 8 + .../fairseq/fairseq/models/wav2vec/wav2vec.py | 630 ++ .../fairseq/models/wav2vec/wav2vec2.py | 1016 ++ .../fairseq/models/wav2vec/wav2vec2_asr.py | 655 ++ SpeechT5/fairseq/fairseq/modules/__init__.py | 78 + .../fairseq/fairseq/modules/adaptive_input.py | 80 + .../fairseq/modules/adaptive_softmax.py | 268 + .../fairseq/fairseq/modules/base_layer.py | 135 + .../fairseq/fairseq/modules/beamable_mm.py | 49 + .../modules/character_token_embedder.py | 214 + .../fairseq/modules/checkpoint_activations.py | 236 + SpeechT5/fairseq/fairseq/modules/conv_tbc.py | 53 + .../fairseq/fairseq/modules/cross_entropy.py | 61 + .../fairseq/fairseq/modules/cuda_utils.cu | 203 + .../downsampled_multihead_attention.py | 316 + .../fairseq/modules/dynamic_convolution.py | 310 + .../fairseq/modules/dynamic_crf_layer.py | 189 + .../modules/dynamicconv_layer/__init__.py | 6 + .../dynamicconv_layer/cuda_function_gen.py | 223 + .../dynamicconv_layer/dynamicconv_cuda.cpp | 56 + .../dynamicconv_layer/dynamicconv_cuda.cuh | 51 + .../dynamicconv_cuda_kernel.cu | 168 + .../dynamicconv_layer/dynamicconv_layer.py | 227 + .../dynamicconv_layer/dynamiconv_cpu.cpp | 35 + .../modules/dynamicconv_layer/setup.py | 23 + .../fairseq/modules/fairseq_dropout.py | 51 + .../fairseq/modules/fp32_group_norm.py | 25 + SpeechT5/fairseq/fairseq/modules/gelu.py | 25 + .../fairseq/fairseq/modules/grad_multiply.py | 18 + .../modules/gumbel_vector_quantizer.py | 202 + .../fairseq/modules/kmeans_attention.py | 609 + .../modules/kmeans_vector_quantizer.py | 127 + .../fairseq/fairseq/modules/layer_drop.py | 44 + .../fairseq/fairseq/modules/layer_norm.py | 50 + .../modules/learned_positional_embedding.py | 61 + .../modules/lightconv_layer/__init__.py | 6 + .../lightconv_layer/cuda_function_gen.py | 289 + .../lightconv_layer/lightconv_cuda.cpp | 54 + .../lightconv_layer/lightconv_cuda.cuh | 83 + .../lightconv_layer/lightconv_cuda_kernel.cu | 375 + .../lightconv_layer/lightconv_layer.py | 137 + .../fairseq/modules/lightconv_layer/setup.py | 23 + .../modules/lightweight_convolution.py | 310 + .../fairseq/modules/linearized_convolution.py | 110 + .../fairseq/modules/multihead_attention.py | 500 + .../fairseq/modules/positional_embedding.py | 35 + .../fairseq/fairseq/modules/quant_noise.py | 107 + .../fairseq/modules/quantization/__init__.py | 0 .../modules/quantization/pq/__init__.py | 6 + .../fairseq/modules/quantization/pq/em.py | 211 + .../quantization/pq/modules/__init__.py | 8 + .../modules/quantization/pq/modules/qconv.py | 115 + .../modules/quantization/pq/modules/qemb.py | 107 + .../quantization/pq/modules/qlinear.py | 71 + .../fairseq/modules/quantization/pq/pq.py | 128 + .../fairseq/modules/quantization/pq/utils.py | 337 + .../quantization/quantization_options.py | 44 + .../modules/quantization/scalar/__init__.py | 6 + .../quantization/scalar/modules/__init__.py | 9 + .../quantization/scalar/modules/qact.py | 88 + .../quantization/scalar/modules/qconv.py | 149 + .../quantization/scalar/modules/qemb.py | 147 + .../quantization/scalar/modules/qlinear.py | 113 + .../modules/quantization/scalar/ops.py | 49 + .../modules/quantization/scalar/utils.py | 77 + SpeechT5/fairseq/fairseq/modules/same_pad.py | 21 + .../fairseq/fairseq/modules/scalar_bias.py | 31 + .../sinusoidal_positional_embedding.py | 105 + .../modules/sparse_multihead_attention.py | 140 + .../sparse_transformer_sentence_encoder.py | 96 + ...arse_transformer_sentence_encoder_layer.py | 51 + .../fairseq/modules/transformer_layer.py | 419 + .../modules/transformer_sentence_encoder.py | 291 + .../transformer_sentence_encoder_layer.py | 139 + .../fairseq/fairseq/modules/transpose_last.py | 20 + SpeechT5/fairseq/fairseq/modules/unfold.py | 19 + SpeechT5/fairseq/fairseq/modules/vggblock.py | 116 + SpeechT5/fairseq/fairseq/nan_detector.py | 108 + .../fairseq/fairseq/ngram_repeat_block.py | 150 + SpeechT5/fairseq/fairseq/optim/__init__.py | 48 + SpeechT5/fairseq/fairseq/optim/adadelta.py | 47 + SpeechT5/fairseq/fairseq/optim/adafactor.py | 268 + SpeechT5/fairseq/fairseq/optim/adagrad.py | 40 + SpeechT5/fairseq/fairseq/optim/adam.py | 228 + SpeechT5/fairseq/fairseq/optim/adamax.py | 172 + .../fairseq/fairseq/optim/amp_optimizer.py | 105 + SpeechT5/fairseq/fairseq/optim/bmuf.py | 200 + SpeechT5/fairseq/fairseq/optim/composite.py | 188 + SpeechT5/fairseq/fairseq/optim/cpu_adam.py | 200 + .../fairseq/optim/dynamic_loss_scaler.py | 70 + .../fairseq/optim/fairseq_optimizer.py | 179 + .../fairseq/fairseq/optim/fp16_optimizer.py | 546 + SpeechT5/fairseq/fairseq/optim/fused_adam.py | 348 + SpeechT5/fairseq/fairseq/optim/fused_lamb.py | 51 + .../fairseq/optim/lr_scheduler/__init__.py | 36 + .../optim/lr_scheduler/cosine_lr_scheduler.py | 147 + .../lr_scheduler/fairseq_lr_scheduler.py | 59 + .../optim/lr_scheduler/fixed_schedule.py | 76 + .../inverse_square_root_schedule.py | 85 + .../optim/lr_scheduler/manual_lr_scheduler.py | 110 + .../optim/lr_scheduler/pass_through.py | 39 + .../lr_scheduler/polynomial_decay_schedule.py | 89 + .../lr_scheduler/reduce_lr_on_plateau.py | 143 + .../lr_scheduler/tri_stage_lr_scheduler.py | 175 + .../lr_scheduler/triangular_lr_scheduler.py | 83 + SpeechT5/fairseq/fairseq/optim/nag.py | 111 + SpeechT5/fairseq/fairseq/optim/sgd.py | 43 + SpeechT5/fairseq/fairseq/optim/shard.py | 58 + SpeechT5/fairseq/fairseq/options.py | 381 + SpeechT5/fairseq/fairseq/pdb.py | 47 + .../fairseq/fairseq/quantization_utils.py | 143 + SpeechT5/fairseq/fairseq/registry.py | 100 + SpeechT5/fairseq/fairseq/scoring/__init__.py | 55 + SpeechT5/fairseq/fairseq/scoring/bleu.py | 167 + SpeechT5/fairseq/fairseq/scoring/chrf.py | 27 + SpeechT5/fairseq/fairseq/scoring/tokenizer.py | 67 + SpeechT5/fairseq/fairseq/scoring/wer.py | 58 + SpeechT5/fairseq/fairseq/search.py | 814 ++ .../fairseq/fairseq/sequence_generator.py | 980 ++ SpeechT5/fairseq/fairseq/sequence_scorer.py | 153 + SpeechT5/fairseq/fairseq/tasks/__init__.py | 136 + .../fairseq/tasks/audio_pretraining.py | 381 + .../fairseq/fairseq/tasks/cross_lingual_lm.py | 191 + SpeechT5/fairseq/fairseq/tasks/denoising.py | 274 + .../fairseq/fairseq/tasks/fairseq_task.py | 677 ++ .../fairseq/tasks/hubert_pretraining.py | 193 + .../fairseq/tasks/language_modeling.py | 379 + .../fairseq/fairseq/tasks/legacy_masked_lm.py | 152 + SpeechT5/fairseq/fairseq/tasks/masked_lm.py | 258 + .../fairseq/tasks/multilingual_denoising.py | 254 + .../fairseq/tasks/multilingual_masked_lm.py | 338 + .../fairseq/tasks/multilingual_translation.py | 457 + .../fairseq/tasks/online_backtranslation.py | 677 ++ .../tasks/semisupervised_translation.py | 485 + .../fairseq/tasks/sentence_prediction.py | 286 + .../fairseq/fairseq/tasks/sentence_ranking.py | 219 + .../fairseq/tasks/simultaneous_translation.py | 42 + .../fairseq/fairseq/tasks/speech_to_text.py | 149 + SpeechT5/fairseq/fairseq/tasks/translation.py | 487 + .../tasks/translation_from_pretrained_bart.py | 132 + .../tasks/translation_from_pretrained_xlm.py | 39 + .../fairseq/fairseq/tasks/translation_lev.py | 191 + .../tasks/translation_multi_simple_epoch.py | 430 + .../fairseq/token_generation_constraints.py | 506 + SpeechT5/fairseq/fairseq/tokenizer.py | 15 + SpeechT5/fairseq/fairseq/trainer.py | 1439 +++ SpeechT5/fairseq/fairseq/utils.py | 807 ++ SpeechT5/fairseq/fairseq/version.txt | 1 + SpeechT5/fairseq/fairseq_cli/__init__.py | 0 SpeechT5/fairseq/fairseq_cli/eval_lm.py | 347 + SpeechT5/fairseq/fairseq_cli/generate.py | 408 + SpeechT5/fairseq/fairseq_cli/hydra_train.py | 80 + SpeechT5/fairseq/fairseq_cli/interactive.py | 316 + SpeechT5/fairseq/fairseq_cli/preprocess.py | 401 + SpeechT5/fairseq/fairseq_cli/score.py | 102 + SpeechT5/fairseq/fairseq_cli/train.py | 514 + SpeechT5/fairseq/fairseq_cli/validate.py | 155 + SpeechT5/fairseq/hubconf.py | 73 + SpeechT5/fairseq/pyproject.toml | 3 + SpeechT5/fairseq/scripts/__init__.py | 0 .../fairseq/scripts/average_checkpoints.py | 158 + .../fairseq/scripts/build_sym_alignment.py | 97 + .../fairseq/scripts/compare_namespaces.py | 46 + .../fairseq/scripts/compound_split_bleu.sh | 20 + .../fairseq/scripts/constraints/extract.py | 92 + .../fairseq/scripts/constraints/validate.py | 34 + .../fairseq/scripts/convert_dictionary.lua | 34 + SpeechT5/fairseq/scripts/convert_model.lua | 108 + SpeechT5/fairseq/scripts/count_docs.py | 58 + SpeechT5/fairseq/scripts/read_binarized.py | 48 + SpeechT5/fairseq/scripts/rm_pt.py | 141 + SpeechT5/fairseq/scripts/sacrebleu.sh | 27 + SpeechT5/fairseq/scripts/shard_docs.py | 54 + .../fairseq/scripts/split_train_valid_docs.py | 86 + SpeechT5/fairseq/scripts/spm_decode.py | 53 + SpeechT5/fairseq/scripts/spm_encode.py | 119 + SpeechT5/fairseq/scripts/spm_train.py | 16 + SpeechT5/fairseq/scripts/test_fsdp.sh | 24 + SpeechT5/fairseq/setup.py | 271 + SpeechT5/fairseq/tests/__init__.py | 0 .../fairseq/tests/distributed/__init__.py | 0 .../fairseq/tests/distributed/test_bmuf.py | 207 + .../test_distributed_timeout_wrapper.py | 54 + .../distributed/test_module_proxy_wrapper.py | 75 + .../fairseq/tests/distributed/test_utils.py | 124 + SpeechT5/fairseq/tests/distributed/utils.py | 62 + SpeechT5/fairseq/tests/gpu/__init__.py | 0 .../fairseq/tests/gpu/test_binaries_gpu.py | 449 + .../gpu/transformer_quantization_config.yaml | 28 + .../tests/speech_recognition/__init__.py | 0 .../tests/speech_recognition/asr_test_base.py | 557 + .../speech_recognition/test_collaters.py | 58 + .../speech_recognition/test_cross_entropy.py | 37 + .../speech_recognition/test_data_utils.py | 62 + .../speech_recognition/test_vggtransformer.py | 135 + .../tests/test_activation_checkpointing.py | 79 + SpeechT5/fairseq/tests/test_amp_optimizer.py | 78 + .../fairseq/tests/test_average_checkpoints.py | 134 + .../tests/test_backtranslation_dataset.py | 123 + SpeechT5/fairseq/tests/test_binaries.py | 1874 +++ .../tests/test_character_token_embedder.py | 48 + .../fairseq/tests/test_checkpoint_utils.py | 106 + SpeechT5/fairseq/tests/test_concat_dataset.py | 58 + SpeechT5/fairseq/tests/test_constraints.py | 269 + SpeechT5/fairseq/tests/test_convtbc.py | 54 + SpeechT5/fairseq/tests/test_data_utils.py | 136 + SpeechT5/fairseq/tests/test_dataset.py | 66 + SpeechT5/fairseq/tests/test_dictionary.py | 116 + SpeechT5/fairseq/tests/test_export.py | 121 + SpeechT5/fairseq/tests/test_file_io.py | 58 + SpeechT5/fairseq/tests/test_fp16_optimizer.py | 112 + .../fairseq/tests/test_inference_dropout.py | 70 + SpeechT5/fairseq/tests/test_iopath.py | 29 + SpeechT5/fairseq/tests/test_iterators.py | 137 + .../fairseq/tests/test_label_smoothing.py | 123 + .../fairseq/tests/test_lm_context_window.py | 51 + SpeechT5/fairseq/tests/test_lstm_jitable.py | 115 + .../tests/test_memory_efficient_fp16.py | 78 + SpeechT5/fairseq/tests/test_metrics.py | 77 + .../tests/test_multi_corpus_dataset.py | 79 + .../test_multi_corpus_sampled_dataset.py | 95 + .../fairseq/tests/test_multihead_attention.py | 73 + SpeechT5/fairseq/tests/test_noising.py | 530 + .../tests/test_online_backtranslation.py | 206 + SpeechT5/fairseq/tests/test_plasma_utils.py | 126 + .../fairseq/tests/test_reproducibility.py | 150 + .../fairseq/tests/test_resampling_dataset.py | 103 + SpeechT5/fairseq/tests/test_roberta.py | 314 + .../fairseq/tests/test_sequence_generator.py | 745 ++ .../fairseq/tests/test_sequence_scorer.py | 120 + .../tests/test_sparse_multihead_attention.py | 114 + .../fairseq/tests/test_token_block_dataset.py | 92 + SpeechT5/fairseq/tests/test_train.py | 246 + SpeechT5/fairseq/tests/test_transformer.py | 65 + SpeechT5/fairseq/tests/test_utils.py | 114 + .../fairseq/tests/test_valid_subset_checks.py | 138 + SpeechT5/fairseq/tests/utils.py | 717 ++ SpeechT5/fairseq/train.py | 14 + SpeechT5/results/ablation_study.png | Bin 0 -> 51343 bytes SpeechT5/results/asr.png | Bin 0 -> 70998 bytes SpeechT5/results/se.png | Bin 0 -> 21237 bytes SpeechT5/results/sid.png | Bin 0 -> 48583 bytes SpeechT5/results/st.png | Bin 0 -> 32396 bytes SpeechT5/results/tts.png | Bin 0 -> 17954 bytes SpeechT5/results/vc.png | Bin 0 -> 37419 bytes SpeechT5/scripts/generate_class.py | 153 + SpeechT5/scripts/generate_speech.py | 199 + SpeechT5/speecht5/__init__.py | 1 + SpeechT5/speecht5/criterions/__init__.py | 10 + .../criterions/speech_pretrain_criterion.py | 268 + .../criterions/speech_to_text_loss.py | 476 + .../speecht5/criterions/speecht5_criterion.py | 446 + .../criterions/text_pretrain_criterion.py | 145 + .../criterions/text_to_speech_loss.py | 428 + SpeechT5/speecht5/data/__init__.py | 0 SpeechT5/speecht5/data/multitask_dataset.py | 265 + SpeechT5/speecht5/data/speech_dataset.py | 476 + .../speecht5/data/speech_to_class_dataset.py | 262 + .../speecht5/data/speech_to_speech_dataset.py | 282 + .../speecht5/data/speech_to_text_dataset.py | 270 + SpeechT5/speecht5/data/text_dataset.py | 476 + .../speecht5/data/text_to_speech_dataset.py | 331 + SpeechT5/speecht5/models/__init__.py | 2 + SpeechT5/speecht5/models/modules/__init__.py | 0 SpeechT5/speecht5/models/modules/decoder.py | 324 + SpeechT5/speecht5/models/modules/encoder.py | 381 + .../models/modules/multihead_attention.py | 522 + .../models/modules/speaker_decoder_postnet.py | 197 + .../models/modules/speech_decoder_postnet.py | 76 + .../models/modules/speech_decoder_prenet.py | 110 + .../models/modules/speech_encoder_postnet.py | 124 + .../models/modules/speech_encoder_prenet.py | 374 + .../models/modules/text_decoder_postnet.py | 93 + .../models/modules/text_decoder_prenet.py | 128 + .../models/modules/text_encoder_prenet.py | 45 + .../models/modules/transformer_layer.py | 411 + SpeechT5/speecht5/models/speecht5.py | 1447 +++ SpeechT5/speecht5/models/t5_transformer_lm.py | 25 + SpeechT5/speecht5/sequence_generator.py | 1080 ++ SpeechT5/speecht5/tasks/__init__.py | 0 SpeechT5/speecht5/tasks/speecht5.py | 700 ++ SpeechT5/speecht5_framework.png | Bin 0 -> 637340 bytes SpeechT5/spm.py | 13 + SpeechUT/README.md | 203 + SpeechUT/dataset/LibriSpeech/dict.km.txt | 500 + SpeechUT/dataset/LibriSpeech/dict.kmu.txt | 500 + SpeechUT/dataset/LibriSpeech/dict.ltr.txt | 29 + SpeechUT/dataset/LibriSpeech/dict.txt | 28 + SpeechUT/dataset/MuSTC/dict.km.txt | 500 + SpeechUT/dataset/MuSTC/dict.kmu.txt | 500 + SpeechUT/dataset/MuSTC/en_de/config.yaml | 3 + SpeechUT/dataset/MuSTC/en_de/config_ende.yaml | 14 + SpeechUT/dataset/MuSTC/en_de/dict.kmu.txt | 500 + SpeechUT/dataset/MuSTC/en_de/dict.spm.txt | 9997 +++++++++++++++++ .../MuSTC/en_de/spm_unigram10000.model | Bin 0 -> 406948 bytes SpeechUT/dataset/MuSTC/en_es/config.yaml | 3 + SpeechUT/dataset/MuSTC/en_es/config_enes.yaml | 14 + SpeechUT/dataset/MuSTC/en_es/dict.kmu.txt | 500 + SpeechUT/dataset/MuSTC/en_es/dict.spm.txt | 9997 +++++++++++++++++ .../MuSTC/en_es/spm_unigram10000.model | Bin 0 -> 417070 bytes SpeechUT/dataset/MuSTC/en_fr/config.yaml | 3 + SpeechUT/dataset/MuSTC/en_fr/config_enfr.yaml | 14 + SpeechUT/dataset/MuSTC/en_fr/dict.kmu.txt | 500 + SpeechUT/dataset/MuSTC/en_fr/dict.spm.txt | 9997 +++++++++++++++++ .../MuSTC/en_fr/spm_unigram10000.model | Bin 0 -> 410452 bytes SpeechUT/speechut/__init__.py | 1 + .../finetune_asr/speechut_base_100h.yaml | 101 + .../finetune_asr/speechut_large_100h.yaml | 102 + .../finetune_asr/speechut_large_960h.yaml | 100 + .../pretrain/speechut_base_librispeech.yaml | 153 + .../pretrain/speechut_large_librilight.yaml | 159 + SpeechUT/speechut/criterions/__init__.py | 9 + SpeechUT/speechut/criterions/ctc_ce.py | 414 + .../speechut/criterions/speechut_criterion.py | 384 + SpeechUT/speechut/data/concat_dataset.py | 129 + SpeechUT/speechut/data/hubert_dataset.py | 597 + .../speechut/data/language_trible_dataset.py | 669 ++ .../speechut/data/load_langpair_dataset.py | 172 + .../data/multimodal_corpus_dataset.py | 368 + SpeechUT/speechut/models/__init__.py | 0 SpeechUT/speechut/models/speechut.py | 785 ++ SpeechUT/speechut/models/speechut_asr.py | 165 + SpeechUT/speechut/models/speechut_st.py | 221 + SpeechUT/speechut/models/t5_transformer_lm.py | 25 + SpeechUT/speechut/modules/__init__.py | 27 + SpeechUT/speechut/modules/ctc_prefix_score.py | 93 + .../modules/learned_positional_embedding.py | 69 + .../speechut/modules/multihead_attention.py | 346 + SpeechUT/speechut/modules/relative_pos_enc.py | 33 + .../speechut/modules/transformer_decoder.py | 543 + .../speechut/modules/transformer_encoder.py | 401 + .../speechut/modules/transformer_layer.py | 330 + SpeechUT/speechut/modules/w2v_encoder.py | 281 + .../base_speechut_for_asr.sh | 40 + .../pretrain_speechut/base_speechut_for_st.sh | 47 + .../base_speechut_for_st_enfr.sh | 48 + .../large_speechut_for_asr.sh | 41 + .../finetune960h_large_edctc.sh | 45 + .../tune_speechut_asr/finetune_base_edctc.sh | 45 + .../tune_speechut_asr/inference_edctc.sh | 61 + .../tune_speechut_asr/inference_edctclm.sh | 66 + .../tune_speechut_asr/inference_lm_nj.sh | 74 + .../scripts/tune_speechut_asr/inference_nj.sh | 69 + .../finetune_base_mustc_enxx.sh | 77 + .../scripts/tune_speechut_st/inference_st.sh | 44 + SpeechUT/speechut/squence_generator.py | 1118 ++ .../speechut/tasks/joint_sc2t_pretrain.py | 1004 ++ VATLM/README.md | 135 + VATLM/vat_hubert/requirements.txt | 6 + VATLM/vat_hubert/vathubert/__init__.py | 11 + .../conf/finetune/base_lrs3_30h_av.yaml | 118 + .../conf/finetune/base_lrs3_30h_v.yaml | 118 + .../conf/finetune/base_vox_30h_av.yaml | 118 + .../conf/finetune/base_vox_30h_v.yaml | 118 + .../conf/finetune/base_vox_433h_av.yaml | 118 + .../conf/finetune/base_vox_433h_v.yaml | 118 + .../conf/finetune/large_vox_30h_av.yaml | 124 + .../conf/finetune/large_vox_30h_v.yaml | 121 + .../conf/finetune/large_vox_433h_av.yaml | 122 + .../conf/finetune/large_vox_433h_v.yaml | 121 + .../conf/pretrain/base_lrs3_iter5.yaml | 113 + .../conf/pretrain/base_vox_iter5.yaml | 113 + .../conf/pretrain/large_vox_iter5.yaml | 118 + .../vat_hubert/vathubert/conf/s2s_decode.yaml | 23 + .../vathubert/criterions/__init__.py | 9 + .../criterions/vathubert_criterion.py | 408 + .../vathubert/data/audiohubert_dataset.py | 509 + .../vathubert/data/onlyaudiohubert_dataset.py | 436 + .../vathubert/data/texthubert_dataset.py | 300 + VATLM/vat_hubert/vathubert/data/utils.py | 300 + .../vathubert/data/vathubert_dataset.py | 530 + .../vathubert/decode_avhubert_lrs3.sh | 17 + VATLM/vat_hubert/vathubert/infer_s2s.py | 321 + VATLM/vat_hubert/vathubert/models/decoder.py | 246 + VATLM/vat_hubert/vathubert/models/resnet.py | 172 + VATLM/vat_hubert/vathubert/models/utils.py | 301 + .../vat_hubert/vathubert/models/vathubert.py | 851 ++ .../vathubert/models/vathubert_asr.py | 481 + .../finetune_avsr/base_lrs3_finetune30_av.sh | 27 + .../finetune_avsr/base_vox_finetune30_av.sh | 28 + .../finetune_avsr/base_vox_finetune433_av.sh | 28 + .../finetune_avsr/large_vox_finetune30_av.sh | 24 + .../finetune_avsr/large_vox_finetune433_av.sh | 28 + .../finetune_vsr/base_lrs3_finetune30_v.sh | 27 + .../finetune_vsr/base_vox_finetune30_v.sh | 27 + .../finetune_vsr/base_vox_finetune433_v.sh | 28 + .../finetune_vsr/large_vox_finetune30_v.sh | 27 + .../finetune_vsr/large_vox_finetune433_v.sh | 28 + .../pretrain/base_lsr3_pretrain_iter5.sh | 31 + .../pretrain/base_vox_pretrain_iter5.sh | 30 + .../pretrain/large_vox_pretrain_iter5.sh | 31 + .../vathubert/sequence_generator.py | 988 ++ .../vathubert/tasks/vathubert_pretraining.py | 863 ++ VATLM/vat_hubert/vathubert/utils.py | 298 + WavLLM/README.md | 80 + WavLLM/download/download.sh | 26 + WavLLM/wavllm/__init__.py | 1 + WavLLM/wavllm/criterions/cross_entropy_acc.py | 120 + WavLLM/wavllm/data/speechllm_dataset.py | 678 ++ WavLLM/wavllm/data/tokenizer.py | 49 + WavLLM/wavllm/inference/generate.py | 454 + WavLLM/wavllm/inference/sequence_generator.py | 1017 ++ WavLLM/wavllm/models/llama.py | 693 ++ WavLLM/wavllm/models/speechllm_model.py | 299 + WavLLM/wavllm/models/wavlm.py | 159 + WavLLM/wavllm/models/whisper_encoder.py | 219 + WavLLM/wavllm/modules/convolution.py | 126 + WavLLM/wavllm/requirements.txt | 7 + WavLLM/wavllm/scripts/inference_sft.sh | 39 + WavLLM/wavllm/tasks/speechllm_task.py | 533 + WavLLM/wavllm/test_data/CoT-task-story.tsv | 2 + WavLLM/wavllm/test_data/CoT-task.tsv | 2 + WavLLM/wavllm/test_data/II-task.tsv | 2 + WavLLM/wavllm/test_data/SQA.tsv | 2 + WavLLM/wavllm/test_data/SQQA.tsv | 2 + WavLLM/wavllm/test_data/asr.tsv | 2 + .../wavllm/test_data/audio/CoT-task-story.wav | Bin 0 -> 1566446 bytes WavLLM/wavllm/test_data/audio/CoT-task.wav | Bin 0 -> 351646 bytes WavLLM/wavllm/test_data/audio/II-task.wav | Bin 0 -> 1757050 bytes WavLLM/wavllm/test_data/audio/asr.flac | Bin 0 -> 183318 bytes WavLLM/wavllm/test_data/audio/emo.wav | Bin 0 -> 71082 bytes WavLLM/wavllm/test_data/audio/sqa.wav | Bin 0 -> 1519738 bytes WavLLM/wavllm/test_data/audio/sqqa.wav | Bin 0 -> 265006 bytes WavLLM/wavllm/test_data/audio/st.flac | Bin 0 -> 30343 bytes WavLLM/wavllm/test_data/audio/sv.wav | Bin 0 -> 702768 bytes WavLLM/wavllm/test_data/dict.txt | 5 + WavLLM/wavllm/test_data/emo.tsv | 2 + WavLLM/wavllm/test_data/en2de.tsv | 2 + WavLLM/wavllm/test_data/gaokao.tsv | 2001 ++++ WavLLM/wavllm/test_data/sv.tsv | 2 + WavLLM/wavllm/tokenizer/tokenizer.model | Bin 0 -> 499723 bytes YiTrans/.gitignore | 2 + .../finetune_hubert24_mbart24_en.sh | 67 + .../finetune_MT/finetune_mbart_en-de.sh | 75 + .../finetune_ST/en-de/jtst_pt36s2_mustc.sh | 83 + .../pretrain/pretrain_pt36_adaptor_step1.sh | 46 + .../pretrain/pretrain_pt36_adaptor_step2.sh | 45 + YiTrans/readme.md | 98 + YiTrans/yitrans_iwslt22/__init__.py | 1 + .../config/finetune_asr/large_mustc.yaml | 103 + .../config/finetune_mt/mt_translation.yaml | 89 + .../config/pretrain/joint_base.yaml | 134 + .../config/pretrain/joint_large.yaml | 159 + .../yitrans_iwslt22/criterions/__init__.py | 9 + YiTrans/yitrans_iwslt22/criterions/ctc_ce.py | 414 + .../criterions/joint_step1_criterion.py | 366 + .../joint_step1_split_batch_criterion.py | 370 + .../criterions/joint_step2_criterion.py | 424 + .../yitrans_iwslt22/data/concat_dataset.py | 124 + .../yitrans_iwslt22/data/denoising_dataset.py | 90 + .../data/lang_pair_mask_dataset.py | 62 + .../data/load_langpair_dataset.py | 170 + .../data/multimodal_corpus_dataset.py | 346 + .../yitrans_iwslt22/data/speech2c_dataset.py | 222 + YiTrans/yitrans_iwslt22/models/__init__.py | 0 YiTrans/yitrans_iwslt22/models/_hubert_mt.py | 310 + .../yitrans_iwslt22/models/finetune_asr.py | 460 + YiTrans/yitrans_iwslt22/models/finetune_mt.py | 355 + YiTrans/yitrans_iwslt22/models/finetune_st.py | 434 + YiTrans/yitrans_iwslt22/models/pretrain_ed.py | 698 ++ .../models/pretrain_ed_step2.py | 438 + YiTrans/yitrans_iwslt22/modules/__init__.py | 23 + .../modules/multihead_attention.py | 341 + .../modules/multimodal_transformer_decoder.py | 525 + .../modules/relative_pos_enc.py | 35 + .../modules/transformer_decoder.py | 523 + .../modules/transformer_decoder_layer.py | 219 + .../yitrans_iwslt22/modules/w2v_encoder.py | 283 + YiTrans/yitrans_iwslt22/sequence_generator.py | 999 ++ .../tasks/iwslt_joint_pretraining.py | 726 ++ .../tasks/iwslt_translation_from_pretrain.py | 252 + asr_train.sh | 187 + calc4vc.py | 40 + dict.txt | 75 + docker/Dockerfile | 2 + icon.png | Bin 0 -> 70013 bytes images/algorithm.png | Bin 0 -> 128512 bytes images/model_architecture.png | Bin 0 -> 102256 bytes libri_labels.py | 56 + librispeech_asr_demo.py | 137 + model.properties | 10 + requirements.txt | 5 + test_asr.sh | 29 + 1331 files changed, 270422 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE create mode 100644 README_ori.md create mode 100644 SECURITY.md create mode 100644 Speech2C/README.md create mode 100644 Speech2C/speech2c/__init__.py create mode 100644 Speech2C/speech2c/config/base_100h.yaml create mode 100644 Speech2C/speech2c/config/base_10h.yaml create mode 100644 Speech2C/speech2c/config/speech2c_base_librispeech.yaml create mode 100644 Speech2C/speech2c/criterions/__init__.py create mode 100644 Speech2C/speech2c/criterions/ctc_ce.py create mode 100644 Speech2C/speech2c/criterions/speech2c_criterion.py create mode 100644 Speech2C/speech2c/data/speech2c_dataset.py create mode 100644 Speech2C/speech2c/models/modules/ctc_prefix_score.py create mode 100644 Speech2C/speech2c/models/modules/multihead_attention.py create mode 100644 Speech2C/speech2c/models/modules/relative_pos_enc.py create mode 100644 Speech2C/speech2c/models/modules/transformer_decoder.py create mode 100644 Speech2C/speech2c/models/modules/transformer_decoder_layer.py create mode 100644 Speech2C/speech2c/models/modules/transformer_encoder.py create mode 100644 Speech2C/speech2c/models/speech2c.py create mode 100644 Speech2C/speech2c/models/speech2c_asr.py create mode 100644 Speech2C/speech2c/models/t5_transformer_lm.py create mode 100644 Speech2C/speech2c/squence_generator.py create mode 100644 Speech2C/speech2c/tasks/speech2c_pretraining.py create mode 100644 Speech2S/README.md create mode 100644 Speech2S/speech2s/__init__.py create mode 100644 Speech2S/speech2s/config/finetune_asr/speechut_base_100h.yaml create mode 100644 Speech2S/speech2s/config/finetune_asr/speechut_large_100h.yaml create mode 100644 Speech2S/speech2s/config/finetune_asr/speechut_large_960h.yaml create mode 100644 Speech2S/speech2s/config/pretrain/speechut_base_librispeech.yaml create mode 100644 Speech2S/speech2s/config/pretrain/speechut_large_librilight.yaml create mode 100644 Speech2S/speech2s/criterions/__init__.py create mode 100644 Speech2S/speech2s/criterions/ctc_ce.py create mode 100644 Speech2S/speech2s/criterions/speechut_criterion.py create mode 100644 Speech2S/speech2s/data/concat_dataset.py create mode 100644 Speech2S/speech2s/data/hubert_dataset.py create mode 100644 Speech2S/speech2s/data/language_trible_dataset.py create mode 100644 Speech2S/speech2s/data/load_langpair_dataset.py create mode 100644 Speech2S/speech2s/data/multimodal_corpus_dataset.py create mode 100644 Speech2S/speech2s/models/__init__.py create mode 100644 Speech2S/speech2s/models/speechut.py create mode 100644 Speech2S/speech2s/models/speechut_asr.py create mode 100644 Speech2S/speech2s/models/speechut_st.py create mode 100644 Speech2S/speech2s/models/t5_transformer_lm.py create mode 100644 Speech2S/speech2s/modules/__init__.py create mode 100644 Speech2S/speech2s/modules/ctc_prefix_score.py create mode 100644 Speech2S/speech2s/modules/learned_positional_embedding.py create mode 100644 Speech2S/speech2s/modules/multihead_attention.py create mode 100644 Speech2S/speech2s/modules/relative_pos_enc.py create mode 100644 Speech2S/speech2s/modules/transformer_decoder.py create mode 100644 Speech2S/speech2s/modules/transformer_encoder.py create mode 100644 Speech2S/speech2s/modules/transformer_layer.py create mode 100644 Speech2S/speech2s/modules/w2v_encoder.py create mode 100644 Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_asr.sh create mode 100644 Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st.sh create mode 100644 Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st_enfr.sh create mode 100644 Speech2S/speech2s/scripts copy/pretrain_speechut/large_speechut_for_asr.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune960h_large_edctc.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune_base_edctc.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctc.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctclm.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_lm_nj.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_nj.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_st/finetune_base_mustc_enxx.sh create mode 100644 Speech2S/speech2s/scripts copy/tune_speechut_st/inference_st.sh create mode 100644 Speech2S/speech2s/scripts/__init__.py create mode 100644 Speech2S/speech2s/scripts/average_checkpoints.py create mode 100644 Speech2S/speech2s/scripts/build_sym_alignment.py create mode 100644 Speech2S/speech2s/scripts/compare_namespaces.py create mode 100644 Speech2S/speech2s/scripts/compound_split_bleu.sh create mode 100644 Speech2S/speech2s/scripts/constraints/extract.py create mode 100644 Speech2S/speech2s/scripts/constraints/validate.py create mode 100644 Speech2S/speech2s/scripts/convert_dictionary.lua create mode 100644 Speech2S/speech2s/scripts/convert_model.lua create mode 100644 Speech2S/speech2s/scripts/count_docs.py create mode 100644 Speech2S/speech2s/scripts/read_binarized.py create mode 100644 Speech2S/speech2s/scripts/rm_pt.py create mode 100644 Speech2S/speech2s/scripts/sacrebleu.sh create mode 100644 Speech2S/speech2s/scripts/shard_docs.py create mode 100644 Speech2S/speech2s/scripts/split_train_valid_docs.py create mode 100644 Speech2S/speech2s/scripts/spm_decode.py create mode 100644 Speech2S/speech2s/scripts/spm_encode.py create mode 100644 Speech2S/speech2s/scripts/spm_train.py create mode 100644 Speech2S/speech2s/scripts/test_fsdp.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/base_sc2c_enes.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/base_sc2c_esen.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/config.yaml create mode 100644 Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/base_100h.yaml create mode 100644 Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/large_960h.yaml create mode 100644 Speech2S/speech2s/stpretrain_scripts/config/pretrain/mbart.yaml create mode 100644 Speech2S/speech2s/stpretrain_scripts/config/pretrain/sc2t_base_librispeech.yaml create mode 100644 Speech2S/speech2s/stpretrain_scripts/config/translation/text2code.yaml create mode 100644 Speech2S/speech2s/stpretrain_scripts/config_mbart.yaml create mode 100644 Speech2S/speech2s/stpretrain_scripts/data_process/extract_hubert_feature_itp.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/data_process/merge_code.py create mode 100644 Speech2S/speech2s/stpretrain_scripts/data_process/txt2idx.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/data_process/txt2spm.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_en_text.py create mode 100644 Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_es_text.py create mode 100644 Speech2S/speech2s/stpretrain_scripts/decode_text2code_beam2.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/eval2.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/eval3.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/finetune_enes.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/finetune_esen.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/inference_ed.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es2.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code_beam2.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_bleu.sh create mode 100644 Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_wer.sh create mode 100644 Speech2S/speech2s/tasks/joint_sc2t_pretrain.py create mode 100644 SpeechLM/README.md create mode 100644 SpeechLM/SpeechLM.py create mode 100644 SpeechLM/dataset/CommonVoice/v4/en/en-de/config_base_ende.yaml create mode 100644 SpeechLM/dataset/CommonVoice/v4/en/en-de/config_large_ende.yaml create mode 100644 SpeechLM/dataset/CommonVoice/v4/en/en-de/dev-sample100_st_en_de_local.tsv create mode 100644 SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.model create mode 100644 SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.txt create mode 100644 SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.vocab create mode 100644 SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/config.yaml create mode 100644 SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.km.txt create mode 100644 SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.ltr.txt create mode 100644 SpeechLM/dataset/LibriLM/phone_unit/bin-idx/config.yaml create mode 100644 SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.ltr.txt create mode 100644 SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.phn.txt create mode 100644 SpeechLM/dataset/LibriSpeech/asr/dict.ltr.txt create mode 100644 SpeechLM/dataset/LibriSpeech/asr/train_sample100.ltr create mode 100644 SpeechLM/dataset/LibriSpeech/asr/train_sample100.tsv create mode 100644 SpeechLM/dataset/LibriSpeech/fast_phone2unit/config.yaml create mode 100644 SpeechLM/dataset/LibriSpeech/fast_phone2unit/config_generate.yaml create mode 100644 SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.PHN.txt create mode 100644 SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.km.txt create mode 100644 SpeechLM/dataset/LibriSpeech/fast_phone2unit/genset_examples.tsv create mode 100644 SpeechLM/dataset/LibriSpeech/fast_phone2unit/train_exmples.tsv create mode 100644 SpeechLM/dataset/LibriSpeech/hidden_unit/dict.km.txt create mode 100644 SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.km create mode 100644 SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.tsv create mode 100644 SpeechLM/dataset/LibriSpeech/phone_unit/dict.phn.txt create mode 100644 SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.phn create mode 100644 SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.tsv create mode 100644 SpeechLM/modules.py create mode 100644 SpeechLM/speechlm/__init__.py create mode 100644 SpeechLM/speechlm/config/decode/infer_fsqlm.yaml create mode 100644 SpeechLM/speechlm/config/decode/infer_kenlm.yaml create mode 100644 SpeechLM/speechlm/config/decode/infer_viterbi.yaml create mode 100644 SpeechLM/speechlm/config/finetune/speechlm_base_100h.yaml create mode 100644 SpeechLM/speechlm/config/finetune/speechlm_large_960h.yaml create mode 100644 SpeechLM/speechlm/config/pretrain/speechlm_base_librispeech.yaml create mode 100644 SpeechLM/speechlm/config/pretrain/speechlm_large_librilight.yaml create mode 100644 SpeechLM/speechlm/config/pretrain/speechlmp_base_cfg.pt create mode 100644 SpeechLM/speechlm/criterions/__init__.py create mode 100644 SpeechLM/speechlm/criterions/fasttext2unit_loss.py create mode 100644 SpeechLM/speechlm/criterions/speechlm_criterion.py create mode 100644 SpeechLM/speechlm/data/concat_dataset.py create mode 100644 SpeechLM/speechlm/data/hubert_dataset.py create mode 100644 SpeechLM/speechlm/data/language_trible_dataset.py create mode 100644 SpeechLM/speechlm/data/load_langpair_dataset.py create mode 100644 SpeechLM/speechlm/data/multimodal_corpus_dataset.py create mode 100644 SpeechLM/speechlm/data/text_to_unit_dataset.py create mode 100644 SpeechLM/speechlm/data_process/covost2/mp3_to_wav.py create mode 100644 SpeechLM/speechlm/data_process/covost2/prepare_covost_data.py create mode 100644 SpeechLM/speechlm/data_process/filter_paireddata_by_len.py create mode 100644 SpeechLM/speechlm/data_process/get_t2u_manifest.py create mode 100644 SpeechLM/speechlm/data_process/get_t2u_manifest_textonly.py create mode 100644 SpeechLM/speechlm/data_process/phoneize_with_sil.py create mode 100644 SpeechLM/speechlm/data_process/phoneme_tokenizer/ltr2kaldi_phn_sil025.py create mode 100644 SpeechLM/speechlm/data_process/phoneme_tokenizer/mean5_and_std25_sil14_spn32.dict create mode 100644 SpeechLM/speechlm/data_process/phoneme_tokenizer/repeat_withou_insert_sil_less_4375.py create mode 100644 SpeechLM/speechlm/data_process/prepare_covost2_enxx.sh create mode 100644 SpeechLM/speechlm/data_process/prepare_phn2ltr_librilm.sh create mode 100644 SpeechLM/speechlm/data_process/txt2idx.sh create mode 100644 SpeechLM/speechlm/data_process/wrd2ltr.py create mode 100644 SpeechLM/speechlm/generate_unit.py create mode 100644 SpeechLM/speechlm/infer.py create mode 100644 SpeechLM/speechlm/models/__init__.py create mode 100644 SpeechLM/speechlm/models/fasttext2unit.py create mode 100644 SpeechLM/speechlm/models/speechlm.py create mode 100644 SpeechLM/speechlm/models/speechlm_ctcasr.py create mode 100644 SpeechLM/speechlm/models/speechlm_st.py create mode 100644 SpeechLM/speechlm/modules/__init__.py create mode 100644 SpeechLM/speechlm/modules/learned_positional_embedding.py create mode 100644 SpeechLM/speechlm/modules/multihead_attention.py create mode 100644 SpeechLM/speechlm/modules/relative_pos_enc.py create mode 100644 SpeechLM/speechlm/modules/transformer_decoder.py create mode 100644 SpeechLM/speechlm/modules/transformer_encoder.py create mode 100644 SpeechLM/speechlm/modules/transformer_layer.py create mode 100644 SpeechLM/speechlm/modules/w2v_encoder.py create mode 100644 SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmh.sh create mode 100644 SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmp.sh create mode 100644 SpeechLM/speechlm/scripts/pretrain_speechlm/large_speechlmp.sh create mode 100644 SpeechLM/speechlm/scripts/tokenizer_fastT2U/generate.sh create mode 100644 SpeechLM/speechlm/scripts/tokenizer_fastT2U/infer.sh create mode 100644 SpeechLM/speechlm/scripts/tokenizer_fastT2U/train_s_5e-4.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_base_ctc.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_large_ctc.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_kenlm.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large_fsqlm.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_st/ft_base_covost_enxx.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_st/ft_large_covost_enxx.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_st/inference_base.sh create mode 100644 SpeechLM/speechlm/scripts/tune_speechlm_st/inference_large.sh create mode 100644 SpeechLM/speechlm/tasks/fast_text_to_unit.py create mode 100644 SpeechLM/speechlm/tasks/joint_sc2t_pretrain.py create mode 100644 SpeechLM/speechlm/unit_generator.py create mode 100644 SpeechT5/README.md create mode 100644 SpeechT5/asr_train/train.ltr create mode 100644 SpeechT5/asr_train/train.tsv create mode 100644 SpeechT5/asr_train/train.txt create mode 100644 SpeechT5/asr_train/valid.ltr create mode 100644 SpeechT5/asr_train/valid.tsv create mode 100644 SpeechT5/asr_train/valid.txt create mode 100644 SpeechT5/fairseq/.github/ISSUE_TEMPLATE.md create mode 100644 SpeechT5/fairseq/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 SpeechT5/fairseq/.github/ISSUE_TEMPLATE/documentation.md create mode 100644 SpeechT5/fairseq/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 SpeechT5/fairseq/.github/ISSUE_TEMPLATE/how-to-question.md create mode 100644 SpeechT5/fairseq/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 SpeechT5/fairseq/.github/stale.yml create mode 100644 SpeechT5/fairseq/.github/workflows/build.yml create mode 100644 SpeechT5/fairseq/.github/workflows/build_wheels.yml create mode 100644 SpeechT5/fairseq/.gitignore create mode 100644 SpeechT5/fairseq/.gitmodules create mode 100644 SpeechT5/fairseq/CODE_OF_CONDUCT.md create mode 100644 SpeechT5/fairseq/CONTRIBUTING.md create mode 100644 SpeechT5/fairseq/LICENSE create mode 100644 SpeechT5/fairseq/README.md create mode 100644 SpeechT5/fairseq/docs/Makefile create mode 100644 SpeechT5/fairseq/docs/_static/theme_overrides.css create mode 100644 SpeechT5/fairseq/docs/command_line_tools.rst create mode 100644 SpeechT5/fairseq/docs/conf.py create mode 100644 SpeechT5/fairseq/docs/criterions.rst create mode 100644 SpeechT5/fairseq/docs/data.rst create mode 100644 SpeechT5/fairseq/docs/docutils.conf create mode 100644 SpeechT5/fairseq/docs/fairseq.gif create mode 100644 SpeechT5/fairseq/docs/fairseq_logo.png create mode 100644 SpeechT5/fairseq/docs/getting_started.rst create mode 100644 SpeechT5/fairseq/docs/hydra_integration.md create mode 100644 SpeechT5/fairseq/docs/index.rst create mode 100644 SpeechT5/fairseq/docs/lr_scheduler.rst create mode 100644 SpeechT5/fairseq/docs/make.bat create mode 100644 SpeechT5/fairseq/docs/models.rst create mode 100644 SpeechT5/fairseq/docs/modules.rst create mode 100644 SpeechT5/fairseq/docs/optim.rst create mode 100644 SpeechT5/fairseq/docs/overview.rst create mode 100644 SpeechT5/fairseq/docs/requirements.txt create mode 100644 SpeechT5/fairseq/docs/tasks.rst create mode 100644 SpeechT5/fairseq/docs/tutorial_classifying_names.rst create mode 100644 SpeechT5/fairseq/docs/tutorial_simple_lstm.rst create mode 100644 SpeechT5/fairseq/examples/.gitignore create mode 100644 SpeechT5/fairseq/examples/__init__.py create mode 100644 SpeechT5/fairseq/examples/adaptive_span/README.md create mode 100644 SpeechT5/fairseq/examples/adaptive_span/__init__.py create mode 100644 SpeechT5/fairseq/examples/adaptive_span/adagrad_with_grad_clip.py create mode 100644 SpeechT5/fairseq/examples/adaptive_span/adaptive_span_attention.py create mode 100644 SpeechT5/fairseq/examples/adaptive_span/adaptive_span_loss.py create mode 100644 SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model.py create mode 100644 SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model_wrapper.py create mode 100644 SpeechT5/fairseq/examples/adaptive_span/truncated_bptt_lm_task.py create mode 100644 SpeechT5/fairseq/examples/backtranslation/README.md create mode 100644 SpeechT5/fairseq/examples/backtranslation/deduplicate_lines.py create mode 100644 SpeechT5/fairseq/examples/backtranslation/extract_bt_data.py create mode 100644 SpeechT5/fairseq/examples/backtranslation/prepare-de-monolingual.sh create mode 100644 SpeechT5/fairseq/examples/backtranslation/prepare-wmt18en2de.sh create mode 100644 SpeechT5/fairseq/examples/backtranslation/sacrebleu.sh create mode 100644 SpeechT5/fairseq/examples/backtranslation/tokenized_bleu.sh create mode 100644 SpeechT5/fairseq/examples/bart/README.glue.md create mode 100644 SpeechT5/fairseq/examples/bart/README.md create mode 100644 SpeechT5/fairseq/examples/bart/README.summarization.md create mode 100644 SpeechT5/fairseq/examples/bart/summarize.py create mode 100644 SpeechT5/fairseq/examples/byte_level_bpe/README.md create mode 100644 SpeechT5/fairseq/examples/byte_level_bpe/get_bitext.py create mode 100644 SpeechT5/fairseq/examples/byte_level_bpe/get_data.sh create mode 100644 SpeechT5/fairseq/examples/byte_level_bpe/gru_transformer.py create mode 100644 SpeechT5/fairseq/examples/camembert/README.md create mode 100644 SpeechT5/fairseq/examples/constrained_decoding/README.md create mode 100644 SpeechT5/fairseq/examples/constrained_decoding/normalize.py create mode 100644 SpeechT5/fairseq/examples/constrained_decoding/tok.py create mode 100644 SpeechT5/fairseq/examples/conv_seq2seq/README.md create mode 100644 SpeechT5/fairseq/examples/criss/README.md create mode 100644 SpeechT5/fairseq/examples/criss/download_and_preprocess_flores_test.sh create mode 100644 SpeechT5/fairseq/examples/criss/download_and_preprocess_tatoeba.sh create mode 100644 SpeechT5/fairseq/examples/criss/mining/mine.py create mode 100644 SpeechT5/fairseq/examples/criss/mining/mine_example.sh create mode 100644 SpeechT5/fairseq/examples/criss/save_encoder.py create mode 100644 SpeechT5/fairseq/examples/criss/sentence_retrieval/encoder_analysis.py create mode 100644 SpeechT5/fairseq/examples/criss/sentence_retrieval/sentence_retrieval_tatoeba.sh create mode 100644 SpeechT5/fairseq/examples/criss/unsupervised_mt/eval.sh create mode 100644 SpeechT5/fairseq/examples/cross_lingual_language_model/README.md create mode 100644 SpeechT5/fairseq/examples/fast_noisy_channel/README.md create mode 100644 SpeechT5/fairseq/examples/fast_noisy_channel/__init__.py create mode 100644 SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_beam_search.py create mode 100644 SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_sequence_generator.py create mode 100644 SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_translation.py create mode 100644 SpeechT5/fairseq/examples/flores101/README.md create mode 100644 SpeechT5/fairseq/examples/flores101/flores_logo.png create mode 100644 SpeechT5/fairseq/examples/fully_sharded_data_parallel/README.md create mode 100644 SpeechT5/fairseq/examples/gottbert/README.md create mode 100644 SpeechT5/fairseq/examples/hubert/README.md create mode 100644 SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/ngram.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/transformer.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/decode/infer_fsqlm.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/decode/infer_kenlm.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/decode/infer_viterbi.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm_8gpu.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/finetune/base_10h.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/finetune/ckpt/it1.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/finetune/lm/ls_4gram.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/finetune/run/submitit_reg.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter1.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter2.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_base_librispeech.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_large_librivox.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_xlarge_librivox.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/config/pretrain/run/submitit_reg.yaml create mode 100644 SpeechT5/fairseq/examples/hubert/measure_teacher_quality.py create mode 100644 SpeechT5/fairseq/examples/hubert/simple_kmeans/README.md create mode 100644 SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature.py create mode 100644 SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature_s2t.py create mode 100644 SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_km_label.py create mode 100644 SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_mfcc_feature.py create mode 100644 SpeechT5/fairseq/examples/hubert/simple_kmeans/learn_kmeans.py create mode 100644 SpeechT5/fairseq/examples/hubert/update_ckpt.py create mode 100644 SpeechT5/fairseq/examples/joint_alignment_translation/README.md create mode 100644 SpeechT5/fairseq/examples/joint_alignment_translation/prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh create mode 100644 SpeechT5/fairseq/examples/language_model/README.adaptive_inputs.md create mode 100644 SpeechT5/fairseq/examples/language_model/README.conv.md create mode 100644 SpeechT5/fairseq/examples/language_model/README.md create mode 100644 SpeechT5/fairseq/examples/language_model/prepare-wikitext-103.sh create mode 100644 SpeechT5/fairseq/examples/laser/README.md create mode 100644 SpeechT5/fairseq/examples/laser/laser_src/__init__.py create mode 100644 SpeechT5/fairseq/examples/laser/laser_src/laser_lstm.py create mode 100644 SpeechT5/fairseq/examples/laser/laser_src/laser_task.py create mode 100644 SpeechT5/fairseq/examples/laser/laser_src/laser_transformer.py create mode 100644 SpeechT5/fairseq/examples/laser/laser_src/multitask_data_utils.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/README.md create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/__init__.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/loss/__init__.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/loss/latent_depth.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/__init__.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_multilingual_transformer.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_transformer.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/modules/__init__.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/modules/latent_layers.py create mode 100644 SpeechT5/fairseq/examples/latent_depth/latent_depth_src/multilingual_translation_latent_depth.py create mode 100644 SpeechT5/fairseq/examples/layerdrop/README.md create mode 100644 SpeechT5/fairseq/examples/linformer/README.md create mode 100644 SpeechT5/fairseq/examples/linformer/linformer_src/__init__.py create mode 100644 SpeechT5/fairseq/examples/linformer/linformer_src/models/__init__.py create mode 100644 SpeechT5/fairseq/examples/linformer/linformer_src/models/linformer_roberta.py create mode 100644 SpeechT5/fairseq/examples/linformer/linformer_src/modules/__init__.py create mode 100644 SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder.py create mode 100644 SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder_layer.py create mode 100644 SpeechT5/fairseq/examples/linformer/linformer_src/modules/multihead_linear_attention.py create mode 100644 SpeechT5/fairseq/examples/m2m_100/README.md create mode 100644 SpeechT5/fairseq/examples/m2m_100/install_dependecies.sh create mode 100644 SpeechT5/fairseq/examples/m2m_100/process_data/clean_histogram.py create mode 100644 SpeechT5/fairseq/examples/m2m_100/process_data/dedup_data.py create mode 100644 SpeechT5/fairseq/examples/m2m_100/process_data/remove_too_much_punc.py create mode 100644 SpeechT5/fairseq/examples/m2m_100/tok.sh create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/README.md create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ja.sh create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ko.sh create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/thirdparty/.gitignore create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_indic.py create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_thai.py create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_zh.py create mode 100644 SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenizer_ar.sh create mode 100644 SpeechT5/fairseq/examples/mbart/README.md create mode 100644 SpeechT5/fairseq/examples/megatron_11b/README.md create mode 100644 SpeechT5/fairseq/examples/megatron_11b/detok.py create mode 100644 SpeechT5/fairseq/examples/multilingual/ML50_langs.txt create mode 100644 SpeechT5/fairseq/examples/multilingual/README.md create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/README.md create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/binarize.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/check_iswlt_test_data.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/check_self_overlaps.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/check_valid_test_overlaps.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/dedup_all.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_ML50_v1.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_af_xh.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_flores_data.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_iitb.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_iwslt_and_extract.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_lotus.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_ted_and_extract.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_wat19_my.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt19_and_before.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt20.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/preprocess_ML50_v1.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/remove_valid_test_in_train.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/requirement.txt create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/utils/dedup.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/utils/fasttext_multi_filter.py create mode 100644 SpeechT5/fairseq/examples/multilingual/data_scripts/utils/strip_sgm.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/finetune_multilingual_model.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/multilingual_fairseq_gen.sh create mode 100644 SpeechT5/fairseq/examples/multilingual/train_multilingual_model.sh create mode 100644 SpeechT5/fairseq/examples/noisychannel/README.md create mode 100644 SpeechT5/fairseq/examples/noisychannel/__init__.py create mode 100644 SpeechT5/fairseq/examples/noisychannel/rerank.py create mode 100644 SpeechT5/fairseq/examples/noisychannel/rerank_generate.py create mode 100644 SpeechT5/fairseq/examples/noisychannel/rerank_options.py create mode 100644 SpeechT5/fairseq/examples/noisychannel/rerank_score_bw.py create mode 100644 SpeechT5/fairseq/examples/noisychannel/rerank_score_lm.py create mode 100644 SpeechT5/fairseq/examples/noisychannel/rerank_tune.py create mode 100644 SpeechT5/fairseq/examples/noisychannel/rerank_utils.py create mode 100644 SpeechT5/fairseq/examples/nonautoregressive_translation/README.md create mode 100644 SpeechT5/fairseq/examples/nonautoregressive_translation/scripts.md create mode 100644 SpeechT5/fairseq/examples/paraphraser/README.md create mode 100644 SpeechT5/fairseq/examples/paraphraser/paraphrase.py create mode 100644 SpeechT5/fairseq/examples/pay_less_attention_paper/README.md create mode 100644 SpeechT5/fairseq/examples/pointer_generator/README.md create mode 100644 SpeechT5/fairseq/examples/pointer_generator/README.xsum.md create mode 100644 SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/__init__.py create mode 100644 SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/transformer_pg.py create mode 100644 SpeechT5/fairseq/examples/pointer_generator/postprocess.py create mode 100644 SpeechT5/fairseq/examples/pointer_generator/preprocess.py create mode 100644 SpeechT5/fairseq/examples/quant_noise/README.md create mode 100644 SpeechT5/fairseq/examples/quant_noise/transformer_quantization_config.yaml create mode 100644 SpeechT5/fairseq/examples/roberta/README.custom_classification.md create mode 100644 SpeechT5/fairseq/examples/roberta/README.glue.md create mode 100644 SpeechT5/fairseq/examples/roberta/README.md create mode 100644 SpeechT5/fairseq/examples/roberta/README.pretraining.md create mode 100644 SpeechT5/fairseq/examples/roberta/README.race.md create mode 100644 SpeechT5/fairseq/examples/roberta/commonsense_qa/README.md create mode 100644 SpeechT5/fairseq/examples/roberta/commonsense_qa/__init__.py create mode 100644 SpeechT5/fairseq/examples/roberta/commonsense_qa/commonsense_qa_task.py create mode 100644 SpeechT5/fairseq/examples/roberta/commonsense_qa/download_cqa_data.sh create mode 100644 SpeechT5/fairseq/examples/roberta/multiprocessing_bpe_encoder.py create mode 100644 SpeechT5/fairseq/examples/roberta/preprocess_GLUE_tasks.sh create mode 100644 SpeechT5/fairseq/examples/roberta/preprocess_RACE.py create mode 100644 SpeechT5/fairseq/examples/roberta/preprocess_RACE.sh create mode 100644 SpeechT5/fairseq/examples/roberta/wsc/README.md create mode 100644 SpeechT5/fairseq/examples/roberta/wsc/__init__.py create mode 100644 SpeechT5/fairseq/examples/roberta/wsc/wsc_criterion.py create mode 100644 SpeechT5/fairseq/examples/roberta/wsc/wsc_task.py create mode 100644 SpeechT5/fairseq/examples/roberta/wsc/wsc_utils.py create mode 100644 SpeechT5/fairseq/examples/rxf/README.md create mode 100644 SpeechT5/fairseq/examples/rxf/__init__.py create mode 100644 SpeechT5/fairseq/examples/rxf/rxf_src/__init__.py create mode 100644 SpeechT5/fairseq/examples/rxf/rxf_src/label_smoothed_cross_entropy_r3f.py create mode 100644 SpeechT5/fairseq/examples/rxf/rxf_src/sentence_prediction_r3f.py create mode 100644 SpeechT5/fairseq/examples/scaling_nmt/README.md create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/README.md create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/__init__.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/docs/ende-mma.md create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/docs/enja-waitk.md create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/eval/agents/simul_t2t_enja.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/models/__init__.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/models/convtransformer_simul_trans.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/models/transformer_monotonic_attention.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/modules/__init__.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/modules/fixed_pre_decision.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_multihead_attention.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_transformer_layer.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/utils/__init__.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/utils/data_utils.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/utils/functions.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/utils/latency.py create mode 100644 SpeechT5/fairseq/examples/simultaneous_translation/utils/p_choose_strategy.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/README.md create mode 100644 SpeechT5/fairseq/examples/speech_recognition/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/criterions/ASG_loss.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/criterions/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/criterions/cross_entropy_acc.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/data/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/data/asr_dataset.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/data/collaters.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/data/data_utils.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/data/replabels.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/datasets/asr_prep_json.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/datasets/prepare-librispeech.sh create mode 100644 SpeechT5/fairseq/examples/speech_recognition/infer.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/kaldi/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/kaldi/add-self-loop-simple.cc create mode 100644 SpeechT5/fairseq/examples/speech_recognition/kaldi/config/kaldi_initializer.yaml create mode 100644 SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_decoder.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_initializer.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/models/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/models/vggtransformer.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/models/w2l_conv_glu_enc.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/README.md create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/conf/hydra/sweeper/ax.yaml create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/conf/infer.yaml create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/decoders/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/decoders/base_decoder.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder_config.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/decoders/flashlight_decoder.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/decoders/viterbi_decoder.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/new/infer.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/tasks/__init__.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/tasks/speech_recognition.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/utils/wer_utils.py create mode 100644 SpeechT5/fairseq/examples/speech_recognition/w2l_decoder.py create mode 100644 SpeechT5/fairseq/examples/speech_to_text/README.md create mode 100644 SpeechT5/fairseq/examples/speech_to_text/data_utils.py create mode 100644 SpeechT5/fairseq/examples/speech_to_text/docs/covost_example.md create mode 100644 SpeechT5/fairseq/examples/speech_to_text/docs/librispeech_example.md create mode 100644 SpeechT5/fairseq/examples/speech_to_text/docs/mtedx_example.md create mode 100644 SpeechT5/fairseq/examples/speech_to_text/docs/mustc_example.md create mode 100644 SpeechT5/fairseq/examples/speech_to_text/docs/simulst_mustc_example.md create mode 100644 SpeechT5/fairseq/examples/speech_to_text/prep_covost_data.py create mode 100644 SpeechT5/fairseq/examples/speech_to_text/prep_librispeech_data.py create mode 100644 SpeechT5/fairseq/examples/speech_to_text/prep_mtedx_data.py create mode 100644 SpeechT5/fairseq/examples/speech_to_text/prep_mustc_data.py create mode 100644 SpeechT5/fairseq/examples/speech_to_text/seg_mustc_data.py create mode 100644 SpeechT5/fairseq/examples/speech_to_text/simultaneous_translation/agents/fairseq_simul_st_agent.py create mode 100644 SpeechT5/fairseq/examples/stories/README.md create mode 100644 SpeechT5/fairseq/examples/translation/README.md create mode 100644 SpeechT5/fairseq/examples/translation/prepare-iwslt14.sh create mode 100644 SpeechT5/fairseq/examples/translation/prepare-iwslt17-multilingual.sh create mode 100644 SpeechT5/fairseq/examples/translation/prepare-wmt14en2de.sh create mode 100644 SpeechT5/fairseq/examples/translation/prepare-wmt14en2fr.sh create mode 100644 SpeechT5/fairseq/examples/translation_moe/README.md create mode 100644 SpeechT5/fairseq/examples/translation_moe/score.py create mode 100644 SpeechT5/fairseq/examples/translation_moe/translation_moe_src/__init__.py create mode 100644 SpeechT5/fairseq/examples/translation_moe/translation_moe_src/logsumexp_moe.py create mode 100644 SpeechT5/fairseq/examples/translation_moe/translation_moe_src/mean_pool_gating_network.py create mode 100644 SpeechT5/fairseq/examples/translation_moe/translation_moe_src/translation_moe.py create mode 100644 SpeechT5/fairseq/examples/truncated_bptt/README.md create mode 100644 SpeechT5/fairseq/examples/truncated_bptt/__init__.py create mode 100644 SpeechT5/fairseq/examples/truncated_bptt/transformer_xl_model.py create mode 100644 SpeechT5/fairseq/examples/truncated_bptt/truncated_bptt_lm_task.py create mode 100644 SpeechT5/fairseq/examples/unsupervised_quality_estimation/README.md create mode 100644 SpeechT5/fairseq/examples/unsupervised_quality_estimation/aggregate_scores.py create mode 100644 SpeechT5/fairseq/examples/unsupervised_quality_estimation/meteor.py create mode 100644 SpeechT5/fairseq/examples/unsupervised_quality_estimation/repeat_lines.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/README.md create mode 100644 SpeechT5/fairseq/examples/wav2vec/__init__.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_100h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10m.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_1h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_960h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_100h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10m.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_1h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_960h.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_base_librispeech.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu-pod.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/libri_labels.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/scripts/binarize_manifest.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/README.md create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/__init__.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/finetuning/w2v_finetune.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/gan/w2vu.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/generate/viterbi.yaml create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/test.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train_text.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/valid.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/test.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train_text.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/valid.uid create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/data/__init__.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/data/extracted_features_dataset.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/data/random_input_dataset.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/README.md create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/cmd.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_phone.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step1.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step2.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/copy_aligned_text.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/decode.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_data_from_w2v.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang_word.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lm.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/score.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/show_wer.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/train_subset_lgbeam.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode_word.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/path.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_deltas.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_lda_mllt.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_sat.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/train.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/models/__init__.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/models/wav2vec_u.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/apply_pca.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/copy_labels.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_lexicon.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_tsv.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/g2p_wrd_to_phn.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/ltr_to_wrd.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/mean_pool.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/merge_clusters.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_and_filter_text.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_text.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/pca.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/phonemize_with_sil.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_audio.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_text.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_timit.sh create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/remove_silence.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/vads.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_apply_cluster_faiss.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_cluster_faiss.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_extract_features.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wer.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wrd_to_ltr.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/__init__.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/unpaired_audio_text.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/unsupervised/w2vu_generate.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/vq-wav2vec_featurize.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/wav2vec_featurize.py create mode 100644 SpeechT5/fairseq/examples/wav2vec/wav2vec_manifest.py create mode 100644 SpeechT5/fairseq/examples/wmt19/README.md create mode 100644 SpeechT5/fairseq/examples/wmt20/README.md create mode 100644 SpeechT5/fairseq/examples/xlmr/README.md create mode 100644 SpeechT5/fairseq/fairseq/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/benchmark/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/benchmark/dummy_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/benchmark/dummy_lm.py create mode 100644 SpeechT5/fairseq/fairseq/benchmark/dummy_masked_lm.py create mode 100644 SpeechT5/fairseq/fairseq/benchmark/dummy_model.py create mode 100644 SpeechT5/fairseq/fairseq/benchmark/dummy_mt.py create mode 100644 SpeechT5/fairseq/fairseq/binarizer.py create mode 100644 SpeechT5/fairseq/fairseq/checkpoint_utils.py create mode 100644 SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda.cpp create mode 100644 SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda_kernel.cu create mode 100644 SpeechT5/fairseq/fairseq/clib/libbase/balanced_assignment.cpp create mode 100644 SpeechT5/fairseq/fairseq/clib/libbleu/libbleu.cpp create mode 100644 SpeechT5/fairseq/fairseq/clib/libbleu/module.cpp create mode 100644 SpeechT5/fairseq/fairseq/clib/libnat/edit_dist.cpp create mode 100644 SpeechT5/fairseq/fairseq/clib/libnat_cuda/binding.cpp create mode 100644 SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.cu create mode 100644 SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.h create mode 100644 SpeechT5/fairseq/fairseq/config/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/config/config.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_gbw.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_wiki103.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_big.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gbw.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_big.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_medium.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_small.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_wiki103.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/wav2vec/vq_wav2vec_gumbel.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_base.yaml create mode 100644 SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_large.yaml create mode 100644 SpeechT5/fairseq/fairseq/criterions/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/adaptive_loss.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/composite_loss.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/cross_entropy.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/ctc.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/fairseq_criterion.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/hubert_criterion.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_latency_augmented.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_with_alignment.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/legacy_masked_lm.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/masked_lm.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/model_criterion.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/nat_loss.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/sentence_prediction.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/sentence_ranking.py create mode 100644 SpeechT5/fairseq/fairseq/criterions/wav2vec_criterion.py create mode 100644 SpeechT5/fairseq/fairseq/data/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/data/add_target_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/append_token_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/audio_utils.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/feature_transforms/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/feature_transforms/global_cmvn.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/feature_transforms/specaugment.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/feature_transforms/utterance_cmvn.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/hubert_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/raw_audio_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/audio/speech_to_text_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/backtranslation_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/base_wrapper_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/bucket_pad_length_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/colorize_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/concat_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/concat_sentences_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/data_utils.py create mode 100644 SpeechT5/fairseq/fairseq/data/data_utils_fast.pyx create mode 100644 SpeechT5/fairseq/fairseq/data/denoising_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/dictionary.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/byte_bpe.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/byte_utils.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/bytes.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/characters.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/fastbpe.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe_utils.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/hf_bert_bpe.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/hf_byte_bpe.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/moses_tokenizer.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/nltk_tokenizer.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/sentencepiece_bpe.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/space_tokenizer.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/subword_nmt_bpe.py create mode 100644 SpeechT5/fairseq/fairseq/data/encoders/utils.py create mode 100644 SpeechT5/fairseq/fairseq/data/fairseq_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/fasta_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/id_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/indexed_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/iterators.py create mode 100644 SpeechT5/fairseq/fairseq/data/language_pair_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/legacy/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/data/legacy/block_pair_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dictionary.py create mode 100644 SpeechT5/fairseq/fairseq/data/list_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/lm_context_window_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/lru_cache_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/mask_tokens_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/monolingual_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/multi_corpus_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/multi_corpus_sampled_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/multilingual/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/data/multilingual/multilingual_data_manager.py create mode 100644 SpeechT5/fairseq/fairseq/data/multilingual/multilingual_utils.py create mode 100644 SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_epoch_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/multilingual/sampling_method.py create mode 100644 SpeechT5/fairseq/fairseq/data/nested_dictionary_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/noising.py create mode 100644 SpeechT5/fairseq/fairseq/data/num_samples_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/numel_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/offset_tokens_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/pad_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/plasma_utils.py create mode 100644 SpeechT5/fairseq/fairseq/data/prepend_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/prepend_token_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/raw_label_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/replace_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/resampling_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/roll_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/round_robin_zip_datasets.py create mode 100644 SpeechT5/fairseq/fairseq/data/shorten_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/sort_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/strip_token_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/subsample_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/token_block_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/token_block_utils_fast.pyx create mode 100644 SpeechT5/fairseq/fairseq/data/transform_eos_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/data/transform_eos_lang_pair_dataset.py create mode 100644 SpeechT5/fairseq/fairseq/dataclass/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/dataclass/configs.py create mode 100644 SpeechT5/fairseq/fairseq/dataclass/constants.py create mode 100644 SpeechT5/fairseq/fairseq/dataclass/initialize.py create mode 100644 SpeechT5/fairseq/fairseq/dataclass/utils.py create mode 100644 SpeechT5/fairseq/fairseq/distributed/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/distributed/distributed_timeout_wrapper.py create mode 100644 SpeechT5/fairseq/fairseq/distributed/fully_sharded_data_parallel.py create mode 100644 SpeechT5/fairseq/fairseq/distributed/legacy_distributed_data_parallel.py create mode 100644 SpeechT5/fairseq/fairseq/distributed/module_proxy_wrapper.py create mode 100644 SpeechT5/fairseq/fairseq/distributed/tpu_distributed_data_parallel.py create mode 100644 SpeechT5/fairseq/fairseq/distributed/utils.py create mode 100644 SpeechT5/fairseq/fairseq/file_io.py create mode 100644 SpeechT5/fairseq/fairseq/file_utils.py create mode 100644 SpeechT5/fairseq/fairseq/hub_utils.py create mode 100644 SpeechT5/fairseq/fairseq/incremental_decoding_utils.py create mode 100644 SpeechT5/fairseq/fairseq/iterative_refinement_generator.py create mode 100644 SpeechT5/fairseq/fairseq/logging/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/logging/meters.py create mode 100644 SpeechT5/fairseq/fairseq/logging/metrics.py create mode 100644 SpeechT5/fairseq/fairseq/logging/progress_bar.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/criterions/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/criterions/vocab_parallel_cross_entropy.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/megatron_trainer.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/layers.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/model.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/roberta/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/roberta/model.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/transformer.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/models/transformer_lm.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/modules/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/modules/multihead_attention.py create mode 100644 SpeechT5/fairseq/fairseq/model_parallel/modules/transformer_layer.py create mode 100644 SpeechT5/fairseq/fairseq/models/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/bart/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/bart/hub_interface.py create mode 100644 SpeechT5/fairseq/fairseq/models/bart/model.py create mode 100644 SpeechT5/fairseq/fairseq/models/composite_encoder.py create mode 100644 SpeechT5/fairseq/fairseq/models/distributed_fairseq_model.py create mode 100644 SpeechT5/fairseq/fairseq/models/fairseq_decoder.py create mode 100644 SpeechT5/fairseq/fairseq/models/fairseq_encoder.py create mode 100644 SpeechT5/fairseq/fairseq/models/fairseq_incremental_decoder.py create mode 100644 SpeechT5/fairseq/fairseq/models/fairseq_model.py create mode 100644 SpeechT5/fairseq/fairseq/models/fconv.py create mode 100644 SpeechT5/fairseq/fairseq/models/fconv_lm.py create mode 100644 SpeechT5/fairseq/fairseq/models/fconv_self_att.py create mode 100644 SpeechT5/fairseq/fairseq/models/hubert/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/hubert/hubert.py create mode 100644 SpeechT5/fairseq/fairseq/models/hubert/hubert_asr.py create mode 100644 SpeechT5/fairseq/fairseq/models/huggingface/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/huggingface/hf_gpt2.py create mode 100644 SpeechT5/fairseq/fairseq/models/lightconv.py create mode 100644 SpeechT5/fairseq/fairseq/models/lightconv_lm.py create mode 100644 SpeechT5/fairseq/fairseq/models/lstm.py create mode 100644 SpeechT5/fairseq/fairseq/models/lstm_lm.py create mode 100644 SpeechT5/fairseq/fairseq/models/masked_lm.py create mode 100644 SpeechT5/fairseq/fairseq/models/model_utils.py create mode 100644 SpeechT5/fairseq/fairseq/models/multilingual_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/cmlm_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/fairseq_nat_model.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/insertion_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/iterative_nonautoregressive_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/levenshtein_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/levenshtein_utils.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/nat_crf_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_ensembles.py create mode 100644 SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/alignment_utils.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/enc_dec.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/hub_interface.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/model.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/model_camembert.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/model_gottbert.py create mode 100644 SpeechT5/fairseq/fairseq/models/roberta/model_xlmr.py create mode 100644 SpeechT5/fairseq/fairseq/models/speech_to_text/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/speech_to_text/berard.py create mode 100644 SpeechT5/fairseq/fairseq/models/speech_to_text/convtransformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/speech_to_text/modules/augmented_memory_attention.py create mode 100644 SpeechT5/fairseq/fairseq/models/speech_to_text/modules/emformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/speech_to_text/s2t_transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/speech_to_text/utils.py create mode 100644 SpeechT5/fairseq/fairseq/models/transformer.py create mode 100644 SpeechT5/fairseq/fairseq/models/transformer_align.py create mode 100644 SpeechT5/fairseq/fairseq/models/transformer_from_pretrained_xlm.py create mode 100644 SpeechT5/fairseq/fairseq/models/transformer_lm.py create mode 100644 SpeechT5/fairseq/fairseq/models/wav2vec/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec.py create mode 100644 SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2.py create mode 100644 SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2_asr.py create mode 100644 SpeechT5/fairseq/fairseq/modules/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/adaptive_input.py create mode 100644 SpeechT5/fairseq/fairseq/modules/adaptive_softmax.py create mode 100644 SpeechT5/fairseq/fairseq/modules/base_layer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/beamable_mm.py create mode 100644 SpeechT5/fairseq/fairseq/modules/character_token_embedder.py create mode 100644 SpeechT5/fairseq/fairseq/modules/checkpoint_activations.py create mode 100644 SpeechT5/fairseq/fairseq/modules/conv_tbc.py create mode 100644 SpeechT5/fairseq/fairseq/modules/cross_entropy.py create mode 100644 SpeechT5/fairseq/fairseq/modules/cuda_utils.cu create mode 100644 SpeechT5/fairseq/fairseq/modules/downsampled_multihead_attention.py create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamic_convolution.py create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamic_crf_layer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/cuda_function_gen.py create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cpp create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cuh create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda_kernel.cu create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_layer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamiconv_cpu.cpp create mode 100644 SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/setup.py create mode 100644 SpeechT5/fairseq/fairseq/modules/fairseq_dropout.py create mode 100644 SpeechT5/fairseq/fairseq/modules/fp32_group_norm.py create mode 100644 SpeechT5/fairseq/fairseq/modules/gelu.py create mode 100644 SpeechT5/fairseq/fairseq/modules/grad_multiply.py create mode 100644 SpeechT5/fairseq/fairseq/modules/gumbel_vector_quantizer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/kmeans_attention.py create mode 100644 SpeechT5/fairseq/fairseq/modules/kmeans_vector_quantizer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/layer_drop.py create mode 100644 SpeechT5/fairseq/fairseq/modules/layer_norm.py create mode 100644 SpeechT5/fairseq/fairseq/modules/learned_positional_embedding.py create mode 100644 SpeechT5/fairseq/fairseq/modules/lightconv_layer/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/lightconv_layer/cuda_function_gen.py create mode 100644 SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cpp create mode 100644 SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cuh create mode 100644 SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda_kernel.cu create mode 100644 SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_layer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/lightconv_layer/setup.py create mode 100644 SpeechT5/fairseq/fairseq/modules/lightweight_convolution.py create mode 100644 SpeechT5/fairseq/fairseq/modules/linearized_convolution.py create mode 100644 SpeechT5/fairseq/fairseq/modules/multihead_attention.py create mode 100644 SpeechT5/fairseq/fairseq/modules/positional_embedding.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quant_noise.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/em.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qconv.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qemb.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qlinear.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/pq.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/pq/utils.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/quantization_options.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qact.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qconv.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qemb.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qlinear.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/ops.py create mode 100644 SpeechT5/fairseq/fairseq/modules/quantization/scalar/utils.py create mode 100644 SpeechT5/fairseq/fairseq/modules/same_pad.py create mode 100644 SpeechT5/fairseq/fairseq/modules/scalar_bias.py create mode 100644 SpeechT5/fairseq/fairseq/modules/sinusoidal_positional_embedding.py create mode 100644 SpeechT5/fairseq/fairseq/modules/sparse_multihead_attention.py create mode 100644 SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder.py create mode 100644 SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder_layer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/transformer_layer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder.py create mode 100644 SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder_layer.py create mode 100644 SpeechT5/fairseq/fairseq/modules/transpose_last.py create mode 100644 SpeechT5/fairseq/fairseq/modules/unfold.py create mode 100644 SpeechT5/fairseq/fairseq/modules/vggblock.py create mode 100644 SpeechT5/fairseq/fairseq/nan_detector.py create mode 100644 SpeechT5/fairseq/fairseq/ngram_repeat_block.py create mode 100644 SpeechT5/fairseq/fairseq/optim/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/optim/adadelta.py create mode 100644 SpeechT5/fairseq/fairseq/optim/adafactor.py create mode 100644 SpeechT5/fairseq/fairseq/optim/adagrad.py create mode 100644 SpeechT5/fairseq/fairseq/optim/adam.py create mode 100644 SpeechT5/fairseq/fairseq/optim/adamax.py create mode 100644 SpeechT5/fairseq/fairseq/optim/amp_optimizer.py create mode 100644 SpeechT5/fairseq/fairseq/optim/bmuf.py create mode 100644 SpeechT5/fairseq/fairseq/optim/composite.py create mode 100644 SpeechT5/fairseq/fairseq/optim/cpu_adam.py create mode 100644 SpeechT5/fairseq/fairseq/optim/dynamic_loss_scaler.py create mode 100644 SpeechT5/fairseq/fairseq/optim/fairseq_optimizer.py create mode 100644 SpeechT5/fairseq/fairseq/optim/fp16_optimizer.py create mode 100644 SpeechT5/fairseq/fairseq/optim/fused_adam.py create mode 100644 SpeechT5/fairseq/fairseq/optim/fused_lamb.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/cosine_lr_scheduler.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/fairseq_lr_scheduler.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/fixed_schedule.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/inverse_square_root_schedule.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/manual_lr_scheduler.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/pass_through.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/polynomial_decay_schedule.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/reduce_lr_on_plateau.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/tri_stage_lr_scheduler.py create mode 100644 SpeechT5/fairseq/fairseq/optim/lr_scheduler/triangular_lr_scheduler.py create mode 100644 SpeechT5/fairseq/fairseq/optim/nag.py create mode 100644 SpeechT5/fairseq/fairseq/optim/sgd.py create mode 100644 SpeechT5/fairseq/fairseq/optim/shard.py create mode 100644 SpeechT5/fairseq/fairseq/options.py create mode 100644 SpeechT5/fairseq/fairseq/pdb.py create mode 100644 SpeechT5/fairseq/fairseq/quantization_utils.py create mode 100644 SpeechT5/fairseq/fairseq/registry.py create mode 100644 SpeechT5/fairseq/fairseq/scoring/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/scoring/bleu.py create mode 100644 SpeechT5/fairseq/fairseq/scoring/chrf.py create mode 100644 SpeechT5/fairseq/fairseq/scoring/tokenizer.py create mode 100644 SpeechT5/fairseq/fairseq/scoring/wer.py create mode 100644 SpeechT5/fairseq/fairseq/search.py create mode 100644 SpeechT5/fairseq/fairseq/sequence_generator.py create mode 100644 SpeechT5/fairseq/fairseq/sequence_scorer.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/__init__.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/audio_pretraining.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/cross_lingual_lm.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/denoising.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/fairseq_task.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/hubert_pretraining.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/language_modeling.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/legacy_masked_lm.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/masked_lm.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/multilingual_denoising.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/multilingual_masked_lm.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/multilingual_translation.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/online_backtranslation.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/semisupervised_translation.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/sentence_prediction.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/sentence_ranking.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/simultaneous_translation.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/speech_to_text.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/translation.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_bart.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_xlm.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/translation_lev.py create mode 100644 SpeechT5/fairseq/fairseq/tasks/translation_multi_simple_epoch.py create mode 100644 SpeechT5/fairseq/fairseq/token_generation_constraints.py create mode 100644 SpeechT5/fairseq/fairseq/tokenizer.py create mode 100644 SpeechT5/fairseq/fairseq/trainer.py create mode 100644 SpeechT5/fairseq/fairseq/utils.py create mode 100644 SpeechT5/fairseq/fairseq/version.txt create mode 100644 SpeechT5/fairseq/fairseq_cli/__init__.py create mode 100644 SpeechT5/fairseq/fairseq_cli/eval_lm.py create mode 100644 SpeechT5/fairseq/fairseq_cli/generate.py create mode 100644 SpeechT5/fairseq/fairseq_cli/hydra_train.py create mode 100644 SpeechT5/fairseq/fairseq_cli/interactive.py create mode 100644 SpeechT5/fairseq/fairseq_cli/preprocess.py create mode 100644 SpeechT5/fairseq/fairseq_cli/score.py create mode 100644 SpeechT5/fairseq/fairseq_cli/train.py create mode 100644 SpeechT5/fairseq/fairseq_cli/validate.py create mode 100644 SpeechT5/fairseq/hubconf.py create mode 100644 SpeechT5/fairseq/pyproject.toml create mode 100644 SpeechT5/fairseq/scripts/__init__.py create mode 100644 SpeechT5/fairseq/scripts/average_checkpoints.py create mode 100644 SpeechT5/fairseq/scripts/build_sym_alignment.py create mode 100644 SpeechT5/fairseq/scripts/compare_namespaces.py create mode 100644 SpeechT5/fairseq/scripts/compound_split_bleu.sh create mode 100644 SpeechT5/fairseq/scripts/constraints/extract.py create mode 100644 SpeechT5/fairseq/scripts/constraints/validate.py create mode 100644 SpeechT5/fairseq/scripts/convert_dictionary.lua create mode 100644 SpeechT5/fairseq/scripts/convert_model.lua create mode 100644 SpeechT5/fairseq/scripts/count_docs.py create mode 100644 SpeechT5/fairseq/scripts/read_binarized.py create mode 100644 SpeechT5/fairseq/scripts/rm_pt.py create mode 100644 SpeechT5/fairseq/scripts/sacrebleu.sh create mode 100644 SpeechT5/fairseq/scripts/shard_docs.py create mode 100644 SpeechT5/fairseq/scripts/split_train_valid_docs.py create mode 100644 SpeechT5/fairseq/scripts/spm_decode.py create mode 100644 SpeechT5/fairseq/scripts/spm_encode.py create mode 100644 SpeechT5/fairseq/scripts/spm_train.py create mode 100644 SpeechT5/fairseq/scripts/test_fsdp.sh create mode 100644 SpeechT5/fairseq/setup.py create mode 100644 SpeechT5/fairseq/tests/__init__.py create mode 100644 SpeechT5/fairseq/tests/distributed/__init__.py create mode 100644 SpeechT5/fairseq/tests/distributed/test_bmuf.py create mode 100644 SpeechT5/fairseq/tests/distributed/test_distributed_timeout_wrapper.py create mode 100644 SpeechT5/fairseq/tests/distributed/test_module_proxy_wrapper.py create mode 100644 SpeechT5/fairseq/tests/distributed/test_utils.py create mode 100644 SpeechT5/fairseq/tests/distributed/utils.py create mode 100644 SpeechT5/fairseq/tests/gpu/__init__.py create mode 100644 SpeechT5/fairseq/tests/gpu/test_binaries_gpu.py create mode 100644 SpeechT5/fairseq/tests/gpu/transformer_quantization_config.yaml create mode 100644 SpeechT5/fairseq/tests/speech_recognition/__init__.py create mode 100644 SpeechT5/fairseq/tests/speech_recognition/asr_test_base.py create mode 100644 SpeechT5/fairseq/tests/speech_recognition/test_collaters.py create mode 100644 SpeechT5/fairseq/tests/speech_recognition/test_cross_entropy.py create mode 100644 SpeechT5/fairseq/tests/speech_recognition/test_data_utils.py create mode 100644 SpeechT5/fairseq/tests/speech_recognition/test_vggtransformer.py create mode 100644 SpeechT5/fairseq/tests/test_activation_checkpointing.py create mode 100644 SpeechT5/fairseq/tests/test_amp_optimizer.py create mode 100644 SpeechT5/fairseq/tests/test_average_checkpoints.py create mode 100644 SpeechT5/fairseq/tests/test_backtranslation_dataset.py create mode 100644 SpeechT5/fairseq/tests/test_binaries.py create mode 100644 SpeechT5/fairseq/tests/test_character_token_embedder.py create mode 100644 SpeechT5/fairseq/tests/test_checkpoint_utils.py create mode 100644 SpeechT5/fairseq/tests/test_concat_dataset.py create mode 100644 SpeechT5/fairseq/tests/test_constraints.py create mode 100644 SpeechT5/fairseq/tests/test_convtbc.py create mode 100644 SpeechT5/fairseq/tests/test_data_utils.py create mode 100644 SpeechT5/fairseq/tests/test_dataset.py create mode 100644 SpeechT5/fairseq/tests/test_dictionary.py create mode 100644 SpeechT5/fairseq/tests/test_export.py create mode 100644 SpeechT5/fairseq/tests/test_file_io.py create mode 100644 SpeechT5/fairseq/tests/test_fp16_optimizer.py create mode 100644 SpeechT5/fairseq/tests/test_inference_dropout.py create mode 100644 SpeechT5/fairseq/tests/test_iopath.py create mode 100644 SpeechT5/fairseq/tests/test_iterators.py create mode 100644 SpeechT5/fairseq/tests/test_label_smoothing.py create mode 100644 SpeechT5/fairseq/tests/test_lm_context_window.py create mode 100644 SpeechT5/fairseq/tests/test_lstm_jitable.py create mode 100644 SpeechT5/fairseq/tests/test_memory_efficient_fp16.py create mode 100644 SpeechT5/fairseq/tests/test_metrics.py create mode 100644 SpeechT5/fairseq/tests/test_multi_corpus_dataset.py create mode 100644 SpeechT5/fairseq/tests/test_multi_corpus_sampled_dataset.py create mode 100644 SpeechT5/fairseq/tests/test_multihead_attention.py create mode 100644 SpeechT5/fairseq/tests/test_noising.py create mode 100644 SpeechT5/fairseq/tests/test_online_backtranslation.py create mode 100644 SpeechT5/fairseq/tests/test_plasma_utils.py create mode 100644 SpeechT5/fairseq/tests/test_reproducibility.py create mode 100644 SpeechT5/fairseq/tests/test_resampling_dataset.py create mode 100644 SpeechT5/fairseq/tests/test_roberta.py create mode 100644 SpeechT5/fairseq/tests/test_sequence_generator.py create mode 100644 SpeechT5/fairseq/tests/test_sequence_scorer.py create mode 100644 SpeechT5/fairseq/tests/test_sparse_multihead_attention.py create mode 100644 SpeechT5/fairseq/tests/test_token_block_dataset.py create mode 100644 SpeechT5/fairseq/tests/test_train.py create mode 100644 SpeechT5/fairseq/tests/test_transformer.py create mode 100644 SpeechT5/fairseq/tests/test_utils.py create mode 100644 SpeechT5/fairseq/tests/test_valid_subset_checks.py create mode 100644 SpeechT5/fairseq/tests/utils.py create mode 100644 SpeechT5/fairseq/train.py create mode 100644 SpeechT5/results/ablation_study.png create mode 100644 SpeechT5/results/asr.png create mode 100644 SpeechT5/results/se.png create mode 100644 SpeechT5/results/sid.png create mode 100644 SpeechT5/results/st.png create mode 100644 SpeechT5/results/tts.png create mode 100644 SpeechT5/results/vc.png create mode 100644 SpeechT5/scripts/generate_class.py create mode 100644 SpeechT5/scripts/generate_speech.py create mode 100644 SpeechT5/speecht5/__init__.py create mode 100644 SpeechT5/speecht5/criterions/__init__.py create mode 100644 SpeechT5/speecht5/criterions/speech_pretrain_criterion.py create mode 100644 SpeechT5/speecht5/criterions/speech_to_text_loss.py create mode 100644 SpeechT5/speecht5/criterions/speecht5_criterion.py create mode 100644 SpeechT5/speecht5/criterions/text_pretrain_criterion.py create mode 100644 SpeechT5/speecht5/criterions/text_to_speech_loss.py create mode 100644 SpeechT5/speecht5/data/__init__.py create mode 100644 SpeechT5/speecht5/data/multitask_dataset.py create mode 100644 SpeechT5/speecht5/data/speech_dataset.py create mode 100644 SpeechT5/speecht5/data/speech_to_class_dataset.py create mode 100644 SpeechT5/speecht5/data/speech_to_speech_dataset.py create mode 100644 SpeechT5/speecht5/data/speech_to_text_dataset.py create mode 100644 SpeechT5/speecht5/data/text_dataset.py create mode 100644 SpeechT5/speecht5/data/text_to_speech_dataset.py create mode 100644 SpeechT5/speecht5/models/__init__.py create mode 100644 SpeechT5/speecht5/models/modules/__init__.py create mode 100644 SpeechT5/speecht5/models/modules/decoder.py create mode 100644 SpeechT5/speecht5/models/modules/encoder.py create mode 100644 SpeechT5/speecht5/models/modules/multihead_attention.py create mode 100644 SpeechT5/speecht5/models/modules/speaker_decoder_postnet.py create mode 100644 SpeechT5/speecht5/models/modules/speech_decoder_postnet.py create mode 100644 SpeechT5/speecht5/models/modules/speech_decoder_prenet.py create mode 100644 SpeechT5/speecht5/models/modules/speech_encoder_postnet.py create mode 100644 SpeechT5/speecht5/models/modules/speech_encoder_prenet.py create mode 100644 SpeechT5/speecht5/models/modules/text_decoder_postnet.py create mode 100644 SpeechT5/speecht5/models/modules/text_decoder_prenet.py create mode 100644 SpeechT5/speecht5/models/modules/text_encoder_prenet.py create mode 100644 SpeechT5/speecht5/models/modules/transformer_layer.py create mode 100644 SpeechT5/speecht5/models/speecht5.py create mode 100644 SpeechT5/speecht5/models/t5_transformer_lm.py create mode 100644 SpeechT5/speecht5/sequence_generator.py create mode 100644 SpeechT5/speecht5/tasks/__init__.py create mode 100644 SpeechT5/speecht5/tasks/speecht5.py create mode 100644 SpeechT5/speecht5_framework.png create mode 100644 SpeechT5/spm.py create mode 100644 SpeechUT/README.md create mode 100644 SpeechUT/dataset/LibriSpeech/dict.km.txt create mode 100644 SpeechUT/dataset/LibriSpeech/dict.kmu.txt create mode 100644 SpeechUT/dataset/LibriSpeech/dict.ltr.txt create mode 100644 SpeechUT/dataset/LibriSpeech/dict.txt create mode 100644 SpeechUT/dataset/MuSTC/dict.km.txt create mode 100644 SpeechUT/dataset/MuSTC/dict.kmu.txt create mode 100644 SpeechUT/dataset/MuSTC/en_de/config.yaml create mode 100644 SpeechUT/dataset/MuSTC/en_de/config_ende.yaml create mode 100644 SpeechUT/dataset/MuSTC/en_de/dict.kmu.txt create mode 100644 SpeechUT/dataset/MuSTC/en_de/dict.spm.txt create mode 100644 SpeechUT/dataset/MuSTC/en_de/spm_unigram10000.model create mode 100644 SpeechUT/dataset/MuSTC/en_es/config.yaml create mode 100644 SpeechUT/dataset/MuSTC/en_es/config_enes.yaml create mode 100644 SpeechUT/dataset/MuSTC/en_es/dict.kmu.txt create mode 100644 SpeechUT/dataset/MuSTC/en_es/dict.spm.txt create mode 100644 SpeechUT/dataset/MuSTC/en_es/spm_unigram10000.model create mode 100644 SpeechUT/dataset/MuSTC/en_fr/config.yaml create mode 100644 SpeechUT/dataset/MuSTC/en_fr/config_enfr.yaml create mode 100644 SpeechUT/dataset/MuSTC/en_fr/dict.kmu.txt create mode 100644 SpeechUT/dataset/MuSTC/en_fr/dict.spm.txt create mode 100644 SpeechUT/dataset/MuSTC/en_fr/spm_unigram10000.model create mode 100644 SpeechUT/speechut/__init__.py create mode 100644 SpeechUT/speechut/config/finetune_asr/speechut_base_100h.yaml create mode 100644 SpeechUT/speechut/config/finetune_asr/speechut_large_100h.yaml create mode 100644 SpeechUT/speechut/config/finetune_asr/speechut_large_960h.yaml create mode 100644 SpeechUT/speechut/config/pretrain/speechut_base_librispeech.yaml create mode 100644 SpeechUT/speechut/config/pretrain/speechut_large_librilight.yaml create mode 100644 SpeechUT/speechut/criterions/__init__.py create mode 100644 SpeechUT/speechut/criterions/ctc_ce.py create mode 100644 SpeechUT/speechut/criterions/speechut_criterion.py create mode 100644 SpeechUT/speechut/data/concat_dataset.py create mode 100644 SpeechUT/speechut/data/hubert_dataset.py create mode 100644 SpeechUT/speechut/data/language_trible_dataset.py create mode 100644 SpeechUT/speechut/data/load_langpair_dataset.py create mode 100644 SpeechUT/speechut/data/multimodal_corpus_dataset.py create mode 100644 SpeechUT/speechut/models/__init__.py create mode 100644 SpeechUT/speechut/models/speechut.py create mode 100644 SpeechUT/speechut/models/speechut_asr.py create mode 100644 SpeechUT/speechut/models/speechut_st.py create mode 100644 SpeechUT/speechut/models/t5_transformer_lm.py create mode 100644 SpeechUT/speechut/modules/__init__.py create mode 100644 SpeechUT/speechut/modules/ctc_prefix_score.py create mode 100644 SpeechUT/speechut/modules/learned_positional_embedding.py create mode 100644 SpeechUT/speechut/modules/multihead_attention.py create mode 100644 SpeechUT/speechut/modules/relative_pos_enc.py create mode 100644 SpeechUT/speechut/modules/transformer_decoder.py create mode 100644 SpeechUT/speechut/modules/transformer_encoder.py create mode 100644 SpeechUT/speechut/modules/transformer_layer.py create mode 100644 SpeechUT/speechut/modules/w2v_encoder.py create mode 100644 SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_asr.sh create mode 100644 SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st.sh create mode 100644 SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st_enfr.sh create mode 100644 SpeechUT/speechut/scripts/pretrain_speechut/large_speechut_for_asr.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_asr/finetune960h_large_edctc.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_asr/finetune_base_edctc.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctc.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctclm.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_asr/inference_lm_nj.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_asr/inference_nj.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_st/finetune_base_mustc_enxx.sh create mode 100644 SpeechUT/speechut/scripts/tune_speechut_st/inference_st.sh create mode 100644 SpeechUT/speechut/squence_generator.py create mode 100644 SpeechUT/speechut/tasks/joint_sc2t_pretrain.py create mode 100644 VATLM/README.md create mode 100644 VATLM/vat_hubert/requirements.txt create mode 100644 VATLM/vat_hubert/vathubert/__init__.py create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_av.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_v.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_av.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_v.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_av.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_v.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_av.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_v.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_av.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_v.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/pretrain/base_lrs3_iter5.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/pretrain/base_vox_iter5.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/pretrain/large_vox_iter5.yaml create mode 100644 VATLM/vat_hubert/vathubert/conf/s2s_decode.yaml create mode 100644 VATLM/vat_hubert/vathubert/criterions/__init__.py create mode 100644 VATLM/vat_hubert/vathubert/criterions/vathubert_criterion.py create mode 100644 VATLM/vat_hubert/vathubert/data/audiohubert_dataset.py create mode 100644 VATLM/vat_hubert/vathubert/data/onlyaudiohubert_dataset.py create mode 100644 VATLM/vat_hubert/vathubert/data/texthubert_dataset.py create mode 100644 VATLM/vat_hubert/vathubert/data/utils.py create mode 100644 VATLM/vat_hubert/vathubert/data/vathubert_dataset.py create mode 100644 VATLM/vat_hubert/vathubert/decode_avhubert_lrs3.sh create mode 100644 VATLM/vat_hubert/vathubert/infer_s2s.py create mode 100644 VATLM/vat_hubert/vathubert/models/decoder.py create mode 100644 VATLM/vat_hubert/vathubert/models/resnet.py create mode 100644 VATLM/vat_hubert/vathubert/models/utils.py create mode 100644 VATLM/vat_hubert/vathubert/models/vathubert.py create mode 100644 VATLM/vat_hubert/vathubert/models/vathubert_asr.py create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_lrs3_finetune30_av.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune30_av.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune433_av.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune30_av.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune433_av.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_lrs3_finetune30_v.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune30_v.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune433_v.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune30_v.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune433_v.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/pretrain/base_lsr3_pretrain_iter5.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/pretrain/base_vox_pretrain_iter5.sh create mode 100644 VATLM/vat_hubert/vathubert/scripts/pretrain/large_vox_pretrain_iter5.sh create mode 100644 VATLM/vat_hubert/vathubert/sequence_generator.py create mode 100644 VATLM/vat_hubert/vathubert/tasks/vathubert_pretraining.py create mode 100644 VATLM/vat_hubert/vathubert/utils.py create mode 100644 WavLLM/README.md create mode 100644 WavLLM/download/download.sh create mode 100644 WavLLM/wavllm/__init__.py create mode 100644 WavLLM/wavllm/criterions/cross_entropy_acc.py create mode 100644 WavLLM/wavllm/data/speechllm_dataset.py create mode 100644 WavLLM/wavllm/data/tokenizer.py create mode 100644 WavLLM/wavllm/inference/generate.py create mode 100644 WavLLM/wavllm/inference/sequence_generator.py create mode 100644 WavLLM/wavllm/models/llama.py create mode 100644 WavLLM/wavllm/models/speechllm_model.py create mode 100644 WavLLM/wavllm/models/wavlm.py create mode 100644 WavLLM/wavllm/models/whisper_encoder.py create mode 100644 WavLLM/wavllm/modules/convolution.py create mode 100644 WavLLM/wavllm/requirements.txt create mode 100644 WavLLM/wavllm/scripts/inference_sft.sh create mode 100644 WavLLM/wavllm/tasks/speechllm_task.py create mode 100644 WavLLM/wavllm/test_data/CoT-task-story.tsv create mode 100644 WavLLM/wavllm/test_data/CoT-task.tsv create mode 100644 WavLLM/wavllm/test_data/II-task.tsv create mode 100644 WavLLM/wavllm/test_data/SQA.tsv create mode 100644 WavLLM/wavllm/test_data/SQQA.tsv create mode 100644 WavLLM/wavllm/test_data/asr.tsv create mode 100644 WavLLM/wavllm/test_data/audio/CoT-task-story.wav create mode 100644 WavLLM/wavllm/test_data/audio/CoT-task.wav create mode 100644 WavLLM/wavllm/test_data/audio/II-task.wav create mode 100644 WavLLM/wavllm/test_data/audio/asr.flac create mode 100644 WavLLM/wavllm/test_data/audio/emo.wav create mode 100644 WavLLM/wavllm/test_data/audio/sqa.wav create mode 100644 WavLLM/wavllm/test_data/audio/sqqa.wav create mode 100644 WavLLM/wavllm/test_data/audio/st.flac create mode 100644 WavLLM/wavllm/test_data/audio/sv.wav create mode 100644 WavLLM/wavllm/test_data/dict.txt create mode 100644 WavLLM/wavllm/test_data/emo.tsv create mode 100644 WavLLM/wavllm/test_data/en2de.tsv create mode 100644 WavLLM/wavllm/test_data/gaokao.tsv create mode 100644 WavLLM/wavllm/test_data/sv.tsv create mode 100644 WavLLM/wavllm/tokenizer/tokenizer.model create mode 100644 YiTrans/.gitignore create mode 100644 YiTrans/exp_scripts/finetune_ASR/finetune_hubert24_mbart24_en.sh create mode 100644 YiTrans/exp_scripts/finetune_MT/finetune_mbart_en-de.sh create mode 100644 YiTrans/exp_scripts/finetune_ST/en-de/jtst_pt36s2_mustc.sh create mode 100644 YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step1.sh create mode 100644 YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step2.sh create mode 100644 YiTrans/readme.md create mode 100644 YiTrans/yitrans_iwslt22/__init__.py create mode 100644 YiTrans/yitrans_iwslt22/config/finetune_asr/large_mustc.yaml create mode 100644 YiTrans/yitrans_iwslt22/config/finetune_mt/mt_translation.yaml create mode 100644 YiTrans/yitrans_iwslt22/config/pretrain/joint_base.yaml create mode 100644 YiTrans/yitrans_iwslt22/config/pretrain/joint_large.yaml create mode 100644 YiTrans/yitrans_iwslt22/criterions/__init__.py create mode 100644 YiTrans/yitrans_iwslt22/criterions/ctc_ce.py create mode 100644 YiTrans/yitrans_iwslt22/criterions/joint_step1_criterion.py create mode 100644 YiTrans/yitrans_iwslt22/criterions/joint_step1_split_batch_criterion.py create mode 100644 YiTrans/yitrans_iwslt22/criterions/joint_step2_criterion.py create mode 100644 YiTrans/yitrans_iwslt22/data/concat_dataset.py create mode 100644 YiTrans/yitrans_iwslt22/data/denoising_dataset.py create mode 100644 YiTrans/yitrans_iwslt22/data/lang_pair_mask_dataset.py create mode 100644 YiTrans/yitrans_iwslt22/data/load_langpair_dataset.py create mode 100644 YiTrans/yitrans_iwslt22/data/multimodal_corpus_dataset.py create mode 100644 YiTrans/yitrans_iwslt22/data/speech2c_dataset.py create mode 100644 YiTrans/yitrans_iwslt22/models/__init__.py create mode 100644 YiTrans/yitrans_iwslt22/models/_hubert_mt.py create mode 100644 YiTrans/yitrans_iwslt22/models/finetune_asr.py create mode 100644 YiTrans/yitrans_iwslt22/models/finetune_mt.py create mode 100644 YiTrans/yitrans_iwslt22/models/finetune_st.py create mode 100644 YiTrans/yitrans_iwslt22/models/pretrain_ed.py create mode 100644 YiTrans/yitrans_iwslt22/models/pretrain_ed_step2.py create mode 100644 YiTrans/yitrans_iwslt22/modules/__init__.py create mode 100644 YiTrans/yitrans_iwslt22/modules/multihead_attention.py create mode 100644 YiTrans/yitrans_iwslt22/modules/multimodal_transformer_decoder.py create mode 100644 YiTrans/yitrans_iwslt22/modules/relative_pos_enc.py create mode 100644 YiTrans/yitrans_iwslt22/modules/transformer_decoder.py create mode 100644 YiTrans/yitrans_iwslt22/modules/transformer_decoder_layer.py create mode 100644 YiTrans/yitrans_iwslt22/modules/w2v_encoder.py create mode 100644 YiTrans/yitrans_iwslt22/sequence_generator.py create mode 100644 YiTrans/yitrans_iwslt22/tasks/iwslt_joint_pretraining.py create mode 100644 YiTrans/yitrans_iwslt22/tasks/iwslt_translation_from_pretrain.py create mode 100644 asr_train.sh create mode 100644 calc4vc.py create mode 100644 dict.txt create mode 100644 docker/Dockerfile create mode 100644 icon.png create mode 100644 images/algorithm.png create mode 100644 images/model_architecture.png create mode 100644 libri_labels.py create mode 100644 librispeech_asr_demo.py create mode 100644 model.properties create mode 100644 requirements.txt create mode 100644 test_asr.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba0430d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3dad1fe --- /dev/null +++ b/.gitmodules @@ -0,0 +1,25 @@ +[submodule "SpeechT5/fairseq"] + path = SpeechT5/fairseq + url = https://github.com/pytorch/fairseq +[submodule "Speech2C/fairseq"] + path = Speech2C/fairseq + url = https://github.com/facebookresearch/fairseq.git +[submodule "YiTrans/fairseq"] + path = YiTrans/fairseq + url = https://github.com/facebookresearch/fairseq +[submodule "SpeechLM/fairseq"] + path = SpeechLM/fairseq + url = https://github.com/facebookresearch/fairseq.git +[submodule "SpeechUT/fairseq"] + path = SpeechUT/fairseq + url = https://github.com/facebookresearch/fairseq.git +[submodule "VATLM/fairseq"] + path = VATLM/fairseq + url = https://github.com/facebookresearch/fairseq.git +[submodule "Speech2S/fairseq"] + path = Speech2S/fairseq + url = https://github.com/facebookresearch/fairseq.git + branch = adding_womenbios +[submodule "WavLLM/fairseq"] + path = WavLLM/fairseq + url = https://github.com/pytorch/fairseq.git diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..f9ba8cf --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,9 @@ +# Microsoft Open Source Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). + +Resources: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/README.md b/README.md index e69de29..49d15c9 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,209 @@ +# SpeechT5 + +## 论文 + + - https://arxiv.org/abs/2110.07205 + + +## 开源代码 + + - https://github.com/microsoft/SpeechT5 + + +## 模型结构 + +speechT5的核心是一个常规的**Transformer编码器-解码器**,为了使得同一个Transformer可以同时处理文本和语音数据,添加了**pre-nets**和**post-nets**,**pre-net**将输入的文本或语音转换为Transformer使用的隐藏表示;**post-net**从Transformer中获取输出并转换为文本或语音。 +
+ +
+ + +## 算法原理 + +在预训练期间,同时使用所有的 per-nets 和 post-nets 。预训练后,整个编码器 - 解码器主干在单个任务上进行微调。这种经过微调的模型仅使用特定于给定任务的 per-nets 和 post-nets 。*例如:要将 SpeechT5 用于文本到语音转换,您需要将文本编码器 per-nets 交换为文本输入,将语音解码器 per-nets 和 post-nets 交换为语音输出。* +
+ +
+ +**注意: 即使微调模型一开始使用共享预训练模型的同一组权重,但最终版本最终还是完全不同。例如,您不能采用经过微调的 ASR 模型并换掉 per-nets 和 post-nets 来获得有效的 TTS 模型。SpeechT5 很灵活,但不是那么灵活。** + + +## 环境配置 + +### Docker (方法一) +**注意修改路径参数** + +``` +docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-ubuntu20.04-dtk24.04.1-py3.10 + +docker run -it --network=host --ipc=host --name=your_container_name --shm-size=32G --device=/dev/kfd --device=/dev/mkfd --device=/dev/dri -v /opt/hyhal:/opt/hyhal:ro -v /path/your_code_data/:/path/your_code_data/ --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-centos7.6-dtk24.04-py310 /bin/bash + +# 独立安装项目依赖包fairseq +git clone -b 1.0.0a0 http://developer.hpccube.com/codes/OpenDAS/fairseq.git +cd fairseq +pip3 install --editable ./ + +# 安装项目依赖包 +cd speechT5_pytorch +pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ +``` + +### Dockerfile (方法二) + +``` +cd ./docker +docker build --no-cache -t speecht5 . +docker run -it -v /path/your_code_data/:/path/your_code_data/ --shm-size=32G --privileged=true --device=/dev/kfd --device=/dev/dri/ --group-add video --name docker_name imageID bash + +git clone -b 1.0.0a0 http://developer.hpccube.com/codes/OpenDAS/fairseq.git +cd fairseq +pip3 install --editable ./ + +cd speechT5_pytorch +pip3 install -r requirements.txt +``` + +### Anaconda (方法三) + +1、关于本项目DCU显卡所需的特殊深度学习库可从光合开发者社区下载安装: https://developer.hpccube.com/tool/ + +``` +DTK软件栈:dtk24.04 +python:python3.10 +torch:2.1.0 +torchvision:0.16.0 +``` + +Tips:以上dtk软件栈、python、torch等DCU相关工具版本需要严格一一对应 + +2、fairseq库需要单独安装,可参考如下命令: +``` +git clone -b 1.0.0a0 http://developer.hpccube.com/codes/OpenDAS/fairseq.git +cd fairseq +pip3 install --editable ./ +``` + +3、其他非特殊库直接按照requirements.txt安装 + +``` +cd speechT5_pytorch +pip3 install -r requirements.txt +``` + +## 数据集 +**内网可从此地址拷贝:/public/home/changhl/dataset/LibriSpeech** +- SCnet快速下载链接: + - [librispeech_asr数据集下载](http://113.200.138.88:18080/aidatasets/librispeech_asr_dummy) + +- 官方下载链接: + - [librispeech_asr数据集下载](http://www.openslr.org/12) + + +`librispeech_asr`:语音识别数据集,数据集中包括音频文件以及文本转录文件。其中音频文件以flac格式存储,文本转录文件以txt格式存储。 + +``` +LibriSpeech +├── train-clean-100 +│ ├── 1272 +│ │ ├── 1272-128104 +│ │ │ ├── 1272-128104-0000.flac +│ │ │ ├── 1272-128104-0001.flac +│ │ │ ├── 1272-128104-0002.flac +│ │ │ ├── 1272-128104-0003.flac +│ │ │ ├── ... +│ │ │ ├── 1272-128104.trans.txt +│ │ └── ... +│ └── ... +├── train-clean-360 +├── train-other-500 +├── dev-clean +├── dev-other +├── test-clean +└── test-othe +``` + + - `train-clean-100`:包含大约 100 小时的清晰语音。 + - `1272`:说话人ID(1272)。 + - `1272-128104`:说话人ID(1272)-文本章节ID(128204)。 + - `1272-128104-0000.flac`:说话人ID(1272)-文本章节ID(128204)-文本片段ID(0)的音频文件。 + - `1272-128104.trans.txt`:说话人ID(1272)-文本章节ID(128204)的转录文本文件。 + +## 预训练模型 +**ASR任务训练前先下载预训练好的权重文件、SPM_TOKENIZER、字典等文件** +- 官方下载地址: + - [speecht5初始权重](https://huggingface.co/ajyy/SpeechT5/resolve/main/speecht5_base.pt) + - [SPM_TOKENIZER下载地址](https://drive.google.com/uc?export=download&id=1wClgQjXXoU2lmpbaEa1v2SqMbg7cAutq) + - [字典](https://huggingface.co/ajyy/SpeechT5/resolve/main/speecht5_base.pt) + + + +## 训练 + +### ASR训练 +**step1:生成训练集的train.tsv文件和valid.tsv文件** +``` +cd speecht5_pytorch/SpeechT5/fairseq +python examples/wav2vec/wav2vec_manifest.py dataset/LibriSpeech/dev-clean --dest /public/home/changhl/py_project/train_0910 --ext flac --valid-percent 0.1 +# python wav2vec_manifest.py 数据集目录 --dest tsv文件的存储目录 --ext 语音文件类型(flac) --valid-percent 0.1 +# 数据集目录为dataset/LibriSpeech/dev-clean,因为选取整个数据集,训练耗时过长,可以选择所有的librispeech数据集。 +``` + +**step2:生成step1生成的tsv文件的标签文件:train.txt和valid.txt** +``` +cd speecht5_pytorch/SpeechT5/fairseq +python examples/wav2vec/libri_labels.py /public/home/changhl/py_project/train_0910/train.tsv --output-dir /public/home/changhl/py_project/train_0910 --output-name train +python examples/wav2vec/libri_labels.py /public/home/changhl/py_project/train_0910/valid.tsv --output-dir /public/home/changhl/py_project/train_0910 --output-name valid +# python libri_labels.py tsv文件目录 \ +# --output-dir txt文件保存目录 \ +# --output-name txt文件名模型(和tsv的文件名相同) +``` + +**step3:字典文件迁移** +将下载的dict.txt字典文件迁移至train.tsv的同一目录下 + +**step4:训练** +``` +cd speecht5_pytorch +export HIP_VISIBLE_DEVICES=0 # 自行指定可见卡 +bash asr_train.sh \ + --dcu 1 \ + --log /public/home/changhl/py_project/SpeechT5/log \ + --td /public/home/changhl/py_project/train_0910 \ + --res /public/home/changhl/py_project/SpeechT5/res \ + --lab /public/home/changhl/py_project/train_0910 \ + --token /public/home/changhl/dataset/spm_char.model \ + --speecht5 /public/home/changhl/py_project/SpeechT5/SpeechT5/speecht5 \ + --checkpoint /public/home/changhl/dataset/speecht5_base.pt \ + --epoch 3 +# 具体参数解析-h查看 +``` + - `dcu`:训练所用的卡数 + - `log`:训练日志文件保存目录 + - `td`:train.tsv文件和valid.tsv文件的所在目录 + - `res`:训练结果.pt文件保存目录 + - `lab`:train.txt和valid.txt文件的所在目录 + - `token`:下载的spm_char.model文件路径——SPM_TOKENIZER文件 + - `speecht5`:/speecht5_pytorch/SpeechT5/speecht5该目录的绝对路径 + - `checkpoint`:预训练的初始权重路径 + - `epoch`:训练次数 + + +## 应用场景 + +### 算法分类 +``` +语音识别 +``` + +### 热点应用行业 +``` +金融,通信,广媒 +``` + +## 源码仓库及问题反馈 + +https://developer.hpccube.com/codes/modelzoo/SpeechT5_pytorch + +## 参考 + +[GitHub - microsoft/SpeechT5](https://github.com/microsoft/SpeechT5/tree/main/SpeechT5) diff --git a/README_ori.md b/README_ori.md new file mode 100644 index 0000000..38ba877 --- /dev/null +++ b/README_ori.md @@ -0,0 +1,271 @@ +# SpeechT5 + +Unified-modal speech-text pre-training for spoken language processing: + +> [**SpeechT5**](https://arxiv.org/abs/2110.07205) (```ACL 2022```): **SpeechT5: Unified-Modal Encoder-Decoder Pre-training for Spoken Language Processing** + +> [**Speech2C**](https://arxiv.org/abs/2203.17113) (```INTERSPEECH 2022```): **Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data** + +> [**YiTrans**](https://arxiv.org/abs/2206.05777) (```IWSLT 2022```): **The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task** + +> [**SpeechUT**](https://arxiv.org/abs/2210.03730) (```EMNLP 2022```): **SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training** + +> [**SpeechLM**](https://arxiv.org/abs/2209.15329) (```IEEE/ACM TASLP```): **SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data** + +> [**Speech2S**](https://arxiv.org/abs/2210.17027) (```ICASSP 2023```): **Joint Pre-Training with Speech and Bilingual Text for Direct Speech to Speech Translation** + +> [**Prosody-SpeechT5**](https://ieeexplore.ieee.org/document/10096530/) (```ICASSP 2023```): **Prosody-aware SpeechT5 for Expressive Neural TTS** + +> [**VATLM**](https://arxiv.org/abs/2211.11275) (```IEEE Transactions on Multimedia```): **VATLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning** + +> [**VALL-E X**](https://arxiv.org/abs/2303.03926) (```Arxiv 2023```): **Speak Foreign Languages with Your Own Voice: Cross-Lingual Neural Codec Language Modeling** + +> [**VioLA**](https://arxiv.org/abs/2305.16107) (```Arxiv 2023```): **VioLA: Unified Codec Language Models for Speech Recognition, Synthesis, and Translation** + +> [**WavLLM**](https://arxiv.org/abs/2404.00656) (```Arxiv 2024```): **WavLLM: Towards Robust and Adaptive Speech Large Language Model** + + + + +## Update + +- April, 2024: WavLLM [**Arxiv**](https://arxiv.org/abs/2404.00656). +- March, 2024: [**SpeechLM**](https://arxiv.org/abs/2209.15329) was accepted by IEEE/ACM Transactions on Audio, Speech, and Language Processing. +- May, 2023: VioLA [**Arxiv**](https://arxiv.org/abs/2305.16107). +- May, 2023: [**VATLM**](https://arxiv.org/abs/2211.11275) was accepted by IEEE Transactions on Multimedia. +- March, 2023: VALL-E X [**Arxiv**](https://arxiv.org/abs/2303.03926) and [**Demo**](https://aka.ms/vallex). +- February, 2023: [**Speech2S**](https://arxiv.org/abs/2210.17027) and [**Prosody-SpeechT5**](https://arxiv.org/abs/2211.11275) were accepted by ICASSP 2023. +- [HuggingFace Integration] February, 2023: [**SpeechT5**](https://aclanthology.org/2022.acl-long.393/) models are on [**HuggingFace**](https://huggingface.co/blog/speecht5). +- [Model Release] November, 2022: [**VATLM**](https://github.com/microsoft/SpeechT5/tree/main/VATLM) models are released. +- November, 2022: VATLM [**Arxiv**](https://arxiv.org/abs/2211.11275). +- November, 2022: Speech2S [**Arxiv**](https://arxiv.org/abs/2210.17027). +- [Model Release] October, 2022: [**SpeechUT**](https://github.com/microsoft/SpeechT5/tree/main/SpeechUT) models are released. +- October, 2022: [**SpeechUT**](https://arxiv.org/abs/2210.03730) was accepted by EMNLP 2022. +- [Model Release] October, 2022: [**SpeechLM**](https://github.com/microsoft/SpeechT5/tree/main/SpeechLM) models are released. +- September, 2022: SpeechLM [**Arxiv**](https://arxiv.org/abs/2209.15329). +- [Evaluation] June, 2022: The end-to-end ST system [**YiTrans**](https://arxiv.org/abs/2206.05777) achieved top results on [**IWSLT 2022**](https://iwslt.org/2022/offline) shared tasks. +- June, 2022: [**Speech2C**](https://www.isca-speech.org/archive/interspeech_2022/ao22_interspeech.html) was accepted by InterSpeech 2022. +- [Model Release] May, 2022: [**Speech2C**](https://github.com/microsoft/SpeechT5/tree/main/Speech2C) models are released. +- [Model Release] April, 2022: [**SpeechT5**](https://github.com/microsoft/SpeechT5/tree/main/SpeechT5) models are released. +- March, 2022: Speech2C [**Arxiv**](https://arxiv.org/abs/2203.17113). +- February, 2022: [**SpeechT5**](https://aclanthology.org/2022.acl-long.393/) was accepted by ACL 2022. +- October, 2021: SpeechT5 [**Arxiv**](https://arxiv.org/abs/2110.07205). + + +## Pre-Trained Models + + +| Model | Pre-training Dataset | Fine-tuning Dataset | Model | +| :------: | :----------------------------------------------: | :-----------------: | :-----: | +| SpeechT5 Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [LibriSpeech LM Dataset](https://www.openslr.org/11/) | - | [HuggingFace](https://huggingface.co/ajyy/SpeechT5/resolve/main/speecht5_base.pt)
[Google Drive](https://drive.google.com/file/d/1Sq00uZ1pw6Z4OUaqhOWzQEJxIVWgAO5U/view?usp=sharing) | +| SpeechT5 Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [LibriSpeech LM Dataset](https://www.openslr.org/11/) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [HuggingFace](https://huggingface.co/ajyy/SpeechT5/resolve/main/speecht5_base_asr.pt)
[Google Drive](https://drive.google.com/file/d/1qLKJ81JPWOGf1MHfjSmgtZyqqTqgI6kT/view?usp=sharing) | +| SpeechT5 Large | [60k hrs Libri-Light](https://github.com/facebookresearch/libri-light) + [LibriSpeech LM Dataset](https://www.openslr.org/11/) | - | [Google Drive](https://drive.google.com/file/d/1M79b1jetSPOVxWVMIX-y0URvDjNskZKp/view?usp=sharing) | +| Speech2C | [960 hrs LibriSpeech](http://www.openslr.org/12) | - | [Google Drive](https://drive.google.com/file/d/1nGZ0LWEwlLq2pz7o805YALsMr9irV0Za/view?usp=sharing) | +| Speech2C | [960 hrs LibriSpeech](http://www.openslr.org/12) | [10 hrs LibriSpeech](http://www.openslr.org/12) | [Google Drive](https://drive.google.com/file/d/1nWSAc-33LmcDQHzH8IjXVJsuk0JZTWgN/view?usp=sharing) | +| Speech2C | [960 hrs LibriSpeech](http://www.openslr.org/12) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Google Drive](https://drive.google.com/file/d/1LwbQ5Y3tKZoK3s1ayLQgsfLTFnmkKNZs/view?usp=sharing) | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Google drive](https://drive.google.com/file/d/1iJvhSGghNrMT-wAY1nwVu2YaYuTy1pxx/view?usp=sharing) | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Google drive](https://drive.google.com/file/d/1mH3N7iKMWYk3rSBJErQPYf3x5ugqDq5x/view?usp=sharing) | +| SpeechLM-H Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Google drive](https://drive.google.com/file/d/1eblW8U8f9t-NTuCNRrNHwr-8BeLAUAmQ/view?usp=sharing) | +| SpeechLM-H Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Google drive](https://drive.google.com/file/d/1vXyO5DolbiWiTYZ6pkkKQsu2wJetaPlv/view?usp=sharing) | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-De CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-Ca CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-Ar CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-Tr CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | - | [Google drive](https://drive.google.com/file/d/1QjLIgTJKIylVIp5hUkfSjGPtz8Xo7Lky/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [960 hrs LibriSpeech](http://www.openslr.org/12) | [Google drive](https://drive.google.com/file/d/1YZQDVv096o8Opt0RBnkRiZXYPRDqKZnP/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-De CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/1qYygNWSc11TQbBI1OzC4ChlR-dNh8t9S/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-Ca CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/162U88mwso2aVfzzPkEM2nP_vwTpcb57T/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-Ar CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/1lbTSRXewEeb2t45URunD6EiJcbniyjWW/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-Tr CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/1Er4I_jHS175pQQph223yKtiiLQ378VvH/view?usp=sharing) | +| SpeechUT Base (ASR) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Azure Storage]| +| SpeechUT Base (ASR) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Azure Storage]| +| SpeechUT Large (ASR) | [60k hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Azure Storage]| +| SpeechUT Large (ASR) | [60k hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [960 hrs LibriSpeech](http://www.openslr.org/12) | [Azure Storage]| +| SpeechUT Base (En-De) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [408 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [4.6M Text](https://www.statmt.org/wmt16/) | - | [Azure Storage]| +| SpeechUT Base (En-De) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [408 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [4.6M Text](https://www.statmt.org/wmt16/) | [En-De MuST-C v1](https://ict.fbk.eu/must-c/) | [Azure Storage]| +| SpeechUT Base (En-Es) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [504 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [15M Text](https://www.statmt.org/wmt13/) | - | [Azure Storage]| +| SpeechUT Base (En-Es) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [504 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [15M Text](https://www.statmt.org/wmt13/) | [En-Es MuST-C v1](https://ict.fbk.eu/must-c/) | [Azure Storage]| +| SpeechUT Base (En-Fr) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [492 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [40M Text](https://www.statmt.org/wmt14/) | - | [Azure Storage]| +| SpeechUT Base (En-Fr) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [492 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [40M Text](https://www.statmt.org/wmt14/) | [En-Fr MuST-C v1](https://ict.fbk.eu/must-c/) | [Azure Storage]| + + + +## SpeechT5 Introduction + +Motivated by the success of T5 (Text-To-Text Transfer Transformer) in pre-trained natural language processing models, we propose a unified-modal SpeechT5 framework that explores the encoder-decoder pre-training for self-supervised speech/text representation learning. +The SpeechT5 framework consists of a shared encoder-decoder network and six modal-specific (speech/text) pre/post-nets. +After preprocessing the input speech/text through the pre-nets, the shared encoder-decoder network models the sequence-to-sequence transformation, and then the post-nets generate the output in the speech/text modality based on the output of the decoder. + +se + +Leveraging large-scale unlabeled speech and text data, we pre-train SpeechT5 to learn a unified-modal representation, hoping to improve the modeling capability for both speech and text. +To align the textual and speech information into this unified semantic space, we propose a cross-modal vector quantization approach that randomly mixes up speech/text states with latent units as the interface between encoder and decoder. +Extensive evaluations show the superiority of the proposed SpeechT5 framework on a wide variety of spoken language processing tasks, including automatic speech recognition, speech synthesis, speech translation, voice conversion, speech enhancement, and speaker identification. + + + +## SpeechT5 Downstream Task Performance + +We evaluate our models on typical spoken language processing tasks, including automatic speech recognition, text to speech, speech to text translation, voice conversion, speech enhancement, and speaker identification. + +### Automatic Speech Recognition + +Evaluation on the [LibriSpeech](http://www.openslr.org/12) + +| Model |LM | dev-clean | dev-other | test-clean | test-other | +| ------------- |------------- | ------| ----- | ----| ----| +| wav2vec2.0 Base | - | 6.1 | 13.5 | 6.1 | 13.3 | +| HuBERT Base | - | 5.5 | 13.1 | 5.8 | 13.3 | +| Baseline (w/o CTC) | - | 5.8 | 12.3 | 6.2 | 12.3 | +| Baseline | - | 4.9 | 11.7 | 5.0 | 11.9 | +| SpeechT5 (w/o CTC) | - | 5.4 | 10.7 | 5.8 | 10.7 | +| **SpeechT5** | - | **4.3** | **10.3** | **4.4** | **10.4** | +| DiscreteBERT | 4-gram | 4.0 |10.9 |4.5 |12.1 | +| wav2vec 2.0 Base | 4-gram | 2.7 |7.9 |3.4 |8.0 | +| HuBERT Base | 4-gram | 2.7 |7.8 |3.4 |8.1 | +| wav2vec 2.0 Base | Transf. | 2.2 |6.3 |2.6 |6.3 | +| Baseline | Transf. | 2.3 |6.3 |2.5 |6.3 | +| **SpeechT5** | Transf. | **2.1** |**5.5** |**2.4** |**5.8** | + +### Text-to-Speech + +Evaluation on the [LibriTTS](http://www.openslr.org/60/) + + +| Model | Naturalness | MOS | CMOS | +| ------------- |------------ | ------ | ----- | +| Ground Truth | - | 3.87 | - | +| Baseline | 2.76 | 3.56 | 0 | +| **SpeechT5** | 2.91 | **3.65** | **+0.290** | + +### Speech Translation + +Evaluation on the [MUST-C v1](https://ict.fbk.eu/must-c/) + +| Model | EN-DE | EN-FR | +| ------------- |------------ | ------ | +| Fairseq ST | 22.70 | 32.90 | +| ESPnet ST | 22.91 | 32.69 | +| Adapter Tuning| 24.63 | 34.98 | +| Baseline | 23.43 | 33.76 | +| SpeechT5 (w/o initializing decoder) | 24.44 | 34.5 | +| **SpeechT5** | **25.18** | **35.30** | + + +### Voice Conversion + +Evaluation on the [CMU Arctic](http://www.festvox.org/cmu_arctic/) + + +| Model | WER | WER | MCD | MCD | +| ------------- | ------ | ----- | ---- | ----| +| | bdl to slt | clb to slt | bdl to slt | clb to slt | +| VTN w/ ASR | 11.1 | 10.9 | 6.5 | 6.11 | +| VTN w/ TTS | 7.6 | 9.1 | 6.33 | 13.3 | +| Many-to-many VTN | - | - | 6.13 | 5.97 | +| Baseline | 21.5 | 10.8 | 6.26 | 6.16 | +| **SpeechT5** | **7.8** | **6.4** | **5.93**| **5.87** | + + + +### Speech Enhancement + +Evaluation on the [WSJ0 Hipster AmbientMixtures (WHAM!)](http://wham.whisper.ai/) + + +| Model | WER | +| ------------- |------------ | +| Ground Truth Speech | 3.2 | +| Noisy Speech | 76.1 | +| Baseline | 10.9 | +| **SpeechT5** | **8.9** | + + +### Speaker Identification + +Evaluation on the [VoxCeleb1](https://www.robots.ox.ac.uk/~vgg/data/voxceleb/vox1.html) + +| Model | Acc | +| ------------- |------------ | +| SUPERB, wav2vec 2.0 Base | 75.18% | +| SUPERB, HuBERT Base | 81.42% | +| SUPERB, HuBERT Large | 90.33% | +| SpeechNet, single task | 86.00% | +| SpeechNet, multi-task with TTS | 87.90% | +| Thin ResNet-34 | 89.00% | +| Baseline | 91.92% | +| **SpeechT5** | **96.49%** | + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq) and [ESPnet](https://github.com/espnet/espnet) projects. + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +### Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{Ao2021SpeechT5, + title = {SpeechT5: Unified-Modal Encoder-Decoder Pre-training for Spoken Language Processing}, + author = {Junyi Ao and Rui Wang and Long Zhou and Chengyi Wang and Shuo Ren and Yu Wu and Shujie Liu and Tom Ko and Qing Li and Yu Zhang and Zhihua Wei and Yao Qian and Jinyu Li and Furu Wei}, + eprint={2110.07205}, + archivePrefix={arXiv}, + primaryClass={eess.AS}, + year={2021} +} +``` + +```bibtex +@article{Ao2022Speech2C, + title = {Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data}, + author = {Junyi Ao and Ziqiang Zhang and Long Zhou and Shujie Liu and Haizhou Li and Tom Ko and Lirong Dai and Jinyu Li and Yao Qian and Furu Wei}, + eprint={2203.17113}, + archivePrefix={arXiv}, + primaryClass={cs.SD}, + year={2022} +} +``` + +```bibtex +@article{Zhang2022Yitrans, + title = {The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task}, + author = {Zhang, Ziqiang and Ao, Junyi and Zhou, Long and Liu, Shujie and Wei, Furu and Li, Jinyu}, + eprint={2206.05777}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + year={2022} +} +``` + +```bibtex +@article{zhang2022speechut, + title = {SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training}, + author = {Zhang, Ziqiang and Zhou, Long and Ao, Junyi and Liu, Shujie and Dai, Lirong and Li, Jinyu and Wei, Furu}, + eprint={2210.03730}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + year={2022} +} +``` + +```bibtex +@article{zhang2022speechlm, + title = {SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data}, + author = {Zhang, Ziqiang and Chen, Sanyuan and Zhou, Long and Wu, Yu and Ren, Shuo and Liu, Shujie and Yao, Zhuoyuan and Gong, Xun and Dai, Lirong and Li, Jinyu and Wei, Furu}, + eprint={2209.15329}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + year={2022} +} +``` + +### Contact Information + +For help or issues using SpeechT5 models, please submit a GitHub issue. + +For other communications related to SpeechT5, please contact Long Zhou (`lozhou@microsoft.com`). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..869fdfe --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + diff --git a/Speech2C/README.md b/Speech2C/README.md new file mode 100644 index 0000000..9e56891 --- /dev/null +++ b/Speech2C/README.md @@ -0,0 +1,145 @@ +# Speech2C + +> [**Speech2C**](https://arxiv.org/abs/2203.17113) (```INTERSPEECH 2022```): **Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data** + +## Pre-Trained and Fine-tuned Models + +| Model | Pre-training Dataset | Fine-tuning Dataset | Model | +| :------: | :----------------------------------------------: | :-----------------: | :-----: | +| Speech2C | [960 hrs LibriSpeech](http://www.openslr.org/12) | - | [Google Drive](https://drive.google.com/file/d/1nGZ0LWEwlLq2pz7o805YALsMr9irV0Za/view?usp=sharing) | +| Speech2C | [960 hrs LibriSpeech](http://www.openslr.org/12) | [10 hrs LibriSpeech](http://www.openslr.org/12) | [Google Drive](https://drive.google.com/file/d/1nWSAc-33LmcDQHzH8IjXVJsuk0JZTWgN/view?usp=sharing) | +| Speech2C | [960 hrs LibriSpeech](http://www.openslr.org/12) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Google Drive](https://drive.google.com/file/d/1LwbQ5Y3tKZoK3s1ayLQgsfLTFnmkKNZs/view?usp=sharing) | + + +## Language Model and Vocabulary +| Model | Dataset | Model | Vocabulary | +| :------: | :------: | :---: | :--------: | +| LM | [LibriSpeech LM Dataset](https://www.openslr.org/11/) | [Model](https://drive.google.com/file/d/1UDCcNJT1DlquSRw0iRAXH6GHlf6zK6-8/view?usp=sharing) | [Vocabulary](https://dl.fbaipublicfiles.com/fairseq/wav2vec/dict.ltr.txt) | + +## Setup +``` +git submodule update --init Speech2C/fairseq +cd Speech2C/ +pip install --editable fairseq/ +``` + +## Data Preparation +Please follow the steps of data preparation for HuBERT in [here](https://github.com/facebookresearch/fairseq/tree/main/examples/hubert#data-preparation). + +## Pre-Training +``` +DATA_DIR= +LABEL_DIR= +FAIRSEQ_PATH= + +python ${FAIRSEQ_PATH}/fairseq_cli/hydra_train.py \ + --config-dir speech2c/config \ + --config-name speech2c_base_librispeech \ + task.data=${DATA_DIR} task.label_dir=${LABEL_DIR} task.labels='["km"]' \ + model.label_rate=50 common.user_dir=SpeechT5/Speech2C/speech2c \ +``` + +## Finetune + +``` +DATA_DIR= +LABEL_DIR= +FAIRSEQ_PATH= +W2V_PATH= +CONFIG_NAME= + +python ${FAIRSEQ_PATH}/fairseq_cli/hydra_train.py \ + --config-dir speech2c/config \ + --config-name ${CONFIG_NAME} \ + task.data=${DATA_DIR} task.label_dir=${LABEL_DIR} \ + model.w2v_path=${W2V_PATH} common.user_dir=SpeechT5/Speech2C/speech2c \ +``` + +## Inference +Note that joint CTC and decoder inference is only supported when the batch size is 1. + +``` +FAIRSEQ_PATH= +DATA_DIR= +LABEL_DIR= +BEAM_SIZE= +CTC_WEIGHT= +TEST_SET= +CHECKPOINT_PATH= +W2V_PATH= + + +python ${FAIRSEQ_PATH}/fairseq_cli/generate.py ${DATA_DIR} \ + --label-dir ${LABEL_DIR} \ + --path ${CHECKPOINT_PATH} \ + --user-dir SpeechT5/Speech2C/speech2c \ + --model-overrides "{'w2v_path': '${W2V_PATH}'}" \ + --gen-subset ${TEST_SET} \ + --task speech2c_pretraining \ + --post-process letter \ + --add-decoder \ + --labels '["ltr"]' \ + --fine-tuning \ + --scoring wer \ + --max-len-a 0 \ + --max-len-b 620 \ + --pad-audio \ + --random-crop \ + --ctc-weight ${CTC_WEIGHT} \ + --max-tokens 8000000 \ + --beam ${BEAM_SIZE} \ + --single-target \ +``` + +## Results on Librispeech + +### Evaluation on the [LibriSpeech](http://www.openslr.org/12) 10hr subset + +| Model |LM | test-clean | test-other | +| ------------- |------------- | ----| ----| +| wav2vec2.0 Base | - | 11.1 | 17.6 | +| HuBERT Base | - | 10.1 | 16.8 | +| **Speech2C** | - | **7.8** | **13.1** | +| wav2vec 2.0 Base | 4-gram | 4.3 |9.5 | +| wav2vec 2.0 Base | Transf. |3.2 |7.8 | +| HuBERT Base | 4-gram |4.3 |9.4 | +| **Speech2C** | **Transf.** | **3.1** | **7.0** | + +### Evaluation on the [LibriSpeech](http://www.openslr.org/12) 100hr subset + +| Model |LM | test-clean | test-other | +| ------------- |------------- | ----| ----| +| wav2vec2.0 Base | - | 6.1 | 13.3 | +| wav2vec2.0 Large | - | 4.7 | 9.0 | +| HuBERT Base | - | 6.3 | 13.2 | +| SpeechT5 | - | 4.4 | 10.4 | +| Baseline | - | 5.0 | 11.9 | +| **Speech2C** | - | **4.3** |**9.0** | +| wav2vec 2.0 Base | 4-gram | 3.4 |8.0 | +| wav2vec 2.0 Base | Transf. | 2.6 | 6.3 | +| HuBERT Base | 4-gram | 3.4 |8.1 | +| SpeechT5 | Transf. | 2.4 |5.8 | +| Baseline | Transf. | 2.5 |6.3 | +| **Speech2C** | **Transf.** | **2.4** |**5.2** | + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq). + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +## Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{Ao2022Speech2C, + title = {Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data}, + author = {Junyi Ao and Ziqiang Zhang and Long Zhou and Shujie Liu and Haizhou Li and Tom Ko and Lirong Dai and Jinyu Li and Yao Qian and Furu Wei}, + eprint={2203.17113}, + archivePrefix={arXiv}, + primaryClass={cs.SD}, + year={2022} +} +``` diff --git a/Speech2C/speech2c/__init__.py b/Speech2C/speech2c/__init__.py new file mode 100644 index 0000000..8994f9a --- /dev/null +++ b/Speech2C/speech2c/__init__.py @@ -0,0 +1 @@ +from . import data, tasks, criterions, models # noqa \ No newline at end of file diff --git a/Speech2C/speech2c/config/base_100h.yaml b/Speech2C/speech2c/config/base_100h.yaml new file mode 100644 index 0000000..2af86af --- /dev/null +++ b/Speech2C/speech2c/config/base_100h.yaml @@ -0,0 +1,93 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + no_epoch_checkpoints: true + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: speech2c_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: false # must be consistent with pre-training + labels: ["ltr"] + single_target: true + add_decoder: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100h + valid_subset: dev_other + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 80000 + lr: [0.00004] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speech2c_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + decoder_layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 25000 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2C/speech2c/config/base_10h.yaml b/Speech2C/speech2c/config/base_10h.yaml new file mode 100644 index 0000000..aaa4ed7 --- /dev/null +++ b/Speech2C/speech2c/config/base_10h.yaml @@ -0,0 +1,104 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 5 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: speech2c_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: false # must be consistent with pre-training + labels: ["ltr"] + single_target: true + add_decoder: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: ${model.freeze_finetune_updates} + validate_interval: 5 + train_subset: train_10h + valid_subset: dev_other + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 25000 + lr: [2e-5] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speech2c_ctc + w2v_path: ??? + apply_mask: true + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + decoder_layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2C/speech2c/config/speech2c_base_librispeech.yaml b/Speech2C/speech2c/config/speech2c_base_librispeech.yaml new file mode 100644 index 0000000..1f36137 --- /dev/null +++ b/Speech2C/speech2c/config/speech2c_base_librispeech.yaml @@ -0,0 +1,100 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 32 + distributed_port: 29671 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: speech2c_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: false # must be consistent with extractor + add_decoder: true + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: 5 + validate_interval_updates: 10000 + +criterion: + _name: speech2c + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: speech2c + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + decoder_dict_size: -1 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2C/speech2c/criterions/__init__.py b/Speech2C/speech2c/criterions/__init__.py new file mode 100644 index 0000000..69fc7d7 --- /dev/null +++ b/Speech2C/speech2c/criterions/__init__.py @@ -0,0 +1,10 @@ +import importlib +import os + + +for file in os.listdir(os.path.dirname(__file__)): + if file.endswith(".py") and not file.startswith("_"): + criterion_name = file[: file.find(".py")] + importlib.import_module( + "speech2c.criterions." + criterion_name + ) diff --git a/Speech2C/speech2c/criterions/ctc_ce.py b/Speech2C/speech2c/criterions/ctc_ce.py new file mode 100644 index 0000000..3992292 --- /dev/null +++ b/Speech2C/speech2c/criterions/ctc_ce.py @@ -0,0 +1,404 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import math +from argparse import Namespace +from dataclasses import dataclass, field +from omegaconf import II +from typing import Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass +from fairseq.data.data_utils import post_process +from fairseq.tasks import FairseqTask +from fairseq.logging.meters import safe_round + + +@dataclass +class CtcCeCriterionConfig(FairseqDataclass): + zero_infinity: bool = field( + default=False, + metadata={"help": "zero inf loss when source length <= target length"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + post_process: str = field( + default="letter", + metadata={ + "help": "how to post process predictions into words. can be letter, " + "wordpiece, BPE symbols, etc. " + "See fairseq.data.data_utils.post_process() for full list of options" + }, + ) + wer_kenlm_model: Optional[str] = field( + default=None, + metadata={ + "help": "if this is provided, use kenlm to compute wer (along with other wer_* args)" + }, + ) + wer_lexicon: Optional[str] = field( + default=None, + metadata={"help": "lexicon to use with wer_kenlm_model"}, + ) + wer_lm_weight: float = field( + default=2.0, + metadata={"help": "lm weight to use with wer_kenlm_model"}, + ) + wer_word_score: float = field( + default=-1.0, + metadata={"help": "lm word score to use with wer_kenlm_model"}, + ) + + wer_args: Optional[str] = field( + default=None, + metadata={ + "help": "DEPRECATED: tuple of (wer_kenlm_model, wer_lexicon, wer_lm_weight, wer_word_score)" + }, + ) + + dec_weight: float = field( + default=0.5, + metadata={"help": "weights for decoder CE Loss, loss will be ((1 - dec_weight) * hubert_loss + dec_weight * CE_Loss)"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.1, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + + +@register_criterion("ctc_ce", dataclass=CtcCeCriterionConfig) +class CtcCeCriterion(FairseqCriterion): + def __init__(self, cfg: CtcCeCriterionConfig, task: FairseqTask): + super().__init__(task) + self.blank_idx = ( + task.target_dictionary.index(task.blank_symbol) + if hasattr(task, "blank_symbol") + else 0 + ) + self.pad_idx = task.target_dictionary.pad() + self.eos_idx = task.target_dictionary.eos() + self.post_process = cfg.post_process + + if cfg.wer_args is not None: + ( + cfg.wer_kenlm_model, + cfg.wer_lexicon, + cfg.wer_lm_weight, + cfg.wer_word_score, + ) = eval(cfg.wer_args) + + if cfg.wer_kenlm_model is not None: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + dec_args = Namespace() + dec_args.nbest = 1 + dec_args.criterion = "ctc" + dec_args.kenlm_model = cfg.wer_kenlm_model + dec_args.lexicon = cfg.wer_lexicon + dec_args.beam = 50 + dec_args.beam_size_token = min(50, len(task.target_dictionary)) + dec_args.beam_threshold = min(50, len(task.target_dictionary)) + dec_args.lm_weight = cfg.wer_lm_weight + dec_args.word_score = cfg.wer_word_score + dec_args.unk_weight = -math.inf + dec_args.sil_weight = 0 + + self.w2l_decoder = W2lKenLMDecoder(dec_args, task.target_dictionary) + else: + self.w2l_decoder = None + + self.zero_infinity = cfg.zero_infinity + self.sentence_avg = cfg.sentence_avg + + self.dec_weight = cfg.dec_weight + self.report_accuracy = cfg.report_accuracy + self.ignore_prefix_size = cfg.ignore_prefix_size + self.eps = cfg.label_smoothing + + def forward(self, model, sample, reduce=True): + net_output = model(**sample["net_input"]) + lprobs = model.get_normalized_probs( + net_output, log_probs=True + ).contiguous() # (T, B, C) from the encoder + + if "src_lengths" in sample["net_input"]: + input_lengths = sample["net_input"]["src_lengths"] + else: + if net_output["padding_mask"] is not None: + non_padding_mask = ~net_output["padding_mask"] + input_lengths = non_padding_mask.long().sum(-1) + else: + input_lengths = lprobs.new_full( + (lprobs.size(1),), lprobs.size(0), dtype=torch.long + ) + + pad_mask = (sample["target"] != self.pad_idx) & ( + sample["target"] != self.eos_idx + ) + targets_flat = sample["target"].masked_select(pad_mask) + if "target_lengths" in sample: + target_lengths = sample["target_lengths"] + else: + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction="sum", + zero_infinity=self.zero_infinity, + ) + + ntokens = ( + sample["ntokens"] if "ntokens" in sample else target_lengths.sum().item() + ) + + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + + logging_output = {} + if "decoder_target" in sample: + dec_sample_size = sample["target"].size(0) if self.sentence_avg else sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + + logging_output = { + "loss": utils.item(loss.data), # * sample['ntokens'], + "ntokens": ntokens, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + **logging_output, + } + + if not model.training: + import editdistance + + with torch.no_grad(): + lprobs_t = lprobs.transpose(0, 1).float().contiguous().cpu() + + c_err = 0 + c_len = 0 + w_errs = 0 + w_len = 0 + wv_errs = 0 + for lp, t, inp_l in zip( + lprobs_t, + sample["target_label"] + if "target_label" in sample + else sample["target"], + input_lengths, + ): + lp = lp[:inp_l].unsqueeze(0) + + decoded = None + if self.w2l_decoder is not None: + decoded = self.w2l_decoder.decode(lp) + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + + p = (t != self.task.target_dictionary.pad()) & ( + t != self.task.target_dictionary.eos() + ) + targ = t[p] + targ_units = self.task.target_dictionary.string(targ) + targ_units_arr = targ.tolist() + + toks = lp.argmax(dim=-1).unique_consecutive() + pred_units_arr = toks[toks != self.blank_idx].tolist() + + c_err += editdistance.eval(pred_units_arr, targ_units_arr) + c_len += len(targ_units_arr) + + targ_words = post_process(targ_units, self.post_process).split() + + pred_units = self.task.target_dictionary.string(pred_units_arr) + pred_words_raw = post_process(pred_units, self.post_process).split() + + if decoded is not None and "words" in decoded: + pred_words = decoded["words"] + w_errs += editdistance.eval(pred_words, targ_words) + wv_errs += editdistance.eval(pred_words_raw, targ_words) + else: + dist = editdistance.eval(pred_words_raw, targ_words) + w_errs += dist + wv_errs += dist + + w_len += len(targ_words) + + logging_output["wv_errors"] = wv_errs + logging_output["w_errors"] = w_errs + logging_output["w_total"] = w_len + logging_output["c_errors"] = c_err + logging_output["c_total"] = c_len + + return loss, sample_size, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.pad_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.pad_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + c_errors = sum(log.get("c_errors", 0) for log in logging_outputs) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in logging_outputs) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in logging_outputs) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in logging_outputs) + metrics.log_scalar("_w_total", w_total) + + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + if "dec_loss" in logging_outputs[0]: + ctc_loss_sum = sum(log.get("ctc_loss", 0) for log in logging_outputs) + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "ctc_loss", ctc_loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/Speech2C/speech2c/criterions/speech2c_criterion.py b/Speech2C/speech2c/criterions/speech2c_criterion.py new file mode 100644 index 0000000..f6a695f --- /dev/null +++ b/Speech2C/speech2c/criterions/speech2c_criterion.py @@ -0,0 +1,261 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import math +import re +from dataclasses import dataclass, field + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.criterions.hubert_criterion import HubertCriterionConfig + +@dataclass +class Speech2cCriterionConfig(HubertCriterionConfig): + dec_weight: float = field( + default=1.0, + metadata={"help": "weights for decoder CE Loss, loss will be (hubert_loss + dec_weight * CE_Loss)"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + + +@register_criterion("speech2c", dataclass=Speech2cCriterionConfig) +class Speech2cCriterion(FairseqCriterion): + def __init__(self, task, pred_masked_weight, pred_nomask_weight, loss_weights=None, log_keys=None, dec_weight=1.0, report_accuracy=False, ignore_prefix_size=0, label_smoothing=0.0): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.dec_weight = dec_weight + self.report_accuracy = report_accuracy + self.ignore_prefix_size = ignore_prefix_size + self.eps = label_smoothing + self.padding_idx = task.dictionaries[0].pad() + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(target_list=sample["target_list"], **sample["net_input"]) + loss = 0.0 + sample_size = 0 + logging_output = {} + reduction = "sum" if reduce else "none" + + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_{i}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len( + self.loss_weights + ), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() + + if "decoder_target" in sample: + dec_sample_size = sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + loss = loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + + logging_output = { + "loss": loss.item() if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + **logging_output, + } + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + def compute_correct(logits): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == 0 + min = logits.argmin(-1) == 0 + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + corr_m, count_m = compute_correct(logp_m) + logging_output[f"correct_m_{i}"] = corr_m + logging_output[f"count_m_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + corr_u, count_u = compute_correct(logp_u) + logging_output[f"correct_u_{i}"] = corr_u + logging_output[f"count_u_{i}"] = count_u + + return loss, sample_size, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar("loss", loss_sum / sample_size / math.log(2), sample_size, round=3) + if sample_size != ntokens: + metrics.log_scalar("nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3) + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg)) + else: + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["loss"].avg)) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + if "dec_loss" in logging_outputs[0]: + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/Speech2C/speech2c/data/speech2c_dataset.py b/Speech2C/speech2c/data/speech2c_dataset.py new file mode 100644 index 0000000..7af1303 --- /dev/null +++ b/Speech2C/speech2c/data/speech2c_dataset.py @@ -0,0 +1,145 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import logging +from typing import Any, List, Optional, Union + +import torch +from fairseq.data import data_utils, Dictionary +from fairseq.data.audio.hubert_dataset import HubertDataset +logger = logging.getLogger(__name__) + + +class Speech2cDataset(HubertDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + tgt_dict: Optional[Dictionary] = None, + add_decoder: bool = False, + fine_tuning: bool = False, + ): + super().__init__( + manifest_path, + sample_rate, + label_paths, + label_rates, + pad_list, + eos_list, + label_processors, + max_keep_sample_size, + min_keep_sample_size, + max_sample_size, + shuffle, + pad_audio, + normalize, + store_labels, + random_crop, + single_target + ) + + self.tgt_dict = tgt_dict + self.add_decoder = add_decoder + self.fine_tuning = fine_tuning + + def collater(self, samples): + # target = max(sizes) -> random_crop not used + # target = max_sample_size -> random_crop used for long + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + collated_audios, padding_mask, audio_starts = self.collater_audio( + audios, audio_size + ) + + targets_by_label = [ + [s["label_list"][i] for s in samples] for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + if self.add_decoder: + if self.fine_tuning: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + else: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]].unique_consecutive(), torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + dec_ntokens = sum(x.size(0) for x in decoder_label) + decoder_target = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=False, + ) + decoder_target_lengths = torch.tensor( + [x.size(0) for x in decoder_label], dtype=torch.long + ) + prev_output_tokens = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=True, + ) + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "decoder_target": decoder_target, + "decoder_target_lengths": decoder_target_lengths, + "dec_ntokens": dec_ntokens, + } + else: + net_input = {"source": collated_audios, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch diff --git a/Speech2C/speech2c/models/modules/ctc_prefix_score.py b/Speech2C/speech2c/models/modules/ctc_prefix_score.py new file mode 100644 index 0000000..b42cbd8 --- /dev/null +++ b/Speech2C/speech2c/models/modules/ctc_prefix_score.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +# Copyright 2018 Mitsubishi Electric Research Labs (Takaaki Hori) +# Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + +import numpy as np +import six + + +class CTCPrefixScore(object): + """Compute CTC label sequence scores + which is based on Algorithm 2 in WATANABE et al. + "HYBRID CTC/ATTENTION ARCHITECTURE FOR END-TO-END SPEECH RECOGNITION," + but extended to efficiently compute the probablities of multiple labels + simultaneously + """ + + def __init__(self, x, blank, eos, xp): + self.xp = xp + self.logzero = -10000000000.0 + self.blank = blank + self.eos = eos + self.input_length = len(x) + self.x = x + + def initial_state(self): + """Obtain an initial CTC state + :return: CTC state + """ + # initial CTC state is made of a frame x 2 tensor that corresponds to + # r_t^n() and r_t^b(), where 0 and 1 of axis=1 represent + # superscripts n and b (non-blank and blank), respectively. + r = self.xp.full((self.input_length, 2), self.logzero, dtype=np.float32) + r[0, 1] = self.x[0, self.blank] + for i in six.moves.range(1, self.input_length): + r[i, 1] = r[i - 1, 1] + self.x[i, self.blank] + return r + + def __call__(self, y, cs, r_prev): + """Compute CTC prefix scores for next labels + :param y : prefix label sequence + :param cs : array of next labels + :param r_prev: previous CTC state + :return ctc_scores, ctc_states + """ + # initialize CTC states + output_length = len(y) - 1 # ignore sos + # new CTC states are prepared as a frame x (n or b) x n_labels tensor + # that corresponds to r_t^n(h) and r_t^b(h). + r = self.xp.ndarray((self.input_length, 2, len(cs)), dtype=np.float32) + xs = self.x[:, cs] + if output_length == 0: + r[0, 0] = xs[0] + r[0, 1] = self.logzero + else: + r[output_length - 1] = self.logzero + + # prepare forward probabilities for the last label + r_sum = self.xp.logaddexp( + r_prev[:, 0], r_prev[:, 1] + ) # log(r_t^n(g) + r_t^b(g)) + last = y[-1] + if output_length > 0 and last in cs: + log_phi = self.xp.ndarray((self.input_length, len(cs)), dtype=np.float32) + for i in six.moves.range(len(cs)): + log_phi[:, i] = r_sum if cs[i] != last else r_prev[:, 1] + else: + log_phi = r_sum + + # compute forward probabilities log(r_t^n(h)), log(r_t^b(h)), + # and log prefix probabilities log(psi) + start = max(output_length, 1) + log_psi = r[start - 1, 0] + for t in six.moves.range(start, self.input_length): + r[t, 0] = self.xp.logaddexp(r[t - 1, 0], log_phi[t - 1]) + xs[t] + r[t, 1] = ( + self.xp.logaddexp(r[t - 1, 0], r[t - 1, 1]) + self.x[t, self.blank] + ) + log_psi = self.xp.logaddexp(log_psi, log_phi[t - 1] + xs[t]) + + # get P(...eos|X) that ends with the prefix itself + eos_pos = self.xp.where(cs == self.eos)[0] + if len(eos_pos) > 0: + log_psi[eos_pos] = r_sum[-1] # log(r_T^n(g) + r_T^b(g)) + + # exclude blank probs + blank_pos = self.xp.where(cs == self.blank)[0] + if len(blank_pos) > 0: + log_psi[blank_pos] = self.logzero + + # return the log prefix probability and CTC states, where the label axis + # of the CTC states is moved to the first axis to slice it easily + return log_psi, self.xp.rollaxis(r, 2) diff --git a/Speech2C/speech2c/models/modules/multihead_attention.py b/Speech2C/speech2c/models/modules/multihead_attention.py new file mode 100644 index 0000000..7b1c144 --- /dev/null +++ b/Speech2C/speech2c/models/modules/multihead_attention.py @@ -0,0 +1,341 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + +from fairseq.modules import MultiheadAttention as FairseqMultiheadAttention + + +class MultiheadAttention(FairseqMultiheadAttention): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + ): + super().__init__( + embed_dim, + num_heads, + kdim, + vdim, + dropout, + bias, + add_bias_kv, + add_zero_attn, + self_attention, + encoder_decoder_attention, + q_noise, + qn_block_size, + ) + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + position_bias: Optional[Tensor] = None, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim, f"query dim {embed_dim} != {self.embed_dim}" + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + and position_bias is None + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + if position_bias is not None: ## first order + ## position_bias: [241, 241, 64] + #print ("attn_weights: ", attn_weights.size()) # [492, 241, 241] + reshape_q = q.contiguous().view(bsz * self.num_heads, -1, self.head_dim).transpose(0,1) #[241, 492, 64] + #print ("reshape_q: ", reshape_q.size()) + B = torch.matmul(reshape_q, position_bias.transpose(-2, -1)) + #print ("B: ", B.size()) ## [241, 492, 241] + #B = B.transpose(0, 1).view(bsz, self.num_heads, position_bias.size(0), position_bias.size(1)) + B = B.transpose(0, 1).view(bsz*self.num_heads, position_bias.size(0), position_bias.size(1)) + #print ("B 2: ", B.size()) + attn_weights += B + + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights diff --git a/Speech2C/speech2c/models/modules/relative_pos_enc.py b/Speech2C/speech2c/models/modules/relative_pos_enc.py new file mode 100644 index 0000000..2a073eb --- /dev/null +++ b/Speech2C/speech2c/models/modules/relative_pos_enc.py @@ -0,0 +1,35 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import torch + +class RelativePositionalEncoding(torch.nn.Module): + def __init__(self, d_model, maxlen=1000, embed_v=False): + super(RelativePositionalEncoding, self).__init__() + + self.d_model = d_model + self.maxlen = maxlen + self.pe_k = torch.nn.Embedding(2*maxlen, d_model) + if embed_v: + self.pe_v = torch.nn.Embedding(2*maxlen, d_model) + self.embed_v = embed_v + + + def forward(self, pos_seq, incremental_state=None): + pos_seq[pos_seq < -self.maxlen] = -self.maxlen + pos_seq[pos_seq >= self.maxlen] = self.maxlen - 1 + pos_seq = pos_seq + self.maxlen + + if incremental_state is not None: + pos_seq = pos_seq[-1:] + + if self.embed_v: + return self.pe_k(pos_seq), self.pe_v(pos_seq) + else: + return self.pe_k(pos_seq), None diff --git a/Speech2C/speech2c/models/modules/transformer_decoder.py b/Speech2C/speech2c/models/modules/transformer_decoder.py new file mode 100644 index 0000000..aaf4dce --- /dev/null +++ b/Speech2C/speech2c/models/modules/transformer_decoder.py @@ -0,0 +1,485 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import math +from typing import Any, Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqIncrementalDecoder +from fairseq.models.transformer import TransformerConfig +from fairseq.models.transformer.transformer_decoder import module_name_fordropout, Linear +from fairseq.modules import ( + AdaptiveSoftmax, + BaseLayer, + FairseqDropout, + LayerDropModuleList, + LayerNorm, + PositionalEmbedding, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor + + +from speech2c.models.modules.transformer_decoder_layer import TransformerDecoderLayerBase +from speech2c.models.modules.relative_pos_enc import RelativePositionalEncoding + + +class TransformerDecoderBase(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *cfg.decoder.layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + use_rel_pos_enc=False, + ): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.decoder_layerdrop = cfg.decoder.layerdrop + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = cfg.decoder.embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = cfg.decoder.output_dim + + self.padding_idx = embed_tokens.padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + self.max_target_positions, + embed_dim, + self.padding_idx, + learned=cfg.decoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + self.cross_self_attention = cfg.cross_self_attention + + self.use_rel_pos_enc = use_rel_pos_enc + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + self.build_decoder_layer(cfg, no_encoder_attn) + for _ in range(cfg.decoder.layers) + ] + ) + self.num_layers = len(self.layers) + + if cfg.decoder.normalize_before and not cfg.no_decoder_final_norm: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not cfg.tie_adaptive_weights + else None + ) + + self.adaptive_softmax = None + self.output_projection = output_projection + if self.output_projection is None: + self.build_output_projection(cfg, dictionary, embed_tokens) + + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(self.embed_dim // cfg.decoder.attention_heads, 24) + + def build_output_projection(self, cfg, dictionary, embed_tokens): + if cfg.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(cfg.adaptive_softmax_cutoff, type=int), + dropout=cfg.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if cfg.tie_adaptive_weights else None, + factor=cfg.adaptive_softmax_factor, + tie_proj=cfg.tie_adaptive_proj, + ) + elif self.share_input_output_embed: + self.output_projection = nn.Linear( + self.embed_tokens.weight.shape[1], + self.embed_tokens.weight.shape[0], + bias=False, + ) + self.output_projection.weight = self.embed_tokens.weight + else: + self.output_projection = nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + num_base_layers = cfg.base_layers + for i in range(num_base_layers): + self.layers.insert( + ((i + 1) * cfg.decoder.layers) // (num_base_layers + 1), + BaseLayer(cfg), + ) + + def build_decoder_layer(self, cfg, no_encoder_attn=False): + layer = TransformerDecoderLayerBase(cfg, no_encoder_attn, has_relative_attention_bias=self.use_rel_pos_enc) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + ) + + if not features_only: + x = self.output_layer(x) + return x, extra + + def extract_features_scriptable( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs, slen = prev_output_tokens.size() + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + pos_seq = torch.arange(0, slen).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, _ = self.pos_emb(pos_seq, incremental_state) + else: + pos_k = None + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + pos_bias=pos_k, + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def output_layer(self, features): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection(features) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim])), 1 + ) + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + if f"{name}.output_projection.weight" not in state_dict: + if self.share_input_output_embed: + embed_out_key = f"{name}.embed_tokens.weight" + else: + embed_out_key = f"{name}.embed_out" + if embed_out_key in state_dict: + state_dict[f"{name}.output_projection.weight"] = state_dict[ + embed_out_key + ] + if not self.share_input_output_embed: + del state_dict[embed_out_key] + + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +class TransformerDecoder(TransformerDecoderBase): + def __init__( + self, + args, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + ): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + no_encoder_attn=no_encoder_attn, + output_projection=output_projection, + use_rel_pos_enc=args.use_rel_pos_enc, + ) + + def build_output_projection(self, args, dictionary, embed_tokens): + super().build_output_projection( + TransformerConfig.from_namespace(args), dictionary, embed_tokens + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + return super().build_decoder_layer( + TransformerConfig.from_namespace(args), no_encoder_attn=no_encoder_attn + ) + +class TransformerDecoderScriptable(TransformerDecoder): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None + diff --git a/Speech2C/speech2c/models/modules/transformer_decoder_layer.py b/Speech2C/speech2c/models/modules/transformer_decoder_layer.py new file mode 100644 index 0000000..780bb43 --- /dev/null +++ b/Speech2C/speech2c/models/modules/transformer_decoder_layer.py @@ -0,0 +1,215 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from typing import Dict, List, Optional + +import torch +from torch import Tensor +from fairseq.modules.transformer_layer import TransformerDecoderLayerBase as FairseqTransformerDecoderLayerBase +from fairseq.modules import LayerNorm + +from speech2c.models.modules.multihead_attention import MultiheadAttention + + +class TransformerDecoderLayerBase(FairseqTransformerDecoderLayerBase): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.decoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, cfg, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False, has_relative_attention_bias=False + ): + super().__init__( + cfg, + no_encoder_attn, + add_bias_kv, + add_zero_attn, + ) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.decoder.attention_heads) + + def build_self_attention( + self, embed_dim, cfg, add_bias_kv=False, add_zero_attn=False + ): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + dropout=cfg.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=not cfg.cross_self_attention, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + ) + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + if self.c_attn is not None: + tgt_len, bsz = x.size(0), x.size(1) + x = x.view(tgt_len, bsz, self.nh, self.head_dim) + x = torch.einsum("tbhd,h->tbhd", x, self.c_attn) + x = x.reshape(tgt_len, bsz, self.embed_dim) + if self.attn_ln is not None: + x = self.attn_ln(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + if self.encoder_attn is not None and encoder_out is not None: + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + if self.ffn_layernorm is not None: + x = self.ffn_layernorm(x) + x = self.fc2(x) + x = self.dropout_module(x) + if self.w_resid is not None: + residual = torch.mul(self.w_resid, residual) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None + + def make_generation_fast_(self, need_attn: bool = False, **kwargs): + self.need_attn = need_attn diff --git a/Speech2C/speech2c/models/modules/transformer_encoder.py b/Speech2C/speech2c/models/modules/transformer_encoder.py new file mode 100644 index 0000000..6916c79 --- /dev/null +++ b/Speech2C/speech2c/models/modules/transformer_encoder.py @@ -0,0 +1,278 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import math + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.dataclass import ChoiceEnum +from fairseq.modules import ( + LayerNorm, + MultiheadAttention, + SamePad, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.utils import index_put +from fairseq.distributed import fsdp_wrap +from fairseq.models.wav2vec.utils import pad_to_multiple +from fairseq.models.wav2vec.wav2vec2 import TransformerEncoder as W2vTransformerEncoder + +from speech2c.models.modules.relative_pos_enc import RelativePositionalEncoding +from speech2c.models.modules.multihead_attention import MultiheadAttention + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +class TransformerEncoder(W2vTransformerEncoder): + def __init__(self, args): + super().__init__(args) + + self.dropout = args.dropout + self.embedding_dim = args.encoder_embed_dim + self.required_seq_len_multiple = args.required_seq_len_multiple + self.use_rel_pos_enc = getattr(args, "use_rel_pos_enc", False) + + self.pos_conv = nn.Conv1d( + self.embedding_dim, + self.embedding_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * self.embedding_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + layers = [] + for _ in range(args.encoder_layers): + layer = TransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=self.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + has_relative_attention_bias=self.use_rel_pos_enc, + ) + if args.checkpoint_activations: + layer = fsdp_wrap(layer) + layer = checkpoint_wrapper(layer) + layers.append(layer) + self.layers = nn.ModuleList(layers) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(self.embedding_dim) + self.layerdrop = args.encoder_layerdrop + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim // args.encoder_attention_heads, 160) + + + self.apply(init_bert_params) + + def forward(self, x, padding_mask=None, layer=None): + x, layer_results = self.extract_features(x, padding_mask, layer) + + if self.layer_norm_first and layer is None: + x = self.layer_norm(x) + + return x, layer_results + + def extract_features(self, x, padding_mask=None, tgt_layer=None): + + if padding_mask is not None: + x = index_put(x, padding_mask, 0) + + x_conv = self.pos_conv(x.transpose(1, 2)) + x_conv = x_conv.transpose(1, 2) + x = x + x_conv + + if not self.layer_norm_first: + x = self.layer_norm(x) + + # pad to the sequence length dimension + x, pad_length = pad_to_multiple( + x, self.required_seq_len_multiple, dim=-2, value=0 + ) + if pad_length > 0 and padding_mask is None: + padding_mask = x.new_zeros((x.size(0), x.size(1)), dtype=torch.bool) + padding_mask[:, -pad_length:] = True + else: + padding_mask, _ = pad_to_multiple( + padding_mask, self.required_seq_len_multiple, dim=-1, value=True + ) + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + layer_results = [] + r = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, z = layer(x, self_attn_padding_mask=padding_mask, need_weights=False, pos_bias=pos_k) + if tgt_layer is not None: + # unpad if needed + if pad_length > 0: + layer_results.append( + ( + x[:-pad_length], + z[:, :-pad_length, :-pad_length] + if z is not None + else z, + ) + ) + else: + layer_results.append((x, z)) + if i == tgt_layer: + r = x + break + + if r is not None: + x = r + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + # undo paddding + if pad_length > 0: + x = x[:, :-pad_length] + + return x, layer_results + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + has_relative_attention_bias: bool = False, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embedding_dim//num_attention_heads) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + pos_bias=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + position_bias=pos_bias, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn diff --git a/Speech2C/speech2c/models/speech2c.py b/Speech2C/speech2c/models/speech2c.py new file mode 100644 index 0000000..7ec69a6 --- /dev/null +++ b/Speech2C/speech2c/models/speech2c.py @@ -0,0 +1,321 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import logging +import copy +import contextlib +from typing import Dict, List, Optional, Tuple + +import torch +from dataclasses import dataclass, field +from fairseq.data.dictionary import Dictionary +from fairseq.models import register_model +from fairseq.models.hubert import HubertConfig, HubertModel +from fairseq.models.transformer import Embedding +from torch import Tensor +from speech2c.tasks.speech2c_pretraining import ( + Speech2cPretrainingConfig, + Speech2cPretrainingTask, +) + +from speech2c.models.modules.transformer_decoder import TransformerDecoderScriptable +from speech2c.models.modules.transformer_encoder import TransformerEncoder + +logger = logging.getLogger(__name__) + + +@dataclass +class Speech2cConfig(HubertConfig): + use_rel_pos_enc: bool = field( + default=False, + metadata={"help": "whether to use relative positional encoding"}, + ) + + # decoder + decoder_layers: int = field( + default=6, metadata={"help": "num decoder layers in the transformer"} + ) + decoder_embed_dim: int = field( + default=768, metadata={"help": "decoder embedding dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_attention_heads: int = field( + default=12, metadata={"help": "num decoder attention heads"} + ) + decoder_normalize_before: bool = field( + default=False, + metadata={"help": "apply layernorm before each decoder block"}, + ) + decoder_layerdrop: float = field( + default=0.0, + metadata={"help": "probability of dropping a tarnsformer layer"}, + ) + share_decoder_input_output_embed: bool = field( + default=False, + metadata={"help": "share decoder input and output embeddings"}, + ) + decoder_output_dim: int = field( + default=768, metadata={"help": "decoder output dimension"} + ) + max_target_positions: int = field( + default=3000, metadata={"help": "max target position"} + ) + no_scale_embedding: bool = field( + default=False, + metadata={"help": "not scale embedding"}, + ) + adaptive_input: bool = field( + default=False, + metadata={"help": "adaptive input"}, + ) + quant_noise_pq: int = field( + default=0, metadata={"help": "quant noise pq"} + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "decoder learnable positional embedding"}, + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={"help": "no token positional embeddings"}, + ) + decoder_dict_size: int = field( + default=-1, + metadata={"help": "decoder dictionary dimension, only used for fine-tuning"}, + ) + + # FP16 optimization + required_seq_len_multiple: int = field( + default=1, + metadata={ + "help": "pad the input to encoder such that the sequence length is divisible by multiple" + }, + ) + crop_seq_to_multiple: int = field( + default=1, + metadata={ + "help": "crop convolutional feature extractor output such that the sequence length is divisible by multiple" + }, + ) + + +@register_model("speech2c", dataclass=Speech2cConfig) +class Speech2cModel(HubertModel): + def __init__( + self, + cfg: Speech2cConfig, + task_cfg: Speech2cPretrainingConfig, + dictionaries: List[Dictionary], + ) -> None: + super().__init__(cfg, task_cfg, dictionaries) + logger.info(f"Speech2cModel Config: {cfg}") + + self.encoder = TransformerEncoder(cfg) + + self.add_decoder = task_cfg.add_decoder + if task_cfg.add_decoder: + def build_embedding(dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + # To make sure that the decoder dict size is the same as the fine-tuning tgt_dict size + cut_dictionary = copy.deepcopy(dictionaries[0]) + if cfg.decoder_dict_size != -1: + cut_dictionary.symbols = cut_dictionary.symbols[:cfg.decoder_dict_size] + + decoder_embed_tokens = build_embedding( + cut_dictionary, cfg.decoder_embed_dim + ) + + self.decoder = TransformerDecoderScriptable(cfg, cut_dictionary, decoder_embed_tokens) + + + @classmethod + def build_model(cls, cfg: Speech2cConfig, task: Speech2cPretrainingTask): + """Build a new model instance.""" + + model = Speech2cModel(cfg, task.cfg, task.dictionaries) + return model + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + # net_output['encoder_out'] is a (B, T, D) tensor + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def forward( + self, + source: torch.Tensor, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + prev_output_tokens: Optional[torch.Tensor] = None, + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + features = self.forward_features(source) + if target_list is not None: + features, target_list = self.forward_targets(features, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + if mask: + x, mask_indices = self.apply_mask(features, padding_mask, target_list) + else: + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1, + ) + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features} + + def compute_pred(proj_x, target, label_embs): + # compute logits for the i-th label set + y = torch.index_select(label_embs, 0, target.long()) + negs = label_embs.unsqueeze(1).expand(-1, proj_x.size(0), -1) + if self.target_glu: + y = self.target_glu(y) + negs = self.target_glu(negs) + # proj_x: (S, D) + # y: (S, D) + # negs: (Neg, S, D) + return self.compute_nce(proj_x, y, negs) + + label_embs_list = self.label_embs_concat.split(self.num_classes, 0) + + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = self.final_proj(x[masked_indices]) + if self.untie_final_proj: + proj_x_m_list = proj_x_m.chunk(len(target_list), dim=-1) + else: + proj_x_m_list = [proj_x_m for _ in range(len(target_list))] + logit_m_list = [ + compute_pred(proj_x_m, t[masked_indices], label_embs_list[i]) + for i, (proj_x_m, t) in enumerate(zip(proj_x_m_list, target_list)) + ] + else: + logit_m_list = [None for _ in target_list] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = self.final_proj(x[nomask_indices]) + if self.untie_final_proj: + proj_x_u_list = proj_x_u.chunk(len(target_list), dim=-1) + else: + proj_x_u_list = [proj_x_u for _ in range(len(target_list))] + + logit_u_list = [ + compute_pred(proj_x_u, t[nomask_indices], label_embs_list[i]) + for i, (proj_x_u, t) in enumerate(zip(proj_x_u_list, target_list)) + ] + else: + logit_u_list = [None for _ in target_list] + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + if self.add_decoder: + encoder_out = { + "encoder_out": [x.transpose(0, 1)], # T x B x C + "encoder_padding_mask": [padding_mask], # B x T + } + assert prev_output_tokens is not None + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, encoder_out=encoder_out + ) + result['decoder_out'] = decoder_out + return result + + def forward_torchscript(self, net_input: Dict[str, Tensor]): + """A TorchScript-compatible version of forward. + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + res = self.forward( + net_input["source"], + padding_mask=net_input["padding_mask"], + mask=False, + features_only=True + ) + + encoder_out = { + "encoder_out": [res["x"].transpose(0, 1)], # T x B x C + "encoder_padding_mask": [res["padding_mask"]], # B x T + } + return encoder_out + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + prev_output_tokens: Optional[torch.Tensor] = None, + ft: bool = True, + ) -> Tuple[torch.Tensor, torch.Tensor]: + with torch.no_grad() if not ft else contextlib.ExitStack(): + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + + feature = res["features"] if ret_conv else res["x"] + if self.add_decoder: + encoder_out = { + "encoder_out": [feature.transpose(0, 1)], # T x B x C + "encoder_padding_mask": [res["padding_mask"]], # B x T + } + assert prev_output_tokens is not None + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + ) + else: + decoder_out = None + return feature, res["padding_mask"], decoder_out diff --git a/Speech2C/speech2c/models/speech2c_asr.py b/Speech2C/speech2c/models/speech2c_asr.py new file mode 100644 index 0000000..9bf8aed --- /dev/null +++ b/Speech2C/speech2c/models/speech2c_asr.py @@ -0,0 +1,276 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from argparse import Namespace +from omegaconf import II + +import torch.nn as nn +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, register_model +from fairseq.models.hubert.hubert_asr import HubertAsrConfig, Linear +from fairseq.tasks import FairseqTask + + +@dataclass +class Speech2cAsrConfig(HubertAsrConfig): + # for decoder + decoder_layerdrop: float = field( + default=0.0, + metadata={"help": "probability of dropping a decoder layer in hubert"}, + ) + + add_decoder: bool = II("task.add_decoder") + +@dataclass +class Speech2cCtcConfig(Speech2cAsrConfig): + pass + + +@register_model("speech2c_ctc", dataclass=Speech2cCtcConfig) +class Speech2cCtc(BaseFairseqModel): + def __init__(self, cfg: Speech2cCtcConfig, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: Speech2cCtcConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = Speech2cEncoder(cfg, task.target_dictionary) + return cls(cfg, w2v_encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + if "encoder_out" not in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output, log_probs, sample) + + if "encoder_out_for_ctc" in net_output: + logits = net_output["encoder_out_for_ctc"] + else: + logits = net_output["encoder_out"] + + if isinstance(logits, list): + logits = logits[0] + + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + def get_logits(self, net_output): + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + @property + def encoder(self): + return self.w2v_encoder + + def reorder_encoder_out(self, encoder_out, new_order): + return self.encoder.reorder_encoder_out(encoder_out, new_order) + + @property + def decoder(self): + return self.w2v_encoder.w2v_model.decoder + + +class Speech2cEncoder(FairseqEncoder): + def __init__(self, cfg: Speech2cAsrConfig, tgt_dict=None): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "decoder_layerdrop": cfg.decoder_layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + "decoder_dict_size": len(tgt_dict) if cfg.add_decoder else -1, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + assert cfg.normalize == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + w2v_args.task.data = cfg.data + w2v_args.task.add_decoder = cfg.add_decoder + task = tasks.setup_task(w2v_args.task) + if state is not None and "task_state" in state: + # This will load the stored "dictionaries" object + task.load_state_dict(state["task_state"]) + model = task.build_model(w2v_args.model) + + if state is not None and not cfg.no_pretrained_weights: + if "decoder.embed_tokens.weight" in state["model"]: + del state["model"]["decoder.embed_tokens.weight"] + if "decoder.output_projection.weight" in state["model"]: + del state["model"]["decoder.output_projection.weight"] + # set strict=False because we omit some modules + model.load_state_dict(state["model"], strict=False) + + model.remove_pretraining_modules() + + super().__init__(task.source_dictionary) + + d = model.mask_emb.size(0) + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.num_updates = 0 + + if tgt_dict is not None: + self.proj = Linear(d, len(tgt_dict)) + elif getattr(cfg, "decoder_embed_dim", d) != d: + self.proj = Linear(d, cfg.decoder_embed_dim) + else: + self.proj = None + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, source, padding_mask, prev_output_tokens=None, tbc=True, **kwargs): + + ft = self.freeze_finetune_updates <= self.num_updates + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + "prev_output_tokens": prev_output_tokens, + "ft": ft, + } + + x, padding_mask, decoder_out = self.w2v_model.extract_features(**w2v_args) + + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + if self.proj: + x = self.proj(x) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": padding_mask, # B x T + "padding_mask": padding_mask, + "decoder_out": decoder_out, + } + + def get_normalized_probs_decoder(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + return self.w2v_model.get_normalized_probs(net_output, log_probs, sample) + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + if isinstance(encoder_out["encoder_out"], list): + encoder_out["encoder_out"] = ( + [] if len(encoder_out["encoder_out"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out"]] + ) + else: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + if isinstance(encoder_out["encoder_padding_mask"], list): + encoder_out["encoder_padding_mask"] = ( + [] if len(encoder_out["encoder_padding_mask"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"]] + ) + else: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + if "decoder_out" in encoder_out and encoder_out["decoder_out"] is not None: + if isinstance(encoder_out["decoder_out"], list): + encoder_out["decoder_out"] = ( + [] if len(encoder_out["decoder_out"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["decoder_out"]] + ) + else: + encoder_out["decoder_out"] = encoder_out[ + "decoder_out" + ].index_select(0, new_order) + if "encoder_out_for_ctc" in encoder_out and encoder_out["encoder_out_for_ctc"] is not None: + if isinstance(encoder_out["encoder_out_for_ctc"], list): + encoder_out["encoder_out_for_ctc"] = ( + [] if len(encoder_out["encoder_out_for_ctc"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out_for_ctc"]] + ) + else: + encoder_out["encoder_out_for_ctc"] = encoder_out[ + "encoder_out_for_ctc" + ].index_select(1, new_order) + + return encoder_out + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + encoder_out = self.w2v_model.forward_torchscript(net_input) + + assert self.proj is not None + encoder_out['encoder_out_for_ctc'] = [self.proj(encoder_out['encoder_out'][0])] + + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + diff --git a/Speech2C/speech2c/models/t5_transformer_lm.py b/Speech2C/speech2c/models/t5_transformer_lm.py new file mode 100644 index 0000000..3d16a2d --- /dev/null +++ b/Speech2C/speech2c/models/t5_transformer_lm.py @@ -0,0 +1,25 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from fairseq.models import ( + register_model_architecture, +) +from fairseq.models.transformer_lm import base_lm_architecture + + +@register_model_architecture(model_name="transformer_lm", arch_name="transformer_lm_t5") +def transformer_lm_t5(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1280) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 6144) + args.decoder_layers = getattr(args, "decoder_layers", 20) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) diff --git a/Speech2C/speech2c/squence_generator.py b/Speech2C/speech2c/squence_generator.py new file mode 100644 index 0000000..e51e802 --- /dev/null +++ b/Speech2C/speech2c/squence_generator.py @@ -0,0 +1,1028 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import math +from typing import Dict, List, Optional +import sys + +import torch +import torch.nn as nn +from fairseq import search, utils +from fairseq.data import data_utils +from fairseq.models import FairseqIncrementalDecoder +from torch import Tensor +from fairseq.ngram_repeat_block import NGramRepeatBlock +from speech2c.models.modules.ctc_prefix_score import CTCPrefixScore +import numpy + + +CTC_SCORING_RATIO = 7.0 + +class SequenceGenerator(nn.Module): + def __init__( + self, + models, + tgt_dict, + beam_size=1, + max_len_a=0, + max_len_b=200, + max_len=0, + min_len=1, + normalize_scores=True, + len_penalty=1.0, + unk_penalty=0.0, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + search_strategy=None, + eos=None, + symbols_to_strip_from_output=None, + lm_model=None, + lm_weight=1.0, + ctc_weight=0.0, + ): + """Generates translations of a given source sentence. + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models, + currently support fairseq.models.TransformerModel for scripting + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + max_len (int, optional): the maximum length of the generated output + (not including end-of-sentence) + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + """ + super().__init__() + if isinstance(models, EnsembleModel): + self.model = models + else: + self.model = EnsembleModel(models) + self.tgt_dict = tgt_dict + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() if eos is None else eos + self.blank = self.tgt_dict.index("") + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos}) + if symbols_to_strip_from_output is not None + else {self.eos} + ) + self.vocab_size = len(tgt_dict) + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.max_len = max_len or self.model.max_decoder_positions() + + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.temperature = temperature + self.match_source_len = match_source_len + + if no_repeat_ngram_size > 0: + self.repeat_ngram_blocker = NGramRepeatBlock(no_repeat_ngram_size) + else: + self.repeat_ngram_blocker = None + + assert temperature > 0, "--temperature must be greater than 0" + + self.search = ( + search.BeamSearch(tgt_dict) if search_strategy is None else search_strategy + ) + # We only need to set src_lengths in LengthConstrainedBeamSearch. + # As a module attribute, setting it would break in multithread + # settings when the model is shared. + self.should_set_src_lengths = ( + hasattr(self.search, "needs_src_lengths") and self.search.needs_src_lengths + ) + + self.model.eval() + + self.lm_model = lm_model + self.lm_weight = lm_weight + self.ctc_weight = ctc_weight + if self.lm_model is not None: + self.lm_model.eval() + + def cuda(self): + self.model.cuda() + return self + + @torch.no_grad() + def forward( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + """Generate a batch of translations. + Args: + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, prefix_tokens, bos_token=bos_token) + + # TODO(myleott): unused, deprecate after pytorch-translate migration + def generate_batched_itr(self, data_itr, beam_size=None, cuda=False, timer=None): + """Iterate over a batched dataset and yield individual translations. + Args: + cuda (bool, optional): use GPU for generation + timer (StopwatchMeter, optional): time generations + """ + for sample in data_itr: + s = utils.move_to_cuda(sample) if cuda else sample + if "net_input" not in s: + continue + input = s["net_input"] + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in input.items() if k != "prev_output_tokens" + } + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate(encoder_input) + if timer is not None: + timer.stop(sum(len(h[0]["tokens"]) for h in hypos)) + for i, id in enumerate(s["id"].data): + # remove padding + src = utils.strip_pad(input["src_tokens"].data[i, :], self.pad) + ref = ( + utils.strip_pad(s["target"].data[i, :], self.pad) + if s["target"] is not None + else None + ) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate(self, models, sample: Dict[str, Dict[str, Tensor]], **kwargs) -> List[List[Dict[str, Tensor]]]: + """Generate translations. Match the api of other fairseq generators. + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + constraints (torch.LongTensor, optional): force decoder to include + the list of constraints + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, **kwargs) + + def _generate( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + constraints: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(self.model.models_size) + ], + ) + net_input = sample["net_input"] + + if "src_tokens" in net_input: + src_tokens = net_input["src_tokens"] + # length of the source text being the character length except EndOfSentence and pad + src_lengths = ( + (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)).long().sum(dim=1) + ) + elif "source" in net_input: + src_tokens = net_input["source"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + elif "features" in net_input: + src_tokens = net_input["features"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + else: + raise Exception("expected src_tokens or source in net input. input keys: " + str(net_input.keys())) + + # bsz: total number of sentences in beam + # Note that src_tokens may have more than 2 dimensions (i.e. audio features) + bsz, src_len = src_tokens.size()[:2] + beam_size = self.beam_size + + if constraints is not None and not self.search.supports_constraints: + raise NotImplementedError( + "Target-side constraints were provided, but search method doesn't support them" + ) + + # Initialize constraints, when active + self.search.init_constraints(constraints, beam_size) + + max_len: int = -1 + if self.match_source_len: + max_len = src_lengths.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + self.max_len - 1, + ) + assert ( + self.min_len <= max_len + ), "min_len cannot be larger than max_len, please adjust these!" + # compute the encoder output for each beam + with torch.autograd.profiler.record_function("EnsembleModel: forward_encoder"): + encoder_outs = self.model.forward_encoder(net_input) + + # Get CTC lprobs and prep ctc_scorer + if self.ctc_weight > 0: + ctc_lprobs = self.model.models[0].get_normalized_probs( + encoder_outs[0], log_probs=True + ).contiguous().transpose(0, 1) # (B, T, C) from the encoder + + hyp = {} + ctc_prefix_score = CTCPrefixScore(ctc_lprobs[0].detach().cpu().numpy(), self.blank, self.eos, numpy) + hyp["ctc_state_prev"] = ctc_prefix_score.initial_state() + hyp["ctc_score_prev"] = 0.0 + ctc_beam = min(ctc_lprobs.shape[-1], int(beam_size * CTC_SCORING_RATIO)) + ctc_hyps = {str(self.eos): hyp} + + # placeholder of indices for bsz * beam_size to hold tokens and accumulative scores + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(src_tokens.device).long() + encoder_outs = self.model.reorder_encoder_out(encoder_outs, new_order) + # ensure encoder_outs is a List. + assert encoder_outs is not None + + # initialize buffers + scores = ( + torch.zeros(bsz * beam_size, max_len + 1).to(src_tokens).float() + ) # +1 for eos; pad is never chosen for scoring + tokens = ( + torch.zeros(bsz * beam_size, max_len + 2) + .to(src_tokens) + .long() + .fill_(self.pad) + ) # +2 for eos and pad + tokens[:, 0] = self.eos if bos_token is None else bos_token + attn: Optional[Tensor] = None + + # A list that indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = ( + torch.zeros(bsz, beam_size).to(src_tokens).eq(-1) + ) # forward and backward-compatible False mask + + # list of completed sentences + finalized = torch.jit.annotate( + List[List[Dict[str, Tensor]]], + [torch.jit.annotate(List[Dict[str, Tensor]], []) for i in range(bsz)], + ) # contains lists of dictionaries of infomation about the hypothesis being finalized at each step + + # a boolean array indicating if the sentence at the index is finished or not + finished = [False for i in range(bsz)] + num_remaining_sent = bsz # number of sentences remaining + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = ( + (torch.arange(0, bsz) * beam_size) + .unsqueeze(1) + .type_as(tokens) + .to(src_tokens.device) + ) + cand_offsets = torch.arange(0, cand_size).type_as(tokens).to(src_tokens.device) + + reorder_state: Optional[Tensor] = None + batch_idxs: Optional[Tensor] = None + + original_batch_idxs: Optional[Tensor] = None + if "id" in sample and isinstance(sample["id"], Tensor): + original_batch_idxs = sample["id"] + else: + original_batch_idxs = torch.arange(0, bsz).type_as(tokens) + + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as( + batch_idxs + ) + reorder_state.view(-1, beam_size).add_( + corr.unsqueeze(-1) * beam_size + ) + original_batch_idxs = original_batch_idxs[batch_idxs] + self.model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = self.model.reorder_encoder_out( + encoder_outs, reorder_state + ) + with torch.autograd.profiler.record_function("EnsembleModel: forward_decoder"): + lprobs, avg_attn_scores = self.model.forward_decoder( + tokens[:, : step + 1], + encoder_outs, + incremental_states, + self.temperature, + ) + + if self.ctc_weight > 0 and step != 0: + # lprobs[:, self.blank] = -math.inf # never select blank + ctc_lprobs = lprobs.clone() + ctc_lprobs[:, self.blank] = -math.inf # never select blank + _, local_best_ids = torch.topk(ctc_lprobs, ctc_beam, dim=-1) + for b in range(tokens.size(0)): + hyp_key = " ".join(str(x) for x in tokens[b, : step + 1].tolist()) + ctc_scores, ctc_states = ctc_prefix_score( + tokens[b, : step + 1].cpu(), local_best_ids[b].cpu(), ctc_hyps[hyp_key]["ctc_state_prev"] + ) + lprobs[b] = lprobs[b] + lprobs[b, local_best_ids[b]] = (1 - self.ctc_weight) * (lprobs[b, local_best_ids[b]]) + self.ctc_weight * torch.from_numpy( + ctc_scores - ctc_hyps[hyp_key]["ctc_score_prev"] + ).to(device="cuda") + for j in range(len(local_best_ids[b])): + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())] = {} + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_score_prev"] = ctc_scores[j] + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_state_prev"] = ctc_states[j] + + elif self.ctc_weight > 0 and step == 0: + ctc_lprobs = lprobs.clone() + ctc_lprobs[:, self.blank] = -math.inf # never select blank + _, local_best_ids = torch.topk(ctc_lprobs, ctc_beam, dim=-1) + for b in range(tokens.size(0)): + hyp_key = " ".join(str(x) for x in tokens[b, : step + 1].tolist()) + ctc_scores, ctc_states = ctc_prefix_score( + tokens[b, : step + 1].cpu(), local_best_ids[b].cpu(), ctc_hyps[hyp_key]["ctc_state_prev"] + ) + lprobs[b] = lprobs[b] + lprobs[b, local_best_ids[b]] = (1 - self.ctc_weight) * (lprobs[b, local_best_ids[b]]) + self.ctc_weight * torch.from_numpy( + ctc_scores - ctc_hyps[hyp_key]["ctc_score_prev"] + ).to(device="cuda") + for j in range(len(local_best_ids[b])): + if b == 0: + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())] = {} + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_score_prev"] = ctc_scores[j] + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_state_prev"] = ctc_states[j] + + if self.lm_model is not None: + lm_out = self.lm_model(tokens[:, : step + 1]) + probs = self.lm_model.get_normalized_probs( + lm_out, log_probs=True, sample=None + ) + probs = probs[:, -1, :] * self.lm_weight + lprobs += probs + # handle prefix tokens (possibly with different lengths) + if ( + prefix_tokens is not None + and step < prefix_tokens.size(1) + and step < max_len + ): + lprobs, tokens, scores = self._prefix_tokens( + step, lprobs, scores, tokens, prefix_tokens, beam_size + ) + elif step < self.min_len: + # minimum length constraint (does not apply if using prefix_tokens) + lprobs[:, self.eos] = -math.inf + + lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs) + + lprobs[:, self.pad] = -math.inf # never select pad + lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + lprobs[:, self.blank] = -math.inf # never select blank + + # handle max length constraint + if step >= max_len: + lprobs[:, : self.eos] = -math.inf + lprobs[:, self.eos + 1 :] = -math.inf + + # Record attention scores, only support avg_attn_scores is a Tensor + if avg_attn_scores is not None: + if attn is None: + attn = torch.empty( + bsz * beam_size, avg_attn_scores.size(1), max_len + 2 + ).to(scores) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(lprobs) + eos_bbsz_idx = torch.empty(0).to( + tokens + ) # indices of hypothesis ending with eos (finished sentences) + eos_scores = torch.empty(0).to( + scores + ) # scores of hypothesis ending with eos (finished sentences) + + if self.should_set_src_lengths: + self.search.set_src_lengths(src_lengths) + + if self.repeat_ngram_blocker is not None: + lprobs = self.repeat_ngram_blocker(tokens, lprobs, bsz, beam_size, step) + + # Shape: (batch, cand_size) + cand_scores, cand_indices, cand_beams = self.search.step( + step, + lprobs.view(bsz, -1, self.vocab_size), + scores.view(bsz, beam_size, -1)[:, :, :step], + tokens[:, : step + 1], + original_batch_idxs, + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos + # Shape of eos_mask: (batch size, beam size) + eos_mask = cand_indices.eq(self.eos) & cand_scores.ne(-math.inf) + eos_mask[:, :beam_size][cands_to_ignore] = torch.tensor(0).to(eos_mask) + + # only consider eos when it's among the top beam_size indices + # Now we know what beam item(s) to finish + # Shape: 1d list of absolute-numbered + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents: List[int] = [] + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + cand_scores[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = self.finalize_hypos( + step, + eos_bbsz_idx, + eos_scores, + tokens, + scores, + finalized, + finished, + beam_size, + attn, + src_lengths, + max_len, + ) + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + if self.search.stop_on_max_len and step >= max_len: + break + assert step < max_len, f"{step} < {max_len}" + + # Remove finalized sentences (ones for which {beam_size} + # finished hypotheses have been generated) from the batch. + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = torch.ones( + bsz, dtype=torch.bool, device=cand_indices.device + ) + batch_mask[finalized_sents] = False + # TODO replace `nonzero(as_tuple=False)` after TorchScript supports it + batch_idxs = torch.arange( + bsz, device=cand_indices.device + ).masked_select(batch_mask) + + # Choose the subset of the hypothesized constraints that will continue + self.search.prune_sentences(batch_idxs) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + cand_scores = cand_scores[batch_idxs] + cand_indices = cand_indices[batch_idxs] + + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths = src_lengths[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view( + new_bsz * beam_size, attn.size(1), -1 + ) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos hypos + # and values < cand_size indicate candidate active hypos. + # After, the min values per row are the top candidate active hypos + + # Rewrite the operator since the element wise or is not supported in torchscript. + + eos_mask[:, :beam_size] = ~((~cands_to_ignore) & (~eos_mask[:, :beam_size])) + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just + # the hypos with the smallest values in active_mask. + # {active_hypos} indicates which {beam_size} hypotheses + # from the list of {2 * beam_size} candidates were + # selected. Shapes: (batch size, beam size) + new_cands_to_ignore, active_hypos = torch.topk( + active_mask, k=beam_size, dim=1, largest=False + ) + + # update cands_to_ignore to ignore any finalized hypos. + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + # Make sure there is at least one active item for each sentence in the batch. + assert (~cands_to_ignore).any(dim=1).all() + + # update cands_to_ignore to ignore any finalized hypos + + # {active_bbsz_idx} denotes which beam number is continued for each new hypothesis (a beam + # can be selected more than once). + active_bbsz_idx = torch.gather(cand_bbsz_idx, dim=1, index=active_hypos) + active_scores = torch.gather(cand_scores, dim=1, index=active_hypos) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + + # Set the tokens for each beam (can select the same row more than once) + tokens[:, : step + 1] = torch.index_select( + tokens[:, : step + 1], dim=0, index=active_bbsz_idx + ) + # Select the next token for each of them + tokens.view(bsz, beam_size, -1)[:, :, step + 1] = torch.gather( + cand_indices, dim=1, index=active_hypos + ) + if step > 0: + scores[:, :step] = torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx + ) + scores.view(bsz, beam_size, -1)[:, :, step] = torch.gather( + cand_scores, dim=1, index=active_hypos + ) + + # Update constraints based on which candidates were selected for the next beam + self.search.update_constraints(active_hypos) + + # copy attention for active hypotheses + if attn is not None: + attn[:, :, : step + 2] = torch.index_select( + attn[:, :, : step + 2], dim=0, index=active_bbsz_idx + ) + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # sort by score descending + for sent in range(len(finalized)): + scores = torch.tensor( + [float(elem["score"].item()) for elem in finalized[sent]] + ) + _, sorted_scores_indices = torch.sort(scores, descending=True) + finalized[sent] = [finalized[sent][ssi] for ssi in sorted_scores_indices] + finalized[sent] = torch.jit.annotate( + List[Dict[str, Tensor]], finalized[sent] + ) + return finalized + + def _prefix_tokens( + self, step: int, lprobs, scores, tokens, prefix_tokens, beam_size: int + ): + """Handle prefix tokens""" + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_lprobs = lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + prefix_mask = prefix_toks.ne(self.pad) + lprobs[prefix_mask] = torch.min(prefix_lprobs) - 1 + lprobs[prefix_mask] = lprobs[prefix_mask].scatter( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lprobs[prefix_mask] + ) + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[ + :, 0, 1 : step + 1 + ] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = self.replicate_first_beam(tokens, eos_mask_batch_dim, beam_size) + scores = self.replicate_first_beam(scores, eos_mask_batch_dim, beam_size) + lprobs = self.replicate_first_beam(lprobs, eos_mask_batch_dim, beam_size) + return lprobs, tokens, scores + + def replicate_first_beam(self, tensor, mask, beam_size: int): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + def finalize_hypos( + self, + step: int, + bbsz_idx, + eos_scores, + tokens, + scores, + finalized: List[List[Dict[str, Tensor]]], + finished: List[bool], + beam_size: int, + attn: Optional[Tensor], + src_lengths, + max_len: int, + ): + """Finalize hypothesis, store finalized information in `finalized`, and change `finished` accordingly. + A sentence is finalized when {beam_size} finished items have been collected for it. + Returns number of sentences (not beam items) being finalized. + These will be removed from the batch and not processed further. + Args: + bbsz_idx (Tensor): + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors. + # tokens is (batch * beam, max_len). So the index_select + # gets the newly EOS rows, then selects cols 1..{step + 2} + tokens_clone = tokens.index_select(0, bbsz_idx)[ + :, 1 : step + 2 + ] # skip the first index, which is EOS + + tokens_clone[:, step] = self.eos + attn_clone = ( + attn.index_select(0, bbsz_idx)[:, :, 1 : step + 2] + if attn is not None + else None + ) + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, : step + 1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + eos_scores /= (step + 1) ** self.len_penalty + + # cum_unfin records which sentences in the batch are finished. + # It helps match indexing between (a) the original sentences + # in the batch and (b) the current, possibly-reduced set of + # sentences. + cum_unfin: List[int] = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + cum_fin_tensor = torch.tensor(cum_unfin, dtype=torch.int).to(bbsz_idx) + + unfin_idx = bbsz_idx // beam_size + sent = unfin_idx + torch.index_select(cum_fin_tensor, 0, unfin_idx) + + # Create a set of "{sent}{unfin_idx}", where + # "unfin_idx" is the index in the current (possibly reduced) + # list of sentences, and "sent" is the index in the original, + # unreduced batch + # For every finished beam item + # sentence index in the current (possibly reduced) batch + seen = (sent << 32) + unfin_idx + unique_seen: List[int] = torch.unique(seen).tolist() + + if self.match_source_len: + condition = step > torch.index_select(src_lengths, 0, unfin_idx) + eos_scores = torch.where(condition, torch.tensor(-math.inf), eos_scores) + sent_list: List[int] = sent.tolist() + for i in range(bbsz_idx.size()[0]): + # An input sentence (among those in a batch) is finished when + # beam_size hypotheses have been collected for it + if len(finalized[sent_list[i]]) < beam_size: + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i] + else: + hypo_attn = torch.empty(0) + + finalized[sent_list[i]].append( + { + "tokens": tokens_clone[i], + "score": eos_scores[i], + "attention": hypo_attn, # src_len x tgt_len + "alignment": torch.empty(0), + "positional_scores": pos_scores[i], + } + ) + + newly_finished: List[int] = [] + for unique_s in unique_seen: + # check termination conditions for this sentence + unique_sent: int = unique_s >> 32 + unique_unfin_idx: int = unique_s - (unique_sent << 32) + + if not finished[unique_sent] and self.is_finished( + step, unique_unfin_idx, max_len, len(finalized[unique_sent]), beam_size + ): + finished[unique_sent] = True + newly_finished.append(unique_unfin_idx) + + return newly_finished + + def is_finished( + self, + step: int, + unfin_idx: int, + max_len: int, + finalized_sent_len: int, + beam_size: int, + ): + """ + Check whether decoding for a sentence is finished, which + occurs when the list of finalized sentences has reached the + beam size, or when we reach the maximum length. + """ + assert finalized_sent_len <= beam_size + if finalized_sent_len == beam_size or step == max_len: + return True + return False + + +class EnsembleModel(nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models_size = len(models) + # method '__len__' is not supported in ModuleList for torch script + self.single_model = models[0] + self.models = nn.ModuleList(models) + + self.has_incremental: bool = False + if all( + hasattr(m, "decoder") and isinstance(m.decoder, FairseqIncrementalDecoder) + for m in models + ): + self.has_incremental = True + + def forward(self): + pass + + def has_encoder(self): + return hasattr(self.single_model, "encoder") + + def has_incremental_states(self): + return self.has_incremental + + def max_decoder_positions(self): + return min([m.max_decoder_positions() for m in self.models if hasattr(m, "max_decoder_positions")] + [sys.maxsize]) + + @torch.jit.export + def forward_encoder(self, net_input: Dict[str, Tensor]): + if not self.has_encoder(): + return None + return [model.encoder.forward_torchscript(net_input) for model in self.models] + + @torch.jit.export + def forward_decoder( + self, + tokens, + encoder_outs: List[Dict[str, List[Tensor]]], + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + temperature: float = 1.0, + ): + log_probs = [] + avg_attn: Optional[Tensor] = None + encoder_out: Optional[Dict[str, List[Tensor]]] = None + for i, model in enumerate(self.models): + if self.has_encoder(): + encoder_out = encoder_outs[i] + # decode each model + if self.has_incremental_states(): + decoder_out = model.decoder.forward( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i], + ) + else: + if hasattr(model, "decoder"): + decoder_out = model.decoder.forward(tokens, encoder_out=encoder_out) + else: + decoder_out = model.forward(tokens) + + attn: Optional[Tensor] = None + decoder_len = len(decoder_out) + if decoder_len > 1 and decoder_out[1] is not None: + if isinstance(decoder_out[1], Tensor): + attn = decoder_out[1] + else: + attn_holder = decoder_out[1]["attn"] + if isinstance(attn_holder, Tensor): + attn = attn_holder + elif attn_holder is not None: + attn = attn_holder[0] + if attn is not None: + attn = attn[:, -1, :] + + decoder_out_tuple = ( + decoder_out[0][:, -1:, :].div_(temperature), + None if decoder_len <= 1 else decoder_out[1], + ) + probs = model.get_normalized_probs( + decoder_out_tuple, log_probs=True, sample=None + ) + probs = probs[:, -1, :] + if self.models_size == 1: + return probs, attn + + log_probs.append(probs) + if attn is not None: + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + + avg_probs = torch.logsumexp(torch.stack(log_probs, dim=0), dim=0) - math.log( + self.models_size + ) + + if avg_attn is not None: + avg_attn.div_(self.models_size) + return avg_probs, avg_attn + + @torch.jit.export + def reorder_encoder_out( + self, encoder_outs: Optional[List[Dict[str, List[Tensor]]]], new_order + ): + """ + Reorder encoder output according to *new_order*. + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_outs: List[Dict[str, List[Tensor]]] = [] + if not self.has_encoder(): + return new_outs + for i, model in enumerate(self.models): + assert encoder_outs is not None + new_outs.append( + model.encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + return new_outs + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + new_order, + ): + if not self.has_incremental_states(): + return + for i, model in enumerate(self.models): + model.decoder.reorder_incremental_state_scripting( + incremental_states[i], new_order + ) + + +class SequenceGeneratorWithAlignment(SequenceGenerator): + def __init__( + self, models, tgt_dict, left_pad_target=False, print_alignment="hard", **kwargs + ): + """Generates translations of a given source sentence. + Produces alignments following "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + Args: + left_pad_target (bool, optional): Whether or not the + hypothesis should be left padded or not when they are + teacher forced for generating alignments. + """ + super().__init__(EnsembleModelWithAlignment(models), tgt_dict, **kwargs) + self.left_pad_target = left_pad_target + + if print_alignment == "hard": + self.extract_alignment = utils.extract_hard_alignment + elif print_alignment == "soft": + self.extract_alignment = utils.extract_soft_alignment + + @torch.no_grad() + def generate(self, models, sample, **kwargs): + finalized = super()._generate(sample, **kwargs) + + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + beam_size = self.beam_size + ( + src_tokens, + src_lengths, + prev_output_tokens, + tgt_tokens, + ) = self._prepare_batch_for_alignment(sample, finalized) + if any(getattr(m, "full_context_alignment", False) for m in self.model.models): + attn = self.model.forward_align(src_tokens, src_lengths, prev_output_tokens) + else: + attn = [ + finalized[i // beam_size][i % beam_size]["attention"].transpose(1, 0) + for i in range(bsz * beam_size) + ] + + if src_tokens.device != "cpu": + src_tokens = src_tokens.to("cpu") + tgt_tokens = tgt_tokens.to("cpu") + attn = [i.to("cpu") for i in attn] + + # Process the attn matrix to extract hard alignments. + for i in range(bsz * beam_size): + alignment = self.extract_alignment( + attn[i], src_tokens[i], tgt_tokens[i], self.pad, self.eos + ) + finalized[i // beam_size][i % beam_size]["alignment"] = alignment + return finalized + + def _prepare_batch_for_alignment(self, sample, hypothesis): + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + src_tokens = ( + src_tokens[:, None, :] + .expand(-1, self.beam_size, -1) + .contiguous() + .view(bsz * self.beam_size, -1) + ) + src_lengths = sample["net_input"]["src_lengths"] + src_lengths = ( + src_lengths[:, None] + .expand(-1, self.beam_size) + .contiguous() + .view(bsz * self.beam_size) + ) + prev_output_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=True, + ) + tgt_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=False, + ) + return src_tokens, src_lengths, prev_output_tokens, tgt_tokens + + +class EnsembleModelWithAlignment(EnsembleModel): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__(models) + + def forward_align(self, src_tokens, src_lengths, prev_output_tokens): + avg_attn = None + for model in self.models: + decoder_out = model(src_tokens, src_lengths, prev_output_tokens) + attn = decoder_out[1]["attn"][0] + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + if len(self.models) > 1: + avg_attn.div_(len(self.models)) + return avg_attn diff --git a/Speech2C/speech2c/tasks/speech2c_pretraining.py b/Speech2C/speech2c/tasks/speech2c_pretraining.py new file mode 100644 index 0000000..de27563 --- /dev/null +++ b/Speech2C/speech2c/tasks/speech2c_pretraining.py @@ -0,0 +1,91 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import logging + +from dataclasses import dataclass, field +from fairseq.data import Dictionary +from fairseq.tasks import register_task +from fairseq.tasks.hubert_pretraining import HubertPretrainingConfig, HubertPretrainingTask, LabelEncoder +from speech2c.data.speech2c_dataset import Speech2cDataset + +logger = logging.getLogger(__name__) + + +@dataclass +class Speech2cPretrainingConfig(HubertPretrainingConfig): + add_decoder: bool = field( + default=False, + metadata={"help": "whether to add decoder for CE Loss on code"}, + ) + + # For inference + ctc_weight: float = field( + default=0.0, + metadata={"help": "ctc weight during inference"}, + ) + + +@register_task("speech2c_pretraining", dataclass=Speech2cPretrainingConfig) +class Speech2cPretrainingTask(HubertPretrainingTask): + + cfg: Speech2cPretrainingConfig + + def load_dictionaries(self): + label_dir = self.cfg.data if self.cfg.label_dir is None else self.cfg.label_dir + dictionaries = [Dictionary.load(f"{label_dir}/dict.{label}.txt") for label in self.cfg.labels] + return dictionaries[0] if self.cfg.fine_tuning else dictionaries + + def load_dataset(self, split: str, **kwargs) -> None: + manifest = f"{self.cfg.data}/{split}.tsv" + dicts = [self.target_dictionary] if self.cfg.fine_tuning else self.dictionaries + pad_list = [dict.pad() for dict in dicts] + eos_list = [dict.eos() for dict in dicts] + procs = [LabelEncoder(dict) for dict in dicts] + paths = [ + f"{self.get_label_dir()}/{split}.{l}" for l in self.cfg.labels + ] + + # hubert v1: pad_audio=True, random_crop=False; + self.datasets[split] = Speech2cDataset( + manifest, + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=False, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + tgt_dict=dicts[0], + add_decoder=self.cfg.add_decoder, + fine_tuning=self.cfg.fine_tuning, + ) + + def build_generator( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + ): + from speech2c.squence_generator import SequenceGenerator + extra_gen_cls_kwargs = { + "ctc_weight": self.cfg.ctc_weight, + **extra_gen_cls_kwargs + } + return super().build_generator( + models, args, seq_gen_cls=SequenceGenerator, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) diff --git a/Speech2S/README.md b/Speech2S/README.md new file mode 100644 index 0000000..fc827e2 --- /dev/null +++ b/Speech2S/README.md @@ -0,0 +1,64 @@ +# Speech2S + + + [**Joint Pre-Training with Speech and Bilingual Text for Direct Speech to Speech Translation**](https://arxiv.org/abs/2210.17027) + + +- (Updating) Nov. 2022: release the code and models +- Nov. 2022: release preprint in [arXiv](https://arxiv.org/abs/2210.17027) + +## Pre-Trained and Fine-tuned Models + +| Model | Pre-training Dataset | Fine-tuning Dataset | Model | +| :------: | :----------------------------------------------: | :-----------------: | :-----: | +| Speech2S_enes | Voxpopuli_en_v2 | - | [Google Drive](https://drive.google.com/file/d/1TYypFiEKoCixUro8FTTG23bRZYwAxhkX/view?usp=share_link) | +| Speech2S_enes | Voxpopuli_en_v2 | Voxpopuli_s2s | [Google Drive](https://drive.google.com/file/d/11RxeKznSrHcoP_KK9A1VgwRt3fNh_U_C/view?usp=share_link) | +| Speech2S_esen | Voxpopuli_es_v2 | - | [Google Drive](https://drive.google.com/file/d/1NoC7W-UtQZ-ugIptF1ex0ZlGJncsT1S4/view?usp=share_link) | +| Speech2S_esen | Voxpopuli_es_v2 | Voxpopuli_s2s | [Google Drive](https://drive.google.com/file/d/1eNcKw4ZWGmcABWXJxlf6MKocmiPrKSkH/view?usp=share_link) | + + +## Setup +``` +cd Speech2S/speech2s +pip install --editable fairseq/ +``` + +## Data Preparation +Please follow the steps of data preparation for S2ST in [here](https://github.com/facebookresearch/fairseq/blob/main/examples/speech_to_speech/docs/enhanced_direct_s2st_discrete_units.md). + +## Pre-Training +``` +cd speech2s/stpretrain_scripts +base_sc2c_enes.sh +``` +## Finetune +``` +cd speech2s/stpretrain_scripts +finetune_enes.sh +``` +## Inference +``` +cd speech2s/stpretrain_scripts +inference_ed.sh +``` +## Results on Voxpopuli and Covst + + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq). + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +## Reference + +If you find our work is useful in your research, please cite the following paper: +```bibtex +@article{wei2022joint, + title={Joint Pre-Training with Speech and Bilingual Text for Direct Speech to Speech Translation}, + author={Wei, Kun and Zhou, Long and Zhang, Ziqiang and Chen, Liping and Liu, Shujie and He, Lei and Li, Jinyu and Wei, Furu}, + journal={arXiv preprint arXiv:2210.17027}, + year={2022} +} +``` diff --git a/Speech2S/speech2s/__init__.py b/Speech2S/speech2s/__init__.py new file mode 100644 index 0000000..97327d2 --- /dev/null +++ b/Speech2S/speech2s/__init__.py @@ -0,0 +1 @@ +from . import data, tasks, criterions, models diff --git a/Speech2S/speech2s/config/finetune_asr/speechut_base_100h.yaml b/Speech2S/speech2s/config/finetune_asr/speechut_base_100h.yaml new file mode 100644 index 0000000..736c3c7 --- /dev/null +++ b/Speech2S/speech2s/config/finetune_asr/speechut_base_100h.yaml @@ -0,0 +1,101 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 100 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1 + keep_last_epochs: 1 + keep_best_checkpoints: 5 + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: false # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: true + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1300000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 40000 + lr: [0.00001] + sentence_avg: true + update_freq: [2] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechut_asr + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/config/finetune_asr/speechut_large_100h.yaml b/Speech2S/speech2s/config/finetune_asr/speechut_large_100h.yaml new file mode 100644 index 0000000..7cbc59e --- /dev/null +++ b/Speech2S/speech2s/config/finetune_asr/speechut_large_100h.yaml @@ -0,0 +1,102 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 100 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1 + keep_last_epochs: 5 + keep_best_checkpoints: 5 + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 16 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: true # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: true + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1300000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 40000 + lr: [0.00001] + sentence_avg: true + update_freq: [2] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechut_asr + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/config/finetune_asr/speechut_large_960h.yaml b/Speech2S/speech2s/config/finetune_asr/speechut_large_960h.yaml new file mode 100644 index 0000000..f10d600 --- /dev/null +++ b/Speech2S/speech2s/config/finetune_asr/speechut_large_960h.yaml @@ -0,0 +1,100 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 100 + tensorboard_logdir: tblog + +checkpoint: + save_interval: 1 + keep_last_epochs: 5 + keep_best_checkpoints: 5 + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 24 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: true # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: true + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1300000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_960 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 40000 + lr: [0.00001] + sentence_avg: true + update_freq: [2] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechut_asr + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.0 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/config/pretrain/speechut_base_librispeech.yaml b/Speech2S/speech2s/config/pretrain/speechut_base_librispeech.yaml new file mode 100644 index 0000000..6a3751f --- /dev/null +++ b/Speech2S/speech2s/config/pretrain/speechut_base_librispeech.yaml @@ -0,0 +1,153 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 4 + keep_last_epochs: 4 + save_interval_updates: 50000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 50000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_port: -1 + distributed_world_size: 32 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + store_labels: true + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: false # must be consistent with extractor + add_decoder_target: true + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.5 + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: speechut_criterion + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + u2t_ed_weight: 0.1 + u2t_ctc_weight: 0.1 + text_mum_weight: 0.5 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: speechut + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + activation_fn: "gelu" + encoder_layers: 6 + encoder_attention_heads: 8 + encoder_layerdrop: 0.0 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_unit_encoder: true + add_text_ctc: true + mask_u2t: false + mix_with_unit: true + add_decoder: true + reset_decoder_embedding_config: true + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + max_source_positions: 3000 + max_target_positions: 3000 + no_scale_embedding: true + layernorm_embedding: true + no_token_positional_embeddings: false + share_decoder_input_output_embed: false + encoder: + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 8 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + decoder: + layerdrop: 0.1 + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 12 + normalize_before: false + learned_pos: false + output_dim: 768 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/config/pretrain/speechut_large_librilight.yaml b/Speech2S/speech2s/config/pretrain/speechut_large_librilight.yaml new file mode 100644 index 0000000..849c1d9 --- /dev/null +++ b/Speech2S/speech2s/config/pretrain/speechut_large_librilight.yaml @@ -0,0 +1,159 @@ +# @package _group_ + +common: + fp16: true + fp16_scale_tolerance: 0.1 # alleviate fp16 overflow issue + log_format: json + log_interval: 200 + seed: 1234 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 1 + keep_last_epochs: 4 + save_interval_updates: 10000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 10000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_port: -1 + distributed_world_size: 128 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + store_labels: true + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: true # must be consistent with extractor + add_decoder_target: true + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.4 + +dataset: + num_workers: 6 + max_tokens: 900000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 2 + +criterion: + _name: speechut_criterion + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + u2t_ed_weight: 0.1 + u2t_ctc_weight: 0.1 + text_mum_weight: 0.5 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 1.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + end_learning_rate: 0.00015 # for future longger pre-training, e.g. 600K step + +model: + _name: speechut + label_rate: ??? + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: layer_norm + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 768 + activation_fn: "gelu" + encoder_layers: 12 + encoder_attention_heads: 16 + encoder_layerdrop: 0.0 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + layer_norm_first: true + feature_grad_mult: 1.0 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_unit_encoder: true + add_text_ctc: true + mask_u2t: false + mix_with_unit: true + add_decoder: true + reset_decoder_embedding_config: true + scaling_for_att: 32 # alleviate fp16 overflow issue + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + max_source_positions: 3000 + max_target_positions: 3000 + no_scale_embedding: true + layernorm_embedding: true + no_token_positional_embeddings: true + share_decoder_input_output_embed: false + encoder: + embed_dim: 1024 + ffn_embed_dim: 4096 + layers: 12 + attention_heads: 16 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + decoder: + layerdrop: 0.1 + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 12 + normalize_before: false + learned_pos: false + output_dim: 768 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/criterions/__init__.py b/Speech2S/speech2s/criterions/__init__.py new file mode 100644 index 0000000..2bf9fac --- /dev/null +++ b/Speech2S/speech2s/criterions/__init__.py @@ -0,0 +1,9 @@ +import importlib +import os + +for file in os.listdir(os.path.dirname(__file__)): + if file.endswith(".py") and not file.startswith("_"): + criterion_name = file[: file.find(".py")] + importlib.import_module( + "speechut.criterions." + criterion_name + ) diff --git a/Speech2S/speech2s/criterions/ctc_ce.py b/Speech2S/speech2s/criterions/ctc_ce.py new file mode 100644 index 0000000..aab6c9d --- /dev/null +++ b/Speech2S/speech2s/criterions/ctc_ce.py @@ -0,0 +1,414 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import math +from argparse import Namespace +from dataclasses import dataclass, field +from omegaconf import II +from typing import Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass +from fairseq.data.data_utils import post_process +from fairseq.tasks import FairseqTask +from fairseq.logging.meters import safe_round + + +@dataclass +class CtcCeCriterionConfig(FairseqDataclass): + zero_infinity: bool = field( + default=False, + metadata={"help": "zero inf loss when source length <= target length"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + post_process: str = field( + default="letter", + metadata={ + "help": "how to post process predictions into words. can be letter, " + "wordpiece, BPE symbols, etc. " + "See fairseq.data.data_utils.post_process() for full list of options" + }, + ) + wer_kenlm_model: Optional[str] = field( + default=None, + metadata={ + "help": "if this is provided, use kenlm to compute wer (along with other wer_* args)" + }, + ) + wer_lexicon: Optional[str] = field( + default=None, + metadata={"help": "lexicon to use with wer_kenlm_model"}, + ) + wer_lm_weight: float = field( + default=2.0, + metadata={"help": "lm weight to use with wer_kenlm_model"}, + ) + wer_word_score: float = field( + default=-1.0, + metadata={"help": "lm word score to use with wer_kenlm_model"}, + ) + + wer_args: Optional[str] = field( + default=None, + metadata={ + "help": "DEPRECATED: tuple of (wer_kenlm_model, wer_lexicon, wer_lm_weight, wer_word_score)" + }, + ) + + dec_weight: float = field( + default=0.5, + metadata={"help": "weights for decoder CE Loss, loss will be ((1 - dec_weight) * hubert_loss + dec_weight * CE_Loss)"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.1, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + + +@register_criterion("ctc_ce", dataclass=CtcCeCriterionConfig) +class CtcCeCriterion(FairseqCriterion): + def __init__(self, cfg: CtcCeCriterionConfig, task: FairseqTask): + super().__init__(task) + self.blank_idx = ( + task.target_dictionary.index(task.blank_symbol) + if hasattr(task, "blank_symbol") + else 0 + ) + self.pad_idx = task.target_dictionary.pad() + self.eos_idx = task.target_dictionary.eos() + self.post_process = cfg.post_process + + if cfg.wer_args is not None: + ( + cfg.wer_kenlm_model, + cfg.wer_lexicon, + cfg.wer_lm_weight, + cfg.wer_word_score, + ) = eval(cfg.wer_args) + + if cfg.wer_kenlm_model is not None: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + dec_args = Namespace() + dec_args.nbest = 1 + dec_args.criterion = "ctc" + dec_args.kenlm_model = cfg.wer_kenlm_model + dec_args.lexicon = cfg.wer_lexicon + dec_args.beam = 50 + dec_args.beam_size_token = min(50, len(task.target_dictionary)) + dec_args.beam_threshold = min(50, len(task.target_dictionary)) + dec_args.lm_weight = cfg.wer_lm_weight + dec_args.word_score = cfg.wer_word_score + dec_args.unk_weight = -math.inf + dec_args.sil_weight = 0 + + self.w2l_decoder = W2lKenLMDecoder(dec_args, task.target_dictionary) + else: + self.w2l_decoder = None + + self.zero_infinity = cfg.zero_infinity + self.sentence_avg = cfg.sentence_avg + + self.dec_weight = cfg.dec_weight + self.report_accuracy = cfg.report_accuracy + self.ignore_prefix_size = cfg.ignore_prefix_size + self.eps = cfg.label_smoothing + + def forward(self, model, sample, reduce=True): + net_output = model(**sample["net_input"]) + lprobs = model.get_normalized_probs( + net_output, log_probs=True + ).contiguous() # (T, B, C) from the encoder + + if "src_lengths" in sample["net_input"]: + input_lengths = sample["net_input"]["src_lengths"] + else: + if net_output["padding_mask"] is not None: + non_padding_mask = ~net_output["padding_mask"] + input_lengths = non_padding_mask.long().sum(-1) + else: + input_lengths = lprobs.new_full( + (lprobs.size(1),), lprobs.size(0), dtype=torch.long + ) + + pad_mask = (sample["target"] != self.pad_idx) & ( + sample["target"] != self.eos_idx + ) + targets_flat = sample["target"].masked_select(pad_mask) + if "target_lengths" in sample: + target_lengths = sample["target_lengths"] + else: + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction="sum", + zero_infinity=self.zero_infinity, + ) + + ntokens = ( + sample["ntokens"] if "ntokens" in sample else target_lengths.sum().item() + ) + + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + + logging_output = {} + if "decoder_target" in sample: + if net_output["decoder_out"] is not None: + dec_sample_size = sample["target"].size(0) if self.sentence_avg else sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + else: + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + logging_output["dec_loss"] = 0 + logging_output["dec_nll_loss"] = 0 + logging_output["dec_sample_size"] = 1 + if self.report_accuracy: + logging_output["dec_n_correct"] = 0 + logging_output["total"] = 1 + + logging_output = { + "loss": utils.item(loss.data), # * sample['ntokens'], + "ntokens": ntokens, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + **logging_output, + } + + if not model.training and self.dec_weight < 1.0: + import editdistance + + with torch.no_grad(): + lprobs_t = lprobs.transpose(0, 1).float().contiguous().cpu() + + c_err = 0 + c_len = 0 + w_errs = 0 + w_len = 0 + wv_errs = 0 + for lp, t, inp_l in zip( + lprobs_t, + sample["target_label"] + if "target_label" in sample + else sample["target"], + input_lengths, + ): + lp = lp[:inp_l].unsqueeze(0) + + decoded = None + if self.w2l_decoder is not None: + decoded = self.w2l_decoder.decode(lp) + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + + p = (t != self.task.target_dictionary.pad()) & ( + t != self.task.target_dictionary.eos() + ) + targ = t[p] + targ_units = self.task.target_dictionary.string(targ) + targ_units_arr = targ.tolist() + + toks = lp.argmax(dim=-1).unique_consecutive() + pred_units_arr = toks[toks != self.blank_idx].tolist() + + c_err += editdistance.eval(pred_units_arr, targ_units_arr) + c_len += len(targ_units_arr) + + targ_words = post_process(targ_units, self.post_process).split() + + pred_units = self.task.target_dictionary.string(pred_units_arr) + pred_words_raw = post_process(pred_units, self.post_process).split() + + if decoded is not None and "words" in decoded: + pred_words = decoded["words"] + w_errs += editdistance.eval(pred_words, targ_words) + wv_errs += editdistance.eval(pred_words_raw, targ_words) + else: + dist = editdistance.eval(pred_words_raw, targ_words) + w_errs += dist + wv_errs += dist + + w_len += len(targ_words) + + logging_output["wv_errors"] = wv_errs + logging_output["w_errors"] = w_errs + logging_output["w_total"] = w_len + logging_output["c_errors"] = c_err + logging_output["c_total"] = c_len + + return loss, sample_size, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.pad_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.pad_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + c_errors = sum(log.get("c_errors", 0) for log in logging_outputs) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in logging_outputs) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in logging_outputs) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in logging_outputs) + metrics.log_scalar("_w_total", w_total) + + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + if "dec_loss" in logging_outputs[0]: + ctc_loss_sum = sum(log.get("ctc_loss", 0) for log in logging_outputs) + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "ctc_loss", ctc_loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/Speech2S/speech2s/criterions/speechut_criterion.py b/Speech2S/speech2s/criterions/speechut_criterion.py new file mode 100644 index 0000000..0d735f1 --- /dev/null +++ b/Speech2S/speech2s/criterions/speechut_criterion.py @@ -0,0 +1,384 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import numpy as np +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass + +logger = logging.getLogger(__name__) + +@dataclass +class SpeechUTCriterionConfig(FairseqDataclass): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + u2t_ed_weight: float = field( + default=0.1, + metadata={"help": "weights for text ED Loss, loss will be (hubert_loss + text_mum_weight * MUM_Loss + u2t_ed_weight * CE_Loss + u2t_ctc_weight * CTC_loss)"}, + ) + u2t_ctc_weight: float = field( + default=0.0, + metadata={"help": "weights for text ED Loss, loss will be (hubert_loss + text_mum_weight * MUM_Loss + u2t_ed_weight * CE_Loss + u2t_ctc_weight * CTC_loss)"}, + ) + text_mum_weight: float = field( + default=0.0, + metadata={"help": "masked unit modeling weight from the text end"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + no_ctc_blank: bool = field( + default=False, + metadata={"help": "mask out the blank of ctc, only when dec_loss_type=ctc"}, + ) + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + +@register_criterion("speechut_criterion", dataclass=SpeechUTCriterionConfig) +class SpeechUTCriterion(FairseqCriterion): + def __init__( + self, + task, + pred_masked_weight, + pred_nomask_weight, + loss_weights=None, + log_keys=None, + u2t_ed_weight=0.1, + u2t_ctc_weight=0, + text_mum_weight=0, + report_accuracy=False, + ignore_prefix_size=0, + label_smoothing=0, + no_ctc_blank=False, + ): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.u2t_ed_weight = u2t_ed_weight + self.u2t_ctc_weight = u2t_ctc_weight + self.text_mum_weight = text_mum_weight + self.report_accuracy = report_accuracy + self.ignore_prefix_size = ignore_prefix_size + self.eps = label_smoothing + self.no_ctc_blank = no_ctc_blank + self.padding_idx = task.dictionaries[0].pad() + self.eos_idx = task.dictionaries[0].eos() + self.blank_idx = task.dictionaries[0].bos() + + def compute_hubert_loss(self, model, net_output, reduction, preffix='', suffix=''): + loss = 0 + sample_size = [] + logging_output = {} + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"{preffix}loss_m_{i}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size.append(targ_m_list[0].numel()) + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"{preffix}loss_u_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size.append(targ_u_list[0].numel()) + + sample_size = np.mean(sample_size) + + def compute_correct(logits, targets): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == targets + min = logits.argmin(-1) == targets + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + corr_m, count_m = compute_correct(logp_m, targ_m) + logging_output[f"correct_m_{i}{suffix}"] = corr_m + logging_output[f"count_m_{i}{suffix}"] = count_m + + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + corr_u, count_u = compute_correct(logp_u, targ_u) + logging_output[f"correct_u_{i}{suffix}"] = corr_u + logging_output[f"count_u_{i}{suffix}"] = count_u + + return loss, sample_size, logging_output + + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + reduction = "sum" if reduce else "none" + + if "net_input" in sample: + unit_sample = text_sample = None + else: + unit_sample = sample.get("text_mono", None) + text_sample = sample.get("text_paired", None) + assert unit_sample is not None or text_sample is not None + sample = sample.get("speech") + + ### 1. S2U: do hubert forward and loss computation + sample["modality"] = "speech" + net_output = model(target_list=sample["target_list"], **sample["net_input"]) + loss, sample_size, logging_output = self.compute_hubert_loss( + model, + net_output, + reduction, + ) + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len( + self.loss_weights + ), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + ### 2. do text U2T forward and loss computation + if text_sample is not None and (self.u2t_ctc_weight + self.u2t_ed_weight) > 0: + ## 2.1 re-loading "target_list", in default case, target_list = [src_tokens], + ## while in case of using "unit-phone-char" structure, target_list will be [ref_tokens] + text_sample["net_input"]["target_list"] = [ + text_sample.get("ref_tokens", text_sample["net_input"]["src_tokens"].clone()), + ] + text_net_output = model(**text_sample["net_input"]) + text_sample_size = text_sample["ntokens"] + + ### 2.1 U2T_UCTC + if self.u2t_ctc_weight > 0: + text_ctc_loss = self.compute_ctc_loss(model, text_net_output, text_sample["target"], reduction=reduction) + loss += self.u2t_ctc_weight * text_ctc_loss * sample_size / text_sample_size + logging_output["text_ctc_loss"] = utils.item(text_ctc_loss) + logging_output["text_sample_size"] = text_sample_size + + ### 2.2 U2T_ED + if self.u2t_ed_weight > 0: + text_dec_loss, text_dec_nll_loss = self.compute_ce_loss(model, text_net_output["decoder_out"], text_sample, reduce=reduce) + loss += self.u2t_ed_weight * text_dec_loss * sample_size / text_sample_size + logging_output["text_dec_loss"] = utils.item(text_dec_loss) + logging_output["text_dec_nll_loss"] = utils.item(text_dec_nll_loss) + logging_output["text_sample_size"] = text_sample_size + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, text_net_output["decoder_out"], text_sample) + logging_output["correct_text_dec"] = utils.item(n_correct.data) + logging_output["count_text_dec"] = utils.item(total.data) + + ### 3. do unit MUM forward and loss computation + if unit_sample is not None and self.text_mum_weight > 0: + src_tokens = unit_sample["net_input"]["src_tokens"] + target = unit_sample.get("target", None) + target = src_tokens.clone() if target is None else target + unit_net_output = model.forward_mum(src_tokens, target) + loss_num, sample_size_mum, logging_output_mum = self.compute_hubert_loss( + model, + unit_net_output, + reduction, + preffix="mum_", + suffix="_mum", + ) + loss += self.text_mum_weight * loss_num * sample_size / sample_size_mum + logging_output["unit_sample_size"] = sample_size_mum + logging_output.update(logging_output_mum) + + logging_output = { + "loss": utils.item(loss) if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["id"].numel() + (text_sample["id"].numel() if text_sample is not None else 0), + "sample_size": sample_size, + **logging_output, + } + + return loss, sample_size, logging_output + + def compute_ctc_loss(self, model, net_output, target, reduction): + logits = net_output["encoder_out_ctc"][0] # (T, B, C) from the code-encoder + if self.no_ctc_blank: + ## set prob of to -inf + logits = logits.float() + logits[:, :, self.blank_idx] = -1000000.0 + + lprobs = F.log_softmax(logits.float(), dim=-1) + + encoder_padding_mask = net_output["encoder_padding_mask"][0] + non_padding_mask = ~encoder_padding_mask + input_lengths = non_padding_mask.long().sum(-1) + pad_mask = (target != self.padding_idx) & (target != self.eos_idx) + targets_flat = target.masked_select(pad_mask) + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction=reduction, + zero_infinity=True, + ) + return loss + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = sample["target"] + + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + if "text_sample_size" in logging_outputs[0]: + text_sample_size = sum(log.get("text_sample_size", 0) for log in logging_outputs) + for lk in logging_outputs[0].keys(): + if lk.startswith("text_") and lk.endswith("_loss"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / text_sample_size / math.log(2), round=3) + + if "unit_sample_size" in logging_outputs[0]: + unit_sample_size = sum(log.get("unit_sample_size", 0) for log in logging_outputs) + for lk in logging_outputs[0].keys(): + if lk.startswith("mum_loss_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / unit_sample_size / math.log(2), round=3) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/Speech2S/speech2s/data/concat_dataset.py b/Speech2S/speech2s/data/concat_dataset.py new file mode 100644 index 0000000..5766921 --- /dev/null +++ b/Speech2S/speech2s/data/concat_dataset.py @@ -0,0 +1,129 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import bisect + +import numpy as np +from torch.utils.data.dataloader import default_collate + +from fairseq.data import FairseqDataset + + +class ConcatDataset(FairseqDataset): + @staticmethod + def cumsum(sequence, sample_ratios): + r, s = [], 0 + for e, ratio in zip(sequence, sample_ratios): + curr_len = int(ratio * len(e)) + r.append(curr_len + s) + s += curr_len + return r + + def __init__(self, datasets, sample_ratios=1): + super(ConcatDataset, self).__init__() + assert len(datasets) > 0, "datasets should not be an empty iterable" + self.datasets = list(datasets) + if isinstance(sample_ratios, int): + sample_ratios = [sample_ratios] * len(self.datasets) + self.sample_ratios = sample_ratios + self.cumulative_sizes = self.cumsum(self.datasets, sample_ratios) + self.real_sizes = [len(d) for d in self.datasets] + + def __len__(self): + return self.cumulative_sizes[-1] + + def __getitem__(self, idx): + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx][sample_idx] + + def _get_dataset_and_sample_index(self, idx: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + sample_idx = sample_idx % self.real_sizes[dataset_idx] + return dataset_idx, sample_idx + + def collater(self, samples, **extra_args): + # For now only supports datasets with same underlying collater implementations + if hasattr(self.datasets[0], "collater"): + return self.datasets[0].collater(samples, **extra_args) + else: + return default_collate(samples, **extra_args) + + def size(self, idx: int): + """ + Return an example's size as a float or tuple. + """ + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx].size(sample_idx) + + def num_tokens(self, index: int): + return np.max(self.size(index)) + + def attr(self, attr: str, index: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, index) + return getattr(self.datasets[dataset_idx], attr, None) + + @property + def sizes(self): + _dataset_sizes = [] + for ds, sr in zip(self.datasets, self.sample_ratios): + if isinstance(ds.sizes, np.ndarray): + _dataset_sizes.append(np.tile(ds.sizes, sr)) + else: + # Only support underlying dataset with single size array. + assert isinstance(ds.sizes, list) + _dataset_sizes.append(np.tile(ds.sizes[0], sr)) + return np.concatenate(_dataset_sizes) + + @property + def supports_prefetch(self): + return all(d.supports_prefetch for d in self.datasets) + + def ordered_indices(self): + """ + Returns indices sorted by length. So less padding is needed. + """ + if isinstance(self.sizes, np.ndarray) and len(self.sizes.shape) > 1: + # special handling for concatenating lang_pair_datasets + if getattr(self.datasets[0], "shuffle", False): + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + sizes = self.sizes + tgt_sizes = ( + sizes[:, 1] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else None + ) + src_sizes = ( + sizes[:, 0] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else sizes + ) + # sort by target length, then source length + if tgt_sizes is not None: + indices = indices[np.argsort(tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(src_sizes[indices], kind="mergesort")] + else: + return np.argsort(self.sizes) + + def prefetch(self, indices): + frm = 0 + for to, ds in zip(self.cumulative_sizes, self.datasets): + real_size = len(ds) + if getattr(ds, "supports_prefetch", False): + ds.prefetch([(i - frm) % real_size for i in indices if frm <= i < to]) + frm = to + + @property + def can_reuse_epoch_itr_across_epochs(self): + return all(d.can_reuse_epoch_itr_across_epochs for d in self.datasets) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.datasets: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) diff --git a/Speech2S/speech2s/data/hubert_dataset.py b/Speech2S/speech2s/data/hubert_dataset.py new file mode 100644 index 0000000..64965de --- /dev/null +++ b/Speech2S/speech2s/data/hubert_dataset.py @@ -0,0 +1,597 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import itertools +import logging +import io +import os +import sys +import time +from pathlib import Path +from typing import Any, List, Optional, Union, Tuple + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils, Dictionary +from fairseq.data.fairseq_dataset import FairseqDataset +from fairseq.data.audio.audio_utils import ( + read_from_stored_zip, + is_sf_audio_data, +) + +FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS = {".npy", ".wav", ".flac", ".ogg"} + +logger = logging.getLogger(__name__) + +def parse_path(path: str) -> Tuple[str, List[int]]: + """Parse data path which is either a path to + 1. a .npy/.wav/.flac/.ogg file + 2. a stored ZIP file with slicing info: "[zip_path]:[offset]:[length]" + + Args: + path (str): the data path to parse + + Returns: + file_path (str): the file path + slice_ptr (list of int): empty in case 1; + byte offset and length for the slice in case 2 + """ + + if Path(path).suffix in FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS: + _path, slice_ptr = path, [] + else: + _path, *slice_ptr = path.split(":") + if not Path(_path).is_file(): + raise FileNotFoundError(f"File not found: {_path}") + assert len(slice_ptr) in {0, 1, 2}, f"Invalid path: {path}" + slice_ptr = [int(i) for i in slice_ptr] + return _path, slice_ptr + +def load_audio(manifest_path, max_keep, min_keep, retry_times=5): + n_long, n_short = 0, 0 + names, inds, sizes, chunk_names, chunk_indices = [], [], [], [], [] + for i in range(retry_times): + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) == 2, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + fname = items[0].split(":") + if len(fname) > 2: + if len(chunk_names) == 0 or fname[0] != chunk_names[-1]: + chunk_names.append(fname[0]) + chunk_indices.append(len(names)) + names.append(items[0]) + inds.append(ind) + sizes.append(sz) + if len(names) == 0: + logger.warn(f"Fail to load manifest for the {i} time") + time.sleep(1) + continue + else: + break + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes, chunk_names, chunk_indices + + +def load_label(label_path, inds, tot, retry_times=5): + for i in range(retry_times): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + if len(labels) == 0: + logger.warn(f"Fail to load label for the {i} time") + time.sleep(1) + continue + else: + break + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot, retry_times=5): + for i in range(retry_times): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + if len(code_lengths) == 0: + logger.warn(f"Fail to load label for the {i} time") + time.sleep(1) + continue + else: + break + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +class HubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + tgt_dict: Optional[Dictionary] = None, + add_decoder_target: bool = False, + fine_tuning: bool = False, + tgt_lang_idx: int = None, + tokenizer = None, + mbart_style_lang_id: bool = False, + retry_times: int = 5, + reduce_label_for_dec: bool = True, + ): + self.audio_root, self.audio_names, inds, tot, self.wav_sizes, self.chunk_names, self.chunk_indices = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size, retry_times + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + self.random_crop = random_crop + self.tgt_dict = tgt_dict + self.add_decoder_target = add_decoder_target + self.fine_tuning = fine_tuning + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.single_target = single_target + self.epoch = 0 + + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + self.store_labels = store_labels + if store_labels: + self.label_list = [load_label(p, inds, tot, retry_times) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot, retry_times) for p in label_paths + ] + assert label_processors is None or len(label_processors) == self.num_labels + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths( + self.wav_sizes, sample_rate, label_path, label_rate, inds, tot + ) + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + self.tgt_lang_idx = tgt_lang_idx + self.tokenizer = tokenizer + self.mbart_style_lang_id = mbart_style_lang_id + self.retry_times = retry_times + self.reduce_label_for_dec = reduce_label_for_dec + logger.info( + f"pad_audio={pad_audio}, random_crop={random_crop}, tgt_lang_idx={self.tgt_lang_idx}, reduce_label_for_dec={reduce_label_for_dec}, " + f"mbart_style_lang_id={mbart_style_lang_id}, normalize={normalize}, max_sample_size={self.max_sample_size}" + ) + + def set_epoch(self, epoch): + self.epoch = epoch + + def batch_by_size(self, indices, max_tokens=None, max_sentences=None, required_batch_size_multiple=1): + self.max_tokens = max_tokens + self.max_sentences = max_sentences + self.required_batch_size_multiple = required_batch_size_multiple + if isinstance(indices[0], np.ndarray): + batch_list = [] + for indice in indices: + batch = super(HubertDataset, self).batch_by_size(indice, max_tokens, max_sentences, required_batch_size_multiple) + batch_list.append(batch) + return batch_list + else: + return super(HubertDataset, self).batch_by_size(indices, max_tokens, max_sentences, required_batch_size_multiple) + def shuffle_batches(self, batches, seed): + if isinstance(batches[0], list): + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for batch in batches: + np.random.shuffle(batch) + new_batches.extend(batch) + return new_batches + else: + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + return batches + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + _path, slice_ptr = parse_path(wav_path) + if len(slice_ptr) == 1: + import kaldiio + feat = kaldiio.load_mat(wav_path) + feat = torch.from_numpy(feat).float() + if self.normalize: + with torch.no_grad(): + feat = F.layer_norm(feat, feat.shape[-1]) + return feat + else: + if len(slice_ptr) == 2: + byte_data = read_from_stored_zip(_path, slice_ptr[0], slice_ptr[1]) + assert is_sf_audio_data(byte_data) + wav_path = io.BytesIO(byte_data) + for i in range(self.retry_times): + if i < self.retry_times - 1: + try: + wav, cur_sample_rate = sf.read(wav_path) + break + except Exception as e: + logger.warn(f"Fail to load wav for the {i} time") + logger.warn(e) + time.sleep(1) + continue + else: + wav, cur_sample_rate = sf.read(wav_path) + + wav = torch.from_numpy(wav).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.tokenizer is not None and self.fine_tuning: + label = self.tokenizer.encode(label) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def __getitem__(self, index): + wav = self.get_audio(index) + labels = self.get_labels(index) + return {"id": index, "source": wav, "label_list": labels} + + def __len__(self): + return len(self.wav_sizes) + + def crop_to_max_size(self, wav, target_size): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + + start, end = 0, target_size + if self.random_crop: + start = np.random.randint(0, diff + 1) + end = size - diff + start + return wav[start:end], start + + def collater(self, samples): + # target = max(sizes) -> random_crop not used + # target = max_sample_size -> random_crop used for long + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + feat_dim = audios[0].size(-1) if audios[0].dim() > 1 else 1 + collated_audios, padding_mask, audio_starts = self.collater_audio( + audios, audio_size, feat_dim, + ) + + targets_by_label = [ + [s["label_list"][i] for s in samples] for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + if self.add_decoder_target: + if self.fine_tuning: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + else: + if self.tokenizer is not None: + decoder_label = [ + # Set 48 for translate int to char and avoid \n + torch.cat( + ( + torch.tensor( + self.tokenizer.sp.Encode( + "".join( + [chr(j + 48) for j in ( + targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]] + ).tolist()] + ), out_type=int + ) + ), + torch.tensor([self.tgt_dict.eos()]) + ), dim=0 + ).long() + for i in range(targets_list[0].size(0)) + ] + else: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + if self.mbart_style_lang_id: + decoder_label = [ + torch.cat((decoder_label[i], torch.tensor([self.tgt_lang_idx])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + dec_ntokens = sum(x.size(0) for x in decoder_label) + decoder_target = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=False, + ) + decoder_target_lengths = torch.tensor( + [x.size(0) for x in decoder_label], dtype=torch.long + ) + prev_output_tokens = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=True, + ) + + if self.tgt_lang_idx is not None and not self.mbart_style_lang_id: + assert (prev_output_tokens[:, 0] != self.tgt_dict.eos()).sum() == 0 + prev_output_tokens[:, 0] = self.tgt_lang_idx + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "decoder_target": decoder_target, + "decoder_target_lengths": decoder_target_lengths, + "dec_ntokens": dec_ntokens, + "lang_idx": self.tgt_lang_idx, + } + else: + net_input = {"source": collated_audios, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch + + def collater_audio(self, audios, audio_size, feat_dim=1): + collated_audios = audios[0].new_zeros(len(audios), audio_size, feat_dim) + padding_mask = ( + torch.BoolTensor(collated_audios.shape[0:2]).fill_(False) + # if self.pad_audio else None + ) + audio_starts = [0 for _ in audios] + for i, audio in enumerate(audios): + audio = audio.view(-1, feat_dim) + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat([audio, audio.new_full((-diff, feat_dim), 0.0)]) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size + ) + return collated_audios.squeeze(-1), padding_mask, audio_starts + + def collater_frm_label(self, targets, audio_size, audio_starts, label_rate, pad): + assert label_rate > 0 + s2f = label_rate / self.sample_rate + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s : s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.wav_sizes[index] + return min(self.wav_sizes[index], self.max_sample_size) + + @property + def sizes(self): + return np.array(self.wav_sizes) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + + if self.shuffle: + if len(self.chunk_names) > 0: + logger.info(f"ordered indices for epoch {self.epoch}") + with data_utils.numpy_seed(self.epoch): + self.chunk_order = np.random.permutation(len(self.chunk_names)) + chunk_count = 0 + tmp_sizes = [] + tmp_indices = [] + indice = [] + for i in self.chunk_order: + chunk_count += 1 + start = self.chunk_indices[i] + end = self.chunk_indices[i+1] if i < len(self.chunk_names) - 1 else len(self) + size = list(self.sizes[start:end]) + tmp_indices.extend(list(np.arange(start, end))) + tmp_sizes.extend(size) + if chunk_count % 10 == 0 or i == self.chunk_order[0]: + order = [np.random.permutation(len(tmp_indices))] + order.append( + np.minimum( + np.array(tmp_sizes), + self.max_sample_size, + ) + ) + sort_idx = np.lexsort(order)[::-1] + indice.append(np.array([tmp_indices[k] for k in sort_idx])) + tmp_indices = [] + tmp_sizes =[] + return indice + else: + order = [np.random.permutation(len(self))] + order.append( + np.minimum( + np.array(self.sizes), + self.max_sample_size, + ) + ) + return np.lexsort(order)[::-1] + else: + return np.arange(len(self)) + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/Speech2S/speech2s/data/language_trible_dataset.py b/Speech2S/speech2s/data/language_trible_dataset.py new file mode 100644 index 0000000..6494127 --- /dev/null +++ b/Speech2S/speech2s/data/language_trible_dataset.py @@ -0,0 +1,669 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import numpy as np +import torch +import os +import itertools + +from fairseq.data import FairseqDataset, data_utils +from fairseq.data import ( + AppendTokenDataset, + ConcatDataset, + PrependTokenDataset, + data_utils, + indexed_dataset, +) + +logger = logging.getLogger(__name__) + +def load_langtriple_dataset( + data_path, + split, + src, + src_dict, + ref, + ref_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, + lang_format="[{}]", +): + assert not truncate_source + def split_exists(split, src, ref, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}-{}.{}".format(split, src, ref, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + ref_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, ref, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}-{}.".format(split_k, src, ref, tgt)) + elif split_exists(split_k, tgt, ref, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}-{}.".format(split_k, tgt, ref, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + src_datasets.append(src_dataset) + + ref_dataset = data_utils.load_indexed_dataset( + prefix + ref, ref_dict, dataset_impl + ) + ref_datasets.append(ref_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{}-{} {} examples".format( + data_path, split_k, src, ref, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(ref_datasets) + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + ref_dataset = ref_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + ref_dataset = ConcatDataset(ref_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(ref_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + ref_dataset = PrependTokenDataset(ref_dataset, ref_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + ref_dataset = PrependTokenDataset(ref_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index(lang_format.format(src)) + ) + ref_dataset = AppendTokenDataset( + ref_dataset, ref_dict.index(lang_format.format(ref)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index(lang_format.format(tgt)) + ) + eos = tgt_dict.index(lang_format.format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguageTripleDataset( + src_dataset, + src_dataset.sizes, + src_dict, + ref_dataset, + ref_dataset.sizes, + ref_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + ) + + +def collate( + samples, + pad_idx, + eos_idx, + left_pad_source=True, + left_pad_target=False, + input_feeding=True, + pad_to_length=None, + pad_to_multiple=1, +): + if len(samples) == 0: + return {} + + def merge(key, left_pad, move_eos_to_beginning=False, pad_to_length=None): + return data_utils.collate_tokens( + [s[key] for s in samples], + pad_idx, + None, + left_pad, + move_eos_to_beginning, + pad_to_length=pad_to_length, + pad_to_multiple=pad_to_multiple, + ) + + def check_alignment(alignment, src_len, tgt_len): + if alignment is None or len(alignment) == 0: + return False + if ( + alignment[:, 0].max().item() >= src_len - 1 + or alignment[:, 1].max().item() >= tgt_len - 1 + ): + logger.warning("alignment size mismatch found, skipping alignment!") + return False + return True + + def compute_alignment_weights(alignments): + """ + Given a tensor of shape [:, 2] containing the source-target indices + corresponding to the alignments, a weight vector containing the + inverse frequency of each target index is computed. + For e.g. if alignments = [[5, 7], [2, 3], [1, 3], [4, 2]], then + a tensor containing [1., 0.5, 0.5, 1] should be returned (since target + index 3 is repeated twice) + """ + align_tgt = alignments[:, 1] + _, align_tgt_i, align_tgt_c = torch.unique( + align_tgt, return_inverse=True, return_counts=True + ) + align_weights = align_tgt_c[align_tgt_i[np.arange(len(align_tgt))]] + return 1.0 / align_weights.float() + + id = torch.LongTensor([s["id"] for s in samples]) + src_tokens = merge( + "source", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + ref_tokens = merge( + "reference", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + # sort by descending source length + src_lengths = torch.LongTensor( + [s["source"].ne(pad_idx).long().sum() for s in samples] + ) + ref_lengths = torch.LongTensor( + [s["reference"].ne(pad_idx).long().sum() for s in samples] + ) + src_lengths, sort_order = src_lengths.sort(descending=True) + id = id.index_select(0, sort_order) + src_tokens = src_tokens.index_select(0, sort_order) + ref_lengths = ref_lengths.index_select(0, sort_order) + ref_tokens = ref_tokens.index_select(0, sort_order) + + prev_output_tokens = None + target = None + if samples[0].get("target", None) is not None: + target = merge( + "target", + left_pad=left_pad_target, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + target = target.index_select(0, sort_order) + tgt_lengths = torch.LongTensor( + [s["target"].ne(pad_idx).long().sum() for s in samples] + ).index_select(0, sort_order) + ntokens = tgt_lengths.sum().item() + + if samples[0].get("prev_output_tokens", None) is not None: + prev_output_tokens = merge("prev_output_tokens", left_pad=left_pad_target) + elif input_feeding: + # we create a shifted version of targets for feeding the + # previous output token(s) into the next decoder step + prev_output_tokens = merge( + "target", + left_pad=left_pad_target, + move_eos_to_beginning=True, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + else: + ntokens = src_lengths.sum().item() + + batch = { + "id": id, + "nsentences": len(samples), + "ntokens": ntokens, + "net_input": { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + }, + "target": target, + "ref_tokens": ref_tokens, + "ref_lengths": ref_lengths, + } + if prev_output_tokens is not None: + batch["net_input"]["prev_output_tokens"] = prev_output_tokens.index_select( + 0, sort_order + ) + + if samples[0].get("alignment", None) is not None: + bsz, tgt_sz = batch["target"].shape + src_sz = batch["net_input"]["src_tokens"].shape[1] + + offsets = torch.zeros((len(sort_order), 2), dtype=torch.long) + offsets[:, 1] += torch.arange(len(sort_order), dtype=torch.long) * tgt_sz + if left_pad_source: + offsets[:, 0] += src_sz - src_lengths + if left_pad_target: + offsets[:, 1] += tgt_sz - tgt_lengths + + alignments = [ + alignment + offset + for align_idx, offset, src_len, tgt_len in zip( + sort_order, offsets, src_lengths, tgt_lengths + ) + for alignment in [samples[align_idx]["alignment"].view(-1, 2)] + if check_alignment(alignment, src_len, tgt_len) + ] + + if len(alignments) > 0: + alignments = torch.cat(alignments, dim=0) + align_weights = compute_alignment_weights(alignments) + + batch["alignments"] = alignments + batch["align_weights"] = align_weights + + if samples[0].get("constraints", None) is not None: + # Collate the packed constraints across the samples, padding to + # the length of the longest sample. + lens = [sample.get("constraints").size(0) for sample in samples] + max_len = max(lens) + constraints = torch.zeros((len(samples), max(lens))).long() + for i, sample in enumerate(samples): + constraints[i, 0 : lens[i]] = samples[i].get("constraints") + batch["constraints"] = constraints.index_select(0, sort_order) + + return batch + + +class LanguageTripleDataset(FairseqDataset): + """ + A pair of torch.utils.data.Datasets. + + Args: + src (torch.utils.data.Dataset): source dataset to wrap + src_sizes (List[int]): source sentence lengths + src_dict (~fairseq.data.Dictionary): source vocabulary + tgt (torch.utils.data.Dataset, optional): target dataset to wrap + tgt_sizes (List[int], optional): target sentence lengths + tgt_dict (~fairseq.data.Dictionary, optional): target vocabulary + left_pad_source (bool, optional): pad source tensors on the left side + (default: True). + left_pad_target (bool, optional): pad target tensors on the left side + (default: False). + shuffle (bool, optional): shuffle dataset elements before batching + (default: True). + input_feeding (bool, optional): create a shifted version of the targets + to be passed into the model for teacher forcing (default: True). + remove_eos_from_source (bool, optional): if set, removes eos from end + of source if it's present (default: False). + append_eos_to_target (bool, optional): if set, appends eos to end of + target if it's absent (default: False). + align_dataset (torch.utils.data.Dataset, optional): dataset + containing alignments. + constraints (Tensor, optional): 2d tensor with a concatenated, zero- + delimited list of constraints for each sentence. + append_bos (bool, optional): if set, appends bos to the beginning of + source/target sentence. + num_buckets (int, optional): if set to a value greater than 0, then + batches will be bucketed into the given number of batch shapes. + src_lang_id (int, optional): source language ID, if set, the collated batch + will contain a field 'src_lang_id' in 'net_input' which indicates the + source language of the samples. + tgt_lang_id (int, optional): target language ID, if set, the collated batch + will contain a field 'tgt_lang_id' which indicates the target language + of the samples. + """ + + def __init__( + self, + src, + src_sizes, + src_dict, + ref, + ref_sizes, + ref_dict, + tgt=None, + tgt_sizes=None, + tgt_dict=None, + left_pad_source=True, + left_pad_target=False, + shuffle=True, + input_feeding=True, + remove_eos_from_source=False, + append_eos_to_target=False, + align_dataset=None, + constraints=None, + append_bos=False, + eos=None, + num_buckets=0, + src_lang_id=None, + tgt_lang_id=None, + pad_to_multiple=1, + ): + if tgt_dict is not None: + assert src_dict.pad() == tgt_dict.pad() + assert src_dict.eos() == tgt_dict.eos() + assert src_dict.unk() == tgt_dict.unk() + if tgt is not None: + assert len(src) == len( + tgt + ), "Source and target must contain the same number of examples" + assert len(src) == len( + ref + ), "Source and reference must contain the same number of examples" + self.src = src + self.ref = ref + self.tgt = tgt + self.src_sizes = np.array(src_sizes) + self.ref_sizes = np.array(ref_sizes) + self.tgt_sizes = np.array(tgt_sizes) if tgt_sizes is not None else None + self.sizes = ( + np.vstack((self.src_sizes, self.tgt_sizes)).T + if self.tgt_sizes is not None + else self.src_sizes + ) + self.src_dict = src_dict + self.ref_dict = ref_dict + self.tgt_dict = tgt_dict + self.left_pad_source = left_pad_source + self.left_pad_target = left_pad_target + self.shuffle = shuffle + self.input_feeding = input_feeding + self.remove_eos_from_source = remove_eos_from_source + self.append_eos_to_target = append_eos_to_target + self.align_dataset = align_dataset + if self.align_dataset is not None: + assert ( + self.tgt_sizes is not None + ), "Both source and target needed when alignments are provided" + self.constraints = constraints + self.append_bos = append_bos + self.eos = eos if eos is not None else src_dict.eos() + self.src_lang_id = src_lang_id + self.tgt_lang_id = tgt_lang_id + if num_buckets > 0: + from fairseq.data import BucketPadLengthDataset + + self.src = BucketPadLengthDataset( + self.src, + sizes=self.src_sizes, + num_buckets=num_buckets, + pad_idx=self.src_dict.pad(), + left_pad=self.left_pad_source, + ) + self.src_sizes = self.src.sizes + logger.info("bucketing source lengths: {}".format(list(self.src.buckets))) + self.ref = BucketPadLengthDataset( + self.ref, + sizes=self.ref_sizes, + num_buckets=num_buckets, + pad_idx=self.ref_dict.pad(), + left_pad=self.left_pad_source, + ) + self.ref_sizes = self.ref.sizes + logger.info("bucketing reference lengths: {}".format(list(self.src.buckets))) + if self.tgt is not None: + self.tgt = BucketPadLengthDataset( + self.tgt, + sizes=self.tgt_sizes, + num_buckets=num_buckets, + pad_idx=self.tgt_dict.pad(), + left_pad=self.left_pad_target, + ) + self.tgt_sizes = self.tgt.sizes + logger.info( + "bucketing target lengths: {}".format(list(self.tgt.buckets)) + ) + + # determine bucket sizes using self.num_tokens, which will return + # the padded lengths (thanks to BucketPadLengthDataset) + num_tokens = np.vectorize(self.num_tokens, otypes=[np.compat.long]) + self.bucketed_num_tokens = num_tokens(np.arange(len(self.src))) + self.buckets = [ + (None, num_tokens) for num_tokens in np.unique(self.bucketed_num_tokens) + ] + else: + self.buckets = None + self.pad_to_multiple = pad_to_multiple + + def get_batch_shapes(self): + return self.buckets + + def __getitem__(self, index): + tgt_item = self.tgt[index] if self.tgt is not None else None + src_item = self.src[index] + ref_item = self.ref[index] + # Append EOS to end of tgt sentence if it does not have an EOS and remove + # EOS from end of src sentence if it exists. This is useful when we use + # use existing datasets for opposite directions i.e., when we want to + # use tgt_dataset as src_dataset and vice versa + if self.append_eos_to_target: + eos = self.tgt_dict.eos() if self.tgt_dict else self.src_dict.eos() + if self.tgt and self.tgt[index][-1] != eos: + tgt_item = torch.cat([self.tgt[index], torch.LongTensor([eos])]) + + if self.append_bos: + bos = self.tgt_dict.bos() if self.tgt_dict else self.src_dict.bos() + if self.tgt and self.tgt[index][0] != bos: + tgt_item = torch.cat([torch.LongTensor([bos]), self.tgt[index]]) + + bos = self.src_dict.bos() + if self.src[index][0] != bos: + src_item = torch.cat([torch.LongTensor([bos]), self.src[index]]) + if self.ref[index][0] != bos: + ref_item = torch.cat([torch.LongTensor([bos]), self.ref[index]]) + + if self.remove_eos_from_source: + eos = self.src_dict.eos() + if self.src[index][-1] == eos: + src_item = self.src[index][:-1] + if self.ref[index][-1] == eos: + ref_item = self.ref[index][:-1] + + example = { + "id": index, + "source": src_item, + "reference": ref_item, + "target": tgt_item, + } + if self.align_dataset is not None: + example["alignment"] = self.align_dataset[index] + if self.constraints is not None: + example["constraints"] = self.constraints[index] + return example + + def __len__(self): + return len(self.src) + + def collater(self, samples, pad_to_length=None): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + pad_to_length (dict, optional): a dictionary of + {'source': source_pad_to_length, 'target': target_pad_to_length} + to indicate the max length to pad to in source and target respectively. + + Returns: + dict: a mini-batch with the following keys: + + - `id` (LongTensor): example IDs in the original input order + - `ntokens` (int): total number of tokens in the batch + - `net_input` (dict): the input to the Model, containing keys: + + - `src_tokens` (LongTensor): a padded 2D Tensor of tokens in + the source sentence of shape `(bsz, src_len)`. Padding will + appear on the left if *left_pad_source* is ``True``. + - `src_lengths` (LongTensor): 1D Tensor of the unpadded + lengths of each source sentence of shape `(bsz)` + - `prev_output_tokens` (LongTensor): a padded 2D Tensor of + tokens in the target sentence, shifted right by one + position for teacher forcing, of shape `(bsz, tgt_len)`. + This key will not be present if *input_feeding* is + ``False``. Padding will appear on the left if + *left_pad_target* is ``True``. + - `src_lang_id` (LongTensor): a long Tensor which contains source + language IDs of each sample in the batch + + - `target` (LongTensor): a padded 2D Tensor of tokens in the + target sentence of shape `(bsz, tgt_len)`. Padding will appear + on the left if *left_pad_target* is ``True``. + - `tgt_lang_id` (LongTensor): a long Tensor which contains target language + IDs of each sample in the batch + """ + res = collate( + samples, + pad_idx=self.src_dict.pad(), + eos_idx=self.eos, + left_pad_source=self.left_pad_source, + left_pad_target=self.left_pad_target, + input_feeding=self.input_feeding, + pad_to_length=pad_to_length, + pad_to_multiple=self.pad_to_multiple, + ) + if self.src_lang_id is not None or self.tgt_lang_id is not None: + src_tokens = res["net_input"]["src_tokens"] + bsz = src_tokens.size(0) + if self.src_lang_id is not None: + res["net_input"]["src_lang_id"] = ( + torch.LongTensor([[self.src_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + if self.tgt_lang_id is not None: + res["tgt_lang_id"] = ( + torch.LongTensor([[self.tgt_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + return res + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return max( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def num_tokens_vec(self, indices): + """Return the number of tokens for a set of positions defined by indices. + This value is used to enforce ``--max-tokens`` during batching.""" + sizes = self.src_sizes[indices] + if self.tgt_sizes is not None: + sizes = np.maximum(sizes, self.tgt_sizes[indices]) + return sizes + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return ( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + if self.buckets is None: + # sort by target length, then source length + if self.tgt_sizes is not None: + indices = indices[np.argsort(self.tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(self.src_sizes[indices], kind="mergesort")] + else: + # sort by bucketed_num_tokens, which is: + # max(padded_src_len, padded_tgt_len) + return indices[ + np.argsort(self.bucketed_num_tokens[indices], kind="mergesort") + ] + + @property + def supports_prefetch(self): + return getattr(self.src, "supports_prefetch", False) and ( + getattr(self.tgt, "supports_prefetch", False) or self.tgt is None + ) + + def prefetch(self, indices): + self.src.prefetch(indices) + if self.tgt is not None: + self.tgt.prefetch(indices) + if self.align_dataset is not None: + self.align_dataset.prefetch(indices) + + def filter_indices_by_size(self, indices, max_sizes): + """Filter a list of sample indices. Remove those that are longer + than specified in max_sizes. + + Args: + indices (np.array): original array of sample indices + max_sizes (int or list[int] or tuple[int]): max sample size, + can be defined separately for src and tgt (then list or tuple) + + Returns: + np.array: filtered sample array + list: list of removed indices + """ + return data_utils.filter_paired_dataset_indices_by_size( + self.src_sizes, + self.tgt_sizes, + indices, + max_sizes, + ) diff --git a/Speech2S/speech2s/data/load_langpair_dataset.py b/Speech2S/speech2s/data/load_langpair_dataset.py new file mode 100644 index 0000000..bfd2045 --- /dev/null +++ b/Speech2S/speech2s/data/load_langpair_dataset.py @@ -0,0 +1,172 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/272c4c5197250997148fb12c0db6306035f166a4/fairseq/tasks/translation.py + 1. Add custom lang_format in function load_langpair_dataset + 2. If truncate_source (default no), use RandomCropDataset instead of TruncateDataset +""" + +import itertools +import logging +import os + +from fairseq.data import ( + AppendTokenDataset, + LanguagePairDataset, + PrependTokenDataset, + StripTokenDataset, + TruncateDataset, + RandomCropDataset, + data_utils, + indexed_dataset, +) + +from speechut.data.concat_dataset import ConcatDataset + + +EVAL_BLEU_ORDER = 4 + + +logger = logging.getLogger(__name__) + + +def load_langpair_dataset( + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, + lang_format="[{}]", + input_feeding=True, +): + def split_exists(split, src, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}.{}".format(split, src, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, src, tgt)) + elif split_exists(split_k, tgt, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, tgt, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + if truncate_source: + src_dataset = AppendTokenDataset( + RandomCropDataset( + StripTokenDataset(src_dataset, src_dict.eos()), + max_source_positions - 1, + ), + src_dict.eos(), + ) + src_datasets.append(src_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{} {} examples".format( + data_path, split_k, src, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index(lang_format.format(src)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index(lang_format.format(tgt)) + ) + eos = tgt_dict.index(lang_format.format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguagePairDataset( + src_dataset, + src_dataset.sizes, + src_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + input_feeding=input_feeding, + ) diff --git a/Speech2S/speech2s/data/multimodal_corpus_dataset.py b/Speech2S/speech2s/data/multimodal_corpus_dataset.py new file mode 100644 index 0000000..19a6f89 --- /dev/null +++ b/Speech2S/speech2s/data/multimodal_corpus_dataset.py @@ -0,0 +1,368 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +from os import replace +import time +from collections import OrderedDict +from typing import Any, Dict, List, Optional + +import numpy as np +from fairseq.data import data_utils + +from fairseq.data import FairseqDataset + +logger = logging.getLogger(__name__) + + +class MultiCorpusDataset(FairseqDataset): + """ + see fairseq/fairseq/data/multi_corpus_dataset.__doc__ + + Args: + datasets: a OrderedDict of FairseqDataset instances. + distribution: a List containing the probability of getting an utterance from + corresponding dataset + seed: random seed for sampling the datsets + sort_indices: if true, will sort the ordered indices by size + batch_sample: if true, will ensure each batch is from a single dataset + """ + + def __init__( + self, + datasets: Dict[str, FairseqDataset], + max_positions: Dict, + distribution: List[float], + max_tokens_ratio: List[float], + seed: int = 1234, + sort_indices: bool = False, + check_length: bool = False, + ): + super().__init__() + assert isinstance(datasets, OrderedDict) + assert len(datasets) == len(distribution) + # assert sum(distribution) == 1 + self.datasets = datasets + self.distribution = distribution + self.max_tokens_ratio = max_tokens_ratio + self.seed = seed + self.sort_indices = sort_indices + self.max_positions = max_positions + self.check_length = check_length + + # Avoid repeated conversions to list later + self.dataset_list = list(datasets.values()) + self.total_num_instances = 0 + + # first_dataset = self.dataset_list[0] + + self.num_instances_per_dataset = [] + self.dataset_offsets = [] + for i, dataset in enumerate(self.dataset_list): + assert isinstance(dataset, FairseqDataset) + # assert type(dataset) is type(first_dataset) + self.num_instances_per_dataset.append( + 0 if self.distribution[i] == 0 else len(dataset) + ) + self.dataset_offsets.append(self.total_num_instances) + self.total_num_instances += self.num_instances_per_dataset[i] + + def ordered_indices(self): + start = time.time() + with data_utils.numpy_seed(self.seed, self.epoch): + logger.info(f"sampling new dataset with seed {self.seed} epoch {self.epoch}") + sampled_indices = {} + + # For each dataset i, sample self.distribution[i] * self.total_num_instances + for i, key in enumerate(self.datasets): + tp = time.time() + if self.distribution[i] == 0: + # skip dataset if sampling probability is 0 + continue + + if i < len(self.datasets) - 1: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.dataset_offsets[i + 1] + else: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.total_num_instances + + logger.info(f"sampling {num_instances} from {key} dataset") + + # First, add k copies of the dataset where k = num_instances // len(dataset). + # This ensures an equal distribution of the data points as much as possible. + # For the remaining entries randomly sample them + dataset_size = len(self.datasets[key]) + num_copies = num_instances // dataset_size + dataset_indices = np.random.permutation(high - self.dataset_offsets[i])[: num_instances - num_copies * dataset_size] + if num_copies > 0: + dataset_indices = np.concatenate( + ( + np.repeat( + np.arange(high - self.dataset_offsets[i]), num_copies + ), + dataset_indices, + ) + ) + # filter by size, we should ignore it by setting check_length=False + # , as it is very time-consuming on large dadaset + if self.max_positions[key] is not None and self.check_length: + dataset_indices, ignored = self.datasets[key].filter_indices_by_size( + dataset_indices, + self.max_positions[key], + ) + if len(ignored) > 0: + logger.warning( + ( + "{:,} samples have invalid sizes and will be skipped, " + "max_positions={}, first few sample ids={}" + ).format(len(ignored), self.max_positions[key], ignored[:10]) + ) + + if self.sort_indices: + logger.info(" - sampled indices took {}s".format(time.time() - tp)) + tp = time.time() + dataset_indices = np.sort(dataset_indices) + ordered_indices = self.datasets[key].ordered_indices() + if isinstance(ordered_indices[0], np.ndarray): # chunked audio data + dataset_indices = [order_idx + self.dataset_offsets[i] for order_idx in ordered_indices] + assert self.dataset_offsets[i] == 0 + # TODO for chunked audio data, now assume len(dataset_indices) == len(dataset). Don't filter any data. + else: + dataset_indices = ordered_indices[dataset_indices] + self.dataset_offsets[i] + logger.info(" - ordered_indices took {}s".format(time.time() - tp)) + else: + np.random.shuffle(dataset_indices) + + sampled_indices[key] = dataset_indices + + logger.info( + "multi_corpus_dataset ordered_indices took {}s".format( + time.time() - start + ) + ) + return sampled_indices + + def _map_index(self, index: int): + """ + If dataset A has length N and dataset B has length M + then index 1 maps to index 1 of dataset A, and index N + 1 + maps to index 1 of B. + """ + counter = 0 + for num_instances, key in zip(self.num_instances_per_dataset, self.datasets): + if index < counter + num_instances: + return index - counter, key + counter += num_instances + raise ValueError( + "Invalid index: {}, max: {}".format(index, self.total_num_instances) + ) + + def __len__(self): + """ + Length of this dataset is the sum of individual datasets + """ + return self.total_num_instances + + def __getitem__(self, index): + new_index, key = self._map_index(index) + try: + item = self.datasets[key][new_index] + item["full_id"] = index + return item + except Exception as e: + e.args = (f"Error from {key} dataset", *e.args) + raise + + def collater(self, samples): + """ + If we are doing batch sampling, then pick the right collater to use. + + Otherwise we assume all collaters are the same. + """ + if len(samples) == 0: + return None + + samples_dict = {key: [] for key in self.datasets} + for s in samples: + _, key = self._map_index(s["full_id"]) + samples_dict[key].append(s) + + batch = {} + for key in samples_dict: + if len(samples_dict[key]) == 0: + continue + batch[key] = self.datasets[key].collater(samples_dict[key]) + + return batch + + + def num_tokens(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].num_tokens(index) + + def size(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].size(index) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return False + + def set_epoch(self, epoch, **unused): + super().set_epoch(epoch) + logger.info(f"setting epoch of multi_corpus_dataset to {epoch}") + for ds in self.dataset_list: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) + self.epoch = epoch + + @property + def supports_prefetch(self): + return False + + @property + def supports_fetch_outside_dataloader(self): + return all( + self.datasets[key].supports_fetch_outside_dataloader + for key in self.datasets + ) + + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + dataset_indices = indices + batches_dict = {} + for n, key in enumerate(dataset_indices): + max_tokens_ratio = self.max_tokens_ratio[n] + if isinstance(dataset_indices[key][0], np.ndarray): # chunked audio data + cur_batches = self.datasets[key].batch_by_size( + dataset_indices[key], + round(max_tokens * max_tokens_ratio), + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {sum([len(b) for b in cur_batches])} [{len(cur_batches)}] batches for dataset {key}") + else: + cur_batches = super().batch_by_size( + np.array(dataset_indices[key], dtype=np.int64), + round(max_tokens * max_tokens_ratio), + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {len(cur_batches)} batches for dataset {key}") + batches_dict[key] = cur_batches + + return batches_dict + + + def get_batch_sampler( + self, + indices, + num_shards, + seed, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + split_modality_batch=False, + ): + + def batch_sampler(dataset, epoch): + start = time.time() + batches_dict = dataset.batch_by_size( + indices, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + logger.info(f"multi_corpus_dataset, batch_by_size took {time.time() - start}s") + start = time.time() + new_batches = [] + + ### shuffle inner group size, split into speech/text batches + shuffled_batches_list = [] + speech_batches = [] + ### we should specify the speech_batches because: we need concatenate different speech datasets + # (e.g. ltr or km) instead of loading them parellelly. + for name, batches in batches_dict.items(): + if name.startswith("speech"): + if isinstance(batches[0], list): # chunked audio data + batches = self.datasets[name].shuffle_batches(list(batches), seed + epoch) + shuffled_batches_list.append(batches) + else: + batches = inner_bucket_shuffle(batches, seed+epoch, num_shards*10) + batches = batches[: (len(batches) // num_shards) * num_shards] + if len(batches) == 0: + logger.warning(f"Sample 0 batch for {name}, you should ensure that no {name} data provided.") + else: + speech_batches += batches + else: + batches = inner_bucket_shuffle(batches, seed+epoch, num_shards*10) + batches = batches[: (len(batches) // num_shards) * num_shards] + if len(batches) == 0: + logger.warning(f"Sample 0 batch for {name}, you should ensure that no {name} data provided.") + else: + batches = shuffle_buckets(batches, seed=seed+epoch, inner_shuf=False) + shuffled_batches_list.append(batches) + if len(speech_batches) > 0: + speech_batches = shuffle_buckets(speech_batches, seed=seed+epoch, inner_shuf=False) + shuffled_batches_list.append(speech_batches) + + ### create the final new_batches + num_batch = min(len(batches) for batches in shuffled_batches_list) + if split_modality_batch: + for i in range(0, num_batch, num_shards): + for batches in shuffled_batches_list: + new_batches += batches[i: i + num_shards] + else: + for i in range(num_batch): + new_batches.append(np.concatenate([batches[i] for batches in shuffled_batches_list])) + + logger.info(f"multi_corpus_dataset sample {len(new_batches)} batches, took {time.time() - start}s") + return new_batches + + def inner_bucket_shuffle(batches, seed, bucket_size=10, thr=0): + """we assert batches is sorted form long to short. + shuffle samples in a buctet(e.g. 10 batches). + batches: a list of numpy array""" + num_batch = len(batches) + new_batches = [] + num_buckets = len(batches) // bucket_size + i = 0 + while i < num_batch: + if (i < bucket_size * thr or + i >= bucket_size * (num_buckets - thr) + ): + new_batches.append(batches[i]) + i += 1 + else: + group = np.concatenate(batches[i: i+bucket_size]) + with data_utils.numpy_seed(seed): + np.random.shuffle(group) + new_batches += np.array_split(group, bucket_size) + i += bucket_size + assert all([len(batch) > 0 for batch in new_batches]) + return new_batches + + def shuffle_buckets(batches, seed, inner_shuf=True): + if inner_shuf: + batches = inner_bucket_shuffle(batches, seed, num_shards*10) + batches = [batches[i: i + num_shards] for i in range(0, len(batches)-num_shards+1, num_shards)] + assert len(batches[-1]) == num_shards + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for group in batches: + new_batches += group + return new_batches + + return batch_sampler diff --git a/Speech2S/speech2s/models/__init__.py b/Speech2S/speech2s/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Speech2S/speech2s/models/speechut.py b/Speech2S/speech2s/models/speechut.py new file mode 100644 index 0000000..cb66828 --- /dev/null +++ b/Speech2S/speech2s/models/speechut.py @@ -0,0 +1,785 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +from fairseq import utils, checkpoint_utils +from fairseq.data.data_utils import compute_mask_indices +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass import ChoiceEnum +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.transformer import Embedding +from fairseq.file_io import PathManager +from torch import Tensor +from fairseq.models.wav2vec.wav2vec2 import ConvFeatureExtractionModel +from fairseq.modules import GradMultiply, LayerNorm +from fairseq.tasks.hubert_pretraining import ( + HubertPretrainingConfig, + HubertPretrainingTask, +) +from fairseq.models.hubert import HubertConfig +from fairseq.models.transformer import TransformerConfig +from speechut.modules import TransformerEncoder +from speechut.modules import TransformerEncoderBase +from speechut.modules import TransformerDecoderBaseScriptable + +logger = logging.getLogger(__name__) + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +@dataclass + +class SpeechutConfig(HubertConfig): + use_rel_pos_enc: bool = field( + default=False, + metadata={"help": "whether to use relative positional encoding"}, + ) + scaling_for_att: float = field( + default=1.0, + metadata={"help": "scaling for attention weights to prevent overflow issue (for large model)"}, + ) + + # unit encoder-decoder + text_transformer: TransformerConfig = TransformerConfig() + reset_decoder_embedding_config: bool = field( + default=False, + metadata={"help": "reset the no_scale_embedding/layernorm_embedding to default for the decoder"}, + ) + add_unit_encoder: bool = field( + default=False, + metadata={"help": "add unit encoder"}, + ) + add_decoder: bool = field( + default=True, + metadata={"help": "add decoder"}, + ) + add_text_ctc: bool = field( + default=False, + metadata={"help": "add_text_ctc head"}, + ) + text_ctc_conv_kernel: int = field( + default=2, + metadata={"help": "text_ctc_conv kernel size"}, + ) + mask_u2t: bool = field( + default=True, + metadata={"help": "mask the unit input in unit-to-text task"}, + ) + + # embedding mixing + mix_with_unit: bool = field( + default=True, + metadata={"help": "mix with the unit embeddings"}, + ) + use_pred_unit: bool = field( + default=False, + metadata={"help": "use the embeddings of predicted units"}, + ) + l2_embedding: bool = field( + default=False, + metadata={"help": "compute l2 loss between unit embedding and unit hidden state"}, + ) + + # Finetune related + encoder_dict_size: int = field( + default=-1, + metadata={"help": "text encoder dictionary dimension"}, + ) + + decoder_dict_size: int = field( + default=-1, + metadata={"help": "decoder dictionary dimension"}, + ) + + +@register_model("speechut", dataclass=SpeechutConfig) +class SpeechutModel(BaseFairseqModel): + def __init__( + self, + cfg: SpeechutConfig, + task_cfg: HubertPretrainingConfig, + dictionaries: List[Dictionary], + unit_dictionary: Dictionary = None, + text_tgt_dictionary: Dictionary = None, + ) -> None: + super().__init__() + logger.info(f"SpeechutModel Config: {cfg}") + + feature_enc_layers = eval(cfg.conv_feature_layers) # noqa + self.embed = feature_enc_layers[-1][0] + + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + mode=cfg.extractor_mode, + conv_bias=cfg.conv_bias, + ) + feature_ds_rate = np.prod([s for _, _, s in feature_enc_layers]) + self.feat2tar_ratio = cfg.label_rate * feature_ds_rate / task_cfg.sample_rate + + self.post_extract_proj = ( + nn.Linear(self.embed, cfg.encoder_embed_dim) + if self.embed != cfg.encoder_embed_dim + else None + ) + + self.mask_prob = cfg.mask_prob + self.mask_selection = cfg.mask_selection + self.mask_other = cfg.mask_other + self.mask_length = cfg.mask_length + self.no_mask_overlap = cfg.no_mask_overlap + self.mask_min_space = cfg.mask_min_space + + self.mask_channel_prob = cfg.mask_channel_prob + self.mask_channel_selection = cfg.mask_channel_selection + self.mask_channel_other = cfg.mask_channel_other + self.mask_channel_length = cfg.mask_channel_length + self.no_mask_channel_overlap = cfg.no_mask_channel_overlap + self.mask_channel_min_space = cfg.mask_channel_min_space + + self.dropout_input = nn.Dropout(cfg.dropout_input) + self.dropout_features = nn.Dropout(cfg.dropout_features) + + self.feature_grad_mult = cfg.feature_grad_mult + self.logit_temp = cfg.logit_temp + self.skip_masked = cfg.skip_masked + self.skip_nomask = cfg.skip_nomask + + final_dim = cfg.final_dim if cfg.final_dim > 0 else cfg.encoder_embed_dim + + self.mask_emb = nn.Parameter( + torch.FloatTensor(cfg.encoder_embed_dim).uniform_() + ) + + self.encoder = TransformerEncoder(cfg) + self.layer_norm = LayerNorm(self.embed) + + self.target_glu = None + if cfg.target_glu: + self.target_glu = nn.Sequential( + nn.Linear(final_dim, final_dim * 2), nn.GLU() + ) + + self.final_dim = final_dim + assert len(dictionaries) <= 2, f"Only support <=2 kinds of targets, get {len(dictionaries)} dictionaries" + if len(dictionaries) == 1: + dictionaries = [dictionaries[0], dictionaries[0]] + self.num_classes = [len(d) for d in dictionaries] + + self.final_proj = nn.Linear(cfg.encoder_embed_dim, final_dim) + self.code_encoder_proj = nn.Linear(cfg.text_transformer.encoder.embed_dim, self.num_classes[-1]) + self.final_proj_list = [self.final_proj, self.code_encoder_proj] + + self.label_embs_concat = nn.Parameter(torch.FloatTensor(self.num_classes[0], final_dim)) + self.label_embs_list = [self.label_embs_concat] + for p in self.label_embs_list: + nn.init.uniform_(p) + + ### build unit encoder: + self.mask_u2t = cfg.mask_u2t + self.add_text_ctc = cfg.add_text_ctc + self.text_ctc_conv_kernel = cfg.text_ctc_conv_kernel + self.padding_idx = unit_dictionary.pad() + self.unit_mask_idx = unit_dictionary.index("") + + self.add_unit_encoder = cfg.add_unit_encoder + self.mix_with_unit = cfg.mix_with_unit + self.use_pred_unit = cfg.use_pred_unit + self.l2_embedding = cfg.l2_embedding + if self.add_unit_encoder: + assert len(unit_dictionary) == self.num_classes[0], f"unit_dictionary: {len(unit_dictionary)}, self.num_classes[0]: {self.num_classes[0]}" + ### build unit pre-net, and shared with hubert label_embs if needed (default: False) + self.unit_embed_tokens = self.build_embedding( + unit_dictionary, + cfg.text_transformer.encoder.embed_dim, + ) + if self.final_dim == cfg.text_transformer.encoder.embed_dim: + logger.info("Share label_embs[0] with unit_embed_tokens ...") + nn.init.uniform_(self.unit_embed_tokens.weight) + self.label_embs_list[0] = self.unit_embed_tokens.weight + + ### build unit encoder + self.unit_encoder = TransformerEncoderBase( + cfg.text_transformer, + unit_dictionary, + self.unit_embed_tokens, + use_rel_pos_enc=cfg.use_rel_pos_enc, + scaling_for_att=cfg.scaling_for_att, + ) + + ### build text ctc head + if self.add_text_ctc: + conv = nn.Conv1d( + cfg.text_transformer.encoder.embed_dim, cfg.text_transformer.encoder.embed_dim, + self.text_ctc_conv_kernel, + stride=self.text_ctc_conv_kernel // 2, + bias=False, + padding=self.text_ctc_conv_kernel // 2, + ) + nn.init.kaiming_normal_(conv.weight) + self.unit_encoder_ctc_head = nn.Sequential( + Rotate3D(), + conv, + nn.Dropout(p=0.1), + nn.Sequential( + Rotate3D(), + Rotate3D(), + LayerNorm(cfg.text_transformer.encoder.embed_dim), + ), + nn.GELU(), + nn.Linear(cfg.text_transformer.encoder.embed_dim, len(text_tgt_dictionary)), + ) + + ### build unit2text decoder, not available for now + self.add_decoder = cfg.add_decoder + self.text_transformer_cfg = cfg.text_transformer + if self.add_decoder: + # To make sure that the decoder dict size is the same as the fine-tuning tgt_dict size or bpe code dict size + dec_dictionary = self.cutting_dictionary(text_tgt_dictionary, cfg.decoder_dict_size) + decoder_embed_tokens = self.build_embedding( + dec_dictionary, cfg.text_transformer.decoder.embed_dim + ) + if cfg.reset_decoder_embedding_config: + cfg.text_transformer.no_scale_embedding = False + cfg.text_transformer.layernorm_embedding = False + cfg.text_transformer.no_token_positional_embeddings = False + self.decoder = TransformerDecoderBaseScriptable(cfg.text_transformer, dec_dictionary, decoder_embed_tokens, use_rel_pos_enc=cfg.use_rel_pos_enc) + + + def cutting_dictionary(self, dictionary, dict_size): + if dictionary is None or dict_size <= 0: + return dictionary + else: + import copy + cut_dictionary = copy.deepcopy(dictionary) + if dict_size > len(cut_dictionary): + for i in range(dict_size - len(cut_dictionary)): + cut_dictionary.symbols.append(f'_{i}_') + else: + cut_dictionary.symbols = cut_dictionary.symbols[:dict_size] + return cut_dictionary + + def build_embedding(self, dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechutConfig, task: HubertPretrainingTask): + """Build a new model instance.""" + unit_dictionary = getattr(task, "text_src_dictionary", None) + text_tgt_dictionary = getattr(task, "text_dictionary", None) + model = SpeechutModel(cfg, task.cfg, task.dictionaries, unit_dictionary, text_tgt_dictionary) + return model + + def apply_mask(self, x, padding_mask, target_list): + B, T, C = x.shape + if self.mask_prob > 0: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob, + self.mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x[mask_indices] = self.mask_emb + else: + mask_indices = None + + if self.mask_channel_prob > 0: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + return x, mask_indices + + def forward_features(self, source: torch.Tensor) -> torch.Tensor: + if self.feature_grad_mult > 0: + features = self.feature_extractor(source) + if self.feature_grad_mult != 1.0: + features = GradMultiply.apply(features, self.feature_grad_mult) + else: + with torch.no_grad(): + features = self.feature_extractor(source) + return features + + def forward_targets( + self, + features: torch.Tensor, + target_list: List[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + # Trim features to ensure labels exist and then get aligned labels + feat_tsz = features.size(2) + targ_tsz = min([t.size(1) for t in target_list]) + if self.feat2tar_ratio * feat_tsz > targ_tsz: + feat_tsz = int(targ_tsz / self.feat2tar_ratio) + features = features[..., :feat_tsz] + target_inds = torch.arange(feat_tsz).float() * self.feat2tar_ratio + target_inds += np.random.choice(int(self.feat2tar_ratio)) + target_list = [t[:, target_inds.long()] for t in target_list] + return features, target_list + + def forward_padding_mask( + self, + features: torch.Tensor, + padding_mask: torch.Tensor, + ) -> torch.Tensor: + extra = padding_mask.size(1) % features.size(1) + if extra > 0: + padding_mask = padding_mask[:, :-extra] + padding_mask = padding_mask.view(padding_mask.size(0), features.size(1), -1) + padding_mask = padding_mask.all(-1) + return padding_mask + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def downsample_ctc_padding_mask(self, padding_mask): + """ + padding_mask: (B, T) + """ + stride = self.text_ctc_conv_kernel // 2 + return padding_mask[:, ::stride] + + def compute_pred(self, proj_x, label_embs): + if self.target_glu: + label_embs = self.target_glu(label_embs) + x = F.normalize(proj_x.float(), dim=-1) # (S, D) + label_embs = F.normalize(label_embs.float(), dim=-1) # (C, D) + logits = torch.matmul(x, label_embs.T).type_as(proj_x) # (S, C) + logits /= self.logit_temp + return logits + + def compute_hubert_logits(self, x, target, proj, label_embs, padding_mask, mask_indices): + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = proj(x[masked_indices]) + logit_m_list = [(self.compute_pred(proj_x_m, label_embs), target[masked_indices])] + else: + logit_m_list = [None] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = proj(x[nomask_indices]) + logit_u_list = [(self.compute_pred(proj_x_u, label_embs), target[nomask_indices])] + else: + logit_u_list = [None] + + return logit_m_list, logit_u_list + + def compute_ce_logits(self, x, target, proj, padding_mask, mask_indices): + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + logit_m_list = [(proj(x[masked_indices]), target[masked_indices])] + else: + logit_m_list = [None] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + logit_u_list = [(proj(x[nomask_indices]), target[nomask_indices])] + else: + logit_u_list = [None] + + return logit_m_list, logit_u_list + + def convert_embeddings(self, + x, + padding_mask, + target=None, + mask_indices=None, + mix_with_unit=False, + use_pred_unit=False, + l2_embedding=False, + remask=False + ): + """ + 1. Mix with units if needed (default: True) + 2. Prepare for unit_encoder inputs + Inputs: + x, (B, T, D) + Return: + src_tokens, (B, T) + soft_embeddings, (B, T, D) + l2_loss, a loss + """ + soft_embeddings = self.final_proj_list[0](x) if x.size(-1) == self.final_dim else x + if padding_mask is None: + padding_mask = soft_embeddings.new_zeros(soft_embeddings.size(0), soft_embeddings.size(1), dtype=torch.long) + if use_pred_unit: + src_tokens = self.compute_pred(self.final_proj_list[0](x), self.label_embs_list[0]).argmax(dim=-1) + src_tokens[padding_mask] = self.padding_idx + elif target is not None: + src_tokens = target + else: + src_tokens = padding_mask.long() + + if l2_embedding | mix_with_unit: + unit_embeddings = self.unit_embed_tokens(src_tokens) # (B, T, D) + + l2_loss = 0 + if l2_embedding: + if mask_indices is not None: + l2_loss = (soft_embeddings - unit_embeddings)[mask_indices].float().pow(2).mean(dim=-1) + scale = unit_embeddings[mask_indices].float().pow(2).sum(dim=-1) + else: + l2_loss = (soft_embeddings - unit_embeddings).float().pow(2).mean(dim=-1) + scale = unit_embeddings.float().pow(2).sum(dim=-1) + l2_loss = (l2_loss / scale).mean() + + if mix_with_unit: + B, T, D = x.shape + selected_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob / 2, + self.mask_length // 2, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + selected_indices = torch.from_numpy(selected_indices).to(x.device) + if mask_indices is not None: + if remask: + remask_indices = torch.logical_and(selected_indices, mask_indices) + soft_embeddings[remask_indices] = self.mask_emb + swap_indices = torch.logical_and(selected_indices, ~mask_indices) + else: + swap_indices = selected_indices + soft_embeddings[swap_indices] = unit_embeddings[swap_indices] + + soft_embeddings = soft_embeddings * (1 - padding_mask.unsqueeze(-1).type_as(x)) + return src_tokens, soft_embeddings, l2_loss + + def forward( + self, + source: torch.Tensor = None, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + prev_output_tokens: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert source is not None or src_tokens is not None + if source is not None: + return self.forward_speech( + source=source, + target_list=target_list, + padding_mask=padding_mask, + mask=mask, + features_only=features_only, + output_layer=output_layer, + ) + else: + return self.forward_text( + src_tokens=src_tokens, + src_lengths=src_lengths, + prev_output_tokens=prev_output_tokens, + mask=self.mask_u2t, + features_only=features_only, + output_layer=output_layer, + ) + + def forward_speech( + self, + source: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + features = self.forward_features(source) + if target_list is not None: + features, target_list = self.forward_targets(features, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + if mask: + x, mask_indices = self.apply_mask(features, padding_mask, target_list) + else: + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1, + ) + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features} + + logit_m_list, logit_u_list = self.compute_hubert_logits( + x, + target_list[0], + self.final_proj_list[0], + self.label_embs_list[0], + padding_mask, + mask_indices, + ) + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + + if self.add_unit_encoder: + src_tokens, x_emb, l2_loss = self.convert_embeddings( + x, + padding_mask, target_list[0], + mask_indices=mask_indices, + mix_with_unit=self.mix_with_unit, + use_pred_unit=self.use_pred_unit, + l2_embedding=self.l2_embedding, + ) + encoder_out = self.unit_encoder(src_tokens, token_embeddings=x_emb) + + result['encoder_out'] = encoder_out['encoder_out'] # [(T, B, D)] + result['encoder_padding_mask'] = encoder_out['encoder_padding_mask'] # [(B, T)] + if self.l2_embedding: + result['embedding_l2_loss'] = l2_loss + + code_logit_m_list, code_logit_u_list = self.compute_ce_logits( + encoder_out['encoder_out'][0].transpose(0, 1), # -> (B, T, C) + target_list[-1], + self.final_proj_list[1], + padding_mask, + mask_indices, + ) + result['logit_m_list'] += code_logit_m_list + result['logit_u_list'] += code_logit_u_list + return result + + def forward_text( + self, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + prev_output_tokens: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert self.add_unit_encoder, f"Can not forward unit-text branch without unit_encoder!" + + padding_mask = src_tokens == self.padding_idx + unit_embeddings = self.unit_embed_tokens(src_tokens) + if mask: + unit_embeddings, mask_indices = self.apply_mask(unit_embeddings, padding_mask, [src_tokens]) + + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=unit_embeddings, + return_all_hiddens=output_layer is not None, + ) + + result = {} + result["encoder_out"] = encoder_out["encoder_out"] + result["encoder_states"] = encoder_out["encoder_states"] + result["padding_mask"] = padding_mask + + if self.add_text_ctc: + result["encoder_out_ctc"] = [self.unit_encoder_ctc_head(x) for x in encoder_out['encoder_out']] + result["encoder_padding_mask"] = [ + self.downsample_ctc_padding_mask(padding_mask) for padding_mask in encoder_out['encoder_padding_mask'] + ] + + if features_only: + return result + if self.add_decoder: + assert prev_output_tokens is not None + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, encoder_out=encoder_out, + ) + result['decoder_out'] = decoder_out + return result + + def forward_mum(self, src_tokens, target, mask=True): + target_list = [target] + padding_mask = src_tokens.eq(self.unit_encoder.padding_idx) + unit_embeddings = self.unit_embed_tokens(src_tokens) + if mask: + unit_embeddings, mask_indices = self.apply_mask(unit_embeddings, padding_mask, target_list) + else: + ### If already applied mask on src_tokens, then the target_list should contains many padding_idx + mask_indices = target_list[-1] != self.padding_idx + unit_embeddings[mask_indices] = self.mask_emb + + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=unit_embeddings, + ) + code_logit_m_list, code_logit_u_list = self.compute_ce_logits( + encoder_out["encoder_out"][0].transpose(0, 1), + target_list[-1], + self.final_proj_list[1], + padding_mask, + mask_indices, + ) + result = {} + result["logit_m_list"] = code_logit_m_list + result["logit_u_list"] = code_logit_u_list + result["padding_mask"] = padding_mask + return result + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + **kwargs, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Extract encoder features for only speech input""" + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + x = res["x"] # B x T x D + padding_mask = res["padding_mask"] + + if self.add_unit_encoder: + src_tokens, x, _ = self.convert_embeddings( + x, + padding_mask, + mix_with_unit=False, + use_pred_unit=False, + ) + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=x, + return_all_hiddens=output_layer is not None + ) + res["x"] = encoder_out['encoder_out'][0].transpose(0, 1) # (B, T, D) + + feature = res["features"] if ret_conv else res["x"] + if output_layer is not None: + feature = encoder_out['encoder_states'] + + return feature, padding_mask + + def get_logits(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + logits_list = [x[0].float() for x in logits_list if x is not None] + return logits_list + + def get_targets(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + targets_list = [x[1].long() for x in logits_list if x is not None] + return targets_list + + def get_extra_losses(self, net_output): + extra_losses = [] + names = [] + + if "features_pen" in net_output: + extra_losses.append(net_output["features_pen"]) + names.append("features_pen") + + if "embedding_l2_loss" in net_output: + extra_losses.append(net_output["embedding_l2_loss"]) + names.append("embedding_l2_loss") + + return extra_losses, names + + def remove_pretraining_modules(self, step2=False): + self.target_glu = None + + def load_checkpoint(self, checkpoint: str): + if not PathManager.exists(checkpoint): + raise IOError("Model file not found: {}".format(checkpoint)) + state = checkpoint_utils.load_checkpoint_to_cpu(checkpoint) + return state + +class Rotate3D(nn.Module): + """ + (T, B, D) --> (B, D, T) --> (D, T, B) --> (T, B, D) + """ + def __init__(self): + super().__init__() + + def forward(self, x): + return x.permute(1, 2, 0) diff --git a/Speech2S/speech2s/models/speechut_asr.py b/Speech2S/speech2s/models/speechut_asr.py new file mode 100644 index 0000000..f9ec9d8 --- /dev/null +++ b/Speech2S/speech2s/models/speechut_asr.py @@ -0,0 +1,165 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import contextlib +import torch +from dataclasses import dataclass, field +from fairseq import utils +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.fairseq_encoder import FairseqEncoder +from fairseq.models.hubert import HubertAsrConfig, HubertEncoder +from fairseq.tasks import FairseqTask + +@dataclass +class SpeechUTASRConfig(HubertAsrConfig): + add_decoder: bool = field( + default=True, + metadata={"help": "add decoder for fine-tune"}, + ) + +@register_model("speechut_asr", dataclass=SpeechUTASRConfig) +class SpeechUTASR(BaseFairseqModel): + """ + A encoder-ctc-decoder model if cfg.add_decoder is True, or a encoder-ctc model + """ + def __init__(self, cfg: SpeechUTASRConfig, encoder: FairseqEncoder): + super().__init__() + self.cfg = cfg + self.encoder = encoder + if not cfg.add_decoder: + self.encoder.w2v_model.decoder = None + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechUTASRConfig, task: FairseqTask): + """Build a new model instance.""" + encoder = SpeechUTEncoder(cfg, task) + return cls(cfg, encoder) + + def forward(self, source, padding_mask, prev_output_tokens, **kwargs): + encoder_out = self.encoder(source, padding_mask, **kwargs) + + x = self.encoder.final_dropout(encoder_out['encoder_out'][0]) # (T, B, C) + if self.encoder.proj: + x = self.encoder.proj(x) + if self.encoder.conv_ctc_proj: + padding_mask = self.encoder.w2v_model.downsample_ctc_padding_mask(encoder_out["encoder_padding_mask"][0]) + else: + padding_mask = encoder_out["encoder_padding_mask"] + + decoder_out = self.decoder( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) if self.cfg.add_decoder else None + + return { + "encoder_out_ctc": x, # (T, B, C), for CTC loss + "padding_mask": padding_mask, # (B, T), for CTC loss + "decoder_out": decoder_out, # for ED loss + } + + def forward_decoder(self, prev_output_tokens, **kwargs): + return self.decoder(prev_output_tokens, **kwargs) + + def get_logits(self, net_output): + """For CTC decoding""" + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """For 1) computing CTC loss, 2) decoder decoding.""" + + if "encoder_out_ctc" in net_output: + logits = net_output["encoder_out_ctc"] + else: + return self.decoder.get_normalized_probs(net_output, log_probs, sample) + + if isinstance(logits, list): + logits = logits[0] + + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + @property + def decoder(self): + return self.encoder.w2v_model.decoder + + +class SpeechUTEncoder(HubertEncoder): + """ + Modified from fairseq.models.hubert.hubert_asr.HubertEncoder + 1. make it compatible with encoder-decoder model + """ + def __init__(self, cfg: HubertAsrConfig, task): + super().__init__(cfg, task) + + if (task.target_dictionary is not None) and ( + hasattr(self.w2v_model, "unit_encoder_ctc_head") + ): + self.proj = self.w2v_model.unit_encoder_ctc_head + self.conv_ctc_proj = True + else: + self.conv_ctc_proj = False + + def forward(self, source, padding_mask, tbc=True, **kwargs): + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + } + ft = self.freeze_finetune_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + x, padding_mask = self.w2v_model.extract_features(**w2v_args) + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [padding_mask], # B x T + } + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Forward the encoder out. + """ + x, padding_mask = self.w2v_model.extract_features(**net_input, mask=False) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + encoder_out = { + "encoder_out" : [x], + "encoder_padding_mask" : [padding_mask], + } + if self.proj: + x = self.proj(x) + encoder_out["encoder_out_ctc"] = x + + return encoder_out + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = [ + x.index_select(1, new_order) for x in encoder_out["encoder_out"] + ] + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = [ + x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"] + ] + return encoder_out diff --git a/Speech2S/speech2s/models/speechut_st.py b/Speech2S/speech2s/models/speechut_st.py new file mode 100644 index 0000000..6faaccf --- /dev/null +++ b/Speech2S/speech2s/models/speechut_st.py @@ -0,0 +1,221 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import contextlib +import torch +import torch.nn as nn +from argparse import Namespace +from dataclasses import dataclass +from typing import Any +from fairseq import checkpoint_utils, tasks +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.fairseq_encoder import FairseqEncoder +from fairseq.tasks import FairseqTask +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.data.data_utils import lengths_to_padding_mask + +from fairseq.models.hubert import HubertAsrConfig + +logger = logging.getLogger(__name__) + +@dataclass +class SpeechUTS2TConfig(HubertAsrConfig): + ### the following config is only for the compatibility to fairseq speech_to_text task + input_feat_per_channel: Any = None + input_channels: Any = None + speaker_to_id: Any = None + +@register_model("speechut_st_legacy", dataclass=SpeechUTS2TConfig) +class SpeechUTS2T(BaseFairseqModel): + """An encoder-decoder model.""" + def __init__(self, cfg: SpeechUTS2TConfig, encoder: FairseqEncoder): + super().__init__() + self.cfg = cfg + self.encoder = encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechUTS2TConfig, task: FairseqTask): + """Build a new model instance.""" + encoder = SpeechUTEncoder(cfg, task) + return cls(cfg, encoder) + + def forward(self, src_tokens, src_lengths, prev_output_tokens, **kwargs): + encoder_out = self.encoder(src_tokens, src_lengths, **kwargs) + decoder_out = self.encoder.w2v_model.decoder( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) + return decoder_out + + def forward_decoder(self, prev_output_tokens, **kwargs): + return self.encoder.w2v_model.decoder(prev_output_tokens, **kwargs) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """For decoder decoding.""" + return self.encoder.w2v_model.decoder.get_normalized_probs(net_output, log_probs, sample) + + @property + def decoder(self): + return self.encoder.w2v_model.decoder + + +class SpeechUTEncoder(FairseqEncoder): + """ + Modified from fairseq.models.hubert.hubert_asr.HubertEncoder + 1. make it compatible with fairseq speech_to_text task + 2. make it compatible with encoder-decoder model + """ + def __init__(self, cfg: SpeechUTS2TConfig, task): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + assert task.data_cfg.standardize_audio() == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + pretrain_task = tasks.setup_task(w2v_args.task, load_local_states=False) + assert state is not None and "task_state" in state, f"the stored dictionaries not found in checkpoint!" + # This will load the stored "dictionaries" object + pretrain_task.load_state_dict(state["task_state"]) + + model = pretrain_task.build_model(w2v_args.model, from_checkpoint=True) + if state is not None and not cfg.no_pretrained_weights: + try: + model.load_state_dict(state["model"], strict=True) + except Exception as e: + logger.warn(e) + model.load_state_dict(state["model"], strict=False) + + model.remove_pretraining_modules() + + super().__init__(pretrain_task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.num_updates = 0 + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, src_tokens=None, src_lengths=None, **kwargs): + + w2v_args = { + "source": src_tokens, + "padding_mask": lengths_to_padding_mask(src_lengths), + "mask": self.apply_mask and self.training, + } + + ft = self.freeze_finetune_updates <= self.num_updates + + with torch.no_grad() if not ft else contextlib.ExitStack(): + x, padding_mask = self.w2v_model.extract_features(**w2v_args) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [padding_mask], # B x T + "padding_mask": [padding_mask], + } + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Forward the encoder out. + """ + _net_input = { + "source": net_input["src_tokens"], + "padding_mask": lengths_to_padding_mask(net_input["src_lengths"]), + "mask": False, + } + + x, padding_mask = self.w2v_model.extract_features(**_net_input) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + encoder_out = { + "encoder_out" : [x], + "encoder_padding_mask" : [padding_mask], + } + return encoder_out + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = [ + x.index_select(1, new_order) for x in encoder_out["encoder_out"] + ] + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = [ + x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"] + ] + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim**-0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/Speech2S/speech2s/models/t5_transformer_lm.py b/Speech2S/speech2s/models/t5_transformer_lm.py new file mode 100644 index 0000000..3d16a2d --- /dev/null +++ b/Speech2S/speech2s/models/t5_transformer_lm.py @@ -0,0 +1,25 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from fairseq.models import ( + register_model_architecture, +) +from fairseq.models.transformer_lm import base_lm_architecture + + +@register_model_architecture(model_name="transformer_lm", arch_name="transformer_lm_t5") +def transformer_lm_t5(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1280) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 6144) + args.decoder_layers = getattr(args, "decoder_layers", 20) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) diff --git a/Speech2S/speech2s/modules/__init__.py b/Speech2S/speech2s/modules/__init__.py new file mode 100644 index 0000000..dad9781 --- /dev/null +++ b/Speech2S/speech2s/modules/__init__.py @@ -0,0 +1,27 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +from .learned_positional_embedding import LearnedPositionalEmbedding +from .multihead_attention import MultiheadAttention +from .relative_pos_enc import RelativePositionalEncoding +from .transformer_layer import TransformerEncoderLayerBase, TransformerDecoderLayerBase +from .w2v_encoder import TransformerEncoder, TransformerSentenceEncoderLayer +from .transformer_encoder import TransformerEncoderBase +from .transformer_decoder import TransformerDecoderScriptable, TransformerDecoderBaseScriptable + +__all__ = [ + "MultiheadAttention", + "RelativePositionalEncoding", + "LearnedPositionalEmbedding", + "TransformerEncoderLayerBase", + "TransformerDecoderLayerBase", + "TransformerEncoder", + "TransformerSentenceEncoderLayer", + "TransformerEncoderBase", + "TransformerDecoderScriptable", + "TransformerDecoderBaseScriptable", +] diff --git a/Speech2S/speech2s/modules/ctc_prefix_score.py b/Speech2S/speech2s/modules/ctc_prefix_score.py new file mode 100644 index 0000000..b42cbd8 --- /dev/null +++ b/Speech2S/speech2s/modules/ctc_prefix_score.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +# Copyright 2018 Mitsubishi Electric Research Labs (Takaaki Hori) +# Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + +import numpy as np +import six + + +class CTCPrefixScore(object): + """Compute CTC label sequence scores + which is based on Algorithm 2 in WATANABE et al. + "HYBRID CTC/ATTENTION ARCHITECTURE FOR END-TO-END SPEECH RECOGNITION," + but extended to efficiently compute the probablities of multiple labels + simultaneously + """ + + def __init__(self, x, blank, eos, xp): + self.xp = xp + self.logzero = -10000000000.0 + self.blank = blank + self.eos = eos + self.input_length = len(x) + self.x = x + + def initial_state(self): + """Obtain an initial CTC state + :return: CTC state + """ + # initial CTC state is made of a frame x 2 tensor that corresponds to + # r_t^n() and r_t^b(), where 0 and 1 of axis=1 represent + # superscripts n and b (non-blank and blank), respectively. + r = self.xp.full((self.input_length, 2), self.logzero, dtype=np.float32) + r[0, 1] = self.x[0, self.blank] + for i in six.moves.range(1, self.input_length): + r[i, 1] = r[i - 1, 1] + self.x[i, self.blank] + return r + + def __call__(self, y, cs, r_prev): + """Compute CTC prefix scores for next labels + :param y : prefix label sequence + :param cs : array of next labels + :param r_prev: previous CTC state + :return ctc_scores, ctc_states + """ + # initialize CTC states + output_length = len(y) - 1 # ignore sos + # new CTC states are prepared as a frame x (n or b) x n_labels tensor + # that corresponds to r_t^n(h) and r_t^b(h). + r = self.xp.ndarray((self.input_length, 2, len(cs)), dtype=np.float32) + xs = self.x[:, cs] + if output_length == 0: + r[0, 0] = xs[0] + r[0, 1] = self.logzero + else: + r[output_length - 1] = self.logzero + + # prepare forward probabilities for the last label + r_sum = self.xp.logaddexp( + r_prev[:, 0], r_prev[:, 1] + ) # log(r_t^n(g) + r_t^b(g)) + last = y[-1] + if output_length > 0 and last in cs: + log_phi = self.xp.ndarray((self.input_length, len(cs)), dtype=np.float32) + for i in six.moves.range(len(cs)): + log_phi[:, i] = r_sum if cs[i] != last else r_prev[:, 1] + else: + log_phi = r_sum + + # compute forward probabilities log(r_t^n(h)), log(r_t^b(h)), + # and log prefix probabilities log(psi) + start = max(output_length, 1) + log_psi = r[start - 1, 0] + for t in six.moves.range(start, self.input_length): + r[t, 0] = self.xp.logaddexp(r[t - 1, 0], log_phi[t - 1]) + xs[t] + r[t, 1] = ( + self.xp.logaddexp(r[t - 1, 0], r[t - 1, 1]) + self.x[t, self.blank] + ) + log_psi = self.xp.logaddexp(log_psi, log_phi[t - 1] + xs[t]) + + # get P(...eos|X) that ends with the prefix itself + eos_pos = self.xp.where(cs == self.eos)[0] + if len(eos_pos) > 0: + log_psi[eos_pos] = r_sum[-1] # log(r_T^n(g) + r_T^b(g)) + + # exclude blank probs + blank_pos = self.xp.where(cs == self.blank)[0] + if len(blank_pos) > 0: + log_psi[blank_pos] = self.logzero + + # return the log prefix probability and CTC states, where the label axis + # of the CTC states is moved to the first axis to slice it easily + return log_psi, self.xp.rollaxis(r, 2) diff --git a/Speech2S/speech2s/modules/learned_positional_embedding.py b/Speech2S/speech2s/modules/learned_positional_embedding.py new file mode 100644 index 0000000..20c8558 --- /dev/null +++ b/Speech2S/speech2s/modules/learned_positional_embedding.py @@ -0,0 +1,69 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/modules/learned_positional_embedding.py + 1. Add clamping if the input length exceeds the max-source-tokens +""" + +from typing import Dict, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + + +class LearnedPositionalEmbedding(nn.Embedding): + """ + This module learns positional embeddings up to a fixed maximum size. + Padding ids are ignored by either offsetting based on padding_idx + or by setting padding_idx to None and ensuring that the appropriate + position ids are passed to the forward function. + """ + + def __init__(self, num_embeddings: int, embedding_dim: int, padding_idx: int): + super().__init__(num_embeddings, embedding_dim, padding_idx) + self.onnx_trace = False + if self.padding_idx is not None: + self.max_positions = self.num_embeddings - self.padding_idx - 1 + else: + self.max_positions = self.num_embeddings + + def forward( + self, + input: Tensor, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + positions: Optional[Tensor] = None, + ): + """Input is expected to be of size [bsz x seqlen].""" + assert (positions is None) or ( + self.padding_idx is None + ), "If positions is pre-computed then padding_idx should not be set." + + if positions is None: + if incremental_state is not None: + # positions is the same for every token when decoding a single step + # Without the int() cast, it doesn't work in some cases when exporting to ONNX + positions = torch.zeros( + (1, 1), device=input.device, dtype=input.dtype + ).fill_(int(self.padding_idx + input.size(1))) + else: + positions = utils.make_positions( + input, self.padding_idx, onnx_trace=self.onnx_trace + ) + positions = torch.clamp(positions, max=self.padding_idx + self.max_positions) + return F.embedding( + positions, + self.weight, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) diff --git a/Speech2S/speech2s/modules/multihead_attention.py b/Speech2S/speech2s/modules/multihead_attention.py new file mode 100644 index 0000000..89f46ab --- /dev/null +++ b/Speech2S/speech2s/modules/multihead_attention.py @@ -0,0 +1,346 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + +from fairseq.modules import MultiheadAttention as FairseqMultiheadAttention + + +class MultiheadAttention(FairseqMultiheadAttention): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + scaling_for_att=1.0 + ): + super().__init__( + embed_dim, + num_heads, + kdim, + vdim, + dropout, + bias, + add_bias_kv, + add_zero_attn, + self_attention, + encoder_decoder_attention, + q_noise, + qn_block_size, + ) + self.scaling_for_att = scaling_for_att + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + position_bias: Optional[Tensor] = None, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim, f"query dim {embed_dim} != {self.embed_dim}" + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + and position_bias is None + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + q *= (1 / self.scaling_for_att) + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + if position_bias is not None: ## first order + ## position_bias: [241, 241, 64] + #print ("attn_weights: ", attn_weights.size()) # [492, 241, 241] + reshape_q = q.contiguous().view(bsz * self.num_heads, -1, self.head_dim).transpose(0,1) #[241, 492, 64] + #print ("reshape_q: ", reshape_q.size()) + B = torch.matmul(reshape_q, position_bias.transpose(-2, -1)) + #print ("B: ", B.size()) ## [241, 492, 241] + #B = B.transpose(0, 1).view(bsz, self.num_heads, position_bias.size(0), position_bias.size(1)) + B = B.transpose(0, 1).view(bsz*self.num_heads, position_bias.size(0), position_bias.size(1)) + #print ("B 2: ", B.size()) + attn_weights += B + + attn_weights *= self.scaling_for_att + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if self.scaling_for_att > 1.0: + attn_weights = attn_weights - attn_weights.detach().max(dim=-1, keepdim=True)[0] + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights diff --git a/Speech2S/speech2s/modules/relative_pos_enc.py b/Speech2S/speech2s/modules/relative_pos_enc.py new file mode 100644 index 0000000..7021fc0 --- /dev/null +++ b/Speech2S/speech2s/modules/relative_pos_enc.py @@ -0,0 +1,33 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import torch + +class RelativePositionalEncoding(torch.nn.Module): + def __init__(self, d_model, maxlen=1000, embed_v=False): + super(RelativePositionalEncoding, self).__init__() + + self.d_model = d_model + self.maxlen = maxlen + self.pe_k = torch.nn.Embedding(2*maxlen, d_model) + if embed_v: + self.pe_v = torch.nn.Embedding(2*maxlen, d_model) + self.embed_v = embed_v + + + def forward(self, pos_seq, incremental_state=None): + pos_seq[pos_seq < -self.maxlen] = -self.maxlen + pos_seq[pos_seq >= self.maxlen] = self.maxlen - 1 + pos_seq = pos_seq + self.maxlen + + if incremental_state is not None: + pos_seq = pos_seq[-1:] + + if self.embed_v: + return self.pe_k(pos_seq), self.pe_v(pos_seq) + else: + return self.pe_k(pos_seq), None diff --git a/Speech2S/speech2s/modules/transformer_decoder.py b/Speech2S/speech2s/modules/transformer_decoder.py new file mode 100644 index 0000000..84417b4 --- /dev/null +++ b/Speech2S/speech2s/modules/transformer_decoder.py @@ -0,0 +1,543 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/transformer/transformer_decoder.py +""" + +import math +from typing import Any, Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqIncrementalDecoder +from fairseq.models.transformer import TransformerConfig +from fairseq.modules import ( + AdaptiveSoftmax, + BaseLayer, + FairseqDropout, + LayerDropModuleList, + LayerNorm, + PositionalEmbedding, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor + +from speechut.modules import transformer_layer +from speechut.modules import RelativePositionalEncoding + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerDecoderBase": + return "TransformerDecoder" + else: + return module_name + + +class TransformerDecoderBase(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *cfg.decoder.layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + use_rel_pos_enc=False, + ): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.decoder_layerdrop = cfg.decoder.layerdrop + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = cfg.decoder.embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = cfg.decoder.output_dim + + self.padding_idx = embed_tokens.padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + self.max_target_positions, + embed_dim, + self.padding_idx, + learned=cfg.decoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + self.cross_self_attention = cfg.cross_self_attention + + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.layers.extend( + [ + self.build_decoder_layer(cfg, no_encoder_attn) + for _ in range(cfg.decoder.layers) + ] + ) + self.num_layers = len(self.layers) + + if cfg.decoder.normalize_before and not cfg.no_decoder_final_norm: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not cfg.tie_adaptive_weights + else None + ) + + self.adaptive_softmax = None + self.output_projection = output_projection + if self.output_projection is None: + self.build_output_projection(cfg, dictionary, embed_tokens) + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.decoder.attention_heads, 24) + + def build_output_projection(self, cfg, dictionary, embed_tokens): + if cfg.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(cfg.adaptive_softmax_cutoff, type=int), + dropout=cfg.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if cfg.tie_adaptive_weights else None, + factor=cfg.adaptive_softmax_factor, + tie_proj=cfg.tie_adaptive_proj, + ) + elif self.share_input_output_embed: + self.output_projection = nn.Linear( + self.embed_tokens.weight.shape[1], + self.embed_tokens.weight.shape[0], + bias=False, + ) + self.output_projection.weight = self.embed_tokens.weight + else: + self.output_projection = nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + num_base_layers = cfg.base_layers + for i in range(num_base_layers): + self.layers.insert( + ((i + 1) * cfg.decoder.layers) // (num_base_layers + 1), + BaseLayer(cfg), + ) + + def build_decoder_layer(self, cfg, no_encoder_attn=False): + layer = transformer_layer.TransformerDecoderLayerBase(cfg, no_encoder_attn, has_relative_attention_bias=self.use_rel_pos_enc) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + ) + + if not features_only: + x = self.output_layer(x) + return x, extra + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + return self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + + """ + A scriptable subclass of this class has an extract_features method and calls + super().extract_features, but super() is not supported in torchscript. A copy of + this function is made to be used in the subclass instead. + """ + + def extract_features_scriptable( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs, slen = prev_output_tokens.size() + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + pos_seq = torch.arange(0, slen).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, _ = self.pos_emb(pos_seq, incremental_state) + else: + pos_k = None + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + pos_bias=pos_k, + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def output_layer(self, features): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection(features) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim])), 1 + ) + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + if f"{name}.output_projection.weight" not in state_dict: + if self.share_input_output_embed: + embed_out_key = f"{name}.embed_tokens.weight" + else: + embed_out_key = f"{name}.embed_out" + if embed_out_key in state_dict: + state_dict[f"{name}.output_projection.weight"] = state_dict[ + embed_out_key + ] + if not self.share_input_output_embed: + del state_dict[embed_out_key] + + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + +class TransformerDecoderBaseScriptable(TransformerDecoderBase): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None + + +class TransformerDecoder(TransformerDecoderBase): + def __init__( + self, + args, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + ): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + no_encoder_attn=no_encoder_attn, + output_projection=output_projection, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + ) + + def build_output_projection(self, args, dictionary, embed_tokens): + super().build_output_projection( + TransformerConfig.from_namespace(args), dictionary, embed_tokens + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + return super().build_decoder_layer( + TransformerConfig.from_namespace(args), no_encoder_attn=no_encoder_attn + ) + +class TransformerDecoderScriptable(TransformerDecoder): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None diff --git a/Speech2S/speech2s/modules/transformer_encoder.py b/Speech2S/speech2s/modules/transformer_encoder.py new file mode 100644 index 0000000..f94e1fe --- /dev/null +++ b/Speech2S/speech2s/modules/transformer_encoder.py @@ -0,0 +1,401 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import math +from typing import Dict, List, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqEncoder +from fairseq.modules import ( + FairseqDropout, + LayerDropModuleList, + LayerNorm, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor +from fairseq.models.transformer import ( + TransformerConfig, +) + + +from speechut.modules import transformer_layer, LearnedPositionalEmbedding +from speechut.modules import RelativePositionalEncoding + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerEncoderBase": + return "TransformerEncoder" + else: + return module_name + + +class TransformerEncoderBase(FairseqEncoder): + """ + Transformer encoder consisting of *cfg.encoder.layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, cfg, dictionary, embed_tokens, use_rel_pos_enc=False, scaling_for_att=1.0): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.encoder_layerdrop = cfg.encoder.layerdrop + + embed_dim = embed_tokens.embedding_dim + self.padding_idx = embed_tokens.padding_idx + self.max_source_positions = cfg.max_source_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + self.embed_positions = ( + PositionalEmbedding( + cfg.max_source_positions, + embed_dim, + self.padding_idx, + learned=cfg.encoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + if self.encoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.encoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.scaling_for_att = scaling_for_att + self.layers.extend( + [self.build_encoder_layer(cfg) for i in range(cfg.encoder.layers)] + ) + self.num_layers = len(self.layers) + + if cfg.encoder.normalize_before: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.encoder.attention_heads, 160) + + def build_encoder_layer(self, cfg): + layer = transformer_layer.TransformerEncoderLayerBase(cfg, has_relative_attention_bias=self.use_rel_pos_enc, scaling_for_att=self.scaling_for_att) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward_embedding( + self, src_tokens, token_embedding: Optional[torch.Tensor] = None + ): + # embed tokens and positions + if token_embedding is None: + token_embedding = self.embed_tokens(src_tokens) + x = embed = self.embed_scale * token_embedding + if self.embed_positions is not None: + x = embed + self.embed_positions(src_tokens) + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + x = self.dropout_module(x) + if self.quant_noise is not None: + x = self.quant_noise(x) + return x, embed + + def forward( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + return self.forward_scriptable( + src_tokens, src_lengths, return_all_hiddens, token_embeddings, uniformity_layers + ) + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def forward_scriptable( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + # compute padding mask + encoder_padding_mask = src_tokens.eq(self.padding_idx) + has_pads = src_tokens.device.type == "xla" or encoder_padding_mask.any() + + x, encoder_embedding = self.forward_embedding(src_tokens, token_embeddings) + + # account for padding while computing the representation + if has_pads: + x = x * (1 - encoder_padding_mask.unsqueeze(-1).type_as(x)) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + encoder_states = [] + uniformity_hiddens = [] + + if return_all_hiddens: + encoder_states.append(x) + + if uniformity_layers is not None and 0 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + + # encoder layers + for i, layer in enumerate(self.layers): + x = layer( + x, encoder_padding_mask=encoder_padding_mask if has_pads else None, + pos_bias=pos_k, + ) + if uniformity_layers is not None and i+1 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + if return_all_hiddens: + assert encoder_states is not None + encoder_states.append(x) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `forward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + src_lengths = ( + src_tokens.ne(self.padding_idx) + .sum(dim=1, dtype=torch.int32) + .reshape(-1, 1) + .contiguous() + ) + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [encoder_padding_mask], # B x T + "encoder_embedding": [encoder_embedding], # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "uniformity_hiddens": uniformity_hiddens, # List[T x B x C] + "src_tokens": [], + "src_lengths": [src_lengths], + } + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if len(encoder_out["encoder_out"]) == 0: + new_encoder_out = [] + else: + new_encoder_out = [encoder_out["encoder_out"][0].index_select(1, new_order)] + if len(encoder_out["encoder_padding_mask"]) == 0: + new_encoder_padding_mask = [] + else: + new_encoder_padding_mask = [ + encoder_out["encoder_padding_mask"][0].index_select(0, new_order) + ] + if len(encoder_out["encoder_embedding"]) == 0: + new_encoder_embedding = [] + else: + new_encoder_embedding = [ + encoder_out["encoder_embedding"][0].index_select(0, new_order) + ] + + if len(encoder_out["src_tokens"]) == 0: + src_tokens = [] + else: + src_tokens = [(encoder_out["src_tokens"][0]).index_select(0, new_order)] + + if len(encoder_out["src_lengths"]) == 0: + src_lengths = [] + else: + src_lengths = [(encoder_out["src_lengths"][0]).index_select(0, new_order)] + + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, # T x B x C + "encoder_padding_mask": new_encoder_padding_mask, # B x T + "encoder_embedding": new_encoder_embedding, # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": src_tokens, # B x T + "src_lengths": src_lengths, # B x 1 + } + + def max_positions(self): + """Maximum input length supported by the encoder.""" + if self.embed_positions is None: + return self.max_source_positions + return min(self.max_source_positions, self.embed_positions.max_positions) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + print("deleting {0}".format(weights_key)) + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + for i in range(self.num_layers): + # update layer norms + self.layers[i].upgrade_state_dict_named( + state_dict, "{}.layers.{}".format(name, i) + ) + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) < 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + return state_dict + + +class TransformerEncoder(TransformerEncoderBase): + def __init__(self, args, dictionary, embed_tokens): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + scaling_for_att=getattr(args, "scaling_for_att", 1.0), + ) + + def build_encoder_layer(self, args): + return super().build_encoder_layer( + TransformerConfig.from_namespace(args), + ) + + +def PositionalEmbedding( + num_embeddings: int, + embedding_dim: int, + padding_idx: int, + learned: bool = False, +): + if learned: + # if padding_idx is specified then offset the embedding ids by + # this index and adjust num_embeddings appropriately + # TODO: The right place for this offset would be inside + # LearnedPositionalEmbedding. Move this there for a cleaner implementation. + if padding_idx is not None: + num_embeddings = num_embeddings + padding_idx + 1 + m = LearnedPositionalEmbedding(num_embeddings, embedding_dim, padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim**-0.5) + if padding_idx is not None: + nn.init.constant_(m.weight[padding_idx], 0) + else: + m = SinusoidalPositionalEmbedding( + embedding_dim, + padding_idx, + init_size=num_embeddings + padding_idx + 1, + ) + return m diff --git a/Speech2S/speech2s/modules/transformer_layer.py b/Speech2S/speech2s/modules/transformer_layer.py new file mode 100644 index 0000000..a71a848 --- /dev/null +++ b/Speech2S/speech2s/modules/transformer_layer.py @@ -0,0 +1,330 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/modules/transformer_layer.py + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_decoder_layer.py +""" + +from typing import Dict, List, Optional + +import torch +from torch import Tensor +from fairseq.modules import LayerNorm +from fairseq.modules.transformer_layer import TransformerEncoderLayerBase as FairseqTransformerEncoderLayerBase +from fairseq.modules.transformer_layer import TransformerDecoderLayerBase as FairseqTransformerDecoderLayerBase + +from speechut.modules import MultiheadAttention + +class TransformerEncoderLayerBase(FairseqTransformerEncoderLayerBase): + """Encoder layer block. + + In the original paper each operation (multi-head attention or FFN) is + postprocessed with: `dropout -> add residual -> layernorm`. In the + tensor2tensor code they suggest that learning is more robust when + preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.encoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + + def __init__(self, cfg, has_relative_attention_bias=False, scaling_for_att=1.0): + self.scaling_for_att = scaling_for_att + super().__init__(cfg) + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.encoder.attention_heads) + + def build_self_attention(self, embed_dim, cfg, scaling_for_att=1.0): + return MultiheadAttention( + embed_dim, + cfg.encoder.attention_heads, + dropout=cfg.attention_dropout, + self_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def forward( + self, + x, + encoder_padding_mask: Optional[Tensor], + attn_mask: Optional[Tensor] = None, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor): binary ByteTensor of shape + `(batch, seq_len)` where padding elements are indicated by ``1``. + attn_mask (ByteTensor): binary tensor of shape `(tgt_len, src_len)`, + where `tgt_len` is the length of output and `src_len` is the + length of input, though here both are equal to `seq_len`. + `attn_mask[tgt_i, src_j] = 1` means that when calculating the + embedding for `tgt_i`, we exclude (mask out) `src_j`. This is + useful for strided self-attention. + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + # anything in original attn_mask = 1, becomes -1e8 + # anything in original attn_mask = 0, becomes 0 + # Note that we cannot use -inf here, because at some edge cases, + # the attention weight (before softmax) for some padded element in query + # will become -inf, which results in NaN in model parameters + if attn_mask is not None: + attn_mask = attn_mask.masked_fill( + attn_mask.to(torch.bool), -1e8 if x.dtype == torch.float32 else -1e4 + ) + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, _ = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=encoder_padding_mask, + need_weights=False, + attn_mask=attn_mask, + position_bias=pos_bias, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + return x + + + +class TransformerDecoderLayerBase(FairseqTransformerDecoderLayerBase): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.decoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, cfg, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False, has_relative_attention_bias=False, scaling_for_att=1.0, + ): + self.scaling_for_att = scaling_for_att + super().__init__(cfg, + no_encoder_attn, + add_bias_kv, + add_zero_attn, + ) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.decoder.attention_heads) + + def build_self_attention( + self, embed_dim, cfg, add_bias_kv=False, add_zero_attn=False + ): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + dropout=cfg.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=not cfg.cross_self_attention, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def build_encoder_attention(self, embed_dim, cfg): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + kdim=cfg.encoder.embed_dim, + vdim=cfg.encoder.embed_dim, + dropout=cfg.attention_dropout, + encoder_decoder_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + if self.c_attn is not None: + tgt_len, bsz = x.size(0), x.size(1) + x = x.view(tgt_len, bsz, self.nh, self.head_dim) + x = torch.einsum("tbhd,h->tbhd", x, self.c_attn) + x = x.reshape(tgt_len, bsz, self.embed_dim) + if self.attn_ln is not None: + x = self.attn_ln(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + if self.encoder_attn is not None and encoder_out is not None: + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + if self.ffn_layernorm is not None: + x = self.ffn_layernorm(x) + x = self.fc2(x) + x = self.dropout_module(x) + if self.w_resid is not None: + residual = torch.mul(self.w_resid, residual) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None + + def make_generation_fast_(self, need_attn: bool = False, **kwargs): + self.need_attn = need_attn diff --git a/Speech2S/speech2s/modules/w2v_encoder.py b/Speech2S/speech2s/modules/w2v_encoder.py new file mode 100644 index 0000000..386f1eb --- /dev/null +++ b/Speech2S/speech2s/modules/w2v_encoder.py @@ -0,0 +1,281 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + wav2vec encoder adding relitive position bias, modified from + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_encoder.py + https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/wav2vec/wav2vec2.py +""" + +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.dataclass import ChoiceEnum +from fairseq.modules import ( + LayerNorm, + SamePad, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.utils import index_put +from fairseq.distributed import fsdp_wrap +from fairseq.models.wav2vec.utils import pad_to_multiple + +## reload multi-head attition with rel-pos-bias +from fairseq.models.wav2vec.wav2vec2 import TransformerEncoder as W2vTransformerEncoder +from speechut.modules import RelativePositionalEncoding +from speechut.modules import MultiheadAttention + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +class TransformerEncoder(W2vTransformerEncoder): + def __init__(self, args): + super().__init__(args) + + self.dropout = args.dropout + self.embedding_dim = args.encoder_embed_dim + self.required_seq_len_multiple = args.required_seq_len_multiple + self.use_rel_pos_enc = getattr(args, "use_rel_pos_enc", False) + + self.pos_conv = nn.Conv1d( + self.embedding_dim, + self.embedding_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * self.embedding_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + layers = [] + for _ in range(args.encoder_layers): + layer = TransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=self.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + has_relative_attention_bias=self.use_rel_pos_enc, + ) + if args.checkpoint_activations: + layer = fsdp_wrap(layer) + layer = checkpoint_wrapper(layer) + layers.append(layer) + self.layers = nn.ModuleList(layers) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(self.embedding_dim) + self.layerdrop = args.encoder_layerdrop + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim // args.encoder_attention_heads, 160) + + + self.apply(init_bert_params) + + def forward(self, x, padding_mask=None, layer=None): + x, layer_results = self.extract_features(x, padding_mask, layer) + + if self.layer_norm_first and layer is None: + x = self.layer_norm(x) + + return x, layer_results + + def extract_features(self, x, padding_mask=None, tgt_layer=None): + + if padding_mask is not None: + x = index_put(x, padding_mask, 0) + + x_conv = self.pos_conv(x.transpose(1, 2)) + x_conv = x_conv.transpose(1, 2) + x = x + x_conv + + if not self.layer_norm_first: + x = self.layer_norm(x) + + # pad to the sequence length dimension + x, pad_length = pad_to_multiple( + x, self.required_seq_len_multiple, dim=-2, value=0 + ) + if pad_length > 0 and padding_mask is None: + padding_mask = x.new_zeros((x.size(0), x.size(1)), dtype=torch.bool) + padding_mask[:, -pad_length:] = True + else: + padding_mask, _ = pad_to_multiple( + padding_mask, self.required_seq_len_multiple, dim=-1, value=True + ) + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + layer_results = [] + r = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, z = layer(x, self_attn_padding_mask=padding_mask, need_weights=False, pos_bias=pos_k) + if tgt_layer is not None: + # unpad if needed + if pad_length > 0: + layer_results.append( + ( + x[:-pad_length], + z[:, :-pad_length, :-pad_length] + if z is not None + else z, + ) + ) + else: + layer_results.append((x, z)) + if i == tgt_layer: + r = x + break + + if r is not None: + x = r + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + # undo paddding + if pad_length > 0: + x = x[:, :-pad_length] + + return x, layer_results + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + has_relative_attention_bias: bool = False, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embedding_dim//num_attention_heads) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + pos_bias=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + position_bias=pos_bias, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn diff --git a/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_asr.sh b/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_asr.sh new file mode 100644 index 0000000..d5bc731 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_asr.sh @@ -0,0 +1,40 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 2 ] && echo "Usage: $0 [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +mount=$3 +world_size=$4 +update_freq=$5 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechut4asr_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_base_librispeech \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + dataset.train_subset=\"train_960+pseudo_libritext.kmu-ltr+merge_960.kmu-none\" \ + dataset.valid_subset=\"dev_clean+dev.kmu-ltr+dev.kmu-none\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=base_speechut4asr_${world_size}gpu_${update_freq}accum diff --git a/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st.sh b/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st.sh new file mode 100644 index 0000000..438a43f --- /dev/null +++ b/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st.sh @@ -0,0 +1,47 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +lang=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechut4en${lang}_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_base_librispeech \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + model.add_text_ctc=false \ + model.text_transformer.share_decoder_input_output_embed=true \ + criterion.u2t_ed_weight=1.0 \ + criterion.u2t_ctc_weight=0 \ + \ + dataset.train_subset=\"train_960,mustcuns_${lang}+pseudo_wmt_en${lang}.kmu-spm+train_960.kmu-none,mustcuns_${lang}.kmu-none\" \ + dataset.valid_subset=\"dev_clean+pseudo_valid.kmu-spm+dev.kmu-none\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=base_speechut4en${lang}_${world_size}gpu_${update_freq}accum + diff --git a/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st_enfr.sh b/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st_enfr.sh new file mode 100644 index 0000000..c0c7217 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/pretrain_speechut/base_speechut_for_st_enfr.sh @@ -0,0 +1,48 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [lang=fr] [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +lang=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $lang ] && lang=fr +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechut4en${lang}_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_base_librispeech \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + model.add_text_ctc=false \ + criterion.u2t_ed_weight=1.0 \ + criterion.u2t_ctc_weight=0 \ + \ + dataset.train_subset=\"train_960,pretrain_mustc+pseudo_wmt14_enfr.kmu-spm+train_960.kmu-none,pretrain_mustc.kmu-none\" \ + dataset.valid_subset=\"dev_clean+pseudo_valid.kmu-spm+dev.kmu-none\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + optimization.max_update=600000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=base_speechut4en${lang}_${world_size}gpu_${update_freq}accum + diff --git a/Speech2S/speech2s/scripts copy/pretrain_speechut/large_speechut_for_asr.sh b/Speech2S/speech2s/scripts copy/pretrain_speechut/large_speechut_for_asr.sh new file mode 100644 index 0000000..e9d64d7 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/pretrain_speechut/large_speechut_for_asr.sh @@ -0,0 +1,41 @@ +# #################################### +# SpeechUT Large model # +# #################################### +[ $# -lt 2 ] && echo "Usage: $0 [mount=${PWD}] [world_size=32] [update_freq=4]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +mount=$3 +world_size=$4 +update_freq=$5 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=4 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/large_speechut4asr_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_large_librilight \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + dataset.train_subset=\"train_small+pseudo_libritext.kmu-ltr\" \ + dataset.valid_subset=\"dev_clean+dev.kmu-ltr\" \ + dataset.num_workers=0 \ + dataset.max_tokens=900000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=large_speechut4asr_${world_size}gpu_${update_freq}accum + \ No newline at end of file diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune960h_large_edctc.sh b/Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune960h_large_edctc.sh new file mode 100644 index 0000000..08a2581 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune960h_large_edctc.sh @@ -0,0 +1,45 @@ +# #################################### +# SpeechUT Large model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [mount=${PWD}] [world_size=8] [update_freq=3]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +cpt=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=3 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="${mount}/exp/finetune_asr/$exp_name/960h_edctc80k_from_${cpt}_bz3.3m_lr1e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/finetune_asr \ + --config-name speechut_large_960h \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + model.w2v_path=${w2v_path} \ + \ + optimization.lr=[0.00001] \ + optimization.max_update=80000 \ + dataset.max_tokens=1100000 \ + optimization.update_freq=[${update_freq}] \ + distributed_training.distributed_world_size=${world_size} \ + \ + dataset.train_subset="train_960" \ + dataset.valid_subset="dev_other" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=960h_edctc80k_from_${cpt}_bz3.3m_lr1e-5 diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune_base_edctc.sh b/Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune_base_edctc.sh new file mode 100644 index 0000000..cad7bd0 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_asr/finetune_base_edctc.sh @@ -0,0 +1,45 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [mount=${PWD}] [world_size=8] [update_freq=2]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +cpt=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=2 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="${mount}/exp/finetune_asr/$exp_name/edctc40k_from_${cpt}_bz2.6m_lr1e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/finetune_asr \ + --config-name speechut_base_100h \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + model.w2v_path=${w2v_path} \ + \ + optimization.lr=[0.00001] \ + optimization.max_update=40000 \ + dataset.max_tokens=1300000 \ + optimization.update_freq=[${update_freq}] \ + distributed_training.distributed_world_size=${world_size} \ + \ + dataset.train_subset="train_clean_100" \ + dataset.valid_subset="dev_other" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=edctc40k_from_${cpt}_bz2.6m_lr1e-5 diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctc.sh b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctc.sh new file mode 100644 index 0000000..9dce063 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctc.sh @@ -0,0 +1,61 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_other] [beam_size=10] [ctc_weight=0.2] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +extra=$6 +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=10 +[ -z $ctc_weight ] && ctc_weight=0.2 +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 as no ctc-decoding used..." && beam_size=1 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 2000000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + & +done +wait + + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}/${subset}_${world_size}_${rank} + echo $results_path + tail -n 1 $results_path/generate-*.txt +done diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctclm.sh b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctclm.sh new file mode 100644 index 0000000..dadd1a4 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_edctclm.sh @@ -0,0 +1,66 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_other] [beam_size=30] [ctc_weight=0.3] [lm_weight=0.7] [lm_path] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +lm_weight=$6 +lm_path=$7 +extra=$8 +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=30 +[ -z $ctc_weight ] && ctc_weight=0.3 +[ -z $lm_weight ] && lm_weight=0.7 +[ -z $lm_path ] && lm_path="/mnt/default/v-junyiao/librispeech/lm/lm_ctc_form/checkpoint_best.pt" +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 and lm_weight to 0 as no ctc-decoding used..." && beam_size=1 && lm_weight=0 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 800000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --lm-weight ${lm_weight} --lm-path ${lm_path} \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path ${results_path} \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + & +done +wait + + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight}/${subset}_${world_size}_${rank} + echo $results_path + tail -n 1 $results_path/generate-*.txt +done diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_lm_nj.sh b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_lm_nj.sh new file mode 100644 index 0000000..a5627a5 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_lm_nj.sh @@ -0,0 +1,74 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_other] [beam_size=30] [ctc_weight=0.3] [lm_weight=0.7] [lm_path] [nj=8] [ngpu=8] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +lm_weight=$6 +lm_path=$7 +nj=$8 +ngpu=$9 +extra=${10} +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=30 +[ -z $ctc_weight ] && ctc_weight=0.3 +[ -z $lm_weight ] && lm_weight=0.7 +[ -z $lm_path ] && lm_path="/mnt/default/v-junyiao/librispeech/lm/lm_ctc_form/checkpoint_best.pt" +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 and lm_weight to 0 as no ctc-decoding used..." && beam_size=1 && lm_weight=0 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" +[ -z $nj ] && nj=8 +[ -z $ngpu ] && ngpu=8 + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +world_size=$nj +for rank in $(seq 0 $((nj - 1))); do + export CUDA_VISIBLE_DEVICES=$((rank % $ngpu)) + for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 800000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --lm-weight ${lm_weight} --lm-path ${lm_path} \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + --distributed-world-size ${world_size} --distributed-rank ${rank} \ + & + done +done +wait + + +for subset in ${gen_set//,/ }; do + results_dir=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight} + cat $results_dir/${subset}_${world_size}_*/generate-${subset}.txt | grep -v "^Generate" > $results_dir/generate-${subset}.all.txt +done diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_nj.sh b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_nj.sh new file mode 100644 index 0000000..08e6df4 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_asr/inference_nj.sh @@ -0,0 +1,69 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_other] [beam_size=10] [ctc_weight=0.2] [nj=32] [ngpu=8] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +nj=$6 +ngpu=$7 +extra=$8 +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=10 +[ -z $ctc_weight ] && ctc_weight=0.2 +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 as no ctc-decoding used..." && beam_size=1 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" +[ -z $nj ] && nj=32 +[ -z $ngpu ] && ngpu=8 + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +world_size=$nj +for rank in $(seq 0 $((nj - 1))); do + export CUDA_VISIBLE_DEVICES=$((rank % $ngpu)) + for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 2000000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + --distributed-world-size ${world_size} --distributed-rank ${rank} \ + & + done +done +wait + + +for subset in ${gen_set//,/ }; do + results_dir=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight} + cat $results_dir/${subset}_${world_size}_*/generate-${subset}.txt | grep -v "^Generate" > $results_dir/generate-${subset}.all.txt +done diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_st/finetune_base_mustc_enxx.sh b/Speech2S/speech2s/scripts copy/tune_speechut_st/finetune_base_mustc_enxx.sh new file mode 100644 index 0000000..59c8a2a --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_st/finetune_base_mustc_enxx.sh @@ -0,0 +1,77 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 4 ] && echo "Usage: $0 [mount=${PWD}] [world_size=8] [update_freq=4/6]" && exit 0 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +lang=$3 +cpt=$4 +mount=$5 +world_size=$6 +update_freq=$7 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=4 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="$mount/exp/finetune_mustc/$exp_name/legacy_en${lang}_from_${cpt}_bz3.2m_lr3e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +max_tokens=800000 +python $CODE_ROOT/fairseq/fairseq_cli/train.py ${DATA_DIR} \ + --save-dir ${MODEL_DIR} \ + --user-dir $CODE_ROOT/speechut \ + --task speech_to_text \ + --config-yaml config_en${lang}.yaml \ + --train-subset "train_st" \ + --valid-subset "dev_st" \ + --fp16 \ + --seed 1 \ + \ + --ddp-backend no_c10d \ + --distributed-world-size ${world_size} \ + --tensorboard-logdir ${MODEL_DIR} \ + \ + --criterion label_smoothed_cross_entropy --report-accuracy \ + --label-smoothing 0.3 \ + \ + --optimizer adam \ + --clip-norm 1.0 \ + --lr 3e-05 \ + --lr-scheduler polynomial_decay --warmup-updates 5000 \ + --max-update 50000 \ + --total-num-update 50000 \ + --update-freq ${update_freq} \ + \ + --max-tokens ${max_tokens} \ + --max-sentences 16 \ + --max-tokens-valid ${max_tokens} \ + --grouped-shuffling \ + --max-source-positions ${max_tokens} \ + --skip-invalid-size-inputs-valid-test \ + --num-workers 0 \ + --best-checkpoint-metric "accuracy" \ + --maximize-best-checkpoint-metric \ + \ + --arch "speechut_st_legacy" \ + --w2v-path ${w2v_path} \ + --layerdrop 0.1 \ + --activation-dropout 0.1 \ + --attention-dropout 0.1 \ + --feature-grad-mult 1.0 \ + \ + --apply-mask --mask-prob 0.5 \ + \ + --log-format json \ + --log-interval 100 \ + --save-interval 1 \ + --keep-last-epochs 5 \ + --keep-best-checkpoints 5 \ + \ + 2>&1 | tee ${MODEL_DIR}/train_en${lang}.log + diff --git a/Speech2S/speech2s/scripts copy/tune_speechut_st/inference_st.sh b/Speech2S/speech2s/scripts copy/tune_speechut_st/inference_st.sh new file mode 100644 index 0000000..3aefa10 --- /dev/null +++ b/Speech2S/speech2s/scripts copy/tune_speechut_st/inference_st.sh @@ -0,0 +1,44 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [gen-set=dev] [beam_size=10] [lenpen=1.0]" && exit 0 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +lang=$3 +gen_set=$4 +beam_size=$5 +lenpen=$6 +[ -z $gen_set ] && gen_set="dev" +[ -z $beam_size ] && beam_size=10 +[ -z $lenpen ] && lenpen=1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} +results_path=$src_dir/decode_${cpt}_beam${beam_size}/${gen_set} +[ ! -d $results_path ] && mkdir -p $results_path + +python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --gen-subset ${gen_set}_st \ + --max-tokens 2000000 \ + --max-source-positions 2000000 \ + --num-workers 0 \ + \ + --user-dir $CODE_ROOT/speechut \ + --task speech_to_text \ + --config-yaml config_en${lang}.yaml \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring sacrebleu --max-len-a 0 --max-len-b 512 \ + --beam ${beam_size} \ + --lenpen $lenpen \ + # --model-overrides "{'model':{'w2v_path':'/path/to/your/pretrained/model.pt'}}" \ + + echo $results_path + tail -n 1 $results_path/generate-*.txt + sleep 1s diff --git a/Speech2S/speech2s/scripts/__init__.py b/Speech2S/speech2s/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Speech2S/speech2s/scripts/average_checkpoints.py b/Speech2S/speech2s/scripts/average_checkpoints.py new file mode 100644 index 0000000..a4711e4 --- /dev/null +++ b/Speech2S/speech2s/scripts/average_checkpoints.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import collections +import os +import re + +import torch +from fairseq.file_io import PathManager + + +def average_checkpoints(inputs): + """Loads checkpoints from inputs and returns a model with averaged weights. + + Args: + inputs: An iterable of string paths of checkpoints to load from. + + Returns: + A dict of string keys mapping to various values. The 'model' key + from the returned dict should correspond to an OrderedDict mapping + string parameter names to torch Tensors. + """ + params_dict = collections.OrderedDict() + params_keys = None + new_state = None + num_models = len(inputs) + + for fpath in inputs: + with PathManager.open(fpath, "rb") as f: + state = torch.load( + f, + map_location=( + lambda s, _: torch.serialization.default_restore_location(s, "cpu") + ), + ) + # Copies over the settings from the first checkpoint + if new_state is None: + new_state = state + + model_params = state["model"] + + model_params_keys = list(model_params.keys()) + if params_keys is None: + params_keys = model_params_keys + elif params_keys != model_params_keys: + raise KeyError( + "For checkpoint {}, expected list of params: {}, " + "but found: {}".format(f, params_keys, model_params_keys) + ) + + for k in params_keys: + p = model_params[k] + if isinstance(p, torch.HalfTensor): + p = p.float() + if k not in params_dict: + params_dict[k] = p.clone() + # NOTE: clone() is needed in case of p is a shared parameter + else: + params_dict[k] += p + + averaged_params = collections.OrderedDict() + for k, v in params_dict.items(): + averaged_params[k] = v + if averaged_params[k].is_floating_point(): + averaged_params[k].div_(num_models) + else: + averaged_params[k] //= num_models + new_state["model"] = averaged_params + return new_state + + +def last_n_checkpoints(paths, n, update_based, upper_bound=None): + assert len(paths) == 1 + path = paths[0] + if update_based: + pt_regexp = re.compile(r"checkpoint_\d+_(\d+)\.pt") + else: + pt_regexp = re.compile(r"checkpoint(\d+)\.pt") + files = PathManager.ls(path) + + entries = [] + for f in files: + m = pt_regexp.fullmatch(f) + if m is not None: + sort_key = int(m.group(1)) + if upper_bound is None or sort_key <= upper_bound: + entries.append((sort_key, m.group(0))) + if len(entries) < n: + raise Exception( + "Found {} checkpoint files but need at least {}", len(entries), n + ) + return [os.path.join(path, x[1]) for x in sorted(entries, reverse=True)[:n]] + + +def main(): + parser = argparse.ArgumentParser( + description="Tool to average the params of input checkpoints to " + "produce a new checkpoint", + ) + # fmt: off + parser.add_argument('--inputs', required=True, nargs='+', + help='Input checkpoint file paths.') + parser.add_argument('--output', required=True, metavar='FILE', + help='Write the new checkpoint containing the averaged weights to this path.') + num_group = parser.add_mutually_exclusive_group() + num_group.add_argument('--num-epoch-checkpoints', type=int, + help='if set, will try to find checkpoints with names checkpoint_xx.pt in the ' + 'path specified by input, and average last this many of them.') + num_group.add_argument('--num-update-checkpoints', type=int, + help='if set, will try to find checkpoints with names checkpoint_ee_xx.pt in the path specified by' + ' input, and average last this many of them.') + parser.add_argument('--checkpoint-upper-bound', type=int, + help='when using --num-epoch-checkpoints, this will set an upper bound on which epoch to use, ' + 'when using --num-update-checkpoints, this will set an upper bound on which update to use' + 'e.g., with --num-epoch-checkpoints=10 --checkpoint-upper-bound=50, checkpoints 41-50 would be' + ' averaged.' + 'e.g., with --num-update-checkpoints=10 --checkpoint-upper-bound=50000, checkpoints 40500-50000 would' + ' be averaged assuming --save-interval-updates 500' + ) + # fmt: on + args = parser.parse_args() + print(args) + + num = None + is_update_based = False + if args.num_update_checkpoints is not None: + num = args.num_update_checkpoints + is_update_based = True + elif args.num_epoch_checkpoints is not None: + num = args.num_epoch_checkpoints + + assert args.checkpoint_upper_bound is None or ( + args.num_epoch_checkpoints is not None + or args.num_update_checkpoints is not None + ), "--checkpoint-upper-bound requires --num-epoch-checkpoints or --num-update-checkpoints" + assert ( + args.num_epoch_checkpoints is None or args.num_update_checkpoints is None + ), "Cannot combine --num-epoch-checkpoints and --num-update-checkpoints" + + if num is not None: + args.inputs = last_n_checkpoints( + args.inputs, + num, + is_update_based, + upper_bound=args.checkpoint_upper_bound, + ) + print("averaging checkpoints: ", args.inputs) + + new_state = average_checkpoints(args.inputs) + with PathManager.open(args.output, "wb") as f: + torch.save(new_state, f) + print("Finished writing averaged checkpoint to {}".format(args.output)) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/build_sym_alignment.py b/Speech2S/speech2s/scripts/build_sym_alignment.py new file mode 100644 index 0000000..0ca5c18 --- /dev/null +++ b/Speech2S/speech2s/scripts/build_sym_alignment.py @@ -0,0 +1,97 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Use this script in order to build symmetric alignments for your translation +dataset. +This script depends on fast_align and mosesdecoder tools. You will need to +build those before running the script. +fast_align: + github: http://github.com/clab/fast_align + instructions: follow the instructions in README.md +mosesdecoder: + github: http://github.com/moses-smt/mosesdecoder + instructions: http://www.statmt.org/moses/?n=Development.GetStarted +The script produces the following files under --output_dir: + text.joined - concatenation of lines from the source_file and the + target_file. + align.forward - forward pass of fast_align. + align.backward - backward pass of fast_align. + aligned.sym_heuristic - symmetrized alignment. +""" + +import argparse +import os +from itertools import zip_longest + + +def main(): + parser = argparse.ArgumentParser(description="symmetric alignment builer") + # fmt: off + parser.add_argument('--fast_align_dir', + help='path to fast_align build directory') + parser.add_argument('--mosesdecoder_dir', + help='path to mosesdecoder root directory') + parser.add_argument('--sym_heuristic', + help='heuristic to use for symmetrization', + default='grow-diag-final-and') + parser.add_argument('--source_file', + help='path to a file with sentences ' + 'in the source language') + parser.add_argument('--target_file', + help='path to a file with sentences ' + 'in the target language') + parser.add_argument('--output_dir', + help='output directory') + # fmt: on + args = parser.parse_args() + + fast_align_bin = os.path.join(args.fast_align_dir, "fast_align") + symal_bin = os.path.join(args.mosesdecoder_dir, "bin", "symal") + sym_fast_align_bin = os.path.join( + args.mosesdecoder_dir, "scripts", "ems", "support", "symmetrize-fast-align.perl" + ) + + # create joined file + joined_file = os.path.join(args.output_dir, "text.joined") + with open(args.source_file, "r", encoding="utf-8") as src, open( + args.target_file, "r", encoding="utf-8" + ) as tgt: + with open(joined_file, "w", encoding="utf-8") as joined: + for s, t in zip_longest(src, tgt): + print("{} ||| {}".format(s.strip(), t.strip()), file=joined) + + bwd_align_file = os.path.join(args.output_dir, "align.backward") + + # run forward alignment + fwd_align_file = os.path.join(args.output_dir, "align.forward") + fwd_fast_align_cmd = "{FASTALIGN} -i {JOINED} -d -o -v > {FWD}".format( + FASTALIGN=fast_align_bin, JOINED=joined_file, FWD=fwd_align_file + ) + assert os.system(fwd_fast_align_cmd) == 0 + + # run backward alignment + bwd_align_file = os.path.join(args.output_dir, "align.backward") + bwd_fast_align_cmd = "{FASTALIGN} -i {JOINED} -d -o -v -r > {BWD}".format( + FASTALIGN=fast_align_bin, JOINED=joined_file, BWD=bwd_align_file + ) + assert os.system(bwd_fast_align_cmd) == 0 + + # run symmetrization + sym_out_file = os.path.join(args.output_dir, "aligned") + sym_cmd = "{SYMFASTALIGN} {FWD} {BWD} {SRC} {TGT} {OUT} {HEURISTIC} {SYMAL}".format( + SYMFASTALIGN=sym_fast_align_bin, + FWD=fwd_align_file, + BWD=bwd_align_file, + SRC=args.source_file, + TGT=args.target_file, + OUT=sym_out_file, + HEURISTIC=args.sym_heuristic, + SYMAL=symal_bin, + ) + assert os.system(sym_cmd) == 0 + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/compare_namespaces.py b/Speech2S/speech2s/scripts/compare_namespaces.py new file mode 100644 index 0000000..bc24db6 --- /dev/null +++ b/Speech2S/speech2s/scripts/compare_namespaces.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +"""Helper script to compare two argparse.Namespace objects.""" + +from argparse import Namespace # noqa + + +def main(): + + ns1 = eval(input("Namespace 1: ")) + ns2 = eval(input("Namespace 2: ")) + + def keys(ns): + ks = set() + for k in dir(ns): + if not k.startswith("_"): + ks.add(k) + return ks + + k1 = keys(ns1) + k2 = keys(ns2) + + def print_keys(ks, ns1, ns2=None): + for k in ks: + if ns2 is None: + print("{}\t{}".format(k, getattr(ns1, k, None))) + else: + print( + "{}\t{}\t{}".format(k, getattr(ns1, k, None), getattr(ns2, k, None)) + ) + + print("Keys unique to namespace 1:") + print_keys(k1 - k2, ns1) + print() + + print("Keys unique to namespace 2:") + print_keys(k2 - k1, ns2) + print() + + print("Overlapping keys with different values:") + ks = [k for k in k1 & k2 if getattr(ns1, k, "None") != getattr(ns2, k, "None")] + print_keys(ks, ns1, ns2) + print() + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/compound_split_bleu.sh b/Speech2S/speech2s/scripts/compound_split_bleu.sh new file mode 100644 index 0000000..1972fdd --- /dev/null +++ b/Speech2S/speech2s/scripts/compound_split_bleu.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +if [ $# -ne 1 ]; then + echo "usage: $0 GENERATE_PY_OUTPUT" + exit 1 +fi + +GEN=$1 + +SYS=$GEN.sys +REF=$GEN.ref + +if [ $(tail -n 1 $GEN | grep BLEU | wc -l) -ne 1 ]; then + echo "not done generating" + exit +fi + +grep ^H $GEN | awk -F '\t' '{print $NF}' | perl -ple 's{(\S)-(\S)}{$1 ##AT##-##AT## $2}g' > $SYS +grep ^T $GEN | cut -f2- | perl -ple 's{(\S)-(\S)}{$1 ##AT##-##AT## $2}g' > $REF +fairseq-score --sys $SYS --ref $REF diff --git a/Speech2S/speech2s/scripts/constraints/extract.py b/Speech2S/speech2s/scripts/constraints/extract.py new file mode 100644 index 0000000..437b373 --- /dev/null +++ b/Speech2S/speech2s/scripts/constraints/extract.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +"""Extracts random constraints from reference files.""" + +import argparse +import random +import sys + + +def get_phrase(words, index, length): + assert index < len(words) - length + 1 + phr = " ".join(words[index : index + length]) + for i in range(index, index + length): + words.pop(index) + return phr + + +def main(args): + + if args.seed: + random.seed(args.seed) + + for line in sys.stdin: + constraints = [] + + def add_constraint(constraint): + constraints.append(constraint) + + source = line.rstrip() + if "\t" in line: + source, target = line.split("\t") + if args.add_sos: + target = f" {target}" + if args.add_eos: + target = f"{target} " + + if len(target.split()) >= args.len: + words = [target] + + num = args.number + + choices = {} + for i in range(num): + if len(words) == 0: + break + segmentno = random.choice(range(len(words))) + segment = words.pop(segmentno) + tokens = segment.split() + phrase_index = random.choice(range(len(tokens))) + choice = " ".join( + tokens[phrase_index : min(len(tokens), phrase_index + args.len)] + ) + for j in range( + phrase_index, min(len(tokens), phrase_index + args.len) + ): + tokens.pop(phrase_index) + if phrase_index > 0: + words.append(" ".join(tokens[0:phrase_index])) + if phrase_index + 1 < len(tokens): + words.append(" ".join(tokens[phrase_index:])) + choices[target.find(choice)] = choice + + # mask out with spaces + target = target.replace(choice, " " * len(choice), 1) + + for key in sorted(choices.keys()): + add_constraint(choices[key]) + + print(source, *constraints, sep="\t") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--number", "-n", type=int, default=1, help="number of phrases") + parser.add_argument("--len", "-l", type=int, default=1, help="phrase length") + parser.add_argument( + "--add-sos", default=False, action="store_true", help="add token" + ) + parser.add_argument( + "--add-eos", default=False, action="store_true", help="add token" + ) + parser.add_argument("--seed", "-s", default=0, type=int) + args = parser.parse_args() + + main(args) diff --git a/Speech2S/speech2s/scripts/constraints/validate.py b/Speech2S/speech2s/scripts/constraints/validate.py new file mode 100644 index 0000000..d531ad9 --- /dev/null +++ b/Speech2S/speech2s/scripts/constraints/validate.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + + +"""Reads in a fairseq output file, and verifies that the constraints +(C- lines) are present in the output (the first H- line). Assumes that +constraints are listed prior to the first hypothesis. +""" + +constraints = [] +found = 0 +total = 0 +for line in sys.stdin: + if line.startswith("C-"): + constraints.append(line.rstrip().split("\t")[1]) + elif line.startswith("H-"): + text = line.split("\t")[2] + + for constraint in constraints: + total += 1 + if constraint in text: + found += 1 + else: + print(f"No {constraint} in {text}", file=sys.stderr) + + constraints = [] + +print(f"Found {found} / {total} = {100 * found / total:.1f}%") diff --git a/Speech2S/speech2s/scripts/convert_dictionary.lua b/Speech2S/speech2s/scripts/convert_dictionary.lua new file mode 100644 index 0000000..14ee8c9 --- /dev/null +++ b/Speech2S/speech2s/scripts/convert_dictionary.lua @@ -0,0 +1,34 @@ +-- Copyright (c) Facebook, Inc. and its affiliates. +-- +-- This source code is licensed under the MIT license found in the +-- LICENSE file in the root directory of this source tree. +-- +-- Usage: convert_dictionary.lua +require 'fairseq' +require 'torch' +require 'paths' + +if #arg < 1 then + print('usage: convert_dictionary.lua ') + os.exit(1) +end +if not paths.filep(arg[1]) then + print('error: file does not exit: ' .. arg[1]) + os.exit(1) +end + +dict = torch.load(arg[1]) +dst = paths.basename(arg[1]):gsub('.th7', '.txt') +assert(dst:match('.txt$')) + +f = io.open(dst, 'w') +for idx, symbol in ipairs(dict.index_to_symbol) do + if idx > dict.cutoff then + break + end + f:write(symbol) + f:write(' ') + f:write(dict.index_to_freq[idx]) + f:write('\n') +end +f:close() diff --git a/Speech2S/speech2s/scripts/convert_model.lua b/Speech2S/speech2s/scripts/convert_model.lua new file mode 100644 index 0000000..61b9213 --- /dev/null +++ b/Speech2S/speech2s/scripts/convert_model.lua @@ -0,0 +1,108 @@ +-- Copyright (c) Facebook, Inc. and its affiliates. +-- +-- This source code is licensed under the MIT license found in the +-- LICENSE file in the root directory of this source tree. +-- +-- Usage: convert_model.lua +require 'torch' +local fairseq = require 'fairseq' + +model = torch.load(arg[1]) + +function find_weight_norm(container, module) + for _, wn in ipairs(container:listModules()) do + if torch.type(wn) == 'nn.WeightNorm' and wn.modules[1] == module then + return wn + end + end +end + +function push_state(dict, key, module) + if torch.type(module) == 'nn.Linear' then + local wn = find_weight_norm(model.module, module) + assert(wn) + dict[key .. '.weight_v'] = wn.v:float() + dict[key .. '.weight_g'] = wn.g:float() + elseif torch.type(module) == 'nn.TemporalConvolutionTBC' then + local wn = find_weight_norm(model.module, module) + assert(wn) + local v = wn.v:float():view(wn.viewOut):transpose(2, 3) + dict[key .. '.weight_v'] = v + dict[key .. '.weight_g'] = wn.g:float():view(module.weight:size(3), 1, 1) + else + dict[key .. '.weight'] = module.weight:float() + end + if module.bias then + dict[key .. '.bias'] = module.bias:float() + end +end + +encoder_dict = {} +decoder_dict = {} +combined_dict = {} + +function encoder_state(encoder) + luts = encoder:findModules('nn.LookupTable') + push_state(encoder_dict, 'embed_tokens', luts[1]) + push_state(encoder_dict, 'embed_positions', luts[2]) + + fcs = encoder:findModules('nn.Linear') + assert(#fcs >= 2) + local nInputPlane = fcs[1].weight:size(1) + push_state(encoder_dict, 'fc1', table.remove(fcs, 1)) + push_state(encoder_dict, 'fc2', table.remove(fcs, #fcs)) + + for i, module in ipairs(encoder:findModules('nn.TemporalConvolutionTBC')) do + push_state(encoder_dict, 'convolutions.' .. tostring(i - 1), module) + if nInputPlane ~= module.weight:size(3) / 2 then + push_state(encoder_dict, 'projections.' .. tostring(i - 1), table.remove(fcs, 1)) + end + nInputPlane = module.weight:size(3) / 2 + end + assert(#fcs == 0) +end + +function decoder_state(decoder) + luts = decoder:findModules('nn.LookupTable') + push_state(decoder_dict, 'embed_tokens', luts[1]) + push_state(decoder_dict, 'embed_positions', luts[2]) + + fcs = decoder:findModules('nn.Linear') + local nInputPlane = fcs[1].weight:size(1) + push_state(decoder_dict, 'fc1', table.remove(fcs, 1)) + push_state(decoder_dict, 'fc2', fcs[#fcs - 1]) + push_state(decoder_dict, 'fc3', fcs[#fcs]) + + table.remove(fcs, #fcs) + table.remove(fcs, #fcs) + + for i, module in ipairs(decoder:findModules('nn.TemporalConvolutionTBC')) do + if nInputPlane ~= module.weight:size(3) / 2 then + push_state(decoder_dict, 'projections.' .. tostring(i - 1), table.remove(fcs, 1)) + end + nInputPlane = module.weight:size(3) / 2 + + local prefix = 'attention.' .. tostring(i - 1) + push_state(decoder_dict, prefix .. '.in_projection', table.remove(fcs, 1)) + push_state(decoder_dict, prefix .. '.out_projection', table.remove(fcs, 1)) + push_state(decoder_dict, 'convolutions.' .. tostring(i - 1), module) + end + assert(#fcs == 0) +end + + +_encoder = model.module.modules[2] +_decoder = model.module.modules[3] + +encoder_state(_encoder) +decoder_state(_decoder) + +for k, v in pairs(encoder_dict) do + combined_dict['encoder.' .. k] = v +end +for k, v in pairs(decoder_dict) do + combined_dict['decoder.' .. k] = v +end + + +torch.save('state_dict.t7', combined_dict) diff --git a/Speech2S/speech2s/scripts/count_docs.py b/Speech2S/speech2s/scripts/count_docs.py new file mode 100644 index 0000000..58d85af --- /dev/null +++ b/Speech2S/speech2s/scripts/count_docs.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Count the number of documents and average number of lines and tokens per +document in a large file. Documents should be separated by a single empty line. +""" + +import argparse +import gzip +import sys + +import numpy as np + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input") + parser.add_argument("--gzip", action="store_true") + args = parser.parse_args() + + def gopen(): + if args.gzip: + return gzip.open(args.input, "r") + else: + return open(args.input, "r", encoding="utf-8") + + num_lines = [] + num_toks = [] + with gopen() as h: + num_docs = 1 + num_lines_in_doc = 0 + num_toks_in_doc = 0 + for i, line in enumerate(h): + if len(line.strip()) == 0: # empty line indicates new document + num_docs += 1 + num_lines.append(num_lines_in_doc) + num_toks.append(num_toks_in_doc) + num_lines_in_doc = 0 + num_toks_in_doc = 0 + else: + num_lines_in_doc += 1 + num_toks_in_doc += len(line.rstrip().split()) + if i % 1000000 == 0: + print(i, file=sys.stderr, end="", flush=True) + elif i % 100000 == 0: + print(".", file=sys.stderr, end="", flush=True) + print(file=sys.stderr, flush=True) + + print("found {} docs".format(num_docs)) + print("average num lines per doc: {}".format(np.mean(num_lines))) + print("average num toks per doc: {}".format(np.mean(num_toks))) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/read_binarized.py b/Speech2S/speech2s/scripts/read_binarized.py new file mode 100644 index 0000000..a414095 --- /dev/null +++ b/Speech2S/speech2s/scripts/read_binarized.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse + +from fairseq.data import Dictionary, data_utils, indexed_dataset + + +def get_parser(): + parser = argparse.ArgumentParser( + description="writes text from binarized file to stdout" + ) + # fmt: off + parser.add_argument('--dataset-impl', help='dataset implementation', + choices=indexed_dataset.get_available_dataset_impl()) + parser.add_argument('--dict', metavar='FP', help='dictionary containing known words', default=None) + parser.add_argument('--input', metavar='FP', required=True, help='binarized file to read') + # fmt: on + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + dictionary = Dictionary.load(args.dict) if args.dict is not None else None + dataset = data_utils.load_indexed_dataset( + args.input, + dictionary, + dataset_impl=args.dataset_impl, + default="lazy", + ) + + for tensor_line in dataset: + if dictionary is None: + line = " ".join([str(int(x)) for x in tensor_line]) + else: + line = dictionary.string(tensor_line) + + print(line) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/rm_pt.py b/Speech2S/speech2s/scripts/rm_pt.py new file mode 100644 index 0000000..6cd063d --- /dev/null +++ b/Speech2S/speech2s/scripts/rm_pt.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import re +import shutil +import sys + + +pt_regexp = re.compile(r"checkpoint(\d+|_\d+_\d+|_[a-z]+)\.pt") +pt_regexp_epoch_based = re.compile(r"checkpoint(\d+)\.pt") +pt_regexp_update_based = re.compile(r"checkpoint_\d+_(\d+)\.pt") + + +def parse_checkpoints(files): + entries = [] + for f in files: + m = pt_regexp_epoch_based.fullmatch(f) + if m is not None: + entries.append((int(m.group(1)), m.group(0))) + else: + m = pt_regexp_update_based.fullmatch(f) + if m is not None: + entries.append((int(m.group(1)), m.group(0))) + return entries + + +def last_n_checkpoints(files, n): + entries = parse_checkpoints(files) + return [x[1] for x in sorted(entries, reverse=True)[:n]] + + +def every_n_checkpoints(files, n): + entries = parse_checkpoints(files) + return [x[1] for x in sorted(sorted(entries)[::-n])] + + +def main(): + parser = argparse.ArgumentParser( + description=( + "Recursively delete checkpoint files from `root_dir`, " + "but preserve checkpoint_best.pt and checkpoint_last.pt" + ) + ) + parser.add_argument("root_dirs", nargs="*") + parser.add_argument( + "--save-last", type=int, default=0, help="number of last checkpoints to save" + ) + parser.add_argument( + "--save-every", type=int, default=0, help="interval of checkpoints to save" + ) + parser.add_argument( + "--preserve-test", + action="store_true", + help="preserve checkpoints in dirs that start with test_ prefix (default: delete them)", + ) + parser.add_argument( + "--delete-best", action="store_true", help="delete checkpoint_best.pt" + ) + parser.add_argument( + "--delete-last", action="store_true", help="delete checkpoint_last.pt" + ) + parser.add_argument( + "--no-dereference", action="store_true", help="don't dereference symlinks" + ) + args = parser.parse_args() + + files_to_desymlink = [] + files_to_preserve = [] + files_to_delete = [] + for root_dir in args.root_dirs: + for root, _subdirs, files in os.walk(root_dir): + if args.save_last > 0: + to_save = last_n_checkpoints(files, args.save_last) + else: + to_save = [] + if args.save_every > 0: + to_save += every_n_checkpoints(files, args.save_every) + for file in files: + if not pt_regexp.fullmatch(file): + continue + full_path = os.path.join(root, file) + if ( + not os.path.basename(root).startswith("test_") or args.preserve_test + ) and ( + (file == "checkpoint_last.pt" and not args.delete_last) + or (file == "checkpoint_best.pt" and not args.delete_best) + or file in to_save + ): + if os.path.islink(full_path) and not args.no_dereference: + files_to_desymlink.append(full_path) + else: + files_to_preserve.append(full_path) + else: + files_to_delete.append(full_path) + + if len(files_to_desymlink) == 0 and len(files_to_delete) == 0: + print("Nothing to do.") + sys.exit(0) + + files_to_desymlink = sorted(files_to_desymlink) + files_to_preserve = sorted(files_to_preserve) + files_to_delete = sorted(files_to_delete) + + print("Operations to perform (in order):") + if len(files_to_desymlink) > 0: + for file in files_to_desymlink: + print(" - preserve (and dereference symlink): " + file) + if len(files_to_preserve) > 0: + for file in files_to_preserve: + print(" - preserve: " + file) + if len(files_to_delete) > 0: + for file in files_to_delete: + print(" - delete: " + file) + while True: + resp = input("Continue? (Y/N): ") + if resp.strip().lower() == "y": + break + elif resp.strip().lower() == "n": + sys.exit(0) + + print("Executing...") + if len(files_to_desymlink) > 0: + for file in files_to_desymlink: + realpath = os.path.realpath(file) + print("rm " + file) + os.remove(file) + print("cp {} {}".format(realpath, file)) + shutil.copyfile(realpath, file) + if len(files_to_delete) > 0: + for file in files_to_delete: + print("rm " + file) + os.remove(file) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/sacrebleu.sh b/Speech2S/speech2s/scripts/sacrebleu.sh new file mode 100644 index 0000000..c10bf2b --- /dev/null +++ b/Speech2S/speech2s/scripts/sacrebleu.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +if [ $# -ne 4 ]; then + echo "usage: $0 TESTSET SRCLANG TGTLANG GEN" + exit 1 +fi + +TESTSET=$1 +SRCLANG=$2 +TGTLANG=$3 + +GEN=$4 + +if ! command -v sacremoses &> /dev/null +then + echo "sacremoses could not be found, please install with: pip install sacremoses" + exit +fi + +grep ^H $GEN \ +| sed 's/^H\-//' \ +| sort -n -k 1 \ +| cut -f 3 \ +| sacremoses detokenize \ +> $GEN.sorted.detok + +sacrebleu --test-set $TESTSET --language-pair "${SRCLANG}-${TGTLANG}" < $GEN.sorted.detok diff --git a/Speech2S/speech2s/scripts/shard_docs.py b/Speech2S/speech2s/scripts/shard_docs.py new file mode 100644 index 0000000..97232c3 --- /dev/null +++ b/Speech2S/speech2s/scripts/shard_docs.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Split a large file into shards while respecting document boundaries. Documents +should be separated by a single empty line. +""" + +import argparse +import contextlib + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input") + parser.add_argument("--num-shards", type=int) + args = parser.parse_args() + + assert args.num_shards is not None and args.num_shards > 1 + + with open(args.input, "r", encoding="utf-8") as h: + with contextlib.ExitStack() as stack: + outputs = [ + stack.enter_context( + open(args.input + ".shard" + str(i), "w", encoding="utf-8") + ) + for i in range(args.num_shards) + ] + + doc = [] + first_doc = [True] * args.num_shards + + def output_doc(i): + if not first_doc[i]: + outputs[i].write("\n") + first_doc[i] = False + for line in doc: + outputs[i].write(line) + doc.clear() + + num_docs = 0 + for line in h: + if line.strip() == "": # empty line indicates new document + output_doc(num_docs % args.num_shards) + num_docs += 1 + else: + doc.append(line) + output_doc(num_docs % args.num_shards) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/split_train_valid_docs.py b/Speech2S/speech2s/scripts/split_train_valid_docs.py new file mode 100644 index 0000000..ff15978 --- /dev/null +++ b/Speech2S/speech2s/scripts/split_train_valid_docs.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Split a large file into a train and valid set while respecting document +boundaries. Documents should be separated by a single empty line. +""" + +import argparse +import random +import sys + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input") + parser.add_argument("sample_output", help="train output file") + parser.add_argument("remainder_output", help="valid output file") + parser.add_argument("-k", type=int, help="remainder size") + parser.add_argument( + "--lines", action="store_true", help="split lines instead of docs" + ) + args = parser.parse_args() + + assert args.k is not None + + sample = [] + remainder = [] + num_docs = [0] + + def update_sample(doc): + if len(sample) < args.k: + sample.append(doc.copy()) + else: + i = num_docs[0] + j = random.randrange(i + 1) + if j < args.k: + remainder.append(sample[j]) + sample[j] = doc.copy() + else: + remainder.append(doc.copy()) + num_docs[0] += 1 + doc.clear() + + with open(args.input, "r", encoding="utf-8") as h: + doc = [] + for i, line in enumerate(h): + if line.strip() == "": # empty line indicates new document + update_sample(doc) + else: + doc.append(line) + if args.lines: + update_sample(doc) + if i % 1000000 == 0: + print(i, file=sys.stderr, end="", flush=True) + elif i % 100000 == 0: + print(".", file=sys.stderr, end="", flush=True) + if len(doc) > 0: + update_sample(doc) + print(file=sys.stderr, flush=True) + + assert len(sample) == args.k + + with open(args.sample_output, "w", encoding="utf-8") as out: + first = True + for doc in sample: + if not first and not args.lines: + out.write("\n") + first = False + for line in doc: + out.write(line) + + with open(args.remainder_output, "w", encoding="utf-8") as out: + first = True + for doc in remainder: + if not first and not args.lines: + out.write("\n") + first = False + for line in doc: + out.write(line) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/spm_decode.py b/Speech2S/speech2s/scripts/spm_decode.py new file mode 100644 index 0000000..7d7b68b --- /dev/null +++ b/Speech2S/speech2s/scripts/spm_decode.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import argparse + +import sentencepiece as spm + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--model", required=True, help="sentencepiece model to use for decoding" + ) + parser.add_argument("--input", required=True, help="input file to decode") + parser.add_argument("--input_format", choices=["piece", "id"], default="piece") + args = parser.parse_args() + + sp = spm.SentencePieceProcessor() + sp.Load(args.model) + + if args.input_format == "piece": + + def decode(input): + return "".join(sp.DecodePieces(input)) + + elif args.input_format == "id": + + def decode(input): + return "".join(sp.DecodeIds(input)) + + else: + raise NotImplementedError + + def tok2int(tok): + # remap reference-side (represented as <>) to 0 + return int(tok) if tok != "<>" else 0 + + with open(args.input, "r", encoding="utf-8") as h: + for line in h: + if args.input_format == "id": + print(decode(list(map(tok2int, line.rstrip().split())))) + elif args.input_format == "piece": + print(decode(line.rstrip().split())) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/spm_encode.py b/Speech2S/speech2s/scripts/spm_encode.py new file mode 100644 index 0000000..f91e0bb --- /dev/null +++ b/Speech2S/speech2s/scripts/spm_encode.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import argparse +import contextlib +import sys + +import sentencepiece as spm + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--model", required=True, help="sentencepiece model to use for encoding" + ) + parser.add_argument( + "--inputs", nargs="+", default=["-"], help="input files to filter/encode" + ) + parser.add_argument( + "--outputs", nargs="+", default=["-"], help="path to save encoded outputs" + ) + parser.add_argument("--output_format", choices=["piece", "id"], default="piece") + parser.add_argument( + "--min-len", + type=int, + metavar="N", + help="filter sentence pairs with fewer than N tokens", + ) + parser.add_argument( + "--max-len", + type=int, + metavar="N", + help="filter sentence pairs with more than N tokens", + ) + args = parser.parse_args() + + assert len(args.inputs) == len( + args.outputs + ), "number of input and output paths should match" + + sp = spm.SentencePieceProcessor() + sp.Load(args.model) + + if args.output_format == "piece": + + def encode(input): + return sp.EncodeAsPieces(input) + + elif args.output_format == "id": + + def encode(input): + return list(map(str, sp.EncodeAsIds(input))) + + else: + raise NotImplementedError + + if args.min_len is not None or args.max_len is not None: + + def valid(line): + return (args.min_len is None or len(line) >= args.min_len) and ( + args.max_len is None or len(line) <= args.max_len + ) + + else: + + def valid(lines): + return True + + with contextlib.ExitStack() as stack: + inputs = [ + stack.enter_context(open(input, "r", encoding="utf-8")) + if input != "-" + else sys.stdin + for input in args.inputs + ] + outputs = [ + stack.enter_context(open(output, "w", encoding="utf-8")) + if output != "-" + else sys.stdout + for output in args.outputs + ] + + stats = { + "num_empty": 0, + "num_filtered": 0, + } + + def encode_line(line): + line = line.strip() + if len(line) > 0: + line = encode(line) + if valid(line): + return line + else: + stats["num_filtered"] += 1 + else: + stats["num_empty"] += 1 + return None + + for i, lines in enumerate(zip(*inputs), start=1): + enc_lines = list(map(encode_line, lines)) + if not any(enc_line is None for enc_line in enc_lines): + for enc_line, output_h in zip(enc_lines, outputs): + print(" ".join(enc_line), file=output_h) + if i % 10000 == 0: + print("processed {} lines".format(i), file=sys.stderr) + + print("skipped {} empty lines".format(stats["num_empty"]), file=sys.stderr) + print("filtered {} lines".format(stats["num_filtered"]), file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/scripts/spm_train.py b/Speech2S/speech2s/scripts/spm_train.py new file mode 100644 index 0000000..9db668f --- /dev/null +++ b/Speech2S/speech2s/scripts/spm_train.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import sys + +import sentencepiece as spm + + +if __name__ == "__main__": + spm.SentencePieceTrainer.Train(" ".join(sys.argv[1:])) diff --git a/Speech2S/speech2s/scripts/test_fsdp.sh b/Speech2S/speech2s/scripts/test_fsdp.sh new file mode 100644 index 0000000..1f428a0 --- /dev/null +++ b/Speech2S/speech2s/scripts/test_fsdp.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +rm -rf fsdp_dummy +mkdir -p fsdp_dummy +CUDA_VISIBLE_DEVICES=0,1,2,3 fairseq-train /private/home/sshleifer/data-bin/stories_mmap \ + --ddp-backend fully_sharded --fp16 --fp16-init-scale 4 \ + --cpu-offload --checkpoint-activations \ + --task language_modeling --tokens-per-sample 256 --batch-size 8 \ + --arch transformer_lm_gpt2_tiny \ + --optimizer cpu_adam --adam-betas "(0.9,0.98)" \ + --lr 0.0001 --lr-scheduler polynomial_decay --warmup-updates 5 --total-num-update 10 \ + --max-update 5 --log-format json --log-interval 1 \ + --save-interval-updates 5 --save-dir fsdp_dummy --disable-validation \ + --restore-file x.pt "$@" + +# Now we try to load the checkpoint +CUDA_VISIBLE_DEVICES=0,1 fairseq-train /private/home/sshleifer/data-bin/stories_mmap \ + --ddp-backend fully_sharded --fp16 --fp16-init-scale 4 \ + --cpu-offload --checkpoint-activations \ + --task language_modeling --tokens-per-sample 256 --batch-size 8 \ + --arch transformer_lm_gpt2_tiny \ + --optimizer cpu_adam --adam-betas "(0.9,0.98)" \ + --lr 0.0001 --lr-scheduler polynomial_decay --warmup-updates 5 --total-num-update 10 \ + --max-update 2 --log-format json --log-interval 1 \ + --save-interval-updates 2 --save-dir fsdp_dummy diff --git a/Speech2S/speech2s/stpretrain_scripts/base_sc2c_enes.sh b/Speech2S/speech2s/stpretrain_scripts/base_sc2c_enes.sh new file mode 100644 index 0000000..08e0040 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/base_sc2c_enes.sh @@ -0,0 +1,64 @@ + +# #################################### +# Hubert SCT2T ED model # +# #################################### + +world_size=$1 +update_freq=$2 +exp_name=$3 +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=1 +[ -z $exp_name ] && exp_name=sc2t_base_enes_${world_size}gpu_${update_freq}accum6666 + + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +CONFIG_DIR=/mnt/output/users/v-kunwei/code/stpretrain_scripts/config +DATA_DIR="/mnt/output/users/v-kunwei/data/s2s_data/speech_enes" +TEXT_DATA_DIR="/mnt/output/users/v-kunwei/data/s2s_data/text_enes/bin-idx" +MODEL_DIR="/mnt/output/v-kunwei/data/s2s_data/exp/S2S_enes/$exp_name" + +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + + +python $FAIRSEQ_ROOT/fairseq_cli/hydra_train.py \ + --config-dir $CONFIG_DIR/pretrain \ + --config-name sc2t_base_librispeech \ + \ + +task.store_labels=true \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + +task.text_cfg.data_config=config.yaml \ + task.text_cfg.text_maxtokens_ratio=3.0 \ + \ + +criterion.dec_loss_type="ce" \ + \ + criterion.text_weight=1.0 \ + \ + model.use_rel_pos_enc=true \ + +model.code_use_rel_pos_enc=true \ + +model.pad_with_code=true \ + model.text_transformer.no_scale_embedding=true \ + model.text_transformer.layernorm_embedding=true \ + +model.share_decoder_input_output_embed=true \ + \ + dataset.train_subset=\"train_all+en.kmu-spm\" \ + dataset.valid_subset=\"valid+en_valid.kmu-spm\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1000000 \ + optimization.update_freq=[${update_freq}] \ + optimization.max_update=400000 \ + \ + distributed_training.distributed_world_size=${world_size} \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} + + +sleep 5m +echo "All finished" + diff --git a/Speech2S/speech2s/stpretrain_scripts/base_sc2c_esen.sh b/Speech2S/speech2s/stpretrain_scripts/base_sc2c_esen.sh new file mode 100644 index 0000000..2a15bd1 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/base_sc2c_esen.sh @@ -0,0 +1,64 @@ + +# #################################### +# Hubert SCT2T ED model # +# #################################### + +world_size=$1 +update_freq=$2 +exp_name=$3 +[ -z $world_size ] && world_size=24 +[ -z $update_freq ] && update_freq=3 +[ -z $exp_name ] && exp_name=sc2t_base_esen_${world_size}gpu_${update_freq}accum1 + + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +CONFIG_DIR=/mnt/output/users/v-kunwei/code/stpretrain_scripts/config +DATA_DIR="/mnt/output/users/v-kunwei/data/s2s_data/speech_esen" +TEXT_DATA_DIR="/mnt/output/users/v-kunwei/data/s2s_data/text_esen" +MODEL_DIR="/mnt/output/v-kunwei/data/s2s_data/exp/S2S_esen/$exp_name" + +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + + +python $FAIRSEQ_ROOT/fairseq_cli/hydra_train.py \ + --config-dir $CONFIG_DIR/pretrain \ + --config-name sc2t_base_librispeech \ + \ + +task.store_labels=true \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + +task.text_cfg.data_config=config.yaml \ + task.text_cfg.text_maxtokens_ratio=3.0 \ + \ + +criterion.dec_loss_type="ce" \ + \ + criterion.text_weight=1.0 \ + \ + model.use_rel_pos_enc=true \ + +model.code_use_rel_pos_enc=true \ + +model.pad_with_code=true \ + model.text_transformer.no_scale_embedding=true \ + model.text_transformer.layernorm_embedding=true \ + +model.share_decoder_input_output_embed=true \ + \ + dataset.train_subset=\"train+en.kmu-spm\" \ + dataset.valid_subset=\"valid+en_valid.kmu-spm\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1000000 \ + optimization.update_freq=[${update_freq}] \ + optimization.max_update=400000 \ + \ + distributed_training.distributed_world_size=${world_size} \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} + + +sleep 5m +echo "All finished" + diff --git a/Speech2S/speech2s/stpretrain_scripts/config.yaml b/Speech2S/speech2s/stpretrain_scripts/config.yaml new file mode 100644 index 0000000..58ba896 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/config.yaml @@ -0,0 +1,4 @@ +audio_root: ./ +standardize_audio: true +use_audio_input: true +vocab_filename: dict.txt diff --git a/Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/base_100h.yaml b/Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/base_100h.yaml new file mode 100644 index 0000000..7c9fae8 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/base_100h.yaml @@ -0,0 +1,101 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1 + keep_last_epochs: 5 + keep_best_checkpoints: 5 + best_checkpoint_metric: wer + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: hubert_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: false # must be consistent with pre-training + labels: ["ltr"] + single_target: true + add_decoder: false + pad_audio: false + random_crop: true + tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1200000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: label_smoothed_cross_entropy + #zero_infinity: true + + +optimization: + max_update: 80000 + lr: [0.00003] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: hubert_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + decoder_layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: false + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/large_960h.yaml b/Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/large_960h.yaml new file mode 100644 index 0000000..3601823 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/config/finetune_asr/large_960h.yaml @@ -0,0 +1,98 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + +checkpoint: + save_interval: 1 + keep_last_epochs: 10 + keep_best_checkpoints: 5 + best_checkpoint_metric: wer + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 24 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: hubert_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: true # must be consistent with pre-training + labels: ["ltr"] + single_target: true + add_decoder: false + pad_audio: false + random_crop: true + tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1280000 + skip_invalid_size_inputs_valid_test: true + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 200000 + lr: [0.00003] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: hubert_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.0 + decoder_layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: false + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/stpretrain_scripts/config/pretrain/mbart.yaml b/Speech2S/speech2s/stpretrain_scripts/config/pretrain/mbart.yaml new file mode 100644 index 0000000..51025f2 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/config/pretrain/mbart.yaml @@ -0,0 +1,120 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 4 + keep_last_epochs: 4 + save_interval_updates: 20000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 50000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 8 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: denoising + data: ??? + mask: 0.15 + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: sc2t + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + text_weight: 0.1 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: stbert + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layers: 6 + encoder_attention_heads: 8 + decoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_code_encoder: true + add_adaptor: false + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + adaptive_input: ${model.adaptive_input} + max_source_positions: 3000 + checkpoint_activations: ${model.checkpoint_activations} + no_scale_embedding: false + layernorm_embedding: false + quant_noise: + pq: ${model.quant_noise_pq} + encoder: + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 8 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/stpretrain_scripts/config/pretrain/sc2t_base_librispeech.yaml b/Speech2S/speech2s/stpretrain_scripts/config/pretrain/sc2t_base_librispeech.yaml new file mode 100644 index 0000000..0cd1656 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/config/pretrain/sc2t_base_librispeech.yaml @@ -0,0 +1,137 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 4 + keep_last_epochs: 4 + save_interval_updates: 20000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 50000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 8 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: false # must be consistent with extractor + add_decoder: true + text_cfg: + seed: ${common.seed} + text_data: ??? + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.0 + + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: sc2t + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + text_weight: 0.1 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: stbert + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layers: 6 + encoder_attention_heads: 8 + decoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_code_encoder: true + add_adaptor: false + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + adaptive_input: ${model.adaptive_input} + max_source_positions: 3000 + checkpoint_activations: ${model.checkpoint_activations} + no_scale_embedding: false + layernorm_embedding: false + quant_noise: + pq: ${model.quant_noise_pq} + encoder: + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 8 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/stpretrain_scripts/config/translation/text2code.yaml b/Speech2S/speech2s/stpretrain_scripts/config/translation/text2code.yaml new file mode 100644 index 0000000..bed2513 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/config/translation/text2code.yaml @@ -0,0 +1,81 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1000000 + keep_last_epochs: 5 + save_interval_updates: 1000 + keep_interval_updates_pattern: 10000 + keep_interval_updates: 5 + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 1 + nprocs_per_node: 8 + + +criterion: + _name: "label_smoothed_cross_entropy" + + +task: + _name: "translation_from_jst" + +dataset: + num_workers: 0 + max_tokens: 4096 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: ${model.freeze_finetune_updates} + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + train_subset: train_clean_100 + valid_subset: dev_clean + required_batch_size_multiple: 1 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: hubert_t2c + w2v_path: ??? + layerdrop: 0.1 + decoder_layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/stpretrain_scripts/config_mbart.yaml b/Speech2S/speech2s/stpretrain_scripts/config_mbart.yaml new file mode 100644 index 0000000..51025f2 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/config_mbart.yaml @@ -0,0 +1,120 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 4 + keep_last_epochs: 4 + save_interval_updates: 20000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 50000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 8 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: denoising + data: ??? + mask: 0.15 + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: sc2t + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + text_weight: 0.1 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: stbert + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layers: 6 + encoder_attention_heads: 8 + decoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_code_encoder: true + add_adaptor: false + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + adaptive_input: ${model.adaptive_input} + max_source_positions: 3000 + checkpoint_activations: ${model.checkpoint_activations} + no_scale_embedding: false + layernorm_embedding: false + quant_noise: + pq: ${model.quant_noise_pq} + encoder: + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 8 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/Speech2S/speech2s/stpretrain_scripts/data_process/extract_hubert_feature_itp.sh b/Speech2S/speech2s/stpretrain_scripts/data_process/extract_hubert_feature_itp.sh new file mode 100644 index 0000000..5292989 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/data_process/extract_hubert_feature_itp.sh @@ -0,0 +1,41 @@ + +if [ ! -d ${HOME}/azcopy_linux_amd64_10.11.0 ]; then + CURRENT_DIR=`pwd` + cd ${HOME} && wget https://azcopyvnext.azureedge.net/release20210616/azcopy_linux_amd64_10.11.0.tar.gz && tar -zxvf azcopy_linux_amd64_10.11.0.tar.gz && rm -f azcopy_linux_amd64_10.11.0.tar.gz && cd ${CURRENT_DIR} +fi +export PATH=$PATH:${HOME}/azcopy_linux_amd64_10.11.0/:${HOME}/.local/bin +export PYTHONPATH=$PYTHONPATH:/mnt/output/users/v-kunwei/code/fairseq + +rank=$1 +nshard=$2 +split=$3 +[ -z $rank ] && echo "please specify rank" +[ -z $nshard ] && nshard=1 +[ -z $split ] && split="train" + + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq +ckpt_path=/mnt/output/users/v-kunwei/code/fairseq/examples/speech_to_speech/mhubert_base_vp_en_es_fr_it3.pt +tsv_dir=/home/v-kunwei + +feat_dir=${HOME}/$split +python $FAIRSEQ_ROOT/examples/hubert/simple_kmeans/dump_hubert_feature.py ${tsv_dir} ${split} ${ckpt_path} 9 ${nshard} ${rank} ${feat_dir} || exit 1 + + +echo "-------------------------------------------------------------------------------------------" +echo "---------------------------------- done ---------------------------------------------" +echo "-------------------------------------------------------------------------------------------" + +km_path=/mnt/output/users/v-kunwei/code/fairseq/examples/speech_to_speech/mhubert_base_vp_en_es_fr_it3_L11_km1000.bin +lab_dir=${HOME}/${split} +python $FAIRSEQ_ROOT/examples/hubert/simple_kmeans/dump_km_label.py ${feat_dir} ${split} ${km_path} ${nshard} ${rank} ${lab_dir} + + +# sas="?sv=2020-08-04&st=2022-01-02T04%3A58%3A15Z&se=2022-06-01T04%3A58%3A00Z&sr=c&sp=racwdl&sig=NyZKOHivgesEoZ8yvLsVT6aZMYQZMevLLmXNOTaWyvU%3D" +# blob="https://msranlcmtteamdrive.blob.core.windows.net/teamdrive/v-ziqzhang/data/stbert/data/librispeech/libri_960/hubert_release_iter2_layer9_kmeans/${split}" +# azcopy copy $feat_dir/${split}_${rank}_${nshard}.len "$blob/$sas" +# azcopy copy $feat_dir/${split}_${rank}_${nshard}.npy "$blob/$sas" +# azcopy copy $lab_dir "$blob/$sas" --recursive + + + diff --git a/Speech2S/speech2s/stpretrain_scripts/data_process/merge_code.py b/Speech2S/speech2s/stpretrain_scripts/data_process/merge_code.py new file mode 100644 index 0000000..a02ba3e --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/data_process/merge_code.py @@ -0,0 +1,14 @@ +import sys +import torch + + +def main(): + for line in sys.stdin: + line = line.rstrip() + codes = list(map(int, line.split())) + merged_codes = torch.unique_consecutive(torch.tensor(codes)).numpy() + merged_codes = map(str, merged_codes) + print(" ".join(merged_codes)) + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/stpretrain_scripts/data_process/txt2idx.sh b/Speech2S/speech2s/stpretrain_scripts/data_process/txt2idx.sh new file mode 100644 index 0000000..466f8a3 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/data_process/txt2idx.sh @@ -0,0 +1,43 @@ +[ $# -lt 3 ] && echo "Usage: $0 " && exit 0 + +if [ ! -d ${HOME}/sentencepiece ]; then + CURRENT_DIR=`pwd` + cd ${HOME} + git clone https://github.com/google/sentencepiece.git + cd sentencepiece + mkdir build && cd build + cmake .. && make -j 16 + sudo make install + sudo ldconfig -v + cd ${HOME} + cd ${CURRENT_DIR} +fi + +input=$1 +outdir=$2 +DICT=$3 +suffix=$4 +outname=${input##*/} +outname=${outname%.txt*} +[ -z $input ] && echo "You must specify a source file" && exit 1 + +[ -z $DICT ] && echo "No dict was specified!" && exit 1 +[ -z $outdir ] && outdir=${input%/*} +[ -z $outdir ] && outdir="." +[ ! -d $outdir ] && mkdir -p $outdir + +echo "Dict : $DICT" +echo "------------------------------- creating idx/bin--------------------------------------------" +echo "$input --> $outdir/${outname}${suffix}.idx" +fairseq-preprocess \ + --only-source \ + --trainpref $input \ + --destdir $outdir \ + --thresholdsrc 0 \ + --srcdict ${DICT} \ + --workers 40 + +mv $outdir/train.idx $outdir/${outname}${suffix}.idx +mv $outdir/train.bin $outdir/${outname}${suffix}.bin +echo "----------------------------------- done --------------------------------------------" + diff --git a/Speech2S/speech2s/stpretrain_scripts/data_process/txt2spm.sh b/Speech2S/speech2s/stpretrain_scripts/data_process/txt2spm.sh new file mode 100644 index 0000000..6baf722 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/data_process/txt2spm.sh @@ -0,0 +1,33 @@ +[ $# -lt 2 ] && echo "Usage: $0 " && exit 0 + +if [ ! -d ${HOME}/sentencepiece ]; then + CURRENT_DIR=`pwd` + cd ${HOME} + git clone https://github.com/google/sentencepiece.git + cd sentencepiece + mkdir build && cd build + cmake .. && make -j 16 + sudo make install + sudo ldconfig -v + cd ${HOME} + cd ${CURRENT_DIR} +fi + +input=$1 +outdir=$2 +MODEL=$3 +suffix=$4 +outname=${input##*/} +outname=${outname%.wrd*} +[ -z $input ] && echo "You must specify a source file" && exit 1 + +[ -z $MODEL ] && MODEL=/mnt/default/v-ziqzhang/data/stbert/data/librispeech/hubert_release_iter2_layer9_kmeans/spm_unigram_10000.model && echo "No spm model was specified!, set default to $MODEL" +[ -z $outdir ] && outdir=${input%/*} +[ -z $outdir ] && outdir="." +[ ! -d $outdir ] && mkdir -p $outdir + +echo "Output: $outdir/$outname.spm" + +echo "------------------------------- tokenize text...--------------------------------------------" +spm_encode --model=$MODEL < ${input} > $outdir/$outname.spm || exit 1 +echo "----------------------------------- done --------------------------------------------" diff --git a/Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_en_text.py b/Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_en_text.py new file mode 100644 index 0000000..83e3325 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_en_text.py @@ -0,0 +1,46 @@ +import re +import sys +import regex +import argparse +from tqdm import tqdm +from num2words import num2words + +def writefile(filename, lines): + with open(filename, 'w', encoding='utf-8') as f: + f.writelines(lines) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--input", "-i", required=True, type=str) + parser.add_argument("--output", "-o", required=True, type=str) + args = parser.parse_args() + outlines = [] + + with open(f"{args.input}", 'r') as f: + inputs = f.readlines() + + for line in tqdm(inputs): + line = line.strip().upper() + line = re.sub(u"([^\u0041-\u005a\u0061-\u007a\u0030-\u0039\'])", " ", line) + items = [] + for item in line.split(): + if item.isdigit(): + try: + item = num2words(item) + except Exception as e: + print(line) + raise(e) + items.append(item) + line = " ".join(items) + line = line.replace("-", " ") + line = line.upper() + line = line.replace("' S", "'S") + line = line.replace(" ", "|") + line = " ".join(line) + " |" + outlines.append(line + '\n') + # print(line) + + writefile(args.output, outlines) + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_es_text.py b/Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_es_text.py new file mode 100644 index 0000000..0136b53 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/data_process/wmt/normalize_es_text.py @@ -0,0 +1,49 @@ +import re +import sys +import regex +import argparse +import re,string +from tqdm import tqdm +from num2words import num2words + +def writefile(filename, lines): + with open(filename, 'w', encoding='utf-8') as f: + f.writelines(lines) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--input", "-i", required=True, type=str) + parser.add_argument("--output", "-o", required=True, type=str) + args = parser.parse_args() + outlines = [] + + with open(f"{args.input}", 'r') as f: + inputs = f.readlines() + + for line in tqdm(inputs): + line = line.strip() + line = re.sub(u"([^\u0041-\u005a\u0061-\u007a\u0030-\u0039\u00d1\u00f1\'])", " ", line) + items = [] + punc='~`!#$%^&*()_+-=|\';":/.,?><~.' + for item in line.split(): + if item.isdigit(): + try: + item = num2words(item, lang='es') + except Exception as e: + print(line) + raise(e) + items.append(item) + line = " ".join(items) + line = (re.sub(r"[%s]+" %punc, "",line)) + line = line.replace("-", " ") + line = line.lower() + line = line.replace("' S", "'S") + line = line.replace(" ", "|") + line = " ".join(line) + " |" + outlines.append(line + '\n') + # print(line) + + writefile(args.output, outlines) + +if __name__ == "__main__": + main() diff --git a/Speech2S/speech2s/stpretrain_scripts/decode_text2code_beam2.sh b/Speech2S/speech2s/stpretrain_scripts/decode_text2code_beam2.sh new file mode 100644 index 0000000..c9dcc10 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/decode_text2code_beam2.sh @@ -0,0 +1,50 @@ + +##################################### +# Hubert ED model # +##################################### +[ $# -lt 1 ] && echo "Usage: $0 " && exit 0 +#source /mnt/default/v-ziqzhang/.bashrc_sing + +model_path=$1 +gen_set=$2 +tgt=$3 +src="ltr" +max_tokens=$4 +word_size=$5 +rank=$6 +outdir=$7 + +[ -z $tgt ] && tgt="kmu" +[ -z $gen_set ] && gen_set="dev_clean" +[ -z $word_size ] && word_size=1 +[ -z $rank ] && rank=0 +[ -z $max_tokens ] && max_tokens=16000 + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +DATA_DIR=/home/v-kunwei/ +[ $gen_set == "test" ] && DATA_DIR=/mnt/output/users/v-kunwei/code/fairseq_mlstku +[ -z $outdir ] && outdir=$DATA_DIR + + +results_path=$outdir/pseudo_${gen_set}_${rank} +[ ! -d $results_path ] && mkdir -p $results_path + +for subset in $gen_set; do + python $FAIRSEQ_ROOT/fairseq_cli/generate_mt_label.py $DATA_DIR \ + --path ${model_path} \ + --task "translation_from_jst" \ + --max-target-positions 18000 \ + --gen-subset $subset \ + -t $tgt -s "ltr" \ + --dataset-impl "raw" \ + --max-tokens ${max_tokens} \ + --beam 2 \ + --max-len-a 3 --max-len-b 100 \ + --results-path $results_path \ + --distributed-world-size $word_size --distributed-rank $rank \ + + echo "$model" > $results_path/model.record + sleep 1s +done | tee $results_path/decode.log + +sleep 2s diff --git a/Speech2S/speech2s/stpretrain_scripts/eval2.sh b/Speech2S/speech2s/stpretrain_scripts/eval2.sh new file mode 100644 index 0000000..0736ef4 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/eval2.sh @@ -0,0 +1,12 @@ +lmweight=0 +num_gpus=8 +python examples/speech_recognition/new/infer.py --config-dir /mnt/output/users/v-kunwei/code/fairseq/examples/speech_recognition/new/conf \ +--config-name infer task=audio_finetuning task.data=/home/v-kunwei common.user_dir=/mnt/output/users/v-kunwei/code/fairseq/examples/data2vec \ +task.labels=ltr decoding.type=viterbi \ +decoding.lexicon=models/es_eval/espeak_dict.txt \ +decoding.unique_wer_file=True \ +dataset.gen_subset=test \ +common_eval.path=/mnt/output/users/v-kunwei/code/fairseq/models/es_eval/espeak_26lang_m10.pt decoding.beam=1500 distributed_training.distributed_world_size=${num_gpus} \ +decoding.results_path=/home/v-kunwei + +#sclite -h "/home/v-kunwei/hypo.units" -r "/home/v-kunwei/ref.units" -i rm -o all stdout > "./result.txt" diff --git a/Speech2S/speech2s/stpretrain_scripts/eval3.sh b/Speech2S/speech2s/stpretrain_scripts/eval3.sh new file mode 100644 index 0000000..4a23543 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/eval3.sh @@ -0,0 +1,4 @@ +#$subset=test +python examples/speech_recognition/infer.py /home/v-kunwei --task audio_finetuning \ +--nbest 1 --path /mnt/output/users/v-kunwei/code/fairseq/models/es_eval/espeak_26lang_m10.pt --gen-subset test --results-path /home/v-kunwei --criterion ctc --labels ltr --max-tokens 4000000 \ +--post-process letter diff --git a/Speech2S/speech2s/stpretrain_scripts/finetune_enes.sh b/Speech2S/speech2s/stpretrain_scripts/finetune_enes.sh new file mode 100644 index 0000000..eaae147 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/finetune_enes.sh @@ -0,0 +1,85 @@ +# #################################### +# Hubert ED model # +# #################################### +#source /mnt/default/v-ziqzhang/.bashrc_sing + +[ $# -lt 4 ] && echo "Usage: $0 " && exit 0 +world_size=$1 +update_freq=$2 +w2v_path=$3 +cpt=$4 +Mount=$5 + +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=3 +[ -z $w2v_path ] && echo "you must specify a wav_path !" && exit 1 +[ -z $cpt ] && cpt=030.pt +[ -z $Mount ] && Mount=/mnt/default + + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +CONFIG_DIR=/mnt/output/users/v-kunwei/code/stpretrain_scripts/config +DATA_DIR="/mnt/output/users/v-kunwei/data/s2s_data/fin_enes100" + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="/mnt/output/users/v-kunwei/data/s2s_data/finetune/tune_ST_from_eneshu" +exp_name="tune_enes_lr5e-5_from_$cpt" +MODEL_DIR=$MODEL_DIR/$exp_name +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +max_tokens=490000 + +python $FAIRSEQ_ROOT/fairseq_cli/hydra_train.py \ + --config-dir $CONFIG_DIR/finetune_asr \ + --config-name base_100h \ + \ + +task.store_labels=true \ + task.labels='["spm"]' \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.add_decoder=true \ + +task.max_keep_size=490000 \ + \ + +model.reuse_text_emb=true \ + model._name="stbert_st" \ + model.w2v_path=${w2v_path} \ + model.add_decoder=true \ + \ + criterion._name="label_smoothed_cross_entropy" \ + +criterion.label_smoothing=0.2 \ + +criterion.report_accuracy=true \ + \ + lr_scheduler._name="polynomial_decay" \ + +lr_scheduler.warmup_updates=20000 \ + \ + optimization.lr=[0.0003] \ + optimization.max_update=100000 \ + checkpoint.best_checkpoint_metric="accuracy" \ + checkpoint.maximize_best_checkpoint_metric=true \ + checkpoint.save_interval=1 \ + \ + dataset.train_subset="train" \ + dataset.valid_subset="valid" \ + dataset.max_tokens=$max_tokens \ + optimization.update_freq=[${update_freq}] \ + \ + distributed_training.distributed_world_size=${world_size} \ + distributed_training.distributed_port=-1 \ + \ + common.log_interval=100 \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} + + + +sleep 20s + + # \ + # lr_scheduler._name="polynomial_decay" \ + # +lr_scheduler.warmup_updates=5000 \ + + +# /mnt/default/v-ziqzhang/data/stbert-ed/exp/ST_enes/sc2t_base_ende_32gpu_1accum/checkpoint_204_400000.pt diff --git a/Speech2S/speech2s/stpretrain_scripts/finetune_esen.sh b/Speech2S/speech2s/stpretrain_scripts/finetune_esen.sh new file mode 100644 index 0000000..a9051f6 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/finetune_esen.sh @@ -0,0 +1,85 @@ +# #################################### +# Hubert ED model # +# #################################### +#source /mnt/default/v-ziqzhang/.bashrc_sing + +[ $# -lt 4 ] && echo "Usage: $0 " && exit 0 +world_size=$1 +update_freq=$2 +w2v_path=$3 +cpt=$4 +Mount=$5 + +[ -z $world_size ] && world_size=1 +[ -z $update_freq ] && update_freq=1 +[ -z $w2v_path ] && echo "you must specify a wav_path !" && exit 1 +[ -z $cpt ] && cpt=030.pt +[ -z $Mount ] && Mount=/mnt/default + + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +CONFIG_DIR=/mnt/output/users/v-kunwei/code/stpretrain_scripts/config +DATA_DIR="/mnt/output/users/v-kunwei/data/s2s_data/fin_esen" + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="/mnt/output/users/v-kunwei/data/s2s_data/finetune/tune_ST_from_esen" +exp_name="tune_esen_lr5e-5_from_$cpt" +MODEL_DIR=$MODEL_DIR/$exp_name +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +max_tokens=4900 + +python $FAIRSEQ_ROOT/fairseq_cli/hydra_train.py \ + --config-dir $CONFIG_DIR/finetune_asr \ + --config-name base_100h \ + \ + +task.store_labels=true \ + task.labels='["spm"]' \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.add_decoder=true \ + +task.max_keep_size=4900 \ + \ + +model.reuse_text_emb=true \ + model._name="stbert_st" \ + model.w2v_path=${w2v_path} \ + model.add_decoder=true \ + \ + criterion._name="label_smoothed_cross_entropy" \ + +criterion.label_smoothing=0.2 \ + +criterion.report_accuracy=true \ + \ + lr_scheduler._name="polynomial_decay" \ + +lr_scheduler.warmup_updates=20000 \ + \ + optimization.lr=[0.0002] \ + optimization.max_update=100000 \ + checkpoint.best_checkpoint_metric="accuracy" \ + checkpoint.maximize_best_checkpoint_metric=true \ + checkpoint.save_interval=1 \ + \ + dataset.train_subset="train" \ + dataset.valid_subset="valid" \ + dataset.max_tokens=$max_tokens \ + optimization.update_freq=[${update_freq}] \ + \ + distributed_training.distributed_world_size=${world_size} \ + distributed_training.distributed_port=-1 \ + \ + common.log_interval=100 \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} + + + +sleep 20s + + # \ + # lr_scheduler._name="polynomial_decay" \ + # +lr_scheduler.warmup_updates=5000 \ + + +# /mnt/default/v-ziqzhang/data/stbert-ed/exp/ST_enes/sc2t_base_ende_32gpu_1accum/checkpoint_204_400000.pt diff --git a/Speech2S/speech2s/stpretrain_scripts/inference_ed.sh b/Speech2S/speech2s/stpretrain_scripts/inference_ed.sh new file mode 100644 index 0000000..3fd9ef1 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/inference_ed.sh @@ -0,0 +1,38 @@ +##################################### +# Hubert base model # +##################################### +[ $# -lt 1 ] && echo "Usage: $0 " && exit 0 + +model_path=$1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +#beam_size=$2 +gen_set=$2 +#lang=$4 +[ -z $gen_set ] && gen_set="test_et" +[ -z $beam_size ] && beam_size=2 +[ -z $lang ] && lang="fr" + + +#DATA_DIR=/mnt/output/users/v-kunwei/data/s2s_data/fin_enes +DATA_DIR=/home/v-kunwei +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku + +for subset in $gen_set; do + results_path=$src_dir/decode_${cpt}_beam${beam_size}/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $FAIRSEQ_ROOT/fairseq_cli/generate.py \ + $DATA_DIR --label-dir ${DATA_DIR} \ + --labels '["spm"]' --gen-subset ${subset} \ + --max-tokens 9000000 --task hubert_pretraining \ + --add-decoder --fine-tuning --random-crop \ + --path ${model_path} --results-path /home/v-kunwei --scoring sacrebleu \ + --max-len-a 0 --max-len-b 900 \ + --beam 10 --single-target + + tail -n 1 /home/v-kunwei/generate-*.txt + sleep 1s +done diff --git a/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k.sh b/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k.sh new file mode 100644 index 0000000..34d1594 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k.sh @@ -0,0 +1,70 @@ +##################################### +# Hubert mt model # +##################################### +[ $# -gt 3 ] && echo "Usage: $0 " && exit 0 +world_size=$1 +update_freq=$2 +w2v_path=$3 +Mount="" + +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=1 +[ -z $w2v_path ] && w2v_path="/mnt/output/users/v-kunwei/data/s2s_data/model_wo_emb_32_1004.pt" + + +langs="ltr,kmu" +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +CONFIG_ROOT=/mnt/output/users/v-kunwei/code/stpretrain_scripts/config/translation +DATA_DIR=/mnt/output/users/v-kunwei/data/s2s_data/en_asr_data/ + +### set save-dir +MODEL_DIR="/mnt/output/users/v-kunwei/data/s2s_data/exp/text2unicode_en" +exp_name="base_pt400k_releaseiter2_${world_size}gpu_${update_freq}accum_lr1e-4_alll" +MODEL_DIR=$MODEL_DIR/$exp_name +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + + +python $FAIRSEQ_ROOT/fairseq_cli/hydra_train.py \ + --config-dir $CONFIG_ROOT \ + --config-name text2code \ + +task.data=$DATA_DIR \ + dataset.dataset_impl="raw" \ + +task.source_lang="ltr" +task.target_lang="kmu" \ + +task.normalize=false \ + \ + +criterion.label_smoothing=0.1 \ + +criterion.report_accuracy=true \ + optimizer.weight_decay=0.00001 \ + +lr_scheduler.lr="[0.0001]" \ + optimization.max_update=500000 \ + \ + +model.dropout=0.1 \ + +model.attention_dropout=0.1 \ + model.activation_dropout=0.1 \ + model.decoder_layerdrop=0 \ + model.layerdrop=0 \ + model.w2v_path=$w2v_path \ + +model.text_transformer_encoder_layers=6 \ + \ + dataset.train_subset="en_train" \ + dataset.valid_subset="en_dev" \ + optimization.update_freq=[${update_freq}] \ + optimization.clip_norm=5 \ + \ + common.seed=222 \ + common.log_interval=100 \ + common.log_format="json" \ + \ + distributed_training.distributed_world_size=${world_size} \ + distributed_training.nprocs_per_node=8 \ + distributed_training.ddp_backend="legacy_ddp" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} \ + +sleep 10s + # sleep infinity + + diff --git a/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es.sh b/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es.sh new file mode 100644 index 0000000..1caf2f9 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es.sh @@ -0,0 +1,70 @@ +##################################### +# Hubert mt model # +##################################### +[ $# -gt 3 ] && echo "Usage: $0 " && exit 0 +world_size=$1 +update_freq=$2 +w2v_path=$3 +Mount="" + +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=1 +[ -z $w2v_path ] && w2v_path="/mnt/output/users/v-kunwei/data/s2s_data/model_es_emb_90_1004.pt" + + +langs="ltr,kmu" +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +CONFIG_ROOT=/mnt/output/users/v-kunwei/code/stpretrain_scripts/config/translation +DATA_DIR=/mnt/output/users/v-kunwei/data/s2s_data/es_no_data/ + +### set save-dir +MODEL_DIR="/mnt/output/users/v-kunwei/data/s2s_data/exp/text2unicode_es" +exp_name="base_pt400k_releaseiter2_${world_size}gpu_${update_freq}accum_lr1e-4_no" +MODEL_DIR=$MODEL_DIR/$exp_name +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + + +python $FAIRSEQ_ROOT/fairseq_cli/hydra_train.py \ + --config-dir $CONFIG_ROOT \ + --config-name text2code \ + +task.data=$DATA_DIR \ + dataset.dataset_impl="raw" \ + +task.source_lang="ltr" +task.target_lang="kmu" \ + +task.normalize=false \ + \ + +criterion.label_smoothing=0.1 \ + +criterion.report_accuracy=true \ + optimizer.weight_decay=0.00001 \ + +lr_scheduler.lr="[0.0001]" \ + optimization.max_update=500000 \ + \ + +model.dropout=0.1 \ + +model.attention_dropout=0.1 \ + model.activation_dropout=0.1 \ + model.decoder_layerdrop=0 \ + model.layerdrop=0 \ + model.w2v_path=$w2v_path \ + +model.text_transformer_encoder_layers=6 \ + \ + dataset.train_subset="es_train" \ + dataset.valid_subset="es_dev" \ + optimization.update_freq=[${update_freq}] \ + optimization.clip_norm=5 \ + \ + common.seed=222 \ + common.log_interval=100 \ + common.log_format="json" \ + \ + distributed_training.distributed_world_size=${world_size} \ + distributed_training.nprocs_per_node=8 \ + distributed_training.ddp_backend="legacy_ddp" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} \ + +sleep 10s + # sleep infinity + + diff --git a/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es2.sh b/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es2.sh new file mode 100644 index 0000000..910a6f3 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/train_text2code/base_ReleaseIter2_text2unicode_from400k_es2.sh @@ -0,0 +1,70 @@ +##################################### +# Hubert mt model # +##################################### +[ $# -gt 3 ] && echo "Usage: $0 " && exit 0 +world_size=$1 +update_freq=$2 +w2v_path=$3 +Mount="" + +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=1 +[ -z $w2v_path ] && w2v_path="/mnt/output/users/v-kunwei/data/s2s_data/model_es_emb_81_1004.pt" + + +langs="ltr,kmu" +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +CONFIG_ROOT=/mnt/output/users/v-kunwei/code/stpretrain_scripts/config/translation +DATA_DIR=/mnt/output/users/v-kunwei/data/s2s_data/es_asrl_data/ + +### set save-dir +MODEL_DIR="/mnt/output/users/v-kunwei/data/s2s_data/exp/text2unicode_es" +exp_name="base_pt400k_releaseiter2_${world_size}gpu_${update_freq}accum_lr1e-4_ll" +MODEL_DIR=$MODEL_DIR/$exp_name +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + + +python $FAIRSEQ_ROOT/fairseq_cli/hydra_train.py \ + --config-dir $CONFIG_ROOT \ + --config-name text2code \ + +task.data=$DATA_DIR \ + dataset.dataset_impl="raw" \ + +task.source_lang="ltr" +task.target_lang="kmu" \ + +task.normalize=false \ + \ + +criterion.label_smoothing=0.1 \ + +criterion.report_accuracy=true \ + optimizer.weight_decay=0.00001 \ + +lr_scheduler.lr="[0.0001]" \ + optimization.max_update=500000 \ + \ + +model.dropout=0.1 \ + +model.attention_dropout=0.1 \ + model.activation_dropout=0.1 \ + model.decoder_layerdrop=0 \ + model.layerdrop=0 \ + model.w2v_path=$w2v_path \ + +model.text_transformer_encoder_layers=6 \ + \ + dataset.train_subset="es_train" \ + dataset.valid_subset="es_dev" \ + optimization.update_freq=[${update_freq}] \ + optimization.clip_norm=5 \ + \ + common.seed=222 \ + common.log_interval=100 \ + common.log_format="json" \ + \ + distributed_training.distributed_world_size=${world_size} \ + distributed_training.nprocs_per_node=8 \ + distributed_training.ddp_backend="legacy_ddp" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} \ + +sleep 10s + # sleep infinity + + diff --git a/Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code.sh b/Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code.sh new file mode 100644 index 0000000..866146d --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code.sh @@ -0,0 +1,51 @@ + +##################################### +# Hubert ED model # +##################################### +[ $# -lt 1 ] && echo "Usage: $0 " && exit 0 +#source /mnt/default/v-ziqzhang/.bashrc_sing + +model_path=$1 +gen_set=$2 +tgt=$3 +src="ltr" +max_tokens=$4 +word_size=$5 +rank=$6 +outdir=$7 + +[ -z $tgt ] && tgt="kmu" +[ -z $gen_set ] && gen_set="dev_clean" +[ -z $word_size ] && word_size=1 +[ -z $rank ] && rank=0 +[ -z $max_tokens ] && max_tokens=2000 + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlst +DATA_DIR=${gen_set%/*} +gen_set=${gen_set##*/} +[ $gen_set == "test" ] && DATA_DIR=/mnt/output/users/v-kunwei/data/s2s_data/en_asr_data +[ -z $outdir ] && outdir=$DATA_DIR + + +results_path=$outdir/pseudo_${gen_set}_${rank} +[ ! -d $results_path ] && mkdir -p $results_path + +for subset in $gen_set; do + python $FAIRSEQ_ROOT/fairseq_cli/generate_mt_label.py $DATA_DIR \ + --path ${model_path} \ + --task "translation_from_jst" \ + --max-target-positions 3000 \ + --gen-subset $subset \ + -t $tgt -s "ltr" \ + --max-tokens ${max_tokens} \ + --dataset-impl "raw" \ + --max-len-a 2 --max-len-b 100 \ + --results-path $results_path \ + --skip-invalid-size-inputs-valid-test \ + --distributed-world-size $word_size --distributed-rank $rank \ + + echo "$model" > $results_path/model.record + sleep 1s +done | tee $results_path/decode.log + +sleep 2s diff --git a/Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code_beam2.sh b/Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code_beam2.sh new file mode 100644 index 0000000..9cad721 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/train_text2code/decode_text2code_beam2.sh @@ -0,0 +1,52 @@ + +##################################### +# Hubert ED model # +##################################### +[ $# -lt 1 ] && echo "Usage: $0 " && exit 0 +#source /mnt/default/v-ziqzhang/.bashrc_sing + +model_path=$1 +gen_set=$2 +tgt=$3 +src="ltr" +max_tokens=$4 +word_size=$5 +rank=$6 +outdir=$7 + +[ -z $tgt ] && tgt="kmu" +[ -z $gen_set ] && gen_set="dev_clean" +[ -z $word_size ] && word_size=1 +[ -z $rank ] && rank=0 +[ -z $max_tokens ] && max_tokens=2000 + +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlstku +DATA_DIR=${gen_set%/*} +gen_set=${gen_set##*/} +[ $gen_set == "test" ] && DATA_DIR=/mnt/output/users/v-kunwei/code/fairseq_mlstku +[ -z $outdir ] && outdir=$DATA_DIR + + +results_path=$outdir/pseudo_${gen_set}_${rank} +[ ! -d $results_path ] && mkdir -p $results_path + +for subset in $gen_set; do + python $FAIRSEQ_ROOT/fairseq_cli/generate_mt_label.py $DATA_DIR \ + --path ${model_path} \ + --task "translation_from_jst" \ + --max-target-positions 3000 \ + --gen-subset $subset \ + -t $tgt -s "ltr" \ + --dataset-impl "raw" \ + --max-tokens ${max_tokens} \ + --beam 2 \ + --max-len-a 2 --max-len-b 100 \ + --results-path $results_path \ + --skip-invalid-size-inputs-valid-test \ + --distributed-world-size $word_size --distributed-rank $rank \ + + echo "$model" > $results_path/model.record + sleep 1s +done | tee $results_path/decode.log + +sleep 2s diff --git a/Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_bleu.sh b/Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_bleu.sh new file mode 100644 index 0000000..240d487 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_bleu.sh @@ -0,0 +1,52 @@ + +##################################### +# Hubert ED model # +##################################### +[ $# -lt 1 ] && echo "Usage: $0 " && exit 0 + +model_path=$1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +gen_set=$2 +tgt=$3 +outdir=$4 +src="ltr" +[ -z $tgt ] && tgt="kmu" +[ -z $gen_set ] && gen_set="es_dev" +[ -z $outdir ] && outdir=$src_dir/decode_${cpt} + +DATA_DIR=/mnt/output/users/v-kunwei/data/s2s_data/es_asr_data/ +# DATA_DIR=/mnt/default/v-ziqzhang/data/stbert/data/librispeech/speech2c_joint_splitenc_400k/ltr-$tgt +# DATA_DIR=/mnt/default/v-ziqzhang/data/stbert/data/librispeech/speech2c_400k/ltr-$tgt +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlst + +langs="ltr,$tgt" + +for subset in $gen_set; do + results_path=$outdir/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $FAIRSEQ_ROOT/fairseq_cli/generate.py $DATA_DIR \ + --path ${model_path} \ + --task "translation_from_jst" \ + --max-target-positions 3000 \ + --gen-subset $subset \ + -t $tgt -s "ltr" --dataset-impl "raw" \ + --batch-size 16 \ + --max-len-a 2 --max-len-b 400 \ + --results-path $results_path \ + --scoring sacrebleu $extra + + echo $results_path + tail -n 1 $results_path/generate-*.txt + sleep 1s +done + +# --distributed-world-size 1000 --distributed-rank 0 \ + +sleep 2s + +# cat generate-newstest2020_enja.txt | grep "^D-" | cut -d'-' -f 2- | sort -n -k1 | cut -f3 > decode-newstest2020_enja.txt +# sacrebleu -t wmt20 -l en-ja -i decode-newstest2020_enja.txt --tokenize char diff --git a/Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_wer.sh b/Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_wer.sh new file mode 100644 index 0000000..8fa9670 --- /dev/null +++ b/Speech2S/speech2s/stpretrain_scripts/train_text2code/inference_code_wer.sh @@ -0,0 +1,53 @@ + +##################################### +# Hubert ED model # +##################################### +[ $# -lt 1 ] && echo "Usage: $0 " && exit 0 + +model_path=$1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +gen_set=$2 +tgt=$3 +outdir=$4 +src="ltr" +[ -z $tgt ] && tgt="kmu" +[ -z $gen_set ] && gen_set="en_dev" +[ -z $outdir ] && outdir=$src_dir/decode_${cpt} + +# DATA_DIR=/mnt/default/v-ziqzhang/data/stbert/data/librispeech/hubert_release_iter2_layer9_kmeans/ltr-$tgt +# DATA_DIR=/mnt/default/v-ziqzhang/data/stbert/data/librispeech/speech2c_joint_splitenc_400k/ltr-$tgt +#DATA_DIR=/mnt/default/v-ziqzhang/data/stbert/data/librispeech/speech2c_400k/ltr-$tgt +DATA_DIR=/mnt/output/users/v-kunwei/data/s2s_data/es_asr_data/ +FAIRSEQ_ROOT=/mnt/output/users/v-kunwei/code/fairseq_mlst + +langs="ltr,$tgt" + +for subset in $gen_set; do + results_path=$outdir/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $FAIRSEQ_ROOT/fairseq_cli/generate.py $DATA_DIR \ + --path ${model_path} \ + --task "translation_from_jst" \ + --max-target-positions 3000 \ + --gen-subset $subset \ + -t $tgt -s "ltr" --dataset-impl "raw" \ + --batch-size 16 \ + --max-len-a 2 --max-len-b 400 \ + --results-path $results_path \ + --scoring wer + + echo $results_path + tail -n 1 $results_path/generate-*.txt + sleep 1s +done + +# --distributed-world-size 1000 --distributed-rank 0 \ + +sleep 2s + +# cat generate-newstest2020_enja.txt | grep "^D-" | cut -d'-' -f 2- | sort -n -k1 | cut -f3 > decode-newstest2020_enja.txt +# sacrebleu -t wmt20 -l en-ja -i decode-newstest2020_enja.txt --tokenize char diff --git a/Speech2S/speech2s/tasks/joint_sc2t_pretrain.py b/Speech2S/speech2s/tasks/joint_sc2t_pretrain.py new file mode 100644 index 0000000..db6e4e6 --- /dev/null +++ b/Speech2S/speech2s/tasks/joint_sc2t_pretrain.py @@ -0,0 +1,1004 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import os +import sys +from typing import Dict, List, Optional, Tuple +from pathlib import Path + +import numpy as np +from argparse import Namespace +from collections import OrderedDict + +import torch +from dataclasses import dataclass, field +from fairseq.data import ( + Dictionary, + encoders, + data_utils, + StripTokenDataset, + PrependTokenDataset, + AppendTokenDataset, + DenoisingDataset, + ConcatDataset, + FairseqDataset, + iterators, + ResamplingDataset, + MaskTokensDataset, + LanguagePairDataset, +) +from fairseq.data.audio.speech_to_text_joint_dataset import S2TJointDataConfig +from fairseq.data.shorten_dataset import maybe_shorten_dataset +# from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq.dataclass.configs import FairseqDataclass +from fairseq.tasks import register_task +from fairseq.tasks.fairseq_task import FairseqTask +from fairseq.dataclass.constants import ChoiceEnum +from omegaconf import MISSING + +from speechut.data.multimodal_corpus_dataset import MultiCorpusDataset +from speechut.data.load_langpair_dataset import load_langpair_dataset +from speechut.data.language_trible_dataset import LanguageTripleDataset, load_langtriple_dataset +from speechut.data.hubert_dataset import HubertDataset + +logger = logging.getLogger(__name__) + +TOKENIZER_CHOICES = ChoiceEnum(["sentencepiece", "hubert_letters", "none"]) + +def _lang_token(lang: str): + return "".format(lang) + +def _lang_token_index(dic: Dictionary, lang: str): + """Return language token index.""" + idx = dic.index(_lang_token(lang)) + assert idx != dic.unk_index, "cannot find language token for lang {}".format(lang) + return idx + + +class LabelEncoder(object): + def __init__(self, dictionary: Dictionary) -> None: + self.dictionary = dictionary + + def __call__(self, label: str) -> List[str]: + return self.dictionary.encode_line( + label, append_eos=False, add_if_not_exist=False, + ) + + +### wrap the initial get_whole_word_mask which needs bpe_tokenizer, +### here we just assume words are splited by "|" or "" +def get_whole_word_mask(args, dictionary): + def is_beginning_of_word(i): + if i < dictionary.nspecial: + # special elements are always considered beginnings + return True + tok = dictionary[i] + if tok.startswith("madeupword"): + return True + elif tok in ["", "", "", "", "|", ""]: + return True + else: + return False + + mask_whole_words = torch.ByteTensor( + list(map(is_beginning_of_word, range(len(dictionary)))) + ) + return mask_whole_words + +def get_repeative_start(tokens): + """ + tokens: torch.Tensor with repeative tokens + """ + length = len(tokens) + rep_start_id = tokens[:-1] != tokens[1:] + return torch.cat([torch.tensor([True]), rep_start_id]) + +@dataclass +class TextPretrainingConfig(FairseqDataclass): + ### added for joint pretraining + text_data: Optional[str] = field( + default=None, + metadata={ + "help": "if set, path to text data directory", + }, + ) + seed: Optional[int] = field( + default=1, + metadata={ + "help": "for ordered_indices in MulticorpusDataset", + }, + ) + tokens_per_sample: Optional[int] = field( + default=512, + metadata={ + "help": "max number of total tokens over all segments per sample for dataset", + }, + ) + tokens_per_sample_tgt: Optional[int] = field( + default=512, + metadata={ + "help": "max number of total tokens over all segments per target sample for dataset", + }, + ) + sample_break_mode: Optional[str] = field( + default="eos", + metadata={ + "help": "mode for breaking sentence", + }, + ) + mask: Optional[float] = field( + default=0.3, + metadata={ + "help": "fraction of words/subwords that will be masked", + }, + ) + leave_unmasked_prob: float = field( + default=0.1, + metadata={"help": "probability that a masked token is unmasked"}, + ) + mask_random: Optional[float] = field( + default=0.1, + metadata={ + "help": "instead of using [MASK], use random token this often", + }, + ) + freq_weighted_replacement: bool = field( + default=False, + metadata={"help": "sample random replacement words based on word frequencies"}, + ) + mask_whole_words: bool = field( + default=True, + metadata={"help": "mask whole words; you may also want to set --bpe"}, + ) + mask_repeative_tokens: bool = field( + default=True, + metadata={"help": "mask repeative_tokens; if mask_whole_words=False"}, + ) + mask_multiple_length: int = field( + default=1, + metadata={"help": "repeat the mask indices multiple times"}, + ) + mask_stdev: float = field( + default=0.0, + metadata={"help": "stdev of the mask length"}, + ) + shorten_method: Optional[str] = field( + default="none", + metadata={ + "help": "if not none, shorten sequences that exceed tokens_per_sample", + "choices": "none/truncate/random_crop" + }, + ) + shorten_data_split_list: Optional[str] = field( + default="", + metadata={ + "help": "comma_separated list of dataset splits to apply shortening to, e.g., train,valid (default: all dataset splits)", + }, + ) + + ### below hypra-parameters is used in bart + insert: Optional[float] = field( + default=0.0, + metadata={ + "help": "insert this percentage of additional random tokens", + }, + ) + permute: Optional[float] = field( + default=0.0, + metadata={ + "help": "take this proportion of subwords and permute them", + }, + ) + rotate: Optional[float] = field( + default=0.0, + metadata={ + "help": "rotate this proportion of inputs", + }, + ) + poisson_lambda: Optional[float] = field( + default=3.5, + metadata={ + "help": "randomly shuffle sentences for this proportion of inputs", + }, + ) + permute_sentences: Optional[float] = field( + default=0.0, + metadata={ + "help": "shuffle this proportion of sentences in all inputs", + }, + ) + mask_length: Optional[str] = field( + default="span-poisson", + metadata={ + "help": "mask length to choose", + "choice": "subword/word/span-poisson" + }, + ) + replace_length: Optional[int] = field( + default=1, + metadata={ + "help": "when masking N tokens, replace with 0, 1, or N tokens (use -1 for N)", + }, + ) + shuffle_instance: Optional[bool] = field( + default=False, + metadata={"help": "shuffle instance"}, + ) + max_source_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the source sequence"}, + ) + max_target_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the target sequence"}, + ) + bpe: Optional[str] = field( + default="", + metadata={ + "help": "will wrapped by the text_data_config yaml", + }, + ) + data_config: Optional[str] = field( + default=None, + metadata={ + "help": "a config yaml specify the bpe model of text data", + }, + ) + text_maxtokens_ratio: Optional[float] = field( + default=1.0, + metadata={ + "help": "for text, max_tokens = max_tokens * text_maxtokens_ratio / 320 ", + }, + ) + prepend_tgt_lang_tag: bool = field( + default=False, + metadata={"help": "prepend tgt_lang_tag to replace "}, + ) + mask_text_ratio: Optional[float] = field( + default=0.0, + metadata={ + "help": "mask_text_ratio, for paired data", + }, + ) + truncate_mono_source: bool = field( + default=True, + metadata={"help": "truncate mono source-side examples that exceed max-positions"}, + ) + + +@dataclass +class JointPretrainingConfig(FairseqDataclass): + data: str = field( + default=MISSING, metadata={"help": "path to speech data directory"} + ) + fine_tuning: bool = field( + default=False, metadata={"help": "set to true if fine-tuning Hubert"} + ) + labels: List[str] = field( + default_factory=lambda: ["ltr"], + metadata={ + "help": ( + "extension of the label files to load, frame-level labels for" + " pre-training, and sequence-level label for fine-tuning" + ) + }, + ) + label_dir: Optional[str] = field( + default=None, + metadata={ + "help": "if set, looks for labels in this directory instead", + }, + ) + label_rate: int = field( + default=-1, + metadata={"help": "label frame rate. -1 for sequence label"}, + ) + sample_rate: int = field( + default=16_000, + metadata={ + "help": "target sample rate. audio files will be up/down " + "sampled to this rate" + }, + ) + normalize: bool = field( + default=False, + metadata={ + "help": "if set, normalizes input to have 0 mean and unit variance" + }, + ) + enable_padding: bool = field( + default=False, + metadata={"help": "pad shorter samples instead of cropping"}, + ) + max_keep_size: Optional[int] = field( + default=None, + metadata={"help": "exclude sample longer than this"}, + ) + max_sample_size: Optional[int] = field( + default=None, + metadata={"help": "max sample size to crop to for batching"}, + ) + min_sample_size: Optional[int] = field( + default=None, + metadata={"help": "min sample size to crop to for batching"}, + ) + single_target: Optional[bool] = field( + default=False, + metadata={ + "help": "if set, AddTargetDatasets outputs same keys " + "as AddTargetDataset" + }, + ) + random_crop: Optional[bool] = field( + default=True, + metadata={"help": "always crop from the beginning if false"}, + ) + pad_audio: Optional[bool] = field( + default=False, + metadata={"help": "pad audio to the longest one in the batch if true"}, + ) + store_labels: Optional[bool] = field( + default=True, + metadata={"help": "store spm labels in memory, should be true when fine-tune with bpe"}, + ) + add_decoder_target: bool = field( + default=False, + metadata={"help": "contral the model architecture, if set True, load reduced unit as target"}, + ) + split_modality_batch: bool = field( + default=False, + metadata={"help": "whether create all samples of different modalities in a batch"}, + ) + speech_tgt_lang: str = field( + default="", + metadata={"help": "prepend to prev_output_tokens to replace , only used for decoder"}, + ) + speech_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based speech resampling." + "(alpha = 1 for no resampling)" + }, + ) + text_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based text resampling." + "(alpha = 1 for no resampling)" + }, + ) + hubert_tokenizer: Optional[TOKENIZER_CHOICES] = field( + default="none", + metadata={"help": "which tokenizer for processing text"}, + ) + sp_path: Optional[str] = field( + default=None, + metadata={"help": "sentencepiece model path if using bpe tokenizer"}, + ) + text_cfg: TextPretrainingConfig = TextPretrainingConfig() + # For inference + ctc_weight: float = field( + default=0.0, + metadata={"help": "ctc weight during inference"}, + ) + lm_dict: Optional[str] = field( + default="dict.txt", + metadata={"help": "dict used for decoding with language model, should be in cfg.data/"}, + ) + +@register_task("joint_sc2t_pretraining", dataclass=JointPretrainingConfig) +class Jsc2tPretrainingTask(FairseqTask): + + cfg: JointPretrainingConfig + + def __init__( + self, + cfg: JointPretrainingConfig, + load_local_states: True, + ) -> None: + super().__init__(cfg) + + logger.info(f"current directory is {os.getcwd()}") + logger.info(f"JSTPretrainingTask Config {cfg}") + + self.cfg = cfg + self.fine_tuning = cfg.fine_tuning + self.blank_symbol = "" + + if load_local_states: + self.state.add_factory("hubert_tokenizer", self.build_tokenizer) + if self.cfg.text_cfg.text_data is not None and os.path.exists(self.cfg.text_cfg.text_data): + self.state.add_factory("text_dictionary", self.load_text_dictionary) + self.state.add_factory("text_src_dictionary", self.load_text_src_dictionary) + if cfg.fine_tuning: + self.state.add_factory("target_dictionary", self.load_dictionaries) + else: + self.state.add_factory("dictionaries", self.load_dictionaries) + + if cfg.text_cfg.data_config is not None: + self.text_data_cfg = S2TJointDataConfig(Path(f"{cfg.text_cfg.text_data}/{cfg.text_cfg.data_config}")) + self.cfg.text_cfg.bpe = self.text_data_cfg.bpe_tokenizer["bpe"] + else: + self.text_data_cfg = None + + @property + def source_dictionary(self) -> Optional[Dictionary]: + return None + + @property + def target_dictionary(self) -> Optional[Dictionary]: + return self.state.target_dictionary + + @property + def dictionaries(self) -> List[Dictionary]: + return self.state.dictionaries + + @property + def text_dictionary(self) -> Optional[Dictionary]: + return self.state.text_dictionary + + @property + def text_src_dictionary(self) -> Optional[Dictionary]: + return self.state.text_src_dictionary + + @property + def hubert_tokenizer(self): + return self.state.hubert_tokenizer + + def load_dictionaries(self): + label_dir = self.cfg.data if self.cfg.label_dir is None else self.cfg.label_dir + dictionaries = [Dictionary.load(f"{label_dir}/dict.{label}.txt") for label in self.cfg.labels] + if not self.cfg.fine_tuning: + for dictionary in dictionaries: + dictionary.add_symbol("") + return dictionaries[0] if self.cfg.fine_tuning else dictionaries + + def load_text_dictionary(self): + tgt_dict_path = f"{self.cfg.text_cfg.text_data}/{self.text_data_cfg.vocab_filename if self.text_data_cfg is not None else 'dict.txt'}" + if not os.path.isfile(tgt_dict_path): + raise FileNotFoundError(f"Dict not found: {tgt_dict_path}") + text_dictionary = Dictionary.load(tgt_dict_path) + self.mask_idx = text_dictionary.add_symbol("") + return text_dictionary + + def load_text_src_dictionary(self): + src_dict_path = f"{self.cfg.text_cfg.text_data}/{self.text_data_cfg.src_vocab_filename if self.text_data_cfg is not None else 'dict.txt'}" + if not os.path.isfile(src_dict_path): + raise FileNotFoundError(f"Dict not found: {src_dict_path}") + src_text_dictionary = Dictionary.load(src_dict_path) + self.mask_idx = src_text_dictionary.add_symbol("") + return src_text_dictionary + + @classmethod + def setup_task( + cls, cfg: JointPretrainingConfig, **kwargs + ) -> "Jsc2tPretrainingTask": + load_local_states = kwargs.get("load_local_states", True) + return cls(cfg, load_local_states) + + def get_label_dir(self) -> str: + if self.cfg.label_dir is None: + return self.cfg.data + return self.cfg.label_dir + + def load_paired_dataset(self, text_split, truncate_source=False): + text_split, lp = text_split.rsplit('.', 1) # e.g. "libritext.ltr-ltr" + if len(lp.split("-")) == 2: + src, tgt = lp.split("-") + if src == tgt: + logger.warn(f"| trying to load monolingual dataset {text_split}.{lp}, please check your task is right.") + paired_dataset = self.load_char_bart_dataset(f"{text_split}.{lp}.{tgt}") + return paired_dataset + paired_dataset = load_langpair_dataset( + self.cfg.text_cfg.text_data, + text_split, + src, + self.text_src_dictionary, + tgt, + self.text_dictionary, + combine=True, + dataset_impl=None, + upsample_primary=1, + left_pad_source=False, + left_pad_target=False, + max_source_positions=self.cfg.text_cfg.tokens_per_sample, + max_target_positions=self.cfg.text_cfg.tokens_per_sample, + truncate_source=truncate_source, + prepend_bos=False, + load_alignments=False, + append_source_id=True if self.cfg.text_cfg.prepend_tgt_lang_tag else False, + lang_format="" if self.cfg.text_cfg.prepend_tgt_lang_tag else "[{}]", + input_feeding=self.cfg.add_decoder_target, + ) + if self.cfg.text_cfg.mask_text_ratio > 0: + # add mask + self.mask_idx = self.text_src_dictionary.index("") + mask_whole_words = None + if self.cfg.text_cfg.mask_whole_words: + mask_whole_words = get_whole_word_mask(self.cfg.text_cfg, self.text_src_dictionary) + elif self.cfg.text_cfg.mask_repeative_tokens: + mask_whole_words = get_repeative_start + + src_dataset, src_unmasked_dataset = MaskTokensDataset.apply_mask( + paired_dataset.src, + self.text_src_dictionary, + pad_idx=self.text_src_dictionary.pad(), + mask_idx=self.mask_idx, + seed=self.cfg.text_cfg.seed, + mask_prob=self.cfg.text_cfg.mask_text_ratio, + leave_unmasked_prob=self.cfg.text_cfg.leave_unmasked_prob, + random_token_prob=self.cfg.text_cfg.mask_random, + freq_weighted_replacement=self.cfg.text_cfg.freq_weighted_replacement, + mask_whole_words=mask_whole_words, + mask_multiple_length=self.cfg.text_cfg.mask_multiple_length, + mask_stdev=self.cfg.text_cfg.mask_stdev, + ) + tgt_dataset = paired_dataset.tgt if paired_dataset.tgt is not None else src_unmasked_dataset + paired_dataset = LanguageTripleDataset( + src_dataset, + src_dataset.sizes, + self.text_src_dictionary, + src_unmasked_dataset, + src_unmasked_dataset.sizes, + self.text_src_dictionary, + tgt_dataset, + tgt_dataset.sizes, + self.text_dictionary, + left_pad_source=False, + left_pad_target=False, + align_dataset=None, + eos=None, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + ) + else: + src, ref, tgt = lp.split("-") + paired_dataset = load_langtriple_dataset( + self.cfg.text_cfg.text_data, + text_split, + src, + self.text_src_dictionary, + ref, + self.dictionaries[-1], + tgt, + self.text_dictionary, + combine=True, + dataset_impl=None, + upsample_primary=1, + left_pad_source=False, + left_pad_target=False, + max_source_positions=self.cfg.text_cfg.tokens_per_sample, + max_target_positions=self.cfg.text_cfg.tokens_per_sample, + truncate_source=truncate_source, + prepend_bos=False, + load_alignments=False, + append_source_id=True if self.cfg.text_cfg.prepend_tgt_lang_tag else False, + lang_format="" if self.cfg.text_cfg.prepend_tgt_lang_tag else "[{}]", + ) + return paired_dataset + + def load_dataset(self, split: str, epoch=1, **kwargs) -> None: + """ + Create Wav dataset for audio, and Index dataset for phonemized text, + then concatenate them to by fairseq.data.multi_corpus_dataset.MultiCorpusDataset. + """ + speech_splits = split.split('+')[0].split(',') + ### 1st, create a speech dataset using STSpeechDataset (modified from HubertDataset) + dicts = [self.target_dictionary] if self.cfg.fine_tuning else self.dictionaries + pad_list = [dict.pad() for dict in dicts] + eos_list = [dict.eos() for dict in dicts] + procs = [LabelEncoder(dict) for dict in dicts] + if self.cfg.speech_tgt_lang != "": + tgt_lang_idx = _lang_token_index(dicts[0], self.cfg.speech_tgt_lang) + logger.info(f"Will prepend <{tgt_lang_idx}> at the beginning of prev_output_tokens to replace ") + else: + tgt_lang_idx = None + + + # hubert v1: pad_audio=True, random_crop=False; + speech_datasets = [] + for speech_split in speech_splits: + paths = [ + f"{self.get_label_dir()}/{speech_split}.{l}" for l in self.cfg.labels + ] + speech_datasets.append( + HubertDataset( + f"{self.cfg.data}/{speech_split}.tsv", + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=self.cfg.store_labels, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + tgt_dict=dicts[0], + add_decoder_target=self.cfg.add_decoder_target, + fine_tuning=self.cfg.fine_tuning, + tgt_lang_idx=tgt_lang_idx, + tokenizer=self.hubert_tokenizer, + ) + ) + if len(speech_datasets) > 1: + speech_dataset = ConcatDataset(speech_datasets) + else: + speech_dataset = speech_datasets[0] + + has_text = len(split.split('+')) > 1 + if not has_text: + assert speech_dataset is not None + self.datasets[split] = speech_dataset + return + + ### 2nd, create paired/mono text datasets using Langpairdataset + if split.split('+')[1] != '': + paired_splits = [paired_split for paired_split in split.split('+')[1].split(',') if paired_split != ''] + paired_datasets = [self.load_paired_dataset(paired_split) for paired_split in paired_splits] + else: + paired_splits, paired_datasets = [], [] + + if len(split.split('+')) > 2 and split.split('+')[2] != '': + mono_splits = [mono_split for mono_split in split.split('+')[2].split(',') if mono_split != ''] + mono_datasets = [self.load_paired_dataset(mono_split, truncate_source=self.cfg.text_cfg.truncate_mono_source) for mono_split in mono_splits] + else: + mono_splits, mono_datasets = [], [] + + assert len(mono_datasets + paired_datasets) > 0, f"split {split} has no text! you should check out for that" + + ### 3rd, if provided, create a supervised dataset with labeled data + if len(split.split('+')) > 3 and split.split('+')[3] != '': + assert len(paired_splits) > 0, f"supervised dataset can not be loaded without text paired dataset!" + tgt = paired_splits[0].rsplit('.', 1)[1].split("-")[1] + sup_split = split.split('+')[3] + + sup_dataset = HubertDataset( + f"{self.cfg.data}/{sup_split}.tsv", + sample_rate=self.cfg.sample_rate, + label_paths=[f"{self.get_label_dir()}/{sup_split}.{tgt}"], + label_rates=[-1], + pad_list=[self.text_dictionary.pad()], + eos_list=[self.text_dictionary.eos()], + label_processors=[LabelEncoder(self.text_dictionary)], + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=None, + max_sample_size=None, + pad_audio=True, + normalize=self.cfg.normalize, + store_labels=self.cfg.store_labels, + random_crop=False, + single_target=True, + tgt_dict=self.text_dictionary, + add_decoder_target=self.cfg.add_decoder_target, + fine_tuning=True, + tgt_lang_idx=None, + tokenizer=None, + ) + else: + sup_dataset = None + + ### 4th, compose a MultiCorpusDataset + dataset_dict, max_positions_dict, distributions, max_tokens_ratios = self.resample_multi_modality_dataset( + speech_dataset, sup_dataset, mono_datasets, paired_datasets, mono_splits, paired_splits, epoch=epoch, + ) + self.datasets[split] = MultiCorpusDataset( + dataset_dict, + max_positions=max_positions_dict, + distribution=distributions, + max_tokens_ratio=max_tokens_ratios, + seed=self.cfg.text_cfg.seed, + sort_indices=True, + ) + + + def max_positions(self) -> Tuple[int, int]: + return (sys.maxsize, sys.maxsize) + + def filter_indices_by_size( + self, indices: np.array, *args, **kwargs + ) -> np.array: + return indices + + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + skip_remainder_batch=False, + grouped_shuffling=False, + update_epoch_batch_itr=False, + ): + """ + Get an iterator that yields batches of data from the given dataset. + Args: + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_tokens (int, optional): max number of tokens in each batch + (default: None). + max_sentences (int, optional): max number of sentences in each + batch (default: None). + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + required_batch_size_multiple (int, optional): require batch size to + be a multiple of N (default: 1). + seed (int, optional): seed for random number generator for + reproducibility (default: 1). + num_shards (int, optional): shard the data iterator into N + shards (default: 1). + shard_id (int, optional): which shard of the data iterator to + return (default: 0). + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 1). + data_buffer_size (int, optional): number of batches to + preload (default: 0). + disable_iterator_cache (bool, optional): don't cache the + EpochBatchIterator (ignores `FairseqTask::can_reuse_epoch_itr`) + (default: False). + skip_remainder_batch (bool, optional): if set, discard the last + batch in each training epoch, as the last batch is often smaller than + local_batch_size * distributed_word_size (default: ``True``). + grouped_shuffling (bool, optional): group batches with each groups + containing num_shards batches and shuffle groups. Reduces difference + between sequence lengths among workers for batches sorted by length. + update_epoch_batch_itr (bool optional): if true then donot use the cached + batch iterator for the epoch + + Returns: + ~fairseq.iterators.EpochBatchIterator: a batched iterator over the + given dataset split + """ + if self.fine_tuning or not isinstance(dataset, MultiCorpusDataset): + return super().get_batch_iterator( + dataset, + max_tokens=max_tokens, + max_sentences=max_sentences, + max_positions=max_positions, + ignore_invalid_inputs=ignore_invalid_inputs, + required_batch_size_multiple=required_batch_size_multiple, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + data_buffer_size=data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + skip_remainder_batch=skip_remainder_batch, + grouped_shuffling=grouped_shuffling, + update_epoch_batch_itr=update_epoch_batch_itr, + ) + + can_reuse_epoch_itr = ( + not disable_iterator_cache + and not update_epoch_batch_itr + and self.can_reuse_epoch_itr(dataset) + ) + if can_reuse_epoch_itr and dataset in self.dataset_to_epoch_iter: + logger.debug("reusing EpochBatchIterator for epoch {}".format(epoch)) + return self.dataset_to_epoch_iter[dataset] + + assert isinstance(dataset, FairseqDataset) + + # initialize the dataset with the correct starting epoch + dataset.set_epoch(epoch) + + # get indices ordered by example size + with data_utils.numpy_seed(seed): + indices = dataset.ordered_indices() + + # filter examples that are too large + if max_positions is not None: + indices = self.filter_indices_by_size( + indices, dataset, max_positions, ignore_invalid_inputs + ) + + # create mini-batches with given size constraints + batch_sampler = dataset.get_batch_sampler( + indices, + num_shards, + seed, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + split_modality_batch=self.cfg.split_modality_batch, + ) + + # return a reusable, sharded iterator + epoch_iter = iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + skip_remainder_batch=skip_remainder_batch, + disable_shuffling=True, + grouped_shuffling=grouped_shuffling, + ) + + if can_reuse_epoch_itr: + self.dataset_to_epoch_iter[dataset] = epoch_iter + + return epoch_iter + + def build_generator( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + ): + """Build ED-CTC generator for finet-tuned ASR model""" + from speechut.squence_generator import SequenceGenerator + extra_gen_cls_kwargs = { + "ctc_weight": self.cfg.ctc_weight, + "lm_dict": Dictionary.load(os.path.join(self.cfg.data, self.cfg.lm_dict)), + **extra_gen_cls_kwargs + } + return super().build_generator( + models, args, seq_gen_cls=SequenceGenerator, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + @classmethod + def _get_size_ratios(cls, ids: List[str], sizes: List[int], alpha: float = 1.0): + """Size ratios for temperature-based sampling + (https://arxiv.org/abs/1907.05019)""" + _sizes = np.array(sizes) + prob = _sizes / _sizes.sum() + smoothed_prob = prob ** alpha + smoothed_prob = smoothed_prob / smoothed_prob.sum() + size_ratio = (smoothed_prob * _sizes.sum()) / _sizes + + o_str = str({_i: f"{prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"original sampling probability: {o_str}") + p_str = str({_i: f"{smoothed_prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"balanced sampling probability: {p_str}") + sr_str = str({_id: f"{size_ratio[i]:.3f}" for i, _id in enumerate(ids)}) + logger.info(f"balanced sampling size ratio: {sr_str}") + return size_ratio.tolist() + + def resample_multi_modality_dataset(self, speech_dataset, sup_dataset, mono_datasets, paired_datasets, mono_splits, paired_splits, epoch=1, train=True): + assert len(mono_datasets+paired_datasets) > 0, f"No text data loaded!" + + if len(mono_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + mono_splits, [len(s) for s in mono_datasets], alpha=self.cfg.text_sampling_alpha + ) + mono_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) for d, r in zip(mono_datasets, size_ratios) + ] + + if len(paired_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + paired_splits, [len(s) for s in paired_datasets], alpha=self.cfg.text_sampling_alpha + ) + paired_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) for d, r in zip(paired_datasets, size_ratios) + ] + + dataset_list = [speech_dataset, sup_dataset] + for datasets in [mono_datasets, paired_datasets]: + if len(datasets) > 1: + dataset_list.append(ConcatDataset(datasets)) + elif len(datasets) == 1: + dataset_list.append(datasets[0]) + else: + dataset_list.append(None) + + ### match speech/text datasets according to modality + dataset_dict = OrderedDict((name, d) for name, d in zip(["speech", "speech_sup", "text_mono", "text_paired"], dataset_list) if d is not None) + max_positions_dict = { + "speech": None, + "speech_sup": None, + "text_mono": (self.cfg.text_cfg.tokens_per_sample, self.cfg.text_cfg.tokens_per_sample), + "text_paired": (self.cfg.text_cfg.tokens_per_sample, self.cfg.text_cfg.tokens_per_sample), + } + max_positions_dict = OrderedDict((name, max_positions_dict[name]) for name in dataset_dict.keys()) + max_tokens_ratios_dict = { + "speech": 1.0, + "speech_sup": 1.0, + "text_mono": 1.0 / 320 / self.cfg.text_cfg.text_maxtokens_ratio, + "text_paired": 1.0 / 320 / self.cfg.text_cfg.text_maxtokens_ratio, + } + max_tokens_ratios = [max_tokens_ratios_dict[name] for name in dataset_dict.keys()] + dataset_lens = np.array([len(dataset) for dataset in dataset_dict.values()]) + dataset_avg_sample_lens = np.array([ + sum([dataset.num_tokens(i) for i in np.random.randint(low=0, high=len(dataset), size=10000)]) / 10000.0 + for dataset in dataset_dict.values() + ]) + + if not "speech" in dataset_dict: + distributions = [l / sum(dataset_lens) for l in dataset_lens] + else: + ## we just keep the batches of speech and non-speech the same, expand_coef is to ensure speech batches is less than others + first_ratio = dataset_lens[0] / sum(dataset_lens) + expand_coef = 1.2 if sup_dataset is None else 1.1 * sum(dataset_lens[0:2]) / dataset_lens[0] + distributions = [expand_coef * max_tokens_ratios[i] * dataset_avg_sample_lens[0] / l for (i, l) in enumerate(dataset_avg_sample_lens)] + distributions[0] = 1.0 + if sup_dataset is not None: + distributions[1] = dataset_lens[1] / dataset_lens[0] + distributions = [first_ratio * d for d in distributions] + + logging.info(f"Number samples of datasets is {dataset_lens}") + logging.info(f"Avg sample length of datasets is {dataset_avg_sample_lens}") + logging.info(f"Sampling distributions is {distributions}") + logging.info(f"Maxtokens ratio is {max_tokens_ratios}") + return dataset_dict, max_positions_dict, distributions, max_tokens_ratios + + def build_tokenizer(self, cfg=None): + logger.info(f"tokenizer: {self.cfg.hubert_tokenizer}") + if self.cfg.hubert_tokenizer != "none": + return encoders.build_bpe(Namespace(**{"bpe": self.cfg.hubert_tokenizer, "sentencepiece_model": self.cfg.sp_path})) + else: + return None + + def load_char_bart_dataset(self, split): + mono_dataset = data_utils.load_indexed_dataset( + f"{self.cfg.text_cfg.text_data}/{split}", + self.text_dictionary, + ) + mono_dataset = StripTokenDataset(mono_dataset, self.text_dictionary.eos()) + mono_dataset = maybe_shorten_dataset( + mono_dataset, + split, + self.cfg.text_cfg.shorten_data_split_list, + self.cfg.text_cfg.shorten_method, + self.cfg.text_cfg.tokens_per_sample - 2, + self.cfg.text_cfg.seed, + ) + logger.info("loaded {} samples from: {}".format(len(mono_dataset), mono_dataset)) + ### prepend bos and eos to dataset + mono_dataset = PrependTokenDataset(mono_dataset, self.text_dictionary.bos()) + mono_dataset = AppendTokenDataset(mono_dataset, self.text_dictionary.eos()) + mask_whole_words = ( + get_whole_word_mask(None, self.text_dictionary) + if self.cfg.text_cfg.mask_whole_words + else None + ) + lang=self.cfg.speech_tgt_lang + mono_dataset = DenoisingDataset( + mono_dataset, + mono_dataset.sizes, + self.text_dictionary, + self.mask_idx, + mask_whole_words, + shuffle=self.cfg.text_cfg.shuffle_instance, + seed=self.cfg.text_cfg.seed, + args=self.cfg.text_cfg, + tgt_lang_idx=_lang_token_index(self.text_dictionary, lang) if self.cfg.text_cfg.prepend_tgt_lang_tag else None, + ) + + return mono_dataset diff --git a/SpeechLM/README.md b/SpeechLM/README.md new file mode 100644 index 0000000..71ea069 --- /dev/null +++ b/SpeechLM/README.md @@ -0,0 +1,268 @@ +# SpeechLM + + + + [**SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data**](https://arxiv.org/abs/2209.15329) + +- June 2023: We have corrected the errors in the pre-training data for SpeechLM-P Base models, and new results are updated. + +- April 2023: We discovered some errors about the data in the pre-training experiments, which will affect all the results about SpeechLM-P Base models. We are re-conducting the related experiments and will update the paper with the new results. + +- (Done) Oct 2022: release the code and models +- Oct 2022: release preprint in [arXiv](https://arxiv.org/abs/2209.15329) + +## Pre-Trained and Fine-tuned Models + +| Model | Pre-training Dataset | Fine-tuning Dataset | Model | +| :------: | :----------------------------------------------: | :-----------------: | :-----: | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Azure Storage] | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Azure Storage] | +| SpeechLM-H Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Google drive](https://drive.google.com/file/d/1eblW8U8f9t-NTuCNRrNHwr-8BeLAUAmQ/view?usp=sharing) | +| SpeechLM-H Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Google drive](https://drive.google.com/file/d/1vXyO5DolbiWiTYZ6pkkKQsu2wJetaPlv/view?usp=sharing) | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-De CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-Ca CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-Ar CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [En-Tr CoVoST-2](https://github.com/facebookresearch/covost) | [Azure Storage] | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | - | [Google drive](https://drive.google.com/file/d/1QjLIgTJKIylVIp5hUkfSjGPtz8Xo7Lky/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [960 hrs LibriSpeech](http://www.openslr.org/12) | [Google drive](https://drive.google.com/file/d/1YZQDVv096o8Opt0RBnkRiZXYPRDqKZnP/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-De CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/1qYygNWSc11TQbBI1OzC4ChlR-dNh8t9S/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-Ca CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/162U88mwso2aVfzzPkEM2nP_vwTpcb57T/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-Ar CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/1lbTSRXewEeb2t45URunD6EiJcbniyjWW/view?usp=sharing) | +| SpeechLM-P Large | [60k hrs LibriLight](https://github.com/facebookresearch/libri-light) + [40M Text](http://www.openslr.org/11) | [En-Tr CoVoST-2](https://github.com/facebookresearch/covost) | [Google drive](https://drive.google.com/file/d/1Er4I_jHS175pQQph223yKtiiLQ378VvH/view?usp=sharing) | + + +## Extract features using pre-trained models +For easier use of our pre-trained models, we merge all inference-related code to [`SpeechLM.py`](SpeechLM.py) and make cleaned checkpoints [~~`SpeechLM-P Base`~~] [`SpeechLM-H Base`] [`SpeechLM-P Large`] by removing non-required modules. Now you can directly use the following script to extract your speech features: +```python +import torch +import torch.nn.functional as F +from SpeechLM import SpeechLMConfig, SpeechLM + +checkpoint = torch.load('path/to/the/cleaned/checkpoint.pt') +cfg = SpeechLMConfig(checkpoint['cfg']['model']) +model = SpeechLM(cfg) +model.load_state_dict(checkpoint['model']) +model.eval() + +wav_input_16khz = torch.randn(1,10000) +normalize = checkpoint['cfg']['task']['normalize'] # False for base model, True for large model +if normalize: + wav_input_16khz = F.layer_norm(wav_input_16khz[0], wav_input_16khz[0].shape).unsqueeze(0) + +# extract the representation of last layer +rep = model.extract_features(wav_input_16khz)[0] + +# extract the representation of each layer +output_layer = model.cfg.encoder_layers + model.cfg.text_transformer.encoder.layers +rep, layer_results = model.extract_features(wav_input_16khz, output_layer=output_layer, ret_layer_results=True)[0] +layer_reps = [x.transpose(0, 1) for x in layer_results] +``` + + +## Setup +To fine-tune or pre-train more models, please follow the instructions below. + +```bash +git submodule update --init SpeechLM/fairseq +cd SpeechLM/ +pip install --editable fairseq/ +pip install sacrebleu==1.5.1 +``` + +## ASR on LibriSpeech +### Data preparation +Please follow the steps of wav2vec 2.0 manifest [here](https://github.com/pytorch/fairseq/tree/main/examples/wav2vec#prepare-training-data-manifest) to prepare `train.tsv` and `train.ltr`. You should make sure the vocabulary [`dict.ltr.txt`](dataset/LibriSpeech/asr/dict.ltr.txt) is the same as that used for the pre-trained model. + +Put yout prepared data into `$data_dir`, we provided eamples in [`dataset/LibriSpeech/asr`](dataset/LibriSpeech/asr/). + +### Fine-tune a CTC model +- Fine-tune the base model + ```bash + # Usage: speechlm/scripts/tune_speechlm_asr/finetune_base_ctc.sh [mount=$PWD] [world_size=8] [update_freq=1] + model_path=path/to/your/pre-trained/model + data_dir=dataset/LibriSpeech/asr + bash speechlm/scripts/tune_speechlm_asr/finetune_base_ctc.sh $model_path $data_dir 'tag400k' + ``` +- Fine-tune the large model + ```bash + # Usage: speechlm/scripts/tune_speechlm_asr/finetune_large_ctc.sh [mount=$PWD] [world_size=8] [update_freq=4] + model_path=path/to/your/pre-trained/model + data_dir=dataset/LibriSpeech/asr + bash speechlm/scripts/tune_speechlm_asr/finetune_large_ctc.sh $model_path $data_dir 'tag400k' + ``` +### Decode +- Directly decode a CTC model. + ```bash + # Usage: speechlm/scripts/tune_speechlm_asr/inference_ctc.sh [gen-set=dev_clean,dev_other,test_clean,test_other] + model_path=path/to/your/fine-tuned/model + data_dir=dataset/LibriSpeech/asr + bash speechlm/scripts/tune_speechlm_asr/inference_ctc.sh $model_path $data_dir + # for large models + # bash speechlm/scripts/tune_speechlm_asr/inference_ctc_large.sh $model_path $data_dir + ``` +- Decode with 4-gram language model using [flashlight](https://github.com/flashlight/flashlight/tree/main/bindings/python) and [kenlm](https://github.com/kpu/kenlm). + > Please put [4-gram.arpa](https://www.openslr.org/resources/11/4-gram.arpa.gz) and the word-to-letter lexicon [librispeech_lexicon.lst](https://drive.google.com/file/d/1q7IbNGqtwXnctjvuvpviQ4ZmepFHQmTO/view?usp=sharing) into `$data_dir`. + ```bash + # Usage: speechlm/scripts/tune_speechlm_asr/inference_ctc_kenlm.sh [gen-set=dev_clean,dev_other,test_clean,test_other] + model_path=path/to/your/fine-tuned/model + data_dir=dataset/LibriSpeech/asr + bash speechlm/scripts/tune_speechlm_asr/inference_ctc_kenlm.sh $model_path $data_dir + ``` +- Decode large models with fairseq-lm using [flashlight](https://github.com/flashlight/flashlight/tree/main/bindings/python). + > Please put [lm_librispeech_word_transformer.pt](https://dl.fbaipublicfiles.com/wav2letter/sota/2019/lm/lm_librispeech_word_transformer.pt) and its vocabulary [`dict.txt`](https://dl.fbaipublicfiles.com/wav2letter/sota/2019/lm/lm_librispeech_word_transformer.dict) into `$data_dir/fairseq_word_lm`, and the word-to-letter lexicon [librispeech_lexicon.lst](https://drive.google.com/file/d/1q7IbNGqtwXnctjvuvpviQ4ZmepFHQmTO/view?usp=sharing) into `$data_dir`. Capitalize the `dict.txt` to amke it compatible with the word-to-letter lexicon. + ```bash + # Usage: speechlm/scripts/tune_speechlm_asr/inference_ctc_large_fsqlm.sh [gen-set=dev_clean,dev_other,test_clean,test_other] + model_path=path/to/your/fine-tuned/model + data_dir=dataset/LibriSpeech/asr + bash speechlm/scripts/tune_speechlm_asr/inference_ctc_large_fsqlm.sh $model_path $data_dir dev_other + ``` + +## ST on CoVoST-2 +### Data Preparation +1. Download [Common Voice audio clips](https://commonvoice.mozilla.org/en/datasets) (version 4) for English into `$cv_root/en`. +2. Get data manifest. The following script will convert mp3 files to waveform, create tsv file containing speech/translation paires, create data config files. + ```bash + lang=de # ca,ar,tr + cv_root=dataset/CommonVoice/v4 + bash speechlm/data_process/prepare_covost2_enxx.sh $lang $cv_root + ``` + We provided examples in [`dataset/CommonVoice/v4/en/en-de`](dataset/CommonVoice/v4/en/en-de). + +### Fine-tune a encoder-decoder model +- Fine-tune the Base model (fine-tuned models will be stored in `$mount/exp/finetune_covost`). + + ```bash + model_path=path/to/your/pre-trained/model + lang=de # ca,ar,tr + data_dir=dataset/CommonVoice/v4/en/en-${lang} + # Usage (Base model): speechlm/scripts/tune_speechlm_st/ft_base_covost_enxx.sh [mount=$PWD] [world_size=8] [update_freq=2] + bash speechlm/scripts/tune_speechlm_st/ft_base_covost_enxx.sh $model_path $data_dir $lang 'tag400k' + ``` +- Fine-tune the Large model (fine-tuned models will be stored in `$mount/exp/finetune_covost`). + ```bash + # Usage (Large model): speechlm/scripts/tune_speechlm_st/ft_large_covost_enxx.sh [mount=$PWD] [world_size=8] [update_freq=4] + bash speechlm/scripts/tune_speechlm_st/ft_large_covost_enxx.sh $model_path $data_dir $lang 'tag400k' + ``` + +### Decode +- Decode the base model + ```bash + # Usage: speechlm/scripts/tune_speechlm_st/inference_base.sh [gen-set=dev] [beam_size=5] + model_path=path/to/your/fine-tuned/model + lang=de # ca,ar,tr + data_dir=dataset/CommonVoice/v4/en/en-${lang} + bash speechlm/scripts/tune_speechlm_st/inference_base.sh $model_path $data_dir $lang dev + ``` +- Decode the large model + ```bash + # Usage: speechlm/scripts/tune_speechlm_st/inference_large.sh [gen-set=dev] [beam_size=5] + bash speechlm/scripts/tune_speechlm_st/inference_large.sh $model_path $data_dir $lang dev + ``` + +## Universal Representation Evaluation on SUPERB + +Please refer to [**SUPERB**](https://superbbenchmark.org/) for the downstreaming tasks. + +## Pre-train +Please follow the instructions of [Tokenizer](README.md#Tokenizers) to prepare the pre-training data. We provided examples in [`dataset`](dataset). +- SpeechLM-P Base model + + Models will be stored in `$mount/pretrain`. + ```bash + data_dir=dataset/LibriSpeech/phone_unit # should contain train_960.{tsv,phn} + text_data_dir=dataset/LibriLM/phone_unit/bin-idx # should contain train_text.phn-ltr.{phn,ltr}.{bin,idx} + # Usage: speechlm/scripts/pretrain_speechlm/base_speechlmp.sh [mount=$PWD] [world_size=32] [update_freq=1] + bash speechlm/scripts/pretrain_speechlm/base_speechlmp.sh $data_dir $text_data_dir + ``` +- SpeechLM-H Base model + ```bash + data_dir=dataset/LibriSpeech/hidden_unit # should contain train_960.{tsv,phn} + text_data_dir=dataset/LibriLM/km-ltr/bin-idx # should contain train_text.km-ltr.{km,ltr}.{bin,idx} + # Usage: speechlm/scripts/pretrain_speechlm/base_speechlmh.sh [mount=$PWD] [world_size=32] [update_freq=1] + bash speechlm/scripts/pretrain_speechlm/base_speechlmp.sh $data_dir $text_data_dir + ``` +- SpeechLM-P Large model + ```bash + data_dir=dataset/LibriSpeech/phone_unit # should contain train_960.{tsv,phn} + text_data_dir=dataset/LibriLM/phone_unit/bin-idx # should contain train_text.phn-ltr.{phn,ltr}.{bin,idx} + # Usage: speechlm/scripts/pretrain_speechlm/base_speechlmp.sh [mount=$PWD] [world_size=32] [update_freq=1] + bash speechlm/scripts/pretrain_speechlm/large_speechlmp.sh $data_dir $text_data_dir + ``` + + +## Tokenizers +### Phoneme-unit Tokenizer for Speech +This tokenizer is used to produce the frame-laigned phonemes for unlabeled speech, which is actually a hybrid HMM ASR model. + +In the Base setting, we use 100h LibriSpeech labeled data to train the HMM model under Kaldi recipe, then decode the unpaired speech and get the aligned phonemes from the lattice. +Here we provided the processed phonemes of 960h speech here: [`train_960.tsv`](https://drive.google.com/file/d/1rxlikMglL2kEsF4NfqekZRoA02klY7CE/view?usp=sharing), [`train_960.phn`](), [`dev_clean.tsv`](https://drive.google.com/file/d/1NuVwe687jLBFkDLRy1EV2A2uXyV_kBo2/view?usp=sharing), [`dev_clean.phn`](https://drive.google.com/file/d/1cq_gbS-UgCALOoaE5QmhWrhkTdXuc_Uc/view?usp=sharing). Note that the label-rate is 100 (10ms). + +> The phoneme inventory is 300+ word-position-dependent phones including silence phones. + +### Phoneme-unit Tokenizer for Text +This tokenizer is used to phonemize the unpaired text data to (phonemes, letters) paired data, following a `words -> phonemes -> upsampled phones` pipeline. + +The following script will download LibriSpeech LM corpus and produce the required data: `train_text.phn-ltr.phn.{idx,bin}` and `train_text.phn-ltr.ltr.{idx,bin}`. +> Before runing it, make sure you have our provided [`dict.phn.txt`](dataset/LibriLM/phone_unit/bin-idx/dict.phn.txt) and [`dict.ltr.txt`](dataset/LibriLM/phone_unit/bin-idx/dict.ltr.txt) in the output dir `dataset/LibriLM/phone_unit/bin-idx/`. + +> The phoneme inventory is 300+ word-position-dependent phones including silence phones. + +```bash +# data will be in dataset/LibriLM/phone_unit/ +bash speechlm/data_process/prepare_phn2ltr_librilm.sh +``` +### Hidden-unit Tokenizer for Speech +Please follow the steps of data preparation for HuBERT [here](https://github.com/facebookresearch/fairseq/tree/main/examples/hubert#data-preparation) to prepare 1) wav recordings [`train.tsv`](dataset/LibriSpeech/hidden_unit/train_sample100.tsv) and 2) corresponding hidden-units [`train.km`](dataset/LibriSpeech/hidden_unit/train_sample100.km), and 3) unit vocabulary [`dict.km.txt`](dataset/LibriSpeech/hidden_unit/dict.km.txt). + +### Hidden-unit Tokenizer for Text +This tokenizer is used to produce the speech-style hidden units from unpaired text. +We train a [FastSpeech](https://arxiv.org/abs/2006.04558)-like model (instead generating continuous spectrum in the original paper, here we generate discrete units) on a small amount of ASR data ([100 hrs LibriSpeech](http://www.openslr.org/12)) as the tokenizer. + +Train: +1. Convert asr transcripts to phoneme sequence with duration information. +2. Extract hidden-units from speech, using the [Hidden-unit Tokenizer for Speech](#hidden-unit-tokenizer-for-speech). +3. Train the [model](speechlm/models/fasttext2unit.py) on the paired data: + ```bash + data_dir=dataset/LibriSpeech/fast_phone2unit + bash speechlm/scripts/tokenizer_fastT2U/train_s_5e-4.sh $data_dir + ``` +> The phoneme inventory is 41 mono phones including silence phones. + +Inference: + +4. Convert text data to phoneme sequence by [`lexicon`](https://drive.google.com/file/d/1dh9NEx_cCF9_Aa0UcKyl9j00GXs6LmLQ/view?usp=sharing). +5. [Generate](speechlm/scripts/tokenizer_fastT2U/generate.sh) hidden units for a large text corpus: + ```bash + gen_set=dataset/LibriSpeech/fast_phone2unit/genset_examples + bash speechlm/scripts/tokenizer_fastT2U/generate.sh $model_path $gen_set + ``` +We provided train/generate data examples in [`dataset/LibriSpeech/fast_phone2unit`](dataset/LibriSpeech/fast_phone2unit), and the model checkpoint [here](https://drive.google.com/file/d/1e-aYf8hPXuly8DEvNg5SISOlcUxsgED0/view?usp=sharing). + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq). + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +## Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{zhang2022speechlm, + title = {SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data}, + author = {Zhang, Ziqiang and Chen, Sanyuan and Zhou, Long and Wu, Yu and Ren, Shuo and Liu, Shujie and Yao, Zhuoyuan and Gong, Xun and Dai, Lirong and Li, Jinyu and Wei, Furu}, + eprint={2209.15329}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + year={2022} +} +``` + +### Contact Information + +For help or issues using SpeechLM models, please submit a GitHub issue. + +For other communications related to SpeechLM, please contact Long Zhou (`lozhou@microsoft.com`). + diff --git a/SpeechLM/SpeechLM.py b/SpeechLM/SpeechLM.py new file mode 100644 index 0000000..b242dde --- /dev/null +++ b/SpeechLM/SpeechLM.py @@ -0,0 +1,667 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import copy +import logging +from typing import Dict, List, Optional, Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch import Tensor + +from modules import ( + compute_mask_indices, + LayerNorm, + ConvFeatureExtractionModel, + GradMultiply, + TransformerEncoder, + TransformerEncoderBase, + +) + +# from fairseq.models.transformer import TransformerConfig + +logger = logging.getLogger(__name__) + +class DictConfig: + def __init__(self, cfg=None): + if cfg is not None: + self.update(cfg) + + def update(self, cfg: dict): + self.__dict__.update(cfg) + + +class TransformerConfig: + def __init__(self, cfg=None): + if cfg is not None: + self.update(cfg) + + def update(self, cfg: dict): + if 'encoder' in cfg: + self.encoder = DictConfig(cfg['encoder']) + del cfg['encoder'] + if 'quant_noise' in cfg: + self.quant_noise = DictConfig(cfg['quant_noise']) + del cfg['quant_noise'] + if 'decoder' in cfg: + del cfg['decoder'] + self.__dict__.update(cfg) + + +class SpeechLMConfig: + def __init__(self, cfg=None): + self.label_rate: int = 50 + self.extractor_mode: str = "default" # mode for feature extractor. default has a single group norm with d groups in the first conv block, whereas layer_norm has layer norms in every block (meant to use with normalize=True) + self.encoder_layers: int = 12 # num encoder layers in the transformer + self.encoder_embed_dim: int = 768 # encoder embedding dimension + self.encoder_embed_dim: int = 768 # encoder embedding dimension + self.encoder_ffn_embed_dim: int = 3072 # encoder embedding dimension for FFN + self.encoder_attention_heads: int = 12 # num encoder attention heads + self.activation_fn: str = "gelu" # activation function to use + self.layer_type: str = "transformer" # layer type in encoder + + # dropouts + self.dropout: float = 0.1 # dropout probability for the transformer + self.attention_dropout: float = 0.1 # dropout probability for attention weights + self.activation_dropout: float = 0.0 # dropout probability after activation in FFN + self.encoder_layerdrop: float = 0.0 # probability of dropping a tarnsformer layer + self.dropout_input: float = 0.0 # dropout to apply to the input (after feat extr) + self.dropout_features: float = 0.0 # dropout to apply to the features (after feat extr) + + self.final_dim: int = 256 # project final representations and targets to this many dimensions + self.layer_norm_first: bool = False # apply layernorm first in the transformer + self.conv_feature_layers: str = "[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2" # string describing convolutional feature extraction layers in form of a python list that contains [(dim, kernel_size, stride), ...] + self.conv_bias: bool = False # include bias in conv encoder + self.feature_grad_mult: float = 1.0 # multiply feature extractor var grads by this + + # masking + self.mask_length: int = 10 # mask length + self.mask_prob: float = 0.65 # probability of replacing a token with mask + self.mask_selection: str = "static" # how to choose mask length + self.mask_other: float = 0 # secondary mask argument (used for more complex distributions), see help in compute_mask_indicesh + self.no_mask_overlap: bool = False # whether to allow masks to overlap + self.mask_min_space: int = 1 # min space between spans (if no overlap is enabled) + + + # channel masking + self.mask_channel_length: int = 10 # length of the mask for features (channels) + self.mask_channel_prob: float = 0.0 # probability of replacing a feature with 0 + self.mask_channel_selection: str = "static" # how to choose mask length for channel masking + self.mask_channel_other: float = 0 # secondary mask argument (used for more complex distributions), see help in compute_mask_indices + self.no_mask_channel_overlap: bool = False # whether to allow channel masks to overlap + self.mask_channel_min_space: int = 1 # min space between spans (if no overlap is enabled) + + # positional embeddings + self.conv_pos: int = 128 # number of filters for convolutional positional embeddings + self.conv_pos_groups: int = 16 # number of groups for convolutional positional embedding + + # loss computation + self.skip_masked: bool = False # skip computing losses over masked frames + self.skip_nomask: bool = False # skip computing losses over unmasked frames + self.checkpoint_activations: bool = False # recompute activations and save memory for extra compute + + # FP16 optimization + self.required_seq_len_multiple: int = 2 # pad the input to encoder such that the sequence length is divisible by multiple + + # Custom + self.use_rel_pos_enc: bool = False # whether to use relative positional encoding + self.scaling_for_att: float = 1.0 # scaling for attention weights to prevent overflow issue (for large model) + + # unit encoder-decoder + self.add_unit_encoder: bool = False # add unit encoder + + # embedding mixing + self.mix_with_unit: bool = True # mix with the unit embeddings + self.use_pred_unit: bool = False # use the embeddings of predicted units + self.l2_embedding: bool = False # compute l2 loss between unit embedding and unit hidden state + + if cfg is not None: + self.update(cfg) + + def update(self, cfg: dict): + model_cfg = copy.deepcopy(cfg) + self.text_transformer = TransformerConfig(model_cfg['text_transformer']) + del model_cfg['text_transformer'] + self.__dict__.update(model_cfg) + +class SpeechLM(nn.Module): + def __init__( + self, + cfg: SpeechLMConfig, + ) -> None: + super().__init__() + self.cfg = cfg + + feature_enc_layers = eval(cfg.conv_feature_layers) # noqa + self.embed = feature_enc_layers[-1][0] + + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + mode=cfg.extractor_mode, + conv_bias=cfg.conv_bias, + ) + sample_rate = 16000 + feature_ds_rate = np.prod([s for _, _, s in feature_enc_layers]) + self.feat2tar_ratio = cfg.label_rate * feature_ds_rate / sample_rate + + self.post_extract_proj = ( + nn.Linear(self.embed, cfg.encoder_embed_dim) + if self.embed != cfg.encoder_embed_dim + else None + ) + + self.mask_prob = cfg.mask_prob + self.mask_selection = cfg.mask_selection + self.mask_other = cfg.mask_other + self.mask_length = cfg.mask_length + self.no_mask_overlap = cfg.no_mask_overlap + self.mask_min_space = cfg.mask_min_space + + self.mask_channel_prob = cfg.mask_channel_prob + self.mask_channel_selection = cfg.mask_channel_selection + self.mask_channel_other = cfg.mask_channel_other + self.mask_channel_length = cfg.mask_channel_length + self.no_mask_channel_overlap = cfg.no_mask_channel_overlap + self.mask_channel_min_space = cfg.mask_channel_min_space + + self.dropout_input = nn.Dropout(cfg.dropout_input) + self.dropout_features = nn.Dropout(cfg.dropout_features) + + self.feature_grad_mult = cfg.feature_grad_mult + self.logit_temp = cfg.logit_temp + self.skip_masked = cfg.skip_masked + self.skip_nomask = cfg.skip_nomask + + self.final_dim = cfg.final_dim if cfg.final_dim > 0 else cfg.encoder_embed_dim + self.final_proj_list = nn.ModuleList([ + nn.Linear(cfg.encoder_embed_dim, self.final_dim) for _ in range(2) + ]) + + self.mask_emb = nn.Parameter( + torch.FloatTensor(cfg.encoder_embed_dim).uniform_() + ) + + self.encoder = TransformerEncoder(cfg) + self.layer_norm = LayerNorm(self.embed) + + ### build unit encoder: + self.mask_u2t = cfg.mask_u2t + self.compute_mum = cfg.compute_mum + self.add_text_ctc = cfg.add_text_ctc + self.text_ctc_conv_kernel = cfg.text_ctc_conv_kernel + self.padding_idx = 1 + + self.add_unit_encoder = cfg.add_unit_encoder + self.mix_with_unit = cfg.mix_with_unit + self.use_pred_unit = cfg.use_pred_unit + self.l2_embedding = cfg.l2_embedding + if self.add_unit_encoder: + self.unit_embed_tokens = None + ### build unit encoder + self.unit_encoder = TransformerEncoderBase( + cfg.text_transformer, + dictionary=None, + embed_tokens=self.unit_embed_tokens, + use_rel_pos_enc=cfg.use_rel_pos_enc, + scaling_for_att=cfg.scaling_for_att, + ) + + ### build unit2text decoder, not available for now + self.add_decoder = cfg.add_decoder + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions.""" + + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + def apply_mask(self, x, padding_mask, target_list): + B, T, C = x.shape + if self.mask_prob > 0: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob, + self.mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x[mask_indices] = self.mask_emb + else: + mask_indices = None + + if self.mask_channel_prob > 0: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + return x, mask_indices + + def forward_features(self, source: torch.Tensor) -> torch.Tensor: + if self.feature_grad_mult > 0: + features = self.feature_extractor(source) + if self.feature_grad_mult != 1.0: + features = GradMultiply.apply(features, self.feature_grad_mult) + else: + with torch.no_grad(): + features = self.feature_extractor(source) + return features + + def forward_targets( + self, + features: torch.Tensor, + target_list: List[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + # Trim features to ensure labels exist and then get aligned labels + feat_tsz = features.size(2) + targ_tsz = min([t.size(1) for t in target_list]) + if self.feat2tar_ratio * feat_tsz > targ_tsz: + feat_tsz = int(targ_tsz / self.feat2tar_ratio) + features = features[..., :feat_tsz] + target_inds = torch.arange(feat_tsz).float() * self.feat2tar_ratio + target_inds += np.random.choice(int(self.feat2tar_ratio)) + target_list = [t[:, target_inds.long()] for t in target_list] + return features, target_list + + def forward_padding_mask( + self, + features: torch.Tensor, + padding_mask: torch.Tensor, + ) -> torch.Tensor: + extra = padding_mask.size(1) % features.size(1) + if extra > 0: + padding_mask = padding_mask[:, :-extra] + padding_mask = padding_mask.view(padding_mask.size(0), features.size(1), -1) + padding_mask = padding_mask.all(-1) + return padding_mask + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def downsample_ctc_padding_mask(self, padding_mask): + """ + padding_mask: (B, T) + """ + stride = self.text_ctc_conv_kernel // 2 + return padding_mask[:, ::stride] + + def compute_pred(self, proj_x, label_embs): + if self.target_glu: + label_embs = self.target_glu(label_embs) + x = F.normalize(proj_x.float(), dim=-1) # (S, D) + label_embs = F.normalize(label_embs.float(), dim=-1) # (C, D) + logits = torch.matmul(x, label_embs.T).type_as(proj_x) # (S, C) + logits /= self.logit_temp + return logits + + def compute_hubert_logits(self, x, target, proj, label_embs, padding_mask, mask_indices): + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = proj(x[masked_indices]) + logit_m_list = [(self.compute_pred(proj_x_m, label_embs), target[masked_indices])] + else: + logit_m_list = [None] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = proj(x[nomask_indices]) + logit_u_list = [(self.compute_pred(proj_x_u, label_embs), target[nomask_indices])] + else: + logit_u_list = [None] + + return logit_m_list, logit_u_list + + def convert_embeddings(self, + x, + padding_mask, + target=None, + mask_indices=None, + mix_with_unit=False, + use_pred_unit=False, + l2_embedding=False, + remask=False + ): + """ + 1. Mix with units if needed (default: True) + 2. Prepare for unit_encoder inputs + Inputs: + x, (B, T, D) + Return: + src_tokens, (B, T) + soft_embeddings, (B, T, D) + l2_loss, a loss + """ + soft_embeddings = self.final_proj_list[0](x) if x.size(-1) == self.final_dim else x + if padding_mask is None: + padding_mask = soft_embeddings.new_zeros(soft_embeddings.size(0), soft_embeddings.size(1), dtype=torch.long) + if use_pred_unit: + src_tokens = self.compute_pred(self.final_proj_list[0](x), self.label_embs_list[0]).argmax(dim=-1) + src_tokens[padding_mask] = self.padding_idx + elif target is not None: + src_tokens = target + else: + src_tokens = padding_mask.long() + + if l2_embedding | mix_with_unit: + unit_embeddings = self.unit_embed_tokens(src_tokens) # (B, T, D) + + l2_loss = 0 + if l2_embedding: + if mask_indices is not None: + l2_loss = (soft_embeddings - unit_embeddings)[mask_indices].float().pow(2).mean(dim=-1) + scale = unit_embeddings[mask_indices].float().pow(2).sum(dim=-1) + else: + l2_loss = (soft_embeddings - unit_embeddings).float().pow(2).mean(dim=-1) + scale = unit_embeddings.float().pow(2).sum(dim=-1) + l2_loss = (l2_loss / scale).mean() + + if mix_with_unit: + B, T, D = x.shape + selected_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob / 2, + self.mask_length // 2, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + selected_indices = torch.from_numpy(selected_indices).to(x.device) + if mask_indices is not None: + if remask: + remask_indices = torch.logical_and(selected_indices, mask_indices) + soft_embeddings[remask_indices] = self.mask_emb + swap_indices = torch.logical_and(selected_indices, ~mask_indices) + else: + swap_indices = selected_indices + soft_embeddings[swap_indices] = unit_embeddings[swap_indices] + + soft_embeddings = soft_embeddings * (1 - padding_mask.unsqueeze(-1).type_as(x)) + return src_tokens, soft_embeddings, l2_loss + + def forward( + self, + source: torch.Tensor = None, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert source is not None or src_tokens is not None + if source is not None: + return self.forward_speech( + source=source, + target_list=target_list, + padding_mask=padding_mask, + mask=mask, + features_only=features_only, + output_layer=output_layer, + ) + else: + return self.forward_text( + src_tokens=src_tokens, + src_lengths=src_lengths, + mask=self.mask_u2t, + output_layer=output_layer, + ) + + def forward_speech( + self, + source: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + features = self.forward_features(source) + if target_list is not None: + features, target_list = self.forward_targets(features, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + if mask: + x, mask_indices = self.apply_mask(features, padding_mask, target_list) + else: + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, layer_results = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1, + ) + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features, "layer_results": layer_results} + + logit_m_list, logit_u_list = self.compute_hubert_logits( + x, + target_list[0], + self.final_proj_list[0], + self.label_embs_list[0], + padding_mask, + mask_indices, + ) + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + + if self.add_unit_encoder: + src_tokens, x_emb, l2_loss = self.convert_embeddings( + x, + padding_mask, target_list[0], + mask_indices=mask_indices, + mix_with_unit=self.mix_with_unit, + use_pred_unit=self.use_pred_unit, + l2_embedding=self.l2_embedding, + ) + encoder_out = self.unit_encoder(src_tokens, token_embeddings=x_emb) + + result['encoder_out'] = encoder_out['encoder_out'] # [(T, B, D)] + result['encoder_padding_mask'] = encoder_out['encoder_padding_mask'] # [(B, T)] + if self.l2_embedding: + result['embedding_l2_loss'] = l2_loss + + code_logit_m_list, code_logit_u_list = self.compute_hubert_logits( + encoder_out['encoder_out'][0].transpose(0, 1), + target_list[-1], + self.final_proj_list[-1], + self.label_embs_list[-1], + padding_mask, + mask_indices, + ) + result['logit_m_list'] += code_logit_m_list + result['logit_u_list'] += code_logit_u_list + return result + + def forward_text( + self, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + mask: bool = True, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert self.add_unit_encoder, f"Can not forward unit-text branch without unit_encoder!" + + padding_mask = src_tokens == self.padding_idx + unit_embeddings = self.unit_embed_tokens(src_tokens) + if mask: + unit_embeddings, mask_indices = self.apply_mask(unit_embeddings, padding_mask, [src_tokens]) + else: + ### If already applied mask on src_tokens, then the target_list should contains many padding_idx + mask_indices = target_list[-1] != self.padding_idx + unit_embeddings[mask_indices] = self.mask_emb + + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=unit_embeddings, + return_all_hiddens=output_layer is not None, + ) + + result = {} + result["encoder_out"] = encoder_out["encoder_out"] + result["encoder_states"] = encoder_out["encoder_states"] + result["padding_mask"] = padding_mask + + if self.compute_mum: + code_logit_m_list, code_logit_u_list = self.compute_hubert_logits( + encoder_out["encoder_out"].transpose(0, 1), + target_list[-1], + self.final_proj_list[-1], + self.label_embs_list[-1], + padding_mask, + mask_indices, + ) + result["logit_m_list"] = code_logit_m_list + result["logit_u_list"] = code_logit_u_list + + if self.add_text_ctc: + result["encoder_out_ctc"] = [self.unit_encoder_ctc_head(x) for x in encoder_out['encoder_out']] + result["encoder_padding_mask"] = [ + self.downsample_ctc_padding_mask(padding_mask) for padding_mask in encoder_out['encoder_padding_mask'] + ] + return result + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + ret_layer_results: bool = False, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Extract features for only speech input""" + with torch.no_grad(): + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + # {"x": x, "padding_mask": padding_mask, "features": features, "layer_results": layer_results} + + x = res["x"] # B x T x D + padding_mask = res["padding_mask"] + if self.add_unit_encoder and (output_layer is None or output_layer > self.cfg.encoder_layers): + src_tokens, x, _ = self.convert_embeddings( + x, + padding_mask, + mix_with_unit=False, + use_pred_unit=False, + ) + return_all_hiddens=output_layer is not None and output_layer > self.cfg.encoder_layers + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=x, + return_all_hiddens=return_all_hiddens, + ) + res["x"] = encoder_out['encoder_out'][0].transpose(0, 1) # (B, T, D) + if return_all_hiddens: + res["layer_results"] += encoder_out['encoder_states'][1:1+output_layer-len(res["layer_results"])] + + feature = res["features"] if ret_conv else res["x"] + if ret_layer_results: + feature = (feature, res["layer_results"]) + + return feature, padding_mask + + def get_logits(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + logits_list = [x[0].float() for x in logits_list if x is not None] + return logits_list + + def get_targets(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + targets_list = [x[1].long() for x in logits_list if x is not None] + return targets_list + + def get_extra_losses(self, net_output): + extra_losses = [] + names = [] + + if "features_pen" in net_output: + extra_losses.append(net_output["features_pen"]) + names.append("features_pen") + + if "embedding_l2_loss" in net_output: + extra_losses.append(net_output["embedding_l2_loss"]) + names.append("embedding_l2_loss") + + return extra_losses, names + + def remove_pretraining_modules(self, step2=False): + self.target_glu = None + diff --git a/SpeechLM/dataset/CommonVoice/v4/en/en-de/config_base_ende.yaml b/SpeechLM/dataset/CommonVoice/v4/en/en-de/config_base_ende.yaml new file mode 100644 index 0000000..50733b2 --- /dev/null +++ b/SpeechLM/dataset/CommonVoice/v4/en/en-de/config_base_ende.yaml @@ -0,0 +1,14 @@ +bpe_tokenizer: + bpe: sentencepiece + sentencepiece_model: spm_char_st_en_de.model + +shuffle: false +use_audio_input: true +use_sample_rate: 16000 +standardize_audio: false +vocab_filename: spm_char_st_en_de.txt + +# required by speech_to_text task but never used +input_channels: 1 +input_feat_per_channel: 1 + diff --git a/SpeechLM/dataset/CommonVoice/v4/en/en-de/config_large_ende.yaml b/SpeechLM/dataset/CommonVoice/v4/en/en-de/config_large_ende.yaml new file mode 100644 index 0000000..d3424a3 --- /dev/null +++ b/SpeechLM/dataset/CommonVoice/v4/en/en-de/config_large_ende.yaml @@ -0,0 +1,14 @@ +bpe_tokenizer: + bpe: sentencepiece + sentencepiece_model: spm_char_st_en_de.model + +shuffle: false +use_audio_input: true +use_sample_rate: 16000 +standardize_audio: true +vocab_filename: spm_char_st_en_de.txt + +# required by speech_to_text task but never used +input_channels: 1 +input_feat_per_channel: 1 + diff --git a/SpeechLM/dataset/CommonVoice/v4/en/en-de/dev-sample100_st_en_de_local.tsv b/SpeechLM/dataset/CommonVoice/v4/en/en-de/dev-sample100_st_en_de_local.tsv new file mode 100644 index 0000000..c4251fa --- /dev/null +++ b/SpeechLM/dataset/CommonVoice/v4/en/en-de/dev-sample100_st_en_de_local.tsv @@ -0,0 +1,100 @@ +id audio n_frames tgt_text +common_voice_en_18540003 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18540003.wav 90624 Wenn Wasser knapp ist, verschwenden Sie es nicht. +common_voice_en_18540005 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18540005.wav 57984 Du fährst mit ihr bis zu ihrer Tür. +common_voice_en_18540006 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18540006.wav 63744 Celia schreckte zurück und zitterte. +common_voice_en_65557 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_65557.wav 40704 Haben Sie einen Ring? +common_voice_en_65559 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_65559.wav 44160 Ich habe ihn nicht einmal gefragt. +common_voice_en_19594267 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19594267.wav 110208 Der größte See nach Fläche in der Mongolei, der Uvs-See, ist in der Great Lakes Depression. +common_voice_en_19594268 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19594268.wav 91392 Die darauffolgende Wiedervereinigung mit Rom hat bis heute ununterbrochen angedauert. +common_voice_en_19594269 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19594269.wav 64128 Die Saiten könnten aus Messing oder Stahl sein. +common_voice_en_18282099 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18282099.wav 67584 Andrew rollte sich in der Box zusammen. +common_voice_en_2518264 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_2518264.wav 61824 Säure ätzt Locher in Wollstoff. +common_voice_en_18909686 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18909686.wav 147072 Dies wurde später von Herny Seebohm beschrieben und Riesen-Fischuhu genannt. +common_voice_en_18909688 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18909688.wav 114048 Er ist auch dazu in der Lage, über kurze Distanzen zu schweben. +common_voice_en_18909689 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18909689.wav 85248 So konnte Letta seine große Koalition fortsetzen. +common_voice_en_18460666 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18460666.wav 56064 Es nicht gekostet wegschieben? +common_voice_en_18460690 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18460690.wav 68736 Ich bin verzweifelt, und damit hatte es sich. +common_voice_en_18460692 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18460692.wav 54912 Ich folge dir nicht, Jeeves. +common_voice_en_485640 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_485640.wav 70272 Ordentliche Pläne scheitern ohne Glück. +common_voice_en_89833 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_89833.wav 128256 Das ist ein super Armband, das du trägst. +common_voice_en_19001715 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19001715.wav 148224 Der Buddhismus in Afghanistan wurde von den Saffariden, Ghaznawiden und Ghuriden erfolgreich beseitigt. +common_voice_en_19001716 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19001716.wav 80256 Das System sieht einen frei schwebenden Lauf vor. +common_voice_en_19001719 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19001719.wav 109056 Diese bekannten Murderabilia-Händler finden Sie auf den folgenden Websites. +common_voice_en_9774 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_9774.wav 119040 Sie liest unheimlich gern, weiß jedoch nicht so genau, wie das Lesen zu einer Steigerung der Kreativität beitragen kann. +common_voice_en_26370 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_26370.wav 62208 Danke, dass Sie uns an Ihrer Geschichte haben teilhaben lassen. Alles Gute für die Hochzeitsreise. +common_voice_en_26372 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_26372.wav 59904 Sie kennen die Uhrzeit doch. Warum fragen Sie mich danach? +common_voice_en_17260994 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_17260994.wav 155520 Der Fuchs sprang über den Rand der Farm. Dort fand er einen Safari-Reisenden vor, der eine Vivaldi Opera zum Besten gab. +common_voice_en_18881599 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18881599.wav 108672 "Express" sollte das Gebiet untersuchen und fand dort nichts. +common_voice_en_18881604 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18881604.wav 92544 Dadurch werden die Probleme gemildert, die durch einen Mangel an Hämoglobin verursacht werden. +common_voice_en_18881605 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18881605.wav 109056 Diese Behauptungen werden von der Mainstream-Archäologie kategorisch zurückgewiesen. +common_voice_en_180278 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_180278.wav 48768 Sie sollte eigentlich herunterkommen und Sie abholen. +common_voice_en_180279 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_180279.wav 54912 Ich werde dort nicht als Geist leben. +common_voice_en_696251 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_696251.wav 98304 Der Junge hat bemerkt, dass der Engländer nervös war und seine Bücher vergessen hat. +common_voice_en_19049974 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19049974.wav 73344 Durch eine Augenverletzung fand seine Karriere ein vorzeitiges Ende. +common_voice_en_19049975 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19049975.wav 126336 Supermatrixes ähnlicher Größe können genauso wie normale Matrixes hinzugefügt und vervielfacht werden. +common_voice_en_19049976 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19049976.wav 94464 Es liegt annäherungsweise südlich von Denali, der höchsten Erhebung in Nordamerika. +common_voice_en_19765134 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19765134.wav 110208 Kleinstädte in Vietnam unterstehen der regionalen Regierung. +common_voice_en_19765136 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19765136.wav 61440 Fünf Jahre später nahm er ihn nach Dresden mit. +common_voice_en_19765138 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19765138.wav 130176 Der Croma ist standardmäßig mit Anti-Blockier-System (ABS) und Elektronischer Bremskraftverteilung (EBD) ausgestattet. +common_voice_en_19688061 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19688061.wav 104448 Carter hat zwei Kinder, die Tochter Taleya und den Sohn Tamere. +common_voice_en_19688062 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19688062.wav 148992 Wenn der Gehalt an gelöstem Sauerstoff zu hypoxischen Bedingungen übergeht, ersticken Fische und andere Meerestiere. +common_voice_en_19688064 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19688064.wav 48768 Adams hatte ein Leben mit vielen Tiefen. +common_voice_en_19690060 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19690060.wav 136320 Er hat die Dudley Middle Comprehensive School besucht. +common_voice_en_19690063 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19690063.wav 116352 Der ursprüngliche Name der Schule lautet "School of Commerce and Domestic Science" (Handels- und Hauswirtschaftsschule). +common_voice_en_19690064 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19690064.wav 124032 Bei dem Unfall, bei dem er am Steuer saß, befand sich auch Anna, seine Tochter, im Auto. Sie hat den Unfall überlebt. +common_voice_en_18260377 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18260377.wav 98304 Jeder möchte gemocht werden. Das liegt in der Natur des Menschen. +common_voice_en_18260378 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18260378.wav 85248 Jeder sollte Zugang zu medizinischer Grundversorgung haben. +common_voice_en_18260379 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18260379.wav 77184 Während wir älter werden, sind wir in unserem Leben gefangen. +common_voice_en_100764 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_100764.wav 73344 Sie sollten das in einem Wahrnehmungsexperiment untersuchen. +common_voice_en_100765 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_100765.wav 70656 Sie haben mich vom ersten Moment an abgelehnt. +common_voice_en_626029 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_626029.wav 104448 Hanf ist ein Gras, das in Teilen der Tropen vorgefunden wird. +common_voice_en_19703984 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19703984.wav 142848 Sowohl Federation als auch Neo-Zeon Forces sehen dabei zu als die Axis beim Wiedereintritt von der Bahn abkommen. +common_voice_en_19703985 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19703985.wav 165120 Das Mutterhaus in Loretto befindet sich in Nerinx, Marion County, Kentucky. +common_voice_en_19703987 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19703987.wav 114048 Der Umfang von Matildas militärischer Ausbildung wird diskutiert. +common_voice_en_19676540 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19676540.wav 105984 Zu Lernzwecken wurden Stifte nach und nach durch Schreibtafeln ersetzt. +common_voice_en_19676541 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19676541.wav 131712 Die extrem hügelige Landschaft zeichnet sich durch eine Art Erhabenheit aus und bietet einen atemberaubenden Ausblick. +common_voice_en_19676542 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19676542.wav 93696 Die beiden Tierbilder wurden zu einem Bild kombiniert. +common_voice_en_19678470 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19678470.wav 145920 Sie und Gatti-Casazza haben sich im darauffolgenden Jahr getrennt und sich dann scheiden lassen. +common_voice_en_19678471 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19678471.wav 74112 Es zeigt allerdings niemand Interesse. +common_voice_en_19678476 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19678476.wav 98688 Er hat keine sinnvollen Aussagen gemacht. Es war nur Kauderwelsch. +common_voice_en_17730605 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_17730605.wav 57984 Wer im Glashaus sitzt, sollte nicht mit Steinen werfen. +common_voice_en_19768089 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19768089.wav 66432 Der Rahmen kippt den Motor leicht nach hinten. +common_voice_en_19768197 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19768197.wav 58752 Bevor er hauptberuflich Politiker wurde, war er Landwirt. +common_voice_en_19768200 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19768200.wav 73344 Er hat auch als Karikaturist und Comiczeichner gearbeitet. +common_voice_en_19699188 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19699188.wav 106368 Das Schiff war zwei von vier Lebensjahren aufgelegt. +common_voice_en_19699189 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19699189.wav 133632 Boucher hat sich von Künstlern wie Peter Pauls Rubens und Antoine Watteau inspirieren lassen. +common_voice_en_19699190 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19699190.wav 108288 Zwei Tracks wurden als Auszüge auf einer Single herausgebracht. +common_voice_en_512711 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_512711.wav 84096 Gruppe von Menschen, von sanftem Licht einer Öllaterne angestrahlt. +common_voice_en_512712 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_512712.wav 103296 Frau mit hellem Haar und Mann mit einem Lächeln, die nebeneinander sitzen. +common_voice_en_512713 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_512713.wav 98304 Ein Mann fährt die Straße entlang und passiert Blumenkübel. Er hält dabei ein zweites Fahrrad. +common_voice_en_19678686 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19678686.wav 114816 Computertische werden normalerweise in der Massenproduktion gefertigt und müssen teilweise in Selbstmontage montiert werden. +common_voice_en_19678689 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19678689.wav 97536 Aufgrund der geringen Auflage gilt es jetzt als Sammlerstück. +common_voice_en_19678692 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19678692.wav 139776 Die Songs von Thrussel haben regelmäßig Themen zum Gegenstand, in denen er sich gegen Konsum und Überwachung durch den Staat ausspricht. +common_voice_en_648128 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_648128.wav 77184 Ein Mann und ein Kind auf einem Campingplatz, die ein Frühstück zubereiten. +common_voice_en_648129 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_648129.wav 72576 Militärangehörige bereiten sich auf ihren Dienst vor. +common_voice_en_648130 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_648130.wav 109824 Ein Baseballspieler, der ein blaues T-Shirt trägt, läuft auf eine Base zu. +common_voice_en_34182 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_34182.wav 82560 Ihr Büro hat mich angerufen, um ihn zurückzuhalten. +common_voice_en_34184 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_34184.wav 67968 Dieser Satz macht überhaupt keinen Sinn. +common_voice_en_92676 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_92676.wav 62976 Eine Gruppe von Leuten läuft durch eine Karnevalsgruppe. +common_voice_en_92677 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_92677.wav 62976 Ein älteres Paar, das singt und Gitarre spielt. +common_voice_en_92678 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_92678.wav 86016 Zwei Männer in roten Hosen vollführen akrobatische Kunststücke mit einer Leiter. +common_voice_en_570502 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_570502.wav 82944 Künstliche neuronale Netzwerke können etwas ganz ähnliches ausführen. +common_voice_en_141246 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_141246.wav 63744 Schalte die Laterne aus, die uns Licht spendet. +common_voice_en_141247 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_141247.wav 62592 Brian reist heute ab. +common_voice_en_19047441 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19047441.wav 84096 Die Bewohner haben im Namen des Dauphin eine Silbermine betrieben. +common_voice_en_19047442 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19047442.wav 74496 Die Statue wurde durch den Millenium Lottery Fund teilfinanziert. +common_voice_en_19047443 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19047443.wav 117504 Das Henderson House in Elmhurst, Illinois, USA; hat einen ähnlichen Grundriss. +common_voice_en_567705 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_567705.wav 54144 Hängen Sie an beide Zweige Lametta. +common_voice_en_17283658 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_17283658.wav 59520 Unter den Linden. +common_voice_en_17283659 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_17283659.wav 119040 Das höchste Gebäude der Welt ist 829,8 m hoch. +common_voice_en_18707930 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18707930.wav 107136 Die Stadt liegt in Harris County, in Südost Texas. +common_voice_en_18707931 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18707931.wav 155904 Das steht im Gegensatz zum Potential des Pacemakers oder dem Strom, der die rhythmische Modulierung der Impulsfrequenz antreibt. +common_voice_en_18707933 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18707933.wav 90624 Die Stadt wird durch eine Stadtverwaltung regiert. +common_voice_en_18524588 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18524588.wav 88704 Genehmigen Sie den Ausdruck meiner vorzüglichen Hochachtung. +common_voice_en_18524590 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18524590.wav 67584 Anhand der Laufzeit kann man ablesen, dass dieser Computer nie neu gestartet wurde. +common_voice_en_18524592 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_18524592.wav 89856 Celia stand dort, war offenbar nicht betroffen und konnte den Vorkommnissen nicht folgen. +common_voice_en_19254317 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19254317.wav 134784 Der Unterricht wird extra abends abgehalten, damit die Studenten von High Schools daran teilnehmen können. +common_voice_en_19254318 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19254318.wav 119424 Dieses Fett ist Halacha und wird auch Chelev oder Talg genannt. +common_voice_en_19254320 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_19254320.wav 97536 Die Patienten und das Krankenhauspersonal haben sie für den Preis nominiert. +common_voice_en_542826 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_542826.wav 117120 Jeder Teilbereich des Bildschirms gehört zu einer bestimmten Reihe und Spalte. +common_voice_en_542828 /LocalData/dataset/CommonVoice/v4/en/wav/common_voice_en_542828.wav 108672 Die internationale Raumstation ist ein großartiges Projekt. diff --git a/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.model b/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.model new file mode 100644 index 0000000000000000000000000000000000000000..9dc0c3ca4c5a2ab48f2fdb344005b1169fe55a2e GIT binary patch literal 239480 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

5X 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

  • jDD}qd6xVK_0;wJ^}cvXNF{$KY5k1fWthOf zY5&BV!cAk|gz@|g!SDI|6aItUHVo%4kDNii&3`$$=^EdPpHu9w#}0fEm%0AG*uO-- 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 zfB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG z`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A z|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW z@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K z|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<# z;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e z|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe z!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0` z|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+` zhyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=> z{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci> z5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q% z{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@% zAO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk z{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$j zKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8 z{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5 zfB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG 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 literal 0 HcmV?d00001 diff --git a/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.txt b/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.txt new file mode 100644 index 0000000..1a1a2f6 --- /dev/null +++ b/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.txt @@ -0,0 +1,164 @@ +▁ 1 +e 1 +n 1 +i 1 +r 1 +t 1 +s 1 +a 1 +d 1 +h 1 +u 1 +l 1 +o 1 +c 1 +g 1 +m 1 +. 1 +b 1 +f 1 +w 1 +k 1 +z 1 +S 1 +v 1 +p 1 +, 1 +D 1 +ü 1 +E 1 +ä 1 +A 1 +B 1 +M 1 +G 1 +" 1 +F 1 +K 1 +P 1 +W 1 +T 1 +y 1 +H 1 +ö 1 +I 1 +R 1 +L 1 +- 1 +C 1 +V 1 +N 1 +ß 1 +Z 1 +J 1 +U 1 +j 1 +O 1 +x 1 +? 1 +! 1 +' 1 +q 1 +Y 1 +Ü 1 +: 1 +Q 1 +Ä 1 +Ö 1 +; 1 +( 1 +) 1 +X 1 +0 1 +1 1 +[ 1 +] 1 +é 1 +2 1 +& 1 +3 1 +5 1 +4 1 +7 1 +9 1 +8 1 +6 1 +/ 1 +á 1 +ō 1 +ó 1 +ñ 1 +ú 1 +í 1 +ā 1 +è 1 +* 1 +ć 1 +à 1 +ê 1 +ë 1 +¡ 1 +ç 1 +ð 1 +ã 1 +č 1 +ū 1 +% 1 +É 1 +â 1 +ø 1 +š 1 +å 1 +ô 1 +ł 1 +œ 1 +ş 1 +Š 1 +_ 1 +Î 1 +Ó 1 +æ 1 +ï 1 +ă 1 +ě 1 +ī 1 +ı 1 +ʻ 1 +ʿ 1 +π 1 +и 1 +к 1 += 1 +à 1 +Ø 1 +î 1 +û 1 +þ 1 +ċ 1 +Č 1 +ę 1 +ğ 1 +ń 1 +Ō 1 +ő 1 +ř 1 +ž 1 +ǎ 1 +α 1 +В 1 +е 1 +з 1 +й 1 +л 1 +н 1 +ь 1 +я 1 +ṃ 1 +ạ 1 +ụ 1 +→ 1 +≡ 1 +京 1 +大 1 +都 1 +阪 1 diff --git a/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.vocab b/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.vocab new file mode 100644 index 0000000..dcaf02c --- /dev/null +++ b/SpeechLM/dataset/CommonVoice/v4/en/en-de/spm_char_st_en_de.vocab @@ -0,0 +1,168 @@ + 0 + 0 + 0 + 0 +▁ -1.94346 +e -2.0247 +n -2.52771 +i -2.69095 +r -2.81179 +t -2.99429 +s -3.07457 +a -3.08727 +d -3.37853 +h -3.41543 +u -3.52845 +l -3.53925 +o -3.76429 +c -3.83672 +g -3.89086 +m -4.03425 +. -4.27171 +b -4.34078 +f -4.45167 +w -4.51255 +k -4.68054 +z -4.81542 +S -4.96966 +v -5.01738 +p -5.09819 +, -5.11371 +D -5.22687 +ü -5.34517 +E -5.43072 +ä -5.43483 +A -5.61389 +B -5.67037 +M -5.68285 +G -5.93387 +" -5.94796 +F -5.95252 +K -5.99114 +P -6.03568 +W -6.0592 +T -6.08128 +y -6.08834 +H -6.14664 +ö -6.17763 +I -6.18576 +R -6.22513 +L -6.30172 +- -6.34074 +C -6.41901 +V -6.44441 +N -6.48507 +ß -6.60475 +Z -6.78851 +J -6.81489 +U -7.04154 +j -7.07161 +O -7.13538 +x -7.50985 +? -7.66957 +! -8.34983 +' -8.62779 +q -8.7511 +Y -8.80869 +Ü -9.0344 +: -9.03696 +Q -9.11993 +Ä -9.61997 +Ö -9.9612 +; -10.0729 +( -10.0826 +) -10.0839 +X -10.6277 +0 -11.1096 +1 -11.1164 +[ -11.296 +] -11.296 +é -11.3293 +2 -11.4413 +& -12.1488 +3 -12.188 +5 -12.3864 +4 -12.4237 +7 -12.4891 +9 -12.6035 +8 -12.6343 +6 -12.666 +/ -12.9645 +á -13.1043 +ō -13.392 +ó -13.5351 +ñ -13.6151 +ú -13.9028 +í -14.1541 +ā -14.1541 +è -14.2282 +* -14.3953 +ć -14.7137 +à -14.8472 +ê -14.8472 +ë -14.8472 +¡ -15.0014 +ç -15.0014 +ð -15.0014 +ã -15.1837 +č -15.1837 +ū -15.1837 +% -15.4069 +É -15.4069 +â -15.4069 +ø -15.4069 +š -15.4069 +å -15.6945 +ô -15.6945 +ł -15.6945 +œ -15.6945 +ş -15.6945 +Š -15.6945 +_ -16.1 +Î -16.1 +Ó -16.1 +æ -16.1 +ï -16.1 +ă -16.1 +ě -16.1 +ī -16.1 +ı -16.1 +ʻ -16.1 +ʿ -16.1 +π -16.1 +и -16.1 +к -16.1 += -16.7932 +à -16.7932 +Ø -16.7932 +î -16.7932 +û -16.7932 +þ -16.7932 +ċ -16.7932 +Č -16.7932 +ę -16.7932 +ğ -16.7932 +ń -16.7932 +Ō -16.7932 +ő -16.7932 +ř -16.7932 +ž -16.7932 +ǎ -16.7932 +α -16.7932 +В -16.7932 +е -16.7932 +з -16.7932 +й -16.7932 +л -16.7932 +н -16.7932 +ь -16.7932 +я -16.7932 +ṃ -16.7932 +ạ -16.7932 +ụ -16.7932 +→ -16.7932 +≡ -16.7932 +京 -16.7932 +大 -16.7932 +都 -16.7932 +阪 -16.7932 diff --git a/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/config.yaml b/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/config.yaml new file mode 100644 index 0000000..97f25d9 --- /dev/null +++ b/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/config.yaml @@ -0,0 +1,3 @@ +vocab_filename: dict.ltr.txt +src_vocab_filename: dict.km.txt + diff --git a/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.km.txt b/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.km.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.km.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.ltr.txt b/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.ltr.txt new file mode 100644 index 0000000..26a7e6b --- /dev/null +++ b/SpeechLM/dataset/LibriLM/hidden_unit/bin-idx/dict.ltr.txt @@ -0,0 +1,29 @@ +| 803288730 +E 439294199 +T 319071758 +A 277306732 +O 263784364 +N 239361162 +I 237353011 +H 223346762 +S 220175453 +R 203352500 +D 152198685 +L 141597450 +U 98913389 +M 87138757 +C 84680142 +W 81375101 +F 80240665 +G 70642902 +Y 68388038 +P 58436929 +B 52538531 +V 33250231 +K 26906609 +' 9162896 +X 5075632 +J 4746771 +Q 3401794 +Z 2186971 + 1 diff --git a/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/config.yaml b/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/config.yaml new file mode 100644 index 0000000..d6fd3d8 --- /dev/null +++ b/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/config.yaml @@ -0,0 +1,3 @@ +vocab_filename: dict.ltr.txt +src_vocab_filename: dict.phn.txt + diff --git a/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.ltr.txt b/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.ltr.txt new file mode 100644 index 0000000..26a7e6b --- /dev/null +++ b/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.ltr.txt @@ -0,0 +1,29 @@ +| 803288730 +E 439294199 +T 319071758 +A 277306732 +O 263784364 +N 239361162 +I 237353011 +H 223346762 +S 220175453 +R 203352500 +D 152198685 +L 141597450 +U 98913389 +M 87138757 +C 84680142 +W 81375101 +F 80240665 +G 70642902 +Y 68388038 +P 58436929 +B 52538531 +V 33250231 +K 26906609 +' 9162896 +X 5075632 +J 4746771 +Q 3401794 +Z 2186971 + 1 diff --git a/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.phn.txt b/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.phn.txt new file mode 100644 index 0000000..812e4b0 --- /dev/null +++ b/SpeechLM/dataset/LibriLM/phone_unit/bin-idx/dict.phn.txt @@ -0,0 +1,364 @@ + 0 +SIL 1 +SIL_B 2 +SIL_E 3 +SIL_I 4 +SIL_S 5 +SPN 6 +SPN_B 7 +SPN_E 8 +SPN_I 9 +SPN_S 10 +AA_B 11 +AA_E 12 +AA_I 13 +AA_S 14 +AA0_B 15 +AA0_E 16 +AA0_I 17 +AA0_S 18 +AA1_B 19 +AA1_E 20 +AA1_I 21 +AA1_S 22 +AA2_B 23 +AA2_E 24 +AA2_I 25 +AA2_S 26 +AE_B 27 +AE_E 28 +AE_I 29 +AE_S 30 +AE0_B 31 +AE0_E 32 +AE0_I 33 +AE0_S 34 +AE1_B 35 +AE1_E 36 +AE1_I 37 +AE1_S 38 +AE2_B 39 +AE2_E 40 +AE2_I 41 +AE2_S 42 +AH_B 43 +AH_E 44 +AH_I 45 +AH_S 46 +AH0_B 47 +AH0_E 48 +AH0_I 49 +AH0_S 50 +AH1_B 51 +AH1_E 52 +AH1_I 53 +AH1_S 54 +AH2_B 55 +AH2_E 56 +AH2_I 57 +AH2_S 58 +AO_B 59 +AO_E 60 +AO_I 61 +AO_S 62 +AO0_B 63 +AO0_E 64 +AO0_I 65 +AO0_S 66 +AO1_B 67 +AO1_E 68 +AO1_I 69 +AO1_S 70 +AO2_B 71 +AO2_E 72 +AO2_I 73 +AO2_S 74 +AW_B 75 +AW_E 76 +AW_I 77 +AW_S 78 +AW0_B 79 +AW0_E 80 +AW0_I 81 +AW0_S 82 +AW1_B 83 +AW1_E 84 +AW1_I 85 +AW1_S 86 +AW2_B 87 +AW2_E 88 +AW2_I 89 +AW2_S 90 +AY_B 91 +AY_E 92 +AY_I 93 +AY_S 94 +AY0_B 95 +AY0_E 96 +AY0_I 97 +AY0_S 98 +AY1_B 99 +AY1_E 100 +AY1_I 101 +AY1_S 102 +AY2_B 103 +AY2_E 104 +AY2_I 105 +AY2_S 106 +B_B 107 +B_E 108 +B_I 109 +B_S 110 +CH_B 111 +CH_E 112 +CH_I 113 +CH_S 114 +D_B 115 +D_E 116 +D_I 117 +D_S 118 +DH_B 119 +DH_E 120 +DH_I 121 +DH_S 122 +EH_B 123 +EH_E 124 +EH_I 125 +EH_S 126 +EH0_B 127 +EH0_E 128 +EH0_I 129 +EH0_S 130 +EH1_B 131 +EH1_E 132 +EH1_I 133 +EH1_S 134 +EH2_B 135 +EH2_E 136 +EH2_I 137 +EH2_S 138 +ER_B 139 +ER_E 140 +ER_I 141 +ER_S 142 +ER0_B 143 +ER0_E 144 +ER0_I 145 +ER0_S 146 +ER1_B 147 +ER1_E 148 +ER1_I 149 +ER1_S 150 +ER2_B 151 +ER2_E 152 +ER2_I 153 +ER2_S 154 +EY_B 155 +EY_E 156 +EY_I 157 +EY_S 158 +EY0_B 159 +EY0_E 160 +EY0_I 161 +EY0_S 162 +EY1_B 163 +EY1_E 164 +EY1_I 165 +EY1_S 166 +EY2_B 167 +EY2_E 168 +EY2_I 169 +EY2_S 170 +F_B 171 +F_E 172 +F_I 173 +F_S 174 +G_B 175 +G_E 176 +G_I 177 +G_S 178 +HH_B 179 +HH_E 180 +HH_I 181 +HH_S 182 +IH_B 183 +IH_E 184 +IH_I 185 +IH_S 186 +IH0_B 187 +IH0_E 188 +IH0_I 189 +IH0_S 190 +IH1_B 191 +IH1_E 192 +IH1_I 193 +IH1_S 194 +IH2_B 195 +IH2_E 196 +IH2_I 197 +IH2_S 198 +IY_B 199 +IY_E 200 +IY_I 201 +IY_S 202 +IY0_B 203 +IY0_E 204 +IY0_I 205 +IY0_S 206 +IY1_B 207 +IY1_E 208 +IY1_I 209 +IY1_S 210 +IY2_B 211 +IY2_E 212 +IY2_I 213 +IY2_S 214 +JH_B 215 +JH_E 216 +JH_I 217 +JH_S 218 +K_B 219 +K_E 220 +K_I 221 +K_S 222 +L_B 223 +L_E 224 +L_I 225 +L_S 226 +M_B 227 +M_E 228 +M_I 229 +M_S 230 +N_B 231 +N_E 232 +N_I 233 +N_S 234 +NG_B 235 +NG_E 236 +NG_I 237 +NG_S 238 +OW_B 239 +OW_E 240 +OW_I 241 +OW_S 242 +OW0_B 243 +OW0_E 244 +OW0_I 245 +OW0_S 246 +OW1_B 247 +OW1_E 248 +OW1_I 249 +OW1_S 250 +OW2_B 251 +OW2_E 252 +OW2_I 253 +OW2_S 254 +OY_B 255 +OY_E 256 +OY_I 257 +OY_S 258 +OY0_B 259 +OY0_E 260 +OY0_I 261 +OY0_S 262 +OY1_B 263 +OY1_E 264 +OY1_I 265 +OY1_S 266 +OY2_B 267 +OY2_E 268 +OY2_I 269 +OY2_S 270 +P_B 271 +P_E 272 +P_I 273 +P_S 274 +R_B 275 +R_E 276 +R_I 277 +R_S 278 +S_B 279 +S_E 280 +S_I 281 +S_S 282 +SH_B 283 +SH_E 284 +SH_I 285 +SH_S 286 +T_B 287 +T_E 288 +T_I 289 +T_S 290 +TH_B 291 +TH_E 292 +TH_I 293 +TH_S 294 +UH_B 295 +UH_E 296 +UH_I 297 +UH_S 298 +UH0_B 299 +UH0_E 300 +UH0_I 301 +UH0_S 302 +UH1_B 303 +UH1_E 304 +UH1_I 305 +UH1_S 306 +UH2_B 307 +UH2_E 308 +UH2_I 309 +UH2_S 310 +UW_B 311 +UW_E 312 +UW_I 313 +UW_S 314 +UW0_B 315 +UW0_E 316 +UW0_I 317 +UW0_S 318 +UW1_B 319 +UW1_E 320 +UW1_I 321 +UW1_S 322 +UW2_B 323 +UW2_E 324 +UW2_I 325 +UW2_S 326 +V_B 327 +V_E 328 +V_I 329 +V_S 330 +W_B 331 +W_E 332 +W_I 333 +W_S 334 +Y_B 335 +Y_E 336 +Y_I 337 +Y_S 338 +Z_B 339 +Z_E 340 +Z_I 341 +Z_S 342 +ZH_B 343 +ZH_E 344 +ZH_I 345 +ZH_S 346 +#0 347 +#1 348 +#2 349 +#3 350 +#4 351 +#5 352 +#6 353 +#7 354 +#8 355 +#9 356 +#10 357 +#11 358 +#12 359 +#13 360 +#14 361 +#15 362 +#16 363 diff --git a/SpeechLM/dataset/LibriSpeech/asr/dict.ltr.txt b/SpeechLM/dataset/LibriSpeech/asr/dict.ltr.txt new file mode 100644 index 0000000..26a7e6b --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/asr/dict.ltr.txt @@ -0,0 +1,29 @@ +| 803288730 +E 439294199 +T 319071758 +A 277306732 +O 263784364 +N 239361162 +I 237353011 +H 223346762 +S 220175453 +R 203352500 +D 152198685 +L 141597450 +U 98913389 +M 87138757 +C 84680142 +W 81375101 +F 80240665 +G 70642902 +Y 68388038 +P 58436929 +B 52538531 +V 33250231 +K 26906609 +' 9162896 +X 5075632 +J 4746771 +Q 3401794 +Z 2186971 + 1 diff --git a/SpeechLM/dataset/LibriSpeech/asr/train_sample100.ltr b/SpeechLM/dataset/LibriSpeech/asr/train_sample100.ltr new file mode 100644 index 0000000..ab9ab39 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/asr/train_sample100.ltr @@ -0,0 +1,100 @@ +C H A P T E R | O N E | M I S S U S | R A C H E L | L Y N D E | I S | S U R P R I S E D | M I S S U S | R A C H E L | L Y N D E | L I V E D | J U S T | W H E R E | T H E | A V O N L E A | M A I N | R O A D | D I P P E D | D O W N | I N T O | A | L I T T L E | H O L L O W | F R I N G E D | W I T H | A L D E R S | A N D | L A D I E S | E A R D R O P S | A N D | T R A V E R S E D | B Y | A | B R O O K | +T H A T | H A D | I T S | S O U R C E | A W A Y | B A C K | I N | T H E | W O O D S | O F | T H E | O L D | C U T H B E R T | P L A C E | I T | W A S | R E P U T E D | T O | B E | A N | I N T R I C A T E | H E A D L O N G | B R O O K | I N | I T S | E A R L I E R | C O U R S E | T H R O U G H | T H O S E | W O O D S | W I T H | D A R K | S E C R E T S | O F | P O O L | A N D | C A S C A D E | B U T | B Y | T H E | T I M E | I T | R E A C H E D | L Y N D E ' S | H O L L O W | I T | W A S | A | Q U I E T | W E L L | C O N D U C T E D | L I T T L E | S T R E A M | +F O R | N O T | E V E N | A | B R O O K | C O U L D | R U N | P A S T | M I S S U S | R A C H E L | L Y N D E ' S | D O O R | W I T H O U T | D U E | R E G A R D | F O R | D E C E N C Y | A N D | D E C O R U M | I T | P R O B A B L Y | W A S | C O N S C I O U S | T H A T | M I S S U S | R A C H E L | W A S | S I T T I N G | A T | H E R | W I N D O W | K E E P I N G | A | S H A R P | E Y E | O N | E V E R Y T H I N G | T H A T | P A S S E D | F R O M | B R O O K S | A N D | C H I L D R E N | U P | +A N D | T H A T | I F | S H E | N O T I C E D | A N Y T H I N G | O D D | O R | O U T | O F | P L A C E | S H E | W O U L D | N E V E R | R E S T | U N T I L | S H E | H A D | F E R R E T E D | O U T | T H E | W H Y S | A N D | W H E R E F O R E S | T H E R E O F | T H E R E | A R E | P L E N T Y | O F | P E O P L E | I N | A V O N L E A | A N D | O U T | O F | I T | W H O | C A N | A T T E N D | C L O S E L Y | T O | T H E I R | N E I G H B O R ' S | B U S I N E S S | B Y | D I N T | O F | N E G L E C T I N G | T H E I R | O W N | +B U T | M I S S U S | R A C H E L | L Y N D E | W A S | O N E | O F | T H O S E | C A P A B L E | C R E A T U R E S | W H O | C A N | M A N A G E | T H E I R | O W N | C O N C E R N S | A N D | T H O S E | O F | O T H E R | F O L K S | I N T O | T H E | B A R G A I N | S H E | W A S | A | N O T A B L E | H O U S E W I F E | H E R | W O R K | W A S | A L W A Y S | D O N E | A N D | W E L L | D O N E | S H E | R A N | T H E | S E W I N G | C I R C L E | +H E L P E D | R U N | T H E | S U N D A Y | S C H O O L | A N D | W A S | T H E | S T R O N G E S T | P R O P | O F | T H E | C H U R C H | A I D | S O C I E T Y | A N D | F O R E I G N | M I S S I O N S | A U X I L I A R Y | Y E T | W I T H | A L L | T H I S | M I S S U S | R A C H E L | F O U N D | A B U N D A N T | T I M E | T O | S I T | F O R | H O U R S | A T | H E R | K I T C H E N | W I N D O W | K N I T T I N G | C O T T O N | W A R P | Q U I L T S | S H E | H A D | K N I T T E D | S I X T E E N | O F | T H E M | +A S | A V O N L E A | H O U S E K E E P E R S | W E R E | W O N T | T O | T E L L | I N | A W E D | V O I C E S | A N D | K E E P I N G | A | S H A R P | E Y E | O N | T H E | M A I N | R O A D | T H A T | C R O S S E D | T H E | H O L L O W | A N D | W O U N D | U P | T H E | S T E E P | R E D | H I L L | B E Y O N D | +A N Y B O D Y | W H O | W E N T | O U T | O F | I T | O R | I N T O | I T | H A D | T O | P A S S | O V E R | T H A T | H I L L | R O A D | A N D | S O | R U N | T H E | U N S E E N | G A U N T L E T | O F | M I S S U S | R A C H E L ' S | A L L | S E E I N G | E Y E | S H E | W A S | S I T T I N G | T H E R E | O N E | A F T E R N O O N | I N | E A R L Y | J U N E | T H E | S U N | W A S | C O M I N G | I N | A T | T H E | W I N D O W | W A R M | A N D | B R I G H T | +T H E | O R C H A R D | O N | T H E | S L O P E | B E L O W | T H E | H O U S E | W A S | I N | A | B R I D A L | F L U S H | O F | P I N K Y | W H I T E | B L O O M | H U M M E D | O V E R | B Y | A | M Y R I A D | O F | B E E S | T H O M A S | L Y N D E | A | M E E K | L I T T L E | M A N | W H O M | A V O N L E A | P E O P L E | C A L L E D | R A C H E L | L Y N D E ' S | H U S B A N D | W A S | S O W I N G | H I S | L A T E | T U R N I P | S E E D | O N | T H E | H I L L | F I E L D | B E Y O N D | T H E | B A R N | +M I S S U S | R A C H E L | K N E W | T H A T | H E | O U G H T | B E C A U S E | S H E | H A D | H E A R D | H I M | T E L L | P E T E R | M O R R I S O N | T H E | E V E N I N G | B E F O R E | I N | W I L L I A M | J | B L A I R ' S | S T O R E | O V E R | A T | C A R M O D Y | T H A T | H E | M E A N T | T O | S O W | H I S | T U R N I P | S E E D | T H E | N E X T | A F T E R N O O N | +P E T E R | H A D | A S K E D | H I M | O F | C O U R S E | F O R | M A T T H E W | C U T H B E R T | H A D | N E V E R | B E E N | K N O W N | T O | V O L U N T E E R | I N F O R M A T I O N | A B O U T | A N Y T H I N G | I N | H I S | W H O L E | L I F E | A N D | Y E T | H E R E | W A S | M A T T H E W | C U T H B E R T | A T | H A L F | P A S T | T H R E E | O N | T H E | A F T E R N O O N | O F | A | B U S Y | D A Y | P L A C I D L Y | D R I V I N G | O V E R | T H E | H O L L O W | A N D | U P | T H E | H I L L | +A N D | H I S | B E S T | S U I T | O F | C L O T H E S | W H I C H | W A S | P L A I N | P R O O F | T H A T | H E | W A S | G O I N G | O U T | O F | A V O N L E A | A N D | H E | H A D | T H E | B U G G Y | A N D | T H E | S O R R E L | M A R E | W H I C H | B E T O K E N E D | T H A T | H E | W A S | G O I N G | A | C O N S I D E R A B L E | D I S T A N C E | N O W | W H E R E | W A S | M A T T H E W | C U T H B E R T | G O I N G | A N D | W H Y | W A S | H E | G O I N G | T H E R E | +H A D | I T | B E E N | A N Y | O T H E R | M A N | I N | A V O N L E A | M I S S U S | R A C H E L | D E F T L Y | P U T T I N G | T H I S | A N D | T H A T | T O G E T H E R | M I G H T | H A V E | G I V E N | A | P R E T T Y | G O O D | G U E S S | A S | T O | B O T H | Q U E S T I O N S | B U T | M A T T H E W | S O | R A R E L Y | W E N T | F R O M | H O M E | T H A T | I T | M U S T | B E | S O M E T H I N G | P R E S S I N G | A N D | U N U S U A L | W H I C H | W A S | T A K I N G | H I M | +H E | W A S | T H E | S H Y E S T | M A N | A L I V E | A N D | H A T E D | T O | H A V E | T O | G O | A M O N G | S T R A N G E R S | O R | T O | A N Y | P L A C E | W H E R E | H E | M I G H T | H A V E | T O | T A L K | M A T T H E W | D R E S S E D | U P | W I T H | A | W H I T E | C O L L A R | A N D | D R I V I N G | I N | A | B U G G Y | W A S | S O M E T H I N G | T H A T | D I D N ' T | H A P P E N | O F T E N | M I S S U S | R A C H E L | P O N D E R | A S | S H E | M I G H T | C O U L D | M A K E | N O T H I N G | O F | I T | +A N D | H E R | A F T E R N O O N ' S | E N J O Y M E N T | W A S | S P O I L E D | I ' L L | J U S T | S T E P | O V E R | T O | G R E E N | G A B L E S | A F T E R | T E A | A N D | F I N D | O U T | F R O M | M A R I L L A | W H E R E | H E ' S | G O N E | A N D | W H Y | T H E | W O R T H Y | W O M A N | F I N A L L Y | C O N C L U D E D | H E | D O E S N ' T | G E N E R A L L Y | G O | T O | T O W N | T H I S | T I M E | O F | Y E A R | A N D | H E | N E V E R | V I S I T S | +I F | H E ' D | R U N | O U T | O F | T U R N I P | S E E D | H E | W O U L D N ' T | D R E S S | U P | A N D | T A K E | T H E | B U G G Y | T O | G O | F O R | M O R E | +Y E T | S O M E T H I N G | M U S T | H A V E | H A P P E N E D | S I N C E | L A S T | N I G H T | T O | S T A R T | H I M | O F F | I ' M | C L E A N | P U Z Z L E D | T H A T ' S | W H A T | A N D | I | W O N ' T | K N O W | A | M I N U T E ' S | P E A C E | O F | M I N D | O R | C O N S C I E N C E | U N T I L | I | K N O W | W H A T | H A S | T A K E N | M A T T H E W | C U T H B E R T | O U T | O F | A V O N L E A | T O D A Y | A C C O R D I N G L Y | A F T E R | T E A | M I S S U S | R A C H E L | S E T | O U T | S H E | H A D | N O T | F A R | T O | G O | +T H E | B I G | R A M B L I N G | O R C H A R D | E M B O W E R E D | H O U S E | W H E R E | T H E | C U T H B E R T S | L I V E D | W A S | A | S C A N T | Q U A R T E R | O F | A | M I L E | U P | T H E | R O A D | F R O M | L Y N D E ' S | H O L L O W | T O | B E | S U R E | T H E | L O N G | L A N E | M A D E | I T | A | G O O D | D E A L | F U R T H E R | M A T T H E W | C U T H B E R T ' S | F A T H E R | A S | S H Y | A N D | S I L E N T | A S | H I S | S O N | A F T E R | H I M | +H A D | G O T | A S | F A R | A W A Y | A S | H E | P O S S I B L Y | C O U L D | F R O M | H I S | F E L L O W | M E N | W I T H O U T | A C T U A L L Y | R E T R E A T I N G | I N T O | T H E | W O O D S | W H E N | H E | F O U N D E D | H I S | H O M E S T E A D | G R E E N | G A B L E S | W A S | B U I L T | A T | T H E | F U R T H E S T | E D G E | O F | H I S | C L E A R E D | L A N D | A N D | T H E R E | I T | W A S | T O | T H I S | D A Y | +B A R E L Y | V I S I B L E | F R O M | T H E | M A I N | R O A D | A L O N G | W H I C H | A L L | T H E | O T H E R | A V O N L E A | H O U S E S | W E R E | S O | S O C I A B L Y | S I T U A T E D | M I S S U S | R A C H E L | L Y N D E | D I D | N O T | C A L L | L I V I N G | I N | S U C H | A | P L A C E | L I V I N G | A T | A L L | I T ' S | J U S T | S T A Y I N G | T H A T ' S | W H A T | S H E | S A I D | A S | S H E | S T E P P E D | A L O N G | T H E | D E E P | R U T T E D | G R A S S Y | L A N E | +B O R D E R E D | W I T H | W I L D | R O S E | B U S H E S | I T ' S | N O | W O N D E R | M A T T H E W | A N D | M A R I L L A | A R E | B O T H | A | L I T T L E | O D D | L I V I N G | A W A Y | B A C K | H E R E | B Y | T H E M S E L V E S | T R E E S | A R E N ' T | M U C H | C O M P A N Y | T H O U G H | D E A R | K N O W S | I F | T H E Y | W E R E | T H E R E ' D | B E | E N O U G H | O F | T H E M | I ' D | R U T H E R | L O O K | A T | P E O P L E | T O | B E | S U R E | +T H E Y | S E E M | C O N T E N T E D | E N O U G H | B U T | T H E N | I | S U P P O S E | T H E Y ' R E | U S E D | T O | I T | A | B O D Y | C A N | G E T | U S E D | T O | A N Y T H I N G | E V E N | T O | B E I N G | H A N G E D | A S | T H E | I R I S H M A N | S A I D | W I T H | T H I S | M I S S U S | R A C H E L | S T E P P E D | O U T | O F | T H E | L A N E | I N T O | T H E | B A C K Y A R D | O F | G R E E N | G A B L E S | V E R Y | G R E E N | A N D | N E A T | A N D | P R E C I S E | W A S | T H A T | Y A R D | +S E T | A B O U T | O N | O N E | S I D E | W I T H | G R E A T | P A T R I A R C H A L | W I L L O W S | A N D | T H E | O T H E R | W I T H | P R I M | L O M B A R D I E S | N O T | A | S T R A Y | S T I C K | N O R | S T O N E | W A S | T O | B E | S E E N | F O R | M I S S U S | R A C H E L | W O U L D | H A V E | S E E N | I T | I F | T H E R E | H A D | B E E N | P R I V A T E L Y | S H E | W A S | O F | T H E | O P I N I O N | T H A T | M A R I L L A | C U T H B E R T | S W E P T | T H A T | Y A R D | O V E R | A S | O F T E N | A S | S H E | S W E P T | H E R | H O U S E | +O N E | C O U L D | H A V E | E A T E N | A | M E A L | O F F | T H E | G R O U N D | W I T H O U T | O V E R B R I M M I N G | T H E | P R O V E R B I A L | P E C K | O F | D I R T | M I S S U S | R A C H E L | R A P P E D | S M A R T L Y | A T | T H E | K I T C H E N | D O O R | A N D | S T E P P E D | I N | W H E N | B I D D E N | T O | D O | S O | T H E | K I T C H E N | A T | G R E E N | G A B L E S | W A S | A | C H E E R F U L | A P A R T M E N T | +O R | W O U L D | H A V E | B E E N | C H E E R F U L | I F | I T | H A D | N O T | B E E N | S O | P A I N F U L L Y | C L E A N | A S | T O | G I V E | I T | S O M E T H I N G | O F | T H E | A P P E A R A N C E | O F | A N | U N U S E D | P A R L O R | I T S | W I N D O W S | L O O K E D | E A S T | A N D | W E S T | T H R O U G H | T H E | W E S T | O N E | L O O K I N G | O U T | O N | T H E | B A C K | Y A R D | C A M E | A | F L O O D | O F | M E L L O W | J U N E | S U N L I G H T | B U T | T H E | E A S T | O N E | +W H E N C E | Y O U | G O T | A | G L I M P S E | O F | T H E | B L O O M | W H I T E | C H E R R Y | T R E E S | I N | T H E | L E F T | O R C H A R D | A N D | N O D D I N G | S L E N D E R | B I R C H E S | D O W N | I N | T H E | H O L L O W | B Y | T H E | B R O O K | W A S | G R E E N E D | O V E R | B Y | A | T A N G L E | O F | V I N E S | H E R E | S A T | M A R I L L A | C U T H B E R T | W H E N | S H E | S A T | A T | A L L | A L W A Y S | S L I G H T L Y | D I S T R U S T F U L | O F | S U N S H I N E | +A N D | H E R E | S H E | S A T | N O W | K N I T T I N G | A N D | T H E | T A B L E | B E H I N D | H E R | W A S | L A I D | F O R | S U P P E R | M I S S U S | R A C H E L | B E F O R E | S H E | H A D | F A I R L Y | C L O S E D | T H E | D O O R | +T H E R E | W E R E | T H R E E | P L A T E S | L A I D | S O | T H A T | M A R I L L A | M U S T | B E | E X P E C T I N G | S O M E | O N E | H O M E | W I T H | M A T T H E W | T O | T E A | B U T | T H E | D I S H E S | W E R E | E V E R Y D A Y | D I S H E S | A N D | T H E R E | W A S | O N L Y | C R A B | A P P L E | P R E S E R V E S | A N D | O N E | K I N D | O F | C A K E | S O | T H A T | T H E | E X P E C T E D | C O M P A N Y | C O U L D | N O T | B E | A N Y | P A R T I C U L A R | C O M P A N Y | +Y E T | W H A T | O F | M A T T H E W ' S | W H I T E | C O L L A R | A N D | T H E | S O R R E L | M A R E | M I S S U S | R A C H E L | W A S | G E T T I N G | F A I R L Y | D I Z Z Y | W I T H | T H I S | U N U S U A L | M Y S T E R Y | A B O U T | Q U I E T | U N M Y S T E R I O U S | G R E E N | G A B L E S | G O O D | E V E N I N G | R A C H E L | M A R I L L A | S A I D | B R I S K L Y | T H I S | I S | A | R E A L | F I N E | E V E N I N G | I S N ' T | I T | W O N ' T | Y O U | S I T | D O W N | +H O W | A R E | A L L | Y O U R | F O L K S | S O M E T H I N G | T H A T | F O R | L A C K | O F | A N Y | O T H E R | N A M E | M I G H T | B E | C A L L E D | F R I E N D S H I P | E X I S T E D | A N D | A L W A Y S | H A D | E X I S T E D | B E T W E E N | M A R I L L A | C U T H B E R T | A N D | M I S S U S | R A C H E L | I N | S P I T E | O F | O R | P E R H A P S | B E C A U S E | O F | T H E I R | D I S S I M I L A R I T Y | M A R I L L A | W A S | A | T A L L | +T H I N | W O M A N | W I T H | A N G L E S | A N D | W I T H O U T | C U R V E S | H E R | D A R K | H A I R | S H O W E D | S O M E | G R A Y | S T R E A K S | A N D | W A S | A L W A Y S | T W I S T E D | U P | I N | A | H A R D | L I T T L E | K N O T | B E H I N D | W I T H | T W O | W I R E | H A I R P I N S | S T U C K | A G G R E S S I V E L Y | T H R O U G H | I T | S H E | L O O K E D | L I K E | A | W O M A N | O F | N A R R O W | E X P E R I E N C E | A N D | R I G I D | C O N S C I E N C E | W H I C H | S H E | W A S | +B U T | T H E R E | W A S | A | S A V I N G | S O M E T H I N G | A B O U T | H E R | M O U T H | W H I C H | I F | I T | H A D | B E E N | E V E R | S O | S L I G H T L Y | D E V E L O P E D | M I G H T | H A V E | B E E N | C O N S I D E R E D | I N D I C A T I V E | O F | A | S E N S E | O F | H U M O R | W E ' R E | A L L | P R E T T Y | W E L L | S A I D | M I S S U S | R A C H E L | I | W A S | K I N D | O F | A F R A I D | Y O U | W E R E N ' T | T H O U G H | W H E N | I | S A W | M A T T H E W | S T A R T I N G | O F F | T O D A Y | I | T H O U G H T | M A Y B E | H E | W A S | G O I N G | T O | T H E | D O C T O R ' S | +M A R I L L A ' S | L I P S | T W I T C H E D | U N D E R S T A N D I N G L Y | S H E | H A D | E X P E C T E D | M I S S U S | R A C H E L | U P | S H E | H A D | K N O W N | T H A T | T H E | S I G H T | O F | M A T T H E W | J A U N T I N G | O F F | S O | U N A C C O U N T A B L Y | W O U L D | B E | T O O | M U C H | F O R | H E R | N E I G H B O R ' S | C U R I O S I T Y | O H | N O | I ' M | Q U I T E | W E L L | A L T H O U G H | I | H A D | A | B A D | H E A D A C H E | Y E S T E R D A Y | S H E | S A I D | +M A T T H E W | W E N T | T O | B R I G H T | R I V E R | W E ' R E | G E T T I N G | A | L I T T L E | B O Y | F R O M | A N | O R P H A N | A S Y L U M | I N | N O V A | S C O T I A | A N D | H E ' S | C O M I N G | O N | T H E | T R A I N | T O N I G H T | I F | M A R I L L A | H A D | S A I D | T H A T | M A T T H E W | H A D | G O N E | T O | B R I G H T | R I V E R | T O | M E E T | A | K A N G A R O O | F R O M | A U S T R A L I A | M I S S U S | R A C H E L | C O U L D | N O T | H A V E | B E E N | M O R E | A S T O N I S H E D | +S H E | W A S | A C T U A L L Y | S T R I C K E N | D U M B | F O R | F I V E | S E C O N D S | I T | W A S | U N S U P P O S A B L E | T H A T | M A R I L L A | W A S | M A K I N G | F U N | O F | H E R | B U T | M I S S U S | R A C H E L | W A S | A L M O S T | F O R C E D | T O | S U P P O S E | I T | A R E | Y O U | I N | E A R N E S T | M A R I L L A | S H E | D E M A N D E D | W H E N | V O I C E | R E T U R N E D | T O | H E R | Y E S | O F | C O U R S E | +S A I D | M A R I L L A | A S | I F | G E T T I N G | B O Y S | F R O M | O R P H A N | A S Y L U M S | I N | N O V A | S C O T I A | W E R E | P A R T | O F | T H E | U S U A L | S P R I N G | W O R K | O N | A N Y | W E L L | R E G U L A T E D | A V O N L E A | F A R M | I N S T E A D | O F | B E I N G | A N | U N H E A R D | O F | I N N O V A T I O N | M I S S U S | R A C H E L | F E L T | T H A T | S H E | H A D | R E C E I V E D | A | S E V E R E | M E N T A L | J O L T | S H E | T H O U G H T | I N | E X C L A M A T I O N | P O I N T S | +M A R I L L A | A N D | M A T T H E W | C U T H B E R T | O F | A L L | P E O P L E | A D O P T I N G | A | B O Y | F R O M | A N | O R P H A N | A S Y L U M | W E L L | T H E | W O R L D | W A S | C E R T A I N L Y | T U R N I N G | U P S I D E | D O W N | S H E | W O U L D | B E | S U R P R I S E D | A T | N O T H I N G | A F T E R | T H I S | N O T H I N G | +W H A T | O N | E A R T H | P U T | S U C H | A | N O T I O N | I N T O | Y O U R | H E A D | S H E | D E M A N D E D | D I S A P P R O V I N G L Y | T H I S | H A D | B E E N | D O N E | W I T H O U T | H E R | A D V I C E | B E I N G | A S K E D | A N D | M U S T | P E R F O R C E | B E | D I S A P P R O V E D | W E L L | W E ' V E | B E E N | T H I N K I N G | A B O U T | I T | F O R | S O M E | T I M E | A L L | W I N T E R | I N | F A C T | R E T U R N E D | M A R I L L A | +M I S S U S | A L E X A N D E R | S P E N C E R | W A S | U P | H E R E | O N E | D A Y | B E F O R E | C H R I S T M A S | A N D | S H E | S A I D | S H E | W A S | G O I N G | T O | G E T | A | L I T T L E | G I R L | F R O M | T H E | A S Y L U M | O V E R | I N | H O P E T O N | I N | T H E | S P R I N G | +S O | M A T T H E W | A N D | I | H A V E | T A L K E D | I T | O V E R | O F F | A N D | O N | E V E R | S I N C E | W E | T H O U G H T | W E ' D | G E T | A | B O Y | M A T T H E W | I S | G E T T I N G | U P | I N | Y E A R S | Y O U | K N O W | H E ' S | S I X T Y | A N D | H E | I S N ' T | S O | S P R Y | A S | H E | O N C E | W A S | H I S | H E A R T | T R O U B L E S | H I M | A | G O O D | D E A L | A N D | Y O U | K N O W | H O W | D E S P E R A T E | H A R D | I T ' S | G O T | T O | B E | T O | G E T | H I R E D | H E L P | +T H E R E ' S | N E V E R | A N Y B O D Y | T O | B E | H A D | B U T | T H O S E | S T U P I D | H A L F | G R O W N | L I T T L E | F R E N C H | B O Y S | A N D | A S | S O O N | A S | Y O U | D O | G E T | O N E | B R O K E | I N T O | Y O U R | W A Y S | A N D | T A U G H T | S O M E T H I N G | H E ' S | U P | A N D | O F F | T O | T H E | L O B S T E R | C A N N E R I E S | O R | T H E | S T A T E S | A T | F I R S T | M A T T H E W | S U G G E S T E D | G E T T I N G | A | H O M E | B O Y | B U T | I | S A I D | N O | F L A T | T O | T H A T | +T H E Y | M A Y | B E | A L L | R I G H T | I ' M | N O T | S A Y I N G | T H E Y ' R E | N O T | B U T | N O | L O N D O N | S T R E E T | A R A B S | F O R | M E | I | S A I D | G I V E | M E | A | N A T I V E | B O R N | A T | L E A S T | T H E R E ' L L | B E | A | R I S K | N O | M A T T E R | W H O | W E | G E T | B U T | I ' L L | F E E L | E A S I E R | I N | M Y | M I N D | A N D | S L E E P | S O U N D E R | A T | N I G H T S | I F | W E | G E T | A | B O R N | C A N A D I A N | +S O | I N | T H E | E N D | W E | D E C I D E D | T O | A S K | M I S S U S | S P E N C E R | T O | P I C K | U S | O U T | O N E | W H E N | S H E | W E N T | O V E R | T O | G E T | H E R | L I T T L E | G I R L | W E | H E A R D | L A S T | W E E K | S H E | W A S | G O I N G | S O | W E | S E N T | H E R | W O R D | B Y | R I C H A R D | S P E N C E R ' S | F O L K S | A T | C A R M O D Y | T O | B R I N G | U S | A | S M A R T | L I K E L Y | B O Y | O F | A B O U T | T E N | O R | E L E V E N | W E | D E C I D E D | T H A T | W O U L D | B E | T H E | B E S T | A G E | +O L D | E N O U G H | T O | B E | O F | S O M E | U S E | I N | D O I N G | C H O R E S | R I G H T | O F F | A N D | Y O U N G | E N O U G H | T O | B E | T R A I N E D | U P | P R O P E R | W E | M E A N | T O | G I V E | H I M | A | G O O D | H O M E | A N D | S C H O O L I N G | W E | H A D | A | T E L E G R A M | F R O M | M I S S U S | A L E X A N D E R | S P E N C E R | T O D A Y | T H E | M A I L | M A N | B R O U G H T | I T | F R O M | T H E | S T A T I O N | S A Y I N G | T H E Y | W E R E | C O M I N G | O N | T H E | F I V E | T H I R T Y | T R A I N | T O N I G H T | +S O | M A T T H E W | W E N T | T O | B R I G H T | R I V E R | T O | M E E T | H I M | M I S S U S | S P E N C E R | W I L L | D R O P | H I M | O F F | T H E R E | O F | C O U R S E | S H E | G O E S | O N | T O | W H I T E | S A N D S | S T A T I O N | H E R S E L F | M I S S U S | R A C H E L | P R I D E D | H E R S E L F | O N | A L W A Y S | S P E A K I N G | H E R | M I N D | S H E | P R O C E E D E D | T O | S P E A K | I T | N O W | H A V I N G | A D J U S T E D | H E R | M E N T A L | A T T I T U D E | T O | T H I S | A M A Z I N G | P I E C E | O F | N E W S | +W E L L | M A R I L L A | I ' L L | J U S T | T E L L | Y O U | P L A I N | T H A T | I | T H I N K | Y O U ' R E | D O I N G | A | M I G H T Y | F O O L I S H | T H I N G | A | R I S K Y | T H I N G | T H A T ' S | W H A T | Y O U | D O N ' T | K N O W | W H A T | Y O U ' R E | G E T T I N G | Y O U ' R E | B R I N G I N G | A | S T R A N G E | C H I L D | I N T O | Y O U R | H O U S E | A N D | H O M E | A N D | Y O U | D O N ' T | K N O W | A | S I N G L E | T H I N G | A B O U T | H I M | N O R | W H A T | H I S | D I S P O S I T I O N | I S | L I K E | N O R | W H A T | S O R T | O F | P A R E N T S | H E | H A D | +N O R | H O W | H E ' S | L I K E L Y | T O | T U R N | O U T | W H Y | I T | W A S | O N L Y | L A S T | W E E K | I | R E A D | I N | T H E | P A P E R | H O W | A | M A N | A N D | H I S | W I F E | U P | W E S T | O F | T H E | I S L A N D | T O O K | A | B O Y | O U T | O F | A N | O R P H A N | A S Y L U M | A N D | H E | S E T | F I R E | T O | T H E | H O U S E | A T | N I G H T | S E T | I T | O N | P U R P O S E | M A R I L L A | A N D | N E A R L Y | B U R N T | T H E M | T O | A | C R I S P | I N | T H E I R | B E D S | +A N D | I | K N O W | A N O T H E R | C A S E | W H E R E | A N | A D O P T E D | B O Y | U S E D | T O | S U C K | T H E | E G G S | T H E Y | C O U L D N ' T | B R E A K | H I M | O F | I T | I F | Y O U | H A D | A S K E D | M Y | A D V I C E | I N | T H E | M A T T E R | W H I C H | Y O U | D I D N ' T | D O | M A R I L L A | I ' D | H A V E | S A I D | F O R | M E R C Y ' S | S A K E | N O T | T O | T H I N K | O F | S U C H | A | T H I N G | T H A T ' S | W H A T | +T H I S | J O B ' S | C O M F O R T I N G | S E E M E D | N E I T H E R | T O | O F F E N D | N O R | T O | A L A R M | M A R I L L A | S H E | K N I T T E D | S T E A D I L Y | O N | I | D O N ' T | D E N Y | T H E R E ' S | S O M E T H I N G | I N | W H A T | Y O U | S A Y | R A C H E L | I ' V E | H A D | S O M E | Q U A L M S | M Y S E L F | B U T | M A T T H E W | W A S | T E R R I B L E | S E T | O N | I T | I | C O U L D | S E E | T H A T | S O | I | G A V E | I N | +I T ' S | S O | S E L D O M | M A T T H E W | S E T S | H I S | M I N D | O N | A N Y T H I N G | T H A T | W H E N | H E | D O E S | I | A L W A Y S | F E E L | I T ' S | M Y | D U T Y | T O | G I V E | I N | A N D | A S | F O R | T H E | R I S K | T H E R E ' S | R I S K S | I N | P R E T T Y | N E A R | E V E R Y T H I N G | A | B O D Y | D O E S | I N | T H I S | W O R L D | T H E R E ' S | R I S K S | I N | P E O P L E ' S | H A V I N G | C H I L D R E N | O F | T H E I R | O W N | I F | I T | C O M E S | T O | T H A T | T H E Y | D O N ' T | A L W A Y S | T U R N | O U T | W E L L | +A N D | T H E N | N O V A | S C O T I A | I S | R I G H T | C L O S E | T O | T H E | I S L A N D | I T | I S N ' T | A S | I F | W E | W E R E | G E T T I N G | H I M | F R O M | E N G L A N D | O R | T H E | S T A T E S | H E | C A N ' T | B E | M U C H | D I F F E R E N T | F R O M | O U R S E L V E S | W E L L | I | H O P E | I T | W I L L | T U R N | O U T | A L L | R I G H T | S A I D | M I S S U S | R A C H E L | I N | A | T O N E | T H A T | P L A I N L Y | I N D I C A T E D | H E R | P A I N F U L | D O U B T S | +O N L Y | D O N ' T | S A Y | I | D I D N ' T | W A R N | Y O U | I F | H E | B U R N S | G R E E N | G A B L E S | D O W N | O R | P U T S | S T R Y C H N I N E | I N | T H E | W E L L | I | H E A R D | O F | A | C A S E | O V E R | I N | N E W | B R U N S W I C K | W H E R E | A N | O R P H A N | A S Y L U M | C H I L D | D I D | T H A T | A N D | T H E | W H O L E | F A M I L Y | D I E D | I N | F E A R F U L | A G O N I E S | O N L Y | I T | W A S | A | G I R L | I N | T H A T | I N S T A N C E | W E L L | W E ' R E | N O T | G E T T I N G | A | G I R L | S A I D | M A R I L L A | +A S | I F | P O I S O N I N G | W E L L S | W E R E | A | P U R E L Y | F E M I N I N E | A C C O M P L I S H M E N T | A N D | N O T | T O | B E | D R E A D E D | I N | T H E | C A S E | O F | A | B O Y | I ' D | N E V E R | D R E A M | O F | T A K I N G | A | G I R L | T O | B R I N G | U P | I | W O N D E R | A T | M I S S U S | A L E X A N D E R | S P E N C E R | F O R | D O I N G | I T | B U T | T H E R E | S H E | W O U L D N ' T | S H R I N K | F R O M | A D O P T I N G | A | W H O L E | O R P H A N | A S Y L U M | I F | S H E | T O O K | I T | I N T O | H E R | H E A D | +M I S S U S | R A C H E L | W O U L D | H A V E | L I K E D | T O | S T A Y | U N T I L | M A T T H E W | C A M E | H O M E | W I T H | H I S | I M P O R T E D | O R P H A N | B U T | R E F L E C T I N G | T H A T | I T | W O U L D | B E | A | G O O D | T W O | H O U R S | A T | L E A S T | B E F O R E | H I S | A R R I V A L | S H E | C O N C L U D E D | T O | G O | U P | T H E | R O A D | T O | R O B E R T | B E L L ' S | A N D | T E L L | T H E | N E W S | I T | W O U L D | C E R T A I N L Y | M A K E | A | S E N S A T I O N | S E C O N D | T O | N O N E | +A N D | M I S S U S | R A C H E L | D E A R L Y | L O V E D | T O | M A K E | A | S E N S A T I O N | S O | S H E | T O O K | H E R S E L F | A W A Y | S O M E W H A T | T O | M A R I L L A ' S | R E L I E F | F O R | T H E | L A T T E R | F E L T | H E R | D O U B T S | A N D | F E A R S | R E V I V I N G | U N D E R | T H E | I N F L U E N C E | O F | M I S S U S | R A C H E L ' S | P E S S I M I S M | W E L L | O F | A L L | T H I N G S | T H A T | E V E R | W E R E | O R | W I L L | B E | E J A C U L A T E D | M I S S U S | R A C H E L | W H E N | S H E | W A S | S A F E L Y | O U T | I N | T H E | L A N E | +I T | D O E S | R E A L L Y | S E E M | A S | I F | I | M U S T | B E | D R E A M I N G | W E L L | I ' M | S O R R Y | F O R | T H A T | P O O R | Y O U N G | O N E | A N D | N O | M I S T A K E | M A T T H E W | A N D | M A R I L L A | D O N ' T | K N O W | A N Y T H I N G | A B O U T | C H I L D R E N | A N D | T H E Y ' L L | E X P E C T | H I M | T O | B E | W I S E R | A N D | S T E A D I E R | T H A T | H I S | O W N | G R A N D F A T H E R | +I T | S E E M S | U N C A N N Y | T O | T H I N K | O F | A | C H I L D | A T | G R E E N | G A B L E S | S O M E H O W | T H E R E ' S | N E V E R | B E E N | O N E | T H E R E | F O R | M A T T H E W | A N D | M A R I L L A | W E R E | G R O W N | U P | W H E N | T H E | N E W | H O U S E | W A S | B U I L T | I F | T H E Y | E V E R | W E R E | C H I L D R E N | W H I C H | I S | H A R D | T O | B E L I E V E | W H E N | O N E | L O O K S | A T | T H E M | I | W O U L D N ' T | B E | I N | T H A T | O R P H A N ' S | S H O E S | F O R | A N Y T H I N G | +M Y | B U T | I | P I T Y | H I M | T H A T ' S | W H A T | S O | S A I D | M I S S U S | R A C H E L | T O | T H E | W I L D | R O S E | B U S H E S | O U T | O F | T H E | F U L N E S S | O F | H E R | H E A R T | +C H A P T E R | T W O | M A T T H E W | C U T H B E R T | I S | S U R P R I S E D | M A T T H E W | C U T H B E R T | A N D | T H E | S O R R E L | M A R E | J O G G E D | C O M F O R T A B L Y | O V E R | T H E | E I G H T | M I L E S | T O | B R I G H T | R I V E R | I T | W A S | A | P R E T T Y | R O A D | R U N N I N G | A L O N G | B E T W E E N | S N U G | F A R M S T E A D S | W I T H | N O W | A N D | A G A I N | A | B I T | O F | B A L S A M Y | F I R | W O O D | T O | D R I V E | T H R O U G H | +O R | A | H O L L O W | W H E R E | W I L D | P L U M S | H U N G | O U T | T H E I R | F I L M Y | B L O O M | T H E | A I R | W A S | S W E E T | W I T H | T H E | B R E A T H | O F | M A N Y | A P P L E | O R C H A R D S | A N D | T H E | M E A D O W S | S L O P E D | A W A Y | I N | T H E | D I S T A N C E | T O | H O R I Z O N | M I S T S | O F | P E A R L | A N D | P U R P L E | W H I L E | T H E | L I T T L E | B I R D S | S A N G | A S | I F | I T | W E R E | T H E | O N E | D A Y | O F | S U M M E R | I N | A L L | T H E | Y E A R | +M A T T H E W | E N J O Y E D | T H E | D R I V E | A F T E R | H I S | O W N | F A S H I O N | E X C E P T | D U R I N G | T H E | M O M E N T S | W H E N | H E | M E T | W O M E N | A N D | H A D | T O | N O D | T O | T H E M | F O R | I N | P R I N C E | E D W A R D | I S L A N D | Y O U | A R E | S U P P O S E D | T O | N O D | T O | A L L | A N D | S U N D R Y | Y O U | M E E T | O N | T H E | R O A D | W H E T H E R | Y O U | K N O W | T H E M | O R | N O T | M A T T H E W | D R E A D E D | A L L | W O M E N | E X C E P T | M A R I L L A | A N D | M I S S U S | R A C H E L | +H E | H A D | A N | U N C O M F O R T A B L E | F E E L I N G | T H A T | T H E | M Y S T E R I O U S | C R E A T U R E S | W E R E | S E C R E T L Y | L A U G H I N G | A T | H I M | H E | M A Y | H A V E | B E E N | Q U I T E | R I G H T | I N | T H I N K I N G | S O | F O R | H E | W A S | A N | O D D | L O O K I N G | P E R S O N A G E | W I T H | A N | U N G A I N L Y | F I G U R E | A N D | L O N G | I R O N | G R A Y | H A I R | T H A T | T O U C H E D | H I S | S T O O P I N G | S H O U L D E R S | +A N D | A | F U L L | S O F T | B R O W N | B E A R D | W H I C H | H E | H A D | W O R N | E V E R | S I N C E | H E | W A S | T W E N T Y | I N | F A C T | H E | H A D | L O O K E D | A T | T W E N T Y | V E R Y | M U C H | A S | H E | L O O K E D | A T | S I X T Y | L A C K I N G | A | L I T T L E | O F | T H E | G R A Y N E S S | W H E N | H E | R E A C H E D | B R I G H T | R I V E R | T H E R E | W A S | N O | S I G N | O F | A N Y | T R A I N | +H E | T H O U G H T | H E | W A S | T O O | E A R L Y | S O | H E | T I E D | H I S | H O R S E | I N | T H E | Y A R D | O F | T H E | S M A L L | B R I G H T | R I V E R | H O T E L | A N D | W E N T | O V E R | T O | T H E | S T A T I O N | H O U S E | T H E | L O N G | P L A T F O R M | W A S | A L M O S T | D E S E R T E D | T H E | O N L Y | L I V I N G | C R E A T U R E | I N | S I G H T | B E I N G | A | G I R L | W H O | W A S | S I T T I N G | O N | A | P I L E | O F | S H I N G L E S | A T | T H E | E X T R E M E | E N D | +M A T T H E W | B A R E L Y | N O T I N G | T H A T | I T | W A S | A | G I R L | S I D L E D | P A S T | H E R | A S | Q U I C K L Y | A S | P O S S I B L E | W I T H O U T | L O O K I N G | A T | H E R | H A D | H E | L O O K E D | H E | C O U L D | H A R D L Y | H A V E | F A I L E D | T O | N O T I C E | T H E | T E N S E | R I G I D I T Y | A N D | E X P E C T A T I O N | O F | H E R | A T T I T U D E | A N D | E X P R E S S I O N | S H E | W A S | S I T T I N G | T H E R E | W A I T I N G | F O R | S O M E T H I N G | O R | S O M E B O D Y | +A N D | S I N C E | S I T T I N G | A N D | W A I T I N G | W A S | T H E | O N L Y | T H I N G | T O | D O | J U S T | T H E N | S H E | S A T | A N D | W A I T E D | W I T H | A L L | H E R | M I G H T | A N D | M A I N | M A T T H E W | E N C O U N T E R E D | T H E | S T A T I O N M A S T E R | L O C K I N G | U P | T H E | T I C K E T | O F F I C E | P R E P A R A T O R Y | T O | G O I N G | H O M E | F O R | S U P P E R | A N D | A S K E D | H I M | I F | T H E | F I V E | T H I R T Y | T R A I N | W O U L D | S O O N | B E | A L O N G | +T H E | F I V E | T H I R T Y | T R A I N | H A S | B E E N | I N | A N D | G O N E | H A L F | A N | H O U R | A G O | A N S W E R E D | T H A T | B R I S K | O F F I C I A L | B U T | T H E R E | W A S | A | P A S S E N G E R | D R O P P E D | O F F | F O R | Y O U | A | L I T T L E | G I R L | S H E ' S | S I T T I N G | O U T | T H E R E | O N | T H E | S H I N G L E S | I | A S K E D | H E R | T O | G O | I N T O | T H E | L A D I E S | W A I T I N G | R O O M | B U T | S H E | I N F O R M E D | M E | G R A V E L Y | T H A T | S H E | P R E F E R R E D | T O | S T A Y | O U T S I D E | +S H E ' S | A | C A S E | I | S H O U L D | S A Y | I ' M | N O T | E X P E C T I N G | A | G I R L | S A I D | M A T T H E W | B L A N K L Y | I T ' S | A | B O Y | I ' V E | C O M E | F O R | H E | S H O U L D | B E | H E R E | M I S S U S | A L E X A N D E R | S P E N C E R | W A S | T O | B R I N G | H I M | O V E R | F R O M | N O V A | S C O T I A | F O R | M E | T H E | S T A T I O N M A S T E R | W H I S T L E D | +G U E S S | T H E R E ' S | S O M E | M I S T A K E | H E | S A I D | M I S S U S | S P E N C E R | C A M E | O F F | T H E | T R A I N | W I T H | T H A T | G I R L | A N D | G A V E | H E R | I N T O | M Y | C H A R G E | S A I D | Y O U | A N D | Y O U R | S I S T E R | W E R E | A D O P T I N G | H E R | F R O M | A N | O R P H A N | A S Y L U M | A N D | T H A T | Y O U | W O U L D | B E | A L O N G | F O R | H E R | P R E S E N T L Y | T H A T ' S | A L L | I | K N O W | A B O U T | I T | A N D | I | H A V E N ' T | G O T | A N Y | M O R E | O R P H A N S | C O N C E A L E D | H E R E A B O U T S | +I | D O N ' T | U N D E R S T A N D | S A I D | M A T T H E W | H E L P L E S S L Y | W I S H I N G | T H A T | M A R I L L A | W A S | A T | H A N D | T O | C O P E | W I T H | T H E | S I T U A T I O N | W E L L | Y O U ' D | B E T T E R | Q U E S T I O N | T H E | G I R L | S A I D | T H E | S T A T I O N | M A S T E R | C A R E L E S S L Y | I | D A R E | S A Y | S H E ' L L | B E | A B L E | T O | E X P L A I N | S H E ' S | G O T | A | T O N G U E | O F | H E R | O W N | T H A T ' S | C E R T A I N | +M A Y B E | T H E Y | W E R E | O U T | O F | B O Y S | O F | T H E | B R A N D | Y O U | W A N T E D | H E | W A L K E D | J A U N T I L Y | A W A Y | B E I N G | H U N G R Y | A N D | T H E | U N F O R T U N A T E | M A T T H E W | W A S | L E F T | T O | D O | T H A T | W H I C H | W A S | H A R D E R | F O R | H I M | T H A N | B E A R D I N G | A | L I O N | I N | I T S | D E N | W A L K | U P | T O | A | G I R L | A | S T R A N G E | G I R L | A N | O R P H A N | G I R L | +A N D | D E M A N D | O F | H E R | W H Y | S H E | W A S N ' T | A | B O Y | M A T T H E W | G R O A N E D | I N | S P I R I T | A S | H E | T U R N E D | A B O U T | A N D | S H U F F L E D | G E N T L Y | D O W N | T H E | P L A T F O R M | T O W A R D S | H E R | S H E | H A D | B E E N | W A T C H I N G | H I M | E V E R | S I N C E | H E | H A D | P A S S E D | H E R | A N D | S H E | H A D | H E R | E Y E S | O N | H I M | N O W | M A T T H E W | W A S | N O T | L O O K I N G | A T | H E R | +A | C H I L D | O F | A B O U T | E L E V E N | G A R B E D | I N | A | V E R Y | S H O R T | V E R Y | T I G H T | V E R Y | U G L Y | D R E S S | O F | Y E L L O W I S H | G R A Y | W I N C E Y | S H E | W O R E | A | F A D E D | B R O W N | S A I L O R | H A T | A N D | B E N E A T H | T H E | H A T | E X T E N D I N G | D O W N | H E R | B A C K | W E R E | T W O | B R A I D S | O F | V E R Y | T H I C K | D E C I D E D L Y | R E D | H A I R | +H E R | F A C E | W A S | S M A L L | W H I T E | A N D | T H I N | A L S O | M U C H | F R E C K L E D | H E R | M O U T H | W A S | L A R G E | A N D | S O | W E R E | H E R | E Y E S | W H I C H | L O O K E D | G R E E N | I N | S O M E | L I G H T S | A N D | M O O D S | A N D | G R A Y | I N | O T H E R S | S O | F A R | T H E | O R D I N A R Y | O B S E R V E R | A N | E X T R A O R D I N A R Y | O B S E R V E R | +M I G H T | H A V E | S E E N | T H A T | T H E | C H I N | W A S | V E R Y | P O I N T E D | A N D | P R O N O U N C E D | T H A T | T H E | B I G | E Y E S | W E R E | F U L L | O F | S P I R I T | A N D | V I V A C I T Y | T H A T | T H E | M O U T H | W A S | S W E E T | L I P P E D | A N D | E X P R E S S I V E | T H A T | T H E | F O R E H E A D | W A S | B R O A D | A N D | F U L L | I N | S H O R T | O U R | D I S C E R N I N G | E X T R A O R D I N A R Y | O B S E R V E R | M I G H T | H A V E | C O N C L U D E D | +W A S | S O | L U D I C R O U S L Y | A F R A I D | M A T T H E W | H O W E V E R | W A S | S P A R E D | T H E | O R D E A L | O F | S P E A K I N G | F I R S T | F O R | A S | S O O N | A S | S H E | C O N C L U D E D | T H A T | H E | W A S | C O M I N G | T O | H E R | S H E | S T O O D | U P | G R A S P I N G | W I T H | O N E | T H I N | B R O W N | H A N D | T H E | H A N D L E | O F | A | S H A B B Y | O L D | F A S H I O N E D | C A R P E T | B A G | T H E | O T H E R | S H E | H E L D | O U T | T O | H I M | +I | S U P P O S E | Y O U | A R E | M I S T E R | M A T T H E W | C U T H B E R T | O F | G R E E N | G A B L E S | S H E | S A I D | I N | A | P E C U L I A R L Y | C L E A R | S W E E T | V O I C E | I ' M | V E R Y | G L A D | T O | S E E | Y O U | I | W A S | B E G I N N I N G | T O | B E | A F R A I D | Y O U | W E R E N ' T | C O M I N G | F O R | M E | +I | H A D | M A D E | U P | M Y | M I N D | T H A T | I F | Y O U | D I D N ' T | C O M E | F O R | M E | T O | N I G H T | +I | W O U L D N ' T | B E | A | B I T | A F R A I D | A N D | I T | W O U L D | B E | L O V E L Y | T O | S L E E P | I N | A | W I L D | C H E R R Y | T R E E | A L L | W H I T E | W I T H | B L O O M | I N | T H E | M O O N S H I N E | D O N ' T | Y O U | T H I N K | Y O U | C O U L D | I M A G I N E | Y O U | W E R E | D W E L L I N G | I N | M A R B L E | H A L L S | C O U L D N ' T | Y O U | +M A T T H E W | H A D | T A K E N | T H E | S C R A W N Y | L I T T L E | H A N D | A W K W A R D L Y | I N | H I S | T H E N | A N D | T H E R E | H E | D E C I D E D | W H A T | T O | D O | H E | C O U L D | N O T | T E L L | T H I S | C H I L D | W I T H | T H E | G L O W I N G | E Y E S | T H A T | T H E R E | H A D | B E E N | A | M I S T A K E | H E | W O U L D | T A K E | H E R | H O M E | A N D | L E T | M A R I L L A | D O | T H A T | S H E | C O U L D N ' T | B E | L E F T | A T | B R I G H T | R I V E R | A N Y H O W | +N O | M A T T E R | W H A T | M I S T A K E | H A D | B E E N | M A D E | S O | A L L | Q U E S T I O N S | A N D | E X P L A N A T I O N S | M I G H T | A S | W E L L | B E | D E F E R R E D | U N T I L | H E | W A S | S A F E L Y | B A C K | A T | G R E E N | G A B L E S | I ' M | S O R R Y | I | W A S | L A T E | H E | S A I D | S H Y L Y | C O M E | A L O N G | T H E | H O R S E | I S | O V E R | I N | T H E | Y A R D | G I V E | M E | Y O U R | B A G | O H | I | C A N | C A R R Y | I T | T H E | C H I L D | R E S P O N D E D | C H E E R F U L L Y | +I T | I S N ' T | H E A V Y | I ' V E | G O T | A L L | M Y | W O R L D L Y | G O O D S | I N | I T | B U T | I T | I S N ' T | H E A V Y | A N D | I F | I T | I S N ' T | C A R R I E D | I N | J U S T | A | C E R T A I N | W A Y | T H E | H A N D L E | P U L L S | O U T | S O | I ' D | B E T T E R | K E E P | I T | B E C A U S E | I | K N O W | T H E | E X A C T | K N A C K | O F | I T | I T ' S | A N | E X T R E M E L Y | O L D | C A R P E T | B A G | O H | I ' M | V E R Y | G L A D | Y O U ' V E | C O M E | E V E N | I F | I T | W O U L D | H A V E | B E E N | N I C E | T O | S L E E P | I N | A | W I L D | C H E R R Y | T R E E | +W E ' V E | G O T | T O | D R I V E | A | L O N G | P I E C E | H A V E N ' T | W E | M I S S U S | S P E N C E R | S A I D | I T | W A S | E I G H T | M I L E S | I ' M | G L A D | B E C A U S E | I | L O V E | D R I V I N G | O H | I T | S E E M S | S O | W O N D E R F U L | T H A T | I ' M | G O I N G | T O | L I V E | W I T H | Y O U | A N D | B E L O N G | T O | Y O U | I ' V E | N E V E R | B E L O N G E D | T O | A N Y B O D Y | N O T | R E A L L Y | B U T | T H E | A S Y L U M | W A S | T H E | W O R S T | I ' V E | O N L Y | B E E N | I N | I T | F O U R | M O N T H S | B U T | T H A T | W A S | E N O U G H | +I T ' S | W O R S E | T H A N | A N Y T H I N G | Y O U | C O U L D | I M A G I N E | M I S S U S | S P E N C E R | S A I D | I T | W A S | W I C K E D | O F | M E | T O | T A L K | L I K E | T H A T | +T H E Y | W E R E | G O O D | Y O U | K N O W | T H E | A S Y L U M | P E O P L E | B U T | T H E R E | I S | S O | L I T T L E | S C O P E | F O R | T H E | I M A G I N A T I O N | I N | A N | A S Y L U M | O N L Y | J U S T | I N | T H E | O T H E R | O R P H A N S | I T | W A S | P R E T T Y | I N T E R E S T I N G | T O | I M A G I N E | T H I N G S | A B O U T | T H E M | +W H O | H A D | B E E N | S T O L E N | A W A Y | F R O M | H E R | P A R E N T S | I N | H E R | I N F A N C Y | B Y | A | C R U E L | N U R S E | W H O | D I E D | B E F O R E | S H E | C O U L D | C O N F E S S | I | U S E D | T O | L I E | A W A K E | A T | N I G H T S | A N D | I M A G I N E | T H I N G S | L I K E | T H A T | B E C A U S E | I | D I D N ' T | H A V E | T I M E | I N | T H E | D A Y | I | G U E S S | T H A T ' S | W H Y | I ' M | S O | T H I N | I | A M | D R E A D F U L | T H I N | A I N ' T | I | T H E R E | I S N ' T | A | P I C K | O N | M Y | B O N E S | +I | D O | L O V E | T O | I M A G I N E | I ' M | N I C E | A N D | P L U M P | W I T H | D I M P L E S | I N | M Y | E L B O W S | W I T H | T H I S | M A T T H E W ' S | C O M P A N I O N | S T O P P E D | T A L K I N G | P A R T L Y | B E C A U S E | S H E | W A S | O U T | O F | B R E A T H | A N D | P A R T L Y | B E C A U S E | T H E Y | H A D | R E A C H E D | T H E | B U G G Y | N O T | A N O T H E R | W O R D | D I D | S H E | S A Y | U N T I L | T H E Y | H A D | L E F T | T H E | V I L L A G E | A N D | W E R E | D R I V I N G | D O W N | A | S T E E P | L I T T L E | H I L L | +T H E | R O A D | P A R T | O F | W H I C H | H A D | B E E N | C U T | S O | D E E P L Y | I N T O | T H E | S O F T | S O I L | T H A T | T H E | B A N K S | F R I N G E D | W I T H | B L O O M I N G | W I L D | C H E R R Y | T R E E S | A N D | S L I M | W H I T E | B I R C H E S | W E R E | S E V E R A L | F E E T | A B O V E | T H E I R | H E A D S | T H E | C H I L D | P U T | O U T | H E R | H A N D | A N D | B R O K E | O F F | A | B R A N C H | O F | W I L D | P L U M | T H A T | B R U S H E D | A G A I N S T | T H E | S I D E | O F | T H E | B U G G Y | +I S N ' T | T H A T | B E A U T I F U L | W H A T | D I D | T H A T | T R E E | L E A N I N G | O U T | F R O M | T H E | B A N K | A L L | W H I T E | A N D | L A C Y | M A K E | Y O U | T H I N K | O F | S H E | A S K E D | W E L L | N O W | I | D U N N O | S A I D | M A T T H E W | W H Y | A | B R I D E | O F | C O U R S E | A | B R I D E | A L L | I N | W H I T E | W I T H | A | L O V E L Y | M I S T Y | V E I L | +I ' V E | N E V E R | S E E N | O N E | B U T | I | C A N | I M A G I N E | W H A T | S H E | W O U L D | L O O K | L I K E | I | D O N ' T | E V E R | E X P E C T | T O | B E | A | B R I D E | M Y S E L F | I ' M | S O | H O M E L Y | N O B O D Y | W I L L | E V E R | W A N T | T O | M A R R Y | M E | U N L E S S | I T | M I G H T | B E | A | F O R E I G N | M I S S I O N A R Y | I | S U P P O S E | A | F O R E I G N | M I S S I O N A R Y | M I G H T N ' T | B E | V E R Y | P A R T I C U L A R | +B U T | I | D O | H O P E | T H A T | S O M E | D A Y | I | S H A L L | H A V E | A | W H I T E | D R E S S | T H A T | I S | M Y | H I G H E S T | I D E A L | O F | E A R T H L Y | B L I S S | I | J U S T | L O V E | P R E T T Y | C L O T H E S | A N D | I ' V E | N E V E R | H A D | A | P R E T T Y | D R E S S | I N | M Y | L I F E | T H A T | I | C A N | R E M E M B E R | B U T | O F | C O U R S E | I T ' S | A L L | T H E | M O R E | T O | L O O K | F O R W A R D | T O | I S N ' T | I T | A N D | T H E N | +I | C A N | I M A G I N E | T H A T | I ' M | D R E S S E D | G O R G E O U S L Y | T H I S | M O R N I N G | W H E N | I | L E F T | T H E | A S Y L U M | I | F E L T | S O | A S H A M E D | B E C A U S E | I | H A D | T O | W E A R | T H I S | H O R R I D | O L D | W I N C E Y | D R E S S | A L L | T H E | O R P H A N S | H A D | T O | W E A R | T H E M | Y O U | K N O W | A | M E R C H A N T | I N | H O P E T O N | L A S T | W I N T E R | D O N A T E D | T H R E E | H U N D R E D | Y A R D S | O F | W I N C E Y | T O | T H E | A S Y L U M | S O M E | P E O P L E | S A I D | I T | W A S | B E C A U S E | H E | C O U L D N ' T | S E L L | I T | +B U T | I ' D | R A T H E R | B E L I E V E | T H A T | I T | W A S | O U T | O F | T H E | K I N D N E S S | O F | H I S | H E A R T | W O U L D N ' T | Y O U | W H E N | W E | G O T | O N | T H E | T R A I N | I | F E L T | A S | I F | E V E R Y B O D Y | M U S T | B E | L O O K I N G | A T | M E | A N D | P I T Y I N G | M E | B U T | I | J U S T | W E N T | T O | W O R K | A N D | I M A G I N E D | T H A T | I | H A D | O N | T H E | M O S T | B E A U T I F U L | P A L E | B L U E | S I L K | D R E S S | B E C A U S E | W H E N | Y O U | A R E | I M A G I N I N G | Y O U | M I G H T | A S | W E L L | I M A G I N E | S O M E T H I N G | W O R T H | W H I L E | +A N D | A | B I G | H A T | A L L | F L O W E R S | A N D | N O D D I N G | P L U M E S | A N D | A | G O L D | W A T C H | A N D | K I D | G L O V E S | A N D | B O O T S | I | F E L T | C H E E R E D | U P | R I G H T | A W A Y | A N D | I | E N J O Y E D | M Y | T R I P | T O | T H E | I S L A N D | W I T H | A L L | M Y | M I G H T | I | W A S N ' T | A | B I T | S I C K | C O M I N G | O V E R | I N | T H E | B O A T | N E I T H E R | W A S | M I S S U S | S P E N C E R | A L T H O U G H | S H E | G E N E R A L L Y | I S | +S H E | S A I D | S H E | H A D N ' T | T I M E | T O | G E T | S I C K | W A T C H I N G | T O | S E E | T H A T | I | D I D N ' T | F A L L | O V E R B O A R D | S H E | S A I D | S H E | N E V E R | S A W | T H E | B E A T | O F | M E | F O R | P R O W L I N G | A B O U T | B U T | I F | I T | K E P T | H E R | F R O M | B E I N G | S E A S I C K | I T ' S | A | M E R C Y | I | D I D | P R O W L | I S N ' T | I T | A N D | I | W A N T E D | T O | S E E | E V E R Y T H I N G | T H A T | W A S | T O | B E | S E E N | O N | T H A T | B O A T | B E C A U S E | I | D I D N ' T | K N O W | W H E T H E R | I ' D | E V E R | H A V E | A N O T H E R | O P P O R T U N I T Y | +O H | T H E R E | A R E | A | L O T | M O R E | C H E R R Y | T R E E S | A L L | I N | B L O O M | T H I S | I S L A N D | I S | T H E | B L O O M I E S T | P L A C E | I | J U S T | L O V E | I T | A L R E A D Y | A N D | I ' M | S O | G L A D | I ' M | G O I N G | T O | L I V E | H E R E | I ' V E | A L W A Y S | H E A R D | T H A T | P R I N C E | E D W A R D | I S L A N D | W A S | T H E | P R E T T I E S T | P L A C E | I N | T H E | W O R L D | +A N D | I | U S E D | T O | I M A G I N E | I | W A S | L I V I N G | H E R E | B U T | I | N E V E R | R E A L L Y | E X P E C T E D | I | W O U L D | I T ' S | D E L I G H T F U L | W H E N | Y O U R | I M A G I N A T I O N S | C O M E | T R U E | I S N ' T | I T | B U T | T H O S E | R E D | R O A D S | A R E | S O | F U N N Y | W H E N | W E | G O T | I N T O | T H E | T R A I N | A T | C H A R L O T T E T O W N | A N D | T H E | R E D | R O A D S | B E G A N | T O | F L A S H | P A S T | I | A S K E D | M I S S U S | S P E N C E R | W H A T | M A D E | T H E M | R E D | +A N D | S H E | S A I D | S H E | D I D N ' T | K N O W | A N D | F O R | P I T Y ' S | S A K E | N O T | T O | A S K | H E R | A N Y | M O R E | Q U E S T I O N S | S H E | S A I D | I | M U S T | H A V E | A S K E D | H E R | A | T H O U S A N D | A L R E A D Y | I | S U P P O S E | I | H A D | T O O | B U T | H O W | Y O U | G O I N G | T O | F I N D | O U T | A B O U T | T H I N G S | I F | Y O U | D O N ' T | A S K | Q U E S T I O N S | A N D | W H A T | D O E S | M A K E | T H E | R O A D S | R E D | W E L L | N O W | I | D U N N O | S A I D | M A T T H E W | +T H E R E ' D | B E | N O | S C O P E | F O R | I M A G I N A T I O N | T H E N | W O U L D | T H E R E | B U T | A M | I | T A L K I N G | T O O | M U C H | P E O P L E | A R E | A L W A Y S | T E L L I N G | M E | I | D O | W O U L D | Y O U | R A T H E R | I | D I D N ' T | T A L K | I F | Y O U | S A Y | S O | I ' L L | S T O P | I | C A N | S T O P | W H E N | I | M A K E | U P | M Y | M I N D | T O | I T | A L T H O U G H | I T ' S | D I F F I C U L T | M A T T H E W | +W A S | E N J O Y I N G | H I M S E L F | L I K E | M O S T | Q U I E T | F O L K S | H E | L I K E D | T A L K A T I V E | P E O P L E | W H E N | T H E Y | W E R E | W I L L I N G | T O | D O | T H E | T A L K I N G | T H E M S E L V E S | A N D | D I D | N O T | E X P E C T | H I M | T O | K E E P | U P | H I S | E N D | O F | I T | B U T | H E | H A D | N E V E R | E X P E C T E D | T O | E N J O Y | T H E | S O C I E T Y | O F | A | L I T T L E | G I R L | W O M E N | W E R E | B A D | E N O U G H | I N | A L L | C O N S C I E N C E | B U T | L I T T L E | G I R L S | W E R E | W O R S E | diff --git a/SpeechLM/dataset/LibriSpeech/asr/train_sample100.tsv b/SpeechLM/dataset/LibriSpeech/asr/train_sample100.tsv new file mode 100644 index 0000000..8b50a1d --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/asr/train_sample100.tsv @@ -0,0 +1,101 @@ +/LocalData/dataset/LibriSpeech/train-clean-100 +103/1240/103-1240-0000.flac 225360 +103/1240/103-1240-0001.flac 255120 +103/1240/103-1240-0002.flac 223120 +103/1240/103-1240-0003.flac 235360 +103/1240/103-1240-0004.flac 200240 +103/1240/103-1240-0005.flac 242800 +103/1240/103-1240-0006.flac 153280 +103/1240/103-1240-0007.flac 240560 +103/1240/103-1240-0008.flac 246960 +103/1240/103-1240-0009.flac 160480 +103/1240/103-1240-0010.flac 236880 +103/1240/103-1240-0011.flac 234480 +103/1240/103-1240-0012.flac 243040 +103/1240/103-1240-0013.flac 244160 +103/1240/103-1240-0014.flac 223360 +103/1240/103-1240-0015.flac 60960 +103/1240/103-1240-0016.flac 250640 +103/1240/103-1240-0017.flac 229040 +103/1240/103-1240-0018.flac 185760 +103/1240/103-1240-0019.flac 246480 +103/1240/103-1240-0020.flac 214640 +103/1240/103-1240-0021.flac 236960 +103/1240/103-1240-0022.flac 262000 +103/1240/103-1240-0023.flac 194400 +103/1240/103-1240-0024.flac 244320 +103/1240/103-1240-0025.flac 241920 +103/1240/103-1240-0026.flac 133360 +103/1240/103-1240-0027.flac 223440 +103/1240/103-1240-0028.flac 250400 +103/1240/103-1240-0029.flac 244320 +103/1240/103-1240-0030.flac 232320 +103/1240/103-1240-0031.flac 269760 +103/1240/103-1240-0032.flac 236400 +103/1240/103-1240-0033.flac 230640 +103/1240/103-1240-0034.flac 246480 +103/1240/103-1240-0035.flac 256720 +103/1240/103-1240-0036.flac 200320 +103/1240/103-1240-0037.flac 237040 +103/1240/103-1240-0038.flac 114480 +103/1240/103-1240-0039.flac 230800 +103/1240/103-1240-0040.flac 234720 +103/1240/103-1240-0041.flac 216160 +103/1240/103-1240-0042.flac 249680 +103/1240/103-1240-0043.flac 236160 +103/1240/103-1240-0044.flac 262240 +103/1240/103-1240-0045.flac 250800 +103/1240/103-1240-0046.flac 222800 +103/1240/103-1240-0047.flac 206320 +103/1240/103-1240-0048.flac 236320 +103/1240/103-1240-0049.flac 244560 +103/1240/103-1240-0050.flac 224400 +103/1240/103-1240-0051.flac 245760 +103/1240/103-1240-0052.flac 236640 +103/1240/103-1240-0053.flac 218640 +103/1240/103-1240-0054.flac 261360 +103/1240/103-1240-0055.flac 179920 +103/1240/103-1240-0056.flac 229040 +103/1240/103-1240-0057.flac 109680 +103/1241/103-1241-0000.flac 255440 +103/1241/103-1241-0001.flac 248800 +103/1241/103-1241-0002.flac 249040 +103/1241/103-1241-0003.flac 222160 +103/1241/103-1241-0004.flac 236080 +103/1241/103-1241-0005.flac 224400 +103/1241/103-1241-0006.flac 243760 +103/1241/103-1241-0007.flac 242320 +103/1241/103-1241-0008.flac 242160 +103/1241/103-1241-0009.flac 222400 +103/1241/103-1241-0010.flac 253920 +103/1241/103-1241-0011.flac 231760 +103/1241/103-1241-0012.flac 239680 +103/1241/103-1241-0013.flac 236960 +103/1241/103-1241-0014.flac 242080 +103/1241/103-1241-0015.flac 224160 +103/1241/103-1241-0016.flac 234640 +103/1241/103-1241-0017.flac 254240 +103/1241/103-1241-0018.flac 150960 +103/1241/103-1241-0019.flac 48400 +103/1241/103-1241-0020.flac 155360 +103/1241/103-1241-0021.flac 242880 +103/1241/103-1241-0022.flac 261600 +103/1241/103-1241-0023.flac 266720 +103/1241/103-1241-0024.flac 254240 +103/1241/103-1241-0025.flac 77280 +103/1241/103-1241-0026.flac 176080 +103/1241/103-1241-0027.flac 238080 +103/1241/103-1241-0028.flac 248880 +103/1241/103-1241-0029.flac 244960 +103/1241/103-1241-0030.flac 247520 +103/1241/103-1241-0031.flac 209600 +103/1241/103-1241-0032.flac 224080 +103/1241/103-1241-0033.flac 251920 +103/1241/103-1241-0034.flac 270560 +103/1241/103-1241-0035.flac 248800 +103/1241/103-1241-0036.flac 249040 +103/1241/103-1241-0037.flac 204400 +103/1241/103-1241-0038.flac 238960 +103/1241/103-1241-0039.flac 258160 +103/1241/103-1241-0040.flac 220560 +103/1241/103-1241-0041.flac 252240 diff --git a/SpeechLM/dataset/LibriSpeech/fast_phone2unit/config.yaml b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/config.yaml new file mode 100644 index 0000000..eaec2ce --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/config.yaml @@ -0,0 +1,13 @@ +audio_root: /home/v-ziqzhang/dataset/librispeech_phone2unit +features: + energy_max: 5.733445167541504 + energy_min: 1.0e-08 + eps: 1.0e-05 + hop_length: 256 + pitch_max: 6.608609099713706 + pitch_min: 1.0e-08 + sample_rate: 16000 +sample_rate: 16000 +vocab_filename: dict.km.txt +src_vocab_filename: dict.phn.txt + diff --git a/SpeechLM/dataset/LibriSpeech/fast_phone2unit/config_generate.yaml b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/config_generate.yaml new file mode 100644 index 0000000..1d9fa74 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/config_generate.yaml @@ -0,0 +1,13 @@ +audio_root: /home/v-ziqzhang/dataset/librispeech_phone2unit +features: + energy_max: 5.733445167541504 + energy_min: 1.0e-08 + eps: 1.0e-05 + hop_length: 256 + pitch_max: 6.608609099713706 + pitch_min: 1.0e-08 + sample_rate: 16000 +sample_rate: 16000 +vocab_filename: dict.km.txt +src_vocab_filename: dict.PHN.txt + diff --git a/SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.PHN.txt b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.PHN.txt new file mode 100644 index 0000000..60232ec --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.PHN.txt @@ -0,0 +1,42 @@ +| 0 + 1 +' 2 +AA 3 +AE 4 +AH 5 +AO 6 +AW 7 +AY 8 +B 9 +CH 10 +D 11 +DH 12 +EH 13 +ER 14 +EY 15 +F 16 +G 17 +HH 18 +IH 19 +IY 20 +JH 21 +K 22 +L 23 +M 24 +N 25 +NG 26 +OW 27 +OY 28 +P 29 +R 30 +S 31 +SH 32 +T 33 +TH 34 +UH 35 +UW 36 +V 37 +W 38 +Y 39 +Z 40 +ZH 41 diff --git a/SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.km.txt b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.km.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/dict.km.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechLM/dataset/LibriSpeech/fast_phone2unit/genset_examples.tsv b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/genset_examples.tsv new file mode 100644 index 0000000..fe4a9a1 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/genset_examples.tsv @@ -0,0 +1,101 @@ +id speaker n_frames tgt_text unit +librilm-9899 librilm 323 AH B EH T R OW TH AH L AH W EH D IH NG AO R AH K R IH S AH N IH NG AO R DH AH M IH R P R AA K S IH M AH T IY AH V AH G IH T AA R IH Z S AH F IH SH AH N T AH K EY ZH AH N AH N D IH F DH AH AH K EY ZH AH N L AE K S S EH N D F AO R DH AH G IH T AA R AH N D D AE N S EH N IY W EY 0 +librilm-9900 librilm 449 AH B EH T R OW TH AH L B R OW K AH N AO F W AA Z AH TH IH NG DH AE T HH AE D HH AE P AH N D B IH F AO R AH N D M AY T HH AE P AH N AH G EH N IH T W AA Z AH T R AY F AH L IY V IH N AH M IH R N AH TH IH NG IH F OW N L IY HH AH N ER W ER AH N T AH CH T B AY IH T IH F OW N L IY AA T AH M AA R K UH D S T EY K HH IH Z L AY F AH P AA N HH IH Z AH N IH M P IY CH AH B AH L HH AH N ER 0 +librilm-9901 librilm 211 AH B EH T R OW TH AH L S EH R AH M OW N IY AH K AO R D IH NG L IY IH Z DH AH IH M IY D IY AH T AH K EY ZH AH N AH V DH AH K AH M IH NG T AH G EH DH ER AH V AW ER AH K W EY N T AH N S IH Z 0 +librilm-9902 librilm 45 AH B EH T R OW TH AH L D EY 0 +librilm-9903 librilm 141 AH B EH T R OW TH AH L HH IY R IH Z AO L M OW S T AE Z B AY N D IH NG AH N D K W AY T AE Z S AA L AH M AE Z AH M EH R IH JH 0 +librilm-9904 librilm 59 AH B EH T R OW TH AH L IH Z S EY K R AH D 0 +librilm-9905 librilm 79 AH B EH T R OW TH AH L IH Z S AH M TH IH NG HH EH V AH N L IY 0 +librilm-9906 librilm 225 AH B EH T R OW TH AH L R IH NG W AA Z P ER CH AH S T AH N D DH EH N HH ER K AA N SH AH N S B IY IH NG AH P IY Z D SH IY G EY V HH ER S EH L F K AH M P L IY T L IY T UW HH ER L AH V ER 0 +librilm-9907 librilm 288 AH B EH T R OW TH AH L T UH K P L EY S AO L W AA Z HH AA R M AH N IY AH N D F AO R AH T AY M N OW M AO R W AA Z S EH D AH V D IH S IH N ER SH IH T IH NG M AE D AH M D IY L AA P EH L T R IY AO R P AH T IH NG HH ER IH N W AO R D SH IH P 0 +librilm-9908 librilm 139 AH B EH T R OW TH AH L W IY HH AE V B IH N T UW AH B AO L AH V W IH CH AY M AH S T G IH V Y UW AH D IH S K R IH P SH AH N 0 +librilm-9909 librilm 491 AH B EH T R OW TH AH L W IH CH HH AE D T EY K AH N P L EY S AA N DH AH P R IY V IY AH S IY V N IH NG G EY V K AA Z F AO R P L EH N T AH F AH L SH R AH G IH NG AH V SH OW L D ER Z B IH K AO Z DH AH JH EH N T AH L M AH N AE Z Y EH T HH EH L D N OW R IH S P EH K T AH B AH L P AH Z IH SH AH N IH N L AY F AH N D DH AH F IY AE N S IY AE Z S EH V R AH L F IY M EY L F R EH N D Z AH S ER T AH D AH V EH R IY AH N S ER T AH N W AH N 0 +librilm-9910 librilm 269 AH B EH T R OW TH AH L W IH TH AW T AH N D IY V IH N AH G EH N S T DH AH K AH N S EH N T AH V P EH R AH N T S W AA Z S AH M TH IH NG K W AY T AW T S AY D AH V DH AH Y AH NG L EY D IY Z P AW ER AH V K AA M P R IY HH EH N SH AH N 0 +librilm-9911 librilm 29 AH B EH T R AH TH 0 +librilm-9912 librilm 127 AH B EH T R AH TH B R AY D AO T T UW B IY HH AE P IY Y UW AA R AO L W EY Z T EH L IH NG M IY S OW 0 +librilm-9913 librilm 108 AH B EH T R AH TH G ER L IH Z W AH N TH IH NG AH W AY F K W AY T AH N AH DH ER 0 +librilm-9914 librilm 168 AH B EH T R AH TH L AH V ER K AE N AA T T AA L ER EY T EH N IY AH S P ER ZH AH N K AE S T AH P AA N DH AH F EH R S EH K S S EH D JH AO R JH AH Z 0 +librilm-9915 librilm 61 AH B EH T R AH TH L AH V ER Z F EH R W EH L 0 +librilm-9916 librilm 335 AH B EH T R AH TH Y AH NG M AE N AO R HH IH Z F IY M EY L R EH L AH T IH V Z AH S IH S T IH NG HH IH M W AA Z AH K AH S T AH M D T UW M EY K AH P R EH Z AH N T AH V W AH N AO R M AO R P EH T IY K OW T S T UW HH IH Z S W IY T HH AA R T T UW IH N K R IY S HH ER W AO R D R OW B 0 +librilm-9917 librilm 24 AH B EH T ER 0 +librilm-9918 librilm 182 AH B EH T ER AH F AY N ER AH N OW B L ER F EH L OW DH AE N HH IY N EH V ER L AY V D AH N D DH AE T S W AH T AY W AA N T Y UW F EH L OW Z T UW N OW 0 +librilm-9919 librilm 254 AH B EH T ER AH K AW N T AH V AH M IH L AH T EH R IY AE K SH AH N DH AE N DH AE T W IH CH S M OW L IH T G IH V Z AH V DH AH B AE T AH L AH V DH AH B OY N IH T W UH D B IY HH AA R D T UW F AY N D 0 +librilm-9920 librilm 117 AH B EH T ER AH K AW N T AH V DH AH SH UH G ER DH AE N AY K UH D HH AE V IH K S P EH K T AH D 0 +librilm-9921 librilm 135 AH B EH T ER AH K AW N T AH V DH IH S IH N S AH D AH N T W AA Z W AY D L IY P R IH N T AH D AE T DH AE T T AY M 0 +librilm-9922 librilm 251 AH B EH T ER AH K AW N T T UW DH AE N DH AH N UW Z P EY P ER W AH N F UH L ER IH G Z AE K T ER M AO R D IH T EY L D B AE K T AH P B AY F IH G Y ER Z D AW N TH R IY L AO NG SH IY T S AH N D HH AE F W EY D AW N AH F AO R TH 0 +librilm-9923 librilm 84 AH B EH T ER AH K W EY N T AH N S W IH L S UW N D IH S K AH V ER DH IH S 0 +librilm-9924 librilm 258 AH B EH T ER AH K W EY N T AH N S W IH DH DH AH AA P ER EY SH AH N N OW N T UW M AA D ER N Z AE Z S P AY K IH NG AH P IY S W UH D HH AE V EH N EY B AH L D HH IH M T UW M EY K DH AH B L OW IH R EH P ER AH B AH L 0 +librilm-9925 librilm 595 AH B EH T ER AH K W EY N T AH N S W IH DH DH IH S L AE N D AH V F R IY D AH M W IH L SH OW Y UW DH AE T F AH D EH L AH T IY AH N D HH AH N ER B IH T W IY N HH AH Z B AH N D AH N D W AY F AA R HH IY R N OW R EH R IH K S EH P SH AH N Z B AH T DH AH Y UW N AH V ER S AH L R UW L B AH T Y UW M AH S T N OW AE T W AH N S DH AE T W IY D UW N AA T DH EH R F AO R EH K S ER S AY Z EH N IY S UW P ER HH Y UW M AH N V ER CH UW B AH T S IH M P L IY AE K T IH N K AH N F AO R M AH T IY W IH DH DH AH R IY L N EY CH ER AH V M AE N 0 +librilm-9926 librilm 176 AH B EH T ER AE D M AY R ER DH AE N M IY SH IY W IH L N AA T F AY N D IH N HH ER T AW N K AW N S AH L N AO R IH N HH AY ER S AH S AY AH T IY 0 +librilm-9927 librilm 143 AH B EH T ER AH D V ER T AH Z M AH N T DH AE N DH AH K AO R N EH T S OW L OW K UH D N AA T HH AE V B IH N D IH V AY Z D 0 +librilm-9928 librilm 213 AH B EH T ER AO L R AW N D M AE N DH AE N S IY S AH L AY SH UH D HH OW P S EH D D EY V IH D L IH N T AH N W IH DH AH S AW N D L AY K AH S N AO R T AH V R AE TH 0 +librilm-9929 librilm 140 AH B EH T ER AO L T ER K UH D N AA T HH AE V B IH N S AH L EH K T AH D IH N AO L DH AE T V AE S T R IY JH AH N 0 +librilm-9930 librilm 423 AH B EH T ER AE N K AY N D ER W UH M AH N DH AE N M IH S IH Z HH Y UW IH T Y UW W UH D AH N T F AY N D N AA T IH F Y UW W AA Z T UW W IH DH D IH F AH K AH L T IY DH AH S T R EY N JH ER AH B T EY N D AH F Y UW D IH T EY L Z AH V DH AH AO R AH JH AH N AH N D K AO R S AH V DH AH IH L N AH S D IH T EY L Z HH OW L IY M IH S L IY D IH NG B AH T D IH V AY Z D T UW R IY AH SH UH R 0 +librilm-9931 librilm 211 AH B EH T ER AE NG K ER AH JH DH AE N DH IH S P AA R T AH V DH AH K OW S T AH F AO R D AH D HH AE V IH NG B IH N F AW N D DH AH SH IH P B R AO T AH P HH IY R 0 +librilm-9932 librilm 147 AH B EH T ER AH N D B OW L D ER K AA R D P L EY ER DH AE N L AO R D B EH L IH NG ER N EH V ER HH EH L D AH T R AH M P 0 +librilm-9933 librilm 164 AH B EH T ER AH N D M AO R K R IH S CH AH N M AE N S K EH R S L IY EH V ER B R IY DH D DH AE N JH OW S AH F AE D AH S AH N 0 +librilm-9934 librilm 98 AH B EH T ER AH N D M AO R K AH N S IH S T AH N T W UH M AH N N EH V ER L AY V D 0 +librilm-9935 librilm 442 AH B EH T ER AH N D M AO R AA N ER AH B AH L AO F ER IH NG IH Z M EY D T UW AW ER M AE S T ER IH N M IH N AH S T R IY T UW DH AH P UH R IH N IH K S T EH N D IH NG DH AH N AA L AH JH AH V HH IH Z N EY M IH N DH AH P R AE K T AH S AH V DH AH V ER CH UW Z B AY W IH CH DH AE T N EY M IH Z HH AE L OW D DH AE N IH N M AH T IH R IY AH L P R EH Z AH N T S T UW HH IH Z T EH M P AH L 0 +librilm-9936 librilm 555 AH B EH T ER AH N D M AO R S P IY D IY P L AE N W UH D P ER HH AE P S HH AE V B IH N T UW S IY K AW T W AH N AH V Z UW M AH L AA K S W AA R OW Z EY D Z D IY K AE M P R IH L EY T T UW HH IH M HH IH Z R IY S AH N T AE D V EH N CH ER Z P R OW D UW S R IY T AH Z L EH T ER IH N K ER AO B ER EY SH AH N AH V HH IH Z V ER AE S IH T IY AH N D R IH K W EH S T HH IH M T UW F AO R W ER D IH T AO R P R AH V AY D HH IH M W IH DH AH HH AO R S T UW T EY K IH T HH IH M S EH L F 0 +librilm-9937 librilm 142 AH B EH T ER AH N D W AY Z ER P R IH N S SH AE L ER AY Z HH UW SH AE L R IH S T AO R P R AA S P EH R AH T IY T UW JH UW D AH 0 +librilm-9938 librilm 453 AH B EH T ER AE N S ER IH Z DH AE T DH AH K AO R T HH AE Z B IH F AO R HH AE N D S T R AO NG P R IY Z AH M P T IH V EH V AH D AH N S AH V DH AH K R AY M AH N D DH AE T AH P R IH Z AH N ER IH Z N AA T P UH T T UW DH AH T AO R CH ER AH N T IH L IH T HH AE Z B IH N W EH L AE S ER T EY N D B AY T EH S T AH M OW N IY AH B T EY N D EH L S W EH R DH AE T HH IY IH Z AH G R EY T AH F EH N D ER 0 +librilm-9939 librilm 151 AH B EH T ER AE N T IH D OW T T UW DH AH S T OW N W IH DH IH N P EH R IH S IH Z T UW B IY F AW N D IH N DH AH S T OW N ER AW N D IH T 0 +librilm-9940 librilm 139 AH B EH T ER AH P AA L AH JH IY L AY Z IH N DH AH T EH K S T AH P R EH SH AH N M AE K IH TH AH W AY Z M AE N M AE D 0 +librilm-9941 librilm 355 AH B EH T ER AH P AA L AH JH IY M EY B IY F AW N D IH N DH AH IH M AH T EY T IH NG DH AH K AH N F EH SH AH N AH V AA N AH S T B EH N AH D IH K T DH AE T W EH N HH IY S EH D HH IY W UH D D AY AH B AE CH AH L ER HH IY D IH D N AA T TH IH NG K HH IY SH UH D L AY V T UW B IY M EH R IY D 0 +librilm-9942 librilm 303 AH B EH T ER AH P OY N T AH D AA R M IY K AH N S IH S T IH NG AH V DH AH V EH R IY F L AW ER AH V SH IH V AH L R IY AH V Y UH R AH P HH AE D IH N DH AH M IY N T AY M AH S EH M B AH L D T UW F AA L OW DH AH S EY M P AE TH DH OW IH N AH D IH F ER AH N T M AE N ER 0 +librilm-9943 librilm 163 AH B EH T ER AA R G Y AH M AH N T IH N F EY V ER AH V HH AA R T F ER D IH Z DH AE T TH R IY R EY L R OW D Z S EH N T ER DH EH R 0 +librilm-9944 librilm 106 AH B EH T ER AA R M ER ER N EH V ER L EY D HH AE M ER AA N AE N V AH L 0 +librilm-9945 librilm 316 AH B EH T ER AA R M IY M AE N F AO R M AE N P R AA B AH B L IY N EH V ER F EY S T AE N EH N AH M IY DH AE N DH AH W AH N K AH M AE N D AH D B AY JH EH N ER AH L T EY L ER IH N DH AH ER L IY AH S T T UW EH N G EY JH M AH N T S AH V DH AH M EH K S AH K AH N W AO R 0 +librilm-9946 librilm 144 AH B EH T ER AA R T DH AE N DH AE T AH V IY JH AH P T HH AE Z T EY K AH N F IH R AH N D K ER AH P SH AH N AW T AH V IH T 0 +librilm-9947 librilm 116 AH B EH T ER AH S AO R T IH D K AH P AH L Y UW K UH D F AY N D N OW W EH R 0 +librilm-9948 librilm 235 AH B EH T ER AH T ER N IY F AO R DH AH P ER P AH S AH Z T UW W IH CH HH IH Z L AY F W AA Z D IH V OW T AH D D IH D N AA T IH G Z IH S T IH N L AH N D AH N DH AE N M IH S T ER K AE M P D ER AW N 0 +librilm-9949 librilm 133 AH B EH T ER B AA R G AH N W AA Z D R IH V AH N IH N DH AH W IH R IY S K W EH R DH AE N EH N IY W EH R EH L S 0 +librilm-9950 librilm 93 AH B EH T ER B EY S AH S F AO R F R EH N D SH IH P K UH D N AA T B IY 0 +librilm-9951 librilm 112 AH B EH T ER B AE TH HH IY R R IH T ER N D R OW L Z AH N D N AH TH IH NG T UW P EY 0 +librilm-9952 librilm 64 AH B EH T ER B EH D AY N EH V ER HH AE D 0 +librilm-9953 librilm 128 AH B EH T ER B EH D R AA K P R IH N S AH P AH L K AE N HH AA R D L IY B IY IH M AE JH AH N D 0 +librilm-9954 librilm 331 AH B EH T ER B IH G IH N IH NG K UH D N AA T B IY M EY D DH AE N W IH DH DH AH HH IH R OW Z AH V HH OW M S T EH D AH N D IH T IH Z AH S P EH SH L IY F IH T IH NG DH AE T DH AH F ER S T IH M P AH T AH S SH UH D B IY G IH V AH N IH N K AH N EH K SH AH N W IH DH DH IH S HH IH S T ER IY 0 +librilm-9955 librilm 75 AH B EH T ER B IH HH EY V D L AE D D AH Z AH N T S T EH P 0 +librilm-9956 librilm 110 AH B EH T ER B AA D IY AH V HH EH L P ER Z K UH D S K EH R S L IY B IY G AA T AH N T AH G EH DH ER 0 +librilm-9957 librilm 94 AH B EH T ER B UH K F AO R B OY Z HH AE Z N EH V ER B IH N R IH T AH N 0 +librilm-9958 librilm 86 AH B EH T ER B UH K DH AE N AY SH AE L EH V ER R AY T W AA Z DH EH R 0 +librilm-9959 librilm 97 AH B EH T ER B UH K DH AE N DH AH P R IH Z AH N ER AH V Z EH N D AH 0 +librilm-9960 librilm 131 AH B EH T ER B UH K DH AE N DH IH S AA N P EH R IH S IH N T AY M HH AE Z N AA T CH AE N S T IH N AW ER W EY 0 +librilm-9961 librilm 65 AH B EH T ER B AA T AH L DH AE N DH AH F ER S T 0 +librilm-9962 librilm 93 AH B EH T ER B AW N D ER IY W UH D B IY DH AH R IH V ER IH T S EH L F 0 +librilm-9963 librilm 214 AH B EH T ER B OY T UW AE N AW L D F AA DH ER DH AE T S G UH D F AO R N AH TH IH NG N AW IH N DH IH S W ER L D N EH V ER W AA Z P L EY Z Y AO R HH AH N ER 0 +librilm-9964 librilm 249 AH B EH T ER B R EY V ER S OW L JH ER AO R AH M AO R F EY TH F AH L F R EH N D N OW M AE N EH V ER N UW DH AE N CH AA R L Z D IY N T R UW P AH S IH K S TH M IH SH IH G AH N K AE V AH L R IY 0 +librilm-9965 librilm 33 AH B EH T ER B R EY K 0 +librilm-9966 librilm 255 AH B EH T ER B R AY T ER B OY N EH V ER D R UW B R EH TH HH IY S ER V D Y UW F EY TH F AH L AE Z DH AH D EY W AA Z L AO NG AH N D Y UW T R IY T AH D HH IH M SH EY M F AH L W ER S AH N AH S L EY V 0 +librilm-9967 librilm 197 AH B EH T ER B R AH DH ER N EH V ER L AY V D B AH T HH IY M EY HH AE V B IH N T UW R EH D IY T UW F AO L IH N W IH DH AH DH ER P IY P AH L Z V Y UW Z 0 +librilm-9968 librilm 187 AH B EH T ER B R AO T AH P B EH T ER D IH S P OW Z D Y UW TH DH AE N Y UW W ER W IH DH AH HH AY ER S EH N S AH V HH AH N ER K UH D N AA T B IY F AW N D 0 +librilm-9969 librilm 97 AH B EH T ER K AE P T AH N D OW N T W AO K DH AH D EH K Y AO R HH AH N ER 0 +librilm-9970 librilm 157 AH B EH T ER K AE P T AH N T UW L EH D AH B EH T ER S OW L JH ER T UW S T R AY K W IH DH DH AH S AO R D AY N EH V ER S AO 0 +librilm-9971 librilm 40 AH B EH T ER CH AE N S 0 +librilm-9972 librilm 144 AH B EH T ER CH AE N S AH W EY T S DH IY SH IY M IY T S DH AH F OW M IY T S W EH N SH AE L SH IY R IH T ER N 0 +librilm-9973 librilm 141 AH B EH T ER CH AE N S F AO R AH SH AA T K UH D HH AA R D L IY HH AE V B IH N AE S K T F AO R 0 +librilm-9974 librilm 561 AH B EH T ER CH AE N S F AO R HH IH Z P AW ER Z AH K ER D IH N DH AH AH S EH M B L IY AH V DH AE T Y IH R IH N K AH N EH K SH AH N W IH DH AH P L ER AE L IH T IY K EY S W EH R DH AH W AH N D ER F AH L D IH S P L EY AH V HH IH Z T AE L AH N T S K AH N T R IH B Y UW T IH D M AH CH T UW DH AH P AE S IH NG AH V AE N EH N AE K T M AH N T DH AE T N OW P R AH F EH S ER SH IH P IH N AH Y UW N AH V ER S AH T IY SH UH D B IY HH EH L D IH N K AH N EH K SH AH N W IH DH AH K AH N T R IY CH AA R JH 0 +librilm-9975 librilm 76 AH B EH T ER CH AE N S F AO R Y UW IH Z K AH M IH NG 0 +librilm-9976 librilm 56 AH B EH T ER CH AE N S M EH R IY 0 +librilm-9977 librilm 154 AH B EH T ER CH AE N S S EH D M IH S T ER HH Y UW M G R IH M L IY DH AE N W IY HH AE V AH V K AE CH IH NG DH AH OW K AA P IY 0 +librilm-9978 librilm 316 AH B EH T ER CH AE N S DH AH B AE L AH W EY N K AH N T IH N Y UW D AH V DH AH F Y UW P L EY S AH Z OW P AH N IH N DH AH AY L AH N D DH AE N IH F HH IY W ER B R AO T AH P AE T DH AH M AE NG K S B AA R OW N L IY W IH CH W UH D K AA S T M IY L EH S DH AE N HH AE F AE Z M AH CH 0 +librilm-9979 librilm 286 AH B EH T ER K EH R IH K T ER HH AE Z B IH N G IH V AH N T UW DH AH R EH G Y AH L ER T R UW P S F AO R DH EH R IH N D EH V ER Z T UW D IH S P ER S DH AH P IY P AH L W IH TH AW T W UW N D IH NG AO R AH DH ER W AY Z IH N JH ER IH NG DH EH M 0 +librilm-9980 librilm 129 AH B EH T ER CH AY L D N EH V ER B R IY DH D S EH D D AO L T AH N D R IH NG K IH NG AO F HH IH Z G L AE S 0 +librilm-9981 librilm 145 AH B EH T ER S IH T AH Z AH N D AH Z N AA T IH G Z IH S T AH N D AW ER F R EH N D SH IH P HH AE Z N EH V ER F AA L T ER D 0 +librilm-9982 librilm 306 AH B EH T ER K L EY M M AY T B IY R EY Z D AH P IH N Y AO R G R EY S IH Z OW N P ER S AH N S EH D DH AH ER L AH V AA K S F ER D IH F Y UW W IH L AH F AO R D M AA R G ER IH T AH V AE N JH UW DH AH S UW K AO R SH IY R IY K W AY ER Z B AY M IY 0 +librilm-9983 librilm 222 AH B EH T ER K L AE S AH V M EH N S IY M T UW B IY JH OY N IH NG DH AH K AH L ER Z DH IY Z D EY Z AH N D DH EY AA R K AO L IH NG DH EH R D IH F AE M ER Z T UW AH S T R IH K T AH K AW N T IH NG 0 +librilm-9984 librilm 341 AH B EH T ER K L AE S AH F AH K EY SH AH N B EY S T AA N M AO R K EH R F AH L S T AH D IY AH V DH AH HH IH S T ER IY AH V DH AH IH NG G L IH SH V ER B D IH V AY D Z V ER B Z IH N T UW DH OW Z AH V DH AH W IY K AH N D DH OW Z AH V DH AH S T R AO NG K AA N JH AH G EY SH AH N Z 0 +librilm-9985 librilm 454 AH B EH T ER K L AE S AH F AH K EY SH AH N IH Z IH N T UW DH AH S OW SH AH L IH N K L UW D IH NG G UH D W IH L L AH V AH V R EH P Y AH T EY SH AH N D IH Z AY ER AH V AE M IH T IY R IH L IH JH AH N D IH S OW SH AH L D IH S P L EH ZH ER S EH L F R AH G AA R D IH NG F IH Z IH K AH L D IH Z AY ER P EH K Y UW N IY EH R IY IH N T R AH S T L AH V AH V P AW ER S EH L F P R EH Z ER V EY SH AH N 0 +librilm-9986 librilm 269 AH B EH T ER K AH M IY D IY AH N Y UW M EY B IY B AH T HH IY HH AE Z N AA T Y AO R S K R UW P AH L Z Y AO R S EH N S AH T IH V N AH S AH N D IH Z DH EH R F AO R M AO R D EH K S T ER AH S AE T D R AO IH NG DH AH K R AW D Z AH T EH N SH AH N 0 +librilm-9987 librilm 237 AH B EH T ER K AH M AE N D ER AY D N EH V ER D IH Z AY ER T UW S ER V AH N D HH UW N OW Z B AH T AY M EY HH EH L P T UW S EH T AH P DH AY S T AE N D IH NG R IH G IH NG IH N AH N AH DH ER W ER L D 0 +librilm-9988 librilm 789 AH B EH T ER K AA M EH N T K UH D N AA T B IY M EY D AA N W AH T IH Z R IY K W AY ER D T UW P ER F IH K T M AE N AH N D P L EY S HH IH M IH N DH AE T S UW P IH R IY ER P AH Z IH SH AH N F AO R W IH CH HH IY W AA Z D IH Z AY N D DH AE N B AY DH AH IH N T ER P R IH T EY SH AH N AH V B EY K AH N AH P AA N DH AH L EH JH AH N D Z AH V DH AH S IH R AH N K OW S T W EH N DH AH W AY Z Y UW L IH S IY Z P AE S T S EH Z HH IY HH IY K AA Z D HH IH Z M EH R AH N ER Z T UW S T AA P DH EH R IH R Z W IH DH W AE K S N OW IH NG DH EH R W AA Z IH N DH EH M N OW P AW ER T UW R IH Z IH S T DH AH L UH R AH V DH AE T V AH L AH P CH AH W AH S S AO NG 0 +librilm-9989 librilm 315 AH B EH T ER K AH M P AE N Y AH N DH AE N HH ER W AY T K IH T AH N AO R HH ER F EY V ER IH T N IH R OW AO R IY V IH N HH ER F EY TH F AH L F R EH N D P IY EH R DH AH S EY N T B ER N AA R D AA K Y AH P AY D DH AH AH DH ER V EH L V AH T R AA K IH NG CH EH R 0 +librilm-9990 librilm 155 AH B EH T ER K AH M P EH R AH S AH N IH Z DH AE T W IH CH M IH S T ER G AA S HH AE Z M EY D W IH DH S IH D N IY D OW B AH L Z B AO L D ER 0 +librilm-9991 librilm 227 AH B EH T ER K AH N S EH P SH AH N AH V L AE NG G W AH JH K UH D N AA T HH AE V B IH N F AO R M D IH N P L EY T OW Z EY JH DH AE N DH AE T W IH CH HH IY AE T R IH B Y UW T S T UW S AA K R AH T IY Z 0 +librilm-9992 librilm 130 AH B EH T ER K AH N D IH SH AH N AH V TH IH NG Z N AW P R IY Z EH N T AH D IH T S EH L F 0 +librilm-9993 librilm 99 AH B EH T ER K AH N D AH K T ER SH IY K UH D N AA T HH AE V W IH SH T 0 +librilm-9994 librilm 168 AH B EH T ER K AH N D AH K T ER W UH D B IY DH AH M EH T AH L K AH V ER IH NG AH V DH AH R UW F W EH N S AH CH M AH T IH R IY AH L IH Z Y UW Z D 0 +librilm-9995 librilm 463 AH B EH T ER K AA N S T AH T UW T AH D B OY W UH D S ER T AH N L IY HH AE V P R AA F AH T AH D AH N D ER M AY IH N T EH L AH JH AH N T T UW T ER Z W IH DH DH EH R S AY AH N T IH F IH K AE P ER AE T AH S AH N D W UH D D AW T L AH S HH AE V F AW N D DH AH F AH N AA M AH N AH AH V IH L EH K T R IH S AH T IY AH N D M AE G N AH T IH Z AH M AE Z F AE S AH N EY T IH NG AE Z AY W AA Z EH V ER IY TH ER Z D EY AH SH UH R D DH EY W ER 0 +librilm-9996 librilm 81 AH B EH T ER K AH N T R IY F AO R HH IH M DH AE N DH IH S 0 +librilm-9997 librilm 415 AH B EH T ER K AH N T R IY W AA Z R IY CH T AE Z W IY N IH R D DH AH R IH V ER AH N D IH T W AA Z AH P L EH Z AH N T S AY T T UW S IY DH AH T AH M B AH L IH NG S T R IY M AH V DH AH L EH S ER T UW G EY L AH AH N D T UW F AY N D IH N W AH N V AE L IY DH AH P R IY T AH N S AH V AH G AA R D AH N AH N D AH HH AW S AH M AH NG T R IY Z 0 +librilm-9998 librilm 370 AH B EH T ER K AO R S AE T DH AH R IH NG K UH D N AA T B IY R AH N DH AE N S ER JH AO S L IH N HH AE TH P ER F AO R M D N AO R K UH D G R EY T ER V AE N T AH JH B IY G EY N D IH N DH AH JH AW S T S DH AE N HH IY HH AE TH AH B T EY N D OW V ER DH AH M AA R K IY AH V B AH K IH NG HH AE M 0 diff --git a/SpeechLM/dataset/LibriSpeech/fast_phone2unit/train_exmples.tsv b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/train_exmples.tsv new file mode 100644 index 0000000..bbdef25 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/fast_phone2unit/train_exmples.tsv @@ -0,0 +1,100 @@ +id speaker n_frames tgt_text duration unit +103-1240-0000 103 704 1 10 4 29 33 14 38 5 25 1 24 19 31 19 40 30 15 10 5 23 19 25 11 1 19 40 31 14 29 30 8 40 11 1 24 19 31 19 40 30 15 10 5 23 19 25 11 1 23 19 37 11 1 21 5 31 33 38 13 30 12 20 4 37 5 25 23 20 24 15 25 30 27 11 1 11 19 29 33 1 11 7 25 19 25 33 36 5 23 19 33 5 23 18 3 23 27 1 16 30 19 25 21 11 38 19 34 6 23 11 14 40 5 25 11 23 15 11 20 40 19 30 11 30 3 29 31 5 25 11 33 30 5 37 14 31 33 9 8 5 9 30 35 22 1 22 6 3 4 2 4 5 4 9 14 5 2 4 2 5 4 4 3 4 6 5 5 4 1 5 3 4 2 4 2 9 6 4 84 4 2 4 4 5 4 3 4 4 6 6 6 7 3 5 3 3 2 4 6 4 5 4 2 3 3 2 5 8 3 2 5 2 7 8 7 7 4 9 5 8 3 3 4 4 5 4 8 3 1 3 4 2 3 5 2 2 2 4 5 4 5 8 13 8 2 3 4 4 2 2 2 2 7 4 4 4 5 1 2 4 3 6 2 5 4 3 3 4 3 4 4 4 2 1 3 2 2 2 2 7 3 4 2 5 4 5 3 5 6 6 17 17 17 296 296 317 317 317 317 317 491 461 461 461 461 461 461 491 491 184 184 184 289 310 107 107 395 351 486 486 460 215 215 35 96 272 300 382 382 245 43 364 276 174 174 174 174 319 282 282 388 303 303 117 404 404 439 439 225 225 225 225 225 225 225 491 391 391 47 491 73 80 289 7 7 217 473 258 258 258 31 342 224 494 494 494 368 281 9 142 142 147 147 329 329 329 329 329 329 36 310 107 395 395 302 302 497 497 251 251 241 241 431 329 432 330 330 388 195 195 64 212 212 131 483 226 226 226 209 356 356 356 356 31 162 68 224 224 494 494 215 129 74 190 190 499 499 499 265 265 85 85 85 85 207 318 185 185 433 433 86 6 6 227 419 417 417 417 237 237 237 237 237 237 237 237 237 237 237 237 362 491 362 305 40 491 305 40 40 362 362 40 40 40 40 40 40 40 40 218 491 218 218 218 491 305 218 491 218 218 218 218 218 218 491 218 435 491 218 491 218 218 218 491 218 218 491 369 491 369 369 369 369 369 21 21 21 21 21 21 21 21 408 408 408 149 228 228 491 289 320 7 473 258 258 258 258 342 342 224 494 494 494 494 31 9 9 142 397 147 147 329 329 329 329 329 143 36 107 107 395 302 302 497 497 251 251 251 241 241 431 278 278 278 278 330 388 388 195 195 195 243 212 131 419 439 225 225 225 80 491 80 7 7 251 241 431 278 278 278 173 173 402 402 401 401 401 401 401 491 310 107 395 395 180 151 151 151 169 150 150 86 86 238 6 272 397 133 345 109 109 109 264 264 313 216 216 22 448 448 448 14 14 14 145 145 145 486 460 460 460 173 280 29 242 242 116 33 250 250 251 241 81 444 324 324 324 324 324 301 339 217 217 217 217 217 473 65 290 290 290 290 290 434 434 339 339 33 250 250 42 42 147 147 380 288 84 496 496 496 496 496 274 274 37 24 131 404 439 78 414 80 80 80 80 80 80 80 401 384 371 278 278 278 215 35 35 96 401 401 401 401 401 401 401 401 401 239 384 371 180 315 315 315 315 315 450 450 413 413 94 199 340 340 33 76 465 377 123 123 123 88 88 44 44 44 251 251 241 431 278 278 285 285 302 302 497 497 497 58 72 72 72 437 481 481 481 481 481 481 175 175 81 84 84 84 496 274 98 98 229 247 247 126 126 126 326 326 326 326 326 101 101 149 228 491 373 393 234 234 155 190 190 487 288 288 278 330 339 64 64 212 310 447 447 6 272 472 345 333 333 220 220 164 14 14 411 411 284 481 481 481 293 293 122 122 384 300 334 334 304 304 304 49 269 342 168 89 89 89 446 33 33 250 251 251 241 431 470 171 171 171 252 252 325 34 41 324 324 318 368 368 342 9 219 485 286 286 382 382 313 236 239 161 161 79 499 499 405 405 206 215 215 233 270 270 433 342 224 89 89 322 67 394 76 465 161 161 492 492 492 8 8 280 498 498 498 498 498 396 186 39 54 238 6 272 472 336 336 62 62 62 62 62 146 464 44 44 44 8 32 401 354 190 190 380 380 499 496 496 496 178 233 233 458 192 419 427 247 247 15 193 193 17 +103-1240-0001 103 797 1 12 5 33 18 4 11 19 33 31 6 30 31 5 38 15 9 4 22 19 25 12 5 38 35 11 40 5 37 12 20 27 23 11 22 5 34 9 14 33 29 23 15 31 1 19 33 38 5 40 30 19 29 39 36 33 19 11 33 19 9 20 5 25 19 25 33 30 5 22 5 33 18 13 11 23 6 26 9 30 35 22 19 25 19 33 31 1 14 23 20 14 22 6 30 31 34 30 36 12 27 40 38 35 11 40 1 38 19 34 11 3 30 22 31 20 22 30 19 33 31 5 37 29 36 23 5 25 11 22 4 31 22 15 11 1 9 5 33 9 8 12 5 33 8 24 19 33 30 20 10 33 23 19 25 11 40 18 3 23 27 19 33 38 5 40 5 22 38 8 5 33 1 38 13 23 22 5 25 11 5 22 33 5 11 23 19 33 5 23 31 33 30 20 24 1 8 2 2 2 7 3 2 3 4 8 4 5 4 4 5 9 6 4 4 3 3 1 3 7 3 3 3 1 2 3 4 4 2 4 5 3 6 3 3 4 4 2 5 12 29 6 3 3 2 3 2 3 3 2 4 2 3 3 1 2 3 5 1 3 5 4 4 2 1 3 4 3 9 3 4 3 6 6 3 4 2 5 2 2 2 3 2 2 6 3 3 3 6 4 3 4 3 2 2 3 5 5 5 4 4 5 14 4 2 7 4 4 5 4 9 4 4 2 2 3 3 2 3 7 9 3 3 2 2 6 4 6 3 9 5 27 2 6 4 3 5 2 2 6 5 3 2 3 4 4 5 2 4 4 4 2 2 5 4 5 9 5 3 3 2 3 2 6 3 8 3 4 2 5 3 4 3 2 4 3 3 4 2 3 3 3 2 2 2 3 3 4 2 6 6 6 17 17 363 363 51 51 228 320 127 45 45 45 385 131 58 72 72 110 110 110 110 486 460 240 240 325 34 154 154 154 457 478 478 232 232 482 482 172 115 273 273 153 153 153 372 372 396 396 186 186 54 54 172 224 273 255 255 43 364 364 276 109 109 403 403 403 403 403 207 246 324 301 301 129 401 354 354 180 376 376 376 460 178 178 458 192 192 242 340 116 466 466 22 283 455 43 364 364 276 276 153 153 496 496 37 37 24 77 270 342 224 69 69 130 130 198 22 448 448 448 464 180 424 424 424 424 424 274 122 131 472 221 401 82 144 27 437 151 151 169 169 164 164 472 221 401 259 29 380 382 396 313 385 35 472 401 259 74 425 425 386 343 343 343 343 343 358 358 39 39 433 433 160 160 160 112 427 56 56 491 312 312 341 341 341 341 341 341 12 12 12 21 21 21 21 21 21 21 21 21 408 408 408 408 391 391 228 491 491 412 177 177 177 177 177 131 133 345 141 141 141 281 453 142 397 456 456 456 456 129 259 74 485 485 485 485 374 374 325 449 449 191 191 191 314 314 36 377 87 87 8 8 420 420 420 324 464 44 44 44 94 335 335 411 411 188 121 121 33 64 76 465 465 161 161 487 469 469 143 458 192 192 278 278 278 37 314 131 472 72 72 72 72 72 72 110 110 443 120 240 314 314 26 26 26 251 241 431 235 235 235 235 235 413 200 200 248 248 248 212 354 190 380 380 499 496 496 496 178 233 458 192 192 340 340 340 94 199 154 154 77 342 342 142 14 411 498 498 498 498 498 134 175 81 166 324 324 464 382 382 245 129 458 208 208 441 441 441 153 153 372 372 396 186 186 323 323 238 6 272 377 487 487 374 313 216 216 114 124 124 124 274 274 368 269 9 142 397 336 276 109 109 496 496 496 37 37 37 24 270 270 433 160 427 229 247 247 126 126 326 326 326 326 326 101 101 149 149 228 228 491 345 333 333 333 220 220 164 402 221 401 401 401 491 384 371 180 106 306 306 306 306 396 396 178 178 35 458 96 96 66 66 68 68 68 68 115 115 444 213 213 213 143 458 208 208 487 487 288 277 385 143 270 270 342 224 69 462 462 130 402 402 401 401 491 74 190 441 441 441 153 153 182 182 182 182 182 497 175 175 81 89 89 446 116 33 131 472 221 458 445 445 351 351 486 486 460 460 169 150 342 342 86 105 336 445 445 470 403 403 171 171 171 246 246 252 24 131 404 439 78 170 305 491 28 28 28 491 491 491 2 201 305 305 491 305 305 2 316 316 316 316 316 491 491 289 289 289 320 354 159 159 159 159 159 240 35 131 472 221 336 354 62 62 62 62 62 438 216 22 283 455 236 108 119 119 103 103 103 103 103 85 299 203 53 473 177 177 143 131 133 133 147 380 288 213 213 213 252 143 310 447 447 447 26 26 251 251 241 81 329 329 329 330 388 195 195 471 471 49 453 142 58 72 72 437 437 481 481 481 481 293 175 175 81 84 84 84 84 84 16 274 274 98 483 483 440 188 177 177 177 131 133 133 345 141 141 141 281 9 168 44 44 143 458 208 208 441 441 441 346 346 265 265 85 85 85 146 146 277 277 277 385 385 227 419 225 225 226 197 7 364 276 109 109 139 139 293 293 122 143 458 144 27 27 121 116 33 33 212 239 371 180 151 151 151 178 35 96 96 36 272 191 191 191 37 314 26 251 241 431 431 278 285 285 302 302 497 497 186 162 482 482 338 238 161 79 487 288 288 360 360 434 434 434 203 381 381 404 13 491 247 15 193 193 193 17 +103-1240-0002 103 697 1 16 6 30 25 3 33 20 37 19 25 5 9 30 35 22 1 22 35 11 30 5 25 29 4 31 33 24 19 31 19 40 30 15 10 5 23 19 25 11 40 11 6 30 38 19 12 7 33 11 39 36 30 19 17 3 30 11 16 14 11 20 31 5 25 31 20 4 25 11 19 22 6 30 5 24 1 19 33 29 30 3 9 5 9 23 20 38 5 40 22 3 25 32 5 31 12 5 33 24 19 31 19 40 30 15 10 5 23 38 5 40 31 19 33 19 26 4 33 18 14 38 19 25 11 27 1 22 20 29 19 26 5 32 3 30 29 8 3 25 13 37 30 20 34 19 26 12 5 33 29 4 31 33 1 16 14 24 9 30 35 22 31 5 25 11 10 19 23 11 30 5 25 5 29 1 8 6 2 3 2 6 2 6 3 1 3 3 5 5 3 10 4 4 2 4 4 3 5 5 7 4 2 2 3 3 3 4 3 3 3 3 7 3 4 3 3 3 3 3 3 2 3 6 2 2 3 4 4 2 3 6 4 3 3 4 4 5 4 3 5 5 7 3 2 4 2 6 4 5 2 6 32 6 3 3 3 3 2 3 3 3 4 3 2 3 6 4 4 4 5 5 2 2 4 2 3 4 3 5 4 4 4 4 5 3 2 2 5 1 3 2 5 2 3 4 3 4 2 4 2 9 11 4 4 3 2 4 2 9 4 3 3 11 5 4 4 5 3 3 4 2 4 2 2 2 7 9 6 4 9 3 4 3 2 2 3 3 3 2 2 2 3 2 3 3 2 1 4 8 6 9 17 17 17 363 363 51 51 228 491 373 155 155 155 148 148 387 372 313 10 479 479 307 307 307 307 61 167 449 449 34 357 357 357 357 357 173 280 29 242 116 94 199 44 44 44 8 129 401 259 354 190 190 380 380 499 496 496 496 167 233 233 144 192 419 419 439 225 225 225 80 80 491 491 144 389 389 389 389 389 133 133 42 147 147 380 499 319 319 319 348 348 195 394 90 76 74 74 437 311 311 311 311 311 311 460 169 150 342 86 6 6 196 217 473 258 258 258 31 342 224 494 494 368 281 9 142 397 147 329 329 329 329 329 36 310 107 302 302 302 497 497 251 251 251 241 431 329 329 330 116 33 195 195 471 471 49 269 142 238 6 272 106 153 153 372 372 372 245 43 345 333 333 220 220 216 180 113 113 113 113 167 167 236 239 401 384 219 485 485 374 374 132 132 42 147 456 456 456 456 416 144 27 106 306 306 306 306 306 306 396 313 24 24 131 472 393 155 332 332 332 313 236 239 239 384 371 213 213 213 252 186 39 342 342 11 11 11 379 379 379 394 76 478 66 68 68 115 267 41 41 41 246 3 464 464 89 194 446 446 446 64 212 239 384 490 490 143 458 144 208 441 441 153 153 153 372 372 372 467 467 467 275 203 381 381 48 404 13 491 491 312 312 312 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 149 228 491 289 412 177 177 177 177 177 35 401 259 74 190 190 488 488 488 488 488 8 29 134 134 134 134 8 8 359 359 166 166 166 324 301 378 345 141 141 141 281 9 142 221 144 27 27 437 370 370 370 370 370 370 348 64 76 310 107 395 395 459 459 459 271 271 39 86 86 238 198 45 45 45 45 45 35 401 196 217 473 258 258 258 31 342 342 224 494 494 494 368 453 9 142 397 147 147 329 329 329 329 329 329 143 310 107 107 395 302 302 302 375 497 497 497 43 364 345 141 141 141 31 162 232 68 172 115 470 278 278 325 34 176 135 135 200 200 464 415 415 415 415 415 131 183 156 156 156 156 245 43 364 364 109 109 278 278 116 33 64 212 212 34 84 84 84 84 274 274 98 229 229 247 126 126 326 326 101 408 408 228 491 491 491 445 445 213 213 213 213 252 215 458 176 176 135 135 200 200 44 44 44 44 99 338 338 338 338 338 395 106 306 306 306 306 396 396 215 35 35 335 145 284 265 265 265 85 85 85 146 464 464 106 125 125 125 125 348 94 335 14 411 204 204 204 204 204 204 204 29 29 337 337 324 422 422 164 164 164 214 214 214 328 200 248 466 114 114 45 45 385 90 401 82 74 119 311 311 311 311 311 311 311 311 311 282 169 169 150 39 433 86 238 6 75 227 419 225 225 225 225 225 491 373 305 80 289 491 155 165 165 165 165 165 203 53 212 239 190 380 380 496 496 178 35 96 270 342 342 224 89 89 446 33 394 310 107 395 395 106 139 424 387 122 122 122 300 300 242 242 116 94 335 335 411 230 230 230 230 230 230 215 215 233 233 419 427 229 247 247 126 126 193 193 193 193 17 +103-1240-0003 103 735 1 4 25 11 12 4 33 19 16 32 20 25 27 33 5 31 33 13 25 20 34 19 26 1 3 11 1 6 30 7 33 5 37 29 23 15 31 1 32 20 38 35 11 25 13 37 14 30 13 31 33 5 25 33 19 23 32 20 18 4 11 16 13 30 5 33 19 11 7 33 12 5 38 8 40 5 25 11 38 13 30 16 6 30 40 12 13 30 5 37 1 12 13 30 3 30 29 23 13 25 33 20 5 37 29 20 29 5 23 19 25 4 37 5 25 23 20 4 25 11 7 33 5 37 19 33 1 18 36 22 5 25 5 33 13 25 11 22 23 27 31 23 20 33 19 12 13 30 25 15 9 14 40 9 19 40 25 19 31 9 8 11 19 25 33 5 37 25 19 17 23 13 22 33 19 26 12 13 30 27 25 1 8 7 2 1 2 4 2 4 3 3 2 5 4 2 3 4 4 3 4 3 3 2 3 2 11 2 2 4 4 6 3 2 2 7 2 9 7 14 7 3 3 2 3 4 3 3 4 5 4 8 3 3 3 2 3 2 5 3 2 1 4 4 2 4 3 2 2 3 7 4 2 3 6 11 5 2 2 4 3 3 4 6 3 3 4 3 2 8 5 9 61 3 2 1 2 3 5 2 2 3 2 3 1 3 3 5 2 2 4 5 4 5 2 3 5 3 9 5 2 4 7 2 2 3 4 5 13 4 2 3 3 2 3 5 4 3 4 5 3 4 6 2 2 4 1 2 2 3 3 5 4 2 5 3 2 5 3 4 3 4 6 4 3 3 3 2 2 3 2 3 2 3 3 3 1 3 3 2 5 6 5 12 17 17 17 363 363 51 149 228 228 209 83 194 194 194 322 322 67 212 127 45 45 45 45 240 240 325 118 118 118 118 118 402 338 400 400 400 30 301 301 10 479 331 84 84 496 274 252 36 449 459 459 459 31 342 86 86 6 272 483 483 411 475 475 475 475 475 475 475 475 349 164 164 214 214 214 214 200 248 14 14 411 287 284 284 284 426 426 426 206 206 206 24 335 335 226 157 157 157 157 157 245 14 14 411 145 113 113 113 113 285 285 34 462 462 130 402 401 401 491 74 425 425 386 386 431 343 343 343 343 358 358 358 358 358 39 433 433 433 160 427 247 247 247 126 126 292 326 326 326 326 326 408 408 149 228 491 373 338 338 400 400 400 400 301 378 43 345 389 389 389 314 314 196 309 309 479 331 463 463 463 463 280 29 382 245 245 42 42 147 380 380 288 443 443 120 169 169 150 39 433 86 86 86 6 6 272 34 89 319 319 348 394 76 108 377 139 139 139 139 293 186 99 338 400 400 400 30 3 58 254 254 254 314 131 393 234 234 261 25 470 264 264 468 468 468 396 313 143 449 449 191 191 191 325 180 180 113 113 113 113 113 167 314 314 401 401 198 22 283 455 455 43 364 364 276 346 346 346 265 265 265 265 85 85 85 146 146 318 318 368 453 342 168 89 89 446 116 212 131 133 43 364 276 109 109 264 264 264 468 245 245 349 234 234 155 25 148 148 148 372 372 304 304 49 9 9 221 198 127 114 114 264 264 468 406 406 467 467 106 284 284 426 426 206 206 37 173 352 352 352 352 419 439 439 237 237 237 491 491 491 28 491 491 491 491 341 341 341 341 341 341 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 260 491 163 163 163 163 163 163 316 491 316 316 73 289 289 289 127 114 0 222 468 353 353 353 353 215 35 259 74 425 425 386 431 432 330 330 348 76 449 41 324 464 462 462 462 402 221 259 74 351 213 213 213 252 252 129 354 100 100 100 497 497 335 335 440 188 188 340 116 94 199 145 145 145 486 460 460 173 280 29 242 242 116 33 250 250 359 359 474 474 474 324 246 19 3 3 14 14 209 145 194 194 446 446 388 64 212 335 14 411 145 145 113 113 113 450 413 285 34 223 223 223 280 280 277 277 277 277 277 233 75 227 427 229 247 312 292 292 326 326 101 101 149 391 228 491 491 373 489 489 489 489 143 458 144 389 389 389 94 199 255 255 236 36 108 119 119 351 432 432 432 330 388 195 64 131 472 472 221 458 144 208 208 425 386 386 496 496 496 274 186 186 54 54 86 26 26 474 474 166 301 143 36 377 123 123 123 114 222 222 222 222 313 10 10 479 398 290 171 171 252 215 458 29 382 382 304 368 269 342 142 221 336 354 278 278 278 368 453 342 86 196 196 94 459 459 459 271 31 342 342 221 221 336 354 62 62 62 62 62 438 438 143 36 384 371 371 278 278 330 33 64 76 108 449 69 223 130 402 196 479 331 255 154 416 458 208 386 431 151 151 151 178 458 96 36 272 176 135 135 200 248 248 127 114 222 222 222 406 406 467 467 350 350 350 350 350 350 413 413 303 48 404 13 229 491 491 312 15 15 15 193 193 193 17 +103-1240-0004 103 625 1 9 5 33 24 19 31 19 40 30 15 10 5 23 19 25 11 38 5 40 38 5 25 5 37 12 27 40 22 15 29 5 9 5 23 22 30 20 10 14 40 18 36 22 5 25 24 4 25 19 21 12 13 30 27 25 22 5 25 31 14 25 40 4 25 11 12 27 40 5 37 5 12 14 16 27 22 31 19 25 33 5 12 5 9 3 30 17 5 25 1 32 20 38 5 40 5 25 27 33 5 9 5 23 18 7 31 38 8 16 1 18 14 38 14 22 38 5 40 6 23 38 20 40 11 5 25 4 25 11 38 13 23 11 5 25 1 32 20 30 4 25 1 12 5 31 27 19 26 31 14 22 5 23 1 13 3 3 3 2 3 4 2 5 3 3 4 4 6 5 3 3 3 2 3 3 2 2 3 2 2 5 3 8 4 2 2 4 2 4 6 3 4 6 4 4 2 2 3 3 3 3 3 2 4 5 2 2 4 7 2 4 2 3 6 5 4 3 3 3 1 3 5 4 2 4 3 3 2 5 6 3 3 2 2 2 2 1 2 3 3 4 3 2 6 37 6 3 3 1 3 3 3 3 2 2 1 2 3 4 4 6 3 5 9 7 4 4 6 4 4 2 2 3 4 4 4 3 4 3 6 7 8 2 3 4 4 5 4 4 11 7 8 9 7 10 7 1 2 4 5 4 3 4 4 4 4 2 6 7 17 17 17 296 363 363 51 51 51 491 491 491 491 320 320 159 159 159 159 314 35 196 196 473 258 258 258 31 342 224 494 494 494 368 453 142 142 397 147 380 329 329 329 329 143 36 310 107 395 134 302 302 497 497 251 251 251 241 431 278 278 278 330 388 195 64 212 131 133 133 141 141 141 281 453 142 221 336 174 174 174 174 348 199 223 223 223 130 198 198 124 124 124 124 124 368 31 342 86 221 221 336 445 445 445 351 351 171 171 171 252 215 29 134 134 134 8 259 354 100 100 497 497 497 122 129 259 144 208 208 190 487 487 213 213 213 252 143 36 310 107 395 334 334 334 304 304 185 49 269 342 224 224 489 489 489 143 144 27 389 389 116 33 250 217 217 473 365 365 365 330 94 199 469 469 469 24 36 310 447 447 447 6 127 222 222 222 245 245 14 411 411 350 350 350 350 413 64 394 465 465 27 27 121 116 33 394 478 478 232 172 224 273 470 498 308 308 467 299 388 379 471 471 49 342 168 89 194 194 446 322 64 212 198 114 114 84 496 496 274 318 49 269 342 224 69 462 130 129 402 106 493 493 493 216 300 300 382 245 349 205 261 261 25 496 496 496 496 274 274 233 96 270 433 342 168 340 340 116 33 36 377 123 123 216 283 455 8 354 106 306 306 306 306 396 396 416 416 192 192 275 275 116 303 303 48 48 229 170 491 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 408 408 408 391 391 391 228 491 491 373 338 400 400 400 30 378 378 141 141 141 281 342 342 44 44 44 94 331 84 84 496 496 285 449 134 134 8 100 100 497 497 58 72 72 268 268 268 268 268 169 186 39 54 142 397 397 276 346 346 346 428 85 146 146 358 352 352 352 352 352 352 417 417 417 417 237 491 435 225 225 225 72 156 156 156 156 245 245 43 364 276 276 109 109 498 396 396 178 143 259 458 208 345 141 141 281 281 9 168 106 297 297 297 297 297 297 43 43 345 109 109 171 171 368 368 342 342 221 336 371 180 180 319 319 319 319 282 388 195 195 195 117 404 335 440 209 83 194 194 194 194 446 446 64 212 131 133 364 364 276 109 109 443 139 139 139 293 293 497 122 239 36 371 180 319 319 319 319 282 303 303 303 303 117 404 439 439 439 78 237 47 47 47 80 491 80 491 373 373 338 338 338 400 400 400 30 30 246 246 246 3 3 197 197 7 42 147 147 147 380 210 210 210 210 486 365 282 282 282 388 388 195 195 199 404 404 197 197 216 22 283 283 455 38 162 482 115 273 273 84 496 88 88 176 176 176 328 200 248 478 66 172 115 273 498 498 498 245 143 458 458 302 302 302 302 375 98 98 229 247 247 15 15 193 193 193 17 +103-1240-0005 103 758 1 18 13 23 29 33 30 5 25 12 5 31 5 25 11 15 31 22 36 23 4 25 11 38 5 40 12 5 31 33 30 6 26 17 5 31 33 29 30 3 29 5 37 1 12 5 10 14 10 1 15 11 31 5 31 8 5 33 20 4 25 11 16 6 30 5 25 24 19 32 5 25 40 3 17 40 19 23 39 14 20 1 39 13 33 38 19 12 6 23 12 19 31 1 24 19 31 19 40 30 15 10 5 23 16 7 25 11 1 5 9 5 25 11 5 25 33 8 24 33 5 31 19 33 16 14 7 14 40 4 33 18 14 22 19 10 5 25 38 19 25 11 27 1 25 19 33 19 26 22 3 33 5 25 38 6 30 29 22 38 19 23 33 31 1 32 20 18 4 11 25 19 33 19 11 31 19 22 31 33 20 25 5 37 12 13 24 1 9 5 2 4 3 3 5 4 4 2 2 6 3 3 3 5 6 2 7 5 6 2 3 3 2 3 2 3 4 4 2 3 3 3 2 4 3 4 4 4 4 1 2 2 1 3 7 5 5 2 7 4 3 2 6 7 3 3 6 5 2 2 6 5 3 2 2 3 2 6 2 5 2 4 4 4 2 4 2 5 9 30 4 2 4 2 2 3 5 6 3 7 11 2 5 2 5 2 5 4 3 3 3 3 5 6 2 2 1 4 6 3 7 2 4 2 10 7 2 3 2 5 2 3 4 6 10 4 4 2 2 3 3 4 2 6 2 3 4 2 4 2 9 14 4 3 3 3 7 9 4 3 1 5 4 3 3 3 8 3 2 6 2 9 12 7 3 2 2 2 2 4 2 3 4 4 2 3 4 4 3 2 3 3 1 4 5 7 17 17 17 363 363 363 51 51 228 491 373 72 110 110 139 139 139 293 293 215 35 96 96 6 472 472 133 42 147 380 499 499 319 319 319 348 195 195 466 22 283 283 38 162 68 68 68 273 273 319 319 319 348 33 64 212 212 93 93 93 93 171 422 186 39 86 86 105 105 336 208 153 153 153 153 182 182 375 375 497 98 98 483 440 83 83 55 55 55 322 67 212 131 133 345 141 141 141 141 281 9 198 198 22 283 455 38 162 482 482 482 238 6 161 161 499 499 235 235 235 235 348 64 212 459 459 459 459 31 54 86 6 272 472 221 336 259 190 190 190 488 499 499 405 405 206 215 215 35 29 69 69 223 130 198 198 22 283 455 236 129 36 310 107 395 395 487 498 498 498 396 178 36 310 107 447 483 226 226 209 411 171 171 171 171 252 252 143 77 478 342 224 494 494 494 31 342 342 115 273 470 265 265 265 85 85 85 146 469 469 469 36 449 41 41 41 324 324 3 335 440 145 194 194 446 446 67 76 90 393 393 234 261 25 148 148 148 148 372 372 467 467 467 242 116 33 250 217 217 473 473 278 278 99 436 436 60 60 298 379 379 195 471 471 49 49 168 106 106 405 167 215 35 458 96 368 453 453 371 278 278 139 175 81 324 324 219 495 495 495 495 467 41 41 41 41 19 454 454 229 491 491 312 312 312 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 149 228 491 491 320 219 357 357 357 240 240 131 133 133 345 333 333 220 220 216 106 106 297 297 297 297 297 297 293 293 293 122 4 127 114 258 258 258 258 258 271 271 39 433 433 433 433 160 160 160 97 97 225 225 225 225 7 217 473 258 258 258 258 342 342 224 494 494 494 368 9 142 142 397 147 380 329 329 329 329 329 310 107 107 395 302 302 497 497 349 349 205 261 261 25 315 315 315 450 450 413 413 212 131 335 226 209 44 44 44 236 8 32 259 354 180 319 319 319 348 348 64 64 64 64 212 384 34 11 11 11 116 33 243 243 401 401 491 108 119 119 437 103 103 103 103 103 85 85 299 299 339 64 76 36 87 87 66 66 68 68 115 278 278 278 36 131 393 393 155 155 332 332 332 14 14 14 411 145 145 284 315 315 450 450 153 88 372 372 304 304 185 49 453 168 415 415 415 415 58 183 156 156 156 313 143 458 458 445 351 278 278 278 36 310 107 107 395 242 116 116 250 250 250 276 109 109 278 330 116 33 64 212 212 371 84 84 84 84 274 274 263 229 247 247 126 126 326 326 326 326 326 101 101 149 228 228 289 320 309 309 479 278 278 278 325 449 449 176 176 135 328 200 200 195 248 197 197 197 401 491 144 27 27 437 437 405 405 405 206 167 35 35 242 242 242 33 33 33 250 250 364 276 276 153 153 372 372 372 215 215 35 472 472 221 401 491 208 208 441 441 441 441 109 278 139 139 139 375 375 375 233 233 270 270 433 433 160 160 18 112 112 439 439 439 225 237 237 237 47 491 47 491 491 73 491 373 373 338 400 400 400 30 30 58 110 254 254 254 314 196 196 479 331 278 278 278 325 449 191 191 191 314 314 478 478 68 68 115 273 278 278 143 96 96 232 68 68 68 6 272 371 444 360 360 252 339 199 199 223 223 130 402 198 198 114 57 57 57 203 381 381 48 229 491 247 15 193 193 193 17 +103-1240-0006 103 478 1 4 40 4 37 5 25 23 20 18 7 31 22 20 29 14 40 38 14 38 27 25 33 19 33 13 23 19 25 1 6 11 37 28 31 5 40 1 4 25 11 22 20 29 19 26 5 32 3 30 29 8 3 25 12 5 24 15 25 30 27 11 12 5 33 22 30 6 31 33 12 5 18 3 23 27 1 5 25 11 38 7 25 11 5 29 12 5 31 33 20 29 30 13 11 18 19 23 9 20 6 25 11 1 8 7 4 5 2 3 2 3 4 5 4 4 4 4 3 4 2 4 2 4 5 2 3 3 6 4 5 3 4 1 13 2 5 6 6 5 7 16 5 2 2 5 5 2 3 4 2 8 4 3 3 12 4 3 2 1 5 8 6 6 7 4 1 2 2 5 3 3 6 4 1 2 6 2 5 8 12 6 1 4 5 10 2 3 3 5 2 3 6 4 4 3 7 3 3 7 3 5 4 4 8 4 7 20 17 17 17 363 51 51 228 491 412 83 145 253 253 253 253 368 342 168 168 145 145 486 460 460 173 280 29 242 242 242 359 359 359 81 324 324 324 3 58 72 268 268 268 268 268 268 274 186 39 54 86 105 336 445 485 485 213 485 215 129 354 29 334 304 304 185 131 397 397 345 347 347 347 347 43 43 364 276 174 174 426 426 206 167 457 76 36 377 87 87 87 236 259 108 119 119 351 351 443 139 139 139 293 175 175 81 89 340 340 116 33 335 14 14 491 411 411 284 284 284 405 405 405 206 206 206 37 24 131 133 4 4 280 153 153 343 343 343 343 358 358 39 342 342 224 50 50 50 50 50 50 185 269 433 160 112 427 82 247 312 126 292 292 292 326 326 326 326 326 101 408 149 149 491 412 412 55 55 55 322 67 131 472 221 458 445 445 213 213 213 213 252 215 458 176 176 135 135 135 200 200 44 44 44 44 99 338 338 338 338 395 273 106 306 306 306 396 396 215 35 35 335 14 14 411 284 265 265 265 265 85 85 146 464 464 125 125 125 125 466 466 22 283 455 399 217 217 217 473 290 290 290 290 290 434 434 434 339 339 33 90 42 42 147 147 380 380 288 496 496 496 496 274 274 274 24 131 472 198 198 127 45 45 385 90 221 458 208 208 190 499 499 499 405 405 206 150 150 54 86 238 6 6 472 472 198 22 283 455 38 72 72 437 437 481 481 481 481 175 175 81 84 84 84 84 274 274 98 229 247 247 126 126 326 326 326 326 326 101 149 149 228 491 83 83 55 55 322 67 67 131 133 133 364 276 276 346 346 486 315 315 315 315 450 450 450 413 413 348 64 212 131 230 230 230 230 230 35 35 401 198 198 22 283 455 38 162 232 232 232 68 68 6 371 371 213 213 213 252 215 129 259 29 29 42 42 42 147 380 288 443 443 443 240 314 131 183 183 183 183 183 278 278 278 139 139 139 497 497 497 497 122 259 259 354 420 420 324 464 180 180 426 426 426 426 426 282 388 303 303 64 212 465 227 419 439 78 491 305 421 491 491 491 421 491 421 491 491 491 128 128 128 491 128 193 193 193 17 +103-1240-0007 103 751 1 13 25 20 9 5 11 20 18 36 38 13 25 33 7 33 5 37 19 33 1 6 30 19 25 33 36 19 33 1 18 4 11 33 19 29 4 31 27 37 14 12 4 33 18 19 23 30 27 11 1 4 25 11 31 27 1 30 5 25 12 20 5 25 31 20 25 17 6 25 33 23 5 33 5 37 24 19 31 19 40 30 15 10 5 23 40 6 23 31 20 19 26 8 1 32 20 38 5 40 31 19 33 19 26 12 13 30 38 5 25 4 16 33 14 25 36 25 19 25 1 14 23 20 21 36 25 1 12 5 31 5 25 38 5 40 22 5 24 19 26 19 25 4 33 12 5 38 19 25 11 27 1 38 6 30 24 5 25 11 9 30 8 33 1 11 6 3 4 2 4 2 4 4 3 5 3 3 3 6 3 2 3 6 7 2 6 5 3 5 4 4 5 4 11 6 1 3 2 3 5 7 5 5 2 4 2 4 3 6 2 8 5 9 6 2 4 3 3 6 14 15 5 3 4 3 3 6 6 7 5 5 3 5 4 3 2 4 2 2 4 4 2 4 3 4 5 4 4 4 3 5 5 7 7 7 2 4 14 50 6 3 2 2 3 3 2 2 3 4 2 3 4 4 2 4 3 4 2 3 3 5 2 3 3 1 7 3 5 6 7 8 22 4 3 6 5 3 2 2 3 5 3 2 2 5 3 2 1 3 2 3 3 3 4 3 9 1 4 4 4 4 1 2 3 3 3 7 6 10 17 17 17 363 363 363 363 51 149 228 491 491 411 145 475 475 475 475 94 475 475 475 324 301 8 354 106 493 151 240 325 41 41 324 324 3 183 183 489 489 489 489 489 43 43 276 109 109 443 330 330 348 64 76 465 449 483 145 113 113 113 113 113 240 285 285 34 223 223 130 280 277 277 277 277 277 385 36 36 227 419 225 225 226 226 226 491 209 157 157 157 157 157 372 335 14 14 411 188 340 340 116 33 64 394 465 108 377 123 123 123 88 88 277 277 277 277 385 24 131 427 229 247 126 126 126 326 326 326 101 408 149 491 228 373 110 110 110 254 254 240 314 35 108 377 87 87 87 129 259 74 311 311 311 311 311 311 311 311 169 150 342 342 342 168 106 410 410 410 410 410 29 29 382 313 216 216 114 92 92 92 92 92 385 131 472 183 183 183 351 278 278 139 139 139 497 497 497 497 42 42 8 147 380 380 499 84 496 496 496 496 274 274 274 37 24 131 419 419 225 225 225 225 82 83 55 55 55 322 67 394 478 478 232 232 172 172 115 273 84 84 84 84 16 16 16 274 274 274 98 13 229 247 312 126 126 23 23 23 101 101 101 149 149 228 491 289 289 7 147 147 380 499 319 319 319 348 466 466 466 212 22 448 448 448 14 14 145 319 319 319 319 348 195 195 195 394 478 478 232 68 68 68 267 267 267 267 267 434 339 339 33 90 90 32 465 144 27 180 284 405 426 426 413 348 64 76 26 26 26 359 81 81 277 277 385 325 34 69 223 130 130 402 196 196 217 473 473 258 258 31 342 224 494 494 494 494 368 9 142 142 42 42 147 380 329 329 329 329 252 143 36 107 107 395 302 302 302 497 497 185 269 9 9 483 14 411 411 297 297 297 297 297 297 293 293 497 186 162 68 68 172 115 267 267 267 267 360 360 176 176 176 135 328 328 200 199 106 106 265 265 265 265 85 85 85 85 207 207 19 454 13 417 417 417 237 237 170 28 28 28 28 28 362 491 491 362 362 362 362 491 491 362 211 491 491 369 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 391 391 73 491 289 373 338 338 400 400 400 301 378 378 141 141 141 281 162 68 68 115 470 278 278 278 449 176 176 135 135 200 248 248 127 114 264 264 264 468 245 245 43 364 276 174 174 174 174 348 94 199 145 145 460 460 460 402 402 6 272 300 469 313 313 10 479 398 398 374 374 132 413 339 199 199 340 116 116 199 335 14 411 411 498 498 498 498 134 175 359 81 166 324 324 422 236 36 310 107 395 395 485 374 374 374 374 132 132 413 303 303 303 117 404 439 439 78 237 237 237 47 47 491 47 2 491 2 2 2 2 316 316 491 316 316 491 491 73 435 289 7 127 5 5 5 38 162 68 68 68 115 273 319 319 319 319 348 348 195 250 133 141 141 141 281 342 86 221 458 144 27 351 319 319 319 53 53 176 135 135 200 200 200 464 340 340 340 94 199 415 415 415 35 198 22 283 455 455 364 345 109 278 278 330 116 33 64 212 212 371 84 84 84 84 274 274 274 274 43 43 401 364 276 276 153 153 153 387 387 372 372 396 396 203 53 473 89 446 446 67 131 472 221 401 354 190 380 380 499 499 428 428 146 146 358 358 233 233 227 419 419 427 56 491 421 15 15 15 193 193 193 17 +103-1240-0008 103 771 1 12 20 6 30 10 14 11 3 25 12 5 31 23 27 29 9 19 23 27 12 5 18 7 31 38 5 40 19 25 5 9 30 8 11 5 23 16 23 5 32 5 37 29 19 26 22 20 38 8 33 9 23 36 24 1 18 5 24 11 27 37 14 9 8 5 24 19 30 20 5 11 5 37 1 9 20 40 1 33 3 24 5 31 23 19 25 11 1 5 24 20 22 23 19 33 5 23 24 4 25 18 36 24 4 37 5 25 23 20 29 20 29 5 23 22 6 23 11 30 15 10 5 23 19 25 11 40 18 5 40 9 5 25 11 1 38 5 40 31 27 19 26 18 19 40 23 15 33 14 25 5 29 31 20 11 3 25 12 5 18 19 23 16 20 23 11 1 9 20 6 25 11 12 5 9 3 30 25 1 11 4 3 6 3 5 2 3 3 3 2 2 7 2 5 3 2 3 6 7 1 3 6 9 6 2 2 3 2 2 2 4 4 5 2 2 3 9 2 5 7 2 4 6 2 5 4 4 5 5 6 2 4 7 6 14 6 2 8 3 5 4 3 4 6 2 5 3 5 4 2 2 2 4 1 3 11 10 25 5 4 3 3 5 3 5 5 10 9 6 5 4 4 4 2 2 3 3 5 7 3 4 2 3 7 2 3 2 2 5 5 5 3 3 3 5 3 5 5 3 3 4 3 8 4 6 2 2 4 4 4 3 2 4 5 19 3 1 4 4 5 3 3 3 3 3 5 4 9 3 3 3 3 6 4 3 3 3 1 2 5 2 5 6 4 5 3 1 3 4 6 4 2 1 2 4 5 4 6 9 17 17 17 363 363 363 363 51 51 51 228 491 320 127 448 448 448 14 14 411 153 153 387 372 372 396 313 35 310 107 395 382 382 313 313 285 34 125 125 125 125 348 466 22 283 283 38 162 232 232 232 26 26 26 431 431 84 496 496 274 274 457 457 401 401 354 354 255 255 251 251 251 241 431 84 84 84 16 16 274 274 216 216 283 283 455 58 72 72 72 268 268 268 268 268 268 450 450 274 271 271 39 39 86 142 397 336 345 141 141 281 281 342 168 340 340 116 199 44 44 44 129 259 190 190 380 380 499 499 428 85 146 146 285 34 302 302 497 497 349 349 234 234 234 234 234 261 425 425 386 431 151 151 151 169 169 169 99 436 338 338 447 395 69 462 462 402 402 221 401 259 491 74 351 351 360 360 360 200 200 248 76 76 465 445 485 324 324 324 301 378 364 364 346 346 346 428 428 146 146 143 36 472 221 401 401 259 354 425 425 241 431 374 374 374 374 132 132 132 203 381 381 404 13 491 247 312 126 126 326 326 326 326 101 101 101 149 228 491 491 373 72 72 437 284 319 319 319 203 53 53 53 53 469 212 212 131 34 410 410 410 410 410 173 280 29 29 382 245 245 8 259 354 62 62 62 62 146 464 464 44 44 399 217 217 217 473 286 286 286 468 468 406 337 337 337 324 464 464 277 277 325 34 462 462 462 402 402 221 401 401 354 213 213 213 213 213 246 246 246 246 318 318 185 185 433 433 433 160 160 112 112 78 56 491 491 28 28 491 491 341 341 341 341 12 12 12 12 12 260 260 260 260 391 391 391 73 289 491 289 108 119 437 437 284 284 426 426 203 53 473 459 271 31 39 342 342 26 26 251 251 241 81 329 120 120 330 388 195 195 195 64 212 131 419 439 439 439 439 225 225 225 237 47 491 47 80 80 491 80 197 225 287 287 44 44 44 399 217 217 473 398 213 213 213 143 143 458 144 26 26 251 241 431 278 278 285 449 302 302 497 497 399 399 217 217 473 136 136 136 136 136 136 136 282 282 388 195 404 58 489 489 489 489 489 399 53 335 14 145 145 145 486 460 460 173 280 29 242 242 116 250 359 359 81 324 324 324 422 129 259 74 485 213 213 213 213 252 215 129 259 354 100 100 100 497 497 122 143 458 144 27 437 481 481 481 481 481 293 293 122 122 472 133 42 147 147 380 329 329 171 252 143 36 107 395 302 302 302 497 497 497 251 251 251 241 81 431 278 278 330 388 379 195 195 471 471 77 269 342 142 72 72 72 437 151 151 151 368 453 342 142 221 336 354 275 275 275 275 303 303 195 243 131 419 427 491 247 126 126 126 292 326 326 326 326 326 326 326 326 326 101 101 149 149 228 320 345 141 141 281 162 232 232 172 172 115 273 84 496 88 88 88 176 176 135 135 200 248 183 183 257 257 257 257 453 342 26 26 251 241 241 431 171 171 171 252 457 457 401 259 108 119 119 351 308 308 308 313 313 94 199 469 469 215 35 96 66 68 68 68 115 115 444 444 213 246 252 252 325 34 125 125 125 125 466 466 22 283 455 58 72 72 351 278 278 139 139 293 497 497 349 349 234 234 261 25 485 485 485 464 139 139 375 497 497 122 122 36 472 221 336 354 420 420 324 464 464 180 106 426 426 426 426 413 348 64 212 212 198 22 283 455 8 354 354 106 284 306 306 306 306 306 396 396 396 37 303 303 48 404 78 229 491 491 15 15 193 193 193 17 +103-1240-0009 103 501 1 24 19 31 19 40 30 15 10 5 23 25 39 36 12 5 33 18 20 6 33 1 9 19 22 5 40 32 20 18 4 11 18 14 11 18 19 24 33 13 23 29 20 33 14 24 6 30 19 31 5 25 12 20 37 25 19 26 9 19 16 6 30 19 25 1 38 19 23 39 5 24 21 15 9 23 13 30 40 31 33 6 30 27 37 14 4 33 22 3 30 24 5 11 20 1 12 4 33 18 20 24 13 25 33 19 31 27 18 19 40 33 14 25 5 29 31 20 11 12 5 25 13 22 31 33 4 16 33 14 25 36 25 1 10 4 2 4 2 4 3 2 3 3 3 3 4 3 2 2 2 4 4 9 4 2 2 3 5 4 2 6 4 3 2 2 5 5 2 2 2 4 5 3 4 3 4 3 3 4 4 2 3 5 1 3 2 9 2 2 2 3 2 3 6 6 8 6 7 5 7 2 2 4 3 3 5 6 4 3 3 4 3 4 3 6 7 7 3 3 2 2 5 3 3 2 2 2 7 15 3 2 3 5 3 3 2 4 5 2 6 5 3 1 4 5 3 2 3 3 4 4 2 1 2 3 3 3 2 3 3 4 2 2 3 5 6 15 17 17 17 363 363 363 51 51 51 228 491 7 217 473 258 258 31 342 342 494 494 494 281 9 142 397 147 329 329 329 329 143 310 107 302 302 302 497 122 10 10 309 398 398 398 398 398 374 132 216 216 127 45 45 45 325 183 451 30 30 30 3 14 14 411 284 284 405 405 405 206 206 167 24 227 227 472 221 401 491 354 420 420 422 143 458 144 27 351 351 151 253 368 368 99 338 338 338 400 400 400 400 30 3 58 58 110 254 254 254 254 58 58 72 72 110 498 498 498 498 396 313 325 183 183 57 57 57 203 53 394 90 76 108 108 119 351 139 139 139 139 293 293 215 35 74 74 329 329 213 329 252 325 300 382 382 245 399 217 70 65 65 153 329 372 406 406 467 313 186 39 342 342 224 242 242 116 466 466 22 283 448 448 14 411 213 213 213 213 173 173 402 196 196 176 328 328 248 248 8 354 255 255 38 349 205 234 261 148 148 148 148 148 148 372 372 372 59 452 335 197 226 226 209 188 188 340 340 340 340 33 195 117 117 117 197 197 197 80 491 80 491 491 7 7 7 364 345 109 329 139 329 81 219 219 485 464 464 203 203 33 394 212 465 107 395 329 329 329 171 171 171 301 301 8 129 354 425 175 175 431 329 329 264 468 468 304 313 186 162 323 482 482 482 238 6 272 106 153 153 153 182 372 372 372 372 59 245 335 14 209 411 410 410 410 410 410 410 173 29 29 495 406 467 415 415 131 90 259 144 27 437 437 306 306 306 306 396 203 53 469 469 469 325 325 41 41 41 19 19 454 229 247 126 126 126 326 326 326 326 326 326 101 149 149 228 289 491 127 45 45 45 45 240 183 183 183 451 30 30 30 301 399 217 473 432 432 432 330 348 64 457 401 82 108 377 87 87 38 162 323 323 115 273 84 84 496 274 274 58 58 183 257 257 257 31 9 238 6 119 161 308 308 308 396 313 94 199 199 459 215 215 96 66 342 172 224 41 41 324 3 301 314 198 22 283 455 116 199 331 443 443 178 178 458 96 86 238 6 272 145 145 460 460 460 402 402 6 272 300 469 313 10 94 398 398 374 374 374 132 413 303 303 48 404 13 170 491 491 491 312 15 15 292 292 292 193 193 193 193 17 +103-1240-0010 103 740 1 29 20 33 14 18 4 11 4 31 22 33 19 24 5 37 22 6 30 31 16 14 24 4 34 39 36 22 5 34 9 14 33 18 4 11 25 13 37 14 9 19 25 27 25 33 36 37 3 23 5 25 33 19 30 19 25 16 14 24 15 32 5 25 5 9 7 33 13 25 20 34 19 26 19 25 18 19 40 18 27 23 8 16 1 4 25 11 39 13 33 1 18 20 30 38 5 40 24 4 34 39 36 22 5 34 9 14 33 1 4 33 18 4 16 29 4 31 33 34 30 20 6 25 12 20 4 16 33 14 25 36 25 5 37 5 9 19 40 20 11 15 1 29 23 4 31 19 11 23 20 11 30 8 37 19 26 27 37 14 12 5 18 3 23 27 5 25 11 5 29 12 5 18 19 23 1 17 3 4 3 2 3 2 2 7 4 2 1 3 2 2 4 3 4 5 5 4 3 3 5 3 2 3 4 3 5 3 5 1 5 1 3 5 2 3 3 4 2 7 5 3 4 2 4 3 3 3 2 5 2 4 2 2 4 1 4 4 4 2 1 2 2 5 5 4 3 4 4 3 6 4 1 3 2 3 3 3 8 8 11 37 5 1 2 3 8 10 11 9 3 4 3 2 3 3 6 4 1 3 7 3 5 3 6 3 8 6 2 8 5 6 5 5 5 2 5 3 7 3 3 3 3 4 4 3 1 3 6 2 2 3 2 6 3 4 4 4 12 15 4 3 4 7 1 2 3 4 5 3 6 2 3 4 8 2 3 2 2 6 4 5 5 2 2 3 3 3 5 1 5 3 9 9 17 17 17 17 363 363 363 363 363 363 363 408 51 51 228 491 289 320 74 329 329 329 329 329 325 34 334 382 382 467 110 254 254 254 285 34 145 145 145 376 460 460 169 150 342 86 105 96 96 272 57 57 57 203 53 255 255 255 130 402 221 259 208 441 441 153 153 372 372 372 59 271 271 269 54 54 9 97 336 155 155 332 332 332 245 399 473 65 329 329 329 460 169 164 164 485 485 485 374 132 143 259 144 27 437 329 329 329 169 164 164 142 221 336 29 495 334 59 59 313 24 131 58 72 110 254 254 254 254 35 35 196 309 309 479 331 463 463 463 463 29 382 382 245 8 129 354 137 137 137 137 33 10 10 309 331 331 84 84 350 350 413 413 33 394 465 377 377 87 123 132 8 354 354 106 284 481 481 481 175 175 81 242 116 33 394 465 465 108 119 485 485 286 286 468 406 467 467 121 53 394 155 155 25 469 469 203 217 473 418 418 418 418 418 99 436 436 60 60 298 199 255 255 8 180 113 113 113 113 240 285 131 335 14 401 209 411 475 475 475 475 475 475 475 475 422 164 164 164 214 214 214 214 328 328 200 200 248 335 188 188 340 340 94 199 199 257 257 257 257 342 9 142 437 424 424 424 424 424 497 497 122 251 241 431 431 265 265 428 428 85 146 146 358 358 352 352 352 352 352 352 352 112 427 56 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 149 228 289 209 83 55 55 322 67 212 90 219 357 357 357 357 357 357 120 120 240 385 385 35 227 227 227 419 419 439 225 197 47 47 491 491 47 491 47 47 80 491 491 491 289 7 373 451 451 451 286 286 286 286 286 468 468 245 43 43 345 141 141 281 281 9 142 196 217 473 65 486 486 460 460 169 164 164 164 485 485 485 374 132 143 259 144 144 27 437 329 329 329 329 150 164 164 105 221 336 354 29 498 498 59 59 313 385 227 419 427 229 247 408 149 149 228 226 491 209 83 415 415 415 240 314 335 58 72 72 72 72 72 110 110 486 486 460 460 460 169 352 352 402 221 401 259 74 311 311 311 311 311 311 311 169 150 86 86 238 6 272 472 472 234 164 164 487 487 487 288 288 213 213 246 246 3 335 440 125 125 125 125 466 466 448 448 448 448 464 145 145 460 460 460 349 402 96 272 469 469 469 236 94 398 374 374 374 132 132 339 94 199 69 223 130 280 44 44 44 44 32 401 401 354 354 278 278 278 368 342 342 41 41 324 324 301 239 239 384 93 93 93 93 93 207 207 207 246 19 454 229 247 247 126 126 326 326 326 326 101 101 149 228 491 80 80 491 491 74 425 425 386 386 431 486 486 460 460 169 150 342 342 342 224 494 494 416 26 359 359 166 166 166 324 301 236 401 259 161 161 79 499 499 499 265 85 85 146 146 173 173 176 176 135 135 200 248 14 14 411 410 410 410 410 410 410 173 29 29 382 313 216 283 283 455 58 72 72 72 437 481 481 481 481 481 293 175 175 81 84 84 16 88 88 89 89 446 116 64 212 384 180 230 230 230 215 35 35 96 198 198 22 283 455 455 58 183 278 278 278 278 139 139 139 375 375 375 375 98 13 229 491 170 491 15 15 15 193 193 17 +103-1240-0011 103 732 1 4 25 11 18 19 40 9 13 31 33 31 36 33 5 37 22 23 27 12 40 1 38 19 10 38 5 40 29 23 15 25 29 30 36 16 12 5 33 18 20 38 5 40 17 27 19 26 7 33 5 37 4 37 5 25 23 20 1 4 25 11 18 20 18 4 11 12 5 9 5 17 20 4 25 11 12 5 31 6 30 5 23 24 13 30 38 19 10 9 19 33 27 22 5 25 11 12 5 33 18 20 38 5 40 17 27 19 26 5 22 5 25 31 19 11 14 5 9 5 23 11 19 31 33 5 25 31 1 25 7 1 38 13 30 38 5 40 24 4 34 39 36 22 5 34 9 14 33 1 17 27 19 26 1 4 25 11 38 8 38 5 40 18 20 17 27 19 25 12 13 30 1 5 6 1 2 2 2 4 4 4 5 3 5 4 2 1 4 5 3 7 2 7 13 4 2 4 2 2 4 7 3 6 6 4 3 6 5 2 2 2 4 2 3 2 3 3 4 3 4 8 3 2 3 5 3 2 4 2 11 33 3 2 1 2 4 4 3 4 1 3 7 5 2 7 1 2 1 2 2 6 4 2 3 2 5 7 5 3 2 4 2 3 6 4 3 3 1 2 1 2 1 2 2 3 1 4 3 4 3 3 2 4 2 2 7 1 3 3 3 2 2 2 4 3 5 2 2 5 9 28 5 13 6 10 8 3 6 2 4 6 7 4 2 3 8 3 6 3 3 4 4 4 7 3 11 2 5 3 3 6 6 3 2 3 2 3 6 4 6 5 2 2 11 21 17 17 363 51 228 412 412 83 194 194 446 67 67 131 183 257 257 257 257 453 342 221 221 336 354 354 443 443 443 169 150 342 86 86 6 6 272 472 66 482 482 115 485 374 374 132 252 36 449 462 462 402 402 221 336 144 208 425 386 386 431 496 496 496 496 496 274 274 37 233 185 185 269 323 18 427 427 247 247 126 126 292 23 23 408 408 391 391 228 228 289 491 320 407 407 407 407 310 107 397 397 141 141 141 281 281 9 142 221 221 336 491 74 74 425 425 386 386 431 290 290 290 290 434 434 339 339 195 33 394 76 465 74 190 190 190 487 487 374 374 374 132 132 358 352 352 352 402 198 198 45 45 45 45 131 183 451 30 30 30 301 378 345 141 141 281 453 9 221 336 144 180 84 496 88 88 176 176 135 328 200 335 14 14 145 145 113 113 113 113 206 285 449 34 69 223 130 280 180 145 145 486 460 460 173 280 280 242 242 116 33 250 251 241 81 256 444 213 246 246 246 19 19 454 454 78 170 170 491 28 491 491 312 312 187 292 292 12 12 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 149 491 491 289 491 209 83 55 322 67 325 30 30 30 30 3 58 58 72 110 110 254 254 254 254 314 35 198 127 283 455 455 236 129 401 401 401 354 354 431 151 151 240 416 416 192 41 41 41 324 3 464 89 89 446 348 466 22 283 455 38 162 232 482 172 115 106 106 153 372 372 372 406 467 302 302 497 497 399 399 217 473 473 264 264 264 264 264 468 468 59 59 59 245 43 364 345 407 407 407 310 107 447 221 336 354 420 420 236 129 36 108 119 119 351 496 496 496 274 143 458 192 242 242 116 116 466 212 45 45 45 325 183 30 30 301 378 141 141 141 281 342 9 221 336 144 180 84 88 88 88 176 135 135 200 200 464 44 44 143 458 27 27 121 121 33 478 478 232 68 172 115 273 278 278 278 285 495 495 495 134 134 134 134 8 100 100 100 497 122 401 401 401 371 278 278 278 31 39 86 86 6 272 11 11 11 11 379 379 471 471 270 433 433 433 18 112 56 56 491 312 312 312 187 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 228 228 289 491 7 309 479 331 315 315 315 315 450 450 16 293 293 335 197 197 197 197 197 197 197 197 491 491 7 7 364 364 364 364 276 181 181 181 181 181 264 264 264 264 468 468 468 245 245 43 364 364 430 430 430 430 430 342 342 221 196 217 217 217 217 473 486 486 486 486 460 169 169 164 164 164 485 219 485 485 132 143 143 129 82 144 27 27 437 329 329 151 169 164 164 164 164 221 401 259 29 29 382 313 313 35 131 472 221 401 401 401 401 491 144 180 180 84 84 350 88 88 88 176 176 176 176 328 328 200 200 200 117 454 404 483 226 226 226 226 491 83 55 55 55 322 67 67 212 131 133 364 364 276 181 346 346 181 265 85 85 146 378 378 345 430 430 430 430 342 342 451 30 30 324 422 143 401 401 144 27 180 84 84 496 88 88 88 176 176 135 135 200 248 248 248 216 127 114 114 264 264 264 264 264 59 59 452 452 263 263 417 417 237 491 237 237 421 421 421 491 491 491 128 128 128 491 128 128 193 193 193 17 +103-1240-0012 103 759 1 18 4 11 19 33 9 19 25 13 25 20 5 12 14 24 4 25 19 25 4 37 5 25 23 20 1 24 19 31 19 40 30 15 10 5 23 1 11 13 16 33 23 20 29 35 33 19 26 12 19 31 4 25 11 12 4 33 5 17 13 12 14 1 24 8 33 18 4 37 17 19 37 5 25 5 29 30 19 33 20 17 35 11 17 13 31 4 40 33 5 9 27 34 22 38 13 31 10 5 25 40 1 9 5 33 24 4 34 39 36 31 27 30 13 30 23 20 38 13 25 33 16 14 24 18 27 24 1 12 5 33 19 33 24 5 31 33 9 20 31 5 24 34 19 26 29 30 13 31 19 26 4 25 11 5 25 39 36 41 38 5 23 38 19 10 38 5 40 33 15 22 19 26 18 19 24 1 24 9 3 2 3 3 3 4 3 8 3 5 4 3 3 5 6 2 3 3 5 3 2 5 2 11 18 4 3 5 2 5 4 4 3 4 8 3 2 5 4 3 2 3 4 3 3 3 7 2 4 7 5 2 2 3 5 6 2 4 3 4 7 13 5 5 2 3 2 3 3 3 2 4 2 3 5 3 1 2 4 4 3 5 3 8 6 2 4 3 2 3 5 3 3 2 3 3 5 3 6 6 40 2 2 3 5 7 5 3 3 7 9 5 4 4 3 4 5 2 4 2 4 2 3 7 9 5 8 3 2 3 2 2 5 3 4 5 2 3 7 2 4 3 2 5 8 2 2 7 3 5 1 2 2 4 3 5 5 5 1 2 3 3 2 4 2 2 4 5 4 3 2 3 3 4 5 7 17 17 17 296 296 317 317 491 491 317 305 305 461 491 461 491 491 461 491 491 435 435 435 435 435 435 7 373 72 72 430 430 430 430 430 430 430 34 177 177 177 236 35 401 259 354 137 137 137 137 137 94 199 335 14 14 411 411 475 475 475 475 475 475 475 475 324 324 464 464 493 493 493 493 493 216 300 300 382 245 399 217 217 473 136 136 136 136 136 136 282 94 199 340 340 340 94 199 145 145 486 486 460 460 173 280 29 242 242 116 379 33 250 251 241 81 444 444 213 246 246 246 19 19 454 229 247 247 126 126 292 326 326 326 326 326 326 326 326 326 101 101 149 149 228 289 7 217 473 258 258 258 258 342 342 342 494 494 494 368 453 9 142 397 147 380 329 329 329 329 329 329 36 310 107 395 302 302 302 375 497 98 98 98 225 225 225 225 80 80 259 384 371 180 443 443 169 169 352 352 402 6 6 26 359 166 166 166 301 129 259 259 74 189 189 189 285 449 449 176 176 135 328 200 200 248 248 32 32 127 114 114 258 258 258 31 39 86 68 68 68 483 483 440 89 194 446 446 33 212 212 198 127 114 92 92 92 92 167 167 457 457 36 108 377 123 123 416 458 445 180 180 443 493 493 216 300 300 334 59 59 452 263 229 247 247 126 126 326 326 326 326 101 101 149 149 228 228 491 7 70 70 65 65 428 428 428 146 438 325 449 34 202 202 202 202 402 221 259 144 445 278 278 173 173 280 29 242 242 116 94 199 44 44 44 129 129 259 74 190 190 104 104 104 325 325 41 324 324 301 416 239 144 144 484 484 484 236 314 131 221 401 259 445 445 180 443 443 443 443 120 120 271 271 39 342 342 224 253 253 253 253 31 86 238 6 272 123 123 123 8 354 106 496 496 496 274 368 342 142 221 336 208 208 441 151 151 151 169 150 99 238 6 6 310 107 60 298 298 298 275 303 303 471 471 471 269 433 18 112 427 491 491 312 312 312 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 408 408 391 163 491 316 491 316 316 316 316 491 316 316 316 73 289 289 320 159 159 159 159 35 35 196 196 217 473 473 329 329 329 329 329 329 169 169 164 164 164 485 485 485 485 374 132 422 186 162 232 482 172 115 344 344 344 344 344 274 274 274 42 42 364 147 147 380 288 264 264 264 468 468 468 313 134 359 359 166 166 166 301 301 43 364 276 109 109 189 330 330 33 64 76 131 472 393 155 155 165 165 165 165 53 58 58 72 72 72 72 437 350 350 350 350 350 350 350 182 413 413 381 381 404 404 225 225 225 225 225 80 80 491 491 320 127 45 45 45 45 325 177 177 177 177 457 217 217 217 70 65 65 319 169 150 150 86 86 6 272 472 472 336 354 420 420 420 422 162 232 232 68 68 115 273 231 231 231 53 53 76 465 198 214 214 214 328 200 200 248 76 129 401 491 74 190 190 190 488 488 488 151 151 169 150 342 342 68 224 176 176 176 328 328 200 200 464 89 89 446 67 212 34 106 319 319 319 348 33 33 219 219 219 219 485 374 374 374 374 374 368 368 107 161 134 134 100 100 100 497 43 43 345 407 407 407 36 310 447 397 397 141 141 141 281 86 86 238 6 119 119 295 295 295 295 295 252 143 192 192 135 135 328 200 200 183 183 57 57 57 57 57 203 381 48 48 13 13 78 491 128 491 193 17 +103-1240-0013 103 762 1 18 20 38 5 40 12 5 32 8 5 31 33 24 4 25 5 23 8 37 5 25 11 18 15 33 19 11 33 5 18 4 37 33 19 17 27 5 24 5 26 31 33 30 15 25 21 14 40 14 33 36 13 25 20 29 23 15 31 38 13 30 18 20 24 8 33 18 4 37 33 19 33 6 22 1 24 4 34 39 36 11 30 13 31 33 5 29 38 19 12 5 38 8 33 22 3 23 14 5 25 11 30 8 37 19 26 19 25 5 9 5 17 20 1 38 5 40 31 5 24 34 19 26 12 5 33 11 19 11 25 33 18 4 29 5 25 6 16 5 25 1 24 19 31 19 40 30 15 10 5 23 1 29 3 25 11 14 13 40 32 20 24 8 33 1 22 35 11 24 15 22 25 5 34 19 26 5 37 19 33 1 8 5 3 3 2 3 2 2 7 9 3 3 3 3 5 2 3 5 8 3 1 2 1 5 5 3 2 2 3 2 3 4 4 3 2 4 4 3 3 2 5 3 3 3 4 3 3 4 4 4 3 6 3 2 4 5 3 5 5 2 2 1 6 2 5 5 2 5 2 3 3 3 4 6 10 24 5 6 5 3 6 5 4 3 6 3 5 3 3 1 2 2 5 5 3 6 5 4 5 3 1 4 3 6 2 2 3 1 2 3 4 5 3 8 13 3 1 3 7 2 5 3 2 5 1 4 3 3 3 2 4 2 6 4 4 2 3 4 6 2 5 33 5 3 3 3 4 4 4 3 5 6 13 5 5 3 2 4 3 2 5 3 4 8 6 11 3 3 2 4 4 5 7 5 4 2 4 7 3 5 5 8 17 17 17 296 296 317 184 184 491 373 451 451 451 30 301 378 364 345 141 141 141 281 342 342 198 22 283 455 38 338 338 338 395 395 106 480 480 480 85 85 146 146 464 459 459 459 31 31 86 238 6 472 196 196 473 136 136 136 136 136 282 388 199 199 255 255 251 251 241 241 431 265 265 265 85 85 85 146 299 173 352 89 89 322 67 199 58 72 72 72 110 171 171 171 171 252 143 36 449 191 191 236 314 36 108 377 87 58 72 110 110 202 202 202 460 169 352 402 402 6 272 87 87 87 416 144 180 84 496 88 88 88 255 255 399 70 70 65 319 319 319 348 200 248 478 66 482 482 238 6 161 79 288 290 290 290 290 434 339 339 212 310 395 334 334 304 304 304 49 269 168 168 157 157 313 313 36 377 377 123 123 88 88 14 411 475 475 475 475 475 475 475 324 301 129 259 74 425 425 386 386 343 343 343 343 358 318 39 342 9 142 397 345 109 109 498 245 313 183 451 451 30 30 30 301 399 217 70 65 65 428 428 428 146 146 325 131 72 72 110 110 486 486 460 460 402 402 96 272 87 87 87 236 259 108 119 119 351 405 405 405 405 405 405 206 206 169 233 458 192 419 427 491 491 247 312 126 292 292 292 292 292 292 21 21 21 21 21 21 21 408 408 408 149 149 228 82 320 7 217 473 65 486 486 486 460 329 169 164 164 164 164 485 485 485 485 374 374 132 132 132 236 32 401 259 161 161 79 79 380 288 443 151 169 150 150 86 86 86 238 6 272 180 230 230 230 230 215 215 35 29 345 333 333 220 220 44 44 44 43 364 276 346 346 346 428 428 146 146 385 131 472 221 458 144 27 437 437 481 481 481 481 481 175 175 81 300 300 382 406 467 467 89 89 446 116 394 212 161 161 79 499 499 499 428 85 85 146 173 173 280 176 135 135 200 464 340 340 199 44 44 44 8 32 259 354 431 151 151 151 416 416 192 41 41 41 41 41 19 454 229 247 247 126 126 326 326 326 101 101 149 149 228 289 320 320 345 141 141 281 31 342 232 232 68 68 172 115 231 231 231 231 231 53 394 76 164 164 214 214 214 214 200 200 248 212 127 45 45 45 45 236 401 401 259 384 371 278 278 278 314 196 242 242 33 64 212 131 472 72 72 72 110 486 486 460 460 460 215 35 29 29 242 242 94 199 199 106 426 426 426 169 349 352 352 352 242 275 275 303 303 303 48 48 417 417 417 237 237 491 28 28 491 305 305 491 491 362 305 491 491 491 491 362 366 491 366 366 316 491 491 435 316 435 491 491 73 289 7 7 217 473 258 258 258 342 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 329 252 36 310 107 395 302 302 302 302 497 98 98 13 229 82 247 312 126 126 326 326 101 101 101 149 391 228 491 289 491 74 437 437 284 405 426 426 206 348 64 64 212 300 382 495 406 467 253 253 253 99 99 338 338 400 400 400 400 30 301 399 217 70 65 65 265 428 428 85 146 146 358 385 36 227 427 427 229 247 126 126 126 326 408 408 391 228 228 289 491 144 27 389 389 389 314 196 196 217 473 476 476 476 476 476 143 458 96 196 32 196 309 309 309 309 479 331 231 231 231 231 231 349 164 214 214 214 214 328 200 200 335 14 411 287 284 223 223 223 223 130 280 277 277 277 277 277 385 24 227 419 439 439 439 439 225 128 193 193 17 +103-1240-0014 103 697 1 4 25 11 18 14 4 16 33 14 25 36 25 40 19 25 21 28 24 5 25 33 38 5 40 31 29 28 23 11 1 8 23 21 19 31 33 31 33 13 29 27 37 14 33 19 17 30 20 25 17 15 9 5 23 40 4 16 33 14 33 20 5 25 11 16 8 25 11 7 33 16 14 24 3 30 19 23 5 38 13 30 18 20 40 17 6 25 5 25 11 38 8 1 12 5 38 14 12 20 38 35 24 5 25 16 8 25 5 23 20 22 5 25 22 23 36 11 19 11 1 18 20 11 5 40 5 25 21 13 25 14 5 23 20 17 27 33 19 33 7 25 12 19 31 33 8 24 5 37 39 19 30 1 5 25 11 18 20 25 13 37 14 37 19 40 19 33 31 1 7 7 1 2 4 2 7 3 3 2 2 6 4 2 3 3 4 5 4 2 3 5 2 1 3 4 3 7 5 6 52 7 5 3 4 4 5 3 4 3 4 6 2 3 2 2 3 3 5 3 2 7 3 2 2 4 6 2 3 2 7 8 1 2 3 5 6 2 2 6 4 3 2 5 2 3 3 4 3 3 4 2 4 2 4 3 5 3 2 1 3 5 11 17 2 4 6 3 3 3 4 3 2 2 4 5 5 2 2 2 3 3 2 2 4 2 4 2 2 6 31 5 2 3 3 2 3 4 4 4 2 4 2 3 3 5 3 2 3 8 6 2 2 3 3 5 4 3 2 3 3 3 6 2 4 2 1 5 2 7 3 3 3 5 2 5 4 4 8 6 17 17 17 296 296 184 184 184 412 83 194 194 194 55 322 67 131 183 156 156 156 156 335 14 145 145 460 460 460 460 349 402 96 272 272 469 469 313 94 398 398 374 374 374 132 339 339 33 471 77 342 168 121 121 121 33 33 394 310 395 395 153 153 387 387 146 146 203 217 291 291 291 291 291 64 243 36 227 472 397 397 345 141 141 281 31 162 232 232 105 105 336 354 153 153 387 387 387 387 139 139 302 302 375 375 122 122 131 227 419 439 417 417 170 491 28 28 28 28 28 491 491 362 362 491 362 491 305 362 362 491 362 491 362 435 491 211 369 491 369 369 369 369 369 21 21 21 21 21 21 21 260 260 260 260 260 260 391 391 391 491 73 491 491 412 287 111 111 111 111 139 139 293 293 122 239 36 384 395 470 459 271 271 150 342 86 238 6 6 491 478 66 68 232 238 6 272 470 470 443 443 215 215 35 354 29 410 410 410 410 410 410 280 29 29 313 236 36 377 123 123 129 259 208 79 79 288 360 360 360 434 434 200 248 248 212 445 180 171 171 171 171 171 252 215 8 354 100 302 497 497 49 342 168 180 145 486 460 460 460 169 402 402 6 272 300 382 313 236 36 108 108 119 351 213 213 213 213 246 246 246 3 464 89 446 116 394 76 90 393 234 261 25 25 480 480 480 480 299 299 339 64 212 34 180 113 113 113 113 167 167 35 401 393 155 155 165 165 165 165 53 217 217 65 329 329 495 406 467 467 134 139 175 175 423 423 423 423 43 43 364 345 109 109 264 468 468 396 58 183 451 30 30 30 368 342 342 221 336 144 180 106 426 426 426 206 388 94 199 89 446 446 212 131 133 133 276 276 346 346 346 265 265 85 85 85 207 207 19 454 417 417 417 417 417 47 491 47 47 491 435 435 80 491 491 80 80 289 320 127 5 5 455 43 43 364 276 109 498 498 498 396 313 216 216 41 324 324 301 43 364 276 174 174 174 203 53 473 242 116 195 33 90 393 349 234 261 25 106 480 480 480 146 146 299 339 250 359 359 166 166 166 143 458 144 27 121 121 121 76 458 458 208 386 386 444 374 374 374 252 325 34 191 191 191 24 131 404 427 229 247 247 126 126 292 292 292 292 292 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 101 408 408 408 408 391 491 491 373 451 451 30 30 422 325 371 71 71 71 71 71 453 242 242 348 64 394 76 401 310 107 395 395 395 432 432 330 94 199 495 495 495 134 134 134 359 81 166 166 324 422 416 458 144 180 84 496 496 274 285 449 123 123 236 236 36 108 119 351 351 315 315 315 315 450 450 413 413 413 466 198 114 258 258 258 31 86 86 6 272 119 103 103 103 103 85 299 203 53 29 462 462 462 280 280 219 219 286 286 286 286 334 59 59 452 452 263 225 225 83 55 55 55 322 67 131 183 183 451 451 30 30 434 339 10 10 10 309 479 331 463 463 463 463 29 29 382 382 245 245 349 280 280 278 278 278 368 368 342 168 168 277 277 277 37 385 233 270 270 433 390 160 112 112 439 439 78 56 128 128 193 193 17 +103-1240-0015 103 190 1 19 16 18 20 11 30 5 25 7 33 5 37 33 14 25 5 29 31 20 11 18 20 38 35 11 5 25 33 11 30 13 31 5 29 5 25 11 33 15 22 12 5 9 5 17 20 33 19 17 27 16 14 24 6 30 1 9 4 1 3 2 3 3 4 2 5 2 2 3 6 3 2 3 2 7 4 2 3 3 4 2 2 2 2 1 2 2 3 5 4 3 2 1 2 3 4 4 2 1 5 4 3 4 3 2 4 5 4 2 4 4 9 8 17 17 17 363 51 51 228 491 491 412 118 118 118 118 402 451 30 30 422 314 90 133 147 147 380 499 319 319 319 94 199 145 113 113 113 113 240 285 34 462 130 402 221 36 108 119 119 308 308 308 396 313 94 199 199 230 215 35 478 232 232 232 172 115 444 444 444 213 213 252 24 131 183 451 30 30 30 378 378 345 389 389 389 389 314 196 242 33 33 394 212 161 161 79 380 288 443 443 169 39 342 342 168 230 230 230 230 215 35 29 89 89 116 394 465 108 119 295 295 295 295 295 143 458 96 198 198 283 455 455 8 32 354 354 431 151 151 240 416 416 192 41 41 324 422 36 36 377 87 87 416 458 27 180 84 496 496 274 349 205 155 155 332 332 245 399 70 70 138 138 138 138 138 372 372 372 59 452 263 263 229 491 491 312 15 15 15 193 193 193 +103-1240-0016 103 783 1 39 13 33 31 5 24 34 19 26 24 5 31 33 18 4 37 18 4 29 5 25 11 31 19 25 31 23 4 31 25 8 33 19 31 33 3 30 33 18 19 24 6 16 1 8 24 22 23 20 25 29 5 40 5 23 11 12 4 33 31 38 5 33 1 5 25 11 8 38 27 25 33 25 27 5 24 19 25 5 33 31 29 20 31 5 37 24 8 25 11 14 22 3 25 32 5 25 31 1 5 25 33 19 23 8 25 27 38 5 33 18 4 40 33 15 22 5 25 24 4 34 39 36 22 5 34 9 14 33 7 33 5 37 4 37 5 25 23 20 33 5 11 15 1 5 22 6 30 11 19 26 23 20 1 4 16 33 14 33 20 24 19 31 19 40 30 15 10 5 23 31 13 33 7 33 1 32 20 18 4 11 25 3 33 16 3 30 33 19 17 27 1 12 4 2 4 3 2 3 3 2 2 6 4 3 2 1 2 2 3 4 3 3 1 3 4 2 3 3 4 5 6 2 7 3 3 3 3 3 2 2 4 2 3 9 10 16 5 3 4 3 4 3 3 4 3 2 4 2 2 2 4 3 2 4 7 2 4 2 2 4 5 5 1 2 3 5 3 7 2 2 3 3 3 4 4 3 1 3 4 5 2 2 3 7 3 3 4 2 4 5 12 4 2 4 3 3 4 7 6 3 2 1 2 1 5 4 3 3 2 3 4 4 4 2 2 7 2 4 3 3 6 4 3 2 3 5 2 2 3 3 3 4 1 2 8 61 4 5 2 3 1 2 4 3 7 16 8 2 3 2 6 9 4 2 4 2 4 3 3 3 2 1 6 3 3 4 9 18 7 4 2 2 2 2 4 3 4 2 3 3 2 4 11 5 17 17 17 296 296 317 317 317 184 184 184 184 491 219 357 357 357 240 385 35 35 478 68 115 273 231 231 231 53 76 465 214 214 214 214 200 248 248 217 217 217 70 65 65 319 151 169 150 342 86 6 272 34 494 202 402 58 72 110 110 486 486 460 460 215 35 29 242 242 116 379 471 478 478 68 68 115 273 278 278 379 379 77 342 342 26 26 241 431 431 376 376 376 376 169 169 150 342 86 238 196 309 331 331 428 428 428 428 146 252 143 36 377 87 87 38 162 86 482 238 272 180 499 306 306 396 396 285 183 183 183 57 57 57 57 399 70 65 106 426 426 426 426 426 426 206 169 352 352 352 352 352 352 352 112 439 417 237 170 47 491 47 47 491 491 2 47 316 316 316 73 73 73 491 287 111 319 203 203 90 76 465 144 208 208 386 386 360 360 360 360 339 339 394 76 465 74 437 437 151 151 368 368 342 168 302 302 302 375 375 122 122 239 127 114 92 92 92 169 35 77 9 142 397 345 181 181 181 167 385 35 131 419 439 225 225 305 491 412 412 83 55 55 322 67 199 111 111 111 111 438 378 43 364 276 109 109 496 496 274 274 274 457 196 309 479 331 84 84 88 88 44 44 44 44 217 217 217 217 217 217 473 278 278 116 199 199 278 240 143 77 342 86 142 221 336 336 74 213 213 213 252 39 342 224 462 462 462 402 196 196 70 65 480 480 480 85 299 299 339 212 131 157 157 157 245 129 129 259 27 27 437 370 370 370 370 348 64 76 310 107 395 60 298 379 379 471 471 77 269 433 112 427 247 247 126 126 326 23 23 101 101 149 149 228 289 412 287 55 446 322 67 76 465 449 351 139 139 139 251 175 111 111 111 111 438 438 10 10 10 309 479 331 84 84 16 16 274 43 43 364 181 181 181 181 325 34 356 281 281 342 86 221 336 108 119 295 295 295 295 143 458 192 242 242 116 33 250 217 217 473 486 486 486 460 460 169 164 164 485 485 485 374 132 143 129 259 144 27 27 437 151 151 164 164 402 401 401 354 29 382 382 313 24 335 14 14 209 287 113 113 113 113 113 285 34 255 223 130 280 280 145 486 486 460 173 173 280 242 242 379 250 359 359 81 474 324 324 252 143 36 377 87 87 236 93 93 93 93 207 207 207 454 454 417 417 417 417 237 170 491 28 28 28 491 491 362 362 305 362 491 362 491 362 491 362 369 369 369 369 369 369 369 369 369 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 391 391 391 391 491 289 289 412 287 255 255 143 458 458 208 441 153 153 387 396 313 325 176 176 328 200 248 250 359 474 474 474 324 19 19 454 454 417 417 417 417 417 237 237 47 491 491 491 435 435 80 289 435 209 209 287 145 486 460 460 460 169 402 35 36 272 382 382 313 143 36 108 119 351 213 213 213 213 246 246 246 246 3 301 196 217 473 258 258 258 31 342 224 494 494 494 31 9 142 397 147 329 329 329 329 143 36 449 395 302 302 497 38 162 68 68 115 273 470 443 240 325 449 180 113 113 113 113 113 450 233 233 227 419 419 439 417 417 417 237 237 237 237 47 491 47 2 491 47 316 316 316 316 491 491 435 373 373 338 400 400 400 400 30 3 58 110 254 254 254 314 196 479 479 307 307 61 61 167 35 393 205 261 25 106 306 306 396 396 313 36 449 87 87 87 416 144 180 180 84 84 84 16 16 16 274 98 98 13 417 417 225 225 193 17 +103-1240-0017 103 715 1 12 5 9 19 17 1 30 4 24 9 23 19 26 6 30 10 14 11 13 24 9 7 14 11 18 7 31 38 13 30 12 5 2 23 19 37 11 1 38 5 40 5 31 22 4 25 33 22 38 6 30 33 14 5 37 5 24 8 23 5 29 12 5 30 27 11 16 14 24 23 19 25 11 40 18 3 23 27 1 33 19 9 20 32 35 30 1 12 5 23 6 26 23 15 25 24 15 11 19 33 5 17 35 11 20 23 16 14 12 14 1 24 4 34 39 36 22 5 34 9 14 33 31 16 3 12 14 1 4 40 32 8 5 25 11 31 8 23 5 25 33 13 40 18 19 40 31 5 25 4 16 33 14 18 19 24 1 7 3 2 5 5 10 3 4 5 5 1 3 4 4 6 4 5 2 1 2 4 3 8 3 2 7 9 6 3 3 2 2 3 25 4 5 4 3 17 3 2 3 3 5 3 7 2 4 5 2 3 2 2 4 2 2 3 4 9 3 3 3 2 3 4 5 2 5 2 3 2 4 3 2 2 4 4 4 9 37 3 2 2 3 5 3 8 17 2 3 5 5 7 3 8 4 3 4 2 2 3 2 4 4 6 3 3 6 6 3 8 15 5 5 4 2 3 4 4 5 3 3 3 4 4 6 4 6 13 6 3 8 12 3 1 3 4 6 4 3 2 2 2 3 3 1 3 5 5 3 6 3 2 3 2 5 5 5 17 17 17 296 296 51 184 320 320 127 5 455 236 129 259 354 278 278 278 278 278 252 416 416 416 192 472 225 397 225 225 80 80 197 147 147 147 380 499 486 486 486 365 460 203 53 53 53 212 354 302 175 81 176 176 135 328 200 200 248 335 14 14 411 411 153 153 372 372 396 313 143 310 107 395 382 382 313 325 34 121 121 53 53 394 212 212 180 180 486 486 315 450 450 88 372 372 396 313 24 34 58 72 72 72 72 268 268 268 268 268 268 450 450 274 274 271 186 39 323 9 142 397 336 345 109 109 109 264 313 216 216 22 5 455 236 458 27 27 351 151 151 169 169 164 164 472 221 336 354 29 498 498 313 313 143 77 270 342 342 26 26 251 241 431 431 278 278 120 120 173 173 352 352 272 419 229 247 247 126 126 292 292 326 326 326 326 101 101 101 149 149 228 289 320 345 141 141 141 281 453 168 44 44 38 38 232 232 232 105 105 445 445 470 365 365 365 365 460 330 388 64 131 472 472 221 458 208 208 441 441 441 153 153 153 387 387 285 285 300 382 382 467 69 69 130 130 280 44 44 44 399 70 65 65 265 265 265 85 85 85 85 139 293 175 175 175 230 230 230 215 402 198 198 22 283 455 42 42 147 380 380 496 496 496 496 274 24 131 393 205 155 165 165 165 165 53 250 251 251 241 431 329 278 330 388 379 33 471 49 9 142 58 72 437 481 481 481 481 481 293 175 175 81 84 84 84 496 274 98 13 13 417 170 170 491 170 491 28 491 28 491 28 362 362 362 362 362 362 362 491 491 491 40 305 491 305 305 305 316 435 491 435 435 435 491 491 435 435 7 465 108 377 87 87 8 420 420 420 422 186 338 338 395 395 487 498 498 498 498 59 59 59 263 229 229 247 126 126 126 326 326 326 326 326 326 101 101 101 149 149 228 289 320 127 5 5 455 251 251 251 241 235 235 235 235 235 235 235 348 200 248 248 248 251 251 241 431 290 290 290 290 290 434 434 434 339 195 33 250 217 473 476 476 476 476 252 325 325 191 191 191 325 34 44 44 416 129 259 144 484 484 484 236 314 401 401 259 371 485 485 139 139 302 497 497 349 234 234 261 25 498 498 498 498 498 493 216 216 300 300 334 334 59 452 452 263 263 417 417 237 237 237 237 47 47 47 491 47 491 491 73 491 73 289 7 217 473 65 486 486 329 460 169 169 164 164 219 485 485 374 422 143 458 144 27 351 329 329 329 169 169 164 164 472 221 336 354 495 498 498 313 385 35 77 342 86 142 393 393 261 25 91 91 91 91 91 206 493 216 216 300 334 334 59 59 452 263 229 247 247 126 126 326 326 326 326 408 408 149 149 491 412 83 83 253 253 253 253 253 99 338 338 338 338 338 338 395 180 499 499 265 265 265 265 85 85 85 146 146 464 89 89 446 446 394 478 66 68 68 115 273 265 265 265 85 146 146 146 175 175 81 11 11 11 64 76 465 34 253 253 253 253 342 168 257 257 257 257 31 162 68 68 68 115 273 273 319 319 319 388 94 199 145 145 145 460 460 460 460 402 402 96 272 300 382 382 58 58 57 57 57 57 57 57 203 381 117 404 229 247 15 193 193 17 +103-1240-0018 103 580 1 18 4 11 17 3 33 13 40 16 3 30 5 38 15 13 40 18 20 29 3 31 5 9 23 20 22 35 11 16 14 24 18 19 40 16 13 23 27 24 13 25 38 19 12 7 33 4 22 10 36 5 23 20 30 20 33 30 20 33 19 26 19 25 33 5 12 5 38 35 11 40 1 38 19 25 18 20 16 7 25 11 19 11 18 19 40 18 27 24 31 33 13 11 1 17 30 20 25 17 15 9 5 23 40 38 5 40 9 19 23 33 4 33 12 5 16 14 34 5 31 33 13 21 5 37 18 19 40 22 23 19 30 11 23 4 25 11 1 4 25 11 12 13 30 19 33 38 5 40 33 19 12 19 31 11 15 1 6 5 1 3 3 4 3 2 6 4 8 3 4 4 4 3 3 2 2 4 5 5 2 3 3 3 5 4 4 3 3 2 3 1 6 2 2 4 3 5 4 5 3 2 2 7 4 7 4 5 3 2 3 4 3 3 4 3 2 2 2 5 2 3 2 2 2 3 6 4 4 6 1 3 2 2 2 3 5 4 2 1 2 2 2 1 4 3 4 3 4 4 3 5 31 3 2 5 3 3 6 2 2 5 4 2 2 4 3 4 5 2 2 2 3 2 6 5 2 3 4 4 4 5 2 2 1 2 5 3 2 3 4 3 5 6 2 5 17 4 2 3 1 4 4 2 4 2 6 4 3 3 2 3 5 2 11 6 17 17 17 363 51 51 491 412 412 254 254 254 254 131 221 458 144 180 106 405 405 206 240 285 34 253 253 31 31 86 142 142 393 234 261 25 106 106 481 481 306 306 306 306 372 406 467 467 255 255 255 43 43 345 109 109 403 403 403 207 464 253 253 253 342 342 30 30 30 422 129 74 437 437 437 405 405 206 169 150 342 342 224 494 494 236 129 259 26 359 359 166 166 166 422 129 259 144 27 389 389 389 120 37 24 24 131 472 393 155 165 165 165 165 53 473 58 183 257 257 257 31 342 86 142 393 261 25 470 443 139 175 81 84 84 84 274 399 217 217 473 136 136 136 136 282 388 303 195 404 133 364 345 333 333 220 216 114 180 113 113 113 113 113 450 167 35 335 14 411 145 145 145 460 460 460 178 178 96 96 99 436 436 395 134 134 134 134 134 134 359 359 166 166 166 324 301 42 147 456 456 456 236 36 161 161 487 487 487 213 213 252 325 325 176 176 135 135 200 200 464 340 340 116 64 76 108 377 123 123 216 22 283 455 43 43 364 276 109 109 496 496 496 37 37 37 24 471 270 270 323 323 18 97 397 336 82 409 409 409 409 67 58 183 30 30 30 422 349 205 261 25 180 315 315 450 450 413 64 131 34 277 236 325 34 257 257 257 31 342 142 72 72 350 350 350 350 203 53 53 394 478 66 86 238 6 272 470 470 120 120 120 37 24 131 419 427 491 491 247 312 312 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 326 21 408 408 408 408 391 491 491 289 491 144 208 79 288 288 360 360 360 434 339 33 90 212 445 445 180 171 171 171 171 252 215 8 29 302 302 497 497 497 185 49 9 397 397 345 141 141 281 281 9 142 221 336 336 354 278 278 139 139 139 293 293 122 122 449 449 415 415 415 129 198 198 22 455 38 349 234 234 261 25 498 498 498 498 396 240 216 114 300 459 271 31 162 86 68 6 272 470 470 120 120 120 240 314 314 259 108 377 123 223 130 402 257 257 257 257 453 9 221 336 336 208 208 386 386 485 286 286 286 468 313 313 24 314 26 26 251 241 431 294 294 294 294 294 282 282 388 303 303 212 131 419 78 491 491 247 312 126 292 292 292 292 326 326 408 149 149 228 491 491 83 83 55 55 322 67 466 212 212 127 114 264 264 468 468 406 467 177 177 177 131 133 133 364 345 141 141 141 141 141 368 368 31 342 86 86 6 108 377 123 123 216 216 258 258 258 258 31 342 86 86 6 6 371 93 93 93 93 207 207 19 19 454 417 417 417 417 417 193 193 193 +103-1240-0019 103 770 1 9 13 30 23 20 37 19 40 5 9 5 23 16 14 24 12 5 24 15 25 30 27 11 5 23 6 26 38 19 10 1 6 23 12 20 5 12 14 1 4 37 5 25 23 20 18 7 31 5 40 38 14 31 27 31 27 32 5 9 23 20 31 19 10 36 15 33 19 11 1 24 19 31 19 40 30 15 10 5 23 19 25 11 1 11 19 11 25 3 33 22 6 23 1 23 19 37 19 26 19 25 31 5 10 5 29 23 15 31 1 23 19 37 19 26 1 4 33 6 23 1 19 33 31 21 5 31 33 31 33 15 19 26 12 4 33 31 38 5 33 1 32 20 31 13 11 13 40 32 20 31 33 13 29 33 5 23 6 26 12 5 11 20 29 30 5 33 19 11 17 30 4 31 20 23 15 25 1 9 2 4 3 3 3 3 3 4 2 2 2 5 3 2 3 1 2 3 7 4 4 6 3 3 2 7 4 3 2 6 2 7 3 3 4 3 4 6 1 7 3 1 2 3 3 5 7 3 4 4 3 3 5 4 8 2 5 3 2 2 3 5 2 5 4 4 3 1 6 35 4 3 3 3 4 3 2 4 3 6 4 4 7 3 3 2 2 2 6 3 7 7 9 1 10 2 3 4 5 2 3 3 3 3 2 6 2 6 7 5 9 3 3 5 6 1 5 3 3 12 28 5 3 4 4 1 6 3 6 3 11 1 5 2 4 3 2 5 3 7 10 7 3 6 5 3 2 2 4 3 5 4 2 5 2 3 3 4 5 2 2 4 5 4 6 2 5 3 6 3 3 5 7 3 6 7 5 7 17 17 17 296 296 184 184 320 320 320 354 264 264 264 468 468 468 313 359 359 166 166 166 301 378 280 280 278 278 278 368 453 342 168 494 134 8 8 100 100 100 100 497 497 349 155 155 165 165 165 165 466 466 22 283 455 217 217 473 290 290 290 290 290 434 434 339 33 250 42 147 147 380 288 496 496 496 496 274 274 24 325 34 255 255 255 175 241 235 235 235 235 235 235 235 413 200 248 250 345 407 407 407 407 407 310 107 447 447 483 226 226 209 287 297 297 297 297 297 293 293 122 216 22 448 448 448 464 464 493 493 493 493 216 300 300 382 382 313 335 14 226 226 209 411 145 145 486 460 460 173 280 29 242 116 359 466 81 166 324 324 3 58 72 72 268 268 268 268 268 268 450 274 368 368 9 168 300 50 50 50 49 9 142 397 336 347 347 347 313 186 162 54 172 344 344 344 344 344 186 186 162 482 482 482 115 273 344 496 496 186 99 436 436 395 134 134 134 8 359 359 166 166 166 422 162 68 68 115 470 278 278 143 310 107 395 485 469 134 88 158 158 158 158 158 24 325 191 191 191 37 24 419 439 78 170 170 28 491 28 28 491 491 28 491 362 305 362 362 362 40 40 40 40 201 491 366 491 491 305 366 366 491 316 316 316 491 316 73 73 289 7 217 473 258 258 258 342 342 224 494 494 494 31 9 142 397 147 329 329 329 329 329 36 107 107 395 302 302 497 497 251 251 241 81 81 278 278 330 388 379 195 64 212 131 419 439 225 225 225 225 80 491 75 371 371 278 278 314 196 309 479 307 307 307 61 61 167 131 90 221 458 144 27 437 437 437 437 437 481 481 481 481 481 481 293 293 293 497 497 335 197 197 197 197 197 197 7 251 251 251 251 251 241 241 278 278 173 173 280 176 176 176 135 328 200 200 200 340 340 340 340 394 478 342 224 273 344 344 344 449 449 44 44 44 129 259 74 425 425 386 343 343 343 343 343 358 358 358 39 39 433 160 97 97 197 226 226 80 491 491 491 7 7 251 251 251 251 241 431 278 278 278 173 173 176 176 176 176 328 328 200 200 200 200 335 335 209 209 415 415 415 415 415 131 106 106 106 297 297 297 297 182 375 375 375 98 98 13 13 229 170 170 312 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 408 408 408 408 408 391 391 491 491 412 177 177 177 177 177 356 356 142 238 238 6 310 395 395 151 169 150 342 342 86 238 6 491 478 66 66 68 232 68 238 6 272 470 470 403 403 403 171 171 171 246 246 176 176 328 328 200 200 248 248 216 114 92 92 92 92 35 77 77 9 397 221 276 181 181 181 181 181 240 385 35 227 419 419 439 225 225 225 225 225 225 225 225 225 225 373 373 373 338 338 400 400 400 400 422 422 162 68 68 68 273 470 120 120 120 120 37 37 24 34 253 253 253 99 338 338 400 400 400 30 422 162 232 232 232 238 6 6 371 470 189 151 215 215 35 96 96 272 272 255 255 251 251 241 431 235 235 235 235 235 235 248 248 212 22 283 455 236 239 239 384 371 213 213 213 252 215 129 259 402 133 42 42 42 147 380 499 151 151 240 240 449 449 191 191 191 37 314 314 90 90 401 401 491 208 208 79 380 380 486 486 376 460 460 169 150 342 342 342 224 41 324 324 301 251 251 251 241 431 431 290 290 290 290 434 434 434 339 339 117 404 229 247 247 126 326 193 193 17 +103-1240-0020 103 670 1 9 6 30 11 14 11 38 19 12 38 8 23 11 30 27 40 9 35 32 5 40 1 19 33 31 25 27 38 5 25 11 14 24 4 34 39 36 5 25 11 24 3 30 19 23 5 3 30 9 27 34 5 23 19 33 5 23 3 11 1 23 19 37 19 26 5 38 15 9 4 22 18 20 30 9 8 12 5 24 31 13 23 37 40 1 33 30 20 40 3 30 25 33 24 5 10 22 5 24 29 5 25 20 1 12 27 11 19 30 25 27 40 19 16 12 15 38 14 12 13 30 11 9 20 19 25 5 16 5 37 12 5 24 1 8 11 30 36 34 14 23 35 22 4 33 29 20 29 5 23 1 33 19 9 20 32 35 30 1 7 3 4 3 3 3 3 2 2 3 5 7 3 4 3 5 4 3 2 5 4 7 27 3 2 4 3 5 4 2 3 3 3 4 4 4 2 4 2 1 2 1 2 5 3 3 3 4 3 8 4 5 1 3 1 2 3 6 10 6 6 6 3 2 2 4 3 5 7 3 6 5 3 3 4 2 5 2 2 3 4 4 5 3 8 15 6 2 5 4 3 1 2 3 3 3 4 5 2 2 2 2 2 7 20 3 5 2 5 3 5 6 5 2 3 2 6 5 5 3 2 3 2 2 3 3 3 2 4 2 3 2 3 10 26 5 3 3 2 3 2 2 2 3 2 3 4 5 2 2 7 27 3 1 2 4 5 2 8 5 17 17 296 296 296 184 184 320 354 153 153 153 153 387 387 387 396 285 131 300 382 382 313 131 133 133 345 333 220 220 220 133 133 364 276 276 346 346 346 265 85 85 85 85 139 293 293 122 122 472 133 147 147 380 288 496 496 496 274 368 368 9 142 221 336 354 109 278 278 99 99 436 107 50 50 50 50 50 185 269 433 433 160 112 427 491 491 312 312 126 292 292 292 292 292 292 326 326 21 21 326 326 21 21 21 408 408 408 408 149 228 289 177 177 177 356 356 342 86 238 196 479 331 231 231 231 274 274 43 364 276 174 174 319 319 348 348 64 212 300 334 382 382 245 399 217 473 65 486 486 460 169 169 164 164 485 485 485 8 345 88 109 242 242 116 250 250 70 65 65 498 245 42 147 380 134 134 139 175 175 423 423 423 423 353 353 353 406 467 245 245 8 32 401 401 401 354 354 106 496 496 496 274 169 164 164 224 494 255 251 251 81 278 278 26 26 302 302 497 335 14 14 411 284 284 284 405 405 405 206 206 206 206 37 24 131 404 404 439 225 225 225 225 417 80 491 80 7 7 251 241 241 278 278 278 173 280 176 135 135 135 200 199 255 255 43 43 364 276 109 403 403 403 403 171 246 324 301 8 259 354 376 376 376 376 376 178 178 458 458 192 183 183 286 286 286 286 286 286 468 245 245 8 354 62 62 62 62 438 216 114 57 203 53 394 478 342 232 172 115 279 279 279 279 279 279 279 375 375 233 270 270 269 433 390 112 112 56 491 56 47 491 305 491 187 187 187 187 391 391 316 491 73 73 73 491 289 108 119 487 487 487 288 213 213 246 246 318 368 453 168 106 353 353 353 353 396 35 465 472 196 70 70 383 383 383 383 36 107 447 221 336 144 27 437 319 319 53 53 76 465 242 242 242 94 41 41 41 41 19 19 454 229 247 126 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 149 228 491 320 127 114 84 84 496 274 236 239 384 371 485 286 286 286 468 382 313 10 10 479 331 84 84 84 496 16 274 368 368 453 342 168 118 118 118 118 402 198 198 114 0 0 0 0 301 378 43 364 347 347 347 347 498 467 396 313 216 216 114 0 222 382 313 314 314 239 354 420 420 420 464 464 44 116 94 479 230 230 169 169 352 352 69 223 223 130 402 402 198 114 57 57 57 203 381 381 117 404 439 439 439 439 439 439 237 78 78 170 491 491 312 312 312 12 12 1 292 21 21 21 408 408 408 391 391 391 228 491 412 412 287 111 111 438 438 314 133 133 380 499 499 493 216 216 300 382 134 251 241 367 367 367 458 192 415 415 457 401 401 259 74 351 213 213 213 213 252 215 259 259 29 100 100 375 375 98 98 13 417 417 417 237 237 237 237 237 237 237 237 237 237 237 237 237 47 316 491 491 316 316 491 491 491 435 289 289 289 108 377 87 8 420 420 420 420 422 99 338 338 395 395 487 498 498 498 59 59 59 452 263 263 417 417 193 193 193 +103-1240-0021 103 740 1 12 15 31 20 24 22 5 25 33 13 25 33 19 11 19 25 5 16 9 5 33 12 13 25 8 31 5 29 27 40 12 13 30 39 36 40 11 33 36 19 33 1 5 9 3 11 20 22 5 25 17 19 33 39 36 40 11 33 36 13 25 20 34 19 26 1 20 37 19 25 33 5 9 20 19 26 18 4 26 11 13 40 12 20 8 30 19 32 24 5 25 31 13 11 1 38 19 34 12 19 31 24 19 31 19 40 30 15 10 5 23 31 33 13 29 33 7 33 5 37 12 5 23 15 25 1 19 25 33 5 12 5 9 4 22 39 3 30 11 5 37 17 30 20 25 17 15 9 5 23 40 1 37 13 30 20 17 30 20 25 4 25 11 25 20 33 4 25 11 29 30 19 31 8 31 38 5 40 12 4 33 39 3 30 11 1 7 4 3 5 4 3 3 3 2 4 2 2 3 2 2 1 5 4 5 2 1 3 2 2 2 5 4 2 3 8 4 1 2 3 5 4 3 2 2 3 2 8 25 4 3 5 3 2 3 3 1 3 1 2 4 2 4 1 2 4 1 3 3 4 2 6 7 6 3 2 1 2 2 2 3 2 4 5 4 9 2 3 4 3 4 1 6 2 4 2 2 3 4 4 5 58 3 3 4 2 5 9 2 2 4 2 5 3 4 3 2 3 5 4 3 5 2 6 2 2 2 2 2 5 8 7 5 5 5 2 1 2 2 3 6 4 3 5 2 3 1 4 3 2 5 3 3 5 2 3 4 9 19 4 4 3 5 5 4 8 4 4 3 3 3 6 5 3 1 2 2 2 3 4 8 5 3 2 3 2 4 1 4 6 4 4 7 17 17 296 296 296 184 184 184 320 435 0 0 0 0 422 162 68 115 444 444 444 360 434 339 394 90 76 144 445 121 121 116 33 76 465 108 432 432 432 432 379 64 76 449 191 191 191 325 34 34 196 309 479 479 331 230 230 230 169 169 352 352 221 401 259 159 159 159 236 259 127 361 361 361 94 199 111 111 111 438 438 162 342 224 494 494 494 129 74 84 84 496 496 496 496 274 274 368 368 9 9 198 114 0 222 222 468 313 313 219 219 219 485 485 374 374 186 186 323 86 238 6 377 123 123 88 277 277 277 277 385 131 227 419 439 78 229 170 491 312 312 292 292 292 292 292 292 326 326 326 326 326 326 23 23 101 101 408 391 391 491 491 412 287 44 8 8 354 354 106 284 91 206 206 240 325 41 324 324 143 144 389 389 389 389 200 248 192 445 213 324 219 219 219 219 485 374 374 368 162 54 86 6 272 123 123 88 109 109 475 475 94 475 475 475 422 349 164 214 214 214 214 214 328 200 200 117 404 454 225 225 225 225 225 225 451 451 213 357 357 357 173 280 29 242 116 33 465 377 123 8 354 420 420 420 360 135 135 200 200 248 58 58 72 72 110 110 486 486 365 365 365 328 200 200 195 195 248 248 212 239 34 253 253 253 253 453 342 342 198 22 448 448 448 464 145 284 306 306 468 406 467 288 469 469 99 436 447 221 196 473 275 275 379 394 478 342 68 115 470 470 120 120 120 37 24 117 263 417 417 417 417 237 237 237 491 491 28 28 491 28 491 491 305 362 491 491 362 362 362 491 362 362 491 40 211 211 491 218 491 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 391 391 228 228 491 320 320 333 333 333 220 314 35 401 259 127 114 258 258 258 258 258 31 39 342 433 160 97 221 336 196 473 258 258 258 258 342 224 494 494 494 31 9 142 397 397 147 329 329 329 329 329 143 36 310 395 302 302 302 497 497 162 232 232 232 238 6 6 371 470 189 443 151 215 35 35 96 401 272 34 180 113 113 113 113 113 285 449 223 223 130 198 198 22 283 455 251 251 251 241 431 290 290 290 290 290 434 434 434 339 339 117 117 404 225 225 225 225 225 80 226 491 209 188 340 340 340 33 33 64 212 377 123 123 216 22 283 455 8 354 180 376 376 376 376 460 178 178 35 458 192 219 485 180 306 306 306 306 306 306 396 24 285 69 462 462 402 402 401 259 208 79 288 288 213 213 360 434 434 339 248 394 239 445 180 171 171 171 171 252 215 8 354 100 100 375 375 375 185 185 269 433 433 18 18 112 439 439 237 237 237 237 47 47 491 491 2 2 316 316 491 316 316 491 73 289 289 7 7 4 104 104 104 104 104 104 468 468 337 337 337 324 301 416 32 32 208 79 79 79 288 288 360 360 360 246 246 246 434 434 339 94 199 89 194 194 194 446 446 64 212 212 465 196 196 309 398 398 213 213 246 246 252 143 36 108 119 351 89 446 446 446 394 76 401 74 190 492 492 38 162 342 68 115 273 265 265 265 428 85 146 146 358 358 39 342 142 397 345 141 141 141 281 453 342 198 198 114 92 92 92 240 314 131 219 219 180 180 106 306 306 306 306 306 59 59 37 131 419 427 229 247 247 15 193 193 193 17 +103-1240-0022 103 818 1 31 13 33 5 9 7 33 3 25 38 5 25 31 8 11 38 19 34 17 30 15 33 1 29 15 33 30 20 3 30 22 5 23 38 19 23 27 40 1 5 25 11 12 20 5 12 14 38 19 34 29 30 19 24 23 3 24 9 3 30 11 20 40 1 25 3 33 5 31 33 30 15 31 33 19 22 25 6 30 31 33 27 25 38 5 40 33 5 9 20 31 20 25 1 16 6 30 24 19 31 19 40 30 15 10 5 23 38 35 11 18 4 37 31 20 25 19 33 19 16 12 13 30 18 4 11 9 19 25 1 29 30 8 37 5 33 23 20 32 20 38 5 40 5 37 12 20 5 29 19 25 39 5 25 12 5 33 24 3 30 19 23 5 22 5 34 9 14 33 31 38 13 29 33 12 4 33 39 3 30 11 27 37 14 13 40 6 16 5 25 13 40 32 20 31 38 13 29 33 18 14 18 7 31 1 8 6 4 2 2 3 10 4 3 5 3 3 4 6 7 3 2 2 3 3 3 5 5 1 4 4 5 2 1 5 4 3 2 3 5 2 4 7 6 21 8 1 2 1 6 3 4 4 3 2 4 4 3 2 10 3 3 3 2 2 1 3 6 9 23 4 3 3 3 6 4 2 9 7 3 3 7 3 3 3 6 3 8 1 4 2 3 2 2 2 4 5 8 6 14 6 2 2 3 2 3 2 5 3 4 3 4 5 4 2 2 3 2 3 6 3 2 5 2 2 6 3 2 3 5 3 4 3 3 10 13 3 3 6 2 2 3 4 4 4 3 3 1 4 3 3 2 3 3 5 2 3 4 2 2 2 2 3 2 2 3 3 4 2 4 4 4 3 4 3 6 2 2 4 4 2 5 3 2 6 2 2 6 4 5 2 4 7 5 3 2 2 2 4 3 4 2 3 3 1 4 3 4 7 9 15 17 17 17 363 363 51 51 51 184 373 66 68 115 273 470 443 443 240 449 449 34 255 8 354 180 113 113 113 113 113 113 113 450 413 413 36 449 34 106 125 125 125 125 203 250 250 250 70 174 174 174 319 319 348 33 394 478 478 68 68 115 273 273 265 265 265 85 85 85 146 24 133 133 345 333 333 220 220 142 221 401 491 208 79 484 484 484 484 484 252 252 457 36 472 472 401 401 491 74 74 351 351 171 171 252 143 36 161 161 487 485 485 485 464 106 499 306 306 396 396 178 178 458 144 302 100 497 497 497 497 364 364 364 276 109 278 139 175 175 81 81 84 84 84 496 274 185 185 185 269 433 18 427 229 247 247 126 126 292 292 326 326 326 326 326 326 326 326 326 408 101 149 149 149 149 228 412 83 83 194 194 194 322 67 466 212 22 448 448 448 464 464 493 493 493 493 493 216 300 300 382 382 245 378 43 345 333 333 220 220 142 221 401 401 491 74 190 190 487 288 278 278 203 53 53 195 195 195 250 251 251 251 241 431 284 426 426 426 203 53 212 212 29 29 495 313 313 325 41 41 41 41 19 318 185 185 433 433 433 160 112 112 417 417 237 237 237 237 237 237 237 491 2 491 201 201 491 316 435 491 491 435 435 435 435 289 289 491 7 479 331 307 307 61 61 285 44 44 44 44 38 482 482 482 482 238 6 336 161 79 487 288 288 403 403 171 171 246 246 252 422 186 162 232 232 232 68 238 6 272 470 278 278 278 178 458 458 192 472 196 196 309 331 157 157 157 157 372 396 186 162 54 482 482 238 238 6 371 180 84 84 84 496 274 413 413 413 195 250 250 345 141 141 141 281 9 238 6 272 87 87 354 420 420 420 420 422 162 68 68 115 267 267 267 267 267 434 434 434 434 339 303 303 404 13 491 247 247 126 126 292 326 326 326 23 101 101 149 228 491 491 373 155 155 155 332 332 332 372 245 399 70 258 258 258 31 342 224 494 494 368 453 142 142 397 147 329 329 329 329 329 329 36 310 107 395 302 302 302 302 497 497 43 43 364 364 345 389 389 389 314 58 58 110 202 202 202 202 402 478 66 68 68 267 267 267 267 267 434 339 94 277 277 277 37 37 325 34 118 118 118 118 402 402 472 177 198 127 114 0 222 222 468 245 58 72 110 110 254 254 254 240 314 131 133 401 401 354 137 137 137 137 275 303 303 303 48 404 439 439 439 78 237 47 47 47 491 491 47 316 316 491 73 289 73 491 491 190 488 488 488 488 488 428 146 146 173 173 29 469 469 236 36 26 359 359 359 474 474 474 324 186 99 338 400 400 400 30 378 8 345 141 141 281 453 342 168 168 223 223 130 129 198 198 448 448 448 464 464 255 143 129 259 74 351 351 278 278 360 339 398 398 398 464 275 275 116 64 212 198 45 45 45 236 129 196 196 473 65 329 329 406 406 288 288 139 175 175 175 423 423 423 143 458 144 27 437 151 151 169 169 402 35 221 336 354 29 498 382 313 313 35 131 472 482 482 482 482 397 397 189 189 189 189 169 35 96 96 272 472 472 198 127 114 92 92 92 92 240 385 449 449 219 464 180 106 306 306 306 306 206 396 285 285 34 84 410 410 410 410 173 173 29 29 495 495 406 406 467 467 253 253 453 9 168 14 14 411 284 405 405 206 169 349 352 352 29 242 242 116 94 199 253 253 253 253 338 338 400 400 400 30 422 162 232 482 397 397 189 189 189 215 215 35 96 272 472 156 156 156 156 245 58 72 72 268 268 268 268 268 268 450 450 271 186 39 390 390 390 18 427 56 247 312 15 15 15 292 292 292 292 15 193 193 193 193 193 17 +103-1240-0023 103 607 1 18 38 5 25 22 35 11 18 4 37 20 33 5 25 5 24 20 23 6 16 12 5 17 30 7 25 11 38 19 12 7 33 27 37 14 9 30 19 24 19 26 12 5 29 30 5 37 14 9 20 5 23 29 13 22 5 37 11 14 33 1 24 19 31 19 40 30 15 10 5 23 30 4 29 33 31 24 3 30 33 23 20 4 33 12 20 22 19 10 5 25 11 6 30 1 5 25 11 31 33 13 29 33 19 25 38 19 25 9 19 11 19 25 33 19 11 36 31 27 1 12 20 22 19 10 5 25 4 33 17 30 20 25 17 15 9 5 23 40 38 5 40 5 10 19 30 16 5 23 5 29 3 30 33 24 5 25 33 1 18 1 3 4 3 3 2 1 2 1 4 5 1 2 3 2 5 7 6 7 5 2 1 3 3 6 2 3 3 1 3 4 4 6 3 2 4 2 2 2 3 5 2 2 3 3 2 2 7 3 2 4 2 7 2 4 3 3 4 8 5 47 4 3 3 3 5 3 3 4 3 4 4 4 3 3 5 4 2 3 3 2 4 2 2 2 2 3 3 5 2 4 2 5 6 3 5 1 3 5 3 4 3 2 2 4 3 2 3 3 3 2 2 4 3 2 2 5 6 8 22 3 3 3 4 5 3 2 3 3 3 2 5 3 3 6 2 2 6 2 3 1 4 3 5 2 3 3 2 2 2 4 3 3 3 1 2 2 4 13 17 17 17 296 363 363 363 363 363 363 363 101 51 51 51 228 228 491 320 345 174 174 174 174 174 348 348 64 248 465 144 389 389 389 389 34 202 202 173 280 280 444 213 213 213 252 314 196 242 242 116 479 199 44 44 44 217 217 217 473 398 213 213 213 286 139 139 302 302 375 375 335 226 14 287 287 284 405 405 206 169 352 402 198 198 22 283 455 416 144 208 79 380 315 315 315 315 450 450 413 413 212 212 131 133 345 333 333 220 220 216 180 113 113 113 113 167 35 131 14 14 411 410 410 410 410 173 29 29 382 245 8 129 259 190 380 288 288 278 203 53 176 176 135 328 200 200 248 248 212 22 283 455 129 259 74 190 492 492 245 173 280 280 498 498 498 498 498 396 215 8 354 337 485 485 464 139 302 497 497 497 129 401 401 259 74 351 351 443 443 178 178 458 192 192 462 462 462 402 32 239 384 371 498 498 498 498 498 59 396 385 24 227 419 419 439 417 417 237 237 237 237 237 237 491 28 237 28 362 491 491 362 491 491 362 362 362 491 362 362 491 435 211 491 369 369 369 21 21 21 21 21 21 21 21 21 21 408 408 408 149 149 228 289 491 7 217 258 258 258 258 342 342 224 494 494 494 281 9 142 397 336 147 329 329 329 329 329 329 310 107 395 302 302 302 497 497 497 42 42 147 380 486 486 486 460 460 215 35 96 36 472 66 68 68 172 482 105 196 70 70 65 306 306 396 396 313 35 26 26 359 359 474 474 324 464 415 415 415 35 22 283 455 416 458 458 445 278 278 278 36 310 107 107 60 298 116 33 33 394 212 384 371 153 153 153 153 372 372 372 59 59 452 263 225 225 225 83 83 55 55 322 67 67 478 478 232 232 232 68 238 6 371 470 443 443 443 215 35 96 96 272 34 340 340 116 33 250 250 250 409 409 409 409 116 33 394 32 239 354 278 278 278 314 196 242 242 242 33 394 76 36 377 87 87 236 239 371 371 374 374 374 132 186 162 54 172 224 273 84 84 84 84 16 98 98 13 417 417 417 417 237 237 237 201 211 211 187 260 260 391 391 391 491 316 316 73 491 289 491 127 5 5 455 143 458 445 445 278 278 278 278 143 310 107 107 395 298 298 116 94 199 415 415 415 415 131 221 401 144 79 79 288 288 360 360 434 434 200 248 212 239 445 180 171 171 171 171 171 252 8 354 100 100 302 497 497 81 253 253 453 142 221 345 141 141 281 453 342 168 44 236 236 36 310 107 395 485 286 286 286 313 349 349 155 262 262 100 175 81 255 255 129 259 74 437 437 306 306 306 396 396 457 233 196 291 291 291 291 243 243 227 427 427 247 247 15 126 15 292 292 292 193 193 193 193 17 +103-1240-0024 103 763 1 6 30 38 35 11 18 4 37 9 19 25 10 19 30 16 5 23 1 19 16 19 33 18 4 11 25 3 33 9 19 25 31 27 29 15 25 16 5 23 20 22 23 20 25 13 40 33 19 17 19 37 19 33 31 5 24 34 19 26 5 37 12 20 5 29 19 30 5 25 31 5 37 5 25 5 25 39 36 40 11 29 3 30 23 14 1 19 33 31 38 19 25 11 27 40 23 35 22 33 1 20 31 33 4 25 11 38 13 31 33 1 34 30 36 12 5 38 13 31 33 38 5 25 1 23 35 22 19 26 7 33 6 25 12 5 9 4 22 39 3 30 11 1 22 15 24 5 16 23 5 11 5 37 24 13 23 27 21 36 25 31 5 25 23 8 33 1 9 5 33 12 20 31 33 38 5 25 1 14 7 6 5 2 2 2 1 3 3 3 5 5 2 4 5 2 6 4 6 3 2 2 2 2 1 3 5 4 2 2 4 6 2 8 3 5 3 2 2 5 7 3 8 2 3 5 2 2 5 2 3 3 3 3 2 4 2 2 5 2 2 3 3 3 6 3 5 5 3 4 2 2 2 3 3 4 7 5 4 3 5 4 4 4 8 27 5 1 3 3 2 4 3 6 4 2 3 3 2 2 10 5 3 4 3 3 3 6 6 5 12 5 2 3 1 3 4 3 5 3 4 2 8 15 4 2 3 4 4 4 3 2 3 1 2 3 6 4 3 8 4 4 12 4 4 3 4 5 3 4 2 3 3 7 2 6 6 8 8 6 6 3 4 3 6 8 17 3 1 3 3 11 5 5 4 2 6 11 17 17 17 296 363 363 363 51 51 51 51 184 491 491 412 287 157 157 157 157 372 372 372 396 396 245 245 43 364 364 345 389 389 389 240 325 34 202 202 202 402 221 259 354 137 137 137 137 137 33 394 394 76 310 107 107 395 395 286 286 286 468 396 245 349 349 155 262 262 262 100 100 375 98 98 117 417 417 225 80 80 491 209 118 118 118 118 118 402 177 177 177 177 36 34 254 254 254 314 196 479 331 307 307 307 61 61 167 457 35 259 137 137 137 137 137 33 394 478 478 68 172 344 344 344 344 274 129 129 74 74 72 72 290 290 290 290 290 339 339 33 90 393 155 262 262 262 359 359 166 166 166 324 422 143 129 458 144 208 208 208 386 386 386 444 360 360 360 360 246 434 434 339 94 199 253 253 253 253 31 342 86 238 6 272 87 87 87 416 458 445 485 278 278 173 173 29 277 277 385 314 478 478 68 115 273 231 231 231 53 53 76 198 214 214 214 328 200 200 200 69 223 223 130 198 198 22 448 448 464 464 255 255 129 129 74 74 485 485 485 485 286 286 468 468 467 337 11 11 11 11 11 379 379 77 77 342 342 224 69 69 223 130 44 44 44 116 94 199 319 319 319 348 33 33 219 219 219 219 219 485 485 374 374 374 132 318 368 368 54 54 238 272 472 221 336 74 74 437 437 306 306 306 306 306 396 396 134 175 175 81 334 334 334 334 59 452 452 13 491 247 312 312 126 292 292 292 292 292 292 326 326 326 21 21 21 21 21 21 21 408 408 408 408 149 228 491 412 177 177 177 177 77 9 142 397 336 276 109 109 278 330 348 33 64 212 384 84 84 84 84 496 274 185 49 9 26 26 241 367 367 367 367 143 96 36 131 483 226 226 209 411 213 213 213 213 213 252 318 39 39 342 86 86 238 6 272 483 440 89 89 446 446 446 67 212 131 133 364 276 109 109 443 443 120 120 271 150 39 433 433 160 6 6 227 419 439 439 439 225 225 225 225 237 47 47 491 80 491 373 373 373 155 155 487 487 487 374 374 216 216 283 455 455 43 276 109 109 443 443 443 150 150 86 86 238 272 397 397 364 174 174 174 174 319 348 195 195 195 404 404 229 491 247 312 126 292 292 23 23 23 101 101 149 391 228 491 289 320 7 241 367 367 367 367 192 192 176 135 135 135 200 464 464 113 113 113 113 113 167 449 34 125 125 125 125 466 22 455 455 8 259 180 376 376 376 376 376 460 178 178 458 192 219 219 219 180 180 106 306 306 306 306 306 306 59 37 24 131 404 229 229 247 126 126 326 326 326 408 408 149 228 228 289 491 144 445 210 210 210 210 210 203 53 44 44 44 44 349 234 234 234 261 425 386 386 431 151 151 240 240 285 34 69 462 462 130 402 402 196 217 217 217 217 473 65 443 443 139 175 175 241 81 84 84 84 496 274 274 274 236 32 401 36 310 107 395 485 374 374 374 374 132 132 132 242 116 33 33 33 394 478 478 232 172 172 115 273 319 319 319 348 348 466 250 241 431 431 428 428 428 428 146 358 385 233 227 419 419 439 439 78 170 170 491 47 491 2 491 2 316 316 316 491 316 491 73 73 73 491 354 159 159 159 35 35 198 22 5 448 448 14 411 411 213 213 213 213 213 186 39 342 86 86 238 6 272 472 397 336 276 174 174 174 174 275 388 303 303 117 48 417 78 170 491 491 421 491 128 128 193 193 17 +103-1240-0025 103 755 1 18 38 13 25 31 39 36 17 3 33 1 5 17 23 19 24 29 31 5 37 12 5 9 23 36 24 1 38 8 33 1 10 13 30 20 33 30 20 40 19 25 12 5 23 13 16 33 6 30 10 14 11 1 5 25 11 25 3 11 19 26 31 23 13 25 11 14 9 14 10 19 40 11 7 25 19 25 12 5 18 3 23 27 9 8 12 5 9 30 35 22 1 38 5 40 17 30 20 25 11 27 37 14 9 8 5 33 4 26 17 5 23 5 37 8 25 40 1 18 20 30 31 4 33 24 3 30 19 23 5 22 5 34 9 14 33 1 38 13 25 32 20 31 4 33 4 33 6 23 1 6 23 38 20 40 31 23 8 33 23 20 11 19 31 33 30 5 31 33 16 5 23 5 37 31 5 25 32 8 25 1 12 1 2 2 4 3 2 2 5 7 7 2 4 4 5 2 4 2 4 2 4 1 2 5 3 8 10 2 8 6 7 3 6 3 3 4 5 2 5 3 2 2 2 2 3 4 4 2 6 3 5 3 5 14 6 2 2 3 6 3 4 7 7 2 3 3 3 5 4 6 6 4 5 4 5 3 1 2 1 3 5 3 5 4 3 4 3 2 4 4 3 6 19 3 2 4 4 3 5 2 3 5 3 3 4 6 2 8 2 4 2 1 3 4 5 11 6 9 38 5 3 4 6 4 4 3 1 2 3 3 2 6 3 5 3 5 7 3 4 2 2 4 4 4 4 2 2 3 3 8 9 6 5 3 4 2 6 2 4 3 2 3 3 2 5 2 2 2 4 1 2 2 2 2 2 4 2 4 4 5 4 8 17 17 17 296 296 317 435 491 184 184 184 184 320 345 109 409 330 330 67 77 77 54 54 219 152 152 152 152 143 129 144 144 180 106 405 405 405 206 206 167 167 35 227 227 419 225 225 226 226 209 44 44 44 416 458 458 208 208 425 386 386 431 278 278 278 53 53 76 76 270 342 342 172 224 69 462 130 130 198 198 22 283 455 455 129 259 354 425 425 241 431 374 374 374 374 374 132 132 413 203 381 381 381 212 212 32 197 197 197 197 491 197 197 7 7 364 276 346 346 346 428 428 428 146 146 358 35 35 401 131 472 472 401 80 80 491 310 107 107 395 351 264 264 468 468 468 337 337 337 324 422 24 36 161 161 487 487 288 213 213 246 318 318 49 342 168 340 340 116 466 22 283 455 455 251 241 431 431 443 443 169 169 352 402 402 272 483 14 411 153 153 153 372 372 396 313 36 310 107 395 334 334 59 313 24 24 404 427 247 247 126 126 292 326 326 326 326 326 326 101 149 149 149 491 412 83 55 55 55 322 67 10 10 309 479 331 331 284 405 405 206 206 240 325 34 176 176 135 135 328 200 200 200 248 248 478 162 68 68 68 26 26 26 241 431 432 432 432 330 64 64 212 131 300 382 382 382 245 245 129 129 354 354 498 498 498 498 396 186 35 36 310 107 107 50 50 50 50 50 49 342 342 68 221 336 384 371 180 315 315 315 450 450 348 94 199 340 340 466 22 283 455 455 58 72 72 437 437 481 481 481 481 175 175 81 84 84 84 274 274 8 259 354 62 62 62 62 216 216 22 283 455 8 129 259 190 380 380 499 496 496 496 274 233 233 458 419 427 229 247 126 126 292 292 292 292 292 23 23 23 23 101 101 101 149 149 228 228 320 345 141 141 141 281 453 142 221 221 336 208 79 79 79 288 360 360 360 434 434 339 64 212 131 180 180 410 410 410 410 173 29 29 382 245 245 8 8 62 62 62 62 62 146 464 44 44 44 236 36 108 119 119 351 351 486 365 365 365 200 200 212 212 302 302 302 175 175 462 462 462 462 4 4 4 280 106 284 480 480 480 480 480 85 85 299 299 299 299 339 303 471 471 471 49 433 433 433 160 112 112 439 56 56 237 237 237 491 28 491 28 491 362 362 362 491 362 362 491 362 362 491 491 362 491 211 491 491 369 369 21 21 21 326 408 408 408 408 228 491 289 491 373 451 451 286 286 286 286 468 468 313 186 162 232 68 115 273 470 486 486 460 460 240 35 472 196 196 70 65 65 495 406 467 288 139 175 175 423 423 423 143 129 144 27 437 437 151 151 169 169 164 164 164 221 336 354 29 334 334 59 59 385 233 465 419 439 439 225 417 417 80 80 80 7 345 409 409 409 409 76 310 107 400 400 30 30 422 422 342 342 273 470 486 486 460 240 285 34 415 415 415 325 131 106 106 297 297 297 375 375 98 98 263 417 417 417 417 237 237 237 237 80 491 491 483 287 287 297 297 297 297 297 43 43 345 109 109 109 171 171 318 186 162 232 68 68 26 26 425 241 431 428 428 428 146 143 26 26 359 166 166 166 301 143 36 490 490 490 38 162 482 482 238 6 161 487 499 151 151 150 150 86 142 142 393 262 100 100 175 81 462 462 130 162 68 68 273 319 319 319 348 33 64 212 310 107 395 180 480 480 480 85 299 299 303 48 229 229 247 15 15 193 193 193 17 +103-1240-0026 103 416 1 4 25 11 18 20 30 32 20 31 4 33 25 7 1 25 19 33 19 26 1 4 25 11 12 5 33 15 9 5 23 9 19 18 8 25 11 18 14 38 5 40 23 15 11 16 14 31 5 29 14 1 24 19 31 19 40 30 15 10 5 23 1 9 19 16 6 30 32 20 18 4 11 16 13 30 23 20 22 23 27 40 11 12 5 11 6 30 1 21 8 1 2 4 5 3 5 4 6 5 4 3 10 16 7 2 4 2 8 15 6 2 1 2 2 4 5 2 2 2 2 2 5 5 1 2 3 3 3 1 4 2 4 3 3 3 5 2 4 7 60 4 2 4 3 4 3 4 3 4 8 6 3 4 4 3 2 5 2 2 1 3 3 3 3 3 3 4 3 4 3 2 2 2 2 5 8 5 17 17 17 296 296 363 363 52 52 52 52 52 52 51 51 51 51 184 184 289 491 209 83 83 194 194 194 194 322 67 67 131 183 183 183 451 286 286 286 286 468 468 313 186 99 338 400 400 400 400 30 422 186 162 232 68 68 115 470 486 486 486 460 167 167 35 401 196 309 479 331 315 315 315 315 315 450 450 98 98 417 417 417 417 417 417 237 237 47 47 491 47 491 80 80 73 80 80 7 7 309 309 479 278 278 278 278 36 449 449 176 176 328 328 328 200 303 117 98 13 417 417 417 417 237 237 47 47 47 491 80 80 80 80 435 209 83 83 194 194 322 67 67 212 22 5 455 236 36 108 119 351 351 171 171 171 252 8 29 302 302 497 497 8 354 255 255 58 58 72 72 480 480 480 480 299 299 339 212 131 156 156 156 156 245 245 43 345 141 141 281 342 26 26 241 431 476 476 476 252 252 36 393 393 155 332 332 332 186 162 342 115 273 151 151 151 215 215 29 29 334 334 59 59 59 263 263 417 417 417 237 237 237 491 28 28 28 362 362 491 362 362 491 362 362 362 491 362 362 362 491 362 362 362 218 218 218 218 218 218 491 491 211 211 369 491 369 369 369 369 369 369 369 369 260 260 163 163 163 316 316 316 491 316 491 73 289 289 7 217 473 258 258 258 342 342 224 494 494 368 453 9 142 397 147 380 329 329 329 329 252 143 310 107 395 302 302 302 375 375 375 98 98 13 225 225 225 225 80 80 80 80 80 320 354 255 255 255 349 349 155 155 148 148 148 372 372 313 186 338 400 400 400 30 58 110 254 254 254 314 90 393 205 25 470 264 264 468 468 134 359 359 166 166 166 422 129 458 208 208 386 386 496 496 496 496 368 368 453 9 142 198 22 22 283 455 384 371 106 153 153 153 372 372 372 59 59 452 263 229 247 126 126 326 193 193 +103-1240-0027 103 698 1 12 13 30 38 14 34 30 20 29 23 15 33 31 23 15 11 1 31 27 12 5 33 24 3 30 19 23 5 24 5 31 33 9 20 19 22 31 29 13 22 33 19 26 31 5 24 38 5 25 18 27 24 38 19 34 24 4 34 39 36 33 19 33 20 1 9 5 33 12 5 11 19 32 19 40 38 14 13 37 30 20 11 15 11 19 32 19 40 1 5 25 11 12 13 30 38 5 40 27 25 23 20 22 30 4 9 4 29 5 23 29 30 19 40 14 37 40 5 25 11 38 5 25 22 8 25 11 5 37 22 15 22 1 31 27 12 5 33 12 20 19 22 31 29 13 22 33 19 11 22 5 24 29 5 25 20 22 35 11 25 3 33 9 20 13 25 20 29 14 33 19 22 39 5 23 14 22 5 24 29 5 25 20 1 14 3 2 3 3 4 5 3 4 5 3 4 3 3 4 7 5 16 6 3 3 2 3 3 1 3 4 4 3 4 3 3 1 2 3 2 4 2 3 2 4 2 2 6 5 2 4 2 2 3 5 4 4 2 2 4 3 4 3 2 3 3 3 5 11 25 6 4 3 2 2 5 2 6 4 4 3 3 4 3 3 2 3 7 4 3 5 5 11 7 4 2 1 2 1 3 2 2 3 3 3 3 4 6 2 4 3 4 3 2 2 3 2 2 4 11 3 2 3 5 3 4 3 5 6 5 2 1 2 3 4 7 6 15 6 2 3 3 2 3 3 2 4 1 3 2 4 2 2 2 5 3 3 3 2 2 4 4 2 3 2 4 3 2 5 2 4 3 2 3 5 2 4 2 1 3 2 5 2 4 2 2 2 7 19 17 17 17 296 296 317 491 491 184 184 184 184 184 320 320 127 114 0 0 0 378 378 43 347 347 347 347 313 186 164 164 164 119 487 487 487 288 213 324 324 301 143 259 74 425 425 386 386 431 403 171 171 252 24 270 270 342 26 26 26 241 241 431 403 403 171 171 207 358 37 24 131 427 229 247 247 126 126 292 292 326 326 326 326 326 101 101 101 149 149 228 491 373 66 115 273 273 496 496 274 216 216 45 45 45 236 35 196 196 217 65 65 329 495 406 467 256 256 139 175 175 423 423 423 423 423 399 217 70 65 65 151 169 150 342 142 221 336 420 420 420 464 154 154 154 458 458 96 86 105 105 336 470 470 151 178 178 96 96 36 272 176 135 328 200 200 248 248 478 342 68 68 115 273 231 231 231 53 250 250 174 174 174 319 348 33 58 72 72 72 437 350 350 350 350 203 203 250 250 250 333 333 333 220 220 402 196 196 217 217 65 486 486 460 460 169 164 25 485 485 485 374 422 143 36 377 87 87 236 36 108 108 119 213 213 213 213 246 246 246 19 19 454 454 229 170 491 312 312 312 187 292 292 292 12 12 12 21 408 408 408 260 391 491 491 316 491 316 491 73 289 7 7 7 354 159 159 159 159 240 314 35 35 127 5 5 455 236 129 239 384 371 278 278 278 99 436 436 395 395 50 50 50 50 49 9 142 397 336 347 347 347 467 14 411 204 204 204 204 204 29 337 337 337 301 422 239 384 93 93 93 93 171 171 252 252 314 239 384 371 371 278 278 99 99 436 436 395 50 50 50 50 50 185 185 269 433 390 390 160 112 97 225 225 225 225 225 225 80 491 491 412 83 55 55 55 322 466 127 0 0 222 378 43 345 141 141 281 453 168 168 350 350 350 350 348 250 466 81 166 166 324 422 143 401 259 208 208 208 190 487 499 499 486 460 460 215 280 106 486 486 460 215 215 74 100 302 497 497 122 129 259 190 492 492 492 368 9 9 168 300 498 498 498 498 498 498 59 59 59 304 173 173 49 269 342 168 89 89 446 446 116 195 195 195 212 133 133 364 276 174 174 174 174 348 348 33 33 90 90 76 144 27 437 437 480 480 480 85 299 299 299 212 131 462 462 462 402 221 259 445 445 351 351 171 171 171 171 358 358 358 233 458 192 427 229 247 126 126 326 326 326 326 326 326 326 101 101 149 391 491 373 66 68 172 115 273 494 240 216 216 45 45 45 45 314 35 198 22 448 448 448 464 154 154 154 458 96 86 105 105 336 470 151 151 178 178 96 96 36 272 191 191 131 472 458 144 27 27 437 319 319 319 53 53 76 35 259 242 242 242 116 41 41 41 324 422 143 465 458 389 389 389 389 314 196 479 331 307 307 61 61 215 35 35 354 420 420 420 3 14 411 475 475 475 475 475 475 475 301 143 129 74 492 492 236 236 129 75 108 278 278 278 178 458 458 192 485 134 134 359 81 300 382 245 143 82 144 27 351 319 319 203 53 394 76 465 29 242 242 242 41 41 41 19 19 454 13 417 491 170 421 421 491 491 491 421 421 128 491 128 128 491 128 128 193 193 17 +103-1240-0028 103 782 1 39 13 33 1 18 38 5 33 5 37 24 4 34 39 36 40 38 8 33 22 3 23 14 5 25 11 12 5 31 6 30 5 23 24 13 30 1 24 19 31 19 40 30 15 10 5 23 38 5 40 17 19 33 19 26 16 13 30 23 20 1 11 19 40 20 38 19 12 19 31 5 25 39 36 41 38 5 23 24 19 31 33 14 20 5 9 7 33 22 38 8 5 33 1 5 25 24 19 31 33 19 30 20 5 31 17 30 20 25 17 15 9 5 23 40 1 17 35 11 20 37 25 19 26 30 15 10 5 23 1 24 3 30 19 23 5 31 13 11 1 9 30 19 31 22 23 20 1 12 19 31 19 40 5 30 20 23 16 8 25 20 37 25 19 26 19 40 5 25 19 33 1 38 27 25 33 39 36 31 19 33 11 7 25 1 22 4 2 4 6 2 3 2 2 2 3 4 4 4 2 3 5 6 4 4 11 3 7 6 1 2 1 2 2 7 3 3 3 4 6 4 14 21 4 2 4 2 5 3 4 4 3 3 2 2 3 3 2 2 2 5 7 3 4 3 7 3 3 3 6 4 4 2 3 2 5 2 4 6 4 5 1 2 4 5 3 4 3 3 2 2 3 5 3 6 4 7 2 6 3 5 5 3 2 7 3 1 3 5 3 4 3 2 5 4 3 6 3 2 5 7 57 2 3 2 3 2 2 2 3 3 3 2 3 8 13 4 2 2 3 3 3 5 3 5 2 2 2 3 3 3 3 7 10 5 3 2 3 3 4 4 4 4 5 9 4 4 3 3 2 4 3 2 1 2 4 3 13 3 2 2 1 2 2 4 2 2 3 7 4 9 17 17 17 296 296 296 296 296 52 52 52 52 52 52 408 408 51 51 228 184 184 289 219 357 357 357 357 240 385 35 401 401 401 197 197 80 80 491 320 276 181 181 181 181 240 285 34 223 223 130 402 196 196 217 473 65 329 329 460 460 169 164 164 485 485 485 485 257 368 368 9 142 397 221 364 364 364 276 346 346 428 428 428 146 252 35 131 472 221 458 144 144 27 437 437 437 437 437 437 481 481 481 481 481 481 175 175 81 300 300 382 382 406 467 467 89 446 116 466 22 283 455 38 162 482 482 482 482 115 273 106 153 372 372 406 467 467 302 302 497 497 399 399 217 217 217 217 473 65 264 264 264 264 264 264 468 468 59 59 59 452 452 263 263 13 78 170 170 170 491 491 2 491 2 187 491 187 187 163 163 163 391 391 391 316 73 73 491 491 7 217 473 258 258 31 342 342 494 494 494 368 9 9 142 397 147 329 329 329 329 329 329 36 310 107 395 302 302 302 497 497 43 345 141 141 141 281 342 221 336 445 180 443 240 325 449 176 135 135 200 248 248 90 393 234 234 234 261 261 25 264 264 264 264 468 313 134 359 359 166 166 166 324 422 32 401 401 401 401 401 239 384 371 278 278 278 368 453 342 168 41 41 41 324 246 301 43 364 333 333 333 220 216 198 114 258 258 31 342 342 224 273 319 319 319 348 10 10 219 219 219 398 485 374 374 374 374 374 368 368 107 395 397 134 100 100 100 497 497 399 217 217 217 217 473 258 258 258 31 342 86 238 6 272 495 495 495 41 41 324 464 255 8 354 180 113 113 113 167 167 35 472 472 221 259 208 208 441 441 441 346 346 265 265 85 85 146 146 146 277 277 277 24 131 449 472 225 226 226 226 226 491 209 287 319 319 348 33 33 250 217 217 473 65 258 258 31 162 232 68 68 68 238 6 272 485 485 468 468 337 337 324 324 464 459 459 459 368 31 9 142 221 336 208 79 79 288 213 213 213 246 339 339 33 248 248 212 465 445 180 171 171 171 171 252 252 8 354 100 100 302 375 375 375 185 49 433 390 18 427 56 56 247 312 312 292 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 163 163 163 491 491 163 491 163 491 491 316 491 316 491 316 491 316 73 73 491 320 465 144 180 484 240 325 34 213 213 213 173 402 196 94 176 360 328 200 248 147 380 329 329 329 329 107 107 302 302 302 302 497 98 98 98 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 320 7 217 70 329 329 495 406 467 139 139 175 175 423 423 423 423 162 68 68 115 273 470 120 120 240 314 131 472 401 401 259 354 190 380 288 288 278 31 342 86 105 105 26 359 359 474 474 474 474 19 19 454 454 454 225 225 225 225 225 225 225 225 225 225 225 7 7 127 114 258 258 31 342 342 168 356 281 453 453 168 44 44 44 42 147 147 380 288 286 286 464 139 139 497 497 349 349 234 261 25 25 480 480 480 480 85 85 85 299 299 339 339 94 199 360 360 213 360 173 173 402 196 94 199 176 328 328 200 200 464 356 356 430 453 430 430 116 199 277 277 277 277 24 131 419 439 439 439 225 225 225 225 391 391 80 80 491 491 320 345 346 350 496 348 35 310 152 152 152 422 186 342 224 470 278 278 457 36 384 371 180 315 315 315 315 450 450 413 413 303 48 404 13 229 491 247 15 15 193 193 17 +103-1240-0029 103 763 1 18 7 14 6 23 39 6 30 16 27 22 31 1 31 5 24 34 19 26 12 4 33 16 6 30 23 4 22 5 37 13 25 20 5 12 14 25 15 24 8 33 9 20 22 6 23 11 16 30 13 25 32 19 29 1 19 17 40 19 31 33 5 11 4 25 11 6 23 38 20 40 18 4 11 19 17 40 19 31 33 5 11 9 19 33 38 20 25 24 3 30 19 23 5 22 5 34 9 14 33 5 25 11 24 19 31 19 40 30 15 10 5 23 1 19 25 31 29 8 33 5 37 1 6 30 29 14 18 4 29 31 9 19 22 5 40 5 37 1 12 13 30 11 19 31 19 24 5 23 4 30 5 33 20 1 24 3 30 19 23 5 38 5 40 5 33 6 23 1 10 5 7 3 4 4 1 4 3 5 2 7 7 36 7 3 4 4 3 6 3 4 3 5 2 2 5 6 7 6 6 4 3 6 3 3 3 3 9 6 6 4 2 5 4 4 4 4 6 1 3 3 5 4 5 14 4 5 4 3 5 2 5 2 6 2 3 3 3 3 4 3 5 3 3 2 4 2 4 3 3 2 2 2 2 4 3 2 2 3 2 2 3 3 3 4 4 3 5 4 2 2 2 1 2 2 4 2 4 3 4 3 4 4 17 4 3 4 4 5 3 7 14 9 6 3 4 3 3 4 4 5 2 3 6 4 4 6 8 5 3 2 3 2 2 5 2 2 2 4 4 3 3 2 7 50 3 1 5 2 3 3 2 2 3 3 9 10 10 3 17 17 17 296 363 363 51 51 51 184 491 373 72 268 268 268 268 268 88 88 88 353 353 406 467 106 297 297 297 297 293 293 219 219 464 106 106 387 387 372 349 349 205 261 25 106 496 496 496 233 233 233 233 270 270 433 390 390 18 112 112 439 439 439 439 439 78 78 491 491 28 28 28 2 2 2 491 2 2 341 341 491 341 341 163 163 163 163 163 163 163 316 491 316 491 491 491 73 491 373 66 68 172 115 273 231 231 231 231 53 53 394 76 164 214 214 214 214 214 328 200 200 248 248 248 212 127 45 45 92 92 167 167 35 472 393 393 155 155 332 332 332 387 134 251 251 241 431 431 376 376 376 460 460 169 178 35 401 458 144 192 69 69 223 223 223 223 223 130 130 352 352 402 483 440 411 475 475 475 94 475 475 475 324 324 464 180 493 493 493 493 216 300 382 382 313 10 10 479 331 290 290 290 290 434 434 434 434 203 399 217 70 70 65 65 428 428 428 146 146 24 131 472 221 259 420 420 420 420 420 143 458 144 144 27 437 481 481 481 481 481 293 122 122 131 472 393 393 234 234 234 261 487 288 288 432 330 348 64 76 310 107 107 395 395 459 459 459 459 215 233 131 427 229 247 247 126 326 326 326 326 326 101 101 149 149 228 228 412 188 154 154 154 416 416 96 368 453 453 278 278 278 278 278 31 342 86 86 238 6 272 191 191 191 191 37 325 335 335 440 145 89 194 446 446 67 212 131 34 106 297 297 297 293 43 345 109 109 109 171 171 368 453 342 58 72 72 110 110 486 486 460 240 240 325 34 154 154 154 416 96 96 453 168 278 278 278 31 39 86 238 6 272 191 191 191 314 133 259 354 255 236 236 108 119 397 487 360 360 360 434 339 33 250 217 65 65 329 495 406 288 288 139 175 175 423 423 423 423 129 458 144 27 437 151 151 169 169 402 402 221 401 401 354 495 498 59 396 313 325 449 89 89 446 116 250 217 473 258 258 31 342 224 494 494 494 368 142 142 397 147 380 329 329 329 329 329 36 310 107 395 302 302 302 375 98 98 229 82 247 126 126 126 326 326 326 326 326 326 101 408 149 149 228 289 412 188 188 340 121 394 478 478 68 86 105 336 354 106 265 265 428 428 146 146 240 325 449 34 223 223 223 223 223 223 173 173 402 352 352 352 352 352 352 97 97 417 197 417 237 237 237 237 237 80 491 80 80 80 209 287 157 157 157 372 245 245 129 129 74 492 492 492 492 58 110 486 486 486 460 215 215 35 96 66 68 68 342 221 336 336 354 420 420 422 143 458 144 27 27 351 151 151 151 368 453 342 168 168 223 223 223 223 223 223 173 173 352 352 352 352 97 97 225 225 225 225 80 491 127 114 222 222 468 313 313 325 34 490 490 31 342 342 342 273 494 203 70 65 134 134 175 175 431 486 486 486 486 468 468 468 469 469 469 36 449 449 41 41 41 19 19 454 417 170 170 170 491 28 28 28 28 491 28 362 362 491 362 362 362 362 491 362 491 491 491 362 211 211 211 369 491 369 369 369 369 369 21 21 21 21 21 21 21 21 21 408 408 408 149 149 228 289 491 320 473 65 329 329 245 406 406 380 134 139 139 175 423 423 423 423 345 141 141 281 281 9 168 44 44 44 129 129 108 108 119 119 437 437 437 481 481 481 481 481 481 481 182 182 182 182 293 293 497 497 497 98 98 404 225 225 193 193 +103-1240-0030 103 725 34 19 25 38 35 24 5 25 38 19 34 4 26 17 5 23 40 4 25 11 38 19 12 7 33 22 14 37 40 1 18 14 11 3 30 22 18 13 30 32 27 11 31 5 24 17 30 15 31 33 30 20 22 31 5 25 11 38 5 40 6 23 38 20 40 33 38 19 31 33 19 11 5 29 19 25 5 18 3 30 11 23 19 33 5 23 25 3 33 9 19 18 8 25 11 1 38 19 34 33 36 38 8 14 18 13 30 29 19 25 40 31 33 5 22 5 17 30 13 31 19 37 23 20 34 30 36 19 33 1 32 20 23 35 22 33 23 8 22 5 38 35 24 5 25 5 37 25 4 30 27 19 22 31 29 19 30 20 5 25 31 5 25 11 30 19 21 19 11 22 3 25 32 5 25 31 1 38 19 10 32 20 38 3 40 1 8 4 7 3 4 3 2 5 3 2 2 8 5 2 2 5 6 2 2 3 2 2 2 7 3 8 8 4 10 7 6 2 5 5 3 5 2 3 5 9 5 4 3 2 6 3 4 5 7 2 3 5 3 3 2 1 2 2 2 3 3 3 4 2 4 4 1 2 4 2 2 3 4 4 1 3 2 5 4 4 1 3 2 1 3 2 4 5 4 2 2 6 8 4 3 3 3 2 6 6 10 5 6 4 6 2 4 4 4 3 2 3 3 3 3 3 4 3 2 6 2 2 3 3 5 4 2 4 6 27 7 4 4 3 3 2 4 3 3 3 4 3 3 2 2 2 3 3 7 2 6 2 3 3 3 4 3 3 3 3 2 2 2 3 2 3 3 1 3 6 3 4 4 3 4 9 7 3 3 4 5 3 4 7 10 13 17 17 296 296 4 261 25 470 278 278 278 330 116 33 195 195 212 90 133 364 276 276 174 174 174 203 53 53 473 275 275 388 195 117 404 133 364 345 333 333 220 220 402 335 14 411 145 145 145 365 365 365 360 200 64 212 212 302 302 302 302 497 497 497 497 49 269 342 342 168 89 89 194 446 446 64 133 133 345 333 333 220 216 114 180 113 113 113 113 450 167 285 131 472 221 458 144 208 27 27 498 498 498 498 498 59 59 59 59 59 173 173 270 270 270 390 390 390 112 112 417 417 417 237 47 491 491 491 80 80 491 491 373 156 156 156 156 156 313 236 239 259 384 180 106 106 306 306 306 396 396 178 143 458 192 445 72 110 351 264 264 264 468 468 468 382 313 186 99 338 338 338 338 395 395 84 84 496 496 274 122 314 314 478 478 68 115 273 231 231 231 53 53 90 90 32 32 144 208 79 79 380 288 288 171 171 171 252 186 39 342 232 482 482 238 6 161 79 487 288 213 213 213 358 358 233 270 270 270 342 168 89 55 322 322 250 345 141 141 281 453 9 168 106 297 297 297 297 293 43 345 109 109 109 368 31 342 86 238 6 108 119 397 487 278 278 31 31 86 86 272 191 191 191 236 325 34 230 230 230 230 215 35 259 340 340 340 94 44 44 44 44 72 72 72 437 306 306 306 306 306 396 396 313 26 251 241 431 278 240 285 285 302 302 497 122 10 10 479 331 331 405 405 206 206 167 449 472 221 336 354 255 255 58 72 72 72 437 480 480 480 480 480 85 299 299 299 299 339 195 243 212 131 419 225 397 133 320 345 333 333 220 220 164 164 472 221 401 491 108 108 119 374 374 374 374 374 374 132 132 132 132 132 43 364 276 276 346 346 265 265 85 85 146 468 468 382 313 337 58 183 72 72 110 110 264 264 468 468 245 215 35 259 74 351 275 275 116 379 195 471 471 478 66 68 68 238 6 272 189 189 189 189 178 458 192 44 44 236 416 239 208 79 79 380 151 151 151 150 39 342 342 224 494 494 134 8 402 359 359 474 474 166 422 349 164 164 164 487 487 487 487 374 374 88 88 277 277 277 277 385 75 227 419 427 491 491 247 312 312 292 292 292 292 292 292 292 21 21 1 21 21 21 21 21 21 21 408 408 408 408 149 491 491 373 338 400 400 400 400 30 301 422 251 251 367 367 367 367 367 367 35 96 259 26 26 241 266 266 266 266 266 266 35 192 44 44 44 43 364 276 174 174 174 174 53 53 65 242 242 94 199 462 462 462 402 196 309 309 479 331 486 315 315 315 460 450 406 467 84 84 84 88 88 88 154 154 154 96 96 232 232 105 105 336 354 485 286 286 286 468 468 337 337 11 11 11 11 379 379 471 77 342 224 89 89 116 33 90 42 147 147 380 288 278 236 36 449 191 191 191 131 472 458 144 27 437 370 370 370 370 370 348 64 64 310 310 436 395 459 459 11 11 379 303 471 243 270 269 433 160 160 18 112 439 225 225 225 225 80 80 491 491 320 345 407 407 407 236 233 36 310 107 338 338 400 400 400 400 301 378 43 345 109 346 346 141 355 355 355 37 185 185 433 433 433 160 160 112 427 56 491 491 312 15 15 15 15 193 193 193 193 193 17 17 +103-1240-0031 103 842 1 9 5 33 12 13 30 38 5 40 5 31 15 37 19 26 31 5 24 34 19 26 5 9 7 33 18 14 24 7 34 38 19 10 1 19 16 19 33 18 4 11 9 19 25 13 37 14 31 27 31 23 8 33 23 20 11 19 37 13 23 5 29 33 1 24 8 33 18 4 37 9 19 25 22 5 25 31 19 11 14 11 19 25 11 19 22 5 33 19 37 5 37 5 31 13 25 31 5 37 18 39 36 24 14 1 38 19 30 6 23 29 30 19 33 20 38 13 23 1 31 13 11 24 19 31 19 40 30 15 10 5 23 1 8 1 38 5 40 22 8 25 11 5 37 5 16 30 15 11 39 36 38 14 25 33 1 12 27 1 18 38 13 25 8 31 6 24 4 34 39 36 31 33 3 30 33 19 26 6 16 33 5 11 15 1 8 34 6 33 24 15 9 20 18 20 38 5 40 17 27 19 26 33 5 12 5 11 3 22 33 14 40 1 16 2 3 2 1 2 2 2 2 4 3 6 6 2 2 6 7 2 4 3 2 3 2 3 5 2 5 3 4 11 6 2 4 12 2 6 5 2 1 2 2 1 3 5 4 6 4 4 6 3 6 2 5 3 2 2 3 2 4 2 5 4 3 4 17 6 4 2 1 2 2 2 2 3 3 2 3 5 2 2 2 2 3 4 2 3 4 2 2 4 2 3 3 3 4 2 4 3 1 3 3 2 3 3 6 44 4 3 2 4 3 4 2 1 2 3 3 3 10 7 6 3 3 2 2 3 2 4 3 3 4 3 4 35 7 1 2 1 3 3 4 2 1 2 2 4 4 2 5 2 4 5 4 5 2 3 1 3 11 1 2 2 2 2 5 5 6 4 6 3 2 4 3 2 3 2 2 2 3 3 3 3 2 2 10 20 7 3 4 3 2 4 3 3 3 3 1 2 3 4 3 4 2 2 2 3 1 3 4 5 2 5 11 16 17 17 17 296 296 363 51 51 51 51 51 491 184 184 184 184 320 159 159 159 159 240 35 127 0 0 222 378 345 347 141 141 281 342 342 44 44 44 38 162 232 68 172 115 470 470 171 171 171 252 173 173 176 176 135 135 200 200 248 248 478 232 232 232 68 115 273 231 231 231 231 53 76 76 164 164 214 214 214 328 200 464 255 255 8 259 180 113 113 113 113 450 285 285 58 156 156 156 156 156 245 245 399 217 217 473 65 315 315 315 315 450 450 450 450 169 352 164 164 97 397 397 364 407 407 407 407 407 407 36 310 310 107 107 107 447 97 483 197 226 226 80 80 209 209 188 118 118 118 118 352 352 25 177 177 254 325 34 254 254 254 314 129 259 137 137 137 137 137 116 195 195 195 335 14 226 411 145 463 463 463 463 29 29 382 313 186 186 162 68 172 344 344 344 344 344 274 186 162 232 68 26 26 26 386 431 428 428 146 146 35 26 359 166 166 166 236 36 384 490 490 490 173 280 280 180 443 443 139 175 175 81 81 469 469 469 215 233 96 96 227 419 427 229 247 126 126 126 292 326 326 326 326 326 101 101 101 149 149 228 491 320 7 70 70 65 65 428 428 85 146 24 325 202 202 202 402 129 259 137 137 137 137 33 76 465 465 27 121 121 33 394 478 68 68 115 115 278 278 278 285 300 382 313 24 325 34 121 121 116 33 394 212 239 371 371 278 278 143 458 458 192 469 469 325 34 459 459 459 173 173 280 69 69 223 130 280 44 44 44 38 342 68 115 273 432 432 330 379 64 77 77 224 494 462 462 402 183 183 219 485 485 485 374 374 132 399 53 334 334 334 59 452 263 417 417 417 417 237 237 28 28 491 28 362 362 491 491 491 362 491 362 491 362 491 491 40 211 211 369 369 369 369 21 21 21 21 21 21 260 260 260 260 391 391 391 491 73 289 289 7 345 109 109 109 347 467 467 499 297 297 297 297 293 293 35 259 74 190 104 104 104 285 34 41 324 301 43 276 109 109 139 139 139 293 293 293 98 98 13 13 417 417 417 417 417 417 80 80 80 80 435 66 66 179 179 179 179 179 314 314 196 217 473 258 258 31 342 224 494 494 281 142 142 397 147 380 329 329 329 329 143 310 107 395 395 302 302 375 98 98 13 417 417 417 170 249 20 28 305 491 442 305 305 2 491 491 2 2 249 491 491 305 305 366 491 491 366 316 491 435 435 435 435 435 435 289 412 287 287 111 111 111 438 378 345 141 141 281 9 142 336 144 27 480 480 480 146 299 64 34 34 462 130 29 44 255 38 349 205 205 261 190 380 288 288 171 171 252 252 314 239 219 219 219 152 152 374 374 132 132 43 364 276 109 372 372 59 59 396 339 243 227 472 472 198 216 127 114 84 84 84 16 16 16 274 98 98 13 225 225 225 345 409 409 409 409 94 199 111 111 111 438 438 162 342 172 115 273 106 481 481 426 426 206 399 217 217 473 486 486 486 460 460 169 164 164 485 485 485 485 374 318 186 162 54 238 6 272 499 499 499 206 240 285 34 176 135 200 200 106 284 405 206 169 169 402 96 36 272 469 469 236 325 93 93 93 207 207 19 454 454 229 82 247 126 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 149 228 412 412 287 111 111 111 438 349 164 164 106 106 405 405 206 167 457 217 473 473 476 476 171 252 252 8 420 420 324 324 183 451 30 30 30 378 141 141 141 281 342 142 221 144 180 84 496 88 88 176 176 135 135 248 248 108 377 123 123 216 22 283 455 236 384 180 91 91 91 91 91 178 458 96 6 272 334 334 334 304 304 304 185 185 323 390 390 18 112 439 417 237 237 237 237 237 237 237 237 237 128 128 128 128 128 128 193 193 17 +103-1240-0032 103 738 1 24 14 19 23 5 40 23 19 29 31 33 38 19 10 33 5 25 11 14 31 33 4 25 11 19 26 23 20 1 32 20 18 4 11 19 22 31 29 13 22 33 19 11 24 19 31 19 40 30 15 10 5 23 5 29 1 32 20 18 4 11 25 27 25 12 5 33 12 5 31 8 33 5 37 24 4 34 39 36 21 6 25 33 19 26 6 16 31 27 5 25 5 22 7 25 33 5 9 23 20 1 38 35 11 9 20 33 36 24 5 10 16 14 18 14 25 15 9 14 40 22 39 35 30 20 3 31 5 33 20 1 27 25 27 1 8 24 22 38 8 33 38 13 23 1 6 23 12 27 8 18 4 11 5 9 4 11 18 13 11 15 22 39 13 31 33 14 11 15 1 32 20 31 13 11 1 19 5 4 3 4 3 4 3 2 6 6 4 3 3 7 2 2 2 2 3 3 3 5 1 2 1 4 3 7 23 3 4 2 3 2 2 4 2 3 3 4 2 3 2 3 2 3 2 4 3 3 4 4 3 5 7 6 6 4 4 2 3 4 8 1 2 2 2 2 3 5 7 3 3 2 3 6 4 2 5 5 5 2 3 2 3 5 3 6 6 2 2 3 5 4 3 2 2 3 3 7 16 4 2 2 3 5 7 4 4 3 4 5 2 3 2 3 5 4 3 4 3 2 2 3 4 4 5 2 2 9 27 7 4 12 15 8 3 3 3 5 4 2 2 8 1 7 5 2 6 6 3 3 2 3 3 8 2 4 2 3 4 4 2 3 4 3 1 3 7 5 6 3 4 4 5 10 17 17 17 17 296 317 317 317 491 317 461 461 461 461 184 184 184 184 491 7 7 70 65 329 329 42 406 406 288 134 139 139 175 175 423 423 423 423 31 342 26 26 251 241 431 278 278 278 215 233 233 270 270 433 433 86 238 336 336 82 108 397 397 441 441 109 278 278 385 233 36 310 447 447 238 6 272 34 319 319 348 64 212 300 300 313 186 162 232 238 6 470 470 294 294 294 294 330 94 94 176 176 328 200 200 248 359 359 474 474 474 19 19 454 454 229 170 491 247 312 126 292 292 292 292 292 21 21 21 408 408 408 408 408 391 391 228 491 373 373 400 400 400 30 30 58 58 110 254 254 254 254 325 34 154 154 458 96 66 342 105 105 336 470 151 151 178 178 35 96 401 75 272 191 191 191 314 196 217 473 258 258 258 31 342 224 494 494 368 9 142 397 147 380 329 329 329 329 252 36 107 107 302 302 302 302 175 175 431 230 230 230 230 215 35 227 419 439 439 439 225 225 47 47 491 80 491 373 373 338 338 400 400 400 30 30 58 58 110 254 254 254 254 254 35 196 196 309 479 331 84 84 84 496 274 274 413 413 466 466 45 45 45 45 216 198 22 283 455 38 162 68 68 115 273 273 265 428 428 146 146 146 35 449 34 69 69 130 402 402 196 217 473 486 486 486 460 460 169 169 164 164 485 485 485 374 132 301 236 129 310 310 107 395 180 106 426 426 426 206 348 76 465 449 449 176 135 200 200 199 106 426 405 426 206 402 402 478 232 68 68 115 344 344 344 344 88 14 14 411 319 319 319 94 199 154 154 458 445 445 351 351 351 315 315 450 413 413 76 449 449 134 134 134 8 26 359 359 474 474 474 324 19 454 229 247 247 126 126 326 326 326 326 326 326 326 101 101 101 149 149 228 320 7 345 389 389 389 389 314 401 259 420 420 420 420 422 236 129 36 108 119 344 344 344 374 374 132 132 399 70 383 383 383 383 383 383 36 107 447 393 393 155 332 332 332 245 58 156 156 156 313 10 10 479 331 290 171 171 252 173 8 29 334 304 304 304 186 54 142 221 336 445 445 485 485 485 468 468 468 337 337 485 464 180 180 405 405 169 169 150 342 342 224 469 469 325 325 41 41 41 19 19 454 13 439 78 78 491 491 28 491 312 341 491 341 12 12 341 491 12 12 260 260 260 260 260 391 391 228 491 491 289 289 209 287 287 16 16 16 274 413 348 479 331 84 84 84 16 16 16 16 203 381 48 417 417 417 417 417 237 491 47 47 47 491 491 47 491 80 80 491 209 287 287 111 111 111 111 203 203 90 90 76 458 208 441 441 346 428 428 428 146 146 131 133 133 364 109 109 139 139 139 139 375 375 98 98 417 417 417 225 225 225 287 287 297 297 297 297 293 293 216 216 114 84 84 84 16 88 88 111 111 111 111 438 58 58 110 110 110 254 254 240 34 44 44 44 8 354 180 180 376 376 376 376 460 282 240 24 131 183 72 110 110 443 443 240 325 34 207 207 207 324 416 416 239 219 357 357 443 443 169 150 150 86 238 6 469 469 469 469 325 93 93 93 207 207 19 454 417 417 417 417 80 491 435 373 338 400 400 400 30 30 422 162 342 115 273 470 120 120 120 37 24 404 229 229 247 312 15 15 15 193 193 193 193 17 +103-1240-0033 103 720 1 24 4 34 39 36 38 13 25 33 5 9 30 8 33 30 19 37 14 1 38 19 30 17 13 33 19 26 5 23 19 33 5 23 9 28 16 14 24 5 25 6 30 16 5 25 5 31 8 23 5 24 19 25 27 37 5 31 22 27 32 5 1 5 25 11 18 20 40 22 5 24 19 26 3 25 12 5 33 30 15 25 33 5 25 8 33 1 19 16 24 3 30 19 23 5 18 4 11 31 13 11 1 12 5 33 24 4 34 39 36 18 4 11 17 6 25 33 5 9 30 8 33 30 19 37 14 33 5 24 20 33 15 22 4 26 17 14 36 16 14 24 6 31 33 30 15 23 39 5 1 24 19 31 19 40 30 15 10 5 23 22 35 11 25 3 33 18 4 37 9 19 25 24 6 30 5 31 33 3 25 19 32 33 1 11 6 4 3 3 3 3 3 3 3 2 3 2 6 3 3 3 3 7 14 5 1 3 4 2 2 3 4 2 3 2 1 2 2 6 11 2 2 2 2 2 6 3 3 2 2 3 5 5 3 1 3 3 10 3 2 3 4 3 4 6 7 12 7 1 2 1 2 3 4 3 2 2 6 3 4 1 2 6 2 3 4 3 2 2 6 7 41 7 3 2 2 5 3 3 3 3 2 3 6 5 4 2 1 2 2 5 6 4 2 3 2 2 3 3 4 4 3 2 4 3 5 6 2 3 3 5 4 2 3 3 3 2 9 2 6 3 6 6 3 2 3 4 6 5 2 3 3 3 8 18 4 2 3 2 5 3 3 4 5 3 4 2 3 3 4 2 1 2 2 3 2 2 6 5 2 3 3 3 4 3 3 5 4 11 17 17 17 363 363 363 363 51 51 228 491 289 7 217 70 65 329 329 329 329 169 164 164 164 485 485 485 301 378 378 43 345 109 189 432 330 348 64 76 36 377 377 123 123 8 259 190 380 499 499 428 428 146 146 252 35 131 133 147 147 380 288 288 173 173 280 29 334 59 59 452 263 417 417 417 417 417 237 237 237 435 237 237 80 491 435 435 435 7 7 364 345 152 152 468 468 313 416 416 445 180 443 443 240 325 34 135 135 135 200 200 44 44 44 251 241 81 278 278 26 34 302 497 122 8 32 32 32 354 153 153 153 153 387 387 387 207 207 146 301 393 155 165 165 165 165 53 44 44 94 335 14 411 411 153 387 372 372 396 349 349 352 25 242 242 94 199 255 271 38 342 342 115 273 106 265 265 85 85 146 175 175 81 242 203 217 473 89 340 116 195 195 195 195 195 197 309 309 479 331 84 84 496 173 280 29 469 38 162 54 482 105 336 144 180 496 496 496 274 186 99 436 436 395 423 423 423 423 355 263 263 229 82 247 126 126 326 326 326 326 101 101 149 149 228 412 412 83 194 194 194 322 212 131 451 30 356 281 342 342 221 144 27 351 319 319 319 53 176 135 135 200 248 248 248 479 331 106 426 426 125 348 466 466 22 283 455 236 259 161 161 161 487 288 290 290 290 434 434 339 248 76 108 377 351 494 116 94 479 331 428 428 428 428 299 358 358 24 227 419 439 439 417 417 237 237 28 28 491 28 491 362 491 491 362 362 491 362 491 362 491 362 491 491 362 218 218 40 305 366 491 366 366 366 366 366 491 435 435 316 73 73 289 289 209 188 118 118 118 118 402 221 196 217 473 65 329 329 245 42 147 380 288 134 139 175 175 423 423 423 423 58 110 254 254 254 254 36 478 232 232 68 172 115 273 470 120 120 120 120 24 314 314 472 198 127 45 45 45 45 457 196 217 217 473 65 329 486 486 460 460 169 164 164 485 485 485 485 485 374 132 58 254 254 254 254 314 416 458 144 180 106 426 426 426 413 348 64 76 465 108 377 123 44 236 129 259 190 190 380 499 499 428 85 146 146 143 131 472 133 133 147 147 380 288 288 173 173 280 29 334 59 59 59 313 143 36 377 377 87 87 217 473 65 213 213 213 252 325 34 44 44 44 129 259 445 445 445 351 351 351 486 365 365 360 200 200 200 248 212 192 180 255 495 42 147 380 380 374 374 132 132 132 349 155 155 165 165 165 165 70 65 284 405 206 169 150 162 482 482 482 482 482 238 6 161 487 487 288 288 288 139 139 139 81 337 324 423 423 423 423 423 423 452 263 229 247 312 126 126 292 326 326 326 326 326 326 326 408 408 149 149 228 491 320 7 217 258 258 258 31 54 224 494 494 368 453 142 142 397 147 380 329 329 329 329 252 36 107 107 395 302 302 302 375 375 98 143 401 259 144 389 389 389 389 314 196 309 479 307 307 307 61 61 285 449 202 202 202 130 129 259 354 137 137 137 116 33 250 217 217 70 70 138 138 138 138 138 372 467 467 255 255 38 54 86 238 6 272 106 499 405 426 206 348 199 199 459 469 271 99 447 447 6 6 6 419 439 78 491 305 421 491 421 128 491 193 193 193 17 +103-1240-0034 103 770 1 32 20 38 5 40 4 22 32 5 23 20 31 33 30 19 22 5 25 1 11 5 24 16 14 16 8 37 31 13 22 5 25 40 1 19 33 38 5 40 1 2 12 5 33 1 24 3 30 19 23 5 38 6 40 1 24 15 22 19 26 1 16 5 25 5 37 18 14 1 9 5 33 24 19 31 19 40 30 15 10 5 23 38 5 40 6 23 24 27 31 33 16 6 30 31 33 5 31 5 29 27 40 19 33 1 3 30 39 36 19 25 1 14 25 19 31 33 24 3 30 19 23 5 1 32 20 11 19 24 4 25 11 19 11 1 38 19 25 37 28 31 30 20 33 14 25 11 33 5 18 14 1 39 13 31 5 37 22 6 30 31 1 12 6 2 3 1 3 6 3 2 4 3 5 5 3 2 1 3 3 8 1 4 4 9 4 3 6 10 3 5 2 4 3 5 6 32 4 3 3 3 5 1 14 2 2 5 6 1 2 2 3 2 3 4 4 31 1 2 3 4 2 2 2 7 3 2 2 2 3 8 28 2 4 3 3 2 5 2 5 3 4 4 4 3 3 1 7 2 3 4 2 4 2 5 3 3 5 7 3 4 2 4 6 4 3 10 57 5 4 2 5 2 4 4 8 2 4 5 4 2 2 2 3 4 9 3 7 2 2 2 4 4 2 2 2 1 2 2 1 4 4 6 6 2 2 6 5 3 1 2 2 4 8 24 4 2 4 1 2 5 3 6 12 10 17 17 17 17 296 317 317 317 435 435 184 184 184 373 373 338 400 400 400 30 378 345 141 141 281 453 168 145 145 145 460 460 460 178 96 96 436 447 134 134 134 134 134 359 166 166 166 166 324 186 162 482 482 482 238 6 336 161 487 278 278 178 458 192 192 242 116 116 195 195 394 394 212 401 401 401 401 384 371 180 180 319 319 319 203 53 381 381 381 381 381 381 76 393 155 332 332 332 332 245 349 205 205 261 25 106 265 265 265 265 85 85 85 146 146 173 402 402 66 68 68 115 273 470 151 151 178 458 458 192 242 275 275 379 303 471 471 471 49 433 160 112 427 247 247 312 126 292 292 292 292 292 292 292 292 292 21 21 21 326 21 21 408 408 408 408 149 149 228 228 316 316 73 491 289 289 209 177 177 177 177 131 133 133 141 141 141 141 281 453 342 483 483 226 226 209 287 319 319 319 319 348 348 394 478 478 66 68 68 115 494 494 494 215 129 259 74 74 437 72 72 437 437 496 496 496 496 274 274 368 368 368 9 168 494 134 134 8 100 100 100 100 100 375 375 497 216 198 45 45 45 45 35 196 196 70 65 329 329 329 406 406 467 288 139 175 175 423 423 423 345 141 141 281 342 142 196 217 473 476 476 476 143 458 192 176 135 135 328 200 248 248 393 234 234 234 261 25 319 319 319 348 94 199 223 223 130 402 58 156 156 156 156 59 59 59 452 263 229 247 247 126 126 126 292 326 326 326 326 1 1 1 1 408 408 260 260 391 391 391 391 491 73 73 73 289 491 320 159 159 159 159 159 385 35 196 196 217 473 258 258 258 342 342 224 494 494 494 368 9 142 397 147 147 329 329 329 329 329 329 143 310 107 107 395 302 302 302 497 497 43 345 141 141 141 281 453 168 483 14 226 209 297 297 297 297 297 399 70 65 65 496 169 150 54 238 6 6 472 393 234 261 261 148 148 148 387 372 396 186 186 54 86 238 6 6 472 472 472 482 224 224 494 494 38 162 323 323 224 494 494 129 259 74 437 496 496 496 496 274 274 368 368 9 168 277 277 277 37 24 131 227 419 439 439 439 439 417 237 237 237 28 28 491 491 28 362 491 362 362 362 491 491 491 491 362 362 491 218 362 491 491 218 491 218 218 218 218 218 435 218 366 491 491 305 366 491 366 435 366 491 366 491 366 316 316 491 316 491 316 316 491 73 73 289 289 209 287 430 430 430 430 430 430 219 219 477 477 378 88 109 44 116 116 199 335 14 226 226 226 209 209 411 498 498 498 308 396 313 94 459 459 459 459 271 31 342 86 86 6 272 472 221 196 70 473 329 329 329 406 467 134 134 134 175 175 423 423 423 423 423 263 263 225 225 225 225 225 80 373 373 338 338 400 400 400 30 422 239 384 490 490 399 217 473 365 365 365 365 365 388 64 212 191 191 191 314 133 259 409 409 409 409 33 33 250 32 280 280 153 153 343 387 387 146 358 39 39 86 142 142 397 456 456 456 236 36 108 119 308 308 308 308 308 308 308 388 339 33 394 212 108 123 123 123 123 58 156 156 156 156 59 59 452 263 229 229 247 312 312 126 292 292 292 292 292 1 1 1 1 23 23 23 408 408 408 391 391 316 73 491 289 289 7 357 357 357 271 31 342 168 494 255 402 402 458 208 441 441 153 153 153 387 372 396 396 271 186 39 39 390 390 390 390 390 390 18 18 112 439 439 439 439 237 78 421 128 193 193 17 +103-1240-0035 103 802 1 31 13 11 24 3 30 19 23 5 1 4 40 19 16 17 13 33 19 26 9 28 40 16 14 24 6 30 16 5 25 5 31 8 23 5 24 40 19 25 27 37 5 31 22 27 32 5 38 14 29 3 30 33 5 37 12 20 39 36 41 36 5 23 31 29 30 19 26 38 14 22 6 25 13 25 20 38 13 23 30 13 17 39 5 23 15 33 19 11 4 37 5 25 23 20 16 3 30 24 1 19 25 31 33 13 11 5 37 9 20 19 26 4 25 5 25 18 14 11 5 37 19 25 5 37 15 32 5 25 1 24 19 31 19 40 30 15 10 5 23 16 13 23 33 12 5 33 32 20 18 4 11 30 20 31 20 37 11 5 1 31 5 37 19 30 24 13 25 33 5 23 1 21 27 23 33 1 32 20 34 6 33 19 25 13 22 31 22 23 5 24 15 32 5 25 29 28 25 33 31 1 8 4 2 3 2 2 4 3 3 6 13 5 4 2 4 3 3 2 2 6 3 11 3 4 1 3 5 2 4 2 2 2 5 5 2 2 4 2 2 7 3 2 3 3 4 4 4 4 3 3 4 4 2 2 2 2 2 2 5 6 4 2 2 3 4 4 1 3 8 5 5 4 3 4 4 3 4 5 5 7 3 2 4 2 3 2 3 2 2 3 7 2 2 3 2 5 6 6 3 4 19 5 2 4 3 2 2 2 2 3 3 2 3 2 2 5 4 6 5 3 5 3 2 2 2 3 4 7 2 7 33 4 3 2 3 3 4 3 4 3 2 5 3 4 2 2 1 3 4 4 4 3 6 1 3 6 7 2 3 6 9 8 2 4 6 4 8 2 4 3 3 5 3 5 3 7 8 18 7 2 4 6 4 2 3 2 4 3 2 2 1 3 2 6 3 3 4 7 2 2 5 10 17 17 17 296 296 296 184 184 373 66 172 179 179 179 179 314 196 196 70 65 329 329 495 406 467 288 134 139 139 175 423 423 423 423 263 229 82 247 126 126 326 326 326 326 101 101 101 149 149 228 412 83 253 253 253 453 342 224 118 118 118 118 402 402 221 259 144 445 180 443 240 449 449 176 135 135 200 200 248 248 32 32 354 354 153 153 153 153 387 387 387 85 207 318 185 269 9 142 393 155 165 165 165 165 70 14 14 411 153 387 372 372 349 349 205 352 29 242 116 94 199 255 38 31 342 68 115 273 265 265 85 85 85 175 175 81 203 203 471 471 49 453 168 89 340 116 116 10 10 479 331 84 84 496 274 8 29 459 313 31 162 54 105 105 336 27 496 496 496 496 274 99 99 436 395 423 423 423 43 43 345 347 347 245 245 129 259 74 437 437 306 306 306 206 240 285 449 69 223 130 198 198 283 455 219 219 219 219 219 485 374 374 374 132 132 99 99 161 161 397 134 100 100 100 497 497 186 162 482 142 105 336 336 336 190 380 288 288 360 328 200 200 195 195 248 248 364 364 276 276 109 498 498 498 396 396 178 35 458 192 125 125 125 125 348 199 335 14 411 411 475 475 475 94 475 475 324 324 301 378 43 364 276 109 109 443 443 139 139 139 293 293 497 497 42 42 147 147 380 288 443 443 416 416 458 445 485 134 134 175 175 158 158 158 158 325 449 191 191 191 325 335 14 145 145 486 460 460 173 280 280 242 242 116 379 250 359 81 41 324 324 324 422 349 234 234 261 261 25 106 306 306 306 306 306 306 282 203 203 117 404 229 247 247 126 126 326 326 326 326 326 326 326 326 326 101 408 408 149 228 491 491 412 188 340 340 67 77 478 232 86 68 272 470 470 443 443 240 34 223 223 130 129 259 354 420 420 420 360 135 135 135 200 44 44 44 44 199 335 145 319 319 319 348 348 33 90 72 72 72 72 498 498 498 498 498 396 396 285 285 180 106 284 353 206 206 173 280 280 121 121 116 199 469 469 173 280 418 418 418 418 418 418 99 99 436 436 60 60 298 298 303 303 303 117 404 13 229 491 247 312 126 292 292 292 292 292 292 12 12 12 21 260 305 201 201 201 201 201 201 201 201 201 491 491 316 316 491 316 491 289 289 7 7 473 258 258 258 342 224 494 494 494 281 9 142 397 147 329 329 329 329 329 143 36 107 107 395 302 302 497 497 349 349 234 261 25 180 189 139 139 139 293 167 35 35 198 45 45 45 45 310 338 400 400 400 400 30 30 3 58 110 110 254 254 254 254 254 314 131 133 364 147 456 456 456 38 162 68 68 172 115 444 444 444 444 444 246 246 318 173 402 6 272 34 44 44 44 8 8 401 401 401 197 491 80 491 80 491 80 80 197 66 66 68 172 115 273 494 278 173 8 4 280 485 485 286 286 286 286 468 382 245 245 399 399 217 217 217 217 473 65 432 432 330 348 64 64 465 449 449 302 302 302 497 497 122 129 401 401 401 401 491 310 107 395 395 106 481 424 424 182 182 375 375 122 233 75 227 227 419 419 439 439 439 439 439 237 439 78 78 47 491 47 491 491 316 316 491 491 316 316 73 373 373 373 338 400 400 400 30 422 422 164 164 25 106 106 405 405 405 206 167 449 449 34 340 340 116 94 199 145 154 178 458 96 342 342 224 105 27 386 386 386 386 399 473 418 418 418 418 99 436 436 60 60 298 116 33 250 53 394 76 259 74 441 441 153 387 387 299 299 299 358 243 270 270 433 160 112 427 491 247 247 126 15 15 193 193 193 193 17 +103-1240-0036 103 625 1 24 3 30 19 23 5 4 25 11 24 4 34 39 36 22 5 34 9 14 33 5 37 6 23 29 20 29 5 23 5 11 3 29 33 19 26 5 9 28 1 16 30 5 24 5 25 6 30 16 5 25 5 31 8 23 5 24 1 38 13 23 1 12 5 38 14 23 11 38 5 40 31 14 33 5 25 23 20 33 14 25 19 26 5 29 31 8 11 7 25 1 32 20 38 35 11 9 20 31 5 29 30 8 40 11 4 33 25 5 34 19 26 4 16 33 14 12 19 31 1 25 5 34 19 26 1 17 5 2 7 3 3 4 4 3 3 3 5 4 1 4 6 3 4 3 2 2 2 2 5 4 7 3 3 1 4 2 3 4 2 2 1 3 2 10 21 24 5 1 2 1 2 1 5 3 4 2 1 3 6 6 4 3 8 37 6 3 12 4 2 3 8 6 4 3 2 2 2 9 4 2 1 2 2 3 6 4 1 2 4 2 3 5 4 7 9 7 30 6 2 3 2 1 3 3 3 2 3 4 4 3 3 2 2 6 3 5 2 4 4 2 3 2 3 5 11 27 9 3 7 2 5 25 17 17 17 17 296 296 52 52 52 51 51 51 51 51 184 184 491 320 7 217 70 473 65 65 329 42 42 147 147 147 380 288 134 139 175 175 423 423 423 423 423 335 440 89 89 446 446 212 131 472 196 196 473 65 486 486 460 460 169 169 164 164 485 485 485 132 143 129 401 144 144 27 27 437 151 151 169 164 164 164 401 401 259 29 382 313 285 34 69 223 130 280 106 297 297 297 297 297 293 215 35 35 259 74 74 213 213 213 213 213 252 215 259 29 100 302 175 175 81 255 255 236 384 180 405 405 405 206 215 96 449 135 135 135 200 44 44 44 8 32 32 401 401 401 401 401 354 354 153 153 153 153 153 153 153 387 387 387 207 207 207 207 19 19 454 454 454 229 229 247 312 312 312 126 292 292 292 292 292 12 12 12 12 12 12 260 260 260 260 391 391 391 228 491 373 373 155 165 165 165 165 53 44 44 199 106 106 284 387 372 372 396 349 349 234 261 29 242 116 94 199 255 38 162 232 232 172 115 273 265 265 265 85 146 146 146 175 175 81 459 203 203 203 381 48 404 13 439 78 170 170 170 28 491 187 187 341 2 2 2 491 2 2 362 362 362 362 40 491 366 366 491 366 435 366 366 491 366 491 316 316 316 491 491 435 435 491 289 7 7 364 276 109 109 139 139 139 139 293 293 375 98 98 98 225 225 225 225 225 225 225 465 198 127 5 5 455 43 43 364 276 276 109 109 498 498 498 498 134 134 139 302 293 497 122 122 131 133 345 141 141 141 281 162 232 232 232 232 68 68 115 273 498 498 498 313 240 35 26 26 359 359 166 166 166 422 143 36 108 108 119 308 308 308 308 308 313 94 176 135 200 200 200 230 230 230 215 35 478 232 68 68 273 273 265 428 146 146 416 416 401 401 259 371 180 315 315 315 315 315 315 450 450 450 413 413 303 117 48 404 229 229 491 312 312 126 126 292 292 292 292 292 292 292 292 292 1 21 21 21 21 408 408 408 408 408 391 391 391 228 491 373 373 338 400 400 400 400 378 378 345 389 389 389 314 8 354 420 420 420 422 342 342 224 494 494 129 129 74 190 487 499 499 265 85 85 146 368 453 238 6 272 34 494 236 314 196 196 309 309 309 479 331 231 231 231 231 349 164 164 214 214 214 328 200 200 464 145 460 460 460 169 402 96 272 300 382 313 216 216 114 258 258 258 271 271 39 433 433 433 390 160 18 112 427 56 56 170 312 312 312 187 187 292 12 12 12 12 12 12 12 12 12 408 163 163 163 491 316 491 316 491 491 289 289 289 7 7 309 309 309 479 331 231 231 231 231 169 164 164 164 214 214 214 214 328 328 200 303 117 404 404 439 439 439 439 439 237 237 237 421 421 421 421 491 421 128 491 128 128 128 128 193 193 17 +103-1240-0037 103 740 1 18 38 5 33 3 25 1 14 34 29 35 33 31 5 10 5 25 27 32 5 25 19 25 33 5 39 6 30 18 13 11 1 32 20 11 19 24 4 25 11 19 11 19 31 5 29 30 36 37 19 26 23 20 1 12 19 31 18 4 11 9 19 25 11 5 25 38 19 12 7 33 18 14 5 11 37 8 31 9 20 19 26 4 31 22 33 1 4 25 11 24 5 31 33 29 14 16 6 30 31 9 20 11 19 31 5 29 30 36 37 11 1 38 13 23 38 20 37 9 19 25 34 19 26 22 19 26 5 9 7 33 19 33 16 14 31 5 24 33 8 24 1 6 23 38 19 25 33 14 19 25 16 4 22 33 1 30 19 33 14 25 11 24 3 30 19 23 5 1 25 2 2 1 3 4 4 3 9 4 2 3 2 2 3 3 2 6 3 5 2 2 1 2 3 2 2 3 3 6 3 9 3 7 2 3 2 4 6 2 2 2 5 2 4 2 4 3 2 2 3 4 2 6 39 2 4 5 5 1 3 2 3 4 4 4 5 3 2 2 6 3 4 3 2 2 4 6 5 2 4 2 4 6 5 2 6 10 9 3 4 3 4 3 3 5 4 5 3 5 5 3 3 3 2 3 2 3 2 5 5 5 66 3 10 4 3 3 3 3 3 3 4 1 3 3 2 3 2 3 5 3 2 3 2 2 5 3 4 5 8 9 11 5 5 3 2 2 4 2 2 4 4 6 4 5 5 3 2 5 5 2 2 2 2 2 4 3 6 11 17 17 17 296 211 317 317 317 317 52 52 52 52 52 52 52 52 51 51 51 51 184 184 184 491 320 320 181 181 181 285 449 34 125 125 125 348 348 457 14 226 226 226 226 209 411 498 498 498 498 498 169 169 164 164 472 221 259 354 181 181 236 35 478 54 224 344 344 344 36 449 44 44 44 10 10 10 479 331 84 496 496 274 99 99 436 60 60 298 116 94 199 340 340 116 76 377 123 123 123 219 477 222 222 222 372 372 245 58 72 72 110 110 120 120 120 120 37 24 24 131 404 439 225 225 225 225 80 80 80 373 373 338 400 400 400 400 422 143 384 490 490 490 399 217 473 365 365 365 365 365 365 330 388 212 384 191 191 191 314 401 401 75 384 490 490 31 342 342 224 494 494 129 259 74 190 487 487 374 374 374 173 173 176 176 135 200 200 248 359 359 474 474 474 474 19 454 229 229 491 247 312 312 126 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 260 408 408 408 408 391 391 491 316 73 73 73 73 491 127 127 258 258 258 258 31 342 342 342 97 72 72 110 254 254 254 254 314 35 259 137 137 137 137 137 33 33 394 32 465 384 180 180 319 319 319 348 195 195 250 250 364 333 333 220 220 216 114 180 113 113 113 113 167 167 131 449 183 156 156 156 156 406 467 255 255 236 314 90 4 280 280 265 265 265 85 146 146 186 39 342 142 221 336 354 420 420 360 360 135 135 200 200 464 145 376 376 376 376 460 169 150 150 342 86 105 6 96 96 227 419 419 439 78 47 47 47 47 491 491 80 80 289 289 209 83 194 194 194 194 194 194 282 388 195 195 131 472 472 196 217 70 65 65 319 169 150 150 86 238 6 472 221 336 74 190 492 492 492 492 245 349 205 205 261 25 148 148 148 372 372 396 396 271 186 39 86 86 142 221 336 354 420 420 420 422 143 36 371 490 490 31 9 142 221 336 336 74 190 487 487 288 374 374 374 132 132 132 173 173 96 6 227 419 439 439 78 170 305 170 28 28 491 28 491 28 28 28 491 362 362 362 362 362 362 491 362 362 362 491 362 362 305 305 218 218 491 218 218 218 491 218 218 218 218 435 435 211 211 369 21 21 21 21 21 21 21 21 23 23 260 260 260 260 391 391 391 491 73 73 289 289 320 320 109 109 84 84 139 139 139 139 139 16 16 293 293 293 43 364 345 152 152 152 152 422 402 221 221 354 137 137 137 137 33 394 76 465 164 214 214 214 360 360 76 458 192 176 176 135 200 200 464 255 255 8 354 180 113 113 113 113 206 240 285 34 277 277 457 173 155 155 332 332 38 162 232 68 115 273 231 231 231 231 53 53 90 76 108 119 103 103 103 103 103 103 103 85 299 299 203 381 381 117 404 263 439 439 417 417 237 237 47 491 80 80 80 80 435 435 209 287 297 297 297 297 293 293 293 43 364 109 109 278 278 348 64 465 449 300 382 495 467 467 242 116 33 394 393 205 261 25 470 376 376 376 376 460 178 178 233 96 96 227 419 419 439 225 80 80 80 80 80 320 456 456 456 456 236 108 119 308 308 308 308 308 179 313 64 212 472 196 217 473 65 329 495 406 467 134 134 139 175 175 423 423 423 423 263 13 229 229 491 312 15 15 15 193 193 193 193 17 +103-1240-0038 103 357 1 24 19 31 19 40 4 23 19 17 40 4 25 11 14 31 29 13 25 31 14 38 5 40 5 29 18 20 30 38 5 25 11 15 9 19 16 6 30 22 30 19 31 24 5 31 5 25 11 32 20 31 13 11 32 20 38 5 40 17 27 19 26 33 19 17 13 33 15 23 19 33 5 23 17 14 23 16 14 24 12 20 5 31 8 23 5 24 27 37 14 19 25 1 2 19 25 12 5 31 29 30 19 26 1 14 4 2 3 2 3 4 2 3 3 3 4 2 2 3 5 2 3 4 3 4 3 1 4 3 3 2 2 4 4 2 3 2 5 2 3 4 2 3 4 2 2 6 3 3 5 3 1 3 5 5 5 3 3 4 3 2 2 2 4 2 3 2 2 2 3 4 1 3 4 1 2 2 3 5 5 7 3 2 3 1 2 2 6 5 4 2 4 3 4 2 2 2 2 17 5 2 2 1 5 4 2 2 8 12 17 17 17 363 363 363 363 363 408 51 149 228 491 491 320 7 473 258 258 258 31 342 224 494 494 368 453 168 180 145 329 329 175 175 81 81 469 416 416 96 453 168 470 365 365 365 330 348 212 300 300 382 313 186 162 232 232 105 105 336 470 432 432 330 330 64 64 77 449 224 300 156 382 245 43 43 345 141 141 281 453 342 168 230 230 230 215 35 74 183 485 286 286 382 245 245 43 364 276 174 174 174 348 348 64 64 212 93 93 93 93 93 301 8 8 255 255 349 349 155 155 148 148 372 372 245 245 458 458 208 190 487 487 278 258 31 342 342 86 105 196 217 473 459 459 271 271 39 433 433 160 168 89 55 322 67 394 76 310 338 338 400 400 400 400 30 324 422 186 162 68 68 115 470 470 120 240 240 314 310 338 400 400 400 400 301 378 345 141 141 281 281 9 221 336 144 106 496 88 319 146 135 339 76 36 377 87 87 416 259 445 180 443 443 240 325 34 44 44 44 251 251 241 431 278 26 302 302 497 497 122 32 401 82 144 498 498 498 498 498 139 302 293 497 497 497 122 393 155 155 165 165 165 165 466 466 448 448 464 255 38 38 162 68 115 273 273 265 265 85 85 146 146 175 81 81 242 203 399 70 65 410 410 410 410 173 280 29 29 406 467 89 446 67 58 72 72 72 496 496 496 215 215 35 96 96 272 449 242 275 275 275 303 195 199 335 188 188 340 340 466 22 283 455 38 162 232 105 105 336 491 336 190 380 288 288 288 328 328 200 303 303 117 48 78 491 491 491 491 421 421 491 201 193 193 193 193 +103-1240-0039 103 721 1 31 27 24 4 34 39 36 5 25 11 8 18 4 37 33 6 22 33 19 33 27 37 14 6 16 5 25 11 6 25 13 37 14 31 19 25 31 1 38 20 34 6 33 38 20 11 17 13 33 5 9 28 1 24 4 34 39 36 19 40 17 19 33 19 26 5 29 19 25 39 14 40 39 36 25 27 1 18 20 40 31 19 22 31 33 20 1 4 25 11 18 20 19 40 5 25 31 27 31 29 30 8 13 40 18 20 38 5 25 31 38 3 40 1 18 19 40 18 3 30 33 30 5 9 5 23 40 18 19 24 5 17 35 11 20 23 1 4 25 11 39 36 25 27 18 7 11 13 31 29 30 19 33 18 3 30 11 19 33 31 17 3 33 19 9 20 33 19 17 13 33 18 8 14 11 18 13 23 29 1 9 9 5 3 6 3 2 4 1 2 2 7 2 2 2 5 3 3 2 2 2 7 3 6 6 4 3 1 2 7 5 4 3 3 5 3 6 7 19 3 3 3 5 2 2 2 2 3 2 2 2 4 10 24 5 5 3 2 2 2 3 3 2 2 2 5 3 4 1 4 6 7 3 3 2 3 10 4 6 2 3 5 2 4 4 3 7 1 6 1 2 1 5 2 4 1 3 5 4 5 3 2 7 3 3 2 3 4 2 3 4 5 7 7 17 4 2 3 3 4 4 6 2 3 2 2 2 3 2 2 3 2 4 2 7 7 6 19 5 2 1 4 1 5 5 4 5 7 3 5 2 2 1 2 4 3 3 3 2 2 3 3 4 5 2 3 5 2 1 3 3 2 5 5 4 2 3 3 5 5 15 17 17 17 363 363 51 51 491 184 373 373 66 232 68 172 115 273 84 84 16 16 274 274 399 70 473 65 329 329 460 169 169 164 164 164 485 485 485 374 88 89 89 446 212 131 106 111 111 111 111 85 438 58 110 110 202 202 202 402 221 36 108 119 437 405 405 206 178 35 96 96 272 277 191 325 34 180 410 410 410 410 410 410 173 280 29 334 382 59 59 245 335 14 287 284 405 405 206 169 349 352 25 242 242 242 116 94 199 106 426 426 426 426 282 282 388 195 117 335 335 440 145 463 463 463 463 29 382 313 186 162 342 172 115 273 432 432 330 379 379 243 243 243 77 433 433 433 160 112 56 247 247 312 126 292 292 292 292 1 326 326 326 326 101 101 149 149 228 491 491 320 345 152 152 422 422 164 164 106 106 405 405 206 167 35 35 397 152 152 152 314 90 458 445 180 443 443 240 285 44 44 8 259 354 153 153 153 153 387 387 207 207 19 454 417 417 417 417 417 237 237 47 491 47 2 491 2 491 491 2 316 316 316 491 316 316 73 491 289 491 7 217 217 473 329 329 329 329 329 329 164 485 485 485 485 374 141 281 281 9 221 336 445 180 443 240 325 449 176 135 135 200 200 180 230 230 230 230 215 35 192 340 340 340 116 33 33 219 219 219 219 286 286 286 286 334 304 304 304 185 49 323 219 219 152 152 152 236 94 331 84 84 84 84 84 16 274 98 263 13 417 417 417 417 435 225 373 451 451 451 30 30 422 186 162 232 232 68 68 115 273 278 278 178 143 96 96 86 86 86 238 272 41 41 41 41 19 19 454 454 225 225 225 83 83 55 55 55 322 212 34 30 30 30 324 356 356 356 356 281 453 342 242 242 379 379 478 478 68 172 344 344 344 344 344 186 162 54 482 142 105 336 336 190 499 499 499 499 85 85 146 146 464 253 253 253 368 342 342 451 30 30 301 378 43 276 174 174 319 319 348 379 77 77 9 142 397 336 276 276 346 346 346 387 355 355 355 37 185 185 269 433 433 112 427 82 247 312 126 292 292 326 326 326 326 326 326 326 326 101 101 149 149 228 491 451 257 257 257 31 342 142 72 72 437 306 306 306 306 306 396 167 167 457 32 401 259 161 161 487 499 151 481 215 215 29 302 497 497 71 71 342 342 57 57 57 57 203 53 44 44 44 416 239 458 484 484 484 484 314 32 32 259 384 371 213 213 213 286 286 139 139 302 375 375 98 98 13 417 229 491 247 126 126 126 292 326 326 326 408 408 408 149 149 228 491 289 491 83 55 55 55 322 67 212 219 219 152 152 152 236 10 309 331 331 84 84 16 274 88 58 72 268 268 268 268 268 268 274 32 32 401 401 401 384 371 443 443 443 150 150 86 105 105 336 29 29 288 313 285 131 72 72 437 306 306 306 306 306 396 396 24 325 34 177 177 143 77 342 142 221 336 144 180 405 405 206 167 167 35 36 377 377 87 87 8 354 420 420 420 246 246 252 325 87 87 416 458 445 180 443 443 240 325 58 72 72 72 437 265 265 85 85 468 468 468 396 313 24 131 58 72 110 351 139 139 139 139 293 375 375 233 233 233 419 229 491 247 312 15 15 15 15 15 15 193 193 193 193 193 17 +103-1240-0040 103 733 1 12 13 30 40 25 13 37 14 1 13 25 20 9 5 11 20 33 5 9 20 18 4 11 9 5 33 12 27 40 31 33 36 29 19 11 18 4 16 17 30 27 25 23 19 33 5 23 16 30 13 25 10 9 28 40 1 4 25 11 13 40 31 36 25 13 40 39 36 11 36 17 19 33 18 38 5 25 9 30 27 22 19 25 33 36 39 35 30 38 15 40 5 25 11 33 6 33 31 5 24 34 19 26 1 18 20 40 5 29 5 25 11 6 16 33 5 12 5 23 3 9 31 33 14 22 4 25 14 20 40 14 12 5 31 33 15 33 31 1 4 33 16 14 31 33 24 4 34 39 36 31 5 17 21 13 31 33 19 11 17 19 33 19 26 5 18 27 24 9 28 1 9 5 33 8 31 13 11 25 27 16 23 4 33 5 12 4 33 1 17 3 1 3 3 3 3 2 9 1 4 4 3 2 3 2 3 3 2 2 4 6 5 2 2 2 2 3 3 3 6 3 4 3 4 3 6 5 6 2 2 4 2 2 2 2 2 2 6 2 1 4 5 3 9 6 18 5 1 2 2 3 5 3 3 3 5 2 2 4 5 3 4 2 3 3 2 4 3 2 4 3 2 2 3 1 2 3 3 4 7 3 2 2 1 4 4 5 3 2 4 3 2 6 10 4 3 4 6 5 3 1 3 6 3 3 2 2 2 4 2 4 2 3 2 5 4 3 4 4 5 4 3 2 4 3 6 4 9 14 4 2 5 7 4 3 5 4 4 2 3 4 2 1 4 3 3 3 2 2 3 2 2 2 4 2 5 7 2 3 12 22 3 2 2 6 6 2 3 5 8 5 3 3 4 2 3 7 8 15 17 17 17 296 296 363 52 52 52 52 52 51 51 51 51 184 491 491 412 0 0 222 356 356 281 9 196 196 479 331 463 463 463 463 29 29 382 245 335 14 14 226 226 226 226 209 209 475 475 475 475 475 475 475 324 301 8 354 180 151 240 240 325 41 324 324 422 36 377 87 87 354 420 420 420 324 3 58 72 72 110 110 486 486 486 460 282 37 24 35 259 159 159 159 236 35 198 127 114 84 496 496 274 186 162 482 482 482 482 482 238 6 272 371 485 374 374 374 8 354 29 191 191 191 37 24 131 472 225 72 72 72 110 110 486 486 460 460 460 169 352 352 402 221 401 336 79 79 288 84 496 496 413 348 250 250 81 278 278 285 285 302 302 497 497 349 234 234 234 261 190 380 288 288 330 64 64 76 310 107 447 447 221 336 354 153 153 153 153 387 387 304 304 185 185 269 433 160 112 427 491 247 312 126 292 292 292 292 292 326 326 326 408 408 408 149 149 228 491 412 83 55 55 55 322 212 34 34 253 253 31 162 482 482 115 485 485 374 374 374 339 94 199 253 253 253 253 453 9 219 219 152 152 152 301 236 239 384 371 371 374 374 132 132 416 416 445 445 180 443 240 385 131 133 133 364 276 174 174 174 319 348 33 250 394 212 465 190 380 380 496 496 274 143 458 192 192 340 340 33 394 108 377 123 123 219 222 222 222 222 245 245 43 43 276 109 109 403 403 403 207 318 318 318 49 342 168 89 89 116 33 76 108 119 437 437 405 405 405 206 167 167 457 35 77 68 342 273 231 231 231 203 53 76 198 164 214 214 214 328 200 200 117 229 229 247 126 126 326 326 408 408 391 228 491 491 373 451 30 30 356 356 368 453 168 180 230 230 230 230 230 215 35 35 35 401 89 89 89 446 67 212 131 106 106 284 405 405 206 169 349 402 402 6 272 123 123 216 216 22 283 455 251 241 431 405 405 405 215 215 169 270 86 238 6 300 382 382 245 458 445 445 351 351 365 365 365 365 388 94 199 495 495 406 337 41 41 318 318 49 9 168 157 157 157 467 313 313 216 22 22 283 38 162 232 232 238 6 272 470 470 171 171 171 358 358 358 233 270 270 433 433 433 160 18 112 439 439 439 439 237 237 237 237 237 237 237 237 80 80 491 435 435 412 83 415 415 415 131 393 234 261 261 25 498 498 498 498 498 396 186 39 54 86 238 6 472 472 196 217 217 473 65 486 486 460 460 169 164 164 485 485 485 152 152 422 162 323 224 224 494 494 236 36 310 395 470 470 151 151 150 39 86 342 272 191 191 191 314 90 401 259 445 180 443 240 325 176 135 200 200 199 44 44 44 58 72 72 72 350 350 350 350 350 413 413 53 250 250 212 354 354 153 153 153 387 387 387 207 207 19 454 229 82 247 126 126 126 126 326 326 326 326 326 326 326 326 326 101 408 408 149 391 491 289 289 289 320 159 159 159 240 285 111 111 111 111 438 438 186 162 342 68 273 470 120 240 240 314 196 196 309 479 331 331 84 84 84 16 16 274 274 349 349 234 234 261 425 386 431 376 376 460 167 167 36 108 377 123 123 216 127 114 92 92 92 92 92 92 282 385 385 233 227 419 439 417 417 237 237 237 421 491 421 421 491 491 128 491 128 193 193 17 +103-1240-0041 103 675 1 12 15 24 15 9 20 6 23 30 8 33 8 24 25 3 33 31 15 19 26 12 13 30 25 3 33 1 9 5 33 25 27 23 5 25 11 5 25 31 33 30 20 33 4 30 5 9 40 16 14 24 20 1 8 31 13 11 1 17 19 37 24 20 5 25 15 33 19 37 9 6 30 25 4 33 23 20 31 33 1 12 13 30 5 23 9 20 5 30 19 31 22 25 27 24 4 33 14 18 36 38 20 17 13 33 1 9 5 33 8 23 16 20 23 1 20 40 20 14 19 25 24 8 24 8 25 11 5 25 11 31 23 20 29 31 7 25 11 14 4 33 25 8 33 31 19 16 38 20 17 13 33 5 9 6 30 25 22 5 25 15 11 20 5 25 1 17 3 4 3 5 2 4 6 4 4 10 3 3 2 3 5 3 5 5 2 2 2 2 4 4 9 7 8 2 3 3 4 5 6 2 3 2 2 3 4 3 2 2 3 5 5 2 2 5 2 3 4 10 4 8 6 4 6 19 3 3 2 4 4 2 6 5 2 2 3 3 4 2 2 2 3 4 6 6 6 19 2 2 1 2 1 3 3 5 5 5 4 4 3 3 4 2 3 2 5 3 2 4 4 5 6 22 3 1 3 4 2 5 4 3 1 9 4 2 4 3 2 3 5 5 9 3 2 1 2 3 4 2 4 3 6 5 3 2 3 2 3 2 6 4 2 2 2 2 2 3 2 2 1 5 4 3 2 4 2 2 6 2 4 1 5 22 17 17 17 296 211 211 52 52 52 363 363 363 408 51 51 228 491 491 320 114 0 0 0 301 399 473 65 476 476 476 171 252 8 420 420 420 324 464 106 297 297 297 297 297 293 293 42 42 42 147 380 499 499 499 428 428 85 85 85 207 207 358 24 34 34 111 111 319 203 53 10 479 307 307 307 307 61 167 167 478 478 68 68 172 115 470 403 403 403 403 135 135 135 200 248 212 127 114 222 222 468 313 313 10 10 479 331 307 307 307 307 426 426 206 206 206 385 24 227 419 419 439 439 225 225 225 225 225 80 80 289 320 159 159 159 159 236 35 196 196 479 331 231 231 231 16 274 274 274 251 251 241 431 431 319 319 348 64 64 212 34 242 242 116 394 478 162 482 482 238 6 161 487 487 213 213 252 252 335 14 411 145 145 486 486 468 468 467 467 467 134 215 8 270 270 86 9 142 393 155 332 332 332 245 399 217 429 429 429 429 246 246 246 19 19 454 454 225 225 417 417 80 80 412 287 111 111 111 438 438 186 162 342 68 115 273 470 120 120 120 37 24 24 404 427 229 491 247 312 126 292 292 292 326 326 326 408 408 408 391 228 228 289 289 289 320 209 445 278 278 278 314 314 196 217 429 429 429 429 464 464 44 44 44 10 10 10 309 479 331 171 171 171 252 325 34 494 173 402 402 221 259 354 354 153 153 153 387 372 396 285 415 415 415 415 457 26 251 241 431 444 444 213 213 246 358 358 39 433 433 86 86 6 6 227 419 439 417 417 237 237 237 237 491 491 491 47 47 491 491 491 316 316 316 73 73 80 435 412 114 0 139 139 139 293 293 8 420 420 420 420 464 44 44 44 44 42 42 147 147 380 288 278 278 278 271 271 39 342 86 105 105 144 472 196 196 331 331 231 231 274 399 217 473 65 486 460 240 285 300 382 245 58 72 72 489 489 374 132 132 8 152 152 152 152 324 416 458 445 445 180 120 120 120 37 385 233 227 419 427 229 491 247 312 126 292 292 292 292 292 326 23 23 326 326 326 101 101 101 149 149 228 491 289 320 159 159 285 285 106 111 111 284 481 293 169 349 205 205 25 485 485 485 139 139 293 497 335 14 411 411 213 213 213 213 213 318 368 368 453 168 41 324 485 382 406 467 467 340 340 340 116 33 250 70 46 46 46 46 438 438 399 217 70 65 480 480 480 480 480 480 85 299 299 299 299 339 64 212 89 89 322 116 394 478 478 232 232 68 26 26 81 444 213 252 215 129 401 478 232 68 68 115 273 470 315 315 315 450 450 413 64 64 131 300 382 382 467 415 415 236 35 196 196 479 331 265 428 428 85 146 358 233 270 342 224 118 118 118 118 402 345 152 152 152 458 445 180 443 443 285 34 44 44 8 32 259 354 153 153 153 372 372 467 467 299 394 76 465 445 351 351 116 94 199 331 171 171 171 171 252 325 34 324 324 464 275 275 275 303 48 48 417 417 417 491 237 237 237 491 421 421 421 491 128 128 491 128 491 305 128 128 193 193 17 +103-1240-0042 103 780 1 31 27 19 25 12 20 13 25 11 38 20 11 19 31 8 11 19 11 33 36 4 31 22 24 19 31 19 40 31 29 13 25 31 14 33 19 29 19 22 5 31 7 33 38 5 25 38 13 25 32 20 38 13 25 33 27 37 14 33 19 17 13 33 18 14 23 19 33 5 23 17 14 23 1 38 20 18 14 11 23 4 31 33 38 20 22 32 20 38 5 40 17 27 19 26 1 31 27 38 20 31 13 25 33 18 14 38 14 11 9 8 30 19 10 14 11 31 29 13 25 31 14 40 16 27 22 31 4 33 22 3 30 24 5 11 20 33 19 9 30 19 26 5 31 5 31 24 3 30 33 1 23 8 22 23 20 9 28 5 37 5 9 7 33 13 25 14 19 23 13 37 5 25 1 38 20 11 19 31 8 11 19 11 12 4 33 38 35 11 9 20 12 5 9 13 31 33 15 21 1 23 7 4 3 3 3 5 3 3 3 2 3 3 2 6 6 2 4 1 3 4 6 5 3 2 2 4 2 2 3 3 3 3 5 4 3 2 3 3 3 4 3 7 4 5 3 5 2 2 3 4 3 3 3 1 4 4 3 2 3 2 3 3 2 4 3 3 2 2 3 1 3 7 6 31 4 3 3 5 3 3 4 4 3 2 4 3 4 2 3 2 3 4 4 4 9 12 7 3 3 3 6 2 2 2 5 4 7 4 3 3 6 2 3 4 2 4 2 2 3 4 4 3 3 4 6 3 2 2 2 5 2 3 3 1 3 4 3 2 3 1 2 4 1 4 3 6 3 4 3 3 4 5 5 5 4 2 4 11 1 3 3 2 9 10 2 3 3 3 4 3 3 2 6 27 4 2 2 3 5 7 2 4 3 3 2 4 1 2 2 3 4 1 2 3 5 6 3 5 8 7 17 17 17 296 305 317 317 491 317 491 317 461 491 461 461 435 435 491 435 435 491 491 435 289 373 66 68 115 273 273 84 16 88 88 109 340 340 340 466 466 22 283 448 448 448 464 464 432 432 432 330 330 388 195 64 131 133 345 152 152 152 422 314 239 371 490 490 38 342 68 115 273 106 265 265 265 85 146 146 325 34 191 191 191 37 314 36 377 87 87 87 14 14 145 145 376 376 460 460 150 150 342 105 221 336 96 196 217 473 258 258 31 342 224 494 494 494 31 162 232 86 105 336 354 470 432 432 330 379 64 77 77 224 224 300 334 334 59 313 313 36 377 87 87 87 129 74 74 351 278 416 416 144 180 180 151 240 368 453 342 168 180 113 113 113 113 450 167 35 131 133 133 364 364 276 174 174 174 174 348 348 195 195 250 250 345 409 409 409 116 64 76 310 338 400 400 30 301 378 43 345 109 109 330 330 64 76 449 449 180 410 410 410 410 8 29 29 382 313 236 36 377 87 87 416 458 445 180 443 240 385 131 58 156 156 156 156 313 313 251 251 81 431 278 285 26 302 302 497 497 416 458 144 498 498 498 498 498 134 302 375 375 98 98 13 229 229 491 312 312 126 292 292 292 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 101 101 101 101 149 149 228 491 491 320 152 152 152 422 58 58 72 498 498 498 498 396 313 314 35 26 241 241 376 376 376 460 169 150 86 86 6 272 472 397 354 109 213 213 213 358 143 458 96 99 338 400 400 400 301 378 8 141 141 281 281 9 221 221 144 180 84 84 496 88 88 176 176 176 328 328 200 117 117 454 454 439 78 491 491 312 126 126 326 326 326 101 408 408 149 228 491 373 66 66 115 273 84 84 16 43 43 345 152 152 152 422 162 68 68 115 273 273 432 330 330 64 131 131 183 156 156 156 156 156 156 245 43 43 364 276 276 109 498 498 498 59 396 313 24 131 472 259 354 62 62 62 62 438 438 42 147 380 288 329 329 36 107 395 300 382 313 314 478 478 478 172 105 336 470 432 432 330 330 33 394 77 54 107 395 382 382 313 186 31 54 142 393 336 25 25 496 496 496 496 274 215 233 270 270 342 224 415 415 325 472 458 144 27 437 437 306 306 306 396 396 53 53 469 469 24 325 41 41 41 324 422 36 108 377 87 87 8 239 190 380 288 360 360 200 200 464 459 271 31 342 224 44 44 38 162 232 232 482 105 105 196 70 65 65 306 306 306 396 396 385 131 472 225 225 225 225 225 225 7 251 241 431 266 266 266 266 146 178 35 35 401 26 359 359 166 166 324 301 8 129 354 354 153 153 153 153 387 387 387 207 464 464 464 69 130 130 280 255 255 236 8 354 180 113 113 113 113 113 450 167 167 457 401 401 401 75 108 119 351 351 351 432 330 388 199 199 495 495 406 467 134 302 251 251 241 431 443 443 443 173 280 29 275 275 275 303 303 303 48 13 229 491 491 312 312 312 292 292 292 292 292 21 21 21 21 21 21 21 21 21 408 408 149 149 149 491 491 491 320 152 152 152 422 143 384 490 490 490 31 342 68 115 273 470 265 265 428 85 146 146 325 325 191 191 191 191 314 314 198 127 114 114 92 92 92 167 457 364 345 389 389 314 129 259 354 420 420 420 301 216 22 283 455 236 259 354 180 443 443 443 169 150 150 39 342 86 238 272 371 470 93 171 171 171 358 358 233 310 107 107 112 439 417 417 237 237 128 193 193 193 +103-1240-0043 103 737 1 27 23 11 19 25 5 16 33 19 9 20 5 37 31 5 24 39 36 31 19 25 11 36 19 26 10 6 30 40 30 8 33 6 16 1 5 25 11 39 5 26 19 25 5 16 33 5 9 20 33 30 15 25 11 5 29 30 3 29 14 1 38 20 24 20 25 33 19 17 19 37 19 24 5 17 35 11 18 27 24 4 25 11 31 22 36 23 19 26 1 38 20 18 4 11 5 33 13 23 5 17 30 4 24 16 14 24 19 31 19 40 4 23 19 17 40 4 25 11 14 31 29 13 25 31 14 33 5 11 15 1 12 5 24 15 23 24 4 25 9 30 6 33 19 33 16 14 24 12 5 31 33 15 32 5 25 1 31 15 19 26 12 15 38 14 22 5 24 19 26 3 25 12 5 16 8 37 34 14 11 20 33 30 15 25 33 5 25 8 33 1 7 6 5 2 2 3 4 3 3 1 4 6 2 3 6 4 4 5 5 5 2 2 3 4 3 4 6 7 5 7 3 5 3 9 9 2 6 1 2 4 4 3 1 3 2 3 2 2 1 4 5 3 4 2 3 5 7 2 3 4 8 27 3 3 4 3 3 2 2 3 1 2 2 3 3 5 2 2 5 6 5 4 2 3 5 2 6 2 2 6 11 5 2 3 2 2 2 6 2 3 3 1 3 5 4 3 2 3 3 3 3 3 3 3 2 2 3 4 2 2 3 4 3 1 5 3 3 3 2 2 13 18 3 2 4 5 4 3 4 3 4 2 4 3 3 2 3 2 2 2 2 3 3 4 6 2 5 12 7 7 1 5 2 4 3 3 6 3 3 2 4 3 2 2 2 6 7 2 6 3 2 4 6 3 5 2 3 2 3 9 6 6 17 17 296 296 296 184 184 412 209 287 424 424 424 424 424 274 274 122 285 34 34 242 116 479 331 230 230 230 169 349 402 96 36 377 87 87 87 129 354 420 420 420 420 246 3 464 223 223 130 402 478 232 232 232 172 115 273 231 231 231 231 203 53 53 219 219 219 219 219 485 374 374 132 132 186 39 54 342 224 89 340 116 33 394 212 384 371 374 374 88 88 176 176 135 200 200 248 76 465 310 107 395 395 441 441 153 153 153 182 372 372 372 372 304 304 185 185 269 269 9 142 97 397 336 147 380 499 499 428 85 146 146 325 34 106 106 106 426 426 426 426 206 169 169 352 352 352 352 352 352 97 97 225 225 225 83 55 55 55 322 67 64 212 219 219 219 464 180 180 319 319 348 200 464 242 116 94 331 230 169 169 402 402 6 377 87 87 420 420 420 422 422 129 310 161 161 487 487 288 288 290 290 434 434 339 64 212 131 180 230 230 230 167 167 457 401 401 491 190 190 190 488 488 488 405 206 215 215 35 29 334 334 59 59 452 452 263 229 491 247 312 126 292 292 292 1 1 1 1 21 21 21 21 21 21 21 260 260 260 260 391 391 391 491 491 320 345 152 152 152 301 399 217 473 360 360 360 434 339 64 64 108 377 87 87 416 445 485 278 173 280 57 57 57 53 473 44 44 44 416 129 259 144 484 484 484 285 131 58 72 72 72 437 350 350 350 350 350 413 203 381 335 335 14 440 145 194 446 446 33 394 478 478 482 482 482 482 105 336 208 441 153 153 153 182 182 175 81 176 176 328 328 303 117 48 417 417 417 417 237 237 237 491 47 80 491 80 491 7 7 152 152 152 58 58 110 110 254 254 240 34 44 44 236 36 108 119 119 351 486 139 175 175 81 81 469 416 8 79 380 288 288 365 365 282 203 203 53 394 393 155 155 332 332 165 399 217 473 258 258 258 31 342 224 494 494 368 453 168 168 145 329 329 329 175 81 81 469 416 416 453 453 470 365 365 365 365 388 64 212 300 382 382 313 186 54 54 105 336 354 470 432 330 379 379 77 77 54 224 300 334 313 236 36 377 377 87 236 236 93 93 93 93 93 93 207 207 207 207 19 454 229 247 247 126 126 126 326 326 326 326 326 326 326 326 101 101 149 149 491 289 491 127 5 5 455 399 217 473 65 290 290 171 139 139 139 293 293 399 217 65 136 136 136 136 282 388 33 394 32 259 354 190 380 499 405 405 206 206 285 449 34 277 277 24 314 393 155 155 165 165 165 165 466 22 22 283 38 162 342 238 6 272 470 470 171 171 171 358 99 436 436 60 60 298 298 303 303 117 48 229 491 247 126 126 326 326 326 408 408 408 149 228 491 373 66 68 68 68 273 470 403 403 403 403 207 135 135 135 200 200 248 212 127 0 0 0 0 378 378 347 347 347 347 245 143 458 144 27 437 437 319 319 319 53 53 176 176 135 328 200 200 199 125 125 125 125 348 466 283 455 38 349 234 234 261 25 346 265 265 85 85 146 146 438 349 349 234 234 261 164 273 498 498 498 313 285 34 41 324 324 422 143 259 161 161 161 487 487 288 290 290 290 434 434 434 339 394 36 377 377 87 236 10 479 331 331 428 428 428 428 207 207 358 358 233 465 227 419 439 78 421 491 491 193 193 17 +103-1240-0044 103 819 1 31 27 24 4 34 39 36 38 13 25 33 5 9 30 8 33 30 19 37 14 33 5 24 20 33 18 19 24 1 24 19 31 19 40 31 29 13 25 31 14 38 5 23 11 30 3 29 19 24 6 16 12 13 30 1 5 37 22 6 30 31 1 32 20 17 27 40 3 25 33 5 38 8 33 31 4 25 11 40 31 33 15 32 5 25 18 14 31 13 23 16 1 24 19 31 19 40 30 15 10 5 23 29 30 8 11 19 11 18 14 31 13 23 16 3 25 6 23 38 20 40 31 29 20 22 19 26 18 14 24 8 25 11 1 32 20 29 30 5 31 20 11 5 11 33 19 31 29 20 22 19 33 25 7 1 18 4 37 19 26 5 21 5 31 33 19 11 18 14 24 13 25 33 5 23 4 33 5 33 36 11 33 19 12 19 31 5 24 15 40 19 26 29 20 31 5 37 25 39 36 40 1 8 7 4 4 6 3 2 4 3 2 2 4 2 4 1 6 4 2 3 2 3 3 3 3 3 2 3 2 5 23 3 2 5 3 3 5 2 3 4 4 3 2 2 2 3 2 3 4 2 3 5 5 2 2 9 24 4 2 3 3 5 6 11 5 5 3 7 4 5 2 2 3 4 5 4 3 5 2 2 1 2 3 3 4 2 1 4 3 5 3 5 9 53 3 3 4 2 4 3 3 3 3 3 5 3 4 2 3 2 4 4 4 3 4 4 1 3 6 4 3 3 2 5 3 3 2 2 3 4 3 3 6 3 4 18 7 3 2 3 2 5 3 2 2 3 2 3 3 3 3 2 3 3 2 11 5 3 4 2 2 4 3 5 3 4 3 2 2 4 2 6 2 2 2 2 4 6 2 3 5 5 1 3 3 2 2 4 2 4 7 4 2 4 4 4 4 2 3 2 4 3 12 12 17 17 17 296 296 184 184 184 435 435 66 172 115 273 273 84 344 16 274 399 399 473 65 486 486 486 460 460 169 164 164 164 485 485 485 301 378 43 364 109 109 189 330 330 64 76 465 377 123 123 236 32 259 354 190 380 499 428 428 85 146 146 35 35 133 133 147 288 288 278 173 280 29 29 382 313 236 108 377 87 87 399 217 473 213 213 213 252 325 325 183 57 57 57 57 203 381 117 404 13 229 491 247 312 126 292 292 292 292 292 292 21 326 326 326 408 408 408 408 149 149 228 491 320 217 473 258 258 258 342 342 224 494 494 494 258 31 162 232 232 68 68 105 105 336 470 329 329 330 330 379 64 77 342 224 300 300 382 245 245 43 345 109 389 497 497 122 239 161 79 499 499 405 206 215 35 29 57 57 57 203 70 106 426 426 426 426 169 169 352 352 402 198 127 114 114 264 264 264 264 59 59 59 452 263 263 417 417 417 417 170 170 47 47 491 491 2 2 47 2 316 2 491 491 316 316 73 73 289 435 435 83 255 255 130 402 458 144 441 441 153 153 372 372 396 271 186 39 342 323 97 427 247 247 126 126 326 326 326 326 101 101 149 149 491 373 338 400 400 400 400 30 301 416 416 180 180 84 84 496 496 274 71 368 368 453 168 106 426 426 426 426 413 348 64 465 377 123 123 123 43 276 346 346 346 428 85 146 146 252 36 478 66 68 115 470 486 365 365 365 330 388 33 77 77 342 68 238 6 272 470 171 171 252 99 99 436 60 60 116 94 58 58 156 156 156 313 186 186 162 68 115 273 273 279 279 279 279 279 375 375 352 352 352 352 352 352 112 112 417 417 237 237 237 237 237 237 491 237 237 491 237 237 237 362 362 362 362 491 491 362 362 362 491 218 491 218 491 491 211 218 218 366 366 491 491 366 366 366 366 491 366 366 366 366 163 316 316 316 316 73 73 491 320 7 473 258 258 258 31 342 224 494 494 494 31 9 142 397 147 380 329 329 329 329 329 310 107 395 302 302 497 497 122 129 259 190 190 190 488 499 265 265 85 146 146 325 325 34 382 313 285 325 183 156 156 156 156 396 313 186 162 172 115 273 279 279 279 279 279 293 169 352 352 155 125 125 322 94 335 14 14 411 297 297 297 297 297 293 43 345 109 109 109 171 422 186 162 68 68 68 105 105 336 354 213 213 213 143 192 192 135 135 135 200 248 58 156 156 156 156 245 245 399 70 65 480 480 480 480 85 299 299 299 303 243 227 419 427 56 491 247 312 126 292 292 326 326 326 326 326 326 326 101 101 408 228 228 373 338 338 400 400 400 400 301 143 129 74 190 492 492 492 186 162 342 172 444 444 444 444 252 325 325 191 191 191 314 36 108 87 87 87 38 342 86 105 336 470 213 213 213 143 458 192 277 277 277 314 196 196 479 331 331 315 315 315 315 450 450 450 98 263 417 417 417 225 225 225 72 72 110 202 202 202 202 202 280 135 135 135 200 464 464 255 255 236 239 259 107 395 180 151 151 169 150 150 86 238 6 272 191 191 191 240 58 183 156 156 156 156 245 399 399 217 217 473 432 432 330 348 64 212 449 302 302 497 497 14 14 411 145 145 486 460 240 325 449 469 469 469 236 259 108 449 485 485 374 374 374 37 24 259 377 377 123 123 216 22 283 283 38 162 68 342 224 494 494 399 217 217 473 290 290 171 171 171 252 318 368 342 342 176 176 176 328 200 248 248 76 74 485 213 213 213 213 186 39 342 224 462 462 462 462 402 196 196 398 398 398 398 398 374 374 132 132 185 185 185 323 390 18 112 427 56 56 491 491 15 15 15 15 15 193 193 193 193 17 17 +103-1240-0045 103 783 1 38 13 23 24 3 30 19 23 5 1 8 23 21 5 31 33 13 23 39 36 29 23 15 25 12 5 33 8 34 19 26 22 39 35 30 11 36 19 26 5 24 8 33 20 16 36 23 19 32 34 19 26 1 5 30 19 31 22 20 34 19 26 12 4 33 31 38 5 33 1 39 36 11 27 25 33 25 27 38 5 33 39 35 30 17 13 33 19 26 1 39 35 30 9 30 19 26 19 26 5 31 33 30 15 25 21 10 8 23 11 19 25 33 36 39 6 30 18 7 31 5 25 11 18 27 24 1 4 25 11 39 36 11 27 25 33 25 27 5 31 19 26 17 5 23 34 19 26 5 9 7 33 19 24 25 6 30 38 5 33 18 19 40 11 19 31 29 5 40 19 32 5 25 19 40 23 8 22 25 6 30 38 5 33 31 6 30 33 5 37 29 13 30 5 25 33 31 18 20 18 4 11 1 15 8 5 5 3 2 3 3 3 7 12 9 5 3 3 5 5 3 3 4 4 5 3 8 2 2 3 2 8 5 2 4 3 3 1 4 3 5 3 3 2 4 4 4 2 7 5 2 2 7 3 1 11 12 10 5 2 5 3 4 5 3 8 3 4 3 3 3 5 7 21 4 3 3 4 1 2 3 5 3 3 2 2 2 3 4 3 2 3 6 11 6 2 4 4 3 2 2 3 4 3 5 3 2 4 4 4 5 6 3 3 2 3 3 2 1 4 2 4 5 4 1 2 1 3 6 4 12 7 2 2 2 4 4 5 1 2 2 6 2 7 2 5 1 2 2 4 2 4 2 3 6 3 4 3 2 4 4 4 2 1 2 1 3 3 2 3 3 2 3 3 5 1 2 3 3 3 6 5 4 4 4 4 3 4 3 2 2 2 2 3 6 3 6 2 2 2 2 2 4 4 5 4 6 17 17 17 17 296 363 52 51 51 51 51 491 184 184 491 184 7 7 7 364 276 109 109 109 443 443 139 139 293 293 293 497 399 217 70 473 65 329 495 406 406 467 134 139 139 175 423 423 423 423 423 263 263 417 417 417 237 237 237 237 237 201 237 80 435 435 435 440 287 111 111 111 111 139 139 293 293 293 122 35 310 107 395 395 151 151 31 342 342 86 238 6 108 119 119 351 443 151 139 240 240 219 219 477 477 477 477 477 132 8 259 74 74 425 425 386 386 290 290 290 290 434 434 434 434 434 339 466 212 127 45 45 45 325 34 111 111 111 111 111 438 438 438 422 349 164 164 214 214 214 360 360 200 248 76 465 219 219 152 152 222 498 353 353 313 236 239 371 371 374 374 88 88 176 135 135 135 200 44 44 44 399 70 65 65 428 428 146 146 252 449 449 324 324 422 349 349 234 234 261 25 441 153 153 153 153 132 81 81 459 459 469 99 447 447 447 447 238 336 214 214 214 214 214 328 328 200 303 303 404 404 229 491 247 312 126 326 326 326 101 101 101 149 149 228 491 287 287 44 44 44 44 44 42 42 42 147 147 380 288 278 278 31 342 86 86 105 105 336 485 41 324 324 422 349 164 164 164 214 214 214 214 328 328 200 200 200 200 248 248 248 127 114 92 92 92 92 169 35 77 66 142 397 397 276 346 346 346 355 355 37 37 24 227 419 419 439 78 491 491 312 312 312 312 292 292 1 21 21 21 21 21 408 408 408 408 149 228 491 289 219 152 152 152 152 236 325 371 180 84 84 496 350 167 457 457 479 331 84 84 84 16 274 43 43 276 181 181 181 181 35 449 449 485 152 222 353 353 245 416 458 445 180 443 443 240 325 449 176 176 135 328 200 117 117 48 414 414 47 47 47 47 491 491 47 491 491 80 491 7 7 219 219 152 152 222 353 372 245 245 245 129 259 354 190 380 288 288 360 360 200 135 135 135 135 200 200 44 44 44 44 162 232 482 482 482 238 336 161 487 288 290 290 290 434 339 339 64 76 107 447 447 6 6 119 351 437 91 91 265 85 85 85 139 139 293 122 122 131 34 340 340 116 33 394 465 377 123 123 219 477 222 222 222 372 372 245 58 72 268 268 268 268 268 268 169 186 269 323 224 242 116 33 58 58 72 350 350 350 350 274 274 203 381 117 229 247 247 126 126 326 326 326 326 326 101 149 149 228 491 412 83 55 55 55 55 322 67 212 219 152 152 152 152 132 236 239 239 371 180 84 84 496 274 274 274 457 196 479 331 84 84 274 88 88 44 44 44 38 232 232 68 68 115 273 278 360 360 200 200 64 212 302 302 302 497 497 349 205 259 214 214 214 214 200 200 464 255 255 8 354 180 113 113 113 113 113 167 285 449 57 57 57 57 203 203 195 10 309 331 157 157 157 157 372 245 245 43 364 364 181 181 181 181 285 449 34 356 281 453 342 6 272 490 490 490 31 9 105 336 336 494 494 494 368 453 168 418 418 418 99 436 436 60 60 298 116 199 356 356 281 31 9 26 26 241 266 266 266 266 266 146 146 358 143 458 192 472 196 309 479 331 157 157 157 157 372 372 245 245 43 364 276 181 181 181 167 167 35 478 478 68 224 273 153 153 153 396 285 285 462 462 462 402 129 259 74 74 351 351 351 351 264 468 468 468 468 467 467 467 11 275 379 379 77 77 342 342 451 30 30 30 30 58 58 110 110 110 486 486 460 460 240 24 131 404 229 247 126 326 193 193 17 +103-1240-0046 103 696 1 25 6 30 18 7 18 20 40 23 8 22 23 20 33 19 33 14 25 7 33 1 38 8 19 33 38 5 40 27 25 23 20 23 4 31 33 38 20 22 8 30 13 11 19 25 12 5 29 15 29 14 18 7 5 24 4 25 4 25 11 18 19 40 38 8 16 5 29 38 13 31 33 5 37 12 20 8 23 5 25 11 1 33 35 22 5 9 28 7 33 5 37 5 25 6 30 16 5 25 5 31 8 23 5 24 4 25 11 18 20 31 13 33 16 8 30 33 5 12 5 18 7 31 4 33 25 8 33 1 31 13 33 19 33 3 25 29 14 29 5 31 24 3 30 19 23 5 1 4 25 11 25 19 30 23 20 9 14 25 33 12 5 24 33 36 5 22 30 19 31 29 19 25 12 13 30 9 13 11 40 1 6 5 6 2 4 6 3 3 4 3 3 4 2 2 2 3 4 5 2 5 8 19 7 6 2 2 2 2 3 4 3 2 4 3 5 4 2 3 4 3 6 4 3 2 3 2 1 2 4 4 5 5 3 6 3 5 7 3 1 2 1 2 3 4 4 5 4 4 3 6 4 5 2 2 1 2 4 5 4 3 2 3 13 3 4 2 3 4 10 4 3 2 2 2 2 6 3 3 3 2 3 4 5 4 3 3 3 2 1 3 5 5 3 3 7 7 4 2 2 1 3 4 5 5 1 4 2 6 5 16 8 3 3 2 6 5 5 5 4 2 4 5 2 1 4 3 3 7 8 6 1 3 2 4 3 3 4 6 4 2 3 1 3 2 4 3 3 5 1 2 5 2 3 1 2 2 3 3 4 6 8 14 17 17 363 51 51 228 491 7 309 479 331 157 157 157 387 372 372 396 313 58 72 110 268 268 268 268 268 274 274 183 451 30 30 30 356 368 342 9 26 251 241 266 266 266 266 178 458 96 26 359 474 474 301 236 87 87 87 87 36 108 119 308 308 308 308 396 313 94 199 180 113 113 113 113 450 450 413 233 227 419 439 78 170 491 312 187 187 187 187 12 12 12 12 260 260 260 391 391 149 491 491 491 7 7 276 346 346 346 265 85 85 146 464 177 177 177 177 133 133 141 141 141 281 342 168 106 350 350 350 350 348 250 359 166 166 324 301 251 251 241 376 376 376 376 460 169 150 342 86 238 272 397 397 109 109 213 213 213 143 458 144 180 106 111 111 111 438 438 42 147 147 380 288 443 240 240 325 34 340 340 116 466 22 283 455 129 74 351 351 351 171 171 252 215 215 259 29 334 334 59 59 245 58 72 72 268 268 268 268 88 88 88 44 44 399 217 217 473 65 136 136 136 136 136 136 136 282 388 94 34 89 340 116 131 183 257 257 257 257 281 9 142 221 336 364 276 346 346 428 428 146 146 349 205 352 106 230 230 230 215 215 35 35 133 364 364 276 109 109 443 443 443 169 150 39 86 86 238 6 272 69 223 130 198 22 448 448 464 106 106 265 85 85 85 146 175 175 81 81 275 275 116 64 131 427 229 247 126 326 326 326 326 326 101 101 149 228 289 289 491 108 377 295 295 295 295 35 192 44 44 44 8 8 8 354 153 153 153 387 387 387 146 464 464 113 113 113 113 206 285 449 34 69 223 130 44 44 44 94 335 14 411 411 153 372 372 372 396 349 349 234 261 25 242 116 94 199 255 38 31 342 68 115 273 106 265 265 85 85 85 175 175 81 81 203 203 381 404 335 440 55 55 322 67 131 183 451 451 30 30 30 422 186 162 68 68 115 273 189 443 240 385 131 472 393 393 234 234 261 261 25 265 265 265 85 146 146 300 382 382 313 143 36 377 123 123 216 283 283 455 72 72 268 268 268 268 268 169 169 39 342 342 224 415 415 415 314 401 196 479 331 428 428 428 428 358 358 233 36 227 427 427 247 247 312 126 292 292 292 292 292 23 408 408 408 408 391 491 491 373 66 66 68 68 115 273 470 443 240 325 449 277 277 277 277 325 335 14 14 287 284 125 125 125 348 348 195 33 394 76 401 82 74 492 492 492 492 396 215 35 354 459 459 459 271 39 342 86 142 196 70 65 65 495 406 406 467 288 139 139 175 175 423 423 423 423 263 229 229 247 126 126 326 101 408 149 149 491 412 83 83 55 55 322 322 67 10 10 309 479 398 398 398 398 468 468 313 359 359 166 166 166 324 301 301 32 32 32 354 354 498 498 308 313 348 64 76 198 198 114 57 57 203 53 76 465 377 377 123 123 123 88 44 44 44 129 458 208 208 190 487 278 278 31 342 86 105 336 336 354 340 340 116 466 466 114 222 222 222 468 245 8 8 354 470 120 120 330 240 379 243 233 270 270 433 433 160 112 112 56 56 421 491 421 491 491 491 421 421 128 491 128 128 193 17 17 +103-1240-0047 103 644 1 4 25 11 8 25 27 5 25 5 12 14 22 15 31 38 13 30 5 25 5 11 3 29 33 5 11 9 28 39 36 40 11 33 5 31 5 22 12 20 13 17 40 1 12 15 22 35 11 5 25 33 9 30 15 22 18 19 24 5 37 19 33 1 19 16 39 36 18 4 11 4 31 33 24 8 5 11 37 8 31 19 25 12 5 24 4 33 14 1 38 19 10 39 36 11 19 11 5 25 33 1 11 36 24 3 30 19 23 5 1 8 11 18 4 37 31 13 11 16 6 30 24 14 31 20 40 31 15 22 25 3 33 5 34 19 26 22 5 37 31 5 10 5 34 19 26 12 4 33 31 38 5 33 1 15 7 2 2 5 4 6 1 4 4 3 2 6 5 4 3 2 3 2 2 3 3 5 3 2 2 3 4 6 6 3 4 1 2 3 7 3 6 3 5 4 7 6 17 3 5 5 3 2 4 2 2 2 3 2 3 2 2 2 4 2 5 5 16 8 4 3 4 5 1 3 5 4 2 2 6 2 1 3 7 5 2 2 1 2 2 4 4 5 16 4 2 7 3 3 4 2 3 1 4 5 2 2 7 3 2 3 3 3 8 14 10 1 2 1 3 7 4 4 6 3 3 8 3 6 3 4 6 5 4 3 4 6 2 7 1 3 3 2 2 3 3 3 3 4 4 6 2 5 3 5 3 2 11 19 17 17 17 296 296 317 305 305 317 461 491 491 435 435 435 435 287 83 194 194 194 194 322 67 212 34 111 111 111 111 438 438 10 479 331 84 84 88 88 88 44 44 348 10 10 479 331 493 493 493 216 300 300 382 245 143 465 445 351 351 343 343 343 171 358 368 342 9 142 397 336 345 347 347 347 406 467 467 467 340 116 199 255 255 236 236 384 180 106 405 405 405 215 215 96 272 449 191 191 191 314 314 32 401 259 354 153 153 153 387 387 387 146 146 219 219 219 219 485 374 374 368 186 323 323 238 6 272 87 87 87 38 162 68 68 68 68 115 273 151 151 178 178 35 458 96 472 164 198 22 448 448 448 448 464 180 443 443 120 120 120 416 416 233 233 270 49 433 433 433 160 427 247 247 126 126 126 292 326 326 326 326 326 326 408 408 149 149 228 289 491 127 114 0 0 0 0 422 143 458 144 27 389 389 389 389 314 35 196 242 242 33 33 76 465 401 259 354 190 380 288 288 295 143 458 192 183 57 57 57 203 88 69 223 223 223 130 280 277 277 277 277 385 24 227 419 419 439 439 439 439 237 237 237 237 47 47 47 491 491 316 491 80 373 412 412 188 188 118 118 118 118 118 118 402 219 219 152 152 152 132 132 58 58 72 110 110 254 254 240 325 34 145 145 460 460 169 150 342 86 6 472 221 70 46 46 46 46 464 464 255 255 240 314 4 280 106 265 265 265 85 85 146 358 39 39 342 342 224 340 340 466 466 22 283 399 473 65 486 486 460 460 285 449 334 334 382 59 452 229 229 247 126 126 326 326 326 326 326 101 101 101 149 149 228 491 289 320 345 407 407 407 407 35 36 310 107 447 219 219 219 152 152 152 132 236 32 239 384 371 371 278 278 325 242 242 242 379 243 243 36 227 472 472 221 336 336 384 371 374 374 374 374 132 132 132 399 70 473 65 329 329 42 406 467 134 139 139 175 423 423 423 423 423 452 263 229 259 247 312 126 292 292 23 23 23 408 101 149 149 149 228 491 412 287 111 111 111 111 111 438 438 325 34 202 202 202 402 402 162 232 68 68 172 115 470 470 120 120 240 240 314 314 131 393 393 393 155 155 332 332 332 372 372 245 399 399 217 217 217 70 65 65 498 498 498 186 186 54 54 172 224 41 324 324 422 186 162 232 232 68 68 68 68 115 470 470 403 171 171 252 416 458 401 196 196 309 331 307 307 307 61 167 35 35 108 377 87 87 38 164 164 164 164 164 214 214 214 360 200 200 76 458 192 69 223 223 402 66 342 224 344 344 344 449 449 44 44 44 38 164 164 164 214 214 214 214 214 328 200 200 248 248 212 127 114 92 92 92 92 169 35 77 77 66 86 142 397 397 336 276 346 346 265 355 37 37 24 227 419 419 439 439 439 78 237 170 491 421 421 491 491 491 491 341 15 15 15 15 193 193 193 17 17 +103-1240-0048 103 738 1 12 19 31 21 27 9 40 22 5 24 16 14 33 19 26 31 20 24 11 25 8 12 14 33 36 5 16 13 25 11 25 6 30 33 36 5 23 3 30 24 3 30 19 23 5 1 32 20 25 19 33 19 11 31 33 13 11 5 23 20 6 25 1 8 11 27 25 11 19 25 8 12 13 30 40 31 5 24 34 19 26 19 25 38 5 33 39 36 31 15 30 15 10 5 23 1 8 37 18 4 11 31 5 24 22 38 3 23 24 40 24 8 31 13 23 16 1 9 5 33 24 4 34 39 36 38 5 40 33 13 30 5 9 5 23 31 13 33 3 25 19 33 1 8 22 35 11 31 20 12 4 33 31 27 8 17 15 37 19 25 1 21 6 5 8 7 9 3 3 4 3 3 3 2 2 3 6 6 6 3 4 3 6 2 3 3 4 3 7 4 8 5 3 3 3 4 4 2 5 4 4 5 2 2 4 3 7 14 7 2 3 3 2 3 4 4 3 2 3 2 3 5 7 6 52 9 3 5 2 2 4 2 8 2 2 2 3 3 2 3 3 2 3 2 2 3 3 3 2 3 5 7 4 4 4 3 5 14 9 2 5 2 4 3 1 5 3 4 3 3 4 4 2 5 5 2 6 6 18 3 2 3 3 6 3 3 4 2 2 4 5 2 4 3 1 2 3 5 3 3 4 3 4 5 11 8 4 2 3 5 5 2 7 5 3 5 6 3 6 4 4 6 12 17 17 17 17 296 52 52 52 52 52 52 52 52 52 461 51 51 51 184 491 184 184 7 7 7 127 127 258 258 258 258 258 39 342 342 86 86 238 221 336 336 401 310 107 395 395 329 84 84 496 496 496 496 274 274 215 8 96 270 342 86 221 221 144 27 437 437 319 319 53 53 76 205 29 29 469 469 24 325 176 176 328 328 200 200 195 248 49 49 68 68 68 444 444 444 444 444 434 434 434 339 394 212 131 472 472 196 309 479 331 331 265 265 428 146 146 216 300 300 382 236 36 377 87 87 87 88 44 44 44 349 349 234 234 261 261 25 432 432 432 432 330 330 388 195 195 195 195 195 64 212 131 472 472 221 309 479 157 157 157 157 372 313 236 108 377 123 123 123 88 88 88 255 255 251 251 241 431 431 306 306 306 306 306 306 396 203 53 381 217 70 65 65 329 495 406 406 134 134 139 175 175 423 423 423 423 423 263 263 417 417 417 417 237 237 237 47 47 47 491 491 435 435 435 435 373 338 338 338 400 400 400 30 422 94 199 398 278 278 325 449 191 191 191 314 314 478 478 68 68 68 238 6 371 470 443 443 240 325 26 134 359 359 359 474 474 324 324 464 464 426 426 426 426 426 426 282 388 303 303 48 48 417 170 491 170 491 28 28 28 491 28 362 491 362 362 491 362 491 362 362 40 491 491 211 211 369 369 369 369 369 369 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 260 391 391 391 491 73 289 412 412 287 287 111 111 111 111 438 438 24 384 371 180 84 84 350 274 167 314 36 384 490 490 490 116 479 331 331 265 265 265 85 85 146 146 216 127 300 382 382 313 186 162 232 172 115 231 231 231 231 53 76 76 164 214 214 214 328 200 200 340 340 116 250 250 345 181 181 181 181 35 131 219 152 152 152 422 186 162 232 172 115 273 470 403 403 403 207 301 301 42 147 147 329 329 329 329 252 143 310 107 395 302 302 302 497 98 98 13 417 417 417 417 237 237 237 237 237 237 237 80 80 491 491 412 412 287 287 111 111 111 438 202 202 402 58 72 110 110 110 460 240 240 35 77 478 68 224 231 231 231 53 90 90 76 465 208 208 441 441 106 481 481 426 426 426 426 203 53 381 471 49 49 342 142 221 196 46 46 46 46 438 186 162 68 68 115 273 279 279 279 279 279 279 375 169 352 352 352 352 427 229 491 247 126 126 292 326 326 326 326 326 326 101 101 149 149 228 228 289 320 159 159 159 159 159 35 196 196 217 473 329 329 329 329 460 329 164 164 485 485 485 485 423 132 378 43 345 141 141 141 281 9 86 86 6 108 119 119 351 351 264 468 468 468 467 134 134 134 8 100 100 497 497 186 162 68 68 115 273 470 443 240 285 449 34 125 125 125 125 348 199 199 277 277 277 385 227 227 419 439 417 417 237 237 237 237 237 237 80 80 80 491 412 412 287 287 111 111 111 438 438 143 144 389 389 389 314 478 478 68 68 172 267 267 267 267 267 301 216 127 114 92 92 92 92 92 240 240 143 35 36 478 66 172 224 273 84 84 16 88 88 111 111 111 111 438 438 416 416 445 445 210 210 210 171 252 173 173 280 34 120 120 120 120 388 303 303 303 48 417 417 417 170 491 491 491 421 128 128 193 193 17 +103-1240-0049 103 764 1 19 33 31 27 31 13 23 11 5 24 4 34 39 36 31 13 33 31 18 19 40 24 8 25 11 3 25 13 25 20 34 19 26 12 5 33 18 38 13 25 18 20 11 5 40 8 6 23 38 20 40 16 20 23 19 33 31 24 8 11 39 36 33 20 33 19 17 19 37 19 25 1 5 25 11 4 40 16 14 12 5 30 19 31 22 1 12 13 30 40 30 19 31 22 31 19 25 29 30 19 33 20 25 19 30 13 37 30 20 34 19 26 5 9 3 11 20 11 5 40 19 25 12 19 31 38 14 23 11 1 12 13 30 40 30 19 31 22 31 19 25 29 20 29 5 23 40 18 4 37 19 26 10 19 23 11 30 5 25 5 37 12 13 30 27 25 19 16 19 33 22 5 24 40 33 5 12 4 33 1 12 15 11 27 25 33 6 23 38 20 40 33 14 25 7 33 38 13 23 1 13 5 3 6 5 6 3 4 3 3 5 5 3 3 2 6 3 3 1 2 1 4 4 5 2 2 5 3 2 3 3 4 3 6 2 3 2 3 2 2 2 5 3 3 8 5 6 3 3 3 2 6 2 5 3 2 2 3 3 4 3 3 3 3 4 3 3 3 2 2 5 7 24 7 1 3 4 6 2 4 2 3 3 3 6 7 18 3 2 3 6 3 2 5 3 2 2 4 3 3 1 2 2 3 4 4 5 3 3 4 3 3 4 3 4 4 3 4 3 5 4 2 1 2 3 4 4 3 5 4 19 3 2 4 5 4 3 6 2 3 1 3 4 4 2 2 2 3 2 4 2 2 4 4 3 3 2 2 1 2 3 2 1 4 4 9 3 3 3 2 2 2 3 5 3 2 3 2 8 6 17 3 7 2 6 1 3 3 3 3 2 3 5 3 3 5 2 3 3 7 15 17 17 17 17 296 363 363 363 363 51 51 228 491 412 412 177 177 177 177 356 478 66 68 68 172 115 273 344 344 344 274 274 186 162 232 232 172 115 273 273 139 293 293 293 122 122 272 34 242 319 203 53 381 217 217 473 65 486 486 460 169 169 164 164 485 485 485 374 422 186 162 68 68 273 470 443 443 240 71 71 342 224 257 257 257 257 453 9 196 217 70 65 480 480 480 480 299 299 299 339 212 34 106 125 125 125 388 94 199 475 475 475 475 475 475 475 475 422 349 164 164 214 214 214 214 328 328 200 200 248 212 127 45 45 45 45 385 131 133 133 364 409 409 409 409 348 94 183 183 451 451 30 30 301 236 36 384 71 71 71 71 71 71 71 71 71 368 453 342 168 106 111 111 111 111 438 464 106 297 297 297 297 297 43 109 109 109 469 186 39 342 86 142 393 261 25 444 213 213 139 139 251 241 81 177 356 236 71 71 142 221 196 70 46 46 46 438 438 236 239 384 485 485 485 374 374 252 449 449 41 41 41 324 3 143 36 377 87 87 87 416 445 445 278 278 173 280 34 120 120 120 275 388 303 303 303 117 404 78 491 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 408 408 408 149 149 491 412 412 83 55 55 322 67 212 131 34 253 253 253 253 31 342 342 86 142 221 155 332 332 332 332 332 216 283 455 42 42 147 380 288 278 278 278 271 39 342 433 433 105 105 458 192 419 439 439 417 417 237 237 237 237 237 237 237 237 237 237 491 237 80 80 435 80 491 491 127 114 0 0 222 468 356 281 453 9 142 221 336 147 380 288 278 278 31 342 86 86 105 336 270 270 342 224 494 121 203 53 394 394 465 259 190 190 487 104 104 325 41 324 324 301 10 309 398 398 398 398 468 245 335 14 411 411 204 204 204 204 204 204 29 337 337 337 324 422 164 164 164 214 214 214 214 214 200 200 464 415 415 236 129 259 354 354 91 91 206 206 285 285 41 41 324 301 236 239 384 71 71 71 71 71 71 368 342 168 340 340 340 466 466 114 258 258 258 31 142 142 397 397 364 109 109 498 498 134 139 375 375 375 122 122 131 427 229 491 247 126 126 292 292 292 292 326 326 326 326 326 101 101 408 149 228 491 491 127 114 222 222 468 468 356 356 281 9 9 142 42 147 147 380 288 278 278 31 31 342 86 105 105 336 458 270 270 224 89 89 203 53 394 465 465 74 485 213 213 252 215 129 354 100 302 497 497 49 342 58 72 110 202 202 202 202 202 280 176 135 135 200 248 248 310 107 107 395 395 106 153 153 387 122 122 161 300 242 242 116 94 199 223 223 130 198 198 222 222 222 222 406 406 467 467 350 350 350 350 350 350 350 413 413 413 195 199 118 118 118 118 402 177 177 177 177 458 144 351 351 319 319 319 71 71 71 71 49 86 238 6 123 123 123 216 216 114 92 92 92 92 92 92 92 282 385 385 131 419 427 229 247 247 126 126 292 326 326 326 326 326 101 101 149 149 228 289 289 491 127 114 0 0 0 0 0 252 252 325 180 106 350 350 350 350 413 413 465 131 106 106 297 297 297 297 43 109 109 109 109 318 31 39 142 6 272 119 308 308 308 308 313 116 94 199 331 486 113 113 167 167 457 364 276 109 109 139 139 139 375 375 98 98 13 417 417 417 417 237 491 237 421 421 491 491 491 491 193 193 17 +103-1240-0050 103 701 1 4 25 11 12 13 25 27 37 5 31 22 27 32 5 19 40 30 8 33 22 23 27 31 33 5 12 20 8 23 5 25 11 1 19 33 19 40 5 25 33 13 40 19 16 38 20 38 14 17 13 33 19 26 18 19 24 16 14 24 19 26 17 23 5 25 11 6 30 12 5 31 33 15 33 31 1 18 20 22 4 25 33 9 20 24 5 10 11 19 16 30 5 25 33 16 14 24 3 30 31 13 23 37 40 1 38 13 23 8 18 27 29 19 33 38 5 23 33 14 25 7 33 6 23 30 8 33 1 31 13 11 24 19 31 19 40 30 15 10 5 23 19 25 5 33 27 25 12 5 33 29 23 15 25 23 20 19 25 11 5 22 15 33 19 11 18 14 29 15 25 16 5 23 11 7 33 31 1 16 9 2 5 2 4 7 4 2 3 4 4 4 5 1 2 4 3 4 2 5 2 4 3 3 2 2 4 6 4 2 2 7 4 5 2 2 4 2 2 2 2 4 4 4 1 3 3 3 3 3 2 3 3 2 3 3 4 2 2 5 5 2 3 3 1 3 2 3 2 3 4 3 6 5 5 17 4 2 4 4 2 1 2 4 5 3 6 2 2 3 2 1 2 1 3 2 2 2 4 4 4 4 3 11 52 4 3 4 7 8 5 3 2 3 1 2 2 6 3 2 5 2 4 3 4 5 7 16 4 3 2 3 2 4 2 5 2 4 3 3 4 2 2 2 6 6 2 2 1 3 6 3 4 3 2 5 3 2 2 3 4 4 2 2 2 4 3 7 4 6 4 1 5 4 10 3 7 5 17 17 17 296 296 363 363 363 363 363 51 51 149 228 228 289 412 83 83 194 194 194 194 194 194 388 388 64 64 131 472 198 127 361 361 361 361 361 388 67 10 10 479 331 331 84 496 496 173 173 280 29 255 38 162 54 482 105 105 336 144 496 496 496 496 274 99 99 436 395 395 50 50 50 31 9 142 397 147 380 499 428 428 146 167 457 35 401 259 208 208 386 386 496 496 496 496 186 39 86 238 6 377 123 123 123 22 448 448 448 464 180 106 265 265 85 85 146 134 175 81 81 275 275 388 303 243 131 419 439 439 225 417 80 80 491 491 209 188 177 177 177 325 356 356 356 281 342 342 168 242 242 116 64 212 34 253 253 368 453 342 168 118 118 118 118 118 205 402 152 152 152 152 378 378 345 347 347 347 313 416 458 445 180 443 240 325 325 176 135 135 200 200 248 183 57 57 57 57 203 53 76 205 155 165 165 165 165 165 335 14 411 411 360 360 360 200 200 248 248 248 441 302 81 81 275 275 116 64 212 131 157 157 157 157 157 216 216 22 283 455 38 162 68 68 6 272 470 470 171 171 171 171 358 358 358 358 270 270 270 433 160 112 427 229 247 247 126 292 292 326 326 326 326 326 326 101 408 408 391 228 491 491 373 451 451 30 143 458 445 445 351 365 365 365 460 460 76 465 465 420 420 420 324 301 399 217 217 383 383 383 383 383 383 310 310 447 447 6 336 371 278 278 349 349 155 29 242 275 116 394 90 393 155 332 165 165 53 65 353 353 353 353 396 186 162 342 115 273 279 279 279 279 279 279 293 169 169 352 270 433 390 390 18 112 112 439 439 78 56 56 491 491 28 491 491 312 491 341 341 12 12 12 12 292 21 21 21 21 21 21 21 21 21 21 21 21 21 369 260 260 260 260 260 260 40 40 40 40 40 40 163 163 491 491 305 305 491 316 316 316 73 491 491 320 345 109 109 139 139 139 175 175 81 111 111 111 111 438 438 438 58 72 72 72 72 72 437 496 496 496 496 496 215 35 35 354 177 177 177 131 133 345 389 389 497 497 36 108 108 308 308 308 308 308 313 94 199 113 113 113 113 206 285 285 106 106 297 297 293 293 42 42 147 380 499 428 428 428 146 358 358 233 227 419 419 439 417 417 417 237 237 237 237 237 237 201 237 237 201 201 201 80 373 435 435 108 179 179 179 179 179 314 196 217 473 258 258 31 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 252 310 107 395 302 302 302 497 175 175 81 89 340 94 199 255 255 236 36 119 119 351 351 496 350 350 350 413 413 466 466 22 45 45 236 129 129 82 74 74 425 425 386 386 386 290 290 290 290 434 339 33 359 359 166 166 166 3 14 411 188 121 121 116 64 212 384 469 469 416 143 458 445 158 158 158 158 158 325 34 191 191 314 131 58 156 156 156 156 245 8 129 259 74 74 351 351 290 290 290 290 434 339 339 195 248 90 393 393 155 262 262 100 100 497 497 497 122 239 384 371 180 180 486 315 315 113 450 450 450 167 37 233 270 270 433 390 390 18 112 112 439 439 193 193 193 17 +103-1240-0051 103 767 1 27 25 23 20 11 27 25 33 31 15 8 11 19 11 5 25 38 6 30 25 39 36 19 16 18 20 9 14 25 40 17 30 20 25 17 15 9 5 23 40 11 7 25 14 29 35 33 31 33 30 19 22 25 8 25 19 25 12 5 38 13 23 1 8 18 14 11 5 37 5 22 15 31 27 37 14 19 25 39 36 9 30 5 25 40 38 19 22 38 13 30 5 25 6 30 16 5 25 5 31 8 23 5 24 10 8 23 11 19 11 12 4 33 1 5 25 11 12 5 18 27 23 16 4 24 23 20 11 8 11 19 25 16 19 30 16 5 23 4 17 5 25 20 40 1 27 25 23 20 19 33 38 5 40 5 17 14 23 19 25 12 4 33 19 25 31 33 5 25 31 1 38 13 23 38 14 25 3 33 17 13 33 19 26 5 17 14 23 1 31 13 11 24 3 30 19 23 5 1 5 6 5 3 4 5 5 3 2 7 6 6 2 3 1 2 3 4 2 3 2 3 3 2 2 3 2 5 8 4 3 3 3 4 5 3 4 3 2 4 2 4 8 3 4 4 2 4 5 3 2 3 3 3 3 3 3 2 1 2 3 4 9 19 8 3 4 2 1 2 3 4 6 5 5 5 2 2 4 3 2 5 2 2 5 2 2 3 5 1 2 1 2 2 4 3 3 1 3 2 5 4 3 2 3 5 5 3 3 3 4 3 4 5 13 4 2 1 2 2 7 5 4 5 5 2 3 3 4 6 2 2 3 7 4 3 3 2 4 5 3 1 2 6 8 23 8 2 3 2 2 2 3 1 3 2 3 6 3 3 1 3 2 2 3 3 4 2 2 4 7 25 6 4 3 4 3 2 4 4 3 2 2 2 4 2 4 5 7 18 5 2 2 2 2 3 3 3 7 5 17 17 296 296 184 491 209 287 350 350 350 350 350 350 250 359 359 81 166 166 324 324 422 314 32 239 384 371 180 84 350 350 350 413 413 243 131 472 232 232 232 68 115 273 470 470 403 403 171 464 464 111 111 111 111 438 438 239 371 371 278 242 314 242 242 242 394 133 364 276 276 153 153 387 387 396 348 339 219 219 477 477 477 88 118 118 118 118 402 183 451 30 30 301 32 129 259 354 354 498 498 498 498 498 396 396 242 116 195 471 368 453 9 142 221 144 208 79 288 288 360 360 360 434 339 200 33 248 248 212 445 180 171 171 171 252 252 8 354 100 302 497 497 497 49 453 9 6 384 371 180 315 315 315 315 450 450 450 413 413 94 199 157 157 245 245 129 259 74 190 189 189 236 35 478 478 482 482 482 482 482 238 6 161 487 288 178 178 458 458 192 196 196 479 398 360 360 434 434 339 199 34 340 340 116 466 22 283 455 43 276 109 109 139 139 139 139 375 375 375 375 98 13 229 491 247 126 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 149 228 289 320 287 111 111 111 438 438 58 110 498 498 498 498 396 285 34 223 223 280 44 44 44 458 445 445 351 351 343 171 171 358 358 39 342 342 224 224 106 410 410 410 410 173 173 29 29 495 467 467 44 44 116 10 10 398 398 398 398 374 132 236 32 259 354 190 380 499 319 319 348 348 471 471 49 9 142 397 109 109 288 178 178 143 458 208 397 347 347 467 467 44 44 94 14 14 411 153 372 372 396 349 349 352 29 242 116 199 44 44 38 342 342 115 273 106 265 265 85 85 146 175 81 282 203 53 394 90 310 107 395 351 91 91 91 85 85 139 450 293 122 35 401 384 371 278 278 314 314 401 401 127 114 92 92 92 92 167 385 35 227 427 229 247 126 126 326 326 326 326 101 408 149 149 228 491 412 55 55 55 322 67 466 198 5 5 455 38 72 72 72 72 72 437 424 424 424 424 424 497 497 122 349 401 205 261 25 25 365 365 365 365 460 203 53 359 81 81 41 324 324 422 36 371 180 265 265 265 85 146 146 325 34 340 340 116 33 76 76 205 234 234 234 261 25 485 286 286 286 468 245 349 349 205 262 262 100 497 497 14 14 145 145 486 460 460 416 458 242 242 116 199 41 41 41 19 318 185 433 433 433 160 112 427 56 170 491 312 312 312 187 12 12 292 12 12 12 12 12 408 408 260 391 491 491 316 491 491 491 491 412 287 287 350 350 350 350 350 359 359 81 166 166 464 177 177 177 133 133 141 141 141 281 453 168 44 44 416 208 79 498 498 498 498 134 302 497 175 81 340 340 340 466 466 114 92 92 92 240 325 34 121 121 121 379 77 77 342 86 238 6 272 11 11 379 379 243 471 49 433 390 390 18 18 112 439 439 237 237 237 237 237 237 237 305 305 12 260 260 260 260 260 260 260 163 163 316 316 316 316 491 7 7 7 364 109 109 139 139 139 293 293 43 43 345 347 347 347 313 313 94 479 307 307 307 61 167 131 472 401 259 144 445 443 443 240 325 176 135 135 200 464 44 44 44 416 458 144 79 498 498 498 499 499 302 375 375 98 98 13 417 417 417 237 237 237 237 237 237 237 237 491 491 80 316 491 80 491 289 435 66 66 179 179 179 179 314 196 217 70 65 329 329 406 406 467 134 139 139 175 423 423 423 423 423 263 263 229 247 15 193 193 17 +103-1240-0052 103 739 1 4 40 19 16 29 28 40 5 25 19 26 38 13 23 40 38 14 5 29 39 35 30 23 20 16 13 24 5 25 5 25 5 22 3 24 29 23 19 32 24 5 25 33 1 5 25 11 25 3 33 19 9 20 11 30 13 11 19 11 19 25 12 20 22 15 31 5 37 5 9 28 1 8 11 25 13 37 14 11 30 20 24 5 37 33 15 22 19 26 5 17 14 23 33 5 9 30 19 26 5 29 1 8 38 5 25 11 14 4 33 24 19 31 19 40 4 23 5 17 40 4 25 11 14 31 29 13 25 31 14 16 14 11 36 19 26 19 33 1 9 5 33 12 13 30 1 32 20 38 35 11 5 25 33 32 30 19 26 22 16 14 24 5 11 3 29 33 19 26 5 18 27 23 6 30 16 5 25 5 31 8 23 5 24 19 16 32 20 33 35 22 19 33 19 25 33 36 18 14 18 13 11 1 7 6 3 3 4 4 6 3 2 1 2 5 3 4 5 4 4 3 3 4 3 2 4 2 5 8 2 3 2 1 3 2 2 5 2 2 2 2 2 5 2 2 2 3 12 7 2 1 3 4 4 2 2 3 4 3 2 3 2 3 2 2 2 1 5 5 5 1 3 2 4 12 38 7 2 2 3 2 3 5 4 4 2 2 2 5 3 3 2 4 2 7 5 4 2 2 2 2 3 3 6 7 8 7 6 2 2 3 2 2 2 1 3 3 2 2 4 2 3 2 3 3 3 3 2 4 4 2 4 4 2 3 2 4 2 4 3 3 6 10 3 2 3 1 2 8 7 12 8 3 2 2 2 2 1 6 1 2 4 3 2 2 2 2 3 5 2 2 1 4 3 4 2 9 5 3 4 2 1 3 5 5 3 2 1 3 2 3 2 3 3 3 2 2 3 2 4 2 4 4 3 5 6 22 17 17 363 363 51 51 228 209 83 145 253 253 253 453 342 342 118 118 118 118 349 402 221 259 74 74 441 153 153 387 387 146 368 453 342 242 196 309 199 176 135 135 200 200 248 250 364 276 109 109 443 139 139 139 293 293 293 185 49 9 142 397 345 347 347 347 347 406 467 255 255 129 129 74 74 485 485 485 286 286 468 468 468 134 359 359 359 166 166 324 3 422 349 234 234 234 261 25 25 443 443 330 203 53 473 242 242 199 199 89 446 94 199 255 255 143 259 144 27 437 319 319 53 53 76 465 81 81 469 469 99 447 447 221 196 291 291 291 291 291 243 227 419 427 247 247 126 126 326 326 326 326 326 101 149 149 491 412 83 55 194 194 194 388 67 10 10 479 331 307 307 61 167 167 36 108 87 87 87 8 420 420 420 422 32 239 161 161 79 79 288 443 443 240 325 34 191 191 24 36 34 340 340 340 466 22 283 455 143 458 445 445 351 343 343 171 358 358 39 342 342 224 69 69 130 280 29 44 44 236 8 354 153 153 153 153 387 387 387 207 207 207 454 13 229 82 247 312 312 312 292 292 292 292 292 292 292 292 1 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 391 391 289 491 209 287 111 111 438 438 314 196 309 479 463 463 463 463 29 29 382 313 236 32 32 239 161 79 79 288 360 360 360 434 434 203 53 69 223 223 402 221 259 108 119 295 295 295 295 295 458 135 135 135 135 200 200 44 44 44 44 129 401 491 144 79 498 498 498 498 139 302 302 497 122 122 449 87 87 87 8 354 380 288 288 360 328 200 464 230 230 230 230 230 230 215 35 29 419 419 225 225 225 225 225 225 225 225 225 225 225 225 287 287 111 111 111 438 378 43 364 276 174 174 319 348 348 64 212 161 300 382 382 277 415 457 196 217 258 258 258 342 342 224 494 494 453 168 145 329 329 329 175 81 81 469 416 416 96 342 168 470 365 365 365 365 348 64 212 300 382 382 186 186 54 54 105 336 336 74 470 432 330 379 64 64 77 77 224 224 334 382 245 349 155 332 332 332 236 239 384 371 374 374 88 176 176 135 135 200 200 277 277 277 277 233 227 419 439 439 439 225 225 225 391 491 80 491 491 73 491 320 159 159 159 314 35 259 127 114 264 264 264 468 59 59 452 263 417 417 417 417 47 47 491 491 491 435 197 373 338 338 338 338 338 400 400 400 400 95 95 246 246 246 301 378 378 345 389 389 389 314 196 242 242 33 33 310 107 338 161 161 161 487 288 360 360 360 200 200 243 96 96 393 155 165 165 165 53 44 255 236 239 384 180 180 405 405 206 206 35 96 272 176 135 135 200 200 44 44 44 44 72 72 72 424 424 424 424 424 424 497 497 497 335 14 226 82 411 411 157 372 372 396 349 349 234 261 25 242 242 94 199 459 38 31 342 342 273 106 265 265 85 85 85 175 175 81 81 203 53 118 118 118 118 402 338 400 400 400 422 36 108 377 295 295 295 416 458 277 277 277 325 34 340 340 340 116 64 76 108 377 123 123 123 88 88 156 156 156 156 245 58 58 110 110 120 120 120 120 120 37 24 24 404 439 78 229 491 312 312 15 292 292 292 292 292 292 292 21 21 21 15 193 193 193 193 17 17 +103-1240-0053 103 683 1 24 19 31 19 40 30 15 10 5 23 38 35 11 18 4 37 23 8 22 33 19 31 33 15 5 25 33 19 23 24 4 34 39 36 22 15 24 18 27 24 38 19 12 18 19 40 19 24 29 6 30 33 19 11 6 30 16 5 25 1 9 5 33 30 5 16 23 13 22 33 19 26 12 5 33 19 33 38 35 11 9 20 5 17 35 11 33 36 7 14 40 4 33 23 20 31 33 9 19 16 6 30 18 19 40 14 8 37 5 23 1 32 20 22 5 25 22 23 36 11 19 11 33 19 17 27 5 29 12 5 30 27 11 33 36 30 3 9 14 33 9 13 23 40 5 25 11 33 13 23 12 5 25 39 36 40 1 19 33 38 35 11 31 14 33 5 25 23 20 24 15 22 5 31 13 25 31 15 32 5 25 31 13 22 5 25 33 5 25 5 25 1 23 5 2 3 3 4 3 3 3 3 3 2 2 1 2 1 2 3 4 2 3 2 4 3 4 2 2 3 2 3 3 6 3 2 2 5 4 4 1 5 2 2 2 1 2 1 3 2 2 4 2 3 2 1 3 7 3 4 2 6 23 3 3 3 2 4 3 1 3 3 3 3 4 1 3 1 2 3 2 1 2 3 5 3 6 3 5 5 7 8 3 4 2 4 3 4 3 2 2 3 5 2 3 2 1 4 6 6 2 2 5 14 6 3 2 3 2 3 2 4 2 3 2 3 2 3 5 5 4 2 3 5 8 2 8 3 4 4 2 2 4 3 4 7 4 1 2 2 3 3 3 2 2 3 4 7 10 14 5 4 2 2 3 6 4 2 2 1 2 2 4 4 3 3 4 2 4 4 4 5 2 3 3 3 3 2 1 3 2 4 5 6 8 17 17 17 17 296 52 52 52 52 52 52 52 52 461 461 491 461 461 184 491 491 305 305 289 7 217 473 258 258 258 342 342 224 494 494 494 453 9 142 397 147 329 329 329 329 329 143 36 449 302 302 302 497 43 43 345 389 389 389 285 34 202 202 402 402 251 241 266 266 266 266 146 178 35 35 272 87 87 38 162 342 86 238 6 272 470 403 403 464 464 464 330 348 76 76 108 377 139 139 139 497 399 217 217 473 486 486 486 460 460 169 164 164 485 485 485 374 422 143 144 445 210 210 210 210 210 210 203 53 58 58 350 350 350 350 350 203 250 250 345 333 333 220 216 22 257 281 453 9 168 121 121 53 76 465 74 74 441 153 153 372 372 313 449 449 191 191 24 335 14 14 411 153 153 372 372 372 396 349 352 352 352 275 275 275 116 303 303 48 229 491 247 312 126 126 292 292 292 292 326 326 326 23 23 23 101 408 408 408 149 149 228 491 289 491 354 159 159 159 159 314 133 133 456 456 456 456 349 349 234 261 386 386 151 151 151 178 35 96 36 449 176 176 135 135 200 200 248 212 127 45 45 45 325 177 177 177 177 345 345 389 389 389 129 129 259 420 420 420 420 464 464 44 44 44 416 129 401 401 144 484 484 484 484 314 314 32 401 401 259 108 377 351 374 374 374 132 88 88 106 145 284 315 315 315 450 450 450 372 304 304 304 49 342 342 168 415 415 415 26 26 26 241 241 444 444 213 213 358 39 39 342 142 221 336 354 354 255 38 349 205 155 148 148 148 148 372 245 58 183 257 257 257 453 168 255 255 42 42 147 380 499 499 265 85 85 146 173 173 280 302 302 375 497 98 229 82 247 126 126 126 326 326 326 326 326 326 101 101 149 228 491 373 338 400 400 400 400 30 143 144 27 121 121 121 33 394 76 208 208 386 444 444 374 374 252 325 34 191 191 191 314 36 36 377 87 87 87 416 416 180 84 84 496 88 88 230 230 230 230 215 215 35 401 198 198 283 283 455 42 42 147 380 380 288 496 496 496 496 274 274 274 37 24 24 36 377 377 377 123 123 272 123 123 123 42 42 147 147 499 499 405 405 206 215 29 469 313 314 32 401 401 401 354 180 180 443 139 139 139 139 375 375 375 375 185 49 342 342 168 89 116 33 394 76 108 119 351 351 139 139 293 293 122 216 283 283 455 116 10 398 398 398 398 398 374 374 132 132 132 185 185 269 390 390 390 18 18 112 439 237 237 237 237 237 237 491 47 491 47 491 491 435 435 435 289 491 209 177 177 177 177 131 133 133 345 389 389 389 314 129 478 66 68 68 115 273 498 498 498 240 240 35 35 359 359 359 166 166 166 301 301 217 217 473 476 476 476 476 143 458 192 44 44 38 342 342 115 273 432 432 379 379 394 77 68 68 115 418 418 418 418 418 99 99 436 436 60 298 379 379 471 478 66 342 115 273 151 178 416 458 192 242 116 64 76 108 377 123 123 116 10 479 331 331 319 319 319 282 388 303 303 117 48 229 247 15 15 15 193 193 193 17 +103-1240-0054 103 816 1 5 25 11 24 19 31 19 40 30 15 10 5 23 1 11 19 30 23 20 23 5 37 11 33 5 24 15 22 5 31 13 25 31 15 32 5 25 1 31 27 32 20 33 35 22 18 14 31 13 23 16 5 38 15 31 5 24 38 5 33 5 24 14 19 23 5 40 30 19 23 20 16 1 16 6 30 12 5 23 4 33 14 16 13 23 33 18 14 11 7 33 31 5 25 11 16 19 30 40 30 19 37 8 37 19 26 5 25 11 14 12 20 19 25 16 23 36 5 25 31 5 37 24 19 31 19 40 30 15 10 5 23 40 29 13 31 5 24 19 40 5 24 1 38 13 23 5 37 6 23 34 19 26 40 12 5 33 1 13 37 14 38 14 6 30 38 19 23 9 20 1 19 21 4 22 39 36 23 15 33 19 11 24 19 31 19 40 30 15 10 5 23 38 19 25 32 20 38 5 40 31 15 16 23 20 7 33 19 25 12 5 23 15 25 1 7 6 2 3 2 2 4 2 5 3 3 4 4 5 3 3 4 3 3 5 5 4 4 1 2 2 2 3 3 2 4 2 4 4 4 6 2 4 20 6 3 3 3 4 4 2 1 3 4 2 3 3 4 4 10 8 3 4 2 3 5 2 2 6 3 4 3 5 2 2 4 7 7 4 6 2 3 1 4 4 4 3 3 5 3 3 2 4 3 5 6 5 2 2 2 3 3 5 3 4 3 2 3 8 2 3 4 3 2 3 1 3 3 3 4 4 3 1 2 3 3 2 3 3 2 5 2 4 2 3 3 3 2 3 4 2 5 3 2 2 4 2 5 43 3 1 2 2 4 6 3 8 2 7 2 2 3 3 1 6 3 4 9 9 4 4 5 3 4 3 8 10 5 5 3 4 2 1 3 3 3 2 3 2 2 4 2 5 2 4 3 4 2 3 3 2 3 3 2 2 2 5 5 4 2 5 4 5 2 2 1 2 5 6 6 9 17 17 17 363 363 51 51 491 412 412 55 55 55 322 67 33 250 217 473 258 258 258 31 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 329 329 36 310 107 395 302 302 302 497 497 122 122 401 401 401 401 401 384 371 371 286 286 286 286 313 134 359 359 166 166 166 166 301 301 251 251 251 241 266 266 266 266 266 173 173 402 402 6 108 377 87 87 217 473 476 476 476 143 458 192 44 38 68 68 115 273 432 432 330 379 394 77 342 342 115 470 418 418 418 418 99 99 436 436 60 60 298 303 303 48 48 417 417 237 237 237 491 237 2 491 2 2 491 491 491 435 435 491 491 435 435 491 289 373 66 66 115 273 344 496 186 99 400 400 400 30 422 143 36 108 295 295 295 295 295 458 192 156 156 156 186 186 54 172 115 279 279 279 279 279 349 352 29 44 255 255 43 43 276 109 109 403 403 403 207 207 207 207 19 3 454 225 66 66 68 68 68 115 273 231 231 231 231 53 250 250 345 346 426 206 167 167 457 36 108 377 123 399 70 65 65 329 42 42 147 380 288 256 139 175 175 423 423 423 423 271 368 269 142 142 397 147 456 456 456 251 251 241 444 444 444 213 246 246 358 358 173 352 352 352 112 225 225 225 225 225 225 225 373 393 155 155 155 332 332 332 313 216 216 5 5 455 455 251 241 431 486 376 376 460 460 449 449 300 382 382 245 349 349 205 261 25 180 189 139 139 293 122 122 131 183 156 156 156 382 313 313 236 239 239 384 180 180 486 315 113 113 450 450 167 35 270 270 342 224 340 340 340 33 394 76 393 205 261 25 485 286 286 286 286 304 304 304 49 447 142 397 147 456 456 456 456 173 280 106 265 265 265 265 85 85 146 146 173 280 176 176 135 328 200 200 199 89 319 319 348 33 64 212 300 123 216 198 448 448 448 448 464 121 121 121 53 394 76 155 425 425 386 134 88 88 11 11 11 379 471 49 342 168 69 69 223 130 129 196 196 217 473 258 258 258 31 224 224 494 494 494 281 142 142 397 147 329 329 329 329 329 36 449 302 302 302 497 497 31 142 221 336 74 351 351 443 443 150 150 342 342 224 494 494 203 53 459 459 459 368 453 342 168 275 203 203 381 48 13 13 491 491 247 312 312 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 260 260 260 260 260 260 391 391 391 491 491 73 491 320 345 109 139 175 175 81 223 130 280 280 106 297 297 297 297 297 297 293 293 349 349 352 164 164 164 164 164 214 214 214 214 200 200 200 200 471 471 49 453 198 114 45 45 385 457 14 401 226 82 209 463 463 463 463 463 280 29 382 382 382 245 245 43 43 364 364 276 276 109 347 347 498 498 59 59 59 245 14 14 411 157 157 157 372 372 245 245 43 43 364 276 109 109 329 139 139 293 497 122 8 354 420 41 41 41 19 19 454 454 417 417 417 417 237 47 80 491 80 491 435 435 209 188 177 177 236 36 107 395 180 486 486 460 178 178 458 192 485 469 134 175 158 158 158 158 158 325 449 191 191 191 314 314 196 217 473 258 258 258 342 342 494 494 494 281 9 142 397 397 147 329 329 329 329 329 143 310 107 395 302 302 497 497 43 364 345 409 409 409 116 314 76 465 400 400 400 301 378 345 141 141 141 31 232 232 68 68 115 273 470 171 171 171 252 349 349 402 26 359 166 166 166 324 464 464 113 113 113 113 169 167 36 449 34 340 340 466 466 22 283 455 497 251 251 241 431 431 290 290 290 434 434 339 339 117 404 13 229 491 247 15 15 15 193 193 193 17 +103-1240-0055 103 562 1 19 33 11 5 40 30 20 23 20 31 20 24 13 40 19 16 8 24 5 31 33 9 20 11 30 20 24 19 26 1 38 13 23 8 24 31 3 30 20 16 6 30 12 4 33 29 36 30 39 5 26 38 5 25 4 25 11 25 27 24 19 31 33 15 22 1 24 4 34 39 36 5 25 11 24 3 30 19 23 5 11 27 25 27 13 25 20 34 19 26 5 9 7 33 10 19 23 11 30 5 25 1 5 25 11 12 15 23 19 22 31 29 13 22 33 19 24 33 19 9 20 38 8 40 14 5 25 11 31 33 13 11 20 14 12 5 33 18 19 40 27 25 17 30 4 25 16 3 12 14 1 12 6 2 3 3 6 3 2 4 3 7 4 3 1 4 2 4 3 3 2 3 1 2 2 4 2 4 2 2 7 47 3 2 4 4 3 6 2 4 3 4 1 2 2 4 3 6 4 2 5 4 5 3 2 2 2 2 2 4 3 2 3 5 3 5 7 15 5 5 4 2 5 1 2 1 2 1 5 2 3 3 5 4 5 8 1 4 3 3 2 3 2 2 7 2 4 2 3 3 2 2 5 5 6 1 2 1 3 3 3 2 3 3 2 4 3 2 3 3 1 2 4 6 4 6 3 2 2 2 4 4 1 3 3 3 3 2 1 2 1 3 7 5 3 2 4 5 4 4 2 7 9 17 17 17 363 363 363 51 51 228 184 491 491 320 188 177 177 177 177 143 401 82 384 71 71 71 71 71 453 9 142 221 336 155 487 288 485 278 26 359 166 166 166 166 422 162 232 232 68 68 444 444 444 360 360 339 53 53 473 253 253 453 342 168 118 118 349 402 25 111 111 111 438 399 70 65 319 169 150 342 105 221 336 420 420 422 236 239 161 79 79 288 288 360 360 360 203 53 176 176 328 328 200 303 48 13 491 491 312 312 312 312 312 292 292 292 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 369 21 21 21 21 21 21 21 21 21 21 21 260 260 260 391 391 391 391 491 491 491 320 320 346 346 84 139 139 175 175 81 111 111 111 438 203 53 478 478 232 232 172 115 106 106 153 153 372 372 337 337 337 301 349 155 155 332 332 332 240 216 114 92 92 92 167 457 35 401 259 74 74 441 441 441 153 153 153 372 372 396 313 219 219 219 219 180 180 319 319 348 348 248 250 250 276 174 174 174 388 94 199 89 89 446 116 10 10 309 479 331 84 84 496 399 399 473 65 459 31 31 342 86 86 238 6 470 470 470 171 171 171 358 24 458 192 419 419 439 439 417 237 237 237 237 237 237 237 237 237 237 237 237 237 80 7 7 217 473 65 329 486 460 460 169 169 164 164 25 485 485 485 378 378 88 89 89 116 33 250 70 65 329 329 245 42 147 134 134 139 175 175 423 423 423 423 314 314 239 384 371 180 84 350 350 167 457 309 479 331 84 84 88 88 14 14 411 475 475 475 475 475 475 475 475 422 349 164 214 214 214 214 200 200 255 255 8 354 113 113 113 113 450 167 167 457 36 310 107 107 395 395 106 153 153 122 122 285 300 300 300 275 275 94 117 404 13 414 80 80 491 491 412 412 83 55 55 55 322 67 64 212 114 0 0 139 139 175 81 154 154 154 458 96 66 68 105 105 336 470 151 151 178 35 96 401 36 272 57 57 57 203 64 394 76 377 87 87 87 420 420 420 420 301 43 364 276 346 346 265 265 265 85 146 146 368 453 9 300 300 382 406 467 89 89 446 33 394 478 68 68 68 238 6 272 470 470 443 240 325 41 324 324 286 459 459 469 216 198 114 242 446 94 199 257 257 257 453 168 106 350 350 350 350 350 413 195 195 33 90 32 465 208 79 380 288 365 365 365 365 388 348 64 76 90 393 261 25 91 91 91 91 493 216 300 334 334 59 452 263 229 247 126 126 326 326 326 326 193 193 17 +103-1240-0056 103 715 1 19 33 31 20 24 40 5 25 22 4 25 20 33 19 34 19 26 22 5 37 5 10 8 23 11 4 33 17 30 20 25 17 15 9 5 23 40 31 5 24 18 7 1 12 13 30 40 25 13 37 14 9 19 25 38 5 25 12 13 30 16 6 30 24 4 34 39 36 5 25 11 24 3 30 19 23 5 38 14 17 30 27 25 5 29 38 13 25 12 5 25 39 36 18 7 31 38 5 40 9 19 23 33 1 19 16 12 15 13 37 14 38 14 10 19 23 11 30 5 25 1 38 19 10 19 40 18 3 30 11 33 5 9 19 23 20 37 38 13 25 38 5 25 23 35 22 31 4 33 12 5 24 1 8 38 35 11 5 25 33 9 20 19 25 12 4 33 6 30 16 5 25 40 32 36 40 16 14 13 25 20 34 19 26 1 11 5 5 5 5 4 2 6 7 13 2 2 5 3 2 2 2 1 2 2 2 2 8 4 3 3 1 3 3 2 4 3 2 5 2 2 3 2 4 3 3 2 9 21 3 1 2 3 2 1 4 2 2 4 3 4 3 3 2 4 5 6 2 3 4 5 4 2 4 2 2 1 2 1 5 3 4 6 3 2 4 3 5 4 3 5 2 3 2 2 2 2 3 4 5 5 4 2 2 3 3 2 6 8 16 6 3 2 6 3 3 3 7 7 6 2 3 3 3 2 3 16 4 2 4 2 3 2 3 3 2 2 2 2 1 4 5 4 1 2 2 4 2 3 2 2 4 3 2 2 3 3 5 38 11 4 3 2 2 2 2 2 8 2 3 3 3 2 4 4 3 2 4 2 6 7 5 4 4 3 3 4 3 2 7 7 17 17 17 296 296 317 491 491 184 184 184 412 177 177 177 177 177 177 401 478 66 66 68 68 115 444 444 444 444 360 339 339 53 471 71 342 342 483 440 287 319 319 319 388 348 195 195 90 90 143 401 491 445 445 445 351 351 72 72 351 365 365 365 365 330 94 199 41 41 324 324 143 36 377 87 87 87 164 214 214 214 200 200 192 69 223 130 29 44 44 236 36 310 107 395 351 437 91 91 91 85 139 139 293 122 35 198 45 191 236 131 90 401 82 208 79 288 360 360 360 434 339 248 248 212 445 180 171 171 171 252 215 8 100 100 497 497 497 269 342 68 68 115 273 231 231 231 203 94 58 58 268 268 315 268 450 450 98 98 229 82 247 312 312 126 292 292 292 292 23 23 23 23 408 408 408 391 391 491 491 491 289 289 127 114 0 0 313 186 447 196 479 463 463 463 463 29 29 382 245 8 354 137 137 137 137 116 250 250 250 276 174 174 174 319 319 348 466 466 212 127 114 264 264 264 264 59 59 452 245 349 205 155 155 332 332 332 332 372 245 245 217 217 473 65 486 486 460 460 169 164 164 164 219 219 485 485 132 88 88 89 89 446 33 250 70 65 65 329 495 42 147 380 288 139 139 175 175 423 423 423 423 423 355 245 43 345 347 347 347 245 416 32 239 208 79 380 499 84 496 496 274 274 413 94 479 230 230 230 230 215 35 401 491 354 345 409 409 409 409 466 466 466 22 283 455 116 10 398 398 398 398 132 132 58 58 72 72 268 268 268 268 268 169 169 39 54 142 397 397 141 141 281 54 9 221 336 336 354 180 139 139 139 375 375 274 122 122 227 227 419 439 439 439 417 237 237 237 237 237 47 47 491 47 316 316 491 316 73 491 289 435 188 118 118 118 118 118 402 198 198 0 0 0 0 464 464 464 463 463 463 463 280 29 382 382 245 245 43 364 276 347 347 347 498 498 396 396 313 313 24 36 310 107 107 395 395 106 153 153 387 122 122 161 161 487 334 275 275 116 117 48 229 229 247 126 126 126 326 326 326 326 326 101 101 149 149 228 491 320 320 345 407 407 407 143 107 395 356 257 257 281 9 142 72 437 306 306 306 306 396 313 186 36 377 87 87 87 8 354 425 251 251 241 444 444 444 444 246 246 173 402 402 397 409 409 409 116 250 250 276 174 174 174 319 348 466 250 241 367 367 367 367 35 458 270 270 342 224 415 415 415 457 259 127 114 57 57 203 203 381 48 48 13 13 491 247 312 126 126 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 391 391 391 391 491 491 289 412 287 287 111 111 111 111 111 438 378 378 364 389 389 389 389 389 314 242 242 242 33 76 76 465 259 354 420 420 420 324 246 3 464 340 340 340 116 466 466 466 114 92 92 92 92 285 34 106 106 153 372 372 396 245 349 349 352 25 242 242 116 33 471 49 49 9 482 338 338 338 395 485 374 374 374 132 132 318 318 49 269 9 142 393 155 332 332 332 332 332 467 467 475 475 475 475 475 475 475 475 422 349 164 214 214 214 214 214 200 200 117 404 404 404 225 225 225 225 225 193 193 +103-1240-0057 103 342 1 24 8 9 5 33 8 29 19 33 20 18 19 24 1 12 4 33 31 38 5 33 1 31 27 31 13 11 24 19 31 19 40 30 15 10 5 23 33 5 12 5 38 8 23 11 30 27 40 9 35 32 5 40 7 33 5 37 12 5 16 5 23 25 5 31 5 37 18 14 18 3 30 33 1 9 6 12 2 2 3 5 7 2 2 6 2 2 8 6 3 4 3 4 3 3 8 46 8 7 7 4 3 4 3 3 3 5 2 4 4 2 3 4 2 2 3 5 8 3 4 4 4 6 3 2 5 4 4 5 3 2 2 1 3 5 2 4 2 3 4 2 2 2 3 5 3 4 6 6 17 17 296 363 363 363 225 225 289 7 7 7 70 70 65 65 284 284 284 265 265 265 85 85 146 146 438 8 354 159 159 285 285 111 111 111 111 438 438 143 129 259 74 74 351 278 278 278 325 183 41 41 324 324 3 183 183 57 57 57 57 203 381 381 117 117 417 417 417 417 417 417 80 80 320 127 114 92 92 92 92 240 35 77 342 9 142 397 336 181 181 181 181 181 385 385 36 227 419 439 439 417 417 237 237 237 237 237 237 237 237 237 237 491 362 491 491 362 491 491 362 362 362 362 491 435 211 211 491 369 369 21 21 21 21 21 21 21 21 21 260 408 408 391 391 391 228 491 491 373 66 66 68 115 273 273 344 344 344 16 274 274 186 186 162 232 68 172 115 470 179 443 120 240 240 314 35 196 217 217 473 258 258 258 342 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 252 143 36 449 395 302 302 302 497 122 36 36 377 123 123 123 216 22 283 455 43 364 364 276 346 346 346 346 265 85 85 85 139 139 293 293 122 122 131 472 133 147 147 380 288 496 496 496 274 368 31 342 86 142 336 336 354 109 496 278 99 99 436 395 50 50 50 50 185 453 342 168 180 113 113 113 113 169 285 449 34 69 223 130 198 22 283 283 455 349 234 234 261 25 424 424 424 497 497 122 466 81 459 459 271 31 342 224 69 69 130 130 280 156 156 156 156 245 245 72 72 437 306 306 306 306 306 396 396 37 24 227 419 419 427 229 491 247 15 193 193 193 +103-1241-0000 103 798 1 10 4 29 33 14 33 36 1 24 4 34 39 36 22 5 34 9 14 33 1 19 40 31 5 29 30 8 40 11 1 24 4 34 39 36 22 5 34 9 14 33 4 25 11 12 5 31 6 30 5 23 24 13 30 21 3 17 11 22 5 24 16 14 33 5 9 23 20 27 37 14 12 20 15 33 24 8 23 40 33 5 9 30 8 33 30 19 37 14 1 19 33 38 5 40 5 29 30 19 33 20 30 27 11 1 30 5 25 19 26 5 23 6 26 9 19 33 38 20 25 31 25 5 17 16 3 30 24 31 33 13 11 40 38 19 34 25 7 5 25 11 5 17 13 25 1 5 9 19 33 5 37 1 2 16 14 38 35 11 33 19 11 30 8 37 34 30 36 1 10 5 3 3 3 3 6 10 31 6 4 4 2 3 4 5 4 3 5 2 1 4 3 2 3 3 3 8 6 5 71 5 6 3 3 3 6 5 4 3 6 2 3 2 1 2 2 6 2 3 4 3 5 5 5 7 6 3 5 5 2 3 2 1 2 2 3 2 5 6 2 3 2 5 6 4 5 4 4 4 2 2 3 3 4 5 3 3 3 8 23 5 1 2 2 3 3 4 2 2 2 4 5 8 5 3 7 2 3 3 5 3 4 6 4 2 2 5 2 3 5 6 2 5 4 7 3 3 3 3 4 4 4 3 2 4 5 4 7 1 2 1 2 5 8 5 12 6 3 2 2 2 4 2 24 9 8 5 4 3 2 3 3 3 6 2 7 3 7 6 17 17 296 296 317 184 184 184 184 289 320 108 119 351 351 486 460 460 215 96 35 272 300 382 382 313 236 129 75 108 119 351 351 374 374 374 374 132 132 98 98 13 417 417 170 170 170 170 442 491 442 442 312 187 442 12 102 102 12 442 12 12 23 260 260 260 260 260 391 391 316 289 289 289 320 7 217 70 473 486 486 486 460 169 169 35 164 219 485 485 374 132 143 129 321 144 27 351 329 329 329 169 352 164 221 221 321 354 29 382 382 396 313 24 131 483 226 321 188 356 356 31 162 232 172 224 494 494 494 129 74 190 190 499 499 499 265 265 265 85 85 299 299 185 185 433 433 86 238 6 419 439 56 56 237 237 237 237 237 28 28 28 491 28 28 362 362 491 362 491 305 362 362 362 362 491 491 218 40 362 218 218 218 218 491 218 491 218 218 218 218 218 218 218 218 491 491 218 218 218 491 491 369 369 491 369 369 369 369 369 369 369 21 21 21 21 21 101 101 101 149 391 228 321 321 320 7 217 217 473 486 486 486 460 460 169 169 164 164 485 485 485 374 132 143 129 458 144 27 27 351 329 329 151 169 169 164 352 221 221 321 354 29 334 334 59 59 313 24 131 483 440 89 55 446 322 466 22 5 455 38 162 482 482 172 115 273 106 499 372 406 406 467 302 302 497 497 497 497 399 217 217 473 65 264 264 264 264 468 468 468 467 37 236 314 401 401 310 107 395 180 106 499 405 405 206 206 178 96 96 272 472 472 472 401 321 144 27 27 437 319 319 319 53 53 76 205 155 29 134 134 134 134 8 359 359 474 474 474 3 335 14 411 410 410 410 410 410 173 29 29 313 313 216 22 448 448 448 14 411 411 171 171 171 171 252 252 131 472 196 196 70 70 65 65 265 265 85 85 139 450 293 497 49 54 86 238 272 377 123 236 129 259 190 380 499 499 428 428 146 146 358 457 457 133 42 147 380 380 288 288 173 173 29 334 334 59 59 452 452 263 229 491 312 312 312 312 292 292 292 1 1 1 1 1 21 21 408 408 408 408 149 149 289 321 321 412 177 177 177 177 131 133 141 141 141 281 453 168 44 44 44 129 259 190 190 487 288 278 240 325 34 324 324 301 378 42 147 147 380 84 84 496 496 496 496 274 274 37 24 419 439 225 417 417 80 321 320 7 7 147 147 380 499 319 319 348 94 199 176 176 135 135 135 200 200 199 255 255 255 251 251 241 241 431 235 235 235 235 235 235 200 248 248 212 354 255 236 36 108 397 397 487 360 360 360 360 339 339 33 33 394 478 478 232 68 172 115 196 479 331 331 151 319 151 240 416 314 96 393 393 234 234 234 261 25 106 306 306 306 306 396 203 53 394 478 162 86 86 6 272 470 470 120 120 120 37 37 24 77 270 9 142 397 345 333 333 333 220 220 173 164 164 402 472 196 309 479 331 331 315 315 315 450 88 88 242 116 94 199 255 255 416 416 458 445 445 361 361 361 120 120 282 282 282 388 195 117 117 229 247 247 126 126 326 326 326 326 101 101 149 149 321 412 287 44 44 44 215 35 354 278 278 325 34 462 462 462 402 402 401 401 321 259 354 106 106 481 481 481 293 293 186 39 342 224 224 494 242 203 217 473 41 324 324 422 422 349 234 234 234 234 234 261 261 25 498 498 498 498 396 245 245 43 43 364 345 109 109 496 496 496 37 24 314 36 108 377 87 87 236 239 161 161 79 499 499 499 265 85 85 146 146 173 402 402 205 205 234 161 161 487 487 487 374 374 374 132 132 132 98 229 247 15 15 193 193 17 +103-1241-0001 103 777 1 6 30 5 18 3 23 27 38 13 30 38 8 23 11 29 23 5 24 40 18 5 26 7 33 12 13 30 16 19 23 24 20 9 23 36 24 1 12 20 13 30 38 5 40 31 38 20 33 38 19 34 12 5 9 30 13 34 5 37 24 13 25 20 1 4 29 5 23 6 30 10 14 11 40 1 5 25 11 12 5 24 13 11 27 40 31 23 27 29 33 5 38 15 19 25 12 5 11 19 31 33 5 25 31 33 5 18 14 8 40 5 25 24 19 31 33 31 5 37 29 14 23 5 25 11 1 29 14 29 5 23 38 8 23 12 5 23 19 33 5 23 9 14 11 40 31 4 26 13 40 19 16 19 33 38 14 12 5 38 5 25 11 15 5 37 31 5 24 14 19 25 6 23 12 20 39 19 30 1 7 5 3 3 6 3 5 7 2 4 4 5 7 3 4 6 2 3 7 5 4 2 5 5 4 3 3 3 6 3 3 3 4 4 3 8 8 29 5 4 7 5 3 1 3 6 3 4 5 2 1 3 2 2 5 3 5 5 1 5 3 2 3 6 4 6 4 2 4 5 3 7 4 3 5 11 6 2 2 1 2 5 3 3 6 3 9 3 3 4 2 4 4 5 2 3 1 2 4 3 5 3 2 4 3 3 2 4 7 8 6 2 7 3 3 5 6 3 2 3 9 9 5 3 2 4 1 4 4 5 2 7 7 8 4 3 2 4 2 2 3 2 4 7 5 2 5 6 6 3 4 2 4 2 6 4 6 3 4 6 3 7 2 6 2 3 7 2 5 2 3 4 5 7 3 2 6 3 11 17 17 17 363 51 51 51 228 321 320 157 157 157 157 372 467 44 44 44 58 72 72 72 437 437 481 481 481 481 175 175 81 84 84 84 16 274 274 274 43 345 345 109 109 264 468 245 245 245 43 364 276 276 346 346 284 265 85 85 85 139 139 293 293 122 122 472 221 129 321 75 74 425 425 386 431 319 319 319 319 203 203 381 381 381 471 185 49 342 342 342 142 72 437 189 189 189 319 189 200 200 180 180 113 113 113 113 167 167 457 401 321 75 127 114 222 222 222 468 245 349 349 234 205 205 261 25 278 139 139 139 293 203 399 70 429 324 324 324 301 32 239 259 354 425 425 241 374 374 374 374 374 132 132 132 381 381 381 381 404 13 13 78 170 170 491 491 491 491 28 491 341 211 341 12 292 292 21 21 21 21 21 21 21 21 408 408 408 408 149 228 321 321 320 7 127 5 448 448 14 14 411 411 264 264 264 264 264 468 468 468 245 43 43 345 141 141 281 162 54 232 482 482 105 397 397 109 109 213 213 213 358 358 36 36 472 397 397 333 333 220 220 314 198 127 22 283 455 236 129 321 354 190 79 380 288 443 443 443 169 169 164 164 164 164 69 69 130 130 402 402 196 217 217 473 432 330 116 94 337 324 324 324 3 3 197 197 226 226 209 209 145 145 486 460 460 215 215 35 29 100 302 497 497 335 14 411 153 153 153 372 372 396 396 36 36 107 107 395 334 334 334 59 37 37 24 471 270 269 433 427 427 247 247 126 126 326 326 326 326 408 149 149 149 321 412 83 55 55 55 322 466 466 22 5 5 455 399 217 217 473 65 443 443 443 240 325 34 84 84 84 496 274 274 186 162 54 482 482 482 482 482 482 26 26 26 241 431 84 496 496 496 215 35 96 96 36 272 255 255 255 43 364 109 109 403 403 403 171 464 464 340 340 116 466 466 22 283 455 236 239 384 371 278 278 278 31 342 86 86 238 6 272 11 11 11 379 379 471 471 49 9 238 6 272 87 87 87 58 72 156 156 255 42 42 147 147 380 499 499 265 265 85 85 146 146 368 368 368 342 342 224 242 242 116 116 33 33 33 90 250 217 217 473 473 278 278 278 31 39 86 86 238 238 401 491 270 270 270 342 168 69 462 462 130 402 221 401 321 321 74 190 190 437 498 498 498 498 498 498 134 16 302 182 302 302 497 175 175 81 89 89 446 446 67 212 131 472 221 401 321 74 190 492 492 498 498 498 215 215 35 259 74 100 100 100 100 375 375 375 375 98 43 7 7 7 276 346 346 346 346 315 85 85 85 139 139 293 293 293 122 35 198 22 5 5 251 251 241 431 278 278 285 449 302 302 497 497 497 8 8 259 354 29 498 498 498 498 498 396 37 37 314 77 478 232 232 232 172 115 115 273 470 486 486 365 365 365 365 328 200 200 200 248 253 253 253 31 342 342 168 118 118 118 118 280 29 177 177 177 314 131 133 364 364 276 347 347 347 347 498 498 467 313 313 216 216 22 283 283 455 43 43 364 276 174 174 174 174 319 319 348 348 195 195 195 64 212 212 93 93 93 93 93 464 464 69 462 130 402 402 162 232 68 172 115 273 273 319 319 203 53 53 29 29 495 467 467 89 340 116 94 335 14 14 411 411 297 297 297 297 297 182 182 497 122 216 216 22 283 448 219 219 219 219 286 286 286 286 286 286 286 59 59 59 452 452 263 417 417 417 491 491 421 421 491 421 128 128 491 128 491 128 128 193 193 193 17 +103-1241-0002 103 778 1 24 4 34 39 36 19 25 21 28 11 12 5 11 30 8 37 4 16 33 14 18 19 40 27 25 16 4 32 5 25 1 19 22 31 13 29 33 11 14 19 26 12 5 24 27 24 5 25 33 31 38 19 25 18 20 24 13 33 38 19 24 5 25 5 25 11 18 4 11 33 5 25 3 11 33 5 12 5 24 1 16 6 30 19 25 29 30 19 25 31 13 11 38 14 11 8 23 5 25 11 39 36 14 31 5 29 27 40 11 33 19 25 3 11 33 36 6 23 5 25 11 31 5 25 11 30 20 39 36 24 20 33 3 25 12 5 30 27 11 1 38 13 12 14 39 36 25 27 12 5 24 14 25 3 33 1 24 4 34 39 36 11 30 13 11 19 11 6 23 38 19 24 5 25 19 22 31 13 29 33 24 3 30 19 23 5 4 25 11 24 19 31 19 40 30 15 10 5 23 1 20 6 5 3 2 3 3 4 3 6 3 2 1 3 4 6 3 4 3 3 1 2 1 4 6 3 5 5 7 2 7 17 4 3 3 4 1 2 3 2 3 2 2 3 3 4 4 2 1 2 2 2 2 1 5 2 5 3 5 3 3 3 3 3 2 2 1 5 2 2 4 2 5 7 3 4 2 3 2 8 17 6 4 3 3 3 3 2 2 4 3 3 3 2 2 2 7 4 3 2 2 2 5 3 3 2 3 5 5 1 2 2 3 6 2 2 3 8 5 3 2 3 6 2 3 2 2 2 4 3 3 3 3 3 2 2 3 4 7 4 13 4 3 2 2 3 3 4 5 2 2 3 4 3 8 6 39 6 7 3 4 3 3 4 2 2 3 8 9 8 3 3 3 4 4 4 4 4 2 4 3 5 1 2 3 4 3 3 2 4 1 3 4 2 5 3 4 4 4 6 10 17 17 17 296 296 52 52 52 52 52 52 52 52 52 408 101 51 149 149 321 321 7 7 217 473 65 329 329 460 460 169 164 164 485 485 485 485 378 88 121 121 121 116 33 394 239 107 395 470 153 153 387 387 146 146 314 35 259 22 283 455 236 239 161 79 79 499 499 265 85 85 85 146 173 173 280 145 145 460 460 460 169 402 36 272 495 495 467 257 257 257 257 342 168 180 84 350 350 350 350 413 33 394 90 393 234 261 261 25 486 486 486 460 460 169 99 436 436 436 60 298 298 298 275 303 303 117 404 229 491 247 126 126 126 326 326 326 326 326 326 408 408 408 149 228 321 321 412 188 154 154 154 96 96 172 172 273 470 151 151 215 215 96 36 272 161 495 495 467 467 135 135 200 248 466 22 283 455 399 399 70 65 65 84 496 496 203 53 53 291 291 379 379 49 9 142 397 345 409 409 409 409 58 183 451 30 30 30 301 399 217 217 473 443 443 443 240 36 449 472 133 133 364 276 109 278 278 278 399 217 473 136 275 275 116 195 199 89 89 322 67 199 58 110 110 110 110 254 254 314 35 401 75 377 87 87 87 10 10 309 479 331 331 284 284 405 206 206 206 314 314 401 75 108 377 123 123 123 216 114 114 57 57 57 381 381 381 48 48 229 414 491 312 312 126 292 292 23 23 23 23 23 101 260 391 391 228 289 321 321 373 155 155 332 148 148 387 387 372 406 467 467 242 121 203 53 394 76 74 190 190 487 288 330 379 33 394 77 342 342 273 470 443 240 240 133 133 133 345 382 313 285 14 411 284 265 85 85 146 146 175 175 175 81 275 275 275 116 64 212 131 219 152 152 152 378 353 353 353 313 186 54 54 224 494 236 259 74 437 496 496 496 496 274 186 186 323 238 238 6 272 87 87 116 10 479 331 106 284 405 206 206 167 35 75 377 377 123 123 14 14 411 411 411 297 424 297 182 182 293 293 175 175 89 89 446 446 33 394 478 478 232 232 172 172 273 273 319 319 348 64 64 212 161 300 337 41 219 219 219 219 152 152 152 399 217 473 213 213 213 252 449 449 106 125 125 125 125 466 22 283 455 42 42 147 380 380 84 496 496 496 496 274 274 37 24 404 427 321 247 126 126 326 326 326 101 101 149 149 149 321 321 320 7 345 109 409 181 240 216 300 300 300 219 219 152 152 152 152 10 10 479 331 84 84 84 274 216 216 114 57 203 399 70 157 157 157 157 313 10 479 331 331 307 307 307 307 61 167 167 233 227 227 419 439 417 170 170 170 170 28 491 28 28 491 491 28 362 491 491 40 305 305 305 40 40 40 40 40 40 163 491 491 366 366 366 163 491 316 316 491 435 289 321 321 320 7 217 217 473 65 486 486 486 460 460 169 169 164 164 485 219 219 485 152 152 301 422 239 36 161 79 79 288 288 443 240 325 34 191 191 191 314 131 472 14 14 226 321 321 411 297 297 297 297 297 297 297 297 297 297 293 497 497 497 122 43 364 276 109 109 278 278 399 217 473 136 275 275 275 195 195 195 335 440 440 154 154 154 458 96 96 68 172 273 470 151 151 215 35 96 272 472 472 472 196 70 70 70 65 495 495 380 467 256 139 175 251 241 423 423 423 423 355 89 89 446 116 33 250 250 217 473 258 258 258 342 342 224 494 494 494 31 9 142 142 397 147 147 329 329 329 329 329 143 36 310 107 395 302 302 302 375 98 98 13 229 491 247 312 15 15 15 15 193 193 193 17 +103-1241-0003 103 694 1 18 20 18 4 11 5 25 5 25 22 5 24 16 14 33 5 9 5 23 16 20 23 19 26 1 12 5 33 12 5 24 19 31 33 19 30 20 5 31 22 30 20 10 14 40 38 14 31 20 22 30 19 33 23 20 23 4 16 19 26 4 33 18 19 24 1 18 20 24 15 18 4 37 9 19 25 22 38 8 33 30 8 33 19 25 34 19 26 22 19 26 31 27 1 16 6 30 18 20 38 5 40 5 25 1 3 11 23 35 22 19 26 29 14 31 19 25 19 21 1 38 19 12 5 25 5 25 17 15 25 23 20 16 19 17 39 14 1 4 25 11 23 6 26 1 8 14 25 17 30 15 18 13 30 12 5 33 5 10 33 18 19 40 31 33 36 29 19 26 32 27 23 11 14 40 1 12 4 2 6 1 2 2 3 3 4 5 3 3 2 2 1 2 2 2 3 8 5 2 3 7 11 2 2 1 2 2 2 2 6 3 2 3 3 4 4 5 3 3 5 3 4 2 2 7 3 3 2 3 2 2 4 7 6 5 2 5 3 3 3 2 8 19 4 3 4 3 1 2 2 1 2 3 3 3 5 3 3 4 3 2 3 3 1 4 3 2 5 4 9 14 5 2 2 3 2 2 2 3 2 5 1 9 2 3 2 4 2 4 5 4 5 2 1 4 12 1 3 2 2 2 2 4 5 3 8 4 1 4 9 3 3 2 6 14 5 2 6 1 9 7 1 13 2 7 3 3 8 8 6 4 3 1 8 4 7 2 1 2 3 8 3 4 3 2 4 7 4 3 3 5 6 7 17 17 17 363 363 363 363 363 408 51 51 491 321 451 451 30 30 30 58 72 110 110 110 254 254 254 285 44 44 44 94 199 331 319 319 319 348 394 76 465 144 27 27 437 319 319 319 53 53 77 205 155 29 6 134 134 134 8 354 100 100 100 497 349 349 234 234 234 261 261 25 485 213 485 286 139 139 175 175 81 176 176 328 328 200 200 117 229 321 247 126 126 326 326 326 101 408 149 228 321 321 45 45 45 45 198 22 5 455 399 473 473 494 38 162 232 232 86 238 6 272 485 485 286 468 468 337 337 485 324 459 459 271 31 54 9 142 221 336 259 208 208 190 487 288 213 213 213 252 36 310 107 395 334 334 304 304 49 269 142 397 397 141 141 281 162 232 232 172 115 273 444 444 213 252 143 458 208 79 487 313 236 143 36 26 359 166 166 166 324 301 251 251 251 251 241 241 431 376 376 376 460 460 169 169 352 164 164 25 176 135 328 200 464 464 415 415 415 415 415 36 131 183 57 57 57 57 57 381 381 48 48 417 417 170 170 170 28 491 28 491 341 491 341 341 491 163 491 491 316 316 316 321 435 289 373 451 451 30 30 301 399 217 473 65 476 476 464 464 202 202 202 8 137 137 137 116 90 90 76 208 441 441 346 346 428 428 146 146 24 35 133 133 147 380 499 428 428 428 146 143 449 449 89 340 116 394 212 164 164 214 214 360 360 200 76 465 192 192 176 135 200 200 248 248 478 342 172 115 273 84 84 84 84 274 98 13 229 247 312 126 126 292 326 326 23 23 101 101 101 149 391 228 321 321 155 155 155 148 148 372 58 183 451 30 30 378 378 141 141 141 281 342 168 44 44 44 94 199 335 14 14 411 284 284 284 405 405 206 206 240 314 26 26 241 241 367 367 367 458 321 192 176 135 200 200 248 248 465 259 74 74 492 492 492 492 271 150 342 342 224 224 242 116 199 459 459 469 469 37 24 75 310 107 107 447 97 225 225 80 321 321 320 345 333 333 220 220 22 44 44 94 199 331 319 319 319 348 348 33 394 394 212 239 445 180 290 290 290 290 434 434 434 339 33 359 359 81 166 324 324 422 422 349 234 234 234 234 261 25 25 278 278 278 416 458 192 300 334 334 355 355 452 263 229 247 247 126 126 326 326 326 326 101 101 149 149 228 321 412 83 55 55 446 322 67 33 33 250 251 251 241 241 431 235 235 235 235 235 235 235 235 235 348 200 200 200 248 335 14 14 14 226 209 287 265 265 265 85 85 146 146 146 299 242 242 339 195 195 248 248 212 239 208 79 79 288 288 403 403 403 171 171 171 3 58 58 72 72 72 72 110 264 264 264 264 264 264 264 468 468 59 313 216 216 127 45 45 45 236 129 75 108 119 351 351 151 151 151 169 178 36 310 447 447 447 6 272 257 257 257 257 257 99 338 338 338 447 482 238 238 336 321 75 371 374 374 374 374 215 129 354 176 176 176 328 200 200 248 248 186 338 338 338 395 470 106 424 424 424 424 497 122 122 131 300 334 334 304 304 185 185 269 9 427 229 247 247 15 15 193 193 193 17 +103-1241-0004 103 737 1 5 25 11 5 16 35 23 31 6 16 33 9 30 7 25 9 19 30 11 1 38 19 10 18 20 18 4 11 38 6 30 25 13 37 14 31 19 25 31 18 20 38 5 40 33 38 13 25 33 20 1 19 25 16 4 22 33 1 18 20 18 4 11 23 35 22 33 4 33 38 13 25 33 20 1 37 13 30 20 24 5 10 13 40 18 20 23 35 22 33 4 33 31 19 22 31 33 20 1 23 4 22 19 26 5 23 19 33 5 23 5 37 12 5 17 30 15 25 5 31 1 18 38 13 25 18 20 30 20 10 33 9 30 8 33 30 19 37 14 1 12 13 30 38 5 40 25 27 31 8 25 5 37 13 25 20 33 30 15 25 1 8 4 2 2 3 9 11 4 9 6 5 4 4 2 9 7 3 7 5 7 2 3 3 3 2 1 2 1 5 3 3 3 2 2 4 2 4 2 3 2 1 2 2 1 4 3 2 2 3 3 9 40 5 4 4 9 3 4 17 5 3 2 3 3 4 3 4 2 3 7 2 2 3 3 10 5 6 3 2 4 4 3 4 2 2 2 3 2 3 3 2 2 3 4 2 3 3 3 8 14 7 4 4 3 4 2 3 2 2 3 2 2 3 1 2 3 3 4 3 5 13 72 5 2 2 2 3 3 4 4 4 5 2 3 5 6 3 3 3 9 6 4 2 3 3 2 5 4 6 7 6 3 2 3 2 3 3 6 2 5 9 4 17 17 17 363 363 51 51 228 321 412 55 55 322 67 212 34 44 44 462 349 234 234 234 234 234 261 261 25 424 424 424 424 424 182 182 182 497 497 497 497 497 497 186 186 162 482 482 482 482 115 115 273 106 405 405 405 405 206 169 349 352 352 402 6 272 472 221 336 336 354 190 380 288 315 315 315 315 450 450 450 413 413 348 33 33 33 394 394 32 239 75 354 485 213 286 286 286 286 286 286 334 59 59 37 37 24 131 404 225 225 225 225 225 320 345 407 407 407 407 36 107 107 400 30 30 464 254 254 254 314 133 133 364 276 276 153 153 153 387 372 396 388 94 199 145 463 463 173 280 29 313 186 162 342 342 224 494 379 379 379 77 342 224 30 30 378 345 141 141 281 31 9 6 272 119 397 441 109 432 330 348 64 64 76 449 41 41 41 41 19 19 454 13 417 170 170 170 491 28 28 28 28 491 491 2 2 2 491 362 362 102 362 362 362 491 362 362 491 305 305 366 366 366 366 366 435 435 316 316 435 435 435 289 321 321 321 209 188 340 340 33 33 90 349 205 234 261 25 470 486 376 376 376 376 460 460 178 178 233 96 75 419 427 321 247 126 126 126 326 326 326 326 326 326 326 101 408 408 408 149 321 321 373 451 451 30 30 30 58 58 110 254 254 254 254 314 26 26 251 241 367 367 367 367 367 35 96 321 75 34 415 415 415 385 314 259 108 119 397 441 441 432 330 330 379 64 76 36 449 41 41 41 41 19 19 454 454 454 414 47 47 80 80 80 321 321 7 7 32 280 104 104 104 104 104 337 337 337 324 301 399 217 383 383 383 383 383 383 310 107 34 253 253 253 342 224 30 30 30 301 26 241 367 367 367 35 96 321 272 34 415 415 143 478 478 68 68 115 273 278 278 178 96 96 86 86 238 6 272 41 41 41 19 19 454 417 417 417 47 47 47 47 491 47 47 47 80 249 435 435 321 321 321 7 7 251 241 241 431 376 376 460 178 178 458 192 192 176 176 135 200 200 200 464 255 251 251 241 431 278 278 278 26 26 302 302 175 175 69 223 130 130 198 22 283 455 416 144 208 79 380 288 288 290 290 434 339 339 199 459 459 459 271 271 39 39 433 433 160 160 112 112 56 56 56 56 28 28 491 28 28 28 28 362 362 491 362 362 362 362 362 362 491 491 362 362 491 362 218 40 40 211 369 369 369 369 369 369 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 260 260 260 260 260 260 260 260 260 163 163 163 366 491 316 316 316 491 316 73 73 289 321 321 7 409 409 409 409 94 58 183 451 30 30 301 378 42 147 147 288 213 213 213 252 36 107 447 447 6 472 472 221 336 321 354 190 380 499 428 428 428 146 146 143 35 472 133 133 147 147 147 288 288 278 173 173 280 29 334 334 355 355 452 452 263 263 417 417 417 442 80 80 435 321 435 127 127 0 222 222 245 378 8 345 141 141 281 281 9 9 238 196 309 479 331 231 231 231 231 231 274 274 186 162 232 172 172 115 273 480 480 480 85 85 299 299 94 199 69 223 130 280 34 475 475 475 475 475 475 324 422 36 310 161 161 161 487 487 288 290 290 290 434 434 339 303 303 48 48 48 417 417 417 417 193 193 17 +103-1241-0005 103 701 1 18 20 34 6 33 18 20 38 5 40 33 36 14 23 20 31 27 18 20 33 8 11 18 19 40 18 6 30 31 19 25 12 20 39 3 30 11 5 37 12 5 31 24 6 23 1 9 30 8 33 30 19 37 14 18 27 33 13 23 1 5 25 11 38 13 25 33 27 37 14 33 19 12 5 31 33 15 32 5 25 18 7 31 1 12 5 23 6 26 29 23 4 33 16 6 30 24 38 5 40 1 6 23 24 27 31 33 11 19 40 14 33 19 11 1 12 20 27 25 23 20 23 19 37 19 26 22 30 20 10 14 19 25 31 8 33 1 9 20 19 26 5 17 14 23 18 36 38 5 40 31 19 33 19 26 6 25 5 29 8 23 5 37 32 19 26 17 5 23 40 4 33 12 20 13 22 31 33 30 20 24 13 25 11 1 11 6 3 4 4 2 2 2 2 1 4 5 6 6 3 5 5 2 5 3 6 6 2 2 2 4 2 3 3 5 1 2 2 1 4 6 2 2 2 1 2 3 6 4 7 5 1 3 3 5 6 2 2 3 2 4 5 6 4 8 15 6 1 2 3 2 3 3 5 2 3 3 3 1 3 3 3 4 6 1 2 4 7 11 21 2 3 4 6 7 4 3 4 3 5 2 3 2 2 2 4 1 5 3 3 3 2 2 2 2 5 5 2 3 5 8 3 4 7 2 2 4 3 3 2 2 4 3 3 3 5 3 2 3 7 7 4 1 2 7 1 4 3 5 7 6 3 3 3 2 2 4 3 2 5 3 3 2 3 6 7 2 2 3 6 2 5 2 2 3 3 2 2 3 2 2 5 2 4 3 6 4 5 5 6 13 17 17 296 296 296 317 491 491 184 184 184 321 435 435 451 451 30 30 30 422 164 164 106 106 106 153 387 387 285 449 451 30 301 378 378 141 141 281 281 9 238 6 108 377 344 344 374 132 132 88 147 109 498 498 498 498 134 134 175 81 474 41 41 19 19 186 162 68 172 115 273 84 496 274 58 451 451 30 30 422 422 36 108 119 119 437 265 265 265 85 85 146 146 24 131 257 257 257 257 31 54 9 142 397 441 153 153 153 372 396 313 186 342 342 224 340 340 340 466 22 283 448 448 219 219 464 180 180 306 306 306 306 396 396 24 285 69 223 130 198 22 283 455 38 162 232 482 482 482 105 196 70 70 65 65 481 481 481 481 182 293 293 497 122 129 401 321 321 190 190 380 380 499 428 428 428 146 146 385 36 472 133 42 147 147 288 278 278 173 280 29 29 245 58 58 72 496 496 496 274 274 143 75 108 119 119 351 351 256 139 139 139 139 139 375 375 375 98 13 321 247 126 126 126 326 326 326 326 326 326 326 101 149 149 228 321 412 83 55 55 322 67 67 133 364 109 109 189 330 330 348 64 36 34 180 410 410 410 410 410 280 29 29 313 236 36 377 377 123 123 216 22 283 283 38 162 232 68 238 272 470 470 171 171 171 99 99 436 436 60 298 116 33 199 58 58 268 268 268 268 268 268 268 169 169 186 39 323 390 390 18 18 112 112 56 491 56 312 491 491 312 491 12 12 12 12 21 23 23 260 260 260 391 149 228 491 321 321 127 5 5 455 251 251 241 431 235 235 235 235 235 235 235 235 348 200 248 248 90 465 259 74 425 386 386 431 486 486 460 240 35 35 393 393 155 155 148 148 148 148 387 387 203 53 250 345 141 141 141 281 9 483 14 226 226 209 411 297 297 297 297 203 53 53 65 496 496 368 31 54 6 6 272 490 490 490 368 453 9 168 498 498 498 498 396 313 325 449 191 191 191 37 24 24 404 13 417 47 47 491 491 321 80 321 321 435 5 448 448 14 14 411 411 350 350 350 350 350 350 466 81 166 166 324 301 301 251 251 241 431 278 278 173 280 176 176 328 200 248 394 465 208 208 487 487 213 213 213 422 36 310 107 395 334 495 406 340 340 340 340 33 394 478 66 68 68 115 273 273 265 265 265 428 85 146 358 24 36 472 472 336 259 354 420 420 420 360 360 135 135 135 135 200 200 44 44 44 44 416 321 144 208 498 498 498 498 498 498 134 302 302 375 375 293 497 98 225 489 489 489 489 378 43 345 141 141 281 162 232 68 68 115 115 470 278 278 325 325 176 176 176 135 135 200 200 199 125 125 125 125 199 44 44 44 129 259 321 74 437 437 265 85 85 85 85 85 139 175 175 81 462 462 130 402 99 338 338 338 338 395 395 360 360 200 200 200 248 212 302 302 302 302 497 185 49 342 168 415 415 415 198 22 448 448 448 448 154 154 154 458 321 96 96 482 482 447 238 6 161 487 487 288 360 360 360 434 434 301 399 217 473 65 432 432 432 120 330 388 388 303 303 303 243 243 131 419 427 491 229 247 15 15 15 15 15 193 193 193 193 193 17 +103-1241-0006 103 761 1 24 4 34 39 36 9 13 30 23 20 25 27 33 19 26 12 5 33 19 33 38 5 40 5 17 14 23 1 31 8 11 5 23 11 29 4 31 33 18 14 13 40 22 38 19 22 23 20 13 40 29 3 31 5 9 5 23 38 19 12 7 33 23 35 22 19 26 4 33 18 14 1 18 4 11 18 20 23 35 22 33 1 18 20 22 35 11 18 3 30 11 23 20 18 4 37 16 15 23 11 33 5 25 27 33 5 31 12 5 33 13 25 31 30 19 21 19 11 5 33 20 4 25 11 13 22 31 29 13 22 33 15 32 5 25 5 37 18 14 4 33 5 33 36 11 4 25 11 19 22 31 29 30 13 32 5 25 1 32 20 38 5 40 31 19 33 19 26 12 13 30 38 15 33 19 26 16 14 31 5 24 34 19 26 6 30 31 5 24 9 3 11 20 1 15 5 6 4 4 5 4 3 5 3 2 5 2 10 2 4 1 2 1 2 4 6 3 3 3 5 6 7 3 9 7 2 2 3 4 5 4 4 2 3 2 3 6 3 3 2 4 2 4 2 4 3 4 4 2 2 2 1 3 2 2 6 2 3 2 4 2 4 3 2 4 6 26 6 3 2 4 3 4 4 5 4 14 6 2 4 1 2 6 3 3 3 2 1 2 1 2 6 4 4 1 3 2 6 4 3 3 6 2 2 8 2 5 6 2 2 6 2 2 3 4 8 1 2 2 3 4 3 2 2 5 4 4 6 1 2 2 2 3 5 6 3 2 6 4 3 2 2 2 2 3 3 2 2 2 6 3 6 26 7 4 4 1 5 3 2 2 4 5 2 3 6 4 5 3 2 5 4 3 8 2 5 4 3 4 7 3 8 2 4 2 2 2 9 7 17 17 17 296 363 363 363 363 363 101 51 51 51 321 321 320 7 217 473 65 329 329 329 460 460 329 329 164 164 485 485 219 485 485 477 374 132 132 132 32 321 321 354 180 264 264 264 468 468 313 134 175 359 166 166 166 301 10 479 331 84 84 496 496 285 459 459 459 31 342 342 224 176 176 328 200 200 248 212 45 45 45 325 177 177 177 177 43 43 364 364 276 346 346 141 141 141 368 453 342 168 44 44 416 416 321 144 27 498 498 498 498 467 302 302 375 375 98 98 98 13 225 321 435 225 7 373 66 66 68 68 172 115 273 265 265 265 85 85 146 146 285 285 302 302 302 497 122 122 472 472 259 74 74 437 437 311 311 311 460 169 150 39 86 238 6 272 300 334 334 406 406 467 356 281 281 9 9 142 221 336 321 208 208 441 109 278 278 178 143 458 192 26 359 359 474 166 464 464 253 253 253 342 142 221 321 74 437 437 405 405 206 150 342 342 224 494 134 8 100 100 100 100 497 345 333 333 220 216 180 113 113 113 113 167 167 457 251 251 241 367 367 367 367 458 192 192 135 135 200 200 464 415 415 415 415 415 285 156 156 156 156 59 59 452 263 13 229 491 247 312 312 312 292 292 292 292 292 1 21 21 21 21 21 21 21 260 408 408 408 149 149 321 321 321 373 72 110 430 430 430 430 430 430 325 183 183 451 30 30 301 301 251 251 241 367 367 367 367 367 367 233 96 96 6 227 419 427 56 170 442 442 201 201 201 201 201 201 491 47 491 491 491 435 435 435 320 451 451 30 30 422 458 144 389 389 389 131 58 72 72 72 437 306 306 306 306 306 396 313 285 26 359 166 166 166 166 464 202 202 349 205 234 234 261 261 25 470 443 139 139 139 293 497 122 35 75 377 87 87 87 116 10 10 479 331 84 84 496 496 274 285 325 459 459 459 271 31 342 342 86 198 198 127 283 5 236 129 129 321 108 119 119 351 432 432 330 330 33 195 471 77 269 238 272 447 397 336 147 456 456 236 236 239 310 107 395 278 278 278 325 34 469 469 236 36 108 449 41 41 41 324 324 246 3 464 89 89 446 446 212 131 145 443 178 178 458 96 96 86 105 105 336 470 470 151 178 143 96 401 321 75 108 119 418 418 418 418 418 186 99 436 436 60 60 298 116 199 69 223 130 402 402 156 156 156 245 14 14 411 411 145 145 145 460 460 240 325 34 469 469 143 321 108 449 485 485 485 374 132 132 325 325 34 89 446 446 67 131 34 154 154 154 96 96 54 142 105 336 190 380 288 151 151 169 99 436 436 60 60 298 298 298 303 303 303 48 404 229 491 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 408 408 408 408 391 491 491 321 373 373 338 338 400 400 400 30 301 378 378 345 141 141 141 281 162 162 232 68 68 115 470 278 278 278 325 176 176 176 135 135 200 248 248 212 127 114 264 264 264 264 468 245 245 43 43 364 364 109 109 109 171 171 171 252 449 449 176 176 135 328 200 200 248 248 393 155 155 332 332 332 186 162 232 68 68 68 115 273 231 231 231 231 53 53 394 76 164 164 214 214 214 214 214 328 200 200 117 335 14 209 157 157 157 157 157 313 186 186 162 232 68 68 68 115 273 231 231 231 53 53 212 212 65 493 493 240 325 41 41 41 19 19 19 454 229 491 247 15 15 193 193 193 17 +103-1241-0007 103 757 1 4 25 11 1 31 19 25 31 19 33 19 26 4 25 11 38 15 33 19 26 38 5 40 12 20 27 25 23 20 34 19 26 33 19 11 36 21 5 31 33 12 13 25 1 32 20 31 4 33 1 4 25 11 38 15 33 19 11 38 19 34 1 6 23 18 14 24 8 33 5 25 11 24 15 25 1 24 4 34 39 36 19 25 22 7 25 33 14 11 12 5 31 33 15 32 5 25 24 4 31 33 14 23 3 22 19 26 5 29 12 5 33 19 22 5 33 6 16 5 31 29 30 13 29 30 5 33 6 30 20 33 19 17 27 19 26 18 27 24 16 14 31 5 29 14 1 5 25 11 4 31 33 19 24 19 16 12 5 16 8 37 34 14 11 20 33 30 15 25 38 35 11 1 31 36 25 9 20 5 23 6 26 1 10 12 3 5 1 8 3 3 7 3 2 4 4 1 2 2 3 4 3 3 3 2 2 2 3 4 6 1 3 3 4 2 10 3 2 4 8 3 5 5 1 2 6 6 11 6 4 7 6 4 1 2 3 3 4 4 3 2 5 2 2 4 3 9 4 6 2 6 5 4 2 1 5 2 7 9 42 6 4 4 2 4 2 3 4 6 2 3 2 2 1 3 3 3 3 6 2 2 3 5 3 4 2 6 3 4 2 5 3 4 2 2 5 2 3 2 2 5 6 3 3 4 2 3 2 2 3 3 3 3 3 2 2 5 4 5 3 4 5 4 3 3 5 2 5 7 16 6 1 3 7 3 3 2 3 2 2 2 4 5 7 2 5 3 3 3 6 2 5 3 2 2 5 4 7 6 2 2 2 4 3 6 8 20 17 17 17 363 51 51 228 184 321 321 209 83 194 194 194 194 194 194 194 194 194 282 388 195 195 212 212 131 483 197 197 197 197 66 66 68 68 115 273 494 278 330 379 33 394 478 478 68 68 68 115 115 470 278 278 325 449 176 176 176 328 328 200 200 464 89 446 116 131 133 364 109 109 403 171 171 171 252 449 449 176 176 328 200 200 250 345 141 141 281 281 9 198 22 448 448 448 14 411 350 350 350 350 350 350 348 359 81 324 324 324 422 164 164 164 214 214 214 214 214 200 200 200 195 248 248 394 76 75 377 87 87 87 236 321 384 371 374 374 374 374 132 132 236 36 310 107 395 395 151 151 151 169 150 39 86 86 238 6 127 114 361 361 361 361 361 388 388 303 117 48 229 321 247 126 126 292 292 408 408 408 408 391 321 321 373 373 400 400 400 400 30 422 422 162 232 68 68 115 273 470 486 486 486 460 460 169 169 36 227 483 226 440 89 446 322 67 394 133 364 321 364 109 109 171 171 171 252 252 449 191 191 191 191 131 133 133 321 345 333 220 220 220 164 483 14 226 321 321 209 411 297 297 297 297 297 297 297 293 497 175 81 58 58 156 156 156 156 156 245 399 217 217 217 70 65 65 428 428 146 146 358 449 449 449 242 116 116 33 33 217 217 217 217 473 290 290 290 290 290 434 434 434 339 303 303 48 48 48 417 491 170 170 28 28 28 28 491 362 362 362 491 491 362 362 491 362 491 491 211 211 491 341 369 369 369 369 21 21 21 21 21 21 21 21 21 101 101 101 149 149 228 321 321 7 217 473 473 329 329 329 460 169 169 164 164 219 219 485 485 378 88 88 242 446 348 90 90 465 445 445 351 351 486 315 319 450 413 413 76 449 449 300 191 313 314 198 22 283 455 38 232 232 238 6 272 470 171 171 171 252 99 436 436 60 60 298 116 33 250 217 473 65 486 486 460 460 169 150 54 238 6 272 300 334 382 313 251 251 251 241 431 405 405 405 206 178 458 192 176 135 135 200 200 200 199 230 230 230 230 215 35 96 198 22 283 455 236 129 321 108 119 351 278 278 143 458 192 192 277 385 325 180 106 405 405 405 206 169 352 352 25 459 459 271 271 31 9 142 221 321 259 190 488 488 488 488 215 35 29 29 382 313 236 36 36 119 351 153 153 153 372 467 337 337 301 236 108 377 123 123 416 458 144 180 180 84 84 496 88 88 176 176 135 328 200 200 248 58 72 437 437 350 350 350 350 203 53 381 394 394 155 155 332 332 332 186 162 342 115 273 273 151 151 215 215 354 29 334 334 334 59 452 452 229 321 247 126 126 126 326 326 326 326 326 326 326 326 101 149 149 149 228 321 83 55 55 322 67 212 34 145 145 486 376 460 460 169 150 150 86 238 6 272 57 57 57 203 473 118 118 118 118 402 198 22 5 5 455 349 234 234 261 25 106 265 265 265 85 85 146 438 173 349 234 393 198 164 470 498 498 313 285 325 41 324 324 422 36 310 161 161 487 487 288 290 290 290 290 434 434 339 250 250 345 389 389 389 314 131 472 401 401 401 80 321 80 321 478 66 68 482 115 273 374 374 374 132 413 33 250 212 354 420 420 420 464 464 255 255 251 251 241 431 235 235 235 235 235 235 413 303 303 303 48 48 48 417 417 170 170 421 421 491 421 421 491 491 128 128 491 128 128 128 193 193 17 +103-1241-0008 103 756 1 12 5 16 8 37 34 14 11 20 33 30 15 25 18 4 40 9 19 25 19 25 4 25 11 17 6 25 18 4 16 5 25 7 30 5 17 27 1 4 25 31 14 11 12 4 33 9 30 19 31 22 5 16 19 32 5 23 1 9 5 33 12 13 30 38 5 40 5 29 4 31 5 25 21 14 11 30 3 29 33 6 16 14 39 36 1 5 23 19 33 5 23 17 14 23 1 32 20 40 31 19 33 19 26 7 33 12 13 30 3 25 12 5 32 19 26 17 5 23 40 1 8 4 31 33 18 14 33 5 17 27 19 25 33 5 12 5 23 15 11 20 40 38 15 33 19 26 30 36 24 9 5 33 32 20 19 25 16 6 30 24 11 24 20 17 30 15 37 23 20 1 12 4 33 32 20 29 30 5 16 14 11 33 19 31 33 15 7 33 31 8 11 1 23 2 3 4 7 3 4 3 2 3 5 2 4 2 2 2 4 3 3 3 11 4 4 3 3 3 9 4 5 5 4 2 2 6 5 2 3 10 7 8 3 4 2 3 2 4 4 4 2 2 4 3 2 4 2 4 4 6 23 3 5 3 1 2 3 3 2 3 2 4 4 5 2 3 2 3 5 2 4 3 2 4 6 2 5 9 10 6 3 1 2 1 2 4 6 9 14 5 3 3 3 2 2 4 5 4 3 2 2 3 3 3 1 2 5 2 4 2 2 3 6 20 7 7 4 2 2 2 2 2 4 6 3 3 3 1 2 3 4 4 2 4 4 3 3 3 2 4 4 2 3 3 4 2 5 3 2 4 4 2 3 3 1 2 4 4 3 5 4 2 8 13 2 3 2 3 3 2 2 3 3 3 2 2 2 2 3 2 6 4 2 8 6 5 17 17 17 296 296 296 317 52 52 52 52 52 52 52 52 52 51 51 51 184 184 321 321 320 127 5 5 38 349 261 261 25 106 265 265 85 85 146 438 173 349 221 401 127 114 498 498 498 313 325 34 324 324 422 236 36 161 161 487 487 288 290 290 290 434 339 199 58 254 254 71 281 342 142 221 336 354 137 137 137 137 116 335 335 14 14 411 188 188 340 340 340 340 330 330 388 94 199 199 89 89 89 446 446 67 64 131 472 472 458 144 180 106 426 426 426 426 426 426 282 282 388 195 117 404 404 225 225 72 110 486 486 486 460 460 169 352 352 29 44 44 94 199 145 145 315 315 315 468 468 406 467 467 467 469 416 416 192 180 84 84 84 84 375 98 98 13 417 417 47 491 47 80 80 321 321 320 83 83 145 145 365 365 330 330 379 77 77 224 179 179 179 313 314 198 164 127 114 92 92 92 92 167 457 401 401 401 321 354 190 380 288 278 278 31 342 86 105 105 458 192 255 255 349 205 261 25 278 278 278 99 436 436 395 302 302 302 375 98 98 13 229 321 247 312 312 292 1 1 292 326 1 326 23 23 23 23 101 101 101 149 391 491 289 289 320 7 354 159 159 159 159 159 167 35 35 198 127 0 0 222 468 245 378 345 141 141 281 453 453 44 44 44 44 259 74 437 311 311 311 311 150 150 342 224 494 494 469 116 64 212 310 300 334 382 313 314 314 239 161 161 380 499 405 405 206 215 215 96 96 272 34 106 405 405 206 169 349 352 234 155 332 332 332 313 219 219 477 477 477 477 132 132 98 98 417 417 417 417 47 47 491 491 47 80 80 80 321 320 412 287 44 44 44 175 81 431 278 278 285 302 497 497 122 416 144 180 498 498 498 498 498 499 302 375 375 98 98 263 13 417 417 417 417 170 491 491 47 491 491 491 47 47 435 435 321 321 373 310 400 400 400 30 422 422 162 232 68 172 115 470 278 278 325 176 176 135 135 200 200 464 180 113 113 113 113 167 167 35 35 127 114 264 264 468 406 467 467 125 125 125 348 466 22 283 455 99 338 338 395 395 360 360 360 200 200 248 212 302 302 302 302 375 375 185 269 433 112 427 491 247 312 312 126 292 292 292 23 23 23 23 23 101 101 101 149 149 149 289 321 412 287 287 287 111 111 111 438 145 376 376 460 460 169 150 86 86 238 6 272 272 156 382 313 325 34 87 87 416 144 27 180 84 84 496 88 88 88 340 340 340 116 33 394 465 377 123 123 198 22 283 283 455 251 251 241 431 171 171 171 252 325 41 41 41 318 318 49 9 142 397 364 109 109 403 171 171 252 449 449 176 135 328 200 248 248 345 380 288 288 496 203 203 53 53 212 354 159 159 159 159 167 167 310 107 338 400 400 400 30 324 464 121 121 33 394 90 393 155 155 25 148 148 387 387 387 203 53 53 53 64 10 429 429 429 301 416 32 321 208 79 79 380 288 288 171 171 171 252 173 173 402 26 359 474 474 474 474 19 19 19 229 321 247 126 126 326 326 326 326 101 149 149 228 321 321 412 45 45 45 169 143 310 107 400 400 30 301 422 129 74 492 492 245 349 349 261 25 498 498 498 313 313 36 377 87 87 38 54 86 6 272 470 171 464 464 464 113 113 113 113 167 77 478 172 172 273 265 265 265 265 85 85 299 299 24 131 419 439 439 417 417 237 128 193 17 +103-1241-0009 103 694 1 32 20 40 5 22 15 31 8 32 35 11 31 15 1 8 24 25 3 33 19 22 31 29 13 22 33 19 26 5 17 14 23 1 31 13 11 24 4 34 39 36 9 23 4 26 22 23 20 1 19 33 31 5 9 28 8 37 22 5 24 16 6 30 1 18 20 32 35 11 9 20 18 20 30 1 24 19 31 19 40 4 23 5 17 40 4 25 11 14 31 29 13 25 31 14 38 5 40 33 19 9 30 19 26 18 19 24 27 37 14 16 14 24 25 27 37 5 31 22 27 32 5 16 6 30 24 20 1 12 5 31 33 15 32 5 25 24 4 31 33 14 38 19 31 5 23 11 1 10 7 4 4 4 4 8 5 4 4 2 3 2 12 53 9 1 3 2 3 2 3 2 3 2 3 3 1 3 3 4 6 8 14 7 2 3 2 6 2 3 2 4 3 3 3 3 3 6 24 4 4 2 2 8 11 4 4 4 2 6 5 3 8 13 5 2 5 2 2 3 6 4 3 7 19 3 2 3 2 4 6 3 3 3 4 4 2 2 4 6 3 2 4 5 6 2 2 4 2 2 4 2 3 2 3 2 4 3 4 3 4 2 1 5 3 2 2 5 3 4 5 3 5 3 2 4 8 27 3 3 4 3 3 5 3 2 3 6 3 3 4 4 2 4 3 3 6 11 17 17 17 363 363 363 51 51 184 184 321 373 373 338 400 400 400 400 213 356 356 368 453 342 168 44 44 44 44 458 144 445 351 343 343 343 343 171 358 358 358 39 342 224 168 111 111 111 111 438 186 99 395 395 389 389 236 36 478 224 273 470 403 403 403 207 207 207 454 263 48 417 417 417 417 417 237 237 442 28 28 28 491 28 442 442 442 442 362 362 362 362 362 362 362 362 362 362 305 218 218 218 218 366 218 491 491 366 366 366 366 366 366 491 366 366 366 366 316 316 316 316 435 321 289 321 209 287 287 111 111 111 111 438 438 203 10 479 307 307 307 61 285 34 154 154 458 96 342 86 105 336 470 470 151 151 178 178 96 36 449 176 135 135 200 464 44 44 44 416 321 208 79 498 498 498 498 499 302 375 98 98 98 13 13 414 170 170 442 47 47 47 491 47 47 47 491 316 316 80 80 321 289 66 66 66 179 179 179 179 314 314 196 217 473 486 486 329 460 169 169 352 183 485 485 485 374 301 129 321 259 425 425 386 431 376 365 365 299 76 76 465 26 26 359 359 474 474 474 19 19 229 321 247 126 126 126 126 326 326 326 326 101 408 408 408 391 391 391 391 316 316 80 80 289 321 321 321 188 177 177 177 356 356 356 342 168 44 44 44 8 32 32 32 321 354 354 153 153 153 153 387 387 387 146 464 464 111 111 111 146 438 202 402 402 402 75 144 27 437 319 319 203 53 53 394 90 393 234 205 155 332 148 148 148 372 372 372 59 452 263 263 78 414 47 47 47 47 47 491 47 47 80 491 321 289 289 373 451 451 451 30 30 30 99 338 338 389 389 389 389 314 32 239 354 420 420 420 213 213 252 422 183 183 451 286 286 286 286 334 59 59 59 452 263 321 247 247 126 126 292 292 326 326 326 326 326 326 101 101 101 149 228 289 289 320 217 473 258 258 31 342 224 494 494 368 453 342 483 14 145 145 284 329 329 175 175 81 81 469 416 458 458 96 342 68 115 273 365 365 365 330 348 64 212 300 382 382 313 186 162 162 482 482 105 105 336 470 470 432 330 330 64 64 77 77 342 224 300 334 334 334 59 245 43 43 345 141 141 141 281 9 9 6 6 87 87 87 87 8 321 354 190 288 288 360 360 200 200 183 183 57 57 57 57 53 473 106 410 410 410 410 173 280 29 29 382 245 349 155 155 165 165 165 53 53 10 479 331 84 84 496 274 173 280 29 38 38 162 482 482 105 336 144 180 496 496 496 274 99 99 436 107 60 423 423 349 349 205 155 155 332 332 332 372 372 245 203 473 429 429 429 429 19 19 454 454 417 414 170 170 170 28 491 28 2 2 2 2 491 2 491 491 2 2 2 316 316 316 491 316 316 73 321 321 321 321 7 127 5 5 38 162 342 86 238 6 371 470 171 171 171 252 99 436 436 60 298 275 116 33 250 217 473 65 486 486 486 460 169 169 150 86 238 6 272 300 334 382 245 43 43 364 276 109 278 278 31 342 342 224 302 302 302 302 375 122 122 122 352 419 427 229 247 312 15 15 15 15 15 193 193 193 17 +103-1241-0010 103 793 1 17 13 31 12 13 30 40 31 5 24 19 31 33 15 22 1 18 20 31 13 11 1 24 19 31 19 40 31 29 13 25 31 14 22 15 24 6 16 12 5 33 30 15 25 38 19 34 12 4 33 17 14 23 5 25 11 17 15 37 18 14 19 25 33 5 24 8 10 3 30 21 1 31 13 11 39 36 5 25 11 39 6 30 31 19 31 33 14 38 14 5 11 3 29 33 19 26 18 14 16 14 24 5 25 6 30 16 5 25 5 31 8 23 5 24 1 5 25 11 12 5 33 39 36 38 35 11 9 20 5 23 6 26 16 14 18 14 29 30 13 40 5 25 33 23 20 1 12 4 33 31 6 23 8 25 27 5 9 7 33 19 33 1 4 25 11 8 18 4 37 5 25 17 3 33 13 25 20 24 6 30 6 30 16 5 25 40 22 5 25 31 20 23 11 18 19 30 5 9 7 33 31 1 14 5 5 5 2 3 3 2 4 4 5 2 5 3 6 8 8 5 3 5 5 5 19 5 3 4 2 2 2 3 3 4 3 3 4 4 4 4 4 2 2 4 3 3 3 2 2 2 2 6 3 3 8 5 3 1 2 3 5 3 3 4 2 2 3 1 4 5 5 5 5 8 14 6 4 2 6 6 3 1 2 1 4 3 5 3 4 3 4 4 4 3 3 5 3 1 2 3 4 4 4 2 3 1 3 5 3 4 1 2 3 5 6 3 2 5 13 5 1 2 1 3 3 3 3 2 2 2 2 3 3 4 4 4 4 1 3 4 5 2 2 3 2 3 3 2 6 15 5 5 3 2 6 4 5 4 6 2 3 5 2 4 5 8 9 1 3 6 3 4 2 2 2 3 3 3 1 3 3 4 3 3 6 3 3 3 3 3 2 2 3 5 5 4 2 2 2 5 1 2 9 3 9 21 17 17 17 296 363 363 363 51 51 51 184 491 184 321 7 7 320 127 357 357 443 443 240 271 150 39 86 238 198 198 114 0 222 468 468 313 186 186 162 68 68 115 273 231 231 231 231 53 53 217 473 65 258 38 31 162 68 68 238 6 470 470 470 171 171 171 171 358 358 233 233 321 192 419 439 417 417 417 237 237 47 80 321 321 435 373 451 451 451 30 30 422 162 68 68 115 470 470 120 120 120 37 24 24 404 13 229 491 247 312 126 292 292 292 292 292 21 21 21 408 408 408 149 149 228 321 321 320 7 217 473 258 258 258 31 342 224 494 494 494 31 162 232 105 105 336 470 329 432 330 330 64 77 77 224 300 334 382 245 245 458 144 445 210 210 210 210 210 203 203 53 106 230 426 426 206 169 349 402 198 198 22 283 455 236 161 161 487 487 288 290 290 290 434 434 250 250 345 333 333 220 220 129 127 114 92 92 92 92 167 167 457 32 32 32 259 208 498 498 498 498 498 134 302 302 302 375 175 175 81 89 89 322 67 394 32 239 144 445 210 210 210 210 210 173 349 402 156 156 156 156 156 467 467 340 340 116 394 465 377 123 123 399 70 46 46 46 46 46 438 236 36 310 107 395 180 499 499 306 306 306 306 306 59 37 37 243 233 75 227 419 427 78 56 491 491 312 292 292 292 23 23 23 408 408 408 391 321 321 373 66 68 115 273 470 120 120 240 314 314 219 219 219 219 152 152 152 374 132 132 88 88 89 89 446 116 212 131 219 222 222 222 387 387 186 186 162 232 172 115 273 278 278 31 31 54 86 238 6 272 300 300 355 132 43 345 347 347 347 347 347 467 467 313 236 236 239 384 180 180 405 405 206 215 215 35 96 272 176 135 135 200 248 58 156 156 156 156 156 59 245 349 155 155 165 165 165 165 53 44 44 44 335 14 14 411 411 153 372 372 372 349 349 352 261 242 242 94 199 459 271 38 162 342 68 115 273 265 265 265 85 146 146 175 175 81 459 203 203 117 404 229 247 126 126 126 326 326 326 326 101 101 149 149 228 321 412 83 55 55 55 322 67 466 45 45 45 45 36 36 107 219 152 152 152 132 378 345 389 389 389 314 239 239 420 420 420 464 255 255 255 251 251 241 431 235 235 235 235 348 200 248 76 393 155 332 332 332 245 156 156 156 156 245 245 129 129 321 74 190 488 488 151 368 453 453 168 11 11 379 64 243 465 26 359 474 474 474 474 19 19 48 417 417 417 417 170 47 491 47 491 47 491 491 47 316 80 289 321 7 7 127 114 92 92 92 92 240 167 77 77 342 168 106 297 297 297 297 297 297 293 175 111 111 111 111 438 438 438 10 479 331 84 84 84 88 88 255 255 255 8 354 180 113 113 113 113 450 285 285 277 277 277 277 24 131 439 417 417 417 417 491 491 47 491 80 80 321 412 83 83 83 194 194 55 55 322 212 34 111 111 111 111 111 438 438 58 72 110 202 202 202 202 202 29 242 116 90 394 239 27 180 405 405 206 240 285 34 475 475 475 475 475 475 301 399 70 138 138 138 138 138 372 245 245 14 411 411 153 153 372 372 372 349 349 155 29 242 275 379 379 471 471 49 142 221 336 144 121 121 379 394 478 68 342 115 444 444 444 213 464 139 139 302 302 497 122 122 131 183 286 286 286 286 406 406 467 467 255 8 354 180 180 113 113 113 450 450 413 37 243 270 270 433 390 390 18 112 56 56 56 312 312 312 15 15 15 15 15 15 15 15 15 15 15 260 260 260 193 193 193 193 17 +103-1241-0011 103 724 1 8 11 27 25 33 5 25 11 14 31 33 4 25 11 1 31 13 11 24 4 34 39 36 18 13 23 29 23 5 31 23 20 1 38 19 32 19 26 12 5 33 24 3 30 19 23 5 38 5 40 4 33 18 4 25 11 33 19 22 27 29 38 19 34 12 5 31 19 10 36 15 32 5 25 1 38 13 23 39 36 11 9 13 33 14 22 38 13 31 10 5 25 12 5 17 14 23 1 31 13 11 12 5 31 33 15 32 5 25 24 4 31 33 14 22 13 30 23 5 31 23 20 1 8 11 13 30 31 15 32 20 23 9 20 15 9 5 23 33 36 19 22 31 29 23 15 25 1 32 20 40 17 3 33 5 33 5 26 5 37 18 14 27 25 12 4 33 31 14 33 5 25 1 23 8 4 5 1 3 3 2 2 3 6 3 9 2 9 15 6 1 4 3 5 3 2 4 5 2 3 4 2 3 4 2 6 14 4 3 4 3 5 2 2 4 2 2 4 3 4 3 3 2 3 3 2 7 5 3 2 2 2 5 6 3 2 1 2 1 2 4 2 5 4 4 6 2 6 33 6 6 4 4 3 2 3 3 3 2 3 2 2 3 4 1 2 1 2 2 7 7 16 6 2 3 1 3 3 3 3 5 2 2 3 4 3 2 2 5 2 4 2 3 4 2 8 25 8 4 3 4 5 5 4 3 3 2 4 4 2 1 2 3 2 3 3 3 2 3 7 5 6 4 3 4 4 1 3 3 5 3 3 2 2 3 6 7 4 2 5 4 6 6 1 2 6 16 17 17 296 296 296 317 317 317 317 317 461 491 461 461 461 461 461 461 461 184 184 289 321 321 209 287 111 111 111 438 438 10 239 384 371 84 84 350 350 413 64 212 131 34 145 319 348 348 212 212 300 494 469 186 162 232 232 232 482 238 6 272 470 470 294 294 294 294 294 294 282 388 388 303 243 75 131 419 439 439 439 78 78 47 47 47 47 491 47 47 47 491 47 47 491 491 80 442 289 66 66 68 179 179 179 179 314 314 196 196 70 65 329 486 329 460 169 164 164 485 485 485 485 132 274 58 58 72 72 72 437 268 139 293 293 215 215 35 26 26 262 262 262 262 262 342 342 26 26 359 474 474 474 474 19 454 229 247 247 126 126 326 326 326 326 101 101 101 149 149 228 321 7 345 109 109 278 278 99 447 447 107 176 135 135 135 200 200 248 212 212 45 45 45 45 35 196 196 217 70 65 65 329 42 42 380 288 256 256 139 175 175 423 423 423 43 43 345 141 141 281 281 453 168 415 415 415 36 131 119 72 72 72 110 294 294 294 294 294 282 388 388 195 394 76 75 377 87 87 87 129 321 144 27 351 496 496 496 274 215 215 401 401 321 354 333 220 220 198 22 283 38 162 342 342 224 494 494 236 36 107 485 485 485 134 88 418 418 418 418 418 252 99 436 436 60 298 298 298 303 117 48 13 229 321 247 312 312 187 187 12 12 12 12 12 12 260 260 260 260 491 163 163 366 366 491 366 491 366 366 316 316 316 316 321 321 321 435 435 7 7 364 276 109 109 443 443 443 139 139 293 293 293 122 219 219 152 152 152 152 314 314 472 401 259 354 180 443 443 285 285 382 382 245 143 458 208 441 151 151 151 169 150 238 238 272 60 60 242 116 466 22 283 416 144 79 498 498 498 498 499 355 302 375 375 98 98 263 13 417 417 417 417 237 237 237 47 47 47 491 47 47 47 80 80 80 321 435 435 66 115 179 179 179 179 314 198 22 283 455 38 162 86 238 6 470 470 171 171 171 99 99 436 436 60 298 116 33 250 217 473 65 486 460 460 169 150 86 6 272 300 382 313 458 445 445 445 351 351 264 468 468 134 134 175 262 262 262 262 39 342 26 26 359 474 474 474 19 19 454 229 321 321 247 126 126 126 292 326 326 326 326 326 326 21 326 21 326 101 101 101 101 149 149 149 228 321 412 412 287 287 111 111 111 438 438 236 239 384 371 470 264 264 468 468 313 186 162 342 68 115 470 403 403 171 171 422 186 99 338 338 395 494 139 139 497 122 8 420 420 420 420 464 171 171 171 134 8 29 100 497 122 36 377 87 87 87 154 154 154 458 96 96 232 105 105 336 425 386 386 431 290 290 290 290 434 434 434 339 195 117 117 417 417 417 417 225 225 435 435 338 400 400 400 30 422 281 342 342 105 221 144 180 106 189 240 285 34 44 44 236 36 108 119 119 351 319 319 319 348 200 200 69 223 223 130 402 156 156 156 156 406 467 467 350 350 350 350 350 350 413 413 413 195 33 212 198 114 92 92 92 92 92 167 35 478 478 68 68 172 115 273 498 498 498 396 396 385 233 242 242 275 303 303 303 303 48 305 417 78 170 421 421 491 491 128 128 491 128 128 128 193 193 17 +103-1241-0012 103 748 1 24 15 9 20 12 15 38 14 7 33 5 37 9 28 40 5 37 12 5 9 30 4 25 11 39 36 38 3 25 33 5 11 1 18 20 38 6 22 33 1 21 6 25 33 5 23 20 5 38 15 1 9 20 19 26 18 5 26 17 30 20 1 4 25 11 12 20 5 25 16 6 30 10 5 25 5 33 24 4 34 39 36 38 5 40 23 13 16 33 19 11 36 12 4 33 18 38 19 10 38 5 40 18 3 30 11 14 16 14 18 19 24 12 5 25 1 9 19 30 11 19 26 5 23 8 5 25 19 25 19 33 31 11 13 25 1 38 6 22 5 29 33 36 5 17 14 23 1 5 31 33 30 15 25 21 17 14 23 1 5 25 6 30 16 5 25 17 14 23 1 20 4 4 2 3 3 4 4 3 4 3 1 4 4 9 3 2 1 2 2 2 3 5 1 2 2 4 5 2 2 3 3 6 28 5 4 3 7 3 4 2 4 4 3 2 2 2 5 4 4 11 4 3 7 1 4 5 2 4 2 3 6 22 7 2 2 1 3 3 3 4 2 3 3 2 1 3 2 4 6 4 3 4 3 2 4 3 4 2 3 2 5 14 5 7 4 4 2 2 5 2 1 4 5 2 3 2 3 3 2 6 3 7 3 3 7 2 2 4 4 2 2 4 4 6 11 2 2 2 1 3 4 4 3 7 10 23 7 7 5 4 5 4 4 3 4 8 10 15 6 6 3 2 6 2 3 4 6 6 1 4 4 7 3 5 1 6 3 7 6 8 17 17 17 296 296 52 52 52 52 52 52 52 363 101 101 51 51 228 491 289 321 7 473 473 329 476 171 252 378 337 337 324 301 216 216 0 0 0 301 378 43 345 347 347 347 406 467 145 113 113 113 113 285 34 223 462 402 402 221 401 259 354 153 153 153 153 387 387 387 318 318 185 453 9 168 69 223 198 198 22 283 455 129 354 190 380 499 288 365 365 282 299 64 212 131 219 219 152 152 152 378 43 364 276 174 174 319 319 348 64 76 449 191 191 191 191 24 131 404 417 417 417 417 417 237 237 237 491 237 28 491 28 362 491 102 362 102 362 362 362 491 366 491 316 491 491 316 316 435 435 321 321 373 451 451 30 30 301 378 364 276 276 346 346 405 405 405 405 206 178 96 96 227 472 472 472 472 401 75 310 107 395 180 329 426 426 206 348 76 465 26 26 359 359 359 474 474 324 464 464 255 255 255 43 364 276 109 109 403 403 403 207 207 207 19 19 454 197 197 80 80 321 321 320 7 354 420 420 420 360 360 360 135 135 135 200 200 248 58 58 72 437 319 319 319 348 348 64 248 212 79 495 334 41 41 41 19 454 229 247 247 126 126 126 326 326 326 326 326 326 326 326 326 326 101 101 101 149 149 149 228 321 412 83 194 194 194 194 322 388 67 466 127 448 448 448 464 319 319 319 348 90 90 205 261 25 148 148 148 387 396 186 310 107 60 60 298 94 11 11 11 457 457 217 217 473 65 486 486 486 460 460 169 169 164 164 485 485 485 485 485 374 132 43 43 345 141 141 141 281 342 26 26 251 241 431 443 443 169 169 402 402 6 272 377 87 87 236 239 239 384 371 371 374 374 374 374 132 132 132 132 132 132 132 132 197 197 321 127 114 114 92 92 92 92 92 460 167 385 35 75 227 472 397 397 345 407 407 407 407 407 310 447 397 397 141 141 141 281 54 9 142 72 72 72 437 306 306 306 306 396 396 285 300 382 382 349 205 155 332 332 332 58 58 183 183 183 57 57 57 57 203 53 381 381 195 394 212 198 127 114 89 446 446 67 394 394 32 32 32 401 401 321 75 354 485 485 286 286 286 468 396 313 325 325 176 135 135 200 200 199 44 44 44 251 251 251 251 241 241 431 265 480 480 480 85 85 85 146 464 464 275 275 388 94 199 340 340 199 199 154 154 154 36 77 342 342 86 221 336 321 384 384 371 93 120 120 120 120 330 388 303 195 195 303 117 404 404 78 78 491 491 312 312 292 292 292 12 12 12 23 23 260 260 260 260 260 391 391 391 491 289 289 321 7 7 7 364 276 276 346 346 405 405 405 206 178 35 35 458 192 180 230 230 230 230 215 215 35 96 401 75 108 377 123 123 123 88 44 44 44 416 416 239 144 79 498 498 498 498 498 498 134 302 375 375 375 375 98 98 98 13 417 417 417 417 237 237 47 47 47 491 491 80 80 491 289 321 321 287 287 44 44 44 38 162 232 482 482 482 238 6 161 161 79 487 288 290 290 290 434 434 339 339 310 107 447 221 144 79 498 498 498 498 498 302 302 375 375 98 98 225 483 226 209 44 44 44 44 33 335 14 14 411 411 153 153 372 372 372 396 349 349 234 261 261 242 242 116 116 33 90 90 212 239 79 79 498 498 498 498 134 302 375 375 375 98 13 229 321 247 15 15 15 193 193 193 17 +103-1241-0013 103 740 1 4 25 11 19 24 4 25 11 5 37 18 14 38 8 32 20 38 5 40 5 25 33 5 9 28 1 24 4 34 39 36 17 30 27 25 11 19 25 31 29 19 30 19 33 13 40 18 20 33 14 25 11 5 9 7 33 5 25 11 32 5 16 5 23 11 1 21 13 25 33 23 20 11 7 25 12 5 29 23 4 33 16 6 30 24 33 6 30 11 40 18 14 1 32 20 18 4 11 9 19 25 38 3 10 19 26 18 19 24 13 37 14 31 19 25 31 18 20 18 4 11 29 4 31 33 18 14 1 4 25 11 32 20 18 4 11 18 14 8 40 3 25 18 19 24 25 7 1 24 4 34 39 36 38 5 40 25 3 33 23 35 22 19 26 4 33 18 14 1 10 8 2 3 3 4 5 2 3 2 2 4 6 7 7 4 3 4 2 3 2 1 2 2 3 15 32 7 8 6 3 5 4 6 9 3 2 3 4 8 3 1 8 2 3 2 2 2 3 6 7 2 1 2 2 9 4 1 3 3 6 4 4 2 5 3 2 6 2 4 3 2 4 4 5 3 1 3 3 3 4 4 3 2 2 3 4 4 3 4 2 2 8 40 5 4 2 2 3 2 2 3 4 4 4 2 2 4 3 2 6 4 3 5 3 4 2 3 1 2 1 3 6 5 5 1 2 8 14 6 1 2 3 3 5 3 2 4 6 8 5 4 2 3 3 2 4 15 24 6 6 2 3 3 2 2 4 3 4 2 5 2 3 3 4 5 2 2 7 10 17 17 17 363 363 363 51 149 228 228 321 83 83 194 194 194 194 322 67 64 212 212 34 44 44 44 217 217 473 65 486 365 365 460 330 388 64 212 131 34 223 223 130 402 402 156 156 156 156 59 59 59 245 245 43 43 364 276 346 346 346 346 346 265 85 85 146 438 186 338 338 400 400 30 378 378 345 141 141 141 141 281 453 242 242 116 64 131 34 44 44 8 354 354 153 153 153 153 387 387 387 387 207 207 207 98 48 417 417 417 417 170 170 491 28 28 28 28 2 2 2 491 2 2 491 2 491 2 2 2 366 366 491 316 316 316 316 491 73 491 289 321 7 7 217 217 473 65 486 486 486 486 460 460 169 169 169 164 164 164 219 219 219 485 485 374 374 132 132 32 32 321 208 208 79 79 380 380 288 84 496 496 496 496 274 274 413 413 413 413 64 212 212 34 34 340 340 116 33 394 478 478 232 232 232 232 232 105 105 336 354 470 286 278 498 468 468 468 468 468 467 277 385 325 449 34 253 253 253 453 168 30 30 30 422 129 75 108 119 308 308 308 308 308 308 308 396 313 64 212 131 255 255 8 354 180 113 113 113 113 113 450 450 413 24 36 449 89 89 116 33 33 394 90 338 338 338 338 338 338 395 189 151 151 169 349 349 352 29 302 302 302 302 497 122 122 122 314 401 401 401 321 310 107 107 395 432 432 432 330 379 64 76 36 26 26 359 474 474 474 324 301 239 384 371 180 315 315 315 450 450 413 466 466 22 283 455 455 259 74 425 386 431 486 486 460 460 167 35 393 205 321 155 148 148 148 387 387 203 53 90 90 75 119 441 441 153 153 153 153 372 372 37 314 77 77 342 9 224 156 156 156 156 59 452 452 263 229 247 247 312 312 312 292 292 292 292 292 292 292 1 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 408 408 391 391 321 321 373 373 400 400 400 30 30 58 110 254 254 254 254 314 35 259 137 137 137 137 399 250 250 276 346 346 346 206 206 240 310 310 107 395 176 135 135 200 248 183 57 57 57 57 57 53 473 335 14 411 145 463 463 463 463 29 29 382 313 186 186 162 68 68 273 278 278 278 330 379 394 77 342 342 451 30 30 30 464 254 254 254 131 129 321 74 437 311 311 311 311 311 311 460 169 150 86 86 238 6 272 272 334 334 334 59 59 452 452 229 321 247 126 126 126 292 292 292 326 408 408 149 149 228 321 321 209 83 55 55 322 322 67 310 400 400 400 30 30 3 58 72 72 110 110 254 254 254 240 131 58 183 156 156 156 156 245 335 14 411 265 265 265 265 265 85 85 146 318 368 342 168 168 125 125 125 125 348 199 183 183 57 57 57 57 53 53 10 10 479 331 331 315 315 315 315 315 450 450 450 450 98 98 13 13 78 170 170 170 170 28 28 2 491 2 2 491 2 2 2 2 316 491 316 316 316 316 289 289 289 321 7 7 217 473 329 329 329 329 329 329 329 164 164 485 485 485 301 378 378 345 141 141 141 281 9 238 221 196 479 307 307 307 61 167 167 457 457 251 251 241 367 367 367 367 458 192 176 135 135 200 200 464 464 415 415 415 415 415 240 285 156 156 156 156 59 452 452 229 321 247 312 15 15 15 15 193 193 193 17 +103-1241-0014 103 756 1 5 10 8 23 11 5 37 5 9 7 33 19 23 13 37 5 25 1 17 3 30 9 11 19 25 5 37 13 30 20 32 6 30 33 1 37 13 30 20 33 8 33 1 37 13 30 20 5 17 23 20 11 30 13 31 5 37 39 13 23 27 19 32 17 30 15 38 19 25 31 20 1 32 20 38 6 30 5 16 15 11 19 11 9 30 7 25 31 15 23 14 18 4 33 1 5 25 11 9 19 25 20 34 12 5 18 4 33 1 19 22 31 33 13 25 11 19 26 11 7 25 18 14 9 4 22 38 14 33 36 9 30 15 11 40 5 37 13 30 20 34 19 22 1 11 19 31 8 11 5 11 23 20 30 13 11 1 18 13 30 1 14 5 6 7 3 2 1 3 2 3 4 2 2 6 2 3 3 8 23 4 6 3 2 3 2 2 2 4 3 4 3 9 4 3 6 5 5 3 4 4 7 6 8 4 4 3 4 7 4 4 5 4 3 2 4 7 2 2 5 4 3 5 2 7 3 3 8 5 2 4 6 8 26 6 3 4 4 3 3 6 7 2 3 4 4 3 8 3 6 4 5 3 4 6 8 2 5 2 1 3 3 3 5 4 2 1 7 5 7 12 4 3 4 3 3 4 2 2 4 3 6 2 5 2 4 8 8 2 3 7 7 3 3 8 4 3 2 5 3 3 5 7 5 8 6 2 3 8 5 3 3 3 2 5 7 6 8 1 7 2 11 17 17 17 17 296 491 317 317 491 491 184 184 184 321 320 412 44 44 44 44 36 310 107 107 395 437 91 91 91 91 85 85 139 139 293 122 122 34 69 223 130 280 44 44 8 8 354 180 113 113 113 285 285 34 44 251 251 251 241 241 431 443 443 173 173 280 242 275 275 116 195 117 117 48 417 414 170 491 170 491 321 211 211 312 312 292 292 326 326 326 326 23 101 101 101 149 391 491 289 289 321 144 144 106 499 306 306 306 306 306 396 396 215 215 96 36 272 272 340 340 94 199 44 44 44 4 280 104 104 104 104 104 468 337 337 337 337 422 422 99 338 338 338 338 395 395 153 153 153 153 372 372 396 385 385 36 227 419 225 225 80 80 491 321 321 7 7 32 4 104 104 104 104 104 468 337 337 337 324 422 143 36 108 119 119 437 437 265 265 428 428 428 146 358 358 233 75 227 419 225 225 225 80 80 80 80 7 7 4 280 104 104 104 468 468 337 337 337 324 3 14 14 411 411 284 319 319 240 416 416 96 134 134 359 359 81 166 166 324 301 236 239 161 161 79 288 288 151 151 271 271 39 342 342 342 224 462 462 462 462 402 402 219 219 219 219 180 180 443 139 175 175 81 84 496 88 88 109 459 459 459 99 99 447 447 447 221 336 144 208 79 380 288 403 403 403 171 324 3 301 301 43 364 364 345 109 278 278 116 33 394 77 77 342 68 342 224 41 41 41 41 19 19 454 229 321 247 247 312 126 292 292 292 292 292 292 23 23 23 23 23 23 23 260 260 260 260 260 260 391 391 228 321 373 373 400 400 400 400 301 378 43 364 276 210 210 210 372 372 372 467 44 44 44 349 349 234 234 261 261 25 470 171 171 171 171 252 252 325 34 191 191 191 314 131 472 401 401 321 259 190 190 380 380 315 315 315 315 450 450 450 413 348 394 478 478 232 232 172 115 273 470 171 171 171 252 175 81 300 300 382 245 58 58 72 110 110 486 486 486 460 460 460 169 385 233 227 227 419 225 225 225 225 412 412 83 55 55 322 67 212 401 321 354 255 255 116 94 94 398 213 213 213 213 252 164 164 164 164 164 283 283 455 72 72 72 110 486 486 486 486 460 282 282 385 385 227 227 419 427 321 247 126 126 326 326 326 326 101 408 149 149 321 412 154 154 154 143 96 96 66 232 68 238 6 272 470 432 432 432 330 64 64 64 212 176 135 135 200 200 248 248 212 384 180 315 315 315 315 450 413 348 199 58 156 156 156 156 156 245 8 8 354 180 376 376 376 376 376 376 460 460 169 178 233 321 208 133 397 345 347 347 313 313 236 36 36 108 119 119 485 374 374 374 374 132 132 132 8 259 259 190 190 380 288 288 403 171 171 171 246 246 318 24 24 270 270 342 168 168 462 462 4 4 4 4 104 104 104 104 104 468 337 337 337 324 324 422 349 164 164 164 164 164 25 278 278 278 278 278 178 143 321 192 192 419 225 47 491 80 80 80 80 321 75 371 490 490 490 162 232 232 68 68 115 273 273 265 265 265 428 146 146 325 34 191 191 191 314 26 26 359 166 166 166 324 301 42 42 42 147 147 147 380 288 288 443 120 120 120 37 37 24 24 131 404 225 225 225 80 321 373 72 72 72 110 264 264 264 264 264 264 59 59 59 59 452 263 13 78 170 170 491 421 491 491 211 491 421 491 15 15 15 193 193 193 17 +103-1241-0015 103 700 1 18 14 16 15 31 38 5 40 31 24 6 23 1 38 8 33 1 5 25 11 34 19 25 1 6 23 31 27 24 5 10 16 30 13 22 5 23 11 1 18 14 24 7 34 38 5 40 23 3 30 21 1 5 25 11 31 27 38 14 18 14 8 40 1 38 19 10 23 35 22 33 17 30 20 25 19 25 31 5 24 23 8 33 31 5 25 11 24 36 11 40 1 4 25 11 17 30 15 19 25 5 12 14 40 1 31 27 16 3 30 12 20 6 30 11 5 25 13 30 20 5 9 40 14 37 14 1 4 25 19 22 31 33 30 6 30 11 5 25 13 30 20 5 9 40 14 37 14 1 18 5 2 5 6 7 1 2 2 8 3 1 14 5 8 7 9 1 2 4 2 7 4 7 11 6 4 6 4 5 4 3 6 2 1 5 2 5 5 18 5 2 6 10 7 2 1 5 4 6 5 10 1 4 2 2 5 4 3 2 4 6 13 7 1 2 2 6 3 3 3 6 3 3 6 2 3 3 6 3 4 3 6 4 2 1 2 1 3 8 3 6 9 7 2 3 3 5 6 3 3 4 4 5 11 40 7 7 3 4 3 3 3 5 3 1 2 1 2 2 4 2 3 5 3 3 8 21 5 2 2 3 2 4 2 2 2 2 1 2 4 3 4 2 3 5 4 3 7 5 17 17 17 296 363 363 363 52 52 52 52 52 408 51 51 51 184 289 321 320 156 156 156 156 245 349 205 205 261 343 343 343 343 343 343 252 186 39 342 86 86 142 397 141 141 141 281 162 232 232 232 482 482 105 105 196 70 65 65 481 481 481 481 182 182 182 375 375 375 98 98 98 225 225 80 80 491 80 80 321 7 7 364 276 276 346 346 428 428 428 428 146 146 358 358 233 321 227 227 419 225 89 483 321 188 89 446 446 33 394 394 76 164 164 164 164 164 278 278 278 278 120 330 303 303 303 303 117 48 48 417 47 47 491 491 80 80 80 80 289 321 320 287 287 297 297 297 297 293 293 186 162 54 68 115 224 273 84 84 84 274 399 399 70 70 383 383 383 383 167 310 107 447 447 447 393 234 261 25 380 288 151 178 178 458 458 208 302 302 302 302 375 375 122 122 227 419 419 427 82 321 312 312 126 292 292 292 292 23 23 23 101 101 101 149 228 228 321 320 373 156 156 156 245 399 217 217 70 473 65 315 315 315 315 315 450 450 293 169 352 352 352 352 97 397 397 345 345 141 141 281 453 9 26 26 251 241 241 431 284 306 306 306 306 306 306 396 396 396 37 233 36 310 107 107 447 18 97 97 225 321 412 83 55 55 446 67 394 478 66 172 115 273 273 84 410 410 410 43 29 347 347 245 245 58 156 156 156 245 14 14 14 411 287 265 265 265 265 265 265 85 85 85 207 207 318 185 269 433 433 160 97 397 397 345 407 407 407 407 310 107 447 447 26 251 241 367 367 367 367 458 96 96 272 472 472 221 401 321 321 208 79 79 288 288 360 360 360 360 434 434 339 199 340 340 340 116 33 394 478 68 68 172 115 273 319 319 319 203 53 53 251 251 241 431 428 428 428 428 146 146 385 77 77 342 224 89 89 116 33 250 217 217 473 65 374 374 374 132 132 37 37 24 321 270 433 160 112 427 229 247 312 126 326 326 326 101 101 149 149 321 412 412 83 55 55 446 446 67 131 472 472 458 208 208 79 79 380 288 403 403 403 403 207 324 464 464 464 446 116 94 199 493 493 493 493 493 216 300 334 334 304 304 304 185 185 269 323 18 112 112 56 56 56 170 170 28 28 28 491 491 28 28 362 491 362 362 362 491 491 362 362 362 362 40 40 362 218 491 491 305 305 366 366 366 305 366 435 435 435 435 435 435 321 435 435 373 373 66 68 172 115 344 344 344 344 344 274 274 349 205 261 25 106 306 306 306 353 396 313 216 22 448 448 448 14 411 411 153 153 153 387 387 313 314 196 196 398 134 134 468 337 337 337 464 464 255 255 215 96 368 453 453 168 273 498 498 498 396 173 29 29 334 334 59 452 452 263 13 229 491 442 312 312 312 292 292 292 292 292 326 326 326 326 326 326 101 408 149 228 321 305 209 287 44 44 94 199 154 154 154 96 96 482 482 238 6 161 79 153 153 153 153 387 396 240 314 196 309 199 264 264 264 468 468 468 337 337 464 464 464 255 255 215 96 478 342 9 168 470 498 498 498 396 173 173 280 29 334 334 59 452 452 229 321 247 15 193 193 17 +103-1241-0016 103 733 1 24 8 33 18 4 37 31 20 25 12 5 33 12 5 10 19 25 38 5 40 37 13 30 20 29 28 25 33 19 11 5 25 11 29 30 5 25 7 25 31 33 1 12 4 33 12 5 9 19 17 8 40 38 14 16 35 23 5 37 31 29 19 30 19 33 5 25 11 37 19 37 4 31 19 33 20 1 12 5 33 12 5 24 7 34 38 5 40 31 38 20 33 23 19 29 33 5 25 11 19 22 31 29 30 13 31 19 37 1 12 5 33 12 5 16 6 30 18 13 11 38 5 40 9 30 6 11 5 25 11 16 35 23 1 19 25 32 6 30 33 1 3 30 11 19 31 14 25 19 26 19 22 31 33 30 6 30 11 5 25 13 30 20 5 9 40 14 37 14 1 24 8 33 18 4 37 22 5 25 22 23 36 11 19 11 1 6 5 5 2 1 2 3 5 5 3 2 2 2 1 2 8 3 4 2 2 5 3 2 4 4 9 5 3 3 3 2 2 2 2 3 2 2 2 7 5 5 5 15 3 2 3 2 2 4 4 5 8 5 3 2 6 2 3 3 3 7 3 2 4 3 2 2 1 2 2 7 2 5 5 2 3 11 13 3 3 1 2 2 4 10 4 2 2 2 7 3 4 3 4 3 5 3 1 2 2 1 4 3 3 2 2 7 5 6 16 3 2 3 2 2 7 4 3 5 5 4 4 3 4 4 4 11 2 2 2 2 8 3 11 14 7 2 7 5 4 7 10 7 5 3 2 6 5 2 3 4 2 6 1 3 2 2 3 1 2 1 3 2 1 2 3 5 4 4 7 19 5 4 2 1 2 3 2 2 3 5 3 4 2 4 4 4 17 17 51 51 228 289 321 7 70 70 65 428 428 428 146 146 325 449 202 202 202 202 402 162 232 172 172 267 267 267 267 267 434 434 339 248 248 212 45 45 45 45 198 22 5 455 236 129 321 310 107 107 395 395 278 278 330 116 195 250 250 345 141 141 281 281 453 9 142 4 4 4 104 104 104 104 104 468 337 337 324 301 143 129 401 321 74 74 441 441 441 441 441 387 360 360 360 252 339 76 465 449 191 191 191 191 24 325 89 89 446 33 394 76 74 190 492 492 492 313 94 94 331 331 315 315 315 315 450 450 450 413 413 243 243 77 433 86 238 6 6 227 427 427 491 247 126 126 292 326 326 326 326 101 408 149 228 228 321 320 321 127 45 45 45 45 35 35 127 5 5 455 236 129 259 354 278 278 278 278 416 416 192 180 106 265 265 265 265 85 85 85 146 318 49 9 142 397 347 347 347 347 245 349 349 205 261 261 25 424 424 424 175 81 462 462 462 130 402 478 162 232 232 232 232 105 105 336 336 354 485 278 498 468 468 467 277 277 469 325 449 89 89 446 53 394 212 280 106 265 428 428 146 438 173 280 280 486 486 486 460 169 150 150 342 342 224 469 469 325 449 41 41 41 41 19 19 19 454 454 454 78 491 170 491 312 187 187 292 12 408 408 408 149 228 321 321 127 45 45 45 45 35 198 22 5 455 399 217 473 65 315 315 315 315 450 450 450 169 169 164 164 397 397 397 141 141 141 281 31 162 232 232 68 68 482 397 397 397 109 213 213 213 252 252 36 26 26 26 251 241 431 278 278 278 215 215 35 96 96 465 272 89 89 446 67 131 34 154 154 458 96 96 54 142 105 336 336 190 380 288 151 151 169 150 342 342 224 224 494 459 459 459 459 37 173 352 352 352 427 491 247 126 126 126 326 326 326 326 101 101 101 149 149 228 321 321 320 127 45 45 45 45 35 35 198 22 5 455 349 205 234 234 261 25 148 148 148 148 372 372 372 396 58 72 72 110 110 120 120 120 120 240 24 24 133 133 364 345 141 141 141 141 281 281 9 142 221 336 336 259 190 190 380 380 499 499 499 405 426 426 426 426 206 206 206 37 24 34 89 89 446 116 394 90 393 234 234 234 234 261 25 441 424 424 424 182 182 375 375 375 98 98 13 13 417 170 170 47 491 47 491 491 491 2 491 491 316 73 289 289 320 412 188 188 340 340 116 33 394 478 338 338 338 338 395 470 153 153 153 153 387 372 396 396 385 233 227 227 419 439 417 78 47 47 491 47 47 491 80 321 321 80 321 435 209 287 287 353 353 353 353 396 313 236 36 384 490 490 490 31 162 68 115 115 273 308 308 308 396 313 94 94 176 176 135 328 200 200 199 255 154 154 129 401 321 96 66 482 238 272 79 153 153 153 387 387 396 314 196 196 479 398 398 264 264 468 467 467 255 255 215 96 478 342 68 115 273 498 498 498 498 396 173 173 29 29 334 334 59 59 452 263 229 247 247 126 126 326 326 326 326 326 326 326 101 101 101 149 149 228 321 289 320 7 70 65 65 389 428 428 146 240 325 34 202 202 202 402 221 458 27 121 121 121 33 394 76 259 208 208 386 386 386 444 374 374 374 252 325 34 191 191 191 37 24 404 427 229 247 193 193 17 +103-1241-0017 103 794 1 38 5 40 31 27 23 36 11 5 22 30 5 31 23 20 5 16 30 15 11 1 24 4 34 39 36 18 7 13 37 14 1 38 5 40 31 29 13 30 11 12 20 6 30 11 20 23 5 37 31 29 20 22 19 26 16 14 31 33 1 16 6 30 13 40 31 36 25 13 40 32 20 22 5 25 22 23 36 11 19 11 12 5 33 18 20 38 5 40 22 5 24 19 26 33 36 18 14 1 32 20 31 33 35 11 5 29 1 17 30 4 31 29 19 26 38 19 34 38 5 25 34 19 25 9 30 7 25 18 4 25 11 1 12 5 18 4 25 11 5 23 5 37 5 32 4 9 20 27 23 11 16 4 32 5 25 11 22 3 30 29 5 33 9 4 17 1 12 20 5 12 14 32 20 18 13 23 11 7 33 19 18 19 24 1 8 4 1 4 5 2 5 4 2 2 3 2 2 5 2 4 2 5 3 7 5 45 5 6 4 4 4 5 4 4 4 8 4 5 2 3 4 3 4 4 3 3 3 3 4 4 6 4 1 3 4 4 3 3 2 6 4 7 4 4 13 6 3 3 2 3 4 3 3 2 2 3 3 3 2 3 4 3 3 2 3 2 2 1 2 3 3 2 1 4 5 3 2 2 4 5 3 3 7 12 6 3 6 2 3 2 6 8 6 3 2 5 4 3 2 4 2 1 4 4 5 5 9 6 8 4 2 8 3 8 7 3 4 12 2 2 6 3 5 2 3 2 2 2 2 9 5 3 8 6 3 2 7 4 6 2 2 3 6 2 3 2 3 2 4 8 5 11 3 4 5 5 3 6 3 4 4 3 2 6 4 2 5 4 7 14 17 17 17 363 51 51 184 320 320 345 333 333 220 220 402 66 66 68 115 344 344 344 344 274 274 251 251 241 431 374 374 374 374 285 34 469 469 143 458 208 79 459 459 271 31 342 86 26 26 166 166 166 464 464 464 255 255 349 234 234 261 190 380 288 288 403 403 403 207 207 207 37 24 24 404 439 417 417 417 170 170 28 28 491 28 491 362 491 491 362 491 362 491 491 491 362 362 491 362 362 491 40 211 369 369 369 369 21 21 21 21 21 21 21 408 408 408 149 149 228 321 321 320 7 217 70 65 486 486 486 460 460 169 169 164 164 164 485 485 485 485 374 132 132 58 58 72 268 268 268 268 268 88 88 109 84 463 463 463 173 280 29 334 59 59 452 263 263 417 417 417 417 80 321 321 7 7 345 141 141 141 281 162 232 232 232 482 105 336 336 470 470 264 264 264 264 468 468 313 313 314 314 198 22 448 448 448 464 106 106 372 372 372 313 236 236 36 371 485 213 286 286 286 139 302 302 175 175 69 223 223 130 478 232 232 105 105 336 321 354 470 213 213 252 143 192 176 135 135 135 200 248 248 248 393 205 261 25 498 498 498 498 498 396 271 271 39 54 86 238 6 427 427 247 247 126 126 326 326 326 326 101 101 101 149 228 321 321 373 155 155 155 332 332 332 372 372 372 467 253 253 38 162 232 172 172 115 485 374 374 374 348 94 199 253 253 253 99 338 400 400 400 30 422 143 144 27 121 121 121 394 76 76 208 208 386 386 444 444 374 374 252 325 191 191 191 37 314 198 198 45 45 45 183 183 451 30 30 301 378 345 141 141 281 342 342 221 336 144 27 27 351 319 319 319 53 53 176 135 135 200 248 76 75 108 377 123 123 123 123 132 58 156 156 156 156 59 59 452 229 229 247 126 126 326 326 326 326 101 101 408 149 228 321 321 373 400 400 400 30 422 422 162 482 482 482 482 238 272 189 189 189 189 285 34 230 230 230 230 230 215 215 35 74 419 439 439 78 78 47 47 80 80 80 289 289 320 208 79 499 486 486 460 460 169 150 342 105 105 336 354 176 176 135 135 200 248 248 333 333 220 220 220 142 133 364 276 174 174 174 174 319 319 348 348 195 195 90 90 90 393 234 234 234 234 261 261 25 470 278 278 278 330 330 388 195 195 195 250 250 394 32 32 259 354 190 380 380 315 315 315 315 450 450 450 413 413 33 58 58 72 72 72 294 294 294 294 294 294 294 294 294 282 282 388 195 64 212 131 427 321 247 126 126 326 326 326 326 101 149 149 228 321 320 22 5 455 455 72 72 72 294 294 294 294 294 388 348 64 64 212 212 26 302 302 302 175 69 69 69 130 280 44 44 44 99 338 338 338 338 338 395 470 486 486 486 460 460 215 354 41 324 324 324 3 335 14 226 411 411 424 424 424 424 424 424 274 122 122 131 472 393 234 234 261 25 486 486 486 460 460 169 99 436 436 436 60 242 116 116 33 212 131 472 221 321 144 27 437 437 306 306 306 460 215 35 29 469 277 277 314 401 401 321 354 180 376 376 376 376 376 282 207 37 24 192 192 427 321 247 126 126 23 408 408 408 149 228 321 321 320 127 448 448 448 14 14 411 493 493 493 493 493 216 127 300 334 334 59 452 186 99 338 338 400 400 400 30 422 58 58 72 110 110 139 139 139 293 293 122 122 34 180 113 113 113 113 167 167 36 449 123 123 123 123 183 183 57 57 57 57 57 203 381 381 381 48 48 417 417 417 170 421 421 421 421 491 128 491 128 128 193 193 17 +103-1241-0018 103 471 1 8 31 5 29 27 40 39 36 3 30 24 19 31 33 14 24 4 34 39 36 22 5 34 9 14 33 5 37 17 30 20 25 17 15 9 5 23 40 1 32 20 31 13 11 19 25 5 29 19 22 39 36 23 39 14 23 20 22 23 19 30 31 38 20 33 37 28 31 1 8 24 37 13 30 20 17 23 4 11 33 19 31 20 39 36 1 8 38 5 40 9 19 17 19 25 19 26 33 19 9 20 5 16 30 15 11 39 36 38 14 25 33 22 5 24 19 26 16 14 24 20 1 18 7 3 2 4 6 3 1 2 3 3 2 2 3 2 2 4 3 3 2 2 5 3 4 4 3 2 2 2 3 2 3 3 2 5 2 3 3 10 20 6 3 5 3 2 2 2 3 3 2 7 2 4 2 3 2 3 4 9 3 6 6 8 3 3 3 4 7 8 16 8 2 3 2 3 3 3 3 3 1 2 2 6 2 6 5 16 7 2 2 3 1 3 4 2 2 2 3 2 2 3 5 2 5 2 4 2 2 3 4 2 2 2 5 2 2 2 4 4 3 3 6 5 17 17 17 296 317 317 317 491 491 491 491 491 461 184 321 435 435 321 435 287 287 111 111 111 438 162 342 224 494 494 236 74 470 496 496 496 496 496 274 368 368 9 219 152 152 152 88 353 353 353 245 399 70 473 258 31 54 86 238 272 272 300 245 399 217 473 65 486 460 460 169 164 485 485 485 382 422 458 458 144 27 437 437 151 169 169 164 402 221 401 321 354 29 498 313 313 325 34 462 462 130 402 321 259 79 79 288 360 360 360 200 200 248 445 445 180 171 171 171 252 215 8 354 100 302 375 497 98 185 269 433 390 160 112 112 56 491 312 312 312 187 187 12 12 12 12 12 12 12 23 260 260 260 260 391 391 391 491 321 373 338 400 400 400 400 30 422 162 68 68 115 470 470 120 120 240 314 196 340 116 199 44 44 44 129 259 74 492 236 129 321 445 445 485 485 485 485 485 485 374 374 132 359 81 485 485 134 382 134 359 359 81 166 166 324 422 143 401 401 321 321 144 208 208 208 386 386 386 286 286 286 286 286 286 334 382 59 304 313 186 162 66 482 482 482 482 105 397 336 109 213 213 213 252 143 131 472 393 393 261 343 343 343 343 343 343 343 358 39 39 433 433 160 427 56 247 247 312 126 292 292 326 326 326 326 326 101 101 101 149 149 321 412 287 287 111 111 111 356 356 53 394 212 4 104 104 104 104 104 337 337 337 301 143 144 208 386 431 376 376 376 240 24 36 87 87 87 162 232 172 115 267 267 267 267 267 219 219 477 477 477 477 477 132 13 229 491 247 312 126 292 292 292 23 23 23 101 101 101 149 228 321 412 412 287 111 111 111 378 378 141 141 281 453 142 221 336 420 420 420 416 458 445 485 360 360 360 94 176 135 135 248 76 108 377 87 87 129 354 420 420 420 464 464 44 255 38 349 205 205 261 487 288 288 288 171 171 252 24 131 219 152 152 152 378 43 345 347 347 372 396 313 457 131 221 458 144 27 351 351 319 319 203 53 176 135 328 200 248 393 205 155 332 332 332 332 245 399 429 429 429 429 19 19 229 247 247 126 193 193 193 +103-1241-0019 103 151 1 8 18 4 11 24 15 11 5 29 24 8 24 8 25 11 1 12 5 33 19 16 39 36 11 19 11 5 25 22 5 24 16 14 24 20 33 19 25 8 33 1 14 6 4 2 2 4 3 1 4 3 2 5 5 6 2 3 9 3 2 1 3 2 2 2 4 2 3 2 2 5 2 4 3 3 3 2 4 2 3 9 4 4 17 491 211 491 296 296 363 363 326 101 101 149 149 228 321 321 287 111 111 111 438 58 110 254 254 254 314 196 196 217 473 476 476 476 252 325 34 230 230 230 215 35 196 196 46 46 46 46 438 399 399 217 70 65 480 480 480 480 85 299 299 339 212 131 427 229 247 126 326 326 326 101 149 149 321 321 320 45 45 45 325 118 118 118 118 402 219 152 152 422 236 239 384 371 278 278 314 196 196 242 242 33 90 465 144 27 351 351 319 319 203 53 394 76 205 155 332 332 332 399 399 429 429 429 422 143 108 377 377 87 236 10 479 331 331 428 265 428 428 428 146 207 358 233 131 419 321 247 15 193 193 +103-1241-0020 103 485 1 8 38 35 11 5 25 33 9 20 5 9 19 33 5 16 30 15 11 1 4 25 11 19 33 38 35 11 9 20 23 5 37 23 20 33 19 31 23 20 29 19 25 5 38 8 23 11 1 10 13 30 20 33 30 20 6 23 38 8 33 38 19 34 9 23 36 24 19 25 12 5 24 36 25 32 8 25 11 27 25 33 39 36 34 19 26 22 1 39 36 22 35 11 19 24 4 21 5 25 39 36 38 14 11 38 13 23 19 26 19 25 24 3 30 9 5 23 18 6 23 40 22 35 11 5 25 33 39 36 1 11 8 3 2 1 2 1 2 2 4 2 4 2 2 3 6 2 6 4 12 7 1 2 2 2 1 2 2 2 4 9 3 6 2 3 3 2 5 2 3 3 1 2 3 5 7 4 2 2 8 3 4 3 4 3 5 7 7 4 6 5 1 2 5 4 3 8 3 2 2 1 2 4 6 3 6 6 3 3 2 1 4 2 1 4 3 5 6 26 4 2 4 1 2 2 4 5 4 2 2 2 3 2 2 2 4 2 2 3 2 2 3 6 4 2 2 2 3 6 9 4 4 3 3 1 2 2 2 4 6 11 17 17 17 363 363 363 51 149 228 228 321 321 287 287 111 111 111 111 378 378 43 389 389 389 314 242 242 394 394 32 259 420 420 420 420 464 44 44 236 129 354 354 278 278 325 34 300 255 349 349 234 234 261 190 487 288 288 288 403 171 207 207 37 24 131 427 491 247 126 126 326 326 326 326 101 149 149 149 228 321 209 83 55 55 55 55 322 94 199 177 177 177 457 389 389 389 314 259 259 420 420 420 301 301 251 251 251 251 251 251 251 241 266 266 266 266 266 173 402 402 26 359 359 81 166 324 422 36 377 87 87 38 162 232 172 26 26 359 444 444 213 252 8 354 89 340 116 199 44 44 43 43 364 276 346 346 346 265 85 85 85 139 139 293 293 122 122 35 401 401 401 75 310 107 107 107 395 395 351 264 264 264 468 468 406 337 337 324 252 143 36 161 487 487 487 41 324 3 335 14 14 411 297 297 297 297 297 297 297 293 293 497 497 43 43 364 364 276 346 346 428 428 428 146 358 76 449 472 397 397 333 333 220 220 164 142 221 401 321 321 321 354 425 425 431 374 374 374 374 374 132 132 203 203 53 473 340 340 116 466 22 283 455 399 217 70 473 65 65 350 350 413 413 33 33 394 478 338 338 338 395 470 480 480 480 85 299 299 339 64 212 465 384 430 430 430 430 430 465 449 152 152 152 152 349 164 164 214 214 214 214 360 328 328 200 243 233 192 192 419 229 491 312 312 491 187 187 187 201 201 201 201 201 201 201 201 491 201 491 201 201 435 211 211 408 149 321 321 321 219 152 152 152 152 143 458 144 389 389 389 325 34 255 399 217 217 65 486 486 486 460 460 240 310 107 395 242 116 116 219 219 152 152 378 378 347 347 347 236 239 161 397 133 276 109 189 139 139 175 81 176 135 200 464 464 340 116 33 33 250 217 70 70 70 65 306 306 306 306 396 134 215 35 29 100 497 497 497 58 72 72 72 72 437 481 481 481 481 481 481 182 182 182 375 375 375 185 269 342 86 221 336 144 430 430 430 430 430 430 430 430 430 131 449 449 485 152 477 477 374 132 132 13 229 491 247 312 15 15 15 15 193 193 193 17 +103-1241-0021 103 758 1 24 4 34 39 36 18 4 11 33 15 22 5 25 12 5 31 22 30 6 25 20 23 19 33 5 23 18 4 25 11 6 22 38 14 11 23 20 19 25 18 19 40 1 12 13 25 5 25 11 12 13 30 1 18 20 11 19 31 8 11 19 11 18 38 5 33 19 11 36 1 18 20 22 35 11 25 3 33 13 23 12 19 31 10 8 23 11 38 19 12 5 17 23 27 19 26 8 40 1 12 4 33 12 13 30 18 4 11 9 5 25 5 24 19 31 33 15 22 1 18 20 38 35 11 33 15 22 18 14 18 27 24 5 25 11 23 13 33 24 3 30 19 23 5 11 36 12 4 33 1 32 20 22 35 11 5 25 9 20 23 13 16 33 4 33 9 30 8 33 30 19 37 14 13 25 20 18 7 1 24 7 6 4 2 5 5 2 3 4 4 3 3 2 1 3 6 2 2 4 3 3 3 2 1 2 2 6 5 3 5 7 4 2 2 3 2 5 2 2 5 8 9 17 6 6 3 3 1 3 2 5 9 5 6 2 1 3 4 5 2 2 1 3 2 3 5 1 2 10 37 5 3 3 3 2 3 5 7 2 5 1 3 6 6 6 5 3 1 2 3 2 4 4 5 3 5 10 7 16 4 2 2 2 2 2 3 1 2 4 1 2 3 2 3 6 4 6 10 25 6 3 2 2 2 4 4 3 2 4 4 6 3 1 2 1 2 2 3 2 2 5 2 4 2 3 5 3 6 6 22 7 3 4 2 2 2 1 4 4 3 3 3 2 2 3 3 2 5 2 3 3 3 4 3 2 4 4 10 4 17 17 17 296 317 317 317 317 317 491 317 317 461 461 461 461 461 461 461 184 184 184 184 321 320 7 217 217 217 473 329 329 329 329 329 460 169 164 164 164 219 485 485 485 374 132 132 274 58 58 72 110 254 254 254 254 314 401 75 108 119 295 295 295 295 295 143 458 192 242 242 116 466 466 22 283 455 38 162 54 482 482 105 221 336 79 79 499 499 405 206 206 348 199 41 324 324 301 251 241 431 278 278 285 302 497 497 497 58 58 72 110 294 294 294 294 294 294 282 388 64 212 131 335 14 14 411 411 284 405 405 405 206 178 35 35 441 441 109 109 134 313 24 26 26 359 359 474 474 324 464 340 340 340 116 33 58 183 183 257 257 257 257 257 120 50 50 185 185 185 269 433 433 390 18 427 56 247 312 312 126 292 292 326 326 326 326 326 101 101 101 408 149 149 321 289 7 7 7 4 127 361 361 361 361 361 330 388 94 199 89 89 446 116 33 212 212 127 114 361 361 361 264 264 264 264 468 59 452 452 263 263 417 417 414 47 80 321 321 435 373 451 451 30 30 236 325 490 490 38 162 342 115 273 265 265 428 146 146 325 34 191 191 325 133 133 259 181 181 181 181 167 457 75 108 377 87 87 236 325 371 374 374 374 374 132 98 98 48 48 417 417 170 170 102 102 28 28 40 40 40 40 40 40 40 40 40 40 40 491 362 491 218 366 305 305 491 366 366 40 40 40 40 435 435 435 435 435 373 451 451 30 30 30 422 458 144 27 389 389 389 389 196 196 479 331 307 307 61 61 167 167 457 75 108 119 351 351 139 139 139 293 293 293 216 216 114 258 258 31 54 54 238 238 221 321 310 107 395 395 437 91 91 91 85 85 85 85 450 293 293 122 122 131 133 333 333 220 220 198 22 44 236 129 321 208 208 425 386 241 431 84 496 496 88 88 176 176 176 328 200 200 464 106 265 265 265 265 265 85 85 85 207 318 318 39 433 433 160 427 247 247 126 126 126 326 326 326 326 326 326 326 101 101 149 149 228 321 320 127 45 45 45 45 35 198 114 0 0 222 58 58 110 254 254 254 314 401 321 354 137 137 137 94 44 44 44 217 473 65 258 31 31 342 68 68 68 238 6 272 470 470 470 171 171 171 358 358 358 233 321 192 192 419 419 439 439 78 78 78 491 28 491 28 28 28 2 491 491 2 341 341 341 12 12 12 21 21 21 408 408 149 228 321 321 373 451 451 30 30 30 378 378 389 389 389 389 129 259 108 119 295 295 295 295 295 143 458 192 156 156 156 245 245 58 72 72 350 350 350 350 350 350 413 203 381 53 89 89 322 67 466 241 431 443 167 167 457 196 217 65 329 329 42 42 147 147 380 256 139 175 175 423 423 423 423 236 75 371 371 374 374 132 132 216 127 114 92 92 92 92 92 167 385 243 227 419 439 78 78 170 170 170 47 491 491 2 2 491 2 2 491 491 2 491 316 435 435 316 316 435 321 435 373 338 338 400 400 400 30 422 143 458 144 389 389 389 389 314 242 242 394 76 76 259 420 420 420 301 26 251 241 431 443 443 169 169 402 402 6 272 415 415 385 129 401 321 259 190 380 499 499 428 428 146 146 457 457 147 147 380 288 288 173 173 29 29 495 495 406 467 467 365 330 94 475 475 324 324 58 58 72 110 268 315 315 315 268 450 450 98 98 229 247 15 15 193 17 +103-1241-0022 103 817 1 25 27 24 4 33 14 38 5 33 24 19 31 33 15 22 18 4 11 9 19 25 24 15 11 1 31 27 6 23 22 38 13 31 10 5 25 40 5 25 11 13 22 31 29 23 5 25 15 32 5 25 40 24 8 33 13 40 38 13 23 9 20 11 19 16 14 11 5 25 33 19 23 18 20 38 5 40 31 15 16 23 20 9 4 22 4 33 17 30 20 25 17 15 9 5 23 40 1 8 24 31 3 30 20 8 38 5 40 23 15 33 1 18 20 31 13 11 32 8 23 20 1 22 5 24 5 23 6 26 1 12 5 18 6 30 31 19 40 27 37 14 19 25 12 20 39 3 30 11 1 17 19 37 24 20 39 35 30 9 4 17 1 27 8 22 5 25 22 13 30 20 19 33 1 12 5 10 8 23 11 30 19 31 29 3 25 11 19 11 10 19 30 16 5 23 20 1 8 4 2 4 3 3 3 4 3 3 2 2 5 3 3 2 1 2 1 2 2 2 4 7 5 14 6 5 7 5 3 2 3 4 4 3 4 2 1 2 1 3 3 3 2 2 2 2 5 7 2 5 4 3 4 2 3 4 3 5 3 3 3 3 2 6 5 3 1 3 3 2 2 3 2 2 2 2 5 5 2 3 2 3 4 4 2 2 3 3 3 3 3 5 2 2 4 10 35 9 4 5 4 2 4 3 2 2 4 3 5 12 6 6 2 5 3 3 5 6 3 8 23 4 2 2 1 4 4 5 24 2 2 4 3 3 4 3 3 5 5 2 2 2 2 2 3 6 5 5 25 3 2 2 2 2 2 2 2 3 8 7 21 10 4 3 1 4 6 3 4 5 2 7 12 2 2 6 4 3 2 1 2 3 4 2 2 2 1 3 7 1 3 4 2 2 8 6 17 17 17 363 51 51 228 321 320 309 331 331 231 231 399 399 473 65 486 486 460 240 285 300 382 245 43 364 276 181 181 181 181 167 35 35 196 196 473 258 258 31 342 86 86 6 272 470 470 171 171 252 458 458 192 389 314 314 321 354 137 137 137 399 217 217 473 476 476 476 476 476 476 207 37 24 131 427 229 321 247 312 126 292 292 23 23 23 23 408 408 391 228 228 321 373 66 172 115 273 344 84 274 88 14 14 411 297 297 297 297 297 297 293 293 122 35 458 208 208 441 109 151 151 151 169 150 54 238 238 310 107 60 298 298 298 379 471 471 49 342 89 89 446 67 34 145 443 154 178 96 96 342 105 105 321 354 386 386 386 469 116 94 418 418 418 418 418 418 99 436 436 436 60 298 298 298 379 379 471 471 471 49 9 142 221 196 70 65 428 428 428 146 325 325 34 253 253 453 9 142 133 364 276 109 109 139 139 139 293 293 293 122 35 354 420 420 420 422 36 384 490 490 490 349 349 234 261 25 487 498 498 498 396 313 285 131 34 89 116 33 394 465 377 351 139 139 139 175 58 451 30 30 378 43 141 141 141 31 162 232 68 68 115 273 470 171 171 252 173 402 402 26 359 166 166 301 8 354 354 180 376 376 460 178 178 458 192 415 415 314 472 221 458 208 79 288 288 360 360 434 200 248 248 212 445 445 171 171 171 171 252 215 354 100 100 302 375 375 185 185 269 390 390 18 112 427 56 56 312 312 312 312 292 292 292 292 292 12 12 12 12 12 12 12 12 260 260 260 260 163 163 163 163 163 163 491 316 316 491 316 316 73 289 321 320 287 287 287 111 111 111 85 438 203 53 394 478 162 232 68 115 273 106 499 499 306 396 337 337 464 464 464 111 111 378 88 345 141 281 31 342 26 251 251 241 431 403 171 171 171 358 358 233 321 227 227 419 419 439 439 225 225 47 47 47 491 47 80 80 80 289 451 451 451 30 30 422 162 232 172 115 179 179 120 120 314 457 310 310 338 338 395 499 499 265 265 85 146 146 37 359 359 474 474 474 19 454 454 417 414 170 170 170 47 28 28 2 2 2 491 491 2 2 2 2 491 316 491 316 435 435 289 435 321 144 27 351 319 319 53 255 255 255 251 241 431 235 235 235 235 413 413 98 48 13 13 13 170 321 170 312 187 187 292 292 292 292 23 23 23 23 23 101 101 149 149 228 289 321 321 127 5 5 455 72 72 441 153 153 153 372 396 313 186 54 54 224 50 356 281 281 9 168 106 410 410 410 410 410 173 402 29 495 406 467 340 340 340 466 22 283 455 448 219 219 219 180 180 306 306 306 306 306 306 59 37 37 404 439 439 439 78 78 170 170 28 28 28 491 2 2 491 2 2 2 491 491 2 316 491 316 316 316 73 73 289 321 321 445 445 278 278 173 196 196 429 429 429 219 464 222 222 245 245 245 8 354 180 376 376 376 376 376 282 37 37 233 192 419 419 439 78 170 170 442 442 187 442 187 187 12 12 12 12 260 260 260 149 149 289 289 321 289 209 287 16 16 16 16 16 88 88 111 111 111 111 438 143 35 389 389 389 33 394 76 465 445 445 445 351 351 264 264 264 468 468 468 337 337 324 324 464 277 277 277 385 36 227 419 439 78 78 170 491 47 187 47 47 47 442 442 442 442 442 127 22 5 236 36 36 107 395 351 91 91 91 91 206 206 122 122 35 29 456 456 31 162 9 105 336 74 106 426 426 206 348 64 212 191 191 191 314 401 321 108 107 107 395 485 286 286 286 468 245 349 349 155 262 262 359 359 474 474 474 474 19 454 229 321 247 15 15 15 193 193 17 +103-1241-0023 103 833 1 19 33 19 40 5 25 33 18 13 37 20 1 8 37 17 3 33 1 6 23 24 8 38 14 23 11 23 20 17 35 11 40 19 25 19 33 1 9 5 33 19 33 19 40 5 25 33 18 13 37 20 1 4 25 11 19 16 19 33 19 40 5 25 33 22 13 30 20 11 19 25 21 5 31 33 5 31 14 33 5 25 38 15 12 5 18 4 25 11 5 23 29 35 23 40 7 33 1 31 27 8 11 9 13 33 14 22 20 29 19 33 9 19 22 5 40 8 25 27 12 20 19 17 40 4 22 33 25 4 22 5 37 19 33 1 19 33 31 5 25 13 22 31 33 30 20 24 23 20 27 23 11 22 3 30 29 5 33 9 4 17 1 27 8 24 37 13 30 20 17 23 4 11 39 36 37 22 5 24 1 20 37 19 25 19 16 19 33 38 35 11 18 4 37 9 19 25 8 31 33 19 31 23 20 29 19 25 5 38 8 23 11 10 13 30 20 33 30 20 1 8 4 2 2 4 1 2 1 4 3 4 8 14 7 1 4 4 3 1 7 3 4 6 4 3 3 2 2 2 4 4 3 3 2 2 4 3 15 3 1 3 1 3 1 4 2 1 2 4 2 4 10 23 6 1 2 4 3 2 2 2 3 2 2 2 6 3 4 2 3 2 4 3 3 3 3 2 6 5 1 2 3 4 7 3 1 8 2 2 2 1 3 4 3 3 4 7 4 12 7 4 6 2 2 2 3 3 6 3 3 3 2 2 2 3 3 4 5 5 3 3 3 2 5 4 5 6 2 4 3 4 3 2 3 8 18 4 2 1 2 2 1 3 3 2 2 4 2 1 6 3 6 3 4 3 3 2 2 2 4 6 6 27 8 3 3 3 2 3 4 3 2 5 2 3 2 3 6 3 9 6 7 2 2 1 3 4 2 4 2 2 1 2 1 3 3 2 6 5 4 2 3 3 2 3 3 1 2 4 5 6 3 2 6 4 3 3 5 2 8 10 17 17 17 363 51 51 228 289 321 188 177 177 177 325 356 356 356 342 342 224 242 242 116 131 131 72 72 110 443 443 240 173 280 41 41 41 41 19 454 417 417 417 417 170 47 491 47 491 491 491 47 47 80 321 321 435 435 435 209 111 111 111 202 202 402 402 458 27 180 405 405 206 167 457 14 14 14 209 411 297 297 297 297 297 297 297 293 399 70 70 46 46 46 46 46 438 378 43 364 109 109 498 498 134 387 122 122 26 26 359 81 166 324 416 239 458 144 180 484 278 240 314 77 270 342 224 340 340 340 94 199 277 277 277 277 227 419 229 247 247 126 126 326 326 101 101 149 391 80 80 80 80 289 321 354 159 159 159 325 34 177 177 325 356 356 356 31 342 224 242 242 379 131 131 72 72 110 443 443 443 173 173 280 41 41 41 41 19 19 454 454 454 78 170 170 491 312 312 292 292 292 292 292 21 21 21 21 21 21 408 408 149 149 228 228 289 321 209 209 83 55 55 322 322 94 199 118 118 118 118 118 205 177 177 177 177 325 356 356 356 342 342 242 242 116 64 131 472 221 144 445 445 351 351 264 486 468 468 468 337 337 337 324 252 325 34 89 340 116 33 394 212 465 395 395 151 151 169 150 86 86 6 272 34 44 38 162 68 172 115 273 498 498 498 396 240 35 242 242 242 116 250 250 364 364 109 109 403 403 403 207 171 3 252 216 198 22 5 455 72 72 72 72 294 294 294 294 330 64 64 212 302 302 302 497 122 129 259 74 441 441 424 424 497 497 497 49 342 168 180 180 113 113 113 113 450 167 167 131 427 321 247 126 126 326 326 326 101 408 408 149 391 491 321 373 66 68 68 115 273 84 16 88 88 111 111 111 111 438 438 438 35 259 354 180 443 443 285 300 382 313 313 143 458 458 445 445 213 213 213 252 215 354 277 277 277 277 143 259 259 354 420 420 143 458 144 351 494 253 368 453 168 106 111 111 111 438 438 10 10 479 331 84 84 496 274 216 198 448 448 448 464 154 154 154 416 32 96 368 453 453 115 470 470 486 486 376 460 460 178 35 96 96 401 196 196 309 309 479 331 486 486 460 460 178 458 192 192 69 223 130 280 277 277 277 277 385 385 75 227 419 439 78 170 47 47 47 491 491 491 2 2 491 491 316 316 316 73 289 321 321 209 177 177 177 356 356 342 168 44 116 199 154 154 96 96 54 482 238 161 161 487 288 360 360 360 339 53 359 166 166 166 324 14 14 411 411 424 424 424 424 424 424 122 122 122 131 472 221 144 27 437 306 306 306 306 396 215 35 29 277 277 314 401 321 259 354 180 376 376 376 376 120 282 37 233 192 419 427 78 170 491 312 312 312 341 341 341 341 341 12 12 12 12 21 21 326 326 326 326 101 101 149 149 228 289 321 321 209 287 16 16 16 88 88 111 319 319 203 53 394 212 4 104 104 104 104 406 337 337 337 324 422 143 458 208 386 431 376 376 376 460 240 24 36 107 152 152 152 202 402 402 402 259 144 27 27 351 319 319 319 319 203 381 381 117 48 417 417 417 417 197 491 435 80 289 321 209 188 357 357 357 357 357 173 280 242 116 94 118 118 118 118 118 280 177 177 177 177 457 457 364 345 389 389 389 285 34 202 202 202 402 401 259 354 137 137 137 137 33 10 10 479 331 265 265 428 146 146 146 39 86 6 272 87 87 87 162 54 86 26 26 444 444 213 252 215 354 340 340 340 199 44 44 44 43 43 364 276 346 346 265 85 85 85 139 139 293 122 122 314 401 401 75 107 107 395 351 351 264 264 468 468 406 337 337 324 422 36 36 161 161 487 487 487 41 41 19 19 19 454 417 417 421 421 491 421 128 128 128 193 193 17 +103-1241-0024 103 794 1 38 20 37 17 3 33 19 11 30 8 37 5 23 6 26 29 20 31 18 4 37 5 25 33 38 20 1 24 19 31 19 40 31 29 13 25 31 14 31 13 11 19 33 38 5 40 15 33 24 8 23 40 1 8 24 17 23 4 11 9 19 22 5 40 8 23 5 37 11 30 8 37 19 26 1 27 19 33 31 20 24 40 31 27 38 5 25 11 14 16 5 23 12 5 33 8 24 17 27 19 26 33 5 23 19 37 38 19 34 39 36 5 25 11 9 19 23 6 26 33 19 39 36 1 8 37 25 13 37 14 9 19 23 6 26 11 33 36 13 25 20 9 5 11 20 1 25 3 33 30 20 23 20 1 9 5 33 12 20 5 31 8 23 5 24 38 5 40 12 5 38 14 31 33 1 8 37 27 25 23 20 9 19 25 19 25 19 33 16 6 30 24 5 25 34 31 1 9 5 33 12 4 33 38 5 40 19 25 5 16 1 13 5 2 2 2 3 4 1 2 3 4 3 2 2 4 4 5 5 4 3 3 2 2 2 2 2 8 19 3 2 3 2 2 2 3 3 3 3 3 5 2 2 2 2 2 1 4 7 3 3 8 3 5 16 7 3 3 3 5 2 3 2 3 2 3 4 6 3 4 2 3 6 1 2 9 13 11 3 4 5 3 3 2 5 7 4 2 6 2 2 4 2 2 1 2 1 3 3 3 1 3 1 3 2 6 2 3 2 1 3 1 3 2 1 2 1 2 6 4 4 4 2 5 5 16 6 3 2 1 3 2 2 2 3 4 2 2 3 3 2 2 3 2 2 3 8 10 4 2 4 3 5 4 9 16 3 3 2 2 2 3 4 6 2 2 2 2 1 4 2 2 5 6 5 5 22 7 4 2 2 2 3 3 2 2 3 2 3 2 5 3 3 4 4 3 3 4 10 2 2 2 3 3 3 1 2 4 2 4 6 11 10 17 17 17 296 317 491 317 317 491 184 184 184 184 320 7 345 152 152 152 152 402 221 144 180 189 405 206 167 36 377 87 87 236 161 79 499 499 499 428 146 173 173 280 29 255 251 251 241 235 235 235 235 235 348 248 76 259 74 74 351 213 213 213 213 213 186 39 342 342 224 110 110 110 202 202 202 430 430 430 430 430 243 133 259 345 109 41 41 19 19 454 229 82 229 312 312 126 292 292 292 292 292 292 21 21 21 21 408 408 408 149 149 321 321 320 473 258 258 31 342 224 494 494 31 162 232 105 105 336 470 470 432 330 330 379 77 342 224 300 300 382 186 186 54 172 273 470 470 120 240 325 177 177 177 378 345 141 141 281 342 168 470 411 171 171 171 171 252 314 401 196 196 217 70 65 265 265 265 85 85 85 139 139 375 375 185 269 433 427 427 247 247 126 126 126 326 326 23 23 23 23 23 101 149 149 149 321 321 287 111 111 111 438 356 203 64 90 212 144 208 386 431 376 376 376 376 85 37 24 35 259 354 420 420 422 143 144 27 351 368 453 168 106 111 111 111 438 438 251 251 251 241 266 266 266 266 173 402 402 221 75 161 161 79 499 499 428 85 146 146 173 173 176 176 176 328 200 200 117 404 404 439 439 225 237 237 260 260 260 260 260 391 391 289 321 321 321 209 287 287 16 16 16 16 16 88 88 177 177 177 177 35 478 478 68 172 172 444 444 444 360 339 339 394 478 478 232 232 68 172 344 344 344 344 344 274 43 43 43 364 364 276 174 319 319 348 348 348 64 64 212 212 300 469 134 349 155 262 262 100 100 497 122 45 45 45 325 111 111 111 203 53 90 212 144 106 88 319 135 135 248 465 377 87 87 87 251 251 251 251 241 278 278 278 173 402 402 345 333 220 220 164 219 477 477 477 88 89 89 446 53 212 354 354 255 251 251 251 251 241 431 235 235 235 235 235 348 248 248 465 449 377 123 123 123 219 219 477 477 477 477 477 132 13 321 247 312 126 126 326 326 326 326 326 326 101 101 149 149 228 321 412 287 111 111 111 438 202 402 6 479 463 463 463 280 29 382 245 8 354 354 134 497 251 241 431 235 235 235 235 348 76 465 108 123 123 123 88 109 475 475 94 475 475 475 301 8 354 106 493 493 240 325 41 41 41 19 454 454 229 491 247 312 126 126 23 408 149 149 228 321 320 7 331 307 307 307 167 457 457 42 147 380 485 213 213 286 286 139 139 175 359 474 474 41 41 19 19 454 454 13 414 170 47 47 47 491 47 491 491 47 491 102 435 80 80 289 321 7 7 354 159 159 159 314 35 22 448 448 464 464 255 38 162 68 115 273 106 265 265 85 85 146 175 81 242 203 250 250 345 141 141 281 453 9 198 22 283 455 43 364 364 276 109 109 498 498 498 396 271 271 39 39 86 86 238 6 227 419 439 78 56 56 28 491 28 491 2 491 2 341 341 12 12 21 21 23 101 101 101 149 149 228 321 287 287 111 111 202 202 202 280 29 106 350 350 350 175 466 166 166 166 301 8 137 137 137 137 94 199 340 340 340 94 199 277 277 385 457 393 205 155 155 332 148 148 148 372 372 245 399 399 217 70 65 319 319 319 319 379 379 243 77 270 433 433 112 427 247 247 126 126 23 408 408 391 228 321 320 320 159 159 159 159 129 259 127 114 92 92 92 92 457 457 141 141 141 281 342 168 168 340 340 116 10 479 331 331 230 230 230 169 169 169 352 352 352 352 352 352 112 112 78 56 421 421 491 15 15 15 193 193 193 17 +103-1241-0025 103 241 1 19 33 31 38 14 31 12 5 25 1 13 25 20 34 19 26 39 36 22 35 11 19 24 4 21 5 25 1 24 19 31 19 40 31 29 13 25 31 14 31 13 11 19 33 38 5 40 38 19 22 5 11 5 37 24 20 33 19 33 6 22 23 8 22 12 4 33 1 13 4 3 3 4 4 3 3 2 3 3 5 2 4 3 2 3 2 3 2 1 2 3 6 6 5 3 7 19 4 2 3 2 2 4 3 1 5 2 3 4 1 2 1 2 2 1 4 3 2 3 2 2 1 3 2 2 3 3 5 5 4 3 3 4 3 5 3 9 17 17 17 363 363 363 51 51 51 228 491 321 321 209 177 177 177 177 356 77 342 142 397 336 345 109 498 498 498 313 186 39 342 68 198 114 114 242 446 116 457 335 401 321 226 321 209 475 475 475 475 475 475 475 475 422 349 164 214 214 214 214 200 248 219 152 152 152 143 458 192 389 389 34 121 121 399 217 217 217 217 473 65 486 486 486 460 460 460 24 310 107 107 242 275 275 275 303 303 117 404 13 78 170 170 491 491 312 187 187 187 187 12 12 12 12 12 408 408 149 149 228 321 320 7 473 258 258 258 31 342 224 494 494 31 162 232 232 105 105 336 470 432 432 330 379 64 77 77 224 300 300 382 186 186 54 273 470 470 240 34 177 177 378 345 141 141 281 9 142 397 364 364 109 109 278 143 458 192 192 469 325 34 223 130 402 196 70 429 429 429 422 108 377 87 87 236 259 108 119 119 437 405 405 405 405 206 178 35 321 26 386 266 266 266 266 266 178 458 96 321 127 114 92 92 92 92 92 167 385 427 82 247 126 126 326 326 326 193 193 193 +103-1241-0026 103 550 1 12 15 1 38 14 17 35 11 1 39 36 25 27 1 12 20 5 31 8 23 5 24 29 20 29 5 23 1 9 5 33 12 13 30 19 40 31 27 23 19 33 5 23 31 22 27 29 16 14 12 20 19 24 4 21 5 25 15 32 5 25 19 25 5 25 5 31 8 23 5 24 1 27 25 23 20 21 5 31 33 19 25 12 20 5 12 14 6 30 16 5 25 40 1 19 33 38 5 40 29 30 19 33 20 19 25 33 30 19 31 33 19 26 33 5 19 24 4 21 5 25 34 19 26 40 5 9 7 33 12 13 24 1 12 2 4 2 2 2 4 7 6 12 4 3 3 8 10 4 1 3 3 6 2 3 2 2 5 3 2 8 27 2 2 2 2 2 2 3 1 6 4 3 2 1 2 3 7 3 4 2 4 2 2 3 3 4 3 5 2 6 6 7 1 2 4 1 2 3 3 7 5 5 2 6 28 6 3 2 3 4 2 4 2 2 2 2 3 2 3 3 6 3 6 2 5 12 40 4 2 3 4 3 3 2 1 2 3 3 2 2 1 2 2 3 2 2 4 2 1 4 4 4 1 3 2 2 3 4 1 2 6 3 2 6 7 5 17 17 17 296 317 491 184 184 184 184 289 321 320 127 0 0 0 0 378 354 347 347 347 245 416 129 321 144 180 484 484 484 484 120 37 37 37 24 24 404 414 414 414 47 47 47 47 491 47 80 80 321 321 289 7 219 152 152 152 116 94 331 84 84 84 84 16 274 98 229 247 247 126 326 326 326 326 101 149 228 321 321 320 22 448 464 255 38 162 342 115 273 106 265 265 85 85 146 175 175 81 242 203 394 76 259 74 485 213 213 213 252 215 259 354 100 100 100 497 98 98 98 13 417 417 170 170 170 170 28 491 28 2 2 2 2 2 2 2 2 2 2 2 2 491 316 316 316 73 289 321 289 321 159 159 159 159 35 127 114 0 222 406 467 356 356 281 162 232 232 68 172 115 344 344 344 344 274 274 251 241 431 278 285 285 302 497 497 186 162 162 232 482 482 482 105 336 144 180 496 496 274 215 457 96 393 155 155 332 332 216 216 448 448 448 464 121 121 399 217 217 65 65 486 460 240 240 310 449 107 242 242 116 33 10 10 10 309 331 418 418 418 418 418 252 99 99 436 436 60 60 298 298 116 199 199 340 340 116 94 199 242 466 94 199 459 44 38 31 162 68 68 115 273 273 265 265 85 85 146 146 175 175 81 81 275 203 203 381 381 48 13 229 321 247 312 126 292 292 292 292 292 292 21 21 23 23 23 23 23 23 260 260 260 260 260 391 391 228 321 321 412 287 287 350 350 350 350 350 250 81 166 166 166 422 36 310 395 395 151 151 150 39 86 238 272 34 340 340 116 466 22 448 448 464 464 493 493 493 300 300 382 245 14 14 411 411 153 153 372 372 372 396 349 349 234 234 25 242 275 275 379 379 471 471 49 269 433 390 390 112 112 56 56 56 305 170 28 28 28 491 28 491 28 362 491 362 491 362 362 362 362 40 40 362 362 362 305 362 362 491 218 218 40 40 40 40 435 435 211 21 326 326 408 408 408 149 228 321 177 177 177 177 378 364 345 141 141 141 141 281 453 9 142 336 74 190 487 104 278 325 34 324 324 464 464 121 121 121 64 161 161 487 469 186 54 86 6 272 176 176 328 200 248 76 465 377 87 123 255 255 399 217 473 65 486 486 460 460 240 310 449 242 242 116 394 76 465 214 214 214 328 200 248 49 453 342 168 255 8 354 180 113 113 113 113 167 167 35 198 198 114 114 114 57 57 120 282 203 381 381 381 117 48 229 321 247 193 193 17 +103-1241-0027 103 743 1 18 36 18 4 11 9 19 25 31 33 27 23 5 25 5 38 15 16 14 24 18 14 29 13 30 5 25 33 31 19 25 18 14 19 25 16 5 25 31 20 9 8 5 22 30 36 23 25 14 31 18 36 11 8 11 9 19 16 6 30 32 20 22 35 11 22 5 25 16 13 31 1 8 39 36 40 11 33 5 23 8 5 38 15 22 4 33 25 8 33 31 5 25 11 19 24 4 21 5 25 34 19 26 40 23 8 22 12 4 33 1 9 19 22 5 40 8 11 19 11 5 25 18 4 37 33 8 24 19 25 12 5 11 15 1 8 17 13 31 12 4 33 31 38 8 5 24 31 27 34 19 25 1 8 4 24 11 30 13 11 16 5 23 34 19 25 15 25 33 8 1 12 13 30 19 40 5 25 5 29 19 22 3 25 24 8 9 27 25 40 1 5 5 3 1 2 2 2 1 4 4 4 3 4 1 2 2 5 3 4 2 2 3 2 8 3 2 2 2 2 2 2 2 2 6 4 3 3 2 3 4 3 4 6 2 8 2 5 5 5 6 5 3 3 4 8 2 2 3 3 2 1 5 2 3 1 2 3 1 2 6 5 10 30 7 4 2 4 2 1 3 3 5 4 3 3 3 2 3 2 5 3 2 1 2 1 2 4 4 4 2 3 3 1 5 2 3 5 3 2 7 4 17 2 3 2 3 3 2 3 2 2 1 2 4 1 2 6 5 3 1 2 2 2 2 11 27 6 4 3 3 3 1 2 3 2 5 2 2 5 4 4 4 7 17 8 4 3 2 2 2 3 2 1 2 4 3 2 6 2 2 10 34 3 2 1 3 2 2 1 3 8 4 3 2 2 3 6 4 8 4 8 6 17 17 363 363 51 228 373 489 489 489 489 88 88 254 254 254 314 8 354 137 137 137 33 394 478 478 482 482 482 6 272 371 189 189 424 424 497 122 34 34 242 116 285 199 255 43 43 109 109 403 403 171 301 349 205 155 165 165 165 53 58 156 156 156 156 245 129 129 321 74 74 351 351 351 264 264 468 468 406 11 11 379 379 77 77 342 224 340 340 94 199 156 156 156 245 14 14 411 411 188 121 121 121 53 394 76 205 261 25 469 11 379 379 77 342 342 224 41 41 41 301 143 259 354 62 62 62 62 464 464 44 44 44 129 321 458 208 208 190 190 441 487 487 153 424 424 182 182 497 497 497 497 122 10 10 479 331 498 498 498 498 498 396 271 186 39 323 323 142 489 489 489 489 422 32 239 321 384 371 180 265 265 265 265 85 85 146 24 35 259 354 255 255 349 155 155 148 148 148 387 186 99 400 400 400 30 143 458 144 389 389 314 90 458 144 121 121 203 394 76 4 205 261 25 470 443 443 443 169 271 150 39 433 433 433 160 112 427 56 247 312 312 312 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 23 23 260 260 260 260 260 260 391 149 228 321 321 412 287 287 111 111 438 219 219 219 485 485 374 186 162 54 86 238 272 272 494 139 175 251 241 431 265 265 85 146 146 464 464 255 43 43 109 109 403 171 171 143 192 192 469 314 314 196 196 479 331 428 428 428 428 146 385 35 75 342 224 89 446 94 199 255 255 217 217 473 65 486 486 460 460 368 310 449 60 242 116 116 394 76 259 214 214 214 214 200 200 471 49 453 26 26 241 266 266 266 266 266 266 416 96 198 198 114 92 92 92 92 92 92 167 385 233 131 229 247 247 126 126 326 326 326 326 326 408 408 149 149 228 491 289 321 321 354 420 420 143 458 192 485 494 368 342 168 111 111 111 240 325 371 371 278 278 116 33 33 58 72 110 110 202 202 202 402 402 36 119 119 103 103 103 103 85 299 299 203 53 473 340 340 466 22 283 455 236 384 371 93 93 93 93 207 207 207 19 454 263 417 417 417 417 417 170 170 28 491 28 491 491 2 491 2 491 2 2 2 163 316 491 435 435 435 435 321 321 321 435 287 111 111 438 438 458 445 357 357 443 271 31 342 342 198 114 92 92 169 77 342 142 397 345 346 181 428 438 464 464 365 330 203 394 478 172 115 273 344 344 344 274 349 164 164 164 470 278 278 120 330 388 195 195 117 48 417 417 417 170 47 47 47 47 47 47 491 491 47 491 80 80 80 321 435 435 287 287 111 111 111 438 464 365 365 365 330 203 53 64 212 161 79 288 151 240 314 131 393 262 262 100 497 497 349 164 224 470 432 365 330 94 199 331 145 290 290 434 434 339 212 131 180 284 265 265 85 85 207 207 454 454 229 321 247 312 312 126 292 292 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 101 101 149 149 228 321 321 320 127 0 0 222 468 356 356 356 453 342 242 116 199 44 44 44 129 35 401 401 401 321 74 351 351 278 278 178 458 192 180 125 125 125 348 250 70 46 46 46 46 46 438 301 8 239 354 106 106 84 496 496 496 496 413 413 413 471 471 49 269 433 390 160 112 56 417 201 201 201 201 193 193 17 +103-1241-0028 103 777 1 8 11 36 23 5 37 33 36 19 24 4 21 5 25 8 24 25 8 31 5 25 11 29 23 5 24 29 38 19 34 11 19 24 29 5 23 40 19 25 24 8 13 23 9 27 40 1 38 19 12 19 31 1 24 4 34 39 36 40 22 5 24 29 4 25 39 5 25 31 33 3 29 33 6 22 19 26 1 29 3 30 33 23 20 1 9 19 22 5 40 32 20 38 5 40 7 33 5 37 9 30 13 34 5 25 11 29 3 30 33 23 20 9 19 22 5 40 12 15 18 4 11 30 20 10 33 12 5 9 5 17 20 1 25 3 33 5 25 5 12 14 38 14 11 19 11 32 20 31 15 5 25 33 19 23 12 15 18 4 11 23 13 16 33 12 5 37 19 23 19 21 5 25 11 38 14 11 30 8 37 19 26 11 7 25 5 31 33 20 29 23 19 33 5 23 18 19 23 1 10 8 5 6 3 4 3 4 2 2 4 5 5 1 2 5 3 4 7 7 1 2 2 6 3 2 5 3 1 2 4 3 2 3 3 2 3 3 2 1 3 6 3 3 3 5 14 53 3 4 6 6 16 3 3 5 3 2 2 3 3 1 3 5 2 4 2 3 2 4 3 4 2 5 5 4 2 7 8 3 3 4 2 3 8 14 3 2 3 2 2 2 2 2 2 3 4 3 1 4 2 2 6 9 2 1 3 4 4 3 3 2 3 3 3 3 4 3 3 4 2 1 4 2 3 6 1 2 2 3 4 2 9 21 3 2 3 3 2 3 3 3 7 5 4 1 4 4 2 6 6 3 3 3 3 2 2 3 2 2 2 3 3 4 3 2 1 5 2 4 3 6 1 2 2 2 2 3 2 6 3 2 4 3 5 3 3 5 4 5 4 2 2 2 2 2 5 3 9 8 17 17 17 296 317 317 184 184 184 289 209 287 287 111 111 111 438 438 314 32 239 384 371 371 374 374 132 274 251 251 241 431 266 266 266 266 173 402 402 36 108 87 87 88 88 255 255 399 217 217 65 65 486 486 460 460 240 310 107 395 242 275 116 199 199 111 111 85 438 203 203 53 10 10 309 331 331 265 265 428 428 146 146 186 39 342 68 68 224 224 11 116 33 394 472 401 401 321 74 425 425 386 431 319 319 319 203 53 53 53 76 401 259 345 333 333 220 220 402 472 221 239 384 371 278 278 53 53 394 76 259 74 302 302 497 497 49 453 342 168 340 340 116 250 70 46 46 46 46 438 464 464 145 139 139 293 293 122 8 354 354 84 84 496 496 274 185 39 433 433 390 160 112 112 56 56 56 56 28 28 491 491 28 28 491 491 362 491 362 362 362 491 362 362 362 362 362 362 491 362 362 211 211 362 491 369 369 369 369 369 369 369 369 21 21 21 21 21 21 21 260 260 260 260 260 260 391 391 391 491 289 321 321 7 7 345 333 333 220 220 314 32 4 4 127 114 258 258 258 258 258 31 39 342 433 390 390 390 160 160 160 160 97 97 225 225 80 80 80 321 321 7 217 473 329 329 329 329 329 164 164 485 485 485 485 374 368 31 142 221 336 27 121 399 53 76 465 74 351 351 365 365 365 330 388 64 219 398 398 275 275 116 471 471 478 66 482 238 6 272 106 405 405 405 167 215 96 96 75 108 119 437 405 405 405 405 206 206 178 458 192 176 176 328 328 200 303 48 48 417 225 80 80 491 321 80 289 289 320 74 437 437 306 306 396 396 396 35 35 26 359 359 474 474 474 474 19 19 454 229 321 247 126 126 326 326 326 326 101 101 408 391 228 321 289 321 320 354 420 422 143 144 27 494 278 186 99 400 400 400 378 378 141 141 141 281 168 106 113 113 113 206 240 285 34 462 462 402 401 259 259 354 380 380 288 443 120 120 169 169 169 169 352 352 352 352 352 352 97 89 55 322 67 90 90 259 74 74 437 437 306 306 306 396 396 385 35 26 359 359 474 474 324 301 301 354 420 420 420 143 321 144 27 351 253 253 368 453 342 198 198 127 0 0 0 0 58 110 254 254 254 131 133 147 147 288 213 213 143 233 310 107 447 447 447 198 198 22 283 455 8 354 354 329 151 151 416 416 41 41 41 41 19 19 454 454 170 170 491 491 312 491 312 312 292 292 292 326 326 326 326 326 101 101 101 149 149 228 321 320 479 331 307 307 61 285 34 44 44 44 94 199 493 493 493 493 216 300 300 382 245 43 364 364 276 109 498 498 498 498 396 313 313 314 36 430 430 430 430 36 36 310 107 400 400 400 30 422 162 162 68 68 115 273 470 403 403 207 207 464 464 89 319 348 64 76 465 108 139 139 139 139 497 122 216 0 0 0 0 58 254 254 254 314 26 251 241 431 443 443 443 169 402 402 96 75 472 198 198 22 283 455 4 4 4 280 278 278 278 175 175 81 459 469 37 37 24 310 107 395 89 89 322 322 250 250 347 347 347 236 129 161 79 79 499 499 265 85 85 146 146 173 173 176 176 135 135 200 248 248 384 371 180 315 315 315 450 450 413 94 199 44 44 38 342 342 68 482 6 336 384 371 213 213 213 213 252 215 129 321 26 26 26 81 278 278 285 26 302 497 497 58 58 183 72 351 278 278 278 139 139 375 375 375 375 98 98 13 229 321 247 15 15 193 193 193 17 +103-1241-0029 103 765 1 12 5 30 27 11 29 3 30 33 5 37 38 19 10 18 4 11 9 19 25 22 5 33 31 27 11 20 29 23 20 19 25 33 5 12 5 31 6 16 33 31 28 23 1 12 5 33 12 5 9 4 26 22 31 1 16 30 19 25 21 11 38 19 12 9 23 36 24 19 26 38 8 23 11 10 13 30 20 33 30 20 40 5 25 11 31 23 19 24 38 8 33 9 14 10 19 40 1 38 14 31 13 37 30 5 23 16 20 33 5 9 5 37 12 13 30 18 13 11 40 1 12 5 10 8 23 11 29 35 33 7 33 18 14 18 4 25 11 5 25 11 9 30 27 22 6 16 5 9 30 4 25 10 5 37 38 8 23 11 29 23 5 24 12 5 33 9 30 5 32 33 5 17 13 25 31 33 12 5 31 8 11 5 37 12 5 9 5 17 20 1 10 3 3 4 7 2 3 4 3 2 2 5 2 4 4 1 2 1 2 2 4 4 4 4 6 6 4 5 3 2 3 2 2 3 2 2 3 6 6 4 3 7 8 7 12 3 2 1 3 2 5 5 6 3 9 2 2 3 2 2 4 2 2 2 3 4 3 4 3 3 7 3 7 3 3 7 3 3 4 5 2 5 3 2 3 2 6 2 4 7 3 4 4 6 6 5 5 7 13 3 2 7 3 3 2 2 3 6 4 2 2 3 4 3 3 3 2 4 7 5 9 38 2 3 6 9 4 3 4 2 3 5 3 3 3 5 6 4 1 2 1 3 2 3 3 3 5 3 2 6 2 5 3 5 2 4 3 7 2 5 6 3 4 8 2 3 3 4 2 3 6 2 1 3 3 3 2 1 2 2 4 5 3 1 2 2 2 3 5 3 8 15 17 17 17 363 363 363 51 51 228 321 321 320 5 5 455 42 42 147 380 380 496 496 496 274 274 122 24 131 472 221 259 74 437 306 306 306 306 169 167 36 449 69 223 130 130 402 402 345 345 109 407 407 407 385 36 75 310 395 254 254 254 314 259 354 137 137 137 33 394 394 465 144 27 351 189 189 151 167 167 457 478 478 66 68 68 115 344 344 344 344 344 344 274 236 32 239 384 371 213 213 213 213 215 129 321 354 359 359 474 474 464 340 340 116 394 465 377 377 123 123 198 22 283 455 38 162 232 482 172 115 273 106 405 405 405 405 206 169 402 402 402 6 272 472 472 482 482 482 115 273 106 153 153 387 387 387 139 139 302 302 375 375 98 13 321 247 247 126 126 326 326 326 326 101 149 149 228 321 321 127 45 45 45 35 259 127 5 5 455 129 129 259 354 354 180 486 365 365 365 365 360 200 200 243 243 233 270 270 270 390 390 390 390 97 97 225 225 225 373 155 261 487 288 288 278 330 339 64 310 447 447 238 272 397 345 333 220 220 402 221 129 401 321 354 425 425 241 431 374 374 374 203 53 53 473 176 176 135 328 200 200 248 248 248 364 276 276 346 346 265 428 85 85 139 293 293 293 122 122 401 401 401 310 310 107 107 395 351 470 264 264 468 468 468 337 337 324 422 36 36 161 161 487 487 288 41 41 246 318 49 453 342 168 89 116 116 33 394 394 478 66 68 68 68 26 26 251 241 81 278 278 278 203 53 250 250 250 250 250 276 346 346 428 428 428 146 252 36 472 221 401 401 321 321 354 354 498 498 498 498 396 143 36 310 107 107 395 50 50 50 50 185 185 433 433 160 112 427 247 247 126 126 292 326 326 101 101 149 149 228 289 321 320 347 347 347 186 162 232 232 68 172 115 273 204 204 204 204 280 29 495 134 302 302 497 497 349 349 234 234 261 25 213 213 213 252 252 449 34 255 255 8 259 354 180 230 230 319 173 402 402 198 127 222 222 222 222 222 313 58 72 72 110 110 120 120 120 120 120 37 37 24 471 270 270 433 433 160 18 112 112 56 56 491 28 28 28 491 28 491 28 491 362 362 491 362 362 362 491 491 362 491 491 211 211 102 491 369 369 369 369 21 21 21 21 21 101 101 149 149 321 321 320 127 5 5 236 129 36 310 107 395 351 91 91 91 91 85 85 85 85 139 293 293 122 122 131 472 221 401 321 74 441 189 189 240 285 34 180 113 113 113 113 167 285 449 449 156 156 156 313 58 58 72 72 294 294 294 294 294 294 294 282 388 64 64 212 34 89 89 322 53 212 32 259 354 380 380 189 496 496 274 143 458 192 180 230 230 230 169 169 352 29 44 44 245 8 32 321 354 190 380 288 365 365 365 365 330 388 64 76 76 310 107 107 395 462 462 462 402 402 133 276 276 346 346 486 315 315 315 139 450 293 122 122 131 472 221 401 321 75 74 425 425 386 386 386 431 319 319 319 203 203 381 381 381 381 381 117 198 198 127 45 45 45 236 401 401 401 321 354 190 380 499 151 151 169 169 99 447 447 238 6 272 34 255 416 192 180 432 432 330 379 77 77 342 342 198 22 283 283 38 162 342 115 273 265 265 265 85 146 146 325 34 69 130 130 198 22 283 455 8 259 354 106 151 151 151 416 416 192 41 41 41 41 19 19 454 454 229 321 247 312 15 15 15 15 15 15 15 193 193 193 193 17 +103-1241-0030 103 773 1 19 40 5 25 12 4 33 1 9 39 36 33 5 16 5 23 1 18 38 5 33 11 19 11 12 4 33 30 20 23 20 25 19 26 7 33 16 14 24 12 5 9 4 26 22 6 23 38 8 33 5 25 11 23 15 31 20 24 15 22 39 36 34 19 26 22 5 37 32 20 4 31 22 33 1 38 13 23 1 25 7 1 8 11 5 25 27 1 31 13 11 24 4 34 39 36 1 18 38 8 5 9 30 8 11 5 37 22 6 30 31 1 5 9 30 8 11 1 6 23 19 25 38 8 33 38 19 12 5 23 5 37 23 20 24 19 31 33 20 37 15 23 1 16 6 4 1 4 2 5 2 2 2 5 3 2 2 6 2 10 37 3 1 2 2 2 2 1 3 4 9 2 8 4 5 2 4 5 4 2 3 2 2 2 2 5 4 4 4 8 7 5 4 5 2 1 2 4 5 7 4 3 3 3 2 3 3 2 5 4 5 6 5 4 6 5 2 4 34 7 2 5 1 2 16 23 11 1 2 4 17 5 7 2 3 3 5 3 3 5 37 5 3 7 3 6 3 8 3 2 5 7 3 5 9 16 5 7 4 11 5 2 10 5 3 6 5 7 5 2 1 2 3 9 4 7 3 5 8 3 7 4 3 5 9 10 7 17 17 17 296 363 363 363 363 51 51 51 184 184 321 184 321 321 209 188 430 430 430 430 342 430 430 430 430 33 64 212 127 114 92 92 92 92 167 457 401 401 401 321 354 354 219 219 485 485 485 374 374 285 285 469 469 349 393 234 155 262 262 100 100 100 100 375 98 98 98 13 13 13 442 442 442 491 442 442 442 442 442 491 102 2 2 2 2 201 40 305 305 305 305 305 40 366 366 102 316 316 316 491 102 491 305 102 102 289 289 321 321 320 181 181 181 181 181 35 449 430 430 430 430 198 114 114 92 92 92 167 457 35 401 75 161 161 161 161 487 487 487 213 213 246 246 246 246 301 26 251 251 241 444 444 444 444 360 360 339 199 176 135 135 135 135 200 200 464 113 113 113 113 167 167 349 155 155 165 165 165 165 466 22 22 283 455 455 259 354 354 180 376 376 365 365 365 328 200 243 76 458 192 483 14 411 411 297 297 297 297 297 297 293 293 497 497 43 364 364 276 346 346 346 428 428 428 146 252 143 36 449 89 89 446 446 33 251 251 251 241 241 431 171 171 171 252 186 39 342 342 342 224 41 41 324 324 301 399 473 476 476 476 476 143 458 192 219 152 152 422 349 164 164 164 214 214 360 360 200 200 248 321 144 192 69 223 223 223 223 223 37 173 352 352 352 402 99 338 400 400 400 400 464 464 464 145 376 376 376 460 169 169 342 342 86 105 6 96 96 272 427 56 247 247 312 126 126 292 292 292 292 292 23 23 23 23 23 260 260 260 260 260 260 391 391 163 491 316 316 316 316 316 316 316 73 289 7 7 7 364 276 276 109 109 139 139 293 293 293 413 309 479 331 331 315 315 315 315 315 450 450 16 98 98 98 13 13 13 229 247 312 312 126 126 126 23 23 23 23 23 260 260 391 391 47 491 491 316 316 80 321 373 412 412 287 287 287 284 306 306 85 438 240 325 34 242 242 94 199 331 84 84 84 16 16 16 16 98 98 98 98 263 13 225 225 225 225 225 225 80 80 80 321 373 66 66 172 179 179 179 179 179 314 196 196 473 65 329 329 329 329 329 164 164 485 485 485 485 485 374 132 98 417 417 417 417 417 417 170 170 170 28 28 28 491 28 491 491 2 491 491 2 491 2 435 2 2 2 366 321 305 305 40 435 40 201 435 435 435 435 435 289 289 321 320 364 276 346 346 265 428 85 146 464 464 44 44 44 8 401 401 321 354 190 190 380 380 499 265 265 265 85 85 146 146 252 325 449 34 255 130 130 402 402 401 321 321 208 208 441 441 441 153 153 153 372 372 396 396 271 186 54 433 433 390 112 427 56 247 247 126 126 326 326 326 326 326 326 326 101 101 101 149 149 228 321 412 44 44 44 8 129 129 259 190 190 190 190 79 380 380 499 499 265 265 265 85 85 85 146 146 146 24 131 335 14 14 226 321 209 411 287 297 297 297 297 297 297 297 293 293 175 175 81 81 340 340 116 33 33 90 250 250 364 364 276 346 346 346 428 428 428 146 358 358 36 131 472 397 345 333 333 220 220 216 44 44 44 251 251 251 251 251 251 241 241 431 266 266 266 266 173 173 173 402 402 402 26 359 359 81 81 324 324 324 301 339 399 217 217 217 217 217 473 65 278 278 31 162 342 86 86 86 6 6 272 41 324 324 324 301 4 4 4 280 470 470 403 171 171 171 171 464 139 139 302 375 375 375 98 263 13 78 78 170 491 421 15 15 193 193 17 +103-1241-0031 103 654 1 8 37 25 13 37 14 31 20 25 38 5 25 1 9 5 33 8 22 5 25 19 24 4 21 5 25 38 5 33 32 20 38 35 11 23 35 22 23 8 22 1 8 11 27 25 33 13 37 14 19 22 31 29 13 22 33 19 9 20 5 9 30 8 11 24 8 31 13 23 16 1 8 24 31 27 18 27 24 23 20 25 27 9 5 11 20 38 5 23 13 37 14 38 6 25 33 5 24 13 30 20 1 24 20 1 5 25 23 13 31 19 33 24 8 33 9 20 5 16 6 30 5 25 24 19 32 5 25 13 30 20 1 8 31 5 29 27 40 5 16 6 30 5 25 24 19 32 5 25 13 30 20 24 8 33 5 25 33 9 20 37 13 30 20 29 14 33 19 22 39 5 23 14 1 11 8 1 3 2 3 3 6 4 4 2 3 6 13 2 1 3 4 5 2 1 3 5 5 5 2 2 2 2 2 4 2 3 1 2 5 2 5 2 7 6 24 7 2 3 2 2 2 5 3 2 3 3 2 3 2 3 2 3 4 2 4 3 4 3 2 5 7 3 6 5 14 8 3 5 3 5 5 3 3 4 3 4 2 2 1 3 2 3 7 3 3 3 3 2 3 3 2 4 5 2 4 2 2 11 18 6 2 2 2 4 2 1 4 4 2 3 3 2 6 3 2 3 2 2 1 6 2 2 4 2 7 7 9 3 2 5 3 4 2 6 3 3 3 2 2 2 5 2 2 3 2 4 4 5 2 3 2 2 2 6 2 2 3 5 2 2 3 2 4 2 2 3 6 12 17 17 17 296 363 363 363 51 51 51 228 321 412 287 111 111 111 202 202 202 196 309 479 463 463 463 463 29 382 313 186 162 232 68 68 267 267 267 267 267 339 339 250 250 250 276 174 174 174 319 388 388 303 117 229 229 247 126 126 326 326 101 101 149 149 228 321 289 321 159 159 159 159 325 34 111 111 111 438 438 143 458 445 351 242 116 199 199 255 255 399 217 217 473 65 486 486 486 460 460 240 310 310 107 395 242 242 203 250 250 181 181 181 181 99 338 338 400 400 152 378 378 345 389 389 314 26 26 251 241 241 367 367 367 367 35 458 96 26 386 266 266 266 266 266 266 146 358 143 458 192 419 439 78 170 170 491 28 491 28 28 491 491 2 491 2 102 2 102 102 102 491 491 435 305 289 289 321 209 287 111 111 111 438 438 325 34 180 84 350 413 348 131 34 463 463 463 463 402 29 29 495 467 467 154 154 458 96 96 232 68 105 336 470 470 151 151 178 35 401 75 272 87 87 8 354 420 420 420 464 464 44 255 8 259 259 190 380 380 499 499 428 85 146 146 35 196 196 473 46 46 46 46 438 186 162 68 68 68 115 273 279 279 279 279 279 279 279 375 375 352 352 352 427 491 247 491 312 126 292 23 23 23 101 101 149 149 228 321 321 287 287 111 111 111 438 203 53 394 478 232 172 115 344 344 344 344 274 58 72 72 437 350 350 350 350 350 203 53 250 250 359 359 166 166 324 324 301 10 479 331 231 231 231 274 8 354 29 469 325 41 324 301 378 345 345 389 139 497 175 335 14 14 209 145 463 463 463 463 280 29 382 245 245 43 364 174 174 174 330 348 76 465 75 377 87 87 399 217 473 65 65 264 264 264 468 468 337 337 337 324 324 301 217 473 429 429 429 429 429 246 246 246 19 454 229 321 247 126 126 126 326 326 326 326 326 23 408 408 408 149 149 391 491 289 321 412 287 287 319 319 348 175 81 431 443 443 31 342 342 177 177 177 177 457 70 70 65 65 428 428 146 215 35 259 420 420 420 464 464 44 44 349 234 234 261 25 148 148 148 372 372 467 467 242 348 250 217 473 473 278 278 99 99 436 436 60 60 116 94 199 470 264 264 468 468 468 337 41 41 19 454 454 417 417 417 417 237 237 80 80 321 412 287 287 287 111 111 438 438 31 342 224 494 494 129 74 74 437 496 496 496 274 368 368 9 168 494 44 349 234 234 205 261 148 148 148 372 372 372 467 467 446 116 250 250 473 473 278 278 99 99 436 60 60 242 116 94 199 264 264 468 468 337 337 41 324 301 399 70 473 65 428 428 146 146 457 35 401 196 242 33 33 394 32 32 259 420 420 420 420 420 324 301 173 280 104 104 104 104 337 337 337 337 301 129 321 74 492 492 236 384 371 278 278 278 143 321 192 485 134 134 134 175 81 300 334 59 452 263 229 229 491 312 15 15 15 15 15 193 193 193 193 17 +103-1241-0032 103 700 1 9 5 33 8 11 36 18 27 29 12 5 33 31 5 24 11 15 8 32 4 23 1 18 4 37 5 38 8 33 11 30 13 31 1 12 4 33 1 19 40 24 8 18 8 5 31 33 8 11 20 23 5 37 14 34 23 20 9 23 19 31 1 8 21 19 31 33 23 5 37 29 30 19 33 20 22 23 27 12 40 1 4 25 11 8 37 25 13 37 14 18 4 11 5 29 30 19 33 20 11 30 13 31 19 25 24 8 23 8 16 12 5 33 8 22 5 25 30 19 24 13 24 9 14 1 9 5 33 5 37 22 6 30 31 1 19 33 31 1 6 23 12 5 24 6 30 33 5 23 35 22 16 6 30 38 14 11 33 36 19 40 5 25 33 19 33 1 4 25 11 12 13 25 1 14 3 1 3 6 3 6 5 2 3 2 2 3 6 3 4 2 5 5 5 2 3 2 6 2 2 3 6 6 3 5 2 5 13 14 3 7 3 1 4 4 3 4 13 6 3 3 3 5 4 4 3 2 2 6 4 2 2 3 2 5 9 23 7 3 3 2 3 2 3 2 6 2 1 2 2 6 3 6 3 9 14 5 1 3 5 3 2 2 2 2 5 2 2 2 5 1 2 2 3 3 3 2 5 1 2 3 4 6 5 4 2 1 2 3 4 2 4 2 2 3 2 4 3 8 24 2 1 2 1 3 4 3 4 9 14 5 2 3 1 6 4 2 2 5 2 2 2 3 3 2 5 5 2 3 2 2 2 4 3 3 3 2 1 3 3 6 17 5 2 2 2 3 6 5 17 17 17 296 363 363 51 51 51 184 184 184 289 321 320 354 159 159 240 285 34 111 111 111 111 438 236 35 75 371 371 374 374 132 132 88 58 72 72 496 496 496 496 215 35 96 26 34 45 45 45 31 478 478 68 68 68 115 273 231 231 231 203 53 64 212 384 93 93 93 93 464 464 111 111 111 111 438 99 99 338 395 389 389 389 497 129 401 259 74 483 58 72 110 202 202 202 202 173 402 44 44 44 43 43 364 276 276 346 346 428 428 146 146 358 457 401 401 321 75 161 161 79 487 288 443 443 120 271 271 150 39 433 433 433 160 160 160 112 439 56 56 47 47 491 47 491 47 491 491 316 491 73 73 289 289 321 320 127 114 92 92 92 92 92 240 385 35 131 335 226 188 188 356 356 281 342 9 196 70 70 46 46 46 46 438 58 58 72 72 72 72 72 72 72 72 437 265 428 428 146 146 146 464 459 459 459 31 39 86 86 6 272 106 486 428 85 146 438 239 36 371 485 485 286 139 139 175 175 69 462 462 130 29 498 498 498 498 169 164 164 26 26 359 81 324 324 301 8 259 354 425 386 81 459 271 271 271 39 39 433 390 390 160 112 427 491 247 312 126 126 292 292 292 326 326 326 326 326 326 326 326 326 101 101 149 149 149 228 321 321 287 287 111 111 438 438 143 36 107 395 494 31 342 342 26 26 26 241 266 266 266 266 173 402 401 401 401 259 74 190 487 278 278 325 34 324 324 143 458 321 208 208 208 386 386 431 496 496 496 496 274 274 216 164 270 270 433 160 18 427 56 56 47 47 491 47 47 491 2 2 491 316 316 321 73 289 321 435 209 83 55 55 322 322 212 34 111 111 111 111 438 202 202 402 196 479 331 463 463 463 29 29 382 58 58 72 110 110 254 240 325 34 44 44 129 129 259 74 190 487 278 278 325 324 324 324 236 239 259 161 79 487 288 443 443 169 342 342 224 340 340 340 250 217 70 46 46 46 46 46 438 251 251 241 431 431 428 428 428 146 146 186 402 352 342 224 45 45 325 325 111 111 111 178 458 192 242 242 116 33 250 456 456 456 456 456 399 217 473 65 432 432 330 203 53 212 212 29 334 334 59 59 452 263 229 321 321 312 312 126 292 292 1 292 292 1 1 1 1 1 23 260 260 408 408 391 391 391 289 289 321 320 159 159 159 285 255 255 402 402 458 144 441 441 441 153 153 372 372 396 186 186 54 54 86 112 427 56 56 201 201 201 201 201 201 201 201 201 201 201 321 435 435 435 320 209 177 177 177 356 356 342 483 14 226 321 411 297 297 297 297 297 297 293 122 216 22 283 455 399 399 138 138 138 138 372 396 313 449 377 87 87 87 251 241 367 367 367 367 458 96 393 393 234 234 261 25 148 148 148 372 245 43 345 109 109 313 236 36 75 108 377 485 489 378 88 356 356 356 281 342 430 242 242 116 212 131 277 277 277 277 277 385 233 75 419 427 56 56 170 170 312 312 292 292 292 1 1 1 408 408 408 408 305 321 209 83 55 55 322 67 466 127 361 361 361 361 361 388 195 117 229 229 247 126 126 193 193 17 +103-1241-0033 103 787 1 8 22 5 25 19 24 4 21 5 25 12 4 33 8 24 11 30 13 31 33 17 6 30 21 5 31 23 20 1 12 19 31 24 6 30 25 19 26 38 13 25 8 23 13 16 33 12 20 5 31 8 23 5 24 8 16 13 23 33 31 27 5 32 15 24 11 9 19 22 5 40 8 18 4 11 33 5 38 13 30 12 19 31 18 6 30 5 11 27 23 11 1 38 19 25 31 20 11 30 13 31 1 6 23 12 20 6 30 16 5 25 40 18 4 11 33 5 38 13 30 12 5 24 39 36 25 27 1 5 24 14 10 5 25 33 19 25 2 23 4 31 38 19 25 33 14 11 27 25 15 33 19 11 34 30 20 18 5 25 11 14 11 39 3 30 11 40 5 37 38 19 25 31 20 33 19 12 20 5 31 8 23 5 24 1 31 5 24 29 20 29 5 23 31 13 11 19 33 38 5 40 9 19 22 5 40 18 20 22 35 11 5 25 31 13 23 19 33 1 7 4 3 2 2 2 4 4 5 2 2 1 2 3 3 2 3 2 2 6 2 4 4 3 3 2 7 2 8 21 3 2 5 4 2 2 2 3 3 2 2 2 4 3 3 3 1 2 2 4 6 6 4 2 3 4 5 2 3 2 6 4 2 9 6 3 3 2 2 3 3 3 3 4 2 2 3 3 2 2 2 3 2 4 8 4 4 1 3 4 4 2 1 3 2 4 5 2 4 3 4 10 27 7 3 3 3 3 3 4 2 2 2 3 2 2 2 2 2 3 2 3 2 2 2 3 3 10 15 5 5 4 4 2 1 2 2 2 18 5 4 6 3 2 1 4 2 4 4 2 4 3 2 2 5 3 6 4 3 2 2 3 2 4 7 3 4 1 2 4 2 2 4 4 1 3 2 2 4 2 5 5 4 2 6 21 6 4 2 2 3 3 2 2 4 2 2 1 3 1 2 3 2 2 4 2 2 2 2 4 2 2 2 2 5 3 4 3 5 9 17 17 363 51 51 228 321 209 111 111 111 438 458 192 192 242 116 199 255 255 399 217 473 65 486 486 460 240 240 35 310 107 242 298 116 379 466 45 45 45 285 34 111 111 365 203 203 394 212 161 79 487 288 443 169 150 39 86 86 238 6 336 90 221 321 144 208 153 153 153 387 372 396 313 24 310 107 459 459 271 39 433 68 68 68 359 474 474 474 474 19 19 454 454 417 442 442 170 170 28 28 491 2 491 491 2 491 2 491 2 2 491 316 316 73 289 321 321 7 127 258 258 31 162 342 142 142 196 217 70 65 153 387 387 396 348 94 176 176 328 200 200 248 345 409 409 409 94 199 111 111 111 438 251 241 431 443 443 169 169 352 402 198 198 448 448 464 464 255 38 38 162 232 68 68 115 273 265 265 265 85 85 146 175 175 81 81 242 203 203 53 65 111 111 111 438 349 205 205 261 25 189 139 139 293 122 478 478 66 68 172 115 344 344 344 344 88 88 255 255 186 99 338 338 338 338 338 395 470 290 290 290 290 290 434 339 53 394 212 401 221 321 354 420 420 143 458 192 278 253 368 453 342 168 111 111 111 438 72 110 110 254 254 240 35 321 377 87 87 87 43 364 109 109 264 264 313 216 216 114 258 258 31 31 342 142 142 72 72 72 72 72 72 437 153 481 306 372 406 467 467 469 240 285 34 106 106 424 424 424 424 497 122 122 133 401 321 364 276 109 278 330 348 33 394 77 77 342 224 41 324 324 301 236 321 75 161 79 79 288 288 443 120 271 271 39 39 433 390 160 160 112 427 491 247 312 126 292 292 292 292 326 326 326 326 326 23 23 23 101 101 101 101 101 149 149 228 289 289 321 289 209 209 287 297 297 297 297 297 293 293 216 22 448 448 448 378 106 153 372 372 372 349 349 205 261 25 242 379 379 471 77 342 110 110 110 460 240 314 35 384 87 87 43 43 276 109 109 468 468 240 216 216 57 57 203 217 473 219 219 152 374 116 94 331 84 84 84 84 16 274 98 98 13 13 414 491 170 491 170 187 491 187 187 23 23 101 101 149 149 149 321 209 44 44 44 399 217 70 473 65 498 498 396 313 35 310 107 107 242 116 116 199 34 89 446 116 33 58 58 72 437 496 496 496 496 215 35 35 96 270 342 224 242 242 116 33 466 466 241 431 376 376 376 169 150 150 86 238 272 397 397 109 109 278 278 64 76 449 300 382 313 236 239 259 384 371 84 496 496 413 94 199 158 158 158 252 325 449 191 191 191 314 36 164 119 161 161 487 487 487 337 213 213 324 324 3 3 58 72 72 437 319 319 319 348 64 212 300 382 313 313 314 314 219 219 219 180 180 106 306 306 306 306 306 396 396 37 37 24 77 270 168 168 462 462 402 402 402 345 109 109 330 116 33 394 77 77 224 41 41 324 236 108 377 123 123 216 283 448 448 464 464 255 38 162 68 115 115 106 265 265 265 85 146 299 175 175 81 275 203 203 381 117 48 13 491 491 312 312 126 292 292 292 292 292 21 21 21 23 23 23 260 408 391 391 391 321 321 373 66 68 115 273 231 231 231 319 53 76 76 74 485 213 213 301 8 354 100 497 497 186 162 68 115 273 470 443 240 325 177 177 177 457 345 141 141 281 9 221 336 354 420 420 143 259 144 27 351 368 368 342 224 30 30 422 143 144 27 389 389 389 314 196 242 242 33 394 478 232 68 172 115 273 443 443 139 175 175 175 81 277 277 37 385 131 404 321 247 247 126 15 15 193 193 193 17 +103-1241-0034 103 845 1 9 5 33 8 11 30 4 12 14 9 19 23 20 37 12 5 33 19 33 38 5 40 7 33 5 37 12 5 22 8 25 11 25 5 31 5 37 18 19 40 18 3 30 33 38 35 11 5 25 33 39 36 1 38 13 25 38 20 17 3 33 3 25 12 5 33 30 15 25 1 8 16 13 23 33 13 40 19 16 1 13 37 30 20 9 3 11 20 24 5 31 33 9 20 23 35 22 19 26 4 33 24 20 5 25 11 29 19 33 20 19 26 24 20 1 9 5 33 8 21 5 31 33 38 13 25 33 5 38 14 22 5 25 11 19 24 4 21 5 25 11 12 5 33 8 18 4 11 3 25 12 5 24 27 31 33 1 9 39 36 33 5 16 5 23 29 15 23 9 23 36 31 19 23 22 11 30 13 31 1 9 19 22 5 40 38 19 25 39 36 3 30 19 24 4 21 5 25 19 26 39 36 24 8 33 13 40 38 13 23 19 24 4 21 5 25 31 5 24 34 19 26 38 14 34 18 38 8 23 1 9 3 1 2 6 4 2 3 3 2 3 2 5 5 2 2 1 2 1 2 2 1 4 4 2 2 2 1 2 7 4 1 2 1 2 4 2 2 1 2 3 5 4 3 4 2 1 2 3 2 2 4 7 29 4 2 1 2 3 4 3 3 2 3 1 3 6 2 7 5 10 5 4 3 2 3 2 4 2 5 1 6 3 3 2 3 3 2 3 3 3 2 2 3 3 4 3 4 2 4 2 3 2 4 1 2 1 6 2 4 5 2 5 2 9 23 3 2 2 8 4 3 2 2 2 3 2 3 3 4 3 3 1 2 1 3 3 5 5 2 2 1 2 1 3 5 9 2 3 3 3 2 1 3 4 3 4 10 2 8 6 2 4 4 2 4 12 10 5 8 5 9 10 3 3 7 2 3 4 9 23 2 4 2 3 3 1 3 2 3 5 7 4 3 4 4 5 2 1 3 3 3 2 3 4 3 2 3 3 2 3 2 4 3 5 2 2 3 2 2 3 2 4 3 4 2 3 3 8 4 13 17 17 296 51 51 184 184 184 289 321 320 159 159 240 199 111 111 111 111 111 438 314 133 133 147 380 180 486 443 240 240 216 300 300 382 245 8 354 255 255 251 251 251 81 444 444 444 444 246 252 173 198 164 45 45 45 34 177 177 177 345 141 141 281 453 342 168 180 113 113 113 285 285 69 223 130 198 22 283 455 455 129 259 144 27 437 480 480 480 146 299 339 64 10 459 459 459 271 342 342 224 69 223 130 280 257 257 257 31 9 142 142 72 72 437 306 306 306 306 306 396 396 385 233 131 133 133 430 430 430 430 430 430 430 430 430 212 131 219 219 219 477 477 477 374 132 132 98 48 13 170 170 170 491 312 312 28 341 341 341 341 341 12 12 12 21 21 21 21 23 23 101 101 149 391 391 73 289 289 321 7 70 409 409 409 399 53 473 429 30 422 143 458 144 180 189 405 405 206 285 34 125 125 125 348 466 22 283 455 236 36 161 161 161 161 487 487 288 290 290 290 290 434 434 434 339 195 404 229 82 247 126 126 326 23 101 101 149 149 321 321 287 111 111 111 349 205 261 25 189 189 139 293 122 35 449 34 253 253 453 453 342 118 118 118 118 402 402 14 226 321 209 411 145 204 204 204 204 204 204 29 337 337 337 301 8 259 354 109 151 240 325 34 41 324 301 399 217 70 65 151 169 150 342 105 221 259 354 420 420 301 301 251 251 241 367 367 367 367 367 458 192 192 176 135 200 200 464 415 415 415 415 457 457 217 429 429 429 464 464 89 203 394 129 401 321 75 74 351 278 278 278 325 449 41 41 324 324 324 464 434 135 328 328 200 248 248 248 429 429 429 429 429 19 19 454 417 417 170 170 170 170 28 491 28 2 491 491 2 491 2 2 491 2 316 491 491 316 73 289 289 321 321 354 159 159 159 285 34 111 111 111 111 111 111 438 438 239 384 371 180 151 151 31 54 54 142 397 397 109 109 189 330 457 394 465 108 377 87 87 43 364 276 109 372 498 396 396 178 458 192 89 340 94 199 255 255 399 217 473 65 486 486 486 460 240 240 36 310 107 242 275 275 116 195 466 45 45 45 45 325 34 111 111 111 111 438 438 58 72 72 72 110 110 110 110 254 254 240 285 34 106 125 125 125 125 466 22 283 455 399 70 65 496 496 496 186 186 238 6 6 472 221 401 401 47 47 491 491 47 80 491 80 401 321 354 354 485 485 219 219 219 485 485 374 374 374 132 132 132 285 449 469 469 469 349 349 155 262 262 100 100 100 497 497 122 129 401 401 401 401 321 75 74 74 437 351 351 290 290 171 171 171 171 171 139 139 139 139 497 497 497 497 122 32 32 32 401 401 321 354 425 425 425 241 431 431 374 374 374 374 132 132 132 132 186 162 232 232 232 68 68 172 115 273 278 278 139 139 293 122 458 458 96 472 221 401 401 75 161 79 487 288 443 443 169 271 150 39 433 433 433 433 160 427 247 247 247 126 126 126 326 326 326 326 326 326 326 326 326 326 101 101 101 149 228 228 321 321 321 354 420 420 422 143 458 192 485 278 368 453 9 397 345 409 409 409 67 219 219 152 152 152 152 14 14 411 411 284 284 284 353 353 353 396 406 467 467 255 255 255 399 217 473 65 486 486 365 460 240 310 107 107 447 242 94 199 176 176 328 200 248 248 219 152 152 152 378 399 70 65 428 428 428 146 143 449 34 253 253 9 142 397 336 109 109 139 139 175 175 81 255 255 217 217 65 486 486 460 240 240 36 310 107 242 242 116 394 478 66 342 224 231 231 231 76 76 198 214 214 214 328 200 248 250 364 276 109 498 498 396 169 164 164 133 364 276 276 346 346 346 265 85 85 85 355 355 375 375 375 98 229 229 321 247 15 15 15 15 15 193 193 193 193 17 +103-1241-0035 103 777 1 4 25 11 5 1 9 19 17 18 4 33 1 6 23 16 23 7 14 40 5 25 11 25 3 11 19 26 29 23 36 24 40 1 5 25 11 5 17 27 23 11 38 3 10 5 25 11 1 22 19 11 17 23 5 37 40 5 25 11 9 36 33 31 1 8 16 13 23 33 10 19 30 11 5 29 1 30 8 33 5 38 15 1 4 25 11 8 19 25 21 28 11 24 8 33 30 19 29 33 19 12 20 8 23 5 25 11 38 19 34 1 6 23 24 8 24 8 33 1 8 38 5 40 5 25 33 5 9 19 33 31 19 22 5 24 19 26 27 37 14 19 25 12 5 9 27 33 1 25 8 12 14 38 5 40 24 19 31 19 40 31 29 13 25 31 14 1 6 23 12 27 32 20 21 13 25 14 5 23 20 19 40 1 14 4 2 2 6 4 3 5 4 9 5 5 1 9 5 9 2 9 3 5 2 2 2 3 6 1 2 5 7 3 6 4 6 7 5 1 2 2 6 4 6 4 4 6 6 2 1 4 3 5 3 4 3 4 4 3 3 2 2 3 6 5 5 11 8 10 5 2 3 3 6 2 2 3 4 3 2 3 4 3 2 4 8 11 6 1 2 5 2 2 4 5 1 3 4 4 2 2 2 3 2 3 4 6 2 2 1 3 2 1 5 1 7 4 3 6 4 8 9 44 7 2 4 3 1 2 1 2 7 3 4 6 3 8 2 2 2 4 4 4 2 2 2 1 3 3 9 5 15 3 5 2 2 3 1 4 1 2 3 2 2 3 3 1 4 5 6 11 4 2 2 3 4 2 5 2 2 4 2 3 6 5 13 8 17 17 17 296 363 363 363 363 51 51 51 51 228 321 321 83 55 55 322 67 131 44 44 44 236 32 401 401 401 401 401 401 321 354 278 278 278 278 278 360 252 416 458 192 445 183 72 72 72 72 110 110 486 486 486 460 460 240 35 131 483 226 226 226 321 411 287 297 297 297 297 297 297 297 293 293 293 122 349 349 234 234 234 234 261 425 425 386 386 431 486 315 315 315 450 88 372 372 304 304 304 368 269 342 342 89 89 446 446 33 10 10 309 479 331 331 284 405 405 206 240 325 176 176 328 200 200 248 248 76 259 74 74 425 425 425 386 386 431 374 374 374 374 374 434 203 381 471 471 49 433 433 97 427 247 247 126 326 326 326 101 149 228 321 83 55 55 322 67 34 44 44 236 129 259 144 27 424 424 424 424 424 424 424 424 424 497 122 122 131 133 133 364 276 346 346 346 405 405 206 206 169 35 36 107 107 395 89 89 446 33 394 90 90 401 401 401 321 75 445 445 445 351 278 278 240 314 90 401 401 321 144 208 425 386 431 431 431 266 266 173 173 402 270 270 342 224 89 89 446 33 33 394 32 32 401 401 401 354 354 374 374 374 374 132 233 385 233 270 270 270 390 390 390 18 112 56 56 56 47 47 491 47 47 47 491 491 435 435 321 435 435 435 287 287 111 111 111 438 349 205 205 261 25 189 139 139 293 167 457 401 321 75 310 107 107 395 286 286 468 468 313 313 285 34 230 230 230 230 215 35 402 133 147 147 147 499 499 428 428 146 146 325 34 255 255 43 364 109 109 403 403 403 207 19 454 229 321 247 126 126 326 326 326 326 101 101 149 149 228 412 83 55 55 55 322 212 34 111 111 111 111 438 121 121 339 394 212 107 180 106 153 387 387 146 252 314 196 217 46 46 46 438 438 129 36 161 161 487 288 278 173 402 96 36 272 377 123 123 216 22 448 448 448 464 464 145 265 265 85 146 146 175 175 81 242 116 212 133 133 333 333 220 220 335 14 14 226 226 321 209 297 297 297 297 297 297 297 293 399 399 70 46 46 46 46 46 438 438 399 217 70 65 265 265 428 428 428 146 358 358 233 36 227 419 419 439 417 417 170 170 170 491 28 28 491 28 442 28 442 362 491 362 102 491 362 491 362 362 102 362 362 491 362 491 362 218 218 491 218 102 369 369 369 369 369 21 21 21 101 101 149 149 228 289 412 287 111 111 111 378 345 141 141 141 141 281 453 342 242 242 116 212 131 44 44 44 32 32 32 321 354 354 278 278 278 385 457 478 478 232 68 68 172 115 470 470 278 120 385 143 458 458 144 27 351 319 319 319 53 176 176 135 200 200 464 106 410 410 410 410 173 280 29 29 495 467 340 340 116 466 22 283 455 8 354 354 180 496 496 496 496 496 274 274 37 24 227 419 427 78 78 170 491 187 187 292 23 23 23 23 101 149 149 228 289 321 320 479 331 265 265 428 146 240 216 300 300 378 43 345 141 141 281 9 221 196 473 258 258 258 342 224 494 494 31 232 232 105 105 336 470 432 432 330 379 64 77 342 224 224 334 334 334 59 452 452 263 321 247 126 126 23 23 101 101 101 149 149 321 321 287 297 297 293 216 216 114 84 84 186 186 338 400 400 400 422 239 310 107 395 395 432 330 94 199 495 495 495 467 134 134 359 359 166 166 166 324 324 464 464 356 356 120 120 271 185 433 433 433 433 160 160 112 417 417 417 237 421 421 491 421 128 128 128 193 17 +103-1241-0036 103 778 1 32 20 31 13 11 32 20 18 4 11 5 25 33 8 24 33 19 17 19 33 31 19 22 1 38 3 10 19 26 33 19 31 20 12 5 33 8 11 19 11 5 25 16 3 23 27 37 14 9 6 30 11 1 32 20 31 13 11 32 20 25 13 37 14 31 6 12 5 1 9 20 33 5 37 24 20 16 14 29 30 7 23 19 26 5 9 7 33 1 9 5 33 19 16 19 33 22 4 29 33 18 14 16 14 24 9 20 19 26 31 20 31 19 22 19 33 31 5 24 14 31 20 8 11 19 11 29 30 7 23 19 40 5 25 33 19 33 1 4 25 11 8 38 6 25 33 19 11 33 19 31 20 13 37 30 20 34 19 26 12 5 33 38 5 40 33 19 9 20 31 20 25 3 25 12 4 33 9 27 33 1 9 19 22 5 40 8 11 19 11 5 25 27 38 13 12 14 8 11 13 37 14 18 4 37 5 25 5 12 14 3 29 14 33 36 25 5 33 20 1 10 6 3 4 3 3 2 3 4 2 3 1 3 5 4 3 2 1 4 3 3 6 5 4 2 4 3 3 2 3 2 1 6 5 1 2 2 4 3 1 2 1 3 5 3 5 4 3 3 3 4 3 5 18 6 3 4 3 3 4 2 6 2 3 4 4 5 3 3 2 2 4 2 2 3 2 3 3 2 5 3 3 3 3 3 1 3 8 6 26 2 2 2 2 4 2 2 4 4 4 1 2 1 4 2 4 2 5 1 6 7 4 6 4 3 2 2 2 2 6 4 5 4 3 4 3 2 4 3 4 4 2 3 2 2 2 5 6 19 4 2 1 3 4 1 2 2 1 2 1 2 6 4 3 3 2 2 2 1 3 1 2 1 2 1 3 3 1 3 3 8 5 2 3 3 2 4 2 4 6 3 14 2 4 1 3 3 4 3 3 1 4 6 5 3 1 4 3 5 3 2 3 3 4 2 2 2 3 3 3 5 2 3 2 6 4 2 3 2 8 17 17 17 17 296 296 363 363 51 51 51 321 321 373 338 400 400 400 422 422 162 68 115 470 470 443 240 314 35 310 107 400 400 30 422 58 110 110 254 254 254 240 35 242 242 242 33 457 465 108 119 437 103 103 103 146 299 203 53 64 212 377 87 416 416 445 180 278 443 385 385 77 478 66 232 68 172 115 273 470 278 278 120 178 458 458 192 225 225 225 7 276 346 346 405 206 206 35 310 107 135 135 135 248 212 384 87 87 38 342 68 172 267 267 267 267 301 301 216 45 45 45 325 111 111 111 438 438 239 384 371 278 278 116 242 33 90 393 393 234 261 25 106 481 481 481 293 293 175 14 14 410 410 410 410 410 280 29 29 245 245 8 354 153 153 153 153 372 372 372 37 24 404 439 229 491 247 312 312 187 292 292 292 292 292 21 21 21 21 23 101 408 408 149 321 321 373 400 400 400 30 422 162 162 68 115 470 470 120 240 240 314 310 338 338 400 400 400 30 301 10 10 309 479 331 463 463 463 463 29 382 313 186 186 162 54 115 273 106 481 405 481 293 216 216 283 283 455 236 401 401 321 354 213 213 213 252 325 34 69 223 130 402 196 429 429 429 429 422 393 155 332 332 245 129 321 74 190 190 380 499 499 486 481 481 293 175 175 81 176 328 200 200 255 255 8 8 180 113 113 113 113 113 450 450 167 385 75 227 419 439 78 78 170 491 28 491 491 341 341 12 12 12 21 21 21 21 21 21 101 101 149 391 228 491 289 321 321 320 159 159 159 285 34 118 118 118 118 261 177 177 177 131 90 259 144 445 351 351 443 443 240 215 35 96 96 272 156 156 382 349 205 155 165 165 165 165 53 394 212 212 354 420 420 360 360 360 135 135 200 200 248 248 478 66 68 68 68 115 267 267 267 213 422 186 162 68 68 68 115 273 470 278 278 178 143 458 192 177 177 77 77 342 168 44 44 399 217 217 70 65 498 498 498 396 186 162 54 172 224 41 41 324 464 464 111 111 438 438 239 75 371 371 278 278 314 35 401 259 74 190 190 499 499 499 405 450 293 293 175 175 81 356 356 281 453 430 430 430 430 64 465 34 277 277 277 277 385 385 233 321 419 427 491 491 312 312 312 187 187 12 12 12 12 12 21 21 326 408 408 149 149 321 321 209 55 55 322 322 199 111 111 111 378 43 364 174 174 319 348 325 34 191 191 36 87 87 87 162 68 68 172 267 267 267 267 464 464 464 204 204 204 204 29 29 337 469 164 164 214 214 214 200 248 114 45 177 43 345 141 141 281 86 238 6 377 87 87 8 354 420 420 420 422 162 162 68 68 68 68 267 267 267 267 267 434 339 339 199 125 125 125 125 348 466 114 114 92 92 92 167 457 401 321 354 354 496 496 496 496 274 37 24 131 427 321 247 126 326 326 326 326 326 326 326 101 149 228 289 321 321 354 420 420 422 143 144 27 180 253 368 453 168 111 111 111 438 236 325 371 278 278 278 314 242 242 242 457 10 10 10 309 331 331 84 84 84 274 43 43 109 109 181 216 216 300 300 300 406 467 111 111 111 111 438 240 325 34 463 463 463 280 29 382 382 58 72 72 110 202 202 202 202 402 44 44 116 479 331 493 493 493 493 216 300 495 406 467 467 499 405 206 215 29 29 469 469 236 36 108 119 485 485 485 374 374 330 94 199 469 469 469 325 41 41 41 19 19 19 454 454 229 170 491 491 15 15 15 15 15 15 15 15 193 193 193 193 193 17 +103-1241-0037 103 638 1 27 1 12 13 30 14 5 23 3 33 24 6 30 1 10 13 30 20 33 30 20 40 6 23 19 25 9 23 36 24 1 12 19 31 1 8 23 5 25 11 19 40 12 5 1 2 29 23 15 31 8 21 19 31 33 23 5 37 19 33 6 23 30 13 11 20 4 25 11 8 24 31 27 17 23 4 11 8 24 17 27 19 26 33 5 23 19 37 18 20 30 1 8 37 6 23 38 20 40 18 14 11 12 5 33 29 30 19 25 31 13 11 38 14 11 8 23 5 25 11 38 5 40 12 5 29 30 19 33 20 5 31 33 29 23 15 31 19 25 12 5 38 14 23 11 1 18 43 5 3 4 3 5 4 7 8 3 5 3 4 2 10 2 3 4 5 2 3 6 6 4 3 4 4 7 10 6 26 3 5 5 1 12 4 3 1 3 1 5 1 5 2 28 5 3 6 8 4 4 2 2 4 3 2 3 2 2 4 5 4 3 3 5 1 2 2 3 3 8 4 7 4 4 2 3 4 4 2 3 1 3 2 4 2 4 2 4 9 19 5 4 2 2 3 2 4 4 2 3 2 2 3 3 2 1 4 3 3 3 2 2 5 6 2 3 2 2 1 2 3 1 2 6 2 2 1 4 3 3 1 3 3 4 5 1 2 1 3 5 3 5 4 6 17 17 17 296 363 363 363 51 51 51 51 491 491 184 491 184 289 321 321 287 287 287 284 284 284 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 98 98 98 225 98 98 225 225 225 373 164 164 289 321 164 127 127 114 0 0 264 468 468 406 406 467 467 406 467 467 467 44 44 251 251 251 251 251 241 241 431 431 284 284 405 405 206 206 167 457 457 196 70 70 70 138 138 138 138 372 313 313 236 401 401 401 401 75 310 107 107 107 395 395 395 395 264 468 468 406 337 337 324 324 422 143 36 161 161 487 487 41 41 324 318 49 9 9 483 14 321 411 297 297 297 297 297 297 297 175 175 81 242 340 203 53 53 394 76 401 321 354 425 425 425 241 431 431 374 374 374 374 374 374 132 132 132 413 203 381 381 381 404 229 229 247 312 312 126 292 292 292 292 292 292 292 23 23 23 23 23 23 23 101 408 391 491 491 491 289 289 321 127 114 258 258 258 258 31 342 342 342 483 14 14 321 411 287 284 265 265 85 85 85 146 146 139 175 175 175 81 242 275 116 64 212 131 356 356 356 281 342 198 198 22 283 455 455 129 129 401 321 354 425 425 386 431 374 374 374 374 132 399 53 473 324 324 324 464 459 459 459 31 39 86 86 6 272 472 336 321 74 74 425 425 386 386 343 343 343 343 358 358 358 39 39 433 68 172 115 97 225 287 111 111 438 143 36 107 395 494 31 31 342 26 26 26 251 241 241 266 266 266 173 173 29 277 277 325 285 106 106 297 297 297 293 293 42 42 147 147 380 288 443 443 240 325 325 41 41 324 324 3 464 89 322 94 199 111 111 111 356 203 53 478 478 232 232 68 68 115 344 344 344 344 344 274 274 32 401 401 321 208 208 386 386 431 431 376 376 376 240 285 34 111 111 203 203 53 394 90 465 144 180 84 496 88 176 135 135 248 36 377 87 87 87 251 251 241 431 278 278 173 173 402 183 183 286 286 286 286 264 59 59 452 263 263 417 414 170 170 491 170 28 491 28 28 491 2 491 2 2 491 491 435 435 289 289 321 320 305 287 287 111 111 202 202 280 106 297 297 297 297 88 109 109 469 368 31 342 142 142 72 110 498 498 498 498 313 240 314 198 45 45 45 457 129 259 259 74 190 487 432 330 330 64 64 77 342 342 168 145 329 329 240 131 133 345 345 109 313 285 335 14 14 145 284 265 85 146 146 139 175 81 81 275 275 116 133 133 345 141 141 281 453 342 198 22 283 455 129 129 321 74 190 190 487 487 278 278 325 324 324 464 459 459 459 31 86 86 221 336 321 74 425 386 343 343 343 343 252 186 39 342 342 340 340 340 340 466 22 283 455 43 43 276 109 109 498 498 498 139 139 375 375 375 122 122 131 427 229 247 15 15 193 193 17 +103-1241-0038 103 746 1 5 25 11 8 39 36 40 11 33 5 19 24 4 21 5 25 8 38 5 40 23 19 37 19 26 18 20 30 1 9 5 33 8 25 13 37 14 30 20 23 20 19 22 31 29 13 22 33 5 11 8 38 35 11 1 19 33 31 11 19 23 8 33 16 5 23 38 19 25 39 35 30 19 24 4 21 5 25 15 32 5 25 40 22 5 24 33 30 36 19 40 5 25 33 19 33 1 9 5 33 12 27 40 30 13 11 30 27 11 40 14 31 27 16 5 25 20 1 18 38 13 25 38 20 17 3 33 19 25 33 5 12 5 33 30 15 25 4 33 32 3 30 23 5 33 7 25 5 25 11 12 5 30 13 11 30 27 11 40 9 20 17 4 25 33 5 16 23 4 32 29 4 31 33 1 8 4 31 33 24 19 31 19 40 31 29 13 25 31 14 38 5 33 24 15 11 12 5 24 30 13 11 1 9 3 2 2 3 5 2 4 1 2 2 2 4 4 4 2 2 3 3 1 5 3 2 3 2 2 6 2 6 20 3 2 2 4 5 2 4 3 6 2 4 3 2 3 4 3 2 2 3 2 2 6 6 4 7 26 5 3 3 3 2 6 4 3 4 1 3 2 3 2 2 2 3 3 3 4 4 3 2 3 6 1 2 3 4 2 4 5 2 4 2 3 2 3 2 5 5 22 2 1 3 3 4 5 4 3 5 4 3 3 2 3 6 5 7 4 3 9 20 1 2 1 2 1 4 3 3 2 2 4 2 3 2 3 6 3 3 3 2 2 5 2 3 2 4 5 7 2 2 1 2 1 4 3 3 6 3 4 2 3 2 2 3 4 3 2 2 4 3 5 6 5 8 4 3 12 8 8 3 2 2 3 3 2 2 3 3 2 3 4 2 3 2 2 3 4 2 1 2 5 1 4 4 5 17 17 17 363 363 363 51 51 228 321 83 55 55 322 131 111 111 111 111 438 219 219 219 485 485 374 186 162 54 238 6 161 87 87 464 255 255 399 217 473 65 486 486 460 240 240 310 107 395 242 116 94 199 111 111 378 378 345 141 141 281 342 9 26 26 251 241 431 278 278 173 173 280 176 135 328 200 248 183 183 286 286 286 286 264 59 59 452 263 321 247 247 126 126 292 292 292 23 23 23 23 260 260 391 391 391 316 73 73 289 321 321 354 159 159 159 285 34 111 111 111 111 438 10 10 479 463 463 463 463 463 29 29 382 245 245 42 42 147 147 380 485 485 278 278 359 359 166 166 166 464 464 154 154 458 96 66 86 105 105 336 470 470 151 178 178 96 96 272 191 191 191 325 34 111 111 111 111 438 438 43 364 364 109 109 389 389 120 120 120 37 37 75 419 419 439 78 170 170 170 170 28 491 28 491 28 362 362 491 362 2 362 362 491 491 491 366 491 491 316 316 435 289 321 321 177 177 177 143 36 77 86 86 221 336 384 490 490 490 251 251 251 241 431 428 428 428 428 146 35 35 393 393 155 262 262 100 100 497 43 364 409 409 409 409 33 219 219 152 222 222 406 467 467 467 255 203 217 473 65 486 486 460 460 240 310 107 395 395 469 116 94 418 418 418 418 418 99 436 436 60 298 298 379 471 49 9 142 336 144 27 351 319 319 203 53 90 76 321 161 161 161 487 487 374 374 132 88 88 356 356 356 453 342 430 430 116 64 212 131 277 277 277 277 277 385 385 75 419 427 229 491 312 312 126 292 292 292 1 1 1 1 21 21 21 21 101 408 149 149 228 321 320 320 159 159 159 35 35 198 127 124 124 124 124 124 368 9 142 397 42 147 147 380 288 443 443 240 240 314 131 133 133 147 147 380 496 496 496 274 368 77 270 9 353 353 353 186 186 232 482 172 115 344 344 344 344 274 349 349 234 234 234 234 261 25 319 319 319 240 94 199 41 41 41 41 19 19 19 454 454 414 170 170 312 312 187 187 187 292 292 292 23 23 23 101 101 149 149 228 321 321 320 345 409 409 409 399 473 429 30 301 143 465 144 180 189 189 240 285 94 34 340 340 116 64 76 377 377 123 123 216 216 22 283 455 236 401 321 75 161 161 487 487 288 290 290 290 434 339 199 199 415 457 457 186 338 338 338 395 499 499 306 306 206 293 175 81 81 469 457 457 36 75 108 119 351 315 315 315 315 450 450 413 413 94 199 340 340 466 22 283 455 455 42 42 147 380 288 443 443 240 314 131 133 133 364 147 380 380 496 496 496 274 274 24 77 270 142 221 336 420 420 420 416 445 445 210 210 210 460 330 388 76 384 87 87 87 349 234 261 261 386 431 431 376 376 460 460 169 169 99 436 447 447 221 336 74 74 311 311 311 311 311 311 311 460 169 150 150 342 86 6 272 427 82 247 126 326 326 326 326 101 101 101 149 149 228 321 287 287 111 111 111 438 438 145 145 376 376 460 460 169 150 150 86 238 6 196 196 217 473 258 258 342 342 224 494 494 31 162 68 105 105 336 354 470 432 330 379 64 77 77 224 300 382 382 245 43 345 181 181 181 167 457 217 217 473 476 476 476 252 314 259 22 57 57 203 53 250 250 147 380 288 288 120 120 240 385 131 229 247 126 193 193 17 +103-1241-0039 103 806 1 4 25 11 32 20 31 13 11 32 20 11 19 11 25 33 25 27 5 25 11 16 14 29 19 33 20 40 31 15 22 25 3 33 5 4 31 22 18 14 13 25 20 24 6 30 22 38 13 31 10 5 25 40 1 32 20 31 13 11 8 24 5 31 33 18 4 37 4 31 33 18 14 5 34 7 40 5 25 11 6 23 30 13 11 20 1 8 31 5 29 27 40 8 18 4 11 33 36 9 5 33 1 18 7 39 36 17 27 19 26 33 19 16 8 25 11 7 33 5 9 7 33 34 19 26 40 19 16 39 36 11 27 25 33 4 31 22 38 13 31 10 5 25 40 1 4 25 11 38 5 33 11 5 40 24 15 22 12 5 30 27 11 40 30 13 11 1 38 13 23 25 7 1 8 11 5 25 27 1 31 13 11 24 4 34 39 36 1 6 3 2 3 4 3 6 2 3 3 2 3 2 3 2 1 3 4 2 2 1 2 3 4 2 3 3 2 5 4 3 2 4 3 2 7 3 2 2 1 2 3 2 4 2 3 4 2 2 3 5 2 3 4 15 6 2 4 2 1 5 3 3 2 1 2 1 2 6 3 1 2 1 3 6 6 4 1 2 2 4 4 3 3 2 8 16 7 4 1 4 4 5 6 5 5 4 5 7 4 2 3 17 7 6 5 1 3 2 3 1 2 1 5 5 2 3 4 2 2 2 6 3 2 2 3 3 2 2 2 2 3 3 2 2 4 4 3 2 2 4 4 3 4 10 22 3 2 1 2 4 5 4 5 6 2 3 5 2 3 4 4 3 4 3 4 7 37 18 6 3 4 20 22 11 2 3 3 17 8 7 1 3 3 5 3 3 10 19 17 17 296 296 51 321 412 55 55 322 322 67 478 338 338 400 400 400 30 30 422 186 232 232 172 115 470 470 240 314 36 310 400 400 400 30 422 236 384 371 371 278 278 314 196 242 242 457 309 479 331 84 84 496 88 88 89 446 203 393 155 332 332 332 245 129 259 74 74 278 278 278 325 41 324 324 324 186 162 232 68 68 115 470 470 171 171 252 143 96 196 479 331 307 307 61 167 457 36 377 87 87 14 145 145 376 460 460 169 150 86 105 221 458 208 495 467 467 475 475 475 475 475 301 399 70 138 138 138 138 372 245 245 129 321 208 441 151 151 151 151 169 99 238 238 310 107 60 298 298 298 379 471 471 270 160 427 247 247 126 126 292 292 292 292 23 23 408 408 408 408 391 321 321 373 373 400 400 400 400 422 162 342 115 470 470 240 285 34 111 111 111 438 399 70 65 65 151 150 150 86 6 34 202 202 202 280 145 145 486 460 460 169 150 86 238 272 161 382 467 44 44 44 38 164 401 321 164 180 180 486 315 315 450 450 169 269 9 168 242 116 64 131 34 106 297 297 297 293 293 42 42 147 380 288 443 443 240 325 325 41 41 19 19 454 454 414 321 247 312 126 126 292 292 292 1 23 23 408 408 149 149 228 321 321 209 287 111 111 111 438 31 342 342 494 494 494 129 74 496 496 496 496 496 368 368 453 168 180 111 111 111 111 111 438 58 72 72 110 110 486 486 486 460 460 388 64 314 401 321 108 108 119 374 374 374 374 374 132 132 132 8 8 354 159 159 159 159 314 229 247 247 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 228 321 373 72 72 268 268 268 268 268 88 430 430 430 430 219 219 152 152 416 144 27 106 88 350 360 135 339 212 87 87 349 349 261 25 480 480 480 85 299 299 299 64 212 384 180 180 486 113 240 285 285 255 255 8 354 180 113 113 113 113 167 167 164 164 164 214 214 214 200 200 471 49 342 9 118 118 118 280 30 30 30 422 239 371 180 84 350 350 413 285 34 145 145 460 460 169 150 86 142 221 336 208 441 151 151 151 151 169 99 447 238 6 310 60 60 298 298 275 379 471 471 471 49 269 433 160 160 112 112 56 56 170 28 28 491 2 2 2 2 289 321 373 373 326 326 326 326 326 326 101 149 149 228 321 321 83 55 322 322 399 250 181 181 181 181 181 35 401 401 401 401 321 384 371 180 71 71 71 71 368 368 453 342 86 221 196 196 473 476 476 476 143 143 401 401 198 22 283 455 455 42 147 380 380 288 496 496 496 274 37 77 77 323 142 397 336 147 147 380 288 120 120 120 37 24 24 419 439 439 78 417 417 170 170 170 170 28 28 28 28 491 362 491 491 362 362 491 362 491 362 491 362 362 491 40 40 40 40 40 40 40 366 366 366 366 316 316 249 7 7 7 7 7 7 7 7 7 7 7 7 364 364 276 276 109 109 84 443 139 139 139 293 293 413 122 309 479 331 331 315 315 315 315 315 450 450 450 16 16 293 98 98 13 13 13 13 13 78 491 170 312 312 126 23 23 23 23 260 260 391 163 316 491 316 289 373 225 225 225 442 287 287 287 287 287 287 111 111 111 438 438 24 325 34 84 242 116 479 331 84 84 84 84 16 16 16 16 375 98 98 98 263 13 13 13 78 47 47 47 491 47 80 80 321 80 373 66 66 172 179 179 179 179 314 196 196 70 65 329 329 460 460 169 349 352 25 485 485 485 485 485 374 132 98 98 13 417 417 417 170 421 421 491 421 421 491 128 128 128 491 128 128 128 128 128 193 193 17 +103-1241-0040 103 689 1 12 13 30 11 9 20 25 27 31 22 27 29 16 14 19 24 4 21 5 25 15 32 5 25 12 13 25 1 38 35 11 12 13 30 1 9 5 33 15 13 24 8 1 33 6 22 19 26 33 36 24 5 10 1 29 20 29 5 23 14 6 23 38 20 40 33 13 23 19 26 24 20 8 11 36 1 38 35 11 39 36 30 4 12 14 8 11 19 11 5 25 33 6 22 1 19 16 39 36 31 15 31 27 8 23 31 33 3 29 1 8 22 4 25 31 33 3 29 38 13 25 8 24 15 22 5 29 24 8 24 8 25 11 33 36 19 33 6 23 12 27 19 33 31 11 19 16 5 22 5 23 33 1 24 4 34 39 36 1 9 3 2 1 2 2 2 5 4 4 3 3 2 3 2 6 3 3 4 2 2 5 6 3 2 3 4 5 3 5 2 4 2 2 8 31 3 1 2 1 2 3 4 1 3 5 3 2 2 3 3 3 5 9 8 3 3 2 2 3 6 3 2 3 2 2 4 2 2 3 2 3 4 6 3 12 18 3 2 2 2 3 4 4 2 4 4 3 3 1 2 2 5 7 7 19 5 4 2 2 6 5 5 4 2 4 4 3 8 5 22 6 8 5 4 4 3 4 3 2 1 2 4 4 3 4 3 2 3 4 5 4 3 1 3 3 4 3 3 2 3 5 2 3 4 2 3 3 2 3 3 5 6 40 6 7 6 2 10 9 17 17 17 363 363 363 149 149 228 321 127 114 0 0 313 313 35 354 420 420 420 301 10 479 331 231 231 231 274 186 162 482 482 105 6 144 496 496 496 215 457 393 205 155 332 332 332 216 448 448 448 464 255 399 473 65 486 486 460 240 24 310 395 469 242 116 94 418 418 418 418 418 418 99 436 436 60 60 298 298 116 33 394 466 127 114 361 361 361 282 388 303 117 48 13 80 80 80 321 7 364 345 430 430 430 314 35 401 198 127 114 114 264 264 264 59 59 452 452 13 229 247 247 312 312 312 292 292 292 292 292 12 21 1 21 21 21 21 21 23 101 101 149 149 391 316 316 316 73 73 289 289 321 320 159 159 285 34 430 430 430 399 70 65 111 438 438 143 36 108 119 351 405 405 405 206 178 192 192 176 135 135 248 248 465 377 377 374 374 132 399 70 383 383 383 383 383 385 35 310 310 107 447 97 427 56 56 47 491 187 80 491 80 289 321 320 74 485 213 213 252 215 354 29 302 302 175 175 81 353 353 353 353 467 467 297 297 297 293 43 345 109 469 281 342 342 6 36 119 351 351 139 139 175 81 176 135 200 248 248 429 429 429 429 464 464 111 111 111 111 438 438 239 75 371 371 374 374 374 374 132 132 132 98 98 13 414 247 312 312 126 187 292 12 12 12 12 23 23 23 101 149 149 228 321 321 320 345 430 389 236 310 107 152 152 152 378 42 147 380 180 486 486 460 240 216 300 300 495 406 467 111 111 111 438 314 36 371 371 278 278 314 242 242 242 457 457 108 108 119 437 437 405 405 405 405 206 206 215 35 458 192 419 427 229 247 312 126 292 292 23 1 408 408 408 149 228 228 316 316 80 80 289 321 209 188 118 118 118 118 118 261 219 152 152 152 152 186 162 232 172 115 470 470 403 171 171 422 162 342 342 273 273 84 16 88 106 284 481 293 293 293 150 162 232 86 238 272 371 180 106 284 405 405 405 206 206 215 215 233 352 419 13 229 82 312 187 187 187 187 47 47 47 47 491 491 491 316 491 316 80 80 435 435 435 435 209 111 111 111 438 143 458 445 445 445 351 351 351 365 365 365 365 330 388 64 64 77 77 342 68 238 6 272 180 405 405 405 215 215 35 402 345 409 409 94 199 111 111 111 438 399 217 473 473 476 476 476 143 458 192 180 230 230 215 35 35 70 70 46 46 46 438 438 399 217 70 65 480 480 480 480 299 299 339 394 465 108 377 123 123 123 88 277 277 277 277 385 131 34 106 297 297 297 293 216 114 114 84 84 88 88 177 177 177 143 36 77 342 86 238 6 336 371 490 490 490 349 349 261 469 469 469 458 144 27 100 100 100 375 375 122 122 227 227 419 427 56 56 491 312 312 312 12 12 12 12 12 12 12 12 12 12 260 260 260 260 260 491 163 163 163 366 491 366 491 316 491 366 366 491 40 40 40 40 316 289 321 321 289 7 7 217 217 473 486 486 486 460 460 460 169 164 164 164 164 219 219 219 485 477 477 374 374 132 132 98 13 417 417 417 417 237 421 421 128 128 193 17 diff --git a/SpeechLM/dataset/LibriSpeech/hidden_unit/dict.km.txt b/SpeechLM/dataset/LibriSpeech/hidden_unit/dict.km.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/hidden_unit/dict.km.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.km b/SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.km new file mode 100644 index 0000000..dc33360 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.km @@ -0,0 +1,100 @@ +17 17 17 296 296 317 317 317 317 317 491 461 461 461 461 461 461 491 491 184 184 184 289 310 107 107 395 351 486 486 460 215 215 35 96 272 300 382 382 245 43 364 276 174 174 174 174 319 282 282 388 303 303 117 404 404 439 439 225 225 225 225 225 225 225 491 391 391 47 491 73 80 289 7 7 217 473 258 258 258 31 342 224 494 494 494 368 281 9 142 142 147 147 329 329 329 329 329 329 36 310 107 395 395 302 302 497 497 251 251 241 241 431 329 432 330 330 388 195 195 64 212 212 131 483 226 226 226 209 356 356 356 356 31 162 68 224 224 494 494 215 129 74 190 190 499 499 499 265 265 85 85 85 85 207 318 185 185 433 433 86 6 6 227 419 417 417 417 237 237 237 237 237 237 237 237 237 237 237 237 362 491 362 305 40 491 305 40 40 362 362 40 40 40 40 40 40 40 40 218 491 218 218 218 491 305 218 491 218 218 218 218 218 218 491 218 435 491 218 491 218 218 218 491 218 218 491 369 491 369 369 369 369 369 21 21 21 21 21 21 21 21 408 408 408 149 228 228 491 289 320 7 473 258 258 258 258 342 342 224 494 494 494 494 31 9 9 142 397 147 147 329 329 329 329 329 143 36 107 107 395 302 302 497 497 251 251 251 241 241 431 278 278 278 278 330 388 388 195 195 195 243 212 131 419 439 225 225 225 80 491 80 7 7 251 241 431 278 278 278 173 173 402 402 401 401 401 401 401 491 310 107 395 395 180 151 151 151 169 150 150 86 86 238 6 272 397 133 345 109 109 109 264 264 313 216 216 22 448 448 448 14 14 14 145 145 145 486 460 460 460 173 280 29 242 242 116 33 250 250 251 241 81 444 324 324 324 324 324 301 339 217 217 217 217 217 473 65 290 290 290 290 290 434 434 339 339 33 250 250 42 42 147 147 380 288 84 496 496 496 496 496 274 274 37 24 131 404 439 78 414 80 80 80 80 80 80 80 401 384 371 278 278 278 215 35 35 96 401 401 401 401 401 401 401 401 401 239 384 371 180 315 315 315 315 315 450 450 413 413 94 199 340 340 33 76 465 377 123 123 123 88 88 44 44 44 251 251 241 431 278 278 285 285 302 302 497 497 497 58 72 72 72 437 481 481 481 481 481 481 175 175 81 84 84 84 496 274 98 98 229 247 247 126 126 126 326 326 326 326 326 101 101 149 228 491 373 393 234 234 155 190 190 487 288 288 278 330 339 64 64 212 310 447 447 6 272 472 345 333 333 220 220 164 14 14 411 411 284 481 481 481 293 293 122 122 384 300 334 334 304 304 304 49 269 342 168 89 89 89 446 33 33 250 251 251 241 431 470 171 171 171 252 252 325 34 41 324 324 318 368 368 342 9 219 485 286 286 382 382 313 236 239 161 161 79 499 499 405 405 206 215 215 233 270 270 433 342 224 89 89 322 67 394 76 465 161 161 492 492 492 8 8 280 498 498 498 498 498 396 186 39 54 238 6 272 472 336 336 62 62 62 62 62 146 464 44 44 44 8 32 401 354 190 190 380 380 499 496 496 496 178 233 233 458 192 419 427 247 247 15 193 193 17 +17 17 363 363 51 51 228 320 127 45 45 45 385 131 58 72 72 110 110 110 110 486 460 240 240 325 34 154 154 154 457 478 478 232 232 482 482 172 115 273 273 153 153 153 372 372 396 396 186 186 54 54 172 224 273 255 255 43 364 364 276 109 109 403 403 403 403 403 207 246 324 301 301 129 401 354 354 180 376 376 376 460 178 178 458 192 192 242 340 116 466 466 22 283 455 43 364 364 276 276 153 153 496 496 37 37 24 77 270 342 224 69 69 130 130 198 22 448 448 448 464 180 424 424 424 424 424 274 122 131 472 221 401 82 144 27 437 151 151 169 169 164 164 472 221 401 259 29 380 382 396 313 385 35 472 401 259 74 425 425 386 343 343 343 343 343 358 358 39 39 433 433 160 160 160 112 427 56 56 491 312 312 341 341 341 341 341 341 12 12 12 21 21 21 21 21 21 21 21 21 408 408 408 408 391 391 228 491 491 412 177 177 177 177 177 131 133 345 141 141 141 281 453 142 397 456 456 456 456 129 259 74 485 485 485 485 374 374 325 449 449 191 191 191 314 314 36 377 87 87 8 8 420 420 420 324 464 44 44 44 94 335 335 411 411 188 121 121 33 64 76 465 465 161 161 487 469 469 143 458 192 192 278 278 278 37 314 131 472 72 72 72 72 72 72 110 110 443 120 240 314 314 26 26 26 251 241 431 235 235 235 235 235 413 200 200 248 248 248 212 354 190 380 380 499 496 496 496 178 233 458 192 192 340 340 340 94 199 154 154 77 342 342 142 14 411 498 498 498 498 498 134 175 81 166 324 324 464 382 382 245 129 458 208 208 441 441 441 153 153 372 372 396 186 186 323 323 238 6 272 377 487 487 374 313 216 216 114 124 124 124 274 274 368 269 9 142 397 336 276 109 109 496 496 496 37 37 37 24 270 270 433 160 427 229 247 247 126 126 326 326 326 326 326 101 101 149 149 228 228 491 345 333 333 333 220 220 164 402 221 401 401 401 491 384 371 180 106 306 306 306 306 396 396 178 178 35 458 96 96 66 66 68 68 68 68 115 115 444 213 213 213 143 458 208 208 487 487 288 277 385 143 270 270 342 224 69 462 462 130 402 402 401 401 491 74 190 441 441 441 153 153 182 182 182 182 182 497 175 175 81 89 89 446 116 33 131 472 221 458 445 445 351 351 486 486 460 460 169 150 342 342 86 105 336 445 445 470 403 403 171 171 171 246 246 252 24 131 404 439 78 170 305 491 28 28 28 491 491 491 2 201 305 305 491 305 305 2 316 316 316 316 316 491 491 289 289 289 320 354 159 159 159 159 159 240 35 131 472 221 336 354 62 62 62 62 62 438 216 22 283 455 236 108 119 119 103 103 103 103 103 85 299 203 53 473 177 177 143 131 133 133 147 380 288 213 213 213 252 143 310 447 447 447 26 26 251 251 241 81 329 329 329 330 388 195 195 471 471 49 453 142 58 72 72 437 437 481 481 481 481 293 175 175 81 84 84 84 84 84 16 274 274 98 483 483 440 188 177 177 177 131 133 133 345 141 141 141 281 9 168 44 44 143 458 208 208 441 441 441 346 346 265 265 85 85 85 146 146 277 277 277 385 385 227 419 225 225 226 197 7 364 276 109 109 139 139 293 293 122 143 458 144 27 27 121 116 33 33 212 239 371 180 151 151 151 178 35 96 96 36 272 191 191 191 37 314 26 251 241 431 431 278 285 285 302 302 497 497 186 162 482 482 338 238 161 79 487 288 288 360 360 434 434 434 203 381 381 404 13 491 247 15 193 193 193 17 +17 17 17 363 363 51 51 228 491 373 155 155 155 148 148 387 372 313 10 479 479 307 307 307 307 61 167 449 449 34 357 357 357 357 357 173 280 29 242 116 94 199 44 44 44 8 129 401 259 354 190 190 380 380 499 496 496 496 167 233 233 144 192 419 419 439 225 225 225 80 80 491 491 144 389 389 389 389 389 133 133 42 147 147 380 499 319 319 319 348 348 195 394 90 76 74 74 437 311 311 311 311 311 311 460 169 150 342 86 6 6 196 217 473 258 258 258 31 342 224 494 494 368 281 9 142 397 147 329 329 329 329 329 36 310 107 302 302 302 497 497 251 251 251 241 431 329 329 330 116 33 195 195 471 471 49 269 142 238 6 272 106 153 153 372 372 372 245 43 345 333 333 220 220 216 180 113 113 113 113 167 167 236 239 401 384 219 485 485 374 374 132 132 42 147 456 456 456 456 416 144 27 106 306 306 306 306 306 306 396 313 24 24 131 472 393 155 332 332 332 313 236 239 239 384 371 213 213 213 252 186 39 342 342 11 11 11 379 379 379 394 76 478 66 68 68 115 267 41 41 41 246 3 464 464 89 194 446 446 446 64 212 239 384 490 490 143 458 144 208 441 441 153 153 153 372 372 372 467 467 467 275 203 381 381 48 404 13 491 491 312 312 312 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 149 228 491 289 412 177 177 177 177 177 35 401 259 74 190 190 488 488 488 488 488 8 29 134 134 134 134 8 8 359 359 166 166 166 324 301 378 345 141 141 141 281 9 142 221 144 27 27 437 370 370 370 370 370 370 348 64 76 310 107 395 395 459 459 459 271 271 39 86 86 238 198 45 45 45 45 45 35 401 196 217 473 258 258 258 31 342 342 224 494 494 494 368 453 9 142 397 147 147 329 329 329 329 329 329 143 310 107 107 395 302 302 302 375 497 497 497 43 364 345 141 141 141 31 162 232 68 172 115 470 278 278 325 34 176 135 135 200 200 464 415 415 415 415 415 131 183 156 156 156 156 245 43 364 364 109 109 278 278 116 33 64 212 212 34 84 84 84 84 274 274 98 229 229 247 126 126 326 326 101 408 408 228 491 491 491 445 445 213 213 213 213 252 215 458 176 176 135 135 200 200 44 44 44 44 99 338 338 338 338 338 395 106 306 306 306 306 396 396 215 35 35 335 145 284 265 265 265 85 85 85 146 464 464 106 125 125 125 125 348 94 335 14 411 204 204 204 204 204 204 204 29 29 337 337 324 422 422 164 164 164 214 214 214 328 200 248 466 114 114 45 45 385 90 401 82 74 119 311 311 311 311 311 311 311 311 311 282 169 169 150 39 433 86 238 6 75 227 419 225 225 225 225 225 491 373 305 80 289 491 155 165 165 165 165 165 203 53 212 239 190 380 380 496 496 178 35 96 270 342 342 224 89 89 446 33 394 310 107 395 395 106 139 424 387 122 122 122 300 300 242 242 116 94 335 335 411 230 230 230 230 230 230 215 215 233 233 419 427 229 247 247 126 126 193 193 193 193 17 +17 17 17 363 363 51 149 228 228 209 83 194 194 194 322 322 67 212 127 45 45 45 45 240 240 325 118 118 118 118 118 402 338 400 400 400 30 301 301 10 479 331 84 84 496 274 252 36 449 459 459 459 31 342 86 86 6 272 483 483 411 475 475 475 475 475 475 475 475 349 164 164 214 214 214 214 200 248 14 14 411 287 284 284 284 426 426 426 206 206 206 24 335 335 226 157 157 157 157 157 245 14 14 411 145 113 113 113 113 285 285 34 462 462 130 402 401 401 491 74 425 425 386 386 431 343 343 343 343 358 358 358 358 358 39 433 433 433 160 427 247 247 247 126 126 292 326 326 326 326 326 408 408 149 228 491 373 338 338 400 400 400 400 301 378 43 345 389 389 389 314 314 196 309 309 479 331 463 463 463 463 280 29 382 245 245 42 42 147 380 380 288 443 443 120 169 169 150 39 433 86 86 86 6 6 272 34 89 319 319 348 394 76 108 377 139 139 139 139 293 186 99 338 400 400 400 30 3 58 254 254 254 314 131 393 234 234 261 25 470 264 264 468 468 468 396 313 143 449 449 191 191 191 325 180 180 113 113 113 113 113 167 314 314 401 401 198 22 283 455 455 43 364 364 276 346 346 346 265 265 265 265 85 85 85 146 146 318 318 368 453 342 168 89 89 446 116 212 131 133 43 364 276 109 109 264 264 264 468 245 245 349 234 234 155 25 148 148 148 372 372 304 304 49 9 9 221 198 127 114 114 264 264 468 406 406 467 467 106 284 284 426 426 206 206 37 173 352 352 352 352 419 439 439 237 237 237 491 491 491 28 491 491 491 491 341 341 341 341 341 341 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 369 260 491 163 163 163 163 163 163 316 491 316 316 73 289 289 289 127 114 0 222 468 353 353 353 353 215 35 259 74 425 425 386 431 432 330 330 348 76 449 41 324 464 462 462 462 402 221 259 74 351 213 213 213 252 252 129 354 100 100 100 497 497 335 335 440 188 188 340 116 94 199 145 145 145 486 460 460 173 280 29 242 242 116 33 250 250 359 359 474 474 474 324 246 19 3 3 14 14 209 145 194 194 446 446 388 64 212 335 14 411 145 145 113 113 113 450 413 285 34 223 223 223 280 280 277 277 277 277 277 233 75 227 427 229 247 312 292 292 326 326 101 101 149 391 228 491 491 373 489 489 489 489 143 458 144 389 389 389 94 199 255 255 236 36 108 119 119 351 432 432 432 330 388 195 64 131 472 472 221 458 144 208 208 425 386 386 496 496 496 274 186 186 54 54 86 26 26 474 474 166 301 143 36 377 123 123 123 114 222 222 222 222 313 10 10 479 398 290 171 171 252 215 458 29 382 382 304 368 269 342 142 221 336 354 278 278 278 368 453 342 86 196 196 94 459 459 459 271 31 342 342 221 221 336 354 62 62 62 62 62 438 438 143 36 384 371 371 278 278 330 33 64 76 108 449 69 223 130 402 196 479 331 255 154 416 458 208 386 431 151 151 151 178 458 96 36 272 176 135 135 200 248 248 127 114 222 222 222 406 406 467 467 350 350 350 350 350 350 413 413 303 48 404 13 229 491 491 312 15 15 15 193 193 193 17 +17 17 17 296 363 363 51 51 51 491 491 491 491 320 320 159 159 159 159 314 35 196 196 473 258 258 258 31 342 224 494 494 494 368 453 142 142 397 147 380 329 329 329 329 143 36 310 107 395 134 302 302 497 497 251 251 251 241 431 278 278 278 330 388 195 64 212 131 133 133 141 141 141 281 453 142 221 336 174 174 174 174 348 199 223 223 223 130 198 198 124 124 124 124 124 368 31 342 86 221 221 336 445 445 445 351 351 171 171 171 252 215 29 134 134 134 8 259 354 100 100 497 497 497 122 129 259 144 208 208 190 487 487 213 213 213 252 143 36 310 107 395 334 334 334 304 304 185 49 269 342 224 224 489 489 489 143 144 27 389 389 116 33 250 217 217 473 365 365 365 330 94 199 469 469 469 24 36 310 447 447 447 6 127 222 222 222 245 245 14 411 411 350 350 350 350 413 64 394 465 465 27 27 121 116 33 394 478 478 232 172 224 273 470 498 308 308 467 299 388 379 471 471 49 342 168 89 194 194 446 322 64 212 198 114 114 84 496 496 274 318 49 269 342 224 69 462 130 129 402 106 493 493 493 216 300 300 382 245 349 205 261 261 25 496 496 496 496 274 274 233 96 270 433 342 168 340 340 116 33 36 377 123 123 216 283 455 8 354 106 306 306 306 306 396 396 416 416 192 192 275 275 116 303 303 48 48 229 170 491 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 408 408 408 391 391 391 228 491 491 373 338 400 400 400 30 378 378 141 141 141 281 342 342 44 44 44 94 331 84 84 496 496 285 449 134 134 8 100 100 497 497 58 72 72 268 268 268 268 268 169 186 39 54 142 397 397 276 346 346 346 428 85 146 146 358 352 352 352 352 352 352 417 417 417 417 237 491 435 225 225 225 72 156 156 156 156 245 245 43 364 276 276 109 109 498 396 396 178 143 259 458 208 345 141 141 281 281 9 168 106 297 297 297 297 297 297 43 43 345 109 109 171 171 368 368 342 342 221 336 371 180 180 319 319 319 319 282 388 195 195 195 117 404 335 440 209 83 194 194 194 194 446 446 64 212 131 133 364 364 276 109 109 443 139 139 139 293 293 497 122 239 36 371 180 319 319 319 319 282 303 303 303 303 117 404 439 439 439 78 237 47 47 47 80 491 80 491 373 373 338 338 338 400 400 400 30 30 246 246 246 3 3 197 197 7 42 147 147 147 380 210 210 210 210 486 365 282 282 282 388 388 195 195 199 404 404 197 197 216 22 283 283 455 38 162 482 115 273 273 84 496 88 88 176 176 176 328 200 248 478 66 172 115 273 498 498 498 245 143 458 458 302 302 302 302 375 98 98 229 247 247 15 15 193 193 193 17 +17 17 17 363 363 363 51 51 228 491 373 72 110 110 139 139 139 293 293 215 35 96 96 6 472 472 133 42 147 380 499 499 319 319 319 348 195 195 466 22 283 283 38 162 68 68 68 273 273 319 319 319 348 33 64 212 212 93 93 93 93 171 422 186 39 86 86 105 105 336 208 153 153 153 153 182 182 375 375 497 98 98 483 440 83 83 55 55 55 322 67 212 131 133 345 141 141 141 141 281 9 198 198 22 283 455 38 162 482 482 482 238 6 161 161 499 499 235 235 235 235 348 64 212 459 459 459 459 31 54 86 6 272 472 221 336 259 190 190 190 488 499 499 405 405 206 215 215 35 29 69 69 223 130 198 198 22 283 455 236 129 36 310 107 395 395 487 498 498 498 396 178 36 310 107 447 483 226 226 209 411 171 171 171 171 252 252 143 77 478 342 224 494 494 494 31 342 342 115 273 470 265 265 265 85 85 85 146 469 469 469 36 449 41 41 41 324 324 3 335 440 145 194 194 446 446 67 76 90 393 393 234 261 25 148 148 148 148 372 372 467 467 467 242 116 33 250 217 217 473 473 278 278 99 436 436 60 60 298 379 379 195 471 471 49 49 168 106 106 405 167 215 35 458 96 368 453 453 371 278 278 139 175 81 324 324 219 495 495 495 495 467 41 41 41 41 19 454 454 229 491 491 312 312 312 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 149 228 491 491 320 219 357 357 357 240 240 131 133 133 345 333 333 220 220 216 106 106 297 297 297 297 297 297 293 293 293 122 4 127 114 258 258 258 258 258 271 271 39 433 433 433 433 160 160 160 97 97 225 225 225 225 7 217 473 258 258 258 258 342 342 224 494 494 494 368 9 142 142 397 147 380 329 329 329 329 329 310 107 107 395 302 302 497 497 349 349 205 261 261 25 315 315 315 450 450 413 413 212 131 335 226 209 44 44 44 236 8 32 259 354 180 319 319 319 348 348 64 64 64 64 212 384 34 11 11 11 116 33 243 243 401 401 491 108 119 119 437 103 103 103 103 103 85 85 299 299 339 64 76 36 87 87 66 66 68 68 115 278 278 278 36 131 393 393 155 155 332 332 332 14 14 14 411 145 145 284 315 315 450 450 153 88 372 372 304 304 185 49 453 168 415 415 415 415 58 183 156 156 156 313 143 458 458 445 351 278 278 278 36 310 107 107 395 242 116 116 250 250 250 276 109 109 278 330 116 33 64 212 212 371 84 84 84 84 274 274 263 229 247 247 126 126 326 326 326 326 326 101 101 149 228 228 289 320 309 309 479 278 278 278 325 449 449 176 176 135 328 200 200 195 248 197 197 197 401 491 144 27 27 437 437 405 405 405 206 167 35 35 242 242 242 33 33 33 250 250 364 276 276 153 153 372 372 372 215 215 35 472 472 221 401 491 208 208 441 441 441 441 109 278 139 139 139 375 375 375 233 233 270 270 433 433 160 160 18 112 112 439 439 439 225 237 237 237 47 491 47 491 491 73 491 373 373 338 400 400 400 30 30 58 110 254 254 254 314 196 196 479 331 278 278 278 325 449 191 191 191 314 314 478 478 68 68 115 273 278 278 143 96 96 232 68 68 68 6 272 371 444 360 360 252 339 199 199 223 223 130 402 198 198 114 57 57 57 203 381 381 48 229 491 247 15 193 193 193 17 +17 17 17 363 51 51 228 491 412 83 145 253 253 253 253 368 342 168 168 145 145 486 460 460 173 280 29 242 242 242 359 359 359 81 324 324 324 3 58 72 268 268 268 268 268 268 274 186 39 54 86 105 336 445 485 485 213 485 215 129 354 29 334 304 304 185 131 397 397 345 347 347 347 347 43 43 364 276 174 174 426 426 206 167 457 76 36 377 87 87 87 236 259 108 119 119 351 351 443 139 139 139 293 175 175 81 89 340 340 116 33 335 14 14 491 411 411 284 284 284 405 405 405 206 206 206 37 24 131 133 4 4 280 153 153 343 343 343 343 358 358 39 342 342 224 50 50 50 50 50 50 185 269 433 160 112 427 82 247 312 126 292 292 292 326 326 326 326 326 101 408 149 149 491 412 412 55 55 55 322 67 131 472 221 458 445 445 213 213 213 213 252 215 458 176 176 135 135 135 200 200 44 44 44 44 99 338 338 338 338 395 273 106 306 306 306 396 396 215 35 35 335 14 14 411 284 265 265 265 265 85 85 146 464 464 125 125 125 125 466 466 22 283 455 399 217 217 217 473 290 290 290 290 290 434 434 434 339 339 33 90 42 42 147 147 380 380 288 496 496 496 496 274 274 274 24 131 472 198 198 127 45 45 385 90 221 458 208 208 190 499 499 499 405 405 206 150 150 54 86 238 6 6 472 472 198 22 283 455 38 72 72 437 437 481 481 481 481 175 175 81 84 84 84 84 274 274 98 229 247 247 126 126 326 326 326 326 326 101 149 149 228 491 83 83 55 55 322 67 67 131 133 133 364 276 276 346 346 486 315 315 315 315 450 450 450 413 413 348 64 212 131 230 230 230 230 230 35 35 401 198 198 22 283 455 38 162 232 232 232 68 68 6 371 371 213 213 213 252 215 129 259 29 29 42 42 42 147 380 288 443 443 443 240 314 131 183 183 183 183 183 278 278 278 139 139 139 497 497 497 497 122 259 259 354 420 420 324 464 180 180 426 426 426 426 426 282 388 303 303 64 212 465 227 419 439 78 491 305 421 491 491 491 421 491 421 491 491 491 128 128 128 491 128 193 193 193 17 +17 17 17 363 363 363 363 51 149 228 491 491 411 145 475 475 475 475 94 475 475 475 324 301 8 354 106 493 151 240 325 41 41 324 324 3 183 183 489 489 489 489 489 43 43 276 109 109 443 330 330 348 64 76 465 449 483 145 113 113 113 113 113 240 285 285 34 223 223 130 280 277 277 277 277 277 385 36 36 227 419 225 225 226 226 226 491 209 157 157 157 157 157 372 335 14 14 411 188 340 340 116 33 64 394 465 108 377 123 123 123 88 88 277 277 277 277 385 24 131 427 229 247 126 126 126 326 326 326 101 408 149 491 228 373 110 110 110 254 254 240 314 35 108 377 87 87 87 129 259 74 311 311 311 311 311 311 311 311 169 150 342 342 342 168 106 410 410 410 410 410 29 29 382 313 216 216 114 92 92 92 92 92 385 131 472 183 183 183 351 278 278 139 139 139 497 497 497 497 42 42 8 147 380 380 499 84 496 496 496 496 274 274 274 37 24 131 419 419 225 225 225 225 82 83 55 55 55 322 67 394 478 478 232 232 172 172 115 273 84 84 84 84 16 16 16 274 274 274 98 13 229 247 312 126 126 23 23 23 101 101 101 149 149 228 491 289 289 7 147 147 380 499 319 319 319 348 466 466 466 212 22 448 448 448 14 14 145 319 319 319 319 348 195 195 195 394 478 478 232 68 68 68 267 267 267 267 267 434 339 339 33 90 90 32 465 144 27 180 284 405 426 426 413 348 64 76 26 26 26 359 81 81 277 277 385 325 34 69 223 130 130 402 196 196 217 473 473 258 258 31 342 224 494 494 494 494 368 9 142 142 42 42 147 380 329 329 329 329 252 143 36 107 107 395 302 302 302 497 497 185 269 9 9 483 14 411 411 297 297 297 297 297 297 293 293 497 186 162 68 68 172 115 267 267 267 267 360 360 176 176 176 135 328 328 200 199 106 106 265 265 265 265 85 85 85 85 207 207 19 454 13 417 417 417 237 237 170 28 28 28 28 28 362 491 491 362 362 362 362 491 491 362 211 491 491 369 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 391 391 73 491 289 373 338 338 400 400 400 301 378 378 141 141 141 281 162 68 68 115 470 278 278 278 449 176 176 135 135 200 248 248 127 114 264 264 264 468 245 245 43 364 276 174 174 174 174 348 94 199 145 145 460 460 460 402 402 6 272 300 469 313 313 10 479 398 398 374 374 132 413 339 199 199 340 116 116 199 335 14 411 411 498 498 498 498 134 175 359 81 166 324 324 422 236 36 310 107 395 395 485 374 374 374 374 132 132 413 303 303 303 117 404 439 439 78 237 237 237 47 47 491 47 2 491 2 2 2 2 316 316 491 316 316 491 491 73 435 289 7 127 5 5 5 38 162 68 68 68 115 273 319 319 319 319 348 348 195 250 133 141 141 141 281 342 86 221 458 144 27 351 319 319 319 53 53 176 135 135 200 200 200 464 340 340 340 94 199 415 415 415 35 198 22 283 455 455 364 345 109 278 278 330 116 33 64 212 212 371 84 84 84 84 274 274 274 274 43 43 401 364 276 276 153 153 153 387 387 372 372 396 396 203 53 473 89 446 446 67 131 472 221 401 354 190 380 380 499 499 428 428 146 146 358 358 233 233 227 419 419 427 56 491 421 15 15 15 193 193 193 17 +17 17 17 363 363 363 363 51 51 51 228 491 320 127 448 448 448 14 14 411 153 153 387 372 372 396 313 35 310 107 395 382 382 313 313 285 34 125 125 125 125 348 466 22 283 283 38 162 232 232 232 26 26 26 431 431 84 496 496 274 274 457 457 401 401 354 354 255 255 251 251 251 241 431 84 84 84 16 16 274 274 216 216 283 283 455 58 72 72 72 268 268 268 268 268 268 450 450 274 271 271 39 39 86 142 397 336 345 141 141 281 281 342 168 340 340 116 199 44 44 44 129 259 190 190 380 380 499 499 428 85 146 146 285 34 302 302 497 497 349 349 234 234 234 234 234 261 425 425 386 431 151 151 151 169 169 169 99 436 338 338 447 395 69 462 462 402 402 221 401 259 491 74 351 351 360 360 360 200 200 248 76 76 465 445 485 324 324 324 301 378 364 364 346 346 346 428 428 146 146 143 36 472 221 401 401 259 354 425 425 241 431 374 374 374 374 132 132 132 203 381 381 404 13 491 247 312 126 126 326 326 326 326 101 101 101 149 228 491 491 373 72 72 437 284 319 319 319 203 53 53 53 53 469 212 212 131 34 410 410 410 410 410 173 280 29 29 382 245 245 8 259 354 62 62 62 62 146 464 464 44 44 399 217 217 217 473 286 286 286 468 468 406 337 337 337 324 464 464 277 277 325 34 462 462 462 402 402 221 401 401 354 213 213 213 213 213 246 246 246 246 318 318 185 185 433 433 433 160 160 112 112 78 56 491 491 28 28 491 491 341 341 341 341 12 12 12 12 12 260 260 260 260 391 391 391 73 289 491 289 108 119 437 437 284 284 426 426 203 53 473 459 271 31 39 342 342 26 26 251 251 241 81 329 120 120 330 388 195 195 195 64 212 131 419 439 439 439 439 225 225 225 237 47 491 47 80 80 491 80 197 225 287 287 44 44 44 399 217 217 473 398 213 213 213 143 143 458 144 26 26 251 241 431 278 278 285 449 302 302 497 497 399 399 217 217 473 136 136 136 136 136 136 136 282 282 388 195 404 58 489 489 489 489 489 399 53 335 14 145 145 145 486 460 460 173 280 29 242 242 116 250 359 359 81 324 324 324 422 129 259 74 485 213 213 213 213 252 215 129 259 354 100 100 100 497 497 122 143 458 144 27 437 481 481 481 481 481 293 293 122 122 472 133 42 147 147 380 329 329 171 252 143 36 107 395 302 302 302 497 497 497 251 251 251 241 81 431 278 278 330 388 379 195 195 471 471 77 269 342 142 72 72 72 437 151 151 151 368 453 342 142 221 336 354 275 275 275 275 303 303 195 243 131 419 427 491 247 126 126 126 292 326 326 326 326 326 326 326 326 326 101 101 149 149 228 320 345 141 141 281 162 232 232 172 172 115 273 84 496 88 88 88 176 176 135 135 200 248 183 183 257 257 257 257 453 342 26 26 251 241 241 431 171 171 171 252 457 457 401 259 108 119 119 351 308 308 308 313 313 94 199 469 469 215 35 96 66 68 68 68 115 115 444 444 213 246 252 252 325 34 125 125 125 125 466 466 22 283 455 58 72 72 351 278 278 139 139 293 497 497 349 349 234 234 261 25 485 485 485 464 139 139 375 497 497 122 122 36 472 221 336 354 420 420 324 464 464 180 106 426 426 426 426 413 348 64 212 212 198 22 283 455 8 354 354 106 284 306 306 306 306 306 396 396 396 37 303 303 48 404 78 229 491 491 15 15 193 193 193 17 +17 17 17 363 363 363 51 51 51 228 491 7 217 473 258 258 31 342 342 494 494 494 281 9 142 397 147 329 329 329 329 143 310 107 302 302 302 497 122 10 10 309 398 398 398 398 398 374 132 216 216 127 45 45 45 325 183 451 30 30 30 3 14 14 411 284 284 405 405 405 206 206 167 24 227 227 472 221 401 491 354 420 420 422 143 458 144 27 351 351 151 253 368 368 99 338 338 338 400 400 400 400 30 3 58 58 110 254 254 254 254 58 58 72 72 110 498 498 498 498 396 313 325 183 183 57 57 57 203 53 394 90 76 108 108 119 351 139 139 139 139 293 293 215 35 74 74 329 329 213 329 252 325 300 382 382 245 399 217 70 65 65 153 329 372 406 406 467 313 186 39 342 342 224 242 242 116 466 466 22 283 448 448 14 411 213 213 213 213 173 173 402 196 196 176 328 328 248 248 8 354 255 255 38 349 205 234 261 148 148 148 148 148 148 372 372 372 59 452 335 197 226 226 209 188 188 340 340 340 340 33 195 117 117 117 197 197 197 80 491 80 491 491 7 7 7 364 345 109 329 139 329 81 219 219 485 464 464 203 203 33 394 212 465 107 395 329 329 329 171 171 171 301 301 8 129 354 425 175 175 431 329 329 264 468 468 304 313 186 162 323 482 482 482 238 6 272 106 153 153 153 182 372 372 372 372 59 245 335 14 209 411 410 410 410 410 410 410 173 29 29 495 406 467 415 415 131 90 259 144 27 437 437 306 306 306 306 396 203 53 469 469 469 325 325 41 41 41 19 19 454 229 247 126 126 126 326 326 326 326 326 326 101 149 149 228 289 491 127 45 45 45 45 240 183 183 183 451 30 30 30 301 399 217 473 432 432 432 330 348 64 457 401 82 108 377 87 87 38 162 323 323 115 273 84 84 496 274 274 58 58 183 257 257 257 31 9 238 6 119 161 308 308 308 396 313 94 199 199 459 215 215 96 66 342 172 224 41 41 324 3 301 314 198 22 283 455 116 199 331 443 443 178 178 458 96 86 238 6 272 145 145 460 460 460 402 402 6 272 300 469 313 10 94 398 398 374 374 374 132 413 303 303 48 404 13 170 491 491 491 312 15 15 292 292 292 193 193 193 193 17 +17 17 17 17 363 363 363 363 363 363 363 408 51 51 228 491 289 320 74 329 329 329 329 329 325 34 334 382 382 467 110 254 254 254 285 34 145 145 145 376 460 460 169 150 342 86 105 96 96 272 57 57 57 203 53 255 255 255 130 402 221 259 208 441 441 153 153 372 372 372 59 271 271 269 54 54 9 97 336 155 155 332 332 332 245 399 473 65 329 329 329 460 169 164 164 485 485 485 374 132 143 259 144 27 437 329 329 329 169 164 164 142 221 336 29 495 334 59 59 313 24 131 58 72 110 254 254 254 254 35 35 196 309 309 479 331 463 463 463 463 29 382 382 245 8 129 354 137 137 137 137 33 10 10 309 331 331 84 84 350 350 413 413 33 394 465 377 377 87 123 132 8 354 354 106 284 481 481 481 175 175 81 242 116 33 394 465 465 108 119 485 485 286 286 468 406 467 467 121 53 394 155 155 25 469 469 203 217 473 418 418 418 418 418 99 436 436 60 60 298 199 255 255 8 180 113 113 113 113 240 285 131 335 14 401 209 411 475 475 475 475 475 475 475 475 422 164 164 164 214 214 214 214 328 328 200 200 248 335 188 188 340 340 94 199 199 257 257 257 257 342 9 142 437 424 424 424 424 424 497 497 122 251 241 431 431 265 265 428 428 85 146 146 358 358 352 352 352 352 352 352 352 112 427 56 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 149 228 289 209 83 55 55 322 67 212 90 219 357 357 357 357 357 357 120 120 240 385 385 35 227 227 227 419 419 439 225 197 47 47 491 491 47 491 47 47 80 491 491 491 289 7 373 451 451 451 286 286 286 286 286 468 468 245 43 43 345 141 141 281 281 9 142 196 217 473 65 486 486 460 460 169 164 164 164 485 485 485 374 132 143 259 144 144 27 437 329 329 329 329 150 164 164 105 221 336 354 29 498 498 59 59 313 385 227 419 427 229 247 408 149 149 228 226 491 209 83 415 415 415 240 314 335 58 72 72 72 72 72 110 110 486 486 460 460 460 169 352 352 402 221 401 259 74 311 311 311 311 311 311 311 169 150 86 86 238 6 272 472 472 234 164 164 487 487 487 288 288 213 213 246 246 3 335 440 125 125 125 125 466 466 448 448 448 448 464 145 145 460 460 460 349 402 96 272 469 469 469 236 94 398 374 374 374 132 132 339 94 199 69 223 130 280 44 44 44 44 32 401 401 354 354 278 278 278 368 342 342 41 41 324 324 301 239 239 384 93 93 93 93 93 207 207 207 246 19 454 229 247 247 126 126 326 326 326 326 101 101 149 228 491 80 80 491 491 74 425 425 386 386 431 486 486 460 460 169 150 342 342 342 224 494 494 416 26 359 359 166 166 166 324 301 236 401 259 161 161 79 499 499 499 265 85 85 146 146 173 173 176 176 135 135 200 248 14 14 411 410 410 410 410 410 410 173 29 29 382 313 216 283 283 455 58 72 72 72 437 481 481 481 481 481 293 175 175 81 84 84 16 88 88 89 89 446 116 64 212 384 180 230 230 230 215 35 35 96 198 198 22 283 455 455 58 183 278 278 278 278 139 139 139 375 375 375 375 98 13 229 491 170 491 15 15 15 193 193 17 +17 17 363 51 228 412 412 83 194 194 446 67 67 131 183 257 257 257 257 453 342 221 221 336 354 354 443 443 443 169 150 342 86 86 6 6 272 472 66 482 482 115 485 374 374 132 252 36 449 462 462 402 402 221 336 144 208 425 386 386 431 496 496 496 496 496 274 274 37 233 185 185 269 323 18 427 427 247 247 126 126 292 23 23 408 408 391 391 228 228 289 491 320 407 407 407 407 310 107 397 397 141 141 141 281 281 9 142 221 221 336 491 74 74 425 425 386 386 431 290 290 290 290 434 434 339 339 195 33 394 76 465 74 190 190 190 487 487 374 374 374 132 132 358 352 352 352 402 198 198 45 45 45 45 131 183 451 30 30 30 301 378 345 141 141 281 453 9 221 336 144 180 84 496 88 88 176 176 135 328 200 335 14 14 145 145 113 113 113 113 206 285 449 34 69 223 130 280 180 145 145 486 460 460 173 280 280 242 242 116 33 250 251 241 81 256 444 213 246 246 246 19 19 454 454 78 170 170 491 28 491 491 312 312 187 292 292 12 12 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 149 491 491 289 491 209 83 55 322 67 325 30 30 30 30 3 58 58 72 110 110 254 254 254 254 314 35 198 127 283 455 455 236 129 401 401 401 354 354 431 151 151 240 416 416 192 41 41 41 324 3 464 89 89 446 348 466 22 283 455 38 162 232 482 172 115 106 106 153 372 372 372 406 467 302 302 497 497 399 399 217 473 473 264 264 264 264 264 468 468 59 59 59 245 43 364 345 407 407 407 310 107 447 221 336 354 420 420 236 129 36 108 119 119 351 496 496 496 274 143 458 192 242 242 116 116 466 212 45 45 45 325 183 30 30 301 378 141 141 141 281 342 9 221 336 144 180 84 88 88 88 176 135 135 200 200 464 44 44 143 458 27 27 121 121 33 478 478 232 68 172 115 273 278 278 278 285 495 495 495 134 134 134 134 8 100 100 100 497 122 401 401 401 371 278 278 278 31 39 86 86 6 272 11 11 11 11 379 379 471 471 270 433 433 433 18 112 56 56 491 312 312 312 187 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 408 408 408 408 149 228 228 289 491 7 309 479 331 315 315 315 315 450 450 16 293 293 335 197 197 197 197 197 197 197 197 491 491 7 7 364 364 364 364 276 181 181 181 181 181 264 264 264 264 468 468 468 245 245 43 364 364 430 430 430 430 430 342 342 221 196 217 217 217 217 473 486 486 486 486 460 169 169 164 164 164 485 219 485 485 132 143 143 129 82 144 27 27 437 329 329 151 169 164 164 164 164 221 401 259 29 29 382 313 313 35 131 472 221 401 401 401 401 491 144 180 180 84 84 350 88 88 88 176 176 176 176 328 328 200 200 200 117 454 404 483 226 226 226 226 491 83 55 55 55 322 67 67 212 131 133 364 364 276 181 346 346 181 265 85 85 146 378 378 345 430 430 430 430 342 342 451 30 30 324 422 143 401 401 144 27 180 84 84 496 88 88 88 176 176 135 135 200 248 248 248 216 127 114 114 264 264 264 264 264 59 59 452 452 263 263 417 417 237 491 237 237 421 421 421 491 491 491 128 128 128 491 128 128 193 193 193 17 +17 17 17 296 296 317 317 491 491 317 305 305 461 491 461 491 491 461 491 491 435 435 435 435 435 435 7 373 72 72 430 430 430 430 430 430 430 34 177 177 177 236 35 401 259 354 137 137 137 137 137 94 199 335 14 14 411 411 475 475 475 475 475 475 475 475 324 324 464 464 493 493 493 493 493 216 300 300 382 245 399 217 217 473 136 136 136 136 136 136 282 94 199 340 340 340 94 199 145 145 486 486 460 460 173 280 29 242 242 116 379 33 250 251 241 81 444 444 213 246 246 246 19 19 454 229 247 247 126 126 292 326 326 326 326 326 326 326 326 326 101 101 149 149 228 289 7 217 473 258 258 258 258 342 342 342 494 494 494 368 453 9 142 397 147 380 329 329 329 329 329 329 36 310 107 395 302 302 302 375 497 98 98 98 225 225 225 225 80 80 259 384 371 180 443 443 169 169 352 352 402 6 6 26 359 166 166 166 301 129 259 259 74 189 189 189 285 449 449 176 176 135 328 200 200 248 248 32 32 127 114 114 258 258 258 31 39 86 68 68 68 483 483 440 89 194 446 446 33 212 212 198 127 114 92 92 92 92 167 167 457 457 36 108 377 123 123 416 458 445 180 180 443 493 493 216 300 300 334 59 59 452 263 229 247 247 126 126 326 326 326 326 101 101 149 149 228 228 491 7 70 70 65 65 428 428 428 146 438 325 449 34 202 202 202 202 402 221 259 144 445 278 278 173 173 280 29 242 242 116 94 199 44 44 44 129 129 259 74 190 190 104 104 104 325 325 41 324 324 301 416 239 144 144 484 484 484 236 314 131 221 401 259 445 445 180 443 443 443 443 120 120 271 271 39 342 342 224 253 253 253 253 31 86 238 6 272 123 123 123 8 354 106 496 496 496 274 368 342 142 221 336 208 208 441 151 151 151 169 150 99 238 6 6 310 107 60 298 298 298 275 303 303 471 471 471 269 433 18 112 427 491 491 312 312 312 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 408 408 391 163 491 316 491 316 316 316 316 491 316 316 316 73 289 289 320 159 159 159 159 35 35 196 196 217 473 473 329 329 329 329 329 329 169 169 164 164 164 485 485 485 485 374 132 422 186 162 232 482 172 115 344 344 344 344 344 274 274 274 42 42 364 147 147 380 288 264 264 264 468 468 468 313 134 359 359 166 166 166 301 301 43 364 276 109 109 189 330 330 33 64 76 131 472 393 155 155 165 165 165 165 53 58 58 72 72 72 72 437 350 350 350 350 350 350 350 182 413 413 381 381 404 404 225 225 225 225 225 80 80 491 491 320 127 45 45 45 45 325 177 177 177 177 457 217 217 217 70 65 65 319 169 150 150 86 86 6 272 472 472 336 354 420 420 420 422 162 232 232 68 68 115 273 231 231 231 53 53 76 465 198 214 214 214 328 200 200 248 76 129 401 491 74 190 190 190 488 488 488 151 151 169 150 342 342 68 224 176 176 176 328 328 200 200 464 89 89 446 67 212 34 106 319 319 319 348 33 33 219 219 219 219 485 374 374 374 374 374 368 368 107 161 134 134 100 100 100 497 43 43 345 407 407 407 36 310 447 397 397 141 141 141 281 86 86 238 6 119 119 295 295 295 295 295 252 143 192 192 135 135 328 200 200 183 183 57 57 57 57 57 203 381 48 48 13 13 78 491 128 491 193 17 +17 17 17 296 296 317 184 184 491 373 451 451 451 30 301 378 364 345 141 141 141 281 342 342 198 22 283 455 38 338 338 338 395 395 106 480 480 480 85 85 146 146 464 459 459 459 31 31 86 238 6 472 196 196 473 136 136 136 136 136 282 388 199 199 255 255 251 251 241 241 431 265 265 265 85 85 85 146 299 173 352 89 89 322 67 199 58 72 72 72 110 171 171 171 171 252 143 36 449 191 191 236 314 36 108 377 87 58 72 110 110 202 202 202 460 169 352 402 402 6 272 87 87 87 416 144 180 84 496 88 88 88 255 255 399 70 70 65 319 319 319 348 200 248 478 66 482 482 238 6 161 79 288 290 290 290 290 434 339 339 212 310 395 334 334 304 304 304 49 269 168 168 157 157 313 313 36 377 377 123 123 88 88 14 411 475 475 475 475 475 475 475 324 301 129 259 74 425 425 386 386 343 343 343 343 358 318 39 342 9 142 397 345 109 109 498 245 313 183 451 451 30 30 30 301 399 217 70 65 65 428 428 428 146 146 325 131 72 72 110 110 486 486 460 460 402 402 96 272 87 87 87 236 259 108 119 119 351 405 405 405 405 405 405 206 206 169 233 458 192 419 427 491 491 247 312 126 292 292 292 292 292 292 21 21 21 21 21 21 21 408 408 408 149 149 228 82 320 7 217 473 65 486 486 486 460 329 169 164 164 164 164 485 485 485 485 374 374 132 132 132 236 32 401 259 161 161 79 79 380 288 443 151 169 150 150 86 86 86 238 6 272 180 230 230 230 230 215 215 35 29 345 333 333 220 220 44 44 44 43 364 276 346 346 346 428 428 146 146 385 131 472 221 458 144 27 437 437 481 481 481 481 481 175 175 81 300 300 382 406 467 467 89 89 446 116 394 212 161 161 79 499 499 499 428 85 85 146 173 173 280 176 135 135 200 464 340 340 199 44 44 44 8 32 259 354 431 151 151 151 416 416 192 41 41 41 41 41 19 454 229 247 247 126 126 326 326 326 101 101 149 149 228 289 320 320 345 141 141 281 31 342 232 232 68 68 172 115 231 231 231 231 231 53 394 76 164 164 214 214 214 214 200 200 248 212 127 45 45 45 45 236 401 401 259 384 371 278 278 278 314 196 242 242 33 64 212 131 472 72 72 72 110 486 486 460 460 460 215 35 29 29 242 242 94 199 199 106 426 426 426 169 349 352 352 352 242 275 275 303 303 303 48 48 417 417 417 237 237 491 28 28 491 305 305 491 491 362 305 491 491 491 491 362 366 491 366 366 316 491 491 435 316 435 491 491 73 289 7 7 217 473 258 258 258 342 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 329 252 36 310 107 395 302 302 302 302 497 98 98 13 229 82 247 312 126 126 326 326 101 101 101 149 391 228 491 289 491 74 437 437 284 405 426 426 206 348 64 64 212 300 382 495 406 467 253 253 253 99 99 338 338 400 400 400 400 30 301 399 217 70 65 65 265 428 428 85 146 146 358 385 36 227 427 427 229 247 126 126 126 326 408 408 391 228 228 289 491 144 27 389 389 389 314 196 196 217 473 476 476 476 476 476 143 458 96 196 32 196 309 309 309 309 479 331 231 231 231 231 231 349 164 214 214 214 214 328 200 200 335 14 411 287 284 223 223 223 223 130 280 277 277 277 277 277 385 24 227 419 439 439 439 439 225 128 193 193 17 +17 17 17 296 296 184 184 184 412 83 194 194 194 55 322 67 131 183 156 156 156 156 335 14 145 145 460 460 460 460 349 402 96 272 272 469 469 313 94 398 398 374 374 374 132 339 339 33 471 77 342 168 121 121 121 33 33 394 310 395 395 153 153 387 387 146 146 203 217 291 291 291 291 291 64 243 36 227 472 397 397 345 141 141 281 31 162 232 232 105 105 336 354 153 153 387 387 387 387 139 139 302 302 375 375 122 122 131 227 419 439 417 417 170 491 28 28 28 28 28 491 491 362 362 491 362 491 305 362 362 491 362 491 362 435 491 211 369 491 369 369 369 369 369 21 21 21 21 21 21 21 260 260 260 260 260 260 391 391 391 491 73 491 491 412 287 111 111 111 111 139 139 293 293 122 239 36 384 395 470 459 271 271 150 342 86 238 6 6 491 478 66 68 232 238 6 272 470 470 443 443 215 215 35 354 29 410 410 410 410 410 410 280 29 29 313 236 36 377 123 123 129 259 208 79 79 288 360 360 360 434 434 200 248 248 212 445 180 171 171 171 171 171 252 215 8 354 100 302 497 497 49 342 168 180 145 486 460 460 460 169 402 402 6 272 300 382 313 236 36 108 108 119 351 213 213 213 213 246 246 246 3 464 89 446 116 394 76 90 393 234 261 25 25 480 480 480 480 299 299 339 64 212 34 180 113 113 113 113 167 167 35 401 393 155 155 165 165 165 165 53 217 217 65 329 329 495 406 467 467 134 139 175 175 423 423 423 423 43 43 364 345 109 109 264 468 468 396 58 183 451 30 30 30 368 342 342 221 336 144 180 106 426 426 426 206 388 94 199 89 446 446 212 131 133 133 276 276 346 346 346 265 265 85 85 85 207 207 19 454 417 417 417 417 417 47 491 47 47 491 435 435 80 491 491 80 80 289 320 127 5 5 455 43 43 364 276 109 498 498 498 396 313 216 216 41 324 324 301 43 364 276 174 174 174 203 53 473 242 116 195 33 90 393 349 234 261 25 106 480 480 480 146 146 299 339 250 359 359 166 166 166 143 458 144 27 121 121 121 76 458 458 208 386 386 444 374 374 374 252 325 34 191 191 191 24 131 404 427 229 247 247 126 126 292 292 292 292 292 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 101 408 408 408 408 391 491 491 373 451 451 30 30 422 325 371 71 71 71 71 71 453 242 242 348 64 394 76 401 310 107 395 395 395 432 432 330 94 199 495 495 495 134 134 134 359 81 166 166 324 422 416 458 144 180 84 496 496 274 285 449 123 123 236 236 36 108 119 351 351 315 315 315 315 450 450 413 413 413 466 198 114 258 258 258 31 86 86 6 272 119 103 103 103 103 85 299 203 53 29 462 462 462 280 280 219 219 286 286 286 286 334 59 59 452 452 263 225 225 83 55 55 55 322 67 131 183 183 451 451 30 30 434 339 10 10 10 309 479 331 463 463 463 463 29 29 382 382 245 245 349 280 280 278 278 278 368 368 342 168 168 277 277 277 37 385 233 270 270 433 390 160 112 112 439 439 78 56 128 128 193 193 17 +17 17 17 363 51 51 228 491 491 412 118 118 118 118 402 451 30 30 422 314 90 133 147 147 380 499 319 319 319 94 199 145 113 113 113 113 240 285 34 462 130 402 221 36 108 119 119 308 308 308 396 313 94 199 199 230 215 35 478 232 232 232 172 115 444 444 444 213 213 252 24 131 183 451 30 30 30 378 378 345 389 389 389 389 314 196 242 33 33 394 212 161 161 79 380 288 443 443 169 39 342 342 168 230 230 230 230 215 35 29 89 89 116 394 465 108 119 295 295 295 295 295 143 458 96 198 198 283 455 455 8 32 354 354 431 151 151 240 416 416 192 41 41 324 422 36 36 377 87 87 416 458 27 180 84 496 496 274 349 205 155 155 332 332 245 399 70 70 138 138 138 138 138 372 372 372 59 452 263 263 229 491 491 312 15 15 15 193 193 193 +17 17 17 296 296 317 317 317 184 184 184 184 491 219 357 357 357 240 385 35 35 478 68 115 273 231 231 231 53 76 465 214 214 214 214 200 248 248 217 217 217 70 65 65 319 151 169 150 342 86 6 272 34 494 202 402 58 72 110 110 486 486 460 460 215 35 29 242 242 116 379 471 478 478 68 68 115 273 278 278 379 379 77 342 342 26 26 241 431 431 376 376 376 376 169 169 150 342 86 238 196 309 331 331 428 428 428 428 146 252 143 36 377 87 87 38 162 86 482 238 272 180 499 306 306 396 396 285 183 183 183 57 57 57 57 399 70 65 106 426 426 426 426 426 426 206 169 352 352 352 352 352 352 352 112 439 417 237 170 47 491 47 47 491 491 2 47 316 316 316 73 73 73 491 287 111 319 203 203 90 76 465 144 208 208 386 386 360 360 360 360 339 339 394 76 465 74 437 437 151 151 368 368 342 168 302 302 302 375 375 122 122 239 127 114 92 92 92 169 35 77 9 142 397 345 181 181 181 167 385 35 131 419 439 225 225 305 491 412 412 83 55 55 322 67 199 111 111 111 111 438 378 43 364 276 109 109 496 496 274 274 274 457 196 309 479 331 84 84 88 88 44 44 44 44 217 217 217 217 217 217 473 278 278 116 199 199 278 240 143 77 342 86 142 221 336 336 74 213 213 213 252 39 342 224 462 462 462 402 196 196 70 65 480 480 480 85 299 299 339 212 131 157 157 157 245 129 129 259 27 27 437 370 370 370 370 348 64 76 310 107 395 60 298 379 379 471 471 77 269 433 112 427 247 247 126 126 326 23 23 101 101 149 149 228 289 412 287 55 446 322 67 76 465 449 351 139 139 139 251 175 111 111 111 111 438 438 10 10 10 309 479 331 84 84 16 16 274 43 43 364 181 181 181 181 325 34 356 281 281 342 86 221 336 108 119 295 295 295 295 143 458 192 242 242 116 33 250 217 217 473 486 486 486 460 460 169 164 164 485 485 485 374 132 143 129 259 144 27 27 437 151 151 164 164 402 401 401 354 29 382 382 313 24 335 14 14 209 287 113 113 113 113 113 285 34 255 223 130 280 280 145 486 486 460 173 173 280 242 242 379 250 359 359 81 474 324 324 252 143 36 377 87 87 236 93 93 93 93 207 207 207 454 454 417 417 417 417 237 170 491 28 28 28 491 491 362 362 305 362 491 362 491 362 491 362 369 369 369 369 369 369 369 369 369 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 391 391 391 391 491 289 289 412 287 255 255 143 458 458 208 441 153 153 387 396 313 325 176 176 328 200 248 250 359 474 474 474 324 19 19 454 454 417 417 417 417 417 237 237 47 491 491 491 435 435 80 289 435 209 209 287 145 486 460 460 460 169 402 35 36 272 382 382 313 143 36 108 119 351 213 213 213 213 246 246 246 246 3 301 196 217 473 258 258 258 31 342 224 494 494 494 31 9 142 397 147 329 329 329 329 143 36 449 395 302 302 497 38 162 68 68 115 273 470 443 240 325 449 180 113 113 113 113 113 450 233 233 227 419 419 439 417 417 417 237 237 237 237 47 491 47 2 491 47 316 316 316 316 491 491 435 373 373 338 400 400 400 400 30 3 58 110 254 254 254 314 196 479 479 307 307 61 61 167 35 393 205 261 25 106 306 306 396 396 313 36 449 87 87 87 416 144 180 180 84 84 84 16 16 16 274 98 98 13 417 417 225 225 193 17 +17 17 17 296 296 51 184 320 320 127 5 455 236 129 259 354 278 278 278 278 278 252 416 416 416 192 472 225 397 225 225 80 80 197 147 147 147 380 499 486 486 486 365 460 203 53 53 53 212 354 302 175 81 176 176 135 328 200 200 248 335 14 14 411 411 153 153 372 372 396 313 143 310 107 395 382 382 313 325 34 121 121 53 53 394 212 212 180 180 486 486 315 450 450 88 372 372 396 313 24 34 58 72 72 72 72 268 268 268 268 268 268 450 450 274 274 271 186 39 323 9 142 397 336 345 109 109 109 264 313 216 216 22 5 455 236 458 27 27 351 151 151 169 169 164 164 472 221 336 354 29 498 498 313 313 143 77 270 342 342 26 26 251 241 431 431 278 278 120 120 173 173 352 352 272 419 229 247 247 126 126 292 292 326 326 326 326 101 101 101 149 149 228 289 320 345 141 141 141 281 453 168 44 44 38 38 232 232 232 105 105 445 445 470 365 365 365 365 460 330 388 64 131 472 472 221 458 208 208 441 441 441 153 153 153 387 387 285 285 300 382 382 467 69 69 130 130 280 44 44 44 399 70 65 65 265 265 265 85 85 85 85 139 293 175 175 175 230 230 230 215 402 198 198 22 283 455 42 42 147 380 380 496 496 496 496 274 24 131 393 205 155 165 165 165 165 53 250 251 251 241 431 329 278 330 388 379 33 471 49 9 142 58 72 437 481 481 481 481 481 293 175 175 81 84 84 84 496 274 98 13 13 417 170 170 491 170 491 28 491 28 491 28 362 362 362 362 362 362 362 491 491 491 40 305 491 305 305 305 316 435 491 435 435 435 491 491 435 435 7 465 108 377 87 87 8 420 420 420 422 186 338 338 395 395 487 498 498 498 498 59 59 59 263 229 229 247 126 126 126 326 326 326 326 326 326 101 101 101 149 149 228 289 320 127 5 5 455 251 251 251 241 235 235 235 235 235 235 235 348 200 248 248 248 251 251 241 431 290 290 290 290 290 434 434 434 339 195 33 250 217 473 476 476 476 476 252 325 325 191 191 191 325 34 44 44 416 129 259 144 484 484 484 236 314 401 401 259 371 485 485 139 139 302 497 497 349 234 234 261 25 498 498 498 498 498 493 216 216 300 300 334 334 59 452 452 263 263 417 417 237 237 237 237 47 47 47 491 47 491 491 73 491 73 289 7 217 473 65 486 486 329 460 169 169 164 164 219 485 485 374 422 143 458 144 27 351 329 329 329 169 169 164 164 472 221 336 354 495 498 498 313 385 35 77 342 86 142 393 393 261 25 91 91 91 91 91 206 493 216 216 300 334 334 59 59 452 263 229 247 247 126 126 326 326 326 326 408 408 149 149 491 412 83 83 253 253 253 253 253 99 338 338 338 338 338 338 395 180 499 499 265 265 265 265 85 85 85 146 146 464 89 89 446 446 394 478 66 68 68 115 273 265 265 265 85 146 146 146 175 175 81 11 11 11 64 76 465 34 253 253 253 253 342 168 257 257 257 257 31 162 68 68 68 115 273 273 319 319 319 388 94 199 145 145 145 460 460 460 460 402 402 96 272 300 382 382 58 58 57 57 57 57 57 57 203 381 117 404 229 247 15 193 193 17 +17 17 17 363 51 51 491 412 412 254 254 254 254 131 221 458 144 180 106 405 405 206 240 285 34 253 253 31 31 86 142 142 393 234 261 25 106 106 481 481 306 306 306 306 372 406 467 467 255 255 255 43 43 345 109 109 403 403 403 207 464 253 253 253 342 342 30 30 30 422 129 74 437 437 437 405 405 206 169 150 342 342 224 494 494 236 129 259 26 359 359 166 166 166 422 129 259 144 27 389 389 389 120 37 24 24 131 472 393 155 165 165 165 165 53 473 58 183 257 257 257 31 342 86 142 393 261 25 470 443 139 175 81 84 84 84 274 399 217 217 473 136 136 136 136 282 388 303 195 404 133 364 345 333 333 220 216 114 180 113 113 113 113 113 450 167 35 335 14 411 145 145 145 460 460 460 178 178 96 96 99 436 436 395 134 134 134 134 134 134 359 359 166 166 166 324 301 42 147 456 456 456 236 36 161 161 487 487 487 213 213 252 325 325 176 176 135 135 200 200 464 340 340 116 64 76 108 377 123 123 216 22 283 455 43 43 364 276 109 109 496 496 496 37 37 37 24 471 270 270 323 323 18 97 397 336 82 409 409 409 409 67 58 183 30 30 30 422 349 205 261 25 180 315 315 450 450 413 64 131 34 277 236 325 34 257 257 257 31 342 142 72 72 350 350 350 350 203 53 53 394 478 66 86 238 6 272 470 470 120 120 120 37 24 131 419 427 491 491 247 312 312 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 326 21 408 408 408 408 391 491 491 289 491 144 208 79 288 288 360 360 360 434 339 33 90 212 445 445 180 171 171 171 171 252 215 8 29 302 302 497 497 497 185 49 9 397 397 345 141 141 281 281 9 142 221 336 336 354 278 278 139 139 139 293 293 122 122 449 449 415 415 415 129 198 198 22 455 38 349 234 234 261 25 498 498 498 498 396 240 216 114 300 459 271 31 162 86 68 6 272 470 470 120 120 120 240 314 314 259 108 377 123 223 130 402 257 257 257 257 453 9 221 336 336 208 208 386 386 485 286 286 286 468 313 313 24 314 26 26 251 241 431 294 294 294 294 294 282 282 388 303 303 212 131 419 78 491 491 247 312 126 292 292 292 292 326 326 408 149 149 228 491 491 83 83 55 55 322 67 466 212 212 127 114 264 264 468 468 406 467 177 177 177 131 133 133 364 345 141 141 141 141 141 368 368 31 342 86 86 6 108 377 123 123 216 216 258 258 258 258 31 342 86 86 6 6 371 93 93 93 93 207 207 19 19 454 417 417 417 417 417 193 193 193 +17 17 17 296 296 184 184 320 320 320 354 264 264 264 468 468 468 313 359 359 166 166 166 301 378 280 280 278 278 278 368 453 342 168 494 134 8 8 100 100 100 100 497 497 349 155 155 165 165 165 165 466 466 22 283 455 217 217 473 290 290 290 290 290 434 434 339 33 250 42 147 147 380 288 496 496 496 496 274 274 24 325 34 255 255 255 175 241 235 235 235 235 235 235 235 413 200 248 250 345 407 407 407 407 407 310 107 447 447 483 226 226 209 287 297 297 297 297 297 293 293 122 216 22 448 448 448 464 464 493 493 493 493 216 300 300 382 382 313 335 14 226 226 209 411 145 145 486 460 460 173 280 29 242 116 359 466 81 166 324 324 3 58 72 72 268 268 268 268 268 268 450 274 368 368 9 168 300 50 50 50 49 9 142 397 336 347 347 347 313 186 162 54 172 344 344 344 344 344 186 186 162 482 482 482 115 273 344 496 496 186 99 436 436 395 134 134 134 8 359 359 166 166 166 422 162 68 68 115 470 278 278 143 310 107 395 485 469 134 88 158 158 158 158 158 24 325 191 191 191 37 24 419 439 78 170 170 28 491 28 28 491 491 28 491 362 305 362 362 362 40 40 40 40 201 491 366 491 491 305 366 366 491 316 316 316 491 316 73 73 289 7 217 473 258 258 258 342 342 224 494 494 494 31 9 142 397 147 329 329 329 329 329 36 107 107 395 302 302 497 497 251 251 241 81 81 278 278 330 388 379 195 64 212 131 419 439 225 225 225 225 80 491 75 371 371 278 278 314 196 309 479 307 307 307 61 61 167 131 90 221 458 144 27 437 437 437 437 437 481 481 481 481 481 481 293 293 293 497 497 335 197 197 197 197 197 197 7 251 251 251 251 251 241 241 278 278 173 173 280 176 176 176 135 328 200 200 200 340 340 340 340 394 478 342 224 273 344 344 344 449 449 44 44 44 129 259 74 425 425 386 343 343 343 343 343 358 358 358 39 39 433 160 97 97 197 226 226 80 491 491 491 7 7 251 251 251 251 241 431 278 278 278 173 173 176 176 176 176 328 328 200 200 200 200 335 335 209 209 415 415 415 415 415 131 106 106 106 297 297 297 297 182 375 375 375 98 98 13 13 229 170 170 312 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 408 408 408 408 408 391 391 491 491 412 177 177 177 177 177 356 356 142 238 238 6 310 395 395 151 169 150 342 342 86 238 6 491 478 66 66 68 232 68 238 6 272 470 470 403 403 403 171 171 171 246 246 176 176 328 328 200 200 248 248 216 114 92 92 92 92 35 77 77 9 397 221 276 181 181 181 181 181 240 385 35 227 419 419 439 225 225 225 225 225 225 225 225 225 225 373 373 373 338 338 400 400 400 400 422 422 162 68 68 68 273 470 120 120 120 120 37 37 24 34 253 253 253 99 338 338 400 400 400 30 422 162 232 232 232 238 6 6 371 470 189 151 215 215 35 96 96 272 272 255 255 251 251 241 431 235 235 235 235 235 235 248 248 212 22 283 455 236 239 239 384 371 213 213 213 252 215 129 259 402 133 42 42 42 147 380 499 151 151 240 240 449 449 191 191 191 37 314 314 90 90 401 401 491 208 208 79 380 380 486 486 376 460 460 169 150 342 342 342 224 41 324 324 301 251 251 251 241 431 431 290 290 290 290 434 434 434 339 339 117 404 229 247 247 126 326 193 193 17 +17 17 296 296 296 184 184 320 354 153 153 153 153 387 387 387 396 285 131 300 382 382 313 131 133 133 345 333 220 220 220 133 133 364 276 276 346 346 346 265 85 85 85 85 139 293 293 122 122 472 133 147 147 380 288 496 496 496 274 368 368 9 142 221 336 354 109 278 278 99 99 436 107 50 50 50 50 50 185 269 433 433 160 112 427 491 491 312 312 126 292 292 292 292 292 292 326 326 21 21 326 326 21 21 21 408 408 408 408 149 228 289 177 177 177 356 356 342 86 238 196 479 331 231 231 231 274 274 43 364 276 174 174 319 319 348 348 64 212 300 334 382 382 245 399 217 473 65 486 486 460 169 169 164 164 485 485 485 8 345 88 109 242 242 116 250 250 70 65 65 498 245 42 147 380 134 134 139 175 175 423 423 423 423 353 353 353 406 467 245 245 8 32 401 401 401 354 354 106 496 496 496 274 169 164 164 224 494 255 251 251 81 278 278 26 26 302 302 497 335 14 14 411 284 284 284 405 405 405 206 206 206 206 37 24 131 404 404 439 225 225 225 225 417 80 491 80 7 7 251 241 241 278 278 278 173 280 176 135 135 135 200 199 255 255 43 43 364 276 109 403 403 403 403 171 246 324 301 8 259 354 376 376 376 376 376 178 178 458 458 192 183 183 286 286 286 286 286 286 468 245 245 8 354 62 62 62 62 438 216 114 57 203 53 394 478 342 232 172 115 279 279 279 279 279 279 279 375 375 233 270 270 269 433 390 112 112 56 491 56 47 491 305 491 187 187 187 187 391 391 316 491 73 73 73 491 289 108 119 487 487 487 288 213 213 246 246 318 368 453 168 106 353 353 353 353 396 35 465 472 196 70 70 383 383 383 383 36 107 447 221 336 144 27 437 319 319 53 53 76 465 242 242 242 94 41 41 41 41 19 19 454 229 247 126 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 149 228 491 320 127 114 84 84 496 274 236 239 384 371 485 286 286 286 468 382 313 10 10 479 331 84 84 84 496 16 274 368 368 453 342 168 118 118 118 118 402 198 198 114 0 0 0 0 301 378 43 364 347 347 347 347 498 467 396 313 216 216 114 0 222 382 313 314 314 239 354 420 420 420 464 464 44 116 94 479 230 230 169 169 352 352 69 223 223 130 402 402 198 114 57 57 57 203 381 381 117 404 439 439 439 439 439 439 237 78 78 170 491 491 312 312 312 12 12 1 292 21 21 21 408 408 408 391 391 391 228 491 412 412 287 111 111 438 438 314 133 133 380 499 499 493 216 216 300 382 134 251 241 367 367 367 458 192 415 415 457 401 401 259 74 351 213 213 213 213 252 215 259 259 29 100 100 375 375 98 98 13 417 417 417 237 237 237 237 237 237 237 237 237 237 237 237 237 47 316 491 491 316 316 491 491 491 435 289 289 289 108 377 87 8 420 420 420 420 422 99 338 338 395 395 487 498 498 498 59 59 59 452 263 263 417 417 193 193 193 +17 17 296 296 296 184 184 184 320 435 0 0 0 0 422 162 68 115 444 444 444 360 434 339 394 90 76 144 445 121 121 116 33 76 465 108 432 432 432 432 379 64 76 449 191 191 191 325 34 34 196 309 479 479 331 230 230 230 169 169 352 352 221 401 259 159 159 159 236 259 127 361 361 361 94 199 111 111 111 438 438 162 342 224 494 494 494 129 74 84 84 496 496 496 496 274 274 368 368 9 9 198 114 0 222 222 468 313 313 219 219 219 485 485 374 374 186 186 323 86 238 6 377 123 123 88 277 277 277 277 385 131 227 419 439 78 229 170 491 312 312 292 292 292 292 292 292 326 326 326 326 326 326 23 23 101 101 408 391 391 491 491 412 287 44 8 8 354 354 106 284 91 206 206 240 325 41 324 324 143 144 389 389 389 389 200 248 192 445 213 324 219 219 219 219 485 374 374 368 162 54 86 6 272 123 123 88 109 109 475 475 94 475 475 475 422 349 164 214 214 214 214 214 328 200 200 117 404 454 225 225 225 225 225 225 451 451 213 357 357 357 173 280 29 242 116 33 465 377 123 8 354 420 420 420 360 135 135 200 200 248 58 58 72 72 110 110 486 486 365 365 365 328 200 200 195 195 248 248 212 239 34 253 253 253 253 453 342 342 198 22 448 448 448 464 145 284 306 306 468 406 467 288 469 469 99 436 447 221 196 473 275 275 379 394 478 342 68 115 470 470 120 120 120 37 24 117 263 417 417 417 417 237 237 237 491 491 28 28 491 28 491 491 305 362 491 491 362 362 362 491 362 362 491 40 211 211 491 218 491 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 391 391 228 228 491 320 320 333 333 333 220 314 35 401 259 127 114 258 258 258 258 258 31 39 342 433 160 97 221 336 196 473 258 258 258 258 342 224 494 494 494 31 9 142 397 397 147 329 329 329 329 329 143 36 310 395 302 302 302 497 497 162 232 232 232 238 6 6 371 470 189 443 151 215 35 35 96 401 272 34 180 113 113 113 113 113 285 449 223 223 130 198 198 22 283 455 251 251 251 241 431 290 290 290 290 290 434 434 434 339 339 117 117 404 225 225 225 225 225 80 226 491 209 188 340 340 340 33 33 64 212 377 123 123 216 22 283 455 8 354 180 376 376 376 376 460 178 178 35 458 192 219 485 180 306 306 306 306 306 306 396 24 285 69 462 462 402 402 401 259 208 79 288 288 213 213 360 434 434 339 248 394 239 445 180 171 171 171 171 252 215 8 354 100 100 375 375 375 185 185 269 433 433 18 18 112 439 439 237 237 237 237 47 47 491 491 2 2 316 316 491 316 316 491 73 289 289 7 7 4 104 104 104 104 104 104 468 468 337 337 337 324 301 416 32 32 208 79 79 79 288 288 360 360 360 246 246 246 434 434 339 94 199 89 194 194 194 446 446 64 212 212 465 196 196 309 398 398 213 213 246 246 252 143 36 108 119 351 89 446 446 446 394 76 401 74 190 492 492 38 162 342 68 115 273 265 265 265 428 85 146 146 358 358 39 342 142 397 345 141 141 141 281 453 342 198 198 114 92 92 92 240 314 131 219 219 180 180 106 306 306 306 306 306 59 59 37 131 419 427 229 247 247 15 193 193 193 17 +17 17 17 363 363 51 51 51 184 373 66 68 115 273 470 443 443 240 449 449 34 255 8 354 180 113 113 113 113 113 113 113 450 413 413 36 449 34 106 125 125 125 125 203 250 250 250 70 174 174 174 319 319 348 33 394 478 478 68 68 115 273 273 265 265 265 85 85 85 146 24 133 133 345 333 333 220 220 142 221 401 491 208 79 484 484 484 484 484 252 252 457 36 472 472 401 401 491 74 74 351 351 171 171 252 143 36 161 161 487 485 485 485 464 106 499 306 306 396 396 178 178 458 144 302 100 497 497 497 497 364 364 364 276 109 278 139 175 175 81 81 84 84 84 496 274 185 185 185 269 433 18 427 229 247 247 126 126 292 292 326 326 326 326 326 326 326 326 326 408 101 149 149 149 149 228 412 83 83 194 194 194 322 67 466 212 22 448 448 448 464 464 493 493 493 493 493 216 300 300 382 382 245 378 43 345 333 333 220 220 142 221 401 401 491 74 190 190 487 288 278 278 203 53 53 195 195 195 250 251 251 251 241 431 284 426 426 426 203 53 212 212 29 29 495 313 313 325 41 41 41 41 19 318 185 185 433 433 433 160 112 112 417 417 237 237 237 237 237 237 237 491 2 491 201 201 491 316 435 491 491 435 435 435 435 289 289 491 7 479 331 307 307 61 61 285 44 44 44 44 38 482 482 482 482 238 6 336 161 79 487 288 288 403 403 171 171 246 246 252 422 186 162 232 232 232 68 238 6 272 470 278 278 278 178 458 458 192 472 196 196 309 331 157 157 157 157 372 396 186 162 54 482 482 238 238 6 371 180 84 84 84 496 274 413 413 413 195 250 250 345 141 141 141 281 9 238 6 272 87 87 354 420 420 420 420 422 162 68 68 115 267 267 267 267 267 434 434 434 434 339 303 303 404 13 491 247 247 126 126 292 326 326 326 23 101 101 149 228 491 491 373 155 155 155 332 332 332 372 245 399 70 258 258 258 31 342 224 494 494 368 453 142 142 397 147 329 329 329 329 329 329 36 310 107 395 302 302 302 302 497 497 43 43 364 364 345 389 389 389 314 58 58 110 202 202 202 202 402 478 66 68 68 267 267 267 267 267 434 339 94 277 277 277 37 37 325 34 118 118 118 118 402 402 472 177 198 127 114 0 222 222 468 245 58 72 110 110 254 254 254 240 314 131 133 401 401 354 137 137 137 137 275 303 303 303 48 404 439 439 439 78 237 47 47 47 491 491 47 316 316 491 73 289 73 491 491 190 488 488 488 488 488 428 146 146 173 173 29 469 469 236 36 26 359 359 359 474 474 474 324 186 99 338 400 400 400 30 378 8 345 141 141 281 453 342 168 168 223 223 130 129 198 198 448 448 448 464 464 255 143 129 259 74 351 351 278 278 360 339 398 398 398 464 275 275 116 64 212 198 45 45 45 236 129 196 196 473 65 329 329 406 406 288 288 139 175 175 175 423 423 423 143 458 144 27 437 151 151 169 169 402 35 221 336 354 29 498 382 313 313 35 131 472 482 482 482 482 397 397 189 189 189 189 169 35 96 96 272 472 472 198 127 114 92 92 92 92 240 385 449 449 219 464 180 106 306 306 306 306 206 396 285 285 34 84 410 410 410 410 173 173 29 29 495 495 406 406 467 467 253 253 453 9 168 14 14 411 284 405 405 206 169 349 352 352 29 242 242 116 94 199 253 253 253 253 338 338 400 400 400 30 422 162 232 482 397 397 189 189 189 215 215 35 96 272 472 156 156 156 156 245 58 72 72 268 268 268 268 268 268 450 450 271 186 39 390 390 390 18 427 56 247 312 15 15 15 292 292 292 292 15 193 193 193 193 193 17 +17 17 17 296 363 363 363 363 363 363 363 101 51 51 51 228 228 491 320 345 174 174 174 174 174 348 348 64 248 465 144 389 389 389 389 34 202 202 173 280 280 444 213 213 213 252 314 196 242 242 116 479 199 44 44 44 217 217 217 473 398 213 213 213 286 139 139 302 302 375 375 335 226 14 287 287 284 405 405 206 169 352 402 198 198 22 283 455 416 144 208 79 380 315 315 315 315 450 450 413 413 212 212 131 133 345 333 333 220 220 216 180 113 113 113 113 167 35 131 14 14 411 410 410 410 410 173 29 29 382 245 8 129 259 190 380 288 288 278 203 53 176 176 135 328 200 200 248 248 212 22 283 455 129 259 74 190 492 492 245 173 280 280 498 498 498 498 498 396 215 8 354 337 485 485 464 139 302 497 497 497 129 401 401 259 74 351 351 443 443 178 178 458 192 192 462 462 462 402 32 239 384 371 498 498 498 498 498 59 396 385 24 227 419 419 439 417 417 237 237 237 237 237 237 491 28 237 28 362 491 491 362 491 491 362 362 362 491 362 362 491 435 211 491 369 369 369 21 21 21 21 21 21 21 21 21 21 408 408 408 149 149 228 289 491 7 217 258 258 258 258 342 342 224 494 494 494 281 9 142 397 336 147 329 329 329 329 329 329 310 107 395 302 302 302 497 497 497 42 42 147 380 486 486 486 460 460 215 35 96 36 472 66 68 68 172 482 105 196 70 70 65 306 306 396 396 313 35 26 26 359 359 474 474 324 464 415 415 415 35 22 283 455 416 458 458 445 278 278 278 36 310 107 107 60 298 116 33 33 394 212 384 371 153 153 153 153 372 372 372 59 59 452 263 225 225 225 83 83 55 55 322 67 67 478 478 232 232 232 68 238 6 371 470 443 443 443 215 35 96 96 272 34 340 340 116 33 250 250 250 409 409 409 409 116 33 394 32 239 354 278 278 278 314 196 242 242 242 33 394 76 36 377 87 87 236 239 371 371 374 374 374 132 186 162 54 172 224 273 84 84 84 84 16 98 98 13 417 417 417 417 237 237 237 201 211 211 187 260 260 391 391 391 491 316 316 73 491 289 491 127 5 5 455 143 458 445 445 278 278 278 278 143 310 107 107 395 298 298 116 94 199 415 415 415 415 131 221 401 144 79 79 288 288 360 360 434 434 200 248 212 239 445 180 171 171 171 171 171 252 8 354 100 100 302 497 497 81 253 253 453 142 221 345 141 141 281 453 342 168 44 236 236 36 310 107 395 485 286 286 286 313 349 349 155 262 262 100 175 81 255 255 129 259 74 437 437 306 306 306 396 396 457 233 196 291 291 291 291 243 243 227 427 427 247 247 15 126 15 292 292 292 193 193 193 193 17 +17 17 17 296 363 363 363 51 51 51 51 184 491 491 412 287 157 157 157 157 372 372 372 396 396 245 245 43 364 364 345 389 389 389 240 325 34 202 202 202 402 221 259 354 137 137 137 137 137 33 394 394 76 310 107 107 395 395 286 286 286 468 396 245 349 349 155 262 262 262 100 100 375 98 98 117 417 417 225 80 80 491 209 118 118 118 118 118 402 177 177 177 177 36 34 254 254 254 314 196 479 331 307 307 307 61 61 167 457 35 259 137 137 137 137 137 33 394 478 478 68 172 344 344 344 344 274 129 129 74 74 72 72 290 290 290 290 290 339 339 33 90 393 155 262 262 262 359 359 166 166 166 324 422 143 129 458 144 208 208 208 386 386 386 444 360 360 360 360 246 434 434 339 94 199 253 253 253 253 31 342 86 238 6 272 87 87 87 416 458 445 485 278 278 173 173 29 277 277 385 314 478 478 68 115 273 231 231 231 53 53 76 198 214 214 214 328 200 200 200 69 223 223 130 198 198 22 448 448 464 464 255 255 129 129 74 74 485 485 485 485 286 286 468 468 467 337 11 11 11 11 11 379 379 77 77 342 342 224 69 69 223 130 44 44 44 116 94 199 319 319 319 348 33 33 219 219 219 219 219 485 485 374 374 374 132 318 368 368 54 54 238 272 472 221 336 74 74 437 437 306 306 306 306 306 396 396 134 175 175 81 334 334 334 334 59 452 452 13 491 247 312 312 126 292 292 292 292 292 292 326 326 326 21 21 21 21 21 21 21 408 408 408 408 149 228 491 412 177 177 177 177 77 9 142 397 336 276 109 109 278 330 348 33 64 212 384 84 84 84 84 496 274 185 49 9 26 26 241 367 367 367 367 143 96 36 131 483 226 226 209 411 213 213 213 213 213 252 318 39 39 342 86 86 238 6 272 483 440 89 89 446 446 446 67 212 131 133 364 276 109 109 443 443 120 120 271 150 39 433 433 160 6 6 227 419 439 439 439 225 225 225 225 237 47 47 491 80 491 373 373 373 155 155 487 487 487 374 374 216 216 283 455 455 43 276 109 109 443 443 443 150 150 86 86 238 272 397 397 364 174 174 174 174 319 348 195 195 195 404 404 229 491 247 312 126 292 292 23 23 23 101 101 149 391 228 491 289 320 7 241 367 367 367 367 192 192 176 135 135 135 200 464 464 113 113 113 113 113 167 449 34 125 125 125 125 466 22 455 455 8 259 180 376 376 376 376 376 460 178 178 458 192 219 219 219 180 180 106 306 306 306 306 306 306 59 37 24 131 404 229 229 247 126 126 326 326 326 408 408 149 228 228 289 491 144 445 210 210 210 210 210 203 53 44 44 44 44 349 234 234 234 261 425 386 386 431 151 151 240 240 285 34 69 462 462 130 402 402 196 217 217 217 217 473 65 443 443 139 175 175 241 81 84 84 84 496 274 274 274 236 32 401 36 310 107 395 485 374 374 374 374 132 132 132 242 116 33 33 33 394 478 478 232 172 172 115 273 319 319 319 348 348 466 250 241 431 431 428 428 428 428 146 358 385 233 227 419 419 439 439 78 170 170 491 47 491 2 491 2 316 316 316 491 316 491 73 73 73 491 354 159 159 159 35 35 198 22 5 448 448 14 411 411 213 213 213 213 213 186 39 342 86 86 238 6 272 472 397 336 276 174 174 174 174 275 388 303 303 117 48 417 78 170 491 491 421 491 128 128 193 193 17 +17 17 17 296 296 317 435 491 184 184 184 184 320 345 109 409 330 330 67 77 77 54 54 219 152 152 152 152 143 129 144 144 180 106 405 405 405 206 206 167 167 35 227 227 419 225 225 226 226 209 44 44 44 416 458 458 208 208 425 386 386 431 278 278 278 53 53 76 76 270 342 342 172 224 69 462 130 130 198 198 22 283 455 455 129 259 354 425 425 241 431 374 374 374 374 374 132 132 413 203 381 381 381 212 212 32 197 197 197 197 491 197 197 7 7 364 276 346 346 346 428 428 428 146 146 358 35 35 401 131 472 472 401 80 80 491 310 107 107 395 351 264 264 468 468 468 337 337 337 324 422 24 36 161 161 487 487 288 213 213 246 318 318 49 342 168 340 340 116 466 22 283 455 455 251 241 431 431 443 443 169 169 352 402 402 272 483 14 411 153 153 153 372 372 396 313 36 310 107 395 334 334 59 313 24 24 404 427 247 247 126 126 292 326 326 326 326 326 326 101 149 149 149 491 412 83 55 55 55 322 67 10 10 309 479 331 331 284 405 405 206 206 240 325 34 176 176 135 135 328 200 200 200 248 248 478 162 68 68 68 26 26 26 241 431 432 432 432 330 64 64 212 131 300 382 382 382 245 245 129 129 354 354 498 498 498 498 396 186 35 36 310 107 107 50 50 50 50 50 49 342 342 68 221 336 384 371 180 315 315 315 450 450 348 94 199 340 340 466 22 283 455 455 58 72 72 437 437 481 481 481 481 175 175 81 84 84 84 274 274 8 259 354 62 62 62 62 216 216 22 283 455 8 129 259 190 380 380 499 496 496 496 274 233 233 458 419 427 229 247 126 126 292 292 292 292 292 23 23 23 23 101 101 101 149 149 228 228 320 345 141 141 141 281 453 142 221 221 336 208 79 79 79 288 360 360 360 434 434 339 64 212 131 180 180 410 410 410 410 173 29 29 382 245 245 8 8 62 62 62 62 62 146 464 44 44 44 236 36 108 119 119 351 351 486 365 365 365 200 200 212 212 302 302 302 175 175 462 462 462 462 4 4 4 280 106 284 480 480 480 480 480 85 85 299 299 299 299 339 303 471 471 471 49 433 433 433 160 112 112 439 56 56 237 237 237 491 28 491 28 491 362 362 362 491 362 362 491 362 362 491 491 362 491 211 491 491 369 369 21 21 21 326 408 408 408 408 228 491 289 491 373 451 451 286 286 286 286 468 468 313 186 162 232 68 115 273 470 486 486 460 460 240 35 472 196 196 70 65 65 495 406 467 288 139 175 175 423 423 423 143 129 144 27 437 437 151 151 169 169 164 164 164 221 336 354 29 334 334 59 59 385 233 465 419 439 439 225 417 417 80 80 80 7 345 409 409 409 409 76 310 107 400 400 30 30 422 422 342 342 273 470 486 486 460 240 285 34 415 415 415 325 131 106 106 297 297 297 375 375 98 98 263 417 417 417 417 237 237 237 237 80 491 491 483 287 287 297 297 297 297 297 43 43 345 109 109 109 171 171 318 186 162 232 68 68 26 26 425 241 431 428 428 428 146 143 26 26 359 166 166 166 301 143 36 490 490 490 38 162 482 482 238 6 161 487 499 151 151 150 150 86 142 142 393 262 100 100 175 81 462 462 130 162 68 68 273 319 319 319 348 33 64 212 310 107 395 180 480 480 480 85 299 299 303 48 229 229 247 15 15 193 193 193 17 +17 17 17 296 296 363 363 52 52 52 52 52 52 51 51 51 51 184 184 289 491 209 83 83 194 194 194 194 322 67 67 131 183 183 183 451 286 286 286 286 468 468 313 186 99 338 400 400 400 400 30 422 186 162 232 68 68 115 470 486 486 486 460 167 167 35 401 196 309 479 331 315 315 315 315 315 450 450 98 98 417 417 417 417 417 417 237 237 47 47 491 47 491 80 80 73 80 80 7 7 309 309 479 278 278 278 278 36 449 449 176 176 328 328 328 200 303 117 98 13 417 417 417 417 237 237 47 47 47 491 80 80 80 80 435 209 83 83 194 194 322 67 67 212 22 5 455 236 36 108 119 351 351 171 171 171 252 8 29 302 302 497 497 8 354 255 255 58 58 72 72 480 480 480 480 299 299 339 212 131 156 156 156 156 245 245 43 345 141 141 281 342 26 26 241 431 476 476 476 252 252 36 393 393 155 332 332 332 186 162 342 115 273 151 151 151 215 215 29 29 334 334 59 59 59 263 263 417 417 417 237 237 237 491 28 28 28 362 362 491 362 362 491 362 362 362 491 362 362 362 491 362 362 362 218 218 218 218 218 218 491 491 211 211 369 491 369 369 369 369 369 369 369 369 260 260 163 163 163 316 316 316 491 316 491 73 289 289 7 217 473 258 258 258 342 342 224 494 494 368 453 9 142 397 147 380 329 329 329 329 252 143 310 107 395 302 302 302 375 375 375 98 98 13 225 225 225 225 80 80 80 80 80 320 354 255 255 255 349 349 155 155 148 148 148 372 372 313 186 338 400 400 400 30 58 110 254 254 254 314 90 393 205 25 470 264 264 468 468 134 359 359 166 166 166 422 129 458 208 208 386 386 496 496 496 496 368 368 453 9 142 198 22 22 283 455 384 371 106 153 153 153 372 372 372 59 59 452 263 229 247 126 126 326 193 193 +17 17 17 296 296 317 491 491 184 184 184 184 184 320 320 127 114 0 0 0 378 378 43 347 347 347 347 313 186 164 164 164 119 487 487 487 288 213 324 324 301 143 259 74 425 425 386 386 431 403 171 171 252 24 270 270 342 26 26 26 241 241 431 403 403 171 171 207 358 37 24 131 427 229 247 247 126 126 292 292 326 326 326 326 326 101 101 101 149 149 228 491 373 66 115 273 273 496 496 274 216 216 45 45 45 236 35 196 196 217 65 65 329 495 406 467 256 256 139 175 175 423 423 423 423 423 399 217 70 65 65 151 169 150 342 142 221 336 420 420 420 464 154 154 154 458 458 96 86 105 105 336 470 470 151 178 178 96 96 36 272 176 135 328 200 200 248 248 478 342 68 68 115 273 231 231 231 53 250 250 174 174 174 319 348 33 58 72 72 72 437 350 350 350 350 203 203 250 250 250 333 333 333 220 220 402 196 196 217 217 65 486 486 460 460 169 164 25 485 485 485 374 422 143 36 377 87 87 236 36 108 108 119 213 213 213 213 246 246 246 19 19 454 454 229 170 491 312 312 312 187 292 292 292 12 12 12 21 408 408 408 260 391 491 491 316 491 316 491 73 289 7 7 7 354 159 159 159 159 240 314 35 35 127 5 5 455 236 129 239 384 371 278 278 278 99 436 436 395 395 50 50 50 50 49 9 142 397 336 347 347 347 467 14 411 204 204 204 204 204 29 337 337 337 301 422 239 384 93 93 93 93 171 171 252 252 314 239 384 371 371 278 278 99 99 436 436 395 50 50 50 50 50 185 185 269 433 390 390 160 112 97 225 225 225 225 225 225 80 491 491 412 83 55 55 55 322 466 127 0 0 222 378 43 345 141 141 281 453 168 168 350 350 350 350 348 250 466 81 166 166 324 422 143 401 259 208 208 208 190 487 499 499 486 460 460 215 280 106 486 486 460 215 215 74 100 302 497 497 122 129 259 190 492 492 492 368 9 9 168 300 498 498 498 498 498 498 59 59 59 304 173 173 49 269 342 168 89 89 446 446 116 195 195 195 212 133 133 364 276 174 174 174 174 348 348 33 33 90 90 76 144 27 437 437 480 480 480 85 299 299 299 212 131 462 462 462 402 221 259 445 445 351 351 171 171 171 171 358 358 358 233 458 192 427 229 247 126 126 326 326 326 326 326 326 326 101 101 149 391 491 373 66 68 172 115 273 494 240 216 216 45 45 45 45 314 35 198 22 448 448 448 464 154 154 154 458 96 86 105 105 336 470 151 151 178 178 96 96 36 272 191 191 131 472 458 144 27 27 437 319 319 319 53 53 76 35 259 242 242 242 116 41 41 41 324 422 143 465 458 389 389 389 389 314 196 479 331 307 307 61 61 215 35 35 354 420 420 420 3 14 411 475 475 475 475 475 475 475 301 143 129 74 492 492 236 236 129 75 108 278 278 278 178 458 458 192 485 134 134 359 81 300 382 245 143 82 144 27 351 319 319 203 53 394 76 465 29 242 242 242 41 41 41 19 19 454 13 417 491 170 421 421 491 491 491 421 421 128 491 128 128 491 128 128 193 193 17 +17 17 17 296 296 296 296 296 52 52 52 52 52 52 408 408 51 51 228 184 184 289 219 357 357 357 357 240 385 35 401 401 401 197 197 80 80 491 320 276 181 181 181 181 240 285 34 223 223 130 402 196 196 217 473 65 329 329 460 460 169 164 164 485 485 485 485 257 368 368 9 142 397 221 364 364 364 276 346 346 428 428 428 146 252 35 131 472 221 458 144 144 27 437 437 437 437 437 437 481 481 481 481 481 481 175 175 81 300 300 382 382 406 467 467 89 446 116 466 22 283 455 38 162 482 482 482 482 115 273 106 153 372 372 406 467 467 302 302 497 497 399 399 217 217 217 217 473 65 264 264 264 264 264 264 468 468 59 59 59 452 452 263 263 13 78 170 170 170 491 491 2 491 2 187 491 187 187 163 163 163 391 391 391 316 73 73 491 491 7 217 473 258 258 31 342 342 494 494 494 368 9 9 142 397 147 329 329 329 329 329 329 36 310 107 395 302 302 302 497 497 43 345 141 141 141 281 342 221 336 445 180 443 240 325 449 176 135 135 200 248 248 90 393 234 234 234 261 261 25 264 264 264 264 468 313 134 359 359 166 166 166 324 422 32 401 401 401 401 401 239 384 371 278 278 278 368 453 342 168 41 41 41 324 246 301 43 364 333 333 333 220 216 198 114 258 258 31 342 342 224 273 319 319 319 348 10 10 219 219 219 398 485 374 374 374 374 374 368 368 107 395 397 134 100 100 100 497 497 399 217 217 217 217 473 258 258 258 31 342 86 238 6 272 495 495 495 41 41 324 464 255 8 354 180 113 113 113 167 167 35 472 472 221 259 208 208 441 441 441 346 346 265 265 85 85 146 146 146 277 277 277 24 131 449 472 225 226 226 226 226 491 209 287 319 319 348 33 33 250 217 217 473 65 258 258 31 162 232 68 68 68 238 6 272 485 485 468 468 337 337 324 324 464 459 459 459 368 31 9 142 221 336 208 79 79 288 213 213 213 246 339 339 33 248 248 212 465 445 180 171 171 171 171 252 252 8 354 100 100 302 375 375 375 185 49 433 390 18 427 56 56 247 312 312 292 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 163 163 163 491 491 163 491 163 491 491 316 491 316 491 316 491 316 73 73 491 320 465 144 180 484 240 325 34 213 213 213 173 402 196 94 176 360 328 200 248 147 380 329 329 329 329 107 107 302 302 302 302 497 98 98 98 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 320 7 217 70 329 329 495 406 467 139 139 175 175 423 423 423 423 162 68 68 115 273 470 120 120 240 314 131 472 401 401 259 354 190 380 288 288 278 31 342 86 105 105 26 359 359 474 474 474 474 19 19 454 454 454 225 225 225 225 225 225 225 225 225 225 225 7 7 127 114 258 258 31 342 342 168 356 281 453 453 168 44 44 44 42 147 147 380 288 286 286 464 139 139 497 497 349 349 234 261 25 25 480 480 480 480 85 85 85 299 299 339 339 94 199 360 360 213 360 173 173 402 196 94 199 176 328 328 200 200 464 356 356 430 453 430 430 116 199 277 277 277 277 24 131 419 439 439 439 225 225 225 225 391 391 80 80 491 491 320 345 346 350 496 348 35 310 152 152 152 422 186 342 224 470 278 278 457 36 384 371 180 315 315 315 315 450 450 413 413 303 48 404 13 229 491 247 15 15 193 193 17 +17 17 17 296 363 363 51 51 51 184 491 373 72 268 268 268 268 268 88 88 88 353 353 406 467 106 297 297 297 297 293 293 219 219 464 106 106 387 387 372 349 349 205 261 25 106 496 496 496 233 233 233 233 270 270 433 390 390 18 112 112 439 439 439 439 439 78 78 491 491 28 28 28 2 2 2 491 2 2 341 341 491 341 341 163 163 163 163 163 163 163 316 491 316 491 491 491 73 491 373 66 68 172 115 273 231 231 231 231 53 53 394 76 164 214 214 214 214 214 328 200 200 248 248 248 212 127 45 45 92 92 167 167 35 472 393 393 155 155 332 332 332 387 134 251 251 241 431 431 376 376 376 460 460 169 178 35 401 458 144 192 69 69 223 223 223 223 223 130 130 352 352 402 483 440 411 475 475 475 94 475 475 475 324 324 464 180 493 493 493 493 216 300 382 382 313 10 10 479 331 290 290 290 290 434 434 434 434 203 399 217 70 70 65 65 428 428 428 146 146 24 131 472 221 259 420 420 420 420 420 143 458 144 144 27 437 481 481 481 481 481 293 122 122 131 472 393 393 234 234 234 261 487 288 288 432 330 348 64 76 310 107 107 395 395 459 459 459 459 215 233 131 427 229 247 247 126 326 326 326 326 326 101 101 149 149 228 228 412 188 154 154 154 416 416 96 368 453 453 278 278 278 278 278 31 342 86 86 238 6 272 191 191 191 191 37 325 335 335 440 145 89 194 446 446 67 212 131 34 106 297 297 297 293 43 345 109 109 109 171 171 368 453 342 58 72 72 110 110 486 486 460 240 240 325 34 154 154 154 416 96 96 453 168 278 278 278 31 39 86 238 6 272 191 191 191 314 133 259 354 255 236 236 108 119 397 487 360 360 360 434 339 33 250 217 65 65 329 495 406 288 288 139 175 175 423 423 423 423 129 458 144 27 437 151 151 169 169 402 402 221 401 401 354 495 498 59 396 313 325 449 89 89 446 116 250 217 473 258 258 31 342 224 494 494 494 368 142 142 397 147 380 329 329 329 329 329 36 310 107 395 302 302 302 375 98 98 229 82 247 126 126 126 326 326 326 326 326 326 101 408 149 149 228 289 412 188 188 340 121 394 478 478 68 86 105 336 354 106 265 265 428 428 146 146 240 325 449 34 223 223 223 223 223 223 173 173 402 352 352 352 352 352 352 97 97 417 197 417 237 237 237 237 237 80 491 80 80 80 209 287 157 157 157 372 245 245 129 129 74 492 492 492 492 58 110 486 486 486 460 215 215 35 96 66 68 68 342 221 336 336 354 420 420 422 143 458 144 27 27 351 151 151 151 368 453 342 168 168 223 223 223 223 223 223 173 173 352 352 352 352 97 97 225 225 225 225 80 491 127 114 222 222 468 313 313 325 34 490 490 31 342 342 342 273 494 203 70 65 134 134 175 175 431 486 486 486 486 468 468 468 469 469 469 36 449 449 41 41 41 19 19 454 417 170 170 170 491 28 28 28 28 491 28 362 362 491 362 362 362 362 491 362 491 491 491 362 211 211 211 369 491 369 369 369 369 369 21 21 21 21 21 21 21 21 21 408 408 408 149 149 228 289 491 320 473 65 329 329 245 406 406 380 134 139 139 175 423 423 423 423 345 141 141 281 281 9 168 44 44 44 129 129 108 108 119 119 437 437 437 481 481 481 481 481 481 481 182 182 182 182 293 293 497 497 497 98 98 404 225 225 193 193 +17 17 296 296 4 261 25 470 278 278 278 330 116 33 195 195 212 90 133 364 276 276 174 174 174 203 53 53 473 275 275 388 195 117 404 133 364 345 333 333 220 220 402 335 14 411 145 145 145 365 365 365 360 200 64 212 212 302 302 302 302 497 497 497 497 49 269 342 342 168 89 89 194 446 446 64 133 133 345 333 333 220 216 114 180 113 113 113 113 450 167 285 131 472 221 458 144 208 27 27 498 498 498 498 498 59 59 59 59 59 173 173 270 270 270 390 390 390 112 112 417 417 417 237 47 491 491 491 80 80 491 491 373 156 156 156 156 156 313 236 239 259 384 180 106 106 306 306 306 396 396 178 143 458 192 445 72 110 351 264 264 264 468 468 468 382 313 186 99 338 338 338 338 395 395 84 84 496 496 274 122 314 314 478 478 68 115 273 231 231 231 53 53 90 90 32 32 144 208 79 79 380 288 288 171 171 171 252 186 39 342 232 482 482 238 6 161 79 487 288 213 213 213 358 358 233 270 270 270 342 168 89 55 322 322 250 345 141 141 281 453 9 168 106 297 297 297 297 293 43 345 109 109 109 368 31 342 86 238 6 108 119 397 487 278 278 31 31 86 86 272 191 191 191 236 325 34 230 230 230 230 215 35 259 340 340 340 94 44 44 44 44 72 72 72 437 306 306 306 306 306 396 396 313 26 251 241 431 278 240 285 285 302 302 497 122 10 10 479 331 331 405 405 206 206 167 449 472 221 336 354 255 255 58 72 72 72 437 480 480 480 480 480 85 299 299 299 299 339 195 243 212 131 419 225 397 133 320 345 333 333 220 220 164 164 472 221 401 491 108 108 119 374 374 374 374 374 374 132 132 132 132 132 43 364 276 276 346 346 265 265 85 85 146 468 468 382 313 337 58 183 72 72 110 110 264 264 468 468 245 215 35 259 74 351 275 275 116 379 195 471 471 478 66 68 68 238 6 272 189 189 189 189 178 458 192 44 44 236 416 239 208 79 79 380 151 151 151 150 39 342 342 224 494 494 134 8 402 359 359 474 474 166 422 349 164 164 164 487 487 487 487 374 374 88 88 277 277 277 277 385 75 227 419 427 491 491 247 312 312 292 292 292 292 292 292 292 21 21 1 21 21 21 21 21 21 21 408 408 408 408 149 491 491 373 338 400 400 400 400 30 301 422 251 251 367 367 367 367 367 367 35 96 259 26 26 241 266 266 266 266 266 266 35 192 44 44 44 43 364 276 174 174 174 174 53 53 65 242 242 94 199 462 462 462 402 196 309 309 479 331 486 315 315 315 460 450 406 467 84 84 84 88 88 88 154 154 154 96 96 232 232 105 105 336 354 485 286 286 286 468 468 337 337 11 11 11 11 379 379 471 77 342 224 89 89 116 33 90 42 147 147 380 288 278 236 36 449 191 191 191 131 472 458 144 27 437 370 370 370 370 370 348 64 64 310 310 436 395 459 459 11 11 379 303 471 243 270 269 433 160 160 18 112 439 225 225 225 225 80 80 491 491 320 345 407 407 407 236 233 36 310 107 338 338 400 400 400 400 301 378 43 345 109 346 346 141 355 355 355 37 185 185 433 433 433 160 160 112 427 56 491 491 312 15 15 15 15 193 193 193 193 193 17 17 +17 17 17 296 296 363 51 51 51 51 51 491 184 184 184 184 320 159 159 159 159 240 35 127 0 0 222 378 345 347 141 141 281 342 342 44 44 44 38 162 232 68 172 115 470 470 171 171 171 252 173 173 176 176 135 135 200 200 248 248 478 232 232 232 68 115 273 231 231 231 231 53 76 76 164 164 214 214 214 328 200 464 255 255 8 259 180 113 113 113 113 450 285 285 58 156 156 156 156 156 245 245 399 217 217 473 65 315 315 315 315 450 450 450 450 169 352 164 164 97 397 397 364 407 407 407 407 407 407 36 310 310 107 107 107 447 97 483 197 226 226 80 80 209 209 188 118 118 118 118 352 352 25 177 177 254 325 34 254 254 254 314 129 259 137 137 137 137 137 116 195 195 195 335 14 226 411 145 463 463 463 463 29 29 382 313 186 186 162 68 172 344 344 344 344 344 274 186 162 232 68 26 26 26 386 431 428 428 146 146 35 26 359 166 166 166 236 36 384 490 490 490 173 280 280 180 443 443 139 175 175 81 81 469 469 469 215 233 96 96 227 419 427 229 247 126 126 126 292 326 326 326 326 326 101 101 101 149 149 228 491 320 7 70 70 65 65 428 428 85 146 24 325 202 202 202 402 129 259 137 137 137 137 33 76 465 465 27 121 121 33 394 478 68 68 115 115 278 278 278 285 300 382 313 24 325 34 121 121 116 33 394 212 239 371 371 278 278 143 458 458 192 469 469 325 34 459 459 459 173 173 280 69 69 223 130 280 44 44 44 38 342 68 115 273 432 432 330 379 64 77 77 224 494 462 462 402 183 183 219 485 485 485 374 374 132 399 53 334 334 334 59 452 263 417 417 417 417 237 237 28 28 491 28 362 362 491 491 491 362 491 362 491 362 491 491 40 211 211 369 369 369 369 21 21 21 21 21 21 260 260 260 260 391 391 391 491 73 289 289 7 345 109 109 109 347 467 467 499 297 297 297 297 293 293 35 259 74 190 104 104 104 285 34 41 324 301 43 276 109 109 139 139 139 293 293 293 98 98 13 13 417 417 417 417 417 417 80 80 80 80 435 66 66 179 179 179 179 179 314 314 196 217 473 258 258 31 342 224 494 494 281 142 142 397 147 380 329 329 329 329 143 310 107 395 395 302 302 375 98 98 13 417 417 417 170 249 20 28 305 491 442 305 305 2 491 491 2 2 249 491 491 305 305 366 491 491 366 316 491 435 435 435 435 435 435 289 412 287 287 111 111 111 438 378 345 141 141 281 9 142 336 144 27 480 480 480 146 299 64 34 34 462 130 29 44 255 38 349 205 205 261 190 380 288 288 171 171 252 252 314 239 219 219 219 152 152 374 374 132 132 43 364 276 109 372 372 59 59 396 339 243 227 472 472 198 216 127 114 84 84 84 16 16 16 274 98 98 13 225 225 225 345 409 409 409 409 94 199 111 111 111 438 438 162 342 172 115 273 106 481 481 426 426 206 399 217 217 473 486 486 486 460 460 169 164 164 485 485 485 485 374 318 186 162 54 238 6 272 499 499 499 206 240 285 34 176 135 200 200 106 284 405 206 169 169 402 96 36 272 469 469 236 325 93 93 93 207 207 19 454 454 229 82 247 126 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 149 228 412 412 287 111 111 111 438 349 164 164 106 106 405 405 206 167 457 217 473 473 476 476 171 252 252 8 420 420 324 324 183 451 30 30 30 378 141 141 141 281 342 142 221 144 180 84 496 88 88 176 176 135 135 248 248 108 377 123 123 216 22 283 455 236 384 180 91 91 91 91 91 178 458 96 6 272 334 334 334 304 304 304 185 185 323 390 390 18 112 439 417 237 237 237 237 237 237 237 237 237 128 128 128 128 128 128 193 193 17 +17 17 17 17 296 317 317 317 491 317 461 461 461 461 184 184 184 184 491 7 7 70 65 329 329 42 406 406 288 134 139 139 175 175 423 423 423 423 31 342 26 26 251 241 431 278 278 278 215 233 233 270 270 433 433 86 238 336 336 82 108 397 397 441 441 109 278 278 385 233 36 310 447 447 238 6 272 34 319 319 348 64 212 300 300 313 186 162 232 238 6 470 470 294 294 294 294 330 94 94 176 176 328 200 200 248 359 359 474 474 474 19 19 454 454 229 170 491 247 312 126 292 292 292 292 292 21 21 21 408 408 408 408 408 391 391 228 491 373 373 400 400 400 30 30 58 58 110 254 254 254 254 325 34 154 154 458 96 66 342 105 105 336 470 151 151 178 178 35 96 401 75 272 191 191 191 314 196 217 473 258 258 258 31 342 224 494 494 368 9 142 397 147 380 329 329 329 329 252 36 107 107 302 302 302 302 175 175 431 230 230 230 230 215 35 227 419 439 439 439 225 225 47 47 491 80 491 373 373 338 338 400 400 400 30 30 58 58 110 254 254 254 254 254 35 196 196 309 479 331 84 84 84 496 274 274 413 413 466 466 45 45 45 45 216 198 22 283 455 38 162 68 68 115 273 273 265 428 428 146 146 146 35 449 34 69 69 130 402 402 196 217 473 486 486 486 460 460 169 169 164 164 485 485 485 374 132 301 236 129 310 310 107 395 180 106 426 426 426 206 348 76 465 449 449 176 135 200 200 199 106 426 405 426 206 402 402 478 232 68 68 115 344 344 344 344 88 14 14 411 319 319 319 94 199 154 154 458 445 445 351 351 351 315 315 450 413 413 76 449 449 134 134 134 8 26 359 359 474 474 474 324 19 454 229 247 247 126 126 326 326 326 326 326 326 326 101 101 101 149 149 228 320 7 345 389 389 389 389 314 401 259 420 420 420 420 422 236 129 36 108 119 344 344 344 374 374 132 132 399 70 383 383 383 383 383 383 36 107 447 393 393 155 332 332 332 245 58 156 156 156 313 10 10 479 331 290 171 171 252 173 8 29 334 304 304 304 186 54 142 221 336 445 445 485 485 485 468 468 468 337 337 485 464 180 180 405 405 169 169 150 342 342 224 469 469 325 325 41 41 41 19 19 454 13 439 78 78 491 491 28 491 312 341 491 341 12 12 341 491 12 12 260 260 260 260 260 391 391 228 491 491 289 289 209 287 287 16 16 16 274 413 348 479 331 84 84 84 16 16 16 16 203 381 48 417 417 417 417 417 237 491 47 47 47 491 491 47 491 80 80 491 209 287 287 111 111 111 111 203 203 90 90 76 458 208 441 441 346 428 428 428 146 146 131 133 133 364 109 109 139 139 139 139 375 375 98 98 417 417 417 225 225 225 287 287 297 297 297 297 293 293 216 216 114 84 84 84 16 88 88 111 111 111 111 438 58 58 110 110 110 254 254 240 34 44 44 44 8 354 180 180 376 376 376 376 460 282 240 24 131 183 72 110 110 443 443 240 325 34 207 207 207 324 416 416 239 219 357 357 443 443 169 150 150 86 238 6 469 469 469 469 325 93 93 93 207 207 19 454 417 417 417 417 80 491 435 373 338 400 400 400 30 30 422 162 342 115 273 470 120 120 120 37 24 404 229 229 247 312 15 15 15 193 193 193 193 17 +17 17 17 363 363 363 363 51 51 228 491 289 7 217 70 65 329 329 329 329 169 164 164 164 485 485 485 301 378 378 43 345 109 189 432 330 348 64 76 36 377 377 123 123 8 259 190 380 499 499 428 428 146 146 252 35 131 133 147 147 380 288 288 173 173 280 29 334 59 59 452 263 417 417 417 417 417 237 237 237 435 237 237 80 491 435 435 435 7 7 364 345 152 152 468 468 313 416 416 445 180 443 443 240 325 34 135 135 135 200 200 44 44 44 251 241 81 278 278 26 34 302 497 122 8 32 32 32 354 153 153 153 153 387 387 387 207 207 146 301 393 155 165 165 165 165 53 44 44 94 335 14 411 411 153 387 372 372 396 349 349 352 25 242 242 94 199 255 271 38 342 342 115 273 106 265 265 85 85 146 175 175 81 242 203 217 473 89 340 116 195 195 195 195 195 197 309 309 479 331 84 84 496 173 280 29 469 38 162 54 482 105 336 144 180 496 496 496 274 186 99 436 436 395 423 423 423 423 355 263 263 229 82 247 126 126 326 326 326 326 101 101 149 149 228 412 412 83 194 194 194 322 212 131 451 30 356 281 342 342 221 144 27 351 319 319 319 53 176 135 135 200 248 248 248 479 331 106 426 426 125 348 466 466 22 283 455 236 259 161 161 161 487 288 290 290 290 434 434 339 248 76 108 377 351 494 116 94 479 331 428 428 428 428 299 358 358 24 227 419 439 439 417 417 237 237 28 28 491 28 491 362 491 491 362 362 491 362 491 362 491 362 491 491 362 218 218 40 305 366 491 366 366 366 366 366 491 435 435 316 73 73 289 289 209 188 118 118 118 118 402 221 196 217 473 65 329 329 245 42 147 380 288 134 139 175 175 423 423 423 423 58 110 254 254 254 254 36 478 232 232 68 172 115 273 470 120 120 120 120 24 314 314 472 198 127 45 45 45 45 457 196 217 217 473 65 329 486 486 460 460 169 164 164 485 485 485 485 485 374 132 58 254 254 254 254 314 416 458 144 180 106 426 426 426 413 348 64 76 465 108 377 123 44 236 129 259 190 190 380 499 499 428 85 146 146 143 131 472 133 133 147 147 380 288 288 173 173 280 29 334 59 59 59 313 143 36 377 377 87 87 217 473 65 213 213 213 252 325 34 44 44 44 129 259 445 445 445 351 351 351 486 365 365 360 200 200 200 248 212 192 180 255 495 42 147 380 380 374 374 132 132 132 349 155 155 165 165 165 165 70 65 284 405 206 169 150 162 482 482 482 482 482 238 6 161 487 487 288 288 288 139 139 139 81 337 324 423 423 423 423 423 423 452 263 229 247 312 126 126 292 326 326 326 326 326 326 326 408 408 149 149 228 491 320 7 217 258 258 258 31 54 224 494 494 368 453 142 142 397 147 380 329 329 329 329 252 36 107 107 395 302 302 302 375 375 98 143 401 259 144 389 389 389 389 314 196 309 479 307 307 307 61 61 285 449 202 202 202 130 129 259 354 137 137 137 116 33 250 217 217 70 70 138 138 138 138 138 372 467 467 255 255 38 54 86 238 6 272 106 499 405 426 206 348 199 199 459 469 271 99 447 447 6 6 6 419 439 78 491 305 421 491 421 128 491 193 193 193 17 +17 17 17 17 296 317 317 317 435 435 184 184 184 373 373 338 400 400 400 30 378 345 141 141 281 453 168 145 145 145 460 460 460 178 96 96 436 447 134 134 134 134 134 359 166 166 166 166 324 186 162 482 482 482 238 6 336 161 487 278 278 178 458 192 192 242 116 116 195 195 394 394 212 401 401 401 401 384 371 180 180 319 319 319 203 53 381 381 381 381 381 381 76 393 155 332 332 332 332 245 349 205 205 261 25 106 265 265 265 265 85 85 85 146 146 173 402 402 66 68 68 115 273 470 151 151 178 458 458 192 242 275 275 379 303 471 471 471 49 433 160 112 427 247 247 312 126 292 292 292 292 292 292 292 292 292 21 21 21 326 21 21 408 408 408 408 149 149 228 228 316 316 73 491 289 289 209 177 177 177 177 131 133 133 141 141 141 141 281 453 342 483 483 226 226 209 287 319 319 319 319 348 348 394 478 478 66 68 68 115 494 494 494 215 129 259 74 74 437 72 72 437 437 496 496 496 496 274 274 368 368 368 9 168 494 134 134 8 100 100 100 100 100 375 375 497 216 198 45 45 45 45 35 196 196 70 65 329 329 329 406 406 467 288 139 175 175 423 423 423 345 141 141 281 342 142 196 217 473 476 476 476 143 458 192 176 135 135 328 200 248 248 393 234 234 234 261 25 319 319 319 348 94 199 223 223 130 402 58 156 156 156 156 59 59 59 452 263 229 247 247 126 126 126 292 326 326 326 326 1 1 1 1 408 408 260 260 391 391 391 391 491 73 73 73 289 491 320 159 159 159 159 159 385 35 196 196 217 473 258 258 258 342 342 224 494 494 494 368 9 142 397 147 147 329 329 329 329 329 329 143 310 107 107 395 302 302 302 497 497 43 345 141 141 141 281 453 168 483 14 226 209 297 297 297 297 297 399 70 65 65 496 169 150 54 238 6 6 472 393 234 261 261 148 148 148 387 372 396 186 186 54 86 238 6 6 472 472 472 482 224 224 494 494 38 162 323 323 224 494 494 129 259 74 437 496 496 496 496 274 274 368 368 9 168 277 277 277 37 24 131 227 419 439 439 439 439 417 237 237 237 28 28 491 491 28 362 491 362 362 362 491 491 491 491 362 362 491 218 362 491 491 218 491 218 218 218 218 218 435 218 366 491 491 305 366 491 366 435 366 491 366 491 366 316 316 491 316 491 316 316 491 73 73 289 289 209 287 430 430 430 430 430 430 219 219 477 477 378 88 109 44 116 116 199 335 14 226 226 226 209 209 411 498 498 498 308 396 313 94 459 459 459 459 271 31 342 86 86 6 272 472 221 196 70 473 329 329 329 406 467 134 134 134 175 175 423 423 423 423 423 263 263 225 225 225 225 225 80 373 373 338 338 400 400 400 30 422 239 384 490 490 399 217 473 365 365 365 365 365 388 64 212 191 191 191 314 133 259 409 409 409 409 33 33 250 32 280 280 153 153 343 387 387 146 358 39 39 86 142 142 397 456 456 456 236 36 108 119 308 308 308 308 308 308 308 388 339 33 394 212 108 123 123 123 123 58 156 156 156 156 59 59 452 263 229 229 247 312 312 126 292 292 292 292 292 1 1 1 1 23 23 23 408 408 408 391 391 316 73 491 289 289 7 357 357 357 271 31 342 168 494 255 402 402 458 208 441 441 153 153 153 387 372 396 396 271 186 39 39 390 390 390 390 390 390 18 18 112 439 439 439 439 237 78 421 128 193 193 17 +17 17 17 296 296 296 184 184 373 66 172 179 179 179 179 314 196 196 70 65 329 329 495 406 467 288 134 139 139 175 423 423 423 423 263 229 82 247 126 126 326 326 326 326 101 101 101 149 149 228 412 83 253 253 253 453 342 224 118 118 118 118 402 402 221 259 144 445 180 443 240 449 449 176 135 135 200 200 248 248 32 32 354 354 153 153 153 153 387 387 387 85 207 318 185 269 9 142 393 155 165 165 165 165 70 14 14 411 153 387 372 372 349 349 205 352 29 242 116 94 199 255 38 31 342 68 115 273 265 265 85 85 85 175 175 81 203 203 471 471 49 453 168 89 340 116 116 10 10 479 331 84 84 496 274 8 29 459 313 31 162 54 105 105 336 27 496 496 496 496 274 99 99 436 395 423 423 423 43 43 345 347 347 245 245 129 259 74 437 437 306 306 306 206 240 285 449 69 223 130 198 198 283 455 219 219 219 219 219 485 374 374 374 132 132 99 99 161 161 397 134 100 100 100 497 497 186 162 482 142 105 336 336 336 190 380 288 288 360 328 200 200 195 195 248 248 364 364 276 276 109 498 498 498 396 396 178 35 458 192 125 125 125 125 348 199 335 14 411 411 475 475 475 94 475 475 324 324 301 378 43 364 276 109 109 443 443 139 139 139 293 293 497 497 42 42 147 147 380 288 443 443 416 416 458 445 485 134 134 175 175 158 158 158 158 325 449 191 191 191 325 335 14 145 145 486 460 460 173 280 280 242 242 116 379 250 359 81 41 324 324 324 422 349 234 234 261 261 25 106 306 306 306 306 306 306 282 203 203 117 404 229 247 247 126 126 326 326 326 326 326 326 326 326 326 101 408 408 149 228 491 491 412 188 340 340 67 77 478 232 86 68 272 470 470 443 443 240 34 223 223 130 129 259 354 420 420 420 360 135 135 135 200 44 44 44 44 199 335 145 319 319 319 348 348 33 90 72 72 72 72 498 498 498 498 498 396 396 285 285 180 106 284 353 206 206 173 280 280 121 121 116 199 469 469 173 280 418 418 418 418 418 418 99 99 436 436 60 60 298 298 303 303 303 117 404 13 229 491 247 312 126 292 292 292 292 292 292 12 12 12 21 260 305 201 201 201 201 201 201 201 201 201 491 491 316 316 491 316 491 289 289 7 7 473 258 258 258 342 224 494 494 494 281 9 142 397 147 329 329 329 329 329 143 36 107 107 395 302 302 497 497 349 349 234 261 25 180 189 139 139 139 293 167 35 35 198 45 45 45 45 310 338 400 400 400 400 30 30 3 58 110 110 254 254 254 254 254 314 131 133 364 147 456 456 456 38 162 68 68 172 115 444 444 444 444 444 246 246 318 173 402 6 272 34 44 44 44 8 8 401 401 401 197 491 80 491 80 491 80 80 197 66 66 68 172 115 273 494 278 173 8 4 280 485 485 286 286 286 286 468 382 245 245 399 399 217 217 217 217 473 65 432 432 330 348 64 64 465 449 449 302 302 302 497 497 122 129 401 401 401 401 491 310 107 395 395 106 481 424 424 182 182 375 375 122 233 75 227 227 419 419 439 439 439 439 439 237 439 78 78 47 491 47 491 491 316 316 491 491 316 316 73 373 373 373 338 400 400 400 30 422 422 164 164 25 106 106 405 405 405 206 167 449 449 34 340 340 116 94 199 145 154 178 458 96 342 342 224 105 27 386 386 386 386 399 473 418 418 418 418 99 436 436 60 60 298 116 33 250 53 394 76 259 74 441 441 153 387 387 299 299 299 358 243 270 270 433 160 112 427 491 247 247 126 15 15 193 193 193 193 17 +17 17 17 17 296 296 52 52 52 51 51 51 51 51 184 184 491 320 7 217 70 473 65 65 329 42 42 147 147 147 380 288 134 139 175 175 423 423 423 423 423 335 440 89 89 446 446 212 131 472 196 196 473 65 486 486 460 460 169 169 164 164 485 485 485 132 143 129 401 144 144 27 27 437 151 151 169 164 164 164 401 401 259 29 382 313 285 34 69 223 130 280 106 297 297 297 297 297 293 215 35 35 259 74 74 213 213 213 213 213 252 215 259 29 100 302 175 175 81 255 255 236 384 180 405 405 405 206 215 96 449 135 135 135 200 44 44 44 8 32 32 401 401 401 401 401 354 354 153 153 153 153 153 153 153 387 387 387 207 207 207 207 19 19 454 454 454 229 229 247 312 312 312 126 292 292 292 292 292 12 12 12 12 12 12 260 260 260 260 391 391 391 228 491 373 373 155 165 165 165 165 53 44 44 199 106 106 284 387 372 372 396 349 349 234 261 29 242 116 94 199 255 38 162 232 232 172 115 273 265 265 265 85 146 146 146 175 175 81 459 203 203 203 381 48 404 13 439 78 170 170 170 28 491 187 187 341 2 2 2 491 2 2 362 362 362 362 40 491 366 366 491 366 435 366 366 491 366 491 316 316 316 491 491 435 435 491 289 7 7 364 276 109 109 139 139 139 139 293 293 375 98 98 98 225 225 225 225 225 225 225 465 198 127 5 5 455 43 43 364 276 276 109 109 498 498 498 498 134 134 139 302 293 497 122 122 131 133 345 141 141 141 281 162 232 232 232 232 68 68 115 273 498 498 498 313 240 35 26 26 359 359 166 166 166 422 143 36 108 108 119 308 308 308 308 308 313 94 176 135 200 200 200 230 230 230 215 35 478 232 68 68 273 273 265 428 146 146 416 416 401 401 259 371 180 315 315 315 315 315 315 450 450 450 413 413 303 117 48 404 229 229 491 312 312 126 126 292 292 292 292 292 292 292 292 292 1 21 21 21 21 408 408 408 408 408 391 391 391 228 491 373 373 338 400 400 400 400 378 378 345 389 389 389 314 8 354 420 420 420 422 342 342 224 494 494 129 129 74 190 487 499 499 265 85 85 146 368 453 238 6 272 34 494 236 314 196 196 309 309 309 479 331 231 231 231 231 349 164 164 214 214 214 328 200 200 464 145 460 460 460 169 402 96 272 300 382 313 216 216 114 258 258 258 271 271 39 433 433 433 390 160 18 112 427 56 56 170 312 312 312 187 187 292 12 12 12 12 12 12 12 12 12 408 163 163 163 491 316 491 316 491 491 289 289 289 7 7 309 309 309 479 331 231 231 231 231 169 164 164 164 214 214 214 214 328 328 200 303 117 404 404 439 439 439 439 439 237 237 237 421 421 421 421 491 421 128 491 128 128 128 128 193 193 17 +17 17 17 296 211 317 317 317 317 52 52 52 52 52 52 52 52 51 51 51 51 184 184 184 491 320 320 181 181 181 285 449 34 125 125 125 348 348 457 14 226 226 226 226 209 411 498 498 498 498 498 169 169 164 164 472 221 259 354 181 181 236 35 478 54 224 344 344 344 36 449 44 44 44 10 10 10 479 331 84 496 496 274 99 99 436 60 60 298 116 94 199 340 340 116 76 377 123 123 123 219 477 222 222 222 372 372 245 58 72 72 110 110 120 120 120 120 37 24 24 131 404 439 225 225 225 225 80 80 80 373 373 338 400 400 400 400 422 143 384 490 490 490 399 217 473 365 365 365 365 365 365 330 388 212 384 191 191 191 314 401 401 75 384 490 490 31 342 342 224 494 494 129 259 74 190 487 487 374 374 374 173 173 176 176 135 200 200 248 359 359 474 474 474 474 19 454 229 229 491 247 312 312 126 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 260 408 408 408 408 391 391 491 316 73 73 73 73 491 127 127 258 258 258 258 31 342 342 342 97 72 72 110 254 254 254 254 314 35 259 137 137 137 137 137 33 33 394 32 465 384 180 180 319 319 319 348 195 195 250 250 364 333 333 220 220 216 114 180 113 113 113 113 167 167 131 449 183 156 156 156 156 406 467 255 255 236 314 90 4 280 280 265 265 265 85 146 146 186 39 342 142 221 336 354 420 420 360 360 135 135 200 200 464 145 376 376 376 376 460 169 150 150 342 86 105 6 96 96 227 419 419 439 78 47 47 47 47 491 491 80 80 289 289 209 83 194 194 194 194 194 194 282 388 195 195 131 472 472 196 217 70 65 65 319 169 150 150 86 238 6 472 221 336 74 190 492 492 492 492 245 349 205 205 261 25 148 148 148 372 372 396 396 271 186 39 86 86 142 221 336 354 420 420 420 422 143 36 371 490 490 31 9 142 221 336 336 74 190 487 487 288 374 374 374 132 132 132 173 173 96 6 227 419 439 439 78 170 305 170 28 28 491 28 491 28 28 28 491 362 362 362 362 362 362 491 362 362 362 491 362 362 305 305 218 218 491 218 218 218 491 218 218 218 218 435 435 211 211 369 21 21 21 21 21 21 21 21 23 23 260 260 260 260 391 391 391 491 73 73 289 289 320 320 109 109 84 84 139 139 139 139 139 16 16 293 293 293 43 364 345 152 152 152 152 422 402 221 221 354 137 137 137 137 33 394 76 465 164 214 214 214 360 360 76 458 192 176 176 135 200 200 464 255 255 8 354 180 113 113 113 113 206 240 285 34 277 277 457 173 155 155 332 332 38 162 232 68 115 273 231 231 231 231 53 53 90 76 108 119 103 103 103 103 103 103 103 85 299 299 203 381 381 117 404 263 439 439 417 417 237 237 47 491 80 80 80 80 435 435 209 287 297 297 297 297 293 293 293 43 364 109 109 278 278 348 64 465 449 300 382 495 467 467 242 116 33 394 393 205 261 25 470 376 376 376 376 460 178 178 233 96 96 227 419 419 439 225 80 80 80 80 80 320 456 456 456 456 236 108 119 308 308 308 308 308 179 313 64 212 472 196 217 473 65 329 495 406 467 134 134 139 175 175 423 423 423 423 263 13 229 229 491 312 15 15 15 193 193 193 193 17 +17 17 17 363 363 363 363 363 408 51 149 228 491 491 320 7 473 258 258 258 31 342 224 494 494 368 453 168 180 145 329 329 175 175 81 81 469 416 416 96 453 168 470 365 365 365 330 348 212 300 300 382 313 186 162 232 232 105 105 336 470 432 432 330 330 64 64 77 449 224 300 156 382 245 43 43 345 141 141 281 453 342 168 230 230 230 215 35 74 183 485 286 286 382 245 245 43 364 276 174 174 174 348 348 64 64 212 93 93 93 93 93 301 8 8 255 255 349 349 155 155 148 148 372 372 245 245 458 458 208 190 487 487 278 258 31 342 342 86 105 196 217 473 459 459 271 271 39 433 433 160 168 89 55 322 67 394 76 310 338 338 400 400 400 400 30 324 422 186 162 68 68 115 470 470 120 240 240 314 310 338 400 400 400 400 301 378 345 141 141 281 281 9 221 336 144 106 496 88 319 146 135 339 76 36 377 87 87 416 259 445 180 443 443 240 325 34 44 44 44 251 251 241 431 278 26 302 302 497 497 122 32 401 82 144 498 498 498 498 498 139 302 293 497 497 497 122 393 155 155 165 165 165 165 466 466 448 448 464 255 38 38 162 68 115 273 273 265 265 85 85 146 146 175 81 81 242 203 399 70 65 410 410 410 410 173 280 29 29 406 467 89 446 67 58 72 72 72 496 496 496 215 215 35 96 96 272 449 242 275 275 275 303 195 199 335 188 188 340 340 466 22 283 455 38 162 232 105 105 336 491 336 190 380 288 288 288 328 328 200 303 303 117 48 78 491 491 491 491 421 421 491 201 193 193 193 193 +17 17 17 363 363 51 51 491 184 373 373 66 232 68 172 115 273 84 84 16 16 274 274 399 70 473 65 329 329 460 169 169 164 164 164 485 485 485 374 88 89 89 446 212 131 106 111 111 111 111 85 438 58 110 110 202 202 202 402 221 36 108 119 437 405 405 206 178 35 96 96 272 277 191 325 34 180 410 410 410 410 410 410 173 280 29 334 382 59 59 245 335 14 287 284 405 405 206 169 349 352 25 242 242 242 116 94 199 106 426 426 426 426 282 282 388 195 117 335 335 440 145 463 463 463 463 29 382 313 186 162 342 172 115 273 432 432 330 379 379 243 243 243 77 433 433 433 160 112 56 247 247 312 126 292 292 292 292 1 326 326 326 326 101 101 149 149 228 491 491 320 345 152 152 422 422 164 164 106 106 405 405 206 167 35 35 397 152 152 152 314 90 458 445 180 443 443 240 285 44 44 8 259 354 153 153 153 153 387 387 207 207 19 454 417 417 417 417 417 237 237 47 491 47 2 491 2 491 491 2 316 316 316 491 316 316 73 491 289 491 7 217 217 473 329 329 329 329 329 329 164 485 485 485 485 374 141 281 281 9 221 336 445 180 443 240 325 449 176 135 135 200 200 180 230 230 230 230 215 35 192 340 340 340 116 33 33 219 219 219 219 286 286 286 286 334 304 304 304 185 49 323 219 219 152 152 152 236 94 331 84 84 84 84 84 16 274 98 263 13 417 417 417 417 435 225 373 451 451 451 30 30 422 186 162 232 232 68 68 115 273 278 278 178 143 96 96 86 86 86 238 272 41 41 41 41 19 19 454 454 225 225 225 83 83 55 55 55 322 212 34 30 30 30 324 356 356 356 356 281 453 342 242 242 379 379 478 478 68 172 344 344 344 344 344 186 162 54 482 142 105 336 336 190 499 499 499 499 85 85 146 146 464 253 253 253 368 342 342 451 30 30 301 378 43 276 174 174 319 319 348 379 77 77 9 142 397 336 276 276 346 346 346 387 355 355 355 37 185 185 269 433 433 112 427 82 247 312 126 292 292 326 326 326 326 326 326 326 326 101 101 149 149 228 491 451 257 257 257 31 342 142 72 72 437 306 306 306 306 306 396 167 167 457 32 401 259 161 161 487 499 151 481 215 215 29 302 497 497 71 71 342 342 57 57 57 57 203 53 44 44 44 416 239 458 484 484 484 484 314 32 32 259 384 371 213 213 213 286 286 139 139 302 375 375 98 98 13 417 229 491 247 126 126 126 292 326 326 326 408 408 408 149 149 228 491 289 491 83 55 55 55 322 67 212 219 219 152 152 152 236 10 309 331 331 84 84 16 274 88 58 72 268 268 268 268 268 268 274 32 32 401 401 401 384 371 443 443 443 150 150 86 105 105 336 29 29 288 313 285 131 72 72 437 306 306 306 306 306 396 396 24 325 34 177 177 143 77 342 142 221 336 144 180 405 405 206 167 167 35 36 377 377 87 87 8 354 420 420 420 246 246 252 325 87 87 416 458 445 180 443 443 240 325 58 72 72 72 437 265 265 85 85 468 468 468 396 313 24 131 58 72 110 351 139 139 139 139 293 375 375 233 233 233 419 229 491 247 312 15 15 15 15 15 15 193 193 193 193 193 17 +17 17 17 296 296 363 52 52 52 52 52 51 51 51 51 184 491 491 412 0 0 222 356 356 281 9 196 196 479 331 463 463 463 463 29 29 382 245 335 14 14 226 226 226 226 209 209 475 475 475 475 475 475 475 324 301 8 354 180 151 240 240 325 41 324 324 422 36 377 87 87 354 420 420 420 324 3 58 72 72 110 110 486 486 486 460 282 37 24 35 259 159 159 159 236 35 198 127 114 84 496 496 274 186 162 482 482 482 482 482 238 6 272 371 485 374 374 374 8 354 29 191 191 191 37 24 131 472 225 72 72 72 110 110 486 486 460 460 460 169 352 352 402 221 401 336 79 79 288 84 496 496 413 348 250 250 81 278 278 285 285 302 302 497 497 349 234 234 234 261 190 380 288 288 330 64 64 76 310 107 447 447 221 336 354 153 153 153 153 387 387 304 304 185 185 269 433 160 112 427 491 247 312 126 292 292 292 292 292 326 326 326 408 408 408 149 149 228 491 412 83 55 55 55 322 212 34 34 253 253 31 162 482 482 115 485 485 374 374 374 339 94 199 253 253 253 253 453 9 219 219 152 152 152 301 236 239 384 371 371 374 374 132 132 416 416 445 445 180 443 240 385 131 133 133 364 276 174 174 174 319 348 33 250 394 212 465 190 380 380 496 496 274 143 458 192 192 340 340 33 394 108 377 123 123 219 222 222 222 222 245 245 43 43 276 109 109 403 403 403 207 318 318 318 49 342 168 89 89 116 33 76 108 119 437 437 405 405 405 206 167 167 457 35 77 68 342 273 231 231 231 203 53 76 198 164 214 214 214 328 200 200 117 229 229 247 126 126 326 326 408 408 391 228 491 491 373 451 30 30 356 356 368 453 168 180 230 230 230 230 230 215 35 35 35 401 89 89 89 446 67 212 131 106 106 284 405 405 206 169 349 402 402 6 272 123 123 216 216 22 283 455 251 241 431 405 405 405 215 215 169 270 86 238 6 300 382 382 245 458 445 445 351 351 365 365 365 365 388 94 199 495 495 406 337 41 41 318 318 49 9 168 157 157 157 467 313 313 216 22 22 283 38 162 232 232 238 6 272 470 470 171 171 171 358 358 358 233 270 270 433 433 433 160 18 112 439 439 439 439 237 237 237 237 237 237 237 237 80 80 491 435 435 412 83 415 415 415 131 393 234 261 261 25 498 498 498 498 498 396 186 39 54 86 238 6 472 472 196 217 217 473 65 486 486 460 460 169 164 164 485 485 485 152 152 422 162 323 224 224 494 494 236 36 310 395 470 470 151 151 150 39 86 342 272 191 191 191 314 90 401 259 445 180 443 240 325 176 135 200 200 199 44 44 44 58 72 72 72 350 350 350 350 350 413 413 53 250 250 212 354 354 153 153 153 387 387 387 207 207 19 454 229 82 247 126 126 126 126 326 326 326 326 326 326 326 326 326 101 408 408 149 391 491 289 289 289 320 159 159 159 240 285 111 111 111 111 438 438 186 162 342 68 273 470 120 240 240 314 196 196 309 479 331 331 84 84 84 16 16 274 274 349 349 234 234 261 425 386 431 376 376 460 167 167 36 108 377 123 123 216 127 114 92 92 92 92 92 92 282 385 385 233 227 419 439 417 417 237 237 237 421 491 421 421 491 491 128 491 128 193 193 17 +17 17 17 296 211 211 52 52 52 363 363 363 408 51 51 228 491 491 320 114 0 0 0 301 399 473 65 476 476 476 171 252 8 420 420 420 324 464 106 297 297 297 297 297 293 293 42 42 42 147 380 499 499 499 428 428 85 85 85 207 207 358 24 34 34 111 111 319 203 53 10 479 307 307 307 307 61 167 167 478 478 68 68 172 115 470 403 403 403 403 135 135 135 200 248 212 127 114 222 222 468 313 313 10 10 479 331 307 307 307 307 426 426 206 206 206 385 24 227 419 419 439 439 225 225 225 225 225 80 80 289 320 159 159 159 159 236 35 196 196 479 331 231 231 231 16 274 274 274 251 251 241 431 431 319 319 348 64 64 212 34 242 242 116 394 478 162 482 482 238 6 161 487 487 213 213 252 252 335 14 411 145 145 486 486 468 468 467 467 467 134 215 8 270 270 86 9 142 393 155 332 332 332 245 399 217 429 429 429 429 246 246 246 19 19 454 454 225 225 417 417 80 80 412 287 111 111 111 438 438 186 162 342 68 115 273 470 120 120 120 37 24 24 404 427 229 491 247 312 126 292 292 292 326 326 326 408 408 408 391 228 228 289 289 289 320 209 445 278 278 278 314 314 196 217 429 429 429 429 464 464 44 44 44 10 10 10 309 479 331 171 171 171 252 325 34 494 173 402 402 221 259 354 354 153 153 153 387 372 396 285 415 415 415 415 457 26 251 241 431 444 444 213 213 246 358 358 39 433 433 86 86 6 6 227 419 439 417 417 237 237 237 237 491 491 491 47 47 491 491 491 316 316 316 73 73 80 435 412 114 0 139 139 139 293 293 8 420 420 420 420 464 44 44 44 44 42 42 147 147 380 288 278 278 278 271 271 39 342 86 105 105 144 472 196 196 331 331 231 231 274 399 217 473 65 486 460 240 285 300 382 245 58 72 72 489 489 374 132 132 8 152 152 152 152 324 416 458 445 445 180 120 120 120 37 385 233 227 419 427 229 491 247 312 126 292 292 292 292 292 326 23 23 326 326 326 101 101 101 149 149 228 491 289 320 159 159 285 285 106 111 111 284 481 293 169 349 205 205 25 485 485 485 139 139 293 497 335 14 411 411 213 213 213 213 213 318 368 368 453 168 41 324 485 382 406 467 467 340 340 340 116 33 250 70 46 46 46 46 438 438 399 217 70 65 480 480 480 480 480 480 85 299 299 299 299 339 64 212 89 89 322 116 394 478 478 232 232 68 26 26 81 444 213 252 215 129 401 478 232 68 68 115 273 470 315 315 315 450 450 413 64 64 131 300 382 382 467 415 415 236 35 196 196 479 331 265 428 428 85 146 358 233 270 342 224 118 118 118 118 402 345 152 152 152 458 445 180 443 443 285 34 44 44 8 32 259 354 153 153 153 372 372 467 467 299 394 76 465 445 351 351 116 94 199 331 171 171 171 171 252 325 34 324 324 464 275 275 275 303 48 48 417 417 417 491 237 237 237 491 421 421 421 491 128 128 491 128 491 305 128 128 193 193 17 +17 17 17 296 305 317 317 491 317 491 317 461 491 461 461 435 435 491 435 435 491 491 435 289 373 66 68 115 273 273 84 16 88 88 109 340 340 340 466 466 22 283 448 448 448 464 464 432 432 432 330 330 388 195 64 131 133 345 152 152 152 422 314 239 371 490 490 38 342 68 115 273 106 265 265 265 85 146 146 325 34 191 191 191 37 314 36 377 87 87 87 14 14 145 145 376 376 460 460 150 150 342 105 221 336 96 196 217 473 258 258 31 342 224 494 494 494 31 162 232 86 105 336 354 470 432 432 330 379 64 77 77 224 224 300 334 334 59 313 313 36 377 87 87 87 129 74 74 351 278 416 416 144 180 180 151 240 368 453 342 168 180 113 113 113 113 450 167 35 131 133 133 364 364 276 174 174 174 174 348 348 195 195 250 250 345 409 409 409 116 64 76 310 338 400 400 30 301 378 43 345 109 109 330 330 64 76 449 449 180 410 410 410 410 8 29 29 382 313 236 36 377 87 87 416 458 445 180 443 240 385 131 58 156 156 156 156 313 313 251 251 81 431 278 285 26 302 302 497 497 416 458 144 498 498 498 498 498 134 302 375 375 98 98 13 229 229 491 312 312 126 292 292 292 326 326 326 326 326 326 326 326 326 326 326 326 326 326 326 101 101 101 101 149 149 228 491 491 320 152 152 152 422 58 58 72 498 498 498 498 396 313 314 35 26 241 241 376 376 376 460 169 150 86 86 6 272 472 397 354 109 213 213 213 358 143 458 96 99 338 400 400 400 301 378 8 141 141 281 281 9 221 221 144 180 84 84 496 88 88 176 176 176 328 328 200 117 117 454 454 439 78 491 491 312 126 126 326 326 326 101 408 408 149 228 491 373 66 66 115 273 84 84 16 43 43 345 152 152 152 422 162 68 68 115 273 273 432 330 330 64 131 131 183 156 156 156 156 156 156 245 43 43 364 276 276 109 498 498 498 59 396 313 24 131 472 259 354 62 62 62 62 438 438 42 147 380 288 329 329 36 107 395 300 382 313 314 478 478 478 172 105 336 470 432 432 330 330 33 394 77 54 107 395 382 382 313 186 31 54 142 393 336 25 25 496 496 496 496 274 215 233 270 270 342 224 415 415 325 472 458 144 27 437 437 306 306 306 396 396 53 53 469 469 24 325 41 41 41 324 422 36 108 377 87 87 8 239 190 380 288 360 360 200 200 464 459 271 31 342 224 44 44 38 162 232 232 482 105 105 196 70 65 65 306 306 306 396 396 385 131 472 225 225 225 225 225 225 7 251 241 431 266 266 266 266 146 178 35 35 401 26 359 359 166 166 324 301 8 129 354 354 153 153 153 153 387 387 387 207 464 464 464 69 130 130 280 255 255 236 8 354 180 113 113 113 113 113 450 167 167 457 401 401 401 75 108 119 351 351 351 432 330 388 199 199 495 495 406 467 134 302 251 251 241 431 443 443 443 173 280 29 275 275 275 303 303 303 48 13 229 491 491 312 312 312 292 292 292 292 292 21 21 21 21 21 21 21 21 21 408 408 149 149 149 491 491 491 320 152 152 152 422 143 384 490 490 490 31 342 68 115 273 470 265 265 428 85 146 146 325 325 191 191 191 191 314 314 198 127 114 114 92 92 92 167 457 364 345 389 389 314 129 259 354 420 420 420 301 216 22 283 455 236 259 354 180 443 443 443 169 150 150 39 342 86 238 272 371 470 93 171 171 171 358 358 233 310 107 107 112 439 417 417 237 237 128 193 193 193 +17 17 296 296 296 184 184 412 209 287 424 424 424 424 424 274 274 122 285 34 34 242 116 479 331 230 230 230 169 349 402 96 36 377 87 87 87 129 354 420 420 420 420 246 3 464 223 223 130 402 478 232 232 232 172 115 273 231 231 231 231 203 53 53 219 219 219 219 219 485 374 374 132 132 186 39 54 342 224 89 340 116 33 394 212 384 371 374 374 88 88 176 176 135 200 200 248 76 465 310 107 395 395 441 441 153 153 153 182 372 372 372 372 304 304 185 185 269 269 9 142 97 397 336 147 380 499 499 428 85 146 146 325 34 106 106 106 426 426 426 426 206 169 169 352 352 352 352 352 352 97 97 225 225 225 83 55 55 55 322 67 64 212 219 219 219 464 180 180 319 319 348 200 464 242 116 94 331 230 169 169 402 402 6 377 87 87 420 420 420 422 422 129 310 161 161 487 487 288 288 290 290 434 434 339 64 212 131 180 230 230 230 167 167 457 401 401 491 190 190 190 488 488 488 405 206 215 215 35 29 334 334 59 59 452 452 263 229 491 247 312 126 292 292 292 1 1 1 1 21 21 21 21 21 21 21 260 260 260 260 391 391 391 491 491 320 345 152 152 152 301 399 217 473 360 360 360 434 339 64 64 108 377 87 87 416 445 485 278 173 280 57 57 57 53 473 44 44 44 416 129 259 144 484 484 484 285 131 58 72 72 72 437 350 350 350 350 350 413 203 381 335 335 14 440 145 194 446 446 33 394 478 478 482 482 482 482 105 336 208 441 153 153 153 182 182 175 81 176 176 328 328 303 117 48 417 417 417 417 237 237 237 491 47 80 491 80 491 7 7 152 152 152 58 58 110 110 254 254 240 34 44 44 236 36 108 119 119 351 486 139 175 175 81 81 469 416 8 79 380 288 288 365 365 282 203 203 53 394 393 155 155 332 332 165 399 217 473 258 258 258 31 342 224 494 494 368 453 168 168 145 329 329 329 175 81 81 469 416 416 453 453 470 365 365 365 365 388 64 212 300 382 382 313 186 54 54 105 336 354 470 432 330 379 379 77 77 54 224 300 334 313 236 36 377 377 87 236 236 93 93 93 93 93 93 207 207 207 207 19 454 229 247 247 126 126 126 326 326 326 326 326 326 326 326 101 101 149 149 491 289 491 127 5 5 455 399 217 473 65 290 290 171 139 139 139 293 293 399 217 65 136 136 136 136 282 388 33 394 32 259 354 190 380 499 405 405 206 206 285 449 34 277 277 24 314 393 155 155 165 165 165 165 466 22 22 283 38 162 342 238 6 272 470 470 171 171 171 358 99 436 436 60 60 298 298 303 303 117 48 229 491 247 126 126 326 326 326 408 408 408 149 228 491 373 66 68 68 68 273 470 403 403 403 403 207 135 135 135 200 200 248 212 127 0 0 0 0 378 378 347 347 347 347 245 143 458 144 27 437 437 319 319 319 53 53 176 176 135 328 200 200 199 125 125 125 125 348 466 283 455 38 349 234 234 261 25 346 265 265 85 85 146 146 438 349 349 234 234 261 164 273 498 498 498 313 285 34 41 324 324 422 143 259 161 161 161 487 487 288 290 290 290 434 434 434 339 394 36 377 377 87 236 10 479 331 331 428 428 428 428 207 207 358 358 233 465 227 419 439 78 421 491 491 193 193 17 +17 17 17 296 296 184 184 184 435 435 66 172 115 273 273 84 344 16 274 399 399 473 65 486 486 486 460 460 169 164 164 164 485 485 485 301 378 43 364 109 109 189 330 330 64 76 465 377 123 123 236 32 259 354 190 380 499 428 428 85 146 146 35 35 133 133 147 288 288 278 173 280 29 29 382 313 236 108 377 87 87 399 217 473 213 213 213 252 325 325 183 57 57 57 57 203 381 117 404 13 229 491 247 312 126 292 292 292 292 292 292 21 326 326 326 408 408 408 408 149 149 228 491 320 217 473 258 258 258 342 342 224 494 494 494 258 31 162 232 232 68 68 105 105 336 470 329 329 330 330 379 64 77 342 224 300 300 382 245 245 43 345 109 389 497 497 122 239 161 79 499 499 405 206 215 35 29 57 57 57 203 70 106 426 426 426 426 169 169 352 352 402 198 127 114 114 264 264 264 264 59 59 59 452 263 263 417 417 417 417 170 170 47 47 491 491 2 2 47 2 316 2 491 491 316 316 73 73 289 435 435 83 255 255 130 402 458 144 441 441 153 153 372 372 396 271 186 39 342 323 97 427 247 247 126 126 326 326 326 326 101 101 149 149 491 373 338 400 400 400 400 30 301 416 416 180 180 84 84 496 496 274 71 368 368 453 168 106 426 426 426 426 413 348 64 465 377 123 123 123 43 276 346 346 346 428 85 146 146 252 36 478 66 68 115 470 486 365 365 365 330 388 33 77 77 342 68 238 6 272 470 171 171 252 99 99 436 60 60 116 94 58 58 156 156 156 313 186 186 162 68 115 273 273 279 279 279 279 279 375 375 352 352 352 352 352 352 112 112 417 417 237 237 237 237 237 237 491 237 237 491 237 237 237 362 362 362 362 491 491 362 362 362 491 218 491 218 491 491 211 218 218 366 366 491 491 366 366 366 366 491 366 366 366 366 163 316 316 316 316 73 73 491 320 7 473 258 258 258 31 342 224 494 494 494 31 9 142 397 147 380 329 329 329 329 329 310 107 395 302 302 497 497 122 129 259 190 190 190 488 499 265 265 85 146 146 325 325 34 382 313 285 325 183 156 156 156 156 396 313 186 162 172 115 273 279 279 279 279 279 293 169 352 352 155 125 125 322 94 335 14 14 411 297 297 297 297 297 293 43 345 109 109 109 171 422 186 162 68 68 68 105 105 336 354 213 213 213 143 192 192 135 135 135 200 248 58 156 156 156 156 245 245 399 70 65 480 480 480 480 85 299 299 299 303 243 227 419 427 56 491 247 312 126 292 292 326 326 326 326 326 326 326 101 101 408 228 228 373 338 338 400 400 400 400 301 143 129 74 190 492 492 492 186 162 342 172 444 444 444 444 252 325 325 191 191 191 314 36 108 87 87 87 38 342 86 105 336 470 213 213 213 143 458 192 277 277 277 314 196 196 479 331 331 315 315 315 315 450 450 450 98 263 417 417 417 225 225 225 72 72 110 202 202 202 202 202 280 135 135 135 200 464 464 255 255 236 239 259 107 395 180 151 151 169 150 150 86 238 6 272 191 191 191 240 58 183 156 156 156 156 245 399 399 217 217 473 432 432 330 348 64 212 449 302 302 497 497 14 14 411 145 145 486 460 240 325 449 469 469 469 236 259 108 449 485 485 374 374 374 37 24 259 377 377 123 123 216 22 283 283 38 162 68 342 224 494 494 399 217 217 473 290 290 171 171 171 252 318 368 342 342 176 176 176 328 200 248 248 76 74 485 213 213 213 213 186 39 342 224 462 462 462 462 402 196 196 398 398 398 398 398 374 374 132 132 185 185 185 323 390 18 112 427 56 56 491 491 15 15 15 15 15 193 193 193 193 17 17 +17 17 17 17 296 363 52 51 51 51 51 491 184 184 491 184 7 7 7 364 276 109 109 109 443 443 139 139 293 293 293 497 399 217 70 473 65 329 495 406 406 467 134 139 139 175 423 423 423 423 423 263 263 417 417 417 237 237 237 237 237 201 237 80 435 435 435 440 287 111 111 111 111 139 139 293 293 293 122 35 310 107 395 395 151 151 31 342 342 86 238 6 108 119 119 351 443 151 139 240 240 219 219 477 477 477 477 477 132 8 259 74 74 425 425 386 386 290 290 290 290 434 434 434 434 434 339 466 212 127 45 45 45 325 34 111 111 111 111 111 438 438 438 422 349 164 164 214 214 214 360 360 200 248 76 465 219 219 152 152 222 498 353 353 313 236 239 371 371 374 374 88 88 176 135 135 135 200 44 44 44 399 70 65 65 428 428 146 146 252 449 449 324 324 422 349 349 234 234 261 25 441 153 153 153 153 132 81 81 459 459 469 99 447 447 447 447 238 336 214 214 214 214 214 328 328 200 303 303 404 404 229 491 247 312 126 326 326 326 101 101 101 149 149 228 491 287 287 44 44 44 44 44 42 42 42 147 147 380 288 278 278 31 342 86 86 105 105 336 485 41 324 324 422 349 164 164 164 214 214 214 214 328 328 200 200 200 200 248 248 248 127 114 92 92 92 92 169 35 77 66 142 397 397 276 346 346 346 355 355 37 37 24 227 419 419 439 78 491 491 312 312 312 312 292 292 1 21 21 21 21 21 408 408 408 408 149 228 491 289 219 152 152 152 152 236 325 371 180 84 84 496 350 167 457 457 479 331 84 84 84 16 274 43 43 276 181 181 181 181 35 449 449 485 152 222 353 353 245 416 458 445 180 443 443 240 325 449 176 176 135 328 200 117 117 48 414 414 47 47 47 47 491 491 47 491 491 80 491 7 7 219 219 152 152 222 353 372 245 245 245 129 259 354 190 380 288 288 360 360 200 135 135 135 135 200 200 44 44 44 44 162 232 482 482 482 238 336 161 487 288 290 290 290 434 339 339 64 76 107 447 447 6 6 119 351 437 91 91 265 85 85 85 139 139 293 122 122 131 34 340 340 116 33 394 465 377 123 123 219 477 222 222 222 372 372 245 58 72 268 268 268 268 268 268 169 186 269 323 224 242 116 33 58 58 72 350 350 350 350 274 274 203 381 117 229 247 247 126 126 326 326 326 326 326 101 149 149 228 491 412 83 55 55 55 55 322 67 212 219 152 152 152 152 132 236 239 239 371 180 84 84 496 274 274 274 457 196 479 331 84 84 274 88 88 44 44 44 38 232 232 68 68 115 273 278 360 360 200 200 64 212 302 302 302 497 497 349 205 259 214 214 214 214 200 200 464 255 255 8 354 180 113 113 113 113 113 167 285 449 57 57 57 57 203 203 195 10 309 331 157 157 157 157 372 245 245 43 364 364 181 181 181 181 285 449 34 356 281 453 342 6 272 490 490 490 31 9 105 336 336 494 494 494 368 453 168 418 418 418 99 436 436 60 60 298 116 199 356 356 281 31 9 26 26 241 266 266 266 266 266 146 146 358 143 458 192 472 196 309 479 331 157 157 157 157 372 372 245 245 43 364 276 181 181 181 167 167 35 478 478 68 224 273 153 153 153 396 285 285 462 462 462 402 129 259 74 74 351 351 351 351 264 468 468 468 468 467 467 467 11 275 379 379 77 77 342 342 451 30 30 30 30 58 58 110 110 110 486 486 460 460 240 24 131 404 229 247 126 326 193 193 17 +17 17 363 51 51 228 491 7 309 479 331 157 157 157 387 372 372 396 313 58 72 110 268 268 268 268 268 274 274 183 451 30 30 30 356 368 342 9 26 251 241 266 266 266 266 178 458 96 26 359 474 474 301 236 87 87 87 87 36 108 119 308 308 308 308 396 313 94 199 180 113 113 113 113 450 450 413 233 227 419 439 78 170 491 312 187 187 187 187 12 12 12 12 260 260 260 391 391 149 491 491 491 7 7 276 346 346 346 265 85 85 146 464 177 177 177 177 133 133 141 141 141 281 342 168 106 350 350 350 350 348 250 359 166 166 324 301 251 251 241 376 376 376 376 460 169 150 342 86 238 272 397 397 109 109 213 213 213 143 458 144 180 106 111 111 111 438 438 42 147 147 380 288 443 240 240 325 34 340 340 116 466 22 283 455 129 74 351 351 351 171 171 252 215 215 259 29 334 334 59 59 245 58 72 72 268 268 268 268 88 88 88 44 44 399 217 217 473 65 136 136 136 136 136 136 136 282 388 94 34 89 340 116 131 183 257 257 257 257 281 9 142 221 336 364 276 346 346 428 428 146 146 349 205 352 106 230 230 230 215 215 35 35 133 364 364 276 109 109 443 443 443 169 150 39 86 86 238 6 272 69 223 130 198 22 448 448 464 106 106 265 85 85 85 146 175 175 81 81 275 275 116 64 131 427 229 247 126 326 326 326 326 326 101 101 149 228 289 289 491 108 377 295 295 295 295 35 192 44 44 44 8 8 8 354 153 153 153 387 387 387 146 464 464 113 113 113 113 206 285 449 34 69 223 130 44 44 44 94 335 14 411 411 153 372 372 372 396 349 349 234 261 25 242 116 94 199 255 38 31 342 68 115 273 106 265 265 85 85 85 175 175 81 81 203 203 381 404 335 440 55 55 322 67 131 183 451 451 30 30 30 422 186 162 68 68 115 273 189 443 240 385 131 472 393 393 234 234 261 261 25 265 265 265 85 146 146 300 382 382 313 143 36 377 123 123 216 283 283 455 72 72 268 268 268 268 268 169 169 39 342 342 224 415 415 415 314 401 196 479 331 428 428 428 428 358 358 233 36 227 427 427 247 247 312 126 292 292 292 292 292 23 408 408 408 408 391 491 491 373 66 66 68 68 115 273 470 443 240 325 449 277 277 277 277 325 335 14 14 287 284 125 125 125 348 348 195 33 394 76 401 82 74 492 492 492 492 396 215 35 354 459 459 459 271 39 342 86 142 196 70 65 65 495 406 406 467 288 139 139 175 175 423 423 423 423 263 229 229 247 126 126 326 101 408 149 149 491 412 83 83 55 55 322 322 67 10 10 309 479 398 398 398 398 468 468 313 359 359 166 166 166 324 301 301 32 32 32 354 354 498 498 308 313 348 64 76 198 198 114 57 57 203 53 76 465 377 377 123 123 123 88 44 44 44 129 458 208 208 190 487 278 278 31 342 86 105 336 336 354 340 340 116 466 466 114 222 222 222 468 245 8 8 354 470 120 120 330 240 379 243 233 270 270 433 433 160 112 112 56 56 421 491 421 491 491 491 421 421 128 491 128 128 193 17 17 +17 17 17 296 296 317 305 305 317 461 491 491 435 435 435 435 287 83 194 194 194 194 322 67 212 34 111 111 111 111 438 438 10 479 331 84 84 88 88 88 44 44 348 10 10 479 331 493 493 493 216 300 300 382 245 143 465 445 351 351 343 343 343 171 358 368 342 9 142 397 336 345 347 347 347 406 467 467 467 340 116 199 255 255 236 236 384 180 106 405 405 405 215 215 96 272 449 191 191 191 314 314 32 401 259 354 153 153 153 387 387 387 146 146 219 219 219 219 485 374 374 368 186 323 323 238 6 272 87 87 87 38 162 68 68 68 68 115 273 151 151 178 178 35 458 96 472 164 198 22 448 448 448 448 464 180 443 443 120 120 120 416 416 233 233 270 49 433 433 433 160 427 247 247 126 126 126 292 326 326 326 326 326 326 408 408 149 149 228 289 491 127 114 0 0 0 0 422 143 458 144 27 389 389 389 389 314 35 196 242 242 33 33 76 465 401 259 354 190 380 288 288 295 143 458 192 183 57 57 57 203 88 69 223 223 223 130 280 277 277 277 277 385 24 227 419 419 439 439 439 439 237 237 237 237 47 47 47 491 491 316 491 80 373 412 412 188 188 118 118 118 118 118 118 402 219 219 152 152 152 132 132 58 58 72 110 110 254 254 240 325 34 145 145 460 460 169 150 342 86 6 472 221 70 46 46 46 46 464 464 255 255 240 314 4 280 106 265 265 265 85 85 146 358 39 39 342 342 224 340 340 466 466 22 283 399 473 65 486 486 460 460 285 449 334 334 382 59 452 229 229 247 126 126 326 326 326 326 326 101 101 101 149 149 228 491 289 320 345 407 407 407 407 35 36 310 107 447 219 219 219 152 152 152 132 236 32 239 384 371 371 278 278 325 242 242 242 379 243 243 36 227 472 472 221 336 336 384 371 374 374 374 374 132 132 132 399 70 473 65 329 329 42 406 467 134 139 139 175 423 423 423 423 423 452 263 229 259 247 312 126 292 292 23 23 23 408 101 149 149 149 228 491 412 287 111 111 111 111 111 438 438 325 34 202 202 202 402 402 162 232 68 68 172 115 470 470 120 120 240 240 314 314 131 393 393 393 155 155 332 332 332 372 372 245 399 399 217 217 217 70 65 65 498 498 498 186 186 54 54 172 224 41 324 324 422 186 162 232 232 68 68 68 68 115 470 470 403 171 171 252 416 458 401 196 196 309 331 307 307 307 61 167 35 35 108 377 87 87 38 164 164 164 164 164 214 214 214 360 200 200 76 458 192 69 223 223 402 66 342 224 344 344 344 449 449 44 44 44 38 164 164 164 214 214 214 214 214 328 200 200 248 248 212 127 114 92 92 92 92 169 35 77 77 66 86 142 397 397 336 276 346 346 265 355 37 37 24 227 419 419 439 439 439 78 237 170 491 421 421 491 491 491 491 341 15 15 15 15 193 193 193 17 17 +17 17 17 17 296 52 52 52 52 52 52 52 52 52 461 51 51 51 184 491 184 184 7 7 7 127 127 258 258 258 258 258 39 342 342 86 86 238 221 336 336 401 310 107 395 395 329 84 84 496 496 496 496 274 274 215 8 96 270 342 86 221 221 144 27 437 437 319 319 53 53 76 205 29 29 469 469 24 325 176 176 328 328 200 200 195 248 49 49 68 68 68 444 444 444 444 444 434 434 434 339 394 212 131 472 472 196 309 479 331 331 265 265 428 146 146 216 300 300 382 236 36 377 87 87 87 88 44 44 44 349 349 234 234 261 261 25 432 432 432 432 330 330 388 195 195 195 195 195 64 212 131 472 472 221 309 479 157 157 157 157 372 313 236 108 377 123 123 123 88 88 88 255 255 251 251 241 431 431 306 306 306 306 306 306 396 203 53 381 217 70 65 65 329 495 406 406 134 134 139 175 175 423 423 423 423 423 263 263 417 417 417 417 237 237 237 47 47 47 491 491 435 435 435 435 373 338 338 338 400 400 400 30 422 94 199 398 278 278 325 449 191 191 191 314 314 478 478 68 68 68 238 6 371 470 443 443 240 325 26 134 359 359 359 474 474 324 324 464 464 426 426 426 426 426 426 282 388 303 303 48 48 417 170 491 170 491 28 28 28 491 28 362 491 362 362 491 362 491 362 362 40 491 491 211 211 369 369 369 369 369 369 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 260 391 391 391 491 73 289 412 412 287 287 111 111 111 111 438 438 24 384 371 180 84 84 350 274 167 314 36 384 490 490 490 116 479 331 331 265 265 265 85 85 146 146 216 127 300 382 382 313 186 162 232 172 115 231 231 231 231 53 76 76 164 214 214 214 328 200 200 340 340 116 250 250 345 181 181 181 181 35 131 219 152 152 152 422 186 162 232 172 115 273 470 403 403 403 207 301 301 42 147 147 329 329 329 329 252 143 310 107 395 302 302 302 497 98 98 13 417 417 417 417 237 237 237 237 237 237 237 80 80 491 491 412 412 287 287 111 111 111 438 202 202 402 58 72 110 110 110 460 240 240 35 77 478 68 224 231 231 231 53 90 90 76 465 208 208 441 441 106 481 481 426 426 426 426 203 53 381 471 49 49 342 142 221 196 46 46 46 46 438 186 162 68 68 115 273 279 279 279 279 279 279 375 169 352 352 352 352 427 229 491 247 126 126 292 326 326 326 326 326 326 101 101 149 149 228 228 289 320 159 159 159 159 159 35 196 196 217 473 329 329 329 329 460 329 164 164 485 485 485 485 423 132 378 43 345 141 141 141 281 9 86 86 6 108 119 119 351 351 264 468 468 468 467 134 134 134 8 100 100 497 497 186 162 68 68 115 273 470 443 240 285 449 34 125 125 125 125 348 199 199 277 277 277 385 227 227 419 439 417 417 237 237 237 237 237 237 80 80 80 491 412 412 287 287 111 111 111 438 438 143 144 389 389 389 314 478 478 68 68 172 267 267 267 267 267 301 216 127 114 92 92 92 92 92 240 240 143 35 36 478 66 172 224 273 84 84 16 88 88 111 111 111 111 438 438 416 416 445 445 210 210 210 171 252 173 173 280 34 120 120 120 120 388 303 303 303 48 417 417 417 170 491 491 491 421 128 128 193 193 17 +17 17 17 17 296 363 363 363 363 51 51 228 491 412 412 177 177 177 177 356 478 66 68 68 172 115 273 344 344 344 274 274 186 162 232 232 172 115 273 273 139 293 293 293 122 122 272 34 242 319 203 53 381 217 217 473 65 486 486 460 169 169 164 164 485 485 485 374 422 186 162 68 68 273 470 443 443 240 71 71 342 224 257 257 257 257 453 9 196 217 70 65 480 480 480 480 299 299 299 339 212 34 106 125 125 125 388 94 199 475 475 475 475 475 475 475 475 422 349 164 164 214 214 214 214 328 328 200 200 248 212 127 45 45 45 45 385 131 133 133 364 409 409 409 409 348 94 183 183 451 451 30 30 301 236 36 384 71 71 71 71 71 71 71 71 71 368 453 342 168 106 111 111 111 111 438 464 106 297 297 297 297 297 43 109 109 109 469 186 39 342 86 142 393 261 25 444 213 213 139 139 251 241 81 177 356 236 71 71 142 221 196 70 46 46 46 438 438 236 239 384 485 485 485 374 374 252 449 449 41 41 41 324 3 143 36 377 87 87 87 416 445 445 278 278 173 280 34 120 120 120 275 388 303 303 303 117 404 78 491 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 408 408 408 149 149 491 412 412 83 55 55 322 67 212 131 34 253 253 253 253 31 342 342 86 142 221 155 332 332 332 332 332 216 283 455 42 42 147 380 288 278 278 278 271 39 342 433 433 105 105 458 192 419 439 439 417 417 237 237 237 237 237 237 237 237 237 237 491 237 80 80 435 80 491 491 127 114 0 0 222 468 356 281 453 9 142 221 336 147 380 288 278 278 31 342 86 86 105 336 270 270 342 224 494 121 203 53 394 394 465 259 190 190 487 104 104 325 41 324 324 301 10 309 398 398 398 398 468 245 335 14 411 411 204 204 204 204 204 204 29 337 337 337 324 422 164 164 164 214 214 214 214 214 200 200 464 415 415 236 129 259 354 354 91 91 206 206 285 285 41 41 324 301 236 239 384 71 71 71 71 71 71 368 342 168 340 340 340 466 466 114 258 258 258 31 142 142 397 397 364 109 109 498 498 134 139 375 375 375 122 122 131 427 229 491 247 126 126 292 292 292 292 326 326 326 326 326 101 101 408 149 228 491 491 127 114 222 222 468 468 356 356 281 9 9 142 42 147 147 380 288 278 278 31 31 342 86 105 105 336 458 270 270 224 89 89 203 53 394 465 465 74 485 213 213 252 215 129 354 100 302 497 497 49 342 58 72 110 202 202 202 202 202 280 176 135 135 200 248 248 310 107 107 395 395 106 153 153 387 122 122 161 300 242 242 116 94 199 223 223 130 198 198 222 222 222 222 406 406 467 467 350 350 350 350 350 350 350 413 413 413 195 199 118 118 118 118 402 177 177 177 177 458 144 351 351 319 319 319 71 71 71 71 49 86 238 6 123 123 123 216 216 114 92 92 92 92 92 92 92 282 385 385 131 419 427 229 247 247 126 126 292 326 326 326 326 326 101 101 149 149 228 289 289 491 127 114 0 0 0 0 0 252 252 325 180 106 350 350 350 350 413 413 465 131 106 106 297 297 297 297 43 109 109 109 109 318 31 39 142 6 272 119 308 308 308 308 313 116 94 199 331 486 113 113 167 167 457 364 276 109 109 139 139 139 375 375 98 98 13 417 417 417 417 237 491 237 421 421 491 491 491 491 193 193 17 +17 17 17 296 296 363 363 363 363 363 51 51 149 228 228 289 412 83 83 194 194 194 194 194 194 388 388 64 64 131 472 198 127 361 361 361 361 361 388 67 10 10 479 331 331 84 496 496 173 173 280 29 255 38 162 54 482 105 105 336 144 496 496 496 496 274 99 99 436 395 395 50 50 50 31 9 142 397 147 380 499 428 428 146 167 457 35 401 259 208 208 386 386 496 496 496 496 186 39 86 238 6 377 123 123 123 22 448 448 448 464 180 106 265 265 85 85 146 134 175 81 81 275 275 388 303 243 131 419 439 439 225 417 80 80 491 491 209 188 177 177 177 325 356 356 356 281 342 342 168 242 242 116 64 212 34 253 253 368 453 342 168 118 118 118 118 118 205 402 152 152 152 152 378 378 345 347 347 347 313 416 458 445 180 443 240 325 325 176 135 135 200 200 248 183 57 57 57 57 203 53 76 205 155 165 165 165 165 165 335 14 411 411 360 360 360 200 200 248 248 248 441 302 81 81 275 275 116 64 212 131 157 157 157 157 157 216 216 22 283 455 38 162 68 68 6 272 470 470 171 171 171 171 358 358 358 358 270 270 270 433 160 112 427 229 247 247 126 292 292 326 326 326 326 326 326 101 408 408 391 228 491 491 373 451 451 30 143 458 445 445 351 365 365 365 460 460 76 465 465 420 420 420 324 301 399 217 217 383 383 383 383 383 383 310 310 447 447 6 336 371 278 278 349 349 155 29 242 275 116 394 90 393 155 332 165 165 53 65 353 353 353 353 396 186 162 342 115 273 279 279 279 279 279 279 293 169 169 352 270 433 390 390 18 112 112 439 439 78 56 56 491 491 28 491 491 312 491 341 341 12 12 12 12 292 21 21 21 21 21 21 21 21 21 21 21 21 21 369 260 260 260 260 260 260 40 40 40 40 40 40 163 163 491 491 305 305 491 316 316 316 73 491 491 320 345 109 109 139 139 139 175 175 81 111 111 111 111 438 438 438 58 72 72 72 72 72 437 496 496 496 496 496 215 35 35 354 177 177 177 131 133 345 389 389 497 497 36 108 108 308 308 308 308 308 313 94 199 113 113 113 113 206 285 285 106 106 297 297 293 293 42 42 147 380 499 428 428 428 146 358 358 233 227 419 419 439 417 417 417 237 237 237 237 237 237 201 237 237 201 201 201 80 373 435 435 108 179 179 179 179 179 314 196 217 473 258 258 31 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 252 310 107 395 302 302 302 497 175 175 81 89 340 94 199 255 255 236 36 119 119 351 351 496 350 350 350 413 413 466 466 22 45 45 236 129 129 82 74 74 425 425 386 386 386 290 290 290 290 434 339 33 359 359 166 166 166 3 14 411 188 121 121 116 64 212 384 469 469 416 143 458 445 158 158 158 158 158 325 34 191 191 314 131 58 156 156 156 156 245 8 129 259 74 74 351 351 290 290 290 290 434 339 339 195 248 90 393 393 155 262 262 100 100 497 497 497 122 239 384 371 180 180 486 315 315 113 450 450 450 167 37 233 270 270 433 390 390 18 112 112 439 439 193 193 193 17 +17 17 296 296 184 491 209 287 350 350 350 350 350 350 250 359 359 81 166 166 324 324 422 314 32 239 384 371 180 84 350 350 350 413 413 243 131 472 232 232 232 68 115 273 470 470 403 403 171 464 464 111 111 111 111 438 438 239 371 371 278 242 314 242 242 242 394 133 364 276 276 153 153 387 387 396 348 339 219 219 477 477 477 88 118 118 118 118 402 183 451 30 30 301 32 129 259 354 354 498 498 498 498 498 396 396 242 116 195 471 368 453 9 142 221 144 208 79 288 288 360 360 360 434 339 200 33 248 248 212 445 180 171 171 171 252 252 8 354 100 302 497 497 497 49 453 9 6 384 371 180 315 315 315 315 450 450 450 413 413 94 199 157 157 245 245 129 259 74 190 189 189 236 35 478 478 482 482 482 482 482 238 6 161 487 288 178 178 458 458 192 196 196 479 398 360 360 434 434 339 199 34 340 340 116 466 22 283 455 43 276 109 109 139 139 139 139 375 375 375 375 98 13 229 491 247 126 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 149 228 289 320 287 111 111 111 438 438 58 110 498 498 498 498 396 285 34 223 223 280 44 44 44 458 445 445 351 351 343 171 171 358 358 39 342 342 224 224 106 410 410 410 410 173 173 29 29 495 467 467 44 44 116 10 10 398 398 398 398 374 132 236 32 259 354 190 380 499 319 319 348 348 471 471 49 9 142 397 109 109 288 178 178 143 458 208 397 347 347 467 467 44 44 94 14 14 411 153 372 372 396 349 349 352 29 242 116 199 44 44 38 342 342 115 273 106 265 265 85 85 146 175 81 282 203 53 394 90 310 107 395 351 91 91 91 85 85 139 450 293 122 35 401 384 371 278 278 314 314 401 401 127 114 92 92 92 92 167 385 35 227 427 229 247 126 126 326 326 326 326 101 408 149 149 228 491 412 55 55 55 322 67 466 198 5 5 455 38 72 72 72 72 72 437 424 424 424 424 424 497 497 122 349 401 205 261 25 25 365 365 365 365 460 203 53 359 81 81 41 324 324 422 36 371 180 265 265 265 85 146 146 325 34 340 340 116 33 76 76 205 234 234 234 261 25 485 286 286 286 468 245 349 349 205 262 262 100 497 497 14 14 145 145 486 460 460 416 458 242 242 116 199 41 41 41 19 318 185 433 433 433 160 112 427 56 170 491 312 312 312 187 12 12 292 12 12 12 12 12 408 408 260 391 491 491 316 491 491 491 491 412 287 287 350 350 350 350 350 359 359 81 166 166 464 177 177 177 133 133 141 141 141 281 453 168 44 44 416 208 79 498 498 498 498 134 302 497 175 81 340 340 340 466 466 114 92 92 92 240 325 34 121 121 121 379 77 77 342 86 238 6 272 11 11 379 379 243 471 49 433 390 390 18 18 112 439 439 237 237 237 237 237 237 237 305 305 12 260 260 260 260 260 260 260 163 163 316 316 316 316 491 7 7 7 364 109 109 139 139 139 293 293 43 43 345 347 347 347 313 313 94 479 307 307 307 61 167 131 472 401 259 144 445 443 443 240 325 176 135 135 200 464 44 44 44 416 458 144 79 498 498 498 499 499 302 375 375 98 98 13 417 417 417 237 237 237 237 237 237 237 237 491 491 80 316 491 80 491 289 435 66 66 179 179 179 179 314 196 217 70 65 329 329 406 406 467 134 139 139 175 423 423 423 423 423 263 263 229 247 15 193 193 17 +17 17 363 363 51 51 228 209 83 145 253 253 253 453 342 342 118 118 118 118 349 402 221 259 74 74 441 153 153 387 387 146 368 453 342 242 196 309 199 176 135 135 200 200 248 250 364 276 109 109 443 139 139 139 293 293 293 185 49 9 142 397 345 347 347 347 347 406 467 255 255 129 129 74 74 485 485 485 286 286 468 468 468 134 359 359 359 166 166 324 3 422 349 234 234 234 261 25 25 443 443 330 203 53 473 242 242 199 199 89 446 94 199 255 255 143 259 144 27 437 319 319 53 53 76 465 81 81 469 469 99 447 447 221 196 291 291 291 291 291 243 227 419 427 247 247 126 126 326 326 326 326 326 101 149 149 491 412 83 55 194 194 194 388 67 10 10 479 331 307 307 61 167 167 36 108 87 87 87 8 420 420 420 422 32 239 161 161 79 79 288 443 443 240 325 34 191 191 24 36 34 340 340 340 466 22 283 455 143 458 445 445 351 343 343 171 358 358 39 342 342 224 69 69 130 280 29 44 44 236 8 354 153 153 153 153 387 387 387 207 207 207 454 13 229 82 247 312 312 312 292 292 292 292 292 292 292 292 1 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 408 408 408 408 391 391 289 491 209 287 111 111 438 438 314 196 309 479 463 463 463 463 29 29 382 313 236 32 32 239 161 79 79 288 360 360 360 434 434 203 53 69 223 223 402 221 259 108 119 295 295 295 295 295 458 135 135 135 135 200 200 44 44 44 44 129 401 491 144 79 498 498 498 498 139 302 302 497 122 122 449 87 87 87 8 354 380 288 288 360 328 200 464 230 230 230 230 230 230 215 35 29 419 419 225 225 225 225 225 225 225 225 225 225 225 225 287 287 111 111 111 438 378 43 364 276 174 174 319 348 348 64 212 161 300 382 382 277 415 457 196 217 258 258 258 342 342 224 494 494 453 168 145 329 329 329 175 81 81 469 416 416 96 342 168 470 365 365 365 365 348 64 212 300 382 382 186 186 54 54 105 336 336 74 470 432 330 379 64 64 77 77 224 224 334 382 245 349 155 332 332 332 236 239 384 371 374 374 88 176 176 135 135 200 200 277 277 277 277 233 227 419 439 439 439 225 225 225 391 491 80 491 491 73 491 320 159 159 159 314 35 259 127 114 264 264 264 468 59 59 452 263 417 417 417 417 47 47 491 491 491 435 197 373 338 338 338 338 338 400 400 400 400 95 95 246 246 246 301 378 378 345 389 389 389 314 196 242 242 33 33 310 107 338 161 161 161 487 288 360 360 360 200 200 243 96 96 393 155 165 165 165 53 44 255 236 239 384 180 180 405 405 206 206 35 96 272 176 135 135 200 200 44 44 44 44 72 72 72 424 424 424 424 424 424 497 497 497 335 14 226 82 411 411 157 372 372 396 349 349 234 261 25 242 242 94 199 459 38 31 342 342 273 106 265 265 85 85 85 175 175 81 81 203 53 118 118 118 118 402 338 400 400 400 422 36 108 377 295 295 295 416 458 277 277 277 325 34 340 340 340 116 64 76 108 377 123 123 123 88 88 156 156 156 156 245 58 58 110 110 120 120 120 120 120 37 24 24 404 439 78 229 491 312 312 15 292 292 292 292 292 292 292 21 21 21 15 193 193 193 193 17 17 +17 17 17 17 296 52 52 52 52 52 52 52 52 461 461 491 461 461 184 491 491 305 305 289 7 217 473 258 258 258 342 342 224 494 494 494 453 9 142 397 147 329 329 329 329 329 143 36 449 302 302 302 497 43 43 345 389 389 389 285 34 202 202 402 402 251 241 266 266 266 266 146 178 35 35 272 87 87 38 162 342 86 238 6 272 470 403 403 464 464 464 330 348 76 76 108 377 139 139 139 497 399 217 217 473 486 486 486 460 460 169 164 164 485 485 485 374 422 143 144 445 210 210 210 210 210 210 203 53 58 58 350 350 350 350 350 203 250 250 345 333 333 220 216 22 257 281 453 9 168 121 121 53 76 465 74 74 441 153 153 372 372 313 449 449 191 191 24 335 14 14 411 153 153 372 372 372 396 349 352 352 352 275 275 275 116 303 303 48 229 491 247 312 126 126 292 292 292 292 326 326 326 23 23 23 101 408 408 408 149 149 228 491 289 491 354 159 159 159 159 314 133 133 456 456 456 456 349 349 234 261 386 386 151 151 151 178 35 96 36 449 176 176 135 135 200 200 248 212 127 45 45 45 325 177 177 177 177 345 345 389 389 389 129 129 259 420 420 420 420 464 464 44 44 44 416 129 401 401 144 484 484 484 484 314 314 32 401 401 259 108 377 351 374 374 374 132 88 88 106 145 284 315 315 315 450 450 450 372 304 304 304 49 342 342 168 415 415 415 26 26 26 241 241 444 444 213 213 358 39 39 342 142 221 336 354 354 255 38 349 205 155 148 148 148 148 372 245 58 183 257 257 257 453 168 255 255 42 42 147 380 499 499 265 85 85 146 173 173 280 302 302 375 497 98 229 82 247 126 126 126 326 326 326 326 326 326 101 101 149 228 491 373 338 400 400 400 400 30 143 144 27 121 121 121 33 394 76 208 208 386 444 444 374 374 252 325 34 191 191 191 314 36 36 377 87 87 87 416 416 180 84 84 496 88 88 230 230 230 230 215 215 35 401 198 198 283 283 455 42 42 147 380 380 288 496 496 496 496 274 274 274 37 24 24 36 377 377 377 123 123 272 123 123 123 42 42 147 147 499 499 405 405 206 215 29 469 313 314 32 401 401 401 354 180 180 443 139 139 139 139 375 375 375 375 185 49 342 342 168 89 116 33 394 76 108 119 351 351 139 139 293 293 122 216 283 283 455 116 10 398 398 398 398 398 374 374 132 132 132 185 185 269 390 390 390 18 18 112 439 237 237 237 237 237 237 491 47 491 47 491 491 435 435 435 289 491 209 177 177 177 177 131 133 133 345 389 389 389 314 129 478 66 68 68 115 273 498 498 498 240 240 35 35 359 359 359 166 166 166 301 301 217 217 473 476 476 476 476 143 458 192 44 44 38 342 342 115 273 432 432 379 379 394 77 68 68 115 418 418 418 418 418 99 99 436 436 60 298 379 379 471 478 66 342 115 273 151 178 416 458 192 242 116 64 76 108 377 123 123 116 10 479 331 331 319 319 319 282 388 303 303 117 48 229 247 15 15 15 193 193 193 17 +17 17 17 363 363 51 51 491 412 412 55 55 55 322 67 33 250 217 473 258 258 258 31 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 329 329 36 310 107 395 302 302 302 497 497 122 122 401 401 401 401 401 384 371 371 286 286 286 286 313 134 359 359 166 166 166 166 301 301 251 251 251 241 266 266 266 266 266 173 173 402 402 6 108 377 87 87 217 473 476 476 476 143 458 192 44 38 68 68 115 273 432 432 330 379 394 77 342 342 115 470 418 418 418 418 99 99 436 436 60 60 298 303 303 48 48 417 417 237 237 237 491 237 2 491 2 2 491 491 491 435 435 491 491 435 435 491 289 373 66 66 115 273 344 496 186 99 400 400 400 30 422 143 36 108 295 295 295 295 295 458 192 156 156 156 186 186 54 172 115 279 279 279 279 279 349 352 29 44 255 255 43 43 276 109 109 403 403 403 207 207 207 207 19 3 454 225 66 66 68 68 68 115 273 231 231 231 231 53 250 250 345 346 426 206 167 167 457 36 108 377 123 399 70 65 65 329 42 42 147 380 288 256 139 175 175 423 423 423 423 271 368 269 142 142 397 147 456 456 456 251 251 241 444 444 444 213 246 246 358 358 173 352 352 352 112 225 225 225 225 225 225 225 373 393 155 155 155 332 332 332 313 216 216 5 5 455 455 251 241 431 486 376 376 460 460 449 449 300 382 382 245 349 349 205 261 25 180 189 139 139 293 122 122 131 183 156 156 156 382 313 313 236 239 239 384 180 180 486 315 113 113 450 450 167 35 270 270 342 224 340 340 340 33 394 76 393 205 261 25 485 286 286 286 286 304 304 304 49 447 142 397 147 456 456 456 456 173 280 106 265 265 265 265 85 85 146 146 173 280 176 176 135 328 200 200 199 89 319 319 348 33 64 212 300 123 216 198 448 448 448 448 464 121 121 121 53 394 76 155 425 425 386 134 88 88 11 11 11 379 471 49 342 168 69 69 223 130 129 196 196 217 473 258 258 258 31 224 224 494 494 494 281 142 142 397 147 329 329 329 329 329 36 449 302 302 302 497 497 31 142 221 336 74 351 351 443 443 150 150 342 342 224 494 494 203 53 459 459 459 368 453 342 168 275 203 203 381 48 13 13 491 491 247 312 312 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 260 260 260 260 260 260 391 391 391 491 491 73 491 320 345 109 139 175 175 81 223 130 280 280 106 297 297 297 297 297 297 293 293 349 349 352 164 164 164 164 164 214 214 214 214 200 200 200 200 471 471 49 453 198 114 45 45 385 457 14 401 226 82 209 463 463 463 463 463 280 29 382 382 382 245 245 43 43 364 364 276 276 109 347 347 498 498 59 59 59 245 14 14 411 157 157 157 372 372 245 245 43 43 364 276 109 109 329 139 139 293 497 122 8 354 420 41 41 41 19 19 454 454 417 417 417 417 237 47 80 491 80 491 435 435 209 188 177 177 236 36 107 395 180 486 486 460 178 178 458 192 485 469 134 175 158 158 158 158 158 325 449 191 191 191 314 314 196 217 473 258 258 258 342 342 494 494 494 281 9 142 397 397 147 329 329 329 329 329 143 310 107 395 302 302 497 497 43 364 345 409 409 409 116 314 76 465 400 400 400 301 378 345 141 141 141 31 232 232 68 68 115 273 470 171 171 171 252 349 349 402 26 359 166 166 166 324 464 464 113 113 113 113 169 167 36 449 34 340 340 466 466 22 283 455 497 251 251 241 431 431 290 290 290 434 434 339 339 117 404 13 229 491 247 15 15 15 193 193 193 17 +17 17 17 363 363 363 51 51 228 184 491 491 320 188 177 177 177 177 143 401 82 384 71 71 71 71 71 453 9 142 221 336 155 487 288 485 278 26 359 166 166 166 166 422 162 232 232 68 68 444 444 444 360 360 339 53 53 473 253 253 453 342 168 118 118 349 402 25 111 111 111 438 399 70 65 319 169 150 342 105 221 336 420 420 422 236 239 161 79 79 288 288 360 360 360 203 53 176 176 328 328 200 303 48 13 491 491 312 312 312 312 312 292 292 292 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 369 21 21 21 21 21 21 21 21 21 21 21 260 260 260 391 391 391 391 491 491 491 320 320 346 346 84 139 139 175 175 81 111 111 111 438 203 53 478 478 232 232 172 115 106 106 153 153 372 372 337 337 337 301 349 155 155 332 332 332 240 216 114 92 92 92 167 457 35 401 259 74 74 441 441 441 153 153 153 372 372 396 313 219 219 219 219 180 180 319 319 348 348 248 250 250 276 174 174 174 388 94 199 89 89 446 116 10 10 309 479 331 84 84 496 399 399 473 65 459 31 31 342 86 86 238 6 470 470 470 171 171 171 358 24 458 192 419 419 439 439 417 237 237 237 237 237 237 237 237 237 237 237 237 237 80 7 7 217 473 65 329 486 460 460 169 169 164 164 25 485 485 485 378 378 88 89 89 116 33 250 70 65 329 329 245 42 147 134 134 139 175 175 423 423 423 423 314 314 239 384 371 180 84 350 350 167 457 309 479 331 84 84 88 88 14 14 411 475 475 475 475 475 475 475 475 422 349 164 214 214 214 214 200 200 255 255 8 354 113 113 113 113 450 167 167 457 36 310 107 107 395 395 106 153 153 122 122 285 300 300 300 275 275 94 117 404 13 414 80 80 491 491 412 412 83 55 55 55 322 67 64 212 114 0 0 139 139 175 81 154 154 154 458 96 66 68 105 105 336 470 151 151 178 35 96 401 36 272 57 57 57 203 64 394 76 377 87 87 87 420 420 420 420 301 43 364 276 346 346 265 265 265 85 146 146 368 453 9 300 300 382 406 467 89 89 446 33 394 478 68 68 68 238 6 272 470 470 443 240 325 41 324 324 286 459 459 469 216 198 114 242 446 94 199 257 257 257 453 168 106 350 350 350 350 350 413 195 195 33 90 32 465 208 79 380 288 365 365 365 365 388 348 64 76 90 393 261 25 91 91 91 91 493 216 300 334 334 59 452 263 229 247 126 126 326 326 326 326 193 193 17 +17 17 17 296 296 317 491 491 184 184 184 412 177 177 177 177 177 177 401 478 66 66 68 68 115 444 444 444 444 360 339 339 53 471 71 342 342 483 440 287 319 319 319 388 348 195 195 90 90 143 401 491 445 445 445 351 351 72 72 351 365 365 365 365 330 94 199 41 41 324 324 143 36 377 87 87 87 164 214 214 214 200 200 192 69 223 130 29 44 44 236 36 310 107 395 351 437 91 91 91 85 139 139 293 122 35 198 45 191 236 131 90 401 82 208 79 288 360 360 360 434 339 248 248 212 445 180 171 171 171 252 215 8 100 100 497 497 497 269 342 68 68 115 273 231 231 231 203 94 58 58 268 268 315 268 450 450 98 98 229 82 247 312 312 126 292 292 292 292 23 23 23 23 408 408 408 391 391 491 491 491 289 289 127 114 0 0 313 186 447 196 479 463 463 463 463 29 29 382 245 8 354 137 137 137 137 116 250 250 250 276 174 174 174 319 319 348 466 466 212 127 114 264 264 264 264 59 59 452 245 349 205 155 155 332 332 332 332 372 245 245 217 217 473 65 486 486 460 460 169 164 164 164 219 219 485 485 132 88 88 89 89 446 33 250 70 65 65 329 495 42 147 380 288 139 139 175 175 423 423 423 423 423 355 245 43 345 347 347 347 245 416 32 239 208 79 380 499 84 496 496 274 274 413 94 479 230 230 230 230 215 35 401 491 354 345 409 409 409 409 466 466 466 22 283 455 116 10 398 398 398 398 132 132 58 58 72 72 268 268 268 268 268 169 169 39 54 142 397 397 141 141 281 54 9 221 336 336 354 180 139 139 139 375 375 274 122 122 227 227 419 439 439 439 417 237 237 237 237 237 47 47 491 47 316 316 491 316 73 491 289 435 188 118 118 118 118 118 402 198 198 0 0 0 0 464 464 464 463 463 463 463 280 29 382 382 245 245 43 364 276 347 347 347 498 498 396 396 313 313 24 36 310 107 107 395 395 106 153 153 387 122 122 161 161 487 334 275 275 116 117 48 229 229 247 126 126 126 326 326 326 326 326 101 101 149 149 228 491 320 320 345 407 407 407 143 107 395 356 257 257 281 9 142 72 437 306 306 306 306 396 313 186 36 377 87 87 87 8 354 425 251 251 241 444 444 444 444 246 246 173 402 402 397 409 409 409 116 250 250 276 174 174 174 319 348 466 250 241 367 367 367 367 35 458 270 270 342 224 415 415 415 457 259 127 114 57 57 203 203 381 48 48 13 13 491 247 312 126 126 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 391 391 391 391 491 491 289 412 287 287 111 111 111 111 111 438 378 378 364 389 389 389 389 389 314 242 242 242 33 76 76 465 259 354 420 420 420 324 246 3 464 340 340 340 116 466 466 466 114 92 92 92 92 285 34 106 106 153 372 372 396 245 349 349 352 25 242 242 116 33 471 49 49 9 482 338 338 338 395 485 374 374 374 132 132 318 318 49 269 9 142 393 155 332 332 332 332 332 467 467 475 475 475 475 475 475 475 475 422 349 164 214 214 214 214 214 200 200 117 404 404 404 225 225 225 225 225 193 193 +17 17 296 363 363 363 225 225 289 7 7 7 70 70 65 65 284 284 284 265 265 265 85 85 146 146 438 8 354 159 159 285 285 111 111 111 111 438 438 143 129 259 74 74 351 278 278 278 325 183 41 41 324 324 3 183 183 57 57 57 57 203 381 381 117 117 417 417 417 417 417 417 80 80 320 127 114 92 92 92 92 240 35 77 342 9 142 397 336 181 181 181 181 181 385 385 36 227 419 439 439 417 417 237 237 237 237 237 237 237 237 237 237 491 362 491 491 362 491 491 362 362 362 362 491 435 211 211 491 369 369 21 21 21 21 21 21 21 21 21 260 408 408 391 391 391 228 491 491 373 66 66 68 115 273 273 344 344 344 16 274 274 186 186 162 232 68 172 115 470 179 443 120 240 240 314 35 196 217 217 473 258 258 258 342 342 224 494 494 494 281 9 142 397 147 147 329 329 329 329 252 143 36 449 395 302 302 302 497 122 36 36 377 123 123 123 216 22 283 455 43 364 364 276 346 346 346 346 265 85 85 85 139 139 293 293 122 122 131 472 133 147 147 380 288 496 496 496 274 368 31 342 86 142 336 336 354 109 496 278 99 99 436 395 50 50 50 50 185 453 342 168 180 113 113 113 113 169 285 449 34 69 223 130 198 22 283 283 455 349 234 234 261 25 424 424 424 497 497 122 466 81 459 459 271 31 342 224 69 69 130 130 280 156 156 156 156 245 245 72 72 437 306 306 306 306 306 396 396 37 24 227 419 419 427 229 491 247 15 193 193 193 +17 17 296 296 317 184 184 184 184 289 320 108 119 351 351 486 460 460 215 96 35 272 300 382 382 313 236 129 75 108 119 351 351 374 374 374 374 132 132 98 98 13 417 417 170 170 170 170 442 491 442 442 312 187 442 12 102 102 12 442 12 12 23 260 260 260 260 260 391 391 316 289 289 289 320 7 217 70 473 486 486 486 460 169 169 35 164 219 485 485 374 132 143 129 321 144 27 351 329 329 329 169 352 164 221 221 321 354 29 382 382 396 313 24 131 483 226 321 188 356 356 31 162 232 172 224 494 494 494 129 74 190 190 499 499 499 265 265 265 85 85 299 299 185 185 433 433 86 238 6 419 439 56 56 237 237 237 237 237 28 28 28 491 28 28 362 362 491 362 491 305 362 362 362 362 491 491 218 40 362 218 218 218 218 491 218 491 218 218 218 218 218 218 218 218 491 491 218 218 218 491 491 369 369 491 369 369 369 369 369 369 369 21 21 21 21 21 101 101 101 149 391 228 321 321 320 7 217 217 473 486 486 486 460 460 169 169 164 164 485 485 485 374 132 143 129 458 144 27 27 351 329 329 151 169 169 164 352 221 221 321 354 29 334 334 59 59 313 24 131 483 440 89 55 446 322 466 22 5 455 38 162 482 482 172 115 273 106 499 372 406 406 467 302 302 497 497 497 497 399 217 217 473 65 264 264 264 264 468 468 468 467 37 236 314 401 401 310 107 395 180 106 499 405 405 206 206 178 96 96 272 472 472 472 401 321 144 27 27 437 319 319 319 53 53 76 205 155 29 134 134 134 134 8 359 359 474 474 474 3 335 14 411 410 410 410 410 410 173 29 29 313 313 216 22 448 448 448 14 411 411 171 171 171 171 252 252 131 472 196 196 70 70 65 65 265 265 85 85 139 450 293 497 49 54 86 238 272 377 123 236 129 259 190 380 499 499 428 428 146 146 358 457 457 133 42 147 380 380 288 288 173 173 29 334 334 59 59 452 452 263 229 491 312 312 312 312 292 292 292 1 1 1 1 1 21 21 408 408 408 408 149 149 289 321 321 412 177 177 177 177 131 133 141 141 141 281 453 168 44 44 44 129 259 190 190 487 288 278 240 325 34 324 324 301 378 42 147 147 380 84 84 496 496 496 496 274 274 37 24 419 439 225 417 417 80 321 320 7 7 147 147 380 499 319 319 348 94 199 176 176 135 135 135 200 200 199 255 255 255 251 251 241 241 431 235 235 235 235 235 235 200 248 248 212 354 255 236 36 108 397 397 487 360 360 360 360 339 339 33 33 394 478 478 232 68 172 115 196 479 331 331 151 319 151 240 416 314 96 393 393 234 234 234 261 25 106 306 306 306 306 396 203 53 394 478 162 86 86 6 272 470 470 120 120 120 37 37 24 77 270 9 142 397 345 333 333 333 220 220 173 164 164 402 472 196 309 479 331 331 315 315 315 450 88 88 242 116 94 199 255 255 416 416 458 445 445 361 361 361 120 120 282 282 282 388 195 117 117 229 247 247 126 126 326 326 326 326 101 101 149 149 321 412 287 44 44 44 215 35 354 278 278 325 34 462 462 462 402 402 401 401 321 259 354 106 106 481 481 481 293 293 186 39 342 224 224 494 242 203 217 473 41 324 324 422 422 349 234 234 234 234 234 261 261 25 498 498 498 498 396 245 245 43 43 364 345 109 109 496 496 496 37 24 314 36 108 377 87 87 236 239 161 161 79 499 499 499 265 85 85 146 146 173 402 402 205 205 234 161 161 487 487 487 374 374 374 132 132 132 98 229 247 15 15 193 193 17 +17 17 363 51 51 51 228 321 320 157 157 157 157 372 467 44 44 44 58 72 72 72 437 437 481 481 481 481 175 175 81 84 84 84 16 274 274 274 43 345 345 109 109 264 468 245 245 245 43 364 276 276 346 346 284 265 85 85 85 139 139 293 293 122 122 472 221 129 321 75 74 425 425 386 431 319 319 319 319 203 203 381 381 381 471 185 49 342 342 342 142 72 437 189 189 189 319 189 200 200 180 180 113 113 113 113 167 167 457 401 321 75 127 114 222 222 222 468 245 349 349 234 205 205 261 25 278 139 139 139 293 203 399 70 429 324 324 324 301 32 239 259 354 425 425 241 374 374 374 374 374 132 132 132 381 381 381 381 404 13 13 78 170 170 491 491 491 491 28 491 341 211 341 12 292 292 21 21 21 21 21 21 21 21 408 408 408 408 149 228 321 321 320 7 127 5 448 448 14 14 411 411 264 264 264 264 264 468 468 468 245 43 43 345 141 141 281 162 54 232 482 482 105 397 397 109 109 213 213 213 358 358 36 36 472 397 397 333 333 220 220 314 198 127 22 283 455 236 129 321 354 190 79 380 288 443 443 443 169 169 164 164 164 164 69 69 130 130 402 402 196 217 217 473 432 330 116 94 337 324 324 324 3 3 197 197 226 226 209 209 145 145 486 460 460 215 215 35 29 100 302 497 497 335 14 411 153 153 153 372 372 396 396 36 36 107 107 395 334 334 334 59 37 37 24 471 270 269 433 427 427 247 247 126 126 326 326 326 326 408 149 149 149 321 412 83 55 55 55 322 466 466 22 5 5 455 399 217 217 473 65 443 443 443 240 325 34 84 84 84 496 274 274 186 162 54 482 482 482 482 482 482 26 26 26 241 431 84 496 496 496 215 35 96 96 36 272 255 255 255 43 364 109 109 403 403 403 171 464 464 340 340 116 466 466 22 283 455 236 239 384 371 278 278 278 31 342 86 86 238 6 272 11 11 11 379 379 471 471 49 9 238 6 272 87 87 87 58 72 156 156 255 42 42 147 147 380 499 499 265 265 85 85 146 146 368 368 368 342 342 224 242 242 116 116 33 33 33 90 250 217 217 473 473 278 278 278 31 39 86 86 238 238 401 491 270 270 270 342 168 69 462 462 130 402 221 401 321 321 74 190 190 437 498 498 498 498 498 498 134 16 302 182 302 302 497 175 175 81 89 89 446 446 67 212 131 472 221 401 321 74 190 492 492 498 498 498 215 215 35 259 74 100 100 100 100 375 375 375 375 98 43 7 7 7 276 346 346 346 346 315 85 85 85 139 139 293 293 293 122 35 198 22 5 5 251 251 241 431 278 278 285 449 302 302 497 497 497 8 8 259 354 29 498 498 498 498 498 396 37 37 314 77 478 232 232 232 172 115 115 273 470 486 486 365 365 365 365 328 200 200 200 248 253 253 253 31 342 342 168 118 118 118 118 280 29 177 177 177 314 131 133 364 364 276 347 347 347 347 498 498 467 313 313 216 216 22 283 283 455 43 43 364 276 174 174 174 174 319 319 348 348 195 195 195 64 212 212 93 93 93 93 93 464 464 69 462 130 402 402 162 232 68 172 115 273 273 319 319 203 53 53 29 29 495 467 467 89 340 116 94 335 14 14 411 411 297 297 297 297 297 182 182 497 122 216 216 22 283 448 219 219 219 219 286 286 286 286 286 286 286 59 59 59 452 452 263 417 417 417 491 491 421 421 491 421 128 128 491 128 491 128 128 193 193 193 17 +17 17 17 296 296 52 52 52 52 52 52 52 52 52 408 101 51 149 149 321 321 7 7 217 473 65 329 329 460 460 169 164 164 485 485 485 485 378 88 121 121 121 116 33 394 239 107 395 470 153 153 387 387 146 146 314 35 259 22 283 455 236 239 161 79 79 499 499 265 85 85 85 146 173 173 280 145 145 460 460 460 169 402 36 272 495 495 467 257 257 257 257 342 168 180 84 350 350 350 350 413 33 394 90 393 234 261 261 25 486 486 486 460 460 169 99 436 436 436 60 298 298 298 275 303 303 117 404 229 491 247 126 126 126 326 326 326 326 326 326 408 408 408 149 228 321 321 412 188 154 154 154 96 96 172 172 273 470 151 151 215 215 96 36 272 161 495 495 467 467 135 135 200 248 466 22 283 455 399 399 70 65 65 84 496 496 203 53 53 291 291 379 379 49 9 142 397 345 409 409 409 409 58 183 451 30 30 30 301 399 217 217 473 443 443 443 240 36 449 472 133 133 364 276 109 278 278 278 399 217 473 136 275 275 116 195 199 89 89 322 67 199 58 110 110 110 110 254 254 314 35 401 75 377 87 87 87 10 10 309 479 331 331 284 284 405 206 206 206 314 314 401 75 108 377 123 123 123 216 114 114 57 57 57 381 381 381 48 48 229 414 491 312 312 126 292 292 23 23 23 23 23 101 260 391 391 228 289 321 321 373 155 155 332 148 148 387 387 372 406 467 467 242 121 203 53 394 76 74 190 190 487 288 330 379 33 394 77 342 342 273 470 443 240 240 133 133 133 345 382 313 285 14 411 284 265 85 85 146 146 175 175 175 81 275 275 275 116 64 212 131 219 152 152 152 378 353 353 353 313 186 54 54 224 494 236 259 74 437 496 496 496 496 274 186 186 323 238 238 6 272 87 87 116 10 479 331 106 284 405 206 206 167 35 75 377 377 123 123 14 14 411 411 411 297 424 297 182 182 293 293 175 175 89 89 446 446 33 394 478 478 232 232 172 172 273 273 319 319 348 64 64 212 161 300 337 41 219 219 219 219 152 152 152 399 217 473 213 213 213 252 449 449 106 125 125 125 125 466 22 283 455 42 42 147 380 380 84 496 496 496 496 274 274 37 24 404 427 321 247 126 126 326 326 326 101 101 149 149 149 321 321 320 7 345 109 409 181 240 216 300 300 300 219 219 152 152 152 152 10 10 479 331 84 84 84 274 216 216 114 57 203 399 70 157 157 157 157 313 10 479 331 331 307 307 307 307 61 167 167 233 227 227 419 439 417 170 170 170 170 28 491 28 28 491 491 28 362 491 491 40 305 305 305 40 40 40 40 40 40 163 491 491 366 366 366 163 491 316 316 491 435 289 321 321 320 7 217 217 473 65 486 486 486 460 460 169 169 164 164 485 219 219 485 152 152 301 422 239 36 161 79 79 288 288 443 240 325 34 191 191 191 314 131 472 14 14 226 321 321 411 297 297 297 297 297 297 297 297 297 297 293 497 497 497 122 43 364 276 109 109 278 278 399 217 473 136 275 275 275 195 195 195 335 440 440 154 154 154 458 96 96 68 172 273 470 151 151 215 35 96 272 472 472 472 196 70 70 70 65 495 495 380 467 256 139 175 251 241 423 423 423 423 355 89 89 446 116 33 250 250 217 473 258 258 258 342 342 224 494 494 494 31 9 142 142 397 147 147 329 329 329 329 329 143 36 310 107 395 302 302 302 375 98 98 13 229 491 247 312 15 15 15 15 193 193 193 17 +17 17 17 363 363 363 363 363 408 51 51 491 321 451 451 30 30 30 58 72 110 110 110 254 254 254 285 44 44 44 94 199 331 319 319 319 348 394 76 465 144 27 27 437 319 319 319 53 53 77 205 155 29 6 134 134 134 8 354 100 100 100 497 349 349 234 234 234 261 261 25 485 213 485 286 139 139 175 175 81 176 176 328 328 200 200 117 229 321 247 126 126 326 326 326 101 408 149 228 321 321 45 45 45 45 198 22 5 455 399 473 473 494 38 162 232 232 86 238 6 272 485 485 286 468 468 337 337 485 324 459 459 271 31 54 9 142 221 336 259 208 208 190 487 288 213 213 213 252 36 310 107 395 334 334 304 304 49 269 142 397 397 141 141 281 162 232 232 172 115 273 444 444 213 252 143 458 208 79 487 313 236 143 36 26 359 166 166 166 324 301 251 251 251 251 241 241 431 376 376 376 460 460 169 169 352 164 164 25 176 135 328 200 464 464 415 415 415 415 415 36 131 183 57 57 57 57 57 381 381 48 48 417 417 170 170 170 28 491 28 491 341 491 341 341 491 163 491 491 316 316 316 321 435 289 373 451 451 30 30 301 399 217 473 65 476 476 464 464 202 202 202 8 137 137 137 116 90 90 76 208 441 441 346 346 428 428 146 146 24 35 133 133 147 380 499 428 428 428 146 143 449 449 89 340 116 394 212 164 164 214 214 360 360 200 76 465 192 192 176 135 200 200 248 248 478 342 172 115 273 84 84 84 84 274 98 13 229 247 312 126 126 292 326 326 23 23 101 101 101 149 391 228 321 321 155 155 155 148 148 372 58 183 451 30 30 378 378 141 141 141 281 342 168 44 44 44 94 199 335 14 14 411 284 284 284 405 405 206 206 240 314 26 26 241 241 367 367 367 458 321 192 176 135 200 200 248 248 465 259 74 74 492 492 492 492 271 150 342 342 224 224 242 116 199 459 459 469 469 37 24 75 310 107 107 447 97 225 225 80 321 321 320 345 333 333 220 220 22 44 44 94 199 331 319 319 319 348 348 33 394 394 212 239 445 180 290 290 290 290 434 434 434 339 33 359 359 81 166 324 324 422 422 349 234 234 234 234 261 25 25 278 278 278 416 458 192 300 334 334 355 355 452 263 229 247 247 126 126 326 326 326 326 101 101 149 149 228 321 412 83 55 55 446 322 67 33 33 250 251 251 241 241 431 235 235 235 235 235 235 235 235 235 348 200 200 200 248 335 14 14 14 226 209 287 265 265 265 85 85 146 146 146 299 242 242 339 195 195 248 248 212 239 208 79 79 288 288 403 403 403 171 171 171 3 58 58 72 72 72 72 110 264 264 264 264 264 264 264 468 468 59 313 216 216 127 45 45 45 236 129 75 108 119 351 351 151 151 151 169 178 36 310 447 447 447 6 272 257 257 257 257 257 99 338 338 338 447 482 238 238 336 321 75 371 374 374 374 374 215 129 354 176 176 176 328 200 200 248 248 186 338 338 338 395 470 106 424 424 424 424 497 122 122 131 300 334 334 304 304 185 185 269 9 427 229 247 247 15 15 193 193 193 17 +17 17 17 363 363 51 51 228 321 412 55 55 322 67 212 34 44 44 462 349 234 234 234 234 234 261 261 25 424 424 424 424 424 182 182 182 497 497 497 497 497 497 186 186 162 482 482 482 482 115 115 273 106 405 405 405 405 206 169 349 352 352 402 6 272 472 221 336 336 354 190 380 288 315 315 315 315 450 450 450 413 413 348 33 33 33 394 394 32 239 75 354 485 213 286 286 286 286 286 286 334 59 59 37 37 24 131 404 225 225 225 225 225 320 345 407 407 407 407 36 107 107 400 30 30 464 254 254 254 314 133 133 364 276 276 153 153 153 387 372 396 388 94 199 145 463 463 173 280 29 313 186 162 342 342 224 494 379 379 379 77 342 224 30 30 378 345 141 141 281 31 9 6 272 119 397 441 109 432 330 348 64 64 76 449 41 41 41 41 19 19 454 13 417 170 170 170 491 28 28 28 28 491 491 2 2 2 491 362 362 102 362 362 362 491 362 362 491 305 305 366 366 366 366 366 435 435 316 316 435 435 435 289 321 321 321 209 188 340 340 33 33 90 349 205 234 261 25 470 486 376 376 376 376 460 460 178 178 233 96 75 419 427 321 247 126 126 126 326 326 326 326 326 326 326 101 408 408 408 149 321 321 373 451 451 30 30 30 58 58 110 254 254 254 254 314 26 26 251 241 367 367 367 367 367 35 96 321 75 34 415 415 415 385 314 259 108 119 397 441 441 432 330 330 379 64 76 36 449 41 41 41 41 19 19 454 454 454 414 47 47 80 80 80 321 321 7 7 32 280 104 104 104 104 104 337 337 337 324 301 399 217 383 383 383 383 383 383 310 107 34 253 253 253 342 224 30 30 30 301 26 241 367 367 367 35 96 321 272 34 415 415 143 478 478 68 68 115 273 278 278 178 96 96 86 86 238 6 272 41 41 41 19 19 454 417 417 417 47 47 47 47 491 47 47 47 80 249 435 435 321 321 321 7 7 251 241 241 431 376 376 460 178 178 458 192 192 176 176 135 200 200 200 464 255 251 251 241 431 278 278 278 26 26 302 302 175 175 69 223 130 130 198 22 283 455 416 144 208 79 380 288 288 290 290 434 339 339 199 459 459 459 271 271 39 39 433 433 160 160 112 112 56 56 56 56 28 28 491 28 28 28 28 362 362 491 362 362 362 362 362 362 491 491 362 362 491 362 218 40 40 211 369 369 369 369 369 369 369 369 369 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 260 260 260 260 260 260 260 260 260 260 163 163 163 366 491 316 316 316 491 316 73 73 289 321 321 7 409 409 409 409 94 58 183 451 30 30 301 378 42 147 147 288 213 213 213 252 36 107 447 447 6 472 472 221 336 321 354 190 380 499 428 428 428 146 146 143 35 472 133 133 147 147 147 288 288 278 173 173 280 29 334 334 355 355 452 452 263 263 417 417 417 442 80 80 435 321 435 127 127 0 222 222 245 378 8 345 141 141 281 281 9 9 238 196 309 479 331 231 231 231 231 231 274 274 186 162 232 172 172 115 273 480 480 480 85 85 299 299 94 199 69 223 130 280 34 475 475 475 475 475 475 324 422 36 310 161 161 161 487 487 288 290 290 290 434 434 339 303 303 48 48 48 417 417 417 417 193 193 17 +17 17 296 296 296 317 491 491 184 184 184 321 435 435 451 451 30 30 30 422 164 164 106 106 106 153 387 387 285 449 451 30 301 378 378 141 141 281 281 9 238 6 108 377 344 344 374 132 132 88 147 109 498 498 498 498 134 134 175 81 474 41 41 19 19 186 162 68 172 115 273 84 496 274 58 451 451 30 30 422 422 36 108 119 119 437 265 265 265 85 85 146 146 24 131 257 257 257 257 31 54 9 142 397 441 153 153 153 372 396 313 186 342 342 224 340 340 340 466 22 283 448 448 219 219 464 180 180 306 306 306 306 396 396 24 285 69 223 130 198 22 283 455 38 162 232 482 482 482 105 196 70 70 65 65 481 481 481 481 182 293 293 497 122 129 401 321 321 190 190 380 380 499 428 428 428 146 146 385 36 472 133 42 147 147 288 278 278 173 280 29 29 245 58 58 72 496 496 496 274 274 143 75 108 119 119 351 351 256 139 139 139 139 139 375 375 375 98 13 321 247 126 126 126 326 326 326 326 326 326 326 101 149 149 228 321 412 83 55 55 322 67 67 133 364 109 109 189 330 330 348 64 36 34 180 410 410 410 410 410 280 29 29 313 236 36 377 377 123 123 216 22 283 283 38 162 232 68 238 272 470 470 171 171 171 99 99 436 436 60 298 116 33 199 58 58 268 268 268 268 268 268 268 169 169 186 39 323 390 390 18 18 112 112 56 491 56 312 491 491 312 491 12 12 12 12 21 23 23 260 260 260 391 149 228 491 321 321 127 5 5 455 251 251 241 431 235 235 235 235 235 235 235 235 348 200 248 248 90 465 259 74 425 386 386 431 486 486 460 240 35 35 393 393 155 155 148 148 148 148 387 387 203 53 250 345 141 141 141 281 9 483 14 226 226 209 411 297 297 297 297 203 53 53 65 496 496 368 31 54 6 6 272 490 490 490 368 453 9 168 498 498 498 498 396 313 325 449 191 191 191 37 24 24 404 13 417 47 47 491 491 321 80 321 321 435 5 448 448 14 14 411 411 350 350 350 350 350 350 466 81 166 166 324 301 301 251 251 241 431 278 278 173 280 176 176 328 200 248 394 465 208 208 487 487 213 213 213 422 36 310 107 395 334 495 406 340 340 340 340 33 394 478 66 68 68 115 273 273 265 265 265 428 85 146 358 24 36 472 472 336 259 354 420 420 420 360 360 135 135 135 135 200 200 44 44 44 44 416 321 144 208 498 498 498 498 498 498 134 302 302 375 375 293 497 98 225 489 489 489 489 378 43 345 141 141 281 162 232 68 68 115 115 470 278 278 325 325 176 176 176 135 135 200 200 199 125 125 125 125 199 44 44 44 129 259 321 74 437 437 265 85 85 85 85 85 139 175 175 81 462 462 130 402 99 338 338 338 338 395 395 360 360 200 200 200 248 212 302 302 302 302 497 185 49 342 168 415 415 415 198 22 448 448 448 448 154 154 154 458 321 96 96 482 482 447 238 6 161 487 487 288 360 360 360 434 434 301 399 217 473 65 432 432 432 120 330 388 388 303 303 303 243 243 131 419 427 491 229 247 15 15 15 15 15 193 193 193 193 193 17 +17 17 17 296 363 363 363 363 363 101 51 51 51 321 321 320 7 217 473 65 329 329 329 460 460 329 329 164 164 485 485 219 485 485 477 374 132 132 132 32 321 321 354 180 264 264 264 468 468 313 134 175 359 166 166 166 301 10 479 331 84 84 496 496 285 459 459 459 31 342 342 224 176 176 328 200 200 248 212 45 45 45 325 177 177 177 177 43 43 364 364 276 346 346 141 141 141 368 453 342 168 44 44 416 416 321 144 27 498 498 498 498 467 302 302 375 375 98 98 98 13 225 321 435 225 7 373 66 66 68 68 172 115 273 265 265 265 85 85 146 146 285 285 302 302 302 497 122 122 472 472 259 74 74 437 437 311 311 311 460 169 150 39 86 238 6 272 300 334 334 406 406 467 356 281 281 9 9 142 221 336 321 208 208 441 109 278 278 178 143 458 192 26 359 359 474 166 464 464 253 253 253 342 142 221 321 74 437 437 405 405 206 150 342 342 224 494 134 8 100 100 100 100 497 345 333 333 220 216 180 113 113 113 113 167 167 457 251 251 241 367 367 367 367 458 192 192 135 135 200 200 464 415 415 415 415 415 285 156 156 156 156 59 59 452 263 13 229 491 247 312 312 312 292 292 292 292 292 1 21 21 21 21 21 21 21 260 408 408 408 149 149 321 321 321 373 72 110 430 430 430 430 430 430 325 183 183 451 30 30 301 301 251 251 241 367 367 367 367 367 367 233 96 96 6 227 419 427 56 170 442 442 201 201 201 201 201 201 491 47 491 491 491 435 435 435 320 451 451 30 30 422 458 144 389 389 389 131 58 72 72 72 437 306 306 306 306 306 396 313 285 26 359 166 166 166 166 464 202 202 349 205 234 234 261 261 25 470 443 139 139 139 293 497 122 35 75 377 87 87 87 116 10 10 479 331 84 84 496 496 274 285 325 459 459 459 271 31 342 342 86 198 198 127 283 5 236 129 129 321 108 119 119 351 432 432 330 330 33 195 471 77 269 238 272 447 397 336 147 456 456 236 236 239 310 107 395 278 278 278 325 34 469 469 236 36 108 449 41 41 41 324 324 246 3 464 89 89 446 446 212 131 145 443 178 178 458 96 96 86 105 105 336 470 470 151 178 143 96 401 321 75 108 119 418 418 418 418 418 186 99 436 436 60 60 298 116 199 69 223 130 402 402 156 156 156 245 14 14 411 411 145 145 145 460 460 240 325 34 469 469 143 321 108 449 485 485 485 374 132 132 325 325 34 89 446 446 67 131 34 154 154 154 96 96 54 142 105 336 190 380 288 151 151 169 99 436 436 60 60 298 298 298 303 303 303 48 404 229 491 491 312 312 312 292 292 292 292 292 292 21 21 21 21 21 21 21 21 408 408 408 408 391 491 491 321 373 373 338 338 400 400 400 30 301 378 378 345 141 141 141 281 162 162 232 68 68 115 470 278 278 278 325 176 176 176 135 135 200 248 248 212 127 114 264 264 264 264 468 245 245 43 43 364 364 109 109 109 171 171 171 252 449 449 176 176 135 328 200 200 248 248 393 155 155 332 332 332 186 162 232 68 68 68 115 273 231 231 231 231 53 53 394 76 164 164 214 214 214 214 214 328 200 200 117 335 14 209 157 157 157 157 157 313 186 186 162 232 68 68 68 115 273 231 231 231 53 53 212 212 65 493 493 240 325 41 41 41 19 19 19 454 229 491 247 15 15 193 193 193 17 +17 17 17 363 51 51 228 184 321 321 209 83 194 194 194 194 194 194 194 194 194 282 388 195 195 212 212 131 483 197 197 197 197 66 66 68 68 115 273 494 278 330 379 33 394 478 478 68 68 68 115 115 470 278 278 325 449 176 176 176 328 328 200 200 464 89 446 116 131 133 364 109 109 403 171 171 171 252 449 449 176 176 328 200 200 250 345 141 141 281 281 9 198 22 448 448 448 14 411 350 350 350 350 350 350 348 359 81 324 324 324 422 164 164 164 214 214 214 214 214 200 200 200 195 248 248 394 76 75 377 87 87 87 236 321 384 371 374 374 374 374 132 132 236 36 310 107 395 395 151 151 151 169 150 39 86 86 238 6 127 114 361 361 361 361 361 388 388 303 117 48 229 321 247 126 126 292 292 408 408 408 408 391 321 321 373 373 400 400 400 400 30 422 422 162 232 68 68 115 273 470 486 486 486 460 460 169 169 36 227 483 226 440 89 446 322 67 394 133 364 321 364 109 109 171 171 171 252 252 449 191 191 191 191 131 133 133 321 345 333 220 220 220 164 483 14 226 321 321 209 411 297 297 297 297 297 297 297 293 497 175 81 58 58 156 156 156 156 156 245 399 217 217 217 70 65 65 428 428 146 146 358 449 449 449 242 116 116 33 33 217 217 217 217 473 290 290 290 290 290 434 434 434 339 303 303 48 48 48 417 491 170 170 28 28 28 28 491 362 362 362 491 491 362 362 491 362 491 491 211 211 491 341 369 369 369 369 21 21 21 21 21 21 21 21 21 101 101 101 149 149 228 321 321 7 217 473 473 329 329 329 460 169 169 164 164 219 219 485 485 378 88 88 242 446 348 90 90 465 445 445 351 351 486 315 319 450 413 413 76 449 449 300 191 313 314 198 22 283 455 38 232 232 238 6 272 470 171 171 171 252 99 436 436 60 60 298 116 33 250 217 473 65 486 486 460 460 169 150 54 238 6 272 300 334 382 313 251 251 251 241 431 405 405 405 206 178 458 192 176 135 135 200 200 200 199 230 230 230 230 215 35 96 198 22 283 455 236 129 321 108 119 351 278 278 143 458 192 192 277 385 325 180 106 405 405 405 206 169 352 352 25 459 459 271 271 31 9 142 221 321 259 190 488 488 488 488 215 35 29 29 382 313 236 36 36 119 351 153 153 153 372 467 337 337 301 236 108 377 123 123 416 458 144 180 180 84 84 496 88 88 176 176 135 328 200 200 248 58 72 437 437 350 350 350 350 203 53 381 394 394 155 155 332 332 332 186 162 342 115 273 273 151 151 215 215 354 29 334 334 334 59 452 452 229 321 247 126 126 126 326 326 326 326 326 326 326 326 101 149 149 149 228 321 83 55 55 322 67 212 34 145 145 486 376 460 460 169 150 150 86 238 6 272 57 57 57 203 473 118 118 118 118 402 198 22 5 5 455 349 234 234 261 25 106 265 265 265 85 85 146 438 173 349 234 393 198 164 470 498 498 313 285 325 41 324 324 422 36 310 161 161 487 487 288 290 290 290 290 434 434 339 250 250 345 389 389 389 314 131 472 401 401 401 80 321 80 321 478 66 68 482 115 273 374 374 374 132 413 33 250 212 354 420 420 420 464 464 255 255 251 251 241 431 235 235 235 235 235 235 413 303 303 303 48 48 48 417 417 170 170 421 421 491 421 421 491 491 128 128 491 128 128 128 193 193 17 +17 17 17 296 296 296 317 52 52 52 52 52 52 52 52 52 51 51 51 184 184 321 321 320 127 5 5 38 349 261 261 25 106 265 265 85 85 146 438 173 349 221 401 127 114 498 498 498 313 325 34 324 324 422 236 36 161 161 487 487 288 290 290 290 434 339 199 58 254 254 71 281 342 142 221 336 354 137 137 137 137 116 335 335 14 14 411 188 188 340 340 340 340 330 330 388 94 199 199 89 89 89 446 446 67 64 131 472 472 458 144 180 106 426 426 426 426 426 426 282 282 388 195 117 404 404 225 225 72 110 486 486 486 460 460 169 352 352 29 44 44 94 199 145 145 315 315 315 468 468 406 467 467 467 469 416 416 192 180 84 84 84 84 375 98 98 13 417 417 47 491 47 80 80 321 321 320 83 83 145 145 365 365 330 330 379 77 77 224 179 179 179 313 314 198 164 127 114 92 92 92 92 167 457 401 401 401 321 354 190 380 288 278 278 31 342 86 105 105 458 192 255 255 349 205 261 25 278 278 278 99 436 436 395 302 302 302 375 98 98 13 229 321 247 312 312 292 1 1 292 326 1 326 23 23 23 23 101 101 101 149 391 491 289 289 320 7 354 159 159 159 159 159 167 35 35 198 127 0 0 222 468 245 378 345 141 141 281 453 453 44 44 44 44 259 74 437 311 311 311 311 150 150 342 224 494 494 469 116 64 212 310 300 334 382 313 314 314 239 161 161 380 499 405 405 206 215 215 96 96 272 34 106 405 405 206 169 349 352 234 155 332 332 332 313 219 219 477 477 477 477 132 132 98 98 417 417 417 417 47 47 491 491 47 80 80 80 321 320 412 287 44 44 44 175 81 431 278 278 285 302 497 497 122 416 144 180 498 498 498 498 498 499 302 375 375 98 98 263 13 417 417 417 417 170 491 491 47 491 491 491 47 47 435 435 321 321 373 310 400 400 400 30 422 422 162 232 68 172 115 470 278 278 325 176 176 135 135 200 200 464 180 113 113 113 113 167 167 35 35 127 114 264 264 468 406 467 467 125 125 125 348 466 22 283 455 99 338 338 395 395 360 360 360 200 200 248 212 302 302 302 302 375 375 185 269 433 112 427 491 247 312 312 126 292 292 292 23 23 23 23 23 101 101 101 149 149 149 289 321 412 287 287 287 111 111 111 438 145 376 376 460 460 169 150 86 86 238 6 272 272 156 382 313 325 34 87 87 416 144 27 180 84 84 496 88 88 88 340 340 340 116 33 394 465 377 123 123 198 22 283 283 455 251 251 241 431 171 171 171 252 325 41 41 41 318 318 49 9 142 397 364 109 109 403 171 171 252 449 449 176 135 328 200 248 248 345 380 288 288 496 203 203 53 53 212 354 159 159 159 159 167 167 310 107 338 400 400 400 30 324 464 121 121 33 394 90 393 155 155 25 148 148 387 387 387 203 53 53 53 64 10 429 429 429 301 416 32 321 208 79 79 380 288 288 171 171 171 252 173 173 402 26 359 474 474 474 474 19 19 19 229 321 247 126 126 326 326 326 326 101 149 149 228 321 321 412 45 45 45 169 143 310 107 400 400 30 301 422 129 74 492 492 245 349 349 261 25 498 498 498 313 313 36 377 87 87 38 54 86 6 272 470 171 464 464 464 113 113 113 113 167 77 478 172 172 273 265 265 265 265 85 85 299 299 24 131 419 439 439 417 417 237 128 193 17 +17 17 17 363 363 363 51 51 184 184 321 373 373 338 400 400 400 400 213 356 356 368 453 342 168 44 44 44 44 458 144 445 351 343 343 343 343 171 358 358 358 39 342 224 168 111 111 111 111 438 186 99 395 395 389 389 236 36 478 224 273 470 403 403 403 207 207 207 454 263 48 417 417 417 417 417 237 237 442 28 28 28 491 28 442 442 442 442 362 362 362 362 362 362 362 362 362 362 305 218 218 218 218 366 218 491 491 366 366 366 366 366 366 491 366 366 366 366 316 316 316 316 435 321 289 321 209 287 287 111 111 111 111 438 438 203 10 479 307 307 307 61 285 34 154 154 458 96 342 86 105 336 470 470 151 151 178 178 96 36 449 176 135 135 200 464 44 44 44 416 321 208 79 498 498 498 498 499 302 375 98 98 98 13 13 414 170 170 442 47 47 47 491 47 47 47 491 316 316 80 80 321 289 66 66 66 179 179 179 179 314 314 196 217 473 486 486 329 460 169 169 352 183 485 485 485 374 301 129 321 259 425 425 386 431 376 365 365 299 76 76 465 26 26 359 359 474 474 474 19 19 229 321 247 126 126 126 126 326 326 326 326 101 408 408 408 391 391 391 391 316 316 80 80 289 321 321 321 188 177 177 177 356 356 356 342 168 44 44 44 8 32 32 32 321 354 354 153 153 153 153 387 387 387 146 464 464 111 111 111 146 438 202 402 402 402 75 144 27 437 319 319 203 53 53 394 90 393 234 205 155 332 148 148 148 372 372 372 59 452 263 263 78 414 47 47 47 47 47 491 47 47 80 491 321 289 289 373 451 451 451 30 30 30 99 338 338 389 389 389 389 314 32 239 354 420 420 420 213 213 252 422 183 183 451 286 286 286 286 334 59 59 59 452 263 321 247 247 126 126 292 292 326 326 326 326 326 326 101 101 101 149 228 289 289 320 217 473 258 258 31 342 224 494 494 368 453 342 483 14 145 145 284 329 329 175 175 81 81 469 416 458 458 96 342 68 115 273 365 365 365 330 348 64 212 300 382 382 313 186 162 162 482 482 105 105 336 470 470 432 330 330 64 64 77 77 342 224 300 334 334 334 59 245 43 43 345 141 141 141 281 9 9 6 6 87 87 87 87 8 321 354 190 288 288 360 360 200 200 183 183 57 57 57 57 53 473 106 410 410 410 410 173 280 29 29 382 245 349 155 155 165 165 165 53 53 10 479 331 84 84 496 274 173 280 29 38 38 162 482 482 105 336 144 180 496 496 496 274 99 99 436 107 60 423 423 349 349 205 155 155 332 332 332 372 372 245 203 473 429 429 429 429 19 19 454 454 417 414 170 170 170 28 491 28 2 2 2 2 491 2 491 491 2 2 2 316 316 316 491 316 316 73 321 321 321 321 7 127 5 5 38 162 342 86 238 6 371 470 171 171 171 252 99 436 436 60 298 275 116 33 250 217 473 65 486 486 486 460 169 169 150 86 238 6 272 300 334 382 245 43 43 364 276 109 278 278 31 342 342 224 302 302 302 302 375 122 122 122 352 419 427 229 247 312 15 15 15 15 15 193 193 193 17 +17 17 17 296 363 363 363 51 51 51 184 491 184 321 7 7 320 127 357 357 443 443 240 271 150 39 86 238 198 198 114 0 222 468 468 313 186 186 162 68 68 115 273 231 231 231 231 53 53 217 473 65 258 38 31 162 68 68 238 6 470 470 470 171 171 171 171 358 358 233 233 321 192 419 439 417 417 417 237 237 47 80 321 321 435 373 451 451 451 30 30 422 162 68 68 115 470 470 120 120 120 37 24 24 404 13 229 491 247 312 126 292 292 292 292 292 21 21 21 408 408 408 149 149 228 321 321 320 7 217 473 258 258 258 31 342 224 494 494 494 31 162 232 105 105 336 470 329 432 330 330 64 77 77 224 300 334 382 245 245 458 144 445 210 210 210 210 210 203 203 53 106 230 426 426 206 169 349 402 198 198 22 283 455 236 161 161 487 487 288 290 290 290 434 434 250 250 345 333 333 220 220 129 127 114 92 92 92 92 167 167 457 32 32 32 259 208 498 498 498 498 498 134 302 302 302 375 175 175 81 89 89 322 67 394 32 239 144 445 210 210 210 210 210 173 349 402 156 156 156 156 156 467 467 340 340 116 394 465 377 123 123 399 70 46 46 46 46 46 438 236 36 310 107 395 180 499 499 306 306 306 306 306 59 37 37 243 233 75 227 419 427 78 56 491 491 312 292 292 292 23 23 23 408 408 408 391 321 321 373 66 68 115 273 470 120 120 240 314 314 219 219 219 219 152 152 152 374 132 132 88 88 89 89 446 116 212 131 219 222 222 222 387 387 186 186 162 232 172 115 273 278 278 31 31 54 86 238 6 272 300 300 355 132 43 345 347 347 347 347 347 467 467 313 236 236 239 384 180 180 405 405 206 215 215 35 96 272 176 135 135 200 248 58 156 156 156 156 156 59 245 349 155 155 165 165 165 165 53 44 44 44 335 14 14 411 411 153 372 372 372 349 349 352 261 242 242 94 199 459 271 38 162 342 68 115 273 265 265 265 85 146 146 175 175 81 459 203 203 117 404 229 247 126 126 126 326 326 326 326 101 101 149 149 228 321 412 83 55 55 55 322 67 466 45 45 45 45 36 36 107 219 152 152 152 132 378 345 389 389 389 314 239 239 420 420 420 464 255 255 255 251 251 241 431 235 235 235 235 348 200 248 76 393 155 332 332 332 245 156 156 156 156 245 245 129 129 321 74 190 488 488 151 368 453 453 168 11 11 379 64 243 465 26 359 474 474 474 474 19 19 48 417 417 417 417 170 47 491 47 491 47 491 491 47 316 80 289 321 7 7 127 114 92 92 92 92 240 167 77 77 342 168 106 297 297 297 297 297 297 293 175 111 111 111 111 438 438 438 10 479 331 84 84 84 88 88 255 255 255 8 354 180 113 113 113 113 450 285 285 277 277 277 277 24 131 439 417 417 417 417 491 491 47 491 80 80 321 412 83 83 83 194 194 55 55 322 212 34 111 111 111 111 111 438 438 58 72 110 202 202 202 202 202 29 242 116 90 394 239 27 180 405 405 206 240 285 34 475 475 475 475 475 475 301 399 70 138 138 138 138 138 372 245 245 14 411 411 153 153 372 372 372 349 349 155 29 242 275 379 379 471 471 49 142 221 336 144 121 121 379 394 478 68 342 115 444 444 444 213 464 139 139 302 302 497 122 122 131 183 286 286 286 286 406 406 467 467 255 8 354 180 180 113 113 113 450 450 413 37 243 270 270 433 390 390 18 112 56 56 56 312 312 312 15 15 15 15 15 15 15 15 15 15 15 260 260 260 193 193 193 193 17 +17 17 296 296 296 317 317 317 317 317 461 491 461 461 461 461 461 461 461 184 184 289 321 321 209 287 111 111 111 438 438 10 239 384 371 84 84 350 350 413 64 212 131 34 145 319 348 348 212 212 300 494 469 186 162 232 232 232 482 238 6 272 470 470 294 294 294 294 294 294 282 388 388 303 243 75 131 419 439 439 439 78 78 47 47 47 47 491 47 47 47 491 47 47 491 491 80 442 289 66 66 68 179 179 179 179 314 314 196 196 70 65 329 486 329 460 169 164 164 485 485 485 485 132 274 58 58 72 72 72 437 268 139 293 293 215 215 35 26 26 262 262 262 262 262 342 342 26 26 359 474 474 474 474 19 454 229 247 247 126 126 326 326 326 326 101 101 101 149 149 228 321 7 345 109 109 278 278 99 447 447 107 176 135 135 135 200 200 248 212 212 45 45 45 45 35 196 196 217 70 65 65 329 42 42 380 288 256 256 139 175 175 423 423 423 43 43 345 141 141 281 281 453 168 415 415 415 36 131 119 72 72 72 110 294 294 294 294 294 282 388 388 195 394 76 75 377 87 87 87 129 321 144 27 351 496 496 496 274 215 215 401 401 321 354 333 220 220 198 22 283 38 162 342 342 224 494 494 236 36 107 485 485 485 134 88 418 418 418 418 418 252 99 436 436 60 298 298 298 303 117 48 13 229 321 247 312 312 187 187 12 12 12 12 12 12 260 260 260 260 491 163 163 366 366 491 366 491 366 366 316 316 316 316 321 321 321 435 435 7 7 364 276 109 109 443 443 443 139 139 293 293 293 122 219 219 152 152 152 152 314 314 472 401 259 354 180 443 443 285 285 382 382 245 143 458 208 441 151 151 151 169 150 238 238 272 60 60 242 116 466 22 283 416 144 79 498 498 498 498 499 355 302 375 375 98 98 263 13 417 417 417 417 237 237 237 47 47 47 491 47 47 47 80 80 80 321 435 435 66 115 179 179 179 179 314 198 22 283 455 38 162 86 238 6 470 470 171 171 171 99 99 436 436 60 298 116 33 250 217 473 65 486 460 460 169 150 86 6 272 300 382 313 458 445 445 445 351 351 264 468 468 134 134 175 262 262 262 262 39 342 26 26 359 474 474 474 19 19 454 229 321 321 247 126 126 126 292 326 326 326 326 326 326 21 326 21 326 101 101 101 101 149 149 149 228 321 412 412 287 287 111 111 111 438 438 236 239 384 371 470 264 264 468 468 313 186 162 342 68 115 470 403 403 171 171 422 186 99 338 338 395 494 139 139 497 122 8 420 420 420 420 464 171 171 171 134 8 29 100 497 122 36 377 87 87 87 154 154 154 458 96 96 232 105 105 336 425 386 386 431 290 290 290 290 434 434 434 339 195 117 117 417 417 417 417 225 225 435 435 338 400 400 400 30 422 281 342 342 105 221 144 180 106 189 240 285 34 44 44 236 36 108 119 119 351 319 319 319 348 200 200 69 223 223 130 402 156 156 156 156 406 467 467 350 350 350 350 350 350 413 413 413 195 33 212 198 114 92 92 92 92 92 167 35 478 478 68 68 172 115 273 498 498 498 396 396 385 233 242 242 275 303 303 303 303 48 305 417 78 170 421 421 491 491 128 128 491 128 128 128 193 193 17 +17 17 17 296 296 52 52 52 52 52 52 52 363 101 101 51 51 228 491 289 321 7 473 473 329 476 171 252 378 337 337 324 301 216 216 0 0 0 301 378 43 345 347 347 347 406 467 145 113 113 113 113 285 34 223 462 402 402 221 401 259 354 153 153 153 153 387 387 387 318 318 185 453 9 168 69 223 198 198 22 283 455 129 354 190 380 499 288 365 365 282 299 64 212 131 219 219 152 152 152 378 43 364 276 174 174 319 319 348 64 76 449 191 191 191 191 24 131 404 417 417 417 417 417 237 237 237 491 237 28 491 28 362 491 102 362 102 362 362 362 491 366 491 316 491 491 316 316 435 435 321 321 373 451 451 30 30 301 378 364 276 276 346 346 405 405 405 405 206 178 96 96 227 472 472 472 472 401 75 310 107 395 180 329 426 426 206 348 76 465 26 26 359 359 359 474 474 324 464 464 255 255 255 43 364 276 109 109 403 403 403 207 207 207 19 19 454 197 197 80 80 321 321 320 7 354 420 420 420 360 360 360 135 135 135 200 200 248 58 58 72 437 319 319 319 348 348 64 248 212 79 495 334 41 41 41 19 454 229 247 247 126 126 126 326 326 326 326 326 326 326 326 326 326 101 101 101 149 149 149 228 321 412 83 194 194 194 194 322 388 67 466 127 448 448 448 464 319 319 319 348 90 90 205 261 25 148 148 148 387 396 186 310 107 60 60 298 94 11 11 11 457 457 217 217 473 65 486 486 486 460 460 169 169 164 164 485 485 485 485 485 374 132 43 43 345 141 141 141 281 342 26 26 251 241 431 443 443 169 169 402 402 6 272 377 87 87 236 239 239 384 371 371 374 374 374 374 132 132 132 132 132 132 132 132 197 197 321 127 114 114 92 92 92 92 92 460 167 385 35 75 227 472 397 397 345 407 407 407 407 407 310 447 397 397 141 141 141 281 54 9 142 72 72 72 437 306 306 306 306 396 396 285 300 382 382 349 205 155 332 332 332 58 58 183 183 183 57 57 57 57 203 53 381 381 195 394 212 198 127 114 89 446 446 67 394 394 32 32 32 401 401 321 75 354 485 485 286 286 286 468 396 313 325 325 176 135 135 200 200 199 44 44 44 251 251 251 251 241 241 431 265 480 480 480 85 85 85 146 464 464 275 275 388 94 199 340 340 199 199 154 154 154 36 77 342 342 86 221 336 321 384 384 371 93 120 120 120 120 330 388 303 195 195 303 117 404 404 78 78 491 491 312 312 292 292 292 12 12 12 23 23 260 260 260 260 260 391 391 391 491 289 289 321 7 7 7 364 276 276 346 346 405 405 405 206 178 35 35 458 192 180 230 230 230 230 215 215 35 96 401 75 108 377 123 123 123 88 44 44 44 416 416 239 144 79 498 498 498 498 498 498 134 302 375 375 375 375 98 98 98 13 417 417 417 417 237 237 47 47 47 491 491 80 80 491 289 321 321 287 287 44 44 44 38 162 232 482 482 482 238 6 161 161 79 487 288 290 290 290 434 434 339 339 310 107 447 221 144 79 498 498 498 498 498 302 302 375 375 98 98 225 483 226 209 44 44 44 44 33 335 14 14 411 411 153 153 372 372 372 396 349 349 234 261 261 242 242 116 116 33 90 90 212 239 79 79 498 498 498 498 134 302 375 375 375 98 13 229 321 247 15 15 15 193 193 193 17 +17 17 17 363 363 363 51 149 228 228 321 83 83 194 194 194 194 322 67 64 212 212 34 44 44 44 217 217 473 65 486 365 365 460 330 388 64 212 131 34 223 223 130 402 402 156 156 156 156 59 59 59 245 245 43 43 364 276 346 346 346 346 346 265 85 85 146 438 186 338 338 400 400 30 378 378 345 141 141 141 141 281 453 242 242 116 64 131 34 44 44 8 354 354 153 153 153 153 387 387 387 387 207 207 207 98 48 417 417 417 417 170 170 491 28 28 28 28 2 2 2 491 2 2 491 2 491 2 2 2 366 366 491 316 316 316 316 491 73 491 289 321 7 7 217 217 473 65 486 486 486 486 460 460 169 169 169 164 164 164 219 219 219 485 485 374 374 132 132 32 32 321 208 208 79 79 380 380 288 84 496 496 496 496 274 274 413 413 413 413 64 212 212 34 34 340 340 116 33 394 478 478 232 232 232 232 232 105 105 336 354 470 286 278 498 468 468 468 468 468 467 277 385 325 449 34 253 253 253 453 168 30 30 30 422 129 75 108 119 308 308 308 308 308 308 308 396 313 64 212 131 255 255 8 354 180 113 113 113 113 113 450 450 413 24 36 449 89 89 116 33 33 394 90 338 338 338 338 338 338 395 189 151 151 169 349 349 352 29 302 302 302 302 497 122 122 122 314 401 401 401 321 310 107 107 395 432 432 432 330 379 64 76 36 26 26 359 474 474 474 324 301 239 384 371 180 315 315 315 450 450 413 466 466 22 283 455 455 259 74 425 386 431 486 486 460 460 167 35 393 205 321 155 148 148 148 387 387 203 53 90 90 75 119 441 441 153 153 153 153 372 372 37 314 77 77 342 9 224 156 156 156 156 59 452 452 263 229 247 247 312 312 312 292 292 292 292 292 292 292 1 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 260 260 260 260 408 408 391 391 321 321 373 373 400 400 400 30 30 58 110 254 254 254 254 314 35 259 137 137 137 137 399 250 250 276 346 346 346 206 206 240 310 310 107 395 176 135 135 200 248 183 57 57 57 57 57 53 473 335 14 411 145 463 463 463 463 29 29 382 313 186 186 162 68 68 273 278 278 278 330 379 394 77 342 342 451 30 30 30 464 254 254 254 131 129 321 74 437 311 311 311 311 311 311 460 169 150 86 86 238 6 272 272 334 334 334 59 59 452 452 229 321 247 126 126 126 292 292 292 326 408 408 149 149 228 321 321 209 83 55 55 322 322 67 310 400 400 400 30 30 3 58 72 72 110 110 254 254 254 240 131 58 183 156 156 156 156 245 335 14 411 265 265 265 265 265 85 85 146 318 368 342 168 168 125 125 125 125 348 199 183 183 57 57 57 57 53 53 10 10 479 331 331 315 315 315 315 315 450 450 450 450 98 98 13 13 78 170 170 170 170 28 28 2 491 2 2 491 2 2 2 2 316 491 316 316 316 316 289 289 289 321 7 7 217 473 329 329 329 329 329 329 329 164 164 485 485 485 301 378 378 345 141 141 141 281 9 238 221 196 479 307 307 307 61 167 167 457 457 251 251 241 367 367 367 367 458 192 176 135 135 200 200 464 464 415 415 415 415 415 240 285 156 156 156 156 59 452 452 229 321 247 312 15 15 15 15 193 193 193 17 +17 17 17 296 491 317 317 491 491 184 184 184 321 320 412 44 44 44 44 36 310 107 107 395 437 91 91 91 91 85 85 139 139 293 122 122 34 69 223 130 280 44 44 8 8 354 180 113 113 113 285 285 34 44 251 251 251 241 241 431 443 443 173 173 280 242 275 275 116 195 117 117 48 417 414 170 491 170 491 321 211 211 312 312 292 292 326 326 326 326 23 101 101 101 149 391 491 289 289 321 144 144 106 499 306 306 306 306 306 396 396 215 215 96 36 272 272 340 340 94 199 44 44 44 4 280 104 104 104 104 104 468 337 337 337 337 422 422 99 338 338 338 338 395 395 153 153 153 153 372 372 396 385 385 36 227 419 225 225 80 80 491 321 321 7 7 32 4 104 104 104 104 104 468 337 337 337 324 422 143 36 108 119 119 437 437 265 265 428 428 428 146 358 358 233 75 227 419 225 225 225 80 80 80 80 7 7 4 280 104 104 104 468 468 337 337 337 324 3 14 14 411 411 284 319 319 240 416 416 96 134 134 359 359 81 166 166 324 301 236 239 161 161 79 288 288 151 151 271 271 39 342 342 342 224 462 462 462 462 402 402 219 219 219 219 180 180 443 139 175 175 81 84 496 88 88 109 459 459 459 99 99 447 447 447 221 336 144 208 79 380 288 403 403 403 171 324 3 301 301 43 364 364 345 109 278 278 116 33 394 77 77 342 68 342 224 41 41 41 41 19 19 454 229 321 247 247 312 126 292 292 292 292 292 292 23 23 23 23 23 23 23 260 260 260 260 260 260 391 391 228 321 373 373 400 400 400 400 301 378 43 364 276 210 210 210 372 372 372 467 44 44 44 349 349 234 234 261 261 25 470 171 171 171 171 252 252 325 34 191 191 191 314 131 472 401 401 321 259 190 190 380 380 315 315 315 315 450 450 450 413 348 394 478 478 232 232 172 115 273 470 171 171 171 252 175 81 300 300 382 245 58 58 72 110 110 486 486 486 460 460 460 169 385 233 227 227 419 225 225 225 225 412 412 83 55 55 322 67 212 401 321 354 255 255 116 94 94 398 213 213 213 213 252 164 164 164 164 164 283 283 455 72 72 72 110 486 486 486 486 460 282 282 385 385 227 227 419 427 321 247 126 126 326 326 326 326 101 408 149 149 321 412 154 154 154 143 96 96 66 232 68 238 6 272 470 432 432 432 330 64 64 64 212 176 135 135 200 200 248 248 212 384 180 315 315 315 315 450 413 348 199 58 156 156 156 156 156 245 8 8 354 180 376 376 376 376 376 376 460 460 169 178 233 321 208 133 397 345 347 347 313 313 236 36 36 108 119 119 485 374 374 374 374 132 132 132 8 259 259 190 190 380 288 288 403 171 171 171 246 246 318 24 24 270 270 342 168 168 462 462 4 4 4 4 104 104 104 104 104 468 337 337 337 324 324 422 349 164 164 164 164 164 25 278 278 278 278 278 178 143 321 192 192 419 225 47 491 80 80 80 80 321 75 371 490 490 490 162 232 232 68 68 115 273 273 265 265 265 428 146 146 325 34 191 191 191 314 26 26 359 166 166 166 324 301 42 42 42 147 147 147 380 288 288 443 120 120 120 37 37 24 24 131 404 225 225 225 80 321 373 72 72 72 110 264 264 264 264 264 264 59 59 59 59 452 263 13 78 170 170 491 421 491 491 211 491 421 491 15 15 15 193 193 193 17 +17 17 17 296 363 363 363 52 52 52 52 52 408 51 51 51 184 289 321 320 156 156 156 156 245 349 205 205 261 343 343 343 343 343 343 252 186 39 342 86 86 142 397 141 141 141 281 162 232 232 232 482 482 105 105 196 70 65 65 481 481 481 481 182 182 182 375 375 375 98 98 98 225 225 80 80 491 80 80 321 7 7 364 276 276 346 346 428 428 428 428 146 146 358 358 233 321 227 227 419 225 89 483 321 188 89 446 446 33 394 394 76 164 164 164 164 164 278 278 278 278 120 330 303 303 303 303 117 48 48 417 47 47 491 491 80 80 80 80 289 321 320 287 287 297 297 297 297 293 293 186 162 54 68 115 224 273 84 84 84 274 399 399 70 70 383 383 383 383 167 310 107 447 447 447 393 234 261 25 380 288 151 178 178 458 458 208 302 302 302 302 375 375 122 122 227 419 419 427 82 321 312 312 126 292 292 292 292 23 23 23 101 101 101 149 228 228 321 320 373 156 156 156 245 399 217 217 70 473 65 315 315 315 315 315 450 450 293 169 352 352 352 352 97 397 397 345 345 141 141 281 453 9 26 26 251 241 241 431 284 306 306 306 306 306 306 396 396 396 37 233 36 310 107 107 447 18 97 97 225 321 412 83 55 55 446 67 394 478 66 172 115 273 273 84 410 410 410 43 29 347 347 245 245 58 156 156 156 245 14 14 14 411 287 265 265 265 265 265 265 85 85 85 207 207 318 185 269 433 433 160 97 397 397 345 407 407 407 407 310 107 447 447 26 251 241 367 367 367 367 458 96 96 272 472 472 221 401 321 321 208 79 79 288 288 360 360 360 360 434 434 339 199 340 340 340 116 33 394 478 68 68 172 115 273 319 319 319 203 53 53 251 251 241 431 428 428 428 428 146 146 385 77 77 342 224 89 89 116 33 250 217 217 473 65 374 374 374 132 132 37 37 24 321 270 433 160 112 427 229 247 312 126 326 326 326 101 101 149 149 321 412 412 83 55 55 446 446 67 131 472 472 458 208 208 79 79 380 288 403 403 403 403 207 324 464 464 464 446 116 94 199 493 493 493 493 493 216 300 334 334 304 304 304 185 185 269 323 18 112 112 56 56 56 170 170 28 28 28 491 491 28 28 362 491 362 362 362 491 491 362 362 362 362 40 40 362 218 491 491 305 305 366 366 366 305 366 435 435 435 435 435 435 321 435 435 373 373 66 68 172 115 344 344 344 344 344 274 274 349 205 261 25 106 306 306 306 353 396 313 216 22 448 448 448 14 411 411 153 153 153 387 387 313 314 196 196 398 134 134 468 337 337 337 464 464 255 255 215 96 368 453 453 168 273 498 498 498 396 173 29 29 334 334 59 452 452 263 13 229 491 442 312 312 312 292 292 292 292 292 326 326 326 326 326 326 101 408 149 228 321 305 209 287 44 44 94 199 154 154 154 96 96 482 482 238 6 161 79 153 153 153 153 387 396 240 314 196 309 199 264 264 264 468 468 468 337 337 464 464 464 255 255 215 96 478 342 9 168 470 498 498 498 396 173 173 280 29 334 334 59 452 452 229 321 247 15 193 193 17 +17 17 51 51 228 289 321 7 70 70 65 428 428 428 146 146 325 449 202 202 202 202 402 162 232 172 172 267 267 267 267 267 434 434 339 248 248 212 45 45 45 45 198 22 5 455 236 129 321 310 107 107 395 395 278 278 330 116 195 250 250 345 141 141 281 281 453 9 142 4 4 4 104 104 104 104 104 468 337 337 324 301 143 129 401 321 74 74 441 441 441 441 441 387 360 360 360 252 339 76 465 449 191 191 191 191 24 325 89 89 446 33 394 76 74 190 492 492 492 313 94 94 331 331 315 315 315 315 450 450 450 413 413 243 243 77 433 86 238 6 6 227 427 427 491 247 126 126 292 326 326 326 326 101 408 149 228 228 321 320 321 127 45 45 45 45 35 35 127 5 5 455 236 129 259 354 278 278 278 278 416 416 192 180 106 265 265 265 265 85 85 85 146 318 49 9 142 397 347 347 347 347 245 349 349 205 261 261 25 424 424 424 175 81 462 462 462 130 402 478 162 232 232 232 232 105 105 336 336 354 485 278 498 468 468 467 277 277 469 325 449 89 89 446 53 394 212 280 106 265 428 428 146 438 173 280 280 486 486 486 460 169 150 150 342 342 224 469 469 325 449 41 41 41 41 19 19 19 454 454 454 78 491 170 491 312 187 187 292 12 408 408 408 149 228 321 321 127 45 45 45 45 35 198 22 5 455 399 217 473 65 315 315 315 315 450 450 450 169 169 164 164 397 397 397 141 141 141 281 31 162 232 232 68 68 482 397 397 397 109 213 213 213 252 252 36 26 26 26 251 241 431 278 278 278 215 215 35 96 96 465 272 89 89 446 67 131 34 154 154 458 96 96 54 142 105 336 336 190 380 288 151 151 169 150 342 342 224 224 494 459 459 459 459 37 173 352 352 352 427 491 247 126 126 126 326 326 326 326 101 101 101 149 149 228 321 321 320 127 45 45 45 45 35 35 198 22 5 455 349 205 234 234 261 25 148 148 148 148 372 372 372 396 58 72 72 110 110 120 120 120 120 240 24 24 133 133 364 345 141 141 141 141 281 281 9 142 221 336 336 259 190 190 380 380 499 499 499 405 426 426 426 426 206 206 206 37 24 34 89 89 446 116 394 90 393 234 234 234 234 261 25 441 424 424 424 182 182 375 375 375 98 98 13 13 417 170 170 47 491 47 491 491 491 2 491 491 316 73 289 289 320 412 188 188 340 340 116 33 394 478 338 338 338 338 395 470 153 153 153 153 387 372 396 396 385 233 227 227 419 439 417 78 47 47 491 47 47 491 80 321 321 80 321 435 209 287 287 353 353 353 353 396 313 236 36 384 490 490 490 31 162 68 115 115 273 308 308 308 396 313 94 94 176 176 135 328 200 200 199 255 154 154 129 401 321 96 66 482 238 272 79 153 153 153 387 387 396 314 196 196 479 398 398 264 264 468 467 467 255 255 215 96 478 342 68 115 273 498 498 498 498 396 173 173 29 29 334 334 59 59 452 263 229 247 247 126 126 326 326 326 326 326 326 326 101 101 101 149 149 228 321 289 320 7 70 65 65 389 428 428 146 240 325 34 202 202 202 402 221 458 27 121 121 121 33 394 76 259 208 208 386 386 386 444 374 374 374 252 325 34 191 191 191 37 24 404 427 229 247 193 193 17 +17 17 17 363 51 51 184 320 320 345 333 333 220 220 402 66 66 68 115 344 344 344 344 274 274 251 251 241 431 374 374 374 374 285 34 469 469 143 458 208 79 459 459 271 31 342 86 26 26 166 166 166 464 464 464 255 255 349 234 234 261 190 380 288 288 403 403 403 207 207 207 37 24 24 404 439 417 417 417 170 170 28 28 491 28 491 362 491 491 362 491 362 491 491 491 362 362 491 362 362 491 40 211 369 369 369 369 21 21 21 21 21 21 21 408 408 408 149 149 228 321 321 320 7 217 70 65 486 486 486 460 460 169 169 164 164 164 485 485 485 485 374 132 132 58 58 72 268 268 268 268 268 88 88 109 84 463 463 463 173 280 29 334 59 59 452 263 263 417 417 417 417 80 321 321 7 7 345 141 141 141 281 162 232 232 232 482 105 336 336 470 470 264 264 264 264 468 468 313 313 314 314 198 22 448 448 448 464 106 106 372 372 372 313 236 236 36 371 485 213 286 286 286 139 302 302 175 175 69 223 223 130 478 232 232 105 105 336 321 354 470 213 213 252 143 192 176 135 135 135 200 248 248 248 393 205 261 25 498 498 498 498 498 396 271 271 39 54 86 238 6 427 427 247 247 126 126 326 326 326 326 101 101 101 149 228 321 321 373 155 155 155 332 332 332 372 372 372 467 253 253 38 162 232 172 172 115 485 374 374 374 348 94 199 253 253 253 99 338 400 400 400 30 422 143 144 27 121 121 121 394 76 76 208 208 386 386 444 444 374 374 252 325 191 191 191 37 314 198 198 45 45 45 183 183 451 30 30 301 378 345 141 141 281 342 342 221 336 144 27 27 351 319 319 319 53 53 176 135 135 200 248 76 75 108 377 123 123 123 123 132 58 156 156 156 156 59 59 452 229 229 247 126 126 326 326 326 326 101 101 408 149 228 321 321 373 400 400 400 30 422 422 162 482 482 482 482 238 272 189 189 189 189 285 34 230 230 230 230 230 215 215 35 74 419 439 439 78 78 47 47 80 80 80 289 289 320 208 79 499 486 486 460 460 169 150 342 105 105 336 354 176 176 135 135 200 248 248 333 333 220 220 220 142 133 364 276 174 174 174 174 319 319 348 348 195 195 90 90 90 393 234 234 234 234 261 261 25 470 278 278 278 330 330 388 195 195 195 250 250 394 32 32 259 354 190 380 380 315 315 315 315 450 450 450 413 413 33 58 58 72 72 72 294 294 294 294 294 294 294 294 294 282 282 388 195 64 212 131 427 321 247 126 126 326 326 326 326 101 149 149 228 321 320 22 5 455 455 72 72 72 294 294 294 294 294 388 348 64 64 212 212 26 302 302 302 175 69 69 69 130 280 44 44 44 99 338 338 338 338 338 395 470 486 486 486 460 460 215 354 41 324 324 324 3 335 14 226 411 411 424 424 424 424 424 424 274 122 122 131 472 393 234 234 261 25 486 486 486 460 460 169 99 436 436 436 60 242 116 116 33 212 131 472 221 321 144 27 437 437 306 306 306 460 215 35 29 469 277 277 314 401 401 321 354 180 376 376 376 376 376 282 207 37 24 192 192 427 321 247 126 126 23 408 408 408 149 228 321 321 320 127 448 448 448 14 14 411 493 493 493 493 493 216 127 300 334 334 59 452 186 99 338 338 400 400 400 30 422 58 58 72 110 110 139 139 139 293 293 122 122 34 180 113 113 113 113 167 167 36 449 123 123 123 123 183 183 57 57 57 57 57 203 381 381 381 48 48 417 417 417 170 421 421 421 421 491 128 491 128 128 193 193 17 +17 17 17 296 317 317 317 491 491 491 491 491 461 184 321 435 435 321 435 287 287 111 111 111 438 162 342 224 494 494 236 74 470 496 496 496 496 496 274 368 368 9 219 152 152 152 88 353 353 353 245 399 70 473 258 31 54 86 238 272 272 300 245 399 217 473 65 486 460 460 169 164 485 485 485 382 422 458 458 144 27 437 437 151 169 169 164 402 221 401 321 354 29 498 313 313 325 34 462 462 130 402 321 259 79 79 288 360 360 360 200 200 248 445 445 180 171 171 171 252 215 8 354 100 302 375 497 98 185 269 433 390 160 112 112 56 491 312 312 312 187 187 12 12 12 12 12 12 12 23 260 260 260 260 391 391 391 491 321 373 338 400 400 400 400 30 422 162 68 68 115 470 470 120 120 240 314 196 340 116 199 44 44 44 129 259 74 492 236 129 321 445 445 485 485 485 485 485 485 374 374 132 359 81 485 485 134 382 134 359 359 81 166 166 324 422 143 401 401 321 321 144 208 208 208 386 386 386 286 286 286 286 286 286 334 382 59 304 313 186 162 66 482 482 482 482 105 397 336 109 213 213 213 252 143 131 472 393 393 261 343 343 343 343 343 343 343 358 39 39 433 433 160 427 56 247 247 312 126 292 292 326 326 326 326 326 101 101 101 149 149 321 412 287 287 111 111 111 356 356 53 394 212 4 104 104 104 104 104 337 337 337 301 143 144 208 386 431 376 376 376 240 24 36 87 87 87 162 232 172 115 267 267 267 267 267 219 219 477 477 477 477 477 132 13 229 491 247 312 126 292 292 292 23 23 23 101 101 101 149 228 321 412 412 287 111 111 111 378 378 141 141 281 453 142 221 336 420 420 420 416 458 445 485 360 360 360 94 176 135 135 248 76 108 377 87 87 129 354 420 420 420 464 464 44 255 38 349 205 205 261 487 288 288 288 171 171 252 24 131 219 152 152 152 378 43 345 347 347 372 396 313 457 131 221 458 144 27 351 351 319 319 203 53 176 135 328 200 248 393 205 155 332 332 332 332 245 399 429 429 429 429 19 19 229 247 247 126 193 193 193 +17 491 211 491 296 296 363 363 326 101 101 149 149 228 321 321 287 111 111 111 438 58 110 254 254 254 314 196 196 217 473 476 476 476 252 325 34 230 230 230 215 35 196 196 46 46 46 46 438 399 399 217 70 65 480 480 480 480 85 299 299 339 212 131 427 229 247 126 326 326 326 101 149 149 321 321 320 45 45 45 325 118 118 118 118 402 219 152 152 422 236 239 384 371 278 278 314 196 196 242 242 33 90 465 144 27 351 351 319 319 203 53 394 76 205 155 332 332 332 399 399 429 429 429 422 143 108 377 377 87 236 10 479 331 331 428 265 428 428 428 146 207 358 233 131 419 321 247 15 193 193 +17 17 17 363 363 363 51 149 228 228 321 321 287 287 111 111 111 111 378 378 43 389 389 389 314 242 242 394 394 32 259 420 420 420 420 464 44 44 236 129 354 354 278 278 325 34 300 255 349 349 234 234 261 190 487 288 288 288 403 171 207 207 37 24 131 427 491 247 126 126 326 326 326 326 101 149 149 149 228 321 209 83 55 55 55 55 322 94 199 177 177 177 457 389 389 389 314 259 259 420 420 420 301 301 251 251 251 251 251 251 251 241 266 266 266 266 266 173 402 402 26 359 359 81 166 324 422 36 377 87 87 38 162 232 172 26 26 359 444 444 213 252 8 354 89 340 116 199 44 44 43 43 364 276 346 346 346 265 85 85 85 139 139 293 293 122 122 35 401 401 401 75 310 107 107 107 395 395 351 264 264 264 468 468 406 337 337 324 252 143 36 161 487 487 487 41 324 3 335 14 14 411 297 297 297 297 297 297 297 293 293 497 497 43 43 364 364 276 346 346 428 428 428 146 358 76 449 472 397 397 333 333 220 220 164 142 221 401 321 321 321 354 425 425 431 374 374 374 374 374 132 132 203 203 53 473 340 340 116 466 22 283 455 399 217 70 473 65 65 350 350 413 413 33 33 394 478 338 338 338 395 470 480 480 480 85 299 299 339 64 212 465 384 430 430 430 430 430 465 449 152 152 152 152 349 164 164 214 214 214 214 360 328 328 200 243 233 192 192 419 229 491 312 312 491 187 187 187 201 201 201 201 201 201 201 201 491 201 491 201 201 435 211 211 408 149 321 321 321 219 152 152 152 152 143 458 144 389 389 389 325 34 255 399 217 217 65 486 486 486 460 460 240 310 107 395 242 116 116 219 219 152 152 378 378 347 347 347 236 239 161 397 133 276 109 189 139 139 175 81 176 135 200 464 464 340 116 33 33 250 217 70 70 70 65 306 306 306 306 396 134 215 35 29 100 497 497 497 58 72 72 72 72 437 481 481 481 481 481 481 182 182 182 375 375 375 185 269 342 86 221 336 144 430 430 430 430 430 430 430 430 430 131 449 449 485 152 477 477 374 132 132 13 229 491 247 312 15 15 15 15 193 193 193 17 +17 17 17 296 317 317 317 317 317 491 317 317 461 461 461 461 461 461 461 184 184 184 184 321 320 7 217 217 217 473 329 329 329 329 329 460 169 164 164 164 219 485 485 485 374 132 132 274 58 58 72 110 254 254 254 254 314 401 75 108 119 295 295 295 295 295 143 458 192 242 242 116 466 466 22 283 455 38 162 54 482 482 105 221 336 79 79 499 499 405 206 206 348 199 41 324 324 301 251 241 431 278 278 285 302 497 497 497 58 58 72 110 294 294 294 294 294 294 282 388 64 212 131 335 14 14 411 411 284 405 405 405 206 178 35 35 441 441 109 109 134 313 24 26 26 359 359 474 474 324 464 340 340 340 116 33 58 183 183 257 257 257 257 257 120 50 50 185 185 185 269 433 433 390 18 427 56 247 312 312 126 292 292 326 326 326 326 326 101 101 101 408 149 149 321 289 7 7 7 4 127 361 361 361 361 361 330 388 94 199 89 89 446 116 33 212 212 127 114 361 361 361 264 264 264 264 468 59 452 452 263 263 417 417 414 47 80 321 321 435 373 451 451 30 30 236 325 490 490 38 162 342 115 273 265 265 428 146 146 325 34 191 191 325 133 133 259 181 181 181 181 167 457 75 108 377 87 87 236 325 371 374 374 374 374 132 98 98 48 48 417 417 170 170 102 102 28 28 40 40 40 40 40 40 40 40 40 40 40 491 362 491 218 366 305 305 491 366 366 40 40 40 40 435 435 435 435 435 373 451 451 30 30 30 422 458 144 27 389 389 389 389 196 196 479 331 307 307 61 61 167 167 457 75 108 119 351 351 139 139 139 293 293 293 216 216 114 258 258 31 54 54 238 238 221 321 310 107 395 395 437 91 91 91 85 85 85 85 450 293 293 122 122 131 133 333 333 220 220 198 22 44 236 129 321 208 208 425 386 241 431 84 496 496 88 88 176 176 176 328 200 200 464 106 265 265 265 265 265 85 85 85 207 318 318 39 433 433 160 427 247 247 126 126 126 326 326 326 326 326 326 326 101 101 149 149 228 321 320 127 45 45 45 45 35 198 114 0 0 222 58 58 110 254 254 254 314 401 321 354 137 137 137 94 44 44 44 217 473 65 258 31 31 342 68 68 68 238 6 272 470 470 470 171 171 171 358 358 358 233 321 192 192 419 419 439 439 78 78 78 491 28 491 28 28 28 2 491 491 2 341 341 341 12 12 12 21 21 21 408 408 149 228 321 321 373 451 451 30 30 30 378 378 389 389 389 389 129 259 108 119 295 295 295 295 295 143 458 192 156 156 156 245 245 58 72 72 350 350 350 350 350 350 413 203 381 53 89 89 322 67 466 241 431 443 167 167 457 196 217 65 329 329 42 42 147 147 380 256 139 175 175 423 423 423 423 236 75 371 371 374 374 132 132 216 127 114 92 92 92 92 92 167 385 243 227 419 439 78 78 170 170 170 47 491 491 2 2 491 2 2 491 491 2 491 316 435 435 316 316 435 321 435 373 338 338 400 400 400 30 422 143 458 144 389 389 389 389 314 242 242 394 76 76 259 420 420 420 301 26 251 241 431 443 443 169 169 402 402 6 272 415 415 385 129 401 321 259 190 380 499 499 428 428 146 146 457 457 147 147 380 288 288 173 173 29 29 495 495 406 467 467 365 330 94 475 475 324 324 58 58 72 110 268 315 315 315 268 450 450 98 98 229 247 15 15 193 17 +17 17 17 363 51 51 228 321 320 309 331 331 231 231 399 399 473 65 486 486 460 240 285 300 382 245 43 364 276 181 181 181 181 167 35 35 196 196 473 258 258 31 342 86 86 6 272 470 470 171 171 252 458 458 192 389 314 314 321 354 137 137 137 399 217 217 473 476 476 476 476 476 476 207 37 24 131 427 229 321 247 312 126 292 292 23 23 23 23 408 408 391 228 228 321 373 66 172 115 273 344 84 274 88 14 14 411 297 297 297 297 297 297 293 293 122 35 458 208 208 441 109 151 151 151 169 150 54 238 238 310 107 60 298 298 298 379 471 471 49 342 89 89 446 67 34 145 443 154 178 96 96 342 105 105 321 354 386 386 386 469 116 94 418 418 418 418 418 418 99 436 436 436 60 298 298 298 379 379 471 471 471 49 9 142 221 196 70 65 428 428 428 146 325 325 34 253 253 453 9 142 133 364 276 109 109 139 139 139 293 293 293 122 35 354 420 420 420 422 36 384 490 490 490 349 349 234 261 25 487 498 498 498 396 313 285 131 34 89 116 33 394 465 377 351 139 139 139 175 58 451 30 30 378 43 141 141 141 31 162 232 68 68 115 273 470 171 171 252 173 402 402 26 359 166 166 301 8 354 354 180 376 376 460 178 178 458 192 415 415 314 472 221 458 208 79 288 288 360 360 434 200 248 248 212 445 445 171 171 171 171 252 215 354 100 100 302 375 375 185 185 269 390 390 18 112 427 56 56 312 312 312 312 292 292 292 292 292 12 12 12 12 12 12 12 12 260 260 260 260 163 163 163 163 163 163 491 316 316 491 316 316 73 289 321 320 287 287 287 111 111 111 85 438 203 53 394 478 162 232 68 115 273 106 499 499 306 396 337 337 464 464 464 111 111 378 88 345 141 281 31 342 26 251 251 241 431 403 171 171 171 358 358 233 321 227 227 419 419 439 439 225 225 47 47 47 491 47 80 80 80 289 451 451 451 30 30 422 162 232 172 115 179 179 120 120 314 457 310 310 338 338 395 499 499 265 265 85 146 146 37 359 359 474 474 474 19 454 454 417 414 170 170 170 47 28 28 2 2 2 491 491 2 2 2 2 491 316 491 316 435 435 289 435 321 144 27 351 319 319 53 255 255 255 251 241 431 235 235 235 235 413 413 98 48 13 13 13 170 321 170 312 187 187 292 292 292 292 23 23 23 23 23 101 101 149 149 228 289 321 321 127 5 5 455 72 72 441 153 153 153 372 396 313 186 54 54 224 50 356 281 281 9 168 106 410 410 410 410 410 173 402 29 495 406 467 340 340 340 466 22 283 455 448 219 219 219 180 180 306 306 306 306 306 306 59 37 37 404 439 439 439 78 78 170 170 28 28 28 491 2 2 491 2 2 2 491 491 2 316 491 316 316 316 73 73 289 321 321 445 445 278 278 173 196 196 429 429 429 219 464 222 222 245 245 245 8 354 180 376 376 376 376 376 282 37 37 233 192 419 419 439 78 170 170 442 442 187 442 187 187 12 12 12 12 260 260 260 149 149 289 289 321 289 209 287 16 16 16 16 16 88 88 111 111 111 111 438 143 35 389 389 389 33 394 76 465 445 445 445 351 351 264 264 264 468 468 468 337 337 324 324 464 277 277 277 385 36 227 419 439 78 78 170 491 47 187 47 47 47 442 442 442 442 442 127 22 5 236 36 36 107 395 351 91 91 91 91 206 206 122 122 35 29 456 456 31 162 9 105 336 74 106 426 426 206 348 64 212 191 191 191 314 401 321 108 107 107 395 485 286 286 286 468 245 349 349 155 262 262 359 359 474 474 474 474 19 454 229 321 247 15 15 15 193 193 17 +17 17 17 363 51 51 228 289 321 188 177 177 177 325 356 356 356 342 342 224 242 242 116 131 131 72 72 110 443 443 240 173 280 41 41 41 41 19 454 417 417 417 417 170 47 491 47 491 491 491 47 47 80 321 321 435 435 435 209 111 111 111 202 202 402 402 458 27 180 405 405 206 167 457 14 14 14 209 411 297 297 297 297 297 297 297 293 399 70 70 46 46 46 46 46 438 378 43 364 109 109 498 498 134 387 122 122 26 26 359 81 166 324 416 239 458 144 180 484 278 240 314 77 270 342 224 340 340 340 94 199 277 277 277 277 227 419 229 247 247 126 126 326 326 101 101 149 391 80 80 80 80 289 321 354 159 159 159 325 34 177 177 325 356 356 356 31 342 224 242 242 379 131 131 72 72 110 443 443 443 173 173 280 41 41 41 41 19 19 454 454 454 78 170 170 491 312 312 292 292 292 292 292 21 21 21 21 21 21 408 408 149 149 228 228 289 321 209 209 83 55 55 322 322 94 199 118 118 118 118 118 205 177 177 177 177 325 356 356 356 342 342 242 242 116 64 131 472 221 144 445 445 351 351 264 486 468 468 468 337 337 337 324 252 325 34 89 340 116 33 394 212 465 395 395 151 151 169 150 86 86 6 272 34 44 38 162 68 172 115 273 498 498 498 396 240 35 242 242 242 116 250 250 364 364 109 109 403 403 403 207 171 3 252 216 198 22 5 455 72 72 72 72 294 294 294 294 330 64 64 212 302 302 302 497 122 129 259 74 441 441 424 424 497 497 497 49 342 168 180 180 113 113 113 113 450 167 167 131 427 321 247 126 126 326 326 326 101 408 408 149 391 491 321 373 66 68 68 115 273 84 16 88 88 111 111 111 111 438 438 438 35 259 354 180 443 443 285 300 382 313 313 143 458 458 445 445 213 213 213 252 215 354 277 277 277 277 143 259 259 354 420 420 143 458 144 351 494 253 368 453 168 106 111 111 111 438 438 10 10 479 331 84 84 496 274 216 198 448 448 448 464 154 154 154 416 32 96 368 453 453 115 470 470 486 486 376 460 460 178 35 96 96 401 196 196 309 309 479 331 486 486 460 460 178 458 192 192 69 223 130 280 277 277 277 277 385 385 75 227 419 439 78 170 47 47 47 491 491 491 2 2 491 491 316 316 316 73 289 321 321 209 177 177 177 356 356 342 168 44 116 199 154 154 96 96 54 482 238 161 161 487 288 360 360 360 339 53 359 166 166 166 324 14 14 411 411 424 424 424 424 424 424 122 122 122 131 472 221 144 27 437 306 306 306 306 396 215 35 29 277 277 314 401 321 259 354 180 376 376 376 376 120 282 37 233 192 419 427 78 170 491 312 312 312 341 341 341 341 341 12 12 12 12 21 21 326 326 326 326 101 101 149 149 228 289 321 321 209 287 16 16 16 88 88 111 319 319 203 53 394 212 4 104 104 104 104 406 337 337 337 324 422 143 458 208 386 431 376 376 376 460 240 24 36 107 152 152 152 202 402 402 402 259 144 27 27 351 319 319 319 319 203 381 381 117 48 417 417 417 417 197 491 435 80 289 321 209 188 357 357 357 357 357 173 280 242 116 94 118 118 118 118 118 280 177 177 177 177 457 457 364 345 389 389 389 285 34 202 202 202 402 401 259 354 137 137 137 137 33 10 10 479 331 265 265 428 146 146 146 39 86 6 272 87 87 87 162 54 86 26 26 444 444 213 252 215 354 340 340 340 199 44 44 44 43 43 364 276 346 346 265 85 85 85 139 139 293 122 122 314 401 401 75 107 107 395 351 351 264 264 468 468 406 337 337 324 422 36 36 161 161 487 487 487 41 41 19 19 19 454 417 417 421 421 491 421 128 128 128 193 193 17 +17 17 17 296 317 491 317 317 491 184 184 184 184 320 7 345 152 152 152 152 402 221 144 180 189 405 206 167 36 377 87 87 236 161 79 499 499 499 428 146 173 173 280 29 255 251 251 241 235 235 235 235 235 348 248 76 259 74 74 351 213 213 213 213 213 186 39 342 342 224 110 110 110 202 202 202 430 430 430 430 430 243 133 259 345 109 41 41 19 19 454 229 82 229 312 312 126 292 292 292 292 292 292 21 21 21 21 408 408 408 149 149 321 321 320 473 258 258 31 342 224 494 494 31 162 232 105 105 336 470 470 432 330 330 379 77 342 224 300 300 382 186 186 54 172 273 470 470 120 240 325 177 177 177 378 345 141 141 281 342 168 470 411 171 171 171 171 252 314 401 196 196 217 70 65 265 265 265 85 85 85 139 139 375 375 185 269 433 427 427 247 247 126 126 126 326 326 23 23 23 23 23 101 149 149 149 321 321 287 111 111 111 438 356 203 64 90 212 144 208 386 431 376 376 376 376 85 37 24 35 259 354 420 420 422 143 144 27 351 368 453 168 106 111 111 111 438 438 251 251 251 241 266 266 266 266 173 402 402 221 75 161 161 79 499 499 428 85 146 146 173 173 176 176 176 328 200 200 117 404 404 439 439 225 237 237 260 260 260 260 260 391 391 289 321 321 321 209 287 287 16 16 16 16 16 88 88 177 177 177 177 35 478 478 68 172 172 444 444 444 360 339 339 394 478 478 232 232 68 172 344 344 344 344 344 274 43 43 43 364 364 276 174 319 319 348 348 348 64 64 212 212 300 469 134 349 155 262 262 100 100 497 122 45 45 45 325 111 111 111 203 53 90 212 144 106 88 319 135 135 248 465 377 87 87 87 251 251 251 251 241 278 278 278 173 402 402 345 333 220 220 164 219 477 477 477 88 89 89 446 53 212 354 354 255 251 251 251 251 241 431 235 235 235 235 235 348 248 248 465 449 377 123 123 123 219 219 477 477 477 477 477 132 13 321 247 312 126 126 326 326 326 326 326 326 101 101 149 149 228 321 412 287 111 111 111 438 202 402 6 479 463 463 463 280 29 382 245 8 354 354 134 497 251 241 431 235 235 235 235 348 76 465 108 123 123 123 88 109 475 475 94 475 475 475 301 8 354 106 493 493 240 325 41 41 41 19 454 454 229 491 247 312 126 126 23 408 149 149 228 321 320 7 331 307 307 307 167 457 457 42 147 380 485 213 213 286 286 139 139 175 359 474 474 41 41 19 19 454 454 13 414 170 47 47 47 491 47 491 491 47 491 102 435 80 80 289 321 7 7 354 159 159 159 314 35 22 448 448 464 464 255 38 162 68 115 273 106 265 265 85 85 146 175 81 242 203 250 250 345 141 141 281 453 9 198 22 283 455 43 364 364 276 109 109 498 498 498 396 271 271 39 39 86 86 238 6 227 419 439 78 56 56 28 491 28 491 2 491 2 341 341 12 12 21 21 23 101 101 101 149 149 228 321 287 287 111 111 202 202 202 280 29 106 350 350 350 175 466 166 166 166 301 8 137 137 137 137 94 199 340 340 340 94 199 277 277 385 457 393 205 155 155 332 148 148 148 372 372 245 399 399 217 70 65 319 319 319 319 379 379 243 77 270 433 433 112 427 247 247 126 126 23 408 408 391 228 321 320 320 159 159 159 159 129 259 127 114 92 92 92 92 457 457 141 141 141 281 342 168 168 340 340 116 10 479 331 331 230 230 230 169 169 169 352 352 352 352 352 352 112 112 78 56 421 421 491 15 15 15 193 193 193 17 +17 17 17 363 363 363 51 51 51 228 491 321 321 209 177 177 177 177 356 77 342 142 397 336 345 109 498 498 498 313 186 39 342 68 198 114 114 242 446 116 457 335 401 321 226 321 209 475 475 475 475 475 475 475 475 422 349 164 214 214 214 214 200 248 219 152 152 152 143 458 192 389 389 34 121 121 399 217 217 217 217 473 65 486 486 486 460 460 460 24 310 107 107 242 275 275 275 303 303 117 404 13 78 170 170 491 491 312 187 187 187 187 12 12 12 12 12 408 408 149 149 228 321 320 7 473 258 258 258 31 342 224 494 494 31 162 232 232 105 105 336 470 432 432 330 379 64 77 77 224 300 300 382 186 186 54 273 470 470 240 34 177 177 378 345 141 141 281 9 142 397 364 364 109 109 278 143 458 192 192 469 325 34 223 130 402 196 70 429 429 429 422 108 377 87 87 236 259 108 119 119 437 405 405 405 405 206 178 35 321 26 386 266 266 266 266 266 178 458 96 321 127 114 92 92 92 92 92 167 385 427 82 247 126 126 326 326 326 193 193 193 +17 17 17 296 317 491 184 184 184 184 289 321 320 127 0 0 0 0 378 354 347 347 347 245 416 129 321 144 180 484 484 484 484 120 37 37 37 24 24 404 414 414 414 47 47 47 47 491 47 80 80 321 321 289 7 219 152 152 152 116 94 331 84 84 84 84 16 274 98 229 247 247 126 326 326 326 326 101 149 228 321 321 320 22 448 464 255 38 162 342 115 273 106 265 265 85 85 146 175 175 81 242 203 394 76 259 74 485 213 213 213 252 215 259 354 100 100 100 497 98 98 98 13 417 417 170 170 170 170 28 491 28 2 2 2 2 2 2 2 2 2 2 2 2 491 316 316 316 73 289 321 289 321 159 159 159 159 35 127 114 0 222 406 467 356 356 281 162 232 232 68 172 115 344 344 344 344 274 274 251 241 431 278 285 285 302 497 497 186 162 162 232 482 482 482 105 336 144 180 496 496 274 215 457 96 393 155 155 332 332 216 216 448 448 448 464 121 121 399 217 217 65 65 486 460 240 240 310 449 107 242 242 116 33 10 10 10 309 331 418 418 418 418 418 252 99 99 436 436 60 60 298 298 116 199 199 340 340 116 94 199 242 466 94 199 459 44 38 31 162 68 68 115 273 273 265 265 85 85 146 146 175 175 81 81 275 203 203 381 381 48 13 229 321 247 312 126 292 292 292 292 292 292 21 21 23 23 23 23 23 23 260 260 260 260 260 391 391 228 321 321 412 287 287 350 350 350 350 350 250 81 166 166 166 422 36 310 395 395 151 151 150 39 86 238 272 34 340 340 116 466 22 448 448 464 464 493 493 493 300 300 382 245 14 14 411 411 153 153 372 372 372 396 349 349 234 234 25 242 275 275 379 379 471 471 49 269 433 390 390 112 112 56 56 56 305 170 28 28 28 491 28 491 28 362 491 362 491 362 362 362 362 40 40 362 362 362 305 362 362 491 218 218 40 40 40 40 435 435 211 21 326 326 408 408 408 149 228 321 177 177 177 177 378 364 345 141 141 141 141 281 453 9 142 336 74 190 487 104 278 325 34 324 324 464 464 121 121 121 64 161 161 487 469 186 54 86 6 272 176 176 328 200 248 76 465 377 87 123 255 255 399 217 473 65 486 486 460 460 240 310 449 242 242 116 394 76 465 214 214 214 328 200 248 49 453 342 168 255 8 354 180 113 113 113 113 167 167 35 198 198 114 114 114 57 57 120 282 203 381 381 381 117 48 229 321 247 193 193 17 +17 17 363 363 51 228 373 489 489 489 489 88 88 254 254 254 314 8 354 137 137 137 33 394 478 478 482 482 482 6 272 371 189 189 424 424 497 122 34 34 242 116 285 199 255 43 43 109 109 403 403 171 301 349 205 155 165 165 165 53 58 156 156 156 156 245 129 129 321 74 74 351 351 351 264 264 468 468 406 11 11 379 379 77 77 342 224 340 340 94 199 156 156 156 245 14 14 411 411 188 121 121 121 53 394 76 205 261 25 469 11 379 379 77 342 342 224 41 41 41 301 143 259 354 62 62 62 62 464 464 44 44 44 129 321 458 208 208 190 190 441 487 487 153 424 424 182 182 497 497 497 497 122 10 10 479 331 498 498 498 498 498 396 271 186 39 323 323 142 489 489 489 489 422 32 239 321 384 371 180 265 265 265 265 85 85 146 24 35 259 354 255 255 349 155 155 148 148 148 387 186 99 400 400 400 30 143 458 144 389 389 314 90 458 144 121 121 203 394 76 4 205 261 25 470 443 443 443 169 271 150 39 433 433 433 160 112 427 56 247 312 312 312 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 23 23 260 260 260 260 260 260 391 149 228 321 321 412 287 287 111 111 438 219 219 219 485 485 374 186 162 54 86 238 272 272 494 139 175 251 241 431 265 265 85 146 146 464 464 255 43 43 109 109 403 171 171 143 192 192 469 314 314 196 196 479 331 428 428 428 428 146 385 35 75 342 224 89 446 94 199 255 255 217 217 473 65 486 486 460 460 368 310 449 60 242 116 116 394 76 259 214 214 214 214 200 200 471 49 453 26 26 241 266 266 266 266 266 266 416 96 198 198 114 92 92 92 92 92 92 167 385 233 131 229 247 247 126 126 326 326 326 326 326 408 408 149 149 228 491 289 321 321 354 420 420 143 458 192 485 494 368 342 168 111 111 111 240 325 371 371 278 278 116 33 33 58 72 110 110 202 202 202 402 402 36 119 119 103 103 103 103 85 299 299 203 53 473 340 340 466 22 283 455 236 384 371 93 93 93 93 207 207 207 19 454 263 417 417 417 417 417 170 170 28 491 28 491 491 2 491 2 491 2 2 2 163 316 491 435 435 435 435 321 321 321 435 287 111 111 438 438 458 445 357 357 443 271 31 342 342 198 114 92 92 169 77 342 142 397 345 346 181 428 438 464 464 365 330 203 394 478 172 115 273 344 344 344 274 349 164 164 164 470 278 278 120 330 388 195 195 117 48 417 417 417 170 47 47 47 47 47 47 491 491 47 491 80 80 80 321 435 435 287 287 111 111 111 438 464 365 365 365 330 203 53 64 212 161 79 288 151 240 314 131 393 262 262 100 497 497 349 164 224 470 432 365 330 94 199 331 145 290 290 434 434 339 212 131 180 284 265 265 85 85 207 207 454 454 229 321 247 312 312 126 292 292 292 292 292 292 292 292 292 292 21 21 21 21 21 21 21 21 21 21 21 21 101 101 149 149 228 321 321 320 127 0 0 222 468 356 356 356 453 342 242 116 199 44 44 44 129 35 401 401 401 321 74 351 351 278 278 178 458 192 180 125 125 125 348 250 70 46 46 46 46 46 438 301 8 239 354 106 106 84 496 496 496 496 413 413 413 471 471 49 269 433 390 160 112 56 417 201 201 201 201 193 193 17 +17 17 17 296 317 317 184 184 184 289 209 287 287 111 111 111 438 438 314 32 239 384 371 371 374 374 132 274 251 251 241 431 266 266 266 266 173 402 402 36 108 87 87 88 88 255 255 399 217 217 65 65 486 486 460 460 240 310 107 395 242 275 116 199 199 111 111 85 438 203 203 53 10 10 309 331 331 265 265 428 428 146 146 186 39 342 68 68 224 224 11 116 33 394 472 401 401 321 74 425 425 386 431 319 319 319 203 53 53 53 76 401 259 345 333 333 220 220 402 472 221 239 384 371 278 278 53 53 394 76 259 74 302 302 497 497 49 453 342 168 340 340 116 250 70 46 46 46 46 438 464 464 145 139 139 293 293 122 8 354 354 84 84 496 496 274 185 39 433 433 390 160 112 112 56 56 56 56 28 28 491 491 28 28 491 491 362 491 362 362 362 491 362 362 362 362 362 362 491 362 362 211 211 362 491 369 369 369 369 369 369 369 369 21 21 21 21 21 21 21 260 260 260 260 260 260 391 391 391 491 289 321 321 7 7 345 333 333 220 220 314 32 4 4 127 114 258 258 258 258 258 31 39 342 433 390 390 390 160 160 160 160 97 97 225 225 80 80 80 321 321 7 217 473 329 329 329 329 329 164 164 485 485 485 485 374 368 31 142 221 336 27 121 399 53 76 465 74 351 351 365 365 365 330 388 64 219 398 398 275 275 116 471 471 478 66 482 238 6 272 106 405 405 405 167 215 96 96 75 108 119 437 405 405 405 405 206 206 178 458 192 176 176 328 328 200 303 48 48 417 225 80 80 491 321 80 289 289 320 74 437 437 306 306 396 396 396 35 35 26 359 359 474 474 474 474 19 19 454 229 321 247 126 126 326 326 326 326 101 101 408 391 228 321 289 321 320 354 420 422 143 144 27 494 278 186 99 400 400 400 378 378 141 141 141 281 168 106 113 113 113 206 240 285 34 462 462 402 401 259 259 354 380 380 288 443 120 120 169 169 169 169 352 352 352 352 352 352 97 89 55 322 67 90 90 259 74 74 437 437 306 306 306 396 396 385 35 26 359 359 474 474 324 301 301 354 420 420 420 143 321 144 27 351 253 253 368 453 342 198 198 127 0 0 0 0 58 110 254 254 254 131 133 147 147 288 213 213 143 233 310 107 447 447 447 198 198 22 283 455 8 354 354 329 151 151 416 416 41 41 41 41 19 19 454 454 170 170 491 491 312 491 312 312 292 292 292 326 326 326 326 326 101 101 101 149 149 228 321 320 479 331 307 307 61 285 34 44 44 44 94 199 493 493 493 493 216 300 300 382 245 43 364 364 276 109 498 498 498 498 396 313 313 314 36 430 430 430 430 36 36 310 107 400 400 400 30 422 162 162 68 68 115 273 470 403 403 207 207 464 464 89 319 348 64 76 465 108 139 139 139 139 497 122 216 0 0 0 0 58 254 254 254 314 26 251 241 431 443 443 443 169 402 402 96 75 472 198 198 22 283 455 4 4 4 280 278 278 278 175 175 81 459 469 37 37 24 310 107 395 89 89 322 322 250 250 347 347 347 236 129 161 79 79 499 499 265 85 85 146 146 173 173 176 176 135 135 200 248 248 384 371 180 315 315 315 450 450 413 94 199 44 44 38 342 342 68 482 6 336 384 371 213 213 213 213 252 215 129 321 26 26 26 81 278 278 285 26 302 497 497 58 58 183 72 351 278 278 278 139 139 375 375 375 375 98 98 13 229 321 247 15 15 193 193 193 17 +17 17 17 363 363 363 51 51 228 321 321 320 5 5 455 42 42 147 380 380 496 496 496 274 274 122 24 131 472 221 259 74 437 306 306 306 306 169 167 36 449 69 223 130 130 402 402 345 345 109 407 407 407 385 36 75 310 395 254 254 254 314 259 354 137 137 137 33 394 394 465 144 27 351 189 189 151 167 167 457 478 478 66 68 68 115 344 344 344 344 344 344 274 236 32 239 384 371 213 213 213 213 215 129 321 354 359 359 474 474 464 340 340 116 394 465 377 377 123 123 198 22 283 455 38 162 232 482 172 115 273 106 405 405 405 405 206 169 402 402 402 6 272 472 472 482 482 482 115 273 106 153 153 387 387 387 139 139 302 302 375 375 98 13 321 247 247 126 126 326 326 326 326 101 149 149 228 321 321 127 45 45 45 35 259 127 5 5 455 129 129 259 354 354 180 486 365 365 365 365 360 200 200 243 243 233 270 270 270 390 390 390 390 97 97 225 225 225 373 155 261 487 288 288 278 330 339 64 310 447 447 238 272 397 345 333 220 220 402 221 129 401 321 354 425 425 241 431 374 374 374 203 53 53 473 176 176 135 328 200 200 248 248 248 364 276 276 346 346 265 428 85 85 139 293 293 293 122 122 401 401 401 310 310 107 107 395 351 470 264 264 468 468 468 337 337 324 422 36 36 161 161 487 487 288 41 41 246 318 49 453 342 168 89 116 116 33 394 394 478 66 68 68 68 26 26 251 241 81 278 278 278 203 53 250 250 250 250 250 276 346 346 428 428 428 146 252 36 472 221 401 401 321 321 354 354 498 498 498 498 396 143 36 310 107 107 395 50 50 50 50 185 185 433 433 160 112 427 247 247 126 126 292 326 326 101 101 149 149 228 289 321 320 347 347 347 186 162 232 232 68 172 115 273 204 204 204 204 280 29 495 134 302 302 497 497 349 349 234 234 261 25 213 213 213 252 252 449 34 255 255 8 259 354 180 230 230 319 173 402 402 198 127 222 222 222 222 222 313 58 72 72 110 110 120 120 120 120 120 37 37 24 471 270 270 433 433 160 18 112 112 56 56 491 28 28 28 491 28 491 28 491 362 362 491 362 362 362 491 491 362 491 491 211 211 102 491 369 369 369 369 21 21 21 21 21 101 101 149 149 321 321 320 127 5 5 236 129 36 310 107 395 351 91 91 91 91 85 85 85 85 139 293 293 122 122 131 472 221 401 321 74 441 189 189 240 285 34 180 113 113 113 113 167 285 449 449 156 156 156 313 58 58 72 72 294 294 294 294 294 294 294 282 388 64 64 212 34 89 89 322 53 212 32 259 354 380 380 189 496 496 274 143 458 192 180 230 230 230 169 169 352 29 44 44 245 8 32 321 354 190 380 288 365 365 365 365 330 388 64 76 76 310 107 107 395 462 462 462 402 402 133 276 276 346 346 486 315 315 315 139 450 293 122 122 131 472 221 401 321 75 74 425 425 386 386 386 431 319 319 319 203 203 381 381 381 381 381 117 198 198 127 45 45 45 236 401 401 401 321 354 190 380 499 151 151 169 169 99 447 447 238 6 272 34 255 416 192 180 432 432 330 379 77 77 342 342 198 22 283 283 38 162 342 115 273 265 265 265 85 146 146 325 34 69 130 130 198 22 283 455 8 259 354 106 151 151 151 416 416 192 41 41 41 41 19 19 454 454 229 321 247 312 15 15 15 15 15 15 15 193 193 193 193 17 +17 17 17 296 363 363 363 363 51 51 51 184 184 321 184 321 321 209 188 430 430 430 430 342 430 430 430 430 33 64 212 127 114 92 92 92 92 167 457 401 401 401 321 354 354 219 219 485 485 485 374 374 285 285 469 469 349 393 234 155 262 262 100 100 100 100 375 98 98 98 13 13 13 442 442 442 491 442 442 442 442 442 491 102 2 2 2 2 201 40 305 305 305 305 305 40 366 366 102 316 316 316 491 102 491 305 102 102 289 289 321 321 320 181 181 181 181 181 35 449 430 430 430 430 198 114 114 92 92 92 167 457 35 401 75 161 161 161 161 487 487 487 213 213 246 246 246 246 301 26 251 251 241 444 444 444 444 360 360 339 199 176 135 135 135 135 200 200 464 113 113 113 113 167 167 349 155 155 165 165 165 165 466 22 22 283 455 455 259 354 354 180 376 376 365 365 365 328 200 243 76 458 192 483 14 411 411 297 297 297 297 297 297 293 293 497 497 43 364 364 276 346 346 346 428 428 428 146 252 143 36 449 89 89 446 446 33 251 251 251 241 241 431 171 171 171 252 186 39 342 342 342 224 41 41 324 324 301 399 473 476 476 476 476 143 458 192 219 152 152 422 349 164 164 164 214 214 360 360 200 200 248 321 144 192 69 223 223 223 223 223 37 173 352 352 352 402 99 338 400 400 400 400 464 464 464 145 376 376 376 460 169 169 342 342 86 105 6 96 96 272 427 56 247 247 312 126 126 292 292 292 292 292 23 23 23 23 23 260 260 260 260 260 260 391 391 163 491 316 316 316 316 316 316 316 73 289 7 7 7 364 276 276 109 109 139 139 293 293 293 413 309 479 331 331 315 315 315 315 315 450 450 16 98 98 98 13 13 13 229 247 312 312 126 126 126 23 23 23 23 23 260 260 391 391 47 491 491 316 316 80 321 373 412 412 287 287 287 284 306 306 85 438 240 325 34 242 242 94 199 331 84 84 84 16 16 16 16 98 98 98 98 263 13 225 225 225 225 225 225 80 80 80 321 373 66 66 172 179 179 179 179 179 314 196 196 473 65 329 329 329 329 329 164 164 485 485 485 485 485 374 132 98 417 417 417 417 417 417 170 170 170 28 28 28 491 28 491 491 2 491 491 2 491 2 435 2 2 2 366 321 305 305 40 435 40 201 435 435 435 435 435 289 289 321 320 364 276 346 346 265 428 85 146 464 464 44 44 44 8 401 401 321 354 190 190 380 380 499 265 265 265 85 85 146 146 252 325 449 34 255 130 130 402 402 401 321 321 208 208 441 441 441 153 153 153 372 372 396 396 271 186 54 433 433 390 112 427 56 247 247 126 126 326 326 326 326 326 326 326 101 101 101 149 149 228 321 412 44 44 44 8 129 129 259 190 190 190 190 79 380 380 499 499 265 265 265 85 85 85 146 146 146 24 131 335 14 14 226 321 209 411 287 297 297 297 297 297 297 297 293 293 175 175 81 81 340 340 116 33 33 90 250 250 364 364 276 346 346 346 428 428 428 146 358 358 36 131 472 397 345 333 333 220 220 216 44 44 44 251 251 251 251 251 251 241 241 431 266 266 266 266 173 173 173 402 402 402 26 359 359 81 81 324 324 324 301 339 399 217 217 217 217 217 473 65 278 278 31 162 342 86 86 86 6 6 272 41 324 324 324 301 4 4 4 280 470 470 403 171 171 171 171 464 139 139 302 375 375 375 98 263 13 78 78 170 491 421 15 15 193 193 17 +17 17 17 296 363 363 363 51 51 51 228 321 412 287 111 111 111 202 202 202 196 309 479 463 463 463 463 29 382 313 186 162 232 68 68 267 267 267 267 267 339 339 250 250 250 276 174 174 174 319 388 388 303 117 229 229 247 126 126 326 326 101 101 149 149 228 321 289 321 159 159 159 159 325 34 111 111 111 438 438 143 458 445 351 242 116 199 199 255 255 399 217 217 473 65 486 486 486 460 460 240 310 310 107 395 242 242 203 250 250 181 181 181 181 99 338 338 400 400 152 378 378 345 389 389 314 26 26 251 241 241 367 367 367 367 35 458 96 26 386 266 266 266 266 266 266 146 358 143 458 192 419 439 78 170 170 491 28 491 28 28 491 491 2 491 2 102 2 102 102 102 491 491 435 305 289 289 321 209 287 111 111 111 438 438 325 34 180 84 350 413 348 131 34 463 463 463 463 402 29 29 495 467 467 154 154 458 96 96 232 68 105 336 470 470 151 151 178 35 401 75 272 87 87 8 354 420 420 420 464 464 44 255 8 259 259 190 380 380 499 499 428 85 146 146 35 196 196 473 46 46 46 46 438 186 162 68 68 68 115 273 279 279 279 279 279 279 279 375 375 352 352 352 427 491 247 491 312 126 292 23 23 23 101 101 149 149 228 321 321 287 287 111 111 111 438 203 53 394 478 232 172 115 344 344 344 344 274 58 72 72 437 350 350 350 350 350 203 53 250 250 359 359 166 166 324 324 301 10 479 331 231 231 231 274 8 354 29 469 325 41 324 301 378 345 345 389 139 497 175 335 14 14 209 145 463 463 463 463 280 29 382 245 245 43 364 174 174 174 330 348 76 465 75 377 87 87 399 217 473 65 65 264 264 264 468 468 337 337 337 324 324 301 217 473 429 429 429 429 429 246 246 246 19 454 229 321 247 126 126 126 326 326 326 326 326 23 408 408 408 149 149 391 491 289 321 412 287 287 319 319 348 175 81 431 443 443 31 342 342 177 177 177 177 457 70 70 65 65 428 428 146 215 35 259 420 420 420 464 464 44 44 349 234 234 261 25 148 148 148 372 372 467 467 242 348 250 217 473 473 278 278 99 99 436 436 60 60 116 94 199 470 264 264 468 468 468 337 41 41 19 454 454 417 417 417 417 237 237 80 80 321 412 287 287 287 111 111 438 438 31 342 224 494 494 129 74 74 437 496 496 496 274 368 368 9 168 494 44 349 234 234 205 261 148 148 148 372 372 372 467 467 446 116 250 250 473 473 278 278 99 99 436 60 60 242 116 94 199 264 264 468 468 337 337 41 324 301 399 70 473 65 428 428 146 146 457 35 401 196 242 33 33 394 32 32 259 420 420 420 420 420 324 301 173 280 104 104 104 104 337 337 337 337 301 129 321 74 492 492 236 384 371 278 278 278 143 321 192 485 134 134 134 175 81 300 334 59 452 263 229 229 491 312 15 15 15 15 15 193 193 193 193 17 +17 17 17 296 363 363 51 51 51 184 184 184 289 321 320 354 159 159 240 285 34 111 111 111 111 438 236 35 75 371 371 374 374 132 132 88 58 72 72 496 496 496 496 215 35 96 26 34 45 45 45 31 478 478 68 68 68 115 273 231 231 231 203 53 64 212 384 93 93 93 93 464 464 111 111 111 111 438 99 99 338 395 389 389 389 497 129 401 259 74 483 58 72 110 202 202 202 202 173 402 44 44 44 43 43 364 276 276 346 346 428 428 146 146 358 457 401 401 321 75 161 161 79 487 288 443 443 120 271 271 150 39 433 433 433 160 160 160 112 439 56 56 47 47 491 47 491 47 491 491 316 491 73 73 289 289 321 320 127 114 92 92 92 92 92 240 385 35 131 335 226 188 188 356 356 281 342 9 196 70 70 46 46 46 46 438 58 58 72 72 72 72 72 72 72 72 437 265 428 428 146 146 146 464 459 459 459 31 39 86 86 6 272 106 486 428 85 146 438 239 36 371 485 485 286 139 139 175 175 69 462 462 130 29 498 498 498 498 169 164 164 26 26 359 81 324 324 301 8 259 354 425 386 81 459 271 271 271 39 39 433 390 390 160 112 427 491 247 312 126 126 292 292 292 326 326 326 326 326 326 326 326 326 101 101 149 149 149 228 321 321 287 287 111 111 438 438 143 36 107 395 494 31 342 342 26 26 26 241 266 266 266 266 173 402 401 401 401 259 74 190 487 278 278 325 34 324 324 143 458 321 208 208 208 386 386 431 496 496 496 496 274 274 216 164 270 270 433 160 18 427 56 56 47 47 491 47 47 491 2 2 491 316 316 321 73 289 321 435 209 83 55 55 322 322 212 34 111 111 111 111 438 202 202 402 196 479 331 463 463 463 29 29 382 58 58 72 110 110 254 240 325 34 44 44 129 129 259 74 190 487 278 278 325 324 324 324 236 239 259 161 79 487 288 443 443 169 342 342 224 340 340 340 250 217 70 46 46 46 46 46 438 251 251 241 431 431 428 428 428 146 146 186 402 352 342 224 45 45 325 325 111 111 111 178 458 192 242 242 116 33 250 456 456 456 456 456 399 217 473 65 432 432 330 203 53 212 212 29 334 334 59 59 452 263 229 321 321 312 312 126 292 292 1 292 292 1 1 1 1 1 23 260 260 408 408 391 391 391 289 289 321 320 159 159 159 285 255 255 402 402 458 144 441 441 441 153 153 372 372 396 186 186 54 54 86 112 427 56 56 201 201 201 201 201 201 201 201 201 201 201 321 435 435 435 320 209 177 177 177 356 356 342 483 14 226 321 411 297 297 297 297 297 297 293 122 216 22 283 455 399 399 138 138 138 138 372 396 313 449 377 87 87 87 251 241 367 367 367 367 458 96 393 393 234 234 261 25 148 148 148 372 245 43 345 109 109 313 236 36 75 108 377 485 489 378 88 356 356 356 281 342 430 242 242 116 212 131 277 277 277 277 277 385 233 75 419 427 56 56 170 170 312 312 292 292 292 1 1 1 408 408 408 408 305 321 209 83 55 55 322 67 466 127 361 361 361 361 361 388 195 117 229 229 247 126 126 193 193 17 +17 17 363 51 51 228 321 209 111 111 111 438 458 192 192 242 116 199 255 255 399 217 473 65 486 486 460 240 240 35 310 107 242 298 116 379 466 45 45 45 285 34 111 111 365 203 203 394 212 161 79 487 288 443 169 150 39 86 86 238 6 336 90 221 321 144 208 153 153 153 387 372 396 313 24 310 107 459 459 271 39 433 68 68 68 359 474 474 474 474 19 19 454 454 417 442 442 170 170 28 28 491 2 491 491 2 491 2 491 2 2 491 316 316 73 289 321 321 7 127 258 258 31 162 342 142 142 196 217 70 65 153 387 387 396 348 94 176 176 328 200 200 248 345 409 409 409 94 199 111 111 111 438 251 241 431 443 443 169 169 352 402 198 198 448 448 464 464 255 38 38 162 232 68 68 115 273 265 265 265 85 85 146 175 175 81 81 242 203 203 53 65 111 111 111 438 349 205 205 261 25 189 139 139 293 122 478 478 66 68 172 115 344 344 344 344 88 88 255 255 186 99 338 338 338 338 338 395 470 290 290 290 290 290 434 339 53 394 212 401 221 321 354 420 420 143 458 192 278 253 368 453 342 168 111 111 111 438 72 110 110 254 254 240 35 321 377 87 87 87 43 364 109 109 264 264 313 216 216 114 258 258 31 31 342 142 142 72 72 72 72 72 72 437 153 481 306 372 406 467 467 469 240 285 34 106 106 424 424 424 424 497 122 122 133 401 321 364 276 109 278 330 348 33 394 77 77 342 224 41 324 324 301 236 321 75 161 79 79 288 288 443 120 271 271 39 39 433 390 160 160 112 427 491 247 312 126 292 292 292 292 326 326 326 326 326 23 23 23 101 101 101 101 101 149 149 228 289 289 321 289 209 209 287 297 297 297 297 297 293 293 216 22 448 448 448 378 106 153 372 372 372 349 349 205 261 25 242 379 379 471 77 342 110 110 110 460 240 314 35 384 87 87 43 43 276 109 109 468 468 240 216 216 57 57 203 217 473 219 219 152 374 116 94 331 84 84 84 84 16 274 98 98 13 13 414 491 170 491 170 187 491 187 187 23 23 101 101 149 149 149 321 209 44 44 44 399 217 70 473 65 498 498 396 313 35 310 107 107 242 116 116 199 34 89 446 116 33 58 58 72 437 496 496 496 496 215 35 35 96 270 342 224 242 242 116 33 466 466 241 431 376 376 376 169 150 150 86 238 272 397 397 109 109 278 278 64 76 449 300 382 313 236 239 259 384 371 84 496 496 413 94 199 158 158 158 252 325 449 191 191 191 314 36 164 119 161 161 487 487 487 337 213 213 324 324 3 3 58 72 72 437 319 319 319 348 64 212 300 382 313 313 314 314 219 219 219 180 180 106 306 306 306 306 306 396 396 37 37 24 77 270 168 168 462 462 402 402 402 345 109 109 330 116 33 394 77 77 224 41 41 324 236 108 377 123 123 216 283 448 448 464 464 255 38 162 68 115 115 106 265 265 265 85 146 299 175 175 81 275 203 203 381 117 48 13 491 491 312 312 126 292 292 292 292 292 21 21 21 23 23 23 260 408 391 391 391 321 321 373 66 68 115 273 231 231 231 319 53 76 76 74 485 213 213 301 8 354 100 497 497 186 162 68 115 273 470 443 240 325 177 177 177 457 345 141 141 281 9 221 336 354 420 420 143 259 144 27 351 368 368 342 224 30 30 422 143 144 27 389 389 389 314 196 242 242 33 394 478 232 68 172 115 273 443 443 139 175 175 175 81 277 277 37 385 131 404 321 247 247 126 15 15 193 193 193 17 +17 17 296 51 51 184 184 184 289 321 320 159 159 240 199 111 111 111 111 111 438 314 133 133 147 380 180 486 443 240 240 216 300 300 382 245 8 354 255 255 251 251 251 81 444 444 444 444 246 252 173 198 164 45 45 45 34 177 177 177 345 141 141 281 453 342 168 180 113 113 113 285 285 69 223 130 198 22 283 455 455 129 259 144 27 437 480 480 480 146 299 339 64 10 459 459 459 271 342 342 224 69 223 130 280 257 257 257 31 9 142 142 72 72 437 306 306 306 306 306 396 396 385 233 131 133 133 430 430 430 430 430 430 430 430 430 212 131 219 219 219 477 477 477 374 132 132 98 48 13 170 170 170 491 312 312 28 341 341 341 341 341 12 12 12 21 21 21 21 23 23 101 101 149 391 391 73 289 289 321 7 70 409 409 409 399 53 473 429 30 422 143 458 144 180 189 405 405 206 285 34 125 125 125 348 466 22 283 455 236 36 161 161 161 161 487 487 288 290 290 290 290 434 434 434 339 195 404 229 82 247 126 126 326 23 101 101 149 149 321 321 287 111 111 111 349 205 261 25 189 189 139 293 122 35 449 34 253 253 453 453 342 118 118 118 118 402 402 14 226 321 209 411 145 204 204 204 204 204 204 29 337 337 337 301 8 259 354 109 151 240 325 34 41 324 301 399 217 70 65 151 169 150 342 105 221 259 354 420 420 301 301 251 251 241 367 367 367 367 367 458 192 192 176 135 200 200 464 415 415 415 415 457 457 217 429 429 429 464 464 89 203 394 129 401 321 75 74 351 278 278 278 325 449 41 41 324 324 324 464 434 135 328 328 200 248 248 248 429 429 429 429 429 19 19 454 417 417 170 170 170 170 28 491 28 2 491 491 2 491 2 2 491 2 316 491 491 316 73 289 289 321 321 354 159 159 159 285 34 111 111 111 111 111 111 438 438 239 384 371 180 151 151 31 54 54 142 397 397 109 109 189 330 457 394 465 108 377 87 87 43 364 276 109 372 498 396 396 178 458 192 89 340 94 199 255 255 399 217 473 65 486 486 486 460 240 240 36 310 107 242 275 275 116 195 466 45 45 45 45 325 34 111 111 111 111 438 438 58 72 72 72 110 110 110 110 254 254 240 285 34 106 125 125 125 125 466 22 283 455 399 70 65 496 496 496 186 186 238 6 6 472 221 401 401 47 47 491 491 47 80 491 80 401 321 354 354 485 485 219 219 219 485 485 374 374 374 132 132 132 285 449 469 469 469 349 349 155 262 262 100 100 100 497 497 122 129 401 401 401 401 321 75 74 74 437 351 351 290 290 171 171 171 171 171 139 139 139 139 497 497 497 497 122 32 32 32 401 401 321 354 425 425 425 241 431 431 374 374 374 374 132 132 132 132 186 162 232 232 232 68 68 172 115 273 278 278 139 139 293 122 458 458 96 472 221 401 401 75 161 79 487 288 443 443 169 271 150 39 433 433 433 433 160 427 247 247 247 126 126 126 326 326 326 326 326 326 326 326 326 326 101 101 101 149 228 228 321 321 321 354 420 420 422 143 458 192 485 278 368 453 9 397 345 409 409 409 67 219 219 152 152 152 152 14 14 411 411 284 284 284 353 353 353 396 406 467 467 255 255 255 399 217 473 65 486 486 365 460 240 310 107 107 447 242 94 199 176 176 328 200 248 248 219 152 152 152 378 399 70 65 428 428 428 146 143 449 34 253 253 9 142 397 336 109 109 139 139 175 175 81 255 255 217 217 65 486 486 460 240 240 36 310 107 242 242 116 394 478 66 342 224 231 231 231 76 76 198 214 214 214 328 200 248 250 364 276 109 498 498 396 169 164 164 133 364 276 276 346 346 346 265 85 85 85 355 355 375 375 375 98 229 229 321 247 15 15 15 15 15 193 193 193 193 17 +17 17 17 296 363 363 363 363 51 51 51 51 228 321 321 83 55 55 322 67 131 44 44 44 236 32 401 401 401 401 401 401 321 354 278 278 278 278 278 360 252 416 458 192 445 183 72 72 72 72 110 110 486 486 486 460 460 240 35 131 483 226 226 226 321 411 287 297 297 297 297 297 297 297 293 293 293 122 349 349 234 234 234 234 261 425 425 386 386 431 486 315 315 315 450 88 372 372 304 304 304 368 269 342 342 89 89 446 446 33 10 10 309 479 331 331 284 405 405 206 240 325 176 176 328 200 200 248 248 76 259 74 74 425 425 425 386 386 431 374 374 374 374 374 434 203 381 471 471 49 433 433 97 427 247 247 126 326 326 326 101 149 228 321 83 55 55 322 67 34 44 44 236 129 259 144 27 424 424 424 424 424 424 424 424 424 497 122 122 131 133 133 364 276 346 346 346 405 405 206 206 169 35 36 107 107 395 89 89 446 33 394 90 90 401 401 401 321 75 445 445 445 351 278 278 240 314 90 401 401 321 144 208 425 386 431 431 431 266 266 173 173 402 270 270 342 224 89 89 446 33 33 394 32 32 401 401 401 354 354 374 374 374 374 132 233 385 233 270 270 270 390 390 390 18 112 56 56 56 47 47 491 47 47 47 491 491 435 435 321 435 435 435 287 287 111 111 111 438 349 205 205 261 25 189 139 139 293 167 457 401 321 75 310 107 107 395 286 286 468 468 313 313 285 34 230 230 230 230 215 35 402 133 147 147 147 499 499 428 428 146 146 325 34 255 255 43 364 109 109 403 403 403 207 19 454 229 321 247 126 126 326 326 326 326 101 101 149 149 228 412 83 55 55 55 322 212 34 111 111 111 111 438 121 121 339 394 212 107 180 106 153 387 387 146 252 314 196 217 46 46 46 438 438 129 36 161 161 487 288 278 173 402 96 36 272 377 123 123 216 22 448 448 448 464 464 145 265 265 85 146 146 175 175 81 242 116 212 133 133 333 333 220 220 335 14 14 226 226 321 209 297 297 297 297 297 297 297 293 399 399 70 46 46 46 46 46 438 438 399 217 70 65 265 265 428 428 428 146 358 358 233 36 227 419 419 439 417 417 170 170 170 491 28 28 491 28 442 28 442 362 491 362 102 491 362 491 362 362 102 362 362 491 362 491 362 218 218 491 218 102 369 369 369 369 369 21 21 21 101 101 149 149 228 289 412 287 111 111 111 378 345 141 141 141 141 281 453 342 242 242 116 212 131 44 44 44 32 32 32 321 354 354 278 278 278 385 457 478 478 232 68 68 172 115 470 470 278 120 385 143 458 458 144 27 351 319 319 319 53 176 176 135 200 200 464 106 410 410 410 410 173 280 29 29 495 467 340 340 116 466 22 283 455 8 354 354 180 496 496 496 496 496 274 274 37 24 227 419 427 78 78 170 491 187 187 292 23 23 23 23 101 149 149 228 289 321 320 479 331 265 265 428 146 240 216 300 300 378 43 345 141 141 281 9 221 196 473 258 258 258 342 224 494 494 31 232 232 105 105 336 470 432 432 330 379 64 77 342 224 224 334 334 334 59 452 452 263 321 247 126 126 23 23 101 101 101 149 149 321 321 287 297 297 293 216 216 114 84 84 186 186 338 400 400 400 422 239 310 107 395 395 432 330 94 199 495 495 495 467 134 134 359 359 166 166 166 324 324 464 464 356 356 120 120 271 185 433 433 433 433 160 160 112 417 417 417 237 421 421 491 421 128 128 128 193 17 +17 17 17 296 296 363 363 51 51 51 321 321 373 338 400 400 400 422 422 162 68 115 470 470 443 240 314 35 310 107 400 400 30 422 58 110 110 254 254 254 240 35 242 242 242 33 457 465 108 119 437 103 103 103 146 299 203 53 64 212 377 87 416 416 445 180 278 443 385 385 77 478 66 232 68 172 115 273 470 278 278 120 178 458 458 192 225 225 225 7 276 346 346 405 206 206 35 310 107 135 135 135 248 212 384 87 87 38 342 68 172 267 267 267 267 301 301 216 45 45 45 325 111 111 111 438 438 239 384 371 278 278 116 242 33 90 393 393 234 261 25 106 481 481 481 293 293 175 14 14 410 410 410 410 410 280 29 29 245 245 8 354 153 153 153 153 372 372 372 37 24 404 439 229 491 247 312 312 187 292 292 292 292 292 21 21 21 21 23 101 408 408 149 321 321 373 400 400 400 30 422 162 162 68 115 470 470 120 240 240 314 310 338 338 400 400 400 30 301 10 10 309 479 331 463 463 463 463 29 382 313 186 186 162 54 115 273 106 481 405 481 293 216 216 283 283 455 236 401 401 321 354 213 213 213 252 325 34 69 223 130 402 196 429 429 429 429 422 393 155 332 332 245 129 321 74 190 190 380 499 499 486 481 481 293 175 175 81 176 328 200 200 255 255 8 8 180 113 113 113 113 113 450 450 167 385 75 227 419 439 78 78 170 491 28 491 491 341 341 12 12 12 21 21 21 21 21 21 101 101 149 391 228 491 289 321 321 320 159 159 159 285 34 118 118 118 118 261 177 177 177 131 90 259 144 445 351 351 443 443 240 215 35 96 96 272 156 156 382 349 205 155 165 165 165 165 53 394 212 212 354 420 420 360 360 360 135 135 200 200 248 248 478 66 68 68 68 115 267 267 267 213 422 186 162 68 68 68 115 273 470 278 278 178 143 458 192 177 177 77 77 342 168 44 44 399 217 217 70 65 498 498 498 396 186 162 54 172 224 41 41 324 464 464 111 111 438 438 239 75 371 371 278 278 314 35 401 259 74 190 190 499 499 499 405 450 293 293 175 175 81 356 356 281 453 430 430 430 430 64 465 34 277 277 277 277 385 385 233 321 419 427 491 491 312 312 312 187 187 12 12 12 12 12 21 21 326 408 408 149 149 321 321 209 55 55 322 322 199 111 111 111 378 43 364 174 174 319 348 325 34 191 191 36 87 87 87 162 68 68 172 267 267 267 267 464 464 464 204 204 204 204 29 29 337 469 164 164 214 214 214 200 248 114 45 177 43 345 141 141 281 86 238 6 377 87 87 8 354 420 420 420 422 162 162 68 68 68 68 267 267 267 267 267 434 339 339 199 125 125 125 125 348 466 114 114 92 92 92 167 457 401 321 354 354 496 496 496 496 274 37 24 131 427 321 247 126 326 326 326 326 326 326 326 101 149 228 289 321 321 354 420 420 422 143 144 27 180 253 368 453 168 111 111 111 438 236 325 371 278 278 278 314 242 242 242 457 10 10 10 309 331 331 84 84 84 274 43 43 109 109 181 216 216 300 300 300 406 467 111 111 111 111 438 240 325 34 463 463 463 280 29 382 382 58 72 72 110 202 202 202 202 402 44 44 116 479 331 493 493 493 493 216 300 495 406 467 467 499 405 206 215 29 29 469 469 236 36 108 119 485 485 485 374 374 330 94 199 469 469 469 325 41 41 41 19 19 19 454 454 229 170 491 491 15 15 15 15 15 15 15 15 193 193 193 193 193 17 +17 17 17 296 363 363 363 51 51 51 51 491 491 184 491 184 289 321 321 287 287 287 284 284 284 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 98 98 98 225 98 98 225 225 225 373 164 164 289 321 164 127 127 114 0 0 264 468 468 406 406 467 467 406 467 467 467 44 44 251 251 251 251 251 241 241 431 431 284 284 405 405 206 206 167 457 457 196 70 70 70 138 138 138 138 372 313 313 236 401 401 401 401 75 310 107 107 107 395 395 395 395 264 468 468 406 337 337 324 324 422 143 36 161 161 487 487 41 41 324 318 49 9 9 483 14 321 411 297 297 297 297 297 297 297 175 175 81 242 340 203 53 53 394 76 401 321 354 425 425 425 241 431 431 374 374 374 374 374 374 132 132 132 413 203 381 381 381 404 229 229 247 312 312 126 292 292 292 292 292 292 292 23 23 23 23 23 23 23 101 408 391 491 491 491 289 289 321 127 114 258 258 258 258 31 342 342 342 483 14 14 321 411 287 284 265 265 85 85 85 146 146 139 175 175 175 81 242 275 116 64 212 131 356 356 356 281 342 198 198 22 283 455 455 129 129 401 321 354 425 425 386 431 374 374 374 374 132 399 53 473 324 324 324 464 459 459 459 31 39 86 86 6 272 472 336 321 74 74 425 425 386 386 343 343 343 343 358 358 358 39 39 433 68 172 115 97 225 287 111 111 438 143 36 107 395 494 31 31 342 26 26 26 251 241 241 266 266 266 173 173 29 277 277 325 285 106 106 297 297 297 293 293 42 42 147 147 380 288 443 443 240 325 325 41 41 324 324 3 464 89 322 94 199 111 111 111 356 203 53 478 478 232 232 68 68 115 344 344 344 344 344 274 274 32 401 401 321 208 208 386 386 431 431 376 376 376 240 285 34 111 111 203 203 53 394 90 465 144 180 84 496 88 176 135 135 248 36 377 87 87 87 251 251 241 431 278 278 173 173 402 183 183 286 286 286 286 264 59 59 452 263 263 417 414 170 170 491 170 28 491 28 28 491 2 491 2 2 491 491 435 435 289 289 321 320 305 287 287 111 111 202 202 280 106 297 297 297 297 88 109 109 469 368 31 342 142 142 72 110 498 498 498 498 313 240 314 198 45 45 45 457 129 259 259 74 190 487 432 330 330 64 64 77 342 342 168 145 329 329 240 131 133 345 345 109 313 285 335 14 14 145 284 265 85 146 146 139 175 81 81 275 275 116 133 133 345 141 141 281 453 342 198 22 283 455 129 129 321 74 190 190 487 487 278 278 325 324 324 464 459 459 459 31 86 86 221 336 321 74 425 386 343 343 343 343 252 186 39 342 342 340 340 340 340 466 22 283 455 43 43 276 109 109 498 498 498 139 139 375 375 375 122 122 131 427 229 247 15 15 193 193 17 +17 17 17 363 363 363 51 51 228 321 83 55 55 322 131 111 111 111 111 438 219 219 219 485 485 374 186 162 54 238 6 161 87 87 464 255 255 399 217 473 65 486 486 460 240 240 310 107 395 242 116 94 199 111 111 378 378 345 141 141 281 342 9 26 26 251 241 431 278 278 173 173 280 176 135 328 200 248 183 183 286 286 286 286 264 59 59 452 263 321 247 247 126 126 292 292 292 23 23 23 23 260 260 391 391 391 316 73 73 289 321 321 354 159 159 159 285 34 111 111 111 111 438 10 10 479 463 463 463 463 463 29 29 382 245 245 42 42 147 147 380 485 485 278 278 359 359 166 166 166 464 464 154 154 458 96 66 86 105 105 336 470 470 151 178 178 96 96 272 191 191 191 325 34 111 111 111 111 438 438 43 364 364 109 109 389 389 120 120 120 37 37 75 419 419 439 78 170 170 170 170 28 491 28 491 28 362 362 491 362 2 362 362 491 491 491 366 491 491 316 316 435 289 321 321 177 177 177 143 36 77 86 86 221 336 384 490 490 490 251 251 251 241 431 428 428 428 428 146 35 35 393 393 155 262 262 100 100 497 43 364 409 409 409 409 33 219 219 152 222 222 406 467 467 467 255 203 217 473 65 486 486 460 460 240 310 107 395 395 469 116 94 418 418 418 418 418 99 436 436 60 298 298 379 471 49 9 142 336 144 27 351 319 319 203 53 90 76 321 161 161 161 487 487 374 374 132 88 88 356 356 356 453 342 430 430 116 64 212 131 277 277 277 277 277 385 385 75 419 427 229 491 312 312 126 292 292 292 1 1 1 1 21 21 21 21 101 408 149 149 228 321 320 320 159 159 159 35 35 198 127 124 124 124 124 124 368 9 142 397 42 147 147 380 288 443 443 240 240 314 131 133 133 147 147 380 496 496 496 274 368 77 270 9 353 353 353 186 186 232 482 172 115 344 344 344 344 274 349 349 234 234 234 234 261 25 319 319 319 240 94 199 41 41 41 41 19 19 19 454 454 414 170 170 312 312 187 187 187 292 292 292 23 23 23 101 101 149 149 228 321 321 320 345 409 409 409 399 473 429 30 301 143 465 144 180 189 189 240 285 94 34 340 340 116 64 76 377 377 123 123 216 216 22 283 455 236 401 321 75 161 161 487 487 288 290 290 290 434 339 199 199 415 457 457 186 338 338 338 395 499 499 306 306 206 293 175 81 81 469 457 457 36 75 108 119 351 315 315 315 315 450 450 413 413 94 199 340 340 466 22 283 455 455 42 42 147 380 288 443 443 240 314 131 133 133 364 147 380 380 496 496 496 274 274 24 77 270 142 221 336 420 420 420 416 445 445 210 210 210 460 330 388 76 384 87 87 87 349 234 261 261 386 431 431 376 376 460 460 169 169 99 436 447 447 221 336 74 74 311 311 311 311 311 311 311 460 169 150 150 342 86 6 272 427 82 247 126 326 326 326 326 101 101 101 149 149 228 321 287 287 111 111 111 438 438 145 145 376 376 460 460 169 150 150 86 238 6 196 196 217 473 258 258 342 342 224 494 494 31 162 68 105 105 336 354 470 432 330 379 64 77 77 224 300 382 382 245 43 345 181 181 181 167 457 217 217 473 476 476 476 252 314 259 22 57 57 203 53 250 250 147 380 288 288 120 120 240 385 131 229 247 126 193 193 17 +17 17 296 296 51 321 412 55 55 322 322 67 478 338 338 400 400 400 30 30 422 186 232 232 172 115 470 470 240 314 36 310 400 400 400 30 422 236 384 371 371 278 278 314 196 242 242 457 309 479 331 84 84 496 88 88 89 446 203 393 155 332 332 332 245 129 259 74 74 278 278 278 325 41 324 324 324 186 162 232 68 68 115 470 470 171 171 252 143 96 196 479 331 307 307 61 167 457 36 377 87 87 14 145 145 376 460 460 169 150 86 105 221 458 208 495 467 467 475 475 475 475 475 301 399 70 138 138 138 138 372 245 245 129 321 208 441 151 151 151 151 169 99 238 238 310 107 60 298 298 298 379 471 471 270 160 427 247 247 126 126 292 292 292 292 23 23 408 408 408 408 391 321 321 373 373 400 400 400 400 422 162 342 115 470 470 240 285 34 111 111 111 438 399 70 65 65 151 150 150 86 6 34 202 202 202 280 145 145 486 460 460 169 150 86 238 272 161 382 467 44 44 44 38 164 401 321 164 180 180 486 315 315 450 450 169 269 9 168 242 116 64 131 34 106 297 297 297 293 293 42 42 147 380 288 443 443 240 325 325 41 41 19 19 454 454 414 321 247 312 126 126 292 292 292 1 23 23 408 408 149 149 228 321 321 209 287 111 111 111 438 31 342 342 494 494 494 129 74 496 496 496 496 496 368 368 453 168 180 111 111 111 111 111 438 58 72 72 110 110 486 486 486 460 460 388 64 314 401 321 108 108 119 374 374 374 374 374 132 132 132 8 8 354 159 159 159 159 314 229 247 247 126 126 326 326 326 326 326 326 326 326 326 101 101 101 149 228 321 373 72 72 268 268 268 268 268 88 430 430 430 430 219 219 152 152 416 144 27 106 88 350 360 135 339 212 87 87 349 349 261 25 480 480 480 85 299 299 299 64 212 384 180 180 486 113 240 285 285 255 255 8 354 180 113 113 113 113 167 167 164 164 164 214 214 214 200 200 471 49 342 9 118 118 118 280 30 30 30 422 239 371 180 84 350 350 413 285 34 145 145 460 460 169 150 86 142 221 336 208 441 151 151 151 151 169 99 447 238 6 310 60 60 298 298 275 379 471 471 471 49 269 433 160 160 112 112 56 56 170 28 28 491 2 2 2 2 289 321 373 373 326 326 326 326 326 326 101 149 149 228 321 321 83 55 322 322 399 250 181 181 181 181 181 35 401 401 401 401 321 384 371 180 71 71 71 71 368 368 453 342 86 221 196 196 473 476 476 476 143 143 401 401 198 22 283 455 455 42 147 380 380 288 496 496 496 274 37 77 77 323 142 397 336 147 147 380 288 120 120 120 37 24 24 419 439 439 78 417 417 170 170 170 170 28 28 28 28 491 362 491 491 362 362 491 362 491 362 491 362 362 491 40 40 40 40 40 40 40 366 366 366 366 316 316 249 7 7 7 7 7 7 7 7 7 7 7 7 364 364 276 276 109 109 84 443 139 139 139 293 293 413 122 309 479 331 331 315 315 315 315 315 450 450 450 16 16 293 98 98 13 13 13 13 13 78 491 170 312 312 126 23 23 23 23 260 260 391 163 316 491 316 289 373 225 225 225 442 287 287 287 287 287 287 111 111 111 438 438 24 325 34 84 242 116 479 331 84 84 84 84 16 16 16 16 375 98 98 98 263 13 13 13 78 47 47 47 491 47 80 80 321 80 373 66 66 172 179 179 179 179 314 196 196 70 65 329 329 460 460 169 349 352 25 485 485 485 485 485 374 132 98 98 13 417 417 417 170 421 421 491 421 421 491 128 128 128 491 128 128 128 128 128 193 193 17 +17 17 17 363 363 363 149 149 228 321 127 114 0 0 313 313 35 354 420 420 420 301 10 479 331 231 231 231 274 186 162 482 482 105 6 144 496 496 496 215 457 393 205 155 332 332 332 216 448 448 448 464 255 399 473 65 486 486 460 240 24 310 395 469 242 116 94 418 418 418 418 418 418 99 436 436 60 60 298 298 116 33 394 466 127 114 361 361 361 282 388 303 117 48 13 80 80 80 321 7 364 345 430 430 430 314 35 401 198 127 114 114 264 264 264 59 59 452 452 13 229 247 247 312 312 312 292 292 292 292 292 12 21 1 21 21 21 21 21 23 101 101 149 149 391 316 316 316 73 73 289 289 321 320 159 159 285 34 430 430 430 399 70 65 111 438 438 143 36 108 119 351 405 405 405 206 178 192 192 176 135 135 248 248 465 377 377 374 374 132 399 70 383 383 383 383 383 385 35 310 310 107 447 97 427 56 56 47 491 187 80 491 80 289 321 320 74 485 213 213 252 215 354 29 302 302 175 175 81 353 353 353 353 467 467 297 297 297 293 43 345 109 469 281 342 342 6 36 119 351 351 139 139 175 81 176 135 200 248 248 429 429 429 429 464 464 111 111 111 111 438 438 239 75 371 371 374 374 374 374 132 132 132 98 98 13 414 247 312 312 126 187 292 12 12 12 12 23 23 23 101 149 149 228 321 321 320 345 430 389 236 310 107 152 152 152 378 42 147 380 180 486 486 460 240 216 300 300 495 406 467 111 111 111 438 314 36 371 371 278 278 314 242 242 242 457 457 108 108 119 437 437 405 405 405 405 206 206 215 35 458 192 419 427 229 247 312 126 292 292 23 1 408 408 408 149 228 228 316 316 80 80 289 321 209 188 118 118 118 118 118 261 219 152 152 152 152 186 162 232 172 115 470 470 403 171 171 422 162 342 342 273 273 84 16 88 106 284 481 293 293 293 150 162 232 86 238 272 371 180 106 284 405 405 405 206 206 215 215 233 352 419 13 229 82 312 187 187 187 187 47 47 47 47 491 491 491 316 491 316 80 80 435 435 435 435 209 111 111 111 438 143 458 445 445 445 351 351 351 365 365 365 365 330 388 64 64 77 77 342 68 238 6 272 180 405 405 405 215 215 35 402 345 409 409 94 199 111 111 111 438 399 217 473 473 476 476 476 143 458 192 180 230 230 215 35 35 70 70 46 46 46 438 438 399 217 70 65 480 480 480 480 299 299 339 394 465 108 377 123 123 123 88 277 277 277 277 385 131 34 106 297 297 297 293 216 114 114 84 84 88 88 177 177 177 143 36 77 342 86 238 6 336 371 490 490 490 349 349 261 469 469 469 458 144 27 100 100 100 375 375 122 122 227 227 419 427 56 56 491 312 312 312 12 12 12 12 12 12 12 12 12 12 260 260 260 260 260 491 163 163 163 366 491 366 491 316 491 366 366 491 40 40 40 40 316 289 321 321 289 7 7 217 217 473 486 486 486 460 460 460 169 164 164 164 164 219 219 219 485 477 477 374 374 132 132 98 13 417 417 417 417 237 421 421 128 128 193 17 +17 17 296 296 321 320 345 141 141 281 453 168 121 121 121 33 212 310 395 395 153 153 387 387 387 146 135 135 135 200 248 183 57 57 203 203 243 478 342 172 115 273 279 279 279 279 375 375 375 169 352 352 352 352 112 427 170 491 491 312 312 312 292 292 292 292 292 21 21 21 21 21 21 21 21 21 260 101 101 149 149 228 321 321 320 251 241 266 266 266 266 146 178 35 96 196 196 217 70 65 496 496 496 496 274 186 39 86 238 6 472 221 336 208 208 441 441 346 346 265 428 85 146 146 277 277 385 131 393 393 234 261 261 25 496 496 496 496 274 274 274 274 186 39 433 342 97 451 451 30 30 301 251 251 251 241 266 266 266 266 146 178 35 96 401 36 108 119 437 405 405 405 206 206 178 458 192 469 469 325 34 459 462 130 402 401 75 74 485 213 213 213 252 252 215 259 74 100 100 100 497 497 43 364 345 409 409 409 409 466 466 127 0 0 0 378 43 345 347 347 347 347 245 43 364 345 109 278 139 175 175 81 176 135 135 200 248 248 465 377 87 87 87 239 384 371 374 374 374 216 216 22 283 455 236 108 119 437 405 405 405 405 206 178 192 192 192 135 135 200 248 248 466 114 57 57 203 394 478 478 232 68 68 115 273 279 279 279 279 279 279 279 375 352 270 433 160 427 247 247 126 326 326 326 326 326 326 101 149 149 228 321 83 55 55 55 322 67 212 384 371 191 191 314 196 479 331 307 307 61 61 285 34 154 154 458 96 66 86 105 105 336 470 151 151 178 178 96 36 272 449 57 57 203 53 394 212 377 87 87 87 458 445 445 445 213 213 213 252 215 129 74 230 230 230 230 230 215 35 259 354 257 257 257 453 453 342 168 432 432 330 330 64 64 64 131 34 223 223 280 277 277 277 277 277 75 227 419 439 427 56 170 170 28 491 28 201 201 201 201 201 491 201 201 201 201 201 201 491 491 491 316 316 491 435 321 321 321 354 159 159 159 159 449 183 451 30 30 30 464 254 254 196 196 309 309 479 463 463 463 463 463 29 29 29 406 467 467 154 154 154 259 96 66 68 68 105 105 336 470 470 151 151 178 35 321 75 272 191 191 236 36 377 87 87 87 88 121 121 121 33 394 212 107 395 153 153 387 387 146 173 216 22 283 455 38 162 342 224 494 494 494 162 232 68 172 115 273 265 265 265 265 85 85 469 469 469 449 449 41 41 324 464 69 223 130 280 44 44 44 251 241 431 278 278 134 26 302 497 497 416 259 144 79 498 498 498 498 498 134 302 302 375 375 375 98 13 13 13 491 170 312 312 312 312 341 341 12 12 12 12 12 12 260 260 260 260 260 260 391 391 391 321 321 289 320 7 364 109 109 278 278 399 217 473 136 136 136 116 33 133 250 347 347 347 347 347 8 8 354 180 486 376 376 460 240 285 34 255 340 116 94 331 331 230 230 230 169 349 352 352 340 340 340 94 199 106 297 297 297 297 293 122 458 465 144 27 370 370 370 370 370 348 64 76 310 436 60 60 298 275 379 471 471 77 433 97 427 82 247 126 126 326 326 326 326 326 101 101 149 149 228 321 321 321 320 159 159 159 159 457 457 251 251 241 431 278 278 285 302 302 497 497 497 122 129 259 144 498 498 498 498 498 498 134 302 302 375 375 375 375 375 185 269 323 323 97 97 225 397 345 347 347 347 347 245 245 43 364 276 276 109 498 498 498 498 498 59 396 271 186 39 54 390 390 390 390 18 112 439 56 56 421 128 491 193 193 17 diff --git a/SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.tsv b/SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.tsv new file mode 100644 index 0000000..77da1d3 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/hidden_unit/train_sample100.tsv @@ -0,0 +1,101 @@ +/LocalData/dataset/LibriSpeech +train-clean-100/103/1240/103-1240-0000.flac 225360 +train-clean-100/103/1240/103-1240-0001.flac 255120 +train-clean-100/103/1240/103-1240-0002.flac 223120 +train-clean-100/103/1240/103-1240-0003.flac 235360 +train-clean-100/103/1240/103-1240-0004.flac 200240 +train-clean-100/103/1240/103-1240-0005.flac 242800 +train-clean-100/103/1240/103-1240-0006.flac 153280 +train-clean-100/103/1240/103-1240-0007.flac 240560 +train-clean-100/103/1240/103-1240-0008.flac 246960 +train-clean-100/103/1240/103-1240-0009.flac 160480 +train-clean-100/103/1240/103-1240-0010.flac 236880 +train-clean-100/103/1240/103-1240-0011.flac 234480 +train-clean-100/103/1240/103-1240-0012.flac 243040 +train-clean-100/103/1240/103-1240-0013.flac 244160 +train-clean-100/103/1240/103-1240-0014.flac 223360 +train-clean-100/103/1240/103-1240-0015.flac 60960 +train-clean-100/103/1240/103-1240-0016.flac 250640 +train-clean-100/103/1240/103-1240-0017.flac 229040 +train-clean-100/103/1240/103-1240-0018.flac 185760 +train-clean-100/103/1240/103-1240-0019.flac 246480 +train-clean-100/103/1240/103-1240-0020.flac 214640 +train-clean-100/103/1240/103-1240-0021.flac 236960 +train-clean-100/103/1240/103-1240-0022.flac 262000 +train-clean-100/103/1240/103-1240-0023.flac 194400 +train-clean-100/103/1240/103-1240-0024.flac 244320 +train-clean-100/103/1240/103-1240-0025.flac 241920 +train-clean-100/103/1240/103-1240-0026.flac 133360 +train-clean-100/103/1240/103-1240-0027.flac 223440 +train-clean-100/103/1240/103-1240-0028.flac 250400 +train-clean-100/103/1240/103-1240-0029.flac 244320 +train-clean-100/103/1240/103-1240-0030.flac 232320 +train-clean-100/103/1240/103-1240-0031.flac 269760 +train-clean-100/103/1240/103-1240-0032.flac 236400 +train-clean-100/103/1240/103-1240-0033.flac 230640 +train-clean-100/103/1240/103-1240-0034.flac 246480 +train-clean-100/103/1240/103-1240-0035.flac 256720 +train-clean-100/103/1240/103-1240-0036.flac 200320 +train-clean-100/103/1240/103-1240-0037.flac 237040 +train-clean-100/103/1240/103-1240-0038.flac 114480 +train-clean-100/103/1240/103-1240-0039.flac 230800 +train-clean-100/103/1240/103-1240-0040.flac 234720 +train-clean-100/103/1240/103-1240-0041.flac 216160 +train-clean-100/103/1240/103-1240-0042.flac 249680 +train-clean-100/103/1240/103-1240-0043.flac 236160 +train-clean-100/103/1240/103-1240-0044.flac 262240 +train-clean-100/103/1240/103-1240-0045.flac 250800 +train-clean-100/103/1240/103-1240-0046.flac 222800 +train-clean-100/103/1240/103-1240-0047.flac 206320 +train-clean-100/103/1240/103-1240-0048.flac 236320 +train-clean-100/103/1240/103-1240-0049.flac 244560 +train-clean-100/103/1240/103-1240-0050.flac 224400 +train-clean-100/103/1240/103-1240-0051.flac 245760 +train-clean-100/103/1240/103-1240-0052.flac 236640 +train-clean-100/103/1240/103-1240-0053.flac 218640 +train-clean-100/103/1240/103-1240-0054.flac 261360 +train-clean-100/103/1240/103-1240-0055.flac 179920 +train-clean-100/103/1240/103-1240-0056.flac 229040 +train-clean-100/103/1240/103-1240-0057.flac 109680 +train-clean-100/103/1241/103-1241-0000.flac 255440 +train-clean-100/103/1241/103-1241-0001.flac 248800 +train-clean-100/103/1241/103-1241-0002.flac 249040 +train-clean-100/103/1241/103-1241-0003.flac 222160 +train-clean-100/103/1241/103-1241-0004.flac 236080 +train-clean-100/103/1241/103-1241-0005.flac 224400 +train-clean-100/103/1241/103-1241-0006.flac 243760 +train-clean-100/103/1241/103-1241-0007.flac 242320 +train-clean-100/103/1241/103-1241-0008.flac 242160 +train-clean-100/103/1241/103-1241-0009.flac 222400 +train-clean-100/103/1241/103-1241-0010.flac 253920 +train-clean-100/103/1241/103-1241-0011.flac 231760 +train-clean-100/103/1241/103-1241-0012.flac 239680 +train-clean-100/103/1241/103-1241-0013.flac 236960 +train-clean-100/103/1241/103-1241-0014.flac 242080 +train-clean-100/103/1241/103-1241-0015.flac 224160 +train-clean-100/103/1241/103-1241-0016.flac 234640 +train-clean-100/103/1241/103-1241-0017.flac 254240 +train-clean-100/103/1241/103-1241-0018.flac 150960 +train-clean-100/103/1241/103-1241-0019.flac 48400 +train-clean-100/103/1241/103-1241-0020.flac 155360 +train-clean-100/103/1241/103-1241-0021.flac 242880 +train-clean-100/103/1241/103-1241-0022.flac 261600 +train-clean-100/103/1241/103-1241-0023.flac 266720 +train-clean-100/103/1241/103-1241-0024.flac 254240 +train-clean-100/103/1241/103-1241-0025.flac 77280 +train-clean-100/103/1241/103-1241-0026.flac 176080 +train-clean-100/103/1241/103-1241-0027.flac 238080 +train-clean-100/103/1241/103-1241-0028.flac 248880 +train-clean-100/103/1241/103-1241-0029.flac 244960 +train-clean-100/103/1241/103-1241-0030.flac 247520 +train-clean-100/103/1241/103-1241-0031.flac 209600 +train-clean-100/103/1241/103-1241-0032.flac 224080 +train-clean-100/103/1241/103-1241-0033.flac 251920 +train-clean-100/103/1241/103-1241-0034.flac 270560 +train-clean-100/103/1241/103-1241-0035.flac 248800 +train-clean-100/103/1241/103-1241-0036.flac 249040 +train-clean-100/103/1241/103-1241-0037.flac 204400 +train-clean-100/103/1241/103-1241-0038.flac 238960 +train-clean-100/103/1241/103-1241-0039.flac 258160 +train-clean-100/103/1241/103-1241-0040.flac 220560 +train-clean-100/103/1241/103-1241-0041.flac 252240 diff --git a/SpeechLM/dataset/LibriSpeech/phone_unit/dict.phn.txt b/SpeechLM/dataset/LibriSpeech/phone_unit/dict.phn.txt new file mode 100644 index 0000000..47b7a03 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/phone_unit/dict.phn.txt @@ -0,0 +1,364 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 diff --git a/SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.phn b/SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.phn new file mode 100644 index 0000000..6550e52 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.phn @@ -0,0 +1,100 @@ +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 111 111 111 111 111 111 111 111 111 111 111 111 37 37 37 37 37 37 37 273 273 273 273 273 273 289 289 289 289 289 144 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 53 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 223 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 193 233 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 116 1 1 1 187 187 187 187 187 187 187 187 187 340 340 340 340 340 279 279 279 279 279 279 279 49 49 49 49 49 273 273 273 273 273 273 273 273 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 341 341 341 341 341 341 341 341 341 341 341 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 223 223 223 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 193 193 193 233 233 233 233 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 223 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 329 329 329 329 329 329 116 116 116 1 1 1 1 1 1 1 1 215 215 215 215 215 215 215 215 215 215 215 215 53 53 53 53 53 53 53 53 53 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 331 331 331 331 133 133 133 133 133 133 276 276 276 276 276 276 119 119 119 119 119 204 204 204 204 204 204 204 204 204 204 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 49 49 49 49 233 233 233 233 233 233 233 233 233 233 225 225 225 225 225 212 212 212 212 212 212 212 212 212 212 212 212 212 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 232 232 232 232 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 115 115 115 115 115 115 115 193 193 193 193 193 193 193 273 273 273 273 273 273 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 115 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 232 187 187 187 233 233 233 233 289 289 289 289 289 289 289 289 320 320 320 320 320 320 50 50 50 50 50 50 50 223 223 223 223 223 223 193 193 193 193 193 289 289 289 289 289 49 49 49 49 224 224 224 224 224 224 224 179 179 179 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 225 225 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 171 171 171 171 171 171 277 277 277 277 277 193 193 193 193 193 233 233 233 233 233 233 233 233 217 217 217 217 217 217 217 217 217 116 116 116 331 331 331 331 331 189 189 189 189 292 292 292 292 292 292 67 67 67 67 67 67 67 67 67 67 67 67 67 67 225 225 225 225 225 225 117 117 117 117 117 117 117 145 145 145 145 145 145 145 145 145 145 340 340 340 340 340 340 340 340 47 47 47 47 47 47 233 233 233 233 233 116 116 116 116 116 223 223 223 223 165 165 165 165 165 165 165 165 165 165 165 165 117 117 117 117 117 205 205 205 205 205 205 205 205 205 340 340 340 340 340 340 340 340 340 191 191 191 191 191 191 191 277 277 277 277 277 277 277 117 117 117 117 117 117 277 277 277 277 277 25 25 25 25 25 25 25 25 273 273 273 273 273 273 273 273 280 280 280 280 280 280 280 280 47 47 47 47 233 233 233 233 116 116 116 287 287 287 287 287 277 277 277 277 49 49 49 49 329 329 329 329 329 149 149 149 149 149 149 149 149 149 149 149 149 149 149 281 281 281 281 281 281 288 288 288 288 288 288 288 107 107 107 107 107 107 100 100 100 100 100 100 100 100 100 100 50 50 50 50 50 50 107 107 107 107 107 107 107 107 107 107 107 107 277 277 277 277 277 305 305 305 305 305 305 305 305 305 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 49 49 49 288 288 288 288 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 116 191 191 191 191 191 191 289 289 289 289 289 289 280 280 280 280 279 279 279 279 279 279 279 279 279 279 279 279 69 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 280 280 280 280 280 280 280 280 280 47 47 47 47 47 47 333 333 333 333 333 333 333 333 333 333 333 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 107 107 107 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 220 220 220 220 220 220 220 220 220 220 187 187 187 187 232 232 232 232 232 119 119 119 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 305 305 305 305 305 117 117 117 117 117 117 340 340 340 340 340 47 47 47 328 328 328 328 119 119 119 119 119 204 204 204 204 204 204 204 204 247 247 247 247 247 247 247 247 247 225 225 225 225 225 116 116 116 116 116 116 116 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 293 109 109 109 109 109 145 145 145 145 145 145 145 145 145 288 288 288 288 288 288 271 271 271 271 271 271 271 271 271 225 225 225 225 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 331 331 331 331 49 49 49 49 49 340 340 340 340 340 340 340 275 275 275 275 189 189 189 189 273 273 273 273 273 273 273 273 337 337 337 337 321 321 321 321 321 321 321 289 289 289 289 289 189 189 189 189 189 189 189 116 116 116 116 287 287 287 188 188 188 188 107 107 107 107 107 107 208 208 208 208 208 208 208 208 208 47 47 47 232 232 232 232 232 232 232 232 232 191 191 191 191 191 191 191 233 233 233 233 233 233 233 233 289 289 289 289 289 289 289 277 277 277 49 49 49 49 221 221 221 221 221 221 221 49 49 49 49 49 49 49 49 49 288 288 288 288 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 133 133 133 133 133 133 117 117 117 117 117 117 117 117 117 117 225 225 225 225 225 225 73 73 73 73 73 73 73 73 73 73 236 236 236 236 236 236 236 236 236 236 236 236 236 107 107 107 107 107 277 277 277 277 277 277 305 305 305 305 305 305 305 220 220 220 220 220 220 220 220 220 220 187 187 187 187 232 232 232 232 187 187 187 289 289 289 289 289 280 280 280 280 280 1 1 1 147 147 147 147 147 147 147 147 147 147 147 147 147 225 225 225 225 225 205 205 205 205 205 144 144 144 144 144 144 144 144 219 219 219 219 219 219 219 219 219 219 219 219 69 69 69 69 69 69 69 69 277 277 277 277 277 277 280 280 280 280 280 280 280 280 291 291 291 291 291 291 277 277 277 277 320 320 320 320 119 119 119 119 119 249 249 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 340 340 340 331 331 331 331 331 331 331 331 305 305 305 305 305 305 305 117 117 117 117 117 117 117 117 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 193 193 193 193 292 292 292 292 292 292 292 292 292 292 292 292 292 292 115 115 115 115 115 115 115 115 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 220 220 220 220 220 220 220 220 220 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 221 221 221 221 221 221 221 277 277 277 277 277 189 189 189 189 289 289 289 289 289 289 280 280 280 280 280 280 47 47 47 47 328 328 328 328 328 328 328 328 271 271 271 271 271 271 271 271 271 271 271 271 271 321 321 321 321 321 321 321 321 321 321 321 224 224 224 224 224 224 224 224 224 224 224 224 224 47 47 47 47 47 233 233 233 233 116 116 116 116 116 219 219 219 219 219 219 219 219 219 219 219 33 33 33 33 33 33 33 33 33 281 281 281 281 281 281 281 281 281 281 281 221 221 221 221 221 221 221 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 53 53 53 53 53 53 288 288 288 288 288 288 288 1 1 1 107 107 107 107 100 100 100 100 100 100 100 100 100 119 119 119 119 48 48 48 48 287 287 287 287 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 101 228 228 228 228 228 228 228 187 187 187 288 288 288 288 288 288 288 275 275 275 275 275 275 275 275 275 209 209 209 209 209 209 209 113 113 113 113 113 113 113 113 113 288 288 288 288 288 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 233 233 233 233 233 233 233 117 117 117 117 340 340 340 340 340 179 179 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 225 225 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 191 191 191 191 191 191 191 191 191 191 288 288 288 288 288 288 288 288 331 331 331 331 331 49 49 49 49 340 340 340 340 340 50 50 50 50 50 219 219 219 219 219 219 219 219 219 219 219 219 333 333 333 333 333 333 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 49 49 49 49 49 49 49 288 288 288 288 288 288 288 1 1 1 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 224 224 224 224 224 224 224 224 219 219 219 219 219 219 219 49 49 49 49 233 233 233 233 233 233 233 117 117 117 117 117 117 53 53 53 53 53 53 53 53 221 221 221 221 221 221 289 289 289 289 289 289 49 49 49 49 49 49 116 116 116 116 116 116 223 223 223 223 223 193 193 193 289 289 289 289 289 49 49 49 49 224 224 224 224 224 279 279 279 279 279 279 279 289 289 289 289 289 289 289 277 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 209 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 69 276 276 276 276 276 276 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 288 288 288 288 288 288 207 207 207 207 207 207 207 207 207 207 329 329 329 329 329 329 189 189 189 189 232 232 232 232 232 50 50 50 50 50 50 107 107 107 107 107 107 107 107 107 107 107 277 277 277 277 277 277 277 277 277 305 305 305 305 305 305 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 219 219 219 219 219 219 219 219 219 305 305 305 305 116 116 116 116 116 116 275 275 275 275 275 275 275 275 275 275 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 271 271 271 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 288 288 288 288 227 227 227 227 227 193 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 223 223 223 223 223 223 223 223 223 223 223 193 193 193 193 193 233 233 233 233 233 233 233 233 233 233 117 117 117 117 340 340 340 340 340 340 340 115 115 115 115 115 115 69 69 69 69 69 69 276 276 276 276 276 276 331 331 331 331 331 331 331 189 189 189 121 121 121 121 121 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 115 115 115 115 115 320 320 320 320 320 320 320 320 320 320 320 275 275 275 275 275 275 275 189 189 189 189 189 177 177 177 177 177 177 177 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 116 116 116 116 116 116 171 171 171 171 171 171 171 171 144 144 144 144 144 144 115 115 115 115 115 115 115 115 115 115 209 209 209 209 209 209 209 209 209 281 281 281 281 281 281 281 281 49 49 49 49 233 233 233 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 281 204 204 204 204 204 204 204 204 204 204 204 204 204 204 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 115 115 115 189 189 189 189 221 221 221 221 221 221 221 221 221 221 221 69 69 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 49 49 49 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 271 271 271 271 271 271 271 277 277 277 277 277 277 21 21 21 21 109 109 109 109 109 109 49 49 49 49 49 49 109 109 109 109 109 225 225 225 225 225 225 204 204 204 204 204 204 204 204 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 219 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 21 21 21 233 233 233 233 233 233 233 233 285 285 285 285 285 285 285 285 49 49 49 49 49 49 49 49 49 49 280 280 280 280 280 280 280 280 280 119 119 119 119 119 49 49 49 49 49 288 288 288 288 288 288 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 279 279 279 279 279 279 279 279 193 193 193 193 289 289 289 289 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 35 35 35 35 288 288 288 288 288 179 179 179 179 179 179 179 179 144 144 144 144 144 144 144 331 331 331 331 331 331 331 193 193 193 193 233 233 233 233 233 233 233 233 117 117 117 117 117 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 219 219 219 219 219 219 219 219 219 219 209 209 209 209 209 209 209 273 273 273 273 273 273 273 189 189 189 236 236 236 236 236 236 236 236 50 50 50 50 50 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 21 21 21 21 21 21 21 21 277 277 277 277 277 277 272 272 272 272 272 272 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 19 19 19 19 19 19 19 19 19 19 232 232 232 232 232 232 232 232 232 131 131 131 131 131 131 131 131 329 329 329 329 329 329 329 329 329 277 277 277 277 277 205 205 205 205 205 205 293 293 293 293 293 293 293 293 293 197 197 197 197 236 236 236 236 236 236 236 236 119 119 119 49 49 49 49 288 288 288 288 288 271 271 271 271 271 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 145 145 145 145 145 145 145 228 228 228 228 228 107 107 107 107 277 277 277 277 305 305 305 305 305 305 221 221 221 221 221 221 221 280 280 280 280 280 280 47 47 47 47 47 233 233 233 116 116 116 116 111 111 111 111 111 193 193 193 193 225 225 225 225 225 225 225 225 117 117 117 117 117 277 277 277 49 49 49 232 232 232 232 232 232 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 272 272 272 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 119 119 119 37 37 37 37 37 37 37 37 288 288 288 288 288 187 187 187 187 187 187 172 172 172 172 172 283 283 283 283 283 283 283 208 208 208 208 208 208 231 231 231 231 231 231 231 231 249 249 249 249 249 249 249 249 249 289 289 289 289 49 49 49 49 49 49 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 131 131 131 131 131 131 131 233 233 233 233 233 233 233 205 205 205 205 205 205 205 293 293 293 293 293 293 197 197 197 236 236 236 236 236 236 236 1 1 1 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 116 116 116 1 1 1 67 67 67 67 67 67 67 67 276 276 276 276 276 276 276 276 276 276 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 47 47 47 47 328 328 328 328 271 271 271 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 331 331 331 331 331 331 331 305 305 305 305 116 116 116 116 116 231 231 231 231 231 231 231 231 231 133 133 133 133 133 133 329 329 329 329 329 144 144 144 144 144 144 144 144 144 275 275 275 275 275 275 275 275 275 133 133 133 133 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 47 47 47 47 233 233 233 233 233 233 233 289 289 289 289 289 289 193 193 193 193 193 224 224 224 224 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 179 179 179 37 37 37 37 116 116 116 116 116 116 171 171 171 171 171 171 171 171 133 133 133 133 133 277 277 277 277 277 277 277 277 49 49 49 49 49 289 289 289 289 289 289 189 189 189 116 116 116 116 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 288 119 119 119 52 52 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 340 340 340 340 340 340 340 340 47 47 47 47 233 233 233 233 116 116 116 116 116 116 116 331 331 331 331 331 331 331 133 133 133 133 133 133 277 277 277 277 277 277 277 277 173 173 173 173 173 173 173 173 173 173 173 173 73 73 73 73 73 73 277 277 277 277 277 277 340 340 340 340 340 340 340 340 119 119 119 119 119 137 137 137 137 137 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 53 53 53 53 53 53 53 53 53 53 53 53 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 133 133 133 276 276 276 19 19 19 276 276 276 276 276 276 271 271 271 271 271 271 271 271 271 271 225 225 225 225 133 133 133 133 133 133 233 233 233 233 233 289 289 289 289 204 204 204 204 204 47 47 47 328 328 328 328 328 271 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 273 273 273 273 273 49 49 49 224 224 224 224 224 224 224 191 191 191 191 191 191 191 191 191 191 191 191 232 232 232 232 232 232 232 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 49 49 49 49 49 49 233 233 233 233 233 233 233 233 225 225 225 225 225 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 116 116 116 116 116 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 47 47 47 47 328 328 328 328 328 328 328 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 320 320 320 320 219 219 219 219 219 219 219 49 49 49 49 232 232 232 232 232 47 47 47 47 47 289 289 289 289 289 289 289 289 289 289 289 289 133 133 133 133 133 133 133 233 233 233 233 233 116 116 116 116 116 116 116 116 116 219 219 219 219 219 219 219 219 219 219 225 225 225 225 225 249 249 249 249 249 249 249 249 281 281 281 281 281 281 281 281 281 281 281 281 225 225 225 225 204 204 204 204 204 204 287 287 287 287 287 287 188 188 188 188 119 119 119 133 133 133 276 276 276 276 276 276 276 231 231 231 231 231 231 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 109 109 145 145 145 145 145 340 340 340 340 340 340 340 340 340 340 107 107 107 107 107 107 193 193 193 193 193 341 341 341 341 341 341 341 341 341 233 233 233 233 233 49 49 49 49 49 49 49 49 280 280 280 280 280 280 280 280 280 107 107 107 107 107 107 107 100 100 100 100 100 100 100 100 100 100 100 115 115 115 115 115 115 115 115 115 193 193 193 193 193 233 233 233 233 233 233 233 288 288 288 288 288 47 47 47 47 328 328 328 328 328 231 231 231 231 189 189 189 189 177 177 177 177 177 177 177 225 225 225 225 133 133 133 133 133 133 221 221 221 221 221 221 221 289 289 289 289 189 189 189 236 236 236 236 236 236 236 119 119 119 119 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 247 247 247 247 247 247 247 247 247 247 247 247 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 53 53 288 288 288 288 288 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 223 223 223 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 233 233 233 233 233 233 233 116 116 116 116 116 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 331 331 331 331 331 331 53 53 53 53 232 232 232 232 47 47 47 47 47 328 328 328 119 119 119 119 119 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 340 219 219 219 219 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 165 273 273 273 49 49 49 49 49 109 109 109 109 109 109 109 49 49 49 49 224 224 224 224 224 224 224 224 219 219 219 219 219 219 219 219 219 219 219 219 219 277 277 277 277 277 277 209 209 209 209 209 209 209 113 113 113 113 113 113 113 113 113 113 113 113 113 145 145 145 145 145 145 145 145 340 340 340 340 340 340 340 340 179 179 179 179 320 320 320 219 219 219 219 219 219 219 49 49 49 49 49 232 232 232 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 233 233 233 233 233 49 49 49 49 49 49 216 216 216 216 216 216 216 216 216 216 216 216 119 119 119 133 133 133 133 276 276 276 276 276 276 276 276 247 247 247 247 247 247 247 247 247 247 247 247 247 232 232 232 232 232 219 219 219 219 219 219 219 49 49 49 49 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 281 281 281 149 149 149 149 149 149 149 149 149 149 149 233 233 233 233 233 233 233 340 340 340 340 340 340 340 35 35 35 35 35 233 233 233 233 233 233 116 116 116 119 119 119 119 249 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 47 47 47 47 47 328 328 328 328 328 328 328 51 51 51 51 51 121 121 121 121 121 121 144 144 144 144 171 171 171 171 171 171 171 171 171 171 249 249 249 249 249 249 249 249 249 249 249 249 221 221 221 221 221 221 221 280 280 280 280 280 280 187 187 187 187 233 233 233 233 289 289 289 289 48 48 48 119 119 119 119 52 52 52 107 107 107 107 107 21 21 21 21 21 21 21 21 277 277 277 277 277 277 177 177 177 177 177 177 177 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 50 50 50 50 231 231 231 231 231 231 249 249 249 249 249 249 249 289 289 289 289 49 49 49 109 109 109 49 49 49 224 224 224 224 224 224 224 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 281 281 281 281 281 281 281 281 281 281 281 333 333 333 333 333 333 333 105 105 105 105 105 105 105 105 105 105 105 105 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 220 220 220 220 220 220 220 220 220 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 67 67 67 67 67 67 67 67 225 225 225 225 225 225 225 333 333 333 333 333 333 333 333 333 205 205 205 205 205 340 340 340 340 340 340 340 115 115 115 115 115 115 115 115 53 53 53 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 116 116 116 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 115 115 115 115 115 115 115 115 53 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 275 275 275 275 275 275 275 275 275 275 275 275 275 275 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 119 119 119 119 119 48 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 249 249 249 249 249 249 249 249 189 189 189 189 189 189 236 236 236 236 236 236 236 236 279 279 279 279 279 279 279 279 149 149 149 149 149 149 149 149 221 221 221 221 221 221 221 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 133 133 133 133 133 225 225 225 225 225 225 225 273 273 273 273 273 273 273 288 288 288 288 288 288 275 275 275 275 275 275 275 275 275 275 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 119 119 119 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 233 233 233 233 233 233 233 117 117 117 117 117 168 168 168 168 168 168 168 168 168 168 279 279 279 279 279 279 279 279 279 279 221 221 221 221 221 221 221 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 224 224 224 224 224 224 224 224 224 224 224 224 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 331 331 331 331 331 331 49 49 49 49 49 340 340 340 340 340 340 340 119 119 119 48 48 48 48 48 48 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 289 277 277 277 69 69 69 69 69 69 69 237 237 237 237 237 237 237 177 177 177 177 49 49 49 49 49 281 281 281 281 281 281 281 288 288 288 288 288 288 288 271 271 271 271 271 271 271 271 277 277 277 277 277 277 277 21 21 21 21 21 21 21 21 272 272 272 272 272 272 272 272 47 47 47 47 328 328 328 1 1 1 119 119 119 119 52 52 52 52 52 111 111 111 111 111 111 111 111 111 111 111 111 111 111 149 149 149 149 149 149 149 149 149 112 112 112 112 112 112 112 112 112 112 112 1 1 1 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 116 116 116 116 116 279 279 279 279 279 279 49 49 49 49 49 281 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 49 49 49 49 49 289 289 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 171 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 69 69 69 69 277 277 277 277 277 277 49 49 49 49 232 232 232 227 227 227 227 227 227 227 227 193 193 193 193 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 49 233 233 233 233 233 233 233 233 233 340 340 340 340 340 15 15 15 15 15 15 15 177 177 177 177 177 177 177 177 177 341 341 341 341 341 341 341 193 193 193 193 225 225 225 225 225 225 225 337 337 337 337 337 145 145 145 145 145 145 145 145 145 145 145 145 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 335 133 133 133 133 133 133 288 288 288 288 288 288 288 331 331 331 331 331 189 189 189 189 189 120 120 120 120 120 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 119 119 119 119 119 193 193 193 193 193 193 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 275 165 165 165 165 165 165 113 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 85 85 85 85 85 85 85 85 85 85 85 85 233 233 233 233 116 116 116 116 116 1 1 1 47 47 47 47 47 47 47 47 109 109 109 109 109 109 109 109 109 109 53 53 53 53 53 53 53 233 233 233 233 233 233 233 233 233 233 233 233 233 117 117 117 117 117 49 49 49 49 49 49 233 233 233 233 233 233 233 288 288 288 288 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 101 101 101 101 101 228 228 228 228 228 228 287 287 287 287 287 48 48 48 48 279 279 279 279 279 279 279 279 279 193 193 193 193 288 288 288 288 288 288 288 171 171 171 171 171 171 171 144 144 144 144 144 144 144 144 144 144 144 144 144 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 277 277 277 277 277 277 277 277 340 340 340 340 340 340 340 340 340 35 35 35 35 288 288 288 288 179 179 179 179 179 179 144 144 144 144 144 219 219 219 219 219 219 219 219 219 193 193 193 193 193 113 113 113 113 113 113 113 113 113 113 113 49 49 49 49 232 232 232 232 232 232 232 232 331 331 331 331 331 331 193 193 193 193 233 233 233 233 233 233 233 117 117 117 117 117 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 231 231 231 193 193 193 193 193 289 289 289 289 289 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 236 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 21 21 21 289 289 289 289 289 289 49 49 49 232 232 232 232 232 232 232 232 232 232 331 331 331 331 331 331 331 331 69 69 69 69 69 69 69 277 277 277 277 277 272 272 272 272 272 272 272 272 272 272 272 219 219 219 219 219 219 219 219 219 219 219 219 333 333 333 333 333 193 193 193 193 225 225 225 225 225 225 225 225 225 225 225 225 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 179 179 179 179 179 37 37 37 37 116 116 116 116 231 231 231 231 231 193 193 193 193 193 193 193 289 289 289 289 289 189 189 189 189 189 189 116 116 116 116 116 116 279 279 279 279 279 279 279 279 279 193 193 193 193 221 221 221 221 221 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 209 209 209 209 209 209 209 232 232 232 232 232 47 47 47 47 328 328 328 328 328 119 119 119 119 119 119 49 49 49 49 49 49 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 340 340 340 340 340 340 340 340 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 49 49 49 49 49 233 233 233 225 225 225 225 225 225 212 212 212 212 212 212 212 179 179 179 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 281 281 281 281 281 281 281 281 221 221 221 221 221 221 221 213 213 213 213 213 213 213 213 213 273 273 273 273 273 273 145 145 145 145 145 145 145 340 340 340 340 340 340 340 331 331 331 331 331 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 331 331 249 249 249 233 233 233 233 233 288 288 288 287 287 287 287 188 188 188 188 188 287 287 287 287 287 287 287 287 287 287 287 287 287 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 187 187 187 187 187 232 232 232 232 232 232 232 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 116 116 116 116 116 327 327 327 327 327 327 327 327 327 327 265 265 265 265 265 265 265 265 265 265 265 265 281 281 281 281 281 281 281 281 281 281 281 281 281 189 189 189 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 219 219 219 219 219 219 219 219 219 219 209 209 209 209 209 209 209 209 209 273 273 273 273 273 189 189 189 189 189 189 236 236 236 236 236 236 236 236 50 50 50 50 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 21 21 21 21 21 21 21 277 277 277 277 277 277 272 272 272 272 272 272 272 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 19 19 19 19 19 19 19 232 232 232 232 232 232 119 119 119 52 52 52 227 227 227 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 232 232 275 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 116 119 119 119 119 119 49 49 49 288 288 288 288 219 219 219 219 219 219 219 219 219 219 277 277 277 277 277 69 69 69 69 69 69 69 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 119 119 119 52 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 21 21 21 21 225 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 233 233 233 233 116 116 116 116 116 116 116 331 331 331 331 331 331 331 331 331 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 233 233 233 233 233 116 116 116 116 116 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 272 119 119 119 119 52 52 52 52 52 279 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 209 209 209 209 209 209 209 209 209 272 272 272 272 272 272 272 275 275 275 275 275 275 275 275 275 275 275 275 275 275 133 133 133 133 133 133 116 116 116 116 116 116 179 179 179 179 179 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 224 224 224 224 224 224 224 224 224 224 224 107 107 107 107 107 107 107 213 213 213 213 213 213 213 213 213 213 213 69 69 69 69 69 69 69 69 69 69 69 69 69 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 131 131 131 131 131 131 131 131 131 131 131 233 233 233 233 233 233 233 205 205 205 205 205 205 205 109 109 109 109 109 109 49 49 49 49 49 49 49 117 117 117 117 204 204 204 204 204 204 204 204 179 179 179 179 179 179 179 179 179 320 320 320 320 320 320 331 331 331 331 331 331 331 331 133 133 133 133 133 133 233 233 233 233 233 233 233 233 288 288 288 288 83 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 47 47 47 47 47 328 328 328 328 328 328 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 276 276 276 276 276 276 276 276 276 276 191 191 191 191 191 191 191 233 233 233 233 233 233 233 233 233 289 289 289 289 289 289 289 316 316 316 316 316 316 316 316 316 316 316 187 187 187 187 187 187 187 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 116 116 116 116 287 287 287 287 287 188 188 188 188 188 271 271 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 37 37 37 37 37 37 280 280 280 280 280 280 280 280 280 280 280 280 247 247 247 247 247 247 247 247 247 329 329 329 329 329 144 144 144 144 144 144 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 288 288 288 288 179 179 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 275 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 35 35 35 35 35 35 35 35 233 233 233 233 233 116 116 116 116 116 116 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 275 275 275 275 275 275 275 275 275 275 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 119 119 119 119 119 204 204 204 204 204 204 204 47 47 47 47 47 47 47 47 47 47 47 47 233 233 233 233 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 232 232 232 232 175 175 175 175 175 175 69 69 69 69 69 69 69 69 69 233 233 233 233 233 233 233 233 289 289 289 289 289 289 289 289 225 225 225 225 49 49 49 49 49 49 288 288 288 288 47 47 47 47 47 47 328 328 328 328 328 328 328 227 227 227 227 227 227 227 193 193 193 193 281 281 281 281 281 281 281 281 281 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 113 49 49 49 49 49 49 49 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 331 331 331 331 331 49 49 49 340 340 340 340 340 279 279 279 279 279 279 279 193 193 193 193 193 193 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 236 119 119 119 119 133 133 133 133 133 276 276 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 331 53 53 53 53 232 232 232 232 232 232 39 39 39 39 39 39 39 173 173 173 173 173 173 173 289 289 289 289 289 289 145 145 145 145 145 233 233 233 233 233 321 321 321 321 321 321 321 321 321 321 321 232 232 232 232 232 187 187 187 187 232 232 232 232 232 232 1 1 1 147 147 147 147 147 147 147 147 147 147 147 147 147 147 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 215 215 215 215 215 215 215 215 215 215 215 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 48 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 219 219 219 219 219 219 219 219 219 53 53 53 53 53 229 229 229 229 229 229 189 189 189 236 236 236 236 236 236 236 236 236 236 236 191 191 191 191 232 232 232 232 232 35 35 35 288 288 288 288 288 288 119 119 119 52 52 52 52 52 331 331 331 331 331 331 331 193 193 193 193 193 233 233 233 233 233 233 233 233 233 117 117 117 117 117 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 1 1 1 331 331 331 331 331 331 69 69 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 228 228 228 228 228 228 228 47 47 47 233 233 233 116 116 116 116 116 116 107 107 107 107 107 107 277 277 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 204 204 204 204 204 204 204 204 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 277 113 113 113 113 113 113 113 113 113 113 145 145 145 145 116 116 116 116 116 19 19 19 19 19 19 19 19 232 232 232 232 232 119 119 119 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 279 279 225 225 225 225 225 249 249 249 249 249 249 249 249 249 249 272 272 272 272 272 272 272 107 107 107 189 189 189 189 225 225 225 225 225 225 225 225 225 225 225 225 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 119 119 119 52 52 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 280 280 280 280 280 280 280 280 280 280 280 280 280 331 331 331 331 49 49 49 340 340 340 340 340 340 340 187 187 187 232 232 232 232 232 50 50 50 50 50 107 107 107 107 107 107 107 107 277 277 277 277 277 277 277 277 101 101 101 101 101 101 101 101 117 117 117 117 49 49 49 49 49 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 225 225 225 225 225 53 53 53 53 53 53 53 53 53 53 284 284 284 284 284 284 284 284 284 284 284 284 284 47 47 47 47 328 328 328 328 328 328 328 328 328 271 271 271 271 271 271 271 271 271 271 271 193 193 193 237 237 237 237 237 237 237 237 237 237 237 237 221 221 221 221 221 221 221 221 204 204 204 204 204 204 204 204 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 1 1 1 107 107 107 107 107 225 225 225 225 225 225 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 53 53 53 53 53 229 229 229 229 229 229 229 229 229 229 229 229 229 229 116 116 116 116 116 116 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 144 144 144 144 144 144 107 107 107 107 107 107 107 107 107 100 100 100 100 100 100 100 100 100 100 100 50 50 50 50 50 227 227 227 227 227 227 227 227 227 227 193 193 193 193 193 193 277 277 277 277 277 277 277 277 277 277 205 205 205 205 205 205 205 205 49 49 49 49 116 116 116 116 47 47 47 47 328 328 328 328 328 328 328 1 1 1 107 107 107 107 107 107 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 287 287 287 287 287 287 287 287 287 287 287 287 21 21 21 21 21 21 21 229 229 229 229 229 229 49 49 49 49 49 280 280 280 280 280 280 280 280 280 280 280 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 233 233 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 50 50 50 227 227 227 227 227 227 227 227 227 227 209 209 209 209 209 209 209 209 220 220 220 220 220 220 220 220 223 223 223 223 223 223 223 223 193 193 193 289 289 289 289 289 49 49 49 49 224 224 224 224 224 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 37 232 232 232 232 232 232 232 179 179 179 179 179 179 179 321 321 321 228 228 228 228 228 228 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 49 49 49 49 233 233 233 233 233 225 225 225 225 225 212 212 212 212 212 212 212 212 212 271 271 271 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 209 209 273 273 273 273 273 273 273 49 49 49 224 224 224 224 224 224 224 224 219 219 219 219 219 219 219 219 219 219 69 69 69 69 69 69 69 69 69 69 225 225 225 225 225 225 116 116 116 116 116 116 116 116 275 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 233 233 233 233 233 233 233 233 233 233 233 117 117 117 117 340 340 340 340 179 179 179 179 179 179 179 179 179 179 53 53 53 53 53 53 53 341 341 341 341 341 341 341 341 341 109 109 109 109 49 49 49 49 49 233 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 279 279 279 279 279 279 279 279 279 249 249 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 236 236 236 236 236 236 236 179 179 179 179 179 179 193 193 193 193 193 340 340 340 340 340 340 223 223 223 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 288 288 288 288 288 288 287 287 287 287 287 287 287 287 287 287 287 149 149 149 149 149 149 149 233 233 233 233 233 49 49 49 49 49 272 272 272 272 272 279 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 116 116 116 116 116 19 19 19 19 19 19 19 232 232 232 232 232 119 119 119 52 52 52 179 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 224 224 224 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 171 209 209 209 209 209 209 209 209 225 225 225 225 225 225 225 225 225 225 116 116 116 116 116 116 1 1 1 107 107 107 107 107 213 213 213 213 213 213 213 213 213 69 69 69 69 69 69 69 69 69 69 69 233 233 233 233 233 233 233 116 116 116 116 119 119 119 52 52 52 52 107 107 107 107 107 107 107 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 277 277 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 113 113 113 113 113 49 49 49 49 49 224 224 224 224 224 224 224 231 231 231 231 231 337 337 337 337 337 337 337 337 320 320 320 320 320 320 119 119 119 119 119 49 49 49 49 288 288 288 288 179 179 179 179 179 179 179 208 208 208 208 208 208 208 208 208 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 288 288 288 288 288 288 288 288 288 1 1 1 107 107 107 107 189 189 189 189 189 189 221 221 221 221 221 221 221 221 221 49 49 49 49 49 49 49 49 49 340 340 340 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 179 179 179 179 179 179 37 37 37 37 116 116 116 179 179 179 179 179 179 179 179 179 179 179 179 149 149 149 149 149 149 149 149 149 116 116 116 179 179 179 179 179 179 193 193 193 228 228 228 228 228 228 228 228 287 287 287 287 287 287 287 287 287 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 271 271 271 271 271 271 271 209 209 209 209 209 209 209 289 289 289 289 289 289 144 144 144 144 144 227 227 227 227 227 227 227 227 227 227 69 69 69 69 69 69 69 277 277 277 277 189 189 189 189 189 189 281 281 281 281 281 281 281 281 281 49 49 49 49 232 232 232 232 232 119 119 119 119 204 204 204 204 204 207 207 207 207 207 207 207 207 207 207 207 207 329 329 329 329 329 329 233 233 233 189 189 189 236 236 236 236 236 236 236 107 107 107 107 107 189 189 189 189 173 173 173 173 173 173 173 173 173 173 173 173 173 69 69 69 69 69 69 69 69 69 69 69 69 69 276 276 276 276 276 276 276 276 276 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 193 193 193 193 225 225 225 225 225 337 337 337 337 337 337 337 337 49 49 49 49 49 228 228 228 228 228 228 228 215 215 215 215 215 215 215 215 164 164 164 164 164 164 164 164 164 164 164 164 164 164 107 107 107 107 107 107 107 225 225 225 225 225 225 133 133 133 133 133 133 133 277 277 277 277 277 277 277 277 277 340 340 340 340 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 69 69 69 69 69 69 69 69 69 69 69 276 276 276 276 276 276 276 276 276 276 276 276 276 276 247 247 247 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 144 144 144 144 144 144 35 35 35 35 288 288 288 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 277 277 277 277 277 229 229 229 229 229 229 49 49 49 117 117 117 117 117 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 37 37 37 37 37 288 288 288 288 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 227 227 227 227 227 227 227 227 133 133 133 133 233 233 233 233 233 233 233 233 288 288 288 287 287 287 287 287 287 287 188 188 188 188 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 179 179 179 179 179 189 189 189 340 340 340 340 340 340 287 287 287 287 287 287 287 287 287 287 287 149 149 149 149 149 149 149 233 233 233 233 233 49 49 49 49 272 272 272 272 272 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 116 116 116 119 119 119 48 48 48 48 231 231 231 231 231 133 133 133 133 133 133 221 221 221 221 221 221 221 281 281 281 288 288 288 288 288 288 39 39 39 39 39 39 39 173 173 173 173 173 173 173 289 289 289 289 289 145 145 145 145 233 233 233 233 233 233 321 321 321 321 321 321 321 321 321 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 289 289 289 289 289 144 144 144 144 144 144 179 179 179 179 179 37 37 37 116 116 116 116 116 35 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 281 281 281 221 221 221 288 288 288 187 187 187 187 228 228 228 228 228 47 47 47 47 47 328 328 328 328 328 328 219 219 219 219 219 219 219 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 277 280 280 280 280 280 280 280 280 280 280 171 171 171 171 171 171 171 171 144 144 144 144 144 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 293 293 293 293 293 293 293 293 109 109 109 109 109 109 145 145 145 145 145 145 145 145 145 145 288 288 288 179 179 179 179 179 179 179 179 179 37 37 37 37 116 116 116 116 116 231 231 231 231 231 231 231 231 231 133 133 133 133 133 133 329 329 329 329 144 144 144 144 144 144 144 107 107 107 107 107 107 107 107 193 193 193 193 232 232 232 232 231 231 231 231 231 231 231 231 231 249 249 249 249 249 249 249 249 249 249 249 249 232 232 232 232 232 287 287 287 287 287 287 287 287 320 320 320 320 327 327 327 327 327 327 327 25 25 25 25 25 25 25 25 225 225 225 225 225 225 49 49 49 49 233 233 233 233 233 289 289 289 289 289 289 289 289 289 289 193 193 193 193 193 276 276 276 276 276 276 276 195 195 195 233 233 233 233 233 173 173 173 173 173 173 173 145 145 145 229 229 229 229 229 229 229 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 49 49 49 232 232 232 47 47 47 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 1 1 1 131 131 131 131 131 131 131 131 131 233 233 233 233 233 233 205 205 205 205 205 205 205 293 293 293 293 293 293 293 293 293 293 197 197 197 197 197 197 236 236 236 236 236 236 236 236 236 236 236 236 236 191 191 191 191 191 232 232 232 179 179 179 179 179 189 189 189 189 189 340 340 340 340 340 340 179 179 179 179 179 249 249 249 249 249 249 249 249 224 224 224 224 224 224 223 223 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 335 335 335 335 335 335 335 335 133 133 133 133 133 133 133 133 133 133 133 133 133 133 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 209 209 209 209 209 209 209 276 276 276 276 276 276 276 331 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 293 293 293 293 293 293 293 293 293 293 109 109 109 109 109 109 145 145 145 145 145 145 145 145 145 145 145 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 288 288 288 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 37 172 172 172 172 172 172 172 172 172 271 271 271 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 291 291 291 291 291 291 291 277 277 277 277 277 277 277 208 208 208 208 208 208 208 208 208 208 208 208 208 19 19 19 19 19 19 19 232 232 232 232 232 119 119 119 119 119 204 204 204 204 204 204 39 39 39 39 39 39 39 39 39 39 173 173 173 173 173 173 289 289 289 289 289 289 145 145 145 145 233 233 233 233 321 321 321 321 321 321 321 321 321 321 321 321 232 232 232 232 232 47 47 47 47 328 328 328 328 328 328 50 50 50 50 107 107 107 107 107 107 107 107 107 107 107 107 107 193 193 193 193 193 193 341 341 341 341 341 341 341 204 204 204 204 204 204 204 204 115 115 115 115 115 115 115 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 271 271 271 271 271 271 271 271 271 225 225 225 225 225 225 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 281 281 281 189 189 189 189 117 117 117 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 115 115 115 115 115 115 115 115 277 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 329 329 329 329 329 189 189 189 189 189 189 236 236 236 236 236 236 236 236 247 247 247 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 144 144 144 144 144 119 119 119 52 52 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 21 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 244 244 47 47 47 47 47 47 233 233 233 233 233 116 116 116 116 116 116 51 51 51 51 51 51 51 272 272 272 272 272 119 119 119 119 119 119 119 119 119 48 48 48 48 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 193 193 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 179 179 179 179 179 193 193 193 193 193 340 340 340 340 340 340 340 107 107 107 107 107 107 107 107 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 321 321 321 321 321 321 321 288 288 288 47 47 47 328 328 328 328 328 328 328 328 219 219 219 219 219 219 219 219 219 225 225 225 225 225 225 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 121 121 121 121 121 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 193 193 193 193 112 112 112 112 112 112 112 112 112 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 340 271 271 271 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 225 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 232 232 271 271 271 271 271 271 271 271 271 271 271 277 277 277 277 321 321 321 321 321 321 321 321 321 321 321 321 172 172 172 172 172 172 172 172 172 119 119 119 119 119 119 49 49 49 288 288 288 179 179 179 179 179 179 179 179 208 208 208 208 208 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 175 175 175 175 175 175 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 47 47 47 47 328 328 328 328 328 328 35 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 49 49 49 49 233 233 233 233 233 233 233 225 225 225 225 225 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 233 233 233 116 116 116 179 179 179 208 208 208 208 208 208 208 208 208 208 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 116 116 119 119 119 48 48 48 48 48 48 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 53 53 53 53 53 53 53 53 177 177 177 177 177 177 204 204 204 204 204 204 204 204 204 204 204 204 35 35 35 233 233 233 116 116 116 119 119 119 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 279 279 69 69 69 69 69 69 277 277 277 277 277 277 49 49 49 49 49 224 224 224 224 224 227 227 227 227 227 227 227 227 227 227 133 133 133 133 133 133 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 331 331 331 331 331 331 331 193 193 193 193 193 112 112 112 112 112 112 112 112 107 107 107 107 107 189 189 189 189 189 289 289 289 289 289 289 289 289 289 289 289 289 289 249 249 249 249 249 249 249 221 221 221 221 221 221 49 49 49 49 49 233 233 233 116 116 116 119 119 119 49 49 49 288 288 288 179 179 179 208 208 208 208 208 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 175 175 175 175 175 175 175 249 249 249 249 249 249 189 189 189 189 189 189 189 236 236 236 236 236 236 236 50 50 50 50 219 219 219 219 219 219 219 49 49 49 49 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 281 281 281 193 193 193 193 117 117 117 117 145 145 145 145 145 145 145 145 49 49 49 49 49 109 109 109 109 49 49 49 224 224 224 224 115 115 115 115 115 115 115 115 115 115 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 289 289 289 289 49 49 49 49 49 49 49 49 49 233 233 233 233 233 233 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 231 231 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 53 53 53 53 53 340 340 340 340 340 340 340 340 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 293 109 109 109 109 109 109 109 145 145 145 145 145 145 145 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 175 175 175 175 175 175 175 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 116 116 331 331 331 331 331 331 331 331 331 331 331 331 331 100 100 100 100 100 100 100 100 100 100 331 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 179 179 179 179 208 208 208 208 208 208 208 208 208 208 175 175 175 175 175 175 175 175 249 249 249 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 119 119 119 119 119 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 116 116 116 116 116 116 191 191 191 191 191 288 288 288 288 288 288 107 107 107 107 107 107 193 193 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 131 131 131 131 131 131 131 131 131 131 131 131 131 233 233 233 233 233 204 204 204 204 204 204 204 204 204 204 204 204 51 51 51 51 51 51 51 51 121 121 121 121 121 144 144 144 144 144 144 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 232 232 232 232 232 187 187 187 187 187 232 232 232 232 232 232 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 329 49 49 49 49 233 233 233 233 233 233 233 233 233 233 225 225 225 225 225 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 193 193 193 193 193 193 281 281 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 115 115 115 115 115 115 115 133 133 133 133 133 133 133 173 173 173 173 173 173 173 173 173 173 173 289 289 289 289 225 225 225 225 204 204 204 204 204 204 271 271 271 271 271 271 271 271 305 305 305 305 305 305 305 289 289 289 289 289 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 119 119 119 119 119 193 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 280 280 280 280 280 35 35 35 35 35 35 35 233 233 233 233 233 233 233 116 116 116 119 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 287 287 287 287 287 49 49 49 49 177 177 177 177 177 177 177 133 133 133 133 133 133 133 133 121 121 121 121 121 121 121 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 179 179 179 179 37 37 37 37 328 328 328 328 328 328 175 175 175 175 175 175 175 193 193 193 193 193 193 329 329 329 329 329 49 49 49 49 49 49 232 232 232 232 232 50 50 50 50 50 50 271 271 271 271 271 271 271 271 271 271 271 277 277 277 277 193 193 193 289 289 289 289 289 204 204 204 204 204 204 204 204 204 175 175 175 175 175 175 305 305 305 305 305 305 305 116 116 116 116 116 116 116 116 175 175 175 175 175 175 175 175 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 35 35 35 35 35 35 340 340 340 340 340 340 340 287 287 287 287 287 48 48 48 48 107 107 107 107 107 107 249 249 249 249 249 249 249 249 249 249 292 292 292 292 292 292 219 219 219 219 219 219 219 333 333 333 133 133 133 133 133 133 281 281 281 281 281 281 281 113 113 113 113 113 113 113 113 113 113 49 49 49 49 49 233 233 233 233 233 233 233 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 53 53 288 288 288 288 288 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 293 293 293 337 337 337 337 337 337 316 316 316 316 316 316 316 279 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 275 275 275 275 275 275 275 275 275 133 133 133 133 133 133 277 277 277 277 277 277 277 277 277 277 225 225 225 225 225 225 204 204 204 204 204 204 204 204 331 331 331 331 331 331 331 331 133 133 133 133 133 133 233 233 233 233 233 233 233 233 288 288 288 288 171 171 171 171 171 171 171 171 145 145 145 145 228 228 228 228 228 228 179 179 179 179 179 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 249 249 249 249 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 49 49 49 49 288 288 288 288 288 191 191 191 191 191 288 288 288 288 227 227 227 227 227 227 227 227 227 227 53 53 53 53 53 53 53 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 107 107 107 107 107 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 229 229 229 229 229 229 229 293 293 293 293 293 293 293 293 189 189 189 236 236 236 236 236 236 236 236 236 236 236 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 277 277 277 277 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 281 281 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 35 35 35 233 233 233 233 116 116 116 116 116 47 47 47 47 47 47 47 47 233 233 233 233 233 337 337 337 337 337 337 337 337 337 337 337 321 321 321 321 321 321 321 321 321 321 321 345 345 345 345 345 345 345 333 333 333 333 49 49 49 224 224 224 224 224 331 331 331 331 331 331 193 193 193 193 193 112 112 112 112 112 112 112 112 112 331 331 331 49 49 49 340 340 340 340 340 340 340 340 287 287 287 287 287 287 287 287 287 287 287 165 165 165 165 165 165 165 221 221 221 221 221 221 189 189 189 189 236 236 236 236 236 236 236 179 179 179 179 179 179 179 179 193 193 193 193 193 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 331 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 119 119 119 119 48 48 48 48 283 283 283 283 283 283 283 283 283 283 283 283 283 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 49 49 49 49 49 49 281 281 281 281 281 281 288 288 288 288 288 288 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 232 232 232 232 232 47 47 47 47 47 47 225 225 225 225 225 225 225 225 225 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 328 328 328 328 328 328 35 35 35 233 233 233 116 116 116 116 179 179 179 179 179 179 179 179 179 165 165 165 165 165 165 165 165 165 165 289 289 289 289 289 289 289 189 189 189 189 116 116 116 287 287 287 287 287 287 48 48 48 48 179 179 179 179 179 179 37 37 37 37 37 37 37 328 328 328 328 328 328 328 328 328 287 287 287 287 287 188 188 188 188 175 175 175 175 175 175 175 248 248 248 248 248 248 248 248 248 248 47 47 47 47 229 229 229 229 229 229 229 53 53 53 53 53 53 236 236 236 236 236 236 236 236 236 279 279 279 279 279 279 289 289 289 289 289 289 289 277 277 277 165 165 165 165 165 165 165 165 165 233 233 233 233 233 233 217 217 217 217 217 217 217 145 145 145 145 145 145 145 145 340 340 340 340 340 340 340 340 340 146 146 146 146 146 146 146 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 131 131 131 131 131 131 131 233 233 233 233 233 204 204 204 204 204 204 204 204 204 271 271 271 271 271 271 271 271 271 225 225 225 225 225 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 280 331 331 331 133 133 133 276 276 276 179 179 179 179 179 179 179 179 179 179 179 208 208 208 208 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 288 288 288 288 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 328 328 328 328 328 328 287 287 287 287 287 287 188 188 188 188 188 287 287 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 69 69 69 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 293 293 337 337 337 337 337 337 337 337 316 316 316 316 316 316 316 316 316 316 316 115 115 115 115 115 115 115 115 115 115 115 277 277 277 277 277 277 133 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 51 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 331 331 331 331 189 189 189 120 120 120 50 50 50 50 50 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 219 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 21 21 21 21 225 225 225 225 225 225 225 225 225 144 144 144 144 144 144 144 144 144 144 47 47 47 47 47 233 233 233 233 116 116 116 115 115 115 115 277 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 329 329 329 329 329 189 189 189 189 236 236 236 236 236 187 187 187 187 232 232 232 50 50 50 50 50 107 107 107 107 107 107 107 107 107 107 53 53 53 53 53 53 53 53 53 177 177 177 177 177 177 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 49 49 49 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 229 229 229 229 229 229 229 229 229 293 293 293 293 293 293 293 293 189 189 189 236 236 236 236 236 236 236 236 236 119 119 119 49 49 49 49 49 49 49 49 288 288 288 288 288 288 115 115 115 115 115 115 193 193 193 193 193 193 117 117 117 49 49 49 49 49 233 233 233 233 233 288 288 288 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 273 273 273 273 273 273 273 49 49 49 49 232 232 232 232 232 232 232 67 67 67 67 67 67 67 67 67 67 173 173 173 173 173 173 173 173 173 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 193 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 271 271 271 271 271 271 271 271 271 271 21 21 21 21 21 21 21 21 21 21 233 233 233 233 233 233 117 117 117 117 117 144 144 144 144 144 144 144 144 131 131 131 131 340 340 340 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 219 219 219 219 219 219 219 219 305 305 305 305 305 116 116 116 116 227 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 220 220 220 220 220 220 220 220 220 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 53 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 189 189 189 189 236 236 236 236 236 236 236 236 236 236 51 51 51 51 51 51 51 51 51 51 51 51 51 328 328 328 328 328 328 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 179 179 179 179 179 179 179 144 144 144 144 144 144 39 39 39 39 39 39 39 39 39 39 39 39 173 173 173 173 173 173 173 289 289 289 289 289 145 145 145 145 233 233 233 233 233 321 321 321 321 321 321 321 321 321 321 321 233 233 233 233 233 233 233 233 340 340 340 340 340 187 187 187 187 187 233 233 233 233 233 233 233 217 217 217 217 217 217 265 265 265 265 265 265 265 265 265 265 265 265 229 229 229 229 229 229 229 229 49 49 49 49 49 233 233 233 233 233 288 288 288 288 288 288 288 288 288 288 331 331 331 331 49 49 49 340 340 340 340 279 279 279 279 279 279 279 279 273 273 273 273 273 273 265 265 265 265 265 265 265 265 265 265 265 265 265 265 225 225 225 225 225 225 225 225 225 225 225 225 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 224 224 224 224 224 224 224 224 224 224 215 215 215 215 215 215 189 189 189 189 189 189 189 189 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 133 133 133 133 133 133 272 272 272 272 272 272 272 272 272 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 144 144 144 144 144 287 287 287 287 188 188 188 175 175 175 175 175 175 175 175 277 277 277 277 277 277 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 175 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 49 49 49 49 225 225 225 225 225 340 340 340 340 340 340 340 35 35 35 35 35 35 35 35 35 35 35 35 173 173 173 173 173 289 289 289 289 289 144 144 144 144 144 144 287 287 287 287 287 287 287 287 287 287 287 287 287 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 47 47 47 47 233 233 233 233 116 116 116 116 116 171 171 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 116 116 116 116 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 288 171 171 171 171 171 145 145 145 145 145 228 228 228 228 228 228 227 227 227 17 17 17 277 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 225 48 48 48 48 48 48 331 331 331 331 331 331 331 133 133 133 133 133 133 276 276 276 276 276 179 179 179 179 179 179 179 179 209 209 209 209 340 340 340 340 340 340 340 340 175 175 175 175 175 175 69 69 69 69 69 69 69 69 69 69 69 232 232 232 232 47 47 47 47 47 233 233 233 116 116 116 116 331 331 331 331 331 331 331 331 331 331 331 331 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 52 52 52 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 121 121 121 121 121 121 204 204 204 204 204 204 331 331 331 331 331 331 331 331 305 305 305 305 229 229 229 229 229 49 49 49 49 232 232 232 232 232 232 232 232 171 171 171 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 49 49 49 225 225 225 204 204 204 204 204 204 219 219 219 219 219 219 219 49 49 49 49 233 233 233 221 221 221 221 221 221 221 221 221 225 225 225 321 321 321 321 321 321 321 321 117 117 117 117 117 189 189 189 189 189 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 115 115 115 115 115 115 53 53 53 53 53 53 53 341 341 341 49 49 49 49 232 232 232 232 232 232 232 232 215 215 215 215 215 215 215 215 215 215 133 133 133 133 133 133 133 233 233 233 233 233 145 145 145 145 145 145 145 49 49 49 49 225 225 225 225 225 225 204 204 204 204 204 204 204 175 175 175 175 175 175 175 248 248 248 248 248 248 248 248 248 287 287 287 287 188 188 188 188 188 188 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 119 119 119 119 189 189 189 189 189 280 280 280 280 280 280 280 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 228 228 228 228 228 228 228 47 47 47 47 328 328 328 328 328 328 335 335 335 335 335 335 193 193 193 193 193 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 179 179 179 179 179 179 179 179 179 208 208 208 208 208 231 231 231 231 231 231 231 231 231 231 231 231 133 133 133 133 133 133 329 329 329 329 329 329 144 144 144 144 144 144 144 327 327 327 327 327 327 327 327 327 193 193 193 193 193 193 341 341 341 341 341 341 341 341 341 189 189 189 189 189 189 189 189 189 289 289 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 172 172 172 172 179 179 179 209 209 209 209 209 209 116 116 116 116 116 116 116 275 275 275 275 275 275 53 53 53 53 53 53 232 232 232 232 232 83 83 83 83 83 83 83 83 83 83 288 288 288 288 47 47 47 328 328 328 328 328 328 287 287 287 287 287 287 287 287 287 287 287 287 149 149 149 149 149 149 233 233 233 233 233 49 49 49 49 49 272 272 272 272 279 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 209 116 116 116 179 179 179 179 179 179 208 208 208 208 208 208 331 331 331 331 331 331 331 305 305 305 305 305 117 117 117 49 49 49 49 49 233 233 233 233 288 288 288 115 115 115 277 277 277 277 277 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 51 51 51 51 51 51 51 51 272 272 272 272 272 47 47 47 47 233 233 233 116 116 116 287 287 287 287 287 287 287 287 165 165 165 165 165 165 165 220 220 220 220 220 220 220 119 119 119 119 52 52 52 52 107 107 107 107 107 107 107 107 107 107 53 53 53 53 53 53 53 177 177 177 177 177 177 204 204 204 204 204 204 204 204 204 287 287 287 287 287 188 188 188 188 175 175 175 175 175 175 248 248 248 248 248 248 248 248 248 248 248 171 171 171 171 171 171 171 171 171 144 144 144 144 227 227 227 227 227 227 227 227 69 69 69 69 69 69 69 69 69 69 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 335 133 133 133 133 133 133 288 288 288 288 288 288 288 279 279 279 279 279 279 53 53 53 229 229 229 229 229 229 293 293 293 293 293 293 189 189 189 189 236 236 236 236 236 236 227 227 227 227 227 227 227 227 227 227 227 227 53 53 53 53 53 53 53 281 281 281 281 281 281 288 288 288 179 179 179 37 37 37 328 328 328 328 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 273 273 273 273 273 273 49 49 49 49 49 233 233 233 116 116 116 116 116 279 279 279 279 279 279 279 279 279 193 193 193 193 233 233 233 233 233 280 280 280 280 280 280 280 280 223 223 223 223 223 223 223 37 37 37 37 37 37 37 37 37 37 280 280 280 280 280 280 280 280 280 280 280 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 287 287 287 287 48 48 48 48 279 279 279 279 279 279 279 289 289 289 289 289 289 21 21 21 21 21 277 277 277 277 277 288 288 288 288 179 179 179 179 179 179 179 193 193 193 193 228 228 228 228 228 228 228 228 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 228 228 228 228 228 228 228 219 219 219 219 219 219 219 219 219 219 225 225 225 225 225 209 209 209 209 209 209 209 209 232 232 232 232 232 232 271 271 271 271 271 271 53 53 53 53 53 53 53 53 53 341 341 341 341 49 49 49 49 49 225 225 225 225 225 225 225 225 225 116 116 116 119 119 119 119 37 37 37 37 37 37 37 289 289 289 289 289 280 280 280 280 280 331 331 331 331 331 53 53 53 53 53 53 53 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 102 102 102 102 102 102 102 102 331 331 331 331 331 331 331 331 331 331 331 249 249 249 249 249 249 249 249 233 233 233 288 288 288 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 50 50 50 50 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 193 193 193 233 233 233 233 233 49 49 49 49 49 289 289 289 289 289 280 280 280 280 280 280 280 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 280 280 280 280 280 280 47 47 47 47 328 328 328 328 328 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 233 233 233 116 116 116 116 146 146 146 146 146 146 219 219 219 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 21 233 233 233 233 233 233 233 285 285 285 285 285 285 285 49 49 49 49 49 233 233 233 233 233 233 233 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 233 233 233 233 233 289 289 289 289 289 289 289 193 193 193 193 193 224 224 224 224 224 224 224 102 102 102 102 102 102 102 102 102 231 231 231 231 231 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 248 331 331 331 331 331 331 331 53 53 53 288 288 288 179 179 179 37 37 37 340 340 340 340 340 340 340 340 340 287 287 287 287 287 287 287 165 165 165 165 165 165 165 221 221 221 221 221 49 49 49 49 49 232 232 232 232 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 337 337 337 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 293 293 293 293 293 293 293 109 109 109 109 109 109 145 145 145 145 145 145 145 288 288 288 288 288 288 288 288 288 288 288 83 83 83 83 83 83 83 83 288 288 288 288 288 288 47 47 47 328 328 328 328 328 328 328 35 35 35 35 35 35 35 35 35 329 329 329 329 329 49 49 49 233 233 233 233 233 233 225 225 225 225 225 212 212 212 212 212 212 212 212 212 287 287 287 287 287 287 49 49 49 117 117 117 117 117 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 221 221 221 221 221 221 221 221 221 69 69 69 69 69 69 277 277 277 277 117 117 117 117 189 189 189 237 237 237 237 237 237 237 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 173 173 173 173 173 289 289 289 289 144 144 144 144 144 144 287 287 287 287 287 287 287 287 287 287 287 287 287 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 224 224 224 224 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 288 288 288 288 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 179 179 179 179 37 37 37 37 116 116 116 231 231 231 231 231 21 21 21 21 21 21 21 288 288 288 288 288 288 288 288 171 171 171 171 171 21 21 21 21 21 276 276 276 276 276 276 276 287 287 287 287 287 188 188 188 188 175 175 175 175 175 175 175 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 48 48 48 48 48 107 107 107 107 107 107 107 107 107 193 193 193 193 193 193 193 193 193 193 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 1 1 1 1 1 1 1 1 275 275 275 275 275 275 275 275 37 37 37 37 37 37 37 37 37 37 37 229 229 229 229 229 229 229 229 229 109 109 109 109 225 225 225 225 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 67 67 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 277 113 113 113 113 113 113 113 113 113 113 145 145 145 145 116 116 116 127 127 127 229 229 229 229 229 229 229 229 229 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 145 145 145 145 145 145 116 116 116 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 331 331 331 331 133 133 133 133 276 276 276 276 276 119 119 119 119 48 48 48 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 193 193 329 329 329 329 329 329 329 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 50 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 221 221 221 221 221 221 37 37 37 37 37 37 37 37 37 37 37 37 37 37 233 233 233 233 288 288 288 288 288 288 288 219 219 219 219 219 219 219 219 219 219 219 219 333 333 333 333 69 69 69 69 277 277 277 277 289 289 289 289 144 144 144 144 144 144 144 144 47 47 47 47 328 328 328 328 328 328 50 50 50 50 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 224 224 224 224 224 224 224 224 51 51 51 51 51 272 272 272 272 272 119 119 119 119 48 48 48 48 48 48 48 48 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 116 116 116 171 171 171 171 171 171 171 171 171 145 145 145 145 228 228 228 228 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 233 233 233 233 233 233 117 117 117 117 340 340 340 179 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 287 287 287 287 287 287 287 188 188 188 107 107 107 107 208 208 208 208 208 208 283 283 283 283 283 283 283 283 283 283 305 305 305 305 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 52 52 52 52 52 52 52 52 52 223 223 223 223 223 223 223 69 69 69 69 69 69 69 69 69 69 69 236 236 236 236 236 236 236 236 236 236 223 223 223 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 165 116 116 116 116 116 191 191 191 288 288 288 288 288 288 50 50 50 175 175 175 175 175 175 175 175 175 175 305 305 305 305 305 305 116 116 116 116 116 116 116 115 115 115 115 115 115 209 209 209 209 209 209 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 171 149 149 149 149 149 149 149 149 149 149 149 121 121 121 121 121 121 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 109 109 109 109 109 145 145 145 145 145 145 145 145 289 289 289 289 289 280 280 280 280 280 280 280 280 171 171 171 171 171 171 171 21 21 21 21 21 21 21 21 21 21 21 21 21 121 121 121 121 121 121 121 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 340 340 340 340 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 47 47 47 47 47 233 233 233 116 116 116 116 116 279 279 279 279 279 279 279 279 279 101 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 49 49 49 49 49 49 233 233 233 233 233 288 288 288 288 131 131 131 131 340 340 340 340 340 179 179 179 179 179 179 189 189 189 189 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 35 35 35 35 35 35 35 35 35 35 35 173 173 173 173 173 173 289 289 289 289 289 144 144 144 144 144 179 179 179 179 179 179 193 193 193 193 193 193 193 193 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 37 37 37 116 116 116 116 116 175 175 175 175 175 175 175 175 21 21 21 21 21 21 21 21 288 288 288 288 288 131 131 131 340 340 340 340 340 340 340 340 340 340 340 340 171 171 171 171 171 171 171 171 171 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 276 276 276 276 276 276 47 47 47 47 47 47 47 333 333 333 333 333 333 333 333 164 164 164 164 164 164 164 164 164 164 164 131 131 131 131 340 340 340 340 340 179 179 179 179 208 208 208 208 208 208 271 271 271 271 271 271 271 21 21 21 21 21 21 21 21 21 21 281 281 281 281 281 281 281 281 281 49 49 49 49 49 109 109 109 109 109 225 225 225 225 225 225 225 204 204 204 204 204 204 219 219 219 219 219 219 219 219 219 305 305 305 305 305 305 305 305 305 305 116 116 116 116 116 116 171 171 171 171 171 171 171 145 145 145 145 145 228 228 228 228 228 228 179 179 179 179 179 189 189 189 340 340 340 340 340 340 340 340 340 340 171 171 171 171 133 133 133 133 133 225 225 225 225 225 225 244 244 244 244 244 244 244 227 227 227 227 227 227 227 227 227 227 133 133 133 133 133 133 133 133 133 133 232 232 232 232 232 232 232 232 232 331 331 331 331 331 331 189 189 189 121 121 121 121 121 85 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 221 221 221 221 221 221 221 221 113 113 113 113 113 113 113 113 113 113 325 325 325 325 325 49 49 49 49 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 275 275 275 275 275 275 275 205 205 205 289 289 289 289 289 289 289 289 289 289 289 277 277 277 277 209 209 209 209 209 209 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 236 187 187 187 187 233 233 233 233 233 289 289 289 289 289 48 48 48 48 119 119 119 119 52 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 305 305 305 305 305 305 117 117 117 117 117 117 117 117 340 340 340 340 340 340 340 340 340 340 340 1 1 1 331 331 331 331 331 133 133 133 133 232 232 232 232 179 179 179 179 179 208 208 208 208 208 208 171 171 171 171 171 171 171 171 171 85 85 85 85 85 85 85 85 85 233 233 233 233 117 117 117 189 189 189 189 116 116 116 179 179 179 193 193 193 193 340 340 340 340 340 340 340 179 179 179 179 179 249 249 249 249 249 249 249 229 229 229 229 229 229 229 229 281 281 281 281 281 281 281 281 289 289 289 289 289 289 289 137 137 137 137 137 137 137 137 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 175 175 175 175 175 175 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 232 232 232 232 232 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 49 49 49 49 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 340 340 107 107 107 107 107 193 193 193 193 193 193 193 193 225 225 225 225 225 225 225 225 225 225 288 288 288 288 288 35 35 35 288 288 288 288 288 119 119 119 119 52 52 52 52 171 171 171 171 171 171 171 171 171 171 171 171 171 149 149 149 149 149 149 149 149 149 149 293 293 293 49 49 49 49 49 49 49 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 131 131 131 131 131 131 131 131 131 216 216 216 216 216 216 216 216 216 216 47 47 47 47 328 328 328 179 179 179 189 189 189 189 340 340 340 340 340 340 340 340 340 219 219 219 219 219 219 219 225 225 225 225 225 193 193 193 193 193 193 277 277 277 277 277 277 277 277 116 116 116 116 116 116 223 223 223 223 223 223 223 223 37 37 37 37 37 37 37 37 37 37 37 37 37 233 233 233 233 233 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 233 233 233 233 233 233 233 116 116 116 119 119 119 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 187 187 187 187 288 288 288 288 288 288 288 288 331 331 331 331 331 53 53 53 53 53 53 53 53 53 53 53 53 340 340 340 340 340 340 340 340 287 287 287 287 287 287 287 48 48 48 48 119 119 119 119 119 189 189 189 189 189 189 280 280 280 280 280 280 280 280 280 115 115 115 115 115 115 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 133 133 133 133 133 133 133 277 277 277 277 277 277 277 277 225 225 225 225 225 204 204 204 204 204 204 327 327 327 327 327 327 327 193 193 193 193 193 193 341 341 341 341 341 341 341 49 49 49 49 109 109 109 109 49 49 49 49 224 224 224 224 224 224 224 224 224 171 171 171 171 171 171 145 145 145 145 145 228 228 228 228 228 119 119 119 52 52 52 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 47 47 47 47 47 47 225 225 225 225 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 236 236 236 236 236 331 331 331 331 331 331 331 193 193 193 193 193 112 112 112 112 112 112 112 112 112 112 112 112 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 119 119 119 119 119 204 204 204 204 204 204 204 204 204 204 51 51 51 51 51 51 121 121 121 121 121 121 121 144 144 144 144 144 144 144 144 144 144 144 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 329 49 49 49 233 233 233 233 225 225 225 225 225 212 212 212 212 212 212 179 179 179 179 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 85 85 85 281 281 281 281 281 281 281 281 189 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 331 331 331 331 331 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 279 279 279 279 279 279 279 279 279 279 279 279 279 279 249 249 249 249 249 249 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 109 109 109 109 109 225 225 225 225 204 204 204 204 204 204 279 279 279 279 279 279 279 279 279 279 193 193 193 113 113 113 113 113 113 113 113 113 113 113 317 317 317 317 317 317 317 169 169 169 169 169 169 169 169 169 169 289 289 289 289 189 189 189 189 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 113 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 115 115 115 115 115 115 115 193 193 193 193 116 116 116 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 288 288 288 288 288 288 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 193 193 193 193 329 329 329 329 329 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 187 187 187 187 232 232 232 232 232 279 279 279 279 279 279 53 53 53 53 53 53 112 112 112 112 112 112 50 50 50 50 50 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 165 165 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 329 329 329 329 329 329 189 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 35 35 35 35 35 35 35 35 35 35 288 288 288 288 288 288 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 289 289 289 289 289 289 280 280 280 280 280 280 280 280 215 215 215 215 215 215 215 53 53 53 53 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 119 119 119 119 37 37 37 37 37 37 37 37 289 289 289 289 289 280 280 280 280 280 280 331 331 331 331 331 331 331 331 53 53 53 53 53 53 53 53 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 131 131 131 340 340 340 340 283 283 283 283 283 283 283 283 283 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 133 133 133 133 133 133 273 273 273 273 273 273 273 288 288 288 288 288 288 47 47 47 47 47 225 225 225 225 225 225 225 225 225 69 69 69 69 69 69 69 236 236 236 236 236 236 236 236 119 119 119 119 52 52 52 52 52 115 115 115 115 115 115 115 115 115 209 209 209 209 209 209 209 209 272 272 272 272 272 272 272 272 275 275 275 275 275 275 275 275 275 275 275 275 275 53 53 53 53 53 53 289 289 289 289 289 289 289 289 189 189 189 189 189 189 116 116 116 116 116 116 116 116 116 116 116 175 175 175 175 175 175 175 277 277 277 277 277 277 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 204 204 204 204 204 204 204 223 223 223 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 69 69 69 69 69 69 69 69 69 277 277 277 277 277 117 117 117 117 117 145 145 145 145 145 145 116 116 116 116 116 116 116 331 331 331 331 189 189 189 120 120 120 120 120 120 120 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 225 225 116 116 116 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 340 340 107 107 107 107 305 305 305 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 49 49 49 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 289 289 289 289 280 280 280 280 280 280 280 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 331 331 331 331 331 331 331 331 53 53 53 53 233 233 233 233 233 233 117 117 117 117 117 144 144 144 144 144 144 144 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 316 316 316 47 47 47 233 233 233 116 116 116 227 227 227 17 17 17 277 277 277 277 277 277 277 277 277 277 193 193 193 193 225 225 225 225 225 225 225 225 225 48 48 48 48 19 19 19 19 19 19 19 19 276 276 276 276 276 276 276 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 249 249 249 249 249 249 249 249 249 249 292 292 292 292 292 292 292 50 50 50 50 50 223 223 223 223 193 193 193 289 289 289 289 289 289 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 116 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 223 223 223 223 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 329 329 329 189 189 189 189 236 236 236 236 236 236 236 47 47 47 47 47 47 333 333 333 333 333 333 333 333 333 333 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 220 220 220 220 220 220 220 220 220 179 179 179 179 179 179 179 209 209 209 209 209 209 209 276 276 276 276 276 276 107 107 107 107 107 107 100 100 100 100 100 100 100 100 100 119 119 119 119 49 49 49 229 229 229 229 229 229 281 281 281 281 281 281 281 281 281 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 225 329 329 329 329 329 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 287 287 287 287 287 287 287 287 287 287 287 277 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 340 340 340 340 340 340 19 19 19 19 19 19 277 277 277 233 233 233 233 288 288 288 288 288 227 227 227 227 227 227 53 53 53 53 53 53 112 112 112 112 112 112 112 112 219 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 229 273 273 273 273 49 49 49 49 233 233 233 233 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 248 248 248 248 248 248 248 248 248 248 115 115 115 115 115 115 193 193 193 193 193 193 193 193 193 276 276 276 276 276 231 231 231 231 231 231 231 231 231 249 249 249 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 340 191 191 191 191 172 172 172 172 172 172 119 119 119 119 119 164 164 164 164 164 164 164 164 164 164 164 331 331 331 331 331 331 331 331 331 331 331 331 148 148 148 148 148 148 148 148 148 148 119 119 119 119 119 133 133 133 277 277 277 277 277 277 277 116 116 116 116 107 107 107 107 204 204 204 204 204 187 187 187 187 187 187 233 233 233 233 233 233 53 53 53 53 53 172 172 172 172 172 172 172 47 47 47 47 328 328 328 328 328 328 328 119 119 119 119 49 49 49 49 49 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 116 116 116 116 116 116 116 275 275 275 275 321 321 321 321 321 293 293 293 293 293 144 144 144 144 144 223 223 223 223 305 305 305 305 220 220 220 220 220 220 35 35 35 288 288 288 288 288 271 271 271 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 209 209 273 273 273 273 273 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 287 287 287 287 287 287 188 188 188 188 107 107 107 107 208 208 208 208 208 208 283 283 283 283 283 283 283 283 283 283 283 305 305 305 305 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 164 164 164 164 164 164 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 228 228 228 228 228 228 228 219 219 219 219 219 219 49 49 49 49 49 233 233 233 233 289 289 289 289 289 289 289 289 133 133 133 133 233 233 233 233 233 289 289 289 289 289 289 49 49 49 49 116 116 116 187 187 187 187 187 233 233 233 233 233 233 233 233 53 53 53 53 53 53 53 53 172 172 172 172 172 172 172 172 172 107 107 107 107 107 53 53 53 53 288 288 288 119 119 119 119 133 133 133 133 232 232 232 232 232 102 102 102 102 102 102 102 102 102 279 279 279 279 279 279 279 279 49 49 49 49 273 273 273 273 273 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 119 119 119 119 133 133 133 276 276 276 276 335 335 335 335 335 335 335 335 335 335 335 335 321 321 321 321 321 321 321 341 341 341 341 341 341 341 341 116 116 116 287 287 287 320 320 320 320 320 320 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 107 107 107 107 107 107 107 107 21 21 21 21 21 21 21 21 21 21 117 117 117 117 204 204 204 204 204 219 219 219 219 219 219 49 49 49 49 49 232 232 232 232 175 175 175 175 175 193 193 193 193 288 288 288 335 335 335 335 335 335 335 321 321 321 321 341 341 341 341 341 341 341 116 116 116 287 287 287 287 320 320 320 320 320 320 320 320 131 131 131 233 233 233 233 233 205 205 205 205 205 293 293 293 293 293 293 293 293 197 197 197 197 197 197 197 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 207 207 207 207 207 207 207 207 207 207 207 207 207 329 329 329 329 329 189 189 189 189 232 232 232 287 287 287 287 188 188 188 107 107 107 107 209 209 209 209 209 189 189 189 189 189 236 236 236 236 236 236 236 236 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 116 116 116 116 116 116 131 131 131 131 131 340 340 340 340 340 340 340 340 340 119 119 119 119 119 204 204 204 204 204 204 204 99 99 99 277 277 277 277 277 277 277 277 277 277 277 189 189 189 189 285 285 285 285 285 285 285 285 285 229 229 229 229 49 49 49 232 232 232 232 232 232 232 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 193 193 193 193 193 193 292 292 292 292 292 292 119 119 119 119 193 193 193 193 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 224 224 224 224 224 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 133 133 133 133 133 133 273 273 273 273 273 273 273 273 273 288 288 288 288 288 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 47 47 47 328 328 328 328 328 119 119 119 52 52 52 52 52 52 223 223 223 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 233 233 233 233 233 233 233 233 289 289 289 289 289 48 48 48 119 119 119 48 48 48 48 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 37 37 221 221 221 221 221 221 221 221 337 337 337 337 337 337 25 25 25 25 25 25 25 25 25 277 277 277 277 277 277 116 116 116 116 47 47 47 328 328 328 328 328 328 328 175 175 175 175 175 175 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 209 232 232 232 232 175 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 49 49 49 225 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 327 327 327 327 327 327 327 327 133 133 133 133 133 133 277 277 277 277 277 277 277 277 204 204 204 204 204 204 204 204 204 204 175 175 175 175 175 175 175 175 175 277 277 277 277 277 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 232 35 35 35 35 35 35 35 35 233 233 233 233 233 116 116 116 116 1 1 1 231 231 231 231 231 231 209 209 209 209 209 209 209 209 209 209 209 209 209 288 288 288 288 288 288 288 35 35 35 35 35 35 35 233 233 233 116 116 116 271 271 271 271 271 277 277 277 277 189 189 189 189 189 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 280 280 280 280 280 280 280 280 280 280 280 331 331 331 331 49 49 49 49 340 340 340 340 340 340 119 119 119 119 119 37 37 37 37 37 37 37 288 288 288 288 335 335 335 335 335 335 335 21 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 288 288 288 288 288 47 47 47 47 109 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 288 19 19 19 19 19 19 19 19 19 232 232 232 232 232 232 331 331 331 331 331 331 331 331 53 53 53 53 53 232 232 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 101 101 101 101 101 101 101 101 101 101 101 101 101 101 116 116 116 116 116 116 116 331 331 331 331 189 189 189 292 292 292 292 292 292 292 175 175 175 175 175 175 175 277 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 288 288 288 288 288 288 288 288 1 1 1 271 271 271 271 271 271 271 271 169 169 169 169 169 169 169 169 289 289 289 289 289 289 289 289 289 277 277 277 277 205 205 205 205 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 221 221 221 221 221 221 221 49 49 49 49 224 224 224 224 224 224 224 224 331 331 331 331 331 331 331 331 193 193 193 193 225 225 225 225 225 225 225 225 225 253 253 253 253 253 253 253 253 253 253 253 253 253 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 119 119 119 204 204 204 204 204 204 204 204 204 204 204 204 51 51 51 51 51 51 51 121 121 121 121 121 121 144 144 144 144 144 144 144 144 144 144 331 331 331 331 331 189 189 189 292 292 292 292 292 292 292 292 271 271 271 271 271 271 271 271 271 271 277 277 277 277 277 193 193 193 193 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 223 223 223 223 223 21 21 21 21 21 21 21 21 229 229 229 229 229 109 109 109 109 109 17 17 17 277 277 277 277 117 117 117 117 205 205 205 205 205 205 205 205 205 205 205 205 205 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 231 21 21 21 21 21 21 288 288 288 288 288 50 50 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 277 277 277 277 277 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 279 279 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 289 193 193 193 193 193 220 220 220 220 220 220 220 220 220 220 220 220 220 231 231 231 231 231 231 69 69 69 69 69 69 276 276 276 276 276 276 276 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 249 249 249 249 249 249 249 249 249 249 249 249 249 249 232 232 232 232 232 232 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 287 287 287 287 48 48 48 107 107 107 107 208 208 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 171 69 69 69 69 276 276 276 276 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 331 331 331 331 331 331 305 305 305 305 116 116 116 179 179 179 179 179 179 179 37 37 37 37 37 328 328 328 328 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 232 232 232 232 191 191 191 191 191 191 191 191 288 288 288 288 288 288 191 191 191 191 191 172 172 172 172 172 172 172 172 172 119 119 119 119 119 119 119 133 133 133 133 133 276 276 276 276 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 116 116 116 116 116 116 116 116 107 107 107 107 107 107 49 49 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 271 271 271 271 271 271 271 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 329 329 329 329 329 49 49 49 49 289 289 289 289 289 289 225 225 225 225 225 225 225 225 204 204 204 204 204 204 204 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 340 47 47 47 47 47 328 328 328 328 328 119 119 119 119 204 204 204 204 204 204 204 47 47 47 47 47 273 273 273 273 273 273 273 273 273 273 273 273 193 193 193 193 233 233 233 233 233 337 337 337 337 337 337 337 49 49 49 49 232 232 232 232 232 232 119 119 119 49 49 49 49 288 288 288 288 288 288 227 227 227 227 17 17 17 277 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 293 293 293 293 293 293 293 109 109 109 109 109 145 145 145 145 145 145 145 145 145 145 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 333 333 333 333 333 133 133 133 133 273 273 273 273 273 273 288 288 288 288 288 288 288 288 288 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 335 335 335 335 335 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 116 116 116 116 247 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 131 131 131 131 131 340 340 340 340 340 340 340 340 340 67 67 67 67 67 67 67 67 67 67 67 67 67 173 173 173 173 173 173 173 173 173 173 49 49 49 49 232 232 232 232 232 131 131 131 131 340 340 340 340 283 283 283 283 283 283 283 283 208 208 208 208 208 208 279 279 279 279 279 279 279 279 333 333 333 333 133 133 133 133 133 273 273 273 273 273 273 288 288 288 179 179 179 179 179 179 179 144 144 144 144 144 179 179 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 53 53 53 53 53 53 53 53 232 232 232 232 232 232 219 219 219 219 219 219 305 305 305 116 116 116 179 179 179 37 37 37 328 328 328 328 328 328 328 207 207 207 207 207 207 207 207 207 207 207 289 289 289 49 49 49 232 232 232 232 232 50 50 50 50 50 227 227 227 227 227 227 227 227 227 227 227 209 209 209 209 209 209 209 209 209 209 209 209 209 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 67 67 67 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 172 119 119 119 119 52 52 52 175 175 175 175 175 277 277 277 277 277 277 85 85 85 85 85 85 85 85 85 85 85 85 85 233 233 233 233 116 116 116 116 116 331 331 331 331 331 331 189 189 189 121 121 121 121 121 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 288 288 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 145 145 145 145 145 109 109 109 109 109 109 109 109 277 277 277 277 193 193 193 229 229 229 229 229 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 119 119 119 52 52 52 52 271 271 271 271 271 271 271 277 277 277 277 49 49 49 49 329 329 329 329 329 149 149 149 149 149 149 149 149 149 149 149 149 149 149 109 109 109 109 109 205 205 205 205 49 49 49 49 49 49 49 49 224 224 224 224 224 271 271 271 271 271 271 271 271 271 271 271 271 271 271 133 133 133 133 133 220 220 220 220 220 220 220 220 47 47 47 47 47 328 328 328 328 328 328 328 115 115 115 115 115 115 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 193 193 193 193 193 193 281 281 281 281 281 281 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 275 275 275 275 275 37 37 37 37 37 37 37 37 37 273 273 273 273 273 273 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 229 229 229 229 229 229 229 21 21 21 21 277 277 277 277 277 277 277 289 289 289 289 289 289 225 225 225 225 225 204 204 204 204 204 204 35 35 35 35 35 288 288 288 119 119 119 119 204 204 204 204 219 219 219 219 219 219 219 219 193 193 193 193 193 113 113 113 113 113 113 113 113 113 49 49 49 49 232 232 232 232 232 232 232 232 115 115 115 115 115 69 69 69 69 69 69 69 69 69 69 69 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 116 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 133 133 133 133 133 133 133 133 273 273 273 273 273 273 288 288 288 288 288 191 191 191 191 232 232 232 232 232 232 232 232 232 331 331 331 331 193 193 193 193 193 232 232 232 232 232 232 232 232 107 107 107 107 107 193 193 193 193 193 117 117 117 117 189 189 189 189 232 232 232 232 232 232 232 287 287 287 287 287 287 188 188 188 188 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 52 52 52 52 52 219 219 219 219 219 219 219 219 219 219 193 193 193 193 193 193 113 113 113 113 113 113 113 113 113 49 49 49 49 49 49 232 232 232 232 232 232 35 35 35 35 288 288 288 288 288 288 288 175 175 175 175 175 175 277 277 277 277 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 175 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 165 165 109 109 109 109 49 49 49 49 225 225 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 331 331 331 49 49 49 340 340 340 340 340 340 340 340 50 50 50 50 50 111 111 111 111 111 111 111 111 111 111 111 193 193 193 193 277 277 277 277 277 173 173 173 173 173 173 49 49 49 49 224 224 224 224 224 47 47 47 47 273 273 273 273 273 273 273 21 21 21 21 21 21 21 277 277 277 277 277 277 277 289 289 289 289 229 229 229 49 49 49 233 233 233 233 233 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 276 276 276 276 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 331 305 305 305 305 116 116 116 116 179 179 179 37 37 37 328 328 328 328 328 328 107 107 107 107 107 107 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 232 111 111 111 111 111 111 111 111 111 111 193 193 193 193 277 277 277 277 277 277 277 277 173 173 173 173 173 173 173 173 173 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 172 172 172 172 172 172 172 191 191 191 191 288 288 288 288 288 179 179 179 37 37 37 116 116 116 116 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 21 21 288 288 288 288 288 288 107 107 107 107 193 193 193 193 232 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 165 165 165 165 165 165 233 233 233 233 233 233 233 233 233 173 173 173 173 173 173 49 49 49 49 225 225 225 225 225 204 204 204 204 204 204 204 204 204 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 225 225 225 225 225 225 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 131 131 131 131 131 340 340 340 340 340 340 340 340 340 340 287 287 287 287 287 188 188 188 188 175 175 175 175 175 175 175 175 193 193 193 193 193 193 328 328 328 328 328 187 187 187 187 187 187 288 288 288 288 288 288 279 279 279 279 279 279 53 53 53 53 229 229 229 229 229 229 229 293 293 293 293 293 189 189 189 189 236 236 236 236 236 236 236 236 236 47 47 47 47 328 328 328 328 328 119 119 119 119 204 204 204 204 204 204 204 47 47 47 47 47 273 273 273 273 273 273 273 273 273 273 273 273 273 273 193 193 193 193 193 277 277 277 277 277 277 277 277 277 277 49 49 49 49 49 49 49 49 49 49 233 233 233 233 233 233 280 280 280 280 280 280 280 280 47 47 47 47 47 328 328 328 328 47 47 47 47 232 232 232 232 232 47 47 47 47 47 47 47 233 233 233 233 233 233 233 337 337 337 337 337 337 337 337 337 337 337 337 337 337 321 321 321 321 321 321 321 321 321 321 321 341 341 341 341 341 341 341 341 116 116 116 116 116 271 271 271 271 271 271 271 271 271 271 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 225 225 225 225 225 225 225 225 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 289 289 289 289 280 280 280 280 280 280 331 331 331 331 331 331 193 193 193 193 193 233 233 233 233 233 233 233 233 117 117 117 117 245 245 245 245 245 245 245 245 245 245 245 245 340 340 340 340 340 340 340 340 223 223 223 223 223 223 305 305 305 305 305 221 221 221 221 221 288 288 288 288 288 1 1 1 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 35 35 35 35 35 35 35 35 35 233 233 233 233 233 116 116 116 116 116 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 291 291 291 291 291 291 291 291 291 277 277 277 277 277 320 320 320 320 119 119 119 119 52 52 52 52 52 52 331 331 331 331 331 331 331 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 331 331 331 331 331 331 331 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 223 223 223 223 223 223 223 305 305 305 305 305 221 221 221 221 221 221 189 189 189 189 189 189 189 236 236 236 236 236 236 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 19 19 19 19 232 232 232 232 232 119 119 119 52 52 52 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 37 37 220 220 220 220 220 220 220 335 335 335 335 335 335 335 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 228 228 228 228 228 228 228 50 50 50 50 50 50 50 171 171 171 171 171 171 171 171 171 171 171 171 225 225 225 225 225 53 53 53 53 53 53 53 53 116 116 116 116 47 47 47 47 47 328 328 328 328 328 328 328 227 227 227 227 227 227 227 227 227 227 227 227 227 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 244 244 244 244 244 244 244 215 215 215 215 215 215 215 215 215 215 215 215 215 215 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 232 232 232 232 232 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 233 233 233 233 233 233 233 225 225 225 225 225 225 105 105 105 105 105 105 105 105 105 105 105 105 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 288 288 288 288 288 119 119 119 119 119 204 204 204 204 204 204 204 204 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 288 331 331 331 331 331 331 331 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 133 133 133 133 133 233 233 233 233 233 233 233 280 280 280 280 280 280 280 335 335 335 335 320 320 320 175 175 175 175 175 175 175 175 175 175 175 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 50 50 50 50 50 50 50 50 175 175 175 175 175 175 175 175 175 225 225 225 225 225 225 225 225 225 193 193 193 229 229 229 229 229 229 229 229 273 273 273 273 280 280 280 280 280 280 280 280 280 47 47 47 47 328 328 328 328 328 328 328 119 119 119 52 52 52 52 107 107 107 107 107 107 107 107 107 225 225 225 225 225 225 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 111 111 111 111 111 111 111 111 111 111 111 111 133 133 133 133 133 277 277 277 277 277 277 277 277 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 277 277 277 277 209 209 209 209 209 209 209 209 209 340 340 340 340 340 340 340 187 187 187 232 232 232 232 232 119 119 119 52 52 52 52 52 223 223 223 223 223 223 133 133 133 133 133 133 133 133 173 173 173 173 173 173 173 288 288 288 288 288 288 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 277 113 113 113 113 113 113 113 113 113 113 145 145 145 145 145 145 145 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 231 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 21 21 21 117 117 117 117 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 236 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 225 225 225 225 225 133 133 133 133 133 233 233 233 233 233 233 233 117 117 117 117 117 144 144 144 144 144 144 144 144 144 107 107 107 107 107 107 107 107 107 149 149 149 149 149 149 149 149 149 149 149 149 113 113 113 113 113 113 113 113 113 113 113 113 189 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 340 115 115 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 187 187 187 232 232 232 119 119 119 52 52 52 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 21 21 21 21 225 225 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 107 107 107 107 107 107 107 107 100 100 100 100 100 100 100 119 119 119 119 119 52 52 52 52 52 107 107 107 107 107 107 107 107 277 277 277 277 277 277 305 305 305 305 305 305 305 305 305 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 340 175 175 175 175 175 175 277 277 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 209 233 233 233 116 116 116 116 116 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 144 144 144 144 144 144 144 107 107 107 107 107 107 107 100 100 100 100 100 100 100 100 100 100 100 100 50 50 50 50 50 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 37 37 37 37 237 237 237 237 237 237 237 237 177 177 177 49 49 49 49 224 224 224 224 224 224 47 47 47 47 47 47 328 328 328 328 327 327 327 327 327 327 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 233 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 209 209 209 209 209 209 276 276 276 276 276 276 276 276 279 279 279 279 279 279 279 279 279 279 279 279 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 227 227 227 227 227 227 17 17 17 17 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 48 48 48 48 48 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 109 109 109 109 109 109 145 145 145 145 145 145 145 145 145 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 133 133 133 133 232 232 232 232 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 279 279 279 279 279 279 279 37 37 37 37 37 37 37 37 288 288 288 288 288 35 35 35 35 288 288 288 288 288 288 288 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 225 225 225 225 225 225 225 225 225 333 333 333 333 333 333 333 333 333 333 333 205 205 205 205 205 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 225 225 225 225 225 101 101 101 101 101 101 101 289 289 289 289 289 289 225 225 225 225 225 204 204 204 204 204 204 115 115 115 115 115 115 189 189 189 189 189 281 281 281 281 281 281 281 289 289 289 289 289 289 277 277 277 53 53 53 53 53 53 281 281 281 281 281 281 289 289 289 173 173 173 49 49 49 49 224 224 224 224 224 47 47 47 328 328 328 279 279 279 279 279 279 279 279 279 53 53 53 53 53 233 233 233 233 233 233 233 233 285 285 285 285 285 285 285 285 105 105 105 105 105 105 105 105 105 105 105 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 179 179 179 179 179 179 179 179 179 209 209 209 209 209 209 209 276 276 276 276 276 276 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 231 231 231 231 231 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 231 231 231 231 231 231 231 193 193 193 193 193 289 289 289 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 119 119 119 52 52 52 52 287 287 287 287 287 287 287 287 165 165 165 165 165 165 165 165 165 165 165 109 109 109 49 49 49 224 224 224 224 224 107 107 107 107 107 189 189 189 189 181 181 181 181 181 181 181 181 181 181 181 181 101 101 101 101 101 101 101 233 233 233 116 116 116 179 179 179 179 179 179 144 144 144 144 144 144 144 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 223 223 223 223 223 165 165 165 165 165 165 165 165 116 116 116 116 116 171 171 171 171 171 171 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 273 273 273 273 273 273 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 189 189 189 189 189 189 189 173 173 173 173 173 173 173 173 173 69 69 69 69 69 276 276 276 276 283 283 283 283 283 283 283 283 283 283 208 208 208 208 179 179 179 179 37 37 37 37 116 116 116 116 116 171 171 171 171 171 171 133 133 133 133 133 277 277 277 277 277 277 277 225 225 225 225 225 225 204 204 204 204 204 204 219 219 219 219 219 219 219 219 225 225 225 225 225 249 249 249 249 249 249 249 249 249 341 341 341 341 341 341 341 116 116 116 119 119 119 52 52 52 52 115 115 115 115 115 69 69 69 69 69 69 69 69 69 69 69 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 133 133 133 133 133 276 276 276 276 276 276 331 331 331 331 331 144 144 144 144 144 144 144 144 291 291 291 291 291 291 291 291 291 291 291 291 277 277 277 277 277 208 208 208 208 208 208 208 208 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 165 165 165 165 165 165 165 165 165 289 289 289 289 289 289 280 280 280 280 280 280 280 223 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 165 165 165 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 119 119 119 119 49 49 49 49 288 288 288 288 288 288 288 227 227 227 227 17 17 17 17 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 225 48 48 48 48 48 227 227 227 227 227 227 227 227 227 53 53 53 53 53 53 281 281 281 281 281 281 288 288 288 107 107 107 107 208 208 208 208 208 187 187 187 187 221 221 221 221 221 221 221 221 281 281 281 281 273 273 273 273 273 273 133 133 133 133 133 221 221 221 221 221 221 221 289 289 289 289 289 189 189 189 236 236 236 236 236 236 236 236 236 236 236 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 228 228 228 228 228 228 331 331 331 331 331 53 53 53 53 232 232 232 232 232 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 249 228 228 228 228 228 228 331 331 331 331 331 189 189 189 292 292 292 292 292 292 292 292 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 287 287 287 287 287 287 287 188 188 188 188 188 287 287 287 287 287 287 287 287 287 287 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 53 53 288 288 288 288 288 288 119 119 119 119 52 52 52 52 52 115 115 115 115 115 115 115 115 115 115 193 193 193 193 285 285 285 285 285 285 285 285 285 285 285 189 189 189 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 331 331 331 331 144 144 144 144 144 144 144 131 131 131 131 131 131 131 131 329 329 329 329 329 329 277 277 277 277 277 205 205 205 205 205 117 117 117 117 117 117 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 115 115 115 115 115 115 115 115 193 193 193 193 193 285 285 285 285 285 285 285 285 285 285 285 189 189 189 189 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 233 233 233 116 116 116 119 119 119 133 133 133 276 276 276 276 276 331 331 331 331 49 49 49 49 340 340 340 340 340 340 247 247 247 247 247 247 247 233 233 233 233 233 233 225 225 225 225 225 204 204 204 204 204 204 204 219 219 219 219 219 219 219 219 219 219 219 219 219 219 277 277 277 277 37 37 37 37 37 37 37 37 37 108 108 108 108 108 35 35 35 35 35 35 35 273 273 273 273 273 273 49 49 49 49 224 224 224 224 224 271 271 271 271 271 277 277 277 277 189 189 189 189 341 341 341 341 341 341 341 341 341 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 329 329 329 329 329 340 340 340 340 340 340 47 47 47 47 47 47 47 233 233 233 233 233 233 233 233 233 116 116 116 116 116 116 331 331 331 331 331 331 331 331 331 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 232 219 219 219 219 219 219 219 219 219 219 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 116 116 116 47 47 47 328 328 328 328 328 219 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 165 165 165 165 165 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 119 119 119 119 119 49 49 49 49 49 49 288 288 288 288 119 119 119 119 119 204 204 204 204 204 204 187 187 187 187 187 221 221 221 221 221 221 221 281 281 281 273 273 273 273 273 133 133 133 133 133 133 221 221 221 221 221 221 289 289 289 289 289 49 49 49 116 116 116 116 116 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 229 229 229 273 273 273 273 273 49 49 49 49 233 233 233 233 233 204 204 204 204 204 204 204 204 219 219 219 219 219 219 219 219 305 305 305 305 305 116 116 116 116 231 231 231 231 231 231 21 21 21 21 21 21 21 21 288 288 288 288 288 107 107 107 107 208 208 208 208 208 208 208 208 208 208 131 131 131 131 131 233 233 233 233 233 233 204 204 204 204 204 204 271 271 271 271 271 271 145 145 145 145 145 289 289 289 289 289 289 289 289 289 289 193 193 193 193 221 221 221 221 221 221 221 337 337 337 337 49 49 49 225 225 225 225 225 144 144 144 144 144 219 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 229 229 229 273 273 273 273 273 49 49 49 49 233 233 233 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 335 335 335 335 133 133 133 133 133 133 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 53 53 53 53 288 288 288 288 47 47 47 47 47 328 328 328 328 328 328 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 337 317 317 317 317 317 340 340 340 340 340 340 340 340 340 340 340 340 340 340 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 21 225 225 225 225 225 225 225 225 225 225 225 225 225 225 144 144 144 144 144 144 144 144 144 144 144 47 47 47 233 233 233 116 116 116 119 119 119 52 52 52 52 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 69 69 69 277 277 277 277 277 277 277 277 277 49 49 49 49 49 224 224 224 224 224 224 224 227 227 227 227 227 227 227 227 227 227 227 227 133 133 133 133 133 133 133 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 331 331 331 331 49 49 49 49 340 340 340 340 340 175 175 175 175 175 175 193 193 193 193 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 236 236 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 133 133 133 133 133 277 277 277 277 277 277 277 277 277 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 115 115 115 115 115 115 115 115 193 193 193 193 193 341 341 341 341 341 341 341 341 341 341 341 204 204 204 204 204 204 204 204 204 331 331 331 331 331 331 331 193 193 193 193 120 120 120 119 119 119 119 189 189 189 189 189 280 280 280 280 280 280 280 280 280 47 47 47 47 233 233 233 233 233 233 233 233 233 337 337 337 337 337 337 337 337 337 337 321 321 321 321 321 321 321 321 321 345 345 345 345 345 345 345 345 345 333 333 333 333 49 49 49 224 224 224 224 224 224 224 227 227 227 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 281 289 289 289 289 289 145 145 145 145 145 145 204 204 204 204 204 47 47 47 47 109 109 109 109 109 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 288 288 219 219 219 219 219 219 219 219 219 219 219 219 219 333 333 333 333 333 101 101 101 101 101 101 101 101 101 101 101 101 101 101 49 49 49 49 49 49 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 233 233 233 233 233 233 233 229 229 229 229 229 229 229 229 229 197 197 197 197 197 281 281 281 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 193 193 193 277 277 277 277 277 205 205 205 205 205 205 205 205 205 205 205 49 49 49 49 49 49 280 280 280 280 280 280 280 280 175 175 175 175 175 277 277 277 277 277 209 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 232 232 175 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 165 165 109 109 109 109 49 49 49 49 225 225 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 175 175 175 175 175 175 305 305 305 305 116 116 116 116 116 207 207 207 207 207 207 207 329 329 329 233 233 233 233 189 189 189 189 236 236 236 236 236 275 275 275 275 275 275 275 165 165 165 165 165 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 17 17 17 17 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 1 1 1 107 107 107 107 107 107 277 277 277 193 193 193 193 193 193 281 281 281 281 281 281 281 221 221 221 221 221 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 189 189 189 189 189 189 280 280 280 280 280 187 187 187 187 340 340 340 340 340 340 340 50 50 50 50 50 50 50 275 275 275 275 275 275 275 275 275 209 209 209 209 209 209 209 209 224 224 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 232 232 232 232 232 232 232 207 207 207 207 207 207 207 207 329 329 329 329 329 329 233 233 233 233 233 189 189 189 189 189 236 236 236 236 236 236 236 236 236 191 191 191 191 341 341 341 49 49 49 233 233 233 288 288 288 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 249 249 249 233 233 233 233 288 288 288 288 335 335 335 320 320 320 279 279 279 279 279 279 279 279 193 193 193 193 193 288 288 288 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 84 84 84 84 84 84 84 84 84 84 84 146 146 146 146 146 146 146 146 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 335 335 335 69 69 69 69 69 69 69 69 276 276 276 276 276 276 171 171 171 171 171 171 171 171 171 249 249 249 249 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 229 229 229 229 229 229 229 229 293 293 293 293 293 293 293 293 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 119 119 119 119 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 171 171 171 171 171 171 171 171 171 69 69 69 276 276 276 276 276 276 223 223 223 223 223 223 223 223 223 37 37 37 37 37 37 37 37 37 37 37 37 220 220 220 220 220 220 220 220 220 220 220 220 220 220 51 51 51 51 51 51 51 51 51 51 51 328 328 328 328 328 328 328 328 328 328 328 328 328 328 131 131 131 131 131 131 131 233 233 233 233 233 233 204 204 204 204 204 204 204 204 204 204 204 204 51 51 51 51 51 51 51 121 121 121 121 121 144 144 144 144 144 144 144 231 231 231 231 231 231 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 228 228 228 228 228 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 107 107 107 107 107 208 208 208 208 208 208 208 219 219 219 219 219 219 219 219 219 219 219 219 69 69 69 69 69 69 69 69 225 225 225 225 225 225 225 116 116 116 116 116 171 171 171 171 171 171 171 171 171 171 171 171 171 277 277 277 133 133 133 133 233 233 233 233 233 233 233 233 285 285 285 285 285 285 285 285 285 285 189 189 189 189 189 189 189 189 189 272 272 272 272 272 272 272 272 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 177 177 177 177 177 177 177 177 341 341 341 341 341 341 341 341 193 193 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 49 49 49 49 49 49 49 49 116 116 116 116 116 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 116 67 67 67 67 67 67 225 225 225 225 225 333 333 333 333 333 333 333 169 169 169 169 169 169 340 340 340 340 340 340 340 340 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 116 187 187 187 187 187 177 177 177 177 177 177 177 341 341 341 341 341 193 193 193 193 193 193 193 281 281 281 281 281 281 289 289 289 289 289 289 49 49 49 49 116 116 116 116 107 107 107 107 107 189 189 189 189 289 289 289 289 289 289 289 289 333 333 333 333 209 209 209 209 209 209 232 232 232 232 227 227 227 227 227 227 17 17 17 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 293 293 293 293 293 293 293 109 109 109 109 109 109 109 109 145 145 145 145 145 145 145 145 288 288 288 288 47 47 47 47 47 233 233 233 116 116 116 227 227 227 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 232 232 232 232 232 232 279 279 279 279 279 279 279 273 273 273 273 273 273 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 51 51 51 51 51 51 51 51 51 51 51 51 51 51 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 276 276 276 276 276 276 271 271 271 271 271 271 271 271 145 145 145 145 145 145 181 181 181 181 181 181 37 37 37 37 37 37 37 273 273 273 273 273 273 273 280 280 280 280 280 280 280 280 280 280 280 107 107 107 107 107 107 189 189 189 189 189 221 221 221 221 221 221 221 221 221 221 221 221 53 53 53 53 53 53 53 53 340 340 340 340 340 340 340 51 51 51 51 51 51 51 51 51 51 51 51 51 51 328 328 328 328 328 328 328 328 328 328 328 328 328 328 328 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 133 133 133 133 276 276 276 276 276 276 276 115 115 115 197 197 197 197 197 281 281 281 281 281 281 281 281 281 197 197 197 197 229 229 229 229 49 49 49 49 49 225 225 225 225 225 225 225 225 37 37 37 37 37 277 277 277 277 277 277 277 277 49 49 49 49 49 289 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 17 17 17 277 277 277 277 277 277 277 277 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 50 50 50 50 50 50 50 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 +291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 232 232 232 232 331 331 331 331 331 331 305 305 305 305 305 305 229 229 229 229 229 229 229 229 49 49 49 49 49 232 232 232 232 232 232 232 331 331 331 331 331 331 331 331 189 189 189 292 292 292 292 292 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 237 237 237 237 237 237 237 237 237 177 177 177 177 49 49 49 49 225 225 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 340 340 35 35 35 35 35 233 233 233 233 116 116 116 116 331 331 331 331 331 189 189 189 121 121 121 121 121 85 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 219 219 219 219 219 219 219 219 219 219 219 219 219 219 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 329 329 329 329 329 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 144 144 144 144 144 115 115 115 115 115 115 115 115 115 115 115 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 220 220 220 220 220 220 220 220 220 179 179 179 179 179 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 116 279 279 279 279 279 279 279 279 279 53 53 53 228 228 228 228 228 228 228 228 228 228 228 175 175 175 175 175 175 175 175 277 277 277 277 277 277 277 164 164 164 164 164 164 164 164 164 164 279 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 277 277 277 277 277 209 209 209 209 209 209 209 209 209 221 221 221 221 221 221 221 280 280 280 280 280 280 280 47 47 47 233 233 233 116 116 116 116 331 331 331 49 49 49 340 340 340 340 340 340 340 340 67 67 67 67 67 67 225 225 225 225 225 333 333 333 333 333 333 333 205 205 205 205 205 340 340 340 340 340 340 340 340 287 287 287 287 287 287 287 287 333 333 333 193 193 193 193 281 281 281 281 281 281 281 289 289 289 289 49 49 49 49 116 116 116 116 116 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 187 187 187 232 232 232 50 50 50 50 50 50 50 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 116 116 116 116 223 223 223 223 193 193 193 193 289 289 289 289 49 49 49 49 224 224 224 224 224 231 231 231 231 231 231 231 231 231 21 21 21 21 21 21 21 21 288 288 288 288 288 288 288 1 1 1 107 107 107 189 189 189 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 101 101 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 233 233 233 233 233 116 116 116 116 116 116 1 1 1 1 1 1 331 331 331 331 331 331 193 193 193 193 292 292 292 292 292 292 292 292 292 292 292 287 287 287 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 144 144 144 144 144 144 144 144 179 179 179 179 179 179 179 179 179 179 179 133 133 133 133 277 277 277 277 277 277 277 277 273 273 273 273 273 273 273 273 273 273 189 189 189 189 189 233 233 233 233 233 233 233 233 340 340 340 340 279 279 279 279 279 279 289 289 289 289 289 289 53 53 53 53 53 53 220 220 220 220 220 220 47 47 47 47 47 177 177 177 177 177 177 177 177 177 177 277 277 277 277 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 281 189 189 189 189 329 329 329 329 329 225 225 225 225 225 225 204 204 204 204 204 204 291 291 291 291 291 291 291 291 291 291 277 277 277 277 277 277 320 320 320 320 320 320 320 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 223 223 223 223 223 223 223 223 305 305 305 305 305 221 221 221 221 221 221 221 288 288 288 288 223 223 223 223 223 223 101 101 101 101 101 101 220 220 220 220 220 220 220 50 50 50 50 50 50 331 331 331 331 331 331 331 331 305 305 305 305 305 229 229 229 229 229 229 229 49 49 49 232 232 232 232 232 47 47 47 47 328 328 328 328 328 231 231 231 231 231 231 231 231 37 37 37 37 37 37 37 37 37 37 277 277 277 277 277 277 277 244 244 244 244 244 244 244 244 244 244 244 187 187 187 187 221 221 221 221 221 221 281 281 281 281 281 281 281 273 273 273 273 273 273 193 193 193 193 193 193 193 277 277 277 277 277 205 205 205 205 205 205 205 205 49 49 49 49 49 233 233 233 233 233 233 280 280 280 280 280 280 47 47 47 233 233 233 116 116 116 116 116 275 275 275 275 275 275 193 193 193 193 217 217 217 217 217 217 217 189 189 189 189 116 116 116 116 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 21 21 21 233 233 233 233 233 233 233 285 285 285 285 285 285 285 285 49 49 49 49 49 49 49 233 233 233 233 233 233 233 233 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 193 193 193 193 193 193 112 112 112 112 112 112 112 112 112 283 283 283 283 283 283 283 283 208 208 208 208 208 208 331 331 331 331 331 331 331 331 69 69 69 69 69 69 69 69 69 69 69 69 69 69 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 288 288 288 288 119 119 119 133 133 133 276 276 276 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 50 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 165 165 165 165 165 165 329 329 329 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 229 229 229 229 229 229 229 293 293 293 293 293 293 293 293 189 189 189 189 236 236 236 236 236 236 47 47 47 47 109 109 109 109 109 109 85 85 85 85 85 85 85 85 85 288 288 288 288 288 179 179 179 179 179 179 179 179 179 179 144 144 144 144 144 144 227 227 227 227 227 227 227 227 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 331 331 331 331 193 193 193 193 193 193 193 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 172 172 172 172 172 172 172 172 172 172 191 191 191 288 288 288 179 179 179 37 37 37 37 116 116 116 116 107 107 107 107 107 107 193 193 193 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 131 131 131 131 131 131 131 131 131 131 131 329 329 329 329 329 329 329 144 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 279 279 279 279 279 279 279 279 279 279 279 279 279 225 225 225 225 225 101 101 101 101 101 101 101 101 289 289 289 289 289 289 225 225 225 225 204 204 204 204 204 115 115 115 115 115 189 189 189 189 189 329 329 329 329 329 329 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 49 49 49 49 49 49 49 273 273 273 273 273 273 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 288 288 288 288 179 179 179 37 37 37 328 328 328 107 107 107 107 107 189 189 189 189 232 232 232 232 232 232 219 219 219 219 219 219 49 49 49 49 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 193 193 193 193 117 117 117 117 117 145 145 145 145 116 116 116 116 116 187 187 187 187 233 233 233 233 233 233 233 233 117 117 117 117 117 117 193 193 193 193 193 221 221 221 221 221 221 221 221 49 49 49 49 289 289 289 289 189 189 189 189 189 189 189 328 328 328 328 328 328 328 47 47 47 47 328 328 328 328 328 50 50 50 50 50 50 279 279 279 279 279 279 279 279 279 133 133 133 133 133 233 233 233 233 233 233 233 280 280 280 280 280 47 47 47 328 328 328 179 179 179 179 179 179 179 179 179 337 337 337 337 321 321 321 321 321 321 229 229 229 229 229 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 148 148 148 148 148 148 148 148 148 148 148 148 67 67 67 67 67 67 67 224 224 224 224 224 271 271 271 271 271 271 271 277 277 277 277 193 193 193 289 289 289 289 204 204 204 204 204 204 331 331 331 331 331 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 116 116 116 116 116 116 116 227 227 227 193 193 193 193 281 281 281 281 281 281 281 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 49 49 49 49 49 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 1 1 1 331 331 331 49 49 49 340 340 340 340 340 340 219 219 219 219 219 219 101 101 101 101 101 101 101 101 233 233 233 116 116 116 47 47 47 328 328 328 328 47 47 47 47 47 47 47 47 173 173 173 173 173 173 173 173 173 277 277 277 165 165 165 165 165 165 165 165 165 165 165 116 116 116 116 335 335 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 149 149 149 233 233 233 288 288 288 288 288 288 1 1 1 119 119 119 119 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 331 331 331 331 331 331 331 331 133 133 133 133 232 232 232 232 232 102 102 102 102 102 102 102 102 279 279 279 279 279 279 279 279 279 279 279 68 68 68 68 68 68 68 68 68 68 68 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 279 279 279 279 279 279 289 289 289 289 289 289 21 21 21 21 277 277 277 277 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 67 67 67 67 67 67 172 172 172 172 172 172 287 287 287 287 287 49 49 49 117 117 117 117 117 117 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 291 291 291 291 291 291 69 69 69 69 69 69 69 69 69 69 288 288 288 288 227 227 227 227 227 165 165 165 165 165 165 165 165 165 109 109 109 109 109 204 204 204 204 204 204 179 179 179 179 179 208 208 208 208 208 208 331 331 331 49 49 49 49 340 340 340 340 340 340 175 175 175 175 175 249 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 236 236 236 236 287 287 287 287 287 48 48 48 48 48 119 119 119 119 52 52 52 115 115 115 115 115 21 21 21 21 21 21 21 21 21 221 221 221 221 221 221 221 221 289 289 289 289 289 289 145 145 145 145 145 145 145 145 145 145 145 145 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 145 145 145 145 145 145 145 145 145 193 193 193 193 193 193 225 225 225 225 225 225 225 225 225 49 49 49 49 49 340 340 340 340 340 340 340 340 223 223 223 223 223 223 223 193 193 193 193 193 193 273 273 273 273 273 273 273 273 280 280 280 280 280 280 280 280 280 280 280 280 287 287 287 287 287 287 287 287 287 287 333 333 333 333 333 193 193 193 193 193 193 113 113 113 113 113 113 113 113 113 113 113 113 113 288 288 288 288 288 51 51 51 233 233 233 233 233 117 117 117 117 145 145 145 145 145 281 281 281 281 281 281 281 289 289 289 289 289 37 37 37 37 37 37 37 37 37 37 233 233 233 117 117 117 189 189 189 237 237 237 237 237 237 237 237 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 208 208 208 208 208 208 208 208 208 179 179 179 179 179 37 37 37 37 37 116 116 116 116 187 187 187 187 187 221 221 221 221 221 221 281 281 281 281 281 273 273 273 273 273 133 133 133 133 133 133 221 221 221 221 221 221 221 221 289 289 289 289 289 189 189 189 189 189 116 116 116 116 116 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 49 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 116 231 231 231 231 231 231 231 231 249 249 249 249 249 249 249 249 249 249 249 249 249 249 232 232 232 232 232 119 119 119 119 49 49 49 49 288 288 288 119 119 119 48 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 47 47 47 47 47 328 328 328 328 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 316 316 215 215 215 215 215 215 215 215 215 215 215 215 215 69 69 69 69 69 69 69 69 69 233 233 233 233 233 289 289 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 67 67 67 67 67 67 67 67 67 172 172 172 172 172 172 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 55 55 55 55 55 55 55 55 55 233 233 233 233 49 49 49 49 49 221 221 221 221 221 221 221 221 221 221 221 85 85 85 85 85 85 85 85 85 233 233 233 233 233 289 289 289 289 49 49 49 49 49 109 109 109 109 109 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 305 305 305 305 305 116 116 116 107 107 107 107 107 107 204 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 227 227 227 227 227 227 227 53 53 53 53 53 53 53 53 53 112 112 112 112 112 112 112 171 171 171 171 171 171 171 171 144 144 144 144 179 179 179 179 179 179 144 144 144 144 144 231 231 231 231 231 231 231 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 109 145 145 145 145 145 145 145 145 340 340 340 340 340 340 219 219 219 219 219 219 337 337 337 337 337 309 309 309 277 277 277 277 277 277 277 205 205 205 205 205 205 205 205 205 21 21 21 21 21 21 21 281 281 281 281 281 281 281 281 281 281 281 49 49 49 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 228 228 228 228 228 228 228 228 219 219 219 219 219 219 333 333 333 333 333 333 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 331 331 331 331 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 225 225 225 225 225 121 121 121 121 248 248 248 248 248 248 248 248 248 248 248 248 102 102 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 179 179 179 37 37 37 37 37 116 116 116 116 50 50 50 50 50 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 116 116 116 116 116 179 179 179 179 179 179 179 179 133 133 133 133 117 117 117 117 117 169 169 169 169 169 169 169 169 169 169 220 220 220 220 220 220 335 335 335 335 133 133 133 133 133 133 133 281 281 281 281 281 281 281 289 289 289 289 289 289 145 145 145 145 117 117 117 117 117 168 168 168 168 168 168 168 168 168 168 168 168 168 168 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 316 331 331 331 331 331 331 133 133 133 133 133 233 233 233 233 233 233 288 288 288 287 287 287 287 48 48 48 48 107 107 107 107 107 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 275 275 275 275 275 275 275 193 193 193 193 193 329 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 193 193 193 193 276 276 276 276 276 276 175 175 175 175 175 175 175 133 133 133 133 289 289 289 289 189 189 189 189 189 189 236 236 236 236 236 236 236 236 50 50 50 50 223 223 223 223 223 223 193 193 193 289 289 289 289 49 49 49 224 224 224 224 107 107 107 107 107 107 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 171 171 171 171 171 145 145 145 145 228 228 228 228 47 47 47 232 232 232 232 232 232 232 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 173 173 173 173 173 173 173 49 49 49 232 232 232 232 232 47 47 47 47 47 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 49 49 49 228 228 228 228 228 228 187 187 187 187 232 232 232 232 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 249 249 249 249 249 249 329 329 329 329 48 48 48 48 48 48 279 279 279 279 279 279 279 279 221 221 221 221 221 249 249 249 249 249 249 249 249 249 285 285 285 285 285 285 285 285 285 285 285 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 179 179 179 209 209 209 209 209 340 340 340 340 340 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 19 19 19 19 19 19 19 232 232 232 232 232 232 119 119 119 52 52 52 52 52 287 287 287 287 287 287 287 287 287 287 277 277 277 277 165 165 165 165 165 165 232 232 232 232 232 232 232 232 287 287 287 287 287 287 49 49 49 49 233 233 233 233 233 233 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 187 187 172 172 172 172 172 172 227 227 227 227 17 17 17 277 277 277 277 277 277 277 277 277 277 277 277 193 193 193 193 225 225 225 225 225 225 225 225 48 48 48 48 179 179 179 179 179 179 179 37 37 37 37 116 116 116 116 116 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 1 1 1 119 119 119 49 49 49 288 288 288 288 288 288 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 179 179 179 179 37 37 37 37 116 116 116 116 116 175 175 175 175 175 175 69 69 69 69 69 69 69 69 69 69 232 232 232 232 232 232 287 287 287 287 287 287 287 48 48 48 48 107 107 107 107 107 107 107 107 107 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 275 275 275 275 193 193 193 193 193 193 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 287 287 287 287 287 287 287 48 48 48 48 227 227 227 227 227 227 209 209 209 209 209 209 209 288 288 288 288 50 50 50 50 50 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 41 41 41 41 237 237 237 237 237 237 237 237 237 237 237 177 177 177 177 177 177 145 145 145 145 145 145 145 145 145 145 145 320 320 320 320 320 320 320 320 320 320 320 320 171 171 171 171 171 171 171 145 145 145 145 228 228 228 228 228 228 63 63 63 63 63 63 63 63 281 281 281 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 289 289 289 277 277 277 277 165 165 165 165 165 165 225 225 225 225 225 337 337 337 337 337 337 337 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 49 49 224 224 224 224 224 224 219 219 219 219 219 219 219 219 219 305 305 305 305 305 116 116 116 116 231 231 231 231 231 231 231 21 21 21 21 21 21 21 288 288 288 288 179 179 179 37 37 37 328 328 328 328 328 107 107 107 107 107 107 193 193 193 232 232 232 232 227 227 227 227 227 227 227 227 227 227 227 227 227 69 69 69 69 69 69 69 69 69 69 276 276 276 47 47 47 47 47 47 281 281 281 281 281 281 289 289 289 289 289 289 21 21 21 21 21 21 21 21 21 233 233 233 233 233 189 189 189 189 189 189 189 285 285 285 285 285 285 285 285 285 285 285 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 35 35 35 35 35 35 35 35 35 35 35 221 221 221 221 221 285 285 285 285 285 285 49 49 49 49 49 49 49 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 277 277 277 193 193 193 221 221 221 221 221 221 221 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 115 115 115 115 115 115 115 115 115 53 53 53 53 53 53 53 53 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 171 171 171 171 171 171 171 171 171 144 144 144 144 144 144 171 171 171 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 328 328 328 328 328 328 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 221 221 221 221 221 221 221 221 221 49 49 49 49 233 233 233 233 233 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 288 288 288 288 288 288 288 331 331 331 331 331 331 49 49 49 49 49 340 340 340 340 340 340 340 340 340 340 1 1 1 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 119 119 119 49 49 49 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 227 227 227 17 17 17 277 277 277 277 193 193 193 193 193 193 193 193 225 225 225 48 48 48 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 69 69 69 69 69 69 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 165 165 165 165 165 165 221 221 221 221 221 221 221 221 189 189 189 189 189 236 236 236 236 236 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 53 53 53 53 53 232 232 232 232 232 47 47 47 328 328 328 328 328 179 179 179 179 179 179 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 53 53 53 288 288 288 288 288 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 113 49 49 49 49 49 49 49 49 224 224 224 224 224 224 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 340 340 340 340 340 67 67 67 67 67 67 225 225 225 225 225 229 229 229 229 229 229 253 253 253 253 253 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 171 171 171 171 171 171 171 171 69 69 69 69 69 69 277 277 277 277 277 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 288 288 288 287 287 287 287 48 48 48 48 48 279 279 279 279 279 279 279 279 279 49 49 49 49 273 273 273 273 273 273 273 249 249 249 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 340 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 19 19 19 19 19 19 19 19 19 19 276 276 276 276 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 320 320 187 187 187 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 147 147 147 147 147 147 147 147 147 147 147 147 147 147 233 233 233 233 233 189 189 189 189 189 189 189 189 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 288 227 227 227 227 17 17 17 277 277 277 277 277 277 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 115 115 115 115 115 189 189 189 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 233 233 233 117 117 117 117 117 189 189 189 116 116 116 116 1 1 1 331 331 331 193 193 193 232 232 232 232 232 232 232 232 327 327 327 327 327 327 327 265 265 265 265 265 265 265 265 265 265 265 265 280 280 280 280 280 280 280 280 280 280 280 280 280 280 275 275 275 189 189 189 189 289 289 289 289 289 289 289 289 289 289 289 149 149 149 149 149 149 149 149 149 149 233 233 233 233 233 233 116 116 116 287 287 287 287 48 48 48 48 179 179 179 179 179 179 179 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 133 133 133 133 280 280 280 280 280 280 280 47 47 47 328 328 328 328 219 219 219 219 219 219 219 219 219 219 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 133 133 133 133 133 116 116 116 116 116 227 227 227 227 227 17 17 17 277 277 277 277 277 277 277 277 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 340 340 340 340 340 340 340 340 187 187 187 187 187 187 172 172 172 172 172 172 175 175 175 175 175 175 175 175 133 133 133 133 289 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 107 107 107 107 107 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 340 340 340 340 340 340 340 171 171 171 171 171 171 145 145 145 145 228 228 228 228 228 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 173 173 173 173 173 173 173 49 49 49 49 232 232 232 232 47 47 47 47 47 47 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 225 225 225 225 49 49 49 49 229 229 229 229 229 229 229 340 340 340 340 340 187 187 187 187 187 232 232 232 231 231 231 231 231 231 231 231 231 249 249 249 249 249 249 329 329 329 329 329 48 48 48 48 48 279 279 279 279 279 279 279 221 221 221 221 221 221 221 249 249 249 249 249 249 249 249 285 285 285 285 285 285 285 285 285 285 48 48 48 48 48 48 331 331 331 331 331 331 144 144 144 144 144 144 271 271 271 271 271 271 271 271 271 21 21 21 21 21 21 21 277 277 277 277 277 288 288 288 288 47 47 47 47 328 328 328 119 119 119 119 119 204 204 204 204 335 335 335 335 335 335 335 335 335 335 321 321 321 321 321 321 321 321 321 321 321 345 345 345 345 345 345 345 345 345 317 317 317 317 49 49 49 224 224 224 224 224 224 279 279 279 279 279 279 279 279 279 279 273 273 273 273 273 273 277 277 277 193 193 193 193 193 193 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 149 149 149 149 220 220 220 220 220 220 220 19 19 19 19 19 19 19 232 232 232 232 232 232 232 232 232 131 131 131 131 131 131 131 233 233 233 233 233 233 204 204 204 204 204 204 204 204 204 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 275 275 275 275 275 275 275 133 133 133 133 177 177 177 177 177 177 177 337 337 337 337 337 49 49 49 49 225 225 225 225 225 169 169 169 169 169 169 289 289 289 289 289 189 189 189 189 116 116 116 116 116 35 35 35 35 35 35 35 35 35 35 35 35 35 329 329 329 329 329 329 49 49 49 233 233 233 233 233 233 225 225 225 225 212 212 212 212 212 212 212 212 212 171 171 171 171 171 171 171 171 171 171 171 171 171 171 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 233 233 233 233 233 281 281 281 281 281 281 281 289 289 289 289 289 289 133 133 133 133 133 116 116 116 116 47 47 47 328 328 328 328 328 107 107 107 107 107 107 209 209 209 209 209 189 189 189 189 189 236 236 236 236 236 236 35 35 35 232 232 232 232 232 232 47 47 47 47 47 47 47 47 47 47 233 233 233 233 233 233 181 181 181 181 181 181 181 181 181 181 181 181 181 149 149 149 149 149 149 149 149 149 149 116 116 116 116 116 116 51 51 51 51 51 51 51 51 51 51 328 328 328 328 328 328 195 195 195 233 233 233 233 233 49 49 49 49 49 329 329 329 329 329 165 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 113 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 224 171 171 171 171 171 171 171 171 171 171 133 133 133 133 133 225 225 225 225 225 225 225 225 225 288 288 288 288 119 119 119 119 49 49 49 288 288 288 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 116 116 116 116 116 116 275 275 275 205 205 205 205 205 281 281 281 281 281 281 281 281 281 281 281 281 281 281 209 209 209 209 209 209 209 209 209 209 209 209 209 329 329 329 329 329 116 116 116 116 116 50 50 50 50 50 50 50 50 50 50 50 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 49 49 49 49 49 329 329 329 329 329 329 329 193 193 193 193 193 193 193 193 193 193 193 193 193 276 276 276 276 276 276 276 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 133 133 133 133 133 133 233 233 233 233 233 233 233 233 289 289 289 289 289 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 215 215 215 215 215 215 215 215 215 215 249 249 249 249 249 249 249 249 225 225 225 225 225 225 225 225 225 225 225 225 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 291 291 291 291 291 291 291 291 291 69 69 69 69 69 69 69 69 69 69 288 288 288 288 288 288 288 288 288 187 187 187 187 232 232 232 232 232 135 135 135 135 221 221 221 221 221 221 221 221 281 281 281 281 281 281 221 221 221 221 225 225 225 225 49 49 49 229 229 229 229 229 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 49 232 232 232 232 232 232 232 271 271 271 271 271 271 271 265 265 265 265 265 265 265 265 265 265 265 265 265 265 233 233 233 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 17 17 17 277 277 277 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 48 35 35 35 233 233 233 233 233 233 116 116 116 116 116 116 116 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 53 293 293 293 293 293 109 109 109 109 109 109 145 145 145 145 288 288 288 47 47 47 47 328 328 328 328 328 328 328 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 209 209 209 209 209 209 273 273 273 273 273 49 49 49 49 224 224 224 224 224 224 224 47 47 47 47 117 117 117 117 117 21 21 21 21 21 21 21 21 273 273 273 273 289 289 289 289 289 189 189 189 236 236 236 236 236 50 50 50 50 50 50 50 50 50 50 50 1 1 1 1 1 1 1 107 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 277 277 277 53 53 53 228 228 228 47 47 47 232 232 232 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 173 173 173 173 173 173 173 49 49 49 49 232 232 232 47 47 47 47 47 281 281 281 281 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 119 119 119 119 119 52 52 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 149 149 149 225 225 225 225 225 225 225 225 225 225 116 116 116 116 116 331 331 331 331 331 49 49 49 49 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 149 149 149 149 149 149 149 149 289 289 289 289 49 49 49 233 233 233 225 225 225 225 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 287 287 149 149 149 149 149 149 149 233 233 233 233 189 189 189 236 236 236 236 236 236 236 51 51 51 51 51 273 273 273 273 273 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 116 116 116 116 116 116 116 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 331 331 331 331 331 331 305 305 305 305 116 116 116 107 107 107 107 107 208 208 208 208 208 208 208 279 279 279 279 279 49 49 49 49 49 273 273 273 273 273 273 273 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 341 341 341 341 341 341 116 116 116 116 116 116 35 35 35 35 288 288 288 288 231 231 231 231 231 231 231 231 231 231 231 231 231 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 189 189 189 189 236 236 236 236 236 236 236 236 35 35 35 35 35 35 35 35 35 173 173 173 173 289 289 289 289 289 144 144 144 144 119 119 119 119 119 193 193 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 53 53 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 293 293 189 189 189 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 53 53 53 288 288 288 288 288 19 19 19 19 19 19 19 19 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 147 292 292 292 292 292 292 292 271 271 271 271 271 271 305 305 305 305 288 288 288 288 288 279 279 279 279 53 53 53 53 53 53 112 112 112 112 112 50 50 50 50 231 231 231 231 231 231 231 231 231 231 231 231 249 249 249 249 249 249 285 285 285 285 285 285 285 285 285 285 285 49 49 49 232 232 232 232 232 187 187 187 233 233 233 233 289 289 289 289 289 289 48 48 48 335 335 335 69 69 69 69 69 69 69 276 276 276 276 276 179 179 179 179 179 179 179 179 179 179 179 179 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 115 115 115 115 115 189 189 189 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 37 37 37 233 233 233 117 117 117 117 189 189 189 189 116 116 116 116 116 116 116 116 115 115 115 115 197 197 197 281 281 281 281 281 281 281 49 49 49 49 49 49 273 273 273 273 273 273 273 273 277 277 277 277 321 321 321 321 329 329 329 329 329 329 189 189 189 189 237 237 237 237 237 237 237 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 179 179 179 179 179 179 179 179 179 37 37 37 37 116 116 116 116 107 107 107 107 107 107 193 193 193 193 193 232 232 232 232 232 232 232 232 232 115 115 115 115 115 115 115 115 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 331 331 331 331 331 331 331 189 189 189 121 121 121 121 121 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 179 179 179 179 179 179 179 179 179 148 148 148 148 148 148 148 47 47 47 47 117 117 117 329 329 329 329 329 329 329 329 329 101 101 101 101 101 101 101 101 101 101 101 280 280 280 280 280 280 280 280 280 107 107 107 107 107 107 209 209 209 209 189 189 189 189 189 189 236 236 236 236 236 236 236 35 35 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 281 281 281 281 221 221 221 221 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 233 233 116 116 116 116 116 116 227 227 227 227 227 227 227 227 53 53 53 53 53 53 53 53 281 281 281 281 281 281 288 288 288 288 288 271 271 271 271 271 271 271 271 271 271 271 145 145 145 145 145 145 145 173 173 173 173 173 173 173 173 173 173 173 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 280 280 280 280 280 280 280 280 280 280 280 280 107 107 107 107 107 107 204 204 204 204 204 204 115 115 115 115 115 197 197 197 197 197 281 281 281 281 49 49 49 49 273 273 273 273 273 273 273 277 277 277 277 277 321 321 321 321 321 321 321 321 321 321 321 329 329 329 329 329 329 329 329 329 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 331 331 331 331 331 209 209 209 209 209 209 209 209 328 328 328 328 328 107 107 107 107 107 107 193 193 193 193 193 232 232 232 232 232 232 232 232 291 291 291 291 291 291 193 193 193 193 237 237 237 237 237 221 221 221 221 221 221 189 189 189 189 236 236 236 236 236 236 236 47 47 47 47 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 191 191 191 191 288 288 288 288 288 171 171 171 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 228 228 228 228 228 228 228 228 287 287 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 101 101 101 101 101 101 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 331 331 331 331 331 331 193 193 193 193 233 233 233 233 233 289 289 289 289 289 289 289 289 289 144 144 144 187 187 187 187 232 232 232 232 232 232 232 171 171 171 171 171 171 171 171 37 37 37 37 37 37 37 37 37 37 37 37 37 221 221 221 221 221 221 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 275 275 275 275 275 275 275 189 189 189 189 289 289 289 289 289 289 289 289 289 149 149 149 149 149 149 149 149 149 149 233 233 233 233 233 116 116 116 227 227 227 227 227 17 17 17 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 39 39 39 39 39 39 39 39 225 225 225 225 49 49 49 49 49 49 177 177 177 177 177 341 341 341 341 341 341 37 37 37 37 37 37 37 37 233 233 233 233 117 117 117 117 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 273 273 273 273 133 133 133 133 133 133 133 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 144 144 144 144 144 144 144 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 340 51 51 51 51 51 51 272 272 272 272 179 179 179 179 179 179 209 209 209 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 53 53 53 53 232 232 232 232 232 232 115 115 115 115 115 115 164 164 164 164 164 164 164 164 164 107 107 107 107 189 189 189 189 189 173 173 173 173 173 173 173 173 173 69 69 69 276 276 276 276 276 276 219 219 219 219 219 219 219 219 219 277 277 277 277 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 229 229 229 229 229 229 49 49 49 49 49 49 49 49 280 280 280 280 280 280 280 280 280 47 47 47 47 47 233 233 233 116 116 116 116 116 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 116 116 116 116 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 49 49 49 49 340 340 340 340 340 340 175 175 175 175 175 175 249 249 249 249 189 189 189 189 189 189 189 236 236 236 287 287 287 287 287 287 188 188 188 175 175 175 175 175 175 175 133 133 133 133 133 133 288 288 288 166 166 166 166 166 223 223 223 223 193 193 193 289 289 289 289 289 289 289 289 49 49 49 49 224 224 224 224 224 224 224 175 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 171 171 171 171 171 171 171 171 145 145 145 145 228 228 228 228 119 119 119 119 204 204 204 47 47 47 47 47 281 281 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 228 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 144 144 144 144 187 187 187 187 232 232 232 232 232 232 1 1 1 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 191 191 191 191 191 191 191 191 191 232 232 232 232 119 119 119 52 52 52 279 279 279 279 279 279 279 279 279 279 273 273 273 273 273 273 273 273 277 277 277 193 193 193 193 193 193 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 316 47 47 47 233 233 233 116 116 116 116 102 102 102 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 37 37 37 37 37 328 328 328 328 287 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 221 221 221 221 221 221 288 288 288 288 187 187 187 288 288 288 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 67 67 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 172 47 47 47 47 233 233 233 116 116 116 116 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 232 232 232 232 232 232 232 232 232 131 131 131 131 131 131 131 131 329 329 329 329 329 329 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 193 193 193 193 193 233 233 233 233 233 233 233 233 233 233 233 233 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 208 208 208 208 208 291 291 291 291 291 291 291 69 69 69 69 69 69 69 69 69 288 288 288 288 288 331 331 331 331 209 209 209 209 116 116 116 175 175 175 175 175 175 175 133 133 133 133 288 288 288 288 50 50 50 50 50 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 293 293 293 293 293 337 337 337 337 337 316 316 316 316 187 187 187 340 340 340 340 340 340 175 175 175 175 175 175 193 193 193 193 289 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 187 187 187 232 232 232 232 232 232 232 335 335 335 335 335 335 335 335 335 335 193 193 193 193 193 277 277 277 277 277 277 277 277 277 277 340 340 340 340 340 340 335 335 335 335 335 335 320 320 320 320 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 209 209 209 209 209 340 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 193 193 193 193 221 221 221 221 221 221 221 281 281 281 281 281 281 281 281 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 179 179 179 208 208 208 208 208 208 208 208 208 191 191 191 191 191 191 341 341 341 341 341 341 49 49 49 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 279 279 279 279 279 279 279 279 279 279 279 273 273 273 273 273 277 277 277 277 277 277 100 100 100 100 100 100 100 100 100 100 100 100 100 100 131 131 131 131 131 340 340 340 340 340 340 179 179 179 179 208 208 208 208 208 331 331 331 331 331 331 331 331 53 53 53 53 233 233 233 233 233 233 233 280 280 280 280 280 280 280 280 280 331 331 331 331 331 331 331 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 189 189 189 189 340 340 340 340 340 179 179 179 179 179 179 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 277 277 277 288 288 288 288 287 287 287 287 277 277 277 277 277 53 53 53 53 53 109 109 109 109 49 49 49 49 225 225 225 225 225 340 340 340 340 340 340 340 179 179 179 193 193 193 193 228 228 228 228 228 50 50 50 50 50 175 175 175 175 175 175 175 175 305 305 305 305 305 116 116 116 116 116 116 116 116 115 115 115 115 115 115 209 209 209 209 209 209 209 209 209 209 209 209 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 335 335 335 335 335 335 335 320 320 320 320 231 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 179 179 179 179 179 179 179 179 179 84 84 84 84 84 84 84 84 84 115 115 115 115 115 115 115 115 115 115 115 115 115 115 133 133 133 133 133 133 133 281 281 281 281 281 281 281 281 273 273 273 273 273 277 277 277 189 189 189 189 288 288 288 179 179 179 179 179 179 179 21 21 21 21 21 21 21 21 277 277 277 277 277 116 116 116 116 116 187 187 187 187 289 289 289 289 289 280 280 280 280 280 280 175 175 175 175 175 175 21 21 21 21 21 21 21 21 288 288 288 288 287 287 287 287 287 188 188 188 188 188 107 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 287 287 287 188 188 188 175 175 175 175 175 175 175 133 133 133 133 133 133 288 288 288 179 179 179 179 179 179 179 179 179 179 101 101 101 101 101 101 101 101 101 145 145 145 145 145 145 145 145 145 116 116 116 179 179 179 179 179 179 179 179 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 272 272 272 272 272 272 272 272 272 272 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 133 133 133 277 277 277 277 277 340 340 340 340 340 340 231 231 231 231 231 231 133 133 133 133 133 133 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 131 131 131 131 131 131 131 131 131 233 233 233 233 233 205 205 205 205 205 205 205 109 109 109 109 49 49 49 49 49 49 49 117 117 117 117 204 204 204 204 204 204 287 287 287 287 287 188 188 188 107 107 107 107 107 204 204 204 204 204 204 204 204 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 116 116 116 107 107 107 107 53 53 53 53 288 288 288 288 288 119 119 119 119 119 249 249 249 249 249 249 249 249 340 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 321 321 321 321 321 321 321 321 273 273 273 273 273 273 189 189 189 189 189 189 189 189 116 116 116 116 116 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 172 172 172 172 172 172 172 172 172 172 172 172 175 175 175 175 175 277 277 277 277 249 249 249 249 249 249 249 249 232 232 232 232 223 223 223 223 193 193 193 193 289 289 289 49 49 49 49 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 277 277 277 133 133 133 233 233 233 233 233 233 233 233 112 112 112 112 112 112 112 112 112 112 107 107 107 107 107 107 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 131 131 131 340 340 340 340 340 340 279 279 279 279 279 279 279 279 279 321 321 321 321 321 321 321 321 232 232 232 232 131 131 131 131 131 131 131 340 340 340 340 340 340 340 335 335 335 335 335 335 335 320 320 320 320 320 115 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 175 175 175 175 175 175 175 175 193 193 193 193 193 193 288 288 288 288 288 288 288 288 288 288 331 331 331 331 331 331 331 53 53 53 53 232 232 232 232 232 232 232 232 232 107 107 107 107 107 277 277 277 277 249 249 249 249 249 249 249 220 220 220 220 220 220 220 191 191 191 233 233 233 233 289 289 289 289 289 289 316 316 316 335 335 335 305 305 305 305 305 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 331 165 165 165 165 165 165 165 165 165 165 165 165 165 340 340 340 340 340 340 340 47 47 47 47 233 233 233 116 116 116 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 288 288 288 288 288 288 288 288 288 279 279 279 279 279 279 53 53 53 53 53 229 229 229 229 229 229 293 293 293 293 293 293 293 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 209 209 209 209 209 209 340 340 340 340 340 340 340 51 51 51 51 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 47 47 47 47 47 47 233 233 233 116 116 116 116 116 116 67 67 67 67 67 67 67 67 67 67 67 67 172 172 172 172 172 172 287 287 287 287 287 48 48 48 48 119 119 119 119 119 52 52 52 223 223 223 223 223 223 223 223 21 21 21 21 21 21 109 109 109 109 109 109 281 281 281 281 289 289 289 289 289 289 144 144 144 144 219 219 219 219 219 219 219 219 219 219 37 37 37 37 37 37 37 37 37 233 233 233 233 233 145 145 145 145 145 145 145 145 145 145 205 205 205 205 205 205 340 340 340 340 340 340 340 340 340 146 146 146 146 146 146 146 146 146 146 119 119 119 119 119 52 52 52 52 52 279 279 279 279 279 279 279 279 289 289 289 289 289 289 165 165 165 165 165 165 165 165 165 165 165 165 165 289 289 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 288 288 288 171 171 171 171 171 171 171 171 171 171 171 149 149 149 149 149 149 149 149 149 149 149 149 149 149 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 279 279 279 279 279 279 279 49 49 49 49 177 177 177 217 217 217 217 217 217 217 217 133 133 133 133 133 133 281 281 281 281 281 281 281 289 289 289 289 289 189 189 189 116 116 116 116 116 175 175 175 175 175 175 193 193 193 193 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 50 50 50 50 50 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 249 249 249 228 228 228 228 228 228 107 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 107 53 53 53 288 288 288 288 102 102 102 102 102 102 102 102 102 102 102 102 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 116 116 116 116 231 231 231 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 171 171 171 171 171 171 171 171 171 171 225 225 225 225 225 37 37 37 37 37 37 37 37 288 288 288 287 287 287 287 287 287 48 48 48 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 164 164 164 164 164 164 164 227 227 227 227 227 227 164 164 164 164 164 164 164 164 164 164 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 208 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 224 275 275 275 275 275 275 275 275 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 47 47 47 47 47 47 47 47 47 228 228 228 228 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 165 165 165 189 189 189 236 236 236 236 236 236 236 119 119 119 133 133 133 133 276 276 276 276 276 276 276 231 231 231 231 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 288 288 288 288 288 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 223 223 223 223 223 223 223 223 223 223 223 223 53 53 53 53 53 233 233 233 233 233 117 117 117 117 117 49 49 49 49 232 232 232 232 232 232 279 279 279 279 279 279 279 289 289 289 289 289 289 277 277 277 277 209 209 209 209 209 288 288 288 288 288 288 35 35 35 35 35 35 35 277 277 277 277 277 277 277 277 277 277 277 277 49 49 49 49 109 109 109 109 109 340 340 340 340 340 340 340 340 340 171 171 171 171 171 171 144 144 144 144 227 227 227 227 227 227 227 227 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 175 175 175 175 175 175 175 193 193 193 193 193 328 328 328 227 227 227 227 227 227 227 227 227 208 208 208 208 208 208 208 208 50 50 50 50 231 231 231 231 231 231 231 231 231 231 231 165 165 165 165 165 165 165 165 165 165 289 289 289 289 189 189 189 328 328 328 328 328 328 328 328 107 107 107 107 107 107 69 69 69 69 69 69 69 69 277 277 277 277 232 232 232 232 35 35 35 35 35 288 288 288 288 288 288 223 223 223 223 223 223 209 209 209 209 209 209 209 209 209 209 209 209 209 281 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 133 133 133 277 277 277 49 49 49 224 224 224 107 107 107 107 107 204 204 204 204 204 204 204 204 50 50 50 50 50 50 50 50 50 50 275 275 275 275 275 275 275 275 275 275 193 193 193 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 220 220 220 220 220 220 220 231 231 231 231 231 248 248 248 248 248 248 248 227 227 227 227 227 227 227 227 37 37 37 289 289 289 289 289 289 144 144 144 144 144 179 179 179 179 179 179 179 179 179 320 320 320 320 320 320 331 331 331 331 331 208 208 208 208 208 208 208 208 208 175 175 175 175 175 175 175 133 133 133 133 133 133 133 133 133 133 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 288 288 288 288 288 99 99 99 99 99 99 99 224 224 224 224 224 224 224 171 171 171 171 171 171 171 171 171 209 209 209 209 209 209 209 224 224 224 224 224 224 1 1 1 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 341 341 341 341 341 341 341 341 205 205 205 205 205 144 144 144 144 144 144 144 144 187 187 187 187 187 187 232 232 232 227 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 233 233 116 116 116 116 47 47 47 233 233 233 116 116 116 116 116 279 279 279 279 279 279 279 279 279 225 225 225 225 225 209 209 209 209 209 209 209 272 272 272 272 272 279 279 279 279 279 279 279 279 279 279 279 279 85 85 85 85 85 85 85 85 85 85 85 233 233 233 233 233 117 117 117 117 117 144 144 144 144 144 144 35 35 35 35 35 288 288 288 288 288 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 101 101 289 289 289 289 289 289 280 280 280 280 280 187 187 187 187 172 172 172 172 331 331 331 331 208 208 208 175 175 175 175 175 175 175 133 133 133 288 288 288 288 50 50 50 50 107 107 107 107 107 107 107 107 107 107 69 69 69 69 69 69 69 277 277 277 277 277 277 277 232 232 232 219 219 219 219 219 219 219 219 49 49 49 49 233 233 233 233 165 165 165 165 165 165 165 165 165 165 165 117 117 117 117 117 205 205 205 205 205 205 205 49 49 49 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 187 187 187 187 187 187 232 232 232 232 232 119 119 119 119 204 204 204 204 204 204 204 204 204 204 204 131 131 131 131 131 131 131 233 233 233 233 233 233 116 116 116 116 116 331 331 331 331 331 208 208 208 208 208 208 208 115 115 115 115 115 115 197 197 197 197 197 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 117 117 117 117 117 189 189 189 189 189 189 189 116 116 116 116 287 287 287 287 287 320 320 320 320 320 320 320 320 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 281 281 281 220 220 220 220 220 220 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 340 340 340 340 340 279 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 133 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 144 144 144 144 144 144 144 144 144 287 287 287 287 287 188 188 188 188 271 271 271 271 271 271 271 271 193 193 193 193 193 220 220 220 220 220 220 220 51 51 51 51 51 51 51 280 280 280 280 280 280 83 83 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 288 288 331 331 331 331 331 331 331 331 331 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 331 331 331 331 193 193 193 193 193 232 232 232 232 283 283 283 283 283 283 283 283 208 208 208 208 208 208 331 331 331 331 331 331 331 133 133 133 133 133 233 233 233 233 288 288 288 288 288 288 247 247 247 247 247 247 247 247 329 329 329 329 329 329 144 144 144 144 144 144 287 287 287 287 287 188 188 188 175 175 175 175 175 175 175 175 133 133 133 133 133 288 288 288 179 179 179 179 179 179 179 179 179 144 144 144 144 144 144 144 223 223 223 223 223 193 193 193 193 289 289 289 289 289 49 49 49 49 224 224 224 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 208 208 208 208 208 208 179 179 179 179 179 179 179 149 149 149 149 149 149 149 149 149 149 149 116 116 116 116 223 223 223 223 223 223 223 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 331 331 331 331 209 209 209 209 209 209 209 209 220 220 220 220 220 220 283 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 175 175 175 175 175 175 249 249 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 331 331 331 331 331 331 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 233 233 233 233 233 288 288 288 179 179 179 179 179 179 179 179 179 179 144 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 149 149 116 116 116 116 116 107 107 107 107 107 107 100 100 100 100 100 100 100 100 100 100 100 100 275 275 275 275 193 193 193 193 193 113 113 113 113 113 113 113 113 113 145 145 145 116 116 116 116 116 116 116 116 279 279 279 279 273 273 273 273 273 133 133 133 133 133 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 145 145 145 145 340 340 340 340 340 340 340 340 171 171 171 171 171 171 249 249 249 249 249 249 249 249 249 249 249 249 221 221 221 221 221 221 280 280 280 280 280 35 35 35 288 288 288 288 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 277 277 277 277 229 229 229 229 229 229 49 49 49 117 117 117 117 117 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 188 188 188 188 107 107 107 107 107 277 277 277 277 193 193 193 193 236 236 236 236 236 236 51 51 51 51 280 280 280 280 280 280 280 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 279 279 279 229 229 229 229 229 229 21 21 21 21 21 21 21 277 277 277 277 277 277 277 288 288 288 288 288 288 1 1 1 1 1 1 1 223 223 223 223 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 221 221 221 221 221 221 221 221 221 221 221 221 225 225 225 225 225 204 204 204 204 204 204 204 107 107 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 47 47 47 47 328 328 328 328 328 47 47 47 47 47 109 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 287 287 287 287 287 287 287 287 287 287 287 287 133 133 133 133 133 232 232 232 232 232 146 146 146 146 146 146 146 187 187 187 187 187 225 225 225 225 225 225 225 225 133 133 133 133 133 133 133 329 329 329 329 329 329 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 208 208 208 208 208 115 115 115 115 115 197 197 197 197 197 197 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 101 117 117 117 117 117 189 189 189 189 189 189 189 189 116 116 116 116 116 116 119 119 119 119 119 37 37 37 37 37 37 288 288 288 288 288 288 331 331 331 331 305 305 305 116 116 116 107 107 107 107 107 107 204 204 204 204 204 204 204 204 119 119 119 52 52 52 52 107 107 107 107 107 107 107 107 133 133 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 163 163 163 163 163 163 163 163 163 163 163 163 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 225 225 225 225 225 225 225 116 116 116 116 187 187 187 233 233 233 233 233 233 233 53 53 53 53 53 53 53 53 172 172 172 172 172 172 287 287 287 287 287 188 188 188 188 107 107 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 208 47 47 47 47 47 328 328 328 328 328 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 53 228 228 228 228 228 228 228 335 335 335 335 335 335 335 335 335 335 335 321 321 321 321 321 321 321 321 321 280 280 280 280 280 280 280 280 280 280 187 187 187 232 232 232 232 232 232 115 115 115 115 115 115 321 321 321 321 321 321 321 321 321 321 189 189 189 236 236 236 236 236 236 236 236 236 111 111 111 111 111 111 111 111 111 111 111 111 111 69 69 69 69 69 69 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 233 116 116 116 335 335 335 335 335 335 335 335 335 53 53 53 53 53 53 236 236 236 236 236 236 187 187 187 233 233 233 233 53 53 53 53 53 53 172 172 172 172 172 172 287 287 287 48 48 48 107 107 107 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 287 277 277 277 277 277 165 165 165 165 165 165 165 165 165 233 233 233 233 233 116 116 116 116 116 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 271 271 271 271 271 271 271 277 277 277 277 277 277 21 21 21 21 21 21 273 273 273 273 273 273 273 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 208 208 208 208 208 227 227 227 227 227 227 227 227 209 209 209 209 209 209 209 209 232 232 232 232 232 287 287 287 188 188 188 188 175 175 175 175 175 175 193 193 193 193 328 328 328 187 187 187 228 228 228 228 228 228 228 228 50 50 50 50 175 175 175 175 175 175 175 175 175 175 305 305 305 305 305 116 116 116 179 179 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 249 249 228 228 228 228 228 228 228 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 279 279 279 279 279 279 279 279 279 279 221 221 221 221 221 221 321 321 321 321 321 321 321 321 321 225 225 225 225 225 225 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 208 208 208 208 208 179 179 179 179 179 179 37 37 37 37 116 116 116 116 50 50 50 50 287 287 287 287 287 287 287 287 287 287 287 133 133 133 133 133 225 225 225 225 225 49 49 49 49 49 49 177 177 177 277 277 277 277 277 277 41 41 41 41 41 41 41 41 41 228 228 228 228 228 228 228 228 171 171 171 171 171 145 145 145 145 145 228 228 228 228 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 39 39 39 39 39 39 225 225 225 225 225 49 49 49 49 49 177 177 177 177 341 341 341 341 341 341 37 37 37 37 37 37 37 37 233 233 233 233 117 117 117 117 117 144 144 144 144 144 279 279 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 233 233 233 233 233 233 233 281 281 281 281 281 281 281 144 144 144 144 144 144 287 287 287 287 287 287 49 49 49 49 117 117 117 117 117 117 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 52 52 52 52 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 165 165 165 224 224 224 224 224 224 224 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 232 232 232 232 232 232 232 107 107 107 107 107 107 277 277 277 277 277 277 69 69 69 69 69 69 288 288 288 288 288 288 187 187 187 187 187 187 288 288 288 288 288 171 171 171 171 171 145 145 145 145 228 228 228 228 228 119 119 119 52 52 52 52 52 279 279 279 279 279 289 289 289 289 289 289 289 165 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 165 165 165 165 165 165 189 189 189 236 236 236 236 236 236 236 236 236 119 119 119 119 164 164 164 164 164 164 164 164 331 331 331 331 331 331 331 331 144 144 144 144 144 144 219 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 229 229 189 189 189 189 189 236 236 236 236 236 236 236 236 19 19 19 19 19 19 232 232 232 232 119 119 119 52 52 52 52 52 171 171 171 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 101 101 328 328 328 328 291 291 291 291 291 291 291 291 291 291 291 291 149 149 149 149 149 149 117 117 117 117 204 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 287 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 287 287 287 287 287 287 49 49 49 49 233 233 233 233 233 233 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 316 331 331 331 331 331 331 133 133 133 133 133 233 233 233 233 288 288 288 287 287 287 287 48 48 48 48 107 107 107 107 107 107 107 107 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 275 275 275 275 193 193 193 193 193 329 329 329 329 329 329 144 144 144 144 144 287 287 287 287 287 287 287 48 48 48 48 227 227 227 227 227 227 209 209 209 209 209 209 209 209 288 288 288 179 179 179 179 179 179 193 193 193 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 281 189 189 189 189 189 189 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 273 273 273 273 273 133 133 133 133 133 133 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 144 144 144 144 144 144 331 331 331 331 49 49 49 49 224 224 224 224 224 115 115 115 115 115 277 277 277 277 21 21 21 21 21 21 21 272 272 272 272 272 272 187 187 187 187 228 228 228 228 228 228 228 67 67 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 172 172 172 119 119 119 119 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 328 328 328 328 219 219 219 219 219 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 175 175 175 175 175 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 19 19 19 19 19 19 19 19 19 19 232 232 232 232 232 287 287 287 287 287 48 48 48 48 48 48 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 279 279 279 279 279 279 279 37 37 37 37 37 37 37 37 37 37 233 233 233 117 117 117 117 340 340 340 279 279 279 289 289 289 289 289 289 289 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 49 49 49 232 232 232 179 179 179 179 179 179 179 145 145 145 145 145 145 281 281 281 281 281 281 281 281 133 133 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 49 49 49 49 49 224 224 224 224 224 224 271 271 271 271 271 271 271 271 271 271 277 277 277 277 277 101 101 101 101 101 101 101 101 117 117 117 117 117 189 189 189 189 189 116 116 116 116 179 179 179 179 179 179 179 179 145 145 145 145 145 145 145 145 281 281 281 281 281 281 281 281 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 172 172 172 172 172 172 172 19 19 19 232 232 232 232 232 232 232 67 67 67 67 67 67 67 67 67 67 67 225 225 225 225 225 225 225 333 333 333 333 333 333 333 333 205 205 205 205 205 340 340 340 340 279 279 279 279 279 279 279 279 279 273 273 273 273 273 273 209 209 209 209 209 209 221 221 221 221 189 189 189 189 236 236 236 236 236 236 236 179 179 179 179 179 179 179 179 148 148 148 148 148 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 271 271 271 271 271 277 277 277 277 277 49 49 49 49 49 281 281 281 281 281 281 281 281 281 209 209 209 209 209 209 209 117 117 117 117 49 49 49 49 49 116 116 116 116 287 287 287 287 287 188 188 188 188 188 279 279 279 279 279 279 273 273 273 273 273 273 209 209 209 209 209 209 220 220 220 220 220 220 191 191 191 191 191 288 288 288 231 231 231 231 231 231 231 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 329 329 329 329 329 189 189 189 236 236 236 236 236 236 236 236 47 47 47 47 47 47 47 217 217 217 217 217 217 217 217 217 53 53 53 53 53 53 53 53 281 281 281 281 281 281 281 289 289 289 289 289 289 49 49 49 49 49 116 116 116 179 179 179 179 179 179 179 179 144 144 144 144 227 227 227 227 227 227 227 227 227 227 227 133 133 133 133 233 233 233 233 233 233 289 289 289 49 49 49 49 224 224 224 224 224 224 224 224 224 35 35 35 35 35 35 35 35 35 35 289 289 289 289 289 49 49 49 49 49 49 289 289 289 289 289 289 289 289 289 325 325 325 325 325 325 325 325 325 325 116 116 116 287 287 287 287 287 287 188 188 188 188 188 119 119 119 119 189 189 189 189 280 280 280 280 280 280 280 280 280 47 47 47 47 47 229 229 229 229 229 229 229 165 165 165 165 165 165 165 165 165 165 165 165 165 341 341 341 341 341 341 341 341 189 189 189 189 236 236 236 236 236 236 236 236 236 271 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 280 280 280 280 280 280 280 47 47 47 47 328 328 328 328 328 328 231 231 231 231 337 337 337 337 337 337 337 337 321 321 321 321 321 321 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 227 227 227 227 227 227 227 227 227 17 17 17 277 277 277 277 277 277 277 193 193 193 193 193 225 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 224 224 224 224 224 224 224 224 224 224 224 215 215 215 215 215 215 53 53 53 53 53 53 53 281 281 281 281 281 281 281 281 281 288 288 288 287 287 287 287 287 287 287 133 133 133 133 224 224 224 224 224 224 224 224 335 335 335 335 335 335 335 335 320 320 320 320 320 320 320 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 119 119 119 119 49 49 49 49 288 288 288 288 288 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 291 291 291 291 291 291 291 291 291 291 193 193 193 193 237 237 237 237 237 237 237 237 237 220 220 220 220 220 335 335 335 335 335 305 305 305 276 276 276 276 276 276 276 276 276 115 115 115 115 115 115 321 321 321 321 321 321 321 321 321 321 321 189 189 189 189 236 236 236 236 236 236 50 50 50 50 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 289 289 289 289 289 289 289 204 204 204 204 204 204 171 171 171 171 171 171 171 171 171 171 171 171 321 321 321 321 321 321 321 321 321 225 225 225 225 225 225 189 189 189 189 284 284 284 284 284 284 284 284 284 284 284 284 284 284 284 291 291 291 291 193 193 193 193 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 275 275 275 275 275 275 275 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 221 221 221 221 221 221 204 204 204 204 204 204 204 204 291 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 119 119 119 119 37 37 37 37 37 37 37 37 37 37 289 289 289 289 289 280 280 280 280 280 280 280 331 331 331 331 331 331 331 53 53 53 53 53 53 53 53 53 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 335 320 320 320 320 320 115 115 115 115 115 115 249 249 249 249 249 249 249 249 233 233 233 288 288 288 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 331 331 331 331 331 331 331 331 53 53 53 53 53 288 288 288 288 335 335 335 335 305 305 305 305 276 276 276 276 276 276 175 175 175 175 175 175 175 175 133 133 133 133 133 289 289 289 289 289 289 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 335 335 335 335 335 305 305 305 276 276 276 276 276 276 276 276 276 276 107 107 107 107 107 107 107 277 277 277 277 277 193 193 193 193 193 237 237 237 237 237 189 189 189 189 236 236 236 236 236 236 236 236 236 50 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 277 277 277 165 165 165 165 165 165 165 233 233 233 233 233 233 233 216 216 216 216 216 216 216 216 216 216 216 111 111 111 111 111 111 111 111 101 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 116 116 116 116 116 116 187 187 187 187 187 233 233 233 233 233 289 289 289 289 289 289 320 320 320 335 335 335 69 69 69 69 69 69 69 276 276 276 276 276 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 85 85 280 280 280 280 280 280 280 47 47 47 233 233 233 116 116 116 179 179 179 179 249 249 249 249 249 249 249 249 249 249 249 249 249 249 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 116 116 116 335 335 335 335 335 320 320 320 320 320 320 320 115 115 115 115 115 115 115 115 249 249 249 249 249 249 249 249 249 249 249 249 232 232 232 232 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 50 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 279 279 279 279 193 193 193 237 237 237 237 237 237 237 237 237 237 177 177 177 49 49 49 49 224 224 224 224 224 224 224 291 291 291 291 291 291 193 193 193 193 236 236 236 236 236 236 236 47 47 47 47 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 179 179 179 179 179 193 193 193 193 228 228 228 228 228 231 231 231 231 231 231 231 231 69 69 69 69 69 69 276 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 331 53 53 53 53 288 288 288 179 179 179 189 189 189 340 340 340 340 340 340 115 115 115 115 115 197 197 197 197 281 281 281 281 281 281 273 273 273 273 273 49 49 49 49 49 49 341 341 341 341 341 341 193 193 193 193 285 285 285 285 285 285 285 285 285 285 49 49 49 232 232 232 232 187 187 187 187 187 340 340 340 340 340 340 340 340 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 101 101 101 220 220 220 220 220 220 220 220 220 231 231 231 231 231 231 231 231 69 69 69 69 69 69 69 69 276 276 276 276 276 276 276 276 331 331 331 331 331 331 331 331 53 53 53 53 53 53 53 288 288 288 288 288 288 288 279 279 279 279 279 279 69 69 69 69 277 277 277 277 277 288 288 288 47 47 47 47 328 328 328 328 328 328 271 271 271 271 271 271 271 271 271 271 271 271 133 133 133 133 133 277 277 277 277 277 277 277 277 277 277 277 277 49 49 49 49 49 233 233 233 233 289 289 289 289 280 280 280 179 179 179 179 179 208 208 208 208 208 208 208 208 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 231 231 231 69 69 69 69 69 69 69 69 69 69 69 276 276 276 276 276 179 179 179 179 179 179 179 179 84 84 84 84 84 84 84 84 84 84 84 179 179 179 179 179 179 179 179 209 209 209 209 209 209 340 340 340 340 340 340 223 223 223 223 223 223 101 101 101 101 101 101 101 221 221 221 221 221 221 221 225 225 225 225 225 204 204 204 204 204 287 287 287 188 188 188 188 188 287 287 287 287 287 287 287 287 287 149 149 149 149 149 149 149 149 149 232 232 232 232 232 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 331 100 100 100 100 100 100 100 100 100 100 100 100 187 187 187 288 288 288 288 288 331 331 331 331 49 49 49 340 340 340 340 340 340 340 247 247 247 247 247 247 247 247 233 233 233 233 233 233 225 225 225 225 204 204 204 204 204 204 204 204 223 223 223 223 223 223 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 288 288 288 288 288 331 331 331 331 331 209 209 209 209 209 209 209 220 220 220 220 220 220 220 220 102 102 102 102 102 102 102 102 102 102 102 102 102 275 275 275 275 275 275 275 133 133 133 133 116 116 116 116 116 116 187 187 187 187 232 232 232 232 232 119 119 119 52 52 52 271 271 271 271 271 271 271 165 165 165 165 165 165 165 165 165 165 273 273 273 273 273 273 273 273 144 144 144 144 144 144 144 144 144 144 179 179 179 179 179 179 179 179 84 84 84 84 84 84 84 84 84 84 84 84 50 50 50 50 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 232 232 232 232 232 35 35 35 233 233 233 116 116 116 179 179 179 179 179 193 193 193 193 193 193 340 340 340 340 340 340 340 340 340 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 172 172 172 172 172 172 172 172 51 51 51 51 51 51 51 51 51 51 272 272 272 272 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 47 47 47 328 328 328 119 119 119 119 204 204 204 204 204 204 204 99 99 99 99 99 99 99 99 99 99 99 99 225 225 225 225 225 225 225 49 49 49 49 49 233 233 233 233 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 287 287 287 287 287 287 287 287 305 305 305 305 305 305 305 220 220 220 220 50 50 50 50 50 50 50 107 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 47 47 47 47 328 328 328 328 47 47 47 47 232 232 232 232 232 232 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 173 173 173 173 173 173 173 173 49 49 49 49 232 232 232 232 47 47 47 47 47 47 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 35 35 35 35 35 35 35 35 233 233 233 116 116 116 179 179 179 179 179 179 208 208 208 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 288 288 288 288 288 288 171 171 171 171 171 171 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 101 276 276 276 276 276 276 276 276 287 287 287 287 287 188 188 188 119 119 119 52 52 52 52 52 179 179 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 280 280 280 280 280 280 280 280 280 280 35 35 35 35 288 288 288 288 288 288 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 288 288 288 288 288 288 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 19 19 19 19 19 19 19 19 19 19 232 232 232 232 232 232 232 232 232 232 271 271 271 271 271 271 271 271 271 271 149 149 149 149 149 149 149 149 273 273 273 273 273 49 49 49 49 49 49 49 49 280 280 280 280 280 280 280 280 280 227 227 227 227 17 17 17 277 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 231 231 231 231 231 193 193 193 193 193 193 277 277 277 277 277 277 277 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 107 107 107 107 107 107 107 107 107 107 149 149 149 149 149 149 149 149 149 233 233 233 233 233 288 288 288 288 119 119 119 49 49 49 49 49 228 228 228 228 228 287 287 287 287 287 287 287 287 320 320 320 320 320 320 50 50 50 50 50 50 219 219 219 219 219 219 219 219 219 277 277 277 193 193 193 193 281 281 281 281 281 281 281 281 281 272 272 272 272 272 272 187 187 187 187 232 232 232 232 119 119 119 133 133 133 133 276 276 276 276 276 276 276 107 107 107 107 107 133 133 133 133 133 133 133 133 133 117 117 117 117 117 117 117 117 117 117 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 116 102 102 102 102 102 102 102 102 102 102 102 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 47 47 47 47 233 233 233 233 233 233 233 233 233 53 53 53 53 53 121 121 121 121 121 121 144 144 144 144 144 219 219 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 331 331 331 331 133 133 133 133 276 276 276 276 276 276 276 47 47 47 47 232 232 232 232 47 47 47 47 47 47 117 117 117 117 117 21 21 21 21 21 21 21 21 21 21 21 273 273 273 273 289 289 289 289 289 49 49 49 49 49 49 116 116 116 116 116 116 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 335 335 335 335 335 335 335 335 335 335 335 335 321 321 321 321 321 321 321 341 341 341 341 341 341 341 116 116 116 287 287 287 287 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 220 220 220 220 220 220 220 220 220 220 220 220 220 119 119 119 119 119 119 204 204 204 204 204 204 204 204 204 131 131 131 131 131 131 131 131 131 177 177 177 177 177 177 177 177 177 177 177 177 177 177 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 164 164 164 164 164 164 164 164 164 219 219 219 219 219 219 219 219 219 219 219 305 305 305 305 305 305 117 117 117 117 117 49 49 49 49 49 49 233 233 233 233 233 288 288 288 288 107 107 107 107 107 277 277 277 277 165 165 165 165 220 220 220 220 220 220 220 220 179 179 179 193 193 193 193 228 228 228 228 51 51 51 51 51 51 51 328 328 328 328 328 328 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 172 172 172 172 172 172 172 335 335 335 335 335 320 320 320 320 320 320 320 320 179 179 179 179 179 179 179 179 179 179 37 37 37 116 116 116 116 116 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 281 288 288 288 288 288 227 227 227 227 100 100 100 100 100 100 100 100 100 31 31 31 31 31 31 117 117 117 329 329 329 329 329 329 101 101 101 101 101 101 101 101 101 101 101 101 101 101 280 280 280 280 280 280 280 280 280 280 280 187 187 187 232 232 232 119 119 119 52 52 52 227 227 227 227 227 37 37 37 37 37 37 289 289 289 289 289 289 289 289 289 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 193 193 193 193 193 112 112 112 112 112 112 112 112 112 112 112 112 112 335 335 335 335 335 320 320 320 320 320 320 320 115 115 115 115 115 115 115 115 115 193 193 193 193 193 117 117 117 117 49 49 49 49 233 233 233 233 233 233 288 288 288 288 288 288 288 288 288 288 1 1 1 115 115 115 115 115 115 320 320 320 320 320 320 320 320 320 320 320 320 320 227 227 227 227 227 227 227 17 17 17 17 277 277 277 277 277 277 277 193 193 193 193 193 225 225 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 116 116 116 179 179 179 37 37 37 328 328 328 328 328 328 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 69 69 276 276 276 276 276 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 149 149 149 149 149 149 281 281 281 281 281 281 281 281 281 281 281 281 281 205 205 205 205 205 340 340 340 340 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 165 165 165 165 220 220 220 220 220 220 220 231 231 231 231 231 231 231 231 21 21 21 21 21 21 21 288 288 288 288 288 287 287 287 287 287 287 48 48 48 48 291 291 291 291 291 291 291 291 291 291 291 291 291 291 193 193 193 237 237 237 237 237 237 237 220 220 220 220 47 47 47 47 328 328 328 328 328 279 279 279 279 279 279 53 53 53 53 53 53 112 112 112 112 112 50 50 50 50 50 50 50 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 193 236 236 236 236 236 236 236 236 236 236 236 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 289 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 331 331 331 331 331 53 53 53 53 53 53 53 53 53 53 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 119 119 119 119 119 119 193 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 215 215 215 215 215 215 215 215 215 215 215 215 215 215 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 109 109 109 109 109 109 340 340 340 340 340 340 340 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 229 229 229 229 173 173 173 173 145 145 145 145 145 289 289 289 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 209 209 209 229 229 229 229 229 229 116 116 116 116 116 116 116 116 231 231 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 101 101 121 121 121 121 144 144 144 144 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 47 47 47 47 47 47 173 173 173 173 173 173 173 173 173 173 173 173 173 173 133 133 133 133 133 133 133 133 133 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 116 116 231 231 231 231 231 231 69 69 69 69 69 69 276 276 276 276 276 276 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 47 47 47 47 47 47 47 225 225 225 225 225 225 225 225 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 228 228 228 228 228 228 227 227 227 227 227 17 17 17 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 231 231 231 231 231 193 193 193 193 193 193 289 289 289 289 289 189 189 189 189 189 189 116 116 116 116 116 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 133 133 133 133 133 117 117 117 117 49 49 49 49 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 67 67 67 67 67 67 67 67 67 67 67 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 249 249 249 249 249 249 249 249 233 233 233 288 288 288 115 115 115 115 189 189 189 189 189 189 233 233 233 233 233 233 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 119 119 119 119 133 133 133 277 277 277 277 277 340 340 340 340 340 279 279 279 279 279 279 53 53 53 53 53 229 229 229 229 229 229 293 293 293 293 293 293 189 189 189 189 236 236 236 236 236 236 187 187 187 187 232 232 232 232 331 331 331 331 331 331 53 53 53 53 53 288 288 288 288 288 288 288 335 335 335 335 320 320 320 320 320 279 279 279 279 279 279 279 279 279 279 279 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 275 275 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 328 328 328 328 328 328 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 116 116 279 279 279 279 279 279 53 53 53 53 228 228 228 228 228 228 228 228 219 219 219 219 219 219 219 219 333 333 333 333 333 333 21 21 21 21 21 21 21 21 225 225 225 225 229 229 229 229 229 229 229 229 340 340 340 340 340 340 340 340 227 227 227 227 227 227 105 105 105 105 105 105 105 105 281 281 281 281 281 281 281 281 281 281 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 288 288 288 288 288 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 337 337 316 316 316 316 316 316 316 316 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 340 287 287 287 287 287 287 287 287 287 287 133 133 133 133 277 277 277 277 277 277 277 277 49 49 49 49 49 109 109 109 49 49 49 224 224 224 224 224 224 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 288 288 288 288 288 288 288 19 19 19 19 19 19 19 19 232 232 232 232 232 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 219 219 219 219 219 219 219 305 305 305 116 116 116 116 116 116 279 279 279 279 279 279 279 279 279 279 208 208 208 208 208 208 208 208 208 208 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 175 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 328 328 328 328 328 328 328 191 191 191 191 191 191 191 191 191 191 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 289 289 289 289 289 280 280 280 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 225 225 225 225 225 225 225 225 225 117 117 117 117 117 117 49 49 49 49 49 228 228 228 228 228 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 289 289 289 289 289 289 280 280 280 179 179 179 189 189 189 340 340 340 340 340 340 340 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 116 116 116 116 19 19 19 19 19 19 19 19 19 232 232 232 232 232 232 131 131 131 131 233 233 233 233 233 233 205 205 205 205 205 293 293 293 293 293 293 293 293 293 293 293 197 197 197 197 197 236 236 236 236 236 236 236 236 236 236 236 236 119 119 119 119 49 49 49 49 49 49 288 288 288 288 288 288 288 288 288 331 331 331 331 133 133 133 133 133 232 232 232 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 208 115 115 115 115 115 115 115 115 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 340 340 340 340 340 340 340 340 102 102 102 102 102 102 102 102 102 102 102 102 102 67 67 67 67 67 67 225 225 225 225 225 225 333 333 333 333 333 333 205 205 205 205 340 340 340 340 340 340 340 340 340 340 340 171 171 171 171 171 209 209 209 209 209 209 209 209 209 209 224 224 224 224 224 224 187 187 187 187 289 289 289 289 280 280 280 280 280 227 227 227 227 227 227 100 100 100 100 100 100 100 100 100 115 115 115 115 115 115 337 337 337 337 337 321 321 321 321 321 321 321 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 188 188 188 188 175 175 175 175 175 175 175 193 193 193 193 328 328 328 328 191 191 191 191 191 191 191 191 191 191 191 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 116 35 35 35 35 35 35 35 340 340 340 340 340 340 340 340 340 340 340 340 171 171 171 171 171 144 144 144 144 144 144 144 119 119 119 119 52 52 52 52 52 275 275 275 275 275 275 275 275 275 193 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 281 281 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 133 133 133 133 133 277 277 277 277 277 277 277 340 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 193 193 193 193 193 281 281 281 281 281 281 281 281 281 221 221 221 221 221 221 280 280 280 280 280 187 187 187 187 232 232 232 232 232 232 232 232 271 271 271 271 271 271 271 277 277 277 277 193 193 193 289 289 289 204 204 204 204 204 204 231 231 231 231 231 193 193 193 193 193 193 193 193 276 276 276 276 276 276 276 276 131 131 131 131 131 131 131 131 131 131 329 329 329 329 329 329 329 277 277 277 277 205 205 205 205 205 205 205 205 293 293 293 293 293 293 293 293 197 197 197 197 197 197 236 236 236 236 236 236 236 50 50 50 50 50 107 107 107 107 107 107 107 107 107 107 21 21 21 21 21 21 21 21 117 117 117 117 204 204 204 204 204 204 204 204 115 115 115 115 115 115 115 115 53 53 53 53 53 53 53 53 53 53 340 340 340 340 340 340 187 187 187 187 232 232 232 119 119 119 119 189 189 189 189 189 189 280 280 280 280 280 280 280 280 280 280 280 331 331 331 331 331 331 149 149 149 149 149 225 225 225 225 225 225 225 225 225 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 133 133 133 133 133 277 277 277 277 277 277 277 340 340 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 275 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 281 221 221 221 221 221 221 280 280 280 280 280 187 187 187 232 232 232 232 232 232 271 271 271 271 271 271 271 271 209 209 209 209 209 209 209 273 273 273 273 273 49 49 49 225 225 225 225 225 340 340 340 340 340 340 179 179 179 179 179 37 37 37 37 37 37 37 329 329 329 329 189 189 189 189 236 236 236 236 236 236 236 236 111 111 111 111 111 111 111 111 193 193 193 193 193 225 225 225 225 225 225 117 117 117 117 117 277 277 277 49 49 49 232 232 232 232 232 47 47 47 47 47 328 328 328 119 119 119 119 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 232 232 232 232 232 232 232 232 191 191 191 191 172 172 172 172 172 172 172 172 191 191 191 288 288 288 219 219 219 219 219 219 53 53 53 53 53 229 229 229 229 229 229 229 229 229 229 340 340 340 340 340 340 287 287 287 287 48 48 48 48 48 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 164 164 164 164 164 164 164 164 164 164 164 164 164 115 115 115 115 115 249 249 249 249 249 249 249 249 249 249 249 249 233 233 233 288 288 288 288 288 67 67 67 67 67 67 67 225 225 225 225 333 333 333 333 333 333 333 205 205 205 205 205 340 340 340 340 340 287 287 287 287 287 287 287 287 287 149 149 149 149 149 149 149 149 232 232 232 232 232 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 331 331 331 331 331 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 233 233 116 116 116 116 116 116 119 119 119 119 133 133 133 133 133 133 133 133 133 232 232 232 232 231 231 231 231 231 231 231 231 231 249 249 249 249 249 249 249 249 249 329 329 329 329 329 48 48 48 48 48 279 279 279 279 279 279 279 279 279 221 221 221 221 221 249 249 249 249 249 249 249 249 249 249 285 285 285 285 285 285 285 285 285 48 48 48 187 187 187 187 340 340 340 340 340 340 340 340 275 275 275 275 275 101 101 101 101 101 101 101 101 101 101 288 288 288 219 219 219 219 219 219 219 219 219 219 225 225 225 225 249 249 249 249 249 249 280 280 280 280 280 280 280 287 287 287 287 287 287 287 48 48 48 119 119 119 119 204 204 204 204 204 204 204 204 204 99 99 99 99 99 99 99 99 99 99 99 99 225 225 225 225 225 225 225 49 49 49 49 49 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 191 288 288 288 288 288 191 191 191 191 191 341 341 341 341 341 341 341 49 49 49 49 49 233 233 233 288 288 288 288 131 131 131 131 340 340 340 340 340 340 340 340 340 187 187 187 187 187 187 187 172 172 172 172 172 172 172 331 331 331 208 208 208 208 208 331 331 331 331 331 331 331 144 144 144 144 144 144 175 175 175 175 175 175 175 133 133 133 133 289 289 289 289 289 189 189 189 189 189 236 236 236 236 236 236 236 179 179 179 179 179 193 193 193 193 193 228 228 228 228 228 228 171 171 171 171 171 171 171 145 145 145 145 145 228 228 228 228 191 191 191 191 191 191 191 191 191 237 237 237 237 237 237 237 237 237 237 237 177 177 177 177 177 225 225 225 225 225 49 49 49 49 49 233 233 233 116 116 116 116 116 67 67 67 67 67 67 276 276 276 276 276 119 119 119 119 52 52 52 52 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 289 289 289 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 208 208 208 208 219 219 219 219 219 219 219 219 219 37 37 37 37 37 37 37 37 233 233 233 288 288 288 107 107 107 107 204 204 204 204 204 204 204 227 227 227 227 227 227 227 227 227 227 53 53 53 53 53 53 112 112 112 112 112 112 112 112 112 112 112 112 112 112 115 115 115 193 193 193 193 173 173 173 173 173 173 277 277 277 49 49 49 233 233 233 288 288 288 288 171 171 171 171 171 145 145 145 145 228 228 228 228 15 15 15 15 277 277 277 277 277 277 277 277 281 281 281 281 281 281 281 133 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 329 329 329 329 329 329 329 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 133 133 133 133 133 133 224 224 224 224 224 224 224 224 102 102 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 272 272 272 272 272 272 272 187 187 187 288 288 288 288 288 331 331 331 49 49 49 224 224 224 224 224 224 224 287 287 287 287 287 287 287 287 287 287 149 149 149 149 149 232 232 232 232 232 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 275 275 275 275 275 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 116 116 116 116 227 227 227 227 227 227 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 187 187 187 187 232 232 232 232 50 50 50 50 287 287 287 287 287 287 287 287 287 287 287 287 287 249 249 249 249 249 249 249 249 249 249 232 232 232 232 232 119 119 119 49 49 49 288 288 288 288 288 288 271 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 165 165 165 165 165 165 165 165 165 233 233 233 233 233 225 225 225 225 204 204 204 204 204 204 204 204 204 191 191 191 191 191 191 191 191 233 233 233 233 117 117 117 117 117 49 49 49 49 221 221 221 221 221 221 221 221 169 169 169 169 169 169 169 169 289 289 289 289 289 189 189 189 189 116 116 116 116 179 179 179 179 179 179 179 144 144 144 144 144 144 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 165 165 165 165 165 165 165 165 233 233 233 233 233 233 233 233 233 233 233 173 173 173 173 173 173 173 49 49 49 49 49 224 224 224 224 224 224 224 224 224 115 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 289 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 247 247 247 247 247 247 247 247 247 247 247 233 233 233 233 233 233 233 233 233 233 233 233 225 225 225 225 204 204 204 204 204 204 204 204 204 204 115 115 115 115 115 115 115 115 115 249 249 249 249 249 249 249 249 249 249 249 249 233 233 233 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 193 193 193 193 193 117 117 117 49 49 49 232 232 232 232 232 331 331 331 331 331 331 331 331 69 69 69 69 69 277 277 277 277 277 277 232 232 232 335 335 335 335 335 335 320 320 320 320 320 320 187 187 187 187 187 172 172 172 172 179 179 179 179 179 208 208 208 208 208 208 107 107 107 107 107 107 107 107 107 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 175 175 175 175 175 175 277 277 277 277 277 277 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 232 232 232 175 175 175 175 175 165 165 165 165 165 165 165 165 165 109 109 109 109 109 49 49 49 49 225 225 225 225 225 225 225 225 225 340 340 340 340 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 232 146 146 146 146 146 146 146 146 271 271 271 271 271 271 271 271 305 305 305 305 305 289 289 289 289 289 289 280 280 280 279 279 279 279 279 279 279 279 279 289 289 289 289 289 277 277 277 193 193 193 193 193 221 221 221 221 221 221 221 221 233 233 233 233 233 105 105 105 105 105 105 105 105 105 232 232 232 232 232 187 187 187 187 232 232 232 232 119 119 119 52 52 52 52 331 331 331 331 331 331 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 179 149 149 149 149 149 149 149 149 116 116 116 47 47 47 328 328 328 328 50 50 50 50 50 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 329 329 144 144 144 144 144 187 187 187 187 232 232 232 231 231 231 231 337 337 337 337 337 337 320 320 320 320 320 320 320 320 107 107 107 107 107 107 277 277 277 277 53 53 53 53 233 233 233 233 233 233 233 233 233 341 341 341 341 341 341 333 333 333 333 333 189 189 189 189 189 189 189 220 220 220 220 220 220 220 331 331 331 133 133 133 276 276 276 47 47 47 232 232 232 232 232 232 232 67 67 67 67 67 67 277 277 277 277 277 173 173 173 173 173 173 49 49 49 49 232 232 232 232 47 47 47 47 47 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 111 111 111 111 111 111 111 111 111 111 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 116 116 116 115 115 115 115 115 193 193 193 193 116 116 116 116 116 116 116 116 119 119 119 119 119 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 119 119 119 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 37 37 37 37 37 37 37 37 37 37 229 229 229 229 225 225 225 225 225 225 204 204 204 204 204 204 204 115 115 115 115 115 115 115 101 101 101 101 101 101 101 101 101 101 116 116 116 116 116 116 187 187 187 232 232 232 232 232 232 232 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 193 193 193 193 193 277 277 277 277 277 277 173 173 173 173 173 173 49 49 49 49 224 224 224 224 224 224 224 224 224 224 35 35 35 35 35 35 35 35 35 177 177 177 177 177 49 49 49 233 233 233 233 205 205 205 205 205 205 205 205 205 205 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 233 233 233 233 233 225 225 225 225 204 204 204 204 191 191 191 191 288 288 288 288 288 288 331 331 331 331 49 49 49 340 340 340 340 340 50 50 50 50 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 187 187 187 187 232 232 232 119 119 119 119 37 37 37 37 37 37 288 288 288 288 288 191 191 191 191 191 191 233 233 233 233 233 233 281 281 281 281 281 281 281 289 289 289 289 289 49 49 49 233 233 233 233 233 233 233 233 233 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 224 224 224 224 224 224 224 224 331 331 331 331 331 331 331 148 148 148 148 148 148 231 231 231 231 231 231 21 21 21 21 21 21 21 288 288 288 288 288 288 288 288 175 175 175 175 175 175 175 133 133 133 133 289 289 289 189 189 189 189 236 236 236 236 236 236 236 50 50 50 50 50 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 133 133 133 133 116 116 116 116 227 227 227 227 227 17 17 17 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 225 48 48 48 48 48 48 48 48 48 48 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 340 340 340 340 340 340 340 340 340 191 191 191 191 191 191 172 172 172 172 172 271 271 271 271 271 271 271 271 265 265 265 265 265 265 265 265 265 265 265 265 265 341 341 341 341 341 341 49 49 49 233 233 233 189 189 189 189 236 236 236 236 236 236 236 236 236 236 331 331 331 331 331 331 133 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 331 331 331 331 331 331 331 331 331 144 144 144 50 50 50 50 50 50 271 271 271 271 271 271 271 271 337 337 337 337 337 337 337 305 305 305 305 277 277 277 277 277 277 277 277 225 225 225 225 225 204 204 204 204 204 204 204 204 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 133 133 133 133 133 229 229 229 229 229 229 229 49 49 49 233 233 233 49 49 49 49 49 232 232 232 232 232 47 47 47 47 221 221 221 221 221 221 221 221 221 221 21 21 21 229 229 229 229 229 229 273 273 273 225 225 225 189 189 189 189 285 285 285 285 285 285 285 285 285 285 229 229 229 229 229 49 49 49 49 233 233 233 233 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 231 231 231 231 231 231 21 21 21 21 21 21 21 21 288 288 288 287 287 287 287 287 188 188 188 107 107 107 107 204 204 204 204 204 204 204 204 115 115 115 115 115 115 115 115 277 277 277 277 277 133 133 133 133 133 117 117 117 117 189 189 189 189 189 116 116 116 116 116 116 116 187 187 187 232 232 232 119 119 119 52 52 52 52 219 219 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 47 47 47 47 328 328 328 328 328 50 50 50 50 50 107 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 116 116 116 231 231 231 231 231 133 133 133 133 133 133 329 329 329 329 329 144 144 144 144 144 144 144 115 115 115 115 115 115 115 115 277 277 277 277 277 277 209 209 209 209 209 209 209 209 209 228 228 228 228 228 47 47 47 328 328 328 328 328 287 287 287 287 287 287 287 287 287 287 165 165 165 165 165 165 221 221 221 221 221 221 189 189 189 236 236 236 236 236 236 236 236 50 50 50 50 50 175 175 175 175 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 287 287 287 48 48 48 48 107 107 107 107 107 277 277 277 193 193 193 193 193 193 236 236 236 236 236 236 51 51 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 331 331 331 331 331 331 331 331 331 331 331 53 53 53 53 233 233 233 233 233 233 117 117 117 117 117 144 144 144 144 144 35 35 35 288 288 288 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 340 340 340 340 39 39 39 39 39 39 225 225 225 225 225 49 49 49 49 49 49 177 177 177 177 177 341 341 341 341 341 37 37 37 37 37 37 37 37 233 233 233 233 233 117 117 117 117 117 144 144 144 144 144 279 279 279 279 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 233 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 144 144 144 144 144 171 171 171 171 171 144 144 144 144 144 115 115 115 115 115 115 321 321 321 321 321 321 321 189 189 189 189 189 189 189 236 236 236 236 236 236 236 191 191 191 191 191 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 53 288 288 288 288 288 119 119 119 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 331 331 331 331 331 305 305 305 305 305 117 117 117 49 49 49 49 49 233 233 233 288 288 288 283 283 283 283 283 283 283 283 283 283 277 277 277 277 193 193 193 193 237 237 237 237 237 237 237 237 220 220 220 220 220 220 171 171 171 171 145 145 145 228 228 228 228 47 47 47 47 117 117 117 117 117 117 117 21 21 21 21 21 21 21 21 21 273 273 273 273 273 289 289 289 189 189 189 189 236 236 236 236 236 236 236 50 50 50 50 50 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 249 249 249 224 224 224 224 224 224 224 1 1 1 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 173 173 173 173 173 173 173 173 173 49 49 49 49 232 232 232 47 47 47 47 47 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 49 49 49 228 228 228 187 187 187 187 187 187 172 172 172 172 283 283 283 283 283 208 208 208 208 208 287 287 287 287 287 287 305 305 305 305 305 305 220 220 220 220 220 220 191 191 191 288 288 288 288 288 187 187 187 187 187 233 233 233 233 233 233 289 289 289 289 289 289 289 289 320 320 320 320 179 179 179 179 179 179 179 144 144 144 144 144 144 144 179 179 179 179 179 179 179 179 133 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 275 165 165 165 165 165 165 165 165 113 113 113 113 113 49 49 49 49 49 49 224 224 224 224 331 331 331 331 331 331 305 305 305 116 116 116 179 179 179 37 37 37 328 328 328 328 223 223 223 223 223 101 101 101 101 101 101 101 101 221 221 221 221 288 288 288 287 287 287 188 188 188 188 188 279 279 279 279 279 279 279 279 289 289 289 289 289 289 164 164 164 164 164 164 164 164 164 47 47 47 233 233 233 233 289 289 289 289 289 289 289 193 193 193 224 224 224 224 224 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 337 337 337 337 316 316 316 316 316 219 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 228 228 228 228 228 228 228 228 179 179 179 249 249 249 249 249 249 249 228 228 228 228 228 228 331 331 331 331 189 189 189 120 120 120 179 179 179 189 189 189 340 340 340 340 340 187 187 187 187 229 229 229 229 229 273 273 273 273 273 273 273 273 69 69 69 69 69 277 277 277 277 277 289 289 289 189 189 189 189 116 116 116 116 116 116 116 116 116 116 67 67 67 67 67 67 67 67 277 277 277 277 277 277 173 173 173 173 173 173 173 173 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 53 288 288 288 288 288 288 275 275 275 275 49 49 49 49 49 49 173 173 173 173 173 173 173 225 225 225 133 133 133 133 133 221 221 221 221 221 221 221 221 289 289 289 289 289 189 189 189 189 189 236 236 236 236 236 236 236 236 119 119 119 119 49 49 49 49 288 288 288 288 191 191 191 288 288 288 288 288 331 331 331 331 305 305 305 305 116 116 116 116 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 208 50 50 50 50 50 175 175 175 175 175 175 175 175 175 175 175 305 305 305 305 305 305 305 116 116 116 116 116 116 116 116 116 287 287 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 320 320 320 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 277 277 277 277 277 277 277 277 340 340 340 340 340 340 340 340 35 35 35 35 35 288 288 288 288 288 288 223 223 223 223 223 223 209 209 209 209 209 209 209 209 209 281 281 281 281 281 281 281 288 288 288 107 107 107 107 107 189 189 189 189 189 173 173 173 173 173 173 173 173 69 69 69 69 69 69 276 276 276 276 179 179 179 179 179 179 189 189 189 340 340 340 340 340 340 340 143 143 143 143 143 143 143 143 143 143 143 143 101 101 101 101 101 101 101 101 101 101 101 329 329 329 329 49 49 49 49 49 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 219 219 219 219 219 49 49 49 49 49 233 233 233 233 221 221 221 221 221 221 221 225 225 225 225 225 321 321 321 321 321 321 117 117 117 117 117 189 189 189 189 189 189 189 116 116 116 116 287 287 287 287 188 188 188 188 188 188 175 175 175 175 248 248 248 248 248 248 248 248 248 248 51 51 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 119 119 119 119 48 48 48 48 48 48 48 275 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 275 275 275 275 275 275 275 275 275 21 21 21 21 21 21 21 109 109 109 145 145 145 145 145 145 145 288 288 288 288 288 288 107 107 107 107 107 107 133 133 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 47 47 47 47 233 233 233 116 116 116 287 287 287 287 287 287 287 133 133 133 133 133 224 224 224 224 224 224 119 119 119 119 119 48 48 48 231 231 231 231 231 231 337 337 337 337 337 337 337 337 321 321 321 321 321 321 321 321 321 321 321 321 321 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 331 331 331 305 305 305 305 116 116 116 116 116 116 116 116 279 279 279 279 279 279 279 279 279 279 149 149 149 149 149 149 149 149 149 289 289 289 289 49 49 49 233 233 233 225 225 225 204 204 204 204 204 227 227 227 227 227 227 227 227 165 165 165 165 165 165 165 220 220 220 220 220 220 220 220 50 50 50 50 279 279 279 279 279 279 279 279 129 129 129 129 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 49 49 49 49 49 49 232 232 232 232 232 279 279 279 279 279 279 279 133 133 133 133 133 221 221 221 221 221 49 49 49 49 232 232 232 232 287 287 287 287 287 287 48 48 48 231 231 231 231 231 231 231 231 231 53 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 115 115 115 115 115 115 115 193 193 193 193 193 193 277 277 277 277 277 277 277 225 225 225 225 225 225 204 204 204 204 204 204 204 204 223 223 223 223 223 223 223 223 223 223 223 223 53 53 53 53 53 53 53 53 53 329 329 329 329 329 329 329 116 116 116 287 287 287 48 48 48 48 227 227 227 227 165 165 165 165 165 165 220 220 220 220 220 220 50 50 50 50 279 279 279 279 279 279 279 279 129 129 129 129 129 233 233 233 233 233 233 233 281 281 281 281 281 281 281 165 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 283 283 283 283 283 283 283 208 208 208 208 208 208 287 287 287 287 287 287 287 305 305 305 305 305 305 305 305 220 220 220 179 179 179 179 145 145 145 145 145 145 281 281 281 281 281 281 281 133 133 133 133 133 225 225 225 225 225 225 172 172 172 172 172 172 47 47 47 47 47 47 333 333 333 333 333 333 333 333 333 333 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 229 229 229 229 229 229 229 229 333 333 333 333 53 53 53 53 53 53 53 53 288 288 288 287 287 287 287 287 48 48 48 227 227 227 227 227 227 145 145 145 145 145 145 145 145 145 145 145 193 193 193 193 193 225 225 225 225 225 225 225 225 225 225 225 49 49 49 49 340 340 340 340 340 340 340 340 340 340 275 275 275 275 189 189 189 189 225 225 225 225 225 225 225 225 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 276 276 276 276 276 119 119 119 119 48 48 48 48 48 48 223 223 223 223 223 223 223 223 223 37 37 37 37 37 37 37 37 289 289 289 289 289 289 144 144 144 144 144 144 144 171 171 171 171 171 171 171 171 171 133 133 133 133 133 225 225 225 225 225 225 225 288 288 288 179 179 179 179 179 179 179 179 144 144 144 144 144 144 144 115 115 115 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 289 289 289 289 289 289 289 289 280 280 280 280 280 47 47 47 233 233 233 233 116 116 116 116 116 171 171 171 171 171 171 171 171 193 193 193 193 193 193 193 193 193 277 277 277 277 277 277 340 340 340 340 340 340 340 340 275 275 275 275 275 275 189 189 189 189 329 329 329 329 329 329 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 329 329 329 329 329 189 189 189 189 189 189 236 236 236 236 236 236 236 236 51 51 51 51 233 233 233 233 233 233 117 117 117 117 144 144 144 119 119 119 119 119 119 204 204 204 204 204 204 191 191 191 191 191 191 233 233 233 233 233 233 233 173 173 173 173 173 173 173 173 173 173 225 225 225 225 317 317 317 49 49 49 49 233 233 233 233 233 280 280 280 280 280 280 47 47 47 47 47 328 328 328 328 328 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 165 113 113 113 113 113 49 49 49 49 49 225 225 225 225 340 340 340 340 340 340 271 271 271 271 271 271 271 271 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 49 49 49 49 229 229 229 229 197 197 197 197 197 197 341 341 341 341 341 341 49 49 49 49 49 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 133 133 133 224 224 224 47 47 47 47 47 328 328 328 328 328 328 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 193 193 193 193 237 237 237 237 237 237 237 237 237 237 237 237 237 340 340 340 340 119 119 119 119 49 49 49 49 49 288 288 288 288 288 288 1 1 1 131 131 131 131 131 131 131 131 131 131 131 329 329 329 329 329 329 329 144 144 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 67 67 67 67 67 67 67 276 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 331 193 193 193 193 193 193 224 224 224 224 224 224 224 224 107 107 107 107 107 107 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 217 217 217 217 217 217 217 37 37 37 37 37 37 37 37 37 221 221 221 221 221 221 337 337 337 337 317 317 317 225 225 225 225 161 161 161 161 161 161 161 161 161 289 289 289 289 289 189 189 189 189 116 116 116 116 116 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 49 224 224 224 224 331 331 331 331 331 331 331 193 193 193 193 193 232 232 232 232 232 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 331 49 49 49 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 165 165 173 173 173 173 173 173 173 173 173 225 225 225 225 204 204 204 204 204 204 204 204 204 204 83 83 83 83 83 83 83 288 288 288 288 288 288 288 288 288 288 288 187 187 187 232 232 232 232 119 119 119 52 52 52 52 223 223 223 223 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 115 115 115 115 115 115 115 53 53 53 53 53 53 340 340 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 209 209 209 209 225 225 225 225 225 225 225 204 204 204 204 204 204 204 279 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 228 228 228 228 131 131 131 340 340 340 340 340 340 340 340 191 191 191 191 172 172 172 172 172 172 172 172 102 102 102 102 102 227 227 227 227 227 227 53 53 53 53 53 281 281 281 281 281 288 288 288 107 107 107 107 204 204 204 204 115 115 115 115 115 115 115 277 277 277 277 277 209 209 209 209 209 209 209 229 229 229 229 229 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 133 133 133 133 133 224 224 224 224 224 224 224 224 99 99 99 99 99 99 99 99 228 228 228 228 228 228 279 279 279 279 279 279 279 279 279 279 279 279 21 21 21 21 277 277 277 277 277 277 277 277 277 204 204 204 204 204 171 171 171 171 171 171 171 69 69 69 276 276 276 276 119 119 119 119 37 37 37 37 37 37 37 37 288 288 288 288 288 288 271 271 271 271 271 271 271 271 271 271 271 321 321 321 321 321 321 321 321 276 276 276 276 276 335 335 335 335 335 335 335 335 335 335 335 53 53 53 53 53 53 236 236 236 236 236 236 236 236 236 236 331 331 331 331 331 331 53 53 53 53 232 232 232 232 232 35 35 35 35 233 233 233 233 116 116 116 231 231 231 231 231 231 231 231 248 248 248 248 248 248 227 227 227 227 227 227 189 189 189 189 281 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 165 165 165 165 165 165 165 165 165 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 316 316 316 47 47 47 233 233 233 116 116 116 227 227 227 17 17 17 277 277 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 48 48 115 115 115 115 115 115 115 115 115 249 249 249 249 249 249 249 232 232 232 232 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 248 248 131 131 131 131 131 131 131 233 233 233 233 233 205 205 205 205 205 205 205 205 293 293 293 293 293 293 293 197 197 197 236 236 236 236 236 236 47 47 47 47 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 111 111 111 111 111 111 111 111 193 193 193 193 225 225 225 225 225 225 117 117 117 117 117 277 277 277 277 277 49 49 49 49 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 119 119 119 165 165 165 165 165 224 224 224 224 224 224 224 187 187 187 187 187 221 221 221 221 221 281 281 281 281 281 281 273 273 273 273 273 273 133 133 133 133 221 221 221 221 221 221 221 221 288 288 288 288 288 288 187 187 187 228 228 228 228 228 228 228 287 287 287 287 287 188 188 188 107 107 107 107 107 204 204 204 204 204 204 204 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 341 341 341 341 341 341 341 341 341 341 144 144 144 144 144 144 47 47 47 47 47 233 233 233 116 116 116 116 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 133 133 133 117 117 117 117 117 205 205 205 205 205 205 205 205 205 144 144 144 144 119 119 119 119 119 119 49 49 49 288 288 288 179 179 179 189 189 189 189 340 340 340 340 340 247 247 247 247 247 247 247 247 247 247 247 247 247 232 232 232 232 232 232 232 232 232 232 232 175 175 175 175 175 175 277 277 277 277 37 37 37 37 37 37 37 37 37 233 233 233 233 233 233 233 233 173 173 173 173 173 173 173 173 173 25 25 25 25 25 25 25 25 121 121 121 121 121 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 229 229 229 229 229 229 229 229 340 340 340 340 340 1 1 1 47 47 47 47 47 47 47 47 47 47 233 233 233 233 233 233 233 233 233 233 233 233 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 37 37 37 37 233 233 233 233 233 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 287 188 188 188 188 291 291 291 291 193 193 193 237 237 237 237 220 220 220 47 47 47 47 328 328 328 328 50 50 50 50 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 101 101 101 101 101 101 101 225 225 225 225 225 225 225 116 116 116 116 116 35 35 35 288 288 288 288 288 288 288 175 175 175 175 175 175 277 277 277 209 209 209 209 209 209 209 209 232 232 232 232 232 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 49 49 49 225 225 225 225 225 225 340 340 340 340 279 279 279 279 279 279 279 279 53 53 53 53 53 53 229 229 229 229 229 181 181 181 181 181 181 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 133 133 133 277 277 277 340 340 340 340 340 340 340 231 231 231 133 133 133 133 329 329 329 329 329 329 144 144 144 144 107 107 107 107 107 107 193 193 193 193 193 193 232 232 232 232 232 232 232 232 331 331 331 331 331 331 331 331 53 53 53 53 53 232 232 232 232 232 232 232 119 119 119 119 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 276 276 276 276 276 276 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 316 316 316 47 47 47 47 233 233 233 116 116 116 227 227 227 17 17 17 277 277 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 225 225 225 225 225 48 48 48 48 48 48 48 331 331 331 331 331 331 144 144 144 144 144 144 144 175 175 175 175 175 175 277 277 277 277 277 277 249 249 249 249 249 249 249 249 249 249 232 232 232 232 232 232 232 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 272 272 331 331 331 331 331 133 133 133 133 232 232 232 232 232 232 119 119 119 48 48 48 48 231 231 231 337 337 337 337 337 337 320 320 320 320 320 320 320 320 179 179 179 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 280 280 280 280 280 280 280 280 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 107 107 107 107 107 193 193 193 193 193 225 225 225 225 225 225 225 225 225 225 225 225 225 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 187 172 172 172 172 172 119 119 119 119 164 164 164 164 164 164 164 164 164 164 164 164 164 131 131 131 131 131 131 329 329 329 329 329 329 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 331 148 148 148 148 148 148 148 148 148 148 148 148 148 148 111 111 111 111 111 111 111 111 111 111 111 111 193 193 193 193 225 225 225 225 225 225 225 117 117 117 117 117 117 277 277 277 277 277 49 49 49 49 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 193 193 193 193 193 112 112 112 112 112 112 112 187 187 187 187 340 340 340 340 340 340 179 179 179 179 179 21 21 21 21 21 277 277 277 277 277 277 116 116 116 116 287 287 287 287 48 48 48 48 107 107 107 107 107 189 189 189 225 225 225 225 225 225 225 209 209 209 209 209 209 209 209 209 209 328 328 328 328 328 328 328 331 331 331 331 133 133 133 232 232 232 232 232 331 331 331 331 331 331 53 53 53 53 232 232 232 232 232 232 232 223 223 223 223 305 305 305 305 305 221 221 221 221 221 221 221 221 280 280 280 280 280 280 35 35 35 35 288 288 288 288 119 119 119 119 49 49 49 49 49 49 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 331 331 331 331 331 331 331 331 331 331 305 305 305 305 305 117 117 117 117 49 49 49 49 233 233 233 233 233 233 288 288 288 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 208 208 208 191 191 191 191 191 232 232 232 232 232 232 232 119 119 119 119 119 37 37 37 37 37 37 288 288 288 288 288 67 67 67 67 67 67 67 67 277 277 277 277 277 277 277 173 173 173 173 173 173 49 49 49 49 49 233 233 233 233 233 233 233 340 340 340 340 283 283 283 283 283 283 283 283 283 283 283 283 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 340 340 340 340 340 340 340 340 340 340 171 171 171 171 171 171 171 144 144 144 144 144 144 144 144 144 144 131 131 131 131 233 233 233 233 233 233 233 205 205 205 205 205 205 205 293 293 293 293 293 293 293 197 197 197 197 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 107 107 107 107 107 53 53 53 288 288 288 288 288 102 102 102 102 102 102 102 102 102 102 102 271 271 271 271 271 271 271 271 271 271 271 271 271 271 193 193 193 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 179 179 179 179 179 193 193 193 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 37 37 37 37 37 37 37 37 37 289 289 289 289 289 280 280 280 280 280 280 280 280 280 331 331 331 331 331 331 53 53 53 53 53 53 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 189 189 189 189 189 340 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 49 49 49 49 49 224 224 224 224 224 224 287 287 287 287 287 287 287 287 48 48 48 119 119 119 119 119 52 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 116 116 116 116 116 116 116 116 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 340 340 340 340 107 107 107 107 107 305 305 305 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 49 49 49 340 340 340 340 340 340 340 340 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 47 47 47 47 47 328 328 328 119 119 119 119 52 52 52 52 52 171 171 171 171 171 171 171 171 171 49 49 49 49 49 225 225 225 225 225 225 225 225 233 233 233 233 233 49 49 49 49 49 280 280 280 280 280 280 280 47 47 47 47 328 328 328 179 179 179 179 179 144 144 144 144 144 144 144 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 277 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 111 111 111 111 111 111 111 111 111 111 37 37 37 37 37 37 37 273 273 273 273 289 289 289 289 289 289 144 144 144 144 144 144 144 287 287 287 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 109 109 109 109 109 145 145 145 145 145 145 145 145 145 145 288 288 288 288 288 1 1 1 187 187 187 187 187 187 187 340 340 340 340 279 279 279 279 279 279 279 49 49 49 49 273 273 273 273 273 273 273 277 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 341 341 341 341 341 341 341 341 341 341 341 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 53 53 293 293 293 293 293 293 293 293 293 293 109 109 109 109 109 145 145 145 145 145 145 145 145 145 145 145 288 288 288 288 288 288 35 35 35 35 35 233 233 233 116 116 116 119 119 119 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 279 69 69 69 69 277 277 277 277 277 277 49 49 49 49 49 49 49 224 224 224 224 224 224 224 227 227 227 227 227 227 227 227 227 133 133 133 133 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 215 215 215 215 215 215 215 215 215 215 215 215 215 215 21 21 21 21 21 21 21 21 21 21 21 177 177 177 177 177 116 116 116 116 116 116 116 116 116 116 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 229 229 229 173 173 173 145 145 145 289 289 289 49 49 49 49 49 109 109 109 109 109 225 225 225 225 225 204 204 204 204 204 204 204 204 204 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 144 144 144 144 144 119 119 119 119 204 204 204 204 204 204 204 204 204 204 204 204 163 163 163 163 163 163 163 163 163 163 163 288 288 288 288 288 288 288 288 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 287 287 287 287 48 48 48 48 107 107 107 107 107 107 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 275 275 275 275 275 275 275 193 193 193 193 193 193 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 288 288 288 288 331 331 331 331 49 49 49 340 340 340 340 340 50 50 50 50 50 50 50 271 271 271 271 271 271 271 277 277 277 277 277 193 193 193 289 289 289 289 289 204 204 204 204 204 204 204 204 204 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 275 275 275 275 275 275 275 275 275 275 275 275 275 53 53 53 53 53 53 233 233 233 233 233 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 47 47 47 47 47 47 225 225 225 225 225 225 225 225 225 69 69 69 69 69 69 69 69 69 69 69 69 236 236 236 236 236 236 107 107 107 107 189 189 189 189 289 289 289 289 289 289 289 289 289 333 333 333 209 209 209 209 209 209 209 209 232 232 232 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 233 233 233 233 233 233 53 53 53 53 53 53 53 53 53 53 53 176 176 176 176 176 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 21 21 21 21 277 277 277 277 277 277 277 229 229 229 229 229 229 229 281 281 281 281 281 281 289 289 289 289 289 289 289 137 137 137 137 137 137 137 137 137 137 117 117 117 117 117 117 340 340 340 340 340 340 340 340 331 331 331 331 193 193 193 193 193 193 193 193 292 292 292 292 292 292 292 292 292 231 231 231 231 231 231 231 231 84 84 84 84 84 84 84 84 84 84 84 84 84 47 47 47 233 233 233 116 116 116 47 47 47 47 177 177 177 177 177 177 177 177 177 177 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 133 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 50 107 107 107 107 107 107 193 193 193 288 288 288 288 288 47 47 47 47 328 328 328 328 328 328 328 1 1 1 1 1 1 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 148 148 148 148 148 148 148 148 148 148 148 148 148 148 148 331 331 331 331 331 331 331 331 331 331 331 331 305 305 305 305 305 305 305 116 116 116 116 116 287 287 287 287 287 188 188 188 188 115 115 115 115 115 115 115 115 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 101 328 328 328 328 291 291 291 291 291 291 291 291 291 291 291 291 291 291 277 277 277 277 277 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 276 276 276 276 276 276 276 50 50 50 50 50 179 179 179 179 179 179 179 179 179 179 179 179 179 179 21 21 21 225 225 225 225 225 225 225 225 225 225 225 244 244 244 244 244 244 244 244 244 244 244 244 331 331 331 331 331 331 133 133 133 133 133 133 133 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 116 116 116 116 116 116 116 271 271 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 53 53 53 53 53 53 53 229 229 229 229 229 229 229 229 229 229 229 229 229 340 340 340 340 340 340 340 340 340 179 179 179 179 179 179 179 179 53 53 53 53 236 236 236 236 236 236 236 236 236 236 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 288 288 119 119 119 119 119 133 133 133 133 133 133 276 276 276 276 276 276 171 171 171 171 171 171 171 171 171 171 171 171 171 193 193 193 193 193 193 225 225 225 225 225 225 229 229 229 229 229 229 204 204 204 204 204 204 204 204 107 107 107 107 107 107 107 107 225 225 225 225 225 225 225 321 321 321 321 321 321 321 321 321 321 321 321 321 321 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 119 119 119 204 204 204 204 204 204 204 204 131 131 131 131 131 131 131 131 131 131 131 131 276 276 276 276 276 276 276 276 276 276 276 276 331 331 331 331 331 49 49 49 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 279 333 333 333 333 209 209 209 209 209 209 209 209 209 209 209 288 288 288 288 288 288 288 288 331 331 331 331 189 189 189 189 292 292 292 292 119 119 119 119 52 52 52 52 52 107 107 107 107 107 107 107 107 107 107 277 277 277 277 277 277 133 133 133 133 133 133 133 133 133 292 292 292 292 292 292 292 292 292 292 47 47 47 47 328 328 328 328 328 328 328 328 227 227 227 227 227 227 227 133 133 133 233 233 233 233 233 233 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 273 273 273 273 273 273 273 273 49 49 49 49 224 224 224 224 224 224 224 224 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 113 113 113 113 113 113 113 113 113 113 113 113 113 113 145 145 145 145 145 145 145 145 117 117 117 117 117 117 117 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 119 119 119 52 52 52 227 227 227 227 227 227 227 227 227 227 227 133 133 133 133 133 133 117 117 117 117 117 117 253 253 253 253 253 253 253 253 253 253 253 253 340 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 225 225 225 225 225 225 249 249 249 249 249 249 249 273 273 273 273 273 273 273 273 288 288 288 288 288 47 47 47 47 47 47 333 333 333 333 333 333 333 164 164 164 164 164 164 164 164 164 164 187 187 187 187 187 187 232 232 232 232 232 119 119 119 48 48 48 48 115 115 115 115 115 115 115 115 115 193 193 193 193 193 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 289 49 49 49 49 49 233 233 233 233 233 233 233 280 280 280 280 280 280 287 287 287 287 287 48 48 48 48 48 48 179 179 179 179 179 179 179 145 145 145 145 145 145 145 145 145 145 145 145 145 145 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 341 341 341 341 341 341 341 341 341 341 341 49 49 49 49 232 232 232 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 193 193 193 193 193 193 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 289 289 289 289 289 289 280 280 280 280 280 47 47 47 47 328 328 328 328 328 328 328 328 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 47 47 47 47 47 233 233 233 233 116 116 116 116 116 116 116 1 1 1 271 271 271 271 271 271 271 271 271 149 149 149 149 149 149 149 273 273 273 273 273 273 273 273 273 273 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 224 224 224 224 224 224 224 224 119 119 119 119 119 119 48 48 48 48 48 223 223 223 223 223 223 193 193 193 193 289 289 289 289 289 49 49 49 49 49 224 224 224 224 224 224 107 107 107 107 107 107 107 107 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 117 117 117 117 117 117 117 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 37 37 37 37 37 37 37 37 37 37 37 37 236 236 236 236 236 236 236 236 236 236 236 236 236 131 131 131 131 340 340 340 340 340 340 340 340 340 191 191 191 191 172 172 172 172 172 172 172 172 191 191 191 191 288 288 288 288 288 288 288 288 288 288 288 288 288 331 331 331 331 331 331 148 148 148 148 148 148 148 148 148 148 148 148 148 148 119 119 119 119 119 52 52 52 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 331 331 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 232 232 232 115 115 115 115 115 164 164 164 164 164 164 164 164 164 164 47 47 47 47 47 328 328 328 328 328 328 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 229 229 229 229 229 229 229 229 229 229 144 144 144 144 144 187 187 187 187 187 187 232 232 232 232 232 232 232 232 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 119 119 119 119 119 119 204 204 204 204 204 204 335 335 335 335 335 335 335 335 335 335 193 193 193 193 193 193 193 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 187 187 187 187 187 187 233 233 233 233 233 233 233 217 217 217 217 217 217 217 265 265 265 265 265 265 265 265 265 265 265 265 116 116 116 116 116 116 119 119 119 52 52 52 52 115 115 115 115 115 115 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 101 101 328 328 328 328 328 35 35 35 35 35 35 35 35 35 173 173 173 173 173 289 289 289 289 289 289 144 144 144 179 179 179 189 189 189 340 340 340 340 340 340 340 247 247 247 247 247 247 247 247 247 247 247 247 232 232 232 232 232 232 232 171 171 171 171 171 171 171 171 171 171 171 37 37 37 37 37 37 37 37 37 37 285 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 221 221 221 221 221 281 281 281 281 281 281 281 133 133 133 133 133 133 133 133 273 273 273 273 288 288 288 115 115 115 305 305 305 277 277 277 189 189 189 189 189 189 189 236 236 236 236 119 119 119 119 48 48 48 48 227 227 227 227 227 227 249 249 249 249 249 249 249 249 249 229 229 229 229 229 229 229 49 49 49 49 233 233 233 289 289 289 280 280 280 280 280 280 331 331 331 193 193 193 232 232 232 179 179 179 179 179 179 179 179 179 208 208 208 208 227 227 227 227 227 227 227 227 227 227 133 133 133 133 133 133 133 288 288 288 288 288 288 288 288 288 288 331 331 331 331 331 331 193 193 193 193 193 229 229 229 229 229 229 229 49 49 49 49 49 49 232 232 232 232 232 232 47 47 47 47 233 233 233 116 116 116 116 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 287 287 287 287 287 287 287 48 48 48 48 231 231 231 231 231 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 21 21 21 116 116 116 116 116 116 287 287 287 287 287 287 287 48 48 48 48 48 119 119 119 119 119 49 49 49 49 49 49 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 69 69 69 276 276 276 276 276 276 276 187 187 187 187 187 232 232 232 232 232 232 271 271 271 271 271 277 277 277 277 277 277 193 193 193 233 233 233 233 233 233 233 233 280 280 280 280 280 280 280 131 131 131 131 131 117 117 117 117 117 117 117 333 333 333 145 145 145 116 116 116 116 116 116 99 99 99 99 99 99 99 99 99 99 99 99 99 225 225 225 225 225 225 225 49 49 49 49 49 49 233 233 233 233 233 116 116 116 116 335 335 335 335 320 320 320 320 320 320 320 146 146 146 146 146 146 146 146 279 279 279 279 279 279 49 49 49 49 273 273 273 273 273 273 249 249 249 249 249 249 249 249 249 249 341 341 341 341 341 341 341 341 341 341 116 116 116 287 287 287 188 188 188 188 188 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 21 21 116 116 116 287 287 287 287 320 320 320 320 320 320 320 320 320 320 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 47 47 47 47 47 233 233 233 116 116 116 116 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 233 233 233 233 233 233 117 117 117 117 277 277 277 277 204 204 204 204 335 335 335 335 335 335 335 335 320 320 320 320 320 227 227 227 227 227 227 227 209 209 209 209 209 209 288 288 288 288 19 19 19 19 19 19 19 19 232 232 232 232 119 119 119 52 52 52 52 52 52 52 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 133 133 133 133 133 133 121 121 121 121 144 144 144 144 335 335 335 335 335 335 335 335 320 320 320 320 320 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 119 119 119 119 119 49 49 49 228 228 228 228 228 228 228 228 146 146 146 146 146 146 146 146 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 337 337 337 316 316 316 316 316 316 115 115 115 115 115 115 115 277 277 277 277 277 277 133 133 133 133 117 117 117 117 117 189 189 189 189 189 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 224 224 331 331 331 331 331 331 331 193 193 193 193 193 229 229 229 229 229 229 229 229 49 49 49 49 49 49 49 232 232 232 232 232 232 232 232 187 187 187 187 187 187 187 187 221 221 221 221 221 221 221 281 281 281 281 281 281 281 281 133 133 133 133 133 273 273 273 273 273 273 273 288 288 288 288 288 288 288 227 227 227 227 227 227 227 227 227 227 17 17 17 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 48 48 48 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 116 116 116 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 165 165 165 165 165 165 165 165 165 113 113 113 113 113 113 113 49 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 208 208 208 208 179 179 179 179 179 179 179 179 179 179 179 37 37 37 116 116 116 116 116 47 47 47 232 232 232 232 232 232 47 47 47 47 47 47 233 233 233 233 233 233 233 233 221 221 221 221 221 221 221 221 221 221 53 53 53 53 53 229 229 229 229 229 229 173 173 173 173 173 145 145 145 289 289 289 49 49 49 49 109 109 109 109 49 49 49 49 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 209 209 209 209 209 209 209 209 209 209 225 225 225 225 225 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 49 49 49 288 288 288 119 119 119 52 52 52 52 227 227 227 227 189 189 189 189 189 281 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 193 193 193 277 277 277 277 277 277 277 205 205 205 205 205 205 205 49 49 49 49 49 280 280 280 280 280 280 280 280 280 280 219 219 219 219 219 219 219 219 219 219 219 277 277 277 277 277 209 209 209 209 209 113 113 113 113 113 113 113 113 113 113 113 145 145 145 145 145 145 340 340 340 340 340 340 340 340 331 331 331 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 221 221 221 221 221 221 277 277 277 277 189 189 189 189 189 289 289 289 289 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 223 223 223 223 223 223 223 223 223 223 37 37 37 37 37 37 37 37 37 37 37 37 37 173 173 173 173 173 173 173 173 173 173 173 189 189 189 236 236 236 236 236 236 236 236 35 35 35 35 35 35 35 35 35 288 288 288 288 288 179 179 179 179 179 179 193 193 193 193 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 227 227 227 227 227 227 227 164 164 164 164 179 179 179 179 179 179 37 37 37 328 328 328 107 107 107 49 49 49 49 232 232 232 232 232 219 219 219 219 219 219 219 333 333 333 333 333 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 275 275 275 275 275 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 187 187 187 187 232 232 232 232 232 291 291 291 291 291 291 291 193 193 193 237 237 237 237 237 237 221 221 221 221 221 221 221 221 189 189 189 236 236 236 236 236 236 236 236 236 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 171 69 69 69 276 276 276 276 276 179 179 179 179 179 208 208 208 208 208 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 47 47 47 47 232 232 232 232 232 232 232 232 1 1 1 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 116 116 116 116 116 116 116 223 223 223 223 305 305 305 305 305 221 221 221 221 221 221 221 189 189 189 189 236 236 236 236 236 236 236 271 271 271 271 271 271 271 271 271 271 271 149 149 149 149 149 149 149 149 281 281 281 281 281 281 281 281 281 281 189 189 189 233 233 233 189 189 189 189 189 189 189 189 189 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 1 1 1 1 1 1 331 331 331 331 331 331 189 189 189 120 120 120 120 47 47 47 232 232 232 232 232 47 47 47 47 47 47 47 47 233 233 233 233 233 233 233 233 233 233 177 177 177 177 177 177 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 233 233 233 233 233 233 233 225 225 225 225 204 204 204 204 204 204 204 204 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 193 193 193 193 193 193 193 177 177 177 177 337 337 337 337 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 116 116 116 116 116 116 223 223 223 223 223 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 145 145 145 232 232 232 232 232 232 232 232 232 232 232 232 175 175 175 175 175 175 277 277 277 277 277 277 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 133 133 133 133 133 133 133 133 133 133 133 276 276 276 276 276 276 276 276 119 119 119 119 119 119 49 49 49 49 288 288 288 288 288 287 287 287 287 287 287 287 287 287 287 287 287 53 53 53 53 53 53 53 53 113 113 113 113 113 113 113 113 113 113 113 113 288 288 288 179 179 179 179 189 189 189 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 321 321 321 321 321 321 321 321 273 273 273 273 273 273 273 189 189 189 236 236 236 236 236 236 236 236 283 283 283 283 283 283 283 283 283 283 283 283 283 283 249 249 249 249 249 249 249 249 249 225 225 225 225 225 225 225 117 117 117 117 117 145 145 145 145 145 145 145 145 145 145 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 50 50 50 50 50 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 224 224 224 224 224 224 224 224 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 69 69 69 69 69 69 69 69 69 69 69 69 69 69 173 173 173 173 173 173 173 173 173 288 288 288 288 288 288 288 288 288 107 107 107 107 107 277 277 277 277 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 107 107 107 107 107 107 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 277 277 277 277 277 277 277 277 277 277 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 331 331 331 331 331 331 331 193 193 193 193 193 112 112 112 112 112 112 112 179 179 179 179 208 208 208 179 179 179 37 37 37 116 116 116 116 116 116 116 116 331 331 331 331 331 331 69 69 69 69 69 69 69 277 277 277 277 277 232 232 232 232 232 131 131 131 131 329 329 329 329 329 329 329 144 144 144 144 144 279 279 279 279 279 279 279 279 193 193 193 193 233 233 233 233 233 233 280 280 280 179 179 179 208 208 208 331 331 331 331 49 49 49 49 340 340 340 340 340 340 287 287 287 287 287 287 287 287 333 333 333 133 133 133 233 233 233 233 233 233 233 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 232 232 232 232 232 232 232 171 171 171 171 171 171 171 171 171 171 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 221 221 221 221 221 221 221 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 208 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 116 116 116 116 223 223 223 223 223 305 305 305 305 305 305 221 221 221 221 221 221 221 288 288 288 288 288 288 35 35 35 35 35 288 288 288 288 288 287 287 287 287 287 287 287 287 333 333 333 333 133 133 133 133 233 233 233 233 233 233 289 289 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 327 327 327 327 327 327 327 327 327 327 327 133 133 133 133 133 277 277 277 277 277 277 204 204 204 204 204 204 204 227 227 227 227 227 227 227 227 227 53 53 53 53 53 53 53 112 112 112 112 112 112 112 131 131 131 340 340 340 340 340 340 179 179 179 208 208 208 208 208 208 223 223 223 223 223 305 305 305 305 305 221 221 221 221 221 288 288 288 288 288 35 35 35 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 193 193 193 193 221 221 221 221 221 281 281 281 281 281 281 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 223 223 223 223 223 223 223 223 223 223 223 223 223 223 37 37 37 37 37 37 37 37 221 221 221 221 221 221 221 221 189 189 189 189 189 236 236 236 236 236 236 236 236 236 50 50 50 50 223 223 223 223 223 223 193 193 193 193 289 289 289 289 289 49 49 49 49 49 224 224 224 224 224 47 47 47 328 328 328 328 328 119 119 119 119 52 52 52 175 175 175 175 175 175 277 277 277 277 277 165 165 165 165 165 165 165 165 165 233 233 233 233 233 233 233 49 49 49 49 49 49 49 49 49 49 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 133 133 133 133 133 232 232 232 179 179 179 179 179 179 208 208 208 208 208 208 208 208 275 275 275 275 275 275 275 209 209 209 209 209 209 209 113 113 113 113 113 113 113 113 113 288 288 288 288 288 288 288 288 288 107 107 107 107 107 107 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 275 275 275 275 275 275 275 275 193 193 193 193 193 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 119 119 133 133 133 276 276 276 276 276 276 331 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 340 340 231 231 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 279 279 279 279 279 279 279 279 279 279 279 279 279 279 101 101 101 101 101 101 101 101 101 101 101 101 101 232 232 232 232 232 47 47 47 47 328 328 328 328 328 328 131 131 131 131 233 233 233 233 233 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 287 277 277 277 277 277 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 208 208 291 291 291 291 291 291 69 69 69 69 69 69 69 69 69 69 288 288 288 288 179 179 179 208 208 208 208 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 320 320 320 147 147 147 147 147 147 147 147 147 147 147 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 179 179 179 179 179 179 179 179 208 208 208 208 208 208 208 287 287 287 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 101 101 101 116 116 116 116 179 179 179 179 189 189 189 189 340 340 340 340 340 340 340 340 179 179 179 179 179 69 69 69 69 69 69 69 277 277 277 277 277 277 280 280 280 280 280 280 280 280 187 187 187 187 232 232 232 119 119 119 119 204 204 204 204 335 335 335 335 335 335 335 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 116 116 116 116 47 47 47 328 328 328 328 119 119 119 52 52 52 52 52 279 279 279 279 279 279 279 279 279 279 279 279 279 229 229 229 229 229 229 229 229 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 224 224 224 224 224 224 224 224 1 1 1 107 107 107 107 107 107 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 275 275 275 275 275 193 193 193 193 329 329 329 329 329 329 144 144 144 144 144 179 179 179 179 179 179 245 245 245 245 245 245 245 245 245 245 289 289 289 289 289 289 289 289 289 289 289 289 289 133 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 116 331 331 331 331 133 133 133 133 133 133 233 233 233 233 233 288 288 288 288 288 247 247 247 247 247 247 247 247 247 247 329 329 329 329 144 144 144 144 144 144 287 287 287 287 287 287 287 188 188 188 188 188 119 119 119 119 52 52 52 52 52 279 279 279 279 279 279 279 289 289 289 289 289 289 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 49 49 49 232 232 232 232 179 179 179 179 179 179 179 179 85 85 85 85 85 85 85 85 85 85 85 85 85 85 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 52 52 52 52 52 52 52 223 223 223 223 223 223 223 223 69 69 69 69 69 69 69 69 69 69 69 69 69 236 236 236 236 236 236 236 236 236 236 236 271 271 271 271 271 271 271 271 271 225 225 225 225 225 225 37 37 37 37 37 37 37 37 37 37 37 289 289 289 173 173 173 173 173 173 173 173 173 73 73 73 73 73 277 277 277 277 277 228 228 228 228 228 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 1 1 1 67 67 67 67 67 67 67 67 67 67 67 225 225 225 225 225 229 229 229 229 229 253 253 253 253 253 253 281 281 281 281 281 288 288 288 115 115 115 115 189 189 189 189 189 341 341 341 341 341 341 341 341 341 149 149 149 149 149 149 149 149 149 149 289 289 289 289 289 189 189 189 189 189 189 189 189 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 204 204 204 204 204 204 204 204 247 247 247 247 247 247 247 247 247 247 247 247 247 233 233 233 233 225 225 225 225 225 204 204 204 204 204 204 204 204 204 223 223 223 223 223 223 193 193 193 193 329 329 329 329 329 189 189 189 189 236 236 236 236 236 236 236 219 219 219 219 219 219 219 277 277 277 277 277 277 209 209 209 209 209 113 113 113 113 113 113 113 113 113 113 144 144 144 144 144 144 187 187 187 187 187 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 279 279 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 1 1 1 107 107 107 107 107 209 209 209 209 209 209 209 209 209 209 189 189 189 189 189 236 236 236 236 236 236 236 236 50 50 50 50 50 175 175 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 179 179 179 179 179 320 320 320 320 320 331 331 331 331 331 331 331 49 49 49 340 340 340 340 340 279 279 279 279 279 279 279 279 279 193 193 193 193 193 289 289 289 289 189 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 67 67 67 67 67 232 232 232 232 232 50 50 50 50 50 50 271 271 271 271 271 271 271 271 271 271 271 271 101 101 101 101 101 101 101 101 101 101 101 101 101 224 224 224 224 224 224 47 47 47 47 328 328 328 328 283 283 283 283 283 283 283 283 283 283 283 283 193 193 193 193 193 193 237 237 237 237 237 237 237 237 177 177 177 177 49 49 49 49 225 225 225 225 225 225 225 340 340 340 340 340 340 35 35 35 35 288 288 288 119 119 119 119 119 119 204 204 204 204 204 127 127 127 221 221 221 221 221 221 221 221 221 221 281 281 281 281 281 289 289 289 289 289 289 289 289 289 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 209 209 228 228 228 228 228 228 228 228 131 131 131 131 131 131 131 131 131 131 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 337 337 337 337 337 337 337 337 316 316 316 316 316 316 316 316 316 316 107 107 107 107 107 107 107 107 133 133 133 133 277 277 277 277 277 277 277 277 277 277 277 277 225 225 225 225 225 225 204 204 204 204 231 231 231 231 231 231 231 231 231 231 249 249 249 249 249 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 289 189 189 189 236 236 236 236 236 236 236 236 119 119 119 49 49 49 288 288 288 288 191 191 191 191 288 288 288 288 288 288 331 331 331 331 331 331 331 331 331 331 331 331 21 21 21 21 21 340 340 340 340 340 340 340 340 50 50 50 50 50 175 175 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 101 101 101 101 101 101 101 101 101 101 101 101 101 117 117 117 117 117 49 49 49 49 225 225 225 225 225 116 116 116 116 116 116 116 271 271 271 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 288 288 288 179 179 179 179 179 144 144 144 144 144 144 131 131 131 131 340 340 340 340 340 340 340 340 340 340 340 340 219 219 219 219 219 219 219 219 333 333 333 333 193 193 193 193 221 221 221 221 221 221 221 221 221 225 225 225 225 225 204 204 204 204 204 204 131 131 131 131 340 340 340 340 340 340 340 340 271 271 271 271 271 271 271 21 21 21 21 21 21 21 21 281 281 281 281 281 281 281 281 49 49 49 49 109 109 109 49 49 49 49 224 224 224 224 331 331 331 331 331 189 189 189 121 121 121 121 121 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 223 223 223 223 223 223 305 305 305 305 221 221 221 221 221 221 221 221 189 189 189 189 236 236 236 236 236 236 236 236 35 35 35 35 35 35 288 288 288 288 179 179 179 179 179 179 179 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 116 179 179 179 179 179 179 179 179 179 208 208 208 208 208 208 208 223 223 223 223 223 223 223 305 305 305 305 305 305 305 221 221 221 221 221 221 221 221 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 208 208 208 208 219 219 219 219 219 219 219 219 305 305 305 116 116 116 179 179 179 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 277 277 277 277 277 117 117 117 117 117 225 225 225 225 225 204 204 204 179 179 179 37 37 37 328 328 328 328 171 171 171 171 171 171 171 171 171 171 171 171 165 165 165 165 165 165 165 225 225 225 225 225 225 225 225 116 116 116 287 287 287 287 287 287 48 48 48 48 231 231 231 231 231 231 231 231 231 231 231 249 249 249 249 249 249 249 249 249 289 289 289 289 289 189 189 189 189 189 189 189 189 280 280 280 280 280 280 280 280 280 280 119 119 119 119 52 52 52 52 52 52 287 287 287 287 287 287 287 287 287 287 287 287 287 287 133 133 133 133 233 233 233 233 233 233 233 233 233 233 233 280 280 280 280 280 280 280 280 280 280 280 280 275 275 275 275 189 189 189 217 217 217 217 217 217 217 217 217 217 217 217 217 193 193 193 193 117 117 117 117 49 49 49 49 49 289 289 289 289 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 204 47 47 47 47 47 233 233 233 116 116 116 135 135 135 135 135 135 221 221 221 221 221 221 221 281 281 281 281 281 281 281 273 273 273 273 129 129 129 129 221 221 221 221 221 221 221 221 221 289 289 289 289 289 289 289 289 289 289 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 232 232 232 47 47 47 47 328 328 328 328 179 179 179 179 179 179 144 144 144 144 144 144 144 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 289 289 289 289 289 49 49 49 49 49 49 289 289 289 289 289 289 289 289 289 289 289 325 325 325 325 325 325 325 325 116 116 116 116 116 35 35 35 35 35 233 233 233 233 116 116 116 187 187 187 187 221 221 221 221 221 221 281 281 281 281 281 281 281 273 273 273 273 277 277 277 133 133 133 133 285 285 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 331 331 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 340 340 279 279 279 279 279 279 193 193 193 193 193 289 289 289 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 119 119 119 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 331 331 331 331 331 331 331 331 331 331 165 165 165 165 165 165 165 165 165 165 289 289 289 289 289 189 189 189 189 189 236 236 236 236 236 236 236 236 236 171 171 171 171 171 171 171 171 171 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 229 229 229 229 229 229 229 229 229 293 293 293 293 293 293 293 293 293 293 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 1 1 1 67 67 67 67 67 67 67 67 67 67 276 276 276 276 276 276 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 229 229 229 229 229 229 109 109 109 109 109 25 25 25 25 25 117 117 117 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 233 233 116 116 116 116 116 116 116 116 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 193 193 193 193 193 233 233 233 233 233 233 233 280 280 280 280 280 280 279 279 279 279 279 279 279 279 193 193 193 193 193 289 289 289 289 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 35 35 35 233 233 233 116 116 116 116 331 331 331 331 331 331 165 165 165 165 165 165 165 165 165 289 289 289 289 189 189 189 189 189 189 236 236 236 236 236 236 331 331 331 331 331 49 49 49 49 340 340 340 340 119 119 119 119 119 204 204 204 204 204 204 204 204 247 247 247 247 247 247 247 247 247 233 233 233 233 233 233 225 225 225 225 225 204 204 204 204 204 204 291 291 291 291 291 291 291 291 291 291 193 193 193 193 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 287 287 287 287 287 287 188 188 188 188 188 115 115 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 320 320 320 320 215 215 215 215 215 215 215 215 215 215 53 53 53 53 53 53 53 53 53 53 281 281 281 281 281 281 281 281 288 288 288 119 119 119 133 133 133 133 133 133 133 133 133 133 133 133 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 279 279 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 1 1 1 47 47 47 47 47 233 233 233 233 116 116 116 116 116 116 331 331 331 331 331 331 331 331 165 165 165 165 165 165 165 165 165 165 289 289 289 289 289 189 189 189 189 189 116 116 116 116 116 116 116 116 331 331 331 331 331 189 189 189 292 292 292 292 292 292 292 292 292 292 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 179 179 179 179 179 179 179 179 179 179 179 144 144 144 144 227 227 227 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 47 47 47 233 233 233 116 116 116 116 116 116 116 116 116 227 227 227 227 227 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 316 316 187 187 187 187 233 233 233 233 233 233 221 221 221 221 221 221 221 221 221 85 85 85 85 85 85 85 85 85 233 233 233 233 233 233 289 289 289 289 289 145 145 145 145 145 116 116 116 119 119 119 52 52 52 52 52 279 279 279 279 279 279 289 289 289 289 289 289 289 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 233 233 233 229 229 229 229 229 229 229 41 41 41 41 41 41 41 41 41 281 281 281 281 281 281 289 289 289 289 289 289 289 289 144 144 144 144 144 223 223 223 223 223 223 223 223 223 223 223 21 21 21 21 21 21 21 221 221 221 221 221 221 221 221 189 189 189 189 236 236 236 236 236 236 236 236 236 51 51 51 51 51 51 51 51 272 272 272 272 272 119 119 119 119 119 52 52 52 52 52 287 287 287 287 287 287 287 287 287 193 193 193 193 193 221 221 221 221 221 221 49 49 49 49 288 288 288 288 288 67 67 67 67 67 67 67 67 67 67 67 67 173 173 173 173 173 173 173 173 49 49 49 49 49 49 49 280 280 280 280 280 280 271 271 271 271 271 271 271 271 277 277 277 277 133 133 133 133 273 273 273 273 273 273 277 277 277 277 49 49 49 49 49 289 289 289 289 289 289 289 73 73 73 73 73 73 277 277 277 277 277 277 204 204 204 204 204 287 287 287 287 287 188 188 188 188 175 175 175 175 175 175 175 175 249 249 249 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 189 236 236 236 236 236 236 179 179 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 228 228 228 228 228 228 228 228 228 171 171 171 171 171 171 171 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 53 273 273 273 273 273 273 273 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 116 35 35 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 288 288 288 288 288 288 187 187 187 228 228 228 228 228 228 187 187 187 187 187 172 172 172 172 119 119 119 119 119 48 48 48 48 48 48 171 171 171 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 101 328 328 328 328 328 291 291 291 291 291 291 291 291 291 291 149 149 149 149 149 149 149 117 117 117 117 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 287 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 331 331 331 331 305 305 305 305 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 321 321 321 321 321 321 321 321 321 321 321 232 232 232 232 107 107 107 107 107 204 204 204 204 204 47 47 47 47 47 47 47 47 225 225 225 225 225 225 225 69 69 69 69 69 69 69 69 69 69 69 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 48 48 48 48 48 48 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 101 101 328 328 328 328 328 328 291 291 291 291 291 291 291 149 149 149 149 149 149 117 117 117 117 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 287 277 277 277 277 165 165 165 165 165 165 165 165 165 232 232 232 232 179 179 179 37 37 37 37 37 340 340 340 340 340 340 340 340 107 107 107 107 107 107 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 232 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 232 232 232 232 232 232 232 232 35 35 35 35 35 35 35 35 233 233 233 233 233 233 116 116 116 116 116 175 175 175 175 175 175 175 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 232 232 232 232 232 232 232 232 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 172 172 172 172 172 172 172 172 47 47 47 47 232 232 232 232 83 83 83 83 83 83 83 83 83 83 83 83 276 276 276 276 276 276 276 276 276 47 47 47 47 47 177 177 177 177 177 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 145 145 145 145 116 116 116 116 116 119 119 119 119 119 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 107 107 107 107 107 107 277 277 277 277 277 193 193 193 193 193 281 281 281 281 281 281 281 281 220 220 220 220 220 47 47 47 47 173 173 173 173 173 173 173 173 173 193 193 193 193 285 285 285 285 285 285 285 49 49 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 107 53 53 53 53 53 53 53 53 53 53 288 288 288 288 119 119 119 119 133 133 133 276 276 276 276 276 276 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 50 50 50 50 50 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 49 49 49 49 233 233 233 233 233 233 217 217 217 217 144 144 144 144 144 144 144 144 144 115 115 115 115 115 115 115 277 277 277 277 277 21 21 21 21 21 21 21 21 273 273 273 273 273 273 288 288 288 288 288 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 171 171 171 171 144 144 144 144 335 335 335 335 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 50 50 223 223 223 223 193 193 193 193 289 289 289 49 49 49 224 224 224 224 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 209 209 209 209 209 340 340 340 340 340 340 279 279 279 279 279 279 279 193 193 193 289 289 289 289 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 119 119 119 133 133 133 133 276 276 276 276 276 276 276 276 19 19 19 19 19 19 232 232 232 232 119 119 119 48 48 48 283 283 283 283 283 283 283 283 283 283 283 193 193 193 193 193 237 237 237 237 237 237 177 177 177 177 49 49 49 49 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 35 35 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 281 288 288 288 288 288 179 179 179 144 144 144 144 287 287 287 48 48 48 48 48 175 175 175 175 175 175 248 248 248 248 248 248 248 248 248 248 248 248 248 248 187 187 187 187 187 187 233 233 233 233 233 233 233 289 289 289 289 48 48 48 119 119 119 119 119 48 48 48 48 48 48 48 223 223 223 223 223 165 165 165 165 165 165 165 165 117 117 117 117 117 205 205 205 205 205 205 205 205 340 340 340 340 340 340 340 340 331 331 331 331 331 331 165 165 165 165 165 165 165 289 289 289 289 289 189 189 189 189 236 236 236 236 236 236 236 236 236 275 275 275 275 275 275 321 321 321 321 228 228 228 228 228 228 228 228 107 107 107 107 107 107 53 53 53 53 53 53 53 53 288 288 288 283 283 283 283 283 283 283 283 283 283 208 208 208 208 187 187 187 187 187 233 233 233 233 233 233 233 233 173 173 173 173 173 173 173 173 173 69 69 69 69 69 277 277 277 277 277 229 229 229 229 116 116 116 227 227 227 227 227 208 208 208 208 208 208 208 208 175 175 175 175 175 175 175 277 277 277 277 277 277 165 165 165 165 165 165 165 165 165 165 329 329 329 329 329 329 329 329 329 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 37 37 37 37 37 288 288 288 288 283 283 283 283 283 283 283 208 208 208 208 208 271 271 271 271 271 277 277 277 49 49 49 49 49 49 173 173 173 173 173 173 149 149 149 149 149 149 116 116 116 116 287 287 287 287 188 188 188 188 279 279 279 279 279 289 289 289 289 289 289 164 164 164 164 164 164 83 83 83 83 83 83 83 83 83 83 289 289 289 289 289 289 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 209 209 209 209 209 209 209 209 209 340 340 340 340 340 340 340 50 50 50 50 50 50 50 50 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 102 102 102 102 102 102 102 102 283 283 283 283 283 283 283 283 283 305 305 305 305 305 116 116 116 116 116 279 279 279 279 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 228 228 228 228 231 231 231 231 231 21 21 21 21 21 288 288 288 288 187 187 187 187 221 221 221 221 221 221 281 281 281 281 273 273 273 273 273 273 133 133 133 133 133 221 221 221 221 221 221 289 289 289 289 289 189 189 189 189 236 236 236 236 236 236 50 50 50 50 50 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 116 116 116 116 116 116 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 107 107 107 107 107 107 107 225 225 225 225 225 225 225 225 37 37 37 37 237 237 237 237 237 237 221 221 221 221 221 221 221 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 289 289 289 289 289 289 280 280 280 280 50 50 50 50 50 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 99 99 99 99 99 99 99 99 99 99 99 99 328 328 328 328 328 328 328 219 219 219 219 219 219 219 219 219 219 53 53 53 228 228 228 228 228 228 228 228 228 228 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 69 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 208 283 283 283 283 283 283 283 283 305 305 305 305 305 116 116 116 116 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 179 179 179 179 179 179 179 179 179 179 179 179 209 209 209 209 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 340 340 39 39 39 39 39 39 39 39 39 39 39 39 39 225 225 225 225 225 49 49 49 49 49 49 177 177 177 177 177 177 177 341 341 341 341 341 341 341 341 37 37 37 37 37 37 37 233 233 233 233 233 117 117 117 117 144 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 133 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 144 144 144 144 144 144 144 144 144 144 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 287 287 287 287 287 188 188 188 188 107 107 107 107 107 107 107 107 277 277 277 277 193 193 193 193 193 236 236 236 236 236 236 179 179 179 179 193 193 193 193 228 228 228 228 228 228 228 228 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 329 144 144 144 144 144 171 171 171 171 171 171 171 171 145 145 145 145 228 228 228 228 231 231 231 231 231 231 231 249 249 249 249 249 249 249 329 329 329 329 48 48 48 48 48 279 279 279 279 279 279 279 279 279 221 221 221 221 221 249 249 249 249 249 249 249 249 285 285 285 285 285 285 285 285 285 285 285 48 48 48 48 48 48 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 276 276 276 276 276 227 227 227 227 227 227 227 208 208 208 208 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 48 48 48 48 48 279 279 279 279 279 279 279 279 289 289 289 289 289 289 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 49 49 49 49 233 233 233 233 229 229 229 229 229 229 41 41 41 41 41 41 41 41 41 41 41 281 281 281 281 281 281 281 281 289 289 289 289 289 289 144 144 144 144 144 144 144 144 331 331 331 331 331 331 331 193 193 193 193 281 281 281 281 281 281 281 281 281 49 49 49 49 49 225 225 225 225 225 225 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 175 175 175 175 175 175 175 175 175 133 133 133 133 133 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 119 119 119 119 119 133 133 133 133 133 277 277 277 277 277 277 340 340 340 340 340 279 279 279 279 279 279 279 279 53 53 53 53 53 53 53 228 228 228 228 228 228 227 227 227 227 189 189 189 189 189 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 165 165 165 165 165 165 165 165 165 165 165 165 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 281 189 189 189 189 340 340 340 340 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 133 133 233 233 233 233 233 233 281 281 281 281 281 281 281 144 144 144 144 144 144 219 219 219 219 219 219 219 219 165 165 165 165 165 165 165 165 165 228 228 228 228 228 228 228 228 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 172 119 119 119 119 52 52 52 52 287 287 287 287 287 287 287 287 277 277 277 277 165 165 165 165 165 165 165 232 232 232 232 232 232 331 331 331 331 331 189 189 189 189 292 292 292 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 47 47 47 47 233 233 233 233 116 116 116 175 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 328 328 328 328 179 179 179 179 179 179 179 144 144 144 144 144 144 144 187 187 187 187 187 233 233 233 233 289 289 289 289 289 48 48 48 227 227 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 111 111 111 111 111 111 111 111 111 111 111 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 277 277 277 216 216 216 216 216 216 216 216 216 216 216 216 216 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 133 116 116 116 116 335 335 335 335 335 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 320 320 320 47 47 47 47 47 47 233 233 233 116 116 116 335 335 335 69 69 69 69 69 69 69 69 276 276 276 276 276 279 279 279 279 279 279 279 279 279 279 279 193 193 193 193 193 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 144 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 144 144 144 144 144 144 47 47 47 47 47 117 117 117 117 117 117 117 21 21 21 21 21 21 21 21 21 21 21 273 273 273 273 289 289 289 289 189 189 189 189 236 236 236 236 236 236 179 179 179 179 179 179 148 148 148 148 148 148 148 148 148 148 148 171 171 171 171 171 171 171 145 145 145 145 228 228 228 228 228 47 47 47 232 232 232 232 232 232 232 67 67 67 67 67 67 67 67 67 277 277 277 277 277 173 173 173 173 173 173 173 173 49 49 49 232 232 232 232 47 47 47 47 47 47 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 119 119 119 49 49 49 49 288 288 288 288 288 288 335 335 335 335 335 335 320 320 320 320 320 320 331 331 331 331 331 305 305 305 305 116 116 116 107 107 107 107 107 204 204 204 204 204 204 204 47 47 47 47 47 47 225 225 225 225 225 225 225 225 69 69 69 69 69 69 69 236 236 236 236 236 236 236 236 171 171 171 171 171 171 171 144 144 144 179 179 179 179 179 179 148 148 148 148 148 148 148 148 271 271 271 271 271 271 271 271 271 277 277 277 277 133 133 133 133 341 341 341 341 341 341 341 49 49 49 49 233 233 233 233 233 289 289 289 289 289 289 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 289 289 289 289 289 289 280 280 280 280 280 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 102 102 102 102 102 102 102 102 102 102 102 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 47 47 47 47 47 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 102 102 102 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 179 179 179 37 37 37 37 37 37 329 329 329 329 49 49 49 49 232 232 232 232 175 175 175 175 175 175 175 21 21 21 21 21 21 288 288 288 288 288 131 131 131 233 233 233 233 233 233 204 204 204 204 204 227 227 227 227 227 227 227 227 227 69 69 69 69 69 69 69 276 276 276 276 276 276 276 67 67 67 67 67 67 67 67 67 277 277 277 277 277 173 173 173 173 173 173 173 173 49 49 49 49 49 233 233 233 233 233 233 233 340 340 340 340 340 219 219 219 219 219 49 49 49 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 209 209 209 209 209 209 209 209 209 225 225 225 225 225 225 225 225 225 116 116 116 116 116 179 179 179 193 193 193 193 277 277 277 277 277 277 277 277 277 49 49 49 49 109 109 109 109 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 89 289 289 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 249 249 249 249 249 249 249 249 249 233 233 233 233 288 288 288 288 55 55 55 55 55 55 233 233 233 233 233 117 117 117 117 145 145 145 145 145 145 281 281 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 233 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 116 116 116 116 116 116 116 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 337 337 337 337 316 316 316 316 316 316 316 179 179 179 179 179 179 179 179 179 179 133 133 133 133 133 225 225 225 225 225 225 273 273 273 273 273 273 273 225 225 225 225 49 49 49 49 49 49 281 281 281 281 281 281 281 281 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 193 193 193 193 193 285 285 285 285 285 285 285 285 285 285 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 119 119 119 119 49 49 49 49 49 288 288 288 288 288 288 288 227 227 227 227 227 17 17 17 277 277 277 277 277 277 277 277 193 193 193 193 193 193 225 225 225 225 225 225 225 225 48 48 48 48 48 331 331 331 331 331 331 331 49 49 49 49 49 340 340 340 340 340 35 35 35 35 35 288 288 288 288 288 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 233 233 233 233 233 233 233 116 116 116 287 287 287 287 287 188 188 188 219 219 219 219 219 219 219 219 219 219 219 219 249 249 249 249 249 249 249 249 249 272 272 272 272 272 272 272 272 272 331 331 331 189 189 189 120 120 120 119 119 119 52 52 52 279 279 279 279 279 279 279 279 197 197 197 197 197 113 113 113 113 113 113 113 113 317 317 317 317 317 317 317 317 317 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 133 133 133 133 224 224 224 224 224 224 224 224 335 335 335 335 335 335 335 335 335 321 321 321 321 116 116 116 116 116 116 107 107 107 107 107 107 133 133 133 133 289 289 289 289 289 144 144 144 144 144 144 219 219 219 219 219 219 333 333 333 333 133 133 133 133 281 281 281 281 281 113 113 113 113 113 113 113 113 49 49 49 232 232 232 119 119 119 52 52 52 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 116 116 116 116 119 119 119 52 52 52 52 52 52 279 279 279 279 279 279 289 289 289 289 289 289 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 49 49 49 232 232 232 227 227 227 227 227 227 227 37 37 37 37 37 37 37 281 281 281 281 281 289 289 289 289 289 289 144 144 144 219 219 219 219 219 219 219 219 219 219 133 133 133 133 133 277 277 277 277 277 277 277 277 225 225 225 225 49 49 49 49 49 49 281 281 281 281 281 281 281 281 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 133 133 133 133 133 133 133 276 276 276 276 276 276 279 279 279 279 279 279 279 279 279 279 164 164 164 164 164 164 164 164 164 164 164 283 283 283 283 283 283 283 283 283 209 209 209 209 224 224 224 224 224 224 107 107 107 107 107 107 204 204 204 204 204 204 204 204 163 163 163 163 163 163 109 109 109 109 49 49 49 224 224 224 287 287 287 287 287 287 320 320 320 320 320 187 187 187 187 187 221 221 221 221 221 221 281 281 281 281 281 281 273 273 273 273 273 225 225 225 225 225 225 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 209 209 209 209 209 340 340 340 340 340 340 340 340 175 175 175 175 175 175 175 21 21 21 288 288 288 288 288 50 50 50 50 50 50 287 287 287 287 287 287 287 287 287 287 287 53 53 53 53 53 53 236 236 236 236 236 236 236 47 47 47 328 328 328 328 328 179 179 179 179 179 144 144 144 144 144 144 144 144 144 144 144 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 232 232 232 232 232 232 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 289 289 289 289 289 289 289 280 280 280 279 279 279 279 279 279 279 279 279 149 149 149 149 149 149 149 149 149 149 149 289 289 289 289 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 109 109 109 204 204 204 204 204 204 204 119 119 119 119 119 164 164 164 164 164 164 164 164 331 331 331 331 331 331 331 331 331 331 144 144 144 144 144 83 83 83 83 83 83 83 83 288 288 288 288 288 47 47 47 328 328 328 328 328 328 328 328 328 107 107 107 107 107 107 107 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 340 340 340 340 340 340 340 47 47 47 47 328 328 328 119 119 119 119 52 52 52 107 107 107 107 107 277 277 277 277 277 277 37 37 37 37 37 37 37 37 37 233 233 233 233 116 116 116 335 335 335 335 335 320 320 320 320 320 320 320 331 331 331 331 331 331 331 331 331 21 21 21 21 233 233 233 233 233 289 289 289 289 289 49 49 49 49 49 49 49 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 208 208 208 208 208 208 208 331 331 331 331 331 331 331 331 331 331 69 69 69 69 69 69 69 69 69 69 69 221 221 221 221 221 288 288 288 288 288 288 288 288 288 1 1 1 215 215 215 215 215 215 215 215 215 215 69 69 69 69 69 69 69 69 233 233 233 233 233 289 289 289 289 289 49 49 49 225 225 225 225 225 204 204 204 204 204 204 204 204 47 47 47 47 47 47 47 333 333 333 333 333 333 333 333 333 333 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 107 107 209 209 209 209 209 209 209 209 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 179 179 179 179 179 179 179 179 179 53 53 53 53 237 237 237 237 237 237 237 237 237 177 177 177 177 277 277 277 277 277 277 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 116 116 116 116 119 119 119 204 204 204 204 204 204 204 47 47 47 47 233 233 233 233 233 233 173 173 173 173 173 173 173 173 173 69 69 69 69 277 277 277 277 277 277 113 113 113 113 113 113 49 49 49 233 233 233 49 49 49 49 49 49 288 288 288 288 288 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 337 337 337 337 337 337 316 316 316 316 316 316 316 331 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 223 223 223 223 223 223 223 133 133 133 133 133 133 133 173 173 173 173 173 288 288 288 287 287 287 287 188 188 188 188 188 115 115 115 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 331 331 331 331 193 193 193 193 112 112 112 112 112 112 112 112 112 112 331 331 331 49 49 49 340 340 340 340 340 340 340 179 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 277 277 277 277 277 117 117 117 144 144 144 144 144 144 171 171 171 171 171 171 171 144 144 144 144 179 179 179 179 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 228 228 228 228 228 228 228 228 228 228 228 228 228 119 119 119 119 119 49 49 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 107 107 107 107 107 107 193 193 193 193 193 193 193 193 277 277 277 277 277 277 277 117 117 117 117 189 189 189 189 236 236 236 236 236 236 236 236 236 50 50 50 50 50 50 223 223 223 223 223 223 223 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 49 49 49 232 232 232 232 187 187 187 187 232 232 232 187 187 187 187 187 187 187 289 289 289 289 289 289 280 280 280 280 280 280 280 280 280 115 115 115 115 115 115 115 115 133 133 133 133 133 133 133 133 133 133 133 133 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 69 69 69 69 69 69 69 69 69 69 220 220 220 220 220 220 220 220 220 220 220 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 50 50 50 50 50 50 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 289 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 233 233 233 233 216 216 216 216 216 216 216 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 1 1 1 47 47 47 47 47 47 47 232 232 232 232 232 232 232 232 232 232 232 232 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 173 173 173 173 173 173 173 173 173 173 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 116 116 116 115 115 115 189 189 189 189 189 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 37 37 233 233 233 233 233 116 116 116 116 47 47 47 47 328 328 328 328 328 179 179 179 179 179 179 179 179 144 144 144 144 144 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 100 100 100 100 100 100 100 100 100 100 100 100 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 331 331 331 53 53 53 53 53 53 341 341 341 341 49 49 49 49 233 233 233 288 288 288 50 50 50 50 50 107 107 107 107 107 107 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 264 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 293 293 293 337 337 337 337 337 337 316 316 316 316 316 316 316 316 316 316 316 175 175 175 175 175 175 175 175 175 277 277 277 277 277 277 277 277 277 277 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 233 233 233 233 233 116 116 116 116 116 116 187 187 187 187 232 232 232 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 273 273 273 273 273 193 193 193 277 277 277 277 277 277 277 277 277 277 277 277 277 277 277 189 189 189 189 189 288 288 288 288 131 131 131 131 131 131 340 340 340 340 179 179 179 179 208 208 208 208 208 208 287 287 287 287 287 287 287 287 287 287 287 149 149 149 149 149 149 149 149 149 149 149 149 149 149 233 233 233 233 116 116 116 116 47 47 47 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 288 47 47 47 233 233 233 233 233 116 116 116 116 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 53 53 53 53 53 53 53 173 173 173 173 173 173 173 49 49 49 49 225 225 225 225 225 225 225 225 225 225 225 116 116 116 1 1 1 1 1 215 215 215 215 215 215 215 215 215 215 215 215 133 133 133 133 133 133 233 233 233 233 233 233 233 289 289 289 289 289 289 225 225 225 225 204 204 204 204 204 204 204 204 115 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 119 119 119 119 52 52 52 271 271 271 271 271 271 271 271 225 225 225 225 225 225 37 37 37 37 37 37 37 289 289 289 289 289 289 289 173 173 173 173 173 173 173 73 73 73 73 277 277 277 277 277 228 228 228 228 228 228 228 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 277 277 277 277 277 117 117 117 117 117 117 340 340 340 340 340 179 179 179 179 179 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 179 179 179 179 179 179 37 37 37 37 37 116 116 116 107 107 107 107 107 193 193 193 193 193 232 232 232 232 232 232 331 331 331 331 331 331 21 21 21 21 21 21 21 21 21 113 113 113 113 113 113 113 189 189 189 189 189 236 236 236 236 236 236 179 179 179 179 179 179 179 193 193 193 193 228 228 228 228 228 131 131 131 131 131 131 131 131 131 131 131 131 329 329 329 329 329 329 329 144 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 193 193 193 193 233 233 233 233 233 233 233 233 280 280 280 280 280 179 179 179 179 179 208 208 208 179 179 179 37 37 37 116 116 116 116 116 271 271 271 271 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 288 288 288 288 179 179 179 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 283 283 283 283 283 283 208 208 208 208 208 208 208 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 116 116 116 179 179 179 179 179 179 179 179 148 148 148 148 148 148 148 148 148 148 148 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 340 340 340 340 340 340 340 340 340 19 19 19 19 19 19 19 232 232 232 232 232 179 179 179 179 179 179 193 193 193 193 193 228 228 228 228 228 228 231 231 231 231 231 231 231 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 316 316 316 316 316 331 331 331 331 331 49 49 49 49 49 340 340 340 340 340 340 340 340 340 231 231 231 231 231 21 21 21 21 21 21 21 21 288 288 288 288 288 288 288 223 223 223 223 223 223 223 305 305 305 305 221 221 221 221 221 221 221 189 189 189 189 236 236 236 236 236 236 236 236 236 236 35 35 35 35 35 35 35 35 35 288 288 288 288 179 179 179 179 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 111 111 111 111 111 111 111 111 111 111 111 111 111 101 101 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 116 116 116 47 47 47 47 328 328 328 328 328 47 47 47 47 109 109 109 109 109 109 109 85 85 85 85 85 85 288 288 288 288 288 187 187 187 225 225 225 225 225 225 225 225 225 225 225 225 133 133 133 133 329 329 329 329 329 329 329 329 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 175 175 175 175 175 175 175 175 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 109 109 109 116 116 116 116 116 116 116 187 187 187 232 232 232 232 232 50 50 50 50 327 327 327 327 327 327 133 133 133 133 133 133 277 277 277 277 277 277 277 277 277 204 204 204 204 204 204 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 69 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 327 327 327 327 327 327 327 327 327 327 327 133 133 133 133 133 277 277 277 277 277 277 277 277 277 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 327 327 327 327 327 327 327 327 133 133 133 133 133 133 133 277 277 277 277 277 277 277 204 204 204 204 204 204 204 204 204 204 204 204 204 204 51 51 51 51 51 51 51 51 51 51 51 177 177 177 177 177 177 177 225 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 115 115 115 115 115 115 115 277 277 277 277 277 133 133 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 280 280 280 47 47 47 47 328 328 328 328 328 328 328 335 335 335 335 335 335 335 335 335 133 133 133 133 133 133 225 225 225 225 225 225 245 245 245 245 245 245 245 245 245 245 245 189 189 189 189 189 284 284 284 284 284 284 284 284 284 284 284 284 284 175 175 175 175 175 175 277 277 277 277 277 277 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 331 331 331 331 331 331 331 331 331 331 331 193 193 193 233 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 281 281 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 331 331 331 331 331 331 331 331 331 331 69 69 69 69 69 69 276 276 276 276 276 276 50 50 50 50 50 50 171 171 171 171 171 171 171 171 171 171 171 171 171 165 165 165 165 165 165 165 165 165 165 165 165 165 117 117 117 117 117 189 189 189 189 189 189 116 116 116 116 116 116 116 107 107 107 107 107 107 107 107 107 277 277 277 277 277 277 277 85 85 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 165 165 225 225 225 225 225 225 225 225 144 144 144 144 144 144 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 47 47 47 47 47 47 47 47 47 47 47 233 233 233 233 116 116 116 107 107 107 107 107 107 189 189 189 189 233 233 233 233 233 233 209 209 209 209 209 209 209 209 209 209 209 292 292 292 292 292 292 292 292 119 119 119 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 221 221 221 221 221 221 221 281 281 281 281 281 281 281 289 289 289 289 289 289 289 133 133 133 133 133 133 133 233 233 233 233 233 233 117 117 117 117 117 189 189 189 236 236 236 236 236 236 236 236 236 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 179 179 179 179 179 179 179 179 179 179 144 144 144 144 144 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 331 331 331 331 144 144 144 144 144 144 144 287 287 287 287 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 107 107 107 107 107 107 107 277 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 117 117 117 117 117 117 340 340 340 340 340 340 47 47 47 47 47 328 328 328 327 327 327 327 327 327 327 133 133 133 133 133 277 277 277 277 277 277 277 277 204 204 204 204 204 204 204 204 204 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 193 193 193 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 115 115 115 115 115 115 197 197 197 197 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 117 117 117 117 117 49 49 49 49 49 117 117 117 117 117 117 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 275 275 275 275 275 275 275 275 275 275 275 275 275 275 133 133 133 133 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 179 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 144 144 144 144 144 144 171 171 171 171 171 171 171 171 171 165 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 280 331 331 331 331 331 49 49 49 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 229 229 229 229 229 229 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 47 47 47 233 233 233 233 233 233 233 116 116 116 116 116 116 291 291 291 291 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 225 225 225 225 225 225 225 281 281 281 281 281 281 281 281 281 281 281 244 244 244 244 244 244 244 244 244 244 227 227 227 227 227 227 227 227 227 53 53 53 53 53 53 53 112 112 112 112 112 112 112 112 112 171 171 171 171 171 171 171 171 171 171 277 277 277 133 133 133 133 221 221 221 221 221 221 221 221 49 49 49 49 49 225 225 225 225 225 225 225 225 225 225 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 144 144 144 227 227 227 227 227 227 227 227 227 227 227 227 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 331 331 331 49 49 49 49 340 340 340 340 340 340 340 223 223 223 223 223 223 223 223 223 21 21 21 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 277 277 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 1 1 1 47 47 47 47 47 47 47 47 233 233 233 116 116 116 116 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 331 331 331 331 331 331 331 148 148 148 179 179 179 179 179 179 179 179 144 144 144 144 144 144 144 144 144 144 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 331 331 331 331 193 193 193 193 193 112 112 112 112 112 112 112 112 112 112 223 223 223 223 223 223 223 305 305 305 305 305 221 221 221 221 221 221 288 288 288 288 288 288 288 288 288 288 288 288 175 175 175 175 175 175 277 277 277 277 277 277 209 209 209 209 209 209 209 209 209 209 209 209 209 232 232 232 232 232 187 187 187 187 232 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 228 228 228 228 228 228 228 228 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 101 101 101 289 289 289 289 289 289 280 280 280 280 47 47 47 233 233 233 116 116 116 227 227 227 227 227 227 227 321 321 321 321 321 321 321 321 321 321 321 321 321 321 117 117 117 117 117 117 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 233 233 116 116 116 116 116 116 175 175 175 175 175 175 277 277 277 277 277 277 277 277 277 164 164 164 164 164 164 164 164 164 164 164 164 191 191 191 191 191 191 191 232 232 232 232 232 232 51 51 51 51 51 51 51 51 121 121 121 121 121 121 121 121 145 145 145 145 145 145 145 145 145 145 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 248 248 171 171 171 171 171 171 171 171 21 21 21 21 21 21 21 276 276 276 276 276 276 276 119 119 119 119 204 204 204 204 204 204 204 67 67 67 67 67 67 67 67 67 67 277 277 277 277 277 117 117 117 49 49 49 233 233 233 137 137 137 277 277 277 277 277 204 204 204 204 204 204 204 47 47 47 47 47 109 109 109 109 109 109 341 341 341 341 341 341 341 341 149 149 149 149 149 149 149 149 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 232 232 232 232 187 187 187 187 187 221 221 221 221 221 281 281 281 281 289 289 289 289 289 289 289 277 277 277 277 277 69 69 69 69 69 277 277 277 277 277 117 117 117 49 49 49 233 233 233 137 137 137 137 137 137 137 277 277 277 277 277 277 277 204 204 204 204 204 204 204 47 47 47 47 109 109 109 109 109 109 341 341 341 341 341 341 341 341 149 149 149 149 149 149 149 149 149 149 329 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 288 288 288 288 179 179 179 179 37 37 37 328 328 328 328 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 119 119 119 119 49 49 49 288 288 288 288 119 119 119 52 52 52 52 52 52 52 111 111 111 111 111 111 111 111 111 111 111 111 111 111 193 193 193 193 193 232 232 232 232 232 232 232 232 232 331 331 331 49 49 49 49 340 340 340 340 340 340 340 340 340 340 327 327 327 327 327 327 133 133 133 133 277 277 277 277 277 277 277 204 204 204 204 204 204 204 204 204 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 265 265 265 265 265 265 265 265 265 233 233 233 233 233 289 289 289 289 289 289 289 289 289 189 189 189 189 116 116 116 116 116 47 47 47 233 233 233 233 116 116 116 116 271 271 271 271 271 277 277 277 277 49 49 49 49 233 233 233 233 233 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 49 49 49 49 49 288 288 288 288 288 119 119 119 119 48 48 48 48 48 107 107 107 107 107 107 107 107 107 193 193 193 193 193 193 193 176 176 176 176 176 176 176 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 340 340 340 340 340 340 340 340 331 331 331 331 331 144 144 144 144 144 171 171 171 171 171 171 171 171 171 171 171 305 305 305 305 305 224 224 224 224 224 224 224 47 47 47 47 328 328 328 328 328 328 328 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 273 273 273 273 273 193 193 193 277 277 277 277 277 277 277 277 277 277 189 189 189 189 189 288 288 288 288 288 47 47 47 233 233 233 233 116 116 116 327 327 327 189 189 189 189 189 189 189 189 189 189 189 189 329 329 329 329 329 329 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 281 281 189 189 189 189 289 289 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 49 49 49 49 288 288 288 288 119 119 119 52 52 52 52 227 227 227 227 227 227 227 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 292 292 292 292 292 292 292 292 292 292 331 331 331 331 49 49 49 49 340 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 279 279 333 333 333 333 333 209 209 209 209 209 209 209 209 209 288 288 288 288 288 288 223 223 223 223 223 223 223 223 193 193 193 193 193 193 193 193 273 273 273 273 273 273 273 273 288 288 288 288 288 288 47 47 47 233 233 233 116 116 116 187 187 187 187 221 221 221 221 221 221 221 281 281 281 281 281 281 281 273 273 273 273 273 277 277 277 133 133 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 281 189 189 189 189 189 189 189 189 189 189 189 328 328 328 328 328 328 328 328 328 328 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 49 49 49 49 288 288 288 288 288 288 119 119 119 52 52 52 52 52 171 171 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 69 69 69 69 277 277 277 277 277 181 181 181 181 181 181 181 181 181 129 129 129 129 129 129 129 129 129 129 129 116 116 116 116 116 116 116 116 116 116 331 331 331 331 331 331 49 49 49 49 49 340 340 340 340 340 340 340 340 340 340 107 107 107 107 107 107 107 107 277 277 277 277 277 277 277 277 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 116 116 116 116 116 47 47 47 47 233 233 233 233 116 116 116 116 116 116 171 171 171 171 171 171 171 171 171 171 171 171 305 305 305 305 305 305 305 305 305 305 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 187 187 187 232 232 232 232 232 283 283 283 283 283 283 283 283 283 283 283 283 283 283 69 69 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 19 19 19 19 19 19 19 19 19 19 19 276 276 276 276 276 276 276 276 115 115 115 115 115 115 189 189 189 189 189 281 281 281 281 281 281 281 281 281 281 281 281 149 149 149 149 149 149 149 149 149 149 233 233 233 233 189 189 189 189 189 189 236 236 236 236 236 236 236 236 187 187 187 187 187 221 221 221 221 221 221 221 221 221 221 281 281 281 289 289 289 289 289 277 277 277 277 277 69 69 69 277 277 277 277 277 277 117 117 117 49 49 49 233 233 233 137 137 137 137 137 137 277 277 277 204 204 204 47 47 47 47 109 109 109 109 109 341 341 341 341 341 341 341 341 341 149 149 149 149 149 149 149 149 149 149 149 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 288 288 288 179 179 179 37 37 37 328 328 328 328 328 328 219 219 219 219 49 49 49 49 49 49 233 233 233 233 233 221 221 221 221 221 221 221 221 221 221 221 225 225 225 225 321 321 321 321 321 321 321 321 117 117 117 117 117 189 189 189 189 189 189 189 189 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 49 49 49 49 340 340 340 340 340 340 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 223 223 223 223 223 223 223 223 321 321 321 321 321 321 321 321 321 117 117 117 117 49 49 49 49 221 221 221 221 221 277 277 277 277 277 49 49 49 49 281 281 281 281 281 281 281 281 281 225 225 225 225 225 204 204 204 204 204 204 204 47 47 47 47 47 173 173 173 173 173 173 173 173 173 173 277 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 293 337 337 337 337 337 337 316 316 316 316 316 316 316 316 179 179 179 179 179 179 179 179 179 179 89 89 89 89 89 89 89 89 89 133 133 133 133 133 133 133 133 133 329 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 279 279 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 133 133 133 277 277 277 277 277 277 277 277 277 277 277 277 116 116 116 119 119 119 119 119 204 204 204 204 204 63 63 63 63 63 63 63 63 277 277 277 277 277 277 277 277 117 117 117 117 117 117 117 117 209 209 209 209 209 209 209 209 209 209 209 224 224 224 224 224 224 224 224 47 47 47 47 328 328 328 328 328 279 279 279 279 279 279 279 279 273 273 273 273 273 273 273 273 209 209 209 209 209 209 221 221 221 221 221 189 189 189 189 189 236 236 236 236 236 236 236 236 171 171 171 171 171 171 171 171 171 171 171 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 281 281 281 281 281 281 281 281 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 171 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 276 276 276 276 276 276 276 131 131 131 131 340 340 340 340 340 340 279 279 279 279 279 279 279 279 321 321 321 321 321 321 321 232 232 232 232 232 131 131 131 340 340 340 340 283 283 283 283 283 283 283 208 208 208 208 208 208 219 219 219 219 219 219 49 49 49 49 233 233 233 233 233 221 221 221 221 221 221 221 221 221 225 225 225 225 225 321 321 321 321 321 321 117 117 117 117 117 189 189 189 189 189 116 116 116 116 116 119 119 119 49 49 49 288 288 288 179 179 179 179 179 179 208 208 208 208 208 208 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 229 229 229 229 229 189 189 189 189 236 236 236 236 236 236 236 287 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 179 179 179 179 179 179 179 148 148 148 148 148 148 148 148 148 148 148 148 148 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 305 305 305 305 305 116 116 116 116 116 51 51 51 51 51 51 51 51 51 51 51 272 272 272 272 272 272 272 272 272 272 272 272 272 272 272 1 1 1 1 1 1 1 1 1 1 1 1 1 175 175 175 175 175 277 277 277 277 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 273 273 273 273 273 273 189 189 189 189 189 236 236 236 236 236 236 236 331 331 331 331 189 189 189 189 292 292 292 292 292 292 292 292 331 331 331 331 331 331 331 331 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 232 232 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 107 107 107 107 107 107 277 277 277 277 277 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 233 233 233 233 233 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 52 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 233 233 233 233 233 233 233 233 233 117 117 117 117 49 49 49 49 49 224 224 224 224 224 47 47 47 47 328 328 328 328 328 50 50 50 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 283 37 37 37 37 37 37 37 37 37 109 109 109 109 109 109 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 247 247 247 247 247 247 225 225 225 225 225 225 225 225 225 225 225 116 116 116 116 116 116 171 171 171 171 171 171 171 171 171 171 171 171 171 37 37 37 37 37 37 37 37 37 37 285 285 285 285 285 285 285 285 285 285 49 49 49 49 233 233 233 233 233 116 116 116 116 116 116 219 219 219 219 219 219 219 219 219 219 219 21 21 21 21 21 277 277 277 277 273 273 273 273 273 49 49 49 49 49 49 288 288 288 288 107 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 176 176 176 176 176 176 176 176 176 176 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 204 204 204 204 204 204 204 204 51 51 51 51 51 51 51 51 51 51 51 51 121 121 121 121 121 121 121 121 144 144 144 144 144 144 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 179 179 179 179 179 179 179 133 133 133 133 133 133 225 225 225 225 225 225 225 225 116 116 116 116 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 287 287 287 287 287 188 188 188 188 179 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 279 279 279 279 279 279 279 49 49 49 49 273 273 273 273 273 273 273 249 249 249 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 335 335 335 320 320 320 320 320 320 320 19 19 19 276 276 276 276 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 289 289 289 289 289 144 144 144 144 144 227 227 227 227 227 227 227 37 37 37 37 37 37 293 293 293 293 293 337 337 337 337 316 316 316 316 316 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 293 293 293 293 293 293 293 293 109 109 109 109 109 109 109 145 145 145 145 145 145 288 288 288 288 47 47 47 328 328 328 328 328 175 175 175 175 175 175 277 277 277 209 209 209 209 209 209 232 232 232 232 232 232 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 49 49 49 49 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 116 116 116 116 116 187 187 187 232 232 232 232 50 50 50 50 50 271 271 271 271 271 271 189 189 189 189 221 221 221 221 221 221 221 221 221 221 221 221 221 221 337 337 337 337 337 337 321 321 321 321 321 321 225 225 225 225 337 337 337 337 337 337 337 145 145 145 145 145 225 225 225 225 225 225 204 204 204 204 204 204 204 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 225 225 225 225 225 193 193 193 193 193 193 193 193 193 193 193 193 193 193 276 276 276 276 276 276 276 276 276 276 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 333 333 333 333 333 209 209 209 209 209 209 209 288 288 288 288 288 288 327 327 327 327 327 327 327 327 265 265 265 265 265 265 265 265 265 265 265 265 265 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 228 228 228 228 228 228 228 327 327 327 327 327 133 133 133 277 277 277 277 277 277 277 204 204 204 204 204 204 175 175 175 175 175 225 225 225 225 225 225 37 37 37 37 37 37 116 116 116 287 287 287 287 188 188 188 188 279 279 279 279 279 279 279 279 279 279 279 208 208 208 208 208 208 335 335 335 335 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 331 331 331 331 49 49 49 49 340 340 340 340 340 340 340 107 107 107 189 189 189 189 189 189 177 177 177 177 177 177 177 193 193 193 193 193 233 233 233 189 189 189 236 236 236 236 236 236 287 287 287 287 188 188 188 188 107 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 47 47 47 47 47 173 173 173 173 173 173 173 173 173 277 277 277 277 165 165 165 165 165 165 165 165 165 116 116 116 116 335 335 335 335 320 320 320 320 320 320 331 331 331 331 331 331 331 149 149 149 149 149 233 233 233 288 288 288 288 288 219 219 219 219 219 219 219 219 219 53 53 53 53 53 229 229 229 229 229 189 189 189 236 236 236 236 236 236 171 171 171 171 171 171 171 171 171 69 69 69 276 276 276 276 227 227 227 227 227 227 227 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 179 179 179 37 37 37 116 116 116 116 116 227 227 227 227 227 227 227 165 165 165 165 165 165 116 116 116 116 51 51 51 51 51 51 51 51 272 272 272 272 272 227 227 227 227 100 100 100 100 100 100 100 100 227 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 49 49 49 288 288 288 288 187 187 187 187 172 172 172 172 172 335 335 335 335 320 320 320 320 320 115 115 115 115 115 115 115 193 193 193 193 193 117 117 117 117 117 117 49 49 49 49 232 232 232 219 219 219 219 219 219 219 219 219 219 53 53 53 53 228 228 228 228 228 228 228 228 171 171 171 171 171 171 144 144 144 144 144 227 227 227 227 227 227 208 208 208 208 208 287 287 287 287 287 287 287 188 188 188 188 231 231 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 331 331 331 331 331 331 305 305 305 117 117 117 49 49 49 233 233 233 233 288 288 288 107 107 107 107 107 208 208 208 208 208 208 208 50 50 50 50 50 107 107 107 107 107 107 107 193 193 193 288 288 288 288 288 47 47 47 47 47 47 173 173 173 173 173 173 173 173 173 173 173 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 165 165 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 191 191 191 288 288 288 288 331 331 331 305 305 305 305 116 116 116 107 107 107 107 107 208 208 208 208 208 208 208 208 208 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 53 53 53 53 53 53 329 329 329 329 329 329 329 329 329 329 329 225 225 225 225 204 204 204 204 204 204 287 287 287 287 287 188 188 188 188 188 279 279 279 279 279 279 279 279 279 225 225 225 225 209 209 209 209 209 209 272 272 272 272 272 272 187 187 187 232 232 232 50 50 50 50 50 50 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 116 116 116 116 116 116 116 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 133 133 133 133 277 277 277 277 277 277 277 277 277 204 204 204 204 204 204 287 287 287 287 287 287 287 287 277 277 277 277 277 208 208 208 208 208 208 208 208 208 208 208 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 224 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 331 331 331 331 189 189 189 292 292 292 292 292 292 292 292 292 107 107 107 107 107 107 107 107 107 225 225 225 225 225 225 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 228 228 228 228 228 228 228 187 187 187 232 232 232 232 119 119 119 119 52 52 52 227 227 227 227 227 227 227 227 227 321 321 321 321 321 321 321 321 321 321 321 233 233 233 233 233 233 285 285 285 285 285 285 285 285 285 285 285 285 105 105 105 105 105 105 105 105 105 105 232 232 232 232 232 232 232 115 115 115 115 115 115 115 249 249 249 233 233 233 233 233 288 288 288 288 288 335 335 335 335 320 320 320 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 193 237 237 237 237 237 237 237 237 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 335 320 320 320 320 320 219 219 219 219 219 219 219 305 305 305 305 116 116 116 187 187 187 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 49 49 49 232 232 232 232 335 335 335 335 335 320 320 320 320 331 331 331 331 331 144 144 144 144 115 115 115 115 115 115 115 115 115 333 333 333 333 133 133 133 225 225 225 225 225 189 189 189 189 189 236 236 236 236 236 236 187 187 187 232 232 232 232 232 227 227 227 227 227 227 227 227 227 227 227 227 21 21 21 21 21 21 21 21 277 277 277 277 277 109 109 109 109 109 49 49 49 224 224 224 224 224 224 224 179 179 179 179 179 179 179 179 179 179 179 179 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 219 219 219 219 219 219 219 305 305 305 305 117 117 117 117 49 49 49 233 233 233 233 288 288 288 288 288 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 316 316 316 316 316 179 179 179 179 179 179 179 179 179 37 37 37 37 37 116 116 116 116 287 287 287 287 287 287 287 287 165 165 165 165 165 165 165 165 221 221 221 221 221 221 221 221 49 49 49 49 232 232 232 232 119 119 119 48 48 48 48 48 48 279 279 279 279 279 279 279 279 279 279 279 221 221 221 221 221 277 277 277 277 69 69 69 69 69 69 69 69 233 233 233 233 233 204 204 204 204 204 204 223 223 223 223 223 193 193 193 193 193 289 289 289 49 49 49 49 224 224 224 224 224 224 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 37 233 233 233 233 233 116 116 116 116 116 116 116 116 116 116 116 116 67 67 67 67 67 67 67 67 67 67 67 67 67 221 221 221 221 221 221 221 221 333 333 333 333 145 145 145 145 117 117 117 117 117 225 225 225 225 225 225 204 204 204 204 204 204 204 187 187 187 187 187 232 232 232 232 232 232 179 179 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 193 193 193 193 193 193 193 193 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 119 119 119 119 119 119 133 133 133 133 133 133 133 133 133 133 133 133 232 232 232 232 232 232 35 35 35 35 233 233 233 233 233 233 116 116 116 116 119 119 119 133 133 133 133 133 133 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 208 208 208 208 115 115 115 115 197 197 197 197 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 117 117 117 117 117 117 189 189 189 189 116 116 116 116 116 116 116 116 331 331 331 331 53 53 53 53 53 53 288 288 288 287 287 287 287 287 287 188 188 188 188 115 115 115 115 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 208 208 208 208 208 219 219 219 219 219 219 219 219 305 305 305 305 305 116 116 116 116 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 21 288 288 288 287 287 287 287 287 287 287 287 287 133 133 133 133 133 224 224 224 224 224 224 224 224 224 119 119 119 119 189 189 189 189 189 189 280 280 280 280 280 280 280 280 280 280 111 111 111 111 111 111 111 111 111 111 111 111 111 111 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 225 225 116 116 116 116 116 331 331 331 331 189 189 189 120 120 120 119 119 119 52 52 52 175 175 175 175 175 175 175 175 175 225 225 225 225 225 225 225 225 249 249 249 249 249 249 249 249 249 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 119 49 49 49 49 49 288 288 288 119 119 119 119 133 133 133 276 276 276 276 179 179 179 179 179 179 37 37 37 116 116 116 116 116 107 107 107 107 107 107 49 49 49 232 232 232 232 232 50 50 50 50 227 227 227 227 227 189 189 189 189 189 281 281 281 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 289 165 165 165 165 165 165 165 165 165 165 165 165 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 331 331 331 331 331 331 305 305 305 305 116 116 116 116 287 287 287 287 287 287 287 165 165 165 165 165 165 165 165 220 220 220 220 220 179 179 179 144 144 144 144 144 144 144 144 144 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 249 249 228 228 228 228 228 228 228 47 47 47 233 233 233 116 116 116 223 223 223 133 133 133 133 133 288 288 288 288 288 227 227 227 227 227 17 17 17 277 277 277 277 277 277 277 277 277 277 277 193 193 193 193 225 225 225 225 225 225 225 48 48 48 48 48 48 115 115 115 115 115 115 320 320 320 320 320 320 320 320 320 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 219 219 219 219 219 219 219 305 305 305 305 305 305 117 117 117 49 49 49 232 232 232 232 107 107 107 107 107 107 107 204 204 204 204 204 204 204 204 223 223 223 223 223 133 133 133 133 133 133 173 173 173 173 173 173 288 288 288 288 288 288 35 35 35 35 288 288 288 288 107 107 107 107 107 107 107 277 277 277 277 277 101 101 101 101 101 101 101 101 101 288 288 288 288 275 275 275 275 275 275 193 193 193 193 193 193 329 329 329 329 329 329 144 144 144 144 144 144 144 144 144 131 131 131 131 233 233 233 233 233 205 205 205 205 205 205 205 181 181 181 181 181 181 181 181 181 181 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 231 231 248 248 248 248 227 227 227 227 227 227 227 227 37 37 37 37 37 37 289 289 289 289 289 144 144 144 144 144 144 331 331 331 331 331 331 331 331 53 53 53 53 53 53 53 288 288 288 288 288 288 227 227 227 227 189 189 189 189 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 165 165 165 165 165 165 220 220 220 220 179 179 179 37 37 37 116 116 116 107 107 107 107 189 189 189 189 232 232 232 227 227 227 227 227 227 227 227 165 165 165 165 165 165 165 165 165 165 165 165 165 165 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 219 219 219 219 219 219 219 333 333 333 333 333 133 133 133 133 133 281 281 281 281 281 281 281 281 281 113 113 113 113 113 113 113 49 49 49 49 49 233 233 233 233 233 233 233 233 340 340 340 340 47 47 47 233 233 233 116 116 116 116 135 135 135 135 221 221 221 221 221 221 221 281 281 281 281 281 273 273 273 273 273 225 225 225 225 225 49 49 49 49 233 233 233 233 165 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 233 233 233 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 227 227 227 227 227 227 101 101 101 101 101 101 101 288 288 288 288 288 288 131 131 131 131 340 340 340 340 340 340 340 340 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 133 224 224 224 224 224 224 224 107 107 107 107 107 107 204 204 204 204 204 204 115 115 115 115 115 189 189 189 189 173 173 173 173 173 173 173 173 173 173 173 173 173 149 149 149 149 149 149 149 149 149 149 116 116 116 116 116 47 47 47 47 233 233 233 233 289 289 289 289 289 289 289 193 193 193 193 224 224 224 179 179 179 179 179 179 208 208 208 208 331 331 331 331 331 49 49 49 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 165 173 173 173 173 173 173 173 225 225 225 225 225 204 204 204 204 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 220 220 220 220 220 220 220 220 35 35 35 288 288 288 288 175 175 175 175 175 175 277 277 277 277 277 209 209 209 209 209 209 232 232 232 232 232 232 175 175 175 175 175 175 165 165 165 165 165 165 165 165 165 165 165 109 109 109 109 109 49 49 49 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 228 228 228 228 228 228 228 279 279 279 279 279 279 279 279 279 279 279 279 21 21 21 21 21 21 277 277 277 277 277 277 204 204 204 204 204 204 204 102 102 102 102 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 165 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 116 116 116 116 116 283 283 283 283 283 283 283 283 283 283 283 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 219 219 219 219 219 219 219 219 219 53 53 53 53 228 228 228 228 47 47 47 47 225 225 225 225 225 225 225 69 69 69 69 69 69 69 69 69 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 52 52 52 52 52 179 179 179 179 179 179 69 69 69 69 69 69 69 277 277 277 277 277 277 277 280 280 280 280 280 280 280 187 187 187 187 187 340 340 340 340 340 340 340 247 247 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 144 144 144 144 144 187 187 187 187 187 232 232 232 232 119 119 119 119 204 204 204 204 335 335 335 335 335 335 335 21 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 175 175 175 175 175 175 175 193 193 193 328 328 328 328 227 227 227 227 208 208 208 335 335 335 335 305 305 305 276 276 276 276 276 276 276 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 176 176 176 176 176 176 176 176 176 176 176 176 176 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 102 102 102 102 102 102 102 102 219 219 219 219 219 219 49 49 49 49 49 232 232 232 232 232 219 219 219 219 219 219 219 219 219 219 219 219 133 133 133 133 133 133 277 277 277 277 277 277 277 277 204 204 204 204 204 204 204 204 204 204 204 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 52 52 52 52 52 111 111 111 111 111 111 111 111 111 111 111 111 101 101 101 101 101 101 101 101 225 225 225 225 225 116 116 116 116 275 275 275 189 189 189 189 281 281 281 281 281 273 273 273 273 273 273 273 21 21 21 21 21 21 233 233 233 233 117 117 117 117 189 189 189 116 116 116 116 116 116 111 111 111 111 111 111 111 111 111 111 111 193 193 193 193 277 277 277 277 277 277 277 173 173 173 173 173 173 173 173 49 49 49 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 288 288 288 288 288 187 187 187 187 341 341 341 341 341 341 49 49 49 49 233 233 233 288 288 288 179 179 179 179 179 179 179 179 133 133 133 133 329 329 329 329 329 329 329 329 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 328 328 328 328 175 175 175 175 175 175 21 21 21 21 21 21 21 21 21 21 21 288 288 288 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 227 227 227 227 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 225 225 225 225 225 225 117 117 117 117 225 225 225 225 204 204 204 204 204 204 175 175 175 175 175 175 175 305 305 305 305 305 305 305 117 117 117 117 117 117 117 340 340 340 340 340 187 187 187 187 232 232 232 232 232 187 187 187 187 187 187 187 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 288 288 288 288 191 191 191 288 288 288 288 288 187 187 187 187 187 341 341 341 341 341 341 49 49 49 233 233 233 288 288 288 179 179 179 179 179 179 179 179 133 133 133 133 133 329 329 329 329 329 329 329 329 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 187 187 187 187 187 187 187 172 172 172 172 172 172 172 172 191 191 191 288 288 288 288 191 191 191 191 191 191 341 341 341 341 49 49 49 232 232 232 232 232 232 219 219 219 219 219 219 219 219 219 219 219 219 219 219 133 133 133 133 277 277 277 277 277 277 277 277 277 205 205 205 205 205 205 205 116 116 116 116 187 187 187 187 232 232 232 232 232 232 232 232 232 215 215 215 215 215 215 53 53 53 53 53 281 281 281 281 281 281 281 281 288 288 288 288 50 50 50 50 279 279 279 279 279 279 279 279 279 279 279 279 149 149 149 149 149 149 149 149 149 149 289 289 289 289 49 49 49 232 232 232 232 232 232 331 331 331 331 331 331 331 331 164 164 164 164 164 164 164 164 164 164 164 164 164 164 119 119 119 119 119 52 52 52 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 233 233 233 233 233 117 117 117 49 49 49 224 224 224 224 224 224 271 271 271 271 271 271 271 271 305 305 305 305 305 225 225 225 225 225 225 225 340 340 340 340 340 340 340 83 83 83 83 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 99 99 99 99 99 99 99 99 99 99 99 116 116 116 107 107 107 107 107 133 133 133 289 289 289 289 144 144 144 144 144 144 144 144 219 219 219 219 219 219 219 219 219 219 219 219 209 209 209 209 209 209 209 272 272 272 272 272 187 187 187 187 187 187 288 288 288 288 107 107 107 107 189 189 189 189 189 221 221 221 221 221 221 49 49 49 49 49 49 340 340 340 340 340 340 340 102 102 102 102 102 102 102 102 102 102 231 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 119 119 119 119 119 119 204 204 204 204 204 204 187 187 187 187 177 177 177 177 177 177 177 177 177 341 341 341 341 341 341 341 341 341 37 37 37 37 37 37 37 37 37 37 37 221 221 221 221 221 221 221 221 221 221 221 221 288 288 288 231 231 231 231 231 231 231 37 37 37 37 37 37 37 37 37 220 220 220 220 220 220 220 47 47 47 47 328 328 328 328 328 328 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 289 289 289 289 289 280 280 280 280 47 47 47 232 232 232 127 127 127 221 221 221 221 221 221 281 281 281 281 289 289 289 289 289 289 277 277 277 209 209 209 209 209 209 209 209 229 229 229 229 225 225 225 204 204 204 204 204 204 204 204 204 204 204 247 247 247 247 247 247 247 247 247 247 225 225 225 225 225 225 225 225 225 116 116 116 116 116 219 219 219 219 219 219 219 219 219 21 21 21 21 21 277 277 277 277 277 277 273 273 273 273 273 49 49 49 49 288 288 288 288 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 37 37 37 176 176 176 176 176 176 176 176 176 176 176 176 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 99 99 99 99 99 228 228 228 228 228 228 228 228 327 327 327 327 133 133 133 133 277 277 277 277 277 277 277 277 204 204 204 204 204 204 204 175 175 175 175 175 175 225 225 225 225 225 37 37 37 37 37 37 37 37 37 116 116 116 116 116 335 335 335 335 335 321 321 321 328 328 328 328 328 328 328 219 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 207 207 207 207 207 207 207 207 207 207 207 207 207 207 329 329 329 329 329 189 189 189 232 232 232 232 187 187 187 187 187 187 172 172 172 172 172 172 172 187 187 187 187 187 288 288 288 288 288 288 288 331 331 331 331 305 305 305 116 116 116 179 179 179 37 37 37 328 328 328 328 328 328 107 107 107 107 107 107 107 193 193 193 193 232 232 232 231 231 231 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 280 280 280 280 280 280 280 287 287 287 287 287 48 48 48 48 48 279 279 279 279 279 279 279 279 225 225 225 209 209 209 209 209 272 272 272 272 272 272 187 187 187 232 232 232 232 50 50 50 50 50 50 50 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 116 116 116 116 116 111 111 111 111 111 111 111 111 111 111 111 111 133 133 133 133 133 133 277 277 277 277 277 277 277 277 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 277 277 277 277 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 209 209 209 209 328 328 328 328 175 175 175 175 175 175 21 21 21 21 21 288 288 288 287 287 287 287 188 188 188 115 115 115 115 115 277 277 277 277 101 101 101 101 101 101 101 101 328 328 328 328 328 328 328 50 50 50 50 223 223 223 223 223 69 69 69 69 69 69 69 69 236 236 236 236 236 236 271 271 271 271 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 209 209 280 280 280 280 280 280 280 280 280 179 179 179 179 37 37 37 37 37 37 37 329 329 329 329 49 49 49 233 233 233 233 233 288 288 288 331 331 331 331 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 189 189 189 189 340 340 340 340 279 279 279 279 273 273 273 273 273 273 133 133 133 133 133 133 233 233 233 233 233 281 281 281 281 281 281 281 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 133 133 133 133 116 116 116 116 116 191 191 191 191 288 288 288 288 331 331 331 49 49 49 340 340 340 340 340 340 340 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 288 288 288 288 288 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 228 228 228 228 228 228 228 175 175 175 175 175 225 225 225 225 37 37 37 37 37 37 37 37 37 37 37 116 116 116 116 1 1 1 107 107 107 107 189 189 189 189 189 221 221 221 221 221 49 49 49 49 340 340 340 340 340 340 102 102 102 102 102 102 102 102 102 102 102 102 102 223 223 223 223 223 223 223 223 53 53 53 53 53 53 328 328 328 328 328 328 328 328 328 115 115 115 115 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 329 329 329 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 187 187 187 187 187 288 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 229 229 229 229 229 229 340 340 340 340 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 248 248 331 331 331 331 331 331 331 331 331 53 53 53 53 233 233 233 233 233 233 233 233 233 233 233 117 117 117 117 145 145 145 145 173 173 173 173 173 173 173 173 49 49 49 224 224 224 224 224 119 119 119 49 49 49 288 288 288 288 99 99 99 99 99 228 228 228 228 228 228 175 175 175 175 175 249 249 249 189 189 189 189 189 236 236 236 236 287 287 287 287 48 48 48 48 48 48 223 223 223 223 223 223 223 223 223 223 223 193 193 193 193 328 328 328 328 328 331 331 331 331 193 193 193 193 292 292 292 292 335 335 335 320 320 320 320 320 320 47 47 47 47 233 233 233 116 116 116 107 107 107 189 189 189 225 225 225 225 225 225 225 225 225 225 225 225 225 69 69 69 69 69 69 69 69 236 236 236 236 236 236 287 287 287 287 287 287 287 287 287 320 320 320 320 335 335 335 335 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 328 328 328 328 328 328 328 231 231 231 133 133 133 329 329 329 329 329 144 144 144 144 107 107 107 107 107 189 189 189 225 225 225 225 225 225 225 225 225 225 69 69 69 69 69 237 237 237 237 116 116 116 287 287 287 287 287 287 320 320 320 320 320 320 320 131 131 131 233 233 233 233 233 205 205 205 205 205 205 109 109 109 109 109 49 49 49 49 49 49 117 117 117 117 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 231 231 21 21 21 21 21 21 288 288 288 288 288 288 288 275 275 275 275 275 275 209 209 209 209 209 209 209 209 209 209 209 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 107 53 53 53 53 53 288 288 288 119 119 119 119 204 204 204 204 204 204 47 47 47 47 47 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 49 49 49 228 228 228 228 228 331 331 331 49 49 49 340 340 340 340 340 340 340 340 119 119 119 52 52 52 52 331 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 149 149 149 149 149 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 328 328 328 328 328 328 328 328 247 247 247 247 247 247 233 233 233 225 225 225 225 204 204 204 204 204 107 107 107 107 107 107 107 193 193 193 232 232 232 232 232 187 187 187 187 187 232 232 232 232 232 191 191 191 191 191 288 288 288 288 288 171 171 171 171 171 171 171 171 171 69 69 69 69 69 69 69 276 276 276 276 276 227 227 227 227 227 227 227 227 227 53 53 53 53 53 53 53 53 233 233 233 233 233 293 293 293 293 293 293 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 288 288 288 288 119 119 119 119 119 37 37 37 37 37 37 37 288 288 288 288 288 331 331 331 49 49 49 340 340 340 340 340 340 340 340 187 187 187 187 187 233 233 233 233 233 233 233 233 233 53 53 53 53 53 53 53 53 53 53 53 53 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 289 289 289 289 289 289 280 280 280 280 280 280 280 280 280 331 331 331 331 331 149 149 149 149 149 149 149 280 280 280 280 280 280 280 280 119 119 119 119 49 49 49 49 49 232 232 232 232 232 232 232 1 1 1 1 1 131 131 131 131 131 131 131 131 131 233 233 233 233 233 205 205 205 205 205 205 205 205 205 293 293 293 293 293 293 197 197 197 197 236 236 236 335 335 335 335 335 320 320 320 320 320 320 219 219 219 219 219 305 305 305 116 116 116 187 187 187 229 229 229 229 229 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 217 217 217 49 49 49 49 49 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 193 193 193 193 193 281 281 281 281 281 281 189 189 189 189 340 340 340 340 279 279 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 233 233 233 233 233 233 233 233 281 281 281 281 281 144 144 144 144 144 279 279 279 279 279 279 279 279 133 133 133 116 116 116 191 191 191 288 288 288 288 331 331 331 49 49 49 340 340 340 340 340 340 340 340 340 340 340 331 331 331 193 193 193 193 221 221 221 221 221 221 221 49 49 49 116 116 116 47 47 47 328 328 328 328 328 328 227 227 227 227 227 208 208 208 208 287 287 287 287 287 188 188 188 188 188 188 287 287 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 69 220 220 220 220 220 220 220 220 223 223 223 223 223 101 101 101 101 101 101 220 220 220 220 220 220 220 220 220 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 164 164 164 164 164 164 331 331 331 331 331 331 331 331 144 144 144 144 144 144 144 175 175 175 175 175 175 175 305 305 305 305 305 305 305 305 305 305 305 305 305 305 305 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 335 335 335 335 335 335 335 335 320 320 320 320 320 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 204 204 204 47 47 47 47 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 49 49 49 49 228 228 228 228 271 271 271 271 271 271 209 209 209 209 209 209 209 209 209 209 273 273 273 273 273 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 53 288 288 288 119 119 119 133 133 133 133 276 276 276 276 276 191 191 191 191 191 340 340 340 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 223 223 223 223 223 223 193 193 193 289 289 289 289 49 49 49 224 224 224 224 224 224 279 279 279 279 279 279 279 279 279 279 279 279 279 221 221 221 221 221 221 221 249 249 249 249 249 249 249 272 272 272 272 171 171 171 171 171 171 171 171 144 144 144 144 119 119 119 119 204 204 204 204 204 204 204 187 187 187 187 229 229 229 229 229 229 229 229 229 41 41 41 41 41 41 41 217 217 217 217 217 217 217 217 217 217 49 49 49 233 233 233 233 233 233 233 233 233 233 233 233 233 165 165 165 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 232 232 232 232 232 187 187 187 187 187 232 232 232 232 232 47 47 47 232 232 232 232 232 47 47 47 47 47 47 47 47 281 281 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 247 247 247 247 247 247 247 247 247 247 247 247 233 233 233 233 233 225 225 225 225 225 204 204 204 204 204 204 204 215 215 215 215 215 215 215 53 53 53 53 53 281 281 281 281 281 281 288 288 288 288 288 187 187 187 187 232 232 232 232 119 119 119 204 204 204 204 204 204 204 51 51 51 51 51 121 121 121 121 121 144 144 144 144 144 144 144 144 144 67 67 67 67 67 67 67 67 67 277 277 277 277 277 277 173 173 173 173 173 173 173 173 173 173 173 173 49 49 49 233 233 233 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 288 288 288 288 288 331 331 331 331 331 331 21 21 21 21 21 21 340 340 340 340 340 340 271 271 271 271 271 271 277 277 277 277 193 193 193 289 289 289 204 204 204 204 204 204 204 191 191 191 191 191 191 233 233 233 233 289 289 289 277 277 277 49 49 49 49 281 281 281 281 289 289 289 289 289 289 189 189 189 236 236 236 236 236 287 287 287 287 287 287 287 48 48 48 48 187 187 187 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 49 49 49 49 232 232 232 291 291 291 291 291 291 193 193 193 237 237 237 237 237 237 237 237 340 340 340 340 340 340 47 47 47 47 109 109 109 109 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 119 119 119 119 119 133 133 133 133 133 133 133 133 133 133 133 133 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 320 320 320 320 320 320 179 179 179 37 37 37 116 116 116 116 107 107 107 107 189 189 189 232 232 232 232 232 232 232 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 249 249 249 249 249 249 249 225 225 225 225 225 225 225 49 49 49 232 232 232 232 47 47 47 47 47 333 333 333 333 333 333 333 164 164 164 164 164 164 164 171 171 171 171 171 171 171 171 171 145 145 145 228 228 228 179 179 179 179 179 179 179 144 144 144 144 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 133 133 133 133 133 277 277 277 277 277 277 49 49 49 49 233 233 233 289 289 289 289 280 280 280 280 187 187 187 232 232 232 232 232 179 179 179 179 179 144 144 144 144 144 144 144 144 144 144 191 191 191 191 191 191 191 191 233 233 233 233 233 233 233 173 173 173 173 173 173 49 49 49 49 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 204 204 204 204 204 204 107 107 107 107 107 107 107 100 100 100 100 100 100 100 100 100 100 100 50 50 50 50 50 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 277 277 277 277 321 321 321 321 321 321 321 321 321 321 321 224 224 224 224 224 224 224 224 231 231 231 231 231 231 231 231 231 231 149 149 149 149 149 149 149 149 149 149 149 149 149 149 280 280 280 280 280 280 280 280 179 179 179 179 179 179 320 320 320 320 320 320 115 115 115 115 115 115 115 115 115 115 115 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 116 116 116 107 107 107 107 107 189 189 189 189 189 173 173 173 173 173 173 69 69 69 276 276 276 283 283 283 283 283 283 283 283 283 208 208 208 208 219 219 219 219 219 219 305 305 305 116 116 116 116 219 219 219 219 219 49 49 49 233 233 233 233 173 173 173 173 173 173 173 173 173 173 173 173 133 133 133 133 133 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 335 335 335 335 335 335 335 335 335 321 321 321 321 341 341 341 341 341 341 341 341 116 116 116 287 287 287 48 48 48 48 48 48 223 223 223 223 223 223 223 100 100 100 100 100 100 100 100 100 100 47 47 47 47 47 47 47 333 333 333 333 333 333 165 165 165 165 165 220 220 220 220 220 220 220 35 35 35 288 288 288 288 288 288 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 101 289 289 289 289 289 280 280 280 47 47 47 233 233 233 116 116 116 187 187 187 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 49 49 49 49 49 232 232 232 232 232 291 291 291 291 291 291 193 193 193 237 237 237 237 237 237 237 237 340 340 340 340 340 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 220 220 220 220 220 220 220 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 189 189 189 189 221 221 221 221 221 221 49 49 49 49 340 340 340 340 340 340 102 102 102 102 102 102 115 115 115 115 115 193 193 193 193 193 117 117 117 233 233 233 288 288 288 179 179 179 179 179 179 179 37 37 37 37 328 328 328 287 287 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 101 101 101 228 228 228 228 228 228 187 187 187 232 232 232 119 119 119 48 48 48 48 115 115 115 115 115 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 175 175 175 175 175 175 175 175 175 133 133 133 133 133 280 280 280 280 280 280 119 119 119 119 119 37 37 37 289 289 289 289 280 280 280 280 280 331 331 331 331 331 100 100 100 100 100 100 100 100 100 100 47 47 47 47 228 228 228 228 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 291 291 291 291 291 291 291 291 291 291 193 193 193 193 193 193 193 193 232 232 232 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 35 35 35 35 35 35 35 35 35 228 228 228 228 228 228 115 115 115 115 115 277 277 277 133 133 133 117 117 117 117 173 173 173 173 173 173 49 49 49 224 224 224 224 224 224 291 291 291 291 291 291 193 193 193 193 193 232 232 232 232 232 232 163 163 163 163 163 163 163 163 163 163 163 233 233 233 288 288 288 288 288 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 133 133 133 133 276 276 276 191 191 191 191 191 191 341 341 341 341 49 49 49 232 232 232 50 50 50 50 50 50 50 50 50 50 50 1 1 1 1 271 271 271 271 271 271 271 271 193 193 193 193 193 193 193 220 220 220 220 220 19 19 19 19 19 232 232 232 232 232 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 100 107 107 107 107 107 107 107 107 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 233 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 320 320 223 223 223 223 223 223 223 53 53 53 53 53 53 53 53 328 328 328 328 328 287 287 287 287 287 287 287 287 320 320 320 320 320 187 187 187 229 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 217 49 49 49 232 232 232 232 99 99 99 99 99 99 99 99 99 99 228 228 228 228 228 228 228 228 228 228 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 101 101 101 280 280 280 280 280 280 280 280 280 280 280 280 280 280 47 47 47 233 233 233 116 116 116 116 116 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 53 53 53 53 229 229 229 229 229 229 229 229 229 229 272 272 272 272 272 272 331 331 331 189 189 189 292 292 292 292 292 292 292 292 292 115 115 115 115 115 193 193 193 193 229 229 229 229 229 229 229 273 273 273 273 273 49 49 49 49 225 225 225 225 225 225 340 340 340 340 340 340 340 187 187 187 187 232 232 232 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 100 131 131 131 131 131 131 131 225 225 225 225 225 225 109 109 109 109 109 109 253 253 253 253 253 253 253 253 253 253 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 193 193 193 193 193 193 193 120 120 120 120 120 120 120 120 119 119 119 119 193 193 193 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 317 317 317 317 340 340 340 340 340 340 340 219 219 219 219 49 49 49 49 229 229 229 229 273 273 273 273 273 273 273 273 273 273 273 273 37 37 37 37 233 233 233 233 233 233 233 337 337 337 337 337 49 49 49 49 232 232 232 232 232 232 279 279 279 279 279 279 279 289 289 289 289 289 289 21 21 21 21 21 21 21 21 21 273 273 273 288 288 288 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 69 69 221 221 221 221 221 221 221 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 271 271 271 271 271 271 271 21 21 21 21 21 277 277 277 277 277 277 277 277 289 289 289 289 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 189 189 189 189 189 221 221 221 221 221 221 49 49 49 49 340 340 340 283 283 283 283 208 208 208 208 208 331 331 331 331 331 49 49 49 340 340 340 340 340 83 83 83 83 83 83 83 83 288 288 288 288 288 288 47 47 47 328 328 328 328 328 328 328 107 107 107 107 107 277 277 277 277 277 133 133 133 133 133 133 133 133 133 133 133 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 292 35 35 35 233 233 233 233 116 116 116 116 116 271 271 271 271 271 271 271 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 289 289 289 289 289 225 225 225 225 204 204 204 204 204 204 204 107 107 107 107 107 189 189 189 189 189 221 221 221 221 221 221 221 221 49 49 49 49 49 49 49 49 340 340 340 340 340 340 119 119 119 119 119 164 164 164 164 164 164 164 164 179 179 179 179 37 37 37 116 116 116 116 116 116 275 275 275 275 275 275 209 209 209 209 209 113 113 113 113 113 113 113 113 113 113 113 113 113 288 288 288 119 119 119 52 52 52 52 107 107 107 107 107 107 53 53 53 53 53 53 53 177 177 177 177 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 21 21 21 21 21 288 288 288 288 288 288 47 47 47 47 233 233 233 233 53 53 53 53 53 53 53 53 121 121 121 121 121 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 149 149 149 149 116 116 116 115 115 115 115 189 189 189 116 116 116 116 116 116 116 283 283 283 283 283 283 283 283 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 164 164 164 164 164 164 164 164 164 164 164 164 47 47 47 47 47 47 233 233 233 233 233 289 289 289 289 289 289 289 193 193 193 193 193 224 224 224 224 119 119 119 119 119 164 164 164 164 179 179 179 179 179 179 37 37 37 37 116 116 116 116 116 223 223 223 223 223 133 133 133 133 133 133 173 173 173 173 173 173 173 288 288 288 288 288 288 119 119 119 119 48 48 48 48 327 327 327 327 327 327 327 327 327 193 193 193 193 193 225 225 225 225 225 225 225 189 189 189 189 189 189 189 216 216 216 216 216 216 216 216 216 216 216 47 47 47 233 233 233 116 116 116 331 331 331 331 144 144 144 144 115 115 115 115 115 115 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 329 329 329 329 329 329 189 189 189 189 236 236 236 236 236 236 236 115 115 115 115 115 115 85 85 85 85 85 85 85 85 85 85 85 85 232 232 232 232 232 50 50 50 50 50 279 279 279 279 279 279 279 279 279 279 289 289 289 289 289 289 289 289 209 209 209 209 209 209 209 209 209 209 272 272 272 272 272 272 272 272 223 223 223 223 223 193 193 193 193 289 289 289 49 49 49 49 224 224 224 224 179 179 179 179 179 179 179 179 179 179 179 193 193 193 193 193 193 193 193 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 48 48 48 48 48 48 48 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 249 249 249 116 116 116 116 116 116 271 271 271 271 271 21 21 21 21 21 21 21 277 277 277 277 277 277 288 288 288 288 288 288 47 47 47 328 328 328 328 328 328 328 328 328 331 331 331 331 331 193 193 193 193 193 193 193 193 112 112 112 112 112 112 112 112 179 179 179 37 37 37 116 116 116 107 107 107 107 189 189 189 232 232 232 232 232 232 232 219 219 219 219 219 219 219 219 219 219 53 53 53 53 53 53 53 53 288 288 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 115 115 115 115 115 115 115 115 115 115 209 209 209 209 209 209 209 209 273 273 273 273 273 273 273 225 225 225 225 225 225 204 204 204 204 187 187 187 187 233 233 233 233 289 289 289 289 289 289 48 48 48 48 119 119 119 119 52 52 52 52 52 279 279 279 279 279 279 279 279 279 279 279 279 279 279 69 69 69 69 69 69 69 69 69 69 69 173 173 173 173 173 173 173 173 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 265 265 265 265 265 265 265 265 265 265 265 265 265 265 265 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 49 49 49 49 288 288 288 288 119 119 119 119 48 48 48 48 48 107 107 107 107 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 237 237 237 237 237 237 237 237 237 237 237 237 221 221 221 221 221 221 221 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 171 171 171 171 171 277 277 277 277 277 193 193 193 193 233 233 233 233 233 233 217 217 217 217 217 217 217 116 116 116 331 331 331 331 189 189 189 189 120 120 120 120 120 120 120 107 107 107 107 107 107 107 225 225 225 225 225 225 321 321 321 321 321 321 321 321 229 229 229 229 229 229 229 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 236 236 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 225 116 116 116 116 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 133 133 133 133 133 133 277 277 277 277 277 277 277 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 287 277 277 277 277 277 209 209 209 209 209 209 209 209 340 340 340 340 340 340 340 47 47 47 233 233 233 233 233 233 116 116 116 116 116 116 279 279 279 279 279 279 279 279 279 279 225 225 225 225 193 193 193 193 193 193 193 193 193 228 228 228 228 228 228 228 228 228 228 228 228 228 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 107 107 107 107 107 107 149 149 149 149 149 149 149 149 149 149 113 113 113 113 113 113 113 113 113 113 113 113 189 189 189 189 189 189 189 189 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 329 329 329 329 329 329 277 277 277 49 49 49 49 224 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 171 209 209 209 209 209 209 209 288 288 288 288 288 47 47 47 47 109 109 109 109 109 109 109 109 53 53 53 53 53 53 53 328 328 328 328 328 328 119 119 119 119 133 133 133 133 133 133 276 276 276 276 276 179 179 179 179 179 179 179 179 133 133 133 133 133 133 133 133 133 133 133 133 133 133 117 117 117 117 117 117 117 117 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 52 52 52 52 52 111 111 111 111 111 111 111 111 111 111 111 111 111 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 116 116 116 116 116 116 116 271 271 271 271 271 271 271 271 305 305 305 305 305 288 288 288 288 83 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 288 179 179 179 179 179 144 144 144 144 144 144 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 37 37 233 233 233 233 233 233 233 116 116 116 116 47 47 47 233 233 233 116 116 116 116 107 107 107 107 107 277 277 277 277 277 249 249 249 249 249 249 249 220 220 220 220 220 220 220 67 67 67 67 67 67 67 67 172 172 172 172 172 172 172 172 50 50 50 50 107 107 107 107 107 107 107 107 107 107 277 277 277 277 277 37 37 37 37 37 37 37 37 37 233 233 233 233 233 233 233 233 233 112 112 112 112 112 112 112 112 47 47 47 47 328 328 328 328 328 328 328 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 116 116 116 116 116 116 116 116 1 1 1 271 271 271 271 271 271 271 271 271 225 225 225 225 225 225 225 225 53 53 53 53 53 53 53 53 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 119 119 119 119 49 49 49 49 288 288 288 288 288 288 288 288 288 107 107 107 107 107 277 277 277 277 53 53 53 53 53 53 53 53 53 285 285 285 285 285 285 285 285 285 285 288 288 288 47 47 47 177 177 177 177 177 177 177 133 133 133 133 233 233 233 233 233 233 233 281 281 281 281 288 288 288 119 119 119 52 52 52 52 279 279 279 279 279 279 279 279 279 101 101 101 101 101 101 101 101 101 116 116 116 116 116 47 47 47 47 328 328 328 119 119 119 119 52 52 52 52 107 107 107 107 107 107 107 107 107 53 53 53 53 53 53 177 177 177 177 177 177 177 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 191 191 191 191 341 341 341 341 341 341 49 49 49 49 232 232 232 232 232 232 119 119 119 119 119 37 37 37 37 37 37 37 37 37 288 288 288 288 288 1 1 1 1 107 107 107 107 107 107 107 337 337 337 337 337 337 337 337 321 321 321 321 321 321 289 289 289 49 49 49 49 173 173 173 173 173 173 173 173 173 173 173 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 333 333 333 53 53 53 53 288 288 288 115 115 115 115 115 193 193 193 193 116 116 116 119 119 119 119 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 287 287 287 287 287 287 287 287 287 287 287 277 277 277 277 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 223 223 223 223 223 223 223 209 209 209 209 209 209 209 209 209 209 209 233 233 233 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 83 83 83 83 83 83 83 83 83 83 288 288 288 288 288 171 171 171 171 145 145 145 145 228 228 228 228 228 119 119 119 48 48 48 48 48 48 107 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 237 237 237 237 237 237 237 237 220 220 220 220 220 220 220 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 224 224 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 47 47 47 233 233 233 116 116 116 223 223 223 223 223 223 223 223 223 223 165 165 165 165 165 165 165 165 165 165 281 281 281 281 281 281 281 281 281 281 281 281 281 204 204 204 204 204 204 204 227 227 227 227 227 227 165 165 165 165 165 165 165 220 220 220 220 220 335 335 335 335 335 320 320 320 320 320 320 320 320 291 291 291 291 291 193 193 193 193 237 237 237 237 237 237 237 237 220 220 220 220 220 220 220 220 51 51 51 51 51 51 51 51 51 51 51 51 328 328 328 328 328 328 328 328 328 328 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 35 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 281 281 281 221 221 221 221 221 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 133 133 133 224 224 224 224 224 224 224 224 224 224 224 1 1 1 231 231 231 231 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 49 49 49 49 233 233 233 233 233 233 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 116 116 116 116 116 116 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 337 337 337 337 337 316 316 316 316 316 316 316 316 316 316 316 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 100 100 100 100 100 100 100 100 100 100 100 100 100 100 50 50 50 50 50 50 107 107 107 107 107 107 107 107 107 107 107 107 107 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 116 116 116 116 47 47 47 47 328 328 328 328 328 328 328 328 328 328 328 219 219 219 219 219 219 219 219 219 219 219 219 69 69 69 69 69 69 69 69 277 277 277 277 277 277 277 277 277 277 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 116 116 116 116 116 116 116 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 187 187 187 187 187 187 187 232 232 232 232 232 232 232 232 232 232 232 232 232 232 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 331 331 331 331 189 189 189 120 120 120 120 120 50 50 50 50 50 50 50 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 53 53 53 53 53 53 53 53 53 329 329 329 329 329 329 329 329 329 329 329 329 329 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 193 193 193 193 281 281 281 281 281 281 281 281 281 281 281 281 281 289 289 289 289 289 289 289 204 204 204 204 204 204 204 204 327 327 327 327 327 327 327 327 327 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 328 328 328 231 231 231 231 231 231 133 133 133 133 133 329 329 329 329 144 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 232 232 232 232 232 232 331 331 331 331 331 53 53 53 53 53 53 53 53 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 288 288 288 288 102 102 102 102 102 102 102 102 102 102 219 219 219 219 219 219 219 219 49 49 49 49 232 232 232 232 187 187 187 229 229 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 217 49 49 49 232 232 232 232 232 232 331 331 331 331 53 53 53 288 288 288 283 283 283 283 283 283 283 283 208 208 208 208 208 331 331 331 331 331 305 305 305 116 116 116 116 116 116 223 223 223 223 223 223 223 223 305 305 305 305 305 220 220 220 220 220 220 220 220 220 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 101 101 220 220 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 249 249 249 249 249 233 233 233 233 288 288 288 288 131 131 131 131 131 329 329 329 329 329 329 329 329 329 144 144 144 144 144 187 187 187 187 187 221 221 221 221 221 221 281 281 281 281 281 273 273 273 273 273 133 133 133 133 133 221 221 221 221 221 288 288 288 287 287 287 188 188 188 188 107 107 107 107 107 208 208 208 208 208 208 208 208 50 50 50 50 50 50 107 107 107 107 107 107 107 277 277 277 277 277 277 277 101 101 101 101 101 101 101 101 101 116 116 116 116 227 227 227 227 227 105 105 105 105 105 105 105 105 281 281 281 281 281 281 281 281 281 281 281 281 281 281 133 133 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 225 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 228 228 228 228 228 228 228 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 179 179 179 179 179 179 179 179 179 179 249 249 249 249 249 249 249 249 249 229 229 229 229 229 229 229 225 225 225 225 225 225 225 204 204 204 204 204 204 231 231 231 231 231 231 231 249 249 249 249 249 249 249 109 109 109 109 109 49 49 49 117 117 117 204 204 204 204 204 204 331 331 331 331 49 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 131 131 131 131 329 329 329 329 329 329 329 144 144 144 144 144 144 331 331 331 331 331 331 331 21 21 21 233 233 233 233 233 288 288 288 287 287 287 287 48 48 48 48 227 227 227 227 227 227 133 133 133 133 133 133 133 133 133 133 133 277 277 277 277 277 277 277 204 204 204 204 204 204 204 204 227 227 227 227 227 227 227 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 47 47 47 233 233 233 225 225 225 225 133 133 133 133 280 280 280 280 280 280 280 280 280 191 191 191 288 288 288 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 288 288 288 107 107 107 107 107 204 204 204 204 204 50 50 50 50 50 171 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 277 277 277 277 49 49 49 49 49 232 232 232 227 227 227 227 227 193 193 193 193 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 233 233 233 233 137 137 137 137 137 137 277 277 277 277 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 279 279 279 279 279 279 49 49 49 49 273 273 273 273 273 273 273 273 273 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 50 50 50 50 50 171 171 171 171 171 171 171 171 171 171 171 171 69 69 69 69 69 69 277 277 277 277 277 277 49 49 49 49 232 232 232 232 227 227 227 227 227 193 193 193 285 285 285 285 285 285 285 285 285 285 285 49 49 49 233 233 233 233 233 137 137 137 137 137 277 277 277 277 277 204 204 204 204 204 204 204 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 289 289 289 289 289 49 49 49 233 233 233 288 288 288 288 288 288 107 107 107 107 107 107 208 208 208 208 208 208 208 208 208 208 208 327 327 327 327 133 133 133 133 277 277 277 277 277 277 277 204 204 204 204 204 204 204 271 271 271 271 271 271 145 145 145 145 289 289 289 289 289 289 193 193 193 193 193 221 221 221 221 221 221 221 337 337 337 337 49 49 49 225 225 225 225 225 225 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 288 288 288 288 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 320 320 320 179 179 179 179 179 179 179 179 179 249 249 249 249 249 272 272 272 272 272 272 119 119 119 119 49 49 49 49 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 228 228 228 228 228 228 228 115 115 115 115 115 164 164 164 164 164 164 164 164 164 164 164 164 102 102 102 102 102 102 102 283 283 283 283 283 283 283 283 283 283 283 37 37 37 37 224 224 224 224 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 328 328 328 328 328 50 50 50 50 50 50 331 331 331 331 331 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 115 115 115 115 115 115 115 115 277 277 277 277 133 133 133 133 133 133 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 37 37 37 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 1 1 1 187 187 187 187 187 187 187 187 187 340 340 340 340 340 340 227 227 227 227 227 227 227 100 100 100 100 100 100 100 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 101 101 101 101 101 101 101 101 101 101 101 101 101 49 49 49 49 49 281 281 281 281 281 281 281 288 288 288 288 288 95 95 95 95 95 95 95 95 95 95 95 117 117 117 117 117 117 117 117 209 209 209 209 209 209 209 224 224 224 224 224 224 47 47 47 47 328 328 328 328 328 147 147 147 147 147 147 147 147 147 147 147 293 293 293 293 293 293 293 293 225 225 225 225 204 204 204 204 204 204 107 107 107 107 107 225 225 225 225 225 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 215 215 215 215 215 215 189 189 189 189 189 189 281 281 281 288 288 288 288 288 288 288 288 223 223 223 223 53 53 53 53 53 328 328 328 328 271 271 271 271 271 271 271 271 271 271 271 271 277 277 277 193 193 193 289 289 289 289 204 204 204 204 219 219 219 219 219 219 219 219 219 219 219 219 225 225 225 225 225 225 249 249 249 249 249 249 249 249 249 249 249 249 121 121 121 121 121 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 116 99 99 99 99 99 99 99 99 99 99 328 328 328 328 328 328 328 231 231 231 231 133 133 133 133 329 329 329 329 144 144 144 144 144 179 179 179 179 179 179 179 179 179 37 37 37 116 116 116 116 50 50 50 50 50 271 271 271 271 271 271 271 271 271 277 277 277 193 193 193 289 289 289 289 204 204 204 204 204 204 204 115 115 115 115 115 115 115 277 277 277 277 133 133 133 133 133 280 280 280 280 280 280 280 280 280 187 187 187 232 232 232 227 227 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 100 100 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 101 101 101 172 172 172 172 172 172 172 119 119 119 49 49 49 288 288 288 288 102 102 102 102 102 102 219 219 219 219 219 219 219 49 49 49 49 49 232 232 232 232 232 232 275 275 275 275 275 189 189 189 229 229 229 229 229 229 229 133 133 133 133 133 229 229 229 229 229 229 229 109 109 109 109 109 109 144 144 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 288 288 288 47 47 47 328 328 328 328 328 219 219 219 219 219 219 219 219 69 69 69 69 69 69 277 277 277 277 277 277 277 277 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 191 191 191 191 191 191 191 191 191 289 289 289 289 289 280 280 280 280 280 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 119 119 119 119 119 48 48 48 227 227 227 227 227 227 227 227 227 227 69 69 69 69 276 276 276 276 287 287 287 287 287 287 48 48 48 48 48 223 223 223 223 223 223 305 305 305 305 305 220 220 220 220 220 220 220 220 220 171 171 171 171 171 171 171 171 171 69 69 69 69 277 277 277 277 277 277 333 333 333 333 333 145 145 145 145 116 116 116 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 187 187 187 187 341 341 341 341 341 341 341 49 49 49 233 233 233 288 288 288 288 288 288 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 233 233 116 116 116 119 119 119 133 133 133 133 133 133 133 232 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 219 219 219 219 219 219 219 49 49 49 232 232 232 232 187 187 187 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 49 49 49 49 49 232 232 232 119 119 119 49 49 49 49 288 288 288 288 99 99 99 99 99 99 99 228 228 228 228 228 115 115 115 115 115 277 277 277 277 133 133 133 133 281 281 281 281 281 281 281 281 281 281 281 281 288 288 288 288 288 288 288 175 175 175 175 175 175 69 69 69 69 69 69 69 277 277 277 277 277 217 217 217 217 217 217 217 217 49 49 49 49 281 281 281 281 281 281 281 281 281 281 281 281 281 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 189 189 189 189 189 280 280 280 280 280 280 280 280 227 227 227 227 227 227 227 227 227 69 69 69 69 277 277 277 277 233 233 233 233 189 189 189 189 189 236 236 236 236 236 331 331 331 331 331 331 133 133 133 232 232 232 232 232 102 102 102 102 102 102 102 102 102 223 223 223 223 133 133 133 133 133 133 133 173 173 173 173 173 288 288 288 119 119 119 119 204 204 204 204 204 47 47 47 47 47 47 47 281 281 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 228 102 102 102 102 102 102 102 102 102 171 171 171 171 171 171 171 171 171 133 133 133 133 225 225 225 225 225 225 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 47 47 47 47 47 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 285 165 165 165 165 165 165 165 165 165 165 165 229 229 229 229 229 229 229 116 116 116 116 116 107 107 107 107 107 189 189 189 189 221 221 221 221 221 221 49 49 49 49 49 340 340 340 340 340 340 340 340 102 102 102 102 102 102 179 179 179 179 179 179 37 37 37 37 37 116 116 116 116 116 287 287 287 287 48 48 48 48 48 48 331 331 331 331 331 133 133 133 133 276 276 276 276 119 119 119 119 119 119 189 189 189 189 189 280 280 280 280 280 280 280 280 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 69 69 69 69 69 277 277 277 277 277 277 277 277 277 277 49 49 49 116 116 116 116 116 116 247 247 247 247 247 247 247 247 247 225 225 225 225 225 225 225 116 116 116 1 1 1 331 331 331 331 331 331 193 193 193 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 281 204 204 204 204 204 204 115 115 115 115 115 115 115 115 277 277 277 277 277 277 133 133 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 119 119 119 119 119 204 204 204 204 204 204 67 67 67 67 67 67 67 277 277 277 277 277 277 173 173 173 173 173 173 173 173 49 49 49 233 233 233 233 233 340 340 340 340 179 179 179 179 179 37 37 37 37 37 116 116 116 116 287 287 287 48 48 48 48 48 331 331 331 331 133 133 133 133 276 276 276 276 276 276 119 119 119 119 119 49 49 49 49 228 228 228 228 228 228 335 335 335 320 320 320 320 320 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 227 227 227 227 227 227 227 227 227 227 227 149 149 149 149 149 149 149 149 113 113 113 113 113 113 113 113 49 49 49 233 233 233 288 288 288 187 187 187 187 187 232 232 232 232 232 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 223 223 223 223 223 223 223 223 223 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 288 288 288 288 288 288 331 331 331 331 331 193 193 193 233 233 233 233 289 289 289 289 289 289 144 144 144 144 115 115 115 115 115 115 115 115 115 249 249 249 249 249 249 249 233 233 233 233 233 169 169 169 169 169 169 169 169 289 289 289 289 289 189 189 189 189 116 116 116 116 116 291 291 291 291 291 291 291 291 291 291 291 277 277 277 277 277 208 208 208 208 208 208 208 208 208 208 208 208 179 179 179 179 179 179 179 179 53 53 53 53 53 53 233 233 233 233 117 117 117 117 145 145 145 145 145 145 116 116 116 116 335 335 335 335 335 335 335 335 21 21 21 21 21 21 21 21 21 21 21 21 277 277 277 277 277 277 277 277 277 117 117 117 117 117 117 340 340 340 340 47 47 47 47 328 328 328 328 328 328 328 331 331 331 331 331 193 193 193 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 204 204 204 204 287 287 287 287 287 48 48 48 119 119 119 119 204 204 204 204 204 204 204 204 47 47 47 47 47 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 225 225 225 225 225 225 225 225 49 49 49 49 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 53 53 53 53 53 53 53 53 228 228 228 228 271 271 271 271 271 209 209 209 209 209 209 273 273 273 273 273 49 49 49 224 224 224 224 279 279 279 279 279 279 279 279 279 133 133 133 116 116 116 116 116 191 191 191 288 288 288 288 288 331 331 331 49 49 49 340 340 340 340 340 340 340 107 107 107 189 189 189 189 221 221 221 221 221 221 221 221 49 49 49 49 340 340 340 340 179 179 179 179 208 208 208 219 219 219 219 219 219 219 219 219 219 305 305 305 117 117 117 117 49 49 49 49 232 232 232 232 232 279 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 224 224 224 224 224 224 224 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 288 288 288 99 99 99 99 99 99 99 99 99 99 99 99 99 116 116 116 116 116 116 116 275 275 275 275 37 37 37 37 37 37 37 37 121 121 121 121 121 144 144 144 144 144 107 107 107 107 107 189 189 189 189 225 225 225 225 225 225 225 225 225 225 209 209 209 209 209 209 209 209 209 209 328 328 328 328 119 119 119 49 49 49 288 288 288 187 187 187 288 288 288 288 331 331 331 49 49 49 340 340 340 340 340 340 340 340 83 83 83 83 83 83 83 288 288 288 288 288 47 47 47 328 328 328 328 119 119 119 119 52 52 52 52 219 219 219 219 219 219 219 219 219 219 219 219 219 219 101 101 101 101 101 101 233 233 233 117 117 117 233 233 233 49 49 49 49 49 280 280 280 280 280 280 280 47 47 47 47 328 328 328 179 179 179 189 189 189 340 340 340 340 340 340 340 179 179 179 179 179 179 179 179 179 179 21 21 21 21 21 21 21 277 277 277 277 277 277 277 288 288 288 288 288 288 288 288 331 331 331 305 305 305 117 117 117 49 49 49 49 49 49 49 233 233 233 288 288 288 288 288 288 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 133 133 133 133 232 232 232 331 331 331 208 208 208 208 208 208 175 175 175 175 175 175 175 175 21 21 21 21 21 21 288 288 288 288 288 288 19 19 19 19 232 232 232 232 232 119 119 119 52 52 52 52 52 287 287 287 287 287 287 287 287 287 287 287 287 287 277 277 277 277 165 165 165 165 165 165 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 171 171 171 171 171 171 171 171 133 133 133 133 133 225 225 225 225 225 225 288 288 288 288 131 131 131 131 340 340 340 340 340 340 340 340 340 191 191 191 191 172 172 172 172 172 172 172 172 172 1 1 1 131 131 131 131 131 131 131 131 131 131 131 131 329 329 329 329 329 329 329 277 277 277 277 205 205 205 205 205 109 109 109 109 109 109 109 25 25 25 25 25 117 117 117 117 204 204 204 204 204 227 227 227 227 227 227 227 53 53 53 53 53 53 281 281 281 281 281 288 288 288 107 107 107 107 107 204 204 204 204 204 204 204 204 223 223 223 223 223 223 223 223 223 305 305 305 305 221 221 221 221 221 221 221 189 189 189 189 189 236 236 236 236 236 236 236 236 35 35 35 35 35 288 288 288 288 288 227 227 227 227 227 208 208 208 208 208 208 47 47 47 233 233 233 116 116 116 271 271 271 271 271 271 271 271 271 271 271 271 193 193 193 193 289 289 289 289 289 289 289 205 205 205 205 189 189 189 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 1 1 1 227 227 227 227 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 288 288 288 288 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 215 215 215 215 215 215 215 215 53 53 53 53 53 53 53 281 281 281 281 288 288 288 288 288 331 331 331 331 133 133 133 133 133 233 233 233 288 288 288 287 287 287 48 48 48 48 48 48 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 220 220 220 220 220 47 47 47 233 233 233 116 116 116 187 187 187 187 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 217 49 49 49 49 49 233 233 233 116 116 116 119 119 119 49 49 49 288 288 288 288 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 116 116 116 116 19 19 19 19 19 19 19 19 232 232 232 232 232 119 119 119 52 52 52 227 227 227 227 227 227 249 249 249 249 249 249 281 281 281 281 281 281 281 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 337 337 337 337 337 337 337 337 337 337 337 337 337 337 337 321 321 321 321 321 321 321 321 321 321 321 321 289 289 289 289 49 49 49 49 49 49 49 173 173 173 173 173 173 173 173 173 49 49 49 49 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 271 271 271 271 271 271 271 271 271 271 271 271 271 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 224 224 224 224 224 224 224 224 224 224 224 224 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 107 225 225 225 225 225 225 225 225 225 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 193 193 193 193 193 193 225 225 225 225 225 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 115 115 115 115 115 277 277 277 277 133 133 133 133 133 133 133 133 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 189 189 189 189 189 221 221 221 221 221 221 49 49 49 49 49 340 340 340 340 340 340 331 331 331 193 193 193 193 193 232 232 232 232 335 335 335 335 335 335 335 320 320 320 320 320 320 320 320 320 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 276 276 276 276 276 276 276 276 187 187 187 187 187 229 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 217 49 49 49 233 233 233 189 189 189 189 189 236 236 236 236 236 236 335 335 335 335 335 335 320 320 320 320 320 227 227 227 227 227 227 101 101 101 101 101 101 101 288 288 288 288 288 288 131 131 131 340 340 340 340 340 340 340 340 340 331 331 331 331 133 133 133 133 224 224 224 224 224 224 187 187 187 187 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 217 49 49 49 49 232 232 232 232 232 279 279 279 279 279 279 53 53 53 53 229 229 229 229 293 293 293 293 293 293 293 189 189 189 236 236 236 236 236 236 236 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 292 292 292 292 292 292 292 292 292 331 331 331 331 331 331 331 331 101 101 101 101 101 101 101 101 101 101 101 101 101 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 50 50 50 50 50 50 50 50 50 50 50 50 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 193 193 193 193 193 193 193 193 193 193 193 176 176 176 176 176 176 176 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 288 288 288 288 288 288 288 288 288 288 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 225 225 225 225 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 145 145 145 145 145 145 145 145 145 145 340 340 340 340 340 340 340 340 47 47 47 47 47 233 233 233 116 116 116 116 231 231 231 231 231 231 231 231 21 21 21 21 21 21 21 21 21 21 117 117 117 189 189 189 189 236 236 236 236 236 236 236 236 236 236 271 271 271 271 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 225 321 321 321 321 321 321 321 321 321 321 321 321 229 229 229 229 229 229 229 229 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 47 233 233 233 116 116 116 50 50 50 50 50 175 175 175 175 175 175 175 175 175 175 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 225 225 225 225 116 116 116 116 116 116 116 116 331 331 331 331 331 331 331 331 331 21 21 21 21 21 21 21 21 21 21 21 112 112 112 112 112 112 112 112 112 112 112 47 47 47 47 233 233 233 116 116 116 116 116 116 116 116 1 1 1 1 1 219 219 219 219 219 219 219 219 219 219 219 219 193 193 193 193 116 116 116 116 116 116 116 116 175 175 175 175 175 175 225 225 225 225 225 225 225 225 225 53 53 53 53 53 53 53 53 329 329 329 329 329 340 340 340 340 340 340 340 340 47 47 47 47 233 233 233 233 233 116 116 116 116 107 107 107 107 107 107 107 107 107 107 107 107 321 321 321 321 321 321 321 321 321 321 321 321 289 289 289 289 289 289 289 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 171 171 171 171 171 171 171 171 171 133 133 133 225 225 225 225 225 225 225 225 225 288 288 288 288 111 111 111 111 111 111 111 111 111 111 111 193 193 193 193 277 277 277 277 277 277 116 116 116 116 116 116 51 51 51 51 51 51 51 51 272 272 272 272 1 1 1 275 275 275 275 275 275 275 275 101 101 101 101 101 101 101 101 101 288 288 288 288 47 47 47 47 47 333 333 333 333 333 333 333 333 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 102 102 102 102 102 102 102 102 102 102 127 127 127 233 233 233 233 233 217 217 217 217 217 217 217 265 265 265 265 265 265 265 265 265 265 265 116 116 116 227 227 227 227 227 100 100 100 100 100 100 100 100 287 287 287 287 287 287 287 287 277 277 277 277 193 193 193 272 272 272 272 287 287 287 287 287 287 287 287 188 188 188 119 119 119 119 119 119 204 204 204 204 204 204 204 204 99 99 99 99 99 99 99 99 99 99 99 225 225 225 225 225 225 49 49 49 233 233 233 116 116 116 116 116 331 331 331 189 189 189 292 292 292 292 292 292 292 292 292 1 1 1 67 67 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 227 227 227 227 227 227 227 100 100 100 100 100 100 100 100 100 100 100 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 331 331 331 331 331 331 53 53 53 53 53 53 53 341 341 341 341 341 49 49 49 233 233 233 288 288 288 288 50 50 50 50 107 107 107 107 107 107 107 107 107 107 107 107 107 107 193 193 193 193 193 193 288 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 193 193 193 193 193 193 193 193 220 220 220 220 220 219 219 219 219 219 219 219 219 219 53 53 53 53 229 229 229 229 189 189 189 189 236 236 236 236 236 236 236 236 247 247 247 247 247 247 247 247 247 329 329 329 329 329 329 329 144 144 144 144 144 187 187 187 187 232 232 232 119 119 119 48 48 48 48 48 107 107 107 107 107 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 231 231 231 231 231 101 101 101 101 101 101 101 101 101 101 121 121 121 121 144 144 144 144 144 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 227 227 227 227 193 193 193 193 281 281 281 281 281 189 189 189 340 340 340 340 279 279 279 279 279 279 273 273 273 273 273 133 133 133 133 233 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 281 144 144 144 144 144 144 144 144 144 144 144 144 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 71 71 71 71 71 71 71 225 225 225 225 121 121 121 121 121 248 248 248 248 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 215 215 215 215 215 215 215 215 133 133 133 133 233 233 233 233 233 145 145 145 145 145 145 145 145 49 49 49 225 225 225 225 225 225 225 204 204 204 204 204 204 204 204 204 204 204 204 204 204 187 187 187 187 187 187 187 187 187 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 279 279 279 279 279 279 279 133 133 133 133 133 133 116 116 116 116 116 116 283 283 283 283 283 208 208 208 208 208 208 208 179 179 179 179 179 179 37 37 37 37 37 37 117 117 117 117 49 49 49 49 232 232 232 232 232 287 287 287 287 287 287 287 287 287 101 101 101 101 101 101 101 101 101 228 228 228 228 228 228 228 287 287 287 188 188 188 175 175 175 175 175 175 193 193 193 193 193 193 193 193 288 288 288 288 288 279 279 279 279 279 279 279 279 279 279 279 279 193 193 193 193 193 193 193 193 193 220 220 220 220 220 220 220 220 220 1 1 1 331 331 331 331 331 331 331 331 331 21 21 21 21 21 21 113 113 113 113 113 113 113 189 189 189 189 236 236 236 236 287 287 287 287 188 188 188 188 279 279 279 279 279 279 279 279 279 279 279 279 208 208 208 208 208 208 208 208 119 119 119 49 49 49 288 288 288 288 102 102 102 102 102 102 102 102 115 115 115 115 115 115 193 193 193 117 117 117 49 49 49 232 232 232 232 232 171 171 171 171 171 171 171 171 171 171 21 21 21 21 21 21 21 21 224 224 224 224 224 224 224 224 224 224 247 247 247 247 247 247 247 329 329 329 329 329 329 145 145 145 145 145 109 109 109 109 109 109 109 109 73 73 73 73 73 73 73 277 277 277 277 277 277 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 279 279 279 279 279 279 279 279 133 133 133 133 133 133 133 116 116 116 116 116 283 283 283 283 283 283 283 283 283 283 208 208 208 208 231 231 231 231 231 231 231 231 231 231 133 133 133 133 133 133 329 329 329 329 144 144 144 144 144 144 144 144 279 279 279 279 279 279 279 279 279 279 68 68 68 68 68 68 68 68 68 68 119 119 119 119 119 48 48 48 48 48 107 107 107 107 107 107 107 107 107 107 209 209 209 209 209 209 209 288 288 288 288 47 47 47 47 328 328 328 328 328 227 227 227 227 227 208 208 208 208 208 208 171 171 171 171 171 171 144 144 144 271 271 271 271 271 271 271 271 271 271 271 277 277 277 277 277 85 85 85 85 85 85 225 225 225 225 225 225 189 189 189 189 189 189 236 236 236 236 236 236 47 47 47 47 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 53 288 288 288 191 191 191 191 191 172 172 172 172 172 172 172 172 191 191 191 288 288 288 288 219 219 219 219 219 219 219 219 219 37 37 37 37 37 37 37 37 37 273 273 273 273 273 273 288 288 288 179 179 179 144 144 144 144 171 171 171 171 171 171 171 145 145 145 145 228 228 228 228 228 228 228 107 107 107 107 107 209 209 209 209 209 189 189 189 189 189 189 189 236 236 236 236 236 236 236 236 236 236 236 236 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 281 281 281 281 281 281 281 281 281 281 281 281 197 197 197 197 197 197 197 197 220 220 220 220 220 220 187 187 187 289 289 289 289 280 280 280 280 280 50 50 50 50 227 227 227 227 227 227 227 227 149 149 149 149 149 149 149 149 149 149 149 281 281 281 281 281 281 281 281 281 281 281 204 204 204 204 204 204 204 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 193 193 193 193 193 116 116 116 116 271 271 271 271 271 271 271 271 271 277 277 277 277 85 85 85 85 85 85 85 85 224 224 224 224 224 224 224 224 187 187 187 187 187 341 341 341 341 341 341 49 49 49 49 233 233 233 233 288 288 288 288 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 102 102 102 102 102 331 331 331 331 331 331 331 331 21 21 21 233 233 233 289 289 289 49 49 49 116 116 116 287 287 287 188 188 188 188 279 279 279 279 279 279 279 279 279 279 279 279 208 208 208 208 208 208 208 208 208 131 131 131 131 131 329 329 329 329 329 329 329 277 277 277 205 205 205 293 293 293 293 293 197 197 197 236 236 236 119 119 119 119 49 49 49 288 288 288 331 331 331 49 49 49 340 340 340 340 340 340 287 287 287 287 287 188 188 188 107 107 107 107 107 107 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 209 209 209 209 209 209 209 209 209 232 232 232 232 232 19 19 19 19 19 19 19 19 232 232 232 119 119 119 119 119 37 37 37 37 37 37 37 37 37 288 288 288 288 107 107 107 107 107 249 249 249 249 249 249 249 249 249 249 249 249 249 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 189 189 189 189 189 221 221 221 221 221 49 49 49 49 49 340 340 340 340 340 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 193 193 193 193 193 117 117 117 49 49 49 49 49 49 49 232 232 232 231 231 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 248 248 248 331 331 331 331 331 133 133 133 133 121 121 121 121 121 121 121 144 144 144 144 144 144 99 99 99 99 99 99 99 99 99 99 116 116 116 116 116 116 131 131 131 131 329 329 329 329 329 329 144 144 144 144 144 179 179 179 179 179 179 179 179 179 37 37 37 328 328 328 328 328 47 47 47 47 233 233 233 233 233 233 53 53 53 53 53 53 53 121 121 121 121 121 144 144 144 144 144 144 144 144 144 23 23 23 23 23 273 273 273 273 273 145 145 145 145 145 289 289 289 289 289 289 289 289 289 289 289 289 289 321 321 321 321 321 321 321 233 233 233 233 49 49 49 49 49 289 289 289 289 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 133 133 133 133 133 133 133 133 133 276 276 276 276 276 146 146 146 146 146 146 146 146 146 146 146 50 50 50 50 50 50 50 50 50 50 50 223 223 223 223 223 223 223 223 223 223 223 223 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 288 288 288 288 288 288 227 227 227 227 227 227 227 227 69 69 69 69 69 69 69 276 276 276 276 276 276 276 276 276 1 1 1 1 1 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 133 133 133 133 133 277 277 277 277 277 204 204 204 204 204 204 204 204 204 204 287 287 287 287 287 287 287 287 287 277 277 277 277 209 209 209 209 209 209 340 340 340 340 340 340 340 340 340 340 340 340 67 67 67 67 67 67 67 67 67 67 67 67 67 224 224 224 224 224 224 224 224 187 187 187 187 187 232 232 232 232 232 232 232 232 232 107 107 107 107 107 107 107 225 225 225 225 225 225 225 225 225 225 225 225 225 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 321 228 228 228 228 228 228 228 228 228 228 228 228 228 228 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 193 193 193 193 193 193 193 193 193 193 193 280 280 280 280 280 280 280 280 280 1 1 1 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 225 225 225 225 225 225 225 49 49 49 49 49 49 49 233 233 233 116 116 116 116 116 187 187 187 340 340 340 340 340 340 340 340 119 119 119 119 119 52 52 52 52 52 52 52 52 52 1 1 1 1 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 271 271 271 271 271 271 271 271 271 271 271 271 225 225 225 225 165 165 165 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 102 102 102 102 102 102 102 102 102 215 215 215 215 215 215 215 189 189 189 189 189 281 281 281 281 288 288 288 288 288 288 288 288 223 223 223 223 223 223 53 53 53 53 53 328 328 328 328 328 191 191 191 288 288 288 288 288 288 63 63 63 63 63 63 63 63 63 225 225 225 225 225 225 225 225 277 277 277 277 277 277 277 133 133 133 133 133 133 133 117 117 117 117 117 204 204 204 204 204 204 204 204 204 204 204 35 35 35 233 233 233 116 116 116 99 99 99 99 99 99 228 228 228 228 228 228 228 279 279 279 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 248 248 175 175 175 175 175 175 175 175 175 175 175 225 225 225 225 225 225 225 225 225 225 225 37 37 37 37 37 116 116 116 116 99 99 99 99 99 99 228 228 228 228 228 228 228 228 228 175 175 175 175 175 175 249 249 249 249 249 189 189 189 189 189 189 236 236 236 287 287 287 287 287 48 48 48 48 48 48 223 223 223 223 223 223 223 193 193 193 193 193 328 328 328 328 328 179 179 179 179 179 179 179 209 209 209 209 209 209 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 99 99 99 99 99 99 99 99 99 99 99 328 328 328 328 328 328 328 328 67 67 67 225 225 225 225 333 333 333 333 333 333 333 205 205 205 205 340 340 340 340 340 340 340 179 179 179 179 179 179 179 179 179 149 149 149 149 149 149 116 116 116 116 119 119 119 49 49 49 49 49 288 288 288 288 288 271 271 271 271 271 271 277 277 277 277 193 193 193 233 233 233 233 233 233 233 233 280 280 280 280 280 280 280 131 131 131 131 131 117 117 117 117 117 117 333 333 333 333 145 145 145 145 116 116 116 116 116 116 116 116 116 116 99 99 99 99 99 99 99 99 99 99 99 225 225 225 225 225 49 49 49 49 49 233 233 233 116 116 116 331 331 331 331 331 49 49 49 340 340 340 340 340 340 119 119 119 52 52 52 52 271 271 271 271 271 271 271 271 271 271 271 271 277 277 277 277 193 193 193 289 289 289 205 205 205 205 205 205 205 49 49 49 49 49 49 281 281 281 281 281 281 288 288 288 271 271 271 271 271 271 225 225 225 225 225 165 165 165 165 165 165 165 165 280 280 280 280 280 280 280 280 280 280 280 187 187 187 232 232 232 119 119 119 52 52 52 52 52 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 225 225 225 225 225 225 225 225 225 225 225 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 47 47 47 47 47 47 47 233 233 233 116 116 116 102 102 102 102 102 102 335 335 335 335 335 335 335 335 335 335 335 321 321 321 321 341 341 341 341 341 341 341 116 116 116 287 287 287 48 48 48 48 48 187 187 187 229 229 229 229 229 229 229 229 37 37 37 37 37 37 37 37 217 217 217 217 217 217 217 217 217 49 49 49 232 232 232 232 232 102 102 102 102 102 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 340 340 223 223 223 223 223 223 223 193 193 193 193 193 329 329 329 329 189 189 189 189 189 236 236 236 236 179 179 179 179 179 179 179 179 179 179 179 209 209 209 209 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 288 288 288 288 102 102 102 102 102 102 102 102 102 102 231 231 231 231 231 231 231 231 133 133 133 133 133 329 329 329 329 329 329 329 144 144 144 144 144 144 144 144 275 275 275 275 275 275 275 275 275 275 275 209 209 209 209 209 209 225 225 225 225 225 225 204 204 204 204 204 204 187 187 187 187 221 221 221 221 221 221 281 281 281 281 281 281 281 273 273 273 273 273 273 133 133 133 133 221 221 221 221 221 289 289 289 289 289 289 49 49 49 116 116 116 116 102 102 102 102 102 102 102 102 102 102 102 102 331 331 331 331 331 331 331 331 331 331 331 331 305 305 305 305 305 305 305 305 305 305 305 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 289 289 289 289 289 289 280 280 280 280 280 280 280 115 115 115 115 115 189 189 189 189 189 189 225 225 225 225 225 225 225 225 101 101 101 101 101 101 101 101 101 101 101 289 289 289 289 289 289 173 173 173 173 173 49 49 49 49 224 224 224 224 224 224 331 331 331 331 331 193 193 193 193 232 232 232 232 335 335 335 335 305 305 305 276 276 276 276 276 276 276 276 187 187 187 187 187 229 229 229 229 229 229 229 41 41 41 41 41 41 41 41 217 217 217 217 217 217 217 217 217 49 49 49 233 233 233 233 233 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 49 49 49 233 233 233 340 340 340 340 340 340 219 219 219 219 219 219 219 219 219 219 53 53 53 53 228 228 228 228 228 228 228 287 287 287 287 287 287 287 287 287 277 277 277 277 320 320 320 320 320 320 320 320 320 320 191 191 191 191 191 341 341 341 341 49 49 49 49 233 233 233 233 233 288 288 288 288 187 187 187 187 187 187 187 187 187 187 187 187 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 53 53 53 53 288 288 288 288 288 119 119 119 119 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 340 340 340 340 340 340 275 275 275 275 275 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 117 117 117 117 117 340 340 340 340 340 146 146 146 146 146 146 279 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 248 248 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 53 53 53 53 53 53 53 233 233 233 233 233 233 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 133 133 133 232 232 232 331 331 331 208 208 208 208 208 208 208 175 175 175 175 175 175 175 21 21 21 21 21 21 288 288 288 187 187 187 187 187 233 233 233 233 233 233 233 289 289 289 289 289 289 48 48 48 48 119 119 119 119 119 52 52 52 52 52 52 52 52 287 287 287 287 287 287 287 287 287 277 277 277 277 277 165 165 165 165 165 165 165 165 232 232 232 232 232 232 232 35 35 35 288 288 288 283 283 283 283 283 283 283 283 283 283 21 21 21 21 277 277 277 277 277 277 277 225 225 225 225 49 49 49 49 49 49 289 289 289 289 289 289 289 289 289 289 289 289 289 289 89 89 89 89 89 89 89 89 89 89 89 89 232 232 232 232 47 47 47 233 233 233 116 116 116 119 119 119 52 52 52 52 52 52 52 275 275 275 275 275 275 275 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 116 116 275 275 275 275 275 275 249 249 249 249 249 249 249 249 249 117 117 117 117 117 340 340 340 340 340 107 107 107 107 205 205 205 205 177 177 177 177 177 177 177 37 37 37 37 37 37 37 37 37 232 232 232 232 287 287 287 48 48 48 48 48 171 171 171 171 171 171 171 171 171 225 225 225 225 37 37 37 37 37 37 37 37 37 37 37 37 284 284 284 284 284 284 284 284 284 284 271 271 271 271 271 271 271 271 271 271 271 271 37 37 37 37 37 37 37 37 37 37 37 37 37 37 281 281 281 281 281 281 281 281 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 288 288 288 288 227 227 227 227 193 193 193 193 193 193 281 281 281 281 281 281 189 189 189 189 340 340 340 340 279 279 279 279 279 273 273 273 273 273 273 133 133 133 133 233 233 233 233 233 233 233 281 281 281 281 281 281 281 281 144 144 144 144 331 331 331 331 331 331 53 53 53 53 288 288 288 288 288 227 227 227 227 227 165 165 165 165 165 165 165 116 116 116 116 119 119 119 49 49 49 49 228 228 228 228 228 228 228 228 228 275 275 275 275 133 133 133 133 133 133 133 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 233 233 233 116 116 116 116 283 283 283 283 283 283 283 283 283 208 208 208 208 208 208 208 208 279 279 279 279 279 279 279 279 279 279 133 133 133 133 116 116 116 116 116 116 283 283 283 283 283 283 283 208 208 208 208 208 115 115 115 115 115 115 193 193 193 193 193 117 117 117 117 49 49 49 232 232 232 231 231 231 231 231 231 231 248 248 248 248 248 248 47 47 47 47 47 233 233 233 116 116 116 171 171 171 171 144 144 144 144 144 144 271 271 271 271 271 271 271 271 271 271 193 193 193 289 289 289 289 289 205 205 205 205 205 340 340 340 340 340 340 279 279 279 279 279 279 279 279 279 165 165 165 165 165 165 165 220 220 220 220 220 220 231 231 231 231 231 21 21 21 21 21 21 21 21 288 288 288 287 287 287 48 48 48 48 35 35 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 220 220 220 220 179 179 179 144 144 144 144 131 131 131 131 233 233 233 233 204 204 204 204 227 227 227 227 227 227 227 227 69 69 69 69 276 276 276 276 276 276 219 219 219 219 219 219 219 219 219 333 333 333 133 133 133 133 133 281 281 281 281 281 281 113 113 113 113 113 113 113 113 113 49 49 49 49 49 233 233 233 233 233 233 233 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 283 283 283 283 283 283 283 283 283 283 283 208 208 208 208 208 279 279 279 279 279 279 279 133 133 133 133 116 116 116 102 102 102 102 102 102 102 102 102 227 227 227 227 227 227 227 53 53 53 53 53 53 281 281 281 288 288 288 179 179 179 37 37 37 328 328 328 328 35 35 35 35 35 35 35 35 35 35 35 281 281 281 281 281 288 288 288 288 288 179 179 179 144 144 144 50 50 50 50 50 50 291 291 291 291 291 291 291 291 291 291 291 85 85 85 85 85 85 85 85 85 85 85 85 341 341 341 341 341 341 341 341 49 49 49 233 233 233 116 116 116 116 63 63 63 63 63 63 63 63 225 225 225 225 225 225 225 225 277 277 277 277 277 133 133 133 133 133 133 117 117 117 117 117 117 204 204 204 204 204 204 204 204 204 204 204 204 204 204 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 279 279 279 279 279 279 279 279 49 49 49 49 273 273 273 273 273 273 273 249 249 249 249 249 249 249 249 249 340 340 340 340 340 340 340 340 102 102 102 102 102 102 102 102 102 102 102 102 102 179 179 179 179 179 179 179 179 179 179 179 37 37 37 37 37 37 37 37 37 37 116 116 116 116 116 116 116 287 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 107 107 107 107 107 53 53 53 53 53 53 53 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 179 179 179 179 179 179 179 179 179 179 179 179 84 84 84 84 84 84 84 84 84 84 335 335 335 335 335 335 335 335 335 335 320 320 320 175 175 175 175 175 175 175 249 249 249 189 189 189 189 189 189 236 236 236 287 287 287 287 188 188 188 171 171 171 171 171 171 171 171 101 101 101 101 101 101 101 101 101 101 101 101 233 233 233 233 116 116 116 116 116 83 83 83 83 83 83 83 288 288 288 288 47 47 47 47 109 109 109 109 109 109 85 85 85 85 85 85 85 85 85 85 85 288 288 288 288 288 291 291 291 291 291 193 193 193 237 237 237 237 237 237 237 340 340 340 340 340 340 340 191 191 191 172 172 172 335 335 335 335 320 320 320 115 115 115 115 115 115 115 249 249 249 249 249 249 249 233 233 233 288 288 288 288 35 35 35 35 35 35 35 35 281 281 281 281 281 281 281 281 220 220 220 219 219 219 333 333 333 333 133 133 133 133 133 281 281 281 281 281 281 281 281 113 113 113 113 113 113 113 113 49 49 49 49 49 49 233 233 233 233 233 233 233 233 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 233 233 233 116 116 116 331 331 331 53 53 53 53 53 53 53 53 288 288 288 288 288 288 288 288 288 288 115 115 115 115 115 115 115 115 53 53 53 53 53 53 53 53 53 53 340 340 340 340 340 340 340 340 340 340 340 340 227 227 227 227 227 165 165 165 165 165 165 220 220 220 220 220 220 220 220 119 119 119 119 48 48 48 48 48 48 275 275 275 275 275 275 275 275 275 249 249 249 249 249 249 249 249 117 117 117 117 117 117 340 340 340 340 340 340 340 340 340 275 275 275 275 275 275 133 133 133 133 133 133 133 133 116 116 116 116 116 116 116 116 116 116 116 116 116 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 331 133 133 133 133 133 133 133 133 133 224 224 224 224 224 224 224 231 231 231 231 231 231 231 231 231 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 84 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 49 49 49 49 49 233 233 233 233 233 233 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 279 279 279 279 279 279 279 279 279 279 279 279 279 279 133 133 133 133 116 116 116 116 116 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 337 337 337 337 337 337 337 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 119 119 119 119 119 119 119 133 133 133 277 277 277 116 116 116 107 107 107 107 208 208 208 208 208 208 231 231 231 231 231 231 231 231 248 248 248 248 248 248 248 279 279 279 279 279 279 279 279 279 221 221 221 221 221 221 221 249 249 249 249 249 249 272 272 272 171 171 171 171 171 171 171 171 144 144 144 144 187 187 187 187 187 187 187 187 187 187 229 229 229 229 229 229 41 41 41 41 41 41 41 41 217 217 217 217 217 217 217 217 49 49 49 233 233 233 233 233 165 165 165 165 165 165 165 165 285 285 285 285 285 285 285 285 285 285 285 285 285 49 49 49 49 49 232 232 232 232 232 232 119 119 119 119 133 133 133 133 133 133 133 133 133 232 232 232 232 232 232 232 232 232 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 305 305 305 305 116 116 116 116 116 116 116 116 116 119 119 119 133 133 133 133 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 276 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 53 53 53 288 288 288 288 35 35 35 35 35 35 228 228 228 228 228 102 102 102 102 102 102 102 102 1 1 1 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 221 221 221 221 221 221 189 189 189 189 236 236 236 236 287 287 287 287 287 287 287 287 320 320 320 320 320 227 227 227 227 227 227 53 53 53 53 53 53 53 53 53 53 53 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 112 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 271 271 271 271 271 271 271 209 209 209 209 209 209 209 273 273 273 49 49 49 224 224 224 224 224 224 224 19 19 19 19 19 19 19 276 276 276 276 276 276 276 67 67 67 67 67 225 225 225 333 333 333 333 333 205 205 205 205 340 340 340 340 340 287 287 287 287 287 287 287 287 133 133 133 225 225 225 225 225 189 189 189 189 189 189 236 236 236 236 227 227 227 227 227 227 208 208 208 208 208 208 208 208 208 102 102 102 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 305 305 305 116 116 116 116 335 335 335 335 335 320 320 320 320 320 275 275 275 275 275 275 37 37 37 37 37 37 37 37 37 37 121 121 121 121 121 144 144 144 144 144 144 144 102 102 102 102 102 102 102 102 115 115 115 115 115 115 115 193 193 193 193 193 117 117 117 49 49 49 232 232 232 232 287 287 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 69 69 69 69 69 69 220 220 220 220 220 220 220 220 220 220 220 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 187 187 187 187 187 187 187 187 187 187 172 172 172 172 172 172 172 172 335 335 335 335 320 320 320 320 279 279 279 279 279 279 279 279 279 279 279 279 164 164 164 164 164 164 164 164 164 279 279 279 279 279 279 279 279 279 279 279 248 248 248 248 248 248 248 99 99 99 99 99 224 224 224 224 224 224 224 279 279 279 279 279 279 279 279 279 289 289 289 289 289 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 272 272 272 272 272 272 272 272 272 272 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 102 102 102 102 102 102 102 102 102 102 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 37 37 37 37 37 37 37 37 37 232 232 232 232 232 232 232 232 232 279 279 279 279 279 279 279 289 289 289 289 289 21 21 21 21 21 21 21 21 21 21 272 272 272 272 272 331 331 331 133 133 133 232 232 232 232 102 102 102 102 102 102 102 227 227 227 227 227 227 227 227 227 165 165 165 165 165 165 220 220 220 220 220 220 220 220 51 51 51 51 51 51 272 272 272 272 227 227 227 227 227 100 100 100 100 100 100 100 100 227 227 227 227 227 227 227 227 227 227 101 101 101 101 101 101 101 101 101 101 233 233 233 116 116 116 287 287 287 287 287 287 287 287 320 320 320 320 320 320 320 187 187 187 187 187 187 288 288 288 288 288 288 71 71 71 71 71 71 225 225 225 225 121 121 121 121 248 248 248 248 248 248 248 248 248 248 248 187 187 187 187 187 187 289 289 289 289 289 280 280 280 280 280 280 280 115 115 115 115 115 115 193 193 193 193 193 173 173 173 173 173 173 173 49 49 49 49 221 221 221 221 221 49 49 49 49 49 225 225 225 225 225 225 225 225 225 225 225 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 227 227 227 227 227 227 227 227 227 227 227 227 227 37 37 37 37 37 37 37 37 37 37 37 37 37 293 293 293 293 293 293 293 293 293 293 293 337 337 337 337 337 337 337 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 316 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 49 49 49 340 340 340 340 340 340 340 187 187 187 233 233 233 233 233 233 217 217 217 217 217 217 217 265 265 265 265 265 265 265 189 189 189 189 189 189 189 189 236 236 236 236 236 236 179 179 179 179 189 189 189 229 229 229 229 229 229 281 281 281 281 281 281 281 281 133 133 133 133 225 225 225 225 225 225 225 225 225 225 225 225 225 172 172 172 172 172 172 172 172 172 172 172 172 172 172 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 223 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 101 101 220 220 220 220 220 220 227 227 227 227 227 227 227 227 227 249 249 249 249 249 249 249 249 249 249 281 281 281 281 281 281 281 288 288 288 288 288 288 288 219 219 219 219 219 219 219 219 333 333 333 333 333 333 101 101 101 101 101 101 101 101 101 101 49 49 49 49 288 288 288 288 288 171 171 171 171 171 171 171 171 171 249 249 249 249 249 249 249 249 249 249 249 249 221 221 221 221 221 221 221 221 280 280 280 280 280 280 280 179 179 179 179 179 179 208 208 208 208 208 208 208 208 223 223 223 223 223 223 223 101 101 101 101 101 101 101 101 221 221 221 221 221 221 288 288 288 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 69 69 221 221 221 221 221 49 49 49 289 289 289 289 189 189 189 189 328 328 328 328 271 271 271 271 271 271 271 271 271 271 209 209 209 209 209 209 209 209 209 273 273 273 273 273 273 49 49 49 49 49 224 224 224 224 224 224 224 331 331 331 331 331 133 133 133 133 133 232 232 232 232 232 232 119 119 119 164 164 164 164 164 164 331 331 331 331 331 331 331 331 331 144 144 144 144 144 144 331 331 331 331 331 331 331 193 193 193 193 225 225 225 225 225 225 189 189 189 189 189 189 236 236 236 236 236 236 236 287 287 287 287 287 287 188 188 188 115 115 115 115 115 115 115 320 320 320 320 320 320 320 320 119 119 119 119 48 48 48 48 287 287 287 287 287 287 287 287 69 69 69 69 69 69 69 69 69 69 69 221 221 221 221 221 221 221 221 189 189 189 236 236 236 236 236 236 119 119 119 119 49 49 49 49 229 229 229 229 229 281 281 281 281 281 281 281 281 281 281 281 281 133 133 133 133 133 133 225 225 225 225 225 225 225 225 225 225 329 329 329 329 329 340 340 340 340 340 340 340 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 35 35 35 35 35 35 35 35 35 233 233 233 116 116 116 115 115 115 115 193 193 193 116 116 116 231 231 231 231 231 231 21 21 21 21 21 21 288 288 288 288 288 187 187 187 221 221 221 221 221 221 281 281 281 281 281 281 273 273 273 273 273 133 133 133 133 133 133 221 221 221 221 221 221 288 288 288 288 288 288 187 187 187 228 228 228 228 228 228 287 287 287 287 287 188 188 188 219 219 219 219 219 219 219 219 219 219 219 219 209 209 209 209 209 209 209 272 272 272 272 272 272 272 51 51 51 51 51 51 51 51 51 51 272 272 272 272 179 179 179 189 189 189 189 189 340 340 340 340 340 340 340 340 340 131 131 131 131 131 233 233 233 233 233 233 116 116 116 116 116 47 47 47 328 328 328 328 328 328 328 191 191 191 191 288 288 288 288 288 288 288 288 288 288 288 288 288 288 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 288 288 288 288 179 179 179 179 179 179 208 208 208 179 179 179 37 37 37 116 116 116 231 231 231 231 231 231 231 231 231 133 133 133 133 133 133 329 329 329 329 329 329 329 329 144 144 144 144 144 187 187 187 187 187 221 221 221 221 221 221 221 281 281 281 281 281 281 281 281 281 273 273 273 273 273 133 133 133 133 133 133 221 221 221 221 221 289 289 289 289 289 289 189 189 189 116 116 116 287 287 287 287 287 320 320 320 320 320 320 320 320 187 187 187 233 233 233 233 233 233 217 217 217 217 217 217 264 264 264 264 264 264 264 264 264 264 264 119 119 119 119 119 52 52 52 52 52 279 279 279 279 279 279 279 49 49 49 49 281 281 281 281 281 281 281 281 281 281 281 281 281 101 101 101 101 101 101 101 101 101 101 101 101 101 49 49 49 289 289 289 289 289 289 289 289 289 204 204 204 204 47 47 47 47 328 328 328 328 328 328 328 50 50 50 50 50 223 223 223 223 193 193 193 289 289 289 289 289 49 49 49 49 224 224 224 224 175 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 331 331 331 331 331 331 331 331 331 331 331 193 193 193 193 229 229 229 229 229 229 229 49 49 49 49 49 232 232 232 232 232 232 232 232 232 331 331 331 331 144 144 144 144 144 107 107 107 107 107 107 107 37 37 37 37 37 37 37 37 37 37 116 116 116 116 116 187 187 187 187 233 233 233 233 233 233 233 53 53 53 53 53 53 53 53 53 172 172 172 172 172 172 172 187 187 187 232 232 232 232 232 232 67 67 67 67 67 67 67 67 224 224 224 224 224 224 219 219 219 219 219 219 219 219 219 21 21 21 21 21 21 21 21 233 233 233 233 233 233 285 285 285 285 285 285 285 285 49 49 49 49 49 233 233 233 233 233 233 233 280 280 280 280 280 280 280 280 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 107 107 107 107 107 107 53 53 53 53 53 53 288 288 288 288 288 223 223 223 223 223 223 193 193 193 289 289 289 49 49 49 49 49 224 224 224 224 224 224 224 175 175 175 175 175 175 175 149 149 149 149 149 149 149 149 149 149 149 149 149 149 225 225 225 225 225 225 225 225 225 225 225 225 225 225 340 340 340 340 340 340 340 340 340 340 340 340 340 340 340 331 331 331 331 331 331 144 144 144 144 144 144 144 331 331 331 331 331 331 331 331 331 331 331 331 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 149 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 280 1 1 1 1 1 diff --git a/SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.tsv b/SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.tsv new file mode 100644 index 0000000..77da1d3 --- /dev/null +++ b/SpeechLM/dataset/LibriSpeech/phone_unit/train_sample100.tsv @@ -0,0 +1,101 @@ +/LocalData/dataset/LibriSpeech +train-clean-100/103/1240/103-1240-0000.flac 225360 +train-clean-100/103/1240/103-1240-0001.flac 255120 +train-clean-100/103/1240/103-1240-0002.flac 223120 +train-clean-100/103/1240/103-1240-0003.flac 235360 +train-clean-100/103/1240/103-1240-0004.flac 200240 +train-clean-100/103/1240/103-1240-0005.flac 242800 +train-clean-100/103/1240/103-1240-0006.flac 153280 +train-clean-100/103/1240/103-1240-0007.flac 240560 +train-clean-100/103/1240/103-1240-0008.flac 246960 +train-clean-100/103/1240/103-1240-0009.flac 160480 +train-clean-100/103/1240/103-1240-0010.flac 236880 +train-clean-100/103/1240/103-1240-0011.flac 234480 +train-clean-100/103/1240/103-1240-0012.flac 243040 +train-clean-100/103/1240/103-1240-0013.flac 244160 +train-clean-100/103/1240/103-1240-0014.flac 223360 +train-clean-100/103/1240/103-1240-0015.flac 60960 +train-clean-100/103/1240/103-1240-0016.flac 250640 +train-clean-100/103/1240/103-1240-0017.flac 229040 +train-clean-100/103/1240/103-1240-0018.flac 185760 +train-clean-100/103/1240/103-1240-0019.flac 246480 +train-clean-100/103/1240/103-1240-0020.flac 214640 +train-clean-100/103/1240/103-1240-0021.flac 236960 +train-clean-100/103/1240/103-1240-0022.flac 262000 +train-clean-100/103/1240/103-1240-0023.flac 194400 +train-clean-100/103/1240/103-1240-0024.flac 244320 +train-clean-100/103/1240/103-1240-0025.flac 241920 +train-clean-100/103/1240/103-1240-0026.flac 133360 +train-clean-100/103/1240/103-1240-0027.flac 223440 +train-clean-100/103/1240/103-1240-0028.flac 250400 +train-clean-100/103/1240/103-1240-0029.flac 244320 +train-clean-100/103/1240/103-1240-0030.flac 232320 +train-clean-100/103/1240/103-1240-0031.flac 269760 +train-clean-100/103/1240/103-1240-0032.flac 236400 +train-clean-100/103/1240/103-1240-0033.flac 230640 +train-clean-100/103/1240/103-1240-0034.flac 246480 +train-clean-100/103/1240/103-1240-0035.flac 256720 +train-clean-100/103/1240/103-1240-0036.flac 200320 +train-clean-100/103/1240/103-1240-0037.flac 237040 +train-clean-100/103/1240/103-1240-0038.flac 114480 +train-clean-100/103/1240/103-1240-0039.flac 230800 +train-clean-100/103/1240/103-1240-0040.flac 234720 +train-clean-100/103/1240/103-1240-0041.flac 216160 +train-clean-100/103/1240/103-1240-0042.flac 249680 +train-clean-100/103/1240/103-1240-0043.flac 236160 +train-clean-100/103/1240/103-1240-0044.flac 262240 +train-clean-100/103/1240/103-1240-0045.flac 250800 +train-clean-100/103/1240/103-1240-0046.flac 222800 +train-clean-100/103/1240/103-1240-0047.flac 206320 +train-clean-100/103/1240/103-1240-0048.flac 236320 +train-clean-100/103/1240/103-1240-0049.flac 244560 +train-clean-100/103/1240/103-1240-0050.flac 224400 +train-clean-100/103/1240/103-1240-0051.flac 245760 +train-clean-100/103/1240/103-1240-0052.flac 236640 +train-clean-100/103/1240/103-1240-0053.flac 218640 +train-clean-100/103/1240/103-1240-0054.flac 261360 +train-clean-100/103/1240/103-1240-0055.flac 179920 +train-clean-100/103/1240/103-1240-0056.flac 229040 +train-clean-100/103/1240/103-1240-0057.flac 109680 +train-clean-100/103/1241/103-1241-0000.flac 255440 +train-clean-100/103/1241/103-1241-0001.flac 248800 +train-clean-100/103/1241/103-1241-0002.flac 249040 +train-clean-100/103/1241/103-1241-0003.flac 222160 +train-clean-100/103/1241/103-1241-0004.flac 236080 +train-clean-100/103/1241/103-1241-0005.flac 224400 +train-clean-100/103/1241/103-1241-0006.flac 243760 +train-clean-100/103/1241/103-1241-0007.flac 242320 +train-clean-100/103/1241/103-1241-0008.flac 242160 +train-clean-100/103/1241/103-1241-0009.flac 222400 +train-clean-100/103/1241/103-1241-0010.flac 253920 +train-clean-100/103/1241/103-1241-0011.flac 231760 +train-clean-100/103/1241/103-1241-0012.flac 239680 +train-clean-100/103/1241/103-1241-0013.flac 236960 +train-clean-100/103/1241/103-1241-0014.flac 242080 +train-clean-100/103/1241/103-1241-0015.flac 224160 +train-clean-100/103/1241/103-1241-0016.flac 234640 +train-clean-100/103/1241/103-1241-0017.flac 254240 +train-clean-100/103/1241/103-1241-0018.flac 150960 +train-clean-100/103/1241/103-1241-0019.flac 48400 +train-clean-100/103/1241/103-1241-0020.flac 155360 +train-clean-100/103/1241/103-1241-0021.flac 242880 +train-clean-100/103/1241/103-1241-0022.flac 261600 +train-clean-100/103/1241/103-1241-0023.flac 266720 +train-clean-100/103/1241/103-1241-0024.flac 254240 +train-clean-100/103/1241/103-1241-0025.flac 77280 +train-clean-100/103/1241/103-1241-0026.flac 176080 +train-clean-100/103/1241/103-1241-0027.flac 238080 +train-clean-100/103/1241/103-1241-0028.flac 248880 +train-clean-100/103/1241/103-1241-0029.flac 244960 +train-clean-100/103/1241/103-1241-0030.flac 247520 +train-clean-100/103/1241/103-1241-0031.flac 209600 +train-clean-100/103/1241/103-1241-0032.flac 224080 +train-clean-100/103/1241/103-1241-0033.flac 251920 +train-clean-100/103/1241/103-1241-0034.flac 270560 +train-clean-100/103/1241/103-1241-0035.flac 248800 +train-clean-100/103/1241/103-1241-0036.flac 249040 +train-clean-100/103/1241/103-1241-0037.flac 204400 +train-clean-100/103/1241/103-1241-0038.flac 238960 +train-clean-100/103/1241/103-1241-0039.flac 258160 +train-clean-100/103/1241/103-1241-0040.flac 220560 +train-clean-100/103/1241/103-1241-0041.flac 252240 diff --git a/SpeechLM/modules.py b/SpeechLM/modules.py new file mode 100644 index 0000000..2841868 --- /dev/null +++ b/SpeechLM/modules.py @@ -0,0 +1,2130 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- +""" +We just merge all the required modules and functions into one python file. +It is for easily use the pre-trained model to extract features. +""" +import math +import numpy as np +import logging +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Parameter +from torch import Tensor +from typing import Any, Dict, List, Tuple, Callable, Optional + +logger = logging.getLogger(__name__) + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerEncoderBase": + return "TransformerEncoder" + else: + return module_name + +def utils_make_positions(tensor, padding_idx: int, onnx_trace: bool = False): + """Replace non-padding symbols with their position numbers. + + Position numbers begin at padding_idx+1. Padding symbols are ignored. + """ + # The series of casts and type-conversions here are carefully + # balanced to both work with ONNX export and XLA. In particular XLA + # prefers ints, cumsum defaults to output longs, and ONNX doesn't know + # how to handle the dtype kwarg in cumsum. + mask = tensor.ne(padding_idx).int() + return (torch.cumsum(mask, dim=1).type_as(mask) * mask).long() + padding_idx + +def utils_item(tensor): + # tpu-comment: making this a no-op for xla devices. + if torch.is_tensor(tensor) and tensor.device.type == "xla": + return tensor.detach() + if hasattr(tensor, "item"): + return tensor.item() + if hasattr(tensor, "__getitem__"): + return tensor[0] + return tensor + +def fsdp_wrap(module, min_num_params: Optional[int] = None, **kwargs): + """ + Helper to wrap layers/modules in FSDP. This falls back to a no-op if + fairscale is not available. + + Args: + module (nn.Module): module to (maybe) wrap + min_num_params (int, Optional): minimum number of layer params to wrap + """ + try: + from fairscale.nn import wrap + + if min_num_params is not None: + num_params = sum(p.numel() for p in module.parameters()) + if num_params >= min_num_params: + return wrap(module, **kwargs) + else: + return module + else: + return wrap(module, **kwargs) + except ImportError: + return module + +def quant_noise(module, p, block_size): + """ + Wraps modules and applies quantization noise to the weights for + subsequent quantization with Iterative Product Quantization as + described in "Training with Quantization Noise for Extreme Model Compression" + + Args: + - module: nn.Module + - p: amount of Quantization Noise + - block_size: size of the blocks for subsequent quantization with iPQ + + Remarks: + - Module weights must have the right sizes wrt the block size + - Only Linear, Embedding and Conv2d modules are supported for the moment + - For more detail on how to quantize by blocks with convolutional weights, + see "And the Bit Goes Down: Revisiting the Quantization of Neural Networks" + - We implement the simplest form of noise here as stated in the paper + which consists in randomly dropping blocks + """ + + # if no quantization noise, don't register hook + if p <= 0: + return module + + # supported modules + assert isinstance(module, (nn.Linear, nn.Embedding, nn.Conv2d)) + + # test whether module.weight has the right sizes wrt block_size + is_conv = module.weight.ndim == 4 + + # 2D matrix + if not is_conv: + assert ( + module.weight.size(1) % block_size == 0 + ), "Input features must be a multiple of block sizes" + + # 4D matrix + else: + # 1x1 convolutions + if module.kernel_size == (1, 1): + assert ( + module.in_channels % block_size == 0 + ), "Input channels must be a multiple of block sizes" + # regular convolutions + else: + k = module.kernel_size[0] * module.kernel_size[1] + assert k % block_size == 0, "Kernel size must be a multiple of block size" + + def _forward_pre_hook(mod, input): + # no noise for evaluation + if mod.training: + if not is_conv: + # gather weight and sizes + weight = mod.weight + in_features = weight.size(1) + out_features = weight.size(0) + + # split weight matrix into blocks and randomly drop selected blocks + mask = torch.zeros( + in_features // block_size * out_features, device=weight.device + ) + mask.bernoulli_(p) + mask = mask.repeat_interleave(block_size, -1).view(-1, in_features) + + else: + # gather weight and sizes + weight = mod.weight + in_channels = mod.in_channels + out_channels = mod.out_channels + + # split weight matrix into blocks and randomly drop selected blocks + if mod.kernel_size == (1, 1): + mask = torch.zeros( + int(in_channels // block_size * out_channels), + device=weight.device, + ) + mask.bernoulli_(p) + mask = mask.repeat_interleave(block_size, -1).view(-1, in_channels) + else: + mask = torch.zeros( + weight.size(0), weight.size(1), device=weight.device + ) + mask.bernoulli_(p) + mask = ( + mask.unsqueeze(2) + .unsqueeze(3) + .repeat(1, 1, mod.kernel_size[0], mod.kernel_size[1]) + ) + + # scale weights and apply mask + mask = mask.to( + torch.bool + ) # x.bool() is not currently supported in TorchScript + s = 1 / (1 - p) + mod.weight.data = s * weight.masked_fill(mask, 0) + + module.register_forward_pre_hook(_forward_pre_hook) + return module + +def relu_squared(x: torch.Tensor): + return F.relu(x).pow(2) + +def gelu(x: torch.Tensor) -> torch.Tensor: + return torch.nn.functional.gelu(x.float()).type_as(x) + +def gelu_accurate(x): + if not hasattr(gelu_accurate, "_a"): + gelu_accurate._a = math.sqrt(2 / math.pi) + return ( + 0.5 * x * (1 + torch.tanh(gelu_accurate._a * (x + 0.044715 * torch.pow(x, 3)))) + ) + +def get_activation_fn(activation: str) -> Callable: + """Returns the activation function corresponding to `activation`""" + if activation == "relu": + return F.relu + elif activation == "relu_squared": + return relu_squared + elif activation == "gelu": + return gelu + elif activation == "gelu_fast": + logger.warn( + "--activation-fn=gelu_fast has been renamed to gelu_accurate" + ) + return gelu_accurate + elif activation == "gelu_accurate": + return gelu_accurate + elif activation == "tanh": + return torch.tanh + elif activation == "linear": + return lambda x: x + elif activation == "swish": + return torch.nn.SiLU + else: + raise RuntimeError("--activation-fn {} not supported".format(activation)) + +def softmax(x, dim: int, onnx_trace: bool = False): + if onnx_trace: + return F.softmax(x.float(), dim=dim) + else: + return F.softmax(x, dim=dim, dtype=torch.float32) + +def compute_mask_indices( + shape: Tuple[int, int], + padding_mask: Optional[torch.Tensor], + mask_prob: float, + mask_length: int, + mask_type: str = "static", + mask_other: float = 0.0, + min_masks: int = 0, + no_overlap: bool = False, + min_space: int = 0, + require_same_masks: bool = True, + mask_dropout: float = 0.0, +) -> np.ndarray: + """ + Computes random mask spans for a given shape + + Args: + shape: the the shape for which to compute masks. + should be of size 2 where first element is batch size and 2nd is timesteps + padding_mask: optional padding mask of the same size as shape, which will prevent masking padded elements + mask_prob: probability for each token to be chosen as start of the span to be masked. this will be multiplied by + number of timesteps divided by length of mask span to mask approximately this percentage of all elements. + however due to overlaps, the actual number will be smaller (unless no_overlap is True) + mask_type: how to compute mask lengths + static = fixed size + uniform = sample from uniform distribution [mask_other, mask_length*2] + normal = sample from normal distribution with mean mask_length and stdev mask_other. mask is min 1 element + poisson = sample from possion distribution with lambda = mask length + min_masks: minimum number of masked spans + no_overlap: if false, will switch to an alternative recursive algorithm that prevents spans from overlapping + min_space: only used if no_overlap is True, this is how many elements to keep unmasked between spans + require_same_masks: if true, will randomly drop out masks until same amount of masks remains in each sample + mask_dropout: randomly dropout this percentage of masks in each example + """ + + bsz, all_sz = shape + mask = np.full((bsz, all_sz), False) + + all_num_mask = int( + # add a random number for probabilistic rounding + mask_prob * all_sz / float(mask_length) + + np.random.rand() + ) + + all_num_mask = max(min_masks, all_num_mask) + + mask_idcs = [] + for i in range(bsz): + if padding_mask is not None: + sz = all_sz - padding_mask[i].long().sum().item() + num_mask = int( + # add a random number for probabilistic rounding + mask_prob * sz / float(mask_length) + + np.random.rand() + ) + num_mask = max(min_masks, num_mask) + else: + sz = all_sz + num_mask = all_num_mask + + if mask_type == "static": + lengths = np.full(num_mask, mask_length) + elif mask_type == "uniform": + lengths = np.random.randint(mask_other, mask_length * 2 + 1, size=num_mask) + elif mask_type == "normal": + lengths = np.random.normal(mask_length, mask_other, size=num_mask) + lengths = [max(1, int(round(x))) for x in lengths] + elif mask_type == "poisson": + lengths = np.random.poisson(mask_length, size=num_mask) + lengths = [int(round(x)) for x in lengths] + else: + raise Exception("unknown mask selection " + mask_type) + + if sum(lengths) == 0: + lengths[0] = min(mask_length, sz - 1) + + if no_overlap: + mask_idc = [] + + def arrange(s, e, length, keep_length): + span_start = np.random.randint(s, e - length) + mask_idc.extend(span_start + i for i in range(length)) + + new_parts = [] + if span_start - s - min_space >= keep_length: + new_parts.append((s, span_start - min_space + 1)) + if e - span_start - keep_length - min_space > keep_length: + new_parts.append((span_start + length + min_space, e)) + return new_parts + + parts = [(0, sz)] + min_length = min(lengths) + for length in sorted(lengths, reverse=True): + lens = np.fromiter( + (e - s if e - s >= length + min_space else 0 for s, e in parts), + np.int, + ) + l_sum = np.sum(lens) + if l_sum == 0: + break + probs = lens / np.sum(lens) + c = np.random.choice(len(parts), p=probs) + s, e = parts.pop(c) + parts.extend(arrange(s, e, length, min_length)) + mask_idc = np.asarray(mask_idc) + else: + min_len = min(lengths) + if sz - min_len <= num_mask: + min_len = sz - num_mask - 1 + + mask_idc = np.random.choice(sz - min_len, num_mask, replace=False) + + mask_idc = np.asarray( + [ + mask_idc[j] + offset + for j in range(len(mask_idc)) + for offset in range(lengths[j]) + ] + ) + + mask_idcs.append(np.unique(mask_idc[mask_idc < sz])) + + min_len = min([len(m) for m in mask_idcs]) + for i, mask_idc in enumerate(mask_idcs): + if len(mask_idc) > min_len and require_same_masks: + mask_idc = np.random.choice(mask_idc, min_len, replace=False) + if mask_dropout > 0: + num_holes = np.rint(len(mask_idc) * mask_dropout).astype(int) + mask_idc = np.random.choice( + mask_idc, len(mask_idc) - num_holes, replace=False + ) + + mask[i, mask_idc] = True + + return mask + +def init_bert_params(module): + """ + Initialize the weights specific to the BERT Model. + This overrides the default initializations depending on the specified arguments. + 1. If normal_init_linear_weights is set then weights of linear + layer will be initialized using the normal distribution and + bais will be set to the specified value. + 2. If normal_init_embed_weights is set then weights of embedding + layer will be initialized using the normal distribution. + 3. If normal_init_proj_weights is set then weights of + in_project_weight for MultiHeadAttention initialized using + the normal distribution (to be validated). + """ + + def normal_(data): + # with FSDP, module params will be on CUDA, so we cast them back to CPU + # so that the RNG is consistent with and without FSDP + data.copy_(data.cpu().normal_(mean=0.0, std=0.02).to(data.device)) + + if isinstance(module, nn.Linear): + normal_(module.weight.data) + if module.bias is not None: + module.bias.data.zero_() + if isinstance(module, nn.Embedding): + normal_(module.weight.data) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + if isinstance(module, MultiheadAttention): + normal_(module.q_proj.weight.data) + normal_(module.k_proj.weight.data) + normal_(module.v_proj.weight.data) + +def pad_to_multiple(x, multiple, dim=-1, value=0): + # Inspired from https://github.com/lucidrains/local-attention/blob/master/local_attention/local_attention.py#L41 + if x is None: + return None, 0 + tsz = x.size(dim) + m = tsz / multiple + remainder = math.ceil(m) * multiple - tsz + if m.is_integer(): + return x, 0 + pad_offset = (0,) * (-1 - dim) * 2 + + return F.pad(x, (*pad_offset, 0, remainder), value=value), remainder + +def is_xla_tensor(tensor): + return torch.is_tensor(tensor) and tensor.device.type == "xla" + +def index_put(tensor, indices, value): + if is_xla_tensor(tensor): + for _ in range(indices.dim(), tensor.dim()): + indices = indices.unsqueeze(-1) + if indices.size(-1) < tensor.size(-1): + indices = indices.expand_as(tensor) + tensor = torch.mul(tensor, ~indices) + torch.mul(value, indices) + else: + tensor[indices] = value + return tensor + +def PositionalEmbedding( + num_embeddings: int, + embedding_dim: int, + padding_idx: int, + learned: bool = False, +): + if learned: + # if padding_idx is specified then offset the embedding ids by + # this index and adjust num_embeddings appropriately + # TODO: The right place for this offset would be inside + # LearnedPositionalEmbedding. Move this there for a cleaner implementation. + if padding_idx is not None: + num_embeddings = num_embeddings + padding_idx + 1 + m = LearnedPositionalEmbedding(num_embeddings, embedding_dim, padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim**-0.5) + if padding_idx is not None: + nn.init.constant_(m.weight[padding_idx], 0) + else: + m = SinusoidalPositionalEmbedding( + embedding_dim, + padding_idx, + init_size=num_embeddings + padding_idx + 1, + ) + return m + +def LayerNorm(normalized_shape, eps=1e-5, elementwise_affine=True, export=False): + if torch.jit.is_scripting() or torch.jit.is_tracing(): + export = True + if not export and torch.cuda.is_available() and has_fused_layernorm: + return FusedLayerNorm(normalized_shape, eps, elementwise_affine) + return torch.nn.LayerNorm(normalized_shape, eps, elementwise_affine) + + +class TransformerEncoderBase(nn.Module): + """ + Transformer encoder consisting of *cfg.encoder.layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary: deprecated(None) + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, cfg, dictionary, embed_tokens, use_rel_pos_enc=False, scaling_for_att=1.0): + self.cfg = cfg + super().__init__() + self.register_buffer("version", torch.Tensor([3])) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.encoder_layerdrop = cfg.encoder.layerdrop + + embed_dim = embed_tokens.embedding_dim if embed_tokens is not None else cfg.encoder.embed_dim + self.padding_idx = embed_tokens.padding_idx if embed_tokens is not None else 1 + self.max_source_positions = cfg.max_source_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + self.embed_positions = ( + PositionalEmbedding( + cfg.max_source_positions, + embed_dim, + self.padding_idx, + learned=cfg.encoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + if self.encoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.encoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.scaling_for_att = scaling_for_att + self.layers.extend( + [self.build_encoder_layer(cfg) for i in range(cfg.encoder.layers)] + ) + self.num_layers = len(self.layers) + + if cfg.encoder.normalize_before: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.encoder.attention_heads, 160) + + def build_encoder_layer(self, cfg): + layer = TransformerEncoderLayerBase(cfg, has_relative_attention_bias=self.use_rel_pos_enc, scaling_for_att=self.scaling_for_att) + checkpoint = cfg.checkpoint_activations + if checkpoint: + raise ValueError("We don't support checkpoint_activations for now! Please set cfg.checkpoint_activations=False.") + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward_embedding( + self, src_tokens, token_embedding: Optional[torch.Tensor] = None + ): + # embed tokens and positions + if token_embedding is None: + token_embedding = self.embed_tokens(src_tokens) + x = embed = self.embed_scale * token_embedding + if self.embed_positions is not None: + x = embed + self.embed_positions(src_tokens) + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + x = self.dropout_module(x) + if self.quant_noise is not None: + x = self.quant_noise(x) + return x, embed + + def forward( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + return self.forward_scriptable( + src_tokens, src_lengths, return_all_hiddens, token_embeddings, uniformity_layers + ) + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def forward_scriptable( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + # compute padding mask + encoder_padding_mask = src_tokens.eq(self.padding_idx) + has_pads = src_tokens.device.type == "xla" or encoder_padding_mask.any() + + x, encoder_embedding = self.forward_embedding(src_tokens, token_embeddings) + + # account for padding while computing the representation + if has_pads: + x = x * (1 - encoder_padding_mask.unsqueeze(-1).type_as(x)) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + encoder_states = [] + uniformity_hiddens = [] + + if return_all_hiddens: + encoder_states.append(x) + + if uniformity_layers is not None and 0 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + + # encoder layers + for i, layer in enumerate(self.layers): + x = layer( + x, encoder_padding_mask=encoder_padding_mask if has_pads else None, + pos_bias=pos_k, + ) + if uniformity_layers is not None and i+1 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + if return_all_hiddens: + assert encoder_states is not None + encoder_states.append(x) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `forward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + src_lengths = ( + src_tokens.ne(self.padding_idx) + .sum(dim=1, dtype=torch.int32) + .reshape(-1, 1) + .contiguous() + ) + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [encoder_padding_mask], # B x T + "encoder_embedding": [encoder_embedding], # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "uniformity_hiddens": uniformity_hiddens, # List[T x B x C] + "src_tokens": [], + "src_lengths": [src_lengths], + } + + def forward_torchscript(self, net_input: Dict[str, Tensor]): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + if torch.jit.is_scripting(): + return self.forward( + src_tokens=net_input["src_tokens"], + src_lengths=net_input["src_lengths"], + ) + else: + return self.forward_non_torchscript(net_input) + + @torch.jit.unused + def forward_non_torchscript(self, net_input: Dict[str, Tensor]): + encoder_input = { + k: v for k, v in net_input.items() if k != "prev_output_tokens" + } + return self.forward(**encoder_input) + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if len(encoder_out["encoder_out"]) == 0: + new_encoder_out = [] + else: + new_encoder_out = [encoder_out["encoder_out"][0].index_select(1, new_order)] + if len(encoder_out["encoder_padding_mask"]) == 0: + new_encoder_padding_mask = [] + else: + new_encoder_padding_mask = [ + encoder_out["encoder_padding_mask"][0].index_select(0, new_order) + ] + if len(encoder_out["encoder_embedding"]) == 0: + new_encoder_embedding = [] + else: + new_encoder_embedding = [ + encoder_out["encoder_embedding"][0].index_select(0, new_order) + ] + + if len(encoder_out["src_tokens"]) == 0: + src_tokens = [] + else: + src_tokens = [(encoder_out["src_tokens"][0]).index_select(0, new_order)] + + if len(encoder_out["src_lengths"]) == 0: + src_lengths = [] + else: + src_lengths = [(encoder_out["src_lengths"][0]).index_select(0, new_order)] + + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, # T x B x C + "encoder_padding_mask": new_encoder_padding_mask, # B x T + "encoder_embedding": new_encoder_embedding, # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": src_tokens, # B x T + "src_lengths": src_lengths, # B x 1 + } + + def max_positions(self): + """Maximum input length supported by the encoder.""" + if self.embed_positions is None: + return self.max_source_positions + return min(self.max_source_positions, self.embed_positions.max_positions) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + print("deleting {0}".format(weights_key)) + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + for i in range(self.num_layers): + # update layer norms + self.layers[i].upgrade_state_dict_named( + state_dict, "{}.layers.{}".format(name, i) + ) + + version_key = "{}.version".format(name) + if utils_item(state_dict.get(version_key, torch.Tensor([1]))[0]) < 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + return state_dict + + def set_num_updates(self, num_updates): + """State from trainer to pass along to model at every update.""" + + def _apply(m): + if hasattr(m, "set_num_updates") and m != self: + m.set_num_updates(num_updates) + + self.apply(_apply) + + +class TransformerEncoderLayerBase(nn.Module): + """Encoder layer block. + + In the original paper each operation (multi-head attention or FFN) is + postprocessed with: `dropout -> add residual -> layernorm`. In the + tensor2tensor code they suggest that learning is more robust when + preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.encoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + + def __init__(self, cfg, has_relative_attention_bias=False, scaling_for_att=1.0): + super().__init__() + self.cfg = cfg + self.embed_dim = cfg.encoder.embed_dim + self.quant_noise = cfg.quant_noise.pq + self.quant_noise_block_size = cfg.quant_noise.pq_block_size + self.self_attn = self.build_self_attention(self.embed_dim, cfg, has_relative_attention_bias=has_relative_attention_bias, scaling_for_att=scaling_for_att) + self.self_attn_layer_norm = LayerNorm(self.embed_dim, export=cfg.export) + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=self.__class__.__name__ + ) + self.activation_fn = get_activation_fn(activation=cfg.activation_fn) + activation_dropout_p = cfg.activation_dropout + if activation_dropout_p == 0: + # for backwards compatibility with models that use cfg.relu_dropout + activation_dropout_p = cfg.relu_dropout or 0 + self.activation_dropout_module = FairseqDropout( + float(activation_dropout_p), module_name=self.__class__.__name__ + ) + self.normalize_before = cfg.encoder.normalize_before + self.fc1 = self.build_fc1( + self.embed_dim, + cfg.encoder.ffn_embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + self.fc2 = self.build_fc2( + cfg.encoder.ffn_embed_dim, + self.embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + + self.final_layer_norm = LayerNorm(self.embed_dim, export=cfg.export) + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.encoder.attention_heads) + + def build_fc1(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise( + nn.Linear(input_dim, output_dim), p=q_noise, block_size=qn_block_size + ) + + def build_fc2(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise( + nn.Linear(input_dim, output_dim), p=q_noise, block_size=qn_block_size + ) + + def build_self_attention(self, embed_dim, cfg, has_relative_attention_bias=False, scaling_for_att=1.0): + return MultiheadAttention( + embed_dim, + cfg.encoder.attention_heads, + dropout=cfg.attention_dropout, + self_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + has_relative_attention_bias=has_relative_attention_bias, + scaling_for_att=scaling_for_att, + ) + + def residual_connection(self, x, residual): + return residual + x + + def upgrade_state_dict_named(self, state_dict, name): + """ + Rename layer norm states from `...layer_norms.0.weight` to + `...self_attn_layer_norm.weight` and `...layer_norms.1.weight` to + `...final_layer_norm.weight` + """ + layer_norm_map = {"0": "self_attn_layer_norm", "1": "final_layer_norm"} + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layer_norms.{}.{}".format(name, old, m) + if k in state_dict: + state_dict["{}.{}.{}".format(name, new, m)] = state_dict[k] + del state_dict[k] + + def forward( + self, + x, + encoder_padding_mask: Optional[Tensor], + attn_mask: Optional[Tensor] = None, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor): binary ByteTensor of shape + `(batch, seq_len)` where padding elements are indicated by ``1``. + attn_mask (ByteTensor): binary tensor of shape `(tgt_len, src_len)`, + where `tgt_len` is the length of output and `src_len` is the + length of input, though here both are equal to `seq_len`. + `attn_mask[tgt_i, src_j] = 1` means that when calculating the + embedding for `tgt_i`, we exclude (mask out) `src_j`. This is + useful for strided self-attention. + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + # anything in original attn_mask = 1, becomes -1e8 + # anything in original attn_mask = 0, becomes 0 + # Note that we cannot use -inf here, because at some edge cases, + # the attention weight (before softmax) for some padded element in query + # will become -inf, which results in NaN in model parameters + if attn_mask is not None: + attn_mask = attn_mask.masked_fill( + attn_mask.to(torch.bool), -1e8 if x.dtype == torch.float32 else -1e4 + ) + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, _ = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=encoder_padding_mask, + need_weights=False, + attn_mask=attn_mask, + position_bias=pos_bias, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + return x + + +class TransformerEncoder(nn.Module): + """ + wav2vec-style transformer encoder. + """ + def __init__(self, args): + super().__init__() + + self.dropout = args.dropout + self.embedding_dim = args.encoder_embed_dim + self.required_seq_len_multiple = args.required_seq_len_multiple + + self.pos_conv = nn.Conv1d( + self.embedding_dim, + self.embedding_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * self.embedding_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + layers = [] + self.use_rel_pos_enc = getattr(args, "use_rel_pos_enc", False) + for _ in range(args.encoder_layers): + layer = TransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=self.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + has_relative_attention_bias=self.use_rel_pos_enc, + scaling_for_att=getattr(args, "scaling_for_att", 1.0) + ) + if args.checkpoint_activations: + raise ValueError("We don't support checkpoint_activations for now! Please set checkpoint_activations=False.") + layers.append(layer) + self.layers = nn.ModuleList(layers) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(self.embedding_dim) + self.layerdrop = args.encoder_layerdrop + + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim // args.encoder_attention_heads, 160) + + self.apply(init_bert_params) + + def forward(self, x, padding_mask=None, layer=None, conv_pos=True): + x, layer_results = self.extract_features(x, padding_mask, layer, conv_pos) + + if self.layer_norm_first and (layer is None or layer >= len(self.layers) - 1): + x = self.layer_norm(x) + + return x, layer_results + + def extract_features(self, x, padding_mask=None, tgt_layer=None, conv_pos=True): + + if padding_mask is not None: + x = index_put(x, padding_mask, 0) + + if conv_pos: + x_conv = self.pos_conv(x.transpose(1, 2)) + x_conv = x_conv.transpose(1, 2) + x = x + x_conv + + if not self.layer_norm_first: + x = self.layer_norm(x) + + # pad to the sequence length dimension + x, pad_length = pad_to_multiple( + x, self.required_seq_len_multiple, dim=-2, value=0 + ) + if pad_length > 0 and padding_mask is None: + padding_mask = x.new_zeros((x.size(0), x.size(1)), dtype=torch.bool) + padding_mask[:, -pad_length:] = True + else: + padding_mask, _ = pad_to_multiple( + padding_mask, self.required_seq_len_multiple, dim=-1, value=True + ) + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + layer_results = [] + r = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, z = layer(x, self_attn_padding_mask=padding_mask, need_weights=False, pos_bias=pos_k) + if tgt_layer is not None: + # unpad if needed + if pad_length > 0: + layer_results.append( + x[:-pad_length] + # ( + # x[:-pad_length], + # z[:, :-pad_length, :-pad_length] + # if z is not None + # else z, + # ) + ) + else: + # layer_results.append((x, z)) + layer_results.append(x) + if i == tgt_layer: + r = x + break + + if r is not None: + x = r + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + # undo paddding + if pad_length > 0: + x = x[:, :-pad_length] + + return x, layer_results + + def max_positions(self): + """Maximum output length supported by the encoder.""" + return self.args.max_positions + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + return state_dict + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + wav2vec-style transformer layer + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + has_relative_attention_bias: bool = False, + scaling_for_att: float = 1.0, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + has_relative_attention_bias=has_relative_attention_bias, + scaling_for_att=scaling_for_att + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embedding_dim//num_attention_heads) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + pos_bias=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + position_bias=pos_bias, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn + + +class FairseqDropout(nn.Module): + def __init__(self, p, module_name=None): + super().__init__() + self.p = p + self.module_name = module_name + self.apply_during_inference = False + + def forward(self, x, inplace: bool = False): + if self.p > 0 and (self.training or self.apply_during_inference): + return F.dropout(x, p=self.p, training=True, inplace=inplace) + else: + return x + + def make_generation_fast_( + self, + name: str, + retain_dropout: bool = False, + retain_dropout_modules: Optional[List[str]] = None, + **kwargs + ): + if retain_dropout: + if retain_dropout_modules is not None and self.module_name is None: + logger.warning( + "Cannot enable dropout during inference for module {} " + "because module_name was not set".format(name) + ) + elif ( + retain_dropout_modules is None # if None, apply to all modules + or self.module_name in retain_dropout_modules + ): + logger.info( + "Enabling dropout during inference for module: {}".format(name) + ) + self.apply_during_inference = True + else: + logger.info("Disabling dropout for module: {}".format(name)) + + +class LearnedPositionalEmbedding(nn.Embedding): + """ + This module learns positional embeddings up to a fixed maximum size. + Padding ids are ignored by either offsetting based on padding_idx + or by setting padding_idx to None and ensuring that the appropriate + position ids are passed to the forward function. + """ + + def __init__(self, num_embeddings: int, embedding_dim: int, padding_idx: int): + super().__init__(num_embeddings, embedding_dim, padding_idx) + self.onnx_trace = False + if self.padding_idx is not None: + self.max_positions = self.num_embeddings - self.padding_idx - 1 + else: + self.max_positions = self.num_embeddings + + def forward( + self, + input: Tensor, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + positions: Optional[Tensor] = None, + ): + """Input is expected to be of size [bsz x seqlen].""" + assert (positions is None) or ( + self.padding_idx is None + ), "If positions is pre-computed then padding_idx should not be set." + + if positions is None: + if incremental_state is not None: + # positions is the same for every token when decoding a single step + # Without the int() cast, it doesn't work in some cases when exporting to ONNX + positions = torch.zeros( + (1, 1), device=input.device, dtype=input.dtype + ).fill_(int(self.padding_idx + input.size(1))) + else: + positions = utils_make_positions( + input, self.padding_idx, onnx_trace=self.onnx_trace + ) + positions = torch.clamp(positions, max=self.padding_idx + self.max_positions) + return F.embedding( + positions, + self.weight, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) + + +class SinusoidalPositionalEmbedding(nn.Module): + """This module produces sinusoidal positional embeddings of any length. + + Padding symbols are ignored. + """ + + def __init__(self, embedding_dim, padding_idx, init_size=1024): + super().__init__() + self.embedding_dim = embedding_dim + self.padding_idx = padding_idx if padding_idx is not None else 0 + self.weights = SinusoidalPositionalEmbedding.get_embedding( + init_size, embedding_dim, padding_idx + ) + self.onnx_trace = False + self.register_buffer("_float_tensor", torch.FloatTensor(1)) + self.max_positions = int(1e5) + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + @staticmethod + def get_embedding( + num_embeddings: int, embedding_dim: int, padding_idx: Optional[int] = None + ): + """Build sinusoidal embeddings. + + This matches the implementation in tensor2tensor, but differs slightly + from the description in Section 3.5 of "Attention Is All You Need". + """ + half_dim = embedding_dim // 2 + emb = math.log(10000) / (half_dim - 1) + emb = torch.exp(torch.arange(half_dim, dtype=torch.float) * -emb) + emb = torch.arange(num_embeddings, dtype=torch.float).unsqueeze( + 1 + ) * emb.unsqueeze(0) + emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=1).view( + num_embeddings, -1 + ) + if embedding_dim % 2 == 1: + # zero pad + emb = torch.cat([emb, torch.zeros(num_embeddings, 1)], dim=1) + if padding_idx is not None: + emb[padding_idx, :] = 0 + return emb + + def forward( + self, + input, + incremental_state: Optional[Any] = None, + timestep: Optional[Tensor] = None, + positions: Optional[Any] = None, + ): + """Input is expected to be of size [bsz x seqlen].""" + bspair = torch.onnx.operators.shape_as_tensor(input) + bsz, seq_len = bspair[0], bspair[1] + max_pos = self.padding_idx + 1 + seq_len + if self.weights is None or max_pos > self.weights.size(0): + # recompute/expand embeddings if needed + self.weights = SinusoidalPositionalEmbedding.get_embedding( + max_pos, self.embedding_dim, self.padding_idx + ) + self.weights = self.weights.to(self._float_tensor) + + if incremental_state is not None: + # positions is the same for every token when decoding a single step + pos = timestep.view(-1)[0] + 1 if timestep is not None else seq_len + if self.onnx_trace: + return ( + self.weights.index_select(index=self.padding_idx + pos, dim=0) + .unsqueeze(1) + .repeat(bsz, 1, 1) + ) + return self.weights[self.padding_idx + pos, :].expand(bsz, 1, -1) + + positions = utils_make_positions( + input, self.padding_idx, onnx_trace=self.onnx_trace + ) + if self.onnx_trace: + flat_embeddings = self.weights.detach().index_select(0, positions.view(-1)) + embedding_shape = torch.cat( + (bsz.view(1), seq_len.view(1), torch.tensor([-1], dtype=torch.long)) + ) + embeddings = torch.onnx.operators.reshape_from_tensor_shape( + flat_embeddings, embedding_shape + ) + return embeddings + return ( + self.weights.index_select(0, positions.view(-1)) + .view(bsz, seq_len, -1) + .detach() + ) + + +try: + from apex.normalization import FusedLayerNorm as _FusedLayerNorm + + has_fused_layernorm = True + + class FusedLayerNorm(_FusedLayerNorm): + @torch.jit.unused + def forward(self, x): + if not x.is_cuda: + return super().forward(x) + else: + with torch.cuda.device(x.device): + return super().forward(x) + +except ImportError: + has_fused_layernorm = False + + +class Fp32LayerNorm(nn.LayerNorm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def forward(self, input): + output = F.layer_norm( + input.float(), + self.normalized_shape, + self.weight.float() if self.weight is not None else None, + self.bias.float() if self.bias is not None else None, + self.eps, + ) + return output.type_as(input) + + +class LayerDropModuleList(nn.ModuleList): + """ + A LayerDrop implementation based on :class:`torch.nn.ModuleList`. + + We refresh the choice of which layers to drop every time we iterate + over the LayerDropModuleList instance. During evaluation we always + iterate over all layers. + + Usage:: + + layers = LayerDropList(p=0.5, modules=[layer1, layer2, layer3]) + for layer in layers: # this might iterate over layers 1 and 3 + x = layer(x) + for layer in layers: # this might iterate over all layers + x = layer(x) + for layer in layers: # this might not iterate over any layers + x = layer(x) + + Args: + p (float): probability of dropping out each layer + modules (iterable, optional): an iterable of modules to add + """ + + def __init__(self, p, modules=None): + super().__init__(modules) + self.p = p + + def __iter__(self): + dropout_probs = torch.empty(len(self)).uniform_() + for i, m in enumerate(super().__iter__()): + if not self.training or (dropout_probs[i] > self.p): + yield m + + +class RelativePositionalEncoding(torch.nn.Module): + def __init__(self, d_model, maxlen=1000, embed_v=False): + super(RelativePositionalEncoding, self).__init__() + + self.d_model = d_model + self.maxlen = maxlen + self.pe_k = torch.nn.Embedding(2*maxlen, d_model) + if embed_v: + self.pe_v = torch.nn.Embedding(2*maxlen, d_model) + self.embed_v = embed_v + + + def forward(self, pos_seq, incremental_state=None): + pos_seq[pos_seq < -self.maxlen] = -self.maxlen + pos_seq[pos_seq >= self.maxlen] = self.maxlen - 1 + pos_seq = pos_seq + self.maxlen + + if incremental_state is not None: + pos_seq = pos_seq[-1:] + + if self.embed_v: + return self.pe_k(pos_seq), self.pe_v(pos_seq) + else: + return self.pe_k(pos_seq), None + + +class MultiheadAttention(nn.Module): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + has_relative_attention_bias=False, + scaling_for_att=1.0 + ): + super().__init__() + self.embed_dim = embed_dim + self.kdim = kdim if kdim is not None else embed_dim + self.vdim = vdim if vdim is not None else embed_dim + self.qkv_same_dim = self.kdim == embed_dim and self.vdim == embed_dim + + self.num_heads = num_heads + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + + self.has_relative_attention_bias = has_relative_attention_bias + + self.head_dim = embed_dim // num_heads + assert ( + self.head_dim * num_heads == self.embed_dim + ), "embed_dim must be divisible by num_heads" + self.scaling = self.head_dim ** -0.5 + self.scaling_for_att = scaling_for_att + + self.self_attention = self_attention + self.encoder_decoder_attention = encoder_decoder_attention + + assert not self.self_attention or self.qkv_same_dim, ( + "Self-attention requires query, key and " "value to be of the same size" + ) + + self.k_proj = quant_noise( + nn.Linear(self.kdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.v_proj = quant_noise( + nn.Linear(self.vdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.q_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + self.out_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + if add_bias_kv: + self.bias_k = Parameter(torch.Tensor(1, 1, embed_dim)) + self.bias_v = Parameter(torch.Tensor(1, 1, embed_dim)) + else: + self.bias_k = self.bias_v = None + + self.add_zero_attn = add_zero_attn + + self.reset_parameters() + + self.onnx_trace = False + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def reset_parameters(self): + if self.qkv_same_dim: + # Empirically observed the convergence to be much better with + # the scaled initialization + nn.init.xavier_uniform_(self.k_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.v_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.q_proj.weight, gain=1 / math.sqrt(2)) + else: + nn.init.xavier_uniform_(self.k_proj.weight) + nn.init.xavier_uniform_(self.v_proj.weight) + nn.init.xavier_uniform_(self.q_proj.weight) + + nn.init.xavier_uniform_(self.out_proj.weight) + if self.out_proj.bias is not None: + nn.init.constant_(self.out_proj.bias, 0.0) + if self.bias_k is not None: + nn.init.xavier_normal_(self.bias_k) + if self.bias_v is not None: + nn.init.xavier_normal_(self.bias_v) + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + position_bias: Optional[Tensor] = None + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim, f"query dim {embed_dim} != {self.embed_dim}" + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + and not self.has_relative_attention_bias + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + q *= (1 / self.scaling_for_att) + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + if position_bias is not None: ## first order + ## position_bias: [241, 241, 64] + #print ("attn_weights: ", attn_weights.size()) # [492, 241, 241] + reshape_q = q.contiguous().view(bsz * self.num_heads, -1, self.head_dim).transpose(0,1) #[241, 492, 64] + #print ("reshape_q: ", reshape_q.size()) + B = torch.matmul(reshape_q, position_bias.transpose(-2, -1)) + #print ("B: ", B.size()) ## [241, 492, 241] + #B = B.transpose(0, 1).view(bsz, self.num_heads, position_bias.size(0), position_bias.size(1)) + B = B.transpose(0, 1).view(bsz*self.num_heads, position_bias.size(0), position_bias.size(1)) + #print ("B 2: ", B.size()) + attn_weights += B + + attn_weights *= self.scaling_for_att + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if self.scaling_for_att > 1.0: + attn_weights = attn_weights - attn_weights.detach().max(dim=-1, keepdim=True)[0] + + if before_softmax: + return attn_weights, v + + attn_weights_float = softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights + + @staticmethod + def _append_prev_key_padding_mask( + key_padding_mask: Optional[Tensor], + prev_key_padding_mask: Optional[Tensor], + batch_size: int, + src_len: int, + static_kv: bool, + ) -> Optional[Tensor]: + # saved key padding masks have shape (bsz, seq_len) + if prev_key_padding_mask is not None and static_kv: + new_key_padding_mask = prev_key_padding_mask + elif prev_key_padding_mask is not None and key_padding_mask is not None: + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), key_padding_mask.float()], dim=1 + ) + # During incremental decoding, as the padding token enters and + # leaves the frame, there will be a time when prev or current + # is None + elif prev_key_padding_mask is not None: + if src_len > prev_key_padding_mask.size(1): + filler = torch.zeros( + (batch_size, src_len - prev_key_padding_mask.size(1)), + device=prev_key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), filler.float()], dim=1 + ) + else: + new_key_padding_mask = prev_key_padding_mask.float() + elif key_padding_mask is not None: + if src_len > key_padding_mask.size(1): + filler = torch.zeros( + (batch_size, src_len - key_padding_mask.size(1)), + device=key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [filler.float(), key_padding_mask.float()], dim=1 + ) + else: + new_key_padding_mask = key_padding_mask.float() + else: + new_key_padding_mask = prev_key_padding_mask + return new_key_padding_mask + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + """Reorder buffered internal state (for incremental generation).""" + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + for k in input_buffer.keys(): + input_buffer_k = input_buffer[k] + if input_buffer_k is not None: + if self.encoder_decoder_attention and input_buffer_k.size( + 0 + ) == new_order.size(0): + break + input_buffer[k] = input_buffer_k.index_select(0, new_order) + incremental_state = self._set_input_buffer(incremental_state, input_buffer) + return incremental_state + + def _get_input_buffer( + self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ) -> Dict[str, Optional[Tensor]]: + result = self.get_incremental_state(incremental_state, "attn_state") + if result is not None: + return result + else: + empty_result: Dict[str, Optional[Tensor]] = {} + return empty_result + + def _set_input_buffer( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + buffer: Dict[str, Optional[Tensor]], + ): + return self.set_incremental_state(incremental_state, "attn_state", buffer) + + def apply_sparse_mask(self, attn_weights, tgt_len: int, src_len: int, bsz: int): + return attn_weights + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + items_to_add = {} + keys_to_remove = [] + for k in state_dict.keys(): + if k.endswith(prefix + "in_proj_weight"): + # in_proj_weight used to be q + k + v with same dimensions + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.weight"] = state_dict[k][:dim] + items_to_add[prefix + "k_proj.weight"] = state_dict[k][dim : 2 * dim] + items_to_add[prefix + "v_proj.weight"] = state_dict[k][2 * dim :] + + keys_to_remove.append(k) + + k_bias = prefix + "in_proj_bias" + if k_bias in state_dict.keys(): + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.bias"] = state_dict[k_bias][:dim] + items_to_add[prefix + "k_proj.bias"] = state_dict[k_bias][ + dim : 2 * dim + ] + items_to_add[prefix + "v_proj.bias"] = state_dict[k_bias][2 * dim :] + + keys_to_remove.append(prefix + "in_proj_bias") + + for k in keys_to_remove: + del state_dict[k] + + for key, value in items_to_add.items(): + state_dict[key] = value + + +class ConvFeatureExtractionModel(nn.Module): + def __init__( + self, + conv_layers: List[Tuple[int, int, int]], + dropout: float = 0.0, + mode: str = "default", + conv_bias: bool = False, + ): + super().__init__() + + assert mode in {"default", "layer_norm"} + + def block( + n_in, + n_out, + k, + stride, + is_layer_norm=False, + is_group_norm=False, + conv_bias=False, + ): + def make_conv(): + conv = nn.Conv1d(n_in, n_out, k, stride=stride, bias=conv_bias) + nn.init.kaiming_normal_(conv.weight) + return conv + + assert ( + is_layer_norm and is_group_norm + ) == False, "layer norm and group norm are exclusive" + + if is_layer_norm: + return nn.Sequential( + make_conv(), + nn.Dropout(p=dropout), + nn.Sequential( + TransposeLast(), + Fp32LayerNorm(dim, elementwise_affine=True), + TransposeLast(), + ), + nn.GELU(), + ) + elif is_group_norm: + return nn.Sequential( + make_conv(), + nn.Dropout(p=dropout), + Fp32GroupNorm(dim, dim, affine=True), + nn.GELU(), + ) + else: + return nn.Sequential(make_conv(), nn.Dropout(p=dropout), nn.GELU()) + + in_d = 1 + self.conv_layers = nn.ModuleList() + for i, cl in enumerate(conv_layers): + assert len(cl) == 3, "invalid conv definition: " + str(cl) + (dim, k, stride) = cl + + self.conv_layers.append( + block( + in_d, + dim, + k, + stride, + is_layer_norm=mode == "layer_norm", + is_group_norm=mode == "default" and i == 0, + conv_bias=conv_bias, + ) + ) + in_d = dim + + def forward(self, x): + + # BxT -> BxCxT + x = x.unsqueeze(1) + + for conv in self.conv_layers: + x = conv(x) + + return x + + +class TransposeLast(nn.Module): + def __init__(self, deconstruct_idx=None): + super().__init__() + self.deconstruct_idx = deconstruct_idx + + def forward(self, x): + if self.deconstruct_idx is not None: + x = x[self.deconstruct_idx] + return x.transpose(-2, -1) + + +class Fp32GroupNorm(nn.GroupNorm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def forward(self, input): + output = F.group_norm( + input.float(), + self.num_groups, + self.weight.float() if self.weight is not None else None, + self.bias.float() if self.bias is not None else None, + self.eps, + ) + return output.type_as(input) + + +class GradMultiply(torch.autograd.Function): + @staticmethod + def forward(ctx, x, scale): + ctx.scale = scale + res = x.new(x) + return res + + @staticmethod + def backward(ctx, grad): + return grad * ctx.scale, None + + +class Rotate3D(nn.Module): + """ + (T, B, D) --> (B, D, T) --> (D, T, B) --> (T, B, D) + """ + def __init__(self): + super().__init__() + + def forward(self, x): + return x.permute(1, 2, 0) + + +class SamePad(nn.Module): + def __init__(self, kernel_size, causal=False): + super().__init__() + if causal: + self.remove = kernel_size - 1 + else: + self.remove = 1 if kernel_size % 2 == 0 else 0 + + def forward(self, x): + if self.remove > 0: + x = x[:, :, : -self.remove] + return x diff --git a/SpeechLM/speechlm/__init__.py b/SpeechLM/speechlm/__init__.py new file mode 100644 index 0000000..97327d2 --- /dev/null +++ b/SpeechLM/speechlm/__init__.py @@ -0,0 +1 @@ +from . import data, tasks, criterions, models diff --git a/SpeechLM/speechlm/config/decode/infer_fsqlm.yaml b/SpeechLM/speechlm/config/decode/infer_fsqlm.yaml new file mode 100644 index 0000000..005524f --- /dev/null +++ b/SpeechLM/speechlm/config/decode/infer_fsqlm.yaml @@ -0,0 +1,44 @@ +# @package _group_ + +defaults: + - model: null + +hydra: + run: + dir: ${common_eval.results_path}/beam${decoding.beam}_th${decoding.beamthreshold}_lmw${decoding.lmweight}_wrd${decoding.wordscore}_sil${decoding.silweight} + sweep: + dir: ${common_eval.results_path} + subdir: beam${decoding.beam}_th${decoding.beamthreshold}_lmw${decoding.lmweight}_wrd${decoding.wordscore}_sil${decoding.silweight} + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ["ltr"] + store_labels: true + single_target: true + fine_tuning: true + normalize: ??? # must be consistent with pre-training + add_decoder_target: false + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +decoding: + type: fairseqlm + lexicon: ??? + lmpath: ??? + beamthreshold: 25 + beam: 500 + lmweight: 2 + wordscore: -1 + silweight: 0 + unique_wer_file: true +common_eval: + results_path: ??? + path: ??? + post_process: letter +dataset: + max_tokens: 1100000 + gen_subset: ??? diff --git a/SpeechLM/speechlm/config/decode/infer_kenlm.yaml b/SpeechLM/speechlm/config/decode/infer_kenlm.yaml new file mode 100644 index 0000000..98a8b75 --- /dev/null +++ b/SpeechLM/speechlm/config/decode/infer_kenlm.yaml @@ -0,0 +1,44 @@ +# @package _group_ + +defaults: + - model: null + +hydra: + run: + dir: ${common_eval.results_path}/beam${decoding.beam}_th${decoding.beamthreshold}_lmw${decoding.lmweight}_wrd${decoding.wordscore}_sil${decoding.silweight} + sweep: + dir: ${common_eval.results_path} + subdir: beam${decoding.beam}_th${decoding.beamthreshold}_lmw${decoding.lmweight}_wrd${decoding.wordscore}_sil${decoding.silweight} + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ["ltr"] + store_labels: true + single_target: true + fine_tuning: true + normalize: ??? # must be consistent with pre-training + add_decoder_target: false + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +decoding: + type: kenlm + lexicon: ??? + lmpath: ??? + beamthreshold: 100 + beam: 500 + lmweight: 2 + wordscore: -1 + silweight: 0 + unique_wer_file: true +common_eval: + results_path: ??? + path: ??? + post_process: letter +dataset: + max_tokens: 1100000 + gen_subset: ??? diff --git a/SpeechLM/speechlm/config/decode/infer_viterbi.yaml b/SpeechLM/speechlm/config/decode/infer_viterbi.yaml new file mode 100644 index 0000000..969fc23 --- /dev/null +++ b/SpeechLM/speechlm/config/decode/infer_viterbi.yaml @@ -0,0 +1,37 @@ +# @package _group_ + +defaults: + - model: null + +hydra: + run: + dir: ${common_eval.results_path}/viterbi + sweep: + dir: ${common_eval.results_path} + subdir: viterbi + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ["ltr"] + store_labels: true + single_target: true + fine_tuning: true + normalize: ??? # must be consistent with pre-training + add_decoder_target: false + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +decoding: + type: viterbi + unique_wer_file: true +common_eval: + results_path: ??? + path: ??? + post_process: letter +dataset: + batch_size: 1 + gen_subset: ??? diff --git a/SpeechLM/speechlm/config/finetune/speechlm_base_100h.yaml b/SpeechLM/speechlm/config/finetune/speechlm_base_100h.yaml new file mode 100644 index 0000000..c48b856 --- /dev/null +++ b/SpeechLM/speechlm/config/finetune/speechlm_base_100h.yaml @@ -0,0 +1,99 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1 + keep_last_epochs: 1 + keep_best_checkpoints: -1 + best_checkpoint_metric: wer + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: false # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: false + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1600000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 30000 + lr: [0.00001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechlm_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechLM/speechlm/config/finetune/speechlm_large_960h.yaml b/SpeechLM/speechlm/config/finetune/speechlm_large_960h.yaml new file mode 100644 index 0000000..dc86b6f --- /dev/null +++ b/SpeechLM/speechlm/config/finetune/speechlm_large_960h.yaml @@ -0,0 +1,98 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + +checkpoint: + save_interval: 1 + keep_last_epochs: 5 + keep_best_checkpoints: 5 + best_checkpoint_metric: wer + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 32 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: true # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: false + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 900000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_960 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 200000 + lr: [0.00001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechlm_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.0 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechLM/speechlm/config/pretrain/speechlm_base_librispeech.yaml b/SpeechLM/speechlm/config/pretrain/speechlm_base_librispeech.yaml new file mode 100644 index 0000000..454f5e2 --- /dev/null +++ b/SpeechLM/speechlm/config/pretrain/speechlm_base_librispeech.yaml @@ -0,0 +1,139 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 4 + keep_last_epochs: 4 + save_interval_updates: 50000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 50000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: legacy_ddp + distributed_backend: 'nccl' + distributed_port: -1 + distributed_world_size: 32 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + store_labels: true + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: false # must be consistent with extractor + add_decoder_target: false + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.0 + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: speechlm_criterion + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + text_ctc_weight: 0.1 + text_mum_weight: 0.0 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: speechlm + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + activation_fn: "gelu" + encoder_layers: 6 + encoder_attention_heads: 8 + encoder_layerdrop: 0.1 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_unit_encoder: true + add_text_ctc: true + mask_u2t: true + compute_mum: false + mix_with_unit: true + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + max_source_positions: 3000 + no_scale_embedding: true + layernorm_embedding: true + no_token_positional_embeddings: false + encoder: + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 8 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechLM/speechlm/config/pretrain/speechlm_large_librilight.yaml b/SpeechLM/speechlm/config/pretrain/speechlm_large_librilight.yaml new file mode 100644 index 0000000..74d593e --- /dev/null +++ b/SpeechLM/speechlm/config/pretrain/speechlm_large_librilight.yaml @@ -0,0 +1,144 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1234 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 1 + keep_last_epochs: 4 + save_interval_updates: 10000 + keep_interval_updates: 40 + keep_interval_updates_pattern: 10000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: legacy_ddp + distributed_backend: 'nccl' + distributed_port: -1 + distributed_world_size: 32 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + store_labels: true + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: true # must be consistent with extractor + add_decoder_target: false + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.0 + +dataset: + num_workers: 1 + max_tokens: 900000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 2 + +criterion: + _name: speechlm_criterion + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + text_ctc_weight: 0.1 + text_mum_weight: 0.0 + +optimization: + max_update: 400000 + lr: [0.001] + clip_norm: 1.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: speechlm + label_rate: ??? + activation_fn: "gelu" + encoder_layers: 12 + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + encoder_attention_heads: 16 + final_dim: 256 + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: layer_norm + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + encoder_layerdrop: 0.0 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + layer_norm_first: true + feature_grad_mult: 1.0 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_unit_encoder: true + add_text_ctc: true + mask_u2t: true + compute_mum: false + mix_with_unit: true + scaling_for_att: 32 + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + max_source_positions: 3000 + no_scale_embedding: true + layernorm_embedding: true + no_token_positional_embeddings: false + encoder: + embed_dim: 1024 + ffn_embed_dim: 4096 + layers: 12 + attention_heads: 16 + normalize_before: ${model.layer_norm_first} + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} + diff --git a/SpeechLM/speechlm/config/pretrain/speechlmp_base_cfg.pt b/SpeechLM/speechlm/config/pretrain/speechlmp_base_cfg.pt new file mode 100644 index 0000000000000000000000000000000000000000..5ba9faf27b9bbdcadde4452ff6c2f9d020a36fc4 GIT binary patch literal 31407 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

    CE%vhy^F^aRY^9p*Qt#J{) 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 bYAgKt{H~~A(ANwzoN-LJW=I9=hjsrKcQxH( literal 0 HcmV?d00001 diff --git a/SpeechLM/speechlm/criterions/__init__.py b/SpeechLM/speechlm/criterions/__init__.py new file mode 100644 index 0000000..285826b --- /dev/null +++ b/SpeechLM/speechlm/criterions/__init__.py @@ -0,0 +1,9 @@ +import importlib +import os + +for file in os.listdir(os.path.dirname(__file__)): + if file.endswith(".py") and not file.startswith("_"): + criterion_name = file[: file.find(".py")] + importlib.import_module( + "speechlm.criterions." + criterion_name + ) diff --git a/SpeechLM/speechlm/criterions/fasttext2unit_loss.py b/SpeechLM/speechlm/criterions/fasttext2unit_loss.py new file mode 100644 index 0000000..2cceed3 --- /dev/null +++ b/SpeechLM/speechlm/criterions/fasttext2unit_loss.py @@ -0,0 +1,181 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +from typing import List, Dict, Any +from dataclasses import dataclass, field + +import torch +import torch.nn.functional as F + +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from fairseq.data.data_utils import lengths_to_mask +from fairseq.models.fairseq_model import FairseqEncoderModel + +def label_smoothed_nll_loss(lprobs, target, epsilon, ignore_index=None, reduce=True): + if target.dim() == lprobs.dim() - 1: + target = target.unsqueeze(-1) + nll_loss = -lprobs.gather(dim=-1, index=target) + smooth_loss = -lprobs.sum(dim=-1, keepdim=True) + if ignore_index is not None: + pad_mask = target.eq(ignore_index) + nll_loss.masked_fill_(pad_mask, 0.0) + smooth_loss.masked_fill_(pad_mask, 0.0) + else: + nll_loss = nll_loss.squeeze(-1) + smooth_loss = smooth_loss.squeeze(-1) + if reduce: + ntokens = (~pad_mask).sum() + nll_loss = nll_loss.sum() / ntokens + smooth_loss = smooth_loss.sum() / ntokens + eps_i = epsilon / (lprobs.size(-1) - 1) + loss = (1.0 - epsilon - eps_i) * nll_loss + eps_i * smooth_loss + return loss, nll_loss + +@dataclass +class FastText2UnitCriterionConfig(FairseqDataclass): + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + dur_loss_weight: float = field( + default=1.0, + metadata={"help": "scale of duration loss"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + +@register_criterion("fasttext2unit_criterion", dataclass=FastText2UnitCriterionConfig) +class FastText2UnitLoss(FairseqCriterion): + def __init__(self, + task, + label_smoothing=0, + dur_loss_weight=1.0, + report_accuracy=False, + ): + super().__init__(task) + self.eps = label_smoothing + self.dur_loss_weight = dur_loss_weight + self.pad_idx = task.tgt_dict.pad() + self.report_accuracy = report_accuracy + + def forward(self, model: FairseqEncoderModel, sample, reduction="mean"): + src_tokens = sample["net_input"]["src_tokens"] + src_lens = sample["net_input"]["src_lengths"] + tgt_lens = sample["target_lengths"] + + _feat_out, _feat_out_post, out_lens, log_dur_out, pitch_out, energy_out = model( + src_tokens=src_tokens, + src_lengths=src_lens, + prev_output_tokens=sample["net_input"]["prev_output_tokens"], + incremental_state=None, + target_lengths=tgt_lens, + speaker=sample["speaker"], + durations=sample["durations"], + pitches=sample["pitches"], + energies=sample["energies"], + ) + + src_mask = lengths_to_mask(sample["net_input"]["src_lengths"]) + tgt_mask = lengths_to_mask(sample["target_lengths"]) + + lprobs = model.get_normalized_probs((_feat_out,), log_probs=True) + target = sample["target"].long() + ce_loss, nll_loss = label_smoothed_nll_loss(lprobs, target, self.eps, self.padding_idx, reduce=True) + + pitches, energies = sample["pitches"], sample["energies"] + if pitches is not None: + pitch_out, pitches = pitch_out[src_mask], pitches[src_mask] + pitch_loss = F.mse_loss(pitch_out, pitches, reduction=reduction) + else: + pitch_loss = 0 + if energies is not None: + energy_out, energies = energy_out[src_mask], energies[src_mask] + energy_loss = F.mse_loss(energy_out, energies, reduction=reduction) + else: + energy_loss = 0 + + log_dur_out = log_dur_out[src_mask] + dur = sample["durations"].float() + dur = dur.half() if log_dur_out.type().endswith(".HalfTensor") else dur + log_dur = torch.log(dur + 1)[src_mask] + dur_loss = F.mse_loss(log_dur_out, log_dur, reduction=reduction) + dur_loss = self.dur_loss_weight * dur_loss + + loss = ce_loss + dur_loss + pitch_loss + energy_loss + + sample_size = sample["nsentences"] + logging_output = { + "loss": utils.item(loss.data), + "ntokens": sample["ntokens"], + "nsentences": sample["nsentences"], + "sample_size": sample_size, + "ce_loss": utils.item(ce_loss.data), + "dur_loss": utils.item(dur_loss.data), + "pitch_loss": utils.item(pitch_loss), + "energy_loss": utils.item(energy_loss), + } + if self.report_accuracy: + n_correct = lprobs.argmax(-1).masked_select(tgt_mask).eq(target.masked_select(tgt_mask)).sum() + logging_output["n_correct"] = utils.item(n_correct.data) + logging_output["total"] = tgt_mask.sum() + return loss, 1, logging_output + + @classmethod + def reduce_metrics(cls, logging_outputs: List[Dict[str, Any]]) -> None: + ns = [log.get("sample_size", 0) for log in logging_outputs] + ntot = sum(ns) + ws = [n / (ntot + 1e-8) for n in ns] + for key in [ + "loss", + "ce_loss", + "dur_loss", + "pitch_loss", + "energy_loss", + ]: + vals = [log.get(key, 0) for log in logging_outputs] + val = sum(val * w for val, w in zip(vals, ws)) + metrics.log_scalar(key, val, ntot, round=3) + metrics.log_scalar("sample_size", ntot, len(logging_outputs)) + + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("n_correct", n_correct) + metrics.log_derived( + "accuracy", + lambda meters: round( + meters["n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + # inference metrics + if "targ_frames" not in logging_outputs[0]: + return + n = sum(log.get("targ_frames", 0) for log in logging_outputs) + for key, new_key in [ + ("mcd_loss", "mcd_loss"), + ("pred_frames", "pred_ratio"), + ("nins", "ins_rate"), + ("ndel", "del_rate"), + ]: + val = sum(log.get(key, 0) for log in logging_outputs) + metrics.log_scalar(new_key, val / n, n, round=3) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + return False diff --git a/SpeechLM/speechlm/criterions/speechlm_criterion.py b/SpeechLM/speechlm/criterions/speechlm_criterion.py new file mode 100644 index 0000000..ca13298 --- /dev/null +++ b/SpeechLM/speechlm/criterions/speechlm_criterion.py @@ -0,0 +1,352 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import numpy as np +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass + +logger = logging.getLogger(__name__) + +@dataclass +class HSTCriterionConfig(FairseqDataclass): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + text_ctc_weight: float = field( + default=0.1, + metadata={"help": "weights for text CTC Loss, loss will be (hubert_loss + dec_weight * CE_Loss + text_weight * (CE_Loss + CTC_loss))"}, + ) + text_mum_weight: float = field( + default=0.0, + metadata={"help": "masked unit modeling weight from the text end"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + no_ctc_blank: bool = field( + default=False, + metadata={"help": "mask out the blank of ctc, only when dec_loss_type=ctc"}, + ) + +@register_criterion("speechlm_criterion", dataclass=HSTCriterionConfig) +class SpeechLMCriterion(FairseqCriterion): + def __init__( + self, + task, + pred_masked_weight, + pred_nomask_weight, + loss_weights=None, + log_keys=None, + text_ctc_weight=0.1, + text_mum_weight=0, + report_accuracy=False, + ignore_prefix_size=0, + no_ctc_blank=False, + ): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.text_ctc_weight = text_ctc_weight + self.text_mum_weight = text_mum_weight + self.report_accuracy = report_accuracy + self.ignore_prefix_size = ignore_prefix_size + self.no_ctc_blank = no_ctc_blank + self.padding_idx = task.dictionaries[0].pad() + self.eos_idx = task.dictionaries[0].eos() + self.blank_idx = task.dictionaries[0].bos() + + def compute_hubert_loss(self, model, net_output, reduction, suffix=''): + loss = 0 + sample_size = [] + logging_output = {} + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_{i}{suffix}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size.append(targ_m_list[0].numel()) + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_{i}{suffix}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size.append(targ_u_list[0].numel()) + + sample_size = np.mean(sample_size) + + def compute_correct(logits, targets): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == targets + min = logits.argmin(-1) == targets + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + corr_m, count_m = compute_correct(logp_m, targ_m) + logging_output[f"correct_m_{i}{suffix}"] = corr_m + logging_output[f"count_m_{i}{suffix}"] = count_m + + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + corr_u, count_u = compute_correct(logp_u, targ_u) + logging_output[f"correct_u_{i}{suffix}"] = corr_u + logging_output[f"count_u_{i}{suffix}"] = count_u + + return loss, sample_size, logging_output + + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + reduction = "sum" if reduce else "none" + + if "net_input" in sample: + text_sample = None + else: + text_sample = sample.get("text_paired") + sample = sample.get("speech") + + ### 1. L_UMLM: do hubert forward and loss computation + sample["modality"] = "speech" + net_output = model(target_list=sample["target_list"], **sample["net_input"]) + loss, sample_size, logging_output = self.compute_hubert_loss( + model, + net_output, + reduction, + ) + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len( + self.loss_weights + ), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + ### 2. do text forward and loss computation + if text_sample is not None: + text_sample["modality"] = "text" + ## 2.1 re-loading "target_list", in default case, target_list = [src_tokens], + ## while in case of using "unit-phone-char" structure, target_list will be [ref_tokens] + text_sample["net_input"]["target_list"] = [ + text_sample.get("ref_tokens", text_sample["net_input"]["src_tokens"].clone()), + ] + text_net_output = model(**text_sample["net_input"]) + + ### 2.2 L_UMLM (text-end, not applied by default) + if self.text_mum_weight > 0: + loss_u2t, sample_size_u2t, logging_output_u2t = self.compute_hubert_loss( + model, + text_net_output, + reduction, + suffix="_u2t", + ) + loss += self.text_mum_weight * loss_u2t * sample_size / sample_size_u2t + logging_output.update(logging_output_u2t) + + ### 2.3 L_UCTC + text_sample_size = text_sample["ntokens"] + if self.text_ctc_weight > 0: + text_ctc_loss = self.compute_ctc_loss(model, text_net_output, text_sample["target"], reduction=reduction) + loss += self.text_ctc_weight * text_ctc_loss * sample_size / text_sample_size + logging_output["text_ctc_loss"] = utils.item(text_ctc_loss) + logging_output["text_sample_size"] = text_sample_size + + logging_output = { + "loss": utils.item(loss) if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["id"].numel() + (text_sample["id"].numel() if text_sample is not None else 0), + "sample_size": sample_size, + **logging_output, + } + + return loss, sample_size, logging_output + + def compute_ctc_loss(self, model, net_output, target, reduction): + logits = net_output["encoder_out_ctc"][0] # (T, B, C) from the code-encoder + if self.no_ctc_blank: + ## set prob of to -inf + logits = logits.float() + logits[:, :, self.blank_idx] = -1000000.0 + + lprobs = F.log_softmax(logits.float(), dim=-1) + + encoder_padding_mask = net_output["encoder_padding_mask"][0] + non_padding_mask = ~encoder_padding_mask + input_lengths = non_padding_mask.long().sum(-1) + pad_mask = (target != self.padding_idx) & (target != self.eos_idx) + targets_flat = target.masked_select(pad_mask) + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction=reduction, + zero_infinity=True, + ) + return loss + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + if sample["modality"] == "speech": + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + else: + target = sample["target"] + + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + if "text_sample_size" in logging_outputs[0]: + text_sample_size = sum(log.get("text_sample_size", 0) for log in logging_outputs) + for lk in logging_outputs[0].keys(): + if lk.startswith("text_") and lk.endswith("_loss"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / text_sample_size / math.log(2), round=3) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/SpeechLM/speechlm/data/concat_dataset.py b/SpeechLM/speechlm/data/concat_dataset.py new file mode 100644 index 0000000..9c3c22b --- /dev/null +++ b/SpeechLM/speechlm/data/concat_dataset.py @@ -0,0 +1,131 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import bisect + +import numpy as np +from torch.utils.data.dataloader import default_collate + +from fairseq.data import FairseqDataset + + +class ConcatDataset(FairseqDataset): + @staticmethod + def cumsum(sequence, sample_ratios): + r, s = [], 0 + for e, ratio in zip(sequence, sample_ratios): + curr_len = int(ratio * len(e)) + r.append(curr_len + s) + s += curr_len + return r + + def __init__(self, datasets, sample_ratios=1): + super(ConcatDataset, self).__init__() + assert len(datasets) > 0, "datasets should not be an empty iterable" + self.datasets = list(datasets) + if isinstance(sample_ratios, int): + sample_ratios = [sample_ratios] * len(self.datasets) + self.sample_ratios = sample_ratios + self.cumulative_sizes = self.cumsum(self.datasets, sample_ratios) + self.real_sizes = [len(d) for d in self.datasets] + + def __len__(self): + return self.cumulative_sizes[-1] + + def __getitem__(self, idx): + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx][sample_idx] + + def _get_dataset_and_sample_index(self, idx: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + sample_idx = sample_idx % self.real_sizes[dataset_idx] + return dataset_idx, sample_idx + + def collater(self, samples, **extra_args): + # For now only supports datasets with same underlying collater implementations + if hasattr(self.datasets[0], "collater"): + return self.datasets[0].collater(samples, **extra_args) + else: + return default_collate(samples, **extra_args) + + def size(self, idx: int): + """ + Return an example's size as a float or tuple. + """ + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx].size(sample_idx) + + def num_tokens(self, index: int): + return np.max(self.size(index)) + + def attr(self, attr: str, index: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, index) + return getattr(self.datasets[dataset_idx], attr, None) + + @property + def sizes(self): + _dataset_sizes = [] + for ds, sr in zip(self.datasets, self.sample_ratios): + if isinstance(ds.sizes, np.ndarray): + _dataset_sizes.append(np.tile(ds.sizes, sr)) + else: + # Only support underlying dataset with single size array. + assert isinstance(ds.sizes, list) + _dataset_sizes.append(np.tile(ds.sizes[0], sr)) + return np.concatenate(_dataset_sizes) + + @property + def supports_prefetch(self): + return all(d.supports_prefetch for d in self.datasets) + + def ordered_indices(self): + """ + Returns indices sorted by length. So less padding is needed. + """ + if isinstance(self.sizes, np.ndarray) and len(self.sizes.shape) > 1: + # special handling for concatenating lang_pair_datasets + if getattr(self.datasets[0], "shuffle", False): + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + sizes = self.sizes + tgt_sizes = ( + sizes[:, 1] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else None + ) + src_sizes = ( + sizes[:, 0] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else sizes + ) + # sort by target length, then source length + if tgt_sizes is not None: + indices = indices[np.argsort(tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(src_sizes[indices], kind="mergesort")] + else: + return np.argsort(self.sizes) + + def prefetch(self, indices): + frm = 0 + for to, ds in zip(self.cumulative_sizes, self.datasets): + real_size = len(ds) + if getattr(ds, "supports_prefetch", False): + ds.prefetch([(i - frm) % real_size for i in indices if frm <= i < to]) + frm = to + + @property + def can_reuse_epoch_itr_across_epochs(self): + return all(d.can_reuse_epoch_itr_across_epochs for d in self.datasets) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.datasets: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) diff --git a/SpeechLM/speechlm/data/hubert_dataset.py b/SpeechLM/speechlm/data/hubert_dataset.py new file mode 100644 index 0000000..cef948f --- /dev/null +++ b/SpeechLM/speechlm/data/hubert_dataset.py @@ -0,0 +1,599 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import itertools +import logging +import io +import os +import sys +import time +from pathlib import Path +from typing import Any, List, Optional, Union, Tuple + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils, Dictionary +from fairseq.data.fairseq_dataset import FairseqDataset +from fairseq.data.audio.audio_utils import ( + read_from_stored_zip, + is_sf_audio_data, +) + +FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS = {".npy", ".wav", ".flac", ".ogg"} + +logger = logging.getLogger(__name__) + +def parse_path(path: str) -> Tuple[str, List[int]]: + """Parse data path which is either a path to + 1. a .npy/.wav/.flac/.ogg file + 2. a stored ZIP file with slicing info: "[zip_path]:[offset]:[length]" + + Args: + path (str): the data path to parse + + Returns: + file_path (str): the file path + slice_ptr (list of int): empty in case 1; + byte offset and length for the slice in case 2 + """ + + if Path(path).suffix in FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS: + _path, slice_ptr = path, [] + else: + _path, *slice_ptr = path.split(":") + if not Path(_path).is_file(): + raise FileNotFoundError(f"File not found: {_path}") + assert len(slice_ptr) in {0, 1, 2}, f"Invalid path: {path}" + slice_ptr = [int(i) for i in slice_ptr] + return _path, slice_ptr + +def load_audio(manifest_path, max_keep, min_keep, retry_times=5): + n_long, n_short = 0, 0 + names, inds, sizes, chunk_names, chunk_indices = [], [], [], [], [] + for i in range(retry_times): + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) == 2, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + fname = items[0].split(":") + if len(fname) > 2: + if len(chunk_names) == 0 or fname[0] != chunk_names[-1]: + chunk_names.append(fname[0]) + chunk_indices.append(len(names)) + names.append(items[0]) + inds.append(ind) + sizes.append(sz) + if len(names) == 0: + logger.warn(f"Fail to load manifest for the {i} time") + time.sleep(1) + continue + else: + break + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes, chunk_names, chunk_indices + + +def load_label(label_path, inds, tot, retry_times=5): + for i in range(retry_times): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + if len(labels) == 0: + logger.warn(f"Fail to load label for the {i} time") + time.sleep(1) + continue + else: + break + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot, retry_times=5): + for i in range(retry_times): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + if len(code_lengths) == 0: + logger.warn(f"Fail to load label for the {i} time") + time.sleep(1) + continue + else: + break + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +class HubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + tgt_dict: Optional[Dictionary] = None, + add_decoder_target: bool = False, + fine_tuning: bool = False, + tgt_lang_idx: int = None, + tokenizer = None, + mbart_style_lang_id: bool = False, + retry_times: int = 5, + reduce_label_for_dec: bool = True, + ): + self.audio_root, self.audio_names, inds, tot, self.wav_sizes, self.chunk_names, self.chunk_indices = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size, retry_times + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + self.random_crop = random_crop + self.tgt_dict = tgt_dict + self.add_decoder_target = add_decoder_target + self.fine_tuning = fine_tuning + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.single_target = single_target + self.epoch = 0 + + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + self.store_labels = store_labels + if store_labels: + self.label_list = [load_label(p, inds, tot, retry_times) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot, retry_times) for p in label_paths + ] + assert label_processors is None or len(label_processors) == self.num_labels + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths( + self.wav_sizes, sample_rate, label_path, label_rate, inds, tot + ) + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + self.tgt_lang_idx = tgt_lang_idx + self.tokenizer = tokenizer + self.mbart_style_lang_id = mbart_style_lang_id + self.retry_times = retry_times + self.reduce_label_for_dec = reduce_label_for_dec + logger.info( + f"pad_audio={pad_audio}, random_crop={random_crop}, tgt_lang_idx={self.tgt_lang_idx}, reduce_label_for_dec={reduce_label_for_dec}, " + f"mbart_style_lang_id={mbart_style_lang_id}, normalize={normalize}, max_sample_size={self.max_sample_size}" + ) + + def set_epoch(self, epoch): + self.epoch = epoch + + def batch_by_size(self, indices, max_tokens=None, max_sentences=None, required_batch_size_multiple=1): + self.max_tokens = max_tokens + self.max_sentences = max_sentences + self.required_batch_size_multiple = required_batch_size_multiple + if isinstance(indices[0], np.ndarray): + batch_list = [] + for indice in indices: + batch = super(HubertDataset, self).batch_by_size(indice, max_tokens, max_sentences, required_batch_size_multiple) + batch_list.append(batch) + return batch_list + else: + return super(HubertDataset, self).batch_by_size(indices, max_tokens, max_sentences, required_batch_size_multiple) + def shuffle_batches(self, batches, seed): + if isinstance(batches[0], list): + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for batch in batches: + np.random.shuffle(batch) + new_batches.extend(batch) + return new_batches + else: + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + return batches + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + _path, slice_ptr = parse_path(wav_path) + if len(slice_ptr) == 1: + import kaldiio + feat = kaldiio.load_mat(wav_path) + feat = torch.from_numpy(feat).float() + if self.normalize: + with torch.no_grad(): + feat = F.layer_norm(feat, feat.shape[-1]) + return feat + else: + if len(slice_ptr) == 2: + byte_data = read_from_stored_zip(_path, slice_ptr[0], slice_ptr[1]) + assert is_sf_audio_data(byte_data) + wav_path = io.BytesIO(byte_data) + for i in range(self.retry_times): + if i < self.retry_times - 1: + try: + wav, cur_sample_rate = sf.read(wav_path) + break + except Exception as e: + logger.warn(f"Fail to load wav for the {i} time") + logger.warn(e) + time.sleep(1) + continue + else: + wav, cur_sample_rate = sf.read(wav_path) + + wav = torch.from_numpy(wav).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.tokenizer is not None and self.fine_tuning: + label = self.tokenizer.encode(label) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def __getitem__(self, index): + wav = self.get_audio(index) + labels = self.get_labels(index) + return {"id": index, "source": wav, "label_list": labels} + + def __len__(self): + return len(self.wav_sizes) + + def crop_to_max_size(self, wav, target_size): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + + start, end = 0, target_size + if self.random_crop: + start = np.random.randint(0, diff + 1) + end = size - diff + start + return wav[start:end], start + + def collater(self, samples): + # target = max(sizes) -> random_crop not used + # target = max_sample_size -> random_crop used for long + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + feat_dim = audios[0].size(-1) if audios[0].dim() > 1 else 1 + collated_audios, padding_mask, audio_starts = self.collater_audio( + audios, audio_size, feat_dim, + ) + + targets_by_label = [ + [s["label_list"][i] for s in samples] for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + if self.add_decoder_target: + if self.fine_tuning: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + else: + if self.tokenizer is not None: + decoder_label = [ + # Set 48 for translate int to char and avoid \n + torch.cat( + ( + torch.tensor( + self.tokenizer.sp.Encode( + "".join( + [chr(j + 48) for j in ( + targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]] + ).tolist()] + ), out_type=int + ) + ), + torch.tensor([self.tgt_dict.eos()]) + ), dim=0 + ).long() + for i in range(targets_list[0].size(0)) + ] + else: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + if self.mbart_style_lang_id: + decoder_label = [ + torch.cat((decoder_label[i], torch.tensor([self.tgt_lang_idx])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + dec_ntokens = sum(x.size(0) for x in decoder_label) + decoder_target = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=False, + ) + decoder_target_lengths = torch.tensor( + [x.size(0) for x in decoder_label], dtype=torch.long + ) + prev_output_tokens = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=True, + ) + + if self.tgt_lang_idx is not None and not self.mbart_style_lang_id: + assert (prev_output_tokens[:, 0] != self.tgt_dict.eos()).sum() == 0 + prev_output_tokens[:, 0] = self.tgt_lang_idx + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "decoder_target": decoder_target, + "decoder_target_lengths": decoder_target_lengths, + "dec_ntokens": dec_ntokens, + "lang_idx": self.tgt_lang_idx, + } + else: + net_input = {"source": collated_audios, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch + + def collater_audio(self, audios, audio_size, feat_dim=1): + collated_audios = audios[0].new_zeros(len(audios), audio_size, feat_dim) + padding_mask = ( + torch.BoolTensor(collated_audios.shape[0:2]).fill_(False) + # if self.pad_audio else None + ) + audio_starts = [0 for _ in audios] + for i, audio in enumerate(audios): + audio = audio.view(-1, feat_dim) + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat([audio, audio.new_full((-diff, feat_dim), 0.0)]) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size + ) + return collated_audios.squeeze(-1), padding_mask, audio_starts + + def collater_frm_label(self, targets, audio_size, audio_starts, label_rate, pad): + assert label_rate > 0 + s2f = label_rate / self.sample_rate + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s : s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.wav_sizes[index] + return min(self.wav_sizes[index], self.max_sample_size) + + @property + def sizes(self): + return np.array(self.wav_sizes) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + + if self.shuffle: + if len(self.chunk_names) > 0: + logger.info(f"ordered indices for epoch {self.epoch}") + with data_utils.numpy_seed(self.epoch): + self.chunk_order = np.random.permutation(len(self.chunk_names)) + chunk_count = 0 + tmp_sizes = [] + tmp_indices = [] + indice = [] + for i in self.chunk_order: + chunk_count += 1 + start = self.chunk_indices[i] + end = self.chunk_indices[i+1] if i < len(self.chunk_names) - 1 else len(self) + size = list(self.sizes[start:end]) + tmp_indices.extend(list(np.arange(start, end))) + tmp_sizes.extend(size) + if chunk_count % 10 == 0 or i == self.chunk_order[0]: + order = [np.random.permutation(len(tmp_indices))] + order.append( + np.minimum( + np.array(tmp_sizes), + self.max_sample_size, + ) + ) + sort_idx = np.lexsort(order)[::-1] + indice.append(np.array([tmp_indices[k] for k in sort_idx])) + tmp_indices = [] + tmp_sizes =[] + return indice + else: + order = [np.random.permutation(len(self))] + order.append( + np.minimum( + np.array(self.sizes), + self.max_sample_size, + ) + ) + return np.lexsort(order)[::-1] + else: + return np.arange(len(self)) + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechLM/speechlm/data/language_trible_dataset.py b/SpeechLM/speechlm/data/language_trible_dataset.py new file mode 100644 index 0000000..587a045 --- /dev/null +++ b/SpeechLM/speechlm/data/language_trible_dataset.py @@ -0,0 +1,671 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import numpy as np +import torch +import os +import itertools + +from fairseq.data import FairseqDataset, data_utils +from fairseq.data import ( + AppendTokenDataset, + ConcatDataset, + PrependTokenDataset, + data_utils, + indexed_dataset, +) + +logger = logging.getLogger(__name__) + +def load_langtriple_dataset( + data_path, + split, + src, + src_dict, + ref, + ref_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, + lang_format="[{}]", +): + assert not truncate_source + def split_exists(split, src, ref, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}-{}.{}".format(split, src, ref, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + ref_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, ref, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}-{}.".format(split_k, src, ref, tgt)) + elif split_exists(split_k, tgt, ref, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}-{}.".format(split_k, tgt, ref, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + src_datasets.append(src_dataset) + + ref_dataset = data_utils.load_indexed_dataset( + prefix + ref, ref_dict, dataset_impl + ) + ref_datasets.append(ref_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{}-{} {} examples".format( + data_path, split_k, src, ref, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(ref_datasets) + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + ref_dataset = ref_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + ref_dataset = ConcatDataset(ref_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(ref_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + ref_dataset = PrependTokenDataset(ref_dataset, ref_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + ref_dataset = PrependTokenDataset(ref_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index(lang_format.format(src)) + ) + ref_dataset = AppendTokenDataset( + ref_dataset, ref_dict.index(lang_format.format(ref)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index(lang_format.format(tgt)) + ) + eos = tgt_dict.index(lang_format.format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguageTripleDataset( + src_dataset, + src_dataset.sizes, + src_dict, + ref_dataset, + ref_dataset.sizes, + ref_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + ) + + +def collate( + samples, + pad_idx, + eos_idx, + left_pad_source=True, + left_pad_target=False, + input_feeding=True, + pad_to_length=None, + pad_to_multiple=1, +): + if len(samples) == 0: + return {} + + def merge(key, left_pad, move_eos_to_beginning=False, pad_to_length=None): + return data_utils.collate_tokens( + [s[key] for s in samples], + pad_idx, + None, + left_pad, + move_eos_to_beginning, + pad_to_length=pad_to_length, + pad_to_multiple=pad_to_multiple, + ) + + def check_alignment(alignment, src_len, tgt_len): + if alignment is None or len(alignment) == 0: + return False + if ( + alignment[:, 0].max().item() >= src_len - 1 + or alignment[:, 1].max().item() >= tgt_len - 1 + ): + logger.warning("alignment size mismatch found, skipping alignment!") + return False + return True + + def compute_alignment_weights(alignments): + """ + Given a tensor of shape [:, 2] containing the source-target indices + corresponding to the alignments, a weight vector containing the + inverse frequency of each target index is computed. + For e.g. if alignments = [[5, 7], [2, 3], [1, 3], [4, 2]], then + a tensor containing [1., 0.5, 0.5, 1] should be returned (since target + index 3 is repeated twice) + """ + align_tgt = alignments[:, 1] + _, align_tgt_i, align_tgt_c = torch.unique( + align_tgt, return_inverse=True, return_counts=True + ) + align_weights = align_tgt_c[align_tgt_i[np.arange(len(align_tgt))]] + return 1.0 / align_weights.float() + + id = torch.LongTensor([s["id"] for s in samples]) + src_tokens = merge( + "source", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + ref_tokens = merge( + "reference", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + # sort by descending source length + src_lengths = torch.LongTensor( + [s["source"].ne(pad_idx).long().sum() for s in samples] + ) + ref_lengths = torch.LongTensor( + [s["reference"].ne(pad_idx).long().sum() for s in samples] + ) + src_lengths, sort_order = src_lengths.sort(descending=True) + id = id.index_select(0, sort_order) + src_tokens = src_tokens.index_select(0, sort_order) + ref_lengths = ref_lengths.index_select(0, sort_order) + ref_tokens = ref_tokens.index_select(0, sort_order) + + prev_output_tokens = None + target = None + if samples[0].get("target", None) is not None: + target = merge( + "target", + left_pad=left_pad_target, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + target = target.index_select(0, sort_order) + tgt_lengths = torch.LongTensor( + [s["target"].ne(pad_idx).long().sum() for s in samples] + ).index_select(0, sort_order) + ntokens = tgt_lengths.sum().item() + + if samples[0].get("prev_output_tokens", None) is not None: + prev_output_tokens = merge("prev_output_tokens", left_pad=left_pad_target) + elif input_feeding: + # we create a shifted version of targets for feeding the + # previous output token(s) into the next decoder step + prev_output_tokens = merge( + "target", + left_pad=left_pad_target, + move_eos_to_beginning=True, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + else: + ntokens = src_lengths.sum().item() + + batch = { + "id": id, + "nsentences": len(samples), + "ntokens": ntokens, + "net_input": { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + }, + "target": target, + "ref_tokens": ref_tokens, + "ref_lengths": ref_lengths, + } + if prev_output_tokens is not None: + batch["net_input"]["prev_output_tokens"] = prev_output_tokens.index_select( + 0, sort_order + ) + + if samples[0].get("alignment", None) is not None: + bsz, tgt_sz = batch["target"].shape + src_sz = batch["net_input"]["src_tokens"].shape[1] + + offsets = torch.zeros((len(sort_order), 2), dtype=torch.long) + offsets[:, 1] += torch.arange(len(sort_order), dtype=torch.long) * tgt_sz + if left_pad_source: + offsets[:, 0] += src_sz - src_lengths + if left_pad_target: + offsets[:, 1] += tgt_sz - tgt_lengths + + alignments = [ + alignment + offset + for align_idx, offset, src_len, tgt_len in zip( + sort_order, offsets, src_lengths, tgt_lengths + ) + for alignment in [samples[align_idx]["alignment"].view(-1, 2)] + if check_alignment(alignment, src_len, tgt_len) + ] + + if len(alignments) > 0: + alignments = torch.cat(alignments, dim=0) + align_weights = compute_alignment_weights(alignments) + + batch["alignments"] = alignments + batch["align_weights"] = align_weights + + if samples[0].get("constraints", None) is not None: + # Collate the packed constraints across the samples, padding to + # the length of the longest sample. + lens = [sample.get("constraints").size(0) for sample in samples] + max_len = max(lens) + constraints = torch.zeros((len(samples), max(lens))).long() + for i, sample in enumerate(samples): + constraints[i, 0 : lens[i]] = samples[i].get("constraints") + batch["constraints"] = constraints.index_select(0, sort_order) + + return batch + + +class LanguageTripleDataset(FairseqDataset): + """ + A pair of torch.utils.data.Datasets. + + Args: + src (torch.utils.data.Dataset): source dataset to wrap + src_sizes (List[int]): source sentence lengths + src_dict (~fairseq.data.Dictionary): source vocabulary + tgt (torch.utils.data.Dataset, optional): target dataset to wrap + tgt_sizes (List[int], optional): target sentence lengths + tgt_dict (~fairseq.data.Dictionary, optional): target vocabulary + left_pad_source (bool, optional): pad source tensors on the left side + (default: True). + left_pad_target (bool, optional): pad target tensors on the left side + (default: False). + shuffle (bool, optional): shuffle dataset elements before batching + (default: True). + input_feeding (bool, optional): create a shifted version of the targets + to be passed into the model for teacher forcing (default: True). + remove_eos_from_source (bool, optional): if set, removes eos from end + of source if it's present (default: False). + append_eos_to_target (bool, optional): if set, appends eos to end of + target if it's absent (default: False). + align_dataset (torch.utils.data.Dataset, optional): dataset + containing alignments. + constraints (Tensor, optional): 2d tensor with a concatenated, zero- + delimited list of constraints for each sentence. + append_bos (bool, optional): if set, appends bos to the beginning of + source/target sentence. + num_buckets (int, optional): if set to a value greater than 0, then + batches will be bucketed into the given number of batch shapes. + src_lang_id (int, optional): source language ID, if set, the collated batch + will contain a field 'src_lang_id' in 'net_input' which indicates the + source language of the samples. + tgt_lang_id (int, optional): target language ID, if set, the collated batch + will contain a field 'tgt_lang_id' which indicates the target language + of the samples. + """ + + def __init__( + self, + src, + src_sizes, + src_dict, + ref, + ref_sizes, + ref_dict, + tgt=None, + tgt_sizes=None, + tgt_dict=None, + left_pad_source=True, + left_pad_target=False, + shuffle=True, + input_feeding=True, + remove_eos_from_source=False, + append_eos_to_target=False, + align_dataset=None, + constraints=None, + append_bos=False, + eos=None, + num_buckets=0, + src_lang_id=None, + tgt_lang_id=None, + pad_to_multiple=1, + ): + if tgt_dict is not None: + assert src_dict.pad() == tgt_dict.pad() + assert src_dict.eos() == tgt_dict.eos() + assert src_dict.unk() == tgt_dict.unk() + if tgt is not None: + assert len(src) == len( + tgt + ), "Source and target must contain the same number of examples" + assert len(src) == len( + ref + ), "Source and reference must contain the same number of examples" + self.src = src + self.ref = ref + self.tgt = tgt + self.src_sizes = np.array(src_sizes) + self.ref_sizes = np.array(ref_sizes) + self.tgt_sizes = np.array(tgt_sizes) if tgt_sizes is not None else None + self.sizes = ( + np.vstack((self.src_sizes, self.tgt_sizes)).T + if self.tgt_sizes is not None + else self.src_sizes + ) + self.src_dict = src_dict + self.ref_dict = ref_dict + self.tgt_dict = tgt_dict + self.left_pad_source = left_pad_source + self.left_pad_target = left_pad_target + self.shuffle = shuffle + self.input_feeding = input_feeding + self.remove_eos_from_source = remove_eos_from_source + self.append_eos_to_target = append_eos_to_target + self.align_dataset = align_dataset + if self.align_dataset is not None: + assert ( + self.tgt_sizes is not None + ), "Both source and target needed when alignments are provided" + self.constraints = constraints + self.append_bos = append_bos + self.eos = eos if eos is not None else src_dict.eos() + self.src_lang_id = src_lang_id + self.tgt_lang_id = tgt_lang_id + if num_buckets > 0: + from fairseq.data import BucketPadLengthDataset + + self.src = BucketPadLengthDataset( + self.src, + sizes=self.src_sizes, + num_buckets=num_buckets, + pad_idx=self.src_dict.pad(), + left_pad=self.left_pad_source, + ) + self.src_sizes = self.src.sizes + logger.info("bucketing source lengths: {}".format(list(self.src.buckets))) + self.ref = BucketPadLengthDataset( + self.ref, + sizes=self.ref_sizes, + num_buckets=num_buckets, + pad_idx=self.ref_dict.pad(), + left_pad=self.left_pad_source, + ) + self.ref_sizes = self.ref.sizes + logger.info("bucketing reference lengths: {}".format(list(self.src.buckets))) + if self.tgt is not None: + self.tgt = BucketPadLengthDataset( + self.tgt, + sizes=self.tgt_sizes, + num_buckets=num_buckets, + pad_idx=self.tgt_dict.pad(), + left_pad=self.left_pad_target, + ) + self.tgt_sizes = self.tgt.sizes + logger.info( + "bucketing target lengths: {}".format(list(self.tgt.buckets)) + ) + + # determine bucket sizes using self.num_tokens, which will return + # the padded lengths (thanks to BucketPadLengthDataset) + num_tokens = np.vectorize(self.num_tokens, otypes=[np.compat.long]) + self.bucketed_num_tokens = num_tokens(np.arange(len(self.src))) + self.buckets = [ + (None, num_tokens) for num_tokens in np.unique(self.bucketed_num_tokens) + ] + else: + self.buckets = None + self.pad_to_multiple = pad_to_multiple + + def get_batch_shapes(self): + return self.buckets + + def __getitem__(self, index): + tgt_item = self.tgt[index] if self.tgt is not None else None + src_item = self.src[index] + ref_item = self.ref[index] + # Append EOS to end of tgt sentence if it does not have an EOS and remove + # EOS from end of src sentence if it exists. This is useful when we use + # use existing datasets for opposite directions i.e., when we want to + # use tgt_dataset as src_dataset and vice versa + if self.append_eos_to_target: + eos = self.tgt_dict.eos() if self.tgt_dict else self.src_dict.eos() + if self.tgt and self.tgt[index][-1] != eos: + tgt_item = torch.cat([self.tgt[index], torch.LongTensor([eos])]) + + if self.append_bos: + bos = self.tgt_dict.bos() if self.tgt_dict else self.src_dict.bos() + if self.tgt and self.tgt[index][0] != bos: + tgt_item = torch.cat([torch.LongTensor([bos]), self.tgt[index]]) + + bos = self.src_dict.bos() + if self.src[index][0] != bos: + src_item = torch.cat([torch.LongTensor([bos]), self.src[index]]) + if self.ref[index][0] != bos: + ref_item = torch.cat([torch.LongTensor([bos]), self.ref[index]]) + + if self.remove_eos_from_source: + eos = self.src_dict.eos() + if self.src[index][-1] == eos: + src_item = self.src[index][:-1] + if self.ref[index][-1] == eos: + ref_item = self.ref[index][:-1] + + example = { + "id": index, + "source": src_item, + "reference": ref_item, + "target": tgt_item, + } + if self.align_dataset is not None: + example["alignment"] = self.align_dataset[index] + if self.constraints is not None: + example["constraints"] = self.constraints[index] + return example + + def __len__(self): + return len(self.src) + + def collater(self, samples, pad_to_length=None): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + pad_to_length (dict, optional): a dictionary of + {'source': source_pad_to_length, 'target': target_pad_to_length} + to indicate the max length to pad to in source and target respectively. + + Returns: + dict: a mini-batch with the following keys: + + - `id` (LongTensor): example IDs in the original input order + - `ntokens` (int): total number of tokens in the batch + - `net_input` (dict): the input to the Model, containing keys: + + - `src_tokens` (LongTensor): a padded 2D Tensor of tokens in + the source sentence of shape `(bsz, src_len)`. Padding will + appear on the left if *left_pad_source* is ``True``. + - `src_lengths` (LongTensor): 1D Tensor of the unpadded + lengths of each source sentence of shape `(bsz)` + - `prev_output_tokens` (LongTensor): a padded 2D Tensor of + tokens in the target sentence, shifted right by one + position for teacher forcing, of shape `(bsz, tgt_len)`. + This key will not be present if *input_feeding* is + ``False``. Padding will appear on the left if + *left_pad_target* is ``True``. + - `src_lang_id` (LongTensor): a long Tensor which contains source + language IDs of each sample in the batch + + - `target` (LongTensor): a padded 2D Tensor of tokens in the + target sentence of shape `(bsz, tgt_len)`. Padding will appear + on the left if *left_pad_target* is ``True``. + - `tgt_lang_id` (LongTensor): a long Tensor which contains target language + IDs of each sample in the batch + """ + res = collate( + samples, + pad_idx=self.src_dict.pad(), + eos_idx=self.eos, + left_pad_source=self.left_pad_source, + left_pad_target=self.left_pad_target, + input_feeding=self.input_feeding, + pad_to_length=pad_to_length, + pad_to_multiple=self.pad_to_multiple, + ) + if self.src_lang_id is not None or self.tgt_lang_id is not None: + src_tokens = res["net_input"]["src_tokens"] + bsz = src_tokens.size(0) + if self.src_lang_id is not None: + res["net_input"]["src_lang_id"] = ( + torch.LongTensor([[self.src_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + if self.tgt_lang_id is not None: + res["tgt_lang_id"] = ( + torch.LongTensor([[self.tgt_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + return res + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return max( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def num_tokens_vec(self, indices): + """Return the number of tokens for a set of positions defined by indices. + This value is used to enforce ``--max-tokens`` during batching.""" + sizes = self.src_sizes[indices] + if self.tgt_sizes is not None: + sizes = np.maximum(sizes, self.tgt_sizes[indices]) + return sizes + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return ( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + if self.buckets is None: + # sort by target length, then source length + if self.tgt_sizes is not None: + indices = indices[np.argsort(self.tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(self.src_sizes[indices], kind="mergesort")] + else: + # sort by bucketed_num_tokens, which is: + # max(padded_src_len, padded_tgt_len) + return indices[ + np.argsort(self.bucketed_num_tokens[indices], kind="mergesort") + ] + + @property + def supports_prefetch(self): + return getattr(self.src, "supports_prefetch", False) and ( + getattr(self.tgt, "supports_prefetch", False) or self.tgt is None + ) + + def prefetch(self, indices): + self.src.prefetch(indices) + if self.tgt is not None: + self.tgt.prefetch(indices) + if self.align_dataset is not None: + self.align_dataset.prefetch(indices) + + def filter_indices_by_size(self, indices, max_sizes): + """Filter a list of sample indices. Remove those that are longer + than specified in max_sizes. + + Args: + indices (np.array): original array of sample indices + max_sizes (int or list[int] or tuple[int]): max sample size, + can be defined separately for src and tgt (then list or tuple) + + Returns: + np.array: filtered sample array + list: list of removed indices + """ + return data_utils.filter_paired_dataset_indices_by_size( + self.src_sizes, + self.tgt_sizes, + indices, + max_sizes, + ) diff --git a/SpeechLM/speechlm/data/load_langpair_dataset.py b/SpeechLM/speechlm/data/load_langpair_dataset.py new file mode 100644 index 0000000..1622a79 --- /dev/null +++ b/SpeechLM/speechlm/data/load_langpair_dataset.py @@ -0,0 +1,174 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/272c4c5197250997148fb12c0db6306035f166a4/fairseq/tasks/translation.py + 1. Add custom lang_format in function load_langpair_dataset + 2. If truncate_source (default no), use RandomCropDataset instead of TruncateDataset +""" + +import itertools +import logging +import os + +from fairseq.data import ( + AppendTokenDataset, + LanguagePairDataset, + PrependTokenDataset, + StripTokenDataset, + TruncateDataset, + RandomCropDataset, + data_utils, + indexed_dataset, +) + +from speechlm.data.concat_dataset import ConcatDataset + + +EVAL_BLEU_ORDER = 4 + + +logger = logging.getLogger(__name__) + + +def load_langpair_dataset( + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, + lang_format="[{}]", + input_feeding=True, +): + def split_exists(split, src, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}.{}".format(split, src, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, src, tgt)) + elif split_exists(split_k, tgt, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, tgt, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + if truncate_source: + src_dataset = AppendTokenDataset( + RandomCropDataset( + StripTokenDataset(src_dataset, src_dict.eos()), + max_source_positions - 1, + ), + src_dict.eos(), + ) + src_datasets.append(src_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{} {} examples".format( + data_path, split_k, src, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index(lang_format.format(src)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index(lang_format.format(tgt)) + ) + eos = tgt_dict.index(lang_format.format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguagePairDataset( + src_dataset, + src_dataset.sizes, + src_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + input_feeding=input_feeding, + ) diff --git a/SpeechLM/speechlm/data/multimodal_corpus_dataset.py b/SpeechLM/speechlm/data/multimodal_corpus_dataset.py new file mode 100644 index 0000000..3e954a3 --- /dev/null +++ b/SpeechLM/speechlm/data/multimodal_corpus_dataset.py @@ -0,0 +1,370 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +from os import replace +import time +from collections import OrderedDict +from typing import Any, Dict, List, Optional + +import numpy as np +from fairseq.data import data_utils + +from fairseq.data import FairseqDataset + +logger = logging.getLogger(__name__) + + +class MultiCorpusDataset(FairseqDataset): + """ + see fairseq/fairseq/data/multi_corpus_dataset.__doc__ + + Args: + datasets: a OrderedDict of FairseqDataset instances. + distribution: a List containing the probability of getting an utterance from + corresponding dataset + seed: random seed for sampling the datsets + sort_indices: if true, will sort the ordered indices by size + batch_sample: if true, will ensure each batch is from a single dataset + """ + + def __init__( + self, + datasets: Dict[str, FairseqDataset], + max_positions: Dict, + distribution: List[float], + max_tokens_ratio: List[float], + seed: int = 1234, + sort_indices: bool = False, + check_length: bool = False, + ): + super().__init__() + assert isinstance(datasets, OrderedDict) + assert len(datasets) == len(distribution) + # assert sum(distribution) == 1 + self.datasets = datasets + self.distribution = distribution + self.max_tokens_ratio = max_tokens_ratio + self.seed = seed + self.sort_indices = sort_indices + self.max_positions = max_positions + self.check_length = check_length + + # Avoid repeated conversions to list later + self.dataset_list = list(datasets.values()) + self.total_num_instances = 0 + + # first_dataset = self.dataset_list[0] + + self.num_instances_per_dataset = [] + self.dataset_offsets = [] + for i, dataset in enumerate(self.dataset_list): + assert isinstance(dataset, FairseqDataset) + # assert type(dataset) is type(first_dataset) + self.num_instances_per_dataset.append( + 0 if self.distribution[i] == 0 else len(dataset) + ) + self.dataset_offsets.append(self.total_num_instances) + self.total_num_instances += self.num_instances_per_dataset[i] + + def ordered_indices(self): + start = time.time() + with data_utils.numpy_seed(self.seed, self.epoch): + logger.info(f"sampling new dataset with seed {self.seed} epoch {self.epoch}") + sampled_indices = {} + + # For each dataset i, sample self.distribution[i] * self.total_num_instances + for i, key in enumerate(self.datasets): + tp = time.time() + if self.distribution[i] == 0: + # skip dataset if sampling probability is 0 + continue + + if i < len(self.datasets) - 1: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.dataset_offsets[i + 1] + else: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.total_num_instances + + logger.info(f"sampling {num_instances} from {key} dataset") + + # First, add k copies of the dataset where k = num_instances // len(dataset). + # This ensures an equal distribution of the data points as much as possible. + # For the remaining entries randomly sample them + dataset_size = len(self.datasets[key]) + num_copies = num_instances // dataset_size + dataset_indices = np.random.permutation(high - self.dataset_offsets[i])[: num_instances - num_copies * dataset_size] + if num_copies > 0: + dataset_indices = np.concatenate( + ( + np.repeat( + np.arange(high - self.dataset_offsets[i]), num_copies + ), + dataset_indices, + ) + ) + # filter by size, we should ignore it by setting check_length=False + # , as it is very time-consuming on large dadaset + if self.max_positions[key] is not None and self.check_length: + dataset_indices, ignored = self.datasets[key].filter_indices_by_size( + dataset_indices, + self.max_positions[key], + ) + if len(ignored) > 0: + logger.warning( + ( + "{:,} samples have invalid sizes and will be skipped, " + "max_positions={}, first few sample ids={}" + ).format(len(ignored), self.max_positions[key], ignored[:10]) + ) + + if self.sort_indices: + logger.info(" - sampled indices took {}s".format(time.time() - tp)) + tp = time.time() + dataset_indices = np.sort(dataset_indices) + ordered_indices = self.datasets[key].ordered_indices() + if isinstance(ordered_indices[0], np.ndarray): # chunked audio data + dataset_indices = [order_idx + self.dataset_offsets[i] for order_idx in ordered_indices] + assert self.dataset_offsets[i] == 0 + # TODO for chunked audio data, now assume len(dataset_indices) == len(dataset). Don't filter any data. + else: + dataset_indices = ordered_indices[dataset_indices] + self.dataset_offsets[i] + logger.info(" - ordered_indices took {}s".format(time.time() - tp)) + else: + np.random.shuffle(dataset_indices) + + sampled_indices[key] = dataset_indices + + logger.info( + "multi_corpus_dataset ordered_indices took {}s".format( + time.time() - start + ) + ) + return sampled_indices + + def _map_index(self, index: int): + """ + If dataset A has length N and dataset B has length M + then index 1 maps to index 1 of dataset A, and index N + 1 + maps to index 1 of B. + """ + counter = 0 + for num_instances, key in zip(self.num_instances_per_dataset, self.datasets): + if index < counter + num_instances: + return index - counter, key + counter += num_instances + raise ValueError( + "Invalid index: {}, max: {}".format(index, self.total_num_instances) + ) + + def __len__(self): + """ + Length of this dataset is the sum of individual datasets + """ + return self.total_num_instances + + def __getitem__(self, index): + new_index, key = self._map_index(index) + try: + item = self.datasets[key][new_index] + item["full_id"] = index + return item + except Exception as e: + e.args = (f"Error from {key} dataset", *e.args) + raise + + def collater(self, samples): + """ + If we are doing batch sampling, then pick the right collater to use. + + Otherwise we assume all collaters are the same. + """ + if len(samples) == 0: + return None + + samples_dict = {key: [] for key in self.datasets} + for s in samples: + _, key = self._map_index(s["full_id"]) + samples_dict[key].append(s) + + batch = {} + for key in samples_dict: + if len(samples_dict[key]) == 0: + continue + batch[key] = self.datasets[key].collater(samples_dict[key]) + + return batch + + + def num_tokens(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].num_tokens(index) + + def size(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].size(index) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return False + + def set_epoch(self, epoch, **unused): + super().set_epoch(epoch) + logger.info(f"setting epoch of multi_corpus_dataset to {epoch}") + for ds in self.dataset_list: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) + self.epoch = epoch + + @property + def supports_prefetch(self): + return False + + @property + def supports_fetch_outside_dataloader(self): + return all( + self.datasets[key].supports_fetch_outside_dataloader + for key in self.datasets + ) + + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + dataset_indices = indices + batches_dict = {} + for n, key in enumerate(dataset_indices): + max_tokens_ratio = self.max_tokens_ratio[n] + if isinstance(dataset_indices[key][0], np.ndarray): # chunked audio data + cur_batches = self.datasets[key].batch_by_size( + dataset_indices[key], + round(max_tokens * max_tokens_ratio), + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {sum([len(b) for b in cur_batches])} [{len(cur_batches)}] batches for dataset {key}") + else: + cur_batches = super().batch_by_size( + np.array(dataset_indices[key], dtype=np.int64), + round(max_tokens * max_tokens_ratio), + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {len(cur_batches)} batches for dataset {key}") + batches_dict[key] = cur_batches + + return batches_dict + + + def get_batch_sampler( + self, + indices, + num_shards, + seed, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + split_modality_batch=False, + ): + + def batch_sampler(dataset, epoch): + start = time.time() + batches_dict = dataset.batch_by_size( + indices, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + logger.info(f"multi_corpus_dataset, batch_by_size took {time.time() - start}s") + start = time.time() + new_batches = [] + + ### shuffle inner group size, split into speech/text batches + shuffled_batches_list = [] + speech_batches = [] + ### we should specify the speech_batches because: we need concatenate different speech datasets + # (e.g. ltr or km) instead of loading them parellelly. + for name, batches in batches_dict.items(): + if name.startswith("speech"): + if isinstance(batches[0], list): # chunked audio data + batches = self.datasets[name].shuffle_batches(list(batches), seed + epoch) + shuffled_batches_list.append(batches) + else: + batches = inner_bucket_shuffle(batches, seed+epoch, num_shards*10) + batches = batches[: (len(batches) // num_shards) * num_shards] + if len(batches) == 0: + logger.warning(f"Sample 0 batch for {name}, you should ensure that no {name} data provided.") + else: + speech_batches += batches + else: + batches = inner_bucket_shuffle(batches, seed+epoch, num_shards*10) + batches = batches[: (len(batches) // num_shards) * num_shards] + if len(batches) == 0: + logger.warning(f"Sample 0 batch for {name}, you should ensure that no {name} data provided.") + else: + batches = shuffle_buckets(batches, seed=seed+epoch, inner_shuf=False) + shuffled_batches_list.append(batches) + if len(speech_batches) > 0: + speech_batches = shuffle_buckets(speech_batches, seed=seed+epoch, inner_shuf=False) + shuffled_batches_list.append(speech_batches) + + ### create the final new_batches + num_batch = min(len(batches) for batches in shuffled_batches_list) + if split_modality_batch: + for i in range(0, num_batch, num_shards): + for batches in shuffled_batches_list: + new_batches += batches[i: i + num_shards] + else: + for i in range(num_batch): + new_batches.append(np.concatenate([batches[i] for batches in shuffled_batches_list])) + + logger.info(f"multi_corpus_dataset sample {len(new_batches)} batches, took {time.time() - start}s") + return new_batches + + def inner_bucket_shuffle(batches, seed, bucket_size=10, thr=0): + """we assert batches is sorted form long to short. + shuffle samples in a buctet(e.g. 10 batches). + batches: a list of numpy array""" + num_batch = len(batches) + new_batches = [] + num_buckets = len(batches) // bucket_size + i = 0 + while i < num_batch: + if (i < bucket_size * thr or + i >= bucket_size * (num_buckets - thr) + ): + new_batches.append(batches[i]) + i += 1 + else: + group = np.concatenate(batches[i: i+bucket_size]) + with data_utils.numpy_seed(seed): + np.random.shuffle(group) + new_batches += np.array_split(group, bucket_size) + i += bucket_size + assert all([len(batch) > 0 for batch in new_batches]) + return new_batches + + def shuffle_buckets(batches, seed, inner_shuf=True): + if inner_shuf: + batches = inner_bucket_shuffle(batches, seed, num_shards*10) + batches = [batches[i: i + num_shards] for i in range(0, len(batches)-num_shards+1, num_shards)] + assert len(batches[-1]) == num_shards + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for group in batches: + new_batches += group + return new_batches + + return batch_sampler diff --git a/SpeechLM/speechlm/data/text_to_unit_dataset.py b/SpeechLM/speechlm/data/text_to_unit_dataset.py new file mode 100644 index 0000000..f7671d0 --- /dev/null +++ b/SpeechLM/speechlm/data/text_to_unit_dataset.py @@ -0,0 +1,293 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +from pathlib import Path +from typing import List, Dict, Optional, Any +from dataclasses import dataclass + +import numpy as np +import torch + +from fairseq.data.audio.speech_to_text_dataset import ( + SpeechToTextDataset, + SpeechToTextDatasetCreator, + S2TDataConfig, + _collate_frames, + get_features_or_waveform, +) +from fairseq.data import Dictionary, data_utils as fairseq_data_utils + + +@dataclass +class TextToUnitDatasetItem(object): + index: int + source: torch.Tensor + target: Optional[torch.Tensor] = None + speaker_id: Optional[int] = None + speaker_emb: Optional[torch.Tensor] = None + duration: Optional[torch.Tensor] = None + pitch: Optional[torch.Tensor] = None + energy: Optional[torch.Tensor] = None + + +class Text2UnitDataset(SpeechToTextDataset): + def __init__( + self, + split: str, + is_train_split: bool, + cfg: S2TDataConfig, + unit_labels: List[str], + n_frames: List[int], + src_texts: Optional[List[str]] = None, + tgt_texts: Optional[List[str]] = None, + speakers: Optional[List[str]] = None, + src_langs: Optional[List[str]] = None, + tgt_langs: Optional[List[str]] = None, + ids: Optional[List[str]] = None, + tgt_dict: Optional[Dictionary] = None, + pre_tokenizer=None, + bpe_tokenizer=None, + n_frames_per_step=1, + speaker_to_id=None, + durations: Optional[List[List[int]]] = None, + pitches: Optional[List[str]] = None, + energies: Optional[List[str]] = None, + ): + super(Text2UnitDataset, self).__init__( + split, + is_train_split, + cfg, + unit_labels, + n_frames, + src_texts=src_texts, + tgt_texts=tgt_texts, + speakers=speakers, + src_langs=src_langs, + tgt_langs=tgt_langs, + ids=ids, + tgt_dict=tgt_dict, + pre_tokenizer=pre_tokenizer, + bpe_tokenizer=bpe_tokenizer, + n_frames_per_step=n_frames_per_step, + speaker_to_id=speaker_to_id, + ) + self.durations = durations + self.pitches = pitches + self.energies = energies + self.unit_labels = unit_labels + self.feature_root = Path(cfg.audio_root) + self.spk_emb_type = cfg.config.get("speaker_embedding_type", None) + self.random_spk = cfg.config.get("random_speaker", False) + if self.spk_emb_type is not None: + self.spk_emb_choices = [i for i in (self.feature_root / self.spk_emb_type).glob("*.npy")] + self.spk_emb_num = len(self.spk_emb_choices) + + def __getitem__(self, index: int) -> TextToUnitDatasetItem: + # s2t_item = super().__getitem__(index) + source = torch.LongTensor(self.unit_labels[index]) + target = None + if self.tgt_texts is not None: + tokenized = self.get_tokenized_tgt_text(index) + target = self.tgt_dict.encode_line( + tokenized, add_if_not_exist=False, append_eos=self.append_eos + ).long() + if self.cfg.prepend_tgt_lang_tag: + lang_tag_idx = self.get_lang_tag_idx( + self.tgt_langs[index], self.tgt_dict + ) + target = torch.cat((torch.LongTensor([lang_tag_idx]), target), 0) + + speaker_id = None + if self.speaker_to_id is not None: + speaker_id = self.speaker_to_id[self.speakers[index]] + + speaker_emb = None + if self.spk_emb_type is not None: + if self.random_spk: + spk_emb_path = self.spk_emb_choices[np.random.choice(self.spk_emb_num)] + else: + spk_emb_path = self.feature_root / self.spk_emb_type / f"{self.ids[index]}.npy" + speaker_emb = get_features_or_waveform(spk_emb_path) + speaker_emb = torch.from_numpy(speaker_emb).float() + + duration, pitch, energy = None, None, None + if self.durations is not None: + duration = torch.tensor( + self.durations[index] + [0], dtype=torch.long # pad 0 for EOS + ) + if self.pitches is not None: + pitch = get_features_or_waveform(self.pitches[index]) + pitch = torch.from_numpy( + np.concatenate((pitch, [0])) # pad 0 for EOS + ).float() + if self.energies is not None: + energy = get_features_or_waveform(self.energies[index]) + energy = torch.from_numpy( + np.concatenate((energy, [0])) # pad 0 for EOS + ).float() + return TextToUnitDatasetItem( + index=index, + source=source, + target=target, + speaker_id=speaker_id, + speaker_emb=speaker_emb, + duration=duration, + pitch=pitch, + energy=energy, + ) + + def collater(self, samples: List[TextToUnitDatasetItem]) -> Dict[str, Any]: + if len(samples) == 0: + return {} + + src_lengths, order = torch.tensor( + [s.target.shape[0] for s in samples], dtype=torch.long + ).sort(descending=True) + id_ = torch.tensor([s.index for s in samples], dtype=torch.long).index_select( + 0, order + ) + traget = fairseq_data_utils.collate_tokens( + [s.source for s in samples], + self.tgt_dict.pad(), + ).index_select(0, order) + + target_lengths = torch.tensor( + [s.source.shape[0] for s in samples], dtype=torch.long + ).index_select(0, order) + + src_tokens = fairseq_data_utils.collate_tokens( + [s.target for s in samples], + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=False, + ).index_select(0, order) + + speaker = None + if self.speaker_to_id is not None: + speaker = ( + torch.tensor([s.speaker_id for s in samples], dtype=torch.long) + .index_select(0, order) + .view(-1, 1) + ) + if self.spk_emb_type is not None: + speaker = torch.stack([s.speaker_emb for s in samples], dim=0).index_select(0, order) + + bsz, _ = traget.size() + prev_output_tokens = torch.cat( + (traget.new_zeros((bsz, self.tgt_dict.bos())), traget[:, :-1]), dim=1 + ) + + durations, pitches, energies = None, None, None + if self.durations is not None: + durations = fairseq_data_utils.collate_tokens( + [s.duration for s in samples], 0 + ).index_select(0, order) + assert src_tokens.shape[1] == durations.shape[1] + if self.pitches is not None: + pitches = _collate_frames([s.pitch for s in samples], True) + pitches = pitches.index_select(0, order) + assert src_tokens.shape[1] == pitches.shape[1] + if self.energies is not None: + energies = _collate_frames([s.energy for s in samples], True) + energies = energies.index_select(0, order) + assert src_tokens.shape[1] == energies.shape[1] + src_texts = [self.tgt_dict.string(samples[i].target) for i in order] + + return { + "id": id_, + "net_input": { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + "prev_output_tokens": prev_output_tokens, + }, + "speaker": speaker, + "target": traget, + "durations": durations, + "pitches": pitches, + "energies": energies, + "target_lengths": target_lengths, + "ntokens": sum(target_lengths).item(), + "nsentences": len(samples), + "src_texts": src_texts, + } + + +class Text2UnitDatasetCreator(SpeechToTextDatasetCreator): + KEY_DURATION = "duration" + KEY_PITCH = "pitch" + KEY_ENERGY = "energy" + KEY_UNIT = "unit" + + @classmethod + def _from_list( + cls, + split_name: str, + is_train_split, + samples: List[Dict], + cfg: S2TDataConfig, + tgt_dict, + pre_tokenizer, + bpe_tokenizer, + n_frames_per_step, + speaker_to_id, + ) -> Text2UnitDataset: + audio_root = Path(cfg.audio_root) + ids = [s[cls.KEY_ID] for s in samples] + # audio_paths = [(audio_root / s[cls.KEY_AUDIO]).as_posix() for s in samples] + unit_labels = [s[cls.KEY_UNIT] for s in samples] + unit_labels = [ + None if dd is None else [int(d) for d in dd.split(" ")] for dd in unit_labels + ] + n_frames = [int(s[cls.KEY_N_FRAMES]) for s in samples] + tgt_texts = [s[cls.KEY_TGT_TEXT] for s in samples] + src_texts = [s.get(cls.KEY_SRC_TEXT, cls.DEFAULT_SRC_TEXT) for s in samples] + speakers = [s.get(cls.KEY_SPEAKER, cls.DEFAULT_SPEAKER) for s in samples] + src_langs = [s.get(cls.KEY_SRC_LANG, cls.DEFAULT_LANG) for s in samples] + tgt_langs = [s.get(cls.KEY_TGT_LANG, cls.DEFAULT_LANG) for s in samples] + + durations = [s.get(cls.KEY_DURATION, None) for s in samples] + durations = [ + None if dd is None else [int(d) for d in dd.split(" ")] for dd in durations + ] + durations = None if any(dd is None for dd in durations) else durations + + pitches = [s.get(cls.KEY_PITCH, None) for s in samples] + pitches = [ + None if pp is None else (audio_root / pp).as_posix() for pp in pitches + ] + pitches = None if any(pp is None for pp in pitches) else pitches + + energies = [s.get(cls.KEY_ENERGY, None) for s in samples] + energies = [ + None if ee is None else (audio_root / ee).as_posix() for ee in energies + ] + energies = None if any(ee is None for ee in energies) else energies + + return Text2UnitDataset( + split_name, + is_train_split, + cfg, + unit_labels, + n_frames, + src_texts, + tgt_texts, + speakers, + src_langs, + tgt_langs, + ids, + tgt_dict, + pre_tokenizer, + bpe_tokenizer, + n_frames_per_step, + speaker_to_id, + durations, + pitches, + energies, + ) diff --git a/SpeechLM/speechlm/data_process/covost2/mp3_to_wav.py b/SpeechLM/speechlm/data_process/covost2/mp3_to_wav.py new file mode 100644 index 0000000..7d80568 --- /dev/null +++ b/SpeechLM/speechlm/data_process/covost2/mp3_to_wav.py @@ -0,0 +1,42 @@ +import argparse +from tqdm import tqdm +from pydub import AudioSegment +import torchaudio +import os + +def mp3_convert_wav(mp3_file, wav_file): + try: + sound = AudioSegment.from_mp3(mp3_file) + sound=sound.set_frame_rate(16000) + sound=sound.set_channels(1) + sound=sound.set_sample_width(2) + sound.export(wav_file, format="wav") + except Exception as e: + print(e) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--input", "-i", required=True, type=str) + parser.add_argument("--shard", "-n", required=True, type=int) + parser.add_argument("--rank", "-r", required=True, type=int) + args = parser.parse_args() + + assert args.rank < args.shard, f"rank: {args.rank} >= shard: {args.shard}" + + with open(args.input, 'r') as f: + files = [line.strip() for line in f ] + + mp3_files = files[args.rank::args.shard] + for mp3_file in tqdm(mp3_files): + wav_file = mp3_file.replace("/clips/", "/wav/").replace(".mp3", ".wav") + if os.path.exists(wav_file): + try: + torchaudio.info(wav_file) + except Exception as e: + print(e) + mp3_convert_wav(mp3_file, wav_file) + else: + mp3_convert_wav(mp3_file, wav_file) + +if __name__ == "__main__": + main() diff --git a/SpeechLM/speechlm/data_process/covost2/prepare_covost_data.py b/SpeechLM/speechlm/data_process/covost2/prepare_covost_data.py new file mode 100644 index 0000000..687bc9f --- /dev/null +++ b/SpeechLM/speechlm/data_process/covost2/prepare_covost_data.py @@ -0,0 +1,295 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- +""" +Modified from: https://github.com/facebookresearch/fairseq/blob/272c4c5197250997148fb12c0db6306035f166a4/examples/speech_to_text/prep_covost_data.py +1. normalize the punctuation +2. instead of extract fbank features, we direcly use 16k-Hz waveform +""" +import argparse +import logging +from pathlib import Path +from tempfile import NamedTemporaryFile +from typing import Optional, Tuple + +import pandas as pd +import torchaudio +from examples.speech_to_text.data_utils import ( + filter_manifest_df, + gen_config_yaml, + gen_vocab, + load_df_from_tsv, + save_df_to_tsv, +) +from torch import Tensor +from torch.utils.data import Dataset +from torchaudio.datasets.utils import download_url, extract_archive +from tqdm import tqdm +from pydub import AudioSegment +import soundfile as sf +import sacremoses + +log = logging.getLogger(__name__) + + +MANIFEST_COLUMNS = ["id", "audio", "n_frames", "tgt_text"] + + +def mp3_convert_wav(mp3_file, wav_file): + sound = AudioSegment.from_mp3(mp3_file) + sound=sound.set_frame_rate(16000) + sound=sound.set_channels(1) + sound=sound.set_sample_width(2) + sound.export(wav_file, format="wav") + +class CoVoST(Dataset): + """Create a Dataset for CoVoST (https://github.com/facebookresearch/covost). + + Args: + root (str): root path to the dataset and generated manifests/features + source_language (str): source (audio) language + target_language (str, optional): target (text) language, + None for no translation (default: None) + version (int, optional): CoVoST version. (default: 2) + download (bool, optional): Whether to download the dataset if it is not + found at root path. (default: ``False``). + """ + + COVOST_URL_TEMPLATE = ( + "https://dl.fbaipublicfiles.com/covost/" + "covost_v2.{src_lang}_{tgt_lang}.tsv.tar.gz" + ) + + VERSIONS = {2} + SPLITS = ["train", "dev", "test"] + + XX_EN_LANGUAGES = { + 1: ["fr", "de", "nl", "ru", "es", "it", "tr", "fa", "sv-SE", "mn", "zh-CN"], + 2: [ + "fr", + "de", + "es", + "ca", + "it", + "ru", + "zh-CN", + "pt", + "fa", + "et", + "mn", + "nl", + "tr", + "ar", + "sv-SE", + "lv", + "sl", + "ta", + "ja", + "id", + "cy", + ], + } + EN_XX_LANGUAGES = { + 1: [], + 2: [ + "de", + "tr", + "fa", + "sv-SE", + "mn", + "zh-CN", + "cy", + "ca", + "sl", + "et", + "id", + "ar", + "ta", + "lv", + "ja", + ], + } + + def __init__( + self, + root: str, + split: str, + source_language: str, + target_language: Optional[str] = None, + version: int = 2, + ) -> None: + assert version in self.VERSIONS and split in self.SPLITS + assert source_language is not None + self.no_translation = target_language is None + if not self.no_translation: + assert "en" in {source_language, target_language} + if source_language == "en": + assert target_language in self.EN_XX_LANGUAGES[version] + else: + assert source_language in self.XX_EN_LANGUAGES[version] + else: + # Hack here so that we can get "split" column from CoVoST TSV. + # Note that we use CoVoST train split for ASR which is an extension + # to Common Voice train split. + target_language = "de" if source_language == "en" else "en" + + self.root: Path = Path(root) + + cv_tsv_path = self.root / "validated.tsv" + assert cv_tsv_path.is_file() + + covost_url = self.COVOST_URL_TEMPLATE.format( + src_lang=source_language, tgt_lang=target_language + ) + covost_archive = self.root / Path(covost_url).name + if not covost_archive.is_file(): + download_url(covost_url, self.root.as_posix(), hash_value=None) + extract_archive(covost_archive.as_posix()) + + cv_tsv = load_df_from_tsv(cv_tsv_path) + covost_tsv = load_df_from_tsv( + self.root / Path(covost_url).name.replace(".tar.gz", "") + ) + df = pd.merge( + left=cv_tsv[["path", "sentence", "client_id"]], + right=covost_tsv[["path", "translation", "split"]], + how="inner", + on="path", + ) + if split == "train": + df = df[(df["split"] == split) | (df["split"] == f"{split}_covost")] + else: + df = df[df["split"] == split] + data = df.to_dict(orient="index").items() + data = [v for k, v in sorted(data, key=lambda x: x[0])] + self.data = [] + for e in data: + try: + path = self.root / "clips" / e["path"] + _ = torchaudio.info(path.as_posix()) + self.data.append(e) + except RuntimeError: + pass + + self.normalizer = sacremoses.MosesPunctNormalizer( + lang=target_language, + pre_replace_unicode_punct=True, + post_remove_control_chars=True, + ) + + def __getitem__( + self, n: int + ) -> Tuple[Tensor, int, str, str, Optional[str], str, str]: + """Load the n-th sample from the dataset. + + Args: + n (int): The index of the sample to be loaded + + Returns: + tuple: ``(waveform, sample_rate, sentence, translation, speaker_id, + sample_id)`` + """ + data = self.data[n] + path = self.root / "clips" / data["path"] + # waveform, sample_rate = torchaudio.load(path) + sentence = data["sentence"] + translation = None if self.no_translation else data["translation"] + translation = self.normalizer.normalize(translation) + speaker_id = data["client_id"] + _id = data["path"].replace(".mp3", "") + return path, -1, sentence, translation, speaker_id, _id + + def __len__(self) -> int: + return len(self.data) + + +def process(args): + root = Path(args.data_root).absolute() / args.src_lang + outroot = root / f"{args.src_lang}-{args.tgt_lang}" + if args.vocab_type != "char": + outroot = root / f"{args.src_lang}-{args.tgt_lang}-{args.vocab_type}" + if not root.is_dir(): + raise NotADirectoryError(f"{root} does not exist") + #1. Extract featuress + # mp3-to-wav can take long long time, better run it externally with multi threads. + feature_root = root / "wav" + # feature_root.mkdir(exist_ok=True) + # for split in CoVoST.SPLITS: + # print(f"Fetching split {split}...") + # dataset = CoVoST(root, split, args.src_lang, args.tgt_lang) + # print("Converting mp3 to wav...") + # handle = open(root / f"{split}.id", "w") + # for waveform, _, _, _, _, utt_id in tqdm(dataset): + # wav_file = feature_root / f"{utt_id}.wav" + # print(waveform, file=handle) + # mp3_convert_wav(waveform, wav_file) + + #2. Generate TSV manifest + print("Generating manifest...") + train_text = [] + task = f"asr_{args.src_lang}" + if args.tgt_lang is not None: + task = f"st_{args.src_lang}_{args.tgt_lang}" + for split in CoVoST.SPLITS: + manifest = {c: [] for c in MANIFEST_COLUMNS} + dataset = CoVoST(root, split, args.src_lang, args.tgt_lang) + for waveform, _, src_utt, tgt_utt, speaker_id, utt_id in tqdm(dataset): + wav_file = feature_root / f"{utt_id}.wav" + manifest["id"].append(utt_id) + manifest["audio"].append(wav_file.as_posix().replace("/data/", "/mnt/default/")) + manifest["n_frames"].append(sf.info(wav_file).frames) + manifest["tgt_text"].append(src_utt if args.tgt_lang is None else tgt_utt) + is_train_split = split.startswith("train") + if is_train_split: + train_text.extend(manifest["tgt_text"]) + df = pd.DataFrame.from_dict(manifest) + df = filter_manifest_df(df, is_train_split=is_train_split, min_n_frames=320, max_n_frames=480000) + save_df_to_tsv(df, outroot / f"{split}_{task}.tsv") + # Generate vocab + vocab_size_str = "" if args.vocab_type == "char" else str(args.vocab_size) + spm_filename_prefix = f"spm_{args.vocab_type}{vocab_size_str}_{task}" + with NamedTemporaryFile(mode="w") as f: + for t in train_text: + f.write(t + "\n") + gen_vocab( + Path(f.name), + outroot / spm_filename_prefix, + args.vocab_type, + args.vocab_size + ) + # Generate config YAML + # gen_config_yaml( + # outroot, + # spm_filename=spm_filename_prefix + ".model", + # yaml_filename=f"config_{task}.yaml", + # specaugment_policy="lb", + # ) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--data-root", "-d", required=True, type=str, + help="data root with sub-folders for each language /" + ) + parser.add_argument( + "--vocab-type", + default="unigram", + required=True, + type=str, + choices=["bpe", "unigram", "char"], + ), + parser.add_argument("--vocab-size", default=1000, type=int) + parser.add_argument("--src-lang", "-s", required=True, type=str) + parser.add_argument("--tgt-lang", "-t", type=str) + args = parser.parse_args() + + process(args) + + +if __name__ == "__main__": + main() diff --git a/SpeechLM/speechlm/data_process/filter_paireddata_by_len.py b/SpeechLM/speechlm/data_process/filter_paireddata_by_len.py new file mode 100644 index 0000000..ce09af3 --- /dev/null +++ b/SpeechLM/speechlm/data_process/filter_paireddata_by_len.py @@ -0,0 +1,48 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import os +import argparse +from tqdm import tqdm +import numpy as np + + +lg_label = "__label__{}" + +def writefile(filename, lines): + with open(filename, 'w', encoding='utf-8') as f: + f.writelines(lines) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--input", "-i", required=True, type=str) + parser.add_argument("--output", "-o", required=True, type=str) + parser.add_argument("--src", "-s", required=True, type=str) + parser.add_argument("--tgt", "-t", required=True, type=str) + parser.add_argument("--max-len", "-m", default=2998, type=int) + args = parser.parse_args() + + src_lines, tgt_lines = [], [] + with open(f"{args.input}.{args.src}", 'r') as f1, open(f"{args.input}.{args.tgt}", 'r') as f2: + for src_line, tgt_line in tqdm(zip(f1, f2)): + src_len = len(src_line.strip().split()) + tgt_len = len(tgt_line.strip().split()) + if src_len < args.max_len and src_len > 0 and tgt_len < args.max_len and tgt_len > 0: + src_lines.append(src_line) + tgt_lines.append(tgt_line) + + writefile(f"{args.output}.{args.src}", src_lines) + writefile(f"{args.output}.{args.tgt}", tgt_lines) + +if __name__ == "__main__": + main() + + + diff --git a/SpeechLM/speechlm/data_process/get_t2u_manifest.py b/SpeechLM/speechlm/data_process/get_t2u_manifest.py new file mode 100644 index 0000000..f60b34a --- /dev/null +++ b/SpeechLM/speechlm/data_process/get_t2u_manifest.py @@ -0,0 +1,119 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import argparse +import logging +from pathlib import Path +from collections import defaultdict + +import pandas as pd +import torchaudio +from tqdm import tqdm +import numpy as np +import torch + +from fairseq.data.audio.audio_utils import convert_waveform +from examples.speech_to_text.data_utils import save_df_to_tsv +from examples.speech_synthesis.data_utils import extract_pitch + + +log = logging.getLogger(__name__) + +def get_duration(fa_phone): + """fa_phone: force-aligned phone, 1-D numpy""" + same = np.concatenate(([True], fa_phone[:-1] != fa_phone[1:], [True])) + index = np.where(same)[0] + count = np.diff(index) + return count + + + +def process(args): + # assert "train" in args.splits + out_root = Path(args.output_root).absolute() + out_root.mkdir(exist_ok=True) + + print("Fetching data...") + audio_manifest_root = Path(args.audio_manifest_root).absolute() + for s in args.splits: + if args.add_pitch: + pitch_root = out_root / "pitch" / s + pitch_root.mkdir(exist_ok=True) + manifest = defaultdict(list) + with open(audio_manifest_root / f"{s}.audio.tsv") as f1, \ + open(audio_manifest_root / f"{s}.phn") as f2, \ + open(audio_manifest_root / f"{s}.km") as f3: + audio_root = f1.readline().strip() + audio_root = Path(audio_root) + for audio_path, fa_phone, fa_unit in tqdm(zip(f1, f2, f3)): + record = True + audio_path, n_frames = audio_path.strip().split("\t") + fa_phone = fa_phone.strip().split() + fa_unit = fa_unit.strip() + uttid = audio_path.split("/")[-1].split(".")[0] + speaker = uttid.split("-")[0] + + if args.add_duration: + assert len(fa_phone) == len(fa_unit.split()) + fa_phone = np.array(list(map(int, fa_phone))) + duration = get_duration(fa_phone) + reduced_phone = torch.LongTensor(fa_phone).unique_consecutive().numpy() + if args.add_pitch: + pitch_path = pitch_root / f"{uttid}.npy" + if not pitch_path.is_file(): + waveform, sample_rate = torchaudio.load(audio_root / audio_path) + waveform, sample_rate = convert_waveform( + waveform, sample_rate, normalize_volume=args.normalize_volume, + ) + pitch = extract_pitch( + waveform, sample_rate, None, + hop_length=args.hop_length, log_scale=True, + phoneme_durations=duration + ) + if pitch is not None: + np.save(pitch_path.as_posix(), pitch) + else: + record = False + else: + reduced_phone = fa_phone + + if record: + manifest["id"].append(uttid) + manifest["speaker"].append(speaker) + manifest["n_frames"].append(len(fa_unit.split())) + manifest["tgt_text"].append(" ".join(map(str, reduced_phone))) + manifest["unit"].append(fa_unit) + if args.add_duration: + manifest["duration"].append(" ".join(map(str, duration))) + if args.add_pitch: + manifest["pitch"].append(f"pitch/{s}/{uttid}.npy") + save_df_to_tsv( + pd.DataFrame.from_dict(manifest), + out_root / f"{s}.tsv" + ) + + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--audio-manifest-root", "-m", type=str) + parser.add_argument("--output-root", "-o", required=True, type=str) + parser.add_argument("--splits", "-s", type=str, nargs="+", + default=["train", "dev", "test"]) + parser.add_argument("--normalize-volume", "-n", action="store_true") + parser.add_argument("--hop-length", type=int, default=256) + parser.add_argument("--add-duration", action="store_true") + parser.add_argument("--add-pitch", action="store_true") + args = parser.parse_args() + + process(args) + + +if __name__ == "__main__": + main() diff --git a/SpeechLM/speechlm/data_process/get_t2u_manifest_textonly.py b/SpeechLM/speechlm/data_process/get_t2u_manifest_textonly.py new file mode 100644 index 0000000..b332ecc --- /dev/null +++ b/SpeechLM/speechlm/data_process/get_t2u_manifest_textonly.py @@ -0,0 +1,67 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import argparse +import logging +from pathlib import Path +from collections import defaultdict + +import pandas as pd +from tqdm import tqdm +import numpy as np +from examples.speech_to_text.data_utils import save_df_to_tsv + + +log = logging.getLogger(__name__) + +def get_duration(fa_phone): + """fa_phone: force-aligned phone, 1-D numpy""" + same = np.concatenate(([True], fa_phone[:-1] != fa_phone[1:], [True])) + index = np.where(same)[0] + count = np.diff(index) + return count + +def process(args): + # assert "train" in args.splits + out_root = Path(args.output_root).absolute() + out_root.mkdir(exist_ok=True) + + print("Fetching data...") + audio_manifest_root = Path(args.audio_manifest_root).absolute() + for s in args.splits: + manifest = defaultdict(list) + with open(audio_manifest_root / f"{s}.phn") as f1: + for i, reduced_phone in tqdm(enumerate(f1)): + reduced_phone = reduced_phone.strip() + uttid = f"librilm-{i}" + speaker = uttid.split("-")[0] + + manifest["id"].append(uttid) + manifest["speaker"].append(speaker) + manifest["n_frames"].append(len(reduced_phone)) + manifest["tgt_text"].append(reduced_phone) + manifest["unit"].append(0) + save_df_to_tsv( + pd.DataFrame.from_dict(manifest), + out_root / f"{s}.tsv" + ) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--audio-manifest-root", "-m", type=str) + parser.add_argument("--output-root", "-o", required=True, type=str) + parser.add_argument("--splits", "-s", type=str, nargs="+", + default=["train", "dev", "test"]) + parser.add_argument("--add-fastspeech-targets", action="store_true") + args = parser.parse_args() + + process(args) + +if __name__ == "__main__": + main() diff --git a/SpeechLM/speechlm/data_process/phoneize_with_sil.py b/SpeechLM/speechlm/data_process/phoneize_with_sil.py new file mode 100644 index 0000000..6fcdd6c --- /dev/null +++ b/SpeechLM/speechlm/data_process/phoneize_with_sil.py @@ -0,0 +1,132 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +""" +Modified from https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4/examples/wav2vec/unsupervised/scripts/phonemize_with_sil.py +""" + +import argparse +import numpy as np +import sys +from g2p_en import G2p +from tqdm import tqdm +import logging +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=logging.INFO, +) +logger = logging.getLogger(__name__) + +def get_parser(): + parser = argparse.ArgumentParser( + description="converts words to phones adding optional silences around in between words" + ) + parser.add_argument( + "--sil-prob", + "-s", + type=float, + default=0, + help="probability of inserting silence between each word", + ) + parser.add_argument( + "--surround", + action="store_true", + help="if set, surrounds each example with silence", + ) + parser.add_argument( + "--lexicon", + help="lexicon to convert to phones", + required=True, + ) + parser.add_argument( + "--strict", + action="store_true", + help="if set, OOV words will raise a error (for train/valid set)", + ) + parser.add_argument( + "--input", + "-i", + help="input text file", + required=True, + ) + parser.add_argument( + "--output", + "-o", + help="input text file", + required=True, + ) + + + return parser + + +def normalize_phn(phons): + """ + convert g2p style phone to 39-phone set + """ + return [p.rstrip('0123456789') for p in phons] + + +def main(): + parser = get_parser() + args = parser.parse_args() + + sil_prob = args.sil_prob + surround = args.surround + sil = "" + + wrd_to_phn = {} + g2p = G2p() + + with open(args.lexicon, "r") as lf: + for line in lf: + items = line.rstrip().split() + assert len(items) > 1, line + assert items[0] not in wrd_to_phn, items + wrd_to_phn[items[0]] = items[1:] + + with open(args.input, "r") as fin, open(args.output, "w", encoding="utf-8") as fout: + for line in tqdm(fin): + words = line.strip().upper().split() + + if not all(w in wrd_to_phn for w in words): + if args.strict: + # logger.warning(f"| Warning: OOV words found: {line}") + pass + else: + continue + + phones = [] + if surround: + phones.append(sil) + + sample_sil_probs = None + if sil_prob > 0 and len(words) > 1: + sample_sil_probs = np.random.random(len(words) - 1) + + for i, w in enumerate(words): + if w in wrd_to_phn: + phones.extend(wrd_to_phn[w]) + else: + phones.extend(normalize_phn(g2p(w))) + if ( + sample_sil_probs is not None + and i < len(sample_sil_probs) + and sample_sil_probs[i] < sil_prob + ): + phones.append(sil) + + if surround: + phones.append(sil) + print(" ".join(phones), file=fout) + + +if __name__ == "__main__": + main() diff --git a/SpeechLM/speechlm/data_process/phoneme_tokenizer/ltr2kaldi_phn_sil025.py b/SpeechLM/speechlm/data_process/phoneme_tokenizer/ltr2kaldi_phn_sil025.py new file mode 100644 index 0000000..014d0a2 --- /dev/null +++ b/SpeechLM/speechlm/data_process/phoneme_tokenizer/ltr2kaldi_phn_sil025.py @@ -0,0 +1,77 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import os +import tqdm +import argparse +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument("--input", "-i", required=True, type=str) +parser.add_argument("--output", "-o", required=True, type=str) +parser.add_argument("--lexicon", default='align_lexicon.txt', type=str) +args = parser.parse_args() + +sil_prob = 0.25 + +if not os.path.exists(args.lexicon): + print(f"| Warning: lexicon {args.lexicon} not found, downloading ...") + try: + os.system(f"wget --no-check-certificate 'https://drive.google.com/uc?export=download&id=1QVeyCpLXLnujBUAickpo-jaSVY-vKLnT' -O {args.lexicon}") + except Exception as e: + print(e) + print(f"| Error downloading {args.lexicon}, please download it from https://drive.google.com/file/d/1QVeyCpLXLnujBUAickpo-jaSVY-vKLnT/view?usp=sharing") + exit(1) +dict = {} +f = open(args.lexicon) +for l in f: + dict[l.split()[0]] = l.split()[2:] + assert l.split()[0] == l.split()[1] + +f = open(args.input, 'r') +w_f = open(f'{args.output}.kaldi_phn_sil025', 'w') +w_oov = open(f'{args.output}.kaldi_phn_sil025.oov', 'w') + +oov_nums = 0 +total_nums = 0 +for l in tqdm.tqdm(f): + words = l.strip().replace(" ", "").split("|") + # words = l.strip().upper().split() + words = [w for w in words if w != ''] + + phones = [] + phones.extend(dict['!SIL']) + + sample_sil_probs = None + if sil_prob > 0 and len(words) > 1: + sample_sil_probs = np.random.random(len(words) - 1) + + for i, w in enumerate(words): + total_nums += 1 + if w not in dict: + w = '' + oov_nums += 1 + w_oov.write(w + '\n') + + phones.extend(dict[w]) + + if ( + sample_sil_probs is not None + and i < len(sample_sil_probs) + and sample_sil_probs[i] < sil_prob + ): + phones.extend(dict['!SIL']) + + phones.extend(dict['!SIL']) + w_f.write(' '.join(phones) + '\n') +w_oov.write(f'{oov_nums}\n') +print(f"OOV rate: {oov_nums}/{total_nums}") + +# !!! After processing, use this comand to adjust the SIL +### sed -i 's/SIL_S/SIL/g' your_file diff --git a/SpeechLM/speechlm/data_process/phoneme_tokenizer/mean5_and_std25_sil14_spn32.dict b/SpeechLM/speechlm/data_process/phoneme_tokenizer/mean5_and_std25_sil14_spn32.dict new file mode 100644 index 0000000..b1957be --- /dev/null +++ b/SpeechLM/speechlm/data_process/phoneme_tokenizer/mean5_and_std25_sil14_spn32.dict @@ -0,0 +1 @@ +{"SIL": [14, 7], "AE1_I": [5, 2.5], "P_I": [5, 2.5], "T_I": [5, 2.5], "ER0_E": [5, 2.5], "W_B": [5, 2.5], "AH1_I": [5, 2.5], "N_E": [5, 2.5], "M_B": [5, 2.5], "IH1_I": [5, 2.5], "S_I": [5, 2.5], "IH0_I": [5, 2.5], "Z_E": [5, 2.5], "R_B": [5, 2.5], "EY1_I": [5, 2.5], "CH_I": [5, 2.5], "AH0_I": [5, 2.5], "L_E": [5, 2.5], "L_B": [5, 2.5], "N_I": [5, 2.5], "D_E": [5, 2.5], "IH0_B": [5, 2.5], "S_B": [5, 2.5], "R_I": [5, 2.5], "AY1_I": [5, 2.5], "Z_I": [5, 2.5], "V_I": [5, 2.5], "JH_B": [5, 2.5], "T_E": [5, 2.5], "EH1_I": [5, 2.5], "R_E": [5, 2.5], "DH_B": [5, 2.5], "IY0_E": [5, 2.5], "AE1_B": [5, 2.5], "L_I": [5, 2.5], "IY2_E": [5, 2.5], "OW1_I": [5, 2.5], "D_B": [5, 2.5], "AW1_I": [5, 2.5], "UW1_E": [5, 2.5], "AH0_S": [5, 2.5], "HH_B": [5, 2.5], "AA1_I": [5, 2.5], "OW0_E": [5, 2.5], "F_B": [5, 2.5], "JH_I": [5, 2.5], "TH_E": [5, 2.5], "AO1_B": [5, 2.5], "D_I": [5, 2.5], "ER0_I": [5, 2.5], "AH0_B": [5, 2.5], "IY0_I": [5, 2.5], "IH1_B": [5, 2.5], "AA2_I": [5, 2.5], "S_E": [5, 2.5], "T_B": [5, 2.5], "ER1_I": [5, 2.5], "B_B": [5, 2.5], "AY1_E": [5, 2.5], "UH1_I": [5, 2.5], "K_E": [5, 2.5], "AO1_I": [5, 2.5], "W_I": [5, 2.5], "EY1_E": [5, 2.5], "AH1_E": [5, 2.5], "V_E": [5, 2.5], "OW1_B": [5, 2.5], "K_B": [5, 2.5], "TH_I": [5, 2.5], "B_I": [5, 2.5], "P_B": [5, 2.5], "Y_I": [5, 2.5], "UW1_I": [5, 2.5], "IH0_E": [5, 2.5], "IY1_E": [5, 2.5], "K_I": [5, 2.5], "AO2_I": [5, 2.5], "NG_E": [5, 2.5], "ER1_B": [5, 2.5], "TH_B": [5, 2.5], "IY1_I": [5, 2.5], "AE0_I": [5, 2.5], "AH0_E": [5, 2.5], "M_E": [5, 2.5], "N_B": [5, 2.5], "IY1_B": [5, 2.5], "DH_I": [5, 2.5], "G_I": [5, 2.5], "SH_I": [5, 2.5], "SH_B": [5, 2.5], "P_E": [5, 2.5], "AY1_S": [5, 2.5], "AA1_B": [5, 2.5], "EH1_B": [5, 2.5], "IH2_I": [5, 2.5], "AH1_B": [5, 2.5], "F_E": [5, 2.5], "AW1_B": [5, 2.5], "F_I": [5, 2.5], "EH2_I": [5, 2.5], "JH_E": [5, 2.5], "AY2_I": [5, 2.5], "EY2_E": [5, 2.5], "NG_I": [5, 2.5], "CH_E": [5, 2.5], "EY1_B": [5, 2.5], "AA0_B": [5, 2.5], "Y_B": [5, 2.5], "DH_E": [5, 2.5], "IY2_I": [5, 2.5], "V_B": [5, 2.5], "OY1_I": [5, 2.5], "UW0_E": [5, 2.5], "OW1_E": [5, 2.5], "G_B": [5, 2.5], "AE2_B": [5, 2.5], "M_I": [5, 2.5], "SH_E": [5, 2.5], "IH2_B": [5, 2.5], "AW1_E": [5, 2.5], "ZH_I": [5, 2.5], "ER0_S": [5, 2.5], "AY1_B": [5, 2.5], "AA0_I": [5, 2.5], "G_E": [5, 2.5], "EH0_B": [5, 2.5], "SPN_S": [32, 11], "UW2_I": [5, 2.5], "UW0_I": [5, 2.5], "EY2_I": [5, 2.5], "ER1_E": [5, 2.5], "OW2_I": [5, 2.5], "OW0_I": [5, 2.5], "HH_I": [5, 2.5], "B_E": [5, 2.5], "AO1_E": [5, 2.5], "AH2_B": [5, 2.5], "UH2_I": [5, 2.5], "OW1_S": [5, 2.5], "AO2_B": [5, 2.5], "OY1_E": [5, 2.5], "AE2_I": [5, 2.5], "AO0_B": [5, 2.5], "EH2_B": [5, 2.5], "EY1_S": [5, 2.5], "AE0_B": [5, 2.5], "ER0_B": [5, 2.5], "EH0_I": [5, 2.5], "EY0_I": [5, 2.5], "AW2_E": [5, 2.5], "AW2_I": [5, 2.5], "AY0_B": [5, 2.5], "AA2_B": [5, 2.5], "EY0_E": [5, 2.5], "AO0_I": [5, 2.5], "AY0_I": [5, 2.5], "AH2_I": [5, 2.5], "OW2_E": [5, 2.5], "ZH_E": [5, 2.5], "AY2_E": [5, 2.5], "ER2_I": [5, 2.5], "IY2_B": [5, 2.5], "AA1_S": [5, 2.5], "AA1_E": [5, 2.5], "OY0_I": [5, 2.5], "IY0_B": [5, 2.5], "OY2_E": [5, 2.5], "OW2_B": [5, 2.5], "AY0_E": [5, 2.5], "OY2_I": [5, 2.5], "UW1_B": [5, 2.5], "OY0_E": [5, 2.5], "UH0_I": [5, 2.5], "OY1_B": [5, 2.5], "AW0_B": [5, 2.5], "AO1_S": [5, 2.5], "OW0_B": [5, 2.5], "EH1_S": [5, 2.5], "AW0_I": [5, 2.5], "UW0_B": [5, 2.5], "AO2_E": [5, 2.5], "UW2_E": [5, 2.5], "L_S": [5, 2.5], "Z_B": [5, 2.5], "AA2_E": [5, 2.5], "EY0_B": [5, 2.5], "AY2_B": [5, 2.5], "AW0_E": [5, 2.5], "IY1_S": [5, 2.5], "EY2_B": [5, 2.5], "AH1_S": [5, 2.5], "IH2_E": [5, 2.5], "AW2_B": [5, 2.5], "AA0_E": [5, 2.5], "ER2_E": [5, 2.5], "ZH_B": [5, 2.5], "UH1_E": [5, 2.5], "EH1_E": [5, 2.5], "IH1_E": [5, 2.5], "ER1_S": [5, 2.5], "EH2_E": [5, 2.5], "AO0_E": [5, 2.5], "OY1_S": [5, 2.5], "AA_B": [5, 2.5], "AA_E": [5, 2.5], "AA_I": [5, 2.5], "AA_S": [5, 2.5], "AA0_S": [5, 2.5], "AA2_S": [5, 2.5], "AE_B": [5, 2.5], "AE_E": [5, 2.5], "AE_I": [5, 2.5], "AE_S": [5, 2.5], "AE0_E": [5, 2.5], "AE0_S": [5, 2.5], "AE1_E": [5, 2.5], "AE1_S": [5, 2.5], "AE2_E": [5, 2.5], "AE2_S": [5, 2.5], "AH_B": [5, 2.5], "AH_E": [5, 2.5], "AH_I": [5, 2.5], "AH_S": [5, 2.5], "AH2_E": [5, 2.5], "AH2_S": [5, 2.5], "AO_B": [5, 2.5], "AO_E": [5, 2.5], "AO_I": [5, 2.5], "AO_S": [5, 2.5], "AO0_S": [5, 2.5], "AO2_S": [5, 2.5], "AW_B": [5, 2.5], "AW_E": [5, 2.5], "AW_I": [5, 2.5], "AW_S": [5, 2.5], "AW0_S": [5, 2.5], "AW1_S": [5, 2.5], "AW2_S": [5, 2.5], "AY_B": [5, 2.5], "AY_E": [5, 2.5], "AY_I": [5, 2.5], "AY_S": [5, 2.5], "AY0_S": [5, 2.5], "AY2_S": [5, 2.5], "B_S": [5, 2.5], "CH_S": [5, 2.5], "D_S": [5, 2.5], "DH_S": [5, 2.5], "EH_B": [5, 2.5], "EH_E": [5, 2.5], "EH_I": [5, 2.5], "EH_S": [5, 2.5], "EH0_E": [5, 2.5], "EH0_S": [5, 2.5], "EH2_S": [5, 2.5], "ER_B": [5, 2.5], "ER_E": [5, 2.5], "ER_I": [5, 2.5], "ER_S": [5, 2.5], "ER2_B": [5, 2.5], "ER2_S": [5, 2.5], "EY_B": [5, 2.5], "EY_E": [5, 2.5], "EY_I": [5, 2.5], "EY_S": [5, 2.5], "EY0_S": [5, 2.5], "EY2_S": [5, 2.5], "F_S": [5, 2.5], "G_S": [5, 2.5], "HH_E": [5, 2.5], "HH_S": [5, 2.5], "IH_B": [5, 2.5], "IH_E": [5, 2.5], "IH_I": [5, 2.5], "IH_S": [5, 2.5], "IH0_S": [5, 2.5], "IH1_S": [5, 2.5], "IH2_S": [5, 2.5], "IY_B": [5, 2.5], "IY_E": [5, 2.5], "IY_I": [5, 2.5], "IY_S": [5, 2.5], "IY0_S": [5, 2.5], "IY2_S": [5, 2.5], "JH_S": [5, 2.5], "K_S": [5, 2.5], "M_S": [5, 2.5], "N_S": [5, 2.5], "NG_B": [5, 2.5], "NG_S": [5, 2.5], "OW_B": [5, 2.5], "OW_E": [5, 2.5], "OW_I": [5, 2.5], "OW_S": [5, 2.5], "OW0_S": [5, 2.5], "OW2_S": [5, 2.5], "OY_B": [5, 2.5], "OY_E": [5, 2.5], "OY_I": [5, 2.5], "OY_S": [5, 2.5], "OY0_B": [5, 2.5], "OY0_S": [5, 2.5], "OY2_B": [5, 2.5], "OY2_S": [5, 2.5], "P_S": [5, 2.5], "R_S": [5, 2.5], "S_S": [5, 2.5], "SH_S": [5, 2.5], "T_S": [5, 2.5], "TH_S": [5, 2.5], "UH_B": [5, 2.5], "UH_E": [5, 2.5], "UH_I": [5, 2.5], "UH_S": [5, 2.5], "UH0_B": [5, 2.5], "UH0_E": [5, 2.5], "UH0_S": [5, 2.5], "UH1_B": [5, 2.5], "UH1_S": [5, 2.5], "UH2_B": [5, 2.5], "UH2_E": [5, 2.5], "UH2_S": [5, 2.5], "UW_B": [5, 2.5], "UW_E": [5, 2.5], "UW_I": [5, 2.5], "UW_S": [5, 2.5], "UW0_S": [5, 2.5], "UW1_S": [5, 2.5], "UW2_B": [5, 2.5], "UW2_S": [5, 2.5], "V_S": [5, 2.5], "W_E": [5, 2.5], "W_S": [5, 2.5], "Y_E": [5, 2.5], "Y_S": [5, 2.5], "Z_S": [5, 2.5], "ZH_S": [5, 2.5]} diff --git a/SpeechLM/speechlm/data_process/phoneme_tokenizer/repeat_withou_insert_sil_less_4375.py b/SpeechLM/speechlm/data_process/phoneme_tokenizer/repeat_withou_insert_sil_less_4375.py new file mode 100644 index 0000000..8c44361 --- /dev/null +++ b/SpeechLM/speechlm/data_process/phoneme_tokenizer/repeat_withou_insert_sil_less_4375.py @@ -0,0 +1,41 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import sys, json, tqdm +import numpy as np + +input_file = sys.argv[1] +mean_and_std_file = sys.argv[2] +out_file = sys.argv[3] + +mean_and_std = json.load(open(mean_and_std_file, 'r')) + +with open(input_file, 'r') as f, open(out_file, 'w') as w: + for line in tqdm.tqdm(f): + l = line.split() + + new_l = [] + for phn in l: + if phn not in mean_and_std: + mean_and_std[phn] = [5, 2.5] + print(f'unk phone {phn}') + n = max(1, round(np.random.normal(loc=mean_and_std[phn][0], scale=mean_and_std[phn][1]))) + new_l.extend([phn] * int(n)) + + minus = 0 + while len(new_l) >= 4375: + minus += 1 + new_l = [] + for phn in l: + n = max(1, round(mean_and_std[phn][0] - minus)) + new_l.extend([phn] * n) + print(f"too long line try minus {minus}") + + w.write(' '.join(new_l)+'\n') + diff --git a/SpeechLM/speechlm/data_process/prepare_covost2_enxx.sh b/SpeechLM/speechlm/data_process/prepare_covost2_enxx.sh new file mode 100644 index 0000000..4d316a4 --- /dev/null +++ b/SpeechLM/speechlm/data_process/prepare_covost2_enxx.sh @@ -0,0 +1,45 @@ + +#!/bin/bash +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 +[ $# -lt 1 ] && echo "Usage: $0 [root=${PWD}/dataset/CommonVoice/v4]" && exit 0 +cwd=${PWD} +src=${PWD}/speechlm/data_process +lang=$1 +root=$2 +[ -z $root ] && root="${PWD}/dataset/CommonVoice/v4" +set -e -o pipefail -u + + +### step1, convert mp3 to wav +cd $root/en && mkdir -p wav +cut -f2 validated.tsv | sed '1d' | sed "s|^|${root}/en/clips/|" > validated.id +for i in $(seq 0 39); do + echo extracting $i; + python $src/covost2/mp3_to_wav.py -i validated.id -n 40 -r $i & +done +wait +cd $cwd + + +### step2, manifest +datadir="$root/en/en-$lang" && mkdir -p $datadir && cd $datadir +python /mnt/default/v-ziqzhang/code/stpretrain_scripts/data_process/covost2/prepare_covost_data.py --data-root $root --src-lang en --tgt-lang $lang --vocab-type char +mv ../*en_${lang}.* ./ + +# adjust config_base_en${lang}.yaml +echo "bpe_tokenizer:" > config_base_en${lang}.yaml +echo " bpe: sentencepiece" >> config_base_en${lang}.yaml +echo " sentencepiece_model: spm_char_st_en_de.model" >> config_base_en${lang}.yaml +echo "" >> config_base_en${lang}.yaml +echo "shuffle: false" >> config_base_en${lang}.yaml +echo "use_audio_input: true" >> config_base_en${lang}.yaml +echo "use_sample_rate: 16000" >> config_base_en${lang}.yaml +echo "standardize_audio: false" >> config_base_en${lang}.yaml +echo "vocab_filename: spm_char_st_en_de.txt" >> config_base_en${lang}.yaml +echo "" >> config_base_en${lang}.yaml +echo "# required by speech_to_text task but never used" >> config_base_en${lang}.yaml +echo "input_channels: 1" >> config_base_en${lang}.yaml +echo "input_feat_per_channel: 1" >> config_base_en${lang}.yaml +echo "" >> config_base_en${lang}.yaml +# adjust config_large_en${lang}.yaml +cat config_base_en${lang}.yaml | sed "s|standardize_audio: false|standardize_audio: true|" > config_large_en${lang}.yaml diff --git a/SpeechLM/speechlm/data_process/prepare_phn2ltr_librilm.sh b/SpeechLM/speechlm/data_process/prepare_phn2ltr_librilm.sh new file mode 100644 index 0000000..9ffdf81 --- /dev/null +++ b/SpeechLM/speechlm/data_process/prepare_phn2ltr_librilm.sh @@ -0,0 +1,57 @@ +#!/bin/bash +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 +cwd=${PWD} +src=${PWD}/speechlm/data_process + +set -e +mkdir -p dataset/LibriLM/phone_unit/tmp && cd dataset/LibriLM + +if [ ! -f librispeech-lm-norm.txt ]; then + echo "--------------------------------------------------------------------------------------" + echo "--------Downloading and unpacking librispeech-lm-norm.txt ..." + echo "--------------------------------------------------------------------------------------" + wget -c https://www.openslr.org/resources/11/librispeech-lm-norm.txt.gz + gzip -d librispeech-lm-norm.txt.gz +fi + +# head -1000000 librispeech-lm-norm.txt > phone_unit/tmp/librispeech-lm-norm.txt +cd phone_unit/ + +echo "--------------------------------------------------------------------------------------" +echo "--------Tokenize the text..." +echo "--------------------------------------------------------------------------------------" +cat ../librispeech-lm-norm.txt | sed '1d' | python $src/wrd2ltr.py > tmp/librilm.ltr + +echo "--------------------------------------------------------------------------------------" +echo "--------Tokenize the text to the kaldi-style phonemes ..." +echo "--------------------------------------------------------------------------------------" +python $src/phoneme_tokenizer/ltr2kaldi_phn_sil025.py -i tmp/librilm.ltr -o tmp/librilm +cat tmp/librilm.kaldi_phn_sil025 | sed 's/SIL_S/SIL/g' > tmp/librilm.phn + +echo "--------------------------------------------------------------------------------------" +echo "--------Filter too long samples and up-sample phonemes ..." +echo "--------------------------------------------------------------------------------------" +python $src/filter_paireddata_by_len.py -i tmp/librilm -o tmp/librilm_l2k -s phn -t ltr -m 2000 +python $src/phoneme_tokenizer/repeat_withou_insert_sil_less_4375.py \ + tmp/librilm_l2k.phn \ + $src/phoneme_tokenizer/mean5_and_std25_sil14_spn32.dict \ + tmp/librilm_l2k_upsample.phn + +mv tmp/librilm_l2k.ltr tmp/librilm_l2k_upsample.ltr +python $src/filter_paireddata_by_len.py -i tmp/librilm_l2k_upsample -o train_text.phn-ltr -s phn -t ltr -m 2800 +### the max-length is set to filter the data, considering the batch size (in Large setting, 900,000/320 = 2812 tokens in a batch). + + +echo "--------------------------------------------------------------------------------------" +echo "--------Create binary files ..." +echo "--------------------------------------------------------------------------------------" +[ ! -f bin-idx/dict.phn.txt ] && echo "dict ${cwd}/dataset/LibriLM/bin-idx/dict.phn.txt not found!" && exit 1 +[ ! -f bin-idx/dict.ltr.txt ] && echo "dict ${cwd}/dataset/LibriLM/bin-idx/dict.ltr.txt not found!" && exit 1 +bash $src/txt2idx.sh train_text.phn-ltr.phn bin-idx bin-idx/dict.phn.txt +bash $src/txt2idx.sh train_text.phn-ltr.ltr bin-idx bin-idx/dict.ltr.txt + +rm -r tmp +cd - +echo "--------------------------------------------------------------------------------------" +echo "--------Done! files are in ${PWD}/dataset/LibriLM" +echo "--------------------------------------------------------------------------------------" diff --git a/SpeechLM/speechlm/data_process/txt2idx.sh b/SpeechLM/speechlm/data_process/txt2idx.sh new file mode 100644 index 0000000..4442bf9 --- /dev/null +++ b/SpeechLM/speechlm/data_process/txt2idx.sh @@ -0,0 +1,30 @@ +#!/bin/bash +[ $# -lt 3 ] && echo "Usage: $0 " && exit 0 + +input=$1 +outdir=$2 +DICT=$3 +suffix=$4 +outname=${input##*/} +outname=${outname%.txt*} +[ -z $input ] && echo "You must specify a source file" && exit 1 + +[ -z $DICT ] && echo "No dict was specified!" && exit 1 +[ -z $outdir ] && outdir=${input%/*} +[ -z $outdir ] && outdir="." +[ ! -d $outdir ] && mkdir -p $outdir + +echo "------------------------------- creating idx/bin--------------------------------------------" +echo "$input --> $outdir/${outname}${suffix}.idx" +fairseq-preprocess \ + --only-source \ + --trainpref $input \ + --destdir $outdir \ + --thresholdsrc 0 \ + --srcdict ${DICT} \ + --workers 40 + +mv $outdir/train.idx $outdir/${outname}${suffix}.idx +mv $outdir/train.bin $outdir/${outname}${suffix}.bin +echo "----------------------------------- done --------------------------------------------" + diff --git a/SpeechLM/speechlm/data_process/wrd2ltr.py b/SpeechLM/speechlm/data_process/wrd2ltr.py new file mode 100644 index 0000000..8aa48e6 --- /dev/null +++ b/SpeechLM/speechlm/data_process/wrd2ltr.py @@ -0,0 +1,12 @@ +import sys + +def main(): + for line in sys.stdin: + line = line.replace("", "") + line = " ".join(line.strip().split()) + line = line.replace(" ", "|").upper() + "|" + print(" ".join(line)) + +if __name__ == "__main__": + main() + diff --git a/SpeechLM/speechlm/generate_unit.py b/SpeechLM/speechlm/generate_unit.py new file mode 100644 index 0000000..690ea28 --- /dev/null +++ b/SpeechLM/speechlm/generate_unit.py @@ -0,0 +1,412 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +""" +Modified form: https://github.com/facebookresearch/fairseq/blob/272c4c5197250997148fb12c0db6306035f166a4/fairseq_cli/generate.py +""" + +import ast +import logging +import math +import os +import sys +from argparse import Namespace +from itertools import chain + +import numpy as np +import torch +from omegaconf import DictConfig + +from fairseq import checkpoint_utils, options, scoring, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.logging import progress_bar +from fairseq.logging.meters import StopwatchMeter, TimeMeter + + +def main(cfg: DictConfig): + + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + assert cfg.common_eval.path is not None, "--path required for generation!" + assert ( + not cfg.generation.sampling or cfg.generation.nbest == cfg.generation.beam + ), "--sampling requires --nbest to be equal to --beam" + assert ( + cfg.generation.replace_unk is None or cfg.dataset.dataset_impl == "raw" + ), "--replace-unk requires a raw text dataset (--dataset-impl=raw)" + + if cfg.common_eval.results_path is not None: + os.makedirs(cfg.common_eval.results_path, exist_ok=True) + output_path = os.path.join( + cfg.common_eval.results_path, + "generate-{}.txt".format(cfg.dataset.gen_subset), + ) + with open(output_path, "w", buffering=1, encoding="utf-8") as h: + return _main(cfg, h) + else: + return _main(cfg, sys.stdout) + + +def get_symbols_to_strip_from_output(generator): + if hasattr(generator, "symbols_to_strip_from_output"): + return generator.symbols_to_strip_from_output + else: + return {generator.eos} + + +def _main(cfg: DictConfig, output_file): + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=output_file, + ) + logger = logging.getLogger("fairseq_cli.generate") + + utils.import_user_module(cfg.common) + + if cfg.dataset.max_tokens is None and cfg.dataset.batch_size is None: + cfg.dataset.max_tokens = 12000 + logger.info(cfg) + + # Fix seed for stochastic decoding + if cfg.common.seed is not None and not cfg.generation.no_seed_provided: + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + + # Load dataset splits + task = tasks.setup_task(cfg.task) + + # Set dictionaries + try: + src_dict = getattr(task, "source_dictionary", None) + except NotImplementedError: + src_dict = None + tgt_dict = task.target_dictionary + + overrides = ast.literal_eval(cfg.common_eval.model_overrides) + + # Load ensemble + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + utils.split_paths(cfg.common_eval.path), + arg_overrides=overrides, + task=task, + suffix=cfg.checkpoint.checkpoint_suffix, + strict=(cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.checkpoint.checkpoint_shard_count, + ) + + # loading the dataset should happen after the checkpoint has been loaded so we can give it the saved task config + task.load_dataset(cfg.dataset.gen_subset, task_cfg=saved_cfg.task) + + if cfg.generation.lm_path is not None: + overrides["data"] = cfg.task.data + + try: + lms, _ = checkpoint_utils.load_model_ensemble( + [cfg.generation.lm_path], arg_overrides=overrides, task=None + ) + except: + logger.warning( + f"Failed to load language model! Please make sure that the language model dict is the same " + f"as target dict and is located in the data dir ({cfg.task.data})" + ) + raise + + assert len(lms) == 1 + else: + lms = [None] + + # Optimize ensemble for generation + for model in chain(models, lms): + if model is None: + continue + if cfg.common.fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + def _fp_convert_sample(sample): + def apply_half(t): + if t.dtype is torch.float32: + return t.to(dtype=torch.half) + return t + + def apply_bfloat16(t): + if t.dtype is torch.float32: + return t.to(dtype=torch.bfloat16) + return t + + if cfg.common.fp16: + sample = utils.apply_to_sample(apply_half, sample) + + if cfg.common.bf16: + sample = utils.apply_to_sample(apply_bfloat16, sample) + + return sample + + # Load alignment dictionary for unknown word replacement + # (None if no unknown word replacement, empty if no path to align dictionary) + align_dict = utils.load_align_dict(cfg.generation.replace_unk) + + # Load dataset (possibly sharded) + itr = task.get_batch_iterator( + dataset=task.dataset(cfg.dataset.gen_subset), + max_tokens=cfg.dataset.max_tokens, + max_sentences=cfg.dataset.batch_size, + max_positions=utils.resolve_max_positions( + task.max_positions(), *[m.max_positions() for m in models] + ), + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.dataset.required_batch_size_multiple, + seed=cfg.common.seed, + num_shards=cfg.distributed_training.distributed_world_size, + shard_id=cfg.distributed_training.distributed_rank, + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + # Initialize generator + gen_timer = StopwatchMeter() + + extra_gen_cls_kwargs = {"lm_model": lms[0], "lm_weight": cfg.generation.lm_weight} + generator = task.build_generator( + models, cfg.generation, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + # Handle tokenization and BPE + tokenizer = task.build_tokenizer(cfg.tokenizer) + bpe = task.build_bpe(cfg.bpe) + + def decode_fn(x): + if bpe is not None: + x = bpe.decode(x) + if tokenizer is not None: + x = tokenizer.decode(x) + return x + + scorer = scoring.build_scorer(cfg.scoring, None) + + num_sentences = 0 + has_target = True + wps_meter = TimeMeter() + for sample in progress: + sample = utils.move_to_cuda(sample) if use_cuda else sample + sample = _fp_convert_sample(sample) + if "net_input" not in sample: + continue + + prefix_tokens = None + if cfg.generation.prefix_size > 0: + prefix_tokens = sample["target"][:, : cfg.generation.prefix_size] + + constraints = None + if "constraints" in sample: + constraints = sample["constraints"] + + gen_timer.start() + hypos = task.inference_step( + generator, + models[0], + sample, + prefix_tokens=prefix_tokens, + constraints=constraints, + ) + num_generated_tokens = sum(len(h["unit"]) for h in hypos) + gen_timer.stop(num_generated_tokens) + + for i, sample_id in enumerate(sample["id"].tolist()): + has_target = sample["target"] is not None + + # Remove padding + if "src_tokens" in sample["net_input"]: + src_tokens = utils.strip_pad( + sample["net_input"]["src_tokens"][i, :], tgt_dict.pad() + ).cpu() + else: + src_tokens = None + + target_tokens = None + if has_target: + target_tokens = ( + utils.strip_pad(sample["target"][i, :], tgt_dict.pad()).cpu() + ) + + # Either retrieve the original sentences or regenerate them from tokens. + if align_dict is not None: + src_str = task.dataset(cfg.dataset.gen_subset).src.get_original_text( + sample_id + ) + target_str = task.dataset(cfg.dataset.gen_subset).tgt.get_original_text( + sample_id + ) + else: + if src_dict is not None: + src_str = src_dict.string(src_tokens, cfg.common_eval.post_process) + else: + src_str = "" + if has_target: + target_str = " ".join(map(str, target_tokens.numpy().tolist())) + + src_str = decode_fn(src_str) + + if not cfg.common_eval.quiet: + if src_dict is not None: + print("S-{}\t{}".format(sample_id, src_str), file=output_file) + if has_target: + print("T-{}\t{}".format(sample_id, target_str), file=output_file) + + # Process top predictions + j = 0 + hypo = hypos[i] + hypo_tokens = hypo["unit"].int().cpu() + hypo_str = " ".join(map(str, hypo_tokens.numpy().tolist())) + alignment = None + detok_hypo_str = hypo_str + # add duration prediction + hypo_duration = " ".join(map(str, hypo["duration"].int().cpu().numpy().tolist())) + hypo_fa_src_str = src_dict.string(hypo["fa_src"].cpu().numpy(), cfg.common_eval.post_process) + # hypo_fa_src_str = " ".join(map(str, hypo["fa_src"].int().cpu().numpy() - 4)) + + if not cfg.common_eval.quiet: + # score = hypo["score"] / math.log(2) # convert to base 2 + score = 0.00 + # original hypothesis (after tokenization and BPE) + # print( + # "H-{}\t{}\t{}".format(sample_id, score, hypo_str), + # file=output_file, + # ) + # detokenized hypothesis + print( + "D-{}\t{}\t{}".format(sample_id, score, detok_hypo_str), + file=output_file, + ) + # duration prediction + print( + "L-{}\t{}\t{}".format(sample_id, score, hypo_duration), + file=output_file, + ) + # force-aligned upsampled src-tokens + print( + "U-{}\t{}\t{}".format(sample_id, score, hypo_fa_src_str), + file=output_file, + ) + # print( + # "P-{}\t{}".format( + # sample_id, + # " ".join( + # map( + # lambda x: "{:.4f}".format(x), + # # convert from base e to base 2 + # hypo["positional_scores"] + # .div_(math.log(2)) + # .tolist(), + # ) + # ), + # ), + # file=output_file, + # ) + + if cfg.generation.print_alignment == "hard": + print( + "A-{}\t{}".format( + sample_id, + " ".join( + [ + "{}-{}".format(src_idx, tgt_idx) + for src_idx, tgt_idx in alignment + ] + ), + ), + file=output_file, + ) + if cfg.generation.print_alignment == "soft": + print( + "A-{}\t{}".format( + sample_id, + " ".join( + [",".join(src_probs) for src_probs in alignment] + ), + ), + file=output_file, + ) + + + # Score only the top hypothesis + if has_target and j == 0: + if hasattr(scorer, "add_string"): + scorer.add_string(target_str, detok_hypo_str) + else: + scorer.add(target_tokens, hypo_tokens) + + wps_meter.update(num_generated_tokens) + progress.log({"wps": round(wps_meter.avg)}) + num_sentences += ( + sample["nsentences"] if "nsentences" in sample else sample["id"].numel() + ) + + logger.info("NOTE: hypothesis and token scores are output in base 2") + logger.info( + "Translated {:,} sentences ({:,} tokens) in {:.1f}s ({:.2f} sentences/s, {:.2f} tokens/s)".format( + num_sentences, + gen_timer.n, + gen_timer.sum, + num_sentences / gen_timer.sum, + 1.0 / gen_timer.avg, + ) + ) + if has_target: + if cfg.bpe and not cfg.generation.sacrebleu: + if cfg.common_eval.post_process: + logger.warning( + "BLEU score is being computed by splitting detokenized string on spaces, this is probably not what you want. Use --sacrebleu for standard 13a BLEU tokenization" + ) + else: + logger.warning( + "If you are using BPE on the target side, the BLEU score is computed on BPE tokens, not on proper words. Use --sacrebleu for standard 13a BLEU tokenization" + ) + # use print to be consistent with other main outputs: S-, H-, T-, D- and so on + print( + "Generate {} with beam={}: {}".format( + cfg.dataset.gen_subset, cfg.generation.beam, scorer.result_string() + ), + file=output_file, + ) + + return scorer + + +def cli_main(): + parser = options.get_generation_parser() + # TODO: replace this workaround with refactoring of `AudioPretraining` + parser.add_argument( + "--arch", + "-a", + metavar="ARCH", + default="wav2vec2", + help="Model architecture. For constructing tasks that rely on " + "model args (e.g. `AudioPretraining`)", + ) + args = options.parse_args_and_arch(parser) + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechLM/speechlm/infer.py b/SpeechLM/speechlm/infer.py new file mode 100644 index 0000000..ab80c15 --- /dev/null +++ b/SpeechLM/speechlm/infer.py @@ -0,0 +1,486 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +""" +Modified form: https://github.com/facebookresearch/fairseq/blob/272c4c5197250997148fb12c0db6306035f166a4/examples/speech_recognition/new/infer.py +1. add "utils.import_user_module(cfg.common)" so that usr-dir can be loaded +""" + +import ast +import hashlib +import logging +import os +import shutil +import sys +from dataclasses import dataclass, field, is_dataclass +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple, Union + +import editdistance +import torch +import torch.distributed as dist +import examples +from examples.speech_recognition.new.decoders.decoder_config import ( + DecoderConfig, + FlashlightDecoderConfig, +) +from examples.speech_recognition.new.decoders.decoder import Decoder +from fairseq import checkpoint_utils, distributed_utils, progress_bar, tasks, utils +from fairseq.data.data_utils import post_process +from fairseq.dataclass.configs import ( + CheckpointConfig, + CommonConfig, + CommonEvalConfig, + DatasetConfig, + DistributedTrainingConfig, + FairseqDataclass, +) +from fairseq.logging.meters import StopwatchMeter, TimeMeter +from fairseq.logging.progress_bar import BaseProgressBar +from fairseq.models.fairseq_model import FairseqModel +from omegaconf import OmegaConf + +import hydra +from hydra.core.config_store import ConfigStore + +logging.root.setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +config_path = Path(examples.speech_recognition.new.__path__[0]).resolve() / "conf" + + +@dataclass +class DecodingConfig(DecoderConfig, FlashlightDecoderConfig): + unique_wer_file: bool = field( + default=False, + metadata={"help": "If set, use a unique file for storing WER"}, + ) + results_path: Optional[str] = field( + default=None, + metadata={ + "help": "If set, write hypothesis and reference sentences into this directory" + }, + ) + + +@dataclass +class InferConfig(FairseqDataclass): + task: Any = None + decoding: DecodingConfig = DecodingConfig() + common: CommonConfig = CommonConfig() + common_eval: CommonEvalConfig = CommonEvalConfig() + checkpoint: CheckpointConfig = CheckpointConfig() + distributed_training: DistributedTrainingConfig = DistributedTrainingConfig() + dataset: DatasetConfig = DatasetConfig() + is_ax: bool = field( + default=False, + metadata={ + "help": "if true, assumes we are using ax for tuning and returns a tuple for ax to consume" + }, + ) + + +def reset_logging(): + root = logging.getLogger() + for handler in root.handlers: + root.removeHandler(handler) + root.setLevel(os.environ.get("LOGLEVEL", "INFO").upper()) + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter( + logging.Formatter( + fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + ) + root.addHandler(handler) + + +class InferenceProcessor: + cfg: InferConfig + + def __init__(self, cfg: InferConfig) -> None: + self.cfg = cfg + self.task = tasks.setup_task(cfg.task) + + models, saved_cfg = self.load_model_ensemble() + self.models = models + self.saved_cfg = saved_cfg + self.tgt_dict = self.task.target_dictionary + + self.task.load_dataset( + self.cfg.dataset.gen_subset, + task_cfg=saved_cfg.task, + ) + self.generator = Decoder(cfg.decoding, self.tgt_dict) + self.gen_timer = StopwatchMeter() + self.wps_meter = TimeMeter() + self.num_sentences = 0 + self.total_errors = 0 + self.total_length = 0 + + self.hypo_words_file = None + self.hypo_units_file = None + self.ref_words_file = None + self.ref_units_file = None + + self.progress_bar = self.build_progress_bar() + + def __enter__(self) -> "InferenceProcessor": + if self.cfg.decoding.results_path is not None: + self.hypo_words_file = self.get_res_file("hypo.word") + self.hypo_units_file = self.get_res_file("hypo.units") + self.ref_words_file = self.get_res_file("ref.word") + self.ref_units_file = self.get_res_file("ref.units") + return self + + def __exit__(self, *exc) -> bool: + if self.cfg.decoding.results_path is not None: + self.hypo_words_file.close() + self.hypo_units_file.close() + self.ref_words_file.close() + self.ref_units_file.close() + return False + + def __iter__(self) -> Any: + for sample in self.progress_bar: + if not self.cfg.common.cpu: + sample = utils.move_to_cuda(sample) + + # Happens on the last batch. + if "net_input" not in sample: + continue + yield sample + + def log(self, *args, **kwargs): + self.progress_bar.log(*args, **kwargs) + + def print(self, *args, **kwargs): + self.progress_bar.print(*args, **kwargs) + + def get_res_file(self, fname: str) -> None: + fname = os.path.join(self.cfg.decoding.results_path, fname) + if self.data_parallel_world_size > 1: + fname = f"{fname}.{self.data_parallel_rank}" + return open(fname, "w", buffering=1) + + def merge_shards(self) -> None: + """Merges all shard files into shard 0, then removes shard suffix.""" + + shard_id = self.data_parallel_rank + num_shards = self.data_parallel_world_size + + if self.data_parallel_world_size > 1: + + def merge_shards_with_root(fname: str) -> None: + fname = os.path.join(self.cfg.decoding.results_path, fname) + logger.info("Merging %s on shard %d", fname, shard_id) + base_fpath = Path(f"{fname}.0") + with open(base_fpath, "a") as out_file: + for s in range(1, num_shards): + shard_fpath = Path(f"{fname}.{s}") + with open(shard_fpath, "r") as in_file: + for line in in_file: + out_file.write(line) + shard_fpath.unlink() + shutil.move(f"{fname}.0", fname) + + dist.barrier() # ensure all shards finished writing + if shard_id == (0 % num_shards): + merge_shards_with_root("hypo.word") + if shard_id == (1 % num_shards): + merge_shards_with_root("hypo.units") + if shard_id == (2 % num_shards): + merge_shards_with_root("ref.word") + if shard_id == (3 % num_shards): + merge_shards_with_root("ref.units") + dist.barrier() + + def optimize_model(self, model: FairseqModel) -> None: + model.make_generation_fast_() + if self.cfg.common.fp16: + model.half() + if not self.cfg.common.cpu: + model.cuda() + + def load_model_ensemble(self) -> Tuple[List[FairseqModel], FairseqDataclass]: + arg_overrides = ast.literal_eval(self.cfg.common_eval.model_overrides) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + utils.split_paths(self.cfg.common_eval.path, separator="\\"), + arg_overrides=arg_overrides, + task=self.task, + suffix=self.cfg.checkpoint.checkpoint_suffix, + strict=(self.cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=self.cfg.checkpoint.checkpoint_shard_count, + ) + for model in models: + self.optimize_model(model) + return models, saved_cfg + + def get_dataset_itr(self, disable_iterator_cache: bool = False) -> None: + return self.task.get_batch_iterator( + dataset=self.task.dataset(self.cfg.dataset.gen_subset), + max_tokens=self.cfg.dataset.max_tokens, + max_sentences=self.cfg.dataset.batch_size, + max_positions=(sys.maxsize, sys.maxsize), + ignore_invalid_inputs=self.cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=self.cfg.dataset.required_batch_size_multiple, + seed=self.cfg.common.seed, + num_shards=self.data_parallel_world_size, + shard_id=self.data_parallel_rank, + num_workers=self.cfg.dataset.num_workers, + data_buffer_size=self.cfg.dataset.data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + ).next_epoch_itr(shuffle=False) + + def build_progress_bar( + self, + epoch: Optional[int] = None, + prefix: Optional[str] = None, + default_log_format: str = "tqdm", + ) -> BaseProgressBar: + return progress_bar.progress_bar( + iterator=self.get_dataset_itr(), + log_format=self.cfg.common.log_format, + log_interval=self.cfg.common.log_interval, + epoch=epoch, + prefix=prefix, + tensorboard_logdir=self.cfg.common.tensorboard_logdir, + default_log_format=default_log_format, + ) + + @property + def data_parallel_world_size(self): + if self.cfg.distributed_training.distributed_world_size == 1: + return 1 + return distributed_utils.get_data_parallel_world_size() + + @property + def data_parallel_rank(self): + if self.cfg.distributed_training.distributed_world_size == 1: + return 0 + return distributed_utils.get_data_parallel_rank() + + def process_sentence( + self, + sample: Dict[str, Any], + hypo: Dict[str, Any], + sid: int, + batch_id: int, + ) -> Tuple[int, int]: + speaker = None # Speaker can't be parsed from dataset. + + if "target_label" in sample: + toks = sample["target_label"] + else: + toks = sample["target"] + toks = toks[batch_id, :] + + # Processes hypothesis. + hyp_pieces = self.tgt_dict.string(hypo["tokens"].int().cpu()) + if "words" in hypo: + hyp_words = " ".join(hypo["words"]) + else: + hyp_words = post_process(hyp_pieces, self.cfg.common_eval.post_process) + + # Processes target. + target_tokens = utils.strip_pad(toks, self.tgt_dict.pad()) + tgt_pieces = self.tgt_dict.string(target_tokens.int().cpu()) + tgt_words = post_process(tgt_pieces, self.cfg.common_eval.post_process) + + if self.cfg.decoding.results_path is not None: + print(f"{hyp_pieces} ({speaker}-{sid})", file=self.hypo_units_file) + print(f"{hyp_words} ({speaker}-{sid})", file=self.hypo_words_file) + print(f"{tgt_pieces} ({speaker}-{sid})", file=self.ref_units_file) + print(f"{tgt_words} ({speaker}-{sid})", file=self.ref_words_file) + + if not self.cfg.common_eval.quiet: + logger.info(f"HYPO: {hyp_words}") + logger.info(f"REF: {tgt_words}") + logger.info("---------------------") + + hyp_words, tgt_words = hyp_words.split(), tgt_words.split() + + return editdistance.eval(hyp_words, tgt_words), len(tgt_words) + + def process_sample(self, sample: Dict[str, Any]) -> None: + self.gen_timer.start() + hypos = self.task.inference_step( + generator=self.generator, + models=self.models, + sample=sample, + ) + num_generated_tokens = sum(len(h[0]["tokens"]) for h in hypos) + self.gen_timer.stop(num_generated_tokens) + self.wps_meter.update(num_generated_tokens) + + for batch_id, sample_id in enumerate(sample["id"].tolist()): + errs, length = self.process_sentence( + sample=sample, + sid=sample_id, + batch_id=batch_id, + hypo=hypos[batch_id][0], + ) + self.total_errors += errs + self.total_length += length + + self.log({"wps": round(self.wps_meter.avg)}) + if "nsentences" in sample: + self.num_sentences += sample["nsentences"] + else: + self.num_sentences += sample["id"].numel() + + def log_generation_time(self) -> None: + logger.info( + "Processed %d sentences (%d tokens) in %.1fs %.2f " + "sentences per second, %.2f tokens per second)", + self.num_sentences, + self.gen_timer.n, + self.gen_timer.sum, + self.num_sentences / (self.gen_timer.sum + 1e-6), + 1.0 / (self.gen_timer.avg + 1e-6), + ) + + +def parse_wer(wer_file: Path) -> float: + with open(wer_file, "r") as f: + return float(f.readline().strip().split(" ")[1]) + + +def get_wer_file(cfg: InferConfig) -> Path: + """Hashes the decoding parameters to a unique file ID.""" + base_path = "wer" + if cfg.decoding.results_path is not None: + base_path = os.path.join(cfg.decoding.results_path, base_path) + + if cfg.decoding.unique_wer_file: + yaml_str = OmegaConf.to_yaml(cfg.decoding) + fid = int(hashlib.md5(yaml_str.encode("utf-8")).hexdigest(), 16) + return Path(f"{base_path}.{fid % 1000000}") + else: + return Path(base_path) + + +def main(cfg: InferConfig) -> float: + """Entry point for main processing logic. + + Args: + cfg: The inferance configuration to use. + wer: Optional shared memory pointer for returning the WER. If not None, + the final WER value will be written here instead of being returned. + + Returns: + The final WER if `wer` is None, otherwise None. + """ + + utils.import_user_module(cfg.common) + + yaml_str, wer_file = OmegaConf.to_yaml(cfg.decoding), get_wer_file(cfg) + + # Validates the provided configuration. + if cfg.dataset.max_tokens is None and cfg.dataset.batch_size is None: + cfg.dataset.max_tokens = 4000000 + if not cfg.common.cpu and not torch.cuda.is_available(): + raise ValueError("CUDA not found; set `cpu=True` to run without CUDA") + + logger.info(cfg.common_eval.path) + + with InferenceProcessor(cfg) as processor: + for sample in processor: + processor.process_sample(sample) + + processor.log_generation_time() + + if cfg.decoding.results_path is not None: + processor.merge_shards() + + errs_t, leng_t = processor.total_errors, processor.total_length + + if cfg.common.cpu: + logger.warning("Merging WER requires CUDA.") + elif processor.data_parallel_world_size > 1: + stats = torch.LongTensor([errs_t, leng_t]).cuda() + dist.all_reduce(stats, op=dist.ReduceOp.SUM) + errs_t, leng_t = stats[0].item(), stats[1].item() + + wer = errs_t * 100.0 / leng_t + + if distributed_utils.is_master(cfg.distributed_training): + with open(wer_file, "w") as f: + f.write( + ( + f"WER: {wer}\n" + f"err / num_ref_words = {errs_t} / {leng_t}\n\n" + f"{yaml_str}" + ) + ) + + return wer + + +@hydra.main(config_path=config_path, config_name="infer") +def hydra_main(cfg: InferConfig) -> Union[float, Tuple[float, Optional[float]]]: + container = OmegaConf.to_container(cfg, resolve=True, enum_to_str=True) + cfg = OmegaConf.create(container) + OmegaConf.set_struct(cfg, True) + + if cfg.common.reset_logging: + reset_logging() + + utils.import_user_module(cfg.common) + + # logger.info("Config:\n%s", OmegaConf.to_yaml(cfg)) + wer = float("inf") + + try: + if cfg.common.profile: + with torch.cuda.profiler.profile(): + with torch.autograd.profiler.emit_nvtx(): + distributed_utils.call_main(cfg, main) + else: + distributed_utils.call_main(cfg, main) + + wer = parse_wer(get_wer_file(cfg)) + except BaseException as e: # pylint: disable=broad-except + if not cfg.common.suppress_crashes: + raise + else: + logger.error("Crashed! %s", str(e)) + + logger.info("Word error rate: %.4f", wer) + if cfg.is_ax: + return wer, None + + return wer + + +def cli_main() -> None: + try: + from hydra._internal.utils import ( + get_args, + ) # pylint: disable=import-outside-toplevel + + cfg_name = get_args().config_name or "infer" + except ImportError: + logger.warning("Failed to get config name from hydra args") + cfg_name = "infer" + + cs = ConfigStore.instance() + cs.store(name=cfg_name, node=InferConfig) + + for k in InferConfig.__dataclass_fields__: + if is_dataclass(InferConfig.__dataclass_fields__[k].type): + v = InferConfig.__dataclass_fields__[k].default + cs.store(name=k, node=v) + + hydra_main() # pylint: disable=no-value-for-parameter + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechLM/speechlm/models/__init__.py b/SpeechLM/speechlm/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechLM/speechlm/models/fasttext2unit.py b/SpeechLM/speechlm/models/fasttext2unit.py new file mode 100644 index 0000000..14c27b5 --- /dev/null +++ b/SpeechLM/speechlm/models/fasttext2unit.py @@ -0,0 +1,226 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import torch + +from fairseq import utils +from fairseq.models import ( + FairseqEncoderModel, + register_model, + register_model_architecture, +) +from fairseq.models.text_to_speech import fastspeech2 + +logger = logging.getLogger(__name__) + +class VarianceAdaptor(fastspeech2.VarianceAdaptor): + def __init__(self, args): + super().__init__(args) + self.use_pitch = args.use_pitch + self.use_energe = args.use_energe + + def forward( + self, + x, + padding_mask, + durations=None, + pitches=None, + energies=None, + d_factor=1.0, + p_factor=1.0, + e_factor=1.0, + ): + # x: B x T x C + log_dur_out = self.duration_predictor(x) + dur_out = torch.clamp( + torch.round((torch.exp(log_dur_out) - 1) * d_factor).long(), min=0 + ) + dur_out.masked_fill_(padding_mask, 0) + + if self.use_pitch: + pitch_out, pitch_emb = self.get_pitch_emb(x, pitches, p_factor) + x = x + pitch_emb + else: + pitch_out = None + + if self.use_energe: + energy_out, energy_emb = self.get_energy_emb(x, energies, e_factor) + x = x + energy_emb + else: + energy_out = None + + x, out_lens = self.length_regulator( + x, dur_out if durations is None else durations + ) + + return x, out_lens, log_dur_out, pitch_out, energy_out + + +class FastSpeech2Encoder(fastspeech2.FastSpeech2Encoder): + def __init__(self, args, src_dict, embed_speaker): + super().__init__(args, src_dict, embed_speaker) + self.var_adaptor = VarianceAdaptor(args) + self.apply(fastspeech2.model_init) + +@register_model("fasttext2unit") +class FastText2UnitModel(FairseqEncoderModel): + """ + Implementation for https://arxiv.org/abs/2006.04558 + """ + + NON_AUTOREGRESSIVE = True + + + @staticmethod + def add_args(parser): + parser.add_argument("--dropout", type=float) + parser.add_argument("--output-frame-dim", type=int) + parser.add_argument("--speaker-embed-dim", type=int) + # FFT blocks + parser.add_argument("--fft-hidden-dim", type=int) + parser.add_argument("--fft-kernel-size", type=int) + parser.add_argument("--attention-dropout", type=float) + parser.add_argument("--encoder-layers", type=int) + parser.add_argument("--encoder-embed-dim", type=int) + parser.add_argument("--encoder-attention-heads", type=int) + parser.add_argument("--decoder-layers", type=int) + parser.add_argument("--decoder-embed-dim", type=int) + parser.add_argument("--decoder-attention-heads", type=int) + # variance predictor + parser.add_argument("--var-pred-n-bins", type=int) + parser.add_argument("--var-pred-hidden-dim", type=int) + parser.add_argument("--var-pred-kernel-size", type=int) + parser.add_argument("--var-pred-dropout", type=float) + # postnet + parser.add_argument("--add-postnet", action="store_true") + parser.add_argument("--postnet-dropout", type=float) + parser.add_argument("--postnet-layers", type=int) + parser.add_argument("--postnet-conv-dim", type=int) + parser.add_argument("--postnet-conv-kernel-size", type=int) + # pitch & energe + parser.add_argument("--use-pitch", action="store_true") + parser.add_argument("--use-energe", action="store_true") + + + def __init__(self, encoder, args, src_dict): + super().__init__(encoder) + self._num_updates = 0 + + @classmethod + def build_model(cls, args, task): + embed_speaker = task.get_speaker_embeddings(args) + if args.output_frame_dim == -1: + args.output_frame_dim = len(task.tgt_dict) + encoder = FastSpeech2Encoder(args, task.src_dict, embed_speaker) + return cls(encoder, args, task.src_dict) + + def set_num_updates(self, num_updates): + super().set_num_updates(num_updates) + self._num_updates = num_updates + + def get_normalized_probs(self, net_output, log_probs, sample=None): + logits = net_output[0] + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + +@register_model_architecture("fasttext2unit", "fasttext2unit_s") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.2) + args.output_frame_dim = getattr(args, "output_frame_dim", -1) + args.speaker_embed_dim = getattr(args, "speaker_embed_dim", 256) + # FFT blocks + args.fft_hidden_dim = getattr(args, "fft_hidden_dim", 1024) + args.fft_kernel_size = getattr(args, "fft_kernel_size", 9) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.encoder_layers = getattr(args, "encoder_layers", 4) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 256) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 2) + args.decoder_layers = getattr(args, "decoder_layers", 4) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 256) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 2) + # variance predictor + args.var_pred_n_bins = getattr(args, "var_pred_n_bins", 256) + args.var_pred_hidden_dim = getattr(args, "var_pred_hidden_dim", 256) + args.var_pred_kernel_size = getattr(args, "var_pred_kernel_size", 3) + args.var_pred_dropout = getattr(args, "var_pred_dropout", 0.5) + # postnet + args.add_postnet = getattr(args, "add_postnet", False) + args.postnet_dropout = getattr(args, "postnet_dropout", 0.5) + args.postnet_layers = getattr(args, "postnet_layers", 5) + args.postnet_conv_dim = getattr(args, "postnet_conv_dim", 512) + args.postnet_conv_kernel_size = getattr(args, "postnet_conv_kernel_size", 5) + # pitch & energe + args.use_pitch = getattr(args, "use_pitch", False) + args.use_energe = getattr(args, "use_energe", False) + + +@register_model_architecture("fasttext2unit", "fasttext2unit_m") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.2) + args.output_frame_dim = getattr(args, "output_frame_dim", -1) + args.speaker_embed_dim = getattr(args, "speaker_embed_dim", 256) + # FFT blocks + args.fft_hidden_dim = getattr(args, "fft_hidden_dim", 1024) + args.fft_kernel_size = getattr(args, "fft_kernel_size", 9) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 256) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 2) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 256) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 2) + # variance predictor + args.var_pred_n_bins = getattr(args, "var_pred_n_bins", 256) + args.var_pred_hidden_dim = getattr(args, "var_pred_hidden_dim", 256) + args.var_pred_kernel_size = getattr(args, "var_pred_kernel_size", 3) + args.var_pred_dropout = getattr(args, "var_pred_dropout", 0.5) + # postnet + args.add_postnet = getattr(args, "add_postnet", False) + args.postnet_dropout = getattr(args, "postnet_dropout", 0.5) + args.postnet_layers = getattr(args, "postnet_layers", 5) + args.postnet_conv_dim = getattr(args, "postnet_conv_dim", 512) + args.postnet_conv_kernel_size = getattr(args, "postnet_conv_kernel_size", 5) + # pitch & energe + args.use_pitch = getattr(args, "use_pitch", False) + args.use_energe = getattr(args, "use_energe", False) + + +@register_model_architecture("fasttext2unit", "fasttext2unit_l") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.2) + args.output_frame_dim = getattr(args, "output_frame_dim", -1) + args.speaker_embed_dim = getattr(args, "speaker_embed_dim", 256) + # FFT blocks + args.fft_hidden_dim = getattr(args, "fft_hidden_dim", 1536) + args.fft_kernel_size = getattr(args, "fft_kernel_size", 9) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 384) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 6) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 384) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 6) + # variance predictor + args.var_pred_n_bins = getattr(args, "var_pred_n_bins", 256) + args.var_pred_hidden_dim = getattr(args, "var_pred_hidden_dim", 256) + args.var_pred_kernel_size = getattr(args, "var_pred_kernel_size", 3) + args.var_pred_dropout = getattr(args, "var_pred_dropout", 0.5) + # postnet + args.add_postnet = getattr(args, "add_postnet", False) + args.postnet_dropout = getattr(args, "postnet_dropout", 0.5) + args.postnet_layers = getattr(args, "postnet_layers", 5) + args.postnet_conv_dim = getattr(args, "postnet_conv_dim", 512) + args.postnet_conv_kernel_size = getattr(args, "postnet_conv_kernel_size", 5) + # pitch & energe + args.use_pitch = getattr(args, "use_pitch", False) + args.use_energe = getattr(args, "use_energe", False) diff --git a/SpeechLM/speechlm/models/speechlm.py b/SpeechLM/speechlm/models/speechlm.py new file mode 100644 index 0000000..038fe83 --- /dev/null +++ b/SpeechLM/speechlm/models/speechlm.py @@ -0,0 +1,720 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +from fairseq import utils, checkpoint_utils +from fairseq.data.data_utils import compute_mask_indices +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass import ChoiceEnum +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.transformer import Embedding +from fairseq.file_io import PathManager +from torch import Tensor +from fairseq.models.wav2vec.wav2vec2 import ConvFeatureExtractionModel +from fairseq.modules import GradMultiply, LayerNorm +from fairseq.tasks.hubert_pretraining import ( + HubertPretrainingConfig, + HubertPretrainingTask, +) +from fairseq.models.hubert import HubertConfig +from fairseq.models.transformer import TransformerConfig +from speechlm.modules.w2v_encoder import TransformerEncoder +from speechlm.modules.transformer_encoder import TransformerEncoderBase + +logger = logging.getLogger(__name__) + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +@dataclass + +class SpeechlmConfig(HubertConfig): + use_rel_pos_enc: bool = field( + default=False, + metadata={"help": "whether to use relative positional encoding"}, + ) + scaling_for_att: float = field( + default=1.0, + metadata={"help": "scaling for attention weights to prevent overflow issue (for large model)"}, + ) + + # unit encoder-decoder + text_transformer: TransformerConfig = TransformerConfig() + add_unit_encoder: bool = field( + default=False, + metadata={"help": "add unit encoder"}, + ) + add_decoder: bool = field( + default=False, + metadata={"help": "add decoder"}, + ) + add_text_ctc: bool = field( + default=False, + metadata={"help": "add_text_ctc head"}, + ) + text_ctc_conv_kernel: int = field( + default=2, + metadata={"help": "text_ctc_conv kernel size"}, + ) + mask_u2t: bool = field( + default=True, + metadata={"help": "mask the unit input in unit-to-text task"}, + ) + compute_mum: bool = field( + default=False, + metadata={"help": "compute MLM loss in unit-to-text task"}, + ) + + # embedding mixing + mix_with_unit: bool = field( + default=True, + metadata={"help": "mix with the unit embeddings"}, + ) + use_pred_unit: bool = field( + default=False, + metadata={"help": "use the embeddings of predicted units"}, + ) + l2_embedding: bool = field( + default=False, + metadata={"help": "compute l2 loss between unit embedding and unit hidden state"}, + ) + + # Finetune related + encoder_dict_size: int = field( + default=-1, + metadata={"help": "text encoder dictionary dimension"}, + ) + + decoder_dict_size: int = field( + default=-1, + metadata={"help": "decoder dictionary dimension"}, + ) + + +@register_model("speechlm", dataclass=SpeechlmConfig) +class SpeechlmModel(BaseFairseqModel): + def __init__( + self, + cfg: SpeechlmConfig, + task_cfg: HubertPretrainingConfig, + dictionaries: List[Dictionary], + unit_dictionary: Dictionary = None, + text_tgt_dictionary: Dictionary = None, + ) -> None: + super().__init__() + logger.info(f"SpeechlmModel Config: {cfg}") + + feature_enc_layers = eval(cfg.conv_feature_layers) # noqa + self.embed = feature_enc_layers[-1][0] + + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + mode=cfg.extractor_mode, + conv_bias=cfg.conv_bias, + ) + feature_ds_rate = np.prod([s for _, _, s in feature_enc_layers]) + self.feat2tar_ratio = cfg.label_rate * feature_ds_rate / task_cfg.sample_rate + + self.post_extract_proj = ( + nn.Linear(self.embed, cfg.encoder_embed_dim) + if self.embed != cfg.encoder_embed_dim + else None + ) + + self.mask_prob = cfg.mask_prob + self.mask_selection = cfg.mask_selection + self.mask_other = cfg.mask_other + self.mask_length = cfg.mask_length + self.no_mask_overlap = cfg.no_mask_overlap + self.mask_min_space = cfg.mask_min_space + + self.mask_channel_prob = cfg.mask_channel_prob + self.mask_channel_selection = cfg.mask_channel_selection + self.mask_channel_other = cfg.mask_channel_other + self.mask_channel_length = cfg.mask_channel_length + self.no_mask_channel_overlap = cfg.no_mask_channel_overlap + self.mask_channel_min_space = cfg.mask_channel_min_space + + self.dropout_input = nn.Dropout(cfg.dropout_input) + self.dropout_features = nn.Dropout(cfg.dropout_features) + + self.feature_grad_mult = cfg.feature_grad_mult + self.logit_temp = cfg.logit_temp + self.skip_masked = cfg.skip_masked + self.skip_nomask = cfg.skip_nomask + + final_dim = cfg.final_dim if cfg.final_dim > 0 else cfg.encoder_embed_dim + + self.mask_emb = nn.Parameter( + torch.FloatTensor(cfg.encoder_embed_dim).uniform_() + ) + + self.encoder = TransformerEncoder(cfg) + self.layer_norm = LayerNorm(self.embed) + + self.target_glu = None + if cfg.target_glu: + self.target_glu = nn.Sequential( + nn.Linear(final_dim, final_dim * 2), nn.GLU() + ) + + self.final_dim = final_dim + assert len(dictionaries) <= 2, f"Only support <=2 kinds of targets, get {len(dictionaries)} dictionaries" + if len(dictionaries) == 1: + dictionaries = [dictionaries[0], dictionaries[0]] + + self.final_proj_list = nn.ModuleList([ + nn.Linear(cfg.encoder_embed_dim, final_dim) for _ in dictionaries + ]) + + self.num_classes = [len(d) for d in dictionaries] + self.label_embs_list = nn.ParameterList([ + nn.Parameter(torch.FloatTensor(n, final_dim)) for n in self.num_classes + ]) + for i in range(len(self.num_classes)): + nn.init.uniform_(self.label_embs_list[i]) + + ### build unit encoder: + self.mask_u2t = cfg.mask_u2t + self.compute_mum = cfg.compute_mum + self.add_text_ctc = cfg.add_text_ctc + self.text_ctc_conv_kernel = cfg.text_ctc_conv_kernel + self.padding_idx = unit_dictionary.pad() + self.unit_mask_idx = unit_dictionary.index("") + + self.add_unit_encoder = cfg.add_unit_encoder + self.mix_with_unit = cfg.mix_with_unit + self.use_pred_unit = cfg.use_pred_unit + self.l2_embedding = cfg.l2_embedding + if self.add_unit_encoder: + assert len(unit_dictionary) == self.num_classes[0], f"unit_dictionary: {len(unit_dictionary)}, self.num_classes[0]: {self.num_classes[0]}" + ### build unit pre-net, and shared with hubert label_embs if needed (default: False) + self.unit_embed_tokens = self.build_embedding( + unit_dictionary, + cfg.text_transformer.encoder.embed_dim, + ) + if self.final_dim == cfg.text_transformer.encoder.embed_dim: + logger.info("Share label_embs[0] with unit_embed_tokens ...") + nn.init.uniform_(self.unit_embed_tokens.weight) + self.label_embs_list[0] = self.unit_embed_tokens.weight + + ### build unit encoder + self.unit_encoder = TransformerEncoderBase( + cfg.text_transformer, + unit_dictionary, + self.unit_embed_tokens, + use_rel_pos_enc=cfg.use_rel_pos_enc, + scaling_for_att=cfg.scaling_for_att, + ) + + ### build text ctc head + if self.add_text_ctc: + conv = nn.Conv1d( + cfg.text_transformer.encoder.embed_dim, cfg.text_transformer.encoder.embed_dim, + self.text_ctc_conv_kernel, + stride=self.text_ctc_conv_kernel // 2, + bias=False, + padding=self.text_ctc_conv_kernel // 2, + ) + nn.init.kaiming_normal_(conv.weight) + self.unit_encoder_ctc_head = nn.Sequential( + Rotate3D(), + conv, + nn.Dropout(p=0.1), + nn.Sequential( + Rotate3D(), + Rotate3D(), + LayerNorm(cfg.text_transformer.encoder.embed_dim), + ), + nn.GELU(), + nn.Linear(cfg.text_transformer.encoder.embed_dim, len(text_tgt_dictionary)), + ) + + ### build unit2text decoder, not available for now + self.add_decoder = cfg.add_decoder + + def build_embedding(self, dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechlmConfig, task: HubertPretrainingTask): + """Build a new model instance.""" + unit_dictionary = getattr(task, "text_src_dictionary", None) + text_tgt_dictionary = getattr(task, "text_dictionary", None) + model = SpeechlmModel(cfg, task.cfg, task.dictionaries, unit_dictionary, text_tgt_dictionary) + return model + + def apply_mask(self, x, padding_mask, target_list): + B, T, C = x.shape + if self.mask_prob > 0: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob, + self.mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x[mask_indices] = self.mask_emb + else: + mask_indices = None + + if self.mask_channel_prob > 0: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + return x, mask_indices + + def forward_features(self, source: torch.Tensor) -> torch.Tensor: + if self.feature_grad_mult > 0: + features = self.feature_extractor(source) + if self.feature_grad_mult != 1.0: + features = GradMultiply.apply(features, self.feature_grad_mult) + else: + with torch.no_grad(): + features = self.feature_extractor(source) + return features + + def forward_targets( + self, + features: torch.Tensor, + target_list: List[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + # Trim features to ensure labels exist and then get aligned labels + feat_tsz = features.size(2) + targ_tsz = min([t.size(1) for t in target_list]) + if self.feat2tar_ratio * feat_tsz > targ_tsz: + feat_tsz = int(targ_tsz / self.feat2tar_ratio) + features = features[..., :feat_tsz] + target_inds = torch.arange(feat_tsz).float() * self.feat2tar_ratio + target_inds += np.random.choice(int(self.feat2tar_ratio)) + target_list = [t[:, target_inds.long()] for t in target_list] + return features, target_list + + def forward_padding_mask( + self, + features: torch.Tensor, + padding_mask: torch.Tensor, + ) -> torch.Tensor: + extra = padding_mask.size(1) % features.size(1) + if extra > 0: + padding_mask = padding_mask[:, :-extra] + padding_mask = padding_mask.view(padding_mask.size(0), features.size(1), -1) + padding_mask = padding_mask.all(-1) + return padding_mask + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def downsample_ctc_padding_mask(self, padding_mask): + """ + padding_mask: (B, T) + """ + stride = self.text_ctc_conv_kernel // 2 + return padding_mask[:, ::stride] + + def compute_pred(self, proj_x, label_embs): + if self.target_glu: + label_embs = self.target_glu(label_embs) + x = F.normalize(proj_x.float(), dim=-1) # (S, D) + label_embs = F.normalize(label_embs.float(), dim=-1) # (C, D) + logits = torch.matmul(x, label_embs.T).type_as(proj_x) # (S, C) + logits /= self.logit_temp + return logits + + def compute_hubert_logits(self, x, target, proj, label_embs, padding_mask, mask_indices): + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = proj(x[masked_indices]) + logit_m_list = [(self.compute_pred(proj_x_m, label_embs), target[masked_indices])] + else: + logit_m_list = [None] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = proj(x[nomask_indices]) + logit_u_list = [(self.compute_pred(proj_x_u, label_embs), target[nomask_indices])] + else: + logit_u_list = [None] + + return logit_m_list, logit_u_list + + def convert_embeddings(self, + x, + padding_mask, + target=None, + mask_indices=None, + mix_with_unit=False, + use_pred_unit=False, + l2_embedding=False, + remask=False + ): + """ + 1. Mix with units if needed (default: True) + 2. Prepare for unit_encoder inputs + Inputs: + x, (B, T, D) + Return: + src_tokens, (B, T) + soft_embeddings, (B, T, D) + l2_loss, a loss + """ + soft_embeddings = self.final_proj_list[0](x) if x.size(-1) == self.final_dim else x + if padding_mask is None: + padding_mask = soft_embeddings.new_zeros(soft_embeddings.size(0), soft_embeddings.size(1), dtype=torch.long) + if use_pred_unit: + src_tokens = self.compute_pred(self.final_proj_list[0](x), self.label_embs_list[0]).argmax(dim=-1) + src_tokens[padding_mask] = self.padding_idx + elif target is not None: + src_tokens = target + else: + src_tokens = padding_mask.long() + + if l2_embedding | mix_with_unit: + unit_embeddings = self.unit_embed_tokens(src_tokens) # (B, T, D) + + l2_loss = 0 + if l2_embedding: + if mask_indices is not None: + l2_loss = (soft_embeddings - unit_embeddings)[mask_indices].float().pow(2).mean(dim=-1) + scale = unit_embeddings[mask_indices].float().pow(2).sum(dim=-1) + else: + l2_loss = (soft_embeddings - unit_embeddings).float().pow(2).mean(dim=-1) + scale = unit_embeddings.float().pow(2).sum(dim=-1) + l2_loss = (l2_loss / scale).mean() + + if mix_with_unit: + B, T, D = x.shape + selected_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob / 2, + self.mask_length // 2, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + selected_indices = torch.from_numpy(selected_indices).to(x.device) + if mask_indices is not None: + if remask: + remask_indices = torch.logical_and(selected_indices, mask_indices) + soft_embeddings[remask_indices] = self.mask_emb + swap_indices = torch.logical_and(selected_indices, ~mask_indices) + else: + swap_indices = selected_indices + soft_embeddings[swap_indices] = unit_embeddings[swap_indices] + + soft_embeddings = soft_embeddings * (1 - padding_mask.unsqueeze(-1).type_as(x)) + return src_tokens, soft_embeddings, l2_loss + + def forward( + self, + source: torch.Tensor = None, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert source is not None or src_tokens is not None + if source is not None: + return self.forward_speech( + source=source, + target_list=target_list, + padding_mask=padding_mask, + mask=mask, + features_only=features_only, + output_layer=output_layer, + ) + else: + return self.forward_text( + src_tokens=src_tokens, + src_lengths=src_lengths, + mask=self.mask_u2t, + output_layer=output_layer, + ) + + def forward_speech( + self, + source: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + features = self.forward_features(source) + if target_list is not None: + features, target_list = self.forward_targets(features, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + if mask: + x, mask_indices = self.apply_mask(features, padding_mask, target_list) + else: + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1, + ) + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features} + + logit_m_list, logit_u_list = self.compute_hubert_logits( + x, + target_list[0], + self.final_proj_list[0], + self.label_embs_list[0], + padding_mask, + mask_indices, + ) + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + + if self.add_unit_encoder: + src_tokens, x_emb, l2_loss = self.convert_embeddings( + x, + padding_mask, target_list[0], + mask_indices=mask_indices, + mix_with_unit=self.mix_with_unit, + use_pred_unit=self.use_pred_unit, + l2_embedding=self.l2_embedding, + ) + encoder_out = self.unit_encoder(src_tokens, token_embeddings=x_emb) + + result['encoder_out'] = encoder_out['encoder_out'] # [(T, B, D)] + result['encoder_padding_mask'] = encoder_out['encoder_padding_mask'] # [(B, T)] + if self.l2_embedding: + result['embedding_l2_loss'] = l2_loss + + code_logit_m_list, code_logit_u_list = self.compute_hubert_logits( + encoder_out['encoder_out'][0].transpose(0, 1), + target_list[-1], + self.final_proj_list[-1], + self.label_embs_list[-1], + padding_mask, + mask_indices, + ) + result['logit_m_list'] += code_logit_m_list + result['logit_u_list'] += code_logit_u_list + return result + + def forward_text( + self, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + mask: bool = True, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert self.add_unit_encoder, f"Can not forward unit-text branch without unit_encoder!" + + padding_mask = src_tokens == self.padding_idx + unit_embeddings = self.unit_embed_tokens(src_tokens) + if mask: + unit_embeddings, mask_indices = self.apply_mask(unit_embeddings, padding_mask, [src_tokens]) + else: + ### If already applied mask on src_tokens, then the target_list should contains many padding_idx + mask_indices = target_list[-1] != self.padding_idx + unit_embeddings[mask_indices] = self.mask_emb + + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=unit_embeddings, + return_all_hiddens=output_layer is not None, + ) + + result = {} + result["encoder_out"] = encoder_out["encoder_out"] + result["encoder_states"] = encoder_out["encoder_states"] + result["padding_mask"] = padding_mask + + if self.compute_mum: + code_logit_m_list, code_logit_u_list = self.compute_hubert_logits( + encoder_out["encoder_out"].transpose(0, 1), + target_list[-1], + self.final_proj_list[-1], + self.label_embs_list[-1], + padding_mask, + mask_indices, + ) + result["logit_m_list"] = code_logit_m_list + result["logit_u_list"] = code_logit_u_list + + if self.add_text_ctc: + result["encoder_out_ctc"] = [self.unit_encoder_ctc_head(x) for x in encoder_out['encoder_out']] + result["encoder_padding_mask"] = [ + self.downsample_ctc_padding_mask(padding_mask) for padding_mask in encoder_out['encoder_padding_mask'] + ] + return result + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + **kwargs, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Extract features for only speech input""" + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + x = res["x"] # B x T x D + padding_mask = res["padding_mask"] + + if self.add_unit_encoder: + src_tokens, x, _ = self.convert_embeddings( + x, + padding_mask, + mix_with_unit=False, + use_pred_unit=False, + ) + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=x, + return_all_hiddens=output_layer is not None + ) + res["x"] = encoder_out['encoder_out'][0].transpose(0, 1) # (B, T, D) + + feature = res["features"] if ret_conv else res["x"] + if output_layer is not None: + feature = encoder_out['encoder_states'] + + return feature, padding_mask + + def get_logits(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + logits_list = [x[0].float() for x in logits_list if x is not None] + return logits_list + + def get_targets(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + targets_list = [x[1].long() for x in logits_list if x is not None] + return targets_list + + def get_extra_losses(self, net_output): + extra_losses = [] + names = [] + + if "features_pen" in net_output: + extra_losses.append(net_output["features_pen"]) + names.append("features_pen") + + if "embedding_l2_loss" in net_output: + extra_losses.append(net_output["embedding_l2_loss"]) + names.append("embedding_l2_loss") + + return extra_losses, names + + def remove_pretraining_modules(self, step2=False): + self.target_glu = None + + def load_checkpoint(self, checkpoint: str): + if not PathManager.exists(checkpoint): + raise IOError("Model file not found: {}".format(checkpoint)) + state = checkpoint_utils.load_checkpoint_to_cpu(checkpoint) + return state + +class Rotate3D(nn.Module): + """ + (T, B, D) --> (B, D, T) --> (D, T, B) --> (T, B, D) + """ + def __init__(self): + super().__init__() + + def forward(self, x): + return x.permute(1, 2, 0) diff --git a/SpeechLM/speechlm/models/speechlm_ctcasr.py b/SpeechLM/speechlm/models/speechlm_ctcasr.py new file mode 100644 index 0000000..642a51d --- /dev/null +++ b/SpeechLM/speechlm/models/speechlm_ctcasr.py @@ -0,0 +1,56 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +from dataclasses import dataclass +from fairseq.models import BaseFairseqModel, register_model +from fairseq.tasks import FairseqTask + +from fairseq.models.hubert import HubertAsrConfig, HubertCtc, HubertEncoder + +@dataclass +class SpeechLMCtcConfig(HubertAsrConfig): + pass + + +@register_model("speechlm_ctc", dataclass=SpeechLMCtcConfig) +class SpeechLMCtc(HubertCtc): + def __init__(self, cfg: SpeechLMCtcConfig, w2v_encoder: BaseFairseqModel): + super().__init__(cfg, w2v_encoder) + + @classmethod + def build_model(cls, cfg: SpeechLMCtcConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = SpeechLMEncoder(cfg, task) + return cls(cfg, w2v_encoder) + + +class SpeechLMEncoder(HubertEncoder): + def __init__(self, cfg: HubertAsrConfig, task): + super().__init__(cfg, task) + + if (task.target_dictionary is not None) and ( + hasattr(self.w2v_model, "unit_encoder_ctc_head") + ): + self.proj = self.w2v_model.unit_encoder_ctc_head + self.conv_ctc_proj = True + else: + self.conv_ctc_proj = False + + def forward(self, source, padding_mask, tbc=True, **kwargs): + results = super().forward( + source, + padding_mask, + tbc, + **kwargs, + ) + if self.conv_ctc_proj: + padding_mask = self.w2v_model.downsample_ctc_padding_mask(results["padding_mask"]) + results["encoder_padding_mask"] = padding_mask + results["padding_mask"] = padding_mask + return results diff --git a/SpeechLM/speechlm/models/speechlm_st.py b/SpeechLM/speechlm/models/speechlm_st.py new file mode 100644 index 0000000..6f70c54 --- /dev/null +++ b/SpeechLM/speechlm/models/speechlm_st.py @@ -0,0 +1,268 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import contextlib +import torch +import torch.nn as nn +from argparse import Namespace +from dataclasses import dataclass, field +from typing import Any +from fairseq import checkpoint_utils, tasks, utils +from fairseq.models import FairseqEncoderDecoderModel, register_model +from fairseq.models.fairseq_decoder import FairseqDecoder +from fairseq.models.fairseq_encoder import FairseqEncoder +from fairseq.tasks import FairseqTask +from fairseq.dataclass import ChoiceEnum +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.data.data_utils import lengths_to_padding_mask + +from fairseq.models.hubert import HubertAsrConfig +from speechlm.modules.transformer_decoder import TransformerDecoderScriptable + +@dataclass +class SpeechLMS2TConfig(HubertAsrConfig): + activation_fn: ChoiceEnum(utils.get_available_activation_fns()) = field( + default="gelu", metadata={"help": "activation function to use"} + ) + use_rel_pos_enc: bool = field( + default=True, + metadata={"help": "whether to use relative positional encoding for decoder"}, + ) + encoder_embed_dim: int = field( + default=768, metadata={"help": "encoder embedding dimension, used for enc-dec att"} + ) + decoder_embed_dim: int = field( + default=768, metadata={"help": "decoder embedding dimension"} + ) + decoder_output_dim: int = field( + default=768, metadata={"help": "decoder output dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_layers: int = field(default=6, metadata={"help": "num of decoder layers"}) + decoder_layerdrop: float = field( + default=0.0, metadata={"help": "decoder layerdrop chance"} + ) + decoder_attention_heads: int = field( + default=12, metadata={"help": "num decoder attention heads"} + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "use learned positional embeddings in the decoder"}, + ) + decoder_normalize_before: bool = field( + default=False, metadata={"help": "apply layernorm before each decoder block"} + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={ + "help": "if set, disables positional embeddings (outside self attention)" + }, + ) + decoder_dropout: float = field( + default=0.0, metadata={"help": "dropout probability in the decoder"} + ) + decoder_attention_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability for attention weights inside the decoder" + }, + ) + decoder_activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN inside the decoder" + }, + ) + share_decoder_input_output_embed: bool = field( + default=False, metadata={"help": "share decoder input and output embeddings"} + ) + ### the following config is only for the compatibility to fairseq speech_to_text task + input_feat_per_channel: Any = None + input_channels: Any = None + speaker_to_id: Any = None + +@register_model("speechlm_st_legacy", dataclass=SpeechLMS2TConfig) +class SpeechLMS2T(FairseqEncoderDecoderModel): + def __init__(self, cfg: SpeechLMS2TConfig, encoder: FairseqEncoder, decoder: FairseqDecoder): + super().__init__(encoder, decoder) + self.cfg = cfg + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechLMS2TConfig, task: FairseqTask): + """Build a new model instance.""" + def build_embedding(dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + src_dict, tgt_dict = task.source_dictionary, task.target_dictionary + encoder = SpeechLMEncoder(cfg, task) + assert cfg.encoder_embed_dim == encoder.w2v_model.encoder.embedding_dim + decoder_embed_tokens = build_embedding(tgt_dict, cfg.decoder_embed_dim) + decoder = TransformerDecoderScriptable(cfg, tgt_dict, decoder_embed_tokens) + return cls(cfg, encoder, decoder) + + +class SpeechLMEncoder(FairseqEncoder): + """ + Modified from fairseq.models.hubert.hubert_asr.HubertEncoder + 1. make it compatible with fairseq speech_to_text task + 2. make it compatible with encoder-decoder model + """ + def __init__(self, cfg: HubertAsrConfig, task): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + assert task.data_cfg.standardize_audio() == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + w2v_args.task.data = cfg.data + pretrain_task = tasks.setup_task(w2v_args.task) + if state is not None and "task_state" in state: + # This will load the stored "dictionaries" object + pretrain_task.load_state_dict(state["task_state"]) + else: + pretrain_task.load_state_dict(task.state_dict()) + + model = pretrain_task.build_model(w2v_args.model, from_checkpoint=True) + if state is not None and not cfg.no_pretrained_weights: + # set strict=False because we omit some modules + model.load_state_dict(state["model"], strict=False) + + model.remove_pretraining_modules() + + super().__init__(pretrain_task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.num_updates = 0 + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, src_tokens=None, src_lengths=None, **kwargs): + + w2v_args = { + "source": src_tokens, + "padding_mask": lengths_to_padding_mask(src_lengths), + "mask": self.apply_mask and self.training, + } + + ft = self.freeze_finetune_updates <= self.num_updates + + with torch.no_grad() if not ft else contextlib.ExitStack(): + x, padding_mask = self.w2v_model.extract_features(**w2v_args) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [padding_mask], # B x T + "padding_mask": [padding_mask], + } + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + _net_input = { + "source": net_input["src_tokens"], + "padding_mask": lengths_to_padding_mask(net_input["src_lengths"]), + "mask": False, + } + + x, padding_mask = self.w2v_model.extract_features(**_net_input) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + encoder_out = { + "encoder_out" : [x], + "encoder_padding_mask" : [padding_mask], + } + return encoder_out + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = [ + x.index_select(1, new_order) for x in encoder_out["encoder_out"] + ] + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = [ + x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"] + ] + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim**-0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/SpeechLM/speechlm/modules/__init__.py b/SpeechLM/speechlm/modules/__init__.py new file mode 100644 index 0000000..7cc0824 --- /dev/null +++ b/SpeechLM/speechlm/modules/__init__.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +from .multihead_attention import MultiheadAttention +from .relative_pos_enc import RelativePositionalEncoding +from .transformer_layer import TransformerEncoderLayerBase, TransformerDecoderLayerBase +from .w2v_encoder import TransformerEncoder, TransformerSentenceEncoderLayer +from .learned_positional_embedding import LearnedPositionalEmbedding + +__all__ = [ + "MultiheadAttention", + "RelativePositionalEncoding", + "TransformerEncoderLayerBase", + "TransformerDecoderLayerBase", + "TransformerEncoder", + "TransformerSentenceEncoderLayer" +] diff --git a/SpeechLM/speechlm/modules/learned_positional_embedding.py b/SpeechLM/speechlm/modules/learned_positional_embedding.py new file mode 100644 index 0000000..9a6d55a --- /dev/null +++ b/SpeechLM/speechlm/modules/learned_positional_embedding.py @@ -0,0 +1,68 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/modules/learned_positional_embedding.py + 1. Add clamping if the input length exceeds the max-source-tokens +""" + +from typing import Dict, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + + +class LearnedPositionalEmbedding(nn.Embedding): + """ + This module learns positional embeddings up to a fixed maximum size. + Padding ids are ignored by either offsetting based on padding_idx + or by setting padding_idx to None and ensuring that the appropriate + position ids are passed to the forward function. + """ + + def __init__(self, num_embeddings: int, embedding_dim: int, padding_idx: int): + super().__init__(num_embeddings, embedding_dim, padding_idx) + self.onnx_trace = False + if self.padding_idx is not None: + self.max_positions = self.num_embeddings - self.padding_idx - 1 + else: + self.max_positions = self.num_embeddings + + def forward( + self, + input: Tensor, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + positions: Optional[Tensor] = None, + ): + """Input is expected to be of size [bsz x seqlen].""" + assert (positions is None) or ( + self.padding_idx is None + ), "If positions is pre-computed then padding_idx should not be set." + + if positions is None: + if incremental_state is not None: + # positions is the same for every token when decoding a single step + # Without the int() cast, it doesn't work in some cases when exporting to ONNX + positions = torch.zeros( + (1, 1), device=input.device, dtype=input.dtype + ).fill_(int(self.padding_idx + input.size(1))) + else: + positions = utils.make_positions( + input, self.padding_idx, onnx_trace=self.onnx_trace + ) + positions = torch.clamp(positions, max=self.padding_idx + self.max_positions) + return F.embedding( + positions, + self.weight, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) diff --git a/SpeechLM/speechlm/modules/multihead_attention.py b/SpeechLM/speechlm/modules/multihead_attention.py new file mode 100644 index 0000000..a6ac408 --- /dev/null +++ b/SpeechLM/speechlm/modules/multihead_attention.py @@ -0,0 +1,348 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + +from fairseq.modules import MultiheadAttention as FairseqMultiheadAttention + + +class MultiheadAttention(FairseqMultiheadAttention): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + scaling_for_att=1.0 + ): + super().__init__( + embed_dim, + num_heads, + kdim, + vdim, + dropout, + bias, + add_bias_kv, + add_zero_attn, + self_attention, + encoder_decoder_attention, + q_noise, + qn_block_size, + ) + self.scaling_for_att = scaling_for_att + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + position_bias: Optional[Tensor] = None, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim, f"query dim {embed_dim} != {self.embed_dim}" + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + and position_bias is None + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + q *= (1 / self.scaling_for_att) + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + if position_bias is not None: ## first order + ## position_bias: [241, 241, 64] + #print ("attn_weights: ", attn_weights.size()) # [492, 241, 241] + reshape_q = q.contiguous().view(bsz * self.num_heads, -1, self.head_dim).transpose(0,1) #[241, 492, 64] + #print ("reshape_q: ", reshape_q.size()) + B = torch.matmul(reshape_q, position_bias.transpose(-2, -1)) + #print ("B: ", B.size()) ## [241, 492, 241] + #B = B.transpose(0, 1).view(bsz, self.num_heads, position_bias.size(0), position_bias.size(1)) + B = B.transpose(0, 1).view(bsz*self.num_heads, position_bias.size(0), position_bias.size(1)) + #print ("B 2: ", B.size()) + attn_weights += B + + attn_weights *= self.scaling_for_att + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if self.scaling_for_att > 1.0: + attn_weights = attn_weights - attn_weights.detach().max(dim=-1, keepdim=True)[0] + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights diff --git a/SpeechLM/speechlm/modules/relative_pos_enc.py b/SpeechLM/speechlm/modules/relative_pos_enc.py new file mode 100644 index 0000000..2a073eb --- /dev/null +++ b/SpeechLM/speechlm/modules/relative_pos_enc.py @@ -0,0 +1,35 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import torch + +class RelativePositionalEncoding(torch.nn.Module): + def __init__(self, d_model, maxlen=1000, embed_v=False): + super(RelativePositionalEncoding, self).__init__() + + self.d_model = d_model + self.maxlen = maxlen + self.pe_k = torch.nn.Embedding(2*maxlen, d_model) + if embed_v: + self.pe_v = torch.nn.Embedding(2*maxlen, d_model) + self.embed_v = embed_v + + + def forward(self, pos_seq, incremental_state=None): + pos_seq[pos_seq < -self.maxlen] = -self.maxlen + pos_seq[pos_seq >= self.maxlen] = self.maxlen - 1 + pos_seq = pos_seq + self.maxlen + + if incremental_state is not None: + pos_seq = pos_seq[-1:] + + if self.embed_v: + return self.pe_k(pos_seq), self.pe_v(pos_seq) + else: + return self.pe_k(pos_seq), None diff --git a/SpeechLM/speechlm/modules/transformer_decoder.py b/SpeechLM/speechlm/modules/transformer_decoder.py new file mode 100644 index 0000000..83e91fa --- /dev/null +++ b/SpeechLM/speechlm/modules/transformer_decoder.py @@ -0,0 +1,544 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/transformer/transformer_decoder.py +""" + +import math +from typing import Any, Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqIncrementalDecoder +from fairseq.models.transformer import TransformerConfig +from fairseq.modules import ( + AdaptiveSoftmax, + BaseLayer, + FairseqDropout, + LayerDropModuleList, + LayerNorm, + PositionalEmbedding, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor + +from speechlm.modules import transformer_layer +from speechlm.modules.relative_pos_enc import RelativePositionalEncoding + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerDecoderBase": + return "TransformerDecoder" + else: + return module_name + + +class TransformerDecoderBase(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *cfg.decoder.layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + use_rel_pos_enc=False, + ): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.decoder_layerdrop = cfg.decoder.layerdrop + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = cfg.decoder.embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = cfg.decoder.output_dim + + self.padding_idx = embed_tokens.padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + self.max_target_positions, + embed_dim, + self.padding_idx, + learned=cfg.decoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + self.cross_self_attention = cfg.cross_self_attention + + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.layers.extend( + [ + self.build_decoder_layer(cfg, no_encoder_attn) + for _ in range(cfg.decoder.layers) + ] + ) + self.num_layers = len(self.layers) + + if cfg.decoder.normalize_before and not cfg.no_decoder_final_norm: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not cfg.tie_adaptive_weights + else None + ) + + self.adaptive_softmax = None + self.output_projection = output_projection + if self.output_projection is None: + self.build_output_projection(cfg, dictionary, embed_tokens) + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.decoder.attention_heads, 24) + + def build_output_projection(self, cfg, dictionary, embed_tokens): + if cfg.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(cfg.adaptive_softmax_cutoff, type=int), + dropout=cfg.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if cfg.tie_adaptive_weights else None, + factor=cfg.adaptive_softmax_factor, + tie_proj=cfg.tie_adaptive_proj, + ) + elif self.share_input_output_embed: + self.output_projection = nn.Linear( + self.embed_tokens.weight.shape[1], + self.embed_tokens.weight.shape[0], + bias=False, + ) + self.output_projection.weight = self.embed_tokens.weight + else: + self.output_projection = nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + num_base_layers = cfg.base_layers + for i in range(num_base_layers): + self.layers.insert( + ((i + 1) * cfg.decoder.layers) // (num_base_layers + 1), + BaseLayer(cfg), + ) + + def build_decoder_layer(self, cfg, no_encoder_attn=False): + layer = transformer_layer.TransformerDecoderLayerBase(cfg, no_encoder_attn, has_relative_attention_bias=self.use_rel_pos_enc) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + ) + + if not features_only: + x = self.output_layer(x) + return x, extra + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + return self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + + """ + A scriptable subclass of this class has an extract_features method and calls + super().extract_features, but super() is not supported in torchscript. A copy of + this function is made to be used in the subclass instead. + """ + + def extract_features_scriptable( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs, slen = prev_output_tokens.size() + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + pos_seq = torch.arange(0, slen).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, _ = self.pos_emb(pos_seq, incremental_state) + else: + pos_k = None + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + pos_bias=pos_k, + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def output_layer(self, features): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection(features) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim])), 1 + ) + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + if f"{name}.output_projection.weight" not in state_dict: + if self.share_input_output_embed: + embed_out_key = f"{name}.embed_tokens.weight" + else: + embed_out_key = f"{name}.embed_out" + if embed_out_key in state_dict: + state_dict[f"{name}.output_projection.weight"] = state_dict[ + embed_out_key + ] + if not self.share_input_output_embed: + del state_dict[embed_out_key] + + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + +class TransformerDecoderBaseScriptable(TransformerDecoderBase): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None + + +class TransformerDecoder(TransformerDecoderBase): + def __init__( + self, + args, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + ): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + no_encoder_attn=no_encoder_attn, + output_projection=output_projection, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + ) + + def build_output_projection(self, args, dictionary, embed_tokens): + super().build_output_projection( + TransformerConfig.from_namespace(args), dictionary, embed_tokens + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + return super().build_decoder_layer( + TransformerConfig.from_namespace(args), no_encoder_attn=no_encoder_attn + ) + +class TransformerDecoderScriptable(TransformerDecoder): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None diff --git a/SpeechLM/speechlm/modules/transformer_encoder.py b/SpeechLM/speechlm/modules/transformer_encoder.py new file mode 100644 index 0000000..43dc7f8 --- /dev/null +++ b/SpeechLM/speechlm/modules/transformer_encoder.py @@ -0,0 +1,403 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import math +from typing import Dict, List, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqEncoder +from fairseq.modules import ( + FairseqDropout, + LayerDropModuleList, + LayerNorm, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor +from fairseq.models.transformer import ( + TransformerConfig, +) + + +from speechlm.modules import transformer_layer, LearnedPositionalEmbedding +from speechlm.modules.relative_pos_enc import RelativePositionalEncoding + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerEncoderBase": + return "TransformerEncoder" + else: + return module_name + + +class TransformerEncoderBase(FairseqEncoder): + """ + Transformer encoder consisting of *cfg.encoder.layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, cfg, dictionary, embed_tokens, use_rel_pos_enc=False, scaling_for_att=1.0): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.encoder_layerdrop = cfg.encoder.layerdrop + + embed_dim = embed_tokens.embedding_dim + self.padding_idx = embed_tokens.padding_idx + self.max_source_positions = cfg.max_source_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + self.embed_positions = ( + PositionalEmbedding( + cfg.max_source_positions, + embed_dim, + self.padding_idx, + learned=cfg.encoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + if self.encoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.encoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.scaling_for_att = scaling_for_att + self.layers.extend( + [self.build_encoder_layer(cfg) for i in range(cfg.encoder.layers)] + ) + self.num_layers = len(self.layers) + + if cfg.encoder.normalize_before: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.encoder.attention_heads, 160) + + def build_encoder_layer(self, cfg): + layer = transformer_layer.TransformerEncoderLayerBase(cfg, has_relative_attention_bias=self.use_rel_pos_enc, scaling_for_att=self.scaling_for_att) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward_embedding( + self, src_tokens, token_embedding: Optional[torch.Tensor] = None + ): + # embed tokens and positions + if token_embedding is None: + token_embedding = self.embed_tokens(src_tokens) + x = embed = self.embed_scale * token_embedding + if self.embed_positions is not None: + x = embed + self.embed_positions(src_tokens) + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + x = self.dropout_module(x) + if self.quant_noise is not None: + x = self.quant_noise(x) + return x, embed + + def forward( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + return self.forward_scriptable( + src_tokens, src_lengths, return_all_hiddens, token_embeddings, uniformity_layers + ) + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def forward_scriptable( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + # compute padding mask + encoder_padding_mask = src_tokens.eq(self.padding_idx) + has_pads = src_tokens.device.type == "xla" or encoder_padding_mask.any() + + x, encoder_embedding = self.forward_embedding(src_tokens, token_embeddings) + + # account for padding while computing the representation + if has_pads: + x = x * (1 - encoder_padding_mask.unsqueeze(-1).type_as(x)) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + encoder_states = [] + uniformity_hiddens = [] + + if return_all_hiddens: + encoder_states.append(x) + + if uniformity_layers is not None and 0 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + + # encoder layers + for i, layer in enumerate(self.layers): + x = layer( + x, encoder_padding_mask=encoder_padding_mask if has_pads else None, + pos_bias=pos_k, + ) + if uniformity_layers is not None and i+1 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + if return_all_hiddens: + assert encoder_states is not None + encoder_states.append(x) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `forward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + src_lengths = ( + src_tokens.ne(self.padding_idx) + .sum(dim=1, dtype=torch.int32) + .reshape(-1, 1) + .contiguous() + ) + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [encoder_padding_mask], # B x T + "encoder_embedding": [encoder_embedding], # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "uniformity_hiddens": uniformity_hiddens, # List[T x B x C] + "src_tokens": [], + "src_lengths": [src_lengths], + } + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if len(encoder_out["encoder_out"]) == 0: + new_encoder_out = [] + else: + new_encoder_out = [encoder_out["encoder_out"][0].index_select(1, new_order)] + if len(encoder_out["encoder_padding_mask"]) == 0: + new_encoder_padding_mask = [] + else: + new_encoder_padding_mask = [ + encoder_out["encoder_padding_mask"][0].index_select(0, new_order) + ] + if len(encoder_out["encoder_embedding"]) == 0: + new_encoder_embedding = [] + else: + new_encoder_embedding = [ + encoder_out["encoder_embedding"][0].index_select(0, new_order) + ] + + if len(encoder_out["src_tokens"]) == 0: + src_tokens = [] + else: + src_tokens = [(encoder_out["src_tokens"][0]).index_select(0, new_order)] + + if len(encoder_out["src_lengths"]) == 0: + src_lengths = [] + else: + src_lengths = [(encoder_out["src_lengths"][0]).index_select(0, new_order)] + + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, # T x B x C + "encoder_padding_mask": new_encoder_padding_mask, # B x T + "encoder_embedding": new_encoder_embedding, # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": src_tokens, # B x T + "src_lengths": src_lengths, # B x 1 + } + + def max_positions(self): + """Maximum input length supported by the encoder.""" + if self.embed_positions is None: + return self.max_source_positions + return min(self.max_source_positions, self.embed_positions.max_positions) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + print("deleting {0}".format(weights_key)) + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + for i in range(self.num_layers): + # update layer norms + self.layers[i].upgrade_state_dict_named( + state_dict, "{}.layers.{}".format(name, i) + ) + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) < 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + return state_dict + + +class TransformerEncoder(TransformerEncoderBase): + def __init__(self, args, dictionary, embed_tokens): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + scaling_for_att=getattr(args, "scaling_for_att", 1.0), + ) + + def build_encoder_layer(self, args): + return super().build_encoder_layer( + TransformerConfig.from_namespace(args), + ) + + +def PositionalEmbedding( + num_embeddings: int, + embedding_dim: int, + padding_idx: int, + learned: bool = False, +): + if learned: + # if padding_idx is specified then offset the embedding ids by + # this index and adjust num_embeddings appropriately + # TODO: The right place for this offset would be inside + # LearnedPositionalEmbedding. Move this there for a cleaner implementation. + if padding_idx is not None: + num_embeddings = num_embeddings + padding_idx + 1 + m = LearnedPositionalEmbedding(num_embeddings, embedding_dim, padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim**-0.5) + if padding_idx is not None: + nn.init.constant_(m.weight[padding_idx], 0) + else: + m = SinusoidalPositionalEmbedding( + embedding_dim, + padding_idx, + init_size=num_embeddings + padding_idx + 1, + ) + return m diff --git a/SpeechLM/speechlm/modules/transformer_layer.py b/SpeechLM/speechlm/modules/transformer_layer.py new file mode 100644 index 0000000..1e3fa96 --- /dev/null +++ b/SpeechLM/speechlm/modules/transformer_layer.py @@ -0,0 +1,329 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/modules/transformer_layer.py + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_decoder_layer.py +""" + +from typing import Dict, List, Optional + +import torch +from torch import Tensor +from fairseq.modules import LayerNorm +from speechlm.modules.multihead_attention import MultiheadAttention +from fairseq.modules.transformer_layer import TransformerEncoderLayerBase as FairseqTransformerEncoderLayerBase +from fairseq.modules.transformer_layer import TransformerDecoderLayerBase as FairseqTransformerDecoderLayerBase + + +class TransformerEncoderLayerBase(FairseqTransformerEncoderLayerBase): + """Encoder layer block. + + In the original paper each operation (multi-head attention or FFN) is + postprocessed with: `dropout -> add residual -> layernorm`. In the + tensor2tensor code they suggest that learning is more robust when + preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.encoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + + def __init__(self, cfg, has_relative_attention_bias=False, scaling_for_att=1.0): + self.scaling_for_att = scaling_for_att + super().__init__(cfg) + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.encoder.attention_heads) + + def build_self_attention(self, embed_dim, cfg, scaling_for_att=1.0): + return MultiheadAttention( + embed_dim, + cfg.encoder.attention_heads, + dropout=cfg.attention_dropout, + self_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def forward( + self, + x, + encoder_padding_mask: Optional[Tensor], + attn_mask: Optional[Tensor] = None, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor): binary ByteTensor of shape + `(batch, seq_len)` where padding elements are indicated by ``1``. + attn_mask (ByteTensor): binary tensor of shape `(tgt_len, src_len)`, + where `tgt_len` is the length of output and `src_len` is the + length of input, though here both are equal to `seq_len`. + `attn_mask[tgt_i, src_j] = 1` means that when calculating the + embedding for `tgt_i`, we exclude (mask out) `src_j`. This is + useful for strided self-attention. + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + # anything in original attn_mask = 1, becomes -1e8 + # anything in original attn_mask = 0, becomes 0 + # Note that we cannot use -inf here, because at some edge cases, + # the attention weight (before softmax) for some padded element in query + # will become -inf, which results in NaN in model parameters + if attn_mask is not None: + attn_mask = attn_mask.masked_fill( + attn_mask.to(torch.bool), -1e8 if x.dtype == torch.float32 else -1e4 + ) + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, _ = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=encoder_padding_mask, + need_weights=False, + attn_mask=attn_mask, + position_bias=pos_bias, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + return x + + + +class TransformerDecoderLayerBase(FairseqTransformerDecoderLayerBase): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.decoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, cfg, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False, has_relative_attention_bias=False, scaling_for_att=1.0, + ): + self.scaling_for_att = scaling_for_att + super().__init__(cfg, + no_encoder_attn, + add_bias_kv, + add_zero_attn, + ) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.decoder.attention_heads) + + def build_self_attention( + self, embed_dim, cfg, add_bias_kv=False, add_zero_attn=False + ): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + dropout=cfg.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=not cfg.cross_self_attention, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def build_encoder_attention(self, embed_dim, cfg): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + kdim=cfg.encoder.embed_dim, + vdim=cfg.encoder.embed_dim, + dropout=cfg.attention_dropout, + encoder_decoder_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + if self.c_attn is not None: + tgt_len, bsz = x.size(0), x.size(1) + x = x.view(tgt_len, bsz, self.nh, self.head_dim) + x = torch.einsum("tbhd,h->tbhd", x, self.c_attn) + x = x.reshape(tgt_len, bsz, self.embed_dim) + if self.attn_ln is not None: + x = self.attn_ln(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + if self.encoder_attn is not None and encoder_out is not None: + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + if self.ffn_layernorm is not None: + x = self.ffn_layernorm(x) + x = self.fc2(x) + x = self.dropout_module(x) + if self.w_resid is not None: + residual = torch.mul(self.w_resid, residual) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None + + def make_generation_fast_(self, need_attn: bool = False, **kwargs): + self.need_attn = need_attn diff --git a/SpeechLM/speechlm/modules/w2v_encoder.py b/SpeechLM/speechlm/modules/w2v_encoder.py new file mode 100644 index 0000000..9b8c15f --- /dev/null +++ b/SpeechLM/speechlm/modules/w2v_encoder.py @@ -0,0 +1,283 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + wav2vec encoder adding relitive position bias, modified from + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_encoder.py + https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/wav2vec/wav2vec2.py +""" + +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.dataclass import ChoiceEnum +from fairseq.modules import ( + LayerNorm, + SamePad, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.utils import index_put +from fairseq.distributed import fsdp_wrap +from fairseq.models.wav2vec.utils import pad_to_multiple + +## reload multi-head attition with rel-pos-bias +from fairseq.models.wav2vec.wav2vec2 import TransformerEncoder as W2vTransformerEncoder +from speechlm.modules.relative_pos_enc import RelativePositionalEncoding +from speechlm.modules.multihead_attention import MultiheadAttention + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +class TransformerEncoder(W2vTransformerEncoder): + def __init__(self, args): + super().__init__(args) + + self.dropout = args.dropout + self.embedding_dim = args.encoder_embed_dim + self.required_seq_len_multiple = args.required_seq_len_multiple + self.use_rel_pos_enc = getattr(args, "use_rel_pos_enc", False) + + self.pos_conv = nn.Conv1d( + self.embedding_dim, + self.embedding_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * self.embedding_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + layers = [] + for _ in range(args.encoder_layers): + layer = TransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=self.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + has_relative_attention_bias=self.use_rel_pos_enc, + ) + if args.checkpoint_activations: + layer = fsdp_wrap(layer) + layer = checkpoint_wrapper(layer) + layers.append(layer) + self.layers = nn.ModuleList(layers) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(self.embedding_dim) + self.layerdrop = args.encoder_layerdrop + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim // args.encoder_attention_heads, 160) + + + self.apply(init_bert_params) + + def forward(self, x, padding_mask=None, layer=None): + x, layer_results = self.extract_features(x, padding_mask, layer) + + if self.layer_norm_first and layer is None: + x = self.layer_norm(x) + + return x, layer_results + + def extract_features(self, x, padding_mask=None, tgt_layer=None): + + if padding_mask is not None: + x = index_put(x, padding_mask, 0) + + x_conv = self.pos_conv(x.transpose(1, 2)) + x_conv = x_conv.transpose(1, 2) + x = x + x_conv + + if not self.layer_norm_first: + x = self.layer_norm(x) + + # pad to the sequence length dimension + x, pad_length = pad_to_multiple( + x, self.required_seq_len_multiple, dim=-2, value=0 + ) + if pad_length > 0 and padding_mask is None: + padding_mask = x.new_zeros((x.size(0), x.size(1)), dtype=torch.bool) + padding_mask[:, -pad_length:] = True + else: + padding_mask, _ = pad_to_multiple( + padding_mask, self.required_seq_len_multiple, dim=-1, value=True + ) + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + layer_results = [] + r = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, z = layer(x, self_attn_padding_mask=padding_mask, need_weights=False, pos_bias=pos_k) + if tgt_layer is not None: + # unpad if needed + if pad_length > 0: + layer_results.append( + ( + x[:-pad_length], + z[:, :-pad_length, :-pad_length] + if z is not None + else z, + ) + ) + else: + layer_results.append((x, z)) + if i == tgt_layer: + r = x + break + + if r is not None: + x = r + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + # undo paddding + if pad_length > 0: + x = x[:, :-pad_length] + + return x, layer_results + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + has_relative_attention_bias: bool = False, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embedding_dim//num_attention_heads) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + pos_bias=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + position_bias=pos_bias, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn diff --git a/SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmh.sh b/SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmh.sh new file mode 100644 index 0000000..650f7dc --- /dev/null +++ b/SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmh.sh @@ -0,0 +1,43 @@ +# #################################### +# SpeechLM-H Base model # +# #################################### +[ $# -lt 2 ] && echo "Usage: $0 [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +mount=$3 +world_size=$4 +update_freq=$5 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechlmh_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechlm/config/pretrain \ + --config-name speechlm_base_librispeech \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + dataset.train_subset=\"train_960+train_text.km-ltr\" \ + dataset.valid_subset=\"dev_clean+dev_clean.km-ltr\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=pretrain + +# data_dir="/mnt/default/v-ziqzhang/data/stbert/data/librispeech/hubert_release_iter2_layer9_kmeans/local" +# text_data_dir="/mnt/default/v-ziqzhang/dataset/LibriLM/from_fastT2U/bin-idx" diff --git a/SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmp.sh b/SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmp.sh new file mode 100644 index 0000000..2e0a812 --- /dev/null +++ b/SpeechLM/speechlm/scripts/pretrain_speechlm/base_speechlmp.sh @@ -0,0 +1,43 @@ +# #################################### +# SpeechLM-P Base model # +# #################################### +[ $# -lt 2 ] && echo "Usage: $0 [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +mount=$3 +world_size=$4 +update_freq=$5 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechlmp_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechlm/config/pretrain \ + --config-name speechlm_base_librispeech \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + task.labels='["phn"]' \ + model.label_rate=100 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + dataset.train_subset=\"train_960+train_text.phn-ltr\" \ + dataset.valid_subset=\"dev_clean+dev_clean.phn-ltr\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=pretrain + +# data_dir="/stdblob/users/v-ziqzhang/dataset/LibriLM/phn2char_sanych/tri4b_mono_label" +# text_data_dir="/stdblob/users/v-ziqzhang/dataset/LibriLM/phn2char_sanych/filt2k_sil025_m5std25_sil14_spn32/bin-idx" diff --git a/SpeechLM/speechlm/scripts/pretrain_speechlm/large_speechlmp.sh b/SpeechLM/speechlm/scripts/pretrain_speechlm/large_speechlmp.sh new file mode 100644 index 0000000..75fc15f --- /dev/null +++ b/SpeechLM/speechlm/scripts/pretrain_speechlm/large_speechlmp.sh @@ -0,0 +1,44 @@ +# #################################### +# SpeechLM-P Large model # +# #################################### +[ $# -lt 2 ] && echo "Usage: $0 [mount=${PWD}] [world_size=32] [update_freq=4]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +mount=$3 +world_size=$4 +update_freq=$5 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=4 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/large_speechlmp_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechlm/config/pretrain \ + --config-name speechlm_large_librilight \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + task.labels='["phn"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + dataset.train_subset=\"train_60k+train_text.phn-ltr\" \ + dataset.valid_subset=\"dev_clean+dev_clean.phn-ltr\" \ + dataset.num_workers=1 \ + dataset.max_tokens=900000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.fp16_scale_tolerance=0.1 \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=pretrain + +# data_dir="/stdblob/users/v-ziqzhang/dataset/librilight/chunkdata" +# text_data_dir="/stdblob/users/v-ziqzhang/dataset/LibriLM/phn2char_sanych/filt2k_sil025_m5std25_sil14_spn32/bin-idx" diff --git a/SpeechLM/speechlm/scripts/tokenizer_fastT2U/generate.sh b/SpeechLM/speechlm/scripts/tokenizer_fastT2U/generate.sh new file mode 100644 index 0000000..17d0764 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tokenizer_fastT2U/generate.sh @@ -0,0 +1,42 @@ +##################################### +# Fast Text2Unit Model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [outdir={gen_set%/*}]" && exit 0 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +gen_set=$2 +outdir=$3 + +DATA_DIR=${gen_set%/*} +gen_set=${gen_set##*/} +[ -z $outdir ] && outdir=${DATA_DIR} + +CODE_ROOT=${PWD} + +nj=4 +for rank in $(seq 0 $((nj-1))); do + results_path=$outdir/pseudo_${gen_set}/${rank} + [ ! -d $results_path ] && mkdir -p $results_path + echo "$model_path" > $results_path/model.record + + python $CODE_ROOT/speechlm/generate_unit.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechlm \ + --config-yaml config_generate.yaml \ + --path ${model_path} \ + --task fast_text_to_unit \ + --gen-subset $gen_set \ + \ + --beam 1 \ + --max-tokens 10000 \ + --results-path $results_path \ + --scoring sacrebleu \ + --skip-invalid-size-inputs-valid-test \ + --distributed-world-size $nj --distributed-rank ${rank} \ + & +done +wait diff --git a/SpeechLM/speechlm/scripts/tokenizer_fastT2U/infer.sh b/SpeechLM/speechlm/scripts/tokenizer_fastT2U/infer.sh new file mode 100644 index 0000000..306ee86 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tokenizer_fastT2U/infer.sh @@ -0,0 +1,41 @@ +##################################### +# Fast Text2Unit Model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 " && exit 0 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +gen_set=$2 + +DATA_DIR=${gen_set%/*} +gen_set=${gen_set##*/} +outdir=$src_dir/decode_${cpt} + +CODE_ROOT=${PWD} + +for subset in ${gen_set//,/ }; do + results_path=$outdir/phone2unit_${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/speechlm/generate_unit.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechlm \ + --config-yaml config.yaml \ + --path ${model_path} \ + --task fast_text_to_unit \ + --gen-subset $subset \ + \ + --beam 1 \ + --max-tokens 10000 \ + --results-path $results_path \ + --scoring sacrebleu + + echo $results_path + tail -n 1 $results_path/generate-*.txt + sleep 1s +done + +# --distributed-world-size 1000 --distributed-rank 0 \ diff --git a/SpeechLM/speechlm/scripts/tokenizer_fastT2U/train_s_5e-4.sh b/SpeechLM/speechlm/scripts/tokenizer_fastT2U/train_s_5e-4.sh new file mode 100644 index 0000000..6fec89b --- /dev/null +++ b/SpeechLM/speechlm/scripts/tokenizer_fastT2U/train_s_5e-4.sh @@ -0,0 +1,39 @@ +##################################### +# Fast Text2Unit Model # +##################################### +[ $# -lt 1 ] && echo "Usage: $0 [mount] [world_size=4] [update_freq=1]" && exit 0 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +DATA_DIR=$1 +mount=$2 +world_size=$3 +update_freq=$4 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=4 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="$mount/exp/fast_text2unit/small_lr5e-4_tristage_ls0.1_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +fairseq-train ${DATA_DIR} --save-dir ${MODEL_DIR} \ + --config-yaml config.yaml \ + --user-dir $CODE_ROOT/speechlm \ + --train-subset train_100 --valid-subset dev_clean \ + --num-workers 4 --max-tokens 20000 \ + --distributed-world-size ${world_size} --update-freq ${update_freq} \ + \ + --task fast_text_to_unit --criterion fasttext2unit_criterion --arch fasttext2unit_s \ + --label-smoothing 0.1 \ + \ + --clip-norm 5.0 --n-frames-per-step 1 \ + --dropout 0.1 --attention-dropout 0.1 \ + --optimizer adam --lr 5e-4 --lr-scheduler tri_stage --phase-ratio [0.3,0.0,0.7] --max-update 10000 \ + --seed 1 --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + \ + --save-interval 2 \ + --tensorboard-logdir ${MODEL_DIR} \ + --fp16 --find-unused-parameters \ + | tee ${MODEL_DIR}/train.log + +# DATA_DIR=/mnt/default/v-ziqzhang/dataset/librispeech_phone2unit/phone2unit diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_base_ctc.sh b/SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_base_ctc.sh new file mode 100644 index 0000000..4b7c542 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_base_ctc.sh @@ -0,0 +1,48 @@ +# #################################### +# SpeechLM Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [mount=${PWD}] [world_size=8] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +cpt=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="${mount}/exp/finetune_asr/$exp_name/ctc30k_from_${cpt}_bz1.6m_lr1e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechlm/config/finetune \ + --config-name speechlm_base_100h \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + model.w2v_path=${w2v_path} \ + \ + optimization.lr=[0.00001] \ + optimization.max_update=30000 \ + dataset.max_tokens=1600000 \ + optimization.update_freq=[${update_freq}] \ + distributed_training.distributed_world_size=${world_size} \ + \ + dataset.train_subset="train_clean_100" \ + dataset.valid_subset="dev_other" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/exp/base/base_speechlmp_32gpu_1accum/checkpoint_298_400000.pt +# data_dir=/home/v-ziqzhang/dataset/LibriSpeech/asr diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_large_ctc.sh b/SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_large_ctc.sh new file mode 100644 index 0000000..c079190 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_asr/finetune_large_ctc.sh @@ -0,0 +1,48 @@ +# #################################### +# SpeechLM Large model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [mount=${PWD}] [world_size=8] [update_freq=4]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +cpt=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=4 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="${mount}/exp/finetune_asr/$exp_name/ctc200k_from_${cpt}_bz3.6m_lr1e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechlm/config/finetune \ + --config-name speechlm_large_960h \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + model.w2v_path=${w2v_path} \ + \ + optimization.lr=[0.00001] \ + optimization.max_update=200000 \ + dataset.max_tokens=900000 \ + optimization.update_freq=[${update_freq}] \ + distributed_training.distributed_world_size=${world_size} \ + \ + dataset.train_subset="train_960" \ + dataset.valid_subset="dev_other" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=${exp_name} + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/exp/large/large_speechlmp_32gpu_4accum/checkpoint_31_400000.pt +# data_dir=/home/v-ziqzhang/dataset/LibriSpeech/asr diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc.sh b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc.sh new file mode 100644 index 0000000..4c331d6 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc.sh @@ -0,0 +1,40 @@ +##################################### +# SpeechLM Base model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_clean,dev_other,test_clean,test_other]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +[ -z $gen_set ] && gen_set="dev_clean,dev_other,test_clean,test_other" +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}_ctc/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/speechlm/infer.py \ + --config-dir $CODE_ROOT/speechlm/config/decode \ + --config-name infer_viterbi \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + dataset.gen_subset=${subset} \ + task.data=$DATA_DIR task.label_dir=$DATA_DIR task.normalize=false \ + common_eval.results_path=${results_path} common_eval.path=${model_path} \ + \ + common_eval.quiet=true \ + & +done +wait + +### important to know +# When loading the fine-tuned model for decoding, fairseq also loads the pre-trained model to use its states['model'] to build the model instance. +# To prevent the error about the w2v_path (if you don't have the pre-trained model at w2v_path), we set common_eval.model_overrides to override +# the w2v_path by speechlmp_base_cfg.pt. speechlmp_base_cfg.pt is just a pre-trained model checkpoint without parameters (only contains config). +# So, if you have trained a model with different model config (e.g. different encoder layers), you should modify the common_eval.model_overrides to your own. + # common_eval.model_overrides=\"{\'w2v_path\':\'$CODE_ROOT/speechlm/config/pretrain/speechlmp_base_cfg.pt\'}\" \ diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_kenlm.sh b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_kenlm.sh new file mode 100644 index 0000000..3dfce02 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_kenlm.sh @@ -0,0 +1,48 @@ +##################################### +# SpeechLM Base model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_clean,dev_other,test_clean,test_other]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +[ -z $gen_set ] && gen_set="dev_clean,dev_other,test_clean,test_other" +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} +path_to_lexicon=${DATA_DIR}/librispeech_lexicon.lst +path_to_lm=${DATA_DIR}/4-gram.arpa +[ ! -f $path_to_lexicon ] && echo "Error: $path_to_lexicon not found !" && exit 1 +[ ! -f $path_to_lm ] && echo "Error: $path_to_lm not found !" && exit 1 + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}_ctc/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/speechlm/infer.py \ + --config-dir $CODE_ROOT/speechlm/config/decode \ + --config-name infer_kenlm \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + dataset.gen_subset=${subset} \ + task.data=$DATA_DIR task.label_dir=$DATA_DIR task.normalize=false \ + common_eval.results_path=${results_path} common_eval.path=${model_path} \ + \ + decoding.lexicon=$path_to_lexicon \ + decoding.lmpath=$path_to_lm \ + decoding.beam=1500 \ + \ + common_eval.quiet=false \ + & +done +wait + +### important to know +# When loading the fine-tuned model for decoding, fairseq also loads the pre-trained model to use its states['model'] to build the model instance. +# To prevent the error about the w2v_path (if you don't have the pre-trained model at w2v_path), we set common_eval.model_overrides to override +# the w2v_path by speechlmp_base_cfg.pt. speechlmp_base_cfg.pt is just a pre-trained model checkpoint without parameters (only contains config). +# So, if you have trained a model with different model config (e.g. different encoder layers), you should modify the common_eval.model_overrides to your own. + # common_eval.model_overrides=\"{\'w2v_path\':\'$CODE_ROOT/speechlm/config/pretrain/speechlmp_base_cfg.pt\'}\" \ diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large.sh b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large.sh new file mode 100644 index 0000000..265476a --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large.sh @@ -0,0 +1,36 @@ +##################################### +# SpeechLM Large model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_clean,dev_other,test_clean,test_other]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +[ -z $gen_set ] && gen_set="dev_clean,dev_other,test_clean,test_other" +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}_ctc/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/speechlm/infer.py \ + --config-dir $CODE_ROOT/speechlm/config/decode \ + --config-name infer_viterbi \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + dataset.gen_subset=${subset} \ + task.data=$DATA_DIR task.label_dir=$DATA_DIR task.normalize=true \ + common_eval.results_path=${results_path} common_eval.path=${model_path} \ + \ + common_eval.quiet=true \ + & +done +wait + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/finetune_asr/large_speechlmp_32gpu_4accum/ctc200k_from_400k_bz3.6m_lr1e-5/checkpoint_convert.pt +# data_dir=/home/v-ziqzhang/dataset/LibriSpeech/asr diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large_fsqlm.sh b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large_fsqlm.sh new file mode 100644 index 0000000..165dd29 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_asr/inference_ctc_large_fsqlm.sh @@ -0,0 +1,46 @@ +##################################### +# SpeechLM Large model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 [gen-set=dev_clean,dev_other,test_clean,test_other]" && exit 1 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +[ -z $gen_set ] && gen_set="dev_clean,dev_other,test_clean,test_other" +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} +path_to_lexicon=${DATA_DIR}/librispeech_lexicon.lst +path_to_lm=${DATA_DIR}/fairseq_word_lm/lm_librispeech_word_transformer.pt +[ ! -f $path_to_lexicon ] && echo "Error: $path_to_lexicon not found !" && exit 1 +[ ! -f $path_to_lm ] && echo "Error: $path_to_lm not found !" && exit 1 + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}_ctc/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/speechlm/infer.py \ + --config-dir $CODE_ROOT/speechlm/config/decode \ + --config-name infer_fsqlm \ + common.user_dir=$CODE_ROOT/speechlm \ + \ + dataset.gen_subset=${subset} \ + task.data=$DATA_DIR task.label_dir=$DATA_DIR task.normalize=true \ + common_eval.results_path=${results_path} common_eval.path=${model_path} \ + \ + decoding.lexicon=$path_to_lexicon \ + decoding.lmpath=$path_to_lm \ + decoding.lmweight=0.90 \ + decoding.wordscore=-0.31 \ + decoding.beam=500 \ + \ + common_eval.quiet=false \ + & +done +wait + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/finetune_asr/large_speechlmp_32gpu_4accum/ctc200k_from_400k_bz3.6m_lr1e-5/checkpoint_convert.pt +# data_dir=/home/v-ziqzhang/dataset/LibriSpeech/asr diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_st/ft_base_covost_enxx.sh b/SpeechLM/speechlm/scripts/tune_speechlm_st/ft_base_covost_enxx.sh new file mode 100644 index 0000000..3b8c12a --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_st/ft_base_covost_enxx.sh @@ -0,0 +1,80 @@ +# #################################### +# SpeechLM Base model # +# #################################### +[ $# -lt 4 ] && echo "Usage: $0 [mount=${PWD}] [world_size=8] [update_freq=2]" && exit 0 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +lang=$3 +cpt=$4 +mount=$5 +world_size=$6 +update_freq=$7 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=2 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="$mount/exp/finetune_covost/$exp_name/legacy_en${lang}_from_${cpt}_bz3.2m_lr1e-4" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +max_tokens=1600000 +python $CODE_ROOT/fairseq/fairseq_cli/train.py ${DATA_DIR} \ + --save-dir ${MODEL_DIR} \ + --user-dir $CODE_ROOT/speechlm \ + --task speech_to_text \ + --config-yaml config_base_en${lang}.yaml \ + --train-subset "train_st_en_${lang}_local" \ + --valid-subset "dev_st_en_${lang}_local" \ + --fp16 \ + --seed 1 \ + \ + --ddp-backend no_c10d \ + --distributed-world-size ${world_size} \ + --tensorboard-logdir ${MODEL_DIR} \ + \ + --criterion label_smoothed_cross_entropy --report-accuracy \ + --label-smoothing 0.1 \ + \ + --optimizer adam \ + --clip-norm 1.0 \ + --lr 1e-04 \ + --lr-scheduler polynomial_decay --warmup-updates 5000 \ + --max-update 50000 \ + --total-num-update 50000 \ + --update-freq ${update_freq} \ + \ + --max-tokens ${max_tokens} \ + --max-sentences 16 \ + --max-tokens-valid ${max_tokens} \ + --grouped-shuffling \ + --max-source-positions ${max_tokens} \ + --skip-invalid-size-inputs-valid-test \ + --num-workers 0 \ + --best-checkpoint-metric "accuracy" \ + --maximize-best-checkpoint-metric \ + \ + --arch "speechlm_st_legacy" \ + --w2v-path ${w2v_path} \ + --layerdrop 0.1 \ + --decoder-layerdrop 0.1 \ + --activation-dropout 0.0 \ + --attention-dropout 0.1 \ + --feature-grad-mult 1.0 \ + \ + --apply-mask --mask-prob 0.5 \ + \ + --log-format json \ + --log-interval 100 \ + --save-interval 1 \ + --keep-last-epochs 5 \ + --keep-best-checkpoints 5 \ + \ + 2>&1 | tee ${MODEL_DIR}/train.log + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/exp/base/base_speechlmp_32gpu_1accum/checkpoint_298_400000.pt +# data_dir=${HOME}/dataset/CommonVoice/v4/en/en-de diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_st/ft_large_covost_enxx.sh b/SpeechLM/speechlm/scripts/tune_speechlm_st/ft_large_covost_enxx.sh new file mode 100644 index 0000000..4e79bec --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_st/ft_large_covost_enxx.sh @@ -0,0 +1,80 @@ +# #################################### +# SpeechLM Large model # +# #################################### +[ $# -lt 4 ] && echo "Usage: $0 [mount=${PWD}] [world_size=8] [update_freq=4]" && exit 0 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +lang=$3 +cpt=$4 +mount=$5 +world_size=$6 +update_freq=$7 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=4 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="$mount/exp/finetune_covost/$exp_name/legacy_en${lang}_from_${cpt}_bz3.6m_lr1e-4" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +max_tokens=900000 +python $CODE_ROOT/fairseq/fairseq_cli/train.py ${DATA_DIR} \ + --save-dir ${MODEL_DIR} \ + --user-dir $CODE_ROOT/speechlm \ + --task speech_to_text \ + --config-yaml config_large_en${lang}.yaml \ + --train-subset "train_st_en_${lang}_local" \ + --valid-subset "dev_st_en_${lang}_local" \ + --fp16 \ + --seed 1 \ + \ + --ddp-backend no_c10d \ + --distributed-world-size ${world_size} \ + --tensorboard-logdir ${MODEL_DIR} \ + \ + --criterion label_smoothed_cross_entropy --report-accuracy \ + --label-smoothing 0.1 \ + \ + --optimizer adam \ + --clip-norm 1.0 \ + --lr 1e-04 \ + --lr-scheduler polynomial_decay --warmup-updates 5000 \ + --max-update 50000 \ + --total-num-update 50000 \ + --update-freq ${update_freq} \ + \ + --max-tokens ${max_tokens} \ + --max-sentences 16 \ + --max-tokens-valid ${max_tokens} \ + --grouped-shuffling \ + --max-source-positions ${max_tokens} \ + --skip-invalid-size-inputs-valid-test \ + --num-workers 0 \ + --best-checkpoint-metric "accuracy" \ + --maximize-best-checkpoint-metric \ + \ + --arch "speechlm_st_legacy" \ + --w2v-path ${w2v_path} --encoder-embed-dim 1024 \ + --layerdrop 0.1 \ + --decoder-layerdrop 0.1 \ + --activation-dropout 0.0 \ + --attention-dropout 0.1 \ + --feature-grad-mult 1.0 \ + \ + --apply-mask --mask-prob 0.5 \ + \ + --log-format json \ + --log-interval 100 \ + --save-interval 1 \ + --keep-last-epochs 5 \ + --keep-best-checkpoints 5 \ + \ + 2>&1 | tee ${MODEL_DIR}/train.log + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/exp/large/large_speechlmp_32gpu_4accum/checkpoint_31_400000.pt +# data_dir=${HOME}/dataset/CommonVoice/v4/en/en-de diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_st/inference_base.sh b/SpeechLM/speechlm/scripts/tune_speechlm_st/inference_base.sh new file mode 100644 index 0000000..513f99f --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_st/inference_base.sh @@ -0,0 +1,46 @@ +# #################################### +# SpeechLM Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [gen-set=dev] [beam_size=5] [lenpen=1.0]" && exit 0 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +lang=$3 +gen_set=$4 +beam_size=$5 +lenpen=$6 +[ -z $gen_set ] && gen_set="dev" +[ -z $beam_size ] && beam_size=5 +[ -z $lenpen ] && lenpen=1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} +results_path=$src_dir/decode_${cpt}_beam${beam_size}/${gen_set} +[ ! -d $results_path ] && mkdir -p $results_path + +python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --gen-subset ${gen_set}_st_en_${lang}_local \ + --max-tokens 2300000 \ + --max-source-positions 2300000 \ + --num-workers 0 \ + \ + --user-dir $CODE_ROOT/speechlm \ + --task speech_to_text \ + --config-yaml config_base_en${lang}.yaml \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring sacrebleu --max-len-a 0 --max-len-b 512 \ + --beam ${beam_size} \ + --lenpen $lenpen \ + + echo $results_path + tail -n 1 $results_path/generate-*.txt + sleep 1s + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/finetune_covost/base_speechlmp_32gpu_1accum/legacy_ende_from_400k_bz3.2m_lr1e-4/checkpoint_best_convert.pt +# data_dir=dataset/CommonVoice/v4/en/en-de diff --git a/SpeechLM/speechlm/scripts/tune_speechlm_st/inference_large.sh b/SpeechLM/speechlm/scripts/tune_speechlm_st/inference_large.sh new file mode 100644 index 0000000..6957ad5 --- /dev/null +++ b/SpeechLM/speechlm/scripts/tune_speechlm_st/inference_large.sh @@ -0,0 +1,46 @@ +# #################################### +# SpeechLM Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 [gen-set=dev] [beam_size=5] [lenpen=1.0]" && exit 0 +[ ${PWD##*/} != SpeechLM ] && echo "Error: dir not match! Switch to SpeechLM/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +lang=$3 +gen_set=$4 +beam_size=$5 +lenpen=$6 +[ -z $gen_set ] && gen_set="dev" +[ -z $beam_size ] && beam_size=5 +[ -z $lenpen ] && lenpen=1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} +results_path=$src_dir/decode_${cpt}_beam${beam_size}/${gen_set} +[ ! -d $results_path ] && mkdir -p $results_path + +python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --gen-subset ${gen_set}_st_en_${lang}_local \ + --max-tokens 2300000 \ + --max-source-positions 2300000 \ + --num-workers 0 \ + \ + --user-dir $CODE_ROOT/speechlm \ + --task speech_to_text \ + --config-yaml config_large_en${lang}.yaml \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring sacrebleu --max-len-a 0 --max-len-b 512 \ + --beam ${beam_size} \ + --lenpen $lenpen \ + + echo $results_path + tail -n 1 $results_path/generate-*.txt + sleep 1s + +# model_path=/mnt/default/v-ziqzhang/data/speechulm/finetune_covost/large_speechlmp_32gpu_4accum/legacy_ende_from_400k_bz3.6m_lr1e-4/checkpoint.avgnbest_convert.pt +# data_dir=dataset/CommonVoice/v4/en/en-de diff --git a/SpeechLM/speechlm/tasks/fast_text_to_unit.py b/SpeechLM/speechlm/tasks/fast_text_to_unit.py new file mode 100644 index 0000000..b053248 --- /dev/null +++ b/SpeechLM/speechlm/tasks/fast_text_to_unit.py @@ -0,0 +1,174 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import torch +import numpy as np +import logging +from pathlib import Path +from argparse import Namespace + +from fairseq.tasks import LegacyFairseqTask, register_task +from fairseq.data import Dictionary, encoders +from fairseq.data.audio.speech_to_text_joint_dataset import S2TJointDataConfig + +from speechlm.unit_generator import NonAutoregressiveUnitGenerator +from speechlm.data.text_to_unit_dataset import Text2UnitDatasetCreator + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=logging.INFO, +) +logger = logging.getLogger(__name__) + + +@register_task("fast_text_to_unit") +class FastTextToUnitTask(LegacyFairseqTask): + @staticmethod + def add_args(parser): + parser.add_argument("data", help="manifest root path") + parser.add_argument( + "--config-yaml", + type=str, + default="config.yaml", + help="Configuration YAML filename (under manifest root)", + ) + parser.add_argument( + "--max-source-positions", + default=2048, + type=int, + metavar="N", + help="max number of tokens in the source sequence", + ) + parser.add_argument( + "--max-target-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the target sequence", + ) + parser.add_argument("--n-frames-per-step", type=int, default=1) + parser.add_argument("--eos-prob-threshold", type=float, default=0.5) + parser.add_argument("--eval-inference", action="store_true") + parser.add_argument("--eval-tb-nsample", type=int, default=8) + parser.add_argument("--vocoder", type=str, default="griffin_lim") + parser.add_argument("--spec-bwd-max-iter", type=int, default=8) + + def __init__(self, args, src_dict, tgt_dict): + super().__init__(args) + self.src_dict = src_dict + self.tgt_dict = tgt_dict + self.data_cfg = S2TJointDataConfig(Path(args.data) / args.config_yaml) + self.speaker_to_id = self._get_speaker_to_id() + + @classmethod + def setup_task(cls, args, **kwargs): + data_cfg = S2TJointDataConfig(Path(args.data) / args.config_yaml) + src_dict_path = Path(args.data) / data_cfg.src_vocab_filename + if not src_dict_path.is_file(): + raise FileNotFoundError(f"Dict not found: {src_dict_path.as_posix()}") + src_dict = Dictionary.load(src_dict_path.as_posix()) + logger.info( + f"Source dictionary size ({data_cfg.src_vocab_filename}): " f"{len(src_dict):,}" + ) + tgt_dict_path = Path(args.data) / data_cfg.vocab_filename + if not tgt_dict_path.is_file(): + raise FileNotFoundError(f"Dict not found: {tgt_dict_path.as_posix()}") + tgt_dict = Dictionary.load(tgt_dict_path.as_posix()) + logger.info( + f"Target dictionary size ({data_cfg.vocab_filename}): " f"{len(tgt_dict):,}" + ) + + if getattr(args, "train_subset", None) is not None: + if not all(s.startswith("train") for s in args.train_subset.split(",")): + raise ValueError('Train splits should be named like "train*".') + return cls(args, src_dict, tgt_dict) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + is_train_split = split.startswith("train") + pre_tokenizer = self.build_tokenizer(self.args) + bpe_tokenizer = self.build_bpe(self.args) + self.datasets[split] = Text2UnitDatasetCreator.from_tsv( + self.args.data, + self.data_cfg, + split, + self.src_dict, + pre_tokenizer, + bpe_tokenizer, + is_train_split=is_train_split, + epoch=epoch, + seed=self.args.seed, + n_frames_per_step=self.args.n_frames_per_step, + speaker_to_id=self.speaker_to_id, + ) + + @property + def target_dictionary(self): + return self.tgt_dict + + @property + def source_dictionary(self): + return self.src_dict + + def max_positions(self): + return self.args.max_source_positions, self.args.max_target_positions + + def _get_speaker_to_id(self): + speaker_to_id = None + speaker_set_filename = self.data_cfg.config.get("speaker_set_filename") + if speaker_set_filename is not None: + speaker_set_path = Path(self.args.data) / speaker_set_filename + with open(speaker_set_path) as f: + speaker_to_id = {r.strip(): i for i, r in enumerate(f)} + return speaker_to_id + + @classmethod + def get_speaker_embeddings(cls, args): + # It Will be used in FastText2UnitModel model, insdead of nn.Embedding on speaker-id, we default to use x-vectors extracted ahead. + # This is for varying the speaker information when generating units from text. + if args.speaker_to_id is not None: + embed_speaker = torch.nn.Embedding( + len(args.speaker_to_id), args.speaker_embed_dim + ) + elif args.speaker_embedding_type == "x-vector": + # return LayerNorm(args.speaker_embed_dim) + return lambda x: x.unsqueeze(1) + elif args.speaker_embedding_type == "i-vector": + # return LayerNorm(args.speaker_embed_dim) + return lambda x: x + else: + embed_speaker = None + return embed_speaker + + def build_model(self, cfg): + cfg.pitch_min = self.data_cfg.config["features"].get("pitch_min", None) + cfg.pitch_max = self.data_cfg.config["features"].get("pitch_max", None) + cfg.energy_min = self.data_cfg.config["features"].get("energy_min", None) + cfg.energy_max = self.data_cfg.config["features"].get("energy_max", None) + cfg.speaker_to_id = self.speaker_to_id + cfg.speaker_embedding_type = self.data_cfg.config.get("speaker_embedding_type", None) + model = super().build_model(cfg) + self.generator = None + if getattr(cfg, "eval_inference", False): + self.generator = self.build_generator([model], cfg) + return model + + def build_generator(self, models, cfg, vocoder=None, **unused): + model = models[0] + assert getattr(model, "NON_AUTOREGRESSIVE") is True + return NonAutoregressiveUnitGenerator(model, vocoder, self.data_cfg) + + + def build_tokenizer(self, args): + logger.info(f"pre-tokenizer: {self.data_cfg.pre_tokenizer}") + return encoders.build_tokenizer(Namespace(**self.data_cfg.pre_tokenizer)) + + def build_bpe(self, args): + logger.info(f"tokenizer: {self.data_cfg.bpe_tokenizer}") + return encoders.build_bpe(Namespace(**self.data_cfg.bpe_tokenizer)) diff --git a/SpeechLM/speechlm/tasks/joint_sc2t_pretrain.py b/SpeechLM/speechlm/tasks/joint_sc2t_pretrain.py new file mode 100644 index 0000000..86af617 --- /dev/null +++ b/SpeechLM/speechlm/tasks/joint_sc2t_pretrain.py @@ -0,0 +1,976 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import os +import sys +from typing import Dict, List, Optional, Tuple +from pathlib import Path + +import numpy as np +from argparse import Namespace +from collections import OrderedDict + +import torch +from dataclasses import dataclass, field +from fairseq.data import ( + Dictionary, + encoders, + data_utils, + StripTokenDataset, + PrependTokenDataset, + AppendTokenDataset, + DenoisingDataset, + ConcatDataset, + FairseqDataset, + iterators, + ResamplingDataset, + MaskTokensDataset, + LanguagePairDataset, +) +from fairseq.data.audio.speech_to_text_joint_dataset import S2TJointDataConfig +from fairseq.data.shorten_dataset import maybe_shorten_dataset +# from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq.dataclass.configs import FairseqDataclass +from fairseq.tasks import register_task +from fairseq.tasks.fairseq_task import FairseqTask +from fairseq.dataclass.constants import ChoiceEnum +from omegaconf import MISSING + +from speechlm.data.multimodal_corpus_dataset import MultiCorpusDataset +from speechlm.data.load_langpair_dataset import load_langpair_dataset +from speechlm.data.language_trible_dataset import LanguageTripleDataset, load_langtriple_dataset +from speechlm.data.hubert_dataset import HubertDataset + +logger = logging.getLogger(__name__) + +TOKENIZER_CHOICES = ChoiceEnum(["sentencepiece", "hubert_letters", "none"]) + +def _lang_token(lang: str): + return "".format(lang) + +def _lang_token_index(dic: Dictionary, lang: str): + """Return language token index.""" + idx = dic.index(_lang_token(lang)) + assert idx != dic.unk_index, "cannot find language token for lang {}".format(lang) + return idx + + +class LabelEncoder(object): + def __init__(self, dictionary: Dictionary) -> None: + self.dictionary = dictionary + + def __call__(self, label: str) -> List[str]: + return self.dictionary.encode_line( + label, append_eos=False, add_if_not_exist=False, + ) + + +### wrap the initial get_whole_word_mask which needs bpe_tokenizer, +### here we just assume words are splited by "|" or "" +def get_whole_word_mask(args, dictionary): + def is_beginning_of_word(i): + if i < dictionary.nspecial: + # special elements are always considered beginnings + return True + tok = dictionary[i] + if tok.startswith("madeupword"): + return True + elif tok in ["", "", "", "", "|", ""]: + return True + else: + return False + + mask_whole_words = torch.ByteTensor( + list(map(is_beginning_of_word, range(len(dictionary)))) + ) + return mask_whole_words + +def get_repeative_start(tokens): + """ + tokens: torch.Tensor with repeative tokens + """ + length = len(tokens) + rep_start_id = tokens[:-1] != tokens[1:] + return torch.cat([torch.tensor([True]), rep_start_id]) + +@dataclass +class TextPretrainingConfig(FairseqDataclass): + ### added for joint pretraining + text_data: Optional[str] = field( + default=None, + metadata={ + "help": "if set, path to text data directory", + }, + ) + seed: Optional[int] = field( + default=1, + metadata={ + "help": "for ordered_indices in MulticorpusDataset", + }, + ) + tokens_per_sample: Optional[int] = field( + default=512, + metadata={ + "help": "max number of total tokens over all segments per sample for dataset", + }, + ) + tokens_per_sample_tgt: Optional[int] = field( + default=512, + metadata={ + "help": "max number of total tokens over all segments per target sample for dataset", + }, + ) + sample_break_mode: Optional[str] = field( + default="eos", + metadata={ + "help": "mode for breaking sentence", + }, + ) + mask: Optional[float] = field( + default=0.3, + metadata={ + "help": "fraction of words/subwords that will be masked", + }, + ) + leave_unmasked_prob: float = field( + default=0.1, + metadata={"help": "probability that a masked token is unmasked"}, + ) + mask_random: Optional[float] = field( + default=0.1, + metadata={ + "help": "instead of using [MASK], use random token this often", + }, + ) + freq_weighted_replacement: bool = field( + default=False, + metadata={"help": "sample random replacement words based on word frequencies"}, + ) + mask_whole_words: bool = field( + default=True, + metadata={"help": "mask whole words; you may also want to set --bpe"}, + ) + mask_repeative_tokens: bool = field( + default=True, + metadata={"help": "mask repeative_tokens; if mask_whole_words=False"}, + ) + mask_multiple_length: int = field( + default=1, + metadata={"help": "repeat the mask indices multiple times"}, + ) + mask_stdev: float = field( + default=0.0, + metadata={"help": "stdev of the mask length"}, + ) + shorten_method: Optional[str] = field( + default="none", + metadata={ + "help": "if not none, shorten sequences that exceed tokens_per_sample", + "choices": "none/truncate/random_crop" + }, + ) + shorten_data_split_list: Optional[str] = field( + default="", + metadata={ + "help": "comma_separated list of dataset splits to apply shortening to, e.g., train,valid (default: all dataset splits)", + }, + ) + + ### below hypra-parameters is used in bart + insert: Optional[float] = field( + default=0.0, + metadata={ + "help": "insert this percentage of additional random tokens", + }, + ) + permute: Optional[float] = field( + default=0.0, + metadata={ + "help": "take this proportion of subwords and permute them", + }, + ) + rotate: Optional[float] = field( + default=0.0, + metadata={ + "help": "rotate this proportion of inputs", + }, + ) + poisson_lambda: Optional[float] = field( + default=3.5, + metadata={ + "help": "randomly shuffle sentences for this proportion of inputs", + }, + ) + permute_sentences: Optional[float] = field( + default=0.0, + metadata={ + "help": "shuffle this proportion of sentences in all inputs", + }, + ) + mask_length: Optional[str] = field( + default="span-poisson", + metadata={ + "help": "mask length to choose", + "choice": "subword/word/span-poisson" + }, + ) + replace_length: Optional[int] = field( + default=1, + metadata={ + "help": "when masking N tokens, replace with 0, 1, or N tokens (use -1 for N)", + }, + ) + shuffle_instance: Optional[bool] = field( + default=False, + metadata={"help": "shuffle instance"}, + ) + max_source_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the source sequence"}, + ) + max_target_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the target sequence"}, + ) + bpe: Optional[str] = field( + default="", + metadata={ + "help": "will wrapped by the text_data_config yaml", + }, + ) + data_config: Optional[str] = field( + default=None, + metadata={ + "help": "a config yaml specify the bpe model of text data", + }, + ) + text_maxtokens_ratio: Optional[float] = field( + default=1.0, + metadata={ + "help": "for text, max_tokens = max_tokens * text_maxtokens_ratio / 320 ", + }, + ) + prepend_tgt_lang_tag: bool = field( + default=False, + metadata={"help": "prepend tgt_lang_tag to replace "}, + ) + mask_text_ratio: Optional[float] = field( + default=0.0, + metadata={ + "help": "mask_text_ratio, for paired data", + }, + ) + truncate_mono_source: bool = field( + default=True, + metadata={"help": "truncate mono source-side examples that exceed max-positions"}, + ) + + +@dataclass +class JointPretrainingConfig(FairseqDataclass): + data: str = field( + default=MISSING, metadata={"help": "path to speech data directory"} + ) + fine_tuning: bool = field( + default=False, metadata={"help": "set to true if fine-tuning Hubert"} + ) + labels: List[str] = field( + default_factory=lambda: ["ltr"], + metadata={ + "help": ( + "extension of the label files to load, frame-level labels for" + " pre-training, and sequence-level label for fine-tuning" + ) + }, + ) + label_dir: Optional[str] = field( + default=None, + metadata={ + "help": "if set, looks for labels in this directory instead", + }, + ) + label_rate: int = field( + default=-1, + metadata={"help": "label frame rate. -1 for sequence label"}, + ) + sample_rate: int = field( + default=16_000, + metadata={ + "help": "target sample rate. audio files will be up/down " + "sampled to this rate" + }, + ) + normalize: bool = field( + default=False, + metadata={ + "help": "if set, normalizes input to have 0 mean and unit variance" + }, + ) + enable_padding: bool = field( + default=False, + metadata={"help": "pad shorter samples instead of cropping"}, + ) + max_keep_size: Optional[int] = field( + default=None, + metadata={"help": "exclude sample longer than this"}, + ) + max_sample_size: Optional[int] = field( + default=None, + metadata={"help": "max sample size to crop to for batching"}, + ) + min_sample_size: Optional[int] = field( + default=None, + metadata={"help": "min sample size to crop to for batching"}, + ) + single_target: Optional[bool] = field( + default=False, + metadata={ + "help": "if set, AddTargetDatasets outputs same keys " + "as AddTargetDataset" + }, + ) + random_crop: Optional[bool] = field( + default=True, + metadata={"help": "always crop from the beginning if false"}, + ) + pad_audio: Optional[bool] = field( + default=False, + metadata={"help": "pad audio to the longest one in the batch if true"}, + ) + store_labels: Optional[bool] = field( + default=True, + metadata={"help": "store spm labels in memory, should be true when fine-tune with bpe"}, + ) + add_decoder_target: bool = field( + default=False, + metadata={"help": "contral the model architecture, if set True, load reduced unit as target"}, + ) + split_modality_batch: bool = field( + default=False, + metadata={"help": "whether create all samples of different modalities in a batch"}, + ) + speech_tgt_lang: str = field( + default="", + metadata={"help": "prepend to prev_output_tokens to replace , only used for decoder"}, + ) + speech_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based speech resampling." + "(alpha = 1 for no resampling)" + }, + ) + text_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based text resampling." + "(alpha = 1 for no resampling)" + }, + ) + hubert_tokenizer: Optional[TOKENIZER_CHOICES] = field( + default="none", + metadata={"help": "which tokenizer for processing text"}, + ) + sp_path: Optional[str] = field( + default=None, + metadata={"help": "sentencepiece model path if using bpe tokenizer"}, + ) + + text_cfg: TextPretrainingConfig = TextPretrainingConfig() + + +@register_task("joint_sc2t_pretraining", dataclass=JointPretrainingConfig) +class Jsc2tPretrainingTask(FairseqTask): + + cfg: JointPretrainingConfig + + def __init__( + self, + cfg: JointPretrainingConfig, + ) -> None: + super().__init__(cfg) + + logger.info(f"current directory is {os.getcwd()}") + logger.info(f"JSTPretrainingTask Config {cfg}") + + self.cfg = cfg + self.fine_tuning = cfg.fine_tuning + self.blank_symbol = "" + + self.state.add_factory("hubert_tokenizer", self.build_tokenizer) + if self.cfg.text_cfg.text_data is not None and os.path.exists(self.cfg.text_cfg.text_data): + self.state.add_factory("text_dictionary", self.load_text_dictionary) + self.state.add_factory("text_src_dictionary", self.load_text_src_dictionary) + if cfg.fine_tuning: + self.state.add_factory("target_dictionary", self.load_dictionaries) + else: + self.state.add_factory("dictionaries", self.load_dictionaries) + + if cfg.text_cfg.data_config is not None: + self.text_data_cfg = S2TJointDataConfig(Path(f"{cfg.text_cfg.text_data}/{cfg.text_cfg.data_config}")) + self.cfg.text_cfg.bpe = self.text_data_cfg.bpe_tokenizer["bpe"] + else: + self.text_data_cfg = None + + @property + def source_dictionary(self) -> Optional[Dictionary]: + return None + + @property + def target_dictionary(self) -> Optional[Dictionary]: + return self.state.target_dictionary + + @property + def dictionaries(self) -> List[Dictionary]: + return self.state.dictionaries + + @property + def text_dictionary(self) -> Optional[Dictionary]: + return self.state.text_dictionary + + @property + def text_src_dictionary(self) -> Optional[Dictionary]: + return self.state.text_src_dictionary + + @property + def hubert_tokenizer(self): + return self.state.hubert_tokenizer + + def load_dictionaries(self): + label_dir = self.cfg.data if self.cfg.label_dir is None else self.cfg.label_dir + dictionaries = [Dictionary.load(f"{label_dir}/dict.{label}.txt") for label in self.cfg.labels] + if not self.cfg.fine_tuning: + for dictionary in dictionaries: + dictionary.add_symbol("") + return dictionaries[0] if self.cfg.fine_tuning else dictionaries + + def load_text_dictionary(self): + tgt_dict_path = f"{self.cfg.text_cfg.text_data}/{self.text_data_cfg.vocab_filename if self.text_data_cfg is not None else 'dict.txt'}" + if not os.path.isfile(tgt_dict_path): + raise FileNotFoundError(f"Dict not found: {tgt_dict_path}") + text_dictionary = Dictionary.load(tgt_dict_path) + self.mask_idx = text_dictionary.add_symbol("") + return text_dictionary + + def load_text_src_dictionary(self): + src_dict_path = f"{self.cfg.text_cfg.text_data}/{self.text_data_cfg.src_vocab_filename if self.text_data_cfg is not None else 'dict.txt'}" + if not os.path.isfile(src_dict_path): + raise FileNotFoundError(f"Dict not found: {src_dict_path}") + src_text_dictionary = Dictionary.load(src_dict_path) + self.mask_idx = src_text_dictionary.add_symbol("") + return src_text_dictionary + + @classmethod + def setup_task( + cls, cfg: JointPretrainingConfig, **kwargs + ) -> "Jsc2tPretrainingTask": + return cls(cfg) + + def get_label_dir(self) -> str: + if self.cfg.label_dir is None: + return self.cfg.data + return self.cfg.label_dir + + def load_paired_dataset(self, text_split, truncate_source=False): + text_split, lp = text_split.rsplit('.', 1) # e.g. "libritext.ltr-ltr" + if len(lp.split("-")) == 2: + src, tgt = lp.split("-") + if src == tgt: + logger.warn(f"| trying to load monolingual dataset {text_split}.{lp}, please check your task is right.") + paired_dataset = self.load_char_bart_dataset(f"{text_split}.{lp}.{tgt}") + return paired_dataset + paired_dataset = load_langpair_dataset( + self.cfg.text_cfg.text_data, + text_split, + src, + self.text_src_dictionary, + tgt, + self.text_dictionary, + combine=True, + dataset_impl=None, + upsample_primary=1, + left_pad_source=False, + left_pad_target=False, + max_source_positions=self.cfg.text_cfg.tokens_per_sample, + max_target_positions=self.cfg.text_cfg.tokens_per_sample, + truncate_source=truncate_source, + prepend_bos=False, + load_alignments=False, + append_source_id=True if self.cfg.text_cfg.prepend_tgt_lang_tag else False, + lang_format="" if self.cfg.text_cfg.prepend_tgt_lang_tag else "[{}]", + input_feeding=self.cfg.add_decoder_target, + ) + if self.cfg.text_cfg.mask_text_ratio > 0: + # add mask + self.mask_idx = self.text_src_dictionary.index("") + mask_whole_words = None + if self.cfg.text_cfg.mask_whole_words: + mask_whole_words = get_whole_word_mask(self.cfg.text_cfg, self.text_src_dictionary) + elif self.cfg.text_cfg.mask_repeative_tokens: + mask_whole_words = get_repeative_start + + src_dataset, src_unmasked_dataset = MaskTokensDataset.apply_mask( + paired_dataset.src, + self.text_src_dictionary, + pad_idx=self.text_src_dictionary.pad(), + mask_idx=self.mask_idx, + seed=self.cfg.text_cfg.seed, + mask_prob=self.cfg.text_cfg.mask_text_ratio, + leave_unmasked_prob=self.cfg.text_cfg.leave_unmasked_prob, + random_token_prob=self.cfg.text_cfg.mask_random, + freq_weighted_replacement=self.cfg.text_cfg.freq_weighted_replacement, + mask_whole_words=mask_whole_words, + mask_multiple_length=self.cfg.text_cfg.mask_multiple_length, + mask_stdev=self.cfg.text_cfg.mask_stdev, + ) + tgt_dataset = paired_dataset.tgt if paired_dataset.tgt is not None else src_unmasked_dataset + paired_dataset = LanguageTripleDataset( + src_dataset, + src_dataset.sizes, + self.text_src_dictionary, + src_unmasked_dataset, + src_unmasked_dataset.sizes, + self.text_src_dictionary, + tgt_dataset, + tgt_dataset.sizes, + self.text_dictionary, + left_pad_source=False, + left_pad_target=False, + align_dataset=None, + eos=None, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + ) + else: + src, ref, tgt = lp.split("-") + paired_dataset = load_langtriple_dataset( + self.cfg.text_cfg.text_data, + text_split, + src, + self.text_src_dictionary, + ref, + self.dictionaries[-1], + tgt, + self.text_dictionary, + combine=True, + dataset_impl=None, + upsample_primary=1, + left_pad_source=False, + left_pad_target=False, + max_source_positions=self.cfg.text_cfg.tokens_per_sample, + max_target_positions=self.cfg.text_cfg.tokens_per_sample, + truncate_source=truncate_source, + prepend_bos=False, + load_alignments=False, + append_source_id=True if self.cfg.text_cfg.prepend_tgt_lang_tag else False, + lang_format="" if self.cfg.text_cfg.prepend_tgt_lang_tag else "[{}]", + ) + return paired_dataset + + def load_dataset(self, split: str, epoch=1, **kwargs) -> None: + """ + Create Wav dataset for audio, and Index dataset for phonemized text, + then concatenate them to by fairseq.data.multi_corpus_dataset.MultiCorpusDataset. + """ + speech_splits = split.split('+')[0].split(',') + ### 1st, create a speech dataset using STSpeechDataset (modified from HubertDataset) + dicts = [self.target_dictionary] if self.cfg.fine_tuning else self.dictionaries + pad_list = [dict.pad() for dict in dicts] + eos_list = [dict.eos() for dict in dicts] + procs = [LabelEncoder(dict) for dict in dicts] + if self.cfg.speech_tgt_lang != "": + tgt_lang_idx = _lang_token_index(dicts[0], self.cfg.speech_tgt_lang) + logger.info(f"Will prepend <{tgt_lang_idx}> at the beginning of prev_output_tokens to replace ") + else: + tgt_lang_idx = None + + + # hubert v1: pad_audio=True, random_crop=False; + speech_datasets = [] + for speech_split in speech_splits: + paths = [ + f"{self.get_label_dir()}/{speech_split}.{l}" for l in self.cfg.labels + ] + speech_datasets.append( + HubertDataset( + f"{self.cfg.data}/{speech_split}.tsv", + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=self.cfg.store_labels, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + tgt_dict=dicts[0], + add_decoder_target=self.cfg.add_decoder_target, + fine_tuning=self.cfg.fine_tuning, + tgt_lang_idx=tgt_lang_idx, + tokenizer=self.hubert_tokenizer, + ) + ) + if len(speech_datasets) > 1: + speech_dataset = ConcatDataset(speech_datasets) + else: + speech_dataset = speech_datasets[0] + + has_text = len(split.split('+')) > 1 + if not has_text: + assert speech_dataset is not None + self.datasets[split] = speech_dataset + return + + ### 2nd, create paired/mono text datasets using Langpairdataset + if split.split('+')[1] != '': + paired_splits = [paired_split for paired_split in split.split('+')[1].split(',') if paired_split != ''] + paired_datasets = [self.load_paired_dataset(paired_split) for paired_split in paired_splits] + else: + paired_splits, paired_datasets = [], [] + + if len(split.split('+')) > 2 and split.split('+')[2] != '': + mono_splits = [mono_split for mono_split in split.split('+')[2].split(',') if mono_split != ''] + mono_datasets = [self.load_paired_dataset(mono_split, truncate_source=self.cfg.text_cfg.truncate_mono_source) for mono_split in mono_splits] + else: + mono_splits, mono_datasets = [], [] + + assert len(mono_datasets + paired_datasets) > 0, f"split {split} has no text! you should check out for that" + + ### 3rd, if provided, create a supervised dataset with labeled data + if len(split.split('+')) > 3 and split.split('+')[3] != '': + assert len(paired_splits) > 0, f"supervised dataset can not be loaded without text paired dataset!" + tgt = paired_splits[0].rsplit('.', 1)[1].split("-")[1] + sup_split = split.split('+')[3] + + sup_dataset = HubertDataset( + f"{self.cfg.data}/{sup_split}.tsv", + sample_rate=self.cfg.sample_rate, + label_paths=[f"{self.get_label_dir()}/{sup_split}.{tgt}"], + label_rates=[-1], + pad_list=[self.text_dictionary.pad()], + eos_list=[self.text_dictionary.eos()], + label_processors=[LabelEncoder(self.text_dictionary)], + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=None, + max_sample_size=None, + pad_audio=True, + normalize=self.cfg.normalize, + store_labels=self.cfg.store_labels, + random_crop=False, + single_target=True, + tgt_dict=self.text_dictionary, + add_decoder_target=self.cfg.add_decoder_target, + fine_tuning=True, + tgt_lang_idx=None, + tokenizer=None, + ) + else: + sup_dataset = None + + ### 4th, compose a MultiCorpusDataset + dataset_dict, max_positions_dict, distributions, max_tokens_ratios = self.resample_multi_modality_dataset( + speech_dataset, sup_dataset, mono_datasets, paired_datasets, mono_splits, paired_splits, epoch=epoch, + ) + self.datasets[split] = MultiCorpusDataset( + dataset_dict, + max_positions=max_positions_dict, + distribution=distributions, + max_tokens_ratio=max_tokens_ratios, + seed=self.cfg.text_cfg.seed, + sort_indices=True, + ) + + + def max_positions(self) -> Tuple[int, int]: + return (sys.maxsize, sys.maxsize) + + def filter_indices_by_size( + self, indices: np.array, *args, **kwargs + ) -> np.array: + return indices + + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + skip_remainder_batch=False, + grouped_shuffling=False, + update_epoch_batch_itr=False, + ): + """ + Get an iterator that yields batches of data from the given dataset. + Args: + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_tokens (int, optional): max number of tokens in each batch + (default: None). + max_sentences (int, optional): max number of sentences in each + batch (default: None). + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + required_batch_size_multiple (int, optional): require batch size to + be a multiple of N (default: 1). + seed (int, optional): seed for random number generator for + reproducibility (default: 1). + num_shards (int, optional): shard the data iterator into N + shards (default: 1). + shard_id (int, optional): which shard of the data iterator to + return (default: 0). + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 1). + data_buffer_size (int, optional): number of batches to + preload (default: 0). + disable_iterator_cache (bool, optional): don't cache the + EpochBatchIterator (ignores `FairseqTask::can_reuse_epoch_itr`) + (default: False). + skip_remainder_batch (bool, optional): if set, discard the last + batch in each training epoch, as the last batch is often smaller than + local_batch_size * distributed_word_size (default: ``True``). + grouped_shuffling (bool, optional): group batches with each groups + containing num_shards batches and shuffle groups. Reduces difference + between sequence lengths among workers for batches sorted by length. + update_epoch_batch_itr (bool optional): if true then donot use the cached + batch iterator for the epoch + + Returns: + ~fairseq.iterators.EpochBatchIterator: a batched iterator over the + given dataset split + """ + if self.fine_tuning or not isinstance(dataset, MultiCorpusDataset): + return super().get_batch_iterator( + dataset, + max_tokens=max_tokens, + max_sentences=max_sentences, + max_positions=max_positions, + ignore_invalid_inputs=ignore_invalid_inputs, + required_batch_size_multiple=required_batch_size_multiple, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + data_buffer_size=data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + skip_remainder_batch=skip_remainder_batch, + grouped_shuffling=grouped_shuffling, + update_epoch_batch_itr=update_epoch_batch_itr, + ) + + can_reuse_epoch_itr = ( + not disable_iterator_cache + and not update_epoch_batch_itr + and self.can_reuse_epoch_itr(dataset) + ) + if can_reuse_epoch_itr and dataset in self.dataset_to_epoch_iter: + logger.debug("reusing EpochBatchIterator for epoch {}".format(epoch)) + return self.dataset_to_epoch_iter[dataset] + + assert isinstance(dataset, FairseqDataset) + + # initialize the dataset with the correct starting epoch + dataset.set_epoch(epoch) + + # get indices ordered by example size + with data_utils.numpy_seed(seed): + indices = dataset.ordered_indices() + + # filter examples that are too large + if max_positions is not None: + indices = self.filter_indices_by_size( + indices, dataset, max_positions, ignore_invalid_inputs + ) + + # create mini-batches with given size constraints + batch_sampler = dataset.get_batch_sampler( + indices, + num_shards, + seed, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + split_modality_batch=self.cfg.split_modality_batch, + ) + + # return a reusable, sharded iterator + epoch_iter = iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + skip_remainder_batch=skip_remainder_batch, + disable_shuffling=True, + grouped_shuffling=grouped_shuffling, + ) + + if can_reuse_epoch_itr: + self.dataset_to_epoch_iter[dataset] = epoch_iter + + return epoch_iter + + @classmethod + def _get_size_ratios(cls, ids: List[str], sizes: List[int], alpha: float = 1.0): + """Size ratios for temperature-based sampling + (https://arxiv.org/abs/1907.05019)""" + _sizes = np.array(sizes) + prob = _sizes / _sizes.sum() + smoothed_prob = prob ** alpha + smoothed_prob = smoothed_prob / smoothed_prob.sum() + size_ratio = (smoothed_prob * _sizes.sum()) / _sizes + + o_str = str({_i: f"{prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"original sampling probability: {o_str}") + p_str = str({_i: f"{smoothed_prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"balanced sampling probability: {p_str}") + sr_str = str({_id: f"{size_ratio[i]:.3f}" for i, _id in enumerate(ids)}) + logger.info(f"balanced sampling size ratio: {sr_str}") + return size_ratio.tolist() + + def resample_multi_modality_dataset(self, speech_dataset, sup_dataset, mono_datasets, paired_datasets, mono_splits, paired_splits, epoch=1, train=True): + assert len(mono_datasets+paired_datasets) > 0, f"No text data loaded!" + + if len(mono_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + mono_splits, [len(s) for s in mono_datasets], alpha=self.cfg.text_sampling_alpha + ) + mono_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) for d, r in zip(mono_datasets, size_ratios) + ] + + if len(paired_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + paired_splits, [len(s) for s in paired_datasets], alpha=self.cfg.text_sampling_alpha + ) + paired_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) for d, r in zip(paired_datasets, size_ratios) + ] + + dataset_list = [speech_dataset, sup_dataset] + for datasets in [mono_datasets, paired_datasets]: + if len(datasets) > 1: + dataset_list.append(ConcatDataset(datasets)) + elif len(datasets) == 1: + dataset_list.append(datasets[0]) + else: + dataset_list.append(None) + + ### match speech/text datasets according to modality + dataset_dict = OrderedDict((name, d) for name, d in zip(["speech", "speech_sup", "text_mono", "text_paired"], dataset_list) if d is not None) + max_positions_dict = { + "speech": None, + "speech_sup": None, + "text_mono": (self.cfg.text_cfg.tokens_per_sample, self.cfg.text_cfg.tokens_per_sample), + "text_paired": (self.cfg.text_cfg.tokens_per_sample, self.cfg.text_cfg.tokens_per_sample), + } + max_positions_dict = OrderedDict((name, max_positions_dict[name]) for name in dataset_dict.keys()) + max_tokens_ratios_dict = { + "speech": 1.0, + "speech_sup": 1.0, + "text_mono": 1.0 / 320 / self.cfg.text_cfg.text_maxtokens_ratio, + "text_paired": 1.0 / 320 / self.cfg.text_cfg.text_maxtokens_ratio, + } + max_tokens_ratios = [max_tokens_ratios_dict[name] for name in dataset_dict.keys()] + dataset_lens = np.array([len(dataset) for dataset in dataset_dict.values()]) + dataset_avg_sample_lens = np.array([ + sum([dataset.num_tokens(i) for i in np.random.randint(low=0, high=len(dataset), size=10000)]) / 10000.0 + for dataset in dataset_dict.values() + ]) + + if not "speech" in dataset_dict: + distributions = [l / sum(dataset_lens) for l in dataset_lens] + else: + ## we just keep the batches of speech and non-speech the same, expand_coef is to ensure speech batches is less than others + first_ratio = dataset_lens[0] / sum(dataset_lens) + expand_coef = 1.8 if sup_dataset is None else 1.1 * sum(dataset_lens[0:2]) / dataset_lens[0] + distributions = [expand_coef * max_tokens_ratios[i] * dataset_avg_sample_lens[0] / l for (i, l) in enumerate(dataset_avg_sample_lens)] + distributions[0] = 1.0 + if sup_dataset is not None: + distributions[1] = dataset_lens[1] / dataset_lens[0] + distributions = [first_ratio * d for d in distributions] + + logging.info(f"Number samples of datasets is {dataset_lens}") + logging.info(f"Avg sample length of datasets is {dataset_avg_sample_lens}") + logging.info(f"Sampling distributions is {distributions}") + logging.info(f"Maxtokens ratio is {max_tokens_ratios}") + return dataset_dict, max_positions_dict, distributions, max_tokens_ratios + + def build_tokenizer(self, cfg=None): + logger.info(f"tokenizer: {self.cfg.hubert_tokenizer}") + if self.cfg.hubert_tokenizer != "none": + return encoders.build_bpe(Namespace(**{"bpe": self.cfg.hubert_tokenizer, "sentencepiece_model": self.cfg.sp_path})) + else: + return None + + def load_char_bart_dataset(self, split): + mono_dataset = data_utils.load_indexed_dataset( + f"{self.cfg.text_cfg.text_data}/{split}", + self.text_dictionary, + ) + mono_dataset = StripTokenDataset(mono_dataset, self.text_dictionary.eos()) + mono_dataset = maybe_shorten_dataset( + mono_dataset, + split, + self.cfg.text_cfg.shorten_data_split_list, + self.cfg.text_cfg.shorten_method, + self.cfg.text_cfg.tokens_per_sample - 2, + self.cfg.text_cfg.seed, + ) + logger.info("loaded {} samples from: {}".format(len(mono_dataset), mono_dataset)) + ### prepend bos and eos to dataset + mono_dataset = PrependTokenDataset(mono_dataset, self.text_dictionary.bos()) + mono_dataset = AppendTokenDataset(mono_dataset, self.text_dictionary.eos()) + mask_whole_words = ( + get_whole_word_mask(None, self.text_dictionary) + if self.cfg.text_cfg.mask_whole_words + else None + ) + lang=self.cfg.speech_tgt_lang + mono_dataset = DenoisingDataset( + mono_dataset, + mono_dataset.sizes, + self.text_dictionary, + self.mask_idx, + mask_whole_words, + shuffle=self.cfg.text_cfg.shuffle_instance, + seed=self.cfg.text_cfg.seed, + args=self.cfg.text_cfg, + tgt_lang_idx=_lang_token_index(self.text_dictionary, lang) if self.cfg.text_cfg.prepend_tgt_lang_tag else None, + ) + + return mono_dataset diff --git a/SpeechLM/speechlm/unit_generator.py b/SpeechLM/speechlm/unit_generator.py new file mode 100644 index 0000000..93f9b98 --- /dev/null +++ b/SpeechLM/speechlm/unit_generator.py @@ -0,0 +1,66 @@ +# ---------------------------------------------------------------------------- +# SpeechLM: Enhanced Speech Pre-Training with Unpaired Textual Data (https://arxiv.org/abs/2209.15329) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +""" +Modified form: https://github.com/facebookresearch/fairseq/blob/272c4c5197250997148fb12c0db6306035f166a4/fairseq/sequence_generator.py +""" + +import torch +import numpy as np + +from fairseq.data.audio.speech_to_text_dataset import S2TDataConfig +from fairseq.speech_generator import SpeechGenerator + +class NonAutoregressiveUnitGenerator(SpeechGenerator): + @torch.no_grad() + def generate(self, model, sample, has_targ=False, **kwargs): + model.eval() + + bsz, max_src_len = sample["net_input"]["src_tokens"].size() + n_frames_per_step = model.encoder.n_frames_per_step + out_dim = model.encoder.out_dim + raw_dim = out_dim // n_frames_per_step + + logit, logit_post, out_lens, log_dur_out, _, _ = model( + src_tokens=sample["net_input"]["src_tokens"], + src_lengths=sample["net_input"]["src_lengths"], + speaker=sample["speaker"], + durations=sample["durations"], + pitches=sample["pitches"], + energies=sample["energies"], + ) + if logit_post is not None: + logit = logit_post + + logit = logit.view(bsz, -1, raw_dim) + pred = logit.argmax(dim=-1) + + ## get duration prediction + src_tokens = sample["net_input"]["src_tokens"] + src_lengths = sample["net_input"]["src_lengths"] + padding_mask = src_tokens.eq(model.encoder.padding_idx) + d_factor = 1.0 ## set by model + dur_out = torch.clamp( + torch.round((torch.exp(log_dur_out) - 1) * d_factor).long(), min=0 + ) + dur_out.masked_fill_(padding_mask, 0) + x = src_tokens.unsqueeze(-1) + x, src_out_lens = model.encoder.var_adaptor.length_regulator(x, dur_out) + fa_src_tokens = x.view(bsz, -1) + + finalized = [ + { + "unit": pred[b, :l], + "fa_src": fa_src_tokens[b, :l], + "duration": dur_out[b, :L], + } + for b, l, L in zip(range(bsz), out_lens, src_lengths) + ] + + return finalized diff --git a/SpeechT5/README.md b/SpeechT5/README.md new file mode 100644 index 0000000..d4b0b2b --- /dev/null +++ b/SpeechT5/README.md @@ -0,0 +1,706 @@ +# SpeechT5 + + + + [**SpeechT5**](https://arxiv.org/abs/2110.07205): **Unified-Modal Encoder-Decoder Pre-training for Spoken Language Processing** + +Official PyTorch implementation and pretrained models of SpeechT5 + +- Oct 2021: release preprint in [arXiv](https://arxiv.org/abs/2110.07205) +- Feb 2022: accepted by [ACL 2022](https://www.2022.aclweb.org/) + + +## Pre-Trained Models + +| Model | Pre-training Dataset | Fine-tuning Dataset | Model | +| :------: | :----------------------------------------------: | :-----------------: | :-----: | +| SpeechT5 Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [LibriSpeech LM Dataset](https://www.openslr.org/11/) | - | [HuggingFace](https://huggingface.co/ajyy/SpeechT5/resolve/main/speecht5_base.pt)
    [Google Drive](https://drive.google.com/file/d/1Sq00uZ1pw6Z4OUaqhOWzQEJxIVWgAO5U/view?usp=sharing) | +| SpeechT5 Base | [960 hrs LibriSpeech](http://www.openslr.org/12) + [LibriSpeech LM Dataset](https://www.openslr.org/11/) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [HuggingFace](https://huggingface.co/ajyy/SpeechT5/resolve/main/speecht5_base_asr.pt)
    [Google Drive](https://drive.google.com/file/d/1qLKJ81JPWOGf1MHfjSmgtZyqqTqgI6kT/view?usp=sharing) | +| SpeechT5 Large | [60k hrs Libri-Light](https://github.com/facebookresearch/libri-light) + [LibriSpeech LM Dataset](https://www.openslr.org/11/) | - | [Google Drive](https://drive.google.com/file/d/1M79b1jetSPOVxWVMIX-y0URvDjNskZKp/view?usp=sharing) | + +## Language Model and Vocabulary +| Model | Dataset | Model | Vocabulary | SPM Model | +| :------: | :------: | :---: | :--------: | :-------: | +| LM | [LibriSpeech LM Dataset](https://www.openslr.org/11/) | [LM Model](https://drive.google.com/uc?export=download&id=1y0TGnKAMKUW5C8l8yrvGjh9RRZETPdv7) | [Vocabulary](https://drive.google.com/uc?export=download&id=19hcQ58RHZ6CssxF8Qp6yEF1NW_AXxObK) | [SPM Model](https://drive.google.com/uc?export=download&id=1wClgQjXXoU2lmpbaEa1v2SqMbg7cAutq) | + + +## Setup +``` +git submodule update --init SpeechT5/fairseq +cd SpeechT5/ +pip install --editable fairseq/ +pip install espnet +``` + + + +## Load Pre-Trained Models + +```python +import torch +from speecht5.tasks.speecht5 import SpeechT5Task +from speecht5.models.speecht5 import T5TransformerModel + +checkpoint = torch.load('/path/to/speecht5_checkpoint') + +checkpoint['cfg']['task'].t5_task = 'pretrain' +checkpoint['cfg']['task'].hubert_label_dir = "/path/to/hubert_label" +checkpoint['cfg']['task'].data = "/path/to/tsv_file" + +task = SpeechT5Task.setup_task(checkpoint['cfg']['task']) +model = T5TransformerModel.build_model(checkpoint['cfg']['model'], task) +model.load_state_dict(checkpoint['model']) +``` + +## Data Preparation + +### Speech data and S2T Data +Please follow the steps for preparing wav2vec 2.0 manifest in [here](https://github.com/pytorch/fairseq/tree/main/examples/wav2vec#prepare-training-data-manifest) and preparing HuBERT label in [here](https://github.com/facebookresearch/fairseq/tree/main/examples/hubert/simple_kmeans). + +We add a third column for the speaker embedding, which is provided in [here](https://drive.google.com/uc?export=download&id=16QOUURZBrW7-GYbVG_gXt3mTMlZmQoH0). +It includes the speaker embeddings for 960hr training data and dev-other data of LibriSpeech. + +We also provide example manifests for your reference in [here](https://drive.google.com/drive/folders/1Ja08XjOHe6vP8lZtLVrJM8173aPQCR_y?usp=sharing). + +### Text Data +Please use [fairseq-preprocess](https://fairseq.readthedocs.io/en/latest/command_line_tools.html#fairseq-preprocess) to generate the index and bin files of the text data. Note that we use sentencepiece to pre-process the text, so please refer to [here](https://github.com/microsoft/SpeechT5/tree/main/SpeechT5#language-model-and-vocabulary) to download the SPM model and dictionary for preparing text data. This means you firstly need to use the SPM model to process the text and then use [fairseq-preprocess](https://fairseq.readthedocs.io/en/latest/command_line_tools.html#fairseq-preprocess) with the provided dictionary to get the index and bin files. + +## Pre-Training + +### 960hr LibriSpeech + LibriSpeech-LM + +``` +DATA_ROOT= +SAVE_DIR= +LABEL_DIR= +TRAIN_SET="speech_train|text_train" +VALID_SET="speech_valid|text_valid" + + +fairseq-train ${DATA_ROOT} \ + --save-dir ${SAVE_DIR} \ + --tensorboard-logdir ${SAVE_DIR} \ + --train-subset ${TRAIN_SET} \ + --valid-subset ${VALID_SET} \ + --hubert-label-dir ${LABEL_DIR} \ + --distributed-world-size 32 \ + --distributed-port 0 \ + --ddp-backend legacy_ddp \ + --user-dir SpeechT5/speecht5 \ + --log-format json \ + --seed 1337 \ + --fp16 \ + \ + --task speecht5 \ + --t5-task pretrain \ + --label-rates 50 \ + --sample-rate 16000 \ + --random-crop \ + \ + --num-workers 0 \ + --max-tokens 1400000 \ + --max-speech-sample-size 250000 \ + --update-freq 2 \ + --batch-ratio "[1,0.0086]" \ + \ + --criterion speecht5 \ + --optimizer adam \ + --reset-optimizer \ + --adam-betas "(0.9, 0.98)" \ + --adam-eps 1e-06 \ + --weight-decay 0.01 \ + --power 1 \ + --clip-norm 5.0 \ + --lr 0.0002 \ + --lr-scheduler polynomial_decay \ + \ + --max-update 800000 \ + --warmup-updates 64000 \ + --total-num-update 800000 \ + --save-interval-updates 3000 \ + --skip-invalid-size-inputs-valid-test \ + --required-batch-size-multiple 1 \ + \ + --arch t5_transformer_base \ + --share-input-output-embed \ + --find-unused-parameters \ + --bert-init \ + --relative-position-embedding \ + --use-codebook \ + --codebook-prob 0.1 \ + --loss-weights="[10,0.1]" \ + --max-text-positions 600 \ +``` + +## Finetune + +### ASR + +The fine-tuned ASR model can be used directly using Hugging Face Transformers. The checkpoint is available at [hf.co/microsoft/speecht5_asr](https://huggingface.co/microsoft/speecht5_asr). An interactive demo is [available here](https://huggingface.co/spaces/Matthijs/speecht5-asr-demo). + +#### Training + +``` +DATA_ROOT= +SAVE_DIR= +TRAIN_SET= +VALID_SET= +LABEL_DIR= +BPE_TOKENIZER= +USER_DIR= +PT_CHECKPOINT_PATH= + +mkdir -p ${SAVE_DIR} +fairseq-train ${DATA_ROOT} \ + --save-dir ${SAVE_DIR} \ + --tensorboard-logdir ${SAVE_DIR} \ + --train-subset ${TRAIN_SET} \ + --valid-subset ${VALID_SET} \ + --hubert-label-dir ${LABEL_DIR} \ + --distributed-world-size 8 \ + --distributed-port 0 \ + --ddp-backend legacy_ddp \ + --user-dir ${USER_DIR} \ + --log-format json \ + --seed 1 \ + --fp16 \ + \ + --task speecht5 \ + --t5-task s2t \ + --sample-rate 16000 \ + --num-workers 0 \ + --max-tokens 1600000 \ + --update-freq 2 \ + --bpe-tokenizer ${BPE_TOKENIZER} \ + \ + --criterion speecht5 \ + --report-accuracy \ + --zero-infinity \ + --ce-weight 0.5 \ + --ctc-weight 0.5 \ + --sentence-avg \ + \ + --optimizer adam \ + --adam-betas "(0.9, 0.98)" \ + --adam-eps 1e-08 \ + --weight-decay 0.1 \ + --clip-norm 25.0 \ + --lr 0.00006 \ + --lr-scheduler tri_stage \ + --phase-ratio "[0.1, 0.4, 0.5]" \ + --final-lr-scale 0.05 \ + \ + --max-update 80000 \ + --max-text-positions 600 \ + --required-batch-size-multiple 1 \ + --save-interval-updates 3000 \ + --skip-invalid-size-inputs-valid-test \ + \ + --arch t5_transformer_base_asr \ + --share-input-output-embed \ + --find-unused-parameters \ + --bert-init \ + --relative-position-embedding \ + --freeze-encoder-updates 13000 \ + \ + --keep-last-epochs 10 \ + --feature-grad-mult 1.0 \ + --best-checkpoint-metric s2t_accuracy \ + --maximize-best-checkpoint-metric \ + --finetune-from-model ${PT_CHECKPOINT_PATH} +``` + +#### Inference +Note that joint CTC/Decoder inference is only supported when batch size is 1. + +``` +CHECKPOINT_PATH= +DATA_ROOT= +SUBSET= +BPE_TOKENIZER= +LABEL_DIR= +USER_DIR= +BEAM= +MAX_TOKENS= +CTC_WEIGHT= +LM_WEIGHT= +LM_PATH= + +fairseq-generate ${DATA_ROOT} \ + --gen-subset ${SUBSET} \ + --bpe-tokenizer ${BPE_TOKENIZER} \ + --user-dir ${USER_DIR} \ + --task speecht5 \ + --t5-task s2t \ + --path ${CHECKPOINT_PATH} \ + --hubert-label-dir ${LABEL_DIR} \ + --ctc-weight ${CTC_WEIGHT} \ + --lm-weight ${LM_WEIGHT} \ + --lm-path ${LM_PATH} \ + --max-tokens ${MAX_TOKENS} \ + --beam ${BEAM} \ + --scoring wer \ + --max-len-a 0 \ + --max-len-b 620 \ + --sample-rate 16000 +``` + +### TTS + +The manifest and pre-trained vocoder can be found in [huggingface](https://huggingface.co/mechanicalsea/speecht5-tts), which may be helpful to reproduce the results of SpeechT5 TTS model. + +We also provide re-implementation of TTS fine-tuned model [speecht5_tts.pt](https://huggingface.co/mechanicalsea/speecht5-tts/blob/main/speecht5_tts.pt), but with a smaller batch size or max updates, which can be helpful. + +This fine-tuned TTS model can also be used directly using Hugging Face Transformers. The checkpoint is available at [hf.co/microsoft/speecht5_tts](https://huggingface.co/microsoft/speecht5_tts). An interactive demo is [available here](https://huggingface.co/spaces/Matthijs/speecht5-tts-demo). Also see [this Colab notebook](https://colab.research.google.com/drive/1i7I5pzBcU3WDFarDnzweIj4-sVVoIUFJ) on how to fine-tune SpeechT5 for TTS using Hugging Face. + +#### Training + +``` +DATA_ROOT= +SAVE_DIR= +TRAIN_SET= +VALID_SET= +LABEL_DIR= +BPE_TOKENIZER= +USER_DIR= +PT_CHECKPOINT_PATH= + +fairseq-train ${DATA_ROOT} \ + --save-dir ${SAVE_DIR} \ + --tensorboard-logdir ${SAVE_DIR} \ + --train-subset ${TRAIN_SET} \ + --valid-subset ${VALID_SET} \ + --hubert-label-dir ${LABEL_DIR} \ + --distributed-world-size 8 \ + --distributed-port 0 \ + --ddp-backend legacy_ddp \ + --user-dir ${USER_DIR} \ + --log-format json \ + --seed 1 \ + --fp16 \ + \ + --task speecht5 \ + --t5-task t2s \ + --sample-rate 16000 \ + --num-workers 4 \ + --max-tokens 3200000 \ + --update-freq 1 \ + --bpe-tokenizer ${BPE_TOKENIZER} \ + --max-tokens-valid 3200000 \ + \ + --criterion speecht5 \ + --use-guided-attn-loss \ + --report-accuracy \ + --sentence-avg \ + \ + --optimizer adam \ + --adam-betas "(0.9, 0.98)" \ + --dropout 0.15 \ + --activation-dropout 0.15 \ + --attention-dropout 0.15 \ + --encoder-layerdrop 0.0 \ + --decoder-layerdrop 0.0 \ + --weight-decay 0.0 \ + --clip-norm 25.0 \ + --lr 0.0001 \ + --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 \ + --feature-grad-mult 1.0 \ + \ + --max-update 120000 \ + --max-text-positions 600 \ + --min-speech-sample-size 1056 \ + --max-speech-sample-size 480256 \ + --max-speech-positions 1876 \ + --required-batch-size-multiple 1 \ + --skip-invalid-size-inputs-valid-test \ + --keep-last-epochs 10 \ + --validate-after-updates 20000 \ + --validate-interval 50 \ + --log-interval 10 \ + \ + --arch t5_transformer_base_asr \ + --share-input-output-embed \ + --find-unused-parameters \ + --bert-init \ + --relative-position-embedding \ + --freeze-encoder-updates 20000 \ + \ + --finetune-from-model ${PT_CHECKPOINT_PATH} +``` + +#### Inference + +Generating speech is available only if batch size is 1. + +``` +SPEECHT5_CODE_DIR= +CHECKPOINT_PATH= +DATA_ROOT= +SUBSET= +BPE_TOKENIZER= +LABEL_DIR= +USER_DIR= +RESULTS_PATH= + +python3 ${SPEECHT5_CODE_DIR}/SpeechT5/scripts/generate_speech.py ${DATA_ROOT} \ + --gen-subset ${SUBSET} \ + --bpe-tokenizer ${BPE_TOKENIZER} \ + --user-dir ${USER_DIR} \ + --task speecht5 \ + --t5-task t2s \ + --path ${CHECKPOINT_PATH} \ + --hubert-label-dir ${LABEL_DIR} \ + --batch-size 1 \ + --results-path ${RESULTS_PATH} \ + --sample-rate 16000 +``` + +### ST + +Here we follow [fairseq/speech_to_text/mustc](https://github.com/facebookresearch/fairseq/blob/main/examples/speech_to_text/docs/mustc_example.md#data-preparation) to generate vocabulary, which is different from the pre-trained models. So we randomly initilize the embedding table of the pre-trained models during fine-tuning. + +#### Training + +``` +DATA_ROOT= +SAVE_DIR= +TRAIN_SET= +VALID_SET= +LABEL_DIR= +BPE_TOKENIZER= +USER_DIR= +PT_CHECKPOINT_PATH= + +fairseq-train ${DATA_ROOT} \ + --save-dir ${SAVE_DIR} \ + --tensorboard-logdir ${SAVE_DIR} \ + --train-subset ${TRAIN_SET} \ + --valid-subset ${VALID_SET} \ + --hubert-label-dir ${LABEL_DIR} \ + --distributed-world-size 8 \ + --distributed-port 0 \ + --ddp-backend legacy_ddp \ + --user-dir ${USER_DIR} \ + --log-format json \ + --seed 1 \ + --fp16 \ + \ + --task speecht5 \ + --t5-task s2t \ + --sample-rate 16000 \ + --num-workers 6 \ + --max-tokens 480256 \ + --update-freq 4 \ + --bpe-tokenizer ${BPE_TOKENIZER} \ + --max-tokens-valid 3200000 \ + \ + --criterion speecht5 \ + --label-smoothing 0.1 \ + --report-accuracy \ + --sentence-avg \ + \ + --optimizer adam \ + --adam-betas "(0.9, 0.98)" \ + --weight-decay 0.0 \ + --clip-norm 10.0 \ + --lr 0.0002 \ + --lr-scheduler inverse_sqrt \ + --warmup-updates 25000 \ + --feature-grad-mult 1.0 \ + \ + --max-update 80000 \ + --max-text-positions 600 \ + --min-speech-sample-size 1056 \ + --max-speech-sample-size 480256 \ + --max-speech-positions 1876 \ + --required-batch-size-multiple 1 \ + --skip-invalid-size-inputs-valid-test \ + --keep-last-epochs 10 \ + \ + --arch t5_transformer_base_asr \ + --share-input-output-embed \ + --find-unused-parameters \ + --bert-init \ + --relative-position-embedding \ + --freeze-encoder-updates 0 \ + --mask-prob 0.5 \ + --mask-channel-prob 0.5 \ + \ + --finetune-from-model ${PT_CHECKPOINT_PATH} +``` + +#### Inference + +``` +FAIRSEQ_DIR= +CHECKPOINT_PATH= +DATA_ROOT= +BPE_TOKENIZER= +LABEL_DIR= +USER_DIR= +MAX_TOKENS= + +python3 ${FAIRSEQ_DIR}/scripts/average_checkpoints.py \ + --inputs ${CHECKPOINT_PATH} \ + --num-epoch-checkpoints 10 \ + --output ${CHECKPOINT_PATH}/avg_last_10_checkpoint.pt + +fairseq-generate ${DATA_ROOT} \ + --gen-subset tst-COMMON \ + --bpe-tokenizer ${BPE_TOKENIZER} \ + --user-dir ${USER_DIR} \ + --task speecht5 \ + --t5-task s2t \ + --path ${CHECKPOINT_PATH}/avg_last_10_checkpoint.pt \ + --hubert-label-dir ${LABEL_DIR} \ + --max-tokens ${MAX_TOKENS} \ + --min-speech-sample-size 1056 \ + --beam 5 \ + --scoring sacrebleu \ + --max-len-a 0 \ + --max-len-b 620 \ + --sample-rate 16000 +``` + +### VC + +The manifest and pre-trained vocoder can be found in [huggingface](https://huggingface.co/mechanicalsea/speecht5-vc), which may be helpful to reproduce the results of SpeechT5 VC model. + +We also provide re-implementation of VC fine-tuned model [speecht5_vc.pt](https://huggingface.co/mechanicalsea/speecht5-vc/blob/main/speecht5_vc.pt), but with a smaller batch size or max updates, which can be helpful. + +This fine-tuned VC model can also be used directly using Hugging Face Transformers. The checkpoint is available at [hf.co/microsoft/speecht5_vc](https://huggingface.co/microsoft/speecht5_vc). An interactive demo is [available here](https://huggingface.co/spaces/Matthijs/speecht5-vc-demo). + +#### Training + + +``` +DATA_ROOT= +SAVE_DIR= +TRAIN_SET= +VALID_SET= +LABEL_DIR= +BPE_TOKENIZER= +USER_DIR= +PT_CHECKPOINT_PATH= + +fairseq-train ${DATA_ROOT} \ + --save-dir ${SAVE_DIR} \ + --tensorboard-logdir ${SAVE_DIR} \ + --train-subset ${TRAIN_SET} \ + --valid-subset ${VALID_SET} \ + --hubert-label-dir ${LABEL_DIR} \ + --distributed-world-size 8 \ + --distributed-port 0 \ + --ddp-backend legacy_ddp \ + --user-dir ${USER_DIR} \ + --log-format json \ + --seed 1 \ + --fp16 \ + \ + --task speecht5 \ + --t5-task s2s \ + --sample-rate 16000 \ + --num-workers 4 \ + --max-tokens 1280000 \ + --update-freq 3 \ + --max-tokens-valid 1280000 \ + \ + --criterion speecht5 \ + --use-guided-attn-loss \ + --report-accuracy \ + --sentence-avg \ + \ + --optimizer adam \ + --dropout 0.2 \ + --activation-dropout 0.2 \ + --attention-dropout 0.2 \ + --encoder-layerdrop 0.05 \ + --decoder-layerdrop 0.0 \ + --clip-norm 1.0 \ + --lr 0.0001 \ + --lr-scheduler inverse_sqrt \ + --warmup-updates 6000 \ + --feature-grad-mult 1.0 \ + \ + --max-update 60000 \ + --max-text-positions 600 \ + --min-speech-sample-size 1056 \ + --max-speech-sample-size 480256 \ + --max-speech-positions 1876 \ + --required-batch-size-multiple 1 \ + --skip-invalid-size-inputs-valid-test \ + --keep-last-epochs 10 \ + --save-interval-updates 10000 \ + --disable-validation \ + --log-interval 10 \ + \ + --arch t5_transformer_base_asr \ + --share-input-output-embed \ + --find-unused-parameters \ + --bert-init \ + --relative-position-embedding \ + --mask-prob 0.0 \ + --mask-channel-prob 0.0 \ + \ + --finetune-from-model ${PT_CHECKPOINT_PATH} +``` + +#### Inference + +Generating speech is available only if batch size is 1. + +``` +SPEECHT5_CODE_DIR= +CHECKPOINT_PATH= +DATA_ROOT= +SUBSET= +LABEL_DIR= +USER_DIR= +RESULTS_PATH= + +python3 ${SPEECHT5_CODE_DIR}/SpeechT5/scripts/generate_speech.py ${DATA_ROOT} \ + --gen-subset test \ + --user-dir ${USER_DIR} \ + --task speecht5 \ + --t5-task s2s \ + --path ${CHECKPOINT_PATH} \ + --hubert-label-dir ${LABEL_DIR} \ + --batch-size 1 \ + --results-path ${RESULTS_PATH} \ + --sample-rate 16000 +``` + +### SID + +The manifest can be found in [huggingface](https://huggingface.co/mechanicalsea/speecht5-sid), which may be helpful to reproduce the results of SpeechT5 SID model. + +We also provide re-implementation of SID fine-tuned model [speecht5_sid.pt](https://huggingface.co/mechanicalsea/speecht5-sid/blob/main/speecht5_sid.pt) with training log and results, **but in a smaller batch size**, which can be helpful. + +#### Training + + +``` +DATA_ROOT= +SAVE_DIR= +TRAIN_SET= +VALID_SET= +USER_DIR= +PT_CHECKPOINT_PATH= + +mkdir -p ${SAVE_DIR} + +fairseq-train ${DATA_ROOT} \ + --save-dir ${SAVE_DIR} \ + --tensorboard-logdir ${SAVE_DIR} \ + --train-subset ${TRAIN_SET} \ + --valid-subset ${VALID_SET} \ + --user-dir ${USER_DIR} \ + --distributed-world-size 8 \ + --distributed-port 0 \ + --ddp-backend legacy_ddp \ + --log-format json \ + --seed 1 \ + --fp16 \ + \ + --task speecht5 \ + --t5-task s2c \ + --sample-rate 16000 \ + --num-workers 4 \ + --batch-size 8 \ + --update-freq 2 \ + --data-buffer-size 0 \ + \ + --criterion speecht5 \ + --report-accuracy \ + --best-checkpoint-metric "s2c_accuracy" \ + --maximize-best-checkpoint-metric \ + \ + --optimizer adam \ + --dropout 0.1 \ + --activation-dropout 0.1 \ + --attention-dropout 0.1 \ + --encoder-layerdrop 0.05 \ + --lr-scheduler triangular \ + --max-lr 2e-4 \ + --lr-period-updates 60000 \ + --lr-shrink 0.5 \ + --lr 1e-8 \ + --feature-grad-mult 1.0 \ + --weight-decay 0.1 \ + \ + --max-update 60000 \ + --max-text-positions 600 \ + --max-speech-positions 8000 \ + --required-batch-size-multiple 1 \ + --skip-invalid-size-inputs-valid-test \ + --save-interval-updates 10000 \ + --validate-after-updates 20000 \ + --no-epoch-checkpoints \ + --log-interval 10 \ + \ + --arch t5_transformer_base_asr \ + --share-input-output-embed \ + --find-unused-parameters \ + --bert-init \ + --relative-position-embedding \ + --mask-prob 0.0 \ + --mask-channel-prob 0.0 \ + --sid-no-pooling-bn \ + --sid-no-embed-postnet \ + \ + --finetune-from-model ${PT_CHECKPOINT_PATH} +``` + +#### Inference + + +``` +CHECKPOINT_PATH= +DATA_ROOT= +SUBSET= +USER_DIR= +RESULTS_PATH= + +mkdir -p ${RESULTS_PATH} + +python scripts/generate_class.py ${DATA_ROOT} \ + --gen-subset ${SUBSET} \ + --user-dir ${USER_DIR} \ + --log-format json \ + --task speecht5 \ + --t5-task s2c \ + --path ${CHECKPOINT_PATH} \ + --results-path ${RESULTS_PATH} \ + --batch-size 1 \ + --max-speech-positions 8000 \ + --sample-rate 16000 +``` + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq) and [ESPnet](https://github.com/espnet/espnet) projects. + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +### Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{Ao2021SpeechT5, + title = {SpeechT5: Unified-Modal Encoder-Decoder Pre-training for Spoken Language Processing}, + author = {Junyi Ao and Rui Wang and Long Zhou and Chengyi Wang and Shuo Ren and Yu Wu and Shujie Liu and Tom Ko and Qing Li and Yu Zhang and Zhihua Wei and Yao Qian and Jinyu Li and Furu Wei}, + eprint={2110.07205}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + year={2021} +} +``` + +### Contact Information + +For help or issues using SpeechT5 models, please submit a GitHub issue. + +For other communications related to SpeechT5, please contact Long Zhou (`lozhou@microsoft.com`). diff --git a/SpeechT5/asr_train/train.ltr b/SpeechT5/asr_train/train.ltr new file mode 100644 index 0000000..cd4f278 --- /dev/null +++ b/SpeechT5/asr_train/train.ltr @@ -0,0 +1,2674 @@ +E V E N | O N | T H I S | L E D G E | O F | H U M A N | S O C I E T Y | T H E R E | W A S | A | S T U N T E D | G R O W T H | O F | S H O P L E T S | W H I C H | H A D | T A K E N | R O O T | A N D | V E G E T A T E D | S O M E H O W | T H O U G H | A S | I N | A N | A I R | M E R C A N T I L E | O F | T H E | B L E A K E S T | +S H O R T L Y | A F T E R | P A S S I N G | O N E | O F | T H E S E | C H A P E L S | W E | C A M E | S U D D E N L Y | U P O N | A | V I L L A G E | W H I C H | S T A R T E D | U P | O U T | O F | T H E | M I S T | A N D | I | W A S | A L A R M E D | L E S T | I | S H O U L D | B E | M A D E | A N | O B J E C T | O F | C U R I O S I T Y | O R | D I S L I K E | +T H E | S T R E E T S | W E R E | N A R R O W | A N D | U N P A V E D | B U T | V E R Y | F A I R L Y | C L E A N | +I N | A B O U T | F O U R | H O U R S | O F | W A L K I N G | F R O M | T H E | T I M E | W E | S T A R T E D | A N D | A F T E R | P A S S I N G | T W O | O R | T H R E E | M O R E | V I L L A G E S | W E | C A M E | U P O N | A | C O N S I D E R A B L E | T O W N | A N D | M Y | G U I D E S | M A D E | M A N Y | A T T E M P T S | T O | M A K E | M E | U N D E R S T A N D | S O M E T H I N G | B U T | I | G A T H E R E D | N O | I N K L I N G | O F | T H E I R | M E A N I N G | E X C E P T | T H A T | I | N E E D | B E | U N D E R | N O | A P P R E H E N S I O N | O F | D A N G E R | +T H E | V I N E | G R E W | O U T S I D E | M A N Y | O F | T H E | H O U S E S | A N D | T H E R E | W E R E | S O M E | W I T H | S I G N | B O A R D S | O N | W H I C H | W A S | P A I N T E D | A | B O T T L E | A N D | A | G L A S S | T H A T | M A D E | M E | F E E L | M U C H | A T | H O M E | +E V E N | I N | M I D D L E | A G E | T H E Y | W E R E | S T I L L | C O M E L Y | A N D | T H E | O L D | G R E Y | H A I R E D | W O M E N | A T | T H E I R | C O T T A G E | D O O R S | H A D | A | D I G N I T Y | N O T | T O | S A Y | M A J E S T Y | O F | T H E I R | O W N | +I | H A V E | A L W A Y S | D E L I G H T E D | I N | A N D | R E V E R E N C E D | B E A U T Y | B U T | I | F E L T | S I M P L Y | A B A S H E D | I N | T H E | P R E S E N C E | O F | S U C H | A | S P L E N D I D | T Y P E | A | C O M P O U N D | O F | A L L | T H A T | I S | B E S T | I N | E G Y P T I A N | G R E E K | A N D | I T A L I A N | +T H E | C H I L D R E N | W E R E | I N F I N I T E | I N | N U M B E R | A N D | E X C E E D I N G L Y | M E R R Y | I | N E E D | H A R D L Y | S A Y | T H A T | T H E Y | C A M E | I N | F O R | T H E I R | F U L L | S H A R E | O F | T H E | P R E V A I L I N G | B E A U T Y | +T H E | D E S I G N | W A S | D I F F E R E N T | B U T | T H E | T H I N G | W A S | C L E A R L Y | T H E | S A M E | +T H E | O T H E R | L O O K E D | P A L E | A N D | I L L | B U T | H E | W A S | M A R V E L L O U S L Y | S E L F | C O N T A I N E D | A N D | I T | W A S | I M P O S S I B L E | T O | S A Y | W H A T | W A S | T H E | M A T T E R | W I T H | H I M | +W E | P A S S E D | M A N Y | C A S E S | A N D | A T | L A S T | C A M E | T O | O N E | I N | W H I C H | T H E R E | W E R E | S E V E R A L | C L O C K S | A N D | T W O | O R | T H R E E | O L D | W A T C H E S | +M Y | G U I D E S | H O W E V E R | W E R E | W E L L | K N O W N | A N D | T H E | N A T U R A L | P O L I T E N E S S | O F | T H E | P E O P L E | P R E V E N T E D | T H E M | F R O M | P U T T I N G | M E | T O | A N Y | I N C O N V E N I E N C E | B U T | T H E Y | C O U L D | N O T | H E L P | E Y E I N G | M E | N O R | I | T H E M | +I | S A W | A | F E W | S H E E P | W I T H | R O U N D E D | N O S E S | A N D | E N O R M O U S | T A I L S | +T H I S | H A D | S O M E | E F F E C T | I N | C A L M I N G | H I M | +E A C H | F E A T U R E | W A S | F I N I S H E D | E Y E L I D S | E Y E L A S H E S | A N D | E A R S | B E I N G | A L M O S T | I N V A R I A B L Y | P E R F E C T | +B U T | B Y | A N D | B Y | T H E Y | C A M E | T O | M Y | W A T C H | W H I C H | I | H A D | H I D D E N | A W A Y | I N | T H E | I N M O S T | P O C K E T | T H A T | I | H A D | A N D | H A D | F O R G O T T E N | W H E N | T H E Y | B E G A N | T H E I R | S E A R C H | +T H E | C O U N T R Y | W A S | H I G H L Y | C U L T I V A T E D | E V E R Y | L E D G E | B E I N G | P L A N T E D | W I T H | C H E S T N U T S | W A L N U T S | A N D | A P P L E | T R E E S | F R O M | W H I C H | T H E | A P P L E S | W E R E | N O W | G A T H E R I N G | +T H E I R | E X P R E S S I O N | W A S | D I V I N E | A N D | A S | T H E Y | G L A N C E D | A T | M E | T I M I D L Y | B U T | W I T H | P A R T E D | L I P S | I N | G R E A T | B E W I L D E R M E N T | I | F O R G O T | A L L | T H O U G H T S | O F | T H E I R | C O N V E R S I O N | I N | F E E L I N G S | T H A T | W E R E | F A R | M O R E | E A R T H L Y | +T H E Y | F E L T | M Y | P U L S E | T H E Y | L O O K E D | A T | M Y | T O N G U E | T H E Y | L I S T E N E D | A T | M Y | C H E S T | T H E Y | F E L T | A L L | M Y | M U S C L E S | A N D | A T | T H E | E N D | O F | E A C H | O P E R A T I O N | T H E Y | L O O K E D | A T | T H E | C H I E F | A N D | N O D D E D | A N D | S A I D | S O M E T H I N G | I N | A | T O N E | Q U I T E | P L E A S A N T | A S | T H O U G H | I | W E R E | A L L | R I G H T | +A G A I N | T H E R E | W A S | A | V E R Y | O L D | C A R R I A G E | W H O S E | W H E E L S | I N | S P I T E | O F | R U S T | A N D | D E C A Y | I | C O U L D | S E E | H A D | B E E N | D E S I G N E D | O R I G I N A L L Y | F O R | I R O N | R A I L S | +I | E X P R E S S E D | B Y | S I G N S | M Y | A D M I R A T I O N | A N D | P L E A S U R E | T O | M Y | G U I D E S | A N D | T H E Y | W E R E | G R E A T L Y | P L E A S E D | +H E | B E G A N | P R E S E N T L Y | T O | R E L E N T | A N D | S P O K E | T O | M E | I N | A | K I N D E R | M A N N E R | +I N | F A C T | O N E | O F | T H E M | W A S | P L A I N L Y | V E R Y | M U C H | O U T | O F | H E A L T H | A N D | C O U G H E D | V I O L E N T L Y | F R O M | T I M E | T O | T I M E | I N | S P I T E | O F | M A N I F E S T | E F F O R T S | T O | S U P P R E S S | I T | +S U F F I C E | I T | T H A T | I | F O U N D | M Y S E L F | T A K E N | B E F O R E | T H E | C H I E F | M A G I S T R A T E | A N D | B Y | H I S | O R D E R S | W A S | P L A C E D | I N | A N | A P A R T M E N T | W I T H | T W O | O T H E R | P E O P L E | W H O | W E R E | T H E | F I R S T | I | H A D | S E E N | L O O K I N G | A N Y T H I N G | B U T | W E L L | A N D | H A N D S O M E | +I T | I S | S U R P R I S I N G | H O W | S O O N | T H E | E Y E | B E C O M E S | A C C U S T O M E D | T O | M I S S I N G | T W E N T Y | S H E E P | O U T | O F | T W O | O R | T H R E E | H U N D R E D | +I | W A S | D E L I G H T E D | W I T H | T H E | C O U N T R Y | A N D | T H E | M A N N E R | O F | L I F E | +I | R E A C H E D | M Y | D E S T I N A T I O N | I N | O N E | O F | T H E | L A S T | M O N T H S | O F | E I G H T E E N | S I X T Y | E I G H T | B U T | I | D A R E | N O T | M E N T I O N | T H E | S E A S O N | L E S T | T H E | R E A D E R | S H O U L D | G A T H E R | I N | W H I C H | H E M I S P H E R E | I | W A S | +E A C H | M U S T | C R Y | L O U D E R | A N D | W A N D E R | F A R T H E R | Y E T | M A Y | L U C K | B E | W I T H | T H E M | B O T H | T H A T | T H E Y | M A Y | F I N D | T H E I R | O W N | A T | N I G H T F A L L | +N O | O N E | W H O | I S | H I M S E L F | H O N E S T | W I L L | D O U B T | M Y | B E I N G | S O | +I | H A D | N O | M O N E Y | B U T | I F | I | C O U L D | O N L Y | F I N D | W O R K A B L E | C O U N T R Y | I | M I G H T | S T O C K | I T | W I T H | B O R R O W E D | C A P I T A L | A N D | C O N S I D E R | M Y S E L F | A | M A D E | M A N | +I F | T H E | R E A D E R | W I L L | E X C U S E | M E | I | W I L L | S A Y | N O T H I N G | O F | M Y | A N T E C E D E N T S | N O R | O F | T H E | C I R C U M S T A N C E S | W H I C H | L E D | M E | T O | L E A V E | M Y | N A T I V E | C O U N T R Y | T H E | N A R R A T I V E | W O U L D | B E | T E D I O U S | T O | H I M | A N D | P A I N F U L | T O | M Y S E L F | +I | W A S | T O | S E E | T H E | S H E E P | N O T | N E C E S S A R I L Y | C L O S E | A T | H A N D | N O R | T O | G E T | T H E M | I N | A | S I N G L E | M O B | B U T | T O | S E E | E N O U G H | O F | T H E M | H E R E | A N D | T H E R E | T O | F E E L | E A S Y | T H A T | N O T H I N G | H A D | G O N E | W R O N G | T H I S | W A S | N O | D I F F I C U L T | M A T T E R | F O R | T H E R E | W E R E | N O T | A B O V E | E I G H T | H U N D R E D | O F | T H E M | A N D | B E I N G | A L L | B R E E D I N G | E W E S | T H E Y | W E R E | P R E T T Y | Q U I E T | +I | W O U L D | T R Y | T H E | N E A R E R | R A N G E | A N D | S E E | H O W | F A R | I | C O U L D | G O | +S H E E P | A N D | C A T T L E | W E R E | I N T R O D U C E D | A N D | B R E D | W I T H | E X T R E M E | R A P I D I T Y | M E N | T O O K | U P | T H E I R | F I F T Y | T H O U S A N D | O R | O N E | H U N D R E D | T H O U S A N D | A C R E S | O F | C O U N T R Y | G O I N G | I N L A N D | O N E | B E H I N D | T H E | O T H E R | T I L L | I N | A | F E W | Y E A R S | T H E R E | W A S | N O T | A N | A C R E | B E T W E E N | T H E | S E A | A N D | T H E | F R O N T | R A N G E S | W H I C H | W A S | N O T | T A K E N | U P | A N D | S T A T I O N S | E I T H E R | F O R | S H E E P | O R | C A T T L E | W E R E | S P O T T E D | A B O U T | A T | I N T E R V A L S | O F | S O M E | T W E N T Y | O R | T H I R T Y | M I L E S | O V E R | T H E | W H O L E | C O U N T R Y | +T H E R E | W E R E | A | G O O D | M A N Y | S H E E P | W H I C H | I | K N E W | A S | T W O | O R | T H R E E | B L A C K | E W E S | A N D | A | B L A C K | L A M B | O R | T W O | A N D | S E V E R A L | O T H E R S | W H I C H | H A D | S O M E | D I S T I N G U I S H I N G | M A R K | W H E R E B Y | I | C O U L D | T E L L | T H E M | +I T | W A S | A | M O N O T O N O U S | L I F E | B U T | I T | W A S | V E R Y | H E A L T H Y | A N D | O N E | D O E S | N O T | M U C H | M I N D | A N Y T H I N G | W H E N | O N E | I S | W E L L | +I T | W I L L | B E | S E E N | T H A T | I | D I D | N O T | S U C C E E D | I N | M Y | D E S I G N | A N D | T H A T | H O W E V E R | M U C H | I | M A Y | H A V E | M E T | W I T H | T H A T | W A S | N E W | A N D | S T R A N G E | I | H A V E | B E E N | U N A B L E | T O | R E A P | A N Y | P E C U N I A R Y | A D V A N T A G E | +T H E | C O U N T R Y | W A S | T H E | G R A N D E S T | T H A T | C A N | B E | I M A G I N E D | +T H E R E | W A S | N O | O N E | I N | T H E | W H O L E | W O R L D | W H O | H A D | T H E | S M A L L E S T | I D E A | S A V E | T H O S E | W H O | W E R E | T H E M S E L V E S | O N | T H E | O T H E R | S I D E | O F | I T | I F | I N D E E D | T H E R E | W A S | A N Y | O N E | A T | A L L | C O U L D | I | H O P E | T O | C R O S S | I T | +S O | L O N E L Y | A N D | S O | S O L E M N | W I T H | T H E | S A D | G R E Y | C L O U D S | A B O V E | A N D | N O | S O U N D | S A V E | A | L O S T | L A M B | B L E A T I N G | U P O N | T H E | M O U N T A I N | S I D E | A S | T H O U G H | I T S | L I T T L E | H E A R T | W E R E | B R E A K I N G | +P R E F A C E | T O | S E C O N D | E D I T I O N | +I | M U S T | N O T | C O N C L U D E | W I T H O U T | E X P R E S S I N G | M Y | M O S T | S I N C E R E | T H A N K S | T O | M Y | C R I T I C S | A N D | T O | T H E | P U B L I C | F O R | T H E | L E N I E N C Y | A N D | C O N S I D E R A T I O N | W I T H | W H I C H | T H E Y | H A V E | T R E A T E D | M Y | A D V E N T U R E S | +T H I S | I S | A | M I S T A K E | T H O U G H | A | P E R F E C T L Y | N A T U R A L | O N E | +I T | W A S | W R I T T E N | I N | T H E | U P P E R | R A N G I T A T A | D I S T R I C T | O F | T H E | C A N T E R B U R Y | P R O V I N C E | A S | I T | T H E N | W A S | O F | N E W | Z E A L A N D | A N D | A P P E A R E D | A T | C H R I S T C H U R C H | I N | T H E | P R E S S | N E W S P A P E R | J U N E | T H I R T E E N T H | E I G H T E E N | S I X T Y | T H R E E | +I | A T T R I B U T E | I T S | U N L O O K E D | F O R | S U C C E S S | M A I N L Y | T O | T W O | E A R L Y | F A V O U R A B L E | R E V I E W S | T H E | F I R S T | I N | T H E | P A L L | M A L L | G A Z E T T E | O F | A P R I L | T W E L F T H | A N D | T H E | S E C O N D | I N | T H E | S P E C T A T O R | O F | A P R I L | T W E N T I E T H | +O N | M Y | R E T U R N | I | P U R P O S E L Y | A V O I D E D | L O O K I N G | I N T O | I T | U N T I L | I | H A D | S E N T | B A C K | M Y | L A S T | R E V I S E S | T O | T H E | P R I N T E R | +T H E | F I R S T | E D I T I O N | O F | E R E W H O N | S O L D | I N | A B O U T | T H R E E | W E E K S | I | H A D | N O T | T A K E N | M O U L D S | A N D | A S | T H E | D E M A N D | W A S | S T R O N G | I T | W A S | S E T | U P | A G A I N | I M M E D I A T E L Y | +B U T | T H I S | H A D | A N | E F F E C T | O F | W H I C H | I | H A V E | L I T T L E | R E A S O N | T O | C O M P L A I N | F O R | I | W A S | A L L O W E D | A L M O S T | T O | C A L L | T H E M | L I F E | L O N G | S E L F | D E C E I V E R S | T O | T H E I R | F A C E S | A N D | T H E Y | S A I D | I T | W A S | Q U I T E | T R U E | B U T | T H A T | I T | D I D | N O T | M A T T E R | +T H I S | H O W E V E R | M A Y | N O T | B E | F O R | T H E | C O P Y R I G H T | W I L L | P R O B A B L Y | E X P I R E | I N | A | L I T T L E | O V E R | T W E L V E | Y E A R S | +I | A M | S U R P R I S E D | H O W E V E R | T H A T | T H E | B O O K | A T | W H I C H | S U C H | A N | E X A M P L E | O F | T H E | S P E C I O U S | M I S U S E | O F | A N A L O G Y | W O U L D | S E E M | M O S T | N A T U R A L L Y | L E V E L L E D | S H O U L D | H A V E | O C C U R R E D | T O | N O | R E V I E W E R | N E I T H E R | S H A L L | I | M E N T I O N | T H E | N A M E | O F | T H E | B O O K | H E R E | T H O U G H | I | S H O U L D | F A N C Y | T H A T | T H E | H I N T | G I V E N | W I L L | S U F F I C E | +I | A L S O | W R O T E | A B O U T | T H I S | T I M E | T H E | S U B S T A N C E | O F | W H A T | U L T I M A T E L Y | B E C A M E | T H E | M U S I C A L | B A N K S | A N D | T H E | T R I A L | O F | A | M A N | F O R | B E I N G | I N | A | C O N S U M P T I O N | +I | R E G R E T | T H A T | R E V I E W E R S | H A V E | I N | S O M E | C A S E S | B E E N | I N C L I N E D | T O | T R E A T | T H E | C H A P T E R S | O N | M A C H I N E S | A S | A N | A T T E M P T | T O | R E D U C E | M I S T E R | D A R W I N ' S | T H E O R Y | T O | A N | A B S U R D I T Y | +T H E R E | W A S | A L S O | A N O T H E R | C A U S E | +I | M A D E | A | F E W | F U R T H E R | V E R Y | T R I F L I N G | A L T E R A T I O N S | B E F O R E | M O U L D S | W E R E | T A K E N | B U T | S I N C E | T H E | S U M M E R | O F | E I G H T E E N | S E V E N T Y | T W O | A S | N E W | E D I T I O N S | W E R E | F R O M | T I M E | T O | T I M E | W A N T E D | T H E Y | H A V E | B E E N | P R I N T E D | F R O M | S T E R E O S | T H E N | M A D E | +I | S E E | F R O M | M Y | S E C O N D | P R E F A C E | T H A T | I | T O O K | T H E | B O O K | T O | M E S S R S | C H A P M A N | A N D | H A L L | M A Y | F I R S T | E I G H T E E N | S E V E N T Y | O N E | A N D | O N | T H E I R | R E J E C T I O N | O F | I T | U N D E R | T H E | A D V I C E | O F | O N E | W H O | H A S | A T T A I N E D | T H E | H I G H E S T | R A N K | A M O N G | L I V I N G | W R I T E R S | I | L E T | I T | S L E E P | T I L L | I | T O O K | I T | T O | M I S T E R | T R U B N E R | E A R L Y | I N | E I G H T E E N | S E V E N T Y | T W O | +I | A M | S T I L L | F A I R L Y | W E L L | S A T I S F I E D | W I T H | T H O S E | P A R T S | O F | E R E W H O N | T H A T | W E R E | R E P E A T E D L Y | R E W R I T T E N | B U T | F R O M | T H O S E | T H A T | H A D | O N L Y | A | S I N G L E | W R I T I N G | I | W O U L D | G L A D L Y | C U T | O U T | S O M E | F O R T Y | O R | F I F T Y | P A G E S | I F | I | C O U L D | +T H E N | I | H A D | M U C H | P L E A S U R E | I N | R E A D I N G | I T | B U T | W A S | I N D E E D | S U R P R I S E D | A T | T H E | M A N Y | L I T T L E | P O I N T S | O F | S I M I L A R I T Y | B E T W E E N | T H E | T W O | B O O K S | I N | S P I T E | O F | T H E I R | E N T I R E | I N D E P E N D E N C E | T O | O N E | A N O T H E R | +T H I S | L A D Y ' S | R I G H T | N A M E | W A S | J O A N | B U T | B E C A U S E | O F | H E R | C O M E L I N E S S | O R | A T | L E A S T | I T | W A S | S O | I M A G I N E D | S H E | W A S | C A L L E D | O F | M A N Y | P R I M A V E R A | S P R I N G | A N D | W E N T | B Y | T H A T | N A M E | A M O N G | T H E M | +A N D | T H E R E W I T H A L | S U C H | A | B E W I L D E R M E N T | P O S S E S S ' D | M E | T H A T | I | S H U T | M I N E | E Y E S | F O R | P E A C E | A N D | I N | M Y | B R A I N | D I D | C E A S E | O R D E R | O F | T H O U G H T | A N D | E V E R Y | H E A L T H F U L | T H I N G | +T H E N | S A W | I | M A N Y | B R O K E N | H I N T E D | S I G H T S | I N | T H E | U N C E R T A I N | S T A T E | I | S T E P P ' D | I N T O | +T H E | S E C O N D | P A R T | B E G I N S | H E R E | S A Y I N G | B E | N O W | T H E | T H I R D | H E R E | T H E N | W H I L E | I T | W A S | H I S | P L E A S U R E | +T H E S E | W I L D E R I N G | P H A N T A S I E S | T H E N | C A R R I E D | M E | T O | S E E | M Y | L A D Y | D E A D | +T H E | S E C O N D | P A R T | B E G I N S | H E R E | I | W A S | A | T H I N K I N G | T H E | F I R S T | P A R T | D I V I D E S | I N T O | T W O | +W H E R E B Y | O T H E R | L A D I E S | W H O | W E R E | A B O U T | T H E | R O O M | B E C O M I N G | A W A R E | O F | M Y | D I S C O M F O R T | B Y | R E A S O N | O F | T H E | M O A N | T H A T | S H E | M A D E | W H O | I N D E E D | W A S | O F | M Y | V E R Y | N E A R | K I N D R E D | L E D | H E R | A W A Y | F R O M | W H E R E | I | W A S | A N D | T H E N | S E T | T H E M S E L V E S | T O | A W A K E N | M E | T H I N K I N G | T H A T | I | D R E A M E D | A N D | S A Y I N G | S L E E P | N O | L O N G E R | A N D | B E | N O T | D I S Q U I E T E D | +A N D | S O | S T R O N G | W A S | M Y | P H A N T A S Y | T H A T | I | W E P T | A G A I N | I N | V E R Y | T R U T H | A N D | S A I D | W I T H | M Y | T R U E | V O I C E | O | E X C E L L E N T | S O U L | H O W | B L E S S E D | I S | H E | T H A T | N O W | L O O K E T H | U P O N | T H E E | +A N D | I N | H I S | S P E E C H | H E | L A U G H ' D | A N D | L A U G H ' D | A G A I N | T H E N | W H I L E | I T | W A S | H I S | P L E A S U R E | T O | R E M A I N | I | C H A N C E D | T O | L O O K | T H E | W A Y | H E | H A D | D R A W N | N E A R | A N D | S A W | T H E | L A D I E S | J O A N | A N D | B E A T R I C E | A P P R O A C H | M E | T H I S | T H E | O T H E R | F O L L O W I N G | O N E | A N D | A | S E C O N D | M A R V E L | I N S T A N T L Y | +W H E N | B E I N G | A R O U S E D | I | O P E N E D | M I N E | E Y E S | A N D | K N E W | T H A T | I T | H A D | B E E N | A | D E C E P T I O N | +A N D | M Y | H U E | W A S | S U C H | T H A T | T H E Y | L O O K ' D | A T | E A C H | O T H E R | A N D | T H O U G H T | O F | D E A T H | S A Y I N G | U N D E R | T H E I R | B R E A T H | M O S T | T E N D E R L Y | O | L E T | U S | C O M F O R T | H I M | T H E N | U N T O | M E | W H A T | D R E A M | W A S | T H I N E | T H A T | I T | H A T H | S H A K E N | T H E E | S O | M U C H | +A N D | A T | T H E | F I R S T | I T | S E E M E D | T O | M E | T H A T | I | S A W | C E R T A I N | F A C E S | O F | W O M E N | W I T H | T H E I R | H A I R | L O O S E N E D | W H I C H | C A L L E D | O U T | T O | M E | T H O U | S H A L T | S U R E L Y | D I E | A F T E R | T H E | W H I C H | O T H E R | T E R R I B L E | A N D | U N K N O W N | A P P E A R A N C E S | S A I D | U N T O | M E | T H O U | A R T | D E A D | +T H I S | H A S | I N D U C E D | S O M E | E D I T O R S | O F | T H E | V I T A | N U O V A | T O | E X P L A I N | T H E | T I T L E | A S | M E A N I N G | E A R L Y | L I F E | +T H R O U G H O U T | T H E | V I T A | N U O V A | T H E R E | I S | A | S T R A I N | L I K E | T H E | F I R S T | F A L L I N G | M U R M U R | W H I C H | R E A C H E S | T H E | E A R | I N | S O M E | R E M O T E | M E A D O W | A N D | P R E P A R E S | U S | T O | L O O K | U P O N | T H E | S E A | +O N | J A N U A R Y | T W E N T Y | F I F T H | H E | W R O T E | M A N Y | A N D | M A N Y | T H A N K S | F O R | A | M O S T | E S S E N T I A L | S E R V I C E | M O S T | T H O R O U G H L Y | P E R F O R M E D | +T H I S | B O O K | I N | I T S | O R I G I N A L | F O R M | W A S | R E C E I V E D | W I T H | F A V O U R | A N D | S E T T L E D | T H E | C L A I M | O F | R O S S E T T I | T O | R A N K | A S | A | P O E T I C | T R A N S L A T O R | O R | I N D E E D | A S | A | P O E T | I N | H I S | O W N | R I G H T | +P O E T R Y | N O T | B E I N G | A N | E X A C T | S C I E N C E | L I T E R A L I T Y | O F | R E N D E R I N G | I S | A L T O G E T H E R | S E C O N D A R Y | T O | T H I S | C H I E F | L A W | +T H E | O N L Y | T R U E | M O T I V E | F O R | P U T T I N G | P O E T R Y | I N T O | A | F R E S H | L A N G U A G E | M U S T | B E | T O | E N D O W | A | F R E S H | N A T I O N | A S | F A R | A S | P O S S I B L E | W I T H | O N E | M O R E | P O S S E S S I O N | O F | B E A U T Y | +I T | I S | T H E R E F O R E | A N D | O N | A L L | A C C O U N T S | U N N E C E S S A R Y | T O | S A Y | M U C H | M O R E | O F | T H E | W O R K | H E R E | T H A N | I T | S A Y S | F O R | I T S E L F | +H E | T R A N S L A T E D | A T | A N | E A R L Y | A G E | C H I E F L Y | B E T W E E N | E I G H T E E N | F O R T Y | F I V E | A N D | E I G H T E E N | F O R T Y | N I N E | A | G R E A T | N U M B E R | O F | P O E M S | B Y | T H E | I T A L I A N S | C O N T E M P O R A R Y | W I T H | D A N T E | O R | P R E C E D I N G | H I M | A N D | A M O N G | O T H E R | T H I N G S | H E | M A D E | A | V E R S I O N | O F | T H E | W H O L E | V I T A | N U O V A | P R O S E | A N D | V E R S E | +M Y | N O T E S | W H I C H | Y O U | H A V E | T A K E N | T H E | T R O U B L E | O F | R E V I S I N G | A R E | O F | C O U R S E | Q U I T E | P A L T R Y | A N D | U S E L E S S | +A N D | I F | Y O U | H A V E | T I M E | I T | W O U L D | B E | A | G R E A T | S E R V I C E | T O | T R A N S L A T E | T H E | A N A L Y S E S | O F | T H E | P O E M S | W H I C H | I | O M I T T E D | +T H E | L I F E | B L O O D | O F | R H Y T H M I C A L | T R A N S L A T I O N | I S | T H I S | C O M M A N D M E N T | T H A T | A | G O O D | P O E M | S H A L L | N O T | B E | T U R N E D | I N T O | A | B A D | O N E | +O F T E N | W O U L D | H E | A V A I L | H I M S E L F | O F | A N Y | S P E C I A L | G R A C E | O F | H I S | O W N | I D I O M | A N D | E P O C H | I F | O N L Y | H I S | W I L L | B E L O N G E D | T O | H I M | O F T E N | W O U L D | S O M E | C A D E N C E | S E R V E | H I M | B U T | F O R | H I S | A U T H O R ' S | S T R U C T U R E | S O M E | S T R U C T U R E | B U T | F O R | H I S | A U T H O R ' S | C A D E N C E | O F T E N | T H E | B E A U T I F U L | T U R N | O F | A | S T A N Z A | M U S T | B E | W E A K E N E D | T O | A D O P T | S O M E | R H Y M E | W H I C H | W I L L | T A L L Y | A N D | H E | S E E S | T H E | P O E T | R E V E L L I N G | I N | A B U N D A N C E | O F | L A N G U A G E | W H E R E | H I M S E L F | I S | S C A N T I L Y | S U P P L I E D | +A | W O R D | S H O U L D | B E | S A I D | H E R E | O F | T H E | T I T L E | O F | D A N T E ' S | A U T O B I O G R A P H Y | +W H A T E V E R | H E R | S W E E T | E Y E S | A R E | T U R N E D | U P O N | S P I R I T S | O F | L O V E | D O | I S S U E | T H E N C E | I N | F L A M E | W H I C H | T H R O U G H | T H E I R | E Y E S | W H O | T H E N | M A Y | L O O K | O N | T H E M | P I E R C E | T O | T H E | H E A R T ' S | D E E P | C H A M B E R | E V E R Y | O N E | +S O | T O | T H E | R O A D | T H O U | S H A L T | B E | R E C O N C I L E D | A N D | F I N D | T H E | L A D Y | A N D | W I T H | T H E | L A D Y | L O V E | +T H E | F I R S T | P A R T | I S | D I V I D E D | I N T O | F O U R | +A N D | N O W | T H A T | I T | H A T H | P L E A S E D | H E R | T O | D E N Y | M E | T H I S | L O V E | M Y | M A S T E R | O F | H I S | G R E A T | G O O D N E S S | H A T H | P L A C E D | A L L | M Y | B E A T I T U D E | T H E R E | W H E R E | M Y | H O P E | W I L L | N O T | F A I L | M E | +I N | T H E | F O U R T H | R E P E A T I N G | T O | W H O M | I | P U R P O S E | S P E A K I N G | I | T E L L | T H E | R E A S O N | W H Y | I | S P E A K | T O | T H E M | +T H I S | S E C O N D | P A R T | I S | D I V I D E D | I N T O | T W O | F O R | I N | T H E | O N E | I | S P E A K | O F | T H E | E Y E S | W H I C H | A R E | T H E | B E G I N N I N G | O F | L O V E | I N | T H E | S E C O N D | I | S P E A K | O F | T H E | M O U T H | W H I C H | I S | T H E | E N D | O F | L O V E | +A N D | I | D E C L A R E | T H A T | W H E N | I | S P E A K | T H E R E O F | L O V E | S H E D S | S U C H | P E R F E C T | S W E E T N E S S | O V E R | M E | T H A T | I F | M Y | C O U R A G E | F A I L E D | N O T | C E R T A I N L Y | T O | H I M | M Y | L I S T E N E R S | M U S T | B E | A L L | R E S I G N ' D | +T O | H E R | I | W E N D | A L O N G | I N | W H O S E | M U C H | S T R E N G T H | M Y | W E A K N E S S | I S | M A D E | S T R O N G | +I N | T H E | S E C O N D | I | T E L L | W H A T | I S | U N D E R S T O O D | O F | H E R | O N | E A R T H | H E R E | M Y | L A D Y | I S | D E S I R E D | +T H E R E A F T E R | T H I S | S O N N E T | B R E D | I N | M E | D E S I R E | T O | W R I T E | D O W N | I N | V E R S E | F O U R | O T H E R | T H I N G S | T O U C H I N G | M Y | C O N D I T I O N | T H E | W H I C H | T H I N G S | I T | S E E M E D | T O | M E | T H A T | I | H A D | N O T | Y E T | M A D E | M A N I F E S T | +T H E | S E C O N D | B E G I N S | H E R E | A N | A N G E L | T H E | T H I R D | H E R E | D E A R | S O N G | I | K N O W | +B U T | W H E N | I | S T I L L | S P A K E | N O T | O N E | O F | T H E M | W H O | B E F O R E | H A D | B E E N | T A L K I N G | W I T H | A N O T H E R | A D D R E S S E D | M E | B Y | M Y | N A M E | S A Y I N G | T O | W H A T | E N D | L O V E S T | T H O U | T H I S | L A D Y | S E E I N G | T H A T | T H O U | C A N S T | N O T | S U P P O R T | H E R | P R E S E N C E | +T H E N | T H O S E | L A D I E S | B E G A N | T O | T A L K | C L O S E L Y | T O G E T H E R | A N D | A S | I | H A V E | S E E N | S N O W | F A L L | A M O N G | T H E | R A I N | S O | W A S | T H E I R | T A L K | M I N G L E D | W I T H | S I G H S | +W H I C H | T H I N G | B E I N G | T H U S | T H E R E | C A M E | A | D A Y | W H E N | C E R T A I N | L A D I E S | T O | W H O M | I T | W A S | W E L L | K N O W N | T H E Y | H A V I N G | B E E N | W I T H | M E | A T | D I V E R S | T I M E S | I N | M Y | T R O U B L E | W E R E | M E T | T O G E T H E R | F O R | T H E | P L E A S U R E | O F | G E N T L E | C O M P A N Y | +I N | T H E | T H I R D | I | S A Y | W H A T | I T | I S | I | P U R P O S E | T O | S P E A K | S O | A S | N O T | T O | B E | I M P E D E D | B Y | F A I N T H E A R T E D N E S S | +T H I S | S E C O N D | P A R T | I S | D I V I D E D | I N T O | T W O | F O R | I N | T H E | F I R S T | I | S P E A K | O F | H E R | A S | R E G A R D S | T H E | N O B L E N E S S | O F | H E R | S O U L | R E L A T I N G | S O M E | O F | H E R | V I R T U E S | P R O C E E D I N G | F R O M | H E R | S O U L | I N | T H E | S E C O N D | I | S P E A K | O F | H E R | A S | R E G A R D S | T H E | N O B L E N E S S | O F | H E R | B O D Y | N A R R A T I N G | S O M E | O F | H E R | B E A U T I E S | H E R E | L O V E | S A I T H | C O N C E R N I N G | H E R | +T H E | P E O P L E | I S | A | B E A S T | O F | M U D D Y | B R A I N | T H A T | K N O W S | N O T | I T S | O W N | F O R C E | A N D | T H E R E F O R E | S T A N D S | L O A D E D | W I T H | W O O D | A N D | S T O N E | T H E | P O W E R L E S S | H A N D S | O F | A | M E R E | C H I L D | G U I D E | I T | W I T H | B I T | A N D | R E I N | O N E | K I C K | W O U L D | B E | E N O U G H | T O | B R E A K | T H E | C H A I N | B U T | T H E | B E A S T | F E A R S | A N D | W H A T | T H E | C H I L D | D E M A N D S | I T | D O E S | N O R | I T S | O W N | T E R R O R | U N D E R S T A N D S | C O N F U S E D | A N D | S T U P E F I E D | B Y | B U G B E A R S | V A I N | +M O S T | W O N D E R F U L | +D U E | T O | T H E E | T H E I R | P R A I S E | O F | M A I D E N | P U R E | O F | T E E M I N G | M O T H E R H O O D | +I N | F L E S H | W A S | R A I M E N T E D | H O W | H E | W A S | K I L L E D | A N D | B U R I E D | F R O M | T H E | D E A D | H O W | H E | A R O S E | T O | L I F E | W I T H | V I C T O R Y | A N D | R E I G N E D | I N | H E A V E N | H O W | A L L | O F | U S | S H A L L | B E | G L O R I O U S | L I K E | H I M | W H O S E | H E A R T S | T O | H I S | A R E | W E D | H O W | T H E Y | W H O | D I E | F O R | L O V E | O F | R E A S O N | G I V E | H Y P O C R I T E S | T Y R A N T S | S O P H I S T S | A L L | W H O | S E L L | T H E I R | N E I G H B O U R S | I L L | F O R | H O L I N E S S | T O | H E L L | H O W | T H E | D E A D | S A I N T | C O N D E M N S | T H E | B A D | W H O | L I V E | H O W | A L L | H E | D O E S | B E C O M E S | A | L A W | F O R | M E N | H O W | H E | A T | L A S T | T O | J U D G E | S H A L L | C O M E | A G A I N | +Q U I N C I | I M P A R A | A | S T U P I R T I | +H E A V E N | H E L P | T H A T | B O D Y | W H I C H | A | L I T T L E | M I N D | H O U S E D | I N | A | H E A D | L A C K I N G | E A R S | T O N G U E | A N D | E Y E S | A N D | S E N S E L E S S | B U T | F O R | S M E L L | C A N | T Y R A N N I S E | +W E L L | T O O | I F | H E | L I K E | L O V E | W O U L D | F I L C H | O U R | H O A R D | W I T H | P L E A S U R E | T O | O U R S E L V E S | S L U I C I N G | O U R | V E I N | A N D | V I G O U R | T O | P E R P E T U A T E | T H E | S T R A I N | O F | L I F E | B Y | S P I L T H | O F | L I F E | W I T H I N | U S | S T O R E D | +H E | L I V E S | T H Y | L O S S | H E | D I E S | F R O M | E V E R Y | L I M B | M A N G L E D | B Y | T H E E | L I G H T N I N G S | O F | G O D H E A D | S H I N E | F R O M | W H I C H | T H Y | D A R K N E S S | H A T H | N O T | W H E R E | T O | H I D E | +T H O U | L I K E | A R C T U R U S | S T E A D F A S T | I N | T H E | S K I E S | W I T H | T A R D Y | S E N S E | G U I D E S T | T H Y | K I N G D O M | F A I R | B E A R I N G | A L O N E | T H E | L O A D | O F | L I B E R T Y | +T H A T | P E N A N C E | H A T H | N O | B L A M E | W H I C H | M A G D A L E N | F O U N D | S W E E T | P U R G I N G | O U R | S H A M E | S E L F | P U N I S H M E N T | I S | V I R T U E | A L L | M E N | K N O W | +I L | P O P O L O | E | U N A | B E S T I A | +O R G A N | O F | R U T | N O T | R E A S O N | I S | T H E | L O R D | W H O | F R O M | T H E | B O D Y | P O L I T I C | D O T H | D R A I N | L U S T | F O R | H I M S E L F | I N S T E A D | O F | T O I L | A N D | P A I N | L E A V I N G | U S | L E A N | A S | C R I C K E T S | O N | D R Y | S W A R D | +M O N E Y | I S | F A L S E | A N D | L I G H T | U N L E S S | I T | B E | B O U G H T | B Y | A | M A N ' S | O W N | W O R T H Y | Q U A L I T I E S | A N D | B L O O D | I S | S U C H | T H A T | I T S | C O R R U P T | D I S E A S E | A N D | I G N O R A N T | P R E T E N C E | A R E | F O U L | T O | S E E | +T H I S | W O R L D ' S | T H I C K | V A P O U R S | W H E L M | Y O U R | E Y E S | U N W O R T H Y | O F | T H A T | G L O R I O U S | S H O W | B L I N D | T O | H I S | S P L E N D O U R | B E N T | U P O N | H I S | S H A M E | +A R E | Y O U | R E A L L Y | G O I N G | T O | T H R O W | M E | O V E R | F O R | A | T H I N G | L I K E | T H I S | +I T | W A S | B I T T E R L Y | C O L D | B U T | T H E | E M B A N K M E N T | W A S | M O R E | R O M A N T I C | T H A N | A | R A I L W A Y | C A R R I A G E | +H E | H A D | B E E N | L A T E | H E | H A D | O F F E R E D | N O | E X C U S E | N O | E X P L A N A T I O N | +S H E | W O U L D | H A V E | S H A R E D | H I S | S O R R O W | A N D | S H O W N | H E R S E L F | H A L F | W I F E | H A L F | A N G E L | F R O M | H E A V E N | I N | T H I S | D A R K | H O U R | +H E R | H A N D S | S H O U L D | H A V E | B E E N | F U L L | O F | B L U E B E L L S | A N D | S H E | S H O U L D | H A V E | H E L D | T H E M | U P | T O | H I S | F A C E | I N | M A I D E N L Y | D E F E N C E | A S | H E | S P R A N G | F O R W A R D | T O | T A K E | H E R | I N | H I S | A R M S | +A N D | Y E S T E R D A Y | I | H A D | A | L E T T E R | F R O M | H E R | A N D | S H E | S E E M S | T O | E X P E C T | T O | T H I N K | A N D | I | T H O U G H T | I | O U G H T | T O | T E L L | Y O U | D A R L I N G | +C O U L D N ' T | H E L P | I T | T H E N | H O W | C A N | I | E V E R | T R U S T | Y O U | +H E | C H E C K E D | T H E | S I L L Y | I M P U L S E | +I | D I D N ' T | T H I N K | A | D E C E N T | M A N | C O U L D | D O | S U C H | T H I N G S | S H E | W A S | P U L L I N G | O N | H E R | G L O V E S | G O | H O M E | A N D | G L O A T | O V E R | I T | A L L | +A N D | C U R I O U S L Y | E N O U G H | S H E | W A S | H A R D L Y | C U R I O U S | A T | A L L | A B O U T | W H A T | H E | M I G H T | H A V E | T O | S A Y | +A N D | H E | S T R O D E | D O W N | B E T W E E N | T H E | M A R B L E | T A B L E S | A N D | O U T | B Y | T H E | S W I N G | D O O R | I T | W A S | A | V E R Y | G O O D | E X I T | +Y O U | S E E | T H A T | S H E | K N E W | E X A C T L Y | H O W | A | T R Y S T | I S | C O N D U C T E D | I N | T H E | P A G E S | O F | T H E | S T A N D A R D | P O E T S | A N D | O F | T H E | C H E A P E R | W E E K L Y | J O U R N A L S | +T H E | K E E N | W I N D | T H R U S T | I T S E L F | E V E N | I N S I D E | T H E | H I G H | C O L L A R | O F | H E R | J A C K E T | +W H A T | O P I N I O N | W O U L D | H E | F O R M | O F | T H E | P U R I T Y | O F | H E R | M I N D | T H E | I N N O C E N C E | O F | H E R | S O U L | I F | A N | I N C I D E N T | L I K E | T H I S | F A I L E D | T O | S H O C K | H E R | D E E P L Y | +T H E | S E T T I N G | O F | T H E | S C E N E | S E E M E D | T O | H E R | A L L | I M P O R T A N T | +H E | S T O O D | U P | S U D D E N L Y | D O | Y O U | M E A N | I T | +S H E | O N L Y | W I S H E D | F O R | M A Y | A N D | T H E | O R C H A R D | I N S T E A D | O F | J A N U A R Y | A N D | T H E | D I N G Y | D U S T Y | W A I T I N G | R O O M | T H E | P L A I N | F A C E D | P R E O C C U P I E D | T R A V E L L E R S | T H E | D I M | D E S O L A T E | W E A T H E R | +D O | Y O U | T H I N K | I ' M | N O T | S O R R Y | N O W | +S H E | H A D | T O | T H E | F U L L | L I M I T | A L L O W E D | O F | H E R | R E A D I N G | A N D | H E R | E N V I R O N M E N T | T H E | L I T E R A R Y | S E N S E | +N O | I T ' S | O N L Y | P A I N F U L | F O R | B O T H | O F | U S | +S O | H E | E N L I S T E D | A N D | W E N T | T O | S O U T H | A F R I C A | A N D | H E | N E V E R | C A M E | H O M E | C O V E R E D | W I T H | M E D A L S | A N D | G L O R Y | W H I C H | W A S | R A T H E R | H I S | I D E A | T O | T H E | F E W | S I M P L E | W O R D S | O F | E X P L A N A T I O N | T H A T | W O U L D | H A V E | M A D E | A L L | S T R A I G H T | A N D | R E P A I D | H E R | A N D | H I M | F O R | A L L | T H E | P A S T | +S H E | H E R S E L F | S H O U L D | H A V E | B E E N | A | P O E M | A | L Y R I C | I N | A | W H I T E | G O W N | A N D | G R E E N | S C A R F | C O M I N G | T O | H I M | T H R O U G H | T H E | L O N G | G R A S S | U N D E R | T H E | B L O S S O M E D | B O U G H S | +A | S H O C K | O F | U N B E L I E V A B L E | R E L I E F | T I N G L E D | T H R O U G H | H E R | S O | T H A T | W A S | A L L | W H A T | W A S | I T | C O M P A R E D | W I T H | H E R | F E A R S | +S H E | S A I D | H O W | F R I G H T F U L L Y | C O L D | I T | I S | +B U T | H E R E | T H E | O N L Y | T H I N G | T H A T | O C C U R R E D | T O | H E R | W A S | T O | S T O P | A N D | L O O K | I N | O N E | O F | T H E | S H O P S | T I L L | H E | S H O U L D | A S K | H E R | W H A T | S H E | W A S | L O O K I N G | A T | +H E R | H A N D S | A N D | F E E T | W E R E | A C H I N G | W I T H | C O L D | +A T | T H E | C O R N E R | H E | R E M E M B E R E D | T H A T | H E | H A D | G O N E | A W A Y | W I T H O U T | P A Y I N G | F O R | T H E | T E A | A N D | H I S | N A T U R A L | I M P U L S E | W A S | T O | G O | B A C K | A N D | R E M E D Y | T H A T | E R R O R | +T H O S E | F O U R | T R U E | W O R D S | W O U N D E D | H E R | M O R E | T H A N | A L L | T H E | R E S T | +F O L L O W I N G | T H E | T I N G L E | O F | R E L I E F | C A M E | A | S H A R P | S I C K E N I N G | P I N C H | O F | J E A L O U S Y | A N D | M O R T I F I C A T I O N | T H E S E | I N S P I R E D | H E R | +S H A L L | I | P O U R | O U T | M Y | S O U L | I N T O | T H E | E A R | O F | A | M I S T | A | F U M E | F R O M | M Y | O W N | B R A I N | +W I T H | T H A T | C A M E | A | P A N G | O F | I N T E N S E | P A I N | +B U T | L I V I N G | S O U L | T H E R E | C O U L D | B E | N O N E | T O | M E E T | +B U T | S H E | K N E W | N O B O D Y | A N D | W A N D E R E D | A L O N E | I N | T H E | G A R D E N | O P P R E S S E D | W I T H | S O M E T H I N G | S H E | D I D | N O T | U N D E R S T A N D | +T H E | O L D | T I M E | W A S | B U T | A | T H I C K E R | D R E A M | A N D | T H I S | I S | T R U E R | B E C A U S E | M O R E | S H A D O W Y | +S H E | H A D | L O S T | H I M | Y E A R S | A N D | Y E A R S | B E F O R E | A N D | N O W | S H E | S A W | H I M | H E | W A S | T H E R E | A N D | S H E | K N E W | H I M | +H E | C A M E | T O | H E R | S I D E | A N D | S H E | G A V E | H I M | N O | G R E E T I N G | +A T | T H E | E N D | O F | I T | S H E | W A S | I N | A | P L A C E | O F | T O M B S | +T H U S | W A S | S H E | B O R N E | A W A Y | C A P T I V E | O F | H E R | D E A D | N E I T H E R | W I L L I N G | N O R | U N W I L L I N G | O F | L I F E | A N D | D E A T H | E Q U A L L Y | C A R E L E S S | +T H I S | W A S | H E R | D R E A M | A S | N E A R L Y | A S | S H E | C O U L D | R E C A L L | I T | W H E N | S H E | C A M E | T O | H E R S E L F | A F T E R | W A K I N G | F R O M | I T | W I T H | A | C R Y | +S H E | W A S | L O S T | L O S T | U T T E R L Y | W I T H | A N | E T E R N A L | L O S S | +W H E N | S H E | O P E N E D | T H E | D O O R | O F | I T | T H E | B R I G H T | F I R E | W H I C H | B E E N I E | U N D E S I R E D | H A D | K I N D L E D | T H E R E | S T A R T L E D | H E R | T H E | R O O M | L O O K E D | U N N A T U R A L | U N C A N N Y | B E C A U S E | I T | W A S | C H E E R F U L | +A T | T H E | T I M E | M A R Y | H A D | N O T E D | N O T H I N G | O F | T H E S E | T H I N G S | N O W | S H E | S A W | T H E M | A L L | A S | F O R | T H E | F I R S T | T I M E | I N | M I N U T E | D E T A I L | W H I L E | S L O W L Y | S H E | W E N T | U P | T H E | S T A I R | A N D | T H R O U G H | T H E | N A R R O W E D | W A Y S | A N D | H E A R D | T H E | S A M E | W I N D | T H A T | R A V E D | A L I K E | A B O U T | T H E | N E W | G R A V E | A N D | T H E | O L D | H O U S E | I N T O | W H I C H | L A T T E R | F O R | A L L | T H E | B A L E S | B A N K E D | A G A I N S T | T H E | W A L L S | I T | F O U N D | M A N Y | A | C H I N K | O F | E N T R A N C E | +S H E | W A S | O N E | O F | A | L A R G E | C O M P A N Y | A T | A | H O U S E | W H E R E | S H E | H A D | N E V E R | B E E N | B E F O R E | A | B E A U T I F U L | H O U S E | W I T H | A | L A R G E | G A R D E N | B E H I N D | +S H E | S T O O D | F O R | A | M O M E N T | O N | T H E | H E A R T H | A N D | I N | S A D | D R E A M Y | M O O D | L I S T E N E D | T O | T H E | H O W L I N G | S W O O P S | O F | T H E | W I N D | M A K I N G | T H E | H O U S E | Q U I V E R | A N D | S H A K E | +S H E | K N E W | N O T H I N G | O F | T H E | P L A C E | H A D | N O W H E R E | T O | G O | N O W H E R E | S H E | W A N T E D | T O | G O | H A D | N O T | A | T H O U G H T | T O | T E L L | H E R | W H A T | Q U E S T I O N | T O | A S K | I F | S H E | M E T | A | L I V I N G | S O U L | +S H E | E N T E R E D | A N D | T H E | S E R V A N T S | S O F T | F O O T E D | A N D | S I L E N T | W E R E | B U S Y | C A R R Y I N G | A W A Y | T H E | V E S S E L S | O F | H O S P I T A L I T Y | A N D | R E S T O R I N G | O R D E R | A S | I F | A L R E A D Y | T H E Y | P R E P A R E D | F O R | A N O T H E R | C O M P A N Y | O N | T H E | M O R R O W | N O | O N E | H E E D E D | H E R | +W H E N | S H E | S A I D | G O O D | N I G H T | T O | B E E N I E | A N D | W E N T | T O | H E R | C H A M B E R | O V E R | T H A T | W H E R E | T H E | L O V E D | P A R E N T | A N D | F R I E N D | W O U L D | F A L L | A S L E E P | N O | M O R E | S H E | F E L T | A S | I F | S H E | W E N T | W A L K I N G | A L O N G | T O | H E R | T O M B | +I T | W A S | A | S U M M E R | N I G H T | A N D | T H E | G U E S T S | W E R E | W A N D E R I N G | I N | A N D | O U T | A T | W I L L | A N D | T H R O U G H | H O U S E | A N D | G A R D E N | A M I D | L O V E L Y | T H I N G S | O F | A L L | C O L O R S | A N D | O D O R S | +H E R | O N L Y | L I F E | W A S | T H A T | S H E | W A S | L O S T | +I | K N O W | I T | A N D | T H E R E | I S | N O | W A K I N G | +I T | W A S N ' T | I | W H O | S A I D | T H A T | S A I D | T H E | G I R L | S M I L I N G | B U T | T H A T ' S | S O | A N Y H O W | A N D | T H E N | S H E | S I G H E D | +I | S H A L L | L O C K | U P | A L L | T H E | D O O R S | A N D | W I N D O W S | I N | T H E | H O U S E | A N D | T H E N | I | S H A L L | G I V E | Y O U | M Y | L A T C H | K E Y | A N D | Y O U | C A N | L E T | Y O U R S E L F | I N | A N D | S T A Y | T H E | N I G H T | H E R E | T H E R E | I S | N O | O N E | I N | T H E | H O U S E | +T H E R E | I S | A | S E A T | I N | T H E | G A R D E N | A T | T H E | S I D E | O F | T H E | H O U S E | A G A I N | S H E | H E S I T A T E D | +I S | I T | O N L Y | T H A T | Y O U ' R E | P O O R | W H Y | T H A T ' S | N O T H I N G | I ' M | P O O R | T O O | S H E | L A U G H E D | +L E T | M E | T H I N K | H E | S A I D | O H | H O W | G L A D | I | A M | T H A T | Y O U | H A P P E N E D | T O | C O M E | T H I S | W A Y | +H E | H U R R I E D L Y | C U T | C A K E | A N D | P R E S S E D | I T | U P O N | H E R | +D O | D R I N K | T H I S | A N D | T H E N | T E L L | M E | P E R H A P S | I | C A N | H E L P | Y O U | +H E | T O L D | M E | T O | S T A Y | O N | A T | T H E | H O T E L | A N D | I | D I D | A N D | T H E N | O N E | N I G H T | W H E N | I | W A S | A T | T H E | T H E A T R E | M Y | M A I D | A | H O R R I D | F R E N C H | T H I N G | W E | G O T | I N | P A R I S | P A C K E D | U P | A L L | M Y | T R U N K S | A N D | T O O K | A L L | M Y | M O N E Y | A N D | P A I D | T H E | B I L L | A N D | W E N T | +A L L | T H E | S A M E | H E | A D D E D | I R R E L E V A N T L Y | Y O U | S H A L L | H A V E | T H E | L A T C H | K E Y | +I | W I L L | C A T C H | T H E | N I G H T | T R A I N | A N D | B R I N G | M Y | M O T H E R | U P | T O | M O R R O W | T H E N | W E | W I L L | S E E | W H A T | C A N | B E | D O N E | +T H E | L A D Y | A N D | T H E | G U I T A R | C E R T A I N L Y | P A S S E D | T H E | N I G H T | A T | H I L L | V I E W | V I L L A | B U T | W H E N | H I S | M O T H E R | V E R Y | A N G R Y | A N D | V E R Y | F R I G H T E N E D | C A M E | U P | W I T H | H I M | A T | A B O U T | N O O N | T H E | H O U S E | L O O K E D | J U S T | A S | U S U A L | A N D | N O | O N E | W A S | T H E R E | B U T | T H E | C H A R W O M A N | +T H E | Y O U N G | M A N | D R E W | A | D E E P | B R E A T H | O F | R E L I E F | A N D | L I G H T E D | T H E | W A X | C A N D L E S | I N | T H E | S O L I D | S I L V E R | C A N D L E S T I C K S | O N | H I S | W R I T I N G | T A B L E | F O R | N O W | T H E | L A T E | S U M M E R | D U S K | W A S | F A L L I N G | A N D | T H A T | O R G A N | P L E A S E | H E A V E N | M A D E | F U L L | T H E | M E A S U R E | O F | T H E | D A Y ' S | A P P O I N T E D | T O R T U R E | +I T | W A S | P L A I N | T H A T | H I S | C A S T A N E T | G I R L | H I S | M O T H E R | A N D | S I S T E R | T O O K | A | P L E A S U R E | I N | C R E D I T I N G | H E R | D A I L Y | W I T H | S O M E | F R E S H | A N D | U N P L E A S I N G | I N S T R U M E N T | C O U L D | H A V E | H A D | N E I T H E R | T A S T E | M O N E Y | N O R | H O N E S T Y | T O | S U C H | A | P O I N T | A S | T H I S | +T H E | L A S T | S T R A I N S | O F | T H E | I L L | T R E A T E D | I L L | F A T E D | I N T E R M E Z Z O | H A D | D I E D | A W A Y | A N D | A F T E R | T H E M | H A D | D I E D | A W A Y | A L S O | T H E | R U M B L I N G | O F | T H E | W H E E L S | O F | T H E | M U R D E R O U S | B A R R E L | O R G A N | T H A T | H A D | S O | G A I L Y | E X E C U T E D | T H A T | A L O N G | W I T H | T H E | N I N E | O T H E R | T U N E S | O F | I T S | R E P E R T O R Y | T O | T H E | A D M I R A T I O N | O F | T H E | H O U S E M A I D | A T | T H E | W I N D O W | O F | T H E | H O U S E | O P P O S I T E | A N D | T H E | C R O W I N G | D E L I G H T | O F | T H E | T W O | B A B I E S | N E X T | D O O R | +S H E | S A I D | A G A I N | Y O U | A R E | K I N D | +N E V E R | H A D | A N Y | A C T | S E E M E D | S O | I M P O S S I B L E | +L O O K | H E R E | H E | S A I D | T H I S | I S | A L L | N O N S E N S E | Y O U | K N O W | Y O U | A R E | T I R E D | O U T | A N D | T H E R E ' S | S O M E T H I N G | W R O N G | W H A T | I S | I T | +T H E | S I L V E R | I S | A L L | R I G H T | T H A N K | G O O D N E S S | S H E | S A I D | B U T | Y O U R | B A N J O | G I R L | H A S | T A K E N | A | P A I R | O F | Y O U R | S I S T E R ' S | S I L K | S T O C K I N G S | A N D | T H O S E | N E W | S H O E S | O F | H E R S | W I T H | T H E | S I L V E R | B U C K L E S | A N D | S H E ' S | L E F T | T H E S E | +W E L L | T H E N | I | W E N T | I N T O | L O D G I N G S | T H A T | W I C K E D | W O M A N | H A D | L E F T | M E | O N E | S T R E E T | S U I T | A N D | T O | D A Y | T H E Y | T U R N E D | M E | O U T | B E C A U S E | M Y | M O N E Y | W A S | A L L | G O N E | +Y O U | S E E | P A P A ' S | S O | V E R Y | R I C H | A N D | A T | H O M E | T H E Y | E X P E C T | M E | T O | T O | G E T | A C Q U A I N T E D | W I T H | D U K E S | A N D | T H I N G S | A N D | S H E | S T O P P E D | +H E | H A D | N O | T I M E | T O | T H I N K | B U T | H E | W A S | A W A R E | T H A T | T H I S | W A S | T H E | M O S T | E X C I T I N G | A D V E N T U R E | T H A T | H A D | E V E R | H A P P E N E D | T O | H I M | +T H E N | S H E | T U R N E D | T O W A R D S | T H E | Q U A R T E R | I N D I C A T E D | A N D | D I S A P P E A R E D | R O U N D | T H E | L A U R E L | B U S H E S | +T H E N | T H E R E | W A S | S I L E N C E | T H E N | A | S I G H | A N D | T H E | S O U N D | O F | L I G H T | M O V I N G | F E E T | O N | T H E | G R A V E L | +A N D | A G A I N | H E | L I S T E N E D | W I T H | A | Q U I E T | P L E A S U R E | +Y O U | A R E | K I N D | S H E | S A I D | F O R | T H E | T H I R D | T I M E | A N D | R E A C H E D | H E R | H A N D | O U T | T O | H I M | H E | D I D | N O T | K I S S | I T | T H E N | O N L Y | T O O K | I T | I N | H I S | A N D | F E L T | H O W | S M A L L | A N D | C O L D | I T | W A S | T H E N | I T | W A S | T A K E N | A W A Y | +H E R | L I T T L E | F O O T | T A P P E D | T H E | G R A V E L | I M P A T I E N T L Y | +M I C H A E L I S | T H E | T I C K E T | O F | L E A V E | A P O S T L E | W A S | S P E A K I N G | I N | A N | E V E N | V O I C E | A | V O I C E | T H A T | W H E E Z E D | A S | I F | D E A D E N E D | A N D | O P P R E S S E D | B Y | T H E | L A Y E R | O F | F A T | O N | H I S | C H E S T | +H I S | V I S I O N | O F | T R U T H | H A D | G R O W N | S O | I N T E N S E | T H A T | T H E | S O U N D | O F | A | S T R A N G E | V O I C E | F A I L E D | T O | R O U T | I T | T H I S | T I M E | +H E | S T O O D | S T I L L | I N | T H E | M I D D L E | O F | T H E | P A R L O U R | A N D | L O O K E D | I N T O | T H E | K I T C H E N | I N | S I L E N C E | +T H E | O T H E R | D A Y | S T E V I E | G O T | H O L D | O F | O N E | A N D | T H E R E | W A S | A | S T O R Y | I N | I T | O F | A | G E R M A N | S O L D I E R | O F F I C E R | T E A R I N G | H A L F | O F F | T H E | E A R | O F | A | R E C R U I T | A N D | N O T H I N G | W A S | D O N E | T O | H I M | F O R | I T | T H E | B R U T E | +M I S T E R | V E R L O C ' S | A N X I E T I E S | H A D | P R E V E N T E D | H I M | F R O M | A T T A C H I N G | A N Y | S E N S E | T O | W H A T | H I S | W I F E | W A S | S A Y I N G | +I | W I S H | H E | H A D | N E V E R | B E E N | T O | S C H O O L | M I S S U S | V E R L O C | B E G A N | A G A I N | B R U S Q U E L Y | +A | H A R S H | L A U G H | F R O M | C O M R A D E | O S S I P O N | C U T | T H E | T I R A D E | D E A D | S H O R T | I N | A | S U D D E N | F A L T E R I N G | O F | T H E | T O N G U E | A N D | A | B E W I L D E R E D | U N S T E A D I N E S S | O F | T H E | A P O S T L E ' S | M I L D L Y | E X A L T E D | E Y E S | +I | W O U L D N ' T | G I V E | A | H A L F P E N N Y | F O R | T H E | W H O L E | L O T | +V E R Y | C H A R A C T E R I S T I C | P E R F E C T L Y | T Y P I C A L | +H E | C L O S E D | T H E | D O O R | B E H I N D | T H E I R | B A C K S | W I T H | R E S T R A I N E D | V I O L E N C E | T U R N E D | T H E | K E Y | S H O T | T H E | B O L T | +A H | H E | D I D | N O T | D E P E N D | U P O N | E M O T I O N A L | E X C I T E M E N T | T O | K E E P | U P | H I S | B E L I E F | N O | D E C L A M A T I O N S | N O | A N G E R | N O | V I S I O N S | O F | B L O O D | R E D | F L A G S | W A V I N G | O R | M E T A P H O R I C A L | L U R I D | S U N S | O F | V E N G E A N C E | R I S I N G | A B O V E | T H E | H O R I Z O N | O F | A | D O O M E D | S O C I E T Y | N O T | H E | +A L L | I D E A L I S A T I O N | M A K E S | L I F E | P O O R E R | +S T E V I E | S W A L L O W E D | T H E | T E R R I F Y I N G | S T A T E M E N T | W I T H | A N | A U D I B L E | G U L P | A N D | A T | O N C E | A S | T H O U G H | I T | H A D | B E E N | S W I F T | P O I S O N | S A N K | L I M P L Y | I N | A | S I T T I N G | P O S T U R E | O N | T H E | S T E P S | O F | T H E | K I T C H E N | D O O R | +A L E X A N D E R | O S S I P O N | G O T | U P | T A L L | I N | H I S | T H R E A D B A R E | B L U E | S E R G E | S U I T | U N D E R | T H E | L O W | C E I L I N G | S H O O K | O F F | T H E | S T I F F N E S S | O F | L O N G | I M M O B I L I T Y | A N D | S T R O L L E D | A W A Y | I N T O | T H E | K I T C H E N | D O W N | T W O | S T E P S | T O | L O O K | O V E R | S T E V I E ' S | S H O U L D E R | +H E R | B A R E | F E E T | A S | I F | P O K E D | T H R O U G H | T H E | B O T T O M | O F | A N | U N A D O R N E D | S L E E V E D | C A L I C O | S A C K | B U T T O N E D | T I G H T L Y | A T | N E C K | A N D | W R I S T S | F E L T | O V E R | T H E | R U G | F O R | T H E | S L I P P E R S | W H I L E | S H E | L O O K E D | U P W A R D | I N T O | H E R | H U S B A N D ' S | F A C E | +A N D | E V E R | S I N C E | H E | H A D | N E V E R | M A N A G E D | T O | G E T | H I S | W E I G H T | D O W N | A S | M U C H | A S | A N | O U N C E | +H E | T O O K | T H E | C A S H | B O X | O U T | O F | T H E | D R A W E R | A N D | T U R N I N G | T O | L E A V E | T H E | S H O P | B E C A M E | A W A R E | T H A T | S T E V I E | W A S | S T I L L | D O W N S T A I R S | +D O N ' T | Y O U | T H I N K | T H A T | I F | I | H A D | N O T | B E E N | T H E | O P T I M I S T | I | A M | I | C O U L D | N O T | H A V E | F O U N D | I N | F I F T E E N | Y E A R S | S O M E | M E A N S | T O | C U T | M Y | T H R O A T | +T H E R E | W A S | A N | E X T R A O R D I N A R Y | F O R C E | O F | S U G G E S T I O N | I N | T H I S | P O S T U R I N G | +T H I S | S U R V E Y | W A S | U N F A V O U R A B L E | +T H E R E | W A S | N O | Y O U N G | M A N | O F | H I S | A G E | I N | L O N D O N | M O R E | W I L L I N G | A N D | D O C I L E | T H A N | S T E P H E N | S H E | A F F I R M E D | N O N E | M O R E | A F F E C T I O N A T E | A N D | R E A D Y | T O | P L E A S E | A N D | E V E N | U S E F U L | A S | L O N G | A S | P E O P L E | D I D | N O T | U P S E T | H I S | P O O R | H E A D | +T H A T | P O O R | B O Y | I S | I N | A | V E R Y | E X C I T E D | S T A T E | T O | N I G H T | S H E | M U R M U R E D | A F T E R | A | P A U S E | W H I C H | L A S T E D | F O R | T H R E E | T I C K S | O F | T H E | C L O C K | +T H I S | D R E A D | L E D | H I M | T O | M A K E | T H E | R E M A R K | T H A T | S T E V I E | H A D | D I S R E G A R D E D | H I S | S U G G E S T I O N | T O | G O | T O | B E D | +T H E | D I S D A I N F U L | P O U T | O F | C O M R A D E | O S S I P O N ' S | T H I C K | L I P S | A C C E N T U A T E D | T H E | N E G R O | T Y P E | O F | H I S | F A C E | +T H E Y | A R E | N O U R I S H I N G | T H E I R | G R E E D | O N | T H E | Q U I V E R I N G | F L E S H | A N D | T H E | W A R M | B L O O D | O F | T H E | P E O P L E | N O T H I N G | E L S E | +T H E R E | A R E | N A T U R E S | T O O | T O | W H O S E | S E N S E | O F | J U S T I C E | T H E | P R I C E | E X A C T E D | L O O M S | U P | M O N S T R O U S L Y | E N O R M O U S | O D I O U S | O P P R E S S I V E | W O R R Y I N G | H U M I L I A T I N G | E X T O R T I O N A T E | I N T O L E R A B L E | T H O S E | A R E | T H E | F A N A T I C S | +T H E | S H E E T | O F | P A P E R | C O V E R E D | W I T H | C I R C L E S | D R O P P E D | O U T | O F | H I S | F I N G E R S | A N D | H E | R E M A I N E D | S T A R I N G | A T | T H E | O L D | T E R R O R I S T | A S | I F | R O O T E D | S U D D E N L Y | T O | T H E | S P O T | B Y | H I S | M O R B I D | H O R R O R | A N D | D R E A D | O F | P H Y S I C A L | P A I N | +H I S | S C A R E D | E Y E S | B L A Z E D | W I T H | I N D I G N A T I O N | I T | W O U L D | H U R T | T E R R I B L Y | H I S | M O U T H | D R O P P E D | O P E N | +M I S T E R | V E R L O C | P E R C E I V E D | W I T H | S O M E | S U R P R I S E | T H A T | H E | D I D | N O T | K N O W | R E A L L Y | W H A T | T O | S A Y | T O | S T E V I E | +D O W N | B E L O W | I N | T H E | Q U I E T | N A R R O W | S T R E E T | M E A S U R E D | F O O T S T E P S | A P P R O A C H E D | T H E | H O U S E | T H E N | D I E D | A W A Y | U N H U R R I E D | A N D | F I R M | A S | I F | T H E | P A S S E R | B Y | H A D | S T A R T E D | T O | P A C E | O U T | A L L | E T E R N I T Y | F R O M | G A S | L A M P | T O | G A S | L A M P | I N | A | N I G H T | W I T H O U T | E N D | A N D | T H E | D R O W S Y | T I C K I N G | O F | T H E | O L D | C L O C K | O N | T H E | L A N D I N G | B E C A M E | D I S T I N C T L Y | A U D I B L E | I N | T H E | B E D R O O M | +H E | K N O W S | N O | B E T T E R | H E | G E T S | I N T O | H I S | P A S S I O N S | O V E R | I T | +Y E S | N O T | A T | A L L | W E L L | +T H E | C O M P A R I S O N | O C C U R R E D | T O | M I S T E R | V E R L O C | B E C A U S E | H E | H A D | S A T | A S T R I D E | V A R I O U S | A R M Y | H O R S E S | I N | H I S | T I M E | A N D | H A D | N O W | T H E | S E N S A T I O N | O F | A N | I N C I P I E N T | F A L L | +S T E V I E | A C C U S T O M E D | T O | M O V E | A B O U T | D I S R E G A R D E D | H A D | G O T | U P | F R O M | T H E | K I T C H E N | T A B L E | C A R R Y I N G | O F F | H I S | D R A W I N G | T O | B E D | W I T H | H I M | +M I C H A E L I S | T H E | T I C K E T | O F | L E A V E | A P O S T L E | S M I L E D | V A G U E L Y | W I T H | H I S | G L U E D | L I P S | H I S | P A S T Y | M O O N | F A C E | D R O O P E D | U N D E R | T H E | W E I G H T | O F | M E L A N C H O L Y | A S S E N T | +T H E | O L D | T E R R O R I S T | T U R N E D | S L O W L Y | H I S | H E A D | O N | H I S | S K I N N Y | N E C K | F R O M | S I D E | T O | S I D E | +Y E S | I | H A D | T H E | T I M E | T O | T H I N K | T H I N G S | O U T | A | L I T T L E | H E | A D D E D | W I T H O U T | E M P H A S I S | +T H E | C O A L S | I N | T H E | G R A T E | S E T T L E D | D O W N | W I T H | A | S L I G H T | C R A S H | A N D | M I C H A E L I S | T H E | H E R M I T | O F | V I S I O N S | I N | T H E | D E S E R T | O F | A | P E N I T E N T I A R Y | G O T | U P | I M P E T U O U S L Y | +W I T H | H I S | E L B O W | P R E S E N T I N G | N O | A P P E A R A N C E | O F | A | J O I N T | B U T | M O R E | L I K E | A | B E N D | I N | A | D U M M Y ' S | L I M B | T H R O W N | O V E R | T H E | B A C K | O F | A | C H A I R | H E | L E A N E D | F O R W A R D | S L I G H T L Y | O V E R | H I S | S H O R T | A N D | E N O R M O U S | T H I G H S | T O | S P I T | I N T O | T H E | G R A T E | +H E | G L A R E D | A T | M E | A S | I F | H E | D I D N ' T | K N O W | W H O | I | W A S | W H E N | I | W E N T | D O W N S T A I R S | +T H E | P R O S P E C T | W A S | A S | B L A C K | A S | T H E | W I N D O W | P A N E | A G A I N S T | W H I C H | H E | W A S | L E A N I N G | H I S | F O R E H E A D | +S T E V I E | P R O W L E D | R O U N D | T H E | T A B L E | L I K E | A N | E X C I T E D | A N I M A L | I N | A | C A G E | +I F | I | H A D | K N O W N | T H E Y | W E R E | C O M I N G | T O | N I G H T | I | W O U L D | H A V E | S E E N | T O | I T | T H A T | H E | W E N T | T O | B E D | A T | T H E | S A M E | T I M E | I | D I D | +H I S | O W N | S K I N | H A D | S I Z Z L E D | U N D E R | T H E | R E D | H O T | B R A N D | H E | M U R M U R E D | S O F T L Y | +H E | H A D | B E E N | A | P R I S O N E R | H I M S E L F | +I | W O U L D | C A L L | I T | C A N N I B A L I S T I C | T H A T ' S | W H A T | I T | I S | +T H E | L I G H T | T H R O W N | D O W N | B Y | T H E | S H A D E | F E L L | D A Z Z L I N G L Y | O N | T H E | W H I T E | P I L L O W | S U N K | B Y | T H E | W E I G H T | O F | H E R | H E A D | R E P O S I N G | W I T H | C L O S E D | E Y E S | A N D | D A R K | H A I R | D O N E | U P | I N | S E V E R A L | P L A I T S | F O R | T H E | N I G H T | +I N | A N Y | C A S E | H E | H A D | N O T | T H E | T I M E | +I T ' S | L I K E | Y O U R | H O R S E | S U D D E N L Y | F A L L I N G | D E A D | U N D E R | Y O U | I N | T H E | M I D S T | O F | A N | U N I N H A B I T E D | A N D | T H I R S T Y | P L A I N | +L O A F I N G | W A S | A L L | V E R Y | W E L L | F O R | T H E S E | F E L L O W S | W H O | K N E W | N O T | M I S T E R | V L A D I M I R | A N D | H A D | W O M E N | T O | F A L L | B A C K | U P O N | W H E R E A S | H E | H A D | A | W O M A N | T O | P R O V I D E | F O R | +L O M B R O S O | I S | A N | A S S | +F O R | H I M | T H E | C R I M I N A L | I S | T H E | P R I S O N E R | S I M P L E | I S | I T | N O T | +S T R U G G L E | W A R F A R E | W A S | T H E | C O N D I T I O N | O F | P R I V A T E | O W N E R S H I P | I T | W A S | F A T A L | +T H E | P O S S E S S O R S | O F | P R O P E R T Y | H A D | N O T | O N L Y | T O | F A C E | T H E | A W A K E N E D | P R O L E T A R I A T | B U T | T H E Y | H A D | A L S O | T O | F I G H T | A M O N G S T | T H E M S E L V E S | Y E S | +H I S | E N U N C I A T I O N | W O U L D | H A V E | B E E N | A L M O S T | T O T A L L Y | U N I N T E L L I G I B L E | T O | A | S T R A N G E R | +H E | L O O K E D | D U B I O U S L Y | A T | H I S | B R O T H E R | I N | L A W | B U T | H E | D I D | N O T | A S K | H I M | F O R | I N F O R M A T I O N | +Y O U | D O N ' T | U N D E R S T A N D | H E | B E G A N | D I S D A I N F U L L Y | B U T | S T O P P E D | S H O R T | I N T I M I D A T E D | B Y | T H E | D E A D | B L A C K N E S S | O F | T H E | C A V E R N O U S | E Y E S | I N | T H E | F A C E | T U R N E D | S L O W L Y | T O W A R D S | H I M | W I T H | A | B L I N D | S T A R E | A S | I F | G U I D E D | O N L Y | B Y | T H E | S O U N D | +Y O U | W O U L D | C A L L | T H A T | L A D | A | D E G E N E R A T E | W O U L D | Y O U | M U M B L E D | M I S T E R | V E R L O C | +A S K | K A R L | Y U N D T | H E | G R O W L E D | S A V A G E L Y | +I | D O N ' T | S A Y | T H A T | P R O T E S T E D | M I C H A E L I S | G E N T L Y | +T H E R E | I S | N O | O C C U P A T I O N | T H A T | F A I L S | A | M A N | M O R E | C O M P L E T E L Y | T H A N | T H A T | O F | A | S E C R E T | A G E N T | O F | P O L I C E | +A N D | I | C O U L D | N E V E R | G E T | A S | M A N Y | A S | T H R E E | S U C H | M E N | T O G E T H E R | +H E | W A T C H E D | H I M | G E S T I C U L A T I N G | A N D | M U R M U R I N G | I N | T H E | K I T C H E N | +T H E S E | W E R E | B U T | F E W | A N D | F O R | T H E | F I R S T | T I M E | S I N C E | H E | O P E N E D | H I S | S H O P | H E | T O O K | A | C O M M E R C I A L | S U R V E Y | O F | I T S | V A L U E | +C O M R A D E | O S S I P O N ' S | F A C E | T W I T C H E D | W I T H | E X A S P E R A T I O N | +T H A T | B O Y | H E A R S | T O O | M U C H | O F | W H A T | I S | T A L K E D | A B O U T | H E R E | +H E | G A V E | T H E | D I S C U S S I O N | U P | W I T H | A | S L I G H T | S H R U G | O F | T H E | S H O U L D E R S | +C O M F O R T A B L E | D E A R | +H E | G E T S | A | R E D | F A C E | P O R I N G | O V E R | T H E M | +H E | W A S | N O T | S A T I S F I E D | W I T H | H I S | F R I E N D S | +W H E N | H E | R O S E | P A I N F U L L Y | T H E | T H R U S T I N G | F O R W A R D | O F | A | S K I N N Y | G R O P I N G | H A N D | D E F O R M E D | B Y | G O U T Y | S W E L L I N G S | S U G G E S T E D | T H E | E F F O R T | O F | A | M O R I B U N D | M U R D E R E R | S U M M O N I N G | A L L | H I S | R E M A I N I N G | S T R E N G T H | F O R | A | L A S T | S T A B | +T H E | S H A D O W | O F | H I S | E V I L | G I F T | C L U N G | T O | H I M | Y E T | L I K E | T H E | S M E L L | O F | A | D E A D L Y | D R U G | I N | A N | O L D | V I A L | O F | P O I S O N | E M P T I E D | N O W | U S E L E S S | R E A D Y | T O | B E | T H R O W N | A W A Y | U P O N | T H E | R U B B I S H | H E A P | O F | T H I N G S | T H A T | H A D | S E R V E D | T H E I R | T I M E | +I T | W A S | K A R L | Y U N D T | W H O | W A S | H E A R D | I M P L A C A B L E | T O | H I S | L A S T | B R E A T H | +H E | I S N ' T | F I T | T O | H E A R | W H A T ' S | S A I D | H E R E | H E | B E L I E V E S | I T ' S | A L L | T R U E | +A T | B E S T | T H E Y | C A N | O N L Y | I N T E R P R E T | T H E | M I N D | O F | T H E | P R O P H E T | A N D | C A N | H A V E | N O | O B J E C T I V E | V A L U E | +H E | P A U S E D | T H E N | A D D E D | W I T H | M O D E S T | F I R M N E S S | +T H E N | W H Y | I N D U L G E | I N | P R O P H E T I C | P H A N T A S I E S | +M I S T E R | V E R L O C | W A S | F U L L Y | R E S P O N S I V E | N O W | +H E | W A S | O U T | O F | H I S | M I N D | W I T H | S O M E T H I N G | H E | O V E R H E A R D | A B O U T | E A T I N G | P E O P L E ' S | F L E S H | A N D | D R I N K I N G | B L O O D | W H A T ' S | T H E | G O O D | O F | T A L K I N G | L I K E | T H A T | +H E | C A N ' T | S T A N D | T H E | N O T I O N | O F | A N Y | C R U E L T Y | +T H E | F A M O U S | T E R R O R I S T | H A D | N E V E R | I N | H I S | L I F E | R A I S E D | P E R S O N A L L Y | A S | M U C H | A S | H I S | L I T T L E | F I N G E R | A G A I N S T | T H E | S O C I A L | E D I F I C E | +A N D | T H E | I N C O N S I S T E N T | W O M A N | F E L L | U P O N | H I S | B U T T O N Y | B R E A S T | W E E P I N G | C O P I O U S L Y | +I | C O U L D | N O T | L O V E | T H E E | D E A R | S O | M U C H | L O V E D | I | N O T | H O N O R | M O R E | +T H E | B O Y S | B L E S S | T H E I R | B R A V E | H E A R T S | H A V E | D O N E | N O B L Y | B U T | O L D E R | M E N | A R E | N E E D E D | N O W | W E | C A N N O T | S A C R I F I C E | A L L | T H E | G A L L A N T | L A D S | A N D | W E | W H O | H A V E | M O R E | T O | L O S E | T H A N | T H E Y | M U S T | T A K E | O U R | T U R N | A N D | T R Y | T O | D O | A S | W E L L | +B U T | E V E N | W H I L E | S H E | E N J O Y E D | E V E R Y | H O U R | O F | L I F E | A N D | B E G R U D G E D | T H E | T I M E | G I V E N | T O | S L E E P | S H E | F E L T | A S | I F | T H E | D R E A M | W A S | T O O | B E A U T I F U L | T O | L A S T | A N D | O F T E N | S A I D | +H I S | W I F E | F E D | H I M | W I T H | T H E | F A T | O F | T H E | L A N D | R E G A R D L E S S | O F | C O N S E Q U E N C E S | H I S | C H I L D R E N | R E V O L V E D | A B O U T | H I M | W I T H | T I R E L E S S | C U R I O S I T Y | A N D | W O N D E R | H I S | N E I G H B O R S | F L O C K E D | I N | T O | A P P L A U D | A D V I S E | A N D | A D M I R E | E V E R Y | O N E | T R E A T E D | H I M | W I T H | A | R E S P E C T | M O S T | G R A T E F U L | T O | H I S | F E E L I N G S | H E | W A S | A N | O B J E C T | O F | I N T E R E S T | A N D | W I T H | E V E R Y | H O U R | H I S | I M P O R T A N C E | I N C R E A S E D | S O | T H A T | B Y | N I G H T | H E | F E L T | L I K E | A | C O M M A N D E R | I N | C H I E F | A N D | B O R E | H I M S E L F | A C C O R D I N G L Y | +N O W | C Y N T H Y | B E | Y O U | S A T I S F I E D | +S O | C H R I S T I E | T U R N E D | A | D E A F | E A R | T O | H E R | P R O P H E T I C | S O U L | A N D | G A V E | H E R S E L F | U P | T O | T H E | B L I S S F U L | H O L I D A Y | T H A T | H A D | C O M E | A T | L A S T | +I | H O P E | Y O U ' L L | L I K E | H I M | B E T T E R | T H A N | T H E | F R O S T | B I T T E N | O L D | D A V I D | Y O U | F I R S T | K N E W | A N D | W E R E | K I N D | E N O U G H | T O | L O V E | +T H E N | S H E | S A W | D A V I D | A N D | T H E | R E G I M E N T | B E C A M E | O N E | M A N | T O | H E R | +I ' M | N O T | A | T A L K E R | Y O U | K N O W | A N D | A S | T H E | L A W S | O F | G R A V I T A T I O N | F O R B I D | M Y | S O A R I N G | A L O F T | A N Y W H E R E | I | C A N | O N L Y | E X P R E S S | M Y | J O Y F U L L Y | U P L I F T E D | S T A T E | O F | M I N D | B Y | P R A N C I N G | A S | Y O U | C A L L | I T | +I | S H A L L | W A I T | F O R | T I M E | T O | S H O W | +C A N | Y O U | R E M E M B E R | W H A T | H E P S E Y | T O L D | U S | A N D | C A L L | T H E M | P O O R | L O N G | S U F F E R I N | C R E E T E R S | N A M E S | +D A V I D | A N D | C H R I S T I E | W E N T | S M I L I N G | A W A Y | T O G E T H E R | A N D | I F | T H E Y | S H E D | A N Y | T E A R S | O V E R | T H E | B R I E F | H A P P I N E S S | N O | O N E | S A W | T H E M | B U T | T H E | F L O W E R S | A N D | T H E Y | L O Y A L L Y | K E P T | T H E | S E C R E T | F O L D E D | U P | I N | T H E I R | T E N D E R | H E A R T S | +M I S T E R | P O W E R | I S | W A I T I N G | A R E | Y O U | R E A D Y | L O V E | Q U I T E | R E A D Y | +A S | A | M A R R I E D | W O M A N | Y O U | W I L L | G E T | O N | B E T T E R | A S | M Y | W I F E | Y O U | W I L L | B E | A L L O W E D | T O | C O M E | T O | M E | I F | I | N E E D | Y O U | A N D | A S | M Y | H E | S T O P P E D | T H E R E | F O R | H E | C O U L D | N O T | A D D | A S | M Y | W I D O W | Y O U | W I L L | H A V E | M Y | P E N S I O N | T O | S U P P O R T | Y O U | +B E N N E T | W I L L | T A K E | T H E | G A R D E N | A N D | G R E E N | H O U S E | O F F | M Y | H A N D S | T H I S | A U T U M N | F O R | A | Y E A R | O R | L O N G E R | I F | I | L I K E | +T H E N | T H E Y | W E N T | B A C K | T O | T H E I R | W O R K | L I T T L E | D R E A M I N G | A S | T H E Y | T I E D | R O S E S | A N D | T W I N E D | S M I L A X | W R E A T H S | H O W | N E A R | T H A T | O T H E R | C H A N C E | W A S | H O W | S O O N | T H E Y | W E R E | T O | B E | C A L L E D | U P O N | T O | K E E P | T H E I R | P R O M I S E | A N D | H O W | W E L L | E A C H | W A S | T O | P E R F O R M | T H E | P A R T | G I V E N | T H E M | I N | L I F E | A N D | D E A T H | +H E | W A S | N O T | A S | U N M O V E D | A S | H E | S E E M E D | B Y | T H E | G E N E R A L | E X C I T E M E N T | A N D | H A D | F E L T | S U N D R Y | M A N L Y | I M P U L S E S | T O | U P | A N D | A T | E M | W H E N | H I S | C O M R A D E S | I N | T H E | S H O P | D I S C U S S E D | T H E | C R I S I S | W I T H | I R E F U L | B R A N D I S H I N G | O F | A W L S | A N D | V E N G E F U L | P O U N D I N G | O F | S O L E | L E A T H E R | A S | I F | T H E | R E B E L S | W E R E | U N D E R | T H E | H A M M E R | +V E R Y | W E L L | S A I D | M I S S U S | W I L K I N S | R E S O L U T E L Y | T O | H E R S E L F | E F | I | C A N ' T | M A K E | N O | I M P R E S S I O N | O N | H I S | S O U L | I | W I L L | O N | H I S | S T O M M I C K | A N D | S E E | H O W | T H A T ' L L | W O R K | +Y O U | Y O U N G | F O L K S | T A K E | A | W E D D I N G | T R I P | T O | T H E | G R E E N | H O U S E | W H I L E | W E | S E E | H O W | W E L L | W E | C A N | G E T | O N | W I T H O U T | Y O U | +A L L | W A T C H E D | W I T H | Q U I C K E N E D | B R E A T H | A N D | P R O U D | S O U L S | T H A T | L I V I N G | W A V E | B L U E | B E L O W | A N D | B R I G H T | W I T H | A | S T E E L Y | G L I T T E R | A B O V E | A S | I T | F L O W E D | D O W N | T H E | S T R E E T | A N D | A W A Y | T O | J O I N | T H E | S E A | O F | D A U N T L E S S | H E A R T S | T H A T | F O R | M O N T H S | H A D | R O L L E D | U P | A G A I N S T | T H E | S O U T H | A N D | E B B E D | B A C K | R E D D E N E D | W I T H | T H E | B L O O D | O F | M E N | L I K E | T H E S E | +I T | I S | T E R R I B L E | A N D | Y E T | G L O R I O U S | +H E ' S | A | K I N D | N E I G H B O R L Y | M A N | A N D | H I S | B O Y | W I L L | T A K E | M Y | P L A C E | A B O U T | T H E | H O U S E | A N D | P R O T E C T | Y O U | F A I T H F U L L Y | +A | V E R Y | S I M P L E | L I T T L E | M A R R I A G E | F E A S T | B U T | M O R E | L O V E | G O O D | W I L L | A N D | T E N D E R | W I S H E S | A D O R N E D | T H E | P L A I N | T A B L E | T H A N | I S | O F T E N | F O U N D | A T | W E D D I N G | B R E A K F A S T S | A N D | B E T T E R | T H A N | A N Y | S P E E C H | O R | S O N G | W A S | L E T T Y ' S | B R O K E N | W H I S P E R | A S | S H E | F O L D E D | H E R | A R M S | R O U N D | D A V I D ' S | E M P T Y | C H A I R | W H E N | N O | O N E | S A W | H E R | H E A V E N | B L E S S | A N D | K E E P | A N D | B R I N G | H I M | B A C K | T O | U S | +T H E | R O S E S | A R E | F O R | T H E Y | R E M I N D | M E | O F | P O O R | H E L E N | A N D | T H E | F I R S T | W O R K | I | D I D | W I T H | D A V I D | W A S | A R R A N G I N G | F L O W E R S | L I K E | T H E S E | F O R | A | D E A D | B A B Y ' S | L I T T L E | C O F F I N | +T O | N O | H O M E | I N | T H E | L A N D | D I D | T H E | G R E A T | T R O U B L E | B R I N G | A | M O R E | S U D D E N | C H A N G E | T H A N | T H E | L I T T L E | C O T T A G E | I N | T H E | L A N E | +Y E S | D A V I D | S I S T E R | A N D | S W E E T H E A R T | A N S W E R E D | B R A V E L Y | F O R G E T T I N G | I N | T H E | F E R V O R | O F | T H E | M O M E N T | W H A T | H E A V Y | C O N S E Q U E N C E S | G O D | M I G H T | S E E | F I T | T O | S E N D | G O O D | +I | K N E W | Y O U | W O U L D | G O | I | S A W | Y O U | G E T T I N G | R E A D Y | A N D | I | M A D E | U P | M Y | M I N D | T O | F O L L O W | +T O | S A Y | T H A T | T H E | F I S H | R O S E | A T | O N C E | A N D | S W A L L O W E D | T H E | B A I T | H O O K | A N D | A L L | B U T | F E E B L Y | E X P R E S S E S | T H E | J U S T I C E | D O N E | T O | T H E | C A K E S | B Y | T H A T | L O N G | S U F F E R I N G | M A N | +W E | C A N ' T | A F F O R D | N O | N I C E | V I T T L E S | N O W | W H E N | O U R | M E N | A R E | S U F F E R I N | S O | +T H E Y | K N E W | W H A T | I T | W A S | W I T H O U T | A | W O R D | M I S S U S | S T E R L I N G | C L A S P E D | H E R | H A N D S | A N D | B O W E D | H E R | H E A D | +I N | T H A T | C A S E | Y O U | W I L L | F I N D | M E | A | P R O U D | I M P E T U O U S | A M B I T I O U S | F E L L O W | C H R I S T I E | A N D | H O W | W I L L | T H A T | S U I T | +S U R E L Y | I | S H A L L | I F | I | G I V E | Y O U | A N D | M Y S E L F | T O | T H E | C A U S E | A N D | I | D O | I T | G L A D L Y | T H O U G H | I | K N O W | T H A T | M Y | H E A R T | H A S | G O T | T O | A C H E | A S | I T | N E V E R | H A S | A C H E D | Y E T | W H E N | M Y | C O U R A G E | F A I L S | A S | I T | W I L L | B Y | A N D | B Y | A N D | M Y | S E L F I S H | S O U L | C O U N T S | T H E | C O S T | O F | M Y | O F F E R I N G | A F T E R | T H E | E X C I T E M E N T | I S | O V E R | +D A V I D | C A U G H T | T H E | E X A L T A T I O N | A N D | G A V E | N O | F U R T H E R | T H O U G H T | T O | A N Y | T H I N G | B U T | T H E | D U T Y | O F | T H E | H O U R | F I N D I N G | H I M S E L F | S T R O N G E R | A N D | B R A V E R | F O R | T H A T | L O N G | L O O K | I N T O | T H E | I L L U M I N A T E D | F A C E | O F | T H E | W O M A N | H E | L O V E D | +F I N D I N G | T H A T | L I S H A | S H O W E D | L I T T L E | E N T H U S I A S M | O N | T H E | S U B J E C T | S H E | T R I E D | T O | R O U S E | H I M | B Y | P A T R I O T I C | A P P E A L S | O F | V A R I O U S | S O R T S | +N O T | O N E | D A V I D | T H A T ' S | T R U E | L O V E | C H R I S T I E | +Y O U | W I L L | L E T | M E | D O | I T | A N D | I N | R E T U R N | I | W I L L | M A R R Y | Y O U | W H E N E V E R | Y O U | A S K | M E | A N S W E R E D | C H R I S T I E | S E A L I N G | T H E | P R O M I S E | W I T H | A | K I S S | T H A T | S I L E N C E D | H I M | +W E | W I L L | W H A T | C A N | I | D O | F O R | Y O U | D A V Y | A S K E D | C H R I S T I E | W O N D E R F U L L Y | S U P P O R T E D | B Y | T H E | T H O U G H T | T H A T | S H E | W A S | G O I N G | T O O | +D A V I D | W A S | S O B E R | E N O U G H | N O W | A N D | W E N T | A B O U T | H I S | W O R K | W I T H | A | G R I M | S E T | T O | H I S | L I P S | A N D | A | S P A R K | I N | H I S | E Y E S | T H A T | M A D E | T H E | T H R E E | W O M E N | L O O K | A T | O N E | A N O T H E R | P A L E | W I T H | U N S P O K E N | A P P R E H E N S I O N | +M O T H E R | S A Y S | I ' V E | G O N E | B A C K | T O | T H E | T I M E | B E F O R E | W E | L O S T | L E T T Y | A N D | I | S O M E T I M E S | F E E L | A S | I F | I | H A D | +D A V I D | H E L D | I T | C L O S E | I N | B O T H | O F | H I S | S A Y I N G | G R A T E F U L L Y | T H A N K | Y O U | M O T H E R | T H E N | F I X I N G | H I S | E Y E S | O N | T H E | Y O U N G E R | Y E T | N O T | D E A R E R | W O M E N | H E | A D D E D | W I T H | A | R I N G | I N | H I S | V O I C E | T H A T | M A D E | T H E I R | H E A R T S | A N S W E R | W I T H | A | P R O M P T | A Y | A Y | I N | S P I T E | O F | L O V E | O R | F E A R | +N O T H I N G | C A N | S U R P R I S E | M E | N O W | I ' M | P R E P A R E D | F O R | A N Y | T H I N G | E V E N | T H E | S I G H T | O F | M Y | Q U A K E R I S H | L O V E R | D A N C I N G | A | J I G | +T H E | W O M E N | D R O P P E D | T H E I R | W O R K | T O | L O O K | A N D | L I S T E N | F O R | H I S | V I S I T S | W E R E | F E W | A N D | S H O R T | A N D | E V E R Y | I N S T A N T | W A S | P R E C I O U S | +Y O U ' V E | S O M E T H I N G | T O | T E L L | M E | I | S E E | I T | I N | Y O U R | F A C E | D E A R | I | M U S T | G O | +B U T | I | T H I N K | F E W | B R I D E S | D R E S S | W I T H | A | B R A V E R | H A P P I E R | H E A R T | T H A N | M I N E | T H O U G H | I | D O | C H O O S E | A | S O B E R | W E D D I N G | G O W N | A N S W E R E D | C H R I S T I E | S M I L I N G | A G A I N | A S | S H E | T O O K | F R O M | A | H A L F | P A C K E D | T R U N K | H E R | N E W | H O S P I T A L | S U I T | O F | S O F T | G R A Y | W O O L L E N | S T U F F | +I T | W O U L D | H A V E | T A K E N | M A N Y | K N A P S A C K S | T O | H O L D | A L L | T H E | G I F T S | S H O W E R E D | U P O N | H I M | B Y | H I S | F R I E N D S | A N D | N E I G H B O R S | +T H E N | T H E Y | S T O O D | Q U I T E | S T I L L | F O R | A | T I M E | A N D | I N | T H E | S I L E N C E | T H E | T W O | H E A R T S | T A L K E D | T O G E T H E R | I N | T H E | S W E E T | L A N G U A G E | N O | T O N G U E | C A N | U T T E R | +I | D O N ' T | W A N T | Y O U | T O | I | L O V E | T O | S E E | Y O U | S O | Y O U N G | A N D | H A P P Y | O N L Y | Y O U | A R E | N O T | T H E | O L D | D A V I D | A N D | I ' V E | G O T | T O | G E T | A C Q U A I N T E D | W I T H | T H E | N E W | O N E | +E X C E L L E N T L Y | I | L I K E | P R I D E | O F | Y O U R | S O R T | I M P E T U O S I T Y | B E C O M E S | Y O U | F O R | Y O U | H A V E | L E A R N E D | T O | C O N T R O L | I T | I F | N E E D | B E | A N D | T H E | A M B I T I O N | I S | B E S T | O F | A L L | +N O | H E | A I N ' T | I T ' S | A | T R A I N E R | A D D E D | A N N | L I Z Y | +H E R | M E E T I N G | W I T H | L E T T Y | W A S | I N D E S C R I B A B L Y | T E N D E R | A N D | T H E | D A Y S | T H A T | F O L L O W E D | W E R E | P R E T T Y | E Q U A L L Y | D I V I D E D | B E T W E E N | H E R | A N D | H E R | B R O T H E R | I N | N U R S I N G | T H E | O N E | A N D | L O V I N G | T H E | O T H E R | +T H E N | T H E | G O O D | S O U L | O P E N L Y | S H O U L D E R E D | T H E | B U R D E N | S H E | H A D | B O R N E | S O | L O N G | I N | S E C R E T | A N D | B R A V E L Y | T R U D G E D | O N | A L O N E | +I | F E E L | L I K E | A | B O Y | O U T | O F | S C H O O L | O R | R A T H E R | A | M A N | O U T | O F | P R I S O N | A N D | M U S T | E N J O Y | M Y | L I B E R T Y | I N | S O M E | W A Y | +N E X T | E V E N I N G | A S | M I S S U S | S T E R L I N G | S A T | A L O N E | I N | T H E | T W I L I G H T | A | T A L L | M A N | I N | A R M Y | B L U E | E N T E R E D | Q U I E T L Y | S T O O D | W A T C H I N G | T H E | T R A N Q U I L | F I G U R E | F O R | A | M O M E N T | T H E N | W E N T | A N D | K N E L T | D O W N | B E S I D E | I T | S A Y I N G | W I T H | A | M O S T | U N S O L D I E R L Y | C H O K E | I N | T H E | V O I C E | +N O T H I N G | C A N | P A R T | U S | A N Y | M O R E | N O T | E V E N | D E A T H | F O R | L O V E | L I K E | O U R S | W I L L | L A S T | F O R | E V E R | +I | W I S H | I | H A D N ' T | T A K E N | T H A T | B R A N D Y | H E | S A I D | F O O L | T H A T | I | A M | +T H A T | A T | A L L | T I M E S | D E B A S I N G | A T | T H I S | P A R T I C U L A R | T I M E | I T | W A S | I N F A M O U S | T H A T | A | V I C E | U N W O R T H Y | O F | A N Y | M A N | W A S | D O U B L Y | S I N F U L | I N | A | M A N | O F | E D U C A T I O N | A N D | A | M I N I S T E R | O F | G O D | I N | V A I N | +I N | T H E | V A L L E Y | O F | T H E | S H A D O W | O F | D E A T H | H E | I S | W I T H | U S | +I | H A D | T H E | P L E A S U R E | O F | M E E T I N G | H I M | I N | S O C I E T Y | +D E A D | S A I D | D O C T O R | M A C K L E W A I N | +I ' L L | R E P O R T | T H I S | T O | T H E | G O V E R N M E N T | +Y E S | O N E | O U G H T N ' T | T O | L E A V E | T H E | C O L O N Y | W I T H O U T | S E E I N G | I T | S A Y S | B U R G E S S | I T ' S | W O R T H | S E E I N G | +T H E | D E V I L | H E | I S | I | H E A R D | S O M E T H I N G | A B O U T | I T | T O O | +I N | F A C T | T H E | R I N G L E A D E R | J O H N | R E X | G A V E | M E | H I S | C O N F E S S I O N | A N D | I | S E N T | I T | T O | T H E | B I S H O P | +T H E | G O V E R N M E N T | M A Y | G O | T O | A N D | Y O U | T O O | R O A R E D | B U R G E S S | G E T | O U T | +A N | I M P U L S I V E | G E N T L E M A N | S A I D | M E E K I N | T O | M A C K L E W A I N | A S | T H E | S O U N D | O F | M I S T E R | N O R T H ' S | F O O T S T E P S | D I E D | A W A Y | I N | T H E | D I S T A N C E | +S H O W | M I S T E R | N O R T H | O U T | H E | S A I D | A N D | G O | D O W N | T O | T H E | B A R R A C K S | A N D | T E L L | T R O K E | T H A T | K I R K L A N D | I S | T O | H A V E | A | H U N D R E D | L A S H E S | T O | M O R R O W | +I ' L L | S H O W | Y O U | W H O ' S | M A S T E R | H E R E | M Y | G O O D | S I R | +I | A M | A | M I N I S T E R | O F | G O D | S I R | A N D | I | F O R B I D | Y O U | T O | C O M M I T | T H I S | C R I M E | +W E L L | N O W | S A I D | M E E K I N | W I T H | A S P E R I T Y | I | D O N ' T | A G R E E | W I T H | Y O U | +B Y | A N D | B Y | A | S H O R T | F I G U R E | S M O K I N G | A | C H E R O O T | C A M E | U P | O U T | O F | T H E | D A R K | A N D | P R O V E D | T O | B E | D O C T O R | M A C K L E W A I N | W H O | H A D | B E E N | P R E V E N T E D | F R O M | A T T E N D I N G | T H E | D I N N E R | B Y | R E A S O N | O F | A N | A C C I D E N T | T O | A | C O N S T A B L E | A T | N O R F O L K | B A Y | W H I C H | H A D | C L A I M E D | H I S | P R O F E S S I O N A L | A T T E N T I O N | +W H O M | I S | H E | G O I N G | T O | F L O G | N O W | +B E F O R E | T H E | T W O | C L E R G Y M E N | H A D | G O T | H A L F | W A Y | D O W N | T H E | S T E E P | P A T H | T H A T | L E D | F R O M | T H E | C O M M A N D A N T ' S | H O U S E | T O | T H E | F L A T | O N | W H I C H | T H E | C O T T A G E S | O F | T H E | D O C T O R | A N D | C H A P L A I N | W E R E | B U I L T | M A C K L E W A I N | R E J O I N E D | T H E M | +M A C K L E W A I N | S H O O K | H I S | H E A D | S E R I O U S L Y | +T H I S | I S | M U R D E R O U S | +P R A Y | H E L P | Y O U R S E L F | T O | W I N E | +M I S T E R | M E E K I N | E X P R E S S E D | S O M E | A L A R M | B U T | D O C T O R | M A C K L E W A I N | R E | A S S U R E D | H I M | +O H | G O D | G I V E | M E | S T R E N G T H | A I D | M E | H E L P | M E | +N O R T H | K N E W | W E L L | T H A T | H E | W O U L D | N E V E R | D A R E | T O | A T T E M P T | A N Y | S U C H | A C T | O F | V I O L E N C E | B U T | T H E | I N S U L T | S T U N G | H I M | L I K E | T H E | C U T | O F | A | W H I P | +H E | S E E M S | T O | M E | T O | B E | T R U L Y | P E N I T E N T | F O R | H I S | O F F E N C E S | A | M I S G U I D E D | B U T | N O T | A | H Y P O C R I T I C A L | M A N | I F | M Y | K N O W L E D G E | O F | H U M A N | N A T U R E | G O E S | F O R | A N Y T H I N G | I | H O P E | H E | I S | S A I D | N O R T H | +D A M N | Y O U R | I M P E R T I N E N C E | S I R | B U R S T | O U T | B U R G E S S | +T W I C E | H E | P A U S E D | O N | T H E | W A Y | T O | T H E | S I T T I N G | R O O M | A N D | T W I C E | W A S | H E | D R I V E N | O N | B Y | A | P O W E R | S T R O N G E R | T H A N | H I S | W I L L | +Y O U ' R E | A | D I S M I S S E D | O F F I C E R | O F | T H E | G O V E R N M E N T | S I R | +H A V E | Y O U | M A N Y | V I S I T O R S | C A P T A I N | B U R G E S S | V E R Y | F E W | +I | H A V E | T H E S E | A T T A C K S | A T | T I M E S | +I N | T H E | M I D S T | O F | H I S | A R G U M E N T S | H E | F O U N D | H I M S E L F | A T | T H E | C U P B O A R D | W I T H | T H E | B O T T L E | A T | H I S | L I P S | I N | A N | A T T I T U D E | T H A T | W A S | A T | O N C E | L U D I C R O U S | A N D | H O R R I B L E | +H E | M I X E D | A | T E A S P O O N F U L | O F | T H I S | I N | A | P A N N I K I N | O F | W A T E R | A N D | D R A N K | I T | +Y O U | D O N ' T | M E A N | T O | S A Y | H E ' S | G O I N G | T O | F L O G | K I R K L A N D | +H E | I S | J U S T | M A R R I E D | Y O U | K N O W | I S | H E | S A I D | B U R G E S S | +A N O T H E R | F L O G G I N G | T O | M O R R O W | S A I D | H E | G R U M B L I N G L Y | +T H I S | O F | C O U R S E | W A S | M E R E | B R A V A D O | O N | T H E | P A R T | O F | T H E | C O M M A N D A N T | +I ' L L | T E A C H | M Y | P R I S O N E R S | T O | A T T E M P T | S U I C I D E | +I | W A S | Q U A R T E R E D | W I T H | H I M | A T | S A R A H | I S L A N D | +T H E R E ' S | N O | F E A R | O F | H I M | S A I D | B U R G E S S | C H E E R I L Y | I F | H E | G R O W S | U P R O A R I O U S | W E ' L L | S O O N | G I V E | H I M | A | T O U C H | O F | T H E | C A T | +I ' V E | G I V E N | M Y | O R D E R S | S I R | +W E | C A N ' T | D O | A N Y T H I N G | W I T H O U T | E V I D E N C E | C O M P L A I N | +I | S H A L L | F I N D | M Y | P O R T M A N T E A U | I N | M Y | R O O M | Y O U | S A I D | Y E S | Y E S | +H E | S M E L T | T H E | N U T T Y | A R O M A | O F | T H E | S P I R I T | +D E L I G H T E D | T O | S E E | Y O U | M I S T E R | M E E K I N | +T H E N | C A P T A I N | B U R G E S S | C R I E D | N O R T H | H I S | P A L E | F A C E | F L U S H I N G | I | T E L L | Y O U | T H E | B O Y ' S | B L O O D | W I L L | B E | O N | Y O U R | H E A D | +P E R H A P S | Y O U ' L L | H A V E | T H E | G O O D N E S S | T O | A L L O W | M E | T O | B E | T H E | B E S T | J U D G E | O F | T H A T | R E T U R N E D | M A C K L E W A I N | D R A W I N G | U P | H I S | L I T T L E | B O D Y | T O | I T S | L E A S T | I N S I G N I F I C A N T | S T A T U R E | +A B A N D O N E D | I N D E E D | B Y | G O D | A N D | M A N | A L M O S T | +G O O D | N I G H T | S I R | I | H O P E | Y O U | W I L L | B E | C O M F O R T A B L E | +D O C T O R | W E | A L L | H A V E | O U R | C R O S S E S | H A V E | W E | N O T | +H O W | D E L I G H T F U L | T H E | G R A S S | S M E L L S | +I T | W A S | A S | T H O U G H | H E | H A D | R E A C H E D | T H E | C R I S I S | O F | A | D I S E A S E | W H I C H | H A D | B E E N | F O R | D A Y S | G A T H E R I N G | F O R C E | +T H E Y | S H A L L | N O T | F L O G | T H A T | B O Y | H E | S A I D | +T H E | R E V E R E N D | M E E K I N | E Y E D | H I S | C L E R I C A L | B R O T H E R | W I T H | H O R R O R | T H E | R E V E R E N D | M E E K I N | W A S | N O T | A C C U S T O M E D | T O | C L E R G Y M E N | W H O | W O R E | B L A C K | N E C K T I E S | S M O K E D | C L A Y | P I P E S | C H E W E D | T O B A C C O | A N D | D R A N K | N E A T | B R A N D Y | O U T | O F | T U M B L E R S | +I | S U P P O S E | S E V E R I T Y | I S | N E C E S S A R Y | R E T U R N E D | M E E K I N | T H O U G H | T O | M Y | E A R S | A | F L O G G I N G | S O U N D S | A | L I T T L E | D I S T A S T E F U L | +C A P T A I N | F R E R E | S A Y S | T H A T | T H E | S C E N E R Y | I S | D E L I G H T F U L | +H E | S L E E P S | A T | T H E | B A C K | A N D | N O R T H | H U R R I E D | O F F | +O | L O R D | L O O K | D O W N | U P O N | M E | +I F | Y O U | P L E A S E | S A I D | M E E K I N | G R A V E L Y | +H E | H A S | T H E | S T R A N G E S T | F I T S | A T | T I M E S | +S O | T H E Y | W E N T | O N | T O | T H E | V E R A N D A H | A N D | L O O K E D | D O W N | U P O N | T H E | L I G H T S | O F | T H E | P R I S O N | A N D | L I S T E N E D | T O | T H E | S E A | L A P P I N G | T H E | S H O R E | +O U R | R O A D S | L I E | T O G E T H E R | D O C T O R | +I | M U S T | H A V E | A | T E A S P O O N F U L | H E | S A I D | T O | A L L A Y | T H E | C R A V I N G | +A | G R E A T | R A S C A L | P U T | I N | N O R T H | +Y O U | H A V E | N O T | B E E N | L O N G | I N | T H E | C O L O N Y | M I S T E R | M E E K I N | +U N L E S S | I T ' S | A | C A N C E R | I N | T H E | S T O M A C H | I | D O N ' T | K N O W | W H A T | I T | C A N | B E | C A N C E R | I N | T H E | S T O M A C H | +T H E N | D O N ' T | Y O U | I N T E R F E R E | W I T H | M E | S I R | +T H A T ' S | M A C K L E W A I N ' S | B U S I N E S S | +B U T | M A C K L E W A I N | W A S | T I R E D | A N D | W A N T E D | T O | G E T | H O M E | +I M P E R T I N E N T | Y O U N G | B E G G A R | S A I D | B U R G E S S | +T H A T | L A S T | F E L L O W | Y O U | H A D | O U G H T | T O | H A V E | B E E N | T I E D | U P | H I M S E L F | +A N D | B E A T | O N | T H E | B A R S | W I T H | W H I T E | A N D | S W E A T I N G | H A N D S | +B U T | K I R K L A N D | K E P T | S T E A D I L Y | O N | F O R | T H E | R I V E R | +W H A T | I S | H E | M O R E | T H A N | A N Y B O D Y | E L S E | S A I D | T H E | W R E T C H E D | M A N | T O | H I M S E L F | A S | H E | H U G G E D | H I S | M I S E R Y | C L O S E | +W H A T | D O E S | H E | C A R E | C A R E | +W H E N | T H E | M U S T E R | B E L L | R A N G | A N D | T H E | G A N G | B R O K E | U P | R U F U S | D A W E S | O N | H I S | S I L E N T | W A Y | T O | H I S | S E P A R A T E | C E L L | O B S E R V E D | A | N O T A B L E | C H A N G E | O F | C U S T O M | I N | T H E | D I S P O S I T I O N | O F | T H E | N E W | C O N V I C T | +T H E R E ' S | M O R E | T R O U B L E | W I T H | Y O U | B L O O D Y | A R I S T O C R A T S | T H A N | E N O U G H | L I E | Q U I E T | +V E R Y | G O O D | Y O U R | H O N O U R | S A Y S | T R O K E | +M U S T | S T O P | T H A T | F I F T Y | L A S H E S | T R O K E | +O H | M I S T E R | N O R T H | S A Y S | K I R K L A N D | W H Y | D I D | Y O U | S T O P | M E | +H A V E | Y O U | E V E R | B E E N | I N | T H A T | T H A T | P L A C E | I | W A S | I N | L A S T | N I G H T | A S K E D | K I R K L A N D | +A | P R I S O N E R | R E F R A C T O R Y | Y O U R | R E V E R E N C E | S A I D | T H E | W A T C H M A N | +H O L D | O N | T O | M E | M I S S | N A N C Y | S A I D | T H E | G I A N T | I ' M | B I G | E N O U G H | T O | C A R R Y | D O U B L E | +I T ' S | H A R D | F O R | S U C H | Y O U N G | U N S | +K I R K L A N D | J U M P E D | F O R | T H E | J E T T Y | M I S S E D | H I S | F O O T I N G | A N D | F E L L | I N T O | T H E | A R M S | O F | T H E | C H A P L A I N | +L E T | H I M | O U T | C R I E D | N O R T H | A G A I N | S T A M P I N G | H I S | F O O T | +W A N T S | T O | C O M E | O U T | M I S T E R | N O R T H | +D O | H I M | G O O D | C U R S E | H I M | +A B O U T | D A W N | T H E | N E X T | M O R N I N G | M I S T E R | N O R T H | W H O | A M O N G S T | O T H E R | V A G A R I E S | N O T | A P P R O V E D | O F | B Y | H I S | B I S H O P | H A D | A | H A B I T | O F | P R O W L I N G | A B O U T | T H E | P R I S O N | A T | U N O F F I C I A L | H O U R S | W A S | A T T R A C T E D | B Y | A | D I S P U T E | A T | T H E | D O O R | O F | T H E | D O R M I T O R Y | +I | W O N ' T | H A V E | M Y | M E N | K N O C K E D | U P | W I T H | F L O G G I N G | T H E S E | R A S C A L S | +J U S T | A S | H E | R E A C H E D | I T | H O W E V E R | T H E | F I G U R E | O F | M I S T E R | N O R T H | R O S E | F R O M | B E H I N D | A | P I L E | O F | S T O N E S | +I F | Y O U | F A L L | W E | M U S T | F A L L | O V E R | Y O U | A N D | T H E N | Y O U ' R E | D O N E | F O R | +I | O R D E R | Y O U | S I R | N O R T H | C R I E D | I N D I G N A N T | +I ' M | N O T | T O | G O | I N | T H E R E | S A Y S | T H E | E X | B A N K | C L E R K | D R A W I N G | B A C K | I N | D I S M A Y | F R O M | T H E | C L O U D | O F | F O U L | F A C E S | W H I C H | L O W E R E D | U P O N | H I M | +Y O U | C A N | G U E S S | W H A T | T H A T | U N H A P P Y | B O Y | H A S | S U F F E R E D | +H E | H A D | B E E N | A | C L E R K | I N | A | B A N K I N G | H O U S E | A N D | W A S | T R A N S P O R T E D | F O R | E M B E Z Z L E M E N T | T H O U G H | B Y | S O M E | G R A V E | D O U B T S | A S | T O | H I S | G U I L T | W E R E | E N T E R T A I N E D | +H E | H A D | H A R D L Y | U T T E R E D | T H E | W O R D S | W H E N | T H E | B O Y | F L U N G | H I M S E L F | B E N E A T H | T H E | L O G | +K I R K L A N D | G H A S T L Y | P A L E | B L E E D I N G | W I T H | H I S | W O O L L E N | S H I R T | T O R N | A N D | H I S | B L U E | E Y E S | W I D E | O P E N | W I T H | T E R R O R | W A S | C L I N G I N G | T O | T H E | B A R S | +V E R Y | S O R R Y | Y O U R | R E V E R E N C E | B U T | Y O U R | R E V E R E N C E | K N O W S | T H A T | I | D A R E N ' T | D O | S U C H | A | T H I N G | +Y O U R | C O U S I N | T H E | W I L D | C O N V O L V U L U S | W H O M | I | L E F T | I N | T H E | F I E L D S | T H I S | M O R N I N G | D O E S | N O | S U C H | T H I N G | I | A S S U R E | Y O U | +D I D | T H A T | L O V E L Y | C R E A T U R E | S U P P O S E | T H A T | N A T U R E | W H O | H A D | D O N E | S O | M U C H | F O R | H E R | T H A T | T H E | F A M E | O F | H E R | B E A U T Y | E X T E N D E D | T H R O U G H O U T | T H E | W O R L D | H A D | Y E T | L E F T | H E R | S O | W E A K | A N D | F E E B L E | T H A T | S H E | C O U L D | N O T | S U P P O R T | H E R S E L F | I N | T H E | P O S I T I O N | M O S T | C A L C U L A T E D | T O | G I V E | H E R | E A S E | A N D | P L E A S U R E | +M Y | Y O U N G | P L A N T S | R E Q U I R E | H E A T | O R | T H E Y | W O U L D | N O T | L I V E | A N D | T H E | P O T S | W E | A R E | K E P T | I N | P R O T E C T | U S | F R O M | T H O S E | C R U E L | W I R E | W O R M S | W H O | D E L I G H T | T O | D E S T R O Y | O U R | R O O T S | +T H E N | T H E | W I N D | T O O K | A N O T H E R | F R O L I C | R O U N D | T H E | G A R D E N | A N D | M A D E | U P | T O | T H E | L A R G E | W H I T E | L I L Y | I N T O | W H O S E | R E F I N E D | E A R | H E | W H I S P E R E D | A | D O U B T | A S | T O | T H E | N E C E S S I T Y | O R | A D V A N T A G E | O F | H E R | T H I C K | P O W E R F U L | S T E M | B E I N G | P R O P P E D | U P | A G A I N S T | A | S T U P I D | U G L Y | S T I C K | +H E | R E A L L Y | G R I E V E D | T O | S E E | I T | +Y O U | S U R E L Y | C A N N O T | S U P P O S E | T H A T | I N | A | N A T U R A L | S T A T E | Y O U | W O U L D | B E | F O R C E D | T O | C L I M B | R E G U L A R L Y | U P | O N E | T A L L | B A R E | S T I C K | S U C H | A S | I | S E E | Y O U | U P O N | N O W | +S T I L L | T H E | R O S E | T R E E | S T O O D | O U T | T H A T | T H E R E | M U S T | B E | S O M E | G R E A T | A D V A N T A G E S | I N | A | G A R D E N E R ' S | C A R E | F O R | S H E | C O U L D | N O T | P R E T E N D | T O | B E | I G N O R A N T | O F | H E R | O W N | S U P E R I O R I T Y | T O | A L L | H E R | W I L D | R E L A T I O N S | I N | T H E | W O O D S | +M A K I N G | A | S O R T | O F | E D D Y I N G | C I R C U I T | R O U N D | T H E | G A R D E N | H E | K N O C K E D | O V E R | T H E | C O N V O L V U L U S | P O L E | T O R E | T H E | S T R I P S | F R O M | T H E | S T I C K | T H A T | H E L D | U P | T H E | W H I T E | L I L Y | L O O S E D | A L L | T H E | C A R N A T I O N | F L O W E R S | F R O M | T H E I R | F A S T E N I N G S | B R O K E | T H E | R O S E | T R E E | D O W N | A N D | L E V E L L E D | T H E | S W E E T | P E A S | T O | T H E | G R O U N D | +I | A M | N O T | T H I N K I N G | A B O U T | T H E | G A R D E N | M A M M A | R E P L I E D | T H E | Y O U N G | G I R L | W I T H O U T | L I F T I N G | U P | H E R | F A C E | W E | C A N | P L A N T | N E W | F L O W E R S | A N D | T I E | U P | E V E N | S O M E | O F | T H E S E | A F R E S H | +B U T | F O R | T H E | S I G H T | T H A T | A W A I T E D | H I M | H E | W A S | N O T | P R E P A R E D | A T | A L L | +W H Y | N O T | A L L O W | Y O U R | S I L V E R | T U F T S | T O | L U X U R I A T E | I N | A | N A T U R A L | M A N N E R | +W H A T | A | F U S S | I S | M A D E | A B O U T | Y O U | M Y | D E A R | L I T T L E | F R I E N D S | +I N D E E D | N O T | A | F L O W E R | E S C A P E D | H I S | M I S C H I E V O U S | S U G G E S T I O N S | +M E A N W H I L E | H O W | F A R E D | I T | W I T H | T H E | F L O W E R S | +I N | T H I S | P O S I T I O N | S H E | R E M A I N E D | U N T I L | A | G E N T L E | H A N D | W A S | L A I D | U P O N | H E R | S H O U L D E R | +T H E | M I S T R E S S | H A D | R E T U R N E D | A N D | T H E | Y O U N G | L A D Y | W A S | W I T H | H E R | A N D | H U R R I E D | A T | O N C E | T O | H E R | F A V O U R I T E | G A R D E N | +E C H O E D | T H E | F L O W E R S | T R E M U L O U S L Y | A S | W I T H | A | S O R T | O F | F E A R F U L | P L E A S U R E | T H E Y | A W A I T E D | H I S | A P P R O A C H | +W E E D S | M E A N W H I L E | S P R A N G | U P | A N D | A | D R E A R Y | C O N F U S I O N | R E I G N E D | I N | T H E | O N C E | O R D E R L Y | A N D | B R I L L I A N T | L I T T L E | G A R D E N | +B E F O R E | T H E | D A Y | C L O S E D | T H E | G A R D E N E R | C A M E | W H I S T L I N G | F R O M | H I S | F A R M | W O R K | T O | L O O K | O V E R | H I S | P R E T T Y | C H A R G E S | +O H | T H A T | S H E | W E R E | O N C E | M O R E | C L I M B I N G | U P | T H E | F R I E N D L Y | F I R | P O L E | +T H E | H O N E Y S U C K L E | E S C A P E D | N O | B E T T E R | A N D | T H E | C A R N A T I O N | W A S | R E A D Y | T O | D I E | O F | V E X A T I O N | A T | F I N D I N G | T H A T | H E R | C O V E T E D | F R E E D O M | H A D | L E V E L L E D | H E R | T O | T H E | D I R T | +G O | O N | D O W N | T H E | M O U N T A I N | S A I D | M E R C U R Y | A N D | A S | Y O U | G O | C A S T | T H E | B O N E S | O F | Y O U R | M O T H E R | O V E R | Y O U R | S H O U L D E R S | B E H I N D | Y O U | A N D | W I T H | T H E S E | W O R D S | H E | L E A P E D | I N T O | T H E | A I R | A N D | W A S | S E E N | N O | M O R E | +W E | S H O U L D | L I K E | A B O V E | A L L | T H I N G S | S A I D | D E U C A L I O N | T O | S E E | T H I S | L A N D | F U L L | O F | P E O P L E | O N C E | M O R E | F O R | W I T H O U T | N E I G H B O R S | A N D | F R I E N D S | T H E | W O R L D | I S | A | V E R Y | L O N E L Y | P L A C E | I N D E E D | +S U R E L Y | I | D O | N O T | K N O W | S A I D | D E U C A L I O N | +T H E | D A Y | I S | C O M I N G | S A I D | P R O M E T H E U S | W H E N | J U P I T E R | W I L L | S E N D | A | F L O O D | T O | D E S T R O Y | M A N K I N D | F R O M | T H E | E A R T H | +B U T | M E N | K E P T | O N | F I G H T I N G | A N D | R O B B I N G | E V E N | W H I L E | T H E | R A I N | W A S | P O U R I N G | D O W N | A N D | T H E | S E A | W A S | C O M I N G | U P | O V E R | T H E | L A N D | +A F T E R | J U P I T E R | H A D | B O U N D | P R O M E T H E U S | O N | M O U N T | C A U C A S U S | A N D | H A D | S E N T | D I S E A S E S | A N D | C A R E S | I N T O | T H E | W O R L D | M E N | B E C A M E | V E R Y | V E R Y | W I C K E D | +T H E S E | M E N | H E | S A I D | T O | H I S | M I G H T Y | C O M P A N Y | A R E | N O T H I N G | B U T | A | S O U R C E | O F | T R O U B L E | +W H A T | D I D | H E | M E A N | A S K E D | P Y R R H A | +I S | T H E R E | A N Y T H I N G | T H A T | Y O U | W I S H | H E | A S K E D | +B U T | D E U C A L I O N | A N D | P Y R R H A | W E R E | V E R Y | S A D | F O R | T H E Y | K N E W | T H A T | T H E Y | W E R E | T H E | O N L Y | P E R S O N S | W H O | W E R E | L E F T | A L I V E | I N | A L L | T H E | L A N D | +N O | O N E | B U T | D E U C A L I O N | T H E | S O N | O F | P R O M E T H E U S | W A S | R E A D Y | F O R | S U C H | A | S T O R M | +W H E N | A T | L A S T | T H E Y | R E A C H E D | T H E | P L A I N | T H E Y | F O U N D | T H E M S E L V E S | A T | T H E | H E A D | O F | A | N O B L E | C O M P A N Y | O F | H U M A N | B E I N G S | A L L | E A G E R | T O | S E R V E | T H E M | +I N | T H O S E | V E R Y | E A R L Y | T I M E S | T H E R E | W A S | A | M A N | N A M E D | D E U C A L I O N | A N D | H E | W A S | T H E | S O N | O F | P R O M E T H E U S | +O N E | O F | T H E | Y O U N G | F A I R I E S | O V E R H E A R I N G | H E R | A N D | F A N C Y I N G | S H E | M I G H T | W O R K | S O M E | M I S C H I E F | T O | T H E | L I T T L E | B A B Y | W E N T | A N D | H I D | H E R S E L F | B E H I N D | T H E | H A N G I N G S | I N | T H E | H A L L | S O | A S | T O | B E | A B L E | T O | H A V E | T H E | L A S T | W O R D | A N D | U N D O | A N Y | H A R M | T H E | O L D | F A I R Y | M I G H T | W I S H | T O | W O R K | +H E | T U R N E D | T O | S H O W | T H E M | T H E | C A S T L E | B U T | B E H O L D | +H E | P A S S E D | T H R O U G H | O N E | A P A R T M E N T | A F T E R | A N O T H E R | W H E R E | W E R E | L A D I E S | A N D | G E N T L E M E N | A S L E E P | I N | T H E I R | C H A I R S | O R | S T A N D I N G | +T H E Y | T A L K E D | F O R | F O U R | H O U R S | A N D | H A D | N O T | T H E N | S A I D | H A L F | T H A T | W A S | I N | T H E I R | H E A D S | T O | S A Y | +M E A N W H I L E | A L L | T H E | R E S T | O F | T H E | P E O P L E | I N | T H E | C A S T L E | H A D | B E E N | W A K E N E D | A T | T H E | S A M E | M O M E N T | A S | T H E | P R I N C E S S | A N D | T H E Y | W E R E | N O W | E X T R E M E L Y | H U N G R Y | +H E | E N T E R E D | T H E | G U A R D | R O O M | T H E R E | T H E | G U A R D S | S T O O D | D R A W N | U P | I N | L I N E | W I T H | C A R B I N E S | A T | T H E I R | S H O U L D E R S | B U T | T H E Y | W E R E | S O U N D | A S L E E P | +N O W | F I F T E E N | Y E A R S | A F T E R | T H E | P R I N C E S S | W A S | B O R N | S H E | W A S | W I T H | T H E | K I N G | A N D | Q U E E N | A T | O N E | O F | T H E I R | C A S T L E S | A N D | A S | S H E | W A S | R U N N I N G | A B O U T | B Y | H E R S E L F | S H E | C A M E | T O | A | L I T T L E | C H A M B E R | A T | T H E | T O P | O F | A | T O W E R | A N D | T H E R E | S A T | A N | H O N E S T | O L D | W O M A N | S P I N N I N G | F O R | S H E | H A D | N E V E R | H E A R D | O F | T H E | K I N G ' S | E D I C T | +T H E | Y O U N G | P R I N C E | A T | T H E S E | W O R D S | F E L T | H I M S E L F | O N | F I R E | +T H E | T U R N | O F | T H E | O L D | F A I R Y | H A D | N O W | C O M E | A N D | S H E | D E C L A R E D | W H I L E | H E R | H E A D | S H O O K | W I T H | M A L I C E | T H A T | T H E | P R I N C E S S | S H O U L D | P I E R C E | H E R | H A N D | W I T H | A | S P I N D L E | A N D | D I E | O F | T H E | W O U N D | +H E | E N T E R E D | A | L A R G E | F O R E C O U R T | A N D | S T O O D | S T I L L | W I T H | A M A Z E M E N T | A N D | A W E | +S H E | H A D | N O | S O O N E R | T A K E N | U P | T H E | S P I N D L E | T H A N | B E I N G | H A S T Y | A N D | C A R E L E S S | S H E | P I E R C E D | H E R | H A N D | W I T H | T H E | P O I N T | O F | I T | A N D | F A I N T E D | A W A Y | +T H E | V I O L I N S | A N D | H A U T | B O Y S | P L A Y E D | O L D | B U T | E X C E L L E N T | P I E C E S | O F | M U S I C | A N D | A F T E R | S U P P E R | T O | L O S E | N O | T I M E | T H E | G R A N D | A L M O N E R | M A R R I E D | T H E | R O Y A L | L O V E R S | I N | T H E | C H A P E L | O F | T H E | C A S T L E | +W H E N | A T | L A S T | T H E | Q U E E N | G A V E | B I R T H | T O | A | D A U G H T E R | T H E | K I N G | W A S | S O | O V E R J O Y E D | T H A T | H E | G A V E | A | G R E A T | C H R I S T E N I N G | F E A S T | T H E | L I K E | O F | W H I C H | H A D | N E V E R | B E F O R E | B E E N | K N O W N | +S C A R C E L Y | H A D | H E | C O M E | T O | T H E | W O O D | W H E N | A L L | T H E | T R E E S | A N D | T H O R N S | W H I C H | H A D | M A D E | S U C H | A N | I M P E N E T R A B L E | T H I C K E T | O P E N E D | O N | O N E | S I D E | A N D | T H E | O T H E R | T O | O F F E R | H I M | A | P A T H | +T H E | L A D Y | I N | W A I T I N G | B E C A M E | V E R Y | I M P A T I E N T | A N D | A T | L E N G T H | A N N O U N C E D | T O | T H E | P R I N C E S S | T H A T | T H E Y | A L L | W A I T E D | F O R | H E R | +T H E N | T H E | P R I N C E | T O O K | T H E | P R I N C E S S | B Y | T H E | H A N D | S H E | W A S | D R E S S E D | I N | G R E A T | S P L E N D O U R | B U T | H E | D I D | N O T | H I N T | T H A T | S H E | L O O K E D | A S | H E | H A D | S E E N | P I C T U R E S | O F | H I S | G R E A T | G R A N D M O T H E R | L O O K | H E | T H O U G H T | H E R | A L L | T H E | M O R E | C H A R M I N G | F O R | T H A T | +H E | K N E W | T H A T | S H E | W O U L D | N O T | A W A K E | F O R | A | H U N D R E D | Y E A R S | +O N E | S A I D | I T | W A S | A N | E N C H A N T E D | C A S T L E | A N O T H E R | T H A T | W I T C H E S | L I V E D | T H E R E | B U T | M O S T | B E L I E V E D | T H A T | I T | W A S | O C C U P I E D | B Y | A | G R E A T | O G R E | W H I C H | C A R R I E D | T H I T H E R | A L L | T H E | C H I L D R E N | H E | C O U L D | C A T C H | A N D | A T E | T H E M | U P | O N E | A T | A | T I M E | F O R | N O B O D Y | C O U L D | G E T | A T | H I M | T H R O U G H | T H E | W O O D | +B U T | T H E | F A C E S | O F | T H E | M E N | W E R E | R O S Y | A N D | T H E | G O B L E T S | B Y | T H E M | H A D | A | F E W | D R O P S | O F | W I N E | L E F T | +I T | I S | T R U E | I | C A N N O T | E N T I R E L Y | U N D O | W H A T | M Y | E L D E R | H A S | D O N E | +I N | A P P R O A C H I N G | I T | I T S | S U S P I C I O U S | L O O K I N G | Y E L L O W | S P O T T E D | H O O D | A N D | W A T C H F U L | A T T I T U D E | W I L L | B E | L I K E L Y | T O | M A K E | Y O U | G O | C A U T I O U S L Y | T H R O U G H | T H E | B O G | W H E R E | I T | S T A N D S | A S | I F | Y O U | W E R E | A P P R O A C H I N G | A | D A N G E R O U S | S N A K E | +Y E T | S T R A N G E | T O | S A Y | T H E R E | A R E | D A Y S | E V E N | H E R E | S O M E W H A T | D U L L | L O O K I N G | W H E N | T H E | M O U N T A I N | S E E M S | U N C O M M U N I C A T I V E | S E N D I N G | O U T | N O | A P P R E C I A B L E | I N V I T A T I O N | A S | I F | N O T | A T | H O M E | +A S P L E N I U M | E P I L O B I U M | H E U C H E R A | H A Z E L | D O G W O O D | A N D | A L D E R | M A K E | A | L U X U R I O U S | F R I N G E | A N D | S E T T I N G | A N D | T H E | F O R E S T S | O F | D O U G L A S | S P R U C E | A L O N G | T H E | B A N K S | A R E | T H E | F I N E S T | I | H A V E | E V E R | S E E N | I N | T H E | S I E R R A | +P E R H A P S | T H E | P R O F E S S I O N | O F | D O I N G | G O O D | M A Y | B E | F U L L | B U T | E V E R Y | B O D Y | S H O U L D | B E | K I N D | A T | L E A S T | T O | H I M S E L F | +T H E I R | L O N G | M A S S I V E | E A R S | G I V E | T H E M | A | V E R Y | S T R I K I N G | A P P E A R A N C E | +E V E R Y | C R Y S T A L | D A N C E S | R E S P O N S I V E | T O | T H E | T O U C H E S | O F | T H E | S U N | A N D | C U R R E N T S | O F | S A P | I N | T H E | G R O W I N G | C E L L S | O F | A L L | T H E | V E G E T A T I O N | A R E | E V E R | I N | A | V I T A L | W H I R L | A N D | R U S H | A N D | T H O U G H | M A N Y | F E E T | A N D | W I N G S | A R E | F O L D E D | H O W | M A N Y | A R E | A S T I R | +T H E | V I V I D | G R E E N | O F | T H E | B O U L D E R S | B E N E A T H | T H E | W A T E R | I S | V E R Y | S T R I K I N G | A N D | C O L O R S | T H E | E N T I R E | S T R E A M | W I T H | T H E | E X C E P T I O N | O F | T H E | P O R T I O N S | B R O K E N | I N T O | F O A M | +T H E | G R E A T | W I L D S | O F | O U R | C O U N T R Y | O N C E | H E L D | T O | B E | B O U N D L E S S | A N D | I N E X H A U S T I B L E | A R E | B E I N G | R A P I D L Y | I N V A D E D | A N D | O V E R R U N | I N | E V E R Y | D I R E C T I O N | A N D | E V E R Y T H I N G | D E S T R U C T I B L E | I N | T H E M | I S | B E I N G | D E S T R O Y E D | +B U T | I T | I S | F A R | B E T T E R | T O | G O | A F O O T | +G O | Q U I E T L Y | A L O N E | N O | H A R M | W I L L | B E F A L L | Y O U | +A S | T H E | L I F E | B L O O D | O F | T H E | L A N D S C A P E S | T H E | B E S T | O F | T H E | W I L D E R N E S S | C O M E S | T O | T H E I R | B A N K S | A N D | N O T | O N E | D U L L | P A S S A G E | I S | F O U N D | I N | A L L | T H E I R | E V E N T F U L | H I S T O R I E S | +T H U S | T H E | S H A S T A | R I V E R | I S S U E S | F R O M | A | L A R G E | L A K E | L I K E | S P R I N G | I N | S H A S T A | V A L L E Y | A N D | A B O U T | T W O | T H I R D S | O F | T H E | V O L U M E | O F | T H E | M C | C L O U D | G U S H E S | F O R T H | I N | A | G R A N D | S P R I N G | O N | T H E | E A S T | S I D E | O F | T H E | M O U N T A I N | A | F E W | M I L E S | B A C K | F R O M | I T S | I M M E D I A T E | B A S E | +W H I L E | T R A V E L I N G | W I T H | A | C O M P A N Y | O F | H U N T E R S | I | S A W | A B O U T | F I F T Y | I N | O N E | F L O C K | +S H O U L D | T H E | V O L U M E | O F | T H E | S T R E A M | W H E R E | Y O U | S T R I K E | I T | S E E M | S M A L L | T H E N | Y O U | W I L L | K N O W | T H A T | Y O U | A R E | A B O V E | T H E | S P R I N G | I F | L A R G E | N E A R L Y | E Q U A L | T O | I T S | V O L U M E | A T | I T S | C O N F L U E N C E | W I T H | T H E | P I T T | R I V E R | T H E N | Y O U | A R E | B E L O W | I T | A N D | I N | E I T H E R | C A S E | H A V E | O N L Y | T O | F O L L O W | T H E | R I V E R | U P | O R | D O W N | U N T I L | Y O U | C O M E | T O | I T | +B U T | N E I T H E R | T H E | G L O R I F I E D | W O O D S | O N | T H E | O N E | H A N D | N O R | T H E | L A K E | O N | T H E | O T H E R | C O U L D | A T | F I R S T | H O L D | T H E | E Y E | +T H E Y | A R E | B R O A D | R U G G E D | C R E V A S S E D | C L O U D L I K E | M A S S E S | O F | D O W N | G R I N D I N G | I C E | P O U R I N G | F O R T H | S T R E A M S | O F | M U D D Y | W A T E R | A S | M E A S U R E S | O F | T H E | W O R K | T H E Y | A R E | D O I N G | I N | S C U L P T U R I N G | T H E | R O C K S | B E N E A T H | T H E M | V E R Y | U N L I K E | T H E | L O N G | M A J E S T I C | G L A C I E R S | O F | A L A S K A | T H A T | R I V E R L I K E | G O | W I N D I N G | D O W N | T H E | V A L L E Y S | T H R O U G H | T H E | F O R E S T S | T O | T H E | S E A | +M O U N T | B R E M E R | I S | T H E | M O S T | N O T E D | S T R O N G H O L D | O F | T H E | S H E E P | I N | T H E | W H O L E | S H A S T A | R E G I O N | +T R A C I N G | T H I S | W I L D | C H A N G I N G | C H A N N E L | G O R G E | G U L L Y | O R | C A N Y O N | T H E | S E C T I O N S | W I L L | S H O W | M O U N T | S H A S T A | A S | A | H U G E | P A L I M P S E S T | C O N T A I N I N G | T H E | R E C O R D S | L A Y E R | U P O N | L A Y E R | O F | S T R A N G E L Y | C O N T R A S T E D | E V E N T S | I N | I T S | F I E R Y | I C Y | H I S T O R Y | +S H A S T A | R A M B L E S | A N D | M O D O C | M E M O R I E S | +O N E | B L A N K E T | W I L L | B E | E N O U G H | T O | C A R R Y | O R | Y O U | M A Y | F O R E G O | T H E | P L E A S U R E | A N D | B U R D E N | A L T O G E T H E R | A S | W O O D | F O R | F I R E S | I S | E V E R Y W H E R E | A B U N D A N T | +U N D E R | C E R T A I N | C O N D I T I O N S | Y O U | M A Y | H E A R | T H E | R O A R | O F | T H E | W A T E R | R U S H I N G | F R O M | T H E | R O C K | A T | A | D I S T A N C E | O F | H A L F | A | M I L E | O R | E V E N | M O R E | O R | Y O U | M A Y | N O T | H E A R | I T | U N T I L | W I T H I N | A | F E W | R O D S | +T H E | B I G | M E A D O W S | L I E | N E A R | T H E | F O O T | O F | L A S S E N ' S | B U T T E | A | B E A U T I F U L | S P A C I O U S | B A S I N | S E T | I N | T H E | H E A R T | O F | T H E | R I C H L Y | F O R E S T E D | M O U N T A I N S | S C A R C E L Y | S U R P A S S E D | I N | T H E | G R A N D E U R | O F | I T S | S U R R O U N D I N G S | B Y | T A H O E | +T H E N | D A R K N E S S | L I K E | D E A T H | +A T | S U C H | T I M E | I T S | H E I G H T | S E E M S | M U C H | L E S S | A S | I F | C R O U C H I N G | A N D | W E A R Y | I T | W E R E | T A K I N G | R E S T | +T H E | A S C E N T | O F | L A S S E N ' S | B U T T E | I S | A N | E A S Y | W A L K | A N D | T H E | V I E W S | F R O M | T H E | S U M M I T | A R E | E X T R E M E L Y | T E L L I N G | +S L I G H T | R A I N S T O R M S | A R E | L I K E L Y | T O | B E | E N C O U N T E R E D | I N | A | T R I P | R O U N D | T H E | M O U N T A I N | B U T | O N E | M A Y | E A S I L Y | F I N D | S H E L T E R | B E N E A T H | W E L L | T H A T C H E D | T R E E S | T H A T | S H E D | T H E | R A I N | L I K E | A | R O O F | +O N L Y | A | L I T T L E | F O O D | W I L L | B E | R E Q U I R E D | +A R C T I C | B E A U T Y | A N D | D E S O L A T I O N | W I T H | T H E I R | B L E S S I N G S | A N D | D A N G E R S | A L L | M A Y | B E | F O U N D | H E R E | T O | T E S T | T H E | E N D U R A N C E | A N D | S K I L L | O F | A D V E N T U R O U S | C L I M B E R S | B U T | F A R | B E T T E R | T H A N | C L I M B I N G | T H E | M O U N T A I N | I S | G O I N G | A R O U N D | I T S | W A R M | F E R T I L E | B A S E | E N J O Y I N G | I T S | B O U N T I E S | L I K E | A | B E E | C I R C L I N G | A R O U N D | A | B A N K | O F | F L O W E R S | +T H E | L O N G | G R A Y | S L O P E S | L E A D I N G | U P | T O | T H E | G L A C I E R | S E E M | R E M A R K A B L Y | S M O O T H | A N D | U N B R O K E N | +T W O | O R | T H R E E | M I L E S | F A R T H E R | O N | I S | T H E | M A I N | S T R O N G H O L D | O F | T H E | M O D O C S | H E L D | B Y | T H E M | S O | L O N G | A N D | D E F I A N T L Y | A G A I N S T | A L L | T H E | S O L D I E R S | T H A T | C O U L D | B E | B R O U G H T | T O | T H E | A T T A C K | +T H U S | O N E | S A U N T E R S | O N | A N D | O N | I N | T H E | G L O R I O U S | R A D I A N C E | I N | U T T E R | P E A C E | A N D | F O R G E T F U L N E S S | O F | T I M E | +H E R E | Y O U | S T R I K E | T H E | O L D | E M I G R A N T | R O A D | W H I C H | L E A D S | O V E R | T H E | L O W | D I V I D E | T O | T H E | E A S T E R N | S L O P E S | O F | T H E | M O U N T A I N | +T H E | M U L E | D E E R | A R E | N E A R L Y | A S | H E A V Y | +E V E R Y | L A N D S C A P E | L O W | A N D | H I G H | S E E M S | D O O M E D | T O | B E | T R A M P L E D | A N D | H A R R I E D | +M O S T | O F | T H E | D R A I N A G E | O F | T H E | G L A C I E R | V A N I S H E S | A T | O N C E | I N | T H E | P O R O U S | R O C K S | T O | R E A P P E A R | I N | S P R I N G S | I N | T H E | D I S T A N T | V A L L E Y | A N D | I T | I S | O N L Y | I N | T I M E | O F | F L O O D | T H A T | T H E | C H A N N E L | C A R R I E S | M U C H | W A T E R | T H E N | T H E R E | A R E | S E V E R A L | F I N E | F A L L S | I N | T H E | G O R G E | S I X | H U N D R E D | F E E T | O R | M O R E | I N | H E I G H T | +L A R G E | F L O C K S | D W E L L | H E R E | F R O M | Y E A R | T O | Y E A R | W I N T E R | A N D | S U M M E R | D E S C E N D I N G | O C C A S I O N A L L Y | I N T O | T H E | A D J A C E N T | S A G E | P L A I N S | A N D | L A V A | B E D S | T O | F E E D | B U T | E V E R | R E A D Y | T O | T A K E | R E F U G E | I N | T H E | J A G G E D | C R A G S | O F | T H E I R | M O U N T A I N | A T | E V E R Y | A L A R M | +R E G A I N I N G | T H E | L O W | G R O U N D | A T | T H E | B A S E | O F | T H E | M O U N T A I N | A N D | H O L D I N G | O N | I N | Y O U R | G R A N D | O R B I T | Y O U | P A S S | T H R O U G H | A | B E L T | O F | J U N I P E R | W O O D S | C A L L E D | T H E | C E D A R S | T O | S H E E P | R O C K | A T | T H E | F O O T | O F | T H E | S H A S T A | P A S S | +I T | I S | L I N E D | W I T H | E M E R A L D | A L G A E | A N D | M O S S E S | A N D | S H A D E D | W I T H | A L D E R | W I L L O W | A N D | T H O R N | B U S H E S | W H I C H | G I V E | I T | A | F I N E | S E T T I N G | +T R A C I N G | R I V E R S | T O | T H E I R | F O U N T A I N S | M A K E S | T H E | M O S T | C H A R M I N G | O F | T R A V E L S | +A | T H O U S A N D | T H O U S A N D | V O I C E S | A R E | H E A R D | B U T | S O | F I N E L Y | B L E N D E D | T H E Y | S E E M | A | P A R T | O F | T H E | N I G H T | I T S E L F | A N D | M A K E | A | D E E P E R | S I L E N C E | +T H E | L O F T Y | I C Y | S H A S T A | T O W E R I N G | H I G H | A B O V E | A L L | S E E M S | B U T | A N | H O U R ' S | W A L K | F R O M | Y O U | T H O U G H | T H E | D I S T A N C E | I N | A N | A I R | L I N E | I S | A B O U T | S I X T Y | M I L E S | +T H E N | T H E | S H I N I N G | O F | T H E | W E T | L E A V E S | I S | D E L I G H T F U L | A N D | T H E | S T E A M Y | F R A G R A N C E | A N D | T H E | B U R S T | O F | B I R D | S O N G | F R O M | A | M U L T I T U D E | O F | T H R U S H E S | A N D | F I N C H E S | A N D | W A R B L E R S | T H A T | H A V E | N E S T S | I N | T H E | C H A P A R R A L | +T H E N | F E L L | T H E | G L O A M I N G | M A K I N G | E V E R Y T H I N G | S T I L L | M O R E | F O R B I D D I N G | A N D | M Y S T E R I O U S | +T R A C I N G | T H E | M C | C L O U D | T O | I T S | H I G H E S T | S P R I N G S | A N D | O V E R | T H E | D I V I D E | T O | T H E | F O U N T A I N S | O F | F A L L | R I V E R | N E A R | F O R T | C R O O K | T H E N C E | D O W N | T H A T | R I V E R | T O | I T S | C O N F L U E N C E | W I T H | T H E | P I T T | O N | F R O M | T H E R E | T O | T H E | V O L C A N I C | R E G I O N | A B O U T | L A S S E N ' S | B U T T E | T H R O U G H | T H E | B I G | M E A D O W S | A M O N G | T H E | S O U R C E S | O F | T H E | F E A T H E R | R I V E R | A N D | D O W N | T H R O U G H | F O R E S T S | O F | S U G A R | P I N E | T O | T H E | F E R T I L E | P L A I N S | O F | C H I C O | T H I S | I S | A | G L O R I O U S | S A U N T E R | A N D | I M P O S E S | N O | H A R D S H I P | +I T | I S | T H R E E | O R | F O U R | M I L E S | L O N G | A N D | T E R M I N A T E S | A T | A N | E L E V A T I O N | O F | A B O U T | N I N E | T H O U S A N D | F I V E | H U N D R E D | F E E T | A B O V E | S E A | L E V E L | I N | M O R A I N E | S P R I N K L E D | I C E | C L I F F S | S I X T Y | F E E T | H I G H | +I N | S E T T I N G | O U T | F R O M | S T R A W B E R R Y | V A L L E Y | B Y | B E A R I N G | O F F | T O | T H E | N O R T H W E S T W A R D | A | F E W | M I L E S | Y O U | M A Y | S E E | +T H E | D U C K S | L E S S | W A R Y | K E P T | T H E I R | P L A C E S | M E R E L Y | S W I M M I N G | I N | A N D | O U T | T H R O U G H | O P E N I N G S | I N | T H E | R U S H E S | R I P P L I N G | T H E | G L A S S Y | W A T E R | A N D | R A I S I N G | S P A N G L E S | I N | T H E I R | W A K E | +B U T | D O N | Q U I X O T E | W H O M | H I S | T H O U G H T S | F A R | M O R E | T H A N | H U N G E R | K E P T | A W A K E | C O U L D | N O T | C L O S E | A N | E Y E | A N D | R O A M E D | I N | F A N C Y | T O | A N D | F R O | T H R O U G H | A L L | S O R T S | O F | P L A C E S | +G I V E | M E | M Y | H O R S E | A N D | A R M S | A N D | W A I T | F O R | M E | H E R E | I | W I L L | G O | I N | Q U E S T | O F | T H I S | K N I G H T | A N D | D E A D | O R | A L I V E | I | W I L L | M A K E | H I M | K E E P | H I S | W O R D | P L I G H T E D | T O | S O | G R E A T | B E A U T Y | +D O N | Q U I X O T E | W A S | O N | F O O T | W I T H | H I S | H O R S E | U N B R I D L E D | A N D | H I S | L A N C E | L E A N I N G | A G A I N S T | A | T R E E | A N D | I N | S H O R T | C O M P L E T E L Y | D E F E N C E L E S S | H E | T H O U G H T | I T | B E S T | T H E R E F O R E | T O | F O L D | H I S | A R M S | A N D | B O W | H I S | H E A D | A N D | R E S E R V E | H I M S E L F | F O R | A | M O R E | F A V O U R A B L E | O C C A S I O N | A N D | O P P O R T U N I T Y | +S E E I N G | T H I S | S A N C H O | G O T | U P | A N D | G R A P P L I N G | W I T H | H I S | M A S T E R | H E | G R I P P E D | H I M | W I T H | A L L | H I S | M I G H T | I N | H I S | A R M S | G I V I N G | H I M | A | T R I P | W I T H | T H E | H E E L | S T R E T C H E D | H I M | O N | T H E | G R O U N D | O N | H I S | B A C K | A N D | P R E S S I N G | H I S | R I G H T | K N E E | O N | H I S | C H E S T | H E L D | H I S | H A N D S | I N | H I S | O W N | S O | T H A T | H E | C O U L D | N E I T H E R | M O V E | N O R | B R E A T H E | +N O B O D Y | N E E D | H A V E | A N Y | D O U B T | A B O U T | T H A T | S A I D | S A N C H O | F O R | M Y | M A S T E R | H A S | A | V E R Y | H A P P Y | K N A C K | O F | M A T C H M A K I N G | I T ' S | N O T | M A N Y | D A Y S | S I N C E | H E | F O R C E D | A N O T H E R | M A N | T O | M A R R Y | W H O | I N | T H E | S A M E | W A Y | B A C K E D | O U T | O F | H I S | P R O M I S E | T O | A N O T H E R | M A I D E N | A N D | I F | I T | H A D | N O T | B E E N | F O R | H I S | P E R S E C U T O R S | T H E | E N C H A N T E R S | C H A N G I N G | T H E | M A N ' S | P R O P E R | S H A P E | I N T O | A | L A C Q U E Y ' S | T H E | S A I D | M A I D E N | W O U L D | N O T | B E | O N E | T H I S | M I N U T E | +W H A T | A R E | Y O U | T A L K I N G | A B O U T | M A N | +T H E | W O U N D E D | G E N T L E M A N | O P E N E D | H I S | A L L | B U T | C L O S E D | E Y E S | A N D | R E C O G N I S I N G | C L A U D I A | S A I D | I | S E E | C L E A R L Y | F A I R | A N D | M I S T A K E N | L A D Y | T H A T | I T | I S | T H O U | T H A T | H A S T | S L A I N | M E | A | P U N I S H M E N T | N O T | M E R I T E D | O R | D E S E R V E D | B Y | M Y | F E E L I N G S | T O W A R D S | T H E E | F O R | N E V E R | D I D | I | M E A N | T O | N O R | C O U L D | I | W R O N G | T H E E | I N | T H O U G H T | O R | D E E D | +O N | P E R C E I V I N G | T H I S | C L A U D I A | W H E N | S H E | H A D | C O N V I N C E D | H E R S E L F | T H A T | H E R | B E L O V E D | H U S B A N D | W A S | N O | M O R E | R E N T | T H E | A I R | W I T H | H E R | S I G H S | A N D | M A D E | T H E | H E A V E N S | R I N G | W I T H | H E R | L A M E N T A T I O N S | S H E | T O R E | H E R | H A I R | A N D | S C A T T E R E D | I T | T O | T H E | W I N D S | S H E | B E A T | H E R | F A C E | W I T H | H E R | H A N D S | A N D | S H O W E D | A L L | T H E | S I G N S | O F | G R I E F | A N D | S O R R O W | T H A T | C O U L D | B E | C O N C E I V E D | T O | C O M E | F R O M | A N | A F F L I C T E D | H E A R T | +D O S T | T H O U | R E V O L T | A G A I N S T | T H Y | M A S T E R | A N D | N A T U R A L | L O R D | +D O N | Q U I X O T E | D I D | S O | A N D | A S K E D | H I M | W H A T | H A D | H A P P E N E D | T O | H I M | A N D | W H A T | H E | W A S | A F R A I D | O F | +O N E | O F | T H E | S Q U I R E S | O B S E R V E D | I N | H I S | M I X T U R E | O F | G A S C O N | A N D | C A T A L A N | T H I S | C A P T A I N | O F | O U R S | W O U L D | M A K E | A | B E T T E R | F R I A R | T H A N | H I G H W A Y M A N | I F | H E | W A N T S | T O | B E | S O | G E N E R O U S | A N O T H E R | T I M E | L E T | I T | B E | W I T H | H I S | O W N | P R O P E R T Y | A N D | N O T | O U R S | +S A N C H O | R E P L I E D | T H A T | A L L | T H E | T R E E S | W E R E | F U L L | O F | M E N ' S | F E E T | A N D | L E G S | +W H A T | L E D | M E | I N T O | I T | W A S | A | C E R T A I N | T H I R S T | F O R | V E N G E A N C E | W H I C H | I S | S T R O N G | E N O U G H | T O | D I S T U R B | T H E | Q U I E T E S T | H E A R T S | +D O S T | T H O U | R I S E | A G A I N S T | H I M | W H O | G I V E S | T H E E | H I S | B R E A D | +T H E | C A P T A I N S | S H O W E D | P L A I N L Y | T H E | C O N C E R N | T H E Y | F E L T | T H E | R E G E N T ' S | L A D Y | W A S | D O W N C A S T | A N D | T H E | P I L G R I M S | D I D | N O T | A T | A L L | E N J O Y | S E E I N G | T H E I R | P R O P E R T Y | C O N F I S C A T E D | +O | H U S B A N D | W H O S E | U N H A P P Y | F A T E | I N | B E I N G | M I N E | H A T H | B O R N E | T H E E | F R O M | T H E | M A R R I A G E | B E D | T O | T H E | G R A V E | +M A S T E R | A N D | M A N | D I S M O U N T E D | F R O M | T H E I R | B E A S T S | A N D | A S | S O O N | A S | T H E Y | H A D | S E T T L E D | T H E M S E L V E S | A T | T H E | F O O T | O F | T H E | T R E E S | S A N C H O | W H O | H A D | H A D | A | G O O D | N O O N T I D E | M E A L | T H A T | D A Y | L E T | H I M S E L F | W I T H O U T | M O R E | A D O | P A S S | T H E | G A T E S | O F | S L E E P | +C R U E L | R E C K L E S S | W O M A N | S H E | C R I E D | H O W | E A S I L Y | W E R T | T H O U | M O V E D | T O | C A R R Y | O U T | A | T H O U G H T | S O | W I C K E D | +C L A U D I A | W O U L D | N O T | O N | A N Y | A C C O U N T | A L L O W | H I M | T O | A C C O M P A N Y | H E R | A N D | T H A N K I N G | H I M | F O R | H I S | O F F E R S | A S | W E L L | A S | S H E | C O U L D | T O O K | L E A V E | O F | H I M | I N | T E A R S | +T H E | S E R V A N T S | W E P T | C L A U D I A | S W O O N E D | A W A Y | A G A I N | A N D | A G A I N | A N D | T H E | W H O L E | P L A C E | S E E M E D | A | F I E L D | O F | S O R R O W | A N D | A N | A B O D E | O F | M I S F O R T U N E | +A N D | I F | Y O U | H A V E | A N Y | D E S I R E | T O | S H O R T E N | T H E | J O U R N E Y | A N D | P U T | Y O U R S E L F | E A S I L Y | I N | T H E | W A Y | O F | S A L V A T I O N | C O M E | W I T H | M E | A N D | I | W I L L | S H O W | Y O U | H O W | T O | B E C O M E | A | K N I G H T | E R R A N T | A | C A L L I N G | W H E R E I N | S O | M A N Y | H A R D S H I P S | A N D | M I S H A P S | A R E | E N C O U N T E R E D | T H A T | I F | T H E Y | B E | T A K E N | A S | P E N A N C E S | T H E Y | W I L L | L O D G E | Y O U | I N | H E A V E N | I N | A | T R I C E | +H E | S A W | T H A T | H I S | S Q U I R E S | F O R | S O | T H E Y | C A L L | T H O S E | W H O | F O L L O W | T H A T | T R A D E | W E R E | A B O U T | T O | R I F L E | S A N C H O | P A N Z A | B U T | H E | O R D E R E D | T H E M | T O | D E S I S T | A N D | W A S | A T | O N C E | O B E Y E D | S O | T H E | G I R D L E | E S C A P E D | +T H E | R E G E N T ' S | L A D Y | O R D E R E D | O N E | O F | H E R | S E R V A N T S | T O | G I V E | T H E | E I G H T Y | C R O W N S | T H A T | H A D | B E E N | A S S E S S E D | A S | H E R | S H A R E | A T | O N C E | F O R | T H E | C A P T A I N S | H A D | A L R E A D Y | P A I D | D O W N | T H E I R | S I X T Y | +S A N C H O | S A I D | T H E Y | H A D | B U T | T H A T | T H R E E | K E R C H I E F S | T H A T | W E R E | W O R T H | T H R E E | C I T I E S | W E R E | M I S S I N G | +H O W | N O W | T R A I T O R | E X C L A I M E D | D O N | Q U I X O T E | +H E | T R E M B L E D | W I T H | F E A R | A N D | M A D E | F O R | A N O T H E R | T R E E | W H E R E | T H E | V E R Y | S A M E | T H I N G | H A P P E N E D | T O | H I M | A N D | H E | F E L L | A | S H O U T I N G | C A L L I N G | U P O N | D O N | Q U I X O T E | T O | C O M E | A N D | P R O T E C T | H I M | +T H E Y | W E R E | A L L | T A K E N | A B A C K | A N D | N O T | O N E | O F | T H E M | D A R E D | T O | U T T E R | A | W O R D | S U C H | D E F E R E N C E | D I D | T H E Y | P A Y | H I M | +T H E Y | M A D E | H A S T E | T O | O V E R T A K E | T H E M | W H I C H | A S | T H E | P A R T Y | M O V E D | S L O W L Y | T H E Y | W E R E | A B L E | T O | D O | W I T H | E A S E | +D U L C I N E A | I S | P E R I S H I N G | T H O U | A R T | L I V I N G | O N | R E G A R D L E S S | I | A M | D Y I N G | O F | H O P E | D E F E R R E D | T H E R E F O R E | U N T R U S S | T H Y S E L F | W I T H | A | G O O D | W I L L | F O R | M I N E | I T | I S | H E R E | I N | T H I S | R E T I R E D | S P O T | T O | G I V E | T H E E | A T | L E A S T | T W O | T H O U S A N D | L A S H E S | +A T | T H I S | I N S T A N T | O N E | O R | T W O | O F | T H O S E | S Q U I R E S | W H O | W E R E | P O S T E D | A S | S E N T I N E L S | O N | T H E | R O A D S | T O | W A T C H | W H O | C A M E | A L O N G | T H E M | A N D | R E P O R T | W H A T | P A S S E D | T O | T H E I R | C H I E F | C A M E | U P | A N D | S A I D | S E N O R | T H E R E | I S | A | G R E A T | T R O O P | O F | P E O P L E | N O T | F A R | O F F | C O M I N G | A L O N G | T H E | R O A D | T O | B A R C E L O N A | +A N D | N O W | T H E | S Q U I R E S | D E S P A T C H E D | T O | M A K E | T H E | P R I Z E | C A M E | U P | B R I N G I N G | W I T H | T H E M | T W O | G E N T L E M E N | O N | H O R S E B A C K | T W O | P I L G R I M S | O N | F O O T | A N D | A | C O A C H | F U L L | O F | W O M E N | W I T H | S O M E | S I X | S E R V A N T S | O N | F O O T | A N D | O N | H O R S E B A C K | I N | A T T E N D A N C E | O N | T H E M | A N D | A | C O U P L E | O F | M U L E T E E R S | W H O M | T H E | G E N T L E M E N | H A D | W I T H | T H E M | +A T | O N E | M O M E N T | I T | S E E M E D | T O | H I M | T H A T | H E | W A S | I N | T H E | C A V E | O F | M O N T E S I N O S | A N D | S A W | D U L C I N E A | T R A N S F O R M E D | I N T O | A | C O U N T R Y | W E N C H | S K I P P I N G | A N D | M O U N T I N G | U P O N | H E R | S H E | A S S | A G A I N | T H A T | T H E | W O R D S | O F | T H E | S A G E | M E R L I N | W E R E | S O U N D I N G | I N | H I S | E A R S | S E T T I N G | F O R T H | T H E | C O N D I T I O N S | T O | B E | O B S E R V E D | A N D | T H E | E X E R T I O N S | T O | B E | M A D E | F O R | T H E | D I S E N C H A N T M E N T | O F | D U L C I N E A | +W H O | I S | T O U C H I N G | M E | A N D | U N T R U S S I N G | M E | +H E | W A S | M O U N T E D | U P O N | A | P O W E R F U L | H O R S E | A N D | H A D | O N | A | C O A T | O F | M A I L | W I T H | F O U R | O F | T H E | P I S T O L S | T H E Y | C A L L | P E T R O N E L S | I N | T H A T | C O U N T R Y | A T | H I S | W A I S T | +S A N C H O | R O S E | A N D | R E M O V E D | S O M E | D I S T A N C E | F R O M | T H E | S P O T | B U T | A S | H E | W A S | A B O U T | T O | P L A C E | H I M S E L F | L E A N I N G | A G A I N S T | A N O T H E R | T R E E | H E | F E L T | S O M E T H I N G | T O U C H | H I S | H E A D | A N D | P U T T I N G | U P | H I S | H A N D S | E N C O U N T E R E D | S O M E B O D Y ' S | T W O | F E E T | W I T H | S H O E S | A N D | S T O C K I N G S | O N | T H E M | +D O N | Q U I X O T E | G A V E | H I S | P R O M I S E | A N D | S W O R E | B Y | T H E | L I F E | O F | H I S | T H O U G H T S | N O T | T O | T O U C H | S O | M U C H | A S | A | H A I R | O F | H I S | G A R M E N T S | A N D | T O | L E A V E | H I M | E N T I R E L Y | F R E E | A N D | T O | H I S | O W N | D I S C R E T I O N | T O | W H I P | H I M S E L F | W H E N E V E R | H E | P L E A S E D | +I T | I S | N O T | T R U E | T H E N | S A I D | C L A U D I A | T H A T | T H O U | W E R T | G O I N G | T H I S | M O R N I N G | T O | M A R R Y | L E O N O R A | T H E | D A U G H T E R | O F | T H E | R I C H | B A L V A S T R O | +H E | S A W | M E | H E | P A I D | C O U R T | T O | M E | I | L I S T E N E D | T O | H I M | A N D | U N K N O W N | T O | M Y | F A T H E R | I | L O V E D | H I M | F O R | T H E R E | I S | N O | W O M A N | H O W E V E R | S E C L U D E D | S H E | M A Y | L I V E | O R | C L O S E | S H E | M A Y | B E | K E P T | W H O | W I L L | N O T | H A V E | O P P O R T U N I T I E S | A N D | T O | S P A R E | F O R | F O L L O W I N G | H E R | H E A D L O N G | I M P U L S E S | +C L A U D I A | T O L D | H I M | S H E | M E A N T | T O | G O | T O | A | M O N A S T E R Y | O F | W H I C H | A N | A U N T | O F | H E R S | W A S | A B B E S S | W H E R E | S H E | I N T E N D E D | T O | P A S S | H E R | L I F E | W I T H | A | B E T T E R | A N D | E V E R L A S T I N G | S P O U S E | +S A I D | O N E | O F | T H E | B Y S T A N D E R S | I | H A V E | G O T | T H E M | A N D | T H E Y | A R E | N O T | W O R T H | T H R E E | R E A L S | +I N | A | W O R D | H E | P L E D G E D | H I M S E L F | T O | B E | M I N E | A N D | I | P R O M I S E D | T O | B E | H I S | W I T H O U T | C A R R Y I N G | M A T T E R S | A N Y | F U R T H E R | +O N E | O F | H I S | W A I T E R S | P H I L | T Y S O N | W A S | O N E | O F | T H E | E A R L I E R | O N E S | T O | G O | B A C K | I N T O | T H E | B U R N E D | D I S T R I C T | T O | B E G I N | B U S I N E S S | A N D | H E | O P E N E D | A | R E S T A U R A N T | C A L L E D | T H E | D E L | M O N T E | I N | P O W E L L | S T R E E T | N E A R | M A R K E T | B U T | I T | W A S | T O O | E A R L Y | F O R | S U C C E S S | A N D | C L O S E D | A F T E R | A | S H O R T | C A R E E R | +H E R E | T H E R E | I S | A L W A Y S | G O O D | M U S I C | A N D | F O O D | W E L L | C O O K E D | A N D | W E L L | S E R V E D | A N D | A L W A Y S | A | L I V E L Y | C R O W D | D U R I N G | T H E | L U N C H E O N | D I N N E R | A N D | A F T E R | T H E A T R E | H O U R S | T H E | R O O M | I S | N O T | L A R G E | B U T | I T S | D I M E N S I O N S | A R E | G R E A T L Y | M A G N I F I E D | O W I N G | T O | T H E | C O V E R I N G | O F | M I R R O R S | W H I C H | L I N E | T H E | W A L L S | +O F | C O U R S E | T H E S E | A R E | N O T | T H E | E N T I R E | M E N U S | B U T | O F | A L L | T H E | W E L L | P R E P A R E D | D I S H E S | T H E S E | A R E | T H E I R | B E S T | +T O | T H E | P I C K L E | A D D | T W O | L A R G E | O N I O N S | C U T | I N | Q U A R T E R S | T W O | F R E S H | C A R R O T S | A N D | A B O U T | O N E | O U N C E | O F | M I X E D | W H O L E | A L L S P I C E | B L A C K | P E P P E R S | C L O V E S | A N D | B A Y | L E A V E S | +S T R A I N | T H E | S A U C E | T H R O U G H | A | F I N E | C O L L A N D E R | A N D | A D D | A | F E W | R A I S I N S | A | P I E C E | O F | H O N E Y | C A K E | O R | G I N G E R | S N A P S | A N D | T H E | M E A T | O F | O N E | F R E S H | T O M A T O | +T H E | P O O D L E | D O G | H A S | A | H O T E L | A T T A C H M E N T | W H E R E | O N E | M A Y | G E T | R O O M S | O R | F U L L | A P A R T M E N T S | +P U T | I N T O | T H E | O V E N | A G A I N | A N D | C O O K | F O R | H A L F | A N | H O U R | B A S T I N G | F R E Q U E N T L Y | W I T H | T H E | O R I G I N A L | B R I N E | +W E | F I N A L L Y | G O T | H I M | T O | S E L E C T | T H E | O N E | P R I Z E D | A B O V E | A L L | O T H E R S | A N D | T H I S | I S | W H A T | C H E F | S C H E I L E R | G A V E | U S | +T H E | S P E C I A L T Y | O F | T H E | H O F | B R A U | I S | A B A L O N E ' S | A N D | T H E Y | H A V E | A S | A | F E A T U R E | T H I S | S H E L L | F I S H | C O O K E D | I N | S E V E R A L | W A Y S | +T H E | R E S T A U R A N T S | O F | T H E | P R E S E N T | D A Y | T H A T | A P P R O A C H | N E A R E S T | T H E | O L D | B O H E M I A N | R E S T A U R A N T S | O F | P R E | F I R E | D A Y S | O F | T H E | F R E N C H | C L A S S | A R E | J A C K ' S | I N | S A C R A M E N T O | S T R E E T | B E T W E E N | M O N T G O M E R Y | A N D | K E A R N Y | F E L I X | I N | M O N T G O M E R Y | S T R E E T | B E T W E E N | C L A Y | A N D | W A S H I N G T O N | A N D | T H E | P O O D L E | D O G | B E R G E Z | F R A N K S | I N | B U S H | S T R E E T | B E T W E E N | K E A R N Y | A N D | G R A N T | A V E N U E | +U N D E R | O R D I N A R Y | C I R C U M S T A N C E S | T H E | A B A L O N E | I S | T O U G H | A N D | U N P A L A T A B L E | B U T | A F T E R | T H E | D E F T | M A N I P U L A T I O N | O F | H E R B E R T | T H E Y | A R E | T E N D E R | A N D | M A K E | A | F I N E | D I S H | E I T H E R | F R I E D | A S | C H O W D E R | O R | A | L A | N E W B E R G | +W H E N | D O N E | T A K E | T H E | M E A T | O U T | O F | T H E | S A U C E | +I N | E I T H E R | O F | T H E S E | R E S T A U R A N T S | Y O U | W I L L | B E | S E R V E D | W I T H | T H E | B E S T | T H E | M A R K E T | A F F O R D S | C O O K E D | T H E | R I G H T | W A Y | +T H O M P S O N | O P E N E D | A | L A R G E | R E S T A U R A N T | I N | O ' F A R R E L L | S T R E E T | J U S T | A B O V E | F I L L M O R E | A N D | F O R | T W O | Y E A R S | O R | M O R E | D I D | A | T H R I V I N G | B U S I N E S S | H I S | P L A C E | B E I N G | N O T E D | F O R | I T S | G O O D | C O O K I N G | A N D | I T S | S P L E N D I D | S E R V I C E | +I F | Y O U | K N O W | H O W | T O | O R D E R | A N D | D O | N O T | C A R E | T O | C O U N T | T H E | C O S T | W H E N | Y O U | O R D E R | P R O B A B L Y | T H E | B E S T | D I N N E R | A T | T H E S E | R E S T A U R A N T S | C A N | B E | H A D | A T | E I T H E R | B L A N C O ' S | O R | T H E | P O O D L E | D O G | +P U T | I N | T H E | O V E N | A N D | B R O W N | T O | A | G O L D E N | C O L O R | +A T | T H E | C O R N E R | O F | M A R K E T | A N D | E D D Y | S T R E E T S | I S | T H E | O D E O N | D O W N | I N | A | B A S E M E N T | W I T H | D E C O R A T I O N S | O F | M O S T | G A R I S H | O R D E R | +I N | A D D I T I O N | T O | A B A L O N E ' S | T H E | H O F | B R A U | M A K E S | A | S P E C I A L T Y | O F | L I T T L E | O R E G O N | C R A W F I S H | +T H E Y | A L S O | H A V E | A S | T H E | C H E F | I N | C H A R G E | O F | T H E | A B A L O N E | D I S H E S | H E R B E R T | F O R M E R L Y | C H E F | F O R | O N E | O F | T H E | Y A C H T | C L U B S | O F | T H E | C O A S T | W H O | C L A I M S | T O | H A V E | T H E | O N L Y | P R O P E R | R E C I P E | F O R | M A K I N G | A B A L O N E ' S | T E N D E R | +H I S | P R I C E S | A R E | M O D E R A T E | A N D | H I S | C O O K I N G | A N D | V I A N D S | O F | T H E | B E S T | A N D | W I L L | S A T I S F Y | T H E | M O S T | C R I T I C A L | O F | T H E | G O U R M E T S | +T H E | F L Y | T R A P | A N D | C H A R L I E ' S | F A S H I O N | T H E | F I R S T | I N | S U T T E R | S T R E E T | N E A R | K E A R N Y | A N D | T H E | O T H E R | I N | M A R K E T | N E A R | S U T T E R | S E R V E | W E L L | C O O K E D | F O O D S | E S P E C I A L L Y | S O U P | S A L A D S | A N D | F I S H | +T H E | C U I S I N E | I S | O F | T H E | B E S T | A N D | T H E | C H E F S | R A N K | A T | T H E | T O P | O F | T H E I R | A R T | +S A N | F R A N C I S C O ' S | C A R E | F R E E | S P I R I T | W A S | F U L L Y | E X E M P L I F I E D | B E F O R E | T H E | A S H E S | O F | T H E | G R E A T | F I R E | O F | N I N E T E E N | O | S I X | W E R E | C O L D | +I T | I S | A N | I D E A | T H A T | I S | W O R T H | W H I L E | B U T | U N F O R T U N A T E L Y | T H E | P R O P R I E T O R S | D E P E N D | T O O | M U C H | O N | T H E | D E C O R A T I V E | F E A T U R E | A N D | T O O | L I T T L E | O N | T H E | F O O D | A N D | H O W | T H E Y | S E R V E | I T | +T H I S | G A R I S H | D I S P L A Y | O F | M I R R O R S | A N D | E L A B O R A T E | D E C O R A T I O N | O F | C E I L I N G | A N D | P I L L A R S | G I V E S | I T | T H E | A P P E A R A N C E | O F | T H E | A B O D E | O F | S A T U R N A L I A | B U T | D E C O R U M | I S | T H E | R U L E | A M O N G | T H E | P A T R O N S | +I T | H A S | C H A N G E D | F R O M | W H A T | I T | W A S | I N | T H E | O L D | D A Y S | B U T | I S | S T I L L | A N | E X C E L L E N T | P L A C E | T O | D I N E | +B U T | I F | Y O U | R E A L L Y | L O V E | G O O D | M U S I C | M U S I C | T H A T | H A S | M E L O D Y | A N D | R H Y T H M | A N D | S O O T H I N G | C A D E N C E S | G O | T O | T H E | H E I D E L B E R G | I N N | A N D | L I S T E N | T O | T H E | C O N C E R T | W H I C H | I S | A | F E A T U R E | O F | T H E | P L A C E | E V E R Y | E V E N I N G | +T H E N | T A K E | I T | O U T | O F | T H E | R O A S T I N G | P A N | A N D | P U T | I T | I N T O | A | C A S S E R O L E | A F T E R | S P R I N K L I N G | I T | W I T H | T W O | O U N C E S | O F | F L O U R | +T H E | H O F | B R A U | H O W E V E R | I S | L E S S | D I S T I N C T I V E L Y | G E R M A N | A S | T H E | G R E A T E R | N U M B E R | O F | I T S | P A T R O N S | A R E | A M E R I C A N S | +O N E | C A N | A L M O S T | I M A G I N E | H I M S E L F | I N | O N E | O F | T H E | F A M O U S | R A T H S K E L L E R S | O F | O L D | H E I D E L B E R G | N O T | A T | T H E | S C H L O S S | O F | C O U R S E | F O R | H E R E | Y O U | C A N N O T | L O O K | D O W N | O N | T H E | W E I S E R | A S | I T | F L O W S | B E N E A T H | T H E | W I N D O W S | O F | T H E | G R E A T | W I N E | S T U B E | O N | T H E | H I L L | +A T | T H E | T W O | M E N T I O N E D | O N E | P A Y S | F O R | T H E | S U R R O U N D I N G S | A S | W E L L | A S | F O R | T H E | F O O D | A N D | S O M E T I M E S | T H I S | I S | W O R T H | P A Y I N G | F O R | +B O T H | S E R V E | G O O D | S P A N I S H | D I N N E R S | A T | R E A S O N A B L E | P R I C E S | +S E A S O N | W I T H | S A L T | A N D | P E P P E R | A N D | A | L I T T L E | S U G A R | T O | T A S T E | +H E R E | A S | W E L L | A S | I N | A | N U M B E R | O F | O T H E R | P L A C E S | O N E | C A N | W E L L | A P P R E C I A T E | T H E | C O L L O Q U I A L | D E F I N I T I O N | O F | C A B A R E T | +J O H N | T A I T | I S | T H E | P R E S I D I N G | S P I R I T | H E R E | H E | H A V I N G | M A D E | R E P U T A T I O N | A S | C L U B | M A N A G E R | A N D | T H E N | A S | M A N A G E R | O F | T H E | C L I F F | H O U S E | +I N | T H I S | S A M E | D I S T R I C T | I S | T H E | M I N T | I N | C O M M E R C I A L | S T R E E T | B E T W E E N | M O N T G O M E R Y | A N D | K E A R N Y | S T R E E T S | +C L A R E T S | A R E | V A L U E D | F O R | T H E I R | F L A V O R | A N D | F O R | T H E I R | T O N I C | P R O P E R T I E S | +N E V E R | D R I N K | A N Y | H A R D | L I Q U O R S | S U C H | A S | W H I S K Y | B R A N D Y | G I N | O R | C O C K T A I L S | W I T H | O Y S T E R S | O R | C L A M S | A S | I T | I S | L I A B L E | T O | U P S E T | Y O U | F O R | T H E | R E S T | O F | T H E | E V E N I N G | +C H A B L I S | A | W H I T E | B U R G U N D Y | D R Y | A N D | O F | A G R E E A B L E | A R O M A | +H O C H H E I M E R | A | L I G H T | P L E A S I N G | A N D | W H O L E S O M E | W I N E | +D R Y | A N D | O F | M A G N I F I C E N T | B O U Q U E T | +G E R M A N | W I N E S | A R E | O F | L I G H T E R | C H A R A C T E R | A N D | A R E | G E N E R A L L Y | T E R M E D | R H E I N | W I N E S | +C L A R E T | E I G H T E E N | N I N E T Y | E I G H T | A N D | N I N E T E E N | O | F O U R | +R H E I N | A N D | M O S E L L E | E I G H T E E N | N I N E T Y | T H R E E | +A U S T R I A N | B U R G U N D Y | I S | O N E | O F | T H E | F I N E S T | W I N E S | P O S S E S S I N G | R I C H | F L A V O R | A N D | F I N E | P E R F U M E | O T H E R | B U R G U N D I E S | A R E | +S A U T E R N E | I S | A | W H I T E | B O R D E A U X | A | S T R O N G | L U S C I O U S | W I N E | T H E | B E S T | K N O W N | V A R I E T I E S | B E I N G | +L A C R I M A | C H R I S T I | A | S T I L L | W I N E | O F | E X C E L L E N T | F L A V O R | A N D | B O U Q U E T | +V I N T A G E | Y E A R S | H A V E | M U C H | T O | D O | W I T H | T H E | Q U A L I T Y | O F | W I N E S | +W I T H | S O U P | A N D | F I S H | S E R V E | W H I T E | W I N E S | S U C H | A S | R H E I N | W I N E | S A U T E R N E | O R | W H I T E | B U R G U N D Y | +W I T H | E N T R E E S | S E R V E | C L A R E T S | O R | O T H E R | R E D | W I N E S | S U C H | A S | S W I S S | B O R D E A U X | H U N G A R I A N | O R | I T A L I A N | W I N E S | +P O U R | M A Y O N N A I S E | O V E R | A L L | C H I L L | A N D | S E R V E | +P U T | T H E | P U L P | I N T O | A | B A S I N | W I T H | T W O | O U N C E S | O F | M E L T E D | B U T T E R | T W O | T A B L E S P O O N F U L S | O F | L E M O N | J U I C E | H A L F | A | P O U N D | O F | C H E S T N U T S | B O I L E D | A N D | G R A T E D | A N D | S E A S O N I N G | O F | S A L T | A N D | W H I T E | P E P P E R | T O | T A S T E | +A S P A R A G U S | S A L A D | C O O K | T H E | A S P A R A G U S | I N | S A L T E D | W A T E R | D R A I N | A N D | C H I L L | +T H I S | D R E S S I N G | S H O U L D | S T A N D | I N | T H E | I C E | B O X | F O U R | O R | F I V E | H O U R S | T O | B E C O M E | S E A S O N E D | +S T I R | T H E | S O A K E D | G E L A T I N | I N | W H I L E | T H E | C U C U M B E R | I S | H O T | +W H E N | T H I C K E N E D | S T R A I N | A N D | C O O L | +T O M A T O | B A S K E T S | T O M A T O | B A S K E T S | A R E | C H A R M I N G | A C C E S S O R I E S | F O R | H O L D I N G | V E G E T A B L E | S A L A D | C H I C K E N | S H R I M P S | C O L D | B E A N S | A S P A R A G U S | T I P S | S H R E D D E D | C E L E R Y | C U C U M B E R S | C U T | I N | C U B E S | A N D | M I N C E D | P E P P E R S | +G A R N I S H | D I S H | T H A T | D R E S S I N G | I S | M A D E | I N | W I T H | A | L I T T L E | G A R L I C | +B I R D S | N E S T | S A L A D | H A V E | R E A D Y | A S | M A N Y | C R I S P | L E A V E S | O F | L E T T U C E | A S | M A Y | B E | R E Q U I R E D | T O | M A K E | A | D A I N T Y | L I T T L E | N E S T | F O R | E A C H | P E R S O N | +C A U L I F L O W E R | M A Y O N N A I S E | T A K E | C O L D | B O I L E D | C A U L I F L O W E R | B R E A K | I N T O | B R A N C H E S | A D D I N G | S A L T | P E P P E R | A N D | V I N E G A R | T O | S E A S O N | +H A N D L E S | O F | W A T E R C R E S S | M A Y | B E | A T T A C H E D | T O | T H E S E | B A S K E T S | +C E L E R Y | A N D | N U T | S A L A D | C U T | E N O U G H | C E L E R Y | F I N E | T O | M E A S U R E | T W O | C U P S | A D D | O N E | C U P | O F | F I N E L Y | S H R E D D E D | O R | S H A V E D | C A B B A G E | A N D | O N E | A N D | O N E | H A L F | C U P S | O F | W A L N U T | M E A T S | B R O K E N | I N | S M A L L | P I E C E S | B U T | N O T | C H O P P E D | +S E T | I N T O | A | C O L D | P L A C E | T O | C H I L L | A N D | B E C O M E | F I R M | +S A L A D | T W O | C U P S | O F | A P P L E S | C U T | I N T O | S M A L L | P I E C E S | O N E | C U P | C E L E R Y | C U T | I N T O | S M A L L | P I E C E S | O N E | C U P | E N G L I S H | W A L N U T S | +S U R R O U N D | W I T H | A | G A R N I S H | O F | C O O K E D | A N D | D I C E D | C A R R O T S | T U R N I P S | G R E E N | P E A S | +S E R V E | O N | A | L E T T U C E | L E A F | W I T H | M A Y O N N A I S E | D R E S S I N G | M A D E | W I T H O U T | M U S T A R D | A N D | T H I N N E D | W I T H | C R E A M | +A D D | T W O | T A B L E S P O O N S | T H I C K | S O U R | C R E A M | T W O | T A B L E S P O O N S | S U G A R | A | S P R I N K L E | O F | M U S T A R D | A N D | H A L F | C U P | O F | V I N E G A R | +S E R V E | W I T H | F R E N C H | D R E S S I N G | H I D D E N | U N D E R | T H E | L E A V E S | O F | T H E | N E S T | +C A B B A G E | S A L A D | C H O P | O R | S H A V E | F I N E | H A L F | A | M E D I U M | S I Z E | H E A D | O F | C A B B A G E | T H A T | H A S | B E E N | L E F T | I N | C O L D | W A T E R | U N T I L | C R I S P | T H E N | D R A I N | +B E A T | U N T I L | T H O R O U G H L Y | M I X E D | P O U R | O V E R | T H E | C A B B A G E | A N D | T O S S | L I G H T L Y | U N T I L | U N I F O R M L Y | S E A S O N E D | +S T R A I N | A N D | B O T T L E | A N D | P U T | I N | I C E | B O X | S H A K E | B E F O R E | U S I N G | E A C H | T I M E | +H O W | A S K E D | T A D | +C H A P T E R | F O U R | T H E | F I R S T | N I G H T | I N | C A M P | +W H O | I S | T H E | W R A N G L E R | T H I S | M O R N I N G | A S K E D | T H E | F O R E M A N | G L A N C I N G | A B O U T | A T | H I S | M E N | +H I | T H E R E | H I S S E D | L U M P Y | F I L L E D | W I T H | I N D I G N A T I O N | T H A T | A N Y O N E | S H O U L D | A T T E M P T | T O | M O U N T | A | P O N Y | F R O M | T H E | R I G H T | S I D E | +I N | S P I T E | O F | T H E I R | H A R D | C O U C H E S | T H E | P O N Y | R I D E R S | S L E P T | S O U N D L Y | E V E N | P R O F E S S O R | Z E P P L I N | H I M S E L F | N E V E R | W A K I N G | T H E | W H O L E | N I G H T | T H R O U G H | +S T A C Y | G R U M B L E D | T U R N E D | O V E R | A N D | W E N T | T O | S L E E P | A G A I N | +E V E N | I F | I | C A N ' T | S I N G | I | C A N | B E A T | T H A T | +N O N E | O F | Y O U | W I L L | B E | F I T | F O R | D U T Y | T O | M O R R O W | +H U M P H | G R U N T E D | C U R L E Y | A D A M S | +A | W R A N G L E R ' S | A | W R A N G L E R | A N S W E R E D | B I G | F O O T | S T O L I D L Y | +O H | N O | T H I S | K I N D | O F | A | W R A N G L E R | I S N ' T | L A U G H E D | T H E | F O R E M A N | +G R U B | P I | L E | G R U B | P I | L E | +N O T | O N | T H E | R A N G E | W H Y | N O T | D E M A N D E D | T H E | B O Y | +W A L T E R | H A D | G O N E | O U T | W I T H | T H E | S E C O N D | G U A R D | A N D | T H E | O T H E R S | H A D | G A T H E R E D | A R O U N D | T H E | C A M P | F I R E | F O R | T H E I R | N I G H T L Y | S T O R Y | T E L L I N G | +W E | H A D | B E T T E R | S T A R T | T H E | D R I V E | T H I S | M O R N I N G | +T H E | L A D S | F O U N D | T H A T | A | P A I R | O F | B L A N K E T S | H A D | B E E N | A S S I G N E D | T O | E A C H | O F | T H E M | W I T H | A N | O R D I N A R Y | W A G O N | S H E E T | D O U B L E D | F O R | A | T A R P A U L I N | +T H E | C O W B O Y | D I D | T H I S | V E R Y | T H I N G | B U T | W I T H I N | A N | H O U R | H E | F O U N D | H I M S E L F | A L O N E | T H E | O T H E R S | H A V I N G | T U R N E D | I N | O N E | B Y | O N E | +S T A C Y | B R O W N | P R O V E D | T H E | O N L Y | G R U M B L E R | I N | T H E | L O T | D E C L A R I N G | T H A T | H E | C O U L D | N O T | S L E E P | A | W I N K | O N | S U C H | A | B E D | A S | T H A T | +T H E | P O N Y | D I D | M O S T | O F | I T | A D M I T T E D | T H E | L A D | I | J U S T | G A V E | H I M | H I S | H E A D | A N D | T H A T ' S | A L L | T H E R E | W A S | T O | I T | +K E E P | A | G O I N G | A N D | I F | Y O U ' R E | L U C K Y | Y O U ' L L | R U N | P L U M B | I N T O | T H E M | W A S | T H E | J E E R I N G | A N S W E R | A S | T H E | S L E E P Y | C O W M E N | S P U R R E D | T H E I R | P O N I E S | O N | T O W A R D | C A M P | M U T T E R I N G | T H E I R | D I S A P P R O V A L | O F | T A K I N G | A L O N G | A | B U N C H | O F | B O Y S | O N | A | C A T T L E | D R I V E | +A L M O S T | B E F O R E | T H E | E C H O E S | O F | H I S | V O I C E | H A D | D I E D | A W A Y | A | S H R I L L | V O I C E | P I P E D | U P | F R O M | T H E | T A I L | E N D | O F | T H E | C H U C K | W A G O N | +A | L O U D | L A U G H | F O L L O W E D | A T | C H U N K Y ' S | E X P E N S E | +L U M P Y | B A T E S | C A M E | R U N N I N G | T O W A R D | H I M | N O T | D A R I N G | T O | C A L L | O U T | F O R | F E A R | O F | W A K I N G | T H E | C A M P | +Y O U | W O N ' T | B E | S O | F A S T | T O | W A K E | U P | H A R D | W O R K I N G | C O W B O Y S | A F T E R | T H A T | I | R E C K O N | +T H E S E | T H E Y | S P R E A D | O U T | O N | T H E | G R O U N D | U S I N G | B O O T S | W R A P P E D | I N | C O A T S | F O R | P I L L O W S | +P O N G | T E L L | T H E | Y O U N G | G E N T L E M E N | W H A T | W O U L D | B E C O M E | O F | Y O U | I F | Y O U | W E R E | T O | S E R V E | B A D | M E A L S | T O | T H I S | O U T F I T | O F | C O W P U N C H E R S | +T H E | H O R S E S | O F | T H E | O U T F I T | S A V E | T H O S E | T H A T | W E R E | O N | N I G H T | D U T Y | A N D | T W O | O R | T H R E E | O T H E R S | T H A T | H A D | D E V E L O P E D | A | H A B I T | O F | S T R A Y I N G | H A D | B E E N | T U R N E D | L O O S E | E A R L Y | I N | T H E | E V E N I N G | F O R | A N I M A L S | O N | T H E | T R A I L | A R E | S E L D O M | S T A K E D | D O W N | +W E ' V E | G O T | A | H A R D | D R I V E | B E F O R E | U S | A N D | E V E R Y | M A N | M U S T | B E | F I T | A S | A | F I D D L E | +S T A C Y | B R O W N ' S | L E F T | L E G | S W U N G | O V E R | T H E | S A D D L E | +W H E R E | A R E | T H E Y | A S K E D | T H E | B O Y | +H E ' S | A | F E L L O W | W H O ' S | A L L | T H E | T I M E | M A K I N G | T R O U B L E | I S N ' T | H E | A S K E D | S T A C Y | I N N O C E N T L Y | +H E ' S | A | T R O U B L E | C U R E R | N O T | A | T R O U B L E M A K E R | E X C E P T | F O R | H I M S E L F | +T H E N | B I D D I N G | T H E | B O Y S | R I D E | U P | N E A R | T H E | S P O T | T O | W A T C H | H I M | H E | D R E W | O F F | S O M E | T E N | R O D S | A N D | W H E E L I N G | S P U R R E D | H I S | P O N Y | T O | A | R U N | +A | T E M P O R A R Y | C A M P | W A S | Q U I C K L Y | P I T C H E D | +T H E | L I T T L E | A N I M A L S | W E R E | B E C O M I N G | M O R E | S U R E | F O O T E D | E V E R Y | D A Y | A N D | N E D | S A I D | T H A T | B E F O R E | T H E | T R I P | W A S | F I N I S H E D | J I M M I E | W O U L D | B E | A B L E | T O | W A L K | A | S L A C K | R O P E | +T H E Y | S A W | H I S | L O N G | H A I R | A L M O S T | B R U S H | T H E | G R A S S | O N E | O F | H I S | H A N D S | S W E P T | D O W N | A N D | U P | A N D | O N C E | M O R E | T A D | B U T L E R | R O S E | S T A N D I N G | I N | H I S | S T I R R U P S | U T T E R I N G | A | C O W B O Y | Y E L L | A S | H E | W A V E D | T H E | S O M B R E R O | O N | H I G H | +O N C E | M O R E | S T A C Y | A P P R O A C H E D | T H E | S O M B R E R O | H I S | P O N Y | R U N N I N G | W E L L | A N D | A S | H E | D R E W | N E A R | I T | T H E Y | S A W | H I M | R I S E | I N | H I S | S A D D L E | J U S T | A S | T A D | B U T L E R | H A D | D O N E | A | F E W | M I N U T E S | B E F O R E | +I | R E C K O N | T H E R E | A R E | S M I L E D | T H E | G U I D E | W E | A R E | I N | T H E | B E A R | C O U N T R Y | N O W | +W H A T ' S | T H A T | F O R | D E M A N D E D | N E D | W O N D E R I N G L Y | +T H I S | A N N O U N C E M E N T | F I L L E D | T H E | B O Y S | W I T H | E X C I T E M E N T | +A N D | W E ' V E | G O T | A | S U R P R I S E | F O R | Y O U | A N N O U N C E D | S T A C Y | S W E L L I N G | W I T H | P R I D E | +H A T | T O O | C L O S E | T O | M E | I | C O U L D N ' T | G E T | I T | E X P L A I N E D | C H U N K Y | T H E | B O Y S | R O A R E D | +G R A S P I N G | T H E | P O M M E L | W I T H | T H E | L E F T | H A N D | H E | A P P E A R E D | T O | D I V E | H E A D | F I R S T | T O W A R D | T H E | G R O U N D | +T H E | B O Y S | H O W L E D | W I T H | D E L I G H T | T H A T | I S | A L L | D I D | S A V E | S T A C Y | B R O W N | +C O L D | W A T E R | I S | T H E | M O S T | N O U R I S H I N G | T H I N G | W E ' V E | T O U C H E D | S I N C E | L A S T | N I G H T | +A N | E A R L Y | S T A R T | W A S | M A D E | S O | T H A T | T H E | P A R T Y | R E A C H E D | T H E | P R O M I S E D | T A B L E | L A N D S | S H O R T L Y | B E F O R E | T E N | O ' C L O C K | I N | T H E | F O R E N O O N | +G A L L O P I N G | I N T O | C A M P | T H E | B O Y | F E T C H E D | H I S | S O M B R E R O | W H I C H | H E | C A R R I E D | W E L L | O U T | I N T O | T H E | F I E L D | A N D | T O S S E D | A W A Y | +H E | B U R I E D | H I S | B I S C U I T | U N D E R | A | L A Y E R | O F | J A M | O V E R | W H I C H | H E | S P R E A D | A | T H I C K | C O A T I N G | O F | H O N E Y | +W E | D I D | N O T | I T | M U S T | H A V E | C O M E | T O | L I F E | S O M E | T I M E | D U R I N G | T H E | N I G H T | A N D | D U G | I T S | W A Y | O U T | L A U G H E D | T A D | +A S | Y E T | T H E Y | H A D | B E E N | U N A B L E | T O | A T T E M P T | A N Y | F A N C Y | R I D I N G | W I T H | T H E I R | P O N I E S | O W I N G | T O | T H E | R U G G E D | N A T U R E | O F | T H E | C O U N T R Y | T H R O U G H | W H I C H | T H E Y | H A D | B E E N | J O U R N E Y I N G | +J A M | E X C L A I M E D | C H U N K Y | S T R E T C H I N G | H I S | N E C K | A N D | E Y E I N G | T H E | D I S H | L O N G I N G L Y | +W H Y | D O N ' T | Y O U | M O V E | T H E | P O N Y | +S U P P E R | H A V I N G | B E E N | F I N I S H E D | T H E | P A R T Y | G A T H E R E D | A B O U T | T H E | C A M P | F I R E | F O R | T H E I R | E V E N I N G | C H A T | A F T E R | W H I C H | A D M O N I S H I N G | S T A C Y | T O | K E E P | W I T H I N | H I S | T E N T | A N D | N O T | T O | G O | B O R R O W I N G | T R O U B L E | T H E | B O Y S | T U R N E D | I N | F O R | A | S O U N D | S L E E P | +I T | W A S | A | B E A U T I F U L | R A C E | T H E | L I T T L E | I N D I A N | P O N I E S | S E E M I N G | T O | E N T E R | T H O R O U G H L Y | I N T O | T H E | S P I R I T | O F | T H E | C O N T E S T | S T R E T C H I N G | T H E M S E L V E S | O U T | T O | T H E I R | F U L L | L E N G T H S | A N D | W I T H | H E A D S | O N | A | L E V E L | W I T H | T H E I R | B A C K S | F A I R L Y | F L E W | A C R O S S | T H E | G R E A T | P L O T | O F | G R E E N | +H E | N O | D O U B T | W O U L D | B R I N G | F O O D | O F | S O M E | K I N D | W I T H | H I M | +W I T H | A | S H O U T | T H E | B O Y S | D A S H E D | P E L L | M E L L | T O | M E E T | T H E | P A C K | T R A I N | A N D | F A L L I N G | I N | B E H I N D | T H E | S L O W | M O V I N G | B U R R O S | U R G E D | T H E M | O N | W I T H | D E R I S I V E | S H O U T S | A N D | S U N D R Y | R E S O U N D I N G | S L A P S | O N | T H E | A N I M A L S | F L A N K S | +P R E S I D E N T | B R O W N | I | W I T H D R A W | M Y | C R I T I C I S M | I | O F F E R | Y O U | M Y | H U M B L E | A P O L O G I E S | +Y E S | T H E | C O U N T R Y | I S | F U L L | O F | C A V E S | +A L L | A G R E E D | T H A T | T A D ' S | S U P E R I O R | H O R S E M A N S H I P | A L O N E | H A D | W O N | T H E | R A C E | F O R | H I M | +T H E | G R E A T | G R E E N | F I E L D | S U R R O U N D E D | O N | A L L | S I D E S | B Y | T A L L | T R E E S | M A D E | T H E | P L A C E | A N | I D E A L | O N E | F O R | T H E I R | P U R P O S E | +I | A M | F R E E | T O | A D M I T | T H A T | I | A M | H U N G R Y | T O O | +T H E | F I R S T | T I M E | H E | R O D E | S W I F T L Y | B Y | I T | L E A N I N G | O V E R | T O | L O O K | A T | T H E | H A T | A S | H E | P A S S E D | H O L D I N G | T O | T H E | P O M M E L | F I R M L Y | W I T H | H I S | L E F T | H A N D | +B U T | I | K N O W | A N | O L D | S E T T L E R | W H O | W I L L | L E N D | U S | H I S | D O G | I F | I T | I S | N O T | O U T | +N O W | F A L L | T O | Y O U N G | G E N T L E M E N | D I R E C T E D | T H E | P R O F E S S O R | +A S | A | R E S U L T | I N S T E A D | O F | S T O P P I N G | W H E N | H E | R E A C H E D | T H E | H A T | T H E | B O Y | K E P T | O N | G O I N G | +A T | T H E | M O M E N T | W H E N | H E | F R E E D | H I S | L E F T | F O O T | F R O M | T H E | S T I R R U P | H E | T H R E W | H I S | B O D Y | S H A R P L Y | T O | T H E | R I G H T | R E A C H I N G | F O R | T H E | H A T | W I T H O U T | T A K I N G | T H E | P R E C A U T I O N | T O | G R A S P | T H E | P O M M E L | +T A D | I S | A N | E X P E R I E N C E D | R I D E R | +L I G E | L E A N I N G | O V E R | T H E | B R I N K | W A S | A B L E | T O | F O L L O W | T H E | B O Y ' S | M O V E M E N T S | B Y | T H E | A I D | O F | T H E | T H I N | A R C | O F | L I G H T | M A D E | B Y | T H E | T O R C H | I N | T A D ' S | H A N D | +A R E | Y O U | R E A D Y | Y E S | +L I G E | Q U I C K L Y | M A D E | F A S T | T H E | L I N E | T O | A | T R E E | +S L O W L Y | B U T | S T E A D I L Y | T H E | S L E N D E R | L I N E | W A S | P A I D | O U T | A M I D | A | T E N S E | S I L E N C E | O N | T H E | P A R T | O F | T H E | L I T T L E | G R O U P | A T | T H E | T O P | O F | T H E | C A N Y O U | +L O D G E D | I N | T H E | B R A N C H E S | O F | A | P I N Y O N | T R E E | I | T H I N K | I T | I S | B U T | H E | D O E S N ' T | A N S W E R | M E | +A F T E R | W H A T | S E E M E D | T O | T H E M | H O U R S | A | S H A R P | C A L L | F R O M | T H E | D E P T H S | R E A C H E D | T H E I R | E A R S | +I | P R O T E S T | S H O U T E D | T H E | P R O F E S S O R | +L O O K S | L I K E | A | C L U M P | O F | B U S H E S | D O W N | T H E R E | B U T | I | A I N ' T | S U R E | C A N | Y O U | M A K E | I T | O U T | +B E | S U R E | T O | F A S T E N | H I M | S E C U R E L Y | T O | T H E | L O O P | B E F O R E | Y O U | G I V E | T H E | S I G N A L | T O | H A U L | U P | W A R N E D | T H E | G U I D E | +Y O U ' L L | A L L | B E | O V E R | I F | Y O U | D O N ' T | H A V E | A | C A R E | +I | C O U L D | N O T | T H I N K | O F | A L L O W I N G | A N Y | O F | M Y | C H A R G E S | T O | T A K E | S O | T E R R I B L E | A | R I S K | A N D | +A N D | T H A T | T U M B L E ' S | E N O U G H | T O | K N O C K | T H E | S E N S E | O U T | O F | A | F U L L | G R O W N | M A N | +I | A M | T H E | O N E | T O | G O | A F T E R | W A L T | I F | A N Y O N E | H A S | T O | I ' L L | G O | D O W N | M I S T E R | T H O M A S | +M E B B Y | Y O U | T H I N K | H E ' S | H A V I N G | S O M E | S O R T | O F | A | P I C N I C | D O W N | T H E R E | E H | G L A R E D | L I G E | +T H E | M O V E M E N T | S E N T | H I S | B O D Y | S W A Y I N G | G I D D I L Y | F R O M | S I D E | T O | S I D E | +S H A L L | W E | H A U L | U P | A S K E D | L I G E | M A K I N G | A | M E G A P H O N E | O F | H I S | H A N D S | Y E S | H A U L | A W A Y | +Y E S | A G R E E D | T A D | T H A T | D O E S | L O O K | L I K E | B U S H E S | +M A S T E R | T A D | I S | R I G H T | D E C I D E D | T H E | G U I D E | G A Z I N G | A T | T H E | T W O | B O Y S | A P P R O V I N G L Y | +B U T | F R O M | T H E | C A U T I O U S | M O V E M E N T S | O F | T H E | L I G H T | F A R | B E L O W | T H E M | T H E | G U I D E | U N D E R S T O O D | T H A T | T H E | L A D | W A S | A T | W O R K | C A R R Y I N G | O U T | H I S | P A R T | O F | T H E | T A S K | O F | R E S C U E | T O | T H E | B E S T | O F | H I S | A B I L I T Y | +H E | T I L T E D | H I S | H E A D | T O | L O O K | U P | +D O N ' T | M O V E | A R O U N D | L I E | P E R F E C T L Y | S T I L L | W A R N E D | T H E | G U I D E | A R E | Y O U | H U R T | +C A U T I O U S L Y | P L A C I N G | A | H A N D | A G A I N S T | T H E | R O C K S | T O | S T E A D Y | H I M S E L F | T A D | W I S E L Y | C O N C L U D E D | T H A T | H E R E A F T E R | I T | W O U L D | N O T | P A Y | T O | B E | T O O | C U R I O U S | +S U R E | T H I N G | A N S W E R E D | T H E | B O Y | +H E ' S | S O | F A R | T O | T H E | R I G H T | O F | M E | T H A T | I | C A N ' T | R E A C H | H I M | +Y O U ' D | H A V E | B O T H | O F | U S | A T | T H E | B O T T O M | I F | I | L E F T | I T | T O | Y O U | T O | T A K E | C A R E | O F | T H I S | E N D | +N O R | W A S | H I S | S E N S E | O F | S E C U R I T Y | I N C R E A S E D | W H E N | I N | S H I F T I N G | H I S | P O S I T I O N | T H E | T O R C H | F E L L | F R O M | H I S | G R A S P | T H E | F A G O T S | S C A T T E R I N G | A S | T H E Y | S L I P P E D | D O W N | B E T W E E N | T H E | L I M B S | O F | T H E | T R E E | A N D | W H I R L I N G | I N | E V E R | D I M I N I S H I N G | C I R C L E S | U N T I L | F I N A L L Y | H E | H E A R D | T H E M | C L A T T E R | O N | T H E | R O C K S | B E L O W | +I | S E E | H I M | C A L L E D | T A D | H I S | V O I C E | S O U N D I N G | H O L L O W | A N D | U N N A T U R A L | T O | T H O S E | A B O V E | +N O | I | A M | T H E | L I G H T E R | O F | T H E | T W O | U R G E D | T A D | +T O | M A K E | D R Y | T O A S T | +M A I Z E | N E X T | T O | W H E A T | A N D | R I C E | M A I Z E | I S | T H E | G R A I N | M O S T | U S E D | I N | T H E | N O U R I S H M E N T | O F | M A N | +L O O K | A T | I T | F R O M | T I M E | T O | T I M E | W H E N | I T | H A S | B E E N | L A I D | F O R | N E A R L Y | A N | H O U R | A N D | W H E N | T H E | Y E A S T | H A S | R I S E N | A N D | B R O K E N | T H R O U G H | T H E | F L O U R | S O | T H A T | B U B B L E S | A P P E A R | I N | I T | Y O U | W I L L | K N O W | T H A T | I T | I S | R E A D Y | T O | B E | M A D E | U P | I N T O | D O U G H | +S O Y E R | R E C O M M E N D S | T H A T | E A C H | S L I C E | S H O U L D | B E | C U T | I N T O | P I E C E S | A S | S O O N | A S | I T | I S | B U T T E R E D | A N D | W H E N | A L L | A R E | R E A D Y | T H A T | T H E Y | S H O U L D | B E | P I L E D | L I G H T L Y | O N | T H E | D I S H | T H E Y | A R E | I N T E N D E D | T O | B E | S E R V E D | O N | +I T A L I A N | R U S K S | +M O D E | P U T | T H E | F L O U R | I N T O | A | B A S I N | M I X | T H E | S U G A R | W E L L | W I T H | I T | M A K E | A | H O L E | I N | T H E | C E N T R E | A N D | S T I R | I N | T H E | Y E A S T | A N D | M I L K | W H I C H | S H O U L D | B E | L U K E W A R M | W I T H | E N O U G H | O F | T H E | F L O U R | T O | M A K E | I T | T H E | T H I C K N E S S | O F | C R E A M | +M O D E | P U T | T H E | M I L K | A N D | B U T T E R | I N T O | A | S A U C E P A N | A N D | K E E P | S H A K I N G | I T | R O U N D | U N T I L | T H E | L A T T E R | I S | M E L T E D | +T H E S E | B U N S | M A Y | B E | V A R I E D | B Y | A D D I N G | A | F E W | C U R R A N T S | C A N D I E D | P E E L | O R | C A R A W A Y | S E E D S | T O | T H E | O T H E R | I N G R E D I E N T S | A N D | T H E | A B O V E | M I X T U R E | A N S W E R S | F O R | H O T | C R O S S | B U N S | B Y | P U T T I N G | I N | A | L I T T L E | G R O U N D | A L L S P I C E | A N D | B Y | P R E S S I N G | A | T I N | M O U L D | I N | T H E | F O R M | O F | A | C R O S S | I N | T H E | C E N T R E | O F | T H E | B U N | +A | L O A F | O F | H O U S E H O L D | B R E A D | A B O U T | T W O | D A Y S | O L D | A N S W E R S | F O R | M A K I N G | T O A S T | B E T T E R | T H A N | C O T T A G E | B R E A D | T H E | L A T T E R | N O T | B E I N G | A | G O O D | S H A P E | A N D | T O O | C R U S T Y | F O R | T H E | P U R P O S E | +W H E N | W E | T A K E | I N T O | A C C O U N T | T H A T | T H E | A R A B I A N S | A R E | F O N D | O F | L I Z A R D S | A N D | L O C U S T S | A S | A R T I C L E S | O F | F O O D | T H E I R | C U I S I N E | A L T O G E T H E R | I S | S C A R C E L Y | A | T E M P T I N G | O N E | +I T A L I A N | M I L L E T | O R | G R E A T | I N D I A N | M I L L E T | I S | C U L T I V A T E D | I N | E G Y P T | A N D | N U B I A | W H E R E | I T | I S | C A L L E D | D H O U R R A | A N D | I S | U S E D | A S | H U M A N | F O O D | A S | W E L L | A S | F O R | T H E | F E R M E N T A T I O N | O F | B E E R | +M O D E | P U T | T H E | F L O U R | I N T O | A | L A R G E | E A R T H E N W A R E | B O W L | O R | D E E P | P A N | T H E N | W I T H | A | S T R O N G | M E T A L | O R | W O O D E N | S P O O N | H O L L O W | O U T | T H E | M I D D L E | B U T | D O | N O T | C L E A R | I T | E N T I R E L Y | A W A Y | F R O M | T H E | B O T T O M | O F | T H E | P A N | A S | I N | T H A T | C A S E | T H E | S P O N G E | O R | L E A V E N | A S | I T | W A S | F O R M E R L Y | T E R M E D | W O U L D | S T I C K | T O | I T | W H I C H | I T | O U G H T | N O T | T O | D O | +W H E N | T H E Y | A R E | Q U I T E | H O T | D I V I D E | T H E M | L E N G T H W I S E | I N T O | T H R E E | P U T | S O M E | T H I N | F L A K E S | O F | G O O D | B U T T E R | B E T W E E N | T H E | S L I C E S | P R E S S | T H E | R O L L S | T O G E T H E R | A N D | P U T | T H E M | I N | T H E | O V E N | F O R | A | M I N U T E | O R | T W O | B U T | N O T | L O N G E R | O R | T H E | B U T T E R | W O U L D | O I L | T A K E | T H E M | O U T | O F | T H E | O V E N | S P R E A D | T H E | B U T T E R | E Q U A L L Y | O V E R | D I V I D E | T H E | R O L L S | I N | H A L F | A N D | P U T | T H E M | O N | T O | A | V E R Y | H O T | C L E A N | D I S H | A N D | S E N D | T H E M | I N S T A N T L Y | T O | T A B L E | +I L L U S T R A T I O N | M A I Z E | P L A N T | +S E V E N T E E N | T W E N T Y | F O U R | +M O D E | W H I S K | T H E | E G G | S T I R | I N | T H E | S U G A R | A N D | B E A T | T H E S E | I N G R E D I E N T S | W E L L | T O G E T H E R | B E A T | T H E | B U T T E R | T O | A | C R E A M | S T I R | I N | T H E | G R O U N D | R I C E | C U R R A N T S | A N D | C A N D I E D | P E E L | A N D | A S | M U C H | F L O U R | A S | W I L L | M A K E | I T | O F | S U C H | A | C O N S I S T E N C Y | T H A T | I T | M A Y | B E | R O L L E D | I N T O | S E V E N | O R | E I G H T | B A L L S | +I L L U S T R A T I O N | R U S K S | +S E V E N T E E N | T H I R T Y | F O U R | +C U T | A S | M A N Y | N I C E | E V E N | S L I C E S | A S | M A Y | B E | R E Q U I R E D | R A T H E R | M O R E | T H A N | O N E | Q U A R T E R | I N C H | I N | T H I C K N E S S | A N D | T O A S T | T H E M | B E F O R E | A | V E R Y | B R I G H T | F I R E | W I T H O U T | A L L O W I N G | T H E | B R E A D | T O | B L A C K E N | W H I C H | S P O I L S | T H E | A P P E A R A N C E | A N D | F L A V O U R | O F | A L L | T O A S T | +T H E N | P L A C E | T H E | P A N | O N | A | S T R O N G | C H A I R | O R | D R E S S E R | O R | T A B L E | O F | C O N V E N I E N T | H E I G H T | P O U R | I N T O | T H E | S P O N G E | T H E | R E M A I N D E R | O F | T H E | W A R M | M I L K | A N D | W A T E R | S T I R | I N T O | I T | A S | M U C H | O F | T H E | F L O U R | A S | Y O U | C A N | W I T H | T H E | S P O O N | T H E N | W I P E | I T | O U T | C L E A N | W I T H | Y O U R | F I N G E R S | A N D | L A Y | I T | A S I D E | +T U R N | I T | T H E N | O N | T O | A | P A S T E | B O A R D | O R | V E R Y | C L E A N | D R E S S E R | A N D | W I T H | A | L A R G E | S H A R P | K N I F E | D I V I D E | I T | I N | T W O | M A K E | I T | U P | Q U I C K L Y | I N T O | L O A V E S | A N D | D I S P A T C H | I T | T O | T H E | O V E N | M A K E | O N E | O R | T W O | I N C I S I O N S | A C R O S S | T H E | T O P S | O F | T H E | L O A V E S | A S | T H E Y | W I L L | R I S E | M O R E | E A S I L Y | I F | T H I S | B E | D O N E | +H O T | R O L L S | +S E V E N T E E N | S E V E N T E E N | +T O | M A K E | H O T | B U T T E R E D | T O A S T | S E V E N T E E N | T W E N T Y | S I X | +K I R K L E A T H A M | Y E A S T | +I L L U S T R A T I O N | I T A L I A N | M I L L E T | +M O D E | L E T | T H E | T A R T A R I C | A C I D | A N D | S A L T | B E | R E D U C E D | T O | T H E | F I N E S T | P O S S I B L E | P O W D E R | T H E N | M I X | T H E M | W E L L | W I T H | T H E | F L O U R | +S U F F I C I E N T | T O | M A K E | T W E L V E | B U N S | S E A S O N A B L E | A T | A N Y | T I M E | L I G H T | B U N S | +M O V E | I T | B A C K W A R D S | A N D | F O R W A R D S | U N T I L | T H E | B R E A D | I S | N I C E L Y | C O L O U R E D | T H E N | T U R N | I T | A N D | T O A S T | T H E | O T H E R | S I D E | A N D | D O | N O T | P L A C E | I T | S O | N E A R | T H E | F I R E | T H A T | I T | B L A C K E N S | +T H E Y | S H O U L D | B E | K E P T | I N | A | C L O S E D | T I N | C A N I S T E R | I N | A | D R Y | P L A C E | T O | P R E S E R V E | T H E I R | C R I S P N E S S | +N E V E R | U S E | N E W | B R E A D | F O R | M A K I N G | A N Y | K I N D | O F | T O A S T | A S | I T | E A T S | H E A V Y | A N D | B E S I D E S | I S | V E R Y | E X T R A V A G A N T | +E X C E L L E N T | R O L L S | +S O M E | O F | T H E | P R E P A R A T I O N S | O F | M A I Z E | F L O U R | A R E | V E R Y | G O O D | A N D | W H E N | P A R T A K E N | I N | M O D E R A T I O N | S U I T A B L E | F O O D | F O R | A L M O S T | E V E R Y B O D Y | +T O | M A K E | G O O D | H O M E | M A D E | B R E A D | +I T | I S | N O T | C U L T I V A T E D | I N | E N G L A N D | B E I N G | P R I N C I P A L L Y | C O N F I N E D | T O | T H E | E A S T | +N E X T | T A K E | E I T H E R | A | L A R G E | T A B L E S P O O N F U L | O F | B R E W E R ' S | Y E A S T | W H I C H | H A S | B E E N | R E N D E R E D | S O L I D | B Y | M I X I N G | I T | W I T H | P L E N T Y | O F | C O L D | W A T E R | A N D | L E T T I N G | I T | A F T E R W A R D S | S T A N D | T O | S E T T L E | F O R | A | D A Y | A N D | N I G H T | O R | N E A R L Y | A N | O U N C E | O F | G E R M A N | Y E A S T | P U T | I T | I N T O | A | L A R G E | B A S I N | A N D | P R O C E E D | T O | M I X | I T | S O | T H A T | I T | S H A L L | B E | A S | S M O O T H | A S | C R E A M | W I T H | T H R E E | Q U A R T E R S | P I N T | O F | W A R M | M I L K | A N D | W A T E R | O R | W I T H | W A T E R | O N L Y | T H O U G H | E V E N | A | V E R Y | L I T T L E | M I L K | W I L L | M U C H | I M P R O V E | T H E | B R E A D | +F R O M | F I F T E E N | T O | T W E N T Y | M I N U T E S | W I L L | B E | R E Q U I R E D | T O | B A K E | T H E M | N I C E L Y | +W H E N | C O L D | T H E Y | S H O U L D | B E | P U T | I N T O | T I N | C A N I S T E R S | T O | K E E P | T H E M | D R Y | A N D | I F | I N T E N D E D | F O R | T H E | C H E E S E | C O U R S E | T H E | S I F T E D | S U G A R | S H O U L D | B E | O M I T T E D | +I T | H A S | B E E N | I N T R O D U C E D | I N T O | I T A L Y | W H E R E | T H E Y | M A K E | A | C O A R S E | B R E A D | F R O M | I T | A N D | I T | I S | A L S O | E M P L O Y E D | I N | P A S T R Y | A N D | P U D D I N G S | T H E Y | A L S O | U S E | I T | F O R | F E E D I N G | H O R S E S | A N D | D O M E S T I C | F O W L S | +V I C T O R I A | B U N S | S E V E N T E E N | T H I R T Y | T W O | +S U F F I C I E N T | A L L O W | T W O | C R U M P E T S | T O | E A C H | P E R S O N | +M U F F I N S | A N D | C R U M P E T S | S H O U L D | A L W A Y S | B E | S E R V E D | O N | S E P A R A T E | D I S H E S | A N D | B O T H | T O A S T E D | A N D | S E R V E D | A S | E X P E D I T I O U S L Y | A S | P O S S I B L E | +I L L U S T R A T I O N | B U N S | +P L A I N | B U N S | S E V E N T E E N | T W E N T Y | N I N E | +M O D E | B O I L | T H E | R I C E | I N | W A T E R | U N T I L | I T | I S | Q U I T E | T E N D E R | P O U R | O F F | T H E | W A T E R | A N D | P U T | T H E | R I C E | B E F O R E | I T | I S | C O L D | T O | T H E | F L O U R | +S E V E N T E E N | E I G H T E E N | +I T | W I L L | G R O W | O N | P O O R | S O I L S | A N D | I S | E X T R E M E L Y | P R O D U C T I V E | +S O U R | M I L K | O R | B U T T E R M I L K | M A Y | B E | U S E D | B U T | T H E N | A | L I T T L E | L E S S | A C I D | W I L L | B E | N E E D E D | +A N O T H E R | A D V A N T A G E | T H E | R E D | W H E A T S | P O S S E S S | I S | T H E I R | C O M P A R A T I V E | I M M U N I T Y | F R O M | T H E | A T T A C K S | O F | M I L D E W | A N D | F L Y | +H E | S A Y S | T H A T | B Y | C U T T I N G | T H R O U G H | F O U R | O R | F I V E | S L I C E S | A T | A | T I M E | A L L | T H E | B U T T E R | I S | S Q U E E Z E D | O U T | O F | T H E | U P P E R | O N E S | W H I L E | T H E | B O T T O M | O N E | I S | S W I M M I N G | I N | F A T | L I Q U I D | +I F | C A R R I E D | A N Y | D I S T A N C E | I T | S H O U L D | B E | S T O R E D | A W A Y | I N | A I R | T I G H T | V E S S E L S | +A | Y E L L O W | V A R I E T Y | C A L L E D | G O L D E N | M I L L E T | I S | S O L D | I N | T H E | G R O C E R S | S H O P S | F O R | M A K I N G | P U D D I N G S | A N D | I S | V E R Y | D E L I C A T E | A N D | W H O L E S O M E | +W H E N | S H E | H E A R D | O F | M Y | E N G A G E M E N T | W I T H | M A R Y | A N N | S H E | W R O T E | A N D | S U G G E S T E D | T H A T | W E | S H O U L D | S P E N D | O U R | H O N E Y M O O N | I N | H E R | C O T T A G E | O R | P I G S T Y E | A N D | T H A T | I | S H O U L D | P A Y | H E R | R E N T | F O R | I T | +T H E | F A C T | O F | H A V I N G | G I V E N | M A R Y | A N N | A | W E D D I N G | P R E S E N T | S E E M S | T O | F I L L | T H E M | W I T H | A | F E E L I N G | O F | R A N C O R O U S | A C I D I T Y | W H I C H | T O | M E | I S | I N E X P L I C A B L E | +A N D | O F | C O U R S E | I | H A D | M Y | E X P E C T A T I O N S | A N D | S H E | H A D | H E R S | +F R O M | A | C O U S I N | O F | O U R S | W H O ' S | I N | T H A T | L I N E | +T H A T | W A S | W H A T | M I S S U S | M A C P H E R S O N | S A I D | T O | M E | O N L Y | T H E | O T H E R | D A Y | +T H E | A C C I D E N T | I N | Q U E S T I O N | O C C U R R E D | U P O N | T H E | S U N D A Y | E V E N I N G | +I | F O U N D | T H A T | A S | A | W O M A N | O F | B U S I N E S S | S H E | W A S | B E Y O N D | A L L | M Y | E X P E C T A T I O N S | +T H E | G I R L | I S | F R E T T I N G | B U T | Y O U | D O N ' T | S E E M | T O | N O T I C E | I T | +S U C H | I S | T H E | S E L F I S H N E S S | O F | H U M A N | N A T U R E | +I | C A N N O T | P R E T E N D | T O | E X P L A I N | W H Y | E X C E P T | O N | T H E | S U P P O S I T I O N | T H A T | R O M A N C E | I S | D E A D | A T | L E A S T | I N | T H A T | C I R C L E | O F | S O C I E T Y | I N | W H I C H | T H E | S N E L L I N G S | M O V E | +I T | I S | M O S T | D E L I G H T F U L | +H E R | F A T H E R | I S | A | M O S T | R E M A R K A B L E | P E R S O N | T O | S A Y | T H E | L E A S T | +A N D | I | W I L L | S E E | T H A T | T H E R E | I S | N O | S H I R K I N G | A B O U T | T H E | B O Y S | O R | A B O U T | T H E | G I R L S | E I T H E R | +I | D O | N O T | K N O W | W H E N | I T | I S | G O I N G | T O | B E | B U T | I T | W I L L | B E | E I T H E R | N E X T | W E E K | O R | T H E | W E E K | A F T E R | C E R T A I N L Y | A T | T H E | E A R L I E S T | P O S S I B L E | M O M E N T | A N D | I | S H O U L D N ' T | B E | A T | A L L | S U R P R I S E D | T O | L E A R N | T H A T | A L L | M A R Y | A N N ' S | T H I N G S | H A D | B E E N | A L R E A D Y | B O U G H T | A N D | P E R H A P S | S O M E | O F | T H E M | M A R K E D | +A | S E C O N D | C O U S I N | O F | M A R Y | A N N ' S | I S | I N | T H E | C O O K ' S | T O U R S | L I N E | +I | S H A L L | M A K E | P A P A | G I V E | M E | F I V E | H U N D R E D | P O U N D S | A T | L E A S T | +I T | T U R N E D | O U T | T H A T | S H E | H A D | A | L I T T L E | M O N E Y | O F | H E R | O W N | A B O U T | A | H U N D R E D | A N D | T H I R T Y | P O U N D S | A | Y E A R | +S O M E O N E | S N I G G E R E D | +H E R S | H A S | B E E N | P R O D I G I O U S | +B U T | I T | I S | Q U I T E | P L A I N | T O | M E | T H A T | A L L | T H E | A R R A N G E M E N T S | F O R | M Y | W E D D I N G | A R E | G O I N G | T O | B E | M A D E | B Y | T H E | S N E L L I N G S | +P | S | T H E | C A R D S | A R E | O U T | F O R | T H E | W E D D I N G | +I | H A V E | D R A W N | U P | A | L I S T | O F | A L L | T H E | P E O P L E | W H O | O U G H T | T O | G I V E | U S | A | P R E S E N T | A N D | I | S H A L L | T E L L | T H E M | W H A T | T H E Y | O U G H T | T O | G I V E | I T | W O N ' T | B E | M Y | F A U L T | I F | I | D O N ' T | G E T | I T | +S H E | H A S | A | K N A C K | O F | G E T T I N G | P E O P L E | T O | D O | W H A T | S H E | W I S H E S | A N D | T O | G I V E | H E R | W H A T | S H E | W A N T S | W H I C H | I S | A | L I T T L E | S H O R T | O F | M I R A C U L O U S | +I T | W A S | P L A I N | T H A T | T O G E T H E R | W E | S H O U L D | M A N A G E | M O S T | C O M F O R T A B L Y | D E L I G H T F U L L Y | I N | F A C T | +W E | H A V E | A L L | B E E N | G I V I N G | M A R Y | A N N | P R E S E N T S | A N D | I | S U P P O S E | Y O U | M I S T E R | W H I T I N G | H A V E | B E E N | G I V I N G | H E R | S O M E T H I N G | T O O | +O F | C O U R S E | T H E R E | A R E | S O M E | P E O P L E | W I T H | W H O M | Y O U | C A N ' T | B E | P E R F E C T L Y | P L A I N | B U T | I | S H A L L | B E | A S | P L A I N | A S | I | C A N | T H E R E ' S | A | W A Y | A N D | A | M A N N E R | O F | D O I N G | T H A T | K I N D | O F | T H I N G | +H E | H A S | G I V E N | U S | F R E E | P A S S E S | A L L | T H E | W A Y | T O | T H E | E N D | O F | O U R | J O U R N E Y | A N D | A L L | T H E | W A Y | B A C K | A G A I N | A N D | C O U P O N S | F O R | F R E E | B O A R D | A N D | L O D G I N G | A T | T H E | H O T E L | I T ' S | A | W E D D I N G | P R E S E N T | +A S | I T | I S | U N L E S S | I | A M | M I S T A K E N | S O M E | O F | T H E | R E N D I N G | W I L L | B E | O N | O U R | S I D E | A N D | T H E Y | K N O W | I T | +F O R | I N S T A N C E | L O O K | A T | T H E I R | B E H A V I O U R | I N | T H E | M A T T E R | O F | T H E | R I N G | +I | G A S P E D | P O S I T I V E L Y | G A S P E D | +I | N E V E R | S A W | P E O P L E | L I K E | T H E | S N E L L I N G S | F O R | P O S S E S S I N G | R E L A T I V E S | I N | A L L | S O R T S | O F | L I N E S | +I T | I S | F R O M | H E R | A C T I O N | I N | T H A T | M A T T E R | T H A T | M Y | S U S P I C I O N | S P R I N G S | +I T | M I G H T | J U S T | A S | W E L L | B E | S O M E | O N E | E L S E ' S | W E D D I N G | S O | U N I M P O R T A N T | I S | T H E | P A R T | W H I C H | I | A M | S E T | T O | P L A Y | I N | I T | +I | K N O W | W H A T | M A M M A | C A N | A F F O R D | T O | G I V E | A N D | I | W I L L | S E E | S H E | G I V E S | I T | +W E | A R E | G O I N G | F O R | O U R | H O N E Y M O O N | T O | I T A L Y | A N D | T H E | S O U T H | O F | F R A N C E | +B U T | W H Y | O N | T H A T | A C C O U N T | T H E Y | S H O U L D | P I T Y | M E | I | A L T O G E T H E R | F A I L | T O | U N D E R S T A N D | +I | N O T I C E | T H A T | T H E Y | A R E | G E N E R A L L Y | P E R S O N S | W H O | H A V E | A L R E A D Y | T E N D E R E D | T H E I R | O F F E R I N G S | +T H E R E | W E R E | N O | S I G N S | O F | F A L T E R I N G | A B O U T | H E R | F L O W | O F | L A N G U A G E | +A | B I R D | I N | T H E | H A N D | I S | W O R T H | T W O | I N | A | B U S H ' | A N D | I T | W I L L | B E | S O M E T H I N G | T O | H A V E | B Y | U S | +T H A T ' S | I T | O N | Y O U R | A C C O U N T | +A N D | W H A T | I N Q U I R E D | M I S S U S | M A C P H E R S O N | H A S | M A R Y | A N N | G I V E N | Y O U | H E R | L O V E | +T H E R E | S H E | O W N S | A | C O T T A G E | O R | I T | M A Y | B E | A | P I G S T Y E | F O R | A L L | I | K N O W | +B E S I D E S | W H I C H | W E | C A N | A L W A Y S | S E L L | T H E | C O U P O N S | A N D | R A I L W A Y | P A S S E S | W H I C H | W E | D O N ' T | U S E | +I | W A S | P E R S U A D E D | T H A T | S O M E B O D Y | B E S I D E S | T H A T | C O U S I N | G O T | A | P R O F I T | O U T | O F | M A R Y | A N N ' S | E N G A G E M E N T | R I N G | B U T | I | H A N D E D | O V E R | T H E | A M O U N T | +W H E N | A T | L A S T | I | R E A C H E D | C R O F T O N | M Y | J O U R N E Y ' S | E N D | I T | T U R N E D | O U T | T H A T | T H E | S T A T I O N | S T A F F | C O N S I S T E D | O F | A | H A L F | W I T T E D | I N D I V I D U A L | W H O | W A S | S T A T I O N M A S T E R | P O R T E R | A N D | C L E R K | C O M B I N E D | A N D | A | H U L K I N G | L A D | W H O | D I D | W H A T E V E R | E L S E | T H E R E | W A S | T O | D O | +H E R E | W E | B E | T H A T | M I G H T | B E | S O | +N O | A N S W E R | T H O U G H | I | A L L O W E D | A | M O R E | T H A N | D E C E N T | I N T E R V A L | +T H E R E | A P P E A R E D | T O | B E | N O | K N O C K E R | T H O U G H | W H E T H E R | I T | H A D | B E E N | T W I S T E D | O F F | W A S | M O R E | T H A N | I | C O U L D | S A Y | +W E ' V E | L O S T | T H E | K E Y | O F | T H E | C E L L A R | A N D | T H E R E ' S | N O T H I N G | O U T | E X C E P T | W A T E R | A N D | I | D O N ' T | T H I N K | Y O U ' D | C A R E | F O R | T H A T | +I N | I T | I | W A S | D E P O S I T E D | W I T H | M Y | L U G G A G E | +I | E V E N | B O U G H T | S O M E T H I N G | F O R | M A D G E | I | M E A N | M I S S U S | W I L S O N | +A | V O I C E | I N Q U I R E D | W H O ' S | T H E R E | +T H E | R E P L Y | W A S | W R I T T E N | I N | A | S P R A W L I N G | F E M I N I N E | H A N D | I T | W A S | A | L I T T L E | V A G U E | +B E T T E R | R I N G | A G A I N | S U G G E S T E D | T H E | D R I V E R | H A R D | +T H E | W H O L E | T H I N G | W A S | A | T R I F L E | O D D | +I | D I D | N O T | A S K | I | W A S | B E Y O N D | I T | +I | H A D | N O | I L L U S I O N S | +W H O | L I V E S | H E R E | A R E | T H E | P E O P L E | M A D | +I | I M A G I N E | T H E R E | W E R E | S E V E R A L | K I N D S | O F | O L D | F A S H I O N E D | C H R I S T M A S E S | B U T | I T | C O U L D | H A R D L Y | B E | W O R S E | T H A N | A | C H O P | I N | M Y | C H A M B E R S | O R | H O R R O R | O F | H O R R O R S | A T | T H E | C L U B | O R | M Y | C O U S I N | L U C Y ' S | N O T I O N | O F | W H A T | S H E | C A L L S | T H E | F E S T I V E | S E A S O N | +N O W | I T | I S | A | R E M A R K A B L E | T H I N G | T H A T | I | H A V E | A L W A Y S | H A D | A N | E X T R A O R D I N A R Y | P R E D I L E C T I O N | F O R | T H E | N A M E | M A D G E | I | D O | N O T | K N O W | W H Y | +I T | I S | S O M E | S A T I S F A C T I O N | F O R | M E | T O | B E | A B L E | T O | R E F L E C T | T H A T | I | M A D E | I T | W A R M | F O R | T H E | O F F I C I A L S | H O W E V E R | C O L D | I | M I G H T | H A V E | B E E N | M Y S E L F | +H E | W A S | I M P E R V I O U S | T O | R E A S O N | +I | W A S | C H I L L E D | T O | T H E | B O N E | W E T | T I R E D | H U N G R Y | +I | F E L T | Q U I T E | L I V E L Y | M Y S E L F | A S | I | M I N G L E D | W I T H | T H E | C H R I S T M A S | C R O W D | L O O K I N G | F O R | T H I N G S | W H I C H | M I G H T | N O T | T U R N | O U T | T O | B E | A B S O L U T E L Y | P R E P O S T E R O U S | +W H E N | T H E | T R A P | D I D | A P P E A R | I T | L O O K E D | T O | M E | U N C O M M O N L Y | L I K E | A N | O P E N | S P R I N G | C A R T | +T H E R E | W A S | A | T R A P | A T | T H E | B O Y | A N D | B L U N D E R B U S S | B U T | T H A T | R E Q U I R E D | F E T C H I N G | +N O | O N E | H A D | C O M E | T O | M E E T | M E | T H E | V I L L A G E | W A S | A B O U T | H A L F | A | M I L E | A N D | H A N G A R | D E N E | T H E | H O U S E | F O R | W H I C H | M Y | S T E P S | W E R E | B E N T | A B O U T | F O U R | M I L E S | B Y | T H E | R O A D | H O W | F A R | I T | W A S | A C R O S S | P L O U G H E D | F I E L D S | M Y | I N F O R M A N T | D I D | N O T | M E N T I O N | +T H E R E | W A S | N O T H I N G | S A I D | A B O U T | T H E | S O R T | O F | A C C O M M O D A T I O N | W H I C H | W O U L D | B E | P R O V I D E D | N O T H I N G | A B O U T | T H E | K I N D | O F | E S T A B L I S H M E N T | W H I C H | W A S | M A I N T A I N E D | O R | T H E | T A B L E | W H I C H | W A S | K E P T | +M A Y B E | T H E Y ' R E | U P | T O | S O M E | O F | T H E I R | G A M E S | A N D | W A N T S | R O U S I N G | +T H E R E | W A S | A | R U S H | O F | R E T R E A T I N G | F E E T | A N | E X P O S T U L A T I N G | V O I C E | T H E N | D A R K N E S S | A G A I N | A N D | S I L E N C E | +T H E | B E L L | R E V E R B E R A T E D | T H R O U G H | W H A T | S E E M E D | L I K E | A N | E M P T Y | H O U S E | +A L L | N I G H T | I T | H A D | B E E N | B L O W I N G | A N D | R A I N I N G | +F E S T I V E | Y E S | +I T | W A S | A | H O R R I B L E | J O U R N E Y | +A F T E R | A | V A S T | A M O U N T | O F | U N F A S T E N I N G | T H E | D O O R | W A S | O P E N E D | A N D | O N | T H E | T H R E S H O L D | T H E R E | S T O O D | A | G I R L | W I T H | A | L I G H T E D | C A N D L E | I N | H E R | H A N D | +I | D I D | N O T | E X P E C T | A | P R I N C E L Y | E N T E R T A I N M E N T | +P R E S E N T L Y | F E E T | W E R E | H E A R D | A D V A N C I N G | A L O N G | T H E | P A S S A G E | S E V E R A L | P A I R S | I T | S E E M E D | A N D | A | L I G H T | G L E A M E D | T H R O U G H | T H E | W I N D O W | O V E R | T H E | D O O R | +I | D I D | N O T | K N O W | W H A T | H E | M E A N T | +I T | A P P E A R E D | T H A T | T H E | T E R M S | W O U L D | B E | F I V E | G U I N E A S | B U T | T H E R E | W A S | N O | M E N T I O N | O F | T H E | L E N G T H | O F | T I M E | W H I C H | T H A T | F E E | W O U L D | C O V E R | +T H E | I N F O R M A T I O N | W A S | G R E E T E D | W I T H | W H A T | S O U N D E D | U N C O M M O N L Y | L I K E | A | C H O R U S | O F | L A U G H T E R | +U N D E R | S U C H | C I R C U M S T A N C E S | S H E | W A S | H A R D L Y | L I K E L Y | T O | B E | L I V E L Y | H E R S E L F | B U T | H E R | N A M E | W A S | M A D G E | A N D | I T | W A S | T H E | A C C I D E N T | O F | H E R | C H R I S T I A N | N A M E | W H I C H | D E C I D E D | M E | T O | G O | +I | T O L L E D | T H E | B E L L | A G A I N | +I | H A V E | N E V E R | K N O W N | A | M A D G E | A N D | Y E T | F R O M | M Y | B O Y H O O D | U P W A R D | I | H A V E | D E S I R E D | T O | M E E T | O N E | +I | H A D | L O N G | B E E N | W I S H I N G | T H A T | A N | O L D | F A S H I O N E D | C H R I S T M A S | H A D | B E E N | C O M P L E T E L Y | E X T I N C T | B E F O R E | I | H A D | T H O U G H T | O F | A D V E N T U R I N G | I N | Q U E S T | O F | O N E | +T H E R E | B E | T H E | D O O R | I N | F R O N T | O F | Y O U | Y O U | G O | U P | T H R E E | S T E P S | I F | Y O U | C A N | F I N D | E M | +I ' M | M I S T E R | C H R I S T O P H E R | F R O M | L O N D O N | +T H E R E ' S | A | K N O C K E R | I F | N O N E | O F | E M | H A V E N ' T | T W I S T E D | I T | O F F | +E A R L Y | I N | T H E | M O R N I N G | T H E | S T E P M O T H E R | C A M E | A N D | P U L L E D | T H E M | O U T | O F | B E D | A N D | G A V E | T H E M | E A C H | A | S L I C E | O F | B R E A D | W H I C H | W A S | S T I L L | S M A L L E R | T H A N | T H E | F O R M E R | P I E C E | +B U T | S H E | L E F T | H I M | N O | P E A C E | T I L L | H E | C O N S E N T E D | S A Y I N G | A H | B U T | I | S H A L L | M I S S | T H E | P O O R | C H I L D R E N | +A N D | S H E | G O T | U P | A N D | P U T | H E R | H E A D | I N T O | T H E | O V E N | +T H E N | S H E | T O O K | U P | H A N S E L | W I T H | H E R | R O U G H | H A N D | A N D | S H U T | H I M | U P | I N | A | L I T T L E | C A G E | W I T H | A | L A T T I C E | D O O R | A N D | A L T H O U G H | H E | S C R E A M E D | L O U D L Y | I T | W A S | O F | N O | U S E | +H A N S E L | T H O U G H T | T H E | R O O F | T A S T E D | V E R Y | N I C E | A N D | S O | H E | T O R E | O F F | A | G R E A T | P I E C E | W H I L E | G R E T H E L | B R O K E | A | L A R G E | R O U N D | P A N E | O U T | O F | T H E | W I N D O W | A N D | S A T | D O W N | Q U I T E | C O N T E N T E D L Y | +W E | A R E | G O I N G | I N T O | T H E | F O R E S T | T O | H E W | W O O D | A N D | I N | T H E | E V E N I N G | W H E N | W E | A R E | R E A D Y | W E | W I L L | C O M E | A N D | F E T C H | Y O U | A G A I N | +C R E E P | I N | S A I D | T H E | W I T C H | A N D | S E E | I F | I T | I S | H O T | E N O U G H | A N D | T H E N | W E | W I L L | P U T | I N | T H E | B R E A D | B U T | S H E | I N T E N D E D | W H E N | G R E T H E L | G O T | I N | T O | S H U T | U P | T H E | O V E N | A N D | L E T | H E R | B A K E | S O | T H A T | S H E | M I G H T | E A T | H E R | A S | W E L L | A S | H A N S E L | +A H | F A T H E R | S A I D | H A N S E L | I | A M | L O O K I N G | A T | M Y | W H I T E | C A T | S I T T I N G | U P O N | T H E | R O O F | O F | T H E | H O U S E | A N D | T R Y I N G | T O | S A Y | G O O D | B Y E | +D E A R | G O O D | G O D | H E L P | U S | N O W | S H E | P R A Y E D | +O H | Y O U | S I M P L E T O N | S A I D | S H E | T H E N | W E | M U S T | A L L | F O U R | D I E | O F | H U N G E R | Y O U | H A D | B E T T E R | P L A N E | T H E | C O F F I N S | F O R | U S | +T H E N | T H E Y | B E G A N | T O | R U N | A N D | R U S H I N G | I N T O | T H E | H O U S E | T H E Y | F E L L | U P O N | T H E I R | F A T H E R ' S | N E C K | +G R E T H E L | S H E | C R I E D | I N | A | P A S S I O N | G E T | S O M E | W A T E R | Q U I C K L Y | B E | H A N S E L | F A T | O R | L E A N | T H I S | M O R N I N G | I | W I L L | K I L L | A N D | C O O K | H I M | +H E | H A D | L I T T L E | E N O U G H | T O | B R E A K | O R | B I T E | A N D | O N C E | W H E N | T H E R E | W A S | A | G R E A T | F A M I N E | I N | T H E | L A N D | H E | C O U L D | H A R D L Y | P R O C U R E | E V E N | H I S | D A I L Y | B R E A D | A N D | A S | H E | L A Y | T H I N K I N G | I N | H I S | B E D | O N E | N I G H T | H E | S I G H E D | A N D | S A I D | T O | H I S | W I F E | W H A T | W I L L | B E C O M E | O F | U S | +H O W | C A N | W E | F E E D | O U R | C H I L D R E N | W H E N | W E | H A V E | N O | M O R E | T H A N | W E | C A N | E A T | O U R S E L V E S | +C O M E | I N | A N D | S T O P | W I T H | M E | A N D | N O | H A R M | S H A L L | C O M E | T O | Y O U | A N D | S O | S A Y I N G | S H E | T O O K | T H E M | B O T H | B Y | T H E | H A N D | A N D | L E D | T H E M | I N T O | H E R | C O T T A G E | +S E E | I | C O U L D | E V E N | G E T | I N | M Y S E L F | +A N D | N O W | A S | T H E R E | W A S | N O T H I N G | T O | F E A R | T H E Y | W E N T | B A C K | T O | T H E | W I T C H ' S | H O U S E | W H E R E | I N | E V E R Y | C O R N E R | W E R E | C A S K E T S | F U L L | O F | P E A R L S | A N D | P R E C I O U S | S T O N E S | +B U T | H E R | H U S B A N D | F E L T | H E A V Y | A T | H E A R T | A N D | T H O U G H T | I T | W E R E | B E T T E R | T O | S H A R E | T H E | L A S T | C R U S T | W I T H | T H E | C H I L D R E N | +B U T | I N | R E A L I T Y | H A N S E L | W A S | N O T | L O O K I N G | A T | A | C A T | B U T | E V E R Y | T I M E | H E | S T O P P E D | H E | D R O P P E D | A | P E B B L E | O U T | O F | H I S | P O C K E T | U P O N | T H E | P A T H | +T H E | O L D | W O M A N | B E H A V E D | V E R Y | K I N D L Y | T O | T H E M | B U T | I N | R E A L I T Y | S H E | W A S | A | W I C K E D | O L D | W I T C H | W H O | W A Y | L A I D | C H I L D R E N | A N D | B U I L T | T H E | B R E A D H O U S E | I N | O R D E R | T O | E N T I C E | T H E M | I N | B U T | A S | S O O N | A S | T H E Y | W E R E | I N | H E R | P O W E R | S H E | K I L L E D | T H E M | C O O K E D | A N D | A T E | T H E M | A N D | M A D E | A | G R E A T | F E S T I V A L | O F | T H E | D A Y | +G R E T H E L | B E G A N | T O | C R Y | B U T | I T | W A S | A L L | U S E L E S S | F O R | T H E | O L D | W I T C H | M A D E | H E R | D O | A S | S H E | W A N T E D | +T H A T | N I G H T | T H E | E N E M Y | S L I P P E D | A W A Y | L E A V I N G | H U N D R E D S | A N D | H U N D R E D S | O F | H I S | D E A D | A N D | W O U N D E D | O N | T H E | F I E L D | +T H E R E | W E R E | N O | B R E A S T W O R K S | Y E T | T H A T | O N E | L I T T L E | B R I G A D E | O F | H A M I L T O N ' S | D I V I S I O N | S T O O D | T H E R E | I N | T H E | O P E N | A N D | R E P U L S E D | A S S A U L T | A F T E R | A S S A U L T | +I T | R E Q U I R E D | M O N T H S | A N D | G R E A T | E V E N T S | T O | M A K E | G R A N T | T H E | H E R O | O F | T H E | A R M Y | W H I C H | H E | A F T E R W A R D | B E C A M E | +F O R | S O M E | R E A S O N | T H E | D E A D | A T | H A T C H I E | B R I D G E | W E R E | N O T | B U R I E D | +I | C O U L D | N O T | H E L P | M Y | F R I E N D | +O N C E | I N | T H E | N I G H T | I | S L I P P E D | A W A Y | F R O M | T H E | B I V O U A C | A N D | H U R R I E D | T O | T H E | O L D | T I S H I M I N G O | H O T E L | T O | S E E | A | L I E U T E N A N T | O F | M Y | C O M P A N Y | W H O | H A D | B E E N | S H O T | T H R O U G H | T H E | B R E A S T | +O U R | B R I G A D E | W A S | F E A R F U L L Y | O U T N U M B E R E D | +I | H A S T E N E D | B A C K | T O | T H E | L I N E S | +F I F T E E N | O F F I C E R S | O F | O U R | L I T T L E | H A L F | R E G I M E N T | W E R E | D E A D | O R | W O U N D E D | +T H A T | N I G H T | I | S T O O D | G U A R D | U N D E R | A N | O A K | T R E E | O N | T H E | B A T T L E F I E L D | A M O N G | T H E | U N B U R I E D | D E A D | +W H E N | M O R N I N G | C A M E | T H E | F I R I N G | O P E N E D | A N D | F O R | A L L | T H A T | D A Y | T H E | B A T T L E | R A G E D | F I E R C E L Y | A T | T H E | L E F T | A N D | C E N T E R | L E F T | W E | G E T T I N G | T H E | W O R S T | O F | I T | T O O | +A | P E R F E C T | B L A Z E | O F | C L O S E | R A N G E | M U S K E T R Y | T O O | M O W E D | T H E M | D O W N | L I K E | G R A S S | +G O | B A C K | T O | T H E | R E G I M E N T | H E | S A I D | S M I L I N G | A L L | W I L L | B E | N E E D E D | +G R A N T | W A S | O N L Y | A | F E W | M I L E S | A W A Y | B U T | A L T H O U G H | C O M M A N D E R | I N | C H I E F | H E | K N E W | N O T H I N G | O F | T H E | H A R D E S T | F O U G H T | B A T T L E | O F | T H E | C I V I L | W A R | U N T I L | I T | W A S | O V E R | +R O S E C R A N S | P R O T E S T E D | I T | W A S | I N | V A I N | +T H E | C L O U D | O F | R E B E L S | W E | H A D | S E E N | D I V I D E D | I T S E L F | I N T O | T H R E E | C O L U M N S | +N O | B A T T E R Y | I N | T H E | W H O L E | F O U R | Y E A R S | W A R | L O S T | S O | M A N Y | M E N | I N | S O | S H O R T | A | T I M E | +I T | W A S | N O T | A | Q U E S T I O N | W H O | W A S | D E A D | O R | W O U N D E D | B U T | W H O | W A S | N O T | +A | W E E K | A F T E R | T H E | B A T T L E | M Y | B R O T H E R | R O D E | B Y | T H E R E | O N | A | C A V A L R Y | E X P E D I T I O N | A N D | M A D E | T H E | H O R R I B L E | D I S C O V E R Y | T H A T | H O G S | W E R E | E A T I N G | U P | T H E | B O D I E S | O F | O U R | D E A D | H E R O E S | T H A T | T O O | W A S | W A R | +N O T | B A L A K L A V A | N O R | T H E | A L M A | S A W | S U C H | F I G H T I N G | I T | W A S | A | D U E L | T O | T H E | D E A T H | +H E | S U R V I V E D | T H E | W A R | O N L Y | T O | B E | M U R D E R E D | L A T E R | O N | A | P L A N T A T I O N | I N | M I S S I S S I P P I | +M Y | O W N | R E G I M E N T | W A S | I N | T H E | A D V A N C E | +M Y | F R I E N D | W I T H | M A N Y | O T H E R S | W A S | B E I N G | C A R R I E D | O U T | T O | D I E | E L S E W H E R E | +O N E | D A R I N G | R E B E L | W A S | S H O T | D O W N | A N D | B A Y O N E T E D | C L E A R | B E H I N D | T H E | L I N E | O F | C O M P A N Y | B | W H E R E | H E | H A D | B R O K E N | T H R O U G H | T O | S E I Z E | T H E | F L A G | O F | M Y | R E G I M E N T | +I N D E E D | W E | O F | T H E | R A N K | A N D | F I L E | H A D | L I T T L E | C O N F I D E N C E | I N | G R A N T | I N | T H O S E | D A Y S | +U N D E R | T H E | S A M E | Q U I E T | M O O N L I G H T | A N D | O N L Y | S I X | H U N D R E D | Y A R D S | A W A Y | F R O M | U S | A L S O | L A Y | T H E | V I C T O R I O U S | R E B E L | A R M Y | +W I T H | A | F E W | L A N T E R N S | O U R | M E N | T H E N | W E N T | A B O U T | A N D | T R I E D | T O | G A T H E R | U P | T H E | W O U N D E D | T H E | D E A D | W E R E | L E F T | T I L L | M O R N I N G | +T H E Y | L A Y | I N | H E A P S | O F | D O Z E N S | E V E N | C L O S E | U P | T O | T H E | W O R K S | +I | R E M A I N E D | A W A K E | A L L | N I G H T | T A L K I N G | W I T H | A | C O M R A D E | W H O | S H A R E D | M Y | B L A N K E T | W I T H | M E | P O O R | J I M M Y | K I N G | +T H A T | E V E N I N G | A N | O R D E R | C A M E | F O R | U S | H A M I L T O N ' S | D I V I S I O N | T O | A S S A U L T | T H E | E N E M Y ' S | L E F T | F L A N K | A T | M I D N I G H T | +H E | I S | O L D | A S | W E L L | A S | P O O R | S H E | S A I D | +A L L | M Y | W O R R I E S | A B O U T | Y O U | W E R E | F O O L I S H | +T H E | C R I E S | A N D | C U R S E S | O F | T H E | R O B B E R S | F I L L E D | T H E | A I R | +P E R H A P S | Y O U | C A N | O U T W I T | H E R | Y E T | C R I E D | A N O T H E R | +H O W E V E R | I N | S P I T E | O F | A L L | S H E | C O U L D | S A Y | T H E | E L D E R | S I S T E R S | O P E N E D | T H E | D O O R | A N D | A D M I T T E D | T H E | B E G G A R | +T H E | T W O | E L D E S T | A T E | T H E I R | A P P L E S | B U T | T H E | Y O U N G E S T | C O U L D | N O T | E A T | T H A T | N I G H T | S H E | T H R E W | T H E | A P P L E | A W A Y | +E V E R Y | Y E A R | A T | A | C E R T A I N | D A Y | O F | A | C E R T A I N | M O N T H | H E | W E N T | A W A Y | T O | A | D I S T A N T | C I T Y | T O | C O L L E C T | M O N E Y | O N | A N | A C C O U N T | +Y O U | S H A L L | N O T | C O M E | I N T O | M Y | F A T H E R ' S | H O U S E | +I T | I S | A | F E A R F U L | N I G H T | T O | S E N D | A W A Y | A | B E G G A R | S A I D | T H E | E L D E S T | S I S T E R | W H I L E | T H E Y | W E R E | E A T I N G | +L O N G | A G O | T H E R E | L I V E D | A | M E R C H A N T | W H O | H A D | T H R E E | D A U G H T E R S | +T H E | M E R C H A N T ' S | D A U G H T E R | A T | F I R S T | D I D | N O T | A N S W E R | B U T | A S | H E | K E P T | O N | C A L L I N G | T O | H E R | S H E | F I N A L L Y | A S K E D | H I M | W H A T | I T | W A S | T H A T | H E | W A N T E D | +I F | W E | D E C I D E | T O | S H O W | M E R C Y | T O | T H I S | P O O R | B E G G A R | I T | I S | N O T | F O R | Y O U | T O | O P P O S E | I T | +I T ' S | S U R E L Y | A | T E R R I B L E | S T O R M | O U T S I D E | S A I D | T H E | M E R C H A N T ' S | E L D E S T | D A U G H T E R | A S | T H E | W I N D | R A T T L E D | T H E | T I L E S | O F | T H E | R O O F | A N D | T H E | R A I N | B E A T | I N | T O R R E N T S | A G A I N S T | T H E | D O O R S | A N D | W I N D O W S | +W H I L E | T H E Y | W E R E | T A L K I N G | T H E | B E G G A R | H A D | T A K E N | T H E | A P P L E S | W H I C H | T H E | G I R L S | W E R E | T O | E A T | F O R | D E S S E R T | A N D | H A D | S P R I N K L E D | A | S L E E P I N G | P O W D E R | O V E R | T H E M | +B U I | W E | S H O U L D | N O T | F O R G E T | O U R | P R O M I S E | T O | O U R | F A T H E R | C R I E D | T H E | Y O U N G E S T | D A U G H T E R | +T H E Y | T R I E D | I N | V A I N | T O | B R E A K | D O W N | T H E | G R E A T | D O O R S | +I | P R O M I S E | Y O U | I | W I L L | D O | Y O U | N O | H A R M | +I T | W A S | T H E | Y O U N G E S T | O N E | W H O | D E C E I V E D | M E | C R I E D | T H E | R O B B E R | C H I E F T A I N | +H A V E | P I T Y | U P O N | A | P O O R | U N F O R T U N A T E | O N E | H E | C A L L E D | O U T | +T H E N | S H E | H E A R D | H I M | G O | D O W N | T H E | S T A I R W A Y | A N D | U N B O L T | T H E | H E A V Y | D O O R S | W H I C H | L E D | I N T O | T H E | S T O R E | +W H E N | I T | W A S | E V E N I N G | H E | L E D | H I S | B A N D | I N T O | A | N E A R B Y | S T R E E T | A N D | I N | H I S | D I S G U I S E | A P P R O A C H E D | T H E | M E R C H A N T ' S | H O U S E | H E | K N O C K E D | A T | T H E | D O O R | +P A S S | T H E | C H A R M | O U T | T O | M E | T H E N | S A I D | T H E | R O B B E R | +W H E N | S H E | R E T U R N E D | H I S | H A N D | W A S | S T I C K I N G | T H R O U G H | T H E | H O L E | I N | T H E | D O O R | +S H E | D I D | N O T | S T I R | A N D | H E | K N E W | T H A T | T H E | S L E E P I N G | P O W D E R | H A D | T H O R O U G H L Y | D O N E | I T S | W O R K | +L E T | M E | E N T E R | I | P R A Y | Y O U | T O | P A S S | T H E | N I G H T | U N D E R | Y O U R | R O O F | +H O W | D O | Y O U | K N O W | A S K E D | T H E I R | F A T H E R | I | A M | O L D E R | A N D | W I S E R | T H A N | Y O U | A R E | A N D | I | K N O W | T H A T | T H E R E | A R E | M A N Y | E V I L S | W H I C H | M I G H T | C O M E | U P O N | Y O U | +W H E N | A N | A R I S T O C R A C Y | C A R R I E S | O N | T H E | P U B L I C | A F F A I R S | I T S | N A T I O N A L | P R I D E | N A T U R A L L Y | A S S U M E S | T H I S | R E S E R V E D | I N D I F F E R E N T | A N D | H A U G H T Y | F O R M | W H I C H | I S | I M I T A T E D | B Y | A L L | T H E | O T H E R | C L A S S E S | O F | T H E | N A T I O N | +T H E Y | T H E R E F O R E | E N T E R T A I N | A | C A L M | S E N S E | O F | T H E I R | S U P E R I O R I T Y | T H E Y | D O | N O T | D R E A M | O F | V A U N T I N G | P R I V I L E G E S | W H I C H | E V E R Y O N E | P E R C E I V E S | A N D | N O | O N E | C O N T E S T S | A N D | T H E S E | T H I N G S | A R E | N O T | S U F F I C I E N T L Y | N E W | T O | T H E M | T O | B E | M A D E | T O P I C S | O F | C O N V E R S A T I O N | +T H E N | T H E R E | A R E | I N | A L L | C L A S S E S | A | V E R Y | L A R G E | N U M B E R | O F | M E N | C O N S T A N T L Y | O C C U P I E D | W I T H | T H E | S E R I O U S | A F F A I R S | O F | T H E | G O V E R N M E N T | A N D | T H O S E | W H O S E | T H O U G H T S | A R E | N O T | E N G A G E D | I N | T H E | D I R E C T I O N | O F | T H E | C O M M O N W E A L T H | A R E | W H O L L Y | E N G R O S S E D | B Y | T H E | A C Q U I S I T I O N | O F | A | P R I V A T E | F O R T U N E | +I | D O | N O T | B E L I E V E | I N | S U C H | R E P U B L I C S | A N Y | M O R E | T H A N | I N | T H A T | O F | P L A T O | O R | I F | T H E | T H I N G S | W E | R E A D | O F | R E A L L Y | H A P P E N E D | I | D O | N O T | H E S I T A T E | T O | A F F I R M | T H A T | T H E S E | S U P P O S E D | D E M O C R A C I E S | W E R E | C O M P O S E D | O F | V E R Y | D I F F E R E N T | E L E M E N T S | F R O M | O U R S | A N D | T H A T | T H E Y | H A D | N O T H I N G | I N | C O M M O N | W I T H | T H E | L A T T E R | E X C E P T | T H E I R | N A M E | +I F | I | A P P L A U D | T H E | F R E E D O M | W H I C H | I T S | I N H A B I T A N T S | E N J O Y | H E | A N S W E R S | F R E E D O M | I S | A | F I N E | T H I N G | B U T | F E W | N A T I O N S | A R E | W O R T H Y | T O | E N J O Y | I T | +I F | I | S A Y | T O | A N | A M E R I C A N | T H A T | T H E | C O U N T R Y | H E | L I V E S | I N | I S | A | F I N E | O N E | A Y | H E | R E P L I E S | T H E R E | I S | N O T | I T S | F E L L O W | I N | T H E | W O R L D | +I N | A R I S T O C R A C I E S | E V E R Y | M A N | H A S | O N E | S O L E | O B J E C T | W H I C H | H E | U N C E A S I N G L Y | P U R S U E S | B U T | A M O N G S T | D E M O C R A T I C | N A T I O N S | T H E | E X I S T E N C E | O F | M A N | I S | M O R E | C O M P L E X | T H E | S A M E | M I N D | W I L L | A L M O S T | A L W A Y S | E M B R A C E | S E V E R A L | O B J E C T S | A T | T H E | S A M E | T I M E | A N D | T H E S E | O B J E C T S | A R E | F R E Q U E N T L Y | W H O L L Y | F O R E I G N | T O | E A C H | O T H E R | A S | I T | C A N N O T | K N O W | T H E M | A L L | W E L L | T H E | M I N D | I S | R E A D I L Y | S A T I S F I E D | W I T H | I M P E R F E C T | N O T I O N S | O F | E A C H | +I N | A R I S T O C R A T I C | C O M M U N I T I E S | T H E | P E O P L E | R E A D I L Y | G I V E | T H E M S E L V E S | U P | T O | B U R S T S | O F | T U M U L T U O U S | A N D | B O I S T E R O U S | G A Y E T Y | W H I C H | S H A K E | O F F | A T | O N C E | T H E | R E C O L L E C T I O N | O F | T H E I R | P R I V A T I O N S | T H E | N A T I V E S | O F | D E M O C R A C I E S | A R E | N O T | F O N D | O F | B E I N G | T H U S | V I O L E N T L Y | B R O K E N | I N | U P O N | A N D | T H E Y | N E V E R | L O S E | S I G H T | O F | T H E I R | O W N | S E L V E S | W I T H O U T | R E G R E T | +T H E S E | P E R S O N S | T H E N | D I S P L A Y E D | T O W A R D S | E A C H | O T H E R | P R E C I S E L Y | T H E | S A M E | P U E R I L E | J E A L O U S I E S | W H I C H | A N I M A T E | T H E | M E N | O F | D E M O C R A C I E S | T H E | S A M E | E A G E R N E S S | T O | S N A T C H | T H E | S M A L L E S T | A D V A N T A G E S | W H I C H | T H E I R | E Q U A L S | C O N T E S T E D | A N D | T H E | S A M E | D E S I R E | T O | P A R A D E | O S T E N T A T I O U S L Y | T H O S E | O F | W H I C H | T H E Y | W E R E | I N | P O S S E S S I O N | +T H E Y | S T A N D | U N M O V E D | I N | T H E I R | S O L I T A R Y | G R E A T N E S S | W E L L | A S S U R E D | T H A T | T H E Y | A R E | S E E N | O F | A L L | T H E | W O R L D | W I T H O U T | A N Y | E F F O R T | T O | S H O W | T H E M S E L V E S | O F F | A N D | T H A T | N O | O N E | W I L L | A T T E M P T | T O | D R I V E | T H E M | F R O M | T H A T | P O S I T I O N | +T H E | A M E R I C A N S | I N | T H E I R | I N T E R C O U R S E | W I T H | S T R A N G E R S | A P P E A R | I M P A T I E N T | O F | T H E | S M A L L E S T | C E N S U R E | A N D | I N S A T I A B L E | O F | P R A I S E | +I N | A R I S T O C R A T I C | C O U N T R I E S | T H E | G R E A T | P O S S E S S | I M M E N S E | P R I V I L E G E S | U P O N | W H I C H | T H E I R | P R I D E | R E S T S | W I T H O U T | S E E K I N G | T O | R E L Y | U P O N | T H E | L E S S E R | A D V A N T A G E S | W H I C H | A C C R U E | T O | T H E M | +A N | A M E R I C A N | I N S T E A D | O F | G O I N G | I N | A | L E I S U R E | H O U R | T O | D A N C E | M E R R I L Y | A T | S O M E | P L A C E | O F | P U B L I C | R E S O R T | A S | T H E | F E L L O W S | O F | H I S | C A L L I N G | C O N T I N U E | T O | D O | T H R O U G H O U T | T H E | G R E A T E R | P A R T | O F | E U R O P E | S H U T S | H I M S E L F | U P | A T | H O M E | T O | D R I N K | +C H A P T E R | S I X T E E N | W H Y | T H E | N A T I O N A L | V A N I T Y | O F | T H E | A M E R I C A N S | I S | M O R E | R E S T L E S S | A N D | C A P T I O U S | T H A N | T H A T | O F | T H E | E N G L I S H | +I | B E L I E V E | T H E | S E R I O U S N E S S | O F | T H E | A M E R I C A N S | A R I S E S | P A R T L Y | F R O M | T H E I R | P R I D E | +T H I S | I S | M O R E | E S P E C I A L L Y | T H E | C A S E | A M O N G S T | T H O S E | F R E E | N A T I O N S | W H I C H | F O R M | D E M O C R A T I C | C O M M U N I T I E S | +I | T O L D | T O M | W E | S H O U L D N ' T | C O M E | S O | L A T E | S A Y S | H I L D A | +R I G H T | A W A Y | W H E N | I | B R I N G | H O M E | M Y | N E W | P R O G R A M | H E | S A Y S | H O W | C O M E | Y O U ' R E | T A K I N G | O N E | L E S S | C O U R S E | T H I S | H A L F | +I T ' S | Y O U R | F A U L T | M O P | I T | U P | Y O U R S E L F | +Y O U ' R E | G E T T I N G | A L T O G E T H E R | T O O | U P S E T | A B O U T | T H E S E | P R O G R A M S | S T O P | I T | A N D | B E H A V E | Y O U R S E L F | +T O M | S A Y S | T H A N K S | A N D | L O O K S | A T | H I L D A | A N D | S H E | B L U S H E S | R E A L L Y | +B E S I D E S | S A Y S | T O M | H A L F | T H E | R E A S O N | Y O U | A N D | Y O U R | F A T H E R | A R E | A L W A Y S | B I C K E R I N G | I S | T H A T | Y O U ' R E | S O | M U C H | A L I K E | M E | L I K E | H I M | S U R E | +P O P | I T ' S | A | C O U R S E | +S O M E H O W | O R | O T H E R | C A T | H A S | T A U G H T | T H E M | T H A T | H E ' S | I N | C H A R G E | H E R E | A N D | H E | J U S T | C H A S E S | T H E M | F O R | F U N | N O W | A N D | A G A I N | W H E N | H E ' S | N O T | B U S Y | S L E E P I N G | +I ' L L | B E | L U C K Y | I F | I | H A V E | T I M E | T O | B R E A T H E | +P O P | G O E S | R I G H T | O N | T U N I N G | H I S | C H A N N E L | +T O M | D R I N K S | A | L I T T L E | M O R E | C O F F E E | A N D | T H E N | H E | G O E S | O N | T H E | T R O U B L E | I S | I | C A N ' T | G E T | M A R R I E D | O N | T H I S | F L O W E R | S H O P | J O B | +S O M E T I M E S | S C H O O L S | D O | L E T | K I D S | T A K E | A | L O T | O F | S O F T | C O U R S E S | A N D | T H E N | T H E Y ' R E | O U T | O N | A | L I M B | L A T E R | H U H | +H E | D O E S | A N D | F O R | O N C E | I | W I N | A | R O U N D | I | K E E P | M U S I C | F O R | T H I S | S E M E S T E R | +I | E X P L A I N | T H A T | I ' M | T A K I N G | M U S I C | A N D | A L S O | B I O L O G Y | A L G E B R A | E N G L I S H | A N D | F R E N C H | M U S I C | H E | S N O R T S | +W H E N | A R E | Y O U | G E T T I N G | R I D | O F | T H E S E | C A T S | I ' M | N O T | F I X I N G | T O | S T A R T | A N | A N N E X | T O | K A T E ' S | C A T | H O M E | +I T ' S | T H E | F I R S T | T I M E | H I L D A | H A S | B E E N | T O | O U R | H O U S E | A N D | T O M | I N T R O D U C E S | H E R | A R O U N D | +I | H E A R | T H E | T | V | G O I N G | F O R | A | F E W | M I N U T E S | T H E N | P O P | T U R N S | I T | O F F | A N D | G O E S | I N | T H E | K I T C H E N | T O | T A L K | T O | M O M | +I | L O O K | A T | M Y | W A T C H | I T ' S | A | Q U A R T E R | T O | E L E V E N | +I | G E T | T H E | P I L L O W S | C O M F O R T A B L Y | A R R A N G E D | O N | T H E | F L O O R | W I T H | A | B I G | B O T T L E | O F | S O D A | A N D | A | B A G | O F | P O P C O R N | W I T H I N | E A S Y | R E A C H | +A S | L O N G | A S | T H E R E ' S | A | B O N E | O N | T H E | F L O O R | T H E | T W O | O F | Y O U | W O R R Y | I T | +I | T U R N | O F F | T H E | T E L E V I S I O N | S E T | I ' V E | L O S T | T R A C K | O F | W H A T ' S | H A P P E N I N G | A N D | I T | D O E S N ' T | S E E M | T O | B E | T H E | G R A N D F A T H E R | W H O ' S | T H E | S P O O K | A F T E R | A L L | +W E L L | I | D O N ' T | T H I N K | Y O U | S H O U L D | T U R N | A | G U Y ' S | T | V | P R O G R A M | O F F | I N | T H E | M I D D L E | W I T H O U T | E V E N | F I N D I N G | O U T | A B O U T | I T | +H E R E ' S | T O | Y O U | A | L O N G | H A P P Y | L I F E | +I ' L L | H A V E | T O | C H E C K | S O M E | M O R E | S A Y S | T O M | +Y O U | K N O W | I ' D | G E T | D R A F T E D | I N | A | Y E A R | O R | T W O | A N Y W A Y | +T H E | T W O | S T R A Y | K I T T E N S | G R A D U A L L Y | M A K E | T H E M S E L V E S | A T | H O M E | +S H E | D O E S N ' T | P I C K | T H E M | U P | B U T | J U S T | H A V I N G | T H E M | I N | T H E | R O O M | S U R E | D O E S N ' T | G I V E | H E R | A S T H M A | +S O | H E | C A R E S | H U H | +I ' V E | D E C I D E D | T O | E N L I S T | I N | T H E | A R M Y | +T H E | W I N D | W A S | S O | S T R O N G | T H A T | I | H A D | T O | H O L D | M Y | H A T | O N | A N D | T H E | G I R L S | S K I R T S | W E R E | B L O W N | O U T | B E F O R E | T H E M | +H E | W A S | B O R N | L I K E | T H A T | T H E | O T H E R S | A R E | S M A R T | +S H E | L O O K E D | A T | M E | H E R | E Y E S | F A I R L Y | B L A Z I N G | W I T H | T H I N G S | S H E | C O U L D | N O T | S A Y | +A T | T H A T | M O M E N T | T H E | F A T H E R | C A M E | O U T | O F | T H E | H O L E | I N | T H E | B A N K | +M Y | G R A N D M O T H E R | A L W A Y S | S P O K E | I N | A | V E R Y | L O U D | T O N E | T O | F O R E I G N E R S | A S | I F | T H E Y | W E R E | D E A F | +P R E S E N T L Y | A G A I N S T | O N E | O F | T H O S E | B A N K S | I | S A W | A | S O R T | O F | S H E D | T H A T C H E D | W I T H | T H E | S A M E | W I N E | C O L O R E D | G R A S S | T H A T | G R E W | E V E R Y W H E R E | +I | N O T I C E D | H O W | W H I T E | A N D | W E L L | S H A P E D | H I S | O W N | H A N D S | W E R E | +I | R E M E M B E R E D | W H A T | T H E | C O N D U C T O R | H A D | S A I D | A B O U T | H E R | E Y E S | +S H E | W A S | Q U I C K | A N D | V E R Y | E A G E R | +A F T E R | A N T O N I A | H A D | S A I D | T H E | N E W | W O R D S | O V E R | A N D | O V E R | S H E | W A N T E D | T O | G I V E | M E | A | L I T T L E | C H A S E D | S I L V E R | R I N G | S H E | W O R E | O N | H E R | M I D D L E | F I N G E R | +V E R Y | G L A D | V E R Y | G L A D | S H E | E J A C U L A T E D | +W E | S T O O D | P A N T I N G | O N | T H E | E D G E | O F | T H E | R A V I N E | L O O K I N G | D O W N | A T | T H E | T R E E S | A N D | B U S H E S | T H A T | G R E W | B E L O W | U S | +A M B R O S C H | H E | M A K E | G O O D | F A R M E R | +S H E | P O I N T E D | I N T O | T H E | G O L D | C O T T O N W O O D | T R E E | B E H I N D | W H O S E | T O P | W E | S T O O D | A N D | S A I D | A G A I N | W H A T | N A M E | +W E | W E R E | S O | D E E P | I N | T H E | G R A S S | T H A T | W E | C O U L D | S E E | N O T H I N G | B U T | T H E | B L U E | S K Y | O V E R | U S | A N D | T H E | G O L D | T R E E | I N | F R O N T | O F | U S | +I T | W A S | S O | L O N G | T H A T | I T | B U S H E D | O U T | B E H I N D | H I S | E A R S | A N D | M A D E | H I M | L O O K | L I K E | T H E | O L D | P O R T R A I T S | I | R E M E M B E R E D | I N | V I R G I N I A | +S H E | M A D E | M I S S U S | S H I M E R D A | U N D E R S T A N D | T H E | F R I E N D L Y | I N T E N T I O N | O F | O U R | V I S I T | A N D | T H E | B O H E M I A N | W O M A N | H A N D L E D | T H E | L O A V E S | O F | B R E A D | A N D | E V E N | S M E L L E D | T H E M | A N D | E X A M I N E D | T H E | P I E S | W I T H | L I V E L Y | C U R I O S I T Y | E X C L A I M I N G | M U C H | G O O D | M U C H | T H A N K | +E V E N | F R O M | A | D I S T A N C E | O N E | C O U L D | S E E | T H A T | T H E R E | W A S | S O M E T H I N G | S T R A N G E | A B O U T | T H I S | B O Y | +S H E | G O T | U P | O N | H E R | K N E E S | A N D | W R U N G | H E R | H A N D S | +Y O U ' L L | G E T | F I X E D | U P | C O M F O R T A B L E | A F T E R | W H I L E | M I S S U S | S H I M E R D A | M A K E | G O O D | H O U S E | +W H E N | I | C A M E | U P | H E | T O U C H E D | M Y | S H O U L D E R | A N D | L O O K E D | S E A R C H I N G L Y | D O W N | I N T O | M Y | F A C E | F O R | S E V E R A L | S E C O N D S | +A N T O N I A | P O I N T E D | U P | T O | T H E | S K Y | A N D | Q U E S T I O N E D | M E | W I T H | H E R | G L A N C E | +O C C A S I O N A L L Y | O N E | O F | T H E | H O R S E S | W O U L D | T E A R | O F F | W I T H | H I S | T E E T H | A | P L A N T | F U L L | O F | B L O S S O M S | A N D | W A L K | A L O N G | M U N C H I N G | I T | T H E | F L O W E R S | N O D D I N G | I N | T I M E | T O | H I S | B I T E S | A S | H E | A T E | D O W N | T O W A R D | T H E M | +N O W | W H Y | I S | T H A T | O T T O | +T H E | F A M I L Y | H A D | B E E N | L I V I N G | O N | C O R N C A K E S | A N D | S O R G H U M | M O L A S S E S | F O R | T H R E E | D A Y S | +H E | S T R U C K | A M B R O S C H | O N | T H E | B A C K | A N D | T H E | B O Y | S M I L E D | K N O W I N G L Y | +I | B E C A M E | S O M E W H A T | E M B A R R A S S E D | F O R | I | W A S | U S E D | T O | B E I N G | T A K E N | F O R | G R A N T E D | B Y | M Y | E L D E R S | +F U C H S | B R O U G H T | U P | A | S A C K | O F | P O T A T O E S | A N D | A | P I E C E | O F | C U R E D | P O R K | F R O M | T H E | C E L L A R | A N D | G R A N D M O T H E R | P A C K E D | S O M E | L O A V E S | O F | S A T U R D A Y ' S | B R E A D | A | J A R | O F | B U T T E R | A N D | S E V E R A L | P U M P K I N | P I E S | I N | T H E | S T R A W | O F | T H E | W A G O N | B O X | +I T ' S | N O | B E T T E R | T H A N | A | B A D G E R | H O L E | N O | P R O P E R | D U G O U T | A T | A L L | +W E E K | F O L L O W E D | W E E K | T H E S E | T W O | B E I N G S | L E D | A | H A P P Y | L I F E | I N | T H A T | H O V E L | +H E | P A S S E D | H O U R S | I N | W A T C H I N G | H E R | D R E S S I N G | A N D | U N D R E S S I N G | H E R | D O L L | A N D | I N | L I S T E N I N G | T O | H E R | P R A T T L E | +O N L Y | A S | H E | W A S | F I V E | A N D | F I F T Y | A N D | C O S E T T E | E I G H T | Y E A R S | O F | A G E | A L L | T H A T | M I G H T | H A V E | B E E N | L O V E | I N | T H E | W H O L E | C O U R S E | O F | H I S | L I F E | F L O W E D | T O G E T H E R | I N T O | A | S O R T | O F | I N E F F A B L E | L I G H T | +M O R E O V E R | J E A N | V A L J E A N | H A D | C H O S E N | H I S | R E F U G E | W E L L | +H E | H A D | R E T U R N E D | T O | P R I S O N | T H I S | T I M E | F O R | H A V I N G | D O N E | R I G H T | H E | H A D | Q U A F F E D | F R E S H | B I T T E R N E S S | D I S G U S T | A N D | L A S S I T U D E | W E R E | O V E R P O W E R I N G | H I M | E V E N | T H E | M E M O R Y | O F | T H E | B I S H O P | P R O B A B L Y | S U F F E R E D | A | T E M P O R A R Y | E C L I P S E | T H O U G H | S U R E | T O | R E A P P E A R | L A T E R | O N | L U M I N O U S | A N D | T R I U M P H A N T | B U T | A F T E R | A L L | T H A T | S A C R E D | M E M O R Y | W A S | G R O W I N G | D I M | +C O S E T T E | W A S | N O | L O N G E R | I N | R A G S | S H E | W A S | I N | M O U R N I N G | +W H E N | T H E S E | T W O | S O U L S | P E R C E I V E D | E A C H | O T H E R | T H E Y | R E C O G N I Z E D | E A C H | O T H E R | A S | N E C E S S A R Y | T O | E A C H | O T H E R | A N D | E M B R A C E D | E A C H | O T H E R | C L O S E L Y | +T H E | M A N | N O | L O N G E R | P R O D U C E D | O N | H E R | T H E | E F F E C T | O F | B E I N G | O L D | O R | P O O R | S H E | T H O U G H T | J E A N | V A L J E A N | H A N D S O M E | J U S T | A S | S H E | T H O U G H T | T H E | H O V E L | P R E T T Y | +H E | H A D | N E V E R | B E E N | F A T H E R | L O V E R | H U S B A N D | F R I E N D | +W H O | K N O W S | W H E T H E R | J E A N | V A L J E A N | H A D | N O T | B E E N | O N | T H E | E V E | O F | G R O W I N G | D I S C O U R A G E D | A N D | O F | F A L L I N G | O N C E | M O R E | +A L A S | H E | W A L K E D | W I T H | N O | L E S S | I N D E C I S I O N | T H A N | C O S E T T E | +T H E | B E S T | O F | U S | A R E | N O T | E X E M P T | F R O M | E G O T I S T I C A L | T H O U G H T S | +S H E | F E L T | T H A T | W H I C H | S H E | H A D | N E V E R | F E L T | B E F O R E | A | S E N S A T I O N | O F | E X P A N S I O N | +H I S | S I S T E R | A N D | H I S | S I S T E R ' S | C H I L D R E N | H A D | L E F T | H I M | O N L Y | A | V A G U E | A N D | F A R | O F F | M E M O R Y | W H I C H | H A D | F I N A L L Y | A L M O S T | C O M P L E T E L Y | V A N I S H E D | H E | H A D | M A D E | E V E R Y | E F F O R T | T O | F I N D | T H E M | A N D | N O T | H A V I N G | B E E N | A B L E | T O | F I N D | T H E M | H E | H A D | F O R G O T T E N | T H E M | +T H E | H E A R T | O F | T H A T | E X | C O N V I C T | W A S | F U L L | O F | V I R G I N I T Y | +N A T U R E | A | D I F F E R E N C E | O F | F I F T Y | Y E A R S | H A D | S E T | A | P R O F O U N D | G U L F | B E T W E E N | J E A N | V A L J E A N | A N D | C O S E T T E | D E S T I N Y | F I L L E D | I N | T H I S | G U L F | +C O S E T T E | O N | H E R | S I D E | H A D | A L S O | U N K N O W N | T O | H E R S E L F | B E C O M E | A N O T H E R | B E I N G | P O O R | L I T T L E | T H I N G | +T O | M E E T | W A S | T O | F I N D | E A C H | O T H E R | +H E | H A D | P A I D | H E R | S I X | M O N T H S | I N | A D V A N C E | A N D | H A D | C O M M I S S I O N E D | T H E | O L D | W O M A N | T O | F U R N I S H | T H E | C H A M B E R | A N D | D R E S S I N G | R O O M | A S | W E | H A V E | S E E N | +H E | W A S | T H A T | C H I L D ' S | S T A Y | A N D | S H E | W A S | H I S | P R O P | +A N D | T H E N | H E | T A L K E D | O F | H E R | M O T H E R | A N D | H E | M A D E | H E R | P R A Y | +H E | S U F F E R E D | A L L | T H E | P A N G S | O F | A | M O T H E R | A N D | H E | K N E W | N O T | W H A T | I T | M E A N T | F O R | T H A T | G R E A T | A N D | S I N G U L A R | M O V E M E N T | O F | A | H E A R T | W H I C H | B E G I N S | T O | L O V E | I S | A | V E R Y | O B S C U R E | A N D | A | V E R Y | S W E E T | T H I N G | +H E | P R O T E C T E D | H E R | A N D | S H E | S T R E N G T H E N E D | H I M | +W H A T | A L T E R N A T I V E | W A S | T H E R E | F O R | H E R | +A N D | A L R E A D Y | T H I S | A S T O U N D I N G | B L O W | B E G I N S | T O | T A K E | I T S | P L A C E | A M O N G | O T H E R | E V E N T S | A S | A | T H I N G | S T R A N G E | A N D | T E R R I B L E | I N D E E D | B U T | R E L A T E D | T O | A L L | T H E | S T R A N G E N E S S | A N D | M Y S T E R Y | O F | L I F E | P A R T | O F | T H E | U N I V E R S A L | M Y S T E R I E S | O F | D E S P A I R | A N D | F U T I L I T Y | A N D | D E A T H | T H A T | H A V E | T R O U B L E D | M Y | C O N S C I O U S N E S S | S I N C E | C H I L D H O O D | +I | B E C A M E | G R O T E S Q U E L Y | A N X I O U S | T O | A S S U R E | H I M | T H A T | I N D E E D | S H E | A N D | I | H A D | B E E N | A S | T H E Y | S A Y | I N N O C E N T | T H R O U G H O U T | O U R | L A S T | D A Y | T O G E T H E R | +S H E | W A S | D E S T R O Y E D | N O T | M E R E L Y | B Y | T H E | U N C O N S I D E R E D | U N D I S C I P L I N E D | P A S S I O N S | O F | H E R | H U S B A N D | A N D | H E R | L O V E R | B U T | B Y | T H E | V A S T | T R A D I T I O N | T H A T | S U S T A I N S | A N D | E N F O R C E S | T H E | S U B J U G A T I O N | O F | H E R | S E X | +I T | W A S | T H A T | I D E A | O F | W A S T E | T H A T | D O M I N A T E D | M Y | M I N D | I N | A | S T R A N G E | I N T E R V I E W | I | H A D | W I T H | J U S T I N | +I T | S E E M S | T O | M E | M O R E | A N D | M O R E | A S | I | L I V E | L O N G E R | T H A T | M O S T | P O E T R Y | A N D | M O S T | L I T E R A T U R E | A N D | P A R T I C U L A R L Y | T H E | L I T E R A T U R E | O F | T H E | P A S T | I S | D I S C O R D A N T | W I T H | T H E | V A S T N E S S | A N D | V A R I E T Y | T H E | R E S E R V E S | A N D | R E S O U R C E S | A N D | R E C U P E R A T I O N S | O F | L I F E | A S | W E | L I V E | I T | T O | D A Y | +W E | R A N G E | W I D E R | L A S T | L O N G E R | A N D | E S C A P E | M O R E | A N D | M O R E | F R O M | I N T E N S I T Y | T O W A R D S | U N D E R S T A N D I N G | +F O R | A | T I M E | T H E | D E A T H | O F | M A R Y | O B S C U R E D | H E R | L I F E | F O R | M E | B U T | N O W | H E R | L I V I N G | P R E S E N C E | I S | M O R E | I N | M Y | M I N D | A G A I N | +I F | W E | H A D | B E E N | B R O T H E R | A N D | S I S T E R | I N D E E D | T H E R E | W A S | N O T H I N G | +Y O U | W E R E | W R O N G | I N | A L L | T H A T | I | S A I D | S H E | K E P T | H E R | F A I T H | W I T H | Y O U | +H O W | W E | M U S T | S I M P L I F Y | +W E | N E V E R | P L A N N E D | T O | M E E T | A N D | W H E N | W E | M E T | +A N D | I T | I S | U P O N | T H I S | E F F E C T | O F | S W E E T | A N D | B E A U T I F U L | P O S S I B I L I T I E S | C A U G H T | I N | T H E | N E T | O F | A N I M A L | J E A L O U S I E S | A N D | T H O U G H T L E S S | M O T I V E S | A N D | A N C I E N T | R I G I D | I N S T I T U T I O N S | T H A T | I | W O U L D | E N D | T H I S | W R I T I N G | +B U T | N O W | I T | D O E S N ' T | S E E M | T O | M A T T E R | V E R Y | M U C H | +I T | I S | T H E | E X P R E S S I O N | O F | L I F E | U N D E R | C R U D E R | A N D | M O R E | R I G I D | C O N D I T I O N S | T H A N | O U R S | L I V E D | B Y | P E O P L E | W H O | L O V E D | A N D | H A T E D | M O R E | N A I V E L Y | A G E D | S O O N E R | A N D | D I E D | Y O U N G E R | T H A N | W E | D O | +I N | M A R Y | I T | S E E M S | T O | M E | I | F O U N D | B O T H | W O M A N H O O D | A N D | F E L L O W S H I P | I | F O U N D | W H A T | M A N Y | H A V E | D R E A M T | O F | L O V E | A N D | F R I E N D S H I P | F R E E L Y | G I V E N | A N D | I | C O U L D | D O | N O T H I N G | B U T | C L U T C H | A T | H E R | T O | M A K E | H E R | M Y | P O S S E S S I O N | +Y O U | S E E | T H E | T R E A T M E N T | I S | A | T R I F L E | F A N C I F U L | +B U T | I F | I | P L A Y | Y O U | A | R O U N D E L | L A D Y | G E T | M E | A | G I F T | F R O M | T H E | E M P E R O R ' S | D A U G H T E R | H E R | F I N G E R | R I N G | F O R | M Y | F I N G E R | B R I N G | T H O U G H | S H E ' S | P L E D G E D | A | T H O U S A N D | L E A G U E S | O V E R | T H E | W A T E R | L A D Y | L A D Y | M Y | F A I R | L A D Y | O | M Y | R O S E | W H I T E | L A D Y | +T H E | E M P E R O R ' S | D A U G H T E R | +T H E | L A D I E S | +L A D Y | L A D Y | M Y | R O S E | W H I T E | L A D Y | B U T | W I L L | Y O U | N O T | H E A R | A | R O U N D E L | L A D Y | +I ' L L | P L A Y | F O R | Y O U | N O W | N E A T H | T H E | A P P L E | B O U G H | A N D | Y O U | S H A L L | D R E A M | O N | T H E | L A W N | S O | S H A D Y | L A D Y | L A D Y | M Y | F A I R | L A D Y | O | M Y | A P P L E | G O L D | L A D Y | +O N C E | M O R E | T H E | S I N G E R | P L A Y S | A N D | T H E | L A D I E S | D A N C E | B U T | O N E | B Y | O N E | T H E Y | F A L L | A S L E E P | T O | T H E | D R O W S Y | M U S I C | A N D | T H E N | T H E | S I N G E R | S T E P S | I N T O | T H E | R I N G | A N D | U N L O C K S | T H E | T O W E R | A N D | K I S S E S | T H E | E M P E R O R ' S | D A U G H T E R | +B E D | T I M E | C H I L D R E N | +T H E | L A D I E S | I N | Y E L L O W | D R E S S E S | S T A N D | A G A I N | I N | A | R I N G | A B O U T | T H E | E M P E R O R ' S | D A U G H T E R | A N D | A R E | F O R | T H E | L A S T | T I M E | A C C O S T E D | B Y | T H E | S I N G E R | W I T H | H I S | L U T E | +T H E | W A N D E R I N G | S I N G E R | +S H E | W O U L D | N O T | S P E A K | T H O U G H | W E | D A N C E D | A | W E E K | W I T H | H E R | T H O U G H T S | A | T H O U S A N D | L E A G U E S | O V E R | T H E | W A T E R | S I N G E R | S I N G E R | W A N D E R I N G | S I N G E R | O | M Y | H O N E Y | S W E E T | S I N G E R | +I | D O N ' T | K N O W | W H A T | B E C O M E S | O F | T H E | L A D I E S | +B U T | T H I S | I S | A | F A L L A C Y | +B U T | I | D I D | O N C E | H A V E | T H E | L U C K | T O | H E A R | A N D | S E E | T H E | L A D Y | P L A Y E D | I N | E N T I R E T Y | T H E | C H I L D R E N | H A D | B E E N | G R A N T E D | L E A V E | T O | P L A Y | J U S T | O N E | M O R E | G A M E | B E F O R E | B E D | T I M E | A N D | O F | C O U R S E | T H E Y | C H O S E | T H E | L O N G E S T | A N D | P L A Y E D | I T | W I T H O U T | M I S S I N G | A | S Y L L A B L E | +F O R G O T T E N | T O O | T H E | N A M E | O F | G I L L I A N | T H E | L O V E L Y | C A P T I V E | +T H E | W A N D E R I N G | S I N G E R | A P P R O A C H E S | T H E M | W I T H | H I S | L U T E | +O | I F | Y O U | P L A Y | U S | A | R O U N D E L | S I N G E R | H O W | C A N | T H A T | H A R M | T H E | E M P E R O R ' S | D A U G H T E R | +N O W | Y O U | M A Y | P L A Y | A | S E R E N A | S I N G E R | A | D R E A M | O F | N I G H T | F O R | A N | A P P L E | G O L D | L A D Y | F O R | T H E | F R U I T | I S | N O W | O N | T H E | A P P L E | B O U G H | A N D | T H E | M O O N | I S | U P | A N D | T H E | L A W N | I S | S H A D Y | S I N G E R | S I N G E R | W A N D E R I N G | S I N G E R | O | M Y | H O N E Y | S W E E T | S I N G E R | +T H E | W A N D E R I N G | S I N G E R | +W O R S E | A N D | W O R S E | H E | I S | E V E N | P R E S U M E D | T O | B E | T H E | C A P T I V E ' S | S W E E T H E A R T | W H O | W H E E D L E S | T H E | F L O W E R | T H E | R I N G | A N D | T H E | P R I S O N | K E Y | O U T | O F | T H E | S T R I C T | V I R G I N S | F O R | H I S | O W N | P U R P O S E S | A N D | F L I E S | W I T H | H E R | A T | L A S T | I N | H I S | S H A L L O P | A C R O S S | T H E | S E A | T O | L I V E | W I T H | H E R | H A P P I L Y | E V E R | A F T E R | +I T | W A S | L O C K E D | F R O M | T H E | I N S I D E | A N D | W E | H A D | T O | B U R N | I T | D O W N | W I T H | A | T O R C H | T H A T ' S | W H E R E | T H E Y | A R E | +Y E S | C H A R C O A L | +T H E | D A I L Y | N E W S C A S T S | F R O M | T E R R A | S H O W E D | A | C O R R E S P O N D I N G | S H I F T | I N | I N T E R E S T | A T | H O M E | +W E L L | O F | C O U R S E | T H E Y ' R E | D E A D | W H A T | A | Q U E S T I O N | +B R I N G | I T | T O | T H E | P U B L I C | A T T E N T I O N | D R A M A T I Z E | I T | +T O N Y | L A T T I M E R | T H E | D I S C O V E R E R | W A S | B E G I N N I N G | T O | C A S H | I N | O N | H I S | A T T E N T I O N S | T O | G L O R I A | A N D | H I S | I N G R A T I A T I O N | W I T H | S I D | H E | W A S | A L W A Y S | E I T H E R | M A K I N G | V O I C E | A N D | I M A G E | T A L K S | F O R | T E L E C A S T | O R | L I S T E N I N G | T O | T H E | N E W S | F R O M | T H E | H O M E | P L A N E T | +T H A T | T O O K | T H E | C E N T E R | O F | I N T E R E S T | A W A Y | F R O M | A R C H A E O L O G Y | A N D | S T A R T E D | A | N E W | B U R S T | O F | A C T I V I T Y | +N O W | I T | W A S | B U R N E D | A W A Y | A T | B O T H | S I D E S | A N D | L A Y | S T I L L | H O T | A L O N G | T H E | E D G E S | O N | T H E | F L O O R | O F | T H E | B I G | O F F I C E | R O O M | I N | F R O N T | +T H E | T E R R A N | P U B L I C | W A N T E D | T O | H E A R | A B O U T | M A R T I A N S | A N D | I F | L I V E | M A R T I A N S | C O U L D N ' T | B E | F O U N D | A | R O O M | F U L L | O F | D E A D | O N E S | W A S | T H E | N E X T | B E S T | T H I N G | +A | F L O O D L I G H T | W A S | O N | I N | T H E | R O O M | I N S I D E | A N D | L A T T I M E R | W A S | G O I N G | A R O U N D | L O O K I N G | A T | T H I N G S | W H I L E | A | S P A C E | F O R C E | O F F I C E R | S T O O D | B Y | T H E | D O O R | +T H E Y | H A D | F O U R | O R | F I V E | S P E C I E S | O F | W H A T | M I G H T | L O O S E L Y | B E | C A L L E D | B I R D S | A N D | S O M E T H I N G | T H A T | C O U L D | E A S I L Y | B E | C L A S S E D | A S | A | R E P T I L E | A N D | A | C A R N I V O R O U S | M A M M A L | T H E | S I Z E | O F | A | C A T | W I T H | B I R D L I K E | C L A W S | A N D | A | H E R B I V O R E | A L M O S T | I D E N T I C A L | W I T H | T H E | P I G L I K E | T H I N G | I N | T H E | B I G | D A R F H U L V A | M U R A L | A N D | A N O T H E R | L I K E | A | G A Z E L L E | W I T H | A | S I N G L E | H O R N | I N | T H E | M I D D L E | O F | I T S | F O R E H E A D | +T H E | O R G A N I Z A T I O N | O F | A | S O C I E T Y | O F | M A R T I A N | A R C H A E O L O G Y | W I T H | A N T H O N Y | L A T T I M E R | P H | D | T H E | L O G I C A L | C A N D I D A T E | F O R | T H E | C H A I R | +B I L L | C H A N D L E R | T H E | Z O O L O G I S T | H A D | B E E N | G O I N G | D E E P E R | A N D | D E E P E R | I N T O | T H E | O L D | S E A | B O T T O M | O F | S Y R T I S | +M A R T H A | R E M E M B E R E D | T H E | C L O S E D | D O O R | O N | T H E | F I R S T | S U R V E Y | T H E Y | H A D N ' T | A T T E M P T E D | O P E N I N G | I T | +T H E | C I V I L I A N | S P E C I A L I S T S | I N | O T H E R | F I E L D S | A N D | T H E | S P A C E | F O R C E | P E O P L E | W H O | H A D | B E E N | H O L D I N G | T A P E | L I N E S | A N D | M A K I N G | S K E T C H E S | A N D | S N A P P I N G | C A M E R A S | W E R E | A L L | F L Y I N G | T O | L O W E R | S Y R T I S | T O | F I N D | O U T | H O W | M U C H | O X Y G E N | T H E R E | W A S | A N D | W H A T | K I N D | O F | L I F E | I T | S U P P O R T E D | +W I T H O U T | Q U E S T I O N | H E | H A D | B E C O M E | O V E R N I G H T | T H E | M O S T | W I D E L Y | K N O W N | A R C H A E O L O G I S T | I N | H I S T O R Y | +S O | T H E Y | J U S T | C A M E | I N | H E R E | A N D | L I T | T H E | C H A R C O A L | A N D | S A T | D R I N K I N G | T O G E T H E R | T I L L | T H E Y | A L L | F E L L | A S L E E P | +N O T | T H A T | I ' M | I N T E R E S T E D | I N | A L L | T H I S | F O R | M Y S E L F | H E | D I S C L A I M E D | A F T E R | L I S T E N I N G | T O | T H E | T E L E C A S T | F R O M | T E R R A | T W O | D A Y S | A F T E R | H I S | D I S C O V E R Y | +T O N Y ' S | F O U N D | T H E | M A R T I A N S | +S O | I | B E L I E V E | I | S H A L L | G O | B A C K | A T | L E A S T | F O R | A | W H I L E | A N D | S E E | W H A T | I | C A N | D O | +L E C T U R E S | +M A S S | S U I C I D E | T H A T ' S | W H A T | I T | W A S | N O T I C E | W H A T ' S | I N | T H E | C O R N E R S | +G L O R I A | S T A N D I S H | W H O | H A D | D R O P P E D | I N | F O R | L U N C H | W A S | O N | T H E | M E Z Z A N I N E | F A I R L Y | S C R E A M I N G | I N T O | A | R A D I O P H O N E | E X T E N S I O N | D O Z E N | A N D | A | H A L F | O F | T H E M | +T H E Y | A L S O | F O U N D | A | M A R T I A N | C A L E N D A R | T H E | Y E A R | H A D | B E E N | D I V I D E D | I N T O | T E N | M O R E | O R | L E S S | E Q U A L | M O N T H S | A N D | O N E | O F | T H E M | H A D | B E E N | D O M A | +H E | S M I L E D | G U I L T I L Y | A S | H E | A D D E D | B U T | I | M U S T | A D M I T | I | W A S | M O R E | T H A N | A | L I T T L E | C O N C E R N E D | M Y S E L F | +A N D | T H E | O N L Y | T R U C K | W E | H A D | A V A I L A B L E | W A S | I N | T H A T | B U R N I N G | S H E D | T H E | S U P E R I N T E N D E N T | A D D E D | B I T T E R L Y | +T H E | T W O | G I R L S | W E R E | A S | M U C H | U P S E T | A S | T O M ' S | M O T H E R | T O M | L A U G H E D | +T H E | T E L E P H O N E | L I N E | W A S | S O O N | R E P A I R E D | A N D | A | S T E A D Y | S T R E A M | O F | R E S C U E | V E H I C L E S | B E G A N | A R R I V I N G | F R O M | H A R K N E S S | F I R E | T R U C K S | T H R E E | A M B U L A N C E S | A N D | P R I V A T E | C A R S | D R I V E N | B Y | V O L U N T E E R S | +I ' L L | B E | G L A D | T O | T R Y | S I R | H E | R E P L I E D | +M I S T E R | S W I F T ' S | E Y E S | T W I N K L E D | +T H E | Y O U N G | I N V E N T O R | H A D | J U S T | N O T I C E D | H I S | F R I E N D | L Y I N G | P I N N E D | B E N E A T H | A | H E A V Y | B E A M | N E A R B Y | +H E ' S | A | G R E A T | S C I E N T I S T | +B U D | T H R E W | U P | H I S | A R M S | T O | P R O T E C T | H I M S E L F | B U T | T O O | L A T E | +T H E Y | P I C K E D | T H E I R | W A Y | T H R O U G H | T H E | W R E C K A G E | A N D | E M E R G E D | O N | A | S C E N E | O F | F R I G H T F U L | D E S T R U C T I O N | +H I S | F R I E N D ' S | E Y E L I D S | F L I C K E R E D | +M A L E | O R | F E M A L E | H U M A N | O R | A N I M A L | +T H E | S K Y | W A S | V I S I B L E | T H R O U G H | S E V E R A L | G A P I N G | H O L E S | I N | T H E | R O O F | W H I C H | W A S | S A G G I N G | D A N G E R O U S L Y | O N | I T S | S U P P O R T I N G | T R U S S E S | +T H E N | T O M | W H O | H A D | B E E N | S T U N N E D | B Y | S O M E | F A L L I N G | D E B R I S | R A I S E D | H I M S E L F | T O | A | S I T T I N G | P O S I T I O N | +L E T ' S | S E E | A B O U T | G E T T I N G | H E L P | F O R | M I S T E R | F A B E R | +A N O T H E R | E N G I N E E R | R U S H E D | T O W A R D | T H E | D O O R | T O | S E E | W H A T | W A S | H A P P E N I N G | O U T S I D E | +E L E C T R O N I C | E Q U I P M E N T | C A S C A D E D | F R O M | T H E | W A L L | S H E L V E S | A N D | A | H E A V Y | D U T Y | C H A I N | H O I S T | C A M E | L O O S E | F R O M | I T S | O V E R H E A D | T R A C K | P L U N G I N G | T O | T H E | F L O O R | W I T H | A | T E R R I F Y I N G | C R A S H | +A N | I N S T A N T | L A T E R | I T | C R A S H E D | O V E R | P I N N I N G | M A R K | F A B E R | B E N E A T H | I T | +T H I S | I S N ' T | P A R T | O F | Y O U R | T E S T I N G | R O U T I N E | I S | I T | +T O M | N O D D E D | U N H A P P I L Y | +F O R | M I N U T E S | N O | O N E | S T I R R E D | A M O N G | T H E | W R E C K A G E | +A N Y H O W | W E | W A N T | T O | H E L P | G O T | A | J O B | F O R | U S | +W E ' D | B E T T E R | N O T | T R Y | T O | M O V E | H I M | T O M | D E C I D E D | W E ' L L | G E T | A N | A M B U L A N C E | +W I T H I N | M I N U T E S | T O M | W A S | I N | C H A R G E | O F | C L E A R I N G | A W A Y | R U B B L E | A N D | E X T R I C A T I N G | A N Y O N E | W H O | M I G H T | B E | T R A P P E D | I N S I D E | T H E | B U I L D I N G S | +I N S I D E | A | S E C R E T | R O C K E T | T E L E M E T E R I N G | D E V I C E | W A S | M O U N T E D | O N | I T S | T E S T | S T A N D | +M I S T E R | S W I F T | C A M E | I N T O | T H E | L I V I N G | R O O M | J U S T | T H E N | A N D | T O L D | T O M | H O W | W O R R I E D | M I S S U S | S W I F T | A N D | S A N D Y | H A D | B E E N | +T H E Y | C L U S T E R | A R O U N D | M E | T H E I R | H A N D S | A R E | T A L O N E D | T H E I R | E Y E S | A R E | R E D | L I K E | F L A M E | B U R N I N G | I N | D A R K N E S S | +S I N C E | H I S | B I R T H | H E | H A S | B E E N | G U A R D E D | S O | C L O S E L Y | T H A T | T H E | C L E V E R E S T | P O I S O N E R S | O F | T H E | E A S T | C O U L D | N O T | R E A C H | H I M | +B Y | W H I C H | A | S O U L | I S | D R A W N | F R O M | I T S | B O D Y | A N D | A C R O S S | G U L F S | O F | E C H O I N G | S P A C E | R E T U R N E D | T H E | M A N | O N | T H E | M A T | +B U T | A T | T H E | U R G E N T | E N T R E A T Y | O F | T H E | P R I N C E S S | O F | K H O S A L A | W H O | L O V E D | B H U N D A | C H A N D | V A I N L Y | H E | G A V E | H E R | A | L O C K | O F | H I S | L O N G | B L A C K | H A I R | A S | A | T O K E N | O F | R E M E M B R A N C E | +T H E | M A N | S H R U G G E D | H I S | B R O A D | S H O U L D E R S | A N D | T U R N E D | B A C K | I N T O | T H E | A R A B E S Q U E | C H A M B E R | +A | L O W | C O N F U S E D | M O A N | W A N E D | F R O M | H I S | M O U T H | +I | T E L L | Y O U | I T | I S | N O T | P O I S O N | S H E | C R I E D | +T H E | S L A N T | O F | T H E | M O O N | P R E S A G E D | E V I L | F O R | T H E | K I N G | O F | V E N D H Y A | T H E | S T A R S | A R E | I N | T U R M O I L | T H E | S E R P E N T | I N | T H E | H O U S E | O F | T H E | E L E P H A N T | +T H E R E | T H E Y | S T R O V E | T O | B R E A K | T H E | S I L V E R | C O R D | O F | L I F E | A N D | T H R U S T | M Y | S O U L | I N T O | T H E | B O D Y | O F | A | F O U L | N I G H T | W E I R D | T H E I R | S O R C E R Y | S U M M O N E D | U P | F R O M | H E L L | A H | +T H E R E | W A S | T H E | O L D | I M P E R I O U S | N O T E | I N | H I S | F A I L I N G | W H I S P E R | +O N | T H E | D A I S | U N D E R | T H E | G O L D E N | D O M E | T H E | K I N G | C R I E D | O U T | A G A I N | R A C K E D | B Y | A W F U L | P A R O X Y S M S | +T H E Y | S E E K | T O | S N A P | T H E | S I L V E R | C O R D | T H A T | B I N D S | M E | T O | M Y | D Y I N G | B O D Y | +A S | Y O U | W E L L | K N O W | T H E R E | A R E | T E N | M E N | A N D | T E N | W O M E N | W H O S E | S O L E | D U T Y | I S | T O | T A S T E | H I S | F O O D | A N D | W I N E | A N D | F I F T Y | A R M E D | W A R R I O R S | G U A R D | H I S | C H A M B E R | A S | T H E Y | G U A R D | I T | N O W | +P O I N T | O F | C O N T A C T | I N Q U I R E D | T H E | O T H E R | +I | K N O W | N O W | W H A T | B R I N G S | M E | T O | T H E | P Y R E | +T H E I R | F I N G E R S | S E A R | M E | L I K E | F I R E | +N O T | U N T I L | T H E | H E A V E N S | W E R E | I N | T H E | P R O P E R | O R D E R | C O U L D | T H E Y | P E R F O R M | T H I S | N E C R O M A N C Y | +H E | W A S | Y O U N G | N O | S P E A R | H A D | T O U C H E D | H I M | N O | P O I S O N | L U R K E D | I N | H I S | W I N E | +S E N D | M Y | S O U L | C L E A N | T O | A S U R A | +A L L | D I S C A R D E D | P O R T I O N S | O F | T H E | H U M A N | B O D Y | S T I L L | R E M A I N | P A R T | O F | I T | A T T A C H E D | T O | I T | B Y | I N T A N G I B L E | C O N N E C T I O N S | +W I T H | A | L O N G | S T A I N E D | F I N G E R N A I L | H E | M A P P E D | T H E | C O N S T E L L A T I O N S | O N | T H E | M A R B L E | T I L E D | F L O O R | +T H I S | M A N | W A S | C L A D | I N | A | B R O W N | C A M E L | H A I R | R O B E | A N D | S A N D A L S | A N D | A | G R E E N | T U R B A N | W A S | O N | H I S | H E A D | +Y O U | H A V E | N E V E R | D I S O B E Y E D | M E | O B E Y | M Y | L A S T | C O M M A N D | +Y O U R | C R Y | A N D | T H E | G R I P | O F | Y O U R | F I N G E R S | B R O U G H T | M E | B A C K | B U T | I | A M | G O I N G | F A S T | +S U M M E R | S Q U A S H E S | A L M O S T | I N | T H E I R | G O L D E N | B L O S S O M | C U C U M B E R S | N O W | E V I N C I N G | A | T E N D E N C Y | T O | S P R E A D | A W A Y | F R O M | T H E | M A I N | S T O C K | A N D | R A M B L E | F A R | A N D | W I D E | T W O | O R | T H R E E | R O W S | O F | S T R I N G | B E A N S | A N D | A S | M A N Y | M O R E | T H A T | W E R E | A B O U T | T O | F E S T O O N | T H E M S E L V E S | O N | P O L E S | T O M A T O E S | O C C U P Y I N G | A | S I T E | S O | S H E L T E R E D | A N D | S U N N Y | T H A T | T H E | P L A N T S | W E R E | A L R E A D Y | G I G A N T I C | A N D | P R O M I S E D | A N | E A R L Y | A N D | A B U N D A N T | H A R V E S T | +W H A T | A N | I N S T R U M E N T | I S | T H E | H U M A N | V O I C E | +P H O E B E | W O N D E R E D | W H O S E | C A R E | A N D | T O I L | I T | C O U L D | H A V E | B E E N | T H A T | H A D | P L A N T E D | T H E S E | V E G E T A B L E S | A N D | K E P T | T H E | S O I L | S O | C L E A N | A N D | O R D E R L Y | +F E W E R | W O R D S | T H A N | B E F O R E | B U T | W I T H | T H E | S A M E | M Y S T E R I O U S | M U S I C | I N | T H E M | +A N D | Y E T | I F | Y O U | C O U L D | O N L Y | S E E | T H E | B E N I G N | S M I L E | O F | T H E | O R I G I N A L | +T H E R E | I S | A | W O N D E R F U L | I N S I G H T | I N | H E A V E N ' S | B R O A D | A N D | S I M P L E | S U N S H I N E | +O H | R E J O I N E D | T H E | D A G U E R R E O T Y P I S T | B E C A U S E | L I K E | A N | O L D | L A D Y ' S | C U P | O F | T E A | I T | I S | W A T E R | B E W I T C H E D | +T H E | E N C L O S U R E | H A D | F O R M E R L Y | B E E N | V E R Y | E X T E N S I V E | B U T | W A S | N O W | C O N T R A C T E D | W I T H I N | S M A L L | C O M P A S S | A N D | H E M M E D | A B O U T | P A R T L Y | B Y | H I G H | W O O D E N | F E N C E S | A N D | P A R T L Y | B Y | T H E | O U T B U I L D I N G S | O F | H O U S E S | T H A T | S T O O D | O N | A N O T H E R | S T R E E T | +I T | N O W | C O N T A I N E D | O N L Y | C H A N T I C L E E R | H I S | T W O | W I V E S | A N D | A | S O L I T A R Y | C H I C K E N | +S I N C E | Y O U | A R E | A | F R I E N D | O F | M Y | C O U S I N | H E P Z I B A H ' S | Y O U | S H O U L D | A S K | H E R | T O | S H O W | Y O U | T H E | P I C T U R E | +H E | E X H I B I T E D | A | D A G U E R R E O T Y P E | M I N I A T U R E | I N | A | M O R O C C O | C A S E | +T H I S | W A S | A | F O U N T A I N | S E T | R O U N D | W I T H | A | R I M | O F | O L D | M O S S Y | S T O N E S | A N D | P A V E D | I N | I T S | B E D | W I T H | W H A T | A P P E A R E D | T O | B E | A | S O R T | O F | M O S A I C | W O R K | O F | V A R I O U S L Y | C O L O R E D | P E B B L E S | +W H I L E | W E | G I V E | I T | C R E D I T | O N L Y | F O R | D E P I C T I N G | T H E | M E R E S T | S U R F A C E | I T | A C T U A L L Y | B R I N G S | O U T | T H E | S E C R E T | C H A R A C T E R | W I T H | A | T R U T H | T H A T | N O | P A I N T E R | W O U L D | E V E R | V E N T U R E | U P O N | E V E N | C O U L D | H E | D E T E C T | I T | +I | T U R N | U P | T H E | E A R T H | B Y | W A Y | O F | P A S T I M E | +T H E | W H I T E | D O U B L E | R O S E B U S H | H A D | E V I D E N T L Y | B E E N | P R O P P E D | U P | A N E W | A G A I N S T | T H E | H O U S E | S I N C E | T H E | C O M M E N C E M E N T | O F | T H E | S E A S O N | A N D | A | P E A R | T R E E | A N D | T H R E E | D A M S O N | T R E E S | W H I C H | E X C E P T | A | R O W | O F | C U R R A N T | B U S H E S | C O N S T I T U T E D | T H E | O N L Y | V A R I E T I E S | O F | F R U I T | B O R E | M A R K S | O F | T H E | R E C E N T | A M P U T A T I O N | O F | S E V E R A L | S U P E R F L U O U S | O R | D E F E C T I V E | L I M B S | +H E R E | W E | H A V E | T H E | M A N | S L Y | S U B T L E | H A R D | I M P E R I O U S | A N D | W I T H A L | C O L D | A S | I C E | L O O K | A T | T H A T | E Y E | +H O W | W O N D E R F U L L Y | R E S P O N S I V E | T O | E V E R Y | E M O T I O N | O F | T H E | H U M A N | S O U L | +B E E S | T O O | S T R A N G E | T O | S A Y | H A D | T H O U G H T | I T | W O R T H | T H E I R | W H I L E | T O | C O M E | H I T H E R | P O S S I B L Y | F R O M | T H E | R A N G E | O F | H I V E S | B E S I D E | S O M E | F A R M | H O U S E | M I L E S | A W A Y | +Y E T | T H E | O R I G I N A L | W E A R S | T O | C O M M O N | E Y E S | A | V E R Y | D I F F E R E N T | E X P R E S S I O N | +M O S T | O F | M Y | L I K E N E S S E S | D O | L O O K | U N A M I A B L E | B U T | T H E | V E R Y | S U F F I C I E N T | R E A S O N | I | F A N C Y | I S | B E C A U S E | T H E | O R I G I N A L S | A R E | S O | +I S | T H E R E | N O T H I N G | W I L D | I N | T H E | E Y E | C O N T I N U E D | H O L G R A V E | S O | E A R N E S T L Y | T H A T | I T | E M B A R R A S S E D | P H O E B E | A S | D I D | A L S O | T H E | Q U I E T | F R E E D O M | W I T H | W H I C H | H E | P R E S U M E D | O N | T H E I R | S O | R E C E N T | A C Q U A I N T A N C E | +P H O E B E | M E R E L Y | G L A N C E D | A T | I T | A N D | G A V E | I T | B A C K | +I T | I S | L I K E | A | B A N D A G E | O V E R | O N E ' S | E Y E S | T O | C O M E | I N T O | I T | +W H I L E | T H U S | D I S M I S S I N G | H E R | T H E | M A I D E N | L A D Y | S T E P T | F O R W A R D | K I S S E D | P H O E B E | A N D | P R E S S E D | H E R | T O | H E R | H E A R T | W H I C H | B E A T | A G A I N S T | T H E | G I R L ' S | B O S O M | W I T H | A | S T R O N G | H I G H | A N D | T U M U L T U O U S | S W E L L | +T H E Y | K E P T | T H E M S E L V E S | A L I V E | U N Q U E S T I O N A B L Y | A N D | L A I D | N O W | A N D | T H E N | A N | E G G | A N D | H A T C H E D | A | C H I C K E N | N O T | F O R | A N Y | P L E A S U R E | O F | T H E I R | O W N | B U T | T H A T | T H E | W O R L D | M I G H T | N O T | A B S O L U T E L Y | L O S E | W H A T | H A D | O N C E | B E E N | S O | A D M I R A B L E | A | B R E E D | O F | F O W L S | +T H E | C H I C K E N | C R E P T | T H R O U G H | T H E | P A L E S | O F | T H E | C O O P | A N D | R A N | W I T H | S O M E | S H O W | O F | L I V E L I N E S S | T O | H E R | F E E T | W H I L E | C H A N T I C L E E R | A N D | T H E | L A D I E S | O F | H I S | H O U S E H O L D | R E G A R D E D | H E R | W I T H | Q U E E R | S I D E L O N G | G L A N C E S | A N D | T H E N | C R O A K E D | O N E | T O | A N O T H E R | A S | I F | C O M M U N I C A T I N G | T H E I R | S A G E | O P I N I O N S | O F | H E R | C H A R A C T E R | +A H | B U T | T H E S E | H E N S | A N S W E R E D | T H E | Y O U N G | M A N | T H E S E | H E N S | O F | A R I S T O C R A T I C | L I N E A G E | W O U L D | S C O R N | T O | U N D E R S T A N D | T H E | V U L G A R | L A N G U A G E | O F | A | B A R N | Y A R D | F O W L | +S O | W E | W I L L | B E | F E L L O W | L A B O R E R S | S O M E W H A T | O N | T H E | C O M M U N I T Y | S Y S T E M | +T H E Y | H A V E | K N O W N | M E | M U C H | L O N G E R | B U T | N E V E R | H O N O R | M E | W I T H | A N Y | F A M I L I A R I T Y | T H O U G H | H A R D L Y | A | D A Y | P A S S E S | W I T H O U T | M Y | B R I N G I N G | T H E M | F O O D | +H E | H E L D | A | H O E | I N | H I S | H A N D | A N D | W H I L E | P H O E B E | W A S | G O N E | I N | Q U E S T | O F | T H E | C R U M B S | H A D | B E G U N | T O | B U S Y | H I M S E L F | W I T H | D R A W I N G | U P | F R E S H | E A R T H | A B O U T | T H E | R O O T S | O F | T H E | T O M A T O E S | +I | P R E F E R | T O | T H I N K | A N D | S O | W O U L D | M I S S | H E P Z I B A H | T H A T | T H E Y | R E C O G N I Z E | T H E | F A M I L Y | T O N E | F O R | Y O U | A R E | A | P Y N C H E O N | +I T | I S | N O N S E N S E | S A I D | P H O E B E | A | L I T T L E | I M P A T I E N T L Y | F O R | U S | T O | T A L K | A B O U T | A | P I C T U R E | W H I C H | Y O U | H A V E | N E V E R | S E E N | +T H E S E | F E A T H E R E D | P E O P L E | H A D | E X I S T E D | T O O | L O N G | I N | T H E I R | D I S T I N C T | V A R I E T Y | A | F A C T | O F | W H I C H | T H E | P R E S E N T | R E P R E S E N T A T I V E S | J U D G I N G | B Y | T H E I R | L U G U B R I O U S | D E P O R T M E N T | S E E M E D | T O | B E | A W A R E | +W E L L | I | D O N ' T | W I S H | T O | S E E | I T | A N Y | M O R E | O B S E R V E D | P H O E B E | T U R N I N G | A W A Y | H E R | E Y E S | I T | I S | C E R T A I N L Y | V E R Y | L I K E | T H E | O L D | P O R T R A I T | +P R A Y | G O | T O | B E D | F O R | I | A M | S U R E | Y O U | M U S T | N E E D | R E S T | +T H E | S U N | A S | Y O U | S E E | T E L L S | Q U I T E | A N O T H E R | S T O R Y | A N D | W I L L | N O T | B E | C O A X E D | O U T | O F | I T | A F T E R | H A L F | A | D O Z E N | P A T I E N T | A T T E M P T S | O N | M Y | P A R T | +S H E | W A S | I N D I S T I N C T L Y | A W A R E | H O W E V E R | T H A T | T H E | G A U N T | F I G U R E | O F | T H E | O L D | G E N T L E W O M A N | W A S | S I T T I N G | I N | O N E | O F | T H E | S T R A I G H T | B A C K E D | C H A I R S | A | L I T T L E | W I T H D R A W N | F R O M | T H E | W I N D O W | T H E | F A I N T | G L E A M | O F | W H I C H | S H O W E D | T H E | B L A N C H E D | P A L E N E S S | O F | H E R | C H E E K | T U R N E D | S I D E W A Y S | T O W A R D S | A | C O R N E R | +T H E | D I S T I N G U I S H I N G | M A R K | O F | T H E | H E N S | W A S | A | C R E S T | O F | L A M E N T A B L Y | S C A N T Y | G R O W T H | I N | T H E S E | L A T T E R | D A Y S | B U T | S O | O D D L Y | A N D | W I C K E D L Y | A N A L O G O U S | T O | H E P Z I B A H ' S | T U R B A N | T H A T | P H O E B E | T O | T H E | P O I G N A N T | D I S T R E S S | O F | H E R | C O N S C I E N C E | B U T | I N E V I T A B L Y | W A S | L E D | T O | F A N C Y | A | G E N E R A L | R E S E M B L A N C E | B E T W I X T | T H E S E | F O R L O R N | B I P E D S | A N D | H E R | R E S P E C T A B L E | R E L A T I V E | +I | W I L L | S I T | I N | T H E | P A R L O R | A W H I L E | A N D | C O L L E C T | M Y | T H O U G H T S | +S O | W I S E | A S | W E L L | A S | A N T I Q U E | W A S | T H E I R | A S P E C T | A S | T O | G I V E | C O L O R | T O | T H E | I D E A | N O T | M E R E L Y | T H A T | T H E Y | W E R E | T H E | D E S C E N D A N T S | O F | A | T I M E | H O N O R E D | R A C E | B U T | T H A T | T H E Y | H A D | E X I S T E D | I N | T H E I R | I N D I V I D U A L | C A P A C I T Y | E V E R | S I N C E | T H E | H O U S E | O F | T H E | S E V E N | G A B L E S | W A S | F O U N D E D | A N D | W E R E | S O M E H O W | M I X E D | U P | W I T H | I T S | D E S T I N Y | +A T | S O M E | U N C E R T A I N | P E R I O D | I N | T H E | D E P T H S | O F | N I G H T | A N D | A S | I T | W E R E | T H R O U G H | T H E | T H I N | V E I L | O F | A | D R E A M | S H E | W A S | C O N S C I O U S | O F | A | F O O T S T E P | M O U N T I N G | T H E | S T A I R S | H E A V I L Y | B U T | N O T | W I T H | F O R C E | A N D | D E C I S I O N | +I T | W A S | E V I D E N T | T H A T | T H E | R A C E | H A D | D E G E N E R A T E D | L I K E | M A N Y | A | N O B L E | R A C E | B E S I D E S | I N | C O N S E Q U E N C E | O F | T O O | S T R I C T | A | W A T C H F U L N E S S | T O | K E E P | I T | P U R E | +B U T | P U T | I T | O N | T H E | T A B L E | I N | T H E | C O R N E R | O F | T H E | P A S S A G E | +S H E | D I D | N O T | A L T O G E T H E R | L I K E | H I M | +T H E R E | W E R E | A L S O | A | F E W | S P E C I E S | O F | A N T I Q U E | A N D | H E R E D I T A R Y | F L O W E R S | I N | N O | V E R Y | F L O U R I S H I N G | C O N D I T I O N | B U T | S C R U P U L O U S L Y | W E E D E D | A S | I F | S O M E | P E R S O N | E I T H E R | O U T | O F | L O V E | O R | C U R I O S I T Y | H A D | B E E N | A N X I O U S | T O | B R I N G | T H E M | T O | S U C H | P E R F E C T I O N | A S | T H E Y | W E R E | C A P A B L E | O F | A T T A I N I N G | +I F | Y O U | W O U L D | P E R M I T | M E | S A I D | T H E | A R T I S T | L O O K I N G | A T | P H O E B E | I | S H O U L D | L I K E | T O | T R Y | W H E T H E R | T H E | D A G U E R R E O T Y P E | C A N | B R I N G | O U T | D I S A G R E E A B L E | T R A I T S | O N | A | P E R F E C T L Y | A M I A B L E | F A C E | +I F | T H E | O R I G I N A L | I S | S T I L L | I N | T H E | W O R L D | I | T H I N K | H E | M I G H T | D E F Y | T H E | S U N | T O | M A K E | H I M | L O O K | S T E R N | A N D | H A R D | +M Y | N A M E | I S | P H O E B E | P Y N C H E O N | S A I D | T H E | G I R L | W I T H | A | M A N N E R | O F | S O M E | R E S E R V E | F O R | S H E | W A S | A W A R E | T H A T | H E R | N E W | A C Q U A I N T A N C E | C O U L D | B E | N O | O T H E R | T H A N | T H E | D A G U E R R E O T Y P I S T | O F | W H O S E | L A W L E S S | P R O P E N S I T I E S | T H E | O L D | M A I D | H A D | G I V E N | H E R | A | D I S A G R E E A B L E | I D E A | +I N | G O O D | F A I T H | H O W E V E R | H E | I S | N O T | S U F F I C I E N T L Y | I M A G I N A T I V E | T O | F L A T T E R | H I M S E L F | W I T H | T H E | S L I G H T E S T | H O P E | O F | T H I S | K I N D | +H E | T R U S T S | N O T | T O | B E | C O N S I D E R E D | A S | U N P A R D O N A B L Y | O F F E N D I N G | B Y | L A Y I N G | O U T | A | S T R E E T | T H A T | I N F R I N G E S | U P O N | N O B O D Y ' S | P R I V A T E | R I G H T S | A N D | A P P R O P R I A T I N G | A | L O T | O F | L A N D | W H I C H | H A D | N O | V I S I B L E | O W N E R | A N D | B U I L D I N G | A | H O U S E | O F | M A T E R I A L S | L O N G | I N | U S E | F O R | C O N S T R U C T I N G | C A S T L E S | I N | T H E | A I R | +T H E | A U T H O R | H A S | C O N S I D E R E D | I T | H A R D L Y | W O R T H | H I S | W H I L E | T H E R E F O R E | R E L E N T L E S S L Y | T O | I M P A L E | T H E | S T O R Y | W I T H | I T S | M O R A L | A S | W I T H | A N | I R O N | R O D | O R | R A T H E R | A S | B Y | S T I C K I N G | A | P I N | T H R O U G H | A | B U T T E R F L Y | T H U S | A T | O N C E | D E P R I V I N G | I T | O F | L I F E | A N D | C A U S I N G | I T | T O | S T I F F E N | I N | A N | U N G A I N L Y | A N D | U N N A T U R A L | A T T I T U D E | +T H E | N A R R A T I V E | I T | M A Y | B E | I S | W O V E N | O F | S O | H U M B L E | A | T E X T U R E | A S | T O | R E Q U I R E | T H I S | A D V A N T A G E | A N D | A T | T H E | S A M E | T I M E | T O | R E N D E R | I T | T H E | M O R E | D I F F I C U L T | O F | A T T A I N M E N T | +I F | P E R M I T T E D | B Y | T H E | H I S T O R I C A L | C O N N E C T I O N | W H I C H | T H O U G H | S L I G H T | W A S | E S S E N T I A L | T O | H I S | P L A N | T H E | A U T H O R | W O U L D | V E R Y | W I L L I N G L Y | H A V E | A V O I D E D | A N Y T H I N G | O F | T H I S | N A T U R E | +T H E R E | A P P E A R E D | T O | B E | A N | I M M E D I A T E | A S S O C I A T I O N | W I T H | T H E | D E A T H | T R A U M A | A S | I F | T H E | T W O | W E R E | I N E X T R I C A B L Y | L I N K E D | I N T O | O N E | +A | M I N U T E | I S | N O T | A | V E R Y | L A R G E | M E A S U R E | O F | T I M E | A N D | H I S | B O D Y | N E E D E D | E V E R Y | F R A C T I O N | O F | I T | +P A R T I C U L A R L Y | S O | O N | T H I S | L A S T | N I G H T | W H E N | O N L Y | T W O | O F | T H E | L I T T L E | C U B I C L E S | W E R E | O C C U P I E D | T H E | T H O U S A N D S | O F | O T H E R S | S T A N D I N G | W I T H | D A R K | E M P T Y | D O O R S | +T H E | C O N T E S T A N T S | I N | T H E | T W E N T I E S | N E E D E D | U N D I S T U R B E D | R E S T | T H E R E F O R E | N I G H T S | I N | T H E | D O R M I T O R I E S | W E R E | A S | Q U I E T | A S | D E A T H | +T H E R E | C O U L D | B E | L I T T L E | A R T | I N | T H I S | L A S T | A N D | F I N A L | R O U N D | O F | F E N C I N G | +B R I O N | S A W | S O M E T H I N G | C L O S E | T O | P A N I C | O N | H I S | O P P O N E N T ' S | F A C E | W H E N | T H E | M A N | F I N A L L Y | R E C O G N I Z E D | H I S | E R R O R | +S W E A T | C O V E R E D | B R I O N ' S | B O D Y | T R I C K L I N G | I N T O | T H E | T I G H T | L O I N C L O T H | T H A T | W A S | T H E | O N L Y | G A R M E N T | H E | W O R E | +T E N | S E C O N D S | +T H I S | I S | P H Y S I C A L L Y | I M P O S S I B L E | W H E N | C O N S C I O U S | +I R O L G | L O O K E D | A M A Z E D | A T | T H E | S U D D E N | F U R Y | O F | T H E | A T T A C K | T H E N | S M I L E D | +I ' M | H E R E | B E C A U S E | T H E | M A T T E R | I S | O F | U T M O S T | I M P O R T A N C E | A N D | B R A N D D | I S | T H E | O N E | I | M U S T | S E E | N O W | S T A N D | A S I D E | +A | W A V E | O F | D E S P A I R | R O L L E D | O U T | F R O M | I R O L G | B R I O N | S E N S E D | I T | A N D | K N E W | T H E | F I F T H | P O I N T | W A S | H I S | +B R E A T H I N G | D E E P L Y | B R I O N | S O F T L Y | S P O K E | T H E | A U T O | H Y P N O T I C | P H R A S E S | T H A T | T R I G G E R E D | T H E | P R O C E S S | +T H E R E | W A S | S I L E N C E | T H E N | A N D | S T I L L | W O N D E R I N G | B R I O N | W A S | O N C E | M O R E | A S L E E P | +A | M A N | S A I D | T O | T H E | U N I V E R S E | S I R | I | E X I S T | +W H E N | T H E | B U Z Z E R | S O U N D E D | H E | P U L L E D | H I S | F O I L | F R O M | H I S | S E C O N D ' S | S T A R T L E D | G R A S P | A N D | R A N | F O R W A R D | +J U S T | T H R U S T | A N D | P A R R Y | A N D | V I C T O R Y | T O | T H E | S T R O N G E R | +T H E | S T R E N G T H | T H A T | E N A B L E S | S O M E O N E | I N | A | T R A N C E | T O | H O L D | H I S | B O D Y | S T I F F | A N D | U N S U P P O R T E D | E X C E P T | A T | T W O | P O I N T S | T H E | H E A D | A N D | H E E L S | +T H E | C U T | O N | H I S | C H E S T | S T I L L | D R I P P I N G | B L O O D | T H E | A C H E | O F | H I S | O V E R S T R A I N E D | E Y E S | E V E N | T H E | S O A R I N G | A R E N A | A R O U N D | H I M | W I T H | T H E | T H O U S A N D S | O F | S P E C T A T O R S | W E R E | T R I V I A L I T I E S | N O T | W O R T H | T H I N K I N G | A B O U T | +T H E | B U Z Z E R ' S | W H I R R | T R I G G E R E D | H I S | M U S C L E S | I N T O | C O M P L E T E | R E L A X A T I O N | +O T H E R S | H A D | D I E D | B E F O R E | D U R I N G | T H E | T W E N T I E S | A N D | D E A T H | D U R I N G | T H E | L A S T | R O U N D | W A S | I N | S O M E | W A Y S | E A S I E R | T H A N | D E F E A T | +O N E | M I N U T E | A | V O I C E | S A I D | A N D | T H E | T I M E | B U Z Z E R | S O U N D E D | +E V E R Y | M A N | W H O | E N T E R E D | T H E | T W E N T I E S | H A D | H I S | O W N | T R A I N I N G | T R I C K S | +H E | W A S | I N | R E V E R I E | S L I D I N G | A L O N G | T H E | B O R D E R S | O F | C O N S C I O U S N E S S | +T H E | O T H E R | V O I C E | S N A P P E D | W I T H | A | H A R S H | U R G E N C Y | C L E A R L Y | U S E D | T O | C O M M A N D | +T H E | T W E N T I E S | +T H E N | T H E | P O W E R F U L | T W I S T | T H A T | T H R U S T | I T | A S I D E | I N | A N D | U N D E R | T H E | G U A R D | +H E | A S K E D | T H E | H A N D L E R | W H O | W A S | K N E A D I N G | H I S | A C H I N G | M U S C L E S | +H I S | I N S T A N T | O F | P A N I C | W A S | F O L L O W E D | B Y | A | S M A L L | S H A R P | B L O W | H I G H | O N | H I S | C H E S T | +H E | T H O U G H T | I T | W A S | A | L A S T | B U R S T | O F | E N E R G Y | H E | K N E W | H O W | C L O S E | T H E Y | B O T H | W E R E | T O | E X H A U S T I O N | +O N L Y | H I S | H E A R T | A N D | L U N G S | W O R K E D | O N | A T | A | S T R O N G | M E A S U R E D | R A T E | +H E | M U S T | H A V E | D R A W N | H I S | G U N | B E C A U S E | T H E | I N T R U D E R | S A I D | Q U I C K L Y | P U T | T H A T | A W A Y | Y O U ' R E | B E I N G | A | F O O L | O U T | +A | R E D | H A I R E D | M O U N T A I N | O F | A | M A N | W I T H | A N | A P P A R E N T L Y | I N E X H A U S T I B L E | S T O R E | O F | E N E R G Y | +T R U E | A G R E E D | K A L I K O | +I | H A V E | R E M A I N E D | A | P R I S O N E R | O N L Y | B E C A U S E | I | W I S H E D | T O | B E | O N E | A N D | W I T H | T H I S | H E | S T E P P E D | F O R W A R D | A N D | B U R S T | T H E | S T O U T | C H A I N S | A S | E A S I L Y | A S | I F | T H E Y | H A D | B E E N | T H R E A D S | +T H E | M E T A L | F O R E S T | I S | I N | T H E | G R E A T | D O M E D | C A V E R N | T H E | L A R G E S T | I N | A L L | O U R | D O M I N I O N S | R E P L I E D | K A L I K O | +W H E R E | I S | M Y | B R O T H E R | N O W | +O H | N O | I ' M | Q U I T E | S U R E | H E | D I D N ' T | +H A V I N G | R E T U R N E D | T O | T H E | R O Y A L | C A V E R N | K A L I K O | F I R S T | P O U N D E D | T H E | G O N G | A N D | T H E N | S A T | I N | T H E | T H R O N E | W E A R I N G | R U G G E D O ' S | D I S C A R D E D | R U B Y | C R O W N | A N D | H O L D I N G | I N | H I S | H A N D | T H E | S C E P T R E | W H I C H | R U G G E D O | H A D | S O | O F T E N | T H R O W N | A T | H I S | H E A D | +T H A T ' S | F U N N Y | R E M A R K E D | B E T S Y | T H O U G H T F U L L Y | +I | D O N ' T | B E L I E V E | A N N | K N E W | A N Y | M A G I C | O R | S H E ' D | H A V E | W O R K E D | I T | B E F O R E | +K A L I K O | W E N T | T O | T H E | B I G | G O N G | A N D | P O U N D E D | O N | I T | J U S T | A S | R U G G E D O | U S E D | T O | D O | B U T | N O | O N E | A N S W E R E D | T H E | S U M M O N S | +I N | F A C T | T H E R E | I S | N O T H I N G | H E | C A N | D O | I N | T H E S E | D O M I N I O N S | A S | W E L L | A S | O U R | N O M E S | W H O S E | N U M B E R S | A R E | S O | G R E A T | T H A T | I T | W O R R I E S | U S | T O | K E E P | T H E M | A L L | B U S Y | +H O W E V E R | I F | W E | L O O K | S H A R P | W E | M A Y | B E | A B L E | T O | D I S C O V E R | O N E | O F | T H E S E | S E C R E T | W A Y S | +I | D O | N O T | K N O W | C O N F E S S E D | S H A G G Y | +I | H O P E | H E | D O E S N ' T | W O R K | T O O | H A R D | S A I D | S H A G G Y | +T H E | L I T T L E | G I R L | H A D | B E E N | A S L E E P | B U T | S H E | H E A R D | T H E | R A P S | A N D | O P E N E D | T H E | D O O R | +I | A L S O | O F F E R E D | T O | H E L P | Y O U R | B R O T H E R | T O | E S C A P E | B U T | H E | W O U L D | N O T | G O | +I | B E G G E D | R U G G E D O | L O N G | A G O | T O | S E N D | H I M | A W A Y | B U T | H E | W O U L D | N O T | D O | S O | +T H E | K I N G | H A S | F L E D | I N | D I S G R A C E | A N D | Y O U R | F R I E N D S | A R E | A S K I N G | F O R | Y O U | +W H E R E | I S | T H A T | +N O T | E X A C T L Y | R E T U R N E D | K A L I K O | +K A L I K O | H E S I T A T E D | +H E | E A T S | A N D | S L E E P S | V E R Y | S T E A D I L Y | R E P L I E D | T H E | N E W | K I N G | +I N Q U I R E D | S H A G G Y | I N | T H E | M E T A L | F O R E S T | +B E C A U S E | Y O U | W E R E | S L E E P I N G | I N S T E A D | O F | C O N Q U E R I N G | T H E | L O V E L Y | R O S E | P R I N C E S S | H A S | B E C O M E | A | F I D D L E | W I T H O U T | A | B O W | W H I L E | P O O R | S H A G G Y | S I T S | T H E R E | A | C O O I N G | D O V E | +H E | D O E S N ' T | W O R K | A T | A L L | +H E | H A S | G O N E | A N D | G O N E | F O R | G O O D | A N S W E R E D | P O L Y C H R O M E | W H O | H A D | M A N A G E D | T O | S Q U E E Z E | I N T O | T H E | R O O M | B E S I D E | T H E | D R A G O N | A N D | H A D | W I T N E S S E D | T H E | O C C U R R E N C E S | W I T H | M U C H | I N T E R E S T | +P A I N T I N G | H E | T E L L S | U S | I S | O F | A | D I F F E R E N T | Q U A L I T Y | T O | M A T H E M A T I C S | A N D | F I N I S H | I N | A R T | I S | A D D I N G | M O R E | F A C T | +I N | F A C T | H E | I S | Q U I T E | S E V E R E | O N | M I S T E R | R U S K I N | F O R | N O T | R E C O G N I S I N G | T H A T | A | P I C T U R E | S H O U L D | D E N O T E | T H E | F R A I L T Y | O F | M A N | A N D | R E M A R K S | W I T H | P L E A S I N G | C O U R T E S Y | A N D | F E L I C I T O U S | G R A C E | T H A T | M A N Y | P H A S E S | O F | F E E L I N G | +L I N N E L L ' S | P I C T U R E S | A R E | A | S O R T | O F | U P | G U A R D S | A N D | A T | E M | P A I N T I N G S | A N D | M A S O N ' S | E X Q U I S I T E | I D Y L L S | A R E | A S | N A T I O N A L | A S | A | J I N G O | P O E M | M I S T E R | B I R K E T | F O S T E R ' S | L A N D S C A P E S | S M I L E | A T | O N E | M U C H | I N | T H E | S A M E | W A Y | T H A T | M I S T E R | C A R K E R | U S E D | T O | F L A S H | H I S | T E E T H | A N D | M I S T E R | J O H N | C O L L I E R | G I V E S | H I S | S I T T E R | A | C H E E R F U L | S L A P | O N | T H E | B A C K | B E F O R E | H E | S A Y S | L I K E | A | S H A M P O O E R | I N | A | T U R K I S H | B A T H | N E X T | M A N | +O N L Y | U N F O R T U N A T E L Y | H I S | O W N | W O R K | N E V E R | D O E S | G E T | G O O D | +O N | T H E | G E N E R A L | P R I N C I P L E S | O F | A R T | M I S T E R | Q U I L T E R | W R I T E S | W I T H | E Q U A L | L U C I D I T Y | +M I S T E R | Q U I L T E R | I S | T H E | A P O S T L E | O F | T H E | M I D D L E | C L A S S E S | A N D | W E | A R E | G L A D | T O | W E L C O M E | H I S | G O S P E L | +H E | T E L L S | U S | T H A T | A T | T H I S | F E S T I V E | S E A S O N | O F | T H E | Y E A R | W I T H | C H R I S T M A S | A N D | R O A S T | B E E F | L O O M I N G | B E F O R E | U S | S I M I L E S | D R A W N | F R O M | E A T I N G | A N D | I T S | R E S U L T S | O C C U R | M O S T | R E A D I L Y | T O | T H E | M I N D | +A S | F O R | E T C H I N G S | T H E Y | A R E | O F | T W O | K I N D S | B R I T I S H | A N D | F O R E I G N | +B Y | H A R R Y | Q U I L T E R | M | A | +H E | H A S | G R A V E | D O U B T S | W H E T H E R | S I R | F R E D E R I C K | L E I G H T O N ' S | W O R K | I S | R E A L L Y | G R E E K | A F T E R | A L L | A N D | C A N | D I S C O V E R | I N | I T | B U T | L I T T L E | O F | R O C K Y | I T H A C A | +N O R | I S | M I S T E R | Q U I L T E R ' S | M A N N E R | L E S S | I N T E R E S T I N G | T H A N | H I S | M A T T E R | +I T | I S | O B V I O U S L Y | U N N E C E S S A R Y | F O R | U S | T O | P O I N T | O U T | H O W | L U M I N O U S | T H E S E | C R I T I C I S M S | A R E | H O W | D E L I C A T E | I N | E X P R E S S I O N | +H E | L A M E N T S | M O S T | B I T T E R L Y | T H E | D I V O R C E | T H A T | H A S | B E E N | M A D E | B E T W E E N | D E C O R A T I V E | A R T | A N D | W H A T | W E | U S U A L L Y | C A L L | P I C T U R E S | M A K E S | T H E | C U S T O M A R Y | A P P E A L | T O | T H E | L A S T | J U D G M E N T | A N D | R E M I N D S | U S | T H A T | I N | T H E | G R E A T | D A Y S | O F | A R T | M I C H A E L | A N G E L O | W A S | T H E | F U R N I S H I N G | U P H O L S T E R E R | +M I S T E R | Q U I L T E R | H A S | M I S S E D | H I S | C H A N C E | F O R | H E | H A S | F A I L E D | E V E N | T O | M A K E | H I M S E L F | T H E | T U P P E R | O F | P A I N T I N G | +N E A R | T H E | F I R E | A N D | T H E | O R N A M E N T S | F R E D | B R O U G H T | H O M E | F R O M | I N D I A | O N | T H E | M A N T E L | B O A R D | +I T | W A S | N O T | F R O M | A N Y | R E A L | C A U S E | O F | G R I E F | T H A T | S H E | W E P T | B U T | T H E R E | W A S | A | M A G N E T I C | Q U A L I T Y | I N | T E A R S | W H I C H | A L W A Y S | A T T R A C T E D | H E R ' S | +N I E C E | I | C O M M A N D | Y O U | N O T | T O | S T I R | O U T | O F | T H I S | R O O M | T H I S | E V E N I N G | +I T | I S | O F T E N | T H E | U N G R A T E F U L | T A S K | O F | A | F R I E N D | T O | B E | T R O U B L E S O M E | S O M E T I M E S | U N M A N N E R L Y | +Y E S | I N D E E D | A N D | I | B E L I E V E | I T | I S | R I G H T | T H A T | I | S H O U L D | K E E P | M Y | F I R S T | P R O M I S E | I S | I T | N O T | +K E E P | Y O U R | A P P O I N T M E N T | A N D | B E | A S S U R E D | T H A T | I | S H A L L | I S S U E | M Y | C O M M A N D S | W I T H | M O R E | C I R C U M S P E C T I O N | F O R | T H E | F U T U R E | A S | I | F I N D | H O W | S T R I C T L Y | T H E Y | A R E | C O M P L I E D | W I T H | +I F | Y O U | T H I N K | S O | M A D A M | I | S E E | N O T H I N G | T H A T | S H O U L D | P R E V E N T | M E | N O W | +N I G H T | A F T E R | N I G H T | H I S | S L E E P | H A D | B E E N | D I S T U R B E D | B Y | F E A R S | F O R | H E R | W H E N | A B R O A D | M O R N I N G | A F T E R | M O R N I N G | I T | H A D | B E E N | B R O K E N | B Y | T H E | C L A M O U R | O F | H E R | R E T U R N | +N O R | H A D | T H I S | G O O D | W O M A N ' S | O F F I C I O U S | L A B O U R S | T A K E N | T H E | L E A S T | F R O M | T H E | A W K W A R D N E S S | O F | T H E | S I L E N C E | W H I C H | A S | S O O N | A S | T H E | B U S T L E | S H E | H A D | M A D E | W A S | O V E R | R E T U R N E D | I N | I T S | F U L L | F O R C E | +S I R | E D W A R D | N O T | W H O L L Y | D I S C O U R A G E D | B Y | T H E | D E N I A L | W I T H | W H I C H | D O R R I F O R T H | H A D | W I T H | D E L I C A C Y | A C Q U A I N T E D | H I M | S T I L L | H O P E D | F O R | A | K I N D | R E C E P T I O N | A N D | W A S | S O | O F T E N | A T | T H E | H O U S E | O F | M I S S U S | H O R T O N | T H A T | L O R D | F R E D E R I C K ' S | J E A L O U S Y | W A S | E X C I T E D | A N D | T H E | T O R T U R E S | H E | S U F F E R E D | I N | C O N S E Q U E N C E | C O N V I N C E D | H I M | B E Y O N D | A | D O U B T | O F | T H E | S I N C E R I T Y | O F | H I S | A F F E C T I O N | +M I S S U S | H O R T O N | T O O | I N | T H E | S E L F | A P P R O V I N G | R E F L E C T I O N | T H A T | S H E | W A S | N O T | I N | A | Q U A R R E L | O R | A L T E R C A T I O N | O F | A N Y | K I N D | F E L T | H E R S E L F | A T | T H I S | M O M E N T | R E M A R K A B L Y | P E A C E F U L | A N D | C H A R I T A B L E | +I | H O P E | M I S S | M I L N E R | Y O U | P A S S | T H I S | E V E N I N G | A T | H O M E | +A T | T H E | U S U A L | H O U R | M I S T E R | D O R R I F O R T H | A N D | H I S | W A R D | W E R E | S U M M O N E D | T O | T E A | H E | E N T E R E D | W I T H | A | C O U N T E N A N C E | W H I C H | E V I N C E D | T H E | R E M A I N S | O F | A N G E R | H I S | E Y E | G A V E | T E S T I M O N Y | O F | H I S | A B S E N T | T H O U G H T S | A N D | T H O U G H | H E | T O O K | U P | A | P A M P H L E T | A F F E C T I N G | T O | R E A D | I T | W A S | P L A I N | T O | D I S C E R N | T H A T | H E | S C A R C E L Y | K N E W | H E | H E L D | I T | I N | H I S | H A N D | +M I S S | W O O D L E Y | T H O U G H T | I T | H E R | D U T Y | T O | B E | M U T E | A N D | N O W | T H E | G I N G L E | O F | A | T E A | S P O O N | W A S | L I K E | A | D E E P | T O N E D | B E L L | A L L | W A S | S O | Q U I E T | +D O R R I F O R T H | T H E N | L A I D | T H E | B O O K | O U T | O F | H I S | H A N D | A N D | B Y | T H E | T I M E | T H E | S E R V A N T | H A D | L E F T | T H E | R O O M | T H U S | B E G A N | +Y E T | D I D | T H E | W A T C H F U L | M I S S | W O O D L E Y | O F T E N T I M E S | H E A R | A | S I G H | E S C A P E | F R O M | H E R | U N K N O W N | T O | H E R S E L F | T I L L | S H E | W A S | R E M I N D E D | O F | I T | A N D | T H E N | A | S U D D E N | B L U S H | W O U L D | I N S T A N T L Y | O V E R S P R E A D | H E R | F A C E | +D O R R I F O R T H | R E A D | O N | A N D | S E E M E D | A F R A I D | O F | L O O K I N G | U P | L E S T | H E | S H O U L D | S E E | W H A T | H E | C O U L D | N O T | H A V E | P A R D O N E D | +I | T H O U G H T | M I S S | M I L N E R | Y O U | G A V E | M E | Y O U R | W O R D | T H A T | Y O U | W O U L D | P A S S | T H I S | E V E N I N G | A T | H O M E | +O N | T H I S | H E | R O S E | F R O M | H I S | C H A I R | A N D | G O I N G | T O | H E R | S A I D | O N C E | M O R E | S H E W | Y O U R | S U B M I S S I O N | B Y | O B E Y I N G | M E | A | S E C O N D | T I M E | T O | D A Y | +W H A T | H E | S A I D | H E | L O O K E D | W I T H | S O | M U C H | S I N C E R I T Y | T H A T | H A D | S H E | B E E N | B U R N I N G | W I T H | R A G E | A T | H I S | L A T E | B E H A V I O U R | S H E | M U S T | H A V E | F O R G I V E N | H I M | F O R | T H E | R E G R E T | W H I C H | H E | S O | F O R C I B L Y | E X P R E S T | +M I S S U S | H O R T O N | R O S E | F R O M | H E R | S E A T | M O V E D | T H E | D E C A N T E R S | A N D | F R U I T | R O U N D | T H E | T A B L E | S T I R R E D | T H E | F I R E | A N D | C A M E | B A C K | T O | H E R | S E A T | A G A I N | B E F O R E | A N O T H E R | W O R D | W A S | U T T E R E D | +M I S S | W O O D L E Y | D I D | N O T | R E C O L L E C T | H E R S E L F | S O | B U T | W A S | S O | I N | R E A L I T Y | I N | H E R | P E A C E | A N D | C H A R I T Y | W E R E | I N S T I N C T I V E | V I R T U E S | A C C I D E N T | C O U L D | N O T | I N C R E A S E | T H E M | +M I S S | M I L N E R | Y O U | S H A L L | N O T | L E A V E | T H E | H O U S E | T H I S | E V E N I N G | S I R | +H E R | H A N D | F E L L | M O T I O N L E S S | F R O M | T H A T | W H I C H | S H E | H E L D | S H E | A P P E A R E D | M O T I O N L E S S | H E R S E L F | T I L L | M I S S U S | H O R T O N | B E S E E C H I N G | H E R | N O T | T O | B E | U N E A S Y | A T | T H E | T R E A T M E N T | S H E | H A D | R E C E I V E D | M A D E | H E R | T E A R S | F L O W | A S | I F | H E R | H E A R T | W A S | B R E A K I N G | +S H E | W A S | G O I N G | T O | R E P L Y | B U T | F O U N D | S H E | C O U L D | N O T | W I T H O U T | A C C O M P A N Y I N G | H E R | W O R D S | W I T H | T E A R S | T H E R E F O R E | A F T E R | T H E | F I R S T | A T T E M P T | S H E | D E S I S T E D | +E V E R Y | T I M E | H E | B E H E L D | T H E | O B J E C T | O F | H I S | P A S S I O N | F O R | H E | S T I L L | C O N T I N U E D | H I S | V I S I T S | T H O U G H | N O T | S O | F R E Q U E N T L Y | A S | H E R E T O F O R E | H E | P L E A D E D | H I S | C A U S E | W I T H | S U C H | A R D O U R | T H A T | M I S S | W O O D L E Y | W H O | W A S | S O M E T I M E S | P R E S E N T | A N D | E V E R | C O M P A S S I O N A T E | C O U L D | N O T | R E S I S T | W I S H I N G | H I M | S U C C E S S | +H E | C O U G H E D | D R A N K | H I S | T E A | E N D E A V O U R E D | T O | T A L K | B U T | F O U N D | I T | D I F F I C U L T | S O M E T I M E S | R E A D | A N D | I N | T H I S | M A N N E R | N E A R | T W O | H O U R S | W E R E | P A S S E D | A W A Y | W H E N | M I S S | M I L N E R | C A M E | I N T O | T H E | R O O M | N O T | D R E S S E D | F O R | A | B A L L | B U T | A S | S H E | H A D | R I S E N | F R O M | D I N N E R | +A N D | H E | W A L K E D | I M M E D I A T E L Y | O U T | O F | T H E | A P A R T M E N T | B Y | A N O T H E R | D O O R | +D O | Y O U | T H I N K | I | W O U L D | G O | A N S W E R E D | M I S S | M I L N E R | W I T H | A N | E A G E R N E S S | T H A T | F O R | A | T I M E | S U P P R E S S E D | H E R | T E A R S | I N | C O N T R A D I C T I O N | T O | H I S | W I L L | +A F T E R | A | F E W | M I N U T E S | P A U S E | A N D | S O M E | L I T T L E | E M B A R R A S S M E N T | O N | T H E | P A R T | O F | M I S S U S | H O R T O N | A T | T H E | D I S A P P O I N T M E N T | S H E | H A D | T O | E N C O U N T E R | F R O M | T H I S | U N E X P E C T E D | D U T I F U L | C O N D U C T | S H E | A S K E D | M I S S | M I L N E R | I F | S H E | W O U L D | N O W | H A V E | A N Y | T E A | +M I S S | W O O D L E Y | O B E D I E N T L Y | S A T | D O W N | A N D | T H O U G H | H E R | T H O U G H T S | A N D | H E A R T | W E R E | I N | T H E | C H A M B E R | O F | H E R | F R I E N D | S H E | N E V E R | M A R K E D | B Y | O N E | I M P E R T I N E N T | W O R D | O R | B Y | O N E | L I N E | O F | H E R | F A C E | T H E | R E S T R A I N T | S H E | S U F F E R E D | +F O R G I V E | T H E | D U T I E S | O F | M Y | O F F I C E | A N D | B E L I E V E | T H A T | N O | O N E | I S | H A L F | S O | M U C H | C O N C E R N E D | I F | I T | R O B S | Y O U | O F | A N Y | D E G R E E | O F | H A P P I N E S S | A S | I | M Y S E L F | A M | +W H E N | A | M A R R I E D | W O M A N | H A S | F O L L O W E R S | A N D | T H E | H U S B A N D | D O N ' T | G O | T H E | W R O N G | S I D E | O F | T H E | P O S T | T O O | O R | I T | A I N ' T | P R O V E D | A G A I N | H I M | T H A T | H E | D O | T H E Y ' L L | N E V E R | L E T | H E R | H A V E | N O T H I N G | T O | D O | W I T H | T H E | C H I L D R E N | +M I S S U S | B O Z Z L E | W A S | D I S P O S E D | T O | T H I N K | T H A T | L A D I E S | O F | Q U A L I T Y | A M O N G | W H O M | M A D A M E | T | W A S | E N T I T L E D | I N | H E R | E S T I M A T I O N | T O | T A K E | R A N K | W E R E | S E L D O M | B E T T E R | T H A N | T H E Y | O U G H T | T O | B E | A N D | S H E | W A S | Q U I T E | W I L L I N G | T H A T | H E R | H U S B A N D | S H O U L D | E A R N | H I S | B R E A D | B Y | W A T C H I N G | T H E | L A D Y | O R | T H E | L A D Y ' S | L O V E R | +H E | C A N ' T | S U C K L E | E M | C A N | H E | +B U T | A S | F O R | T H I S | H E R E | C H I L D | B | +A N D | N O W | I T | H A D | C O M E | T O | P A S S | T H A T | H I S | S O L E | R E M A I N I N G | A L L Y | M I S T E R | S A M U E L | B O Z Z L E | T H E | E X | P O L I C E M A N | W A S | B E C O M I N G | W E A R Y | O F | H I S | S E R V I C E | +A T | L A S T | H E | S E N T | W O R D | T O | S A Y | T H A T | H E | H I M S E L F | W O U L D | B E | I N | E N G L A N D | B E F O R E | T H E | E N D | O F | M A R C H | A N D | W O U L D | S E E | T H A T | T H E | M A J E S T Y | O F | T H E | L A W | S H O U L D | B E | V I N D I C A T E D | I N | H I S | F A V O U R | +B O Z Z L E | A W A Y | F R O M | H I S | O W N | H O M E | O U T | O N | B U S I N E S S | W I T H | H I S | C O A T | B U T T O N E D | O V E R | H I S | B R E A S T | A N D | H I S | B E S T | H A T | I N | H I S | H A N D | W A S | A W A R E | T H A T | H E | C O M M A N D E D | R E S P E C T | A N D | H E | C O U L D | C A R R Y | H I M S E L F | A C C O R D I N G L Y | +B U T | I F | Y O U | A S K | M E | M Y | O P I N I O N | W H Y | I N | C O U R S E | T H E Y ' V E | B E E N | T O G E T H E R | S O M E W H E R E | +I N | T H E | L A S T | C O M M U N I C A T I O N | W H I C H | H E | H A D | R E C E I V E D | F R O M | L A D Y | M I L B O R O U G H | S H E | H A D | S C O L D E D | H I M | I N | T E R M S | T H A T | W E R E | F O R | H E R | S E V E R E | B E C A U S E | H E | H A D | N O T | R E T U R N E D | T O | H I S | W I F E | A N D | T A K E N | H E R | O F F | W I T H | H I M | T O | N A P L E S | +I F | Y O U | W O U L D | H A V E | G O N E | T O | M I S T E R | S K I N T | S I R | S U G G E S T E D | B O Z Z L E | +A N D | H A D | T H E | C A S E | B E E N | B R O U G H T | B E F O R E | T H E | J U D G E | O R D I N A R Y | B Y | M E A N S | O F | H E R | H U S B A N D ' S | E X E R T I O N S | S H E | W O U L D | H A V E | T A K E N | P L E A S U R E | I N | R E A D I N G | E V E R Y | W O R D | O F | T H E | E V I D E N C E | E V E N | T H O U G H | H E R | H U S B A N D | S H O U L D | H A V E | B E E N | E V E R | S O | R O U G H L Y | H A N D L E D | B Y | T H E | L A W Y E R S | +D R A T | E M | A L L | W H A T | I S | I T | T H E Y | W A N T S | T H E Y | D O N ' T | K N O W | W H A T | T H E Y | W A N T S | +B U T | T R E V E L Y A N | W A S | O F | A | D I F F E R E N T | O P I N I O N | A N D | H E | W A S | D I S G U S T E D | A N D | R E V O L T E D | M O S T | U N R E A S O N A B L Y | B Y | T H E | A P P E A R A N C E | O F | H I S | M I N I S T E R ' S | D O M E S T I C | A R R A N G E M E N T S | +I T ' S | T H A T | A S | M A K E S | E M | I | W O N ' T | S A Y | W H A T | +P E R H A P S | Y O U | C O U L D | P U T | O N | Y O U R | C O A T | A N D | W A L K | O U T | W I T H | M E | F O R | A | F E W | M I N U T E S | S A I D | T R E V E L Y A N | +I ' L L | T E L L | Y O U | W H A T | I T | I S | B | E X C L A I M E D | M I S S U S | B O Z Z L E | I T ' S | M Y | B E L I E F | A S | H E | A I N ' T | Q U I T E | R I G H T | U P | H E R E | A N D | M I S S U S | B O Z Z L E | T O U C H E D | H E R | F O R E H E A D | +A | D I S T I N C T | P R O M I S E | O F | A | H U N D R E D | P O U N D S | W A S | M A D E | T O | H I M | I F | H E | W O U L D | H A V E | T H E | C H I L D | R E A D Y | T O | H A N D | O V E R | T O | T R E V E L Y A N | O N | T R E V E L Y A N ' S | A R R I V A L | I N | E N G L A N D | +T R E V E L Y A N | H A D | F O L L O W E D | H I S | L E T T E R | Q U I C K E R | T H A N | H E | H A D | I N T E N D E D | W H E N | I T | W A S | W R I T T E N | A N D | W A S | N O W | W I T H | H I S | P R I M E | M I N I S T E R | B E F O R E | H I S | P R I M E | M I N I S T E R | H A D | B E E N | A B L E | T O | T A K E | A N Y | A C T I O N | O N | T H E | L A S T | I N S T R U C T I O N | R E C E I V E D | +T H E N | B O Z Z L E | C A M E | F O R W A R D | A N D | I N T R O D U C E D | H I S | W I F E | +T H E | P A T E R N A L | P A R E N T | H A S | A | R I G H T | T O | H I S | I N F A N T S | N O | D O U B T | T H A T | W A S | B O Z Z L E ' S | L A W | +I | D O | N O T | S U P P O S E | T H A T | A N Y B O D Y | W I L L | Q U E S T I O N | M Y | R I G H T | T O | H A V E | T H E | C A R E | O F | M Y | O W N | C H I L D | S A I D | T R E V E L Y A N | +I ' V E | W A T C H E D | A S | S H A R P | A S | W A T C H I N G | C A N | G O | P R E T T Y | N E A R | +O F | C O U R S E | I T | A I N ' T | S A I D | M I S S U S | B O Z Z L E | +A S | H E | W E N T | A B O U T | H I S | E Y E S | W E R E | E V E R | C A S T | D O W N W A R D S | A N D | H E | W A L K E D | W I T H | A | Q U I C K | S H U F F L I N G | G A I T | A N D | H E | S U S P E C T E D | O T H E R S | F E E L I N G | T H A T | H E | H I M S E L F | W A S | S U S P E C T E D | +I T | I S | V E R Y | M U C H | E A S I E R | F O R | S U C H | M E N | A S | M I S T E R | B O Z Z L E | T O | C A R R Y | D E C E N C Y | O F | A P P E A R A N C E | A B O U T | W I T H | T H E M | T H A N | T O | K E E P | I T | A T | H O M E | +A N D | H E | D I D | G O | A W A Y | L E A V I N G | B O Z Z L E | S T A N D I N G | I N | T H E | M I D D L E | O F | S T O N Y | W A L K | +A N D | A L L | W O R K | H A D | C E A S E D | W I T H | H I M | +M I S S U S | B O Z Z L E | W H O | W E L L | U N D E R S T O O D | T H A T | B U S I N E S S | W A S | B U S I N E S S | A N D | T H A T | W I V E S | W E R E | N O T | B U S I N E S S | F E L T | N O | A N G E R | A T | T H I S | A N D | H A N D E D | H E R | H U S B A N D | H I S | B E S T | C O A T | +A N D | B O Z Z L E | A S | H E | S A I D | T H I S | S M I L E D | A L M O S T | A L O U D | +D O E S | O N E | M I S T E R | S A M U E L | B O Z Z L E | L I V E | H E R E | A S K E D | T R E V E L Y A N | +H E ' S | U P | I N | T O W N | S I R | A | M I N D I N G | O F | H I S | P A R L I A M E N T A R Y | D U T I E S | +B O Z Z L E | H A D | A L W A Y S | W A I T E D | U P O N | H I M | W I T H | A | D E C E N T | C O A T | A N D | A | W E L L | B R U S H E D | H A T | A N D | C L E A N | S H O E S | +I N | M A K I N G | T H I S | H E | H A D | E X P E C T E D | N O | S U C C E S S | T H O U G H | F R O M | T H E | E N E R G E T I C | N A T U R E | O F | H I S | D I S P O S I T I O N | H E | H A D | M A D E | T H E | A T T E M P T | W I T H | S O M E | Z E A L | +W E | H A V E | B O T H | S E E N | T H E | S A M E | N E W S P A P E R | O F | C O U R S E | A N D | Y O U | H A V E | B E E N | T H E | F I R S T | T O | C L E A R | T H E | T H I N G | U P | T H A T ' S | I T | I S N ' T | I T | +W H A T | A R E | Y O U | D O I N G | H E R E | H E | A S K E D | +E V E N | T H E | C H A N C E | O F | S U C C E S S F U L L Y | C O N F I D I N G | H E R | T O | B E N N Y D E C K ' S | P R O T E C T I O N | H A D | L O S T | S O M E T H I N G | O F | I T S | F A I R | P R O M I S E | S I N C E | R A N D A L ' S | V I S I T | T O | S Y D E N H A M | +S H A L L | I | S A Y | T H A T | S H E | M A Y | E X P E C T | A N | E A R L Y | V I S I T | F R O M | Y O U | W H E N | I | S E E | H E R | T O | M O R R O W | +B U T | I T | M I G H T | P E R H A P S | B E | E X C U S A B L E | T O | I N F E R | T H A T | T H E | M A R R I A G E | H A D | N O T | Y E T | B E E N | D E C I D E D | O N | A N D | T H A T | T H E | C A P T A I N ' S | P R O P O S A L S | W E R E | S T I L L | W A I T I N G | F O R | C A T H E R I N E ' S | R E P L Y | +S U P P O S I N G | T H E | R E P O R T | H A D | B E E N | T R U E | +I N | T H E | M E A N T I M E | A F T E R | W H A T | M I S S U S | P R E S T Y | H A D | C O N F E S S E D | T H E | C R U E L | F A L S E H O O D | W H I C H | H A D | C H E C K E D | P O O R | K I T T Y ' S | N A T U R A L | I N Q U I R I E S | R A I S E D | A N | I N S U P E R A B L E | O B S T A C L E | T O | A | M E E T I N G | B E T W E E N | F A T H E R | A N D | C H I L D | +B E | T H E | R E S U L T S | H O W E V E R | W H A T | T H E Y | M I G H T | R A N D A L | C O U L D | S E E | B U T | O N E | P L A I N | C O U R S E | B E F O R E | H I M | N O W | +H E | H A D | P R O M I S E D | T O | D O | H I S | B E S T | T O W A R D | P E R S U A D I N G | C A T H E R I N E | T O | G R A N T | S Y D N E Y | A N | I N T E R V I E W | +W H A T | H A P P I E R | F U T U R E | C O U L D | A W A I T | H E R | E S P E C I A L L Y | I F | S H E | J U S T I F I E D | R A N D A L ' S | P A S T | E X P E R I E N C E | O F | A L L | T H A T | W A S | C A N D I D | A N D | T R U T H F U L | I N | H E R | C H A R A C T E R | T H A N | T O | B E C O M E | H I S | F R I E N D ' S | W I F E | +Y O U | H A V E | B E E N | T O | T H E | H O T E L | H E | B U R S T | O U T | Y O U | H A V E | S E E N | C A T H E R I N E | +N O T | S A T I S F I E D | W I T H | G O S S I P | I N | P R I V A T E | T H E | G R E E D Y | P U B L I C | A P P E T I T E | D E V O U R S | G O S S I P | I N | P R I N T | A N D | W A N T S | M O R E | O F | I T | T H A N | A N Y | O N E | E D I T O R | C A N | S U P P L Y | +H E | A D D E D | S Y D N E Y ' S | A D D R E S S | I N | A | P O S T S C R I P T | A N D | D I S P A T C H E D | H I S | L E T T E R | T H A T | E V E N I N G | +C O N S I D E R A T I O N S | O F | D E L I C A C Y | S E E M E D | T O | F O R B I D | T A K I N G | T H I S | L I B E R T Y | E V E N | W I T H | A N | I N T I M A T E | F R I E N D | +R A N D A L | H E | S A I D | Y O U | K N O W | W H E R E | S Y D N E Y | I S | +I | H A V E N ' T | C O U R A G E | E N O U G H | T O | D O | I T | F O R | M Y S E L F | +R A N D A L | W R O T E | T O | A C C E P T | T H E | I N V I T A T I O N | D E T E R M I N I N G | T O | P R E S E N T | H I M S E L F | B E F O R E | T H E | A P P O I N T E D | H O U R | A N D | T O | Q U E S T I O N | C A T H E R I N E | P R I V A T E L Y | W I T H O U T | G I V I N G | H E R | T H E | A D V A N T A G E | O V E R | H I M | O F | P R E P A R I N G | H E R S E L F | F O R | T H E | I N T E R V I E W | +H E | P A U S E D | A N D | P U T | H I S | H A N D | T O | H I S | F E V E R E D | H E A D | +I ' M | A F R A I D | H E | S A I D | +H E | P U T | D O W N | T H E | E M P T Y | G L A S S | T A K I N G | N O | N O T I C E | O F | H I S | B R O T H E R ' S | Q U E S T I O N | +I ' M | A L O N E | D O | Y O U | H E A R | T H A T | A L O N E | +T H I S | A L T E R N A T I V E | I N | T H E | C A P T A I N ' S | P L A N S | T E R M I N A T I N G | T H E | V O Y A G E | A | M O N T H | E A R L I E R | T H A N | H I S | A R R A N G E M E N T S | H A D | C O N T E M P L A T E D | P U Z Z L E D | R A N D A L | +I | W I L L | D O | N E I T H E R | T H E | O N E | N O R | T H E | O T H E R | +T H E | S A I L I N G | M A S T E R | A N N O U N C E D | T H A T | H E | H A D | O R D E R S | T O | T A K E | T H E | V E S S E L | B A C K | T O | H E R | P O R T | W I T H | N O | O T H E R | E X P L A N A T I O N | T H A N | T H A T | T H E | C R U I S E | W A S | O V E R | +S H E | S H A L L | H A V E | Y O U R | M E S S A G E | A L L | T H A T | I | C A N | D O | T O | P E R S U A D E | H E R | S H A L L | B E | D O N E | +Y O U | D I S T R E S S | M E | H E R B E R T | M O R E | T H A N | W O R D S | C A N | S A Y | +H E | I S | S T A Y I N G | A T | T H I S | H O T E L | T O | T R Y | T H E | A I R | O F | S Y D E N H A M | A N D | H E | F I N D S | T H A T | I T | A G R E E S | W I T H | H I M | +Y O U | D O N ' T | K N O W | W H A T | I T | I S | T O | B E | U S E D | T O | S E E I N G | A | P R E T T Y | C R E A T U R E | A L W A Y S | N I C E L Y | D R E S S E D | A L W A Y S | A B O U T | T H E | R O O M | T H I N K I N G | S O | M U C H | O F | Y O U | A N D | S O | L I T T L E | O F | H E R S E L F | A N D | T H E N | T O | B E | L E F T | A L O N E | A S | I | A M | L E F T | O U T | I N | T H E | D A R K | +H E | D R A N K | T H E | W I N E | G R E E D I L Y | +R A N D A L | W A I T E D | A | W H I L E | I N | L O N D O N | O N | T H E | C H A N C E | T H A T | B E N N Y D E C K | M I G H T | P A Y | H I M | A | V I S I T | +A F T E R | M O N T H S | O F | S E P A R A T I O N | H E | R E C E I V E D | A | V I S I T | F R O M | H E R B E R T | +L E T | M E | H E A R | W H A T | I T | I S | F I R S T | +N O T | H A V I N G | H E A R D | F R O M | C A P T A I N | B E N N Y D E C K | F O R | S O M E | L I T T L E | T I M E | R A N D A L | T H O U G H T | I T | D E S I R A B L E | I N | S Y D N E Y ' S | I N T E R E S T S | T O | M A K E | I N Q U I R I E S | A T | H I S | C L U B | +W A S | H I S | M I N D | W A N D E R I N G | I N T O | S O M E | O T H E R | T R A I N | O F | T H O U G H T | +O H | W H Y | D I D | I | E N G A G E | T H A T | G O V E R N E S S | +H A D | H E R | B E A U T Y | F A S C I N A T E D | H I M | +H E | M E N T I O N E D | T H E | N A M E | O F | O N E | O F | T H E | O L D | S E R V A N T S | A T | M O U N T | M O R V E N | W H O | H A D | A T T A C H E D | H I M S E L F | T O | R A N D A L | A F T E R | T H E | B R E A K U P | O F | T H E | F A M I L Y | +Y O U | C A N ' T | D O | I T | +I | F E E L | F O R | Y O U | H E R B E R T | H E | S A I D | W A R M L Y | +L E T | M E | R E S T | A | L I T T L E | H E | P L E A D E D | I F | I ' M | N O T | I N | T H E | W A Y | +I | T R I E D | I T | Y E S T E R D A Y | I T | S E T | M Y | B R A I N S | O N | F I R E | I ' M | F E E L I N G | T H A T | G L A S S | I | T O O K | J U S T | N O W | +H O N E S T L Y | +B U T | I F | T H E S E | N E W S P A P E R | P E O P L E | W A I T E D | T O | F I N D | O U T | W H E T H E R | A | R E P O R T | I S | T R U E | O R | F A L S E | H O W | M U C H | G O S S I P | W O U L D | S O C I E T Y | G E T | I N | I T S | F A V O R I T E | N E W S P A P E R S | +W H I L E | H E | W A S | W A L K I N G | U P | A N D | D O W N | T H E | P L A T F O R M | W I T H | A | M I N D | D O U B L Y | D I S T R E S S E D | B Y | A N X I E T Y | A B O U T | H I S | B R O T H E R | A N D | A N X I E T Y | A B O U T | S Y D N E Y | T H E | T R A I N | F R O M | L O N D O N | C A M E | I N | +A F T E R | T H A T | I | H A D | H E R | M O T H E R ' S | A U T H O R I T Y | F O R | T E L L I N G | K I T T Y | T H A T | S H E | W O U L D | N E V E R | S E E | H E R | F A T H E R | A G A I N | +H A V E | Y O U | A N Y | M E S S A G E | F O R | C A P T A I N | B E N N Y D E C K | +S I T | D O W N | S A I D | M I S S U S | P R E S T Y | +W I T H | H I S | O W N | S U S P I C I O N S | S T E A D I L Y | C O N T R A D I C T I N G | H I M | H E | A R R I V E D | A T | T H E | H O T E L | O B S T I N A T E L Y | B E L I E V I N G | T H A T | T H E | C H A R M I N G | W I D O W | W O U L D | P R O V E | T O | B E | A | S T R A N G E R | +T H E | N E W | N U M B E R | O F | A | P O P U L A R | W E E K L Y | J O U R N A L | H A D | T H A T | D A Y | B E E N | P U B L I S H E D | R A N D A L | B O U G H T | I T | +W H E N | H E | A N D | I | H A P P E N E D | T O | B E | L E F T | T O G E T H E R | H E | N A T U R A L L Y | W O N D E R E D | A F T E R | H A V I N G | S E E N | T H E | B E A U T I F U L | W I F E | W H E R E | T H E | L U C K Y | H U S B A N D | M I G H T | B E | +Y O U | W O U L D | H A V E | S E E N | H E R | P I N I N G | F O R | T H E | C O M P A N Y | O F | O T H E R | C H I L D R E N | A N D | W O U L D | H A V E | H A D | N O | M E R C Y | O N | H E R | +W O R S E | S T O R I E S | H A V E | B E E N | P R I N T E D | I | D O | A S S U R E | Y O U | W O R S E | S T O R I E S | H A V E | B E E N | P R I N T E D | +A R R I V E D | A T | T H E | S T A T I O N | R A N D A L | F O U N D | T H A T | H E | M U S T | W A I T | F O R | T H E | T R A I N | +M I S S U S | P R E S T Y | W A S | A T | H O M E | S H E | W A S | R E P O R T E D | T O | B E | I N | T H E | G A R D E N | O F | T H E | H O T E L | +T H E | R E P O R T | I S | P R E M A T U R E | M Y | G O O D | F R I E N D | +G O O D | B Y | D E A R | R A N D A L | +M I S S U S | N O R M A N | A N D | H E R | L I T T L E | D A U G H T E R | W E R E | O U T | D R I V I N G | W I T H | A | F R I E N D | A N D | W E R E | E X P E C T E D | T O | R E T U R N | I N | G O O D | T I M E | F O R | D I N N E R | +H E | W A S | I N T R O D U C E D | T O | M I S S U S | N O R M A N | A N D | T O | M I S S U S | N O R M A N ' S | L I T T L E | G I R L | A N D | W E | W E R E | A L L | C H A R M E D | W I T H | H I M | +B U T | Y O U | O U G H T | T O | H A V E | K N O W N | T H A T | W E | A R E | O N L Y | H A L F | A N | H O U R | B E H I N D | Y O U | A T | S Y D E N H A M | I N | T H E | M A T T E R | O F | N E W S | +Y O U | S H A L L | H E A R | H O W | M Y | D I V O R C E D | D A U G H T E R | A N D | M Y | P O O R | L I T T L E | G R A N D C H I L D | W E R E | T R E A T E D | A T | S A N D Y S E A L | A F T E R | Y O U | L E F T | U S | +S H E | A S K E D | D I R E C T L Y | I F | H E R | F A T H E R | W A S | D E A D | +R A N D A L | P A S S E D | T H I S | O V E R | W I T H O U T | N O T I C E | +A F T E R | R E A D I N G | O N E | O R | T W O | O F | T H E | P O L I T I C A L | A R T I C L E S | H E | A R R I V E D | A T | T H E | C O L U M N S | S P E C I A L L Y | D E V O T E D | T O | F A S H I O N A B L E | I N T E L L I G E N C E | +I T | W A S | A | R E L I E F | T O | R A N D A L | I N | T H E | P R E S E N T | S T A T E | O F | C A T H E R I N E ' S | R E L A T I O N S | T O W A R D | B E N N Y D E C K | T O | R E T U R N | T O | L O N D O N | W I T H O U T | H A V I N G | S E E N | H I S | F R I E N D | +N O T | A T | T H E | H O T E L | J U S T | N O W | +Y O U | A R E | T O | U N D E R S T A N D | T H A T | C A T H E R I N E | I S | A | W I D O W | +O N | T H E | N E X T | D A Y | B U T | O N E | R A N D A L | A R R A N G E D | H I S | D E P A R T U R E | F O R | S Y D E N H A M | S O | A S | T O | A R R I V E | A T | T H E | H O T E L | A N | H O U R | B E F O R E | T H E | T I M E | A P P O I N T E D | F O R | T H E | D I N N E R | +S H E | A D D E D | L O O K I N G | A T | H I M | S U S P I C I O U S L Y | +R A N D A L | L O O K E D | A G A I N | A T | T H E | F I R S T | W O R D S | I N | T H E | P A R A G R A P H | +H O W | N I C E | O F | Y O U | T O | C O M E | S O | S O O N | S H E | B E G A N | +A N D | T H E | C A P T A I N | O F | C O U R S E | C O N C L U D E D | A F T E R | H A V I N G | B E E N | I N T R O D U C E D | T O | K I T T Y | T H A T | M I S S U S | N O R M A N | W A S | A | W I D O W | +T H A T | W I L L | D O | M I S S U S | P R E S T Y | Y O U R | D E F E N S E | I S | T H O R O U G H L Y | W O R T H Y | O F | Y O U R | C O N D U C T | I N | A L L | O T H E R | R E S P E C T S | +A | V E R Y | W I S E | D E C I S I O N | S H E | R E M A R K E D | +B E F O R E | I | C O N S E N T E D | T O | A N S W E R | T H E | C H I L D ' S | I N Q U I R I E S | I | C A M E | T O | A N | U N D E R S T A N D I N G | W I T H | H E R | M O T H E R | +W H I C H | O P P R E S S E D | T H E | M E T R O P O L I T A N S | O F | E U R O P E | A N D | A S I A | I N V A D E D | T H E | P R O V I N C E S | O F | A N T I O C H | A N D | A L E X A N D R I A | A N D | M E A S U R E D | T H E I R | D I O C E S E | B Y | T H E | L I M I T S | O F | T H E | E M P I R E | +T H E | Z E A L | O F | C Y R I L | E X P O S E D | H I M | T O | T H E | P E N A L T I E S | O F | T H E | J U L I A N | L A W | B U T | I N | A | F E E B L E | G O V E R N M E N T | A N D | A | S U P E R S T I T I O U S | A G E | H E | W A S | S E C U R E | O F | I M P U N I T Y | A N D | E V E N | O F | P R A I S E | +A T | T H E | S A M E | T I M E | E V E R Y | A V E N U E | O F | T H E | T H R O N E | W A S | A S S A U L T E D | W I T H | G O L D | +A R D E N T | I N | T H E | P R O S E C U T I O N | O F | H E R E S Y | C Y R I L | A U S P I C I O U S L Y | O P E N E D | H I S | R E I G N | B Y | O P P R E S S I N G | T H E | N O V A T I A N S | T H E | M O S T | I N N O C E N T | A N D | H A R M L E S S | O F | T H E | S E C T A R I E S | +A | W A N D E R I N G | T R I B E | O F | T H E | B L E M M Y E S | O R | N U B I A N S | I N V A D E D | H I S | S O L I T A R Y | P R I S O N | I N | T H E I R | R E T R E A T | T H E Y | D I S M I S S E D | A | C R O W D | O F | U S E L E S S | C A P T I V E S | B U T | N O | S O O N E R | H A D | N E S T O R I U S | R E A C H E D | T H E | B A N K S | O F | T H E | N I L E | T H A N | H E | W O U L D | G L A D L Y | H A V E | E S C A P E D | F R O M | A | R O M A N | A N D | O R T H O D O X | C I T Y | T O | T H E | M I L D E R | S E R V I T U D E | O F | T H E | S A V A G E S | +N E S T O R I U S | W H O | D E P E N D E D | O N | T H E | N E A R | A P P R O A C H | O F | H I S | E A S T E R N | F R I E N D S | P E R S I S T E D | L I K E | H I S | P R E D E C E S S O R | C H R Y S O S T O M | T O | D I S C L A I M | T H E | J U R I S D I C T I O N | A N D | T O | D I S O B E Y | T H E | S U M M O N S | O F | H I S | E N E M I E S | T H E Y | H A S T E N E D | H I S | T R I A L | A N D | H I S | A C C U S E R | P R E S I D E D | I N | T H E | S E A T | O F | J U D G M E N T | +B Y | T H E | V I G I L A N C E | O F | M E M N O N | T H E | C H U R C H E S | W E R E | S H U T | A G A I N S T | T H E M | A N D | A | S T R O N G | G A R R I S O N | W A S | T H R O W N | I N T O | T H E | C A T H E D R A L | +T H E | V A N I T Y | O F | C E L E S T I N E | W A S | F L A T T E R E D | B Y | T H E | A P P E A L | A N D | T H E | P A R T I A L | V E R S I O N | O F | A | M O N K | D E C I D E D | T H E | F A I T H | O F | T H E | P O P E | W H O | W I T H | H I S | L A T I N | C L E R G Y | W A S | I G N O R A N T | O F | T H E | L A N G U A G E | T H E | A R T S | A N D | T H E | T H E O L O G Y | O F | T H E | G R E E K S | +S I X T Y | E I G H T | B I S H O P S | T W E N T Y | T W O | O F | M E T R O P O L I T A N | R A N K | D E F E N D E D | H I S | C A U S E | B Y | A | M O D E S T | A N D | T E M P E R A T E | P R O T E S T | T H E Y | W E R E | E X C L U D E D | F R O M | T H E | C O U N C I L S | O F | T H E I R | B R E T H R E N | +A T | T H E S E | B L A S P H E M O U S | S O U N D S | T H E | P I L L A R S | O F | T H E | S A N C T U A R Y | W E R E | S H A K E N | +S U C H | C R I M E S | W O U L D | H A V E | D E S E R V E D | T H E | A N I M A D V E R S I O N | O F | T H E | M A G I S T R A T E | B U T | I N | T H I S | P R O M I S C U O U S | O U T R A G E | T H E | I N N O C E N T | W E R E | C O N F O U N D E D | W I T H | T H E | G U I L T Y | A N D | A L E X A N D R I A | W A S | I M P O V E R I S H E D | B Y | T H E | L O S S | O F | A | W E A L T H Y | A N D | I N D U S T R I O U S | C O L O N Y | +T H E | F E E B L E | S O N | O F | A R C A D I U S | W A S | A L T E R N A T E L Y | S W A Y E D | B Y | H I S | W I F E | A N D | S I S T E R | B Y | T H E | E U N U C H S | A N D | W O M E N | O F | T H E | P A L A C E | S U P E R S T I T I O N | A N D | A V A R I C E | W E R E | T H E I R | R U L I N G | P A S S I O N S | A N D | T H E | O R T H O D O X | C H I E F S | W E R E | A S S I D U O U S | I N | T H E I R | E N D E A V O R S | T O | A L A R M | T H E | F O R M E R | A N D | T O | G R A T I F Y | T H E | L A T T E R | +R E T U R N | T O | Y O U R | P R O V I N C E S | A N D | M A Y | Y O U R | P R I V A T E | V I R T U E S | R E P A I R | T H E | M I S C H I E F | A N D | S C A N D A L | O F | Y O U R | M E E T I N G | +A | R U M O R | W A S | S P R E A D | A M O N G | T H E | C H R I S T I A N S | T H A T | T H E | D A U G H T E R | O F | T H E O N | W A S | T H E | O N L Y | O B S T A C L E | T O | T H E | R E C O N C I L I A T I O N | O F | T H E | P R A E F E C T | A N D | T H E | A R C H B I S H O P | A N D | T H A T | O B S T A C L E | W A S | S P E E D I L Y | R E M O V E D | +O R E S T E S | C O M P L A I N E D | B U T | H I S | J U S T | C O M P L A I N T S | W E R E | T O O | Q U I C K L Y | F O R G O T T E N | B Y | T H E | M I N I S T E R S | O F | T H E O D O S I U S | A N D | T O O | D E E P L Y | R E M E M B E R E D | B Y | A | P R I E S T | W H O | A F F E C T E D | T O | P A R D O N | A N D | C O N T I N U E D | T O | H A T E | T H E | P R A E F E C T | O F | E G Y P T | +D U R I N G | A | B U S Y | P E R I O D | O F | T H R E E | M O N T H S | T H E | E M P E R O R | T R I E D | E V E R Y | M E T H O D | E X C E P T | T H E | M O S T | E F F E C T U A L | M E A N S | O F | I N D I F F E R E N C E | A N D | C O N T E M P T | T O | R E C O N C I L E | T H I S | T H E O L O G I C A L | Q U A R R E L | +W I T H O U T | A N Y | L E G A L | S E N T E N C E | W I T H O U T | A N Y | R O Y A L | M A N D A T E | T H E | P A T R I A R C H | A T | T H E | D A W N | O F | D A Y | L E D | A | S E D I T I O U S | M U L T I T U D E | T O | T H E | A T T A C K | O F | T H E | S Y N A G O G U E S | +T H E | P A S T | H E | R E G R E T T E D | H E | W A S | D I S C O N T E N T E D | W I T H | T H E | P R E S E N T | A N D | T H E | F U T U R E | H E | H A D | R E A S O N | T O | D R E A D | T H E | O R I E N T A L | B I S H O P S | S U C C E S S I V E L Y | D I S E N G A G E D | T H E I R | C A U S E | F R O M | H I S | U N P O P U L A R | N A M E | A N D | E A C H | D A Y | D E C R E A S E D | T H E | N U M B E R | O F | T H E | S C H I S M A T I C S | W H O | R E V E R E D | N E S T O R I U S | A S | T H E | C O N F E S S O R | O F | T H E | F A I T H | +B U T | I N | T H I S | A W F U L | M O M E N T | O F | T H E | D A N G E R | O F | T H E | C H U R C H | T H E I R | V O W | W A S | S U P E R S E D E D | B Y | A | M O R E | S U B L I M E | A N D | I N D I S P E N S A B L E | D U T Y | +E X T E R M I N A T E | W I T H | M E | T H E | H E R E T I C S | A N D | W I T H | Y O U | I | W I L L | E X T E R M I N A T E | T H E | P E R S I A N S | +B U T | T H E | V A T I C A N | R E C E I V E D | W I T H | O P E N | A R M S | T H E | M E S S E N G E R S | O F | E G Y P T | +B U T | T H E | P R E V A I L I N G | D O C T R I N E | O F | T H E | E T E R N I T Y | A N D | I N H E R E N T | P R A V I T Y | O F | M A T T E R | I N F E C T E D | T H E | P R I M I T I V E | C H U R C H E S | O F | T H E | E A S T | +H E | F I R S T | A P P E A R E D | O N | T H E | B A N K S | O F | T H E | J O R D A N | I N | T H E | F O R M | O F | P E R F E C T | M A N H O O D | B U T | I T | W A S | A | F O R M | O N L Y | A N D | N O T | A | S U B S T A N C E | A | H U M A N | F I G U R E | C R E A T E D | B Y | T H E | H A N D | O F | O M N I P O T E N C E | T O | I M I T A T E | T H E | F A C U L T I E S | A N D | A C T I O N S | O F | A | M A N | A N D | T O | I M P O S E | A | P E R P E T U A L | I L L U S I O N | O N | T H E | S E N S E S | O F | H I S | F R I E N D S | A N D | E N E M I E S | +A | L A U D A B L E | R E G A R D | F O R | T H E | H O N O R | O F | T H E | F I R S T | P R O S E L Y T E | H A S | C O U N T E N A N C E D | T H E | B E L I E F | T H E | H O P E | T H E | W I S H | T H A T | T H E | E B I O N I T E S | O R | A T | L E A S T | T H E | N A Z A R E N E S | W E R E | D I S T I N G U I S H E D | O N L Y | B Y | T H E I R | O B S T I N A T E | P E R S E V E R A N C E | I N | T H E | P R A C T I C E | O F | T H E | M O S A I C | R I T E S | +B U T | T H E | R A S H N E S S | O F | T H E S E | C O N C E S S I O N S | H A S | E N C O U R A G E D | A | M I L D E R | S E N T I M E N T | O F | T H O S E | O F | T H E | D O C E T E S | W H O | T A U G H T | N O T | T H A T | C H R I S T | W A S | A | P H A N T O M | B U T | T H A T | H E | W A S | C L O T H E D | W I T H | A N | I M P A S S I B L E | A N D | I N C O R R U P T I B L E | B O D Y | +H E | L I V E D | A N D | D I E D | F O R | T H E | S E R V I C E | O F | M A N K I N D | B U T | T H E | L I F E | A N D | D E A T H | O F | S O C R A T E S | H A D | L I K E W I S E | B E E N | D E V O T E D | T O | T H E | C A U S E | O F | R E L I G I O N | A N D | J U S T I C E | A N D | A L T H O U G H | T H E | S T O I C | O R | T H E | H E R O | M A Y | D I S D A I N | T H E | H U M B L E | V I R T U E S | O F | J E S U S | T H E | T E A R S | W H I C H | H E | S H E D | O V E R | H I S | F R I E N D | A N D | C O U N T R Y | M A Y | B E | E S T E E M E D | T H E | P U R E S T | E V I D E N C E | O F | H I S | H U M A N I T Y | +A | F O E T U S | T H A T | C O U L D | I N C R E A S E | F R O M | A N | I N V I S I B L E | P O I N T | T O | I T S | F U L L | M A T U R I T Y | A | C H I L D | T H A T | C O U L D | A T T A I N | T H E | S T A T U R E | O F | P E R F E C T | M A N H O O D | W I T H O U T | D E R I V I N G | A N Y | N O U R I S H M E N T | F R O M | T H E | O R D I N A R Y | S O U R C E S | M I G H T | C O N T I N U E | T O | E X I S T | W I T H O U T | R E P A I R I N G | A | D A I L Y | W A S T E | B Y | A | D A I L Y | S U P P L Y | O F | E X T E R N A L | M A T T E R | +Y E T | T H E | M O S T | C H A R I T A B L E | C R I T I C I S M | M U S T | R E F U S E | T H E S E | S E C T A R I E S | A N Y | K N O W L E D G E | O F | T H E | P U R E | A N D | P R O P E R | D I V I N I T Y | O F | C H R I S T | +H I S | P R O G R E S S | F R O M | I N F A N C Y | T O | Y O U T H | A N D | M A N H O O D | W A S | M A R K E D | B Y | A | R E G U L A R | I N C R E A S E | I N | S T A T U R E | A N D | W I S D O M | A N D | A F T E R | A | P A I N F U L | A G O N Y | O F | M I N D | A N D | B O D Y | H E | E X P I R E D | O N | T H E | C R O S S | +T H E I R | M U R M U R S | W E R E | V A R I O U S L Y | S I L E N C E D | B Y | T H E | S E C T A R I E S | W H O | E S P O U S E D | A N D | M O D I F I E D | T H E | D O U B L E | S Y S T E M | O F | C E R I N T H U S | +W H E N | T H E | M E S S I A H | W A S | D E L I V E R E D | I N T O | T H E | H A N D S | O F | T H E | J E W S | T H E | C H R I S T | A N | I M M O R T A L | A N D | I M P A S S I B L E | B E I N G | F O R S O O K | H I S | E A R T H L Y | T A B E R N A C L E | F L E W | B A C K | T O | T H E | P L E R O M A | O R | W O R L D | O F | S P I R I T S | A N D | L E F T | T H E | S O L I T A R Y | J E S U S | T O | S U F F E R | T O | C O M P L A I N | A N D | T O | E X P I R E | +H E | A C Q U I E S C E D | I N | T H E | O L D | D I S T I N C T I O N | O F | T H E | G R E E K | P H I L O S O P H E R S | B E T W E E N | T H E | R A T I O N A L | A N D | S E N S I T I V E | S O U L | O F | M A N | T H A T | H E | M I G H T | R E S E R V E | T H E | L O G O S | F O R | I N T E L L E C T U A L | F U N C T I O N S | A N D | E M P L O Y | T H E | S U B O R D I N A T E | H U M A N | P R I N C I P L E | I N | T H E | M E A N E R | A C T I O N S | O F | A N I M A L | L I F E | +M A N Y | A M O N G | T H E | G E N T I L E | P R O S E L Y T E S | R E F U S E D | T O | B E L I E V E | T H A T | A | C E L E S T I A L | S P I R I T | A N | U N D I V I D E D | P O R T I O N | O F | T H E | F I R S T | E S S E N C E | H A D | B E E N | P E R S O N A L L Y | U N I T E D | W I T H | A | M A S S | O F | I M P U R E | A N D | C O N T A M I N A T E D | F L E S H | A N D | I N | T H E I R | Z E A L | F O R | T H E | D I V I N I T Y | T H E Y | P I O U S L Y | A B J U R E D | T H E | H U M A N I T Y | O F | C H R I S T | +N O R | C O U L D | I T | S E E M | S T R A N G E | O R | I N C R E D I B L E | T H A T | T H E | F I R S T | O F | T H E S E | A E O N S | T H E | L O G O S | O R | W O R D | O F | G O D | O F | T H E | S A M E | S U B S T A N C E | W I T H | T H E | F A T H E R | S H O U L D | D E S C E N D | U P O N | E A R T H | T O | D E L I V E R | T H E | H U M A N | R A C E | F R O M | V I C E | A N D | E R R O R | A N D | T O | C O N D U C T | T H E M | I N | T H E | P A T H S | O F | L I F E | A N D | I M M O R T A L I T Y | +I N | T H E I R | E Y E S | J E S U S | O F | N A Z A R E T H | W A S | A | M E R E | M O R T A L | T H E | L E G I T I M A T E | S O N | O F | J O S E P H | A N D | M A R Y | B U T | H E | W A S | T H E | B E S T | A N D | W I S E S T | O F | T H E | H U M A N | R A C E | S E L E C T E D | A S | T H E | W O R T H Y | I N S T R U M E N T | T O | R E S T O R E | U P O N | E A R T H | T H E | W O R S H I P | O F | T H E | T R U E | A N D | S U P R E M E | D E I T Y | +T H E | W O R T H Y | F R I E N D | O F | A T H A N A S I U S | T H E | W O R T H Y | A N T A G O N I S T | O F | J U L I A N | H E | B R A V E L Y | W R E S T L E D | W I T H | T H E | A R I A N S | A N D | P O L Y T H E I S T S | A N D | T H O U G H | H E | A F F E C T E D | T H E | R I G O R | O F | G E O M E T R I C A L | D E M O N S T R A T I O N | H I S | C O M M E N T A R I E S | R E V E A L E D | T H E | L I T E R A L | A N D | A L L E G O R I C A L | S E N S E | O F | T H E | S C R I P T U R E S | +B U T | T H E | J U S T I C E | A N D | G E N E R O S I T Y | O F | S U C H | A | D E S E R T I O N | A R E | S T R O N G L Y | Q U E S T I O N A B L E | A N D | T H E | F A T E | O F | A N | I N N O C E N T | M A R T Y R | A T | F I R S T | I M P E L L E D | A N D | A T | L E N G T H | A B A N D O N E D | B Y | H I S | D I V I N E | C O M P A N I O N | M I G H T | P R O V O K E | T H E | P I T Y | A N D | I N D I G N A T I O N | O F | T H E | P R O F A N E | +U N D E R | T H E | T U I T I O N | O F | T H E | A B B O T | S E R A P I O N | H E | A P P L I E D | H I M S E L F | T O | E C C L E S I A S T I C A L | S T U D I E S | W I T H | S U C H | I N D E F A T I G A B L E | A R D O R | T H A T | I N | T H E | C O U R S E | O F | O N E | S L E E P L E S S | N I G H T | H E | H A S | P E R U S E D | T H E | F O U R | G O S P E L S | T H E | C A T H O L I C | E P I S T L E S | A N D | T H E | E P I S T L E | T O | T H E | R O M A N S | +T H E | S O N | O F | A | V I R G I N | G E N E R A T E D | B Y | T H E | I N E F F A B L E | O P E R A T I O N | O F | T H E | H O L Y | S P I R I T | W A S | A | C R E A T U R E | W I T H O U T | E X A M P L E | O R | R E S E M B L A N C E | S U P E R I O R | I N | E V E R Y | A T T R I B U T E | O F | M I N D | A N D | B O D Y | T O | T H E | C H I L D R E N | O F | A D A M | +T H E I R | C H U R C H E S | H A V E | D I S A P P E A R E D | T H E I R | B O O K S | A R E | O B L I T E R A T E D | T H E I R | O B S C U R E | F R E E D O M | M I G H T | A L L O W | A | L A T I T U D E | O F | F A I T H | A N D | T H E | S O F T N E S S | O F | T H E I R | I N F A N T | C R E E D | W O U L D | B E | V A R I O U S L Y | M O U L D E D | B Y | T H E | Z E A L | O R | P R U D E N C E | O F | T H R E E | H U N D R E D | Y E A R S | +Y E T | A S | T H E | P R O F O U N D | D O C T O R | H A D | B E E N | T E R R I F I E D | A T | H I S | O W N | R A S H N E S S | A P O L L I N A R I S | W A S | H E A R D | T O | M U T T E R | S O M E | F A I N T | A C C E N T S | O F | E X C U S E | A N D | E X P L A N A T I O N | +B U T | I N S T E A D | O F | A | T E M P O R A R Y | A N D | O C C A S I O N A L | A L L I A N C E | T H E Y | E S T A B L I S H E D | A N D | W E | S T I L L | E M B R A C E | T H E | S U B S T A N T I A L | I N D I S S O L U B L E | A N D | E V E R L A S T I N G | U N I O N | O F | A | P E R F E C T | G O D | W I T H | A | P E R F E C T | M A N | O F | T H E | S E C O N D | P E R S O N | O F | T H E | T R I N I T Y | W I T H | A | R E A S O N A B L E | S O U L | A N D | H U M A N | F L E S H | +Y O U ' V E | G O T | A | B I R T H D A Y | P R E S E N T | T H I S | T I M E | J I M | A N D | N O | M I S T A K E | +T H E | W E E K | F O L L O W I N G | C H R I S T M A S | B R O U G H T | I N | A | T H A W | A N D | B Y | N E W | Y E A R ' S | D A Y | A L L | T H E | W O R L D | A B O U T | U S | W A S | A | B R O T H | O F | G R A Y | S L U S H | A N D | T H E | G U T T E R E D | S L O P E | B E T W E E N | T H E | W I N D M I L L | A N D | T H E | B A R N | W A S | R U N N I N G | B L A C K | W A T E R | +I T | W A S | T H E | F I R S T | T I M E | M I S S U S | S H I M E R D A | H A D | B E E N | T O | O U R | H O U S E | A N D | S H E | R A N | A B O U T | E X A M I N I N G | O U R | C A R P E T S | A N D | C U R T A I N S | A N D | F U R N I T U R E | A L L | T H E | W H I L E | C O M M E N T I N G | U P O N | T H E M | T O | H E R | D A U G H T E R | I N | A N | E N V I O U S | C O M P L A I N I N G | T O N E | +T H E Y | B E G A N | T O | L A U G H | B O I S T E R O U S L Y | W H E N | T H E Y | S A W | M E | C A L L I N G | +B U T | Y O U | S E E | A | B O D Y | N E V E R | K N O W S | W H A T | T R A I T S | P O V E R T Y | M I G H T | B R I N G | O U T | I N | E M | +Y O U R | M A M A | I | S A I D | A N G R I L Y | W A N T S | O T H E R | P E O P L E ' S | T H I N G S | +F O R | A M B R O S C H | M Y | M A M A | C O M E | H E R E | +T H E | B O A R D | N O T | S O | F O R M I D A B L E | A S | S H E | H A D | I M A G I N E D | H A D | I N Q U I R E D | I N T O | H E R | C A S E | A N D | I N S T E A D | O F | S E N D I N G | H E R | T O | S T O K E | C L A Y P O L E | H E R | H U S B A N D ' S | B U C K I N G H A M S H I R E | P A R I S H | A S | S H E | H A D | D R E A D E D | H A D | A G R E E D | T O | P A Y | H E R | R E N T | +T H E | G H O U L | L I K E | F E V E R | W A S | N O T | T O | B E | B R A V E D | W I T H | I M P U N I T Y | A N D | B A U L K E D | O F | I T S | P R E Y | +A F O R E | C H R I S T M A S | T I M E | I | W A S | A S | F U L L | A S | F U L L | C O U L D | B E | O F | G O I N G | H O M E | F O R | G O O D | A N D | A L L | Y O | H A N | H E A R D | H O W | I ' V E | W I S H E D | I T | T H I S | T E R R I B L E | L O N G | T I M E | +B U T | T H E | B E S T | O F | H E R | P L A N S | T H E | H O L I E S T | T H A T | W H I C H | I N | S O M E | M E A S U R E | R E D E E M E D | T H E | V A N I T Y | O F | T H E | R E S T | W E R E | T H O S E | R E L A T I N G | T O | H E R | F A T H E R | H E R | D E A R | F A T H E R | N O W | O P P R E S S E D | W I T H | C A R E | A N D | A L W A Y S | A | D I S H E A R T E N E D | G L O O M Y | P E R S O N | +T H E N | A L I C E | B R O K E | T H E | S I L E N C E | B Y | S A Y I N G | +H E R | C R I E S | B R O U G H T | H E R | H U S B A N D | D O W N | T O | T R Y | W I T H | H I S | A C H I N G | H E A R T | T O | C O M F O R T | H E R S | +I S | T H E R E | A N Y | C H A N C E | F O R | T H E | O T H E R | O N E | T H I N K | Y O U | +B U T | H E | S T A Y E D | L O N G | T H E R E | A N D | A T | L A S T | H I S | S T U R D Y | F R A M E | S H O O K | W I T H | H I S | S T R O N G | A G O N Y | +H E R | T H O U G H T S | R A N | O N | J E M ' S | M A N N E R | A N D | W O R D S | N O T | B U T | W H A T | S H E | H A D | K N O W N | T H E | T A L E | T H E Y | T O L D | F O R | M A N Y | A | D A Y | B U T | S T I L L | S H E | W I S H E D | H E | H A D | N O T | P U T | I T | S O | P L A I N L Y | +M A R Y | A N D | A L I C E | D R E W | N E A R | T H E | F I R E | A N D | S T O O D | I N | Q U I E T | S O R R O W | F O R | S O M E | T I M E | +T H E R E | W A S | S O M E T H I N G | O F | K E E N | P R A C T I C A L | S H R E W D N E S S | A B O U T | H E R | W H I C H | C O N T R A S T E D | V E R Y | B E W I T C H I N G L Y | W I T H | T H E | S I M P L E | F O O L I S H | U N W O R L D L Y | I D E A S | S H E | H A D | P I C K E D | U P | F R O M | T H E | R O M A N C E S | W H I C H | M I S S | S I M M O N D S | Y O U N G | L A D I E S | W E R E | I N | T H E | H A B I T | O F | R E C O M M E N D I N G | T O | E A C H | O T H E R | Y E S | +T H E | O L D | L E A V E N | I N F U S E D | Y E A R S | A G O | B Y | H E R | A U N T | E S T H E R | F E R M E N T E D | I N | H E R | L I T T L E | B O S O M | A N D | P E R H A P S | A L L | T H E | M O R E | F O R | H E R | F A T H E R ' S | A V E R S I O N | T O | T H E | R I C H | A N D | T H E | G E N T L E | +S H E | O P E N E D | T H E | D O O R | S O F T L Y | T H E R E | S A T | M I S S U S | W I L S O N | I N | T H E | O L D | R O C K I N G | C H A I R | W I T H | O N E | S I C K | D E A T H | L I K E | B O Y | L Y I N G | O N | H E R | K N E E | C R Y I N G | W I T H O U T | L E T | O R | P A U S E | B U T | S O F T L Y | G E N T L Y | A S | F E A R I N G | T O | D I S T U R B | T H E | T R O U B L E D | G A S P I N G | C H I L D | W H I L E | B E H I N D | H E R | O L D | A L I C E | L E T | H E R | F A S T | D R O P P I N G | T E A R S | F A L L | D O W N | O N | T H E | D E A D | B O D Y | O F | T H E | O T H E R | T W I N | W H I C H | S H E | W A S | L A Y I N G | O U T | O N | A | B O A R D | P L A C E D | O N | A | S O R T | O F | S O F A | S E T T E E | I N | A | C O R N E R | O F | T H E | R O O M | +B U T | E A R N E S T | A S | T H E | F A T H E R | W A S | I N | W A T C H I N G | T H E | Y E T | L I V I N G | H E | H A D | E Y E S | A N D | E A R S | F O R | A L L | T H A T | C O N C E R N E D | T H E | D E A D | A N D | S P R A N G | G E N T L Y | U P | A N D | T O O K | H I S | D E A D | S O N | O N | H I S | H A R D | C O U C H | I N | H I S | A R M S | W I T H | T E N D E R | S T R E N G T H | A N D | C A R R I E D | H I M | U P S T A I R S | A S | I F | A F R A I D | O F | W A K E N I N G | H I M | +M A R Y | I | A L M O S T | L O A T H E | M Y S E L F | W H E N | I | F E E L | I | W O U L D | N O T | G I V E | U P | T H I S | M I N U T E | W H E N | M Y | B R O T H E R S | L I E | D E A D | A N D | F A T H E R | A N D | M O T H E R | A R E | I N | S U C H | T R O U B L E | F O R | A L L | M Y | L I F E | T H A T ' S | P A S T | A N D | G O N E | A N D | M A R Y | A S | S H E | T R I E D | T O | R E L E A S E | H E R | H A N D | Y O U | K N O W | W H A T | M A K E S | M E | F E E L | S O | B L E S S E D | +D O N ' T | J E M | P L E A S E | D O N ' T | W H I S P E R E D | S H E | A G A I N | B E L I E V I N G | T H A T | H I S | S I L E N C E | W A S | O N L Y | A N O T H E R | F O R M | O F | G R I E F | +H E | R E M A I N E D | U P | S T A I R S | U N T I L | A F T E R | T H E | E A R L Y | D A W N | S H O W E D | M A R Y | T H A T | S H E | N E E D | H A V E | N O | F E A R | O F | G O I N G | H O M E | T H R O U G H | T H E | D E S E R T E D | A N D | Q U I E T | S T R E E T S | T O | T R Y | A N D | G E T | A | L I T T L E | S L E E P | B E F O R E | W O R K | H O U R | +O H | J E M | D O N ' T | G I V E | W A Y | S O | I | C A N N O T | B E A R | T O | S E E | Y O U | +S H E | S T O P P E D | W I T H | H E R | H A N D | O N | T H E | L A T C H | O F | T H E | W I L S O N S | D O O R | T O | S T I L L | H E R | B E A T I N G | H E A R T | A N D | L I S T E N E D | T O | T H E | H U S H E D | Q U I E T | W I T H I N | +M A R G A R E T | M E T | J E M | W I L S O N | S E V E R A L | D A Y S | A F T E R | H I S | B R O T H E R S | W E R E | S E R I O U S L Y | I L L | A N D | H E A R D | F R O M | H I M | T H E | S T A T E | O F | T H I N G S | A T | H I S | H O M E | +O V E R | T H E | C H I L D | W H I C H | Y E T | B R E A T H E D | T H E | F A T H E R | B E N T | W A T C H I N G | A N X I O U S L Y | F O R | S O M E | G R O U N D | O F | H O P E | W H E R E | H O P E | T H E R E | W A S | N O N E | +S O | L E A V I N G | K I N D | M E S S A G E S | T O | G E O R G E | A N D | J A N E | W I L S O N | A N D | H E S I T A T I N G | W H E T H E R | S H E | M I G H T | D A R E | T O | S E N D | A | F E W | K I N D | W O R D S | T O | J E M | A N D | D E C I D I N G | T H A T | S H E | H A D | B E T T E R | N O T | S H E | S T E P P E D | O U T | I N T O | T H E | B R I G H T | M O R N I N G | L I G H T | S O | F R E S H | A | C O N T R A S T | T O | T H E | D A R K E N E D | R O O M | W H E R E | D E A T H | H A D | B E E N | +W H A T | B A N K R U P T S | I N | T H E | W O R L D | W E | F E E L | W H E N | D E A T H | L I K E | S O M E | R E M O R S E L E S S | C R E D I T O R | S E I Z E S | O N | A L L | W E | F O N D L Y | T H O U G H T | O U R | O W N | T H E | T W I N S | +T H E N | T H E | M O T H E R | L I F T E D | U P | H E R | V O I C E | A N D | W E P T | +I T | W A S | A | C O M F O R T | T O | H E R | W H E N | S C O L D E D | B Y | M I S S | S I M M O N D S | T O | T H I N K | O F | T H E | D A Y | W H E N | S H E | W O U L D | D R I V E | U P | T O | T H E | D O O R | I N | H E R | O W N | C A R R I A G E | T O | O R D E R | H E R | G O W N S | F R O M | T H E | H A S T Y | T E M P E R E D | Y E T | K I N D | D R E S S M A K E R | +H E | D I D | N O T | S P E A K | A S | T H O U G H | F E A R I N G | T O | D E S T R O Y | B Y | S O U N D | O R | M O T I O N | T H E | H A P P I N E S S | O F | T H A T | M O M E N T | W H E N | H E R | S O F T | H A N D ' S | T O U C H | T H R I L L E D | T H R O U G H | H I S | F R A M E | A N D | H E R | S I L V E R Y | V O I C E | W A S | W H I S P E R I N G | T E N D E R N E S S | I N | H I S | E A R | +I | T H I N K | I | C A N N O T | G O | R I G H T | F O R | I | E I T H E R | C H E C K | M Y S E L F | T I L L | I ' M | D O W N R I G H T | C R O S S | T O | H I M | O R | E L S E | I | S P E A K | J U S T | N A T U R A L | A N D | T H A T ' S | T O O | K I N D | A N D | T E N D E R | B Y | H A L F | +H O W | I N F I N I T E | T H E | W E A L T H | O F | L O V E | A N D | H O P E | G A R N E R E D | I N | T H E S E | S A M E | T I N Y | T R E A S U R E | H O U S E S | A N D | O H | +W I S H I N G | H I M | S A I D | M A R Y | I N | A | T O N E | O F | I N Q U I R Y | +I | C A N N O T | T H I N K | W H A T | P O S S E S S E S | M E | T H A T | I | M U S T | A L W A Y S | B E | W A N T I N G | T O | C O M F O R T | H I M | W H E N | H E ' S | D O W N C A S T | A N D | T H A T | I | M U S T | G O | M E D D L I N G | W I | H I M | T O | N I G H T | W H E N | S U R E | E N O U G H | I T | W A S | H I S | A U N T ' S | P L A C E | T O | S P E A K | T O | H I M | +B U T | W I L L | H E | T H A N K | M E | F O R | I T | +I | P U T | O N | M Y | C A P | A N D | R A N | O U T | T O | M E E T | J A K E | +O N | T H E | W H I T E | P A G E S | I | G R O U P E D | S U N D A Y | S C H O O L | C A R D S | A N D | A D V E R T I S I N G | C A R D S | W H I C H | I | H A D | B R O U G H T | F R O M | M Y | O L D | C O U N T R Y | +A N Y W A Y | H E | W O U L D | N E V E R | A L L O W | O N E | O F | H I S | H O R S E S | T O | B E | P U T | T O | S U C H | A | S T R A I N | +T H E Y | S A T | A B O U T | T H E | H O U S E | M O S T | O F | T H E | D A Y | A S | I F | I T | W E R E | S U N D A Y | G R E A S I N G | T H E I R | B O O T S | M E N D I N G | T H E I R | S U S P E N D E R S | P L A I T I N G | W H I P L A S H E S | +I | C A N | S E E | T H E M | N O W | E X A C T L Y | A S | T H E Y | L O O K E D | W O R K I N G | A B O U T | T H E | T A B L E | I N | T H E | L A M P L I G H T | J A K E | W I T H | H I S | H E A V Y | F E A T U R E S | S O | R U D E L Y | M O U L D E D | T H A T | H I S | F A C E | S E E M E D | S O M E H O W | U N F I N I S H E D | O T T O | W I T H | H I S | H A L F | E A R | A N D | T H E | S A V A G E | S C A R | T H A T | M A D E | H I S | U P P E R | L I P | C U R L | S O | F E R O C I O U S L Y | U N D E R | H I S | T W I S T E D | M U S T A C H E | +S H E | C U T | S Q U A R E S | O F | C O T T O N | C L O T H | A N D | W E | S E W E D | T H E M | T O G E T H E R | I N T O | A | B O O K | +B Y | T H E | T I M E | W E | H A D | P L A C E D | T H E | C O L D | F R E S H | S M E L L I N G | L I T T L E | T R E E | I N | A | C O R N E R | O F | T H E | S I T T I N G | R O O M | I T | W A S | A L R E A D Y | C H R I S T M A S | E V E | +I | H A D | W A N T E D | T O | G E T | S O M E | P I C T U R E | B O O K S | F O R | Y U L K A | A N D | A N T O N I A | E V E N | Y U L K A | W A S | A B L E | T O | R E A D | A | L I T T L E | N O W | +H E | U S E D | T O | H E L P | M Y | F A T H E R | C U T | C H R I S T M A S | T R E E S | F O R | M E | I N | V I R G I N I A | A N D | H E | H A D | N O T | F O R G O T T E N | H O W | M U C H | I | L I K E D | T H E M | +W H E N | H E | M O U N T E D | H I S | H O R S E | A T | T H E | D O O R | I | S A W | T H A T | H E | H A D | A | H A T C H E T | S L U N G | T O | H I S | B E L T | A N D | H E | G A V E | G R A N D M O T H E R | A | M E A N I N G | L O O K | W H I C H | T O L D | M E | H E | W A S | P L A N N I N G | A | S U R P R I S E | F O R | M E | +F R O M | U N D E R | T H E | L I N I N G | H E | N O W | P R O D U C E D | A | C O L L E C T I O N | O F | B R I L L I A N T L Y | C O L O R E D | P A P E R | F I G U R E S | S E V E R A L | I N C H E S | H I G H | A N D | S T I F F | E N O U G H | T O | S T A N D | A L O N E | +B E C A U S E | H E | T A L K E D | S O | L I T T L E | H I S | W O R D S | H A D | A | P E C U L I A R | F O R C E | T H E Y | W E R E | N O T | W O R N | D U L L | F R O M | C O N S T A N T | U S E | +H I S | F A C E | H A D | A | L O O K | O F | W E A R I N E S S | A N D | P L E A S U R E | L I K E | T H A T | O F | S I C K | P E O P L E | W H E N | T H E Y | F E E L | R E L I E F | F R O M | P A I N | +H E | M A D E | T H E | S I G N | O F | T H E | C R O S S | O V E R | M E | P U T | O N | H I S | C A P | A N D | W E N T | O F F | I N | T H E | D A R K | +H E | G A V E | T H A N K S | F O R | O U R | F O O D | A N D | C O M F O R T | A N D | P R A Y E D | F O R | T H E | P O O R | A N D | D E S T I T U T E | I N | G R E A T | C I T I E S | W H E R E | T H E | S T R U G G L E | F O R | L I F E | W A S | H A R D E R | T H A N | I T | W A S | H E R E | W I T H | U S | +G R A N D F A T H E R | C A M E | D O W N | W E A R I N G | A | W H I T E | S H I R T | A N D | H I S | S U N D A Y | C O A T | +M O R N I N G | P R A Y E R S | W E R E | L O N G E R | T H A N | U S U A L | +H E | S A T | S T I L L | A N D | P A S S I V E | H I S | H E A D | R E S T I N G | A G A I N S T | T H E | B A C K | O F | T H E | W O O D E N | R O C K I N G | C H A I R | H I S | H A N D S | R E L A X E D | U P O N | T H E | A R M S | +A T | A B O U T | F O U R | O ' C L O C K | A | V I S I T O R | A P P E A R E D | M I S T E R | S H I M E R D A | W E A R I N G | H I S | R A B B I T | S K I N | C A P | A N D | C O L L A R | A N D | N E W | M I T T E N S | H I S | W I F E | H A D | K N I T T E D | +A L L | A F T E R N O O N | H E | S A T | I N | T H E | D I N I N G | R O O M | +I | W I S H | W E | H A D | N O T | L E F T | S O | S O O N | +T H E | S U G G E S T I O N | H E | H A D | L A U G H E D | A T | W A S | N O T | S O | E N T I R E L Y | F O O L I S H | A S | H E | H A D | B E E N | P L E A S E D | T O | C O N S I D E R | I T | +T H E | B O Y S | L O O K | W I D E | A W A K E | E N O U G H | I F | T H E | F A T H E R | D O E S | N O T | +I | K N O W | I T | S O U N D S | F O O L I S H | B U T | T H E | A L T E R N A T I V E | I S | S O | I M P R O B A B L E | +B E E N | O V E R | T H E | G R O U N D | S T U D I E D | T H E | A F F A I R | C A R E F U L L Y | +A T | L E A S T | T H A T | I S | W H A T | W E | H O P E | +H E | A P P E A R E D | T O | K N O W | F O R | H E | T O L D | M E | A T | O N C E | T H A T | H E | W A S | D E T E C T I V E | G R Y C E | A | M A N | W H O | H A D | G R O W N | O L D | I N | S O L V I N G | J U S T | S U C H | B A F F L I N G | P R O B L E M S | A S | T H E S E | +T H I S | S W E E T W A T E R | A S | T H E Y | C A L L E D | H I M | W A S | I | H A V E | S I N C E | U N D E R S T O O D | O N E | O F | H I S | P R O T E G E S | A N D | M O R E | O R | L E S S | O F | A | F A V O U R I T E | +T H E R E | W A S | N O | P O N I A R D | I N | T H E | W O U N D | +I | E M P H A S I S E D | C O M P L A C E N T L Y | +I T | H A S | N O T | B E E N | R U N N I N G | S I N C E | L A S T | N I G H T | O R | I T | W O U L D | B E | F U L L | O F | C U R I O U S | P E O P L E | A L L | T H E | T I M E | H U S T L I N G | T O | G E T | A | G L I M P S E | O F | T H I S | P L A C E | +G E O R G E | +B U T | V I G O U R | R E T U R N E D | T O | H I M | B E F O R E | H E | H A D | W E L L | R E A C H E D | T H E | D O O R | A N D | H E | S H O W E D | S O M E | O F | H I S | O L D | S P I R I T | A S | H E | T H A N K E D | M I S S | C L A R K E | A N D | T U R N E D | T O | T A K E | T H E | E L E V A T O R | +T H I S | I S | V E R Y | G O O D | O F | Y O U | H E | B E G A N | G L A N C I N G | D O W N | A T | T H E | A G E D | D E T E C T I V E ' S | B U N D L E D | U P | L E G S | A N D | G E N T L Y | P U S H I N G | A | C H A I R | T O W A R D S | H I M | +T H E | N E X T | M I N U T E | S H E | W A S | I N | T H I S | L A D Y ' S | A R M S | +T H E | O L D | M A N ' S | E Y E S | S H O T | F I R E | A N D | U N C O N S C I O U S L Y | O N E | F O O T | S L I P P E D | T O | T H E | F L O O R | +I ' L L | W A I T | H E R E | T I L L | Y O U ' R E | R E A D Y | E X P L A I N | Y O U R S E L F | T O | T H E | L A D Y | T E L L | H E R | I ' M | A N | O L D | A N D | R H E U M A T I C | I N V A L I D | W H O | H A S | B E E N | U S E D | T O | A S K I N G | H I S | O W N | Q U E S T I O N S | +V E R Y | G O O D | M A N A G E | I T | A S | Y O U | W I L L | +H A V E | Y O U | E V E R | T H O U G H T | T H A T | S H E | M I G H T | H A V E | B E E N | A | S U I C I D E | +I | K N O W | S H E | S A I D | W H A T | Y O U | A R E | G O I N G | T O | A S K | M E | N O W | +Y E S | M A N Y | T I M E S | +G E O R G E | N O D D E D | +I N | O L D E N | D A Y S | T H E Y | W O U L D | H A V E | S A I D | S T R U C K | B Y | A | B O L T | F R O M | H E A V E N | +I | S U P P O S E | S H E | H A S | B E E N | C A R E F U L L Y | Q U E S T I O N E D | V E R Y | I | S H O U L D | S A Y | +I | T O O K | Q U I T E | A | F A N C Y | T O | H I M | W H Y | +O N E | O R | T W O | O F | T H E | M U S I C I A N S | F R O M | T H E | E N D | O F | T H E | H A L L | +N O T | A L T O G E T H E R | B Y | M E | +N O T | T I L L | T H E | D O C T O R | C A M E | H E R | D O C T O R | W H O | W A S | H A P P I L Y | I N | H I S | O F F I C E | I N | T H I S | V E R Y | B U I L D I N G | +S W E E T W A T E R | S O M E O N E | D R E W | T H A T | W E A P O N | O U T | +D O | T H E Y | S T I L L | I N S I S T | T H A T | M I S S | C H A L L O N E R | W A S | T H E | O N L Y | P E R S O N | I N | T H E | R O O M | W I T H | T H E M | A T | T H I S | T I M E | +I | A S K E D | A S | S O O N | A S | G E O R G E | H A D | R E T U R N E D | T O | M Y | S I D E | +B U T | C L E W S | T H E R E | A R E | A B S O L U T E L Y | N O N E | +W H E N | W E | T O O K | O U R | S E A T S | A T | T H E | B R E A K F A S T | T A B L E | I T | W A S | W I T H | T H E | F E E L I N G | O F | B E I N G | N O | L O N G E R | L O O K E D | U P O N | A S | C O N N E C T E D | I N | A N Y | W A Y | W I T H | T H I S | C A S E | +A N D | S H E | S P E A K S | O F | N O | W E A P O N | +W H O | C A M E | N E X T | O N | T H E | S C E N E | S O M E | P E O P L E | F R O M | T H E | L O B B Y | +I | I N Q U I R E D | O F | G E O R G E | W I T H | M Y | E Y E S | S T I L L | O N | T H I S | F U R T I V E | W A T C H E R | +I | S H O U L D | L I K E | T O | S E E | T H E | D E S K | Y O U | S P E A K | O F | A N D | T H E | S P O T | W H E R E | S H E | F E L L | +M I S S | C L A R K E | S T A R T E D | A N D | H E R | S W E E T | F A C E | S H O W E D | A | M O M E N T ' S | P E R P L E X I T Y | D I D | I | S H E | Q U E R I E D | M U S I N G L Y | +W E L L | W E L L | T H A T ' S | H O N E S T | A T | A L L | E V E N T S | +H E | W A S | T H E | P L A I N | F A C E D | D E T E C T I V E | W H O | H A D | S P O K E N | T O | G E O R G E | +I | A M | L O O K I N G | A T | H I M | N O W | +T H E | B O Y S | B E L O N G | T O | T H E | G E N T L E M A N | W H O | I S | A | W I D O W E R | +T H E | T R A I L | H E R E | M U S T | B E | A | V E R Y | B L I N D | O N E | F O R | T H E M | T O | C A L L | H I M | I N | +T H E R E | W A S | N O | D O U B T I N G | T H E M | I N | T H I S | I N S T A N C E | +I T ' S | T H E | M O S T | I N E X P L I C A B L E | T H E R E | +A | Y O U N G | F E L L O W | W H O | H A D | B E E N | H O V E R I N G | I N | T H E | B A C K G R O U N D | A T | O N C E | S T E P P E D | F O R W A R D | +W H E T H E R | H E | G O T | A N Y T H I N G | E L S E | I T | W O U L D | B E | I M P O S S I B L E | T O | S A Y | F R O M | H I S | M A N N E R | A S | H E | F I N A L L Y | S A N K | I N T O | A | C H A I R | B Y | O N E | O F | T H E | O P E N I N G S | A N D | L O O K E D | D O W N | O N | T H E | L O B B Y | B E L O W | +O L D | D A Y S | D O N ' T | R E T U R N | F O R | T H E | A S K I N G | +N O | D O U B T | +N O | W E A P O N | P R O T R U D E D | F R O M | T H E | W O U N D | N O R | W A S | A N Y | F O U N D | O N | O R | N E A R | H E R | I N | T H E | M E Z Z A N I N E | W H A T | F O L L O W S | +T H E | B O Y S | L O O K | W I D E | A W A K E | E N O U G H | B U T | W H O | C A N | T E L L | I | W O U L D | S O O N E R | B E L I E V E | T H A T | +B U T | T H E Y ' L L | P U T | A | M A N | O N | F O R | Y O U | +N O | A | V E R Y | N A T U R A L | O N E | I | S H O U L D | S A Y | +Y E S | +M A R K | S O W E R B Y | A N D | C L A U S | H E N N E R B E R G | +I T | W A S | O N E | W H I C H | G A V E | M E | A | S M A L L | T R I U M P H | O V E R | G E O R G E | +T H E | T I M E | I S | N A R R O W E D | D O W N | T O | O N E | A N D | I N | T H A T | O N E | M I S S | C L A R K E | W A S | T H E | O N L Y | P E R S O N | T O | T O U C H | H E R | +W H E R E V E R | S H E | P L E A S E S | O N L Y | I | C A N ' T | W A L K | F A R | +A | M A N | W A S | L O O K I N G | I N | F R O M | T H E | C O R R I D O R | B E H I N D | A T | T H E | F O U R | P E R S O N S | W E | W E R E | J U S T | D I S C U S S I N G | +W H A T | D O | Y O U | M A K E | O F | I T | G R Y C E | +W H A T | M A D E | T H E | D I F F E R E N C E | +J U S T | A N | E V E R Y D A Y | D E T E C T I V E | B U T | A M B I T I O U S | I | S U P P O S E | A N D | Q U I T E | A L I V E | T O | T H E | I M P O R T A N C E | O F | B E I N G | T H O R O U G H | +N O | W O R D | N O | C R Y | J U S T | A | C O L L A P S E | A N D | S U D D E N | F A L L | +S W E E T W A T E R | H E L P | M E | O U T | O F | T H I S | +Y E S | M I S S | C L A R K E | T H E | M I D D L E | A G E D | L A D Y | W I T H | T H E | P A R R I S H E S | +I T ' S | A | C A S E | I N | A | T H O U S A N D | G R Y C E | +Y E S | M I S T E R | S L A T E R | T H E | A S S I S T A N T | M A N A G E R | W H O | W A S | I N | T H E | L O B B Y | A T | T H E | T I M E | S A Y S | T H A T | T E N | M I N U T E S | A T | L E A S T | M U S T | H A V E | E L A P S E D | +H O N E S T | G E R M A N S | M E N | W H O | H A V E | P L A Y E D | H E R E | F O R | Y E A R S | +H E | W A N T S | M E | T O | S T A N D | R E A D Y | T O | O B E Y | A N Y | S U M M O N S | T H E | P O L I C E | M A Y | S E N D | M E | +H O W E V E R | A | L I T T L E | L A T E R | W E | H A D | A | C O M F O R T A B L E | C H A T | +T H A T | I S | W E | H A V E | N O T | B E E N | A B L E | T O | F I N D | A N Y | P E R H A P S | Y O U | C A N | +A N Y B O D Y | B E F O R E | T H E | F A T H E R | C A M E | I N | +T H E I R | G R E E T I N G | W A S | C O R D I A L | A N D | T H E | L I N E S | O N | T H E | L A T T E R ' S | F A C E | R E L A X E D | A | L I T T L E | A S | H E | M E T | T H E | S T I L L | B R I G H T | E Y E | O F | T H E | M A N | U P O N | W H O S E | I N S T I N C T | A N D | J U D G M E N T | S O | M U C H | R E L I A N C E | H A D | A L W A Y S | B E E N | P L A C E D | +I N S T A N T L Y | T H E Y | A B S O R B E D | A L L | M Y | A T T E N T I O N | T H O U G H | I | D A R E D | N O T | G I V E | T H E M | A | D I R E C T | L O O K | A N D | C O N T I N U E D | T O | O B S E R V E | T H E M | O N L Y | I N | T H E | G L A S S | +F O R | S O M E | L I T T L E | T I M E | T H A T | I S | I T | S E E M E D | L O N G | T H O U G H | I | B E L I E V E | I T | W A S | N O T | M O R E | T H A N | A | M I N U T E | B E F O R E | T W O | M E N | C A M E | R U N N I N G | F R O M | T H E | M U S I C I A N S | G A L L E R Y | +A N D | T H E | G L A N C E | S H E | C A S T | H I M | W H I L E | N O T | M E E T I N G | H I S | E Y E | S H O W E D | T H A T | S H E | U N D E R S T O O D | T H E | I M P O R T A N C E | O F | T H E | A D M I S S I O N | +I T | D I D | N O T | F A L L | U P O N | T H E | F L O O R | A R O U N D | H E R | T H E R E F O R E | I T | F L E W | T H R O U G H | O N E | O F | T H O S E | O P E N I N G S | I N T O | T H E | L O B B Y | A N D | T H E R E | I T | E I T H E R | W I L L | B E | O R | H A S | B E E N | F O U N D | +S H E | H A D | N O | C O M P A N I O N | N E A R | H E R | +W H A T | D O E S | H E | W A N T | +T H E | L A D Y | I S | N O T | T H E | M O T H E R | O F | T H E | B O Y S | B U T | T H E I R | A U N T | +H E | W A S | L A T E | O F | C O U R S E | B U T | W H E N | H E | D I D | A P P E A R | I | A L M O S T | F O R G O T | O U R | U S U A L | G R E E T I N G | I N | M Y | H U R R Y | T O | A S K | H I M | I F | H E | H A D | S E E N | T H E | E V E N I N G | P A P E R S | +I | W I L L | T R O U B L E | Y O U | N O | F U R T H E R | +A S | H E R | Q U I E T | F I G U R E | A P P E A R E D | I N | T H E | D O O R W A Y | S W E E T W A T E R | S T O L E | A | G L A N C E | A T | M I S T E R | G R Y C E | +N A T U R A L L Y | T H E Y | R E A C H E D | H E R | F I R S T | +B U T | I ' M | I N | N O | P O S I T I O N | T O | M A K E | P R O M I S E S | +H E | G A V E | U P | W O R K | S O M E | T I M E | A G O | I | H A V E | B E E N | T O L D | M Y | H U S B A N D | W E N T | O N | B U T | E V I D E N T L Y | A | G R E A T | C A S E | S T I L L | H A S | I T S | A L L U R E M E N T | F O R | H I M | +Y E S | A N D | A | V E R Y | R E S P E C T A B L E | O N E | +S H E | S T R U C K | T H E | B L O W | H E R S E L F | A N D | T H E | S T R E N G T H | O F | P U R P O S E | W H I C H | L E D | H E R | T O | D O | T H I S | G A V E | H E R | T H E | A D D I T I O N A L | F O R C E | T O | P U L L | T H E | W E A P O N | O U T | A N D | F L I N G | I T | F R O M | H E R | +V E R Y | W E L L | T H E N | Y O U ' R E | I N | A | P O S I T I O N | T O | P I O N E E R | M E | +Y E S | H E ' S | M E R C U R I A L | I N | A L L | H I S | M O V E M E N T S | +I T | W I L L | B E | W E L L | T O | S T A T E | I N | T H E | B E G I N N I N G | O F | T H I S | R E C I P E | T H A T | F R E N C H | F O R C E M E A T | O R | Q U E N E L L E S | C O N S I S T | O F | T H E | B L E N D I N G | O F | T H R E E | S E P A R A T E | P R O C E S S E S | N A M E L Y | P A N A D A | U D D E R | A N D | W H A T E V E R | M E A T | Y O U | I N T E N D | U S I N G | P A N A D A | +M O D E | M I X | A L L | T H E | I N G R E D I E N T S | W E L L | T O G E T H E R | C A R E F U L L Y | M I N C I N G | T H E M | V E R Y | F I N E L Y | B E A T | U P | T H E | E G G | M O I S T E N | W I T H | I T | A N D | W O R K | T H E | W H O L E | V E R Y | S M O O T H L Y | T O G E T H E R | +S I M M E R | F O R | A | M I N U T E | O R | T W O | A N D | S E R V E | I N | A | T U R E E N | +L E M O N | J U I C E | M A Y | B E | A D D E D | A T | P L E A S U R E | +T H E | G I N G E R | P L A N T | K N O W N | T O | N A T U R A L I S T S | A S | Z I N G I B E R | O F F I C I N A L E | I S | A | N A T I V E | O F | T H E | E A S T | A N D | W E S T | I N D I E S | +I L L U S T R A T I O N | S A G E | +M O D E | C U T | U P | T H E | O N I O N | A N D | C A R R O T | I N T O | S M A L L | R I N G S | A N D | P U T | T H E M | I N T O | A | S T E W P A N | W I T H | T H E | H E R B S | M U S H R O O M S | B A Y | L E A F | C L O V E S | A N D | M A C E | A D D | T H E | B U T T E R | A N D | S I M M E R | T H E | W H O L E | V E R Y | G E N T L Y | O V E R | A | S L O W | F I R E | U N T I L | T H E | O N I O N | I S | Q U I T E | T E N D E R | +T H E N | A D D | T H E | Y O L K S | O F | T H E | E G G S | W E L L | B E A T E N | S T I R | T H E M | T O | T H E | S A U C E | B U T | D O | N O T | A L L O W | I T | T O | B O I L | A N D | S E R V E | V E R Y | H O T | +I F | T H E | Q U E N E L L E S | A R E | N O T | F I R M | E N O U G H | A D D | T H E | Y O L K | O F | A N O T H E R | E G G | B U T | O M I T | T H E | W H I T E | W H I C H | O N L Y | M A K E S | T H E M | H O L L O W | A N D | P U F F Y | I N S I D E | +I L L U S T R A T I O N | T H E | L E M O N | +M O D E | P A R E | A N D | S L I C E | T H E | C U C U M B E R S | A S | F O R | T H E | T A B L E | S P R I N K L E | W E L L | W I T H | S A L T | A N D | L E T | T H E M | R E M A I N | F O R | T W E N T Y | F O U R | H O U R S | S T R A I N | O F F | T H E | L I Q U O R | P A C K | I N | J A R S | A | T H I C K | L A Y E R | O F | C U C U M B E R S | A N D | S A L T | A L T E R N A T E L Y | T I E | D O W N | C L O S E L Y | A N D | W H E N | W A N T E D | F O R | U S E | T A K E | O U T | T H E | Q U A N T I T Y | R E Q U I R E D | +I L L U S T R A T I O N | L O N G | P E P P E R | +I F | I T | S H O U L D | B E | I N | A N | U N S O U N D | S T A T E | I T | M U S T | B E | O N | N O | A C C O U N T | M A D E | U S E | O F | +L O N G | P E P P E R | T H I S | I S | T H E | P R O D U C E | O F | A | D I F F E R E N T | P L A N T | F R O M | T H A T | W H I C H | P R O D U C E S | T H E | B L A C K | I T | C O N S I S T I N G | O F | T H E | H A L F | R I P E | F L O W E R | H E A D S | O F | W H A T | N A T U R A L I S T S | C A L L | P I P E R | L O N G U M | A N D | C H A B A | +I L L U S T R A T I O N | G I N G E R | +W H E N | I T | I S | S U F F I C I E N T L Y | T H I C K | T A K E | I T | O F F | A S | I T | S H O U L D | N O T | B O I L | +T H E | F A T | T H E Y | A R E | F R I E D | I N | S H O U L D | B E | C L E A R | A N D | T H E | C R U M B S | S H O U L D | N O T | H A V E | T H E | S L I G H T E S T | A P P E A R A N C E | O R | T A S T E | O F | H A V I N G | B E E N | I N | T H E | L E A S T | D E G R E E | B U R N T | +O T H E R | S W E E T | H E R B S | A R E | C U L T I V A T E D | F O R | P U R P O S E S | O F | M E D I C I N E | A N D | P E R F U M E R Y | T H E Y | A R E | M O S T | G R A T E F U L | B O T H | T O | T H E | O R G A N S | O F | T A S T E | A N D | S M E L L I N G | A N D | T O | T H E | A R O M A | D E R I V E D | F R O M | T H E M | I S | D U E | I N | A | G R E A T | M E A S U R E | T H E | S W E E T | A N D | E X H I L A R A T I N G | F R A G R A N C E | O F | O U R | F L O W E R Y | M E A D S | +B O I L | F O R | F I V E | M I N U T E S | M I N C E | I T | V E R Y | S M A L L | A N D | M I X | I T | W I T H | T H E | O T H E R | I N G R E D I E N T S | +N O T E | T H E | W I N E | I N | T H I S | S A U C E | M A Y | B E | O M I T T E D | A N D | A N | O N I O N | S L I C E D | A N D | F R I E D | O F | A | N I C E | B R O W N | S U B S T I T U T E D | F O R | I T | +I L L U S T R A T I O N | T H E | C U C U M B E R | +S O M E | S P R I N G S | A R E | S O | H I G H L Y | I M P R E G N A T E D | W I T H | S A L T | A S | T O | H A V E | R E C E I V E D | T H E | N A M E | O F | B R I N E | S P R I N G S | A N D | A R E | S U P P O S E D | T O | H A V E | B E C O M E | S O | B Y | P A S S I N G | T H R O U G H | T H E | S A L T | R O C K S | B E L O W | G R O U N D | A N D | T H U S | D I S S O L V I N G | A | P O R T I O N | O F | T H I S | M I N E R A L | S U B S T A N C E | +C O N T I N U E | I N | T H I S | M A N N E R | T I L L | T H E | B O R D E R | I S | C O M P L E T E D | A R R A N G I N G | T H E | S I P P E T S | A | P A L E | A N D | A | D A R K | O N E | A L T E R N A T E L Y | +S E A S O N A B L E | T H I S | R E C I P E | S H O U L D | B E | U S E D | I N | J U N E | J U L Y | O R | A U G U S T | +I L L U S T R A T I O N | B A S I L | +M O D E | C H O O S E | T H E | G R E E N E S T | C U C U M B E R S | A N D | T H O S E | T H A T | A R E | M O S T | F R E E | F R O M | S E E D S | P U T | T H E M | I N | S T R O N G | S A L T | A N D | W A T E R | W I T H | A | C A B B A G E | L E A F | T O | K E E P | T H E M | D O W N | T I E | A | P A P E R | O V E R | T H E M | A N D | P U T | T H E M | I N | A | W A R M | P L A C E | T I L L | T H E Y | A R E | Y E L L O W | T H E N | W A S H | T H E M | A N D | S E T | T H E M | O V E R | T H E | F I R E | I N | F R E S H | W A T E R | W I T H | A | V E R Y | L I T T L E | S A L T | A N D | A N O T H E R | C A B B A G E | L E A F | O V E R | T H E M | C O V E R | V E R Y | C L O S E L Y | B U T | T A K E | C A R E | T H E Y | D O | N O T | B O I L | +O R I G I N A L L Y | T H E | M O S T | V A L U A B L E | O F | T H E S E | W E R E | F O U N D | I N | T H E | S P I C E | I S L A N D S | O R | M O L U C C A S | O F | T H E | I N D I A N | O C E A N | A N D | W E R E | H I G H L Y | P R I Z E D | B Y | T H E | N A T I O N S | O F | A N T I Q U I T Y | +S U F F I C I E N T | T O | S E R V E | W I T H | F I V E | O R | S I X | M A C K E R E L | +P U T | T H E | S U G A R | W I T H | O N E | Q U A R T E R | P I N T | O F | W A T E R | I N | A | S A U C E P A N | O V E R | T H E | F I R E | R E M O V E | T H E | S C U M | A S | I T | R I S E S | A N D | A D D | T H E | L E M O N | P E E L | A N D | G I N G E R | W I T H | T H E | O U T S I D E | S C R A P E D | O F F | W H E N | T H E | S Y R U P | I S | T O L E R A B L Y | T H I C K | T A K E | I T | O F F | T H E | F I R E | A N D | W H E N | C O L D | W I P E | T H E | C U C U M B E R S | D R Y | A N D | P U T | T H E M | I N | +B E A T | T H E | Y O L K S | O F | T H E | O T H E R | T W O | E G G S | A D D | T H E M | W I T H | A | L I T T L E | F L O U R | A N D | S A L T | T O | T H O S E | P O U N D E D | M I X | A L L | W E L L | T O G E T H E R | A N D | R O L L | I N T O | B A L L S | +M O D E | P U T | T H E | M I L K | I N | A | V E R Y | C L E A N | S A U C E P A N | A N D | L E T | I T | B O I L | +W H E N | Q U I T E | C R I S P | D I P | O N E | S I D E | O F | T H E | S I P P E T | I N T O | T H E | B E A T E N | W H I T E | O F | A N | E G G | M I X E D | W I T H | A | L I T T L E | F L O U R | A N D | P L A C E | I T | O N | T H E | E D G E | O F | T H E | D I S H | +I T | I S | A | N A T I V E | O F | P O R T U G A L | A N D | W H E N | I T S | L E A V E S | A R E | U S E D | A S | A | S E A S O N I N G | H E R B | T H E Y | H A V E | A N | A G R E E A B L E | A R O M A T I C | F L A V O U R | +T H E | L E M O N | T H I S | F R U I T | I S | A | N A T I V E | O F | A S I A | A N D | I S | M E N T I O N E D | B Y | V I R G I L | A S | A N | A N T I D O T E | T O | P O I S O N | +S U F F I C I E N T | F O R | A | M O D E R A T E | S I Z E D | H A D D O C K | O R | P I K E | +S O L I D | R O C K S | O F | S A L T | A R E | A L S O | F O U N D | I N | V A R I O U S | P A R T S | O F | T H E | W O R L D | A N D | T H E | C O U N T Y | O F | C H E S T E R | C O N T A I N S | M A N Y | O F | T H E S E | M I N E S | A N D | I T | I S | F R O M | T H E R E | T H A T | M U C H | O F | O U R | S A L T | C O M E S | +F O R C E M E A T | F O R | C O L D | S A V O U R Y | P I E S | +P U T | T H E | U D D E R | I N T O | A | S T E W P A N | W I T H | S U F F I C I E N T | W A T E R | T O | C O V E R | I T | L E T | I T | S T E W | G E N T L Y | T I L L | Q U I T E | D O N E | W H E N | T A K E | I T | O U T | T O | C O O L | +F R I E D | B R E A D | F O R | B O R D E R S | +M O D E | P U T | T H E | W H O L E | O F | T H E | I N G R E D I E N T S | I N T O | A | B O T T L E | A N D | L E T | I T | R E M A I N | F O R | A | F O R T N I G H T | I N | A | W A R M | P L A C E | O C C A S I O N A L L Y | S H A K I N G | U P | T H E | C O N T E N T S | +V A R I O U S | D I S H E S | A R E | F R E Q U E N T L Y | O R N A M E N T E D | A N D | G A R N I S H E D | W I T H | I T S | G R A C E F U L | L E A V E S | A N D | T H E S E | A R E | S O M E T I M E S | B O I L E D | I N | S O U P S | A L T H O U G H | I T | I S | M O R E | U S U A L L Y | C O N F I N E D | I N | E N G L I S H | C O O K E R Y | T O | T H E | M A C K E R E L | S A U C E | A S | H E R E | G I V E N | +T H E Y | O U G H T | T O | B E | T A K E N | U P | I N | T H E | A U T U M N | A N D | W H E N | D R I E D | I N | T H E | H O U S E | W I L L | K E E P | T I L L | S P R I N G | +T H I S | J U I C E | W H I C H | I S | C A L L E D | C I T R I C | A C I D | M A Y | B E | P R E S E R V E D | I N | B O T T L E S | F O R | A | C O N S I D E R A B L E | T I M E | B Y | C O V E R I N G | I T | W I T H | A | T H I N | S T R A T U M | O F | O I L | +F R I E D | B R E A D | C R U M B S | +N O W | B E A T | A N D | S T R A I N | T H E | E G G S | W O R K | T H E S E | U P | W I T H | T H E | O T H E R | I N G R E D I E N T S | A N D | T H E | F O R C E M E A T | W I L L | B E | R E A D Y | F O R | U S E | +T O | P I C K L E | E G G S | +P L A C E | T H E | J U G | I N | A | S A U C E P A N | O F | B O I L I N G | W A T E R | K E E P | S T I R R I N G | W E L L | U N T I L | I T | T H I C K E N S | B U T | D O | N O T | A L L O W | I T | T O | B O I L | O R | I T | W I L L | C U R D L E | +P O U N D | W E L L | A N D | B I N D | W I T H | O N E | O R | T W O | E G G S | W H I C H | H A V E | B E E N | P R E V I O U S L Y | B E A T E N | A N D | S T R A I N E D | +I T | I S | H A R D I E R | T H A N | T H E | O R A N G E | A N D | A S | O N E | O F | T H E | C I T R O N | T R I B E | W A S | B R O U G H T | I N T O | E U R O P E | B Y | T H E | A R A B I A N S | +T H E | L E M O N | W A S | F I R S T | C U L T I V A T E D | I N | E N G L A N D | I N | T H E | B E G I N N I N G | O F | T H E | S E V E N T E E N T H | C E N T U R Y | A N D | I S | N O W | O F T E N | T O | B E | F O U N D | I N | O U R | G R E E N | H O U S E S | +F R E N C H | F O R C E M E A T | +A | S T O R E | O F | P I C K L E D | E G G S | W I L L | B E | F O U N D | V E R Y | U S E F U L | A N D | O R N A M E N T A L | I N | S E R V I N G | W I T H | M A N Y | F I R S T | A N D | S E C O N D | C O U R S E | D I S H E S | +A D D | T H E | W I N E | A N D | I F | N E C E S S A R Y | A | S E A S O N I N G | O F | C A Y E N N E | W H E N | I T | W I L L | B E | R E A D Y | T O | S E R V E | +P L A C E | I T | O V E R | T H E | F I R E | K E E P | C O N S T A N T L Y | S T I R R I N G | T O | P R E V E N T | I T S | B U R N I N G | A N D | W H E N | Q U I T E | D R Y | P U T | I N | A | S M A L L | P I E C E | O F | B U T T E R | +A N Y | O N E | W I T H | T H E | S L I G H T E S T | P R E T E N S I O N S | T O | R E F I N E D | C O O K E R Y | M U S T | I N | T H I S | P A R T I C U L A R | I M P L I C I T L Y | F O L L O W | T H E | E X A M P L E | O F | O U R | F R I E N D S | A C R O S S | T H E | C H A N N E L | +I L L U S T R A T I O N | P E S T L E | A N D | M O R T A R | +W H E N | T H E | T H R E E | I N G R E D I E N T S | A R E | P R O P E R L Y | P R E P A R E D | P O U N D | T H E M | A L T O G E T H E R | I N | A | M O R T A R | F O R | S O M E | T I M E | F O R | T H E | M O R E | Q U E N E L L E S | A R E | P O U N D E D | T H E | M O R E | D E L I C A T E | T H E Y | A R E | +I N | J A M A I C A | I T | F L O W E R S | A B O U T | A U G U S T | O R | S E P T E M B E R | F A D I N G | A B O U T | T H E | E N D | O F | T H E | Y E A R | +T H E | L O N G | P E P P E R | I S | L E S S | A R O M A T I C | T H A N | T H E | B L A C K | B U T | I T S | O I L | I S | M O R E | P U N G E N T | +S U F F I C I E N T | H A L F | T H I S | Q U A N T I T Y | F O R | T W O | S L I C E S | O F | S A L M O N | +S E A S O N A B L E | T H I S | S H O U L D | B E | M A D E | A B O U T | E A S T E R | A S | A T | T H I S | T I M E | E G G S | A R E | P L E N T I F U L | A N D | C H E A P | +B O I L | T H E M | B E F O R E | T H E Y | A R E | P U T | I N T O | T H E | S O U P | O R | O T H E R | D I S H | T H E Y | M A Y | B E | I N T E N D E D | F O R | +B E A T | T H E | E G G S | S T I R | T O | T H E M | T H E | M I L K | A N D | P O U N D E D | S U G A R | A N D | P U T | T H E | M I X T U R E | I N T O | A | J U G | +I L L U S T R A T I O N | M A R J O R A M | +S O M E T H I N G | O F | T H E I R | T R O U B L I N G | S W E E T N E S S | C A M E | B A C K | T O | A L E X A N D E R | T O O | +D O N ' T | C R Y | D O N ' T | C R Y | H E | W H I S P E R E D | +H I L D A ' S | F A C E | Q U I V E R E D | B U T | S H E | W H I S P E R E D | Y E S | I | T H I N K | I T | M U S T | H A V E | B E E N | +S H E | L O O K E D | A T | H I S | H E A V Y | S H O U L D E R S | A N D | B I G | D E T E R M I N E D | H E A D | T H R U S T | F O R W A R D | L I K E | A | C A T A P U L T | I N | L E A S H | +S H E | B I T | H E R | L I P | A N D | L O O K E D | D O W N | A T | H E R | H A N D S | W H I C H | W E R E | C L A S P E D | T I G H T L Y | I N | F R O N T | O F | H E R | +Y O U | A S K | M E | T O | S T A Y | A W A Y | F R O M | Y O U | B E C A U S E | Y O U | W A N T | M E | +H I L D A | W A T C H E D | H I M | F R O M | H E R | C O R N E R | T R E M B L I N G | A N D | S C A R C E L Y | B R E A T H I N G | D A R K | S H A D O W S | G R O W I N G | A B O U T | H E R | E Y E S | +S H E | L I S T E N E D | I N T E N T L Y | B U T | S H E | H E A R D | N O T H I N G | B U T | T H E | C R E A K I N G | O F | H I S | C H A I R | +I | U N D E R S T A N D | B A R T L E Y | I | W A S | W R O N G | +A T | T H A T | W O R D | D E C E P T I O N | S P O K E N | W I T H | S U C H | S E L F | C O N T E M P T | T H E | C O L O R | F L A S H E D | B A C K | I N T O | H I L D A ' S | F A C E | A S | S U D D E N L Y | A S | I F | S H E | H A D | B E E N | S T R U C K | B Y | A | W H I P L A S H | +A L W A Y S | B U T | I T ' S | W O R S E | N O W | +S H E | B L U S H E D | A N D | S M I L E D | A N D | F U M B L E D | H I S | C A R D | I N | H E R | C O N F U S I O N | B E F O R E | S H E | R A N | U P S T A I R S | +S H E | M E R E L Y | B R U S H E D | H I S | C H E E K | W I T H | H E R | L I P S | A N D | P U T | A | H A N D | L I G H T L Y | A N D | J O Y O U S L Y | O N | E I T H E R | S H O U L D E R | +T H E | L A S T | T W O | D A Y S | O F | T H E | V O Y A G E | B A R T L E Y | F O U N D | A L M O S T | I N T O L E R A B L E | +T H E R E | I S | T H I S | D E C E P T I O N | B E T W E E N | M E | A N D | E V E R Y T H I N G | +Y E S | H I L D A | I | K N O W | T H A T | H E | S A I D | S I M P L Y | +H I L D A | S A T | O N | T H E | A R M | O F | I T | A N D | P U T | H E R | H A N D S | L I G H T L Y | O N | H I S | S H O U L D E R S | +O H | B A R T L E Y | W H A T | A M | I | T O | D O | +I | W I L L | A S K | T H E | L E A S T | I M A G I N A B L E | B U T | I | M U S T | H A V E | S O M E T H I N G | +W H E N | D I D | Y O U | C O M E | B A R T L E Y | A N D | H O W | D I D | I T | H A P P E N | Y O U | H A V E N ' T | S P O K E N | A | W O R D | +B A R T L E Y | L E A N E D | H I S | H E A D | I N | H I S | H A N D S | A N D | S P O K E | T H R O U G H | H I S | T E E T H | +Y O U | W A N T | M E | T O | S A Y | I T | S H E | W H I S P E R E D | +A N D | T H E N | Y O U | C A M E | B A C K | N O T | C A R I N G | V E R Y | M U C H | B U T | I T | M A D E | N O | D I F F E R E N C E | +A | C O A L | F I R E | W A S | C R A C K L I N G | I N | T H E | G R A T E | A N D | T H E | L A M P S | W E R E | L I T | F O R | I T | W A S | A L R E A D Y | B E G I N N I N G | T O | G R O W | D A R K | O U T S I D E | +A F T E R | T H E | V E R Y | F I R S T | +S H E | C A L L E D | H I S | N A M E | O N | T H E | T H R E S H O L D | B U T | I N | H E R | S W I F T | F L I G H T | A C R O S S | T H E | R O O M | S H E | F E L T | A | C H A N G E | I N | H I M | A N D | C A U G H T | H E R S E L F | U P | S O | D E F T L Y | T H A T | H E | C O U L D | N O T | T E L L | J U S T | W H E N | S H E | D I D | I T | +H E | P U L L E D | U P | A | W I N D O W | A S | I F | T H E | A I R | W E R E | H E A V Y | +I T ' S | U N B E A R A B L E | I T | T O R T U R E S | M E | E V E R Y | M I N U T E | +P R E S E N T L Y | I T | S T O L E | B A C K | T O | H I S | C O A T | S L E E V E | +I ' L L | D O | A N Y T H I N G | Y O U | W I S H | M E | T O | B A R T L E Y | S H E | S A I D | T R E M U L O U S L Y | +I | H A V E | T H O U G H T | A B O U T | I T | U N T I L | I | A M | W O R N | O U T | +T H E | R O O M | W A S | E M P T Y | W H E N | H E | E N T E R E D | +S H E | P R E S S E D | H I S | H A N D | G E N T L Y | I N | G R A T I T U D E | W E R E N ' T | Y O U | H A P P Y | T H E N | A T | A L L | +E M E R G I N G | A T | E U S T O N | A T | H A L F | P A S T | T H R E E | O ' C L O C K | I N | T H E | A F T E R N O O N | A L E X A N D E R | H A D | H I S | L U G G A G E | S E N T | T O | T H E | S A V O Y | A N D | D R O V E | A T | O N C E | T O | B E D F O R D | S Q U A R E | +I T ' S | G O T | T O | B E | A | C L E A N | B R E A K | H I L D A | +I T | I T | H A S N ' T | A L W A Y S | M A D E | Y O U | M I S E R A B L E | H A S | I T | +Y O U | S E E | L O V I N G | S O M E | O N E | A S | I | L O V E | Y O U | M A K E S | T H E | W H O L E | W O R L D | D I F F E R E N T | +C O U L D | Y O U | C O U L D | Y O U | S I T | D O W N | A N D | T A L K | A B O U T | I T | Q U I E T L Y | B A R T L E Y | A S | I F | I | W E R E | A | F R I E N D | A N D | N O T | S O M E | O N E | W H O | H A D | T O | B E | D E F I E D | +I | N E V E R | D R E A M E D | I T | W O U L D | B E | Y O U | B A R T L E Y | +I | G E T | N O T H I N G | B U T | M I S E R Y | O U T | O F | E I T H E R | +H E | D R O P P E D | B A C K | H E A V I L Y | I N T O | H I S | C H A I R | B Y | T H E | F I R E | +I | A M | N O T | A | M A N | W H O | C A N | L I V E | T W O | L I V E S | H E | W E N T | O N | F E V E R I S H L Y | E A C H | L I F E | S P O I L S | T H E | O T H E R | +S H E | S L I D | T O | T H E | F L O O R | B E S I D E | H I M | A S | I F | S H E | W E R E | T O O | T I R E D | T O | S I T | U P | A N Y | L O N G E R | +W H E N | S H E | B E G A N | T O | D A N C E | B Y | W A Y | O F | S H O W I N G | T H E | G O S S O O N S | W H A T | S H E | H A D | S E E N | I N | T H E | F A I R Y | R I N G S | A T | N I G H T | T H E | H O U S E | B R O K E | I N T O | A | P R O L O N G E D | U P R O A R | +I ' M | G L A D | S H E ' S | H E L D | H E R | O W N | S I N C E | +I N | A | M O M E N T | P E G G Y | W A S | O N | T H E | S T A G E | A G A I N | A N D | A L E X A N D E R | A P P L A U D E D | V I G O R O U S L Y | W I T H | T H E | R E S T | +A L E X A N D E R | E X C L A I M E D | M I L D L Y | +I | H A P P E N | T O | H A V E | M A C | C O N N E L L ' S | B O X | F O R | T O N I G H T | O R | T H E R E ' D | B E | N O | C H A N C E | O F | O U R | G E T T I N G | P L A C E S | +A | L I T T L E | A T T A C K | O F | N E R V E S | P O S S I B L Y | +M A C | C O N N E L L | L E T | M E | I N T R O D U C E | M I S T E R | B A R T L E Y | A L E X A N D E R | +I N | T H E | H A L F | L I G H T | H E | L O O K E D | A B O U T | A T | T H E | S T A L L S | A N D | B O X E S | A N D | S M I L E D | A | L I T T L E | C O N S C I O U S L Y | R E C A L L I N G | W I T H | A M U S E M E N T | S I R | H A R R Y ' S | J U D I C I A L | F R O W N | +H U G H ' S | W R I T T E N | A | D E L I G H T F U L | P A R T | F O R | H E R | A N D | S H E ' S | Q U I T E | I N E X P R E S S I B L E | +M Y S E L F | I | A L W A Y S | K N E W | S H E | H A D | I T | I N | H E R | +H E ' S | A N O T H E R | W H O ' S | A W F U L L Y | K E E N | A B O U T | H E R | L E T | M E | I N T R O D U C E | Y O U | +I T ' S | D E L I G H T F U L | T O | H E A R | I T | I N | A | L O N D O N | T H E A T R E | +I | S A Y | S I R | H A R R Y | T H E | L I T T L E | G I R L ' S | G O I N G | F A M O U S L Y | T O | N I G H T | I S N ' T | S H E | +H E | L E A N E D | F O R W A R D | A N D | B E A M E D | F E L I C I T A T I O N S | A S | W A R M L Y | A S | M A I N H A L L | H I M S E L F | W H E N | A T | T H E | E N D | O F | T H E | P L A Y | S H E | C A M E | A G A I N | A N D | A G A I N | B E F O R E | T H E | C U R T A I N | P A N T I N G | A | L I T T L E | A N D | F L U S H E D | H E R | E Y E S | D A N C I N G | A N D | H E R | E A G E R | N E R V O U S | L I T T L E | M O U T H | T R E M U L O U S | W I T H | E X C I T E M E N T | +O F | C O U R S E | H I L D A | I S | I R I S H | T H E | B U R G O Y N E S | H A V E | B E E N | S T A G E | P E O P L E | F O R | G E N E R A T I O N S | A N D | S H E | H A S | T H E | I R I S H | V O I C E | +W H E N | T H E Y | E N T E R E D | T H E | S T A G E | B O X | O N | T H E | L E F T | T H E | F I R S T | A C T | W A S | W E L L | U N D E R | W A Y | T H E | S C E N E | B E I N G | T H E | I N T E R I O R | O F | A | C A B I N | I N | T H E | S O U T H | O F | I R E L A N D | +H E | N O D D E D | C U R T L Y | A N D | M A D E | F O R | T H E | D O O R | D O D G I N G | A C Q U A I N T A N C E S | A S | H E | W E N T | +A F T E R | H E R | D A N C E | S H E | W I T H D R E W | F R O M | T H E | D I A L O G U E | A N D | R E T R E A T E D | T O | T H E | D I T C H | W A L L | B A C K | O F | P H I L L Y ' S | B U R R O W | W H E R E | S H E | S A T | S I N G I N G | T H E | R I S I N G | O F | T H E | M O O N | A N D | M A K I N G | A | W R E A T H | O F | P R I M R O S E S | F O R | H E R | D O N K E Y | +A S | T H E Y | S A T | D O W N | A | B U R S T | O F | A P P L A U S E | D R E W | A L E X A N D E R ' S | A T T E N T I O N | T O | T H E | S T A G E | +A L L | T H E | S A M E | H E | L I F T E D | H I S | G L A S S | H E R E ' S | T O | Y O U | L I T T L E | H I L D A | +D O | Y O U | K N O W | A L E X A N D E R | M A I N H A L L | L O O K E D | W I T H | P E R P L E X I T Y | U P | I N T O | T H E | T O P | O F | T H E | H A N S O M | A N D | R U B B E D | H I S | P I N K | C H E E K | W I T H | H I S | G L O V E D | F I N G E R | D O | Y O U | K N O W | I | S O M E T I M E S | T H I N K | O F | T A K I N G | T O | C R I T I C I S M | S E R I O U S L Y | M Y S E L F | +S I R | H A R R Y | T O W N E | B O W E D | A N D | S A I D | T H A T | H E | H A D | M E T | M I S T E R | A L E X A N D E R | A N D | H I S | W I F E | I N | T O K Y O | +T H E | F A C T | I S | S H E ' S | F E E L I N G | R A T H E R | S E E D Y | P O O R | C H I L D | +H E | B O W E D | A S | T H E | W A R N I N G | B E L L | R A N G | A N D | M A I N H A L L | W H I S P E R E D | Y O U | K N O W | L O R D | W E S T M E R E | O F | C O U R S E | T H E | S T O O P E D | M A N | W I T H | T H E | L O N G | G R A Y | M U S T A C H E | T A L K I N G | T O | L A D Y | D O W L E | +I | D A R E | S A Y | I T ' S | Q U I T E | T R U E | T H A T | T H E R E ' S | N E V E R | B E E N | A N Y | O N E | E L S E | +T H E | P L A Y W R I G H T | G A V E | M A I N H A L L | A | C U R I O U S | L O O K | O U T | O F | H I S | D E E P | S E T | F A D E D | E Y E S | A N D | M A D E | A | W R Y | F A C E | +I T | W A S | Y O U T H | A N D | P O V E R T Y | A N D | P R O X I M I T Y | A N D | E V E R Y T H I N G | W A S | Y O U N G | A N D | K I N D L Y | +H E | H A D | W R I T T E N | A | N U M B E R | O F | B O O K S | H I M S E L F | A M O N G | T H E M | A | H I S T O R Y | O F | D A N C I N G | A | H I S T O R Y | O F | C O S T U M E | A | K E Y | T O | S H A K E S P E A R E ' S | S O N N E T S | A | S T U D Y | O F | T H E | P O E T R Y | O F | E R N E S T | D O W S O N | E T | C E T E R A | +O H | B A R T L E Y | D I D | Y O U | W R I T E | T O | M E | +I F | Y O U ' D | S E N T | M E | A | N O T E | O R | T E L E P H O N E D | M E | O R | A N Y T H I N G | +H E | B E N T | H I S | F A C E | O V E R | H E R | H A I R | +A L E X A N D E R | S L I P P E D | H I S | A R M | A B O U T | H E R | +O F | C O U R S E | I | K N O W | B A R T L E Y | S H E | S A I D | A T | L A S T | T H A T | A F T E R | T H I S | Y O U | W O N ' T | O W E | M E | T H E | L E A S T | C O N S I D E R A T I O N | B U T | W E | S A I L | O N | T U E S D A Y | +I | S A W | T H A T | I N T E R V I E W | I N | T H E | P A P E R | Y E S T E R D A Y | T E L L I N G | W H E R E | Y O U | W E R E | A N D | I | T H O U G H T | I | H A D | T O | S E E | Y O U | T H A T ' S | A L L | G O O D | N I G H T | I ' M | G O I N G | N O W | +I | D O N ' T | K N O W | W H A T | I | O U G H T | T O | S A Y | B U T | I | D O N ' T | B E L I E V E | Y O U ' D | B E | H A P P Y | T R U L Y | I | D O N ' T | A R E N ' T | Y O U | T R Y I N G | T O | F R I G H T E N | M E | +O N L Y | I ' L L | D O | I T | M O R E | C O M P L E T E L Y | +I ' V E | B E E N | U P | I N | C A N A D A | W I T H | M Y | B R I D G E | A N D | I | A R R A N G E D | N O T | T O | C O M E | T O | N E W | Y O R K | U N T I L | A F T E R | Y O U | H A D | G O N E | +T H E N | Y O U | D O N ' T | K N O W | W H A T | Y O U ' R E | T A L K I N G | A B O U T | +O V E R | T H E | F I R E P L A C E | T H E R E | W A S | A | L A R G E | O L D | F A S H I O N E D | G I L T | M I R R O R | +A L E X A N D E R | F L U S H E D | A N G R I L Y | +I | T H I N K | I | H A V E | F E L T | T H A T | Y O U | W E R E | C O M I N G | +H E | P A U S E D | T H E Y | N E V E R | D I D | T O | M E | +I | T O L D | M Y S E L F | T H A T | I F | I | W E R E | R E A L L Y | T H I N K I N G | O F | Y O U | A N D | N O T | O F | M Y S E L F | A | L E T T E R | W O U L D | B E | B E T T E R | T H A N | N O T H I N G | +T H E N | W H E N | Y O U R | M A N A G E R | A D D E D | T W O | M O R E | W E E K S | I | W A S | A L R E A D Y | C O M M I T T E D | +I ' M | G O I N G | T O | D O | W H A T | Y O U | A S K E D | M E | T O | D O | W H E N | Y O U | W E R E | I N | L O N D O N | +O N | T H E | L A S T | S A T U R D A Y | I N | A P R I L | T H E | N E W | Y O R K | T I M E S | P U B L I S H E D | A N | A C C O U N T | O F | T H E | S T R I K E | C O M P L I C A T I O N S | W H I C H | W E R E | D E L A Y I N G | A L E X A N D E R ' S | N E W | J E R S E Y | B R I D G E | A N D | S T A T E D | T H A T | T H E | E N G I N E E R | H I M S E L F | W A S | I N | T O W N | A N D | A T | H I S | O F F I C E | O N | W E S T | T E N T H | S T R E E T | +L E T | M E | T A K E | O F F | Y O U R | C O A T | A N D | Y O U R | B O O T S | T H E Y ' R E | O O Z I N G | W A T E R | +B U T | W H E N | I | C A M E | I | T H O U G H T | I | H A D | B E E N | M I S T A K E N | +Y E S | I | K N O W | V E R Y | W E L L | +H E | R O S E | A N D | C R O S S E D | T H E | R O O M | Q U I C K L Y | +A N D | I | S H E | W H I S P E R E D | I | F E L T | T H A T | Y O U | W E R E | F E E L I N G | T H A T | +I T | S E E M E D | A S | I F | H I S | F A M I L Y | T R O U B L E S | W E R E | J U S T | B E G I N N I N G | +H E | S A W | A | B U S Y | S A T U R D A Y | U S H E R E D | O U T | T H E | S A B B A T H | I N | A N D | N O T H I N G | D O N E | +H E | S A W | T H A T | I N | T H E | E X C I T E M E N T | O F | R E C E N T | E V E N T S | H E | H A D | N O T | F O R M U L A T E D | A | P L A N | U P O N | T H A T | S C O R E | +S O | H E R E | I T | W A S | S P R E A D | O U T | C L E A R | B E F O R E | H I M | A N D | N O W | H E | K N E W | W H A T | T O | E X P E C T | +Y O U | T A K E | T H I S | T O | T H I S | A D D R E S S | H E | S A I D | H A N D I N G | H I M | T H E | E N V E L O P E | A N D | G I V E | I T | T O | M I S S U S | H U R S T W O O D | Y E S | S I R | S A I D | T H E | B O Y | +D E A R | S I R | W E | B E G | T O | I N F O R M | Y O U | T H A T | W E | A R E | I N S T R U C T E D | T O | W A I T | U N T I L | T O | M O R R O W | T H U R S D A Y | A T | O N E | O ' C L O C K | B E F O R E | F I L I N G | S U I T | A G A I N S T | Y O U | O N | B E H A L F | O F | M I S S U S | J U L I A | H U R S T W O O D | F O R | D I V O R C E | A N D | A L I M O N Y | +H E | W A S | G E T T I N G | S O M E | V A G U E | C O M F O R T | O U T | O F | A | G O O D | C I G A R | B U T | I T | W A S | N O | P A N A C E A | F O R | T H E | I L L | W H I C H | A F F E C T E D | H I M | +A N Y | A N S W E R | I | G U E S S | N O T | +H E | W A S | Q U I T E | C E R T A I N | N O W | T H A T | S H E | K N E W | H E | W A S | M A R R I E D | A N D | W A S | A N G E R E D | A T | H I S | P E R F I D Y | +H E | F A N C I E D | A S | H E | S A T | A T | H I S | D E S K | T H A T | N O T H I N G | W O U L D | B E | D O N E | F O R | A | W E E K | O R | T W O | M E A N W H I L E | H E | W O U L D | H A V E | T I M E | T O | T H I N K | +O N | W E D N E S D A Y | H E | R E C E I V E D | A N O T H E R | P O L I T E | N O T E | F R O M | M C | G R E G O R | J A M E S | A N D | H A Y | I T | R E A D | +H E | S T A Y E D | A T | H I S | D E S K | L O N G | A F T E R | A L L | O T H E R S | H A D | G O N E | A N D | O N L Y | Q U I T T E D | I T | W H E N | T H E | N I G H T | W A T C H M A N | O N | H I S | R O U N D | P U L L E D | A T | T H E | F R O N T | D O O R | T O | S E E | I F | I T | W A S | S A F E L Y | L O C K E D | +H O W | A B O U T | T H A T | N O W | H I S | P A I N | A T | H E R | F A I L U R E | T O | M E E T | O R | W R I T E | H I M | R A P I D L Y | I N C R E A S E D | A S | H E | D E V O T E D | H I M S E L F | T O | T H I S | S U B J E C T | +V E R Y | T R U L Y | Y O U R S | E T | C E T E R A | C O M P R O M I S E | +H E | T R O U B L E D | O V E R | M A N Y | L I T T L E | D E T A I L S | A N D | T A L K E D | P E R F U N C T O R I L Y | T O | E V E R Y B O D Y | +H E | W O U L D | G O | T O | H E R | A N D | T E L L | H E R | A L L | H I S | F A M I L Y | C O M P L I C A T I O N S | +I F | H E | D I D N ' T | G O | A N D | S E E | T H E M | T H E Y | W O U L D | S U E | H I M | P R O M P T L Y | +H E | W A S | B E A T E N | F O R | T O | N I G H T | A N D | H E | M I G H T | J U S T | A S | W E L L | M A K E | T H E | B E S T | O F | I T | +H E | C O U L D | H A R D L Y | R E A L I S E | H O W | I T | H A D | A L L | C O M E | A B O U T | +H E | W O U L D | E X P L A I N | T O | H E R | J U S T | W H E R E | H E | S T O O D | A N D | H O W | M U C H | H E | N E E D E D | H E R | +T H R E E | O ' C L O C K | C A M E | F O U R | F I V E | S I X | A N D | N O | L E T T E R | +S H E | W O U L D | T A K E | T H E | E N V E L O P E | A N D | K N O W | T H A T | S H E | H A D | T R I U M P H E D | +I F | H E | O N L Y | H A D | T H A T | L E T T E R | B A C K | H E | W O U L D N ' T | S E N D | I T | +I N | A B O U T | A N | H O U R | A N D | T H R E E | Q U A R T E R S | T H E | B O Y | R E T U R N E D | +N O | L E T T E R | H A D | C O M E | N O | W O R D | O F | A N Y | K I N D | A N D | Y E T | H E R E | I T | W A S | L A T E | I N | T H E | E V E N I N G | A N D | S H E | H A D | A G R E E D | T O | M E E T | H I M | T H A T | M O R N I N G | +H E | D I D | N O T | G O | W I T H I N | A | B L O C K | O F | T H E | H O U S E | +A L L | D A Y | T H E | B A R | B E I N G | C L O S E D | H E | B R O O D E D | A L O N E | S H U T | O U T | F R O M | H O M E | F R O M | T H E | E X C I T E M E N T | O F | H I S | R E S O R T | F R O M | C A R R I E | A N D | W I T H O U T | T H E | A B I L I T Y | T O | A L T E R | H I S | C O N D I T I O N | O N E | I O T A | +I T | W A S | W I T H | G R E A T | O P P O S I T I O N | A F T E R | T W O | O R | T H R E E | H O U R S | O F | T H E | M O S T | U R G E N T | M E N T A L | A F F I R M A T I O N | A N D | D E N I A L | T H A T | A T | L A S T | H E | G O T | A N | E N V E L O P E | P L A C E D | I N | I T | T H E | R E Q U E S T E D | A M O U N T | A N D | S L O W L Y | S E A L E D | I T | U P | +T H E | H E L P L E S S | M A N A G E R | P A C E D | T H E | F L O O R | A N D | G R I M L Y | E N D U R E D | T H E | G L O O M | O F | D E F E A T | +W H E N | H U R S T W O O D | G O T | B A C K | T O | H I S | O F F I C E | A G A I N | H E | W A S | I N | A | G R E A T E R | Q U A N D A R Y | T H A N | E V E R | +A L L | T H E | T I M E | H I S | T H O U G H T S | W O U L D | R U N | O U T | T O | H I S | H O M E | A N D | S E E | T H E | S C E N E | B E I N G | T H E R E I N | E N A C T E D | +H E | H A D | L O V E D | H E R | E A R N E S T L Y | E N O U G H | B U T | N O W | T H A T | T H E | P O S S I B I L I T Y | O F | L O S I N G | H E R | S T A R E D | H I M | I N | T H E | F A C E | S H E | S E E M E D | M U C H | M O R E | A T T R A C T I V E | +H E | D I D | M A N A G E | T O | B R I N G | H I M S E L F | I N T O | T H E | M O O D | T O | G O | O U T | T O | C A R R I E | B U T | W H E N | H E | G O T | I N | O G D E N | P L A C E | H E | T H O U G H T | H E | S A W | A | M A N | W A T C H I N G | H I M | A N D | W E N T | A W A Y | +T H E | B O Y | H A S T E N E D | A W A Y | A N D | T H E | M A N A G E R | F E L L | T O | H I S | M U S I N G S | +F O R | R E L I E F | H E | A R O S E | A N D | J O I N E D | I N | C O N V E R S A T I O N | W I T H | A | F E W | F R I E N D S | W H O | W E R E | D R I N K I N G | +H E | D E C I D E D | T O | W R I T E | H E R | C A R E | O F | T H E | W E S T | S I D E | P O S T | O F F I C E | A N D | A S K | F O R | A N | E X P L A N A T I O N | A S | W E L L | A S | T O | H A V E | H E R | M E E T | H I M | +T H E N | H E | C A L L E D | H A R R Y | T H E | B O Y | O F | A L L | W O R K | A R O U N D | T H E | P L A C E | +B U T | H E | C O M P R O M I S E D | B Y | T E L L I N G | T H E | B O Y | T H A T | T H E R E | W O U L D | B E | N O | R E P L Y | +H E | W E N T | I N | A N D | E X A M I N E D | H I S | L E T T E R S | B U T | T H E R E | W A S | N O T H I N G | F R O M | C A R R I E | +H E | C O U L D | A R R A N G E | T H A T | S A T I S F A C T O R I L Y | F O R | C A R R I E | W O U L D | B E | G L A D | T O | W A I T | I F | N E C E S S A R Y | +T H E N | H E | R A N G | T H E | B E L L | N O | A N S W E R | +H U R S T W O O D | A L M O S T | E X C L A I M E D | O U T | L O U D | A T | T H E | I N S I S T E N C Y | O F | T H I S | T H I N G | +A T | O N E | T H I R T Y | H E | W E N T | T O | R E C T O R ' S | F O R | L U N C H | A N D | W H E N | H E | R E T U R N E D | A | M E S S E N G E R | W A S | W A I T I N G | F O R | H I M | +H E | W O U L D | G E T | O N E | T O | D A Y | I T | W O U L D | P R O B A B L Y | B E | O N | H I S | D E S K | W H E N | H E | G O T | B A C K | H E | W O U L D | L O O K | F O R | I T | A T | O N C E | +W H I L E | T H E | D A N G E R | H A D | N O T | L E S S E N E D | I T | H A D | N O T | A S | Y E T | M A T E R I A L I S E D | A N D | W I T H | H I M | N O | N E W S | W A S | G O O D | N E W S | +H E | W O U L D | S E E | H O W | T H I N G S | T U R N E D | O U T | T O | M O R R O W | A N D | T H E N | H E | W O U L D | T A L K | T O | H E R | T H E Y | W E R E | G O I N G | T O | M E E T | A S | U S U A L | +H E | K N E W | H E R | W E L L | E N O U G H | T O | K N O W | T H A T | W H E N | S H E | H A D | D E C I D E D | U P O N | A | P L A N | S H E | W O U L D | F O L L O W | I T | U P | +F O R | S O M E | R E A S O N | H E | F E L T | A S | I F | S O M E T H I N G | M I G H T | C O M E | T H A T | W A Y | A N D | W A S | R E L I E V E D | W H E N | A L L | T H E | E N V E L O P E S | H A D | B E E N | S C A N N E D | A N D | N O T H I N G | S U S P I C I O U S | N O T I C E D | +S O | L I T T L E | D I D | H E | C O N S I D E R | D R O U E T | T H A T | I T | N E V E R | O N C E | O C C U R R E D | T O | H I M | T O | W O R R Y | A B O U T | H I S | F I N D I N G | O U T | +H E | R A N G | A G A I N | T H I S | T I M E | H A R D E R | S T I L L | N O | A N S W E R | +H E | G R E W | R E S T L E S S | A S | H E | R U M I N A T E D | A N D | T H E N | D E C I D E D | T H A T | P E R H A P S | I T | W A S | N O T H I N G | +L A T E R | H O W E V E R | H I S | O L D | D I S C R E T I O N | A S S E R T E D | I T S E L F | +F O R T U N A T E L Y | T H E R E | W A S | N O T H I N G | F R O M | H I S | W I F E | E I T H E R | +T H E N | H E | S A T | D O W N | I N | H I S | C H A I R | A N D | G A Z E D | W I T H O U T | S E E I N G | C O N T E M P L A T I N G | T H E | R E S U L T | O F | H I S | W O R K | +H E | B E G A N | T O | W I S H | T H A T | H E | H A D | C O M P R O M I S E D | I N | S O M E | W A Y | O R | O T H E R | T H A T | H E | H A D | S E N T | T H E | M O N E Y | P E R H A P S | H E | C O U L D | D O | I T | U P | H E R E | +H E | P U T | O N | H I S | H A T | A N D | L O O K E D | A R O U N D | F O R | H I S | U M B R E L L A | +H E | W A S | I N | A | F E V E R E D | S T A T E | O F | M I N D | O W I N G | T O | T H E | B L I G H T | H I S | W I F E ' S | A C T I O N | T H R E A T E N E D | T O | C A S T | U P O N | H I S | E N T I R E | F U T U R E | +H O W | W O U L D | T H E | P A P E R S | T A L K | A B O U T | I T | +A F T E R | A | T I M E | H E | G A V E | U P | W A I T I N G | A N D | D R E A R I L Y | H E A D E D | F O R | T H E | M A D I S O N | C A R | +S O M E T H I N G | H A D | T O | B E | D O N E | A | C L I M A X | W A S | N E A R | A N D | S H E | W O U L D | N O T | S I T | I D L E | +S H E | H A D | N O T | B E E N | A B L E | T O | G E T | A W A Y | T H I S | M O R N I N G | +H E | A R O S E | F R O M | H I S | C H A I R | A N D | W E N T | A N D | L O O K E D | O U T | I N T O | T H E | S T R E E T | +H E | W O U L D | G O | I N | A N D | S E E | A N Y H O W | H E | W O U L D | H A V E | N O | R O W | +W H A T | W O U L D | S H E | D O | A B O U T | T H A T | T H E | C O N F O U N D E D | W R E T C H | +H I S | F I R S T | I M P U L S E | W A S | T O | W R I T E | B U T | F O U R | W O R D S | I N | R E P L Y | G O | T O | T H E | D E V I L | +T H E | L O N G | D R I Z Z L E | H A D | B E G U N | P E D E S T R I A N S | H A D | T U R N E D | U P | C O L L A R S | A N D | T R O U S E R S | A T | T H E | B O T T O M | +H E | W O U L D | H A V E | S O M E | A R R A N G E M E N T | O F | T H I S | T H I N G | +H U R S T W O O D | W A L K E D | T H E | F L O O R | M E N T A L L Y | A R R A N G I N G | T H E | C H I E F | P O I N T S | O F | H I S | S I T U A T I O N | +H E | W O U L D | H A V E | T O | P A Y | H E R | T H E | M O N E Y | W H I C H | S H E | W O U L D | N O W | R E G U L A R L Y | D E M A N D | O R | T H E R E | W O U L D | B E | T R O U B L E | I T | D I D | N O T | M A T T E R | W H A T | H E | D I D | +B Y | T H E | T I M E | H E | R E A C H E D | H I S | O W N | S T R E E T | H E | W A S | K E E N L Y | A L I V E | T O | T H E | D I F F I C U L T I E S | O F | H I S | S I T U A T I O N | A N D | W I S H E D | O V E R | A N D | O V E R | T H A T | S O M E | S O L U T I O N | W O U L D | O F F E R | I T S E L F | T H A T | H E | C O U L D | S E E | H I S | W A Y | O U T | +H E | A L S O | T H O U G H T | O F | H I S | M A N A G E R I A L | P O S I T I O N | +T H E | W A L L S | O F | T H E | R O O M S | W E R E | D I S C O R D A N T L Y | P A P E R E D | +Y O U | C O U L D | G E T | H O M E | E A S Y | T O O | I T | I S N ' T | V E R Y | F A R | +H I S | A M B I T I O N | W A S | S O M E | D A Y | T O | B U I L D | A | H O U S E | O N | T H E M | +H E | W A S | O F | A | C L E A N | S A V I N G | D I S P O S I T I O N | A N D | H A D | A L R E A D Y | P A I D | A | N U M B E R | O F | M O N T H L Y | I N S T A L M E N T S | O N | T W O | L O T S | F A R | O U T | O N | T H E | W E S T | S I D E | +M I N N I E ' S | F L A T | A S | T H E | O N E | F L O O R | R E S I D E N T | A P A R T M E N T S | W E R E | T H E N | B E I N G | C A L L E D | W A S | I N | A | P A R T | O F | W E S T | V A N | B U R E N | S T R E E T | I N H A B I T E D | B Y | F A M I L I E S | O F | L A B O U R E R S | A N D | C L E R K S | M E N | W H O | H A D | C O M E | A N D | W E R E | S T I L L | C O M I N G | W I T H | T H E | R U S H | O F | P O P U L A T I O N | P O U R I N G | I N | A T | T H E | R A T E | O F | F I F T Y | T H O U S A N D | A | Y E A R | +H E | S E E M E D | T O | B E | T H I N K I N G | O F | S O M E T H I N G | E L S E | +T H E S E | V A S T | B U I L D I N G S | W H A T | W E R E | T H E Y | +T O | C A R R I E | T H E | S O U N D | O F | T H E | L I T T L E | B E L L S | U P O N | T H E | H O R S E | C A R S | A S | T H E Y | T I N K L E D | I N | A N D | O U T | O F | H E A R I N G | W A S | A S | P L E A S I N G | A S | I T | W A S | N O V E L | +S H E | A S K E D | M I N N I E | F O R | I N K | A N D | P A P E R | W H I C H | W E R E | U P O N | T H E | M A N T E L | I N | T H E | D I N I N G | R O O M | A N D | W H E N | T H E | L A T T E R | H A D | G O N E | T O | B E D | A T | T E N | G O T | O U T | D R O U E T ' S | C A R D | A N D | W R O T E | H I M | +O N E | C O U L D | S E E | T H A T | H E | W A S | V E R Y | M U C H | W R A P P E D | U P | I N | H I S | O F F S P R I N G | +A | S H O P | G I R L | W A S | T H E | D E S T I N Y | P R E F I G U R E D | F O R | T H E | N E W C O M E R | +T H E | F L O O R S | W E R E | C O V E R E D | W I T H | M A T T I N G | A N D | T H E | H A L L | L A I D | W I T H | A | T H I N | R A G | C A R P E T | +S H E | H A D | S O M E | S L I G H T | G I F T | O F | O B S E R V A T I O N | A N D | T H A T | S E N S E | S O | R I C H | I N | E V E R Y | W O M A N | I N T U I T I O N | +M I N N I E | B E G A N | T O | E X P L A I N | B U T | H E R | H U S B A N D | T O O K | T H I S | P A R T | O F | T H E | C O N V E R S A T I O N | T O | H I M S E L F | +N O W | N O W | H E | S A I D | W A L K I N G | T H E R E | T H E R E | A N D | T H E R E | W A S | A | C E R T A I N | S W E D I S H | A C C E N T | N O T I C E A B L E | I N | H I S | V O I C E | +I T | G A V E | A N | I M P O S I N G | A P P E A R A N C E | T O | M O S T | O F | T H E | W H O L E S A L E | H O U S E S | W H O S E | O F F I C E S | W E R E | U P O N | T H E | G R O U N D | F L O O R | A N D | I N | P L A I N | V I E W | O F | T H E | S T R E E T | +S H E | W A N T E D | T O | M A K E | S O M E | R E F E R E N C E | T O | T H E I R | R E L A T I O N S | U P O N | T H E | T R A I N | B U T | W A S | T O O | T I M I D | +A N Y T H I N G | W A S | G O O D | E N O U G H | S O | L O N G | A S | I T | P A I D | S A Y | F I V E | D O L L A R S | A | W E E K | T O | B E G I N | W I T H | +T H E N | S H E | W A L K E D | A N D | S A N G | T O | I T | U N T I L | H A N S O N | D I S T U R B E D | I N | H I S | R E A D I N G | C A M E | A N D | T O O K | I T | +I T | W A S | U N D E R | S U C H | A U S P I C I O U S | C I R C U M S T A N C E S | T H A T | S H E | S T A R T E D | O U T | T H I S | M O R N I N G | T O | L O O K | F O R | W O R K | +N A R R O W | B O A R D | W A L K S | E X T E N D E D | O U T | P A S S I N G | H E R E | A | H O U S E | A N D | T H E R E | A | S T O R E | A T | F A R | I N T E R V A L S | E V E N T U A L L Y | E N D I N G | O N | T H E | O P E N | P R A I R I E | +T O | H I M | T H E | P R E S E N C E | O R | A B S E N C E | O F | H I S | W I F E ' S | S I S T E R | W A S | A | M A T T E R | O F | I N D I F F E R E N C E | +O H | W H A T | S H A L L | W E | D O | F O R | A | H O M E | +Y O U | S A Y | Y O U | K N O W | A L L | A B O U T | I T | T H E N | G O | O N | A N D | F I N I S H | Y O U R | N E S T S | B Y | Y O U R S E L V E S | +S H E | W A S | I N D E E D | A | C L E V E R | B I R D | +A N D | S H E | S A W | T H E | O T H E R | B I R D S | H O P P I N G | A B O U T | A N D | T W I T T E R I N G | H E L P L E S S L Y | +M U C H | L U C K | M A Y | Y O U | H A V E | +C E R T A I N L Y | O F | C O U R S E | S C R E A M E D | T H E | J A C K D A W | +A N D | A W A Y | S H E | F L E W | T O | H E R | O W N | C O S Y | N E S T | I N | T H E | E L M | T R E E | W H E R E | S H E | W A S | S O O N | F A S T | A S L E E P | F O R G E T T I N G | A L L | A B O U T | T H E | M A T T E R | +A N D | S O M E | O F | T H E | B I R D S | W H O | W E R E | A T T E N T I V E | A N D | C A R E F U L | S O O N | S A W | H O W | I T | W A S | D O N E | A N D | S T A R T E D | N I C E | H O M E S | F O R | T H E M S E L V E S | +I N D E E D | I T | I S | N O T | A | N E S T | A T | A L L | O N L Y | T H E | B E G I N N I N G | O F | O N E | +B U T | T H E | W O O D | P I G E O N | W A S | I N | T H E | W O R S T | C A S E | O F | T H E M | A L L | +A N D | W H E R E | E A C H | B I R D | P E R C H E D | T H E R E | I T | W A S | T O | B U I L D | I T S | N E S T | +A N D | T H E | P O O R | S I L L Y | T H I N G S | R U F F L E D | U P | T H E I R | F E A T H E R S | A N D | L O O K E D | M I S E R A B L E | A S | O N L Y | A | L I T T L E | B I R D | C A N | L O O K | W H E N | I T | I S | U N H A P P Y | +C R I S S | C R O S S | C R I S S | C R O S S | S O | I N T E R R U P T E D | T H E | W O O D | P I G E O N | +I | T H O U G H T | T H A T | W A S | T H E | W A Y | T O | B E G I N | +A N D | T H E R E | I S | A N | O L D | S T O R Y | A B O U T | T H I S | W H I C H | I | S H A L L | T E L L | Y O U | +T H E | M A G P I E | S A I D | S H E | W O U L D | T E A C H | T H E M | I F | T H E Y | W O U L D | B E | A | P A T I E N T | D I L I G E N T | O B E D I E N T | C L A S S | O F | L I T T L E | B I R D S | +S O M E | A R E | W O N D E R F U L L Y | W R O U G H T | P R E T T Y | L I T T L E | H O M E S | F O R | B I R D I K I N S | +F O R | S H E | H A D | O N L Y | T H E | F O U N D A T I O N | L A I D | C R I S S | C R O S S | A S | T H E | M A G P I E | H A D | S H O W N | H E R | +T H E N | A L L | T H E | O T H E R | B I R D S | C H I R P E D | E A G E R L Y | Y E S | Y E S | L E T | U S | A S K | H E R | T O | T E A C H | U S | +H E R E | W O O D | P I G E O N | S A I D | M O T H E R | M A G P I E | Y O U | M U S T | P L A C E | T H O S E | S T I C K S | T H R O U G H | A N D | A C R O S S | C R I S S | C R O S S | C R I S S | C R O S S | S O | +O | W I S E | M O T H E R | M A G P I E | D E A R | M O T H E R | M A G P I E | T H E Y | C R I E D | T E A C H | U S | H O W | T O | B U I L D | O U R | N E S T S | L I K E | Y O U R S | F O R | I T | I S | G R O W I N G | N I G H T | A N D | W E | A R E | T I R E D | A N D | S L E E P Y | +S H E | B E G A N | T O | S H O W | T H E M | H O W | T O | W E A V E | T H E | B I T S | O F | T H I N G S | T O G E T H E R | I N T O | N E S T S | A S | T H E Y | S H O U L D | B E | M A D E | +S H E | P O P P E D | I N T O | H E R | N E W | H O U S E | A N D | S A T | T H E R E | C O M F O R T A B L Y | P E E R I N G | O U T | T H R O U G H | T H E | W I N D O W | S L I T S | W I T H | H E R | S H A R P | L I T T L E | E Y E S | +S O | I N | A | G R E A T | C O M P A N Y | T H E Y | C A M E | F L U T T E R I N G | H O P P I N G | T W I T T E R I N G | U P | T O | T H E | E L M | T R E E | W H E R E | M O T H E R | M A G P I E | N E S T L E D | C O M F O R T A B L Y | I N | H E R | N E W | H O U S E | +I T | W A S | I N D E E D | D A N C I N G | O N | A | V O L C A N O | +H E | M I G H T | B E | E N C H A N T E D | B U T | T H A T | W A S | T H E | T A L I S M A N | +H O W | M A N Y | I N C I D E N T S | H O W | M A N Y | C H A R A C T E R S | H O W | M A N Y | F E E L I N G S | F L I T T E D | O V E R | H I S | M E M O R Y | O F | W H A T | S W E E T | A N D | B I T T E R | E X P E R I E N C E | D I D | H E | N O T | C H E W | T H E | C U D | +I T | W A S | I N D E E D | H E R | H A N D W R I T I N G | +F O U R | A N D | T W E N T Y | H O U R S | A G O | A N D | H E | D E E M E D | H I M S E L F | T H E | M O S T | M I S E R A B L E | A N D | F O R L O R N | O F | H U M A N | B E I N G S | A N D | N O W | A L L | T H E | B L E S S I N G S | O F | T H E | W O R L D | S E E M E D | S H O W E R E D | A T | H I S | F E E T | +T H E | M O S T | G I F T E D | I N D I V I D U A L S | I N | T H E | L A N D | E M U L A T E D | E A C H | O T H E R | I N | P R O V I N G | W H I C H | E N T E R T A I N E D | F O R | H I M | T H E | M O S T | S I N C E R E | A F F E C T I O N | +A N D | N O W | A L L | H A D | E N D E D | S O | H A P P I L Y | +A S | F O R | H I S | F R I E N D S | T H E | F U T U R E | M U S T | P R O V E | H I S | G R A T I T U D E | T O | T H E M | +I N | E X A C T L Y | T E N | M I N U T E S | I T | I S | I N | T H E | P O W E R | O F | E V E R Y | M A N | T O | F R E E | H I M S E L F | F R O M | A L L | T H E | T U M U L T | O F | T H E | W O R L D | T H E | P A N G S | O F | L O V E | T H E | T H R O B S | O F | A M B I T I O N | T H E | W E A R | A N D | T E A R | O F | P L A Y | T H E | R E C R I M I N A T I N G | B O U D O I R | T H E | C O N S P I R I N G | C L U B | T H E | R A T T L I N G | H E L L | A N D | F I N D | H I M S E L F | I N | A | S U B L I M E | S Y L V A N | S O L I T U D E | S U P E R I O R | T O | T H E | C E D A R S | O F | L E B A N O N | A N D | I N F E R I O R | O N L Y | I N | E X T E N T | T O | T H E | C H E S T N U T | F O R E S T S | O F | A N A T O L I A | +T H I S | V I O L E N T | A N D | T R I U M P H A N T | R E V O L U T I O N | I N | H I S | P R O S P E C T S | A N D | H I S | F O R T U N E S | W A S | H A R D L Y | Y E T | C O M P L E T E L Y | C O M P R E H E N D E D | B Y | O U R | F R I E N D | F E R D I N A N D | A R M I N E | A N D | W H E N | H E | H A D | L E F T | A | N O T E | F O R | T H E | G E N E R O U S | M I R A B E L | W H O S E | S L U M B E R S | H E | W O U L D | N O T | D I S T U R B | A T | T H I S | E A R L Y | H O U R | E V E N | W I T H | G O O D | N E W S | H E | S T R O L L E D | A L O N G | U P | C H A R L E S | S T R E E T | A N D | T O | T H E | P A R K | I N | O N E | O F | T H O S E | W I L D | A N D | J O Y O U S | R E V E R I E S | I N | W H I C H | W E | B R O O D | O V E R | C O M I N G | B L I S S | A N D | C R E A T E | A | T H O U S A N D | G L O R I O U S | C O N S E Q U E N C E S | +I T | R E Q U I R E S | S O M E | S E L F | C O M M U N I O N | T O | P R E P A R E | O U R S E L V E S | F O R | G O O D | F O R T U N E | A S | W E L L | A S | T O | E N C O U N T E R | D I F F I C U L T Y | A N D | D A N G E R | A N D | D I S G R A C E | +H I S | C O N S T A N C Y | T O | H E R | W A S | N O W | R E W A R D E D | +F E R D I N A N D | F E L T | H I S | F R E E D O M | A S | W E L L | A S | H I S | H A P P I N E S S | +F E R D I N A N D | M E D I T A T E S | O V E R | H I S | G O O D | F O R T U N E | +I N | M O M E N T S | O F | D E E P | F E E L I N G | A L I K E | S U D D E N | B U R S T S | O F | P R O S P E R I T Y | A S | I N | D A R K E R | H O U R S | M A N | M U S T | B E | A L O N E | +I N | T H E | P R E S E N T | U N S E T T L E D | T H O U G H | H O P E F U L | S T A T E | O F | A F F A I R S | F E R D I N A N D | W O U L D | N O T | G O | H O M E | +W A S | I T | N O T | A L L | A | D R E A M | O F | H I S | O W N | C R E A T I O N | W H I L E | H I S | E Y E | H A D | B E E N | F I X E D | I N | A B S T R A C T I O N | O N | T H A T | B R I G H T | A N D | F L O W I N G | R I V E R | +R E S T L E S S | W I T H | I M P E N D I N G | J O Y | H E | S A U N T E R E D | T O | T H E | B R I D G E | A N D | L E A N T | O V E R | T H E | B A L U S T R A D E | G A Z I N G | O N | T H E | W A T E R S | I N | C H A R M E D | A N D | C H A R M I N G | V A C A N C Y | +I S | P A P A | A L O N E | E N Q U I R E D | M I S S | T E M P L E | +H E | C O U L D | N O T | F L A T T E R | H I M S E L F | T H A T | H E | I N D E E D | M E R I T E D | S U C H | S I N G U L A R | B L E S S I N G S | A N D | Y E T | W I T H | A L L | H I S | F A U L T S | W H I C H | W I T H | H I M | W E R E | B U T | T H E | C O N S E Q U E N C E S | O F | H I S | F I E R Y | Y O U T H | F E R D I N A N D | H A D | B E E N | F A I T H F U L | T O | H E N R I E T T A | +T I M E | W O R E | A W A Y | A N D | O N | T H E | N I N T H | O F | A P R I L | E I G H T E E N | S I X T Y | F I V E | G R A N T | C A P T U R E D | T H E | C O N F E D E R A T E | A R M Y | U N D E R | L E E | T H U S | V I R T U A L L Y | E N D I N G | T H E | W A R | +I N D E E D | I F | E V E R | A | G E N E R A L | D E S E R V E D | H O N O R | G R A N T | H A D | W O N | I T | H E | H A D | O P E N E D | T H E | M I S S I S S I P P I | T O | N A V I G A T I O N | A N D | H A D | C A P T U R E D | N E A R L Y | O N E | H U N D R E D | T H O U S A N D | P R I S O N E R S | A N D | A R M S | +H E | W A S | N O W | C O M M A N D E R | O F | A L L | T H E | F E D E R A L | F O R C E S | +W H E N | H I S | P U B L I C | S E R V I C E S | W E R E | F I N I S H E D | H E | S T A R T E D | I N | C O M P A N Y | W I T H | H I S | W I F E | S O N | J E S S E | A N D | A | F E W | F R I E N D S | +H I S | S U C C E S S | S E E M S | T O | H A V E | B E E N | T H E | O U T G R O W T H | O F | H A R D | S T U D Y | A N D | A B I L I T Y | T O | P E R F O R M | T H E | M O S T | E X H A U S T I V E | L A B O R | W I T H O U T | F A T I G U E | +T H E | C A P T U R E | O F | L E E | W A S | A | F A R | M O R E | D I F F I C U L T | U N D E R T A K I N G | +T H R O U G H | T H E | I N F L U E N C E | O F | H O N | T H O M A S | L | H A M E R | H E | W A S | A D M I T T E D | A T | W E S T | P O I N T | I N | E I G H T E E N | T H I R T Y | N I N E | +A T | T H I S | T I M E | G R A N T | W A S | N O T | T A K E N | W I T H | W A R | A N D | P R O B A B L Y | E V I N C E D | L I T T L E | I N T E R E S T | I N | A R M Y | T A C T I C S | +G R A N T | A C T E D | A S | M U S T E R I N G | O F F I C E R | U N T I L | B E I N G | C O M M I S S I O N E D | C O L O N E L | O F | T H E | T W E N T Y | F I R S T | I L L I N O I S | V O L U N T E E R S | H E | T O O K | T H E | F I E L D | +G E N E R A L | H A L L E C K | I N | S P E A K I N G | O F | T H I S | B A T T L E | S A I D | +T H E Y | D I D | N O T | B R E A T H E | I T | I N T O | T H E I R | M O U T H S | O R | T H R O U G H | G I L L S | B U T | T O O K | I T | I N | T H R O U G H | S O M E | O P E N I N G S | I N | T H E | B A C K | P A R T | O F | T H E I R | B O D I E S | +T H E Y | K N E W | T H A T | W H E N E V E R | T H E Y | S T U C K | O U T | T H E I R | L O W E R | L I P S | A T | T H E | S M A L L | F I S H E S | A N D | B U G S | T H E Y | S W A M | A W A Y | A S | F A S T | A S | T H E Y | C O U L D | +A | P E R S O N | W O U L D | T H I N K | T H A T | A F T E R | A | F A M I L Y | H A D | L I V E D | S O | L O N G | I N | A | P L A C E | A L L | T H E | N E I G H B O R S | W O U L D | B E | F O N D | O F | T H E M | Y E T | I T | I S | N O T | S O | +T H E Y | A L W A Y S | A T E | P L A I N | F O O D | A N D | P L E N T Y | O F | I T | A N D | T H E Y | N E V E R | A T E | B E T W E E N | M E A L S | +S U R E | E N O U G H | T H E R E | H E | C A M E | T H R O U G H | T H E | S H A L L O W | W A T E R | H I S | W E T | B A C K | S H E L L | P A R T L Y | O U T | O F | I T | A N D | S H I N I N G | I N | T H E | S U N L I G H T | +Y O U | W O U L D | T H I N K | T H A T | W I T H | S I X | L E G S | A P I E C E | A N D | T H R E E | J O I N T S | I N | E A C H | L E G | T H E Y | M I G H T | W A L K | Q U I T E | F A S T | Y E T | T H E Y | N E V E R | D I D | +H E | B E G A N | T O | D R A W | I N | H I S | L E G S | V E R Y | V E R Y | S L O W L Y | A N D | J U S T | A S | H I S | G R E A T | H A R D | L O W E R | S H E L L | T O U C H E D | T H E | M U D | T H E | L A S T | L A R V A | C R A W L E D | O U T | U N D E R | H I S | T A I L | +B U T | S O M E T I M E S | H E | S T R A I G H T E N S | T H E | J O I N T | A N D | H O L D S | H I S | L I P | O U T | B E F O R E | H I M | A N D | T H E N | I T S | P I N C E R S | C A T C H | H O L D | O F | T H I N G S | H E | D O E S | T H I S | W H E N | H E | I S | H U N G R Y | +I T | I S | D I S G R A C E F U L | +T H E | N Y M P H S | H A D | A L R E A D Y | G O T T E N | A W A Y | +O U R | U P P E R | L I P S | A R E | S O | S M A L L | T H E Y | D O N ' T | M A T T E R | +T H E Y | T H O U G H T | T H E | T R O U B L E | C A M E | F R O M | B A D | B R I N G I N G | U P | O R | N O | B R I N G I N G | U P | A T | A L L | +B O T H | L I P S | A S K E D | T H E | L A R V A E | +S C A R E D | D A H | W H O ' S | A F R A I D | A N S W E R E D | H E | +T H E Y | T H O U G H T | H E | M I G H T | B E | G O I N G | T O | T A K E | A | N A P | A F T E R | H I S | D I N N E R | +H E R E | C O M E S | T H E | S N A P P I N G | T U R T L E | +I N D E E D | T H E | L O W E R | L I P | O F | A | D R A G O N | F L Y | C H I L D | M I G H T | W E L L | F R I G H T E N | P E O P L E | F O R | I T | I S | F A S T E N E D | O N | A | L O N G | J O I N T E D | A R M | L I K E | T H I N G | A N D | H A S | P I N C E R S | O N | I T | W I T H | W H I C H | I T | C A T C H E S | A N D | H O L D S | I T S | F O O D | +W E L L | O U R | L O W E R | L I P S | A N Y W A Y | A N S W E R E D | T H E | N Y M P H | +O N | T H I S | A C C O U N T | T H E | P E O P L E | O F | O N E | N A T I O N | U N D E R S T A N D | O N E | A N O T H E R | B E T T E R | T H A N | T H O S E | B E L O N G I N G | T O | D I F F E R E N T | N A T I O N S | E V E N | W H E N | T H E Y | U S E | T H E | S A M E | L A N G U A G E | O R | R A T H E R | W H E N | P E O P L E | H A V E | L I V E D | L O N G | T O G E T H E R | U N D E R | S I M I L A R | C O N D I T I O N S | O F | C L I M A T E | S O I L | D A N G E R | R E Q U I R E M E N T | T O I L | T H E R E | O R I G I N A T E S | T H E R E F R O M | A N | E N T I T Y | T H A T | U N D E R S T A N D S | I T S E L F | N A M E L Y | A | N A T I O N | +E V E R Y W H E R E | T H A T | S L A V E | M O R A L I T Y | G A I N S | T H E | A S C E N D A N C Y | L A N G U A G E | S H O W S | A | T E N D E N C Y | T O | A P P R O X I M A T E | T H E | S I G N I F I C A T I O N S | O F | T H E | W O R D S | G O O D | A N D | S T U P I D | +D A N G E R | I S | A G A I N | P R E S E N T | T H E | M O T H E R | O F | M O R A L I T Y | G R E A T | D A N G E R | T H I S | T I M E | S H I F T E D | I N T O | T H E | I N D I V I D U A L | I N T O | T H E | N E I G H B O U R | A N D | F R I E N D | I N T O | T H E | S T R E E T | I N T O | T H E I R | O W N | C H I L D | I N T O | T H E I R | O W N | H E A R T | I N T O | A L L | T H E | M O S T | P E R S O N A L | A N D | S E C R E T | R E C E S S E S | O F | T H E I R | D E S I R E S | A N D | V O L I T I O N S | +W E | T R U T H F U L | O N E S | T H E | N O B I L I T Y | I N | A N C I E N T | G R E E C E | C A L L E D | T H E M S E L V E S | +P R O B A B L Y | A | P E S S I M I S T I C | S U S P I C I O N | W I T H | R E G A R D | T O | T H E | E N T I R E | S I T U A T I O N | O F | M A N | W I L L | F I N D | E X P R E S S I O N | P E R H A P S | A | C O N D E M N A T I O N | O F | M A N | T O G E T H E R | W I T H | H I S | S I T U A T I O N | +V A R I A T I O N S | W H E T H E R | T H E Y | B E | D E V I A T I O N S | I N T O | T H E | H I G H E R | F I N E R | A N D | R A R E R | O R | D E T E R I O R A T I O N S | A N D | M O N S T R O S I T I E S | A P P E A R | S U D D E N L Y | O N | T H E | S C E N E | I N | T H E | G R E A T E S T | E X U B E R A N C E | A N D | S P L E N D O U R | T H E | I N D I V I D U A L | D A R E S | T O | B E | I N D I V I D U A L | A N D | D E T A C H | H I M S E L F | +I N | F A C T | C O N F O R M A B L Y | T O | T H E | S L O W | R I S E | O F | T H E | D E M O C R A T I C | S O C I A L | O R D E R | A N D | I T S | C A U S E | T H E | B L E N D I N G | O F | T H E | B L O O D | O F | M A S T E R S | A N D | S L A V E S | T H E | O R I G I N A L L Y | N O B L E | A N D | R A R E | I M P U L S E | O F | T H E | M A S T E R S | T O | A S S I G N | A | V A L U E | T O | T H E M S E L V E S | A N D | T O | T H I N K | W E L L | O F | T H E M S E L V E S | W I L L | N O W | B E | M O R E | A N D | M O R E | E N C O U R A G E D | A N D | E X T E N D E D | B U T | I T | H A S | A T | A L L | T I M E S | A N | O L D E R | A M P L E R | A N D | M O R E | R A D I C A L L Y | I N G R A I N E D | P R O P E N S I T Y | O P P O S E D | T O | I T | A N D | I N | T H E | P H E N O M E N O N | O F | V A N I T Y | T H I S | O L D E R | P R O P E N S I T Y | O V E R M A S T E R S | T H E | Y O U N G E R | +O C C A S I O N A L L Y | T O O | T H E | W A K I N G | C A L L | C O M E S | T O O | L A T E | T H E | C H A N C E | W H I C H | G I V E S | P E R M I S S I O N | T O | T A K E | A C T I O N | W H E N | T H E I R | B E S T | Y O U T H | A N D | S T R E N G T H | F O R | A C T I O N | H A V E | B E E N | U S E D | U P | I N | S I T T I N G | S T I L L | A N D | H O W | M A N Y | A | O N E | J U S T | A S | H E | S P R A N G | U P | H A S | F O U N D | W I T H | H O R R O R | T H A T | H I S | L I M B S | A R E | B E N U M B E D | A N D | H I S | S P I R I T S | A R E | N O W | T O O | H E A V Y | +W H A T | W I L L | T H E | M O R A L | P H I L O S O P H E R S | W H O | A P P E A R | A T | T H I S | T I M E | H A V E | T O | P R E A C H | +I T | I S | O B V I O U S | T H A T | E V E R Y W H E R E | T H E | D E S I G N A T I O N S | O F | M O R A L | V A L U E | W E R E | A T | F I R S T | A P P L I E D | T O | M E N | A N D | W E R E | O N L Y | D E R I V A T I V E L Y | A N D | A T | A | L A T E R | P E R I O D | A P P L I E D | T O | A C T I O N S | I T | I S | A | G R O S S | M I S T A K E | T H E R E F O R E | W H E N | H I S T O R I A N S | O F | M O R A L S | S T A R T | W I T H | Q U E S T I O N S | L I K E | W H Y | H A V E | S Y M P A T H E T I C | A C T I O N S | B E E N | P R A I S E D | +W H I C H E V E R | G R O U P S | O F | S E N S A T I O N S | W I T H I N | A | S O U L | A W A K E N | M O S T | R E A D I L Y | B E G I N | T O | S P E A K | A N D | G I V E | T H E | W O R D | O F | C O M M A N D | T H E S E | D E C I D E | A S | T O | T H E | G E N E R A L | O R D E R | O F | R A N K | O F | I T S | V A L U E S | A N D | D E T E R M I N E | U L T I M A T E L Y | I T S | L I S T | O F | D E S I R A B L E | T H I N G S | +H E | H O N O U R S | W H A T E V E R | H E | R E C O G N I Z E S | I N | H I M S E L F | S U C H | M O R A L I T Y | E Q U A L S | S E L F | G L O R I F I C A T I O N | +A N D | T O | C H O O S E | F O R | C O M P A N Y | T H A T | R O G U I S H | A N D | C H E E R F U L | V I C E | P O L I T E N E S S | +A C C O R D I N G | T O | S L A V E | M O R A L I T Y | T H E R E F O R E | T H E | E V I L | M A N | A R O U S E S | F E A R | A C C O R D I N G | T O | M A S T E R | M O R A L I T Y | I T | I S | P R E C I S E L Y | T H E | G O O D | M A N | W H O | A R O U S E S | F E A R | A N D | S E E K S | T O | A R O U S E | I T | W H I L E | T H E | B A D | M A N | I S | R E G A R D E D | A S | T H E | D E S P I C A B L E | B E I N G | +T H E | D I S T I N C T I O N S | O F | M O R A L | V A L U E S | H A V E | E I T H E R | O R I G I N A T E D | I N | A | R U L I N G | C A S T E | P L E A S A N T L Y | C O N S C I O U S | O F | B E I N G | D I F F E R E N T | F R O M | T H E | R U L E D | O R | A M O N G | T H E | R U L E D | C L A S S | T H E | S L A V E S | A N D | D E P E N D E N T S | O F | A L L | S O R T S | +T H E | H I G H E S T | I N S T I N C T | F O R | P U R I T Y | P L A C E S | H I M | W H O | I S | A F F E C T E D | W I T H | I T | I N | T H E | M O S T | E X T R A O R D I N A R Y | A N D | D A N G E R O U S | I S O L A T I O N | A S | A | S A I N T | F O R | I T | I S | J U S T | H O L I N E S S | T H E | H I G H E S T | S P I R I T U A L I Z A T I O N | O F | T H E | I N S T I N C T | I N | Q U E S T I O N | +T H I S | I S | T H E | P R O B L E M | O F | R A C E | +N O T H I N G | B U T | N E W | W H Y S | N O T H I N G | B U T | N E W | H O W S | N O | C O M M O N | F O R M U L A S | A N Y | L O N G E R | M I S U N D E R S T A N D I N G | A N D | D I S R E G A R D | I N | L E A G U E | W I T H | E A C H | O T H E R | D E C A Y | D E T E R I O R A T I O N | A N D | T H E | L O F T I E S T | D E S I R E S | F R I G H T F U L L Y | E N T A N G L E D | T H E | G E N I U S | O F | T H E | R A C E | O V E R F L O W I N G | F R O M | A L L | T H E | C O R N U C O P I A S | O F | G O O D | A N D | B A D | A | P O R T E N T O U S | S I M U L T A N E O U S N E S S | O F | S P R I N G | A N D | A U T U M N | F U L L | O F | N E W | C H A R M S | A N D | M Y S T E R I E S | P E C U L I A R | T O | T H E | F R E S H | S T I L L | I N E X H A U S T E D | S T I L L | U N W E A R I E D | C O R R U P T I O N | +E V E R Y | E L E V A T I O N | O F | T H E | T Y P E | M A N | H A S | H I T H E R T O | B E E N | T H E | W O R K | O F | A N | A R I S T O C R A T I C | S O C I E T Y | A N D | S O | I T | W I L L | A L W A Y S | B E | A | S O C I E T Y | B E L I E V I N G | I N | A | L O N G | S C A L E | O F | G R A D A T I O N S | O F | R A N K | A N D | D I F F E R E N C E S | O F | W O R T H | A M O N G | H U M A N | B E I N G S | A N D | R E Q U I R I N G | S L A V E R Y | I N | S O M E | F O R M | O R | O T H E R | +H E R E | I S | T H E | S E A T | O F | T H E | O R I G I N | O F | T H E | F A M O U S | A N T I T H E S I S | G O O D | A N D | E V I L | P O W E R | A N D | D A N G E R O U S N E S S | A R E | A S S U M E D | T O | R E S I D E | I N | T H E | E V I L | A | C E R T A I N | D R E A D F U L N E S S | S U B T L E T Y | A N D | S T R E N G T H | W H I C H | D O | N O T | A D M I T | O F | B E I N G | D E S P I S E D | +A N D | W H O E V E R | T H O U | A R T | W H A T | I S | I T | T H A T | N O W | P L E A S E S | T H E E | +T H E | G R E A T E R | T H E | D A N G E R | T H E | G R E A T E R | I S | T H E | N E E D | O F | A G R E E I N G | Q U I C K L Y | A N D | R E A D I L Y | A B O U T | W H A T | I S | N E C E S S A R Y | N O T | T O | M I S U N D E R S T A N D | O N E | A N O T H E R | I N | D A N G E R | T H A T | I S | W H A T | C A N N O T | A T | A L L | B E | D I S P E N S E D | W I T H | I N | I N T E R C O U R S E | +I | D O | N O T | K N O W | H E | S A I D | H E S I T A T I N G L Y | P E R H A P S | T H E | H A R P I E S | H A V E | F L O W N | O V E R | M Y | T A B L E | +I N | O U R | V E R Y | D E M O C R A T I C | O R | R A T H E R | V E R Y | P L E B E I A N | A G E | E D U C A T I O N | A N D | C U L T U R E | M U S T | B E | E S S E N T I A L L Y | T H E | A R T | O F | D E C E I V I N G | D E C E I V I N G | W I T H | R E G A R D | T O | O R I G I N | W I T H | R E G A R D | T O | T H E | I N H E R I T E D | P L E B E I A N I S M | I N | B O D Y | A N D | S O U L | +O R | H E | W I L L | E V E N | S A Y | F O R | M A N Y | R E A S O N S | I | C A N | D E L I G H T | I N | T H E | G O O D | O P I N I O N | O F | O T H E R S | P E R H A P S | B E C A U S E | I | L O V E | A N D | H O N O U R | T H E M | A N D | R E J O I C E | I N | A L L | T H E I R | J O Y S | P E R H A P S | A L S O | B E C A U S E | T H E I R | G O O D | O P I N I O N | E N D O R S E S | A N D | S T R E N G T H E N S | M Y | B E L I E F | I N | M Y | O W N | G O O D | O P I N I O N | P E R H A P S | B E C A U S E | T H E | G O O D | O P I N I O N | O F | O T H E R S | E V E N | I N | C A S E S | W H E R E | I | D O | N O T | S H A R E | I T | I S | U S E F U L | T O | M E | O R | G I V E S | P R O M I S E | O F | U S E F U L N E S S | A L L | T H I S | H O W E V E R | I S | N O T | V A N I T Y | +A | M A N ' S | E S T I M A T E S | O F | V A L U E | B E T R A Y | S O M E T H I N G | O F | T H E | S T R U C T U R E | O F | H I S | S O U L | A N D | W H E R E I N | I T | S E E S | I T S | C O N D I T I O N S | O F | L I F E | I T S | I N T R I N S I C | N E E D S | +O N L Y | N A M E | I T | W H A T E V E R | I | H A V E | I | O F F E R | T H E E | +A L S O | I N | A L L | L O V E S | A N D | F R I E N D S H I P S | O N E | H A S | T H E | E X P E R I E N C E | T H A T | N O T H I N G | O F | T H E | K I N D | C O N T I N U E S | W H E N | T H E | D I S C O V E R Y | H A S | B E E N | M A D E | T H A T | I N | U S I N G | T H E | S A M E | W O R D S | O N E | O F | T H E | T W O | P A R T I E S | H A S | F E E L I N G S | T H O U G H T S | I N T U I T I O N S | W I S H E S | O R | F E A R S | D I F F E R E N T | F R O M | T H O S E | O F | T H E | O T H E R | +T O | S U F F O C A T E | W I T H | H I S | M E M O R I E S | T O | H I M | W H O | H A S | T H E | D E S I R E S | O F | A | L O F T Y | A N D | D A I N T Y | S O U L | A N D | O N L Y | S E L D O M | F I N D S | H I S | T A B L E | L A I D | A N D | H I S | F O O D | P R E P A R E D | T H E | D A N G E R | W I L L | A L W A Y S | B E | G R E A T | N O W A D A Y S | H O W E V E R | I T | I S | E X T R A O R D I N A R I L Y | S O | +T H E | N O B L E | S O U L | A C C E P T S | T H E | F A C T | O F | H I S | E G O I S M | W I T H O U T | Q U E S T I O N | A N D | A L S O | W I T H O U T | C O N S C I O U S N E S S | O F | H A R S H N E S S | C O N S T R A I N T | O R | A R B I T R A R I N E S S | T H E R E I N | B U T | R A T H E R | A S | S O M E T H I N G | T H A T | M A Y | H A V E | I T S | B A S I S | I N | T H E | P R I M A R Y | L A W | O F | T H I N G S | I F | H E | S O U G H T | A | D E S I G N A T I O N | F O R | I T | H E | W O U L D | S A Y | I T | I S | J U S T I C E | I T S E L F | +B U T | Y O U | M I S U N D E R S T A N D | H I M | W H E N | Y O U | C O M P L A I N | A B O U T | I T | +A T | T H I S | T U R N I N G | P O I N T | O F | H I S T O R Y | T H E R E | M A N I F E S T | T H E M S E L V E S | S I D E | B Y | S I D E | A N D | O F T E N | M I X E D | A N D | E N T A N G L E D | T O G E T H E R | A | M A G N I F I C E N T | M A N I F O L D | V I R G I N | F O R E S T | L I K E | U P | G R O W T H | A N D | U P | S T R I V I N G | A | K I N D | O F | T R O P I C A L | T E M P O | I N | T H E | R I V A L R Y | O F | G R O W T H | A N D | A N | E X T R A O R D I N A R Y | D E C A Y | A N D | S E L F | D E S T R U C T I O N | O W I N G | T O | T H E | S A V A G E L Y | O P P O S I N G | A N D | S E E M I N G L Y | E X P L O D I N G | E G O I S M S | W H I C H | S T R I V E | W I T H | O N E | A N O T H E R | F O R | S U N | A N D | L I G H T | A N D | C A N | N O | L O N G E R | A S S I G N | A N Y | L I M I T | R E S T R A I N T | O R | F O R B E A R A N C E | F O R | T H E M S E L V E S | B Y | M E A N S | O F | T H E | H I T H E R T O | E X I S T I N G | M O R A L I T Y | +P R O B A B L Y | B U T | F O R T U N A T E L Y | N O T H I N G | F O R | M Y | O W N | T E E T H | P E R H A P S | I T | B E T R A Y S | T H E | S P E C I E S | T O | W H I C H | I | B E L O N G | B U T | N O T | T O | M Y S E L F | A S | I S | S U F F I C I E N T L Y | A G R E E A B L E | T O | M E | B U T | W H A T | H A S | H A P P E N E D | T O | Y O U | +T H E R E | M U S T | B E | A | S O R T | O F | R E P U G N A N C E | I N | M E | T O | B E L I E V E | A N Y T H I N G | D E F I N I T E | A B O U T | M Y S E L F | I S | T H E R E | P E R H A P S | S O M E | E N I G M A | T H E R E I N | +T H E | M O S T | V A R I E D | E X P E R I E N C E | T E A C H E S | I T | W H A T | A R E | T H E | Q U A L I T I E S | T O | W H I C H | I T | P R I N C I P A L L Y | O W E S | T H E | F A C T | T H A T | I T | S T I L L | E X I S T S | I N | S P I T E | O F | A L L | G O D S | A N D | M E N | A N D | H A S | H I T H E R T O | B E E N | V I C T O R I O U S | T H E S E | Q U A L I T I E S | I T | C A L L S | V I R T U E S | A N D | T H E S E | V I R T U E S | A L O N E | I T | D E V E L O P S | T O | M A T U R I T Y | +B O A T S | P U T | O U T | B O T H | F R O M | T H E | F O R T | A N D | T H E | S H O R E | +B E A U R E G A R D | A T | O N C E | W R O T E | A N | O R D E R | +C H A P T E R | S E V E N | T H E | H O M E C O M I N G | +I F | Y O U ' V E | G O T | P I S T O L S | J U S T | Y O U | T H I N K | O N C E | B E F O R E | Y O U | S H O O T | S A I D | C O L L I N S | +A N | E X T R A O R D I N A R Y | W A V E | O F | E M O T I O N | S W E P T | O V E R | T H E | S O U T H | C A R R Y I N G | E V E R Y B O D Y | W I T H | I T | +H E | I N T E N D E D | T O | L E A V E | E A R L Y | I N | T H E | M O R N I N G | B U T | F I R S T | H E | S O U G H T | H I S | F R I E N D S | A N D | T O L D | T H E M | G O O D | B Y E | +B I L L | S K E L L Y | A N | H I S | G A N G | T H E M | M O U N T A I N E E R S | A R E | U P | +T H A T | W H I T E | F L A G | A N D | T H O S E | B O A T S | G O I N G | O U T | M E A N | T H A T | S U M T E R | I S | O U R S | +W H E T H E R | T H E I R | M A N N E R | W A S | G R A V E | O R | F R I V O L O U S | H E | K N E W | T H A T | T H E S E | W E R E | G O O D | F R I E N D S | O F | H I S | A N D | H E | S I N C E R E L Y | H O P E D | T H A T | H E | W O U L D | M E E T | T H E M | A G A I N | +B U T | T H E | N E G O T I A T I O N S | W E R E | S O O N | C O M P L E T E D | +H E | W A S | G O I N G | H O M E | A F T E R | V I C T O R Y | +H E | F E L T | T H E | D I F F E R E N C E | A S | S O O N | A S | H E | R E A C H E D | T H E | H I L L S | O F | H I S | N A T I V E | S T A T E | +H E | S O O N | L E F T | C H A R L E S T O N | O U T | O F | S I G H T | +T H E R E | W E R E | N E V E R | B E F O R E | S U C H | T I M E S | I N | O L D | K E N T U C K Y | +E U R O P E | W H I C H | M U S T | H A V E | I T S | C O T T O N | W O U L D | F A V O R | T H E | S U C C E S S | O F | T H E | S O U T H | +P E O P L E | W E R E | C O O L E R | H E R E | A N D | T H E Y | W E R E | M O R E | P R O N E | T O | L O O K | A T | T H E | T W O | S I D E S | O F | A | Q U E S T I O N | +T H E | G R E A T | S T A T E | O F | V I R G I N I A | M O T H E R | O F | P R E S I D E N T S | W E N T | O U T | O F | T H E | U N I O N | A T | L A S T | A N D | N O R T H | C A R O L I N A | T E N N E S S E E | A N D | A R K A N S A S | F O L L O W E D | H E R | B U T | M A R Y L A N D | K E N T U C K Y | A N D | M I S S O U R I | S T I L L | H U N G | I N | T H E | B A L A N C E | +T H E | A I R | T O O | W A S | U N L I K E | T H A T | O F | S O U T H | C A R O L I N A | T H E R E | W A S | A | S H A R P E R | T A N G | T O | I T | +H A R R Y | F E E L I N G | P R I D E | B U T | N O T | S H O W I N G | I T | S A L U T E D | A N D | L E F T | T H E | R O O M | G O I N G | A T | O N C E | T O | M A D A M E | D E L A U N A Y ' S | W H E R E | H E | H A D | L E F T | H I S | B A G G A G E | +H E | D I D | N O T | S A Y | T H E | L A S T | A S | A | B O A S T | B U T | M E R E L Y | A S | A N | A S S U R A N C E | T O | T H E | L I V E R Y M A N | W H O | H E | S A W | W A S | A N X I O U S | O N | H I S | A C C O U N T | +T H E R E | W A S | N O T | A | S I N G L E | N O T E | O F | G L O O M | +B U T | H E | L O O K E D | B A C K | A T | C H A R L E S T O N | T H E | G A Y | T H E | V O L A T I L E | A N D | T H E | B E A U T I F U L | W I T H | R E A L | A F F E C T I O N | +T H E | S M O K E | I T S E L F | W H I C H | H A D | F O R M E D | A | V A S T | C L O U D | O V E R | H A R B O R | F O R T S | A N D | C I T Y | W A S | N O W | D R I F T I N G | O U T | T O | S E A | L E A V I N G | A L L | T H I N G S | E T C H E D | S H A R P L Y | I N | T H E | D A Z Z L I N G | S U N L I G H T | O F | A | S O U T H E R N | S P R I N G | D A Y | +H A R R Y | T H A N K E D | H I M | T H R E W | H I S | S A D D L E | B A G S | A C R O S S | T H E | H O R S E | A | P O W E R F U L | B A Y | A N D | G I V I N G | A | F I N A L | W A V E | O F | H I S | H A N D | T O | T H E | S Y M P A T H E T I C | L I V E R Y M A N | R O D E | A W A Y | +H E | G A Z E D | U P O N | A | W O R L D | F U L L | O F | R E S P O N S I B I L I T I E S | A N D | P E R I L S | +I T | W A S | A F T E R N O O N | W H E N | H E | R E A C H E D | T H E | L I T T L E | S T A T I O N | O F | W I N T O N | A N D | L E F T | T H E | T R A I N | A | T A L L | S T U R D Y | B O Y | T H E | S U P E R I O R | O F | M A N Y | A | M A N | I N | S I Z E | S T R E N G T H | A N D | A G I L I T Y | +H E | H A D | S E E N | G R E A T | T H I N G S | A N D | H E | H A D | D O N E | H I S | S H A R E | O F | T H E M | +I T | W A S | A | D I F F E R E N T | H A R R Y | W H O | S T A R T E D | H O M E | L A T E | I N | A P R I L | +L I N C O L N | H A D | C A L L E D | F O R | V O L U N T E E R S | T O | P U T | D O W N | A | R E B E L L I O N | B U T | H A R R Y | H E A R D | E V E R Y W H E R E | I N | C H A R L E S T O N | T H A T | T H E | C O N F E D E R A C Y | W A S | N O W | S E C U R E | +I T | W A S | A L M O S T | B U R I E D | N O W | I N | F L O W E R S | A N D | F O L I A G E | +C O L O N E L | K E N T O N | W R I T E S | W I S E L Y | +T H E | P R O G R E S S | O F | P R E S I D E N T | D A V I S | T O | T H E | N E W | C A P I T A L | S E T | I N | T H E | V E R Y | F A C E | O F | T H E | F O E | W A S | T O | B E | O N E | H U G E | T R I U M P H | O F | F A I T H | A N D | L O Y A L T Y | +B U T | H E | S A W | N O T H I N G | T H A T | M O V E D | T H E R E | N O | S I G N A L | L I G H T S | T W I N K L E D | +I T | W H I P P E D | H I S | B L O O D | A S | I T | B L E W | D O W N | F R O M | T H E | S L O P E S | A N D | C R E S T S | +W E | N E E D | K E N T U C K Y | A N D | I | U N D E R S T A N D | T H A T | A | V E R Y | L I T T L E | M O R E | M A Y | B R I N G | T H E | S T A T E | T O | U S | G O | W I T H | Y O U R | F A T H E R | I | U N D E R S T A N D | T H A T | Y O U | H A V E | B E E N | A | B R A V E | Y O U N G | S O L D I E R | H E R E | A N D | M A Y | Y O U | D O | A S | W E L L | U P | T H E R E | +F O U R | M O N T H S | H A D | M A D E | G R E A T | C H A N G E S | H E | B O R E | H I M S E L F | M O R E | L I K E | A | M A N | H I S | M A N N E R | W A S | M U C H | M O R E | C O N S I D E R E D | A N D | G R A V E | +H A R R Y | G A V E | H I S | F A R E W E L L S | W I T H | D E E P | A N D | G E N U I N E | R E G R E T | +T H I S | W A S | N O T | T H E | F A S H I O N | O F | A | Y E A R | A G O | W H E N | T H E Y | E X C H A N G E D | A | F R I E N D L Y | W O R D | O R | T W O | B U T | H A R R Y | K N E W | I T S | C A U S E | N O W | N O B O D Y | C O U L D | T R U S T | A N Y B O D Y | E L S E | +B U T | T H E | E M O T I O N S | O F | H A R R Y | A N D | H I S | C O M R A D E S | W E R E | F O R | T H E | M O M E N T | T H O S E | O F | V I C T O R Y | O N L Y | +C O L O N E L | L E O N I D A S | T A L B O T | R E G A R D E D | T H E | W H I T E | F L A G | W I T H | F E E L I N G S | I N | W H I C H | T R I U M P H | A N D | S A D N E S S | W E R E | M I N G L E D | S T R A N G E L Y | +A L L | T H E | A M E N I T I E S | W E R E | P R E S E R V E D | B E T W E E N | T H E | C A P T U R E D | G A R R I S O N | A N D | T H E I R | C A P T O R S | +H I S | T R E A S U R E | T A K E N | T Y P E | O F | H I S | S E L F | A N D | A | W O M A N | G I V E N | H I M | I N S T E A D | +L E T | B U T | A | M O O D | B E | S T R O N G | E N O U G H | A N D | T H E | S O U L | C L O T H I N G | I T S E L F | I N | T H A T | M O O D | A S | W I T H | A | G A R M E N T | C A N | W A L K | A B R O A D | A N D | H A U N T | T H E | W O R L D | +T H A T | E N C H A N T M E N T | H A D | P O S S E S S E D | H I M | U S U R P I N G | A S | I T | W E R E | T H E | T H R O N E | O F | H I S | L I F E | A N D | D I S P L A C I N G | I T | W H E N | I T | C E A S E D | H E | W A S | N O T | H I S | O W N | M A S T E R | +H E | S T A R T E D | T O | C O N S C I O U S | C O N F U S I O N | O N L Y | N E I T H E R | K N O W I N G | W H E R E | H E | W A S | N O R | W H A T | H E | D I D | +H O W | I T | H A P P E N E D | H E | N E V E R | C O U L D | T E L L | B U T | H E | B R O U G H T | D O W N | H I S | V I O L I N | W I T H | A | C R A S H | A G A I N S T | T H E | P I A N O | T H E N | S O M E H O W | S T U M B L E D | A N D | A L L | B U T | F E L L | +B U T | I N | H I S | H A N D S | S O L I T U D E | A N D | A | V I O L I N | W E R E | S U R E | T O | M A R R Y | I N | M U S I C | +W A S | T H E R E | E V E R | A | H A P P I E R | M A N | T H A N | J O S E P H | T H A T | N I G H T | A S | H E | S T R O D E | A L O N G | T H E | F O O T P A T H | +I T | C R I E D | A L O U D | T H A T | E T E R N I T Y | W A S | V E R Y | L O N G | A N D | L I K E | A | G R E A T | P A L A C E | W I T H O U T | A | Q U I E T | R O O M | +T H E Y | S A T | D O W N | A N D | L I S T E N E D | I N | S I L E N C E | +I N | T H E | A C T | O F | R E C O V E R I N G | H I M S E L F | H E | H E A R D | T H E | N E C K | O F | H I S | I N S T R U M E N T | P A R T | F R O M | T H E | B O D Y | W I T H | A | T E A R I N G | D I S C O R D A N T | C R Y | L I K E | T H E | S O U N D | O F | T H E | R U I N | O F | A | L I V I N G | W O R L D | +H A S T | T H O U | Y E T | T O | L E A R N | T H A T | T H E | L O V E | O F | T H E | H U M A N | I S | L O V E | I S | D I V I N E | I S | B U T | A | L O W E R | F O R M | O F | A | P A R T | O F | T H E | L O V E | O F | G O D | +H E | P R E S S E D | H I S | V I O L I N | C A S E | T O | H I S | H E A R T | A S | I F | I T | W E R E | A | L I V I N G | T H I N G | T H A T | C O U L D | K N O W | T H A T | H E | L O V E D | I T | +H E R | H E A R T | S E E M E D | T O | S W E L L | U P | I N T O | H E R | T H R O A T | A N D | I T | W A S | A L L | S H E | C O U L D | D O | T O | K E E P | F R O M | W E E P I N G | +A | S O B | L I K E | A | B I R D | N E W | B O R N | B U R S T | F R O M | M A R Y ' S | B O S O M | +H E | T H A T | L O V E T H | N O T | H I S | B R O T H E R | W H O M | H E | H A T H | S E E N | H O W | S H A L L | H E | L O V E | G O D | W H O M | H E | H A T H | N O T | S E E N | +T H E | M U S I C | W A S | B R O K E N | A N D | J O S E P H | L E F T | A L O N E | W I T H | T H E | D U M B | I N S T R U M E N T S | +W H E N | H E | R E A C H E D | T H E | S U B U R B S | T H E | L I G H T | O F | H O M E S | W A S | S H I N I N G | T H R O U G H | C U R T A I N S | O F | A L L | C O L O R S | +I T ' S | J U S T | L I K E | H I M | H E | M U R M U R E D | +H E | W A S | I N | A | M O O D | F O R | M U S I C | W A S | H E | N O T | +I | L O V E | T H E E | I | L O V E | T H E E | C R I E D | T H E | V I O L I N | A N D | T H E | W O R S H I P | W A S | E N T R E A T Y | T H A T | K N E W | N O T | I T S E L F | +L E T T Y | F I N D I N G | H E R S E L F | N O T | Q U I T E | E Q U A L | T O | T H E | E M E R G E N C Y | C A M E | I N | H E R | T U R N | T O | C A L L | M A R Y | S H E | W E N T | A S | Q U I E T L Y | A S | I F | S H E | W E R E | L E A V I N G | A | T I R E S O M E | V I S I T O R | +B L E S S E D | A M | I | H E R E | N O W | M Y | G O D | A N D | B L E S S E D | S H A L L | I | B E | T H E R E | T H E N | +J U S T | T H E N | H E | W A S | I N | N O | M O O D | T O | T H I N K | O F | T H E | S O R R O W S | +A | L I T T L E | L O N G E R | A N D | S H E | W A S | C O M P E L L E D | T O | Y I E L D | A N D | T H E | S I L E N T | T E A R S | F L O W E D | F R E E L Y | +I T | W A S | T H E | A F T E R N O O N | O F | A | H O L I D A Y | A N D | S H E | H A D | C L O S E D | E A R L Y | +H E | L A I D | D O W N | H I S | V I O L I N | A N D | S E A T E D | H I M S E L F | W H E R E | M A R Y | T O L D | H I M | I N | H E R | F A T H E R ' S | A R M | C H A I R | B Y | T H E | F I R E | +H I S | V I O L I N | W A S | B R O K E N | B U T | H I S | B E I N G | W A S | M A D E | W H O L E | +E A R T H | W A S | G O N E | A N D | H E A V E N | W A S | A L L | +O N E | W I N T E R | E V E N I N G | A S | S O O N | A S | H I S | W O R K | W A S | O V E R | F O R | T H E | D A Y | J O S E P H | L O C K E D | T H E | D O O R | O F | H I S | S M I T H Y | W A S H E D | H I M S E L F | W E L L | P U T | O N | C L E A N | C L O T H E S | A N D | T A K I N G | H I S | V I O L I N | S E T | O U T | F O R | T E S T B R I D G E | M A R Y | W A S | E X P E C T I N G | H I M | T O | T E A | +W H E N | T H O U | L O V E S T | M A N | O R | W O M A N | O R | C H I L D | Y E A | O R | E V E N | D O G | A R I G H T | T H E N | W I L T | T H O U | N O | L O N G E R | N E E D | T H A T | I | T E L L | T H E E | H O W | G O D | A N D | H I S | C H R I S T | W O U L D | N O T | B E | C O N T E N T | W I T H | E A C H | O T H E R | A L O N E | I N | T H E | G L O R I E S | E V E N | O F | T H E | E T E R N A L | O R I G I N A L | L O V E | B E C A U S E | T H E Y | C O U L D | C R E A T E | M O R E | L O V E | +N O R | W A S | T H I S | E X A C T L Y | T H E | S H A P E | T H E | T H I N G | T O O K | T O | T H E | C O N S C I O U S N E S S | O F | T H E | M U S I C I A N | +L E T T Y | T O O | W A S | O V E R C O M E | M O R E | T H A N | E V E R | S H E | H A D | B E E N | B Y | M U S I C | +T H E | N E T T L E | A N D | T H E | D O C K | S A I D | J O S E P H | +B U T | M Y | U N C L E | W A S | I N | N O | H U M O R | T O | W A I T | +A C C U S T O M E D | A S | I | H A D | B E E N | T O | T H E | S T E A M | F E R R Y | B O A T S | O F | T H E | E L B E | I | F O U N D | T H E | L O N G | O A R S | O F | T H E | B O A T M E N | B U T | S O R R Y | M E A N S | O F | L O C O M O T I O N | +I | C O U L D | N O T | H E L P | S M I L I N G | T O | S E E | H I M | L O O K | S O | B I G | O N | H I S | L I T T L E | H O R S E | H I S | L O N G | L E G S | N O W | A N D | T H E N | T O U C H I N G | T H E | G R O U N D | M A D E | H I M | L O O K | L I K E | A | S I X | F O O T E D | C E N T A U R | +L I T T L E | D I D | I | E X P E C T | H O W E V E R | T H E | S P E C T A C L E | W H I C H | A W A I T E D | U S | W H E N | W E | R E A C H E D | T H E | P E N I N S U L A | O F | S N E F F E L S | W H E R E | A G G L O M E R A T I O N S | O F | N A T U R E ' S | R U I N S | F O R M | A | K I N D | O F | T E R R I B L E | C H A O S | +H A N S | O U R | E X T R A O R D I N A R Y | G U I D E | W E N T | F I R S T | W A L K I N G | W I T H | A | S T E A D Y | R A P I D | U N V A R Y I N G | S T E P | +G E O G R A P H E R S | H A V E | D I V I D E D | I T | I N T O | F O U R | P A R T S | A N D | W E | H A D | T O | C R O S S | T H E | S O U T H W E S T | Q U A R T E R | W H I C H | I N | T H E | V E R N A C U L A R | I S | C A L L E D | S U D V E S T R | F J O R D U N G R | +I T | C O N S I S T S | S I M P L Y | O F | A | F E W | H O U S E S | N O T | W H A T | I N | E N G L A N D | O R | G E R M A N Y | W E | S H O U L D | C A L L | A | H A M L E T | +O U R | T W O | H O R S E S | W I T H | T H E | L U G G A G E | F O L L O W E D | O F | T H E I R | O W N | A C C O R D | W I T H O U T | R E Q U I R I N G | W H I P | O R | S P U R | +H E | S A Y S | T I D E | R E P L I E D | M Y | U N C L E | T R A N S L A T I N G | T H E | D A N I S H | W O R D | F O R | M Y | I N F O R M A T I O N | +T H E S E | S A C R E D | E D I F I C E S | A R E | H O W E V E R | V E R Y | M U C H | L I K E | T H E S E | P E O P L E | W H O | D O | W I T H O U T | W A T C H E S | A N D | N E V E R | M I S S | T H E M | +W E | M A Y | D O | S O | W A S | M Y | R E P L Y | B U T | W H A T | A B O U T | O U R | W O R T H Y | G U I D E | +T H E Y | V E R Y | R A R E L Y | S U C C E E D | I N | A | G O O D | S H O W | O F | Y E L L O W | +S N O W | T E M P E S T | I M P R A C T I C A B L E | R O A D S | R O C K S | I C E B E R G S | N O T H I N G | S T O P S | H I M | +A T | L E N G T H | T H E | S T U R D Y | L I T T L E | P O N Y | S P R E A D I N G | O U T | H I S | L E G S | I N | A | S T I F F | A N D | L U D I C R O U S | A T T I T U D E | G O T | F R O M | U N D E R | T H E | P R O F E S S O R ' S | L E G S | A N D | L E F T | H I M | S T A N D I N G | W I T H | B O T H | F E E T | O N | A | S E P A R A T E | S T O N E | L I K E | T H E | C O L O S S U S | O F | R H O D E S | +M Y | A R M S | A R E | R I G H T | B U T | M Y | L E G S | A R E | G E T T I N G | A | L I T T L E | S T I F F | +W E | T O O K | O U R | W A Y | T H R O U G H | P O O R | A N D | S P A R S E | M E A D O W S | W H I C H | M A D E | A | D E S P E R A T E | E F F O R T | E V E R Y | Y E A R | T O | S H O W | A | L I T T L E | G R E E N | +A | F E W | S T R A Y | C O W S | A N D | S H E E P | W E R E | O N L Y | S E E N | O C C A S I O N A L L Y | +I | S H O U L D | H A V E | A | V I O L E N T | A T T A C K | O F | T H E | C R A M P | I F | I | W E R E | N O T | T O | H A V E | S O M E | S O R T | O F | E X E R C I S E | +I | T H O R O U G H L Y | U N D E R S T O O D | A N D | A P P R E C I A T E D | T H E | N E C E S S I T Y | F O R | W A I T I N G | B E F O R E | C R O S S I N G | T H E | F J O R D | F O R | T H A T | M O M E N T | W H E N | T H E | S E A | A T | I T S | H I G H E S T | P O I N T | I S | I N | A | S T A T E | O F | S L A C K | W A T E R | +T O | R I D E | O V E R | S A L T | W A T E R | U P O N | T H E | B A C K | O F | A | L I T T L E | H O R S E | S E E M E D | T O | M E | A B S U R D | +H E R E | A N D | T H E R E | C O U L D | B E | S E E N | A N | I S O L A T E D | F A R M | S O M E | S O L I T A R Y | B U R | O R | I C E L A N D I C | H O U S E | B U I L T | O F | W O O D | E A R T H | F R A G M E N T S | O F | L A V A | L O O K I N G | L I K E | B E G G A R S | O N | T H E | H I G H W A Y | O F | L I F E | +I | B E G A N | T O | E N J O Y | T H E | E X H I L A R A T I N G | D E L I G H T | O F | T R A V E L I N G | A | L I F E | O F | D E S I R E | G R A T I F I C A T I O N | A N D | L I B E R T Y | +I | T O O K | O C C A S I O N | T O | C O N S U L T | T H E | M A P | T O | S E E | W H E R E | G A R D A R | W A S | T O | B E | F O U N D | +I N | A N Y | C A S E | I | S H A L L | T R U S T | R A T H E R | T O | M Y | O W N | I N T E L L I G E N C E | T H A N | T H E I R S | +C U R I O U S L Y | E N O U G H | T H E | B L O O D | O F | W A B I | R A N | A L M O S T | P U R E | T O | H I S | I N D I A N | F O R E F A T H E R S | W H I L E | M I N N E T A K I | A S | S H E | B E C A M E | O L D E R | D E V E L O P E D | L E S S | O F | T H E | W I L D | B E A U T Y | O F | H E R | M O T H E R | A N D | M O R E | O F | T H E | S O F T E R | L O V E L I N E S S | O F | T H E | W H I T E | R A C E | H E R | W E A L T H | O F | S O F T | J E T | B L A C K | H A I R | A N D | H E R | G R E A T | D A R K | E Y E S | C O N T R A S T I N G | W I T H | T H E | L I G H T E R | S K I N | O F | H E R | F A T H E R ' S | B L O O D | +B U T | I N | T I M E | T H E | E N D | O F | I T | A L L | C A M E | A N D | W A B I | W E N T | B A C K | T O | T H E | P R I N C E S S | M O T H E R | T O | M I N N E T A K I | A N D | T O | H I S | F O R E S T S | +W H I L E | T H E | A T T A C K | W A S | S U C C E S S F U L | I N | A | W A Y | I T S | M A I N | P U R P O S E | F A I L E D | +A T | L A S T | S O | D A R I N G | D I D | H E | B E C O M E | T H A T | T H E | P R O V I N C I A L | G O V E R N M E N T | P L A C E D | A | P R I C E | U P O N | H I S | H E A D | A N D | U P O N | T H O S E | O F | A | N U M B E R | O F | H I S | M O S T | N O T O R I O U S | F O L L O W E R S | +O N E | O F | N E W S O M E ' S | C H I E F | P L E A S U R E S | I N | L I F E | H A D | B E E N | T H E | E D U C A T I N G | O F | H I S | W O O D L A N D | B R I D E | A N D | I T | W A S | T H E | A M B I T I O N | O F | B O T H | T H A T | T H E | L I T T L E | M I N N E T A K I | A N D | H E R | B R O T H E R | B E | R E A R E D | I N | T H E | W A Y S | O F | W H I T E | C H I L D R E N | +I T | W A S | A T | A B O U T | T H I S | T I M E | I N | T H E I R | L I V E S | T H A T | T H E | W O O N G A S | B E C A M E | E S P E C I A L L Y | D A R I N G | I N | T H E I R | D E P R E D A T I O N S | +W A B I | O N | T H E | O T H E R | H A N D | W A S | A N | I N D I A N | I N | A P P E A R A N C E | F R O M | H I S | M O C C A S I N S | T O | T H E | C R O W N | O F | H I S | H E A D | S W A R T H Y | S I N E W Y | A S | A G I L E | A S | A | L Y N X | A N D | W I T H | E V E R Y | I N S T I N C T | I N | H I M | C R Y I N G | F O R | T H E | L I F E | O F | T H E | W I L D | +M E A N W H I L E | T W O | C H I L D R E N | C A M E | T O | B L E S S | T H E | H A P P Y | U N I O N | O F | N E W S O M E | A N D | H I S | L O V E L Y | I N D I A N | W I F E | +T H R E E | D A Y S | L A T E R | M I N N E T A K I | B E C A M E | N E W S O M E ' S | W I F E | A T | T H E | H U D S O N | B A Y | P O S T | +B U T | E A C H | W E E K | A D D E D | T O | H I S | L O N E L I N E S S | A N D | H I S | L O N G I N G S | F O R | M I N N E T A K I | A N D | H I S | F O R E S T S | +T H E R E | W E R E | T E A R S | I N | T H E | B O Y S | E Y E S | W H E N | T H E Y | P A R T E D | A N D | T H E | M O T H E R | C R I E D | F O R | T H E | I N D I A N | B O Y | W H O | W A S | R E T U R N I N G | T O | H I S | P E O P L E | +T H E | O T H E R | W A S | A | G I R L | T H R E E | Y E A R S | Y O U N G E R | A N D | N E W S O M E | I N S I S T E D | T H A T | S H E | B E | C A L L E D | M I N N E T A K I | +O N E | D A R K | N I G H T | A T | T H E | H E A D | O F | A | S C O R E | O F | H I S | T R I B E | H E | F E L L | U P O N | W A B I G O O N ' S | C A M P | H I S | O B J E C T | B E I N G | T H E | A B D U C T I O N | O F | T H E | P R I N C E S S | +T H E R E | W A S | L I T T L E | T I M E | T O | L O S E | I N | M A K I N G | P R E P A R A T I O N S | A N D | T H E | F O U R T H | D A Y | F O L L O W I N G | T H E | R E C E I P T | O F | W A B I ' S | L E T T E R | F O U N D | R O D | A N D | H I S | M O T H E R | W A I T I N G | F O R | T H E | T R A I N | W H I C H | W A S | T O | W H I R L | T H E | B O Y | I N T O | H I S | N E W | L I F E | +T H E | C H I L D R E N | P R O V E D | T H E M S E L V E S | U N U S U A L L Y | B R I G H T | P U P I L S | A N D | B Y | T H E | T I M E | W A B I | W A S | S I X T E E N | A N D | M I N N E T A K I | T W E L V E | O N E | W O U L D | N O T | H A V E | K N O W N | F R O M | T H E I R | M A N N E R | O F | S P E E C H | T H A T | I N D I A N | B L O O D | R A N | I N | T H E I R | V E I N S | +A | C O U N T E R | A T T A C K | W A S | M A D E | U P O N | W O O N G A | A N D | H E | W A S | D R I V E N | D E E P | I N T O | T H E | W I L D E R N E S S | W I T H | G R E A T | L O S S | +F R O M | T H A T | H O U R | D A T E D | O N E | O F | T H E | M O S T | S A N G U I N A R Y | F E U D S | I N | T H E | H I S T O R Y | O F | T H E | G R E A T | T R A D I N G | C O M P A N Y | A | F E U D | W H I C H | A S | W E | S H A L L | S E E | W A S | D E S T I N E D | T O | L I V E | E V E N | U N T O | T H E | S E C O N D | G E N E R A T I O N | +B U T | T H I S | P O W E R | O F | D I S C E R N M E N T | W A S | D E N I E D | T H E M | A N D | O N L Y | I N | A F T E R | Y E A R S | W I T H | T H E | L O V E D | O N E S | O F | T H E I R | O W N | F I R E S I D E S | C L O S E | A B O U T | T H E M | W A S | T H E | W H O L E | P I C T U R E | R E V E A L E D | +A | T H O U S A N D | P L A N S | W E R E | M A D E | A | T H O U S A N D | A D V E N T U R E S | P I C T U R E D | A N D | T H E | M O T H E R | W O U L D | S M I L E | A N D | L A U G H | A N D | P L A N | W I T H | T H E M | +W E | S H A L L | M A K E | M O R E | M O N E Y | U P | H E R E | T H I S | W I N T E R | T H A N | Y O U | C O U L D | E A R N | I N | D E T R O I T | I N | T H R E E | Y E A R S | +O N | T H E | T E N T H | O F | O C T O B E R | H E | W O U L D | M E E T | R O D | A T | S P R U C E W O O D | O N | T H E | B L A C K | S T U R G E O N | R I V E R | +S P R I N G | C A M E | A N D | P A S S E D | A N D | T H E N | S U M M E R | +W E | W I L L | H U N T | W O L V E S | T H E | C O U N T R Y | I S | A L I V E | W I T H | T H E M | A N D | T H E | G O V E R N M E N T | G I V E S | A | B O U N T Y | O F | F I F T E E N | D O L L A R S | F O R | E V E R Y | S C A L P | T A K E N | +T H R E E | W E E K S | L A T E R | C A M E | W A B I G O O N ' S | R E P L Y | +C O N S E Q U E N T L Y | B O T H | M O T H E R | A N D | F A T H E R | B E G A N | T H E I R | E D U C A T I O N | A T | T H E | P O S T | T H E Y | W E R E | S E N T | T O | T H E | F A C T O R ' S | S C H O O L | A N D | T W O | W I N T E R S | W E R E | P A S S E D | I N | P O R T | A R T H U R | T H A T | T H E Y | M I G H T | H A V E | T H E | A D V A N T A G E | O F | T H O R O U G H L Y | E Q U I P P E D | S C H O O L S | +N E C E S S I T Y | H A D | B E C O M E | H I S | G R I M | M A S T E R | A N D | T H E | F O L L O W I N G | W E E K | H E | W A S | G O I N G | T O | W O R K | +O N | T H E | S E C O N D | O F | T H E | M O N T H | A T | T W O | I N | T H E | M O R N I N G | O U R | P R E C I O U S | C A R G O | O F | L U G G A G E | W A S | T A K E N | O N | B O A R D | T H E | G O O D | S H I P | V A L K Y R I E | +T H E | M E N | A P P E A R E D | R O B U S T | B U T | H E A V Y | F A I R | H A I R E D | L I K E | G E R M A N S | B U T | O F | P E N S I V E | M I E N | E X I L E S | O F | A | H I G H E R | S C A L E | I N | T H E | L A D D E R | O F | H U M A N I T Y | T H A N | T H E | E S K I M O S | B U T | I | T H O U G H T | M U C H | M O R E | U N H A P P Y | S I N C E | W I T H | S U P E R I O R | P E R C E P T I O N S | T H E Y | A R E | C O M P E L L E D | T O | L I V E | W I T H I N | T H E | L I M I T S | O F | T H E | P O L A R | C I R C L E | +T H E | P R O F E S S O R | K N E W | W H O M | H E | H A D | T O | D E A L | W I T H | +N E A R L Y | T H E | W H O L E | P O P U L A T I O N | O F | T H E | T O W N | W A S | O N | F O O T | T O | S E E | U S | L A N D | +V E R Y | L I K E L Y | I | M A Y | F I N D | T H E R E | S O M E | M A N U S C R I P T S | F R O M | T H E | H A N D | O F | S A K N U S S E M M | +I N | T H E | M E A N T I M E | T H E R E | I S | N O T | A N | H O U R | T O | L O S E | +H E | W A S | H O W E V E R | B U T | A | C I V I L | S E R V A N T | A | M A G I S T R A T E | T H E | G O V E R N O R | O F | T H E | I S L A N D | B A R O N | T R A M P E | +A T | A L L | E V E N T S | W E | S H A L L | G E T | T H E R E | S O M E | D A Y | +O N | T H E | E L E V E N T H | D A Y | W E | S I G H T E D | C A P E | P O R T L A N D | O V E R | W H I C H | T O W E R E D | M O U N T | M Y R D A L S | Y O K U L | W H I C H | T H E | W E A T H E R | B E I N G | C L E A R | W E | M A D E | O U T | V E R Y | R E A D I L Y | +T H E | F A C T | W A S | T H A T | S C A R C E L Y | A N Y | O N E | O F | T H E M | B U T | E X P E C T E D | S O M E | G O O D S | B Y | T H E | P E R I O D I C A L | V E S S E L | +T H O U G H | N O T | V E R Y | L A R G E | I T | A P P E A R E D | N O T | L I K E L Y | T O | B E | F I L L E D | F O R | C E N T U R I E S | +M Y | U N C L E | W A S | D E L I G H T E D | F O R | M Y S E L F | M O O D Y | A N D | D I S S A T I S F I E D | I | A P P E A R E D | A L M O S T | T O | E X P E C T | A | G L I M P S E | O F | T H E | G H O S T | O F | H A M L E T | +N O | M I S T E R | H A R D W I G G | S A I D | T H E | C A P T A I N | N O | F E A R | O F | T H A T | +T H E Y | W E R E | N O W | H O W E V E R | A B S E N T | O N | D U T Y | +I | S A W | B U T | F E W | I N H A B I T A N T S | D U R I N G | M Y | E X C U R S I O N | B U T | I | M E T | A | C R O W D | O N | T H E | B E A C H | D R Y I N G | S A L T I N G | A N D | L O A D I N G | C O D F I S H | T H E | P R I N C I P A L | A R T I C L E | O F | E X P O R T A T I O N | +W E L L | A N D | H A V E | W E | A | F A I R | W I N D | +O N | A L L | S I D E S | W E R E | T O | B E | S E E N | W H O L E | S C H O O L S | O F | W H A L E S | A N D | S H A R K S | +B U T | N O | G H O S T | O R | A N Y T H I N G | E L S E | A P P E A R E D | U P O N | T H E | A N C I E N T | W A L L S | +N O W | H A R R Y | S A I D | M Y | U N C L E | R U B B I N G | H I S | H A N D S | A N | G O E S | W E L L | T H E | W O R S E | D I F F I C U L T Y | I S | N O W | O V E R | +W H E N | T H E R E F O R E | H E | A D D R E S S E D | H I M S E L F | T O | M E | I N | T H E | L A N G U A G E | O F | H O R A C E | W E | A T | O N C E | C A M E | T O | U N D E R S T A N D | O N E | A N O T H E R | +T H A N K S | T O | T H E | H E A T | O F | T H E S E | R E S I D E N C E S | G R A S S | G R O W S | O N | T H E | R O O F | W H I C H | G R A S S | I S | C A R E F U L L Y | C U T | F O R | H A Y | +I | S H A L L | B E | G L A D | T O | C O N S U L T | T H E M | +T H E | V A L K Y R I E | K E P T | O F F | T H E | C O A S T | S T E E R I N G | T O | T H E | W E S T W A R D | +T H E N | W I T H O U T | F U R T H E R | R E M A R K | H E | P U T | H I S | F I N G E R | T O | H I S | L I P S | F R O W N E D | D A R K L Y | A N D | D E S C E N D E D | I N T O | T H E | S M A L L | B O A T | W H I C H | A W A I T E D | U S | +T H I S | M O D E S T | S C H O L A R | S P O K E | N O | L A N G U A G E S | S A V E | I C E L A N D I C | A N D | L A T I N | +T H E | F A C T | I S | T H E | C A S T L E | I S | M U C H | L A T E R | T H A N | T H E | T I M E | O F | T H E | H E R O I C | P R I N C E | O F | D E N M A R K | +N O T | B E | I T | E V E R | R E M E M B E R E D | T H A T | T H E | S L I G H T E S T | S U S P I C I O N | O F | I M M O R A L I T Y | A T T A C H E S | E I T H E R | T O | T H E | H E R O I N E | O F | T H I S | B O O K | O R | T O | T H E | L E A D I N G | P H I L O S O P H E R S | O F | H E R | S C H O O L | F O R | S E V E R A L | C E N T U R I E S | +T O | S Y N E S I U S ' S | M O S T | C H A R M I N G | L E T T E R S | A S | W E L L | A S | T O | T H O S E | O F | I S I D O R E | T H E | G O O D | A B B O T | O F | P E L U S I U M | I | B E G | L E A V E | T O | R E F E R | T H O S E | R E A D E R S | W H O | W I S H | F O R | F U R T H E R | I N F O R M A T I O N | A B O U T | T H E | P R I V A T E | L I F E | O F | T H E | F I F T H | C E N T U R Y | +T H A T | W O N D E R F U L | M E T A P H Y S I C | S U B T L E T Y | W H I C H | I N | P H R A S E S | A N D | D E F I N I T I O N S | T O O | O F T E N | U N M E A N I N G | T O | O U R | G R O S S E R | I N T E L L E C T | S A W | T H E | S Y M B O L S | O F | T H E | M O S T | I M P O R T A N T | S P I R I T U A L | R E A L I T I E S | A N D | F E L T | T H A T | O N | T H E | D I S T I N C T I O N | B E T W E E N | H O M O O U S I O S | A N D | H O M O I O U S I O S | M I G H T | H A N G | T H E | S O L U T I O N | O F | T H E | W H O L E | P R O B L E M | O F | H U M A N I T Y | W A S | S E T | T O | B A T T L E | I N | A L E X A N D R I A | T H E | A N C I E N T | S T R O N G H O L D | O F | G R E E K | P H I L O S O P H Y | W I T H | T H E | E F F E T E | R E M A I N S | O F | T H E | V E R Y | S C I E N T I F I C | T H O U G H T | T O | W H I C H | I T | O W E D | I T S | E X T R A O R D I N A R Y | C U L T U R E | +T H E | H U N S | S I N G L Y | T H E I R | I N F E R I O R S | P R E S S E D | T H E M | F R O M | B E H I N D | W I T H | T H E | I R R E S I S T I B L E | W E I G H T | O F | N U M B E R S | I T A L Y | W I T H | H E R | R I C H | C I T I E S | A N D | F E R T I L E | L O W L A N D S | B E C K O N E D | T H E M | O N | T O | P L U N D E R | A S | A U X I L I A R I E S | T H E Y | H A D | L E A R N E D | T H E I R | O W N | S T R E N G T H | A N D | R O M A N | W E A K N E S S | A | C A S U S | B E L L I | W A S | S O O N | F O U N D | +T H E | V E R Y | E M P E R O R S | H A D | A R R A Y E D | T H E M S E L V E S | O N | H E R | S I D E | +I | C A N N O T | H O P E | T H A T | T H E S E | P A G E S | W I L L | B E | A L T O G E T H E R | F R E E | F R O M | A N A C H R O N I S M S | A N D | E R R O R S | +H O W | I N I Q U I T O U S | W A S | T H E | C O N D U C T | O F | T H E | S O N S | O F | T H E O D O S I U S | I N | R E F U S I N G | T H E | U S U A L | B O U N T Y | B Y | W H I C H | T H E | G O T H S | W E R E | B R I B E D | N O T | T O | A T T A C K | T H E | E M P I R E | T H E | W H O L E | P E N T | U P | D E L U G E | B U R S T | O V E R | T H E | P L A I N S | O F | I T A L Y | A N D | T H E | W E S T E R N | E M P I R E | B E C A M E | F R O M | T H A T | D A Y | F O R T H | A | D Y I N G | I D I O T | W H I L E | T H E | N E W | I N V A D E R S | D I V I D E D | E U R O P E | A M O N G | T H E M S E L V E S | +T H E | C O U N T L E S S | T R E A S U R E S | W H I C H | F I V E | C E N T U R I E S | O F | R A P I N E | H A D | A C C U M U L A T E D | R O U N D | T H E | C A P I T O L | H A D | B E C O M E | T H E | P R E Y | O F | M E N | C L O T H E D | I N | S H E E P S K I N S | A N D | H O R S E | H I D E | A N D | T H E | S I S T E R | O F | A N | E M P E R O R | H A D | F O U N D | H E R | B E A U T Y | V I R T U E | A N D | P R I D E | O F | R A C E | W O R T H I L Y | M A T C H E D | B Y | T H O S E | O F | T H E | H A R D | H A N D E D | N O R T H E R N | H E R O | W H O | L E D | H E R | A W A Y | F R O M | I T A L Y | A S | H I S | C A P T I V E | A N D | H I S | B R I D E | T O | F O U N D | N E W | K I N G D O M S | I N | S O U T H | F R A N C E | A N D | S P A I N | A N D | T O | D R I V E | T H E | N E W L Y | A R R I V E D | V A N D A L S | A C R O S S | T H E | S T R A I T S | O F | G I B R A L T A R | I N T O | T H E | T H E N | B L O O M I N G | C O A S T | L A N D | O F | N O R T H E R N | A F R I C A | +O N E | W H O | W R I T E S | O F | S U C H | A N | E R A | L A B O U R S | U N D E R | A | T R O U B L E S O M E | D I S A D V A N T A G E | +I N | T H E | P R E S E N T | C A S E | T H A T | D I S A D V A N T A G E | I S | D O U B L E D | F O R | W H I L E | T H E | S I N S | O F | T H E | C H U R C H | H O W E V E R | H E I N O U S | W E R E | S T I L L | S U C H | A S | A D M I T | O F | B E I N G | E X P R E S S E D | I N | W O R D S | T H E | S I N S | O F | T H E | H E A T H E N | W O R L D | A G A I N S T | W H I C H | S H E | F O U G H T | W E R E | U T T E R L Y | I N D E S C R I B A B L E | A N D | T H E | C H R I S T I A N | A P O L O G I S T | I S | T H U S | C O M P E L L E D | F O R | T H E | S A K E | O F | D E C E N C Y | T O | S T A T E | T H E | C H U R C H ' S | C A S E | F A R | M O R E | W E A K L Y | T H A N | T H E | F A C T S | D E S E R V E | +A N D | T H E | N E W | B L O O D | A T | T H E | E R A | O F | T H I S | S T O R Y | W A S | A T | H A N D | +T H A T | E X T R A O R D I N A R Y | R E F O R M | I N | M O R A L S | W H I C H | A C C O R D I N G | T O | S A L V I A N | A N D | H I S | C O N T E M P O R A R I E S | T H E | V A N D A L | C O N Q U E R O R S | W O R K E D | I N | N O R T H | A F R I C A | A V A I L E D | T H E M | N O T H I N G | T H E Y | L O S T | M O R E | T H A N | T H E Y | G A V E | +B U T | I F | T H E | E M P E R O R S | H A D | B E C O M E | C H R I S T I A N | T H E | E M P I R E | H A D | N O T | +T R I B E | A F T E R | T R I B E | W A S | C R O W D I N G | D O W N | T O | T H E | A L P S | A N D | T R A M P L I N G | U P O N | E A C H | O T H E R | O N | T H E | F R O N T I E R S | O F | T H E | E M P I R E | +T H E | M E N S | S A N A | M U S T | H A V E | A | C O R P U S | S A N U M | T O | I N H A B I T | +I N | T H E | M E A N W H I L E | T H E | M I N D S | O F | M E N | C U T | A D R I F T | F R O M | T H E I R | A N C I E N T | M O O R I N G S | W A N D E R E D | W I L D L Y | O V E R | P A T H L E S S | S E A S | O F | S P E C U L A T I V E | D O U B T | A N D | E S P E C I A L L Y | I N | T H E | M O R E | M E T A P H Y S I C A L | A N D | C O N T E M P L A T I V E | E A S T | A T T E M P T E D | T O | S O L V E | F O R | T H E M S E L V E S | T H E | Q U E S T I O N S | O F | M A N ' S | R E L A T I O N | T O | T H E | U N S E E N | B Y | T H O S E | T H O U S A N D | S C H I S M S | H E R E S I E S | A N D | T H E O S O P H I E S | I T | I S | A | D I S G R A C E | T O | T H E | W O R D | P H I L O S O P H Y | T O | C A L L | T H E M | B Y | I T | O N | T H E | R E C O R D S | O F | W H I C H | T H E | S T U D E N T | N O W | G A Z E S | B E W I L D E R E D | U N A B L E | A L I K E | T O | C O U N T | O R | T O | E X P L A I N | T H E I R | F A N T A S I E S | +T H A T | D I V I N E | W O R D | W H O | I S | T H E | L I G H T | W H O | L I G H T E T H | E V E R Y | M A N | W H I C H | C O M E T H | I N T O | T H E | W O R L D | H A D | A W A K E N E D | I N | T H E | H E A R T | O F | M A N K I N D | A | M O R A L | C R A V I N G | N E V E R | B E F O R E | F E L T | I N | A N Y | S T R E N G T H | E X C E P T | B Y | A | F E W | I S O L A T E D | P H I L O S O P H E R S | O R | P R O P H E T S | +B U T | T H E | H E A L T H | O F | A | C H U R C H | D E P E N D S | N O T | M E R E L Y | O N | T H E | C R E E D | W H I C H | I T | P R O F E S S E S | N O T | E V E N | O N | T H E | W I S D O M | A N D | H O L I N E S S | O F | A | F E W | G R E A T | E C C L E S I A S T I C S | B U T | O N | T H E | F A I T H | A N D | V I R T U E | O F | I T S | I N D I V I D U A L | M E M B E R S | +J U L I A N ' S | L A S T | A T T E M P T | T O | R E S T O R E | P A G A N I S M | B Y | I M P E R I A L | I N F L U E N C E | H A D | O N L Y | P R O V E D | T H A T | T H E | O L D | F A I T H | H A D | L O S T | A L L | H O L D | U P O N | T H E | H E A R T S | O F | T H E | M A S S E S | A T | H I S | D E A T H | T H E | G R E A T | T I D E | W A V E | O F | N E W | O P I N I O N | R O L L E D | O N | U N C H E C K E D | A N D | T H E | R U L E R S | O F | E A R T H | W E R E | F A I N | T O | S W I M | W I T H | T H E | S T R E A M | T O | A C C E P T | I N | W O R D S | A T | L E A S T | T H E | C H U R C H ' S | L A W S | A S | T H E I R S | T O | A C K N O W L E D G E | A | K I N G | O F | K I N G S | T O | W H O M | E V E N | T H E Y | O W E D | H O M A G E | A N D | O B E D I E N C E | A N D | T O | C A L L | T H E I R | O W N | S L A V E S | T H E I R | P O O R E R | B R E T H R E N | A N D | O F T E N | T O O | T H E I R | S P I R I T U A L | S U P E R I O R S | +T H E Y | B R O U G H T | B E F O R E | T H E | M I N D S | O F | C H U R C H M E N | A | T H O U S A N D | N E W | Q U E S T I O N S | W H I C H | M U S T | B E | S O L V E D | U N L E S S | T H E | C H U R C H | W A S | T O | R E L I N Q U I S H | F O R | E V E R | H E R | C L A I M S | A S | T H E | G R E A T | T E A C H E R | A N D | S A T I S F I E R | O F | T H E | H U M A N | S O U L | +A Y | S H E | A N S W E R E D | H A L F | B I T T E R L Y | A N D | W O U L D | T H A T | W E | C O U L D | L I V E | W I T H O U T | F O O D | A N D | I M I T A T E | P E R F E C T L Y | T H E | I M M O R T A L | G O D S | +T H E R E | I S | F R U I T | W I T H | L E N T I L S | A N D | R I C E | W A I T I N G | F O R | Y O U | I N | T H E | N E X T | R O O M | A N D | B R E A D | U N L E S S | Y O U | D E S P I S E | I T | T O O | M U C H | +N O T | T H A T | S U C H | A | C R E A T U R E | A S | T H A T | D I S T U R B S | M E | N O | C R E A T E D | T H I N G | I | H O P E | C A N | M O V E | M Y | E Q U A N I M I T Y | B U T | I F | I | C O U L D | S T O O P | T O | H A T E | I | S H O U L D | H A T E | H E R | H A T E | H E R | +H I S | E X C E L L E N C Y | M A D A M | T H E | P R E F E C T | +A N D | W H Y | S H O U L D | T H A T | D I S T U R B | M E | L E T | H I M | E N T E R | +S H E | H A S | L I F T E D | H E R | E Y E S | O F F | H E R | M A N U S C R I P T | S H E | I S | L O O K I N G | O U T | W I T H | K I N D L I N G | C O U N T E N A N C E | O V E R | T H E | G A R D E N S | O F | T H E | M U S E U M | H E R | R I P E | C U R L I N G | G R E E K | L I P S | S U C H | A S | W E | N E V E R | S E E | N O W | E V E N | A M O N G | H E R | O W N | W I V E S | A N D | S I S T E R S | O P E N | +I F | T H E Y | H A V E | C A S T | O F F | T H E | V U L G A R | H E R D | T H E Y | H A V E | N O T | C A S T | O F F | H Y P A T I A | +W H A T | D O | I | C A R E | F O R | F O O D | +A N D | H E R | V O I C E | T O O K | A | T O N E | W H I C H | M A D E | I T | S O M E W H A T | U N C E R T A I N | W H E T H E R | I N | S P I T E | O F | A L L | T H E | L O F T Y | I M P A S S I B I L I T Y | W H I C H | S H E | F E L T | B O U N D | T O | P O S S E S S | S H E | D I D | N O T | H A T E | P E L A G I A | W I T H | A | M O S T | H U M A N | A N D | M U N D A N E | H A T R E D | +I F | T H E Y | H A V E | C E A S E D | T O | G U I D E | N A T I O N S | T H E Y | H A V E | N O T | C E A S E D | T O | S P E A K | T O | T H E I R | O W N | E L E C T | +S T R A N G E | T H A T | M E N | S H O U L D | B E | C O N T E N T | T O | G R O V E L | A N D | B E | M E N | W H E N | T H E Y | M I G H T | R I S E | T O | T H E | R A N K | O F | G O D S | +I | T O | B E L I E V E | A G A I N S T | T H E | A U T H O R I T Y | O F | P O R P H Y R Y | H I M S E L F | T O O | I N | E V I L | E Y E S | A N D | M A G I C | +T H E | P L A C E | S E E M E D | F R A G R A N T | W I T H | A L L | T H E | R I C H E S | O F | G R E E K | T H O U G H T | A N D | S O N G | S I N C E | T H E | D A Y S | W H E N | P T O L E M Y | P H I L A D E L P H U S | W A L K E D | T H E R E | W I T H | E U C L I D | A N D | T H E O C R I T U S | C A L L I M A C H U S | A N D | L Y C O P H R O N | +B U T | M O S T | P R O B A B L Y | H A D | A N Y | O F | U S | E N T E R E D | T H A T | R O O M | T H A T | M O R N I N G | W E | S H O U L D | N O T | H A V E | B E E N | A B L E | T O | S P A R E | A | L O O K | E I T H E R | F O R | T H E | F U R N I T U R E | O R | T H E | G E N E R A L | E F F E C T | O R | T H E | M U S E U M | G A R D E N S | O R | T H E | S P A R K L I N G | M E D I T E R R A N E A N | B E Y O N D | B U T | W E | S H O U L D | H A V E | A G R E E D | T H A T | T H E | R O O M | W A S | Q U I T E | R I C H | E N O U G H | F O R | H U M A N | E Y E S | F O R | T H E | S A K E | O F | O N E | T R E A S U R E | W H I C H | I T | P O S S E S S E D | A N D | B E S I D E | W H I C H | N O T H I N G | W A S | W O R T H | A | M O M E N T ' S | G L A N C E | +T H E | R O O M | H A D | N E I T H E R | C A R P E T | N O R | F I R E P L A C E | A N D | T H E | O N L Y | M O V A B L E S | I N | I T | W E R E | A | S O F A | B E D | A | T A B L E | A N D | A N | A R M | C H A I R | A L L | O F | S U C H | D E L I C A T E | A N D | G R A C E F U L | F O R M S | A S | M A Y | B E | S E E N | O N | A N C I E N T | V A S E S | O F | A | F A R | E A R L I E R | P E R I O D | T H A N | T H A T | W H E R E O F | W E | W R I T E | +T O | B E | W E L C O M E D | I N T O | T H E | C E L E S T I A L | R A N K S | O F | T H E | H E R O I C | T O | R I S E | T O | T H E | I M M O R T A L | G O D S | T O | T H E | I N E F F A B L E | P O W E R S | O N W A R D | U P W A R D | E V E R | T H R O U G H | A G E S | A N D | T H R O U G H | E T E R N I T I E S | T I L L | I | F I N D | M Y | H O M E | A T | L A S T | A N D | V A N I S H | I N | T H E | G L O R Y | O F | T H E | N A M E L E S S | A N D | T H E | A B S O L U T E | O N E | +H O W | C A N | H E | W H O S E | S P H E R E | L I E S | A B O V E | T H E | S T A R S | S T O O P | E V E R Y | M O M E N T | T O | E A R T H | +T H E | O P E R A T I O N | W H A T E V E R | I T | H A D | B E E N | W H I C H | H A D | D E P R I V E D | H I S | F E A T U R E S | O F | H A R M O N Y | A N D | P U T | A L L | T H E I R | F L E S H | I N T O | D I S O R D E R | H A D | H A D | N O | E F F E C T | O N | T H E | B O N Y | S T R U C T U R E | O F | H I S | H E A D | +B E S I D E S | W E | M U S T | R E M E M B E R | T H A T | T H E Y | H A D | I N | T H O S E | T I M E S | M E A N S | O F | P U T T I N G | P A T I E N T S | T O | S L E E P | A N D | O F | S U P P R E S S I N G | A L L | S U F F E R I N G | O N L Y | T H E N | I T | W A S | C A L L E D | M A G I C | W H I L E | N O W | I T | I S | C A L L E D | A N A E S T H E S I A | +H I S | H A I R | H A V I N G | P R O B A B L Y | B E E N | D Y E D | W I T H | S O M E | C O R R O S I V E | P R E P A R A T I O N | H A D | L E F T | I T | W O O L L Y | A N D | R O U G H | T O | T H E | T O U C H | +B E S I D E S | T H I S | F A C E | T H O S E | W H O | H A D | B R O U G H T | H I M | U P | H A D | G I V E N | H I M | T H E | R E S O U R C E S | O F | A | G Y M N A S T | A N D | A N | A T H L E T E | +G W Y N P L A I N E | H A D | Y E L L O W | H A I R | +T H E | J O Y O U S | C O N V U L S I O N | O F | L A U G H T E R | W A S | A S | A | T R I B U T E | P A I D | T H E Y | S U B M I T T E D | T O | I T | G L A D L Y | B U T | A L M O S T | M E C H A N I C A L L Y | +T H E | O U T S I D E | D I D | N O T | D E P E N D | O N | T H E | I N T E R I O R | +A L L | H I S | E M O T I O N S | W H A T E V E R | T H E Y | M I G H T | H A V E | B E E N | A U G M E N T E D | H I S | S T R A N G E | F A C E | O F | J O Y | O R | T O | S P E A K | M O R E | C O R R E C T L Y | A G G R A V A T E D | I T | +W I T H | T H I S | E X C E P T I O N | G W Y N P L A I N E ' S | L A U G H | W A S | E V E R L A S T I N G | +I T | S E E M E D | E V I D E N T | T H A T | A | M Y S T E R I O U S | A N D | P R O B A B L Y | O C C U L T | S C I E N C E | W H I C H | W A S | T O | S U R G E R Y | W H A T | A L C H E M Y | W A S | T O | C H E M I S T R Y | H A D | C H I S E L L E D | H I S | F L E S H | E V I D E N T L Y | A T | A | V E R Y | T E N D E R | A G E | A N D | M A N U F A C T U R E D | H I S | C O U N T E N A N C E | W I T H | P R E M E D I T A T I O N | +H A D | G W Y N P L A I N E | W H E N | A | C H I L D | B E E N | S O | W O R T H Y | O F | A T T E N T I O N | T H A T | H I S | F A C E | H A D | B E E N | S U B J E C T E D | T O | T R A N S M U T A T I O N | W H Y | N O T | +A C C O R D I N G | T O | A L L | A P P E A R A N C E | I N D U S T R I O U S | M A N I P U L A T O R S | O F | C H I L D R E N | H A D | W O R K E D | U P O N | H I S | F A C E | +G W Y N P L A I N E | W A S | A | M O U N T E B A N K | +B U T | I S | L A U G H T E R | A | S Y N O N Y M | O F | J O Y | +S U C H | P E R F E C T | C O M P L E T E N E S S | I S | N O T | I N | N A T U R E | +A N | E V E R L A S T I N G | L A U G H | +H E | S H O W E D | H I M S E L F | O N | T H E | P L A T F O R M | +T H E | W H O L E | O F | E X I S T E N C E | R E S E M B L E S | A | L E T T E R | M O D I F I E D | I N | T H E | P O S T S C R I P T | +T H E | M A N I C H A E A N S | B E L I E V E D | T H E | A B S O L U T E | O C C A S I O N A L L Y | G I V E S | W A Y | A N D | T H A T | G O D | H I M S E L F | S O M E T I M E S | A B D I C A T E S | F O R | A | T I M E | S O | A L S O | O F | T H E | W I L L | +N O | O N E | C O U L D | E S C A P E | F R O M | T H I S | R I C T U S | +I T | W A S | G W Y N P L A I N E ' S | L A U G H | W H I C H | C R E A T E D | T H E | L A U G H T E R | O F | O T H E R S | Y E T | H E | D I D | N O T | L A U G H | H I M S E L F | +I T S | Y E L L O W | B R I S T L E S | R A T H E R | A | M A N E | T H A N | A | H E A D | O F | H A I R | C O V E R E D | A N D | C O N C E A L E D | A | L O F T Y | B R O W | E V I D E N T L Y | M A D E | T O | C O N T A I N | T H O U G H T | +P H O E B E | C O O K E D | V E N U S | S C R U B B E D | T H E | T E M P L E | +W H A T | T R U E | T H I N G S | A R E | T O L D | I N | S T O R I E S | +U N K N O W N | P E O P L E | H A D | W O R K E D | U P O N | H I S | F A C E | H E | O N | T H E | O T H E R | H A N D | H A D | W O R K E D | O N | H I S | M I N D | A N D | B E H I N D | T H I S | W E L L | E X E C U T E D | M A S K | H E | H A D | P L A C E D | A L L | T H A T | H E | C O U L D | O F | T H O U G H T | +U R S U S | W A S | I N | E V E R Y T H I N G | I N | T H E | P I E C E | I N | T H E | C O M P A N Y | I N | T H E | K I T C H E N | I N | T H E | O R C H E S T R A | +T H E | C A R A V A N | W A S | D I V I D E D | I N T O | T H R E E | C O M P A R T M E N T S | P A R T I T I O N E D | F R O M | E A C H | O T H E R | +T H I S | W A S | T H E | O L D | E S T A B L I S H M E N T | O F | U R S U S | I T S | P R O P O R T I O N S | A U G M E N T E D | B Y | S U C C E S S | A N D | I M P R O V E D | F R O M | A | W R E T C H E D | B O O T H | I N T O | A | T H E A T R E | +T H I S | G R E E N | C O L O U R | H A D | S U C C E E D E D | I N | D R A W I N G | A T T E N T I O N | T O | T H E | C A R R I A G E | W H I C H | W A S | K N O W N | I N | A L L | T H E | F A I R | G R O U N D S | A S | T H E | G R E E N | B O X | +U R S U S | W A S | T H E | P O E T | O F | T H E S E | M A G I C A L | R E P R E S E N T A T I O N S | H E | W R O T E | T H E | P I E C E S | +T H I S | H U T | I N | A | C O R N E R | A T | T H E | B A C K | T O | T H E | R I G H T | O F | T H E | D O O R | S E R V E D | A S | B E D C H A M B E R | A N D | D R E S S I N G | R O O M | T O | U R S U S | A N D | G W Y N P L A I N E | +T H E | A S T O N I S H M E N T | W I T H | W H I C H | T H E | V I L L A G E R S | R E G A R D E D | T H I S | M A C H I N E | W A S | O V E R W H E L M I N G | +O N | T H E | R O O F | F R O M | A | T U B E | P A I N T E D | G R E E N | L I K E | T H E | R E S T | S M O K E | A R O S E | +I N | G W Y N P L A I N E | E V I L | T H O U G H T S | N E V E R | R I P E N E D | A N D | H E | H A D | T H E R E F O R E | N O | R E M O R S E | +T H E | C U R I O S I T Y | O F | O N E | P L A C E | E X H A U S T E D | T H E Y | P A S S E D | O N | T O | A N O T H E R | +S O M E | B E L I E V E D | I T | T O | B E | N A T U R A L | O T H E R S | D E C L A R E D | I T | T O | B E | A R T I F I C I A L | A N D | A S | C O N J E C T U R E | W A S | A D D E D | T O | R E A L I T Y | E V E R Y W H E R E | A T | E V E R Y | C R O S S | R O A D | O N | T H E | J O U R N E Y | I N | A L L | T H E | G R O U N D S | O F | F A I R S | A N D | F E T E S | T H E | C R O W D | R A N | A F T E R | G W Y N P L A I N E | +T H E N | I | L O O K | P E R H A P S | L I K E | W H A T | I | A M | +F O R | T H E S E | R E A D | F I B I | A N D | V I N O S | T H A T | W E | M A Y | C O N F O R M | T O | E N G L I S H | P R O N U N C I A T I O N | +F R O M | S I X T E E N | E I G H T Y | T O | S E V E N T E E N | O | F O U R | A | G R E A T | C H A N G E | H A D | T A K E N | P L A C E | +T H E | W H E E L S | W E R E | A L L | O F | T H E | S A M E | S I Z E | A N D | H I G H | A S | W A G O N | W H E E L S | +A | L O F T | U N D E R | T H E | A R C H | O F | T H E | R O O F | C O N T A I N E D | T H E | S C E N E S | A N D | O N | O P E N I N G | A | T R A P | D O O R | L A M P S | A P P E A R E D | P R O D U C I N G | W O N D E R S | O F | L I G H T | +T H I S | O P E N I N G | L O O K E D | F O R | A L L | T H E | W O R L D | L I K E | A | M O U T H | O F | H E L L | I N | T H E | W O R D S | O F | T H E | I T I N E R A N T | P U R I T A N | P R E A C H E R S | W H O | T U R N E D | A W A Y | F R O M | I T | W I T H | H O R R O R | +T H E | E F F E C T | O F | H I S | A P P E A R A N C E | H A D | B E E N | S U R P R I S I N G | +U R S U S | A N D | H O M O | T O O K | C H A R G E | O F | E A C H | O T H E R | +W H A T | W A S | T H I S | N O T H I N G | +T H I S | F O R T U N E | H A D | A L L O W E D | U R S U S | W H O | W A S | T H E | A D M I N I S T R A T O R | O F | G W Y N P L A I N E ' S | S U C C E S S | T O | H A V E | T H E | C H A R I O T | O F | H I S | D R E A M S | C O N S T R U C T E D | T H A T | I S | T O | S A Y | A | C A R A V A N | L A R G E | E N O U G H | T O | C A R R Y | A | T H E A T R E | A N D | T O | S O W | S C I E N C E | A N D | A R T | I N | T H E | H I G H W A Y S | +I T | W A S | E S T A B L I S H E D | A T | S O U T H W A R K | +B Y | T H E | S I D E | O F | T H E | D O O R | W A S | C O N S T R U C T E D | O F F | H A N D | B Y | M E A N S | O F | A N | E M P T Y | B A R R E L | A | B O X | F O R | T H E | M O N E Y | T A K E R | W H O | W A S | S O M E T I M E S | F I B I | A N D | S O M E T I M E S | V I N O S | +H E | D I D | N O T | C O M E | E V E R Y | E V E N I N G | B U T | W H E N | H E | C A M E | H E | L E D | T H E | P U B L I C | A P P L A U S E | G R E W | I N T O | A C C L A M A T I O N | S U C C E S S | R O S E | N O T | T O | T H E | R O O F | F O R | T H E R E | W A S | N O N E | B U T | T O | T H E | C L O U D S | F O R | T H E R E | W E R E | P L E N T Y | O F | T H E M | +O N E | E V E N I N G | U R S U S | W A S | I N | T H E | S I D E | S C E N E | W H I C H | W A S | T H E | K I T C H E N | D O O R | O F | T H E | G R E E N | B O X | S E E I N G | M A S T E R | N I C L E S S | S T A N D I N G | B Y | H I M | S H O W E D | H I M | T H I S | M A N | I N | T H E | C R O W D | A N D | A S K E D | H I M | +H E | E N T E R E D | H E A V E N | O N L Y | B Y | T H E | A R T I S T S | D O O R | +W H I C H | C L O U D S | S E E I N G | T H A T | T H E R E | W A S | N O | R O O F | S O M E T I M E S | W E P T | O V E R | T H E | M A S T E R P I E C E | O F | U R S U S | +A L L | S O U T H W A R K | R A N | I N | C R O W D S | T O | A D M I R E | T H E | L A U G H I N G | M A N | +E V E N | T H I S | C O M E D I A N | O F | J A W S | A N D | C L A W S | W A S | E C L I P S E D | I N | S U C C E S S | +W H A T | A | P I T Y | T H A T | H E | S H O U L D | N O T | B E | A | L O R D | +T H A T | S U C C E S S | W A S | P R O D I G I O U S | S T I L L | I T | R E M A I N E D | L O C A L | +A T | E V E R Y | P E R F O R M A N C E | T H E | Y A R D | O F | T H E | I N N | T R A N S F O R M E D | I N T O | A | P I T | W A S | F I L L E D | W I T H | A | R A G G E D | A N D | E N T H U S I A S T I C | A U D I E N C E | +I T | T O O K | A | H U N D R E D | A N D | T H I R T Y | Y E A R S | F O R | T H E | N A M E | O F | S H A K E S P E A R E | T O | P E N E T R A T E | F R O M | E N G L A N D | I N T O | F R A N C E | +W E | A R E | I N | L O N D O N | S A I D | U R S U S | W E | M U S T | B E | P R E P A R E D | F O R | T H E | G E N T R Y | +T H E | M E R R Y | A N D R E W S | A N D | M O U N T E B A N K S | O F | T A R R I N Z E A U | F I E L D | W E R E | A G H A S T | A T | G W Y N P L A I N E | +T H E | E M P T Y I N G | O F | T A N K A R D S | D I D | N O T | D E C R E A S E | T H E I R | S U C C E S S | +S A I N T | P A U L | I S | A | S A I N T | O N L Y | W I T H | E X T E N U A T I N G | C I R C U M S T A N C E S | +H I S | E N T H U S I A S M | C A U S E D | U R S U S | T O | R E M A R K | T H I S | M A N | A N D | G W Y N P L A I N E | T O | O B S E R V E | H I M | +I T | M I G H T | H A V E | B E E N | O R D E R E D | F O R | T H E | G R E E N | B O X | +T H E | P L A C A R D | G W Y N P L A I N E | T H E | L A U G H I N G | M A N | T A K E N | F R O M | I T S | N A I L | I N | T H E | G R E E N | B O X | W A S | H U N G | U P | C L O S E | T O | T H E | S I G N | O F | T H E | I N N | +H E | W O U L D | M A K E | A | F A M O U S | S C O U N D R E L | +G W Y N P L A I N E | A T E | U P | T H E I R | P U B L I C | +W I T H | T H A T | E X C E P T I O N | T H E I R | S U C C E S S | B E C A M E | S O | G R E A T | T H A T | N O | M O U N T E B A N K | M E M O R Y | C O U L D | R E C A L L | I T S | P A R A L L E L | +I T | W A S | A | T H E A T R E | R E A D Y | M A D E | +A T | T H A T | H O U R | T H E R E | W A S | N O | O N E | I N | T H E | F A I R | G R O U N D | E X C E P T | P E R H A P S | S O M E | R E E L I N G | D R U N K A R D | M A K I N G | S T A G G E R I N G | S H A D O W S | I N | D A R K | C O R N E R S | +A G A I N S T | T H I S | W A L L | W A S | P L A C E D | T H E | G R E E N | B O X | W H I C H | T H E Y | W E R E | A B L E | T O | D R A W | I N T O | T H E | Y A R D | O W I N G | T O | T H E | H E I G H T | O F | T H E | G A T E | +T H E Y | B E G A N | T H E I R | P E R F O R M A N C E S | +T H E | G L O R Y | O F | G W Y N P L A I N E | H A D | N O T | P A S S E D | L O N D O N | B R I D G E | +T H E S E | W E R E | R E M A R K A B L E | T A L E N T S | +T H I S | C O N N O I S S E U R | W A S | S U D D E N L Y | F A S C I N A T E D | A N D | H A D | A D O P T E D | T H E | L A U G H I N G | M A N | +T H E Y | H A D | A | G R E A T | F R I E N D | I N | T H I S | U N K N O W N | V I S I T O R | +B E S I D E S | T H E | S M A L L | F R Y | T H E | S W A L L O W E R S | O F | S W O R D S | A N D | T H E | G R I M A C E | M A K E R S | R E A L | P E R F O R M A N C E S | T O O K | P L A C E | O N | T H E | G R E E N | +B E S I D E S | T H I S | H E | H A R A N G U E D | L I K E | C I C E R O | A S | W E | H A V E | J U S T | S E E N | S O L D | H I S | D R U G S | A T T E N D E D | S I C K N E S S | A N D | E V E N | H E A L E D | T H E | S I C K | +T H E | D O M E | O F | S A I N T | P A U L ' S | W A S | A | D E L I G H T | T O | U R S U S | +Y E T | T H E R E | A R E | A | F E W | P R I V A T E | R O O M S | W H I C H | C O N T A I N | A | T A B L E | S U R R O U N D E D | W I T H | B E N C H E S | I N | W H I C H | A | R E S P E C T A B L E | F A M I L Y | O R | A | F E W | F R I E N D S | C A N | E N J O Y | T H E M S E L V E S | I N | A | D E C E N T | W A Y | +N E V E R | F E A R | Y O U | S H A L L | S E E | H I M | A G A I N | T O | M O R R O W | +N O T | V E R Y | L O N G | I | A N S W E R E D | A N D | I | W I L L | T E A C H | Y O U | A S | Y O U | W I S H | A L T H O U G H | T H E | H E R M I T | A S S U R E D | M E | T H A T | I | W O U L D | D I E | S U D D E N L Y | W I T H I N | T H R E E | D A Y S | I F | I | C O M M U N I C A T E D | M Y | S C I E N C E | T O | A N Y O N E | B U T | I | H A V E | N O | F A I T H | W H A T E V E R | I N | T H A T | P R E D I C T I O N | +T H E Y | A L L | A S K E D | M E | H O W | L O N G | I | W O U L D | R E Q U I R E | T O | T E A C H | T H E M | T H E | R U L E S | O F | M Y | S U B L I M E | C A L C U L U S | +U N W I L L I N G | T O | H U R T | H I S | V A N I T Y | B Y | T E L L I N G | H I M | T H A T | H E | W A S | M I S T A K E N | I | T O O K | T H E | W I L D | R E S O L U T I O N | O F | I N F O R M I N G | H I M | I N | T H E | P R E S E N C E | O F | H I S | T W O | F R I E N D S | T H A T | I | P O S S E S S E D | A | C E R T A I N | N U M E R A L | C A L C U L U S | W H I C H | G A V E | A N S W E R S | A L S O | I N | N U M B E R S | T O | A N Y | Q U E S T I O N S | I | L I K E D | T O | P U T | +T H E Y | D I D | N O T | K N O W | W H O | I | W A S | A N D | D I D | N O T | L I K E | T O | A S K | M E | W H I L S T | I | T H O U G H T | I T | B E T T E R | T O | P R E S E R V E | A | M O D E S T | S I L E N C E | +W E | W O U L D | V E R Y | O F T E N | S P E N D | T H E | W H O L E | N I G H T | R A M B L I N G | A B O U T | T H E | C I T Y | I N V E N T I N G | A N D | C A R R Y I N G | I N T O | E X E C U T I O N | T H E | M O S T | I M P E R T I N E N T | P R A C T I C A L | J O K E S | +I F | T H E | Q U E S T I O N | W A S | S O | O B S C U R E | T H A T | I | C O U L D | N O T | M A K E | O U T | T H E | S E N S E | O F | I T | I T | W A S | N A T U R A L | T H A T | I | S H O U L D | N O T | U N D E R S T A N D | T H E | A N S W E R | +W H E R E | I S | M Y | H U S B A N D | +I | D E C L A R E D | M Y S E L F | Q U I T E | W I L L I N G | F O R | I T | W A S | N E C E S S A R Y | T O | B R A Z E N | I T | O U T | A F T E R | H A V I N G | V E N T U R E D | A S | F A R | A S | I | H A D | D O N E | +I | F E L T | T H A T | I N | M Y | F I R S T | P R O F E S S I O N | A S | I | W A S | N O T | B L E S S E D | W I T H | T H E | V O C A T I O N | N E C E S S A R Y | T O | I T | I | S H O U L D | H A V E | S U C C E E D E D | O N L Y | B Y | D I N T | O F | H Y P O C R I S Y | A N D | I | S H O U L D | H A V E | B E E N | D E S P I C A B L E | I N | M Y | O W N | E S T I M A T I O N | E V E N | I F | I | H A D | S E E N | T H E | P U R P L E | M A N T L E | O N | M Y | S H O U L D E R S | F O R | T H E | G R E A T E S T | D I G N I T I E S | C A N N O T | S I L E N C E | A | M A N ' S | O W N | C O N S C I E N C E | +B U T | A L T H O U G H | B E L I E V I N G | F U L L Y | I N | M Y | O R A C L E S | T H E Y | W E R E | T O O | K I N D | H E A R T E D | T O | T H I N K | T H E M | T H E | W O R K | O F | T H E | D E V I L | A N D | I T | S U I T E D | T H E I R | N A T U R A L | G O O D N E S S | B E T T E R | T O | B E L I E V E | M Y | A N S W E R S | I N S P I R E D | B Y | S O M E | H E A V E N L Y | S P I R I T | +O U R | S C A N D A L O U S | P R O C E E D I N G S | O F T E N | E X P O S E D | U S | T O | T H E | G R E A T E S T | D A N G E R | +T H E Y | B E L I E V E D | T H A T | T H R O U G H | M E | T H E Y | P O S S E S S E D | T H E | P H I L O S O P H E R ' S | S T O N E | T H E | U N I V E R S A L | P A N A C E A | T H E | I N T E R C O U R S E | W I T H | A L L | T H E | E L E M E N T A R Y | H E A V E N L Y | A N D | I N F E R N A L | S P I R I T S | T H E Y | H A D | N O | D O U B T | W H A T E V E R | T H A T | T H A N K S | T O | M Y | S U B L I M E | S C I E N C E | T H E Y | C O U L D | F I N D | O U T | T H E | S E C R E T S | O F | E V E R Y | G O V E R N M E N T | I N | E U R O P E | +Y O U R | A P A R T M E N T | I S | R E A D Y | Y O U | M A Y | S E N D | Y O U R | C L O T H E S | Y O U | S H A L L | H A V E | A | S E R V A N T | A | G O N D O L A | A T | Y O U R | O R D E R S | M Y | O W N | T A B L E | A N D | T E N | S E Q U I N S | A | M O N T H | +I | T O L D | H I M | A N D | H E | I N S I S T E D | U P O N | M Y | C O M I N G | W I T H | H I M | I N | T H E | G O N D O L A | S A Y I N G | T H A T | H E | W O U L D | L E A V E | M E | A T | M Y | H O U S E | +W H E N E V E R | W E | C O U L D | C O N T R I V E | T O | G E T | I N T O | A | C H U R C H | T O W E R | W E | T H O U G H T | I T | G R E A T | F U N | T O | F R I G H T E N | A L L | T H E | P A R I S H | B Y | R I N G I N G | T H E | A L A R M | B E L L | A S | I F | S O M E | F I R E | H A D | B R O K E N | O U T | B U T | T H A T | W A S | N O T | A L L | W E | A L W A Y S | C U T | T H E | B E L L | R O P E S | S O | T H A T | I N | T H E | M O R N I N G | T H E | C H U R C H W A R D E N S | H A D | N O | M E A N S | O F | S U M M O N I N G | T H E | F A I T H F U L | T O | E A R L Y | M A S S | +I | J U M P E D | O U T | O F | T H E | G O N D O L A | A N D | F O U N D | M Y S E L F | O N | T H E | V E R Y | S P O T | W H E R E | T H R E E | Y E A R S | B E F O R E | I | H A D | T A U G H T | R A Z E T T A | S U C H | A | F O R C I B L E | L E S S O N | I | E N Q U I R E D | F O R | A | S U R G E O N | A T | T H E | F I R S T | C O F F E E | H O U S E | A N D | R A N | T O | T H E | H O U S E | T H A T | W A S | P O I N T E D | O U T | T O | M E | +W E | D I D | T H E | S A M E | W I T H | P H Y S I C I A N S | W H O M | W E | O F T E N | S E N T | H A L F | D R E S S E D | T O | S O M E | N O B L E M A N | W H O | W A S | E N J O Y I N G | E X C E L L E N T | H E A L T H | +B E S I D E S | I | F O U N D | I T | V E R Y | F L A T T E R I N G | T O | M Y | V A N I T Y | T O | B E C O M E | T H E | S U B J E C T | O F | T H E | S P E C U L A T I V E | C H A T T E R I N G | O F | E M P T Y | F O O L S | W H O | H A V I N G | N O T H I N G | E L S E | T O | D O | A R E | A L W A Y S | T R Y I N G | T O | F I N D | O U T | T H E | C A U S E | O F | E V E R Y | M O R A L | P H E N O M E N O N | T H E Y | M E E T | W I T H | W H I C H | T H E I R | N A R R O W | I N T E L L E C T | C A N N O T | U N D E R S T A N D | +H E | E N T R E A T E D | M E | T O | T E L L | H I M | T H E | T R U T H | +W H A T | E X T R A O R D I N A R Y | T H I N G S | W I L L | S O M E T I M E S | O C C U R | F R O M | M E R E | C H A N C E | O R | F R O M | T H E | F O R C E | O F | C I R C U M S T A N C E S | +I | P I C K E D | I T | U P | A N D | C O M I N G | U P | T O | H I M | J U S T | A S | H E | W A S | G O I N G | D O W N | T H E | S T E P S | I | H A N D E D | I T | T O | H I M | +T H I N K I N G | I | H A D | A | R I G H T | T O | W A T C H | T H E | S I C K | M A N | I | S E T T L E D | M Y S E L F | N E A R | H I S | B E D | T O | G I V E | H I M | E V E R Y | C A R E | H E | R E Q U I R E D | +W E | T O O K | O U R | T H R E E | P R I S O N E R S | T O | A | L A R G E | B O A T | +T A K I N G | E V E R Y T H I N G | U P O N | M Y S E L F | I | O R D E R E D | A | S E R V A N T | T O | H U R R Y | O U T | F O R | A | P H Y S I C I A N | W H O | C A M E | I N | A | S H O R T | T I M E | A N D | O R D E R E D | T H E | P A T I E N T | T O | B E | B L E D | A G A I N | T H U S | A P P R O V I N G | T H E | F I R S T | B L E E D I N G | P R E S C R I B E D | B Y | M E | +W I T H | A N | E D U C A T I O N | W H I C H | O U G H T | T O | H A V E | E N S U R E D | M E | A N | H O N O U R A B L E | S T A N D I N G | I N | T H E | W O R L D | W I T H | S O M E | I N T E L L I G E N C E | W I T | G O O D | L I T E R A R Y | A N D | S C I E N T I F I C | K N O W L E D G E | A N D | E N D O W E D | W I T H | T H O S E | A C C I D E N T A L | P H Y S I C A L | Q U A L I T I E S | W H I C H | A R E | S U C H | A | G O O D | P A S S P O R T | I N T O | S O C I E T Y | I | F O U N D | M Y S E L F | A T | T H E | A G E | O F | T W E N T Y | T H E | M E A N | F O L L O W E R | O F | A | S U B L I M E | A R T | I N | W H I C H | I F | G R E A T | T A L E N T | I S | R I G H T L Y | A D M I R E D | M E D I O C R I T Y | I S | A S | R I G H T L Y | D E S P I S E D | +H E | H A D | G A M B L E D | A N D | L O S T | A | G R E A T | D E A L | A N D | H I S | B R O T H E R | W A S | H I S | M O S T | B I T T E R | E N E M Y | B E C A U S E | H E | W A S | I N F A T U A T E D | W I T H | T H E | I D E A | T H A T | H E | H A D | T R I E D | T O | P O I S O N | H I M | +I | W A S | C O M P E L L E D | B Y | P O V E R T Y | T O | B E C O M E | A | M E M B E R | O F | A | M U S I C A L | B A N D | I N | W H I C H | I | C O U L D | E X P E C T | N E I T H E R | E S T E E M | N O R | C O N S I D E R A T I O N | A N D | I | W A S | W E L L | A W A R E | T H A T | I | S H O U L D | B E | T H E | L A U G H I N G | S T O C K | O F | T H E | P E R S O N S | W H O | H A D | K N O W N | M E | A S | A | D O C T O R | I N | D I V I N I T Y | A S | A N | E C C L E S I A S T I C | A N D | A S | A N | O F F I C E R | I N | T H E | A R M Y | A N D | H A D | W E L C O M E D | M E | I N | T H E | H I G H E S T | S O C I E T Y | +I | T H R E W | M Y S E L F | A T | H I S | F E E T | T O | A S S U R E | H I M | O F | M Y | G R A T I T U D E | A N D | E M B R A C E D | H I M | C A L L I N G | H I M | M Y | F A T H E R | +I T | W E N T | O N | T O | S A Y | T H A T | T H E | T W O | M E N | W H O | H A D | C A R R I E D | H E R | O F F | H A D | T A K E N | H E R | T O | S U C H | A | P L A C E | W H E R E | T H E Y | H A D | A N | H O U R | L A T E R | B E E N | M E T | B Y | T H E | O T H E R | S I X | A N D | T H A T | T H E Y | H A D | A L L | R E P A I R E D | T O | T H E | T W O | S W O R D S | W H E R E | T H E Y | H A D | S P E N T | A N | H O U R | I N | D R I N K I N G | +T H E | T H R E E | F R I E N D S | W E R E | A S T O U N D E D | +M Y | R E A D E R S | M A Y | I M A G I N E | W H E T H E R | W E | F E L T | I N C L I N E D | T O | L A U G H | W H E N | T H E | C H A R M I N G | C R E A T U R E | B A D E | U S | G O O D | N I G H T | T H A N K I N G | U S | A L L | W I T H | P E R F E C T | G O O D | F A I T H | +W H O E V E R | Y O U | M A Y | B E | I | A M | I N D E B T E D | T O | Y O U | F O R | M Y | L I F E | +T H E R E | W A S | N O | C O W A R D L Y | T R A I T O R | A M O N G S T | U S | A L T H O U G H | W E | W E R E | A L L | P O O R | B U T | F E A R | H A D | I T S | E F F E C T | A N D | O U R | N O C T U R N A L | P R A N K S | W E R E | N O T | R E N E W E D | +B E S I D E S | I | W A S | O F | O P I N I O N | T H A T | A | M A N ' S | P R O F E S S I O N | W H A T E V E R | I T | M I G H T | B E | O U G H T | T O | S U P P L Y | H I M | W I T H | E N O U G H | M O N E Y | T O | S A T I S F Y | A L L | H I S | W A N T S | A N D | T H E | V E R Y | P O O R | P A Y | O F | A N | O F F I C E R | W O U L D | N E V E R | H A V E | B E E N | S U F F I C I E N T | T O | C O V E R | M Y | E X P E N S E S | B E C A U S E | M Y | E D U C A T I O N | H A D | G I V E N | M E | G R E A T E R | W A N T S | T H A N | T H O S E | O F | O F F I C E R S | I N | G E N E R A L | +Y O U | N E E D | N O T | T H I N K | O F | T H E | F U T U R E | T H I N K | O N L Y | O F | E N J O Y I N G | Y O U R S E L F | A N D | T A K E | M E | A S | Y O U R | A D V I S E R | I N | E V E R Y T H I N G | T H A T | M A Y | H A P P E N | T O | Y O U | I N | E V E R Y T H I N G | Y O U | M A Y | W I S H | T O | U N D E R T A K E | A N D | Y O U | M A Y | B E | C E R T A I N | O F | A L W A Y S | F I N D I N G | M E | Y O U R | F R I E N D | +T H I S | I S | T H E | A M U S I N G | A D V E N T U R E | W H I C H | C L O S E D | O U R | E X P L O I T S | +I | O B E Y E D | I M P L I C I T L Y | A N D | M E T | Y O U R | E X C E L L E N C Y | +I | R U B B E D | I T | W I T H | A L L | M Y | S T R E N G T H | B U T | H E | T O L D | M E | I N | A | S O R T | O F | I N D I S T I N C T | W H I S P E R | T H A T | T H E | N U M B N E S S | W A S | S P R E A D I N G | A L L | A L O N G | T H E | L E F T | S I D E | A N D | T H A T | H E | W A S | D Y I N G | +I N | E V E R Y | O N E | O F | T H E | S E V E N T Y | T W O | P A R I S H E S | O F | T H E | C I T Y | O F | V E N I C E | T H E R E | I S | A | L A R G E | P U B L I C | H O U S E | C A L L E D | M A G A Z Z I N O | +T H E | W A I T E R | O F | T H E | M A G A Z Z I N O | C A M E | T O | B E | P A I D | A N D | O U R | C H I E F | G A V E | H I M | W H A T | W A S | D U E | E N J O I N I N G | S I L E N C E | U N D E R | P E N A L T Y | O F | D E A T H | +A S | F O R | T H E | E U C H A R I S T | T R A N S U B S T A N T I A T I O N | T H E | R E A L | P R E S E N C E | I T | W A S | A L L | N O | M Y S T E R Y | T O | T H E M | B U T | P A L P A B L E | E V I D E N C E | A N D | Y E T | T H E Y | W E R E | N O T | J E S U I T S | +T H E Y | W E R E | N O T | O N L Y | G O O D | C H R I S T I A N S | A N D | F A I T H F U L | T O | T H E | C H U R C H | B U T | E V E N | R E A L | D E V O T E E S | A N D | F U L L | O F | S C R U P L E S | +D E L I G H T E D | W I T H | S U C H | A | F O R T U N A T E | R E S U L T | W E | L A Y | D O W N | A G A I N | +T H E | P H Y S I C I A N | W H O | A T T E N D E D | H I M | W A S | N A M E D | T E R R O | H E | T H O U G H T | B Y | S O M E | P E C U L I A R | T R A I N | O F | R E A S O N I N G | T H A T | H E | C O U L D | C U R E | H I M | B Y | A P P L Y I N G | A | M E R C U R I A L | O I N T M E N T | T O | T H E | C H E S T | T O | W H I C H | N O | O N E | R A I S E D | A N Y | O B J E C T I O N | +T W O | D A Y S | A F T E R W A R D S | O U R | N O C T U R N A L | O R G Y | B E G A N | T O | B E | T A L K E D | O F | +H E | W R O T E | T H E | Q U E S T I O N | A N D | G A V E | I T | T O | M E | I | R E A D | I T | I | C O U L D | N O T | U N D E R S T A N D | E I T H E R | T H E | S U B J E C T | O R | T H E | M E A N I N G | O F | T H E | W O R D S | B U T | I T | D I D | N O T | M A T T E R | I | H A D | T O | G I V E | A N | A N S W E R | +I | M I G H T | B E | T O L D | T H A T | I F | I | H A D | W I S H E D | T O | F O L L O W | T H E | R U L E S | O F | P U R E | M O R A L I T Y | I | O U G H T | E I T H E R | T O | H A V E | D E C L I N E D | I N T I M A T E | I N T E R C O U R S E | W I T H | T H E M | O R | T O | H A V E | U N D E C E I V E D | T H E M | +B U T | T O | H A V E | A | F R I E N D | A N D | T O | B E | T R U E | U N D E R | A N Y | A N D | A L L | T R I A L S | I S | T H E | M A R K | O F | A | M A N | +B E F O R E | T H I S | C A L A M I T Y | C A M E | U P O N | U S | Y O U | C O U L D | N O T | F I N D | A N Y W H E R E | A | H A P P I E R | H O M E | T H A N | T H A T | C R E A T E D | B Y | T H E | I N D I A N | W O M A N | +T H I S | W I L D | M O T H E R | H A S | N O T | O N L Y | T H E | E X P E R I E N C E | O F | H E R | M O T H E R | A N D | G R A N D M O T H E R | A N D | T H E | A C C E P T E D | R U L E S | O F | H E R | P E O P L E | F O R | A | G U I D E | B U T | S H E | H U M B L Y | S E E K S | T O | L E A R N | A | L E S S O N | F R O M | A N T S | B E E S | S P I D E R S | B E A V E R S | A N D | B A D G E R S | +H E | H A D | N E I T H E R | A | N A T I O N A L | A R M Y | N O R | A N | O R G A N I Z E D | C H U R C H | +H E R | A T T I T U D E | A N D | S E C R E T | M E D I T A T I O N S | M U S T | B E | S U C H | A S | T O | I N S T I L L | I N T O | T H E | R E C E P T I V E | S O U L | O F | T H E | U N B O R N | C H I L D | T H E | L O V E | O F | T H E | G R E A T | M Y S T E R Y | A N D | A | S E N S E | O F | B R O T H E R H O O D | W I T H | A L L | C R E A T I O N | +I N D E E D | T H E | D I S T I N C T I V E | W O R K | O F | B O T H | G R A N D P A R E N T S | I S | T H A T | O F | A C Q U A I N T I N G | T H E | Y O U T H | W I T H | T H E | N A T I O N A L | T R A D I T I O N S | A N D | B E L I E F S | +O U R | H O N O R | I S | T H E | G U A R A N T E E | F O R | H I S | S A F E T Y | S O | L O N G | A S | H E | I S | W I T H I N | T H E | C A M P | +W H E N | S H E | F E L L | T H E | W H O L E | R A C E | F E L L | W I T H | H E R | +H E | C U T S | O F F | T H E | C H O I C E S T | M O R S E L | O F | T H E | M E A T | A N D | C A S T S | I T | I N T O | T H E | F I R E | T H E | P U R E S T | A N D | M O S T | E T H E R E A L | E L E M E N T | +T H E | F A M I L Y | W A S | N O T | O N L Y | T H E | S O C I A L | U N I T | B U T | A L S O | T H E | U N I T | O F | G O V E R N M E N T | +L O V E | B E T W E E N | M A N | A N D | W O M A N | I S | F O U N D E D | O N | T H E | M A T I N G | I N S T I N C T | A N D | I S | N O T | F R E E | F R O M | D E S I R E | A N D | S E L F | S E E K I N G | +W H E N | H E | B E C O M E S | A N | O L D | M A N | H E | L O V E S | T O | M A K E | A | N O T A B L E | E F F O R T | T O | P R O V E | H I S | G R A T I T U D E | +I N | D U E | T I M E | T H E | C H I L D | T A K E S | O F | H I S | O W N | A C C O R D | T H E | A T T I T U D E | O F | P R A Y E R | A N D | S P E A K S | R E V E R E N T L Y | O F | T H E | P O W E R S | +T H E | O R D E A L | I S | B E S T | M E T | A L O N E | W H E R E | N O | C U R I O U S | O R | P I T Y I N G | E Y E S | E M B A R R A S S | H E R | W H E R E | A L L | N A T U R E | S A Y S | T O | H E R | S P I R I T | T I S | L O V E | T I S | L O V E | T H E | F U L F I L L I N G | O F | L I F E | +H I S | D A I L Y | D E V O T I O N S | W E R E | M O R E | N E C E S S A R Y | T O | H I M | T H A N | D A I L Y | F O O D | +W H E N E V E R | I N | T H E | C O U R S E | O F | T H E | D A I L Y | H U N T | T H E | R E D | H U N T E R | C O M E S | U P O N | A | S C E N E | T H A T | I S | S T R I K I N G L Y | B E A U T I F U L | O R | S U B L I M E | A | B L A C K | T H U N D E R C L O U D | W I T H | T H E | R A I N B O W ' S | G L O W I N G | A R C H | A B O V E | T H E | M O U N T A I N | A | W H I T E | W A T E R F A L L | I N | T H E | H E A R T | O F | A | G R E E N | G O R G E | A | V A S T | P R A I R I E | T I N G E D | W I T H | T H E | B L O O D | R E D | O F | S U N S E T | H E | P A U S E S | F O R | A N | I N S T A N T | I N | T H E | A T T I T U D E | O F | W O R S H I P | +T H I S | B O N D | I S | B E T W E E N | M A N | A N D | M A N | I S | U S U A L L Y | F O R M E D | I N | E A R L Y | Y O U T H | A N D | C A N | O N L Y | B E | B R O K E N | B Y | D E A T H | +T H E | R E M O T E R | D E G R E E S | O F | K I N S H I P | W E R E | F U L L Y | R E C O G N I Z E D | A N D | T H A T | N O T | A S | A | M A T T E R | O F | F O R M | O N L Y | F I R S T | C O U S I N S | W E R E | K N O W N | A S | B R O T H E R S | A N D | S I S T E R S | T H E | N A M E | O F | C O U S I N | C O N S T I T U T E D | A | B I N D I N G | C L A I M | A N D | O U R | R I G I D | M O R A L I T Y | F O R B A D E | M A R R I A G E | B E T W E E N | C O U S I N S | I N | A N Y | K N O W N | D E G R E E | O R | I N | O T H E R | W O R D S | W I T H I N | T H E | C L A N | +T H E | H O S P I T A L I T Y | O F | T H E | W I G W A M | I S | O N L Y | L I M I T E D | B Y | T H E | I N S T I T U T I O N | O F | W A R | +A T | A N O T H E R | T I M E | W H E N | I | W A S | F O U R T E E N | Y E A R S | O L D | W E | H A D | J U S T | L E F T | F O R T | E L L I S | O N | T H E | A S S I N I B O I N E | R I V E R | A N D | M Y | Y O U N G E S T | U N C L E | H A D | S E L E C T E D | A | F I N E | S P O T | F O R | O U R | N I G H T | C A M P | +A S | A | S P E C I A L | M A R K | O F | R E S P E C T | T H E | B O D Y | O F | A | Y O U N G | W O M A N | O R | A | W A R R I O R | W A S | S O M E T I M E S | L A I D | O U T | I N | S T A T E | I N | A | N E W | T E E P E E | W I T H | T H E | U S U A L | H O U S E H O L D | A R T I C L E S | A N D | E V E N | W I T H | A | D I S H | O F | F O O D | L E F T | B E S I D E | I T | N O T | T H A T | T H E Y | S U P P O S E D | T H E | S P I R I T | C O U L D | U S E | T H E | I M P L E M E N T S | O R | E A T | T H E | F O O D | B U T | M E R E L Y | A S | A | L A S T | T R I B U T E | +M A N Y | O F | T H E | I N D I A N S | B E L I E V E D | T H A T | O N E | M A Y | B E | B O R N | M O R E | T H A N | O N C E | A N D | T H E R E | W E R E | S O M E | W H O | C L A I M E D | T O | H A V E | F U L L | K N O W L E D G E | O F | A | F O R M E R | I N C A R N A T I O N | +G I V I N G | T H E M S E L V E S | U P | W H O L L Y | T O | T H E I R | G R I E F | T H E Y | A R E | N O | L O N G E R | C O N C E R N E D | A B O U T | A N Y | E A R T H L Y | P O S S E S S I O N | A N D | O F T E N | G I V E | A W A Y | A L L | T H A T | T H E Y | H A V E | T O | T H E | F I R S T | C O M E R S | E V E N | T O | T H E I R | B E D S | A N D | T H E I R | H O M E | +T H I S | W A S | C A R R I E D | O U T | T O | T H E | L E T T E R | +I F | A | M A N | W E R E | S L A I N | I N | B A T T L E | I T | W A S | A N | O L D | C U S T O M | T O | P L A C E | H I S | B O D Y | A G A I N S T | A | T R E E | O R | R O C K | I N | A | S I T T I N G | P O S I T I O N | A L W A Y S | F A C I N G | T H E | E N E M Y | T O | I N D I C A T E | H I S | U N D A U N T E D | D E F I A N C E | A N D | B R A V E R Y | E V E N | I N | D E A T H | +T H E R E | A R E | M A N Y | T R U S T W O R T H Y | M E N | A N D | M E N | O F | C H R I S T I A N | F A I T H | T O | V O U C H | F O R | T H E S E | A N D | S I M I L A R | E V E N T S | O C C U R R I N G | A S | F O R E T O L D | +F I V E | Y E A R S | L A T E R | H E | R E P E A T E D | T H E | S E R V I C E | A N D | A G A I N | S A V E D | H I S | P E O P L E | F R O M | A W F U L | S L A U G H T E R | +T H I S | W A S | O N L Y | O N E | O F | H I S | R E M A R K A B L E | P R O P H E C I E S | +A T | T H E | A G E | O F | A B O U T | S E V E N T Y | F I V E | Y E A R S | H E | S A V E D | H I S | B A N D | F R O M | U T T E R | D E S T R U C T I O N | A T | T H E | H A N D S | O F | T H E I R | A N C E S T R A L | E N E M I E S | B Y | S U D D E N L Y | G I V I N G | W A R N I N G | R E C E I V E D | I N | A | D R E A M | O F | T H E | A P P R O A C H | O F | A | L A R G E | W A R | P A R T Y | +R E I N C A R N A T I O N | A N D | T H E | C O N V E R S E | O F | S P I R I T S | +A T | E V E R Y | M E A L | T I M E | A | D I S H | O F | F O O D | W A S | P L A C E D | U N D E R | I T | A N D | S O M E | P E R S O N | O F | T H E | S A M E | S E X | A N D | A G E | A S | T H E | O N E | W H O | W A S | G O N E | M U S T | A F T E R W A R D | B E | I N V I T E D | I N | T O | P A R T A K E | O F | T H E | F O O D | +A N O T H E R | F A M O U S | M E D I C I N E | M A N | W A S | B O R N | O N | T H E | R U M | R I V E R | A B O U T | O N E | H U N D R E D | A N D | F I F T Y | Y E A R S | A G O | A N D | L I V E D | T O | B E | O V E R | A | C E N T U R Y | O L D | +I T | W A S | P R E P A R E D | B Y | D R E S S I N G | I N | T H E | F I N E S T | C L O T H E S | T O G E T H E R | W I T H | S O M E | P E R S O N A L | P O S S E S S I O N S | A N D | O R N A M E N T S | W R A P P E D | I N | S E V E R A L | R O B E S | A N D | F I N A L L Y | I N | A | S E C U R E | C O V E R I N G | O F | R A W | H I D E | +A T | T H E | E N D | O F | A | Y E A R | F R O M | T H E | T I M E | O F | D E A T H | T H E | R E L A T I V E S | M A D E | A | P U B L I C | F E A S T | A N D | G A V E | A W A Y | T H E | C L O T H I N G | A N D | O T H E R | G I F T S | W H I L E | T H E | L O C K | O F | H A I R | W A S | I N T E R R E D | W I T H | A P P R O P R I A T E | C E R E M O N I E S | +T H E R E F O R E | H E | C O U R T S | D E A T H | I N | B A T T L E | O N | T H E | O T H E R | H A N D | H E | W O U L D | R E G A R D | I T | A S | D I S G R A C E F U L | T O | B E | K I L L E D | I N | A | P R I V A T E | Q U A R R E L | +T H E R E | W A S | A | W E L L | K N O W N | S I O U X | W A R | P R O P H E T | W H O | L I V E D | I N | T H E | M I D D L E | O F | T H E | L A S T | C E N T U R Y | S O | T H A T | H E | I S | S T I L L | R E M E M B E R E D | B Y | T H E | O L D | M E N | O F | H I S | B A N D | +N O | D O U B T | M A N Y | P R E D I C T I O N S | H A V E | B E E N | C O L O R E D | T O | S U I T | T H E | N E W | A G E | A N D | U N Q U E S T I O N A B L Y | F A L S E | P R O P H E T S | F A K I R S | A N D | C O N J U R E R S | H A V E | B E C O M E | T H E | P E S T | O F | T H E | T R I B E S | D U R I N G | T H E | T R A N S I T I O N | P E R I O D | +I T | I S | W E L L | K N O W N | T H A T | T H E | A M E R I C A N | I N D I A N | H A D | S O M E H O W | D E V E L O P E D | O C C U L T | P O W E R | A N D | A L T H O U G H | I N | T H E | L A T T E R | D A Y S | T H E R E | H A V E | B E E N | M A N Y | I M P O S T O R S | A N D | A L L O W I N G | F O R | T H E | V A N I T Y | A N D | W E A K N E S S | O F | H U M A N | N A T U R E | I T | I S | F A I R | T O | A S S U M E | T H A T | T H E R E | M U S T | H A V E | B E E N | S O M E | E V E N | I N | T H E | O L D | D A Y S | Y E T | T H E R E | A R E | W E L L | A T T E S T E D | I N S T A N C E S | O F | R E M A R K A B L E | P R O P H E C I E S | A N D | O T H E R | M Y S T I C | P R A C T I C E | +T H E | M E N | B L A C K E N | T H E I R | F A C E S | A N D | W I D O W S | O R | B E R E A V E D | P A R E N T S | S O M E T I M E S | G A S H | T H E I R | A R M S | A N D | L E G S | T I L L | T H E Y | A R E | C O V E R E D | W I T H | B L O O D | +T O | T H E | U N T U T O R E D | S A G E | T H E | C O N C E N T R A T I O N | O F | P O P U L A T I O N | W A S | T H E | P R O L I F I C | M O T H E R | O F | A L L | E V I L S | M O R A L | N O | L E S S | T H A N | P H Y S I C A L | +I N | H I S | O W N | T H O U G H T | H E | R O S E | S U P E R I O R | T O | T H E M | H E | S C O R N E D | T H E M | E V E N | A S | A | L O F T Y | S P I R I T | A B S O R B E D | I N | I T S | S T E R N | T A S K | R E J E C T S | T H E | S O F T | B E D S | T H E | L U X U R I O U S | F O O D | T H E | P L E A S U R E | W O R S H I P I N G | D A L L I A N C E | O F | A | R I C H | N E I G H B O R | +W H E N | H E | R E T U R N E D | T O | T H E | C A M P | H E | M U S T | R E M A I N | A T | A | D I S T A N C E | U N T I L | H E | H A D | A G A I N | E N T E R E D | T H E | V A P O R | B A T H | A N D | P R E P A R E D | H I M S E L F | F O R | I N T E R C O U R S E | W I T H | H I S | F E L L O W S | +I T | W A S | S I L E N T | B E C A U S E | A L L | S P E E C H | I S | O F | N E C E S S I T Y | F E E B L E | A N D | I M P E R F E C T | T H E R E F O R E | T H E | S O U L S | O F | M Y | A N C E S T O R S | A S C E N D E D | T O | G O D | I N | W O R D L E S S | A D O R A T I O N | +T H E | O R I G I N A L | A T T I T U D E | O F | T H E | A M E R I C A N | I N D I A N | T O W A R D | T H E | E T E R N A L | T H E | G R E A T | M Y S T E R Y | T H A T | S U R R O U N D S | A N D | E M B R A C E S | U S | W A S | A S | S I M P L E | A S | I T | W A S | E X A L T E D | +T H E | F I R S T | B A M B E D A Y | O R | R E L I G I O U S | R E T R E A T | M A R K E D | A N | E P O C H | I N | T H E | L I F E | O F | T H E | Y O U T H | W H I C H | M A Y | B E | C O M P A R E D | T O | T H A T | O F | C O N F I R M A T I O N | O R | C O N V E R S I O N | I N | C H R I S T I A N | E X P E R I E N C E | +I T | W A S | N O T | T H E N | W H O L L Y | F R O M | I G N O R A N C E | O R | I M P R O V I D E N C E | T H A T | H E | F A I L E D | T O | E S T A B L I S H | P E R M A N E N T | T O W N S | A N D | T O | D E V E L O P | A | M A T E R I A L | C I V I L I Z A T I O N | +F R O M | T H E | S U N | A S | T H E | U N I V E R S A L | F A T H E R | P R O C E E D S | T H E | Q U I C K E N I N G | P R I N C I P L E | I N | N A T U R E | A N D | I N | T H E | P A T I E N T | A N D | F R U I T F U L | W O M B | O F | O U R | M O T H E R | T H E | E A R T H | A R E | H I D D E N | E M B R Y O S | O F | P L A N T S | A N D | M E N | +N O T H I N G | O F | T H E | M A R V E L O U S | C O U L D | A S T O N I S H | H I M | A S | T H A T | A | B E A S T | S H O U L D | S P E A K | O R | T H E | S U N | S T A N D | S T I L L | +K N O W I N G | T H A T | G O D | S E T S | N O | V A L U E | U P O N | M A T E R I A L | T H I N G S | H E | T O O K | W I T H | H I M | N O | O F F E R I N G S | O R | S A C R I F I C E S | O T H E R | T H A N | S Y M B O L I C | O B J E C T S | S U C H | A S | P A I N T S | A N D | T O B A C C O | +I N | T H I S | T Y P E | O F | P R A Y E R | T H E R E | W A S | N O | B E S E E C H I N G | O F | F A V O R | O R | H E L P | +T H I S | I S | T H E | M A T E R I A L | O R | P H Y S I C A L | P R A Y E R | +T H A T | S O L I T A R Y | C O M M U N I O N | W I T H | T H E | U N S E E N | W H I C H | W A S | T H E | H I G H E S T | E X P R E S S I O N | O F | O U R | R E L I G I O U S | L I F E | I S | P A R T L Y | D E S C R I B E D | I N | T H E | W O R D | B A M B E D A Y | L I T E R A L L Y | M Y S T E R I O U S | F E E L I N G | W H I C H | H A S | B E E N | V A R I O U S L Y | T R A N S L A T E D | F A S T I N G | A N D | D R E A M I N G | +T H E | H I S T O R I A N S | O F | T H E | W H I T E | R A C E | A D M I T | T H A T | T H E | I N D I A N | W A S | N E V E R | T H E | F I R S T | T O | R E P U D I A T E | H I S | O A T H | +A T | T H E | S O L E M N | H O U R | O F | S U N R I S E | O R | S U N S E T | H E | T O O K | U P | H I S | P O S I T I O N | O V E R L O O K I N G | T H E | G L O R I E S | O F | E A R T H | A N D | F A C I N G | T H E | G R E A T | M Y S T E R Y | A N D | T H E R E | H E | R E M A I N E D | N A K E D | E R E C T | S I L E N T | A N D | M O T I O N L E S S | E X P O S E D | T O | T H E | E L E M E N T S | A N D | F O R C E S | O F | H I S | A R M I N G | F O R | A | N I G H T | A N D | A | D A Y | T O | T W O | D A Y S | A N D | N I G H T S | B U T | R A R E L Y | L O N G E R | +N O N E | M I G H T | E X H O R T | O R | C O N F E S S | O R | I N | A N Y | W A Y | M E D D L E | W I T H | T H E | R E L I G I O U S | E X P E R I E N C E | O F | A N O T H E R | +T H E | S A V A G E | P H I L O S O P H E R | T H E | D U A L | M I N D | +A M O N G | U S | A L L | M E N | W E R E | C R E A T E D | S O N S | O F | G O D | A N D | S T O O D | E R E C T | A S | C O N S C I O U S | O F | T H E I R | D I V I N I T Y | +H E R E | I S | T H E | S U P R E M E | M Y S T E R Y | T H A T | I S | T H E | E S S E N C E | O F | W O R S H I P | W I T H O U T | W H I C H | T H E R E | C A N | B E | N O | R E L I G I O N | A N D | I N | T H E | P R E S E N C E | O F | T H I S | M Y S T E R Y | O U R | A T T I T U D E | C A N N O T | B E | V E R Y | U N L I K E | T H A T | O F | T H E | N A T U R A L | P H I L O S O P H E R | W H O | B E H O L D S | W I T H | A W E | T H E | D I V I N E | I N | A L L | C R E A T I O N | +W H O | M A Y | C O N D E M N | H I S | S U P E R S T I T I O N | +T H E I R | F R I E N D S | D I D | T H E I R | B E S T | T O | A M U S E | T H E M | +T H E I R | M I N D S | W E R E | S O | D I S T R A C T E D | A T | T H I S | C H A N G E | O F | R O U T E | A S | T O | B E | Q U I T E | U N H I N G E D | +W I L L | H A L L E Y | I S | A | B R U T E | B U T | I | A M | K E E P I N G | M Y | E Y E S | O P E N | A N D | I F | T H E | C O A S T | L O O K S | D A N G E R O U S | I | W I L L | P U T | T H E | S H I P ' S | H E A D | T O | S E A | A G A I N | +S O | T H A T | O N | T H A T | S C O R E | T H E R E | I S | L I T T L E | O R | N O | D A N G E R | +F O R T U N A T E L Y | W I L L | H A L L E Y | W A S | N O T | A | M A N | I N | A | H U R R Y | A N D | D I D | N O T | U S E | A | P R E S S | O F | C A N V A S | O R | H I S | M A S T S | W O U L D | I N E V I T A B L Y | H A V E | C O M E | D O W N | +T H I N K | O F | L A D Y | G L E N A R V A N | T H I N K | O F | M A R Y | G R A N T | +Y E S | M Y | L O R D | W E | S H O U L D | T R Y | I N | V A I N | +B U T | A S | T O | G E T T I N G | A L O N G S I D E | T H E | D U N C A N | G O D | F O R B I D | +W H A T | T H E N | M Y | L O R D | +W E | W O U L D | F I G H T | T O | T H E | D E A T H | O F | C O U R S E | B U T | A F T E R | T H A T | +J O H N | M A N G L E S | T H E R E F O R E | H O P E D | T H A T | T H E | W R E T C H E D | H U L L | W O U L D | R E A C H | P O R T | W I T H O U T | A C C I D E N T | B U T | I T | G R I E V E D | H I M | T H A T | H I S | C O M P A N I O N S | S H O U L D | H A V E | T O | S U F F E R | S O | M U C H | D I S C O M F O R T | F R O M | T H E | D E F E C T I V E | A R R A N G E M E N T S | O F | T H E | B R I G | +H I S | E Y E S | W A N D E R E D | C E A S E L E S S L Y | O V E R | T H E | B L A N K | H O R I Z O N | +W E | C O U L D | N O T | E V E N | F L Y | F L Y | J O H N | +G O D | K E E P | U S | F R O M | S U C H | A | M E E T I N G | W H Y | J O H N | +M U C H | A S | T H E Y | H A D | B E E N | I N T E R E S T E D | I N | H I S | D I S S E R T A T I O N | O N | T H E | P A M P A S | O R | A U S T R A L I A | H I S | L E C T U R E S | O N | N E W | Z E A L A N D | F E L L | O N | C O L D | A N D | I N D I F F E R E N T | E A R S | +D O N ' T | Y O U | S E E | H O W | M A N Y | U S E S | W E | H A V E | F O U N D | F O R | T H I S | R E F U S E | C O A L | T A R | +L O O K | A | L I T T L E | C L O S E R | W H I L E | O U R | G U I D E | L E T S | T H E | L I G H T | O F | H I S | L A M P | F A L L | U P O N | T H E | B L A C K | W A L L | A T | Y O U R | S I D E | +W H E N | Y O U R | H A N D S | O R | L I P S | A R E | C R A C K E D | A N D | R O U G H | F R O M | T H E | C O L D | D O E S | Y O U R | M O T H E R | E V E R | P U T | O N | G L Y C E R I N | T O | H E A L | T H E M | +F E R N S | A N D | P A L M S | M O S S E S | A N D | T R E E S | A N D | A N I M A L S | A L L | P E R F E C T | A L L | B E A U T I F U L | A N D | Y E T | A L L | H I D D E N | A W A Y | U N D E R | T H I S | H I L L | A N D | T U R N E D | I N T O | S H I N I N G | B L A C K | C O A L | N O W | I | C A N | V E R Y | W E L L | R E M E M B E R | W H E N | I | F I R S T | S A W | A | C O A L | F I R E | A N D | H O W | O D D | I T | L O O K E D | T O | S E E | W H A T | S E E M E D | T O | B E | B U R N I N G | S T O N E S | +W H Y | D I D | H E | G I V E | T H A T | S O | O D D | A | S H A P E | O R | S O | S T R A N G E | A | C O V E R I N G | +O N C E | T H E R E | W A S | A | F A T H E R | W H O | T H O U G H T | H E | W O U L D | B U I L D | F O R | H I S | C H I L D R E N | A | B E A U T I F U L | H O M E | P U T T I N G | I N T O | I T | E V E R Y | T H I N G | T H E Y | C O U L D | N E E D | O R | D E S I R E | T H R O U G H O U T | T H E I R | L I V E S | +F O R | W H E N | I | W A S | A | L I T T L E | G I R L | W E | A L W A Y S | H A D | L O G S | O F | W O O D | B L A Z I N G | I N | A N | O P E N | F I R E P L A C E | A N D | S O | D I D | M A N Y | O T H E R | P E O P L E | A N D | C O A L | W A S | J U S T | C O M I N G | I N T O | U S E | F O R | F U E L | +S E E | B E N E A T H | Y O U R | F E E T | I S | T H E | M A R K I N G | O F | G R E A T | T R E E | T R U N K S | L Y I N G | A S L A N T | A C R O S S | T H E | F L O O R | A N D | T H E | F O R M S | O F | G I G A N T I C | P A L M | L E A V E S | S T R E W E D | A M O N G | T H E M | +T H E | S W E E T E S T | P E R F U M E S | F L O A T E D | T H R O U G H | T H E | A I R | W H I L E | T H O U S A N D S | O F | B I R D S | A N S W E R E D | T H E | M U S I C | O F | F O U N T A I N S | W I T H | T H E I R | S O N G S | +T H E N | T H E | H I L L S | W E R E | P I L E D | U P | O N | T O P | O F | I T | A L L | B U T | H E R E | A N D | T H E R E | S O M E | E D G E | O F | A | C O A L | B E D | W A S | T I L T E D | U P | A N D | A P P E A R E D | A B O V E | T H E | G R O U N D | +T H E S E | F O R E S T S | W E R E | O F | T R E E S | D I F F E R E N T | I N | S O M E | W A Y S | F R O M | T H O S E | W E | H A V E | N O W | G R E A T | F E R N S | A S | T A L L | A S | T H I S | H O U S E | A N D | M O S S E S | A S | H I G H | A S | L I T T L E | T R E E S | A N D | P A L M | L E A V E S | O F | E N O R M O U S | S I Z E | +I T | W A S | O N L Y | A | T R O U B L E | T O | T H E | G A S | M A K E R S | W H O | H A D | N O | U S E | F O R | I T | A N D | E V E N | T H R E W | I T | A W A Y | U N T I L | S O M E | O N E | M O R E | T H O U G H T F U L | T H A N | T H E | O T H E R S | F O U N D | O U T | T H A T | W A T E R | W O U L D | N O T | P A S S | T H R O U G H | I T | +A N D | S O | T H R O U G H | M A N Y | Q U E S T I O N S | A N D | M A N Y | E X P E R I M E N T S | T H E Y | L E A R N | A T | L A S T | H O W | T O | U S E | T H E | C O N T E N T S | O F | T H I S | O N E | S T O R E H O U S E | +T H E | E N T R A N C E | I S | L I G H T | B E C A U S E | I T | O P E N S | S O | W I D E | B U T | W E | C A N | S E E | T H A T | T H E | F L O O R | S L O P E S | D O W N W A R D | A N D | T H E | W A Y | L O O K S | D A R K | A N D | N A R R O W | B E F O R E | U S | +H E R E | I S | S O M E T H I N G | D I F F E R E N T | R O U N D E D | L I K E | A | N U T | S H E L L | Y O U | C A N | S P L I T | O F F | O N E | S I D E | A N D | B E H O L D | T H E R E | I S | T H E | N U T | L Y I N G | S N U G L Y | A S | D O E S | A N Y | C H E S T N U T | I N | I T S | B U R | +W H A T | S H O U L D | W E | H A V E | D O N E | I F | E V E R Y B O D Y | H A D | K E P T | O N | B U R N I N G | W O O D | T O | T H I S | D A Y | +W A L K | D O W N | T H E | S L O P I N G | F O O T | P A T H | N O W | A N D | B E | C A R E F U L | T O | K E E P | O U T | O F | T H E | W A Y | O F | T H E | L I T T L E | C A R S | T H A T | A R E | C O M I N G | A N D | G O I N G | O N | E A C H | S I D E | O F | Y O U | L O A D E D | O N | O N E | S I D E | A N D | E M P T Y | O N | T H E | O T H E R | A N D | S E E M I N G | T O | R U N | U P | A N D | D O W N | B Y | T H E M S E L V E S | +B U T | B Y | A N D | B Y | T H E | W I S E | M E N | T H O U G H T | A B O U T | I T | A N D | S A I D | T O | T H E M S E L V E S | W E | M U S T | F I N D | O U T | W H A T | U S E F U L | P U R P O S E | G O D | M A D E | T H E | G A S | F O R | W E | K N O W | T H A T | H E | D O E S | N O T | M A K E | A N Y | T H I N G | F O R | H A R M | O N L Y | +O N | T H A T | S I D E | D E S C E N T | W A S | I M P O S S I B L E | A N D | H A D | I T | B E E N | P O S S I B L E | T H E | B O T T O M | W A S | S H U T | I N | B Y | T H E | E N O R M O U S | R O C K | +W H A T | C O U L D | B E | T H E | O B J E C T | +W A T C H | T H E | S A V A G E S | O U T S I D E | S A I D | R O B E R T | +T H E | M E A L | E N D E D | +L I S T E N | S A I D | H E | M O T I O N I N G | T H E M | T O | S T O O P | +I F | I T | I S | D E C R E E D | T H A T | W E | D I E | T O | M O R R O W | L E T | U S | D I E | B R A V E L Y | L I K E | C H R I S T I A N | M E N | R E A D Y | T O | A P P E A R | W I T H O U T | T E R R O R | B E F O R E | T H E | S U P R E M E | J U D G E | +J O H N | Y O U | H A V E | P R O M I S E D | M A R Y | W H A T | I | P R O M I S E D | L A D Y | H E L E N A | W H A T | I S | Y O U R | P L A N | +S L E E P | W H I C H | K E E P S | A L L | S O R R O W | I N | A B E Y A N C E | S O O N | W E I G H E D | D O W N | T H E I R | E Y E L I D S | T H E Y | S L E P T | I N | E A C H | O T H E R ' S | A R M S | O V E R C O M E | B Y | E X H A U S T I O N | A N D | P R O L O N G E D | W A T C H I N G | +J O H N | M A N G L E S | I N S E R T I N G | T H E | B L A D E | O F | H I S | P O N I A R D | A V O I D E D | T H E | K N I F E | W H I C H | N O W | P R O T R U D E D | A B O V E | T H E | S O I L | B U T | S E I Z E D | T H E | H A N D | T H A T | W I E L D E D | I T | +T H E Y | H A D | O N E | N I G H T | I N | W H I C H | T O | P R E P A R E | F O R | D E A T H | +T H E I R | F I N G E R S | B L E D | B U T | S T I L L | T H E Y | W O R K E D | O N | A F T E R | H A L F | A N | H O U R | T H E Y | H A D | G O N E | T H R E E | F E E T | D E E P | T H E Y | P E R C E I V E D | B Y | T H E | I N C R E A S E D | S H A R P N E S S | O F | T H E | S O U N D S | T H A T | O N L Y | A | T H I N | L A Y E R | O F | E A R T H | P R E V E N T E D | I M M E D I A T E | C O M M U N I C A T I O N | +G O D | W H O | R E A D S | O U R | H E A R T S | K N O W S | T H A T | W E | H A D | A | N O B L E | E N D | I N | V I E W | +D I D | T H E Y | K N O W | O F | T H E | E X I S T E N C E | O F | T H E | P R I S O N E R S | O R | W A S | I T | S O M E | P R I V A T E | E N T E R P R I S E | T H A T | L E D | T O | T H E | U N D E R T A K I N G | +T H E Y | W E R E | N O T | T O | L E A V E | I T | A G A I N | T I L L | T H E | T O P S | O F | T H E | W A H I T I | R A N G E S | W E R E | L I T | W I T H | T H E | F I R S T | F I R E S | O F | D A Y | +M Y | C H I L D | M Y | C H I L D | M U R M U R E D | L A D Y | H E L E N A | T H E | S A V A G E S | D I D | N O T | K I L L | Y O U | +I | B E L I E V E | S A I D | J O H N | T H A T | I N | T H E | S I G H T | O F | G O D | I | H A V E | A | R I G H T | T O | F U L F I L L | T H A T | P R O M I S E | +B U T | S O F T L Y | A S | T H E | N A M E | W A S | B R E A T H E D | M A R Y | G R A N T | A L R E A D Y | A W A K E N E D | B Y | T H E | S O U N D S | I N | T H E | H U T | S L I P P E D | O V E R | T O W A R D | G L E N A R V A N | A N D | S E I Z I N G | T H E | H A N D | A L L | S T A I N E D | W I T H | E A R T H | S H E | C O V E R E D | I T | W I T H | K I S S E S | +W I L S O N | A N D | O L B I N E T T | J O I N E D | T H E I R | C O M P A N I O N S | A N D | A L L | U N I T E D | T O | D I G | T H R O U G H | T H E | W A L L | J O H N | W I T H | H I S | D A G G E R | T H E | O T H E R S | W I T H | S T O N E S | T A K E N | F R O M | T H E | G R O U N D | O R | W I T H | T H E I R | N A I L S | W H I L E | M U L R A D Y | S T R E T C H E D | A L O N G | T H E | G R O U N D | W A T C H E D | T H E | N A T I V E | G U A R D | T H R O U G H | A | C R E V I C E | O F | T H E | M A T T I N G | +A T | L A S T | T H E | M A J O R | S A I D | M Y | F R I E N D S | K E E P | T H A T | T O | T H E | L A S T | M O M E N T | +M Y | L O R D | W H I C H E V E R | O F | U S | S U R V I V E S | T H E | O T H E R | W I L L | F U L F I L L | T H E | W I S H | O F | L A D Y | H E L E N A | A N D | M A R Y | G R A N T | +G L E N A R V A N ' S | V O I C E | F I R M | T I L L | N O W | F A L T E R E D | +A N I M A L | O R | M A N | A N S W E R E D | T H E | M A J O R | I | W I L L | S O O N | F I N D | O U T | +R O U N D | H I S | B O D Y | W A S | R O L L E D | A | L O N G | C O I L | O F | F L A X | R O P E | +T H E | J A I L E R | M A Y | F O R G E T | T H A T | H E | I S | O N | G U A R D | T H E | P R I S O N E R | N E V E R | F O R G E T S | T H A T | H E | I S | G U A R D E D | +C H A P T E R | T H I R T Y | T H R E E | A | C O N F I D A N T | +M I S T E R | M O R T O N | T H E N | M A D E | A | C A R E F U L | M E M O R A N D U M | O F | T H E | V A R I O U S | P A R T I C U L A R S | O F | W A V E R L E Y ' S | I N T E R V I E W | W I T H | D O N A L D | B E A N | L E A N | A N D | T H E | O T H E R | C I R C U M S T A N C E S | W H I C H | H E | H A D | C O M M U N I C A T E D | +W H E N | I | W A S | A | Y O U N G | M A N | L I K E | Y O U | M I S T E R | W A V E R L E Y | A N Y | S U C H | H A I R | B R A I N E D | E X P E D I T I O N | I | B E G | Y O U R | P A R D O N | F O R | T H E | E X P R E S S I O N | W O U L D | H A V E | H A D | I N E X P R E S S I B L E | C H A R M S | F O R | M E | +E V I L | T O | H I M | T H A T | T H I N K S | O T H E R W I S E | S A I D | M I S T E R | M O R T O N | O R | W H O | H O L D S | C H U R C H | G O V E R N M E N T | A N D | C E R E M O N I E S | A S | T H E | E X C L U S I V E | G A G E | O F | C H R I S T I A N | F A I T H | O R | M O R A L | V I R T U E | +S I N C E | T H A T | T I M E | T H E I R | N U M B E R S | H A V E | G R A D U A L L Y | D I M I N I S H E D | B U T | A | G O O D | M A N Y | A R E | S T I L L | T O | B E | F O U N D | I N | T H E | W E S T E R N | C O U N T I E S | A N D | S E V E R A L | W I T H | A | B E T T E R | T E M P E R | T H A N | I N | S E V E N T E E N | O | S E V E N | H A V E | N O W | T A K E N | A R M S | F O R | G O V E R N M E N T | +H E | H A D | N E I T H E R | S Y M P A T H Y | W I T H | M Y | I N N O C E N C E | N O R | W I T H | M Y | W R E T C H E D N E S S | A N D | T H E | P E T R I F Y I N G | A C C U R A C Y | W I T H | W H I C H | H E | A T T E N D E D | T O | E V E R Y | F O R M | O F | C I V I L I T Y | W H I L E | H E | T O R T U R E D | M E | B Y | H I S | Q U E S T I O N S | H I S | S U S P I C I O N S | A N D | H I S | I N F E R E N C E S | W A S | A S | T O R M E N T I N G | A S | T H E | R A C K S | O F | T H E | I N Q U I S I T I O N | +H E | C E R T A I N L Y | P O S S E S S E S | T A L E N T S | B E Y O N D | T H E | R U D E | S P H E R E | I N | W H I C H | H E | M O V E S | A N D | B E I N G | N E I T H E R | D E S T I T U T E | O F | A M B I T I O N | N O R | E N C U M B E R E D | W I T H | S C R U P L E S | H E | W I L L | P R O B A B L Y | A T T E M P T | B Y | E V E R Y | M E A N S | T O | D I S T I N G U I S H | H I M S E L F | D U R I N G | T H E | P E R I O D | O F | T H E S E | U N H A P P Y | C O M M O T I O N S | +M I S T E R | M O R T O N | R E P L I E D | T H A T | F A R | F R O M | M A K I N G | A N Y | C L A I M | U P O N | H I S | G O O D | O P I N I O N | H I S | O N L Y | W I S H | A N D | T H E | S O L E | P U R P O S E | O F | H I S | V I S I T | W A S | T O | F I N D | O U T | T H E | M E A N S | O F | D E S E R V I N G | I T | +T H E Y | H E L D | C O N V E N T I C L E S | I N | T H E | O P E N | F I E L D S | A N D | B E I N G | T R E A T E D | W I T H | G R E A T | V I O L E N C E | A N D | C R U E L T Y | B Y | T H E | S C O T T I S H | G O V E R N M E N T | M O R E | T H A N | O N C E | T O O K | A R M S | D U R I N G | T H O S E | R E I G N S | +I T | W A S | O N E | O F | T H O S E | E F F E C T S | W H I C H | A | P A I N T E R | L O V E S | T O | R E P R E S E N T | A N D | M I N G L E D | W E L L | W I T H | T H E | S T R U G G L I N G | L I G H T | W H I C H | F O U N D | I T S | W A Y | B E T W E E N | T H E | B O U G H S | O F | T H E | S H A D Y | A R C H | T H A T | V A U L T E D | T H E | B R O A D | G R E E N | A L L E Y | +T H E | H O U S E | W H I C H | S E E M E D | T O | C O N S I S T | O F | T W O | O R | T H R E E | H I G H | N A R R O W | A N D | S T E E P | R O O F E D | B U I L D I N G S | P R O J E C T I N G | F R O M | E A C H | O T H E R | A T | R I G H T | A N G L E S | F O R M E D | O N E | S I D E | O F | T H E | I N C L O S U R E | +T H E | E V I L | A N D | R E M E D Y | S U C H | A S | I T | I S | S T I L L | E X I S T | B U T | T H I S | I S | R E M O T E | F R O M | O U R | P R E S E N T | P U R P O S E | A N D | I S | O N L Y | T H R O W N | O U T | F O R | C O N S I D E R A T I O N | O F | T H E | C O L L E C T O R S | U N D E R | M I S T E R | D E N T ' S | D O G | B I L L | +I T | W A S | A B O U T | N O O N | W H E N | C A P T A I N | W A V E R L E Y | E N T E R E D | T H E | S T R A G G L I N G | V I L L A G E | O R | R A T H E R | H A M L E T | O F | T U L L Y | V E O L A N | C L O S E | T O | W H I C H | W A S | S I T U A T E D | T H E | M A N S I O N | O F | T H E | P R O P R I E T O R | +E V E R Y T H I N G | A R O U N D | A P P E A R E D | S O L I T A R Y | A N D | W O U L D | H A V E | B E E N | S I L E N T | B U T | F O R | T H E | C O N T I N U E D | P L A S H I N G | O F | T H E | F O U N T A I N | A N D | T H E | W H O L E | S C E N E | S T I L L | M A I N T A I N E D | T H E | M O N A S T I C | I L L U S I O N | W H I C H | T H E | F A N C Y | O F | W A V E R L E Y | H A D | C O N J U R E D | U P | +I T | H A D | B E E N | B U I L T | A T | A | P E R I O D | W H E N | C A S T L E S | W E R E | N O | L O N G E R | N E C E S S A R Y | A N D | W H E N | T H E | S C O T T I S H | A R C H I T E C T S | H A D | N O T | Y E T | A C Q U I R E D | T H E | A R T | O F | D E S I G N I N G | A | D O M E S T I C | R E S I D E N C E | +N E I T H E R | D I D | T H E | F R O N T | I N D I C A T E | A B S O L U T E | S E C U R I T Y | F R O M | D A N G E R | +T H E | H O U S E S | S E E M E D | M I S E R A B L E | I N | T H E | E X T R E M E | E S P E C I A L L Y | T O | A N | E Y E | A C C U S T O M E D | T O | T H E | S M I L I N G | N E A T N E S S | O F | E N G L I S H | C O T T A G E S | +Y E T | T H E | P H Y S I O G N O M Y | O F | T H E | P E O P L E | W H E N | M O R E | C L O S E L Y | E X A M I N E D | W A S | F A R | F R O M | E X H I B I T I N G | T H E | I N D I F F E R E N C E | O F | S T U P I D I T Y | T H E I R | F E A T U R E S | W E R E | R O U G H | B U T | R E M A R K A B L Y | I N T E L L I G E N T | G R A V E | B U T | T H E | V E R Y | R E V E R S E | O F | S T U P I D | A N D | F R O M | A M O N G | T H E | Y O U N G | W O M E N | A N | A R T I S T | M I G H T | H A V E | C H O S E N | M O R E | T H A N | O N E | M O D E L | W H O S E | F E A T U R E S | A N D | F O R M | R E S E M B L E D | T H O S E | O F | M I N E R V A | +T H I S | W O R K | O F | A R T | W A S | T H E | W O N D E R | O F | T H E | C O U N T R Y | T E N | M I L E S | R O U N D | +T H E | C O U R T | W A S | S P A C I O U S | W E L L | P A V E D | A N D | P E R F E C T L Y | C L E A N | T H E R E | B E I N G | P R O B A B L Y | A N O T H E R | E N T R A N C E | B E H I N D | T H E | S T A B L E S | F O R | R E M O V I N G | T H E | L I T T E R | +T H I S | A V E N U E | W A S | S T R A I G H T | A N D | O F | M O D E R A T E | L E N G T H | R U N N I N G | B E T W E E N | A | D O U B L E | R O W | O F | V E R Y | A N C I E N T | H O R S E | C H E S T N U T S | P L A N T E D | A L T E R N A T E L Y | W I T H | S Y C A M O R E S | W H I C H | R O S E | T O | S U C H | H U G E | H E I G H T | A N D | N O U R I S H E D | S O | L U X U R I A N T L Y | T H A T | T H E I R | B O U G H S | C O M P L E T E L Y | O V E R | A R C H E D | T H E | B R O A D | R O A D | B E N E A T H | +O C C A S I O N A L L Y | I N D E E D | W H E N | S U C H | A | C O N S U M M A T I O N | S E E M E D | I N E V I T A B L E | A | W A T C H F U L | O L D | G R A N D A M | W I T H | H E R | C L O S E | C A P | D I S T A F F | A N D | S P I N D L E | R U S H E D | L I K E | A | S I B Y L | I N | F R E N Z Y | O U T | O F | O N E | O F | T H E S E | M I S E R A B L E | C E L L S | D A S H E D | I N T O | T H E | M I D D L E | O F | T H E | P A T H | A N D | S N A T C H I N G | U P | H E R | O W N | C H A R G E | F R O M | A M O N G | T H E | S U N B U R N T | L O I T E R E R S | S A L U T E D | H I M | W I T H | A | S O U N D | C U F F | A N D | T R A N S P O R T E D | H I M | B A C K | T O | H I S | D U N G E O N | T H E | L I T T L E | W H I T E | H E A D E D | V A R L E T | S C R E A M I N G | A L L | T H E | W H I L E | F R O M | T H E | V E R Y | T O P | O F | H I S | L U N G S | A | S H R I L L Y | T R E B L E | T O | T H E | G R O W L I N G | R E M O N S T R A N C E S | O F | T H E | E N R A G E D | M A T R O N | +S T A B L E S | A N D | O T H E R | O F F I C E S | O C C U P I E D | A N O T H E R | S I D E | O F | T H E | S Q U A R E | +T W O | B A T T L E M E N T E D | W A L L S | O N E | O F | W H I C H | F A C E D | T H E | A V E N U E | A N D | T H E | O T H E R | D I V I D E D | T H E | C O U R T | F R O M | T H E | G A R D E N | C O M P L E T E D | T H E | I N C L O S U R E | +H E R | C O M P L E X I O N | W A S | N O T | A | D E C I D E D | P I N K | B U T | A | S O F T | R O S Y | T I N T | N O T | M U C H | D E E P E R | T H A N | T H A T | O F | T R O T ' S | S K I N | +W H A T | I S | I T | C O R A L I E | S H E | A S K E D | T H E | W O M A N | +W E | D O | N O T | H A T E | Y O U | A S | Y O U | S A Y | T H E | B L U E S K I N S | D O | N O R | A R E | W E | S A V A G E | O R | C R U E L | B U T | W E | D O | N O T | W A N T | Y O U | H E R E | A N D | I | A M | R E A L L Y | P U Z Z L E D | W H A T | T O | D O | W I T H | Y O U | +T H E S E | I N T R U D E R S | A R E | V E R Y | P E C U L I A R | P E O P L E | R E M A R K E D | A | M A N | I N | T H E | C R O W D | +Y O U | A R E | N O T | L I K E | M Y | P E O P L E | T H E | P I N K I E S | A N D | T H E R E | I S | N O | P L A C E | F O R | Y O U | I N | O U R | C O U N T R Y | +W H A T | T H A T | L I T T L E | C A B I N | +A | M I S F O R T U N E | O F | B I R T H | P L A C E D | M E | H E R E | A N D | I | C A N N O T | E S C A P E | M Y | F A T E | +I N | A L L | O U R | H I S T O R Y | Y O U | A R E | T H E | F I R S T | P E O P L E | F R O M | O U T S I D E | O U R | B O R D E R S | W H O | H A V E | E V E R | S T E P P E D | A | F O O T | I N | O U R | L A N D | +I F | I | L I V E D | A S | L U X U R I O U S L Y | A S | M Y | P E O P L E | D O | A N D | H A D | S E R V A N T S | A N D | C O S T L Y | G O W N S | T H E | G O O D | P I N K I E S | W O U L D | S A Y | T H A T | T H E I R | Q U E E N | H A D | M O R E | T H A N | T H E Y | T H E M S E L V E S | A N D | I T | W O U L D | B E | T R U E | +N O | O U R | W A Y | I S | B E S T | +S H E | S M I L E D | A | L I T T L E | S A D L Y | A T | T R O T | S E E M E D | T O | A P P R O V E | B U T T O N | B R I G H T ' S | O P E N | F R A N K | F A C E | A N D | W A S | Q U I T E | S U R P R I S E D | B E C A U S E | C A P ' N | B I L L | W A S | S O | M U C H | B I G G E R | T H A N | H E R | O W N | P E O P L E | +E V E N | I N | A M E R I C A | E V E R ' B O D Y | B O W S | L O W | T O | O U R | P R E S I D E N T | A N | T H E | B L U E S K I N S | A R E | S O | F R A I D | O | T H E I R | B O O L O O R O O | T H A T | T H E Y | T R E M B L E | W H E N E V E R | T H E Y | G O | N E A R | H I M | +T H E | P E O P L E | M U S T | W A I T | O U T S I D E | F O R | T H E R E | I S | N O | R O O M | F O R | T H E M | I N | T H E | P A L A C E | +I N | T H A T | C A S E | S A I D | B U T T O N | B R I G H T | Y O U ' R E | E N T I T L E D | T O | T H E | B E S T | T H E R E | I S | T O | P A Y | F O R | Y O U R | T R O U B L E | +B U T | S U R E L Y | T H A T | I S | A L L | W R O N G | S A I D | T O U R M A L I N E | G R A V E L Y | +Y E S | I T | W A S | W E T | A N | S T I C K Y | A L L | R I G H T | A G R E E D | T H E | S A I L O R | B U T | T H E | B I G | F R O G | H E L P E D | U S | A N | W E | G O T | T H R O U G H | A L L | R I G H T | +I ' L L | L O O K | I N | T H E | G R E A T | B O O K | F I R S T | +I | H A V E | O N E | G R E A T | P R I V I L E G E | +E X C L A I M E D | T R O T | O F | C O U R S E | +T H E R E | I S | N O T H I N G | M A J E S T I C | A B O U T | M E | A S | Y O U | K N O W | V E R Y | W E L L | +P E R H A P S | Y O U | A R E | T R Y I N G | T O | R I D I C U L E | M E | S H E | C O N T I N U E D | R E G A R D I N G | T H E | S A I L O R ' S | F A C E | C L O S E L Y | +T H E | Q U E E N | H A S | N O T H I N G | B U T | T H E | P O W E R | T O | E X E C U T E | T H E | L A W S | T O | A D J U S T | G R I E V A N C E S | A N D | T O | C O M P E L | O R D E R | +I T | H A D | N O | O R N A M E N T A T I O N | B E I N G | E X C E E D I N G L Y | P L A I N | I N | A P P E A R A N C E | +A R E | Y O U | A | G I A N T | +T H E Y | S E E M | V E R Y | I G N O R A N T | P O O R | T H I N G S | S A I D | A N O T H E R | I N | R E P L Y | +I T | I S | M U C H | M O R E | D E S I R A B L E | T O | B E | A | P R I V A T E | C I T I Z E N | H A P P Y | A N D | C A R E | F R E E | +H E R E | S A I D | O N E | O F | T H E I R | G U I D E S | A S | T H E | P R O C E S S I O N | H A L T E D | B E F O R E | T H E | L I T T L E | S T O N E | B U I L D I N G | I S | T H E | P A L A C E | O F | T O U R M A L I N E | W H O | I S | O U R | Q U E E N | +S H E | W A S | A | B E A U T I F U L | G I R L | O F | A B O U T | S E V E N T E E N | Y E A R S | O F | A G E | N O T | F A T | L I K E | A L L | T H E | R E S T | O F | T H E | P I N K I E S | B U T | S L E N D E R | A N D | W E L L | F O R M E D | A C C O R D I N G | T O | O U R | O W N | I D E A S | O F | B E A U T Y | +T H E R E F O R E | I | A M | A | M E R E | A G E N T | T O | D I R E C T | T H E | L A W S | W H I C H | A R E | T H E | W I L L | O F | T H E | P E O P L E | A N D | A M | O N L Y | A | P U B L I C | S E R V A N T | O B L I G E D | C O N S T A N T L Y | T O | G U A R D | T H E | W E L F A R E | O F | M Y | S U B J E C T S | +D I D | Y O U | S U P P O S E | A | P A L A C E | W O U L D | B E | L I K E | O N E | O F | O U R | H A N D S O M E | R E S I D E N C E S | A S K E D | T H E | W O M A N | E V I D E N T L Y | S U R P R I S E D | +S O | T H E Y | F O L L O W E D | H E R | T H R O U G H | T H E | L O W | A R C H W A Y | A N D | I N | A | R O O M | B E Y O N D | V E R Y | S I M P L Y | F U R N I S H E D | S A T | A | Y O U N G | G I R L | E N G A G E D | I N | D A R N I N G | A | P A I R | O F | P I N K | S T O C K I N G S | +T H E | Q U E E N | G A Z E D | U P O N | O U R | F R I E N D S | W I T H | E V I D E N T | I N T E R E S T | +C O R A L I E | D O | Y O U | C O N S I D E R | M A J E S T Y | A | P R O P E R | W O R D | T O | U S E | W H E N | A D D R E S S I N G | A | Q U E E N | +A F T E R | M Y | D E A T H | A | P I N K | M A R B L E | S T A T U E | O F | M E | W I L L | B E | S E T | U P | I N | T H E | G R A N D | C O U R T | W I T H | T H E | S T A T U E S | O F | T H E | O T H E R | K I N G S | A N D | Q U E E N S | W H O | H A V E | R U L E D | T H I S | L A N D | A N D | A L L | T H E | P I N K I E S | I N | A G E S | T O | C O M E | W I L L | T H E N | H O N O R | M E | A S | H A V I N G | B E E N | A | J U S T | A N D | U P R I G H T | Q U E E N | T H A T | I S | M Y | R E W A R D | +H E | W A S | W I S E | I N | H I S | O W N | C O N C E I T | +O N | S U N D A Y | M O R N I N G | A | C L E A R | B E A U T I F U L | A N D | S T I L L | D A Y | T H E | O R D E R | W A S | G I V E N | F O R | T H E | W H O L E | A R M Y | T O | A D V A N C E | A N D | T O | A T T A C K | I M M E D I A T E L Y | +O N | M O N D A Y | T H E | T I D E | W A S | R E V E R S E D | +T H I S | W A S | T H E | F I R S T | B I G | B A T T L E | I N | W H I C H | O U R | R E G I M E N T | H A D | E V E R | B E E N | E N G A G E D | +T H E | R O P E | H O W E V E R | W A S | S T R O N G E R | T H A N | T H E | M U L E ' S | N O | A N D | H E | W A S | F I N A L L Y | P R E V A I L E D | U P O N | B Y | T H E | S T R E N G T H | O F | T H E | R O P E | T O | C R O S S | T H E | C R E E K | +A S | G L A D D E N | R O D E | B Y | U S | A | C O U R I E R | R O D E | U P | A N D | T O L D | H I M | S O M E T H I N G | +I | H A D | H E A R D | A N D | R E A D | O F | B A T T L E F I E L D S | S E E N | P I C T U R E S | O F | B A T T L E F I E L D S | O F | H O R S E S | A N D | M E N | O F | C A N N O N | A N D | W A G O N S | A L L | J U M B L E D | T O G E T H E R | W H I L E | T H E | G R O U N D | W A S | S T R E W N | W I T H | D E A D | A N D | D Y I N G | A N D | W O U N D E D | B U T | I | M U S T | C O N F E S S | T H A T | I | N E V E R | R E A L I Z E D | T H E | P O M P | A N D | C I R C U M S T A N C E | O F | T H E | T H I N G | C A L L E D | G L O R I O U S | W A R | U N T I L | I | S A W | T H I S | +B U T | A S | I | S A I D | B E F O R E | R E A D E R | A | P R I V A T E | S O L D I E R | I S | B U T | A N | A U T O M A T O N | A N D | K N O W S | N O T H I N G | O F | W H A T | I S | G O I N G | O N | A M O N G | T H E | G E N E R A L S | A N D | I | A M | O N L Y | G I V I N G | T H E | C H R O N I C L E S | O F | L I T T L E | T H I N G S | A N D | E V E N T S | T H A T | C A M E | U N D E R | M Y | O W N | O B S E R V A T I O N | A S | I | S A W | T H E M | T H E N | A N D | R E M E M B E R | T H E M | N O W | +T H E | F A C T | W A S | K E P T | F R O M | T H E | T R O O P S | +A B O U T | D A Y L I G H T | O N | S U N D A Y | M O R N I N G | C H A L M E R S | B R I G A D E | R E L I E V E D | G L A D D E N ' S | +O N | M Y | T A K I N G | T H E | R O P E | O F F | H E | S H O O K | H I M S E L F | A N D | S E E M E D | T O | S A Y | Y O U | T H I N K | T H A T | Y O U | A R E | M I G H T Y | S M A R T | F O L K S | B U T | Y O U | A R E | A | L E E T L E | T O O | S M A R T | +O F F I C E R S | C O U L D | N O T | C U R B | T H E | M E N | T O | K E E P | I N | L I N E | +A B O U T | T H E | T I M E | H E | P U L L E D | T R I G G E R | A | S T R A Y | B A L L | F R O M | S O M E | D I R E C T I O N | S T R U C K | H I M | I N | T H E | S I D E | A N D | H E | F E L L | O F F | D E A D | A N D | H I S | H O R S E | B E C O M I N G | F R I G H T E N E D | G A L L O P E D | O F F | D R A G G I N G | H I M | T H R O U G H | T H E | C O N F E D E R A T E | L I N E S | +M U L E | D I D | N O T | D E S I R E | T O | C R O S S | W H I L E | I | W A S | T R Y I N G | T O | P E R S U A D E | H I M | W I T H | A | B I G | S T I C K | A | R O C K | I N | H I S | E A R | A N D | A | T W I S T E R | O N | H I S | N O S E | +S H O U L D | Y O U | D E S I R E | T O | F I N D | O U T | M O R E | A B O U T | T H E | B A T T L E | I | R E F E R | Y O U | T O | H I S T O R Y | +S O | H E | G O T | A | L A R G E | T W O | I N C H | R O P E | T I E D | O N E | E N D | A R O U N D | T H E | M U L E ' S | N E C K | A N D | T H E | O T H E R | T O | T H E | C A I S S O N | A N D | O R D E R E D | T H E | D R I V E R | T O | W H I P | U P | +I | H A D | B E E N | F E E L I N G | M E A N | A L L | T H E | M O R N I N G | A S | I F | I | H A D | S T O L E N | A | S H E E P | B U T | W H E N | T H E | O R D E R | T O | C H A R G E | W A S | G I V E N | I | G O T | H A P P Y | +T H A T ' S | R I G H T | M Y | B R A V E | F I R S T | T E N N E S S E E | G I V E | E M | H A I L | C O L U M B I A | +W E | H A D | T O | P A S S | O V E R | T H E | G R O U N D | W H E R E | T R O O P S | H A D | B E E N | F I G H T I N G | A L L | D A Y | +S H I L O H | +I | F R E Q U E N T L Y | T H O U G H T | I T | W O U L D | B E | P L E A S A N T | T O | S P L I T | T H E | D I F F E R E N C E | W I T H | T H A T | M U L E | A N D | I | W O U L D | G L A D L Y | H A V E | D O N E | S O | I F | I | C O U L D | H A V E | G O T T E N | O N E | H A L F | O F | H I S | N O | +I | D O | N O T | P R E T E N D | T O | T E L L | O F | W H A T | C O M M A N D | D I S T I N G U I S H E D | I T S E L F | O F | H E R O E S | O F | B L O O D | A N D | W O U N D S | O F | S H R I E K S | A N D | G R O A N S | O F | B R I L L I A N T | C H A R G E S | O F | C A N N O N | C A P T U R E D | E T | C E T E R A | +W E | W E R E | S U P P O R T I N G | A N | A L A B A M A | B R I G A D E | +O N | M O N D A Y | M O R N I N G | I | T O O | C A P T U R E D | M E | A | M U L E | +T H E | V O I C E | A P P E A R E D | T O | B E | O V E R H E A D | +B U T | H O W | T O | G E T | H I M | O U T | W A S | T H E | U N S O L V E D | P R O B L E M | +I | D O N ' T | T H I N K | H I S | G U N | W A S | L O A D E D | T H O U G H | B E C A U S E | W E | D I D | N O T | H E A R | T H E | B A L L | W H I S T L E | +T H E | P O O R | F E L L O W | S T A Y E D | I N | T H A T | W E L L | A L L | N I G H T | +T H O S E | O L D | S O L D I E R S | H A D | L O N G | L O N G | A G O | F O R G O T T E N | A B O U T | T H A T | O L D | L A W | O F | T H E | L O N G | G O N E | P A S T | B U T | J I M | H A D | T R E A S U R E D | I T | U P | I N | H I S | M E M O R Y | L O | T H E S E | M A N Y | Y E A R S | A N D | H E | T H O U G H T | I T | W O U L D | S E R V E | H I M | N O W | A S | I T | H A D | N O | D O U B T | F R E Q U E N T L Y | D O N E | I N | T H E | P A S T | +H E | W A L K E D | U P | A N D | S A Y S | H E L L O | B O Y S | W H A T | I S | I T | B O S S | +W E | W E R E | I N U R E D | T O | P R I V A T I O N S | A N D | H A R D S H I P S | H A D | B E E N | U P O N | E V E R Y | M A R C H | I N | E V E R Y | B A T T L E | I N | E V E R Y | S K I R M I S H | I N | E V E R Y | A D V A N C E | I N | E V E R Y | R E T R E A T | I N | E V E R Y | V I C T O R Y | I N | E V E R Y | D E F E A T | +W E | W A L K E D | O V E R | T H I S | F L O A T I N G | B R I D G E | A N D | S O O N | F O U N D | O U R S E L V E S | O N | T H E | T E N N E S S E E | S I D E | O F | T E N N E S S E E | R I V E R | +W E | P A S S E D | A R O U N D | A T L A N T A | C R O S S E D | T H E | C H A T T A H O O C H E E | A N D | T R A V E L E D | B A C K | O V E R | T H E | S A M E | R O U T E | O N | W H I C H | W E | H A D | M A D E | T H E | A R D U O U S | C A M P A I G N | U N D E R | J O E | J O H N S T O N | +T H E | T H I R D | D A Y | I T | W A S | R E P O R T E D | T H A T | T H E | Y A N K E E S | H A D | T A K E N | P O S I T I O N | O N | T H E | M U R F R E E S B O R O | P I K E | +W E | L O O K E D | A L L | A R O U N D | A N D | T H O U G H T | T H A T | T H E | C O A S T | W A S | C L E A R | +A | R E G I M E N T | W A S | S E N T | T O | T H E | A T T A C K | I T | W A S | J I M ' S | R E G I M E N T | +H O W | E V E R Y | P U L S E | D I D | B E A T | A N D | L E A P | A N D | H O W | E V E R Y | H E A R T | D I D | T H R O B | W I T H | E M O T I O N S | O F | J O Y | W H I C H | S E E M E D | N E A R L Y | A K I N | T O | H E A V E N | W H E N | W E | R E C E I V E D | T H E | G L A D | I N T E L L I G E N C E | O F | O U R | O N W A R D | M A R C H | T O W A R D | T H E | L A N D | O F | P R O M I S E | A N D | O F | O U R | L O V E D | O N E S | +T H E Y | P E R S U A D E D | E L O Q U E N T L Y | +B U T | A F T E R | A W H I L E | J I M | S A Y S | G E N T L E M E N | A Y | G A N N Y | T H E | L A W | +R I G H T | B E F O R E | M E | I | S A W | T H E | L O N G | D R Y | G R A S S | A L L | B E N D I N G | T O W A R D | A | C O M M O N | C E N T E R | A N D | I | K N E W | T H A T | I T | W A S | A N | O L D | W E L L | A N D | T H A T | M Y | C O M R A D E | H A D | F A L L E N | I N | I T | +H E | H A D N ' T | S E E N | A N Y T H I N G | T O | S H O O T | A T | B U T | H E | B L A Z E D | A W A Y | H E | L O A D E D | A N D | F I R E D | T H E | S E C O N D | T I M E | W H E N | T H E Y | W E R E | O R D E R E D | T O | R E T R E A T | +H E | W A N T E D | T O | G O | B Y | H O M E | A N D | T E L L | H I S | W I F E | A N D | C H I L D R E N | G O O D | B Y E | A N D | T O | G E T | H I S | C L O T H E S | I T | W A S | N O | G O | +W E | H A D | B E E F | F O R | S U P P E R | T H A T | N I G H T | +A | Y A N K E E | A L W A Y S | S A Y S | N A G E R | +Y A N K | S A Y S | W H A T | Y O U | D O I N G | J O H N N Y | +A D V A N C E | I N T O | T E N N E S S E E | +A | M A N | I N | T H E | W E L L | +O U T S I D E | O F | T H E S E | O C C A S I O N A L | R E M I N D E R S | W E | C O U L D | S E E | N O | E V I D E N C E | O F | T H E | D E S O L A T I O N | O F | T H E | T R A C K | O F | A N | I N V A D I N G | A R M Y | +Y O U | S E E | J I M | K N O W E D | T H E | L A W | +W E | W E R E | N O T | T W E N T Y | Y A R D S | O F F | F R O M | T H E | Y A N K E E S | A N D | T H E Y | W E R E | P O U R I N G | T H E | H O T | S H O T | A N D | S H E L L S | R I G H T | I N T O | O U R | R A N K S | A N D | E V E R Y | M A N | W A S | Y E L L I N G | A T | T H E | T O P | O F | H I S | V O I C E | C E A S E | F I R I N G | Y O U | A R E | F I R I N G | O N | Y O U R | O W N | M E N | C E A S E | F I R I N G | Y O U | A R E | F I R I N G | O N | Y O U R | O W N | M E N | +I | S O O N | F O U N D | O U T | T H A T | H E | H A D | C A U G H T | S I G H T | O F | T H E | R E L I E F | O N | T H E | R O A D | A N D | W A S | A F R A I D | T O | S H O O T | I | Q U I C K L Y | M A D E | U P | M Y | M I N D | +W E | K E P T | F A L L I N G | B A C K | A N D | F I R I N G | A L L | D A Y | A N D | W E R E | R E L I E V E D | B Y | A N O T H E R | R E G I M E N T | A B O U T | D A R K | W E | R E J O I N E D | O U R | R E G I M E N T | +I | T H I N K | W E | M U S T | H A V E | K I L L E D | A | G O O D | M A N Y | I N | T H E | O L D | F I E L D | B E C A U S E | W E | W E R E | F I R I N G | A L L | T H E | T I M E | A T | T H E | S O L I D | L I N E | A S | T H E Y | A D V A N C E D | U P O N | U S | +M Y | G U N | W A S | A T | M Y | F E E T | A N D | O N E | S T E P | W O U L D | G E T | I T | +T H E | P R I V A T E | C O U L D | B U T | H E | W A S | N O | G E N E R A L | Y O U | S E E | +W E | R E M A I N E D | S E V E R A L | M O N T H S | B U T | S O O N | W E | W E R E | O N | T H E | T R A M P | A G A I N | +I | T H O U G H T | I T | H A D | B E E N | T O R N | F R O M | M Y | S H O U L D E R | +I | M A D E | A | Q U I C K | G L A N C E | O V E R | M Y | S H O U L D E R | A N D | G R A B B E D | A T | M Y | G U N | +F R O M | T I M E | T O | T I M E | D I F F E R E N T | R E G I M E N T S | W E R E | S E N T | F O R W A R D | T O | D O | P I C K E T | D U T Y | +H E | D I V I N E D | M Y | M O T I V E | A N D | F I R E D | T H E | B A L L | M I S S E D | I T S | A I M | +T H E | Y A N K E E | P I C K E T | L I N E S | W E R E | N O T | A | H A L F | M I L E | O F F | +I | A M | A | V I D E T | Y O U | K N O W | T H E | R E S P O N S I B I L I T Y | R E S T I N G | O N | M E | +W E | W E R E | O R D E R E D | F O R W A R D | T O | T H E | A T T A C K | +B U T | I | C O U L D | N O T | B E A R | T H E | T H O U G H T | O F | W E A R I N G | D E A D | M E N ' S | S H O E S | +I | L O O K E D | A T | I T | P R E T T Y | C L O S E | A N D | I | S A I D | G R E A T | G O D | +H E | W A S | W A L K I N G | A L O N G | W H E N | A L L | A T | O N C E | H E | D R O P P E D | D O W N | A N D | D I E D | W I T H O U T | A | S T R U G G L E | O R | A | G R O A N | +S A Y S | H E | I | W O U L D | N O T | T R U S T | A | S E C E S H | O N | H I S | W O R D | O A T H | O R | B O N D | M A R C H | I | S A Y | +I | S A W | A N D | F E L T | T H A T | H E | W A S | N O T | F I G H T I N G | F O R | G L O R Y | B U T | T H A T | H E | W A S | F I G H T I N G | F O R | H I S | C O U N T R Y | B E C A U S E | H E | L O V E D | T H A T | C O U N T R Y | A N D | H E | W A S | W I L L I N G | T O | G I V E | H I S | L I F E | F O R | H I S | C O U N T R Y | A N D | T H E | S U C C E S S | O F | O U R | C A U S E | +B A D | G E N E R A L S H I P | I | T H O U G H T | I T | W A S | C H R I S T M A S | +O A K L E Y | C O L O R | B E A R E R | O F | T H E | F O U R T H | T E N N E S S E E | R E G I M E N T | R A N | R I G H T | U P | I N | T H E | M I D S T | O F | T H E | Y A N K E E | L I N E | W I T H | H I S | C O L O R S | B E G G I N G | H I S | M E N | T O | F O L L O W | +O U R | A R M Y | S T O P P E D | A T | M U R F R E E S B O R O | +W E | W E R E | A T | T H A T | T I M E | A T | L E A S T | A | H U N D R E D | Y A R D S | I N | A D V A N C E | O F | T H E | B R I G A D E | C H E A T H A M | A L L | T H E | T I M E | C A L L I N G | U P O N | T H E | M E N | T O | C O M E | O N | +W E | W E R E | R I G H T | U P O N | T H E | Y A N K E E | L I N E | O N | T H E | W I L K E R S O N | T U R N P I K E | +H E | W A S | S T O N E | D E A D | B U T | I | D R O P P E D | T H A T | F O O T | Q U I C K | +O U R | P I C K E T S | H A D | R U N | I N | A N D | R E P O R T E D | A | N I G H T | A T T A C K | +T H E | F E D E R A L | A R M Y | W A S | C O N C E N T R A T I N G | A T | N A S H V I L L E | T H E R E | W A S | N O | R E S T | F O R | T H E | W E A R Y | +T H E | L E A D E N | H A I L | S T O R M | S W E P T | T H E M | O F F | T H E | F I E L D | T H E Y | F E L L | B A C K | A N D | R E | F O R M E D | +B E F O R E | W E | A R R I V E D | A T | T H E | H O U S E | W E | S A W | A | B O D Y | O F | Y A N K E E S | A P P R O A C H I N G | A N D | A S | W E | S T A R T E D | T O | R U N | B A C K | T H E Y | F I R E D | U P O N | U S | +L I N E | O F | B A T T L E | W A S | F O R M E D | O N | T H E | N O R T H | B A N K | O F | S T O N E ' S | R I V E R | O N | T H E | Y A N K E E | S I D E | +T H E | Y A N K E E S | M A R C H E D | O V E R | T H E | H I L L | O U T | O F | S I G H T | +I | C A L L E D | L I E U T E N A N T | C O L O N E L | F R I E R S O N ' S | A T T E N T I O N | T O | T H E | Y A N K E E S | A N D | H E | R E M A R K E D | W E L L | I | D O N ' T | K N O W | W H E T H E R | T H E Y | A R E | Y A N K E E S | O R | N O T | B U T | I F | T H E Y | A R E | T H E Y | W I L L | C O M E | O U T | O F | T H E R E | M I G H T Y | Q U I C K | +A S | S O O N | A S | E V E R | O F | M Y | S E C O N D | A G E | I | W A S | U P O N | T H E | T H R E S H O L D | A N D | C H A N G E D | L I F E | H I M S E L F | F R O M | M E | H E | T O O K | A N D | G A V E | T O | O T H E R S | +B U T | W I T H | F U L L | R A V I S H M E N T | T H E | H O U R S | O F | P R I M E | S I N G I N G | R E C E I V E D | T H E Y | I N | T H E | M I D S T | O F | L E A V E S | T H A T | E V E R | B O R E | A | B U R D E N | T O | T H E I R | R H Y M E S | +B E T W E E N | H E R | S T E P S | A N D | M I N E | W E R E | N O T | A | H U N D R E D | W H E N | E Q U A L L Y | T H E | M A R G I N S | G A V E | A | T U R N | I N | S U C H | A | W A Y | T H A T | T O | T H E | E A S T | I | F A C E D | +T H E S E | S T A N D A R D S | T O | T H E | R E A R W A R D | L O N G E R | W E R E | T H A N | W A S | M Y | S I G H T | A N D | A S | I T | S E E M E D | T O | M E | T E N | P A C E S | W E R E | T H E | O U T E R M O S T | A P A R T | +I | S A W | T H E | L A D Y | W H O | E R E W H I L E | A P P E A R E D | V E I L E D | U N D E R N E A T H | T H E | A N G E L I C | F E S T I V A L | D I R E C T | H E R | E Y E S | T O | M E | A C R O S S | T H E | R I V E R | +B Y | H I S | D E F A U L T | S H O R T | W H I L E | H E | S O J O U R N E D | H E R E | B Y | H I S | D E F A U L T | T O | W E E P I N G | A N D | T O | T O I L | H E | C H A N G E D | H I S | I N N O C E N T | L A U G H T E R | A N D | S W E E T | P L A Y | +T H I S | E V E R Y | O T H E R | S A V O U R | D O T H | T R A N S C E N D | A N D | N O T W I T H S T A N D I N G | S L A K E D | S O | F A R | M A Y | B E | T H Y | T H I R S T | T H A T | I | R E V E A L | T O | T H E E | N O | M O R E | +A S | S O O N | A S | O N | M Y | V I S I O N | S M O T E | T H E | P O W E R | S U B L I M E | T H A T | H A D | A L R E A D Y | P I E R C E D | M E | T H R O U G H | E R E | F R O M | M Y | B O Y H O O D | I | H A D | Y E T | C O M E | F O R T H | +Y E | K E E P | Y O U R | W A T C H | I N | T H E | E T E R N A L | D A Y | S O | T H A T | N O R | N I G H T | N O R | S L E E P | C A N | S T E A L | F R O M | Y O U | O N E | S T E P | T H E | A G E S | M A K E | U P O N | T H E I R | P A T H | +T O | T H E | L E F T | H A N D | I | T U R N E D | W I T H | T H A T | R E L I A N C E | W I T H | W H I C H | T H E | L I T T L E | C H I L D | R U N S | T O | H I S | M O T H E R | W H E N | H E | H A S | F E A R | O R | W H E N | H E | I S | A F F L I C T E D | +N O T | O N L Y | R O M E | W I T H | N O | S U C H | S P L E N D I D | C A R | E ' E R | G L A D D E N E D | A F R I C A N U S | O R | A U G U S T U S | B U T | P O O R | T O | I T | T H A T | O F | T H E | S U N | W O U L D | B E | +A N D | W H E N | T H E | C A R | W A S | O P P O S I T E | T O | M E | T H U N D E R | W A S | H E A R D | A N D | A L L | T H A T | F O L K | A U G U S T | S E E M E D | T O | H A V E | F U R T H E R | P R O G R E S S | I N T E R D I C T E D | +C O N F U S I O N | A N D | D I S M A Y | T O G E T H E R | M I N G L E D | F O R C E D | S U C H | A | Y E S | F R O M | O U T | M Y | M O U T H | T H A T | S I G H T | W A S | N E E D F U L | T O | T H E | U N D E R S T A N D I N G | O F | I T | +T O | S A Y | U N T O | V I R G I L I U S | N O T | A | D R A C H M | O F | B L O O D | R E M A I N S | I N | M E | T H A T | D O E S | N O T | T R E M B L E | I | K N O W | T H E | T R A C E S | O F | T H E | A N C I E N T | F L A M E | +T H E | G O O D | S U P R E M E | S O L E | I N | I T S E L F | D E L I G H T I N G | C R E A T E D | M A N | G O O D | A N D | T H I S | G O O D L Y | P L A C E | G A V E | H I M | A S | H A N S E L | O F | E T E R N A L | P E A C E | +T H O U | M A K E S T | M E | R E M E M B E R | W H E R E | A N D | W H A T | P R O S E R P I N A | T H A T | M O M E N T | W A S | W H E N | L O S T | H E R | M O T H E R | H E R | A N D | S H E | H E R S E L F | T H E | S P R I N G | +I | D O | N O T | T H I N K | T H E R E | S H O N E | S O | G R E A T | A | L I G H T | U N D E R | T H E | L I D S | O F | V E N U S | W H E N | T R A N S F I X E D | B Y | H E R | O W N | S O N | B E Y O N D | H I S | U S U A L | C U S T O M | +B U T | B Y | T H E | L A R G E S S | O F | C E L E S T I A L | G R A C E S | W H I C H | H A V E | S U C H | L O F T Y | V A P O U R S | F O R | T H E I R | R A I N | T H A T | N E A R | T O | T H E M | O U R | S I G H T | A P P R O A C H E S | N O T | +D A N T E | B E C A U S E | V I R G I L I U S | H A S | D E P A R T E D | D O | N O T | W E E P | Y E T | D O | N O T | W E E P | Y E T | A W H I L E | F O R | B Y | A N O T H E R | S W O R D | T H O U | N E E D ' S T | M U S T | W E E P | +A N D | O N E | O F | T H E M | A S | I F | B Y | H E A V E N | C O M M I S S I O N E D | S I N G I N G | V E N I | S P O N S A | D E | L I B A N O | S H O U T E D | T H R E E | T I M E S | A N D | A L L | T H E | O T H E R S | A F T E R | +Y E | A R E | N E W | C O M E R S | A N D | B E C A U S E | I | S M I L E | B E G A N | S H E | P E R A D V E N T U R E | I N | T H I S | P L A C E | E L E C T | T O | H U M A N | N A T U R E | F O R | I T S | N E S T | +T H R E E | M A I D E N S | A T | T H E | R I G H T | W H E E L | I N | A | C I R C L E | C A M E | O N W A R D | D A N C I N G | O N E | S O | V E R Y | R E D | T H A T | I N | T H E | F I R E | S H E | H A R D L Y | H A D | B E E N | N O T E D | +L O O K | A T | M E | W E L L | I N | S O O T H | I ' M | B E A T R I C E | +A L L | W A T E R S | T H A T | O N | E A R T H | M O S T | L I M P I D | A R E | W O U L D | S E E M | T O | H A V E | W I T H I N | T H E M S E L V E S | S O M E | M I X T U R E | C O M P A R E D | W I T H | T H A T | W H I C H | N O T H I N G | D O T H | C O N C E A L | +W H E N C E | S H E | T O | M E | I N | T H O S E | D E S I R E S | O F | M I N E | W H I C H | L E D | T H E E | T O | T H E | L O V I N G | O F | T H A T | G O O D | B E Y O N D | W H I C H | T H E R E | I S | N O T H I N G | T O | A S P I R E | T O | +N O W | H E L I C O N | M U S T | N E E D S | P O U R | F O R T H | F O R | M E | A N D | W I T H | H E R | C H O I R | U R A N I A | M U S T | A S S I S T | M E | T O | P U T | I N | V E R S E | T H I N G S | D I F F I C U L T | T O | T H I N K | +T H E | I N T E R V A L | B E T W E E N | T H E S E | F O U R | C O N T A I N E D | A | C H A R I O T | T R I U M P H A L | O N | T W O | W H E E L S | W H I C H | B Y | A | G R I F F I N ' S | N E C K | C A M E | D R A W N | A L O N G | +N O R | E V E N | T H U S | O U R | W A Y | C O N T I N U E D | F A R | B E F O R E | T H E | L A D Y | W H O L L Y | T U R N E D | H E R S E L F | U N T O | M E | S A Y I N G | B R O T H E R | L O O K | A N D | L I S T E N | +A N D | I | B E H E L D | T H E | F L A M E L E T S | O N W A R D | G O | L E A V I N G | B E H I N D | T H E M S E L V E S | T H E | A I R | D E P I C T E D | A N D | T H E Y | O F | T R A I L I N G | P E N N O N S | H A D | T H E | S E M B L A N C E | S O | T H A T | I T | O V E R H E A D | R E M A I N E D | D I S T I N C T | W I T H | S E V E N F O L D | L I S T S | A L L | O F | T H E M | O F | T H E | C O L O U R S | W H E N C E | T H E | S U N ' S | B O W | I S | M A D E | A N D | D E L I A ' S | G I R D L E | +T H E R E F O R E | M Y | A N S W E R | I S | W I T H | G R E A T E R | C A R E | T H A T | H E | M A Y | H E A R | M E | W H O | I S | W E E P I N G | Y O N D E R | S O | T H A T | T H E | S I N | A N D | D O L E | B E | O F | O N E | M E A S U R E | +I N | R E A R | O F | A L L | T H E | G R O U P | H E R E | T R E A T E D | O F | T W O | O L D | M E N | I | B E H E L D | U N L I K E | I N | H A B I T | B U T | L I K E | I N | G A I T | E A C H | D I G N I F I E D | A N D | G R A V E | +A N D | W H A T | A L L U R E M E N T S | O R | W H A T | V A N T A G E S | U P O N | T H E | F O R E H E A D | O F | T H E | O T H E R S | S H O W E D | T H A T | T H O U | S H O U L D S T | T U R N | T H Y | F O O T S T E P S | U N T O | T H E M | +T H E N | B A C K | I | T U R N E D | M Y | F A C E | T O | T H O S E | H I G H | T H I N G S | W H I C H | M O V E D | T H E M S E L V E S | T O W A R D S | U S | S O | S E D A T E L Y | T H E Y | H A D | B E E N | D I S T A N C E D | B Y | N E W | W E D D E D | B R I D E S | +M U S T | I | L E A V E | A L O N E | N O | +M Y | F A T H E R | H A S | R E V E A L E D | T H E | C U L P R I T ' S | N A M E | M Y | F A T H E R | T H I R S T S | F O R | R E V E N G E | A S | M U C H | A S | Y O U | D O | Y E T | E V E N | H E | C O N J U R E S | Y O U | A S | I | D O | T O | K E E P | T H I S | S E C R E T | D O | Y O U | N O T | F A T H E R | +A N D | T H E | C R Y | I S S U E D | F R O M | H I S | P O R E S | I F | W E | M A Y | T H U S | S P E A K | A | C R Y | F R I G H T F U L | I N | I T S | S I L E N C E | +T H E | O L D | M A N ' S | E Y E S | R E M A I N E D | F I X E D | O N | T H E | D O O R | +B U T | I N | L E S S | T H A N | F I V E | M I N U T E S | T H E | S T A I R C A S E | G R O A N E D | B E N E A T H | A N | E X T R A O R D I N A R Y | W E I G H T | +T H E | T W O | D O C T O R S | T H E R E F O R E | E N T E R E D | T H E | R O O M | A L O N E | +I | A M | G O I N G | S I R | A N D | I | D O | N O T | H E S I T A T E | T O | S A Y | T H A T | N O | P R A Y E R S | W I L L | B E | M O R E | F E R V E N T | T H A N | M I N E | +D ' A V R I G N Y | U N A B L E | T O | B E A R | T H E | S I G H T | O F | T H I S | T O U C H I N G | E M O T I O N | T U R N E D | A W A Y | A N D | V I L L E F O R T | W I T H O U T | S E E K I N G | A N Y | F U R T H E R | E X P L A N A T I O N | A N D | A T T R A C T E D | T O W A R D S | H I M | B Y | T H E | I R R E S I S T I B L E | M A G N E T I S M | W H I C H | D R A W S | U S | T O W A R D S | T H O S E | W H O | H A V E | L O V E D | T H E | P E O P L E | F O R | W H O M | W E | M O U R N | E X T E N D E D | H I S | H A N D | T O W A R D S | T H E | Y O U N G | M A N | +G E N T L E M E N | H E | S A I D | I N | A | H O A R S E | V O I C E | G I V E | M E | Y O U R | W O R D | O F | H O N O R | T H A T | T H I S | H O R R I B L E | S E C R E T | S H A L L | F O R E V E R | R E M A I N | B U R I E D | A M O N G S T | O U R S E L V E S | T H E | T W O | M E N | D R E W | B A C K | +D ' A V R I G N Y | R U S H E D | T O W A R D S | T H E | O L D | M A N | A N D | M A D E | H I M | I N H A L E | A | P O W E R F U L | R E S T O R A T I V E | +M O R R E L | S U F F E R E D | A N | E X C L A M A T I O N | O F | H O R R O R | A N D | S U R P R I S E | T O | E S C A P E | H I M | +A S K E D | M O R R E L | Y E S | +I T | W A S | S O M E T H I N G | T E R R I B L E | T O | W I T N E S S | T H E | S I L E N T | A G O N Y | T H E | M U T E | D E S P A I R | O F | N O I R T I E R | W H O S E | T E A R S | S I L E N T L Y | R O L L E D | D O W N | H I S | C H E E K S | +G O | D O | Y O U | H E A R | +T H E | D I S T R I C T | D O C T O R | A P P R O A C H E D | W I T H | T H E | I N D I F F E R E N C E | O F | A | M A N | A C C U S T O M E D | T O | S P E N D | H A L F | H I S | T I M E | A M O N G S T | T H E | D E A D | H E | T H E N | L I F T E D | T H E | S H E E T | W H I C H | W A S | P L A C E D | O V E R | T H E | F A C E | A N D | J U S T | U N C L O S E D | T H E | L I P S | +S A I D | M O R R E L | S A D L Y | Y E S | R E P L I E D | N O I R T I E R | +O H | Y O U | R A V E | S I R | E X C L A I M E D | V I L L E F O R T | I N | V A I N | E N D E A V O R I N G | T O | E S C A P E | T H E | N E T | I N | W H I C H | H E | W A S | T A K E N | I | R A V E | +D O | Y O U | K N O W | T H E | A S S A S S I N | A S K E D | M O R R E L | +T H E | O L D | M A N | M A D E | A | S I G N | I N | T H E | A F F I R M A T I V E | +N O I R T I E R | W A S | N E A R | T H E | B E D | P A L E | M O T I O N L E S S | A N D | S I L E N T | A S | T H E | C O R P S E | +T H E | N E A R E S T | S A I D | T H E | D I S T R I C T | D O C T O R | I S | A | G O O D | I T A L I A N | A B B E | W H O | L I V E S | N E X T | D O O R | T O | Y O U | S H A L L | I | C A L L | O N | H I M | A S | I | P A S S | +A T | T H I S | M O M E N T | T H E | W H O L E | S O U L | O F | T H E | O L D | M A N | S E E M E D | C E N T R E D | I N | H I S | E Y E S | W H I C H | B E C A M E | B L O O D S H O T | T H E | V E I N S | O F | T H E | T H R O A T | S W E L L E D | H I S | C H E E K S | A N D | T E M P L E S | B E C A M E | P U R P L E | A S | T H O U G H | H E | W A S | S T R U C K | W I T H | E P I L E P S Y | N O T H I N G | W A S | W A N T I N G | T O | C O M P L E T E | T H I S | B U T | T H E | U T T E R A N C E | O F | A | C R Y | +W H A T | D O | Y O U | M E A N | S I R | +B U T | C A N | H E | U N D E R S T A N D | Y O U | Y E S | +D ' A V R I G N Y | S A I D | V I L L E F O R T | B E | S O | K I N D | I | B E S E E C H | Y O U | A S | T O | A C C O M P A N Y | T H I S | G E N T L E M A N | H E R E | I S | T H E | K E Y | O F | T H E | D O O R | S O | T H A T | Y O U | C A N | G O | I N | A N D | O U T | A S | Y O U | P L E A S E | Y O U | W I L L | B R I N G | T H E | P R I E S T | W I T H | Y O U | A N D | W I L L | O B L I G E | M E | B Y | I N T R O D U C I N G | H I M | I N T O | M Y | C H I L D ' S | R O O M | D O | Y O U | W I S H | T O | S E E | H I M | +B U T | H E | S T O P P E D | O N | T H E | L A N D I N G | H E | H A D | N O T | T H E | C O U R A G E | T O | A G A I N | V I S I T | T H E | D E A T H | C H A M B E R | +I | O N L Y | W I S H | T O | B E | A L O N E | Y O U | W I L L | E X C U S E | M E | W I L L | Y O U | N O T | +N O I R T I E R | L O O K E D | U P O N | M O R R E L | W I T H | O N E | O F | T H O S E | M E L A N C H O L Y | S M I L E S | W H I C H | H A D | S O | O F T E N | M A D E | V A L E N T I N E | H A P P Y | A N D | T H U S | F I X E D | H I S | A T T E N T I O N | +F O R | S O M E | T I M E | N O T H I N G | W A S | H E A R D | I N | T H A T | C H A M B E R | B U T | S O B S | E X C L A M A T I O N S | A N D | P R A Y E R S | +I | C O U L D | N O T | T A K E | M Y | E Y E S | O F F | T H E | M A N | I N | T H E | B E D | +T H E | L I T T L E | H O U S E | O N | T H E | H I L L S I D E | W A S | S O | M U C H | T H E | C O L O R | O F | T H E | N I G H T | T H A T | W E | C O U L D | N O T | S E E | I T | A S | W E | C A M E | U P | T H E | D R A W | +S H E | A S K E D | P E T E R | T O | W A I T | A | M O M E N T | A N D | W H E N | S H E | C A M E | B A C K | F R O M | T H E | K I T C H E N | S H E | B R O U G H T | A | B A G | O F | S A N D W I C H E S | A N D | D O U G H N U T S | F O R | U S | +H E | L A Y | P A T I E N T L Y | F I G H T I N G | F O R | B R E A T H | L I K E | A | C H I L D | W I T H | C R O U P | +W H E N | H E | W A S | O U T | H U N T I N G | H E | U S E D | T O | G O | I N T O | T H E | E M P T Y | L O G | H O U S E | A N D | S I T | T H E R E | B R O O D I N G | +P E T E R | C R O U C H I N G | I N | T H E | F R O N T | S E A T | S A W | N O T H I N G | +W I T H O U T | A | W O R D | P E T E R | G O T | U P | A N D | L I T | H I S | L A N T E R N | +Q U I C K L Y | I T | W A S | C O V E R E D | W I T H | B R I G H T | R E D | S P O T S | I | T H O U G H T | I | H A D | N E V E R | S E E N | A N Y | B L O O D | S O | B R I G H T | +T H E | R O A D | W A S | C L E A R | A N D | W H I T E | A N D | T H E | G R O O M ' S | T H R E E | B L A C K S | W E N T | L I K E | T H E | W I N D | +T H E Y | M A D E | M E | T H I N K | O F | D E F E A T E D | A R M I E S | R E T R E A T I N G | O R | O F | G H O S T S | W H O | W E R E | T R Y I N G | D E S P E R A T E L Y | T O | G E T | I N | F O R | S H E L T E R | A N D | T H E N | W E N T | M O A N I N G | O N | +T H E | S H A R P | S M E L L | O F | S P I R I T S | W E N T | T H R O U G H | T H E | R O O M | +Y E S | H O W | M A N Y | +W H E R E V E R | T H E Y | W E N T | T H E | S T O R Y | F O L L O W E D | T H E M | +T H I S | C A B I N | W A S | H I S | H E R M I T A G E | U N T I L | T H E | W I N T E R | S N O W S | P E N N E D | H I M | I N | H I S | C A V E | +T H E | S H R I E K S | T H A T | F O L L O W E D | M A D E | E V E R Y B O D Y | S O B E R | +A N D | T H E | W O L V E S | P A V E L | A S K E D | E N O U G H | E N O U G H | F O R | A L L | O F | U S | +S O M E T H I N G | H A P P E N E D | T O | T H E | H I N D M O S T | S L E D G E | T H E | D R I V E R | L O S T | C O N T R O L | H E | W A S | P R O B A B L Y | V E R Y | D R U N K | T H E | H O R S E S | L E F T | T H E | R O A D | T H E | S L E D G E | W A S | C A U G H T | I N | A | C L U M P | O F | T R E E S | A N D | O V E R T U R N E D | +F R O M | O U R | B E N C H | W E | C O U L D | S E E | W H A T | A | H O L L O W | C A S E | H I S | B O D Y | W A S | +D U R I N G | T H E | A U C T I O N | H E | W E N T | A B O U T | W I T H | H I S | H E A D | D O W N | A N D | N E V E R | L I F T E D | H I S | E Y E S | +G R A D U A L L Y | R E L I E F | C A M E | T O | A L L | O F | U S | +T H E | S I C K | M A N | R A G E D | A N D | S H O O K | H I S | F I S T | +T H E | L O S S | O F | H I S | T W O | F R I E N D S | H A D | A | D E P R E S S I N G | E F F E C T | U P O N | O L D | M I S T E R | S H I M E R D A | +M I S T E R | S H I M E R D A | W E N T | W I T H | H I M | +I T | S E E M E D | T O | M E | T H A T | H E | D E S P I S E D | H I M | F O R | B E I N G | S O | S I M P L E | A N D | D O C I L E | +A N T O N I A ' S | F A T H E R | U N C O V E R E D | O N E | O F | H I S | L O N G | B O N Y | L E G S | A N D | R U B B E D | I T | R H Y T H M I C A L L Y | +T H E | F I R S T | H O W L S | W E R E | T A K E N | U P | A N D | E C H O E D | A N D | W I T H | Q U I C K E N I N G | R E P E T I T I O N S | +P E T E R | T O L D | H I S | T R O U B L E S | T O | M I S T E R | S H I M E R D A | H E | W A S | U N A B L E | T O | M E E T | A | N O T E | W H I C H | F E L L | D U E | O N | T H E | F I R S T | O F | N O V E M B E R | H A D | T O | P A Y | A N | E X O R B I T A N T | B O N U S | O N | R E N E W I N G | I T | A N D | T O | G I V E | A | M O R T G A G E | O N | H I S | P I G S | A N D | H O R S E S | A N D | E V E N | H I S | M I L K | C O W | +A | B L A C K | D R O V E | C A M E | U P | O V E R | T H E | H I L L | B E H I N D | T H E | W E D D I N G | P A R T Y | +T W E N T Y | T H I R T Y | E N O U G H | +W E | L A Y | S T I L L | A N D | D I D | N O T | T A L K | +T H E Y | W E R E | R U N | O U T | O F | T H E I R | V I L L A G E | +T H E Y | W O R K E D | I N | C H I C A G O | D E S | M O I N E S | F O R T | W A Y N E | B U T | T H E Y | W E R E | A L W A Y S | U N F O R T U N A T E | +T H E | F I R S T | T H I N G | E I T H E R | O F | T H E M | N O T I C E D | W A S | A | N E W | S O U N D | T H A T | B R O K E | I N T O | T H E | C L E A R | A I R | L O U D E R | T H A N | T H E Y | H A D | E V E R | H E A R D | I T | B E F O R E | T H E | B E L L | O F | T H E | M O N A S T E R Y | O F | T H E I R | O W N | V I L L A G E | R I N G I N G | F O R | E A R L Y | P R A Y E R S | +P E T E R | C O U L D | G I V E | N O | V E R Y | C L E A R | A C C O U N T | O F | H I S | T R A N S A C T I O N S | W I T H | C U T T E R | +E V E R Y | O N E | S A I D | P E T E R | K I S S E D | T H E | C O W | B E F O R E | S H E | W A S | L E D | A W A Y | B Y | H E R | N E W | O W N E R | +H E | S E E M E D | T O | B E | C U R S I N G | P E O P L E | W H O | H A D | W R O N G E D | H I M | +T H E Y | W E R E | W I T H I N | A | F E W | M I L E S | O F | T H E I R | V I L L A G E | N O W | +T H E R E | A R E | O N L Y | T H R E E | S L E D G E S | L E F T | H E | W H I S P E R E D | +P A V E L | K N O C K E D | H I M | O V E R | T H E | S I D E | O F | T H E | S L E D G E | A N D | T H R E W | T H E | G I R L | A F T E R | H I M | +A F T E R | T H E | C E R E M O N Y | A T | T H E | C H U R C H | T H E | P A R T Y | W E N T | T O | A | D I N N E R | G I V E N | B Y | T H E | P A R E N T S | O F | T H E | B R I D E | +N O W | H I S | M I D D L E | H O R S E | W A S | B E I N G | A L M O S T | D R A G G E D | B Y | T H E | O T H E R | T W O | +I | E X P L A I N E D | T O | A N T O N I A | H O W | T H I S | M E A N T | T H A T | H E | W A S | T W E N T Y | F O U R | Y E A R S | O L D | T H A T | H E | M U S T | H A V E | B E E N | T H E R E | W H E N | W H I T E | M E N | F I R S T | C A M E | L E F T | O N | F R O M | B U F F A L O | A N D | I N D I A N | T I M E S | +I | F O L L O W E D | W I T H | T H E | S P A D E | O V E R | M Y | S H O U L D E R | D R A G G I N G | M Y | S N A K E | +I | N E V E R | K N O W | Y O U | W A S | S O | B R A V E | J I M | S H E | W E N T | O N | C O M F O R T I N G L Y | +I | W H I R L E D | R O U N D | A N D | T H E R E | O N | O N E | O F | T H O S E | D R Y | G R A V E L | B E D S | W A S | T H E | B I G G E S T | S N A K E | I | H A D | E V E R | S E E N | +H E | C O U L D | S T A N D | R I G H T | U P | A N D | T A L K | T O | Y O U | H E | C O U L D | D I D | H E | F I G H T | H A R D | +O T T O | W I N K E D | A T | M E | +O N E | D A Y | W H E N | I | R O D E | O V E R | T O | T H E | S H I M E R D A S | I | F O U N D | A N T O N I A | S T A R T I N G | O F F | O N | F O O T | F O R | R U S S I A N | P E T E R ' S | H O U S E | T O | B O R R O W | A | S P A D E | A M B R O S C H | N E E D E D | +T H E R E | H A D | B E E N | A N O T H E R | B L A C K | F R O S T | T H E | N I G H T | B E F O R E | A N D | T H E | A I R | W A S | C L E A R | A N D | H E A D Y | A S | W I N E | +W E | D E C I D E D | T H A T | A N T O N I A | S H O U L D | R I D E | D U D E | H O M E | A N D | I | W O U L D | W A L K | +A | S N A K E | O F | H I S | S I Z E | I N | F I G H T I N G | T R I M | W O U L D | B E | M O R E | T H A N | A N Y | B O Y | C O U L D | H A N D L E | +O T T O | F U C H S | W A S | T H E | F I R S T | O N E | W E | M E T | +L O O K | T O N Y | T H A T ' S | H I S | P O I S O N | I | S A I D | +T H I S | C H A N G E | C A M E | A B O U T | F R O M | A N | A D V E N T U R E | W E | H A D | T O G E T H E R | +A | F A I N T | F E T I D | S M E L L | C A M E | F R O M | H I M | A N D | A | T H R E A D | O F | G R E E N | L I Q U I D | O O Z E D | F R O M | H I S | C R U S H E D | H E A D | +S H E | W A S | F O U R | Y E A R S | O L D E R | T H A N | I | T O | B E | S U R E | A N D | H A D | S E E N | M O R E | O F | T H E | W O R L D | B U T | I | W A S | A | B O Y | A N D | S H E | W A S | A | G I R L | A N D | I | R E S E N T E D | H E R | P R O T E C T I N G | M A N N E R | +I | K N O W | I | A M | J U S T | A W F U L | J I M | I | W A S | S O | S C A R E D | +I T | W A S | O N | O N E | O F | T H E S E | G R A V E L | B E D S | T H A T | I | M E T | M Y | A D V E N T U R E | +I T | W A S | T H E | S E A S O N | W H E N | T H E | A N C I E N T | S U N | G O D | H A D | B E E N | A C C U S T O M E D | T O | R E C E I V E | H I S | A N N U A L | O B L A T I O N S | A N D | W E | C A N | W E L L | B E L I E V E | T H A T | T H O S E | W H O S E | H E A R T S | S T I L L | T R E M B L E D | A T | T H E | N A M E | O F | B E L | M U S T | H A V E | C O N N E C T E D | T H E | E C L I P S E | A N D | T H E | P L A G U E | W I T H | T H E | R E V O L U T I O N | I N | T H E | N A T I O N A L | W O R S H I P | A N D | T H E | O V E R T H R O W | O F | T H E | A N C I E N T | G O D S | O N | T H A T | P L A I N | O F | P R O S T R A T I O N | W H E R E | T H E Y | H A D | S O | L O N G | R E C E I V E D | T H E | H O M A G E | O F | A N | E N T I R E | P E O P L E | +S O | S L O W | A N D | P A T I E N T | I S | T H E | P R O C E S S | B Y | W H I C H | C H R I S T I A N I T Y | I N F U S E S | I T S E L F | I N T O | T H E | S O C I A L | L I F E | O F | A | C O N V E R T E D | P E O P L E | +N O T H I N G | C O U L D | B E | M O R E | N A T U R A L | T H A N | S U C H | A N | A S S E M B L Y | I N | S U C H | A | P L A C E | A T | S U C H | A | P E R I O D | +L A S T L Y | T H E | R O Y A L | B R O T H E R S | F E L L | T H E M S E L V E S | V I C T I M S | T O | T H E | E P I D E M I C | W H I C H | S O | S A D L Y | S I G N A L I Z E S | T H E I R | R E I G N | +T H E | T R I B U T E | W A S | A T | T H I S | P E R I O D | E N O R M O U S | F I F T E E N | T H O U S A N D | H E A D | O F | C A T T L E | A N N U A L L Y | +T H E | K I N G D O M | O F | N O R T H U M B R I A | A S | T H E | N A M E | I M P L I E S | E M B R A C E D | N E A R L Y | A L L | T H E | C O U N T R Y | F R O M | T H E | H U M B E R | T O | T H E | P I C T I S H | B O R D E R | +H E R E | T H E | H O L Y | P R E L A T E | O F | F E R N S | M E T | H I M | A N D | R E L A T E D | A | V I S I O N | I N | W H I C H | H E | H A D | B E E N | I N S T R U C T E D | T O | D E M A N D | T H E | A B O L I T I O N | O F | T H E | I M P O S T | +T H E | P O E T S | O F | S U C C E E D I N G | A G E S | H A V E | D W E L T | M U C H | I N | D E T A I L | O N | T H E | O C C U R R E N C E S | O F | T H I S | M E M O R A B L E | D A Y | +T H E | S A X O N S | O F | K E N T | A N D | T H E | S O U T H E R N | K I N G D O M S | G E N E R A L L Y | W E R E | C O N V E R T E D | B Y | M I S S I O N A R I E S | F R O M | F R A N C E | O R | R O M E | O R | N A T I V E | P R E A C H E R S | O F | T H E | F I R S T | O R | S E C O N D | C H R I S T I A N | G E N E R A T I O N | T H O S E | O F | N O R T H U M B R I A | R E C O G N I S E | A S | T H E I R | A P O S T L E S | S A I N T | A I D A N | A N D | S A I N T | C U T H B E R T | T W O | F A T H E R S | F R O M | I O N A | +I T | I S | P R E T T Y | C L E A R | A L S O | T H A T | T H E | L A S T | R A L L Y | O F | D R U I D I S M | A G A I N S T | C H R I S T I A N I T Y | T O O K | P L A C E | B E H I N D | H I S | B A N N E R | O N | T H E | P L A I N | O F | M O I R A | +T H R O U G H O U T | T H I S | C E N T U R Y | T H E | P O W E R | O F | T H E | C H U R C H | W A S | C O N S T A N T L Y | O N | T H E | I N C R E A S E | A N D | I S | V I S I B L E | I N | M A N Y | I M P O R T A N T | C H A N G E S | +T H E | A N C E S T O R S | O F | T H E | P R E S E N T | P R E T E N D E R | C O N G A L | S U R N A M E D | T H E | S Q U I N T | E Y E D | H A D | T W I C E | R E C E I V E D | A N D | C H E R I S H E D | T H E | L I C E N T I O U S | B A R D S | W H E N | U N D E R | T H E | B A N | O F | T A R A | A N D | H I S | P O P U L A R I T Y | W I T H | T H A T | S T I L L | P O W E R F U L | O R D E R | W A S | O N E | P R O P | O F | H I S | A M B I T I O N | +T H E | B A R R E N | R O C K | A B O U T | T H R E E | M I L E S | I N | L E N G T H | W A S | C O V E R E D | W I T H | M O N A S T I C | B U I L D I N G S | A N D | I T S | C E M E T E R Y | W A S | A L R E A D Y | A D O R N E D | W I T H | T H E | T O M B S | O F | S A I N T S | A N D | K I N G S | +W H I L E | T H E | L I B E R A T E D | E X I L E S | R E J O I C E D | O N | T H E | P L A I N | O F | M E A T H | T H E | T E N T | O F | T H E | A B B O T | O F | I O N A | W A S | P I T C H E D | O N | T H E | R A T H | O F | T A R A | A | F A C T | W H I C H | W O U L D | S E E M | T O | I N D I C A T E | T H A T | A L R E A D Y | I N | L I T T L E | M O R E | T H A N | A | C E N T U R Y | S I N C E | T H E | I N T E R D I C T | H A D | F A L L E N | O N | I T | T H E | E D I F I C E S | W H I C H | M A D E | S O | F I N E | A | S H O W | I N | T H E | D A Y S | O F | P A T R I C K | W E R E | R U I N E D | A N D | U N I N H A B I T A B L E | +T H E | O N L Y | C O N F L I C T S | T H A T | O C C U R R E D | O N | I R I S H | S O I L | W I T H | A | P I C T I S H | O R | A N | A N G L O | S A X O N | F O R C E | I F | W E | E X C E P T | T H O S E | W H O | F O R M E D | A | C O N T I N G E N T | O F | C O N G A L ' S | A R M Y | A T | M O I R A | O C C U R R E D | I N | T H E | T I M E | O F | T H E | H O S P I T A B L E | F I N N A C T A | +S A I N T | M O L I N G | S U R V I V E D | H I M | T H R E E | Y E A R S | A N D | S A I N T | A D A M N A N | S O | I N T I M A T E L Y | C O N N E C T E D | W I T H | H I S | R E I G N | T E N | Y E A R S | +N O W | E V E R Y | M I S S I O N A R Y | T H A T | E V E R | W E N T | O U T | F R O M | I O N A | H A D | T A U G H T | T H A T | T O | R E D U C E | C H R I S T I A N S | T O | S L A V E R Y | W A S | W H O L L Y | I N C O N S I S T E N T | W I T H | A | B E L I E F | I N | T H E | D O C T R I N E S | O F | T H E | G O S P E L | +A S | L E A D I N G | T O | T H E | M E N T I O N | O F | O T H E R | I N T E R E S T I N G | E V E N T S | W E | M U S T | S E T | T H I S | I N R O A D | C L E A R L Y | B E F O R E | T H E | R E A D E R | +L I K E | T H E | T W O | K I N G S | O F | S P A R T A | T H E Y | R E I G N E D | J O I N T L Y | D I V I D I N G | B E T W E E N | T H E M | T H E | L A B O U R S | A N D | C A R E S | O F | S T A T E | diff --git a/SpeechT5/asr_train/train.tsv b/SpeechT5/asr_train/train.tsv new file mode 100644 index 0000000..9e7dd56 --- /dev/null +++ b/SpeechT5/asr_train/train.tsv @@ -0,0 +1,2675 @@ +/public/home/changhl/dataset/LibriSpeech/dev-clean +2412/153954/2412-153954-0004.flac 166560 +2412/153954/2412-153954-0000.flac 158640 +2412/153954/2412-153954-0002.flac 64880 +2412/153954/2412-153954-0014.flac 281840 +2412/153954/2412-153954-0003.flac 130400 +2412/153954/2412-153954-0007.flac 134880 +2412/153954/2412-153954-0009.flac 166720 +2412/153954/2412-153954-0010.flac 127040 +2412/153954/2412-153954-0022.flac 56640 +2412/153954/2412-153954-0017.flac 111840 +2412/153954/2412-153954-0021.flac 97760 +2412/153954/2412-153954-0001.flac 156000 +2412/153954/2412-153954-0013.flac 62640 +2412/153954/2412-153954-0023.flac 42400 +2412/153954/2412-153954-0005.flac 93520 +2412/153954/2412-153954-0019.flac 119760 +2412/153954/2412-153954-0012.flac 129920 +2412/153954/2412-153954-0006.flac 163520 +2412/153954/2412-153954-0018.flac 193680 +2412/153954/2412-153954-0020.flac 127600 +2412/153954/2412-153954-0011.flac 94960 +2412/153954/2412-153954-0024.flac 67040 +2412/153954/2412-153954-0016.flac 135040 +2412/153954/2412-153954-0015.flac 182240 +2412/153948/2412-153948-0008.flac 93040 +2412/153948/2412-153948-0005.flac 50240 +2412/153948/2412-153948-0003.flac 136240 +2412/153948/2412-153948-0012.flac 98720 +2412/153948/2412-153948-0002.flac 59520 +2412/153948/2412-153948-0013.flac 136640 +2412/153948/2412-153948-0000.flac 186560 +2412/153948/2412-153948-0006.flac 265840 +2412/153948/2412-153948-0015.flac 55440 +2412/153948/2412-153948-0004.flac 362880 +2412/153948/2412-153948-0007.flac 149920 +2412/153948/2412-153948-0009.flac 95920 +2412/153948/2412-153948-0001.flac 168160 +2412/153948/2412-153948-0010.flac 46640 +2412/153948/2412-153948-0014.flac 155280 +2412/153948/2412-153948-0011.flac 155921 +2412/153947/2412-153947-0000.flac 40800 +2412/153947/2412-153947-0007.flac 139760 +2412/153947/2412-153947-0001.flac 51600 +2412/153947/2412-153947-0008.flac 173440 +2412/153947/2412-153947-0011.flac 162080 +2412/153947/2412-153947-0002.flac 105520 +2412/153947/2412-153947-0013.flac 134720 +2412/153947/2412-153947-0006.flac 186880 +2412/153947/2412-153947-0016.flac 82960 +2412/153947/2412-153947-0005.flac 218880 +2412/153947/2412-153947-0009.flac 139520 +2412/153947/2412-153947-0004.flac 139520 +2412/153947/2412-153947-0012.flac 31680 +2412/153947/2412-153947-0014.flac 204720 +2412/153947/2412-153947-0010.flac 275121 +2412/153947/2412-153947-0015.flac 176480 +2412/153947/2412-153947-0003.flac 152240 +8842/302203/8842-302203-0009.flac 193520 +8842/302203/8842-302203-0005.flac 132320 +8842/302203/8842-302203-0006.flac 84480 +8842/302203/8842-302203-0011.flac 107520 +8842/302203/8842-302203-0007.flac 59200 +8842/302203/8842-302203-0008.flac 70640 +8842/302203/8842-302203-0002.flac 252320 +8842/302203/8842-302203-0001.flac 151760 +8842/302203/8842-302203-0010.flac 230320 +8842/302203/8842-302203-0003.flac 69360 +8842/302203/8842-302203-0004.flac 208720 +8842/302203/8842-302203-0000.flac 179840 +8842/302196/8842-302196-0012.flac 90080 +8842/302196/8842-302196-0010.flac 133360 +8842/302196/8842-302196-0007.flac 99440 +8842/302196/8842-302196-0001.flac 149600 +8842/302196/8842-302196-0004.flac 91840 +8842/302196/8842-302196-0003.flac 141760 +8842/302196/8842-302196-0009.flac 112880 +8842/302196/8842-302196-0000.flac 234400 +8842/302196/8842-302196-0008.flac 84960 +8842/302196/8842-302196-0006.flac 85840 +8842/302196/8842-302196-0002.flac 106480 +8842/302196/8842-302196-0005.flac 375120 +8842/302196/8842-302196-0011.flac 59280 +8842/302201/8842-302201-0006.flac 157840 +8842/302201/8842-302201-0008.flac 95520 +8842/302201/8842-302201-0010.flac 39600 +8842/302201/8842-302201-0003.flac 132240 +8842/302201/8842-302201-0012.flac 76880 +8842/302201/8842-302201-0015.flac 143760 +8842/302201/8842-302201-0005.flac 161520 +8842/302201/8842-302201-0007.flac 77680 +8842/302201/8842-302201-0013.flac 88560 +8842/302201/8842-302201-0000.flac 152000 +8842/302201/8842-302201-0009.flac 78640 +8842/302201/8842-302201-0002.flac 165360 +8842/302201/8842-302201-0004.flac 121440 +8842/302201/8842-302201-0001.flac 151040 +8842/302201/8842-302201-0011.flac 83520 +8842/302201/8842-302201-0014.flac 249920 +8842/304647/8842-304647-0006.flac 367360 +8842/304647/8842-304647-0007.flac 27680 +8842/304647/8842-304647-0012.flac 69200 +8842/304647/8842-304647-0002.flac 507200 +8842/304647/8842-304647-0001.flac 43200 +8842/304647/8842-304647-0011.flac 140080 +8842/304647/8842-304647-0010.flac 195120 +8842/304647/8842-304647-0000.flac 155360 +8842/304647/8842-304647-0013.flac 142000 +8842/304647/8842-304647-0008.flac 132480 +8842/304647/8842-304647-0005.flac 35520 +8842/304647/8842-304647-0009.flac 191280 +8842/304647/8842-304647-0004.flac 162480 +8842/304647/8842-304647-0003.flac 125520 +6345/93302/6345-93302-0025.flac 46960 +6345/93302/6345-93302-0007.flac 69920 +6345/93302/6345-93302-0008.flac 64480 +6345/93302/6345-93302-0012.flac 94800 +6345/93302/6345-93302-0001.flac 138000 +6345/93302/6345-93302-0014.flac 97520 +6345/93302/6345-93302-0020.flac 50560 +6345/93302/6345-93302-0028.flac 31040 +6345/93302/6345-93302-0023.flac 88480 +6345/93302/6345-93302-0004.flac 70640 +6345/93302/6345-93302-0026.flac 83040 +6345/93302/6345-93302-0002.flac 120800 +6345/93302/6345-93302-0010.flac 71200 +6345/93302/6345-93302-0016.flac 107520 +6345/93302/6345-93302-0006.flac 49040 +6345/93302/6345-93302-0024.flac 40560 +6345/93302/6345-93302-0005.flac 165760 +6345/93302/6345-93302-0021.flac 34640 +6345/93302/6345-93302-0003.flac 88560 +6345/93302/6345-93302-0022.flac 41120 +6345/93302/6345-93302-0029.flac 210160 +6345/93302/6345-93302-0000.flac 158080 +6345/93302/6345-93302-0015.flac 96400 +6345/93302/6345-93302-0013.flac 41200 +6345/93302/6345-93302-0009.flac 98000 +6345/93302/6345-93302-0011.flac 34080 +6345/93302/6345-93302-0027.flac 102800 +6345/93302/6345-93302-0019.flac 61040 +6345/93302/6345-93302-0017.flac 105360 +6345/64257/6345-64257-0018.flac 76560 +6345/64257/6345-64257-0020.flac 45760 +6345/64257/6345-64257-0012.flac 45040 +6345/64257/6345-64257-0007.flac 93440 +6345/64257/6345-64257-0016.flac 92480 +6345/64257/6345-64257-0013.flac 100720 +6345/64257/6345-64257-0014.flac 49360 +6345/64257/6345-64257-0008.flac 51280 +6345/64257/6345-64257-0019.flac 123520 +6345/64257/6345-64257-0004.flac 96800 +6345/64257/6345-64257-0010.flac 63760 +6345/64257/6345-64257-0002.flac 160720 +6345/64257/6345-64257-0001.flac 350880 +6345/64257/6345-64257-0005.flac 122640 +6345/64257/6345-64257-0003.flac 140480 +6345/64257/6345-64257-0011.flac 141280 +6345/64257/6345-64257-0009.flac 198160 +6345/64257/6345-64257-0000.flac 176880 +6345/64257/6345-64257-0006.flac 146000 +6345/64257/6345-64257-0017.flac 45280 +6345/64257/6345-64257-0015.flac 36640 +6345/93306/6345-93306-0020.flac 107760 +6345/93306/6345-93306-0017.flac 119600 +6345/93306/6345-93306-0005.flac 72240 +6345/93306/6345-93306-0011.flac 69200 +6345/93306/6345-93306-0016.flac 67440 +6345/93306/6345-93306-0009.flac 41120 +6345/93306/6345-93306-0008.flac 47360 +6345/93306/6345-93306-0013.flac 173040 +6345/93306/6345-93306-0021.flac 60560 +6345/93306/6345-93306-0018.flac 70480 +6345/93306/6345-93306-0023.flac 189600 +6345/93306/6345-93306-0001.flac 231360 +6345/93306/6345-93306-0025.flac 184800 +6345/93306/6345-93306-0000.flac 335920 +6345/93306/6345-93306-0014.flac 35840 +6345/93306/6345-93306-0004.flac 50720 +6345/93306/6345-93306-0007.flac 82000 +6345/93306/6345-93306-0024.flac 149840 +6345/93306/6345-93306-0015.flac 133120 +6345/93306/6345-93306-0019.flac 122720 +6345/93306/6345-93306-0010.flac 88560 +6345/93306/6345-93306-0006.flac 73600 +6345/93306/6345-93306-0002.flac 82080 +6345/93306/6345-93306-0003.flac 39840 +6345/93306/6345-93306-0022.flac 161760 +6345/93306/6345-93306-0012.flac 41040 +777/126732/777-126732-0003.flac 151200 +777/126732/777-126732-0035.flac 89360 +777/126732/777-126732-0053.flac 74560 +777/126732/777-126732-0079.flac 160640 +777/126732/777-126732-0067.flac 83920 +777/126732/777-126732-0076.flac 68160 +777/126732/777-126732-0015.flac 152160 +777/126732/777-126732-0078.flac 36320 +777/126732/777-126732-0017.flac 43680 +777/126732/777-126732-0042.flac 89120 +777/126732/777-126732-0013.flac 242400 +777/126732/777-126732-0000.flac 43840 +777/126732/777-126732-0041.flac 161440 +777/126732/777-126732-0016.flac 200560 +777/126732/777-126732-0057.flac 175600 +777/126732/777-126732-0004.flac 68080 +777/126732/777-126732-0050.flac 108960 +777/126732/777-126732-0014.flac 118720 +777/126732/777-126732-0022.flac 48320 +777/126732/777-126732-0049.flac 36000 +777/126732/777-126732-0066.flac 185520 +777/126732/777-126732-0064.flac 93759 +777/126732/777-126732-0065.flac 83600 +777/126732/777-126732-0037.flac 87040 +777/126732/777-126732-0040.flac 79760 +777/126732/777-126732-0045.flac 191600 +777/126732/777-126732-0031.flac 177040 +777/126732/777-126732-0032.flac 93600 +777/126732/777-126732-0052.flac 79200 +777/126732/777-126732-0063.flac 290720 +777/126732/777-126732-0074.flac 55680 +777/126732/777-126732-0062.flac 38000 +777/126732/777-126732-0060.flac 126320 +777/126732/777-126732-0030.flac 103440 +777/126732/777-126732-0025.flac 146880 +777/126732/777-126732-0009.flac 77040 +777/126732/777-126732-0006.flac 73200 +777/126732/777-126732-0036.flac 145120 +777/126732/777-126732-0005.flac 177920 +777/126732/777-126732-0075.flac 71920 +777/126732/777-126732-0061.flac 73040 +777/126732/777-126732-0055.flac 61680 +777/126732/777-126732-0069.flac 79120 +777/126732/777-126732-0027.flac 69280 +777/126732/777-126732-0026.flac 31520 +777/126732/777-126732-0039.flac 45360 +777/126732/777-126732-0056.flac 148160 +777/126732/777-126732-0046.flac 35920 +777/126732/777-126732-0059.flac 98560 +777/126732/777-126732-0047.flac 130000 +777/126732/777-126732-0020.flac 35280 +777/126732/777-126732-0021.flac 58160 +777/126732/777-126732-0012.flac 77360 +777/126732/777-126732-0011.flac 119200 +777/126732/777-126732-0008.flac 70800 +777/126732/777-126732-0051.flac 69360 +777/126732/777-126732-0028.flac 204320 +777/126732/777-126732-0018.flac 64800 +777/126732/777-126732-0072.flac 43360 +777/126732/777-126732-0034.flac 55680 +777/126732/777-126732-0058.flac 83600 +777/126732/777-126732-0010.flac 54720 +777/126732/777-126732-0054.flac 48480 +777/126732/777-126732-0048.flac 95600 +777/126732/777-126732-0033.flac 58480 +777/126732/777-126732-0068.flac 44240 +777/126732/777-126732-0029.flac 57360 +777/126732/777-126732-0081.flac 24080 +777/126732/777-126732-0077.flac 38480 +777/126732/777-126732-0043.flac 40560 +777/126732/777-126732-0007.flac 196080 +777/126732/777-126732-0024.flac 217600 +777/126732/777-126732-0019.flac 79040 +777/126732/777-126732-0073.flac 60800 +777/126732/777-126732-0002.flac 80960 +777/126732/777-126732-0038.flac 49600 +777/126732/777-126732-0001.flac 36800 +777/126732/777-126732-0071.flac 36880 +777/126732/777-126732-0070.flac 117040 +777/126732/777-126732-0080.flac 40560 +777/126732/777-126732-0023.flac 112320 +3853/163249/3853-163249-0035.flac 76080 +3853/163249/3853-163249-0056.flac 66480 +3853/163249/3853-163249-0017.flac 190320 +3853/163249/3853-163249-0001.flac 138560 +3853/163249/3853-163249-0036.flac 386000 +3853/163249/3853-163249-0034.flac 44240 +3853/163249/3853-163249-0002.flac 122640 +3853/163249/3853-163249-0007.flac 87999 +3853/163249/3853-163249-0055.flac 62320 +3853/163249/3853-163249-0005.flac 170720 +3853/163249/3853-163249-0011.flac 36160 +3853/163249/3853-163249-0032.flac 85440 +3853/163249/3853-163249-0052.flac 191520 +3853/163249/3853-163249-0050.flac 69360 +3853/163249/3853-163249-0042.flac 210960 +3853/163249/3853-163249-0019.flac 92800 +3853/163249/3853-163249-0012.flac 236320 +3853/163249/3853-163249-0030.flac 263120 +3853/163249/3853-163249-0028.flac 153120 +3853/163249/3853-163249-0051.flac 92160 +3853/163249/3853-163249-0054.flac 296721 +3853/163249/3853-163249-0015.flac 36800 +3853/163249/3853-163249-0020.flac 97120 +3853/163249/3853-163249-0053.flac 330240 +3853/163249/3853-163249-0048.flac 137040 +3853/163249/3853-163249-0013.flac 97840 +3853/163249/3853-163249-0018.flac 164880 +3853/163249/3853-163249-0021.flac 72000 +3853/163249/3853-163249-0031.flac 141280 +3853/163249/3853-163249-0029.flac 63120 +3853/163249/3853-163249-0039.flac 76640 +3853/163249/3853-163249-0009.flac 92640 +3853/163249/3853-163249-0046.flac 278800 +3853/163249/3853-163249-0047.flac 190960 +3853/163249/3853-163249-0027.flac 137280 +3853/163249/3853-163249-0044.flac 56080 +3853/163249/3853-163249-0022.flac 136080 +3853/163249/3853-163249-0041.flac 114240 +3853/163249/3853-163249-0014.flac 175040 +3853/163249/3853-163249-0008.flac 93601 +3853/163249/3853-163249-0016.flac 247520 +3853/163249/3853-163249-0003.flac 109600 +3853/163249/3853-163249-0038.flac 99840 +3853/163249/3853-163249-0023.flac 79680 +3853/163249/3853-163249-0049.flac 217040 +3853/163249/3853-163249-0026.flac 93360 +3853/163249/3853-163249-0045.flac 116640 +3853/163249/3853-163249-0006.flac 145520 +3853/163249/3853-163249-0010.flac 162880 +3853/163249/3853-163249-0033.flac 62000 +3853/163249/3853-163249-0000.flac 151680 +3853/163249/3853-163249-0037.flac 106640 +3853/163249/3853-163249-0004.flac 93600 +3853/163249/3853-163249-0024.flac 234880 +3853/163249/3853-163249-0043.flac 90560 +3752/4944/3752-4944-0059.flac 73920 +3752/4944/3752-4944-0068.flac 236080 +3752/4944/3752-4944-0002.flac 51600 +3752/4944/3752-4944-0009.flac 41760 +3752/4944/3752-4944-0023.flac 40000 +3752/4944/3752-4944-0058.flac 32800 +3752/4944/3752-4944-0012.flac 88720 +3752/4944/3752-4944-0011.flac 54321 +3752/4944/3752-4944-0013.flac 95120 +3752/4944/3752-4944-0056.flac 72480 +3752/4944/3752-4944-0036.flac 109600 +3752/4944/3752-4944-0053.flac 140720 +3752/4944/3752-4944-0054.flac 50880 +3752/4944/3752-4944-0048.flac 77280 +3752/4944/3752-4944-0015.flac 66160 +3752/4944/3752-4944-0022.flac 262400 +3752/4944/3752-4944-0029.flac 35600 +3752/4944/3752-4944-0027.flac 182240 +3752/4944/3752-4944-0037.flac 41200 +3752/4944/3752-4944-0055.flac 34720 +3752/4944/3752-4944-0005.flac 38720 +3752/4944/3752-4944-0032.flac 75840 +3752/4944/3752-4944-0060.flac 64400 +3752/4944/3752-4944-0052.flac 126800 +3752/4944/3752-4944-0016.flac 174240 +3752/4944/3752-4944-0049.flac 44240 +3752/4944/3752-4944-0066.flac 114000 +3752/4944/3752-4944-0050.flac 43520 +3752/4944/3752-4944-0006.flac 62160 +3752/4944/3752-4944-0019.flac 46880 +3752/4944/3752-4944-0069.flac 163360 +3752/4944/3752-4944-0062.flac 67840 +3752/4944/3752-4944-0030.flac 51280 +3752/4944/3752-4944-0010.flac 57599 +3752/4944/3752-4944-0028.flac 51360 +3752/4944/3752-4944-0051.flac 56560 +3752/4944/3752-4944-0043.flac 52800 +3752/4944/3752-4944-0007.flac 44800 +3752/4944/3752-4944-0017.flac 112720 +3752/4944/3752-4944-0046.flac 29760 +3752/4944/3752-4944-0033.flac 67600 +3752/4944/3752-4944-0034.flac 70720 +3752/4944/3752-4944-0067.flac 43121 +3752/4944/3752-4944-0024.flac 32480 +3752/4944/3752-4944-0047.flac 111600 +3752/4944/3752-4944-0031.flac 138400 +3752/4944/3752-4944-0001.flac 70640 +3752/4944/3752-4944-0042.flac 51360 +3752/4944/3752-4944-0040.flac 44560 +3752/4944/3752-4944-0041.flac 39600 +3752/4944/3752-4944-0064.flac 108880 +3752/4944/3752-4944-0057.flac 40560 +3752/4944/3752-4944-0020.flac 215760 +3752/4944/3752-4944-0018.flac 118000 +3752/4944/3752-4944-0000.flac 53360 +3752/4944/3752-4944-0035.flac 52560 +3752/4944/3752-4944-0061.flac 39760 +3752/4944/3752-4944-0004.flac 38800 +3752/4944/3752-4944-0038.flac 45840 +3752/4944/3752-4944-0021.flac 116320 +3752/4944/3752-4944-0026.flac 40800 +3752/4944/3752-4944-0065.flac 67200 +3752/4944/3752-4944-0014.flac 36880 +3752/4944/3752-4944-0003.flac 44160 +3752/4944/3752-4944-0039.flac 90960 +3752/4944/3752-4944-0045.flac 44240 +3752/4944/3752-4944-0044.flac 37840 +3752/4944/3752-4944-0025.flac 59760 +3752/4943/3752-4943-0015.flac 47360 +3752/4943/3752-4943-0028.flac 60160 +3752/4943/3752-4943-0008.flac 60160 +3752/4943/3752-4943-0023.flac 48880 +3752/4943/3752-4943-0003.flac 100000 +3752/4943/3752-4943-0019.flac 39920 +3752/4943/3752-4943-0001.flac 177280 +3752/4943/3752-4943-0013.flac 88560 +3752/4943/3752-4943-0030.flac 38320 +3752/4943/3752-4943-0027.flac 44880 +3752/4943/3752-4943-0026.flac 64800 +3752/4943/3752-4943-0018.flac 84240 +3752/4943/3752-4943-0005.flac 49680 +3752/4943/3752-4943-0022.flac 83120 +3752/4943/3752-4943-0017.flac 36400 +3752/4943/3752-4943-0025.flac 83920 +3752/4943/3752-4943-0012.flac 54400 +3752/4943/3752-4943-0006.flac 42480 +3752/4943/3752-4943-0016.flac 39760 +3752/4943/3752-4943-0004.flac 224160 +3752/4943/3752-4943-0029.flac 61360 +3752/4943/3752-4943-0024.flac 90480 +3752/4943/3752-4943-0020.flac 78000 +3752/4943/3752-4943-0009.flac 57520 +3752/4943/3752-4943-0002.flac 115360 +3752/4943/3752-4943-0014.flac 47840 +3752/4943/3752-4943-0000.flac 141280 +3752/4943/3752-4943-0021.flac 72240 +3752/4943/3752-4943-0007.flac 160000 +3752/4943/3752-4943-0010.flac 81280 +6319/275224/6319-275224-0002.flac 119280 +6319/275224/6319-275224-0008.flac 295120 +6319/275224/6319-275224-0003.flac 185760 +6319/275224/6319-275224-0006.flac 273440 +6319/275224/6319-275224-0007.flac 44240 +6319/275224/6319-275224-0001.flac 194800 +6319/275224/6319-275224-0005.flac 204000 +6319/275224/6319-275224-0011.flac 293040 +6319/275224/6319-275224-0020.flac 191040 +6319/275224/6319-275224-0016.flac 79680 +6319/275224/6319-275224-0004.flac 100720 +6319/275224/6319-275224-0000.flac 77200 +6319/275224/6319-275224-0009.flac 72720 +6319/275224/6319-275224-0012.flac 65840 +6319/275224/6319-275224-0019.flac 92480 +6319/275224/6319-275224-0018.flac 108080 +6319/275224/6319-275224-0010.flac 111040 +6319/275224/6319-275224-0017.flac 134560 +6319/275224/6319-275224-0015.flac 119360 +6319/275224/6319-275224-0013.flac 77920 +6319/275224/6319-275224-0014.flac 171680 +6319/57405/6319-57405-0009.flac 246880 +6319/57405/6319-57405-0008.flac 199360 +6319/57405/6319-57405-0011.flac 59360 +6319/57405/6319-57405-0005.flac 138000 +6319/57405/6319-57405-0003.flac 133920 +6319/57405/6319-57405-0001.flac 162320 +6319/57405/6319-57405-0002.flac 104320 +6319/57405/6319-57405-0010.flac 53440 +6319/57405/6319-57405-0007.flac 56080 +6319/57405/6319-57405-0006.flac 142240 +6319/57405/6319-57405-0004.flac 91360 +6319/57405/6319-57405-0012.flac 135040 +6319/57405/6319-57405-0000.flac 116720 +6319/64726/6319-64726-0001.flac 255519 +6319/64726/6319-64726-0020.flac 58800 +6319/64726/6319-64726-0013.flac 124800 +6319/64726/6319-64726-0015.flac 88960 +6319/64726/6319-64726-0016.flac 141360 +6319/64726/6319-64726-0012.flac 147360 +6319/64726/6319-64726-0004.flac 305600 +6319/64726/6319-64726-0008.flac 69760 +6319/64726/6319-64726-0002.flac 195200 +6319/64726/6319-64726-0010.flac 79360 +6319/64726/6319-64726-0005.flac 154880 +6319/64726/6319-64726-0019.flac 204960 +6319/64726/6319-64726-0000.flac 163920 +6319/64726/6319-64726-0009.flac 163840 +6319/64726/6319-64726-0017.flac 108720 +6319/64726/6319-64726-0018.flac 225760 +6319/64726/6319-64726-0006.flac 60160 +6319/64726/6319-64726-0007.flac 267600 +6319/64726/6319-64726-0011.flac 106480 +6319/64726/6319-64726-0003.flac 72480 +3000/15664/3000-15664-0015.flac 212160 +3000/15664/3000-15664-0008.flac 207760 +3000/15664/3000-15664-0038.flac 252480 +3000/15664/3000-15664-0002.flac 114720 +3000/15664/3000-15664-0027.flac 64720 +3000/15664/3000-15664-0010.flac 248720 +3000/15664/3000-15664-0037.flac 161120 +3000/15664/3000-15664-0045.flac 205440 +3000/15664/3000-15664-0004.flac 46160 +3000/15664/3000-15664-0003.flac 74720 +3000/15664/3000-15664-0040.flac 164240 +3000/15664/3000-15664-0034.flac 253840 +3000/15664/3000-15664-0025.flac 79520 +3000/15664/3000-15664-0035.flac 314960 +3000/15664/3000-15664-0028.flac 103680 +3000/15664/3000-15664-0033.flac 357920 +3000/15664/3000-15664-0023.flac 82481 +3000/15664/3000-15664-0020.flac 256320 +3000/15664/3000-15664-0000.flac 50080 +3000/15664/3000-15664-0005.flac 135360 +3000/15664/3000-15664-0036.flac 195600 +3000/15664/3000-15664-0044.flac 222960 +3000/15664/3000-15664-0030.flac 49120 +3000/15664/3000-15664-0009.flac 127600 +3000/15664/3000-15664-0042.flac 102560 +3000/15664/3000-15664-0011.flac 171680 +3000/15664/3000-15664-0006.flac 40800 +3000/15664/3000-15664-0001.flac 333760 +3000/15664/3000-15664-0018.flac 90400 +3000/15664/3000-15664-0031.flac 160320 +3000/15664/3000-15664-0007.flac 111440 +3000/15664/3000-15664-0022.flac 103520 +3000/15664/3000-15664-0026.flac 40640 +3000/15664/3000-15664-0046.flac 85760 +3000/15664/3000-15664-0019.flac 281920 +3000/15664/3000-15664-0024.flac 226400 +3000/15664/3000-15664-0021.flac 204240 +3000/15664/3000-15664-0016.flac 140000 +3000/15664/3000-15664-0039.flac 76080 +3000/15664/3000-15664-0013.flac 145920 +3000/15664/3000-15664-0043.flac 158720 +3000/15664/3000-15664-0012.flac 193440 +3000/15664/3000-15664-0029.flac 91680 +3000/15664/3000-15664-0041.flac 457120 +3000/15664/3000-15664-0017.flac 225360 +3000/15664/3000-15664-0014.flac 115280 +3000/15664/3000-15664-0032.flac 174400 +3576/138058/3576-138058-0001.flac 172480 +3576/138058/3576-138058-0019.flac 158960 +3576/138058/3576-138058-0014.flac 290080 +3576/138058/3576-138058-0005.flac 266480 +3576/138058/3576-138058-0020.flac 392320 +3576/138058/3576-138058-0031.flac 45039 +3576/138058/3576-138058-0022.flac 430400 +3576/138058/3576-138058-0024.flac 367840 +3576/138058/3576-138058-0007.flac 56800 +3576/138058/3576-138058-0012.flac 87680 +3576/138058/3576-138058-0039.flac 226400 +3576/138058/3576-138058-0013.flac 75440 +3576/138058/3576-138058-0034.flac 129040 +3576/138058/3576-138058-0008.flac 61760 +3576/138058/3576-138058-0037.flac 165760 +3576/138058/3576-138058-0026.flac 130080 +3576/138058/3576-138058-0000.flac 226240 +3576/138058/3576-138058-0025.flac 120400 +3576/138058/3576-138058-0029.flac 160960 +3576/138058/3576-138058-0027.flac 166320 +3576/138058/3576-138058-0035.flac 331600 +3576/138058/3576-138058-0016.flac 191040 +3576/138058/3576-138058-0038.flac 154400 +3576/138058/3576-138058-0030.flac 110480 +3576/138058/3576-138058-0006.flac 63120 +3576/138058/3576-138058-0011.flac 180480 +3576/138058/3576-138058-0040.flac 107040 +3576/138058/3576-138058-0021.flac 98880 +3576/138058/3576-138058-0004.flac 264960 +3576/138058/3576-138058-0033.flac 284480 +3576/138058/3576-138058-0036.flac 308640 +3576/138058/3576-138058-0002.flac 357280 +3576/138058/3576-138058-0003.flac 40160 +3576/138058/3576-138058-0015.flac 146960 +3576/138058/3576-138058-0010.flac 251760 +3576/138058/3576-138058-0009.flac 231760 +3576/138058/3576-138058-0023.flac 177120 +3576/138058/3576-138058-0017.flac 277200 +3576/138058/3576-138058-0028.flac 167360 +3576/138058/3576-138058-0032.flac 89361 +3576/138058/3576-138058-0018.flac 117120 +652/130726/652-130726-0002.flac 222160 +652/130726/652-130726-0004.flac 241360 +652/130726/652-130726-0017.flac 93680 +652/130726/652-130726-0024.flac 171760 +652/130726/652-130726-0029.flac 124400 +652/130726/652-130726-0007.flac 77600 +652/130726/652-130726-0027.flac 83760 +652/130726/652-130726-0023.flac 108000 +652/130726/652-130726-0032.flac 95840 +652/130726/652-130726-0011.flac 302800 +652/130726/652-130726-0034.flac 178480 +652/130726/652-130726-0028.flac 48320 +652/130726/652-130726-0012.flac 92800 +652/130726/652-130726-0001.flac 173680 +652/130726/652-130726-0008.flac 148880 +652/130726/652-130726-0025.flac 42080 +652/130726/652-130726-0020.flac 106880 +652/130726/652-130726-0035.flac 81440 +652/130726/652-130726-0033.flac 172800 +652/130726/652-130726-0019.flac 97680 +652/130726/652-130726-0016.flac 166560 +652/130726/652-130726-0009.flac 61360 +652/130726/652-130726-0000.flac 115120 +652/130726/652-130726-0015.flac 149600 +652/130726/652-130726-0005.flac 167120 +652/130726/652-130726-0014.flac 84800 +652/130726/652-130726-0022.flac 197840 +652/130726/652-130726-0026.flac 98160 +652/130726/652-130726-0031.flac 91920 +652/130726/652-130726-0021.flac 182160 +652/130726/652-130726-0010.flac 109600 +652/130726/652-130726-0018.flac 52160 +652/130726/652-130726-0030.flac 45520 +652/130726/652-130726-0003.flac 101840 +652/130726/652-130726-0006.flac 118480 +652/130726/652-130726-0013.flac 85360 +652/130737/652-130737-0005.flac 66160 +652/130737/652-130737-0000.flac 159840 +652/130737/652-130737-0004.flac 79840 +652/130737/652-130737-0007.flac 64800 +652/130737/652-130737-0008.flac 38160 +652/130737/652-130737-0006.flac 77760 +652/130737/652-130737-0013.flac 74720 +652/130737/652-130737-0012.flac 60800 +652/130737/652-130737-0003.flac 127520 +652/130737/652-130737-0010.flac 110800 +652/130737/652-130737-0009.flac 75840 +652/130737/652-130737-0011.flac 63440 +652/130737/652-130737-0001.flac 99840 +652/130737/652-130737-0002.flac 121120 +652/129742/652-129742-0008.flac 54880 +652/129742/652-129742-0015.flac 188880 +652/129742/652-129742-0000.flac 96400 +652/129742/652-129742-0018.flac 87680 +652/129742/652-129742-0010.flac 54400 +652/129742/652-129742-0019.flac 44560 +652/129742/652-129742-0016.flac 255840 +652/129742/652-129742-0014.flac 63120 +652/129742/652-129742-0001.flac 138560 +652/129742/652-129742-0006.flac 145840 +652/129742/652-129742-0017.flac 54480 +652/129742/652-129742-0009.flac 223520 +652/129742/652-129742-0011.flac 52480 +652/129742/652-129742-0012.flac 148560 +652/129742/652-129742-0007.flac 78160 +652/129742/652-129742-0013.flac 89600 +652/129742/652-129742-0004.flac 113920 +652/129742/652-129742-0002.flac 59200 +652/129742/652-129742-0003.flac 146880 +652/129742/652-129742-0005.flac 96240 +652/129742/652-129742-0020.flac 72080 +6313/76958/6313-76958-0030.flac 36240 +6313/76958/6313-76958-0000.flac 46240 +6313/76958/6313-76958-0024.flac 70000 +6313/76958/6313-76958-0018.flac 99120 +6313/76958/6313-76958-0014.flac 120240 +6313/76958/6313-76958-0015.flac 54080 +6313/76958/6313-76958-0001.flac 47520 +6313/76958/6313-76958-0006.flac 39120 +6313/76958/6313-76958-0008.flac 37520 +6313/76958/6313-76958-0025.flac 60720 +6313/76958/6313-76958-0027.flac 56080 +6313/76958/6313-76958-0023.flac 52080 +6313/76958/6313-76958-0002.flac 48080 +6313/76958/6313-76958-0005.flac 92960 +6313/76958/6313-76958-0031.flac 35280 +6313/76958/6313-76958-0010.flac 106080 +6313/76958/6313-76958-0009.flac 102400 +6313/76958/6313-76958-0012.flac 105440 +6313/76958/6313-76958-0004.flac 89040 +6313/76958/6313-76958-0021.flac 190800 +6313/76958/6313-76958-0022.flac 100720 +6313/76958/6313-76958-0003.flac 47600 +6313/76958/6313-76958-0017.flac 80880 +6313/76958/6313-76958-0016.flac 69600 +6313/76958/6313-76958-0011.flac 64400 +6313/76958/6313-76958-0029.flac 107120 +6313/76958/6313-76958-0013.flac 188960 +6313/76958/6313-76958-0007.flac 59200 +6313/76958/6313-76958-0019.flac 49520 +6313/76958/6313-76958-0020.flac 37040 +6313/76958/6313-76958-0026.flac 70880 +6313/76958/6313-76958-0028.flac 60720 +6313/66129/6313-66129-0024.flac 126800 +6313/66129/6313-66129-0019.flac 39360 +6313/66129/6313-66129-0017.flac 138960 +6313/66129/6313-66129-0026.flac 187040 +6313/66129/6313-66129-0033.flac 145040 +6313/66129/6313-66129-0010.flac 67680 +6313/66129/6313-66129-0030.flac 54960 +6313/66129/6313-66129-0012.flac 49440 +6313/66129/6313-66129-0004.flac 62400 +6313/66129/6313-66129-0031.flac 86800 +6313/66129/6313-66129-0025.flac 74720 +6313/66129/6313-66129-0027.flac 82560 +6313/66129/6313-66129-0002.flac 58720 +6313/66129/6313-66129-0018.flac 91280 +6313/66129/6313-66129-0023.flac 84000 +6313/66129/6313-66129-0008.flac 81120 +6313/66129/6313-66129-0003.flac 87200 +6313/66129/6313-66129-0015.flac 120320 +6313/66129/6313-66129-0005.flac 73280 +6313/66129/6313-66129-0032.flac 29760 +6313/66129/6313-66129-0014.flac 181360 +6313/66129/6313-66129-0021.flac 206480 +6313/66129/6313-66129-0000.flac 45040 +6313/66129/6313-66129-0001.flac 188800 +6313/66129/6313-66129-0009.flac 76480 +6313/66129/6313-66129-0011.flac 35440 +6313/66129/6313-66129-0022.flac 68640 +6313/66129/6313-66129-0020.flac 111680 +6313/66129/6313-66129-0007.flac 39280 +6313/66129/6313-66129-0029.flac 113120 +6313/66129/6313-66129-0013.flac 57680 +6313/66129/6313-66129-0006.flac 47360 +6313/66129/6313-66129-0035.flac 67200 +6313/66129/6313-66129-0034.flac 127360 +6313/66129/6313-66129-0028.flac 37120 +6313/66125/6313-66125-0022.flac 124480 +6313/66125/6313-66125-0012.flac 36640 +6313/66125/6313-66125-0018.flac 47280 +6313/66125/6313-66125-0016.flac 119120 +6313/66125/6313-66125-0021.flac 79600 +6313/66125/6313-66125-0017.flac 81040 +6313/66125/6313-66125-0009.flac 43360 +6313/66125/6313-66125-0001.flac 72000 +6313/66125/6313-66125-0011.flac 81920 +6313/66125/6313-66125-0000.flac 37680 +6313/66125/6313-66125-0005.flac 74240 +6313/66125/6313-66125-0004.flac 52160 +6313/66125/6313-66125-0007.flac 78880 +6313/66125/6313-66125-0024.flac 70560 +6313/66125/6313-66125-0014.flac 60560 +6313/66125/6313-66125-0025.flac 85120 +6313/66125/6313-66125-0002.flac 49200 +6313/66125/6313-66125-0008.flac 71840 +6313/66125/6313-66125-0023.flac 149600 +6313/66125/6313-66125-0013.flac 32960 +6313/66125/6313-66125-0003.flac 73280 +6313/66125/6313-66125-0015.flac 131680 +6313/66125/6313-66125-0026.flac 36320 +6313/66125/6313-66125-0020.flac 47840 +6313/66125/6313-66125-0010.flac 60880 +6313/66125/6313-66125-0027.flac 231520 +6313/66125/6313-66125-0019.flac 75040 +6313/66125/6313-66125-0006.flac 48080 +2078/142845/2078-142845-0026.flac 39600 +2078/142845/2078-142845-0017.flac 103760 +2078/142845/2078-142845-0006.flac 234320 +2078/142845/2078-142845-0032.flac 207040 +2078/142845/2078-142845-0044.flac 37200 +2078/142845/2078-142845-0037.flac 253920 +2078/142845/2078-142845-0050.flac 123600 +2078/142845/2078-142845-0039.flac 335200 +2078/142845/2078-142845-0030.flac 192640 +2078/142845/2078-142845-0047.flac 183360 +2078/142845/2078-142845-0010.flac 230560 +2078/142845/2078-142845-0004.flac 370800 +2078/142845/2078-142845-0025.flac 464960 +2078/142845/2078-142845-0016.flac 56480 +2078/142845/2078-142845-0024.flac 35360 +2078/142845/2078-142845-0043.flac 336079 +2078/142845/2078-142845-0049.flac 45920 +2078/142845/2078-142845-0048.flac 35200 +2078/142845/2078-142845-0031.flac 267840 +2078/142845/2078-142845-0007.flac 331840 +2078/142845/2078-142845-0008.flac 310080 +2078/142845/2078-142845-0023.flac 28000 +2078/142845/2078-142845-0001.flac 34160 +2078/142845/2078-142845-0029.flac 77920 +2078/142845/2078-142845-0000.flac 35120 +2078/142845/2078-142845-0009.flac 54960 +2078/142845/2078-142845-0020.flac 150720 +2078/142845/2078-142845-0040.flac 112240 +2078/142845/2078-142845-0028.flac 182800 +2078/142845/2078-142845-0045.flac 114160 +2078/142845/2078-142845-0027.flac 139680 +2078/142845/2078-142845-0022.flac 36800 +2078/142845/2078-142845-0019.flac 150480 +2078/142845/2078-142845-0002.flac 46640 +2078/142845/2078-142845-0046.flac 85680 +2078/142845/2078-142845-0005.flac 502000 +2078/142845/2078-142845-0038.flac 72320 +2078/142845/2078-142845-0051.flac 165760 +2078/142845/2078-142845-0012.flac 211840 +2078/142845/2078-142845-0042.flac 67680 +2078/142845/2078-142845-0035.flac 67520 +2078/142845/2078-142845-0034.flac 156080 +2078/142845/2078-142845-0041.flac 42560 +2078/142845/2078-142845-0036.flac 59520 +2078/142845/2078-142845-0015.flac 157440 +2078/142845/2078-142845-0003.flac 33200 +2078/142845/2078-142845-0011.flac 72480 +2078/142845/2078-142845-0021.flac 98240 +2078/142845/2078-142845-0014.flac 131200 +2078/142845/2078-142845-0033.flac 182160 +2078/142845/2078-142845-0018.flac 85280 +2078/142845/2078-142845-0013.flac 157680 +2428/83705/2428-83705-0015.flac 175760 +2428/83705/2428-83705-0030.flac 147360 +2428/83705/2428-83705-0019.flac 81200 +2428/83705/2428-83705-0010.flac 42080 +2428/83705/2428-83705-0034.flac 87200 +2428/83705/2428-83705-0006.flac 58640 +2428/83705/2428-83705-0017.flac 79840 +2428/83705/2428-83705-0007.flac 53280 +2428/83705/2428-83705-0031.flac 43280 +2428/83705/2428-83705-0037.flac 149840 +2428/83705/2428-83705-0003.flac 34320 +2428/83705/2428-83705-0000.flac 61120 +2428/83705/2428-83705-0024.flac 79040 +2428/83705/2428-83705-0002.flac 263200 +2428/83705/2428-83705-0041.flac 63360 +2428/83705/2428-83705-0021.flac 62000 +2428/83705/2428-83705-0018.flac 94160 +2428/83705/2428-83705-0036.flac 31360 +2428/83705/2428-83705-0027.flac 37120 +2428/83705/2428-83705-0001.flac 109520 +2428/83705/2428-83705-0039.flac 51200 +2428/83705/2428-83705-0025.flac 157520 +2428/83705/2428-83705-0028.flac 148000 +2428/83705/2428-83705-0020.flac 88400 +2428/83705/2428-83705-0033.flac 125120 +2428/83705/2428-83705-0026.flac 163280 +2428/83705/2428-83705-0042.flac 178800 +2428/83705/2428-83705-0038.flac 116880 +2428/83705/2428-83705-0005.flac 68240 +2428/83705/2428-83705-0008.flac 57840 +2428/83705/2428-83705-0011.flac 97840 +2428/83705/2428-83705-0013.flac 77440 +2428/83705/2428-83705-0004.flac 119520 +2428/83705/2428-83705-0023.flac 61520 +2428/83705/2428-83705-0040.flac 69840 +2428/83705/2428-83705-0032.flac 104000 +2428/83705/2428-83705-0029.flac 93280 +2428/83705/2428-83705-0016.flac 58240 +2428/83705/2428-83705-0022.flac 88400 +2428/83705/2428-83705-0009.flac 33920 +2428/83705/2428-83705-0035.flac 93840 +2428/83705/2428-83705-0014.flac 66720 +2428/83705/2428-83705-0043.flac 96160 +2428/83705/2428-83705-0012.flac 142240 +2428/83699/2428-83699-0017.flac 212560 +2428/83699/2428-83699-0026.flac 50240 +2428/83699/2428-83699-0030.flac 58000 +2428/83699/2428-83699-0029.flac 100720 +2428/83699/2428-83699-0042.flac 102880 +2428/83699/2428-83699-0021.flac 45040 +2428/83699/2428-83699-0013.flac 52640 +2428/83699/2428-83699-0035.flac 43600 +2428/83699/2428-83699-0002.flac 68160 +2428/83699/2428-83699-0031.flac 52960 +2428/83699/2428-83699-0004.flac 30080 +2428/83699/2428-83699-0023.flac 41600 +2428/83699/2428-83699-0009.flac 29600 +2428/83699/2428-83699-0038.flac 42720 +2428/83699/2428-83699-0000.flac 212880 +2428/83699/2428-83699-0006.flac 109200 +2428/83699/2428-83699-0016.flac 136240 +2428/83699/2428-83699-0015.flac 35120 +2428/83699/2428-83699-0024.flac 68000 +2428/83699/2428-83699-0012.flac 130000 +2428/83699/2428-83699-0020.flac 78240 +2428/83699/2428-83699-0019.flac 78560 +2428/83699/2428-83699-0018.flac 229520 +2428/83699/2428-83699-0005.flac 145440 +2428/83699/2428-83699-0032.flac 50800 +2428/83699/2428-83699-0037.flac 102320 +2428/83699/2428-83699-0033.flac 62720 +2428/83699/2428-83699-0011.flac 41200 +2428/83699/2428-83699-0001.flac 33120 +2428/83699/2428-83699-0014.flac 35440 +2428/83699/2428-83699-0040.flac 125200 +2428/83699/2428-83699-0010.flac 49920 +2428/83699/2428-83699-0034.flac 129920 +2428/83699/2428-83699-0022.flac 31600 +2428/83699/2428-83699-0003.flac 100240 +2428/83699/2428-83699-0036.flac 73600 +2428/83699/2428-83699-0008.flac 166080 +2428/83699/2428-83699-0039.flac 31680 +2428/83699/2428-83699-0007.flac 91360 +2428/83699/2428-83699-0025.flac 128080 +2428/83699/2428-83699-0027.flac 79440 +2428/83699/2428-83699-0041.flac 33120 +2428/83699/2428-83699-0028.flac 64000 +7976/110523/7976-110523-0008.flac 136880 +7976/110523/7976-110523-0003.flac 97600 +7976/110523/7976-110523-0019.flac 45200 +7976/110523/7976-110523-0013.flac 149120 +7976/110523/7976-110523-0010.flac 173760 +7976/110523/7976-110523-0009.flac 107600 +7976/110523/7976-110523-0017.flac 212160 +7976/110523/7976-110523-0005.flac 124720 +7976/110523/7976-110523-0016.flac 50160 +7976/110523/7976-110523-0002.flac 113920 +7976/110523/7976-110523-0021.flac 80560 +7976/110523/7976-110523-0015.flac 124000 +7976/110523/7976-110523-0000.flac 243520 +7976/110523/7976-110523-0001.flac 75520 +7976/110523/7976-110523-0011.flac 141120 +7976/110523/7976-110523-0018.flac 39360 +7976/110523/7976-110523-0020.flac 136560 +7976/110523/7976-110523-0007.flac 107280 +7976/110523/7976-110523-0006.flac 125040 +7976/110523/7976-110523-0012.flac 260480 +7976/110523/7976-110523-0014.flac 100720 +7976/105575/7976-105575-0007.flac 103680 +7976/105575/7976-105575-0003.flac 146800 +7976/105575/7976-105575-0027.flac 106800 +7976/105575/7976-105575-0028.flac 61920 +7976/105575/7976-105575-0017.flac 30960 +7976/105575/7976-105575-0016.flac 163280 +7976/105575/7976-105575-0002.flac 48720 +7976/105575/7976-105575-0020.flac 33440 +7976/105575/7976-105575-0010.flac 72400 +7976/105575/7976-105575-0024.flac 98160 +7976/105575/7976-105575-0013.flac 160400 +7976/105575/7976-105575-0022.flac 86080 +7976/105575/7976-105575-0018.flac 68640 +7976/105575/7976-105575-0000.flac 146560 +7976/105575/7976-105575-0026.flac 56800 +7976/105575/7976-105575-0021.flac 74480 +7976/105575/7976-105575-0005.flac 88960 +7976/105575/7976-105575-0009.flac 64720 +7976/105575/7976-105575-0029.flac 188640 +7976/105575/7976-105575-0004.flac 96240 +7976/105575/7976-105575-0012.flac 82480 +7976/105575/7976-105575-0001.flac 44800 +7976/105575/7976-105575-0019.flac 83600 +7976/105575/7976-105575-0006.flac 150400 +7976/105575/7976-105575-0025.flac 83760 +7976/105575/7976-105575-0015.flac 117680 +7976/105575/7976-105575-0008.flac 115040 +7976/105575/7976-105575-0023.flac 76480 +7976/105575/7976-105575-0011.flac 102800 +7976/105575/7976-105575-0014.flac 119840 +7976/110124/7976-110124-0007.flac 43840 +7976/110124/7976-110124-0025.flac 41440 +7976/110124/7976-110124-0023.flac 55040 +7976/110124/7976-110124-0017.flac 42960 +7976/110124/7976-110124-0010.flac 105760 +7976/110124/7976-110124-0013.flac 104880 +7976/110124/7976-110124-0001.flac 117601 +7976/110124/7976-110124-0020.flac 40640 +7976/110124/7976-110124-0011.flac 87520 +7976/110124/7976-110124-0000.flac 56799 +7976/110124/7976-110124-0018.flac 129200 +7976/110124/7976-110124-0008.flac 84720 +7976/110124/7976-110124-0006.flac 169920 +7976/110124/7976-110124-0012.flac 132720 +7976/110124/7976-110124-0009.flac 76960 +7976/110124/7976-110124-0024.flac 50400 +7976/110124/7976-110124-0019.flac 43920 +7976/110124/7976-110124-0016.flac 66880 +7976/110124/7976-110124-0004.flac 75760 +7976/110124/7976-110124-0015.flac 85600 +7976/110124/7976-110124-0003.flac 147680 +7976/110124/7976-110124-0021.flac 53840 +7976/110124/7976-110124-0022.flac 64320 +7976/110124/7976-110124-0014.flac 83360 +7976/110124/7976-110124-0005.flac 83360 +7976/110124/7976-110124-0002.flac 125520 +1988/148538/1988-148538-0014.flac 169840 +1988/148538/1988-148538-0012.flac 218480 +1988/148538/1988-148538-0004.flac 219200 +1988/148538/1988-148538-0005.flac 261600 +1988/148538/1988-148538-0010.flac 138960 +1988/148538/1988-148538-0009.flac 118400 +1988/148538/1988-148538-0006.flac 365840 +1988/148538/1988-148538-0000.flac 269200 +1988/148538/1988-148538-0015.flac 277360 +1988/148538/1988-148538-0013.flac 166480 +1988/148538/1988-148538-0008.flac 109040 +1988/148538/1988-148538-0011.flac 152800 +1988/148538/1988-148538-0001.flac 176320 +1988/148538/1988-148538-0007.flac 119040 +1988/148538/1988-148538-0002.flac 71200 +1988/148538/1988-148538-0003.flac 89280 +1988/24833/1988-24833-0022.flac 44240 +1988/24833/1988-24833-0004.flac 88000 +1988/24833/1988-24833-0016.flac 39280 +1988/24833/1988-24833-0015.flac 75920 +1988/24833/1988-24833-0023.flac 69120 +1988/24833/1988-24833-0011.flac 155040 +1988/24833/1988-24833-0006.flac 31680 +1988/24833/1988-24833-0001.flac 126320 +1988/24833/1988-24833-0008.flac 39520 +1988/24833/1988-24833-0014.flac 40480 +1988/24833/1988-24833-0024.flac 96080 +1988/24833/1988-24833-0009.flac 104320 +1988/24833/1988-24833-0007.flac 84480 +1988/24833/1988-24833-0005.flac 103280 +1988/24833/1988-24833-0003.flac 82560 +1988/24833/1988-24833-0021.flac 68480 +1988/24833/1988-24833-0017.flac 97920 +1988/24833/1988-24833-0019.flac 43440 +1988/24833/1988-24833-0013.flac 88560 +1988/24833/1988-24833-0012.flac 58240 +1988/24833/1988-24833-0020.flac 102400 +1988/24833/1988-24833-0018.flac 85600 +1988/24833/1988-24833-0028.flac 47200 +1988/24833/1988-24833-0027.flac 40720 +1988/24833/1988-24833-0025.flac 46560 +1988/24833/1988-24833-0000.flac 53120 +1988/24833/1988-24833-0002.flac 72880 +1988/24833/1988-24833-0010.flac 48480 +1988/24833/1988-24833-0026.flac 41520 +1988/147956/1988-147956-0020.flac 108480 +1988/147956/1988-147956-0013.flac 46240 +1988/147956/1988-147956-0021.flac 78960 +1988/147956/1988-147956-0016.flac 50720 +1988/147956/1988-147956-0007.flac 93840 +1988/147956/1988-147956-0004.flac 144400 +1988/147956/1988-147956-0018.flac 56560 +1988/147956/1988-147956-0010.flac 61680 +1988/147956/1988-147956-0025.flac 38560 +1988/147956/1988-147956-0027.flac 123680 +1988/147956/1988-147956-0005.flac 55520 +1988/147956/1988-147956-0019.flac 98160 +1988/147956/1988-147956-0014.flac 34960 +1988/147956/1988-147956-0022.flac 120640 +1988/147956/1988-147956-0026.flac 110640 +1988/147956/1988-147956-0017.flac 100800 +1988/147956/1988-147956-0008.flac 238720 +1988/147956/1988-147956-0012.flac 73120 +1988/147956/1988-147956-0024.flac 49360 +1988/147956/1988-147956-0006.flac 86080 +1988/147956/1988-147956-0028.flac 94080 +1988/147956/1988-147956-0023.flac 66240 +1988/147956/1988-147956-0001.flac 227360 +1988/147956/1988-147956-0003.flac 39920 +1988/147956/1988-147956-0009.flac 82560 +1988/147956/1988-147956-0015.flac 66800 +1988/147956/1988-147956-0029.flac 90400 +1988/147956/1988-147956-0000.flac 239200 +1988/147956/1988-147956-0002.flac 70320 +174/168635/174-168635-0013.flac 93920 +174/168635/174-168635-0016.flac 112960 +174/168635/174-168635-0004.flac 204320 +174/168635/174-168635-0011.flac 74320 +174/168635/174-168635-0018.flac 433760 +174/168635/174-168635-0014.flac 77201 +174/168635/174-168635-0010.flac 160960 +174/168635/174-168635-0007.flac 163360 +174/168635/174-168635-0000.flac 72480 +174/168635/174-168635-0019.flac 128000 +174/168635/174-168635-0020.flac 73920 +174/168635/174-168635-0017.flac 73120 +174/168635/174-168635-0006.flac 105120 +174/168635/174-168635-0002.flac 253760 +174/168635/174-168635-0001.flac 74400 +174/168635/174-168635-0008.flac 163760 +174/168635/174-168635-0005.flac 126880 +174/168635/174-168635-0009.flac 52480 +174/168635/174-168635-0012.flac 133760 +174/168635/174-168635-0022.flac 69360 +174/168635/174-168635-0015.flac 67040 +174/168635/174-168635-0003.flac 210880 +174/168635/174-168635-0021.flac 66720 +174/84280/174-84280-0014.flac 48161 +174/84280/174-84280-0004.flac 328480 +174/84280/174-84280-0007.flac 155680 +174/84280/174-84280-0015.flac 219680 +174/84280/174-84280-0006.flac 112480 +174/84280/174-84280-0001.flac 293280 +174/84280/174-84280-0003.flac 119120 +174/84280/174-84280-0005.flac 137760 +174/84280/174-84280-0010.flac 69760 +174/84280/174-84280-0008.flac 72320 +174/84280/174-84280-0000.flac 38400 +174/84280/174-84280-0009.flac 49600 +174/84280/174-84280-0012.flac 230880 +174/84280/174-84280-0011.flac 53680 +174/84280/174-84280-0002.flac 195200 +174/84280/174-84280-0013.flac 269760 +174/50561/174-50561-0019.flac 68160 +174/50561/174-50561-0008.flac 260960 +174/50561/174-50561-0004.flac 32960 +174/50561/174-50561-0014.flac 28800 +174/50561/174-50561-0005.flac 91280 +174/50561/174-50561-0013.flac 169840 +174/50561/174-50561-0016.flac 215280 +174/50561/174-50561-0018.flac 33920 +174/50561/174-50561-0011.flac 152320 +174/50561/174-50561-0012.flac 33120 +174/50561/174-50561-0007.flac 173680 +174/50561/174-50561-0017.flac 45200 +174/50561/174-50561-0002.flac 34320 +174/50561/174-50561-0010.flac 238560 +174/50561/174-50561-0000.flac 64320 +174/50561/174-50561-0003.flac 53440 +174/50561/174-50561-0006.flac 83440 +174/50561/174-50561-0015.flac 268160 +174/50561/174-50561-0009.flac 32640 +174/50561/174-50561-0001.flac 253760 +251/136532/251-136532-0007.flac 89680 +251/136532/251-136532-0014.flac 36240 +251/136532/251-136532-0005.flac 92080 +251/136532/251-136532-0009.flac 58000 +251/136532/251-136532-0020.flac 47600 +251/136532/251-136532-0017.flac 245840 +251/136532/251-136532-0002.flac 104800 +251/136532/251-136532-0011.flac 135120 +251/136532/251-136532-0016.flac 148080 +251/136532/251-136532-0012.flac 140640 +251/136532/251-136532-0004.flac 396800 +251/136532/251-136532-0023.flac 134320 +251/136532/251-136532-0001.flac 109680 +251/136532/251-136532-0010.flac 104960 +251/136532/251-136532-0003.flac 261760 +251/136532/251-136532-0018.flac 110000 +251/136532/251-136532-0015.flac 122080 +251/136532/251-136532-0019.flac 149520 +251/136532/251-136532-0006.flac 41040 +251/136532/251-136532-0021.flac 104800 +251/136532/251-136532-0022.flac 24560 +251/136532/251-136532-0013.flac 74880 +251/136532/251-136532-0008.flac 156640 +251/136532/251-136532-0000.flac 156960 +251/137823/251-137823-0022.flac 114800 +251/137823/251-137823-0016.flac 108320 +251/137823/251-137823-0020.flac 86800 +251/137823/251-137823-0019.flac 196640 +251/137823/251-137823-0000.flac 54960 +251/137823/251-137823-0026.flac 44560 +251/137823/251-137823-0011.flac 90480 +251/137823/251-137823-0023.flac 37360 +251/137823/251-137823-0006.flac 63600 +251/137823/251-137823-0014.flac 79680 +251/137823/251-137823-0012.flac 39760 +251/137823/251-137823-0025.flac 58560 +251/137823/251-137823-0010.flac 127280 +251/137823/251-137823-0008.flac 104400 +251/137823/251-137823-0015.flac 41840 +251/137823/251-137823-0003.flac 70400 +251/137823/251-137823-0004.flac 175761 +251/137823/251-137823-0005.flac 87120 +251/137823/251-137823-0002.flac 50080 +251/137823/251-137823-0024.flac 39360 +251/137823/251-137823-0007.flac 56640 +251/137823/251-137823-0017.flac 61680 +251/137823/251-137823-0013.flac 79360 +251/137823/251-137823-0018.flac 120080 +251/137823/251-137823-0001.flac 87680 +251/137823/251-137823-0021.flac 109120 +251/118436/251-118436-0016.flac 143520 +251/118436/251-118436-0002.flac 111440 +251/118436/251-118436-0013.flac 131600 +251/118436/251-118436-0012.flac 177680 +251/118436/251-118436-0005.flac 84960 +251/118436/251-118436-0004.flac 53200 +251/118436/251-118436-0001.flac 59600 +251/118436/251-118436-0009.flac 143280 +251/118436/251-118436-0019.flac 183600 +251/118436/251-118436-0021.flac 63680 +251/118436/251-118436-0014.flac 106960 +251/118436/251-118436-0015.flac 86080 +251/118436/251-118436-0003.flac 176320 +251/118436/251-118436-0010.flac 52000 +251/118436/251-118436-0018.flac 45280 +251/118436/251-118436-0017.flac 46160 +251/118436/251-118436-0007.flac 87200 +251/118436/251-118436-0000.flac 100160 +251/118436/251-118436-0023.flac 44320 +251/118436/251-118436-0011.flac 119520 +251/118436/251-118436-0008.flac 99680 +251/118436/251-118436-0006.flac 111440 +251/118436/251-118436-0022.flac 72640 +251/118436/251-118436-0020.flac 88880 +2086/149220/2086-149220-0003.flac 364960 +2086/149220/2086-149220-0043.flac 44320 +2086/149220/2086-149220-0004.flac 115520 +2086/149220/2086-149220-0045.flac 72720 +2086/149220/2086-149220-0032.flac 60160 +2086/149220/2086-149220-0024.flac 60880 +2086/149220/2086-149220-0040.flac 107200 +2086/149220/2086-149220-0000.flac 193520 +2086/149220/2086-149220-0007.flac 83840 +2086/149220/2086-149220-0037.flac 77360 +2086/149220/2086-149220-0027.flac 67920 +2086/149220/2086-149220-0006.flac 165600 +2086/149220/2086-149220-0025.flac 164080 +2086/149220/2086-149220-0020.flac 46880 +2086/149220/2086-149220-0001.flac 316480 +2086/149220/2086-149220-0031.flac 137280 +2086/149220/2086-149220-0044.flac 63200 +2086/149220/2086-149220-0005.flac 145440 +2086/149220/2086-149220-0026.flac 76960 +2086/149220/2086-149220-0023.flac 117840 +2086/149220/2086-149220-0035.flac 168799 +2086/149220/2086-149220-0028.flac 45680 +2086/149220/2086-149220-0021.flac 53360 +2086/149220/2086-149220-0048.flac 180960 +2086/149220/2086-149220-0010.flac 223200 +2086/149220/2086-149220-0012.flac 239920 +2086/149220/2086-149220-0017.flac 139200 +2086/149220/2086-149220-0038.flac 69600 +2086/149220/2086-149220-0015.flac 131040 +2086/149220/2086-149220-0014.flac 153280 +2086/149220/2086-149220-0018.flac 109280 +2086/149220/2086-149220-0036.flac 101120 +2086/149220/2086-149220-0009.flac 169600 +2086/149220/2086-149220-0033.flac 118960 +2086/149220/2086-149220-0046.flac 54640 +2086/149220/2086-149220-0030.flac 129600 +2086/149220/2086-149220-0041.flac 236880 +2086/149220/2086-149220-0011.flac 310880 +2086/149220/2086-149220-0047.flac 62720 +2086/149220/2086-149220-0013.flac 281120 +2086/149220/2086-149220-0049.flac 185680 +2086/149220/2086-149220-0008.flac 142240 +2086/149220/2086-149220-0042.flac 45440 +2086/149220/2086-149220-0039.flac 39680 +2086/149220/2086-149220-0002.flac 256160 +2086/149220/2086-149220-0022.flac 148240 +2086/149220/2086-149220-0034.flac 94560 +2086/149220/2086-149220-0019.flac 210880 +2086/149214/2086-149214-0001.flac 111520 +2086/149214/2086-149214-0004.flac 243520 +2086/149214/2086-149214-0002.flac 267920 +2086/149214/2086-149214-0000.flac 156960 +2086/149214/2086-149214-0003.flac 143919 +1272/141231/1272-141231-0022.flac 133600 +1272/141231/1272-141231-0005.flac 92960 +1272/141231/1272-141231-0010.flac 172160 +1272/141231/1272-141231-0009.flac 137920 +1272/141231/1272-141231-0019.flac 75200 +1272/141231/1272-141231-0030.flac 114080 +1272/141231/1272-141231-0001.flac 104560 +1272/141231/1272-141231-0016.flac 29600 +1272/141231/1272-141231-0024.flac 58240 +1272/141231/1272-141231-0028.flac 90400 +1272/141231/1272-141231-0012.flac 123840 +1272/141231/1272-141231-0031.flac 113840 +1272/141231/1272-141231-0026.flac 106160 +1272/141231/1272-141231-0015.flac 90880 +1272/141231/1272-141231-0000.flac 74400 +1272/141231/1272-141231-0027.flac 105120 +1272/141231/1272-141231-0020.flac 69120 +1272/141231/1272-141231-0023.flac 138560 +1272/141231/1272-141231-0002.flac 213360 +1272/141231/1272-141231-0006.flac 78880 +1272/141231/1272-141231-0025.flac 139600 +1272/141231/1272-141231-0004.flac 81440 +1272/141231/1272-141231-0021.flac 74400 +1272/141231/1272-141231-0008.flac 73520 +1272/141231/1272-141231-0011.flac 80240 +1272/141231/1272-141231-0013.flac 26239 +1272/141231/1272-141231-0032.flac 71680 +1272/141231/1272-141231-0017.flac 59760 +1272/141231/1272-141231-0003.flac 86720 +1272/141231/1272-141231-0029.flac 110080 +1272/141231/1272-141231-0007.flac 75760 +1272/141231/1272-141231-0014.flac 116880 +1272/141231/1272-141231-0018.flac 96000 +1272/135031/1272-135031-0022.flac 43120 +1272/135031/1272-135031-0002.flac 183600 +1272/135031/1272-135031-0015.flac 118000 +1272/135031/1272-135031-0012.flac 32640 +1272/135031/1272-135031-0018.flac 39119 +1272/135031/1272-135031-0024.flac 231520 +1272/135031/1272-135031-0019.flac 56400 +1272/135031/1272-135031-0020.flac 74400 +1272/135031/1272-135031-0023.flac 120320 +1272/135031/1272-135031-0010.flac 143920 +1272/135031/1272-135031-0017.flac 109760 +1272/135031/1272-135031-0021.flac 41520 +1272/135031/1272-135031-0008.flac 58720 +1272/135031/1272-135031-0003.flac 76080 +1272/135031/1272-135031-0006.flac 65440 +1272/135031/1272-135031-0005.flac 74000 +1272/135031/1272-135031-0004.flac 67600 +1272/135031/1272-135031-0014.flac 27840 +1272/135031/1272-135031-0011.flac 50880 +1272/135031/1272-135031-0016.flac 36480 +1272/135031/1272-135031-0007.flac 64880 +1272/135031/1272-135031-0013.flac 59200 +1272/135031/1272-135031-0000.flac 174160 +1272/135031/1272-135031-0009.flac 30560 +1272/135031/1272-135031-0001.flac 178080 +1272/128104/1272-128104-0007.flac 147840 +1272/128104/1272-128104-0011.flac 241840 +1272/128104/1272-128104-0004.flac 470400 +1272/128104/1272-128104-0012.flac 86080 +1272/128104/1272-128104-0006.flac 90240 +1272/128104/1272-128104-0000.flac 93680 +1272/128104/1272-128104-0002.flac 199760 +1272/128104/1272-128104-0008.flac 81920 +1272/128104/1272-128104-0014.flac 35920 +1272/128104/1272-128104-0003.flac 158400 +1272/128104/1272-128104-0001.flac 77040 +1272/128104/1272-128104-0005.flac 144160 +1272/128104/1272-128104-0009.flac 292640 +1272/128104/1272-128104-0013.flac 113600 +1272/128104/1272-128104-0010.flac 89600 +3536/23268/3536-23268-0012.flac 116080 +3536/23268/3536-23268-0015.flac 63200 +3536/23268/3536-23268-0025.flac 80240 +3536/23268/3536-23268-0006.flac 84800 +3536/23268/3536-23268-0030.flac 135600 +3536/23268/3536-23268-0014.flac 56000 +3536/23268/3536-23268-0003.flac 127920 +3536/23268/3536-23268-0008.flac 148640 +3536/23268/3536-23268-0000.flac 318240 +3536/23268/3536-23268-0019.flac 162640 +3536/23268/3536-23268-0004.flac 50080 +3536/23268/3536-23268-0017.flac 271680 +3536/23268/3536-23268-0018.flac 121360 +3536/23268/3536-23268-0024.flac 101600 +3536/23268/3536-23268-0002.flac 167920 +3536/23268/3536-23268-0022.flac 97840 +3536/23268/3536-23268-0005.flac 78880 +3536/23268/3536-23268-0029.flac 119280 +3536/23268/3536-23268-0027.flac 165040 +3536/23268/3536-23268-0007.flac 147360 +3536/23268/3536-23268-0020.flac 164320 +3536/23268/3536-23268-0009.flac 69040 +3536/23268/3536-23268-0011.flac 204720 +3536/23268/3536-23268-0028.flac 133520 +3536/23268/3536-23268-0001.flac 254480 +3536/23268/3536-23268-0021.flac 222400 +3536/23268/3536-23268-0010.flac 62480 +3536/23268/3536-23268-0013.flac 128400 +3536/23268/3536-23268-0023.flac 200720 +3536/23268/3536-23268-0016.flac 181120 +3536/23268/3536-23268-0026.flac 141200 +3536/8226/3536-8226-0010.flac 152000 +3536/8226/3536-8226-0004.flac 234000 +3536/8226/3536-8226-0009.flac 32080 +3536/8226/3536-8226-0014.flac 36320 +3536/8226/3536-8226-0001.flac 142640 +3536/8226/3536-8226-0002.flac 151200 +3536/8226/3536-8226-0023.flac 182321 +3536/8226/3536-8226-0030.flac 64800 +3536/8226/3536-8226-0000.flac 172080 +3536/8226/3536-8226-0025.flac 61280 +3536/8226/3536-8226-0005.flac 193840 +3536/8226/3536-8226-0012.flac 60560 +3536/8226/3536-8226-0018.flac 150160 +3536/8226/3536-8226-0013.flac 45920 +3536/8226/3536-8226-0021.flac 79760 +3536/8226/3536-8226-0011.flac 139760 +3536/8226/3536-8226-0006.flac 140720 +3536/8226/3536-8226-0015.flac 178400 +3536/8226/3536-8226-0017.flac 52080 +3536/8226/3536-8226-0008.flac 80160 +3536/8226/3536-8226-0024.flac 102800 +3536/8226/3536-8226-0029.flac 53680 +3536/8226/3536-8226-0007.flac 37360 +3536/8226/3536-8226-0026.flac 155200 +3536/8226/3536-8226-0020.flac 105840 +3536/8226/3536-8226-0032.flac 66560 +3536/8226/3536-8226-0027.flac 36320 +3536/8226/3536-8226-0022.flac 145600 +3536/8226/3536-8226-0031.flac 52000 +3536/8226/3536-8226-0016.flac 75840 +3536/8226/3536-8226-0028.flac 52240 +3536/8226/3536-8226-0019.flac 85280 +3536/8226/3536-8226-0003.flac 127040 +8297/275156/8297-275156-0002.flac 127040 +8297/275156/8297-275156-0000.flac 57280 +8297/275156/8297-275156-0007.flac 157120 +8297/275156/8297-275156-0011.flac 82720 +8297/275156/8297-275156-0013.flac 195040 +8297/275156/8297-275156-0004.flac 52480 +8297/275156/8297-275156-0005.flac 242880 +8297/275156/8297-275156-0008.flac 125440 +8297/275156/8297-275156-0006.flac 106880 +8297/275156/8297-275156-0010.flac 218880 +8297/275156/8297-275156-0001.flac 74240 +8297/275156/8297-275156-0003.flac 179920 +8297/275156/8297-275156-0012.flac 91200 +8297/275156/8297-275156-0009.flac 132000 +8297/275154/8297-275154-0012.flac 79520 +8297/275154/8297-275154-0016.flac 45920 +8297/275154/8297-275154-0006.flac 224000 +8297/275154/8297-275154-0020.flac 71521 +8297/275154/8297-275154-0018.flac 35280 +8297/275154/8297-275154-0011.flac 76160 +8297/275154/8297-275154-0015.flac 51520 +8297/275154/8297-275154-0002.flac 156160 +8297/275154/8297-275154-0013.flac 50160 +8297/275154/8297-275154-0001.flac 165440 +8297/275154/8297-275154-0025.flac 78080 +8297/275154/8297-275154-0008.flac 64640 +8297/275154/8297-275154-0004.flac 106480 +8297/275154/8297-275154-0014.flac 289360 +8297/275154/8297-275154-0009.flac 39680 +8297/275154/8297-275154-0003.flac 83840 +8297/275154/8297-275154-0007.flac 71840 +8297/275154/8297-275154-0023.flac 41600 +8297/275154/8297-275154-0000.flac 163520 +8297/275154/8297-275154-0021.flac 76961 +8297/275154/8297-275154-0017.flac 59200 +8297/275154/8297-275154-0005.flac 44480 +8297/275154/8297-275154-0027.flac 140000 +8297/275154/8297-275154-0022.flac 36080 +8297/275154/8297-275154-0024.flac 58640 +8297/275154/8297-275154-0026.flac 78240 +8297/275154/8297-275154-0019.flac 126080 +8297/275155/8297-275155-0021.flac 28400 +8297/275155/8297-275155-0011.flac 149280 +8297/275155/8297-275155-0032.flac 164880 +8297/275155/8297-275155-0022.flac 107040 +8297/275155/8297-275155-0027.flac 50400 +8297/275155/8297-275155-0013.flac 53360 +8297/275155/8297-275155-0004.flac 186400 +8297/275155/8297-275155-0001.flac 106000 +8297/275155/8297-275155-0017.flac 142560 +8297/275155/8297-275155-0015.flac 108960 +8297/275155/8297-275155-0019.flac 99200 +8297/275155/8297-275155-0031.flac 77360 +8297/275155/8297-275155-0006.flac 110640 +8297/275155/8297-275155-0010.flac 49680 +8297/275155/8297-275155-0030.flac 37440 +8297/275155/8297-275155-0005.flac 130240 +8297/275155/8297-275155-0016.flac 136320 +8297/275155/8297-275155-0009.flac 98320 +8297/275155/8297-275155-0014.flac 135040 +8297/275155/8297-275155-0023.flac 52480 +8297/275155/8297-275155-0025.flac 50880 +8297/275155/8297-275155-0002.flac 141600 +8297/275155/8297-275155-0029.flac 167360 +8297/275155/8297-275155-0028.flac 58400 +8297/275155/8297-275155-0012.flac 46800 +8297/275155/8297-275155-0000.flac 167520 +8297/275155/8297-275155-0008.flac 51520 +8297/275155/8297-275155-0003.flac 56800 +8297/275155/8297-275155-0007.flac 60720 +8297/275155/8297-275155-0018.flac 125520 +8297/275155/8297-275155-0024.flac 124480 +8297/275155/8297-275155-0026.flac 55280 +8297/275155/8297-275155-0020.flac 110880 +1673/143397/1673-143397-0006.flac 136560 +1673/143397/1673-143397-0003.flac 178880 +1673/143397/1673-143397-0018.flac 68240 +1673/143397/1673-143397-0000.flac 149600 +1673/143397/1673-143397-0020.flac 261120 +1673/143397/1673-143397-0011.flac 227120 +1673/143397/1673-143397-0013.flac 106800 +1673/143397/1673-143397-0010.flac 192000 +1673/143397/1673-143397-0012.flac 149280 +1673/143397/1673-143397-0008.flac 68400 +1673/143397/1673-143397-0002.flac 208480 +1673/143397/1673-143397-0016.flac 244560 +1673/143397/1673-143397-0015.flac 101520 +1673/143397/1673-143397-0005.flac 158320 +1673/143397/1673-143397-0004.flac 193120 +1673/143397/1673-143397-0014.flac 150320 +1673/143397/1673-143397-0001.flac 142320 +1673/143397/1673-143397-0019.flac 251120 +1673/143397/1673-143397-0017.flac 112880 +1673/143397/1673-143397-0007.flac 82560 +1673/143397/1673-143397-0009.flac 57600 +1673/143396/1673-143396-0007.flac 113520 +1673/143396/1673-143396-0009.flac 263360 +1673/143396/1673-143396-0000.flac 234800 +1673/143396/1673-143396-0010.flac 191920 +1673/143396/1673-143396-0004.flac 318640 +1673/143396/1673-143396-0011.flac 262640 +1673/143396/1673-143396-0002.flac 125600 +1673/143396/1673-143396-0003.flac 181680 +1673/143396/1673-143396-0015.flac 100880 +1673/143396/1673-143396-0013.flac 248320 +1673/143396/1673-143396-0018.flac 202480 +1673/143396/1673-143396-0008.flac 282400 +1673/143396/1673-143396-0006.flac 254720 +1673/143396/1673-143396-0012.flac 231520 +1673/143396/1673-143396-0016.flac 231280 +1673/143396/1673-143396-0014.flac 223760 +1673/143396/1673-143396-0020.flac 240320 +1673/143396/1673-143396-0005.flac 187841 +1673/143396/1673-143396-0001.flac 224800 +1673/143396/1673-143396-0017.flac 134880 +1673/143396/1673-143396-0019.flac 247760 +1993/147966/1993-147966-0006.flac 52640 +1993/147966/1993-147966-0000.flac 178160 +1993/147966/1993-147966-0001.flac 201040 +1993/147966/1993-147966-0005.flac 53520 +1993/147966/1993-147966-0004.flac 77840 +1993/147966/1993-147966-0002.flac 66960 +1993/147966/1993-147966-0003.flac 41520 +1993/147149/1993-147149-0003.flac 228800 +1993/147149/1993-147149-0002.flac 92160 +1993/147149/1993-147149-0015.flac 132161 +1993/147149/1993-147149-0030.flac 248320 +1993/147149/1993-147149-0014.flac 48880 +1993/147149/1993-147149-0012.flac 84480 +1993/147149/1993-147149-0008.flac 54240 +1993/147149/1993-147149-0016.flac 93520 +1993/147149/1993-147149-0023.flac 171200 +1993/147149/1993-147149-0013.flac 81200 +1993/147149/1993-147149-0027.flac 270400 +1993/147149/1993-147149-0028.flac 162720 +1993/147149/1993-147149-0006.flac 446080 +1993/147149/1993-147149-0009.flac 276480 +1993/147149/1993-147149-0020.flac 271680 +1993/147149/1993-147149-0019.flac 111360 +1993/147149/1993-147149-0021.flac 167840 +1993/147149/1993-147149-0017.flac 60480 +1993/147149/1993-147149-0005.flac 127680 +1993/147149/1993-147149-0004.flac 118400 +1993/147149/1993-147149-0007.flac 126560 +1993/147149/1993-147149-0022.flac 264640 +1993/147149/1993-147149-0001.flac 152560 +1993/147149/1993-147149-0011.flac 49920 +1993/147149/1993-147149-0029.flac 186640 +1993/147149/1993-147149-0018.flac 212640 +1993/147149/1993-147149-0025.flac 154320 +1993/147149/1993-147149-0000.flac 107440 +1993/147149/1993-147149-0010.flac 52480 +1993/147149/1993-147149-0024.flac 187040 +1993/147149/1993-147149-0026.flac 36080 +1993/147964/1993-147964-0006.flac 55520 +1993/147964/1993-147964-0004.flac 116800 +1993/147964/1993-147964-0001.flac 76000 +1993/147964/1993-147964-0000.flac 134720 +1993/147964/1993-147964-0010.flac 329040 +1993/147964/1993-147964-0003.flac 74960 +1993/147964/1993-147964-0008.flac 112640 +1993/147964/1993-147964-0002.flac 101280 +1993/147964/1993-147964-0007.flac 109840 +1993/147964/1993-147964-0005.flac 168240 +1993/147964/1993-147964-0009.flac 143520 +1993/147965/1993-147965-0003.flac 118000 +1993/147965/1993-147965-0007.flac 121120 +1993/147965/1993-147965-0008.flac 88000 +1993/147965/1993-147965-0002.flac 149760 +1993/147965/1993-147965-0000.flac 69920 +1993/147965/1993-147965-0001.flac 42960 +1993/147965/1993-147965-0006.flac 141280 +1993/147965/1993-147965-0005.flac 138560 +1993/147965/1993-147965-0004.flac 46640 +3081/166546/3081-166546-0025.flac 41840 +3081/166546/3081-166546-0029.flac 110160 +3081/166546/3081-166546-0006.flac 60400 +3081/166546/3081-166546-0010.flac 83280 +3081/166546/3081-166546-0046.flac 63680 +3081/166546/3081-166546-0035.flac 37920 +3081/166546/3081-166546-0022.flac 169520 +3081/166546/3081-166546-0045.flac 151760 +3081/166546/3081-166546-0081.flac 48880 +3081/166546/3081-166546-0021.flac 46560 +3081/166546/3081-166546-0067.flac 127280 +3081/166546/3081-166546-0008.flac 28320 +3081/166546/3081-166546-0085.flac 180560 +3081/166546/3081-166546-0031.flac 168800 +3081/166546/3081-166546-0086.flac 58880 +3081/166546/3081-166546-0037.flac 104480 +3081/166546/3081-166546-0070.flac 187760 +3081/166546/3081-166546-0069.flac 59360 +3081/166546/3081-166546-0009.flac 60480 +3081/166546/3081-166546-0080.flac 69040 +3081/166546/3081-166546-0075.flac 39600 +3081/166546/3081-166546-0005.flac 32320 +3081/166546/3081-166546-0040.flac 78320 +3081/166546/3081-166546-0059.flac 94720 +3081/166546/3081-166546-0014.flac 56321 +3081/166546/3081-166546-0052.flac 54560 +3081/166546/3081-166546-0065.flac 52480 +3081/166546/3081-166546-0061.flac 84560 +3081/166546/3081-166546-0064.flac 62880 +3081/166546/3081-166546-0007.flac 90480 +3081/166546/3081-166546-0019.flac 62400 +3081/166546/3081-166546-0033.flac 43680 +3081/166546/3081-166546-0000.flac 168000 +3081/166546/3081-166546-0060.flac 43840 +3081/166546/3081-166546-0056.flac 75680 +3081/166546/3081-166546-0013.flac 83520 +3081/166546/3081-166546-0042.flac 83120 +3081/166546/3081-166546-0077.flac 166800 +3081/166546/3081-166546-0048.flac 76960 +3081/166546/3081-166546-0044.flac 71920 +3081/166546/3081-166546-0015.flac 43520 +3081/166546/3081-166546-0004.flac 57200 +3081/166546/3081-166546-0024.flac 69360 +3081/166546/3081-166546-0072.flac 51680 +3081/166546/3081-166546-0032.flac 59040 +3081/166546/3081-166546-0043.flac 90000 +3081/166546/3081-166546-0051.flac 179680 +3081/166546/3081-166546-0050.flac 60160 +3081/166546/3081-166546-0063.flac 27840 +3081/166546/3081-166546-0087.flac 154000 +3081/166546/3081-166546-0011.flac 99360 +3081/166546/3081-166546-0068.flac 40480 +3081/166546/3081-166546-0078.flac 69280 +3081/166546/3081-166546-0073.flac 23120 +3081/166546/3081-166546-0054.flac 55121 +3081/166546/3081-166546-0028.flac 63680 +3081/166546/3081-166546-0082.flac 122560 +3081/166546/3081-166546-0066.flac 75200 +3081/166546/3081-166546-0012.flac 107520 +3081/166546/3081-166546-0041.flac 43760 +3081/166546/3081-166546-0076.flac 31040 +3081/166546/3081-166546-0016.flac 122960 +3081/166546/3081-166546-0039.flac 67200 +3081/166546/3081-166546-0084.flac 53600 +3081/166546/3081-166546-0058.flac 70960 +3081/166546/3081-166546-0036.flac 43840 +3081/166546/3081-166546-0062.flac 129120 +3081/166546/3081-166546-0055.flac 62000 +3081/166546/3081-166546-0020.flac 85440 +3081/166546/3081-166546-0027.flac 63600 +3081/166546/3081-166546-0034.flac 79440 +3081/166546/3081-166546-0057.flac 42720 +3081/166546/3081-166546-0030.flac 223760 +3081/166546/3081-166546-0001.flac 153920 +3081/166546/3081-166546-0074.flac 177920 +3081/166546/3081-166546-0079.flac 132080 +3081/166546/3081-166546-0089.flac 200320 +3081/166546/3081-166546-0038.flac 49360 +3081/166546/3081-166546-0018.flac 28400 +3081/166546/3081-166546-0003.flac 66000 +3081/166546/3081-166546-0026.flac 156960 +3081/166546/3081-166546-0083.flac 45840 +3081/166546/3081-166546-0071.flac 101520 +3081/166546/3081-166546-0053.flac 42800 +3081/166546/3081-166546-0049.flac 55920 +3081/166546/3081-166546-0023.flac 164560 +3081/166546/3081-166546-0002.flac 45280 +3081/166546/3081-166546-0088.flac 172960 +3081/166546/3081-166546-0047.flac 76160 +3081/166546/3081-166546-0017.flac 64080 +1919/142785/1919-142785-0049.flac 253360 +1919/142785/1919-142785-0041.flac 194400 +1919/142785/1919-142785-0034.flac 58880 +1919/142785/1919-142785-0029.flac 42000 +1919/142785/1919-142785-0025.flac 128080 +1919/142785/1919-142785-0063.flac 44800 +1919/142785/1919-142785-0061.flac 278880 +1919/142785/1919-142785-0004.flac 130720 +1919/142785/1919-142785-0054.flac 123600 +1919/142785/1919-142785-0016.flac 44480 +1919/142785/1919-142785-0005.flac 301760 +1919/142785/1919-142785-0000.flac 42560 +1919/142785/1919-142785-0045.flac 97760 +1919/142785/1919-142785-0001.flac 176800 +1919/142785/1919-142785-0024.flac 45760 +1919/142785/1919-142785-0015.flac 68640 +1919/142785/1919-142785-0057.flac 132960 +1919/142785/1919-142785-0047.flac 282640 +1919/142785/1919-142785-0044.flac 92320 +1919/142785/1919-142785-0033.flac 123360 +1919/142785/1919-142785-0006.flac 44800 +1919/142785/1919-142785-0011.flac 224000 +1919/142785/1919-142785-0060.flac 118480 +1919/142785/1919-142785-0009.flac 93440 +1919/142785/1919-142785-0046.flac 42160 +1919/142785/1919-142785-0007.flac 426000 +1919/142785/1919-142785-0002.flac 164160 +1919/142785/1919-142785-0035.flac 57760 +1919/142785/1919-142785-0008.flac 324560 +1919/142785/1919-142785-0027.flac 152560 +1919/142785/1919-142785-0012.flac 86480 +1919/142785/1919-142785-0059.flac 139920 +1919/142785/1919-142785-0040.flac 126720 +1919/142785/1919-142785-0017.flac 113680 +1919/142785/1919-142785-0042.flac 61920 +1919/142785/1919-142785-0010.flac 184080 +1919/142785/1919-142785-0037.flac 47520 +1919/142785/1919-142785-0051.flac 148640 +1919/142785/1919-142785-0058.flac 37760 +1919/142785/1919-142785-0030.flac 149920 +1919/142785/1919-142785-0036.flac 222000 +1919/142785/1919-142785-0031.flac 82480 +1919/142785/1919-142785-0020.flac 149440 +1919/142785/1919-142785-0056.flac 33600 +1919/142785/1919-142785-0043.flac 113360 +1919/142785/1919-142785-0021.flac 27040 +1919/142785/1919-142785-0014.flac 130080 +1919/142785/1919-142785-0038.flac 94480 +1919/142785/1919-142785-0018.flac 112960 +1919/142785/1919-142785-0019.flac 134080 +1919/142785/1919-142785-0048.flac 29440 +1919/142785/1919-142785-0023.flac 115840 +1919/142785/1919-142785-0032.flac 94720 +1919/142785/1919-142785-0050.flac 140640 +1919/142785/1919-142785-0055.flac 152160 +1919/142785/1919-142785-0052.flac 49600 +1919/142785/1919-142785-0053.flac 176960 +1919/142785/1919-142785-0026.flac 90480 +1919/142785/1919-142785-0003.flac 86480 +1919/142785/1919-142785-0062.flac 66240 +1919/142785/1919-142785-0022.flac 108320 +1919/142785/1919-142785-0028.flac 82560 +1919/142785/1919-142785-0013.flac 96160 +1919/142785/1919-142785-0039.flac 46080 +1462/170142/1462-170142-0027.flac 67040 +1462/170142/1462-170142-0042.flac 51840 +1462/170142/1462-170142-0025.flac 88800 +1462/170142/1462-170142-0009.flac 101360 +1462/170142/1462-170142-0020.flac 79120 +1462/170142/1462-170142-0036.flac 49120 +1462/170142/1462-170142-0012.flac 106720 +1462/170142/1462-170142-0031.flac 77200 +1462/170142/1462-170142-0030.flac 43280 +1462/170142/1462-170142-0019.flac 163920 +1462/170142/1462-170142-0014.flac 40800 +1462/170142/1462-170142-0002.flac 103200 +1462/170142/1462-170142-0006.flac 99120 +1462/170142/1462-170142-0000.flac 75440 +1462/170142/1462-170142-0018.flac 52240 +1462/170142/1462-170142-0029.flac 63600 +1462/170142/1462-170142-0038.flac 77760 +1462/170142/1462-170142-0035.flac 42720 +1462/170142/1462-170142-0037.flac 69200 +1462/170142/1462-170142-0008.flac 76960 +1462/170142/1462-170142-0033.flac 66880 +1462/170142/1462-170142-0032.flac 44320 +1462/170142/1462-170142-0040.flac 73600 +1462/170142/1462-170142-0004.flac 116080 +1462/170142/1462-170142-0024.flac 34480 +1462/170142/1462-170142-0005.flac 177280 +1462/170142/1462-170142-0011.flac 52160 +1462/170142/1462-170142-0015.flac 48160 +1462/170142/1462-170142-0028.flac 48080 +1462/170142/1462-170142-0010.flac 73280 +1462/170142/1462-170142-0023.flac 44960 +1462/170142/1462-170142-0003.flac 37920 +1462/170142/1462-170142-0026.flac 77360 +1462/170142/1462-170142-0001.flac 153360 +1462/170142/1462-170142-0034.flac 40320 +1462/170142/1462-170142-0013.flac 62400 +1462/170142/1462-170142-0039.flac 75440 +1462/170142/1462-170142-0021.flac 130720 +1462/170142/1462-170142-0007.flac 39040 +1462/170142/1462-170142-0017.flac 37040 +1462/170142/1462-170142-0022.flac 60160 +1462/170142/1462-170142-0016.flac 99840 +1462/170142/1462-170142-0041.flac 89200 +1462/170138/1462-170138-0010.flac 137840 +1462/170138/1462-170138-0026.flac 38160 +1462/170138/1462-170138-0022.flac 98960 +1462/170138/1462-170138-0003.flac 37120 +1462/170138/1462-170138-0002.flac 74320 +1462/170138/1462-170138-0020.flac 37600 +1462/170138/1462-170138-0012.flac 61760 +1462/170138/1462-170138-0023.flac 152000 +1462/170138/1462-170138-0001.flac 63760 +1462/170138/1462-170138-0004.flac 40160 +1462/170138/1462-170138-0016.flac 54880 +1462/170138/1462-170138-0009.flac 40080 +1462/170138/1462-170138-0018.flac 70479 +1462/170138/1462-170138-0024.flac 261600 +1462/170138/1462-170138-0008.flac 101120 +1462/170138/1462-170138-0006.flac 137280 +1462/170138/1462-170138-0014.flac 78720 +1462/170138/1462-170138-0011.flac 182720 +1462/170138/1462-170138-0007.flac 84080 +1462/170138/1462-170138-0025.flac 71040 +1462/170138/1462-170138-0005.flac 210640 +1462/170138/1462-170138-0017.flac 99360 +1462/170138/1462-170138-0019.flac 56880 +1462/170138/1462-170138-0021.flac 154320 +1462/170138/1462-170138-0015.flac 54080 +1462/170138/1462-170138-0013.flac 112320 +1462/170138/1462-170138-0027.flac 80080 +1462/170138/1462-170138-0000.flac 232800 +1462/170145/1462-170145-0009.flac 46800 +1462/170145/1462-170145-0006.flac 55360 +1462/170145/1462-170145-0012.flac 43200 +1462/170145/1462-170145-0010.flac 47120 +1462/170145/1462-170145-0003.flac 139760 +1462/170145/1462-170145-0004.flac 132400 +1462/170145/1462-170145-0022.flac 104160 +1462/170145/1462-170145-0018.flac 32400 +1462/170145/1462-170145-0015.flac 96880 +1462/170145/1462-170145-0019.flac 43040 +1462/170145/1462-170145-0001.flac 77201 +1462/170145/1462-170145-0021.flac 40880 +1462/170145/1462-170145-0011.flac 39440 +1462/170145/1462-170145-0008.flac 50400 +1462/170145/1462-170145-0007.flac 101120 +1462/170145/1462-170145-0016.flac 66800 +1462/170145/1462-170145-0017.flac 52080 +1462/170145/1462-170145-0000.flac 246480 +1462/170145/1462-170145-0005.flac 59520 +1462/170145/1462-170145-0014.flac 47520 +1462/170145/1462-170145-0020.flac 34400 +1462/170145/1462-170145-0002.flac 45520 +1462/170145/1462-170145-0013.flac 76800 +2277/149897/2277-149897-0024.flac 46960 +2277/149897/2277-149897-0021.flac 74960 +2277/149897/2277-149897-0003.flac 77440 +2277/149897/2277-149897-0036.flac 70720 +2277/149897/2277-149897-0007.flac 125680 +2277/149897/2277-149897-0034.flac 194560 +2277/149897/2277-149897-0004.flac 91760 +2277/149897/2277-149897-0008.flac 46080 +2277/149897/2277-149897-0025.flac 68560 +2277/149897/2277-149897-0016.flac 104641 +2277/149897/2277-149897-0033.flac 81040 +2277/149897/2277-149897-0032.flac 139040 +2277/149897/2277-149897-0017.flac 116800 +2277/149897/2277-149897-0035.flac 55200 +2277/149897/2277-149897-0031.flac 70480 +2277/149897/2277-149897-0027.flac 56240 +2277/149897/2277-149897-0037.flac 48160 +2277/149897/2277-149897-0010.flac 58000 +2277/149897/2277-149897-0001.flac 44080 +2277/149897/2277-149897-0028.flac 58000 +2277/149897/2277-149897-0019.flac 77600 +2277/149897/2277-149897-0011.flac 52800 +2277/149897/2277-149897-0012.flac 49440 +2277/149897/2277-149897-0015.flac 48640 +2277/149897/2277-149897-0002.flac 104640 +2277/149897/2277-149897-0030.flac 40800 +2277/149897/2277-149897-0022.flac 160800 +2277/149897/2277-149897-0005.flac 183440 +2277/149897/2277-149897-0020.flac 73920 +2277/149897/2277-149897-0000.flac 70320 +2277/149897/2277-149897-0014.flac 73920 +2277/149897/2277-149897-0026.flac 109040 +2277/149897/2277-149897-0029.flac 122320 +2277/149897/2277-149897-0009.flac 59600 +2277/149897/2277-149897-0013.flac 70640 +2277/149897/2277-149897-0018.flac 107920 +2277/149897/2277-149897-0006.flac 54160 +2277/149896/2277-149896-0019.flac 56960 +2277/149896/2277-149896-0015.flac 58800 +2277/149896/2277-149896-0006.flac 79520 +2277/149896/2277-149896-0033.flac 45520 +2277/149896/2277-149896-0027.flac 57520 +2277/149896/2277-149896-0017.flac 79760 +2277/149896/2277-149896-0013.flac 97440 +2277/149896/2277-149896-0009.flac 93040 +2277/149896/2277-149896-0007.flac 86000 +2277/149896/2277-149896-0024.flac 72000 +2277/149896/2277-149896-0008.flac 111040 +2277/149896/2277-149896-0010.flac 84400 +2277/149896/2277-149896-0034.flac 64080 +2277/149896/2277-149896-0011.flac 71440 +2277/149896/2277-149896-0022.flac 54080 +2277/149896/2277-149896-0016.flac 44560 +2277/149896/2277-149896-0020.flac 84560 +2277/149896/2277-149896-0030.flac 100800 +2277/149896/2277-149896-0028.flac 46400 +2277/149896/2277-149896-0000.flac 105440 +2277/149896/2277-149896-0004.flac 31280 +2277/149896/2277-149896-0014.flac 65120 +2277/149896/2277-149896-0023.flac 62240 +2277/149896/2277-149896-0012.flac 39920 +2277/149896/2277-149896-0025.flac 54400 +2277/149896/2277-149896-0031.flac 57760 +2277/149896/2277-149896-0021.flac 53920 +2277/149896/2277-149896-0018.flac 72720 +2277/149896/2277-149896-0026.flac 78720 +2277/149896/2277-149896-0029.flac 41600 +2277/149896/2277-149896-0002.flac 77360 +2277/149896/2277-149896-0001.flac 114320 +2277/149896/2277-149896-0032.flac 172320 +2277/149896/2277-149896-0003.flac 45440 +2277/149874/2277-149874-0006.flac 43920 +2277/149874/2277-149874-0013.flac 50560 +2277/149874/2277-149874-0004.flac 51440 +2277/149874/2277-149874-0003.flac 123200 +2277/149874/2277-149874-0000.flac 248080 +2277/149874/2277-149874-0011.flac 39440 +2277/149874/2277-149874-0021.flac 47760 +2277/149874/2277-149874-0001.flac 112640 +2277/149874/2277-149874-0014.flac 137600 +2277/149874/2277-149874-0009.flac 53600 +2277/149874/2277-149874-0017.flac 53760 +2277/149874/2277-149874-0007.flac 70400 +2277/149874/2277-149874-0005.flac 101920 +2277/149874/2277-149874-0012.flac 81280 +2277/149874/2277-149874-0010.flac 118720 +2277/149874/2277-149874-0020.flac 118080 +2277/149874/2277-149874-0015.flac 75680 +2277/149874/2277-149874-0016.flac 85200 +2277/149874/2277-149874-0008.flac 86160 +2277/149874/2277-149874-0018.flac 80320 +2277/149874/2277-149874-0019.flac 135200 +2277/149874/2277-149874-0002.flac 81520 +7850/281318/7850-281318-0003.flac 51280 +7850/281318/7850-281318-0019.flac 87760 +7850/281318/7850-281318-0005.flac 36320 +7850/281318/7850-281318-0007.flac 68960 +7850/281318/7850-281318-0020.flac 34799 +7850/281318/7850-281318-0016.flac 52880 +7850/281318/7850-281318-0021.flac 125841 +7850/281318/7850-281318-0014.flac 127440 +7850/281318/7850-281318-0001.flac 69360 +7850/281318/7850-281318-0022.flac 61600 +7850/281318/7850-281318-0012.flac 68400 +7850/281318/7850-281318-0004.flac 133520 +7850/281318/7850-281318-0018.flac 75520 +7850/281318/7850-281318-0015.flac 46080 +7850/281318/7850-281318-0002.flac 68640 +7850/281318/7850-281318-0011.flac 120560 +7850/281318/7850-281318-0000.flac 66800 +7850/281318/7850-281318-0023.flac 83360 +7850/281318/7850-281318-0008.flac 97760 +7850/281318/7850-281318-0017.flac 139360 +7850/281318/7850-281318-0010.flac 192960 +7850/281318/7850-281318-0013.flac 96640 +7850/281318/7850-281318-0006.flac 120640 +7850/281318/7850-281318-0009.flac 139280 +7850/73752/7850-73752-0013.flac 41280 +7850/73752/7850-73752-0016.flac 57440 +7850/73752/7850-73752-0007.flac 164400 +7850/73752/7850-73752-0005.flac 34240 +7850/73752/7850-73752-0008.flac 169760 +7850/73752/7850-73752-0009.flac 117520 +7850/73752/7850-73752-0014.flac 39600 +7850/73752/7850-73752-0012.flac 70080 +7850/73752/7850-73752-0018.flac 454400 +7850/73752/7850-73752-0003.flac 463120 +7850/73752/7850-73752-0002.flac 145760 +7850/73752/7850-73752-0011.flac 47360 +7850/73752/7850-73752-0004.flac 61840 +7850/73752/7850-73752-0000.flac 50480 +7850/73752/7850-73752-0001.flac 129120 +7850/73752/7850-73752-0017.flac 95520 +7850/73752/7850-73752-0015.flac 122800 +7850/73752/7850-73752-0006.flac 161200 +7850/73752/7850-73752-0019.flac 49200 +7850/73752/7850-73752-0010.flac 224640 +7850/111771/7850-111771-0007.flac 175600 +7850/111771/7850-111771-0004.flac 176081 +7850/111771/7850-111771-0005.flac 52720 +7850/111771/7850-111771-0008.flac 110640 +7850/111771/7850-111771-0009.flac 132800 +7850/111771/7850-111771-0006.flac 61280 +7850/111771/7850-111771-0000.flac 120960 +7850/111771/7850-111771-0001.flac 106400 +7850/111771/7850-111771-0002.flac 133120 +7850/111771/7850-111771-0003.flac 54800 +7850/286674/7850-286674-0005.flac 123200 +7850/286674/7850-286674-0009.flac 115040 +7850/286674/7850-286674-0000.flac 135280 +7850/286674/7850-286674-0003.flac 99520 +7850/286674/7850-286674-0014.flac 124480 +7850/286674/7850-286674-0004.flac 128320 +7850/286674/7850-286674-0016.flac 178320 +7850/286674/7850-286674-0011.flac 146400 +7850/286674/7850-286674-0001.flac 45600 +7850/286674/7850-286674-0017.flac 43920 +7850/286674/7850-286674-0008.flac 44000 +7850/286674/7850-286674-0002.flac 91360 +7850/286674/7850-286674-0006.flac 52800 +7850/286674/7850-286674-0012.flac 64320 +7850/286674/7850-286674-0015.flac 56480 +7850/286674/7850-286674-0013.flac 37520 +7850/286674/7850-286674-0010.flac 205680 +7850/286674/7850-286674-0007.flac 55280 +422/122949/422-122949-0020.flac 374560 +422/122949/422-122949-0008.flac 148800 +422/122949/422-122949-0015.flac 279440 +422/122949/422-122949-0002.flac 71600 +422/122949/422-122949-0005.flac 156240 +422/122949/422-122949-0012.flac 251200 +422/122949/422-122949-0010.flac 519040 +422/122949/422-122949-0027.flac 305920 +422/122949/422-122949-0016.flac 80240 +422/122949/422-122949-0003.flac 303280 +422/122949/422-122949-0023.flac 239040 +422/122949/422-122949-0004.flac 111760 +422/122949/422-122949-0035.flac 75120 +422/122949/422-122949-0007.flac 238880 +422/122949/422-122949-0001.flac 199280 +422/122949/422-122949-0026.flac 209760 +422/122949/422-122949-0017.flac 35040 +422/122949/422-122949-0014.flac 460720 +422/122949/422-122949-0000.flac 323520 +422/122949/422-122949-0006.flac 228720 +422/122949/422-122949-0028.flac 58640 +422/122949/422-122949-0021.flac 203040 +422/122949/422-122949-0033.flac 88880 +422/122949/422-122949-0018.flac 233040 +422/122949/422-122949-0009.flac 389840 +422/122949/422-122949-0024.flac 155840 +422/122949/422-122949-0029.flac 46640 +422/122949/422-122949-0022.flac 260560 +422/122949/422-122949-0034.flac 239760 +422/122949/422-122949-0019.flac 305840 +422/122949/422-122949-0030.flac 47040 +422/122949/422-122949-0013.flac 522320 +422/122949/422-122949-0032.flac 213760 +422/122949/422-122949-0031.flac 109760 +422/122949/422-122949-0011.flac 275600 +6295/244435/6295-244435-0003.flac 51920 +6295/244435/6295-244435-0014.flac 32320 +6295/244435/6295-244435-0000.flac 49680 +6295/244435/6295-244435-0037.flac 82880 +6295/244435/6295-244435-0013.flac 107360 +6295/244435/6295-244435-0018.flac 85200 +6295/244435/6295-244435-0035.flac 51120 +6295/244435/6295-244435-0005.flac 70400 +6295/244435/6295-244435-0020.flac 119040 +6295/244435/6295-244435-0006.flac 45440 +6295/244435/6295-244435-0027.flac 38720 +6295/244435/6295-244435-0029.flac 59360 +6295/244435/6295-244435-0028.flac 40960 +6295/244435/6295-244435-0034.flac 54720 +6295/244435/6295-244435-0012.flac 73280 +6295/244435/6295-244435-0030.flac 88720 +6295/244435/6295-244435-0008.flac 214400 +6295/244435/6295-244435-0031.flac 76000 +6295/244435/6295-244435-0017.flac 136800 +6295/244435/6295-244435-0036.flac 115440 +6295/244435/6295-244435-0011.flac 40400 +6295/244435/6295-244435-0025.flac 95840 +6295/244435/6295-244435-0004.flac 197040 +6295/244435/6295-244435-0038.flac 149280 +6295/244435/6295-244435-0024.flac 67120 +6295/244435/6295-244435-0033.flac 164000 +6295/244435/6295-244435-0023.flac 54560 +6295/244435/6295-244435-0021.flac 47520 +6295/244435/6295-244435-0009.flac 132240 +6295/244435/6295-244435-0026.flac 53440 +6295/244435/6295-244435-0015.flac 35760 +6295/244435/6295-244435-0010.flac 161440 +6295/244435/6295-244435-0040.flac 62480 +6295/244435/6295-244435-0032.flac 63040 +6295/244435/6295-244435-0016.flac 184160 +6295/244435/6295-244435-0022.flac 122800 +6295/244435/6295-244435-0019.flac 64240 +6295/244435/6295-244435-0039.flac 146320 +6295/244435/6295-244435-0002.flac 97680 +6295/244435/6295-244435-0001.flac 126160 +6295/244435/6295-244435-0007.flac 73440 +6295/64301/6295-64301-0031.flac 108160 +6295/64301/6295-64301-0018.flac 159120 +6295/64301/6295-64301-0026.flac 166880 +6295/64301/6295-64301-0027.flac 102400 +6295/64301/6295-64301-0028.flac 170400 +6295/64301/6295-64301-0013.flac 96000 +6295/64301/6295-64301-0002.flac 107520 +6295/64301/6295-64301-0019.flac 157840 +6295/64301/6295-64301-0014.flac 73120 +6295/64301/6295-64301-0029.flac 184080 +6295/64301/6295-64301-0022.flac 170560 +6295/64301/6295-64301-0003.flac 108320 +6295/64301/6295-64301-0015.flac 116720 +6295/64301/6295-64301-0025.flac 91280 +6295/64301/6295-64301-0024.flac 103440 +6295/64301/6295-64301-0012.flac 104240 +6295/64301/6295-64301-0006.flac 104640 +6295/64301/6295-64301-0032.flac 41440 +6295/64301/6295-64301-0009.flac 48080 +6295/64301/6295-64301-0021.flac 130720 +6295/64301/6295-64301-0011.flac 161280 +6295/64301/6295-64301-0005.flac 102880 +6295/64301/6295-64301-0007.flac 70320 +6295/64301/6295-64301-0016.flac 109600 +6295/64301/6295-64301-0001.flac 75680 +6295/64301/6295-64301-0010.flac 128800 +6295/64301/6295-64301-0030.flac 87280 +6295/64301/6295-64301-0004.flac 60320 +6295/64301/6295-64301-0000.flac 282400 +6295/64301/6295-64301-0023.flac 333120 +6295/64301/6295-64301-0020.flac 95040 +6295/64301/6295-64301-0017.flac 87760 +6295/64301/6295-64301-0008.flac 44800 +6241/61946/6241-61946-0019.flac 36320 +6241/61946/6241-61946-0023.flac 105360 +6241/61946/6241-61946-0006.flac 126880 +6241/61946/6241-61946-0013.flac 153920 +6241/61946/6241-61946-0001.flac 96800 +6241/61946/6241-61946-0003.flac 135040 +6241/61946/6241-61946-0014.flac 85520 +6241/61946/6241-61946-0002.flac 87760 +6241/61946/6241-61946-0021.flac 71280 +6241/61946/6241-61946-0016.flac 101280 +6241/61946/6241-61946-0008.flac 68560 +6241/61946/6241-61946-0005.flac 47200 +6241/61946/6241-61946-0007.flac 96320 +6241/61946/6241-61946-0020.flac 191280 +6241/61946/6241-61946-0010.flac 51360 +6241/61946/6241-61946-0004.flac 88240 +6241/61946/6241-61946-0012.flac 47600 +6241/61946/6241-61946-0009.flac 68640 +6241/61946/6241-61946-0022.flac 132400 +6241/61946/6241-61946-0017.flac 71280 +6241/61946/6241-61946-0011.flac 161681 +6241/61946/6241-61946-0000.flac 99760 +6241/61946/6241-61946-0015.flac 63520 +6241/61946/6241-61946-0018.flac 62480 +6241/66616/6241-66616-0008.flac 284800 +6241/66616/6241-66616-0018.flac 117200 +6241/66616/6241-66616-0002.flac 67120 +6241/66616/6241-66616-0014.flac 139120 +6241/66616/6241-66616-0010.flac 150400 +6241/66616/6241-66616-0013.flac 82880 +6241/66616/6241-66616-0009.flac 178320 +6241/66616/6241-66616-0006.flac 92720 +6241/66616/6241-66616-0004.flac 77520 +6241/66616/6241-66616-0015.flac 73920 +6241/66616/6241-66616-0019.flac 101040 +6241/66616/6241-66616-0007.flac 81840 +6241/66616/6241-66616-0001.flac 129680 +6241/66616/6241-66616-0025.flac 164880 +6241/66616/6241-66616-0012.flac 170080 +6241/66616/6241-66616-0003.flac 87760 +6241/66616/6241-66616-0005.flac 172960 +6241/66616/6241-66616-0000.flac 148320 +6241/66616/6241-66616-0017.flac 104880 +6241/66616/6241-66616-0021.flac 66560 +6241/66616/6241-66616-0024.flac 66800 +6241/66616/6241-66616-0020.flac 46480 +6241/66616/6241-66616-0022.flac 101120 +6241/66616/6241-66616-0023.flac 42640 +6241/66616/6241-66616-0011.flac 171600 +6241/66616/6241-66616-0016.flac 80800 +6241/61943/6241-61943-0000.flac 111200 +6241/61943/6241-61943-0027.flac 285920 +6241/61943/6241-61943-0015.flac 39840 +6241/61943/6241-61943-0011.flac 62400 +6241/61943/6241-61943-0020.flac 70320 +6241/61943/6241-61943-0019.flac 46480 +6241/61943/6241-61943-0014.flac 107840 +6241/61943/6241-61943-0007.flac 42240 +6241/61943/6241-61943-0008.flac 129761 +6241/61943/6241-61943-0012.flac 93760 +6241/61943/6241-61943-0023.flac 69680 +6241/61943/6241-61943-0003.flac 125200 +6241/61943/6241-61943-0006.flac 61280 +6241/61943/6241-61943-0022.flac 48320 +6241/61943/6241-61943-0026.flac 145680 +6241/61943/6241-61943-0002.flac 43760 +6241/61943/6241-61943-0010.flac 72480 +6241/61943/6241-61943-0004.flac 54560 +6241/61943/6241-61943-0018.flac 115040 +6241/61943/6241-61943-0017.flac 97440 +6241/61943/6241-61943-0025.flac 100160 +6241/61943/6241-61943-0021.flac 40320 +6241/61943/6241-61943-0009.flac 61520 +6241/61943/6241-61943-0013.flac 127520 +6241/61943/6241-61943-0016.flac 74640 +6241/61943/6241-61943-0005.flac 78400 +2902/9006/2902-9006-0002.flac 190000 +2902/9006/2902-9006-0019.flac 227680 +2902/9006/2902-9006-0018.flac 512800 +2902/9006/2902-9006-0013.flac 284320 +2902/9006/2902-9006-0004.flac 60800 +2902/9006/2902-9006-0020.flac 86800 +2902/9006/2902-9006-0014.flac 326560 +2902/9006/2902-9006-0015.flac 519760 +2902/9006/2902-9006-0000.flac 76800 +2902/9006/2902-9006-0001.flac 369120 +2902/9006/2902-9006-0011.flac 69200 +2902/9006/2902-9006-0016.flac 192320 +2902/9006/2902-9006-0006.flac 64000 +2902/9006/2902-9006-0012.flac 102720 +2902/9006/2902-9006-0010.flac 66720 +2902/9006/2902-9006-0007.flac 506240 +2902/9006/2902-9006-0003.flac 236800 +2902/9006/2902-9006-0009.flac 191520 +2902/9006/2902-9006-0005.flac 516960 +2902/9006/2902-9006-0008.flac 177280 +2902/9008/2902-9008-0010.flac 128320 +2902/9008/2902-9008-0011.flac 110560 +2902/9008/2902-9008-0013.flac 188400 +2902/9008/2902-9008-0015.flac 43520 +2902/9008/2902-9008-0016.flac 53840 +2902/9008/2902-9008-0003.flac 231600 +2902/9008/2902-9008-0005.flac 83360 +2902/9008/2902-9008-0008.flac 34480 +2902/9008/2902-9008-0014.flac 215840 +2902/9008/2902-9008-0004.flac 90080 +2902/9008/2902-9008-0012.flac 109200 +2902/9008/2902-9008-0007.flac 95520 +2902/9008/2902-9008-0000.flac 187520 +2902/9008/2902-9008-0002.flac 390320 +2902/9008/2902-9008-0001.flac 270640 +2902/9008/2902-9008-0006.flac 293520 +2902/9008/2902-9008-0009.flac 86640 +5895/34615/5895-34615-0021.flac 194480 +5895/34615/5895-34615-0016.flac 234880 +5895/34615/5895-34615-0019.flac 109680 +5895/34615/5895-34615-0017.flac 117760 +5895/34615/5895-34615-0018.flac 36400 +5895/34615/5895-34615-0015.flac 139920 +5895/34615/5895-34615-0008.flac 48880 +5895/34615/5895-34615-0010.flac 124320 +5895/34615/5895-34615-0014.flac 82561 +5895/34615/5895-34615-0004.flac 255200 +5895/34615/5895-34615-0002.flac 139680 +5895/34615/5895-34615-0003.flac 105680 +5895/34615/5895-34615-0005.flac 39920 +5895/34615/5895-34615-0000.flac 53360 +5895/34615/5895-34615-0001.flac 52880 +5895/34615/5895-34615-0011.flac 44160 +5895/34615/5895-34615-0006.flac 40400 +5895/34615/5895-34615-0013.flac 75920 +5895/34615/5895-34615-0012.flac 165360 +5895/34615/5895-34615-0009.flac 44480 +5895/34615/5895-34615-0007.flac 91280 +5895/34615/5895-34615-0020.flac 152480 +5895/34622/5895-34622-0015.flac 48800 +5895/34622/5895-34622-0000.flac 53920 +5895/34622/5895-34622-0009.flac 174240 +5895/34622/5895-34622-0023.flac 93520 +5895/34622/5895-34622-0018.flac 79680 +5895/34622/5895-34622-0008.flac 141120 +5895/34622/5895-34622-0005.flac 117360 +5895/34622/5895-34622-0020.flac 91440 +5895/34622/5895-34622-0017.flac 134160 +5895/34622/5895-34622-0007.flac 76160 +5895/34622/5895-34622-0006.flac 69760 +5895/34622/5895-34622-0001.flac 94480 +5895/34622/5895-34622-0012.flac 72960 +5895/34622/5895-34622-0011.flac 248640 +5895/34622/5895-34622-0021.flac 45760 +5895/34622/5895-34622-0014.flac 94000 +5895/34622/5895-34622-0003.flac 81280 +5895/34622/5895-34622-0004.flac 68640 +5895/34622/5895-34622-0019.flac 135280 +5895/34622/5895-34622-0022.flac 163600 +5895/34622/5895-34622-0010.flac 52160 +5895/34622/5895-34622-0016.flac 41280 +5895/34622/5895-34622-0002.flac 46560 +5895/34622/5895-34622-0013.flac 229200 +5895/34629/5895-34629-0000.flac 36160 +5895/34629/5895-34629-0008.flac 165120 +5895/34629/5895-34629-0026.flac 216240 +5895/34629/5895-34629-0030.flac 162560 +5895/34629/5895-34629-0003.flac 50320 +5895/34629/5895-34629-0027.flac 113600 +5895/34629/5895-34629-0012.flac 58000 +5895/34629/5895-34629-0016.flac 76880 +5895/34629/5895-34629-0031.flac 57120 +5895/34629/5895-34629-0017.flac 75040 +5895/34629/5895-34629-0023.flac 126320 +5895/34629/5895-34629-0018.flac 94720 +5895/34629/5895-34629-0009.flac 75120 +5895/34629/5895-34629-0013.flac 80320 +5895/34629/5895-34629-0024.flac 65680 +5895/34629/5895-34629-0002.flac 62800 +5895/34629/5895-34629-0028.flac 86400 +5895/34629/5895-34629-0004.flac 41440 +5895/34629/5895-34629-0007.flac 131120 +5895/34629/5895-34629-0032.flac 44880 +5895/34629/5895-34629-0014.flac 38800 +5895/34629/5895-34629-0011.flac 110880 +5895/34629/5895-34629-0005.flac 35840 +5895/34629/5895-34629-0033.flac 123680 +5895/34629/5895-34629-0006.flac 118960 +5895/34629/5895-34629-0010.flac 34400 +5895/34629/5895-34629-0019.flac 55680 +5895/34629/5895-34629-0020.flac 36080 +5895/34629/5895-34629-0025.flac 77120 +5895/34629/5895-34629-0029.flac 49280 +5895/34629/5895-34629-0015.flac 114720 +5895/34629/5895-34629-0021.flac 133920 +5895/34629/5895-34629-0001.flac 51200 +3170/137482/3170-137482-0010.flac 160160 +3170/137482/3170-137482-0014.flac 56320 +3170/137482/3170-137482-0038.flac 223280 +3170/137482/3170-137482-0037.flac 91760 +3170/137482/3170-137482-0031.flac 274320 +3170/137482/3170-137482-0025.flac 119120 +3170/137482/3170-137482-0005.flac 139520 +3170/137482/3170-137482-0036.flac 109120 +3170/137482/3170-137482-0013.flac 39520 +3170/137482/3170-137482-0034.flac 125840 +3170/137482/3170-137482-0002.flac 316080 +3170/137482/3170-137482-0040.flac 212080 +3170/137482/3170-137482-0004.flac 66640 +3170/137482/3170-137482-0039.flac 324960 +3170/137482/3170-137482-0046.flac 148000 +3170/137482/3170-137482-0020.flac 117280 +3170/137482/3170-137482-0007.flac 285680 +3170/137482/3170-137482-0022.flac 224320 +3170/137482/3170-137482-0006.flac 114320 +3170/137482/3170-137482-0044.flac 267280 +3170/137482/3170-137482-0029.flac 46480 +3170/137482/3170-137482-0030.flac 102000 +3170/137482/3170-137482-0019.flac 85280 +3170/137482/3170-137482-0024.flac 108160 +3170/137482/3170-137482-0012.flac 47760 +3170/137482/3170-137482-0023.flac 196640 +3170/137482/3170-137482-0000.flac 447840 +3170/137482/3170-137482-0026.flac 145120 +3170/137482/3170-137482-0001.flac 338720 +3170/137482/3170-137482-0048.flac 115920 +3170/137482/3170-137482-0017.flac 223760 +3170/137482/3170-137482-0033.flac 39440 +3170/137482/3170-137482-0015.flac 163360 +3170/137482/3170-137482-0045.flac 74800 +3170/137482/3170-137482-0018.flac 136160 +3170/137482/3170-137482-0003.flac 309600 +3170/137482/3170-137482-0047.flac 268080 +3170/137482/3170-137482-0008.flac 61280 +3170/137482/3170-137482-0032.flac 60320 +3170/137482/3170-137482-0021.flac 159120 +3170/137482/3170-137482-0009.flac 121920 +3170/137482/3170-137482-0011.flac 138880 +3170/137482/3170-137482-0042.flac 178480 +3170/137482/3170-137482-0041.flac 112400 +3170/137482/3170-137482-0028.flac 62400 +3170/137482/3170-137482-0027.flac 211040 +3170/137482/3170-137482-0016.flac 74000 +3170/137482/3170-137482-0035.flac 158400 +3170/137482/3170-137482-0043.flac 169840 +5536/43359/5536-43359-0017.flac 88160 +5536/43359/5536-43359-0009.flac 106320 +5536/43359/5536-43359-0003.flac 196240 +5536/43359/5536-43359-0000.flac 53600 +5536/43359/5536-43359-0001.flac 165760 +5536/43359/5536-43359-0005.flac 108080 +5536/43359/5536-43359-0015.flac 74000 +5536/43359/5536-43359-0008.flac 43040 +5536/43359/5536-43359-0013.flac 106320 +5536/43359/5536-43359-0006.flac 69440 +5536/43359/5536-43359-0016.flac 96800 +5536/43359/5536-43359-0012.flac 77040 +5536/43359/5536-43359-0004.flac 101120 +5536/43359/5536-43359-0002.flac 176640 +5536/43359/5536-43359-0010.flac 60400 +5536/43359/5536-43359-0011.flac 308400 +5536/43359/5536-43359-0018.flac 95680 +5536/43359/5536-43359-0007.flac 274800 +5536/43359/5536-43359-0014.flac 72720 +5536/43363/5536-43363-0017.flac 147120 +5536/43363/5536-43363-0005.flac 264960 +5536/43363/5536-43363-0018.flac 126240 +5536/43363/5536-43363-0003.flac 163360 +5536/43363/5536-43363-0011.flac 33440 +5536/43363/5536-43363-0006.flac 191760 +5536/43363/5536-43363-0016.flac 109200 +5536/43363/5536-43363-0015.flac 75840 +5536/43363/5536-43363-0012.flac 52240 +5536/43363/5536-43363-0014.flac 181520 +5536/43363/5536-43363-0000.flac 45120 +5536/43363/5536-43363-0007.flac 158400 +5536/43363/5536-43363-0013.flac 118800 +5536/43363/5536-43363-0004.flac 150000 +5536/43363/5536-43363-0008.flac 164640 +5536/43363/5536-43363-0001.flac 114240 +5536/43363/5536-43363-0019.flac 116000 +5536/43363/5536-43363-0010.flac 164160 +5536/43363/5536-43363-0009.flac 334080 +5536/43363/5536-43363-0002.flac 112320 +5536/43358/5536-43358-0011.flac 121440 +5536/43358/5536-43358-0018.flac 193040 +5536/43358/5536-43358-0009.flac 129040 +5536/43358/5536-43358-0002.flac 161760 +5536/43358/5536-43358-0001.flac 158000 +5536/43358/5536-43358-0006.flac 166560 +5536/43358/5536-43358-0010.flac 130240 +5536/43358/5536-43358-0013.flac 166400 +5536/43358/5536-43358-0015.flac 95360 +5536/43358/5536-43358-0007.flac 150720 +5536/43358/5536-43358-0012.flac 54160 +5536/43358/5536-43358-0014.flac 45280 +5536/43358/5536-43358-0005.flac 225040 +5536/43358/5536-43358-0019.flac 84160 +5536/43358/5536-43358-0008.flac 326240 +5536/43358/5536-43358-0003.flac 96640 +5536/43358/5536-43358-0000.flac 50800 +5536/43358/5536-43358-0004.flac 93200 +5536/43358/5536-43358-0017.flac 220880 +5536/43358/5536-43358-0016.flac 38800 +2803/154320/2803-154320-0002.flac 56480 +2803/154320/2803-154320-0003.flac 103600 +2803/154320/2803-154320-0012.flac 156960 +2803/154320/2803-154320-0013.flac 69840 +2803/154320/2803-154320-0000.flac 183680 +2803/154320/2803-154320-0011.flac 68480 +2803/154320/2803-154320-0009.flac 44240 +2803/154320/2803-154320-0014.flac 84640 +2803/154320/2803-154320-0006.flac 34880 +2803/154320/2803-154320-0010.flac 64160 +2803/154320/2803-154320-0001.flac 248960 +2803/154320/2803-154320-0005.flac 76320 +2803/154320/2803-154320-0008.flac 57440 +2803/154320/2803-154320-0007.flac 72160 +2803/154320/2803-154320-0004.flac 192080 +2803/161169/2803-161169-0016.flac 92560 +2803/161169/2803-161169-0006.flac 135520 +2803/161169/2803-161169-0017.flac 128160 +2803/161169/2803-161169-0009.flac 395120 +2803/161169/2803-161169-0002.flac 78560 +2803/161169/2803-161169-0000.flac 187200 +2803/161169/2803-161169-0010.flac 221040 +2803/161169/2803-161169-0007.flac 203440 +2803/161169/2803-161169-0001.flac 151920 +2803/161169/2803-161169-0013.flac 184160 +2803/161169/2803-161169-0012.flac 252560 +2803/161169/2803-161169-0015.flac 209840 +2803/161169/2803-161169-0003.flac 162240 +2803/161169/2803-161169-0004.flac 179600 +2803/161169/2803-161169-0008.flac 226240 +2803/161169/2803-161169-0011.flac 87920 +2803/161169/2803-161169-0005.flac 268720 +2803/161169/2803-161169-0014.flac 217600 +2803/154328/2803-154328-0012.flac 153120 +2803/154328/2803-154328-0016.flac 34880 +2803/154328/2803-154328-0021.flac 48800 +2803/154328/2803-154328-0002.flac 32960 +2803/154328/2803-154328-0013.flac 63600 +2803/154328/2803-154328-0004.flac 179040 +2803/154328/2803-154328-0007.flac 108320 +2803/154328/2803-154328-0003.flac 204800 +2803/154328/2803-154328-0019.flac 162880 +2803/154328/2803-154328-0001.flac 61200 +2803/154328/2803-154328-0018.flac 246080 +2803/154328/2803-154328-0005.flac 97600 +2803/154328/2803-154328-0017.flac 118960 +2803/154328/2803-154328-0000.flac 126880 +2803/154328/2803-154328-0023.flac 105440 +2803/154328/2803-154328-0008.flac 117920 +2803/154328/2803-154328-0020.flac 222720 +2803/154328/2803-154328-0015.flac 328799 +2803/154328/2803-154328-0010.flac 101440 +2803/154328/2803-154328-0009.flac 132800 +2803/154328/2803-154328-0006.flac 64080 +2803/154328/2803-154328-0014.flac 78800 +2803/154328/2803-154328-0022.flac 76880 +2803/154328/2803-154328-0011.flac 105520 +5338/24640/5338-24640-0000.flac 55200 +5338/24640/5338-24640-0006.flac 174880 +5338/24640/5338-24640-0004.flac 154560 +5338/24640/5338-24640-0002.flac 157280 +5338/24640/5338-24640-0009.flac 194000 +5338/24640/5338-24640-0007.flac 280800 +5338/24640/5338-24640-0005.flac 243360 +5338/24640/5338-24640-0001.flac 180160 +5338/24640/5338-24640-0008.flac 161280 +5338/24615/5338-24615-0006.flac 185360 +5338/24615/5338-24615-0007.flac 161280 +5338/24615/5338-24615-0003.flac 185200 +5338/24615/5338-24615-0000.flac 160400 +5338/24615/5338-24615-0014.flac 196720 +5338/24615/5338-24615-0008.flac 154880 +5338/24615/5338-24615-0009.flac 68080 +5338/24615/5338-24615-0001.flac 121680 +5338/24615/5338-24615-0004.flac 376160 +5338/24615/5338-24615-0012.flac 68800 +5338/24615/5338-24615-0013.flac 129360 +5338/24615/5338-24615-0005.flac 284320 +5338/24615/5338-24615-0002.flac 514320 +5338/24615/5338-24615-0010.flac 62240 +5338/24615/5338-24615-0011.flac 110880 +5338/284437/5338-284437-0010.flac 106000 +5338/284437/5338-284437-0011.flac 49680 +5338/284437/5338-284437-0032.flac 148400 +5338/284437/5338-284437-0005.flac 83360 +5338/284437/5338-284437-0030.flac 69280 +5338/284437/5338-284437-0002.flac 44560 +5338/284437/5338-284437-0027.flac 63520 +5338/284437/5338-284437-0031.flac 124000 +5338/284437/5338-284437-0022.flac 161280 +5338/284437/5338-284437-0023.flac 44720 +5338/284437/5338-284437-0013.flac 180000 +5338/284437/5338-284437-0018.flac 127360 +5338/284437/5338-284437-0007.flac 59200 +5338/284437/5338-284437-0021.flac 120240 +5338/284437/5338-284437-0019.flac 49840 +5338/284437/5338-284437-0029.flac 121280 +5338/284437/5338-284437-0033.flac 33200 +5338/284437/5338-284437-0025.flac 31040 +5338/284437/5338-284437-0003.flac 43680 +5338/284437/5338-284437-0016.flac 53920 +5338/284437/5338-284437-0015.flac 85280 +5338/284437/5338-284437-0024.flac 95760 +5338/284437/5338-284437-0000.flac 72800 +5338/284437/5338-284437-0014.flac 29520 +5338/284437/5338-284437-0006.flac 78880 +5338/284437/5338-284437-0028.flac 73440 +5338/284437/5338-284437-0001.flac 144800 +5338/284437/5338-284437-0009.flac 164720 +5338/284437/5338-284437-0020.flac 170800 +5338/284437/5338-284437-0004.flac 99120 +5338/284437/5338-284437-0008.flac 148000 +5338/284437/5338-284437-0012.flac 48400 +5338/284437/5338-284437-0017.flac 80160 +5338/284437/5338-284437-0026.flac 254800 +5694/64025/5694-64025-0018.flac 42960 +5694/64025/5694-64025-0005.flac 130721 +5694/64025/5694-64025-0013.flac 55040 +5694/64025/5694-64025-0001.flac 69600 +5694/64025/5694-64025-0022.flac 123680 +5694/64025/5694-64025-0004.flac 59120 +5694/64025/5694-64025-0010.flac 345920 +5694/64025/5694-64025-0014.flac 254000 +5694/64025/5694-64025-0008.flac 40879 +5694/64025/5694-64025-0003.flac 78720 +5694/64025/5694-64025-0023.flac 136320 +5694/64025/5694-64025-0012.flac 46000 +5694/64025/5694-64025-0016.flac 171520 +5694/64025/5694-64025-0020.flac 117600 +5694/64025/5694-64025-0015.flac 81040 +5694/64025/5694-64025-0021.flac 121760 +5694/64025/5694-64025-0011.flac 112480 +5694/64025/5694-64025-0007.flac 62640 +5694/64025/5694-64025-0009.flac 64320 +5694/64025/5694-64025-0000.flac 26720 +5694/64025/5694-64025-0019.flac 141920 +5694/64025/5694-64025-0002.flac 175360 +5694/64025/5694-64025-0006.flac 51520 +5694/64025/5694-64025-0017.flac 48240 +5694/64038/5694-64038-0009.flac 38160 +5694/64038/5694-64038-0011.flac 47920 +5694/64038/5694-64038-0014.flac 68640 +5694/64038/5694-64038-0012.flac 44880 +5694/64038/5694-64038-0022.flac 252320 +5694/64038/5694-64038-0005.flac 75200 +5694/64038/5694-64038-0018.flac 188720 +5694/64038/5694-64038-0015.flac 108320 +5694/64038/5694-64038-0002.flac 140320 +5694/64038/5694-64038-0023.flac 76720 +5694/64038/5694-64038-0013.flac 52880 +5694/64038/5694-64038-0024.flac 56320 +5694/64038/5694-64038-0017.flac 245280 +5694/64038/5694-64038-0007.flac 37920 +5694/64038/5694-64038-0020.flac 77440 +5694/64038/5694-64038-0010.flac 150080 +5694/64038/5694-64038-0025.flac 103680 +5694/64038/5694-64038-0019.flac 100080 +5694/64038/5694-64038-0016.flac 41360 +5694/64038/5694-64038-0006.flac 40400 +5694/64038/5694-64038-0001.flac 58400 +5694/64038/5694-64038-0000.flac 41520 +5694/64038/5694-64038-0008.flac 31200 +5694/64038/5694-64038-0003.flac 109120 +5694/64038/5694-64038-0021.flac 53280 +5694/64029/5694-64029-0020.flac 213600 +5694/64029/5694-64029-0007.flac 105360 +5694/64029/5694-64029-0012.flac 118160 +5694/64029/5694-64029-0011.flac 118400 +5694/64029/5694-64029-0008.flac 48320 +5694/64029/5694-64029-0015.flac 47920 +5694/64029/5694-64029-0000.flac 64080 +5694/64029/5694-64029-0025.flac 39440 +5694/64029/5694-64029-0009.flac 50560 +5694/64029/5694-64029-0003.flac 63760 +5694/64029/5694-64029-0010.flac 61680 +5694/64029/5694-64029-0004.flac 53680 +5694/64029/5694-64029-0005.flac 73040 +5694/64029/5694-64029-0018.flac 39760 +5694/64029/5694-64029-0029.flac 65120 +5694/64029/5694-64029-0027.flac 66720 +5694/64029/5694-64029-0028.flac 96960 +5694/64029/5694-64029-0006.flac 116320 +5694/64029/5694-64029-0024.flac 172240 +5694/64029/5694-64029-0014.flac 61120 +5694/64029/5694-64029-0021.flac 113120 +5694/64029/5694-64029-0002.flac 42320 +5694/64029/5694-64029-0023.flac 115200 +5694/64029/5694-64029-0019.flac 54640 +5694/64029/5694-64029-0030.flac 54160 +5694/64029/5694-64029-0032.flac 50000 +5694/64029/5694-64029-0001.flac 78880 +5694/64029/5694-64029-0022.flac 78400 +5694/64029/5694-64029-0031.flac 102160 +5694/64029/5694-64029-0013.flac 82480 +5694/64029/5694-64029-0017.flac 45840 +5694/64029/5694-64029-0016.flac 167280 +84/121550/84-121550-0031.flac 138480 +84/121550/84-121550-0000.flac 134960 +84/121550/84-121550-0009.flac 137840 +84/121550/84-121550-0014.flac 130960 +84/121550/84-121550-0026.flac 149600 +84/121550/84-121550-0007.flac 152400 +84/121550/84-121550-0008.flac 135120 +84/121550/84-121550-0022.flac 122400 +84/121550/84-121550-0028.flac 122240 +84/121550/84-121550-0023.flac 115440 +84/121550/84-121550-0016.flac 143280 +84/121550/84-121550-0020.flac 134240 +84/121550/84-121550-0033.flac 128320 +84/121550/84-121550-0024.flac 138080 +84/121550/84-121550-0006.flac 141280 +84/121550/84-121550-0002.flac 132240 +84/121550/84-121550-0003.flac 130560 +84/121550/84-121550-0030.flac 142800 +84/121550/84-121550-0025.flac 157440 +84/121550/84-121550-0021.flac 139360 +84/121550/84-121550-0004.flac 127440 +84/121550/84-121550-0017.flac 138320 +84/121550/84-121550-0027.flac 63920 +84/121550/84-121550-0001.flac 127600 +84/121550/84-121550-0034.flac 143120 +84/121550/84-121550-0011.flac 149680 +84/121550/84-121550-0015.flac 130480 +84/121550/84-121550-0010.flac 133280 +84/121550/84-121550-0013.flac 305760 +84/121550/84-121550-0029.flac 134160 +84/121550/84-121550-0019.flac 148479 +84/121550/84-121550-0035.flac 131520 +84/121550/84-121550-0012.flac 147840 +84/121123/84-121123-0014.flac 46160 +84/121123/84-121123-0017.flac 150000 +84/121123/84-121123-0003.flac 108800 +84/121123/84-121123-0012.flac 40960 +84/121123/84-121123-0001.flac 63840 +84/121123/84-121123-0022.flac 41760 +84/121123/84-121123-0028.flac 76160 +84/121123/84-121123-0005.flac 255360 +84/121123/84-121123-0016.flac 134560 +84/121123/84-121123-0004.flac 70400 +84/121123/84-121123-0018.flac 56800 +84/121123/84-121123-0013.flac 38400 +84/121123/84-121123-0020.flac 110720 +84/121123/84-121123-0000.flac 33440 +84/121123/84-121123-0024.flac 166080 +84/121123/84-121123-0011.flac 52000 +84/121123/84-121123-0008.flac 112240 +84/121123/84-121123-0009.flac 43121 +84/121123/84-121123-0019.flac 38960 +84/121123/84-121123-0023.flac 74960 +84/121123/84-121123-0025.flac 100080 +84/121123/84-121123-0002.flac 219040 +84/121123/84-121123-0007.flac 32000 +84/121123/84-121123-0015.flac 48560 +84/121123/84-121123-0026.flac 223040 +84/121123/84-121123-0021.flac 77040 +84/121123/84-121123-0027.flac 49120 +84/121123/84-121123-0010.flac 115040 +84/121123/84-121123-0006.flac 89920 +2035/147961/2035-147961-0006.flac 44720 +2035/147961/2035-147961-0004.flac 95440 +2035/147961/2035-147961-0002.flac 111920 +2035/147961/2035-147961-0012.flac 64400 +2035/147961/2035-147961-0039.flac 85600 +2035/147961/2035-147961-0031.flac 56800 +2035/147961/2035-147961-0016.flac 52240 +2035/147961/2035-147961-0011.flac 91520 +2035/147961/2035-147961-0023.flac 68960 +2035/147961/2035-147961-0005.flac 150720 +2035/147961/2035-147961-0007.flac 49600 +2035/147961/2035-147961-0027.flac 46000 +2035/147961/2035-147961-0034.flac 44880 +2035/147961/2035-147961-0040.flac 79040 +2035/147961/2035-147961-0022.flac 54640 +2035/147961/2035-147961-0025.flac 88400 +2035/147961/2035-147961-0021.flac 174320 +2035/147961/2035-147961-0014.flac 62720 +2035/147961/2035-147961-0036.flac 71680 +2035/147961/2035-147961-0015.flac 44560 +2035/147961/2035-147961-0009.flac 46000 +2035/147961/2035-147961-0038.flac 75440 +2035/147961/2035-147961-0017.flac 32160 +2035/147961/2035-147961-0008.flac 68000 +2035/147961/2035-147961-0013.flac 79680 +2035/147961/2035-147961-0019.flac 76320 +2035/147961/2035-147961-0000.flac 241120 +2035/147961/2035-147961-0020.flac 58080 +2035/147961/2035-147961-0028.flac 43280 +2035/147961/2035-147961-0003.flac 43120 +2035/147961/2035-147961-0033.flac 31120 +2035/147961/2035-147961-0035.flac 87120 +2035/147961/2035-147961-0032.flac 221760 +2035/147961/2035-147961-0001.flac 70640 +2035/147961/2035-147961-0037.flac 77360 +2035/147961/2035-147961-0010.flac 46560 +2035/147961/2035-147961-0026.flac 46000 +2035/147961/2035-147961-0024.flac 60960 +2035/147961/2035-147961-0030.flac 61600 +2035/147961/2035-147961-0018.flac 89440 +2035/147961/2035-147961-0029.flac 59680 +2035/147960/2035-147960-0010.flac 153360 +2035/147960/2035-147960-0012.flac 68080 +2035/147960/2035-147960-0007.flac 73600 +2035/147960/2035-147960-0005.flac 105360 +2035/147960/2035-147960-0014.flac 71441 +2035/147960/2035-147960-0015.flac 24960 +2035/147960/2035-147960-0002.flac 141440 +2035/147960/2035-147960-0003.flac 93440 +2035/147960/2035-147960-0011.flac 70080 +2035/147960/2035-147960-0016.flac 78320 +2035/147960/2035-147960-0013.flac 42800 +2035/147960/2035-147960-0009.flac 56000 +2035/147960/2035-147960-0001.flac 62800 +2035/147960/2035-147960-0008.flac 99360 +2035/147960/2035-147960-0000.flac 144320 +2035/147960/2035-147960-0006.flac 53040 +2035/147960/2035-147960-0004.flac 66720 +2035/152373/2035-152373-0005.flac 384480 +2035/152373/2035-152373-0014.flac 117600 +2035/152373/2035-152373-0018.flac 96240 +2035/152373/2035-152373-0006.flac 123360 +2035/152373/2035-152373-0016.flac 105440 +2035/152373/2035-152373-0010.flac 121600 +2035/152373/2035-152373-0015.flac 136160 +2035/152373/2035-152373-0003.flac 102640 +2035/152373/2035-152373-0009.flac 277120 +2035/152373/2035-152373-0002.flac 149440 +2035/152373/2035-152373-0000.flac 126000 +2035/152373/2035-152373-0001.flac 266720 +2035/152373/2035-152373-0011.flac 167440 +2035/152373/2035-152373-0013.flac 327520 +2035/152373/2035-152373-0007.flac 207040 +2035/152373/2035-152373-0017.flac 125680 +2035/152373/2035-152373-0012.flac 163680 +2035/152373/2035-152373-0008.flac 106640 +2035/152373/2035-152373-0004.flac 117440 diff --git a/SpeechT5/asr_train/train.txt b/SpeechT5/asr_train/train.txt new file mode 100644 index 0000000..9a61273 --- /dev/null +++ b/SpeechT5/asr_train/train.txt @@ -0,0 +1,2674 @@ +EVEN ON THIS LEDGE OF HUMAN SOCIETY THERE WAS A STUNTED GROWTH OF SHOPLETS WHICH HAD TAKEN ROOT AND VEGETATED SOMEHOW THOUGH AS IN AN AIR MERCANTILE OF THE BLEAKEST +SHORTLY AFTER PASSING ONE OF THESE CHAPELS WE CAME SUDDENLY UPON A VILLAGE WHICH STARTED UP OUT OF THE MIST AND I WAS ALARMED LEST I SHOULD BE MADE AN OBJECT OF CURIOSITY OR DISLIKE +THE STREETS WERE NARROW AND UNPAVED BUT VERY FAIRLY CLEAN +IN ABOUT FOUR HOURS OF WALKING FROM THE TIME WE STARTED AND AFTER PASSING TWO OR THREE MORE VILLAGES WE CAME UPON A CONSIDERABLE TOWN AND MY GUIDES MADE MANY ATTEMPTS TO MAKE ME UNDERSTAND SOMETHING BUT I GATHERED NO INKLING OF THEIR MEANING EXCEPT THAT I NEED BE UNDER NO APPREHENSION OF DANGER +THE VINE GREW OUTSIDE MANY OF THE HOUSES AND THERE WERE SOME WITH SIGN BOARDS ON WHICH WAS PAINTED A BOTTLE AND A GLASS THAT MADE ME FEEL MUCH AT HOME +EVEN IN MIDDLE AGE THEY WERE STILL COMELY AND THE OLD GREY HAIRED WOMEN AT THEIR COTTAGE DOORS HAD A DIGNITY NOT TO SAY MAJESTY OF THEIR OWN +I HAVE ALWAYS DELIGHTED IN AND REVERENCED BEAUTY BUT I FELT SIMPLY ABASHED IN THE PRESENCE OF SUCH A SPLENDID TYPE A COMPOUND OF ALL THAT IS BEST IN EGYPTIAN GREEK AND ITALIAN +THE CHILDREN WERE INFINITE IN NUMBER AND EXCEEDINGLY MERRY I NEED HARDLY SAY THAT THEY CAME IN FOR THEIR FULL SHARE OF THE PREVAILING BEAUTY +THE DESIGN WAS DIFFERENT BUT THE THING WAS CLEARLY THE SAME +THE OTHER LOOKED PALE AND ILL BUT HE WAS MARVELLOUSLY SELF CONTAINED AND IT WAS IMPOSSIBLE TO SAY WHAT WAS THE MATTER WITH HIM +WE PASSED MANY CASES AND AT LAST CAME TO ONE IN WHICH THERE WERE SEVERAL CLOCKS AND TWO OR THREE OLD WATCHES +MY GUIDES HOWEVER WERE WELL KNOWN AND THE NATURAL POLITENESS OF THE PEOPLE PREVENTED THEM FROM PUTTING ME TO ANY INCONVENIENCE BUT THEY COULD NOT HELP EYEING ME NOR I THEM +I SAW A FEW SHEEP WITH ROUNDED NOSES AND ENORMOUS TAILS +THIS HAD SOME EFFECT IN CALMING HIM +EACH FEATURE WAS FINISHED EYELIDS EYELASHES AND EARS BEING ALMOST INVARIABLY PERFECT +BUT BY AND BY THEY CAME TO MY WATCH WHICH I HAD HIDDEN AWAY IN THE INMOST POCKET THAT I HAD AND HAD FORGOTTEN WHEN THEY BEGAN THEIR SEARCH +THE COUNTRY WAS HIGHLY CULTIVATED EVERY LEDGE BEING PLANTED WITH CHESTNUTS WALNUTS AND APPLE TREES FROM WHICH THE APPLES WERE NOW GATHERING +THEIR EXPRESSION WAS DIVINE AND AS THEY GLANCED AT ME TIMIDLY BUT WITH PARTED LIPS IN GREAT BEWILDERMENT I FORGOT ALL THOUGHTS OF THEIR CONVERSION IN FEELINGS THAT WERE FAR MORE EARTHLY +THEY FELT MY PULSE THEY LOOKED AT MY TONGUE THEY LISTENED AT MY CHEST THEY FELT ALL MY MUSCLES AND AT THE END OF EACH OPERATION THEY LOOKED AT THE CHIEF AND NODDED AND SAID SOMETHING IN A TONE QUITE PLEASANT AS THOUGH I WERE ALL RIGHT +AGAIN THERE WAS A VERY OLD CARRIAGE WHOSE WHEELS IN SPITE OF RUST AND DECAY I COULD SEE HAD BEEN DESIGNED ORIGINALLY FOR IRON RAILS +I EXPRESSED BY SIGNS MY ADMIRATION AND PLEASURE TO MY GUIDES AND THEY WERE GREATLY PLEASED +HE BEGAN PRESENTLY TO RELENT AND SPOKE TO ME IN A KINDER MANNER +IN FACT ONE OF THEM WAS PLAINLY VERY MUCH OUT OF HEALTH AND COUGHED VIOLENTLY FROM TIME TO TIME IN SPITE OF MANIFEST EFFORTS TO SUPPRESS IT +SUFFICE IT THAT I FOUND MYSELF TAKEN BEFORE THE CHIEF MAGISTRATE AND BY HIS ORDERS WAS PLACED IN AN APARTMENT WITH TWO OTHER PEOPLE WHO WERE THE FIRST I HAD SEEN LOOKING ANYTHING BUT WELL AND HANDSOME +IT IS SURPRISING HOW SOON THE EYE BECOMES ACCUSTOMED TO MISSING TWENTY SHEEP OUT OF TWO OR THREE HUNDRED +I WAS DELIGHTED WITH THE COUNTRY AND THE MANNER OF LIFE +I REACHED MY DESTINATION IN ONE OF THE LAST MONTHS OF EIGHTEEN SIXTY EIGHT BUT I DARE NOT MENTION THE SEASON LEST THE READER SHOULD GATHER IN WHICH HEMISPHERE I WAS +EACH MUST CRY LOUDER AND WANDER FARTHER YET MAY LUCK BE WITH THEM BOTH THAT THEY MAY FIND THEIR OWN AT NIGHTFALL +NO ONE WHO IS HIMSELF HONEST WILL DOUBT MY BEING SO +I HAD NO MONEY BUT IF I COULD ONLY FIND WORKABLE COUNTRY I MIGHT STOCK IT WITH BORROWED CAPITAL AND CONSIDER MYSELF A MADE MAN +IF THE READER WILL EXCUSE ME I WILL SAY NOTHING OF MY ANTECEDENTS NOR OF THE CIRCUMSTANCES WHICH LED ME TO LEAVE MY NATIVE COUNTRY THE NARRATIVE WOULD BE TEDIOUS TO HIM AND PAINFUL TO MYSELF +I WAS TO SEE THE SHEEP NOT NECESSARILY CLOSE AT HAND NOR TO GET THEM IN A SINGLE MOB BUT TO SEE ENOUGH OF THEM HERE AND THERE TO FEEL EASY THAT NOTHING HAD GONE WRONG THIS WAS NO DIFFICULT MATTER FOR THERE WERE NOT ABOVE EIGHT HUNDRED OF THEM AND BEING ALL BREEDING EWES THEY WERE PRETTY QUIET +I WOULD TRY THE NEARER RANGE AND SEE HOW FAR I COULD GO +SHEEP AND CATTLE WERE INTRODUCED AND BRED WITH EXTREME RAPIDITY MEN TOOK UP THEIR FIFTY THOUSAND OR ONE HUNDRED THOUSAND ACRES OF COUNTRY GOING INLAND ONE BEHIND THE OTHER TILL IN A FEW YEARS THERE WAS NOT AN ACRE BETWEEN THE SEA AND THE FRONT RANGES WHICH WAS NOT TAKEN UP AND STATIONS EITHER FOR SHEEP OR CATTLE WERE SPOTTED ABOUT AT INTERVALS OF SOME TWENTY OR THIRTY MILES OVER THE WHOLE COUNTRY +THERE WERE A GOOD MANY SHEEP WHICH I KNEW AS TWO OR THREE BLACK EWES AND A BLACK LAMB OR TWO AND SEVERAL OTHERS WHICH HAD SOME DISTINGUISHING MARK WHEREBY I COULD TELL THEM +IT WAS A MONOTONOUS LIFE BUT IT WAS VERY HEALTHY AND ONE DOES NOT MUCH MIND ANYTHING WHEN ONE IS WELL +IT WILL BE SEEN THAT I DID NOT SUCCEED IN MY DESIGN AND THAT HOWEVER MUCH I MAY HAVE MET WITH THAT WAS NEW AND STRANGE I HAVE BEEN UNABLE TO REAP ANY PECUNIARY ADVANTAGE +THE COUNTRY WAS THE GRANDEST THAT CAN BE IMAGINED +THERE WAS NO ONE IN THE WHOLE WORLD WHO HAD THE SMALLEST IDEA SAVE THOSE WHO WERE THEMSELVES ON THE OTHER SIDE OF IT IF INDEED THERE WAS ANY ONE AT ALL COULD I HOPE TO CROSS IT +SO LONELY AND SO SOLEMN WITH THE SAD GREY CLOUDS ABOVE AND NO SOUND SAVE A LOST LAMB BLEATING UPON THE MOUNTAIN SIDE AS THOUGH ITS LITTLE HEART WERE BREAKING +PREFACE TO SECOND EDITION +I MUST NOT CONCLUDE WITHOUT EXPRESSING MY MOST SINCERE THANKS TO MY CRITICS AND TO THE PUBLIC FOR THE LENIENCY AND CONSIDERATION WITH WHICH THEY HAVE TREATED MY ADVENTURES +THIS IS A MISTAKE THOUGH A PERFECTLY NATURAL ONE +IT WAS WRITTEN IN THE UPPER RANGITATA DISTRICT OF THE CANTERBURY PROVINCE AS IT THEN WAS OF NEW ZEALAND AND APPEARED AT CHRISTCHURCH IN THE PRESS NEWSPAPER JUNE THIRTEENTH EIGHTEEN SIXTY THREE +I ATTRIBUTE ITS UNLOOKED FOR SUCCESS MAINLY TO TWO EARLY FAVOURABLE REVIEWS THE FIRST IN THE PALL MALL GAZETTE OF APRIL TWELFTH AND THE SECOND IN THE SPECTATOR OF APRIL TWENTIETH +ON MY RETURN I PURPOSELY AVOIDED LOOKING INTO IT UNTIL I HAD SENT BACK MY LAST REVISES TO THE PRINTER +THE FIRST EDITION OF EREWHON SOLD IN ABOUT THREE WEEKS I HAD NOT TAKEN MOULDS AND AS THE DEMAND WAS STRONG IT WAS SET UP AGAIN IMMEDIATELY +BUT THIS HAD AN EFFECT OF WHICH I HAVE LITTLE REASON TO COMPLAIN FOR I WAS ALLOWED ALMOST TO CALL THEM LIFE LONG SELF DECEIVERS TO THEIR FACES AND THEY SAID IT WAS QUITE TRUE BUT THAT IT DID NOT MATTER +THIS HOWEVER MAY NOT BE FOR THE COPYRIGHT WILL PROBABLY EXPIRE IN A LITTLE OVER TWELVE YEARS +I AM SURPRISED HOWEVER THAT THE BOOK AT WHICH SUCH AN EXAMPLE OF THE SPECIOUS MISUSE OF ANALOGY WOULD SEEM MOST NATURALLY LEVELLED SHOULD HAVE OCCURRED TO NO REVIEWER NEITHER SHALL I MENTION THE NAME OF THE BOOK HERE THOUGH I SHOULD FANCY THAT THE HINT GIVEN WILL SUFFICE +I ALSO WROTE ABOUT THIS TIME THE SUBSTANCE OF WHAT ULTIMATELY BECAME THE MUSICAL BANKS AND THE TRIAL OF A MAN FOR BEING IN A CONSUMPTION +I REGRET THAT REVIEWERS HAVE IN SOME CASES BEEN INCLINED TO TREAT THE CHAPTERS ON MACHINES AS AN ATTEMPT TO REDUCE MISTER DARWIN'S THEORY TO AN ABSURDITY +THERE WAS ALSO ANOTHER CAUSE +I MADE A FEW FURTHER VERY TRIFLING ALTERATIONS BEFORE MOULDS WERE TAKEN BUT SINCE THE SUMMER OF EIGHTEEN SEVENTY TWO AS NEW EDITIONS WERE FROM TIME TO TIME WANTED THEY HAVE BEEN PRINTED FROM STEREOS THEN MADE +I SEE FROM MY SECOND PREFACE THAT I TOOK THE BOOK TO MESSRS CHAPMAN AND HALL MAY FIRST EIGHTEEN SEVENTY ONE AND ON THEIR REJECTION OF IT UNDER THE ADVICE OF ONE WHO HAS ATTAINED THE HIGHEST RANK AMONG LIVING WRITERS I LET IT SLEEP TILL I TOOK IT TO MISTER TRUBNER EARLY IN EIGHTEEN SEVENTY TWO +I AM STILL FAIRLY WELL SATISFIED WITH THOSE PARTS OF EREWHON THAT WERE REPEATEDLY REWRITTEN BUT FROM THOSE THAT HAD ONLY A SINGLE WRITING I WOULD GLADLY CUT OUT SOME FORTY OR FIFTY PAGES IF I COULD +THEN I HAD MUCH PLEASURE IN READING IT BUT WAS INDEED SURPRISED AT THE MANY LITTLE POINTS OF SIMILARITY BETWEEN THE TWO BOOKS IN SPITE OF THEIR ENTIRE INDEPENDENCE TO ONE ANOTHER +THIS LADY'S RIGHT NAME WAS JOAN BUT BECAUSE OF HER COMELINESS OR AT LEAST IT WAS SO IMAGINED SHE WAS CALLED OF MANY PRIMAVERA SPRING AND WENT BY THAT NAME AMONG THEM +AND THEREWITHAL SUCH A BEWILDERMENT POSSESS'D ME THAT I SHUT MINE EYES FOR PEACE AND IN MY BRAIN DID CEASE ORDER OF THOUGHT AND EVERY HEALTHFUL THING +THEN SAW I MANY BROKEN HINTED SIGHTS IN THE UNCERTAIN STATE I STEPP'D INTO +THE SECOND PART BEGINS HERE SAYING BE NOW THE THIRD HERE THEN WHILE IT WAS HIS PLEASURE +THESE WILDERING PHANTASIES THEN CARRIED ME TO SEE MY LADY DEAD +THE SECOND PART BEGINS HERE I WAS A THINKING THE FIRST PART DIVIDES INTO TWO +WHEREBY OTHER LADIES WHO WERE ABOUT THE ROOM BECOMING AWARE OF MY DISCOMFORT BY REASON OF THE MOAN THAT SHE MADE WHO INDEED WAS OF MY VERY NEAR KINDRED LED HER AWAY FROM WHERE I WAS AND THEN SET THEMSELVES TO AWAKEN ME THINKING THAT I DREAMED AND SAYING SLEEP NO LONGER AND BE NOT DISQUIETED +AND SO STRONG WAS MY PHANTASY THAT I WEPT AGAIN IN VERY TRUTH AND SAID WITH MY TRUE VOICE O EXCELLENT SOUL HOW BLESSED IS HE THAT NOW LOOKETH UPON THEE +AND IN HIS SPEECH HE LAUGH'D AND LAUGH'D AGAIN THEN WHILE IT WAS HIS PLEASURE TO REMAIN I CHANCED TO LOOK THE WAY HE HAD DRAWN NEAR AND SAW THE LADIES JOAN AND BEATRICE APPROACH ME THIS THE OTHER FOLLOWING ONE AND A SECOND MARVEL INSTANTLY +WHEN BEING AROUSED I OPENED MINE EYES AND KNEW THAT IT HAD BEEN A DECEPTION +AND MY HUE WAS SUCH THAT THEY LOOK'D AT EACH OTHER AND THOUGHT OF DEATH SAYING UNDER THEIR BREATH MOST TENDERLY O LET US COMFORT HIM THEN UNTO ME WHAT DREAM WAS THINE THAT IT HATH SHAKEN THEE SO MUCH +AND AT THE FIRST IT SEEMED TO ME THAT I SAW CERTAIN FACES OF WOMEN WITH THEIR HAIR LOOSENED WHICH CALLED OUT TO ME THOU SHALT SURELY DIE AFTER THE WHICH OTHER TERRIBLE AND UNKNOWN APPEARANCES SAID UNTO ME THOU ART DEAD +THIS HAS INDUCED SOME EDITORS OF THE VITA NUOVA TO EXPLAIN THE TITLE AS MEANING EARLY LIFE +THROUGHOUT THE VITA NUOVA THERE IS A STRAIN LIKE THE FIRST FALLING MURMUR WHICH REACHES THE EAR IN SOME REMOTE MEADOW AND PREPARES US TO LOOK UPON THE SEA +ON JANUARY TWENTY FIFTH HE WROTE MANY AND MANY THANKS FOR A MOST ESSENTIAL SERVICE MOST THOROUGHLY PERFORMED +THIS BOOK IN ITS ORIGINAL FORM WAS RECEIVED WITH FAVOUR AND SETTLED THE CLAIM OF ROSSETTI TO RANK AS A POETIC TRANSLATOR OR INDEED AS A POET IN HIS OWN RIGHT +POETRY NOT BEING AN EXACT SCIENCE LITERALITY OF RENDERING IS ALTOGETHER SECONDARY TO THIS CHIEF LAW +THE ONLY TRUE MOTIVE FOR PUTTING POETRY INTO A FRESH LANGUAGE MUST BE TO ENDOW A FRESH NATION AS FAR AS POSSIBLE WITH ONE MORE POSSESSION OF BEAUTY +IT IS THEREFORE AND ON ALL ACCOUNTS UNNECESSARY TO SAY MUCH MORE OF THE WORK HERE THAN IT SAYS FOR ITSELF +HE TRANSLATED AT AN EARLY AGE CHIEFLY BETWEEN EIGHTEEN FORTY FIVE AND EIGHTEEN FORTY NINE A GREAT NUMBER OF POEMS BY THE ITALIANS CONTEMPORARY WITH DANTE OR PRECEDING HIM AND AMONG OTHER THINGS HE MADE A VERSION OF THE WHOLE VITA NUOVA PROSE AND VERSE +MY NOTES WHICH YOU HAVE TAKEN THE TROUBLE OF REVISING ARE OF COURSE QUITE PALTRY AND USELESS +AND IF YOU HAVE TIME IT WOULD BE A GREAT SERVICE TO TRANSLATE THE ANALYSES OF THE POEMS WHICH I OMITTED +THE LIFE BLOOD OF RHYTHMICAL TRANSLATION IS THIS COMMANDMENT THAT A GOOD POEM SHALL NOT BE TURNED INTO A BAD ONE +OFTEN WOULD HE AVAIL HIMSELF OF ANY SPECIAL GRACE OF HIS OWN IDIOM AND EPOCH IF ONLY HIS WILL BELONGED TO HIM OFTEN WOULD SOME CADENCE SERVE HIM BUT FOR HIS AUTHOR'S STRUCTURE SOME STRUCTURE BUT FOR HIS AUTHOR'S CADENCE OFTEN THE BEAUTIFUL TURN OF A STANZA MUST BE WEAKENED TO ADOPT SOME RHYME WHICH WILL TALLY AND HE SEES THE POET REVELLING IN ABUNDANCE OF LANGUAGE WHERE HIMSELF IS SCANTILY SUPPLIED +A WORD SHOULD BE SAID HERE OF THE TITLE OF DANTE'S AUTOBIOGRAPHY +WHATEVER HER SWEET EYES ARE TURNED UPON SPIRITS OF LOVE DO ISSUE THENCE IN FLAME WHICH THROUGH THEIR EYES WHO THEN MAY LOOK ON THEM PIERCE TO THE HEART'S DEEP CHAMBER EVERY ONE +SO TO THE ROAD THOU SHALT BE RECONCILED AND FIND THE LADY AND WITH THE LADY LOVE +THE FIRST PART IS DIVIDED INTO FOUR +AND NOW THAT IT HATH PLEASED HER TO DENY ME THIS LOVE MY MASTER OF HIS GREAT GOODNESS HATH PLACED ALL MY BEATITUDE THERE WHERE MY HOPE WILL NOT FAIL ME +IN THE FOURTH REPEATING TO WHOM I PURPOSE SPEAKING I TELL THE REASON WHY I SPEAK TO THEM +THIS SECOND PART IS DIVIDED INTO TWO FOR IN THE ONE I SPEAK OF THE EYES WHICH ARE THE BEGINNING OF LOVE IN THE SECOND I SPEAK OF THE MOUTH WHICH IS THE END OF LOVE +AND I DECLARE THAT WHEN I SPEAK THEREOF LOVE SHEDS SUCH PERFECT SWEETNESS OVER ME THAT IF MY COURAGE FAILED NOT CERTAINLY TO HIM MY LISTENERS MUST BE ALL RESIGN'D +TO HER I WEND ALONG IN WHOSE MUCH STRENGTH MY WEAKNESS IS MADE STRONG +IN THE SECOND I TELL WHAT IS UNDERSTOOD OF HER ON EARTH HERE MY LADY IS DESIRED +THEREAFTER THIS SONNET BRED IN ME DESIRE TO WRITE DOWN IN VERSE FOUR OTHER THINGS TOUCHING MY CONDITION THE WHICH THINGS IT SEEMED TO ME THAT I HAD NOT YET MADE MANIFEST +THE SECOND BEGINS HERE AN ANGEL THE THIRD HERE DEAR SONG I KNOW +BUT WHEN I STILL SPAKE NOT ONE OF THEM WHO BEFORE HAD BEEN TALKING WITH ANOTHER ADDRESSED ME BY MY NAME SAYING TO WHAT END LOVEST THOU THIS LADY SEEING THAT THOU CANST NOT SUPPORT HER PRESENCE +THEN THOSE LADIES BEGAN TO TALK CLOSELY TOGETHER AND AS I HAVE SEEN SNOW FALL AMONG THE RAIN SO WAS THEIR TALK MINGLED WITH SIGHS +WHICH THING BEING THUS THERE CAME A DAY WHEN CERTAIN LADIES TO WHOM IT WAS WELL KNOWN THEY HAVING BEEN WITH ME AT DIVERS TIMES IN MY TROUBLE WERE MET TOGETHER FOR THE PLEASURE OF GENTLE COMPANY +IN THE THIRD I SAY WHAT IT IS I PURPOSE TO SPEAK SO AS NOT TO BE IMPEDED BY FAINTHEARTEDNESS +THIS SECOND PART IS DIVIDED INTO TWO FOR IN THE FIRST I SPEAK OF HER AS REGARDS THE NOBLENESS OF HER SOUL RELATING SOME OF HER VIRTUES PROCEEDING FROM HER SOUL IN THE SECOND I SPEAK OF HER AS REGARDS THE NOBLENESS OF HER BODY NARRATING SOME OF HER BEAUTIES HERE LOVE SAITH CONCERNING HER +THE PEOPLE IS A BEAST OF MUDDY BRAIN THAT KNOWS NOT ITS OWN FORCE AND THEREFORE STANDS LOADED WITH WOOD AND STONE THE POWERLESS HANDS OF A MERE CHILD GUIDE IT WITH BIT AND REIN ONE KICK WOULD BE ENOUGH TO BREAK THE CHAIN BUT THE BEAST FEARS AND WHAT THE CHILD DEMANDS IT DOES NOR ITS OWN TERROR UNDERSTANDS CONFUSED AND STUPEFIED BY BUGBEARS VAIN +MOST WONDERFUL +DUE TO THEE THEIR PRAISE OF MAIDEN PURE OF TEEMING MOTHERHOOD +IN FLESH WAS RAIMENTED HOW HE WAS KILLED AND BURIED FROM THE DEAD HOW HE AROSE TO LIFE WITH VICTORY AND REIGNED IN HEAVEN HOW ALL OF US SHALL BE GLORIOUS LIKE HIM WHOSE HEARTS TO HIS ARE WED HOW THEY WHO DIE FOR LOVE OF REASON GIVE HYPOCRITES TYRANTS SOPHISTS ALL WHO SELL THEIR NEIGHBOURS ILL FOR HOLINESS TO HELL HOW THE DEAD SAINT CONDEMNS THE BAD WHO LIVE HOW ALL HE DOES BECOMES A LAW FOR MEN HOW HE AT LAST TO JUDGE SHALL COME AGAIN +QUINCI IMPARA A STUPIRTI +HEAVEN HELP THAT BODY WHICH A LITTLE MIND HOUSED IN A HEAD LACKING EARS TONGUE AND EYES AND SENSELESS BUT FOR SMELL CAN TYRANNISE +WELL TOO IF HE LIKE LOVE WOULD FILCH OUR HOARD WITH PLEASURE TO OURSELVES SLUICING OUR VEIN AND VIGOUR TO PERPETUATE THE STRAIN OF LIFE BY SPILTH OF LIFE WITHIN US STORED +HE LIVES THY LOSS HE DIES FROM EVERY LIMB MANGLED BY THEE LIGHTNINGS OF GODHEAD SHINE FROM WHICH THY DARKNESS HATH NOT WHERE TO HIDE +THOU LIKE ARCTURUS STEADFAST IN THE SKIES WITH TARDY SENSE GUIDEST THY KINGDOM FAIR BEARING ALONE THE LOAD OF LIBERTY +THAT PENANCE HATH NO BLAME WHICH MAGDALEN FOUND SWEET PURGING OUR SHAME SELF PUNISHMENT IS VIRTUE ALL MEN KNOW +IL POPOLO E UNA BESTIA +ORGAN OF RUT NOT REASON IS THE LORD WHO FROM THE BODY POLITIC DOTH DRAIN LUST FOR HIMSELF INSTEAD OF TOIL AND PAIN LEAVING US LEAN AS CRICKETS ON DRY SWARD +MONEY IS FALSE AND LIGHT UNLESS IT BE BOUGHT BY A MAN'S OWN WORTHY QUALITIES AND BLOOD IS SUCH THAT ITS CORRUPT DISEASE AND IGNORANT PRETENCE ARE FOUL TO SEE +THIS WORLD'S THICK VAPOURS WHELM YOUR EYES UNWORTHY OF THAT GLORIOUS SHOW BLIND TO HIS SPLENDOUR BENT UPON HIS SHAME +ARE YOU REALLY GOING TO THROW ME OVER FOR A THING LIKE THIS +IT WAS BITTERLY COLD BUT THE EMBANKMENT WAS MORE ROMANTIC THAN A RAILWAY CARRIAGE +HE HAD BEEN LATE HE HAD OFFERED NO EXCUSE NO EXPLANATION +SHE WOULD HAVE SHARED HIS SORROW AND SHOWN HERSELF HALF WIFE HALF ANGEL FROM HEAVEN IN THIS DARK HOUR +HER HANDS SHOULD HAVE BEEN FULL OF BLUEBELLS AND SHE SHOULD HAVE HELD THEM UP TO HIS FACE IN MAIDENLY DEFENCE AS HE SPRANG FORWARD TO TAKE HER IN HIS ARMS +AND YESTERDAY I HAD A LETTER FROM HER AND SHE SEEMS TO EXPECT TO THINK AND I THOUGHT I OUGHT TO TELL YOU DARLING +COULDN'T HELP IT THEN HOW CAN I EVER TRUST YOU +HE CHECKED THE SILLY IMPULSE +I DIDN'T THINK A DECENT MAN COULD DO SUCH THINGS SHE WAS PULLING ON HER GLOVES GO HOME AND GLOAT OVER IT ALL +AND CURIOUSLY ENOUGH SHE WAS HARDLY CURIOUS AT ALL ABOUT WHAT HE MIGHT HAVE TO SAY +AND HE STRODE DOWN BETWEEN THE MARBLE TABLES AND OUT BY THE SWING DOOR IT WAS A VERY GOOD EXIT +YOU SEE THAT SHE KNEW EXACTLY HOW A TRYST IS CONDUCTED IN THE PAGES OF THE STANDARD POETS AND OF THE CHEAPER WEEKLY JOURNALS +THE KEEN WIND THRUST ITSELF EVEN INSIDE THE HIGH COLLAR OF HER JACKET +WHAT OPINION WOULD HE FORM OF THE PURITY OF HER MIND THE INNOCENCE OF HER SOUL IF AN INCIDENT LIKE THIS FAILED TO SHOCK HER DEEPLY +THE SETTING OF THE SCENE SEEMED TO HER ALL IMPORTANT +HE STOOD UP SUDDENLY DO YOU MEAN IT +SHE ONLY WISHED FOR MAY AND THE ORCHARD INSTEAD OF JANUARY AND THE DINGY DUSTY WAITING ROOM THE PLAIN FACED PREOCCUPIED TRAVELLERS THE DIM DESOLATE WEATHER +DO YOU THINK I'M NOT SORRY NOW +SHE HAD TO THE FULL LIMIT ALLOWED OF HER READING AND HER ENVIRONMENT THE LITERARY SENSE +NO IT'S ONLY PAINFUL FOR BOTH OF US +SO HE ENLISTED AND WENT TO SOUTH AFRICA AND HE NEVER CAME HOME COVERED WITH MEDALS AND GLORY WHICH WAS RATHER HIS IDEA TO THE FEW SIMPLE WORDS OF EXPLANATION THAT WOULD HAVE MADE ALL STRAIGHT AND REPAID HER AND HIM FOR ALL THE PAST +SHE HERSELF SHOULD HAVE BEEN A POEM A LYRIC IN A WHITE GOWN AND GREEN SCARF COMING TO HIM THROUGH THE LONG GRASS UNDER THE BLOSSOMED BOUGHS +A SHOCK OF UNBELIEVABLE RELIEF TINGLED THROUGH HER SO THAT WAS ALL WHAT WAS IT COMPARED WITH HER FEARS +SHE SAID HOW FRIGHTFULLY COLD IT IS +BUT HERE THE ONLY THING THAT OCCURRED TO HER WAS TO STOP AND LOOK IN ONE OF THE SHOPS TILL HE SHOULD ASK HER WHAT SHE WAS LOOKING AT +HER HANDS AND FEET WERE ACHING WITH COLD +AT THE CORNER HE REMEMBERED THAT HE HAD GONE AWAY WITHOUT PAYING FOR THE TEA AND HIS NATURAL IMPULSE WAS TO GO BACK AND REMEDY THAT ERROR +THOSE FOUR TRUE WORDS WOUNDED HER MORE THAN ALL THE REST +FOLLOWING THE TINGLE OF RELIEF CAME A SHARP SICKENING PINCH OF JEALOUSY AND MORTIFICATION THESE INSPIRED HER +SHALL I POUR OUT MY SOUL INTO THE EAR OF A MIST A FUME FROM MY OWN BRAIN +WITH THAT CAME A PANG OF INTENSE PAIN +BUT LIVING SOUL THERE COULD BE NONE TO MEET +BUT SHE KNEW NOBODY AND WANDERED ALONE IN THE GARDEN OPPRESSED WITH SOMETHING SHE DID NOT UNDERSTAND +THE OLD TIME WAS BUT A THICKER DREAM AND THIS IS TRUER BECAUSE MORE SHADOWY +SHE HAD LOST HIM YEARS AND YEARS BEFORE AND NOW SHE SAW HIM HE WAS THERE AND SHE KNEW HIM +HE CAME TO HER SIDE AND SHE GAVE HIM NO GREETING +AT THE END OF IT SHE WAS IN A PLACE OF TOMBS +THUS WAS SHE BORNE AWAY CAPTIVE OF HER DEAD NEITHER WILLING NOR UNWILLING OF LIFE AND DEATH EQUALLY CARELESS +THIS WAS HER DREAM AS NEARLY AS SHE COULD RECALL IT WHEN SHE CAME TO HERSELF AFTER WAKING FROM IT WITH A CRY +SHE WAS LOST LOST UTTERLY WITH AN ETERNAL LOSS +WHEN SHE OPENED THE DOOR OF IT THE BRIGHT FIRE WHICH BEENIE UNDESIRED HAD KINDLED THERE STARTLED HER THE ROOM LOOKED UNNATURAL UNCANNY BECAUSE IT WAS CHEERFUL +AT THE TIME MARY HAD NOTED NOTHING OF THESE THINGS NOW SHE SAW THEM ALL AS FOR THE FIRST TIME IN MINUTE DETAIL WHILE SLOWLY SHE WENT UP THE STAIR AND THROUGH THE NARROWED WAYS AND HEARD THE SAME WIND THAT RAVED ALIKE ABOUT THE NEW GRAVE AND THE OLD HOUSE INTO WHICH LATTER FOR ALL THE BALES BANKED AGAINST THE WALLS IT FOUND MANY A CHINK OF ENTRANCE +SHE WAS ONE OF A LARGE COMPANY AT A HOUSE WHERE SHE HAD NEVER BEEN BEFORE A BEAUTIFUL HOUSE WITH A LARGE GARDEN BEHIND +SHE STOOD FOR A MOMENT ON THE HEARTH AND IN SAD DREAMY MOOD LISTENED TO THE HOWLING SWOOPS OF THE WIND MAKING THE HOUSE QUIVER AND SHAKE +SHE KNEW NOTHING OF THE PLACE HAD NOWHERE TO GO NOWHERE SHE WANTED TO GO HAD NOT A THOUGHT TO TELL HER WHAT QUESTION TO ASK IF SHE MET A LIVING SOUL +SHE ENTERED AND THE SERVANTS SOFT FOOTED AND SILENT WERE BUSY CARRYING AWAY THE VESSELS OF HOSPITALITY AND RESTORING ORDER AS IF ALREADY THEY PREPARED FOR ANOTHER COMPANY ON THE MORROW NO ONE HEEDED HER +WHEN SHE SAID GOOD NIGHT TO BEENIE AND WENT TO HER CHAMBER OVER THAT WHERE THE LOVED PARENT AND FRIEND WOULD FALL ASLEEP NO MORE SHE FELT AS IF SHE WENT WALKING ALONG TO HER TOMB +IT WAS A SUMMER NIGHT AND THE GUESTS WERE WANDERING IN AND OUT AT WILL AND THROUGH HOUSE AND GARDEN AMID LOVELY THINGS OF ALL COLORS AND ODORS +HER ONLY LIFE WAS THAT SHE WAS LOST +I KNOW IT AND THERE IS NO WAKING +IT WASN'T I WHO SAID THAT SAID THE GIRL SMILING BUT THAT'S SO ANYHOW AND THEN SHE SIGHED +I SHALL LOCK UP ALL THE DOORS AND WINDOWS IN THE HOUSE AND THEN I SHALL GIVE YOU MY LATCH KEY AND YOU CAN LET YOURSELF IN AND STAY THE NIGHT HERE THERE IS NO ONE IN THE HOUSE +THERE IS A SEAT IN THE GARDEN AT THE SIDE OF THE HOUSE AGAIN SHE HESITATED +IS IT ONLY THAT YOU'RE POOR WHY THAT'S NOTHING I'M POOR TOO SHE LAUGHED +LET ME THINK HE SAID OH HOW GLAD I AM THAT YOU HAPPENED TO COME THIS WAY +HE HURRIEDLY CUT CAKE AND PRESSED IT UPON HER +DO DRINK THIS AND THEN TELL ME PERHAPS I CAN HELP YOU +HE TOLD ME TO STAY ON AT THE HOTEL AND I DID AND THEN ONE NIGHT WHEN I WAS AT THE THEATRE MY MAID A HORRID FRENCH THING WE GOT IN PARIS PACKED UP ALL MY TRUNKS AND TOOK ALL MY MONEY AND PAID THE BILL AND WENT +ALL THE SAME HE ADDED IRRELEVANTLY YOU SHALL HAVE THE LATCH KEY +I WILL CATCH THE NIGHT TRAIN AND BRING MY MOTHER UP TO MORROW THEN WE WILL SEE WHAT CAN BE DONE +THE LADY AND THE GUITAR CERTAINLY PASSED THE NIGHT AT HILL VIEW VILLA BUT WHEN HIS MOTHER VERY ANGRY AND VERY FRIGHTENED CAME UP WITH HIM AT ABOUT NOON THE HOUSE LOOKED JUST AS USUAL AND NO ONE WAS THERE BUT THE CHARWOMAN +THE YOUNG MAN DREW A DEEP BREATH OF RELIEF AND LIGHTED THE WAX CANDLES IN THE SOLID SILVER CANDLESTICKS ON HIS WRITING TABLE FOR NOW THE LATE SUMMER DUSK WAS FALLING AND THAT ORGAN PLEASE HEAVEN MADE FULL THE MEASURE OF THE DAY'S APPOINTED TORTURE +IT WAS PLAIN THAT HIS CASTANET GIRL HIS MOTHER AND SISTER TOOK A PLEASURE IN CREDITING HER DAILY WITH SOME FRESH AND UNPLEASING INSTRUMENT COULD HAVE HAD NEITHER TASTE MONEY NOR HONESTY TO SUCH A POINT AS THIS +THE LAST STRAINS OF THE ILL TREATED ILL FATED INTERMEZZO HAD DIED AWAY AND AFTER THEM HAD DIED AWAY ALSO THE RUMBLING OF THE WHEELS OF THE MURDEROUS BARREL ORGAN THAT HAD SO GAILY EXECUTED THAT ALONG WITH THE NINE OTHER TUNES OF ITS REPERTORY TO THE ADMIRATION OF THE HOUSEMAID AT THE WINDOW OF THE HOUSE OPPOSITE AND THE CROWING DELIGHT OF THE TWO BABIES NEXT DOOR +SHE SAID AGAIN YOU ARE KIND +NEVER HAD ANY ACT SEEMED SO IMPOSSIBLE +LOOK HERE HE SAID THIS IS ALL NONSENSE YOU KNOW YOU ARE TIRED OUT AND THERE'S SOMETHING WRONG WHAT IS IT +THE SILVER IS ALL RIGHT THANK GOODNESS SHE SAID BUT YOUR BANJO GIRL HAS TAKEN A PAIR OF YOUR SISTER'S SILK STOCKINGS AND THOSE NEW SHOES OF HERS WITH THE SILVER BUCKLES AND SHE'S LEFT THESE +WELL THEN I WENT INTO LODGINGS THAT WICKED WOMAN HAD LEFT ME ONE STREET SUIT AND TO DAY THEY TURNED ME OUT BECAUSE MY MONEY WAS ALL GONE +YOU SEE PAPA'S SO VERY RICH AND AT HOME THEY EXPECT ME TO TO GET ACQUAINTED WITH DUKES AND THINGS AND SHE STOPPED +HE HAD NO TIME TO THINK BUT HE WAS AWARE THAT THIS WAS THE MOST EXCITING ADVENTURE THAT HAD EVER HAPPENED TO HIM +THEN SHE TURNED TOWARDS THE QUARTER INDICATED AND DISAPPEARED ROUND THE LAUREL BUSHES +THEN THERE WAS SILENCE THEN A SIGH AND THE SOUND OF LIGHT MOVING FEET ON THE GRAVEL +AND AGAIN HE LISTENED WITH A QUIET PLEASURE +YOU ARE KIND SHE SAID FOR THE THIRD TIME AND REACHED HER HAND OUT TO HIM HE DID NOT KISS IT THEN ONLY TOOK IT IN HIS AND FELT HOW SMALL AND COLD IT WAS THEN IT WAS TAKEN AWAY +HER LITTLE FOOT TAPPED THE GRAVEL IMPATIENTLY +MICHAELIS THE TICKET OF LEAVE APOSTLE WAS SPEAKING IN AN EVEN VOICE A VOICE THAT WHEEZED AS IF DEADENED AND OPPRESSED BY THE LAYER OF FAT ON HIS CHEST +HIS VISION OF TRUTH HAD GROWN SO INTENSE THAT THE SOUND OF A STRANGE VOICE FAILED TO ROUT IT THIS TIME +HE STOOD STILL IN THE MIDDLE OF THE PARLOUR AND LOOKED INTO THE KITCHEN IN SILENCE +THE OTHER DAY STEVIE GOT HOLD OF ONE AND THERE WAS A STORY IN IT OF A GERMAN SOLDIER OFFICER TEARING HALF OFF THE EAR OF A RECRUIT AND NOTHING WAS DONE TO HIM FOR IT THE BRUTE +MISTER VERLOC'S ANXIETIES HAD PREVENTED HIM FROM ATTACHING ANY SENSE TO WHAT HIS WIFE WAS SAYING +I WISH HE HAD NEVER BEEN TO SCHOOL MISSUS VERLOC BEGAN AGAIN BRUSQUELY +A HARSH LAUGH FROM COMRADE OSSIPON CUT THE TIRADE DEAD SHORT IN A SUDDEN FALTERING OF THE TONGUE AND A BEWILDERED UNSTEADINESS OF THE APOSTLE'S MILDLY EXALTED EYES +I WOULDN'T GIVE A HALFPENNY FOR THE WHOLE LOT +VERY CHARACTERISTIC PERFECTLY TYPICAL +HE CLOSED THE DOOR BEHIND THEIR BACKS WITH RESTRAINED VIOLENCE TURNED THE KEY SHOT THE BOLT +AH HE DID NOT DEPEND UPON EMOTIONAL EXCITEMENT TO KEEP UP HIS BELIEF NO DECLAMATIONS NO ANGER NO VISIONS OF BLOOD RED FLAGS WAVING OR METAPHORICAL LURID SUNS OF VENGEANCE RISING ABOVE THE HORIZON OF A DOOMED SOCIETY NOT HE +ALL IDEALISATION MAKES LIFE POORER +STEVIE SWALLOWED THE TERRIFYING STATEMENT WITH AN AUDIBLE GULP AND AT ONCE AS THOUGH IT HAD BEEN SWIFT POISON SANK LIMPLY IN A SITTING POSTURE ON THE STEPS OF THE KITCHEN DOOR +ALEXANDER OSSIPON GOT UP TALL IN HIS THREADBARE BLUE SERGE SUIT UNDER THE LOW CEILING SHOOK OFF THE STIFFNESS OF LONG IMMOBILITY AND STROLLED AWAY INTO THE KITCHEN DOWN TWO STEPS TO LOOK OVER STEVIE'S SHOULDER +HER BARE FEET AS IF POKED THROUGH THE BOTTOM OF AN UNADORNED SLEEVED CALICO SACK BUTTONED TIGHTLY AT NECK AND WRISTS FELT OVER THE RUG FOR THE SLIPPERS WHILE SHE LOOKED UPWARD INTO HER HUSBAND'S FACE +AND EVER SINCE HE HAD NEVER MANAGED TO GET HIS WEIGHT DOWN AS MUCH AS AN OUNCE +HE TOOK THE CASH BOX OUT OF THE DRAWER AND TURNING TO LEAVE THE SHOP BECAME AWARE THAT STEVIE WAS STILL DOWNSTAIRS +DON'T YOU THINK THAT IF I HAD NOT BEEN THE OPTIMIST I AM I COULD NOT HAVE FOUND IN FIFTEEN YEARS SOME MEANS TO CUT MY THROAT +THERE WAS AN EXTRAORDINARY FORCE OF SUGGESTION IN THIS POSTURING +THIS SURVEY WAS UNFAVOURABLE +THERE WAS NO YOUNG MAN OF HIS AGE IN LONDON MORE WILLING AND DOCILE THAN STEPHEN SHE AFFIRMED NONE MORE AFFECTIONATE AND READY TO PLEASE AND EVEN USEFUL AS LONG AS PEOPLE DID NOT UPSET HIS POOR HEAD +THAT POOR BOY IS IN A VERY EXCITED STATE TO NIGHT SHE MURMURED AFTER A PAUSE WHICH LASTED FOR THREE TICKS OF THE CLOCK +THIS DREAD LED HIM TO MAKE THE REMARK THAT STEVIE HAD DISREGARDED HIS SUGGESTION TO GO TO BED +THE DISDAINFUL POUT OF COMRADE OSSIPON'S THICK LIPS ACCENTUATED THE NEGRO TYPE OF HIS FACE +THEY ARE NOURISHING THEIR GREED ON THE QUIVERING FLESH AND THE WARM BLOOD OF THE PEOPLE NOTHING ELSE +THERE ARE NATURES TOO TO WHOSE SENSE OF JUSTICE THE PRICE EXACTED LOOMS UP MONSTROUSLY ENORMOUS ODIOUS OPPRESSIVE WORRYING HUMILIATING EXTORTIONATE INTOLERABLE THOSE ARE THE FANATICS +THE SHEET OF PAPER COVERED WITH CIRCLES DROPPED OUT OF HIS FINGERS AND HE REMAINED STARING AT THE OLD TERRORIST AS IF ROOTED SUDDENLY TO THE SPOT BY HIS MORBID HORROR AND DREAD OF PHYSICAL PAIN +HIS SCARED EYES BLAZED WITH INDIGNATION IT WOULD HURT TERRIBLY HIS MOUTH DROPPED OPEN +MISTER VERLOC PERCEIVED WITH SOME SURPRISE THAT HE DID NOT KNOW REALLY WHAT TO SAY TO STEVIE +DOWN BELOW IN THE QUIET NARROW STREET MEASURED FOOTSTEPS APPROACHED THE HOUSE THEN DIED AWAY UNHURRIED AND FIRM AS IF THE PASSER BY HAD STARTED TO PACE OUT ALL ETERNITY FROM GAS LAMP TO GAS LAMP IN A NIGHT WITHOUT END AND THE DROWSY TICKING OF THE OLD CLOCK ON THE LANDING BECAME DISTINCTLY AUDIBLE IN THE BEDROOM +HE KNOWS NO BETTER HE GETS INTO HIS PASSIONS OVER IT +YES NOT AT ALL WELL +THE COMPARISON OCCURRED TO MISTER VERLOC BECAUSE HE HAD SAT ASTRIDE VARIOUS ARMY HORSES IN HIS TIME AND HAD NOW THE SENSATION OF AN INCIPIENT FALL +STEVIE ACCUSTOMED TO MOVE ABOUT DISREGARDED HAD GOT UP FROM THE KITCHEN TABLE CARRYING OFF HIS DRAWING TO BED WITH HIM +MICHAELIS THE TICKET OF LEAVE APOSTLE SMILED VAGUELY WITH HIS GLUED LIPS HIS PASTY MOON FACE DROOPED UNDER THE WEIGHT OF MELANCHOLY ASSENT +THE OLD TERRORIST TURNED SLOWLY HIS HEAD ON HIS SKINNY NECK FROM SIDE TO SIDE +YES I HAD THE TIME TO THINK THINGS OUT A LITTLE HE ADDED WITHOUT EMPHASIS +THE COALS IN THE GRATE SETTLED DOWN WITH A SLIGHT CRASH AND MICHAELIS THE HERMIT OF VISIONS IN THE DESERT OF A PENITENTIARY GOT UP IMPETUOUSLY +WITH HIS ELBOW PRESENTING NO APPEARANCE OF A JOINT BUT MORE LIKE A BEND IN A DUMMY'S LIMB THROWN OVER THE BACK OF A CHAIR HE LEANED FORWARD SLIGHTLY OVER HIS SHORT AND ENORMOUS THIGHS TO SPIT INTO THE GRATE +HE GLARED AT ME AS IF HE DIDN'T KNOW WHO I WAS WHEN I WENT DOWNSTAIRS +THE PROSPECT WAS AS BLACK AS THE WINDOW PANE AGAINST WHICH HE WAS LEANING HIS FOREHEAD +STEVIE PROWLED ROUND THE TABLE LIKE AN EXCITED ANIMAL IN A CAGE +IF I HAD KNOWN THEY WERE COMING TO NIGHT I WOULD HAVE SEEN TO IT THAT HE WENT TO BED AT THE SAME TIME I DID +HIS OWN SKIN HAD SIZZLED UNDER THE RED HOT BRAND HE MURMURED SOFTLY +HE HAD BEEN A PRISONER HIMSELF +I WOULD CALL IT CANNIBALISTIC THAT'S WHAT IT IS +THE LIGHT THROWN DOWN BY THE SHADE FELL DAZZLINGLY ON THE WHITE PILLOW SUNK BY THE WEIGHT OF HER HEAD REPOSING WITH CLOSED EYES AND DARK HAIR DONE UP IN SEVERAL PLAITS FOR THE NIGHT +IN ANY CASE HE HAD NOT THE TIME +IT'S LIKE YOUR HORSE SUDDENLY FALLING DEAD UNDER YOU IN THE MIDST OF AN UNINHABITED AND THIRSTY PLAIN +LOAFING WAS ALL VERY WELL FOR THESE FELLOWS WHO KNEW NOT MISTER VLADIMIR AND HAD WOMEN TO FALL BACK UPON WHEREAS HE HAD A WOMAN TO PROVIDE FOR +LOMBROSO IS AN ASS +FOR HIM THE CRIMINAL IS THE PRISONER SIMPLE IS IT NOT +STRUGGLE WARFARE WAS THE CONDITION OF PRIVATE OWNERSHIP IT WAS FATAL +THE POSSESSORS OF PROPERTY HAD NOT ONLY TO FACE THE AWAKENED PROLETARIAT BUT THEY HAD ALSO TO FIGHT AMONGST THEMSELVES YES +HIS ENUNCIATION WOULD HAVE BEEN ALMOST TOTALLY UNINTELLIGIBLE TO A STRANGER +HE LOOKED DUBIOUSLY AT HIS BROTHER IN LAW BUT HE DID NOT ASK HIM FOR INFORMATION +YOU DON'T UNDERSTAND HE BEGAN DISDAINFULLY BUT STOPPED SHORT INTIMIDATED BY THE DEAD BLACKNESS OF THE CAVERNOUS EYES IN THE FACE TURNED SLOWLY TOWARDS HIM WITH A BLIND STARE AS IF GUIDED ONLY BY THE SOUND +YOU WOULD CALL THAT LAD A DEGENERATE WOULD YOU MUMBLED MISTER VERLOC +ASK KARL YUNDT HE GROWLED SAVAGELY +I DON'T SAY THAT PROTESTED MICHAELIS GENTLY +THERE IS NO OCCUPATION THAT FAILS A MAN MORE COMPLETELY THAN THAT OF A SECRET AGENT OF POLICE +AND I COULD NEVER GET AS MANY AS THREE SUCH MEN TOGETHER +HE WATCHED HIM GESTICULATING AND MURMURING IN THE KITCHEN +THESE WERE BUT FEW AND FOR THE FIRST TIME SINCE HE OPENED HIS SHOP HE TOOK A COMMERCIAL SURVEY OF ITS VALUE +COMRADE OSSIPON'S FACE TWITCHED WITH EXASPERATION +THAT BOY HEARS TOO MUCH OF WHAT IS TALKED ABOUT HERE +HE GAVE THE DISCUSSION UP WITH A SLIGHT SHRUG OF THE SHOULDERS +COMFORTABLE DEAR +HE GETS A RED FACE PORING OVER THEM +HE WAS NOT SATISFIED WITH HIS FRIENDS +WHEN HE ROSE PAINFULLY THE THRUSTING FORWARD OF A SKINNY GROPING HAND DEFORMED BY GOUTY SWELLINGS SUGGESTED THE EFFORT OF A MORIBUND MURDERER SUMMONING ALL HIS REMAINING STRENGTH FOR A LAST STAB +THE SHADOW OF HIS EVIL GIFT CLUNG TO HIM YET LIKE THE SMELL OF A DEADLY DRUG IN AN OLD VIAL OF POISON EMPTIED NOW USELESS READY TO BE THROWN AWAY UPON THE RUBBISH HEAP OF THINGS THAT HAD SERVED THEIR TIME +IT WAS KARL YUNDT WHO WAS HEARD IMPLACABLE TO HIS LAST BREATH +HE ISN'T FIT TO HEAR WHAT'S SAID HERE HE BELIEVES IT'S ALL TRUE +AT BEST THEY CAN ONLY INTERPRET THE MIND OF THE PROPHET AND CAN HAVE NO OBJECTIVE VALUE +HE PAUSED THEN ADDED WITH MODEST FIRMNESS +THEN WHY INDULGE IN PROPHETIC PHANTASIES +MISTER VERLOC WAS FULLY RESPONSIVE NOW +HE WAS OUT OF HIS MIND WITH SOMETHING HE OVERHEARD ABOUT EATING PEOPLE'S FLESH AND DRINKING BLOOD WHAT'S THE GOOD OF TALKING LIKE THAT +HE CAN'T STAND THE NOTION OF ANY CRUELTY +THE FAMOUS TERRORIST HAD NEVER IN HIS LIFE RAISED PERSONALLY AS MUCH AS HIS LITTLE FINGER AGAINST THE SOCIAL EDIFICE +AND THE INCONSISTENT WOMAN FELL UPON HIS BUTTONY BREAST WEEPING COPIOUSLY +I COULD NOT LOVE THEE DEAR SO MUCH LOVED I NOT HONOR MORE +THE BOYS BLESS THEIR BRAVE HEARTS HAVE DONE NOBLY BUT OLDER MEN ARE NEEDED NOW WE CANNOT SACRIFICE ALL THE GALLANT LADS AND WE WHO HAVE MORE TO LOSE THAN THEY MUST TAKE OUR TURN AND TRY TO DO AS WELL +BUT EVEN WHILE SHE ENJOYED EVERY HOUR OF LIFE AND BEGRUDGED THE TIME GIVEN TO SLEEP SHE FELT AS IF THE DREAM WAS TOO BEAUTIFUL TO LAST AND OFTEN SAID +HIS WIFE FED HIM WITH THE FAT OF THE LAND REGARDLESS OF CONSEQUENCES HIS CHILDREN REVOLVED ABOUT HIM WITH TIRELESS CURIOSITY AND WONDER HIS NEIGHBORS FLOCKED IN TO APPLAUD ADVISE AND ADMIRE EVERY ONE TREATED HIM WITH A RESPECT MOST GRATEFUL TO HIS FEELINGS HE WAS AN OBJECT OF INTEREST AND WITH EVERY HOUR HIS IMPORTANCE INCREASED SO THAT BY NIGHT HE FELT LIKE A COMMANDER IN CHIEF AND BORE HIMSELF ACCORDINGLY +NOW CYNTHY BE YOU SATISFIED +SO CHRISTIE TURNED A DEAF EAR TO HER PROPHETIC SOUL AND GAVE HERSELF UP TO THE BLISSFUL HOLIDAY THAT HAD COME AT LAST +I HOPE YOU'LL LIKE HIM BETTER THAN THE FROST BITTEN OLD DAVID YOU FIRST KNEW AND WERE KIND ENOUGH TO LOVE +THEN SHE SAW DAVID AND THE REGIMENT BECAME ONE MAN TO HER +I'M NOT A TALKER YOU KNOW AND AS THE LAWS OF GRAVITATION FORBID MY SOARING ALOFT ANYWHERE I CAN ONLY EXPRESS MY JOYFULLY UPLIFTED STATE OF MIND BY PRANCING AS YOU CALL IT +I SHALL WAIT FOR TIME TO SHOW +CAN YOU REMEMBER WHAT HEPSEY TOLD US AND CALL THEM POOR LONG SUFFERIN CREETERS NAMES +DAVID AND CHRISTIE WENT SMILING AWAY TOGETHER AND IF THEY SHED ANY TEARS OVER THE BRIEF HAPPINESS NO ONE SAW THEM BUT THE FLOWERS AND THEY LOYALLY KEPT THE SECRET FOLDED UP IN THEIR TENDER HEARTS +MISTER POWER IS WAITING ARE YOU READY LOVE QUITE READY +AS A MARRIED WOMAN YOU WILL GET ON BETTER AS MY WIFE YOU WILL BE ALLOWED TO COME TO ME IF I NEED YOU AND AS MY HE STOPPED THERE FOR HE COULD NOT ADD AS MY WIDOW YOU WILL HAVE MY PENSION TO SUPPORT YOU +BENNET WILL TAKE THE GARDEN AND GREEN HOUSE OFF MY HANDS THIS AUTUMN FOR A YEAR OR LONGER IF I LIKE +THEN THEY WENT BACK TO THEIR WORK LITTLE DREAMING AS THEY TIED ROSES AND TWINED SMILAX WREATHS HOW NEAR THAT OTHER CHANCE WAS HOW SOON THEY WERE TO BE CALLED UPON TO KEEP THEIR PROMISE AND HOW WELL EACH WAS TO PERFORM THE PART GIVEN THEM IN LIFE AND DEATH +HE WAS NOT AS UNMOVED AS HE SEEMED BY THE GENERAL EXCITEMENT AND HAD FELT SUNDRY MANLY IMPULSES TO UP AND AT EM WHEN HIS COMRADES IN THE SHOP DISCUSSED THE CRISIS WITH IREFUL BRANDISHING OF AWLS AND VENGEFUL POUNDING OF SOLE LEATHER AS IF THE REBELS WERE UNDER THE HAMMER +VERY WELL SAID MISSUS WILKINS RESOLUTELY TO HERSELF EF I CAN'T MAKE NO IMPRESSION ON HIS SOUL I WILL ON HIS STOMMICK AND SEE HOW THAT'LL WORK +YOU YOUNG FOLKS TAKE A WEDDING TRIP TO THE GREEN HOUSE WHILE WE SEE HOW WELL WE CAN GET ON WITHOUT YOU +ALL WATCHED WITH QUICKENED BREATH AND PROUD SOULS THAT LIVING WAVE BLUE BELOW AND BRIGHT WITH A STEELY GLITTER ABOVE AS IT FLOWED DOWN THE STREET AND AWAY TO JOIN THE SEA OF DAUNTLESS HEARTS THAT FOR MONTHS HAD ROLLED UP AGAINST THE SOUTH AND EBBED BACK REDDENED WITH THE BLOOD OF MEN LIKE THESE +IT IS TERRIBLE AND YET GLORIOUS +HE'S A KIND NEIGHBORLY MAN AND HIS BOY WILL TAKE MY PLACE ABOUT THE HOUSE AND PROTECT YOU FAITHFULLY +A VERY SIMPLE LITTLE MARRIAGE FEAST BUT MORE LOVE GOOD WILL AND TENDER WISHES ADORNED THE PLAIN TABLE THAN IS OFTEN FOUND AT WEDDING BREAKFASTS AND BETTER THAN ANY SPEECH OR SONG WAS LETTY'S BROKEN WHISPER AS SHE FOLDED HER ARMS ROUND DAVID'S EMPTY CHAIR WHEN NO ONE SAW HER HEAVEN BLESS AND KEEP AND BRING HIM BACK TO US +THE ROSES ARE FOR THEY REMIND ME OF POOR HELEN AND THE FIRST WORK I DID WITH DAVID WAS ARRANGING FLOWERS LIKE THESE FOR A DEAD BABY'S LITTLE COFFIN +TO NO HOME IN THE LAND DID THE GREAT TROUBLE BRING A MORE SUDDEN CHANGE THAN THE LITTLE COTTAGE IN THE LANE +YES DAVID SISTER AND SWEETHEART ANSWERED BRAVELY FORGETTING IN THE FERVOR OF THE MOMENT WHAT HEAVY CONSEQUENCES GOD MIGHT SEE FIT TO SEND GOOD +I KNEW YOU WOULD GO I SAW YOU GETTING READY AND I MADE UP MY MIND TO FOLLOW +TO SAY THAT THE FISH ROSE AT ONCE AND SWALLOWED THE BAIT HOOK AND ALL BUT FEEBLY EXPRESSES THE JUSTICE DONE TO THE CAKES BY THAT LONG SUFFERING MAN +WE CAN'T AFFORD NO NICE VITTLES NOW WHEN OUR MEN ARE SUFFERIN SO +THEY KNEW WHAT IT WAS WITHOUT A WORD MISSUS STERLING CLASPED HER HANDS AND BOWED HER HEAD +IN THAT CASE YOU WILL FIND ME A PROUD IMPETUOUS AMBITIOUS FELLOW CHRISTIE AND HOW WILL THAT SUIT +SURELY I SHALL IF I GIVE YOU AND MYSELF TO THE CAUSE AND I DO IT GLADLY THOUGH I KNOW THAT MY HEART HAS GOT TO ACHE AS IT NEVER HAS ACHED YET WHEN MY COURAGE FAILS AS IT WILL BY AND BY AND MY SELFISH SOUL COUNTS THE COST OF MY OFFERING AFTER THE EXCITEMENT IS OVER +DAVID CAUGHT THE EXALTATION AND GAVE NO FURTHER THOUGHT TO ANY THING BUT THE DUTY OF THE HOUR FINDING HIMSELF STRONGER AND BRAVER FOR THAT LONG LOOK INTO THE ILLUMINATED FACE OF THE WOMAN HE LOVED +FINDING THAT LISHA SHOWED LITTLE ENTHUSIASM ON THE SUBJECT SHE TRIED TO ROUSE HIM BY PATRIOTIC APPEALS OF VARIOUS SORTS +NOT ONE DAVID THAT'S TRUE LOVE CHRISTIE +YOU WILL LET ME DO IT AND IN RETURN I WILL MARRY YOU WHENEVER YOU ASK ME ANSWERED CHRISTIE SEALING THE PROMISE WITH A KISS THAT SILENCED HIM +WE WILL WHAT CAN I DO FOR YOU DAVY ASKED CHRISTIE WONDERFULLY SUPPORTED BY THE THOUGHT THAT SHE WAS GOING TOO +DAVID WAS SOBER ENOUGH NOW AND WENT ABOUT HIS WORK WITH A GRIM SET TO HIS LIPS AND A SPARK IN HIS EYES THAT MADE THE THREE WOMEN LOOK AT ONE ANOTHER PALE WITH UNSPOKEN APPREHENSION +MOTHER SAYS I'VE GONE BACK TO THE TIME BEFORE WE LOST LETTY AND I SOMETIMES FEEL AS IF I HAD +DAVID HELD IT CLOSE IN BOTH OF HIS SAYING GRATEFULLY THANK YOU MOTHER THEN FIXING HIS EYES ON THE YOUNGER YET NOT DEARER WOMEN HE ADDED WITH A RING IN HIS VOICE THAT MADE THEIR HEARTS ANSWER WITH A PROMPT AY AY IN SPITE OF LOVE OR FEAR +NOTHING CAN SURPRISE ME NOW I'M PREPARED FOR ANY THING EVEN THE SIGHT OF MY QUAKERISH LOVER DANCING A JIG +THE WOMEN DROPPED THEIR WORK TO LOOK AND LISTEN FOR HIS VISITS WERE FEW AND SHORT AND EVERY INSTANT WAS PRECIOUS +YOU'VE SOMETHING TO TELL ME I SEE IT IN YOUR FACE DEAR I MUST GO +BUT I THINK FEW BRIDES DRESS WITH A BRAVER HAPPIER HEART THAN MINE THOUGH I DO CHOOSE A SOBER WEDDING GOWN ANSWERED CHRISTIE SMILING AGAIN AS SHE TOOK FROM A HALF PACKED TRUNK HER NEW HOSPITAL SUIT OF SOFT GRAY WOOLLEN STUFF +IT WOULD HAVE TAKEN MANY KNAPSACKS TO HOLD ALL THE GIFTS SHOWERED UPON HIM BY HIS FRIENDS AND NEIGHBORS +THEN THEY STOOD QUITE STILL FOR A TIME AND IN THE SILENCE THE TWO HEARTS TALKED TOGETHER IN THE SWEET LANGUAGE NO TONGUE CAN UTTER +I DON'T WANT YOU TO I LOVE TO SEE YOU SO YOUNG AND HAPPY ONLY YOU ARE NOT THE OLD DAVID AND I'VE GOT TO GET ACQUAINTED WITH THE NEW ONE +EXCELLENTLY I LIKE PRIDE OF YOUR SORT IMPETUOSITY BECOMES YOU FOR YOU HAVE LEARNED TO CONTROL IT IF NEED BE AND THE AMBITION IS BEST OF ALL +NO HE AIN'T IT'S A TRAINER ADDED ANN LIZY +HER MEETING WITH LETTY WAS INDESCRIBABLY TENDER AND THE DAYS THAT FOLLOWED WERE PRETTY EQUALLY DIVIDED BETWEEN HER AND HER BROTHER IN NURSING THE ONE AND LOVING THE OTHER +THEN THE GOOD SOUL OPENLY SHOULDERED THE BURDEN SHE HAD BORNE SO LONG IN SECRET AND BRAVELY TRUDGED ON ALONE +I FEEL LIKE A BOY OUT OF SCHOOL OR RATHER A MAN OUT OF PRISON AND MUST ENJOY MY LIBERTY IN SOME WAY +NEXT EVENING AS MISSUS STERLING SAT ALONE IN THE TWILIGHT A TALL MAN IN ARMY BLUE ENTERED QUIETLY STOOD WATCHING THE TRANQUIL FIGURE FOR A MOMENT THEN WENT AND KNELT DOWN BESIDE IT SAYING WITH A MOST UNSOLDIERLY CHOKE IN THE VOICE +NOTHING CAN PART US ANY MORE NOT EVEN DEATH FOR LOVE LIKE OURS WILL LAST FOR EVER +I WISH I HADN'T TAKEN THAT BRANDY HE SAID FOOL THAT I AM +THAT AT ALL TIMES DEBASING AT THIS PARTICULAR TIME IT WAS INFAMOUS THAT A VICE UNWORTHY OF ANY MAN WAS DOUBLY SINFUL IN A MAN OF EDUCATION AND A MINISTER OF GOD IN VAIN +IN THE VALLEY OF THE SHADOW OF DEATH HE IS WITH US +I HAD THE PLEASURE OF MEETING HIM IN SOCIETY +DEAD SAID DOCTOR MACKLEWAIN +I'LL REPORT THIS TO THE GOVERNMENT +YES ONE OUGHTN'T TO LEAVE THE COLONY WITHOUT SEEING IT SAYS BURGESS IT'S WORTH SEEING +THE DEVIL HE IS I HEARD SOMETHING ABOUT IT TOO +IN FACT THE RINGLEADER JOHN REX GAVE ME HIS CONFESSION AND I SENT IT TO THE BISHOP +THE GOVERNMENT MAY GO TO AND YOU TOO ROARED BURGESS GET OUT +AN IMPULSIVE GENTLEMAN SAID MEEKIN TO MACKLEWAIN AS THE SOUND OF MISTER NORTH'S FOOTSTEPS DIED AWAY IN THE DISTANCE +SHOW MISTER NORTH OUT HE SAID AND GO DOWN TO THE BARRACKS AND TELL TROKE THAT KIRKLAND IS TO HAVE A HUNDRED LASHES TO MORROW +I'LL SHOW YOU WHO'S MASTER HERE MY GOOD SIR +I AM A MINISTER OF GOD SIR AND I FORBID YOU TO COMMIT THIS CRIME +WELL NOW SAID MEEKIN WITH ASPERITY I DON'T AGREE WITH YOU +BY AND BY A SHORT FIGURE SMOKING A CHEROOT CAME UP OUT OF THE DARK AND PROVED TO BE DOCTOR MACKLEWAIN WHO HAD BEEN PREVENTED FROM ATTENDING THE DINNER BY REASON OF AN ACCIDENT TO A CONSTABLE AT NORFOLK BAY WHICH HAD CLAIMED HIS PROFESSIONAL ATTENTION +WHOM IS HE GOING TO FLOG NOW +BEFORE THE TWO CLERGYMEN HAD GOT HALF WAY DOWN THE STEEP PATH THAT LED FROM THE COMMANDANT'S HOUSE TO THE FLAT ON WHICH THE COTTAGES OF THE DOCTOR AND CHAPLAIN WERE BUILT MACKLEWAIN REJOINED THEM +MACKLEWAIN SHOOK HIS HEAD SERIOUSLY +THIS IS MURDEROUS +PRAY HELP YOURSELF TO WINE +MISTER MEEKIN EXPRESSED SOME ALARM BUT DOCTOR MACKLEWAIN RE ASSURED HIM +OH GOD GIVE ME STRENGTH AID ME HELP ME +NORTH KNEW WELL THAT HE WOULD NEVER DARE TO ATTEMPT ANY SUCH ACT OF VIOLENCE BUT THE INSULT STUNG HIM LIKE THE CUT OF A WHIP +HE SEEMS TO ME TO BE TRULY PENITENT FOR HIS OFFENCES A MISGUIDED BUT NOT A HYPOCRITICAL MAN IF MY KNOWLEDGE OF HUMAN NATURE GOES FOR ANYTHING I HOPE HE IS SAID NORTH +DAMN YOUR IMPERTINENCE SIR BURST OUT BURGESS +TWICE HE PAUSED ON THE WAY TO THE SITTING ROOM AND TWICE WAS HE DRIVEN ON BY A POWER STRONGER THAN HIS WILL +YOU'RE A DISMISSED OFFICER OF THE GOVERNMENT SIR +HAVE YOU MANY VISITORS CAPTAIN BURGESS VERY FEW +I HAVE THESE ATTACKS AT TIMES +IN THE MIDST OF HIS ARGUMENTS HE FOUND HIMSELF AT THE CUPBOARD WITH THE BOTTLE AT HIS LIPS IN AN ATTITUDE THAT WAS AT ONCE LUDICROUS AND HORRIBLE +HE MIXED A TEASPOONFUL OF THIS IN A PANNIKIN OF WATER AND DRANK IT +YOU DON'T MEAN TO SAY HE'S GOING TO FLOG KIRKLAND +HE IS JUST MARRIED YOU KNOW IS HE SAID BURGESS +ANOTHER FLOGGING TO MORROW SAID HE GRUMBLINGLY +THIS OF COURSE WAS MERE BRAVADO ON THE PART OF THE COMMANDANT +I'LL TEACH MY PRISONERS TO ATTEMPT SUICIDE +I WAS QUARTERED WITH HIM AT SARAH ISLAND +THERE'S NO FEAR OF HIM SAID BURGESS CHEERILY IF HE GROWS UPROARIOUS WE'LL SOON GIVE HIM A TOUCH OF THE CAT +I'VE GIVEN MY ORDERS SIR +WE CAN'T DO ANYTHING WITHOUT EVIDENCE COMPLAIN +I SHALL FIND MY PORTMANTEAU IN MY ROOM YOU SAID YES YES +HE SMELT THE NUTTY AROMA OF THE SPIRIT +DELIGHTED TO SEE YOU MISTER MEEKIN +THEN CAPTAIN BURGESS CRIED NORTH HIS PALE FACE FLUSHING I TELL YOU THE BOY'S BLOOD WILL BE ON YOUR HEAD +PERHAPS YOU'LL HAVE THE GOODNESS TO ALLOW ME TO BE THE BEST JUDGE OF THAT RETURNED MACKLEWAIN DRAWING UP HIS LITTLE BODY TO ITS LEAST INSIGNIFICANT STATURE +ABANDONED INDEED BY GOD AND MAN ALMOST +GOOD NIGHT SIR I HOPE YOU WILL BE COMFORTABLE +DOCTOR WE ALL HAVE OUR CROSSES HAVE WE NOT +HOW DELIGHTFUL THE GRASS SMELLS +IT WAS AS THOUGH HE HAD REACHED THE CRISIS OF A DISEASE WHICH HAD BEEN FOR DAYS GATHERING FORCE +THEY SHALL NOT FLOG THAT BOY HE SAID +THE REVEREND MEEKIN EYED HIS CLERICAL BROTHER WITH HORROR THE REVEREND MEEKIN WAS NOT ACCUSTOMED TO CLERGYMEN WHO WORE BLACK NECKTIES SMOKED CLAY PIPES CHEWED TOBACCO AND DRANK NEAT BRANDY OUT OF TUMBLERS +I SUPPOSE SEVERITY IS NECESSARY RETURNED MEEKIN THOUGH TO MY EARS A FLOGGING SOUNDS A LITTLE DISTASTEFUL +CAPTAIN FRERE SAYS THAT THE SCENERY IS DELIGHTFUL +HE SLEEPS AT THE BACK AND NORTH HURRIED OFF +O LORD LOOK DOWN UPON ME +IF YOU PLEASE SAID MEEKIN GRAVELY +HE HAS THE STRANGEST FITS AT TIMES +SO THEY WENT ON TO THE VERANDAH AND LOOKED DOWN UPON THE LIGHTS OF THE PRISON AND LISTENED TO THE SEA LAPPING THE SHORE +OUR ROADS LIE TOGETHER DOCTOR +I MUST HAVE A TEASPOONFUL HE SAID TO ALLAY THE CRAVING +A GREAT RASCAL PUT IN NORTH +YOU HAVE NOT BEEN LONG IN THE COLONY MISTER MEEKIN +UNLESS IT'S A CANCER IN THE STOMACH I DON'T KNOW WHAT IT CAN BE CANCER IN THE STOMACH +THEN DON'T YOU INTERFERE WITH ME SIR +THAT'S MACKLEWAIN'S BUSINESS +BUT MACKLEWAIN WAS TIRED AND WANTED TO GET HOME +IMPERTINENT YOUNG BEGGAR SAID BURGESS +THAT LAST FELLOW YOU HAD OUGHT TO HAVE BEEN TIED UP HIMSELF +AND BEAT ON THE BARS WITH WHITE AND SWEATING HANDS +BUT KIRKLAND KEPT STEADILY ON FOR THE RIVER +WHAT IS HE MORE THAN ANYBODY ELSE SAID THE WRETCHED MAN TO HIMSELF AS HE HUGGED HIS MISERY CLOSE +WHAT DOES HE CARE CARE +WHEN THE MUSTER BELL RANG AND THE GANG BROKE UP RUFUS DAWES ON HIS SILENT WAY TO HIS SEPARATE CELL OBSERVED A NOTABLE CHANGE OF CUSTOM IN THE DISPOSITION OF THE NEW CONVICT +THERE'S MORE TROUBLE WITH YOU BLOODY ARISTOCRATS THAN ENOUGH LIE QUIET +VERY GOOD YOUR HONOUR SAYS TROKE +MUST STOP THAT FIFTY LASHES TROKE +OH MISTER NORTH SAYS KIRKLAND WHY DID YOU STOP ME +HAVE YOU EVER BEEN IN THAT THAT PLACE I WAS IN LAST NIGHT ASKED KIRKLAND +A PRISONER REFRACTORY YOUR REVERENCE SAID THE WATCHMAN +HOLD ON TO ME MISS NANCY SAID THE GIANT I'M BIG ENOUGH TO CARRY DOUBLE +IT'S HARD FOR SUCH YOUNG UNS +KIRKLAND JUMPED FOR THE JETTY MISSED HIS FOOTING AND FELL INTO THE ARMS OF THE CHAPLAIN +LET HIM OUT CRIED NORTH AGAIN STAMPING HIS FOOT +WANTS TO COME OUT MISTER NORTH +DO HIM GOOD CURSE HIM +ABOUT DAWN THE NEXT MORNING MISTER NORTH WHO AMONGST OTHER VAGARIES NOT APPROVED OF BY HIS BISHOP HAD A HABIT OF PROWLING ABOUT THE PRISON AT UNOFFICIAL HOURS WAS ATTRACTED BY A DISPUTE AT THE DOOR OF THE DORMITORY +I WON'T HAVE MY MEN KNOCKED UP WITH FLOGGING THESE RASCALS +JUST AS HE REACHED IT HOWEVER THE FIGURE OF MISTER NORTH ROSE FROM BEHIND A PILE OF STONES +IF YOU FALL WE MUST FALL OVER YOU AND THEN YOU'RE DONE FOR +I ORDER YOU SIR NORTH CRIED INDIGNANT +I'M NOT TO GO IN THERE SAYS THE EX BANK CLERK DRAWING BACK IN DISMAY FROM THE CLOUD OF FOUL FACES WHICH LOWERED UPON HIM +YOU CAN GUESS WHAT THAT UNHAPPY BOY HAS SUFFERED +HE HAD BEEN A CLERK IN A BANKING HOUSE AND WAS TRANSPORTED FOR EMBEZZLEMENT THOUGH BY SOME GRAVE DOUBTS AS TO HIS GUILT WERE ENTERTAINED +HE HAD HARDLY UTTERED THE WORDS WHEN THE BOY FLUNG HIMSELF BENEATH THE LOG +KIRKLAND GHASTLY PALE BLEEDING WITH HIS WOOLLEN SHIRT TORN AND HIS BLUE EYES WIDE OPEN WITH TERROR WAS CLINGING TO THE BARS +VERY SORRY YOUR REVERENCE BUT YOUR REVERENCE KNOWS THAT I DAREN'T DO SUCH A THING +YOUR COUSIN THE WILD CONVOLVULUS WHOM I LEFT IN THE FIELDS THIS MORNING DOES NO SUCH THING I ASSURE YOU +DID THAT LOVELY CREATURE SUPPOSE THAT NATURE WHO HAD DONE SO MUCH FOR HER THAT THE FAME OF HER BEAUTY EXTENDED THROUGHOUT THE WORLD HAD YET LEFT HER SO WEAK AND FEEBLE THAT SHE COULD NOT SUPPORT HERSELF IN THE POSITION MOST CALCULATED TO GIVE HER EASE AND PLEASURE +MY YOUNG PLANTS REQUIRE HEAT OR THEY WOULD NOT LIVE AND THE POTS WE ARE KEPT IN PROTECT US FROM THOSE CRUEL WIRE WORMS WHO DELIGHT TO DESTROY OUR ROOTS +THEN THE WIND TOOK ANOTHER FROLIC ROUND THE GARDEN AND MADE UP TO THE LARGE WHITE LILY INTO WHOSE REFINED EAR HE WHISPERED A DOUBT AS TO THE NECESSITY OR ADVANTAGE OF HER THICK POWERFUL STEM BEING PROPPED UP AGAINST A STUPID UGLY STICK +HE REALLY GRIEVED TO SEE IT +YOU SURELY CANNOT SUPPOSE THAT IN A NATURAL STATE YOU WOULD BE FORCED TO CLIMB REGULARLY UP ONE TALL BARE STICK SUCH AS I SEE YOU UPON NOW +STILL THE ROSE TREE STOOD OUT THAT THERE MUST BE SOME GREAT ADVANTAGES IN A GARDENER'S CARE FOR SHE COULD NOT PRETEND TO BE IGNORANT OF HER OWN SUPERIORITY TO ALL HER WILD RELATIONS IN THE WOODS +MAKING A SORT OF EDDYING CIRCUIT ROUND THE GARDEN HE KNOCKED OVER THE CONVOLVULUS POLE TORE THE STRIPS FROM THE STICK THAT HELD UP THE WHITE LILY LOOSED ALL THE CARNATION FLOWERS FROM THEIR FASTENINGS BROKE THE ROSE TREE DOWN AND LEVELLED THE SWEET PEAS TO THE GROUND +I AM NOT THINKING ABOUT THE GARDEN MAMMA REPLIED THE YOUNG GIRL WITHOUT LIFTING UP HER FACE WE CAN PLANT NEW FLOWERS AND TIE UP EVEN SOME OF THESE AFRESH +BUT FOR THE SIGHT THAT AWAITED HIM HE WAS NOT PREPARED AT ALL +WHY NOT ALLOW YOUR SILVER TUFTS TO LUXURIATE IN A NATURAL MANNER +WHAT A FUSS IS MADE ABOUT YOU MY DEAR LITTLE FRIENDS +INDEED NOT A FLOWER ESCAPED HIS MISCHIEVOUS SUGGESTIONS +MEANWHILE HOW FARED IT WITH THE FLOWERS +IN THIS POSITION SHE REMAINED UNTIL A GENTLE HAND WAS LAID UPON HER SHOULDER +THE MISTRESS HAD RETURNED AND THE YOUNG LADY WAS WITH HER AND HURRIED AT ONCE TO HER FAVOURITE GARDEN +ECHOED THE FLOWERS TREMULOUSLY AS WITH A SORT OF FEARFUL PLEASURE THEY AWAITED HIS APPROACH +WEEDS MEANWHILE SPRANG UP AND A DREARY CONFUSION REIGNED IN THE ONCE ORDERLY AND BRILLIANT LITTLE GARDEN +BEFORE THE DAY CLOSED THE GARDENER CAME WHISTLING FROM HIS FARM WORK TO LOOK OVER HIS PRETTY CHARGES +OH THAT SHE WERE ONCE MORE CLIMBING UP THE FRIENDLY FIR POLE +THE HONEYSUCKLE ESCAPED NO BETTER AND THE CARNATION WAS READY TO DIE OF VEXATION AT FINDING THAT HER COVETED FREEDOM HAD LEVELLED HER TO THE DIRT +GO ON DOWN THE MOUNTAIN SAID MERCURY AND AS YOU GO CAST THE BONES OF YOUR MOTHER OVER YOUR SHOULDERS BEHIND YOU AND WITH THESE WORDS HE LEAPED INTO THE AIR AND WAS SEEN NO MORE +WE SHOULD LIKE ABOVE ALL THINGS SAID DEUCALION TO SEE THIS LAND FULL OF PEOPLE ONCE MORE FOR WITHOUT NEIGHBORS AND FRIENDS THE WORLD IS A VERY LONELY PLACE INDEED +SURELY I DO NOT KNOW SAID DEUCALION +THE DAY IS COMING SAID PROMETHEUS WHEN JUPITER WILL SEND A FLOOD TO DESTROY MANKIND FROM THE EARTH +BUT MEN KEPT ON FIGHTING AND ROBBING EVEN WHILE THE RAIN WAS POURING DOWN AND THE SEA WAS COMING UP OVER THE LAND +AFTER JUPITER HAD BOUND PROMETHEUS ON MOUNT CAUCASUS AND HAD SENT DISEASES AND CARES INTO THE WORLD MEN BECAME VERY VERY WICKED +THESE MEN HE SAID TO HIS MIGHTY COMPANY ARE NOTHING BUT A SOURCE OF TROUBLE +WHAT DID HE MEAN ASKED PYRRHA +IS THERE ANYTHING THAT YOU WISH HE ASKED +BUT DEUCALION AND PYRRHA WERE VERY SAD FOR THEY KNEW THAT THEY WERE THE ONLY PERSONS WHO WERE LEFT ALIVE IN ALL THE LAND +NO ONE BUT DEUCALION THE SON OF PROMETHEUS WAS READY FOR SUCH A STORM +WHEN AT LAST THEY REACHED THE PLAIN THEY FOUND THEMSELVES AT THE HEAD OF A NOBLE COMPANY OF HUMAN BEINGS ALL EAGER TO SERVE THEM +IN THOSE VERY EARLY TIMES THERE WAS A MAN NAMED DEUCALION AND HE WAS THE SON OF PROMETHEUS +ONE OF THE YOUNG FAIRIES OVERHEARING HER AND FANCYING SHE MIGHT WORK SOME MISCHIEF TO THE LITTLE BABY WENT AND HID HERSELF BEHIND THE HANGINGS IN THE HALL SO AS TO BE ABLE TO HAVE THE LAST WORD AND UNDO ANY HARM THE OLD FAIRY MIGHT WISH TO WORK +HE TURNED TO SHOW THEM THE CASTLE BUT BEHOLD +HE PASSED THROUGH ONE APARTMENT AFTER ANOTHER WHERE WERE LADIES AND GENTLEMEN ASLEEP IN THEIR CHAIRS OR STANDING +THEY TALKED FOR FOUR HOURS AND HAD NOT THEN SAID HALF THAT WAS IN THEIR HEADS TO SAY +MEANWHILE ALL THE REST OF THE PEOPLE IN THE CASTLE HAD BEEN WAKENED AT THE SAME MOMENT AS THE PRINCESS AND THEY WERE NOW EXTREMELY HUNGRY +HE ENTERED THE GUARD ROOM THERE THE GUARDS STOOD DRAWN UP IN LINE WITH CARBINES AT THEIR SHOULDERS BUT THEY WERE SOUND ASLEEP +NOW FIFTEEN YEARS AFTER THE PRINCESS WAS BORN SHE WAS WITH THE KING AND QUEEN AT ONE OF THEIR CASTLES AND AS SHE WAS RUNNING ABOUT BY HERSELF SHE CAME TO A LITTLE CHAMBER AT THE TOP OF A TOWER AND THERE SAT AN HONEST OLD WOMAN SPINNING FOR SHE HAD NEVER HEARD OF THE KING'S EDICT +THE YOUNG PRINCE AT THESE WORDS FELT HIMSELF ON FIRE +THE TURN OF THE OLD FAIRY HAD NOW COME AND SHE DECLARED WHILE HER HEAD SHOOK WITH MALICE THAT THE PRINCESS SHOULD PIERCE HER HAND WITH A SPINDLE AND DIE OF THE WOUND +HE ENTERED A LARGE FORECOURT AND STOOD STILL WITH AMAZEMENT AND AWE +SHE HAD NO SOONER TAKEN UP THE SPINDLE THAN BEING HASTY AND CARELESS SHE PIERCED HER HAND WITH THE POINT OF IT AND FAINTED AWAY +THE VIOLINS AND HAUT BOYS PLAYED OLD BUT EXCELLENT PIECES OF MUSIC AND AFTER SUPPER TO LOSE NO TIME THE GRAND ALMONER MARRIED THE ROYAL LOVERS IN THE CHAPEL OF THE CASTLE +WHEN AT LAST THE QUEEN GAVE BIRTH TO A DAUGHTER THE KING WAS SO OVERJOYED THAT HE GAVE A GREAT CHRISTENING FEAST THE LIKE OF WHICH HAD NEVER BEFORE BEEN KNOWN +SCARCELY HAD HE COME TO THE WOOD WHEN ALL THE TREES AND THORNS WHICH HAD MADE SUCH AN IMPENETRABLE THICKET OPENED ON ONE SIDE AND THE OTHER TO OFFER HIM A PATH +THE LADY IN WAITING BECAME VERY IMPATIENT AND AT LENGTH ANNOUNCED TO THE PRINCESS THAT THEY ALL WAITED FOR HER +THEN THE PRINCE TOOK THE PRINCESS BY THE HAND SHE WAS DRESSED IN GREAT SPLENDOUR BUT HE DID NOT HINT THAT SHE LOOKED AS HE HAD SEEN PICTURES OF HIS GREAT GRANDMOTHER LOOK HE THOUGHT HER ALL THE MORE CHARMING FOR THAT +HE KNEW THAT SHE WOULD NOT AWAKE FOR A HUNDRED YEARS +ONE SAID IT WAS AN ENCHANTED CASTLE ANOTHER THAT WITCHES LIVED THERE BUT MOST BELIEVED THAT IT WAS OCCUPIED BY A GREAT OGRE WHICH CARRIED THITHER ALL THE CHILDREN HE COULD CATCH AND ATE THEM UP ONE AT A TIME FOR NOBODY COULD GET AT HIM THROUGH THE WOOD +BUT THE FACES OF THE MEN WERE ROSY AND THE GOBLETS BY THEM HAD A FEW DROPS OF WINE LEFT +IT IS TRUE I CANNOT ENTIRELY UNDO WHAT MY ELDER HAS DONE +IN APPROACHING IT ITS SUSPICIOUS LOOKING YELLOW SPOTTED HOOD AND WATCHFUL ATTITUDE WILL BE LIKELY TO MAKE YOU GO CAUTIOUSLY THROUGH THE BOG WHERE IT STANDS AS IF YOU WERE APPROACHING A DANGEROUS SNAKE +YET STRANGE TO SAY THERE ARE DAYS EVEN HERE SOMEWHAT DULL LOOKING WHEN THE MOUNTAIN SEEMS UNCOMMUNICATIVE SENDING OUT NO APPRECIABLE INVITATION AS IF NOT AT HOME +ASPLENIUM EPILOBIUM HEUCHERA HAZEL DOGWOOD AND ALDER MAKE A LUXURIOUS FRINGE AND SETTING AND THE FORESTS OF DOUGLAS SPRUCE ALONG THE BANKS ARE THE FINEST I HAVE EVER SEEN IN THE SIERRA +PERHAPS THE PROFESSION OF DOING GOOD MAY BE FULL BUT EVERY BODY SHOULD BE KIND AT LEAST TO HIMSELF +THEIR LONG MASSIVE EARS GIVE THEM A VERY STRIKING APPEARANCE +EVERY CRYSTAL DANCES RESPONSIVE TO THE TOUCHES OF THE SUN AND CURRENTS OF SAP IN THE GROWING CELLS OF ALL THE VEGETATION ARE EVER IN A VITAL WHIRL AND RUSH AND THOUGH MANY FEET AND WINGS ARE FOLDED HOW MANY ARE ASTIR +THE VIVID GREEN OF THE BOULDERS BENEATH THE WATER IS VERY STRIKING AND COLORS THE ENTIRE STREAM WITH THE EXCEPTION OF THE PORTIONS BROKEN INTO FOAM +THE GREAT WILDS OF OUR COUNTRY ONCE HELD TO BE BOUNDLESS AND INEXHAUSTIBLE ARE BEING RAPIDLY INVADED AND OVERRUN IN EVERY DIRECTION AND EVERYTHING DESTRUCTIBLE IN THEM IS BEING DESTROYED +BUT IT IS FAR BETTER TO GO AFOOT +GO QUIETLY ALONE NO HARM WILL BEFALL YOU +AS THE LIFE BLOOD OF THE LANDSCAPES THE BEST OF THE WILDERNESS COMES TO THEIR BANKS AND NOT ONE DULL PASSAGE IS FOUND IN ALL THEIR EVENTFUL HISTORIES +THUS THE SHASTA RIVER ISSUES FROM A LARGE LAKE LIKE SPRING IN SHASTA VALLEY AND ABOUT TWO THIRDS OF THE VOLUME OF THE MC CLOUD GUSHES FORTH IN A GRAND SPRING ON THE EAST SIDE OF THE MOUNTAIN A FEW MILES BACK FROM ITS IMMEDIATE BASE +WHILE TRAVELING WITH A COMPANY OF HUNTERS I SAW ABOUT FIFTY IN ONE FLOCK +SHOULD THE VOLUME OF THE STREAM WHERE YOU STRIKE IT SEEM SMALL THEN YOU WILL KNOW THAT YOU ARE ABOVE THE SPRING IF LARGE NEARLY EQUAL TO ITS VOLUME AT ITS CONFLUENCE WITH THE PITT RIVER THEN YOU ARE BELOW IT AND IN EITHER CASE HAVE ONLY TO FOLLOW THE RIVER UP OR DOWN UNTIL YOU COME TO IT +BUT NEITHER THE GLORIFIED WOODS ON THE ONE HAND NOR THE LAKE ON THE OTHER COULD AT FIRST HOLD THE EYE +THEY ARE BROAD RUGGED CREVASSED CLOUDLIKE MASSES OF DOWN GRINDING ICE POURING FORTH STREAMS OF MUDDY WATER AS MEASURES OF THE WORK THEY ARE DOING IN SCULPTURING THE ROCKS BENEATH THEM VERY UNLIKE THE LONG MAJESTIC GLACIERS OF ALASKA THAT RIVERLIKE GO WINDING DOWN THE VALLEYS THROUGH THE FORESTS TO THE SEA +MOUNT BREMER IS THE MOST NOTED STRONGHOLD OF THE SHEEP IN THE WHOLE SHASTA REGION +TRACING THIS WILD CHANGING CHANNEL GORGE GULLY OR CANYON THE SECTIONS WILL SHOW MOUNT SHASTA AS A HUGE PALIMPSEST CONTAINING THE RECORDS LAYER UPON LAYER OF STRANGELY CONTRASTED EVENTS IN ITS FIERY ICY HISTORY +SHASTA RAMBLES AND MODOC MEMORIES +ONE BLANKET WILL BE ENOUGH TO CARRY OR YOU MAY FOREGO THE PLEASURE AND BURDEN ALTOGETHER AS WOOD FOR FIRES IS EVERYWHERE ABUNDANT +UNDER CERTAIN CONDITIONS YOU MAY HEAR THE ROAR OF THE WATER RUSHING FROM THE ROCK AT A DISTANCE OF HALF A MILE OR EVEN MORE OR YOU MAY NOT HEAR IT UNTIL WITHIN A FEW RODS +THE BIG MEADOWS LIE NEAR THE FOOT OF LASSEN'S BUTTE A BEAUTIFUL SPACIOUS BASIN SET IN THE HEART OF THE RICHLY FORESTED MOUNTAINS SCARCELY SURPASSED IN THE GRANDEUR OF ITS SURROUNDINGS BY TAHOE +THEN DARKNESS LIKE DEATH +AT SUCH TIME ITS HEIGHT SEEMS MUCH LESS AS IF CROUCHING AND WEARY IT WERE TAKING REST +THE ASCENT OF LASSEN'S BUTTE IS AN EASY WALK AND THE VIEWS FROM THE SUMMIT ARE EXTREMELY TELLING +SLIGHT RAINSTORMS ARE LIKELY TO BE ENCOUNTERED IN A TRIP ROUND THE MOUNTAIN BUT ONE MAY EASILY FIND SHELTER BENEATH WELL THATCHED TREES THAT SHED THE RAIN LIKE A ROOF +ONLY A LITTLE FOOD WILL BE REQUIRED +ARCTIC BEAUTY AND DESOLATION WITH THEIR BLESSINGS AND DANGERS ALL MAY BE FOUND HERE TO TEST THE ENDURANCE AND SKILL OF ADVENTUROUS CLIMBERS BUT FAR BETTER THAN CLIMBING THE MOUNTAIN IS GOING AROUND ITS WARM FERTILE BASE ENJOYING ITS BOUNTIES LIKE A BEE CIRCLING AROUND A BANK OF FLOWERS +THE LONG GRAY SLOPES LEADING UP TO THE GLACIER SEEM REMARKABLY SMOOTH AND UNBROKEN +TWO OR THREE MILES FARTHER ON IS THE MAIN STRONGHOLD OF THE MODOCS HELD BY THEM SO LONG AND DEFIANTLY AGAINST ALL THE SOLDIERS THAT COULD BE BROUGHT TO THE ATTACK +THUS ONE SAUNTERS ON AND ON IN THE GLORIOUS RADIANCE IN UTTER PEACE AND FORGETFULNESS OF TIME +HERE YOU STRIKE THE OLD EMIGRANT ROAD WHICH LEADS OVER THE LOW DIVIDE TO THE EASTERN SLOPES OF THE MOUNTAIN +THE MULE DEER ARE NEARLY AS HEAVY +EVERY LANDSCAPE LOW AND HIGH SEEMS DOOMED TO BE TRAMPLED AND HARRIED +MOST OF THE DRAINAGE OF THE GLACIER VANISHES AT ONCE IN THE POROUS ROCKS TO REAPPEAR IN SPRINGS IN THE DISTANT VALLEY AND IT IS ONLY IN TIME OF FLOOD THAT THE CHANNEL CARRIES MUCH WATER THEN THERE ARE SEVERAL FINE FALLS IN THE GORGE SIX HUNDRED FEET OR MORE IN HEIGHT +LARGE FLOCKS DWELL HERE FROM YEAR TO YEAR WINTER AND SUMMER DESCENDING OCCASIONALLY INTO THE ADJACENT SAGE PLAINS AND LAVA BEDS TO FEED BUT EVER READY TO TAKE REFUGE IN THE JAGGED CRAGS OF THEIR MOUNTAIN AT EVERY ALARM +REGAINING THE LOW GROUND AT THE BASE OF THE MOUNTAIN AND HOLDING ON IN YOUR GRAND ORBIT YOU PASS THROUGH A BELT OF JUNIPER WOODS CALLED THE CEDARS TO SHEEP ROCK AT THE FOOT OF THE SHASTA PASS +IT IS LINED WITH EMERALD ALGAE AND MOSSES AND SHADED WITH ALDER WILLOW AND THORN BUSHES WHICH GIVE IT A FINE SETTING +TRACING RIVERS TO THEIR FOUNTAINS MAKES THE MOST CHARMING OF TRAVELS +A THOUSAND THOUSAND VOICES ARE HEARD BUT SO FINELY BLENDED THEY SEEM A PART OF THE NIGHT ITSELF AND MAKE A DEEPER SILENCE +THE LOFTY ICY SHASTA TOWERING HIGH ABOVE ALL SEEMS BUT AN HOUR'S WALK FROM YOU THOUGH THE DISTANCE IN AN AIR LINE IS ABOUT SIXTY MILES +THEN THE SHINING OF THE WET LEAVES IS DELIGHTFUL AND THE STEAMY FRAGRANCE AND THE BURST OF BIRD SONG FROM A MULTITUDE OF THRUSHES AND FINCHES AND WARBLERS THAT HAVE NESTS IN THE CHAPARRAL +THEN FELL THE GLOAMING MAKING EVERYTHING STILL MORE FORBIDDING AND MYSTERIOUS +TRACING THE MC CLOUD TO ITS HIGHEST SPRINGS AND OVER THE DIVIDE TO THE FOUNTAINS OF FALL RIVER NEAR FORT CROOK THENCE DOWN THAT RIVER TO ITS CONFLUENCE WITH THE PITT ON FROM THERE TO THE VOLCANIC REGION ABOUT LASSEN'S BUTTE THROUGH THE BIG MEADOWS AMONG THE SOURCES OF THE FEATHER RIVER AND DOWN THROUGH FORESTS OF SUGAR PINE TO THE FERTILE PLAINS OF CHICO THIS IS A GLORIOUS SAUNTER AND IMPOSES NO HARDSHIP +IT IS THREE OR FOUR MILES LONG AND TERMINATES AT AN ELEVATION OF ABOUT NINE THOUSAND FIVE HUNDRED FEET ABOVE SEA LEVEL IN MORAINE SPRINKLED ICE CLIFFS SIXTY FEET HIGH +IN SETTING OUT FROM STRAWBERRY VALLEY BY BEARING OFF TO THE NORTHWESTWARD A FEW MILES YOU MAY SEE +THE DUCKS LESS WARY KEPT THEIR PLACES MERELY SWIMMING IN AND OUT THROUGH OPENINGS IN THE RUSHES RIPPLING THE GLASSY WATER AND RAISING SPANGLES IN THEIR WAKE +BUT DON QUIXOTE WHOM HIS THOUGHTS FAR MORE THAN HUNGER KEPT AWAKE COULD NOT CLOSE AN EYE AND ROAMED IN FANCY TO AND FRO THROUGH ALL SORTS OF PLACES +GIVE ME MY HORSE AND ARMS AND WAIT FOR ME HERE I WILL GO IN QUEST OF THIS KNIGHT AND DEAD OR ALIVE I WILL MAKE HIM KEEP HIS WORD PLIGHTED TO SO GREAT BEAUTY +DON QUIXOTE WAS ON FOOT WITH HIS HORSE UNBRIDLED AND HIS LANCE LEANING AGAINST A TREE AND IN SHORT COMPLETELY DEFENCELESS HE THOUGHT IT BEST THEREFORE TO FOLD HIS ARMS AND BOW HIS HEAD AND RESERVE HIMSELF FOR A MORE FAVOURABLE OCCASION AND OPPORTUNITY +SEEING THIS SANCHO GOT UP AND GRAPPLING WITH HIS MASTER HE GRIPPED HIM WITH ALL HIS MIGHT IN HIS ARMS GIVING HIM A TRIP WITH THE HEEL STRETCHED HIM ON THE GROUND ON HIS BACK AND PRESSING HIS RIGHT KNEE ON HIS CHEST HELD HIS HANDS IN HIS OWN SO THAT HE COULD NEITHER MOVE NOR BREATHE +NOBODY NEED HAVE ANY DOUBT ABOUT THAT SAID SANCHO FOR MY MASTER HAS A VERY HAPPY KNACK OF MATCHMAKING IT'S NOT MANY DAYS SINCE HE FORCED ANOTHER MAN TO MARRY WHO IN THE SAME WAY BACKED OUT OF HIS PROMISE TO ANOTHER MAIDEN AND IF IT HAD NOT BEEN FOR HIS PERSECUTORS THE ENCHANTERS CHANGING THE MAN'S PROPER SHAPE INTO A LACQUEY'S THE SAID MAIDEN WOULD NOT BE ONE THIS MINUTE +WHAT ARE YOU TALKING ABOUT MAN +THE WOUNDED GENTLEMAN OPENED HIS ALL BUT CLOSED EYES AND RECOGNISING CLAUDIA SAID I SEE CLEARLY FAIR AND MISTAKEN LADY THAT IT IS THOU THAT HAST SLAIN ME A PUNISHMENT NOT MERITED OR DESERVED BY MY FEELINGS TOWARDS THEE FOR NEVER DID I MEAN TO NOR COULD I WRONG THEE IN THOUGHT OR DEED +ON PERCEIVING THIS CLAUDIA WHEN SHE HAD CONVINCED HERSELF THAT HER BELOVED HUSBAND WAS NO MORE RENT THE AIR WITH HER SIGHS AND MADE THE HEAVENS RING WITH HER LAMENTATIONS SHE TORE HER HAIR AND SCATTERED IT TO THE WINDS SHE BEAT HER FACE WITH HER HANDS AND SHOWED ALL THE SIGNS OF GRIEF AND SORROW THAT COULD BE CONCEIVED TO COME FROM AN AFFLICTED HEART +DOST THOU REVOLT AGAINST THY MASTER AND NATURAL LORD +DON QUIXOTE DID SO AND ASKED HIM WHAT HAD HAPPENED TO HIM AND WHAT HE WAS AFRAID OF +ONE OF THE SQUIRES OBSERVED IN HIS MIXTURE OF GASCON AND CATALAN THIS CAPTAIN OF OURS WOULD MAKE A BETTER FRIAR THAN HIGHWAYMAN IF HE WANTS TO BE SO GENEROUS ANOTHER TIME LET IT BE WITH HIS OWN PROPERTY AND NOT OURS +SANCHO REPLIED THAT ALL THE TREES WERE FULL OF MEN'S FEET AND LEGS +WHAT LED ME INTO IT WAS A CERTAIN THIRST FOR VENGEANCE WHICH IS STRONG ENOUGH TO DISTURB THE QUIETEST HEARTS +DOST THOU RISE AGAINST HIM WHO GIVES THEE HIS BREAD +THE CAPTAINS SHOWED PLAINLY THE CONCERN THEY FELT THE REGENT'S LADY WAS DOWNCAST AND THE PILGRIMS DID NOT AT ALL ENJOY SEEING THEIR PROPERTY CONFISCATED +O HUSBAND WHOSE UNHAPPY FATE IN BEING MINE HATH BORNE THEE FROM THE MARRIAGE BED TO THE GRAVE +MASTER AND MAN DISMOUNTED FROM THEIR BEASTS AND AS SOON AS THEY HAD SETTLED THEMSELVES AT THE FOOT OF THE TREES SANCHO WHO HAD HAD A GOOD NOONTIDE MEAL THAT DAY LET HIMSELF WITHOUT MORE ADO PASS THE GATES OF SLEEP +CRUEL RECKLESS WOMAN SHE CRIED HOW EASILY WERT THOU MOVED TO CARRY OUT A THOUGHT SO WICKED +CLAUDIA WOULD NOT ON ANY ACCOUNT ALLOW HIM TO ACCOMPANY HER AND THANKING HIM FOR HIS OFFERS AS WELL AS SHE COULD TOOK LEAVE OF HIM IN TEARS +THE SERVANTS WEPT CLAUDIA SWOONED AWAY AGAIN AND AGAIN AND THE WHOLE PLACE SEEMED A FIELD OF SORROW AND AN ABODE OF MISFORTUNE +AND IF YOU HAVE ANY DESIRE TO SHORTEN THE JOURNEY AND PUT YOURSELF EASILY IN THE WAY OF SALVATION COME WITH ME AND I WILL SHOW YOU HOW TO BECOME A KNIGHT ERRANT A CALLING WHEREIN SO MANY HARDSHIPS AND MISHAPS ARE ENCOUNTERED THAT IF THEY BE TAKEN AS PENANCES THEY WILL LODGE YOU IN HEAVEN IN A TRICE +HE SAW THAT HIS SQUIRES FOR SO THEY CALL THOSE WHO FOLLOW THAT TRADE WERE ABOUT TO RIFLE SANCHO PANZA BUT HE ORDERED THEM TO DESIST AND WAS AT ONCE OBEYED SO THE GIRDLE ESCAPED +THE REGENT'S LADY ORDERED ONE OF HER SERVANTS TO GIVE THE EIGHTY CROWNS THAT HAD BEEN ASSESSED AS HER SHARE AT ONCE FOR THE CAPTAINS HAD ALREADY PAID DOWN THEIR SIXTY +SANCHO SAID THEY HAD BUT THAT THREE KERCHIEFS THAT WERE WORTH THREE CITIES WERE MISSING +HOW NOW TRAITOR EXCLAIMED DON QUIXOTE +HE TREMBLED WITH FEAR AND MADE FOR ANOTHER TREE WHERE THE VERY SAME THING HAPPENED TO HIM AND HE FELL A SHOUTING CALLING UPON DON QUIXOTE TO COME AND PROTECT HIM +THEY WERE ALL TAKEN ABACK AND NOT ONE OF THEM DARED TO UTTER A WORD SUCH DEFERENCE DID THEY PAY HIM +THEY MADE HASTE TO OVERTAKE THEM WHICH AS THE PARTY MOVED SLOWLY THEY WERE ABLE TO DO WITH EASE +DULCINEA IS PERISHING THOU ART LIVING ON REGARDLESS I AM DYING OF HOPE DEFERRED THEREFORE UNTRUSS THYSELF WITH A GOOD WILL FOR MINE IT IS HERE IN THIS RETIRED SPOT TO GIVE THEE AT LEAST TWO THOUSAND LASHES +AT THIS INSTANT ONE OR TWO OF THOSE SQUIRES WHO WERE POSTED AS SENTINELS ON THE ROADS TO WATCH WHO CAME ALONG THEM AND REPORT WHAT PASSED TO THEIR CHIEF CAME UP AND SAID SENOR THERE IS A GREAT TROOP OF PEOPLE NOT FAR OFF COMING ALONG THE ROAD TO BARCELONA +AND NOW THE SQUIRES DESPATCHED TO MAKE THE PRIZE CAME UP BRINGING WITH THEM TWO GENTLEMEN ON HORSEBACK TWO PILGRIMS ON FOOT AND A COACH FULL OF WOMEN WITH SOME SIX SERVANTS ON FOOT AND ON HORSEBACK IN ATTENDANCE ON THEM AND A COUPLE OF MULETEERS WHOM THE GENTLEMEN HAD WITH THEM +AT ONE MOMENT IT SEEMED TO HIM THAT HE WAS IN THE CAVE OF MONTESINOS AND SAW DULCINEA TRANSFORMED INTO A COUNTRY WENCH SKIPPING AND MOUNTING UPON HER SHE ASS AGAIN THAT THE WORDS OF THE SAGE MERLIN WERE SOUNDING IN HIS EARS SETTING FORTH THE CONDITIONS TO BE OBSERVED AND THE EXERTIONS TO BE MADE FOR THE DISENCHANTMENT OF DULCINEA +WHO IS TOUCHING ME AND UNTRUSSING ME +HE WAS MOUNTED UPON A POWERFUL HORSE AND HAD ON A COAT OF MAIL WITH FOUR OF THE PISTOLS THEY CALL PETRONELS IN THAT COUNTRY AT HIS WAIST +SANCHO ROSE AND REMOVED SOME DISTANCE FROM THE SPOT BUT AS HE WAS ABOUT TO PLACE HIMSELF LEANING AGAINST ANOTHER TREE HE FELT SOMETHING TOUCH HIS HEAD AND PUTTING UP HIS HANDS ENCOUNTERED SOMEBODY'S TWO FEET WITH SHOES AND STOCKINGS ON THEM +DON QUIXOTE GAVE HIS PROMISE AND SWORE BY THE LIFE OF HIS THOUGHTS NOT TO TOUCH SO MUCH AS A HAIR OF HIS GARMENTS AND TO LEAVE HIM ENTIRELY FREE AND TO HIS OWN DISCRETION TO WHIP HIMSELF WHENEVER HE PLEASED +IT IS NOT TRUE THEN SAID CLAUDIA THAT THOU WERT GOING THIS MORNING TO MARRY LEONORA THE DAUGHTER OF THE RICH BALVASTRO +HE SAW ME HE PAID COURT TO ME I LISTENED TO HIM AND UNKNOWN TO MY FATHER I LOVED HIM FOR THERE IS NO WOMAN HOWEVER SECLUDED SHE MAY LIVE OR CLOSE SHE MAY BE KEPT WHO WILL NOT HAVE OPPORTUNITIES AND TO SPARE FOR FOLLOWING HER HEADLONG IMPULSES +CLAUDIA TOLD HIM SHE MEANT TO GO TO A MONASTERY OF WHICH AN AUNT OF HERS WAS ABBESS WHERE SHE INTENDED TO PASS HER LIFE WITH A BETTER AND EVERLASTING SPOUSE +SAID ONE OF THE BYSTANDERS I HAVE GOT THEM AND THEY ARE NOT WORTH THREE REALS +IN A WORD HE PLEDGED HIMSELF TO BE MINE AND I PROMISED TO BE HIS WITHOUT CARRYING MATTERS ANY FURTHER +ONE OF HIS WAITERS PHIL TYSON WAS ONE OF THE EARLIER ONES TO GO BACK INTO THE BURNED DISTRICT TO BEGIN BUSINESS AND HE OPENED A RESTAURANT CALLED THE DEL MONTE IN POWELL STREET NEAR MARKET BUT IT WAS TOO EARLY FOR SUCCESS AND CLOSED AFTER A SHORT CAREER +HERE THERE IS ALWAYS GOOD MUSIC AND FOOD WELL COOKED AND WELL SERVED AND ALWAYS A LIVELY CROWD DURING THE LUNCHEON DINNER AND AFTER THEATRE HOURS THE ROOM IS NOT LARGE BUT ITS DIMENSIONS ARE GREATLY MAGNIFIED OWING TO THE COVERING OF MIRRORS WHICH LINE THE WALLS +OF COURSE THESE ARE NOT THE ENTIRE MENUS BUT OF ALL THE WELL PREPARED DISHES THESE ARE THEIR BEST +TO THE PICKLE ADD TWO LARGE ONIONS CUT IN QUARTERS TWO FRESH CARROTS AND ABOUT ONE OUNCE OF MIXED WHOLE ALLSPICE BLACK PEPPERS CLOVES AND BAY LEAVES +STRAIN THE SAUCE THROUGH A FINE COLLANDER AND ADD A FEW RAISINS A PIECE OF HONEY CAKE OR GINGER SNAPS AND THE MEAT OF ONE FRESH TOMATO +THE POODLE DOG HAS A HOTEL ATTACHMENT WHERE ONE MAY GET ROOMS OR FULL APARTMENTS +PUT INTO THE OVEN AGAIN AND COOK FOR HALF AN HOUR BASTING FREQUENTLY WITH THE ORIGINAL BRINE +WE FINALLY GOT HIM TO SELECT THE ONE PRIZED ABOVE ALL OTHERS AND THIS IS WHAT CHEF SCHEILER GAVE US +THE SPECIALTY OF THE HOF BRAU IS ABALONE'S AND THEY HAVE AS A FEATURE THIS SHELL FISH COOKED IN SEVERAL WAYS +THE RESTAURANTS OF THE PRESENT DAY THAT APPROACH NEAREST THE OLD BOHEMIAN RESTAURANTS OF PRE FIRE DAYS OF THE FRENCH CLASS ARE JACK'S IN SACRAMENTO STREET BETWEEN MONTGOMERY AND KEARNY FELIX IN MONTGOMERY STREET BETWEEN CLAY AND WASHINGTON AND THE POODLE DOG BERGEZ FRANKS IN BUSH STREET BETWEEN KEARNY AND GRANT AVENUE +UNDER ORDINARY CIRCUMSTANCES THE ABALONE IS TOUGH AND UNPALATABLE BUT AFTER THE DEFT MANIPULATION OF HERBERT THEY ARE TENDER AND MAKE A FINE DISH EITHER FRIED AS CHOWDER OR A LA NEWBERG +WHEN DONE TAKE THE MEAT OUT OF THE SAUCE +IN EITHER OF THESE RESTAURANTS YOU WILL BE SERVED WITH THE BEST THE MARKET AFFORDS COOKED THE RIGHT WAY +THOMPSON OPENED A LARGE RESTAURANT IN O'FARRELL STREET JUST ABOVE FILLMORE AND FOR TWO YEARS OR MORE DID A THRIVING BUSINESS HIS PLACE BEING NOTED FOR ITS GOOD COOKING AND ITS SPLENDID SERVICE +IF YOU KNOW HOW TO ORDER AND DO NOT CARE TO COUNT THE COST WHEN YOU ORDER PROBABLY THE BEST DINNER AT THESE RESTAURANTS CAN BE HAD AT EITHER BLANCO'S OR THE POODLE DOG +PUT IN THE OVEN AND BROWN TO A GOLDEN COLOR +AT THE CORNER OF MARKET AND EDDY STREETS IS THE ODEON DOWN IN A BASEMENT WITH DECORATIONS OF MOST GARISH ORDER +IN ADDITION TO ABALONE'S THE HOF BRAU MAKES A SPECIALTY OF LITTLE OREGON CRAWFISH +THEY ALSO HAVE AS THE CHEF IN CHARGE OF THE ABALONE DISHES HERBERT FORMERLY CHEF FOR ONE OF THE YACHT CLUBS OF THE COAST WHO CLAIMS TO HAVE THE ONLY PROPER RECIPE FOR MAKING ABALONE'S TENDER +HIS PRICES ARE MODERATE AND HIS COOKING AND VIANDS OF THE BEST AND WILL SATISFY THE MOST CRITICAL OF THE GOURMETS +THE FLY TRAP AND CHARLIE'S FASHION THE FIRST IN SUTTER STREET NEAR KEARNY AND THE OTHER IN MARKET NEAR SUTTER SERVE WELL COOKED FOODS ESPECIALLY SOUP SALADS AND FISH +THE CUISINE IS OF THE BEST AND THE CHEFS RANK AT THE TOP OF THEIR ART +SAN FRANCISCO'S CARE FREE SPIRIT WAS FULLY EXEMPLIFIED BEFORE THE ASHES OF THE GREAT FIRE OF NINETEEN O SIX WERE COLD +IT IS AN IDEA THAT IS WORTH WHILE BUT UNFORTUNATELY THE PROPRIETORS DEPEND TOO MUCH ON THE DECORATIVE FEATURE AND TOO LITTLE ON THE FOOD AND HOW THEY SERVE IT +THIS GARISH DISPLAY OF MIRRORS AND ELABORATE DECORATION OF CEILING AND PILLARS GIVES IT THE APPEARANCE OF THE ABODE OF SATURNALIA BUT DECORUM IS THE RULE AMONG THE PATRONS +IT HAS CHANGED FROM WHAT IT WAS IN THE OLD DAYS BUT IS STILL AN EXCELLENT PLACE TO DINE +BUT IF YOU REALLY LOVE GOOD MUSIC MUSIC THAT HAS MELODY AND RHYTHM AND SOOTHING CADENCES GO TO THE HEIDELBERG INN AND LISTEN TO THE CONCERT WHICH IS A FEATURE OF THE PLACE EVERY EVENING +THEN TAKE IT OUT OF THE ROASTING PAN AND PUT IT INTO A CASSEROLE AFTER SPRINKLING IT WITH TWO OUNCES OF FLOUR +THE HOF BRAU HOWEVER IS LESS DISTINCTIVELY GERMAN AS THE GREATER NUMBER OF ITS PATRONS ARE AMERICANS +ONE CAN ALMOST IMAGINE HIMSELF IN ONE OF THE FAMOUS RATHSKELLERS OF OLD HEIDELBERG NOT AT THE SCHLOSS OF COURSE FOR HERE YOU CANNOT LOOK DOWN ON THE WEISER AS IT FLOWS BENEATH THE WINDOWS OF THE GREAT WINE STUBE ON THE HILL +AT THE TWO MENTIONED ONE PAYS FOR THE SURROUNDINGS AS WELL AS FOR THE FOOD AND SOMETIMES THIS IS WORTH PAYING FOR +BOTH SERVE GOOD SPANISH DINNERS AT REASONABLE PRICES +SEASON WITH SALT AND PEPPER AND A LITTLE SUGAR TO TASTE +HERE AS WELL AS IN A NUMBER OF OTHER PLACES ONE CAN WELL APPRECIATE THE COLLOQUIAL DEFINITION OF CABARET +JOHN TAIT IS THE PRESIDING SPIRIT HERE HE HAVING MADE REPUTATION AS CLUB MANAGER AND THEN AS MANAGER OF THE CLIFF HOUSE +IN THIS SAME DISTRICT IS THE MINT IN COMMERCIAL STREET BETWEEN MONTGOMERY AND KEARNY STREETS +CLARETS ARE VALUED FOR THEIR FLAVOR AND FOR THEIR TONIC PROPERTIES +NEVER DRINK ANY HARD LIQUORS SUCH AS WHISKY BRANDY GIN OR COCKTAILS WITH OYSTERS OR CLAMS AS IT IS LIABLE TO UPSET YOU FOR THE REST OF THE EVENING +CHABLIS A WHITE BURGUNDY DRY AND OF AGREEABLE AROMA +HOCHHEIMER A LIGHT PLEASING AND WHOLESOME WINE +DRY AND OF MAGNIFICENT BOUQUET +GERMAN WINES ARE OF LIGHTER CHARACTER AND ARE GENERALLY TERMED RHEIN WINES +CLARET EIGHTEEN NINETY EIGHT AND NINETEEN O FOUR +RHEIN AND MOSELLE EIGHTEEN NINETY THREE +AUSTRIAN BURGUNDY IS ONE OF THE FINEST WINES POSSESSING RICH FLAVOR AND FINE PERFUME OTHER BURGUNDIES ARE +SAUTERNE IS A WHITE BORDEAUX A STRONG LUSCIOUS WINE THE BEST KNOWN VARIETIES BEING +LACRIMA CHRISTI A STILL WINE OF EXCELLENT FLAVOR AND BOUQUET +VINTAGE YEARS HAVE MUCH TO DO WITH THE QUALITY OF WINES +WITH SOUP AND FISH SERVE WHITE WINES SUCH AS RHEIN WINE SAUTERNE OR WHITE BURGUNDY +WITH ENTREES SERVE CLARETS OR OTHER RED WINES SUCH AS SWISS BORDEAUX HUNGARIAN OR ITALIAN WINES +POUR MAYONNAISE OVER ALL CHILL AND SERVE +PUT THE PULP INTO A BASIN WITH TWO OUNCES OF MELTED BUTTER TWO TABLESPOONFULS OF LEMON JUICE HALF A POUND OF CHESTNUTS BOILED AND GRATED AND SEASONING OF SALT AND WHITE PEPPER TO TASTE +ASPARAGUS SALAD COOK THE ASPARAGUS IN SALTED WATER DRAIN AND CHILL +THIS DRESSING SHOULD STAND IN THE ICE BOX FOUR OR FIVE HOURS TO BECOME SEASONED +STIR THE SOAKED GELATIN IN WHILE THE CUCUMBER IS HOT +WHEN THICKENED STRAIN AND COOL +TOMATO BASKETS TOMATO BASKETS ARE CHARMING ACCESSORIES FOR HOLDING VEGETABLE SALAD CHICKEN SHRIMPS COLD BEANS ASPARAGUS TIPS SHREDDED CELERY CUCUMBERS CUT IN CUBES AND MINCED PEPPERS +GARNISH DISH THAT DRESSING IS MADE IN WITH A LITTLE GARLIC +BIRDS NEST SALAD HAVE READY AS MANY CRISP LEAVES OF LETTUCE AS MAY BE REQUIRED TO MAKE A DAINTY LITTLE NEST FOR EACH PERSON +CAULIFLOWER MAYONNAISE TAKE COLD BOILED CAULIFLOWER BREAK INTO BRANCHES ADDING SALT PEPPER AND VINEGAR TO SEASON +HANDLES OF WATERCRESS MAY BE ATTACHED TO THESE BASKETS +CELERY AND NUT SALAD CUT ENOUGH CELERY FINE TO MEASURE TWO CUPS ADD ONE CUP OF FINELY SHREDDED OR SHAVED CABBAGE AND ONE AND ONE HALF CUPS OF WALNUT MEATS BROKEN IN SMALL PIECES BUT NOT CHOPPED +SET INTO A COLD PLACE TO CHILL AND BECOME FIRM +SALAD TWO CUPS OF APPLES CUT INTO SMALL PIECES ONE CUP CELERY CUT INTO SMALL PIECES ONE CUP ENGLISH WALNUTS +SURROUND WITH A GARNISH OF COOKED AND DICED CARROTS TURNIPS GREEN PEAS +SERVE ON A LETTUCE LEAF WITH MAYONNAISE DRESSING MADE WITHOUT MUSTARD AND THINNED WITH CREAM +ADD TWO TABLESPOONS THICK SOUR CREAM TWO TABLESPOONS SUGAR A SPRINKLE OF MUSTARD AND HALF CUP OF VINEGAR +SERVE WITH FRENCH DRESSING HIDDEN UNDER THE LEAVES OF THE NEST +CABBAGE SALAD CHOP OR SHAVE FINE HALF A MEDIUM SIZE HEAD OF CABBAGE THAT HAS BEEN LEFT IN COLD WATER UNTIL CRISP THEN DRAIN +BEAT UNTIL THOROUGHLY MIXED POUR OVER THE CABBAGE AND TOSS LIGHTLY UNTIL UNIFORMLY SEASONED +STRAIN AND BOTTLE AND PUT IN ICE BOX SHAKE BEFORE USING EACH TIME +HOW ASKED TAD +CHAPTER FOUR THE FIRST NIGHT IN CAMP +WHO IS THE WRANGLER THIS MORNING ASKED THE FOREMAN GLANCING ABOUT AT HIS MEN +HI THERE HISSED LUMPY FILLED WITH INDIGNATION THAT ANYONE SHOULD ATTEMPT TO MOUNT A PONY FROM THE RIGHT SIDE +IN SPITE OF THEIR HARD COUCHES THE PONY RIDERS SLEPT SOUNDLY EVEN PROFESSOR ZEPPLIN HIMSELF NEVER WAKING THE WHOLE NIGHT THROUGH +STACY GRUMBLED TURNED OVER AND WENT TO SLEEP AGAIN +EVEN IF I CAN'T SING I CAN BEAT THAT +NONE OF YOU WILL BE FIT FOR DUTY TO MORROW +HUMPH GRUNTED CURLEY ADAMS +A WRANGLER'S A WRANGLER ANSWERED BIG FOOT STOLIDLY +OH NO THIS KIND OF A WRANGLER ISN'T LAUGHED THE FOREMAN +GRUB PI LE GRUB PI LE +NOT ON THE RANGE WHY NOT DEMANDED THE BOY +WALTER HAD GONE OUT WITH THE SECOND GUARD AND THE OTHERS HAD GATHERED AROUND THE CAMP FIRE FOR THEIR NIGHTLY STORY TELLING +WE HAD BETTER START THE DRIVE THIS MORNING +THE LADS FOUND THAT A PAIR OF BLANKETS HAD BEEN ASSIGNED TO EACH OF THEM WITH AN ORDINARY WAGON SHEET DOUBLED FOR A TARPAULIN +THE COWBOY DID THIS VERY THING BUT WITHIN AN HOUR HE FOUND HIMSELF ALONE THE OTHERS HAVING TURNED IN ONE BY ONE +STACY BROWN PROVED THE ONLY GRUMBLER IN THE LOT DECLARING THAT HE COULD NOT SLEEP A WINK ON SUCH A BED AS THAT +THE PONY DID MOST OF IT ADMITTED THE LAD I JUST GAVE HIM HIS HEAD AND THAT'S ALL THERE WAS TO IT +KEEP A GOING AND IF YOU'RE LUCKY YOU'LL RUN PLUMB INTO THEM WAS THE JEERING ANSWER AS THE SLEEPY COWMEN SPURRED THEIR PONIES ON TOWARD CAMP MUTTERING THEIR DISAPPROVAL OF TAKING ALONG A BUNCH OF BOYS ON A CATTLE DRIVE +ALMOST BEFORE THE ECHOES OF HIS VOICE HAD DIED AWAY A SHRILL VOICE PIPED UP FROM THE TAIL END OF THE CHUCK WAGON +A LOUD LAUGH FOLLOWED AT CHUNKY'S EXPENSE +LUMPY BATES CAME RUNNING TOWARD HIM NOT DARING TO CALL OUT FOR FEAR OF WAKING THE CAMP +YOU WON'T BE SO FAST TO WAKE UP HARD WORKING COWBOYS AFTER THAT I RECKON +THESE THEY SPREAD OUT ON THE GROUND USING BOOTS WRAPPED IN COATS FOR PILLOWS +PONG TELL THE YOUNG GENTLEMEN WHAT WOULD BECOME OF YOU IF YOU WERE TO SERVE BAD MEALS TO THIS OUTFIT OF COWPUNCHERS +THE HORSES OF THE OUTFIT SAVE THOSE THAT WERE ON NIGHT DUTY AND TWO OR THREE OTHERS THAT HAD DEVELOPED A HABIT OF STRAYING HAD BEEN TURNED LOOSE EARLY IN THE EVENING FOR ANIMALS ON THE TRAIL ARE SELDOM STAKED DOWN +WE'VE GOT A HARD DRIVE BEFORE US AND EVERY MAN MUST BE FIT AS A FIDDLE +STACY BROWN'S LEFT LEG SWUNG OVER THE SADDLE +WHERE ARE THEY ASKED THE BOY +HE'S A FELLOW WHO'S ALL THE TIME MAKING TROUBLE ISN'T HE ASKED STACY INNOCENTLY +HE'S A TROUBLE CURER NOT A TROUBLEMAKER EXCEPT FOR HIMSELF +THEN BIDDING THE BOYS RIDE UP NEAR THE SPOT TO WATCH HIM HE DREW OFF SOME TEN RODS AND WHEELING SPURRED HIS PONY TO A RUN +A TEMPORARY CAMP WAS QUICKLY PITCHED +THE LITTLE ANIMALS WERE BECOMING MORE SURE FOOTED EVERY DAY AND NED SAID THAT BEFORE THE TRIP WAS FINISHED JIMMIE WOULD BE ABLE TO WALK A SLACK ROPE +THEY SAW HIS LONG HAIR ALMOST BRUSH THE GRASS ONE OF HIS HANDS SWEPT DOWN AND UP AND ONCE MORE TAD BUTLER ROSE STANDING IN HIS STIRRUPS UTTERING A COWBOY YELL AS HE WAVED THE SOMBRERO ON HIGH +ONCE MORE STACY APPROACHED THE SOMBRERO HIS PONY RUNNING WELL AND AS HE DREW NEAR IT THEY SAW HIM RISE IN HIS SADDLE JUST AS TAD BUTLER HAD DONE A FEW MINUTES BEFORE +I RECKON THERE ARE SMILED THE GUIDE WE ARE IN THE BEAR COUNTRY NOW +WHAT'S THAT FOR DEMANDED NED WONDERINGLY +THIS ANNOUNCEMENT FILLED THE BOYS WITH EXCITEMENT +AND WE'VE GOT A SURPRISE FOR YOU ANNOUNCED STACY SWELLING WITH PRIDE +HAT TOO CLOSE TO ME I COULDN'T GET IT EXPLAINED CHUNKY THE BOYS ROARED +GRASPING THE POMMEL WITH THE LEFT HAND HE APPEARED TO DIVE HEAD FIRST TOWARD THE GROUND +THE BOYS HOWLED WITH DELIGHT THAT IS ALL DID SAVE STACY BROWN +COLD WATER IS THE MOST NOURISHING THING WE'VE TOUCHED SINCE LAST NIGHT +AN EARLY START WAS MADE SO THAT THE PARTY REACHED THE PROMISED TABLE LANDS SHORTLY BEFORE TEN O'CLOCK IN THE FORENOON +GALLOPING INTO CAMP THE BOY FETCHED HIS SOMBRERO WHICH HE CARRIED WELL OUT INTO THE FIELD AND TOSSED AWAY +HE BURIED HIS BISCUIT UNDER A LAYER OF JAM OVER WHICH HE SPREAD A THICK COATING OF HONEY +WE DID NOT IT MUST HAVE COME TO LIFE SOME TIME DURING THE NIGHT AND DUG ITS WAY OUT LAUGHED TAD +AS YET THEY HAD BEEN UNABLE TO ATTEMPT ANY FANCY RIDING WITH THEIR PONIES OWING TO THE RUGGED NATURE OF THE COUNTRY THROUGH WHICH THEY HAD BEEN JOURNEYING +JAM EXCLAIMED CHUNKY STRETCHING HIS NECK AND EYEING THE DISH LONGINGLY +WHY DON'T YOU MOVE THE PONY +SUPPER HAVING BEEN FINISHED THE PARTY GATHERED ABOUT THE CAMP FIRE FOR THEIR EVENING CHAT AFTER WHICH ADMONISHING STACY TO KEEP WITHIN HIS TENT AND NOT TO GO BORROWING TROUBLE THE BOYS TURNED IN FOR A SOUND SLEEP +IT WAS A BEAUTIFUL RACE THE LITTLE INDIAN PONIES SEEMING TO ENTER THOROUGHLY INTO THE SPIRIT OF THE CONTEST STRETCHING THEMSELVES OUT TO THEIR FULL LENGTHS AND WITH HEADS ON A LEVEL WITH THEIR BACKS FAIRLY FLEW ACROSS THE GREAT PLOT OF GREEN +HE NO DOUBT WOULD BRING FOOD OF SOME KIND WITH HIM +WITH A SHOUT THE BOYS DASHED PELL MELL TO MEET THE PACK TRAIN AND FALLING IN BEHIND THE SLOW MOVING BURROS URGED THEM ON WITH DERISIVE SHOUTS AND SUNDRY RESOUNDING SLAPS ON THE ANIMALS FLANKS +PRESIDENT BROWN I WITHDRAW MY CRITICISM I OFFER YOU MY HUMBLE APOLOGIES +YES THE COUNTRY IS FULL OF CAVES +ALL AGREED THAT TAD'S SUPERIOR HORSEMANSHIP ALONE HAD WON THE RACE FOR HIM +THE GREAT GREEN FIELD SURROUNDED ON ALL SIDES BY TALL TREES MADE THE PLACE AN IDEAL ONE FOR THEIR PURPOSE +I AM FREE TO ADMIT THAT I AM HUNGRY TOO +THE FIRST TIME HE RODE SWIFTLY BY IT LEANING OVER TO LOOK AT THE HAT AS HE PASSED HOLDING TO THE POMMEL FIRMLY WITH HIS LEFT HAND +BUT I KNOW AN OLD SETTLER WHO WILL LEND US HIS DOG IF IT IS NOT OUT +NOW FALL TO YOUNG GENTLEMEN DIRECTED THE PROFESSOR +AS A RESULT INSTEAD OF STOPPING WHEN HE REACHED THE HAT THE BOY KEPT ON GOING +AT THE MOMENT WHEN HE FREED HIS LEFT FOOT FROM THE STIRRUP HE THREW HIS BODY SHARPLY TO THE RIGHT REACHING FOR THE HAT WITHOUT TAKING THE PRECAUTION TO GRASP THE POMMEL +TAD IS AN EXPERIENCED RIDER +LIGE LEANING OVER THE BRINK WAS ABLE TO FOLLOW THE BOY'S MOVEMENTS BY THE AID OF THE THIN ARC OF LIGHT MADE BY THE TORCH IN TAD'S HAND +ARE YOU READY YES +LIGE QUICKLY MADE FAST THE LINE TO A TREE +SLOWLY BUT STEADILY THE SLENDER LINE WAS PAID OUT AMID A TENSE SILENCE ON THE PART OF THE LITTLE GROUP AT THE TOP OF THE CANYOU +LODGED IN THE BRANCHES OF A PINYON TREE I THINK IT IS BUT HE DOESN'T ANSWER ME +AFTER WHAT SEEMED TO THEM HOURS A SHARP CALL FROM THE DEPTHS REACHED THEIR EARS +I PROTEST SHOUTED THE PROFESSOR +LOOKS LIKE A CLUMP OF BUSHES DOWN THERE BUT I AIN'T SURE CAN YOU MAKE IT OUT +BE SURE TO FASTEN HIM SECURELY TO THE LOOP BEFORE YOU GIVE THE SIGNAL TO HAUL UP WARNED THE GUIDE +YOU'LL ALL BE OVER IF YOU DON'T HAVE A CARE +I COULD NOT THINK OF ALLOWING ANY OF MY CHARGES TO TAKE SO TERRIBLE A RISK AND +AND THAT TUMBLE'S ENOUGH TO KNOCK THE SENSE OUT OF A FULL GROWN MAN +I AM THE ONE TO GO AFTER WALT IF ANYONE HAS TO I'LL GO DOWN MISTER THOMAS +MEBBY YOU THINK HE'S HAVING SOME SORT OF A PICNIC DOWN THERE EH GLARED LIGE +THE MOVEMENT SENT HIS BODY SWAYING GIDDILY FROM SIDE TO SIDE +SHALL WE HAUL UP ASKED LIGE MAKING A MEGAPHONE OF HIS HANDS YES HAUL AWAY +YES AGREED TAD THAT DOES LOOK LIKE BUSHES +MASTER TAD IS RIGHT DECIDED THE GUIDE GAZING AT THE TWO BOYS APPROVINGLY +BUT FROM THE CAUTIOUS MOVEMENTS OF THE LIGHT FAR BELOW THEM THE GUIDE UNDERSTOOD THAT THE LAD WAS AT WORK CARRYING OUT HIS PART OF THE TASK OF RESCUE TO THE BEST OF HIS ABILITY +HE TILTED HIS HEAD TO LOOK UP +DON'T MOVE AROUND LIE PERFECTLY STILL WARNED THE GUIDE ARE YOU HURT +CAUTIOUSLY PLACING A HAND AGAINST THE ROCKS TO STEADY HIMSELF TAD WISELY CONCLUDED THAT HEREAFTER IT WOULD NOT PAY TO BE TOO CURIOUS +SURE THING ANSWERED THE BOY +HE'S SO FAR TO THE RIGHT OF ME THAT I CAN'T REACH HIM +YOU'D HAVE BOTH OF US AT THE BOTTOM IF I LEFT IT TO YOU TO TAKE CARE OF THIS END +NOR WAS HIS SENSE OF SECURITY INCREASED WHEN IN SHIFTING HIS POSITION THE TORCH FELL FROM HIS GRASP THE FAGOTS SCATTERING AS THEY SLIPPED DOWN BETWEEN THE LIMBS OF THE TREE AND WHIRLING IN EVER DIMINISHING CIRCLES UNTIL FINALLY HE HEARD THEM CLATTER ON THE ROCKS BELOW +I SEE HIM CALLED TAD HIS VOICE SOUNDING HOLLOW AND UNNATURAL TO THOSE ABOVE +NO I AM THE LIGHTER OF THE TWO URGED TAD +TO MAKE DRY TOAST +MAIZE NEXT TO WHEAT AND RICE MAIZE IS THE GRAIN MOST USED IN THE NOURISHMENT OF MAN +LOOK AT IT FROM TIME TO TIME WHEN IT HAS BEEN LAID FOR NEARLY AN HOUR AND WHEN THE YEAST HAS RISEN AND BROKEN THROUGH THE FLOUR SO THAT BUBBLES APPEAR IN IT YOU WILL KNOW THAT IT IS READY TO BE MADE UP INTO DOUGH +SOYER RECOMMENDS THAT EACH SLICE SHOULD BE CUT INTO PIECES AS SOON AS IT IS BUTTERED AND WHEN ALL ARE READY THAT THEY SHOULD BE PILED LIGHTLY ON THE DISH THEY ARE INTENDED TO BE SERVED ON +ITALIAN RUSKS +MODE PUT THE FLOUR INTO A BASIN MIX THE SUGAR WELL WITH IT MAKE A HOLE IN THE CENTRE AND STIR IN THE YEAST AND MILK WHICH SHOULD BE LUKEWARM WITH ENOUGH OF THE FLOUR TO MAKE IT THE THICKNESS OF CREAM +MODE PUT THE MILK AND BUTTER INTO A SAUCEPAN AND KEEP SHAKING IT ROUND UNTIL THE LATTER IS MELTED +THESE BUNS MAY BE VARIED BY ADDING A FEW CURRANTS CANDIED PEEL OR CARAWAY SEEDS TO THE OTHER INGREDIENTS AND THE ABOVE MIXTURE ANSWERS FOR HOT CROSS BUNS BY PUTTING IN A LITTLE GROUND ALLSPICE AND BY PRESSING A TIN MOULD IN THE FORM OF A CROSS IN THE CENTRE OF THE BUN +A LOAF OF HOUSEHOLD BREAD ABOUT TWO DAYS OLD ANSWERS FOR MAKING TOAST BETTER THAN COTTAGE BREAD THE LATTER NOT BEING A GOOD SHAPE AND TOO CRUSTY FOR THE PURPOSE +WHEN WE TAKE INTO ACCOUNT THAT THE ARABIANS ARE FOND OF LIZARDS AND LOCUSTS AS ARTICLES OF FOOD THEIR CUISINE ALTOGETHER IS SCARCELY A TEMPTING ONE +ITALIAN MILLET OR GREAT INDIAN MILLET IS CULTIVATED IN EGYPT AND NUBIA WHERE IT IS CALLED DHOURRA AND IS USED AS HUMAN FOOD AS WELL AS FOR THE FERMENTATION OF BEER +MODE PUT THE FLOUR INTO A LARGE EARTHENWARE BOWL OR DEEP PAN THEN WITH A STRONG METAL OR WOODEN SPOON HOLLOW OUT THE MIDDLE BUT DO NOT CLEAR IT ENTIRELY AWAY FROM THE BOTTOM OF THE PAN AS IN THAT CASE THE SPONGE OR LEAVEN AS IT WAS FORMERLY TERMED WOULD STICK TO IT WHICH IT OUGHT NOT TO DO +WHEN THEY ARE QUITE HOT DIVIDE THEM LENGTHWISE INTO THREE PUT SOME THIN FLAKES OF GOOD BUTTER BETWEEN THE SLICES PRESS THE ROLLS TOGETHER AND PUT THEM IN THE OVEN FOR A MINUTE OR TWO BUT NOT LONGER OR THE BUTTER WOULD OIL TAKE THEM OUT OF THE OVEN SPREAD THE BUTTER EQUALLY OVER DIVIDE THE ROLLS IN HALF AND PUT THEM ON TO A VERY HOT CLEAN DISH AND SEND THEM INSTANTLY TO TABLE +ILLUSTRATION MAIZE PLANT +SEVENTEEN TWENTY FOUR +MODE WHISK THE EGG STIR IN THE SUGAR AND BEAT THESE INGREDIENTS WELL TOGETHER BEAT THE BUTTER TO A CREAM STIR IN THE GROUND RICE CURRANTS AND CANDIED PEEL AND AS MUCH FLOUR AS WILL MAKE IT OF SUCH A CONSISTENCY THAT IT MAY BE ROLLED INTO SEVEN OR EIGHT BALLS +ILLUSTRATION RUSKS +SEVENTEEN THIRTY FOUR +CUT AS MANY NICE EVEN SLICES AS MAY BE REQUIRED RATHER MORE THAN ONE QUARTER INCH IN THICKNESS AND TOAST THEM BEFORE A VERY BRIGHT FIRE WITHOUT ALLOWING THE BREAD TO BLACKEN WHICH SPOILS THE APPEARANCE AND FLAVOUR OF ALL TOAST +THEN PLACE THE PAN ON A STRONG CHAIR OR DRESSER OR TABLE OF CONVENIENT HEIGHT POUR INTO THE SPONGE THE REMAINDER OF THE WARM MILK AND WATER STIR INTO IT AS MUCH OF THE FLOUR AS YOU CAN WITH THE SPOON THEN WIPE IT OUT CLEAN WITH YOUR FINGERS AND LAY IT ASIDE +TURN IT THEN ON TO A PASTE BOARD OR VERY CLEAN DRESSER AND WITH A LARGE SHARP KNIFE DIVIDE IT IN TWO MAKE IT UP QUICKLY INTO LOAVES AND DISPATCH IT TO THE OVEN MAKE ONE OR TWO INCISIONS ACROSS THE TOPS OF THE LOAVES AS THEY WILL RISE MORE EASILY IF THIS BE DONE +HOT ROLLS +SEVENTEEN SEVENTEEN +TO MAKE HOT BUTTERED TOAST SEVENTEEN TWENTY SIX +KIRKLEATHAM YEAST +ILLUSTRATION ITALIAN MILLET +MODE LET THE TARTARIC ACID AND SALT BE REDUCED TO THE FINEST POSSIBLE POWDER THEN MIX THEM WELL WITH THE FLOUR +SUFFICIENT TO MAKE TWELVE BUNS SEASONABLE AT ANY TIME LIGHT BUNS +MOVE IT BACKWARDS AND FORWARDS UNTIL THE BREAD IS NICELY COLOURED THEN TURN IT AND TOAST THE OTHER SIDE AND DO NOT PLACE IT SO NEAR THE FIRE THAT IT BLACKENS +THEY SHOULD BE KEPT IN A CLOSED TIN CANISTER IN A DRY PLACE TO PRESERVE THEIR CRISPNESS +NEVER USE NEW BREAD FOR MAKING ANY KIND OF TOAST AS IT EATS HEAVY AND BESIDES IS VERY EXTRAVAGANT +EXCELLENT ROLLS +SOME OF THE PREPARATIONS OF MAIZE FLOUR ARE VERY GOOD AND WHEN PARTAKEN IN MODERATION SUITABLE FOOD FOR ALMOST EVERYBODY +TO MAKE GOOD HOME MADE BREAD +IT IS NOT CULTIVATED IN ENGLAND BEING PRINCIPALLY CONFINED TO THE EAST +NEXT TAKE EITHER A LARGE TABLESPOONFUL OF BREWER'S YEAST WHICH HAS BEEN RENDERED SOLID BY MIXING IT WITH PLENTY OF COLD WATER AND LETTING IT AFTERWARDS STAND TO SETTLE FOR A DAY AND NIGHT OR NEARLY AN OUNCE OF GERMAN YEAST PUT IT INTO A LARGE BASIN AND PROCEED TO MIX IT SO THAT IT SHALL BE AS SMOOTH AS CREAM WITH THREE QUARTERS PINT OF WARM MILK AND WATER OR WITH WATER ONLY THOUGH EVEN A VERY LITTLE MILK WILL MUCH IMPROVE THE BREAD +FROM FIFTEEN TO TWENTY MINUTES WILL BE REQUIRED TO BAKE THEM NICELY +WHEN COLD THEY SHOULD BE PUT INTO TIN CANISTERS TO KEEP THEM DRY AND IF INTENDED FOR THE CHEESE COURSE THE SIFTED SUGAR SHOULD BE OMITTED +IT HAS BEEN INTRODUCED INTO ITALY WHERE THEY MAKE A COARSE BREAD FROM IT AND IT IS ALSO EMPLOYED IN PASTRY AND PUDDINGS THEY ALSO USE IT FOR FEEDING HORSES AND DOMESTIC FOWLS +VICTORIA BUNS SEVENTEEN THIRTY TWO +SUFFICIENT ALLOW TWO CRUMPETS TO EACH PERSON +MUFFINS AND CRUMPETS SHOULD ALWAYS BE SERVED ON SEPARATE DISHES AND BOTH TOASTED AND SERVED AS EXPEDITIOUSLY AS POSSIBLE +ILLUSTRATION BUNS +PLAIN BUNS SEVENTEEN TWENTY NINE +MODE BOIL THE RICE IN WATER UNTIL IT IS QUITE TENDER POUR OFF THE WATER AND PUT THE RICE BEFORE IT IS COLD TO THE FLOUR +SEVENTEEN EIGHTEEN +IT WILL GROW ON POOR SOILS AND IS EXTREMELY PRODUCTIVE +SOUR MILK OR BUTTERMILK MAY BE USED BUT THEN A LITTLE LESS ACID WILL BE NEEDED +ANOTHER ADVANTAGE THE RED WHEATS POSSESS IS THEIR COMPARATIVE IMMUNITY FROM THE ATTACKS OF MILDEW AND FLY +HE SAYS THAT BY CUTTING THROUGH FOUR OR FIVE SLICES AT A TIME ALL THE BUTTER IS SQUEEZED OUT OF THE UPPER ONES WHILE THE BOTTOM ONE IS SWIMMING IN FAT LIQUID +IF CARRIED ANY DISTANCE IT SHOULD BE STORED AWAY IN AIR TIGHT VESSELS +A YELLOW VARIETY CALLED GOLDEN MILLET IS SOLD IN THE GROCERS SHOPS FOR MAKING PUDDINGS AND IS VERY DELICATE AND WHOLESOME +WHEN SHE HEARD OF MY ENGAGEMENT WITH MARY ANN SHE WROTE AND SUGGESTED THAT WE SHOULD SPEND OUR HONEYMOON IN HER COTTAGE OR PIGSTYE AND THAT I SHOULD PAY HER RENT FOR IT +THE FACT OF HAVING GIVEN MARY ANN A WEDDING PRESENT SEEMS TO FILL THEM WITH A FEELING OF RANCOROUS ACIDITY WHICH TO ME IS INEXPLICABLE +AND OF COURSE I HAD MY EXPECTATIONS AND SHE HAD HERS +FROM A COUSIN OF OURS WHO'S IN THAT LINE +THAT WAS WHAT MISSUS MACPHERSON SAID TO ME ONLY THE OTHER DAY +THE ACCIDENT IN QUESTION OCCURRED UPON THE SUNDAY EVENING +I FOUND THAT AS A WOMAN OF BUSINESS SHE WAS BEYOND ALL MY EXPECTATIONS +THE GIRL IS FRETTING BUT YOU DON'T SEEM TO NOTICE IT +SUCH IS THE SELFISHNESS OF HUMAN NATURE +I CANNOT PRETEND TO EXPLAIN WHY EXCEPT ON THE SUPPOSITION THAT ROMANCE IS DEAD AT LEAST IN THAT CIRCLE OF SOCIETY IN WHICH THE SNELLINGS MOVE +IT IS MOST DELIGHTFUL +HER FATHER IS A MOST REMARKABLE PERSON TO SAY THE LEAST +AND I WILL SEE THAT THERE IS NO SHIRKING ABOUT THE BOYS OR ABOUT THE GIRLS EITHER +I DO NOT KNOW WHEN IT IS GOING TO BE BUT IT WILL BE EITHER NEXT WEEK OR THE WEEK AFTER CERTAINLY AT THE EARLIEST POSSIBLE MOMENT AND I SHOULDN'T BE AT ALL SURPRISED TO LEARN THAT ALL MARY ANN'S THINGS HAD BEEN ALREADY BOUGHT AND PERHAPS SOME OF THEM MARKED +A SECOND COUSIN OF MARY ANN'S IS IN THE COOK'S TOURS LINE +I SHALL MAKE PAPA GIVE ME FIVE HUNDRED POUNDS AT LEAST +IT TURNED OUT THAT SHE HAD A LITTLE MONEY OF HER OWN ABOUT A HUNDRED AND THIRTY POUNDS A YEAR +SOMEONE SNIGGERED +HERS HAS BEEN PRODIGIOUS +BUT IT IS QUITE PLAIN TO ME THAT ALL THE ARRANGEMENTS FOR MY WEDDING ARE GOING TO BE MADE BY THE SNELLINGS +P S THE CARDS ARE OUT FOR THE WEDDING +I HAVE DRAWN UP A LIST OF ALL THE PEOPLE WHO OUGHT TO GIVE US A PRESENT AND I SHALL TELL THEM WHAT THEY OUGHT TO GIVE IT WON'T BE MY FAULT IF I DON'T GET IT +SHE HAS A KNACK OF GETTING PEOPLE TO DO WHAT SHE WISHES AND TO GIVE HER WHAT SHE WANTS WHICH IS A LITTLE SHORT OF MIRACULOUS +IT WAS PLAIN THAT TOGETHER WE SHOULD MANAGE MOST COMFORTABLY DELIGHTFULLY IN FACT +WE HAVE ALL BEEN GIVING MARY ANN PRESENTS AND I SUPPOSE YOU MISTER WHITING HAVE BEEN GIVING HER SOMETHING TOO +OF COURSE THERE ARE SOME PEOPLE WITH WHOM YOU CAN'T BE PERFECTLY PLAIN BUT I SHALL BE AS PLAIN AS I CAN THERE'S A WAY AND A MANNER OF DOING THAT KIND OF THING +HE HAS GIVEN US FREE PASSES ALL THE WAY TO THE END OF OUR JOURNEY AND ALL THE WAY BACK AGAIN AND COUPONS FOR FREE BOARD AND LODGING AT THE HOTEL IT'S A WEDDING PRESENT +AS IT IS UNLESS I AM MISTAKEN SOME OF THE RENDING WILL BE ON OUR SIDE AND THEY KNOW IT +FOR INSTANCE LOOK AT THEIR BEHAVIOUR IN THE MATTER OF THE RING +I GASPED POSITIVELY GASPED +I NEVER SAW PEOPLE LIKE THE SNELLINGS FOR POSSESSING RELATIVES IN ALL SORTS OF LINES +IT IS FROM HER ACTION IN THAT MATTER THAT MY SUSPICION SPRINGS +IT MIGHT JUST AS WELL BE SOME ONE ELSE'S WEDDING SO UNIMPORTANT IS THE PART WHICH I AM SET TO PLAY IN IT +I KNOW WHAT MAMMA CAN AFFORD TO GIVE AND I WILL SEE SHE GIVES IT +WE ARE GOING FOR OUR HONEYMOON TO ITALY AND THE SOUTH OF FRANCE +BUT WHY ON THAT ACCOUNT THEY SHOULD PITY ME I ALTOGETHER FAIL TO UNDERSTAND +I NOTICE THAT THEY ARE GENERALLY PERSONS WHO HAVE ALREADY TENDERED THEIR OFFERINGS +THERE WERE NO SIGNS OF FALTERING ABOUT HER FLOW OF LANGUAGE +A BIRD IN THE HAND IS WORTH TWO IN A BUSH' AND IT WILL BE SOMETHING TO HAVE BY US +THAT'S IT ON YOUR ACCOUNT +AND WHAT INQUIRED MISSUS MACPHERSON HAS MARY ANN GIVEN YOU HER LOVE +THERE SHE OWNS A COTTAGE OR IT MAY BE A PIGSTYE FOR ALL I KNOW +BESIDES WHICH WE CAN ALWAYS SELL THE COUPONS AND RAILWAY PASSES WHICH WE DON'T USE +I WAS PERSUADED THAT SOMEBODY BESIDES THAT COUSIN GOT A PROFIT OUT OF MARY ANN'S ENGAGEMENT RING BUT I HANDED OVER THE AMOUNT +WHEN AT LAST I REACHED CROFTON MY JOURNEY'S END IT TURNED OUT THAT THE STATION STAFF CONSISTED OF A HALF WITTED INDIVIDUAL WHO WAS STATIONMASTER PORTER AND CLERK COMBINED AND A HULKING LAD WHO DID WHATEVER ELSE THERE WAS TO DO +HERE WE BE THAT MIGHT BE SO +NO ANSWER THOUGH I ALLOWED A MORE THAN DECENT INTERVAL +THERE APPEARED TO BE NO KNOCKER THOUGH WHETHER IT HAD BEEN TWISTED OFF WAS MORE THAN I COULD SAY +WE'VE LOST THE KEY OF THE CELLAR AND THERE'S NOTHING OUT EXCEPT WATER AND I DON'T THINK YOU'D CARE FOR THAT +IN IT I WAS DEPOSITED WITH MY LUGGAGE +I EVEN BOUGHT SOMETHING FOR MADGE I MEAN MISSUS WILSON +A VOICE INQUIRED WHO'S THERE +THE REPLY WAS WRITTEN IN A SPRAWLING FEMININE HAND IT WAS A LITTLE VAGUE +BETTER RING AGAIN SUGGESTED THE DRIVER HARD +THE WHOLE THING WAS A TRIFLE ODD +I DID NOT ASK I WAS BEYOND IT +I HAD NO ILLUSIONS +WHO LIVES HERE ARE THE PEOPLE MAD +I IMAGINE THERE WERE SEVERAL KINDS OF OLD FASHIONED CHRISTMASES BUT IT COULD HARDLY BE WORSE THAN A CHOP IN MY CHAMBERS OR HORROR OF HORRORS AT THE CLUB OR MY COUSIN LUCY'S NOTION OF WHAT SHE CALLS THE FESTIVE SEASON +NOW IT IS A REMARKABLE THING THAT I HAVE ALWAYS HAD AN EXTRAORDINARY PREDILECTION FOR THE NAME MADGE I DO NOT KNOW WHY +IT IS SOME SATISFACTION FOR ME TO BE ABLE TO REFLECT THAT I MADE IT WARM FOR THE OFFICIALS HOWEVER COLD I MIGHT HAVE BEEN MYSELF +HE WAS IMPERVIOUS TO REASON +I WAS CHILLED TO THE BONE WET TIRED HUNGRY +I FELT QUITE LIVELY MYSELF AS I MINGLED WITH THE CHRISTMAS CROWD LOOKING FOR THINGS WHICH MIGHT NOT TURN OUT TO BE ABSOLUTELY PREPOSTEROUS +WHEN THE TRAP DID APPEAR IT LOOKED TO ME UNCOMMONLY LIKE AN OPEN SPRING CART +THERE WAS A TRAP AT THE BOY AND BLUNDERBUSS BUT THAT REQUIRED FETCHING +NO ONE HAD COME TO MEET ME THE VILLAGE WAS ABOUT HALF A MILE AND HANGAR DENE THE HOUSE FOR WHICH MY STEPS WERE BENT ABOUT FOUR MILES BY THE ROAD HOW FAR IT WAS ACROSS PLOUGHED FIELDS MY INFORMANT DID NOT MENTION +THERE WAS NOTHING SAID ABOUT THE SORT OF ACCOMMODATION WHICH WOULD BE PROVIDED NOTHING ABOUT THE KIND OF ESTABLISHMENT WHICH WAS MAINTAINED OR THE TABLE WHICH WAS KEPT +MAYBE THEY'RE UP TO SOME OF THEIR GAMES AND WANTS ROUSING +THERE WAS A RUSH OF RETREATING FEET AN EXPOSTULATING VOICE THEN DARKNESS AGAIN AND SILENCE +THE BELL REVERBERATED THROUGH WHAT SEEMED LIKE AN EMPTY HOUSE +ALL NIGHT IT HAD BEEN BLOWING AND RAINING +FESTIVE YES +IT WAS A HORRIBLE JOURNEY +AFTER A VAST AMOUNT OF UNFASTENING THE DOOR WAS OPENED AND ON THE THRESHOLD THERE STOOD A GIRL WITH A LIGHTED CANDLE IN HER HAND +I DID NOT EXPECT A PRINCELY ENTERTAINMENT +PRESENTLY FEET WERE HEARD ADVANCING ALONG THE PASSAGE SEVERAL PAIRS IT SEEMED AND A LIGHT GLEAMED THROUGH THE WINDOW OVER THE DOOR +I DID NOT KNOW WHAT HE MEANT +IT APPEARED THAT THE TERMS WOULD BE FIVE GUINEAS BUT THERE WAS NO MENTION OF THE LENGTH OF TIME WHICH THAT FEE WOULD COVER +THE INFORMATION WAS GREETED WITH WHAT SOUNDED UNCOMMONLY LIKE A CHORUS OF LAUGHTER +UNDER SUCH CIRCUMSTANCES SHE WAS HARDLY LIKELY TO BE LIVELY HERSELF BUT HER NAME WAS MADGE AND IT WAS THE ACCIDENT OF HER CHRISTIAN NAME WHICH DECIDED ME TO GO +I TOLLED THE BELL AGAIN +I HAVE NEVER KNOWN A MADGE AND YET FROM MY BOYHOOD UPWARD I HAVE DESIRED TO MEET ONE +I HAD LONG BEEN WISHING THAT AN OLD FASHIONED CHRISTMAS HAD BEEN COMPLETELY EXTINCT BEFORE I HAD THOUGHT OF ADVENTURING IN QUEST OF ONE +THERE BE THE DOOR IN FRONT OF YOU YOU GO UP THREE STEPS IF YOU CAN FIND EM +I'M MISTER CHRISTOPHER FROM LONDON +THERE'S A KNOCKER IF NONE OF EM HAVEN'T TWISTED IT OFF +EARLY IN THE MORNING THE STEPMOTHER CAME AND PULLED THEM OUT OF BED AND GAVE THEM EACH A SLICE OF BREAD WHICH WAS STILL SMALLER THAN THE FORMER PIECE +BUT SHE LEFT HIM NO PEACE TILL HE CONSENTED SAYING AH BUT I SHALL MISS THE POOR CHILDREN +AND SHE GOT UP AND PUT HER HEAD INTO THE OVEN +THEN SHE TOOK UP HANSEL WITH HER ROUGH HAND AND SHUT HIM UP IN A LITTLE CAGE WITH A LATTICE DOOR AND ALTHOUGH HE SCREAMED LOUDLY IT WAS OF NO USE +HANSEL THOUGHT THE ROOF TASTED VERY NICE AND SO HE TORE OFF A GREAT PIECE WHILE GRETHEL BROKE A LARGE ROUND PANE OUT OF THE WINDOW AND SAT DOWN QUITE CONTENTEDLY +WE ARE GOING INTO THE FOREST TO HEW WOOD AND IN THE EVENING WHEN WE ARE READY WE WILL COME AND FETCH YOU AGAIN +CREEP IN SAID THE WITCH AND SEE IF IT IS HOT ENOUGH AND THEN WE WILL PUT IN THE BREAD BUT SHE INTENDED WHEN GRETHEL GOT IN TO SHUT UP THE OVEN AND LET HER BAKE SO THAT SHE MIGHT EAT HER AS WELL AS HANSEL +AH FATHER SAID HANSEL I AM LOOKING AT MY WHITE CAT SITTING UPON THE ROOF OF THE HOUSE AND TRYING TO SAY GOOD BYE +DEAR GOOD GOD HELP US NOW SHE PRAYED +OH YOU SIMPLETON SAID SHE THEN WE MUST ALL FOUR DIE OF HUNGER YOU HAD BETTER PLANE THE COFFINS FOR US +THEN THEY BEGAN TO RUN AND RUSHING INTO THE HOUSE THEY FELL UPON THEIR FATHER'S NECK +GRETHEL SHE CRIED IN A PASSION GET SOME WATER QUICKLY BE HANSEL FAT OR LEAN THIS MORNING I WILL KILL AND COOK HIM +HE HAD LITTLE ENOUGH TO BREAK OR BITE AND ONCE WHEN THERE WAS A GREAT FAMINE IN THE LAND HE COULD HARDLY PROCURE EVEN HIS DAILY BREAD AND AS HE LAY THINKING IN HIS BED ONE NIGHT HE SIGHED AND SAID TO HIS WIFE WHAT WILL BECOME OF US +HOW CAN WE FEED OUR CHILDREN WHEN WE HAVE NO MORE THAN WE CAN EAT OURSELVES +COME IN AND STOP WITH ME AND NO HARM SHALL COME TO YOU AND SO SAYING SHE TOOK THEM BOTH BY THE HAND AND LED THEM INTO HER COTTAGE +SEE I COULD EVEN GET IN MYSELF +AND NOW AS THERE WAS NOTHING TO FEAR THEY WENT BACK TO THE WITCH'S HOUSE WHERE IN EVERY CORNER WERE CASKETS FULL OF PEARLS AND PRECIOUS STONES +BUT HER HUSBAND FELT HEAVY AT HEART AND THOUGHT IT WERE BETTER TO SHARE THE LAST CRUST WITH THE CHILDREN +BUT IN REALITY HANSEL WAS NOT LOOKING AT A CAT BUT EVERY TIME HE STOPPED HE DROPPED A PEBBLE OUT OF HIS POCKET UPON THE PATH +THE OLD WOMAN BEHAVED VERY KINDLY TO THEM BUT IN REALITY SHE WAS A WICKED OLD WITCH WHO WAY LAID CHILDREN AND BUILT THE BREADHOUSE IN ORDER TO ENTICE THEM IN BUT AS SOON AS THEY WERE IN HER POWER SHE KILLED THEM COOKED AND ATE THEM AND MADE A GREAT FESTIVAL OF THE DAY +GRETHEL BEGAN TO CRY BUT IT WAS ALL USELESS FOR THE OLD WITCH MADE HER DO AS SHE WANTED +THAT NIGHT THE ENEMY SLIPPED AWAY LEAVING HUNDREDS AND HUNDREDS OF HIS DEAD AND WOUNDED ON THE FIELD +THERE WERE NO BREASTWORKS YET THAT ONE LITTLE BRIGADE OF HAMILTON'S DIVISION STOOD THERE IN THE OPEN AND REPULSED ASSAULT AFTER ASSAULT +IT REQUIRED MONTHS AND GREAT EVENTS TO MAKE GRANT THE HERO OF THE ARMY WHICH HE AFTERWARD BECAME +FOR SOME REASON THE DEAD AT HATCHIE BRIDGE WERE NOT BURIED +I COULD NOT HELP MY FRIEND +ONCE IN THE NIGHT I SLIPPED AWAY FROM THE BIVOUAC AND HURRIED TO THE OLD TISHIMINGO HOTEL TO SEE A LIEUTENANT OF MY COMPANY WHO HAD BEEN SHOT THROUGH THE BREAST +OUR BRIGADE WAS FEARFULLY OUTNUMBERED +I HASTENED BACK TO THE LINES +FIFTEEN OFFICERS OF OUR LITTLE HALF REGIMENT WERE DEAD OR WOUNDED +THAT NIGHT I STOOD GUARD UNDER AN OAK TREE ON THE BATTLEFIELD AMONG THE UNBURIED DEAD +WHEN MORNING CAME THE FIRING OPENED AND FOR ALL THAT DAY THE BATTLE RAGED FIERCELY AT THE LEFT AND CENTER LEFT WE GETTING THE WORST OF IT TOO +A PERFECT BLAZE OF CLOSE RANGE MUSKETRY TOO MOWED THEM DOWN LIKE GRASS +GO BACK TO THE REGIMENT HE SAID SMILING ALL WILL BE NEEDED +GRANT WAS ONLY A FEW MILES AWAY BUT ALTHOUGH COMMANDER IN CHIEF HE KNEW NOTHING OF THE HARDEST FOUGHT BATTLE OF THE CIVIL WAR UNTIL IT WAS OVER +ROSECRANS PROTESTED IT WAS IN VAIN +THE CLOUD OF REBELS WE HAD SEEN DIVIDED ITSELF INTO THREE COLUMNS +NO BATTERY IN THE WHOLE FOUR YEARS WAR LOST SO MANY MEN IN SO SHORT A TIME +IT WAS NOT A QUESTION WHO WAS DEAD OR WOUNDED BUT WHO WAS NOT +A WEEK AFTER THE BATTLE MY BROTHER RODE BY THERE ON A CAVALRY EXPEDITION AND MADE THE HORRIBLE DISCOVERY THAT HOGS WERE EATING UP THE BODIES OF OUR DEAD HEROES THAT TOO WAS WAR +NOT BALAKLAVA NOR THE ALMA SAW SUCH FIGHTING IT WAS A DUEL TO THE DEATH +HE SURVIVED THE WAR ONLY TO BE MURDERED LATER ON A PLANTATION IN MISSISSIPPI +MY OWN REGIMENT WAS IN THE ADVANCE +MY FRIEND WITH MANY OTHERS WAS BEING CARRIED OUT TO DIE ELSEWHERE +ONE DARING REBEL WAS SHOT DOWN AND BAYONETED CLEAR BEHIND THE LINE OF COMPANY B WHERE HE HAD BROKEN THROUGH TO SEIZE THE FLAG OF MY REGIMENT +INDEED WE OF THE RANK AND FILE HAD LITTLE CONFIDENCE IN GRANT IN THOSE DAYS +UNDER THE SAME QUIET MOONLIGHT AND ONLY SIX HUNDRED YARDS AWAY FROM US ALSO LAY THE VICTORIOUS REBEL ARMY +WITH A FEW LANTERNS OUR MEN THEN WENT ABOUT AND TRIED TO GATHER UP THE WOUNDED THE DEAD WERE LEFT TILL MORNING +THEY LAY IN HEAPS OF DOZENS EVEN CLOSE UP TO THE WORKS +I REMAINED AWAKE ALL NIGHT TALKING WITH A COMRADE WHO SHARED MY BLANKET WITH ME POOR JIMMY KING +THAT EVENING AN ORDER CAME FOR US HAMILTON'S DIVISION TO ASSAULT THE ENEMY'S LEFT FLANK AT MIDNIGHT +HE IS OLD AS WELL AS POOR SHE SAID +ALL MY WORRIES ABOUT YOU WERE FOOLISH +THE CRIES AND CURSES OF THE ROBBERS FILLED THE AIR +PERHAPS YOU CAN OUTWIT HER YET CRIED ANOTHER +HOWEVER IN SPITE OF ALL SHE COULD SAY THE ELDER SISTERS OPENED THE DOOR AND ADMITTED THE BEGGAR +THE TWO ELDEST ATE THEIR APPLES BUT THE YOUNGEST COULD NOT EAT THAT NIGHT SHE THREW THE APPLE AWAY +EVERY YEAR AT A CERTAIN DAY OF A CERTAIN MONTH HE WENT AWAY TO A DISTANT CITY TO COLLECT MONEY ON AN ACCOUNT +YOU SHALL NOT COME INTO MY FATHER'S HOUSE +IT IS A FEARFUL NIGHT TO SEND AWAY A BEGGAR SAID THE ELDEST SISTER WHILE THEY WERE EATING +LONG AGO THERE LIVED A MERCHANT WHO HAD THREE DAUGHTERS +THE MERCHANT'S DAUGHTER AT FIRST DID NOT ANSWER BUT AS HE KEPT ON CALLING TO HER SHE FINALLY ASKED HIM WHAT IT WAS THAT HE WANTED +IF WE DECIDE TO SHOW MERCY TO THIS POOR BEGGAR IT IS NOT FOR YOU TO OPPOSE IT +IT'S SURELY A TERRIBLE STORM OUTSIDE SAID THE MERCHANT'S ELDEST DAUGHTER AS THE WIND RATTLED THE TILES OF THE ROOF AND THE RAIN BEAT IN TORRENTS AGAINST THE DOORS AND WINDOWS +WHILE THEY WERE TALKING THE BEGGAR HAD TAKEN THE APPLES WHICH THE GIRLS WERE TO EAT FOR DESSERT AND HAD SPRINKLED A SLEEPING POWDER OVER THEM +BUI WE SHOULD NOT FORGET OUR PROMISE TO OUR FATHER CRIED THE YOUNGEST DAUGHTER +THEY TRIED IN VAIN TO BREAK DOWN THE GREAT DOORS +I PROMISE YOU I WILL DO YOU NO HARM +IT WAS THE YOUNGEST ONE WHO DECEIVED ME CRIED THE ROBBER CHIEFTAIN +HAVE PITY UPON A POOR UNFORTUNATE ONE HE CALLED OUT +THEN SHE HEARD HIM GO DOWN THE STAIRWAY AND UNBOLT THE HEAVY DOORS WHICH LED INTO THE STORE +WHEN IT WAS EVENING HE LED HIS BAND INTO A NEARBY STREET AND IN HIS DISGUISE APPROACHED THE MERCHANT'S HOUSE HE KNOCKED AT THE DOOR +PASS THE CHARM OUT TO ME THEN SAID THE ROBBER +WHEN SHE RETURNED HIS HAND WAS STICKING THROUGH THE HOLE IN THE DOOR +SHE DID NOT STIR AND HE KNEW THAT THE SLEEPING POWDER HAD THOROUGHLY DONE ITS WORK +LET ME ENTER I PRAY YOU TO PASS THE NIGHT UNDER YOUR ROOF +HOW DO YOU KNOW ASKED THEIR FATHER I AM OLDER AND WISER THAN YOU ARE AND I KNOW THAT THERE ARE MANY EVILS WHICH MIGHT COME UPON YOU +WHEN AN ARISTOCRACY CARRIES ON THE PUBLIC AFFAIRS ITS NATIONAL PRIDE NATURALLY ASSUMES THIS RESERVED INDIFFERENT AND HAUGHTY FORM WHICH IS IMITATED BY ALL THE OTHER CLASSES OF THE NATION +THEY THEREFORE ENTERTAIN A CALM SENSE OF THEIR SUPERIORITY THEY DO NOT DREAM OF VAUNTING PRIVILEGES WHICH EVERYONE PERCEIVES AND NO ONE CONTESTS AND THESE THINGS ARE NOT SUFFICIENTLY NEW TO THEM TO BE MADE TOPICS OF CONVERSATION +THEN THERE ARE IN ALL CLASSES A VERY LARGE NUMBER OF MEN CONSTANTLY OCCUPIED WITH THE SERIOUS AFFAIRS OF THE GOVERNMENT AND THOSE WHOSE THOUGHTS ARE NOT ENGAGED IN THE DIRECTION OF THE COMMONWEALTH ARE WHOLLY ENGROSSED BY THE ACQUISITION OF A PRIVATE FORTUNE +I DO NOT BELIEVE IN SUCH REPUBLICS ANY MORE THAN IN THAT OF PLATO OR IF THE THINGS WE READ OF REALLY HAPPENED I DO NOT HESITATE TO AFFIRM THAT THESE SUPPOSED DEMOCRACIES WERE COMPOSED OF VERY DIFFERENT ELEMENTS FROM OURS AND THAT THEY HAD NOTHING IN COMMON WITH THE LATTER EXCEPT THEIR NAME +IF I APPLAUD THE FREEDOM WHICH ITS INHABITANTS ENJOY HE ANSWERS FREEDOM IS A FINE THING BUT FEW NATIONS ARE WORTHY TO ENJOY IT +IF I SAY TO AN AMERICAN THAT THE COUNTRY HE LIVES IN IS A FINE ONE AY HE REPLIES THERE IS NOT ITS FELLOW IN THE WORLD +IN ARISTOCRACIES EVERY MAN HAS ONE SOLE OBJECT WHICH HE UNCEASINGLY PURSUES BUT AMONGST DEMOCRATIC NATIONS THE EXISTENCE OF MAN IS MORE COMPLEX THE SAME MIND WILL ALMOST ALWAYS EMBRACE SEVERAL OBJECTS AT THE SAME TIME AND THESE OBJECTS ARE FREQUENTLY WHOLLY FOREIGN TO EACH OTHER AS IT CANNOT KNOW THEM ALL WELL THE MIND IS READILY SATISFIED WITH IMPERFECT NOTIONS OF EACH +IN ARISTOCRATIC COMMUNITIES THE PEOPLE READILY GIVE THEMSELVES UP TO BURSTS OF TUMULTUOUS AND BOISTEROUS GAYETY WHICH SHAKE OFF AT ONCE THE RECOLLECTION OF THEIR PRIVATIONS THE NATIVES OF DEMOCRACIES ARE NOT FOND OF BEING THUS VIOLENTLY BROKEN IN UPON AND THEY NEVER LOSE SIGHT OF THEIR OWN SELVES WITHOUT REGRET +THESE PERSONS THEN DISPLAYED TOWARDS EACH OTHER PRECISELY THE SAME PUERILE JEALOUSIES WHICH ANIMATE THE MEN OF DEMOCRACIES THE SAME EAGERNESS TO SNATCH THE SMALLEST ADVANTAGES WHICH THEIR EQUALS CONTESTED AND THE SAME DESIRE TO PARADE OSTENTATIOUSLY THOSE OF WHICH THEY WERE IN POSSESSION +THEY STAND UNMOVED IN THEIR SOLITARY GREATNESS WELL ASSURED THAT THEY ARE SEEN OF ALL THE WORLD WITHOUT ANY EFFORT TO SHOW THEMSELVES OFF AND THAT NO ONE WILL ATTEMPT TO DRIVE THEM FROM THAT POSITION +THE AMERICANS IN THEIR INTERCOURSE WITH STRANGERS APPEAR IMPATIENT OF THE SMALLEST CENSURE AND INSATIABLE OF PRAISE +IN ARISTOCRATIC COUNTRIES THE GREAT POSSESS IMMENSE PRIVILEGES UPON WHICH THEIR PRIDE RESTS WITHOUT SEEKING TO RELY UPON THE LESSER ADVANTAGES WHICH ACCRUE TO THEM +AN AMERICAN INSTEAD OF GOING IN A LEISURE HOUR TO DANCE MERRILY AT SOME PLACE OF PUBLIC RESORT AS THE FELLOWS OF HIS CALLING CONTINUE TO DO THROUGHOUT THE GREATER PART OF EUROPE SHUTS HIMSELF UP AT HOME TO DRINK +CHAPTER SIXTEEN WHY THE NATIONAL VANITY OF THE AMERICANS IS MORE RESTLESS AND CAPTIOUS THAN THAT OF THE ENGLISH +I BELIEVE THE SERIOUSNESS OF THE AMERICANS ARISES PARTLY FROM THEIR PRIDE +THIS IS MORE ESPECIALLY THE CASE AMONGST THOSE FREE NATIONS WHICH FORM DEMOCRATIC COMMUNITIES +I TOLD TOM WE SHOULDN'T COME SO LATE SAYS HILDA +RIGHT AWAY WHEN I BRING HOME MY NEW PROGRAM HE SAYS HOW COME YOU'RE TAKING ONE LESS COURSE THIS HALF +IT'S YOUR FAULT MOP IT UP YOURSELF +YOU'RE GETTING ALTOGETHER TOO UPSET ABOUT THESE PROGRAMS STOP IT AND BEHAVE YOURSELF +TOM SAYS THANKS AND LOOKS AT HILDA AND SHE BLUSHES REALLY +BESIDES SAYS TOM HALF THE REASON YOU AND YOUR FATHER ARE ALWAYS BICKERING IS THAT YOU'RE SO MUCH ALIKE ME LIKE HIM SURE +POP IT'S A COURSE +SOMEHOW OR OTHER CAT HAS TAUGHT THEM THAT HE'S IN CHARGE HERE AND HE JUST CHASES THEM FOR FUN NOW AND AGAIN WHEN HE'S NOT BUSY SLEEPING +I'LL BE LUCKY IF I HAVE TIME TO BREATHE +POP GOES RIGHT ON TUNING HIS CHANNEL +TOM DRINKS A LITTLE MORE COFFEE AND THEN HE GOES ON THE TROUBLE IS I CAN'T GET MARRIED ON THIS FLOWER SHOP JOB +SOMETIMES SCHOOLS DO LET KIDS TAKE A LOT OF SOFT COURSES AND THEN THEY'RE OUT ON A LIMB LATER HUH +HE DOES AND FOR ONCE I WIN A ROUND I KEEP MUSIC FOR THIS SEMESTER +I EXPLAIN THAT I'M TAKING MUSIC AND ALSO BIOLOGY ALGEBRA ENGLISH AND FRENCH MUSIC HE SNORTS +WHEN ARE YOU GETTING RID OF THESE CATS I'M NOT FIXING TO START AN ANNEX TO KATE'S CAT HOME +IT'S THE FIRST TIME HILDA HAS BEEN TO OUR HOUSE AND TOM INTRODUCES HER AROUND +I HEAR THE T V GOING FOR A FEW MINUTES THEN POP TURNS IT OFF AND GOES IN THE KITCHEN TO TALK TO MOM +I LOOK AT MY WATCH IT'S A QUARTER TO ELEVEN +I GET THE PILLOWS COMFORTABLY ARRANGED ON THE FLOOR WITH A BIG BOTTLE OF SODA AND A BAG OF POPCORN WITHIN EASY REACH +AS LONG AS THERE'S A BONE ON THE FLOOR THE TWO OF YOU WORRY IT +I TURN OFF THE TELEVISION SET I'VE LOST TRACK OF WHAT'S HAPPENING AND IT DOESN'T SEEM TO BE THE GRANDFATHER WHO'S THE SPOOK AFTER ALL +WELL I DON'T THINK YOU SHOULD TURN A GUY'S T V PROGRAM OFF IN THE MIDDLE WITHOUT EVEN FINDING OUT ABOUT IT +HERE'S TO YOU A LONG HAPPY LIFE +I'LL HAVE TO CHECK SOME MORE SAYS TOM +YOU KNOW I'D GET DRAFTED IN A YEAR OR TWO ANYWAY +THE TWO STRAY KITTENS GRADUALLY MAKE THEMSELVES AT HOME +SHE DOESN'T PICK THEM UP BUT JUST HAVING THEM IN THE ROOM SURE DOESN'T GIVE HER ASTHMA +SO HE CARES HUH +I'VE DECIDED TO ENLIST IN THE ARMY +THE WIND WAS SO STRONG THAT I HAD TO HOLD MY HAT ON AND THE GIRLS SKIRTS WERE BLOWN OUT BEFORE THEM +HE WAS BORN LIKE THAT THE OTHERS ARE SMART +SHE LOOKED AT ME HER EYES FAIRLY BLAZING WITH THINGS SHE COULD NOT SAY +AT THAT MOMENT THE FATHER CAME OUT OF THE HOLE IN THE BANK +MY GRANDMOTHER ALWAYS SPOKE IN A VERY LOUD TONE TO FOREIGNERS AS IF THEY WERE DEAF +PRESENTLY AGAINST ONE OF THOSE BANKS I SAW A SORT OF SHED THATCHED WITH THE SAME WINE COLORED GRASS THAT GREW EVERYWHERE +I NOTICED HOW WHITE AND WELL SHAPED HIS OWN HANDS WERE +I REMEMBERED WHAT THE CONDUCTOR HAD SAID ABOUT HER EYES +SHE WAS QUICK AND VERY EAGER +AFTER ANTONIA HAD SAID THE NEW WORDS OVER AND OVER SHE WANTED TO GIVE ME A LITTLE CHASED SILVER RING SHE WORE ON HER MIDDLE FINGER +VERY GLAD VERY GLAD SHE EJACULATED +WE STOOD PANTING ON THE EDGE OF THE RAVINE LOOKING DOWN AT THE TREES AND BUSHES THAT GREW BELOW US +AMBROSCH HE MAKE GOOD FARMER +SHE POINTED INTO THE GOLD COTTONWOOD TREE BEHIND WHOSE TOP WE STOOD AND SAID AGAIN WHAT NAME +WE WERE SO DEEP IN THE GRASS THAT WE COULD SEE NOTHING BUT THE BLUE SKY OVER US AND THE GOLD TREE IN FRONT OF US +IT WAS SO LONG THAT IT BUSHED OUT BEHIND HIS EARS AND MADE HIM LOOK LIKE THE OLD PORTRAITS I REMEMBERED IN VIRGINIA +SHE MADE MISSUS SHIMERDA UNDERSTAND THE FRIENDLY INTENTION OF OUR VISIT AND THE BOHEMIAN WOMAN HANDLED THE LOAVES OF BREAD AND EVEN SMELLED THEM AND EXAMINED THE PIES WITH LIVELY CURIOSITY EXCLAIMING MUCH GOOD MUCH THANK +EVEN FROM A DISTANCE ONE COULD SEE THAT THERE WAS SOMETHING STRANGE ABOUT THIS BOY +SHE GOT UP ON HER KNEES AND WRUNG HER HANDS +YOU'LL GET FIXED UP COMFORTABLE AFTER WHILE MISSUS SHIMERDA MAKE GOOD HOUSE +WHEN I CAME UP HE TOUCHED MY SHOULDER AND LOOKED SEARCHINGLY DOWN INTO MY FACE FOR SEVERAL SECONDS +ANTONIA POINTED UP TO THE SKY AND QUESTIONED ME WITH HER GLANCE +OCCASIONALLY ONE OF THE HORSES WOULD TEAR OFF WITH HIS TEETH A PLANT FULL OF BLOSSOMS AND WALK ALONG MUNCHING IT THE FLOWERS NODDING IN TIME TO HIS BITES AS HE ATE DOWN TOWARD THEM +NOW WHY IS THAT OTTO +THE FAMILY HAD BEEN LIVING ON CORNCAKES AND SORGHUM MOLASSES FOR THREE DAYS +HE STRUCK AMBROSCH ON THE BACK AND THE BOY SMILED KNOWINGLY +I BECAME SOMEWHAT EMBARRASSED FOR I WAS USED TO BEING TAKEN FOR GRANTED BY MY ELDERS +FUCHS BROUGHT UP A SACK OF POTATOES AND A PIECE OF CURED PORK FROM THE CELLAR AND GRANDMOTHER PACKED SOME LOAVES OF SATURDAY'S BREAD A JAR OF BUTTER AND SEVERAL PUMPKIN PIES IN THE STRAW OF THE WAGON BOX +IT'S NO BETTER THAN A BADGER HOLE NO PROPER DUGOUT AT ALL +WEEK FOLLOWED WEEK THESE TWO BEINGS LED A HAPPY LIFE IN THAT HOVEL +HE PASSED HOURS IN WATCHING HER DRESSING AND UNDRESSING HER DOLL AND IN LISTENING TO HER PRATTLE +ONLY AS HE WAS FIVE AND FIFTY AND COSETTE EIGHT YEARS OF AGE ALL THAT MIGHT HAVE BEEN LOVE IN THE WHOLE COURSE OF HIS LIFE FLOWED TOGETHER INTO A SORT OF INEFFABLE LIGHT +MOREOVER JEAN VALJEAN HAD CHOSEN HIS REFUGE WELL +HE HAD RETURNED TO PRISON THIS TIME FOR HAVING DONE RIGHT HE HAD QUAFFED FRESH BITTERNESS DISGUST AND LASSITUDE WERE OVERPOWERING HIM EVEN THE MEMORY OF THE BISHOP PROBABLY SUFFERED A TEMPORARY ECLIPSE THOUGH SURE TO REAPPEAR LATER ON LUMINOUS AND TRIUMPHANT BUT AFTER ALL THAT SACRED MEMORY WAS GROWING DIM +COSETTE WAS NO LONGER IN RAGS SHE WAS IN MOURNING +WHEN THESE TWO SOULS PERCEIVED EACH OTHER THEY RECOGNIZED EACH OTHER AS NECESSARY TO EACH OTHER AND EMBRACED EACH OTHER CLOSELY +THE MAN NO LONGER PRODUCED ON HER THE EFFECT OF BEING OLD OR POOR SHE THOUGHT JEAN VALJEAN HANDSOME JUST AS SHE THOUGHT THE HOVEL PRETTY +HE HAD NEVER BEEN FATHER LOVER HUSBAND FRIEND +WHO KNOWS WHETHER JEAN VALJEAN HAD NOT BEEN ON THE EVE OF GROWING DISCOURAGED AND OF FALLING ONCE MORE +ALAS HE WALKED WITH NO LESS INDECISION THAN COSETTE +THE BEST OF US ARE NOT EXEMPT FROM EGOTISTICAL THOUGHTS +SHE FELT THAT WHICH SHE HAD NEVER FELT BEFORE A SENSATION OF EXPANSION +HIS SISTER AND HIS SISTER'S CHILDREN HAD LEFT HIM ONLY A VAGUE AND FAR OFF MEMORY WHICH HAD FINALLY ALMOST COMPLETELY VANISHED HE HAD MADE EVERY EFFORT TO FIND THEM AND NOT HAVING BEEN ABLE TO FIND THEM HE HAD FORGOTTEN THEM +THE HEART OF THAT EX CONVICT WAS FULL OF VIRGINITY +NATURE A DIFFERENCE OF FIFTY YEARS HAD SET A PROFOUND GULF BETWEEN JEAN VALJEAN AND COSETTE DESTINY FILLED IN THIS GULF +COSETTE ON HER SIDE HAD ALSO UNKNOWN TO HERSELF BECOME ANOTHER BEING POOR LITTLE THING +TO MEET WAS TO FIND EACH OTHER +HE HAD PAID HER SIX MONTHS IN ADVANCE AND HAD COMMISSIONED THE OLD WOMAN TO FURNISH THE CHAMBER AND DRESSING ROOM AS WE HAVE SEEN +HE WAS THAT CHILD'S STAY AND SHE WAS HIS PROP +AND THEN HE TALKED OF HER MOTHER AND HE MADE HER PRAY +HE SUFFERED ALL THE PANGS OF A MOTHER AND HE KNEW NOT WHAT IT MEANT FOR THAT GREAT AND SINGULAR MOVEMENT OF A HEART WHICH BEGINS TO LOVE IS A VERY OBSCURE AND A VERY SWEET THING +HE PROTECTED HER AND SHE STRENGTHENED HIM +WHAT ALTERNATIVE WAS THERE FOR HER +AND ALREADY THIS ASTOUNDING BLOW BEGINS TO TAKE ITS PLACE AMONG OTHER EVENTS AS A THING STRANGE AND TERRIBLE INDEED BUT RELATED TO ALL THE STRANGENESS AND MYSTERY OF LIFE PART OF THE UNIVERSAL MYSTERIES OF DESPAIR AND FUTILITY AND DEATH THAT HAVE TROUBLED MY CONSCIOUSNESS SINCE CHILDHOOD +I BECAME GROTESQUELY ANXIOUS TO ASSURE HIM THAT INDEED SHE AND I HAD BEEN AS THEY SAY INNOCENT THROUGHOUT OUR LAST DAY TOGETHER +SHE WAS DESTROYED NOT MERELY BY THE UNCONSIDERED UNDISCIPLINED PASSIONS OF HER HUSBAND AND HER LOVER BUT BY THE VAST TRADITION THAT SUSTAINS AND ENFORCES THE SUBJUGATION OF HER SEX +IT WAS THAT IDEA OF WASTE THAT DOMINATED MY MIND IN A STRANGE INTERVIEW I HAD WITH JUSTIN +IT SEEMS TO ME MORE AND MORE AS I LIVE LONGER THAT MOST POETRY AND MOST LITERATURE AND PARTICULARLY THE LITERATURE OF THE PAST IS DISCORDANT WITH THE VASTNESS AND VARIETY THE RESERVES AND RESOURCES AND RECUPERATIONS OF LIFE AS WE LIVE IT TO DAY +WE RANGE WIDER LAST LONGER AND ESCAPE MORE AND MORE FROM INTENSITY TOWARDS UNDERSTANDING +FOR A TIME THE DEATH OF MARY OBSCURED HER LIFE FOR ME BUT NOW HER LIVING PRESENCE IS MORE IN MY MIND AGAIN +IF WE HAD BEEN BROTHER AND SISTER INDEED THERE WAS NOTHING +YOU WERE WRONG IN ALL THAT I SAID SHE KEPT HER FAITH WITH YOU +HOW WE MUST SIMPLIFY +WE NEVER PLANNED TO MEET AND WHEN WE MET +AND IT IS UPON THIS EFFECT OF SWEET AND BEAUTIFUL POSSIBILITIES CAUGHT IN THE NET OF ANIMAL JEALOUSIES AND THOUGHTLESS MOTIVES AND ANCIENT RIGID INSTITUTIONS THAT I WOULD END THIS WRITING +BUT NOW IT DOESN'T SEEM TO MATTER VERY MUCH +IT IS THE EXPRESSION OF LIFE UNDER CRUDER AND MORE RIGID CONDITIONS THAN OURS LIVED BY PEOPLE WHO LOVED AND HATED MORE NAIVELY AGED SOONER AND DIED YOUNGER THAN WE DO +IN MARY IT SEEMS TO ME I FOUND BOTH WOMANHOOD AND FELLOWSHIP I FOUND WHAT MANY HAVE DREAMT OF LOVE AND FRIENDSHIP FREELY GIVEN AND I COULD DO NOTHING BUT CLUTCH AT HER TO MAKE HER MY POSSESSION +YOU SEE THE TREATMENT IS A TRIFLE FANCIFUL +BUT IF I PLAY YOU A ROUNDEL LADY GET ME A GIFT FROM THE EMPEROR'S DAUGHTER HER FINGER RING FOR MY FINGER BRING THOUGH SHE'S PLEDGED A THOUSAND LEAGUES OVER THE WATER LADY LADY MY FAIR LADY O MY ROSE WHITE LADY +THE EMPEROR'S DAUGHTER +THE LADIES +LADY LADY MY ROSE WHITE LADY BUT WILL YOU NOT HEAR A ROUNDEL LADY +I'LL PLAY FOR YOU NOW NEATH THE APPLE BOUGH AND YOU SHALL DREAM ON THE LAWN SO SHADY LADY LADY MY FAIR LADY O MY APPLE GOLD LADY +ONCE MORE THE SINGER PLAYS AND THE LADIES DANCE BUT ONE BY ONE THEY FALL ASLEEP TO THE DROWSY MUSIC AND THEN THE SINGER STEPS INTO THE RING AND UNLOCKS THE TOWER AND KISSES THE EMPEROR'S DAUGHTER +BED TIME CHILDREN +THE LADIES IN YELLOW DRESSES STAND AGAIN IN A RING ABOUT THE EMPEROR'S DAUGHTER AND ARE FOR THE LAST TIME ACCOSTED BY THE SINGER WITH HIS LUTE +THE WANDERING SINGER +SHE WOULD NOT SPEAK THOUGH WE DANCED A WEEK WITH HER THOUGHTS A THOUSAND LEAGUES OVER THE WATER SINGER SINGER WANDERING SINGER O MY HONEY SWEET SINGER +I DON'T KNOW WHAT BECOMES OF THE LADIES +BUT THIS IS A FALLACY +BUT I DID ONCE HAVE THE LUCK TO HEAR AND SEE THE LADY PLAYED IN ENTIRETY THE CHILDREN HAD BEEN GRANTED LEAVE TO PLAY JUST ONE MORE GAME BEFORE BED TIME AND OF COURSE THEY CHOSE THE LONGEST AND PLAYED IT WITHOUT MISSING A SYLLABLE +FORGOTTEN TOO THE NAME OF GILLIAN THE LOVELY CAPTIVE +THE WANDERING SINGER APPROACHES THEM WITH HIS LUTE +O IF YOU PLAY US A ROUNDEL SINGER HOW CAN THAT HARM THE EMPEROR'S DAUGHTER +NOW YOU MAY PLAY A SERENA SINGER A DREAM OF NIGHT FOR AN APPLE GOLD LADY FOR THE FRUIT IS NOW ON THE APPLE BOUGH AND THE MOON IS UP AND THE LAWN IS SHADY SINGER SINGER WANDERING SINGER O MY HONEY SWEET SINGER +THE WANDERING SINGER +WORSE AND WORSE HE IS EVEN PRESUMED TO BE THE CAPTIVE'S SWEETHEART WHO WHEEDLES THE FLOWER THE RING AND THE PRISON KEY OUT OF THE STRICT VIRGINS FOR HIS OWN PURPOSES AND FLIES WITH HER AT LAST IN HIS SHALLOP ACROSS THE SEA TO LIVE WITH HER HAPPILY EVER AFTER +IT WAS LOCKED FROM THE INSIDE AND WE HAD TO BURN IT DOWN WITH A TORCH THAT'S WHERE THEY ARE +YES CHARCOAL +THE DAILY NEWSCASTS FROM TERRA SHOWED A CORRESPONDING SHIFT IN INTEREST AT HOME +WELL OF COURSE THEY'RE DEAD WHAT A QUESTION +BRING IT TO THE PUBLIC ATTENTION DRAMATIZE IT +TONY LATTIMER THE DISCOVERER WAS BEGINNING TO CASH IN ON HIS ATTENTIONS TO GLORIA AND HIS INGRATIATION WITH SID HE WAS ALWAYS EITHER MAKING VOICE AND IMAGE TALKS FOR TELECAST OR LISTENING TO THE NEWS FROM THE HOME PLANET +THAT TOOK THE CENTER OF INTEREST AWAY FROM ARCHAEOLOGY AND STARTED A NEW BURST OF ACTIVITY +NOW IT WAS BURNED AWAY AT BOTH SIDES AND LAY STILL HOT ALONG THE EDGES ON THE FLOOR OF THE BIG OFFICE ROOM IN FRONT +THE TERRAN PUBLIC WANTED TO HEAR ABOUT MARTIANS AND IF LIVE MARTIANS COULDN'T BE FOUND A ROOM FULL OF DEAD ONES WAS THE NEXT BEST THING +A FLOODLIGHT WAS ON IN THE ROOM INSIDE AND LATTIMER WAS GOING AROUND LOOKING AT THINGS WHILE A SPACE FORCE OFFICER STOOD BY THE DOOR +THEY HAD FOUR OR FIVE SPECIES OF WHAT MIGHT LOOSELY BE CALLED BIRDS AND SOMETHING THAT COULD EASILY BE CLASSED AS A REPTILE AND A CARNIVOROUS MAMMAL THE SIZE OF A CAT WITH BIRDLIKE CLAWS AND A HERBIVORE ALMOST IDENTICAL WITH THE PIGLIKE THING IN THE BIG DARFHULVA MURAL AND ANOTHER LIKE A GAZELLE WITH A SINGLE HORN IN THE MIDDLE OF ITS FOREHEAD +THE ORGANIZATION OF A SOCIETY OF MARTIAN ARCHAEOLOGY WITH ANTHONY LATTIMER PH D THE LOGICAL CANDIDATE FOR THE CHAIR +BILL CHANDLER THE ZOOLOGIST HAD BEEN GOING DEEPER AND DEEPER INTO THE OLD SEA BOTTOM OF SYRTIS +MARTHA REMEMBERED THE CLOSED DOOR ON THE FIRST SURVEY THEY HADN'T ATTEMPTED OPENING IT +THE CIVILIAN SPECIALISTS IN OTHER FIELDS AND THE SPACE FORCE PEOPLE WHO HAD BEEN HOLDING TAPE LINES AND MAKING SKETCHES AND SNAPPING CAMERAS WERE ALL FLYING TO LOWER SYRTIS TO FIND OUT HOW MUCH OXYGEN THERE WAS AND WHAT KIND OF LIFE IT SUPPORTED +WITHOUT QUESTION HE HAD BECOME OVERNIGHT THE MOST WIDELY KNOWN ARCHAEOLOGIST IN HISTORY +SO THEY JUST CAME IN HERE AND LIT THE CHARCOAL AND SAT DRINKING TOGETHER TILL THEY ALL FELL ASLEEP +NOT THAT I'M INTERESTED IN ALL THIS FOR MYSELF HE DISCLAIMED AFTER LISTENING TO THE TELECAST FROM TERRA TWO DAYS AFTER HIS DISCOVERY +TONY'S FOUND THE MARTIANS +SO I BELIEVE I SHALL GO BACK AT LEAST FOR A WHILE AND SEE WHAT I CAN DO +LECTURES +MASS SUICIDE THAT'S WHAT IT WAS NOTICE WHAT'S IN THE CORNERS +GLORIA STANDISH WHO HAD DROPPED IN FOR LUNCH WAS ON THE MEZZANINE FAIRLY SCREAMING INTO A RADIOPHONE EXTENSION DOZEN AND A HALF OF THEM +THEY ALSO FOUND A MARTIAN CALENDAR THE YEAR HAD BEEN DIVIDED INTO TEN MORE OR LESS EQUAL MONTHS AND ONE OF THEM HAD BEEN DOMA +HE SMILED GUILTILY AS HE ADDED BUT I MUST ADMIT I WAS MORE THAN A LITTLE CONCERNED MYSELF +AND THE ONLY TRUCK WE HAD AVAILABLE WAS IN THAT BURNING SHED THE SUPERINTENDENT ADDED BITTERLY +THE TWO GIRLS WERE AS MUCH UPSET AS TOM'S MOTHER TOM LAUGHED +THE TELEPHONE LINE WAS SOON REPAIRED AND A STEADY STREAM OF RESCUE VEHICLES BEGAN ARRIVING FROM HARKNESS FIRE TRUCKS THREE AMBULANCES AND PRIVATE CARS DRIVEN BY VOLUNTEERS +I'LL BE GLAD TO TRY SIR HE REPLIED +MISTER SWIFT'S EYES TWINKLED +THE YOUNG INVENTOR HAD JUST NOTICED HIS FRIEND LYING PINNED BENEATH A HEAVY BEAM NEARBY +HE'S A GREAT SCIENTIST +BUD THREW UP HIS ARMS TO PROTECT HIMSELF BUT TOO LATE +THEY PICKED THEIR WAY THROUGH THE WRECKAGE AND EMERGED ON A SCENE OF FRIGHTFUL DESTRUCTION +HIS FRIEND'S EYELIDS FLICKERED +MALE OR FEMALE HUMAN OR ANIMAL +THE SKY WAS VISIBLE THROUGH SEVERAL GAPING HOLES IN THE ROOF WHICH WAS SAGGING DANGEROUSLY ON ITS SUPPORTING TRUSSES +THEN TOM WHO HAD BEEN STUNNED BY SOME FALLING DEBRIS RAISED HIMSELF TO A SITTING POSITION +LET'S SEE ABOUT GETTING HELP FOR MISTER FABER +ANOTHER ENGINEER RUSHED TOWARD THE DOOR TO SEE WHAT WAS HAPPENING OUTSIDE +ELECTRONIC EQUIPMENT CASCADED FROM THE WALL SHELVES AND A HEAVY DUTY CHAIN HOIST CAME LOOSE FROM ITS OVERHEAD TRACK PLUNGING TO THE FLOOR WITH A TERRIFYING CRASH +AN INSTANT LATER IT CRASHED OVER PINNING MARK FABER BENEATH IT +THIS ISN'T PART OF YOUR TESTING ROUTINE IS IT +TOM NODDED UNHAPPILY +FOR MINUTES NO ONE STIRRED AMONG THE WRECKAGE +ANYHOW WE WANT TO HELP GOT A JOB FOR US +WE'D BETTER NOT TRY TO MOVE HIM TOM DECIDED WE'LL GET AN AMBULANCE +WITHIN MINUTES TOM WAS IN CHARGE OF CLEARING AWAY RUBBLE AND EXTRICATING ANYONE WHO MIGHT BE TRAPPED INSIDE THE BUILDINGS +INSIDE A SECRET ROCKET TELEMETERING DEVICE WAS MOUNTED ON ITS TEST STAND +MISTER SWIFT CAME INTO THE LIVING ROOM JUST THEN AND TOLD TOM HOW WORRIED MISSUS SWIFT AND SANDY HAD BEEN +THEY CLUSTER AROUND ME THEIR HANDS ARE TALONED THEIR EYES ARE RED LIKE FLAME BURNING IN DARKNESS +SINCE HIS BIRTH HE HAS BEEN GUARDED SO CLOSELY THAT THE CLEVEREST POISONERS OF THE EAST COULD NOT REACH HIM +BY WHICH A SOUL IS DRAWN FROM ITS BODY AND ACROSS GULFS OF ECHOING SPACE RETURNED THE MAN ON THE MAT +BUT AT THE URGENT ENTREATY OF THE PRINCESS OF KHOSALA WHO LOVED BHUNDA CHAND VAINLY HE GAVE HER A LOCK OF HIS LONG BLACK HAIR AS A TOKEN OF REMEMBRANCE +THE MAN SHRUGGED HIS BROAD SHOULDERS AND TURNED BACK INTO THE ARABESQUE CHAMBER +A LOW CONFUSED MOAN WANED FROM HIS MOUTH +I TELL YOU IT IS NOT POISON SHE CRIED +THE SLANT OF THE MOON PRESAGED EVIL FOR THE KING OF VENDHYA THE STARS ARE IN TURMOIL THE SERPENT IN THE HOUSE OF THE ELEPHANT +THERE THEY STROVE TO BREAK THE SILVER CORD OF LIFE AND THRUST MY SOUL INTO THE BODY OF A FOUL NIGHT WEIRD THEIR SORCERY SUMMONED UP FROM HELL AH +THERE WAS THE OLD IMPERIOUS NOTE IN HIS FAILING WHISPER +ON THE DAIS UNDER THE GOLDEN DOME THE KING CRIED OUT AGAIN RACKED BY AWFUL PAROXYSMS +THEY SEEK TO SNAP THE SILVER CORD THAT BINDS ME TO MY DYING BODY +AS YOU WELL KNOW THERE ARE TEN MEN AND TEN WOMEN WHOSE SOLE DUTY IS TO TASTE HIS FOOD AND WINE AND FIFTY ARMED WARRIORS GUARD HIS CHAMBER AS THEY GUARD IT NOW +POINT OF CONTACT INQUIRED THE OTHER +I KNOW NOW WHAT BRINGS ME TO THE PYRE +THEIR FINGERS SEAR ME LIKE FIRE +NOT UNTIL THE HEAVENS WERE IN THE PROPER ORDER COULD THEY PERFORM THIS NECROMANCY +HE WAS YOUNG NO SPEAR HAD TOUCHED HIM NO POISON LURKED IN HIS WINE +SEND MY SOUL CLEAN TO ASURA +ALL DISCARDED PORTIONS OF THE HUMAN BODY STILL REMAIN PART OF IT ATTACHED TO IT BY INTANGIBLE CONNECTIONS +WITH A LONG STAINED FINGERNAIL HE MAPPED THE CONSTELLATIONS ON THE MARBLE TILED FLOOR +THIS MAN WAS CLAD IN A BROWN CAMEL HAIR ROBE AND SANDALS AND A GREEN TURBAN WAS ON HIS HEAD +YOU HAVE NEVER DISOBEYED ME OBEY MY LAST COMMAND +YOUR CRY AND THE GRIP OF YOUR FINGERS BROUGHT ME BACK BUT I AM GOING FAST +SUMMER SQUASHES ALMOST IN THEIR GOLDEN BLOSSOM CUCUMBERS NOW EVINCING A TENDENCY TO SPREAD AWAY FROM THE MAIN STOCK AND RAMBLE FAR AND WIDE TWO OR THREE ROWS OF STRING BEANS AND AS MANY MORE THAT WERE ABOUT TO FESTOON THEMSELVES ON POLES TOMATOES OCCUPYING A SITE SO SHELTERED AND SUNNY THAT THE PLANTS WERE ALREADY GIGANTIC AND PROMISED AN EARLY AND ABUNDANT HARVEST +WHAT AN INSTRUMENT IS THE HUMAN VOICE +PHOEBE WONDERED WHOSE CARE AND TOIL IT COULD HAVE BEEN THAT HAD PLANTED THESE VEGETABLES AND KEPT THE SOIL SO CLEAN AND ORDERLY +FEWER WORDS THAN BEFORE BUT WITH THE SAME MYSTERIOUS MUSIC IN THEM +AND YET IF YOU COULD ONLY SEE THE BENIGN SMILE OF THE ORIGINAL +THERE IS A WONDERFUL INSIGHT IN HEAVEN'S BROAD AND SIMPLE SUNSHINE +OH REJOINED THE DAGUERREOTYPIST BECAUSE LIKE AN OLD LADY'S CUP OF TEA IT IS WATER BEWITCHED +THE ENCLOSURE HAD FORMERLY BEEN VERY EXTENSIVE BUT WAS NOW CONTRACTED WITHIN SMALL COMPASS AND HEMMED ABOUT PARTLY BY HIGH WOODEN FENCES AND PARTLY BY THE OUTBUILDINGS OF HOUSES THAT STOOD ON ANOTHER STREET +IT NOW CONTAINED ONLY CHANTICLEER HIS TWO WIVES AND A SOLITARY CHICKEN +SINCE YOU ARE A FRIEND OF MY COUSIN HEPZIBAH'S YOU SHOULD ASK HER TO SHOW YOU THE PICTURE +HE EXHIBITED A DAGUERREOTYPE MINIATURE IN A MOROCCO CASE +THIS WAS A FOUNTAIN SET ROUND WITH A RIM OF OLD MOSSY STONES AND PAVED IN ITS BED WITH WHAT APPEARED TO BE A SORT OF MOSAIC WORK OF VARIOUSLY COLORED PEBBLES +WHILE WE GIVE IT CREDIT ONLY FOR DEPICTING THE MEREST SURFACE IT ACTUALLY BRINGS OUT THE SECRET CHARACTER WITH A TRUTH THAT NO PAINTER WOULD EVER VENTURE UPON EVEN COULD HE DETECT IT +I TURN UP THE EARTH BY WAY OF PASTIME +THE WHITE DOUBLE ROSEBUSH HAD EVIDENTLY BEEN PROPPED UP ANEW AGAINST THE HOUSE SINCE THE COMMENCEMENT OF THE SEASON AND A PEAR TREE AND THREE DAMSON TREES WHICH EXCEPT A ROW OF CURRANT BUSHES CONSTITUTED THE ONLY VARIETIES OF FRUIT BORE MARKS OF THE RECENT AMPUTATION OF SEVERAL SUPERFLUOUS OR DEFECTIVE LIMBS +HERE WE HAVE THE MAN SLY SUBTLE HARD IMPERIOUS AND WITHAL COLD AS ICE LOOK AT THAT EYE +HOW WONDERFULLY RESPONSIVE TO EVERY EMOTION OF THE HUMAN SOUL +BEES TOO STRANGE TO SAY HAD THOUGHT IT WORTH THEIR WHILE TO COME HITHER POSSIBLY FROM THE RANGE OF HIVES BESIDE SOME FARM HOUSE MILES AWAY +YET THE ORIGINAL WEARS TO COMMON EYES A VERY DIFFERENT EXPRESSION +MOST OF MY LIKENESSES DO LOOK UNAMIABLE BUT THE VERY SUFFICIENT REASON I FANCY IS BECAUSE THE ORIGINALS ARE SO +IS THERE NOTHING WILD IN THE EYE CONTINUED HOLGRAVE SO EARNESTLY THAT IT EMBARRASSED PHOEBE AS DID ALSO THE QUIET FREEDOM WITH WHICH HE PRESUMED ON THEIR SO RECENT ACQUAINTANCE +PHOEBE MERELY GLANCED AT IT AND GAVE IT BACK +IT IS LIKE A BANDAGE OVER ONE'S EYES TO COME INTO IT +WHILE THUS DISMISSING HER THE MAIDEN LADY STEPT FORWARD KISSED PHOEBE AND PRESSED HER TO HER HEART WHICH BEAT AGAINST THE GIRL'S BOSOM WITH A STRONG HIGH AND TUMULTUOUS SWELL +THEY KEPT THEMSELVES ALIVE UNQUESTIONABLY AND LAID NOW AND THEN AN EGG AND HATCHED A CHICKEN NOT FOR ANY PLEASURE OF THEIR OWN BUT THAT THE WORLD MIGHT NOT ABSOLUTELY LOSE WHAT HAD ONCE BEEN SO ADMIRABLE A BREED OF FOWLS +THE CHICKEN CREPT THROUGH THE PALES OF THE COOP AND RAN WITH SOME SHOW OF LIVELINESS TO HER FEET WHILE CHANTICLEER AND THE LADIES OF HIS HOUSEHOLD REGARDED HER WITH QUEER SIDELONG GLANCES AND THEN CROAKED ONE TO ANOTHER AS IF COMMUNICATING THEIR SAGE OPINIONS OF HER CHARACTER +AH BUT THESE HENS ANSWERED THE YOUNG MAN THESE HENS OF ARISTOCRATIC LINEAGE WOULD SCORN TO UNDERSTAND THE VULGAR LANGUAGE OF A BARN YARD FOWL +SO WE WILL BE FELLOW LABORERS SOMEWHAT ON THE COMMUNITY SYSTEM +THEY HAVE KNOWN ME MUCH LONGER BUT NEVER HONOR ME WITH ANY FAMILIARITY THOUGH HARDLY A DAY PASSES WITHOUT MY BRINGING THEM FOOD +HE HELD A HOE IN HIS HAND AND WHILE PHOEBE WAS GONE IN QUEST OF THE CRUMBS HAD BEGUN TO BUSY HIMSELF WITH DRAWING UP FRESH EARTH ABOUT THE ROOTS OF THE TOMATOES +I PREFER TO THINK AND SO WOULD MISS HEPZIBAH THAT THEY RECOGNIZE THE FAMILY TONE FOR YOU ARE A PYNCHEON +IT IS NONSENSE SAID PHOEBE A LITTLE IMPATIENTLY FOR US TO TALK ABOUT A PICTURE WHICH YOU HAVE NEVER SEEN +THESE FEATHERED PEOPLE HAD EXISTED TOO LONG IN THEIR DISTINCT VARIETY A FACT OF WHICH THE PRESENT REPRESENTATIVES JUDGING BY THEIR LUGUBRIOUS DEPORTMENT SEEMED TO BE AWARE +WELL I DON'T WISH TO SEE IT ANY MORE OBSERVED PHOEBE TURNING AWAY HER EYES IT IS CERTAINLY VERY LIKE THE OLD PORTRAIT +PRAY GO TO BED FOR I AM SURE YOU MUST NEED REST +THE SUN AS YOU SEE TELLS QUITE ANOTHER STORY AND WILL NOT BE COAXED OUT OF IT AFTER HALF A DOZEN PATIENT ATTEMPTS ON MY PART +SHE WAS INDISTINCTLY AWARE HOWEVER THAT THE GAUNT FIGURE OF THE OLD GENTLEWOMAN WAS SITTING IN ONE OF THE STRAIGHT BACKED CHAIRS A LITTLE WITHDRAWN FROM THE WINDOW THE FAINT GLEAM OF WHICH SHOWED THE BLANCHED PALENESS OF HER CHEEK TURNED SIDEWAYS TOWARDS A CORNER +THE DISTINGUISHING MARK OF THE HENS WAS A CREST OF LAMENTABLY SCANTY GROWTH IN THESE LATTER DAYS BUT SO ODDLY AND WICKEDLY ANALOGOUS TO HEPZIBAH'S TURBAN THAT PHOEBE TO THE POIGNANT DISTRESS OF HER CONSCIENCE BUT INEVITABLY WAS LED TO FANCY A GENERAL RESEMBLANCE BETWIXT THESE FORLORN BIPEDS AND HER RESPECTABLE RELATIVE +I WILL SIT IN THE PARLOR AWHILE AND COLLECT MY THOUGHTS +SO WISE AS WELL AS ANTIQUE WAS THEIR ASPECT AS TO GIVE COLOR TO THE IDEA NOT MERELY THAT THEY WERE THE DESCENDANTS OF A TIME HONORED RACE BUT THAT THEY HAD EXISTED IN THEIR INDIVIDUAL CAPACITY EVER SINCE THE HOUSE OF THE SEVEN GABLES WAS FOUNDED AND WERE SOMEHOW MIXED UP WITH ITS DESTINY +AT SOME UNCERTAIN PERIOD IN THE DEPTHS OF NIGHT AND AS IT WERE THROUGH THE THIN VEIL OF A DREAM SHE WAS CONSCIOUS OF A FOOTSTEP MOUNTING THE STAIRS HEAVILY BUT NOT WITH FORCE AND DECISION +IT WAS EVIDENT THAT THE RACE HAD DEGENERATED LIKE MANY A NOBLE RACE BESIDES IN CONSEQUENCE OF TOO STRICT A WATCHFULNESS TO KEEP IT PURE +BUT PUT IT ON THE TABLE IN THE CORNER OF THE PASSAGE +SHE DID NOT ALTOGETHER LIKE HIM +THERE WERE ALSO A FEW SPECIES OF ANTIQUE AND HEREDITARY FLOWERS IN NO VERY FLOURISHING CONDITION BUT SCRUPULOUSLY WEEDED AS IF SOME PERSON EITHER OUT OF LOVE OR CURIOSITY HAD BEEN ANXIOUS TO BRING THEM TO SUCH PERFECTION AS THEY WERE CAPABLE OF ATTAINING +IF YOU WOULD PERMIT ME SAID THE ARTIST LOOKING AT PHOEBE I SHOULD LIKE TO TRY WHETHER THE DAGUERREOTYPE CAN BRING OUT DISAGREEABLE TRAITS ON A PERFECTLY AMIABLE FACE +IF THE ORIGINAL IS STILL IN THE WORLD I THINK HE MIGHT DEFY THE SUN TO MAKE HIM LOOK STERN AND HARD +MY NAME IS PHOEBE PYNCHEON SAID THE GIRL WITH A MANNER OF SOME RESERVE FOR SHE WAS AWARE THAT HER NEW ACQUAINTANCE COULD BE NO OTHER THAN THE DAGUERREOTYPIST OF WHOSE LAWLESS PROPENSITIES THE OLD MAID HAD GIVEN HER A DISAGREEABLE IDEA +IN GOOD FAITH HOWEVER HE IS NOT SUFFICIENTLY IMAGINATIVE TO FLATTER HIMSELF WITH THE SLIGHTEST HOPE OF THIS KIND +HE TRUSTS NOT TO BE CONSIDERED AS UNPARDONABLY OFFENDING BY LAYING OUT A STREET THAT INFRINGES UPON NOBODY'S PRIVATE RIGHTS AND APPROPRIATING A LOT OF LAND WHICH HAD NO VISIBLE OWNER AND BUILDING A HOUSE OF MATERIALS LONG IN USE FOR CONSTRUCTING CASTLES IN THE AIR +THE AUTHOR HAS CONSIDERED IT HARDLY WORTH HIS WHILE THEREFORE RELENTLESSLY TO IMPALE THE STORY WITH ITS MORAL AS WITH AN IRON ROD OR RATHER AS BY STICKING A PIN THROUGH A BUTTERFLY THUS AT ONCE DEPRIVING IT OF LIFE AND CAUSING IT TO STIFFEN IN AN UNGAINLY AND UNNATURAL ATTITUDE +THE NARRATIVE IT MAY BE IS WOVEN OF SO HUMBLE A TEXTURE AS TO REQUIRE THIS ADVANTAGE AND AT THE SAME TIME TO RENDER IT THE MORE DIFFICULT OF ATTAINMENT +IF PERMITTED BY THE HISTORICAL CONNECTION WHICH THOUGH SLIGHT WAS ESSENTIAL TO HIS PLAN THE AUTHOR WOULD VERY WILLINGLY HAVE AVOIDED ANYTHING OF THIS NATURE +THERE APPEARED TO BE AN IMMEDIATE ASSOCIATION WITH THE DEATH TRAUMA AS IF THE TWO WERE INEXTRICABLY LINKED INTO ONE +A MINUTE IS NOT A VERY LARGE MEASURE OF TIME AND HIS BODY NEEDED EVERY FRACTION OF IT +PARTICULARLY SO ON THIS LAST NIGHT WHEN ONLY TWO OF THE LITTLE CUBICLES WERE OCCUPIED THE THOUSANDS OF OTHERS STANDING WITH DARK EMPTY DOORS +THE CONTESTANTS IN THE TWENTIES NEEDED UNDISTURBED REST THEREFORE NIGHTS IN THE DORMITORIES WERE AS QUIET AS DEATH +THERE COULD BE LITTLE ART IN THIS LAST AND FINAL ROUND OF FENCING +BRION SAW SOMETHING CLOSE TO PANIC ON HIS OPPONENT'S FACE WHEN THE MAN FINALLY RECOGNIZED HIS ERROR +SWEAT COVERED BRION'S BODY TRICKLING INTO THE TIGHT LOINCLOTH THAT WAS THE ONLY GARMENT HE WORE +TEN SECONDS +THIS IS PHYSICALLY IMPOSSIBLE WHEN CONSCIOUS +IROLG LOOKED AMAZED AT THE SUDDEN FURY OF THE ATTACK THEN SMILED +I'M HERE BECAUSE THE MATTER IS OF UTMOST IMPORTANCE AND BRANDD IS THE ONE I MUST SEE NOW STAND ASIDE +A WAVE OF DESPAIR ROLLED OUT FROM IROLG BRION SENSED IT AND KNEW THE FIFTH POINT WAS HIS +BREATHING DEEPLY BRION SOFTLY SPOKE THE AUTO HYPNOTIC PHRASES THAT TRIGGERED THE PROCESS +THERE WAS SILENCE THEN AND STILL WONDERING BRION WAS ONCE MORE ASLEEP +A MAN SAID TO THE UNIVERSE SIR I EXIST +WHEN THE BUZZER SOUNDED HE PULLED HIS FOIL FROM HIS SECOND'S STARTLED GRASP AND RAN FORWARD +JUST THRUST AND PARRY AND VICTORY TO THE STRONGER +THE STRENGTH THAT ENABLES SOMEONE IN A TRANCE TO HOLD HIS BODY STIFF AND UNSUPPORTED EXCEPT AT TWO POINTS THE HEAD AND HEELS +THE CUT ON HIS CHEST STILL DRIPPING BLOOD THE ACHE OF HIS OVERSTRAINED EYES EVEN THE SOARING ARENA AROUND HIM WITH THE THOUSANDS OF SPECTATORS WERE TRIVIALITIES NOT WORTH THINKING ABOUT +THE BUZZER'S WHIRR TRIGGERED HIS MUSCLES INTO COMPLETE RELAXATION +OTHERS HAD DIED BEFORE DURING THE TWENTIES AND DEATH DURING THE LAST ROUND WAS IN SOME WAYS EASIER THAN DEFEAT +ONE MINUTE A VOICE SAID AND THE TIME BUZZER SOUNDED +EVERY MAN WHO ENTERED THE TWENTIES HAD HIS OWN TRAINING TRICKS +HE WAS IN REVERIE SLIDING ALONG THE BORDERS OF CONSCIOUSNESS +THE OTHER VOICE SNAPPED WITH A HARSH URGENCY CLEARLY USED TO COMMAND +THE TWENTIES +THEN THE POWERFUL TWIST THAT THRUST IT ASIDE IN AND UNDER THE GUARD +HE ASKED THE HANDLER WHO WAS KNEADING HIS ACHING MUSCLES +HIS INSTANT OF PANIC WAS FOLLOWED BY A SMALL SHARP BLOW HIGH ON HIS CHEST +HE THOUGHT IT WAS A LAST BURST OF ENERGY HE KNEW HOW CLOSE THEY BOTH WERE TO EXHAUSTION +ONLY HIS HEART AND LUNGS WORKED ON AT A STRONG MEASURED RATE +HE MUST HAVE DRAWN HIS GUN BECAUSE THE INTRUDER SAID QUICKLY PUT THAT AWAY YOU'RE BEING A FOOL OUT +A RED HAIRED MOUNTAIN OF A MAN WITH AN APPARENTLY INEXHAUSTIBLE STORE OF ENERGY +TRUE AGREED KALIKO +I HAVE REMAINED A PRISONER ONLY BECAUSE I WISHED TO BE ONE AND WITH THIS HE STEPPED FORWARD AND BURST THE STOUT CHAINS AS EASILY AS IF THEY HAD BEEN THREADS +THE METAL FOREST IS IN THE GREAT DOMED CAVERN THE LARGEST IN ALL OUR DOMINIONS REPLIED KALIKO +WHERE IS MY BROTHER NOW +OH NO I'M QUITE SURE HE DIDN'T +HAVING RETURNED TO THE ROYAL CAVERN KALIKO FIRST POUNDED THE GONG AND THEN SAT IN THE THRONE WEARING RUGGEDO'S DISCARDED RUBY CROWN AND HOLDING IN HIS HAND THE SCEPTRE WHICH RUGGEDO HAD SO OFTEN THROWN AT HIS HEAD +THAT'S FUNNY REMARKED BETSY THOUGHTFULLY +I DON'T BELIEVE ANN KNEW ANY MAGIC OR SHE'D HAVE WORKED IT BEFORE +KALIKO WENT TO THE BIG GONG AND POUNDED ON IT JUST AS RUGGEDO USED TO DO BUT NO ONE ANSWERED THE SUMMONS +IN FACT THERE IS NOTHING HE CAN DO IN THESE DOMINIONS AS WELL AS OUR NOMES WHOSE NUMBERS ARE SO GREAT THAT IT WORRIES US TO KEEP THEM ALL BUSY +HOWEVER IF WE LOOK SHARP WE MAY BE ABLE TO DISCOVER ONE OF THESE SECRET WAYS +I DO NOT KNOW CONFESSED SHAGGY +I HOPE HE DOESN'T WORK TOO HARD SAID SHAGGY +THE LITTLE GIRL HAD BEEN ASLEEP BUT SHE HEARD THE RAPS AND OPENED THE DOOR +I ALSO OFFERED TO HELP YOUR BROTHER TO ESCAPE BUT HE WOULD NOT GO +I BEGGED RUGGEDO LONG AGO TO SEND HIM AWAY BUT HE WOULD NOT DO SO +THE KING HAS FLED IN DISGRACE AND YOUR FRIENDS ARE ASKING FOR YOU +WHERE IS THAT +NOT EXACTLY RETURNED KALIKO +KALIKO HESITATED +HE EATS AND SLEEPS VERY STEADILY REPLIED THE NEW KING +INQUIRED SHAGGY IN THE METAL FOREST +BECAUSE YOU WERE SLEEPING INSTEAD OF CONQUERING THE LOVELY ROSE PRINCESS HAS BECOME A FIDDLE WITHOUT A BOW WHILE POOR SHAGGY SITS THERE A COOING DOVE +HE DOESN'T WORK AT ALL +HE HAS GONE AND GONE FOR GOOD ANSWERED POLYCHROME WHO HAD MANAGED TO SQUEEZE INTO THE ROOM BESIDE THE DRAGON AND HAD WITNESSED THE OCCURRENCES WITH MUCH INTEREST +PAINTING HE TELLS US IS OF A DIFFERENT QUALITY TO MATHEMATICS AND FINISH IN ART IS ADDING MORE FACT +IN FACT HE IS QUITE SEVERE ON MISTER RUSKIN FOR NOT RECOGNISING THAT A PICTURE SHOULD DENOTE THE FRAILTY OF MAN AND REMARKS WITH PLEASING COURTESY AND FELICITOUS GRACE THAT MANY PHASES OF FEELING +LINNELL'S PICTURES ARE A SORT OF UP GUARDS AND AT EM PAINTINGS AND MASON'S EXQUISITE IDYLLS ARE AS NATIONAL AS A JINGO POEM MISTER BIRKET FOSTER'S LANDSCAPES SMILE AT ONE MUCH IN THE SAME WAY THAT MISTER CARKER USED TO FLASH HIS TEETH AND MISTER JOHN COLLIER GIVES HIS SITTER A CHEERFUL SLAP ON THE BACK BEFORE HE SAYS LIKE A SHAMPOOER IN A TURKISH BATH NEXT MAN +ONLY UNFORTUNATELY HIS OWN WORK NEVER DOES GET GOOD +ON THE GENERAL PRINCIPLES OF ART MISTER QUILTER WRITES WITH EQUAL LUCIDITY +MISTER QUILTER IS THE APOSTLE OF THE MIDDLE CLASSES AND WE ARE GLAD TO WELCOME HIS GOSPEL +HE TELLS US THAT AT THIS FESTIVE SEASON OF THE YEAR WITH CHRISTMAS AND ROAST BEEF LOOMING BEFORE US SIMILES DRAWN FROM EATING AND ITS RESULTS OCCUR MOST READILY TO THE MIND +AS FOR ETCHINGS THEY ARE OF TWO KINDS BRITISH AND FOREIGN +BY HARRY QUILTER M A +HE HAS GRAVE DOUBTS WHETHER SIR FREDERICK LEIGHTON'S WORK IS REALLY GREEK AFTER ALL AND CAN DISCOVER IN IT BUT LITTLE OF ROCKY ITHACA +NOR IS MISTER QUILTER'S MANNER LESS INTERESTING THAN HIS MATTER +IT IS OBVIOUSLY UNNECESSARY FOR US TO POINT OUT HOW LUMINOUS THESE CRITICISMS ARE HOW DELICATE IN EXPRESSION +HE LAMENTS MOST BITTERLY THE DIVORCE THAT HAS BEEN MADE BETWEEN DECORATIVE ART AND WHAT WE USUALLY CALL PICTURES MAKES THE CUSTOMARY APPEAL TO THE LAST JUDGMENT AND REMINDS US THAT IN THE GREAT DAYS OF ART MICHAEL ANGELO WAS THE FURNISHING UPHOLSTERER +MISTER QUILTER HAS MISSED HIS CHANCE FOR HE HAS FAILED EVEN TO MAKE HIMSELF THE TUPPER OF PAINTING +NEAR THE FIRE AND THE ORNAMENTS FRED BROUGHT HOME FROM INDIA ON THE MANTEL BOARD +IT WAS NOT FROM ANY REAL CAUSE OF GRIEF THAT SHE WEPT BUT THERE WAS A MAGNETIC QUALITY IN TEARS WHICH ALWAYS ATTRACTED HER'S +NIECE I COMMAND YOU NOT TO STIR OUT OF THIS ROOM THIS EVENING +IT IS OFTEN THE UNGRATEFUL TASK OF A FRIEND TO BE TROUBLESOME SOMETIMES UNMANNERLY +YES INDEED AND I BELIEVE IT IS RIGHT THAT I SHOULD KEEP MY FIRST PROMISE IS IT NOT +KEEP YOUR APPOINTMENT AND BE ASSURED THAT I SHALL ISSUE MY COMMANDS WITH MORE CIRCUMSPECTION FOR THE FUTURE AS I FIND HOW STRICTLY THEY ARE COMPLIED WITH +IF YOU THINK SO MADAM I SEE NOTHING THAT SHOULD PREVENT ME NOW +NIGHT AFTER NIGHT HIS SLEEP HAD BEEN DISTURBED BY FEARS FOR HER WHEN ABROAD MORNING AFTER MORNING IT HAD BEEN BROKEN BY THE CLAMOUR OF HER RETURN +NOR HAD THIS GOOD WOMAN'S OFFICIOUS LABOURS TAKEN THE LEAST FROM THE AWKWARDNESS OF THE SILENCE WHICH AS SOON AS THE BUSTLE SHE HAD MADE WAS OVER RETURNED IN ITS FULL FORCE +SIR EDWARD NOT WHOLLY DISCOURAGED BY THE DENIAL WITH WHICH DORRIFORTH HAD WITH DELICACY ACQUAINTED HIM STILL HOPED FOR A KIND RECEPTION AND WAS SO OFTEN AT THE HOUSE OF MISSUS HORTON THAT LORD FREDERICK'S JEALOUSY WAS EXCITED AND THE TORTURES HE SUFFERED IN CONSEQUENCE CONVINCED HIM BEYOND A DOUBT OF THE SINCERITY OF HIS AFFECTION +MISSUS HORTON TOO IN THE SELF APPROVING REFLECTION THAT SHE WAS NOT IN A QUARREL OR ALTERCATION OF ANY KIND FELT HERSELF AT THIS MOMENT REMARKABLY PEACEFUL AND CHARITABLE +I HOPE MISS MILNER YOU PASS THIS EVENING AT HOME +AT THE USUAL HOUR MISTER DORRIFORTH AND HIS WARD WERE SUMMONED TO TEA HE ENTERED WITH A COUNTENANCE WHICH EVINCED THE REMAINS OF ANGER HIS EYE GAVE TESTIMONY OF HIS ABSENT THOUGHTS AND THOUGH HE TOOK UP A PAMPHLET AFFECTING TO READ IT WAS PLAIN TO DISCERN THAT HE SCARCELY KNEW HE HELD IT IN HIS HAND +MISS WOODLEY THOUGHT IT HER DUTY TO BE MUTE AND NOW THE GINGLE OF A TEA SPOON WAS LIKE A DEEP TONED BELL ALL WAS SO QUIET +DORRIFORTH THEN LAID THE BOOK OUT OF HIS HAND AND BY THE TIME THE SERVANT HAD LEFT THE ROOM THUS BEGAN +YET DID THE WATCHFUL MISS WOODLEY OFTENTIMES HEAR A SIGH ESCAPE FROM HER UNKNOWN TO HERSELF TILL SHE WAS REMINDED OF IT AND THEN A SUDDEN BLUSH WOULD INSTANTLY OVERSPREAD HER FACE +DORRIFORTH READ ON AND SEEMED AFRAID OF LOOKING UP LEST HE SHOULD SEE WHAT HE COULD NOT HAVE PARDONED +I THOUGHT MISS MILNER YOU GAVE ME YOUR WORD THAT YOU WOULD PASS THIS EVENING AT HOME +ON THIS HE ROSE FROM HIS CHAIR AND GOING TO HER SAID ONCE MORE SHEW YOUR SUBMISSION BY OBEYING ME A SECOND TIME TO DAY +WHAT HE SAID HE LOOKED WITH SO MUCH SINCERITY THAT HAD SHE BEEN BURNING WITH RAGE AT HIS LATE BEHAVIOUR SHE MUST HAVE FORGIVEN HIM FOR THE REGRET WHICH HE SO FORCIBLY EXPREST +MISSUS HORTON ROSE FROM HER SEAT MOVED THE DECANTERS AND FRUIT ROUND THE TABLE STIRRED THE FIRE AND CAME BACK TO HER SEAT AGAIN BEFORE ANOTHER WORD WAS UTTERED +MISS WOODLEY DID NOT RECOLLECT HERSELF SO BUT WAS SO IN REALITY IN HER PEACE AND CHARITY WERE INSTINCTIVE VIRTUES ACCIDENT COULD NOT INCREASE THEM +MISS MILNER YOU SHALL NOT LEAVE THE HOUSE THIS EVENING SIR +HER HAND FELL MOTIONLESS FROM THAT WHICH SHE HELD SHE APPEARED MOTIONLESS HERSELF TILL MISSUS HORTON BESEECHING HER NOT TO BE UNEASY AT THE TREATMENT SHE HAD RECEIVED MADE HER TEARS FLOW AS IF HER HEART WAS BREAKING +SHE WAS GOING TO REPLY BUT FOUND SHE COULD NOT WITHOUT ACCOMPANYING HER WORDS WITH TEARS THEREFORE AFTER THE FIRST ATTEMPT SHE DESISTED +EVERY TIME HE BEHELD THE OBJECT OF HIS PASSION FOR HE STILL CONTINUED HIS VISITS THOUGH NOT SO FREQUENTLY AS HERETOFORE HE PLEADED HIS CAUSE WITH SUCH ARDOUR THAT MISS WOODLEY WHO WAS SOMETIMES PRESENT AND EVER COMPASSIONATE COULD NOT RESIST WISHING HIM SUCCESS +HE COUGHED DRANK HIS TEA ENDEAVOURED TO TALK BUT FOUND IT DIFFICULT SOMETIMES READ AND IN THIS MANNER NEAR TWO HOURS WERE PASSED AWAY WHEN MISS MILNER CAME INTO THE ROOM NOT DRESSED FOR A BALL BUT AS SHE HAD RISEN FROM DINNER +AND HE WALKED IMMEDIATELY OUT OF THE APARTMENT BY ANOTHER DOOR +DO YOU THINK I WOULD GO ANSWERED MISS MILNER WITH AN EAGERNESS THAT FOR A TIME SUPPRESSED HER TEARS IN CONTRADICTION TO HIS WILL +AFTER A FEW MINUTES PAUSE AND SOME LITTLE EMBARRASSMENT ON THE PART OF MISSUS HORTON AT THE DISAPPOINTMENT SHE HAD TO ENCOUNTER FROM THIS UNEXPECTED DUTIFUL CONDUCT SHE ASKED MISS MILNER IF SHE WOULD NOW HAVE ANY TEA +MISS WOODLEY OBEDIENTLY SAT DOWN AND THOUGH HER THOUGHTS AND HEART WERE IN THE CHAMBER OF HER FRIEND SHE NEVER MARKED BY ONE IMPERTINENT WORD OR BY ONE LINE OF HER FACE THE RESTRAINT SHE SUFFERED +FORGIVE THE DUTIES OF MY OFFICE AND BELIEVE THAT NO ONE IS HALF SO MUCH CONCERNED IF IT ROBS YOU OF ANY DEGREE OF HAPPINESS AS I MYSELF AM +WHEN A MARRIED WOMAN HAS FOLLOWERS AND THE HUSBAND DON'T GO THE WRONG SIDE OF THE POST TOO OR IT AIN'T PROVED AGAIN HIM THAT HE DO THEY'LL NEVER LET HER HAVE NOTHING TO DO WITH THE CHILDREN +MISSUS BOZZLE WAS DISPOSED TO THINK THAT LADIES OF QUALITY AMONG WHOM MADAME T WAS ENTITLED IN HER ESTIMATION TO TAKE RANK WERE SELDOM BETTER THAN THEY OUGHT TO BE AND SHE WAS QUITE WILLING THAT HER HUSBAND SHOULD EARN HIS BREAD BY WATCHING THE LADY OR THE LADY'S LOVER +HE CAN'T SUCKLE EM CAN HE +BUT AS FOR THIS HERE CHILD B +AND NOW IT HAD COME TO PASS THAT HIS SOLE REMAINING ALLY MISTER SAMUEL BOZZLE THE EX POLICEMAN WAS BECOMING WEARY OF HIS SERVICE +AT LAST HE SENT WORD TO SAY THAT HE HIMSELF WOULD BE IN ENGLAND BEFORE THE END OF MARCH AND WOULD SEE THAT THE MAJESTY OF THE LAW SHOULD BE VINDICATED IN HIS FAVOUR +BOZZLE AWAY FROM HIS OWN HOME OUT ON BUSINESS WITH HIS COAT BUTTONED OVER HIS BREAST AND HIS BEST HAT IN HIS HAND WAS AWARE THAT HE COMMANDED RESPECT AND HE COULD CARRY HIMSELF ACCORDINGLY +BUT IF YOU ASK ME MY OPINION WHY IN COURSE THEY'VE BEEN TOGETHER SOMEWHERE +IN THE LAST COMMUNICATION WHICH HE HAD RECEIVED FROM LADY MILBOROUGH SHE HAD SCOLDED HIM IN TERMS THAT WERE FOR HER SEVERE BECAUSE HE HAD NOT RETURNED TO HIS WIFE AND TAKEN HER OFF WITH HIM TO NAPLES +IF YOU WOULD HAVE GONE TO MISTER SKINT SIR SUGGESTED BOZZLE +AND HAD THE CASE BEEN BROUGHT BEFORE THE JUDGE ORDINARY BY MEANS OF HER HUSBAND'S EXERTIONS SHE WOULD HAVE TAKEN PLEASURE IN READING EVERY WORD OF THE EVIDENCE EVEN THOUGH HER HUSBAND SHOULD HAVE BEEN EVER SO ROUGHLY HANDLED BY THE LAWYERS +DRAT EM ALL WHAT IS IT THEY WANTS THEY DON'T KNOW WHAT THEY WANTS +BUT TREVELYAN WAS OF A DIFFERENT OPINION AND HE WAS DISGUSTED AND REVOLTED MOST UNREASONABLY BY THE APPEARANCE OF HIS MINISTER'S DOMESTIC ARRANGEMENTS +IT'S THAT AS MAKES EM I WON'T SAY WHAT +PERHAPS YOU COULD PUT ON YOUR COAT AND WALK OUT WITH ME FOR A FEW MINUTES SAID TREVELYAN +I'LL TELL YOU WHAT IT IS B EXCLAIMED MISSUS BOZZLE IT'S MY BELIEF AS HE AIN'T QUITE RIGHT UP HERE AND MISSUS BOZZLE TOUCHED HER FOREHEAD +A DISTINCT PROMISE OF A HUNDRED POUNDS WAS MADE TO HIM IF HE WOULD HAVE THE CHILD READY TO HAND OVER TO TREVELYAN ON TREVELYAN'S ARRIVAL IN ENGLAND +TREVELYAN HAD FOLLOWED HIS LETTER QUICKER THAN HE HAD INTENDED WHEN IT WAS WRITTEN AND WAS NOW WITH HIS PRIME MINISTER BEFORE HIS PRIME MINISTER HAD BEEN ABLE TO TAKE ANY ACTION ON THE LAST INSTRUCTION RECEIVED +THEN BOZZLE CAME FORWARD AND INTRODUCED HIS WIFE +THE PATERNAL PARENT HAS A RIGHT TO HIS INFANTS NO DOUBT THAT WAS BOZZLE'S LAW +I DO NOT SUPPOSE THAT ANYBODY WILL QUESTION MY RIGHT TO HAVE THE CARE OF MY OWN CHILD SAID TREVELYAN +I'VE WATCHED AS SHARP AS WATCHING CAN GO PRETTY NEAR +OF COURSE IT AIN'T SAID MISSUS BOZZLE +AS HE WENT ABOUT HIS EYES WERE EVER CAST DOWNWARDS AND HE WALKED WITH A QUICK SHUFFLING GAIT AND HE SUSPECTED OTHERS FEELING THAT HE HIMSELF WAS SUSPECTED +IT IS VERY MUCH EASIER FOR SUCH MEN AS MISTER BOZZLE TO CARRY DECENCY OF APPEARANCE ABOUT WITH THEM THAN TO KEEP IT AT HOME +AND HE DID GO AWAY LEAVING BOZZLE STANDING IN THE MIDDLE OF STONY WALK +AND ALL WORK HAD CEASED WITH HIM +MISSUS BOZZLE WHO WELL UNDERSTOOD THAT BUSINESS WAS BUSINESS AND THAT WIVES WERE NOT BUSINESS FELT NO ANGER AT THIS AND HANDED HER HUSBAND HIS BEST COAT +AND BOZZLE AS HE SAID THIS SMILED ALMOST ALOUD +DOES ONE MISTER SAMUEL BOZZLE LIVE HERE ASKED TREVELYAN +HE'S UP IN TOWN SIR A MINDING OF HIS PARLIAMENTARY DUTIES +BOZZLE HAD ALWAYS WAITED UPON HIM WITH A DECENT COAT AND A WELL BRUSHED HAT AND CLEAN SHOES +IN MAKING THIS HE HAD EXPECTED NO SUCCESS THOUGH FROM THE ENERGETIC NATURE OF HIS DISPOSITION HE HAD MADE THE ATTEMPT WITH SOME ZEAL +WE HAVE BOTH SEEN THE SAME NEWSPAPER OF COURSE AND YOU HAVE BEEN THE FIRST TO CLEAR THE THING UP THAT'S IT ISN'T IT +WHAT ARE YOU DOING HERE HE ASKED +EVEN THE CHANCE OF SUCCESSFULLY CONFIDING HER TO BENNYDECK'S PROTECTION HAD LOST SOMETHING OF ITS FAIR PROMISE SINCE RANDAL'S VISIT TO SYDENHAM +SHALL I SAY THAT SHE MAY EXPECT AN EARLY VISIT FROM YOU WHEN I SEE HER TO MORROW +BUT IT MIGHT PERHAPS BE EXCUSABLE TO INFER THAT THE MARRIAGE HAD NOT YET BEEN DECIDED ON AND THAT THE CAPTAIN'S PROPOSALS WERE STILL WAITING FOR CATHERINE'S REPLY +SUPPOSING THE REPORT HAD BEEN TRUE +IN THE MEANTIME AFTER WHAT MISSUS PRESTY HAD CONFESSED THE CRUEL FALSEHOOD WHICH HAD CHECKED POOR KITTY'S NATURAL INQUIRIES RAISED AN INSUPERABLE OBSTACLE TO A MEETING BETWEEN FATHER AND CHILD +BE THE RESULTS HOWEVER WHAT THEY MIGHT RANDAL COULD SEE BUT ONE PLAIN COURSE BEFORE HIM NOW +HE HAD PROMISED TO DO HIS BEST TOWARD PERSUADING CATHERINE TO GRANT SYDNEY AN INTERVIEW +WHAT HAPPIER FUTURE COULD AWAIT HER ESPECIALLY IF SHE JUSTIFIED RANDAL'S PAST EXPERIENCE OF ALL THAT WAS CANDID AND TRUTHFUL IN HER CHARACTER THAN TO BECOME HIS FRIEND'S WIFE +YOU HAVE BEEN TO THE HOTEL HE BURST OUT YOU HAVE SEEN CATHERINE +NOT SATISFIED WITH GOSSIP IN PRIVATE THE GREEDY PUBLIC APPETITE DEVOURS GOSSIP IN PRINT AND WANTS MORE OF IT THAN ANY ONE EDITOR CAN SUPPLY +HE ADDED SYDNEY'S ADDRESS IN A POSTSCRIPT AND DISPATCHED HIS LETTER THAT EVENING +CONSIDERATIONS OF DELICACY SEEMED TO FORBID TAKING THIS LIBERTY EVEN WITH AN INTIMATE FRIEND +RANDAL HE SAID YOU KNOW WHERE SYDNEY IS +I HAVEN'T COURAGE ENOUGH TO DO IT FOR MYSELF +RANDAL WROTE TO ACCEPT THE INVITATION DETERMINING TO PRESENT HIMSELF BEFORE THE APPOINTED HOUR AND TO QUESTION CATHERINE PRIVATELY WITHOUT GIVING HER THE ADVANTAGE OVER HIM OF PREPARING HERSELF FOR THE INTERVIEW +HE PAUSED AND PUT HIS HAND TO HIS FEVERED HEAD +I'M AFRAID HE SAID +HE PUT DOWN THE EMPTY GLASS TAKING NO NOTICE OF HIS BROTHER'S QUESTION +I'M ALONE DO YOU HEAR THAT ALONE +THIS ALTERNATIVE IN THE CAPTAIN'S PLANS TERMINATING THE VOYAGE A MONTH EARLIER THAN HIS ARRANGEMENTS HAD CONTEMPLATED PUZZLED RANDAL +I WILL DO NEITHER THE ONE NOR THE OTHER +THE SAILING MASTER ANNOUNCED THAT HE HAD ORDERS TO TAKE THE VESSEL BACK TO HER PORT WITH NO OTHER EXPLANATION THAN THAT THE CRUISE WAS OVER +SHE SHALL HAVE YOUR MESSAGE ALL THAT I CAN DO TO PERSUADE HER SHALL BE DONE +YOU DISTRESS ME HERBERT MORE THAN WORDS CAN SAY +HE IS STAYING AT THIS HOTEL TO TRY THE AIR OF SYDENHAM AND HE FINDS THAT IT AGREES WITH HIM +YOU DON'T KNOW WHAT IT IS TO BE USED TO SEEING A PRETTY CREATURE ALWAYS NICELY DRESSED ALWAYS ABOUT THE ROOM THINKING SO MUCH OF YOU AND SO LITTLE OF HERSELF AND THEN TO BE LEFT ALONE AS I AM LEFT OUT IN THE DARK +HE DRANK THE WINE GREEDILY +RANDAL WAITED A WHILE IN LONDON ON THE CHANCE THAT BENNYDECK MIGHT PAY HIM A VISIT +AFTER MONTHS OF SEPARATION HE RECEIVED A VISIT FROM HERBERT +LET ME HEAR WHAT IT IS FIRST +NOT HAVING HEARD FROM CAPTAIN BENNYDECK FOR SOME LITTLE TIME RANDAL THOUGHT IT DESIRABLE IN SYDNEY'S INTERESTS TO MAKE INQUIRIES AT HIS CLUB +WAS HIS MIND WANDERING INTO SOME OTHER TRAIN OF THOUGHT +OH WHY DID I ENGAGE THAT GOVERNESS +HAD HER BEAUTY FASCINATED HIM +HE MENTIONED THE NAME OF ONE OF THE OLD SERVANTS AT MOUNT MORVEN WHO HAD ATTACHED HIMSELF TO RANDAL AFTER THE BREAKUP OF THE FAMILY +YOU CAN'T DO IT +I FEEL FOR YOU HERBERT HE SAID WARMLY +LET ME REST A LITTLE HE PLEADED IF I'M NOT IN THE WAY +I TRIED IT YESTERDAY IT SET MY BRAINS ON FIRE I'M FEELING THAT GLASS I TOOK JUST NOW +HONESTLY +BUT IF THESE NEWSPAPER PEOPLE WAITED TO FIND OUT WHETHER A REPORT IS TRUE OR FALSE HOW MUCH GOSSIP WOULD SOCIETY GET IN ITS FAVORITE NEWSPAPERS +WHILE HE WAS WALKING UP AND DOWN THE PLATFORM WITH A MIND DOUBLY DISTRESSED BY ANXIETY ABOUT HIS BROTHER AND ANXIETY ABOUT SYDNEY THE TRAIN FROM LONDON CAME IN +AFTER THAT I HAD HER MOTHER'S AUTHORITY FOR TELLING KITTY THAT SHE WOULD NEVER SEE HER FATHER AGAIN +HAVE YOU ANY MESSAGE FOR CAPTAIN BENNYDECK +SIT DOWN SAID MISSUS PRESTY +WITH HIS OWN SUSPICIONS STEADILY CONTRADICTING HIM HE ARRIVED AT THE HOTEL OBSTINATELY BELIEVING THAT THE CHARMING WIDOW WOULD PROVE TO BE A STRANGER +THE NEW NUMBER OF A POPULAR WEEKLY JOURNAL HAD THAT DAY BEEN PUBLISHED RANDAL BOUGHT IT +WHEN HE AND I HAPPENED TO BE LEFT TOGETHER HE NATURALLY WONDERED AFTER HAVING SEEN THE BEAUTIFUL WIFE WHERE THE LUCKY HUSBAND MIGHT BE +YOU WOULD HAVE SEEN HER PINING FOR THE COMPANY OF OTHER CHILDREN AND WOULD HAVE HAD NO MERCY ON HER +WORSE STORIES HAVE BEEN PRINTED I DO ASSURE YOU WORSE STORIES HAVE BEEN PRINTED +ARRIVED AT THE STATION RANDAL FOUND THAT HE MUST WAIT FOR THE TRAIN +MISSUS PRESTY WAS AT HOME SHE WAS REPORTED TO BE IN THE GARDEN OF THE HOTEL +THE REPORT IS PREMATURE MY GOOD FRIEND +GOOD BY DEAR RANDAL +MISSUS NORMAN AND HER LITTLE DAUGHTER WERE OUT DRIVING WITH A FRIEND AND WERE EXPECTED TO RETURN IN GOOD TIME FOR DINNER +HE WAS INTRODUCED TO MISSUS NORMAN AND TO MISSUS NORMAN'S LITTLE GIRL AND WE WERE ALL CHARMED WITH HIM +BUT YOU OUGHT TO HAVE KNOWN THAT WE ARE ONLY HALF AN HOUR BEHIND YOU AT SYDENHAM IN THE MATTER OF NEWS +YOU SHALL HEAR HOW MY DIVORCED DAUGHTER AND MY POOR LITTLE GRANDCHILD WERE TREATED AT SANDYSEAL AFTER YOU LEFT US +SHE ASKED DIRECTLY IF HER FATHER WAS DEAD +RANDAL PASSED THIS OVER WITHOUT NOTICE +AFTER READING ONE OR TWO OF THE POLITICAL ARTICLES HE ARRIVED AT THE COLUMNS SPECIALLY DEVOTED TO FASHIONABLE INTELLIGENCE +IT WAS A RELIEF TO RANDAL IN THE PRESENT STATE OF CATHERINE'S RELATIONS TOWARD BENNYDECK TO RETURN TO LONDON WITHOUT HAVING SEEN HIS FRIEND +NOT AT THE HOTEL JUST NOW +YOU ARE TO UNDERSTAND THAT CATHERINE IS A WIDOW +ON THE NEXT DAY BUT ONE RANDAL ARRANGED HIS DEPARTURE FOR SYDENHAM SO AS TO ARRIVE AT THE HOTEL AN HOUR BEFORE THE TIME APPOINTED FOR THE DINNER +SHE ADDED LOOKING AT HIM SUSPICIOUSLY +RANDAL LOOKED AGAIN AT THE FIRST WORDS IN THE PARAGRAPH +HOW NICE OF YOU TO COME SO SOON SHE BEGAN +AND THE CAPTAIN OF COURSE CONCLUDED AFTER HAVING BEEN INTRODUCED TO KITTY THAT MISSUS NORMAN WAS A WIDOW +THAT WILL DO MISSUS PRESTY YOUR DEFENSE IS THOROUGHLY WORTHY OF YOUR CONDUCT IN ALL OTHER RESPECTS +A VERY WISE DECISION SHE REMARKED +BEFORE I CONSENTED TO ANSWER THE CHILD'S INQUIRIES I CAME TO AN UNDERSTANDING WITH HER MOTHER +WHICH OPPRESSED THE METROPOLITANS OF EUROPE AND ASIA INVADED THE PROVINCES OF ANTIOCH AND ALEXANDRIA AND MEASURED THEIR DIOCESE BY THE LIMITS OF THE EMPIRE +THE ZEAL OF CYRIL EXPOSED HIM TO THE PENALTIES OF THE JULIAN LAW BUT IN A FEEBLE GOVERNMENT AND A SUPERSTITIOUS AGE HE WAS SECURE OF IMPUNITY AND EVEN OF PRAISE +AT THE SAME TIME EVERY AVENUE OF THE THRONE WAS ASSAULTED WITH GOLD +ARDENT IN THE PROSECUTION OF HERESY CYRIL AUSPICIOUSLY OPENED HIS REIGN BY OPPRESSING THE NOVATIANS THE MOST INNOCENT AND HARMLESS OF THE SECTARIES +A WANDERING TRIBE OF THE BLEMMYES OR NUBIANS INVADED HIS SOLITARY PRISON IN THEIR RETREAT THEY DISMISSED A CROWD OF USELESS CAPTIVES BUT NO SOONER HAD NESTORIUS REACHED THE BANKS OF THE NILE THAN HE WOULD GLADLY HAVE ESCAPED FROM A ROMAN AND ORTHODOX CITY TO THE MILDER SERVITUDE OF THE SAVAGES +NESTORIUS WHO DEPENDED ON THE NEAR APPROACH OF HIS EASTERN FRIENDS PERSISTED LIKE HIS PREDECESSOR CHRYSOSTOM TO DISCLAIM THE JURISDICTION AND TO DISOBEY THE SUMMONS OF HIS ENEMIES THEY HASTENED HIS TRIAL AND HIS ACCUSER PRESIDED IN THE SEAT OF JUDGMENT +BY THE VIGILANCE OF MEMNON THE CHURCHES WERE SHUT AGAINST THEM AND A STRONG GARRISON WAS THROWN INTO THE CATHEDRAL +THE VANITY OF CELESTINE WAS FLATTERED BY THE APPEAL AND THE PARTIAL VERSION OF A MONK DECIDED THE FAITH OF THE POPE WHO WITH HIS LATIN CLERGY WAS IGNORANT OF THE LANGUAGE THE ARTS AND THE THEOLOGY OF THE GREEKS +SIXTY EIGHT BISHOPS TWENTY TWO OF METROPOLITAN RANK DEFENDED HIS CAUSE BY A MODEST AND TEMPERATE PROTEST THEY WERE EXCLUDED FROM THE COUNCILS OF THEIR BRETHREN +AT THESE BLASPHEMOUS SOUNDS THE PILLARS OF THE SANCTUARY WERE SHAKEN +SUCH CRIMES WOULD HAVE DESERVED THE ANIMADVERSION OF THE MAGISTRATE BUT IN THIS PROMISCUOUS OUTRAGE THE INNOCENT WERE CONFOUNDED WITH THE GUILTY AND ALEXANDRIA WAS IMPOVERISHED BY THE LOSS OF A WEALTHY AND INDUSTRIOUS COLONY +THE FEEBLE SON OF ARCADIUS WAS ALTERNATELY SWAYED BY HIS WIFE AND SISTER BY THE EUNUCHS AND WOMEN OF THE PALACE SUPERSTITION AND AVARICE WERE THEIR RULING PASSIONS AND THE ORTHODOX CHIEFS WERE ASSIDUOUS IN THEIR ENDEAVORS TO ALARM THE FORMER AND TO GRATIFY THE LATTER +RETURN TO YOUR PROVINCES AND MAY YOUR PRIVATE VIRTUES REPAIR THE MISCHIEF AND SCANDAL OF YOUR MEETING +A RUMOR WAS SPREAD AMONG THE CHRISTIANS THAT THE DAUGHTER OF THEON WAS THE ONLY OBSTACLE TO THE RECONCILIATION OF THE PRAEFECT AND THE ARCHBISHOP AND THAT OBSTACLE WAS SPEEDILY REMOVED +ORESTES COMPLAINED BUT HIS JUST COMPLAINTS WERE TOO QUICKLY FORGOTTEN BY THE MINISTERS OF THEODOSIUS AND TOO DEEPLY REMEMBERED BY A PRIEST WHO AFFECTED TO PARDON AND CONTINUED TO HATE THE PRAEFECT OF EGYPT +DURING A BUSY PERIOD OF THREE MONTHS THE EMPEROR TRIED EVERY METHOD EXCEPT THE MOST EFFECTUAL MEANS OF INDIFFERENCE AND CONTEMPT TO RECONCILE THIS THEOLOGICAL QUARREL +WITHOUT ANY LEGAL SENTENCE WITHOUT ANY ROYAL MANDATE THE PATRIARCH AT THE DAWN OF DAY LED A SEDITIOUS MULTITUDE TO THE ATTACK OF THE SYNAGOGUES +THE PAST HE REGRETTED HE WAS DISCONTENTED WITH THE PRESENT AND THE FUTURE HE HAD REASON TO DREAD THE ORIENTAL BISHOPS SUCCESSIVELY DISENGAGED THEIR CAUSE FROM HIS UNPOPULAR NAME AND EACH DAY DECREASED THE NUMBER OF THE SCHISMATICS WHO REVERED NESTORIUS AS THE CONFESSOR OF THE FAITH +BUT IN THIS AWFUL MOMENT OF THE DANGER OF THE CHURCH THEIR VOW WAS SUPERSEDED BY A MORE SUBLIME AND INDISPENSABLE DUTY +EXTERMINATE WITH ME THE HERETICS AND WITH YOU I WILL EXTERMINATE THE PERSIANS +BUT THE VATICAN RECEIVED WITH OPEN ARMS THE MESSENGERS OF EGYPT +BUT THE PREVAILING DOCTRINE OF THE ETERNITY AND INHERENT PRAVITY OF MATTER INFECTED THE PRIMITIVE CHURCHES OF THE EAST +HE FIRST APPEARED ON THE BANKS OF THE JORDAN IN THE FORM OF PERFECT MANHOOD BUT IT WAS A FORM ONLY AND NOT A SUBSTANCE A HUMAN FIGURE CREATED BY THE HAND OF OMNIPOTENCE TO IMITATE THE FACULTIES AND ACTIONS OF A MAN AND TO IMPOSE A PERPETUAL ILLUSION ON THE SENSES OF HIS FRIENDS AND ENEMIES +A LAUDABLE REGARD FOR THE HONOR OF THE FIRST PROSELYTE HAS COUNTENANCED THE BELIEF THE HOPE THE WISH THAT THE EBIONITES OR AT LEAST THE NAZARENES WERE DISTINGUISHED ONLY BY THEIR OBSTINATE PERSEVERANCE IN THE PRACTICE OF THE MOSAIC RITES +BUT THE RASHNESS OF THESE CONCESSIONS HAS ENCOURAGED A MILDER SENTIMENT OF THOSE OF THE DOCETES WHO TAUGHT NOT THAT CHRIST WAS A PHANTOM BUT THAT HE WAS CLOTHED WITH AN IMPASSIBLE AND INCORRUPTIBLE BODY +HE LIVED AND DIED FOR THE SERVICE OF MANKIND BUT THE LIFE AND DEATH OF SOCRATES HAD LIKEWISE BEEN DEVOTED TO THE CAUSE OF RELIGION AND JUSTICE AND ALTHOUGH THE STOIC OR THE HERO MAY DISDAIN THE HUMBLE VIRTUES OF JESUS THE TEARS WHICH HE SHED OVER HIS FRIEND AND COUNTRY MAY BE ESTEEMED THE PUREST EVIDENCE OF HIS HUMANITY +A FOETUS THAT COULD INCREASE FROM AN INVISIBLE POINT TO ITS FULL MATURITY A CHILD THAT COULD ATTAIN THE STATURE OF PERFECT MANHOOD WITHOUT DERIVING ANY NOURISHMENT FROM THE ORDINARY SOURCES MIGHT CONTINUE TO EXIST WITHOUT REPAIRING A DAILY WASTE BY A DAILY SUPPLY OF EXTERNAL MATTER +YET THE MOST CHARITABLE CRITICISM MUST REFUSE THESE SECTARIES ANY KNOWLEDGE OF THE PURE AND PROPER DIVINITY OF CHRIST +HIS PROGRESS FROM INFANCY TO YOUTH AND MANHOOD WAS MARKED BY A REGULAR INCREASE IN STATURE AND WISDOM AND AFTER A PAINFUL AGONY OF MIND AND BODY HE EXPIRED ON THE CROSS +THEIR MURMURS WERE VARIOUSLY SILENCED BY THE SECTARIES WHO ESPOUSED AND MODIFIED THE DOUBLE SYSTEM OF CERINTHUS +WHEN THE MESSIAH WAS DELIVERED INTO THE HANDS OF THE JEWS THE CHRIST AN IMMORTAL AND IMPASSIBLE BEING FORSOOK HIS EARTHLY TABERNACLE FLEW BACK TO THE PLEROMA OR WORLD OF SPIRITS AND LEFT THE SOLITARY JESUS TO SUFFER TO COMPLAIN AND TO EXPIRE +HE ACQUIESCED IN THE OLD DISTINCTION OF THE GREEK PHILOSOPHERS BETWEEN THE RATIONAL AND SENSITIVE SOUL OF MAN THAT HE MIGHT RESERVE THE LOGOS FOR INTELLECTUAL FUNCTIONS AND EMPLOY THE SUBORDINATE HUMAN PRINCIPLE IN THE MEANER ACTIONS OF ANIMAL LIFE +MANY AMONG THE GENTILE PROSELYTES REFUSED TO BELIEVE THAT A CELESTIAL SPIRIT AN UNDIVIDED PORTION OF THE FIRST ESSENCE HAD BEEN PERSONALLY UNITED WITH A MASS OF IMPURE AND CONTAMINATED FLESH AND IN THEIR ZEAL FOR THE DIVINITY THEY PIOUSLY ABJURED THE HUMANITY OF CHRIST +NOR COULD IT SEEM STRANGE OR INCREDIBLE THAT THE FIRST OF THESE AEONS THE LOGOS OR WORD OF GOD OF THE SAME SUBSTANCE WITH THE FATHER SHOULD DESCEND UPON EARTH TO DELIVER THE HUMAN RACE FROM VICE AND ERROR AND TO CONDUCT THEM IN THE PATHS OF LIFE AND IMMORTALITY +IN THEIR EYES JESUS OF NAZARETH WAS A MERE MORTAL THE LEGITIMATE SON OF JOSEPH AND MARY BUT HE WAS THE BEST AND WISEST OF THE HUMAN RACE SELECTED AS THE WORTHY INSTRUMENT TO RESTORE UPON EARTH THE WORSHIP OF THE TRUE AND SUPREME DEITY +THE WORTHY FRIEND OF ATHANASIUS THE WORTHY ANTAGONIST OF JULIAN HE BRAVELY WRESTLED WITH THE ARIANS AND POLYTHEISTS AND THOUGH HE AFFECTED THE RIGOR OF GEOMETRICAL DEMONSTRATION HIS COMMENTARIES REVEALED THE LITERAL AND ALLEGORICAL SENSE OF THE SCRIPTURES +BUT THE JUSTICE AND GENEROSITY OF SUCH A DESERTION ARE STRONGLY QUESTIONABLE AND THE FATE OF AN INNOCENT MARTYR AT FIRST IMPELLED AND AT LENGTH ABANDONED BY HIS DIVINE COMPANION MIGHT PROVOKE THE PITY AND INDIGNATION OF THE PROFANE +UNDER THE TUITION OF THE ABBOT SERAPION HE APPLIED HIMSELF TO ECCLESIASTICAL STUDIES WITH SUCH INDEFATIGABLE ARDOR THAT IN THE COURSE OF ONE SLEEPLESS NIGHT HE HAS PERUSED THE FOUR GOSPELS THE CATHOLIC EPISTLES AND THE EPISTLE TO THE ROMANS +THE SON OF A VIRGIN GENERATED BY THE INEFFABLE OPERATION OF THE HOLY SPIRIT WAS A CREATURE WITHOUT EXAMPLE OR RESEMBLANCE SUPERIOR IN EVERY ATTRIBUTE OF MIND AND BODY TO THE CHILDREN OF ADAM +THEIR CHURCHES HAVE DISAPPEARED THEIR BOOKS ARE OBLITERATED THEIR OBSCURE FREEDOM MIGHT ALLOW A LATITUDE OF FAITH AND THE SOFTNESS OF THEIR INFANT CREED WOULD BE VARIOUSLY MOULDED BY THE ZEAL OR PRUDENCE OF THREE HUNDRED YEARS +YET AS THE PROFOUND DOCTOR HAD BEEN TERRIFIED AT HIS OWN RASHNESS APOLLINARIS WAS HEARD TO MUTTER SOME FAINT ACCENTS OF EXCUSE AND EXPLANATION +BUT INSTEAD OF A TEMPORARY AND OCCASIONAL ALLIANCE THEY ESTABLISHED AND WE STILL EMBRACE THE SUBSTANTIAL INDISSOLUBLE AND EVERLASTING UNION OF A PERFECT GOD WITH A PERFECT MAN OF THE SECOND PERSON OF THE TRINITY WITH A REASONABLE SOUL AND HUMAN FLESH +YOU'VE GOT A BIRTHDAY PRESENT THIS TIME JIM AND NO MISTAKE +THE WEEK FOLLOWING CHRISTMAS BROUGHT IN A THAW AND BY NEW YEAR'S DAY ALL THE WORLD ABOUT US WAS A BROTH OF GRAY SLUSH AND THE GUTTERED SLOPE BETWEEN THE WINDMILL AND THE BARN WAS RUNNING BLACK WATER +IT WAS THE FIRST TIME MISSUS SHIMERDA HAD BEEN TO OUR HOUSE AND SHE RAN ABOUT EXAMINING OUR CARPETS AND CURTAINS AND FURNITURE ALL THE WHILE COMMENTING UPON THEM TO HER DAUGHTER IN AN ENVIOUS COMPLAINING TONE +THEY BEGAN TO LAUGH BOISTEROUSLY WHEN THEY SAW ME CALLING +BUT YOU SEE A BODY NEVER KNOWS WHAT TRAITS POVERTY MIGHT BRING OUT IN EM +YOUR MAMA I SAID ANGRILY WANTS OTHER PEOPLE'S THINGS +FOR AMBROSCH MY MAMA COME HERE +THE BOARD NOT SO FORMIDABLE AS SHE HAD IMAGINED HAD INQUIRED INTO HER CASE AND INSTEAD OF SENDING HER TO STOKE CLAYPOLE HER HUSBAND'S BUCKINGHAMSHIRE PARISH AS SHE HAD DREADED HAD AGREED TO PAY HER RENT +THE GHOUL LIKE FEVER WAS NOT TO BE BRAVED WITH IMPUNITY AND BAULKED OF ITS PREY +AFORE CHRISTMAS TIME I WAS AS FULL AS FULL COULD BE OF GOING HOME FOR GOOD AND ALL YO HAN HEARD HOW I'VE WISHED IT THIS TERRIBLE LONG TIME +BUT THE BEST OF HER PLANS THE HOLIEST THAT WHICH IN SOME MEASURE REDEEMED THE VANITY OF THE REST WERE THOSE RELATING TO HER FATHER HER DEAR FATHER NOW OPPRESSED WITH CARE AND ALWAYS A DISHEARTENED GLOOMY PERSON +THEN ALICE BROKE THE SILENCE BY SAYING +HER CRIES BROUGHT HER HUSBAND DOWN TO TRY WITH HIS ACHING HEART TO COMFORT HERS +IS THERE ANY CHANCE FOR THE OTHER ONE THINK YOU +BUT HE STAYED LONG THERE AND AT LAST HIS STURDY FRAME SHOOK WITH HIS STRONG AGONY +HER THOUGHTS RAN ON JEM'S MANNER AND WORDS NOT BUT WHAT SHE HAD KNOWN THE TALE THEY TOLD FOR MANY A DAY BUT STILL SHE WISHED HE HAD NOT PUT IT SO PLAINLY +MARY AND ALICE DREW NEAR THE FIRE AND STOOD IN QUIET SORROW FOR SOME TIME +THERE WAS SOMETHING OF KEEN PRACTICAL SHREWDNESS ABOUT HER WHICH CONTRASTED VERY BEWITCHINGLY WITH THE SIMPLE FOOLISH UNWORLDLY IDEAS SHE HAD PICKED UP FROM THE ROMANCES WHICH MISS SIMMONDS YOUNG LADIES WERE IN THE HABIT OF RECOMMENDING TO EACH OTHER YES +THE OLD LEAVEN INFUSED YEARS AGO BY HER AUNT ESTHER FERMENTED IN HER LITTLE BOSOM AND PERHAPS ALL THE MORE FOR HER FATHER'S AVERSION TO THE RICH AND THE GENTLE +SHE OPENED THE DOOR SOFTLY THERE SAT MISSUS WILSON IN THE OLD ROCKING CHAIR WITH ONE SICK DEATH LIKE BOY LYING ON HER KNEE CRYING WITHOUT LET OR PAUSE BUT SOFTLY GENTLY AS FEARING TO DISTURB THE TROUBLED GASPING CHILD WHILE BEHIND HER OLD ALICE LET HER FAST DROPPING TEARS FALL DOWN ON THE DEAD BODY OF THE OTHER TWIN WHICH SHE WAS LAYING OUT ON A BOARD PLACED ON A SORT OF SOFA SETTEE IN A CORNER OF THE ROOM +BUT EARNEST AS THE FATHER WAS IN WATCHING THE YET LIVING HE HAD EYES AND EARS FOR ALL THAT CONCERNED THE DEAD AND SPRANG GENTLY UP AND TOOK HIS DEAD SON ON HIS HARD COUCH IN HIS ARMS WITH TENDER STRENGTH AND CARRIED HIM UPSTAIRS AS IF AFRAID OF WAKENING HIM +MARY I ALMOST LOATHE MYSELF WHEN I FEEL I WOULD NOT GIVE UP THIS MINUTE WHEN MY BROTHERS LIE DEAD AND FATHER AND MOTHER ARE IN SUCH TROUBLE FOR ALL MY LIFE THAT'S PAST AND GONE AND MARY AS SHE TRIED TO RELEASE HER HAND YOU KNOW WHAT MAKES ME FEEL SO BLESSED +DON'T JEM PLEASE DON'T WHISPERED SHE AGAIN BELIEVING THAT HIS SILENCE WAS ONLY ANOTHER FORM OF GRIEF +HE REMAINED UP STAIRS UNTIL AFTER THE EARLY DAWN SHOWED MARY THAT SHE NEED HAVE NO FEAR OF GOING HOME THROUGH THE DESERTED AND QUIET STREETS TO TRY AND GET A LITTLE SLEEP BEFORE WORK HOUR +OH JEM DON'T GIVE WAY SO I CANNOT BEAR TO SEE YOU +SHE STOPPED WITH HER HAND ON THE LATCH OF THE WILSONS DOOR TO STILL HER BEATING HEART AND LISTENED TO THE HUSHED QUIET WITHIN +MARGARET MET JEM WILSON SEVERAL DAYS AFTER HIS BROTHERS WERE SERIOUSLY ILL AND HEARD FROM HIM THE STATE OF THINGS AT HIS HOME +OVER THE CHILD WHICH YET BREATHED THE FATHER BENT WATCHING ANXIOUSLY FOR SOME GROUND OF HOPE WHERE HOPE THERE WAS NONE +SO LEAVING KIND MESSAGES TO GEORGE AND JANE WILSON AND HESITATING WHETHER SHE MIGHT DARE TO SEND A FEW KIND WORDS TO JEM AND DECIDING THAT SHE HAD BETTER NOT SHE STEPPED OUT INTO THE BRIGHT MORNING LIGHT SO FRESH A CONTRAST TO THE DARKENED ROOM WHERE DEATH HAD BEEN +WHAT BANKRUPTS IN THE WORLD WE FEEL WHEN DEATH LIKE SOME REMORSELESS CREDITOR SEIZES ON ALL WE FONDLY THOUGHT OUR OWN THE TWINS +THEN THE MOTHER LIFTED UP HER VOICE AND WEPT +IT WAS A COMFORT TO HER WHEN SCOLDED BY MISS SIMMONDS TO THINK OF THE DAY WHEN SHE WOULD DRIVE UP TO THE DOOR IN HER OWN CARRIAGE TO ORDER HER GOWNS FROM THE HASTY TEMPERED YET KIND DRESSMAKER +HE DID NOT SPEAK AS THOUGH FEARING TO DESTROY BY SOUND OR MOTION THE HAPPINESS OF THAT MOMENT WHEN HER SOFT HAND'S TOUCH THRILLED THROUGH HIS FRAME AND HER SILVERY VOICE WAS WHISPERING TENDERNESS IN HIS EAR +I THINK I CANNOT GO RIGHT FOR I EITHER CHECK MYSELF TILL I'M DOWNRIGHT CROSS TO HIM OR ELSE I SPEAK JUST NATURAL AND THAT'S TOO KIND AND TENDER BY HALF +HOW INFINITE THE WEALTH OF LOVE AND HOPE GARNERED IN THESE SAME TINY TREASURE HOUSES AND OH +WISHING HIM SAID MARY IN A TONE OF INQUIRY +I CANNOT THINK WHAT POSSESSES ME THAT I MUST ALWAYS BE WANTING TO COMFORT HIM WHEN HE'S DOWNCAST AND THAT I MUST GO MEDDLING WI HIM TO NIGHT WHEN SURE ENOUGH IT WAS HIS AUNT'S PLACE TO SPEAK TO HIM +BUT WILL HE THANK ME FOR IT +I PUT ON MY CAP AND RAN OUT TO MEET JAKE +ON THE WHITE PAGES I GROUPED SUNDAY SCHOOL CARDS AND ADVERTISING CARDS WHICH I HAD BROUGHT FROM MY OLD COUNTRY +ANYWAY HE WOULD NEVER ALLOW ONE OF HIS HORSES TO BE PUT TO SUCH A STRAIN +THEY SAT ABOUT THE HOUSE MOST OF THE DAY AS IF IT WERE SUNDAY GREASING THEIR BOOTS MENDING THEIR SUSPENDERS PLAITING WHIPLASHES +I CAN SEE THEM NOW EXACTLY AS THEY LOOKED WORKING ABOUT THE TABLE IN THE LAMPLIGHT JAKE WITH HIS HEAVY FEATURES SO RUDELY MOULDED THAT HIS FACE SEEMED SOMEHOW UNFINISHED OTTO WITH HIS HALF EAR AND THE SAVAGE SCAR THAT MADE HIS UPPER LIP CURL SO FEROCIOUSLY UNDER HIS TWISTED MUSTACHE +SHE CUT SQUARES OF COTTON CLOTH AND WE SEWED THEM TOGETHER INTO A BOOK +BY THE TIME WE HAD PLACED THE COLD FRESH SMELLING LITTLE TREE IN A CORNER OF THE SITTING ROOM IT WAS ALREADY CHRISTMAS EVE +I HAD WANTED TO GET SOME PICTURE BOOKS FOR YULKA AND ANTONIA EVEN YULKA WAS ABLE TO READ A LITTLE NOW +HE USED TO HELP MY FATHER CUT CHRISTMAS TREES FOR ME IN VIRGINIA AND HE HAD NOT FORGOTTEN HOW MUCH I LIKED THEM +WHEN HE MOUNTED HIS HORSE AT THE DOOR I SAW THAT HE HAD A HATCHET SLUNG TO HIS BELT AND HE GAVE GRANDMOTHER A MEANING LOOK WHICH TOLD ME HE WAS PLANNING A SURPRISE FOR ME +FROM UNDER THE LINING HE NOW PRODUCED A COLLECTION OF BRILLIANTLY COLORED PAPER FIGURES SEVERAL INCHES HIGH AND STIFF ENOUGH TO STAND ALONE +BECAUSE HE TALKED SO LITTLE HIS WORDS HAD A PECULIAR FORCE THEY WERE NOT WORN DULL FROM CONSTANT USE +HIS FACE HAD A LOOK OF WEARINESS AND PLEASURE LIKE THAT OF SICK PEOPLE WHEN THEY FEEL RELIEF FROM PAIN +HE MADE THE SIGN OF THE CROSS OVER ME PUT ON HIS CAP AND WENT OFF IN THE DARK +HE GAVE THANKS FOR OUR FOOD AND COMFORT AND PRAYED FOR THE POOR AND DESTITUTE IN GREAT CITIES WHERE THE STRUGGLE FOR LIFE WAS HARDER THAN IT WAS HERE WITH US +GRANDFATHER CAME DOWN WEARING A WHITE SHIRT AND HIS SUNDAY COAT +MORNING PRAYERS WERE LONGER THAN USUAL +HE SAT STILL AND PASSIVE HIS HEAD RESTING AGAINST THE BACK OF THE WOODEN ROCKING CHAIR HIS HANDS RELAXED UPON THE ARMS +AT ABOUT FOUR O'CLOCK A VISITOR APPEARED MISTER SHIMERDA WEARING HIS RABBIT SKIN CAP AND COLLAR AND NEW MITTENS HIS WIFE HAD KNITTED +ALL AFTERNOON HE SAT IN THE DINING ROOM +I WISH WE HAD NOT LEFT SO SOON +THE SUGGESTION HE HAD LAUGHED AT WAS NOT SO ENTIRELY FOOLISH AS HE HAD BEEN PLEASED TO CONSIDER IT +THE BOYS LOOK WIDE AWAKE ENOUGH IF THE FATHER DOES NOT +I KNOW IT SOUNDS FOOLISH BUT THE ALTERNATIVE IS SO IMPROBABLE +BEEN OVER THE GROUND STUDIED THE AFFAIR CAREFULLY +AT LEAST THAT IS WHAT WE HOPE +HE APPEARED TO KNOW FOR HE TOLD ME AT ONCE THAT HE WAS DETECTIVE GRYCE A MAN WHO HAD GROWN OLD IN SOLVING JUST SUCH BAFFLING PROBLEMS AS THESE +THIS SWEETWATER AS THEY CALLED HIM WAS I HAVE SINCE UNDERSTOOD ONE OF HIS PROTEGES AND MORE OR LESS OF A FAVOURITE +THERE WAS NO PONIARD IN THE WOUND +I EMPHASISED COMPLACENTLY +IT HAS NOT BEEN RUNNING SINCE LAST NIGHT OR IT WOULD BE FULL OF CURIOUS PEOPLE ALL THE TIME HUSTLING TO GET A GLIMPSE OF THIS PLACE +GEORGE +BUT VIGOUR RETURNED TO HIM BEFORE HE HAD WELL REACHED THE DOOR AND HE SHOWED SOME OF HIS OLD SPIRIT AS HE THANKED MISS CLARKE AND TURNED TO TAKE THE ELEVATOR +THIS IS VERY GOOD OF YOU HE BEGAN GLANCING DOWN AT THE AGED DETECTIVE'S BUNDLED UP LEGS AND GENTLY PUSHING A CHAIR TOWARDS HIM +THE NEXT MINUTE SHE WAS IN THIS LADY'S ARMS +THE OLD MAN'S EYES SHOT FIRE AND UNCONSCIOUSLY ONE FOOT SLIPPED TO THE FLOOR +I'LL WAIT HERE TILL YOU'RE READY EXPLAIN YOURSELF TO THE LADY TELL HER I'M AN OLD AND RHEUMATIC INVALID WHO HAS BEEN USED TO ASKING HIS OWN QUESTIONS +VERY GOOD MANAGE IT AS YOU WILL +HAVE YOU EVER THOUGHT THAT SHE MIGHT HAVE BEEN A SUICIDE +I KNOW SHE SAID WHAT YOU ARE GOING TO ASK ME NOW +YES MANY TIMES +GEORGE NODDED +IN OLDEN DAYS THEY WOULD HAVE SAID STRUCK BY A BOLT FROM HEAVEN +I SUPPOSE SHE HAS BEEN CAREFULLY QUESTIONED VERY I SHOULD SAY +I TOOK QUITE A FANCY TO HIM WHY +ONE OR TWO OF THE MUSICIANS FROM THE END OF THE HALL +NOT ALTOGETHER BY ME +NOT TILL THE DOCTOR CAME HER DOCTOR WHO WAS HAPPILY IN HIS OFFICE IN THIS VERY BUILDING +SWEETWATER SOMEONE DREW THAT WEAPON OUT +DO THEY STILL INSIST THAT MISS CHALLONER WAS THE ONLY PERSON IN THE ROOM WITH THEM AT THIS TIME +I ASKED AS SOON AS GEORGE HAD RETURNED TO MY SIDE +BUT CLEWS THERE ARE ABSOLUTELY NONE +WHEN WE TOOK OUR SEATS AT THE BREAKFAST TABLE IT WAS WITH THE FEELING OF BEING NO LONGER LOOKED UPON AS CONNECTED IN ANY WAY WITH THIS CASE +AND SHE SPEAKS OF NO WEAPON +WHO CAME NEXT ON THE SCENE SOME PEOPLE FROM THE LOBBY +I INQUIRED OF GEORGE WITH MY EYES STILL ON THIS FURTIVE WATCHER +I SHOULD LIKE TO SEE THE DESK YOU SPEAK OF AND THE SPOT WHERE SHE FELL +MISS CLARKE STARTED AND HER SWEET FACE SHOWED A MOMENT'S PERPLEXITY DID I SHE QUERIED MUSINGLY +WELL WELL THAT'S HONEST AT ALL EVENTS +HE WAS THE PLAIN FACED DETECTIVE WHO HAD SPOKEN TO GEORGE +I AM LOOKING AT HIM NOW +THE BOYS BELONG TO THE GENTLEMAN WHO IS A WIDOWER +THE TRAIL HERE MUST BE A VERY BLIND ONE FOR THEM TO CALL HIM IN +THERE WAS NO DOUBTING THEM IN THIS INSTANCE +IT'S THE MOST INEXPLICABLE THERE +A YOUNG FELLOW WHO HAD BEEN HOVERING IN THE BACKGROUND AT ONCE STEPPED FORWARD +WHETHER HE GOT ANYTHING ELSE IT WOULD BE IMPOSSIBLE TO SAY FROM HIS MANNER AS HE FINALLY SANK INTO A CHAIR BY ONE OF THE OPENINGS AND LOOKED DOWN ON THE LOBBY BELOW +OLD DAYS DON'T RETURN FOR THE ASKING +NO DOUBT +NO WEAPON PROTRUDED FROM THE WOUND NOR WAS ANY FOUND ON OR NEAR HER IN THE MEZZANINE WHAT FOLLOWS +THE BOYS LOOK WIDE AWAKE ENOUGH BUT WHO CAN TELL I WOULD SOONER BELIEVE THAT +BUT THEY'LL PUT A MAN ON FOR YOU +NO A VERY NATURAL ONE I SHOULD SAY +YES +MARK SOWERBY AND CLAUS HENNERBERG +IT WAS ONE WHICH GAVE ME A SMALL TRIUMPH OVER GEORGE +THE TIME IS NARROWED DOWN TO ONE AND IN THAT ONE MISS CLARKE WAS THE ONLY PERSON TO TOUCH HER +WHEREVER SHE PLEASES ONLY I CAN'T WALK FAR +A MAN WAS LOOKING IN FROM THE CORRIDOR BEHIND AT THE FOUR PERSONS WE WERE JUST DISCUSSING +WHAT DO YOU MAKE OF IT GRYCE +WHAT MADE THE DIFFERENCE +JUST AN EVERYDAY DETECTIVE BUT AMBITIOUS I SUPPOSE AND QUITE ALIVE TO THE IMPORTANCE OF BEING THOROUGH +NO WORD NO CRY JUST A COLLAPSE AND SUDDEN FALL +SWEETWATER HELP ME OUT OF THIS +YES MISS CLARKE THE MIDDLE AGED LADY WITH THE PARRISHES +IT'S A CASE IN A THOUSAND GRYCE +YES MISTER SLATER THE ASSISTANT MANAGER WHO WAS IN THE LOBBY AT THE TIME SAYS THAT TEN MINUTES AT LEAST MUST HAVE ELAPSED +HONEST GERMANS MEN WHO HAVE PLAYED HERE FOR YEARS +HE WANTS ME TO STAND READY TO OBEY ANY SUMMONS THE POLICE MAY SEND ME +HOWEVER A LITTLE LATER WE HAD A COMFORTABLE CHAT +THAT IS WE HAVE NOT BEEN ABLE TO FIND ANY PERHAPS YOU CAN +ANYBODY BEFORE THE FATHER CAME IN +THEIR GREETING WAS CORDIAL AND THE LINES ON THE LATTER'S FACE RELAXED A LITTLE AS HE MET THE STILL BRIGHT EYE OF THE MAN UPON WHOSE INSTINCT AND JUDGMENT SO MUCH RELIANCE HAD ALWAYS BEEN PLACED +INSTANTLY THEY ABSORBED ALL MY ATTENTION THOUGH I DARED NOT GIVE THEM A DIRECT LOOK AND CONTINUED TO OBSERVE THEM ONLY IN THE GLASS +FOR SOME LITTLE TIME THAT IS IT SEEMED LONG THOUGH I BELIEVE IT WAS NOT MORE THAN A MINUTE BEFORE TWO MEN CAME RUNNING FROM THE MUSICIANS GALLERY +AND THE GLANCE SHE CAST HIM WHILE NOT MEETING HIS EYE SHOWED THAT SHE UNDERSTOOD THE IMPORTANCE OF THE ADMISSION +IT DID NOT FALL UPON THE FLOOR AROUND HER THEREFORE IT FLEW THROUGH ONE OF THOSE OPENINGS INTO THE LOBBY AND THERE IT EITHER WILL BE OR HAS BEEN FOUND +SHE HAD NO COMPANION NEAR HER +WHAT DOES HE WANT +THE LADY IS NOT THE MOTHER OF THE BOYS BUT THEIR AUNT +HE WAS LATE OF COURSE BUT WHEN HE DID APPEAR I ALMOST FORGOT OUR USUAL GREETING IN MY HURRY TO ASK HIM IF HE HAD SEEN THE EVENING PAPERS +I WILL TROUBLE YOU NO FURTHER +AS HER QUIET FIGURE APPEARED IN THE DOORWAY SWEETWATER STOLE A GLANCE AT MISTER GRYCE +NATURALLY THEY REACHED HER FIRST +BUT I'M IN NO POSITION TO MAKE PROMISES +HE GAVE UP WORK SOME TIME AGO I HAVE BEEN TOLD MY HUSBAND WENT ON BUT EVIDENTLY A GREAT CASE STILL HAS ITS ALLUREMENT FOR HIM +YES AND A VERY RESPECTABLE ONE +SHE STRUCK THE BLOW HERSELF AND THE STRENGTH OF PURPOSE WHICH LED HER TO DO THIS GAVE HER THE ADDITIONAL FORCE TO PULL THE WEAPON OUT AND FLING IT FROM HER +VERY WELL THEN YOU'RE IN A POSITION TO PIONEER ME +YES HE'S MERCURIAL IN ALL HIS MOVEMENTS +IT WILL BE WELL TO STATE IN THE BEGINNING OF THIS RECIPE THAT FRENCH FORCEMEAT OR QUENELLES CONSIST OF THE BLENDING OF THREE SEPARATE PROCESSES NAMELY PANADA UDDER AND WHATEVER MEAT YOU INTEND USING PANADA +MODE MIX ALL THE INGREDIENTS WELL TOGETHER CAREFULLY MINCING THEM VERY FINELY BEAT UP THE EGG MOISTEN WITH IT AND WORK THE WHOLE VERY SMOOTHLY TOGETHER +SIMMER FOR A MINUTE OR TWO AND SERVE IN A TUREEN +LEMON JUICE MAY BE ADDED AT PLEASURE +THE GINGER PLANT KNOWN TO NATURALISTS AS ZINGIBER OFFICINALE IS A NATIVE OF THE EAST AND WEST INDIES +ILLUSTRATION SAGE +MODE CUT UP THE ONION AND CARROT INTO SMALL RINGS AND PUT THEM INTO A STEWPAN WITH THE HERBS MUSHROOMS BAY LEAF CLOVES AND MACE ADD THE BUTTER AND SIMMER THE WHOLE VERY GENTLY OVER A SLOW FIRE UNTIL THE ONION IS QUITE TENDER +THEN ADD THE YOLKS OF THE EGGS WELL BEATEN STIR THEM TO THE SAUCE BUT DO NOT ALLOW IT TO BOIL AND SERVE VERY HOT +IF THE QUENELLES ARE NOT FIRM ENOUGH ADD THE YOLK OF ANOTHER EGG BUT OMIT THE WHITE WHICH ONLY MAKES THEM HOLLOW AND PUFFY INSIDE +ILLUSTRATION THE LEMON +MODE PARE AND SLICE THE CUCUMBERS AS FOR THE TABLE SPRINKLE WELL WITH SALT AND LET THEM REMAIN FOR TWENTY FOUR HOURS STRAIN OFF THE LIQUOR PACK IN JARS A THICK LAYER OF CUCUMBERS AND SALT ALTERNATELY TIE DOWN CLOSELY AND WHEN WANTED FOR USE TAKE OUT THE QUANTITY REQUIRED +ILLUSTRATION LONG PEPPER +IF IT SHOULD BE IN AN UNSOUND STATE IT MUST BE ON NO ACCOUNT MADE USE OF +LONG PEPPER THIS IS THE PRODUCE OF A DIFFERENT PLANT FROM THAT WHICH PRODUCES THE BLACK IT CONSISTING OF THE HALF RIPE FLOWER HEADS OF WHAT NATURALISTS CALL PIPER LONGUM AND CHABA +ILLUSTRATION GINGER +WHEN IT IS SUFFICIENTLY THICK TAKE IT OFF AS IT SHOULD NOT BOIL +THE FAT THEY ARE FRIED IN SHOULD BE CLEAR AND THE CRUMBS SHOULD NOT HAVE THE SLIGHTEST APPEARANCE OR TASTE OF HAVING BEEN IN THE LEAST DEGREE BURNT +OTHER SWEET HERBS ARE CULTIVATED FOR PURPOSES OF MEDICINE AND PERFUMERY THEY ARE MOST GRATEFUL BOTH TO THE ORGANS OF TASTE AND SMELLING AND TO THE AROMA DERIVED FROM THEM IS DUE IN A GREAT MEASURE THE SWEET AND EXHILARATING FRAGRANCE OF OUR FLOWERY MEADS +BOIL FOR FIVE MINUTES MINCE IT VERY SMALL AND MIX IT WITH THE OTHER INGREDIENTS +NOTE THE WINE IN THIS SAUCE MAY BE OMITTED AND AN ONION SLICED AND FRIED OF A NICE BROWN SUBSTITUTED FOR IT +ILLUSTRATION THE CUCUMBER +SOME SPRINGS ARE SO HIGHLY IMPREGNATED WITH SALT AS TO HAVE RECEIVED THE NAME OF BRINE SPRINGS AND ARE SUPPOSED TO HAVE BECOME SO BY PASSING THROUGH THE SALT ROCKS BELOW GROUND AND THUS DISSOLVING A PORTION OF THIS MINERAL SUBSTANCE +CONTINUE IN THIS MANNER TILL THE BORDER IS COMPLETED ARRANGING THE SIPPETS A PALE AND A DARK ONE ALTERNATELY +SEASONABLE THIS RECIPE SHOULD BE USED IN JUNE JULY OR AUGUST +ILLUSTRATION BASIL +MODE CHOOSE THE GREENEST CUCUMBERS AND THOSE THAT ARE MOST FREE FROM SEEDS PUT THEM IN STRONG SALT AND WATER WITH A CABBAGE LEAF TO KEEP THEM DOWN TIE A PAPER OVER THEM AND PUT THEM IN A WARM PLACE TILL THEY ARE YELLOW THEN WASH THEM AND SET THEM OVER THE FIRE IN FRESH WATER WITH A VERY LITTLE SALT AND ANOTHER CABBAGE LEAF OVER THEM COVER VERY CLOSELY BUT TAKE CARE THEY DO NOT BOIL +ORIGINALLY THE MOST VALUABLE OF THESE WERE FOUND IN THE SPICE ISLANDS OR MOLUCCAS OF THE INDIAN OCEAN AND WERE HIGHLY PRIZED BY THE NATIONS OF ANTIQUITY +SUFFICIENT TO SERVE WITH FIVE OR SIX MACKEREL +PUT THE SUGAR WITH ONE QUARTER PINT OF WATER IN A SAUCEPAN OVER THE FIRE REMOVE THE SCUM AS IT RISES AND ADD THE LEMON PEEL AND GINGER WITH THE OUTSIDE SCRAPED OFF WHEN THE SYRUP IS TOLERABLY THICK TAKE IT OFF THE FIRE AND WHEN COLD WIPE THE CUCUMBERS DRY AND PUT THEM IN +BEAT THE YOLKS OF THE OTHER TWO EGGS ADD THEM WITH A LITTLE FLOUR AND SALT TO THOSE POUNDED MIX ALL WELL TOGETHER AND ROLL INTO BALLS +MODE PUT THE MILK IN A VERY CLEAN SAUCEPAN AND LET IT BOIL +WHEN QUITE CRISP DIP ONE SIDE OF THE SIPPET INTO THE BEATEN WHITE OF AN EGG MIXED WITH A LITTLE FLOUR AND PLACE IT ON THE EDGE OF THE DISH +IT IS A NATIVE OF PORTUGAL AND WHEN ITS LEAVES ARE USED AS A SEASONING HERB THEY HAVE AN AGREEABLE AROMATIC FLAVOUR +THE LEMON THIS FRUIT IS A NATIVE OF ASIA AND IS MENTIONED BY VIRGIL AS AN ANTIDOTE TO POISON +SUFFICIENT FOR A MODERATE SIZED HADDOCK OR PIKE +SOLID ROCKS OF SALT ARE ALSO FOUND IN VARIOUS PARTS OF THE WORLD AND THE COUNTY OF CHESTER CONTAINS MANY OF THESE MINES AND IT IS FROM THERE THAT MUCH OF OUR SALT COMES +FORCEMEAT FOR COLD SAVOURY PIES +PUT THE UDDER INTO A STEWPAN WITH SUFFICIENT WATER TO COVER IT LET IT STEW GENTLY TILL QUITE DONE WHEN TAKE IT OUT TO COOL +FRIED BREAD FOR BORDERS +MODE PUT THE WHOLE OF THE INGREDIENTS INTO A BOTTLE AND LET IT REMAIN FOR A FORTNIGHT IN A WARM PLACE OCCASIONALLY SHAKING UP THE CONTENTS +VARIOUS DISHES ARE FREQUENTLY ORNAMENTED AND GARNISHED WITH ITS GRACEFUL LEAVES AND THESE ARE SOMETIMES BOILED IN SOUPS ALTHOUGH IT IS MORE USUALLY CONFINED IN ENGLISH COOKERY TO THE MACKEREL SAUCE AS HERE GIVEN +THEY OUGHT TO BE TAKEN UP IN THE AUTUMN AND WHEN DRIED IN THE HOUSE WILL KEEP TILL SPRING +THIS JUICE WHICH IS CALLED CITRIC ACID MAY BE PRESERVED IN BOTTLES FOR A CONSIDERABLE TIME BY COVERING IT WITH A THIN STRATUM OF OIL +FRIED BREAD CRUMBS +NOW BEAT AND STRAIN THE EGGS WORK THESE UP WITH THE OTHER INGREDIENTS AND THE FORCEMEAT WILL BE READY FOR USE +TO PICKLE EGGS +PLACE THE JUG IN A SAUCEPAN OF BOILING WATER KEEP STIRRING WELL UNTIL IT THICKENS BUT DO NOT ALLOW IT TO BOIL OR IT WILL CURDLE +POUND WELL AND BIND WITH ONE OR TWO EGGS WHICH HAVE BEEN PREVIOUSLY BEATEN AND STRAINED +IT IS HARDIER THAN THE ORANGE AND AS ONE OF THE CITRON TRIBE WAS BROUGHT INTO EUROPE BY THE ARABIANS +THE LEMON WAS FIRST CULTIVATED IN ENGLAND IN THE BEGINNING OF THE SEVENTEENTH CENTURY AND IS NOW OFTEN TO BE FOUND IN OUR GREEN HOUSES +FRENCH FORCEMEAT +A STORE OF PICKLED EGGS WILL BE FOUND VERY USEFUL AND ORNAMENTAL IN SERVING WITH MANY FIRST AND SECOND COURSE DISHES +ADD THE WINE AND IF NECESSARY A SEASONING OF CAYENNE WHEN IT WILL BE READY TO SERVE +PLACE IT OVER THE FIRE KEEP CONSTANTLY STIRRING TO PREVENT ITS BURNING AND WHEN QUITE DRY PUT IN A SMALL PIECE OF BUTTER +ANY ONE WITH THE SLIGHTEST PRETENSIONS TO REFINED COOKERY MUST IN THIS PARTICULAR IMPLICITLY FOLLOW THE EXAMPLE OF OUR FRIENDS ACROSS THE CHANNEL +ILLUSTRATION PESTLE AND MORTAR +WHEN THE THREE INGREDIENTS ARE PROPERLY PREPARED POUND THEM ALTOGETHER IN A MORTAR FOR SOME TIME FOR THE MORE QUENELLES ARE POUNDED THE MORE DELICATE THEY ARE +IN JAMAICA IT FLOWERS ABOUT AUGUST OR SEPTEMBER FADING ABOUT THE END OF THE YEAR +THE LONG PEPPER IS LESS AROMATIC THAN THE BLACK BUT ITS OIL IS MORE PUNGENT +SUFFICIENT HALF THIS QUANTITY FOR TWO SLICES OF SALMON +SEASONABLE THIS SHOULD BE MADE ABOUT EASTER AS AT THIS TIME EGGS ARE PLENTIFUL AND CHEAP +BOIL THEM BEFORE THEY ARE PUT INTO THE SOUP OR OTHER DISH THEY MAY BE INTENDED FOR +BEAT THE EGGS STIR TO THEM THE MILK AND POUNDED SUGAR AND PUT THE MIXTURE INTO A JUG +ILLUSTRATION MARJORAM +SOMETHING OF THEIR TROUBLING SWEETNESS CAME BACK TO ALEXANDER TOO +DON'T CRY DON'T CRY HE WHISPERED +HILDA'S FACE QUIVERED BUT SHE WHISPERED YES I THINK IT MUST HAVE BEEN +SHE LOOKED AT HIS HEAVY SHOULDERS AND BIG DETERMINED HEAD THRUST FORWARD LIKE A CATAPULT IN LEASH +SHE BIT HER LIP AND LOOKED DOWN AT HER HANDS WHICH WERE CLASPED TIGHTLY IN FRONT OF HER +YOU ASK ME TO STAY AWAY FROM YOU BECAUSE YOU WANT ME +HILDA WATCHED HIM FROM HER CORNER TREMBLING AND SCARCELY BREATHING DARK SHADOWS GROWING ABOUT HER EYES +SHE LISTENED INTENTLY BUT SHE HEARD NOTHING BUT THE CREAKING OF HIS CHAIR +I UNDERSTAND BARTLEY I WAS WRONG +AT THAT WORD DECEPTION SPOKEN WITH SUCH SELF CONTEMPT THE COLOR FLASHED BACK INTO HILDA'S FACE AS SUDDENLY AS IF SHE HAD BEEN STRUCK BY A WHIPLASH +ALWAYS BUT IT'S WORSE NOW +SHE BLUSHED AND SMILED AND FUMBLED HIS CARD IN HER CONFUSION BEFORE SHE RAN UPSTAIRS +SHE MERELY BRUSHED HIS CHEEK WITH HER LIPS AND PUT A HAND LIGHTLY AND JOYOUSLY ON EITHER SHOULDER +THE LAST TWO DAYS OF THE VOYAGE BARTLEY FOUND ALMOST INTOLERABLE +THERE IS THIS DECEPTION BETWEEN ME AND EVERYTHING +YES HILDA I KNOW THAT HE SAID SIMPLY +HILDA SAT ON THE ARM OF IT AND PUT HER HANDS LIGHTLY ON HIS SHOULDERS +OH BARTLEY WHAT AM I TO DO +I WILL ASK THE LEAST IMAGINABLE BUT I MUST HAVE SOMETHING +WHEN DID YOU COME BARTLEY AND HOW DID IT HAPPEN YOU HAVEN'T SPOKEN A WORD +BARTLEY LEANED HIS HEAD IN HIS HANDS AND SPOKE THROUGH HIS TEETH +YOU WANT ME TO SAY IT SHE WHISPERED +AND THEN YOU CAME BACK NOT CARING VERY MUCH BUT IT MADE NO DIFFERENCE +A COAL FIRE WAS CRACKLING IN THE GRATE AND THE LAMPS WERE LIT FOR IT WAS ALREADY BEGINNING TO GROW DARK OUTSIDE +AFTER THE VERY FIRST +SHE CALLED HIS NAME ON THE THRESHOLD BUT IN HER SWIFT FLIGHT ACROSS THE ROOM SHE FELT A CHANGE IN HIM AND CAUGHT HERSELF UP SO DEFTLY THAT HE COULD NOT TELL JUST WHEN SHE DID IT +HE PULLED UP A WINDOW AS IF THE AIR WERE HEAVY +IT'S UNBEARABLE IT TORTURES ME EVERY MINUTE +PRESENTLY IT STOLE BACK TO HIS COAT SLEEVE +I'LL DO ANYTHING YOU WISH ME TO BARTLEY SHE SAID TREMULOUSLY +I HAVE THOUGHT ABOUT IT UNTIL I AM WORN OUT +THE ROOM WAS EMPTY WHEN HE ENTERED +SHE PRESSED HIS HAND GENTLY IN GRATITUDE WEREN'T YOU HAPPY THEN AT ALL +EMERGING AT EUSTON AT HALF PAST THREE O'CLOCK IN THE AFTERNOON ALEXANDER HAD HIS LUGGAGE SENT TO THE SAVOY AND DROVE AT ONCE TO BEDFORD SQUARE +IT'S GOT TO BE A CLEAN BREAK HILDA +IT IT HASN'T ALWAYS MADE YOU MISERABLE HAS IT +YOU SEE LOVING SOME ONE AS I LOVE YOU MAKES THE WHOLE WORLD DIFFERENT +COULD YOU COULD YOU SIT DOWN AND TALK ABOUT IT QUIETLY BARTLEY AS IF I WERE A FRIEND AND NOT SOME ONE WHO HAD TO BE DEFIED +I NEVER DREAMED IT WOULD BE YOU BARTLEY +I GET NOTHING BUT MISERY OUT OF EITHER +HE DROPPED BACK HEAVILY INTO HIS CHAIR BY THE FIRE +I AM NOT A MAN WHO CAN LIVE TWO LIVES HE WENT ON FEVERISHLY EACH LIFE SPOILS THE OTHER +SHE SLID TO THE FLOOR BESIDE HIM AS IF SHE WERE TOO TIRED TO SIT UP ANY LONGER +WHEN SHE BEGAN TO DANCE BY WAY OF SHOWING THE GOSSOONS WHAT SHE HAD SEEN IN THE FAIRY RINGS AT NIGHT THE HOUSE BROKE INTO A PROLONGED UPROAR +I'M GLAD SHE'S HELD HER OWN SINCE +IN A MOMENT PEGGY WAS ON THE STAGE AGAIN AND ALEXANDER APPLAUDED VIGOROUSLY WITH THE REST +ALEXANDER EXCLAIMED MILDLY +I HAPPEN TO HAVE MAC CONNELL'S BOX FOR TONIGHT OR THERE'D BE NO CHANCE OF OUR GETTING PLACES +A LITTLE ATTACK OF NERVES POSSIBLY +MAC CONNELL LET ME INTRODUCE MISTER BARTLEY ALEXANDER +IN THE HALF LIGHT HE LOOKED ABOUT AT THE STALLS AND BOXES AND SMILED A LITTLE CONSCIOUSLY RECALLING WITH AMUSEMENT SIR HARRY'S JUDICIAL FROWN +HUGH'S WRITTEN A DELIGHTFUL PART FOR HER AND SHE'S QUITE INEXPRESSIBLE +MYSELF I ALWAYS KNEW SHE HAD IT IN HER +HE'S ANOTHER WHO'S AWFULLY KEEN ABOUT HER LET ME INTRODUCE YOU +IT'S DELIGHTFUL TO HEAR IT IN A LONDON THEATRE +I SAY SIR HARRY THE LITTLE GIRL'S GOING FAMOUSLY TO NIGHT ISN'T SHE +HE LEANED FORWARD AND BEAMED FELICITATIONS AS WARMLY AS MAINHALL HIMSELF WHEN AT THE END OF THE PLAY SHE CAME AGAIN AND AGAIN BEFORE THE CURTAIN PANTING A LITTLE AND FLUSHED HER EYES DANCING AND HER EAGER NERVOUS LITTLE MOUTH TREMULOUS WITH EXCITEMENT +OF COURSE HILDA IS IRISH THE BURGOYNES HAVE BEEN STAGE PEOPLE FOR GENERATIONS AND SHE HAS THE IRISH VOICE +WHEN THEY ENTERED THE STAGE BOX ON THE LEFT THE FIRST ACT WAS WELL UNDER WAY THE SCENE BEING THE INTERIOR OF A CABIN IN THE SOUTH OF IRELAND +HE NODDED CURTLY AND MADE FOR THE DOOR DODGING ACQUAINTANCES AS HE WENT +AFTER HER DANCE SHE WITHDREW FROM THE DIALOGUE AND RETREATED TO THE DITCH WALL BACK OF PHILLY'S BURROW WHERE SHE SAT SINGING THE RISING OF THE MOON AND MAKING A WREATH OF PRIMROSES FOR HER DONKEY +AS THEY SAT DOWN A BURST OF APPLAUSE DREW ALEXANDER'S ATTENTION TO THE STAGE +ALL THE SAME HE LIFTED HIS GLASS HERE'S TO YOU LITTLE HILDA +DO YOU KNOW ALEXANDER MAINHALL LOOKED WITH PERPLEXITY UP INTO THE TOP OF THE HANSOM AND RUBBED HIS PINK CHEEK WITH HIS GLOVED FINGER DO YOU KNOW I SOMETIMES THINK OF TAKING TO CRITICISM SERIOUSLY MYSELF +SIR HARRY TOWNE BOWED AND SAID THAT HE HAD MET MISTER ALEXANDER AND HIS WIFE IN TOKYO +THE FACT IS SHE'S FEELING RATHER SEEDY POOR CHILD +HE BOWED AS THE WARNING BELL RANG AND MAINHALL WHISPERED YOU KNOW LORD WESTMERE OF COURSE THE STOOPED MAN WITH THE LONG GRAY MUSTACHE TALKING TO LADY DOWLE +I DARE SAY IT'S QUITE TRUE THAT THERE'S NEVER BEEN ANY ONE ELSE +THE PLAYWRIGHT GAVE MAINHALL A CURIOUS LOOK OUT OF HIS DEEP SET FADED EYES AND MADE A WRY FACE +IT WAS YOUTH AND POVERTY AND PROXIMITY AND EVERYTHING WAS YOUNG AND KINDLY +HE HAD WRITTEN A NUMBER OF BOOKS HIMSELF AMONG THEM A HISTORY OF DANCING A HISTORY OF COSTUME A KEY TO SHAKESPEARE'S SONNETS A STUDY OF THE POETRY OF ERNEST DOWSON ET CETERA +OH BARTLEY DID YOU WRITE TO ME +IF YOU'D SENT ME A NOTE OR TELEPHONED ME OR ANYTHING +HE BENT HIS FACE OVER HER HAIR +ALEXANDER SLIPPED HIS ARM ABOUT HER +OF COURSE I KNOW BARTLEY SHE SAID AT LAST THAT AFTER THIS YOU WON'T OWE ME THE LEAST CONSIDERATION BUT WE SAIL ON TUESDAY +I SAW THAT INTERVIEW IN THE PAPER YESTERDAY TELLING WHERE YOU WERE AND I THOUGHT I HAD TO SEE YOU THAT'S ALL GOOD NIGHT I'M GOING NOW +I DON'T KNOW WHAT I OUGHT TO SAY BUT I DON'T BELIEVE YOU'D BE HAPPY TRULY I DON'T AREN'T YOU TRYING TO FRIGHTEN ME +ONLY I'LL DO IT MORE COMPLETELY +I'VE BEEN UP IN CANADA WITH MY BRIDGE AND I ARRANGED NOT TO COME TO NEW YORK UNTIL AFTER YOU HAD GONE +THEN YOU DON'T KNOW WHAT YOU'RE TALKING ABOUT +OVER THE FIREPLACE THERE WAS A LARGE OLD FASHIONED GILT MIRROR +ALEXANDER FLUSHED ANGRILY +I THINK I HAVE FELT THAT YOU WERE COMING +HE PAUSED THEY NEVER DID TO ME +I TOLD MYSELF THAT IF I WERE REALLY THINKING OF YOU AND NOT OF MYSELF A LETTER WOULD BE BETTER THAN NOTHING +THEN WHEN YOUR MANAGER ADDED TWO MORE WEEKS I WAS ALREADY COMMITTED +I'M GOING TO DO WHAT YOU ASKED ME TO DO WHEN YOU WERE IN LONDON +ON THE LAST SATURDAY IN APRIL THE NEW YORK TIMES PUBLISHED AN ACCOUNT OF THE STRIKE COMPLICATIONS WHICH WERE DELAYING ALEXANDER'S NEW JERSEY BRIDGE AND STATED THAT THE ENGINEER HIMSELF WAS IN TOWN AND AT HIS OFFICE ON WEST TENTH STREET +LET ME TAKE OFF YOUR COAT AND YOUR BOOTS THEY'RE OOZING WATER +BUT WHEN I CAME I THOUGHT I HAD BEEN MISTAKEN +YES I KNOW VERY WELL +HE ROSE AND CROSSED THE ROOM QUICKLY +AND I SHE WHISPERED I FELT THAT YOU WERE FEELING THAT +IT SEEMED AS IF HIS FAMILY TROUBLES WERE JUST BEGINNING +HE SAW A BUSY SATURDAY USHERED OUT THE SABBATH IN AND NOTHING DONE +HE SAW THAT IN THE EXCITEMENT OF RECENT EVENTS HE HAD NOT FORMULATED A PLAN UPON THAT SCORE +SO HERE IT WAS SPREAD OUT CLEAR BEFORE HIM AND NOW HE KNEW WHAT TO EXPECT +YOU TAKE THIS TO THIS ADDRESS HE SAID HANDING HIM THE ENVELOPE AND GIVE IT TO MISSUS HURSTWOOD YES SIR SAID THE BOY +DEAR SIR WE BEG TO INFORM YOU THAT WE ARE INSTRUCTED TO WAIT UNTIL TO MORROW THURSDAY AT ONE O'CLOCK BEFORE FILING SUIT AGAINST YOU ON BEHALF OF MISSUS JULIA HURSTWOOD FOR DIVORCE AND ALIMONY +HE WAS GETTING SOME VAGUE COMFORT OUT OF A GOOD CIGAR BUT IT WAS NO PANACEA FOR THE ILL WHICH AFFECTED HIM +ANY ANSWER I GUESS NOT +HE WAS QUITE CERTAIN NOW THAT SHE KNEW HE WAS MARRIED AND WAS ANGERED AT HIS PERFIDY +HE FANCIED AS HE SAT AT HIS DESK THAT NOTHING WOULD BE DONE FOR A WEEK OR TWO MEANWHILE HE WOULD HAVE TIME TO THINK +ON WEDNESDAY HE RECEIVED ANOTHER POLITE NOTE FROM MC GREGOR JAMES AND HAY IT READ +HE STAYED AT HIS DESK LONG AFTER ALL OTHERS HAD GONE AND ONLY QUITTED IT WHEN THE NIGHT WATCHMAN ON HIS ROUND PULLED AT THE FRONT DOOR TO SEE IF IT WAS SAFELY LOCKED +HOW ABOUT THAT NOW HIS PAIN AT HER FAILURE TO MEET OR WRITE HIM RAPIDLY INCREASED AS HE DEVOTED HIMSELF TO THIS SUBJECT +VERY TRULY YOURS ET CETERA COMPROMISE +HE TROUBLED OVER MANY LITTLE DETAILS AND TALKED PERFUNCTORILY TO EVERYBODY +HE WOULD GO TO HER AND TELL HER ALL HIS FAMILY COMPLICATIONS +IF HE DIDN'T GO AND SEE THEM THEY WOULD SUE HIM PROMPTLY +HE WAS BEATEN FOR TO NIGHT AND HE MIGHT JUST AS WELL MAKE THE BEST OF IT +HE COULD HARDLY REALISE HOW IT HAD ALL COME ABOUT +HE WOULD EXPLAIN TO HER JUST WHERE HE STOOD AND HOW MUCH HE NEEDED HER +THREE O'CLOCK CAME FOUR FIVE SIX AND NO LETTER +SHE WOULD TAKE THE ENVELOPE AND KNOW THAT SHE HAD TRIUMPHED +IF HE ONLY HAD THAT LETTER BACK HE WOULDN'T SEND IT +IN ABOUT AN HOUR AND THREE QUARTERS THE BOY RETURNED +NO LETTER HAD COME NO WORD OF ANY KIND AND YET HERE IT WAS LATE IN THE EVENING AND SHE HAD AGREED TO MEET HIM THAT MORNING +HE DID NOT GO WITHIN A BLOCK OF THE HOUSE +ALL DAY THE BAR BEING CLOSED HE BROODED ALONE SHUT OUT FROM HOME FROM THE EXCITEMENT OF HIS RESORT FROM CARRIE AND WITHOUT THE ABILITY TO ALTER HIS CONDITION ONE IOTA +IT WAS WITH GREAT OPPOSITION AFTER TWO OR THREE HOURS OF THE MOST URGENT MENTAL AFFIRMATION AND DENIAL THAT AT LAST HE GOT AN ENVELOPE PLACED IN IT THE REQUESTED AMOUNT AND SLOWLY SEALED IT UP +THE HELPLESS MANAGER PACED THE FLOOR AND GRIMLY ENDURED THE GLOOM OF DEFEAT +WHEN HURSTWOOD GOT BACK TO HIS OFFICE AGAIN HE WAS IN A GREATER QUANDARY THAN EVER +ALL THE TIME HIS THOUGHTS WOULD RUN OUT TO HIS HOME AND SEE THE SCENE BEING THEREIN ENACTED +HE HAD LOVED HER EARNESTLY ENOUGH BUT NOW THAT THE POSSIBILITY OF LOSING HER STARED HIM IN THE FACE SHE SEEMED MUCH MORE ATTRACTIVE +HE DID MANAGE TO BRING HIMSELF INTO THE MOOD TO GO OUT TO CARRIE BUT WHEN HE GOT IN OGDEN PLACE HE THOUGHT HE SAW A MAN WATCHING HIM AND WENT AWAY +THE BOY HASTENED AWAY AND THE MANAGER FELL TO HIS MUSINGS +FOR RELIEF HE AROSE AND JOINED IN CONVERSATION WITH A FEW FRIENDS WHO WERE DRINKING +HE DECIDED TO WRITE HER CARE OF THE WEST SIDE POST OFFICE AND ASK FOR AN EXPLANATION AS WELL AS TO HAVE HER MEET HIM +THEN HE CALLED HARRY THE BOY OF ALL WORK AROUND THE PLACE +BUT HE COMPROMISED BY TELLING THE BOY THAT THERE WOULD BE NO REPLY +HE WENT IN AND EXAMINED HIS LETTERS BUT THERE WAS NOTHING FROM CARRIE +HE COULD ARRANGE THAT SATISFACTORILY FOR CARRIE WOULD BE GLAD TO WAIT IF NECESSARY +THEN HE RANG THE BELL NO ANSWER +HURSTWOOD ALMOST EXCLAIMED OUT LOUD AT THE INSISTENCY OF THIS THING +AT ONE THIRTY HE WENT TO RECTOR'S FOR LUNCH AND WHEN HE RETURNED A MESSENGER WAS WAITING FOR HIM +HE WOULD GET ONE TO DAY IT WOULD PROBABLY BE ON HIS DESK WHEN HE GOT BACK HE WOULD LOOK FOR IT AT ONCE +WHILE THE DANGER HAD NOT LESSENED IT HAD NOT AS YET MATERIALISED AND WITH HIM NO NEWS WAS GOOD NEWS +HE WOULD SEE HOW THINGS TURNED OUT TO MORROW AND THEN HE WOULD TALK TO HER THEY WERE GOING TO MEET AS USUAL +HE KNEW HER WELL ENOUGH TO KNOW THAT WHEN SHE HAD DECIDED UPON A PLAN SHE WOULD FOLLOW IT UP +FOR SOME REASON HE FELT AS IF SOMETHING MIGHT COME THAT WAY AND WAS RELIEVED WHEN ALL THE ENVELOPES HAD BEEN SCANNED AND NOTHING SUSPICIOUS NOTICED +SO LITTLE DID HE CONSIDER DROUET THAT IT NEVER ONCE OCCURRED TO HIM TO WORRY ABOUT HIS FINDING OUT +HE RANG AGAIN THIS TIME HARDER STILL NO ANSWER +HE GREW RESTLESS AS HE RUMINATED AND THEN DECIDED THAT PERHAPS IT WAS NOTHING +LATER HOWEVER HIS OLD DISCRETION ASSERTED ITSELF +FORTUNATELY THERE WAS NOTHING FROM HIS WIFE EITHER +THEN HE SAT DOWN IN HIS CHAIR AND GAZED WITHOUT SEEING CONTEMPLATING THE RESULT OF HIS WORK +HE BEGAN TO WISH THAT HE HAD COMPROMISED IN SOME WAY OR OTHER THAT HE HAD SENT THE MONEY PERHAPS HE COULD DO IT UP HERE +HE PUT ON HIS HAT AND LOOKED AROUND FOR HIS UMBRELLA +HE WAS IN A FEVERED STATE OF MIND OWING TO THE BLIGHT HIS WIFE'S ACTION THREATENED TO CAST UPON HIS ENTIRE FUTURE +HOW WOULD THE PAPERS TALK ABOUT IT +AFTER A TIME HE GAVE UP WAITING AND DREARILY HEADED FOR THE MADISON CAR +SOMETHING HAD TO BE DONE A CLIMAX WAS NEAR AND SHE WOULD NOT SIT IDLE +SHE HAD NOT BEEN ABLE TO GET AWAY THIS MORNING +HE AROSE FROM HIS CHAIR AND WENT AND LOOKED OUT INTO THE STREET +HE WOULD GO IN AND SEE ANYHOW HE WOULD HAVE NO ROW +WHAT WOULD SHE DO ABOUT THAT THE CONFOUNDED WRETCH +HIS FIRST IMPULSE WAS TO WRITE BUT FOUR WORDS IN REPLY GO TO THE DEVIL +THE LONG DRIZZLE HAD BEGUN PEDESTRIANS HAD TURNED UP COLLARS AND TROUSERS AT THE BOTTOM +HE WOULD HAVE SOME ARRANGEMENT OF THIS THING +HURSTWOOD WALKED THE FLOOR MENTALLY ARRANGING THE CHIEF POINTS OF HIS SITUATION +HE WOULD HAVE TO PAY HER THE MONEY WHICH SHE WOULD NOW REGULARLY DEMAND OR THERE WOULD BE TROUBLE IT DID NOT MATTER WHAT HE DID +BY THE TIME HE REACHED HIS OWN STREET HE WAS KEENLY ALIVE TO THE DIFFICULTIES OF HIS SITUATION AND WISHED OVER AND OVER THAT SOME SOLUTION WOULD OFFER ITSELF THAT HE COULD SEE HIS WAY OUT +HE ALSO THOUGHT OF HIS MANAGERIAL POSITION +THE WALLS OF THE ROOMS WERE DISCORDANTLY PAPERED +YOU COULD GET HOME EASY TOO IT ISN'T VERY FAR +HIS AMBITION WAS SOME DAY TO BUILD A HOUSE ON THEM +HE WAS OF A CLEAN SAVING DISPOSITION AND HAD ALREADY PAID A NUMBER OF MONTHLY INSTALMENTS ON TWO LOTS FAR OUT ON THE WEST SIDE +MINNIE'S FLAT AS THE ONE FLOOR RESIDENT APARTMENTS WERE THEN BEING CALLED WAS IN A PART OF WEST VAN BUREN STREET INHABITED BY FAMILIES OF LABOURERS AND CLERKS MEN WHO HAD COME AND WERE STILL COMING WITH THE RUSH OF POPULATION POURING IN AT THE RATE OF FIFTY THOUSAND A YEAR +HE SEEMED TO BE THINKING OF SOMETHING ELSE +THESE VAST BUILDINGS WHAT WERE THEY +TO CARRIE THE SOUND OF THE LITTLE BELLS UPON THE HORSE CARS AS THEY TINKLED IN AND OUT OF HEARING WAS AS PLEASING AS IT WAS NOVEL +SHE ASKED MINNIE FOR INK AND PAPER WHICH WERE UPON THE MANTEL IN THE DINING ROOM AND WHEN THE LATTER HAD GONE TO BED AT TEN GOT OUT DROUET'S CARD AND WROTE HIM +ONE COULD SEE THAT HE WAS VERY MUCH WRAPPED UP IN HIS OFFSPRING +A SHOP GIRL WAS THE DESTINY PREFIGURED FOR THE NEWCOMER +THE FLOORS WERE COVERED WITH MATTING AND THE HALL LAID WITH A THIN RAG CARPET +SHE HAD SOME SLIGHT GIFT OF OBSERVATION AND THAT SENSE SO RICH IN EVERY WOMAN INTUITION +MINNIE BEGAN TO EXPLAIN BUT HER HUSBAND TOOK THIS PART OF THE CONVERSATION TO HIMSELF +NOW NOW HE SAID WALKING THERE THERE AND THERE WAS A CERTAIN SWEDISH ACCENT NOTICEABLE IN HIS VOICE +IT GAVE AN IMPOSING APPEARANCE TO MOST OF THE WHOLESALE HOUSES WHOSE OFFICES WERE UPON THE GROUND FLOOR AND IN PLAIN VIEW OF THE STREET +SHE WANTED TO MAKE SOME REFERENCE TO THEIR RELATIONS UPON THE TRAIN BUT WAS TOO TIMID +ANYTHING WAS GOOD ENOUGH SO LONG AS IT PAID SAY FIVE DOLLARS A WEEK TO BEGIN WITH +THEN SHE WALKED AND SANG TO IT UNTIL HANSON DISTURBED IN HIS READING CAME AND TOOK IT +IT WAS UNDER SUCH AUSPICIOUS CIRCUMSTANCES THAT SHE STARTED OUT THIS MORNING TO LOOK FOR WORK +NARROW BOARD WALKS EXTENDED OUT PASSING HERE A HOUSE AND THERE A STORE AT FAR INTERVALS EVENTUALLY ENDING ON THE OPEN PRAIRIE +TO HIM THE PRESENCE OR ABSENCE OF HIS WIFE'S SISTER WAS A MATTER OF INDIFFERENCE +OH WHAT SHALL WE DO FOR A HOME +YOU SAY YOU KNOW ALL ABOUT IT THEN GO ON AND FINISH YOUR NESTS BY YOURSELVES +SHE WAS INDEED A CLEVER BIRD +AND SHE SAW THE OTHER BIRDS HOPPING ABOUT AND TWITTERING HELPLESSLY +MUCH LUCK MAY YOU HAVE +CERTAINLY OF COURSE SCREAMED THE JACKDAW +AND AWAY SHE FLEW TO HER OWN COSY NEST IN THE ELM TREE WHERE SHE WAS SOON FAST ASLEEP FORGETTING ALL ABOUT THE MATTER +AND SOME OF THE BIRDS WHO WERE ATTENTIVE AND CAREFUL SOON SAW HOW IT WAS DONE AND STARTED NICE HOMES FOR THEMSELVES +INDEED IT IS NOT A NEST AT ALL ONLY THE BEGINNING OF ONE +BUT THE WOOD PIGEON WAS IN THE WORST CASE OF THEM ALL +AND WHERE EACH BIRD PERCHED THERE IT WAS TO BUILD ITS NEST +AND THE POOR SILLY THINGS RUFFLED UP THEIR FEATHERS AND LOOKED MISERABLE AS ONLY A LITTLE BIRD CAN LOOK WHEN IT IS UNHAPPY +CRISS CROSS CRISS CROSS SO INTERRUPTED THE WOOD PIGEON +I THOUGHT THAT WAS THE WAY TO BEGIN +AND THERE IS AN OLD STORY ABOUT THIS WHICH I SHALL TELL YOU +THE MAGPIE SAID SHE WOULD TEACH THEM IF THEY WOULD BE A PATIENT DILIGENT OBEDIENT CLASS OF LITTLE BIRDS +SOME ARE WONDERFULLY WROUGHT PRETTY LITTLE HOMES FOR BIRDIKINS +FOR SHE HAD ONLY THE FOUNDATION LAID CRISS CROSS AS THE MAGPIE HAD SHOWN HER +THEN ALL THE OTHER BIRDS CHIRPED EAGERLY YES YES LET US ASK HER TO TEACH US +HERE WOOD PIGEON SAID MOTHER MAGPIE YOU MUST PLACE THOSE STICKS THROUGH AND ACROSS CRISS CROSS CRISS CROSS SO +O WISE MOTHER MAGPIE DEAR MOTHER MAGPIE THEY CRIED TEACH US HOW TO BUILD OUR NESTS LIKE YOURS FOR IT IS GROWING NIGHT AND WE ARE TIRED AND SLEEPY +SHE BEGAN TO SHOW THEM HOW TO WEAVE THE BITS OF THINGS TOGETHER INTO NESTS AS THEY SHOULD BE MADE +SHE POPPED INTO HER NEW HOUSE AND SAT THERE COMFORTABLY PEERING OUT THROUGH THE WINDOW SLITS WITH HER SHARP LITTLE EYES +SO IN A GREAT COMPANY THEY CAME FLUTTERING HOPPING TWITTERING UP TO THE ELM TREE WHERE MOTHER MAGPIE NESTLED COMFORTABLY IN HER NEW HOUSE +IT WAS INDEED DANCING ON A VOLCANO +HE MIGHT BE ENCHANTED BUT THAT WAS THE TALISMAN +HOW MANY INCIDENTS HOW MANY CHARACTERS HOW MANY FEELINGS FLITTED OVER HIS MEMORY OF WHAT SWEET AND BITTER EXPERIENCE DID HE NOT CHEW THE CUD +IT WAS INDEED HER HANDWRITING +FOUR AND TWENTY HOURS AGO AND HE DEEMED HIMSELF THE MOST MISERABLE AND FORLORN OF HUMAN BEINGS AND NOW ALL THE BLESSINGS OF THE WORLD SEEMED SHOWERED AT HIS FEET +THE MOST GIFTED INDIVIDUALS IN THE LAND EMULATED EACH OTHER IN PROVING WHICH ENTERTAINED FOR HIM THE MOST SINCERE AFFECTION +AND NOW ALL HAD ENDED SO HAPPILY +AS FOR HIS FRIENDS THE FUTURE MUST PROVE HIS GRATITUDE TO THEM +IN EXACTLY TEN MINUTES IT IS IN THE POWER OF EVERY MAN TO FREE HIMSELF FROM ALL THE TUMULT OF THE WORLD THE PANGS OF LOVE THE THROBS OF AMBITION THE WEAR AND TEAR OF PLAY THE RECRIMINATING BOUDOIR THE CONSPIRING CLUB THE RATTLING HELL AND FIND HIMSELF IN A SUBLIME SYLVAN SOLITUDE SUPERIOR TO THE CEDARS OF LEBANON AND INFERIOR ONLY IN EXTENT TO THE CHESTNUT FORESTS OF ANATOLIA +THIS VIOLENT AND TRIUMPHANT REVOLUTION IN HIS PROSPECTS AND HIS FORTUNES WAS HARDLY YET COMPLETELY COMPREHENDED BY OUR FRIEND FERDINAND ARMINE AND WHEN HE HAD LEFT A NOTE FOR THE GENEROUS MIRABEL WHOSE SLUMBERS HE WOULD NOT DISTURB AT THIS EARLY HOUR EVEN WITH GOOD NEWS HE STROLLED ALONG UP CHARLES STREET AND TO THE PARK IN ONE OF THOSE WILD AND JOYOUS REVERIES IN WHICH WE BROOD OVER COMING BLISS AND CREATE A THOUSAND GLORIOUS CONSEQUENCES +IT REQUIRES SOME SELF COMMUNION TO PREPARE OURSELVES FOR GOOD FORTUNE AS WELL AS TO ENCOUNTER DIFFICULTY AND DANGER AND DISGRACE +HIS CONSTANCY TO HER WAS NOW REWARDED +FERDINAND FELT HIS FREEDOM AS WELL AS HIS HAPPINESS +FERDINAND MEDITATES OVER HIS GOOD FORTUNE +IN MOMENTS OF DEEP FEELING ALIKE SUDDEN BURSTS OF PROSPERITY AS IN DARKER HOURS MAN MUST BE ALONE +IN THE PRESENT UNSETTLED THOUGH HOPEFUL STATE OF AFFAIRS FERDINAND WOULD NOT GO HOME +WAS IT NOT ALL A DREAM OF HIS OWN CREATION WHILE HIS EYE HAD BEEN FIXED IN ABSTRACTION ON THAT BRIGHT AND FLOWING RIVER +RESTLESS WITH IMPENDING JOY HE SAUNTERED TO THE BRIDGE AND LEANT OVER THE BALUSTRADE GAZING ON THE WATERS IN CHARMED AND CHARMING VACANCY +IS PAPA ALONE ENQUIRED MISS TEMPLE +HE COULD NOT FLATTER HIMSELF THAT HE INDEED MERITED SUCH SINGULAR BLESSINGS AND YET WITH ALL HIS FAULTS WHICH WITH HIM WERE BUT THE CONSEQUENCES OF HIS FIERY YOUTH FERDINAND HAD BEEN FAITHFUL TO HENRIETTA +TIME WORE AWAY AND ON THE NINTH OF APRIL EIGHTEEN SIXTY FIVE GRANT CAPTURED THE CONFEDERATE ARMY UNDER LEE THUS VIRTUALLY ENDING THE WAR +INDEED IF EVER A GENERAL DESERVED HONOR GRANT HAD WON IT HE HAD OPENED THE MISSISSIPPI TO NAVIGATION AND HAD CAPTURED NEARLY ONE HUNDRED THOUSAND PRISONERS AND ARMS +HE WAS NOW COMMANDER OF ALL THE FEDERAL FORCES +WHEN HIS PUBLIC SERVICES WERE FINISHED HE STARTED IN COMPANY WITH HIS WIFE SON JESSE AND A FEW FRIENDS +HIS SUCCESS SEEMS TO HAVE BEEN THE OUTGROWTH OF HARD STUDY AND ABILITY TO PERFORM THE MOST EXHAUSTIVE LABOR WITHOUT FATIGUE +THE CAPTURE OF LEE WAS A FAR MORE DIFFICULT UNDERTAKING +THROUGH THE INFLUENCE OF HON THOMAS L HAMER HE WAS ADMITTED AT WEST POINT IN EIGHTEEN THIRTY NINE +AT THIS TIME GRANT WAS NOT TAKEN WITH WAR AND PROBABLY EVINCED LITTLE INTEREST IN ARMY TACTICS +GRANT ACTED AS MUSTERING OFFICER UNTIL BEING COMMISSIONED COLONEL OF THE TWENTY FIRST ILLINOIS VOLUNTEERS HE TOOK THE FIELD +GENERAL HALLECK IN SPEAKING OF THIS BATTLE SAID +THEY DID NOT BREATHE IT INTO THEIR MOUTHS OR THROUGH GILLS BUT TOOK IT IN THROUGH SOME OPENINGS IN THE BACK PART OF THEIR BODIES +THEY KNEW THAT WHENEVER THEY STUCK OUT THEIR LOWER LIPS AT THE SMALL FISHES AND BUGS THEY SWAM AWAY AS FAST AS THEY COULD +A PERSON WOULD THINK THAT AFTER A FAMILY HAD LIVED SO LONG IN A PLACE ALL THE NEIGHBORS WOULD BE FOND OF THEM YET IT IS NOT SO +THEY ALWAYS ATE PLAIN FOOD AND PLENTY OF IT AND THEY NEVER ATE BETWEEN MEALS +SURE ENOUGH THERE HE CAME THROUGH THE SHALLOW WATER HIS WET BACK SHELL PARTLY OUT OF IT AND SHINING IN THE SUNLIGHT +YOU WOULD THINK THAT WITH SIX LEGS APIECE AND THREE JOINTS IN EACH LEG THEY MIGHT WALK QUITE FAST YET THEY NEVER DID +HE BEGAN TO DRAW IN HIS LEGS VERY VERY SLOWLY AND JUST AS HIS GREAT HARD LOWER SHELL TOUCHED THE MUD THE LAST LARVA CRAWLED OUT UNDER HIS TAIL +BUT SOMETIMES HE STRAIGHTENS THE JOINT AND HOLDS HIS LIP OUT BEFORE HIM AND THEN ITS PINCERS CATCH HOLD OF THINGS HE DOES THIS WHEN HE IS HUNGRY +IT IS DISGRACEFUL +THE NYMPHS HAD ALREADY GOTTEN AWAY +OUR UPPER LIPS ARE SO SMALL THEY DON'T MATTER +THEY THOUGHT THE TROUBLE CAME FROM BAD BRINGING UP OR NO BRINGING UP AT ALL +BOTH LIPS ASKED THE LARVAE +SCARED DAH WHO'S AFRAID ANSWERED HE +THEY THOUGHT HE MIGHT BE GOING TO TAKE A NAP AFTER HIS DINNER +HERE COMES THE SNAPPING TURTLE +INDEED THE LOWER LIP OF A DRAGON FLY CHILD MIGHT WELL FRIGHTEN PEOPLE FOR IT IS FASTENED ON A LONG JOINTED ARM LIKE THING AND HAS PINCERS ON IT WITH WHICH IT CATCHES AND HOLDS ITS FOOD +WELL OUR LOWER LIPS ANYWAY ANSWERED THE NYMPH +ON THIS ACCOUNT THE PEOPLE OF ONE NATION UNDERSTAND ONE ANOTHER BETTER THAN THOSE BELONGING TO DIFFERENT NATIONS EVEN WHEN THEY USE THE SAME LANGUAGE OR RATHER WHEN PEOPLE HAVE LIVED LONG TOGETHER UNDER SIMILAR CONDITIONS OF CLIMATE SOIL DANGER REQUIREMENT TOIL THERE ORIGINATES THEREFROM AN ENTITY THAT UNDERSTANDS ITSELF NAMELY A NATION +EVERYWHERE THAT SLAVE MORALITY GAINS THE ASCENDANCY LANGUAGE SHOWS A TENDENCY TO APPROXIMATE THE SIGNIFICATIONS OF THE WORDS GOOD AND STUPID +DANGER IS AGAIN PRESENT THE MOTHER OF MORALITY GREAT DANGER THIS TIME SHIFTED INTO THE INDIVIDUAL INTO THE NEIGHBOUR AND FRIEND INTO THE STREET INTO THEIR OWN CHILD INTO THEIR OWN HEART INTO ALL THE MOST PERSONAL AND SECRET RECESSES OF THEIR DESIRES AND VOLITIONS +WE TRUTHFUL ONES THE NOBILITY IN ANCIENT GREECE CALLED THEMSELVES +PROBABLY A PESSIMISTIC SUSPICION WITH REGARD TO THE ENTIRE SITUATION OF MAN WILL FIND EXPRESSION PERHAPS A CONDEMNATION OF MAN TOGETHER WITH HIS SITUATION +VARIATIONS WHETHER THEY BE DEVIATIONS INTO THE HIGHER FINER AND RARER OR DETERIORATIONS AND MONSTROSITIES APPEAR SUDDENLY ON THE SCENE IN THE GREATEST EXUBERANCE AND SPLENDOUR THE INDIVIDUAL DARES TO BE INDIVIDUAL AND DETACH HIMSELF +IN FACT CONFORMABLY TO THE SLOW RISE OF THE DEMOCRATIC SOCIAL ORDER AND ITS CAUSE THE BLENDING OF THE BLOOD OF MASTERS AND SLAVES THE ORIGINALLY NOBLE AND RARE IMPULSE OF THE MASTERS TO ASSIGN A VALUE TO THEMSELVES AND TO THINK WELL OF THEMSELVES WILL NOW BE MORE AND MORE ENCOURAGED AND EXTENDED BUT IT HAS AT ALL TIMES AN OLDER AMPLER AND MORE RADICALLY INGRAINED PROPENSITY OPPOSED TO IT AND IN THE PHENOMENON OF VANITY THIS OLDER PROPENSITY OVERMASTERS THE YOUNGER +OCCASIONALLY TOO THE WAKING CALL COMES TOO LATE THE CHANCE WHICH GIVES PERMISSION TO TAKE ACTION WHEN THEIR BEST YOUTH AND STRENGTH FOR ACTION HAVE BEEN USED UP IN SITTING STILL AND HOW MANY A ONE JUST AS HE SPRANG UP HAS FOUND WITH HORROR THAT HIS LIMBS ARE BENUMBED AND HIS SPIRITS ARE NOW TOO HEAVY +WHAT WILL THE MORAL PHILOSOPHERS WHO APPEAR AT THIS TIME HAVE TO PREACH +IT IS OBVIOUS THAT EVERYWHERE THE DESIGNATIONS OF MORAL VALUE WERE AT FIRST APPLIED TO MEN AND WERE ONLY DERIVATIVELY AND AT A LATER PERIOD APPLIED TO ACTIONS IT IS A GROSS MISTAKE THEREFORE WHEN HISTORIANS OF MORALS START WITH QUESTIONS LIKE WHY HAVE SYMPATHETIC ACTIONS BEEN PRAISED +WHICHEVER GROUPS OF SENSATIONS WITHIN A SOUL AWAKEN MOST READILY BEGIN TO SPEAK AND GIVE THE WORD OF COMMAND THESE DECIDE AS TO THE GENERAL ORDER OF RANK OF ITS VALUES AND DETERMINE ULTIMATELY ITS LIST OF DESIRABLE THINGS +HE HONOURS WHATEVER HE RECOGNIZES IN HIMSELF SUCH MORALITY EQUALS SELF GLORIFICATION +AND TO CHOOSE FOR COMPANY THAT ROGUISH AND CHEERFUL VICE POLITENESS +ACCORDING TO SLAVE MORALITY THEREFORE THE EVIL MAN AROUSES FEAR ACCORDING TO MASTER MORALITY IT IS PRECISELY THE GOOD MAN WHO AROUSES FEAR AND SEEKS TO AROUSE IT WHILE THE BAD MAN IS REGARDED AS THE DESPICABLE BEING +THE DISTINCTIONS OF MORAL VALUES HAVE EITHER ORIGINATED IN A RULING CASTE PLEASANTLY CONSCIOUS OF BEING DIFFERENT FROM THE RULED OR AMONG THE RULED CLASS THE SLAVES AND DEPENDENTS OF ALL SORTS +THE HIGHEST INSTINCT FOR PURITY PLACES HIM WHO IS AFFECTED WITH IT IN THE MOST EXTRAORDINARY AND DANGEROUS ISOLATION AS A SAINT FOR IT IS JUST HOLINESS THE HIGHEST SPIRITUALIZATION OF THE INSTINCT IN QUESTION +THIS IS THE PROBLEM OF RACE +NOTHING BUT NEW WHYS NOTHING BUT NEW HOWS NO COMMON FORMULAS ANY LONGER MISUNDERSTANDING AND DISREGARD IN LEAGUE WITH EACH OTHER DECAY DETERIORATION AND THE LOFTIEST DESIRES FRIGHTFULLY ENTANGLED THE GENIUS OF THE RACE OVERFLOWING FROM ALL THE CORNUCOPIAS OF GOOD AND BAD A PORTENTOUS SIMULTANEOUSNESS OF SPRING AND AUTUMN FULL OF NEW CHARMS AND MYSTERIES PECULIAR TO THE FRESH STILL INEXHAUSTED STILL UNWEARIED CORRUPTION +EVERY ELEVATION OF THE TYPE MAN HAS HITHERTO BEEN THE WORK OF AN ARISTOCRATIC SOCIETY AND SO IT WILL ALWAYS BE A SOCIETY BELIEVING IN A LONG SCALE OF GRADATIONS OF RANK AND DIFFERENCES OF WORTH AMONG HUMAN BEINGS AND REQUIRING SLAVERY IN SOME FORM OR OTHER +HERE IS THE SEAT OF THE ORIGIN OF THE FAMOUS ANTITHESIS GOOD AND EVIL POWER AND DANGEROUSNESS ARE ASSUMED TO RESIDE IN THE EVIL A CERTAIN DREADFULNESS SUBTLETY AND STRENGTH WHICH DO NOT ADMIT OF BEING DESPISED +AND WHOEVER THOU ART WHAT IS IT THAT NOW PLEASES THEE +THE GREATER THE DANGER THE GREATER IS THE NEED OF AGREEING QUICKLY AND READILY ABOUT WHAT IS NECESSARY NOT TO MISUNDERSTAND ONE ANOTHER IN DANGER THAT IS WHAT CANNOT AT ALL BE DISPENSED WITH IN INTERCOURSE +I DO NOT KNOW HE SAID HESITATINGLY PERHAPS THE HARPIES HAVE FLOWN OVER MY TABLE +IN OUR VERY DEMOCRATIC OR RATHER VERY PLEBEIAN AGE EDUCATION AND CULTURE MUST BE ESSENTIALLY THE ART OF DECEIVING DECEIVING WITH REGARD TO ORIGIN WITH REGARD TO THE INHERITED PLEBEIANISM IN BODY AND SOUL +OR HE WILL EVEN SAY FOR MANY REASONS I CAN DELIGHT IN THE GOOD OPINION OF OTHERS PERHAPS BECAUSE I LOVE AND HONOUR THEM AND REJOICE IN ALL THEIR JOYS PERHAPS ALSO BECAUSE THEIR GOOD OPINION ENDORSES AND STRENGTHENS MY BELIEF IN MY OWN GOOD OPINION PERHAPS BECAUSE THE GOOD OPINION OF OTHERS EVEN IN CASES WHERE I DO NOT SHARE IT IS USEFUL TO ME OR GIVES PROMISE OF USEFULNESS ALL THIS HOWEVER IS NOT VANITY +A MAN'S ESTIMATES OF VALUE BETRAY SOMETHING OF THE STRUCTURE OF HIS SOUL AND WHEREIN IT SEES ITS CONDITIONS OF LIFE ITS INTRINSIC NEEDS +ONLY NAME IT WHATEVER I HAVE I OFFER THEE +ALSO IN ALL LOVES AND FRIENDSHIPS ONE HAS THE EXPERIENCE THAT NOTHING OF THE KIND CONTINUES WHEN THE DISCOVERY HAS BEEN MADE THAT IN USING THE SAME WORDS ONE OF THE TWO PARTIES HAS FEELINGS THOUGHTS INTUITIONS WISHES OR FEARS DIFFERENT FROM THOSE OF THE OTHER +TO SUFFOCATE WITH HIS MEMORIES TO HIM WHO HAS THE DESIRES OF A LOFTY AND DAINTY SOUL AND ONLY SELDOM FINDS HIS TABLE LAID AND HIS FOOD PREPARED THE DANGER WILL ALWAYS BE GREAT NOWADAYS HOWEVER IT IS EXTRAORDINARILY SO +THE NOBLE SOUL ACCEPTS THE FACT OF HIS EGOISM WITHOUT QUESTION AND ALSO WITHOUT CONSCIOUSNESS OF HARSHNESS CONSTRAINT OR ARBITRARINESS THEREIN BUT RATHER AS SOMETHING THAT MAY HAVE ITS BASIS IN THE PRIMARY LAW OF THINGS IF HE SOUGHT A DESIGNATION FOR IT HE WOULD SAY IT IS JUSTICE ITSELF +BUT YOU MISUNDERSTAND HIM WHEN YOU COMPLAIN ABOUT IT +AT THIS TURNING POINT OF HISTORY THERE MANIFEST THEMSELVES SIDE BY SIDE AND OFTEN MIXED AND ENTANGLED TOGETHER A MAGNIFICENT MANIFOLD VIRGIN FOREST LIKE UP GROWTH AND UP STRIVING A KIND OF TROPICAL TEMPO IN THE RIVALRY OF GROWTH AND AN EXTRAORDINARY DECAY AND SELF DESTRUCTION OWING TO THE SAVAGELY OPPOSING AND SEEMINGLY EXPLODING EGOISMS WHICH STRIVE WITH ONE ANOTHER FOR SUN AND LIGHT AND CAN NO LONGER ASSIGN ANY LIMIT RESTRAINT OR FORBEARANCE FOR THEMSELVES BY MEANS OF THE HITHERTO EXISTING MORALITY +PROBABLY BUT FORTUNATELY NOTHING FOR MY OWN TEETH PERHAPS IT BETRAYS THE SPECIES TO WHICH I BELONG BUT NOT TO MYSELF AS IS SUFFICIENTLY AGREEABLE TO ME BUT WHAT HAS HAPPENED TO YOU +THERE MUST BE A SORT OF REPUGNANCE IN ME TO BELIEVE ANYTHING DEFINITE ABOUT MYSELF IS THERE PERHAPS SOME ENIGMA THEREIN +THE MOST VARIED EXPERIENCE TEACHES IT WHAT ARE THE QUALITIES TO WHICH IT PRINCIPALLY OWES THE FACT THAT IT STILL EXISTS IN SPITE OF ALL GODS AND MEN AND HAS HITHERTO BEEN VICTORIOUS THESE QUALITIES IT CALLS VIRTUES AND THESE VIRTUES ALONE IT DEVELOPS TO MATURITY +BOATS PUT OUT BOTH FROM THE FORT AND THE SHORE +BEAUREGARD AT ONCE WROTE AN ORDER +CHAPTER SEVEN THE HOMECOMING +IF YOU'VE GOT PISTOLS JUST YOU THINK ONCE BEFORE YOU SHOOT SAID COLLINS +AN EXTRAORDINARY WAVE OF EMOTION SWEPT OVER THE SOUTH CARRYING EVERYBODY WITH IT +HE INTENDED TO LEAVE EARLY IN THE MORNING BUT FIRST HE SOUGHT HIS FRIENDS AND TOLD THEM GOOD BYE +BILL SKELLY AN HIS GANG THEM MOUNTAINEERS ARE UP +THAT WHITE FLAG AND THOSE BOATS GOING OUT MEAN THAT SUMTER IS OURS +WHETHER THEIR MANNER WAS GRAVE OR FRIVOLOUS HE KNEW THAT THESE WERE GOOD FRIENDS OF HIS AND HE SINCERELY HOPED THAT HE WOULD MEET THEM AGAIN +BUT THE NEGOTIATIONS WERE SOON COMPLETED +HE WAS GOING HOME AFTER VICTORY +HE FELT THE DIFFERENCE AS SOON AS HE REACHED THE HILLS OF HIS NATIVE STATE +HE SOON LEFT CHARLESTON OUT OF SIGHT +THERE WERE NEVER BEFORE SUCH TIMES IN OLD KENTUCKY +EUROPE WHICH MUST HAVE ITS COTTON WOULD FAVOR THE SUCCESS OF THE SOUTH +PEOPLE WERE COOLER HERE AND THEY WERE MORE PRONE TO LOOK AT THE TWO SIDES OF A QUESTION +THE GREAT STATE OF VIRGINIA MOTHER OF PRESIDENTS WENT OUT OF THE UNION AT LAST AND NORTH CAROLINA TENNESSEE AND ARKANSAS FOLLOWED HER BUT MARYLAND KENTUCKY AND MISSOURI STILL HUNG IN THE BALANCE +THE AIR TOO WAS UNLIKE THAT OF SOUTH CAROLINA THERE WAS A SHARPER TANG TO IT +HARRY FEELING PRIDE BUT NOT SHOWING IT SALUTED AND LEFT THE ROOM GOING AT ONCE TO MADAME DELAUNAY'S WHERE HE HAD LEFT HIS BAGGAGE +HE DID NOT SAY THE LAST AS A BOAST BUT MERELY AS AN ASSURANCE TO THE LIVERYMAN WHO HE SAW WAS ANXIOUS ON HIS ACCOUNT +THERE WAS NOT A SINGLE NOTE OF GLOOM +BUT HE LOOKED BACK AT CHARLESTON THE GAY THE VOLATILE AND THE BEAUTIFUL WITH REAL AFFECTION +THE SMOKE ITSELF WHICH HAD FORMED A VAST CLOUD OVER HARBOR FORTS AND CITY WAS NOW DRIFTING OUT TO SEA LEAVING ALL THINGS ETCHED SHARPLY IN THE DAZZLING SUNLIGHT OF A SOUTHERN SPRING DAY +HARRY THANKED HIM THREW HIS SADDLE BAGS ACROSS THE HORSE A POWERFUL BAY AND GIVING A FINAL WAVE OF HIS HAND TO THE SYMPATHETIC LIVERYMAN RODE AWAY +HE GAZED UPON A WORLD FULL OF RESPONSIBILITIES AND PERILS +IT WAS AFTERNOON WHEN HE REACHED THE LITTLE STATION OF WINTON AND LEFT THE TRAIN A TALL STURDY BOY THE SUPERIOR OF MANY A MAN IN SIZE STRENGTH AND AGILITY +HE HAD SEEN GREAT THINGS AND HE HAD DONE HIS SHARE OF THEM +IT WAS A DIFFERENT HARRY WHO STARTED HOME LATE IN APRIL +LINCOLN HAD CALLED FOR VOLUNTEERS TO PUT DOWN A REBELLION BUT HARRY HEARD EVERYWHERE IN CHARLESTON THAT THE CONFEDERACY WAS NOW SECURE +IT WAS ALMOST BURIED NOW IN FLOWERS AND FOLIAGE +COLONEL KENTON WRITES WISELY +THE PROGRESS OF PRESIDENT DAVIS TO THE NEW CAPITAL SET IN THE VERY FACE OF THE FOE WAS TO BE ONE HUGE TRIUMPH OF FAITH AND LOYALTY +BUT HE SAW NOTHING THAT MOVED THERE NO SIGNAL LIGHTS TWINKLED +IT WHIPPED HIS BLOOD AS IT BLEW DOWN FROM THE SLOPES AND CRESTS +WE NEED KENTUCKY AND I UNDERSTAND THAT A VERY LITTLE MORE MAY BRING THE STATE TO US GO WITH YOUR FATHER I UNDERSTAND THAT YOU HAVE BEEN A BRAVE YOUNG SOLDIER HERE AND MAY YOU DO AS WELL UP THERE +FOUR MONTHS HAD MADE GREAT CHANGES HE BORE HIMSELF MORE LIKE A MAN HIS MANNER WAS MUCH MORE CONSIDERED AND GRAVE +HARRY GAVE HIS FAREWELLS WITH DEEP AND GENUINE REGRET +THIS WAS NOT THE FASHION OF A YEAR AGO WHEN THEY EXCHANGED A FRIENDLY WORD OR TWO BUT HARRY KNEW ITS CAUSE NOW NOBODY COULD TRUST ANYBODY ELSE +BUT THE EMOTIONS OF HARRY AND HIS COMRADES WERE FOR THE MOMENT THOSE OF VICTORY ONLY +COLONEL LEONIDAS TALBOT REGARDED THE WHITE FLAG WITH FEELINGS IN WHICH TRIUMPH AND SADNESS WERE MINGLED STRANGELY +ALL THE AMENITIES WERE PRESERVED BETWEEN THE CAPTURED GARRISON AND THEIR CAPTORS +HIS TREASURE TAKEN TYPE OF HIS SELF AND A WOMAN GIVEN HIM INSTEAD +LET BUT A MOOD BE STRONG ENOUGH AND THE SOUL CLOTHING ITSELF IN THAT MOOD AS WITH A GARMENT CAN WALK ABROAD AND HAUNT THE WORLD +THAT ENCHANTMENT HAD POSSESSED HIM USURPING AS IT WERE THE THRONE OF HIS LIFE AND DISPLACING IT WHEN IT CEASED HE WAS NOT HIS OWN MASTER +HE STARTED TO CONSCIOUS CONFUSION ONLY NEITHER KNOWING WHERE HE WAS NOR WHAT HE DID +HOW IT HAPPENED HE NEVER COULD TELL BUT HE BROUGHT DOWN HIS VIOLIN WITH A CRASH AGAINST THE PIANO THEN SOMEHOW STUMBLED AND ALL BUT FELL +BUT IN HIS HANDS SOLITUDE AND A VIOLIN WERE SURE TO MARRY IN MUSIC +WAS THERE EVER A HAPPIER MAN THAN JOSEPH THAT NIGHT AS HE STRODE ALONG THE FOOTPATH +IT CRIED ALOUD THAT ETERNITY WAS VERY LONG AND LIKE A GREAT PALACE WITHOUT A QUIET ROOM +THEY SAT DOWN AND LISTENED IN SILENCE +IN THE ACT OF RECOVERING HIMSELF HE HEARD THE NECK OF HIS INSTRUMENT PART FROM THE BODY WITH A TEARING DISCORDANT CRY LIKE THE SOUND OF THE RUIN OF A LIVING WORLD +HAST THOU YET TO LEARN THAT THE LOVE OF THE HUMAN IS LOVE IS DIVINE IS BUT A LOWER FORM OF A PART OF THE LOVE OF GOD +HE PRESSED HIS VIOLIN CASE TO HIS HEART AS IF IT WERE A LIVING THING THAT COULD KNOW THAT HE LOVED IT +HER HEART SEEMED TO SWELL UP INTO HER THROAT AND IT WAS ALL SHE COULD DO TO KEEP FROM WEEPING +A SOB LIKE A BIRD NEW BORN BURST FROM MARY'S BOSOM +HE THAT LOVETH NOT HIS BROTHER WHOM HE HATH SEEN HOW SHALL HE LOVE GOD WHOM HE HATH NOT SEEN +THE MUSIC WAS BROKEN AND JOSEPH LEFT ALONE WITH THE DUMB INSTRUMENTS +WHEN HE REACHED THE SUBURBS THE LIGHT OF HOMES WAS SHINING THROUGH CURTAINS OF ALL COLORS +IT'S JUST LIKE HIM HE MURMURED +HE WAS IN A MOOD FOR MUSIC WAS HE NOT +I LOVE THEE I LOVE THEE CRIED THE VIOLIN AND THE WORSHIP WAS ENTREATY THAT KNEW NOT ITSELF +LETTY FINDING HERSELF NOT QUITE EQUAL TO THE EMERGENCY CAME IN HER TURN TO CALL MARY SHE WENT AS QUIETLY AS IF SHE WERE LEAVING A TIRESOME VISITOR +BLESSED AM I HERE NOW MY GOD AND BLESSED SHALL I BE THERE THEN +JUST THEN HE WAS IN NO MOOD TO THINK OF THE SORROWS +A LITTLE LONGER AND SHE WAS COMPELLED TO YIELD AND THE SILENT TEARS FLOWED FREELY +IT WAS THE AFTERNOON OF A HOLIDAY AND SHE HAD CLOSED EARLY +HE LAID DOWN HIS VIOLIN AND SEATED HIMSELF WHERE MARY TOLD HIM IN HER FATHER'S ARM CHAIR BY THE FIRE +HIS VIOLIN WAS BROKEN BUT HIS BEING WAS MADE WHOLE +EARTH WAS GONE AND HEAVEN WAS ALL +ONE WINTER EVENING AS SOON AS HIS WORK WAS OVER FOR THE DAY JOSEPH LOCKED THE DOOR OF HIS SMITHY WASHED HIMSELF WELL PUT ON CLEAN CLOTHES AND TAKING HIS VIOLIN SET OUT FOR TESTBRIDGE MARY WAS EXPECTING HIM TO TEA +WHEN THOU LOVEST MAN OR WOMAN OR CHILD YEA OR EVEN DOG ARIGHT THEN WILT THOU NO LONGER NEED THAT I TELL THEE HOW GOD AND HIS CHRIST WOULD NOT BE CONTENT WITH EACH OTHER ALONE IN THE GLORIES EVEN OF THE ETERNAL ORIGINAL LOVE BECAUSE THEY COULD CREATE MORE LOVE +NOR WAS THIS EXACTLY THE SHAPE THE THING TOOK TO THE CONSCIOUSNESS OF THE MUSICIAN +LETTY TOO WAS OVERCOME MORE THAN EVER SHE HAD BEEN BY MUSIC +THE NETTLE AND THE DOCK SAID JOSEPH +BUT MY UNCLE WAS IN NO HUMOR TO WAIT +ACCUSTOMED AS I HAD BEEN TO THE STEAM FERRY BOATS OF THE ELBE I FOUND THE LONG OARS OF THE BOATMEN BUT SORRY MEANS OF LOCOMOTION +I COULD NOT HELP SMILING TO SEE HIM LOOK SO BIG ON HIS LITTLE HORSE HIS LONG LEGS NOW AND THEN TOUCHING THE GROUND MADE HIM LOOK LIKE A SIX FOOTED CENTAUR +LITTLE DID I EXPECT HOWEVER THE SPECTACLE WHICH AWAITED US WHEN WE REACHED THE PENINSULA OF SNEFFELS WHERE AGGLOMERATIONS OF NATURE'S RUINS FORM A KIND OF TERRIBLE CHAOS +HANS OUR EXTRAORDINARY GUIDE WENT FIRST WALKING WITH A STEADY RAPID UNVARYING STEP +GEOGRAPHERS HAVE DIVIDED IT INTO FOUR PARTS AND WE HAD TO CROSS THE SOUTHWEST QUARTER WHICH IN THE VERNACULAR IS CALLED SUDVESTR FJORDUNGR +IT CONSISTS SIMPLY OF A FEW HOUSES NOT WHAT IN ENGLAND OR GERMANY WE SHOULD CALL A HAMLET +OUR TWO HORSES WITH THE LUGGAGE FOLLOWED OF THEIR OWN ACCORD WITHOUT REQUIRING WHIP OR SPUR +HE SAYS TIDE REPLIED MY UNCLE TRANSLATING THE DANISH WORD FOR MY INFORMATION +THESE SACRED EDIFICES ARE HOWEVER VERY MUCH LIKE THESE PEOPLE WHO DO WITHOUT WATCHES AND NEVER MISS THEM +WE MAY DO SO WAS MY REPLY BUT WHAT ABOUT OUR WORTHY GUIDE +THEY VERY RARELY SUCCEED IN A GOOD SHOW OF YELLOW +SNOW TEMPEST IMPRACTICABLE ROADS ROCKS ICEBERGS NOTHING STOPS HIM +AT LENGTH THE STURDY LITTLE PONY SPREADING OUT HIS LEGS IN A STIFF AND LUDICROUS ATTITUDE GOT FROM UNDER THE PROFESSOR'S LEGS AND LEFT HIM STANDING WITH BOTH FEET ON A SEPARATE STONE LIKE THE COLOSSUS OF RHODES +MY ARMS ARE RIGHT BUT MY LEGS ARE GETTING A LITTLE STIFF +WE TOOK OUR WAY THROUGH POOR AND SPARSE MEADOWS WHICH MADE A DESPERATE EFFORT EVERY YEAR TO SHOW A LITTLE GREEN +A FEW STRAY COWS AND SHEEP WERE ONLY SEEN OCCASIONALLY +I SHOULD HAVE A VIOLENT ATTACK OF THE CRAMP IF I WERE NOT TO HAVE SOME SORT OF EXERCISE +I THOROUGHLY UNDERSTOOD AND APPRECIATED THE NECESSITY FOR WAITING BEFORE CROSSING THE FJORD FOR THAT MOMENT WHEN THE SEA AT ITS HIGHEST POINT IS IN A STATE OF SLACK WATER +TO RIDE OVER SALT WATER UPON THE BACK OF A LITTLE HORSE SEEMED TO ME ABSURD +HERE AND THERE COULD BE SEEN AN ISOLATED FARM SOME SOLITARY BUR OR ICELANDIC HOUSE BUILT OF WOOD EARTH FRAGMENTS OF LAVA LOOKING LIKE BEGGARS ON THE HIGHWAY OF LIFE +I BEGAN TO ENJOY THE EXHILARATING DELIGHT OF TRAVELING A LIFE OF DESIRE GRATIFICATION AND LIBERTY +I TOOK OCCASION TO CONSULT THE MAP TO SEE WHERE GARDAR WAS TO BE FOUND +IN ANY CASE I SHALL TRUST RATHER TO MY OWN INTELLIGENCE THAN THEIRS +CURIOUSLY ENOUGH THE BLOOD OF WABI RAN ALMOST PURE TO HIS INDIAN FOREFATHERS WHILE MINNETAKI AS SHE BECAME OLDER DEVELOPED LESS OF THE WILD BEAUTY OF HER MOTHER AND MORE OF THE SOFTER LOVELINESS OF THE WHITE RACE HER WEALTH OF SOFT JET BLACK HAIR AND HER GREAT DARK EYES CONTRASTING WITH THE LIGHTER SKIN OF HER FATHER'S BLOOD +BUT IN TIME THE END OF IT ALL CAME AND WABI WENT BACK TO THE PRINCESS MOTHER TO MINNETAKI AND TO HIS FORESTS +WHILE THE ATTACK WAS SUCCESSFUL IN A WAY ITS MAIN PURPOSE FAILED +AT LAST SO DARING DID HE BECOME THAT THE PROVINCIAL GOVERNMENT PLACED A PRICE UPON HIS HEAD AND UPON THOSE OF A NUMBER OF HIS MOST NOTORIOUS FOLLOWERS +ONE OF NEWSOME'S CHIEF PLEASURES IN LIFE HAD BEEN THE EDUCATING OF HIS WOODLAND BRIDE AND IT WAS THE AMBITION OF BOTH THAT THE LITTLE MINNETAKI AND HER BROTHER BE REARED IN THE WAYS OF WHITE CHILDREN +IT WAS AT ABOUT THIS TIME IN THEIR LIVES THAT THE WOONGAS BECAME ESPECIALLY DARING IN THEIR DEPREDATIONS +WABI ON THE OTHER HAND WAS AN INDIAN IN APPEARANCE FROM HIS MOCCASINS TO THE CROWN OF HIS HEAD SWARTHY SINEWY AS AGILE AS A LYNX AND WITH EVERY INSTINCT IN HIM CRYING FOR THE LIFE OF THE WILD +MEANWHILE TWO CHILDREN CAME TO BLESS THE HAPPY UNION OF NEWSOME AND HIS LOVELY INDIAN WIFE +THREE DAYS LATER MINNETAKI BECAME NEWSOME'S WIFE AT THE HUDSON BAY POST +BUT EACH WEEK ADDED TO HIS LONELINESS AND HIS LONGINGS FOR MINNETAKI AND HIS FORESTS +THERE WERE TEARS IN THE BOYS EYES WHEN THEY PARTED AND THE MOTHER CRIED FOR THE INDIAN BOY WHO WAS RETURNING TO HIS PEOPLE +THE OTHER WAS A GIRL THREE YEARS YOUNGER AND NEWSOME INSISTED THAT SHE BE CALLED MINNETAKI +ONE DARK NIGHT AT THE HEAD OF A SCORE OF HIS TRIBE HE FELL UPON WABIGOON'S CAMP HIS OBJECT BEING THE ABDUCTION OF THE PRINCESS +THERE WAS LITTLE TIME TO LOSE IN MAKING PREPARATIONS AND THE FOURTH DAY FOLLOWING THE RECEIPT OF WABI'S LETTER FOUND ROD AND HIS MOTHER WAITING FOR THE TRAIN WHICH WAS TO WHIRL THE BOY INTO HIS NEW LIFE +THE CHILDREN PROVED THEMSELVES UNUSUALLY BRIGHT PUPILS AND BY THE TIME WABI WAS SIXTEEN AND MINNETAKI TWELVE ONE WOULD NOT HAVE KNOWN FROM THEIR MANNER OF SPEECH THAT INDIAN BLOOD RAN IN THEIR VEINS +A COUNTER ATTACK WAS MADE UPON WOONGA AND HE WAS DRIVEN DEEP INTO THE WILDERNESS WITH GREAT LOSS +FROM THAT HOUR DATED ONE OF THE MOST SANGUINARY FEUDS IN THE HISTORY OF THE GREAT TRADING COMPANY A FEUD WHICH AS WE SHALL SEE WAS DESTINED TO LIVE EVEN UNTO THE SECOND GENERATION +BUT THIS POWER OF DISCERNMENT WAS DENIED THEM AND ONLY IN AFTER YEARS WITH THE LOVED ONES OF THEIR OWN FIRESIDES CLOSE ABOUT THEM WAS THE WHOLE PICTURE REVEALED +A THOUSAND PLANS WERE MADE A THOUSAND ADVENTURES PICTURED AND THE MOTHER WOULD SMILE AND LAUGH AND PLAN WITH THEM +WE SHALL MAKE MORE MONEY UP HERE THIS WINTER THAN YOU COULD EARN IN DETROIT IN THREE YEARS +ON THE TENTH OF OCTOBER HE WOULD MEET ROD AT SPRUCEWOOD ON THE BLACK STURGEON RIVER +SPRING CAME AND PASSED AND THEN SUMMER +WE WILL HUNT WOLVES THE COUNTRY IS ALIVE WITH THEM AND THE GOVERNMENT GIVES A BOUNTY OF FIFTEEN DOLLARS FOR EVERY SCALP TAKEN +THREE WEEKS LATER CAME WABIGOON'S REPLY +CONSEQUENTLY BOTH MOTHER AND FATHER BEGAN THEIR EDUCATION AT THE POST THEY WERE SENT TO THE FACTOR'S SCHOOL AND TWO WINTERS WERE PASSED IN PORT ARTHUR THAT THEY MIGHT HAVE THE ADVANTAGE OF THOROUGHLY EQUIPPED SCHOOLS +NECESSITY HAD BECOME HIS GRIM MASTER AND THE FOLLOWING WEEK HE WAS GOING TO WORK +ON THE SECOND OF THE MONTH AT TWO IN THE MORNING OUR PRECIOUS CARGO OF LUGGAGE WAS TAKEN ON BOARD THE GOOD SHIP VALKYRIE +THE MEN APPEARED ROBUST BUT HEAVY FAIR HAIRED LIKE GERMANS BUT OF PENSIVE MIEN EXILES OF A HIGHER SCALE IN THE LADDER OF HUMANITY THAN THE ESKIMOS BUT I THOUGHT MUCH MORE UNHAPPY SINCE WITH SUPERIOR PERCEPTIONS THEY ARE COMPELLED TO LIVE WITHIN THE LIMITS OF THE POLAR CIRCLE +THE PROFESSOR KNEW WHOM HE HAD TO DEAL WITH +NEARLY THE WHOLE POPULATION OF THE TOWN WAS ON FOOT TO SEE US LAND +VERY LIKELY I MAY FIND THERE SOME MANUSCRIPTS FROM THE HAND OF SAKNUSSEMM +IN THE MEANTIME THERE IS NOT AN HOUR TO LOSE +HE WAS HOWEVER BUT A CIVIL SERVANT A MAGISTRATE THE GOVERNOR OF THE ISLAND BARON TRAMPE +AT ALL EVENTS WE SHALL GET THERE SOME DAY +ON THE ELEVENTH DAY WE SIGHTED CAPE PORTLAND OVER WHICH TOWERED MOUNT MYRDALS YOKUL WHICH THE WEATHER BEING CLEAR WE MADE OUT VERY READILY +THE FACT WAS THAT SCARCELY ANY ONE OF THEM BUT EXPECTED SOME GOODS BY THE PERIODICAL VESSEL +THOUGH NOT VERY LARGE IT APPEARED NOT LIKELY TO BE FILLED FOR CENTURIES +MY UNCLE WAS DELIGHTED FOR MYSELF MOODY AND DISSATISFIED I APPEARED ALMOST TO EXPECT A GLIMPSE OF THE GHOST OF HAMLET +NO MISTER HARDWIGG SAID THE CAPTAIN NO FEAR OF THAT +THEY WERE NOW HOWEVER ABSENT ON DUTY +I SAW BUT FEW INHABITANTS DURING MY EXCURSION BUT I MET A CROWD ON THE BEACH DRYING SALTING AND LOADING CODFISH THE PRINCIPAL ARTICLE OF EXPORTATION +WELL AND HAVE WE A FAIR WIND +ON ALL SIDES WERE TO BE SEEN WHOLE SCHOOLS OF WHALES AND SHARKS +BUT NO GHOST OR ANYTHING ELSE APPEARED UPON THE ANCIENT WALLS +NOW HARRY SAID MY UNCLE RUBBING HIS HANDS AN GOES WELL THE WORSE DIFFICULTY IS NOW OVER +WHEN THEREFORE HE ADDRESSED HIMSELF TO ME IN THE LANGUAGE OF HORACE WE AT ONCE CAME TO UNDERSTAND ONE ANOTHER +THANKS TO THE HEAT OF THESE RESIDENCES GRASS GROWS ON THE ROOF WHICH GRASS IS CAREFULLY CUT FOR HAY +I SHALL BE GLAD TO CONSULT THEM +THE VALKYRIE KEPT OFF THE COAST STEERING TO THE WESTWARD +THEN WITHOUT FURTHER REMARK HE PUT HIS FINGER TO HIS LIPS FROWNED DARKLY AND DESCENDED INTO THE SMALL BOAT WHICH AWAITED US +THIS MODEST SCHOLAR SPOKE NO LANGUAGES SAVE ICELANDIC AND LATIN +THE FACT IS THE CASTLE IS MUCH LATER THAN THE TIME OF THE HEROIC PRINCE OF DENMARK +NOT BE IT EVER REMEMBERED THAT THE SLIGHTEST SUSPICION OF IMMORALITY ATTACHES EITHER TO THE HEROINE OF THIS BOOK OR TO THE LEADING PHILOSOPHERS OF HER SCHOOL FOR SEVERAL CENTURIES +TO SYNESIUS'S MOST CHARMING LETTERS AS WELL AS TO THOSE OF ISIDORE THE GOOD ABBOT OF PELUSIUM I BEG LEAVE TO REFER THOSE READERS WHO WISH FOR FURTHER INFORMATION ABOUT THE PRIVATE LIFE OF THE FIFTH CENTURY +THAT WONDERFUL METAPHYSIC SUBTLETY WHICH IN PHRASES AND DEFINITIONS TOO OFTEN UNMEANING TO OUR GROSSER INTELLECT SAW THE SYMBOLS OF THE MOST IMPORTANT SPIRITUAL REALITIES AND FELT THAT ON THE DISTINCTION BETWEEN HOMOOUSIOS AND HOMOIOUSIOS MIGHT HANG THE SOLUTION OF THE WHOLE PROBLEM OF HUMANITY WAS SET TO BATTLE IN ALEXANDRIA THE ANCIENT STRONGHOLD OF GREEK PHILOSOPHY WITH THE EFFETE REMAINS OF THE VERY SCIENTIFIC THOUGHT TO WHICH IT OWED ITS EXTRAORDINARY CULTURE +THE HUNS SINGLY THEIR INFERIORS PRESSED THEM FROM BEHIND WITH THE IRRESISTIBLE WEIGHT OF NUMBERS ITALY WITH HER RICH CITIES AND FERTILE LOWLANDS BECKONED THEM ON TO PLUNDER AS AUXILIARIES THEY HAD LEARNED THEIR OWN STRENGTH AND ROMAN WEAKNESS A CASUS BELLI WAS SOON FOUND +THE VERY EMPERORS HAD ARRAYED THEMSELVES ON HER SIDE +I CANNOT HOPE THAT THESE PAGES WILL BE ALTOGETHER FREE FROM ANACHRONISMS AND ERRORS +HOW INIQUITOUS WAS THE CONDUCT OF THE SONS OF THEODOSIUS IN REFUSING THE USUAL BOUNTY BY WHICH THE GOTHS WERE BRIBED NOT TO ATTACK THE EMPIRE THE WHOLE PENT UP DELUGE BURST OVER THE PLAINS OF ITALY AND THE WESTERN EMPIRE BECAME FROM THAT DAY FORTH A DYING IDIOT WHILE THE NEW INVADERS DIVIDED EUROPE AMONG THEMSELVES +THE COUNTLESS TREASURES WHICH FIVE CENTURIES OF RAPINE HAD ACCUMULATED ROUND THE CAPITOL HAD BECOME THE PREY OF MEN CLOTHED IN SHEEPSKINS AND HORSE HIDE AND THE SISTER OF AN EMPEROR HAD FOUND HER BEAUTY VIRTUE AND PRIDE OF RACE WORTHILY MATCHED BY THOSE OF THE HARD HANDED NORTHERN HERO WHO LED HER AWAY FROM ITALY AS HIS CAPTIVE AND HIS BRIDE TO FOUND NEW KINGDOMS IN SOUTH FRANCE AND SPAIN AND TO DRIVE THE NEWLY ARRIVED VANDALS ACROSS THE STRAITS OF GIBRALTAR INTO THE THEN BLOOMING COAST LAND OF NORTHERN AFRICA +ONE WHO WRITES OF SUCH AN ERA LABOURS UNDER A TROUBLESOME DISADVANTAGE +IN THE PRESENT CASE THAT DISADVANTAGE IS DOUBLED FOR WHILE THE SINS OF THE CHURCH HOWEVER HEINOUS WERE STILL SUCH AS ADMIT OF BEING EXPRESSED IN WORDS THE SINS OF THE HEATHEN WORLD AGAINST WHICH SHE FOUGHT WERE UTTERLY INDESCRIBABLE AND THE CHRISTIAN APOLOGIST IS THUS COMPELLED FOR THE SAKE OF DECENCY TO STATE THE CHURCH'S CASE FAR MORE WEAKLY THAN THE FACTS DESERVE +AND THE NEW BLOOD AT THE ERA OF THIS STORY WAS AT HAND +THAT EXTRAORDINARY REFORM IN MORALS WHICH ACCORDING TO SALVIAN AND HIS CONTEMPORARIES THE VANDAL CONQUERORS WORKED IN NORTH AFRICA AVAILED THEM NOTHING THEY LOST MORE THAN THEY GAVE +BUT IF THE EMPERORS HAD BECOME CHRISTIAN THE EMPIRE HAD NOT +TRIBE AFTER TRIBE WAS CROWDING DOWN TO THE ALPS AND TRAMPLING UPON EACH OTHER ON THE FRONTIERS OF THE EMPIRE +THE MENS SANA MUST HAVE A CORPUS SANUM TO INHABIT +IN THE MEANWHILE THE MINDS OF MEN CUT ADRIFT FROM THEIR ANCIENT MOORINGS WANDERED WILDLY OVER PATHLESS SEAS OF SPECULATIVE DOUBT AND ESPECIALLY IN THE MORE METAPHYSICAL AND CONTEMPLATIVE EAST ATTEMPTED TO SOLVE FOR THEMSELVES THE QUESTIONS OF MAN'S RELATION TO THE UNSEEN BY THOSE THOUSAND SCHISMS HERESIES AND THEOSOPHIES IT IS A DISGRACE TO THE WORD PHILOSOPHY TO CALL THEM BY IT ON THE RECORDS OF WHICH THE STUDENT NOW GAZES BEWILDERED UNABLE ALIKE TO COUNT OR TO EXPLAIN THEIR FANTASIES +THAT DIVINE WORD WHO IS THE LIGHT WHO LIGHTETH EVERY MAN WHICH COMETH INTO THE WORLD HAD AWAKENED IN THE HEART OF MANKIND A MORAL CRAVING NEVER BEFORE FELT IN ANY STRENGTH EXCEPT BY A FEW ISOLATED PHILOSOPHERS OR PROPHETS +BUT THE HEALTH OF A CHURCH DEPENDS NOT MERELY ON THE CREED WHICH IT PROFESSES NOT EVEN ON THE WISDOM AND HOLINESS OF A FEW GREAT ECCLESIASTICS BUT ON THE FAITH AND VIRTUE OF ITS INDIVIDUAL MEMBERS +JULIAN'S LAST ATTEMPT TO RESTORE PAGANISM BY IMPERIAL INFLUENCE HAD ONLY PROVED THAT THE OLD FAITH HAD LOST ALL HOLD UPON THE HEARTS OF THE MASSES AT HIS DEATH THE GREAT TIDE WAVE OF NEW OPINION ROLLED ON UNCHECKED AND THE RULERS OF EARTH WERE FAIN TO SWIM WITH THE STREAM TO ACCEPT IN WORDS AT LEAST THE CHURCH'S LAWS AS THEIRS TO ACKNOWLEDGE A KING OF KINGS TO WHOM EVEN THEY OWED HOMAGE AND OBEDIENCE AND TO CALL THEIR OWN SLAVES THEIR POORER BRETHREN AND OFTEN TOO THEIR SPIRITUAL SUPERIORS +THEY BROUGHT BEFORE THE MINDS OF CHURCHMEN A THOUSAND NEW QUESTIONS WHICH MUST BE SOLVED UNLESS THE CHURCH WAS TO RELINQUISH FOR EVER HER CLAIMS AS THE GREAT TEACHER AND SATISFIER OF THE HUMAN SOUL +AY SHE ANSWERED HALF BITTERLY AND WOULD THAT WE COULD LIVE WITHOUT FOOD AND IMITATE PERFECTLY THE IMMORTAL GODS +THERE IS FRUIT WITH LENTILS AND RICE WAITING FOR YOU IN THE NEXT ROOM AND BREAD UNLESS YOU DESPISE IT TOO MUCH +NOT THAT SUCH A CREATURE AS THAT DISTURBS ME NO CREATED THING I HOPE CAN MOVE MY EQUANIMITY BUT IF I COULD STOOP TO HATE I SHOULD HATE HER HATE HER +HIS EXCELLENCY MADAM THE PREFECT +AND WHY SHOULD THAT DISTURB ME LET HIM ENTER +SHE HAS LIFTED HER EYES OFF HER MANUSCRIPT SHE IS LOOKING OUT WITH KINDLING COUNTENANCE OVER THE GARDENS OF THE MUSEUM HER RIPE CURLING GREEK LIPS SUCH AS WE NEVER SEE NOW EVEN AMONG HER OWN WIVES AND SISTERS OPEN +IF THEY HAVE CAST OFF THE VULGAR HERD THEY HAVE NOT CAST OFF HYPATIA +WHAT DO I CARE FOR FOOD +AND HER VOICE TOOK A TONE WHICH MADE IT SOMEWHAT UNCERTAIN WHETHER IN SPITE OF ALL THE LOFTY IMPASSIBILITY WHICH SHE FELT BOUND TO POSSESS SHE DID NOT HATE PELAGIA WITH A MOST HUMAN AND MUNDANE HATRED +IF THEY HAVE CEASED TO GUIDE NATIONS THEY HAVE NOT CEASED TO SPEAK TO THEIR OWN ELECT +STRANGE THAT MEN SHOULD BE CONTENT TO GROVEL AND BE MEN WHEN THEY MIGHT RISE TO THE RANK OF GODS +I TO BELIEVE AGAINST THE AUTHORITY OF PORPHYRY HIMSELF TOO IN EVIL EYES AND MAGIC +THE PLACE SEEMED FRAGRANT WITH ALL THE RICHES OF GREEK THOUGHT AND SONG SINCE THE DAYS WHEN PTOLEMY PHILADELPHUS WALKED THERE WITH EUCLID AND THEOCRITUS CALLIMACHUS AND LYCOPHRON +BUT MOST PROBABLY HAD ANY OF US ENTERED THAT ROOM THAT MORNING WE SHOULD NOT HAVE BEEN ABLE TO SPARE A LOOK EITHER FOR THE FURNITURE OR THE GENERAL EFFECT OR THE MUSEUM GARDENS OR THE SPARKLING MEDITERRANEAN BEYOND BUT WE SHOULD HAVE AGREED THAT THE ROOM WAS QUITE RICH ENOUGH FOR HUMAN EYES FOR THE SAKE OF ONE TREASURE WHICH IT POSSESSED AND BESIDE WHICH NOTHING WAS WORTH A MOMENT'S GLANCE +THE ROOM HAD NEITHER CARPET NOR FIREPLACE AND THE ONLY MOVABLES IN IT WERE A SOFA BED A TABLE AND AN ARM CHAIR ALL OF SUCH DELICATE AND GRACEFUL FORMS AS MAY BE SEEN ON ANCIENT VASES OF A FAR EARLIER PERIOD THAN THAT WHEREOF WE WRITE +TO BE WELCOMED INTO THE CELESTIAL RANKS OF THE HEROIC TO RISE TO THE IMMORTAL GODS TO THE INEFFABLE POWERS ONWARD UPWARD EVER THROUGH AGES AND THROUGH ETERNITIES TILL I FIND MY HOME AT LAST AND VANISH IN THE GLORY OF THE NAMELESS AND THE ABSOLUTE ONE +HOW CAN HE WHOSE SPHERE LIES ABOVE THE STARS STOOP EVERY MOMENT TO EARTH +THE OPERATION WHATEVER IT HAD BEEN WHICH HAD DEPRIVED HIS FEATURES OF HARMONY AND PUT ALL THEIR FLESH INTO DISORDER HAD HAD NO EFFECT ON THE BONY STRUCTURE OF HIS HEAD +BESIDES WE MUST REMEMBER THAT THEY HAD IN THOSE TIMES MEANS OF PUTTING PATIENTS TO SLEEP AND OF SUPPRESSING ALL SUFFERING ONLY THEN IT WAS CALLED MAGIC WHILE NOW IT IS CALLED ANAESTHESIA +HIS HAIR HAVING PROBABLY BEEN DYED WITH SOME CORROSIVE PREPARATION HAD LEFT IT WOOLLY AND ROUGH TO THE TOUCH +BESIDES THIS FACE THOSE WHO HAD BROUGHT HIM UP HAD GIVEN HIM THE RESOURCES OF A GYMNAST AND AN ATHLETE +GWYNPLAINE HAD YELLOW HAIR +THE JOYOUS CONVULSION OF LAUGHTER WAS AS A TRIBUTE PAID THEY SUBMITTED TO IT GLADLY BUT ALMOST MECHANICALLY +THE OUTSIDE DID NOT DEPEND ON THE INTERIOR +ALL HIS EMOTIONS WHATEVER THEY MIGHT HAVE BEEN AUGMENTED HIS STRANGE FACE OF JOY OR TO SPEAK MORE CORRECTLY AGGRAVATED IT +WITH THIS EXCEPTION GWYNPLAINE'S LAUGH WAS EVERLASTING +IT SEEMED EVIDENT THAT A MYSTERIOUS AND PROBABLY OCCULT SCIENCE WHICH WAS TO SURGERY WHAT ALCHEMY WAS TO CHEMISTRY HAD CHISELLED HIS FLESH EVIDENTLY AT A VERY TENDER AGE AND MANUFACTURED HIS COUNTENANCE WITH PREMEDITATION +HAD GWYNPLAINE WHEN A CHILD BEEN SO WORTHY OF ATTENTION THAT HIS FACE HAD BEEN SUBJECTED TO TRANSMUTATION WHY NOT +ACCORDING TO ALL APPEARANCE INDUSTRIOUS MANIPULATORS OF CHILDREN HAD WORKED UPON HIS FACE +GWYNPLAINE WAS A MOUNTEBANK +BUT IS LAUGHTER A SYNONYM OF JOY +SUCH PERFECT COMPLETENESS IS NOT IN NATURE +AN EVERLASTING LAUGH +HE SHOWED HIMSELF ON THE PLATFORM +THE WHOLE OF EXISTENCE RESEMBLES A LETTER MODIFIED IN THE POSTSCRIPT +THE MANICHAEANS BELIEVED THE ABSOLUTE OCCASIONALLY GIVES WAY AND THAT GOD HIMSELF SOMETIMES ABDICATES FOR A TIME SO ALSO OF THE WILL +NO ONE COULD ESCAPE FROM THIS RICTUS +IT WAS GWYNPLAINE'S LAUGH WHICH CREATED THE LAUGHTER OF OTHERS YET HE DID NOT LAUGH HIMSELF +ITS YELLOW BRISTLES RATHER A MANE THAN A HEAD OF HAIR COVERED AND CONCEALED A LOFTY BROW EVIDENTLY MADE TO CONTAIN THOUGHT +PHOEBE COOKED VENUS SCRUBBED THE TEMPLE +WHAT TRUE THINGS ARE TOLD IN STORIES +UNKNOWN PEOPLE HAD WORKED UPON HIS FACE HE ON THE OTHER HAND HAD WORKED ON HIS MIND AND BEHIND THIS WELL EXECUTED MASK HE HAD PLACED ALL THAT HE COULD OF THOUGHT +URSUS WAS IN EVERYTHING IN THE PIECE IN THE COMPANY IN THE KITCHEN IN THE ORCHESTRA +THE CARAVAN WAS DIVIDED INTO THREE COMPARTMENTS PARTITIONED FROM EACH OTHER +THIS WAS THE OLD ESTABLISHMENT OF URSUS ITS PROPORTIONS AUGMENTED BY SUCCESS AND IMPROVED FROM A WRETCHED BOOTH INTO A THEATRE +THIS GREEN COLOUR HAD SUCCEEDED IN DRAWING ATTENTION TO THE CARRIAGE WHICH WAS KNOWN IN ALL THE FAIR GROUNDS AS THE GREEN BOX +URSUS WAS THE POET OF THESE MAGICAL REPRESENTATIONS HE WROTE THE PIECES +THIS HUT IN A CORNER AT THE BACK TO THE RIGHT OF THE DOOR SERVED AS BEDCHAMBER AND DRESSING ROOM TO URSUS AND GWYNPLAINE +THE ASTONISHMENT WITH WHICH THE VILLAGERS REGARDED THIS MACHINE WAS OVERWHELMING +ON THE ROOF FROM A TUBE PAINTED GREEN LIKE THE REST SMOKE AROSE +IN GWYNPLAINE EVIL THOUGHTS NEVER RIPENED AND HE HAD THEREFORE NO REMORSE +THE CURIOSITY OF ONE PLACE EXHAUSTED THEY PASSED ON TO ANOTHER +SOME BELIEVED IT TO BE NATURAL OTHERS DECLARED IT TO BE ARTIFICIAL AND AS CONJECTURE WAS ADDED TO REALITY EVERYWHERE AT EVERY CROSS ROAD ON THE JOURNEY IN ALL THE GROUNDS OF FAIRS AND FETES THE CROWD RAN AFTER GWYNPLAINE +THEN I LOOK PERHAPS LIKE WHAT I AM +FOR THESE READ FIBI AND VINOS THAT WE MAY CONFORM TO ENGLISH PRONUNCIATION +FROM SIXTEEN EIGHTY TO SEVENTEEN O FOUR A GREAT CHANGE HAD TAKEN PLACE +THE WHEELS WERE ALL OF THE SAME SIZE AND HIGH AS WAGON WHEELS +A LOFT UNDER THE ARCH OF THE ROOF CONTAINED THE SCENES AND ON OPENING A TRAP DOOR LAMPS APPEARED PRODUCING WONDERS OF LIGHT +THIS OPENING LOOKED FOR ALL THE WORLD LIKE A MOUTH OF HELL IN THE WORDS OF THE ITINERANT PURITAN PREACHERS WHO TURNED AWAY FROM IT WITH HORROR +THE EFFECT OF HIS APPEARANCE HAD BEEN SURPRISING +URSUS AND HOMO TOOK CHARGE OF EACH OTHER +WHAT WAS THIS NOTHING +THIS FORTUNE HAD ALLOWED URSUS WHO WAS THE ADMINISTRATOR OF GWYNPLAINE'S SUCCESS TO HAVE THE CHARIOT OF HIS DREAMS CONSTRUCTED THAT IS TO SAY A CARAVAN LARGE ENOUGH TO CARRY A THEATRE AND TO SOW SCIENCE AND ART IN THE HIGHWAYS +IT WAS ESTABLISHED AT SOUTHWARK +BY THE SIDE OF THE DOOR WAS CONSTRUCTED OFF HAND BY MEANS OF AN EMPTY BARREL A BOX FOR THE MONEY TAKER WHO WAS SOMETIMES FIBI AND SOMETIMES VINOS +HE DID NOT COME EVERY EVENING BUT WHEN HE CAME HE LED THE PUBLIC APPLAUSE GREW INTO ACCLAMATION SUCCESS ROSE NOT TO THE ROOF FOR THERE WAS NONE BUT TO THE CLOUDS FOR THERE WERE PLENTY OF THEM +ONE EVENING URSUS WAS IN THE SIDE SCENE WHICH WAS THE KITCHEN DOOR OF THE GREEN BOX SEEING MASTER NICLESS STANDING BY HIM SHOWED HIM THIS MAN IN THE CROWD AND ASKED HIM +HE ENTERED HEAVEN ONLY BY THE ARTISTS DOOR +WHICH CLOUDS SEEING THAT THERE WAS NO ROOF SOMETIMES WEPT OVER THE MASTERPIECE OF URSUS +ALL SOUTHWARK RAN IN CROWDS TO ADMIRE THE LAUGHING MAN +EVEN THIS COMEDIAN OF JAWS AND CLAWS WAS ECLIPSED IN SUCCESS +WHAT A PITY THAT HE SHOULD NOT BE A LORD +THAT SUCCESS WAS PRODIGIOUS STILL IT REMAINED LOCAL +AT EVERY PERFORMANCE THE YARD OF THE INN TRANSFORMED INTO A PIT WAS FILLED WITH A RAGGED AND ENTHUSIASTIC AUDIENCE +IT TOOK A HUNDRED AND THIRTY YEARS FOR THE NAME OF SHAKESPEARE TO PENETRATE FROM ENGLAND INTO FRANCE +WE ARE IN LONDON SAID URSUS WE MUST BE PREPARED FOR THE GENTRY +THE MERRY ANDREWS AND MOUNTEBANKS OF TARRINZEAU FIELD WERE AGHAST AT GWYNPLAINE +THE EMPTYING OF TANKARDS DID NOT DECREASE THEIR SUCCESS +SAINT PAUL IS A SAINT ONLY WITH EXTENUATING CIRCUMSTANCES +HIS ENTHUSIASM CAUSED URSUS TO REMARK THIS MAN AND GWYNPLAINE TO OBSERVE HIM +IT MIGHT HAVE BEEN ORDERED FOR THE GREEN BOX +THE PLACARD GWYNPLAINE THE LAUGHING MAN TAKEN FROM ITS NAIL IN THE GREEN BOX WAS HUNG UP CLOSE TO THE SIGN OF THE INN +HE WOULD MAKE A FAMOUS SCOUNDREL +GWYNPLAINE ATE UP THEIR PUBLIC +WITH THAT EXCEPTION THEIR SUCCESS BECAME SO GREAT THAT NO MOUNTEBANK MEMORY COULD RECALL ITS PARALLEL +IT WAS A THEATRE READY MADE +AT THAT HOUR THERE WAS NO ONE IN THE FAIR GROUND EXCEPT PERHAPS SOME REELING DRUNKARD MAKING STAGGERING SHADOWS IN DARK CORNERS +AGAINST THIS WALL WAS PLACED THE GREEN BOX WHICH THEY WERE ABLE TO DRAW INTO THE YARD OWING TO THE HEIGHT OF THE GATE +THEY BEGAN THEIR PERFORMANCES +THE GLORY OF GWYNPLAINE HAD NOT PASSED LONDON BRIDGE +THESE WERE REMARKABLE TALENTS +THIS CONNOISSEUR WAS SUDDENLY FASCINATED AND HAD ADOPTED THE LAUGHING MAN +THEY HAD A GREAT FRIEND IN THIS UNKNOWN VISITOR +BESIDES THE SMALL FRY THE SWALLOWERS OF SWORDS AND THE GRIMACE MAKERS REAL PERFORMANCES TOOK PLACE ON THE GREEN +BESIDES THIS HE HARANGUED LIKE CICERO AS WE HAVE JUST SEEN SOLD HIS DRUGS ATTENDED SICKNESS AND EVEN HEALED THE SICK +THE DOME OF SAINT PAUL'S WAS A DELIGHT TO URSUS +YET THERE ARE A FEW PRIVATE ROOMS WHICH CONTAIN A TABLE SURROUNDED WITH BENCHES IN WHICH A RESPECTABLE FAMILY OR A FEW FRIENDS CAN ENJOY THEMSELVES IN A DECENT WAY +NEVER FEAR YOU SHALL SEE HIM AGAIN TO MORROW +NOT VERY LONG I ANSWERED AND I WILL TEACH YOU AS YOU WISH ALTHOUGH THE HERMIT ASSURED ME THAT I WOULD DIE SUDDENLY WITHIN THREE DAYS IF I COMMUNICATED MY SCIENCE TO ANYONE BUT I HAVE NO FAITH WHATEVER IN THAT PREDICTION +THEY ALL ASKED ME HOW LONG I WOULD REQUIRE TO TEACH THEM THE RULES OF MY SUBLIME CALCULUS +UNWILLING TO HURT HIS VANITY BY TELLING HIM THAT HE WAS MISTAKEN I TOOK THE WILD RESOLUTION OF INFORMING HIM IN THE PRESENCE OF HIS TWO FRIENDS THAT I POSSESSED A CERTAIN NUMERAL CALCULUS WHICH GAVE ANSWERS ALSO IN NUMBERS TO ANY QUESTIONS I LIKED TO PUT +THEY DID NOT KNOW WHO I WAS AND DID NOT LIKE TO ASK ME WHILST I THOUGHT IT BETTER TO PRESERVE A MODEST SILENCE +WE WOULD VERY OFTEN SPEND THE WHOLE NIGHT RAMBLING ABOUT THE CITY INVENTING AND CARRYING INTO EXECUTION THE MOST IMPERTINENT PRACTICAL JOKES +IF THE QUESTION WAS SO OBSCURE THAT I COULD NOT MAKE OUT THE SENSE OF IT IT WAS NATURAL THAT I SHOULD NOT UNDERSTAND THE ANSWER +WHERE IS MY HUSBAND +I DECLARED MYSELF QUITE WILLING FOR IT WAS NECESSARY TO BRAZEN IT OUT AFTER HAVING VENTURED AS FAR AS I HAD DONE +I FELT THAT IN MY FIRST PROFESSION AS I WAS NOT BLESSED WITH THE VOCATION NECESSARY TO IT I SHOULD HAVE SUCCEEDED ONLY BY DINT OF HYPOCRISY AND I SHOULD HAVE BEEN DESPICABLE IN MY OWN ESTIMATION EVEN IF I HAD SEEN THE PURPLE MANTLE ON MY SHOULDERS FOR THE GREATEST DIGNITIES CANNOT SILENCE A MAN'S OWN CONSCIENCE +BUT ALTHOUGH BELIEVING FULLY IN MY ORACLES THEY WERE TOO KIND HEARTED TO THINK THEM THE WORK OF THE DEVIL AND IT SUITED THEIR NATURAL GOODNESS BETTER TO BELIEVE MY ANSWERS INSPIRED BY SOME HEAVENLY SPIRIT +OUR SCANDALOUS PROCEEDINGS OFTEN EXPOSED US TO THE GREATEST DANGER +THEY BELIEVED THAT THROUGH ME THEY POSSESSED THE PHILOSOPHER'S STONE THE UNIVERSAL PANACEA THE INTERCOURSE WITH ALL THE ELEMENTARY HEAVENLY AND INFERNAL SPIRITS THEY HAD NO DOUBT WHATEVER THAT THANKS TO MY SUBLIME SCIENCE THEY COULD FIND OUT THE SECRETS OF EVERY GOVERNMENT IN EUROPE +YOUR APARTMENT IS READY YOU MAY SEND YOUR CLOTHES YOU SHALL HAVE A SERVANT A GONDOLA AT YOUR ORDERS MY OWN TABLE AND TEN SEQUINS A MONTH +I TOLD HIM AND HE INSISTED UPON MY COMING WITH HIM IN THE GONDOLA SAYING THAT HE WOULD LEAVE ME AT MY HOUSE +WHENEVER WE COULD CONTRIVE TO GET INTO A CHURCH TOWER WE THOUGHT IT GREAT FUN TO FRIGHTEN ALL THE PARISH BY RINGING THE ALARM BELL AS IF SOME FIRE HAD BROKEN OUT BUT THAT WAS NOT ALL WE ALWAYS CUT THE BELL ROPES SO THAT IN THE MORNING THE CHURCHWARDENS HAD NO MEANS OF SUMMONING THE FAITHFUL TO EARLY MASS +I JUMPED OUT OF THE GONDOLA AND FOUND MYSELF ON THE VERY SPOT WHERE THREE YEARS BEFORE I HAD TAUGHT RAZETTA SUCH A FORCIBLE LESSON I ENQUIRED FOR A SURGEON AT THE FIRST COFFEE HOUSE AND RAN TO THE HOUSE THAT WAS POINTED OUT TO ME +WE DID THE SAME WITH PHYSICIANS WHOM WE OFTEN SENT HALF DRESSED TO SOME NOBLEMAN WHO WAS ENJOYING EXCELLENT HEALTH +BESIDES I FOUND IT VERY FLATTERING TO MY VANITY TO BECOME THE SUBJECT OF THE SPECULATIVE CHATTERING OF EMPTY FOOLS WHO HAVING NOTHING ELSE TO DO ARE ALWAYS TRYING TO FIND OUT THE CAUSE OF EVERY MORAL PHENOMENON THEY MEET WITH WHICH THEIR NARROW INTELLECT CANNOT UNDERSTAND +HE ENTREATED ME TO TELL HIM THE TRUTH +WHAT EXTRAORDINARY THINGS WILL SOMETIMES OCCUR FROM MERE CHANCE OR FROM THE FORCE OF CIRCUMSTANCES +I PICKED IT UP AND COMING UP TO HIM JUST AS HE WAS GOING DOWN THE STEPS I HANDED IT TO HIM +THINKING I HAD A RIGHT TO WATCH THE SICK MAN I SETTLED MYSELF NEAR HIS BED TO GIVE HIM EVERY CARE HE REQUIRED +WE TOOK OUR THREE PRISONERS TO A LARGE BOAT +TAKING EVERYTHING UPON MYSELF I ORDERED A SERVANT TO HURRY OUT FOR A PHYSICIAN WHO CAME IN A SHORT TIME AND ORDERED THE PATIENT TO BE BLED AGAIN THUS APPROVING THE FIRST BLEEDING PRESCRIBED BY ME +WITH AN EDUCATION WHICH OUGHT TO HAVE ENSURED ME AN HONOURABLE STANDING IN THE WORLD WITH SOME INTELLIGENCE WIT GOOD LITERARY AND SCIENTIFIC KNOWLEDGE AND ENDOWED WITH THOSE ACCIDENTAL PHYSICAL QUALITIES WHICH ARE SUCH A GOOD PASSPORT INTO SOCIETY I FOUND MYSELF AT THE AGE OF TWENTY THE MEAN FOLLOWER OF A SUBLIME ART IN WHICH IF GREAT TALENT IS RIGHTLY ADMIRED MEDIOCRITY IS AS RIGHTLY DESPISED +HE HAD GAMBLED AND LOST A GREAT DEAL AND HIS BROTHER WAS HIS MOST BITTER ENEMY BECAUSE HE WAS INFATUATED WITH THE IDEA THAT HE HAD TRIED TO POISON HIM +I WAS COMPELLED BY POVERTY TO BECOME A MEMBER OF A MUSICAL BAND IN WHICH I COULD EXPECT NEITHER ESTEEM NOR CONSIDERATION AND I WAS WELL AWARE THAT I SHOULD BE THE LAUGHING STOCK OF THE PERSONS WHO HAD KNOWN ME AS A DOCTOR IN DIVINITY AS AN ECCLESIASTIC AND AS AN OFFICER IN THE ARMY AND HAD WELCOMED ME IN THE HIGHEST SOCIETY +I THREW MYSELF AT HIS FEET TO ASSURE HIM OF MY GRATITUDE AND EMBRACED HIM CALLING HIM MY FATHER +IT WENT ON TO SAY THAT THE TWO MEN WHO HAD CARRIED HER OFF HAD TAKEN HER TO SUCH A PLACE WHERE THEY HAD AN HOUR LATER BEEN MET BY THE OTHER SIX AND THAT THEY HAD ALL REPAIRED TO THE TWO SWORDS WHERE THEY HAD SPENT AN HOUR IN DRINKING +THE THREE FRIENDS WERE ASTOUNDED +MY READERS MAY IMAGINE WHETHER WE FELT INCLINED TO LAUGH WHEN THE CHARMING CREATURE BADE US GOOD NIGHT THANKING US ALL WITH PERFECT GOOD FAITH +WHOEVER YOU MAY BE I AM INDEBTED TO YOU FOR MY LIFE +THERE WAS NO COWARDLY TRAITOR AMONGST US ALTHOUGH WE WERE ALL POOR BUT FEAR HAD ITS EFFECT AND OUR NOCTURNAL PRANKS WERE NOT RENEWED +BESIDES I WAS OF OPINION THAT A MAN'S PROFESSION WHATEVER IT MIGHT BE OUGHT TO SUPPLY HIM WITH ENOUGH MONEY TO SATISFY ALL HIS WANTS AND THE VERY POOR PAY OF AN OFFICER WOULD NEVER HAVE BEEN SUFFICIENT TO COVER MY EXPENSES BECAUSE MY EDUCATION HAD GIVEN ME GREATER WANTS THAN THOSE OF OFFICERS IN GENERAL +YOU NEED NOT THINK OF THE FUTURE THINK ONLY OF ENJOYING YOURSELF AND TAKE ME AS YOUR ADVISER IN EVERYTHING THAT MAY HAPPEN TO YOU IN EVERYTHING YOU MAY WISH TO UNDERTAKE AND YOU MAY BE CERTAIN OF ALWAYS FINDING ME YOUR FRIEND +THIS IS THE AMUSING ADVENTURE WHICH CLOSED OUR EXPLOITS +I OBEYED IMPLICITLY AND MET YOUR EXCELLENCY +I RUBBED IT WITH ALL MY STRENGTH BUT HE TOLD ME IN A SORT OF INDISTINCT WHISPER THAT THE NUMBNESS WAS SPREADING ALL ALONG THE LEFT SIDE AND THAT HE WAS DYING +IN EVERY ONE OF THE SEVENTY TWO PARISHES OF THE CITY OF VENICE THERE IS A LARGE PUBLIC HOUSE CALLED MAGAZZINO +THE WAITER OF THE MAGAZZINO CAME TO BE PAID AND OUR CHIEF GAVE HIM WHAT WAS DUE ENJOINING SILENCE UNDER PENALTY OF DEATH +AS FOR THE EUCHARIST TRANSUBSTANTIATION THE REAL PRESENCE IT WAS ALL NO MYSTERY TO THEM BUT PALPABLE EVIDENCE AND YET THEY WERE NOT JESUITS +THEY WERE NOT ONLY GOOD CHRISTIANS AND FAITHFUL TO THE CHURCH BUT EVEN REAL DEVOTEES AND FULL OF SCRUPLES +DELIGHTED WITH SUCH A FORTUNATE RESULT WE LAY DOWN AGAIN +THE PHYSICIAN WHO ATTENDED HIM WAS NAMED TERRO HE THOUGHT BY SOME PECULIAR TRAIN OF REASONING THAT HE COULD CURE HIM BY APPLYING A MERCURIAL OINTMENT TO THE CHEST TO WHICH NO ONE RAISED ANY OBJECTION +TWO DAYS AFTERWARDS OUR NOCTURNAL ORGY BEGAN TO BE TALKED OF +HE WROTE THE QUESTION AND GAVE IT TO ME I READ IT I COULD NOT UNDERSTAND EITHER THE SUBJECT OR THE MEANING OF THE WORDS BUT IT DID NOT MATTER I HAD TO GIVE AN ANSWER +I MIGHT BE TOLD THAT IF I HAD WISHED TO FOLLOW THE RULES OF PURE MORALITY I OUGHT EITHER TO HAVE DECLINED INTIMATE INTERCOURSE WITH THEM OR TO HAVE UNDECEIVED THEM +BUT TO HAVE A FRIEND AND TO BE TRUE UNDER ANY AND ALL TRIALS IS THE MARK OF A MAN +BEFORE THIS CALAMITY CAME UPON US YOU COULD NOT FIND ANYWHERE A HAPPIER HOME THAN THAT CREATED BY THE INDIAN WOMAN +THIS WILD MOTHER HAS NOT ONLY THE EXPERIENCE OF HER MOTHER AND GRANDMOTHER AND THE ACCEPTED RULES OF HER PEOPLE FOR A GUIDE BUT SHE HUMBLY SEEKS TO LEARN A LESSON FROM ANTS BEES SPIDERS BEAVERS AND BADGERS +HE HAD NEITHER A NATIONAL ARMY NOR AN ORGANIZED CHURCH +HER ATTITUDE AND SECRET MEDITATIONS MUST BE SUCH AS TO INSTILL INTO THE RECEPTIVE SOUL OF THE UNBORN CHILD THE LOVE OF THE GREAT MYSTERY AND A SENSE OF BROTHERHOOD WITH ALL CREATION +INDEED THE DISTINCTIVE WORK OF BOTH GRANDPARENTS IS THAT OF ACQUAINTING THE YOUTH WITH THE NATIONAL TRADITIONS AND BELIEFS +OUR HONOR IS THE GUARANTEE FOR HIS SAFETY SO LONG AS HE IS WITHIN THE CAMP +WHEN SHE FELL THE WHOLE RACE FELL WITH HER +HE CUTS OFF THE CHOICEST MORSEL OF THE MEAT AND CASTS IT INTO THE FIRE THE PUREST AND MOST ETHEREAL ELEMENT +THE FAMILY WAS NOT ONLY THE SOCIAL UNIT BUT ALSO THE UNIT OF GOVERNMENT +LOVE BETWEEN MAN AND WOMAN IS FOUNDED ON THE MATING INSTINCT AND IS NOT FREE FROM DESIRE AND SELF SEEKING +WHEN HE BECOMES AN OLD MAN HE LOVES TO MAKE A NOTABLE EFFORT TO PROVE HIS GRATITUDE +IN DUE TIME THE CHILD TAKES OF HIS OWN ACCORD THE ATTITUDE OF PRAYER AND SPEAKS REVERENTLY OF THE POWERS +THE ORDEAL IS BEST MET ALONE WHERE NO CURIOUS OR PITYING EYES EMBARRASS HER WHERE ALL NATURE SAYS TO HER SPIRIT TIS LOVE TIS LOVE THE FULFILLING OF LIFE +HIS DAILY DEVOTIONS WERE MORE NECESSARY TO HIM THAN DAILY FOOD +WHENEVER IN THE COURSE OF THE DAILY HUNT THE RED HUNTER COMES UPON A SCENE THAT IS STRIKINGLY BEAUTIFUL OR SUBLIME A BLACK THUNDERCLOUD WITH THE RAINBOW'S GLOWING ARCH ABOVE THE MOUNTAIN A WHITE WATERFALL IN THE HEART OF A GREEN GORGE A VAST PRAIRIE TINGED WITH THE BLOOD RED OF SUNSET HE PAUSES FOR AN INSTANT IN THE ATTITUDE OF WORSHIP +THIS BOND IS BETWEEN MAN AND MAN IS USUALLY FORMED IN EARLY YOUTH AND CAN ONLY BE BROKEN BY DEATH +THE REMOTER DEGREES OF KINSHIP WERE FULLY RECOGNIZED AND THAT NOT AS A MATTER OF FORM ONLY FIRST COUSINS WERE KNOWN AS BROTHERS AND SISTERS THE NAME OF COUSIN CONSTITUTED A BINDING CLAIM AND OUR RIGID MORALITY FORBADE MARRIAGE BETWEEN COUSINS IN ANY KNOWN DEGREE OR IN OTHER WORDS WITHIN THE CLAN +THE HOSPITALITY OF THE WIGWAM IS ONLY LIMITED BY THE INSTITUTION OF WAR +AT ANOTHER TIME WHEN I WAS FOURTEEN YEARS OLD WE HAD JUST LEFT FORT ELLIS ON THE ASSINIBOINE RIVER AND MY YOUNGEST UNCLE HAD SELECTED A FINE SPOT FOR OUR NIGHT CAMP +AS A SPECIAL MARK OF RESPECT THE BODY OF A YOUNG WOMAN OR A WARRIOR WAS SOMETIMES LAID OUT IN STATE IN A NEW TEEPEE WITH THE USUAL HOUSEHOLD ARTICLES AND EVEN WITH A DISH OF FOOD LEFT BESIDE IT NOT THAT THEY SUPPOSED THE SPIRIT COULD USE THE IMPLEMENTS OR EAT THE FOOD BUT MERELY AS A LAST TRIBUTE +MANY OF THE INDIANS BELIEVED THAT ONE MAY BE BORN MORE THAN ONCE AND THERE WERE SOME WHO CLAIMED TO HAVE FULL KNOWLEDGE OF A FORMER INCARNATION +GIVING THEMSELVES UP WHOLLY TO THEIR GRIEF THEY ARE NO LONGER CONCERNED ABOUT ANY EARTHLY POSSESSION AND OFTEN GIVE AWAY ALL THAT THEY HAVE TO THE FIRST COMERS EVEN TO THEIR BEDS AND THEIR HOME +THIS WAS CARRIED OUT TO THE LETTER +IF A MAN WERE SLAIN IN BATTLE IT WAS AN OLD CUSTOM TO PLACE HIS BODY AGAINST A TREE OR ROCK IN A SITTING POSITION ALWAYS FACING THE ENEMY TO INDICATE HIS UNDAUNTED DEFIANCE AND BRAVERY EVEN IN DEATH +THERE ARE MANY TRUSTWORTHY MEN AND MEN OF CHRISTIAN FAITH TO VOUCH FOR THESE AND SIMILAR EVENTS OCCURRING AS FORETOLD +FIVE YEARS LATER HE REPEATED THE SERVICE AND AGAIN SAVED HIS PEOPLE FROM AWFUL SLAUGHTER +THIS WAS ONLY ONE OF HIS REMARKABLE PROPHECIES +AT THE AGE OF ABOUT SEVENTY FIVE YEARS HE SAVED HIS BAND FROM UTTER DESTRUCTION AT THE HANDS OF THEIR ANCESTRAL ENEMIES BY SUDDENLY GIVING WARNING RECEIVED IN A DREAM OF THE APPROACH OF A LARGE WAR PARTY +REINCARNATION AND THE CONVERSE OF SPIRITS +AT EVERY MEAL TIME A DISH OF FOOD WAS PLACED UNDER IT AND SOME PERSON OF THE SAME SEX AND AGE AS THE ONE WHO WAS GONE MUST AFTERWARD BE INVITED IN TO PARTAKE OF THE FOOD +ANOTHER FAMOUS MEDICINE MAN WAS BORN ON THE RUM RIVER ABOUT ONE HUNDRED AND FIFTY YEARS AGO AND LIVED TO BE OVER A CENTURY OLD +IT WAS PREPARED BY DRESSING IN THE FINEST CLOTHES TOGETHER WITH SOME PERSONAL POSSESSIONS AND ORNAMENTS WRAPPED IN SEVERAL ROBES AND FINALLY IN A SECURE COVERING OF RAW HIDE +AT THE END OF A YEAR FROM THE TIME OF DEATH THE RELATIVES MADE A PUBLIC FEAST AND GAVE AWAY THE CLOTHING AND OTHER GIFTS WHILE THE LOCK OF HAIR WAS INTERRED WITH APPROPRIATE CEREMONIES +THEREFORE HE COURTS DEATH IN BATTLE ON THE OTHER HAND HE WOULD REGARD IT AS DISGRACEFUL TO BE KILLED IN A PRIVATE QUARREL +THERE WAS A WELL KNOWN SIOUX WAR PROPHET WHO LIVED IN THE MIDDLE OF THE LAST CENTURY SO THAT HE IS STILL REMEMBERED BY THE OLD MEN OF HIS BAND +NO DOUBT MANY PREDICTIONS HAVE BEEN COLORED TO SUIT THE NEW AGE AND UNQUESTIONABLY FALSE PROPHETS FAKIRS AND CONJURERS HAVE BECOME THE PEST OF THE TRIBES DURING THE TRANSITION PERIOD +IT IS WELL KNOWN THAT THE AMERICAN INDIAN HAD SOMEHOW DEVELOPED OCCULT POWER AND ALTHOUGH IN THE LATTER DAYS THERE HAVE BEEN MANY IMPOSTORS AND ALLOWING FOR THE VANITY AND WEAKNESS OF HUMAN NATURE IT IS FAIR TO ASSUME THAT THERE MUST HAVE BEEN SOME EVEN IN THE OLD DAYS YET THERE ARE WELL ATTESTED INSTANCES OF REMARKABLE PROPHECIES AND OTHER MYSTIC PRACTICE +THE MEN BLACKEN THEIR FACES AND WIDOWS OR BEREAVED PARENTS SOMETIMES GASH THEIR ARMS AND LEGS TILL THEY ARE COVERED WITH BLOOD +TO THE UNTUTORED SAGE THE CONCENTRATION OF POPULATION WAS THE PROLIFIC MOTHER OF ALL EVILS MORAL NO LESS THAN PHYSICAL +IN HIS OWN THOUGHT HE ROSE SUPERIOR TO THEM HE SCORNED THEM EVEN AS A LOFTY SPIRIT ABSORBED IN ITS STERN TASK REJECTS THE SOFT BEDS THE LUXURIOUS FOOD THE PLEASURE WORSHIPING DALLIANCE OF A RICH NEIGHBOR +WHEN HE RETURNED TO THE CAMP HE MUST REMAIN AT A DISTANCE UNTIL HE HAD AGAIN ENTERED THE VAPOR BATH AND PREPARED HIMSELF FOR INTERCOURSE WITH HIS FELLOWS +IT WAS SILENT BECAUSE ALL SPEECH IS OF NECESSITY FEEBLE AND IMPERFECT THEREFORE THE SOULS OF MY ANCESTORS ASCENDED TO GOD IN WORDLESS ADORATION +THE ORIGINAL ATTITUDE OF THE AMERICAN INDIAN TOWARD THE ETERNAL THE GREAT MYSTERY THAT SURROUNDS AND EMBRACES US WAS AS SIMPLE AS IT WAS EXALTED +THE FIRST BAMBEDAY OR RELIGIOUS RETREAT MARKED AN EPOCH IN THE LIFE OF THE YOUTH WHICH MAY BE COMPARED TO THAT OF CONFIRMATION OR CONVERSION IN CHRISTIAN EXPERIENCE +IT WAS NOT THEN WHOLLY FROM IGNORANCE OR IMPROVIDENCE THAT HE FAILED TO ESTABLISH PERMANENT TOWNS AND TO DEVELOP A MATERIAL CIVILIZATION +FROM THE SUN AS THE UNIVERSAL FATHER PROCEEDS THE QUICKENING PRINCIPLE IN NATURE AND IN THE PATIENT AND FRUITFUL WOMB OF OUR MOTHER THE EARTH ARE HIDDEN EMBRYOS OF PLANTS AND MEN +NOTHING OF THE MARVELOUS COULD ASTONISH HIM AS THAT A BEAST SHOULD SPEAK OR THE SUN STAND STILL +KNOWING THAT GOD SETS NO VALUE UPON MATERIAL THINGS HE TOOK WITH HIM NO OFFERINGS OR SACRIFICES OTHER THAN SYMBOLIC OBJECTS SUCH AS PAINTS AND TOBACCO +IN THIS TYPE OF PRAYER THERE WAS NO BESEECHING OF FAVOR OR HELP +THIS IS THE MATERIAL OR PHYSICAL PRAYER +THAT SOLITARY COMMUNION WITH THE UNSEEN WHICH WAS THE HIGHEST EXPRESSION OF OUR RELIGIOUS LIFE IS PARTLY DESCRIBED IN THE WORD BAMBEDAY LITERALLY MYSTERIOUS FEELING WHICH HAS BEEN VARIOUSLY TRANSLATED FASTING AND DREAMING +THE HISTORIANS OF THE WHITE RACE ADMIT THAT THE INDIAN WAS NEVER THE FIRST TO REPUDIATE HIS OATH +AT THE SOLEMN HOUR OF SUNRISE OR SUNSET HE TOOK UP HIS POSITION OVERLOOKING THE GLORIES OF EARTH AND FACING THE GREAT MYSTERY AND THERE HE REMAINED NAKED ERECT SILENT AND MOTIONLESS EXPOSED TO THE ELEMENTS AND FORCES OF HIS ARMING FOR A NIGHT AND A DAY TO TWO DAYS AND NIGHTS BUT RARELY LONGER +NONE MIGHT EXHORT OR CONFESS OR IN ANY WAY MEDDLE WITH THE RELIGIOUS EXPERIENCE OF ANOTHER +THE SAVAGE PHILOSOPHER THE DUAL MIND +AMONG US ALL MEN WERE CREATED SONS OF GOD AND STOOD ERECT AS CONSCIOUS OF THEIR DIVINITY +HERE IS THE SUPREME MYSTERY THAT IS THE ESSENCE OF WORSHIP WITHOUT WHICH THERE CAN BE NO RELIGION AND IN THE PRESENCE OF THIS MYSTERY OUR ATTITUDE CANNOT BE VERY UNLIKE THAT OF THE NATURAL PHILOSOPHER WHO BEHOLDS WITH AWE THE DIVINE IN ALL CREATION +WHO MAY CONDEMN HIS SUPERSTITION +THEIR FRIENDS DID THEIR BEST TO AMUSE THEM +THEIR MINDS WERE SO DISTRACTED AT THIS CHANGE OF ROUTE AS TO BE QUITE UNHINGED +WILL HALLEY IS A BRUTE BUT I AM KEEPING MY EYES OPEN AND IF THE COAST LOOKS DANGEROUS I WILL PUT THE SHIP'S HEAD TO SEA AGAIN +SO THAT ON THAT SCORE THERE IS LITTLE OR NO DANGER +FORTUNATELY WILL HALLEY WAS NOT A MAN IN A HURRY AND DID NOT USE A PRESS OF CANVAS OR HIS MASTS WOULD INEVITABLY HAVE COME DOWN +THINK OF LADY GLENARVAN THINK OF MARY GRANT +YES MY LORD WE SHOULD TRY IN VAIN +BUT AS TO GETTING ALONGSIDE THE DUNCAN GOD FORBID +WHAT THEN MY LORD +WE WOULD FIGHT TO THE DEATH OF COURSE BUT AFTER THAT +JOHN MANGLES THEREFORE HOPED THAT THE WRETCHED HULL WOULD REACH PORT WITHOUT ACCIDENT BUT IT GRIEVED HIM THAT HIS COMPANIONS SHOULD HAVE TO SUFFER SO MUCH DISCOMFORT FROM THE DEFECTIVE ARRANGEMENTS OF THE BRIG +HIS EYES WANDERED CEASELESSLY OVER THE BLANK HORIZON +WE COULD NOT EVEN FLY FLY JOHN +GOD KEEP US FROM SUCH A MEETING WHY JOHN +MUCH AS THEY HAD BEEN INTERESTED IN HIS DISSERTATION ON THE PAMPAS OR AUSTRALIA HIS LECTURES ON NEW ZEALAND FELL ON COLD AND INDIFFERENT EARS +DON'T YOU SEE HOW MANY USES WE HAVE FOUND FOR THIS REFUSE COAL TAR +LOOK A LITTLE CLOSER WHILE OUR GUIDE LETS THE LIGHT OF HIS LAMP FALL UPON THE BLACK WALL AT YOUR SIDE +WHEN YOUR HANDS OR LIPS ARE CRACKED AND ROUGH FROM THE COLD DOES YOUR MOTHER EVER PUT ON GLYCERIN TO HEAL THEM +FERNS AND PALMS MOSSES AND TREES AND ANIMALS ALL PERFECT ALL BEAUTIFUL AND YET ALL HIDDEN AWAY UNDER THIS HILL AND TURNED INTO SHINING BLACK COAL NOW I CAN VERY WELL REMEMBER WHEN I FIRST SAW A COAL FIRE AND HOW ODD IT LOOKED TO SEE WHAT SEEMED TO BE BURNING STONES +WHY DID HE GIVE THAT SO ODD A SHAPE OR SO STRANGE A COVERING +ONCE THERE WAS A FATHER WHO THOUGHT HE WOULD BUILD FOR HIS CHILDREN A BEAUTIFUL HOME PUTTING INTO IT EVERY THING THEY COULD NEED OR DESIRE THROUGHOUT THEIR LIVES +FOR WHEN I WAS A LITTLE GIRL WE ALWAYS HAD LOGS OF WOOD BLAZING IN AN OPEN FIREPLACE AND SO DID MANY OTHER PEOPLE AND COAL WAS JUST COMING INTO USE FOR FUEL +SEE BENEATH YOUR FEET IS THE MARKING OF GREAT TREE TRUNKS LYING ASLANT ACROSS THE FLOOR AND THE FORMS OF GIGANTIC PALM LEAVES STREWED AMONG THEM +THE SWEETEST PERFUMES FLOATED THROUGH THE AIR WHILE THOUSANDS OF BIRDS ANSWERED THE MUSIC OF FOUNTAINS WITH THEIR SONGS +THEN THE HILLS WERE PILED UP ON TOP OF IT ALL BUT HERE AND THERE SOME EDGE OF A COAL BED WAS TILTED UP AND APPEARED ABOVE THE GROUND +THESE FORESTS WERE OF TREES DIFFERENT IN SOME WAYS FROM THOSE WE HAVE NOW GREAT FERNS AS TALL AS THIS HOUSE AND MOSSES AS HIGH AS LITTLE TREES AND PALM LEAVES OF ENORMOUS SIZE +IT WAS ONLY A TROUBLE TO THE GAS MAKERS WHO HAD NO USE FOR IT AND EVEN THREW IT AWAY UNTIL SOME ONE MORE THOUGHTFUL THAN THE OTHERS FOUND OUT THAT WATER WOULD NOT PASS THROUGH IT +AND SO THROUGH MANY QUESTIONS AND MANY EXPERIMENTS THEY LEARN AT LAST HOW TO USE THE CONTENTS OF THIS ONE STOREHOUSE +THE ENTRANCE IS LIGHT BECAUSE IT OPENS SO WIDE BUT WE CAN SEE THAT THE FLOOR SLOPES DOWNWARD AND THE WAY LOOKS DARK AND NARROW BEFORE US +HERE IS SOMETHING DIFFERENT ROUNDED LIKE A NUT SHELL YOU CAN SPLIT OFF ONE SIDE AND BEHOLD THERE IS THE NUT LYING SNUGLY AS DOES ANY CHESTNUT IN ITS BUR +WHAT SHOULD WE HAVE DONE IF EVERYBODY HAD KEPT ON BURNING WOOD TO THIS DAY +WALK DOWN THE SLOPING FOOT PATH NOW AND BE CAREFUL TO KEEP OUT OF THE WAY OF THE LITTLE CARS THAT ARE COMING AND GOING ON EACH SIDE OF YOU LOADED ON ONE SIDE AND EMPTY ON THE OTHER AND SEEMING TO RUN UP AND DOWN BY THEMSELVES +BUT BY AND BY THE WISE MEN THOUGHT ABOUT IT AND SAID TO THEMSELVES WE MUST FIND OUT WHAT USEFUL PURPOSE GOD MADE THE GAS FOR WE KNOW THAT HE DOES NOT MAKE ANY THING FOR HARM ONLY +ON THAT SIDE DESCENT WAS IMPOSSIBLE AND HAD IT BEEN POSSIBLE THE BOTTOM WAS SHUT IN BY THE ENORMOUS ROCK +WHAT COULD BE THE OBJECT +WATCH THE SAVAGES OUTSIDE SAID ROBERT +THE MEAL ENDED +LISTEN SAID HE MOTIONING THEM TO STOOP +IF IT IS DECREED THAT WE DIE TO MORROW LET US DIE BRAVELY LIKE CHRISTIAN MEN READY TO APPEAR WITHOUT TERROR BEFORE THE SUPREME JUDGE +JOHN YOU HAVE PROMISED MARY WHAT I PROMISED LADY HELENA WHAT IS YOUR PLAN +SLEEP WHICH KEEPS ALL SORROW IN ABEYANCE SOON WEIGHED DOWN THEIR EYELIDS THEY SLEPT IN EACH OTHER'S ARMS OVERCOME BY EXHAUSTION AND PROLONGED WATCHING +JOHN MANGLES INSERTING THE BLADE OF HIS PONIARD AVOIDED THE KNIFE WHICH NOW PROTRUDED ABOVE THE SOIL BUT SEIZED THE HAND THAT WIELDED IT +THEY HAD ONE NIGHT IN WHICH TO PREPARE FOR DEATH +THEIR FINGERS BLED BUT STILL THEY WORKED ON AFTER HALF AN HOUR THEY HAD GONE THREE FEET DEEP THEY PERCEIVED BY THE INCREASED SHARPNESS OF THE SOUNDS THAT ONLY A THIN LAYER OF EARTH PREVENTED IMMEDIATE COMMUNICATION +GOD WHO READS OUR HEARTS KNOWS THAT WE HAD A NOBLE END IN VIEW +DID THEY KNOW OF THE EXISTENCE OF THE PRISONERS OR WAS IT SOME PRIVATE ENTERPRISE THAT LED TO THE UNDERTAKING +THEY WERE NOT TO LEAVE IT AGAIN TILL THE TOPS OF THE WAHITI RANGES WERE LIT WITH THE FIRST FIRES OF DAY +MY CHILD MY CHILD MURMURED LADY HELENA THE SAVAGES DID NOT KILL YOU +I BELIEVE SAID JOHN THAT IN THE SIGHT OF GOD I HAVE A RIGHT TO FULFILL THAT PROMISE +BUT SOFTLY AS THE NAME WAS BREATHED MARY GRANT ALREADY AWAKENED BY THE SOUNDS IN THE HUT SLIPPED OVER TOWARD GLENARVAN AND SEIZING THE HAND ALL STAINED WITH EARTH SHE COVERED IT WITH KISSES +WILSON AND OLBINETT JOINED THEIR COMPANIONS AND ALL UNITED TO DIG THROUGH THE WALL JOHN WITH HIS DAGGER THE OTHERS WITH STONES TAKEN FROM THE GROUND OR WITH THEIR NAILS WHILE MULRADY STRETCHED ALONG THE GROUND WATCHED THE NATIVE GUARD THROUGH A CREVICE OF THE MATTING +AT LAST THE MAJOR SAID MY FRIENDS KEEP THAT TO THE LAST MOMENT +MY LORD WHICHEVER OF US SURVIVES THE OTHER WILL FULFILL THE WISH OF LADY HELENA AND MARY GRANT +GLENARVAN'S VOICE FIRM TILL NOW FALTERED +ANIMAL OR MAN ANSWERED THE MAJOR I WILL SOON FIND OUT +ROUND HIS BODY WAS ROLLED A LONG COIL OF FLAX ROPE +THE JAILER MAY FORGET THAT HE IS ON GUARD THE PRISONER NEVER FORGETS THAT HE IS GUARDED +CHAPTER THIRTY THREE A CONFIDANT +MISTER MORTON THEN MADE A CAREFUL MEMORANDUM OF THE VARIOUS PARTICULARS OF WAVERLEY'S INTERVIEW WITH DONALD BEAN LEAN AND THE OTHER CIRCUMSTANCES WHICH HE HAD COMMUNICATED +WHEN I WAS A YOUNG MAN LIKE YOU MISTER WAVERLEY ANY SUCH HAIR BRAINED EXPEDITION I BEG YOUR PARDON FOR THE EXPRESSION WOULD HAVE HAD INEXPRESSIBLE CHARMS FOR ME +EVIL TO HIM THAT THINKS OTHERWISE SAID MISTER MORTON OR WHO HOLDS CHURCH GOVERNMENT AND CEREMONIES AS THE EXCLUSIVE GAGE OF CHRISTIAN FAITH OR MORAL VIRTUE +SINCE THAT TIME THEIR NUMBERS HAVE GRADUALLY DIMINISHED BUT A GOOD MANY ARE STILL TO BE FOUND IN THE WESTERN COUNTIES AND SEVERAL WITH A BETTER TEMPER THAN IN SEVENTEEN O SEVEN HAVE NOW TAKEN ARMS FOR GOVERNMENT +HE HAD NEITHER SYMPATHY WITH MY INNOCENCE NOR WITH MY WRETCHEDNESS AND THE PETRIFYING ACCURACY WITH WHICH HE ATTENDED TO EVERY FORM OF CIVILITY WHILE HE TORTURED ME BY HIS QUESTIONS HIS SUSPICIONS AND HIS INFERENCES WAS AS TORMENTING AS THE RACKS OF THE INQUISITION +HE CERTAINLY POSSESSES TALENTS BEYOND THE RUDE SPHERE IN WHICH HE MOVES AND BEING NEITHER DESTITUTE OF AMBITION NOR ENCUMBERED WITH SCRUPLES HE WILL PROBABLY ATTEMPT BY EVERY MEANS TO DISTINGUISH HIMSELF DURING THE PERIOD OF THESE UNHAPPY COMMOTIONS +MISTER MORTON REPLIED THAT FAR FROM MAKING ANY CLAIM UPON HIS GOOD OPINION HIS ONLY WISH AND THE SOLE PURPOSE OF HIS VISIT WAS TO FIND OUT THE MEANS OF DESERVING IT +THEY HELD CONVENTICLES IN THE OPEN FIELDS AND BEING TREATED WITH GREAT VIOLENCE AND CRUELTY BY THE SCOTTISH GOVERNMENT MORE THAN ONCE TOOK ARMS DURING THOSE REIGNS +IT WAS ONE OF THOSE EFFECTS WHICH A PAINTER LOVES TO REPRESENT AND MINGLED WELL WITH THE STRUGGLING LIGHT WHICH FOUND ITS WAY BETWEEN THE BOUGHS OF THE SHADY ARCH THAT VAULTED THE BROAD GREEN ALLEY +THE HOUSE WHICH SEEMED TO CONSIST OF TWO OR THREE HIGH NARROW AND STEEP ROOFED BUILDINGS PROJECTING FROM EACH OTHER AT RIGHT ANGLES FORMED ONE SIDE OF THE INCLOSURE +THE EVIL AND REMEDY SUCH AS IT IS STILL EXIST BUT THIS IS REMOTE FROM OUR PRESENT PURPOSE AND IS ONLY THROWN OUT FOR CONSIDERATION OF THE COLLECTORS UNDER MISTER DENT'S DOG BILL +IT WAS ABOUT NOON WHEN CAPTAIN WAVERLEY ENTERED THE STRAGGLING VILLAGE OR RATHER HAMLET OF TULLY VEOLAN CLOSE TO WHICH WAS SITUATED THE MANSION OF THE PROPRIETOR +EVERYTHING AROUND APPEARED SOLITARY AND WOULD HAVE BEEN SILENT BUT FOR THE CONTINUED PLASHING OF THE FOUNTAIN AND THE WHOLE SCENE STILL MAINTAINED THE MONASTIC ILLUSION WHICH THE FANCY OF WAVERLEY HAD CONJURED UP +IT HAD BEEN BUILT AT A PERIOD WHEN CASTLES WERE NO LONGER NECESSARY AND WHEN THE SCOTTISH ARCHITECTS HAD NOT YET ACQUIRED THE ART OF DESIGNING A DOMESTIC RESIDENCE +NEITHER DID THE FRONT INDICATE ABSOLUTE SECURITY FROM DANGER +THE HOUSES SEEMED MISERABLE IN THE EXTREME ESPECIALLY TO AN EYE ACCUSTOMED TO THE SMILING NEATNESS OF ENGLISH COTTAGES +YET THE PHYSIOGNOMY OF THE PEOPLE WHEN MORE CLOSELY EXAMINED WAS FAR FROM EXHIBITING THE INDIFFERENCE OF STUPIDITY THEIR FEATURES WERE ROUGH BUT REMARKABLY INTELLIGENT GRAVE BUT THE VERY REVERSE OF STUPID AND FROM AMONG THE YOUNG WOMEN AN ARTIST MIGHT HAVE CHOSEN MORE THAN ONE MODEL WHOSE FEATURES AND FORM RESEMBLED THOSE OF MINERVA +THIS WORK OF ART WAS THE WONDER OF THE COUNTRY TEN MILES ROUND +THE COURT WAS SPACIOUS WELL PAVED AND PERFECTLY CLEAN THERE BEING PROBABLY ANOTHER ENTRANCE BEHIND THE STABLES FOR REMOVING THE LITTER +THIS AVENUE WAS STRAIGHT AND OF MODERATE LENGTH RUNNING BETWEEN A DOUBLE ROW OF VERY ANCIENT HORSE CHESTNUTS PLANTED ALTERNATELY WITH SYCAMORES WHICH ROSE TO SUCH HUGE HEIGHT AND NOURISHED SO LUXURIANTLY THAT THEIR BOUGHS COMPLETELY OVER ARCHED THE BROAD ROAD BENEATH +OCCASIONALLY INDEED WHEN SUCH A CONSUMMATION SEEMED INEVITABLE A WATCHFUL OLD GRANDAM WITH HER CLOSE CAP DISTAFF AND SPINDLE RUSHED LIKE A SIBYL IN FRENZY OUT OF ONE OF THESE MISERABLE CELLS DASHED INTO THE MIDDLE OF THE PATH AND SNATCHING UP HER OWN CHARGE FROM AMONG THE SUNBURNT LOITERERS SALUTED HIM WITH A SOUND CUFF AND TRANSPORTED HIM BACK TO HIS DUNGEON THE LITTLE WHITE HEADED VARLET SCREAMING ALL THE WHILE FROM THE VERY TOP OF HIS LUNGS A SHRILLY TREBLE TO THE GROWLING REMONSTRANCES OF THE ENRAGED MATRON +STABLES AND OTHER OFFICES OCCUPIED ANOTHER SIDE OF THE SQUARE +TWO BATTLEMENTED WALLS ONE OF WHICH FACED THE AVENUE AND THE OTHER DIVIDED THE COURT FROM THE GARDEN COMPLETED THE INCLOSURE +HER COMPLEXION WAS NOT A DECIDED PINK BUT A SOFT ROSY TINT NOT MUCH DEEPER THAN THAT OF TROT'S SKIN +WHAT IS IT CORALIE SHE ASKED THE WOMAN +WE DO NOT HATE YOU AS YOU SAY THE BLUESKINS DO NOR ARE WE SAVAGE OR CRUEL BUT WE DO NOT WANT YOU HERE AND I AM REALLY PUZZLED WHAT TO DO WITH YOU +THESE INTRUDERS ARE VERY PECULIAR PEOPLE REMARKED A MAN IN THE CROWD +YOU ARE NOT LIKE MY PEOPLE THE PINKIES AND THERE IS NO PLACE FOR YOU IN OUR COUNTRY +WHAT THAT LITTLE CABIN +A MISFORTUNE OF BIRTH PLACED ME HERE AND I CANNOT ESCAPE MY FATE +IN ALL OUR HISTORY YOU ARE THE FIRST PEOPLE FROM OUTSIDE OUR BORDERS WHO HAVE EVER STEPPED A FOOT IN OUR LAND +IF I LIVED AS LUXURIOUSLY AS MY PEOPLE DO AND HAD SERVANTS AND COSTLY GOWNS THE GOOD PINKIES WOULD SAY THAT THEIR QUEEN HAD MORE THAN THEY THEMSELVES AND IT WOULD BE TRUE +NO OUR WAY IS BEST +SHE SMILED A LITTLE SADLY AT TROT SEEMED TO APPROVE BUTTON BRIGHT'S OPEN FRANK FACE AND WAS QUITE SURPRISED BECAUSE CAP'N BILL WAS SO MUCH BIGGER THAN HER OWN PEOPLE +EVEN IN AMERICA EVER'BODY BOWS LOW TO OUR PRESIDENT AN THE BLUESKINS ARE SO FRAID O THEIR BOOLOOROO THAT THEY TREMBLE WHENEVER THEY GO NEAR HIM +THE PEOPLE MUST WAIT OUTSIDE FOR THERE IS NO ROOM FOR THEM IN THE PALACE +IN THAT CASE SAID BUTTON BRIGHT YOU'RE ENTITLED TO THE BEST THERE IS TO PAY FOR YOUR TROUBLE +BUT SURELY THAT IS ALL WRONG SAID TOURMALINE GRAVELY +YES IT WAS WET AN STICKY ALL RIGHT AGREED THE SAILOR BUT THE BIG FROG HELPED US AN WE GOT THROUGH ALL RIGHT +I'LL LOOK IN THE GREAT BOOK FIRST +I HAVE ONE GREAT PRIVILEGE +EXCLAIMED TROT OF COURSE +THERE IS NOTHING MAJESTIC ABOUT ME AS YOU KNOW VERY WELL +PERHAPS YOU ARE TRYING TO RIDICULE ME SHE CONTINUED REGARDING THE SAILOR'S FACE CLOSELY +THE QUEEN HAS NOTHING BUT THE POWER TO EXECUTE THE LAWS TO ADJUST GRIEVANCES AND TO COMPEL ORDER +IT HAD NO ORNAMENTATION BEING EXCEEDINGLY PLAIN IN APPEARANCE +ARE YOU A GIANT +THEY SEEM VERY IGNORANT POOR THINGS SAID ANOTHER IN REPLY +IT IS MUCH MORE DESIRABLE TO BE A PRIVATE CITIZEN HAPPY AND CARE FREE +HERE SAID ONE OF THEIR GUIDES AS THE PROCESSION HALTED BEFORE THE LITTLE STONE BUILDING IS THE PALACE OF TOURMALINE WHO IS OUR QUEEN +SHE WAS A BEAUTIFUL GIRL OF ABOUT SEVENTEEN YEARS OF AGE NOT FAT LIKE ALL THE REST OF THE PINKIES BUT SLENDER AND WELL FORMED ACCORDING TO OUR OWN IDEAS OF BEAUTY +THEREFORE I AM A MERE AGENT TO DIRECT THE LAWS WHICH ARE THE WILL OF THE PEOPLE AND AM ONLY A PUBLIC SERVANT OBLIGED CONSTANTLY TO GUARD THE WELFARE OF MY SUBJECTS +DID YOU SUPPOSE A PALACE WOULD BE LIKE ONE OF OUR HANDSOME RESIDENCES ASKED THE WOMAN EVIDENTLY SURPRISED +SO THEY FOLLOWED HER THROUGH THE LOW ARCHWAY AND IN A ROOM BEYOND VERY SIMPLY FURNISHED SAT A YOUNG GIRL ENGAGED IN DARNING A PAIR OF PINK STOCKINGS +THE QUEEN GAZED UPON OUR FRIENDS WITH EVIDENT INTEREST +CORALIE DO YOU CONSIDER MAJESTY A PROPER WORD TO USE WHEN ADDRESSING A QUEEN +AFTER MY DEATH A PINK MARBLE STATUE OF ME WILL BE SET UP IN THE GRAND COURT WITH THE STATUES OF THE OTHER KINGS AND QUEENS WHO HAVE RULED THIS LAND AND ALL THE PINKIES IN AGES TO COME WILL THEN HONOR ME AS HAVING BEEN A JUST AND UPRIGHT QUEEN THAT IS MY REWARD +HE WAS WISE IN HIS OWN CONCEIT +ON SUNDAY MORNING A CLEAR BEAUTIFUL AND STILL DAY THE ORDER WAS GIVEN FOR THE WHOLE ARMY TO ADVANCE AND TO ATTACK IMMEDIATELY +ON MONDAY THE TIDE WAS REVERSED +THIS WAS THE FIRST BIG BATTLE IN WHICH OUR REGIMENT HAD EVER BEEN ENGAGED +THE ROPE HOWEVER WAS STRONGER THAN THE MULE'S NO AND HE WAS FINALLY PREVAILED UPON BY THE STRENGTH OF THE ROPE TO CROSS THE CREEK +AS GLADDEN RODE BY US A COURIER RODE UP AND TOLD HIM SOMETHING +I HAD HEARD AND READ OF BATTLEFIELDS SEEN PICTURES OF BATTLEFIELDS OF HORSES AND MEN OF CANNON AND WAGONS ALL JUMBLED TOGETHER WHILE THE GROUND WAS STREWN WITH DEAD AND DYING AND WOUNDED BUT I MUST CONFESS THAT I NEVER REALIZED THE POMP AND CIRCUMSTANCE OF THE THING CALLED GLORIOUS WAR UNTIL I SAW THIS +BUT AS I SAID BEFORE READER A PRIVATE SOLDIER IS BUT AN AUTOMATON AND KNOWS NOTHING OF WHAT IS GOING ON AMONG THE GENERALS AND I AM ONLY GIVING THE CHRONICLES OF LITTLE THINGS AND EVENTS THAT CAME UNDER MY OWN OBSERVATION AS I SAW THEM THEN AND REMEMBER THEM NOW +THE FACT WAS KEPT FROM THE TROOPS +ABOUT DAYLIGHT ON SUNDAY MORNING CHALMERS BRIGADE RELIEVED GLADDEN'S +ON MY TAKING THE ROPE OFF HE SHOOK HIMSELF AND SEEMED TO SAY YOU THINK THAT YOU ARE MIGHTY SMART FOLKS BUT YOU ARE A LEETLE TOO SMART +OFFICERS COULD NOT CURB THE MEN TO KEEP IN LINE +ABOUT THE TIME HE PULLED TRIGGER A STRAY BALL FROM SOME DIRECTION STRUCK HIM IN THE SIDE AND HE FELL OFF DEAD AND HIS HORSE BECOMING FRIGHTENED GALLOPED OFF DRAGGING HIM THROUGH THE CONFEDERATE LINES +MULE DID NOT DESIRE TO CROSS WHILE I WAS TRYING TO PERSUADE HIM WITH A BIG STICK A ROCK IN HIS EAR AND A TWISTER ON HIS NOSE +SHOULD YOU DESIRE TO FIND OUT MORE ABOUT THE BATTLE I REFER YOU TO HISTORY +SO HE GOT A LARGE TWO INCH ROPE TIED ONE END AROUND THE MULE'S NECK AND THE OTHER TO THE CAISSON AND ORDERED THE DRIVER TO WHIP UP +I HAD BEEN FEELING MEAN ALL THE MORNING AS IF I HAD STOLEN A SHEEP BUT WHEN THE ORDER TO CHARGE WAS GIVEN I GOT HAPPY +THAT'S RIGHT MY BRAVE FIRST TENNESSEE GIVE EM HAIL COLUMBIA +WE HAD TO PASS OVER THE GROUND WHERE TROOPS HAD BEEN FIGHTING ALL DAY +SHILOH +I FREQUENTLY THOUGHT IT WOULD BE PLEASANT TO SPLIT THE DIFFERENCE WITH THAT MULE AND I WOULD GLADLY HAVE DONE SO IF I COULD HAVE GOTTEN ONE HALF OF HIS NO +I DO NOT PRETEND TO TELL OF WHAT COMMAND DISTINGUISHED ITSELF OF HEROES OF BLOOD AND WOUNDS OF SHRIEKS AND GROANS OF BRILLIANT CHARGES OF CANNON CAPTURED ET CETERA +WE WERE SUPPORTING AN ALABAMA BRIGADE +ON MONDAY MORNING I TOO CAPTURED ME A MULE +THE VOICE APPEARED TO BE OVERHEAD +BUT HOW TO GET HIM OUT WAS THE UNSOLVED PROBLEM +I DON'T THINK HIS GUN WAS LOADED THOUGH BECAUSE WE DID NOT HEAR THE BALL WHISTLE +THE POOR FELLOW STAYED IN THAT WELL ALL NIGHT +THOSE OLD SOLDIERS HAD LONG LONG AGO FORGOTTEN ABOUT THAT OLD LAW OF THE LONG GONE PAST BUT JIM HAD TREASURED IT UP IN HIS MEMORY LO THESE MANY YEARS AND HE THOUGHT IT WOULD SERVE HIM NOW AS IT HAD NO DOUBT FREQUENTLY DONE IN THE PAST +HE WALKED UP AND SAYS HELLO BOYS WHAT IS IT BOSS +WE WERE INURED TO PRIVATIONS AND HARDSHIPS HAD BEEN UPON EVERY MARCH IN EVERY BATTLE IN EVERY SKIRMISH IN EVERY ADVANCE IN EVERY RETREAT IN EVERY VICTORY IN EVERY DEFEAT +WE WALKED OVER THIS FLOATING BRIDGE AND SOON FOUND OURSELVES ON THE TENNESSEE SIDE OF TENNESSEE RIVER +WE PASSED AROUND ATLANTA CROSSED THE CHATTAHOOCHEE AND TRAVELED BACK OVER THE SAME ROUTE ON WHICH WE HAD MADE THE ARDUOUS CAMPAIGN UNDER JOE JOHNSTON +THE THIRD DAY IT WAS REPORTED THAT THE YANKEES HAD TAKEN POSITION ON THE MURFREESBORO PIKE +WE LOOKED ALL AROUND AND THOUGHT THAT THE COAST WAS CLEAR +A REGIMENT WAS SENT TO THE ATTACK IT WAS JIM'S REGIMENT +HOW EVERY PULSE DID BEAT AND LEAP AND HOW EVERY HEART DID THROB WITH EMOTIONS OF JOY WHICH SEEMED NEARLY AKIN TO HEAVEN WHEN WE RECEIVED THE GLAD INTELLIGENCE OF OUR ONWARD MARCH TOWARD THE LAND OF PROMISE AND OF OUR LOVED ONES +THEY PERSUADED ELOQUENTLY +BUT AFTER AWHILE JIM SAYS GENTLEMEN AY GANNY THE LAW +RIGHT BEFORE ME I SAW THE LONG DRY GRASS ALL BENDING TOWARD A COMMON CENTER AND I KNEW THAT IT WAS AN OLD WELL AND THAT MY COMRADE HAD FALLEN IN IT +HE HADN'T SEEN ANYTHING TO SHOOT AT BUT HE BLAZED AWAY HE LOADED AND FIRED THE SECOND TIME WHEN THEY WERE ORDERED TO RETREAT +HE WANTED TO GO BY HOME AND TELL HIS WIFE AND CHILDREN GOOD BYE AND TO GET HIS CLOTHES IT WAS NO GO +WE HAD BEEF FOR SUPPER THAT NIGHT +A YANKEE ALWAYS SAYS NAGER +YANK SAYS WHAT YOU DOING JOHNNY +ADVANCE INTO TENNESSEE +A MAN IN THE WELL +OUTSIDE OF THESE OCCASIONAL REMINDERS WE COULD SEE NO EVIDENCE OF THE DESOLATION OF THE TRACK OF AN INVADING ARMY +YOU SEE JIM KNOWED THE LAW +WE WERE NOT TWENTY YARDS OFF FROM THE YANKEES AND THEY WERE POURING THE HOT SHOT AND SHELLS RIGHT INTO OUR RANKS AND EVERY MAN WAS YELLING AT THE TOP OF HIS VOICE CEASE FIRING YOU ARE FIRING ON YOUR OWN MEN CEASE FIRING YOU ARE FIRING ON YOUR OWN MEN +I SOON FOUND OUT THAT HE HAD CAUGHT SIGHT OF THE RELIEF ON THE ROAD AND WAS AFRAID TO SHOOT I QUICKLY MADE UP MY MIND +WE KEPT FALLING BACK AND FIRING ALL DAY AND WERE RELIEVED BY ANOTHER REGIMENT ABOUT DARK WE REJOINED OUR REGIMENT +I THINK WE MUST HAVE KILLED A GOOD MANY IN THE OLD FIELD BECAUSE WE WERE FIRING ALL THE TIME AT THE SOLID LINE AS THEY ADVANCED UPON US +MY GUN WAS AT MY FEET AND ONE STEP WOULD GET IT +THE PRIVATE COULD BUT HE WAS NO GENERAL YOU SEE +WE REMAINED SEVERAL MONTHS BUT SOON WE WERE ON THE TRAMP AGAIN +I THOUGHT IT HAD BEEN TORN FROM MY SHOULDER +I MADE A QUICK GLANCE OVER MY SHOULDER AND GRABBED AT MY GUN +FROM TIME TO TIME DIFFERENT REGIMENTS WERE SENT FORWARD TO DO PICKET DUTY +HE DIVINED MY MOTIVE AND FIRED THE BALL MISSED ITS AIM +THE YANKEE PICKET LINES WERE NOT A HALF MILE OFF +I AM A VIDET YOU KNOW THE RESPONSIBILITY RESTING ON ME +WE WERE ORDERED FORWARD TO THE ATTACK +BUT I COULD NOT BEAR THE THOUGHT OF WEARING DEAD MEN'S SHOES +I LOOKED AT IT PRETTY CLOSE AND I SAID GREAT GOD +HE WAS WALKING ALONG WHEN ALL AT ONCE HE DROPPED DOWN AND DIED WITHOUT A STRUGGLE OR A GROAN +SAYS HE I WOULD NOT TRUST A SECESH ON HIS WORD OATH OR BOND MARCH I SAY +I SAW AND FELT THAT HE WAS NOT FIGHTING FOR GLORY BUT THAT HE WAS FIGHTING FOR HIS COUNTRY BECAUSE HE LOVED THAT COUNTRY AND HE WAS WILLING TO GIVE HIS LIFE FOR HIS COUNTRY AND THE SUCCESS OF OUR CAUSE +BAD GENERALSHIP I THOUGHT IT WAS CHRISTMAS +OAKLEY COLOR BEARER OF THE FOURTH TENNESSEE REGIMENT RAN RIGHT UP IN THE MIDST OF THE YANKEE LINE WITH HIS COLORS BEGGING HIS MEN TO FOLLOW +OUR ARMY STOPPED AT MURFREESBORO +WE WERE AT THAT TIME AT LEAST A HUNDRED YARDS IN ADVANCE OF THE BRIGADE CHEATHAM ALL THE TIME CALLING UPON THE MEN TO COME ON +WE WERE RIGHT UPON THE YANKEE LINE ON THE WILKERSON TURNPIKE +HE WAS STONE DEAD BUT I DROPPED THAT FOOT QUICK +OUR PICKETS HAD RUN IN AND REPORTED A NIGHT ATTACK +THE FEDERAL ARMY WAS CONCENTRATING AT NASHVILLE THERE WAS NO REST FOR THE WEARY +THE LEADEN HAIL STORM SWEPT THEM OFF THE FIELD THEY FELL BACK AND RE FORMED +BEFORE WE ARRIVED AT THE HOUSE WE SAW A BODY OF YANKEES APPROACHING AND AS WE STARTED TO RUN BACK THEY FIRED UPON US +LINE OF BATTLE WAS FORMED ON THE NORTH BANK OF STONE'S RIVER ON THE YANKEE SIDE +THE YANKEES MARCHED OVER THE HILL OUT OF SIGHT +I CALLED LIEUTENANT COLONEL FRIERSON'S ATTENTION TO THE YANKEES AND HE REMARKED WELL I DON'T KNOW WHETHER THEY ARE YANKEES OR NOT BUT IF THEY ARE THEY WILL COME OUT OF THERE MIGHTY QUICK +AS SOON AS EVER OF MY SECOND AGE I WAS UPON THE THRESHOLD AND CHANGED LIFE HIMSELF FROM ME HE TOOK AND GAVE TO OTHERS +BUT WITH FULL RAVISHMENT THE HOURS OF PRIME SINGING RECEIVED THEY IN THE MIDST OF LEAVES THAT EVER BORE A BURDEN TO THEIR RHYMES +BETWEEN HER STEPS AND MINE WERE NOT A HUNDRED WHEN EQUALLY THE MARGINS GAVE A TURN IN SUCH A WAY THAT TO THE EAST I FACED +THESE STANDARDS TO THE REARWARD LONGER WERE THAN WAS MY SIGHT AND AS IT SEEMED TO ME TEN PACES WERE THE OUTERMOST APART +I SAW THE LADY WHO EREWHILE APPEARED VEILED UNDERNEATH THE ANGELIC FESTIVAL DIRECT HER EYES TO ME ACROSS THE RIVER +BY HIS DEFAULT SHORT WHILE HE SOJOURNED HERE BY HIS DEFAULT TO WEEPING AND TO TOIL HE CHANGED HIS INNOCENT LAUGHTER AND SWEET PLAY +THIS EVERY OTHER SAVOUR DOTH TRANSCEND AND NOTWITHSTANDING SLAKED SO FAR MAY BE THY THIRST THAT I REVEAL TO THEE NO MORE +AS SOON AS ON MY VISION SMOTE THE POWER SUBLIME THAT HAD ALREADY PIERCED ME THROUGH ERE FROM MY BOYHOOD I HAD YET COME FORTH +YE KEEP YOUR WATCH IN THE ETERNAL DAY SO THAT NOR NIGHT NOR SLEEP CAN STEAL FROM YOU ONE STEP THE AGES MAKE UPON THEIR PATH +TO THE LEFT HAND I TURNED WITH THAT RELIANCE WITH WHICH THE LITTLE CHILD RUNS TO HIS MOTHER WHEN HE HAS FEAR OR WHEN HE IS AFFLICTED +NOT ONLY ROME WITH NO SUCH SPLENDID CAR E'ER GLADDENED AFRICANUS OR AUGUSTUS BUT POOR TO IT THAT OF THE SUN WOULD BE +AND WHEN THE CAR WAS OPPOSITE TO ME THUNDER WAS HEARD AND ALL THAT FOLK AUGUST SEEMED TO HAVE FURTHER PROGRESS INTERDICTED +CONFUSION AND DISMAY TOGETHER MINGLED FORCED SUCH A YES FROM OUT MY MOUTH THAT SIGHT WAS NEEDFUL TO THE UNDERSTANDING OF IT +TO SAY UNTO VIRGILIUS NOT A DRACHM OF BLOOD REMAINS IN ME THAT DOES NOT TREMBLE I KNOW THE TRACES OF THE ANCIENT FLAME +THE GOOD SUPREME SOLE IN ITSELF DELIGHTING CREATED MAN GOOD AND THIS GOODLY PLACE GAVE HIM AS HANSEL OF ETERNAL PEACE +THOU MAKEST ME REMEMBER WHERE AND WHAT PROSERPINA THAT MOMENT WAS WHEN LOST HER MOTHER HER AND SHE HERSELF THE SPRING +I DO NOT THINK THERE SHONE SO GREAT A LIGHT UNDER THE LIDS OF VENUS WHEN TRANSFIXED BY HER OWN SON BEYOND HIS USUAL CUSTOM +BUT BY THE LARGESS OF CELESTIAL GRACES WHICH HAVE SUCH LOFTY VAPOURS FOR THEIR RAIN THAT NEAR TO THEM OUR SIGHT APPROACHES NOT +DANTE BECAUSE VIRGILIUS HAS DEPARTED DO NOT WEEP YET DO NOT WEEP YET AWHILE FOR BY ANOTHER SWORD THOU NEED'ST MUST WEEP +AND ONE OF THEM AS IF BY HEAVEN COMMISSIONED SINGING VENI SPONSA DE LIBANO SHOUTED THREE TIMES AND ALL THE OTHERS AFTER +YE ARE NEW COMERS AND BECAUSE I SMILE BEGAN SHE PERADVENTURE IN THIS PLACE ELECT TO HUMAN NATURE FOR ITS NEST +THREE MAIDENS AT THE RIGHT WHEEL IN A CIRCLE CAME ONWARD DANCING ONE SO VERY RED THAT IN THE FIRE SHE HARDLY HAD BEEN NOTED +LOOK AT ME WELL IN SOOTH I'M BEATRICE +ALL WATERS THAT ON EARTH MOST LIMPID ARE WOULD SEEM TO HAVE WITHIN THEMSELVES SOME MIXTURE COMPARED WITH THAT WHICH NOTHING DOTH CONCEAL +WHENCE SHE TO ME IN THOSE DESIRES OF MINE WHICH LED THEE TO THE LOVING OF THAT GOOD BEYOND WHICH THERE IS NOTHING TO ASPIRE TO +NOW HELICON MUST NEEDS POUR FORTH FOR ME AND WITH HER CHOIR URANIA MUST ASSIST ME TO PUT IN VERSE THINGS DIFFICULT TO THINK +THE INTERVAL BETWEEN THESE FOUR CONTAINED A CHARIOT TRIUMPHAL ON TWO WHEELS WHICH BY A GRIFFIN'S NECK CAME DRAWN ALONG +NOR EVEN THUS OUR WAY CONTINUED FAR BEFORE THE LADY WHOLLY TURNED HERSELF UNTO ME SAYING BROTHER LOOK AND LISTEN +AND I BEHELD THE FLAMELETS ONWARD GO LEAVING BEHIND THEMSELVES THE AIR DEPICTED AND THEY OF TRAILING PENNONS HAD THE SEMBLANCE SO THAT IT OVERHEAD REMAINED DISTINCT WITH SEVENFOLD LISTS ALL OF THEM OF THE COLOURS WHENCE THE SUN'S BOW IS MADE AND DELIA'S GIRDLE +THEREFORE MY ANSWER IS WITH GREATER CARE THAT HE MAY HEAR ME WHO IS WEEPING YONDER SO THAT THE SIN AND DOLE BE OF ONE MEASURE +IN REAR OF ALL THE GROUP HERE TREATED OF TWO OLD MEN I BEHELD UNLIKE IN HABIT BUT LIKE IN GAIT EACH DIGNIFIED AND GRAVE +AND WHAT ALLUREMENTS OR WHAT VANTAGES UPON THE FOREHEAD OF THE OTHERS SHOWED THAT THOU SHOULDST TURN THY FOOTSTEPS UNTO THEM +THEN BACK I TURNED MY FACE TO THOSE HIGH THINGS WHICH MOVED THEMSELVES TOWARDS US SO SEDATELY THEY HAD BEEN DISTANCED BY NEW WEDDED BRIDES +MUST I LEAVE ALONE NO +MY FATHER HAS REVEALED THE CULPRIT'S NAME MY FATHER THIRSTS FOR REVENGE AS MUCH AS YOU DO YET EVEN HE CONJURES YOU AS I DO TO KEEP THIS SECRET DO YOU NOT FATHER +AND THE CRY ISSUED FROM HIS PORES IF WE MAY THUS SPEAK A CRY FRIGHTFUL IN ITS SILENCE +THE OLD MAN'S EYES REMAINED FIXED ON THE DOOR +BUT IN LESS THAN FIVE MINUTES THE STAIRCASE GROANED BENEATH AN EXTRAORDINARY WEIGHT +THE TWO DOCTORS THEREFORE ENTERED THE ROOM ALONE +I AM GOING SIR AND I DO NOT HESITATE TO SAY THAT NO PRAYERS WILL BE MORE FERVENT THAN MINE +D'AVRIGNY UNABLE TO BEAR THE SIGHT OF THIS TOUCHING EMOTION TURNED AWAY AND VILLEFORT WITHOUT SEEKING ANY FURTHER EXPLANATION AND ATTRACTED TOWARDS HIM BY THE IRRESISTIBLE MAGNETISM WHICH DRAWS US TOWARDS THOSE WHO HAVE LOVED THE PEOPLE FOR WHOM WE MOURN EXTENDED HIS HAND TOWARDS THE YOUNG MAN +GENTLEMEN HE SAID IN A HOARSE VOICE GIVE ME YOUR WORD OF HONOR THAT THIS HORRIBLE SECRET SHALL FOREVER REMAIN BURIED AMONGST OURSELVES THE TWO MEN DREW BACK +D'AVRIGNY RUSHED TOWARDS THE OLD MAN AND MADE HIM INHALE A POWERFUL RESTORATIVE +MORREL SUFFERED AN EXCLAMATION OF HORROR AND SURPRISE TO ESCAPE HIM +ASKED MORREL YES +IT WAS SOMETHING TERRIBLE TO WITNESS THE SILENT AGONY THE MUTE DESPAIR OF NOIRTIER WHOSE TEARS SILENTLY ROLLED DOWN HIS CHEEKS +GO DO YOU HEAR +THE DISTRICT DOCTOR APPROACHED WITH THE INDIFFERENCE OF A MAN ACCUSTOMED TO SPEND HALF HIS TIME AMONGST THE DEAD HE THEN LIFTED THE SHEET WHICH WAS PLACED OVER THE FACE AND JUST UNCLOSED THE LIPS +SAID MORREL SADLY YES REPLIED NOIRTIER +OH YOU RAVE SIR EXCLAIMED VILLEFORT IN VAIN ENDEAVORING TO ESCAPE THE NET IN WHICH HE WAS TAKEN I RAVE +DO YOU KNOW THE ASSASSIN ASKED MORREL +THE OLD MAN MADE A SIGN IN THE AFFIRMATIVE +NOIRTIER WAS NEAR THE BED PALE MOTIONLESS AND SILENT AS THE CORPSE +THE NEAREST SAID THE DISTRICT DOCTOR IS A GOOD ITALIAN ABBE WHO LIVES NEXT DOOR TO YOU SHALL I CALL ON HIM AS I PASS +AT THIS MOMENT THE WHOLE SOUL OF THE OLD MAN SEEMED CENTRED IN HIS EYES WHICH BECAME BLOODSHOT THE VEINS OF THE THROAT SWELLED HIS CHEEKS AND TEMPLES BECAME PURPLE AS THOUGH HE WAS STRUCK WITH EPILEPSY NOTHING WAS WANTING TO COMPLETE THIS BUT THE UTTERANCE OF A CRY +WHAT DO YOU MEAN SIR +BUT CAN HE UNDERSTAND YOU YES +D'AVRIGNY SAID VILLEFORT BE SO KIND I BESEECH YOU AS TO ACCOMPANY THIS GENTLEMAN HERE IS THE KEY OF THE DOOR SO THAT YOU CAN GO IN AND OUT AS YOU PLEASE YOU WILL BRING THE PRIEST WITH YOU AND WILL OBLIGE ME BY INTRODUCING HIM INTO MY CHILD'S ROOM DO YOU WISH TO SEE HIM +BUT HE STOPPED ON THE LANDING HE HAD NOT THE COURAGE TO AGAIN VISIT THE DEATH CHAMBER +I ONLY WISH TO BE ALONE YOU WILL EXCUSE ME WILL YOU NOT +NOIRTIER LOOKED UPON MORREL WITH ONE OF THOSE MELANCHOLY SMILES WHICH HAD SO OFTEN MADE VALENTINE HAPPY AND THUS FIXED HIS ATTENTION +FOR SOME TIME NOTHING WAS HEARD IN THAT CHAMBER BUT SOBS EXCLAMATIONS AND PRAYERS +I COULD NOT TAKE MY EYES OFF THE MAN IN THE BED +THE LITTLE HOUSE ON THE HILLSIDE WAS SO MUCH THE COLOR OF THE NIGHT THAT WE COULD NOT SEE IT AS WE CAME UP THE DRAW +SHE ASKED PETER TO WAIT A MOMENT AND WHEN SHE CAME BACK FROM THE KITCHEN SHE BROUGHT A BAG OF SANDWICHES AND DOUGHNUTS FOR US +HE LAY PATIENTLY FIGHTING FOR BREATH LIKE A CHILD WITH CROUP +WHEN HE WAS OUT HUNTING HE USED TO GO INTO THE EMPTY LOG HOUSE AND SIT THERE BROODING +PETER CROUCHING IN THE FRONT SEAT SAW NOTHING +WITHOUT A WORD PETER GOT UP AND LIT HIS LANTERN +QUICKLY IT WAS COVERED WITH BRIGHT RED SPOTS I THOUGHT I HAD NEVER SEEN ANY BLOOD SO BRIGHT +THE ROAD WAS CLEAR AND WHITE AND THE GROOM'S THREE BLACKS WENT LIKE THE WIND +THEY MADE ME THINK OF DEFEATED ARMIES RETREATING OR OF GHOSTS WHO WERE TRYING DESPERATELY TO GET IN FOR SHELTER AND THEN WENT MOANING ON +THE SHARP SMELL OF SPIRITS WENT THROUGH THE ROOM +YES HOW MANY +WHEREVER THEY WENT THE STORY FOLLOWED THEM +THIS CABIN WAS HIS HERMITAGE UNTIL THE WINTER SNOWS PENNED HIM IN HIS CAVE +THE SHRIEKS THAT FOLLOWED MADE EVERYBODY SOBER +AND THE WOLVES PAVEL ASKED ENOUGH ENOUGH FOR ALL OF US +SOMETHING HAPPENED TO THE HINDMOST SLEDGE THE DRIVER LOST CONTROL HE WAS PROBABLY VERY DRUNK THE HORSES LEFT THE ROAD THE SLEDGE WAS CAUGHT IN A CLUMP OF TREES AND OVERTURNED +FROM OUR BENCH WE COULD SEE WHAT A HOLLOW CASE HIS BODY WAS +DURING THE AUCTION HE WENT ABOUT WITH HIS HEAD DOWN AND NEVER LIFTED HIS EYES +GRADUALLY RELIEF CAME TO ALL OF US +THE SICK MAN RAGED AND SHOOK HIS FIST +THE LOSS OF HIS TWO FRIENDS HAD A DEPRESSING EFFECT UPON OLD MISTER SHIMERDA +MISTER SHIMERDA WENT WITH HIM +IT SEEMED TO ME THAT HE DESPISED HIM FOR BEING SO SIMPLE AND DOCILE +ANTONIA'S FATHER UNCOVERED ONE OF HIS LONG BONY LEGS AND RUBBED IT RHYTHMICALLY +THE FIRST HOWLS WERE TAKEN UP AND ECHOED AND WITH QUICKENING REPETITIONS +PETER TOLD HIS TROUBLES TO MISTER SHIMERDA HE WAS UNABLE TO MEET A NOTE WHICH FELL DUE ON THE FIRST OF NOVEMBER HAD TO PAY AN EXORBITANT BONUS ON RENEWING IT AND TO GIVE A MORTGAGE ON HIS PIGS AND HORSES AND EVEN HIS MILK COW +A BLACK DROVE CAME UP OVER THE HILL BEHIND THE WEDDING PARTY +TWENTY THIRTY ENOUGH +WE LAY STILL AND DID NOT TALK +THEY WERE RUN OUT OF THEIR VILLAGE +THEY WORKED IN CHICAGO DES MOINES FORT WAYNE BUT THEY WERE ALWAYS UNFORTUNATE +THE FIRST THING EITHER OF THEM NOTICED WAS A NEW SOUND THAT BROKE INTO THE CLEAR AIR LOUDER THAN THEY HAD EVER HEARD IT BEFORE THE BELL OF THE MONASTERY OF THEIR OWN VILLAGE RINGING FOR EARLY PRAYERS +PETER COULD GIVE NO VERY CLEAR ACCOUNT OF HIS TRANSACTIONS WITH CUTTER +EVERY ONE SAID PETER KISSED THE COW BEFORE SHE WAS LED AWAY BY HER NEW OWNER +HE SEEMED TO BE CURSING PEOPLE WHO HAD WRONGED HIM +THEY WERE WITHIN A FEW MILES OF THEIR VILLAGE NOW +THERE ARE ONLY THREE SLEDGES LEFT HE WHISPERED +PAVEL KNOCKED HIM OVER THE SIDE OF THE SLEDGE AND THREW THE GIRL AFTER HIM +AFTER THE CEREMONY AT THE CHURCH THE PARTY WENT TO A DINNER GIVEN BY THE PARENTS OF THE BRIDE +NOW HIS MIDDLE HORSE WAS BEING ALMOST DRAGGED BY THE OTHER TWO +I EXPLAINED TO ANTONIA HOW THIS MEANT THAT HE WAS TWENTY FOUR YEARS OLD THAT HE MUST HAVE BEEN THERE WHEN WHITE MEN FIRST CAME LEFT ON FROM BUFFALO AND INDIAN TIMES +I FOLLOWED WITH THE SPADE OVER MY SHOULDER DRAGGING MY SNAKE +I NEVER KNOW YOU WAS SO BRAVE JIM SHE WENT ON COMFORTINGLY +I WHIRLED ROUND AND THERE ON ONE OF THOSE DRY GRAVEL BEDS WAS THE BIGGEST SNAKE I HAD EVER SEEN +HE COULD STAND RIGHT UP AND TALK TO YOU HE COULD DID HE FIGHT HARD +OTTO WINKED AT ME +ONE DAY WHEN I RODE OVER TO THE SHIMERDAS I FOUND ANTONIA STARTING OFF ON FOOT FOR RUSSIAN PETER'S HOUSE TO BORROW A SPADE AMBROSCH NEEDED +THERE HAD BEEN ANOTHER BLACK FROST THE NIGHT BEFORE AND THE AIR WAS CLEAR AND HEADY AS WINE +WE DECIDED THAT ANTONIA SHOULD RIDE DUDE HOME AND I WOULD WALK +A SNAKE OF HIS SIZE IN FIGHTING TRIM WOULD BE MORE THAN ANY BOY COULD HANDLE +OTTO FUCHS WAS THE FIRST ONE WE MET +LOOK TONY THAT'S HIS POISON I SAID +THIS CHANGE CAME ABOUT FROM AN ADVENTURE WE HAD TOGETHER +A FAINT FETID SMELL CAME FROM HIM AND A THREAD OF GREEN LIQUID OOZED FROM HIS CRUSHED HEAD +SHE WAS FOUR YEARS OLDER THAN I TO BE SURE AND HAD SEEN MORE OF THE WORLD BUT I WAS A BOY AND SHE WAS A GIRL AND I RESENTED HER PROTECTING MANNER +I KNOW I AM JUST AWFUL JIM I WAS SO SCARED +IT WAS ON ONE OF THESE GRAVEL BEDS THAT I MET MY ADVENTURE +IT WAS THE SEASON WHEN THE ANCIENT SUN GOD HAD BEEN ACCUSTOMED TO RECEIVE HIS ANNUAL OBLATIONS AND WE CAN WELL BELIEVE THAT THOSE WHOSE HEARTS STILL TREMBLED AT THE NAME OF BEL MUST HAVE CONNECTED THE ECLIPSE AND THE PLAGUE WITH THE REVOLUTION IN THE NATIONAL WORSHIP AND THE OVERTHROW OF THE ANCIENT GODS ON THAT PLAIN OF PROSTRATION WHERE THEY HAD SO LONG RECEIVED THE HOMAGE OF AN ENTIRE PEOPLE +SO SLOW AND PATIENT IS THE PROCESS BY WHICH CHRISTIANITY INFUSES ITSELF INTO THE SOCIAL LIFE OF A CONVERTED PEOPLE +NOTHING COULD BE MORE NATURAL THAN SUCH AN ASSEMBLY IN SUCH A PLACE AT SUCH A PERIOD +LASTLY THE ROYAL BROTHERS FELL THEMSELVES VICTIMS TO THE EPIDEMIC WHICH SO SADLY SIGNALIZES THEIR REIGN +THE TRIBUTE WAS AT THIS PERIOD ENORMOUS FIFTEEN THOUSAND HEAD OF CATTLE ANNUALLY +THE KINGDOM OF NORTHUMBRIA AS THE NAME IMPLIES EMBRACED NEARLY ALL THE COUNTRY FROM THE HUMBER TO THE PICTISH BORDER +HERE THE HOLY PRELATE OF FERNS MET HIM AND RELATED A VISION IN WHICH HE HAD BEEN INSTRUCTED TO DEMAND THE ABOLITION OF THE IMPOST +THE POETS OF SUCCEEDING AGES HAVE DWELT MUCH IN DETAIL ON THE OCCURRENCES OF THIS MEMORABLE DAY +THE SAXONS OF KENT AND THE SOUTHERN KINGDOMS GENERALLY WERE CONVERTED BY MISSIONARIES FROM FRANCE OR ROME OR NATIVE PREACHERS OF THE FIRST OR SECOND CHRISTIAN GENERATION THOSE OF NORTHUMBRIA RECOGNISE AS THEIR APOSTLES SAINT AIDAN AND SAINT CUTHBERT TWO FATHERS FROM IONA +IT IS PRETTY CLEAR ALSO THAT THE LAST RALLY OF DRUIDISM AGAINST CHRISTIANITY TOOK PLACE BEHIND HIS BANNER ON THE PLAIN OF MOIRA +THROUGHOUT THIS CENTURY THE POWER OF THE CHURCH WAS CONSTANTLY ON THE INCREASE AND IS VISIBLE IN MANY IMPORTANT CHANGES +THE ANCESTORS OF THE PRESENT PRETENDER CONGAL SURNAMED THE SQUINT EYED HAD TWICE RECEIVED AND CHERISHED THE LICENTIOUS BARDS WHEN UNDER THE BAN OF TARA AND HIS POPULARITY WITH THAT STILL POWERFUL ORDER WAS ONE PROP OF HIS AMBITION +THE BARREN ROCK ABOUT THREE MILES IN LENGTH WAS COVERED WITH MONASTIC BUILDINGS AND ITS CEMETERY WAS ALREADY ADORNED WITH THE TOMBS OF SAINTS AND KINGS +WHILE THE LIBERATED EXILES REJOICED ON THE PLAIN OF MEATH THE TENT OF THE ABBOT OF IONA WAS PITCHED ON THE RATH OF TARA A FACT WHICH WOULD SEEM TO INDICATE THAT ALREADY IN LITTLE MORE THAN A CENTURY SINCE THE INTERDICT HAD FALLEN ON IT THE EDIFICES WHICH MADE SO FINE A SHOW IN THE DAYS OF PATRICK WERE RUINED AND UNINHABITABLE +THE ONLY CONFLICTS THAT OCCURRED ON IRISH SOIL WITH A PICTISH OR AN ANGLO SAXON FORCE IF WE EXCEPT THOSE WHO FORMED A CONTINGENT OF CONGAL'S ARMY AT MOIRA OCCURRED IN THE TIME OF THE HOSPITABLE FINNACTA +SAINT MOLING SURVIVED HIM THREE YEARS AND SAINT ADAMNAN SO INTIMATELY CONNECTED WITH HIS REIGN TEN YEARS +NOW EVERY MISSIONARY THAT EVER WENT OUT FROM IONA HAD TAUGHT THAT TO REDUCE CHRISTIANS TO SLAVERY WAS WHOLLY INCONSISTENT WITH A BELIEF IN THE DOCTRINES OF THE GOSPEL +AS LEADING TO THE MENTION OF OTHER INTERESTING EVENTS WE MUST SET THIS INROAD CLEARLY BEFORE THE READER +LIKE THE TWO KINGS OF SPARTA THEY REIGNED JOINTLY DIVIDING BETWEEN THEM THE LABOURS AND CARES OF STATE diff --git a/SpeechT5/asr_train/valid.ltr b/SpeechT5/asr_train/valid.ltr new file mode 100644 index 0000000..56e348a --- /dev/null +++ b/SpeechT5/asr_train/valid.ltr @@ -0,0 +1,29 @@ +T H E | M E N | W E R E | A S | H A N D S O M E | A S | T H E | W O M E N | B E A U T I F U L | +I | D O N ' T | W O N D E R | Y O U | W E R E | A F R A I D | T O | T E L L | M E | S H E | B E G A N | Y O U | D O N ' T | L O V E | M E | Y O U ' V E | N E V E R | L O V E D | M E | I | W A S | A N | I D I O T | T O | B E L I E V E | Y O U | D I D | +W I T H | T H E | I N S I G H T | O F | A | K I N D R E D | T E M P E R A M E N T | H E | P R O N O U N C E D | H I S | V E R D I C T | +T H E | L O Y A L | F R E N Z Y | F E L L | U P O N | T H E | T H R E E | Q U I E T | W O M E N | A N D | T H E Y | C O U L D | N O T | D O | T O O | M U C H | F O R | T H E I R | C O U N T R Y | +N O W | L E T ' S | B E | B R A V E | A N D | E N J O Y | E V E R Y | M I N U T E | O F | I T | +I T | R E L I E V E D | H I M | F O R | A | W H I L E | +S O | H E ' S | A | F R I E N D | O F | Y O U R S | E H | +O H | Y O U | M I N I S T E R S | O F | C H R I S T | W O L V E S | I N | S H E E P ' S | C L O T H I N G | Y O U | S H A L L | B E | J U D G E D | F O R | T H I S | +I | H A V E | W A I T E D | L O N G | F O R | Y O U | +T H E | B O Y S | W E R E | N O W | A L L | A N X I E T Y | T O | S T A R T | W H I L E | T H E | P O N I E S | A F T E R | T H E I R | S U N D A Y | R E S T | W E R E | A L M O S T | A S | F U L L | O F | L I F E | A S | W E R E | T H E I R | O W N E R S | +A N D | A S | S O O N | A S | T H E I R | P A R E N T S | H A D | G O N E | T O | S L E E P | H E | G O T | U P | P U T | O N | H I S | C O A T | A N D | U N B A R R I N G | T H E | B A C K | D O O R | W E N T | O U T | +H E R | S K I N | W A S | B R O W N | T O O | A N D | I N | H E R | C H E E K S | S H E | H A D | A | G L O W | O F | R I C H | D A R K | C O L O R | +T O M ' S | E Y E S | F O C U S E D | I N | H O R R O R | O N | T H E | W R E C K A G E | E N V E L O P E D | B Y | S T I L L | B I L L O W I N G | D U S T | +I | C A N | A S S U R E | Y O U | T H A T | T H I S | I S | A | M O D E R N | F A C E | A N D | O N E | W H I C H | Y O U | W I L L | V E R Y | P R O B A B L Y | M E E T | +M I S S | H E P Z I B A H | I | S U P P O S E | W I L L | I N T E R W E A V E | T H E | F A C T | W I T H | H E R | O T H E R | T R A D I T I O N S | A N D | S E T | I T | D O W N | T H A T | T H E | F O W L S | K N O W | Y O U | T O | B E | A | P Y N C H E O N | +W H A T E V E R | R E V I V I N G | E F F E C T | I T | M I G H T | O T H E R W I S E | H A V E | P R O D U C E D | O N | H I M | I T | M A D E | N O | C H A N G E | I N | T H E | T H R E A T E N I N G | G L O O M | O F | H I S | M A N N E R | +I T | W A S | T H E | W O R S T | S U N D A Y | H E | H A D | S P E N T | I N | H I S | L I F E | +M A N Y | L I T T L E | W R I N K L E S | G A T H E R E D | B E T W E E N | H I S | E Y E S | A S | H E | C O N T E M P L A T E D | T H I S | A N D | H I S | B R O W | M O I S T E N E D | +P R O F O U N D | S U F F E R I N G | M A K E S | N O B L E | I T | S E P A R A T E S | O N E | O F | T H E | M O S T | R E F I N E D | F O R M S | O F | D I S G U I S E | I S | E P I C U R I S M | A L O N G | W I T H | A | C E R T A I N | O S T E N T A T I O U S | B O L D N E S S | O F | T A S T E | W H I C H | T A K E S | S U F F E R I N G | L I G H T L Y | A N D | P U T S | I T S E L F | O N | T H E | D E F E N S I V E | A G A I N S T | A L L | T H A T | I S | S O R R O W F U L | A N D | P R O F O U N D | +B U T | I N | T H E | C A U S E | O F | S C I E N C E | M E N | A R E | E X P E C T E D | T O | S U F F E R | +I | H A V E | N O T | T H E | S L I G H T E S T | D O U B T | T H A T | I N | H I G H | W I N D S | I T S | R E D | T I L E S | W E R E | B L O W N | O U T | T O | T H E | G R E A T | A N N O Y A N C E | O F | T H E | P A S T O R | A N D | C O N G R E G A T I O N | +C L I M A T E | B A D | E X A M P L E | A N D | T H E | L U X U R Y | O F | P O W E R | D E G R A D E D | T H E M | I N | O N E | C E N T U R Y | I N T O | A | R A C E | O F | H E L P L E S S | A N D | D E B A U C H E D | S L A V E | H O L D E R S | D O O M E D | T O | U T T E R | E X T E R M I N A T I O N | B E F O R E | T H E | S E M I | G O T H I C | A R M I E S | O F | B E L I S A R I U S | A N D | W I T H | T H E M | V A N I S H E D | T H E | L A S T | C H A N C E | T H A T | T H E | G O T H I C | R A C E S | W O U L D | E X E R C I S E | O N | T H E | E A S T E R N | W O R L D | T H E | S A M E | S T E R N | Y E T | W H O L E S O M E | D I S C I P L I N E | U N D E R | W H I C H | T H E | W E S T E R N | H A D | B E E N | R E S T O R E D | T O | L I F E | +U R S U S | W A S | S A T I S F I E D | W I T H | T H E | A P P L A U S E | O F | S O U T H W A R K | B U T | B Y | N O | M E A N S | A S T O N I S H E D | +M I S T E R | M O R T O N | S E E M E D | P A R T I C U L A R L Y | S T R U C K | W I T H | T H E | A C C O U N T | O F | W A V E R L E Y ' S | V I S I T | T O | D O N A L D | B E A N | L E A N | +W E | S A W | T H E | U N I T E D | S T A T E S | F L A G | F L Y I N G | F R O M | T H E | R A M P A R T S | A N D | T H O U G H T | T H A T | Y A N K | W O U L D | P R O B A B L Y | B E | A S L E E P | O R | C A T C H I N G | L I C E | O R | M A Y B E | E N G A G E D | I N | A | G A M E | O F | S E V E N | U P | +A S | I | W E N T | B A C K | T O | T H E | F I E L D | H O S P I T A L | I | O V E R T O O K | A N O T H E R | M A N | W A L K I N G | A L O N G | +S O | L O W | H E | F E L L | T H A T | A L L | A P P L I A N C E S | F O R | H I S | S A L V A T I O N | W E R E | A L R E A D Y | S H O R T | S A V E | S H O W I N G | H I M | T H E | P E O P L E | O F | P E R D I T I O N | +S O M E | A P P R E H E N S I O N | K E E P S | Y O U | M A R V E L L I N G | B U T | T H E | P S A L M | D E L E C T A S T I | G I V E T H | L I G H T | W H I C H | H A S | T H E | P O W E R | T O | U N C L O U D | Y O U R | I N T E L L E C T | +T H E | S E C O N D | W A S | A S | I F | H E R | F L E S H | A N D | B O N E S | H A D | A L L | B E E N | F A S H I O N E D | O U T | O F | E M E R A L D | T H E | T H I R D | A P P E A R E D | A S | S N O W | B U T | N E W L Y | F A L L E N | diff --git a/SpeechT5/asr_train/valid.tsv b/SpeechT5/asr_train/valid.tsv new file mode 100644 index 0000000..860f40b --- /dev/null +++ b/SpeechT5/asr_train/valid.tsv @@ -0,0 +1,30 @@ +/public/home/changhl/dataset/LibriSpeech/dev-clean +2412/153954/2412-153954-0008.flac 43760 +6345/93302/6345-93302-0018.flac 99200 +777/126732/777-126732-0044.flac 64400 +3853/163249/3853-163249-0025.flac 97520 +3853/163249/3853-163249-0040.flac 52320 +3752/4944/3752-4944-0063.flac 33120 +3752/4944/3752-4944-0008.flac 31040 +3752/4943/3752-4943-0011.flac 111520 +6319/64726/6319-64726-0014.flac 42080 +6313/66129/6313-66129-0016.flac 119600 +7976/110523/7976-110523-0004.flac 116160 +1988/147956/1988-147956-0011.flac 83680 +251/137823/251-137823-0009.flac 93360 +2086/149220/2086-149220-0029.flac 89280 +2086/149220/2086-149220-0016.flac 120320 +8297/275154/8297-275154-0010.flac 121760 +2277/149897/2277-149897-0023.flac 52960 +2277/149896/2277-149896-0005.flac 89600 +422/122949/422-122949-0025.flac 285600 +6241/61943/6241-61943-0001.flac 51520 +6241/61943/6241-61943-0024.flac 117760 +2902/9006/2902-9006-0017.flac 380160 +5895/34629/5895-34629-0022.flac 96640 +5338/24640/5338-24640-0003.flac 102720 +5694/64038/5694-64038-0004.flac 153280 +5694/64029/5694-64029-0026.flac 77120 +84/121550/84-121550-0032.flac 132000 +84/121550/84-121550-0005.flac 139439 +84/121550/84-121550-0018.flac 151360 \ No newline at end of file diff --git a/SpeechT5/asr_train/valid.txt b/SpeechT5/asr_train/valid.txt new file mode 100644 index 0000000..938ca3a --- /dev/null +++ b/SpeechT5/asr_train/valid.txt @@ -0,0 +1,29 @@ +THE MEN WERE AS HANDSOME AS THE WOMEN BEAUTIFUL +I DON'T WONDER YOU WERE AFRAID TO TELL ME SHE BEGAN YOU DON'T LOVE ME YOU'VE NEVER LOVED ME I WAS AN IDIOT TO BELIEVE YOU DID +WITH THE INSIGHT OF A KINDRED TEMPERAMENT HE PRONOUNCED HIS VERDICT +THE LOYAL FRENZY FELL UPON THE THREE QUIET WOMEN AND THEY COULD NOT DO TOO MUCH FOR THEIR COUNTRY +NOW LET'S BE BRAVE AND ENJOY EVERY MINUTE OF IT +IT RELIEVED HIM FOR A WHILE +SO HE'S A FRIEND OF YOURS EH +OH YOU MINISTERS OF CHRIST WOLVES IN SHEEP'S CLOTHING YOU SHALL BE JUDGED FOR THIS +I HAVE WAITED LONG FOR YOU +THE BOYS WERE NOW ALL ANXIETY TO START WHILE THE PONIES AFTER THEIR SUNDAY REST WERE ALMOST AS FULL OF LIFE AS WERE THEIR OWNERS +AND AS SOON AS THEIR PARENTS HAD GONE TO SLEEP HE GOT UP PUT ON HIS COAT AND UNBARRING THE BACK DOOR WENT OUT +HER SKIN WAS BROWN TOO AND IN HER CHEEKS SHE HAD A GLOW OF RICH DARK COLOR +TOM'S EYES FOCUSED IN HORROR ON THE WRECKAGE ENVELOPED BY STILL BILLOWING DUST +I CAN ASSURE YOU THAT THIS IS A MODERN FACE AND ONE WHICH YOU WILL VERY PROBABLY MEET +MISS HEPZIBAH I SUPPOSE WILL INTERWEAVE THE FACT WITH HER OTHER TRADITIONS AND SET IT DOWN THAT THE FOWLS KNOW YOU TO BE A PYNCHEON +WHATEVER REVIVING EFFECT IT MIGHT OTHERWISE HAVE PRODUCED ON HIM IT MADE NO CHANGE IN THE THREATENING GLOOM OF HIS MANNER +IT WAS THE WORST SUNDAY HE HAD SPENT IN HIS LIFE +MANY LITTLE WRINKLES GATHERED BETWEEN HIS EYES AS HE CONTEMPLATED THIS AND HIS BROW MOISTENED +PROFOUND SUFFERING MAKES NOBLE IT SEPARATES ONE OF THE MOST REFINED FORMS OF DISGUISE IS EPICURISM ALONG WITH A CERTAIN OSTENTATIOUS BOLDNESS OF TASTE WHICH TAKES SUFFERING LIGHTLY AND PUTS ITSELF ON THE DEFENSIVE AGAINST ALL THAT IS SORROWFUL AND PROFOUND +BUT IN THE CAUSE OF SCIENCE MEN ARE EXPECTED TO SUFFER +I HAVE NOT THE SLIGHTEST DOUBT THAT IN HIGH WINDS ITS RED TILES WERE BLOWN OUT TO THE GREAT ANNOYANCE OF THE PASTOR AND CONGREGATION +CLIMATE BAD EXAMPLE AND THE LUXURY OF POWER DEGRADED THEM IN ONE CENTURY INTO A RACE OF HELPLESS AND DEBAUCHED SLAVE HOLDERS DOOMED TO UTTER EXTERMINATION BEFORE THE SEMI GOTHIC ARMIES OF BELISARIUS AND WITH THEM VANISHED THE LAST CHANCE THAT THE GOTHIC RACES WOULD EXERCISE ON THE EASTERN WORLD THE SAME STERN YET WHOLESOME DISCIPLINE UNDER WHICH THE WESTERN HAD BEEN RESTORED TO LIFE +URSUS WAS SATISFIED WITH THE APPLAUSE OF SOUTHWARK BUT BY NO MEANS ASTONISHED +MISTER MORTON SEEMED PARTICULARLY STRUCK WITH THE ACCOUNT OF WAVERLEY'S VISIT TO DONALD BEAN LEAN +WE SAW THE UNITED STATES FLAG FLYING FROM THE RAMPARTS AND THOUGHT THAT YANK WOULD PROBABLY BE ASLEEP OR CATCHING LICE OR MAYBE ENGAGED IN A GAME OF SEVEN UP +AS I WENT BACK TO THE FIELD HOSPITAL I OVERTOOK ANOTHER MAN WALKING ALONG +SO LOW HE FELL THAT ALL APPLIANCES FOR HIS SALVATION WERE ALREADY SHORT SAVE SHOWING HIM THE PEOPLE OF PERDITION +SOME APPREHENSION KEEPS YOU MARVELLING BUT THE PSALM DELECTASTI GIVETH LIGHT WHICH HAS THE POWER TO UNCLOUD YOUR INTELLECT +THE SECOND WAS AS IF HER FLESH AND BONES HAD ALL BEEN FASHIONED OUT OF EMERALD THE THIRD APPEARED AS SNOW BUT NEWLY FALLEN diff --git a/SpeechT5/fairseq/.github/ISSUE_TEMPLATE.md b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..5c4c449 --- /dev/null +++ b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,3 @@ +## 👉 [Please follow one of these issue templates](https://github.com/pytorch/fairseq/issues/new/choose) 👈 + +Note: to keep the backlog clean and actionable, issues may be immediately closed if they do not follow one of the above issue templates. diff --git a/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/bug_report.md b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..a7f4f0a --- /dev/null +++ b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,43 @@ +--- +name: 🐛 Bug Report +about: Submit a bug report to help us improve +labels: 'bug, needs triage' +--- + +## 🐛 Bug + + + +### To Reproduce + +Steps to reproduce the behavior (**always include the command you ran**): + +1. Run cmd '....' +2. See error + + + + +#### Code sample + + +### Expected behavior + + + +### Environment + + - fairseq Version (e.g., 1.0 or master): + - PyTorch Version (e.g., 1.0) + - OS (e.g., Linux): + - How you installed fairseq (`pip`, source): + - Build command you used (if compiling from source): + - Python version: + - CUDA/cuDNN version: + - GPU models and configuration: + - Any other relevant information: + +### Additional context + + diff --git a/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/documentation.md b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/documentation.md new file mode 100644 index 0000000..3a6e2e9 --- /dev/null +++ b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/documentation.md @@ -0,0 +1,15 @@ +--- +name: 📚 Documentation/Typos +about: Report an issue related to documentation or a typo +labels: 'documentation, needs triage' +--- + +## 📚 Documentation + +For typos and doc fixes, please go ahead and: + +1. Create an issue. +2. Fix the typo. +3. Submit a PR. + +Thanks! diff --git a/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/feature_request.md b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..93c8668 --- /dev/null +++ b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,24 @@ +--- +name: 🚀 Feature Request +about: Submit a proposal/request for a new feature +labels: 'enhancement, help wanted, needs triage' +--- + +## 🚀 Feature Request + + +### Motivation + + + +### Pitch + + + +### Alternatives + + + +### Additional context + + diff --git a/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/how-to-question.md b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/how-to-question.md new file mode 100644 index 0000000..4beb180 --- /dev/null +++ b/SpeechT5/fairseq/.github/ISSUE_TEMPLATE/how-to-question.md @@ -0,0 +1,33 @@ +--- +name: ❓ Questions/Help +about: If you have questions, please first search existing issues and docs +labels: 'question, needs triage' +--- + +## ❓ Questions and Help + +### Before asking: +1. search the issues. +2. search the docs. + + + +#### What is your question? + +#### Code + + + +#### What have you tried? + +#### What's your environment? + + - fairseq Version (e.g., 1.0 or master): + - PyTorch Version (e.g., 1.0) + - OS (e.g., Linux): + - How you installed fairseq (`pip`, source): + - Build command you used (if compiling from source): + - Python version: + - CUDA/cuDNN version: + - GPU models and configuration: + - Any other relevant information: diff --git a/SpeechT5/fairseq/.github/PULL_REQUEST_TEMPLATE.md b/SpeechT5/fairseq/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..b28ff98 --- /dev/null +++ b/SpeechT5/fairseq/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +# Before submitting + +- [ ] Was this discussed/approved via a Github issue? (no need for typos, doc improvements) +- [ ] Did you read the [contributor guideline](https://github.com/pytorch/fairseq/blob/master/CONTRIBUTING.md)? +- [ ] Did you make sure to update the docs? +- [ ] Did you write any new necessary tests? + +## What does this PR do? +Fixes # (issue). + +## PR review +Anyone in the community is free to review the PR once the tests have passed. +If we didn't discuss your PR in Github issues there's a high chance it will not be merged. + +## Did you have fun? +Make sure you had fun coding 🙃 diff --git a/SpeechT5/fairseq/.github/stale.yml b/SpeechT5/fairseq/.github/stale.yml new file mode 100644 index 0000000..b12867d --- /dev/null +++ b/SpeechT5/fairseq/.github/stale.yml @@ -0,0 +1,30 @@ +# Configuration for probot-stale - https://github.com/probot/stale +# Mostly copied from github.com/facebook/react/blob/master/.github/stale.yml +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 90 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - bug +# Label to use when marking an issue as stale +staleLabel: stale +issues: + # Comment to post when marking an issue as stale. + markComment: > + This issue has been automatically marked as stale. + **If this issue is still affecting you, please leave any comment** (for example, "bump"), and we'll keep it open. + We are sorry that we haven't been able to prioritize it yet. If you have any new additional information, please include it with your comment! + # Comment to post when closing a stale issue. + closeComment: > + Closing this issue after a prolonged period of inactivity. If this issue is still present in the latest release, please create a new issue with up-to-date information. Thank you! +pulls: + # Comment to post when marking a pull request as stale. + markComment: > + This pull request has been automatically marked as stale. + **If this pull request is still relevant, please leave any comment** (for example, "bump"), and we'll keep it open. + We are sorry that we haven't been able to prioritize reviewing it yet. Your contribution is very much appreciated. + # Comment to post when closing a stale pull request. + closeComment: > + Closing this pull request after a prolonged period of inactivity. If this issue is still present in the latest release, please ask for this pull request to be reopened. Thank you! + diff --git a/SpeechT5/fairseq/.github/workflows/build.yml b/SpeechT5/fairseq/.github/workflows/build.yml new file mode 100644 index 0000000..105c42a --- /dev/null +++ b/SpeechT5/fairseq/.github/workflows/build.yml @@ -0,0 +1,55 @@ +name: build + +on: + # Trigger the workflow on push to master or any pull request + push: + branches: + - master + pull_request: + +jobs: + build: + + strategy: + max-parallel: 4 + matrix: + platform: [ubuntu-latest, macos-latest] + python-version: [3.6, 3.7] + + runs-on: ${{ matrix.platform }} + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Conditionally install pytorch + if: matrix.platform == 'windows-latest' + run: pip3 install torch -f https://download.pytorch.org/whl/torch_stable.html + + - name: Install locally + run: | + python -m pip install --upgrade pip + git submodule update --init --recursive + python setup.py build_ext --inplace + python -m pip install --editable . + + - name: Install optional test requirements + run: | + python -m pip install iopath transformers pyarrow + python -m pip install git+https://github.com/facebookresearch/fairscale.git@master + + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --extend-exclude fairseq/model_parallel/megatron + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --extend-exclude fairseq/model_parallel/megatron + + - name: Run tests + run: | + python setup.py test diff --git a/SpeechT5/fairseq/.github/workflows/build_wheels.yml b/SpeechT5/fairseq/.github/workflows/build_wheels.yml new file mode 100644 index 0000000..7261708 --- /dev/null +++ b/SpeechT5/fairseq/.github/workflows/build_wheels.yml @@ -0,0 +1,41 @@ +name: build_wheels + +on: + push: + branches: + - v[0-9]+.[0-9]+.[x0-9]+ + tags: + - v* + +jobs: + build_wheels: + name: Build wheels on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + + steps: + - uses: actions/checkout@v2 + + - name: Install Python + uses: actions/setup-python@v2 + with: + python-version: '3.7' + + - name: Install cibuildwheel + run: | + python -m pip install cibuildwheel + + - name: Build wheels for CPython + run: | + python -m cibuildwheel --output-dir dist + env: + CIBW_BUILD: "cp36-*64 cp37-*64 cp38-*64" + CIBW_MANYLINUX_X86_64_IMAGE: manylinux1 + CIBW_BEFORE_BUILD: git submodule update --init --recursive && pip install . + + - uses: actions/upload-artifact@v2 + with: + name: wheels + path: ./dist/*.whl diff --git a/SpeechT5/fairseq/.gitignore b/SpeechT5/fairseq/.gitignore new file mode 100644 index 0000000..4112804 --- /dev/null +++ b/SpeechT5/fairseq/.gitignore @@ -0,0 +1,136 @@ +# JetBrains PyCharm IDE +.idea/ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# macOS dir files +.DS_Store + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Checkpoints +checkpoints + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# Generated files +/fairseq/temporal_convolution_tbc +/fairseq/modules/*_layer/*_forward.cu +/fairseq/modules/*_layer/*_backward.cu +/fairseq/version.py + +# data +data-bin/ + +# reranking +/examples/reranking/rerank_data + +# Cython-generated C++ source files +/fairseq/data/data_utils_fast.cpp +/fairseq/data/token_block_utils_fast.cpp + +# VSCODE +.vscode/ftp-sync.json +.vscode/settings.json + +# Experimental Folder +experimental/* + +# Weights and Biases logs +wandb/ diff --git a/SpeechT5/fairseq/.gitmodules b/SpeechT5/fairseq/.gitmodules new file mode 100644 index 0000000..07a55d4 --- /dev/null +++ b/SpeechT5/fairseq/.gitmodules @@ -0,0 +1,4 @@ +[submodule "fairseq/model_parallel/megatron"] + path = fairseq/model_parallel/megatron + url = https://github.com/ngoyal2707/Megatron-LM + branch = fairseq diff --git a/SpeechT5/fairseq/CODE_OF_CONDUCT.md b/SpeechT5/fairseq/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..a0cbeaa --- /dev/null +++ b/SpeechT5/fairseq/CODE_OF_CONDUCT.md @@ -0,0 +1,77 @@ +# Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at . All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq + diff --git a/SpeechT5/fairseq/CONTRIBUTING.md b/SpeechT5/fairseq/CONTRIBUTING.md new file mode 100644 index 0000000..4d7ca6a --- /dev/null +++ b/SpeechT5/fairseq/CONTRIBUTING.md @@ -0,0 +1,28 @@ +# Contributing to Facebook AI Research Sequence-to-Sequence Toolkit (fairseq) +We want to make contributing to this project as easy and transparent as +possible. + +## Pull Requests +We actively welcome your pull requests. + +1. Fork the repo and create your branch from `master`. +2. If you've added code that should be tested, add tests. +3. If you've changed APIs, update the documentation. +4. Ensure the test suite passes. +5. Make sure your code lints. +6. If you haven't already, complete the Contributor License Agreement ("CLA"). + +## Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Facebook's open source projects. + +Complete your CLA here: + +## Issues +We use GitHub issues to track public bugs. Please ensure your description is +clear and has sufficient instructions to be able to reproduce the issue. + +## License +By contributing to Facebook AI Research Sequence-to-Sequence Toolkit (fairseq), +you agree that your contributions will be licensed under the LICENSE file in +the root directory of this source tree. diff --git a/SpeechT5/fairseq/LICENSE b/SpeechT5/fairseq/LICENSE new file mode 100644 index 0000000..b96dcb0 --- /dev/null +++ b/SpeechT5/fairseq/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/SpeechT5/fairseq/README.md b/SpeechT5/fairseq/README.md new file mode 100644 index 0000000..82b6ba7 --- /dev/null +++ b/SpeechT5/fairseq/README.md @@ -0,0 +1,222 @@ +

    + +
    +
    + MIT License + Latest Release + Build Status + Documentation Status +

    + +-------------------------------------------------------------------------------- + +Fairseq(-py) is a sequence modeling toolkit that allows researchers and +developers to train custom models for translation, summarization, language +modeling and other text generation tasks. + +We provide reference implementations of various sequence modeling papers: + +
    List of implemented papers

    + +* **Convolutional Neural Networks (CNN)** + + [Language Modeling with Gated Convolutional Networks (Dauphin et al., 2017)](examples/language_model/conv_lm/README.md) + + [Convolutional Sequence to Sequence Learning (Gehring et al., 2017)](examples/conv_seq2seq/README.md) + + [Classical Structured Prediction Losses for Sequence to Sequence Learning (Edunov et al., 2018)](https://github.com/pytorch/fairseq/tree/classic_seqlevel) + + [Hierarchical Neural Story Generation (Fan et al., 2018)](examples/stories/README.md) + + [wav2vec: Unsupervised Pre-training for Speech Recognition (Schneider et al., 2019)](examples/wav2vec/README.md) +* **LightConv and DynamicConv models** + + [Pay Less Attention with Lightweight and Dynamic Convolutions (Wu et al., 2019)](examples/pay_less_attention_paper/README.md) +* **Long Short-Term Memory (LSTM) networks** + + Effective Approaches to Attention-based Neural Machine Translation (Luong et al., 2015) +* **Transformer (self-attention) networks** + + Attention Is All You Need (Vaswani et al., 2017) + + [Scaling Neural Machine Translation (Ott et al., 2018)](examples/scaling_nmt/README.md) + + [Understanding Back-Translation at Scale (Edunov et al., 2018)](examples/backtranslation/README.md) + + [Adaptive Input Representations for Neural Language Modeling (Baevski and Auli, 2018)](examples/language_model/README.adaptive_inputs.md) + + [Lexically constrained decoding with dynamic beam allocation (Post & Vilar, 2018)](examples/constrained_decoding/README.md) + + [Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context (Dai et al., 2019)](examples/truncated_bptt/README.md) + + [Adaptive Attention Span in Transformers (Sukhbaatar et al., 2019)](examples/adaptive_span/README.md) + + [Mixture Models for Diverse Machine Translation: Tricks of the Trade (Shen et al., 2019)](examples/translation_moe/README.md) + + [RoBERTa: A Robustly Optimized BERT Pretraining Approach (Liu et al., 2019)](examples/roberta/README.md) + + [Facebook FAIR's WMT19 News Translation Task Submission (Ng et al., 2019)](examples/wmt19/README.md) + + [Jointly Learning to Align and Translate with Transformer Models (Garg et al., 2019)](examples/joint_alignment_translation/README.md ) + + [Multilingual Denoising Pre-training for Neural Machine Translation (Liu et at., 2020)](examples/mbart/README.md) + + [Neural Machine Translation with Byte-Level Subwords (Wang et al., 2020)](examples/byte_level_bpe/README.md) + + [Unsupervised Quality Estimation for Neural Machine Translation (Fomicheva et al., 2020)](examples/unsupervised_quality_estimation/README.md) + + [wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations (Baevski et al., 2020)](examples/wav2vec/README.md) + + [Generating Medical Reports from Patient-Doctor Conversations Using Sequence-to-Sequence Models (Enarvi et al., 2020)](examples/pointer_generator/README.md) + + [Linformer: Self-Attention with Linear Complexity (Wang et al., 2020)](examples/linformer/README.md) + + [Cross-lingual Retrieval for Iterative Self-Supervised Training (Tran et al., 2020)](examples/criss/README.md) + + [Deep Transformers with Latent Depth (Li et al., 2020)](examples/latent_depth/README.md) +* **Non-autoregressive Transformers** + + Non-Autoregressive Neural Machine Translation (Gu et al., 2017) + + Deterministic Non-Autoregressive Neural Sequence Modeling by Iterative Refinement (Lee et al. 2018) + + Insertion Transformer: Flexible Sequence Generation via Insertion Operations (Stern et al. 2019) + + Mask-Predict: Parallel Decoding of Conditional Masked Language Models (Ghazvininejad et al., 2019) + + [Levenshtein Transformer (Gu et al., 2019)](examples/nonautoregressive_translation/README.md) +* **Finetuning** + + [Better Fine-Tuning by Reducing Representational Collapse (Aghajanyan et al. 2020)](examples/rxf/README.md) + +

    + +### What's New: + +* June 2021 [Released XLMR-XL and XLMR-XXL models](examples/xlmr/README.md) +* March 2021 [Added full parameter and optimizer state sharding + CPU offloading](examples/fully_sharded_data_parallel/README.md) +* February 2021 [Added LASER training code](examples/laser/README.md) +* December 2020: [Added Adaptive Attention Span code](examples/adaptive_span/README.md) +* December 2020: [GottBERT model and code released](examples/gottbert/README.md) +* November 2020: Adopted the [Hydra](https://github.com/facebookresearch/hydra) configuration framework + * [see documentation explaining how to use it for new and existing projects](docs/hydra_integration.md) +* November 2020: [fairseq 0.10.0 released](https://github.com/pytorch/fairseq/releases/tag/v0.10.0) +* October 2020: [Added R3F/R4F (Better Fine-Tuning) code](examples/rxf/README.md) +* October 2020: [Deep Transformer with Latent Depth code released](examples/latent_depth/README.md) +* October 2020: [Added CRISS models and code](examples/criss/README.md) + +
    Previous updates

    + +* September 2020: [Added Linformer code](examples/linformer/README.md) +* September 2020: [Added pointer-generator networks](examples/pointer_generator/README.md) +* August 2020: [Added lexically constrained decoding](examples/constrained_decoding/README.md) +* August 2020: [wav2vec2 models and code released](examples/wav2vec/README.md) +* July 2020: [Unsupervised Quality Estimation code released](examples/unsupervised_quality_estimation/README.md) +* May 2020: [Follow fairseq on Twitter](https://twitter.com/fairseq) +* April 2020: [Monotonic Multihead Attention code released](examples/simultaneous_translation/README.md) +* April 2020: [Quant-Noise code released](examples/quant_noise/README.md) +* April 2020: [Initial model parallel support and 11B parameters unidirectional LM released](examples/megatron_11b/README.md) +* March 2020: [Byte-level BPE code released](examples/byte_level_bpe/README.md) +* February 2020: [mBART model and code released](examples/mbart/README.md) +* February 2020: [Added tutorial for back-translation](https://github.com/pytorch/fairseq/tree/master/examples/backtranslation#training-your-own-model-wmt18-english-german) +* December 2019: [fairseq 0.9.0 released](https://github.com/pytorch/fairseq/releases/tag/v0.9.0) +* November 2019: [VizSeq released (a visual analysis toolkit for evaluating fairseq models)](https://facebookresearch.github.io/vizseq/docs/getting_started/fairseq_example) +* November 2019: [CamemBERT model and code released](examples/camembert/README.md) +* November 2019: [BART model and code released](examples/bart/README.md) +* November 2019: [XLM-R models and code released](examples/xlmr/README.md) +* September 2019: [Nonautoregressive translation code released](examples/nonautoregressive_translation/README.md) +* August 2019: [WMT'19 models released](examples/wmt19/README.md) +* July 2019: fairseq relicensed under MIT license +* July 2019: [RoBERTa models and code released](examples/roberta/README.md) +* June 2019: [wav2vec models and code released](examples/wav2vec/README.md) + +

    + +### Features: + +* multi-GPU training on one machine or across multiple machines (data and model parallel) +* fast generation on both CPU and GPU with multiple search algorithms implemented: + + beam search + + Diverse Beam Search ([Vijayakumar et al., 2016](https://arxiv.org/abs/1610.02424)) + + sampling (unconstrained, top-k and top-p/nucleus) + + [lexically constrained decoding](examples/constrained_decoding/README.md) (Post & Vilar, 2018) +* [gradient accumulation](https://fairseq.readthedocs.io/en/latest/getting_started.html#large-mini-batch-training-with-delayed-updates) enables training with large mini-batches even on a single GPU +* [mixed precision training](https://fairseq.readthedocs.io/en/latest/getting_started.html#training-with-half-precision-floating-point-fp16) (trains faster with less GPU memory on [NVIDIA tensor cores](https://developer.nvidia.com/tensor-cores)) +* [extensible](https://fairseq.readthedocs.io/en/latest/overview.html): easily register new models, criterions, tasks, optimizers and learning rate schedulers +* [flexible configuration](docs/hydra_integration.md) based on [Hydra](https://github.com/facebookresearch/hydra) allowing a combination of code, command-line and file based configuration +* [full parameter and optimizer state sharding](examples/fully_sharded_data_parallel/README.md) +* [offloading parameters to CPU](examples/fully_sharded_data_parallel/README.md) + +We also provide [pre-trained models for translation and language modeling](#pre-trained-models-and-examples) +with a convenient `torch.hub` interface: + +``` python +en2de = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.en-de.single_model') +en2de.translate('Hello world', beam=5) +# 'Hallo Welt' +``` + +See the PyTorch Hub tutorials for [translation](https://pytorch.org/hub/pytorch_fairseq_translation/) +and [RoBERTa](https://pytorch.org/hub/pytorch_fairseq_roberta/) for more examples. + +# Requirements and Installation + +* [PyTorch](http://pytorch.org/) version >= 1.5.0 +* Python version >= 3.6 +* For training new models, you'll also need an NVIDIA GPU and [NCCL](https://github.com/NVIDIA/nccl) +* **To install fairseq** and develop locally: + +``` bash +git clone https://github.com/pytorch/fairseq +cd fairseq +pip install --editable ./ + +# on MacOS: +# CFLAGS="-stdlib=libc++" pip install --editable ./ + +# to install the latest stable release (0.10.x) +# pip install fairseq +``` + +* **For faster training** install NVIDIA's [apex](https://github.com/NVIDIA/apex) library: + +``` bash +git clone https://github.com/NVIDIA/apex +cd apex +pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" \ + --global-option="--deprecated_fused_adam" --global-option="--xentropy" \ + --global-option="--fast_multihead_attn" ./ +``` + +* **For large datasets** install [PyArrow](https://arrow.apache.org/docs/python/install.html#using-pip): `pip install pyarrow` +* If you use Docker make sure to increase the shared memory size either with `--ipc=host` or `--shm-size` + as command line options to `nvidia-docker run` . + +# Getting Started + +The [full documentation](https://fairseq.readthedocs.io/) contains instructions +for getting started, training new models and extending fairseq with new model +types and tasks. + +# Pre-trained models and examples + +We provide pre-trained models and pre-processed, binarized test sets for several tasks listed below, +as well as example training and evaluation commands. + +* [Translation](examples/translation/README.md): convolutional and transformer models are available +* [Language Modeling](examples/language_model/README.md): convolutional and transformer models are available + +We also have more detailed READMEs to reproduce results from specific papers: + +* [Cross-lingual Retrieval for Iterative Self-Supervised Training (Tran et al., 2020)](examples/criss/README.md) +* [wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations (Baevski et al., 2020)](examples/wav2vec/README.md) +* [Unsupervised Quality Estimation for Neural Machine Translation (Fomicheva et al., 2020)](examples/unsupervised_quality_estimation/README.md) +* [Training with Quantization Noise for Extreme Model Compression ({Fan*, Stock*} et al., 2020)](examples/quant_noise/README.md) +* [Neural Machine Translation with Byte-Level Subwords (Wang et al., 2020)](examples/byte_level_bpe/README.md) +* [Multilingual Denoising Pre-training for Neural Machine Translation (Liu et at., 2020)](examples/mbart/README.md) +* [Reducing Transformer Depth on Demand with Structured Dropout (Fan et al., 2019)](examples/layerdrop/README.md) +* [Jointly Learning to Align and Translate with Transformer Models (Garg et al., 2019)](examples/joint_alignment_translation/README.md) +* [Levenshtein Transformer (Gu et al., 2019)](examples/nonautoregressive_translation/README.md) +* [Facebook FAIR's WMT19 News Translation Task Submission (Ng et al., 2019)](examples/wmt19/README.md) +* [RoBERTa: A Robustly Optimized BERT Pretraining Approach (Liu et al., 2019)](examples/roberta/README.md) +* [wav2vec: Unsupervised Pre-training for Speech Recognition (Schneider et al., 2019)](examples/wav2vec/README.md) +* [Mixture Models for Diverse Machine Translation: Tricks of the Trade (Shen et al., 2019)](examples/translation_moe/README.md) +* [Pay Less Attention with Lightweight and Dynamic Convolutions (Wu et al., 2019)](examples/pay_less_attention_paper/README.md) +* [Understanding Back-Translation at Scale (Edunov et al., 2018)](examples/backtranslation/README.md) +* [Classical Structured Prediction Losses for Sequence to Sequence Learning (Edunov et al., 2018)](https://github.com/pytorch/fairseq/tree/classic_seqlevel) +* [Hierarchical Neural Story Generation (Fan et al., 2018)](examples/stories/README.md) +* [Scaling Neural Machine Translation (Ott et al., 2018)](examples/scaling_nmt/README.md) +* [Convolutional Sequence to Sequence Learning (Gehring et al., 2017)](examples/conv_seq2seq/README.md) +* [Language Modeling with Gated Convolutional Networks (Dauphin et al., 2017)](examples/language_model/README.conv.md) + +# Join the fairseq community + +* Twitter: https://twitter.com/fairseq +* Facebook page: https://www.facebook.com/groups/fairseq.users +* Google group: https://groups.google.com/forum/#!forum/fairseq-users + +# License + +fairseq(-py) is MIT-licensed. +The license applies to the pre-trained models as well. + +# Citation + +Please cite as: + +``` bibtex +@inproceedings{ott2019fairseq, + title = {fairseq: A Fast, Extensible Toolkit for Sequence Modeling}, + author = {Myle Ott and Sergey Edunov and Alexei Baevski and Angela Fan and Sam Gross and Nathan Ng and David Grangier and Michael Auli}, + booktitle = {Proceedings of NAACL-HLT 2019: Demonstrations}, + year = {2019}, +} +``` diff --git a/SpeechT5/fairseq/docs/Makefile b/SpeechT5/fairseq/docs/Makefile new file mode 100644 index 0000000..c2f5b1a --- /dev/null +++ b/SpeechT5/fairseq/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python -msphinx +SPHINXPROJ = fairseq +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/SpeechT5/fairseq/docs/_static/theme_overrides.css b/SpeechT5/fairseq/docs/_static/theme_overrides.css new file mode 100644 index 0000000..2a07641 --- /dev/null +++ b/SpeechT5/fairseq/docs/_static/theme_overrides.css @@ -0,0 +1,9 @@ +.wy-table-responsive table td kbd { + white-space: nowrap; +} +.wy-table-responsive table td { + white-space: normal !important; +} +.wy-table-responsive { + overflow: visible !important; +} diff --git a/SpeechT5/fairseq/docs/command_line_tools.rst b/SpeechT5/fairseq/docs/command_line_tools.rst new file mode 100644 index 0000000..c16300f --- /dev/null +++ b/SpeechT5/fairseq/docs/command_line_tools.rst @@ -0,0 +1,85 @@ +.. _Command-line Tools: + +Command-line Tools +================== + +Fairseq provides several command-line tools for training and evaluating models: + +- :ref:`fairseq-preprocess`: Data pre-processing: build vocabularies and binarize training data +- :ref:`fairseq-train`: Train a new model on one or multiple GPUs +- :ref:`fairseq-generate`: Translate pre-processed data with a trained model +- :ref:`fairseq-interactive`: Translate raw text with a trained model +- :ref:`fairseq-score`: BLEU scoring of generated translations against reference translations +- :ref:`fairseq-eval-lm`: Language model evaluation + + +.. _fairseq-preprocess: + +fairseq-preprocess +~~~~~~~~~~~~~~~~~~ +.. automodule:: fairseq_cli.preprocess + + .. argparse:: + :module: fairseq.options + :func: get_preprocessing_parser + :prog: fairseq-preprocess + + +.. _fairseq-train: + +fairseq-train +~~~~~~~~~~~~~ +.. automodule:: fairseq_cli.train + + .. argparse:: + :module: fairseq.options + :func: get_training_parser + :prog: fairseq-train + + +.. _fairseq-generate: + +fairseq-generate +~~~~~~~~~~~~~~~~ +.. automodule:: fairseq_cli.generate + + .. argparse:: + :module: fairseq.options + :func: get_generation_parser + :prog: fairseq-generate + + +.. _fairseq-interactive: + +fairseq-interactive +~~~~~~~~~~~~~~~~~~~ +.. automodule:: fairseq_cli.interactive + + .. argparse:: + :module: fairseq.options + :func: get_interactive_generation_parser + :prog: fairseq-interactive + + +.. _fairseq-score: + +fairseq-score +~~~~~~~~~~~~~ +.. automodule:: fairseq_cli.score + + .. argparse:: + :module: fairseq_cli.score + :func: get_parser + :prog: fairseq-score + + +.. _fairseq-eval-lm: + +fairseq-eval-lm +~~~~~~~~~~~~~~~ +.. automodule:: fairseq_cli.eval_lm + + .. argparse:: + :module: fairseq.options + :func: get_eval_lm_parser + :prog: fairseq-eval-lm diff --git a/SpeechT5/fairseq/docs/conf.py b/SpeechT5/fairseq/docs/conf.py new file mode 100644 index 0000000..440784b --- /dev/null +++ b/SpeechT5/fairseq/docs/conf.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# fairseq documentation build configuration file, created by +# sphinx-quickstart on Fri Aug 17 21:45:30 2018. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. + +import os +import sys +from fairseq import __version__ + + +# source code directory, relative to this file, for sphinx-autobuild +sys.path.insert(0, os.path.abspath("..")) + +source_suffix = [".rst"] + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.viewcode", + "sphinx.ext.napoleon", + "sphinxarg.ext", +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# The master toctree document. +master_doc = "index" + +# General information about the project. +project = "fairseq" +copyright = "Facebook AI Research (FAIR)" +author = "Facebook AI Research (FAIR)" + +github_doc_root = "https://github.com/pytorch/fairseq/tree/master/docs/" + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = __version__ +# The full version, including alpha/beta/rc tags. +release = __version__ + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "sphinx" +highlight_language = "python" + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + +html_context = { + "css_files": [ + "_static/theme_overrides.css", # override wide tables in RTD theme + ], +} + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +# html_sidebars = { +# '**': [ +# 'about.html', +# 'navigation.html', +# 'relations.html', # needs 'show_related': True theme option to display +# 'searchbox.html', +# 'donate.html', +# ] +# } + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = { + "numpy": ("http://docs.scipy.org/doc/numpy/", None), + "python": ("https://docs.python.org/", None), + "torch": ("https://pytorch.org/docs/master/", None), +} diff --git a/SpeechT5/fairseq/docs/criterions.rst b/SpeechT5/fairseq/docs/criterions.rst new file mode 100644 index 0000000..d6b8ca6 --- /dev/null +++ b/SpeechT5/fairseq/docs/criterions.rst @@ -0,0 +1,31 @@ +.. role:: hidden + :class: hidden-section + +.. _Criterions: + +Criterions +========== + +Criterions compute the loss function given the model and batch, roughly:: + + loss = criterion(model, batch) + +.. automodule:: fairseq.criterions + :members: + +.. autoclass:: fairseq.criterions.FairseqCriterion + :members: + :undoc-members: + +.. autoclass:: fairseq.criterions.adaptive_loss.AdaptiveLoss + :members: + :undoc-members: +.. autoclass:: fairseq.criterions.composite_loss.CompositeLoss + :members: + :undoc-members: +.. autoclass:: fairseq.criterions.cross_entropy.CrossEntropyCriterion + :members: + :undoc-members: +.. autoclass:: fairseq.criterions.label_smoothed_cross_entropy.LabelSmoothedCrossEntropyCriterion + :members: + :undoc-members: diff --git a/SpeechT5/fairseq/docs/data.rst b/SpeechT5/fairseq/docs/data.rst new file mode 100644 index 0000000..6a390cb --- /dev/null +++ b/SpeechT5/fairseq/docs/data.rst @@ -0,0 +1,58 @@ +.. role:: hidden + :class: hidden-section + +.. module:: fairseq.data + +Data Loading and Utilities +========================== + +.. _datasets: + +Datasets +-------- + +**Datasets** define the data format and provide helpers for creating +mini-batches. + +.. autoclass:: fairseq.data.FairseqDataset + :members: +.. autoclass:: fairseq.data.LanguagePairDataset + :members: +.. autoclass:: fairseq.data.MonolingualDataset + :members: + +**Helper Datasets** + +These datasets wrap other :class:`fairseq.data.FairseqDataset` instances and +provide additional functionality: + +.. autoclass:: fairseq.data.BacktranslationDataset + :members: +.. autoclass:: fairseq.data.ConcatDataset + :members: +.. autoclass:: fairseq.data.ResamplingDataset + :members: +.. autoclass:: fairseq.data.RoundRobinZipDatasets + :members: +.. autoclass:: fairseq.data.TransformEosDataset + :members: + + +Dictionary +---------- + +.. autoclass:: fairseq.data.Dictionary + :members: + + +Iterators +--------- + +.. autoclass:: fairseq.data.CountingIterator + :members: +.. autoclass:: fairseq.data.EpochBatchIterator + :members: +.. autoclass:: fairseq.data.GroupedIterator + :members: +.. autoclass:: fairseq.data.ShardedIterator + :members: diff --git a/SpeechT5/fairseq/docs/docutils.conf b/SpeechT5/fairseq/docs/docutils.conf new file mode 100644 index 0000000..526acff --- /dev/null +++ b/SpeechT5/fairseq/docs/docutils.conf @@ -0,0 +1,2 @@ +[writers] +option-limit=0 diff --git a/SpeechT5/fairseq/docs/fairseq.gif b/SpeechT5/fairseq/docs/fairseq.gif new file mode 100644 index 0000000000000000000000000000000000000000..5782fdbc7e0014564725c3ad0fc6be5c6bcd9983 GIT binary patch literal 2664833 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�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

    O3Pl|?VP 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ΠAznjaOh#2|x8 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
    }n* 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 z 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 z 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%0DF)xOoVi=mYKd6t&M~{@@H0N&fr$? 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 C!uYvmd?eIPVuOp7vqvu{lWSN)DOLI8ID+$ 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

    #X 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 z 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

    2uP$ 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

    !6*nAO46!>68H$6&DfqQb866gqCfs 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�%u0fv@Z<+eYd`VdGP!qS_AY(y+_*t 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 IM<|b-b|_d1IsK##Z-@4+}Rw9p2dC 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 z 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

    lb_sYsKO-}?YpBqR>)t^LT)WM4!#fDX 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ǰa&_y>ZCm<&r2Wnuy31pS<& zQ1B3Q)XTbin2kN3&et}A|Km&ie4JrWvGM|)=?jZ+ zJn!ifjuKRGU>?0}X)$9izdXjIAH~1Q+~p79Z!EsZ&o+mJ<2hK>h_cIsV#Ng_`{(cs zS>V}%j<|6t%$)P4GtBl-eUl=LuqAAg)lUvCO4MlATf?xH&`tk5shvlcWd)s4%&Ka6 zPZBf4)XME$@B=Fl@7i)%M(!64Vm2LV3Dd>RnYU^WQ;m{P*c#YXMo8jnQGhMSQtxhZ=3|0=}lA2dzow(`A)?bfbhig%XaWz$)1Q)`Ov%55_2p2mI6t z_THE)91)@*j`cvrNw`*$EP*Y{1N#e*}1j~{wn%^1J$=Ud- z{jN9xvVg1m`x$u(7oQ_@e#vi;q+$C*d^%i~lqm-141*2TqHmcq3pSxXk0Q;^qY++k z7P|5$>cMbRJapY3_2@$*5+Pf^BTx%q-W@I%UufX&EB&QZt4++B!jV;fWxnt$C_L)b`tAhVkON$Qh3Qny8`BZ=O-6c| zV|M+c%e-1I@XLkkbKY8Q;cC1~JvrVnVSkpC{9L`Av9G*EsqLXQEc6zv)vnan8FsYt z(BkO%zogoX4{eu;^+0%t?jI$PUICk0Q(H3Xb1!R1TiMl;I!AfT`1va|XQEaGqLW*j zSKlVMlMA(sp%5EM&S~+1Q z>L{kVvZ=9bP)Wq0c#rg9X`vdR8<5F3qqQvhbSS1x7@?&8=Gk{r2RA}?GvjX7Q{+Yf zx{nO2Y3rW(SQk!&NVW8$7ZI0}l7Si7Cr+@P2IxO^RLDXpE#e7NVbyRl(mAHs^bqrE zmH9T!YiclSF`4c83WTQRwd(k5WpkLc2B06_bkvRxoEELcv*_nT4+{{S`A;LUZZ>+JX4q0`HMR4-7TI zCZ+KB#$%Z7I9Y-AfTvssO&dfN3-=&n zjkm=lxCGU_j=G{znJ5YG{QP7|62>sjG-n2*GJ9VoJAS~CCISrg#HW~NQ$m@K&1eTT zHPV4tZd%QO)8kaJd$3RNCtLm{-%X~Fjdz{S8!5XBqCB4v5w9!Sn1)y+2aOYDRsT-j z=zwadz?Jr=E%^C5)`Nfc4i4?-I!%jOL_+$-rX0oW~Pral5Rs%y%mW^$K(Lb8u()+vWo9knyUD$es>wvnqfWgcz1 z-~eR)*hvg2Lisv#009u@XPnkjCB8(RIj6#uSG;`oeZQOM+V|e-5p{s6AL@$Udo(^2 zL_V=He>W)gPHpt*tUqi>6tznbBA+LY4W}ZdT0SahH)KE%MmDO&pB7aPF<1}SiND&n zu!4m@V^WQ*Rvv>O?a6T;Y<0Fy?$!yo|@v-N+dVT^?R}&okqFAdc(fntVN46wNy;d`5E2JBVEt~O|gA;2o z_U4?{#Rz{#R!1q#VfoM7CSy!m9~>jO&l}3Jw2-d8oTgal$D&|+oq#`>))94lt-Fdhm~2m>zCn`hTXq*Bx@>hUaZo%^ z-#p+|XDF}3npE1%JNe5~HTkKfJH}y%yd}7k2dv#_n*)Kglbigkj_w|-*PYo}fBr^k zHT5%LfoXaJrQPw9Aad#6hRHZ0)CMkgAGt}j?$q|A%%RX8g!LFEXPQod0J(ktfKr0m zx9l(|VfxzLr*OVM&~^XgVS53OAx9My9phYhNh^^d8y3;NCRCD6lXJ_QaYcM89ah&~ zNp2ZCN|o^<|I-4P)psfoq5LIGj-#xRu zkVNNk>BhUwYa=E?D6=f6x{YK59Exw@6p#uZl{1( z$;6nC?mczghHGR$z)Ny136?prZ`c$3Vd>6r8TvU&Z3ZBVsk>%qEl z^3Tr@4Ml8Dd)T4%Qh&bX_LXAIsDE^v*Q&L{j+kZ&49$wWXg)$G3zUD9PE-PWCdz(W zcxop|qpk$+UUxT-*#yzOO}M&0n{=B&pWC{5#r7p={o!{d_@}le(mFqod(Dzor+T zbMCr4SY-G6YoE&ts8FiRCqS_D`&By;GjZeaJ?db&;tE$+F!#B%q_N_uW_Cz6OyiMt z=`_tUu;A*I>jHgqaj#%252bj+mVSO&9(wXbU}j^=AgEj9NvM63X)Wy~d3x67$&#xL zt4!hkPk(`HT?v6Z^63qXLt|3)t;4e7x_|YB8ud^Kfktw{8zb8V(W3}IKmrqsXUPxH z=eUP=e(a|8Mp^@FdBaB$&sZbhg?Z@KyyNQaS+wWgc|wC9gA`$GTK4s%S~r@;h>_nt zi%F#tBsuZ0Qg5E%ABb=H#5E(|K}llt=XPtP+V{#A`$S|xwO)>?@xfZlS0%r9M#kq& zs$I8R%niP&&y2+1Zm!~X2UQQ$2|rx)RPoNy`7EQ=x|+gk1X2Ilt-C)DwWTwO(>f7Zc0a3vBu!pamCouI)DQ`ao>D)H5fI9as*0DkUfZ=p#mk<~ zaoC7`XV&UC@6Br;$lWG)3BEKE#^dp$MxL#A=sI6IMtlpoUL5{Imf@`tBk)EeP588z zd5r>3ikR~EYzbx6@Bw9)#4ivNiAz&841A&t^O3gr=52z@;}otMQx+q-|B) zy{6O}M>1k!y}>`3;evgFEm%RViCEQ?m>~RNDUR$CKnT!R-&rrbotiKay^)x3Zdud8 zFIxIMaG=$BvGcIQy>ZAbq$zToXP6h%g(7wCjN3B#Jh`88SiD9Kd|Z(llx)^2?#51b zYhn=ToPNKdom4x3_I&JBq*qz{+RN%Pbh9{*ZlBA-6&-Fo^uYFgaku$9@psW0k{TiJ ze=;k}MubOgSr$AH7jGZY8%$V<-q_l;GmYpoXqoZ_edgWseQ5q{Do*aXS?`YAoq)(e z;?uSF^+Vlymct6|g=@J}M$?v;lB+g518je{41sDdEcnrEWn;xmn>s}}+rwlc{{9}S z-z2sv=e4b539g+POGu0*?$YUVS144ATqc6UaVMFJ3>Xz>Vmz|FkKULU3*)mM{FoUaz6XTk1xDsC??wPPNbsL2PNAyY4~5Kt*1+wV0oL!qE&u}F0r|d7f9rkO z9sS*hmPbU5@^|%uf{|CGJf|Diy&_Rj2FV5-`Rkmnq*nOZIG05qCo{=29Tf?9fi`tyCTd*tfC?aU)V z>PXTIcrEqp%S_>R`EdNGIdmJ*&z-hUQjpIPRHl)WcsuSkcz`I5wNAZ|7hyDYAofrK zLLYRDWzd*zH#25>cVP=>fXxqNn$+m$-NIfw{!uX%UT4H77M#7K-r+dbbsjZb*ma)ECLHqh1G`X9<&g7*w3;YyBY9(G#w_UJWOP{IZol$YTPx6=zQLJtLA(56vpBx&0iu z$J+w3-Vx;Sdgb&yca{!=e#7km!Fp7T>9@L@+)|1K>86burG{UKe$kd>s`qD#MDfNN zPJ0=M-m0)A(}%_X9lp1AnC=*BuAsJVl(a!JO;h-Wi)g0J8*Np*%X(bsVLPPe<(A}V z|0b2RW~?q#niW3ZU$6F>!C%wmF{n!>Oj&m7akO?rV5CG7?_uU7b?@0yR3}$Ndj>D% zqTUT%K~oc4Ms!|Iyx*E!3NC>2i@ys(EX&J973gLEoja!mU!IM%HL{Yq!mo0iYlJ@~ zkyXBC8r8IHb0#^(N!p1z7e!idin~Y0_3Cu;wyGv#vW3IsT$sF|z1+XBb)`6yM}D8) zaMlvylCxZS_q|)BtaV0P8%or_p0)@mjczC^9Hj??Uyh=UpvDK>DT<=`RbBTPf z45gyZDoz}QzBaNPuNL0Byp?&GhL*9Ww96iaI(y0JJc`r%!r6@#54^_e5NEBA>0^JI zZ|jin7xjj%J8v>ChISxC4?=~xLCjaVr-Jh685H0KstvT05#1jaje_~LDCSUNUd3#` z`#9dQAbX>3U4`%ZCGqWm8S~~?xz(_E@%tyv=Pqk+cn^<33N8Tu2%)PS!yO~qk7tjTk`p9D0|b zWxsW!Y-*X3spYni?Q*os>xCQ8gbxG>&c$#8sZ3aCCYuHfwsB*d?78am3>6Z2Fxq4MWp>YcpkYO~kl zZ-ZfofFGr-vn!;Jh&5zoB#^guCr)d0dOGL99%thY=!O^xmC`&vusrk6nXWX{qmInD z=iPGnv*%*#;`13G7KDF=eiHFY;7xAz3CP8XzQvkhLrx&!;KjBVM>)RcpCQAY?+SgV z>W1YsQ*q&qElLxJ##I_t)3l6j75 z7DH5TJRnDV-6rYho7|$X#6Wi0bFb>xwYrVr{><~1aUHq|Jm34YxENg8k|v4yBL^u2 zyQ)X-U2lWZQp#fZ2%wVhWzxa@5OJm)r%W%buGevVKUp)qw=H&$-X&BZ8z;aV{LV$DMlb#ev`r z>`0ru6HBk-PP}+*w#c4Lq$q>SLEMe~WLM_S?}DJ_hJ@-=~#xBEWq!7`TkTRbsVo_`W9D3+I*lcT* zATUfUOvq`7H&~&M3hm6@ApfuxkM>vDG=mm%8-k9wF9aJ}o#?cI(-Z6B9Opsosti+x zx-o{-8DcG$UQkSS_Vvu{zVLX*&`a4^$s4liIlZ83Sde`kOPOA&pAAWHHIaPzQH;9r z`)L_ZF49deV>X0Z4pXvSBZGTr{0#+6Neb?(ppiS_Wf&zl@AkuAdAyETP=p!7Fl8j} z6cSSXy1CC}PChR_f}t)YSZ@(n{ch216e(l+TL$~-Zs0pvwsF}tm{8_0M#jQqJn*G!?mIn3jT$gg3G8E39yHm?v-o_BhKCT~$34|wHmuT2oOpncD zNW}nyLjb*7 z)LH7)gGu3T^)oWDlN2OK;>ILID1i-A5FEi{{DWR=yn*qOEOQ^oYaTR|*Oi24`f-gR zph55aQqxS&@yl&Ju!v%LAs85qGsyLy(Qtn&@kzwCkwGdX`>}`F)asz$4(MG=lf_zk zC0N5;Pc);*kE~KV)j`m&P&Le>`rHRG(s__P? z5AcLGh5&d1h3@^61M^sa;fr3>{k0*3;@$_Bcm zVdkm{w3V(Zi7n%;H#-4C2Fo9_y|PZkwY~Rzk-MnT=4A+SA;jmnw^2&Q1F#H(wux6S z%=MUoe0;75RMTFGVvZ(V!Jf`W_r6P8u@ZhZXI0bStzi}7Dw5B2z5X%tviiKfGwM8T zC;onog^!fT_K!qyp1H&jOb59)qz&XwXmvhBFni|5Bx_~xu!JjuuQkg%G%%5NA7Q}s zDpFv-pNY{S3trP||Eh5jJJipEJV?RG#po5LsD2vv{#&O2tm6zB=n1Z@Mw$Aj<$Q_1oj?|&t$TW zX<%?A#CxxZ$FwyQvGy-N72IYAysjYmfyn{j*47C-X^(V-af*IieCUsn%XRi8PPQ?} z^TqjD^?AZdi3o+W#k~N*@MDmd=u89-qhjyi$q%1;_6cIa=#!atya+lE357x?92UT{ ztIx{+cxU>;E!R(21Lc>tpWWC?R8O^e??Xbrk6YSLy;e>s^f9}*{YmNz=4QhF_y&6m zo!xuC;XFUaPlq8lr|s)QK7s-W48HF=eh(~n2uW6pCIqlEEIfRDhH(l>F>jYhfOD_V z!tV#2-=;C5&4uCSkt7qD=(eAP5`c4lOq``W4Is@!2 zUB|~ogEusVHwvvylgwz@T+tHlS(WV_(mRtnOIfmO zV5*OPqaC1qgbZO%$TuPK@gM{R7y@yZjb@SPV*<<{12fx%5@}Wl(g@}kVkBq- z0kXnmq2y{MON8NRkn_!_8;ll51R6Y%CIdixk-z4eY;*r1m>uBEOR)MC?YhH8@|<$a zP3>oIpxFVqKL=O(yA@_s780s01|f$HfPnj$>mXt@$u%19l3LzmLa_){{nRT*@C2s{;x+2MLZ~#r364CmK z8|}yKc%_uU$@I&@J4n@;Yr+V+Ekfu&Qs;`0p`yp*g4|!Oi8i2Uq9RMY68Hhg9jWb} zjwOaUMk_mkZM$}RGd}2#?4%D9dcI`A-Cb*!AP*cFp?D&i5bIsNUCGN-l$%8So68JJ zDVzOVNHHbwusHbUxFFn%4?G&T8sXMn&*y8(ez_M>0I!5o(p}LU89PMB-GWeeeO7N7 z=Q?f3i>OJEAv@_7)T8t3UXj)onoM0`O{fCx7mx@xTHZBgcZ!Aq&Pp`tygs@99{msJ zdWLVmBvse(%ayb}O#a6R%X7W3GI(BdwqHb{=W-`P{I`*eY;7PW=iUJg-1cwtJug%1zb{D{b8FBP$=)wT?ymHF zOuV5O=ql)=if zk(LbVVPrNaefoSaH?Q*d7V=!01wK!3-8xJ*V+it38j&WAX$8pS2liGU&GROS|IVsW zqT#rCgdhTltZq^_1wF42&oixxxQ+v*`fi{Pw*M|=X&(i=Cb>d0Xt33F5AmC-bFiM? z15}B<@0Bn5jDdfS0Wi`RKodra7*L2kQk+YNXM8o7LxRm*wdRn-_@Jc~U&9{O^vVGJ z!y`mKYS5Sn0~5_2prP!+S7i{F)1RJ7fjO|gX-mO3w#C>JLgG0?q7Mj%X`a#?2Q>2p zJ3a*1Z)ZgqoGu(Bz57E-?CbO5Z~8u(S z%|2`21A+`}0OEz?eP7D~(xNuCYXMTtaykT^lc1&=%Se1Vsnv{1;I~2+X z{UWQJIi~+By@7D;ifg$@O4>bib}K2Pp5R)QTXJU&y+W|^4VMx-P1^}|pFQodCKU4l zo+~59CQm91NRMHkuk}RylMWV6+jg6SAq@{Ze`mFR%WC^}2tN)pIN2CzT5IWnLH)Ps z+rsqo_at|S(bj(+!tZ?||49O$l%Bg6e*5!h{)FR|Gdca};C^H@Ak51Abn+%6-SF>E zX0*lNuycC+*`J2bwG3+w{%un-nGMQdAUH}o)9uPZC@nea<@xb;PpZi*W9-%AlCM!n zF&_@r!d|w>ruH)r)xSL%|I*sdNN!OXI}I*}+p~imX;<&-GoBYx{&2y5{kRDBplzb@ z4|oFtqi7kB+$t;Nz8EGpIq#i=)jl}CAvx52W$hA)lOH+1b6BPe#2Tp4(X5e2vY9O_ zBi)aj64Jr&3~v>bz*w$OP&cz?)%<56PzzQImnb6skb+!zF(}&Q#h?Q8b(ITgDO}p3MF#*n8zz<5)uKk*$&m4 zK-bzt2dMF+>i!m6?F%KRx#M;rj=2dqqkrm9z9!)q!N{XldwsF$7@3*=XiLbpmTWLY zO)V&BtvQm4PP~3 zm<+0Eno6>6Eni6;cfRD!xUs{_^JPBC^5@HPuI%8;cJI98%kdhQ=g;;11?i zR)A1t1=li$+nFzkBHOBRyt1nwqxV?S!tDV9qj^O$G zdqSW>NtEz?&55m)3clpYrab1`-&>$#_S4p(e|`zstlmrRrG~A}MDD;9-1lUovaEtk zt-{eCZ`cRl@DRkq>J+By`aJv|R-YNPRP$Ez3nZ^-R zkTe1;QIjYOayNgfcf(ge2u&qpzBV2c`3i)o(T7EUC!->YkSs?JNn^6c>D`2oCe%r7DBP|A|RusbnIt{drtK%HgyV?@i}={U6NUj#p2 zXSQ$AQ>pnmv@M(2TH9!*RhcCa-a=3psm*N~jpBzUnuok{I$vl1Vna9U_o2e3;gu=r z35GLh6-_$)<*?Kwg2Sg6OX_Xwi$7odJUvfUQ@!y8^7`nm_T^xWd{JfK#&5vNyg`nv zW73x+w7`+_Y*;T#Q1aSMY z)&C9`v`jd=0sYlWT8MM!*#6tamjM=c4CDvepztsp#NIuytf6=kN3oA#W zO`g#R!M#h23q)&6P{;69f#Z!XOffJcxC{&N`zV8DGS~<8cl<&d#2iQ}y5ECDkcAXgHe_g^ z-2nS~W}vti>2FGq;dVUWrM?uoqY!8@IPsZRT3ZS&+y`}SV}|M|%1I^`B;`4p&_$@3 zCFngx2D5@WqQC1##FdvZ%a=JR17_`tD&7D)wdik_3g0e3fy@s%EXYqMBaCjIa}zH+ z**#JXg{a46aUTnL9aSPIQVcn%==3SrPD~p-gi=LK^sLzIiQC!B_@P~IG^Nv~o4H0R zq0!oFi<5_9dl(-E@q zuew}cjz+picob!P21ZJ!6Ao-lG=i#%&Pu1bp{A5CEmIUDCh5CF$B^o|Wme+5sT$jp zNfx$Ma6f`*k&To{#?}6}a)7C><{ZYix5UPvq9Kw-la`#$!j^{#OLPN7J}(mhtxB3( z_6U13%d=kD)k;g%JMN8UP+%Qs!|>Q=SJ;GSdW_}njM{QgYU4*E1nxO?&Y=EXtO%ce z6YJohfS_am#itG4!=K0pYYl|V#?0Qz=mev9VRbM8%MHT<^tbvlqkkVWCLj0R7Bg zFHCIo3V_dfW+dJxVcg0{FG1k)&PCC0~x1{lTs^@&pVhLaKk zP!yvS8G3S9K(oKW{(G&6z}FHu=>Uy=PD-L#;-}v!{&0hhZhm3eMd=fE`~Xy=x=~*N zVFvrl`dsVH&1|!sViGR})9+5Ta!BrmrAX?1F+emeG$uay>7mD+*8mru51aA7#GHHF zZA2&S44AP9Iy0fjv47vB?})6n#sA()yKQ_wWyCy^e^Vc!L_>W2S)XfnbTEeIl>5mw z@_pi+Y%d#+sGZAoq!`Vpy?}_FjT+5J|tDadR;I2!X*B$z>~l(KINN^EDLuz zarRwc{pUT?T91rOv7teks515h(O-|m)*xU0)`Mc=StX$bq(rb-=|YpAEn-i$BfL<= z)9NpkU#}7-aIIGRvKWakukSn;{0aW5d~sU6E_dS*EJGKMV!a36UU3_r}Ils zgP!A7aznq1HU8raG0&xL?{}?!RqklT6cm&72SIey^IO~b8XNF4uw*6Ij*$X#l0JwH z=HQd7_Q##db`YkmE_3T>g?$T(bLkz(s%pp!TdKd%2Qk3C{ zJCTQUV@bGVwVX-S$<^Y?fpcFA#rZU75tZWdjoNAn#4;z0hM7zr$J)CAr3)T}@Nt$R zA2~RxvVj4TlkDapgNjIYTf%@aX@P(M301)OGd2=g8FhO~H7Xa*LL8EJvR_`EWiV(> z(~(mh^A4am%D#w{_W~|Es>*39YodPN zu{maJ>S~G6|J~DP*eFH-5(TW#qfXM+d z`eE=MkjZS|S=@jL5$7QtXs>#;$V^Rp*^HZ4LvDjh-v5IlkBO9=niMMuLpV^j%PxeK zAd8Kc#}7aA0;;7HNvVc2RnE~h-q`2*0lni!#p2gAtq_V>Aj8?f7@8{1*VQvQ{*C7k_)469{_mv3!~H}w^lKPjqpui8mnW*Jcm8W zN7X*yREizHWVptAwCv@orpSgGBhZWFBYIZt!ILoUq7k;`FqyM3zKtRS>ZpX+b%0a9 z@WE&>Teyykx{6|{L{OUiU>K>+XCvY423jMLuwLy zq$+m@`43`#*O#0_aQ)aRYbaLKXBIoHCgn*a2LQo`*U(0)GVR5hegihaR#L`1A>mKL z1O`RHC~H-9>mL}NpqnS=LL}mUdA+(GYO02_a8f?e97@UQ7ZFl-sx7wuv~Ko@O14^8 zR*6J%aNweA&D?{80aYTm^4+W8JD{5HVSA!OUcahm$k=?DSGl7TpN86};!I>%h+mjD zc0eTDT&@cfZuCxMX;rNm$Qlst#vJ9v{zlvvCyyyobyHIW*n4^Esx7JV9H>D(2IP4b z~H;w}5L;^P%ijoVrA=@dn;RxKr3|i5e4-K4`zHwT09CRX~9p6bH0AF93 zDNToAS7ROtX@+-`m>VJZW0iNcFt=W@a4E2jST zo`-@)$Y!*@a3BiKt&@XkC>n}klyYGuh*lsQ7B zk&c!6C>rK=weqMuVAl^Q$#@eMb`~57M#!rm@pkUw8a#B{h zrGJda+O;RB`N6=~Vak_HQG~C?1Eo!_mVQ5znL}nMlWss9wDJ93q&M16;s{9s$13;s z&bME1GKXwBF>6G5*s(;d5Z+A7ox49<4T1Zf#_JQ)H?N{bAx8!1dU>L$aE4N~FWP-> ziG+KG4K#MDQ(*O}&~N?RaE7%rzBG4kyB7v%Bv*;OMtAOucvp&B9XH^xuZ&%XO_Ua@ z_RBMjpzND@8mB(mE-)=t9&J|Q(hE_u6auc8F6&!rN+-znLRP_a52?>U3d6^kM0p5v zN}Mb=)ND(Qk)3ucAt>o3zuuZ4CGH`I&)9TVzkQ9Q$TT7rt+N~e(|sW^S2 zTC_SBCo^h|UyuT4o^D6JF4MVRMAqSNVl@c9L4HS>8Yyh3rGux-O=P{Lr^C09O{90~ zM9hoK=P>@pb+08#sw<~m-n=)kgY12%1zK^#@AR@hfLEn3)3V)p59QI+_MudVw%)%y zbyIy02i~#hMVVQ$7=Xo}H(x8CCzJ~wS{qpb&t*|@WT5a5NTF zeCpjl(?fJqQLlP+y$EsQ^Y1dQ`7Lq_D3Y**Pbjhe*3I&iOi-^x>9A`f0>I7(w2D&@ zR1=CXot9PgfUkL1_qQN(6KZEiis_|aqRr`oMTpc;HO1ei_o@c-e~e~$b~Q*@+f*r1 zhDc=A^`zzqxs{Cb8~m^I-5l5sZ;!zn5wd&0#E)mHbwLACs(>gn^BkQH{4fJKZ%?u( zttCkV+Oni3<7>{VJ6npE$6rdPI{8REzHjlw(zufmor3N4LxSOo>x!TCLliQlQue67 zRK(-OPr~1B=gft@-O<(1g8l?oG}$O`5v0=Q{nRW7^1lkkX%psQ>K{(o#YB_rq@dVk zRr-8x-`_xI!|OjNCc~+t68XA#1uuCOm22)@!~b+7cQIedP*Csc0hept0^(QiT8Zu$ zaX~kS`aY{8op@{^_!(w^ z`O{IPTuveSK03w%jQqdQx^}9F>1m{v2!@)oaWL#cT-=Zr2Wq=rWttsFDX15LAGd3W z4vXV~&Jo~#0k}l4SCqpFl6`S>`0j0n+%vYAb$drMWMvKMGg*9V)74U>aHM{>N{aq* zq!~Kcfb^8ca6&pTnvIFD*MJDsYtJa1`$+`1t_|ML<=VR5jma4{+yZLRH*r1yc##G|w)?U|)A$TEik|BwU+h11OG z*fJCpjUy6x0SB&bqHxXxb+=RG=)sokTc)W{TT^6sIUhP)+rYN9DF?W^bvMcx{^-gM z`QJ1j==biej*{tnK0t;71-wrP`Da={rm=(Kd`F=rZjU6FDOaZxn!(?pEuyb+x^3H! z_}cpvk-pzSt7Xj)VN;L{GV0v)UQW=CiHc_spqW9ph%aWT#6l>T>xwOabYqTsQ$etNb zkZavY+t-!9ukolOeh>s*ZN0xMAhh@C^A{bBhL<(2wvCnM@1eG>7ECo>Z&(Vqg7LOi>5S~9ba_M!-pF`S{q3`_+4(KBqcj@W(nxh`z&mtbFh4f)M7qLeN-~%S zUhHA->PmI*y>3qgvsTBiB-X%6(`VRT%o=z_2G5@ z%@Ar$ER~HbUSX~TtdS>0o=miz&!hGMG1i2FTO|^gd(u7G64m&JTCU0odk-Z$Gf^Z4 zR1=o?!kwC*Fh(K8T_aS0#{;FjU(ja(8DUyIm^jlUhw5FsaR57MHYX%;wf`r)U6~~O zJkoXE2U`8?NOYCOBeX78@Jx)hrxp%e_yK5u*~ zA)?C<@7MEuJox&nG9gDLltMYSsQ0>3`T$Il%@S3D`1MaWU%zo9CL{aBC7E_#+sVF< z?A^AFf1=HQNFD042)Wm6!gK)t z5pd|o5w|S5LUHQh6w1lEvsfA$pRxTH>3{f2vZuDc?2aSe@V9M~*1g3ekCCIOXQL`i zh~rYnTx3Su*he_=Ng5zHj9F7K+R$HaqCn{sWc|ygVazX^hd4XznT|h=cK{^#V~*AG z(3IUzi%|Gq!56vVGV#51nT(~s1$IBk-=8^oGwn8FSuxTxY7oT1S#}Ow)x6osZH)Q! z%4ip88~ppvlYOGm*ZEh|iG8(=ko$Gt23_;;cAi=?Zy4X)+_Pg`d37tkp$R&MY!(FT z8C#t)(6WUHjUB;uJ-z-j2CJ07>MXIeg;b@9N?3^ii+*iPr|kzYMn9!XerGt{7KV@rHbD5Bda0&5|&_Iq-96h)eN z$KaU0TO2NF7ag}0&4P~BFosRN5sW^;SxSVIwbK^MV)cx1|8a8XwaXR_P*+pXnpx3Q z7t`SwWAcCyJOy8yoU`e1jL9+V=@PB5XH>yx408zNJCJq>0kc|q{n0b*8Nyq|Hf~Z5 zafXzC&=9NZ6_n#dvo6PcdN*7a@!#hq`Nv_Add4yL1R!(m@iYkBJw&WL5mvk~&O0Rj z>>@#>FhNx=0Z;+=AqxGCic&0$5a7YzYL!U^rKXMGB-%7Ca`1`^TAd8le~gL6iBNtF zjg-A0dVtl^IG#N-Nq+{hxfCX}ORX`OAm)rnyr3Pmqk3?Yn3zc(ETv8T+Y?gTPAhO3 zCWm0%gD3IuCo4H4X4_M&9H387Km%)P^$yxtIr*|S3x&*ALiLoUyVNeYgn%&CPoa#& zyYA-V0HIJuhl^B>HISZ{$~hv1NZZN%lKOW&o^F>qu!6=-oatyMjn)pPT^K3rp!|!1 z`alA9dK4@(LnojOf0aqSi4+RCMCk}-@JJ+DuEnr&rg8R%e08EBCC=hIhIm$FQqsa! zsacaNsEHd>Z857$db3q zUGYb-t!3S^J|_g2ni^ZWKQ$mZQ-~AxtsWxBM4LG(@HvwvQ9l2gnt@?CkHa)&bS|H# z5ZaQ7*sP$P)u!1Ihh7@dg9E5F8=xwFX+m~XcQOmPbR=1l!c@Exm;DRrICEqW>_<#R zw4A7XBIao8yT~kf@v?lcS1P?U(9ISq`>aTgN;FSfku`>o-9jrdm6PSsJukM{8| zFX2Q8vs@t}b~4n+3alz+Su+awyl9gV5u3;|`j@23sIn(6G^d`W(hUVOvVek}vYZ#Z zvRTwiM-U-}H$R)Q@1oh#R15P3=$vlu%aE->Mlj_nGaM(**2$qTj9|rzj3Da;Bsm0% z*9p(OLioO^K+gnU6}Tl|(fo#2e0lPwEQ_W=5_S)k5b1xm?BH9&u; z(f$`;`LRy~&H1K>isn?d644N?Ey45+0P?xa`|Y1=F~UD z9KT3dyGmWqVMwK-ZZxjpKgPi;ge5ECXgp21Nt{k%)h;uwKqgFhw3M!p;R^r+L_!VZ zsE6)LQSa3JWfpZ`E@qIR`9%<5Kc<%!LVRYX1~t)yUDdOOD~<;sc>QP(g{Y6H8kL;u z|k|20vTk3n$g(x}u!Sl+gnFmu-K z1X0J(xxYn>N-*hUvjr3qZz9V*s@Pn&5NQ8ay8g`a!WRAh%)w-G?mul-UUlItfiBD( z=L$}@)ZH9Bn#impUibd7IE|q_mFFdk!9M&1(LSuzB3KABy03Z(&-MS@@qno55(#^i zSUUdBne1bE<2~j(OmC_C?`#oTxxE_C1f_AVh!gQ9I$&3K4AKPymZ_k|?^EZ*z)M}d zK1_)DP*(CD2YkEfd#leW^qqyed#wv*$LQ7BJuTTha!lOu;)n}t0ui=V)ED)A^mdS~E9&-T=J$(|TtPCwjQW80qtq-`Y}7`owtA9pzCC;5?yb%I`U(-b!oQ4q&uRvR;}PC(EnMjsh$lN|^yqSPiir!k zMkuG~nlsL)o4AOop#7Pf^+Q3bUMI2Wf-36AYF%|}i2WnjG&b3;nmWU_<7VYyT_%2C z5x%)h9ZbdY*OKl+Z|X}Bynnhf`eGWem_^smyi?B^kwLrsAbt+Ss>VIUrT>J6DOU5w z3%Y}xn*YQb(=|it1rvRZ05je4gB(Ifz$j;_)u>9y8 zG~|C;rnC28&={b!I8?-Kk;P{g=+%-8ModNLH{S=bW)O~%ebv|SoF&MuE^zE#(Y`o$ zeLdN?f(1l%CBkcDd74Cs0Mbs(4SV_#_eCCIKi;yRk&_b)JOT?Sv<&INNn@ccaPSpY z<@4ktN3mNMk}o6tOh zLjm4H3Hnq7WAXmX7o9Pv%|@9U{dJ=B7~Tn-=7_!gM5;9LaT@diyVmd3+V3@hs-PIT z|Ec>${z3YHW!M3K{@l<(tJ;}FN$q5;{B60TM;_p&xb7l>x-L}yXaveu0_a@i zaomR)O9AApq3?7UKzoe3dH++J?M8)`)|A*|ZjX7`@r@_swwSWu1pECWok02VvOu}i zc2nowhu+Sv`LzjR3HqI=jQD*aIqT-@Xn)`8{9E}RD0t%+0qP@x5{ZWGA`7DYAdCVV zU^=H;k>YgYDBU%u6=uv zCEi^?6_OWR&pqy9C!-s`E>nkwi3;Pa3%mD#B zN%sR(c?A9~m_MDR#B8!bH<@1s30MzK*}sW{ogaU#pXnWqgUx7XTp+h~o*hb~fZtH! z-+K&)kdD6ZGFaZ-Q%xgJMuR(#c&@7M_FU03!-k1xj=#a_9%f5F^pc)d1oYp&lU%64 z&0vi(;MTnPuA7@RXaAvC+=o7@Z__NlY)_B>LQdaDIDCb(h3qUJ0i_6_)3-nF*UHkD zOMA85W+VrQ(L{FQux)sG=byG|DJIsRht9-%m=IA`512nCsHL7o(o1Ej|GQ@`%v&jO zLO6f(>(;BKtG~Vpxq0Po)~;lCp{iw)T; zIFzAT{QMfuJ*~_naSism@kTWPjO!lt1Oewa=YChGS3dd%pQXWg_Nn9PHgiqW>(lC< zpB>DE$<^Bq5nUW1%w!8JYo7n!fxra_8(81{gCXIMaaLM^GSB{%2-KG;1%3-q3QVuv zRw$rx7*>3f0D(N-ni6%-GT*nTeb^mL`q_+W$Q$)gFP0(A6^g%V>@;Vw{9)7Sd-!!I zyRCLCn&h0luLT<(?5$;HjEK2MG1Z;!7)O_$RCw~Rw>-)4Owz*m6%ukUkJqS)Cw z^}bym{9Py)%4m=NB?OdVGW^#2tObW~{F_^X@<02L>QFAmI~kC2x-ci}k<;_dg|a6< ziv1iLpwnekD-e!z4kaF!}Tnhyo5-wQoGC5%70jnEW2`~h1_l~DuYi)ew%eb-7#s*MkEJ^6DlYt z*7{C{nGp8rdS}$Z*GnR$C!wth>pdVb-7e!5e)fHGBiUU)|`Yr^Vq@H$_z4{|rk<#<<`9<<8+xV?z~Ey1KJl7jUl5 zsd0Il?YQ-Ej^ch5RLTEJ5x?+4r!u9dM>C7u+@fCaS$`H;M9XwgkirP7GyB?5j%XD~ z=2O1(7om0{e2zf2!DdH&3X#WVjjrfhHZ>L+~}boqjxn;9s43zXB~U;&I~z= zJ#Kec;f?(#I-WqXi%7=D^$mAq#a;1KEM`8&;_LzMAuY6SeW6@TFS4!>5&!Xpkh(rE;lB@qcwwg%BtgZnw$a>U8CcR*L#eWWrm<`tHCwdCBj4$1@iDJUbcT$e0sS z>6LKW#DWJy+L~Db&(E0EKalkezx|o_w}Ran-$3{j-4$}q;-Qc;ChA0nr51SJnzzg1 zrV3K@nJJd?VM~73YFhXxR3f$fuKxF&^5+HqWh@g%(B|&IVNNpUODl(fQQy$!rz{yl z_h0x(Jj|oaCH$8qQspyg_sDItZbVsckHR#U(eFN~GhZmOaf?YIGhk2f&Dri2(}D-D z^x%VY2j##&A(A83gFm->|AQH(lm8C#qK#VN35u$q4IUi;W8(v^u7b*cz3H}maWk!ZJdV4wNIGAY5Qk#-*z?j zU-dTCYcZIDHPGWeca54%N~NRYI1lxwwhTF=@}FAcpy-(>%RzhkmZgFRYYtDeO|B0 zanc^yU*HA%k7>(y6CPE8(M~e0olWm0;roT+f*tR0r*%uw#bDlHv})Bd-6@|+m&)to zOY7M8Zg%LDYmZ~Ijt?|91;`bSH1)mH=5i9QbT#Y+V5LjNuRmZlR}6N>CCHBaw+Ejo zpI@@>A;~y^Ub?bQ&*J_DRq@RettiuV8b$7DMBLB{NLLe$1}IM8Awy1@GJA9b0tmj( zwyWy0+^rk#^CkRW%JaUO2@>rBOBUOQ<-E;JQWodSm{KW&cV<+be8SAn-#QybbQ;>T zc}Fi|1?30jbetdy6^7@$&XFgH{z1hNOBd{ztq`^HmkU)@)swuLPEvj(JG_rIT<;%R z%@a)m4L)Oqk+1xXTNW2;m#ZfCcZ|)w`Vev7W>+7Q-m}_F9L`6-E0vQzH4OBc5)6-U zyK%gY@%a+eRJv2#p33MpGR3PSPwNkWobA@LX)kT&y{Z&e(NMpPsph(fnr6Kd_PjW$ z*0!OVuyTj@T3d^4y`&zV5%+Aq(|>Fq(eUt2eQUFI_hZLKIM>7cdta6`Up3DU-SMc& zeE4JQZt&4tk5@yw4Qj0Rfd3eu2Q0jO^b1eCNVSa;R}Dy)`e(;S{$aRCD-x?gKu=Z=mpxKzw}XB#?}#1`GNeoc z%Vop%QDL-Sp7wg9dTYFI-Q#pEHVF%4Wz1D@W2uCJ3q~Hkl^}EKnt_F5Nkq4-l$353 z9H_ylQQE}fYSj69ZRRR}3d@N!h^vCgsSo%--au80_EBBC!I&L0CD~oiZuo`V#B55f zrK+U0WYiAOB9Ah@dzgs2PU}%j#cB3W%#(tk)vZjs;oX*c=L?E%Xp*(wgp7$(C2^WcB!ewt{iASd7_-J2Io`XHGt zv^ z<5kgr|80Nf4(dfk%Jni@V1+8}^sTTo1GhB5`55rA7$+&69(GE6lOzrx*#R_8s5-AH zJ-3n*yQb0)RFvRh;?BXr!HEmHp`_xOkPSSDB=yh0K!+T1lM}G{qW^KHJU0(O)y&>8A^io0#GkJq$RIW>!%(X*d6Tvd@u%PG?Ge7vp78%T@O%`ZmVy4ivjB3DRg#r05(32 znSSadM&n&r?c@}whKNqX>DaBCMkqOysQewieiW~V!Do!SRpaVn6$@B(+`u8)YPwlG zx-Znp$BVlOg4(sV==74ecnXczW`NuEdyqP|ixt~NGTD7i#jOqylggAl0~nq)beN6R zx64JQ5ZzYM%bK2LL5n<0 zOFWeCtFfP|vF}$VqfzhijKp}tGs~?p%VR#v`(&2SceWi9uHIhtYoJ_!%|zuWOlhZ1Wg4iI zK{=U3uhPfv88T!09f+R>iY$oT@UcY@$%((vuHRoXil8QQrkI7FGXoEp+Xd#x3wvuD zN+}MFvO4pg$xAU;(J=6usI7P6+dFFZ<{lT#mZ1lTG9*Ry8p#Y2)WlIQ8 zrj3k=u<2k8+zgKBfv*DaljOL$QJBPHawbLCH6f>jqEkAZeIMX^Ab!_*(Sj8-Jkb}5 z>FFYhas5lJ*wkZ6iV*mY9jqRU7Krhsqba_|Taijz@OF=v3%Dq%)8H)l))wo^+cKv= z!jG|b?vrAiRxg~@Z<1{L+xtw#Qb_NiLZF_Vfw?%%39_GaMzv@O8=IwifsfnmfY8&n zKI=t2HU=1AS)zjG(yc>r9jgV@EwIYkVWctWa#14FcfBK3c%8HG5DUGq) z#2330I1k3^oq9qlmO5A4YmxU|ODOyROXKT}v`2tv8&r(-bL3u@^+$_N5*_ls&}Mh) z*2W3)k{Cx804?D|9Mc2m*+uyiMkZE`x7fGrqr~boEam1PFyYfb%6`j*m^uhepj8{M zr&8x3l{iGmmGA&hSkYQWi#bca|3U>{{oI#HK2M47{RbDfVsZE@DLn( zlEC9_@vk;M@EwiENh$GDu0}5a(KP=$$uxOMdy1F~zShB6C_dT#%Z&P)8o!*2V{DSN z4T`^RdelN;IX)Eg#4q{^JCnEyXngVb%hG%wg4;}zJ?n^2-f!iCJ{pY zkMbt_Ptp~}zF<^gi4q!k{gVnh5J;E!HO_ZAS61Iz_UF;RZn-;6YbvyftzW3V zi1I%Le*eJ*xuc720z1;QIjc({bHaPzHwWev*Y9|w!s)7?HS zyC0Csy|ImyPClMqj~jg4$hFzBpmhwObZWsn$vqj;d@DxnYpd+!*CS z{Uq#B>47d@K!-i~eJwb3e(vrA(T#77ce#i2@`F-HrYG=lz0Yxb#X&&cCCxTvjoQ0_ z^SE2P`ViOq)K{@qMl&|!w8=CnA*O@7nHaz$aLB9p_<(s`8FlQ~l$PVm6z(dVAMJiw zh0_M!8L{kCfE_dQP3a<|k~C`yV@+=}&?b1qi;RZSmyb+Y1)^SW|oHUkyjklW3e-Tl2)4!ABm`~#Xl8aBT>}F zYF!`Z_wDYc(bI>2U8UM;h&+&vJZwMOs1{I@37?WE8H$|8OIE8>^hs35tE>m){f>t& zt!w;%f(C-2J74j@|J=+wd$V@F2pTgA*}wP$Abuk#MB-%IhhjsPfzs(Duonw#{SRv&ZJ$P$6+?1sjpS9kFO$2Awn zUh>ZYuU1*WfZl_wjk03))o_=uBE-)L+^?{}+tz^0$lh?wNpL)=)yYkw{EHijkZqZo zni=_IYqu{u6YW116}*U7DFaSxt7mFV7=Su5pV$zdSEnh*8`~ST6 zmfzj-JL99o>a_W^WSkL|>+5fywf6x)wx@NYJ_fO8+x7aNN${q<*guPSM5G9J2JY*D zz7b_8_tE}VmajDj);b{uSsyC9O0qjm^ff1%v(MmB8|b0dOT5vqdaUo9(6kYHTJs-e zx$*W06X1E@i7+vL2gb-HALo=GbMnYQkHm=7XJYRstD7Y#^Vx-OoT4BjH3GJ<_!yQFU4of@Zqk` z_=pde(U{0zKm5Lt;y>G75}`;7zv0d5X~M8kUXjosBzbLPgk3qA_sQ=LqpOf_zX~#N zK2CnMex#O4{)R;9wZ94b_K{{ln$7a2W@MO4eH2fgM1fq?66!M3s7y3IjEI69yib)* zE+vvlp<576g!(f)ab?sHC3W#_=vBPu#brTxm{Z2JcNEBx5nHT#-4#XthmEpdtf@IF z_01cKXHI0#GI0E!QEu%);{JS1oYCID;0=`IuNbkGM_+E*x96oiuiqz-E4}}dIT~62 zfvQ$D@EZi~ME!4Tl*1-3tc(MzfQ%NYpryRK7J$1X0z^i9jPrMjjP@iK%^>|&6Qp!5 zu6u;v;ulS3NIrZ8oidMl5Q6)GjNT`Z=pI6z0-jEj;)sYhmt**kkg~7I|2JC4If#Ru zZYJ{^7WBA(^3XoGMe9(3l~GQ>6PIcFF^X|2mEzt!Nj)$Fymiy-`Xb+pPEJvzi_)5uGt+={moB zru6LoyEwMKxCeK=7+@~UX$D0dbY&c`u4?#19=#I*G>I#EFjwpT=kAXcx%We+H36LBf${f-7vGyU4Gwnb zbHpm5bk$~Cen+wxedKG5Sg0&zHacuOKKeeA%pf2Vr22X+nDg<{RDpT)0=bnijQZLs zaC|6x&hmQIw_RVV?=IN6h*HID*>OVj9plEL@-J;U&Imd(nRp-aWi_bM9^okr*ZVgj zAG7P|m#x4^Bw(b3XG>WKZfkf6S8^9DNx*z8HD|Htekg5Wbvl_$g99Z>Wk=kibv((y zpxf{52H{1#;=YLbhewr4Ozf5$MiGng76|>0C&}x)d>^cQJ1C4ZKrPx1ng0i^V;{`P z9Zqzn$pfdhJj=U9>&o*_&Xy4xQ3{mhUbdmm2n~@%8bP&533BJ4aLFwvbtz)z3Ju38 zj2#N_|E_qD12F%;rpEOiU;aN+<6s+0!`rE``2SQq{_m;rSkpGj|Kwzo1^402Ofe=| zNan($!ZcMiUnf_m<#uX}*l)?9kiPvt^8z2trrTO=U9o+;n0xk9L_gq+s&Q^xwD$9D z#bd8UuGwDx^@HDh5dQZ1wE-MQ8clk}hE3`AtUc}L_Qog0H)ON>pG7y*JdP$G#_#-O zS91gk?MiL`*pyFT6f<_-c5gm>TT|99rDUFu8mHEf%{fo_d>Hi_k#$#zG*j8r)FATx zC7szhP#M_>Kg)%=f^V z_j8k|7GCu!!1D2%)lhOaKY{?Tpy9DMtRj(Gk(U0~gp|A86R3F5W(i#w&kr6O^wq`- zLs#0vZEDu8&C(A(i#!+;TQYe81l`ER7D*`e6RRS_p53`Mg5)_bPZIyo#jN;au;=7m z2rq?U@D8|{M|E?xnK#+?)7c=_j!H9Lxo2%wQzH{H&8uEE^DH^}3A>MdF2Ba5S+<|5 z*_4sJzQc^11>Hw}^ijA>k-1MEsZH#wJu^cE@Du-XlqbYCUjAxwo$!zt;bLwY_ef{a z$8R(2LwcDq>3mVm@J&{-VxsoeqCyL?hEYxHcow`)(wSEzo@^7(Slz=Hlc=OcKUm#J zsdNv}sHm+g+Pw7if8wWkRIHU>nQ7_UDL(DEYLO&@EJF8Q?*DjuG%WnH>uk~WXZOWc z%(l?=uX_tZz!ok~Ve@lPeGkPzAUQjD-OHTgmEI;s@-4+6IS15mbIdaEAW^(K8cY}+ zD88wEj}hJ(D=Z&09UIIoDJ*UBIye-*=raIa;1+Ejvj?k1U)&&H44&6ZG=#jOK{@ z?=ODaHNU?GvD^%5Sw~a2<2YYSbzs)?z7|TZ;kdOigK=7SWVmC+x>GpF7DO+%e!0}n ze*pGRcDRS1Nd)Kxh`*y)P__>43@zxbE!c1T$S$@7tatzOql;S|`&8)1;`&XdMb2_(GSLxBU%?EUWSL@w6%2x`z zQ$4DrA|!p+7u$6z<{y6k>~)W`{c^LX-a}MI;s-2PF{5%qMIXGgfvAsPF1|@xV;k|4 zW+AO&4eh6hBoRoPO+PVuC&yD0YQ=sqhVyK>r-)T`JwG+0x}6%o?Wm5Fn=FJn%=WV> zIEFJH=fG~F%0*oZ2ruY)>_26d4)Uq~j5LTXs$1k968aGrVzEL=+cc_SN+})@R{V(J zwM-k)Cn^{YzRvj3i6f!ff$oW8F)K^kkbD^rTFDJ5P#w}8UL1xJr zp+kiynEQh8Z-cY{)un8Pem5o<3Ju+9IV!C687t7IKFt`trZ7^-oP27(NtlW)lh$IG zwBd_LnNutUlZ%fQ9|>kJZ#*&Sksze`kYufj@Q}PZ;R_lK%iL9;m1$kB@!cCV?U~ln zs%N?}{KMG9|NOg!cmOB!<6p@tbrpDYK9_ds*>M59JNmi31opX=R1u@Ow%8Ua&J8Ka zxLW+CuFHhrhINUrjNMV`X)r1gi6ndY+`;_FRUcN&UH4gDnxwK}4@J+j&60l)c8 zSE_oY43!c}2mI+O4Y^}~;PBs{IUn(~cE5mO09Rnf1efIl>scXvE_uQW@!uUP=eyt# z+{5B|?pm1?af&8PQPdAMnD+dlmF{G&C1BbfN%ai_EDpX`Y^)C_CIdqQZ4!Hhni8iDbD7#X zA9Kl;@QMag`WdEw+E;Vms32;yR;W=Zkqr5j!= zEeA~8dlDMr4<$FNkO2UFD5bP?&3+#78&(26h1q{fiSMYw>89Zm88k(7F86eh(@V#? ztzQn1n+{glS7r?wX0Ye^q%>9Gt{oGh)tbpA^xL9|waubG{rPp-+>CKX2XXKz{9BRV zOW8Jwd}13|&Jv z(k0-~-AIWzgfvo0NX^ia10o@alr#uPiYN^tNT`HJcZhVV?78pXv-kU~wPU@1!?o7; zI?v-c&f}w{U^PeZ{u#JlTm#9w^irga=As%nbpqa54IREH&}Fr*4W`#4-h9IUgQFBE z)aEr|p}+N8W-p2CBfH<7!~$KR4Ih6~Od-to`{ib_e6yxR<6iVb9(kpyk9S@oxDp&Y z#4F7od=@a>ii!TiF%|T*U7R|r>ZOu6e>4HlmYmko)4Rwk-Y31x@%b57Z*gFmuAXra ztV718SvRv@;OTS)!HK#qrEjycAoNmTzZ#ldc6fHgr;~$oT*^^16 zRUVtH)b|eV+bq>?f1IFCp>g^NM$@R&0w;m1Y7(vrO6nQjG>=xn=i~>1`GMC+Q|C~Q z90k(W!JL#C(^Uc#f$VxAutDFnH2>0KrvD|A#IU{THnUAuoRVk+{)7m8DN4RB85@3s zXAOMZ7z0_!g4@-r-jRX5HgViJv(KJ*gyKL3oWXm(>SRg5<4Hw&{1B#EcT^7q>$>lJ zkwDA`+DxROdQo?14|LZtzGEN;o379r9_0CAD6#?aTNc12izTghdC?e7jKFc&o3Ci- z?UnM!SfJ(VAWIuU&REY&Y1Zemh;>ku&l*-#MFd71O#-~V;uH2hol;yQ@?{hM9f^kv zeUH}ssP$w44)Jh%O-42{gu8`|&?2u1nF)N_ncW0QsNzvygNTX zJTeGARX`TW7ptiOy#OS>1IPw8BrcZ3fH*g}ETWgTPF zKdC%cYhZ%}yn>=9`(iM z`4A|wO?4)O^pH(`ED9%XG-H?Y-xjOI}a6jp1z)XIUKy`mU;X0r`O~5oW0a#|St$DS&TbAf%OXAOWEm zx{|uZC&2sWn|{z6^tBO#!ja?=l|B$Ha-(%OyY~PHU0*dZN9irb-0XcSnToQn3P?iK zZW;}i>&!R?6rF*vmb|4Givr{FRTIt`Z1Mt^@Z5Y??qR>YM+va^0Lr_r>28d)>+X;@ zABBH5@UL5&G+e+UtZO>HBebolS}IW&(u()3j}mM&5!r@l^4MsFzHxRz86b6 z02ry_s^5=MF5oS^t)SgQvBUJV$74w=oy?lFv2yHk()WjfNZIxh-pa4zh;Eh%7OUvdqoD z#fv`RV4k01o$uWJ#zZGV5kbgGa*!jrz9U2)LtqNkS47NLP6CMXve#1xuFHoz80e-k zu>qcc@^-lNP^~I-mu#k+a)aGyNqc>kW%*H`1DQWB^L4?9pK9m%8cVhn?QR}RP)BL=U?eHg?nZv!X+tGMeJdtcwK?tq3>s! zm(f&jw%i0lV6$Sq7H{7(jw8O{sdCflE`<6Vu4-J<`*MU*W}g?01Vu*3yM7LY^zO&e zFn>6ygG>Ufe1tPAmkpb)wFkOTDeuc+bNf_Zd@4@hbcdGES-kUCw@M}z0@NipF7(Fd z9oo%?E^uehqjxzc1%lh(31i7 z>(%f!Uj%DC!&24T=HDYeVEQqAst&PSyb$aR0Gq6XY-8w;3!ryhyAG?RdpMCtSbsxZ zs`q1q&VA_FN&-9 zPhubDeyU^}t4mf@pX#D{ofr@679)Ftmh&H(`u6le>e8F8m8tdCAj=)xsH@7d%l+$a5D6W zvvJAT-kojt7X#N*6z}J~OXikS0MKWvtFe>jDEpTcQqlT!Y&EgQV>Q zZh0}V?*k`aEEqXYSc5@xb6{DHd7{s#X@eTb0|qAe60-K*z89?oU|!9%UCGzdM{xm~ z2Ha4RViN;!y+`OSGMm^esezWI5g=X+h;bit&xLN}C(T7ch(OmOvG05J2M=i33g!^UtMSqsN6Xy21xt?O>ppCoi>n)?2S8rq^A2kd-g<59N-Y(HX=qeNsg{* zZ~N45%MlKsEZE6OnJ+O!umV=b{D2@JcupZq;Fx4c89-vZ1MAwo^>@?6@h8%E=ZIwQ z_Bg09UzTHk;bM=DrS=|J6h8Lir*H9IAk9t)ZdzFMr)3wQ-4H=xP50V= z6;xm-zQhOznndk_?00!^K$_2(nAAIDK$^>cf8KckAroy|aLbv!It}62FxmFPtev zQ-ps|Q}gk`dEcN#Z`twR7_~b~yhl54d9J&(qj$h7d5<>#0i2%kf&&2h9(KIhasfsy zdMncf)e5J*w_v-scASr71k4xJ&ON)PO@>{_Ag(}5Yi~q9m;x6v3Gns$LkjV$n+L$h zhF5wAi+$cZ;I!Z4(fyVxr(NE(5)nvoLpsLAJp^L(b|cjT!m0fFI|P12 zo`j`+6-yN`8U6!<;}~gYb*o&Rwe*RHM?%>1pI99@)J5O&5i=RHweAo3W+4+IDdGJ2 z1?~0`i-HsJxHTnnqswclaY{5PwH@o7W{1be*JMLXD3!fkAiKiD&u5dUxEigp6t*Do zE#I2H;9FVpP=%h4J%J(pvU9t{kri6u#b@^Tzx5hxmD0?)AM)EH3(MI$d zX_1Soozx;p8i^7qK2azoFpOm=dL)5!Nr*_Y8-Om#@b>}4e+?evK-$s>w^H5OrK}=W z5w0kL$*m?gZoLKR+~`?%d!o)5b?Ad-AUE|$fd5e=#BM`i6+ zsPGc+bhhysq{H)rCvqe{FC`|WPsw!aFH@YRn&s6nJ<8q0N`sb z{n|@Y$b7W=1_gnu7Rrud@Vv}aSL#yNQlg~kOCQuPh$x65eE*Pgv0draJ{cOF#b8fElF zlJGE)@&BAc7+=1S2fbnaVH1>QV)>VdqC+a@1ian`Tzr>f(N<2 zbkSQb4&hLKJ{mmuq>?z0F*oO$aIW9p=9X3~v(Luev{x>Ti(S+I8r8Z-<(0+SZ;q~$ z1nDlPHTBJG;C4hMbN%L_vepmEcm;q_5Mwl|`^fei4>6HZflm~f5db)Fzn6l{`@BD| z1R%3vs}CgUL_JIw?nHe^nhvLq0#YE!*v2H{<_cMF!0Cz0qsho4TwHy))vxAbBuFZ56rT)zwQYS>QLU>kijxuqO>aH05c;pc$Xt+0|Y zvkzfs3vsu?-wX=e3%~jm_^~-Qdgf`d>A|l-9+Cp4)Oawq?~6K9UJKq@7?0Y$S)gBs z>;m_fa9j@dYc2cYAvQbLbWmH$gX2K>rEo76Nt8PacgXkCSfv^i(q@seuTdy4))SP6 zVpi*gEPgsNvnFYi^MF$LScsx!9u6L`bQ9~55yfjOPAh6oprm*}gZrnfVp}i5fSb09v34tH~ zuk-Ze0NI_JMX0N(!oY??n3}6+-ndG#eTx@em};~*so|n*shuM@Pm^I~Ew2|oNL>)H zc}9!UodGxI)P`Hdjm*uz)4tmF>U0{gIIy1|4t8z<#>AL1y8iU~H1t9%VIuEs)6R$) z(K^lU#E+fXR{tHk3-?Ys>4Lz4yncmJjW69#g^b+x*p$D2y6cy0c(Yi z`;(mB`HDJqil=bWkvpXJOFDEj>8Qq&ztoK&>v1dP*_#Vb~y8fyxyWtdyItv$1Hu2{>o z4cJ=C!o&)!XN%ORuIIRxR;)kwbdc4~_1SYC%=4Xe+jtSQUa^rMdMZH82EOps=DbV2 zy-^t7->X%Wl&P`tEKo|&?RJuwDjA36w)j@5@kM<+I@M2byPTp!$CxV#U%6dLq9HiO zUfq8!D5MfQ?7mae`j*7C_TA}rl|g*#<&I`D6(B(xd@R1(Ff6mP`({j2=x3uxx|)dE z=B9b9@}ymER%tSWUqy?;xHv~!;6a);XCc7=Zr)oz8Q?gmJ$CDG%W*eO1gFIayypkj z83O_Ip8H*EA_;ZRbQDah%=JVR)8ed|F2Bow%R|UIr~~tC6Pf<1XxEF?Y}V@_UJiea z7i_7%6Se8YT*X1r?s+sKw^98@kN4N^(I}c!|T)JjH2kpYKG;5i?x(`YL@kM`hkm$f;iF3l+kD< zh1t@VqUVI$>Xb)2bpv~8j1&R8iMuy~kKT6G)%}4isDqUxO z%a|)kGI6ug2s0dz6eRggk0#$ZW>ETkJLUaSn%UsW6WVL-K~<(h>n-`!v3S#d=NQ#A zb`y39za5&ioPcIgD*o-Xk$lRbhr_(-8+nscR;Q6 z_ruKABqRCm_3n2;;(8s!_luYW^gDi`>QWa%snj5~TKY9xaKRz> z2bNB$Ulk=%>Cs6^(MwvkRw;iQ(+ZMQ;uOn@#xjmM3*aN=nmnc-!XHoYoph2&%2vKg zO_wrkIwy&ADouA7JS>@~u-EG)|8kfI&fpOsW!i{^KArrkC;D|=ZyEUcW$cru>Q8b^ ziXW9EG!W4-+^u{QFZfMuWSo1uTCfNdJf>^GS84Nt9ND8g*}#_k%-L)3me$(0#%=%G z`wZoGHgs!C6*I#9E3}lihNj+MHrXMgP=?YHJ$c-tp-V zyGQjFPuLaBvQzsUCXEWk`L%rHCQ{8O#iM=;n{TJp)GznCp%1uZ%_(UZukExND1+TT z9a1PWHs9vhv@(%kU$%L-Sxf`U`57>wX7*z%GoAQj=EfdH+QUUU-fJ;F)%XUa$Kog( z<}UP7v>o5wY=8!f{gBPC!teZ6*n`yhktZbk?*NPbVnxUp`8NK0}=wO$8 zY{`4cuN4mKp0Jr{=3AxJQ?#PFMS4q4Um@w9dTU5Z2x_O>Ghx7+UbVaXyZ>uh6<_V= zVp!Wwuo9~FiK)4w`gA}^8@S@N8bz@~%<(zbQgXea=4Eo1Xm9t;E%C+jM7Yc%46B;L z$)%#&3q+E}8U`n>Pv^q9-?;WN%ll+_EYnWX66HWE;uX7j*CUY{*Nxnc2<(kx{nG8nLN9xJ{0qwrWevr2A$!@k;fbP1|n0Tu^GTu{++ zY^^A8(Z-=kbj?IzPHYVr(5*CA+=;)x-GJ7o9F!$L=I4&Vq3vAMQuDyIxJLweL>r1=+S$Xq_(h_wEZ?Y z;EFFqBimu(q5+7rx~iet!ANQ9D*`%+~JLgUM|!h7NRGA;PmV}GSf^luqtqw0LmyzrX#y26->x$D=+oKg^e-GOsWVaXGGAOsS!5jV4jFLWIqCS(j<$B3M$c>=TPrkoV>)%-5^(Uk;Q zSB#Z^o$?ir_bCcy9v8(CWNoCbbUZ~l!xOnZhP*Qn@mK5NR{MmUE*ls-VB9|G5)yo0+lUUv;iL0v@*J^JqH*rn(&6<`Z!w z&AHhW7tp1nU+ztatsq_R5^8S(NGU7FAm=DWLNh2h?e+S-Rq z6@*@*{Qo#cK5PZe`M_59gUK`!^2Xzu3hZC@-Q`~nLut9zz77TF}%tto~@-U zd=`tlppTg9^q<`zi?-^@&38!8FLC!NHKj zK`-9XwnAbs22lG94H1by`5Bj|TUNC0=Z#u?N%trcOV_vyY;J<$_=r z2gye+6dj8XgU$YNeN^S(YbfXnKR4POHi?0>#JYMNfTapdH!v{Kpp1yLjFUwJbs)qt zKB}M|+B}}pROd0J0waGIl}#8|>LAWvIKIU_nbCr|m%|A9yY_wrdWz0%Bhz&$T%p$* zRDqRaFz&*}EbJpaD#Ga*U?f`xdgs9)@t~J{aj{cGw*athl~CD_ei<_iqTDd2Gpa|{ zC~%2u-54d08zLb#=0c2>rsakcBAp;&-yb7d@JWiZ&TTzV`=zCssgfldFMfi8O?O6F zmqS@K7>;=>FXd-DCB>xm+o9ZAlEszdC9$7rJ(-L}pKMjPCG>Udx zM?rJp6yK%jUrgyP$MQS4AY$xe%-ta5>RF=&26H-8Z(<>}os=^ePOq7Q*Gr-21;`UM z*tQSrj4Q>BK-i2n)l(Vr+(r1i0?G@N$qDw+8GlKhxbKTbXD~jwvQz(PgK`?K83hoc z;E?ckOn?l$>Q>R*!LmDiriqMz%go- zy35EVc}NvS6@znC>+`C&Z>!#YuX-;?3p=W^?iTO(Ue^7V$Nh2j(6+E{r|BmJ9{7H> zIS2$^1Wvf~u=vz`e_Qk8dky}fDEnf~@+Eg8BRdD6j8Uw1yHarJF|8sBxU zpszy$JlZY?3CyRua0?9M)wYkKIsH$jx<|_z`8>CI$AnA0t zYfk_P7}s(5)MC0CL_Da`VgQzcH)?vUlo$X82OOekyloF;H?BjgfEaJWb?N{he50re zfCx@&EJO@W1AsdlS?hq0mt3is8k9PlRyl|%_nW|2K-kj#Hln7R4q!?gK%bJ%VyBrc zjo9lZfM~3Rgrfzx38cmIQi&O=3L%-X&0dkMCFgIzI1pBkmGH+SL$~DY&{N<688^%G zuXti}5wC7K-?`axm$O*_P5t7k&EYdD{@etR@Dp%585O2j8p%zprBczWT7| z6OXtHp@HyS8=_?R>fIP~$HdK!uXj2oLpr8&JHEGf{Fv?dD&;SFZ7T5LEgiWYXW%~R z$4Y7EbS3YeDyci%9zw~V+iAkhX}Lc=gUssgz4MGHSv5y*5#kjBF%j>u=ueEQ&B->@yuH-PG{nUj6Zk~hY*W&e@RCF;ceat=|?%UU( zKMf>=(z3y8dB+ClXM3}DGrLL#UfR-1+<~*=2a8!~U2=zfP2hft0RQ13RR70`tEQMc zeB_E!2t1KP0{{r9@bbHabZL; zWvjL)9i%e3$SX9K|?UcNW?ZPXI5G1S6xji#O4GjI8yV$jY>-=-E z#31Sg4YSe&q2ViXTQkpPqJf4Se1-URCI357OgyUt{aH zui+-H1fKRS@Q>x4w>)Nw0L~Hgr2-8Q`2Q6WGXTf|N+7rYYay|^ocDhUiGK{%7yn06gDd7TP+%;(_~&|#itl}q|>8@IlQXh6_h&H#(}8k0}X=a)yjvs{k?zGeN&Z%-`t zjkvo_-LSt>>cMsI^SidAjWJeJp{&uMdb49t(h?Fh-iJoA+>3GMkH0a2uz2G)-n%p2w|k z7KM+QA80>~W65@AYYxJ)o8J%YpVn?Obk9zb8wqv*OZyz%yB5Ka5fIA z-dfMSQAoa#_wc`IHP+VY;Ut3m*3rW9*qkU{-HpryneBD{FI4-ET!sqnTd%U6-IrNG zVHI0tN_!wdm07B~h4OMi&Gm|k=I!mOI)YZSQ{6b}E~GL!SGiOBu2NR}b@pEhPyGW( z`%Fwfuh3?sMMI@$#-<`ctNHq#+q3CEDd8eb!xmx<%DvXrOpm>`&C;s9x4X^%q=YZY zH_dGOJiJYF=Bj>~=kM+OGXC-P>Q^UG@i*@-GQR5lZYnjcMZnl#oSQIs^?RM&4pPYY z-b*{M(R<^$z=J_1V?kJ{?st~lA zac#bu;|YD)pZ`m%@p`0Q7w>;EX&d4@;qmT$}Q@e_$beSYTrQqs9-M8#Cu0z1mM@{-}-(!Uh#D0^E1h@;S5T53aP=j z+(yo#F7vL-V!mfb=<8vTw*}L1gN!#~FMcEAtIT*tWj&r7j(N<)+qS=5552m2^b~T^ zf<8JI{j%CqTorOOrsa)168|Xr=VV%I=0cB=@}*Mn=z??V;X;Uu(RoYSz3_*%T&?dX zwn?ScXtF;&e^l^u?P2W` z<6_w@gkQ(S(|=^S-eB`;geR86`oo|Nw1rZ@Xo6k$b* zuTFZ!P?41up>LYWC5UqPT$sXd!_83DyOxN5l`2J7f@LOOcTf}}*L=FT8k z+=(*3+M0;e9l)&w-w00Y(+oXWm%Jy~o0K4IP+{Jy7PD4-bMW2ZPvvREC-E=bOHO#% zbiV7Z580Ajv1(7Q8iJqun-53@XCR14#8QpthqFJc+( zSCpG=4NGEtSE9v~t%AbnDXCMuF8*yaFXu5fNw7KXWA?C^u8hX_p72PhlHqDD0=M-> zRpnb=(;JTF-f}eRBJFi})XN77i)8$QO)a7&bPM|)I=W;Hq5b^N+Y(Br9$r3!j8DAE z?TW)BN@8&mPRvO$o(^wKQihwI8d4-HorS>NuNxmVY6)=Y&>vdmox3!Z$3Sf~RP{ox z`MH`0w)!OR_@!n(zg^xsmoihUg1-uFayTfr_u+DafnI=Hi3Ofr=cmDY-a`UK?(W^) zbFW<1jCQa={?vF-akqm%u5?*i8@)AzpPYl`u(I1e*dKZ15<_&gRrji*g=50#3EePuaTSp1j+QUMUezG{TqU9TAm-{j-gbu3o`i1F} za8AylU{pUDsYKhuMKFN`-7lM@%g!>4qAzXmNh4o*A6V;!ipb$I9z(ES>t9^E9M@|K z2PwjVZW@S$*0|Zj`_Qm44Dm0r2K#}~EC7x6v>kO`5)o>~CV~*OS87|g^ z)_x|8IQC(Zh@@SqUpSrp0uV40%o_`aB%kHx;SO@yX27SmFdp+v7Gu{ zjv;cj3{nLu;=A=3-V148hnf>3pbGF-hWOS>EQfNunayQr5B=D=rh;KLRESg!A<(fU zJ0X%1OGh++p!})*Q54hxiejkT?~^`OVad|CS@CiD$mj<()xE_Yzsqa1EJTJ4cJr_7 za+$z7t+yZ?H17&H+td(&n?Zev6xlXfe=$ddL&GoxE;m*`f;Z4MJ9qsnu?m&=p~yGy zx{(`^j=unYxF{ihHFoiU$3f`4Ti4M#sC;cQexI@EVOOi&dGc6+$G*va=c=@_+dZ7; zopCDrDkwtzFW|f`PAN!LNaLmO52IrD$n0*H(M@8Zzj!ju;VM)nJ(=;c%6uOeDL+b* zSUA5cK_xE?rAj>kfOFtYf2#8to+$dMPp$&bmkueHl9%t_$bIQF>=W;x9TIdae+gCq zBjr+##&TlTZeCxErM^Eddnx(N>{`Y7u;+w1noJ$(b_Kb-d40|tO<~^Z{9E>EAN4y_ zBI+9UwoyWbf<){Z*jb#mX*5bg(uw+V_^JQ6(6(DLvMd70#C>nj+tT_*5+C9&!S<|!)Ex21y(}!< zdE^WbCzDMmB#u%f^yErLA{p0kWvMNLeX83(wYrMk0GKg zvSVz5=*iIlM-Cth93&VCf@c5-OOcB!0Amku*QT|@(97(j?cxEh{G1Ym_bQ%_VgHtU zb{wAs39yc^Q^mUAqOQ_$k8$xkKyV-sWOCgaLvuh9C>Q^T?8z$xfbKZ{qv?~(=_eB7 z;CwkTDs(&@E|x+JV91c*MMjs$k0{}XJ22=4Z^l`e#MSWA5^^U_3<)J^#NaVdc2MHG zYz9p+c(xTaQ(as`7SWsfe}W}Ft&Eq85F11?rv&@tro#nZygn;={yce+A!S)EWz{NW zJt$=}J7v2yWw%v386W!7ith0u>36Nr7jf)~;4rdH)V`(r6&Y=H15TtqkxDJ{K8G`G z89Aqol-72A{1qR-ffvO^4>6?PFMM)shD~ryTLIl+VWa_{-@0{>TBn-cf{S522i99D z|AulwAd+9S#dOHq-cm)~-#8Z6BzgBXOHSiW(qnDgckWP*!Xca%xRO zGy+52gjmqeU>O-W0qNA4oC1Lq1H|)^Efn~E<_-I-S2;2nZO^+O0=J3)uG7!OEYn&W z@wFGoN^9C~SK2B$XTGUWsV-pF7A=(+{Pna0;jd^hp6M{2Yj~CeX#lv#13r+yXcM6M zY7M8r0Ol@UdO8lt5tlKkq_}m3ki={`ZT?e|+ovlU4M{BE?|(IH<@_W5t($cA-87 zqowvx@~!dQA?c;JHFy8ng(e*|k~R-JaeuB=<=pml9f`Z3 zejQ%v-28L4mHa(Z-K&7@AAAuboae*y4xz+c;Cm@1LYDq#`yZVjG_bCPp7F!b@2%xe zekDdk{o`A|yExiJBp}L1LmvNdS;!h-wt$DlS?;N2j=l`BzFtE*K_jR}{8J)K|A1lY z+rrwY;NxnkG3(2CdW#sM3N@(8YWyii<=B%9sX@kgw)BKdLpvqf*R4E7p@zI_QgTZU)tjcGl>c)^!Evg14vJJFh!Qgm&wC>28+B z_w$CNE8Si?9?;+w{Dcp&VB`Er*o7!*O}_{1{A^iN)zxlY6(m%Z5O$#ll}Xh*wYFcZ zHeDNk<@0-YoU6*~y#IZ=^XmhER9MV@lgjoNisav2NOpI>2d*W2(0i>~JQR*}$um(n z(FdL3V-*zGFLPIHP)ruA04k7>Xtxp^V1G;}un2Yt?{qW~C zd?;^4Bqc!h8ktS8*Z(6>)hhMK;P%C|Vo=)}S`xs_8t5TWveO&5EGuFy8o6p?pQq-bfDNV+6S>LMnwaN~&wW26NWYpWe`F`awD$k%|SruXM zt=S)ZZ#&-}`t|3_A8-Br+h{mMg&aNl+QaDNgtM-tk;x9cS9`Et_WJK-r_t!&tNno+ z*S}ZBxx)3+zOa`GfP%{->SkM~XZ~tc2Zg3!$@B?umH^mO@*6j%?x5;_%Vv@4!Zo@E z7l_B#-$VLe`SCAV3~O(6$>ppB@~PO6d#HEQzTJ=6e1iHH&QeRsdUn%DM9Q_tu-*Zy z6iN%fj%uw8YQ)Do+OttdtmpAWZeR_g&67xcy7~Rw`L%Rd6f#`r3~2XD zDBNf6f|E%FxoRqZjI!bOC}tr|PnK65Qu0*iT-Y7dQnsl}#Zr}^_)d~Ipob~ONrUV# zH=bbqw6v&%0R?Ju9l5SZC5B)pEjvq{3nDVELpeL6=5d|AX|7b5_-Yfi*2l4$;wW(W zTwUz4!s(0qZlesH2rbE~!(QLC&Nl-}!s`gp&qOio6^;TS4H=e2emS=*U#Yc{8aT|U zWioucFI`WhmpkZ_`)O; zIUv94JDwa%F5iKP(V5Cf4ST!lulr<0mptlo)aQpf3qEc}4cRaX@@SIj{S5PWfT`QEw=%;E^!7SeAx{zt}N>LtUuF_84ED?^FQp>c<8=xm};V=>SGih}~Ae zKFGYSEH6!FdN^(pg^Ht{<|j4nJfA#XRLgW?B@=h|`}V${n4PBMi9UJJ?VilFbTVsC zV?n3XP6awaGcWD6@G=+i44E*#8X8K!W$DNWjeHfqKEBMA73{% zpbk4VZ^R$KTG&=KUO%Ji$ehFvLBAq_g1czlx9|lozSdCRJAUv(y14kV1_rZ1nRgU( z?*>K3dq^&|r`QI6mlO-%InrCAJ^eUEZjHhw7)Skl_?_jWX==~GG^vPaI{%R6~Tbuqe* zAH7gVB2?Q|{jg+(d5Yj&ayll{j$zq0(Rt~lT8>(*{2agUP>R3DJ)_Yoy=J=>i{Y&8 zs$pCNFb`M$h`a5AF}@&W8an6&u+_iDd4k|6)6r-PEI2IbHmY{^C|#DT6_efV8;d$M)`4?VIbtE`<<)r)1RB0TSk692)UZQ=@DJs^@mLn zPpA(}k5n2@W~1cC&TVaV0+a#X7eNK{!@h#=&qjWQUzHGREMY%*QAa{NF^eK5(%tl* z_hT0%i8y>(d+i^2SM2&OGr+9wN`5{_3HiN(g0&5*v>c?}BLcBpi{U;Zy62ur_7fr4 zDM_`*khm!ZA`}_rNL!Iv)>Wt|?RneS2QFM`HhK+=2i-f*Z0$GvJ+H(N4_H+NJ*N-b zG_?W%NzeeI;h6bPf7mCUI)P(@!Zz=IRQ=la0MPg)2Kaz)cyh%sFmfMYLX;gc7hHrT z+Pur@b?a(Aa3UZTJC|a{j$N!NIY!2F|B6ce$V`HYs-Rasv}cU`Dt;@IZ5KnDNB@cZ zpm2Z8d!1#YJnxIajc20`e^2UCJ9b@+uD;LyJ#8KB*b5vD;m&+_CL^C;f?G(>r}@DB zobm6$QrP)}w(yIw(ZrEYl|bBp;-!q+-)H?Pe{u)gIe@Ab*JowVVDD4z@lGp!(67w4 zI)QaEZ@2QYt7U>@4*znk}XNstDMLAM!fpQU{gAnR-1RKU*3bEXB`ylqy6A!JP(E;jwub`;2LMr zfMvEPRM~-$({~jBj~9H2o=+jP>WK2hf(_1Zu7@nTreq>gU0GJp(7lp4LOb_n0rFke zO~v{LIpv5|wv}?@xnf#<0ELq)DeuW+@ESN5KDEg9nT- zkIMW%a+J}nwe!9IzyklD+WedUf(3qj^Upl$IQd4-B>!FL#ecy9%Zz#Qd*rUm?hA@v> zt!Ci99M^>2uB~7DlpVoTqoYxv+$PxP#AZOy=3|OT3J`y2i=Ka}bNpmiePcl>kU?WK zK=(n*uLbxWFuUQq)`JzFUl4rKzuJ6pyZPtLOMt)0xX!}oIS%D+=cA=-n)!}*7d3~U zD`eXZ|Fn&O=ZutYT$hCeZyaScxxhHCe_uoD=#7BT@&z0jZ+XGP1;p1y3z)(=YY<3- ze@Ba9X%%jTU4)N${xa#_IIhpSDT-og|GA{S-e{+;N&)Goo zMH?@a=-r#9)3rUDe>}Kv(6SgSwAWfWsk7IHzMJqrwRuj`1nG=$2IqI@>s7zrL#-W$ zFuzGyCgks(NOU%V`0^0dV5=h|1#A2A{a%KXB8onSdqlqdEP=b!p_iPy1Z_Uc^PhRN z`fy0NW%uxt*nsfSu+-G=DvClXeD%n|^R74D%ItaWVz($meLJs1)oM)JGntIWjju0% z$*yTLOSiMxL0&(y37i|Buq)P!l4icHygN-jGA1JAD)hA%VE%>6Z}!dH8v_xLCf`3Y z{Pk0>4*g6s>%eJ65xD6?zS>rmYDMt*@{h>mFS7W+;N&hvM$s3zXB$qVi!WT{12;?F z5Ix>1FRQ)W7Tz0vT<-#NI@ziJOKLaSxKT@J@HpGM`ekdkl8Ckid;dNdd@4V>E1H(| zE>-K!$-9cVP6@2smn`?um6^a_f6f-;QeUq+`-;Bz@0E)P_g!y!)poTLb)2N&^I}Bi z>>!I5cI2~^e|-(0Dgcm{Gdy99RwE+Jql~60(}g80eRl}jJQ+=qQdFcTCp*b~^$#-{ zV5a)%#pj%IfZiu!g6EQyN`~2tl;kNwYCuLxgQ$!`sy>$K8C@!AIkitdwP8wBMFeeL zyEpP-T|5thbiKCg7B`aso4~^&WE{VekbqZ$6*mp+O?g>_Z@rGe?;-|kdQGPLj!Eo5 zPNqQf{&@5X+Z|iS$gen<^pJ_>>H)jKe!##@liJkq8BO`GWpGANx)!hbprY**{!3qF zGDwnPoh1^fwjSl$D_0UZR+#$OODz?WHo&g5tZk6r&teiyrabSW%bx6VSBL>E@0Z=_ zSM6g!3fHE!X-o6RHr(`M&=znNK)bFI02AgjvSeHM2exTh3PVoK0oL80N1}2(aot}~ zIqaU!Y0u#HC6SRNBk}m+1dbwS`7|?%`@P^iz9%uVliEoU@n7VQ%*g}n@YkP|`wwKN zwb!&rwDdjSeWur1`6xT~Brn2n|CuskQ-M#R*6(+E5#JD;oi%Xlj}ijV$l%nl(%l z%%zOwPSby3pu|mq_&6(kvHv}a>nq^AdJ zt99GK$gxi4$0t;>+*6g-wwYe4KDI-$XHx7F)f2kk+;upfd$c*K6vE;*_3iPQVB%yicJLL%BV?J7?V`NU}0>vNtB^WD|`!ncyv#MTz#32T@vo*^q* zzUnbzL*u50_tLOLro>THQ~(kXW8A`Htw^8``u160=YcA|k_x-nJ}BN52Gm~!T_=Ir z#C&{}3ot7W3%cMbVsC@$?8rygyXZcPjU0|QHc(l0A3IjW`kUTc(AKQsGOSOq9A2ht zKku_v_chchr-fxO^vh*JqG%dch`ca00%#n$Uo`^{)#8Ahw=O~_{56F*5f8Tk|RXkl1T2&^Qqx=nfB~!APM|U?p(K15(*9U-}}fw zf{j#s%|i)x{U7YTWmnvL-|X4YNaKyWy9RfXMuNM0aQEO4f;$Aa5Q4kACRlKXKya5} z!65{~X~^E!wQo7I);yWHXV!TM{h-&c{#Bo9(ypEF5knW%XdtFDLaZeQC_;)-FOLr=)kI*v5&)z+T?)igZ$Jtfl7H4I+k)CCeQ7 zcNvRA38$#vRi;>ii0Q*cRZ|hWC#fVm=h1ktT3ULMoX3Ue-q5YYGfl9nCx^k2_+Q68 z?}U;NMHIh3HKmj<<4P6{tdMqG6%tnB;y4-2Bd5xMZftWIdQ8d8p?iR(`b>T(y(1mB zTunu{(a!Px!N3FemJw)sDxDg$ly|&k?9!CN@pt}?j+b~gcE{^f76^qko1h$4oU1%} z1~Z&AU@EzCO-b#3Uq?kiEzTDY7VK@XKXF-jrhq5VZ(D+FQr(M>vs+~B*jZtd;P6BIZ~6*lElB zp_$l-tqMA5hAnl;o6RuvY89C|OTMMnJV6~n*VLz_Zg)J}RuMDJ(Q$9OSgkDUsYC+2 ztISeptalveTF5<*t#4s2cOJ^aCw|`_L8~FjddH8|5FpvjDg+sw zKwbEXg&{{@mQsB^7#|^dJ($FOZ~ecMLs2;uuuxQC*6L9X@kswm4sFFr;6de(8Eqg` z4yE)y%Auc=q)<6zF5#{JA8IA^gkmPtupCf1WY-8q6`cCKXfm?3xgg{&e`+P)cRw;7 z!R}=TCxj>}n(v7#=0yLNLez?pY&FPD(0oJ{+|?mZ_MEYj-|cFsCMzwI_(^>6R!Mo| zLcCvP;DedXBdP$cmFzsC3RkyNTAg%Qa9`2^p#Jw zlAFyqsi#_rVlET4o?&rsruFfkTFG91D!RD<7KWi#Um@3s>p}Hv-QiT5eurO2%};Vj zF819R;`ilWCm-{~8yq{T728uwh1=TGhF+|03%`(4`kFIaROWq^G&v%Yu!wDOb1lbP zfTOZ!r1U(Ic%|d_ucbW1hvc~qg8Mr{!kCBOcPN9}S0APm-sXF>Gj!#--^*pc>rTb; zW1Ns)@yUkMkmRx&un$yL{qT$3irS|=Hb`7o>Nzi{n{c$!4%!lz_Er(Y_$vNJ*x3-} zyGe}CnjIB`-B&?^W?t7B*0(;lq!><6u+dNPhydAfMuU!qwxc zWn5ACAZqBKqjC~VSI~4Ozc@BWP4p}k0#QHQJD%24b)MiEVrzAdYJE(qfQf#L-DYgB zi%~WU26=*?pac;IGk-C{EwM&VaWO$vJs5QrhFa%%scr_N6jv2q9327i(31F$=~r}8 zgVm0A@kzzpX~;-apVc|{$+BF{O(2ZJN8v$<4I}2=5+!nb6Sb)-t*a8Hh$9m-wt#se z0Q3GX*aUBy@1iplB7Ze9!LLSz&K>@&no=r+MvbB+&VC73d;0VaSf=>ZyL*{KC+g~E-*pWL0>U-S+}8$QQc z?!|PHud)KJWacvY1UG<-aw}ix1KI$USa^P6A=#>Hsd|y@*HYcfQti=F&8DHRm7JBB z5|>PlPE50j*}3KQ@drZDj3Zaky}oro)?87)(nm7b$zhO`$jZD;xKeL`eFuu)jf zieIWk2w9BrhqY^+vTLMZVL%je^EPj`lZ-{}%=zA9VLQ!Ay}M^Ik)~Lf%DAd8R$z6k zwHlNi+XiN790BlX(dQplz5wmhSyaW|%i-jAR#7S+YM9tA!T^i`?W~o0ct(INrc}!A zf=GA-@bYd#2mr2g@`tAN@-Z@P+k63vkyr9kn>xNS4Mm0h`-5e5tfr2Wm(;Le@T*J) z3Yhf@N9}KAn78}aw5kLUWNFUThte%HU|awIq4O0`${YmLsSYZd3L-r;>Q>_j6FA9H zK_#anJ7tf1Da^v}nQ+s~@NYT99$OP_DZgnNuOb$$jLkkN)_t+GUO1C5*;6<<{K~z! z=QRnHDjs}F^S)}2sfvp-Kl}2AO?IE)WI1h+k0DEtOmo-enQWgBU^!HPGNh$AZ4MO| z+baEGl-Y|bb1)2+kJuWBTyL9-Z>AmR3aHr>Ldx0{vI;8^&?ZxMly()`m6Y0rW%>C! z%jRG&aVcg>L$1n@OBqb9B}nswl-?sxeBms14;V*RV5U;PzcmIV%i5Vm#3FsRv=9Z% zu~089`DL9H$2-@-JBW};a%l4IfOs^Atp5RsJA=`t4(+rEGPs6t?%956}yAt38dro7FjDG#4G>@($4m2 zwBt~IBLGr%N(t*1$1<8sK7xTJDR!d(oNOb0d50u)S0lVw3?oD`Ed?+H3y!%x0K3-~ z#_D6=dQ8e|M*drNsga_JxO5B%3CpwQF)8yOAB1{WpMM+>mM3vVCCiYG4_;jA&Gh5d zLhTr?GF%=&Od5qu()%HZ=Yv|E2sQw6>8QRXfZ-d$~ zuBYE${`L`oqLO)G_Yo-#P*jp*SdXdguodQXgYY4V^|?>i+48%rM9WVdMqd%v+sFZ* zizaUmcMn#_KYxB3HG_t;=Gu&OG3}p?%Rm|knwl{Re0a&Q9*m=DwH`uXQM?}dpY=z^ zmh?YS$w*h}7}NWJykNm&s2#(w4g=L6fitG@(*KGFnb(a$f7M#?UV561wabrQ{3?~T2?9sjqahFeW`|X6amRD@9Yf`v8R{>>I?73&OU~{!-6DB?8Y zT`%R_P!iJz){4?a%m;#zqp}zu1kYa3dzq5u)x9_L=NAWmFy)`j?F8(ccGCGtM*_3c zcM_zr5lk3Rf$JfBMTx z!V9@!M@O)jU`l1|TAu_why`>~dBGYdi@}vDjpkPcfUVU;d8V;{$y?-rV~Qo{WhWzb zFLDV+_gZ}ZIi2483taF(f~Z(vH+27>b`z3n?}jcK@N;N!{~$QQZYayd>Y?<< z(3-MX+-9{EfjHd&Aj6n*C(vsRs6m%%c25h_&Bingi&Ve#Et+AxlE9Iez%`e@db?f5 zYkWnOyO2*|7}}GXw((+rXRT_f47FoMS^%Zg7t1hyo?jbU*tEsuhCt*YKt%);AcE?W zD4z6JP3JmoGg3K)AC@pVF98+sVs_e=aP#mg{xJCpN9M$u0Arm>vFey~WC~qsyiNde z@G@}`>x~j;GmMUV=X*-mEs)$=FY%p4tZ&+8=JVF3PaG~k`l5qKYz#*`;5nTviSO1p zREVMRpcAHn31HXZMk3N03%!kXW6n6tljT!_xpO=9X*KP)dI~n?tF5mDD#(a~^z~V= z-hz}IDInp_t`I-v_Q1;5V9p{k1{<7#y!rn ze&-bfmnlmY$G$c_Ps*j2pl2YLh5RG*`F{aI`m2yp9*$}7slsIXuh8eo+Hbaq7Usk0`gSr~TzUn*mt4vHC37Uw=eNFOgnp)SXel|o_Wf;I#SA?@d-=cd>^ zs*L@-phuNafc)u!$yVk{J!G03zeeytY+>7Tpb`opv8YL-L0ygkx?#GHZX2a`X=BeH z3mJ4n(hc7#d1Br=?`Ir&Ecr1XM<+)AtB^4jqS&^I4*Rd!c4+8xclDl)yOd(*M<-DM zwu5?gco1P%PQpNP6Y3*`grl{T$f%a15%qq z=2_$pA_0EOIPcK7TY5$e`;!G)$Y>IbEj{zp9OjdG8qZKdG5UIf$2`$?MHIu+D#q|S zwuanqG|rI8sI6um1TQkir?Gv`u{f0S=z)+3v-G-RKU~DTdUM|Ev8Fm#%f0@!a@v4p zu9J&@W4as7tM#Uw{sW)x^!-iUEy;7Jmh<>&vX|kkaQi3pDQ`Nyg^p*i{W`3Ns*EGm zsp(~TZ|K-`-`k(D`@AsXtiC0uBX91`M)<0Jh=7Mh@W;kJ+N|kKY5g!@@38&IwYCyg zz%Tp7q2237Hsjn-mLu=g^3UV`XP+%*#vLE-Z`vZqjwioPz4`575^@SiD~7>3Q9kuw zg()y;g^xt#N7s)zqxwdNiUxUuQ$MX7OU38P%^u|JJ-G*w?#9YE31;9P!qzseQiaK?Sb>o zjm0@qF)#$;ZUvr%nA(%nkl^J^lSL2Yg$c~}5p0@ZunEFNv?VO!A~m6()a+@9m*^i1 zh;aolIB~p}MMnz?7xY;I8g=;Ry?oxBLR`r~FIN&yOfEnzB1l7alSWO;<@RpGe2egX zZ#=29>SyIjy12r-Sf1RpA%>c2X7kND;55$bJV>S#3G;E<@iwJw*X5{WcR)!?Xu_c<-XEduvvnK74)^US^c3?}cI z(X=~`54PW_h0QOTEPj zd*bx_oC>P-0^2RclKt?KVPG*sVvSJ{M<0HG1atmG*ATzTK9Lt7v4B0MMBY+%I%DCY zkbks9(Zjn{QaG}xqYJ1UCOeZ$bXhDdqRf~$G*c+Z!&>8As@`QXS@P&|bi4wI#eJ=u z8U(7H7HRb}u}CIdmRl*5>CO$!Hc}0jJD7vu_>BS^8@VbSIbgK9x?!-mLxAUSFrfAg zt;%wos&IvJlQ5b9>SP6nO+D!Uc5SXtR+ELCLYl`wYi`*4sxBMN{@gQ;4i*fl=Td>d zD*9joQ2{W;$q}|93G+A)$PkL^<#-%~IN10!-bNa)9)OwC;yi27amq+hxr+H-VG1nT*kX*H1Fl# zudj%oG5r|&{Orhi-=TsRI=sO5D!8Gg;k5*+k-mr!98BF2mtNfjZ~**m9ACxX5K&Ho z+LUoTJl0jPsht`kmqCdH<~BUAqenGUhSEn-=-E;4sg<2bR-_v~%zAv++y#-!!c^_L z=gMgb1(Rqr@Z7TBl&4~`bq~NwRiFi$mR*@Xcg`AG8(X*4>e)n9RYgY2vxq$?ILYcI zlc^L1Z6BQ|QIF2@6os-bcm?Y%?HPi~&cA27&R`49q7T(ie}Eo$rlt5VxrNRD4l9=Z ze;DH+UV5xpF1N)k0(^a+Ui9ye^aifsNOO%*9uL$vpr3ohIJo+8o_vE>JW*r{y7ixY zua}bja|1 z<`)0*4Pv5&p>tS5e<2&&Db&2(+o@EK$cAp9_2V3tPTC`~vGX201xx4cG&=}IHtPRE zHa_^5Y9TlV;7OR}bX-R4Jz~YhvH)QyR;>S92Ku72r5Y9b*bjX#vY8y5^Q2Bd-jDRo zf?~zxxdPH3^gN6YT?3xVa|z5zv8W(hQsa4H*E%?RM^WSWz+W@qk^J866H zr7l-(c}}D>B3!p{%(o3#tZPI^KdNw+q+gyKmDPhf4WPPG{b{VxY8GboM_L0iZR$8X z{$w(c2sy;x%!ZDR!BWCs+3dHE(lU={jyn02Cs8*g%J)Cu7_rX!)_Ek(O|)T8bLd-rOO!p+{yI#cW&YE^r8!{r(yWt>_cC4p~Q30J(gQt9e)=5dOSIf(4l8%`s!Y4y!U=~Mw|F^hxyqz zKds5lN38g;=^cI`sNm@L-37V&*bHOxx%d6u^*GkZ_z8J(COrhh%aMEAUy=oxzu>+l zCO{eUqs|_TXdgi_NyhMyGLdH2FoijTI0vFjW34ExdmQ^j+X|A_KsR2i69Cb79l8S8 zY@4PO$`u&~=RDAZeO4*WdjNgWKbmz@=9U;pE={5(4)l(*)T6qTku^Cldl zl#VxjZp7Pvmn}}dxgbeEO7+f>yA02}U77~Pi}3X!n95&=hL&$I9v3y6gxd9$0E2V^ z5R{LcIWi!?JxC&envavCPtHAoGpwz9NbKY)%@>$9gpDb#Qw%q{wG%Jb2r;(wl~>{j zNfRkiE;jG*1qt|pa*QPFcng#zg)`CdW~4)B zm|mQ;6-zSWb;gJlll=+~hnsVXA;8P$ak;Q^#F=CZ#LJI`I?LjwHt&D>nx}I^Uvx&K z_WL7OfwUla-j&n-kELOTK@6!Xj$AlC19{q?^=+IW{CJtN|IRJEFUySV<0&g~W*13v zCGD7)?fdGP8>T`r9Nr8v4b(=e9MV-Xs2~*b8;7ttQRTn?6$wWJVI(j!0i(pA7YRw-p`MDfjfUn$Aaxb-iLW1zy&iFkjy+_ST3Fvh`D_C0ui!xBiQ0D~+~ zvE0sJ4ET2BUDn!pVFuR z{)kYFgP6Y@mA%ssqdeuz1P%t-$Vst}9e^W!!=gg~K{-2ELwWrL1RSiAVb2bTBJ1Lm zTMIxJmdAVJNzKAiIm&Cglw7!w7sWkR6YDXuN%rfeAA(*R7bd?&Mf`I>`k0m}VZ`h* z-4(!iwEL+Ni@caZ!EYd$#33(th5xv5&|wr}J&t0LY3C(Ix>qZjrN5IL2Y6^r%wsy# zp0^00gdcV@{OTekjiHJT`Q%j@@yf|;HDFCC6qEn8WyN%A^pO+?rbE} zt#rr9GX?NxtJ5$GDtK9!ReIe4V$Xifdoc3WYk{V%p;&Q;N~VSn)lqr7Xb)9iqbwc; z7$%CC7KyznSabvzmL_{?SF@~YQ^B!_q>XW11O-MglhsY$OC^zRIPkOi zjOx3$TK7NL)>|c>7rQ6H!To!s^M5c-;q@d-PQ)C6kwlNO#I)p*qWIPP7-twiQ4~Al z+2T>|e^C^%k4A$Pl%nu*f0QL(N*$l#497YsMWJ!mR@=HU;PE#_;X?mvbO}mP>=bgf zdptrE3*vJRj}(RFhT~lNBSmrJeehOOV(+=Hi;qrSE6+!^52E+K=lPWVZ{cy@iNMk^ zq^g2AinD`6MT^(|cX0-lMOo(G%MV^?|Hdi)7!A}q5qAt*akQtRP+8*VDg|vj5yq1# z{)d%LnNYiL;gD!MC|zon@+eDgZ)h22Q75D_{%$*2%C;>*S31pd64eNA<9c?puO_>2 zp>YPH)t|N#DK6l#?ZlK8pRz!oqakNL1okFI`2M{(-yP>w358oERF?c>`Qg)r)ZaM8 z{z1Mk|JgzH3w!ZLqoM3^rIR?JbnJ1Zb4D|&oPN>Y<_V{Oww=05hWPqJ9%YFlPBi29 zM!l>*_u&xD#UJm(JsAyu+D<2(8Y0xBU4sZgPIZ^AO@HEyxKHxYEG#pA=Su#+sH{%= zJxn+|MOHmgT`Cu{G80AUv?AUOy}%tPA7P(k3g#?I&~+FEm2`5cO7Q4Fmn(e}zY1>M zvtakD`aRhO<*wzc>>>>cs;??8XMK6UT+Tu4k!yLbx7vxOjHXlE7Robn*%zJO@3}2S zn@jzDAMW}Ir$A)8SqsMhoy$Z({Cuw~iSgfYhN8Iu;u$D|Zd9^n*dJMP zyI(F9J3fqU#C>knD&cg}LW2AIGo;FbYTT3KDuff)k=BU&VcdPYn516dMob5*FilrHj@o8gPp8wUe5%Eq&Vk$}gOG46q~PcJ(tTM2d68}$ z;_kWM`r@kNsn4;IN%3nXuxC%-O-H^87mJUH0;s;c63maNt&!?kR$*Et$aB2o7rJCT zO91{tAmJF4@w1Mj*f^lc8KN5+QLasz#+0H~8647VO`t6D-Oh}pmm8_J1x#dsSZxR8 z=0z-Z(Re=g{Okm5lDuC0kerHd1-y>}N5}B=`GrtCny8 zTr?g%vUI1J5;5MmO>ceqn}|nqA>kp3w~^`5U7+xXX~t_(A?${Dqb!wN7$FKV9INMt zVOTP0v7d%Zy=6JmFEOiY{We?{12nyxHJseL?X>B0uR|{7yWIuRjsN-wRJmZ z3XY2daTN-VXn=WsWzvfF%>gz#&Q&E5dzE5Z=|GExW|vm(fj(t>!Vq$B1-7EJJDCjh z9sL4_dUYZz#@7Y=VH3 zUXTWB4T7k9Cn77g-DDh4A*o3`MU-d`1DxcpIp&x^-o^w{z%mvk;%@rE1M-1joE)%Cqk*zOx5&vSqDj|$W4QY1_uQ!c& zJ2u+R#p&S9wMFX2&cDKP7az#=W0|J=V>i9xX{6pA$L`*Be0C-{qUSx?yk@voFc$dV za^U~a4gZI3`2R575WOUrAr>~;DuH64Cm{RE8kze;tGd!B1?E96c?|Rur6G-H5elr5 zF$|6k*-X=RC)$mf_<|N-;;~H@y_rF=Wn_aI@+CP zIaV=};o--$4sXsn_tmA~=%+-N@-mhP--k+L5tZS3#lytor(Go|iK zW;GlY>QdNB@N*C9dHI}^5>+np%}$_*B)8-D{=AeHQJURcqAw&7-8RF}R9Xzfm{$_~ zZWb$Gn)A8*Hf{d>^ZT3K7ydtQnFSOdx?9d}(3 zYO=EN4A)Dk2e>^N$B`aaujye7^P8O4sPwux1f9aYeG(WiodMhjBv{sG5Y!N3iuMyp zToszW0Mx2i8z4%F*3+2G7)*&?a0($@ZeQf6X+&e`X1~J?jxY4ynTF?P#7=k{YXT$A zirflUrLiX@A(3zf>CQb&de6grXvg{w-5?=Lt@blhx%TXd zZqRu7MJM+QPS?PidLl@CxGe-CXo>{iyA8S>BiKy{4@5%N$CltssiL%dJpLvWffV%8J!|bt zUzQsATjmDYSeLg<6mc{`!EmAXYRYnbFf5DvB!LUHNe$atNCwkM&%aE(SpOoL6HM{Y zZ#>B!DjyfX@ws;x{=5@0TfcJfRt`4A04Eu~+fwL#Zyhr)w=BPr`6uV>iO4Lxd};-2 zb>4!hG`is+FMVu&%iHPfl~H)H<&QszPI~g6kGgeX>8eN)Fp?N?Y7?->ZG5VM ze5u{nQuKa-0%C>LWsNf|TA=D;3x`FmKD5AoUj+*qcEQE6A5k}&AgTc%C|4h>u-kV9 zC3K+;)B;yfbEu`XVd+=E{7_?oSrjtP8 zJF!#(Kr;pzrb$L{kFy@X`!`Cm@G3JMydToSHUhk?;ZYGHqCBD9>!(N+hykgxiqg@v zuozBGIppY{jYK}353iP|QxjTx<~9S+UtkhCSwf~So8uy2@>OJb9zOKG&Hu4VdoLw7 zCm^ofL|UTvhVF$@xT3`Kzv0QJ^2Yy6tU>d!%jys0y5I$rt@WtPe}6f`&z>AGJHeZ^ zgoEDjC5bCa-{y5>r?1Cj2-3~>hcikS4kY*i_=`1XXNRL(JryCWGm zxKDlT_FU9$3zU$!v^eJpSMy{(cMA)k&%t|=RC4!sG2 zG(`&CR-u#hj(!S39&ds)B4LsTH#5>p%l2vSX8v^(~45v^xf`e$1u8qN=T6C@f|dcTBrUJY0Atv(J@DT?#M+y-U!V|hcKGUTzm zv2UB^TspsBrHL;0=r$bCQxEaB&2nF)|17PWekpg(Mhxi`nQp##a9B?^@heIJ8bLHn_xv}RZ!fDXClyQm2oymcPFxQq=WQpTefoIDV z(7BX4+YnW*{8Z#o!Au@8?x(dB>AQxir?r&34c(J@xHpODOClW#9+M3>zD>0U(hvB< zJSX2e_-ait*o$Te3PzVBDB%|2Ku zdNIZ?iMTAibNu}?n)cme2=aqbunJ!*>f*R+aOn8*I^ykbpFXwc52}+S07m!sFp)bR z2p0)K2qztIrPd5mjKqR)dz~D~doH*m*$B{^An1W+PrE03yP|Z1K|(<09AI5eH@iq! z@L`WGiX{lLJ9z@VMo*cPRr7+h6&&!KJ3;sXuQ=W({8{)j=`p%VY9SEdwoo{EB|$IZ%|n+N4 F_|dIZb=RUx~rK$I^=g4f%GL^2=7v+ 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 z zXOVaNJw9uaVuD9g8(Tc_0Kf&J^hp|=g!$|=&1Q0A4YraeaKwo z-o`%rbG@S*m^j$#jNKB&AF$wXnkRN z1keImme0uPf!*gLVTs^KKRo`A1;d?WSFkc1J7NesYrU` zyi0Tr^Zr_28QdK$XSFnhC{R`@kEX?(Amy;RV;skQCa72REgvsSzek8^L?@FL!D`{iX)-Bt_fm*ciP2tye{X}~^kdQEN@U6_F@sF)-NF_0 zU=btfN~l2#t!PPBm7KS2`t-=teL^)2SARpx7~27K;PvQ_z_83smt^TJj{z_8=$F(= zC9>PmA`i~l!q3AeCr=4(IsI3ZS>`uN3P(H=ED62tZcw7+i2cXO1V+<=t~-7Q6WIO> z2#riFR++LPOBpRR`$~b7l+>II;U#~)E0lNY)xu{nko3wwmI|&p#9_i|Yc4igcHd`c z>dno033k?1FG_Q|fc~NsN%D~We%kcON`9H%VKOB%#msk81n|M{`}larA(aXJpeK)Y zxVklG>#`fz1$YSY$M%w;E|wq{rf8mZ&AAU>(;`_RosWM!GB8{xjm0$wqpOgKky znS)e(_=%hEK8~z-+;;Hn!= zT8mPz6zNZv;u4NujkYrQN)@Xj%IEE2@NJ=raQLdviM z_Y$G$ZcWQ{jI|40$|UQt+OOIgL}_jb5yZBh9q0;~U*z?W8U!=@ii!p~?97FD$0W|q zYHG)A$NP4?PpkTy!8-O{nZX|)iK$CzIjozl4EKBuPD^JQq7 zt$g=$Zi5|-Wz5kEcf1M-f`RLO=Hp&hJNarKB=7*<=Tj9HY@hExeUww2-2#11Wc;U&|nleG=d+35-?*x$}Z0Bo3rO(~pYC%bGm;6iEZaetz3jj53hn zZ+xRiwL;C>Zw?zf&MmE5B>?t!l62XBxU^AhdPBH9cH)jA0yEpAQVi5?#GebDN8J%n zLH0`5xx)>z5#z1Me);8!Xo{;svCn?$zh3LEzhf`hlD@u=tbQKb(|qT@69gHSASC`T zSKRRC>gArl8_56HKQ)uDqwPn`921*eHczLkjR0Y{n7@OfIm4e^oeP~rbduzHieg6i1 z1Y)`0+I+I^{+$FJ_fMcy_|a%A{RZ${e?sHi*b=Kk*VD7rTZ-kj*6XU%u`9pS4_S*sys_F`^e0c z2r7f-l_+@R{|J=q-n3!^C1(Mp^?0eRQf#1v-9S!6;PJkD6h-W~k;L^o1WOR1;p*5c zu3u8J!GFKv+NH+@VhKV)*cychhbnDlOG$KXljv3Kiav|S{6i3B8o!yq9VPG5{kIE?i_6RX=&G|# zE2{f$hp6+TN7W0f>Ml$Fx#BwKhy5b7!*o$QA0#z1=aeGd`1TJT&c@ksR(*D(acY=P zM!GaEy4mS8twi2AYA&DEIBG#Wj`??>#D*Uup8AsZY3tQi#rJknGn*mHUwDj@(iRsY z9Su0#xv)x*>6xyKnN{g=5A8((VK1!(*rSip=YTx$hV1|wC}p_(C5Xz?A^xU=(_x{0 z{<9IWxnC88`NZhT(Ua`X_gxAsxlTg&hyp!2ZUdF83_hmQ>rUw1-h7wbL^6nfWPUxB0(TtlO!okcrr13f-Y>n^5x`O7{+k`$rnt6gryH92 z%*zQt4ZOIkn-weNKv!#vq486aXdl1$PC2?K(&?AP?SARcU)`0_dXwmOvs+p+wl-Ey z6L5(zZerelwPGiL4V1R4vF|K?jBSdyLwXv%_s~3(%R1{hBKPb6>0AF`H0LV`KL|w; zRCX!%^7rMU&-dRyt~A}!Lssso6Q6C;sJB1LZkl;{!zf=!YHt6&O8!^TV4<9O9(gq2dgy*65B?PFftmSm16f}NV)oC1s=+zeIQ zeEBp#ia^wcwbR3n2mUDE5iOFMp9zwE6k>&E=RkK_mG~b7;Q%EiujN?lSQNkXQDN`J zN-^RJp!xQkMH(kDwqIGXSKQva{u+!JscagG9+kv!w>SswLW8gNs^WV)QEqXCm^>bJ z#vme&qKZOhb%VZaai|;LVqu*16`6y1rO5A;0XiKV^(3$XT2yiI7snJ);|tCtIyzPk ztZX1|+J@;SkG;`YDA*J0f4+ipYA=^i`SRDv;zN;C_ZvyINrSC8r1J#KlvJ4pt>8sc zn**9W==&eQ85QKkLc-Mffz!j5AH}r9Bni^g3Y^n9-fbm}&-K=w@HmJEY&@EEkB3_s z#@||VdTQp!`Ib&`)E?u}N1r4)EN}acjH8>8JEwb5m25 z>wGKiMwzwXEz|#h?7j6{l>OiJJHya14Bd?|bV&+0^w1$CD$-KYNQw;IDJddd0@5HL z(k0!3N+S)@Ai{H^*Y%A%_ObUb`?>c%oRWiGXnYw!&rwu{NjB6Df8DBJtf zocwF6HH_mHTTWr|dMHo5@@fuZV~U#44;RPp{0T};uvGu4Aez|ZGQul|#O349&_6E^ z6yHyhf-(rwByEdm)w#9N z{TS7+=UghLlCIg$%J5VO;)D_z03V5{y5@S=n(3KO(JA9 zI{iAL@5yMWXnVlwT0`}x<+oTbN^#Z%U!4zFYgDIC53GqaonH?+#Z+f}S9|h3Cuhi0 zpYh&(Z(~ubBMxu??)0K6PErjd{vrN6K4Q8(>RVs7@&rnr!eTi784k`_(|hWZ zO84o(+ud=p*4i{%ErK=c2uXX}3`R_4X11_+u=TcU{!vJL$L7&Z zm;cuLP;rCreG&H}`G2Hb0wexw{!H&*__IGzSZ^-%=;}|~8|C8k+xxiT&qP~j#5CWu z+Ht*ZpfTZn2Q)-Ul#WHR;Qf#1ak(@)R&Q(&`4A>i34KUf|s*7w7l3G3V~Sm(`7HBR(pPSk6PD0T%&E@6^9K zye~?q=euq`{gqwsyksyf$F)yuv*tMcp22h1<^p`Yc3m1aa`kHmV91gl?A|bB5c;!u z1TK_PSMr1#p8ZgTNp~@b0yAkbi1yj~;(w)FBD2fTfGBLr`bN13BmbdXR^sHz0p((G zD*#X~$(=XK<$RP5P%f78-VgtcKVzqoHDf^&0F;Y;9T0^%b$hX?_b?cx2o zT{G?Qb0=mw_fW=jdH3hqy4KDEKC0`he9mENKC2)7KH|f}gZJF6k2caZo?G629GiEH zmd4Tm5YPFf+UshB(up()-d7j1xjk1&(;s>-e^OJaU;jG8>!UnQv)g!l*d9qNX_E30 z?IO$v6Ntj}#v(uP@C$qn>=(*8K`?gZ+LLh;i(n_VLB08z)_!JT62-^=nVR)j?USo4w_&wmn3L*`aeZ0TLGNPL8dA)Dik+LwrB1X#W)*oLMv+cmb z6&E79ncEq?u0gM$8*Z?o6TulE?_vB!pS%OvEtvizDq5#gXk;<^}ZX+4F zI5OB3E#flp^WjR${UcgcFN^Gxcej6#YT}~5EM|?lC>QK7oIOZx7|7?Hx40YF8yMeo zTca!NN56^UciQ<1#SfVNP&8b0>e$c)4&`8xrL>lICPF2b3kP^smIjO5YS@|Sid766NuU*^NZ`3u zeZpD#E=Y)*J-=8()GXljRBwLIIb2kEVf?rEp!eU-B{cpuzhU_a8(sN5TPFwl*CC++4^7(mmCcSQfjK(buhP>lRb-9)oP;z5aWE=d+_6g# z#YbSGQTkgc)4XKDXRR$&P$7I)5jbB$o-+8IbhfBc`iH0XHxACDeLljOMwxul$d-Q5$BFcov z{`q@S{fgaFRumah|JSRy_KBU3*yIs7yRQ}!`5W3s<=O(GYrqhF-H&*j#Yz%RV|%aj z+I=u8JD|SYgp4Ar_k$}Uf?dJMPGXw6kA5I0D3(j;PO_-ry`I2?Nq2$HyA7sI6Qv^* zd9^?RT=wApcW^A7>lTD9W?FBj3(O$Y-|Mm}pd4mv$rEV-**dODEp%BD$ld*5wc9JT z5WgmZwYpH?04Nt#QWWdJIg4W)%Cf-sNet2-Lf5)~j!u^}84_Gg{eD|oA!7=~*m(cc zdMWfI3`HueJ34ky(S|lM0+yT|d9D!#!Hfgh5`5N4ty3xX3Ph>+phL)k!-*k@-xN0x zSXOPvpl4Zjljva9-`R>xhVhjR?Kh-INus7LT(1*QCu&>k!B4TzA5LU%m+gcO zn8$wAXADmx4R?&_>?2SVm7i@R5WvFvLWO$PKynZxG4RR}d==JQ+p|L^e)tVIN!*I1 zk?dMTqk^#N{kW$_XwJ2gfWY~eS&08J{EO}HN1s>60kZ%3tIyQDREs~vHAB!TUAir- zt7O!QuX4Eurx<&phr9}~D}>&X34@|j!G^+-Ek^tM>*LISXqP(^VJVHb37Sq;N9tU+ zzTG_fp%eY9xxbnKyTa|qhQgJPIKaQ;hW-jqt_AoPflm)Oo3e!zrzJn|ob2iKx0_FvFB zxdJv58kL}BvPpX?GS#9^tp7G-T>!!IIQjRZfBy>|nlLi}oqIP7f;Lt+3XLRAfafTP z+!hEt*h z!?JqD@Bi>G#wiS3vHcW#_m-g%(;xm0JpRL@|5xBaYCy}+y=3_N(ck{jb64VteGwxT z;4y5hMA-GA3yVNL>3+tuAc6Sa88Acef*FgHGWe*~Z|J-pc=Vlmcuv2#P2bEyupHkY zC)bIm^N@}l+=VEs9nyb$^uLu3Bp6(A%wtH28BDp9*`3R`8Ga>}5`CU&Ds}HujmBny zBitJZJj#>Dt8N~Br{wAb<@vBE0QPy@DSErj;N1HM?M2y~=+sE0)a%iIKZbIGo>O{eE$}cQ>qt zqi5`@KGzdJ&Oeu#F|)J~2t0OZYWWqA0hM>KE}lGRWa^e8ww58yXL&)FH#)-!5Pu;f z^67U>qoGCZErXenuvMIKc}7}n-vlqUb&Jw8YBXE{_Cz7;i%@#M@f_jrEDTRwg3{(l2dmYH zqNIXJFfsoW)6d4zhY}SqVt)iTO_++c zuwB~6gp-=0+Guo4#%bJaP&%;J8EPMA)N*Z-Rp%qXU2Vig@ePWL{-&$UNu2u2BK5SM zl$b*)C2TH|(FBC6wX2=!6Tb#!ML%WnN7OvX7QkPq9TQe1#~cX&;rll(0w)wO&AugA zFVronwOc2*Lg?~RxG(lY^mpwt_V+!w?`l&sUaKyk(VVqnYg7bK4E$pjLVFC`UY(Ky zxHhIXj5BtV2#i((6eba6V_?rUi|k|k5MV+@Zps-vYbMt2s_K@5l^!VQgSS} zIU+%i^8vCFe?$X5F|pyZYpoM=Dy%Q|Z(XrDhpexX&DrxTO-0D$f}W?0g%Jnb3Jva} z6qLa{kR*|y7=SSF3%ytT$%mu+Oxu<`EbsHw6NL|TJFk8BySa|QyN&t5qZmpK+A|kJN`BZ@c@?6muK!J! z;P%sU@4I+$JZKR-akf~mSU&THq2crIy13HRqG98CkR><_=rWE|SAsCL_;`f3vz5+1zTBI{p{kN!07H3? za#xs2dps_}GZ1r5D}_sFVwbv>&9A}gz00y}n2a&zpTag;RnKEt{q9syC~s?}U~kkV zp474DZ{m(B4+Rp#{5f6=$4VMLEw%FM?93QK-l4k^n`sKX@D>~7US21h~yXf#0j|u$qiPn4YQ`qW-#;5KT5Vmyfq$d6z(*D)a9LA zYDI0$Vf`Rei)!+aYrQx4wZmi9%yzyP>p){DgJ)-LBv@I|u0u-dbx)2x6i znd@d|O5A9z z?8=S$fWcM%;1YBZlUKaAOBmPoTB-9%9CRzf0;$@v6MB>C z@o#VoQiCsv9QU&IBD-i=ChU3`L%9$BEiB=l5k73#cH|TM`F6Nnc1BqWd>t zN%JX!`}Cn0!{ZW^BhQ|%d)tikhXMb`*GWrovL@%XSr(fiAC4~CE4PI=@2)O_g@>?bZ_x10cGxWc>4vtU)S|wy7L@_%w#Z&I$2F~r5I2-r7PVXY{WM3q-wJyqawNCzGZsQI5uW<19_Q^ zGutN27?}zuJA5s`p8PhPN<5%VlsTL-AD}6Wtd+uh)#-KvaZWF=UpEm|DW4TBF%4V3 z7w0{QM;%hLz5r+nwF6`-C5VRaK8vc0Aoq!rg+UAWgXY0HgZu4UT8(1jHJkQ3%7ujD=`VUxis!(aV)f=%6IWkQ;Lk{j;~0;=RZ?{>EzY6aN`W`=sk8 z@Yz8o$TCl+APsteK`P!7wfo3r%dxABMgW$BrwV#1zXY8eaQ#sA4wlrA zj81|JsrXcd(hL1Y9p9o{T8h$Th$c0qB0d_v0bGuXRsh!kTaJ3g#OB2&DkkA7m|iHK z;~~@;Tlz-;d2VVDeLn~@BOn{!Ewz&~L4Y8sswRzGr9|g*`vh36olkbP`*zSGuBO^? ziDg3|yLEh&Gq#>{HSLyBYEn#szGc4gWT=q`DnfQdrZ5nM!B^l6O)l@q^R|p+fgP!T zU8tqy?~2i?kH1Ttc-79oy`xv+3Modv_Cq48> zYC9(TMn*%sIb=;HL5GTxzwGaJ+)gz7uZW0v*akDA6=^XPcf-8>Ayh3V-32J8_*pX1WZ?@EC zMjUBQJFHh}tB-e|>Itj9O?YMW)6!nLpJzP?s42EAY=xPyA97EiFg}I5Ojq!{Pb;SC zWg$S{9)9Z6_rpdPGYR0vlg~EJjKm4UCx^ymanNS5VIvljgj|86?WQ+jN$D*d+G2Yb zIiA-b)G3i45XNZ#ae?L9+|Z8Msm zGrbyhRVjnpR(F1W9*L=|`53%v^Ks?9!-O#^Qx5b1rs z4k=MSN+AxSY7z@^Ckuw(&W7q+@RkV>5jrR_RTS3Dhg+;YFdB&RA!w=W7BPSGEnI`I z7~jft>Gob}I4+!Yv6$JS#Hv*(U}3M6s@7nV8CpwcVevSU2xmPPClJT{mvjX&SJSe* zS(@+IsjfqZnLi(LGf`l-y~vCgdh^ANoZs`U2*PpF%Vb6V3B^RN#&OAmuQ@^8+T@0h zHs0Fhjpdv)=0D~+31jphw>Whn_Xbh9r#xc8r4)MQGvmS?{0lf3`F+I0?WFlGE7<0Z z>-0_#7-JKGWj`uY?(7-_iRqw;t51~qrQyYp4MdaDw3^U+Ug2@MJ+B`>Mt_rJ*7=p@ z{=&kgj5Pg<-vIj-;hkP_6$Woq>oUHMx8vjhN`sKi>6iul9MjqOb+b1p`o znuo=~q??w6WJbof>%5OcDcB9Ue~F=g$zN>$JN8uN|7CK7=F3eL>1$Km9LU%Aw;0;E z0Y=D-2O26(a)kjahJE^m91-dv{cXiO7LKG>H>zpzJ^hm8r|M9J>H{c|n!hNK*Zw62n2soNd5i21$KmTY>}in- zND^RAA6_W~Vu&}zq`>EC|3;zhXy3FaO9Jj@gm)&uo|fi_Bi~B4T;l>&q;6~5vSPm# z%d+Nj%Rxhhh}pMJI|O#z!BzBcxAmvEfA{}=Y|_T`@g}nWwqkakW*N$@`)T|A7DHQc z!UdQ4yG=~55B2yUq;q6}`vn^tpsCA5jTR8zR3s;uB4hL;z@9p(E%5x!o{}2a|LCH8 z^0yVk7@AQGL@Q2jd*{sy6&w9jg0H*S;*JI`5^aH3uZCXLm(cL37o0Q0PvX zvm*P~(Lt35fO&&mUGi|8c(8(-OZNs4L5!O_P7VL|ZD{W}#Gg%t3=W|&VVu}*HV@w7 z8qOGW@+p1EQlF^Sb4_Z(Gv!X_7VbdNpV3g@72^UJhoIwE-f*OROXzca_x|jq9t+ zYV<>)U%AAGXzSU#(FL?4VHn`Tyu0;0FwR9GJSqBKN=OpK^*)tK2i%h?58o2Lh8WVn zErx&+7kEz!0oSv8+sSb|{dsA_#qd3%54xNbe}pX%cv#DRCF`@2#9vChR)KdiQ~wB4 zCdT5n3hDegv(FN3mqS`e`EnZ^9|2dnAxAjrT;k;iFLEeT4&>v%YBJ8JE>KFEgH;$0>6X{}7%jx~0Sz zs$$P55La_<1)J>qG*$!&F?_GcGyDEG3{w83|ISA7HIp-Wr_N<_EFaaufWKm}$vh=o z8PuT>2(=1Ff1fKS%KAY_!%Y@9c%FyPo2Co#n+A~!mRbly438b%t+P5ZF;d#E$r zlH6h<{ln_eGQf&4A$V)p)2Qc`6-Zmw$A14QNsBKWD-d0K)rdz9n~i@F*96|ds?`>0 zbC%C|u|FZcDK^~&XqLn*2xWOII;&VRj!6~-?pgUNAnZwC@U5r{*@kF~Z8Xw|r`*K5 zocB#Zj*KTW8dg~5IZs!@X;-zdvSr0!rq@|!Fca7gSwBCnX_gD8?ei?A^3Lq+qOsDI zGpJ0QdGsSS=K2_n4n|L=7_*IKTHad=Otzf`+_(gWYpEez>rNOw#@VoTq@KrAJmJqc zEkARB6qUvMfjuh`>(w%7y*k9m-ZK=UOT zJC`i!`;sj#;y6&gNgN8?ieOxZzfz`FETI-U!CjPPl{UkpYfq0vhb(~dB^Y7&%@*)` zGNCbr0yy1cZS`TgPg`XX#mvj-*G*=MdHlV2A=>sVgWF_bNd|Z%B-Y~W-`Dq<22G>2 z{lWN&NHr6#_9vqw_4KnctYKsi!Yn4_xFvbbbE$G)i)nU{Si*m}Yg*lddLqP3hO(vW zP`DEOvXo)0{h90+U|o{c(i&1M9?HdVixI(*^cHx^3v-6NqCnaj+8$m>0bGS#&+!-; z&1cW#pr%n~6y?HcHQ76fMOEl@QPrVhL6x|sQIKw~WmKF^{_Dl3a+K|8-Qpy_si@DwI6{!*Tv7Z+hpv&85=T+vM3 zRWu>GBONN%o$dT0MRA1fTJwFs!O%f+Q-(If3md)MC2-8g%eCoZcUiZXHw2`@7;t{@ zkWg+A_{?`b4F`mV+3K2?+xacp;rgn4F*CChkJP8bQY z(rlWY9y+Nz3<6_fH_c&HyG1b~z^oMxInOjR#ik9<#b zmLOz#U5>kPs-C)8nXoU@(tA`z?&Gn0q>GwGkWM~q)wDMx#50mENA9odi(d%jU1t6q ziV(lX*b#@72EO2U@quU>C*doZV(U3~;n{h8C(e)I7wpd|dIz+1QI_DB;;gOUeRdXx z3iq-cE69%*r%Jb`rpcm0nNE~6rwhFaipYSj{-=6>Ng_0ReI|7*!b6bS+JP4}aAcaD z;}<*3(m-PEJN$VH>Q(~@ZH1qJVPH*VfJm6UbaJ5NOd!XSq~;bNU0ux(V5k%P*Br=4H zSr`ji5lXk89uzWEtVdMmU@Y>(UV5_L=@m#mB6+wU$)=0t&JSA73KJo=2Oou{GDUN1 zyX_(z?l{o%R3mvNgGDz>Tsj6|Q z*W+(8$c6p!;1_@lS}PE0_P7CqX62@@Z^)o0OODfNH)PP6_tp!2`E_Yu7oYppjlyqu zU(5Wu`YfvDe}O?3D}}}ePtm~^D9Q?ykttgE@6tkMtG5|{x8=PE{)q_v@#|RbhhM^1 z;%@zr0VJxQn-WluqKc>2__v8FMpvs>^f{1K(}zw1#?RGPj3 zh>%5g;ytR1xQ_2xC!=j-Kw5}p{ihy9M+Um7M{%acC(p8H>#17y!@OxQH#Um$o{>H- zW^|7LB)zf>RM8}q4BbprP3T9Kvd{V3{zim= zdQ^LHzi3bJjYQQTjpEp-dyx5OL>|jh?q)>(w_o?C9<|@9C&fb7)`uDBRDJAL|0gYs zYf+2h=AQ67)b#(!Z2hCh!%VPMYTgsyrF=FsBT+kYHhgk;5Q% zajTGyyzqTsw#hefQex#7H%X6<-*5M=)U9-$U#eDJ=W*Hbl&?tF@wCZzi$N*zcOh;w z<(APWB?a(iAT7L3fAm*c_`U4(FGR>6i`O%>#6(i;4c5J9|3HLz&*N8Vx7{B>HR+v3 z(mkYYc=U~S&j0r7u0*Bz7~JYMD}-V+#%hlfyteg9%(!>&e;c}!bU1Q(N6!yRxVzfT zm+W$Im-(*0xT}z+#XS|GV2vMRgdB?npFM^pJ-^*K&j@b`eKR_=R`|{@CJZ>v_VW0b z#+`)yu$HS|!V=P9Ioo62fQ^P)CMz%=_$KBr= zd5mGuDM4WS)GtkCc8eZOHcaY?KQ71Pm;KIJA2x<5NoL z4w{|OMa64F_E?&dPA(UYV3VZewyX(3WUmSc%Zk2}8C=;YPS3eo)xZ1N8C zcRd>{e%Ae%q#dbow6h_RF?YI@t$MqM2LieFs{2LF43#Qw6Y;Wao9o6=CJR${MhDao z5VD~4$V(i=$3g!75J$S7c=j`6j3HGILVOH3ve^MdNGJW^rIqX(;Hyy5JyA66 zT*%{!ca3p0415GZg#JQDBaj|S5I)wz=M7|sJ%oayKdP~ni=A_Ihg5Dta(Jwtm#jzs5g8YTTp5`jPF(-J%p|ojy={t`W06-wVi@9$1?sA)I|9p zL9vFvPtXgf`ze^n%JiDX=Zjfp4^{c2739nC;+ldIDY2z`v&m7g1S2}iR;+dfXjnQ6 zRj`RHQGZ3`Vw@b^@j9bglCZApB!q4y>>F=?oQ`IV4Tw8Q>7LjVtu~V&+KUP$i8=wC z{A4C7wD2BrLGj6|^i`LkJN;r&DtP?ZVEkr8oP@XcK;x_)@3KtKy%-}*)`x9mXhgSY z?rP~}wz6>J8^zwnYzyjPwx-)OiNq?TMB71Fm!Fu}J$aR`+ASc&nY5#9Q@oT_a7~LL z^JTx2tQ9o;&}zRTX0*qM-8uLUD~m(|hJ#6td9b&k_xhgG&AI>i8=IZS| z<=?~pEz?`S^6qu-ls(O zfpTY)j89mUr52&sDztijQCPDFkMgX=;^9acOF90zw_4(#px|~;OO#a`ck4CC&Y@bV zUyTe8-+#!Z1rLn9&pZ_`JnY|%_vT!U0y-Tr=+Sog8fmhGU_c*=Iax_#0Vb-LLExm2 z2sC2Ey4oH2Ub$qRELlljSt?tk~|3e|UPAG~_m2YfI6=g1oWF=>yp4u!-d<^c8OcwzlGrj#(# zEYb;18Fve*t}%xFQ?0f60guNLyyo3G4?lt(NaP6fK0%a_&l1%3LzcVHe?2=> zXXbUj$_6b-&4R8_DCH7PKubse3zAxW3Ja`lsaoj`uXe>r3OTK@&MZAE( zlK3Xou6k?Al&Drw;?Yz>q9qujEm^q>F2lRf$7YJ|{z&3-+;aCIKV z=-J~~U?%9~vo+U+!L0p%V6kr0mGZCa@kqqxKF?WeMUkLbuE8Dme^FN}FGaarS5seH zc*xxU!~O)?Y!u-|sM-Bic!WUQ9@j)^kw@m}sz z{30Ouq1PWH8H(CEi55QMC0yOXc*OflyFW4i>^O`=NlSbpa5C}u%iWVi4T&`KA;V?9 z2UnIS34o;93)TFXu>9p?-mi;0=UzZ{j4{mmUQ7u~eJF*cn(&!zBvasW>Wv`E_3kYoroUckhQ#$-M5m z`f=CvL%GR8anIp3=NTFKRS(S}Hr-dwDygbVSm?cMZtaJBe(yh7 ztVe%Xtbl3aJ+hTxzR^VmiOOt#{2+>NPBb*iNj<0;tp|!hW;IUZ9TaIYj6S3*VZ_Bq zLOmIOy9UfSC{-)2K9N$kXV!k$k7(9icr1&U`E^|gOZ5$lWuM0x$ox?+07-{3U(sz{ zQ>lTK(ZBe^VioJ&uvoW(;mEi(oN9TN-z?U^cYwvB`isRn38hDE1FLEY_2zsgU0+))l~F{dE0{#d;aD_zxDVsQzyjD_9+iWfowuUj8Q* z%bS!p9$>L{7^b<=MqjqCxjNB)W8&T%TlTa8RVT#%oT5O;Gny&L*>3EfY291PLLcJW%PgmLieMX z$1;Z#SnU#|#RYn|!Lv997%sug4`nE|$YAv%dC;SvMUdvS$J7PfSp2|sO&>$-~ z;H-KSEh@lDA1XbNjl~ufApHGoFA|cQ;oWORVX(gs!fjA2**)WCRh*YA)5hdScF?b6 zVTH$X&mBN}NK9ZM(!Hn{2vKrBEe^MOb7+kFx;cfVb(d+xc7r?j+v{+%aDObMQ^tWr zDpYhT^wr1G`sW`uvX@dj;l0`4JKRl}SV1U55g3^wOIOcD1s10w6ZE-1k?UNvu#v10evom;RYqF+?&>?oSTV= zIko~p+}}(IH~Wg5k#kP`fBd=FnPL*ra)^vwcUEZh!5=PANDHe!+1f zret0HG|hD){j0MKSJV)}p10~-tP^^2NCePi$47wAPa;0@weO*V5HHYS$ab#VA>eI^ z1>e4QkP!?pF=?0F1lkdt#>4~&pI6G1gT$U$kf=EYhHuv+5q)zcnMu>D?DDx4pPpzO zrq5lji4DIW^0-MuFTW!QB?_ofJlQW42>p6(#42~_-z+A6yb`G5&E_SOiB4xDoKD6X zU{=BvS6Gv)Z1pkdyNCB_byKnM;9=kEXKJuef}7{nUp%=}Izqv>|< zr}b2Lgg$GfSWT18sb5q-@Ce_iemrN~yke>gM#1S>S+fqa4tfNk7T@%DMX73D3TX7sKM1eJ<3d~y-B7u}(yJ!LE ziix+LfO!E?Aof`xLX0AoEJ)rkNZ$nq0t--t6LYx}KS~i%@ub^kq}Oa9{-hI3Cu8T5 zi-8?1Cl&8UN(_A{#*{;bm`Q=Tumhu9(1#<0>PXq+eY#&kw59b#h7Cc*z>d)Zd$5P- z6Mwc(9T;i+pe4`?0m0A?l3?kaz=psu1@fFQ&l#e^YPxvC@O%+Z!fX-~!@s5C@2vQL z!%orv4RB8XW@W%1B6K7Idb`k}{dq%SK#V^LH8moV`Gpi(+x1c?@}aG3M60jIO;+4^ zdkEm=im3cQ*Vsj!;Zpml`(*2vuk9}4J!qR{^8>WPZnboKt;DM}1iOCx8{R|&HOw&HQd=zyIfHbw8K-&yg^R(u@} z5kpV|2Rl-w+wgnFUt94T-&4b2ojtE#{KocmrfznMymN$O6dTRJH(kA`2gW6Tc8a3V z{eZ3bC^Y0|@vYDI$TVI&B;_o@bH1KlVyd|5>ZvgW-*ojh?NXgfK5xF$hpOHfaa-&x z{US|Mw~x}!ORC2eRCj9O8UcSBaUrS{5=%OFkpDVc+0FH?exyieruoeFWlXJh8}pFV zxp4`T!8qohuAY;J^<>q42X-Is4LJAjS@Eg+pd{1qoNC|UCWOCV^k#bKZPkDSnc$~S zAqau#(!-&gn8RYpRA72&_+~49w0Abt?R_Jz{BEN--`6r=dZ^kiSVt%?1$R&)Ls<6q z@8u!nW$nA)%R`q-M*E-9pC>}UNPSTE7_B|?t*_cbUQ>J$-kuN3PhRQsqgwg9_xely9zd~c-U0d?%>+MAVurEm9~KD(9; z{499agmJmwhmk9BaBFx_((rk1-rJ6VyL-9ftNHR($31$(zfKqM*nH1cQXE?f*0YQs z@_c&pj*Y9PY52+I!4_5Q>9LZq*A>Zp_eZOSpN~^$Z-cgR_|@gaRX&eYeuP96%inSV zc8ZW~xJFJabJ!t>tkD)cUS;|(RH<0kDbYmU8{%}V3{z^ovZr*zx4`z<_`o$sV74+O z=_2&dsTTm}Mi|e2F2-J02xP{R{?N6I%!WDNChg)OQfBrwU0HFC^|r}F-LX&|&lDqZ z|H8{ElhJ?Dkeb+4oR6~DCK8Zdj`s}Xk0$1LCDBchxZb8MX4}LPx1TL91N+&0X zkrp}`|GGVCo43#;!k z`Reh{jO$Y!jg3|J2Xm{L$g((6%hcB?Fj&F@*k^2}->*REyzgUZVi0FnRaU(-0~`D0 z5lvgH=hMHDFE#4UPHAp51AX@|vA89upI(|vEB_;ikao1U)P)3%mS4tYLWb8AI~#vh zU}y7kgMH}wOpO}ZfF^pS(mI>AP-3zO!bxuj7p(Nq8Xy9Mw@3BAqCn`zRJ;ZW-U%^l z!c=RFN{>Wek-M$~`Vgl0EUEo#?M$EyBsGZ8I-AhtsIJ*0zDN83g3FL)1{x%IjqVmy zTlKjzMp`bIP*K3&nU=hTfT_*tG?D~%&UY7$K3KY2hA_XEqzwxI)wY!r^W)?g(2Ny) zY7f476qB1-(%_08pm3QQay}d)e*_EQCwcpNlFGtDq>5C`D}853kVr)-(42YYLN4t^ zDmqDNHsLI}I47A5R$$yiY<~OPKH6?F!e)68ntd4aW|orldWHUT3+rwnT?AUQFA)SE zbPXn^?)O=f3ss)UrLS7eekGN&xNB%gcLBqq(-K(n%(<_N2E)!UWd(dT1nVP**bFXT zC?InQ+ead=jm|>Ay^NziB4ZLq@lnd$qH;pC?Fizhtl}>WDRae?q&R)8u}*;5bL#~C zA=B7LXKt@ZJLws+bqSw$np2GQS91-=e{QiM7tbXRW*#lUt`K=znfeu|G>a z1-GbgasdP+Oa3ynU%ZoP*G)6{^KMLi^LO<<@4279!8xk2&(BZua&Mi~YZP%grEs$? zU`*S*@o?V>y7N$|>vQ;S7@iOQ}QW8lyz_K!4#?|YRTSR4l`6VR?njd3Nl zoZ-%sK{J%dPT?z7;*sWCM0;N__@UaCi5Z%XjAz4l53Es6cT@o2&Q0my3+#)e<`O@^ z+qE8QObKts`0QfT`n^p$@>%D07M$tPIH`IC-$1i@|5;n`OX0iMw`kTqze`pe)epbj zeKy?m?X-N4yBdy{X(cqT-M*$k*usj5eY~g;;4j5R-*$f;Y|hr=`4YZRKaylR`O4y~ z-$%N@HdK50E@1+?WJ_xjXH1m8r(k%+DOqYSQuZw>nW9JLa>RnkMpW~x?sA4Qk^U@$Q&@VNdhe}ntSblV~ z4DY2+lqWBJnp}VFe^lO$R?c$EY7$-8Q!ZQHBMMTz_1Dw^1Ox$b{|_5!`ah`M|Ibi6 zyuA<9UK0Mo*Li_^AANx>rdIUFD>tj(+r*x@|Co9FkMb$ESQZZXLS0pFmEr5yf2>0t z)xQV5+`T)G{Z_X;wi|LdR8sd-UA*-G7;TpIuzNU)bhL0Cn;bJ4Y%AsLag!I~{?tE# zBP`H5d^8hTTRn!)h$Yz*^MEz5&NR0gfqecbUBbb!uV2WjhgB0m?MOTlRsTlqL~l^L z@zFpU8-TK7-*8`!YwGm;FXfYn@p2?0Eb*pyz#^^*PYJUCj zd-a=w@P@K`;_KMi+ahV-|FO32!T8;eqe4y}ZyiszKG;i@te97*IR)esF!NXqPG@r}yb9rruihY9 zejxa~*8`HM{J(XJ60zmvMX+$>Qd#D-dcg}Q47PA-gv~yR+XlU$D((T^69w}!L^QoU zr8F*1;^tEfdWX^>FuG1~Sebb&mkbTtgM<#!o8cv-MF%MyhG>+3oJO1v$05)1<#*wE zb(Fi#i9>zApw~+#Xg0!dtyB0RM6t%rtcf=Kl@6SRzEe_}yBQ^KcDYO&UrHdP7mz`r zb`XBomq5h0kElDGm_}}!-#6m|3>XN)2$QSMdZ8QFqNa{Syb-B zgv}D8k(?a@JN=4Q3QPa_!Oz85GB2dVhiX ze9~RrLg4T{*&9KR&~K;!^SY#P)%Y$%aTi&ZBNoW@*u&)*hJ(|r402Ovzl8)q`rf+H zEr0z%j!CyF{LWjb7P_IvUcB`*Qn^QlPz*SRO{%h|e#A7qBqhvAKeKDMHa-o02>Tet zvA^#93WmA-1fn{+dZ^=%M#9)2ph5`>;`@>c0y>t^wSDBvIrx}heq%;pYcMd~q!HoC z#|T2{v;;&*qDC{pl>Xo&NGY{wDTJwlzq31=lA-k_i0lB&XZ(;-^&CNYL5by?mO<`b zV+E5<#Z1ByN)jYRc|g|pl0P#e-PV_J)rwLA-t>YX+h^CZdKPGuN2XBHx&01G8Gp3$ z+>EE#DD@Xre1tvxAkw@d;r4x*=sp=0CM#1APp?3xl11!PRy$VTNKg7x>mbz13@hab z$RQ+vv|)7_`gls|1fAgBA8M>EJmi2Dnt6^3LG;`SECK+sUxrb-y(LIeu9wfJ zs7ME0WCpC%;OiRI`qQxCA+kyUbF<(JQ~pd(N{lV$Ow3N_yzxyS&-eA->=@tGiWG0M5a{f#gg={x-;jMHvEACxn!Nd80CdhJhlUfgJIV#2Ny< zOx+}lh@Uvo-i4Da?4!%|5~T|NbtF<6F8|roge4(JsfgPM28DoqWCET8&62xq7=~do z?pjz76MF?0^IshSso5dim2OkjBKBcauAw(H+kUXW-a1TC+sSJt)Tu3)SldzL@6#{8 zMIaPd>eTqZSnBls*S#wxpA*RlTIH&|zC`%F-}e^#ym-y~GnAbkNu@)#z7B|j*oJ_6 zi@0j=(Ae{X$1N{f9WBQQTeVCYd%A{lj0+l8*E+FGw#|IS#h!J*ZscWA?k zK@Z{{%m950>8J!4+oKN_8^sV`n6XiSQh4&M^>-QXD+##BCBN$wD!k{MCjK_?z9{|0 zH&{1G1JtFj3-@?2LzMS_(e>7EQN4k;_6$P|F+FrRlr+*EGjz8|sgweWNGc%e3?W0$ zP}1EYDWxDK9RmVVB3=4H5RouAp7TBL`R)A|_O`*NKq6GB{z7IPWPDl&C!W>0^9$34qxmiCg z6uzFeKO^oJ*S#XUa82jKVV?3E*l=dz#5+x+$A*7&pgIjVH=tT);AR>b;3EMi<8dW2 z<-wnuuAd3MOoyLXKD|`{gm94~5^+o2LX^jJ2*p9xgD{k3_$DdBJpAvhXR+Raz>9UG zQVE?ktwL^=m)9>!9#i~i2pj9zCj6u6cyOWi24L`QF-#KFonmK!acCte)2ooj)K^WU z0m)6v5uc-d?liNgJfO-nHJ~-6w~PRtHI-s-uI%pQ&oR{tnSqdK4jHNiWs&=R8UC(Nm(DLihoB_`RHK~%~nTp=B}@*b^Z=? zGfCqL3VqKa)l}~NHOC1z*Ps+=;F#j9nUk3Lgh=Of6;;%uRh^5#8v(exMnRJ^-;gDq z#u!etmrYjUI7R&~&)uJ7le%#$byHP|(||RlHS=j=sd4g{sQl%h_gvOb#!^Q?N+057 zhr>*5ln28KEnRQQmJCSW0NoK<3wS8-{ceQc_6nc@YNM=OwEW?wR@f8j8_F!&H0!KC z*aOYK;Kw|W!lYt-h~HSX*c!&J7$0#epLb4HdFtq@Wsz! zI^RV5Qj@3hdzlvu!f?{>5@VU7ywLT{oKWGzdq^jGJAn_HFG$6rXK<@WXZpQJQ9+(! zL;}5ivetVx-{%O&LZdY4$B9o zIWfrM-F{JrqgcDKqW>Xv{$JL28{!62H*>8g4ae+mtimhl1mD17&NViD<$s=f{}MNj z|AGhQcuEqeq&EOR3=Fgu8%V?w{wpYUeN7e}a;O}b7c#9MVG9%goRa#u*hYC17L zb>oUIyAd{hI+gm!9cPniWP!AVJ!^}&;u;d|umVhP8Y`8!A2aGS?fXK3t^om@70TqbICPHk;k_9<4Pj)b6gdn<3nuF9j3UU8dAzPx5nZ!mP=a7JFN14&Xiw!;Dt+;#_KNsD56@}GlaNWC-C%_m~$Ig)AQLx{C2@aNa^4L@4;XB zTrW2;6}6+MnyZHjAV6(Z*dNZeG95wuS`Lx=bR=TO+zFhvq59@=)s1GBlDcPtU}x6v zlq3$VYLF83ts7PI1M9Cbi4VN_EI1YhkR^@L8R7=0Lc4bgz3|^}zq-*_Exht!X`-$C zYJ}okm~l{ONMwt2pgW{YUuw0yZVjrr|G?N`hOZxH{Rj1sPG)%p%Gy+X=Rd!v_nnp% zZnWCFQ+t4=Nelb$YeF$Pj{I80gV2wdl|MeX-ldy|$*pfe1=@k}_o|Px6yJVhzJ^;? zT{*UTjQQDFhyAX4`Rk+^JL}Z%Q4m(*b`$ zeD-Y}OvkFE!f_flna6jz5p+GfYjy<(v3uKs723HgI#0A=)Uxl~a% zoo-M9Ed3=6L`$Kt_s6tztqYgWmc7|F-z<{B_O6D`C@554X%@R*O0uuk&}&JM?_}`$ zvQ_W?C@?kq!2@Z!?4iT)QT(;4dlk(cO9tE8?PPH;o?oG?!hOb%-+kJ4T{?qai85>c zw!RnP87f<$^wWCo=@$;>0;UTk7P9rrmk-W%#&=joyrXkp{t{i5TYe_ReQ3MEY8Ewj z=U`GFGLC*X;5c@2SrF_2H)9iJh+3iB3$mU7`d?C9;bM1-JobUkAaic1Dv|EjvRz2+?i?x6e3b#u zI57M3oAG&9JD9m8k&j19KL73mE#xOMB!b@Wi>3b1r^!=B>2rxnzKdJF>FQ z2cr33UNUoWarCEf<3%r5#NPyq&C6E^;f_S4d7yEDkA6(4M=+vjCd@VahWc}>D<~UM zm%tJ+w6;nOuvonL^I;wHn!f9oacA|jONg=&lcnVZ*KNV*{GsWX-@i@yHTk=Q8uNrC z6a}qUVvOF|U4E%c`W-yB4Rg4qW`m!EfBWlrij|}L^{~Qs{f=he&EtrY;%jMZs*wn2 z3$#K1naEMd6$1Q3A0N8LqD;p|Sa(MCJT2Cyd zz}rHHbUH$3@B#%$6)^aEzbDG&VQ`@jpD=T(A5?@GLFWRK$$*OpD;~@QJK2PN)_N=- z9LWHTu#N`P$#W{m>8Q`&PG$-H-4kSxfvi=4XtL=&!#)g`!{4y+CT{s8Zwnnij#@6g zDbR-A*XOV(RQ;<57a6>2jqnL21Vv)JMpE&)h$v5CMD}B6s`tJsLKaV6vN{O*n(rb> zh0i}<-nd`+@r6kbBjhYvZtanW9eR3;Ufh#kUkDbrt3z&jA=?^7?H;44!(J{6Unj*F z_b`?j=$#ZWSFJs-5Y_=9E=$H_6 zoDJgn=Ho*VitE0x0XCL7l!Apczl09c;?R{PBCD2Of(Sx^0=PyYL$}yie1lmxk6_sW zcb*Xwg~-q*1mjRId)1*TPfD;|D%MTWR{NrSjP~0`!PRk4_!kdvDk~1 z`Ch#UV2xB_78qcc*i?}WCbPQnKRAw4YIs!4k}N>4!!F1CzJ(lI$lznZcFoXT_;Mln z^Y_HZ(wtM;Yy*8MD$1!k_NjWA2=Pi*1t1%9NGcz1s+qFlLJ#9dQasLufkI-N3r@xG zku3ii;lXLzF0kS?zSrIClif*Gg~`^u>9-A^8AL)JTXGn-GuPcf-)RusDnL=}(17!F zJ!P_zCA0ox=qX%e#f~uQpMv#+`76U^r(c?p$&-alLG&4dkviW=87?kq(nqQ%m@Bd| znGQeHOvx#?(M&%vg7L%XkC+UTLaKQZAeJijV&sed(K| zJtb(`9o^E7JUM*%n4CIbh|bndq3ubJ$Yi;-hXx8{S+7A}x912;=U88oC655v8-58O z-}EP5Zt3)ScY$oR=jh}Z6koB&b>X}Nd#x_#)C`X-=NX|NtLf*;$RED2IRGQo5oDVl zEpuYK3u60>P0|%AkX^%q9MH~dfz(I2MpLOV$b4-A^h1SiMM$AhQ)Xxni}Cl2!Hir@ zm)z@-^q@l+!@Z(@woI+Ye9OHe9T&YRuVRTKve}gIOeU*SPo_O}5stS6%Ypt(fq)tE zAv0)M8Q3|6(Zf(rhMoCrp+p=9Q!_#{a-duobWT_EEf5@9l)PIGXwQ)ZOF~I@WrHR6K9hz1~yxXra;+kz|g8jrc*FfYnNc z9L#$;I0R=72kNrEqLD%Gc=fTYRgoY8*At7RP-+AUIqXH5_g1To3v1q2RmcsaFw*(X z5wK_@_$~<+;lTdSQt8oCEgM>Cg@gU1#F_hXnPk;!^WuM6$nMvdYD#0T+gCo^U=de_ z{ar*FyVhD0YJXJ8l^#`nfy2HO2ycq28v{w2`$)bI5Zw;6iVD1=3cbRBZqBT?T1)7^ zP`%(lEgP~J5ukbYNViy&NHc9GUJmr8SefDztzytF~GfGCvhV zvA1(}(WCi$QF8Xhnt@z~h}RMgOfl7M!G%!D2qI{qL8O6`H>6QX3iR42+*iQrss{eAED>Vl^8Pl zl!V#pZgQpV=vS#UU2B=*)WKY~Hl25%bKf8bw4aGu&{X{D%q=WlT79dHdn?LYFVp;5 z*G2TJ7+Jy?xo_buWyw*ksyFHTMyRm;{0mxTvlCv3Qb!`^3m7a#Q7YBKsqD=t?RUCU zobyk*DSkC)77`3<$UsClQo7Axjv7?J^kuZ?4=$71ujcy~gvMI0+pog*`@QI6^nzuM zksrf1LXY^^6_GfYo)Ubpij?09Nn?B~fb0E4)sOSL#?R58OBM^wMx-KOWWJoLxIT`C zo~NJzX_p?khF%+|C~(g!F+!&|uuTNl=fO3|KyJ9f-jjZTx*Tt!)Yw0f0TnRBRdHo7Wv{JEbdDtcD_W@+dNMPy^ zmsS-%f^bw#NV=3?X2G{8^NF3BfB8{S!cexWVNw2!%`c ze-8{d3DNtA_{f1k0^Ba_B}pl;0nrxwO4)R#!uMXYVU2oexU{thuozW zZe&akYV;4hqA23*PY?ht!q&t>bqoGGn19Ox%4qm1ymJ+n&cpB&>4)n64u^eqerMiZ z$Np+fUT>YVVTHzzQf$hm53J+zTNRcJj1pU5rhg@a=;N}Q++UIZYg-?`+*ZiJ zeh%|iRn*kj>^E3?y6#JWOmJtswoGlD|4-*DS*GnNqAqDwzw}2<*4O6I z#hyrE!0fvUdK>VenkZH{)Ni~5QG>tm(TddA zziBhWccl9G7EBAessD$gb2aup0_Nif*9L-$ImT^@Ib&WyNCI3lA=8S(RpwBNkcunAfMq`V{h2*H$ba!xyG;9I|fneUGTbF zS5_0fY5V8+dA}F|cj*y|6b|jeo_|@iZd@44{$YrkLxE%CChZiX7T-RNB(JlU$A{ z`H*AAFx0o+mk!+hr-vlvNW`ubcCrfH;5UslXI-&l09nwymDT%nA?^AW?j{}0_-V6M zTtNE@d*j6EMcgE{pBB z=j$r}A$EMZq#wGeNONjUYvtB+cC0cM`law(=^Ro5d=b7NBVesQNZ!l~s3mmIcSGy( zIekOvF_u3i8LEB^2*JyJCPC1eE9+_sCGX&Wy=MLL;QE({H8Bii#o`-Qj)KO(g~Ns* z(p0d5r4`S8Syhy1Ci&*b30FhC8|Z{!dMFqPlCwAmNMl#KfoR%&{tOG3UMWzBM5GeM zIgiLJajQSWazihXTm2a|yVa(C*x6hq3Y>uH0`BSEs=0CPwniYBF7?UzRGxbH5pqC) zP4=pKDC0Q&a;Ej3RT*a-M6HALqPv2x6QQH;j+rFxWIdzdwEb$=XyU;z7JcnXk27dH zO>lSmMji0`s;JZG(bw*3&}1!V{po>oFP(G;z}Oqp;;kXQ-6I0`bQwvLxD8cpFLM58 zwA(pW!!r+sov0j?zGU@Uoi1ZdAB(13y}S7OlKH3LS??;|8)T~^$4@HN8f5PqYsqyw z_urD8!i|l#SAI;Iw0p`~FZsi6e5}*acFxh6nQxP>%61O9ei(WE+F#p0H~)rRI9D=8 zmd0Y7=cr5douV}fR06x4_e~Ie=kAwCiTTYf3Yq2 z4t|}M;Xv>#yrj{H`Aa6Ghq?)MSad&+)8Y+-ShB~MG_F^tK&aL|pkRm=ESMcI;Y1{Q zxte&k+_}};WU6_Y^DsC0#fOKOk8&3Sm(875!|1a#l)ob^u;UGPF-MXeaz#$-($c)k zdRpQdhWdi9#if`zgj%#EL{mq(aYe>9GFvh9f@B#9=BC$dj22D$WGmV%?=JffT(4gI z2?TtlHG0u{hxI~ljxc~I=kf}8udr0Q8&*5{+F!h8EOKR2nCDe+c^rY=LKtr;GypY23kL4_kr(_)csV-4OZVfU-xfP~V_!My%CPDWRXc zdgCp6$-u23=x&EsxzH`T(GcEb{ma}ZdCbDOH|V~f3kE*>#K94XdDh|GH0jf{u>=2p zT6TM!8{k!Sz`Q$?{la9oy;AJrZeH!@-_35#bV6?rlXhmUFpkmt4oa_}kL*jTW`W95 zeb)xnj<>GX%xn77Jo@iA>Z|?2a1`;Dd2Z*|(Bu5#-8r>K3m)YrIW@R0y82A#Tcm;z zhM&8`Lta8%!5de&3ex*ec(XB2zariiciKCKj%MORzh`ZR%6J|jEV z8C$2fope1t{rs>i`!_9{PgyP>|J|n{RBFuS`?!7D4C?0Br_2<5#Ky~re+1kItMrcs zsDPF^2;}LOTU77R--!JvqT70N0Q@R2?Z>wGJk16S^$UvT!t;MoxBQrgtydIBN zyJ2Wzt{q87#h7!s^D$RS1O!U*Z+9>92`U@D_~eF(8ATcN8yK2BYBZIKH4rEaNL;9= zq?G?=Kv`C%Is`^M>;q*`Y?X~2tSZgpb`3c1w;SJ@exXO-GoUFa1CCnlOYPLTD?`r@ zv+CO9ImZkhrYf7>lZ+Dfylh@hs%kg&QJ^7zqV`aFuWaUzgueU*bXT5jHzVhO9)6AV zP`f1HvHY?9-#6}KlWxn6SJ;RIo6q!ZRH(;XsV;cET7>+c&hX8XDHhe^sMyd)VL z>MNVVgW8T&=GttofM+BDlx1rca5)e#Z5M@&bw+qWU!dk=GPtY<%_o3;$fRp(H z+VI%x1>u-P-LIE7XhRW!HtC}JB0BDwwn>4azL+GgBo*!svT@BHdZd{Lyd+yt~hp#dSaB}bux(IIENGO;sGCS$V7X3oa zPAJ?KKI^7i+ywr2k=Q;a{V$n6EI;z;rjlU;D?7>BlPm^#%(%g9!98jIV_sK1UmsMM z90Jj#0>0UsW!~!lLTDx|6?G*8eoOY2rY;tP0TbvgELO{))QQe6+sf2pk&zZVp`XXU zg~5xY34!mV0HOMNIdvl#-OcjGxX}Qf{ zNhRB#`rCdmd#k%3oA5QfdLtnKRLC`SE^qIfOPU$dPMgody zEso#eT9^QW?O~BD$ga%2``y*E)-m;7&y_eK_ zmyS`{B1X<;XOLW8QhC~|RNMUMR%#u@{JW-a)UC@JpbCZPZykJJ<*N46#aSM>^ zFeKyVJg&+^E4Ax(uBa^6u zQ02fhLym!(SMIjDp8pK6^b4mXmv6nns!Pgs*1Pk@YrpLDR?sU~b=J*~39ytp^djrQ zd_r``ZP@dp(e@zB-dSAw;B7=uhTBTOJJprk{GvZ8rI*-;v44#bnoDnbLOPVQHRJJs zpyO*mxg0fPAj6wX&hDJhj^+=X&9f*N8ZR^QhIA08v;@8eB>^#Q4vU%KDPprC@6BDIuDTOsHOJ z5{(xUMA5}}J~-D3Kg6pqHDUJD2=f5d-_VcQuP`3BzBRosDtY!~=P>f2MuwrW*9(su9 zV?r`|YKd6_6ngM1TzDH0`e_DTAmwenGx`P_-fve&umoa;2NI+JAU3@7nB=Yg_&?SP z^fN57Oh^XDxZH~OjTzAaXdzB3;)*qb9SgY61@IQYGcMpk$0+4Ejc^QrrvAWB$rSPU;F9F0&BV|eygqemMvZJZ zv1-8x2;F^^_LfBMCkDGq<%!49v<(3d4KLuzI$Yoi6EM+)SnHi~wHgwtq;3J0#>eSw zV}QGk;JRjbl?|f$D^Y0FKvYDsxFp_FtKx2hWVsU*TF^j4GGNYpBfbj^$B)Kibr*+5 zVk-v8)C4uq*td!y=3#8FlDZc}yQ zuNLkm50oSo{vH`rL(pwdQv^)oi29fHC6HyRnEU+$HuuN-yoSjb&L__OKKmN4os47X zO*Pj>-kgoc36CkgDcspCEuB^f$IIl26$j6lGFO@xkm#Md9hAL5Ll@tFTMdLvhRX>St$YZ@nD@yE+VhU>$0 zwI)Og1#+GE{0kn=Z27l_=ua7K4DPwrsMwgQMuzt{fLjbrhC^)r!OO<)GwFdW0Nh(s z3Eg_n-|8^a>y>c<{+n*)-x`PoTir5B7)O`K|AL28@FJztgbEF&f@$$wtKT-n-#>^F zHyMD=vCD2KnVUqBe}4dH@s|u004CoL*Fhh8;MN2Rpx}5Kcxa{gdO9-LI(%qSDS@b1 z+o;+}Dx5b^!M^bcW#<2vgep;m8&D+%&j5)tqzaq33>yN40GuZP!Bl1^HWqhc&A5ri z4^jlAW}}>K2yHXQ^5Oh!RM*&u+?d&hd4m3f>o&TxiInR%Ynk-<8H>&ugD|mjqNod} z(qg5W*u@^Q?>llvg8v!E&Qx^fp+ae!Z5cVi>kYjtXZ(WaTrW_{PngQp>XoOHV4X#D zP^~!2e_#csxS%^%<)!m|W9bHc%YV{$0>SS*(1|9+Wyu-whb1u14k^D2e)n0fCs~nv zN+N8Qb`z=dWy*7xJ8j`&L(t9a`GogeIrA_0uoeE8*saa^WC>=&Y^EFV@VmGsqWr>3 z2)l|im3rht7KDAGF*?whDw2aP`Sn8nA5ueY&Uumji}g2gnIr{s4E6SuT*GxoELpCILg!Zia-q-_IxKah zp$mhkIT{__Y%PgSMOzBXep|j;$C0LEKZSVOem zeAI*bo0qqc%c9b?pG^_3&Xz|2Jyu68-V)4KSuflxK6?2tZq)+{o+MUK=D9BVMML6z zPf$;Y(O&Z}g25~IzV~2a$j0Ka8)>k|CyA4d$skqfrD14Th~s_X+pjxyPEVk2I*1;b z50NC(^C8K%vL77Bn4iF-{V=!O!y8AvQxsF`C%tbrDy;y1CO-LxeLP92nD2l?G6Uvs z`5`Tpj{yZG38kUYaffvf{Ch^}hBzh5ULrZW1PK^puk&1W=ul3fUh3^`Sk{i-yq;)l zLp-QjZNSX?W={a|AGe5WajTIF8MhMUUGZGRcDI<{5XP)dlG=y%t6fatvxeOF*Na!z zFW)FhORq=-w~74RGAZJm*ZU53I|eL^#}E51aQ4Ll0du|Zv2PZ&T!y@0$(c@G?WBU3 zu3F;HW@7us3wEE_d1LZ{o79W1;K*Rtddw&jn+0|c|Ha*%(UGnJb!SPKetr$0uYpLf zk4UP}UKG~hjG!dh@wc_{1kyy$Nu#B`|yPev3?C>XjWC24>YU& zT1&jk15jgmTYg;zJzuA7yDdgbZ~r>E)_96kASGOUcZ5hE{s{n6+Toj(gamKdFY^f1 z66FTcxiec2jI78N>-Bci4QNejl{6kKp>k6ol$QSU`*bdP-tabjG83+R4R9I8g@0n9 zcS$NfKl5k?Ktkp>oc6j_7d;Z^W!e8!Kg*M_onSZk4M@8x#D0iB>QMg5Uq5NnCu&8c zI{a7{JVEb?=fE$cmG72zua;tF9z-(>E<_6npQ_($+ z3`HBB1w+v*{rH4i3}8;YN6IFe&=BvedzrOgT8{`^O$vytC%?FZ^fc-5GHhgtGkugV z(=GqR49o%tR#zyf#7CUo9RA~@F&F+g6^zs?CZ_XQA5(pa~gPlLbZ0w<0TqP`sia|$P^7SD?}l9wHBPJWbK}U zyH?)(7mD^7RI6hW5z2dhcSrHzD-^m;QyM_Kx(Zt#(K=1}w(+AEuj@~t`*^oJ;@`23 zv-puZB(I5a@kxOl235;Qo8L}!qPup~+tC|lA`JS`bEZa=H6>tA==gu`ID#2#lWwvQ zahpNmRT{9@6CGVlujKI5U{k6?L#XG^#=|<$Xt+3D7bIoM#0{Xr0Bl)LEPJkLEFWI5 zDPt9Xev<-F&szR0fkoF)oaM})=mY54>Vn=eUZM|!Xe3&OLW3He1Bn$ATeb*q9Xtb3 zSyW`~+O>E^3o3T_hx`3Mtq9Q}26Ue$P9F&XiGxfPHu(5fCTcr#X0P{gOu<%$V`1Gt z94@|bUnbgoB0e(-+AcUFI0GKGFs0^L4mp|fUr$u5&k{%`!g@Sr#5GTeV?m*szpK;w0vPMw=fh}adm_P4 zbL4yom~+y6ND}3IelLVz_jGphG3lfErRqmdj(~43+n&~Uhb3ZzdTz(M&7H4)E4{&g zY$mf4cZD(5hfvKFNBc=N7dR_O=3UgjN9+}D;(^S? z`j5Yac}s!;e)t_zjCe5j>nSb>l9PrAq-A0f_VmSv6Bv*frQO3d017T-Rby}z@lQ)< z;@uA>Zvc?AX}+>Aj|4_iMQ=2E?|l~>%aGx|r$j8m5HeM+YhguJg(&I3M-$W>sauqA zB&~DBUaIg+43oIdIB`vMF2=6Owq|(Mxij?oV6w#hxm9ww*N40WWdUMZi@(Hvf!*oB z@>_|IQ0Hpa?Zk*@Q_wx*)Njt0%`Z?lOll6UZ4Ny*%}R}*&gmMF60t6+d5GPbOxO32 zE6*(54KKg$f0cW7>E2An_42Ft76m%yUp+oP`0tmZ@6eB3ZkyAy&5od+>sN0d{8s+4 zJ6&%5+%t!#J-V;Y$ei|-f^W!oqc5*~{;FO4xU*BbqjBVfJ9`zwI>z(%?Zxkl)8o2e zv%i5G?x~5|fS>w{YOd;XFtwxj$CyZj5nIX=)Pmb8VB~sG;)_sn%48(m7R+bzGb)%b zcBetnQUT;{H3%3=y)j{QT%*LQ%)mpvqFu!H<7RB}g4>h=iB+;-Tf*QJIuAS zyh~C7b$gOiSPW&lJ*=h&9W^eOm#rGSQ~mcs?AMR zj>&zc9!!yVN~OP!3(`TsUI_DwdS)l6WLZUhLc0$GKClUR=$+M<(7Xis$^u@5PSC)L zcZUPE0LQ5u_C>16mI=A=1nmlKYK@MP;B%7jO0DX3YeAzdCR@-U;AX0s<;x)J{!334&r&zE zGmevYoPkXb1l}hpA2GH1MXKtTpV%`v6b%Eu|HvExeCls1RpMveY&J3+*f=mbwE7Wq zSKtLxdN27%1=~UsqmGx@b{1tt!SxlYueFF4_9^>Cd93yLHVAkV=~xu z+Sk^Ub!KMs#p5~3>F;c1Uyf!|wRP4^cWgfkc|Lle#SgkPEX1+?1oN#8Cl-yl$Fo(T zucC1mO10GAfCA|LRo(CZ|EdLY3>u2w$Fa%Y<04)AJdlLZ z{(n{X#F|#K($SYfTf-5CO=aWRN&)-J%9h-d`B+F*F>CX!PQqFE|5V-Mj`NHWZeX@IvNqfFR3zzq7{$ieq9_6{yW{Yviz1zyu|1xlul6rGPWk$6-XZamIt;}#Y z<=bR1yjuCQjuzLf#`M@`YB70bTTru#R7zol>x zrs$I|8Lyxdd;DlF4eun7l7){nRrgPJ0(dzHTb>-c(LOGm(aWTAiqgpgk5vLZ=s3}o ziluoKI|Ml_z||`QCn8x(wLckldy`43<_#zptqCTbiSW-o{Qo}NA6L^K@Vf+<;V^t9 zuDYGM0g3m)|8Nn2|GLX~jJPGxQ0H92t<6Asnd*iu_QUZEZFl^mbBM@*^RWH4%E~Lr|dzMJ_1Z zh7}hV?rvK=#eH0YjoE&QlA*3VzN1yN`XNDn$Ub&fmMQai=f%@9BZnf|_7E$(ex^&z zI@a1kWmEel(?80CqQ4v^avRe`BUvYYz3BP}gAmKQr_v=gRg`<><7O_9{mEA#JASz2 zJ1$3fbt(s%TXGyKpl29JuLEsyI6wB*8i#`gUoU4-!s((ysWI(y7)Z@@w^)H*0T0g{NG@Jnlo}# zo$J&%%U32zrwVJtV~7Z4^7@Kan}A@OuvcHAxwO7sZQe6J72#;Y?(WL6KME#09nabl zWZ&0-|1^zjna%vNm=f62rQvGT0;j&GmftXu{XojCVw>3%dTi?L#{D0~?)*}mRux44 z_(Q8MtWQ=85N&fk$EZDafR#?LE5#RmgSr8Cqog)tCFil^w%Ym8r_zaztJFU0+XC^Z z2eiOrCRbC!Gq~D@+L9?jB~vzaANi>=F;?n(i)8KuHTe=%yj{mH&;4I1FbSE1*>z`oEr~La@F;FYnRKK8w_#{ETS3T#c5|v0r9CAR(TzM7Qcx*MRJ7#g1g4oRID=?`itn- z`UIW@PA84bl*`Fi>JcuibC5wLirk`_X)?s*eCdLSX>xEXc z)wVQZR!R4WS+uhiHz4u8#no!L zY4{9>9dutWAZR@-N9pu0UO$1Sm2 z+uP~2CN5=8B+h?os`SqP(rTPxk)Lzyt~CIBzC1a{-mV;D?x2_C<#qZJ3sw}&egCH> zN^vaZB>89c4KFEc4qjJi`5{cOrP^q4KlQCoRR5*CAH$z+*V^4v(OvbSC$AeBj?Dz$ zJBZ}RXMUHfbefQPCSc(An982l<9(&sBbk5qDsEG`wA=1z)aUQ2aT$}{oel{5Jx43M zf_^(*kk5!p{oAygzk4pwaq}grd?;bk&6A}|0q*1rXip-Bo3L;@GF62y^PO!8 z-M`p{>YRviDD4j`H7Y<2Y5r=YXY(DlXpGeTC{55&U#Z|H+>g+V2>mXD1nXqCnmv~h z01r(zFND0>^9|mnK^=MW;{MFNMZvr-%r7Nywlx*2pri(-@V`)JEAyW-dG~*63+xr! z^j`42Rcji9f>}M5HWy2P%=wW$Ccd}(pRQ<-ax}xi8u3N%epktTWungJj4na^{A-+V z+PE2)ksWYOYuMfT{Y#*tLhI&ViRND=i`N~c*l9iwDYrd1%uLvx%GQnS%MJI50|dUE z-o7#*_6+sl+R1Ff<*uUk!$u#XT+#68)plK#X9!hJupqGvKKAhp=jGa+D-BP~*!hDA`R}nz*Q=f~N%vUu zQ|Bgq)wx5T!NX{eAx(C~QK@?_CZl!uBb@4cI^bCZhn`4`d5F?zf%-9{{ZFTc;oxim zs_Y04qY#vTDCF749J_`06E5Fu!{L8K0&*ke6W=jsvX!0+?@cN@Onon>cn{vF9PAo0 z3%kNwb^=<}yWGufj9Ywcu?KQ~cKYki7vRv-{0j=X`&A>vq3(14{k&KgUw!#a;~-r=*N&*lPemjxNtl?4sC@!mSG>{QY1Yu2HwnqOQ23A>bDnLZsDHpq(Y7 zyQk1q>+t*Y{Jm3*^Q$jR3mN95MEKewj};>x?!r-aa6KYw_vIC?Hs*eK6hmJ$?nv_~ zn~VOX8ypvW=ln35hAe4z#L_7RmvM6|d8g!q9`c5H|@_6y7LL~ST>94kaBBAzeJE8mWIVPYAlDh&D1mWVZN(Qr1mv$QK~j3$1XCx}#_q345hvDh)e6d?r7|ENlpWoQd4Rh!W1RMj{yk(&QU!aa_FVygh^!PZSMR z*3~13Z)GMu8n%k$N~uIrHKr*MQpzetk4Oqt?bt4SiViP|yB*PkfVDJ0+2&tjECmM6 z5i;|_pAI3zd&pxrtT7WMVV%||9E2#xGL{D3w`>{C)^o!l&TKG4WdQDu~RP^^C8TIR$>?-E(Q(7`2~< z|60J=?7%#uqZ~N`Y_mR(E(@X80M!gm7jJl`Kmb3c_B$N6shwv8Y7Bqa4o!INtEnx z@y8R4@8P(F3k0jKf#6YF7Nv-Eh+bByf;7x1w9ttI`3D&58Y_RJw@8#+cDG7#G8i@E zA_BXJv1%y0Ze6Y+Ecc{CD!gYBDNg+TZIwGPk5JBY?xT$9s1>Tyt z5)nVxpl9VJn-~a>zsFL^;gXko3Hz>e9adQi3j$@tkS5TBw?N- zmUqgC5m6*#6Dnr0jw@2FJrp4rj9yYfuI$&V8`de2(N(_WPxh$au??J$U={v?ha3pA zN08Il$8=(ib3!owMu?%b-{b}B!^;zrCr7>zqnqASDBeale>ktCTe(lh3mj{t* zeIJn%!=XQl&M{OAfj8WXW8S)G@%BS^W+7DHu!1ZYKfq&v)UQM09FC+==B^CB=bVI5 z`1hWc0oG=bLRgN9*7<6VTXviMTEjU8_PD2Hq}Pjfr#w%ULvo@0XAy^&D)OIIng{Xb zDld%JQMx9(gSO~JzeS3uWve8ijULgSF5TLZ%^XNyDR>n68Q)>bD>}i6>?FT|xUjj0 zzNJt#4IUw110d)4R<6ta*WZd|-uRWzGfHe>-hzQ|ul2U79zj-B19ntz)>9x`97v@- zzSeB`PwX4S8ex#w2gyVumcMTd zmsAE2r;rELa8YZfWo)m)Z&p8`(0M^0L!pXr$2-Y}p7d;lPdL{{DZrN7TLv5q)!IMx zJxqh?9{8vaf0ii`r%1O9zZDO6!M%44i!oH}Q=)>r%1~dcLKIo`H{9rhNz3E^O#|Bo z0+x%vbZ5C=Hn2QXgY#5#?_*g9Lx9lrl|zKXJ*0V6?=_dg=r8YT!*CJe#X~Bdu+8B&-de#=+VIgM2hs8m zT{`>5a9i~SY*VlA2et1yk5*c-NB}uSwQ|OtaB=o9F=J#$4LrvlYV?+y-N5ftJTCqT za!IPj#|3tGS+(gGjDk7XpEf4cmhH7(7A&f&3ony)qTO; zcr@@O%j2#K?9^hS)OtFoP{m0Yk-ombU`bB@gDZ;dfdR*j-;y2G;M>M*`&K2$gL7 z)YCmI=h6&c8`f_id(^Ofou+qMW*5`}{V&Ge`m4>r-_}e>fM5~a-8EQoch^Fp7PNTL z;%)HY!KFZh6?bT9aVy#uD^MsDceer+hVMCdX3nfxcdh#eBtK=nS^M)odq2{5V3#c3 zK^lVn3tUl{P=1eA)*Id-y5dDh7vDI+i-0+8DazZ9vBfY7ewGZ9+YeI=+{J|I zr!h%KcfjQ>!1*z71kD@wc&mW9@H_Q-8^`k6iWC5*jClVM9*A1ZyxFp?6&SC9NA1J= zjY+O;+5potJn1C5>~M8sd}C}T9vkC#)_!Lc}9K;~L251=ouoV}a&?pNoN zb>?Ps-i^ewA=7EV17SDnJBA;4ej;mwfQ#=8$k&j&MCJ#+wXmXGGJi1&7_K|; zFT5?O58$}!-=Mjr)&7k9N zEy4_{WaK~L`9DfYRiJ~Ug`{-+>s&7prhJF!IQiq{`J^1_RK_hT6&k5$<9Ig5?Do*> zyZ`@KX6{%E*d)4NUJ>bfLiPihn&K1YL5K;!)3~#H!4Qnar<3L|xeLNfYUp$862(~Rv=&n6CoRywMJ%D!6URs2K z2kP0_S$>H*#?t4)jK9`M_+-OHmqK0z^v1%R3tpb0Ve)olI*ag@zzp-WUmzqb_|=uq z3ke|=rk3SnTf-}eiuk7jxCj&Cmoe1bj*+?cx}FF5#7N?K7xdddAr8d!9%>ZPdtPhg z^7062AEt-}E}Ygc?)ZNfEt?yB&bUx8*6}koX_wkNWSE8BPFfMoS$) zQ235Ow&&yC@KajFNLtat7H|08x3vF>x@)I$85F4Jm~QB13O(+OtT0)Yjl3kT|DD4mUYezStTX$=-8{=hkK?4_iAexI=cHGbR@<-n|i52Eo+FOZUiwNX4+{74GugBHsxuvjSt1)h2d zeuTQ14%e%8NRhjsUO6lgVpC4KB>PZIPw0KWXFj7*t~yKTm!1SY@vrJZ9jCJdg2a!38*Mhd^yn~aoh!4k$Qgj~(W!ozgSx7unn4$UU}j8PJ%nxpB>rg}|( zNZE~rH=3seiM-Sq|FOEHl=#SNeCt$$(k&;O%ZUx<0XQ1B@-~)(B`qHdFDq4EF3Xzk0S+UH(}Shoy=G)v<9PgvwiP{gOj; zipsn>q2!q0gD?T@{X&fnY}EJ4k{oae_xDBei5N~SstrP(>)GNrbm9)6WDoLbAtgR_ z%mdn%?oRu0Rc=lDf%!>M(mKoNh^uL$7cDS?2RUsSGTpeC$VU_(HWL&fVUaQ7E|rE| z7Th)fQrg}|;WxJ~ALJ;sSyv*U+|0@YmAfihx2WLr7Aw7c!|Cn_s=fK$r>P@*GE?n& zy{L$5)hpJWc66htE9bzySmuxK+vMtC`k0~hL*+SKIBvT%z4Vorf%aHITx)n12AW`h4lr&f%(eBbC!7fsBh+@6Vok1sT_e|MD{^E0! zjSc>o*0)yb=(j%+PfB7d%J?EBwsIv5f83IhG~ghHw}Iu0HT%2t`%%ot-L!fhL)grY z6He|ccD0dcsv^Jub8o9E;tOvcp|Bl*!l#f@w72`v*h~5vI}iBtLWzPK!)U38k^b~v zo1CxEhR@2*-2NRC?13RqoN4UYp;T7}CMh!x zo}hAuc4K4^5t|B+e@^8y0&?ww+jttiRH-~O!!zrShs7je6}euY)-wm)bY$+I)jI~A z-CvYQJ2S?HBfc-|7yE9RF~&0PT21k*EGUzt8)N7EBEj5PM;G|}k*Vwnk>Q~&i+lA3 zE7K_=2E}(yiiW`{P9GEML|$|95&E8%Ch3p>EX&?oK-O>^u$jJg*RBf{0*_eySDcEG0 zj&Si}FYYU6=OF>rqq!38@FMwJBr+Mwxf9QTK_kg>F4wcAwI3H^3nPl^X7Kd?GvY!SvVVYVO7PR*Yq{E*89wMb6mgzt8ImG66JVJ1+^u^ z(Zg^}tW``&Bpt_a5GxL3bx`fHze6UPIwMhIr;XneF&7?rA-tyFi-&ExpNxAaA$@V+ zsd|qEFMu=G-R8;m0(%NJaa$enhNmVlZ0clKj?1YFraCvaqmZ={UrfuM(Xo2_D<`;I z*kg^tnyIc|N~H}MjQ~Gv$69fEN5`cY^gf8*>(#8l-0LM30fu zjvPz9MKhEw!vg*BDW3oX`r26kIu60fZ4a|Z|E%E4w024&k7C^JN*U3un(~VBp|CO> ziVKULy?IeUjSSS$jx&0WXl~yd(K7q3ghaB;~V&xx8(4|3LT;V|cVC z7ld5tW;{liyh2Zb{eH4e{ge=S!ajm+HaJ$1k~fulfS8TdB`zENFf}CMuj(FOo6Iqy zJG*(iPj8ngcpF+D*gAN0|KE_F-D-DH$|>X4)$jaqjU>O(8svNf)YV+Lx25myII~Qk zIU{;qznFE5`uDPN&zX={;y0R3{lz2~p~A*MN7+|(e&IHjpxrN12AczmSsCz0%M zu9mA#Jl}3|ATc)%6igd4*Oq?=a6WdfQ0`Iw-5nDLCtyLBi=Tp&=0GmjAO(Qp04r1p z2b-c(7GH^o9FHJRpuTQ}#FS&iTEj&V3A71}0LrWt)~xGRIe7%ZzlvnZ9>QEK0h=d& zsJ0U8SjNIxQqXl$0Zz5DobSk~dqfU8S)Z+f!VBe15Yo@MbAI6u6W-qQL55@6uZEzx ztc0A$U_N=Zn2-4*Y|yp`#evy`5|2{J)}ga^s}FIocwiL!GC`Qo1~T(UI? z90`0bKWLB+SqXw*7zYJO-nYYbR?0P_Q39#sS}RV(6XP+DTf^PQ3H_GYRUT1V)q^Ov z(djPQ(Z_ji%jH$dI@8+Ox2D5bxOPP=nu@>hs9TdfB|{7lB^uU`IYyU&Ny8t=t`5CU z1u|LxZV7K4PWOZv-!L|=7e@}gJ?140g-46QO9?{yAAhLH3K+@I4pVzg?8Qmsu#RbK zkLwMuL!?Ps)1hSnf%(NrXcA2ZDDV=Q*V z1mST&6@6?sU_cPQ_Oahu4Eli)%_Yq}zaDpt$oB+_v5wUudVR&~fC@SbXP9lr- zq&NEm{ULE8s#@R1C$a-XBH4{e<8nzmAi3IiZ1Y6rk9cHY>}OY_>}B?&KEebU)eLFg z7#&QuAQ8!ZWAXV)7*p(@v0}1B$gQ}*y|nr_3E8!~)0k4{sZ3h^Zk$*!oX`eN7+gOz ziHq>?)bmn~rOie&>KRtGVhDpE`;l=%)n=LS309_9?I@0DX*r*vzSQo|GA3pn*|om) zG0xcp;(2lO0VY`KxHUF&P)>|cKJm{nOzg^QP<&j0?QpWw;Fxc$!!dC}w^G?Mx>|NJ z6Wf18o49h7bxIrKd~8-RNAUhfYE2&TL{DA16A-pNT?HsfH|FT*#yoO>5bPS&WY-;D zjZVW!L+1!g=HvOfhz1ZzZi)Ks$3qDZxZn0nWNuG-C2H{s)wZz?B}p605wSctAo1Rw z(iE+s&=JrUpOUGZd=fu*o8no>>K&&ZiV3SBPRf7~W%F89JxCj83Fud`x`_8-B_wiB zALS?eqHI+)89$sOmx!tkEhSd(9|Iz_pCl4#U8EgWQQ`)O^FuMEbl=7Lbi3e2&lgDE zTqIGEAp#bYNbCx`wo4r5)b(oO$R2QGczM%uB&Npk@#CcOJ`y+5c_=f^6OLvG#T%# z3LjNP2NU_~LZ?%hg&n4(BQAWA!u2yIFz8WN_oLS~tmCD`pHd;s2P88C#I@f@tbYLJ z$wpHiV97l7*I5C#CJR3#dg?c>q1LI7D|tmdkc2%Ed_5@~hxJW;?6qqb+%ReBF8)Vd znELIE`bb)d&Wa!HS8RxbW+y#}zFHzoy7hq?87h~>`p@*P75Br^WUKJ`3T?nMJBTZT z@xixdDdTYR(Vv(6PeHV%(+|S&Mjw}B$e4q5ri=}I&*Ga>!!F4sG1>sUwB{+e*s};B z@G*+RXTEEkF8WyXaxrO{i|fZX;)%}?V>OK~R#dEUO|wl7ZCXQQ0P1c#UeF21resc%E zBvvXZ4j;9-R=x!m1#UOc{q*EmZ$)Kc?)@`>7;|I8((XCQZKw0nDnN-8MloRHn&26m z+iJ9da-&o19791Uq$OX$B9cCi0y-N-jQtW1K<=b56Qwc(q8{#KelZ~#e}*-7-at54 zJZOzd!@TYUD9=DN{ir#3A+c$#Q;={D?PUzTOCdA5kUN&OK3r-UTsaBiF5yw@l9K7QlH8Z(W5(Bb5!Dgni*XUM92Pe6U2eUkXOBH~tm4&p^t zSX)o*H^k`vCof6-U;kk&;YE)n$fitOE0G+ILvo#P;`{rgV&w!IX%I27 zgMguAhQfxPb~*TY4|^I2cK>leQ=g~r5rqCKL^V`MSW2oZ=s z6TlwV6{+os|Asig$*2tHnFR1kyUIE?ggkR1c*cw2@r-d(_Ub&&X`d!z7r}UX#sCBG ziKvb*Wk9g9u7GY;+OP3$*yl;v*q-$9Kr~5Y`Dr;OL#_ZsLx;YV4S)#Jk-iI!H5`MW zuzQ)=F^;?t|MBp<8ZHIQ2i_2w4DosW;b6LZKg(FcPnxRDS%YnoP-m_)8x>upo!yTm z3^qR0R8IsuSh~03cWNiNOM^_hQ%!UFL*R0r+YpxaS;B;~49_@e)ZzGDG1))Hm)8d* zMRY3@!{$$vNg3G>Al9(+$-2stDm1StCww*@?ulgbSdMms$LLQ)+Fbe2be;H4xSdVJ zx83Q|hK>_Zhm&uivD}VtUoQP^@vu z82|O`7tyUR{wfx@O@i3*~gZiHgoZs(=ql}QAnf1x?>E4 z1u)MBjeVcE!{A$q&3I`9iFy;~Op7Kkf*6d0U)EnF)ki&qM}GmNgyMcpUf~jqI~N7g zPI2ck^`66&-#VR03(-ANe7R^P{iZ^~rZuwHkV0ku*hgLdG162Cfc}(YXYcG^`B`!5 ziwYB8zNQz(6!W&f=pt5UBaFYE`uXLnG#_c8G}Y9OiNbVWDowDO&M#t{;G~JZMaZAd zZvu%6og zN33VP$KwBo^?dor(&&!$ME+;i`2S`-hnu#P15Zyk7%*SUCW^Jw_$9AAD$Fue-{|J+ zw%oCvh`p9Phy=ey-c{U7CcSsnRux-!$kMYTL4%-k;>M{hq1uJJS>xRn>1JD*(1*Xc z$#`1pSNbq4nG{*s>yJveCT%GfS{ogTZwV&%7KAo3J&wm7Cv6`wtJ#D2cf_|2H)N7& zMNFKx+?x;DYTmYrE8KshJVLG^m3NW6a1axU$i1h4pQGq$W*GhX`l{8hpgUPp334bk zY`Kx}^j2%zP5C0auG6Y&{(NQT6trx7rqJ2>H^SUL?n5$May5A3^VFDf3zzyA!1t4~ z<#0l#04y&E*YMOER*^z3Pf2|_D(-IM07Zsulu$)*9&$cXxmouya-}@jB4=#hDE;a? z!>MhGB9P%lPz_#fg2Txj9uygM?o6#<#V)uwQ+WoiCXr7`J;&~maY2k;Zj&~1s%|Vd zbETo?&->9f#F|Npohy@?8aZU+TmKBjpV}X#GJVVlL$8AXsbK9<5Lv0sQarMi4^1jjq*BrLd|oI zRd;Hz0%FF>C3;HgR>=Ies}?wg#3Fq6#ol4t@h5?!_VXFnqmHZ1_$~fFmvZ0uK`rc_ z0{1US>N_EQ!Gz4DYhL$R{Pj1q#o8eKge*{_jbY2+{S;(JEGc$qh|Nq=n*$_KbZQn) zYHK_!n6_~;cv|2##P-yn5yJ6QviA%Sv#ftM-dXe~gGG@<9l~aQ-5@?;to4_C>Y3;P zX8OUinhQ-;vu_w?(C7AxIeW`Mo6sC||FszKAB$`V!)?Eo zRV>6E!xk$3L3>4isZeYM!=arBfAO5ZwLeYO7A^ z{@0_UF84&#;_a?_C-5ye0EGKtPVA%{yWjhWOnu~frYv=ZX)r*70l$hdyay5u=FObU zIyLT<=Bx>Sz`Q?<@obTkN2|JCoS75fslnPlR7XpX6+-PMdzfVHBk51_V7D>lLasQh z4>hOld~Rt!x9U-}VM0;e495WfVPcrY4_An~#A z?>xAEyNDe*Lhi2c+7gM$h;mysPy?;7Ztf(q!*~F2sKQ4tHo<=&>!5AT2mjeW`Km5` zBYf2aYs5bw+;Uu4>pP4yAV13<`U5eR%^7pF-N1fHcq^erGxmr(Dt$`6l#~!TRD8_$ z`unh?7ORJvl*625F6VLNii@R5} z^iMC-lsaowpb?Nf#gX=`MlF=klMrzL}{W|A`%Btz(1_S@{u7dYmJq^`oMwOXLE zWV=oSq0IGJqWiRM!*GFVBfv(~UMj08T^bpl`l^6rx;!;i+!=;9|nl<@a7WS8K z)naWrhqpcUk>4mmyM?FOs&x@5?N~nvsUX2IDa$DTEl!Y6D7Vj-(=4HtQJq>xM%XQ* zP$KZlTRgFXX3}j%cWUm7W9_GTdenhvm$xj!%`-vqz;STV7x?@uJwfpsHtLfON9~F zL-h;zFDqn&ZtL4N!J#+_9hZhB@|}@|%TE8s=^pARh{jLIN%e#@1KZBWj>Qzx8gVuT_!6{iv^p97Bw@VN^q&wC|2E4*Em|J#eW0i*fQy!^E zsb|+oVO~)@%EI`!vHlDEuOT@p~mjGt?X z0@S*)au+zK$ec+u=@f|Myk}b%=$opcy_(Wzc0mcC8z#r$J@J4mZ`N zz~g?Jf57bgD%<<<`k4chQ!2$TLd5JWd;sfh+=S;5j+Tpp6>pK(`@?_LzapPNsG9gg zQpo&EB?(#K=1~v!>J6u|5C^9L94mZYvr^tjcxm_DM+8w>ffR`FGu8+-UmjsvljT$x ztkjE7)Su5QjC&~PGUX+U{fqf6?#jEJ$jgY9v#@)#CXcc>uUWm^D5Ge8&S}5+bz3N`@yIz{f@}G9HGuaI0s9 zs;q@AV5H#4hH$94SkM3~Sy@&P_=MZPH&%?As&tzigc0iIMr1m1e$|MC_r&#M zq;^?jA9#@sQcJbQIC`EK2Bajw3!w%92_1dWAY-pNX{E41y_vbh^CI1!=qPQV>*|$o zJ<@iE#}Ge&Vm&KqxRH~C7v0R0d?`j59u3>ZIYiNJ?uV5 zB9n!;-4M2;5B;gnGUSEONH*evH|3-k^&kuGZwf_JAch80E?4;?ol==8&F0Hf_thR| zZKoEiJ=Izz>*2(T-CoN!o2JU>$QMo6ejQIx$Wf$!Z(girDA8@HcC9qfou>CeQdP|S zdrB(BvxG)9(h$cCwz7=8DM_OpCEGr@FA}hMm65szk#^3sO3QTlp6PL&=}DL6EtBON z$W)~T7bdjw`!3hrnDttm803j>X$&TuNPU@euQMegz%QGmP}8X?C2BYugpdHC zH)Edii;G!`iv28>RRv2ahb5t+MH$ybZO^2FI4JSU)BOUGpax>JbGChiHN++d{5BS} zY$DfBWHFAPr~I0xL6q#Swth?nR~AQNfqcdkqQj4vkO1yuDwb{_3q}6o6;KP2e3=Ra zDdXWG@T6{4ENX{?jxb1WRDPofbeF%gN{rgzdlgRRd6lX!tQVS(U0Sv4rj8m@zRzSSg?WSWjJXca6eA%;)qPeA12&!}Qd=LQdiM8~($=&m) zlx>SRep-VMmw!LVdkvSZyAI@pmpNEVPX(4)tN^FzRD5q9gvg2*+TyXuQoqP8i_R~lXr+{40Ql@zSFio`g0$_=F{ z902sBUW%nul6{~62M{3P1ZaR!7?3~(V1Dujgsj3#scNqT;$*3%Sm9@u6qVVE2RS9$ zh^nVHV0$)Da7ra2N|-K|synypGPT+c4j?hEF3N?ojaO1m0NKzLo!&q^AgF&X9&}DH zCkr3|RKp5u0(WbT)oLl(s(%sG-Jihg%9YxoFW8NvV!J^B`Qd|swIRiI{(V)!C%z8E zwU#}APr3;Dc-xfB`UfWs*R~CmVE|%Qhj?#0{FLgQkM+`Fc+1}_@KhSEZ^Z~eXgvQ3 zp!`D9i8-wIib{iC(h3O>f>&|7`mTFpbWIBB;6M|*8a$O6t}vkZ4JzdYn5(GeqNfE^ z50=M)0#d;CuffrX@^sF;nnpg~!eIXhmCw2N%ws828ss9fg(hV+w}z#xdjwTR?wm^; ztGIXM4_i|=iJV+pP5a))Ewm>6ZpH4IFVcTVfA}FYn93vgL+(STmX9AKB8oqsD-_6m zl$ucT;*EI`L0sahp;qsy@=1c}ls`~FgKE6u7q3W~p2R~hXe6D<2LY;>1)uwhV0Jq<*!cXbqFD%FuYvb-|B4+E7J^@C! z(5a?S*Rp~^DA+Fgqi<|J31cbJLfP zLDN@D<@>UhE4Sk}yuS{wrc>!4C>)^ls>lgqGH6G{j?}>somL!_FTC*6y4@}SpN{YZ zz62xgVM#gJJO*76%ir-sPv2^%tLI7(>!Z2rP5MsRnb~d|faKkv=U8u6LHO@$#BTvA z7yV*B;D9*-82ks}Aov8}1hd3_+)(e9UMZ5WffY^AAdH7;3W0Pe!UqjN>TWnDq(qzk zdHFsy`{+XufEdLZ+DAU@t);eOo&PVc;epp^Mq!cc7z<#C48=-%-ZQ2yCLy86zDwVJ z=><%jA0<_V5v~$N;b6nsV>aPQjYt6b@`&jPa4eWI^Aj*@pIk+^$>|Syf8JL$G0Gbx znJt*nd0DHLH(1g%R4jXf2tO%>SqKB| z_%KgljTb*Xw;(MqYrhoRpsXnIFc!93KOS0C@Kv9EnXle1^=@bg~HiRWuNTjKm+LZOL|j9vW& zA5$%V0M3U}f5@$S?MCOCD5+sRH^M&eU;_XfHX2QQ1Yw)u_yTmN;R-V09$wM$7y>#R^TrMD&~JHN(CCrxp{a`v<(!fx%B{TaexPh zDvo;%*NbbB60mhvMj_=DxrX&CU25?0`a{s>GcQ=1yvR~@z3Idv;mW3V*w%65DyQib z1XOmTy6na*!Y#M`E`{vmUVX;{LXF@#{(lxC(3qhrc{-3tN<9nmlPskEOztU#&$G+t;+Ku#7Z4Ld zCMD>p2S3g8W4V;nUNrnSicyf=`C$rCCCM>poQ`DT_~OKP1_eX8liz(kcm?V&0MA8{ zc4MLI%6HSm&*)YV}tiu17_3i(69xc18!bj|mWf`r=7J@fy@*dPV zE0h=)|Mz(``Gm6fb=F;}y$S^z38sHn{k_Rah4~vs_~&f1#YGJV$@|*H|C~put~}~~ zcA=kNQb`-V>2?jwZRToUfwLA`)vU*l3cYqI`-l0vj>Qjq*QEtejzhcA)d0u zs%3AsvJ5gNHCHM#*XpykWN`WoE##tl7A;fbrypMyBk*)-@`pl5OV0as{*D`+;2Gz* zFG)1B-5v`RVz--yo$Y~LTgNMMzf3=i_GN$dvE=FcH|BG5KJbj!xxG*3Cp`U4D42fz z=aUU}zlA^pzNqmqkf;UJk1SB!Fbq7?l&QS`_#MlmJ>Ma=$F$_;$ruS4Ug|iAFdPYl2ij};{QQ)6d_HxBH5Q-Ec^#m8GrgW_tjV{LZf@bck@3K> zVk7g>i=B-uR5agawmm_MZjRI2ip^ZNcYHrtJw6TRvH6ZTZ{-JUR%{i7T<$#63m{z| zWQ+B++J1xKwx(c-yGLx9Z@IK`_xe?|7s3|#sDiLG&thYc9ZzL`r@TZK%%hTsG~KPN z=I5+Xe${--zgG>RQ{Ag+-HdyP`*^v#SEtN&%3n_}DF)!3Asr`d7`wN(-!!f%aL_!> zuWQ&sQb=J=ck?J-=*jDQwve|!@iYjdHs%Mk*kdudhlW2o<7Zi7h8QTyFN^#tRfM7H z7H_XVg1c4m!EVPrkkLV>-beg9m>N@|fqE?#$G~mZ1=9LMwhP03FF#?AD?+wUz5T0$ zf;tI}>VIqZ8-1Zg#qL$nf`3jwOK(-5eNo6CJNv3kD0DuqPUC()A#<_hNk!)d6(^vTA;bMeuwjU~T z+}nwLlN7XOSMwxrrgl)cP1{j0ph={uZJlhNrLXr=DvTtGQ-)?~%zqxZnIz2(`f>L8 zWTY(d#ku8okU~{Wg<NOx+ahy=q5N|t5^Poh9`6uc9R4h zN4#W1Kx#D8K}mO2_~}H+!xhDiY-E&4BP(fzV;pMiIC{(^S#~+5uM0CS`EJi9>lS13 z9xaKFRs|DDn5XoYm#Rfy^FN`G#8U~L06jKKzkeElmn;}`XML;A4C-}~C}I`0E@Um% zHeYEAZzi>VV^*x$ubE81R~pCTwVXAAMBDlrC()%WG@r6!rva(v_{}=ux&GRPHVrA* zgc437b7(_{s7Uvuz+eJ(XlAG6#En zWA*E}FB5$}tar0o!(`=v8kNvYcn5AI*BQ6f8m;&&;gAcr3X^E}g7)1uUUJR0@9VUa zQyOWOP`*DPa*L>{x|Y#=-(U09Q$##tgqwzUPuWBJkY|1?iMYm6w8rm#F|@hxoFgva z(+iv88Sl4|f#o&HDrzZ-@vUMk8!d4GHJl&NyM6D*N1}ZP8B)h=c{@7fHMGsu(|1p^ zbkCM`P0CKm#+m0NM;9T&_>J=!`jRtNT;7&h^@AhMmdYU_M zK>U?x{V1XA@$c1pOhEJO6jx9D>Wq+gzT z5d!r29_F;Pw4a8Mt7feaSdQLrWJBzI`kri0H-;}eC{=%_m!!78jdl8Gs=zDW6*xZB zDj}@>*W!3cx{B!TQr_gNsbkUbAv@vzWrm1qh?9y45j^R|R3p2=j_$*o$?Px9Z>2u( z7-~f_kbYP*joWu-u83e~bn~rV(V9b-dQWhma;EiVCi#y%S6&sI7vp0l z2*EP&lMJ0NV?dsUD#ttfi<|FB6nCqO-6T$C6_A-rqK}I3Oyy_47esAD!&Ff_r0Cy2 znpZFH2e1Nt&v@~e;1Ec(L1hqje(|dIt7SVArQcSt(XW>kMF0L)+0&GN&Cx5*(uVK6 z+==K1+er89^@W9vzFwmE+WLu${3y{UZZ_jZ-4jKWSMr;6YxwQaq{8xq6Ou+wh!z&t zqn8*?c_jy4C(s)Nvr`W&~vk-OY(eBrBG$RDPOWZwrbXy>mu%)W0Lmjs6gS6XtJo4o$J-dH;=&wUtgL)V5 z{GIpsScf;nlQX4Al?lvY3VUASkzwgCFF)?|KwqGLFOHM5m>eoZuOgBegnnzx3;9La zaC)pLaZh|P(l@(j9;tIIcjL$=cNv(rb#S|Jvjlr}TR|=O@AUQUpKYVAo5fH!W-H5etdH9ev-7l68=S z9!+CRW01NfVm9gPl;WS)gO-Z$@qYiZ)(dEs>WeMoU5*iB4DcjWdCrG{zXygs^~U!_ zO2*O%@p^{U*}(2V(ixP_;x9Aq@o-C^??*2NePamay+~z;$fQ)(Dq}ERG4wgYhBJWr zX%E=XF3NBv(l{JX1H+q8CVm4T*2Y4wa8l3!I3Eua)msk^UarrB2&QpgR$dXI2&guI z7?1501Q_KA`4qCHKEOccqi6Vo5>cj~zKFo?pdssz7g05j)Dz^6U`03C{QB zGz%x*q-$aCSE**jqByA^S7ha?Roq z_~KxxLkwTFr9WYk>BRue-C!g02m276Uqgup-Q!t1 z10wV{9D1WnlHmFD$w_+aHpP^`(hZ6%5+3Ou7S-CI^9$l(SeRU1PjZ8b`rhD;KLKRC zb~{^68%7h~C})lWU)*j|-5{Yg^<pWu^Ywr^2_lk#yE}J4_hsr`5I*f$=%1H4d2kNkLlfVJI#Wt5HvW0rGRa{Q!DS_BB zJ%210F%pm#tGLSwT|kk|pmM8BeJy{{l6M2WbGV9WxYk*rt4JtWERVl`;0rB4l@!%i zK19ByjF?)s`)w-5u>k;@$VYLjYW?EsxXyn_L<1au{ZNJDr&N0O^IfyxS$ZG{vBhaDLcin~xOcQd!5UX!T6W4P ztbkU^+eee;tws2U%g{&lrJubqz!qKYpi-3+>SwZW`N}eB73yVW2Oxg&N7H-}Kj&o%;OZ$hjt#Kw(fvm3q=X-Nadjr2LgU=6_`r>a{ zST1?2m)57Mq=cUHoiy$d^v6HLO8>pUKk8BnGGzXD8^7}civ~bhQAV0f+fTzt?` z+H@^ReyMa&C4tc!6Cr!)wClw2yWf2%(#2Io4iw` z$95csvMxKN*^Vx&On9LcJ7o%ocz4|&()yp}<@}nP6&3GxcdP0@{Uk{y)j7lhdu`zrm6sO~d#28YG9U>zS^H zAGY6C9e&(@_aCt2hG^UD(SYl7)11YsBlCj8y(8lv)4z|p!NuR6_ds~6k9$egw3Y$m zLov>Rp!NCsCwr6v#!ufo0U31~FZ!Phak6N9HQ*|%_I4m?#M|!^FmgDlW*l@o`|srR z`I{JENPbT~`K!u*l9M)1&H1Fh)WP}xlbrn2>oGnTGmrcaE@ojGuSMtL!u>^>>|e_( zi*$y7&I=?Sm|1>UO{MvHuktGAJE?QTE&f@a0qL=U%o%Rc-{koo-)De#w@+*597g_f z?MsIE_*goL3$et|M@}P0;b%)ut4Ob3XUex@LLYH+aD((FWPba{h|>`9-v_P!a^H<# zkw_#DeIOM1bKL(*;)8x8P2HbU`4|68Km8O_D%k1$4r)K2|E|{IIco>Y--84t`~Fh> zJPzJm)w(tk!K+X+7hNxVzR!1R1lC(>2;wkaybwQsXZDu_2O!k$#-l$*L-cWY4P3}S z=N@6U4bgn8yxf;mV0Gr5SdY9}^2rLWmz2}m$Z^ZmgBE-TwmcIBX-Jx1Ju*sy-A0oc z(nmjkEST9=2=yOQ^Ua8O#XelPd^Qx+Qe6uHs5YAG?NEW*6SBRdf*L%=~TmfIi$8(n31Un-gz;F;8mu+tvFXwfAW zCnrsEu!{H%s?eWe{TmHsb}>T=0}&~S=8%1M=c-3G*wk#nRVf!y6)YHp$x%nJ$f+g- z>x-q^>c+5|IP)xoHFB5PZ)6DbjmoJsX10Q}B%j10o@}0G3977o!)({la39#1=HU)L zs*XYe*Ze`%+BCzq`Y3vhSc>6n`PHywm&$lNP_~vJ-96azM*BP>lgFCj69_642Lp>9 zLYfdRomUf)Eht*3?BRS%k?0$)VM7ZMIUke{F^$LlerP3LBhxrfNv`V%$EZyG8n-q` z4;;s_-=F?o#7~N4HV_=9uT?3-K#|O&Zo^=e?6<~|%>mopS|X3K$ZbPFxgL{0A)B!y z(;u93KIrnP#mG|2kYDKRdj8ZXRh=p(=eD~zE;R#XK!evu%gsVfG@9rOi8Adfz(4^@ zwtk&(Wv^-%>r!QKiAD20ZC4NXCBVoHUEe^4#<}MknIm0xyaP!N_l-TD({DO=GNl*B zA$%(Dg60%oQnhX<=$GzxwcbhHHbK9lfkg7v>Hku~D66N`{$^41q){$cj&kj+60;KQA!$Sv|LNBipeR8Bj+g-QLx=~b!doD` z6?EtT1+bzd(?03-4B;`!;_<<+Zj8J@IE|YK1@fwg|92I2FbW89jp+^$gU#2w*nF`E zq}{Z{MM_4jgqMgWM%QS&>h-TceeCb}FOF~lMrQnl*&g99Ctj8|3{2uNjBytY*x-^U z-)f7WOi}8A<(0$P;!7M2?->wMtKz{i4j_{r@AP8Ono#idsJ{*X_=z0|ja1g)RVJ3D z%0vTMyKg@e0OEnG`cxuw0|Xi>G3Fxo9Kr2Y>SDA**%RTwlYzi-9(pwZH4-iJ27mB3 zzvvUrd}i7o_+SfyGxa6-w&tzXR4Gw6P&~idDB@;XYzJ6L_z9r(aQ!neZFjn*!L#~o zYxY{|p&W4;C-sLLU*Bhr&=O!b@27E-fSkh0Bi#4C}GgkuSaKQC~OITFc_t29X! z!=5`iEU@RoS|!iY5`=tzeC!=8m~hYXX_6Ddb2(|-dd%}_^7qo!m-n5&J|DgO{rl%P zm;N5WOKOFyo{zmP?}MnHJp!p=I%51<%^z?*&!K#6!;Fka>aA1y!=gS#J8%pgn4aWF z1OldS|1b95GAio6|Nb2qI%b9jC5G;91RP4b8x$!ik?zo;8-|cnq#G$|P)fQ)B?JYe zQ@R8>U-Y_u_jRBD{rjyG56(Jk{h!R^nYHG@{_OqQ`_0m1ti=5mP1j^)!9;Y}g4lfj zO8$FoSF=lt8fp3yxkdfUj@SDsR4+yQ=Oo8I&C5!%2G;t7DL*4#G-xaLUEZn@q`-GK z#xNw&o@C_eOO=`=fcukXD5y2!VKfvPd%J=rXoBu2S-&W~wh832^|r*sAU;VzEiB_G z(-!?=lYm^d-(NE)Tii!?4OV!WOJ}2<1XW!)ON|6$H0(!8rg;CL=4GR&Y|)p!3nKP` z?=Ue0;W9j95Q50#;F4`GKCo`)ObL>qJwwjv7Cj;}9wk#+2$%X41nrDaMDO_0itu_> z>bnqfTM72V=j~{@&^t+ekESjw(bq2tbAB06ulrvYm8_9kkkacc`~LLM6rp5Mvjmwc z!ViVXe)wH}AX2032#$SvnwL{UyDLbjfFkJb3%oidl?oCt>|oz#rB=7FINDRpMm_8G zM(PqF0g0cW@8)Y^o^VQ>x26DLh2!HqqwY7HilAAPyEiWolu%EqVH+g2=(3s%MNcOH zqYP^czZVN>ogLHh8O1kehawA2nd#v0K2WAL?Uz zvlc;s*OIgrhAf<5)dg~_6_iC3tl#Nqp#9i@QR4!MCym6IfI-(?G~;Z^&-R`?=tP@8 zB_rU2H8%*?t>7BM16YeF2S0=uSom6AcZM6}lWduLS^HQTD^VU!!SP|XI1AyZb)ipn zz-vK@ABQK)2!>}4Ds75(^5J>L2D`K+w(es@hmpSxht)UHQktW&ySR>PLry^+r3_$E z1o@o>YMF5&8FNhM4%~5m3~(+)Rg7~L1zm+%J9OQ?<4b z`M5eETgdiw{8&x=E@i@j7;$|eXPS$|p%EFiKJiC3$u3ITZ3Nww5Am@8ii!wYCw9lg z+~gdGY_S@}G(lH?gv8Z$Cq{!VbYNapClHnrWi}FF%_Q!1VJ^Uvv|O>)v6b$laDi1O zUpwYw9HQZB=&2nC7zSw+KTN>NO}3x#CAaW;oC5h-Epc2A<5y;tREB-F;9p)yX7MFr z{YVQ73fH7kVO4sT)&$c$3*sPx{R7ix0^xvE{`(w)2iV>H&uUt`Om(34f5o(a=Mb3{ zhMMbgz6U(S%nol#KmJzJnF85e-si*<`HJ;hou2pGZ`3r`P&DO-75v8r4$_{Evx6^H zZ*mC2>&34_ja47K!D|~NJ|k6gDi{4|BEvuqk@*eFI*{v_R>oHEvi7!GbKP2e2Bt~O z&kP6AUY8PAo)HN)-7H;^R`QiG<@`7oryhIi5(P9i2tp{VQbfVm-gu)7&wYw6%-ZBbILzR-GB(edh>HnBR z7@KigrrNJ&Fa!nPK?~N zL5jg|H66Y1!q}~Bqc|s=W3!|n)xkj}64nz@T>M*2OJC0@0%{tsM7Uu!+6L_=hsX;1 z#j#!8L;iTXrk|yJyOf1zi%a9gDC{F0Md{hL(w?zzfBl@-))QOhK+YRAt;$KiT9n0H zzj>pk=LFDyv?Zw5(dSQ2_^-5Iocvs2`h~@{*MUI+J4-3tc8E^~V$%;3cS>66; z4)I$}7nlh`Ki)k>KOVctkvvuv?B_?mF?@GlVM@A=9yVp3_T;2vse^OOp+3MJz_k0g zy+>(A+g+Q`*<<-;ybQ0oLIu_+hppzZ2#e6)i;?h*Pb~#l=}Sv-YPg7x6Leq=U^WtL zNF1S^jf^HG7oMy0-J`wOD4CM*+pK6DrI`P|*qyWWX37ar(`#nQ-&)29n-MvuJbOXt z#@ubK3K}9tYki_WE)T~Q6a4lj44tozr)_zerH1=Ln@^CL4C9dt4_o83aA+KZJW3|A!@x@cK9mvD2Dc z;vj^?+T7EZm%&@U9_R0-ON~|*6wD(|>+fNas1cfNS^(u}cd@Fd(9W1-kTu$&99^{a z_DUHjuutC$WD+r4K30Z|{XNNRHSvodA^v4Q-e(S%;BcDNk(A8_Wy(l*C{H>=SgUQK zmVXg#q*%AGgL*ZSuLs8&cs(4?lCZ2q#5urf+26~!KhD6ajV|tKH_nVjU6{;KJSej$ zhpK!*86rS6Wbzj3)liVkkexUrWnl?Q+Fr@y+7MulI*-*m0n21sQ#-) z*{(q$F{+N`MWh&rNaelN7XsF9f|*3~=))H=z`pN?0gYD=lIRsJZSG_p5!#Q|sjjAD zGyjOXX8!f0Kl_q^ZCdXGJ~$#EIIJw|!81ihroad||NtaS$-9G?wY0ov>U zNh2q5eRC>T#hLF{vSaXVTfROf3f41)lR|tji!}&4u|$wlSsk_2k?IweVYh-|TqiYy ze&u>Rcr$}06`83c6*i(nGoyYdb=*B%b_zg1pKkt!c!S-+-3q-gJ`Buc7yU2`4;^;x z!`z^Uw(j5^lZCf;(#VyB&{cE!f~FM28xnG#L-FS%ErC49jb6qv4F7(Zk_8$DB?t}1 zN6`RTetE{}6z|vp+cog!F?MrQVG{a7Vx0pnCZkIzC+TrljA@a+a!gC3yErSr)7?1t@3gwSl8cYE3|aLQc1a(@xx zKBSxvawe$h+5kuc8T`qSswyYi;7TNX1IOcUrEHB6mpLbAImWujsxpIPjy5s;U~_&6AijHOR-Cr?AvxBBRY2LGg;z@dWCUl1Rk!NBa>n(X)_ zC(ct7sRHL5XAUll2R#Jli?xpm2Z`lCL7Z=eJoz-~*35ma}Dl^P5WuL6!+|ht0%&=iCtUSfP1nNRvY0orBUZvU28BH{OO@C62;qqeLQR4U> z7mz*lOO#5SRlCQd7UQWca9^PKKHdI~a9{7tP$bg<00*jl`PiAQ8ULp zAJ7~Nsoz#9uJFzyJcmQ}DSDZe3~nVXyi=qm{V*=gkc(^M(M>zok9{p>QxpGi?mPJ_ zm%f>ipaAn14~ZAnu_?M-A+C{fax5(TVsK}eiK#X1GN1469-eIn^c#wB7lq~8LGT%c zYnwyZ*$A~YC&=I<=r+gAFozx@13n`$8?^{~U9g7DaX-SKI|!^a5ac8Wx(9-07OPzC z!LeA$^4%d5r!e^%GL|Cxoju%CbKH$S!jldH+Xcu83VP8&;0Xdgp++#=sy@P<9Ly?n z=-D`dQ3uqv7&;2WPR$A4e><71DLTy3B^11X^FkH$r{9PDy4g}rR zLS7*JR{>jg4}X6lbO#2V=^$J~VI{$!dnl|#6eR4riEz)Hz?CmD+y^r1g71pJy)+MW z?xP&X7Fiv4dsRagVGG&L0lpvpDAI2k88DKAc{xrnxShGEzl)zG;d4IkF%21|eJ#b?wXe80+)uJZZzBQaCQ zp&RBA+-GqoeE6>B_!%AX+v&JfE|5ztY}9njDhjI;2Vx6~oHK{aA)(vmzWWP==NQoM z9kCbY1V$*lwGP4=WL#{g$G)~Zk!uKMGIYxvx;u{a)FNEUpATuC{wK?u*Ey7Gt%mxbDVieJC z1dW|WZNQ@%VT3AYu^+XdiwG@vJT_!SRjb9fUbeEzG6du zu|4gH^j$^8*HuT{iDM6Mfa6{*K=R;_Tgu72Obiz;Y4{=3!)#2Gkt8{|Bq5Dfk7b}M zd=Snv*`Ou=s6?{h2FM{2I@t)P%cJM451Y(LSzgEp@b=z2HzIQ&Hr;0k_JZWCG2VUj zQa#oG1-5Q!F=Pb^p<}qS>E*xDlcz%O6O;n2%6(N!pD&Nb6sj1NGPy-@UhAxmw(y1>zpLBQ|N zQsqzmXnRzCI2EBtcjwK#>&i`*T#k6Ok?&kf^YI z^Fh~V`zo-n<>cN%4Q0KY%ZSne;sUub7wx7EQD@9!e%J=|#FECC;zw;*ibh2mmtrDB1> z8v9Y);#dILh^I)9TnRQh)RZuGW!vxNJy z3r+p)_e-7vFO;iN*dS;e{i>Gg-csyQ_aRpDn-RLDpJSr4c+A|b`;wK%&DhU$H5yE_ zxGbl6Y!y#t`1IpM284_R4?4b9z8oiDsbe?=sS_*+OL5L$S1w4+e$p}bm>_^-OER6t zSc|9WN2pJtv#*>kr!4gh3Pu}dSAP);%x^B95*sF2e#Ppbxl}0l#e1{jI@E8gx{v4Q zb}qSkYr88H<78(OPwd-t+i$<0!ufI^@o*^yVZ(UyLSdC0+vRyl(Vnht<$2ZgwL<_Y zHXHI-b9FJz`Pcb+ah3F%4Rguc=pLhM>8RaS1wYf%v4oF;n;m40Uzb19`7FywHGwpL z`~4LC9o+WYaJWMb2J3pV+cJcC#f}zJv|pxKY=?^GKG{!MyTV^1MbzVwn7I0dooGr< zVKKNl#_MR^n|6_|_u26V9U^H9NekIlr$-I0J;Y>bRr&&t|9YWlybskNh!&Igjzhnv zt-g<1Bx~$fNVU^c(c8+S9MJFK&)ko-YfBR|C#n}(?T@B4etCOMsc&MAH`a4ohxo8x zG2Ol3Z zX2FRr^)DEqRHc0qNBe!KN^{T(?0fIt2bJ_?P0qb)>jVfK#es69$)^UrS0e5-_tVyJ zqf}zIZmyxg!+6d^Wz(KMpcbspMt9|w&OcJCu8W10%zs#j-@d_oF24W7)g*I7=sZ>U ze!k}S?eCpVxcNG4jI>8W%3N(V*9w-GOVlmaM0fRTUsCMp#6Hp^5^}vT6KQGi8YnXjhSMIQB82Lbv=c<4aWE4y23gfF`n2A@xhny3t;8Icx^ zTQJH@M}1@&&`gw~Ayy|M?#y`|DIh@>DfL}jCm&t8V9A3cxy+t8&JUwRhnrBPZtyeV z+c)LrQrYr!ULUImODb%_62;9fV&jWE?`>9V-fp~@Y%v)1ljBwr-Pwd&#_GfERvte~ zVVb7h$^HF8p%|L(l{l$E#Z{<2wIg*=@sc@fuCVzKuAgu#Pd!Wh1APip$#^E4<|l#5 zsIwfC%8D+|a>_7wlP%Im*D28?2J7go>wa&ml@RFp!7^A_AaGDDm{w06j*Hb1r0t1- zQ{q_Q+!Mb4CAA-8q<;5RQu){2+DI_%-foCA{2P%}V;i7K%r70A5*dCs-~|Yd?2(A#)#JO&**xias~rl8c7mgLzcA4;D!6JOKmOH-u1bj%;E3PaOD-1Ne908MFV2;@CT*#Obfsb@t;kE6> z0i)F_^W~sz(OO&!sxAaUhTEtDeXO`Vc!;DAD>Cvf`)UV>u$|A<)@5&Bj7Ms`$)gxq zzjx>211kPaK_44Nk@^>I^J)@~akhTdMoh8(TS6L@4!XZGh5Iz|xu_>YCa3yjYjnVRl=Xy*(x#t@YZyS3c1I-$grx6TFz;FOW26xKab*|ouMzl*$Iq@6gPro zrYb&_P{#1j4OxGF4qrKp$va+gKA_W2Fk@9RR?$DoC!Kw1#+(Pup6VonqRr=7f+_pl zm-%BtjD8&xEtVp1MhSxW@*xeNSCem5s?^_i(++q>hz_Gcg7~g&Y{y4iEuSSiBC>54 zd}OcN&xoSLrsb()?^1l{kxg*1Lj#W0rLHf&L#a)7{Q|=j5X}goAfN8_&Q4kpX2z{k z9`alohU?ph_O7O}vyiTP(6w)39KPQE3j6)P{XJW6zD}RBary!|*D+C$PyysDRO5X7Zqcc=Qm%@LYd8k2b_95l zV-+iaia*MOC4^*APRodRPE?F&(bs|GFH`$BB61@c@Ba^y(Sz;BoVYK^|6R$L$^TF~ zY%3BkCBoIRz4$oguk8^d(_UR1XERy9quRd^5s736`7~axFMwqH%hU$o`jHE#1<644 zs!EUVPRQo=ND@x7wy9ZUKHIavJHt)2D?{l)I#hNePgcirbX1L5rQwOgNs4+usjIvCp<2)O$eI$ROrL}q z1a1^qp@JcK6uH4N@2wJoD9d_DWpC$AS!mJO{C9}Rq+PyR`CJKrh}=lVW+iu|c4lK?aQ=9V(T`yp21CsFuu3znmVEka< zKPfW#dwaxdYp1bv2k&o0q;`2gq^9Vh3Sf9=@s4r`#ieQM81Q$9%{$hQ1{l~13u>+e zbPrk$27*UGjy}|0K1+nKde`~bD=%ZGd0=~F_SbcHW25`^%blsY9-&3;t z&X!P$Jb%OWwy)1uUwCUYbMX3Sm-l5yIRU12@#_n~)Q)!*r@gC?y=7pf{&Qzza-#5S z)9Eh2!~B+vA>m^mu!+nr4~A_+A=AyrI&O!dWx?FX5gG|sIfs1hS7r%MudBDe-=^?5 zw@>0liO1(xt?H^#g=w7aR#7pOAFoxtQ{LTq#_G*Gk$r6~P>%*6B5rO3=(lwwIEd_m zlyZqBeXu+6zAFck19#>MCt|vvz(m&=2L)SBWO&{)Ix$m|h!7-qk+*0uANl7JWYxKBca!vy)R)L^2p~L5n;p;au4C#jNgV9qxUR&(nv=bl~Nd@ z2kBqO!<`v9QQ@Lz`R~)IHEH$raE+FAq6NMz`#4n?-da-XlK@QZpE^B)dyz~pAAGo% z+uy5jCWeywRbr9xu@C&@d7OAJe+>V{(u#&_5*x9O#NnO_xbh&5)r^?mB~%r5*FH_y z=6xbo5EHw?(fddxx98Qdg z4(98qlfi;V#UFsHPWE!?_9SQ;G%h0(gy>HGEUzgA&mY;vmCphjS&L0kRhx}sG0cR`4Bf$NCti!ThkZT578!{ zwBmd|Ds+Za#I0hG(Zc|U4t}mp&nedn-gHH( z=nx~1E9}(EO{Q9kC=J|E?&lqbGcAeAQ6aC(_B)JABuHycNHE#=>~T{4o;QE@WJFLR zA42^zFewo=vBJ0(rItZxY9h5U^dK}x56M}Jle)Z_ZJP~Q10U`ap0v*-xWjl~A|xB? zZwqrd+Qz72T*HwKM%oDUdoi=^Z3c{uJ3Csy>@O**r=jb3;5HT& zy2LS17-nAUsGkv{{v--hVY>6R7+WD3&cg>UP~C4%-;3GA;cC2C%Gqn`Yn1Pdk9&hA z`Bv}!2DdVHl8SaR>G?a&dvkFSD`=D9p;c9Rm?&;Pv{bGPL+`J(uUjZrQ!2@;sMz{L z-^Y^7kZ)gi^XEBx4Euc{3d|W|4HkS?6wM&b>qWa~bl4-Uwc@csrr`E^FG_5|Ms{(g z*6~-A@ok!oY)A8M_X+pHMEe!>S?!P64FggOM4LKGSnrB7>dS=5f|#_Rd47H&1YGXx z`fKv&)a#(6&O*DDZ4>tK5fvBVE>rJL6Af*aA#^MO$46hg+muY0uyi~oEJe!)Ebu#& zvB$T~XZ@HVlnC@}eOp`OS&pT*gjhv8Li@aKhKn)LVIz|&}N^+_;L7@c^| z3!yIYSLLogOAAIE@zTRJE_#dwi(ptp=ew`$2SJ(TxDEK{%WVdZtl@U)FC!%O(aG~> zz=-ypA|FMkvlMp4;T6T`o;wN*cF!3LR$=zoqIQ;1XnY~W;DreEO4ApKnmvo`&03*O zjtMDKr!=0(DDp|{qzkrwN)hLND(M4+6RMkfQ9V5K71>e(TuP5(t)I#!H|HfQ##+UG zQ*=vnMb1bTTsOjB-jX2RqyNG1)Yds@m=n@?CzK#@yj4n7Jt2IOkv2Z61wkI=adp(4 z6iyfUL6xvIL-zrr2OUDJ_M4iWbLgiA7>*c*TYJ!byN-Q{i0{cgu3@2O%=XXv#oI#Q z{smTP2J?8G`Coh@)7@Cq=y{dnH7{1Dm~s#L+jWnqVgITZ-axXt|F0q0x>aRAk=v8y zw%XZk0q1UbG%9ayAlc+wQr@m+3Wa~w3-!}vcvC<29hUtYBwO}Cb#ETwXWUxzC)PJ? zChUl4{9*L$^b(JD*ln=G{sM>dr0iZ+`+F3la{+_aE7JkMH2WrL^a&(niDkW_mbtV( zSg1QS=d1tlt^cmx&qtdAHQTdI(CpEX*2W)z0=ipZ!1LjDE1Jn7@s|LxUH$$(lZ^L-AWxlMoCR0%US{L`-TuQSEL_PJskdFHv!Tavr^)(0! zhr|m^M41|diSBtT_#=J)f*MqsZ6TD@z-}>&(xzlFoZ4%BF#;a`4+UiD5MS|MknE(L zm43t=&Lo{gQoj{oni-SO%97h#tKOykO926?$#PxKk|4ajpyEzahN|V>p7k%Z_!! zZWPe(df{&cL^PsyzA}0802S(JKVs0D{)%+?Gw+8G-F1#hxns4hiuj9|f_H#v_Eri| zKuv2Jj^f;}jtB=@uz3SC0_6nTvTNw*mgbuRt>W4TKid1tq$+9}9N5r1NjZ%W>5U$l zpX*(nw4>F3)L2ayOg$S(f>OU-YURDYga>I}r!UPp7hPT0eg*!49uuyEoo_(**l96^ z%;nVz5sDU7K`_a0q7D|(D2#k>q9d)J2mmzY;|q~e!M;XJGu2v*v(Pau#)%bou`pMM z@sXwqYort1>fH-h5T|+nYf;>#Io|xFG~)1@c86EJB~3_TF-C zkGHlt=unBiVRc_V-HxCBbRqL^(sa}B0~xkfop&YJhkL_J#%!IK#;kxu0IwV2vlv&` z>1q^69Z6XANS-ZwOGqjpi3;ODQEsv%F+NnAY_~D|aio3XQMox;4QVv?YCPqf;+cL0l>WVg=Q>ezT#pLk-^sXfm}jk6rWz#30M)b(g4HJ+M)9V2$?~L3 zIEV4R`9zRV=}~JIqzKChDJFBq^AEKzlx%X<=H}8I} zyZq)t9xHxQzxS6zOZz*KQg3{($DsRluV}v%AhH)VkQ$LLU@hz?utAj&2_egzTg8Y2 z*LYuP4+)yKk_fkg50D)h`l`(mB}J8qq|BoNHg)@ifYOQ7mZL(xIQ9pSPVJ0dY&CH8 zbM@8`9QikP#run3t)&n=y-1sqwWRmNZE*Z!nbGuc0U10jzRzeKA=E4K4$jhW7{ty~ zf(SJzfzR?rB@kKu5Kuskjl=aVWX3E$<@dibe@M^$%pq0XasRpdRQrX#fmyxEgKLS@ zXh&4F`YkTYm^{OkH~N*X4=Su#Re@Na+(3hDLn8CDe2shun5l_N>5SQAz{8xL2^3@` z0wbGDZ3w7}t8{c`3PQU+dM?X`7^Kj)1%X}q0ZbHI)z+Vw0G1}07&!H0rgly$2vOe` zx9ghA`E}E&9D7oj9PH;$gh7Bnn<0zw=I#0#6uJ?ZZ_sACYvf}K?qt{!lFhK7x7y@<8?+= zLjR_F$CuTSifZ49v(9?hG-{%?KjA$2{2rU|K{f4V&d27IPFMQf(Xs7XtG*R%gcgnJ zueOw>maBA*&`lSOZ@2lN>F?u7{8YjtEQ30}eJqW86q95~FkdHzg)dDq44y@Jv8h=1)t`ha*s_brzp_iQ|2_7u$oEzvQqM8U~lR9q0IM#c!~&pe== zNj#k8F*v=9ox=0GC|AV9M+xj)j*<1CM+S(%w|4rxN7Ep6V}vTB3eFd5a@L3a7*tK; zrHxVckePVM>hu$&M=*?a{6^CqE6TnjUZ=XvEA1sQI0v}HtG>}85Z|8lm098Dg#Pj($;lrQ7as+LJHbA%;Hi?~&BtJ_LQsP4g0y&)J=jjcxSA z3R1gGKL?LsSBJ7J zP}L)ehiRT%Vsu~E0C?3&|KAeK8^%%*-R{3@EdBS4rRx8{SO)(G#?s+mjOCxk(o16^ z#+HElegBnU-q=x2V}GHQk6O@7ckpP{nyO8l!L_%{sGol|>qRjt76^=+d`ZdMRsI%B z1gY5sd>6kdqWqsxw+g^v`=QmI!+H_VaJhd-gT@}4Ja z<;9I|=Ei~JzL;>CO_Ur=JZ(cUAqb%zijuleup@f5d{k@@v{@pTiNG{qvyh=NStk)+ zuF(Ay!R8cBD$7|UhKP~rT>l;`G-(GUn5%!=QU6LX#p-VoOc7rqHjTd+%SZBY_y3t- zDn-SflhN6rN7(?3<-i1uQ!jh5lHc&Z8cX6NbfIVLY-+|QM(a6$i?Q{5e0o_JU4-m! z#!}@09biYXKc5WX*hFE*I&7BSdmROcu^YzHRrVSOXe>P)G_PzLwNB6%yK+seXnq=M z79W9eBgO`w>;18#qOcr_tHyVgpZsntmB%`6RhoaqSZAr8|IX&rypAre{8wWMn8J-+ zAAbA;6f$>XNBu*L#S#mZG1=^OF%-Hx=~YMOQ+3y8E0Hym+E(lXVr)2-UAIs_rjJQZ z$nnOGI{3E)b9-6%aC**_SHinutVimdPzW`6@77V5KJ^IyZFH(ipt1D$4y54#X)q+J z4NT!q-p7|TpF-#5)M`JJAQX8g%jO>6%8>nF+>B%IPVFq1NorKoV8vbF>w4<-jZq~z z$J1;3?2uyq0a3iz_jb+$&wE77KC7;}2@n3OY~qC=CY z8u>C>@e;P4`jMZ{rpq_SBbBvN`iUKAs~nym8BE%q+Z}X^IwjVcw2L?s*m_XQHEJLt z2tt679FED7<5o44y?nPtjy`&sM|L%=>_s3XBTugH%XY$V?MEu90gRGu$4J@t`KVr8`>4rFx{N}HhZ z+8g)Pzx5Nrz9*{oh{Y*>*Y3WXB=5XgO{dmxtAu-1nfS0Pf`Y!ZYIHv_DZS$5jDR?^ zf@DatX;%+u6K9Yiur|f3rjNPxfN(o^Liu`ciL=wP7j5`Ss>a0v=tA*%=;A@z4lyHN z1XZ^mSyFm`K|1a22?jbAUD^4CMZrMpc;7kKOtD**$bzU5r%^SscCj4Mpq@Hc^eEc1 zacuUH0gWticld$JqdQM}>U3YbXK&U-%m)}>$BPil$DPHZr1(UjW|+>PK7tZi!3H&_ zqL4s*{RG|y$`7~E^716U>&X^`eTerv%7+t{{!5INsu&LHFp1>pa92WTEmb~demN=< z8!62qE!EY)LnCNiFLe)ve@dRiF^2+6y7kF!qzylfE{Hs2-fv2)^FV8F?KsH zHzzDN>QkAll^rR!`HX`hW*+>8BQ(!RI2N}Aj~s%^VW-|>!$B-OZ`BFQawV)V#~xzC zr7V5oXT@ak)6cM*$BTy!-Y<|fHQ8r!QkyiKU_$GtC~zfW??QT9K6_VYRIwmEjs)!+qF#{HESOVo+F zTt37XA52stZ!0W5atBWQ?mT@|`%O6dTcqXJz0A|Lb@eL0siAKtEvN0<3Y-D%wIZQ9 z-fxA_xSpCGq~q^Sl~ocN_+G1;cP)R;y4BD506#VvbXZbLFsY19js7bC-dPvrs7rKP zV!!?^B0KiIj^O6d&%BmaaP08CRHdBnsnpYc6fV^oTjdt=?K1C#Pn4cux~cO%K)|2U z44BD{Tk1x2E3oV#V`r4R(5QV~{hwQ=xYiS&uTC?$wAZF)t;};5TX&rPtU=ssD`A=c z@mk@jo|IhxBYsNywf^n&>SIZmHScNpsMo0A2v^0L^c}o5vB54UX#+gu&~0FMc-{AN~N)T$6|l&r_I-q+apduCjKv z+7FjVRqDC>c1ldka^XsI?kNws*1f6ap&7Qp-@sz^LYh0Mr^SZOrZZXw%gMMwp_lab zNK`K-F+>A$M{11{CSWEFGS>^RQYpT02JMo(dKWrhz`t}m%?#zi=F<9rMGf(%)bW2Q z|N4K1ObP!l$kc;>B2$Jh{u45#@&}o6JKO|H9lR<|;JtGiKyX;J-;h$?05a8w;%BH- zR>+ZVNd(-VVXCqcG`k)GoY~*V6z}Gc_t=BY`en1B?8+n|ApZi!rFKrgfqL6Q@aZ(# z&P?YW6QO(*WH0yE#WV0&DUsNM$0uBCbC<0OcXJJVj&wNkKe|6|%gR7S+HRVG z<6jl&--1KO=LVVb`A8>?#cr+ULjWLCY-mw`@~^*39aN-@1~#RS3}Pu6VDzDm>^7)4 z!2L-8mfn@pZGV?KT8bkO@jdp%(QoFOiTwResGie-dsfMTeRsk5SCLPRuv`K;GSPC))8BY{(9niucjU>$Ja`7Nb98!s>C^`DBgfRIw`jdYh43d`tWYoLbiW(|`1hu+%^H{p>{e)=%88wJUR?)D(?RZpo z@>Ca6tEeey@sWxX`}h+truuQWkP(S%+vtP1aRSo1@17)JHubT0X82q;&1XjbRv9eG z+ae111$tjDOG6rqDkQJL-f9OueJbMqst%rNSd*3`qG5Oa)Zg7v{^}F?H6`Rk?F1$b z@ zbQ&(}w)W%tT8v$BN=GMt4h^VCJI0J=Cw8a+?vJbro$Vl6oDl-0gVi>R`Ex?LZrm!Q z+gM9nKJ9s)5kcsfwu*MNC1lm{eJE6(-nolHn(E6Qu)S}g%T&_+DiZ8A75NZ)T}PS# zfdGO-K59Q0;|-I9t1*8-9%-@C`zKLga;b95sL->-A$wq4%0ululd_ljb9JoUr*xu^ zJ_Qan`*Ed2%Zm4v_YV`0FVwmx`Pw(h z$R|Id=d4d$X(rdXEL5DAkC`~Xgx(P+nK84RS;S+#A5xrrKo?EEdWAoTzq2q%Z{!tjT+ZC|ekpQ-hNYEytBEapm{d zR18rS<7~kdTTdtQr{0P@DMk|xO}q5VmD{${2rWcqhCesL+s~~rHV!j1;E$e1G_Vim zkg`^cV`|(N_5&_UVK8Ba5DPp1UfArcb1#o{hdFbR0@tiBmiP{sNx88THw5L2Y z{iom%C~ONPd#oo3H#_}uD%Yp3^t7=KZJ`LLKs5buOyNWR!t)V9Lv(;n{LM498a11C zl)XH0g7Cj0;MEn%(ga@?ULZjjGzQ8bEOX?h7aRi(vi}Ar=R0}p*?Yct*ZY*_Na7(M zLA+iZbW)e4x>ySk+q$cDEgzCRR;*7}I+h4az%tn!0Zx zX;tL*(4%1obLT??jLhaO*lKq?HeVyCV0F0AHj*aeR0r!})o@`OXpsyX_s`z@w(V66~PCsVqzxlbj7Afuw7QCJY22R`}-C_4R9 z23=7iN~!_?T|&U=(mc3xg9&pX`zXl9o}{CqRMgJCO*t$1N(((`x&Gky$FiBZ*F|_JmHvce5_ix;wYT+9u z$peVy+_%iy|3q_819t*GtHpl8GSyMZq5^-|S^#57g6H8DLGCPf@h57pkkh8S*GD3| zt-is>pYSBt&d+8&x3RNhGTY29Uy%__+#S1{-(G2&``%1qgOb!dXqukVTx);&<9tXa ze;6usTAMN@4ECR+xtsl({tp~HzxQhZILR*Lzu=_5+@NMthI;^-bevS8gzvgE7^Jc$> z{6z6@I0eR%+c;}nLRI0Mm`AYg9IBC>H{6X;p!`|%KVULZHXQo3b7R7&y zvo}*usig1FF*WYAon{kB=ygxxZ@gVA9jtqQsvL0OGYS?u^rynR>d4cqG98(GW_$%) zQ+U~)uF3z1RAS;89ZPtAX4S6?mgjv>vpzm=y8OvcqYj9(m{Ox(g!-?SpI*vECoOzv z0o@u`pS_cVPEnF#_9-r?x|3Ern@AW(mYw!XO-^ccrxYQu{K>&ihodOQ1;KNq!DY%t zxunUaU}~D^&3=_LORwHg(xN|P)DypD-H34^O9uDN#=DjaO}K5t93h9Hvnx`IZtr6y ztsINHyKDj6bXVXhjLcJaDSq#%UlU_akWbl1$qN`bvC?kFqb8)$j`uO*z~WYM=&53X zAe8>hnI%P{U7j$*E-5P!19hSxwCZe(V;=M!j@zx!)bEn$)of{SWCxR$J&;k2jilop z7|`%LNLKJ;VpCM+o10{(;0!1S4 zEm15nH8ASca`+wnD>HBNd~e?7-%^$cpPN*Ptfccx|K`%DE?7@RmJT`tE{uc1JhYS4UeM ztwE9}9EF8a8SLubgSy);ImO24XgEj}z2GqBBI8bb?KBf|5VW%7g z!iXj3#8X0AYqnC1IrO}#pozY5gOaXOL>i=T+#om-t%M2@$%sf&Ht*oU_86ts;7)+Jg+$-&?-a42&X)`BW|;TN6P>4kjRs~m=e z*kQF`)cagZ1w5ecyjk(V{VZoY zxh1(^u@Vy4aShJeF))$(^oYV0KIC`H-9kI9Q%0X`%_kZCQi}vU6yT5&-!PF51nVUAjfQ*(tKbWoPFkmdlq$qxW zWL3*$4zI$Rlq&m~f5&n`jy&$T+Ka0JWaI&AcB(Hi{*FXr$}uu$Nv*CtaGWwwcmdR zBue}g{EgU>B!J~GXRULJYMD;KGK=2+u#1qvHS$f!Z4nDBW~>gVv(FmfGT{hrn#UXj z+^(LC)ozkMsw93vzplT#CniRE6)&-D9XA8o?+Ih*x7@g77ZSyj!&R>i|-QqV1KvYI| z`&FONqcWf%U-UbQbI0Nkzbj^U0@W=ip%vFX1;hfZ@`ZsncMN!CoCEaw(TZXtcOxSeC=BW;!{yTZ7 zMqas5!Y9GXZof_5RLIZmH$Nvm0Cwp0otl+50TZH3KX@+p#Lo!{_x%Rr17eX&Cvn0j zJeq4em=AcQj0dxxpB*;|D{6^<3Ry`$o;$_*q;V(1YSd^+)KuE#Eb02!kVxLPXvd<$sImSva{9R844_`zFkeBDqc%D2fm5p&qYmUH<* zx3;w<{tx!fE2;^8d((kXLLikQozQ#l)r8)q3xY_Mj?$E-Um`WsPz4mEccphwdha5j z0@9m+Ac9z#=sD*0BC30H5k?K`>ZSxJcSPG?pEES|}^)!r^l-GW$K9aibw3K`rW3vr%Oyc5X(?h@qIU zpRhA97Yz@yFwf&?=T}n=ywt;~aOeJbYO+R=4}C}TC7r~`y&t`0gxlO;J+jyhR1q+R zZIu_Yy^Bz{|DVoP>|6CjcIfZ9s-1PcP&5&iMd47Db&nDe>z-n?(HE0DNJ(D~PrNq8 z8_yezVfYwtCjoJNL`TzI0mM=&b}P=UgriZc<@K> zI`!R5kjxm~36G`JMcELJs~S@Gy48s-=yl#Gp)&I4-z>)7&9CT^0=tEyOt5qkm!*>c zid6z6?om=&`#BHeg{T|j53#rP1Fd1C7>}qiyEU1tB&M6zoy~iUraV21SL>|H z01TC>P#jU4#4!w$0l^$EgYMcei#XO#mu1jT-c4MsSc8UL^r4`2f7zj;a>TpJco^K% zLG_}bG(fO#Lt!cR+1r7^c?WihF{t1dIxuX2G(5x2 z3^A6;^(45gMLl4hO9aX7)O|~vhI6`?u>W7oBfr}Rs5fTOZG>q`5DV98Ez}P zZGpG-o;)v|3PD`A>=+KXA&i2nL`0H3rO)_{9wgDc_K`L6Mq@suwhhS)ZIMYA!HIm+ zg+$OtfD;{Hof^(b>$0kz+gw_tNT>FmVi?GAA>C?bP;kzq$#$W@7R^&@qlLJEs%Lnu z68u#0ooC3b{u;Jm;L9M)54AY_`$}VxkeE)uh0*B!% zQ^TOv0`6P2oA;jetAQ!cX&5MI$U0A!CR(4T?j0oszB{o&`y!5gagAZil89goodY0R zxpNiCfVLj5g5#Y_Nng#!l1pG8J^Whgfre(#_@Xn}j&Fn5E){!`3MUjZ+1wo4vAc;* z#sLZaKP5L%IwiKW0k|)$YiL;LooS&jg)BGC9y6kcGd{CL!XKb=j>l(h#$?k)LU{Zb z(XvvK0H3?ul0g#D^D&NiLzU=Cz!RmwMaR6VhGHAvuevIBqF+gP=*NMchP3=M|ngsxfJE;UB^>o#jo4j-YwGQBSJRMqD^USzJ~W+E1vqWPP#CFxWnji zRVe+qP2KtmRjK>4PeAjI#CtF30vDZKCs6@plGLOZ;-9YYe3z$FZ3u*0V)KKPjP3^_ zhnbch!{k_rszX}EY)f!O$-t|Gx_ryM{fB%FiUW>7yxMA?4RmwzRj?s3- zJFQ|uko0tI>#xSxh{ysJ-p1aZtL0u74pwOPA=p+B_d$2Q9DYE00XftzWdCXnZsl1g zpda*R(~1jseK*EjqU=Z1B-+nD0dFT?(qGND!vw4j{f?kCW&81EcJDc>wbe7fnscg3 zZXE)v>+zRkN}@~cE${;lHli~b?s-_2q?AY1_~8)Sw}{_jxGqdEOQS_2-<{69CkzZo^KZ14XlUSr~YRB}DsThaOPpNyK`{RCo0jbjh@ zpEb~+AisV%Txus*Op&Q5FZhqv0Q)zi295+_!jEnK656|W9;gs+bQ(7__DW@bPy2 z=%0*Qt`zBEV~|n6v#chwj`gN@_k=fiR-*rNqx(=0A=VyI{a+cifA?b(DImtuPp`O2 z`h18KPynpE@}90`Gw5H0ww?2hCS7ky%~tz=t%3d!+W)!HsS{mlqlmA){{7!se@Yn= zU25oR=}TL!NjTA^HmO1>+SsrmAe?-=DO~!m#<;QTo2rj^EonuV*tA(6aY?ij8}B$z zepo`*#Ti6aLHBo z)}@@-SkyKp|C3RZv`PGvQ9JtfuL79=exsY5)mSzRY+x@DB>ly&T>1V>)tAGH!Pjzs zGHNQrUnR!R?WACzDi3|xYJSG_^#A@j8*=T|!m0p?t>pT=jt4YU@cGh%sHJ40)}Ws^ z`SXCOiQc`^*CAe53iQDms(%co=gEdK2zaK^E z$DCT27sCF|GR0g*JFQw!J;c;qo-_$btc<>tPD-cC&4U!(n(&B_9J1M~tBj*H?tTDQ zVOIj50`|hR+Mvz^(!M7D`mO%5la z(`;^YE%9^838uE{9O*(zwJ(l(-l3;1-K?=hxuOwWn@HNSNLkPUiM(|tcLMoIp;C`C zEP8_5s*zS#Y-i;18un~9dk=8yYSl(OKh#1CtKc5bl|gV8{89iX6f#bf zYs-%kp`bZzqRE_2N<>V`UqYKWW!>Oas}D?32lR>Ae`n#Go|7Z(sxXddc%4TqfXSi3 z5Z6F+S|JWXYa*3qU0S1mp`d?>*V1I0Dw%KqN<-|MNXEu0oMewlPcI2lCJG26CjoUj zSyd{~R{y!to$!#bJxKI<_|)sVuETu$z9kX=(G|xHy?MoaPShG4z(TORMEs{tm5Bea z{|o;iY~fv1k=7_8{*x8;FZ@SAu0i52{quIBu=x-D<96#~2Kyxu|7koM{R+yqeNV)H zBF3r$k2dt+F%{9NxuA@jFFU27-l!S7?8mUeG^ZC{*taj#`;`6%>jM`M>zu-|MG ziOAhf`4Hhyo8GL`7hlVAgDitS7~Fc5f0oUR{%HL%EbXGVy!Ph=5&v;ww<7T`8 z{)Wc1qanUegNXmc*5P|dmRj$4iaHT2n~*1^tvt6>>r=zFR(PMeyxa||L-YMCV=tPj zmSwk4)g6Bcp$QIVkF85vKj1~vsSdpM zt;(|mB~Nw9^!n+D{>|%Cyrx*|h3^uW>$istDy92d6L$6E@uL#!4JFE{fUEp+lU}`O zNKihoc^A-9rbr4IT1&L55iEO>B%3x}M|Vt`#2=L+t2=C}d-F%TaN-v#mFLt+b{xe6 zVv0a%vU+dZ*odbc2b5v&ROnykaxY5y#Z>9!n;%1yqFaXM zvF{CIAAY}4f+kZqTuj0N-GJae{okJ#%RBhl zzm6~(`4R#zYFdnb8~mH@0Rn&kk^fV={r}TF|DW#pzeV@F1aw&J1Ll9G8Fz!8&BqH- z$#>57Ky^g?j5m$`rELA*(LMfmg(9W8YlLrkYmcL*4nDQ?Odm-0ZT&t?tXC(m@=;N` z(pBB{Aw8mc26}C{abQ$cG{^vbEms0Ek7lh2u;P%3=&!b3?g!|-KE1Q>Ol->+p~g6P`*C|f&PPepzq@3mYVk+$l(@*W}rjHOknJHL29Ot=40 zwpOzEWsa!sJY6pKhhza3YhbY zP>T81TYCpZM0)T$>H*wZk1qTQ6?^koB$Rq-y9s2R|&iW{>6!N{+(_gwZf-Q3xs=Dh0Ss=wC{VDewK-ReBk*P=?Nz% zB0cohfRln+^M4~fsLcODdQ{GW{}-gkK2GhwkRDVwTz9k~`ByTP3Cnxw%arEk)-EE_ zL$D&Rrn1z>S_2thDBLG|i`<)_~ zZ~TzfI}EwZq`s;y57!m)N`?KyuE381^hB8>u_TP>Ha1YtLwONVQo_HoUDrDqC>U4! zMCNI5l8*r7{fi>bi~z7NO|}S4J~>;SWHQ7#5*N70!#E9aN9C|mwA8UJ(BQjp0)+`B>rFzIeY+q}@Tbo!`brxQLj(2o zzEreCtwNs zamqxbN3w1xI~9;}t9{t+l8E%EtNF_=bZkkyf^q6FEb;x5vfssqkzO+0{EwP4_q!Cw)FY>t*(|k3`IaG!6?q3rCT^xx zZZ-Fcb&~Uq9y^d1CNj357{P3g3uOiPfZtX{N&e9KyPRCspmSI*kLwcuM#i&LOL8uu8|F~ycw}sXTZI3 zYrYj*x~3X%pCeU6wCmMBPmcu7XcgfT_Y##sYuwWe!=OckpQ!AHrh41i{gDTtUP(Z( zZ6NJ?z?PpTREffe_8EGW&1H%8R_m#eCOB0Css{e;wvi~%)?ghcoZD;?MV*+LWp{nA zXazGuPc|73oZxz=C&LwKoCst+O;T&60ZchzqJo#zw*_`JrM_aN2LO7L{?{I&R*Dg} zyR9Px`L~fS@C>-30`{sMn2$dROYxl`t3#!Q!W40G!}EYPuQSncP>D@#J?MR;1HMiX zAZBMAT4)mPe^#zu6YiWSbNvBxM#QRwMbe{gV#+*P?jNw{$LC-pPr_rNyMF@qB2;Gy`nCuU(f4>Nt$8w|bZ6pxSjO%;#T0^eM*Q}Cj5Shpgc zl^!&2a;xX0(nG_^wrIBid#o-{vpy*NE~a|V>n5hNK9Eo8!(@L|JMddk@-SHG;A z)2eQKrOlWv^sjUMGfmO6W%=lh$g76JmxE$@vQ>0vR|4$Vq|7C$Hw~pHd8Fk`w^&c3 zwBw^D2+Tv?5V}14#&ffgX!`lLVZd=E!Zr=wKlwft`H`vJmJ6$8?5#PsY1Mib{cDLH z@Jd8IaH3~3sQi*Fdk3ANacw!k;OxSrHJM*&>>q>u>C;KBL|Rox=17`slycOyqfhFxq{%IU|Jb{O*8 z#Brn~BiA}*xDTH1T$`$h0k+)k$%u@SqBPCN3_H??)95J!3=6=|kjb-z+fjmkoX(oT z@^L-K(JkwiJ9iaQ1{dLezTY`vmoa~KIDdj&TpD@K@>7cwLWWDvkQ&=^f}@*wtEYtw zEyDw1e@cA+pgg*RQh(HxB6wkn)i|rh!o)j)QLJmbgG!TrNkNSpY^E<-^+Bl0>cF28#Og@Kt7>6beMKrc5?Lrv3Paq* z8fr+hR4OIg(Ag{?XSVUSTw(>KD%w1|nP*t^i5^@n@bu}52uP{J1|IO@HR|JB9~%Sm zn(I96(_OMMj?ehZsepZ2Sg^ZW{yNoE&}U38g_eL4OrH=e6^IJI>n6_uo{3`CEDX&r zS7(;g(xK@_B;F;{Wx>o6;=UAfiwf#ryJ42`qOpYMricE`II{>{XFvozR)=!hEW1~x zR6NSVBudF5XS5MD!r09fJZg#qWRy_6-P3{9n^i(JE6EfqF~21U7{)@>Rasr@p6{h=ZV-hrhgRsks(=kj1ss1p<1I zlQ$%+g*6fns$G8EAdKkCAw-+1U8oA*YB)3()E&_o}$;AQ_k?=k9BOFXPW zneglLpJLum53dxewS%{^NhJ^M;TS>c2N zNza-~`603D-N$u~ZkCK8_RZeB>>U8}M@O7yFiPe{U6Sy;g*^=!;&8%1i9Gf7RKC-o zvfOYY)00g;j>r+xy$H1SnuWl%fzcT~e(|`2P26}I0(DfM1zW!fhzS`t?WspY!Q0(g z_b%zBtfX^F8g6#YDIydH;}Z(Fw|0N_3=so$emkt?N*`T&!`(GwZi?*keITKiUk-3+ zHQd#|QVdIQZ*be~Hk~~xsbKs41>j;xJ(bQ-tUbwH;rkX2Cg zqOte0`g#{5vr>eEU#d~KYs-AA$W4$GypcCcpy+U_+o5K?x*?AJ!i?X2)sw5yK^&e%w#uO)9 z-X3-MbhsJnvSbB;88So^-id^F2<`~9{o^hPVwBz*|6x2L7o9{)pv;X&a}Wt6GeiQ2 zd+n;nzD&|fq_U#OZaJf(eeW;0$Nf@va(jt4C4D)hy94VYlA05c)6af)L|S57PZl9| z`^Cb3>s$pbhGa*ID#77Llo+jHTwxI4c1|(n<9Bg0ztgkL2ad!X6|Z=hYKhPD<%hON zV5T|yZ3jvYW$I#gOoII%+0xKC>frf(gG}0rieC$Nf=mO&#HL@_E4^?73z^+Y^|8Kb zV#|&`GVKlPHt*!^lA~Ej6i<2Qp3V~;{PMF~Z!jL+H8=(vf0qqQSzBP7&hcfwOqWjX zFKcjNtKU&O-7tM}70dM5L{Lp*kSGB#NYAshHr5tGy58X2@ev`;hrauIcs8jS{NjV>}x_kVh#Mw4Jfbhwl z4{3;Az{}(y)uzF^JRYhfItS0AuA8WdWEh;H@ZbN=pN|t6OZH&T|=%0gl9T%o*Y54jv-k^uN z+FkpsmcAN;eNnDO<{uwuNtDn-%ZBNy2Fi~x}bF^U|0aax`*iw?sL=b(N#|qn5hIxv3$R| z8R8V^1?QQh$mj=JQ<$B({R2`JPVTu|r3&CR*<|R)&r^a6z=4;HjM6sFB1~z<8p%$k zEN^HTM}g^TA?do=>H6Q)b59sTQ&J2B5!y@{mql!ycOjFEbfo}DJZB;c6IYT>2E-a} zu1I%o!Ypn^oqIw?yJdTAch;eN5}S!X%zc70RILU=ND`3*UwNPmEYHR`d4_RxCnJ!a3$ z-gp}vhInFPnyp|eg>8=7VtOXONzME=q*743Qyu0v^6b(dHV>dCJ%Q{|(aA??f2)0_ zeFFJbo@mO6q4-YcC>cb?nP)(f5wHGC69>J$s8yX^5WJBcI>TVdm3^%*_i9S6UL+Op z7)BFU*rl7TvHnbwsz|d=dk$apGvZ3Je{S#${j&-!E+IN@!D3=7>T-VmDHFyB!+lDC zb>(N?w#ebzD>lKv)b!~fH|X60VI*MsB2Kd7y^?EwrE84z&-StnD%BTIasl6Iaqv{{ zQM&ta8q0TKnQIwF!7v&jm{fb2(G0Z-PPyR{L!;VLHWg6Vy;h)EkZeN2aLAeUAg)}> z6sB8Ho&@FyjYD!vC-_RGYnWci2q}+T(6Z{Ov@3Z0RG;qrg6>N<>%ugBZ5(ZNO3Dlq zT|-@k)Cnw3smfgj7NNtPs*hylsTL%GOx{3N7nGQ#Kwq`fjd@lZ&QL3i(4rilxkSLC z+e5yg${%wUh~XHzZWLt-(SLD(^vrRgJ+~n@9mM@=R(;XkUHLq0$bSdcr`ogb4LFY2kzp z!-OwJ>Gr$5CHOVOo8(LT#nNB1G2iw~D#t|$c z3XVUK44tZ$2Qo5qFN9ONd=RaIm_9ewAy7db+7XOUq4T7<;_scm)y>LH+sBG)rjKq3 ztM0n44>yno*j}>sLJGtvRN7@y2sk|an%%ITjOvmtcSZuS!5un{O{)XaO?8Jz;nIXf zXkEQWD57ho(a*^`;UyQznts{IA{pGV16&B2?}Q=g9x|`W(MxlAU=O%m1%Sc~GhsUD zo%?>7(=EVX2{>v9WBInJ$5-p==a{Rc*Oa%=g$YY^JF|2r*s=KpZK_DvOq=8|t9mRG z15GvR!#H9>8NoS2ZHJG!MZ;}jHpY#id^;_&MS~s|f~iQdSLTTGMW7ey)8*IzxS2g)~rwH=%|L#*nQM$Pe8G7v4y3Kb9aN zxM=?ZH$r*~`>x`-I_X?RYzS07e3Z7Q?p`jutDvORx=Emb>7M$K@q;DTImS1a?v>wu z!Y=@ev@`uoYt&$~rnN4(df$gV8%)&qkQDp^oRVu z8rp_khb7F4kNyh;+#b$6fpmC|e0&H;|K9v@yY+c)$~w3i?)O^Al$mBMcfV`Z?#QvJ zdZk|)!1fL1<0Z+qx8{|XxIZCGTlRLjstH=x@e?vB`((ZJkk6=C{Ql*UBMv%tI4%{O z3xAsf^NUyyJt6Rzv8=$coTIlCMZP?S_#j@>A||o#m~6xl3guAa$-P@L{+|=! zVsYr!18(^fnq_9jICK#=$r@QN;l+xp?Gdq-tTr)4;T9+C)%&4o+`3RVg)MHQM@{<` zWwLPHuxr%{L;p7t%()YK_Mtfe|;?C2PFcr);^~oVDWuNwyGuUF0oAXF}X5ap@E~`c(w5V=P_>T5T0>eH! zR81e&!luSNL#@Ge2s+tAIIbvuijFpdYgZx2Lgr~#5K3$9q<*AX63pigpAD|M-OJ)siB!o69|zCCK=8Br`}A9 z5)(Ve7alzP`x1Nbcv#Gh#Ls5$Kx(D#g6npwb&xtqJu|4-%i}vm%{)Q`-QzK%!J<(! z^0;cmsKnthH+)_UE_6AWyifh^!Q!iD$PZ!AkxRexj8fVrNgk;=s;&a+mlDj%if7zU zVAUka3s;#=?jG@(rmlQ|ZxNvOli?H3;3bMM0PapV)*lEdRhB=-4QvaT6N zFKXYPWxAoA#HRX?jLB?MHh}0)!qRAm7cH z{Q{r>jknav`#}UOPA!Vra^Iqo<%CKGyoe3nY*CR9=4rl0PiZ zE_uZ;ZkxhW`zf=JWJIa(3fpRXu{?hFGL~^Eyspf1rRxEU{Sz3+46cV_T!ZE9^%@e9 z9ptChdnliXonHOR+^(&y1hF`zbgZbYTVe=TYGT#RU!muyt8V>AGv5Z%Pi+#%AFC;u zhEB_ug(nwQeO`<2IEQ|TQ^MO%3qK*TY8_6%)#k)@CiY6eF%bEsTB-QhI9U0zS}0MP zJD)9H2~c#A6mn%{EeCVC$iynRQp8qsfq7GnxIqP8lDeD^-a{BHdB7j}cGV4qM{wP# zyDVOVp1wujelwZ!tXma>^zmk_QiiEtW+;+OuJ8LjBGjSI{8v-OE_q^8qG&qi|X~o z<=ZLPBDzy4#}mwM?(rK^)K8lmPf_ze39#sjjrI7P9^2u1W8KoqF$Ut9OYA|MMg5Zd zURvFxElZW-pemJaeQly{5XC6_?!3@$J;a=g+~~8fiPx0Y0++ckb4<6Zxc+%nP!=m* zF+fy5NNP}bU+(6L1rk;bC}Znpcg-K!equc_BD&^Bx$BwlLZN$6c;|@Cft4uTT)dU6 zI(SxCC156K(q^5p+nKyRa=0;P(jc&e1MrM-g|6hr8Xn!a*XH(2Imf%jTxFe!C2r-3 zh*gc@i(N`Dm*0xZBcJ`GEW>VLo)=}7a5zsHwxk0;=@ zp=RuwdI;9lhkRsJx4lk`Kgu{-N3-zlqh=O!GG~^MdXBz(I#0t0L-$(ShGmbOGtzV= z@VCgEKkOrvn<1L4)^(Ih7Zf!lWPYfri)bq9c|<^YgbY26GyBdgP~_L`F+LZ=Ioa=2B!T529@`ZJWN^j^TCId@8#MD?ZOz?sfLA z)X;^T6Ld=Tben}Td4f4mP5$IfaJ%RrlPfk;{|SA~|m1ae$k zpNu6o%uVfVgxy}0l&5yd4NV@$pk_qIa=ANx&~Z&DVcM{{8}FRmhEPl&2uH<6RtL3Qj@Itxss)PP?lMg)WF-hGX4pI z(l92;<@a3q$3T9@EG!wC?M=mZmwujR&Y{4p?I)^I!_?0_&DF4JtctHGt+ce0{N1NA zZH+28X(Rzx56th+T5D;&jI&xeq(C4&G`SK(WqmIz zzyCbNs1sF8_MlE^n7jHKZ`3oTJ|aaZXRg$N25L2&Mr!BpRyy8Q^2k0oO)I2dVEg2QM4 zav%FH!MBd{q13&kpBnsRP2D5Hry+vGY?AX(Q0jV?XhIx`T?D+>5Y}ocifk_`rFEGg#or zyyta|ttX&VOd931Q>uVs^D8xYA^3aR$WoRQVf9mO04u3&M1QvgYQQhF$W`VmvnWDA zJS$#({h7<^OTOBsR*d>>;&3X|_duV`D?M2;d6UCJAB9a1Y0iEZfqZ-xPun9I#1J5PZeoI zoBoFTWqij_rRw?-uKyhm|Ip*{f>fRW9_I?yXD_^5);>6HbgIgihFB8%yrvz3QPHekG+!``E_4?4VR@r@G9qNA5i=~^8O8k>HcU` zhW)3D4yF7%*5*+_kQkMUScF>}h?$5l>o-N1+2P?VpKhuA*rZ`|i`Sjq2I+s_a4d%g z^eeohFb)48&l6ffU|+#-{)#4h?mxkgAT54*XJ1%ni%vnoQ+}6y%QhLoSa69R(!L7c z;7-o`?2o2E6TNPNy~}HEF$NxP*A}SK-Y>_KEsM-{IjXIa1Un~09!Q4kiaqP>xc-5Q za~FGnAS3xCcZn{hP;=6R4)$c<;%>H5iHFzZVmO7!Ir5t?oDtAgwIA`EU(Hd$iwGtK z1z}n=P)4Xv1AYAVD*hNC+#to^*N$7nQvOV=jp#l{DNLK!o_HmHQ-(*{%9OuGuhG&X zs#@SY3G#s2D3(+>iUeMcKEujyZU9)8;4pWbAZ^+sY<7Ga*l}3xdOQ|-44~bFQ|n&k zG{tiE0Crgb%JH-hvM2)`+AHspGtI$`u{fLr0LX|HIuH{Op}Cwfka^FN`O^zQX-+kP zR+prqQpo|eZorw)0BKf$3=bCg77L(F;{&STQ2=rQ#k5m2Wbg4DI_C3hG0D>|1{(lc zr4Ps0Pxdj9=4mY8_=;M8-$)OBoCPVf6bsAhJ{svqcY+jY(v(HC2!NJFTi5`wC#e>D zwEx0NGybY~ispDMrW!CEPis-F^-Pxp3KF-`gj+7fUX_t>NRJ~YK4sy9XINSHry!4? z+IOql05r62wu6POvS&Xa$cv6RxXyX)Af!i|Ff3{2jo2~M?!_kE)04h)03kju$agiN zeyt+AB>3Q=#KoSzMePJeO-nKoq0^xQfL1~l?`6$#OF(+u&j7IqxF%=FK;+XwAr%^4 z0X)V68?4y~TO8;GQ3qZSFE@#mHp6EMgLk}j$uJVe08LW3UcyD6k!HdwGhSL#L)m;p zf?FbSE_PjCC+KGuE;3E0IPRHnNb6`zSB?l)uEfeBu^N#w`c-83`s&d{6~&)VKtH+1<4ihpWI$w$2FVWN z)-vPx#@OL>!?@ZeX!rPdu|a}BOgIfD1SM7dZj8{~T@H|;iyS~(5dS^^8=A%uC>0v? ziUa^|WmNfK*(VljzlyoQe*``j6OLRNpa zMDUY%)<4r0RCtA(5zDPWir0OV%s5RVV3Mjkoj^42OyfuvaU>v8P=*PZJPsrqOAbln znVyaVOyjJl$z>mLGm?r+#IkiymlHn*F@ho08zeyk&`mqP5F?w?|g#7-(;XF`4JY8>j z@NPmtaN7@$D|;;ERl&)ZFD#P5?ZXNC)sAMU4MEZ=7N`vUq)Jp;_@bHW+3NrVYU{^q z41H=v1#g@}j5yDnmJh7?Ku$Yqj?=WOc0csZ!SMxyfJlT}#!S3ty(Q&?0fRjo>UMOW^YYl|47dRu4cx>3V zn3Cy|^7=HpNAP{RQVW%ZMZ1G!vj%1K76ersd)#hQv8!(!F}kcL)hP=yUQLQWgNUug z7qSWT2We7=Cy<~PD4%O+0e#zT~sbFh@e-~L$^<)FkubS2DG zG|L_N>hiEduPqpcD*-jh&^tc|V*}L=3S(vC-T@t%0W?%Z2~(JnMN#@O15FSK5)a$jQV59t^QW|%H5!D9oUk!3=$H@zwk zRq_}J0bR-3NdGbnSr;vp)gbx)$bRBm&oc>AP8$VlUMkAhl8C(ck=;?qF@R&m=+i9r zQnputifcXVR)xfyguBaF*(*~Y-;rEQAfa}RAmbXg)~2icSEd_$~P}JE8N1i zsY7=Q21Mf+6}AYv+X|du_zQ6G3()%jwBL#&ez-mP4dGo8m`;{P*f(kj~svdXJTAl z+#{*CkZ-%cBs|-6NstoC{a8y>SO@-LoSvBYjuI?8&+zd5UNYPR(&p9H8WW+F;QTxH zb|_4<2b(jANiU@;|6&vGF8Rc`)0P_-q1^a&)T<)P8;`~Q;>Gk5)_!RgR=h1^wMd>( zSZs9h>R|;%b`;02)}@_8_$;M_;%~m#(I}Rnberqei+YFrOLkT4tLTMQT7}`Ar>30#1KkU_|pcETlRbz*uMg_NCrK7-! z8wxCo?eWJxWFcvXVl-5%I1!N7n_7~a#}qHuSnh8_f(#DkOkQ8J-|){DaC#?oqNY2> z4lpX+fP53**N(p&a7%XKl1$EU^uz3QW%aWvSLY~Q zn%?iz{9`mw7f`_iaNNWiJd67Qt`!-6#3_TF4<9E%2M9gZBU#^nRUk=aXmDQMe03<` zPy!&GJmJXg+c&H^Sgl^C89+wBo|2wbqDkb-CKwd&^=1jHqDzEh;^=B(>s=%nFdAg# z*t=dSxX!z6!9ZRD$ww6ptxt5pSuvGP$+k?1*Dos?z0Z3I+T{87+R@ks7X*rK!1hym z#CQzr*IInHedR+b^6#JQKP5uXVzm-JuUOwx-&wls4IY>a)J@+sS_zJjBI~!{$UO27 zSgBpX?|R%HV%~fM9b~{emBs5&>ie*QZVjFjiR)M1x_fM?d^!$s5;pN>s6BWr`=Z*K zFD(6^;g}uG9tb$~Y43c69K*PF!1d4H0LT(8cJBS*bF1X&s);!l!)Kb0lQ+Lsg2E21 zLjjg|jCV9ut_77-K09E-P76IU$Tr72pp^zg4<#fvpMaWov`W~ADrLUMw|?E2`HEZp z(RG!}zqJwm?w*I&@tK1jzWigR0+Evck&OLZa!Cb!`E}H-j5j#qJ2Wm}F(KS4k3I9e ztaXE7c(BaGkl^4w^$8?X1E$o)YPS8%s}R53x03Zqm3b=^-F{(EbjBs+_H7V$ep{8_a?Cy5x z3Z<3zKiECt9wu<<5o!NvZBzTc2)^KUFe<>b9No_p(t~LfK}` z%dQn_BnvGsTCh!*o0XaIdiZv~sT7&m8*Beuc|FqM%#l~uO8DKg?cQh=1Hz$Bt;bGi z#QV&Twk=8v_F8WD#a6o?QPPTeU)(jk4E;h=8S&0AF@296t~}A@1R6S=@>5`4d>Kt z2wyk37fJ#ac;ip?Hevnolp;Vrz)89(qy8$pvwuQ7|x@l?~GLt;S+=O)p5jbdQ z-`uu?4W*I>DvOFZZa>HQ0!@F%NBCUBo$L+#}p(` zttoatC7*CQP@m%qq^>|ao-<+IyLOn%-U$676v7onTjjEJ{?1)`Qbq%QW$mu>b9eI4 zQ%}qnWa+1B3e)xjO}~4^FLVyvQ!CZ$+HF%6zcOn=<@XkyuPIRYz20qMvfVbqldqk6 zrEz3X!xZekIJ2w1!ZBZSxZF)Y-NvL0dlu#bMKTKRjiaZNAnA1F zi>zuhQ~Jbg?1?r(b^c3{UiBU7LH|ymyQC~;2KnVo`xm1x&8zMHqAcCHW*>N7W)63< z+Me$C6q9p6e{ZSXNS7P-$lhCj{7?xA%f0D1=XlJsWmvpbyk4M8nM{$)(MvC4_vEjRfuz74yVFw8kp2xJJ1}KhY`edR&mSq?j3g^l#fw7sm>#H*_GPCyXUDaJj_#q)`^eo@+yW zWrO3Q9(+%-^;EXOoz0ngyi>2SRryejz;>b3Uu0DGk4%=f+))AE#9Cq>%;iPHysyjC zeIzscfKvP3SQu99db4#JyXUAcsDR@w%r6*-yjzzYYN3C5bw4*~s`ygC9J@GOKx_2Q zq{@5)LIrD=nKTX&e~%aT9*+a~!LqXD_`I9_@jy`Oxi$k^qzDloe;s_MfQNoVhe4G9 zk(w$%L~O=v@8e>OrsSWtmi+^HX5L-vb$Gfj8Z*_{yke6-{}ERE|Hb(+ zwmu6(88QY#X{`0nM{|?|w&w=}irVsV(FjXDY4?s$$Ugml;rtvM_&obV(GM?d>pd4Z zCOz@uXYFuN&%Ltge0i~K-63*ScZ2FXe?`*OEz>%Yj-jBI`-Ik30z}(5ZO?5nf1hQ& zmzaUo2vsQUe1G4x!s*Ec`qV2Y!TG8o-nZg9joJbYWEcPOSpE$bbd2SJ-+oTIaN}n5 zcHb70$lmp_8T|C<^UOzOp3&(BO`p}rJ)7e?A2IFRM)GNt5RLCFBKALvC{jJUbH>7p zN$K&UIm6#gCZ~#yYN+l0JPP3Bh+K2w(It92a}wvtrQ^y!{oIx!S%MBzjHy@}mT-gc zy#jo#3V1Ar^_j(jLAMu$tai1Q$ysX*rZX0`)FW_ykPDrj!T!vTdsO`!!2yYA@et9jcqO~JW}e0 zFTt3vp?@%{zTMZSsK7bWla&Mzmh0MVJec)I;XJ`2Mk`|UCO+rh=5d9fC|6c|VpO1Y z@g(f(8c8dyh!H| z10Ggza*e~YWn1wp~bXUkoA(0tc2E?S3Q~O zr>3jFL6{l%Z52RuOBO$>{C-5?W~n%>;>nx4??2gWX#B9!Og!ru!>!78j7u!;B>~;n z_?SygUl#4Z!IQo#aK2&2dyO-@OFubU&%L4WPW|Lt#G|n`Vd@Jj>w-xZcWJ?gMlQyY z4*>Nq>T|}Cs#)6U+vtVzlmwaGn6QmLwYcA(uNdedzQf9U9W~d<+SXHwc3vqOWpZx> zenKV=+us@{2F@fw8v4j@Hgrb+;$~UDKd|_rd`aEo;DtcO;p)hl=H=tBk0y<{d*(pr zZyZ5nuZK{hf=~SK#c9R&_^EUfA-wuM4EB3bZ2zrfI5%@*VTDjV{r{)a!eDcZx94(Y z{?B2helN#=Xw!2G@%H#cYZ#V@`;TEIv4tUad>pGMsgLHX>x({?k-3T?F*d)~iL~4& zs_GQMZnWr1^~)qcJYr!zqJZoJKjKXcAJ4~u{)=t<$-YU&TpOF0Bj=Z~fg{B{M+185 zP*?QpB^vzh-sPyiTCA^vJ|DbQ|8gA#83Bsb`r}J9v`-~_wXX`zl^I;|uS?5x6cE*p zr_ouV$FSrPz8uY`);*(EEeL~t?lpdYq|A^*2mmwOQXM^Q4X|wu4 z|FGnns)t$QNzZWzJP9ls06>=3a3l}1j@Kb}U}s(F75i9}lLa=WOc)(J%K3h6heQ z8k#CqP%OV3d1{f14k}UN7Qa*~Mh{B5oR^D@Z}BLh}zVtZ5|7 zA9<3pX+MGaMNT&l}PtGpYj9KsPxP4-)&;@h9*7KEGXg5XBhjTN)tktgECiZ26= zzl^?`bY>o!?+t7oo>tp4f9B{XWi1o-4!rYP;no|e`_*!!O=}k9%9>kv?<>dMx<;{) z)dUwBZD`+18_{TTr4u}G@wt(V#P7e=^b5np6Rle>-&xf#&@bED=m(2!N$$Eyk1Rhc zYp%P|kr16VNkZMveELvk-`q;ox^y*2Lg?4`_>(On%N?OE88yy|)y_Yy?pqno3naM@Bh=$aHkux758QG{Z>wTXGI6Q0>cl|2xI-H!Xs|Lyn1`|E#DI(yETNV~u;Nx0f>AMIN{59-bhexLK5 zGXKWdTqj;`uL|U_z@T!hIsA9d{m`JX^0|{7<|QQ{kaJo76|6)lkwj7xT6poVG`Q5b zJ^7}(=-k<7kxI^epSaI43xG#VT2_QVh46=eDb#;7vMBq3Hno}JzP-Ollo#wXm%tFU zkt>%dGLO|&59-&3E9ne8xBXm={@jWaK<{;vbA#w6VH3g ze9uB(96T{}en_6a`|efb_{*is>G!o!uw~pU1asiH<9A^2YgZcTUaxt0g89Z0wVs;w zp7+Kcse0fNJKnEQxgDF?6+aEg`Dai+h~~WP5r5S~xu;Cykg4#*v352%N02Hf#*HC_ z$v+exI-P4f8~e`r2Kp_}U$KC^7{!#X$5~v@j>Na#sn~-LOJT&fHsx3qAh{ zS-O0-`Lr(alTXbS#OcA2%Kba7FHCt=(KA*}W?z3^%^tN-f$dg&O#iZX=>lEf`4pZ2 zat9Vo5!-Juu|f~=6R5IO*clnYp~U)TPy2K)l=>J|VahQBVJp^S-jM|seeX!RK46DR z)f9OCRuG#e6GUup=|w77PDFl+jI=;8N@qq}qF@AyyQQp{Bz1&p3+l@ehN8s0y>v;t zB}QXH<~N4DQYOg3?4glutl)B#MWK|VACki*_WE(GKp+MNjT7~YF$D+NnlZYH0yp)e z?m(sLCm3gz;*1L!KFWykDaRa$MEkg-(9lqe$Ok92kq&s6S(!{Y8^&;kC~{kY_Dq?X zd!I-{xnKfj?T`WF@$pG5@j`s@m(7r4rDE|bBpbfSk`_#{2*C(X3g8nsSImXIM^`{G zmhMcI#mvOx1bS+CJXE-G0Mpfi?tn6%ImH>*Qr+K-Z?i?u0Gc=o_dX%E?>_vZD4uQ~ z@}VV(6OW|SGY_?3-j>E+B$fS#(v)OJ zzm&t7N2ZaFBm|KMn~%_Dth~X^ANj&7 zTQH(q(aL;W+n`i7ku(i<^h8U#;!VUY9K?j4Nv9Q)n8|cm9)D7h7E(%;BlB3LFz#2d z;$WdvJeZtjO#><5kC%;e3PE>vV+?G0@v}^`%TF}35-_dkuyQ6Z9Q*grpCp&03eK9E%>3$s_IIXioXG0Nt3R<_w%%t zb7dous|EQqhG@N7geK{Um@~r#vBD5p4$i1(4QI+vLZQfVj#^|oyCK)fQg|UHlh%`k zfiF7;!etYJpFAmoPG#l2M}5d*I%;K7AoJ316)XA$hHMt{p(HRBkv@gq{=SihLwHVT zK}exA1c+V36)-%3>xMqV$s!Hx3+*}3f0yH(LKSU_ip2e%yPj%}1v7nc7K5Ln_&+gu z7%D2LmRd~kY7E(=MIkQ?Nry3%X~~Llo*l!}BM~90F~m01z0xuZzdNTjUK+9`Vt&Ye z_i|}=35YM@4of+&S$@tT@?UFlfhT^S9`kivQx{x%B?vx(#@zf=p~m+xjRBQahDqOt z*O+GH8(h3-2*ezh|Di&fouZysyinys_Of%fLNWfHXn>(ANxw2kwyaAG=nF-kezhx_VpOmuUnSPN)dBCia zhNvNNG-Ewe{Ao2`jCyM*N|1#4ERJ4gsLk@IRxZR;I8o+XOE_|(j|k#6{MEp|>omFg zZbps3F!NU|QlJiQ=Y;Heg)1l1BKuAC7Hsj8jyPC_PbuylN=Su4{aGk6nM${QOH0i4mtbK1{I{9q|fH&H)N@P&Yi8dcxW>%reOK z=;|YQ;~b`FvcuubkIlui!$zQfU?1HGf}em|*!`OOisjnPN>{@a*Y?_>6YbI~ovQor zoja&+U#browQ9!U(VS@IEq+iX@XNOrz0BCz-KA37EeGcCGGl;r)4FkXhx>CUrxp}D zpv+&Ok4?K-oZ%nZ(E0l9*kxg<;+{7*k$=^y6#|g@d<7hQ71C%l5&E=$4s-hTb@?QR zu3yUp8b-(Y^j8@0Mzlw$Q0`4PTo%^%iI3Gc6{(X8RNO40|AQ8Btdv0I`FZ-8=PJD; z_7%nf1~3wMs#m$Ee^VIvkOR2XzPULcZnV+Q>W3WfPMFbt$-yUnsS=26XJS)s4f<36 zwI=)4Sr1Eedkd`=@*re@fwqn>5~=4=^E9NC*A^W(0{BS|S_vbYomn49qT^s}$*`e5 zNM|@-;=m9pFC5_U?6u!-fmIIi2-aZG#Y{S+wxnTc#+FBOVWsNN6d|lDj3fM(2zu2T zOuMyMA#xKp9O1%p0mUgUmpjysPqafyUO_jv137jGvv4NC+VZS@D>V3X}Y6+OJ+(6LY}IED-6&JUxWzscGl+qw)t-pQ?|C z6u)bDC4u;cQD=j(NC9g`6D)$1hIrQ-E8j72S6k=s4|J5C9rwINUm3x=LLe$m+-RFcfc0N=R1K7g9yy z*iDS5{r=*Lk3LYFrM-8EUaF|Z#!TIL)=J5mhTt@3SQq@@OnPh{gi_0k}7gh??gr#O&t3{&N7JH=&Ih5}`;A7uvzOgRGk+Q1&@ zl^}-i*a>m@33rz4#CV09+j83%N7dJNSSxyC(avI}RozVcvm$~O8)rMfD6Ee|1vHHV z4jkCF3kGVNKT%QU6#3o@Tf(%hMV{94wadGP;Mn^L7_a(&_JGtLD@8*5W;i1eG4V*r zY)0;69CM}ul#jeDOR3QYJIf$92ym;So*!7|N~%TV@*)zybV&pB#rTCd0p52_>t+NX zl?z~SV2(M|_7eY^2B@cIP?pjFpoaBjKfAZH?M%{BzOhT{K$K-bXjQ76G?dgBV0eK} z`Zt@ZKhU|njO1ZYjG7chAw8!x)#XOUo^YxB)f|#pf-Y0>NTF5s7O(I(x7U9VonVZj zUTFwZIIba*i`e6OKGO%@Fc(9^H9@nWW(0~BW&U3N?1XKEdzQYI#d;s!IL?^thHPAC z-X=)h`t#*j=@ZZDxIn?`vJwc1Lp8SnA$tpiip{$(C1$ID*d3tHl<@?-d=@=@_c5a( zKcHhuV_NXUR~?v@0o@!bFYa8DKFv&~BCoWFfQl2!sCw8Uku}j7hemEcx@D-G;fA$T z5YzSc-@yFXmPxC~BDpGzve0FW{xZJJ+SmB-C9)_ReqW0T>C_YR4S3_-LC)n0H)=sl zWId{7Y2)s}uN+a)Rooyo4#Y<=jKLLr}Ot&@3Ya9hr)?mw~ct4XVn zUY5mfc##1+I_s-|bo3%&Sz@<%tQ^Djy=(Rm$<905w2N1wQ`CPQzU8Zt$uhJ6?2Y za3-+)Ii~ADPdqX(|G@zPseTiV+5{TPV=S1CAu`D5v*YdC3Kz_{8-4fhjvYf~xyJJW zb#By=DZ(OvOYFiayQqwtkI4Nl#Nya9{^hB!xM7s}&!&g|ao=SKWq@yO@qy`=Es_N?7ATw`V2bc!Vqmya6tQ806){J2@`#*7h!GUmwE8>^|ou%Q#f7k$l*qe zjKFhk;!D1Fb8`z_MBW?!T$gFSY2?l3-c$)NKdklg(FD^8*5Du-*?NWklk7%(?mq&` zI-?y`YqS`p`(%2fr{wh;CWI$NTA9&PH9AaJb!t`fXbIy5Zv@+(cVXO0YA9XE7B2(x!}6K28*jwK?fFQdR9M7%&+PO>Cd96gsg0CaHj%#eI7D} z=MiN(>uYOjt7P!MnIOJ^5sE2a*x3GsZl{b}_qshCJwAT;&fr;sz0B6S`^gbY$Y-J002m8qSsnkAsM_L+6@7Rls+P*pOYSo=v;BG^;W z-CnksgAV*VXwslC_SD%}Ni(NXm(Td|tZ$QTN{+}H7z2g1(hR(*uIg={%H zK6W`8VZuYuE851tbqV9LZW~VZpX!b#(pvl~iq&FB|rlHNWg zE$jucgUnPt761-VZ+0}^h#W4i^5gl1xiI}F#2}SzkHL3P!SzF-!X^+TG+Fqu%!u2(boGC_wFT-9$g=} zXoH!qdPksZ%`=z}d`7;L+sjk+9noE2$!H8s zAqPF%X7>iOAWhreu)~;a3V1gq>U(SVJKN*5st7@<^FYs^i3D3Oi51(I-9H_k*O%ixmkV`>p^`mgKZ`?oZ zcW)cME>9s>N7DZo_(l#f=+A^_kSB_;jCDo@;RG-Cv(~o;slk|?$UZ6^*)_c>Hvrvt zkk!UfDnwLJi;7qcYnxqD=@rtzAt>3Yt)*9=v>KCFE#w3kOV#f)U%fy<(um1W;BA3d zA{lO_cbPp^O*U_YH{j@LWO;P-ou~pXKlknmAK_U@O^U0#1^GUb%s+>25^TG}Lk>4m z5_vY6ig;Gs(&~r{k#DW&&@JlX6L!tDv&i{8<(A4
    (Hxbq{uY}jACc(+hyHZSl2 zIh*K|pIzw9!ECNIKdP((e5fii+Cf*h6btw-Z}0s+ww)RbmcrnFn;FbMsQ6`x9RV>F*`n3tz#JRWrrSefgWdED07V-yYrDE_+~MytK=@Nra)i$b=`btkjS=zL`C z1N+*Dft_%E0`*!+I<`&7IG6`oGOL23BzN!_MuPtUGj6PVl)EO{4D^f#3|U5tTPMO` zXwXvI2dvL{E#6cT)xRR#av*gOmv*+p61sY??}8@joUS79Z3u&C_V;u!GPfE*c!8cq z&~4uOiGRJnr(1VhzoqG+^D1gv z-q6auv_Ej9XhUudvr~L_sWpVQzuh;FUpIcFaS$o=b#U-&KzziB_-D>uIqD(H=Xi6e zbcE@QC%v6CmFr)W5uGkrN7m=XsK@p!qV|qCTlXF0q?=~%EVljm_i##wtz~gTWK{IU z(wqe#aLQ|v8)Z_=M`e43^$`1Dt&R%jM354|%|n3uZG#%9cl=oIF8Y^rKNuCfuVnMb zC?*jg3qG9hk)chfM_wDd$Fv2{fKGOYbJk1I9oWs%|FtcuwuU$ zpq+}h8rQ>k9f;?3h0@M8>&uuNMEU+%=D;ayIeFjY%xLG6fBU&NC~ZO&p;JP<@*0#1 z1SSE0p&Tlw+NA5iR~l!K8XMt#;cg(=G(t^JUsd}_{?AIJ2Gm;=svnJxNekfqYFj-p z`|c&s_`C1ZzkVnltCIFBzQlq1WTNIazd-%?U>n=uTRQovr|mfqUKXywNA578trNO^ z!yLLRg4OFJ*as1T5e}Mnekp_Bw{%xQ%7-%V^M5SSR)75+mUAFV?G3ncmlDHv*maTl z=Rx%+2`PZObIPa1v(HDda*Sa-XJISS6^WOm9~>~#gsmw(HC~;$Qjm8kV%ui%G=uBk z&&D&sb)UuG3PqolyDt6X_;!nvu29c>u~)0v+M0%^zlsIt^<>%3{+$DlD{ml8TQJJBNkl7y3oRUY}>AZqNSGukgEbi zy@;4W#0yhgiD}o@vZQ{<3yws!D18_@2I7M1x;U<`&9_D;g{ zWVD5i7!lZ)XASyXnUkPA*$QkT4B;!^V)|6>OY%j_-Xap$VJK-wn<0n+jF_npCzNm~ zFlgvNS40bnfX1lJriJ4y#AXB7osAXMw;&p|DqHZ6p|n|?o?AV^SQ2{Kk@3Lpg;Z|- z?lLIkl}NK>-=Cwq>GzI&?=1YVW9{RIkKUoASdP z+T8|4{eioyT>4C*QNu+dHp^`lNV9{qnW_mA=}9StGOi_1iy!ffAb##41TL3?pTQj* zf_#z~GeNHwd~>%>8a!n-vlPfod%*>AP zM>G%)>lo4;Ut>&niH^$oc`^*%BBY>Yzk-Zd!XL4)<@V=RJB4Ly3|5_j2w>C8Nts$G zQ4nuUT$2~$!#BZ*|qTk|V{8UsXg@0tWq5Vo06D3&VYzh;vEKVA7 z%E}udC8OEJ>Eqw#!rq2Rj5Lti152jvkTl*mB{^Z^2>q2_r0PKva@nX(VYIg>DF`4Y zlOpMT>z=D~PR?-6{-N)Ny?Zn>@|gWyT-iGq zIu<>EqUw0rP-8$;HqvP26&#iLJVfafSKQJOoJzka*GS^4D>_T_y&63*Ss462hD=CP zy{Iq>g%0%{Wsdyztm+Sjmsm*g;k!rccRNb-~ecd*+uzri%5a zqK`S$KGfffNvz9lZgRKWnR#D`qY<<<{VY1U=v0eMNVK)5^)E3inj!cYl9DFbEdyZJ zjx_X@oSnQ6-nH;Fo;=D@*g-=i(>e# zG!{nQ?_PF@6)>a@9^=DcW6e;24x5e{rDTIklX FaW_V}^#b5rgFYPM$4SB*U}iJw}t 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 |_B5G+Z$Ry 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 literal 0 HcmV?d00001 diff --git a/SpeechT5/fairseq/docs/getting_started.rst b/SpeechT5/fairseq/docs/getting_started.rst new file mode 100644 index 0000000..745ad77 --- /dev/null +++ b/SpeechT5/fairseq/docs/getting_started.rst @@ -0,0 +1,216 @@ +Evaluating Pre-trained Models +============================= + +First, download a pre-trained model along with its vocabularies: + +.. code-block:: console + + > curl https://dl.fbaipublicfiles.com/fairseq/models/wmt14.v2.en-fr.fconv-py.tar.bz2 | tar xvjf - + +This model uses a `Byte Pair Encoding (BPE) +vocabulary `__, so we'll have to apply +the encoding to the source text before it can be translated. This can be +done with the +`apply\_bpe.py `__ +script using the ``wmt14.en-fr.fconv-cuda/bpecodes`` file. ``@@`` is +used as a continuation marker and the original text can be easily +recovered with e.g. ``sed s/@@ //g`` or by passing the ``--remove-bpe`` +flag to :ref:`fairseq-generate`. Prior to BPE, input text needs to be tokenized +using ``tokenizer.perl`` from +`mosesdecoder `__. + +Let's use :ref:`fairseq-interactive` to generate translations interactively. +Here, we use a beam size of 5 and preprocess the input with the Moses +tokenizer and the given Byte-Pair Encoding vocabulary. It will automatically +remove the BPE continuation markers and detokenize the output. + +.. code-block:: console + + > MODEL_DIR=wmt14.en-fr.fconv-py + > fairseq-interactive \ + --path $MODEL_DIR/model.pt $MODEL_DIR \ + --beam 5 --source-lang en --target-lang fr \ + --tokenizer moses \ + --bpe subword_nmt --bpe-codes $MODEL_DIR/bpecodes + | loading model(s) from wmt14.en-fr.fconv-py/model.pt + | [en] dictionary: 44206 types + | [fr] dictionary: 44463 types + | Type the input sentence and press return: + Why is it rare to discover new marine mammal species? + S-0 Why is it rare to discover new marine mam@@ mal species ? + H-0 -0.0643349438905716 Pourquoi est-il rare de découvrir de nouvelles espèces de mammifères marins? + P-0 -0.0763 -0.1849 -0.0956 -0.0946 -0.0735 -0.1150 -0.1301 -0.0042 -0.0321 -0.0171 -0.0052 -0.0062 -0.0015 + +This generation script produces three types of outputs: a line prefixed +with *O* is a copy of the original source sentence; *H* is the +hypothesis along with an average log-likelihood; and *P* is the +positional score per token position, including the +end-of-sentence marker which is omitted from the text. + +Other types of output lines you might see are *D*, the detokenized hypothesis, +*T*, the reference target, *A*, alignment info, *E* the history of generation steps. + +See the `README `__ for a +full list of pre-trained models available. + +Training a New Model +==================== + +The following tutorial is for machine translation. For an example of how +to use Fairseq for other tasks, such as :ref:`language modeling`, please see the +``examples/`` directory. + +Data Pre-processing +------------------- + +Fairseq contains example pre-processing scripts for several translation +datasets: IWSLT 2014 (German-English), WMT 2014 (English-French) and WMT +2014 (English-German). To pre-process and binarize the IWSLT dataset: + +.. code-block:: console + + > cd examples/translation/ + > bash prepare-iwslt14.sh + > cd ../.. + > TEXT=examples/translation/iwslt14.tokenized.de-en + > fairseq-preprocess --source-lang de --target-lang en \ + --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ + --destdir data-bin/iwslt14.tokenized.de-en + +This will write binarized data that can be used for model training to +``data-bin/iwslt14.tokenized.de-en``. + +Training +-------- + +Use :ref:`fairseq-train` to train a new model. Here a few example settings that work +well for the IWSLT 2014 dataset: + +.. code-block:: console + + > mkdir -p checkpoints/fconv + > CUDA_VISIBLE_DEVICES=0 fairseq-train data-bin/iwslt14.tokenized.de-en \ + --optimizer nag --lr 0.25 --clip-norm 0.1 --dropout 0.2 --max-tokens 4000 \ + --arch fconv_iwslt_de_en --save-dir checkpoints/fconv + +By default, :ref:`fairseq-train` will use all available GPUs on your machine. Use the +``CUDA_VISIBLE_DEVICES`` environment variable to select specific GPUs and/or to +change the number of GPU devices that will be used. + +Also note that the batch size is specified in terms of the maximum +number of tokens per batch (``--max-tokens``). You may need to use a +smaller value depending on the available GPU memory on your system. + +Generation +---------- + +Once your model is trained, you can generate translations using +:ref:`fairseq-generate` **(for binarized data)** or +:ref:`fairseq-interactive` **(for raw text)**: + +.. code-block:: console + + > fairseq-generate data-bin/iwslt14.tokenized.de-en \ + --path checkpoints/fconv/checkpoint_best.pt \ + --batch-size 128 --beam 5 + | [de] dictionary: 35475 types + | [en] dictionary: 24739 types + | data-bin/iwslt14.tokenized.de-en test 6750 examples + | model fconv + | loaded checkpoint trainings/fconv/checkpoint_best.pt + S-721 danke . + T-721 thank you . + ... + +To generate translations with only a CPU, use the ``--cpu`` flag. BPE +continuation markers can be removed with the ``--remove-bpe`` flag. + +Advanced Training Options +========================= + +Large mini-batch training with delayed updates +---------------------------------------------- + +The ``--update-freq`` option can be used to accumulate gradients from +multiple mini-batches and delay updating, creating a larger effective +batch size. Delayed updates can also improve training speed by reducing +inter-GPU communication costs and by saving idle time caused by variance +in workload across GPUs. See `Ott et al. +(2018) `__ for more details. + +To train on a single GPU with an effective batch size that is equivalent +to training on 8 GPUs: + +.. code-block:: console + + > CUDA_VISIBLE_DEVICES=0 fairseq-train --update-freq 8 (...) + +Training with half precision floating point (FP16) +-------------------------------------------------- + +.. note:: + + FP16 training requires a Volta GPU and CUDA 9.1 or greater + +Recent GPUs enable efficient half precision floating point computation, +e.g., using `Nvidia Tensor Cores +`__. +Fairseq supports FP16 training with the ``--fp16`` flag: + +.. code-block:: console + + > fairseq-train --fp16 (...) + +Distributed training +-------------------- + +Distributed training in fairseq is implemented on top of ``torch.distributed``. +The easiest way to launch jobs is with the `torch.distributed.launch +`__ tool. + +For example, to train a large English-German Transformer model on 2 nodes each +with 8 GPUs (in total 16 GPUs), run the following command on each node, +replacing ``node_rank=0`` with ``node_rank=1`` on the second node and making +sure to update ``--master_addr`` to the IP address of the first node: + +.. code-block:: console + + > python -m torch.distributed.launch --nproc_per_node=8 \ + --nnodes=2 --node_rank=0 --master_addr="192.168.1.1" \ + --master_port=12345 \ + $(which fairseq-train) data-bin/wmt16_en_de_bpe32k \ + --arch transformer_vaswani_wmt_en_de_big --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ + --lr-scheduler inverse_sqrt --warmup-init-lr 1e-07 --warmup-updates 4000 \ + --lr 0.0005 \ + --dropout 0.3 --weight-decay 0.0 --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --max-tokens 3584 \ + --max-epoch 70 \ + --fp16 + +On SLURM clusters, fairseq will automatically detect the number of nodes and +GPUs, but a port number must be provided: + +.. code-block:: console + + > salloc --gpus=16 --nodes 2 (...) + > srun fairseq-train --distributed-port 12345 (...). + +Sharding very large datasets +---------------------------- + +It can be challenging to train over very large datasets, particularly if your +machine does not have much system RAM. Most tasks in fairseq support training +over "sharded" datasets, in which the original dataset has been preprocessed +into non-overlapping chunks (or "shards"). + +For example, instead of preprocessing all your data into a single "data-bin" +directory, you can split the data and create "data-bin1", "data-bin2", etc. +Then you can adapt your training command like so: + +.. code-block:: console + + > fairseq-train data-bin1:data-bin2:data-bin3 (...) + +Training will now iterate over each shard, one by one, with each shard +corresponding to an "epoch", thus reducing system memory usage. diff --git a/SpeechT5/fairseq/docs/hydra_integration.md b/SpeechT5/fairseq/docs/hydra_integration.md new file mode 100644 index 0000000..6a15298 --- /dev/null +++ b/SpeechT5/fairseq/docs/hydra_integration.md @@ -0,0 +1,284 @@ +## Hydra + +[Hydra](https://github.com/facebookresearch/hydra) is an open-source Python +framework that simplifies the development of research and other complex +applications. The key feature is the ability to dynamically create a +hierarchical configuration by composition and override it through config files +and the command line. The name Hydra comes from its ability to run multiple +similar jobs - much like a Hydra with multiple heads. + +## Motivation + +Until recently, all components in fairseq were configured through a shared +`args` namespace that was created at application startup. Components declared +their own `add_args` method to update the argparse parser, hoping that the names +would not clash with arguments from other components. While this model works for +smaller applications, as fairseq grew and became integrated into other +applications, this became problematic. In order to determine how to configure +each component, one needed to a) examine what args were added by this component, +and b) read the code to figure out what shared arguments it is using that were +added in other places. Reproducing models involved sharing commands that often +contained dozens of command line switches. + +The model described above is still supported by fairseq for backward +compatibility, but will be deprecated some time in the future. + +New components in fairseq should now create a dataclass that encapsulates all +parameters required to configure this component. The dataclass is registered +along with the component, and fairseq takes care of constructing and providing +this configuration object to the component's constructor. Note that sharing +parameters can optionally still work, but one has to explicitly point to the +"source of truth" (see inheritance example below). These changes make components +in fairseq more independent and re-usable by other applications: all that is +needed to create a component is to initialize its dataclass and overwrite some +of the defaults. + +While configuring fairseq through command line (using either the legacy argparse +based or the new Hydra based entry points) is still fully supported, you can now +take advantage of configuring fairseq completely or piece-by-piece through +hierarchical YAML configuration files. These files can also be shipped as +examples that others can use to run an identically configured job. + +Additionally, Hydra has a rich and growing [library of +plugins](https://github.com/facebookresearch/hydra/tree/master/plugins) that +provide functionality such as hyperparameter sweeping (including using bayesian +optimization through the [Ax](https://github.com/facebook/Ax) library), job +launching across various platforms, and more. + +## Creating or migrating components + +In general, each new (or updated) component should provide a companion +[dataclass](https://www.python.org/dev/peps/pep-0557/). These dataclass are +typically located in the same file as the component and are passed as arguments +to the `register_*()` functions. Top-level configs that should be present in +every fairseq application are placed in the +[global](fairseq/dataclass/configs.py) config file and added to the +`FairseqConfig` object. + +Each dataclass is a plain-old-data object, similar to a `NamedTuple`. These +classes are decorated with a `@dataclass` decorator, and typically inherit from +`FairseqDataclass` (which adds some functionality for backward compatibility). +Each field must have a type, and generally has metadata (such as a help string) +and a default value. Only primitive types or other config objects are allowed as +data types for each field. + +#### Example: + +```python +from dataclasses import dataclass, field +from fairseq.dataclass import FairseqDataclass + +@dataclass +class InteractiveConfig(FairseqDataclass): + buffer_size: int = field( + default=0, + metadata={ + "help": "read this many sentences into a buffer before processing them" + }, + ) + input: str = field( + default="-", + metadata={"help": "file to read from; use - for stdin"}, + ) +``` + +### Inherting values + +Some components require sharing a value. For example, a learning rate scheduler +and an optimizer may both need to know the initial learning rate value. One can +declare a field that, by default, will inherit its value from another config +node in the same hierarchy: + +```python +@dataclass +FairseqAdamConfig(FairseqDataclass): + ... + lr: List[float] = II("optimization.lr") + ... +``` + +`II("optimization.lr")` is syntactic sugar for `"${optimization.lr}"`, which is +the value one can use in a YAML config file or through command line to achieve +the same effect. Note that this assumes that there is an "optimization" config +object in the root config and it has a field called "lr". + +### Tasks and Models + +Creating Tasks and Models works same as before, except that legacy +implementations now inherit from `LegacyFairseq*` base classes, while new +components inherit from `FairseqTask` and `FairseqModel` and provide a dataclass +to the `register_*()` functions. + +#### Task example: + +```python +@dataclass +class LanguageModelingConfig(FairseqDataclass): + data: Optional[str] = field( + default=None, metadata={"help": "path to data directory"} + ) + ... + +@register_task("language_modeling", dataclass=LanguageModelingConfig) +class LanguageModelingTask(FairseqTask): + ... + @classmethod + def setup_task(cls, cfg: LanguageModelingConfig): + ... +``` + +#### Model example: + +```python +@dataclass +class TransformerLanguageModelConfig(FairseqDataclass): + activation_fn: ChoiceEnum(utils.get_available_activation_fns()) = field( + default="relu", metadata={"help": "activation function to use"} + ) + dropout: float = field(default=0.1, metadata={"help": "dropout probability"}) + ... + +@register_model("transformer_lm", dataclass=TransformerLanguageModelConfig) +class TransformerLanguageModel(FairseqLanguageModel): + ... + @classmethod + def build_model(cls, cfg: TransformerLanguageModelConfig, task: FairseqTask): + ... +``` + +### Other components + +Other components work as before, but they now take their configuration dataclass +as the only constructor argument: + +```python +@dataclass +class MosesTokenizerConfig(FairseqDataclass): + source_lang: str = field(default="en", metadata={"help": "source language"}) + ... + +@register_tokenizer("moses", dataclass=MosesTokenizerConfig) +class MosesTokenizer(object): + def __init__(self, cfg: MosesTokenizerConfig): + ... +``` + +Note that if you are adding a new registry for a new set of components, you need +to add it to the `FairseqConfig` object in `fairseq/dataclass/configs.py`: + +```python +@dataclass +class FairseqConfig(object): + ... + my_new_registry: Any = None +``` + +## Training with `fairseq-hydra-train` + +To fully take advantage of configuration flexibility offered by Hydra, you may +want to train new models using the `fairseq-hydra-train` entry point. Legacy CLI +tools such as `fairseq-train` will remain supported for the foreseeable future +but will be deprecated eventually. + +On startup, Hydra will create a configuration object that contains a hierarchy +of all the necessary dataclasses populated with their default values in the +code. The default values are overwritten by values found in YAML files in +`fairseq/config` directory (which currently sets minimal defaults) and then +further overwritten by values provided through command line arguments. + +Some of the most common use cases are shown below: + +### 1. Override default values through command line: + +```shell script +$ fairseq-hydra-train \ + distributed_training.distributed_world_size=1 \ + dataset.batch_size=2 \ + task.data=data-bin \ + model=transformer_lm/transformer_lm_gpt \ + task=language_modeling \ + optimization.max_update=5000 +``` + +Note that along with explicitly providing values for parameters such as +`dataset.batch_size`, this also tells Hydra to overlay configuration found in +`fairseq/config/model/transformer_lm/transformer_lm_gpt.yaml` over the default +values in the dataclass. If you want to train a model without specifying a +particular architecture you can simply specify `model=transformer_lm`. This only +works for migrated tasks and models. + +### 2. Replace bundled configs with an external config: + +```shell script +$ fairseq-hydra-train \ + --config-dir /path/to/external/configs \ + --config-name wiki103 +``` + +where `/path/to/external/configs/wiki103.yaml` contains: + +```yaml +# @package _group_ + +model: + _name: transformer_lm +distributed_training: + distributed_world_size: 1 +dataset: + batch_size: 2 +task: + _name: language_modeling + data: /path/to/data + add_bos_token: false + max_target_positions: 1024 +optimization: + max_update: 50000 + lr: [ 0.25 ] +criterion: cross_entropy +optimizer: adam +lr_scheduler: + _name: cosine +``` + +Note that here bundled configs from `fairseq/config` directory are not used, +however the defaults from each dataclass will still be used (unless overwritten +by your external config). + +Additionally you can choose to break up your configs by creating a directory +structure in the same location as your main config file, with the names of the +top-level fields (such as "model", "dataset", etc), and placing config files +with meaningful names that would populate that specific section of your +top-level config file (for example, you might have +`model/small_transformer_lm.yaml`, `model/big_transformer_lm.yaml`, etc). You +can then specify the correct configuration via command line, defaults in the +main config, or even launch all of them as a sweep (see Hydra documentation on +how to do this). + +### 3. Add an external config directory to Hydra search path: + +This allows combining default configuration (including using any bundled config +files), while specifying your own config files for some parts of the +configuration. + +```shell script +$ fairseq-hydra-train \ + distributed_training.distributed_world_size=1 \ + dataset.batch_size=2 \ + task.data=/path/to/data/ \ + model=transformer_lm/2_layers \ + task=language_modeling \ + optimization.max_update=5000 \ + --config-dir /path/to/external/configs +``` + +where `/path/to/external/configs` has the following structure: +``` +. ++-- model +| +-- transformer_lm +| | +-- 2_layers.yaml +``` + +and `2_layers.yaml` contains a copy of `transformer_lm_gpt.yaml` but with +`decoder_layers` set to 2. You can add other configs to configure other +components as well. diff --git a/SpeechT5/fairseq/docs/index.rst b/SpeechT5/fairseq/docs/index.rst new file mode 100644 index 0000000..591db86 --- /dev/null +++ b/SpeechT5/fairseq/docs/index.rst @@ -0,0 +1,49 @@ +.. fairseq documentation master file, created by + sphinx-quickstart on Fri Aug 17 21:45:30 2018. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +:github_url: https://github.com/pytorch/fairseq + + +fairseq documentation +===================== + +Fairseq is a sequence modeling toolkit written in `PyTorch +`_ that allows researchers and developers to +train custom models for translation, summarization, language modeling and other +text generation tasks. + +.. toctree:: + :maxdepth: 1 + :caption: Getting Started + + getting_started + command_line_tools + +.. toctree:: + :maxdepth: 1 + :caption: Extending Fairseq + + overview + tutorial_simple_lstm + tutorial_classifying_names + +.. toctree:: + :maxdepth: 2 + :caption: Library Reference + + tasks + models + criterions + optim + lr_scheduler + data + modules + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/SpeechT5/fairseq/docs/lr_scheduler.rst b/SpeechT5/fairseq/docs/lr_scheduler.rst new file mode 100644 index 0000000..bbc09dc --- /dev/null +++ b/SpeechT5/fairseq/docs/lr_scheduler.rst @@ -0,0 +1,34 @@ +.. role:: hidden + :class: hidden-section + +.. _Learning Rate Schedulers: + +Learning Rate Schedulers +======================== + +Learning Rate Schedulers update the learning rate over the course of training. +Learning rates can be updated after each update via :func:`step_update` or at +epoch boundaries via :func:`step`. + +.. automodule:: fairseq.optim.lr_scheduler + :members: + +.. autoclass:: fairseq.optim.lr_scheduler.FairseqLRScheduler + :members: + :undoc-members: + +.. autoclass:: fairseq.optim.lr_scheduler.cosine_lr_scheduler.CosineSchedule + :members: + :undoc-members: +.. autoclass:: fairseq.optim.lr_scheduler.fixed_schedule.FixedSchedule + :members: + :undoc-members: +.. autoclass:: fairseq.optim.lr_scheduler.inverse_square_root_schedule.InverseSquareRootSchedule + :members: + :undoc-members: +.. autoclass:: fairseq.optim.lr_scheduler.reduce_lr_on_plateau.ReduceLROnPlateau + :members: + :undoc-members: +.. autoclass:: fairseq.optim.lr_scheduler.triangular_lr_scheduler.TriangularSchedule + :members: + :undoc-members: diff --git a/SpeechT5/fairseq/docs/make.bat b/SpeechT5/fairseq/docs/make.bat new file mode 100644 index 0000000..baa9d02 --- /dev/null +++ b/SpeechT5/fairseq/docs/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=python -msphinx +) +set SOURCEDIR=. +set BUILDDIR=_build +set SPHINXPROJ=fairseq + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The Sphinx module was not found. Make sure you have Sphinx installed, + echo.then set the SPHINXBUILD environment variable to point to the full + echo.path of the 'sphinx-build' executable. Alternatively you may add the + echo.Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/SpeechT5/fairseq/docs/models.rst b/SpeechT5/fairseq/docs/models.rst new file mode 100644 index 0000000..054622d --- /dev/null +++ b/SpeechT5/fairseq/docs/models.rst @@ -0,0 +1,104 @@ +.. role:: hidden + :class: hidden-section + +.. module:: fairseq.models + +.. _Models: + +Models +====== + +A Model defines the neural network's ``forward()`` method and encapsulates all +of the learnable parameters in the network. Each model also provides a set of +named *architectures* that define the precise network configuration (e.g., +embedding dimension, number of layers, etc.). + +Both the model type and architecture are selected via the ``--arch`` +command-line argument. Once selected, a model may expose additional command-line +arguments for further configuration. + +.. note:: + + All fairseq Models extend :class:`BaseFairseqModel`, which in turn extends + :class:`torch.nn.Module`. Thus any fairseq Model can be used as a + stand-alone Module in other PyTorch code. + + +Convolutional Neural Networks (CNN) +----------------------------------- + +.. module:: fairseq.models.fconv +.. autoclass:: fairseq.models.fconv.FConvModel + :members: +.. autoclass:: fairseq.models.fconv.FConvEncoder + :members: + :undoc-members: +.. autoclass:: fairseq.models.fconv.FConvDecoder + :members: + + +Long Short-Term Memory (LSTM) networks +-------------------------------------- + +.. module:: fairseq.models.lstm +.. autoclass:: fairseq.models.lstm.LSTMModel + :members: +.. autoclass:: fairseq.models.lstm.LSTMEncoder + :members: +.. autoclass:: fairseq.models.lstm.LSTMDecoder + :members: + + +Transformer (self-attention) networks +------------------------------------- + +.. module:: fairseq.models.transformer +.. autoclass:: fairseq.models.transformer.TransformerModel + :members: +.. autoclass:: fairseq.models.transformer.TransformerEncoder + :members: +.. autoclass:: fairseq.models.transformer.TransformerEncoderLayer + :members: +.. autoclass:: fairseq.models.transformer.TransformerDecoder + :members: +.. autoclass:: fairseq.models.transformer.TransformerDecoderLayer + :members: + + +Adding new models +----------------- + +.. currentmodule:: fairseq.models +.. autofunction:: fairseq.models.register_model +.. autofunction:: fairseq.models.register_model_architecture +.. autoclass:: fairseq.models.BaseFairseqModel + :members: + :undoc-members: +.. autoclass:: fairseq.models.FairseqEncoderDecoderModel + :members: + :undoc-members: +.. autoclass:: fairseq.models.FairseqEncoderModel + :members: + :undoc-members: +.. autoclass:: fairseq.models.FairseqLanguageModel + :members: + :undoc-members: +.. autoclass:: fairseq.models.FairseqMultiModel + :members: + :undoc-members: +.. autoclass:: fairseq.models.FairseqEncoder + :members: +.. autoclass:: fairseq.models.CompositeEncoder + :members: +.. autoclass:: fairseq.models.FairseqDecoder + :members: + + +.. _Incremental decoding: + +Incremental decoding +-------------------- + +.. autoclass:: fairseq.models.FairseqIncrementalDecoder + :members: + :undoc-members: diff --git a/SpeechT5/fairseq/docs/modules.rst b/SpeechT5/fairseq/docs/modules.rst new file mode 100644 index 0000000..9631c93 --- /dev/null +++ b/SpeechT5/fairseq/docs/modules.rst @@ -0,0 +1,9 @@ +Modules +======= + +Fairseq provides several stand-alone :class:`torch.nn.Module` classes that may +be helpful when implementing a new :class:`~fairseq.models.BaseFairseqModel`. + +.. automodule:: fairseq.modules + :members: + :undoc-members: diff --git a/SpeechT5/fairseq/docs/optim.rst b/SpeechT5/fairseq/docs/optim.rst new file mode 100644 index 0000000..c332645 --- /dev/null +++ b/SpeechT5/fairseq/docs/optim.rst @@ -0,0 +1,38 @@ +.. role:: hidden + :class: hidden-section + +.. _optimizers: + +Optimizers +========== + +Optimizers update the Model parameters based on the gradients. + +.. automodule:: fairseq.optim + :members: + +.. autoclass:: fairseq.optim.FairseqOptimizer + :members: + :undoc-members: + +.. autoclass:: fairseq.optim.adadelta.Adadelta + :members: + :undoc-members: +.. autoclass:: fairseq.optim.adagrad.Adagrad + :members: + :undoc-members: +.. autoclass:: fairseq.optim.adafactor.FairseqAdafactor + :members: + :undoc-members: +.. autoclass:: fairseq.optim.adam.FairseqAdam + :members: + :undoc-members: +.. autoclass:: fairseq.optim.fp16_optimizer.FP16Optimizer + :members: + :undoc-members: +.. autoclass:: fairseq.optim.nag.FairseqNAG + :members: + :undoc-members: +.. autoclass:: fairseq.optim.sgd.SGD + :members: + :undoc-members: diff --git a/SpeechT5/fairseq/docs/overview.rst b/SpeechT5/fairseq/docs/overview.rst new file mode 100644 index 0000000..026b3b5 --- /dev/null +++ b/SpeechT5/fairseq/docs/overview.rst @@ -0,0 +1,74 @@ +Overview +======== + +Fairseq can be extended through user-supplied `plug-ins +`_. We support five kinds of +plug-ins: + +- :ref:`Models` define the neural network architecture and encapsulate all of the + learnable parameters. +- :ref:`Criterions` compute the loss function given the model outputs and targets. +- :ref:`Tasks` store dictionaries and provide helpers for loading/iterating over + Datasets, initializing the Model/Criterion and calculating the loss. +- :ref:`Optimizers` update the Model parameters based on the gradients. +- :ref:`Learning Rate Schedulers` update the learning rate over the course of + training. + +**Training Flow** + +Given a ``model``, ``criterion``, ``task``, ``optimizer`` and ``lr_scheduler``, +fairseq implements the following high-level training flow:: + + for epoch in range(num_epochs): + itr = task.get_batch_iterator(task.dataset('train')) + for num_updates, batch in enumerate(itr): + task.train_step(batch, model, criterion, optimizer) + average_and_clip_gradients() + optimizer.step() + lr_scheduler.step_update(num_updates) + lr_scheduler.step(epoch) + +where the default implementation for ``task.train_step`` is roughly:: + + def train_step(self, batch, model, criterion, optimizer, **unused): + loss = criterion(model, batch) + optimizer.backward(loss) + return loss + +**Registering new plug-ins** + +New plug-ins are *registered* through a set of ``@register`` function +decorators, for example:: + + @register_model('my_lstm') + class MyLSTM(FairseqEncoderDecoderModel): + (...) + +Once registered, new plug-ins can be used with the existing :ref:`Command-line +Tools`. See the Tutorial sections for more detailed walkthroughs of how to add +new plug-ins. + +**Loading plug-ins from another directory** + +New plug-ins can be defined in a custom module stored in the user system. In +order to import the module, and make the plugin available to *fairseq*, the +command line supports the ``--user-dir`` flag that can be used to specify a +custom location for additional modules to load into *fairseq*. + +For example, assuming this directory tree:: + + /home/user/my-module/ + └── __init__.py + +with ``__init__.py``:: + + from fairseq.models import register_model_architecture + from fairseq.models.transformer import transformer_vaswani_wmt_en_de_big + + @register_model_architecture('transformer', 'my_transformer') + def transformer_mmt_big(args): + transformer_vaswani_wmt_en_de_big(args) + +it is possible to invoke the :ref:`fairseq-train` script with the new architecture with:: + + fairseq-train ... --user-dir /home/user/my-module -a my_transformer --task translation diff --git a/SpeechT5/fairseq/docs/requirements.txt b/SpeechT5/fairseq/docs/requirements.txt new file mode 100644 index 0000000..c734a1f --- /dev/null +++ b/SpeechT5/fairseq/docs/requirements.txt @@ -0,0 +1,2 @@ +sphinx<2.0 +sphinx-argparse diff --git a/SpeechT5/fairseq/docs/tasks.rst b/SpeechT5/fairseq/docs/tasks.rst new file mode 100644 index 0000000..5f65c3c --- /dev/null +++ b/SpeechT5/fairseq/docs/tasks.rst @@ -0,0 +1,61 @@ +.. role:: hidden + :class: hidden-section + +.. module:: fairseq.tasks + +.. _Tasks: + +Tasks +===== + +Tasks store dictionaries and provide helpers for loading/iterating over +Datasets, initializing the Model/Criterion and calculating the loss. + +Tasks can be selected via the ``--task`` command-line argument. Once selected, a +task may expose additional command-line arguments for further configuration. + +Example usage:: + + # setup the task (e.g., load dictionaries) + task = fairseq.tasks.setup_task(args) + + # build model and criterion + model = task.build_model(args) + criterion = task.build_criterion(args) + + # load datasets + task.load_dataset('train') + task.load_dataset('valid') + + # iterate over mini-batches of data + batch_itr = task.get_batch_iterator( + task.dataset('train'), max_tokens=4096, + ) + for batch in batch_itr: + # compute the loss + loss, sample_size, logging_output = task.get_loss( + model, criterion, batch, + ) + loss.backward() + + +Translation +----------- + +.. autoclass:: fairseq.tasks.translation.TranslationTask + +.. _language modeling: + +Language Modeling +----------------- + +.. autoclass:: fairseq.tasks.language_modeling.LanguageModelingTask + + +Adding new tasks +---------------- + +.. autofunction:: fairseq.tasks.register_task +.. autoclass:: fairseq.tasks.FairseqTask + :members: + :undoc-members: diff --git a/SpeechT5/fairseq/docs/tutorial_classifying_names.rst b/SpeechT5/fairseq/docs/tutorial_classifying_names.rst new file mode 100644 index 0000000..b02fec0 --- /dev/null +++ b/SpeechT5/fairseq/docs/tutorial_classifying_names.rst @@ -0,0 +1,415 @@ +Tutorial: Classifying Names with a Character-Level RNN +====================================================== + +In this tutorial we will extend fairseq to support *classification* tasks. In +particular we will re-implement the PyTorch tutorial for `Classifying Names with +a Character-Level RNN `_ +in fairseq. It is recommended to quickly skim that tutorial before beginning +this one. + +This tutorial covers: + +1. **Preprocessing the data** to create dictionaries. +2. **Registering a new Model** that encodes an input sentence with a simple RNN + and predicts the output label. +3. **Registering a new Task** that loads our dictionaries and dataset. +4. **Training the Model** using the existing command-line tools. +5. **Writing an evaluation script** that imports fairseq and allows us to + interactively evaluate our model on new inputs. + + +1. Preprocessing the data +------------------------- + +The original tutorial provides raw data, but we'll work with a modified version +of the data that is already tokenized into characters and split into separate +train, valid and test sets. + +Download and extract the data from here: +`tutorial_names.tar.gz `_ + +Once extracted, let's preprocess the data using the :ref:`fairseq-preprocess` +command-line tool to create the dictionaries. While this tool is primarily +intended for sequence-to-sequence problems, we're able to reuse it here by +treating the label as a "target" sequence of length 1. We'll also output the +preprocessed files in "raw" format using the ``--dataset-impl`` option to +enhance readability: + +.. code-block:: console + + > fairseq-preprocess \ + --trainpref names/train --validpref names/valid --testpref names/test \ + --source-lang input --target-lang label \ + --destdir names-bin --dataset-impl raw + +After running the above command you should see a new directory, +:file:`names-bin/`, containing the dictionaries for *inputs* and *labels*. + + +2. Registering a new Model +-------------------------- + +Next we'll register a new model in fairseq that will encode an input sentence +with a simple RNN and predict the output label. Compared to the original PyTorch +tutorial, our version will also work with batches of data and GPU Tensors. + +First let's copy the simple RNN module implemented in the `PyTorch tutorial +`_. +Create a new file named :file:`fairseq/models/rnn_classifier.py` with the +following contents:: + + import torch + import torch.nn as nn + + class RNN(nn.Module): + + def __init__(self, input_size, hidden_size, output_size): + super(RNN, self).__init__() + + self.hidden_size = hidden_size + + self.i2h = nn.Linear(input_size + hidden_size, hidden_size) + self.i2o = nn.Linear(input_size + hidden_size, output_size) + self.softmax = nn.LogSoftmax(dim=1) + + def forward(self, input, hidden): + combined = torch.cat((input, hidden), 1) + hidden = self.i2h(combined) + output = self.i2o(combined) + output = self.softmax(output) + return output, hidden + + def initHidden(self): + return torch.zeros(1, self.hidden_size) + +We must also *register* this model with fairseq using the +:func:`~fairseq.models.register_model` function decorator. Once the model is +registered we'll be able to use it with the existing :ref:`Command-line Tools`. + +All registered models must implement the :class:`~fairseq.models.BaseFairseqModel` +interface, so we'll create a small wrapper class in the same file and register +it in fairseq with the name ``'rnn_classifier'``:: + + from fairseq.models import BaseFairseqModel, register_model + + # Note: the register_model "decorator" should immediately precede the + # definition of the Model class. + + @register_model('rnn_classifier') + class FairseqRNNClassifier(BaseFairseqModel): + + @staticmethod + def add_args(parser): + # Models can override this method to add new command-line arguments. + # Here we'll add a new command-line argument to configure the + # dimensionality of the hidden state. + parser.add_argument( + '--hidden-dim', type=int, metavar='N', + help='dimensionality of the hidden state', + ) + + @classmethod + def build_model(cls, args, task): + # Fairseq initializes models by calling the ``build_model()`` + # function. This provides more flexibility, since the returned model + # instance can be of a different type than the one that was called. + # In this case we'll just return a FairseqRNNClassifier instance. + + # Initialize our RNN module + rnn = RNN( + # We'll define the Task in the next section, but for now just + # notice that the task holds the dictionaries for the "source" + # (i.e., the input sentence) and "target" (i.e., the label). + input_size=len(task.source_dictionary), + hidden_size=args.hidden_dim, + output_size=len(task.target_dictionary), + ) + + # Return the wrapped version of the module + return FairseqRNNClassifier( + rnn=rnn, + input_vocab=task.source_dictionary, + ) + + def __init__(self, rnn, input_vocab): + super(FairseqRNNClassifier, self).__init__() + + self.rnn = rnn + self.input_vocab = input_vocab + + # The RNN module in the tutorial expects one-hot inputs, so we can + # precompute the identity matrix to help convert from indices to + # one-hot vectors. We register it as a buffer so that it is moved to + # the GPU when ``cuda()`` is called. + self.register_buffer('one_hot_inputs', torch.eye(len(input_vocab))) + + def forward(self, src_tokens, src_lengths): + # The inputs to the ``forward()`` function are determined by the + # Task, and in particular the ``'net_input'`` key in each + # mini-batch. We'll define the Task in the next section, but for + # now just know that *src_tokens* has shape `(batch, src_len)` and + # *src_lengths* has shape `(batch)`. + bsz, max_src_len = src_tokens.size() + + # Initialize the RNN hidden state. Compared to the original PyTorch + # tutorial we'll also handle batched inputs and work on the GPU. + hidden = self.rnn.initHidden() + hidden = hidden.repeat(bsz, 1) # expand for batched inputs + hidden = hidden.to(src_tokens.device) # move to GPU + + for i in range(max_src_len): + # WARNING: The inputs have padding, so we should mask those + # elements here so that padding doesn't affect the results. + # This is left as an exercise for the reader. The padding symbol + # is given by ``self.input_vocab.pad()`` and the unpadded length + # of each input is given by *src_lengths*. + + # One-hot encode a batch of input characters. + input = self.one_hot_inputs[src_tokens[:, i].long()] + + # Feed the input to our RNN. + output, hidden = self.rnn(input, hidden) + + # Return the final output state for making a prediction + return output + +Finally let's define a *named architecture* with the configuration for our +model. This is done with the :func:`~fairseq.models.register_model_architecture` +function decorator. Thereafter this named architecture can be used with the +``--arch`` command-line argument, e.g., ``--arch pytorch_tutorial_rnn``:: + + from fairseq.models import register_model_architecture + + # The first argument to ``register_model_architecture()`` should be the name + # of the model we registered above (i.e., 'rnn_classifier'). The function we + # register here should take a single argument *args* and modify it in-place + # to match the desired architecture. + + @register_model_architecture('rnn_classifier', 'pytorch_tutorial_rnn') + def pytorch_tutorial_rnn(args): + # We use ``getattr()`` to prioritize arguments that are explicitly given + # on the command-line, so that the defaults defined below are only used + # when no other value has been specified. + args.hidden_dim = getattr(args, 'hidden_dim', 128) + + +3. Registering a new Task +------------------------- + +Now we'll register a new :class:`~fairseq.tasks.FairseqTask` that will load our +dictionaries and dataset. Tasks can also control how the data is batched into +mini-batches, but in this tutorial we'll reuse the batching provided by +:class:`fairseq.data.LanguagePairDataset`. + +Create a new file named :file:`fairseq/tasks/simple_classification.py` with the +following contents:: + + import os + import torch + + from fairseq.data import Dictionary, LanguagePairDataset + from fairseq.tasks import FairseqTask, register_task + + + @register_task('simple_classification') + class SimpleClassificationTask(LegacyFairseqTask): + + @staticmethod + def add_args(parser): + # Add some command-line arguments for specifying where the data is + # located and the maximum supported input length. + parser.add_argument('data', metavar='FILE', + help='file prefix for data') + parser.add_argument('--max-positions', default=1024, type=int, + help='max input length') + + @classmethod + def setup_task(cls, args, **kwargs): + # Here we can perform any setup required for the task. This may include + # loading Dictionaries, initializing shared Embedding layers, etc. + # In this case we'll just load the Dictionaries. + input_vocab = Dictionary.load(os.path.join(args.data, 'dict.input.txt')) + label_vocab = Dictionary.load(os.path.join(args.data, 'dict.label.txt')) + print('| [input] dictionary: {} types'.format(len(input_vocab))) + print('| [label] dictionary: {} types'.format(len(label_vocab))) + + return SimpleClassificationTask(args, input_vocab, label_vocab) + + def __init__(self, args, input_vocab, label_vocab): + super().__init__(args) + self.input_vocab = input_vocab + self.label_vocab = label_vocab + + def load_dataset(self, split, **kwargs): + """Load a given dataset split (e.g., train, valid, test).""" + + prefix = os.path.join(self.args.data, '{}.input-label'.format(split)) + + # Read input sentences. + sentences, lengths = [], [] + with open(prefix + '.input', encoding='utf-8') as file: + for line in file: + sentence = line.strip() + + # Tokenize the sentence, splitting on spaces + tokens = self.input_vocab.encode_line( + sentence, add_if_not_exist=False, + ) + + sentences.append(tokens) + lengths.append(tokens.numel()) + + # Read labels. + labels = [] + with open(prefix + '.label', encoding='utf-8') as file: + for line in file: + label = line.strip() + labels.append( + # Convert label to a numeric ID. + torch.LongTensor([self.label_vocab.add_symbol(label)]) + ) + + assert len(sentences) == len(labels) + print('| {} {} {} examples'.format(self.args.data, split, len(sentences))) + + # We reuse LanguagePairDataset since classification can be modeled as a + # sequence-to-sequence task where the target sequence has length 1. + self.datasets[split] = LanguagePairDataset( + src=sentences, + src_sizes=lengths, + src_dict=self.input_vocab, + tgt=labels, + tgt_sizes=torch.ones(len(labels)), # targets have length 1 + tgt_dict=self.label_vocab, + left_pad_source=False, + # Since our target is a single class label, there's no need for + # teacher forcing. If we set this to ``True`` then our Model's + # ``forward()`` method would receive an additional argument called + # *prev_output_tokens* that would contain a shifted version of the + # target sequence. + input_feeding=False, + ) + + def max_positions(self): + """Return the max input length allowed by the task.""" + # The source should be less than *args.max_positions* and the "target" + # has max length 1. + return (self.args.max_positions, 1) + + @property + def source_dictionary(self): + """Return the source :class:`~fairseq.data.Dictionary`.""" + return self.input_vocab + + @property + def target_dictionary(self): + """Return the target :class:`~fairseq.data.Dictionary`.""" + return self.label_vocab + + # We could override this method if we wanted more control over how batches + # are constructed, but it's not necessary for this tutorial since we can + # reuse the batching provided by LanguagePairDataset. + # + # def get_batch_iterator( + # self, dataset, max_tokens=None, max_sentences=None, max_positions=None, + # ignore_invalid_inputs=False, required_batch_size_multiple=1, + # seed=1, num_shards=1, shard_id=0, num_workers=0, epoch=1, + # data_buffer_size=0, disable_iterator_cache=False, + # ): + # (...) + + +4. Training the Model +--------------------- + +Now we're ready to train the model. We can use the existing :ref:`fairseq-train` +command-line tool for this, making sure to specify our new Task (``--task +simple_classification``) and Model architecture (``--arch +pytorch_tutorial_rnn``): + +.. note:: + + You can also configure the dimensionality of the hidden state by passing the + ``--hidden-dim`` argument to :ref:`fairseq-train`. + +.. code-block:: console + + > fairseq-train names-bin \ + --task simple_classification \ + --arch pytorch_tutorial_rnn \ + --optimizer adam --lr 0.001 --lr-shrink 0.5 \ + --max-tokens 1000 + (...) + | epoch 027 | loss 1.200 | ppl 2.30 | wps 15728 | ups 119.4 | wpb 116 | bsz 116 | num_updates 3726 | lr 1.5625e-05 | gnorm 1.290 | clip 0% | oom 0 | wall 32 | train_wall 21 + | epoch 027 | valid on 'valid' subset | valid_loss 1.41304 | valid_ppl 2.66 | num_updates 3726 | best 1.41208 + | done training in 31.6 seconds + +The model files should appear in the :file:`checkpoints/` directory. + + +5. Writing an evaluation script +------------------------------- + +Finally we can write a short script to evaluate our model on new inputs. Create +a new file named :file:`eval_classifier.py` with the following contents:: + + from fairseq import checkpoint_utils, data, options, tasks + + # Parse command-line arguments for generation + parser = options.get_generation_parser(default_task='simple_classification') + args = options.parse_args_and_arch(parser) + + # Setup task + task = tasks.setup_task(args) + + # Load model + print('| loading model from {}'.format(args.path)) + models, _model_args = checkpoint_utils.load_model_ensemble([args.path], task=task) + model = models[0] + + while True: + sentence = input('\nInput: ') + + # Tokenize into characters + chars = ' '.join(list(sentence.strip())) + tokens = task.source_dictionary.encode_line( + chars, add_if_not_exist=False, + ) + + # Build mini-batch to feed to the model + batch = data.language_pair_dataset.collate( + samples=[{'id': -1, 'source': tokens}], # bsz = 1 + pad_idx=task.source_dictionary.pad(), + eos_idx=task.source_dictionary.eos(), + left_pad_source=False, + input_feeding=False, + ) + + # Feed batch to the model and get predictions + preds = model(**batch['net_input']) + + # Print top 3 predictions and their log-probabilities + top_scores, top_labels = preds[0].topk(k=3) + for score, label_idx in zip(top_scores, top_labels): + label_name = task.target_dictionary.string([label_idx]) + print('({:.2f})\t{}'.format(score, label_name)) + +Now we can evaluate our model interactively. Note that we have included the +original data path (:file:`names-bin/`) so that the dictionaries can be loaded: + +.. code-block:: console + + > python eval_classifier.py names-bin --path checkpoints/checkpoint_best.pt + | [input] dictionary: 64 types + | [label] dictionary: 24 types + | loading model from checkpoints/checkpoint_best.pt + + Input: Satoshi + (-0.61) Japanese + (-1.20) Arabic + (-2.86) Italian + + Input: Sinbad + (-0.30) Arabic + (-1.76) English + (-4.08) Russian diff --git a/SpeechT5/fairseq/docs/tutorial_simple_lstm.rst b/SpeechT5/fairseq/docs/tutorial_simple_lstm.rst new file mode 100644 index 0000000..f529885 --- /dev/null +++ b/SpeechT5/fairseq/docs/tutorial_simple_lstm.rst @@ -0,0 +1,518 @@ +Tutorial: Simple LSTM +===================== + +In this tutorial we will extend fairseq by adding a new +:class:`~fairseq.models.FairseqEncoderDecoderModel` that encodes a source +sentence with an LSTM and then passes the final hidden state to a second LSTM +that decodes the target sentence (without attention). + +This tutorial covers: + +1. **Writing an Encoder and Decoder** to encode/decode the source/target + sentence, respectively. +2. **Registering a new Model** so that it can be used with the existing + :ref:`Command-line tools`. +3. **Training the Model** using the existing command-line tools. +4. **Making generation faster** by modifying the Decoder to use + :ref:`Incremental decoding`. + + +1. Building an Encoder and Decoder +---------------------------------- + +In this section we'll define a simple LSTM Encoder and Decoder. All Encoders +should implement the :class:`~fairseq.models.FairseqEncoder` interface and +Decoders should implement the :class:`~fairseq.models.FairseqDecoder` interface. +These interfaces themselves extend :class:`torch.nn.Module`, so FairseqEncoders +and FairseqDecoders can be written and used in the same ways as ordinary PyTorch +Modules. + + +Encoder +~~~~~~~ + +Our Encoder will embed the tokens in the source sentence, feed them to a +:class:`torch.nn.LSTM` and return the final hidden state. To create our encoder +save the following in a new file named :file:`fairseq/models/simple_lstm.py`:: + + import torch.nn as nn + from fairseq import utils + from fairseq.models import FairseqEncoder + + class SimpleLSTMEncoder(FairseqEncoder): + + def __init__( + self, args, dictionary, embed_dim=128, hidden_dim=128, dropout=0.1, + ): + super().__init__(dictionary) + self.args = args + + # Our encoder will embed the inputs before feeding them to the LSTM. + self.embed_tokens = nn.Embedding( + num_embeddings=len(dictionary), + embedding_dim=embed_dim, + padding_idx=dictionary.pad(), + ) + self.dropout = nn.Dropout(p=dropout) + + # We'll use a single-layer, unidirectional LSTM for simplicity. + self.lstm = nn.LSTM( + input_size=embed_dim, + hidden_size=hidden_dim, + num_layers=1, + bidirectional=False, + batch_first=True, + ) + + def forward(self, src_tokens, src_lengths): + # The inputs to the ``forward()`` function are determined by the + # Task, and in particular the ``'net_input'`` key in each + # mini-batch. We discuss Tasks in the next tutorial, but for now just + # know that *src_tokens* has shape `(batch, src_len)` and *src_lengths* + # has shape `(batch)`. + + # Note that the source is typically padded on the left. This can be + # configured by adding the `--left-pad-source "False"` command-line + # argument, but here we'll make the Encoder handle either kind of + # padding by converting everything to be right-padded. + if self.args.left_pad_source: + # Convert left-padding to right-padding. + src_tokens = utils.convert_padding_direction( + src_tokens, + padding_idx=self.dictionary.pad(), + left_to_right=True + ) + + # Embed the source. + x = self.embed_tokens(src_tokens) + + # Apply dropout. + x = self.dropout(x) + + # Pack the sequence into a PackedSequence object to feed to the LSTM. + x = nn.utils.rnn.pack_padded_sequence(x, src_lengths, batch_first=True) + + # Get the output from the LSTM. + _outputs, (final_hidden, _final_cell) = self.lstm(x) + + # Return the Encoder's output. This can be any object and will be + # passed directly to the Decoder. + return { + # this will have shape `(bsz, hidden_dim)` + 'final_hidden': final_hidden.squeeze(0), + } + + # Encoders are required to implement this method so that we can rearrange + # the order of the batch elements during inference (e.g., beam search). + def reorder_encoder_out(self, encoder_out, new_order): + """ + Reorder encoder output according to `new_order`. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + `encoder_out` rearranged according to `new_order` + """ + final_hidden = encoder_out['final_hidden'] + return { + 'final_hidden': final_hidden.index_select(0, new_order), + } + + +Decoder +~~~~~~~ + +Our Decoder will predict the next word, conditioned on the Encoder's final +hidden state and an embedded representation of the previous target word -- which +is sometimes called *teacher forcing*. More specifically, we'll use a +:class:`torch.nn.LSTM` to produce a sequence of hidden states that we'll project +to the size of the output vocabulary to predict each target word. + +:: + + import torch + from fairseq.models import FairseqDecoder + + class SimpleLSTMDecoder(FairseqDecoder): + + def __init__( + self, dictionary, encoder_hidden_dim=128, embed_dim=128, hidden_dim=128, + dropout=0.1, + ): + super().__init__(dictionary) + + # Our decoder will embed the inputs before feeding them to the LSTM. + self.embed_tokens = nn.Embedding( + num_embeddings=len(dictionary), + embedding_dim=embed_dim, + padding_idx=dictionary.pad(), + ) + self.dropout = nn.Dropout(p=dropout) + + # We'll use a single-layer, unidirectional LSTM for simplicity. + self.lstm = nn.LSTM( + # For the first layer we'll concatenate the Encoder's final hidden + # state with the embedded target tokens. + input_size=encoder_hidden_dim + embed_dim, + hidden_size=hidden_dim, + num_layers=1, + bidirectional=False, + ) + + # Define the output projection. + self.output_projection = nn.Linear(hidden_dim, len(dictionary)) + + # During training Decoders are expected to take the entire target sequence + # (shifted right by one position) and produce logits over the vocabulary. + # The *prev_output_tokens* tensor begins with the end-of-sentence symbol, + # ``dictionary.eos()``, followed by the target sequence. + def forward(self, prev_output_tokens, encoder_out): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (Tensor, optional): output from the encoder, used for + encoder-side attention + + Returns: + tuple: + - the last decoder layer's output of shape + `(batch, tgt_len, vocab)` + - the last decoder layer's attention weights of shape + `(batch, tgt_len, src_len)` + """ + bsz, tgt_len = prev_output_tokens.size() + + # Extract the final hidden state from the Encoder. + final_encoder_hidden = encoder_out['final_hidden'] + + # Embed the target sequence, which has been shifted right by one + # position and now starts with the end-of-sentence symbol. + x = self.embed_tokens(prev_output_tokens) + + # Apply dropout. + x = self.dropout(x) + + # Concatenate the Encoder's final hidden state to *every* embedded + # target token. + x = torch.cat( + [x, final_encoder_hidden.unsqueeze(1).expand(bsz, tgt_len, -1)], + dim=2, + ) + + # Using PackedSequence objects in the Decoder is harder than in the + # Encoder, since the targets are not sorted in descending length order, + # which is a requirement of ``pack_padded_sequence()``. Instead we'll + # feed nn.LSTM directly. + initial_state = ( + final_encoder_hidden.unsqueeze(0), # hidden + torch.zeros_like(final_encoder_hidden).unsqueeze(0), # cell + ) + output, _ = self.lstm( + x.transpose(0, 1), # convert to shape `(tgt_len, bsz, dim)` + initial_state, + ) + x = output.transpose(0, 1) # convert to shape `(bsz, tgt_len, hidden)` + + # Project the outputs to the size of the vocabulary. + x = self.output_projection(x) + + # Return the logits and ``None`` for the attention weights + return x, None + + +2. Registering the Model +------------------------ + +Now that we've defined our Encoder and Decoder we must *register* our model with +fairseq using the :func:`~fairseq.models.register_model` function decorator. +Once the model is registered we'll be able to use it with the existing +:ref:`Command-line Tools`. + +All registered models must implement the +:class:`~fairseq.models.BaseFairseqModel` interface. For sequence-to-sequence +models (i.e., any model with a single Encoder and Decoder), we can instead +implement the :class:`~fairseq.models.FairseqEncoderDecoderModel` interface. + +Create a small wrapper class in the same file and register it in fairseq with +the name ``'simple_lstm'``:: + + from fairseq.models import FairseqEncoderDecoderModel, register_model + + # Note: the register_model "decorator" should immediately precede the + # definition of the Model class. + + @register_model('simple_lstm') + class SimpleLSTMModel(FairseqEncoderDecoderModel): + + @staticmethod + def add_args(parser): + # Models can override this method to add new command-line arguments. + # Here we'll add some new command-line arguments to configure dropout + # and the dimensionality of the embeddings and hidden states. + parser.add_argument( + '--encoder-embed-dim', type=int, metavar='N', + help='dimensionality of the encoder embeddings', + ) + parser.add_argument( + '--encoder-hidden-dim', type=int, metavar='N', + help='dimensionality of the encoder hidden state', + ) + parser.add_argument( + '--encoder-dropout', type=float, default=0.1, + help='encoder dropout probability', + ) + parser.add_argument( + '--decoder-embed-dim', type=int, metavar='N', + help='dimensionality of the decoder embeddings', + ) + parser.add_argument( + '--decoder-hidden-dim', type=int, metavar='N', + help='dimensionality of the decoder hidden state', + ) + parser.add_argument( + '--decoder-dropout', type=float, default=0.1, + help='decoder dropout probability', + ) + + @classmethod + def build_model(cls, args, task): + # Fairseq initializes models by calling the ``build_model()`` + # function. This provides more flexibility, since the returned model + # instance can be of a different type than the one that was called. + # In this case we'll just return a SimpleLSTMModel instance. + + # Initialize our Encoder and Decoder. + encoder = SimpleLSTMEncoder( + args=args, + dictionary=task.source_dictionary, + embed_dim=args.encoder_embed_dim, + hidden_dim=args.encoder_hidden_dim, + dropout=args.encoder_dropout, + ) + decoder = SimpleLSTMDecoder( + dictionary=task.target_dictionary, + encoder_hidden_dim=args.encoder_hidden_dim, + embed_dim=args.decoder_embed_dim, + hidden_dim=args.decoder_hidden_dim, + dropout=args.decoder_dropout, + ) + model = SimpleLSTMModel(encoder, decoder) + + # Print the model architecture. + print(model) + + return model + + # We could override the ``forward()`` if we wanted more control over how + # the encoder and decoder interact, but it's not necessary for this + # tutorial since we can inherit the default implementation provided by + # the FairseqEncoderDecoderModel base class, which looks like: + # + # def forward(self, src_tokens, src_lengths, prev_output_tokens): + # encoder_out = self.encoder(src_tokens, src_lengths) + # decoder_out = self.decoder(prev_output_tokens, encoder_out) + # return decoder_out + +Finally let's define a *named architecture* with the configuration for our +model. This is done with the :func:`~fairseq.models.register_model_architecture` +function decorator. Thereafter this named architecture can be used with the +``--arch`` command-line argument, e.g., ``--arch tutorial_simple_lstm``:: + + from fairseq.models import register_model_architecture + + # The first argument to ``register_model_architecture()`` should be the name + # of the model we registered above (i.e., 'simple_lstm'). The function we + # register here should take a single argument *args* and modify it in-place + # to match the desired architecture. + + @register_model_architecture('simple_lstm', 'tutorial_simple_lstm') + def tutorial_simple_lstm(args): + # We use ``getattr()`` to prioritize arguments that are explicitly given + # on the command-line, so that the defaults defined below are only used + # when no other value has been specified. + args.encoder_embed_dim = getattr(args, 'encoder_embed_dim', 256) + args.encoder_hidden_dim = getattr(args, 'encoder_hidden_dim', 256) + args.decoder_embed_dim = getattr(args, 'decoder_embed_dim', 256) + args.decoder_hidden_dim = getattr(args, 'decoder_hidden_dim', 256) + + +3. Training the Model +--------------------- + +Now we're ready to train the model. We can use the existing :ref:`fairseq-train` +command-line tool for this, making sure to specify our new Model architecture +(``--arch tutorial_simple_lstm``). + +.. note:: + + Make sure you've already preprocessed the data from the IWSLT example in the + :file:`examples/translation/` directory. + +.. code-block:: console + + > fairseq-train data-bin/iwslt14.tokenized.de-en \ + --arch tutorial_simple_lstm \ + --encoder-dropout 0.2 --decoder-dropout 0.2 \ + --optimizer adam --lr 0.005 --lr-shrink 0.5 \ + --max-tokens 12000 + (...) + | epoch 052 | loss 4.027 | ppl 16.30 | wps 420805 | ups 39.7 | wpb 9841 | bsz 400 | num_updates 20852 | lr 1.95313e-05 | gnorm 0.218 | clip 0% | oom 0 | wall 529 | train_wall 396 + | epoch 052 | valid on 'valid' subset | valid_loss 4.74989 | valid_ppl 26.91 | num_updates 20852 | best 4.74954 + +The model files should appear in the :file:`checkpoints/` directory. While this +model architecture is not very good, we can use the :ref:`fairseq-generate` script to +generate translations and compute our BLEU score over the test set: + +.. code-block:: console + + > fairseq-generate data-bin/iwslt14.tokenized.de-en \ + --path checkpoints/checkpoint_best.pt \ + --beam 5 \ + --remove-bpe + (...) + | Translated 6750 sentences (153132 tokens) in 17.3s (389.12 sentences/s, 8827.68 tokens/s) + | Generate test with beam=5: BLEU4 = 8.18, 38.8/12.1/4.7/2.0 (BP=1.000, ratio=1.066, syslen=139865, reflen=131146) + + +4. Making generation faster +--------------------------- + +While autoregressive generation from sequence-to-sequence models is inherently +slow, our implementation above is especially slow because it recomputes the +entire sequence of Decoder hidden states for every output token (i.e., it is +``O(n^2)``). We can make this significantly faster by instead caching the +previous hidden states. + +In fairseq this is called :ref:`Incremental decoding`. Incremental decoding is a +special mode at inference time where the Model only receives a single timestep +of input corresponding to the immediately previous output token (for teacher +forcing) and must produce the next output incrementally. Thus the model must +cache any long-term state that is needed about the sequence, e.g., hidden +states, convolutional states, etc. + +To implement incremental decoding we will modify our model to implement the +:class:`~fairseq.models.FairseqIncrementalDecoder` interface. Compared to the +standard :class:`~fairseq.models.FairseqDecoder` interface, the incremental +decoder interface allows ``forward()`` methods to take an extra keyword argument +(*incremental_state*) that can be used to cache state across time-steps. + +Let's replace our ``SimpleLSTMDecoder`` with an incremental one:: + + import torch + from fairseq.models import FairseqIncrementalDecoder + + class SimpleLSTMDecoder(FairseqIncrementalDecoder): + + def __init__( + self, dictionary, encoder_hidden_dim=128, embed_dim=128, hidden_dim=128, + dropout=0.1, + ): + # This remains the same as before. + super().__init__(dictionary) + self.embed_tokens = nn.Embedding( + num_embeddings=len(dictionary), + embedding_dim=embed_dim, + padding_idx=dictionary.pad(), + ) + self.dropout = nn.Dropout(p=dropout) + self.lstm = nn.LSTM( + input_size=encoder_hidden_dim + embed_dim, + hidden_size=hidden_dim, + num_layers=1, + bidirectional=False, + ) + self.output_projection = nn.Linear(hidden_dim, len(dictionary)) + + # We now take an additional kwarg (*incremental_state*) for caching the + # previous hidden and cell states. + def forward(self, prev_output_tokens, encoder_out, incremental_state=None): + if incremental_state is not None: + # If the *incremental_state* argument is not ``None`` then we are + # in incremental inference mode. While *prev_output_tokens* will + # still contain the entire decoded prefix, we will only use the + # last step and assume that the rest of the state is cached. + prev_output_tokens = prev_output_tokens[:, -1:] + + # This remains the same as before. + bsz, tgt_len = prev_output_tokens.size() + final_encoder_hidden = encoder_out['final_hidden'] + x = self.embed_tokens(prev_output_tokens) + x = self.dropout(x) + x = torch.cat( + [x, final_encoder_hidden.unsqueeze(1).expand(bsz, tgt_len, -1)], + dim=2, + ) + + # We will now check the cache and load the cached previous hidden and + # cell states, if they exist, otherwise we will initialize them to + # zeros (as before). We will use the ``utils.get_incremental_state()`` + # and ``utils.set_incremental_state()`` helpers. + initial_state = utils.get_incremental_state( + self, incremental_state, 'prev_state', + ) + if initial_state is None: + # first time initialization, same as the original version + initial_state = ( + final_encoder_hidden.unsqueeze(0), # hidden + torch.zeros_like(final_encoder_hidden).unsqueeze(0), # cell + ) + + # Run one step of our LSTM. + output, latest_state = self.lstm(x.transpose(0, 1), initial_state) + + # Update the cache with the latest hidden and cell states. + utils.set_incremental_state( + self, incremental_state, 'prev_state', latest_state, + ) + + # This remains the same as before + x = output.transpose(0, 1) + x = self.output_projection(x) + return x, None + + # The ``FairseqIncrementalDecoder`` interface also requires implementing a + # ``reorder_incremental_state()`` method, which is used during beam search + # to select and reorder the incremental state. + def reorder_incremental_state(self, incremental_state, new_order): + # Load the cached state. + prev_state = utils.get_incremental_state( + self, incremental_state, 'prev_state', + ) + + # Reorder batches according to *new_order*. + reordered_state = ( + prev_state[0].index_select(1, new_order), # hidden + prev_state[1].index_select(1, new_order), # cell + ) + + # Update the cached state. + utils.set_incremental_state( + self, incremental_state, 'prev_state', reordered_state, + ) + +Finally, we can rerun generation and observe the speedup: + +.. code-block:: console + + # Before + + > fairseq-generate data-bin/iwslt14.tokenized.de-en \ + --path checkpoints/checkpoint_best.pt \ + --beam 5 \ + --remove-bpe + (...) + | Translated 6750 sentences (153132 tokens) in 17.3s (389.12 sentences/s, 8827.68 tokens/s) + | Generate test with beam=5: BLEU4 = 8.18, 38.8/12.1/4.7/2.0 (BP=1.000, ratio=1.066, syslen=139865, reflen=131146) + + # After + + > fairseq-generate data-bin/iwslt14.tokenized.de-en \ + --path checkpoints/checkpoint_best.pt \ + --beam 5 \ + --remove-bpe + (...) + | Translated 6750 sentences (153132 tokens) in 5.5s (1225.54 sentences/s, 27802.94 tokens/s) + | Generate test with beam=5: BLEU4 = 8.18, 38.8/12.1/4.7/2.0 (BP=1.000, ratio=1.066, syslen=139865, reflen=131146) diff --git a/SpeechT5/fairseq/examples/.gitignore b/SpeechT5/fairseq/examples/.gitignore new file mode 100644 index 0000000..1ef816f --- /dev/null +++ b/SpeechT5/fairseq/examples/.gitignore @@ -0,0 +1,2 @@ +!*/*.sh +!*/*.md diff --git a/SpeechT5/fairseq/examples/__init__.py b/SpeechT5/fairseq/examples/__init__.py new file mode 100644 index 0000000..44bb24a --- /dev/null +++ b/SpeechT5/fairseq/examples/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +try: + from fairseq.version import __version__ # noqa +except ImportError: + pass diff --git a/SpeechT5/fairseq/examples/adaptive_span/README.md b/SpeechT5/fairseq/examples/adaptive_span/README.md new file mode 100644 index 0000000..913a873 --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/README.md @@ -0,0 +1,90 @@ +# Adaptive Span + +Adaptive Span is a novel self-attention mechanism that can learn its optimal +attention span. This allows us to extend significantly the maximum context size +used in Transformer, while maintaining control over their memory footprint +and computational time. It uses the Truncated BPTT technique for training, +as in [transformerXL](https://github.com/pytorch/fairseq/blob/master/examples/truncated_bptt/README.md). + +Adaptive Span was introduced by paper: +[Adaptive Attention Span in Transformers](https://arxiv.org/abs/1905.07799), +which achieved state-of-the-art language modeling results at the time of publication. + +We manage to reproduce their result in fairseq and keep most of the +[original implementation](https://github.com/facebookresearch/adaptive-span) untouched. +You can refer to the their sweep file as well if any combination of hyperparameter is not clear. + +##### 0. Setup + +First you need to process the Enwik8 dataset, we use the pre-tokenized dataset +from [adaptive span paper](https://github.com/facebookresearch/adaptive-span/blob/master/get_data.sh). +You can download the dataset, and then run: +```bash +fairseq-preprocess --only-source --trainpref ~/data/enwik8/train.txt \ + --validpref ~/data/enwik8/valid.txt --testpref ~/data/enwik8/test.txt \ + --destdir ~/data/enwik8/data-bin/ --joined-dictionary --workers 20 +``` + +##### 1. Train a Adaptive Span model on Enwik8 + +We will train a 12-layer Adaptive Span model following the [hyperparameters +used in the original +paper](https://github.com/facebookresearch/adaptive-span/blob/master/experiments/enwik8.sh). + +The following command assumes 4 GPUs, so that the total batch size is 64 +sequences (4 x 16). Training should take 2-3 days on 4 V100 GPUs: +```bash +CUDA_VISIBLE_DEVICES=0,1,2,3 fairseq-train \ + --user-dir examples/adaptive_span \ + --data ~/data/enwik8/data-bin/ \ + --fp16 --fp16-no-flatten-grads --max-update 600000 \ + --task truncated_bptt_lm --tokens-per-sample 512 --arch adaptive_span \ + --n-layer 12 --d-model 512 --n-head 8 --d-inner 2048 --dropout 0.3 \ + --attn-span 8192 --optimizer adagrad_with_grad_clip --adagrad-clip 0.03 \ + --validate-interval-updates 1000 \ + --lr-scheduler fixed --warmup-updates 32000 --batch-size-valid 32 \ + --lr 0.07 --criterion adaptive_span_loss --batch-size 16 --update-freq 1 \ + --seed 2 --log-format json --log-interval 25 --aux-loss-scaler 5e-07 +``` +This should land around 1.05 on validation, 1.03 on test. You can lower the +--aux-loss-scaler for better performance (longer span). It gives ~0.03 bpc +improvement to the transformerXL baseline here. +If training on a single GPU, set `--update-freq=4` to accumulate 4x gradients +and simulate training on 4 GPUs. +You can also reproduce the transformerXL result on enwik8 using this code base. +It should land around 1.06 on test,matching the [original paper](https://github.com/kimiyoung/transformer-xl/blob/master/pytorch/run_enwik8_base.sh). +You can try by +```bash +CUDA_VISIBLE_DEVICES=0,1,2,3 fairseq-train \ + --user-dir examples/truncated_bptt \ + ~/data/enwik8/data-bin/ \ + --task truncated_bptt_lm --fp16 --max-update 400000 \ + --tokens-per-sample 512 --arch transformer_xl --n-layer 12 \ + --d-model 512 --n-head 8 --d-head 64 --d-inner 2048 --dropout 0.1 \ + --dropatt 0.0 --mem-len 512 --optimizer adam --clip-norm 0.25 \ + --lr-scheduler cosine --warmup-updates 0 \ + --lr 0.0 --lr 0.00025 --batch-size 15 \ + --update-freq 1 --seed 2 --log-format json --log-interval 25 \ + --fp16 +``` + +##### 2. Evaluate +For Adaptive Span: +```bash +fairseq-eval-lm ~/data/enwik8/data-bin/ --path model/checkpoint_best.pt \ + --user-dir examples/adaptive_span \ + --task truncated_bptt_lm --batch-size 8 --tokens-per-sample 512 --gen-subset test +``` +For Transformer-XL evaluation: +```bash +fairseq-eval-lm ~/data/enwik8/data-bin/ --path model/checkpoint_best.pt \ + --user-dir examples/truncated_bptt/ --task truncated_bptt_lm --batch-size 8 \ + --tokens-per-sample 80 \ + --model-overrides '{"mem_len":2100,"clamp_len":820,"same_length":True}' \ + --gen-subset valid +``` + +*Note:* During training the model saw 512 tokens of context +(``--tokens-per-sample=512``), with batch size 8. These settings match the evaluation +settings from [the original +paper](https://github.com/facebookresearch/adaptive-span/blob/master/experiments/enwik8.sh). diff --git a/SpeechT5/fairseq/examples/adaptive_span/__init__.py b/SpeechT5/fairseq/examples/adaptive_span/__init__.py new file mode 100644 index 0000000..e0a142a --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import os + +# automatically import any Python files in the current directory +cur_dir = os.path.dirname(__file__) +for file in os.listdir(cur_dir): + path = os.path.join(cur_dir, file) + if ( + not file.startswith("_") + and not file.startswith(".") + and (file.endswith(".py") or os.path.isdir(path)) + ): + mod_name = file[: file.find(".py")] if file.endswith(".py") else file + module = importlib.import_module(__name__ + "." + mod_name) diff --git a/SpeechT5/fairseq/examples/adaptive_span/adagrad_with_grad_clip.py b/SpeechT5/fairseq/examples/adaptive_span/adagrad_with_grad_clip.py new file mode 100644 index 0000000..585ce18 --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/adagrad_with_grad_clip.py @@ -0,0 +1,128 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from torch.optim import Adagrad + +from fairseq.optim import LegacyFairseqOptimizer, register_optimizer + + +@register_optimizer("adagrad_with_grad_clip") +class FairseqAdagradWithGradClip(LegacyFairseqOptimizer): + def __init__(self, args, params): + super().__init__(args) + self._optimizer = AdagradWithGradClip(params, **self.optimizer_config) + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--weight-decay', '--wd', default=0.0, type=float, metavar='WD', + help='weight decay') + parser.add_argument('--adagrad-clip', default=0.0, type=float, metavar='D', + help='internal grad clip') + # fmt: on + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.args.lr[0], + "weight_decay": self.args.weight_decay, + "grad_clip": self.args.adagrad_clip, + } + + @property + def supports_flat_params(self): + return False + + +def _clip_grad(clr, grad, group_grad_clip): + if group_grad_clip > 0: + norm = grad.norm(2).item() + if norm > group_grad_clip: + clr *= group_grad_clip / (norm + 1e-10) + return clr + + +class AdagradWithGradClip(Adagrad): + """Adagrad algorithm with custom gradient clipping""" + + def __init__( + self, + params, + lr=1e-2, + lr_decay=0, + weight_decay=0, + initial_accumulator_value=0, + grad_clip=0, + ): + Adagrad.__init__( + self, + params, + lr=lr, + lr_decay=lr_decay, + weight_decay=weight_decay, + initial_accumulator_value=initial_accumulator_value, + ) + self.defaults["grad_clip"] = grad_clip + self.param_groups[0].setdefault("grad_clip", grad_clip) + + def step(self, closure=None): + loss = None + if closure is not None: + loss = closure() + + for group in self.param_groups: + for p in group["params"]: + if p.grad is None: + continue + + grad = p.grad.data + state = self.state[p] + + state["step"] += 1 + + if group["weight_decay"] != 0: + if p.grad.data.is_sparse: + raise RuntimeError( + "weight_decay option is " + "not compatible with sparse " + "gradients" + ) + grad = grad.add(group["weight_decay"], p.data) + + clr = group["lr"] / (1 + (state["step"] - 1) * group["lr_decay"]) + + # clip + clr = _clip_grad(clr=clr, grad=grad, group_grad_clip=group["grad_clip"]) + + if grad.is_sparse: + # the update is non-linear so indices must be unique + grad = grad.coalesce() + grad_indices = grad._indices() + grad_values = grad._values() + size = grad.size() + + def make_sparse(values): + constructor = grad.new + if grad_indices.dim() == 0 or values.dim() == 0: + return constructor().resize_as_(grad) + return constructor(grad_indices, values, size) + + state["sum"].add_(make_sparse(grad_values.pow(2))) + std = state["sum"]._sparse_mask(grad) + std_values = std._values().sqrt_().add_(1e-10) + p.data.add_(-clr, make_sparse(grad_values / std_values)) + else: + state["sum"].addcmul_(1, grad, grad) + std = state["sum"].sqrt().add_(1e-10) + p.data.addcdiv_(-clr, grad, std) + + return loss diff --git a/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_attention.py b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_attention.py new file mode 100644 index 0000000..07f757b --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_attention.py @@ -0,0 +1,160 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class AdaptiveMask(nn.Module): + """Soft masking function for adaptive size. + It masks out the last K values of an input. The masking value + goes from 1 to 0 gradually, so K can be learned with + back-propagation. + Args: + max_size: maximum size (i.e. input dimension) + ramp_size: size of the ramp going from 0 to 1 + init_val: initial size proportion not to be masked out + shape: learn multiple sizes independent of each other + """ + + def __init__(self, max_size, ramp_size, init_val=0, shape=(1,)): + nn.Module.__init__(self) + self._max_size = max_size + self._ramp_size = ramp_size + self.current_val = nn.Parameter(torch.zeros(*shape) + init_val) + mask_template = torch.linspace(1 - max_size, 0, steps=max_size) + self.register_buffer("mask_template", mask_template) + + def forward(self, x): + mask = self.mask_template.float() + self.current_val.float() * self._max_size + mask = mask / self._ramp_size + 1 + mask = mask.clamp(0, 1) + if x.size(-1) < self._max_size: + # the input could have been trimmed beforehand to save computation + mask = mask.narrow(-1, self._max_size - x.size(-1), x.size(-1)) + x = (x * mask).type_as(x) + return x + + def get_current_max_size(self, include_ramp=True): + current_size = math.ceil(self.current_val.max().item() * self._max_size) + if include_ramp: + current_size += self._ramp_size + current_size = max(0, min(self._max_size, current_size)) + return current_size + + def get_current_avg_size(self, include_ramp=True): + current_size = math.ceil( + self.current_val.float().mean().item() * self._max_size + ) + if include_ramp: + current_size += self._ramp_size + current_size = max(0, min(self._max_size, current_size)) + return current_size + + def clamp_param(self): + """this need to be called after each update""" + self.current_val.data.clamp_(0, 1) + + +class AdaptiveSpan(nn.Module): + """Adaptive attention span for Transformerself. + This module learns an attention span length from data for each + self-attention head. + Args: + attn_span: maximum attention span + adapt_span_loss: loss coefficient for the span length + adapt_span_ramp: length of the masking ramp + adapt_span_init: initial size ratio + adapt_span_cache: adapt cache size to reduce memory usage + """ + + def __init__( + self, + attn_span, + adapt_span_ramp, + adapt_span_init, + n_head, + adapt_span_layer, + **kargs + ): + nn.Module.__init__(self) + self._max_span = attn_span + self._n_head = n_head + self._adapt_span_layer = adapt_span_layer + if self._adapt_span_layer: + self._mask = AdaptiveMask( + max_size=self._max_span, + ramp_size=adapt_span_ramp, + init_val=adapt_span_init, + ) + else: + self._mask = AdaptiveMask( + max_size=self._max_span, + ramp_size=adapt_span_ramp, + init_val=adapt_span_init, + shape=(n_head, 1, 1), + ) + + def forward(self, attn, normalize=True): + """mask attention with the right span""" + # batch and head dimensions are merged together, so separate them first + self.clamp_param() + if self._adapt_span_layer: + attn = self._mask(attn) + else: + B = attn.size(0) # batch size + M = attn.size(1) # block size + attn = attn.reshape(B // self._n_head, self._n_head, M, -1) + attn = self._mask(attn) + attn = attn.view(B, M, -1) + return attn + + def get_trim_len(self): + """how much of memory can be trimmed to reduce computation""" + L = self._max_span + trim_len = min(L - 1, L - self._mask.get_current_max_size()) + # too fine granularity might be bad for the memory management + trim_len = math.floor(trim_len / 64) * 64 + return trim_len + + def trim_memory(self, query, key, value, key_pe): + """trim out unnecessary memory beforehand to reduce computation""" + trim_len = self.get_trim_len() + cache_size = key.size(1) - query.size(1) + trim_len_cache = trim_len - (self._max_span - cache_size) + if trim_len_cache > 0: + key = key[:, trim_len_cache:, :] + value = value[:, trim_len_cache:, :] + elif trim_len_cache < 0: + # cache is too short! this happens when validation resumes + # after a lot of updates. + key = F.pad(key, [0, 0, -trim_len_cache, 0]) + value = F.pad(value, [0, 0, -trim_len_cache, 0]) + if trim_len > 0: + if key_pe is not None: + key_pe = key_pe[:, :, trim_len:] + return key, value, key_pe + + def get_cache_size(self): + """determine how long the cache should be""" + trim_len = self.get_trim_len() + # give a buffer of 64 steps since a span might increase + # in future updates + return min(self._max_span, self._max_span - trim_len + 64) + + def get_loss(self): + """a loss term for regularizing the span length""" + return self._max_span * self._mask.current_val.float().mean() + + def get_current_max_span(self): + return self._mask.get_current_max_size() + + def get_current_avg_span(self): + return self._mask.get_current_avg_size() + + def clamp_param(self): + self._mask.clamp_param() diff --git a/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_loss.py b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_loss.py new file mode 100644 index 0000000..0562458 --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_loss.py @@ -0,0 +1,106 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass + +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import register_criterion +from fairseq.criterions.cross_entropy import CrossEntropyCriterion +from fairseq.dataclass import FairseqDataclass +from omegaconf import II + + +@dataclass +class AdaptiveSpanCriterionConfig(FairseqDataclass): + sentence_avg: bool = II("optimization.sentence_avg") + + +@register_criterion("adaptive_span_loss", dataclass=AdaptiveSpanCriterionConfig) +class AdaptiveSpanCriterion(CrossEntropyCriterion): + def __init__(self, task, sentence_avg): + super().__init__(task, sentence_avg) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss here is summed, different from the adaptive span code + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(**sample["net_input"]) + loss, aux_loss, avg_span, max_span = self.compute_loss( + model, net_output, sample, reduce=reduce + ) + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + loss /= sample_size + total_loss = loss + aux_loss + sample_size = 1 + + logging_output = { + "loss": loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + "total_loss": total_loss.data, + "avg_span": avg_span * sample_size, + "max_span": max_span * sample_size, + } + return total_loss, sample_size, logging_output + + def compute_loss(self, model, net_output, sample, reduce=True): + loss, _ = super().compute_loss(model, net_output, sample, reduce) + aux_loss = model.get_aux_loss() + avg_span = model.get_current_avg_span() + max_span = model.get_current_max_span() + return loss, aux_loss, avg_span, max_span + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + total_loss_sum = sum(log.get("total_loss", 0) for log in logging_outputs) + avg_span_sum = sum(log.get("avg_span", 0) for log in logging_outputs) + max_span_sum = sum(log.get("max_span", 0) for log in logging_outputs) + + # we divide by log(2) to convert the loss from base e to base 2 + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("avg_span", avg_span_sum / sample_size, sample_size, round=3) + metrics.log_scalar("max_span", max_span_sum / sample_size, sample_size, round=3) + # total loss contains the L1 norm on adaptive-span + metrics.log_scalar( + "total_loss", + total_loss_sum / sample_size / math.log(2), + sample_size, + round=3, + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model.py b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model.py new file mode 100644 index 0000000..d96c95b --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model.py @@ -0,0 +1,263 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from fairseq.modules.layer_norm import LayerNorm + +from .adaptive_span_attention import AdaptiveSpan + +# Size notations: +# B = batch_size, H = d_model, M = block_size, L = attn_span + + +def _skew(X, pad_value): + """shift every row 1 step to right""" + # X = B x M x L + B, M, L = X.size() + X = F.pad(X, (0, M + 1), value=pad_value) # B x M x (L+M+1) + X = X.view(B, -1) # B x ML+MM+M + X = X[:, :-M] # B x ML+MM + X = X.view(B, M, M + L) # B x M x L+M + return X + + +def _unskew(X): + """reverse _skew operation""" + # X = B x M x L+M + B, M, L = X.size() + L -= M + X = X.view(B, -1) # B x ML+MM + X = F.pad(X, (0, M)) # B x ML+MM+M + X = X.view(B, M, M + L + 1) # B x M x L+M+1 + X = X[:, :, :L] # B x M x L + return X + + +class SeqAttention(nn.Module): + """Sequential self-attention layer. + Each token will attend to its previous fixed number of steps. + Note that attention doesn't include the current step itself. + """ + + def __init__(self, d_model, n_head, attn_span, dropout, adapt_span_layer, **kargs): + nn.Module.__init__(self) + self.dropout = nn.Dropout(dropout) + self.d_model = d_model # size of a single head + self.attn_span = attn_span + self.adaptive_span = AdaptiveSpan( + attn_span=attn_span, + n_head=n_head, + adapt_span_layer=adapt_span_layer, + **kargs + ) + + def forward(self, query, key, value, key_pe): + # query size = B x M x H + # key, value sizes = B x (M+L) x H + + key, value, key_pe = self.adaptive_span.trim_memory(query, key, value, key_pe) + + # compute attention from context + # B x M (dest) x (M+L) (src) + attn_cont = torch.matmul(query, key.transpose(-1, -2)) + attn_cont = _unskew(attn_cont) # B x M x L + + # compute the effect of position embedding + attn_pos = torch.matmul(query, key_pe) # B x M x L_pos + attn = attn_cont + attn_pos + + attn = attn / math.sqrt(self.d_model) # B x M X L_pos + + attn = F.softmax(attn.float(), dim=-1).type_as(attn) + + # trim attention lengths according to the learned span + attn = self.adaptive_span(attn) + + attn = self.dropout(attn) # B x M X L_pos + + attn_cont = _skew(attn, 0) # B x M X (L+M) + out = torch.matmul(attn_cont, value) # B x M x H + return out + + def get_cache_size(self): + return self.adaptive_span.get_cache_size() + + +class MultiHeadSeqAttention(nn.Module): + def __init__(self, d_model, n_head, **kargs): + nn.Module.__init__(self) + assert d_model % n_head == 0 + self.n_head = n_head + self.head_dim = d_model // n_head + self.attn = SeqAttention(d_model=self.head_dim, n_head=n_head, **kargs) + self.proj_query = nn.Linear(d_model, d_model, bias=False) + nn.init.xavier_normal_(self.proj_query.weight) + self.proj_out = nn.Linear(d_model, d_model, bias=False) + nn.init.xavier_normal_(self.proj_out.weight) + self.proj_val = nn.Linear(d_model, d_model, bias=False) + nn.init.xavier_normal_(self.proj_val.weight) + self.proj_key = nn.Linear(d_model, d_model, bias=False) + nn.init.xavier_normal_(self.proj_key.weight) + + def head_reshape(self, x): + K = self.n_head + D = self.head_dim + x = x.view(x.size()[:-1] + (K, D)) # B x (M+L) x K x D + x = x.transpose(1, 2).contiguous() # B x K x (M+L) x D + x = x.view(-1, x.size(-2), x.size(-1)) # B_K x (M+L) x D + return x + + def forward(self, query, key, value, key_pe): + B = query.size(0) + K = self.n_head + D = self.head_dim + M = query.size(1) + + query = self.proj_query(query) + query = self.head_reshape(query) + value = self.proj_val(value) + value = self.head_reshape(value) + key = self.proj_key(key) + key = self.head_reshape(key) + + out = self.attn(query, key, value, key_pe) # B_K x M x D + out = out.view(B, K, M, D) # B x K x M x D + out = out.transpose(1, 2).contiguous() # B x M x K x D + out = out.view(B, M, -1) # B x M x K_D + out = self.proj_out(out) + return out + + +class FeedForwardLayer(nn.Module): + def __init__(self, d_model, d_inner, dropout, **kargs): + nn.Module.__init__(self) + self.fc1 = nn.Linear(d_model, d_inner) + self.fc2 = nn.Linear(d_inner, d_model) + nn.init.xavier_uniform_(self.fc1.weight) + nn.init.xavier_uniform_(self.fc2.weight) + self.dropout = nn.Dropout(dropout) + + def forward(self, h): + h1 = F.relu(self.fc1(h)) + h1 = self.dropout(h1) + h2 = self.fc2(h1) + return h2 + + +class TransformerSeqLayer(nn.Module): + def __init__(self, d_model, **kargs): + nn.Module.__init__(self) + self.attn = MultiHeadSeqAttention(d_model=d_model, **kargs) + self.norm1 = LayerNorm(d_model) + self.ff = FeedForwardLayer(d_model=d_model, **kargs) + self.norm2 = LayerNorm(d_model) + + def forward(self, h, h_cache, key_pe): + # h = B x M x H + # h_cache = B x L x H + h_all = torch.cat([h_cache, h], dim=1) # B x (M+L) x H + attn_out = self.attn(h, h_all, h_all, key_pe) + h = self.norm1(h + attn_out) # B x M x H + if self.ff is not None: + ff_out = self.ff(h) + out = self.norm2(h + ff_out) # B x M x H + else: + out = h + return out + + def get_cache_size(self): + return self.attn.attn.get_cache_size() + + +class TransformerSeq(nn.Module): + def __init__( + self, + vocab_size, + d_model, + n_head, + n_layer, + attn_span, + emb_dropout, + aux_loss_scaler, + adapt_span_layer, + **kargs + ): + nn.Module.__init__(self) + # token embeddings + self.in_emb = nn.Embedding(vocab_size, d_model) + nn.init.normal_(self.in_emb.weight, mean=0, std=d_model ** -0.5) + self.out_emb = nn.Linear(d_model, vocab_size) + self.aux_loss_scaler = aux_loss_scaler + if emb_dropout > 0: + self.emb_dropout = nn.Dropout(emb_dropout) + else: + self.emb_dropout = None + # position embeddings + self.key_pe = nn.Parameter(torch.randn(1, d_model // n_head, attn_span)) + + self.layers = nn.ModuleList() + self.layers.extend( + TransformerSeqLayer( + d_model=d_model, + n_head=n_head, + attn_span=attn_span, + adapt_span_layer=adapt_span_layer, + **kargs + ) + for _ in range(n_layer) + ) + + def forward(self, x, h_cache, target=None): + # x size = B x M + block_size = x.size(1) + h = self.in_emb(x) # B x M x H + if self.emb_dropout is not None: + h = self.emb_dropout(h) + + h_cache_next = [] + for l, layer in enumerate(self.layers): + cache_size = layer.attn.attn.get_cache_size() + if cache_size > block_size: + h_cache_next_l = torch.cat( + [h_cache[l][:, -cache_size + block_size :, :], h], dim=1 + ).detach() + else: + h_cache_next_l = h[:, -cache_size:, :].detach() + h_cache_next.append(h_cache_next_l) + h = layer(h, h_cache[l], self.key_pe) # B x M x H + + if self.emb_dropout is not None: + h = self.emb_dropout(h) + + out = F.log_softmax(self.out_emb(h).float(), dim=-1).type_as(h) + dummy_loss = None + + return out, h_cache_next, dummy_loss + + def get_aux_loss(self): + loss = 0.0 + for layer in self.layers: + loss += layer.attn.attn.adaptive_span.get_loss() + return self.aux_loss_scaler * loss + + def get_current_max_span(self): + max_span = 0.0 + for layer in self.layers: + max_span = max( + max_span, layer.attn.attn.adaptive_span.get_current_max_span() + ) + return max_span + + def get_current_avg_span(self): + avg_span = 0.0 + for layer in self.layers: + avg_span += layer.attn.attn.adaptive_span.get_current_avg_span() + return avg_span / len(self.layers) diff --git a/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model_wrapper.py b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model_wrapper.py new file mode 100644 index 0000000..5b147fe --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/adaptive_span_model_wrapper.py @@ -0,0 +1,145 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from dataclasses import dataclass +from typing import Dict, List, Optional + +import torch +from fairseq.dataclass import FairseqDataclass +from fairseq.models import ( + FairseqIncrementalDecoder, + FairseqLanguageModel, + register_model, +) +from .adaptive_span_model import TransformerSeq as AdaptiveSpanTransformerModel + + +logger = logging.getLogger(__name__) + + +@dataclass +class AdaptiveSpanSmallConfig(FairseqDataclass): + # defaults come from https://github.com/facebookresearch/adaptive-span/blob/master/experiments/enwik8_small.sh + vocab_size: int = 50 + d_model: int = 256 + n_head: int = 4 + d_inner: int = 1024 + n_layer: int = 8 + attn_span: int = 1024 + dropout: float = 0.0 + emb_dropout: float = 0.0 + adapt_span_ramp: int = 32 + adapt_span_init: float = 0.0 + aux_loss_scaler: float = 0.000002 + adapt_span_layer: bool = False + + +@register_model("adaptive_span", dataclass=AdaptiveSpanSmallConfig) +class AdaptiveSpanTransformer(FairseqLanguageModel): + @classmethod + def build_model(cls, cfg: AdaptiveSpanSmallConfig, task): + return cls(AdaptiveSpanDecoder(cfg, task)) + + def get_aux_loss(self): + return self.decoder.get_aux_loss() + + def get_current_max_span(self): + return self.decoder.get_current_max_span() + + def get_current_avg_span(self): + return self.decoder.get_current_avg_span() + + +class AdaptiveSpanDecoder(FairseqIncrementalDecoder): + def __init__(self, cfg, task): + + super().__init__(task.target_dictionary) + + self.config = cfg + config = AdaptiveSpanSmallConfig( + vocab_size=len(task.target_dictionary), + d_model=cfg.d_model, + n_head=cfg.n_head, + d_inner=cfg.d_inner, + n_layer=cfg.n_layer, + attn_span=cfg.attn_span, + dropout=cfg.dropout, + emb_dropout=cfg.emb_dropout, + adapt_span_ramp=cfg.adapt_span_ramp, + adapt_span_init=cfg.adapt_span_init, + aux_loss_scaler=cfg.aux_loss_scaler, + adapt_span_layer=cfg.adapt_span_layer, + ) + logger.info(config) + self.model = AdaptiveSpanTransformerModel(**config.__dict__) + + self._mems = None + + def forward( + self, + src_tokens, + incremental_state: Optional[Dict[str, List[torch.Tensor]]] = None, + encoder_out=None, + ): + bsz = src_tokens.size(0) + if incremental_state is not None: # used during inference + mems = self.get_incremental_state("mems") + src_tokens = src_tokens[:, -1:] # only keep the most recent token + else: + mems = self._mems + + if mems is None: + # first time init + mems = self.init_hid_cache(bsz) + output = self.model(x=src_tokens, h_cache=mems,) + if incremental_state is not None: + self.set_incremental_state(incremental_state, "mems", output[1]) + else: + self._mems = output[1] + return (output[0],) + + def max_positions(self): + return self.config.attn_span + + def init_hid_cache(self, batch_sz): + hid = [] + for layer in self.model.layers: + param = next(self.model.parameters()) + h = torch.zeros( + batch_sz, + layer.get_cache_size(), + self.config.d_model, + dtype=param.dtype, + device=param.device, + ) + hid.append(h) + return hid + + def get_aux_loss(self): + return self.model.get_aux_loss() + + def get_current_max_span(self): + return self.model.get_current_max_span() + + def get_current_avg_span(self): + return self.model.get_current_avg_span() + + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[torch.Tensor]]], + new_order: torch.Tensor, + ): + """Reorder incremental state. + + This will be called when the order of the input has changed from the + previous time step. A typical use case is beam search, where the input + order changes between time steps based on the selection of beams. + """ + raise NotImplementedError("This is required for generation/beam search") + # mems = self.get_incremental_state(incremental_state, "mems") + # if mems is not None: + # new_mems = [mems_i.index_select(1, new_order) for mems_i in mems] + # self.set_incremental_state(incremental_state, "mems", new_mems) diff --git a/SpeechT5/fairseq/examples/adaptive_span/truncated_bptt_lm_task.py b/SpeechT5/fairseq/examples/adaptive_span/truncated_bptt_lm_task.py new file mode 100644 index 0000000..02be0e7 --- /dev/null +++ b/SpeechT5/fairseq/examples/adaptive_span/truncated_bptt_lm_task.py @@ -0,0 +1,281 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +from dataclasses import dataclass, field +from typing import List, Optional, Tuple + +import torch +from fairseq import utils +from fairseq.data import ( + Dictionary, + TokenBlockDataset, + data_utils, + iterators, +) +from fairseq.dataclass import FairseqDataclass +from fairseq.distributed import utils as dist_utils +from fairseq.tasks import FairseqTask, register_task +from omegaconf import II + + +logger = logging.getLogger(__name__) + + +@dataclass +class TruncatedBPTTLMConfig(FairseqDataclass): + data: str = field(default="???", metadata={"help": "path to data directory"}) + tokens_per_sample: int = field( + default=1024, + metadata={"help": "max number of tokens per sequence"}, + ) + batch_size: int = II("dataset.batch_size") + # Some models use *max_target_positions* to know how many positional + # embeddings to learn. We use II(...) to make it default to + # *tokens_per_sample*, but in principle there could be more positional + # embeddings than tokens in a single batch. This may also be irrelevant for + # custom model implementations. + max_target_positions: int = II("task.tokens_per_sample") + # these will be populated automatically if not provided + data_parallel_rank: Optional[int] = None + data_parallel_size: Optional[int] = None + + +@register_task("truncated_bptt_lm", dataclass=TruncatedBPTTLMConfig) +class TruncatedBPTTLMTask(FairseqTask): + def __init__(self, cfg: TruncatedBPTTLMConfig): + super().__init__(cfg) + + if cfg.data_parallel_rank is None or cfg.data_parallel_size is None: + if torch.distributed.is_initialized(): + cfg.data_parallel_rank = dist_utils.get_data_parallel_rank() + cfg.data_parallel_size = dist_utils.get_data_parallel_world_size() + else: + cfg.data_parallel_rank = 0 + cfg.data_parallel_size = 1 + + # load the dictionary + paths = utils.split_paths(cfg.data) + assert len(paths) > 0 + self.dictionary = Dictionary.load(os.path.join(paths[0], "dict.txt")) + logger.info("dictionary: {} types".format(len(self.dictionary))) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split (e.g., train, valid, test)""" + + # support sharded datasets + paths = utils.split_paths(self.cfg.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + split_path = os.path.join(data_path, split) + + # each element of *data* will be a tensorized line from the original + # text dataset, similar to ``open(split_path).readlines()`` + data = data_utils.load_indexed_dataset( + split_path, self.dictionary, combine=combine + ) + if data is None: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, split_path) + ) + + # this is similar to ``data.view(-1).split(tokens_per_sample)`` + data = TokenBlockDataset( + data, + data.sizes, + block_size=self.cfg.tokens_per_sample, + pad=None, # unused + eos=None, # unused + break_mode="none", + ) + + self.datasets[split] = TruncatedBPTTDataset( + data=data, + bsz_per_shard=self.cfg.batch_size, + shard_id=self.cfg.data_parallel_rank, + num_shards=self.cfg.data_parallel_size, + ) + + def dataset(self, split): + return self.datasets[split] + + def get_batch_iterator( + self, dataset, num_workers=0, epoch=1, data_buffer_size=0, **kwargs + ): + return iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=self._collate_fn, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + # we don't use the batching functionality from EpochBatchIterator; + # instead every item in *dataset* is a whole batch + batch_sampler=[[i] for i in range(len(dataset))], + disable_shuffling=True, + ) + + def _collate_fn(self, items: List[List[torch.Tensor]]): + # we don't use fairseq's batching functionality, so we expect a single + # Tensor of type List[torch.Tensor] + assert len(items) == 1 + + # item will have shape B x T (the last batch may have length < T) + id, item = items[0] + item = data_utils.collate_tokens(item, pad_idx=self.source_dictionary.pad()) + B, T = item.size() + + # shift item one position over and append a padding token for the target + target = torch.nn.functional.pad( + item[:, 1:], (0, 1, 0, 0), value=self.target_dictionary.pad() + ) + + # fairseq expects batches to have the following structure + return { + "id": torch.tensor([id]*item.size(0)), + "net_input": { + "src_tokens": item, + }, + "target": target, + "nsentences": item.size(0), + "ntokens": item.numel(), + } + + def build_dataset_for_inference( + self, src_tokens: List[torch.Tensor], src_lengths: List[int], **kwargs + ) -> torch.utils.data.Dataset: + eos = self.source_dictionary.eos() + dataset = TokenBlockDataset( + src_tokens, + src_lengths, + block_size=None, # ignored for "eos" break mode + pad=self.source_dictionary.pad(), + eos=eos, + break_mode="eos", + ) + + class Dataset(torch.utils.data.Dataset): + def __getitem__(self, i): + item = dataset[i] + if item[-1] == eos: + # remove eos to support generating with a prefix + item = item[:-1] + return (i, [item]) + + def __len__(self): + return len(dataset) + + return Dataset() + + def inference_step( + self, generator, models, sample, prefix_tokens=None, constraints=None + ): + with torch.no_grad(): + if constraints is not None: + raise NotImplementedError + + # SequenceGenerator doesn't use *src_tokens* directly, we need to + # pass the *prefix_tokens* argument instead. + if prefix_tokens is None and sample["net_input"]["src_tokens"].nelement(): + prefix_tokens = sample["net_input"]["src_tokens"] + + # begin generation with the end-of-sentence token + bos_token = self.source_dictionary.eos() + + return generator.generate( + models, sample, prefix_tokens=prefix_tokens, bos_token=bos_token + ) + + def eval_lm_dataloader( + self, + dataset, + max_tokens: Optional[int] = 36000, + batch_size: Optional[int] = None, + max_positions: Optional[int] = None, + num_shards: int = 1, + shard_id: int = 0, + num_workers: int = 1, + data_buffer_size: int = 10, + context_window: int = 0, + ): + if context_window > 0: + raise NotImplementedError( + "Transformer-XL doesn't need --context-window, try " + "--model-overrides '{\"mem_len\":42}' instead " + ) + return self.get_batch_iterator( + dataset=dataset, + max_tokens=max_tokens, + max_sentences=batch_size, + max_positions=max_positions, + ignore_invalid_inputs=True, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + data_buffer_size=data_buffer_size, + ).next_epoch_itr(shuffle=False) + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary + + +class TruncatedBPTTDataset(torch.utils.data.Dataset): + def __init__( + self, + data: List[torch.Tensor], # ordered list of items + bsz_per_shard, # number of items processed per GPUs per forward + shard_id, # current GPU ID + num_shards, # number of GPUs + ): + super().__init__() + self.data = data + + def batchify(data, bsz): + # Work out how cleanly we can divide the dataset into bsz parts. + nbatch = data.size(0) // bsz + # Trim off any extra elements that wouldn't cleanly fit (remainders). + data = data.narrow(0, 0, nbatch * bsz) + # Evenly divide the data across the bsz batches. + data = data.view(bsz, -1).contiguous() + return data + + # total number of sequences processed by all GPUs in each forward pass + global_batch_size = bsz_per_shard * num_shards + + """ + With a 16 item dataset, bsz_per_shard=2 and num_shards=3, + *indices* might look like: + + indices = [[0, 1], + [2, 3], + [4, 5], + [6, 7], + [8, 9], + [10, 11]] + + The size of the TruncatedBPTTDataset instance will be 2, + and shard 1 will see items: + + [(0, [data[4], data[6]]), + (1, [data[5], data[7]])] + """ + indices = batchify(torch.arange(len(data)), global_batch_size) + assert indices.size(0) == global_batch_size + + self.my_indices = indices[ + shard_id * bsz_per_shard : (shard_id + 1) * bsz_per_shard + ] + assert self.my_indices.size(0) == bsz_per_shard + + def __len__(self): + return self.my_indices.size(1) + + def __getitem__(self, i) -> Tuple[int, List[torch.Tensor]]: + return (i, [self.data[idx] for idx in self.my_indices[:, i]]) diff --git a/SpeechT5/fairseq/examples/backtranslation/README.md b/SpeechT5/fairseq/examples/backtranslation/README.md new file mode 100644 index 0000000..73675f1 --- /dev/null +++ b/SpeechT5/fairseq/examples/backtranslation/README.md @@ -0,0 +1,297 @@ +# Understanding Back-Translation at Scale (Edunov et al., 2018) + +This page includes pre-trained models from the paper [Understanding Back-Translation at Scale (Edunov et al., 2018)](https://arxiv.org/abs/1808.09381). + +## Pre-trained models + +Model | Description | Dataset | Download +---|---|---|--- +`transformer.wmt18.en-de` | Transformer
    ([Edunov et al., 2018](https://arxiv.org/abs/1808.09381))
    WMT'18 winner | [WMT'18 English-German](http://www.statmt.org/wmt18/translation-task.html) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt18.en-de.ensemble.tar.gz)
    See NOTE in the archive + +## Example usage (torch.hub) + +We require a few additional Python dependencies for preprocessing: +```bash +pip install subword_nmt sacremoses +``` + +Then to generate translations from the full model ensemble: +```python +import torch + +# List available models +torch.hub.list('pytorch/fairseq') # [..., 'transformer.wmt18.en-de', ... ] + +# Load the WMT'18 En-De ensemble +en2de_ensemble = torch.hub.load( + 'pytorch/fairseq', 'transformer.wmt18.en-de', + checkpoint_file='wmt18.model1.pt:wmt18.model2.pt:wmt18.model3.pt:wmt18.model4.pt:wmt18.model5.pt', + tokenizer='moses', bpe='subword_nmt') + +# The ensemble contains 5 models +len(en2de_ensemble.models) +# 5 + +# Translate +en2de_ensemble.translate('Hello world!') +# 'Hallo Welt!' +``` + +## Training your own model (WMT'18 English-German) + +The following instructions can be adapted to reproduce the models from the paper. + + +#### Step 1. Prepare parallel data and optionally train a baseline (English-German) model + +First download and preprocess the data: +```bash +# Download and prepare the data +cd examples/backtranslation/ +bash prepare-wmt18en2de.sh +cd ../.. + +# Binarize the data +TEXT=examples/backtranslation/wmt18_en_de +fairseq-preprocess \ + --joined-dictionary \ + --source-lang en --target-lang de \ + --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ + --destdir data-bin/wmt18_en_de --thresholdtgt 0 --thresholdsrc 0 \ + --workers 20 + +# Copy the BPE code into the data-bin directory for future use +cp examples/backtranslation/wmt18_en_de/code data-bin/wmt18_en_de/code +``` + +(Optionally) Train a baseline model (English-German) using just the parallel data: +```bash +CHECKPOINT_DIR=checkpoints_en_de_parallel +fairseq-train --fp16 \ + data-bin/wmt18_en_de \ + --source-lang en --target-lang de \ + --arch transformer_wmt_en_de_big --share-all-embeddings \ + --dropout 0.3 --weight-decay 0.0 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ + --lr 0.001 --lr-scheduler inverse_sqrt --warmup-updates 4000 \ + --max-tokens 3584 --update-freq 16 \ + --max-update 30000 \ + --save-dir $CHECKPOINT_DIR +# Note: the above command assumes 8 GPUs. Adjust `--update-freq` if you have a +# different number of GPUs. +``` + +Average the last 10 checkpoints: +```bash +python scripts/average_checkpoints.py \ + --inputs $CHECKPOINT_DIR \ + --num-epoch-checkpoints 10 \ + --output $CHECKPOINT_DIR/checkpoint.avg10.pt +``` + +Evaluate BLEU: +```bash +# tokenized BLEU on newstest2017: +bash examples/backtranslation/tokenized_bleu.sh \ + wmt17 \ + en-de \ + data-bin/wmt18_en_de \ + data-bin/wmt18_en_de/code \ + $CHECKPOINT_DIR/checkpoint.avg10.pt +# BLEU4 = 29.57, 60.9/35.4/22.9/15.5 (BP=1.000, ratio=1.014, syslen=63049, reflen=62152) +# compare to 29.46 in Table 1, which is also for tokenized BLEU + +# generally it's better to report (detokenized) sacrebleu though: +bash examples/backtranslation/sacrebleu.sh \ + wmt17 \ + en-de \ + data-bin/wmt18_en_de \ + data-bin/wmt18_en_de/code \ + $CHECKPOINT_DIR/checkpoint.avg10.pt +# BLEU+case.mixed+lang.en-de+numrefs.1+smooth.exp+test.wmt17+tok.13a+version.1.4.3 = 29.0 60.6/34.7/22.4/14.9 (BP = 1.000 ratio = 1.013 hyp_len = 62099 ref_len = 61287) +``` + + +#### Step 2. Back-translate monolingual German data + +Train a reverse model (German-English) to do the back-translation: +```bash +CHECKPOINT_DIR=checkpoints_de_en_parallel +fairseq-train --fp16 \ + data-bin/wmt18_en_de \ + --source-lang de --target-lang en \ + --arch transformer_wmt_en_de_big --share-all-embeddings \ + --dropout 0.3 --weight-decay 0.0 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ + --lr 0.001 --lr-scheduler inverse_sqrt --warmup-updates 4000 \ + --max-tokens 3584 --update-freq 16 \ + --max-update 30000 \ + --save-dir $CHECKPOINT_DIR +# Note: the above command assumes 8 GPUs. Adjust `--update-freq` if you have a +# different number of GPUs. +``` + +Let's evaluate the back-translation (BT) model to make sure it is well trained: +```bash +bash examples/backtranslation/sacrebleu.sh \ + wmt17 \ + de-en \ + data-bin/wmt18_en_de \ + data-bin/wmt18_en_de/code \ + $CHECKPOINT_DIR/checkpoint_best.py +# BLEU+case.mixed+lang.de-en+numrefs.1+smooth.exp+test.wmt17+tok.13a+version.1.4.3 = 34.9 66.9/41.8/28.5/19.9 (BP = 0.983 ratio = 0.984 hyp_len = 63342 ref_len = 64399) +# compare to the best system from WMT'17 which scored 35.1: http://matrix.statmt.org/matrix/systems_list/1868 +``` + +Next prepare the monolingual data: +```bash +# Download and prepare the monolingual data +# By default the script samples 25M monolingual sentences, which after +# deduplication should be just over 24M sentences. These are split into 25 +# shards, each with 1M sentences (except for the last shard). +cd examples/backtranslation/ +bash prepare-de-monolingual.sh +cd ../.. + +# Binarize each shard of the monolingual data +TEXT=examples/backtranslation/wmt18_de_mono +for SHARD in $(seq -f "%02g" 0 24); do \ + fairseq-preprocess \ + --only-source \ + --source-lang de --target-lang en \ + --joined-dictionary \ + --srcdict data-bin/wmt18_en_de/dict.de.txt \ + --testpref $TEXT/bpe.monolingual.dedup.${SHARD} \ + --destdir data-bin/wmt18_de_mono/shard${SHARD} \ + --workers 20; \ + cp data-bin/wmt18_en_de/dict.en.txt data-bin/wmt18_de_mono/shard${SHARD}/; \ +done +``` + +Now we're ready to perform back-translation over the monolingual data. The +following command generates via sampling, but it's possible to use greedy +decoding (`--beam 1`), beam search (`--beam 5`), +top-k sampling (`--sampling --beam 1 --sampling-topk 10`), etc.: +```bash +mkdir backtranslation_output +for SHARD in $(seq -f "%02g" 0 24); do \ + fairseq-generate --fp16 \ + data-bin/wmt18_de_mono/shard${SHARD} \ + --path $CHECKPOINT_DIR/checkpoint_best.pt \ + --skip-invalid-size-inputs-valid-test \ + --max-tokens 4096 \ + --sampling --beam 1 \ + > backtranslation_output/sampling.shard${SHARD}.out; \ +done +``` + +After BT, use the `extract_bt_data.py` script to re-combine the shards, extract +the back-translations and apply length ratio filters: +```bash +python examples/backtranslation/extract_bt_data.py \ + --minlen 1 --maxlen 250 --ratio 1.5 \ + --output backtranslation_output/bt_data --srclang en --tgtlang de \ + backtranslation_output/sampling.shard*.out + +# Ensure lengths are the same: +# wc -l backtranslation_output/bt_data.{en,de} +# 21795614 backtranslation_output/bt_data.en +# 21795614 backtranslation_output/bt_data.de +# 43591228 total +``` + +Binarize the filtered BT data and combine it with the parallel data: +```bash +TEXT=backtranslation_output +fairseq-preprocess \ + --source-lang en --target-lang de \ + --joined-dictionary \ + --srcdict data-bin/wmt18_en_de/dict.en.txt \ + --trainpref $TEXT/bt_data \ + --destdir data-bin/wmt18_en_de_bt \ + --workers 20 + +# We want to train on the combined data, so we'll symlink the parallel + BT data +# in the wmt18_en_de_para_plus_bt directory. We link the parallel data as "train" +# and the BT data as "train1", so that fairseq will combine them automatically +# and so that we can use the `--upsample-primary` option to upsample the +# parallel data (if desired). +PARA_DATA=$(readlink -f data-bin/wmt18_en_de) +BT_DATA=$(readlink -f data-bin/wmt18_en_de_bt) +COMB_DATA=data-bin/wmt18_en_de_para_plus_bt +mkdir -p $COMB_DATA +for LANG in en de; do \ + ln -s ${PARA_DATA}/dict.$LANG.txt ${COMB_DATA}/dict.$LANG.txt; \ + for EXT in bin idx; do \ + ln -s ${PARA_DATA}/train.en-de.$LANG.$EXT ${COMB_DATA}/train.en-de.$LANG.$EXT; \ + ln -s ${BT_DATA}/train.en-de.$LANG.$EXT ${COMB_DATA}/train1.en-de.$LANG.$EXT; \ + ln -s ${PARA_DATA}/valid.en-de.$LANG.$EXT ${COMB_DATA}/valid.en-de.$LANG.$EXT; \ + ln -s ${PARA_DATA}/test.en-de.$LANG.$EXT ${COMB_DATA}/test.en-de.$LANG.$EXT; \ + done; \ +done +``` + + +#### 3. Train an English-German model over the combined parallel + BT data + +Finally we can train a model over the parallel + BT data: +```bash +CHECKPOINT_DIR=checkpoints_en_de_parallel_plus_bt +fairseq-train --fp16 \ + data-bin/wmt18_en_de_para_plus_bt \ + --upsample-primary 16 \ + --source-lang en --target-lang de \ + --arch transformer_wmt_en_de_big --share-all-embeddings \ + --dropout 0.3 --weight-decay 0.0 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ + --lr 0.0007 --lr-scheduler inverse_sqrt --warmup-updates 4000 \ + --max-tokens 3584 --update-freq 16 \ + --max-update 100000 \ + --save-dir $CHECKPOINT_DIR +# Note: the above command assumes 8 GPUs. Adjust `--update-freq` if you have a +# different number of GPUs. +``` + +Average the last 10 checkpoints: +```bash +python scripts/average_checkpoints.py \ + --inputs $CHECKPOINT_DIR \ + --num-epoch-checkpoints 10 \ + --output $CHECKPOINT_DIR/checkpoint.avg10.pt +``` + +Evaluate BLEU: +```bash +# tokenized BLEU on newstest2017: +bash examples/backtranslation/tokenized_bleu.sh \ + wmt17 \ + en-de \ + data-bin/wmt18_en_de \ + data-bin/wmt18_en_de/code \ + $CHECKPOINT_DIR/checkpoint.avg10.pt +# BLEU4 = 32.35, 64.4/38.9/26.2/18.3 (BP=0.977, ratio=0.977, syslen=60729, reflen=62152) +# compare to 32.35 in Table 1, which is also for tokenized BLEU + +# generally it's better to report (detokenized) sacrebleu: +bash examples/backtranslation/sacrebleu.sh \ + wmt17 \ + en-de \ + data-bin/wmt18_en_de \ + data-bin/wmt18_en_de/code \ + $CHECKPOINT_DIR/checkpoint.avg10.pt +# BLEU+case.mixed+lang.en-de+numrefs.1+smooth.exp+test.wmt17+tok.13a+version.1.4.3 = 31.5 64.3/38.2/25.6/17.6 (BP = 0.971 ratio = 0.971 hyp_len = 59515 ref_len = 61287) +``` + + +## Citation +```bibtex +@inproceedings{edunov2018backtranslation, + title = {Understanding Back-Translation at Scale}, + author = {Edunov, Sergey and Ott, Myle and Auli, Michael and Grangier, David}, + booktitle = {Conference of the Association for Computational Linguistics (ACL)}, + year = 2018, +} +``` diff --git a/SpeechT5/fairseq/examples/backtranslation/deduplicate_lines.py b/SpeechT5/fairseq/examples/backtranslation/deduplicate_lines.py new file mode 100644 index 0000000..50e4583 --- /dev/null +++ b/SpeechT5/fairseq/examples/backtranslation/deduplicate_lines.py @@ -0,0 +1,41 @@ +#!/usr/bin/python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import fileinput +import hashlib +import sys +from multiprocessing import Pool + + +def get_hashes_and_lines(raw_line): + hash = hashlib.md5(raw_line).hexdigest() + return hash, raw_line + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--workers", type=int, default=10) + parser.add_argument("files", nargs="*", help="input files") + args = parser.parse_args() + + seen = set() + with fileinput.input(args.files, mode="rb") as h: + pool = Pool(args.workers) + results = pool.imap_unordered(get_hashes_and_lines, h, 1000) + for i, (hash, raw_line) in enumerate(results): + if hash not in seen: + seen.add(hash) + sys.stdout.buffer.write(raw_line) + if i % 1000000 == 0: + print(i, file=sys.stderr, end="", flush=True) + elif i % 100000 == 0: + print(".", file=sys.stderr, end="", flush=True) + print(file=sys.stderr, flush=True) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/backtranslation/extract_bt_data.py b/SpeechT5/fairseq/examples/backtranslation/extract_bt_data.py new file mode 100644 index 0000000..e766391 --- /dev/null +++ b/SpeechT5/fairseq/examples/backtranslation/extract_bt_data.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import fileinput + +from tqdm import tqdm + + +def main(): + parser = argparse.ArgumentParser( + description=( + "Extract back-translations from the stdout of fairseq-generate. " + "If there are multiply hypotheses for a source, we only keep the first one. " + ) + ) + parser.add_argument("--output", required=True, help="output prefix") + parser.add_argument( + "--srclang", required=True, help="source language (extracted from H-* lines)" + ) + parser.add_argument( + "--tgtlang", required=True, help="target language (extracted from S-* lines)" + ) + parser.add_argument("--minlen", type=int, help="min length filter") + parser.add_argument("--maxlen", type=int, help="max length filter") + parser.add_argument("--ratio", type=float, help="ratio filter") + parser.add_argument("files", nargs="*", help="input files") + args = parser.parse_args() + + def validate(src, tgt): + srclen = len(src.split(" ")) if src != "" else 0 + tgtlen = len(tgt.split(" ")) if tgt != "" else 0 + if ( + (args.minlen is not None and (srclen < args.minlen or tgtlen < args.minlen)) + or ( + args.maxlen is not None + and (srclen > args.maxlen or tgtlen > args.maxlen) + ) + or ( + args.ratio is not None + and (max(srclen, tgtlen) / float(min(srclen, tgtlen)) > args.ratio) + ) + ): + return False + return True + + def safe_index(toks, index, default): + try: + return toks[index] + except IndexError: + return default + + with open(args.output + "." + args.srclang, "w") as src_h, open( + args.output + "." + args.tgtlang, "w" + ) as tgt_h: + for line in tqdm(fileinput.input(args.files)): + if line.startswith("S-"): + tgt = safe_index(line.rstrip().split("\t"), 1, "") + elif line.startswith("H-"): + if tgt is not None: + src = safe_index(line.rstrip().split("\t"), 2, "") + if validate(src, tgt): + print(src, file=src_h) + print(tgt, file=tgt_h) + tgt = None + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/backtranslation/prepare-de-monolingual.sh b/SpeechT5/fairseq/examples/backtranslation/prepare-de-monolingual.sh new file mode 100644 index 0000000..5e67b2b --- /dev/null +++ b/SpeechT5/fairseq/examples/backtranslation/prepare-de-monolingual.sh @@ -0,0 +1,98 @@ +#!/bin/bash + +SCRIPTS=mosesdecoder/scripts +TOKENIZER=$SCRIPTS/tokenizer/tokenizer.perl +NORM_PUNC=$SCRIPTS/tokenizer/normalize-punctuation.perl +REM_NON_PRINT_CHAR=$SCRIPTS/tokenizer/remove-non-printing-char.perl +BPEROOT=subword-nmt/subword_nmt + + +BPE_CODE=wmt18_en_de/code +SUBSAMPLE_SIZE=25000000 +LANG=de + + +OUTDIR=wmt18_${LANG}_mono +orig=orig +tmp=$OUTDIR/tmp +mkdir -p $OUTDIR $tmp + + +URLS=( + "http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2007.de.shuffled.gz" + "http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2008.de.shuffled.gz" + "http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2009.de.shuffled.gz" + "http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2010.de.shuffled.gz" + "http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2011.de.shuffled.gz" + "http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2012.de.shuffled.gz" + "http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2013.de.shuffled.gz" + "http://www.statmt.org/wmt15/training-monolingual-news-crawl-v2/news.2014.de.shuffled.v2.gz" + "http://data.statmt.org/wmt16/translation-task/news.2015.de.shuffled.gz" + "http://data.statmt.org/wmt17/translation-task/news.2016.de.shuffled.gz" + "http://data.statmt.org/wmt18/translation-task/news.2017.de.shuffled.deduped.gz" +) +FILES=( + "news.2007.de.shuffled.gz" + "news.2008.de.shuffled.gz" + "news.2009.de.shuffled.gz" + "news.2010.de.shuffled.gz" + "news.2011.de.shuffled.gz" + "news.2012.de.shuffled.gz" + "news.2013.de.shuffled.gz" + "news.2014.de.shuffled.v2.gz" + "news.2015.de.shuffled.gz" + "news.2016.de.shuffled.gz" + "news.2017.de.shuffled.deduped.gz" +) + + +cd $orig +for ((i=0;i<${#URLS[@]};++i)); do + file=${FILES[i]} + if [ -f $file ]; then + echo "$file already exists, skipping download" + else + url=${URLS[i]} + wget "$url" + fi +done +cd .. + + +if [ -f $tmp/monolingual.${SUBSAMPLE_SIZE}.${LANG} ]; then + echo "found monolingual sample, skipping shuffle/sample/tokenize" +else + gzip -c -d -k $(for FILE in "${FILES[@]}"; do echo $orig/$FILE; done) \ + | shuf -n $SUBSAMPLE_SIZE \ + | perl $NORM_PUNC $LANG \ + | perl $REM_NON_PRINT_CHAR \ + | perl $TOKENIZER -threads 8 -a -l $LANG \ + > $tmp/monolingual.${SUBSAMPLE_SIZE}.${LANG} +fi + + +if [ -f $tmp/bpe.monolingual.${SUBSAMPLE_SIZE}.${LANG} ]; then + echo "found BPE monolingual sample, skipping BPE step" +else + python $BPEROOT/apply_bpe.py -c $BPE_CODE \ + < $tmp/monolingual.${SUBSAMPLE_SIZE}.${LANG} \ + > $tmp/bpe.monolingual.${SUBSAMPLE_SIZE}.${LANG} +fi + + +if [ -f $tmp/bpe.monolingual.dedup.${SUBSAMPLE_SIZE}.${LANG} ]; then + echo "found deduplicated monolingual sample, skipping deduplication step" +else + python deduplicate_lines.py $tmp/bpe.monolingual.${SUBSAMPLE_SIZE}.${LANG} \ + > $tmp/bpe.monolingual.dedup.${SUBSAMPLE_SIZE}.${LANG} +fi + + +if [ -f $OUTDIR/bpe.monolingual.dedup.00.de ]; then + echo "found sharded data, skipping sharding step" +else + split --lines 1000000 --numeric-suffixes \ + --additional-suffix .${LANG} \ + $tmp/bpe.monolingual.dedup.${SUBSAMPLE_SIZE}.${LANG} \ + $OUTDIR/bpe.monolingual.dedup. +fi diff --git a/SpeechT5/fairseq/examples/backtranslation/prepare-wmt18en2de.sh b/SpeechT5/fairseq/examples/backtranslation/prepare-wmt18en2de.sh new file mode 100644 index 0000000..f6fd275 --- /dev/null +++ b/SpeechT5/fairseq/examples/backtranslation/prepare-wmt18en2de.sh @@ -0,0 +1,135 @@ +#!/bin/bash +# Adapted from https://github.com/facebookresearch/MIXER/blob/master/prepareData.sh + +echo 'Cloning Moses github repository (for tokenization scripts)...' +git clone https://github.com/moses-smt/mosesdecoder.git + +echo 'Cloning Subword NMT repository (for BPE pre-processing)...' +git clone https://github.com/rsennrich/subword-nmt.git + +SCRIPTS=mosesdecoder/scripts +TOKENIZER=$SCRIPTS/tokenizer/tokenizer.perl +CLEAN=$SCRIPTS/training/clean-corpus-n.perl +NORM_PUNC=$SCRIPTS/tokenizer/normalize-punctuation.perl +REM_NON_PRINT_CHAR=$SCRIPTS/tokenizer/remove-non-printing-char.perl +BPEROOT=subword-nmt/subword_nmt +BPE_TOKENS=32000 + +URLS=( + "http://statmt.org/wmt13/training-parallel-europarl-v7.tgz" + "http://statmt.org/wmt13/training-parallel-commoncrawl.tgz" + "http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz" + "http://data.statmt.org/wmt18/translation-task/rapid2016.tgz" + "http://data.statmt.org/wmt17/translation-task/dev.tgz" + "http://statmt.org/wmt14/test-full.tgz" +) +FILES=( + "training-parallel-europarl-v7.tgz" + "training-parallel-commoncrawl.tgz" + "training-parallel-nc-v13.tgz" + "rapid2016.tgz" + "dev.tgz" + "test-full.tgz" +) +CORPORA=( + "training/europarl-v7.de-en" + "commoncrawl.de-en" + "training-parallel-nc-v13/news-commentary-v13.de-en" + "rapid2016.de-en" +) + +if [ ! -d "$SCRIPTS" ]; then + echo "Please set SCRIPTS variable correctly to point to Moses scripts." + exit 1 +fi + +OUTDIR=wmt18_en_de + +src=en +tgt=de +lang=en-de +prep=$OUTDIR +tmp=$prep/tmp +orig=orig + +mkdir -p $orig $tmp $prep + +cd $orig + +for ((i=0;i<${#URLS[@]};++i)); do + file=${FILES[i]} + if [ -f $file ]; then + echo "$file already exists, skipping download" + else + url=${URLS[i]} + wget "$url" + if [ -f $file ]; then + echo "$url successfully downloaded." + else + echo "$url not successfully downloaded." + exit 1 + fi + if [ ${file: -4} == ".tgz" ]; then + tar zxvf $file + elif [ ${file: -4} == ".tar" ]; then + tar xvf $file + fi + fi +done +cd .. + +echo "pre-processing train data..." +for l in $src $tgt; do + rm $tmp/train.tags.$lang.tok.$l + for f in "${CORPORA[@]}"; do + cat $orig/$f.$l | \ + perl $NORM_PUNC $l | \ + perl $REM_NON_PRINT_CHAR | \ + perl $TOKENIZER -threads 8 -a -l $l >> $tmp/train.tags.$lang.tok.$l + done +done + +echo "pre-processing test data..." +for l in $src $tgt; do + if [ "$l" == "$src" ]; then + t="src" + else + t="ref" + fi + grep '\s*//g' | \ + sed -e 's/\s*<\/seg>\s*//g' | \ + sed -e "s/\’/\'/g" | \ + perl $TOKENIZER -threads 8 -a -l $l > $tmp/test.$l + echo "" +done + +echo "splitting train and valid..." +for l in $src $tgt; do + awk '{if (NR%100 == 0) print $0; }' $tmp/train.tags.$lang.tok.$l > $tmp/valid.$l + awk '{if (NR%100 != 0) print $0; }' $tmp/train.tags.$lang.tok.$l > $tmp/train.$l +done + +TRAIN=$tmp/train.de-en +BPE_CODE=$prep/code +rm -f $TRAIN +for l in $src $tgt; do + cat $tmp/train.$l >> $TRAIN +done + +echo "learn_bpe.py on ${TRAIN}..." +python $BPEROOT/learn_bpe.py -s $BPE_TOKENS < $TRAIN > $BPE_CODE + +for L in $src $tgt; do + for f in train.$L valid.$L test.$L; do + echo "apply_bpe.py to ${f}..." + python $BPEROOT/apply_bpe.py -c $BPE_CODE < $tmp/$f > $tmp/bpe.$f + done +done + +perl $CLEAN -ratio 1.5 $tmp/bpe.train $src $tgt $prep/train 1 250 +perl $CLEAN -ratio 1.5 $tmp/bpe.valid $src $tgt $prep/valid 1 250 + +for L in $src $tgt; do + cp $tmp/bpe.test.$L $prep/test.$L +done diff --git a/SpeechT5/fairseq/examples/backtranslation/sacrebleu.sh b/SpeechT5/fairseq/examples/backtranslation/sacrebleu.sh new file mode 100644 index 0000000..a70da23 --- /dev/null +++ b/SpeechT5/fairseq/examples/backtranslation/sacrebleu.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +if [ $# -ne 5 ]; then + echo "usage: $0 [dataset=wmt14/full] [langpair=en-de] [databin] [bpecode] [model]" + exit +fi + + +DATASET=$1 +LANGPAIR=$2 +DATABIN=$3 +BPECODE=$4 +MODEL=$5 + +SRCLANG=$(echo $LANGPAIR | cut -d '-' -f 1) +TGTLANG=$(echo $LANGPAIR | cut -d '-' -f 2) + + +BPEROOT=examples/backtranslation/subword-nmt/subword_nmt +if [ ! -e $BPEROOT ]; then + BPEROOT=subword-nmt/subword_nmt + if [ ! -e $BPEROOT ]; then + echo 'Cloning Subword NMT repository (for BPE pre-processing)...' + git clone https://github.com/rsennrich/subword-nmt.git + fi +fi + + +sacrebleu -t $DATASET -l $LANGPAIR --echo src \ +| sacremoses tokenize -a -l $SRCLANG -q \ +| python $BPEROOT/apply_bpe.py -c $BPECODE \ +| fairseq-interactive $DATABIN --path $MODEL \ + -s $SRCLANG -t $TGTLANG \ + --beam 5 --remove-bpe --buffer-size 1024 --max-tokens 8000 \ +| grep ^H- | cut -f 3- \ +| sacremoses detokenize -l $TGTLANG -q \ +| sacrebleu -t $DATASET -l $LANGPAIR diff --git a/SpeechT5/fairseq/examples/backtranslation/tokenized_bleu.sh b/SpeechT5/fairseq/examples/backtranslation/tokenized_bleu.sh new file mode 100644 index 0000000..c6d6aaa --- /dev/null +++ b/SpeechT5/fairseq/examples/backtranslation/tokenized_bleu.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +if [ $# -ne 5 ]; then + echo "usage: $0 [dataset=wmt14/full] [langpair=en-de] [databin] [bpecode] [model]" + exit +fi + + +DATASET=$1 +LANGPAIR=$2 +DATABIN=$3 +BPECODE=$4 +MODEL=$5 + +SRCLANG=$(echo $LANGPAIR | cut -d '-' -f 1) +TGTLANG=$(echo $LANGPAIR | cut -d '-' -f 2) + + +BPEROOT=examples/backtranslation/subword-nmt/subword_nmt +if [ ! -e $BPEROOT ]; then + BPEROOT=subword-nmt/subword_nmt + if [ ! -e $BPEROOT ]; then + echo 'Cloning Subword NMT repository (for BPE pre-processing)...' + git clone https://github.com/rsennrich/subword-nmt.git + fi +fi + + +TMP_REF=$(mktemp) + +sacrebleu -t $DATASET -l $LANGPAIR --echo ref -q \ +| sacremoses normalize -l $TGTLANG -q \ +| sacremoses tokenize -a -l $TGTLANG -q \ +> $TMP_REF + +sacrebleu -t $DATASET -l $LANGPAIR --echo src -q \ +| sacremoses normalize -l $SRCLANG -q \ +| sacremoses tokenize -a -l $SRCLANG -q \ +| python $BPEROOT/apply_bpe.py -c $BPECODE \ +| fairseq-interactive $DATABIN --path $MODEL \ + -s $SRCLANG -t $TGTLANG \ + --beam 5 --remove-bpe --buffer-size 1024 --max-tokens 8000 \ +| grep ^H- | cut -f 3- \ +| fairseq-score --ref $TMP_REF + +rm -f $TMP_REF diff --git a/SpeechT5/fairseq/examples/bart/README.glue.md b/SpeechT5/fairseq/examples/bart/README.glue.md new file mode 100644 index 0000000..a010934 --- /dev/null +++ b/SpeechT5/fairseq/examples/bart/README.glue.md @@ -0,0 +1,99 @@ +# Fine-tuning BART on GLUE tasks + +### 1) Download the data from GLUE website (https://gluebenchmark.com/tasks) using following commands: +```bash +wget https://gist.githubusercontent.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e/raw/17b8dd0d724281ed7c3b2aeeda662b92809aadd5/download_glue_data.py +python download_glue_data.py --data_dir glue_data --tasks all +``` + +### 2) Preprocess GLUE task data (same as RoBERTa): +```bash +./examples/roberta/preprocess_GLUE_tasks.sh glue_data +``` +`glue_task_name` is one of the following: +`{ALL, QQP, MNLI, QNLI, MRPC, RTE, STS-B, SST-2, CoLA}` +Use `ALL` for preprocessing all the glue tasks. + +### 3) Fine-tuning on GLUE task: +Example fine-tuning cmd for `RTE` task +```bash +TOTAL_NUM_UPDATES=2036 # 10 epochs through RTE for bsz 16 +WARMUP_UPDATES=61 # 6 percent of the number of updates +LR=1e-05 # Peak LR for polynomial LR scheduler. +NUM_CLASSES=2 +MAX_SENTENCES=16 # Batch size. +BART_PATH=/path/to/bart/model.pt + +CUDA_VISIBLE_DEVICES=0,1 fairseq-train RTE-bin/ \ + --restore-file $BART_PATH \ + --batch-size $MAX_SENTENCES \ + --max-tokens 4400 \ + --task sentence_prediction \ + --add-prev-output-tokens \ + --layernorm-embedding \ + --share-all-embeddings \ + --share-decoder-input-output-embed \ + --reset-optimizer --reset-dataloader --reset-meters \ + --required-batch-size-multiple 1 \ + --init-token 0 \ + --arch bart_large \ + --criterion sentence_prediction \ + --num-classes $NUM_CLASSES \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.01 --optimizer adam --adam-betas "(0.9, 0.98)" --adam-eps 1e-08 \ + --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $LR --total-num-update $TOTAL_NUM_UPDATES --warmup-updates $WARMUP_UPDATES \ + --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ + --max-epoch 10 \ + --find-unused-parameters \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric; +``` + +For each of the GLUE task, you will need to use following cmd-line arguments: + +Model | MNLI | QNLI | QQP | RTE | SST-2 | MRPC | CoLA | STS-B +---|---|---|---|---|---|---|---|--- +`--num-classes` | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 +`--lr` | 5e-6 | 1e-5 | 1e-5 | 1e-5 | 5e-6 | 2e-5 | 2e-5 | 2e-5 +`bsz` | 128 | 32 | 32 | 32 | 128 | 64 | 64 | 32 +`--total-num-update` | 30968 | 33112 | 113272 | 1018 | 5233 | 1148 | 1334 | 1799 +`--warmup-updates` | 1858 | 1986 | 6796 | 61 | 314 | 68 | 80 | 107 + +For `STS-B` additionally add `--regression-target --best-checkpoint-metric loss` and remove `--maximize-best-checkpoint-metric`. + +**Note:** + +a) `--total-num-updates` is used by `--polynomial_decay` scheduler and is calculated for `--max-epoch=10` and `--batch-size=32/64/128` depending on the task. + +b) Above cmd-args and hyperparams are tested on Nvidia `V100` GPU with `32gb` of memory for each task. Depending on the GPU memory resources available to you, you can use increase `--update-freq` and reduce `--batch-size`. + +### Inference on GLUE task +After training the model as mentioned in previous step, you can perform inference with checkpoints in `checkpoints/` directory using following python code snippet: + +```python +from fairseq.models.bart import BARTModel + +bart = BARTModel.from_pretrained( + 'checkpoints/', + checkpoint_file='checkpoint_best.pt', + data_name_or_path='RTE-bin' +) + +label_fn = lambda label: bart.task.label_dictionary.string( + [label + bart.task.label_dictionary.nspecial] +) +ncorrect, nsamples = 0, 0 +bart.cuda() +bart.eval() +with open('glue_data/RTE/dev.tsv') as fin: + fin.readline() + for index, line in enumerate(fin): + tokens = line.strip().split('\t') + sent1, sent2, target = tokens[1], tokens[2], tokens[3] + tokens = bart.encode(sent1, sent2) + prediction = bart.predict('sentence_classification_head', tokens).argmax().item() + prediction_label = label_fn(prediction) + ncorrect += int(prediction_label == target) + nsamples += 1 +print('| Accuracy: ', float(ncorrect)/float(nsamples)) +``` diff --git a/SpeechT5/fairseq/examples/bart/README.md b/SpeechT5/fairseq/examples/bart/README.md new file mode 100644 index 0000000..4050a72 --- /dev/null +++ b/SpeechT5/fairseq/examples/bart/README.md @@ -0,0 +1,228 @@ +# BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension + +[https://arxiv.org/abs/1910.13461](https://arxiv.org/abs/1910.13461) + +## Introduction + +BART is sequence-to-sequence model trained with denoising as pretraining objective. We show that this pretraining objective is more generic and show that we can match [RoBERTa](../roberta) results on SQuAD and GLUE and gain state-of-the-art results on summarization (XSum, CNN dataset), long form generative question answering (ELI5) and dialog response genration (ConvAI2). See the associated paper for more details. + +## Pre-trained models + +Model | Description | # params | Download +---|---|---|--- +`bart.base` | BART model with 6 encoder and decoder layers | 140M | [bart.base.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/bart.base.tar.gz) +`bart.large` | BART model with 12 encoder and decoder layers | 400M | [bart.large.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/bart.large.tar.gz) +`bart.large.mnli` | `bart.large` finetuned on `MNLI` | 400M | [bart.large.mnli.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/bart.large.mnli.tar.gz) +`bart.large.cnn` | `bart.large` finetuned on `CNN-DM` | 400M | [bart.large.cnn.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/bart.large.cnn.tar.gz) +`bart.large.xsum` | `bart.large` finetuned on `Xsum` | 400M | [bart.large.xsum.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/bart.large.xsum.tar.gz) + +## Results + +**[GLUE (Wang et al., 2019)](https://gluebenchmark.com/)** +_(dev set, single model, single-task finetuning)_ + +Model | MNLI | QNLI | QQP | RTE | SST-2 | MRPC | CoLA | STS-B +---|---|---|---|---|---|---|---|--- +`roberta.large` | 90.2 | 94.7 | 92.2 | 86.6 | 96.4 | 90.9 | 68.0 | 92.4 +`bart.large` | 89.9 | 94.9 | 92.5 | 87.0 | 96.6 | 90.4 | 62.8 | 91.2 + +**[SQuAD (Rajpurkar et al., 2018)](https://rajpurkar.github.io/SQuAD-explorer/)** +_(dev set, no additional data used)_ + +Model | SQuAD 1.1 EM/F1 | SQuAD 2.0 EM/F1 +---|---|--- +`roberta.large` | 88.9/94.6 | 86.5/89.4 +`bart.large` | 88.8/94.6 | 86.1/89.2 + +**[CNN/Daily Mail](http://nlpprogress.com/english/summarization.html)** +_(test set, no additional data used)_ + +Model | R1 | R2 | RL +---|---|---|--- +`BERTSUMEXTABS` | 42.13 | 19.60 | 39.18 +`bart.large` | 44.16 | 21.28 | 40.90 + +## Example usage + +##### Load BART from torch.hub (PyTorch >= 1.1): +```python +import torch +bart = torch.hub.load('pytorch/fairseq', 'bart.large') +bart.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Load BART (for PyTorch 1.0 or custom models): +```python +# Download bart.large model +wget https://dl.fbaipublicfiles.com/fairseq/models/bart.large.tar.gz +tar -xzvf bart.large.tar.gz + +# Load the model in fairseq +from fairseq.models.bart import BARTModel +bart = BARTModel.from_pretrained('/path/to/bart.large', checkpoint_file='model.pt') +bart.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Apply Byte-Pair Encoding (BPE) to input text: +```python +tokens = bart.encode('Hello world!') +assert tokens.tolist() == [0, 31414, 232, 328, 2] +bart.decode(tokens) # 'Hello world!' +``` + +##### Extract features from BART: +```python +# Extract the last layer's features +last_layer_features = bart.extract_features(tokens) +assert last_layer_features.size() == torch.Size([1, 5, 1024]) + +# Extract all layer's features from decoder (layer 0 is the embedding layer) +all_layers = bart.extract_features(tokens, return_all_hiddens=True) +assert len(all_layers) == 13 +assert torch.all(all_layers[-1] == last_layer_features) +``` + +##### Use BART for sentence-pair classification tasks: +```python +# Download BART already finetuned for MNLI +bart = torch.hub.load('pytorch/fairseq', 'bart.large.mnli') +bart.eval() # disable dropout for evaluation + +# Encode a pair of sentences and make a prediction +tokens = bart.encode('BART is a seq2seq model.', 'BART is not sequence to sequence.') +bart.predict('mnli', tokens).argmax() # 0: contradiction + +# Encode another pair of sentences +tokens = bart.encode('BART is denoising autoencoder.', 'BART is version of autoencoder.') +bart.predict('mnli', tokens).argmax() # 2: entailment +``` + +##### Register a new (randomly initialized) classification head: +```python +bart.register_classification_head('new_task', num_classes=3) +logprobs = bart.predict('new_task', tokens) +``` + +##### Batched prediction: +```python +import torch +from fairseq.data.data_utils import collate_tokens + +bart = torch.hub.load('pytorch/fairseq', 'bart.large.mnli') +bart.eval() + +batch_of_pairs = [ + ['BART is a seq2seq model.', 'BART is not sequence to sequence.'], + ['BART is denoising autoencoder.', 'BART is version of autoencoder.'], +] + +batch = collate_tokens( + [bart.encode(pair[0], pair[1]) for pair in batch_of_pairs], pad_idx=1 +) + +logprobs = bart.predict('mnli', batch) +print(logprobs.argmax(dim=1)) +# tensor([0, 2]) +``` + +##### Using the GPU: +```python +bart.cuda() +bart.predict('new_task', tokens) +``` + +#### Filling masks: + +BART can be used to fill multiple `` tokens in the input. +```python +bart = torch.hub.load('pytorch/fairseq', 'bart.base') +bart.eval() +bart.fill_mask(['The cat on the .'], topk=3, beam=10) +# [[('The cat was on the ground.', tensor(-0.6183)), ('The cat was on the floor.', tensor(-0.6798)), ('The cat sleeps on the couch.', tensor(-0.6830))]] +``` + +Note that by default we enforce the output length to match the input length. +This can be disabled by setting ``match_source_len=False``: +``` +bart.fill_mask(['The cat on the .'], topk=3, beam=10, match_source_len=False) +# [[('The cat was on the ground.', tensor(-0.6185)), ('The cat was asleep on the couch.', tensor(-0.6276)), ('The cat was on the floor.', tensor(-0.6800))]] +``` + +Example code to fill masks for a batch of sentences using GPU +``` +bart.cuda() +bart.fill_mask(['The cat on the .', 'The dog on the .'], topk=3, beam=10) +# [[('The cat was on the ground.', tensor(-0.6183)), ('The cat was on the floor.', tensor(-0.6798)), ('The cat sleeps on the couch.', tensor(-0.6830))], [('The dog was on the ground.', tensor(-0.6190)), ('The dog lay on the ground.', tensor(-0.6711)), +('The dog was asleep on the couch', tensor(-0.6796))]] +``` + +#### Evaluating the `bart.large.mnli` model: + +Example python code snippet to evaluate accuracy on the MNLI `dev_matched` set. +```python +label_map = {0: 'contradiction', 1: 'neutral', 2: 'entailment'} +ncorrect, nsamples = 0, 0 +bart.cuda() +bart.eval() +with open('glue_data/MNLI/dev_matched.tsv') as fin: + fin.readline() + for index, line in enumerate(fin): + tokens = line.strip().split('\t') + sent1, sent2, target = tokens[8], tokens[9], tokens[-1] + tokens = bart.encode(sent1, sent2) + prediction = bart.predict('mnli', tokens).argmax().item() + prediction_label = label_map[prediction] + ncorrect += int(prediction_label == target) + nsamples += 1 + print('| Accuracy: ', float(ncorrect)/float(nsamples)) +# Expected output: 0.9010 +``` + +#### Evaluating the `bart.large.cnn` model: +- Follow instructions [here](https://github.com/abisee/cnn-dailymail) to download and process into data-files such that `test.source` and `test.target` has one line for each non-tokenized sample. +- For simpler preprocessing, you can also `wget https://cdn-datasets.huggingface.co/summarization/cnn_dm_v2.tgz`, although there is no guarantee of identical scores +- `huggingface/transformers` has a simpler interface that supports [single-gpu](https://github.com/huggingface/transformers/blob/master/examples/legacy/seq2seq/run_eval.py) and [multi-gpu](https://github.com/huggingface/transformers/blob/master/examples/legacy/seq2seq/run_distributed_eval.py) beam search. + In `huggingface/transformers`, the BART models' paths are `facebook/bart-large-cnn` and `facebook/bart-large-xsum`. + +In `fairseq`, summaries can be generated using: + +```bash +cp data-bin/cnn_dm/dict.source.txt checkpoints/ +python examples/bart/summarize.py \ + --model-dir pytorch/fairseq \ + --model-file bart.large.cnn \ + --src cnn_dm/test.source \ + --out cnn_dm/test.hypo +``` + +For calculating rouge, install `files2rouge` from [here](https://github.com/pltrdy/files2rouge). + +```bash +export CLASSPATH=/path/to/stanford-corenlp-full-2016-10-31/stanford-corenlp-3.7.0.jar + +# Tokenize hypothesis and target files. +cat test.hypo | java edu.stanford.nlp.process.PTBTokenizer -ioFileList -preserveLines > test.hypo.tokenized +cat test.target | java edu.stanford.nlp.process.PTBTokenizer -ioFileList -preserveLines > test.hypo.target +files2rouge test.hypo.tokenized test.hypo.target +# Expected output: (ROUGE-2 Average_F: 0.21238) +``` + + +## Finetuning + +- [Finetuning on GLUE](README.glue.md) +- [Finetuning on CNN-DM](README.summarization.md) + +## Citation + +```bibtex +@article{lewis2019bart, + title = {BART: Denoising Sequence-to-Sequence Pre-training for Natural +Language Generation, Translation, and Comprehension}, + author = {Mike Lewis and Yinhan Liu and Naman Goyal and Marjan Ghazvininejad and + Abdelrahman Mohamed and Omer Levy and Veselin Stoyanov + and Luke Zettlemoyer }, + journal={arXiv preprint arXiv:1910.13461}, + year = {2019}, +} +``` diff --git a/SpeechT5/fairseq/examples/bart/README.summarization.md b/SpeechT5/fairseq/examples/bart/README.summarization.md new file mode 100644 index 0000000..8727584 --- /dev/null +++ b/SpeechT5/fairseq/examples/bart/README.summarization.md @@ -0,0 +1,102 @@ +# Fine-tuning BART on CNN-Dailymail summarization task + +### 1) Download the CNN and Daily Mail data and preprocess it into data files with non-tokenized cased samples. + +Follow the instructions [here](https://github.com/abisee/cnn-dailymail) to download the original CNN and Daily Mail datasets. To preprocess the data, refer to the pointers in [this issue](https://github.com/pytorch/fairseq/issues/1391) or check out the code [here](https://github.com/artmatsak/cnn-dailymail). + +Follow the instructions [here](https://github.com/EdinburghNLP/XSum) to download the original Extreme Summarization datasets, or check out the code [here](https://github.com/EdinburghNLP/XSum/tree/master/XSum-Dataset), Please keep the raw dataset and make sure no tokenization nor BPE on the dataset. + +### 2) BPE preprocess: + +```bash +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt' + +TASK=cnn_dm +for SPLIT in train val +do + for LANG in source target + do + python -m examples.roberta.multiprocessing_bpe_encoder \ + --encoder-json encoder.json \ + --vocab-bpe vocab.bpe \ + --inputs "$TASK/$SPLIT.$LANG" \ + --outputs "$TASK/$SPLIT.bpe.$LANG" \ + --workers 60 \ + --keep-empty; + done +done +``` + +### 3) Binarize dataset: +```bash +fairseq-preprocess \ + --source-lang "source" \ + --target-lang "target" \ + --trainpref "${TASK}/train.bpe" \ + --validpref "${TASK}/val.bpe" \ + --destdir "${TASK}-bin/" \ + --workers 60 \ + --srcdict dict.txt \ + --tgtdict dict.txt; +``` + +### 4) Fine-tuning on CNN-DM summarization task: +Example fine-tuning CNN-DM +```bash +TOTAL_NUM_UPDATES=20000 +WARMUP_UPDATES=500 +LR=3e-05 +MAX_TOKENS=2048 +UPDATE_FREQ=4 +BART_PATH=/path/to/bart/model.pt + +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 fairseq-train cnn_dm-bin \ + --restore-file $BART_PATH \ + --max-tokens $MAX_TOKENS \ + --task translation \ + --source-lang source --target-lang target \ + --truncate-source \ + --layernorm-embedding \ + --share-all-embeddings \ + --share-decoder-input-output-embed \ + --reset-optimizer --reset-dataloader --reset-meters \ + --required-batch-size-multiple 1 \ + --arch bart_large \ + --criterion label_smoothed_cross_entropy \ + --label-smoothing 0.1 \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.01 --optimizer adam --adam-betas "(0.9, 0.999)" --adam-eps 1e-08 \ + --clip-norm 0.1 \ + --lr-scheduler polynomial_decay --lr $LR --total-num-update $TOTAL_NUM_UPDATES --warmup-updates $WARMUP_UPDATES \ + --fp16 --update-freq $UPDATE_FREQ \ + --skip-invalid-size-inputs-valid-test \ + --find-unused-parameters; +``` +Above is expected to run on `1` node with `8 32gb-V100`. +Expected training time is about `5 hours`. Training time can be reduced with distributed training on `4` nodes and `--update-freq 1`. + +Use TOTAL_NUM_UPDATES=15000 UPDATE_FREQ=2 for Xsum task + +### Inference for CNN-DM test data using above trained checkpoint. +After training the model as mentioned in previous step, you can perform inference with checkpoints in `checkpoints/` directory using `eval_cnn.py`, for example + +```bash +cp data-bin/cnn_dm/dict.source.txt checkpoints/ +python examples/bart/summarize.py \ + --model-dir checkpoints \ + --model-file checkpoint_best.pt \ + --src cnn_dm/test.source \ + --out cnn_dm/test.hypo +``` +For XSUM, which uses beam=6, lenpen=1.0, max_len_b=60, min_len=10: +```bash +cp data-bin/cnn_dm/dict.source.txt checkpoints/ +python examples/bart/summarize.py \ + --model-dir checkpoints \ + --model-file checkpoint_best.pt \ + --src cnn_dm/test.source \ + --out cnn_dm/test.hypo \ + --xsum-kwargs +``` diff --git a/SpeechT5/fairseq/examples/bart/summarize.py b/SpeechT5/fairseq/examples/bart/summarize.py new file mode 100644 index 0000000..04435f8 --- /dev/null +++ b/SpeechT5/fairseq/examples/bart/summarize.py @@ -0,0 +1,100 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq.models.bart import BARTModel +import argparse + +XSUM_KWARGS = dict(beam=6, lenpen=1.0, max_len_b=60, min_len=10, no_repeat_ngram_size=3) +CNN_KWARGS = dict(beam=4, lenpen=2.0, max_len_b=140, min_len=55, no_repeat_ngram_size=3) + + +@torch.no_grad() +def generate(bart, infile, outfile="bart_hypo.txt", bsz=32, n_obs=None, **eval_kwargs): + count = 1 + + # if n_obs is not None: bsz = min(bsz, n_obs) + + with open(infile) as source, open(outfile, "w") as fout: + sline = source.readline().strip() + slines = [sline] + for sline in source: + if n_obs is not None and count > n_obs: + break + if count % bsz == 0: + hypotheses_batch = bart.sample(slines, **eval_kwargs) + for hypothesis in hypotheses_batch: + fout.write(hypothesis + "\n") + fout.flush() + slines = [] + + slines.append(sline.strip()) + count += 1 + + if slines != []: + hypotheses_batch = bart.sample(slines, **eval_kwargs) + for hypothesis in hypotheses_batch: + fout.write(hypothesis + "\n") + fout.flush() + + +def main(): + """ + Usage:: + + python examples/bart/summarize.py \ + --model-dir $HOME/bart.large.cnn \ + --model-file model.pt \ + --src $HOME/data-bin/cnn_dm/test.source + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-dir", + required=True, + type=str, + default="bart.large.cnn/", + help="path containing model file and src_dict.txt", + ) + parser.add_argument( + "--model-file", + default="checkpoint_best.pt", + help="where in model_dir are weights saved", + ) + parser.add_argument( + "--src", default="test.source", help="text to summarize", type=str + ) + parser.add_argument( + "--out", default="test.hypo", help="where to save summaries", type=str + ) + parser.add_argument("--bsz", default=32, help="where to save summaries", type=int) + parser.add_argument( + "--n", default=None, help="how many examples to summarize", type=int + ) + parser.add_argument( + "--xsum-kwargs", + action="store_true", + default=False, + help="if true use XSUM_KWARGS else CNN_KWARGS", + ) + args = parser.parse_args() + eval_kwargs = XSUM_KWARGS if args.xsum_kwargs else CNN_KWARGS + if args.model_dir == "pytorch/fairseq": + bart = torch.hub.load("pytorch/fairseq", args.model_file) + else: + bart = BARTModel.from_pretrained( + args.model_dir, + checkpoint_file=args.model_file, + data_name_or_path=args.model_dir, + ) + bart = bart.eval() + if torch.cuda.is_available(): + bart = bart.cuda().half() + generate( + bart, args.src, bsz=args.bsz, n_obs=args.n, outfile=args.out, **eval_kwargs + ) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/byte_level_bpe/README.md b/SpeechT5/fairseq/examples/byte_level_bpe/README.md new file mode 100644 index 0000000..6570926 --- /dev/null +++ b/SpeechT5/fairseq/examples/byte_level_bpe/README.md @@ -0,0 +1,88 @@ +# Neural Machine Translation with Byte-Level Subwords + +https://arxiv.org/abs/1909.03341 + +We provide an implementation of byte-level byte-pair encoding (BBPE), taking IWSLT 2017 Fr-En translation as +example. + +## Data +Get data and generate fairseq binary dataset: +```bash +bash ./get_data.sh +``` + +## Model Training +Train Transformer model with Bi-GRU embedding contextualization (implemented in `gru_transformer.py`): +```bash +# VOCAB=bytes +# VOCAB=chars +VOCAB=bbpe2048 +# VOCAB=bpe2048 +# VOCAB=bbpe4096 +# VOCAB=bpe4096 +# VOCAB=bpe16384 +``` +```bash +fairseq-train "data/bin_${VOCAB}" --task translation --user-dir examples/byte_level_bpe/gru_transformer \ + --arch gru_transformer --encoder-layers 2 --decoder-layers 2 --dropout 0.3 --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9, 0.98)' \ + --lr 5e-4 --lr-scheduler inverse_sqrt --warmup-updates 4000 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --log-format 'simple' --log-interval 100 --save-dir "checkpoints/${VOCAB}" \ + --batch-size 100 --max-update 100000 --update-freq 2 +``` + +## Generation +`fairseq-generate` requires bytes (BBPE) decoder to convert byte-level representation back to characters: +```bash +# BPE=--bpe bytes +# BPE=--bpe characters +BPE=--bpe byte_bpe --sentencepiece-model-path data/spm_bbpe2048.model +# BPE=--bpe sentencepiece --sentencepiece-model data/spm_bpe2048.model +# BPE=--bpe byte_bpe --sentencepiece-model-path data/spm_bbpe4096.model +# BPE=--bpe sentencepiece --sentencepiece-model data/spm_bpe4096.model +# BPE=--bpe sentencepiece --sentencepiece-model data/spm_bpe16384.model +``` + +```bash +fairseq-generate "data/bin_${VOCAB}" --task translation --user-dir examples/byte_level_bpe/gru_transformer \ + --source-lang fr --gen-subset test --sacrebleu --path "checkpoints/${VOCAB}/checkpoint_last.pt" \ + --tokenizer moses --moses-target-lang en ${BPE} +``` +When using `fairseq-interactive`, bytes (BBPE) encoder/decoder is required to tokenize input data and detokenize model predictions: +```bash +fairseq-interactive "data/bin_${VOCAB}" --task translation --user-dir examples/byte_level_bpe/gru_transformer \ + --path "checkpoints/${VOCAB}/checkpoint_last.pt" --input data/test.fr --tokenizer moses --moses-source-lang fr \ + --moses-target-lang en ${BPE} --buffer-size 1000 --max-tokens 10000 +``` + +## Results +| Vocabulary | Model | BLEU | +|:-------------:|:-------------:|:-------------:| +| Joint BPE 16k ([Kudo, 2018](https://arxiv.org/abs/1804.10959)) | 512d LSTM 2+2 | 33.81 | +| Joint BPE 16k | Transformer base 2+2 (w/ GRU) | 36.64 (36.72) | +| Joint BPE 4k | Transformer base 2+2 (w/ GRU) | 35.49 (36.10) | +| Joint BBPE 4k | Transformer base 2+2 (w/ GRU) | 35.61 (35.82) | +| Joint BPE 2k | Transformer base 2+2 (w/ GRU) | 34.87 (36.13) | +| Joint BBPE 2k | Transformer base 2+2 (w/ GRU) | 34.98 (35.43) | +| Characters | Transformer base 2+2 (w/ GRU) | 31.78 (33.30) | +| Bytes | Transformer base 2+2 (w/ GRU) | 31.57 (33.62) | + + +## Citation +``` +@misc{wang2019neural, + title={Neural Machine Translation with Byte-Level Subwords}, + author={Changhan Wang and Kyunghyun Cho and Jiatao Gu}, + year={2019}, + eprint={1909.03341}, + archivePrefix={arXiv}, + primaryClass={cs.CL} +} +``` + + +## Contact +Changhan Wang ([changhan@fb.com](mailto:changhan@fb.com)), +Kyunghyun Cho ([kyunghyuncho@fb.com](mailto:kyunghyuncho@fb.com)), +Jiatao Gu ([jgu@fb.com](mailto:jgu@fb.com)) diff --git a/SpeechT5/fairseq/examples/byte_level_bpe/get_bitext.py b/SpeechT5/fairseq/examples/byte_level_bpe/get_bitext.py new file mode 100644 index 0000000..6ac1eee --- /dev/null +++ b/SpeechT5/fairseq/examples/byte_level_bpe/get_bitext.py @@ -0,0 +1,254 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import argparse +import os +import os.path as op +from collections import namedtuple +from multiprocessing import cpu_count +from typing import List, Optional + +import sentencepiece as sp +from fairseq.data.encoders.byte_bpe import ByteBPE +from fairseq.data.encoders.byte_utils import byte_encode +from fairseq.data.encoders.bytes import Bytes +from fairseq.data.encoders.characters import Characters +from fairseq.data.encoders.moses_tokenizer import MosesTokenizer +from fairseq.data.encoders.sentencepiece_bpe import SentencepieceBPE + + +SPLITS = ["train", "valid", "test"] + + +def _convert_xml(in_path: str, out_path: str): + with open(in_path) as f, open(out_path, "w") as f_o: + for s in f: + ss = s.strip() + if not ss.startswith("", "").split('">') + assert len(ss) == 2 + f_o.write(ss[1].strip() + "\n") + + +def _convert_train(in_path: str, out_path: str): + with open(in_path) as f, open(out_path, "w") as f_o: + for s in f: + ss = s.strip() + if ss.startswith("<"): + continue + f_o.write(ss.strip() + "\n") + + +def _get_bytes(in_path: str, out_path: str): + with open(in_path) as f, open(out_path, "w") as f_o: + for s in f: + f_o.write(Bytes.encode(s.strip()) + "\n") + + +def _get_chars(in_path: str, out_path: str): + with open(in_path) as f, open(out_path, "w") as f_o: + for s in f: + f_o.write(Characters.encode(s.strip()) + "\n") + + +def pretokenize(in_path: str, out_path: str, src: str, tgt: str): + Args = namedtuple( + "Args", + [ + "moses_source_lang", + "moses_target_lang", + "moses_no_dash_splits", + "moses_no_escape", + ], + ) + args = Args( + moses_source_lang=src, + moses_target_lang=tgt, + moses_no_dash_splits=False, + moses_no_escape=False, + ) + pretokenizer = MosesTokenizer(args) + with open(in_path) as f, open(out_path, "w") as f_o: + for s in f: + f_o.write(pretokenizer.encode(s.strip()) + "\n") + + +def _convert_to_bchar(in_path_prefix: str, src: str, tgt: str, out_path: str): + with open(out_path, "w") as f_o: + for lang in [src, tgt]: + with open(f"{in_path_prefix}.{lang}") as f: + for s in f: + f_o.write(byte_encode(s.strip()) + "\n") + + +def _get_bpe(in_path: str, model_prefix: str, vocab_size: int): + arguments = [ + f"--input={in_path}", + f"--model_prefix={model_prefix}", + f"--model_type=bpe", + f"--vocab_size={vocab_size}", + "--character_coverage=1.0", + "--normalization_rule_name=identity", + f"--num_threads={cpu_count()}", + ] + sp.SentencePieceTrainer.Train(" ".join(arguments)) + + +def _apply_bbpe(model_path: str, in_path: str, out_path: str): + Args = namedtuple("Args", ["sentencepiece_model_path"]) + args = Args(sentencepiece_model_path=model_path) + tokenizer = ByteBPE(args) + with open(in_path) as f, open(out_path, "w") as f_o: + for s in f: + f_o.write(tokenizer.encode(s.strip()) + "\n") + + +def _apply_bpe(model_path: str, in_path: str, out_path: str): + Args = namedtuple("Args", ["sentencepiece_model"]) + args = Args(sentencepiece_model=model_path) + tokenizer = SentencepieceBPE(args) + with open(in_path) as f, open(out_path, "w") as f_o: + for s in f: + f_o.write(tokenizer.encode(s.strip()) + "\n") + + +def _concat_files(in_paths: List[str], out_path: str): + with open(out_path, "w") as f_o: + for p in in_paths: + with open(p) as f: + for r in f: + f_o.write(r) + + +def preprocess_iwslt17( + root: str, + src: str, + tgt: str, + bpe_size: Optional[int], + need_chars: bool, + bbpe_size: Optional[int], + need_bytes: bool, +): + # extract bitext + in_root = op.join(root, f"{src}-{tgt}") + for lang in [src, tgt]: + _convert_train( + op.join(in_root, f"train.tags.{src}-{tgt}.{lang}"), + op.join(root, f"train.{lang}"), + ) + _convert_xml( + op.join(in_root, f"IWSLT17.TED.dev2010.{src}-{tgt}.{lang}.xml"), + op.join(root, f"valid.{lang}"), + ) + _convert_xml( + op.join(in_root, f"IWSLT17.TED.tst2015.{src}-{tgt}.{lang}.xml"), + op.join(root, f"test.{lang}"), + ) + # pre-tokenize + for lang in [src, tgt]: + for split in SPLITS: + pretokenize( + op.join(root, f"{split}.{lang}"), + op.join(root, f"{split}.moses.{lang}"), + src, + tgt, + ) + # tokenize with BPE vocabulary + if bpe_size is not None: + # learn vocabulary + concated_train_path = op.join(root, "train.all") + _concat_files( + [op.join(root, "train.moses.fr"), op.join(root, "train.moses.en")], + concated_train_path, + ) + bpe_model_prefix = op.join(root, f"spm_bpe{bpe_size}") + _get_bpe(concated_train_path, bpe_model_prefix, bpe_size) + os.remove(concated_train_path) + # apply + for lang in [src, tgt]: + for split in SPLITS: + _apply_bpe( + bpe_model_prefix + ".model", + op.join(root, f"{split}.moses.{lang}"), + op.join(root, f"{split}.moses.bpe{bpe_size}.{lang}"), + ) + # tokenize with bytes vocabulary + if need_bytes: + for lang in [src, tgt]: + for split in SPLITS: + _get_bytes( + op.join(root, f"{split}.moses.{lang}"), + op.join(root, f"{split}.moses.bytes.{lang}"), + ) + # tokenize with characters vocabulary + if need_chars: + for lang in [src, tgt]: + for split in SPLITS: + _get_chars( + op.join(root, f"{split}.moses.{lang}"), + op.join(root, f"{split}.moses.chars.{lang}"), + ) + # tokenize with byte-level BPE vocabulary + if bbpe_size is not None: + # learn vocabulary + bchar_path = op.join(root, "train.bchar") + _convert_to_bchar(op.join(root, "train.moses"), src, tgt, bchar_path) + bbpe_model_prefix = op.join(root, f"spm_bbpe{bbpe_size}") + _get_bpe(bchar_path, bbpe_model_prefix, bbpe_size) + os.remove(bchar_path) + # apply + for lang in [src, tgt]: + for split in SPLITS: + _apply_bbpe( + bbpe_model_prefix + ".model", + op.join(root, f"{split}.moses.{lang}"), + op.join(root, f"{split}.moses.bbpe{bbpe_size}.{lang}"), + ) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--root", type=str, default="data") + parser.add_argument( + "--bpe-vocab", + default=None, + type=int, + help="Generate tokenized bitext with BPE of size K." + "Default to None (disabled).", + ) + parser.add_argument( + "--bbpe-vocab", + default=None, + type=int, + help="Generate tokenized bitext with BBPE of size K." + "Default to None (disabled).", + ) + parser.add_argument( + "--byte-vocab", + action="store_true", + help="Generate tokenized bitext with bytes vocabulary", + ) + parser.add_argument( + "--char-vocab", + action="store_true", + help="Generate tokenized bitext with chars vocabulary", + ) + args = parser.parse_args() + + preprocess_iwslt17( + args.root, + "fr", + "en", + args.bpe_vocab, + args.char_vocab, + args.bbpe_vocab, + args.byte_vocab, + ) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/byte_level_bpe/get_data.sh b/SpeechT5/fairseq/examples/byte_level_bpe/get_data.sh new file mode 100644 index 0000000..c3d55d4 --- /dev/null +++ b/SpeechT5/fairseq/examples/byte_level_bpe/get_data.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +PY_BIN_ROOT= + +# PyPI dependency +${PY_BIN_ROOT}pip install sentencepiece sacremoses + +# Get data +if [ ! -d "data" ]; then + mkdir data +fi + +if [ ! -f "data/fr-en.tgz" ]; then + wget https://wit3.fbk.eu/archive/2017-01-trnted/texts/fr/en/fr-en.tgz -P data + tar xvf data/fr-en.tgz -C data +fi +${PY_BIN_ROOT}python get_bitext.py --bpe-vocab 16384 --byte-vocab --char-vocab +for VOCAB_SIZE in 2048 4096; do + ${PY_BIN_ROOT}python get_bitext.py --bpe-vocab ${VOCAB_SIZE} --bbpe-vocab ${VOCAB_SIZE} +done +rm -r data/fr-en data/fr-en.tgz + +# Generate binary dataset +${PY_BIN_ROOT}/fairseq-preprocess --source-lang fr --target-lang en --destdir data/bin_bpe16384 --joined-dictionary \ + --workers "$(nproc)" --trainpref data/train.moses.bpe16384 --validpref data/valid.moses.bpe16384 \ + --testpref data/test.moses.bpe16384 + +${PY_BIN_ROOT}/fairseq-preprocess --source-lang fr --target-lang en --destdir data/bin_bytes --joined-dictionary \ + --workers "$(nproc)" --trainpref data/train.moses.bytes --validpref data/valid.moses.bytes \ + --testpref data/test.moses.bytes + +${PY_BIN_ROOT}/fairseq-preprocess --source-lang fr --target-lang en --destdir data/bin_chars --joined-dictionary \ + --workers "$(nproc)" --trainpref data/train.moses.chars --validpref data/valid.moses.chars \ + --testpref data/test.moses.chars + +for VOCAB_SIZE in 2048 4096; do + for TYPE in bbpe bpe; do + ${PY_BIN_ROOT}/fairseq-preprocess --source-lang fr --target-lang en --destdir "data/bin_${TYPE}${VOCAB_SIZE}" \ + --joined-dictionary --workers "$(nproc)" --trainpref "data/train.moses.${TYPE}${VOCAB_SIZE}" \ + --validpref "data/valid.moses.${TYPE}${VOCAB_SIZE}" --testpref "data/test.moses.${TYPE}${VOCAB_SIZE}" + done +done diff --git a/SpeechT5/fairseq/examples/byte_level_bpe/gru_transformer.py b/SpeechT5/fairseq/examples/byte_level_bpe/gru_transformer.py new file mode 100644 index 0000000..d4efa93 --- /dev/null +++ b/SpeechT5/fairseq/examples/byte_level_bpe/gru_transformer.py @@ -0,0 +1,107 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.nn as nn +import torch.nn.functional as F +from fairseq.models import register_model, register_model_architecture +from fairseq.models.transformer import TransformerEncoder, TransformerModel + + +@register_model("gru_transformer") +class GRUTransformerModel(TransformerModel): + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return GRUTransformerEncoder(args, src_dict, embed_tokens) + + +class GRUTransformerEncoder(TransformerEncoder): + def __init__(self, args, dictionary, embed_tokens): + super().__init__(args, dictionary, embed_tokens) + self.emb_ctx = nn.GRU( + input_size=embed_tokens.embedding_dim, + hidden_size=embed_tokens.embedding_dim // 2, + num_layers=1, + bidirectional=True, + ) + + def forward_embedding(self, src_tokens): + # embed tokens and positions + x = embed = self.embed_scale * self.embed_tokens(src_tokens) + if self.embed_positions is not None: + x = embed + self.embed_positions(src_tokens) + + # contextualize embeddings + x = x.transpose(0, 1) + x = self.dropout_module(x) + x, _ = self.emb_ctx.forward(x) + x = x.transpose(0, 1) + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + x = self.dropout_module(x) + return x, embed + + +@register_model_architecture("gru_transformer", "gru_transformer") +def gru_transformer_base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.no_cross_attention = getattr(args, "no_cross_attention", False) + args.cross_self_attention = getattr(args, "cross_self_attention", False) + args.layer_wise_attention = getattr(args, "layer_wise_attention", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + args.layernorm_embedding = getattr(args, "layernorm_embedding", False) + + +@register_model_architecture("gru_transformer", "gru_transformer_big") +def gru_transformer_big(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.3) + gru_transformer_base_architecture(args) diff --git a/SpeechT5/fairseq/examples/camembert/README.md b/SpeechT5/fairseq/examples/camembert/README.md new file mode 100644 index 0000000..5ef4fe3 --- /dev/null +++ b/SpeechT5/fairseq/examples/camembert/README.md @@ -0,0 +1,75 @@ +# CamemBERT: a Tasty French Language Model + +## Introduction + +[CamemBERT](https://arxiv.org/abs/1911.03894) is a pretrained language model trained on 138GB of French text based on RoBERTa. + +Also available in [github.com/huggingface/transformers](https://github.com/huggingface/transformers/). + +## Pre-trained models + +| Model | #params | Download | Arch. | Training data | +|--------------------------------|---------|--------------------------------------------------------------------------------------------------------------------------|-------|-----------------------------------| +| `camembert` / `camembert-base` | 110M | [camembert-base.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/camembert-base.tar.gz) | Base | OSCAR (138 GB of text) | +| `camembert-large` | 335M | [camembert-large.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/camembert-large.tar.gz) | Large | CCNet (135 GB of text) | +| `camembert-base-ccnet` | 110M | [camembert-base-ccnet.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/camembert-base-ccnet.tar.gz) | Base | CCNet (135 GB of text) | +| `camembert-base-wikipedia-4gb` | 110M | [camembert-base-wikipedia-4gb.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/camembert-base-wikipedia-4gb.tar.gz) | Base | Wikipedia (4 GB of text) | +| `camembert-base-oscar-4gb` | 110M | [camembert-base-oscar-4gb.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/camembert-base-oscar-4gb.tar.gz) | Base | Subsample of OSCAR (4 GB of text) | +| `camembert-base-ccnet-4gb` | 110M | [camembert-base-ccnet-4gb.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/camembert-base-ccnet-4gb.tar.gz) | Base | Subsample of CCNet (4 GB of text) | + +## Example usage + +### fairseq +##### Load CamemBERT from torch.hub (PyTorch >= 1.1): +```python +import torch +camembert = torch.hub.load('pytorch/fairseq', 'camembert') +camembert.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Load CamemBERT (for PyTorch 1.0 or custom models): +```python +# Download camembert model +wget https://dl.fbaipublicfiles.com/fairseq/models/camembert-base.tar.gz +tar -xzvf camembert.tar.gz + +# Load the model in fairseq +from fairseq.models.roberta import CamembertModel +camembert = CamembertModel.from_pretrained('/path/to/camembert') +camembert.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Filling masks: +```python +masked_line = 'Le camembert est :)' +camembert.fill_mask(masked_line, topk=3) +# [('Le camembert est délicieux :)', 0.4909118115901947, ' délicieux'), +# ('Le camembert est excellent :)', 0.10556942224502563, ' excellent'), +# ('Le camembert est succulent :)', 0.03453322499990463, ' succulent')] +``` + +##### Extract features from Camembert: +```python +# Extract the last layer's features +line = "J'aime le camembert !" +tokens = camembert.encode(line) +last_layer_features = camembert.extract_features(tokens) +assert last_layer_features.size() == torch.Size([1, 10, 768]) + +# Extract all layer's features (layer 0 is the embedding layer) +all_layers = camembert.extract_features(tokens, return_all_hiddens=True) +assert len(all_layers) == 13 +assert torch.all(all_layers[-1] == last_layer_features) +``` + +## Citation +If you use our work, please cite: + +```bibtex +@inproceedings{martin2020camembert, + title={CamemBERT: a Tasty French Language Model}, + author={Martin, Louis and Muller, Benjamin and Su{\'a}rez, Pedro Javier Ortiz and Dupont, Yoann and Romary, Laurent and de la Clergerie, {\'E}ric Villemonte and Seddah, Djam{\'e} and Sagot, Beno{\^\i}t}, + booktitle={Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics}, + year={2020} +} +``` diff --git a/SpeechT5/fairseq/examples/constrained_decoding/README.md b/SpeechT5/fairseq/examples/constrained_decoding/README.md new file mode 100644 index 0000000..cfca9c9 --- /dev/null +++ b/SpeechT5/fairseq/examples/constrained_decoding/README.md @@ -0,0 +1,123 @@ +# (Vectorized) Lexically constrained decoding with dynamic beam allocation + +This page provides instructions for how to use lexically constrained decoding in Fairseq. +Fairseq implements the code described in the following papers: + +* [Fast Lexically Constrained Decoding With Dynamic Beam Allocation](https://www.aclweb.org/anthology/N18-1119/) (Post & Vilar, 2018) +* [Improved Lexically Constrained Decoding for Translation and Monolingual Rewriting](https://www.aclweb.org/anthology/N19-1090/) (Hu et al., 2019) + +## Quick start + +Constrained search is enabled by adding the command-line argument `--constraints` to `fairseq-interactive`. +Constraints are appended to each line of input, separated by tabs. Each constraint (one or more tokens) +is a separate field. + +The following command, using [Fairseq's WMT19 German--English model](https://github.com/pytorch/fairseq/blob/master/examples/wmt19/README.md), +translates the sentence *Die maschinelle Übersetzung ist schwer zu kontrollieren.* with the constraints +"hard" and "to influence". + + echo -e "Die maschinelle Übersetzung ist schwer zu kontrollieren.\thard\ttoinfluence" \ + | normalize.py | tok.py \ + | fairseq-interactive /path/to/model \ + --path /path/to/model/model1.pt \ + --bpe fastbpe \ + --bpe-codes /path/to/model/bpecodes \ + --constraints \ + -s de -t en \ + --beam 10 + +(tok.py and normalize.py can be found in the same directory as this README; they are just shortcuts around Fairseq's WMT19 preprocessing). +This will generate the following output: + + [snip] + S-0 Die masch@@ in@@ elle Über@@ setzung ist schwer zu kontrollieren . + W-0 1.844 seconds + C-0 hard + C-0 influence + H-0 -1.5333266258239746 Mach@@ ine trans@@ lation is hard to influence . + D-0 -1.5333266258239746 Machine translation is hard to influence . + P-0 -0.5434 -0.1423 -0.1930 -0.1415 -0.2346 -1.8031 -0.1701 -11.7727 -0.1815 -0.1511 + +By default, constraints are generated in the order supplied, with any number (zero or more) of tokens generated +between constraints. If you wish for the decoder to order the constraints, then use `--constraints unordered`. +Note that you may want to use a larger beam. + +## Implementation details + +The heart of the implementation is in `fairseq/search.py`, which adds a `LexicallyConstrainedBeamSearch` instance. +This instance of beam search tracks the progress of each hypothesis in the beam through the set of constraints +provided for each input sentence. It does this using one of two classes, both found in `fairseq/token_generation_contstraints.py`: + +* OrderedConstraintState: assumes the `C` input constraints will be generated in the provided order +* UnorderedConstraintState: tries to apply `C` (phrasal) constraints in all `C!` orders + +## Differences from Sockeye + +There are a number of [differences from Sockeye's implementation](https://awslabs.github.io/sockeye/inference.html#lexical-constraints). + +* Generating constraints in the order supplied (the default option here) is not available in Sockeye. +* Due to an improved beam allocation method, there is no need to prune the beam. +* Again due to better allocation, beam sizes as low as 10 or even 5 are often sufficient. +* [The vector extensions described in Hu et al.](https://github.com/edwardjhu/sockeye/tree/trie_constraints) (NAACL 2019) were never merged + into the main Sockeye branch. + +## Citation + +The paper first describing lexical constraints for seq2seq decoding is: + +```bibtex +@inproceedings{hokamp-liu-2017-lexically, + title = "Lexically Constrained Decoding for Sequence Generation Using Grid Beam Search", + author = "Hokamp, Chris and + Liu, Qun", + booktitle = "Proceedings of the 55th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)", + month = jul, + year = "2017", + address = "Vancouver, Canada", + publisher = "Association for Computational Linguistics", + url = "https://www.aclweb.org/anthology/P17-1141", + doi = "10.18653/v1/P17-1141", + pages = "1535--1546", +} +``` + +The fairseq implementation uses the extensions described in + +```bibtex +@inproceedings{post-vilar-2018-fast, + title = "Fast Lexically Constrained Decoding with Dynamic Beam Allocation for Neural Machine Translation", + author = "Post, Matt and + Vilar, David", + booktitle = "Proceedings of the 2018 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers)", + month = jun, + year = "2018", + address = "New Orleans, Louisiana", + publisher = "Association for Computational Linguistics", + url = "https://www.aclweb.org/anthology/N18-1119", + doi = "10.18653/v1/N18-1119", + pages = "1314--1324", +} +``` + +and + +```bibtex +@inproceedings{hu-etal-2019-improved, + title = "Improved Lexically Constrained Decoding for Translation and Monolingual Rewriting", + author = "Hu, J. Edward and + Khayrallah, Huda and + Culkin, Ryan and + Xia, Patrick and + Chen, Tongfei and + Post, Matt and + Van Durme, Benjamin", + booktitle = "Proceedings of the 2019 Conference of the North {A}merican Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long and Short Papers)", + month = jun, + year = "2019", + address = "Minneapolis, Minnesota", + publisher = "Association for Computational Linguistics", + url = "https://www.aclweb.org/anthology/N19-1090", + doi = "10.18653/v1/N19-1090", + pages = "839--850", +} +``` diff --git a/SpeechT5/fairseq/examples/constrained_decoding/normalize.py b/SpeechT5/fairseq/examples/constrained_decoding/normalize.py new file mode 100644 index 0000000..4ae2b51 --- /dev/null +++ b/SpeechT5/fairseq/examples/constrained_decoding/normalize.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + +from sacremoses.normalize import MosesPunctNormalizer + + +def main(args): + normalizer = MosesPunctNormalizer(lang=args.lang, penn=args.penn) + for line in sys.stdin: + print(normalizer.normalize(line.rstrip()), flush=True) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("--lang", "-l", default="en") + parser.add_argument("--penn", "-p", action="store_true") + args = parser.parse_args() + + main(args) diff --git a/SpeechT5/fairseq/examples/constrained_decoding/tok.py b/SpeechT5/fairseq/examples/constrained_decoding/tok.py new file mode 100644 index 0000000..b1f888a --- /dev/null +++ b/SpeechT5/fairseq/examples/constrained_decoding/tok.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + +import sacremoses + + +def main(args): + """Tokenizes, preserving tabs""" + mt = sacremoses.MosesTokenizer(lang=args.lang) + + def tok(s): + return mt.tokenize(s, return_str=True) + + for line in sys.stdin: + parts = list(map(tok, line.split("\t"))) + print(*parts, sep="\t", flush=True) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("--lang", "-l", default="en") + parser.add_argument("--penn", "-p", action="store_true") + parser.add_argument("--fields", "-f", help="fields to tokenize") + args = parser.parse_args() + + main(args) diff --git a/SpeechT5/fairseq/examples/conv_seq2seq/README.md b/SpeechT5/fairseq/examples/conv_seq2seq/README.md new file mode 100644 index 0000000..95fe7e7 --- /dev/null +++ b/SpeechT5/fairseq/examples/conv_seq2seq/README.md @@ -0,0 +1,25 @@ +# Convolutional Sequence to Sequence Learning (Gehring et al., 2017) + +## Pre-trained models + +Description | Dataset | Model | Test set(s) +---|---|---|--- +Convolutional
    ([Gehring et al., 2017](https://arxiv.org/abs/1705.03122)) | [WMT14 English-French](http://statmt.org/wmt14/translation-task.html#Download) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt14.v2.en-fr.fconv-py.tar.bz2) | newstest2014:
    [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.v2.en-fr.newstest2014.tar.bz2)
    newstest2012/2013:
    [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.v2.en-fr.ntst1213.tar.bz2) +Convolutional
    ([Gehring et al., 2017](https://arxiv.org/abs/1705.03122)) | [WMT14 English-German](http://statmt.org/wmt14/translation-task.html#Download) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt14.en-de.fconv-py.tar.bz2) | newstest2014:
    [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.en-de.newstest2014.tar.bz2) +Convolutional
    ([Gehring et al., 2017](https://arxiv.org/abs/1705.03122)) | [WMT17 English-German](http://statmt.org/wmt17/translation-task.html#Download) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt17.v2.en-de.fconv-py.tar.bz2) | newstest2014:
    [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt17.v2.en-de.newstest2014.tar.bz2) + +## Example usage + +See the [translation README](../translation/README.md) for instructions on reproducing results for WMT'14 En-De and +WMT'14 En-Fr using the `fconv_wmt_en_de` and `fconv_wmt_en_fr` model architectures. + +## Citation + +```bibtex +@inproceedings{gehring2017convs2s, + title = {Convolutional Sequence to Sequence Learning}, + author = {Gehring, Jonas, and Auli, Michael and Grangier, David and Yarats, Denis and Dauphin, Yann N}, + booktitle = {Proc. of ICML}, + year = 2017, +} +``` diff --git a/SpeechT5/fairseq/examples/criss/README.md b/SpeechT5/fairseq/examples/criss/README.md new file mode 100644 index 0000000..4689ed7 --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/README.md @@ -0,0 +1,61 @@ +# Cross-lingual Retrieval for Iterative Self-Supervised Training + +https://arxiv.org/pdf/2006.09526.pdf + +## Introduction + +CRISS is a multilingual sequence-to-sequnce pretraining method where mining and training processes are applied iteratively, improving cross-lingual alignment and translation ability at the same time. + +## Requirements: + +* faiss: https://github.com/facebookresearch/faiss +* mosesdecoder: https://github.com/moses-smt/mosesdecoder +* flores: https://github.com/facebookresearch/flores +* LASER: https://github.com/facebookresearch/LASER + +## Unsupervised Machine Translation +##### 1. Download and decompress CRISS checkpoints +``` +cd examples/criss +wget https://dl.fbaipublicfiles.com/criss/criss_3rd_checkpoints.tar.gz +tar -xf criss_checkpoints.tar.gz +``` +##### 2. Download and preprocess Flores test dataset +Make sure to run all scripts from examples/criss directory +``` +bash download_and_preprocess_flores_test.sh +``` + +##### 3. Run Evaluation on Sinhala-English +``` +bash unsupervised_mt/eval.sh +``` + +## Sentence Retrieval +##### 1. Download and preprocess Tatoeba dataset +``` +bash download_and_preprocess_tatoeba.sh +``` + +##### 2. Run Sentence Retrieval on Tatoeba Kazakh-English +``` +bash sentence_retrieval/sentence_retrieval_tatoeba.sh +``` + +## Mining +##### 1. Install faiss +Follow instructions on https://github.com/facebookresearch/faiss/blob/master/INSTALL.md +##### 2. Mine pseudo-parallel data between Kazakh and English +``` +bash mining/mine_example.sh +``` + +## Citation +```bibtex +@article{tran2020cross, + title={Cross-lingual retrieval for iterative self-supervised training}, + author={Tran, Chau and Tang, Yuqing and Li, Xian and Gu, Jiatao}, + journal={arXiv preprint arXiv:2006.09526}, + year={2020} +} +``` diff --git a/SpeechT5/fairseq/examples/criss/download_and_preprocess_flores_test.sh b/SpeechT5/fairseq/examples/criss/download_and_preprocess_flores_test.sh new file mode 100644 index 0000000..ed4b390 --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/download_and_preprocess_flores_test.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +SPM_ENCODE=flores/scripts/spm_encode.py +DATA=data_tmp +SPM_MODEL=criss_checkpoints/sentence.bpe.model +DICT=criss_checkpoints/dict.txt + +download_data() { + CORPORA=$1 + URL=$2 + + if [ -f $CORPORA ]; then + echo "$CORPORA already exists, skipping download" + else + echo "Downloading $URL" + wget $URL -O $CORPORA --no-check-certificate || rm -f $CORPORA + if [ -f $CORPORA ]; then + echo "$URL successfully downloaded." + else + echo "$URL not successfully downloaded." + rm -f $CORPORA + fi + fi +} + +if [[ -f flores ]]; then + echo "flores already cloned" +else + git clone https://github.com/facebookresearch/flores +fi + +mkdir -p $DATA +download_data $DATA/wikipedia_en_ne_si_test_sets.tgz "https://github.com/facebookresearch/flores/raw/master/data/wikipedia_en_ne_si_test_sets.tgz" +pushd $DATA +pwd +tar -vxf wikipedia_en_ne_si_test_sets.tgz +popd + + +for lang in ne_NP si_LK; do + datadir=$DATA/${lang}-en_XX-flores + rm -rf $datadir + mkdir -p $datadir + TEST_PREFIX=$DATA/wikipedia_en_ne_si_test_sets/wikipedia.test + python $SPM_ENCODE \ + --model ${SPM_MODEL} \ + --output_format=piece \ + --inputs ${TEST_PREFIX}.${lang:0:2}-en.${lang:0:2} ${TEST_PREFIX}.${lang:0:2}-en.en \ + --outputs $datadir/test.bpe.${lang}-en_XX.${lang} $datadir/test.bpe.${lang}-en_XX.en_XX + + # binarize data + fairseq-preprocess \ + --source-lang ${lang} --target-lang en_XX \ + --testpref $datadir/test.bpe.${lang}-en_XX \ + --destdir $datadir \ + --srcdict ${DICT} \ + --joined-dictionary \ + --workers 4 +done diff --git a/SpeechT5/fairseq/examples/criss/download_and_preprocess_tatoeba.sh b/SpeechT5/fairseq/examples/criss/download_and_preprocess_tatoeba.sh new file mode 100644 index 0000000..7ed64f0 --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/download_and_preprocess_tatoeba.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +SPM_ENCODE=flores/scripts/spm_encode.py +DATA=data_tmp +SPM_MODEL=criss_checkpoints/sentence.bpe.model +DICT=criss_checkpoints/dict.txt + +if [[ -f flores ]]; then + echo "flores already cloned" +else + git clone https://github.com/facebookresearch/flores +fi +if [[ -f LASER ]]; then + echo "LASER already cloned" +else + git clone https://github.com/facebookresearch/LASER +fi +mkdir -p data_tmp +declare -A lang_tatoeba_map=( ["ar_AR"]="ara" ["de_DE"]="deu" ["es_XX"]="spa" ["et_EE"]="est" ["fi_FI"]="fin" ["fr_XX"]="fra" ["hi_IN"]="hin" ["it_IT"]="ita" ["ja_XX"]="jpn" ["ko_KR"]="kor" ["kk_KZ"]="kaz" ["nl_XX"]="nld" ["ru_RU"]="rus" ["tr_TR"]="tur" ["vi_VN"]="vie" ["zh_CN"]="cmn") +for lang in ar_AR de_DE es_XX et_EE fi_FI fr_XX hi_IN it_IT ja_XX kk_KZ ko_KR nl_XX ru_RU tr_TR vi_VN zh_CN; do + lang_tatoeba=${lang_tatoeba_map[$lang]} + echo $lang_tatoeba + datadir=$DATA/${lang}-en_XX-tatoeba + rm -rf $datadir + mkdir -p $datadir + TEST_PREFIX=LASER/data/tatoeba/v1/tatoeba + python $SPM_ENCODE \ + --model ${SPM_MODEL} \ + --output_format=piece \ + --inputs ${TEST_PREFIX}.${lang_tatoeba}-eng.${lang_tatoeba} ${TEST_PREFIX}.${lang_tatoeba}-eng.eng \ + --outputs $datadir/test.bpe.${lang}-en_XX.${lang} $datadir/test.bpe.${lang}-en_XX.en_XX + + # binarize data + fairseq-preprocess \ + --source-lang ${lang} --target-lang en_XX \ + --testpref $datadir/test.bpe.${lang}-en_XX \ + --destdir $datadir \ + --srcdict ${DICT} \ + --joined-dictionary \ + --workers 4 +done diff --git a/SpeechT5/fairseq/examples/criss/mining/mine.py b/SpeechT5/fairseq/examples/criss/mining/mine.py new file mode 100644 index 0000000..c872da1 --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/mining/mine.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import argparse +import glob +from subprocess import check_call + +try: + import faiss + + has_faiss = True +except ImportError: + has_faiss = False +import numpy as np + + +GB = 1024 * 1024 * 1024 + + +def call(cmd): + print(cmd) + check_call(cmd, shell=True) + + +def get_batches(directory, lang, prefix="all_avg_pool"): + print(f"Finding in {directory}/{prefix}.{lang}*") + files = glob.glob(f"{directory}/{prefix}.{lang}*") + emb_files = [] + txt_files = [] + for emb_fi in files: + emb_files.append(emb_fi) + txt_fi = emb_fi.replace(prefix, "sentences") + txt_files.append(txt_fi) + return emb_files, txt_files + + +def load_batch(emb_file, dim): + embeddings = np.fromfile(emb_file, dtype=np.float32) + num_rows = int(embeddings.shape[0] / dim) + embeddings = embeddings.reshape((num_rows, dim)) + faiss.normalize_L2(embeddings) + return embeddings + + +def knnGPU_sharded(x_batches_f, y_batches_f, dim, k, direction="x2y"): + if not has_faiss: + raise ImportError("Please install Faiss") + sims = [] + inds = [] + xfrom = 0 + xto = 0 + for x_batch_f in x_batches_f: + yfrom = 0 + yto = 0 + x_batch = load_batch(x_batch_f, dim) + xto = xfrom + x_batch.shape[0] + bsims, binds = [], [] + for y_batch_f in y_batches_f: + y_batch = load_batch(y_batch_f, dim) + neighbor_size = min(k, y_batch.shape[0]) + yto = yfrom + y_batch.shape[0] + print("{}-{} -> {}-{}".format(xfrom, xto, yfrom, yto)) + idx = faiss.IndexFlatIP(dim) + idx = faiss.index_cpu_to_all_gpus(idx) + idx.add(y_batch) + bsim, bind = idx.search(x_batch, neighbor_size) + + bsims.append(bsim) + binds.append(bind + yfrom) + yfrom += y_batch.shape[0] + del idx + del y_batch + bsims = np.concatenate(bsims, axis=1) + binds = np.concatenate(binds, axis=1) + aux = np.argsort(-bsims, axis=1) + sim_batch = np.zeros((x_batch.shape[0], k), dtype=np.float32) + ind_batch = np.zeros((x_batch.shape[0], k), dtype=np.int64) + for i in range(x_batch.shape[0]): + for j in range(k): + sim_batch[i, j] = bsims[i, aux[i, j]] + ind_batch[i, j] = binds[i, aux[i, j]] + sims.append(sim_batch) + inds.append(ind_batch) + xfrom += x_batch.shape[0] + del x_batch + sim = np.concatenate(sims, axis=0) + ind = np.concatenate(inds, axis=0) + return sim, ind + + +def score(sim, fwd_mean, bwd_mean, margin): + return margin(sim, (fwd_mean + bwd_mean) / 2) + + +def score_candidates( + sim_mat, candidate_inds, fwd_mean, bwd_mean, margin, verbose=False +): + print(" - scoring {:d} candidates".format(sim_mat.shape[0])) + scores = np.zeros(candidate_inds.shape) + for i in range(scores.shape[0]): + for j in range(scores.shape[1]): + k = int(candidate_inds[i, j]) + scores[i, j] = score(sim_mat[i, j], fwd_mean[i], bwd_mean[k], margin) + return scores + + +def load_text(files): + all_sentences = [] + for fi in files: + with open(fi) as sentence_fi: + for line in sentence_fi: + all_sentences.append(line.strip()) + print(f"Read {len(all_sentences)} sentences") + return all_sentences + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Mine bitext") + parser.add_argument("--src-lang", help="Source language") + parser.add_argument("--tgt-lang", help="Target language") + parser.add_argument( + "--dict-path", help="Path to dictionary file", default="dict.txt" + ) + parser.add_argument( + "--spm-path", help="Path to SPM model file", default="sentence.bpe.model" + ) + parser.add_argument("--dim", type=int, default=1024, help="Embedding dimension") + parser.add_argument("--mem", type=int, default=5, help="Memory in GB") + parser.add_argument("--src-dir", help="Source directory") + parser.add_argument("--tgt-dir", help="Target directory") + parser.add_argument("--output", help="Output path") + parser.add_argument( + "--neighborhood", type=int, default=4, help="Embedding dimension" + ) + parser.add_argument( + "--threshold", type=float, default=1.06, help="Threshold on mined bitext" + ) + parser.add_argument( + "--valid-size", + type=int, + default=2000, + help="Number of sentences used for validation set", + ) + parser.add_argument( + "--min-count", + type=int, + default=50000, + help="Min num sentences used for each language", + ) + args = parser.parse_args() + + x_batches_f, x_sents_f = get_batches(args.src_dir, args.src_lang) + y_batches_f, y_sents_f = get_batches(args.tgt_dir, args.tgt_lang) + margin = lambda a, b: a / b + y2x_sim, y2x_ind = knnGPU_sharded( + y_batches_f, x_batches_f, args.dim, args.neighborhood, direction="y2x" + ) + x2y_sim, x2y_ind = knnGPU_sharded( + x_batches_f, y_batches_f, args.dim, args.neighborhood, direction="x2y" + ) + + x2y_mean = x2y_sim.mean(axis=1) + y2x_mean = y2x_sim.mean(axis=1) + fwd_scores = score_candidates(x2y_sim, x2y_ind, x2y_mean, y2x_mean, margin) + bwd_scores = score_candidates(y2x_sim, y2x_ind, y2x_mean, x2y_mean, margin) + fwd_best = x2y_ind[np.arange(x2y_sim.shape[0]), fwd_scores.argmax(axis=1)] + bwd_best = y2x_ind[np.arange(y2x_sim.shape[0]), bwd_scores.argmax(axis=1)] + indices = np.stack( + ( + np.concatenate((np.arange(x2y_ind.shape[0]), bwd_best)), + np.concatenate((fwd_best, np.arange(y2x_ind.shape[0]))), + ), + axis=1, + ) + scores = np.concatenate((fwd_scores.max(axis=1), bwd_scores.max(axis=1))) + + x_sentences = load_text(x_sents_f) + y_sentences = load_text(y_sents_f) + + threshold = args.threshold + min_count = args.min_count + seen_src, seen_trg = set(), set() + directory = args.output + call(f"mkdir -p {directory}") + src_out = open( + f"{directory}/all.{args.src_lang}", + mode="w", + encoding="utf-8", + errors="surrogateescape", + ) + tgt_out = open( + f"{directory}/all.{args.tgt_lang}", + mode="w", + encoding="utf-8", + errors="surrogateescape", + ) + scores_out = open( + f"{directory}/all.scores", mode="w", encoding="utf-8", errors="surrogateescape" + ) + count = 0 + for i in np.argsort(-scores): + src_ind, trg_ind = indices[i] + if src_ind not in seen_src and trg_ind not in seen_trg: + seen_src.add(src_ind) + seen_trg.add(trg_ind) + if scores[i] > threshold or count < min_count: + if x_sentences[src_ind]: + print(scores[i], file=scores_out) + print(x_sentences[src_ind], file=src_out) + print(y_sentences[trg_ind], file=tgt_out) + count += 1 + else: + print(f"Ignoring sentence: {x_sentences[src_ind]}") + src_out.close() + tgt_out.close() + scores_out.close() + + print(f"Found {count} pairs for threshold={threshold}") + with open(f"{directory}/all.{args.src_lang}") as all_s, open( + f"{directory}/all.{args.tgt_lang}" + ) as all_t, open(f"{directory}/valid.{args.src_lang}", "w") as valid_s, open( + f"{directory}/valid.{args.tgt_lang}", "w" + ) as valid_t, open( + f"{directory}/train.{args.src_lang}", "w" + ) as train_s, open( + f"{directory}/train.{args.tgt_lang}", "w" + ) as train_t: + count = 0 + for s_line, t_line in zip(all_s, all_t): + s_line = s_line.split("\t")[1] + t_line = t_line.split("\t")[1] + if count >= args.valid_size: + train_s.write(s_line) + train_t.write(t_line) + else: + valid_s.write(s_line) + valid_t.write(t_line) + count += 1 diff --git a/SpeechT5/fairseq/examples/criss/mining/mine_example.sh b/SpeechT5/fairseq/examples/criss/mining/mine_example.sh new file mode 100644 index 0000000..ace995a --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/mining/mine_example.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# +source_lang=kk_KZ +target_lang=en_XX +MODEL=criss_checkpoints/criss.3rd.pt +SPM=criss_checkpoints/sentence.bpe.model +SPLIT=test +LANG_DICT=criss_checkpoints/lang_dict.txt +SPM_ENCODE=flores/scripts/spm_encode.py +SAVE_ENCODER=save_encoder.py +ENCODER_SAVE_ROOT=sentence_embeddings/$MODEL +DICT=criss_checkpoints/dict.txt +THRESHOLD=1.02 +MIN_COUNT=500 + +DATA_DIR=data_tmp +SAVE_DIR=mining/${source_lang}_${target_lang}_mined +ENCODER_SAVE_DIR=${ENCODER_SAVE_ROOT}/${source_lang}-${target_lang} +INPUT_DIR=$DATA_DIR/${source_lang}-${target_lang}-tatoeba + +mkdir -p $ENCODER_SAVE_DIR/${target_lang} +mkdir -p $ENCODER_SAVE_DIR/${source_lang} +mkdir -p $SAVE_DIR + +## Save encoder outputs + +# Save encoder outputs for source sentences +python $SAVE_ENCODER \ + ${INPUT_DIR} \ + --path ${MODEL} \ + --task translation_multi_simple_epoch \ + --lang-pairs ${source_lang}-${target_lang} \ + --lang-dict ${LANG_DICT} \ + --gen-subset ${SPLIT} \ + --bpe 'sentencepiece' \ + -s ${source_lang} -t ${target_lang} \ + --sentencepiece-model ${SPM} \ + --remove-bpe 'sentencepiece' \ + --beam 1 \ + --lang-tok-style mbart \ + --encoder-save-dir ${ENCODER_SAVE_DIR}/${source_lang} + +## Save encoder outputs for target sentences +python $SAVE_ENCODER \ + ${INPUT_DIR} \ + --path ${MODEL} \ + --lang-pairs ${source_lang}-${target_lang} \ + --lang-dict ${LANG_DICT} \ + --task translation_multi_simple_epoch \ + --gen-subset ${SPLIT} \ + --bpe 'sentencepiece' \ + -t ${source_lang} -s ${target_lang} \ + --sentencepiece-model ${SPM} \ + --remove-bpe 'sentencepiece' \ + --beam 1 \ + --lang-tok-style mbart \ + --encoder-save-dir ${ENCODER_SAVE_DIR}/${target_lang} + +## Mining +python mining/mine.py \ + --src-lang ${source_lang} \ + --tgt-lang ${target_lang} \ + --dim 1024 \ + --mem 10 \ + --neighborhood 4 \ + --src-dir ${ENCODER_SAVE_DIR}/${source_lang} \ + --tgt-dir ${ENCODER_SAVE_DIR}/${target_lang} \ + --output $SAVE_DIR \ + --threshold ${THRESHOLD} \ + --min-count ${MIN_COUNT} \ + --valid-size 100 \ + --dict-path ${DICT} \ + --spm-path ${SPM} \ + + +## Process and binarize mined data +python $SPM_ENCODE \ + --model ${SPM} \ + --output_format=piece \ + --inputs mining/${source_lang}_${target_lang}_mined/train.${source_lang} mining/${source_lang}_${target_lang}_mined/train.${target_lang} \ + --outputs mining/${source_lang}_${target_lang}_mined/train.bpe.${source_lang} mining/${source_lang}_${target_lang}_mined/train.bpe.${target_lang} + +python $SPM_ENCODE \ + --model ${SPM} \ + --output_format=piece \ + --inputs mining/${source_lang}_${target_lang}_mined/valid.${source_lang} mining/${source_lang}_${target_lang}_mined/valid.${target_lang} \ + --outputs mining/${source_lang}_${target_lang}_mined/valid.bpe.${source_lang} mining/${source_lang}_${target_lang}_mined/valid.bpe.${target_lang} + + +fairseq-preprocess \ + --source-lang ${source_lang} \ + --target-lang ${target_lang} \ + --trainpref mining/${source_lang}_${target_lang}_mined/train.bpe \ + --validpref mining/${source_lang}_${target_lang}_mined/valid.bpe \ + --destdir mining/${source_lang}_${target_lang}_mined \ + --srcdict ${DICT} \ + --joined-dictionary \ + --workers 8 diff --git a/SpeechT5/fairseq/examples/criss/save_encoder.py b/SpeechT5/fairseq/examples/criss/save_encoder.py new file mode 100644 index 0000000..d911d06 --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/save_encoder.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Translate pre-processed data with a trained model. +""" + +import numpy as np +import torch +from fairseq import checkpoint_utils, options, progress_bar, tasks, utils +from fairseq.sequence_generator import EnsembleModel + + +def get_avg_pool( + models, sample, prefix_tokens, src_dict, remove_bpe, has_langtok=False +): + model = EnsembleModel(models) + + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in sample["net_input"].items() if k != "prev_output_tokens" + } + + # compute the encoder output for each beam + encoder_outs = model.forward_encoder(encoder_input) + np_encoder_outs = encoder_outs[0].encoder_out.cpu().numpy().astype(np.float32) + encoder_mask = 1 - encoder_outs[0].encoder_padding_mask.cpu().numpy().astype( + np.float32 + ) + encoder_mask = np.expand_dims(encoder_mask.T, axis=2) + if has_langtok: + encoder_mask = encoder_mask[1:, :, :] + np_encoder_outs = np_encoder_outs[1, :, :] + masked_encoder_outs = encoder_mask * np_encoder_outs + avg_pool = (masked_encoder_outs / encoder_mask.sum(axis=0)).sum(axis=0) + return avg_pool + + +def main(args): + assert args.path is not None, "--path required for generation!" + assert ( + not args.sampling or args.nbest == args.beam + ), "--sampling requires --nbest to be equal to --beam" + assert ( + args.replace_unk is None or args.raw_text + ), "--replace-unk requires a raw text dataset (--raw-text)" + + args.beam = 1 + utils.import_user_module(args) + + if args.max_tokens is None: + args.max_tokens = 12000 + print(args) + use_cuda = torch.cuda.is_available() and not args.cpu + + # Load dataset splits + task = tasks.setup_task(args) + task.load_dataset(args.gen_subset) + + # Set dictionaries + try: + src_dict = getattr(task, "source_dictionary", None) + except NotImplementedError: + src_dict = None + tgt_dict = task.target_dictionary + + # Load ensemble + print("| loading model(s) from {}".format(args.path)) + models, _model_args = checkpoint_utils.load_model_ensemble( + args.path.split(":"), + arg_overrides=eval(args.model_overrides), + task=task, + ) + + # Optimize ensemble for generation + for model in models: + model.make_generation_fast_( + beamable_mm_beam_size=None if args.no_beamable_mm else args.beam, + need_attn=args.print_alignment, + ) + if args.fp16: + model.half() + if use_cuda: + model.cuda() + + # Load alignment dictionary for unknown word replacement + # (None if no unknown word replacement, empty if no path to align dictionary) + align_dict = utils.load_align_dict(args.replace_unk) + + # Load dataset (possibly sharded) + itr = task.get_batch_iterator( + dataset=task.dataset(args.gen_subset), + max_tokens=args.max_tokens, + max_positions=utils.resolve_max_positions( + task.max_positions(), + ), + ignore_invalid_inputs=args.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=args.required_batch_size_multiple, + num_shards=args.num_shards, + shard_id=args.shard_id, + num_workers=args.num_workers, + ).next_epoch_itr(shuffle=False) + + num_sentences = 0 + source_sentences = [] + shard_id = 0 + all_avg_pool = None + encoder_has_langtok = ( + hasattr(task.args, "encoder_langtok") + and task.args.encoder_langtok is not None + and hasattr(task.args, "lang_tok_replacing_bos_eos") + and not task.args.lang_tok_replacing_bos_eos + ) + with progress_bar.build_progress_bar(args, itr) as t: + for sample in t: + if sample is None: + print("Skipping None") + continue + sample = utils.move_to_cuda(sample) if use_cuda else sample + if "net_input" not in sample: + continue + + prefix_tokens = None + if args.prefix_size > 0: + prefix_tokens = sample["target"][:, : args.prefix_size] + + with torch.no_grad(): + avg_pool = get_avg_pool( + models, + sample, + prefix_tokens, + src_dict, + args.post_process, + has_langtok=encoder_has_langtok, + ) + if all_avg_pool is not None: + all_avg_pool = np.concatenate((all_avg_pool, avg_pool)) + else: + all_avg_pool = avg_pool + + if not isinstance(sample["id"], list): + sample_ids = sample["id"].tolist() + else: + sample_ids = sample["id"] + for i, sample_id in enumerate(sample_ids): + # Remove padding + src_tokens = utils.strip_pad( + sample["net_input"]["src_tokens"][i, :], tgt_dict.pad() + ) + + # Either retrieve the original sentences or regenerate them from tokens. + if align_dict is not None: + src_str = task.dataset(args.gen_subset).src.get_original_text( + sample_id + ) + else: + if src_dict is not None: + src_str = src_dict.string(src_tokens, args.post_process) + else: + src_str = "" + + if not args.quiet: + if src_dict is not None: + print("S-{}\t{}".format(sample_id, src_str)) + + source_sentences.append(f"{sample_id}\t{src_str}") + + num_sentences += sample["nsentences"] + if all_avg_pool.shape[0] >= 1000000: + with open( + f"{args.encoder_save_dir}/all_avg_pool.{args.source_lang}.{shard_id}", + "w", + ) as avg_pool_file: + all_avg_pool.tofile(avg_pool_file) + with open( + f"{args.encoder_save_dir}/sentences.{args.source_lang}.{shard_id}", + "w", + ) as sentence_file: + sentence_file.writelines(f"{line}\n" for line in source_sentences) + all_avg_pool = None + source_sentences = [] + shard_id += 1 + + if all_avg_pool is not None: + with open( + f"{args.encoder_save_dir}/all_avg_pool.{args.source_lang}.{shard_id}", "w" + ) as avg_pool_file: + all_avg_pool.tofile(avg_pool_file) + with open( + f"{args.encoder_save_dir}/sentences.{args.source_lang}.{shard_id}", "w" + ) as sentence_file: + sentence_file.writelines(f"{line}\n" for line in source_sentences) + return None + + +def cli_main(): + parser = options.get_generation_parser() + parser.add_argument( + "--encoder-save-dir", + default="", + type=str, + metavar="N", + help="directory to save encoder outputs", + ) + args = options.parse_args_and_arch(parser) + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/criss/sentence_retrieval/encoder_analysis.py b/SpeechT5/fairseq/examples/criss/sentence_retrieval/encoder_analysis.py new file mode 100644 index 0000000..b41bfbe --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/sentence_retrieval/encoder_analysis.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import argparse +import glob + +import numpy as np + + +DIM = 1024 + + +def compute_dist(source_embs, target_embs, k=5, return_sim_mat=False): + target_ids = [tid for tid in target_embs] + source_mat = np.stack(source_embs.values(), axis=0) + normalized_source_mat = source_mat / np.linalg.norm( + source_mat, axis=1, keepdims=True + ) + target_mat = np.stack(target_embs.values(), axis=0) + normalized_target_mat = target_mat / np.linalg.norm( + target_mat, axis=1, keepdims=True + ) + sim_mat = normalized_source_mat.dot(normalized_target_mat.T) + if return_sim_mat: + return sim_mat + neighbors_map = {} + for i, sentence_id in enumerate(source_embs): + idx = np.argsort(sim_mat[i, :])[::-1][:k] + neighbors_map[sentence_id] = [target_ids[tid] for tid in idx] + return neighbors_map + + +def load_embeddings(directory, LANGS): + sentence_embeddings = {} + sentence_texts = {} + for lang in LANGS: + sentence_embeddings[lang] = {} + sentence_texts[lang] = {} + lang_dir = f"{directory}/{lang}" + embedding_files = glob.glob(f"{lang_dir}/all_avg_pool.{lang}.*") + for embed_file in embedding_files: + shard_id = embed_file.split(".")[-1] + embeddings = np.fromfile(embed_file, dtype=np.float32) + num_rows = embeddings.shape[0] // DIM + embeddings = embeddings.reshape((num_rows, DIM)) + + with open(f"{lang_dir}/sentences.{lang}.{shard_id}") as sentence_file: + for idx, line in enumerate(sentence_file): + sentence_id, sentence = line.strip().split("\t") + sentence_texts[lang][sentence_id] = sentence + sentence_embeddings[lang][sentence_id] = embeddings[idx, :] + + return sentence_embeddings, sentence_texts + + +def compute_accuracy(directory, LANGS): + sentence_embeddings, sentence_texts = load_embeddings(directory, LANGS) + + top_1_accuracy = {} + + top1_str = " ".join(LANGS) + "\n" + for source_lang in LANGS: + top_1_accuracy[source_lang] = {} + top1_str += f"{source_lang} " + for target_lang in LANGS: + top1 = 0 + top5 = 0 + neighbors_map = compute_dist( + sentence_embeddings[source_lang], sentence_embeddings[target_lang] + ) + for sentence_id, neighbors in neighbors_map.items(): + if sentence_id == neighbors[0]: + top1 += 1 + if sentence_id in neighbors[:5]: + top5 += 1 + n = len(sentence_embeddings[target_lang]) + top1_str += f"{top1/n} " + top1_str += "\n" + + print(top1_str) + print(top1_str, file=open(f"{directory}/accuracy", "w")) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Analyze encoder outputs") + parser.add_argument("directory", help="Source language corpus") + parser.add_argument("--langs", help="List of langs") + args = parser.parse_args() + langs = args.langs.split(",") + compute_accuracy(args.directory, langs) diff --git a/SpeechT5/fairseq/examples/criss/sentence_retrieval/sentence_retrieval_tatoeba.sh b/SpeechT5/fairseq/examples/criss/sentence_retrieval/sentence_retrieval_tatoeba.sh new file mode 100644 index 0000000..0428d8b --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/sentence_retrieval/sentence_retrieval_tatoeba.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# +source_lang=kk_KZ +target_lang=en_XX +MODEL=criss_checkpoints/criss.3rd.pt +SPM=criss_checkpoints/sentence.bpe.model +SPLIT=test +LANG_DICT=criss_checkpoints/lang_dict.txt +ENCODER_ANALYSIS=sentence_retrieval/encoder_analysis.py +SAVE_ENCODER=save_encoder.py +ENCODER_SAVE_ROOT=sentence_embeddings/$MODEL + + + +DATA_DIR=data_tmp +INPUT_DIR=$DATA_DIR/${source_lang}-${target_lang}-tatoeba +ENCODER_SAVE_DIR=${ENCODER_SAVE_ROOT}/${source_lang}-${target_lang} +mkdir -p $ENCODER_SAVE_DIR/${target_lang} +mkdir -p $ENCODER_SAVE_DIR/${source_lang} + +# Save encoder outputs for source sentences +python $SAVE_ENCODER \ + ${INPUT_DIR} \ + --path ${MODEL} \ + --task translation_multi_simple_epoch \ + --lang-dict ${LANG_DICT} \ + --gen-subset ${SPLIT} \ + --bpe 'sentencepiece' \ + --lang-pairs ${source_lang}-${target_lang} \ + -s ${source_lang} -t ${target_lang} \ + --sentencepiece-model ${SPM} \ + --remove-bpe 'sentencepiece' \ + --beam 1 \ + --lang-tok-style mbart \ + --encoder-save-dir ${ENCODER_SAVE_DIR}/${source_lang} + +# Save encoder outputs for target sentences +python $SAVE_ENCODER \ + ${INPUT_DIR} \ + --path ${MODEL} \ + --lang-dict ${LANG_DICT} \ + --task translation_multi_simple_epoch \ + --gen-subset ${SPLIT} \ + --bpe 'sentencepiece' \ + --lang-pairs ${target_lang}-${source_lang} \ + -t ${source_lang} -s ${target_lang} \ + --sentencepiece-model ${SPM} \ + --remove-bpe 'sentencepiece' \ + --beam 1 \ + --lang-tok-style mbart \ + --encoder-save-dir ${ENCODER_SAVE_DIR}/${target_lang} + +# Analyze sentence retrieval accuracy +python $ENCODER_ANALYSIS --langs "${source_lang},${target_lang}" ${ENCODER_SAVE_DIR} diff --git a/SpeechT5/fairseq/examples/criss/unsupervised_mt/eval.sh b/SpeechT5/fairseq/examples/criss/unsupervised_mt/eval.sh new file mode 100644 index 0000000..03b773e --- /dev/null +++ b/SpeechT5/fairseq/examples/criss/unsupervised_mt/eval.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# +SRC=si_LK +TGT=en_XX +MODEL=criss_checkpoints/criss.3rd.pt + +MULTIBLEU=mosesdecoder/scripts/generic/multi-bleu.perl +MOSES=mosesdecoder +REPLACE_UNICODE_PUNCT=$MOSES/scripts/tokenizer/replace-unicode-punctuation.perl +NORM_PUNC=$MOSES/scripts/tokenizer/normalize-punctuation.perl +REM_NON_PRINT_CHAR=$MOSES/scripts/tokenizer/remove-non-printing-char.perl +TOKENIZER=$MOSES/scripts/tokenizer/tokenizer.perl +GEN_TMP_DIR=gen_tmp +LANG_DICT=criss_checkpoints/lang_dict.txt + +if [ ! -d "mosesdecoder" ]; then + git clone https://github.com/moses-smt/mosesdecoder +fi +mkdir -p $GEN_TMP_DIR +fairseq-generate data_tmp/${SRC}-${TGT}-flores \ + --task translation_multi_simple_epoch \ + --max-tokens 2000 \ + --path ${MODEL} \ + --skip-invalid-size-inputs-valid-test \ + --beam 5 --lenpen 1.0 --gen-subset test \ + --remove-bpe=sentencepiece \ + --source-lang ${SRC} --target-lang ${TGT} \ + --decoder-langtok --lang-pairs 'en_XX-ar_AR,en_XX-de_DE,en_XX-es_XX,en_XX-fr_XX,en_XX-hi_IN,en_XX-it_IT,en_XX-ja_XX,en_XX-ko_KR,en_XX-nl_XX,en_XX-ru_RU,en_XX-zh_CN,en_XX-tr_TR,en_XX-vi_VN,en_XX-ro_RO,en_XX-my_MM,en_XX-ne_NP,en_XX-si_LK,en_XX-cs_CZ,en_XX-lt_LT,en_XX-kk_KZ,en_XX-gu_IN,en_XX-fi_FI,en_XX-et_EE,en_XX-lv_LV,ar_AR-en_XX,cs_CZ-en_XX,de_DE-en_XX,es_XX-en_XX,et_EE-en_XX,fi_FI-en_XX,fr_XX-en_XX,gu_IN-en_XX,hi_IN-en_XX,it_IT-en_XX,ja_XX-en_XX,kk_KZ-en_XX,ko_KR-en_XX,lt_LT-en_XX,lv_LV-en_XX,my_MM-en_XX,ne_NP-en_XX,nl_XX-en_XX,ro_RO-en_XX,ru_RU-en_XX,si_LK-en_XX,tr_TR-en_XX,vi_VN-en_XX,zh_CN-en_XX,ar_AR-es_XX,es_XX-ar_AR,ar_AR-hi_IN,hi_IN-ar_AR,ar_AR-zh_CN,zh_CN-ar_AR,cs_CZ-es_XX,es_XX-cs_CZ,cs_CZ-hi_IN,hi_IN-cs_CZ,cs_CZ-zh_CN,zh_CN-cs_CZ,de_DE-es_XX,es_XX-de_DE,de_DE-hi_IN,hi_IN-de_DE,de_DE-zh_CN,zh_CN-de_DE,es_XX-hi_IN,hi_IN-es_XX,es_XX-zh_CN,zh_CN-es_XX,et_EE-es_XX,es_XX-et_EE,et_EE-hi_IN,hi_IN-et_EE,et_EE-zh_CN,zh_CN-et_EE,fi_FI-es_XX,es_XX-fi_FI,fi_FI-hi_IN,hi_IN-fi_FI,fi_FI-zh_CN,zh_CN-fi_FI,fr_XX-es_XX,es_XX-fr_XX,fr_XX-hi_IN,hi_IN-fr_XX,fr_XX-zh_CN,zh_CN-fr_XX,gu_IN-es_XX,es_XX-gu_IN,gu_IN-hi_IN,hi_IN-gu_IN,gu_IN-zh_CN,zh_CN-gu_IN,hi_IN-zh_CN,zh_CN-hi_IN,it_IT-es_XX,es_XX-it_IT,it_IT-hi_IN,hi_IN-it_IT,it_IT-zh_CN,zh_CN-it_IT,ja_XX-es_XX,es_XX-ja_XX,ja_XX-hi_IN,hi_IN-ja_XX,ja_XX-zh_CN,zh_CN-ja_XX,kk_KZ-es_XX,es_XX-kk_KZ,kk_KZ-hi_IN,hi_IN-kk_KZ,kk_KZ-zh_CN,zh_CN-kk_KZ,ko_KR-es_XX,es_XX-ko_KR,ko_KR-hi_IN,hi_IN-ko_KR,ko_KR-zh_CN,zh_CN-ko_KR,lt_LT-es_XX,es_XX-lt_LT,lt_LT-hi_IN,hi_IN-lt_LT,lt_LT-zh_CN,zh_CN-lt_LT,lv_LV-es_XX,es_XX-lv_LV,lv_LV-hi_IN,hi_IN-lv_LV,lv_LV-zh_CN,zh_CN-lv_LV,my_MM-es_XX,es_XX-my_MM,my_MM-hi_IN,hi_IN-my_MM,my_MM-zh_CN,zh_CN-my_MM,ne_NP-es_XX,es_XX-ne_NP,ne_NP-hi_IN,hi_IN-ne_NP,ne_NP-zh_CN,zh_CN-ne_NP,nl_XX-es_XX,es_XX-nl_XX,nl_XX-hi_IN,hi_IN-nl_XX,nl_XX-zh_CN,zh_CN-nl_XX,ro_RO-es_XX,es_XX-ro_RO,ro_RO-hi_IN,hi_IN-ro_RO,ro_RO-zh_CN,zh_CN-ro_RO,ru_RU-es_XX,es_XX-ru_RU,ru_RU-hi_IN,hi_IN-ru_RU,ru_RU-zh_CN,zh_CN-ru_RU,si_LK-es_XX,es_XX-si_LK,si_LK-hi_IN,hi_IN-si_LK,si_LK-zh_CN,zh_CN-si_LK,tr_TR-es_XX,es_XX-tr_TR,tr_TR-hi_IN,hi_IN-tr_TR,tr_TR-zh_CN,zh_CN-tr_TR,vi_VN-es_XX,es_XX-vi_VN,vi_VN-hi_IN,hi_IN-vi_VN,vi_VN-zh_CN,zh_CN-vi_VN' \ + --lang-dict ${LANG_DICT} --lang-tok-style 'mbart' --sampling-method 'temperature' --sampling-temperature '1.0' > $GEN_TMP_DIR/${SRC}_${TGT}.gen +cat $GEN_TMP_DIR/${SRC}_${TGT}.gen | grep -P "^T-" | cut -f2 | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l ${TGT:0:2} | $REM_NON_PRINT_CHAR | $TOKENIZER -no-escape ${TGT:0:2} > $GEN_TMP_DIR/${SRC}_${TGT}.hyp +cat $GEN_TMP_DIR/${SRC}_${TGT}.gen | grep -P "^H-" | cut -f3 | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l ${TGT:0:2} | $REM_NON_PRINT_CHAR | $TOKENIZER -no-escape ${TGT:0:2} > $GEN_TMP_DIR/${SRC}_${TGT}.ref +${MULTIBLEU} $GEN_TMP_DIR/${SRC}_${TGT}.ref < $GEN_TMP_DIR/${SRC}_${TGT}.hyp diff --git a/SpeechT5/fairseq/examples/cross_lingual_language_model/README.md b/SpeechT5/fairseq/examples/cross_lingual_language_model/README.md new file mode 100644 index 0000000..af9128e --- /dev/null +++ b/SpeechT5/fairseq/examples/cross_lingual_language_model/README.md @@ -0,0 +1,77 @@ +# Cross-Lingual Language Model Pre-training + +Below are some details for training Cross-Lingual Language Models (XLM) - similar to the ones presented in [Lample & Conneau, 2019](https://arxiv.org/pdf/1901.07291.pdf) - in Fairseq. The current implementation only supports the Masked Language Model (MLM) from the paper above. + +## Downloading and Tokenizing Monolingual Data + +Pointers to the monolingual data from wikipedia, used for training the XLM-style MLM model as well as details on processing (tokenization and BPE) it can be found in the [XLM Github Repository](https://github.com/facebookresearch/XLM#download--preprocess-monolingual-data). + +Let's assume the following for the code snippets in later sections to work +- Processed data is in the folder: monolingual_data/processed +- Each language has 3 files for train, test and validation. For example we have the following files for English: + train.en, valid.en +- We are training a model for 5 languages: Arabic (ar), German (de), English (en), Hindi (hi) and French (fr) +- The vocabulary file is monolingual_data/processed/vocab_mlm + + +## Fairseq Pre-processing and Binarization + +Pre-process and binarize the data with the MaskedLMDictionary and cross_lingual_lm task + +```bash +# Ensure the output directory exists +DATA_DIR=monolingual_data/fairseq_processed +mkdir -p "$DATA_DIR" + +for lg in ar de en hi fr +do + + fairseq-preprocess \ + --task cross_lingual_lm \ + --srcdict monolingual_data/processed/vocab_mlm \ + --only-source \ + --trainpref monolingual_data/processed/train \ + --validpref monolingual_data/processed/valid \ + --testpref monolingual_data/processed/test \ + --destdir monolingual_data/fairseq_processed \ + --workers 20 \ + --source-lang $lg + + # Since we only have a source language, the output file has a None for the + # target language. Remove this + + for stage in train test valid + + sudo mv "$DATA_DIR/$stage.$lg-None.$lg.bin" "$stage.$lg.bin" + sudo mv "$DATA_DIR/$stage.$lg-None.$lg.idx" "$stage.$lg.idx" + + done + +done +``` + +## Train a Cross-lingual Language Model similar to the XLM MLM model + +Use the following command to train the model on 5 languages. + +``` +fairseq-train \ +--task cross_lingual_lm monolingual_data/fairseq_processed \ +--save-dir checkpoints/mlm \ +--max-update 2400000 --save-interval 1 --no-epoch-checkpoints \ +--arch xlm_base \ +--optimizer adam --lr-scheduler reduce_lr_on_plateau \ +--lr-shrink 0.5 --lr 0.0001 --stop-min-lr 1e-09 \ +--dropout 0.1 \ +--criterion legacy_masked_lm_loss \ +--max-tokens 2048 --tokens-per-sample 256 --attention-dropout 0.1 \ +--dataset-impl lazy --seed 0 \ +--masked-lm-only \ +--monolingual-langs 'ar,de,en,hi,fr' --num-segment 5 \ +--ddp-backend=legacy_ddp +``` + +Some Notes: +- Using tokens_per_sample greater than 256 can cause OOM (out-of-memory) issues. Usually since MLM packs in streams of text, this parameter doesn't need much tuning. +- The Evaluation workflow for computing MLM Perplexity on test data is in progress. +- Finetuning this model on a downstream task is something which is not currently available. diff --git a/SpeechT5/fairseq/examples/fast_noisy_channel/README.md b/SpeechT5/fairseq/examples/fast_noisy_channel/README.md new file mode 100644 index 0000000..a04151a --- /dev/null +++ b/SpeechT5/fairseq/examples/fast_noisy_channel/README.md @@ -0,0 +1,345 @@ +# Language Models not just for Pre-training: Fast Online Neural Noisy Channel Modeling + +## Introduction +- [Yee et al. (2019)](https://www.aclweb.org/anthology/D19-1571.pdf) introduce a simple and effective noisy channel modeling approach for neural machine translation. However, the noisy channel online decoding approach introduced in this paper is too slow to be practical. +- To address this, [Bhosale et al. (2020)](http://www.statmt.org/wmt20/pdf/2020.wmt-1.68.pdf) introduces 3 simple approximations to make this approach very fast and practical without much loss in accuracy. +- This README provides intructions on how to run online decoding or generation with the noisy channel modeling approach, including ways to make it very fast without much loss in accuracy. + +## Noisy Channel Modeling + +[Yee et al. (2019)](https://www.aclweb.org/anthology/D19-1571.pdf) applies the Bayes Rule to predict `P(y|x)`, the probability of the target `y` given the source `x`. +```P(y|x) = P(x|y) * P(y) / P(x)``` +- `P(x|y)` predicts the source `x` given the target `y` and is referred to as the **channel model** +- `P(y)` is a **language model** over the target `y` +- `P(x)` is generally not modeled since it is constant for all `y`. + +We use Transformer models to parameterize the direct model `P(y|x)`, the channel model `P(x|y)` and the language model `P(y)`. + +During online decoding with beam search, we generate the top `K2` candidates per beam and score them with the following linear combination of the channel model, the language model as well as the direct model scores. + +```(1 / t) * log(P(y|x) + (1 / s) * ( λ1 * log(P(x|y)) + λ2 * log(P(y) ) )``` +- `t` - Target Prefix Length +- `s` - Source Length +- `λ1` - Channel Model Weight +- `λ2` - Language Model Weight + +The top `beam_size` candidates based on the above combined scores are chosen to continue the beams in beam search. In beam search with a direct model alone, the scores from the direct model `P(y|x)` are used to choose the top candidates in beam search. + +This framework provides a great way to utlize strong target language models trained on large amounts of unlabeled data. Language models can prefer targets unrelated to the source, so we also need a channel model whose role is to ensure that the target preferred by the language model also translates back to the source. + +### Training Translation Models and Language Models + +For training Transformer models in fairseq for machine translation, refer to instructions [here](https://github.com/pytorch/fairseq/tree/master/examples/translation) + +For training Transformer models in fairseq for language modeling, refer to instructions [here](https://github.com/pytorch/fairseq/tree/master/examples/language_model) + +### Generation with Language Model for German-English translation with fairseq + +Here are instructions to generate using a direct model and a target-side language model. + +Note: +- Download and install fairseq as per instructions [here](https://github.com/pytorch/fairseq) +- Preprocess and binarize the dataset as per instructions in section [Test Data Preprocessing](#test-data-preprocessing) + +```sh +binarized_data=data_dir/binarized +direct_model=de_en_seed4.pt +lm_model=en_lm.pt +lm_data=lm_data +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/direct_models/seed4.pt -O ${direct_model} +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/transformer_lm.pt -O ${lm_model} +mkdir -p ${lm_data} +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/lm_dict/dict.txt -O ${lm_data}/dict.txt + +k2=10 +lenpen=0.16 +lm_wt=0.14 +fairseq-generate ${binarized_data} \ + --user-dir examples/fast_noisy_channel \ + --beam 5 \ + --path ${direct_model} \ + --lm-model ${lm_model} \ + --lm-data ${lm_data} \ + --k2 ${k2} \ + --combine-method lm_only \ + --task noisy_channel_translation \ + --lenpen ${lenpen} \ + --lm-wt ${lm_wt} \ + --gen-subset valid \ + --remove-bpe \ + --fp16 \ + --batch-size 10 +``` +### Noisy Channel Generation for German-English translation with fairseq + +Here are instructions for noisy channel generation with a direct model, channel model and language model as explained in section [Noisy Channel Modeling](#noisy-channel-modeling). + +Note: +- Download and install fairseq as per instructions [here](https://github.com/pytorch/fairseq) +- Preprocess and binarize the dataset as per instructions in section [Test Data Preprocessing](#test-data-preprocessing) + +```sh +binarized_data=data_dir/binarized +direct_model=de_en_seed4.pt +lm_model=en_lm.pt +lm_data=lm_data +ch_model=en_de.big.seed4.pt +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/direct_models/seed4.pt -O ${direct_model} +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/transformer_lm.pt -O ${lm_model} +mkdir -p ${lm_data} +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/lm_dict/dict.txt -O ${lm_data}/dict.txt +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/big.seed4.pt -O ${ch_model} + +k2=10 +lenpen=0.21 +lm_wt=0.50 +bw_wt=0.30 +fairseq-generate ${binarized_data} \ + --user-dir examples/fast_noisy_channel \ + --beam 5 \ + --path ${direct_model} \ + --lm-model ${lm_model} \ + --lm-data ${lm_data} \ + --channel-model ${ch_model} \ + --k2 ${k2} \ + --combine-method noisy_channel \ + --task noisy_channel_translation \ + --lenpen ${lenpen} \ + --lm-wt ${lm_wt} \ + --ch-wt ${bw_wt} \ + --gen-subset test \ + --remove-bpe \ + --fp16 \ + --batch-size 1 +``` +## Fast Noisy Channel Modeling + +[Bhosale et al. (2020)](http://www.statmt.org/wmt20/pdf/2020.wmt-1.68.pdf) introduces 3 approximations that speed up online noisy channel decoding - +- Smaller channel models (`Tranformer Base` with 1 encoder and decoder layer each vs. `Transformer Big`) + - This involves training a channel model that is possibly smaller and less accurate in terms of BLEU than a channel model of the same size as the direct model. + - Since the role of the channel model is mainly to assign low scores to generations from the language model if they don't translate back to the source, we may not need the most accurate channel model for this purpose. +- Smaller output vocabulary size for the channel model (~30,000 -> ~1000) + - The channel model doesn't need to score the full output vocabulary, it just needs to score the source tokens, which are completely known. + - This is specified using the arguments `--channel-scoring-type src_vocab --top-k-vocab 500` + - This means that the output vocabulary for the channel model will be the source tokens for all examples in the batch and the top-K most frequent tokens in the vocabulary + - This reduces the memory consumption needed to store channel model scores significantly +- Smaller number of candidates (`k2`) scored per beam + - This is specified by reducing the argument `--k2` + + +### Fast Noisy Channel Generation for German-English translation with fairseq + +Here are instructions for **fast** noisy channel generation with a direct model, channel model and language model as explained in section [Fast Noisy Channel Modeling](#fast-noisy-channel-modeling). The main differences are that we use a smaller channel model, reduce `--k2`, set `--channel-scoring-type src_vocab --top-k-vocab 500` and increase the `--batch-size`. + +Note: +- Download and install fairseq as per instructions [here](https://github.com/pytorch/fairseq) +- Preprocess and binarize the dataset as per instructions in section [Test Data Preprocessing](#test-data-preprocessing) + +```sh +binarized_data=data_dir/binarized +direct_model=de_en_seed4.pt +lm_model=en_lm.pt +lm_data=lm_data +small_ch_model=en_de.base_1_1.seed4.pt +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/direct_models/seed4.pt -O ${direct_model} +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/transformer_lm.pt -O ${lm_model} +mkdir -p ${lm_data} +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/lm_dict/dict.txt -O ${lm_data}/dict.txt +wget https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/base_1_1.seed4.pt -O ${small_ch_model} + +k2=3 +lenpen=0.23 +lm_wt=0.58 +bw_wt=0.26 +fairseq-generate ${binarized_data} \ + --user-dir examples/fast_noisy_channel \ + --beam 5 \ + --path ${direct_model} \ + --lm-model ${lm_model} \ + --lm-data ${lm_data} \ + --channel-model ${small_ch_model} \ + --k2 ${k2} \ + --combine-method noisy_channel \ + --task noisy_channel_translation \ + --lenpen ${lenpen} \ + --lm-wt ${lm_wt} \ + --ch-wt ${bw_wt} \ + --gen-subset test \ + --remove-bpe \ + --fp16 \ + --batch-size 50 \ + --channel-scoring-type src_vocab --top-k-vocab 500 +``` + +## Test Data Preprocessing + +For preprocessing and binarizing the test sets for Romanian-English and German-English translation, we use the following script - + +```sh +FAIRSEQ=/path/to/fairseq +cd $FAIRSEQ +SCRIPTS=$FAIRSEQ/mosesdecoder/scripts +if [ ! -d "${SCRIPTS}" ]; then + echo 'Cloning Moses github repository (for tokenization scripts)...' + git clone https://github.com/moses-smt/mosesdecoder.git +fi +TOKENIZER=$SCRIPTS/tokenizer/tokenizer.perl +NORMALIZE=$SCRIPTS/tokenizer/normalize-punctuation.perl + +s=de +t=en +test=wmt18 + +mkdir -p data_dir + +# Tokenization +if [ $s == "ro" ] ; then + # Note: Get normalise-romanian.py and remove-diacritics.py from + # https://github.com/rsennrich/wmt16-scripts/tree/master/preprocess + sacrebleu -t $test -l $s-$t --echo src | \ + $NORMALIZE -l $s | \ + python normalise-romanian.py | \ + python remove-diacritics.py | \ + $TOKENIZER -l $s -a -q > data_dir/$test.$s-$t.$s +else + sacrebleu -t $test -l $s-$t --echo src | perl $NORMALIZE -l $s | perl $TOKENIZER -threads 8 -a -l $s > data_dir/$test.$s-$t.$s +fi + +sacrebleu -t $test -l $s-$t --echo ref | perl $NORMALIZE -l $t | perl $TOKENIZER -threads 8 -a -l $t > data_dir/$test.$s-$t.$t + + +# Applying BPE +src_bpe_code=/path/to/source/language/bpe/code +tgt_bpe_code=/path/to/target/language/bpe/code +src_dict=/path/to/source/language/dict +tgt_dict=/path/to/target/language/dict + +FASTBPE=$FAIRSEQ/fastBPE +if [ ! -d "${FASTBPE}" ] ; then + git clone https://github.com/glample/fastBPE.git + # Follow compilation instructions at https://github.com/glample/fastBPE + g++ -std=c++11 -pthread -O3 fastBPE/main.cc -IfastBPE -o fast +fi + +${FASTBPE}/fast applybpe data_dir/bpe.$test.$s-$t.$s data_dir/$test.$s-$t.$s ${src_bpe_code} +${FASTBPE}/fast applybpe data_dir/bpe.$test.$s-$t.$s data_dir/$test.$s-$t.$s ${tgt_bpe_code} + +fairseq-preprocess -s $s -t $t \ + --testpref data_dir/bpe.$test.$s-$t \ + --destdir data_dir/binarized \ + --srcdict ${src_dict} \ + --tgtdict ${tgt_dict} +``` + +## Calculating BLEU + +```sh +DETOKENIZER=$SCRIPTS/tokenizer/detokenizer.perl +cat ${generation_output} | grep -P "^H" | sort -V | cut -f 3- | $DETOKENIZER -l $t -q -a | sacrebleu -t $test -l $s-$t +``` + + +## Romanian-English Translation + +The direct and channel models are trained using bitext data (WMT16) combined with backtranslated data (The monolingual data used for backtranslation comes from http://data.statmt.org/rsennrich/wmt16_backtranslations/ (Sennrich et al., 2016c)) + +The backtranslated data is generated using an ensemble of 3 English-Romanian models trained on bitext training data (WMT16) with unrestricted sampling. + +### BPE Codes and Dictionary + +We learn a joint BPE vocabulary of 18K types on the bitext training data which is used for both the source and target. +||Path| +|----------|------| +| BPE Code | [joint_bpe_18k](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/bpe_18k) | +| Dictionary | [dict](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/dict) | + +### Direct Models +For Ro-En with backtranslation, the direct and channel models use a Transformer-Big architecture. + +| Seed | Model | +|----|----| +| 2 | [ro_en_seed2.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/direct_models/seed2.pt) +| 4 | [ro_en_seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/direct_models/seed4.pt) +| 6 | [ro_en_seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/direct_models/seed6.pt) + +### Channel Models +For channel models, we follow the same steps as for the direct models. But backtranslated data is generated in the opposite direction using [this Romanian monolingual data](http://data.statmt.org/rsennrich/wmt16_backtranslations/). +The best lenpen, LM weight and CH weight are obtained by sweeping over the validation set (wmt16/dev) using beam 5. +| Model Size | Lenpen | LM Weight | CH Weight | Seed 2 | Seed 4 | Seed 6 | +|----|----|----|----|----|----|----| +| `big` | 0.84 | 0.64 | 0.56 | [big.seed2.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/channel_models/big.seed2.pt) | [big.seed2.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/channel_models/big.seed2.pt) | [big.seed2.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/channel_models/big.seed2.pt) | +| `base_1_1` | 0.63 | 0.40 | 0.37 | [base_1_1.seed2.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/channel_models/base_1_1.seed2.pt) | [base_1_1.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/channel_models/base_1_1.seed4.pt) | [base_1_1.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/channel_models/base_1_1.seed6.pt) | + +### Language Model +The model is trained on de-duplicated English Newscrawl data from 2007-2018 comprising 186 million sentences or 4.5B words after normalization and tokenization. +| | Path | +|----|----| +| `--lm-model` | [transformer_en_lm](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/lm_model/transformer_lm.pt) | +| `--lm-data` | [lm_data](https://dl.fbaipublicfiles.com/fast_noisy_channel/ro_en/lm_model/lm_dict) + +## German-English Translation + +### BPE Codes and Dictionaries + +| | Path| +|----------|------| +| Source BPE Code | [de_bpe_code_24K](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/de_bpe_code_24K) | +| Target BPE Code | [en_bpe_code_24K](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/en_bpe_code_24K) +| Source Dictionary | [de_dict](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/de_dict) | +| Target Dictionary | [en_dict](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/en_dict) | + +### Direct Models +We train on WMT’19 training data. Following [Ng et al., 2019](http://statmt.org/wmt19/pdf/53/WMT33.pdf), we apply language identification filtering and remove sentences longer than 250 tokens as well as sentence pairs with a source/target length ratio exceeding 1.5. This results in 26.8M sentence pairs. +We use the Transformer-Big architecture for the direct model. + +| Seed | Model | +|:----:|----| +| 4 | [de_en_seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/direct_models/seed4.pt) +| 5 | [de_en_seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/direct_models/seed5.pt) +| 6 | [de_en_seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/direct_models/seed6.pt) + +### Channel Models + +We train on WMT’19 training data. Following [Ng et al., 2019](http://statmt.org/wmt19/pdf/53/WMT33.pdf), we apply language identification filtering and remove sentences longer than 250 tokens as well as sentence pairs with a source/target length ratio exceeding 1.5. This results in 26.8M sentence pairs. + +| Model Size | Seed 4 | Seed 5 | Seed 6 | +|----|----|----|----| +| `big` | [big.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/big.seed4.pt) | [big.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/big.seed5.pt) | [big.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/big.seed6.pt) | +| `big_1_1` | [big_1_1.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/big_1_1.seed4.pt) | [big_1_1.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/big_1_1.seed5.pt) | [big_1_1.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/big_1_1.seed6.pt) | +| `base` | [base.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/base.seed4.pt) | [base.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/base.seed5.pt) | [base.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/base.seed6.pt) | +| `base_1_1` | [base_1_1.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/base_1_1.seed4.pt) | [base_1_1.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/base_1_1.seed5.pt) | [base_1_1.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/base_1_1.seed6.pt) | +| `half` | [half.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/half.seed4.pt) | [half.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/half.seed5.pt) | [half.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/half.seed6.pt) | +| `half_1_1` | [half_1_1.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/half_1_1.seed4.pt) | [half_1_1.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/half_1_1.seed5.pt) | [half_1_1.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/half_1_1.seed6.pt) | +| `quarter` | [quarter.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/quarter.seed4.pt) | [quarter.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/quarter.seed5.pt) | [quarter.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/quarter.seed6.pt) | +| `quarter_1_1` | [quarter_1_1.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/quarter_1_1.seed4.pt) | [quarter_1_1.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/quarter_1_1.seed5.pt) | [quarter_1_1.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/quarter_1_1.seed6.pt) | +| `8th` | [8th.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/8th.seed4.pt) | [8th.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/8th.seed5.pt) | [8th.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/8th.seed6.pt) | +| `8th_1_1` | [8th_1_1.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/8th_1_1.seed4.pt) | [8th_1_1.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/8th_1_1.seed5.pt) | [8th_1_1.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/8th_1_1.seed6.pt) | +| `16th` | [16th.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/16th.seed4.pt) | [16th.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/16th.seed5.pt) | [16th.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/16th.seed6.pt) | +| `16th_1_1` | [16th_1_1.seed4.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/16th_1_1.seed4.pt) | [16th_1_1.seed5.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/16th_1_1.seed5.pt) | [16th_1_1.seed6.pt](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/channel_models/16th_1_1.seed6.pt) | + +### Language Model +The model is trained on de-duplicated English Newscrawl data from 2007-2018 comprising 186 million sentences or 4.5B words after normalization and tokenization. +| | Path | +|----|----| +| `--lm-model` | [transformer_en_lm](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/transformer_lm.pt) | +| `--lm-data` | [lm_data](https://dl.fbaipublicfiles.com/fast_noisy_channel/de_en/lm_model/lm_dict/) + + +## Citation + +```bibtex +@inproceedings{bhosale2020language, + title={Language Models not just for Pre-training: Fast Online Neural Noisy Channel Modeling}, + author={Shruti Bhosale and Kyra Yee and Sergey Edunov and Michael Auli}, + booktitle={Proceedings of the Fifth Conference on Machine Translation (WMT)}, + year={2020}, +} + +@inproceedings{yee2019simple, + title={Simple and Effective Noisy Channel Modeling for Neural Machine Translation}, + author={Yee, Kyra and Dauphin, Yann and Auli, Michael}, + booktitle={Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP)}, + pages={5700--5705}, + year={2019} +} +``` diff --git a/SpeechT5/fairseq/examples/fast_noisy_channel/__init__.py b/SpeechT5/fairseq/examples/fast_noisy_channel/__init__.py new file mode 100644 index 0000000..9b248c3 --- /dev/null +++ b/SpeechT5/fairseq/examples/fast_noisy_channel/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import noisy_channel_translation # noqa +from . import noisy_channel_sequence_generator # noqa +from . import noisy_channel_beam_search # noqa diff --git a/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_beam_search.py b/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_beam_search.py new file mode 100644 index 0000000..23869eb --- /dev/null +++ b/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_beam_search.py @@ -0,0 +1,71 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq.search import Search + + +class NoisyChannelBeamSearch(Search): + + def __init__(self, tgt_dict): + super().__init__(tgt_dict) + self.fw_scores_buf = None + self.lm_scores_buf = None + + def _init_buffers(self, t): + # super()._init_buffers(t) + if self.fw_scores_buf is None: + self.scores_buf = t.new() + self.indices_buf = torch.LongTensor().to(device=t.device) + self.beams_buf = torch.LongTensor().to(device=t.device) + self.fw_scores_buf = t.new() + self.lm_scores_buf = t.new() + + def combine_fw_bw(self, combine_method, fw_cum, bw, step): + if combine_method == "noisy_channel": + fw_norm = fw_cum.div(step + 1) + lprobs = bw + fw_norm + elif combine_method == "lm_only": + lprobs = bw + fw_cum + + return lprobs + + def step(self, step, fw_lprobs, scores, bw_lprobs, lm_lprobs, combine_method): + self._init_buffers(fw_lprobs) + bsz, beam_size, vocab_size = fw_lprobs.size() + + if step == 0: + # at the first step all hypotheses are equally likely, so use + # only the first beam + fw_lprobs = fw_lprobs[:, ::beam_size, :].contiguous() + bw_lprobs = bw_lprobs[:, ::beam_size, :].contiguous() + # nothing to add since we are at the first step + fw_lprobs_cum = fw_lprobs + + else: + # make probs contain cumulative scores for each hypothesis + raw_scores = (scores[:, :, step - 1].unsqueeze(-1)) + fw_lprobs_cum = (fw_lprobs.add(raw_scores)) + + combined_lprobs = self.combine_fw_bw(combine_method, fw_lprobs_cum, bw_lprobs, step) + + # choose the top k according to the combined noisy channel model score + torch.topk( + combined_lprobs.view(bsz, -1), + k=min( + # Take the best 2 x beam_size predictions. We'll choose the first + # beam_size of these which don't predict eos to continue with. + beam_size * 2, + combined_lprobs.view(bsz, -1).size(1) - 1, # -1 so we never select pad + ), + out=(self.scores_buf, self.indices_buf), + ) + # save corresponding fw and lm scores + self.fw_scores_buf = torch.gather(fw_lprobs_cum.view(bsz, -1), 1, self.indices_buf) + self.lm_scores_buf = torch.gather(lm_lprobs.view(bsz, -1), 1, self.indices_buf) + # Project back into relative indices and beams + self.beams_buf = self.indices_buf // vocab_size + self.indices_buf.fmod_(vocab_size) + return self.scores_buf, self.fw_scores_buf, self.lm_scores_buf, self.indices_buf, self.beams_buf diff --git a/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_sequence_generator.py b/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_sequence_generator.py new file mode 100644 index 0000000..ea8fae9 --- /dev/null +++ b/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_sequence_generator.py @@ -0,0 +1,842 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, List, Optional + +import math +import numpy as np + +import torch +import torch.nn.functional as F +from torch import Tensor + +from .noisy_channel_beam_search import NoisyChannelBeamSearch +from fairseq.sequence_generator import EnsembleModel + + +class NoisyChannelSequenceGenerator(object): + def __init__( + self, + combine_method, + tgt_dict, + src_dict=None, + beam_size=1, + max_len_a=0, + max_len_b=200, + min_len=1, + len_penalty=1.0, + unk_penalty=0.0, + retain_dropout=False, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + normalize_scores=True, + channel_models=None, + k2=10, + ch_weight=1.0, + channel_scoring_type='log_norm', + top_k_vocab=0, + lm_models=None, + lm_dict=None, + lm_weight=1.0, + normalize_lm_scores_by_tgt_len=False, + ): + """Generates translations of a given source sentence, + using beam search with noisy channel decoding. + + Args: + combine_method (string, optional): Method to combine direct, LM and + channel model scores (default: None) + tgt_dict (~fairseq.data.Dictionary): target dictionary + src_dict (~fairseq.data.Dictionary): source dictionary + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + retain_dropout (bool, optional): use dropout when generating + (default: False) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + no_repeat_ngram_size (int, optional): Size of n-grams that we avoid + repeating in the generation (default: 0) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + channel_models (List[~fairseq.models.FairseqModel]): ensemble of models + translating from the target to the source + k2 (int, optional): Top K2 candidates to score per beam at each step (default:10) + ch_weight (int, optional): Weight associated with the channel model score + assuming that the direct model score has weight 1.0 (default: 1.0) + channel_scoring_type (str, optional): String specifying how to score + the channel model (default: 'log_norm') + top_k_vocab (int, optional): If `channel_scoring_type` is `'src_vocab'` or + `'src_vocab_batched'`, then this parameter specifies the number of + most frequent tokens to include in the channel model output vocabulary, + in addition to the source tokens in the input batch (default: 0) + lm_models (List[~fairseq.models.FairseqModel]): ensemble of models + generating text in the target language + lm_dict (~fairseq.data.Dictionary): LM Model dictionary + lm_weight (int, optional): Weight associated with the LM model score + assuming that the direct model score has weight 1.0 (default: 1.0) + normalize_lm_scores_by_tgt_len (bool, optional): Should we normalize LM scores + by the target length? By default, we normalize the combination of + LM and channel model scores by the source length + """ + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() + self.vocab_size = len(tgt_dict) + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.retain_dropout = retain_dropout + self.temperature = temperature + self.match_source_len = match_source_len + self.no_repeat_ngram_size = no_repeat_ngram_size + self.channel_models = channel_models + self.src_dict = src_dict + self.tgt_dict = tgt_dict + self.combine_method = combine_method + self.k2 = k2 + self.ch_weight = ch_weight + self.channel_scoring_type = channel_scoring_type + self.top_k_vocab = top_k_vocab + self.lm_models = lm_models + self.lm_dict = lm_dict + self.lm_weight = lm_weight + self.log_softmax_fn = torch.nn.LogSoftmax(dim=1) + self.normalize_lm_scores_by_tgt_len = normalize_lm_scores_by_tgt_len + + self.share_tgt_dict = (self.lm_dict == self.tgt_dict) + self.tgt_to_lm = make_dict2dict(tgt_dict, lm_dict) + + self.ch_scoring_bsz = 3072 + + assert temperature > 0, '--temperature must be greater than 0' + + self.search = NoisyChannelBeamSearch(tgt_dict) + + @torch.no_grad() + def generate( + self, + models, + sample, + prefix_tokens=None, + bos_token=None, + **kwargs + ): + """Generate a batch of translations. + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + """ + model = EnsembleModel(models) + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(model.models_size) + ], + ) + if not self.retain_dropout: + model.eval() + + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in sample['net_input'].items() + if k != 'prev_output_tokens' + } + src_tokens = encoder_input['src_tokens'] + src_lengths_no_eos = (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)).long().sum(dim=1) + input_size = src_tokens.size() + # batch dimension goes first followed by source lengths + bsz = input_size[0] + src_len = input_size[1] + beam_size = self.beam_size + + if self.match_source_len: + max_len = src_lengths_no_eos.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + # exclude the EOS marker + model.max_decoder_positions() - 1, + ) + + # compute the encoder output for each beam + encoder_outs = model.forward_encoder(encoder_input) + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(src_tokens.device).long() + encoder_outs = model.reorder_encoder_out(encoder_outs, new_order) + + src_lengths = encoder_input['src_lengths'] + # initialize buffers + scores = src_tokens.new(bsz * beam_size, max_len + 1).float().fill_(0) + lm_prefix_scores = src_tokens.new(bsz * beam_size).float().fill_(0) + + scores_buf = scores.clone() + tokens = src_tokens.new(bsz * beam_size, max_len + 2).long().fill_(self.pad) + tokens_buf = tokens.clone() + tokens[:, 0] = self.eos if bos_token is None else bos_token + + # reorder source tokens so they may be used as a reference in generating P(S|T) + src_tokens = reorder_all_tokens(src_tokens, src_lengths, self.src_dict.eos_index) + + src_tokens = src_tokens.repeat(1, beam_size).view(-1, src_len) + src_lengths = src_lengths.view(bsz, -1).repeat(1, beam_size).view(bsz*beam_size, -1) + + attn, attn_buf = None, None + nonpad_idxs = None + + # The cands_to_ignore indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then the cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = src_tokens.new_zeros(bsz, beam_size).eq(-1) # forward and backward-compatible False mask + + # list of completed sentences + finalized = [[] for i in range(bsz)] + finished = [False for i in range(bsz)] + num_remaining_sent = bsz + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = (torch.arange(0, bsz) * beam_size).unsqueeze(1).type_as(tokens) + cand_offsets = torch.arange(0, cand_size).type_as(tokens) + + # helper function for allocating buffers on the fly + buffers = {} + + def buffer(name, type_of=tokens): # noqa + if name not in buffers: + buffers[name] = type_of.new() + return buffers[name] + + def is_finished(sent, step, unfin_idx): + """ + Check whether we've finished generation for a given sentence, by + comparing the worst score among finalized hypotheses to the best + possible score among unfinalized hypotheses. + """ + assert len(finalized[sent]) <= beam_size + if len(finalized[sent]) == beam_size: + return True + return False + + def finalize_hypos(step, bbsz_idx, eos_scores, combined_noisy_channel_eos_scores): + """ + Finalize the given hypotheses at this step, while keeping the total + number of finalized hypotheses per sentence <= beam_size. + + Note: the input must be in the desired finalization order, so that + hypotheses that appear earlier in the input are preferred to those + that appear later. + + Args: + step: current time step + bbsz_idx: A vector of indices in the range [0, bsz*beam_size), + indicating which hypotheses to finalize + eos_scores: A vector of the same size as bbsz_idx containing + fw scores for each hypothesis + combined_noisy_channel_eos_scores: A vector of the same size as bbsz_idx containing + combined noisy channel scores for each hypothesis + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors + tokens_clone = tokens.index_select(0, bbsz_idx) + tokens_clone = tokens_clone[:, 1:step + 2] # skip the first index, which is EOS + assert not tokens_clone.eq(self.eos).any() + tokens_clone[:, step] = self.eos + attn_clone = attn.index_select(0, bbsz_idx)[:, :, 1:step+2] if attn is not None else None + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, :step+1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + combined_noisy_channel_eos_scores /= (step + 1) ** self.len_penalty + + cum_unfin = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + + sents_seen = set() + for i, (idx, score) in enumerate(zip(bbsz_idx.tolist(), combined_noisy_channel_eos_scores.tolist())): + unfin_idx = idx // beam_size + sent = unfin_idx + cum_unfin[unfin_idx] + + sents_seen.add((sent, unfin_idx)) + + if self.match_source_len and step > src_lengths_no_eos[unfin_idx]: + score = -math.inf + + def get_hypo(): + + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i][nonpad_idxs[sent]] + _, alignment = hypo_attn.max(dim=0) + else: + hypo_attn = None + alignment = None + + return { + 'tokens': tokens_clone[i], + 'score': score, + 'attention': hypo_attn, # src_len x tgt_len + 'alignment': alignment, + 'positional_scores': pos_scores[i], + } + + if len(finalized[sent]) < beam_size: + finalized[sent].append(get_hypo()) + + newly_finished = [] + for sent, unfin_idx in sents_seen: + # check termination conditions for this sentence + if not finished[sent] and is_finished(sent, step, unfin_idx): + finished[sent] = True + newly_finished.append(unfin_idx) + return newly_finished + + def noisy_channel_rescoring(lprobs, beam_size, bsz, src_tokens, tokens, k): + """Rescore the top k hypothesis from each beam using noisy channel modeling + Returns: + new_fw_lprobs: the direct model probabilities after pruning the top k + new_ch_lm_lprobs: the combined channel and language model probabilities + new_lm_lprobs: the language model probabilities after pruning the top k + """ + with torch.no_grad(): + lprobs_size = lprobs.size() + if prefix_tokens is not None and step < prefix_tokens.size(1): + probs_slice = lprobs.view(bsz, -1, lprobs.size(-1))[:, 0, :] + cand_scores = torch.gather( + probs_slice, dim=1, + index=prefix_tokens[:, step].view(-1, 1).data + ).expand(-1, beam_size).contiguous().view(bsz*beam_size, 1) + cand_indices = prefix_tokens[:, step].view(-1, 1).expand(bsz, beam_size).data.contiguous().view(bsz*beam_size, 1) + + # need to calculate and save fw and lm probs for prefix tokens + fw_top_k = cand_scores + fw_top_k_idx = cand_indices + k = 1 + else: + # take the top k best words for every sentence in batch*beam + fw_top_k, fw_top_k_idx = torch.topk(lprobs.view(beam_size*bsz, -1), k=k) + eos_idx = torch.nonzero(fw_top_k_idx.view(bsz*beam_size*k, -1) == self.eos)[:, 0] + ch_scores = fw_top_k.new_full((beam_size*bsz*k, ), 0) + src_size = torch.sum(src_tokens[:, :] != self.src_dict.pad_index, dim=1, keepdim=True, dtype=fw_top_k.dtype) + + if self.combine_method != "lm_only": + temp_src_tokens_full = src_tokens[:, :].repeat(1, k).view(bsz*beam_size*k, -1) + not_padding = temp_src_tokens_full[:, 1:] != self.src_dict.pad_index + cur_tgt_size = step+2 + + # add eos to all candidate sentences except those that already end in eos + eos_tokens = tokens[:, 0].repeat(1, k).view(-1, 1) + eos_tokens[eos_idx] = self.tgt_dict.pad_index + + if step == 0: + channel_input = torch.cat((fw_top_k_idx.view(-1, 1), eos_tokens), 1) + else: + # move eos from beginning to end of target sentence + channel_input = torch.cat((tokens[:, 1:step + 1].repeat(1, k).view(-1, step), fw_top_k_idx.view(-1, 1), eos_tokens), 1) + + ch_input_lengths = torch.tensor(np.full(channel_input.size(0), cur_tgt_size)) + ch_input_lengths[eos_idx] = cur_tgt_size-1 + if self.channel_scoring_type == "unnormalized": + ch_encoder_output = channel_model.encoder(channel_input, src_lengths=ch_input_lengths) + ch_decoder_output, _ = channel_model.decoder(temp_src_tokens_full, encoder_out=ch_encoder_output, features_only=True) + del ch_encoder_output + ch_intermed_scores = channel_model.decoder.unnormalized_scores_given_target(ch_decoder_output, target_ids=temp_src_tokens_full[:, 1:]) + ch_intermed_scores = ch_intermed_scores.float() + ch_intermed_scores *= not_padding.float() + ch_scores = torch.sum(ch_intermed_scores, dim=1) + elif self.channel_scoring_type == "k2_separate": + for k_idx in range(k): + k_eos_tokens = eos_tokens[k_idx::k, :] + if step == 0: + k_ch_input = torch.cat((fw_top_k_idx[:, k_idx:k_idx+1], k_eos_tokens), 1) + else: + # move eos from beginning to end of target sentence + k_ch_input = torch.cat((tokens[:, 1:step + 1], fw_top_k_idx[:, k_idx:k_idx+1], k_eos_tokens), 1) + k_ch_input_lengths = ch_input_lengths[k_idx::k] + k_ch_output = channel_model(k_ch_input, k_ch_input_lengths, src_tokens) + k_ch_lprobs = channel_model.get_normalized_probs(k_ch_output, log_probs=True) + k_ch_intermed_scores = torch.gather(k_ch_lprobs[:, :-1, :], 2, src_tokens[:, 1:].unsqueeze(2)).squeeze(2) + k_ch_intermed_scores *= not_padding.float() + ch_scores[k_idx::k] = torch.sum(k_ch_intermed_scores, dim=1) + elif self.channel_scoring_type == "src_vocab": + ch_encoder_output = channel_model.encoder(channel_input, src_lengths=ch_input_lengths) + ch_decoder_output, _ = channel_model.decoder(temp_src_tokens_full, encoder_out=ch_encoder_output, features_only=True) + + del ch_encoder_output + ch_lprobs = normalized_scores_with_batch_vocab( + channel_model.decoder, + ch_decoder_output, src_tokens, k, bsz, beam_size, + self.src_dict.pad_index, top_k=self.top_k_vocab) + ch_scores = torch.sum(ch_lprobs, dim=1) + elif self.channel_scoring_type == "src_vocab_batched": + ch_bsz_size = temp_src_tokens_full.shape[0] + ch_lprobs_list = [None] * len(range(0, ch_bsz_size, self.ch_scoring_bsz)) + for i, start_idx in enumerate(range(0, ch_bsz_size, self.ch_scoring_bsz)): + end_idx = min(start_idx + self.ch_scoring_bsz, ch_bsz_size) + temp_src_tokens_full_batch = temp_src_tokens_full[start_idx:end_idx, :] + channel_input_batch = channel_input[start_idx:end_idx, :] + ch_input_lengths_batch = ch_input_lengths[start_idx:end_idx] + ch_encoder_output_batch = channel_model.encoder(channel_input_batch, src_lengths=ch_input_lengths_batch) + ch_decoder_output_batch, _ = channel_model.decoder(temp_src_tokens_full_batch, encoder_out=ch_encoder_output_batch, features_only=True) + ch_lprobs_list[i] = normalized_scores_with_batch_vocab( + channel_model.decoder, + ch_decoder_output_batch, src_tokens, k, bsz, beam_size, + self.src_dict.pad_index, top_k=self.top_k_vocab, + start_idx=start_idx, end_idx=end_idx) + ch_lprobs = torch.cat(ch_lprobs_list, dim=0) + ch_scores = torch.sum(ch_lprobs, dim=1) + else: + ch_output = channel_model(channel_input, ch_input_lengths, temp_src_tokens_full) + ch_lprobs = channel_model.get_normalized_probs(ch_output, log_probs=True) + ch_intermed_scores = torch.gather(ch_lprobs[:, :-1, :], 2, temp_src_tokens_full[:, 1:].unsqueeze(2)).squeeze().view(bsz*beam_size*k, -1) + ch_intermed_scores *= not_padding.float() + ch_scores = torch.sum(ch_intermed_scores, dim=1) + + else: + cur_tgt_size = 0 + ch_scores = ch_scores.view(bsz*beam_size, k) + expanded_lm_prefix_scores = lm_prefix_scores.unsqueeze(1).expand(-1, k).flatten() + + if self.share_tgt_dict: + lm_scores = get_lm_scores(lm, tokens[:, :step + 1].view(-1, step+1), lm_incremental_states, fw_top_k_idx.view(-1, 1), torch.tensor(np.full(tokens.size(0), step+1)), k) + else: + new_lm_input = dict2dict(tokens[:, :step + 1].view(-1, step+1), self.tgt_to_lm) + new_cands = dict2dict(fw_top_k_idx.view(-1, 1), self.tgt_to_lm) + lm_scores = get_lm_scores(lm, new_lm_input, lm_incremental_states, new_cands, torch.tensor(np.full(tokens.size(0), step+1)), k) + + lm_scores.add_(expanded_lm_prefix_scores) + ch_lm_scores = combine_ch_lm(self.combine_method, ch_scores, lm_scores, src_size, cur_tgt_size) + # initialize all as min value + new_fw_lprobs = ch_scores.new(lprobs_size).fill_(-1e17).view(bsz*beam_size, -1) + new_ch_lm_lprobs = ch_scores.new(lprobs_size).fill_(-1e17).view(bsz*beam_size, -1) + new_lm_lprobs = ch_scores.new(lprobs_size).fill_(-1e17).view(bsz*beam_size, -1) + new_fw_lprobs[:, self.pad] = -math.inf + new_ch_lm_lprobs[:, self.pad] = -math.inf + new_lm_lprobs[:, self.pad] = -math.inf + + new_fw_lprobs.scatter_(1, fw_top_k_idx, fw_top_k) + new_ch_lm_lprobs.scatter_(1, fw_top_k_idx, ch_lm_scores) + new_lm_lprobs.scatter_(1, fw_top_k_idx, lm_scores.view(-1, k)) + return new_fw_lprobs, new_ch_lm_lprobs, new_lm_lprobs + + def combine_ch_lm(combine_type, ch_scores, lm_scores1, src_size, tgt_size): + if self.channel_scoring_type == "unnormalized": + ch_scores = self.log_softmax_fn( + ch_scores.view(-1, self.beam_size * self.k2) + ).view(ch_scores.shape) + ch_scores = ch_scores * self.ch_weight + lm_scores1 = lm_scores1 * self.lm_weight + + if combine_type == "lm_only": + # log P(T|S) + log P(T) + ch_scores = lm_scores1.view(ch_scores.size()) + elif combine_type == "noisy_channel": + # 1/t log P(T|S) + 1/s log P(S|T) + 1/t log P(T) + if self.normalize_lm_scores_by_tgt_len: + ch_scores.div_(src_size) + lm_scores_norm = lm_scores1.view(ch_scores.size()).div(tgt_size) + ch_scores.add_(lm_scores_norm) + # 1/t log P(T|S) + 1/s log P(S|T) + 1/s log P(T) + else: + ch_scores.add_(lm_scores1.view(ch_scores.size())) + ch_scores.div_(src_size) + + return ch_scores + + if self.channel_models is not None: + channel_model = self.channel_models[0] # assume only one channel_model model + else: + channel_model = None + + lm = EnsembleModel(self.lm_models) + lm_incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(lm.models_size) + ], + ) + + reorder_state = None + batch_idxs = None + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as(batch_idxs) + reorder_state.view(-1, beam_size).add_(corr.unsqueeze(-1) * beam_size) + model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = model.reorder_encoder_out(encoder_outs, reorder_state) + + lm.reorder_incremental_state(lm_incremental_states, reorder_state) + + fw_lprobs, avg_attn_scores = model.forward_decoder( + tokens[:, :step + 1], encoder_outs, incremental_states, temperature=self.temperature, + ) + + fw_lprobs[:, self.pad] = -math.inf # never select pad + fw_lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + fw_lprobs, ch_lm_lprobs, lm_lprobs = noisy_channel_rescoring(fw_lprobs, beam_size, bsz, src_tokens, tokens, self.k2) + + # handle min and max length constraints + if step >= max_len: + fw_lprobs[:, :self.eos] = -math.inf + fw_lprobs[:, self.eos + 1:] = -math.inf + elif step < self.min_len: + fw_lprobs[:, self.eos] = -math.inf + + # handle prefix tokens (possibly with different lengths) + if prefix_tokens is not None and step < prefix_tokens.size(1): + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_mask = prefix_toks.ne(self.pad) + + prefix_fw_lprobs = fw_lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + fw_lprobs[prefix_mask] = -math.inf + fw_lprobs[prefix_mask] = fw_lprobs[prefix_mask].scatter_( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_fw_lprobs + ) + + prefix_ch_lm_lprobs = ch_lm_lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + ch_lm_lprobs[prefix_mask] = -math.inf + ch_lm_lprobs[prefix_mask] = ch_lm_lprobs[prefix_mask].scatter_( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_ch_lm_lprobs + ) + + prefix_lm_lprobs = lm_lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + lm_lprobs[prefix_mask] = -math.inf + lm_lprobs[prefix_mask] = lm_lprobs[prefix_mask].scatter_( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lm_lprobs + ) + + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[:, 0, 1:step + 1] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + def replicate_first_beam(tensor, mask): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = replicate_first_beam(tokens, eos_mask_batch_dim) + scores = replicate_first_beam(scores, eos_mask_batch_dim) + + fw_lprobs = replicate_first_beam(fw_lprobs, eos_mask_batch_dim) + ch_lm_lprobs = replicate_first_beam(ch_lm_lprobs, eos_mask_batch_dim) + lm_lprobs = replicate_first_beam(lm_lprobs, eos_mask_batch_dim) + + if self.no_repeat_ngram_size > 0: + # for each beam and batch sentence, generate a list of previous ngrams + gen_ngrams = [{} for bbsz_idx in range(bsz * beam_size)] + for bbsz_idx in range(bsz * beam_size): + gen_tokens = tokens[bbsz_idx].tolist() + for ngram in zip(*[gen_tokens[i:] for i in range(self.no_repeat_ngram_size)]): + gen_ngrams[bbsz_idx][tuple(ngram[:-1])] = \ + gen_ngrams[bbsz_idx].get(tuple(ngram[:-1]), []) + [ngram[-1]] + + # Record attention scores + if avg_attn_scores is not None: + if attn is None: + attn = scores.new(bsz * beam_size, src_tokens.size(1), max_len + 2) + attn_buf = attn.clone() + nonpad_idxs = src_tokens.ne(self.pad) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(fw_lprobs) + scores_buf = scores_buf.type_as(fw_lprobs) + + self.search.set_src_lengths(src_lengths_no_eos) + + if self.no_repeat_ngram_size > 0: + def calculate_banned_tokens(bbsz_idx): + # before decoding the next token, prevent decoding of ngrams that have already appeared + ngram_index = tuple(tokens[bbsz_idx, step + 2 - self.no_repeat_ngram_size:step + 1].tolist()) + return gen_ngrams[bbsz_idx].get(ngram_index, []) + + if step + 2 - self.no_repeat_ngram_size >= 0: + # no banned tokens if we haven't generated no_repeat_ngram_size tokens yet + banned_tokens = [calculate_banned_tokens(bbsz_idx) for bbsz_idx in range(bsz * beam_size)] + else: + banned_tokens = [[] for bbsz_idx in range(bsz * beam_size)] + + for bbsz_idx in range(bsz * beam_size): + fw_lprobs[bbsz_idx, banned_tokens[bbsz_idx]] = -math.inf + + combined_noisy_channel_scores, fw_lprobs_top_k, lm_lprobs_top_k, cand_indices, cand_beams = self.search.step( + step, + fw_lprobs.view(bsz, -1, self.vocab_size), + scores.view(bsz, beam_size, -1)[:, :, :step], ch_lm_lprobs.view(bsz, -1, self.vocab_size), + lm_lprobs.view(bsz, -1, self.vocab_size), self.combine_method + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos (except for candidates to be ignored) + eos_mask = cand_indices.eq(self.eos) + eos_mask[:, :beam_size] &= ~cands_to_ignore + + # only consider eos when it's among the top beam_size indices + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = set() + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + fw_lprobs_top_k[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + combined_noisy_channel_eos_scores = torch.masked_select( + combined_noisy_channel_scores[:, :beam_size], + mask=eos_mask[:, :beam_size], + ) + + # finalize hypo using channel model score + finalized_sents = finalize_hypos( + step, eos_bbsz_idx, eos_scores, combined_noisy_channel_eos_scores) + + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = cand_indices.new_ones(bsz) + batch_mask[cand_indices.new(finalized_sents)] = 0 + batch_idxs = torch.nonzero(batch_mask).squeeze(-1) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + lm_lprobs_top_k = lm_lprobs_top_k[batch_idxs] + + fw_lprobs_top_k = fw_lprobs_top_k[batch_idxs] + cand_indices = cand_indices[batch_idxs] + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths_no_eos = src_lengths_no_eos[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + scores_buf.resize_as_(scores) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens_buf.resize_as_(tokens) + src_tokens = src_tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + src_lengths = src_lengths.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + lm_prefix_scores = lm_prefix_scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1).squeeze() + + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, attn.size(1), -1) + attn_buf.resize_as_(attn) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos or + # ignored hypos and values < cand_size indicate candidate + # active hypos. After this, the min values per row are the top + # candidate active hypos. + eos_mask[:, :beam_size] |= cands_to_ignore + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just the hypos + # with the smallest values in active_mask + active_hypos, new_cands_to_ignore = buffer('active_hypos'), buffer('new_cands_to_ignore') + torch.topk( + active_mask, k=beam_size, dim=1, largest=False, + out=(new_cands_to_ignore, active_hypos) + ) + + # update cands_to_ignore to ignore any finalized hypos + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + assert (~cands_to_ignore).any(dim=1).all() + + active_bbsz_idx = buffer('active_bbsz_idx') + torch.gather( + cand_bbsz_idx, dim=1, index=active_hypos, + out=active_bbsz_idx, + ) + active_scores = torch.gather( + fw_lprobs_top_k, dim=1, index=active_hypos, + out=scores[:, step].view(bsz, beam_size), + ) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + torch.index_select( + tokens[:, :step + 1], dim=0, index=active_bbsz_idx, + out=tokens_buf[:, :step + 1], + ) + torch.gather( + cand_indices, dim=1, index=active_hypos, + out=tokens_buf.view(bsz, beam_size, -1)[:, :, step + 1], + ) + if step > 0: + torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx, + out=scores_buf[:, :step], + ) + torch.gather( + fw_lprobs_top_k, dim=1, index=active_hypos, + out=scores_buf.view(bsz, beam_size, -1)[:, :, step], + ) + torch.gather( + lm_lprobs_top_k, dim=1, index=active_hypos, + out=lm_prefix_scores.view(bsz, beam_size) + ) + + # copy attention for active hypotheses + if attn is not None: + torch.index_select( + attn[:, :, :step + 2], dim=0, index=active_bbsz_idx, + out=attn_buf[:, :, :step + 2], + ) + + # swap buffers + tokens, tokens_buf = tokens_buf, tokens + scores, scores_buf = scores_buf, scores + if attn is not None: + attn, attn_buf = attn_buf, attn + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # sort by score descending + for sent in range(len(finalized)): + finalized[sent] = sorted(finalized[sent], key=lambda r: r['score'], reverse=True) + + return finalized + + +def get_lm_scores(model, input_tokens, incremental_states, cand_tokens, input_len, k): + with torch.no_grad(): + lm_lprobs, avg_attn_scores = model.forward_decoder( + input_tokens, encoder_outs=None, incremental_states=incremental_states, + ) + + lm_lprobs_size = lm_lprobs.size(0) + probs_next_wrd = torch.gather(lm_lprobs.repeat(1, k).view(lm_lprobs_size*k, -1), 1, cand_tokens).squeeze().view(-1) + + return probs_next_wrd + + +def make_dict2dict(old_dict, new_dict): + dict2dict_map = {} + for sym in old_dict.symbols: + dict2dict_map[old_dict.index(sym)] = new_dict.index(sym) + return dict2dict_map + + +def dict2dict(tokens, dict2dict_map): + if tokens.device == torch.device('cpu'): + tokens_tmp = tokens + else: + tokens_tmp = tokens.cpu() + return tokens_tmp.map_( + tokens_tmp, + lambda _, val, dict2dict_map=dict2dict_map : dict2dict_map[float(val)] + ).to(tokens.device) + + +def reorder_tokens(tokens, lengths, eos): + # reorder source tokens so they may be used as reference for P(S|T) + return torch.cat((tokens.new([eos]), tokens[-lengths:-1], tokens[:-lengths]), 0) + + +def reorder_all_tokens(tokens, lengths, eos): + # used to reorder src tokens from [ .. ] to [ ...] + # so source tokens can be used to predict P(S|T) + return torch.stack([reorder_tokens(token, length, eos) for token, length in zip(tokens, lengths)]) + + +def normalized_scores_with_batch_vocab( + model_decoder, features, target_ids, k, bsz, beam_size, + pad_idx, top_k=0, vocab_size_meter=None, start_idx=None, + end_idx=None, **kwargs): + """ + Get normalized probabilities (or log probs) from a net's output + w.r.t. vocab consisting of target IDs in the batch + """ + if model_decoder.adaptive_softmax is None: + weight = model_decoder.output_projection.weight + vocab_ids = torch.unique( + torch.cat( + (torch.unique(target_ids), torch.arange(top_k, device=target_ids.device)) + ) + ) + id_map = dict(zip(vocab_ids.tolist(), range(len(vocab_ids)))) + mapped_target_ids = target_ids.cpu().apply_( + lambda x, id_map=id_map: id_map[x] + ).to(target_ids.device) + expanded_target_ids = mapped_target_ids[:, :].repeat(1, k).view(bsz*beam_size*k, -1) + if start_idx is not None and end_idx is not None: + expanded_target_ids = expanded_target_ids[start_idx:end_idx, :] + logits = F.linear(features, weight[vocab_ids, :]) + log_softmax = F.log_softmax(logits, dim=-1, dtype=torch.float32) + intermed_scores = torch.gather( + log_softmax[:, :-1, :], + 2, + expanded_target_ids[:, 1:].unsqueeze(2), + ).squeeze() + not_padding = expanded_target_ids[:, 1:] != pad_idx + intermed_scores *= not_padding.float() + return intermed_scores + else: + raise ValueError("adaptive softmax doesn't work with " + + "`normalized_scores_with_batch_vocab()`") diff --git a/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_translation.py b/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_translation.py new file mode 100644 index 0000000..b74bdfd --- /dev/null +++ b/SpeechT5/fairseq/examples/fast_noisy_channel/noisy_channel_translation.py @@ -0,0 +1,127 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.tasks.translation import TranslationTask +from fairseq.tasks.language_modeling import LanguageModelingTask +from fairseq import checkpoint_utils +import argparse +from fairseq.tasks import register_task +import torch + + +@register_task("noisy_channel_translation") +class NoisyChannelTranslation(TranslationTask): + """ + Rescore the top k candidates from each beam using noisy channel modeling + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + TranslationTask.add_args(parser) + # fmt: off + parser.add_argument('--channel-model', metavar='FILE', + help='path to P(S|T) model. P(S|T) and P(T|S) must share source and target dictionaries.') + parser.add_argument('--combine-method', default='lm_only', + choices=['lm_only', 'noisy_channel'], + help="""method for combining direct and channel model scores. + lm_only: decode with P(T|S)P(T) + noisy_channel: decode with 1/t P(T|S) + 1/s(P(S|T)P(T))""") + parser.add_argument('--normalize-lm-scores-by-tgt-len', action='store_true', default=False, + help='normalize lm score by target length instead of source length') + parser.add_argument('--channel-scoring-type', default='log_norm', choices=['unnormalized', 'log_norm', 'k2_separate', 'src_vocab', 'src_vocab_batched'], + help="Normalize bw scores with log softmax or return bw scores without log softmax") + parser.add_argument('--top-k-vocab', default=0, type=int, + help='top k vocab IDs to use with `src_vocab` in channel model scoring') + parser.add_argument('--k2', default=50, type=int, + help='the top k2 candidates to rescore with the noisy channel model for each beam') + parser.add_argument('--ch-wt', default=1, type=float, + help='weight for the channel model') + parser.add_argument('--lm-model', metavar='FILE', + help='path to lm model file, to model P(T). P(T) must share the same vocab as the direct model on the target side') + parser.add_argument('--lm-data', metavar='FILE', + help='path to lm model training data for target language, used to properly load LM with correct dictionary') + parser.add_argument('--lm-wt', default=1, type=float, + help='the weight of the lm in joint decoding') + # fmt: on + + def build_generator( + self, models, args, seq_gen_cls=None, extra_gen_cls_kwargs=None + ): + if getattr(args, "score_reference", False): + raise NotImplementedError() + else: + from .noisy_channel_sequence_generator import NoisyChannelSequenceGenerator + use_cuda = torch.cuda.is_available() and not self.args.cpu + assert self.args.lm_model is not None, '--lm-model required for noisy channel generation!' + assert self.args.lm_data is not None, '--lm-data required for noisy channel generation to map between LM and bitext vocabs' + if self.args.channel_model is not None: + import copy + ch_args_task = copy.deepcopy(self.args) + tmp = ch_args_task.source_lang + ch_args_task.source_lang = ch_args_task.target_lang + ch_args_task.target_lang = tmp + ch_args_task._name = 'translation' + channel_task = TranslationTask.setup_task(ch_args_task) + + arg_dict = {} + arg_dict['task'] = 'language_modeling' + arg_dict['sample_break_mode'] = 'eos' + arg_dict['data'] = self.args.lm_data + arg_dict['output_dictionary_size'] = -1 + lm_args = argparse.Namespace(**arg_dict) + lm_task = LanguageModelingTask.setup_task(lm_args) + lm_dict = lm_task.output_dictionary + + if self.args.channel_model is not None: + channel_models, _ = checkpoint_utils.load_model_ensemble(self.args.channel_model.split(':'), task=channel_task) + + for model in channel_models: + model.make_generation_fast_( + beamable_mm_beam_size=None if args.no_beamable_mm else args.beam, + need_attn=args.print_alignment, + ) + if self.args.fp16: + model.half() + if use_cuda: + model.cuda() + else: + channel_models = None + + lm_models, _ = checkpoint_utils.load_model_ensemble(self.args.lm_model.split(':'), task=lm_task) + + for model in lm_models: + model.make_generation_fast_( + beamable_mm_beam_size=None if args.no_beamable_mm else args.beam, + need_attn=args.print_alignment, + ) + if self.args.fp16: + model.half() + if use_cuda: + model.cuda() + return NoisyChannelSequenceGenerator( + combine_method=self.args.combine_method, + tgt_dict=self.target_dictionary, + src_dict=self.source_dictionary, + beam_size=getattr(args, 'beam', 5), + max_len_a=getattr(args, 'max_len_a', 0), + max_len_b=getattr(args, 'max_len_b', 200), + min_len=getattr(args, 'min_len', 1), + len_penalty=getattr(args, 'lenpen', 1), + unk_penalty=getattr(args, 'unkpen', 0), + temperature=getattr(args, 'temperature', 1.), + match_source_len=getattr(args, 'match_source_len', False), + no_repeat_ngram_size=getattr(args, 'no_repeat_ngram_size', 0), + normalize_scores=(not getattr(args, 'unnormalized', False)), + channel_models=channel_models, + k2=getattr(self.args, 'k2', 50), + ch_weight=getattr(self.args, 'ch_wt', 1), + channel_scoring_type=self.args.channel_scoring_type, + top_k_vocab=self.args.top_k_vocab, + lm_models=lm_models, + lm_dict=lm_dict, + lm_weight=getattr(self.args, 'lm_wt', 1), + normalize_lm_scores_by_tgt_len=getattr(self.args, 'normalize_lm_scores_by_tgt_len', False), + ) diff --git a/SpeechT5/fairseq/examples/flores101/README.md b/SpeechT5/fairseq/examples/flores101/README.md new file mode 100644 index 0000000..635c13f --- /dev/null +++ b/SpeechT5/fairseq/examples/flores101/README.md @@ -0,0 +1,223 @@ +

    + +

    + +# Flores101: Large-Scale Multilingual Machine Translation + +## Introduction + +Baseline pretrained models for small and large tracks of WMT 21 Large-Scale Multilingual Machine Translation competition. + +Flores Task at WMT 21: http://www.statmt.org/wmt21/large-scale-multilingual-translation-task.html + +Flores announement blog post: https://ai.facebook.com/blog/flores-researchers-kick-off-multilingual-translation-challenge-at-wmt-and-call-for-compute-grants/ + + + +## Pretrained models + +Model | Num layers | Embed dimension | FFN dimension| Vocab Size | #params | Download +---|---|---|---|---|---|--- +`flores101_mm100_615M` | 12 | 1024 | 4096 | 256,000 | 615M | https://dl.fbaipublicfiles.com/flores101/pretrained_models/flores101_mm100_615M.tar.gz +`flores101_mm100_175M` | 6 | 512 | 2048 | 256,000 | 175M | https://dl.fbaipublicfiles.com/flores101/pretrained_models/flores101_mm100_175M.tar.gz + + +These models are trained similar to [M2M-100](https://arxiv.org/abs/2010.11125) with additional support for the languages that are part of the WMT Large-Scale Multilingual Machine Translation track. Full list of languages can be found at the bottom. + + +## Example Generation code + +### Download model, sentencepiece vocab + +```bash +fairseq=/path/to/fairseq +cd $fairseq + +# Download 615M param model. +wget https://dl.fbaipublicfiles.com/flores101/pretrained_models/flores101_mm100_615M.tar.gz + +# Extract +tar -xvzf flores101_mm100_615M.tar.gz +``` + +### Encode using our SentencePiece Model +Note: Install SentencePiece from [here](https://github.com/google/sentencepiece) + + +```bash +fairseq=/path/to/fairseq +cd $fairseq + +# Download example dataset From German to French +sacrebleu --echo src -l de-fr -t wmt19 | head -n 20 > raw_input.de-fr.de +sacrebleu --echo ref -l de-fr -t wmt19 | head -n 20 > raw_input.de-fr.fr + +for lang in de fr ; do + python scripts/spm_encode.py \ + --model flores101_mm100_615M/sentencepiece.bpe.model \ + --output_format=piece \ + --inputs=raw_input.de-fr.${lang} \ + --outputs=spm.de-fr.${lang} +done +``` + +### Binarization + +```bash +fairseq-preprocess \ + --source-lang de --target-lang fr \ + --testpref spm.de-fr \ + --thresholdsrc 0 --thresholdtgt 0 \ + --destdir data_bin \ + --srcdict flores101_mm100_615M/dict.txt --tgtdict flores101_mm100_615M/dict.txt +``` + +### Generation + + +```bash +fairseq-generate \ + data_bin \ + --batch-size 1 \ + --path flores101_mm100_615M/model.pt \ + --fixed-dictionary flores101_mm100_615M/dict.txt \ + -s de -t fr \ + --remove-bpe 'sentencepiece' \ + --beam 5 \ + --task translation_multi_simple_epoch \ + --lang-pairs flores101_mm100_615M/language_pairs.txt \ + --decoder-langtok --encoder-langtok src \ + --gen-subset test \ + --fp16 \ + --dataset-impl mmap \ + --distributed-world-size 1 --distributed-no-spawn +``` + +### Supported Languages and lang code + +Language | lang code +---|--- +Akrikaans | af +Amharic | am +Arabic | ar +Assamese | as +Asturian | ast +Aymara | ay +Azerbaijani | az +Bashkir | ba +Belarusian | be +Bulgarian | bg +Bengali | bn +Breton | br +Bosnian | bs +Catalan | ca +Cebuano | ceb +Chokwe | cjk +Czech | cs +Welsh | cy +Danish | da +German | de +Dyula| dyu +Greek | el +English | en +Spanish | es +Estonian | et +Persian | fa +Fulah | ff +Finnish | fi +French | fr +Western Frisian | fy +Irish | ga +Scottish Gaelic | gd +Galician | gl +Gujarati | gu +Hausa | ha +Hebrew | he +Hindi | hi +Croatian | hr +Haitian Creole | ht +Hungarian | hu +Armenian | hy +Indonesian | id +Igbo | ig +Iloko | ilo +Icelandic | is +Italian | it +Japanese | ja +Javanese | jv +Georgian | ka +Kachin | kac +Kamba | kam +Kabuverdianu | kea +Kongo | kg +Kazakh | kk +Central Khmer | km +Kimbundu | kmb +Northern Kurdish | kmr +Kannada | kn +Korean | ko +Kurdish | ku +Kyrgyz | ky +Luxembourgish | lb +Ganda | lg +Lingala | ln +Lao | lo +Lithuanian | lt +Luo | luo +Latvian | lv +Malagasy | mg +Maori | mi +Macedonian | mk +Malayalam | ml +Mongolian | mn +Marathi | mr +Malay | ms +Maltese | mt +Burmese | my +Nepali | ne +Dutch | nl +Norwegian | no +Northern Sotho | ns +Nyanja | ny +Occitan | oc +Oromo | om +Oriya | or +Punjabi | pa +Polish | pl +Pashto | ps +Portuguese | pt +Quechua | qu +Romanian | ro +Russian | ru +Sindhi | sd +Shan | shn +Sinhala | si +Slovak | sk +Slovenian | sl +Shona | sn +Somali | so +Albanian | sq +Serbian | sr +Swati | ss +Sundanese | su +Swedish | sv +Swahili | sw +Tamil | ta +Telugu | te +Tajik | tg +Thai | th +Tigrinya | ti +Tagalog | tl +Tswana | tn +Turkish | tr +Ukrainian | uk +Umbundu | umb +Urdu | ur +Uzbek | uz +Vietnamese | vi +Wolof | wo +Xhosa | xh +Yiddish | yi +Yoruba | yo +Chinese| zh +Zulu | zu diff --git a/SpeechT5/fairseq/examples/flores101/flores_logo.png b/SpeechT5/fairseq/examples/flores101/flores_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d1455c6eab608ff5317ce885183cd213564273 GIT binary patch literal 33184 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%0AfAGxmXw!$3%t zPaHzbr!&=|&zd<`j?;K=n*Do9vj0izq!E3IaVq8in5@{}wPiccKi(%(MGrv15Km5X zV40LZTh+9$fI#A5#|y}}Jg%B4P|EpWR9eTS=CT+UG?45NH}J#AMK7u5Zq=j|>Z_9M zPv(WTD^0@e9MKE;Mhg>NtodHPlX?3@gQ9kKtA7v1hI^LSes|PpLveH>D^k>ab7@qF zUjmuY=BKuO#kY$;8cpVPiOWHKjZx{@{zsg9G=x!XL3N z>N(FA-r(71Z9%t?%Jlc(X>O+B$`q?}^k2uJ|1`f=eNTD+XnLzil=B7PvusaAxj&SH zAp0h54~IY2445O2Tm8E-Dn!K_m{OVW-@Zvw7LvNeConI-*_YH?_856BPREW}9xj$~ zCStW!-^F}Xo{XjgBWH>`jE}{Rn;&;MnX_#A1TtY-Gd#^vMX-||qrf@;1BbYJk@0`p zn;|^K(H9I)J%(~75t760M$Zs+>CfeP$R2NYqHwfT62u29TiG9JYF(~7by^)Rezd{1 zpZjv!Yr|WcK>XO^SN+^}cR!%|0i_C4y#0DtLimitations

    + +FSDP currently has several limitations compared to fairseq's default DDP backend (PyTorch DDP): +* while FSDP is full compatible with pointwise Optimizers (e.g., Adam, AdamW, Adadelta, Adamax, SGD, etc.), it is not currently compatible with non-pointwise Optimizers (e.g., Adagrad, Adafactor, LAMB, etc.) +* FSDP depends on flattening the parameters, so models that currently require `--fp16-no-flatten-grads` may not be supported + +See the [fairscale docs](https://fairscale.readthedocs.io/en/latest/api/nn/fsdp_tips.html) for a more detailed +explanation of these and other limitations. + +

    + +
    How it works

    + +Fully Sharded Data Parallel + +See the [fairscale docs](https://fairscale.readthedocs.io/en/latest/api/nn/fsdp_tips.html) for a more detailed +explanation of how FSDP works. + +

    + +## Example usage + +The following examples illustrate how to train a very large language model with +13 billion parameters on 1 GPU by offloading parameters and optimizer states to +CPU, or on 8 GPUs by fully sharding the params and optimizer states across GPUs. + +These examples use the WikiText-103 dataset for demonstration purposes, but +in practice a much larger dataset will be needed to achieve good results. +Follow the [instructions here](https://github.com/pytorch/fairseq/blob/master/examples/roberta/README.pretraining.md#1-preprocess-the-data) +to preprocess the WikiText-103 dataset using the GPT-2/RoBERTa vocabulary. + +### 13B params on 1 V100 GPU (with CPU offloading) + +The following command trains a 13B parameter GPT-3 model on a single V100 GPU +using the `--cpu-offload` feature to offload parameters and optimizer states to +CPU. In this setting, the optimizer step (Adam) happens on CPU. We also use the +`--checkpoint-activations` feature (sometimes called [gradient checkpointing](https://pytorch.org/docs/stable/checkpoint.html)), +which further saves memory in exchange for a small increase in computation. + +**Requirements:** +- Install the latest master version of fairscale: `pip install git+https://github.com/facebookresearch/fairscale.git@master` +- You'll need 32GB of GPU memory and ~256GB of system memory to train the 13B param model. +- If you have less system memory, the 6.7B param model can be trained with ~128GB of system memory, just set `--arch transformer_lm_gpt3_6_7` +- We use the CPU Adam optimizer from [DeepSpeed](https://github.com/microsoft/DeepSpeed), so you'll need to `pip install deepspeed` before running the command. + +**Notes:** +- The command will take ~5 minutes to start training, during which time it will appear to be hung, since randomly initializing 13B weights can be slow. +- The `--cpu-offload` feature requires training in mixed precision (`--fp16`). +- Tune the `OMP_NUM_THREADS` env variable for best performance with CPU offloading. +- The example command below stops training after 10 steps (`--max-update 10`) and does not save checkpoints (`--no-save`). + +```bash +OMP_NUM_THREADS=20 CUDA_VISIBLE_DEVICES=0 \ + fairseq-train data-bin/wikitext-103-roberta-bpe-bin \ + --ddp-backend fully_sharded --fp16 --fp16-init-scale 4 \ + --cpu-offload --checkpoint-activations \ + --task language_modeling --tokens-per-sample 2048 --batch-size 8 \ + --arch transformer_lm_gpt3_13 \ + --optimizer cpu_adam --adam-betas "(0.9,0.98)" \ + --lr 0.0001 --lr-scheduler polynomial_decay --warmup-updates 5 --total-num-update 10 \ + --max-update 10 --no-save --log-format json --log-interval 1 +``` + +
    Example output

    + +``` +(...) +2021-03-08 12:29:51 | INFO | fairseq_cli.train | num. model params: 13,110,865,920 (num. trained: 13,110,865,920) +(...) +2021-03-08 12:29:51 | INFO | fairseq_cli.train | training on 1 devices (GPUs/TPUs) +2021-03-08 12:29:51 | INFO | fairseq_cli.train | max tokens per GPU = None and batch size per GPU = 8 +(...) +Adam Optimizer #0 is created with AVX2 arithmetic capability. +Config: alpha=0.000100, betas=(0.900000, 0.980000), weight_decay=0.000000, adam_w=1 +(...) +2021-03-08 12:31:36 | INFO | train_inner | {"epoch": 1, "update": 0.0, "loss": "16.475", "ppl": "91120.8", "wps": "0", "ups": "0", "wpb": "16384", "bsz": "8", "num_updates": "1", "lr": "2e-05", "gnorm": "20.751", "loss_scale": "4", "train_wall": "99", "gb_free": "9.3", "wall": "105"} +2021-03-08 12:32:33 | INFO | train_inner | {"epoch": 1, "update": 0.0, "loss": "16.446", "ppl": "89281.6", "wps": "288.7", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "2", "lr": "4e-05", "gnorm": "19.777", "loss_scale": "4", "train_wall": "57", "gb_free": "9.3", "wall": "161"} +2021-03-08 12:33:12 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 2.0 +2021-03-08 12:33:51 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 1.0 +2021-03-08 12:34:45 | INFO | train_inner | {"epoch": 1, "update": 0.001, "loss": "25.22", "ppl": "3.90691e+07", "wps": "123.4", "ups": "0.01", "wpb": "16384", "bsz": "8", "num_updates": "3", "lr": "6e-05", "gnorm": "131.281", "loss_scale": "1", "train_wall": "133", "gb_free": "9.3", "wall": "294"} +2021-03-08 12:35:43 | INFO | train_inner | {"epoch": 1, "update": 0.001, "loss": "18.079", "ppl": "276809", "wps": "285.5", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "4", "lr": "8e-05", "gnorm": "13.776", "loss_scale": "1", "train_wall": "57", "gb_free": "9.3", "wall": "351"} +2021-03-08 12:36:35 | INFO | train_inner | {"epoch": 1, "update": 0.001, "loss": "23.729", "ppl": "1.39088e+07", "wps": "316.7", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "5", "lr": "0.0001", "gnorm": "72.774", "loss_scale": "1", "train_wall": "52", "gb_free": "9.3", "wall": "403"} +2021-03-08 12:37:28 | INFO | train_inner | {"epoch": 1, "update": 0.001, "loss": "20.429", "ppl": "1.41203e+06", "wps": "307.6", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "6", "lr": "8e-05", "gnorm": "60.846", "loss_scale": "1", "train_wall": "53", "gb_free": "9.3", "wall": "456"} +2021-03-08 12:38:27 | INFO | train_inner | {"epoch": 1, "update": 0.001, "loss": "18.965", "ppl": "511684", "wps": "279.4", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "7", "lr": "6e-05", "gnorm": "22.687", "loss_scale": "1", "train_wall": "59", "gb_free": "9.3", "wall": "515"} +2021-03-08 12:39:18 | INFO | train_inner | {"epoch": 1, "update": 0.001, "loss": "18.345", "ppl": "332887", "wps": "319.1", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "8", "lr": "4e-05", "gnorm": "8.451", "loss_scale": "1", "train_wall": "51", "gb_free": "9.3", "wall": "566"} +2021-03-08 12:40:11 | INFO | train_inner | {"epoch": 1, "update": 0.002, "loss": "18.262", "ppl": "314336", "wps": "305.9", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "9", "lr": "2e-05", "gnorm": "6.457", "loss_scale": "1", "train_wall": "54", "gb_free": "9.3", "wall": "620"} +2021-03-08 12:41:04 | INFO | train_inner | {"epoch": 1, "update": 0.002, "loss": "17.556", "ppl": "192686", "wps": "311.8", "ups": "0.02", "wpb": "16384", "bsz": "8", "num_updates": "10", "lr": "0", "gnorm": "5.796", "loss_scale": "1", "train_wall": "53", "gb_free": "9.3", "wall": "673"} +2021-03-08 12:41:04 | INFO | fairseq_cli.train | Stopping training due to num_updates: 10 >= max_update: 10 +2021-03-08 12:41:04 | INFO | fairseq_cli.train | begin validation on "valid" subset +2021-03-08 12:43:15 | INFO | valid | {"epoch": 1, "valid_loss": "17.953", "valid_ppl": "253807", "valid_wps": "1868.4", "valid_wpb": "15400.2", "valid_bsz": "7.6", "valid_num_updates": "10"} +2021-03-08 12:43:15 | INFO | fairseq_cli.train | end of epoch 1 (average epoch stats below) +2021-03-08 12:43:15 | INFO | train | {"epoch": 1, "train_loss": "19.351", "train_ppl": "668509", "train_wps": "210.9", "train_ups": "0.01", "train_wpb": "16384", "train_bsz": "8", "train_num_updates": "10", "train_lr": "0", "train_gnorm": "36.26", "train_loss_scale": "1", "train_train_wall": "667", "train_gb_free": "9.3", "train_wall": "804"} +2021-03-08 12:43:15 | INFO | fairseq_cli.train | done training in 798.6 seconds +``` + +

    + +### 13B params on 8 V100 GPUs (with full parameter + optimizer state sharding) + +FSDP can also shard the parameters and optimizer states across multiple GPUs, +reducing memory requirements significantly. On 8 x 32GB GPUs, sharding enables +training the same 13B parameter model *without offloading the parameters to +CPU*. However, without CPU offloading we'd only be able to fit a batch size of +1 per GPU, which would cause training speed to suffer. + +We obtain the best performance on 8 GPUs by combining full sharding and CPU +offloading. The following command trains the same 13B parameter GPT-3 model as +before on 8 x 32GB V100 GPUs; training speed increases superlinearly from ~310 +words per second to ~3200 words per second. + +```bash +OMP_NUM_THREADS=20 CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ + fairseq-train data-bin/wikitext-103-roberta-bpe-bin \ + --ddp-backend fully_sharded --fp16 --fp16-init-scale 4 \ + --cpu-offload --checkpoint-activations \ + --task language_modeling --tokens-per-sample 2048 --batch-size 8 \ + --arch transformer_lm_gpt3_13 \ + --optimizer cpu_adam --adam-betas "(0.9,0.98)" \ + --lr 0.0001 --lr-scheduler polynomial_decay --warmup-updates 5 --total-num-update 10 \ + --max-update 10 --no-save --log-format json --log-interval 1 +``` + +
    Example output

    + +``` +(...) +2021-03-08 18:04:09 | INFO | fairseq_cli.train | num. model params: 13,110,865,920 (num. trained: 13,110,865,920) +(...) +2021-03-08 18:04:09 | INFO | fairseq_cli.train | training on 8 devices (GPUs/TPUs) +2021-03-08 18:04:09 | INFO | fairseq_cli.train | max tokens per GPU = None and batch size per GPU = 8 +(...) +Adam Optimizer #0 is created with AVX2 arithmetic capability. +Config: alpha=0.000100, betas=(0.900000, 0.980000), weight_decay=0.000000, adam_w=1 +(...) +2021-03-08 18:05:06 | INFO | train_inner | {"epoch": 1, "update": 0.001, "loss": "16.408", "ppl": "86945.6", "wps": "0", "ups": "0", "wpb": "131072", "bsz": "64", "num_updates": "1", "lr": "2e-05", "gnorm": "18.27", "loss_scale": "4", "train_wall": "47", "gb_free": "9.3", "wall": "56"} +2021-03-08 18:05:45 | INFO | train_inner | {"epoch": 1, "update": 0.002, "loss": "16.352", "ppl": "83644.3", "wps": "3283.4", "ups": "0.03", "wpb": "131072", "bsz": "64", "num_updates": "2", "lr": "4e-05", "gnorm": "18.411", "loss_scale": "4", "train_wall": "40", "gb_free": "9.3", "wall": "96"} +2021-03-08 18:06:21 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 2.0 +2021-03-08 18:06:56 | INFO | fairseq.trainer | NOTE: gradient overflow detected, ignoring gradient, setting loss scale to: 1.0 +2021-03-08 18:07:37 | INFO | train_inner | {"epoch": 1, "update": 0.006, "loss": "23.682", "ppl": "1.34537e+07", "wps": "1176.6", "ups": "0.01", "wpb": "131072", "bsz": "64", "num_updates": "3", "lr": "6e-05", "gnorm": "119.682", "loss_scale": "1", "train_wall": "111", "gb_free": "9.3", "wall": "208"} +2021-03-08 18:08:18 | INFO | train_inner | {"epoch": 1, "update": 0.007, "loss": "18.988", "ppl": "519921", "wps": "3189.1", "ups": "0.02", "wpb": "131072", "bsz": "64", "num_updates": "4", "lr": "8e-05", "gnorm": "14.934", "loss_scale": "1", "train_wall": "41", "gb_free": "9.3", "wall": "249"} +2021-03-08 18:08:59 | INFO | train_inner | {"epoch": 1, "update": 0.008, "loss": "20.08", "ppl": "1.10798e+06", "wps": "3223.1", "ups": "0.02", "wpb": "131072", "bsz": "64", "num_updates": "5", "lr": "0.0001", "gnorm": "59.92", "loss_scale": "1", "train_wall": "41", "gb_free": "9.3", "wall": "289"} +2021-03-08 18:09:39 | INFO | train_inner | {"epoch": 1, "update": 0.009, "loss": "18.323", "ppl": "327980", "wps": "3256.6", "ups": "0.02", "wpb": "131072", "bsz": "64", "num_updates": "6", "lr": "8e-05", "gnorm": "37.425", "loss_scale": "1", "train_wall": "40", "gb_free": "9.3", "wall": "330"} +2021-03-08 18:10:20 | INFO | train_inner | {"epoch": 1, "update": 0.01, "loss": "17.264", "ppl": "157354", "wps": "3188.7", "ups": "0.02", "wpb": "131072", "bsz": "64", "num_updates": "7", "lr": "6e-05", "gnorm": "10.824", "loss_scale": "1", "train_wall": "41", "gb_free": "9.3", "wall": "371"} +2021-03-08 18:11:01 | INFO | train_inner | {"epoch": 1, "update": 0.011, "loss": "16.794", "ppl": "113647", "wps": "3230", "ups": "0.02", "wpb": "131072", "bsz": "64", "num_updates": "8", "lr": "4e-05", "gnorm": "5.616", "loss_scale": "1", "train_wall": "41", "gb_free": "9.3", "wall": "411"} +2021-03-08 18:11:39 | INFO | train_inner | {"epoch": 1, "update": 0.012, "loss": "16.706", "ppl": "106938", "wps": "3384", "ups": "0.03", "wpb": "131072", "bsz": "64", "num_updates": "9", "lr": "2e-05", "gnorm": "5.318", "loss_scale": "1", "train_wall": "39", "gb_free": "9.3", "wall": "450"} +2021-03-08 18:12:19 | INFO | train_inner | {"epoch": 1, "update": 0.013, "loss": "16.548", "ppl": "95796.2", "wps": "3274.4", "ups": "0.02", "wpb": "131072", "bsz": "64", "num_updates": "10", "lr": "0", "gnorm": "5.22", "loss_scale": "1", "train_wall": "40", "gb_free": "9.3", "wall": "490"} +2021-03-08 18:12:19 | INFO | fairseq_cli.train | Stopping training due to num_updates: 10 >= max_update: 10 +2021-03-08 18:12:19 | INFO | fairseq_cli.train | begin validation on "valid" subset +2021-03-08 18:12:45 | INFO | valid | {"epoch": 1, "valid_loss": "16.624", "valid_ppl": "101000", "valid_wps": "10855.9", "valid_wpb": "123202", "valid_bsz": "60.5", "valid_num_updates": "10"} +2021-03-08 18:12:45 | INFO | fairseq_cli.train | end of epoch 1 (average epoch stats below) +2021-03-08 18:12:45 | INFO | train | {"epoch": 1, "train_loss": "18.114", "train_ppl": "283776", "train_wps": "2567.8", "train_ups": "0.02", "train_wpb": "131072", "train_bsz": "64", "train_num_updates": "10", "train_lr": "0", "train_gnorm": "29.562", "train_loss_scale": "1", "train_train_wall": "480", "train_gb_free": "9.3", "train_wall": "516"} +2021-03-08 18:12:45 | INFO | fairseq_cli.train | done training in 509.9 seconds +``` + +

    diff --git a/SpeechT5/fairseq/examples/gottbert/README.md b/SpeechT5/fairseq/examples/gottbert/README.md new file mode 100644 index 0000000..1d58feb --- /dev/null +++ b/SpeechT5/fairseq/examples/gottbert/README.md @@ -0,0 +1,64 @@ +# GottBERT: a pure German language model + +## Introduction + +[GottBERT](http://arxiv.org/abs/2012.02110) is a pretrained language model trained on 145GB of German text based on RoBERTa. + +## Example usage + +### fairseq +##### Load GottBERT from torch.hub (PyTorch >= 1.1): +```python +import torch +gottbert = torch.hub.load('pytorch/fairseq', 'gottbert-base') +gottbert.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Load GottBERT (for PyTorch 1.0 or custom models): +```python +# Download gottbert model +wget https://dl.gottbert.de/fairseq/models/gottbert-base.tar.gz +tar -xzvf gottbert.tar.gz + +# Load the model in fairseq +from fairseq.models.roberta import GottbertModel +gottbert = GottbertModel.from_pretrained('/path/to/gottbert') +gottbert.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Filling masks: +```python +masked_line = 'Gott ist ! :)' +gottbert.fill_mask(masked_line, topk=3) +# [('Gott ist gut ! :)', 0.3642110526561737, ' gut'), +# ('Gott ist überall ! :)', 0.06009674072265625, ' überall'), +# ('Gott ist großartig ! :)', 0.0370681993663311, ' großartig')] +``` + +##### Extract features from GottBERT + +```python +# Extract the last layer's features +line = "Der erste Schluck aus dem Becher der Naturwissenschaft macht atheistisch , aber auf dem Grunde des Bechers wartet Gott !" +tokens = gottbert.encode(line) +last_layer_features = gottbert.extract_features(tokens) +assert last_layer_features.size() == torch.Size([1, 27, 768]) + +# Extract all layer's features (layer 0 is the embedding layer) +all_layers = gottbert.extract_features(tokens, return_all_hiddens=True) +assert len(all_layers) == 13 +assert torch.all(all_layers[-1] == last_layer_features) +``` +## Citation +If you use our work, please cite: + +```bibtex +@misc{scheible2020gottbert, + title={GottBERT: a pure German Language Model}, + author={Raphael Scheible and Fabian Thomczyk and Patric Tippmann and Victor Jaravine and Martin Boeker}, + year={2020}, + eprint={2012.02110}, + archivePrefix={arXiv}, + primaryClass={cs.CL} +} +``` diff --git a/SpeechT5/fairseq/examples/hubert/README.md b/SpeechT5/fairseq/examples/hubert/README.md new file mode 100644 index 0000000..3254b75 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/README.md @@ -0,0 +1,116 @@ +# HuBERT + +## Pre-trained and fine-tuned (ASR) models +Model | Pretraining Data | Finetuning Dataset | Model +|---|---|---|--- +HuBERT Base (~95M params) | [Librispeech](http://www.openslr.org/12) 960 hr | No finetuning (Pretrained Model) | [download](https://dl.fbaipublicfiles.com/hubert/hubert_base_ls960.pt) +HuBERT Large (~316M params) | [Libri-Light](https://github.com/facebookresearch/libri-light) 60k hr | No finetuning (Pretrained Model) | [download](https://dl.fbaipublicfiles.com/hubert/hubert_large_ll60k.pt) +HuBERT Extra Large (~1B params) | [Libri-Light](https://github.com/facebookresearch/libri-light) 60k hr | No finetuning (Pretrained Model) | [download](https://dl.fbaipublicfiles.com/hubert/hubert_xtralarge_ll60k.pt) +HuBERT Large | [Libri-Light](https://github.com/facebookresearch/libri-light) 60k hr | [Librispeech](http://www.openslr.org/12) 960 hr | [download](https://dl.fbaipublicfiles.com/hubert/hubert_large_ll60k_finetune_ls960.pt) +HuBERT Extra Large | [Libri-Light](https://github.com/facebookresearch/libri-light) 60k hr | [Librispeech](http://www.openslr.org/12) 960 hr | [download](https://dl.fbaipublicfiles.com/hubert/hubert_xtralarge_ll60k_finetune_ls960.pt) + +## Load a pretrained model +``` +ckpt_path = "/path/to/the/checkpoint.pt" +models, cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task([ckpt_path], strict=False) +model = models[0] +``` +** We will follow-up with a patch such that you wouldn't need to pass `strict=False` for loading the checkpoint in future. + +## Train a new model + +### Data preparation + +Follow the steps in `./simple_kmeans` to create: +- `{train,valid}.tsv` waveform list files +- `{train,valid}.km` frame-aligned pseudo label files. +The `label_rate` is the same as the feature frame rate used for clustering, +which is 100Hz for MFCC features and 50Hz for HuBERT features by default. + +### Pre-train a HuBERT model + +Suppose `{train,valid}.tsv` are saved at `/path/to/data`, `{train,valid}.km` +are saved at `/path/to/labels`, and the label rate is 100Hz. + +To train a base model (12 layer transformer), run: +```sh +$ python fairseq_cli/hydra_train.py \ + --config-dir /path/to/fairseq-py/examples/hubert/config/pretrain \ + --config-name hubert_base_librispeech \ + task.data=/path/to/data task.label_dir=/path/to/labels model.label_rate=100 +``` + +### Fine-tune a HuBERT model with a CTC loss + +Suppose `{train,valid}.tsv` are saved at `/path/to/data`, and their +corresponding character transcripts `{train,valid}.ltr` are saved at +`/path/to/trans`. + +To fine-tune a pre-trained HuBERT model at `/path/to/checkpoint`, run +```sh +$ python fairseq_cli/hydra_train.py \ + --config-dir /path/to/fairseq-py/examples/hubert/config/finetune \ + --config-name base_10h \ + task.data=/path/to/data task.label_dir=/path/to/trans \ + model.w2v_path=/path/to/checkpoint +``` + +### Decode a HuBERT model + +Suppose the `test.tsv` and `test.ltr` are the waveform list and transcripts of +the split to be decoded, saved at `/path/to/data`, and the fine-tuned model is +saved at `/path/to/checkpoint`. We support three decoding modes: +- Viterbi decoding: greedy decoding without a language model +- KenLM decoding: decoding with an arpa-format KenLM n-gram language model +- Fairseq-LM deocding: decoding with a Fairseq neural language model + + +#### Viterbi decoding + +`task.normalize` needs to be consistent with the value used during fine-tuning. +Decoding results will be saved at +`/path/to/experiment/directory/decode/viterbi/test`. + +```sh +$ python examples/speech_recognition/new/infer.py \ + --config-dir /path/to/fairseq-py/examples/hubert/config/decode \ + --config-name infer_viterbi \ + task.data=/path/to/data \ + task.normalize=[true|false] \ + decoding.exp_dir=/path/to/experiment/directory \ + common_eval.path=/path/to/checkpoint + dataset.gen_subset=test \ +``` + +#### KenLM / Fairseq-LM decoding + +Suppose the pronunciation lexicon and the n-gram LM are saved at +`/path/to/lexicon` and `/path/to/arpa`, respectively. Decoding results will be +saved at `/path/to/experiment/directory/decode/kenlm/test`. + +```sh +$ python examples/speech_recognition/new/infer.py \ + --config-dir /path/to/fairseq-py/examples/hubert/config/decode \ + --config-name infer_kenlm \ + task.data=/path/to/data \ + task.normalize=[true|false] \ + decoding.exp_dir=/path/to/experiment/directory \ + common_eval.path=/path/to/checkpoint + dataset.gen_subset=test \ + decoding.decoder.lexicon=/path/to/lexicon \ + decoding.decoder.lmpath=/path/to/arpa +``` + +The command above uses the default decoding hyperparameter, which can be found +in `examples/speech_recognition/hydra/decoder.py`. These parameters can be +configured from the command line. For example, to search with a beam size of +500, we can append the command above with `decoding.decoder.beam=500`. +Important parameters include: +- decoding.decoder.beam +- decoding.decoder.beamthreshold +- decoding.decoder.lmweight +- decoding.decoder.wordscore +- decoding.decoder.silweight + +To decode with a Fairseq LM, use `--config-name infer_fsqlm` instead, and +change the path of lexicon and LM accordingly. diff --git a/SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/ngram.yaml b/SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/ngram.yaml new file mode 100644 index 0000000..5a02df1 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/ngram.yaml @@ -0,0 +1,33 @@ +# @package _global_ + +common_eval: + results_path: ${decoding.exp_dir}/decode/${decoding.decoder.name}_ax/${dataset.gen_subset} + +hydra: + sweeper: + ax_config: + max_trials: 60 + early_stop: + minimize: true + max_epochs_without_improvement: 10 + epsilon: 0.025 + experiment: + name: ${dataset.gen_subset} + objective_name: wer + minimize: true + parameter_constraints: null + outcome_constraints: null + status_quo: null + client: + verbose_logging: false + random_seed: null + params: + decoding.decoder.lmweight: + type: range + bounds: [0.0, 8.0] + decoding.decoder.wordscore: + type: range + bounds: [-5.0, 5.0] + decoding.decoder.silweight: + type: range + bounds: [-10.0, 0.0] diff --git a/SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/transformer.yaml b/SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/transformer.yaml new file mode 100644 index 0000000..85ed3bd --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/decode/ax_sweep/transformer.yaml @@ -0,0 +1,33 @@ +# @package _global_ + +common_eval: + results_path: ${decoding.exp_dir}/decode/${decoding.decoder.name}_ax/${dataset.gen_subset} + +hydra: + sweeper: + ax_config: + max_trials: 60 + early_stop: + minimize: true + max_epochs_without_improvement: 10 + epsilon: 0.025 + experiment: + name: ${dataset.gen_subset} + objective_name: wer + minimize: true + parameter_constraints: null + outcome_constraints: null + status_quo: null + client: + verbose_logging: false + random_seed: null + params: + decoding.decoder.lmweight: + type: range + bounds: [0.0, 4.0] + decoding.decoder.wordscore: + type: range + bounds: [-5.0, 5.0] + decoding.decoder.silweight: + type: range + bounds: [-8.0, 0.0] diff --git a/SpeechT5/fairseq/examples/hubert/config/decode/infer_fsqlm.yaml b/SpeechT5/fairseq/examples/hubert/config/decode/infer_fsqlm.yaml new file mode 100644 index 0000000..bc77cab --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/decode/infer_fsqlm.yaml @@ -0,0 +1,36 @@ +# @package _group_ + +defaults: + - model: null + +hydra: + run: + dir: ${common_eval.results_path}/beam${decoding.decoder.beam}_lmw${decoding.decoder.lmweight}_wrd${decoding.decoder.wordscore}_sil${decoding.decoder.silweight} + sweep: + dir: ${common_eval.results_path} + subdir: beam${decoding.decoder.beam}_th${decoding.decoder.beamthreshold}_lmw${decoding.decoder.lmweight}_wrd${decoding.decoder.wordscore}_sil${decoding.decoder.silweight} + +task: + _name: hubert_pretraining + single_target: true + data: ??? + normalize: ??? + +decoding: + type: fairseqlm + lexicon: ??? + lmpath: ??? + beamthreshold: 25 # 100 + beam: 500 + lmweight: 2 + wordscore: -1 + silweight: 0 + unique_wer_file: true + beam: 500 +common_eval: + results_path: ??? + path: ??? + post_process: letter +dataset: + max_tokens: 1100000 + gen_subset: ??? diff --git a/SpeechT5/fairseq/examples/hubert/config/decode/infer_kenlm.yaml b/SpeechT5/fairseq/examples/hubert/config/decode/infer_kenlm.yaml new file mode 100644 index 0000000..26f5c48 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/decode/infer_kenlm.yaml @@ -0,0 +1,36 @@ +# @package _group_ + +defaults: + - model: null + +hydra: + run: + dir: ${common_eval.results_path}/beam${decoding.decoder.beam}_lmw${decoding.decoder.lmweight}_wrd${decoding.decoder.wordscore}_sil${decoding.decoder.silweight} + sweep: + dir: ${common_eval.results_path} + subdir: beam${decoding.decoder.beam}_th${decoding.decoder.beamthreshold}_lmw${decoding.decoder.lmweight}_wrd${decoding.decoder.wordscore}_sil${decoding.decoder.silweight} + +task: + _name: hubert_pretraining + single_target: true + data: ??? + normalize: ??? + +decoding: + type: kenlm + lexicon: ??? + lmpath: ??? + beamthreshold: 100 + beam: 500 + lmweight: 2 + wordscore: -1 + silweight: 0 + unique_wer_file: true + beam: 500 +common_eval: + results_path: ??? + path: ??? + post_process: letter +dataset: + max_tokens: 1100000 + gen_subset: ??? diff --git a/SpeechT5/fairseq/examples/hubert/config/decode/infer_viterbi.yaml b/SpeechT5/fairseq/examples/hubert/config/decode/infer_viterbi.yaml new file mode 100644 index 0000000..935d7d1 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/decode/infer_viterbi.yaml @@ -0,0 +1,31 @@ +# @package _group_ + +defaults: + - model: null + +hydra: + run: + dir: ${common_eval.results_path}/beam${decoding.decoder.beam}_lmw${decoding.decoder.lmweight}_wrd${decoding.decoder.wordscore}_sil${decoding.decoder.silweight} + sweep: + dir: ${common_eval.results_path} + subdir: beam${decoding.decoder.beam}_th${decoding.decoder.beamthreshold}_lmw${decoding.decoder.lmweight}_wrd${decoding.decoder.wordscore}_sil${decoding.decoder.silweight} + +task: + _name: hubert_pretraining + single_target: true + data: ??? + normalize: ??? + +decoding: + type: viterbi + unique_wer_file: true +common_eval: + results_path: ??? + path: ??? + post_process: letter +generation: + nbest: 1 + beam: 500 +dataset: + max_tokens: 1100000 + gen_subset: ??? diff --git a/SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm.yaml b/SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm.yaml new file mode 100644 index 0000000..0b80658 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm.yaml @@ -0,0 +1,17 @@ +# @package _global_ +hydra: + launcher: + cpus_per_task: ${distributed_training.distributed_world_size} + gpus_per_node: ${distributed_training.distributed_world_size} + tasks_per_node: ${hydra.launcher.gpus_per_node} + nodes: 1 + mem_gb: 200 + timeout_min: 4320 + max_num_timeout: 50 + name: ${hydra.job.config_name} + submitit_folder: ${hydra.sweep.dir}/submitit + +distributed_training: + distributed_world_size: 1 + distributed_no_spawn: true + distributed_port: 29761 diff --git a/SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm_8gpu.yaml b/SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm_8gpu.yaml new file mode 100644 index 0000000..2f669f3 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/decode/run/submitit_slurm_8gpu.yaml @@ -0,0 +1,17 @@ +# @package _global_ +hydra: + launcher: + cpus_per_task: ${distributed_training.distributed_world_size} + gpus_per_node: ${distributed_training.distributed_world_size} + tasks_per_node: ${hydra.launcher.gpus_per_node} + nodes: 1 + mem_gb: 200 + timeout_min: 4320 + max_num_timeout: 50 + name: ${hydra.job.config_name} + submitit_folder: ${hydra.sweep.dir}/submitit + +distributed_training: + distributed_world_size: 8 + distributed_no_spawn: true + distributed_port: 29761 diff --git a/SpeechT5/fairseq/examples/hubert/config/finetune/base_10h.yaml b/SpeechT5/fairseq/examples/hubert/config/finetune/base_10h.yaml new file mode 100644 index 0000000..a22c7c0 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/finetune/base_10h.yaml @@ -0,0 +1,100 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 5 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: hubert_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: false # must be consistent with pre-training + labels: ["ltr"] + single_target: true + +dataset: + num_workers: 0 + max_tokens: 3200000 + validate_after_updates: ${model.freeze_finetune_updates} + validate_interval: 5 + train_subset: train + valid_subset: valid + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 25000 + lr: [2e-5] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 8000 + hold_steps: 0 + decay_steps: 72000 + final_lr_scale: 0.05 + +model: + _name: hubert_ctc + w2v_path: ??? + apply_mask: true + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechT5/fairseq/examples/hubert/config/finetune/ckpt/it1.yaml b/SpeechT5/fairseq/examples/hubert/config/finetune/ckpt/it1.yaml new file mode 100644 index 0000000..2af96b3 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/finetune/ckpt/it1.yaml @@ -0,0 +1,7 @@ +# @package _global_ + +task: + normalize: false + +model: + w2v_path: /checkpoint/wnhsu/w2v/hubert_final/iter1/hubert.km.randcrop.pmw1_0.puw0_0.grpnorm.ml10.mp0_8.untie.mxsz250000.ufreq1.maxtok1400000.MU400k.s1337.ngpu32/checkpoint_last.pt diff --git a/SpeechT5/fairseq/examples/hubert/config/finetune/lm/ls_4gram.yaml b/SpeechT5/fairseq/examples/hubert/config/finetune/lm/ls_4gram.yaml new file mode 100644 index 0000000..8c7728a --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/finetune/lm/ls_4gram.yaml @@ -0,0 +1,7 @@ +# @package _global_ + +criterion: + wer_kenlm_model: /checkpoint/abdo/old_checkpoint02/datasets/librispeech/4-gram.bin + wer_lexicon: /checkpoint/abdo/old_checkpoint02/datasets/librispeech/10h/raw/lexicon_ltr.lst + wer_lm_weight: 2.0 + wer_word_score: -1.0 diff --git a/SpeechT5/fairseq/examples/hubert/config/finetune/run/submitit_reg.yaml b/SpeechT5/fairseq/examples/hubert/config/finetune/run/submitit_reg.yaml new file mode 100644 index 0000000..2750950 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/finetune/run/submitit_reg.yaml @@ -0,0 +1,20 @@ +# @package _global_ + +hydra: + launcher: + cpus_per_task: 8 + gpus_per_node: 8 + tasks_per_node: ${hydra.launcher.gpus_per_node} + nodes: 1 + comment: null + mem_gb: 384 + timeout_min: 4320 + max_num_timeout: 100 + constraint: volta32gb + name: ${hydra.job.config_name}/${hydra.job.override_dirname} + submitit_folder: ${hydra.sweep.dir}/submitit/%j + +distributed_training: + distributed_world_size: 8 + distributed_port: 29671 + nprocs_per_node: 8 diff --git a/SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter1.yaml b/SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter1.yaml new file mode 100644 index 0000000..0a1b65d --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter1.yaml @@ -0,0 +1,8 @@ +# @package _global_ + +task: + label_dir: ??? + labels: ["km"] + +model: + label_rate: 100 diff --git a/SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter2.yaml b/SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter2.yaml new file mode 100644 index 0000000..2d4bfe6 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/pretrain/data/iter2.yaml @@ -0,0 +1,8 @@ +# @package _global_ + +task: + label_dir: ??? + labels: ["km"] + +model: + label_rate: 50 diff --git a/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_base_librispeech.yaml b/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_base_librispeech.yaml new file mode 100644 index 0000000..bd84461 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_base_librispeech.yaml @@ -0,0 +1,97 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 32 + distributed_port: 29671 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: hubert_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: false # must be consistent with extractor + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: 5 + validate_interval_updates: 10000 + +criterion: + _name: hubert + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: hubert + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_large_librivox.yaml b/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_large_librivox.yaml new file mode 100644 index 0000000..a5192b5 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_large_librivox.yaml @@ -0,0 +1,101 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 128 + distributed_port: 29671 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: hubert_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: true # must be consistent with extractor + +dataset: + num_workers: 6 + max_tokens: 900000 + skip_invalid_size_inputs_valid_test: true + validate_interval: 5 + validate_interval_updates: 10000 + +criterion: + _name: hubert + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + +optimization: + max_update: 400000 + lr: [0.0015] + clip_norm: 1.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: hubert + label_rate: ??? + encoder_layers: 24 + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + encoder_attention_heads: 16 + final_dim: 768 + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: layer_norm + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + encoder_layerdrop: 0.0 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + layer_norm_first: true + feature_grad_mult: 1.0 + untie_final_proj: true + activation_dropout: 0.0 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + run: + dir: /checkpoint/wnhsu/w2v/hubert_final/hydra_pt + sweep: + dir: /checkpoint/wnhsu/w2v/hubert_final/hydra_pt + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_xlarge_librivox.yaml b/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_xlarge_librivox.yaml new file mode 100644 index 0000000..34e8f2b --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/pretrain/hubert_xlarge_librivox.yaml @@ -0,0 +1,101 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 256 + distributed_port: 29671 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: hubert_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: true # must be consistent with extractor + +dataset: + num_workers: 6 + max_tokens: 360000 + skip_invalid_size_inputs_valid_test: true + validate_interval: 5 + validate_interval_updates: 10000 + +criterion: + _name: hubert + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + +optimization: + max_update: 400000 + lr: [0.003] + clip_norm: 1.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: hubert + label_rate: ??? + encoder_layers: 48 + encoder_embed_dim: 1280 + encoder_ffn_embed_dim: 5120 + encoder_attention_heads: 16 + final_dim: 1024 + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: layer_norm + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + encoder_layerdrop: 0.0 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + layer_norm_first: true + feature_grad_mult: 1.0 + untie_final_proj: true + activation_dropout: 0.0 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + run: + dir: /checkpoint/wnhsu/w2v/hubert_final/hydra_pt + sweep: + dir: /checkpoint/wnhsu/w2v/hubert_final/hydra_pt + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechT5/fairseq/examples/hubert/config/pretrain/run/submitit_reg.yaml b/SpeechT5/fairseq/examples/hubert/config/pretrain/run/submitit_reg.yaml new file mode 100644 index 0000000..46c979c --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/config/pretrain/run/submitit_reg.yaml @@ -0,0 +1,20 @@ +# @package _global_ + +hydra: + launcher: + cpus_per_task: 8 + gpus_per_node: 8 + tasks_per_node: ${hydra.launcher.gpus_per_node} + nodes: 4 + comment: null + mem_gb: 384 + timeout_min: 4320 + max_num_timeout: 100 + constraint: volta32gb + name: ${hydra.job.config_name}/${hydra.job.override_dirname} + submitit_folder: ${hydra.sweep.dir}/submitit/%j + +distributed_training: + distributed_world_size: 32 + distributed_port: 29671 + nprocs_per_node: 8 diff --git a/SpeechT5/fairseq/examples/hubert/measure_teacher_quality.py b/SpeechT5/fairseq/examples/hubert/measure_teacher_quality.py new file mode 100644 index 0000000..92279b2 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/measure_teacher_quality.py @@ -0,0 +1,241 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import os.path as op +import re +from tabulate import tabulate +from collections import Counter + + +def comp_purity(p_xy, axis): + max_p = p_xy.max(axis=axis) + marg_p = p_xy.sum(axis=axis) + indv_pur = max_p / marg_p + aggr_pur = max_p.sum() + return indv_pur, aggr_pur + + +def comp_entropy(p): + return (-p * np.log(p + 1e-8)).sum() + + +def comp_norm_mutual_info(p_xy): + p_x = p_xy.sum(axis=1, keepdims=True) + p_y = p_xy.sum(axis=0, keepdims=True) + pmi = np.log(p_xy / np.matmul(p_x, p_y) + 1e-8) + mi = (p_xy * pmi).sum() + h_x = comp_entropy(p_x) + h_y = comp_entropy(p_y) + return mi, mi / h_x, mi / h_y, h_x, h_y + + +def pad(labs, n): + if n == 0: + return np.array(labs) + return np.concatenate([[labs[0]] * n, labs, [labs[-1]] * n]) + + +def comp_avg_seg_dur(labs_list): + n_frms = 0 + n_segs = 0 + for labs in labs_list: + labs = np.array(labs) + edges = np.zeros(len(labs)).astype(bool) + edges[0] = True + edges[1:] = labs[1:] != labs[:-1] + n_frms += len(edges) + n_segs += edges.astype(int).sum() + return n_frms / n_segs + + +def comp_joint_prob(uid2refs, uid2hyps): + """ + Args: + pad: padding for spliced-feature derived labels + """ + cnts = Counter() + skipped = [] + abs_frmdiff = 0 + for uid in uid2refs: + if uid not in uid2hyps: + skipped.append(uid) + continue + refs = uid2refs[uid] + hyps = uid2hyps[uid] + abs_frmdiff += abs(len(refs) - len(hyps)) + min_len = min(len(refs), len(hyps)) + refs = refs[:min_len] + hyps = hyps[:min_len] + cnts.update(zip(refs, hyps)) + tot = sum(cnts.values()) + + ref_set = sorted({ref for ref, _ in cnts.keys()}) + hyp_set = sorted({hyp for _, hyp in cnts.keys()}) + ref2pid = dict(zip(ref_set, range(len(ref_set)))) + hyp2lid = dict(zip(hyp_set, range(len(hyp_set)))) + # print(hyp_set) + p_xy = np.zeros((len(ref2pid), len(hyp2lid)), dtype=float) + for (ref, hyp), cnt in cnts.items(): + p_xy[ref2pid[ref], hyp2lid[hyp]] = cnt + p_xy /= p_xy.sum() + return p_xy, ref2pid, hyp2lid, tot, abs_frmdiff, skipped + + +def read_phn(tsv_path, rm_stress=True): + uid2phns = {} + with open(tsv_path) as f: + for line in f: + uid, phns = line.rstrip().split("\t") + phns = phns.split(",") + if rm_stress: + phns = [re.sub("[0-9]", "", phn) for phn in phns] + uid2phns[uid] = phns + return uid2phns + + +def read_lab(tsv_path, lab_path, pad_len=0, upsample=1): + """ + tsv is needed to retrieve the uids for the labels + """ + with open(tsv_path) as f: + f.readline() + uids = [op.splitext(op.basename(line.rstrip().split()[0]))[0] for line in f] + with open(lab_path) as f: + labs_list = [pad(line.rstrip().split(), pad_len).repeat(upsample) for line in f] + assert len(uids) == len(labs_list) + return dict(zip(uids, labs_list)) + + +def main_lab_lab( + tsv_dir, + lab_dir, + lab_name, + lab_sets, + ref_dir, + ref_name, + pad_len=0, + upsample=1, + verbose=False, +): + # assume tsv_dir is the same for both the reference and the hypotheses + tsv_dir = lab_dir if tsv_dir is None else tsv_dir + + uid2refs = {} + for s in lab_sets: + uid2refs.update(read_lab(f"{tsv_dir}/{s}.tsv", f"{ref_dir}/{s}.{ref_name}")) + + uid2hyps = {} + for s in lab_sets: + uid2hyps.update( + read_lab( + f"{tsv_dir}/{s}.tsv", f"{lab_dir}/{s}.{lab_name}", pad_len, upsample + ) + ) + _main(uid2refs, uid2hyps, verbose) + + +def main_phn_lab( + tsv_dir, + lab_dir, + lab_name, + lab_sets, + phn_dir, + phn_sets, + pad_len=0, + upsample=1, + verbose=False, +): + uid2refs = {} + for s in phn_sets: + uid2refs.update(read_phn(f"{phn_dir}/{s}.tsv")) + + uid2hyps = {} + tsv_dir = lab_dir if tsv_dir is None else tsv_dir + for s in lab_sets: + uid2hyps.update( + read_lab( + f"{tsv_dir}/{s}.tsv", f"{lab_dir}/{s}.{lab_name}", pad_len, upsample + ) + ) + _main(uid2refs, uid2hyps, verbose) + + +def _main(uid2refs, uid2hyps, verbose): + (p_xy, ref2pid, hyp2lid, tot, frmdiff, skipped) = comp_joint_prob( + uid2refs, uid2hyps + ) + ref_pur_by_hyp, ref_pur = comp_purity(p_xy, axis=0) + hyp_pur_by_ref, hyp_pur = comp_purity(p_xy, axis=1) + (mi, mi_norm_by_ref, mi_norm_by_hyp, h_ref, h_hyp) = comp_norm_mutual_info(p_xy) + outputs = { + "ref pur": ref_pur, + "hyp pur": hyp_pur, + "H(ref)": h_ref, + "H(hyp)": h_hyp, + "MI": mi, + "MI/H(ref)": mi_norm_by_ref, + "ref segL": comp_avg_seg_dur(uid2refs.values()), + "hyp segL": comp_avg_seg_dur(uid2hyps.values()), + "p_xy shape": p_xy.shape, + "frm tot": tot, + "frm diff": frmdiff, + "utt tot": len(uid2refs), + "utt miss": len(skipped), + } + print(tabulate([outputs.values()], outputs.keys(), floatfmt=".4f")) + + +if __name__ == "__main__": + """ + compute quality of labels with respect to phone or another labels if set + """ + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("tsv_dir") + parser.add_argument("lab_dir") + parser.add_argument("lab_name") + parser.add_argument("--lab_sets", default=["valid"], type=str, nargs="+") + parser.add_argument( + "--phn_dir", + default="/checkpoint/wnhsu/data/librispeech/960h/fa/raw_phn/phone_frame_align_v1", + ) + parser.add_argument( + "--phn_sets", default=["dev-clean", "dev-other"], type=str, nargs="+" + ) + parser.add_argument("--pad_len", default=0, type=int, help="padding for hypotheses") + parser.add_argument( + "--upsample", default=1, type=int, help="upsample factor for hypotheses" + ) + parser.add_argument("--ref_lab_dir", default="") + parser.add_argument("--ref_lab_name", default="") + parser.add_argument("--verbose", action="store_true") + args = parser.parse_args() + + if args.ref_lab_dir and args.ref_lab_name: + main_lab_lab( + args.tsv_dir, + args.lab_dir, + args.lab_name, + args.lab_sets, + args.ref_lab_dir, + args.ref_lab_name, + args.pad_len, + args.upsample, + args.verbose, + ) + else: + main_phn_lab( + args.tsv_dir, + args.lab_dir, + args.lab_name, + args.lab_sets, + args.phn_dir, + args.phn_sets, + args.pad_len, + args.upsample, + args.verbose, + ) diff --git a/SpeechT5/fairseq/examples/hubert/simple_kmeans/README.md b/SpeechT5/fairseq/examples/hubert/simple_kmeans/README.md new file mode 100644 index 0000000..cd17da3 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/simple_kmeans/README.md @@ -0,0 +1,71 @@ +# Sharded Feature Extraction and K-means Application + +This folder contains scripts for preparing HUBERT labels from tsv files, the +steps are: +1. feature extraction +2. k-means clustering +3. k-means application + + +## Data preparation + +`*.tsv` files contains a list of audio, where each line is the root, and +following lines are the subpath for each audio: +``` + + + +... +``` + + +## Feature extraction + +### MFCC feature +Suppose the tsv file is at `${tsv_dir}/${split}.tsv`. To extract 39-D +mfcc+delta+ddelta features for the 1st iteration HUBERT training, run: +```sh +python dump_mfcc_feature.py ${tsv_dir} ${split} ${nshard} ${rank} ${feat_dir} +``` +This would shard the tsv file into `${nshard}` and extract features for the +`${rank}`-th shard, where rank is an integer in `[0, nshard-1]`. Features would +be saved at `${feat_dir}/${split}_${rank}_${nshard}.{npy,len}`. + + +### HUBERT feature +To extract features from the `${layer}`-th transformer layer of a trained +HUBERT model saved at `${ckpt_path}`, run: +```sh +python dump_hubert_feature.py ${tsv_dir} ${split} ${ckpt_path} ${layer} ${nshard} ${rank} ${feat_dir} +``` +Features would also be saved at `${feat_dir}/${split}_${rank}_${nshard}.{npy,len}`. + +- if out-of-memory, decrease the chunk size with `--max_chunk` + + +## K-means clustering +To fit a k-means model with `${n_clusters}` clusters on 10% of the `${split}` data, run +```sh +python learn_kmeans.py ${feat_dir} ${split} ${nshard} ${km_path} ${n_cluster} --percent 0.1 +``` +This saves the k-means model to `${km_path}`. + +- set `--precent -1` to use all data +- more kmeans options can be found with `-h` flag + + +## K-means application +To apply a trained k-means model `${km_path}` to obtain labels for `${split}`, run +```sh +python dump_km_label.py ${feat_dir} ${split} ${km_path} ${nshard} ${rank} ${lab_dir} +``` +This would extract labels for the `${rank}`-th shard out of `${nshard}` shards +and dump them to `${lab_dir}/${split}_${rank}_${shard}.km` + + +Finally, merge shards for `${split}` by running +```sh +for rank in $(seq 0 $((nshard - 1))); do + cat $lab_dir/${split}_${rank}_${nshard}.km +done > $lab_dir/${split}.km +``` diff --git a/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature.py b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature.py new file mode 100644 index 0000000..cd24289 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature.py @@ -0,0 +1,133 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import math +import os +import sys + +import fairseq +import soundfile as sf +import torch +import torch.nn.functional as F +import tqdm +from npy_append_array import NpyAppendArray + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("dump_hubert_feature") + + +class HubertFeatureReader(object): + def __init__(self, ckpt_path, layer, max_chunk=1600000): + ( + model, + cfg, + task, + ) = fairseq.checkpoint_utils.load_model_ensemble_and_task([ckpt_path]) + self.model = model[0].eval().cuda() + self.task = task + self.layer = layer + self.max_chunk = max_chunk + logger.info(f"TASK CONFIG:\n{self.task.cfg}") + logger.info(f" max_chunk = {self.max_chunk}") + + def read_audio(self, path, ref_len=None): + wav, sr = sf.read(path) + assert sr == self.task.cfg.sample_rate, sr + if wav.ndim == 2: + wav = wav.mean(-1) + assert wav.ndim == 1, wav.ndim + if ref_len is not None and abs(ref_len - len(wav)) > 160: + logging.warning(f"ref {ref_len} != read {len(wav)} ({path})") + return wav + + def get_feats(self, path, ref_len=None): + x = self.read_audio(path, ref_len) + with torch.no_grad(): + x = torch.from_numpy(x).float().cuda() + if self.task.cfg.normalize: + x = F.layer_norm(x, x.shape) + x = x.view(1, -1) + + feat = [] + for start in range(0, x.size(1), self.max_chunk): + x_chunk = x[:, start: start + self.max_chunk] + feat_chunk, _ = self.model.extract_features( + source=x_chunk, + padding_mask=None, + mask=False, + output_layer=self.layer, + ) + feat.append(feat_chunk) + return torch.cat(feat, 1).squeeze(0) + + +def get_path_iterator(tsv, nshard, rank): + with open(tsv, "r") as f: + root = f.readline().rstrip() + lines = [line.rstrip() for line in f] + tot = len(lines) + shard_size = math.ceil(tot / nshard) + start, end = rank * shard_size, min((rank + 1) * shard_size, tot) + assert start < end, "start={start}, end={end}" + logger.info( + f"rank {rank} of {nshard}, process {end-start} " + f"({start}-{end}) out of {tot}" + ) + + lines = lines[start:end] + + def iterate(): + for line in lines: + subpath, nsample = line.split("\t") + yield f"{root}/{subpath}", int(nsample) + + return iterate, len(lines) + + +def dump_feature( + tsv_dir, split, ckpt_path, layer, nshard, rank, feat_dir, max_chunk +): + reader = HubertFeatureReader(ckpt_path, layer, max_chunk) + generator, num = get_path_iterator(f"{tsv_dir}/{split}.tsv", nshard, rank) + iterator = generator() + + feat_path = f"{feat_dir}/{split}_{rank}_{nshard}.npy" + leng_path = f"{feat_dir}/{split}_{rank}_{nshard}.len" + + os.makedirs(feat_dir, exist_ok=True) + if os.path.exists(feat_path): + os.remove(feat_path) + + feat_f = NpyAppendArray(feat_path) + with open(leng_path, "w") as leng_f: + for path, nsample in tqdm.tqdm(iterator, total=num): + feat = reader.get_feats(path, nsample) + feat_f.append(feat.cpu().numpy()) + leng_f.write(f"{len(feat)}\n") + logger.info("finished successfully") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("tsv_dir") + parser.add_argument("split") + parser.add_argument("ckpt_path") + parser.add_argument("layer", type=int) + parser.add_argument("nshard", type=int) + parser.add_argument("rank", type=int) + parser.add_argument("feat_dir") + parser.add_argument("--max_chunk", type=int, default=1600000) + args = parser.parse_args() + logger.info(args) + + dump_feature(**vars(args)) diff --git a/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature_s2t.py b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature_s2t.py new file mode 100644 index 0000000..7ec8a73 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_hubert_feature_s2t.py @@ -0,0 +1,126 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import csv +import io +import logging +import math +import os +import os.path as op +import sys + +import tqdm +from dump_hubert_feature import HubertFeatureReader +from fairseq.data.audio.audio_utils import get_waveform +from fairseq.data.audio.speech_to_text_dataset import ( + read_from_uncompressed_zip, +) +from npy_append_array import NpyAppendArray + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("dump_hubert_feature_s2t") + + +class HubertFeatureReaderS2T(HubertFeatureReader): + def read_audio(self, path, ref_len=None): + path, *extra = path.split(":") + assert len(extra) == 2 + assert path.endswith(".zip") + + data = read_from_uncompressed_zip(path, int(extra[0]), int(extra[1])) + f = io.BytesIO(data) + wav, sr = get_waveform(f) + assert sr == self.task.cfg.sample_rate, sr + if wav.ndim == 2: + wav = wav.mean(-1) + assert wav.ndim == 1, wav.ndim + if ref_len is not None and abs(ref_len - len(wav)) > 160: + logging.warning(f"ref {ref_len} != read {len(wav)} ({path})") + return wav + + +def get_path_iterator(root, tsv, nshard, rank): + with open(tsv) as f: + reader = csv.DictReader( + f, + delimiter="\t", + quotechar=None, + doublequote=False, + lineterminator="\n", + quoting=csv.QUOTE_NONE, + ) + subpaths = [op.join(root, e["audio"]) for e in reader] + + tot = len(subpaths) + shard_size = math.ceil(tot / nshard) + start, end = rank * shard_size, min((rank + 1) * shard_size, tot) + assert start < end, "start={start}, end={end}" + logger.info( + f"rank {rank} of {nshard}, process {end-start} " + f"({start}-{end}) out of {tot}" + ) + + subpaths = subpaths[start:end] + + def iterate(): + for subpath in subpaths: + yield op.join(root, subpath) + + return iterate, len(subpaths) + + +def dump_feature( + root, + tsv_path, + ckpt_path, + layer, + nshard, + rank, + feat_dir, + feat_name, + max_chunk, +): + reader = HubertFeatureReaderS2T(ckpt_path, layer, max_chunk) + generator, num = get_path_iterator(root, tsv_path, nshard, rank) + iterator = generator() + + feat_path = f"{feat_dir}/{feat_name}_{rank}_{nshard}.npy" + leng_path = f"{feat_dir}/{feat_name}_{rank}_{nshard}.len" + + os.makedirs(feat_dir, exist_ok=True) + if op.exists(feat_path): + os.remove(feat_path) + + feat_f = NpyAppendArray(feat_path) + with open(leng_path, "w") as leng_f: + for path in tqdm.tqdm(iterator, total=num): + feat = reader.get_feats(path) + feat_f.append(feat.cpu().numpy()) + leng_f.write(f"{len(feat)}\n") + logger.info("finished successfully") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("root") + parser.add_argument("tsv_path") + parser.add_argument("ckpt_path") + parser.add_argument("layer", type=int) + parser.add_argument("nshard", type=int) + parser.add_argument("rank", type=int) + parser.add_argument("feat_dir") + parser.add_argument("feat_name") + parser.add_argument("--max_chunk", type=int, default=1600000) + args = parser.parse_args() + logger.info(args) + + dump_feature(**vars(args)) diff --git a/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_km_label.py b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_km_label.py new file mode 100644 index 0000000..8871307 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_km_label.py @@ -0,0 +1,98 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import sys + +import numpy as np + +import joblib +import torch +import tqdm + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("dump_km_label") + + +class ApplyKmeans(object): + def __init__(self, km_path): + self.km_model = joblib.load(km_path) + self.C_np = self.km_model.cluster_centers_.transpose() + self.Cnorm_np = (self.C_np ** 2).sum(0, keepdims=True) + + self.C = torch.from_numpy(self.C_np) + self.Cnorm = torch.from_numpy(self.Cnorm_np) + if torch.cuda.is_available(): + self.C = self.C.cuda() + self.Cnorm = self.Cnorm.cuda() + + def __call__(self, x): + if isinstance(x, torch.Tensor): + dist = ( + x.pow(2).sum(1, keepdim=True) + - 2 * torch.matmul(x, self.C) + + self.Cnorm + ) + return dist.argmin(dim=1).cpu().numpy() + else: + dist = ( + (x ** 2).sum(1, keepdims=True) + - 2 * np.matmul(x, self.C_np) + + self.Cnorm_np + ) + return np.argmin(dist, axis=1) + + +def get_feat_iterator(feat_dir, split, nshard, rank): + feat_path = f"{feat_dir}/{split}_{rank}_{nshard}.npy" + leng_path = f"{feat_dir}/{split}_{rank}_{nshard}.len" + with open(leng_path, "r") as f: + lengs = [int(line.rstrip()) for line in f] + offsets = [0] + np.cumsum(lengs[:-1]).tolist() + + def iterate(): + feat = np.load(feat_path, mmap_mode="r") + assert feat.shape[0] == (offsets[-1] + lengs[-1]) + for offset, leng in zip(offsets, lengs): + yield feat[offset: offset + leng] + + return iterate, len(lengs) + + +def dump_label(feat_dir, split, km_path, nshard, rank, lab_dir): + apply_kmeans = ApplyKmeans(km_path) + generator, num = get_feat_iterator(feat_dir, split, nshard, rank) + iterator = generator() + + lab_path = f"{lab_dir}/{split}_{rank}_{nshard}.km" + os.makedirs(lab_dir, exist_ok=True) + with open(lab_path, "w") as f: + for feat in tqdm.tqdm(iterator, total=num): + # feat = torch.from_numpy(feat).cuda() + lab = apply_kmeans(feat).tolist() + f.write(" ".join(map(str, lab)) + "\n") + logger.info("finished successfully") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("feat_dir") + parser.add_argument("split") + parser.add_argument("km_path") + parser.add_argument("nshard", type=int) + parser.add_argument("rank", type=int) + parser.add_argument("lab_dir") + args = parser.parse_args() + logging.info(str(args)) + + dump_label(**vars(args)) diff --git a/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_mfcc_feature.py b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_mfcc_feature.py new file mode 100644 index 0000000..a36fa64 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/simple_kmeans/dump_mfcc_feature.py @@ -0,0 +1,116 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import math +import os +import sys + +import soundfile as sf +import torch +import torchaudio +import tqdm +from npy_append_array import NpyAppendArray + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("dump_mfcc_feature") + + +class MfccFeatureReader(object): + def __init__(self, sample_rate): + self.sample_rate = sample_rate + + def read_audio(self, path, ref_len=None): + wav, sr = sf.read(path) + assert sr == self.sample_rate, sr + if wav.ndim == 2: + wav = wav.mean(-1) + assert wav.ndim == 1, wav.ndim + if ref_len is not None and abs(ref_len - len(wav)) > 160: + logging.warning(f"ref {ref_len} != read {len(wav)} ({path})") + return wav + + def get_feats(self, path, ref_len=None): + x = self.read_audio(path, ref_len) + with torch.no_grad(): + x = torch.from_numpy(x).float() + x = x.view(1, -1) + + mfccs = torchaudio.compliance.kaldi.mfcc( + waveform=x, + sample_frequency=self.sample_rate, + use_energy=False, + ) # (time, freq) + mfccs = mfccs.transpose(0, 1) # (freq, time) + deltas = torchaudio.functional.compute_deltas(mfccs) + ddeltas = torchaudio.functional.compute_deltas(deltas) + concat = torch.cat([mfccs, deltas, ddeltas], dim=0) + concat = concat.transpose(0, 1).contiguous() # (freq, time) + return concat + + +def get_path_iterator(tsv, nshard, rank): + with open(tsv, "r") as f: + root = f.readline().rstrip() + lines = [line.rstrip() for line in f] + tot = len(lines) + shard_size = math.ceil(tot / nshard) + start, end = rank * shard_size, min((rank + 1) * shard_size, tot) + assert start < end, "start={start}, end={end}" + logger.info( + f"rank {rank} of {nshard}, process {end-start} " + f"({start}-{end}) out of {tot}" + ) + + lines = lines[start:end] + + def iterate(): + for line in lines: + subpath, nsample = line.split("\t") + yield f"{root}/{subpath}", int(nsample) + + return iterate, len(lines) + + +def dump_feature(tsv_dir, split, sample_rate, nshard, rank, feat_dir): + reader = MfccFeatureReader(sample_rate) + generator, num = get_path_iterator(f"{tsv_dir}/{split}.tsv", nshard, rank) + iterator = generator() + + feat_path = f"{feat_dir}/{split}_{rank}_{nshard}.npy" + leng_path = f"{feat_dir}/{split}_{rank}_{nshard}.len" + + os.makedirs(feat_dir, exist_ok=True) + if os.path.exists(feat_path): + os.remove(feat_path) + + feat_f = NpyAppendArray(feat_path) + with open(leng_path, "w") as leng_f: + for path, nsample in tqdm.tqdm(iterator, total=num): + feat = reader.get_feats(path, nsample) + feat_f.append(feat.cpu().numpy()) + leng_f.write(f"{len(feat)}\n") + logger.info("finished successfully") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("tsv_dir") + parser.add_argument("split") + parser.add_argument("nshard", type=int) + parser.add_argument("rank", type=int) + parser.add_argument("feat_dir") + parser.add_argument("--sample_rate", type=int, default=16000) + args = parser.parse_args() + logger.info(args) + + dump_feature(**vars(args)) diff --git a/SpeechT5/fairseq/examples/hubert/simple_kmeans/learn_kmeans.py b/SpeechT5/fairseq/examples/hubert/simple_kmeans/learn_kmeans.py new file mode 100644 index 0000000..113ac65 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/simple_kmeans/learn_kmeans.py @@ -0,0 +1,146 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import sys + +import numpy as np +from sklearn.cluster import MiniBatchKMeans + +import joblib + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("learn_kmeans") + + +def get_km_model( + n_clusters, + init, + max_iter, + batch_size, + tol, + max_no_improvement, + n_init, + reassignment_ratio, +): + return MiniBatchKMeans( + n_clusters=n_clusters, + init=init, + max_iter=max_iter, + batch_size=batch_size, + verbose=1, + compute_labels=False, + tol=tol, + max_no_improvement=max_no_improvement, + init_size=None, + n_init=n_init, + reassignment_ratio=reassignment_ratio, + ) + + +def load_feature_shard(feat_dir, split, nshard, rank, percent): + feat_path = f"{feat_dir}/{split}_{rank}_{nshard}.npy" + leng_path = f"{feat_dir}/{split}_{rank}_{nshard}.len" + with open(leng_path, "r") as f: + lengs = [int(line.rstrip()) for line in f] + offsets = [0] + np.cumsum(lengs[:-1]).tolist() + + if percent < 0: + return np.load(feat_path, mmap_mode="r") + else: + nsample = int(np.ceil(len(lengs) * percent)) + indices = np.random.choice(len(lengs), nsample, replace=False) + feat = np.load(feat_path, mmap_mode="r") + sampled_feat = np.concatenate( + [feat[offsets[i]: offsets[i] + lengs[i]] for i in indices], axis=0 + ) + logger.info( + ( + f"sampled {nsample} utterances, {len(sampled_feat)} frames " + f"from shard {rank}/{nshard}" + ) + ) + return sampled_feat + + +def load_feature(feat_dir, split, nshard, seed, percent): + assert percent <= 1.0 + feat = np.concatenate( + [ + load_feature_shard(feat_dir, split, nshard, r, percent) + for r in range(nshard) + ], + axis=0, + ) + logging.info(f"loaded feature with dimension {feat.shape}") + return feat + + +def learn_kmeans( + feat_dir, + split, + nshard, + km_path, + n_clusters, + seed, + percent, + init, + max_iter, + batch_size, + tol, + n_init, + reassignment_ratio, + max_no_improvement, +): + np.random.seed(seed) + feat = load_feature(feat_dir, split, nshard, seed, percent) + km_model = get_km_model( + n_clusters, + init, + max_iter, + batch_size, + tol, + max_no_improvement, + n_init, + reassignment_ratio, + ) + km_model.fit(feat) + joblib.dump(km_model, km_path) + + inertia = -km_model.score(feat) / len(feat) + logger.info("total intertia: %.5f", inertia) + logger.info("finished successfully") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("feat_dir", type=str) + parser.add_argument("split", type=str) + parser.add_argument("nshard", type=int) + parser.add_argument("km_path", type=str) + parser.add_argument("n_clusters", type=int) + parser.add_argument("--seed", default=0, type=int) + parser.add_argument( + "--percent", default=-1, type=float, help="sample a subset; -1 for all" + ) + parser.add_argument("--init", default="k-means++") + parser.add_argument("--max_iter", default=100, type=int) + parser.add_argument("--batch_size", default=10000, type=int) + parser.add_argument("--tol", default=0.0, type=float) + parser.add_argument("--max_no_improvement", default=100, type=int) + parser.add_argument("--n_init", default=20, type=int) + parser.add_argument("--reassignment_ratio", default=0.0, type=float) + args = parser.parse_args() + logging.info(str(args)) + + learn_kmeans(**vars(args)) diff --git a/SpeechT5/fairseq/examples/hubert/update_ckpt.py b/SpeechT5/fairseq/examples/hubert/update_ckpt.py new file mode 100644 index 0000000..53c9e74 --- /dev/null +++ b/SpeechT5/fairseq/examples/hubert/update_ckpt.py @@ -0,0 +1,22 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +src_ckpt = "/checkpoint/wnhsu/w2v/archived/hubert_base_ls960_it2.pt" +ref_ckpt = "/checkpoint/wnhsu/w2v/hubert_icassp_oss_v3/iter2_km100-400k-grp-L6/oss.km500_p0_1_s334.pmw1_0.puw0_0.grpnorm.ml10.mp0_8.untie.mxsz250000.ufreq1.maxtok1400000.MU100k.s1337.ngpu32/checkpoint_last.pt" +new_ckpt = "/checkpoint/wnhsu/w2v/archived/hubert_base_ls960_it2_updated.pt" + + +def update_state(state): + state["model"]["label_embs_concat"] = state["model"].pop("label_embs") + state["args"].task = "hubert_pretraining" + state["args"].labels = f"['{state['args'].labels}']" + return state + + +src_state = torch.load(src_ckpt) +src_state = update_state(src_state) +torch.save(src_state, new_ckpt) diff --git a/SpeechT5/fairseq/examples/joint_alignment_translation/README.md b/SpeechT5/fairseq/examples/joint_alignment_translation/README.md new file mode 100644 index 0000000..cd9c0ea --- /dev/null +++ b/SpeechT5/fairseq/examples/joint_alignment_translation/README.md @@ -0,0 +1,89 @@ +# Jointly Learning to Align and Translate with Transformer Models (Garg et al., 2019) + +This page includes instructions for training models described in [Jointly Learning to Align and Translate with Transformer Models (Garg et al., 2019)](https://arxiv.org/abs/1909.02074). + +## Training a joint alignment-translation model on WMT'18 En-De + +##### 1. Extract and preprocess the WMT'18 En-De data +```bash +./prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh +``` + +##### 2. Generate alignments from statistical alignment toolkits e.g. Giza++/FastAlign. +In this example, we use FastAlign. +```bash +git clone git@github.com:clab/fast_align.git +pushd fast_align +mkdir build +cd build +cmake .. +make +popd +ALIGN=fast_align/build/fast_align +paste bpe.32k/train.en bpe.32k/train.de | awk -F '\t' '{print $1 " ||| " $2}' > bpe.32k/train.en-de +$ALIGN -i bpe.32k/train.en-de -d -o -v > bpe.32k/train.align +``` + +##### 3. Preprocess the dataset with the above generated alignments. +```bash +fairseq-preprocess \ + --source-lang en --target-lang de \ + --trainpref bpe.32k/train \ + --validpref bpe.32k/valid \ + --testpref bpe.32k/test \ + --align-suffix align \ + --destdir binarized/ \ + --joined-dictionary \ + --workers 32 +``` + +##### 4. Train a model +```bash +fairseq-train \ + binarized \ + --arch transformer_wmt_en_de_big_align --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 --activation-fn relu\ + --lr 0.0002 --lr-scheduler inverse_sqrt --warmup-updates 4000 --warmup-init-lr 1e-07 \ + --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ + --max-tokens 3500 --label-smoothing 0.1 \ + --save-dir ./checkpoints --log-interval 1000 --max-update 60000 \ + --keep-interval-updates -1 --save-interval-updates 0 \ + --load-alignments --criterion label_smoothed_cross_entropy_with_alignment \ + --fp16 +``` + +Note that the `--fp16` flag requires you have CUDA 9.1 or greater and a Volta GPU or newer. + +If you want to train the above model with big batches (assuming your machine has 8 GPUs): +- add `--update-freq 8` to simulate training on 8x8=64 GPUs +- increase the learning rate; 0.0007 works well for big batches + +##### 5. Evaluate and generate the alignments (BPE level) +```bash +fairseq-generate \ + binarized --gen-subset test --print-alignment \ + --source-lang en --target-lang de \ + --path checkpoints/checkpoint_best.pt --beam 5 --nbest 1 +``` + +##### 6. Other resources. +The code for: +1. preparing alignment test sets +2. converting BPE level alignments to token level alignments +3. symmetrizing bidirectional alignments +4. evaluating alignments using AER metric +can be found [here](https://github.com/lilt/alignment-scripts) + +## Citation + +```bibtex +@inproceedings{garg2019jointly, + title = {Jointly Learning to Align and Translate with Transformer Models}, + author = {Garg, Sarthak and Peitz, Stephan and Nallasamy, Udhyakumar and Paulik, Matthias}, + booktitle = {Conference on Empirical Methods in Natural Language Processing (EMNLP)}, + address = {Hong Kong}, + month = {November}, + url = {https://arxiv.org/abs/1909.02074}, + year = {2019}, +} +``` diff --git a/SpeechT5/fairseq/examples/joint_alignment_translation/prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh b/SpeechT5/fairseq/examples/joint_alignment_translation/prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh new file mode 100644 index 0000000..e3efeb2 --- /dev/null +++ b/SpeechT5/fairseq/examples/joint_alignment_translation/prepare-wmt18en2de_no_norm_no_escape_no_agressive.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +echo 'Cloning Moses github repository (for tokenization scripts)...' +git clone https://github.com/moses-smt/mosesdecoder.git + +SCRIPTS=mosesdecoder/scripts +TOKENIZER=$SCRIPTS/tokenizer/tokenizer.perl +CLEAN=$SCRIPTS/training/clean-corpus-n.perl +REM_NON_PRINT_CHAR=$SCRIPTS/tokenizer/remove-non-printing-char.perl + +URLS=( + "http://statmt.org/wmt13/training-parallel-europarl-v7.tgz" + "http://statmt.org/wmt13/training-parallel-commoncrawl.tgz" + "http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz" + "http://data.statmt.org/wmt18/translation-task/rapid2016.tgz" + "http://data.statmt.org/wmt17/translation-task/dev.tgz" + "http://statmt.org/wmt14/test-full.tgz" +) +CORPORA=( + "training/europarl-v7.de-en" + "commoncrawl.de-en" + "training-parallel-nc-v13/news-commentary-v13.de-en" + "rapid2016.de-en" +) + +if [ ! -d "$SCRIPTS" ]; then + echo "Please set SCRIPTS variable correctly to point to Moses scripts." + exit +fi + +src=en +tgt=de +lang=en-de +prep=wmt18_en_de +tmp=$prep/tmp +orig=orig +dev=dev/newstest2012 +codes=32000 +bpe=bpe.32k + +mkdir -p $orig $tmp $prep $bpe + +cd $orig + +for ((i=0;i<${#URLS[@]};++i)); do + url=${URLS[i]} + file=$(basename $url) + if [ -f $file ]; then + echo "$file already exists, skipping download" + else + wget "$url" + if [ -f $file ]; then + echo "$url successfully downloaded." + else + echo "$url not successfully downloaded." + exit 1 + fi + if [ ${file: -4} == ".tgz" ]; then + tar zxvf $file + elif [ ${file: -4} == ".tar" ]; then + tar xvf $file + fi + fi +done +cd .. + +echo "pre-processing train data..." +for l in $src $tgt; do + rm -rf $tmp/train.tags.$lang.tok.$l + for f in "${CORPORA[@]}"; do + cat $orig/$f.$l | \ + perl $REM_NON_PRINT_CHAR | \ + perl $TOKENIZER -threads 8 -l $l -no-escape >> $tmp/train.tags.$lang.tok.$l + done +done + +echo "pre-processing test data..." +for l in $src $tgt; do + if [ "$l" == "$src" ]; then + t="src" + else + t="ref" + fi + grep '\s*//g' | \ + sed -e 's/\s*<\/seg>\s*//g' | \ + sed -e "s/\’/\'/g" | \ + perl $TOKENIZER -threads 8 -l $l -no-escape > $tmp/test.$l + echo "" +done + +# apply length filtering before BPE +perl $CLEAN -ratio 1.5 $tmp/train.tags.$lang.tok $src $tgt $tmp/train 1 100 + +# use newstest2012 for valid +echo "pre-processing valid data..." +for l in $src $tgt; do + rm -rf $tmp/valid.$l + cat $orig/$dev.$l | \ + perl $REM_NON_PRINT_CHAR | \ + perl $TOKENIZER -threads 8 -l $l -no-escape >> $tmp/valid.$l +done + +mkdir output +mv $tmp/{train,valid,test}.{$src,$tgt} output + +#BPE +git clone https://github.com/glample/fastBPE.git +pushd fastBPE +g++ -std=c++11 -pthread -O3 fastBPE/main.cc -IfastBPE -o fast +popd +fastBPE/fast learnbpe $codes output/train.$src output/train.$tgt > $bpe/codes +for split in {train,valid,test}; do for lang in {en,de}; do fastBPE/fast applybpe $bpe/$split.$lang output/$split.$lang $bpe/codes; done; done diff --git a/SpeechT5/fairseq/examples/language_model/README.adaptive_inputs.md b/SpeechT5/fairseq/examples/language_model/README.adaptive_inputs.md new file mode 100644 index 0000000..6650d58 --- /dev/null +++ b/SpeechT5/fairseq/examples/language_model/README.adaptive_inputs.md @@ -0,0 +1,39 @@ +# Adaptive Input Representations for Neural Language Modeling (Baevski and Auli, 2018) + +## Pre-trained models + +Description | Parameters | Dataset | Model and Test set(s) +---|---:|---|--- +Adaptive Inputs
    ([Baevski and Auli, 2018](https://arxiv.org/abs/1809.10853)) | 1026M | [Google Billion Words](https://github.com/ciprian-chelba/1-billion-word-language-modeling-benchmark) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_gbw_huge.tar.bz2) +Adaptive Inputs
    ([Baevski and Auli, 2018](https://arxiv.org/abs/1809.10853)) | 247M | [WikiText-103](https://blog.einstein.ai/the-wikitext-long-term-dependency-language-modeling-dataset/) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_wiki103.v2.tar.bz2) + +## Training an LM with adaptive inputs + +First, see the general [language modeling README](README.md) for instructions on +preprocessing the WikiText-103 data. + +Then use the following training command to train a model with adaptive inputs +using the `transformer_lm_wiki103` model architecture: +```bash +fairseq-train --task language_modeling \ + data-bin/wikitext-103 \ + --save-dir checkpoints/transformer_wikitext-103 \ + --arch transformer_lm_wiki103 \ + --max-update 286000 --lr 1.0 --t-mult 2 --lr-period-updates 270000 --lr-scheduler cosine --lr-shrink 0.75 \ + --warmup-updates 16000 --warmup-init-lr 1e-07 --stop-min-lr 1e-09 --optimizer nag --min-lr 0.0001 --clip-norm 0.1 \ + --criterion adaptive_loss --max-tokens 3072 --update-freq 3 --tokens-per-sample 3072 --seed 1 \ + --sample-break-mode none --skip-invalid-size-inputs-valid-test --ddp-backend=legacy_ddp +``` + +## Citation + +```bibtex +@inproceedings{ + baevski2018adaptive, + title={Adaptive Input Representations for Neural Language Modeling}, + author={Alexei Baevski and Michael Auli}, + booktitle={International Conference on Learning Representations}, + year={2019}, + url={https://openreview.net/forum?id=ByxZX20qFQ}, +} +``` diff --git a/SpeechT5/fairseq/examples/language_model/README.conv.md b/SpeechT5/fairseq/examples/language_model/README.conv.md new file mode 100644 index 0000000..1ff8635 --- /dev/null +++ b/SpeechT5/fairseq/examples/language_model/README.conv.md @@ -0,0 +1,40 @@ +# Language Modeling with Gated Convolutional Networks (Dauphin et al., 2017) + +## Example usage + +First download and preprocess the data following the main [language modeling README](README.md). + +Then to train a convolutional LM using the `fconv_lm_dauphin_wikitext103` +architecture: +```bash +fairseq-train --task language_modeling \ + data-bin/wikitext-103 \ + --save-dir checkpoints/fconv_wikitext-103 \ + --arch fconv_lm_dauphin_wikitext103 \ + --adaptive-softmax-cutoff 10000,20000,200000 \ + --dropout 0.2 \ + --criterion adaptive_loss \ + --optimizer nag --clip-norm 0.1 --weight-decay 5e-06 \ + --lr 1.0 --lr-scheduler reduce_lr_on_plateau --lr-shrink 0.5 \ + --max-tokens 1024 --tokens-per-sample 1024 \ + --ddp-backend legacy_ddp \ + --max-epoch 35 +``` + +And evaluate with: +```bash +fairseq-eval-lm data-bin/wikitext-103 --path checkpoints/fconv_wiki103/checkpoint_best.pt +``` + +## Citation + +```bibtex +@inproceedings{dauphin2017language, + title={Language Modeling with Gated Convolutional Networks}, + author={Dauphin, Yann N and Fan, Angela and Auli, Michael and Grangier, David}, + booktitle={Proceedings of the 34th International Conference on Machine Learning-Volume 70}, + pages={933--941}, + year={2017}, + organization={JMLR} +} +``` diff --git a/SpeechT5/fairseq/examples/language_model/README.md b/SpeechT5/fairseq/examples/language_model/README.md new file mode 100644 index 0000000..e78ea48 --- /dev/null +++ b/SpeechT5/fairseq/examples/language_model/README.md @@ -0,0 +1,123 @@ +# Neural Language Modeling + +## Pre-trained models + +Model | Description | Dataset | Download +---|---|---|--- +`transformer_lm.gbw.adaptive_huge` | Adaptive Inputs
    ([Baevski and Auli, 2018](https://arxiv.org/abs/1809.10853))
    1026M params | [Google Billion Words](https://github.com/ciprian-chelba/1-billion-word-language-modeling-benchmark) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_gbw_huge.tar.bz2) +`transformer_lm.wiki103.adaptive` | Adaptive Inputs
    ([Baevski and Auli, 2018](https://arxiv.org/abs/1809.10853))
    247M params | [WikiText-103](https://blog.einstein.ai/the-wikitext-long-term-dependency-language-modeling-dataset) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_wiki103.v2.tar.bz2) +`transformer_lm.wmt19.en` | English LM
    ([Ng et al., 2019](https://arxiv.org/abs/1907.06616)) | [WMT News Crawl](http://data.statmt.org/news-crawl/) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.en.tar.gz) +`transformer_lm.wmt19.de` | German LM
    ([Ng et al., 2019](https://arxiv.org/abs/1907.06616)) | [WMT News Crawl](http://data.statmt.org/news-crawl/) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.de.tar.gz) +`transformer_lm.wmt19.ru` | Russian LM
    ([Ng et al., 2019](https://arxiv.org/abs/1907.06616)) | [WMT News Crawl](http://data.statmt.org/news-crawl/) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.ru.tar.gz) + +## Example usage + +We require a few additional Python dependencies for preprocessing: +```bash +pip install fastBPE sacremoses +``` + +To sample from a language model using PyTorch Hub: +```python +import torch + +# List available models +torch.hub.list('pytorch/fairseq') # [..., 'transformer_lm.wmt19.en', ...] + +# Load an English LM trained on WMT'19 News Crawl data +en_lm = torch.hub.load('pytorch/fairseq', 'transformer_lm.wmt19.en', tokenizer='moses', bpe='fastbpe') +en_lm.eval() # disable dropout + +# Move model to GPU +en_lm.cuda() + +# Sample from the language model +en_lm.sample('Barack Obama', beam=1, sampling=True, sampling_topk=10, temperature=0.8) +# "Barack Obama is coming to Sydney and New Zealand (...)" + +# Compute perplexity for a sequence +en_lm.score('Barack Obama is coming to Sydney and New Zealand')['positional_scores'].mean().neg().exp() +# tensor(15.1474) + +# The same interface can be used with custom models as well +from fairseq.models.transformer_lm import TransformerLanguageModel +custom_lm = TransformerLanguageModel.from_pretrained('/path/to/model/dir', 'checkpoint100.pt', tokenizer='moses', bpe='fastbpe') +custom_lm.sample('Barack Obama', beam=5) +# "Barack Obama (...)" +``` + +## Training a transformer language model with the CLI tools + +### 1) Preprocess the data + +First download and prepare the [WikiText-103 dataset](https://www.salesforce.com/products/einstein/ai-research/the-wikitext-dependency-language-modeling-dataset/): +```bash +cd examples/language_model/ +bash prepare-wikitext-103.sh +cd ../.. +``` + +Next preprocess/binarize the data: +```bash +TEXT=examples/language_model/wikitext-103 +fairseq-preprocess \ + --only-source \ + --trainpref $TEXT/wiki.train.tokens \ + --validpref $TEXT/wiki.valid.tokens \ + --testpref $TEXT/wiki.test.tokens \ + --destdir data-bin/wikitext-103 \ + --workers 20 +``` + +### 2) Train a language model + +Next we'll train a basic transformer language model on wikitext-103. For more +advanced usage, see the [adaptive inputs README](README.adaptive_inputs.md). + +To train a basic LM (assumes 2 GPUs): +``` +$ fairseq-train --task language_modeling \ + data-bin/wikitext-103 \ + --save-dir checkpoints/transformer_wikitext-103 \ + --arch transformer_lm --share-decoder-input-output-embed \ + --dropout 0.1 \ + --optimizer adam --adam-betas '(0.9, 0.98)' --weight-decay 0.01 --clip-norm 0.0 \ + --lr 0.0005 --lr-scheduler inverse_sqrt --warmup-updates 4000 --warmup-init-lr 1e-07 \ + --tokens-per-sample 512 --sample-break-mode none \ + --max-tokens 2048 --update-freq 16 \ + --fp16 \ + --max-update 50000 +``` + +If you run out of memory, try reducing `--max-tokens` (max number of tokens per +batch) or `--tokens-per-sample` (max sequence length). You can also adjust +`--update-freq` to accumulate gradients and simulate training on a different +number of GPUs. + +### 3) Evaluate + +```bash +fairseq-eval-lm data-bin/wikitext-103 \ + --path checkpoints/transformer_wiki103/checkpoint_best.pt \ + --batch-size 2 \ + --tokens-per-sample 512 \ + --context-window 400 +# | Evaluated 245569 tokens in 56.1s (4379.02 tokens/s) +# | Loss: 3.4164, Perplexity: 30.46 +``` + +*Note:* The `--context-window` option controls how much context is provided to +each token when computing perplexity. When the window size is 0, the dataset is +chunked into segments of length 512 and perplexity is computed over each segment +normally. However, this results in worse (higher) perplexity since tokens that +appear earlier in each segment have less conditioning. When the maximum window +size is used (511 in this case), then we compute perplexity for each token +fully conditioned on 511 tokens of context. This slows down evaluation +significantly, since we must run a separate forward pass for every token in the +dataset, but results in better (lower) perplexity. + + +## Convolutional language models + +Please see the [convolutional LM README](README.conv.md) for instructions on +training convolutional language models. diff --git a/SpeechT5/fairseq/examples/language_model/prepare-wikitext-103.sh b/SpeechT5/fairseq/examples/language_model/prepare-wikitext-103.sh new file mode 100644 index 0000000..7513021 --- /dev/null +++ b/SpeechT5/fairseq/examples/language_model/prepare-wikitext-103.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Adapted from https://github.com/facebookresearch/MIXER/blob/master/prepareData.sh + +URLS=( + "https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-v1.zip" +) +FILES=( + "wikitext-103-v1.zip" +) + +for ((i=0;i<${#URLS[@]};++i)); do + file=${FILES[i]} + if [ -f $file ]; then + echo "$file already exists, skipping download" + else + url=${URLS[i]} + wget "$url" + if [ -f $file ]; then + echo "$url successfully downloaded." + else + echo "$url not successfully downloaded." + exit -1 + fi + if [ ${file: -4} == ".tgz" ]; then + tar zxvf $file + elif [ ${file: -4} == ".tar" ]; then + tar xvf $file + elif [ ${file: -4} == ".zip" ]; then + unzip $file + fi + fi +done +cd .. diff --git a/SpeechT5/fairseq/examples/laser/README.md b/SpeechT5/fairseq/examples/laser/README.md new file mode 100644 index 0000000..66acada --- /dev/null +++ b/SpeechT5/fairseq/examples/laser/README.md @@ -0,0 +1,144 @@ +# LASER Language-Agnostic SEntence Representations + +LASER is a library to calculate and use multilingual sentence embeddings. + +You can find more information about LASER and how to use it on the official [LASER repository](https://github.com/facebookresearch/LASER). + +This folder contains source code for training LASER embeddings. + + +## Prepare data and configuration file + +Binarize your data with fairseq, as described [here](https://fairseq.readthedocs.io/en/latest/getting_started.html#data-pre-processing). + +Create a json config file with this format: +``` +{ + "src_vocab": "/path/to/spm.src.cvocab", + "tgt_vocab": "/path/to/spm.tgt.cvocab", + "train": [ + { + "type": "translation", + "id": 0, + "src": "/path/to/srclang1-tgtlang0/train.srclang1", + "tgt": "/path/to/srclang1-tgtlang0/train.tgtlang0" + }, + { + "type": "translation", + "id": 1, + "src": "/path/to/srclang1-tgtlang1/train.srclang1", + "tgt": "/path/to/srclang1-tgtlang1/train.tgtlang1" + }, + { + "type": "translation", + "id": 0, + "src": "/path/to/srclang2-tgtlang0/train.srclang2", + "tgt": "/path/to/srclang2-tgtlang0/train.tgtlang0" + }, + { + "type": "translation", + "id": 1, + "src": "/path/to/srclang2-tgtlang1/train.srclang2", + "tgt": "/path/to/srclang2-tgtlang1/train.tgtlang1" + }, + ... + ], + "valid": [ + { + "type": "translation", + "id": 0, + "src": "/unused", + "tgt": "/unused" + } + ] +} +``` +where paths are paths to binarized indexed fairseq dataset files. +`id` represents the target language id. + + +## Training Command Line Example + +``` +fairseq-train \ + /path/to/configfile_described_above.json \ + --user-dir examples/laser/laser_src \ + --log-interval 100 --log-format simple \ + --task laser --arch laser_lstm \ + --save-dir . \ + --optimizer adam \ + --lr 0.001 \ + --lr-scheduler inverse_sqrt \ + --clip-norm 5 \ + --warmup-updates 90000 \ + --update-freq 2 \ + --dropout 0.0 \ + --encoder-dropout-out 0.1 \ + --max-tokens 2000 \ + --max-epoch 50 \ + --encoder-bidirectional \ + --encoder-layers 5 \ + --encoder-hidden-size 512 \ + --decoder-layers 1 \ + --decoder-hidden-size 2048 \ + --encoder-embed-dim 320 \ + --decoder-embed-dim 320 \ + --decoder-lang-embed-dim 32 \ + --warmup-init-lr 0.001 \ + --disable-validation +``` + + +## Applications + +We showcase several applications of multilingual sentence embeddings +with code to reproduce our results (in the directory "tasks"). + +* [**Cross-lingual document classification**](https://github.com/facebookresearch/LASER/tree/master/tasks/mldoc) using the + [*MLDoc*](https://github.com/facebookresearch/MLDoc) corpus [2,6] +* [**WikiMatrix**](https://github.com/facebookresearch/LASER/tree/master/tasks/WikiMatrix) + Mining 135M Parallel Sentences in 1620 Language Pairs from Wikipedia [7] +* [**Bitext mining**](https://github.com/facebookresearch/LASER/tree/master/tasks/bucc) using the + [*BUCC*](https://comparable.limsi.fr/bucc2018/bucc2018-task.html) corpus [3,5] +* [**Cross-lingual NLI**](https://github.com/facebookresearch/LASER/tree/master/tasks/xnli) + using the [*XNLI*](https://www.nyu.edu/projects/bowman/xnli/) corpus [4,5,6] +* [**Multilingual similarity search**](https://github.com/facebookresearch/LASER/tree/master/tasks/similarity) [1,6] +* [**Sentence embedding of text files**](https://github.com/facebookresearch/LASER/tree/master/tasks/embed) + example how to calculate sentence embeddings for arbitrary text files in any of the supported language. + +**For all tasks, we use exactly the same multilingual encoder, without any task specific optimization or fine-tuning.** + + + +## References + +[1] Holger Schwenk and Matthijs Douze, + [*Learning Joint Multilingual Sentence Representations with Neural Machine Translation*](https://aclanthology.info/papers/W17-2619/w17-2619), + ACL workshop on Representation Learning for NLP, 2017 + +[2] Holger Schwenk and Xian Li, + [*A Corpus for Multilingual Document Classification in Eight Languages*](http://www.lrec-conf.org/proceedings/lrec2018/pdf/658.pdf), + LREC, pages 3548-3551, 2018. + +[3] Holger Schwenk, + [*Filtering and Mining Parallel Data in a Joint Multilingual Space*](http://aclweb.org/anthology/P18-2037) + ACL, July 2018 + +[4] Alexis Conneau, Guillaume Lample, Ruty Rinott, Adina Williams, Samuel R. Bowman, Holger Schwenk and Veselin Stoyanov, + [*XNLI: Cross-lingual Sentence Understanding through Inference*](https://aclweb.org/anthology/D18-1269), + EMNLP, 2018. + +[5] Mikel Artetxe and Holger Schwenk, + [*Margin-based Parallel Corpus Mining with Multilingual Sentence Embeddings*](https://arxiv.org/abs/1811.01136) + arXiv, Nov 3 2018. + +[6] Mikel Artetxe and Holger Schwenk, + [*Massively Multilingual Sentence Embeddings for Zero-Shot Cross-Lingual Transfer and Beyond*](https://arxiv.org/abs/1812.10464) + arXiv, Dec 26 2018. + +[7] Holger Schwenk, Vishrav Chaudhary, Shuo Sun, Hongyu Gong and Paco Guzman, + [*WikiMatrix: Mining 135M Parallel Sentences in 1620 Language Pairs from Wikipedia*](https://arxiv.org/abs/1907.05791) + arXiv, July 11 2019. + +[8] Holger Schwenk, Guillaume Wenzek, Sergey Edunov, Edouard Grave and Armand Joulin + [*CCMatrix: Mining Billions of High-Quality Parallel Sentences on the WEB*](https://arxiv.org/abs/1911.04944) diff --git a/SpeechT5/fairseq/examples/laser/laser_src/__init__.py b/SpeechT5/fairseq/examples/laser/laser_src/__init__.py new file mode 100644 index 0000000..9ffbd65 --- /dev/null +++ b/SpeechT5/fairseq/examples/laser/laser_src/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .laser_task import * # noqa +from .laser_lstm import * # noqa +from .laser_transformer import * # noqa diff --git a/SpeechT5/fairseq/examples/laser/laser_src/laser_lstm.py b/SpeechT5/fairseq/examples/laser/laser_src/laser_lstm.py new file mode 100644 index 0000000..10df90e --- /dev/null +++ b/SpeechT5/fairseq/examples/laser/laser_src/laser_lstm.py @@ -0,0 +1,585 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from fairseq import options, utils + +from fairseq.models import ( + FairseqEncoder, + FairseqIncrementalDecoder, + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) + + +@register_model("laser_lstm") +class LSTMModel(FairseqEncoderDecoderModel): + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + def forward( + self, + src_tokens, + src_lengths, + prev_output_tokens=None, + tgt_tokens=None, + tgt_lengths=None, + target_language_id=None, + dataset_name="", + ): + assert target_language_id is not None + + src_encoder_out = self.encoder(src_tokens, src_lengths, dataset_name) + return self.decoder( + prev_output_tokens, src_encoder_out, lang_id=target_language_id + ) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--dropout", + default=0.1, + type=float, + metavar="D", + help="dropout probability", + ) + parser.add_argument( + "--encoder-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension", + ) + parser.add_argument( + "--encoder-embed-path", + default=None, + type=str, + metavar="STR", + help="path to pre-trained encoder embedding", + ) + parser.add_argument( + "--encoder-hidden-size", type=int, metavar="N", help="encoder hidden size" + ) + parser.add_argument( + "--encoder-layers", type=int, metavar="N", help="number of encoder layers" + ) + parser.add_argument( + "--encoder-bidirectional", + action="store_true", + help="make all layers of encoder bidirectional", + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-embed-path", + default=None, + type=str, + metavar="STR", + help="path to pre-trained decoder embedding", + ) + parser.add_argument( + "--decoder-hidden-size", type=int, metavar="N", help="decoder hidden size" + ) + parser.add_argument( + "--decoder-layers", type=int, metavar="N", help="number of decoder layers" + ) + parser.add_argument( + "--decoder-out-embed-dim", + type=int, + metavar="N", + help="decoder output embedding dimension", + ) + parser.add_argument( + "--decoder-zero-init", + type=str, + metavar="BOOL", + help="initialize the decoder hidden/cell state to zero", + ) + parser.add_argument( + "--decoder-lang-embed-dim", + type=int, + metavar="N", + help="decoder language embedding dimension", + ) + parser.add_argument( + "--fixed-embeddings", + action="store_true", + help="keep embeddings fixed (ENCODER ONLY)", + ) # TODO Also apply to decoder embeddings? + + # Granular dropout settings (if not specified these default to --dropout) + parser.add_argument( + "--encoder-dropout-in", + type=float, + metavar="D", + help="dropout probability for encoder input embedding", + ) + parser.add_argument( + "--encoder-dropout-out", + type=float, + metavar="D", + help="dropout probability for encoder output", + ) + parser.add_argument( + "--decoder-dropout-in", + type=float, + metavar="D", + help="dropout probability for decoder input embedding", + ) + parser.add_argument( + "--decoder-dropout-out", + type=float, + metavar="D", + help="dropout probability for decoder output", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + # make sure that all args are properly defaulted (in case there are any new ones) + base_architecture(args) + + def load_pretrained_embedding_from_file(embed_path, dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + embed_tokens = Embedding(num_embeddings, embed_dim, padding_idx) + embed_dict = utils.parse_embedding(embed_path) + utils.print_embed_overlap(embed_dict, dictionary) + return utils.load_embedding(embed_dict, dictionary, embed_tokens) + + pretrained_encoder_embed = None + if args.encoder_embed_path: + pretrained_encoder_embed = load_pretrained_embedding_from_file( + args.encoder_embed_path, task.source_dictionary, args.encoder_embed_dim + ) + pretrained_decoder_embed = None + if args.decoder_embed_path: + pretrained_decoder_embed = load_pretrained_embedding_from_file( + args.decoder_embed_path, task.target_dictionary, args.decoder_embed_dim + ) + + num_langs = task.num_tasks if hasattr(task, "num_tasks") else 0 + + encoder = LSTMEncoder( + dictionary=task.source_dictionary, + embed_dim=args.encoder_embed_dim, + hidden_size=args.encoder_hidden_size, + num_layers=args.encoder_layers, + dropout_in=args.encoder_dropout_in, + dropout_out=args.encoder_dropout_out, + bidirectional=args.encoder_bidirectional, + pretrained_embed=pretrained_encoder_embed, + fixed_embeddings=args.fixed_embeddings, + ) + decoder = LSTMDecoder( + dictionary=task.target_dictionary, + embed_dim=args.decoder_embed_dim, + hidden_size=args.decoder_hidden_size, + out_embed_dim=args.decoder_out_embed_dim, + num_layers=args.decoder_layers, + dropout_in=args.decoder_dropout_in, + dropout_out=args.decoder_dropout_out, + zero_init=options.eval_bool(args.decoder_zero_init), + encoder_embed_dim=args.encoder_embed_dim, + encoder_output_units=encoder.output_units, + pretrained_embed=pretrained_decoder_embed, + num_langs=num_langs, + lang_embed_dim=args.decoder_lang_embed_dim, + ) + return cls(encoder, decoder) + + +class LSTMEncoder(FairseqEncoder): + """LSTM encoder.""" + + def __init__( + self, + dictionary, + embed_dim=512, + hidden_size=512, + num_layers=1, + dropout_in=0.1, + dropout_out=0.1, + bidirectional=False, + left_pad=True, + pretrained_embed=None, + padding_value=0.0, + fixed_embeddings=False, + ): + super().__init__(dictionary) + self.num_layers = num_layers + self.dropout_in = dropout_in + self.dropout_out = dropout_out + self.bidirectional = bidirectional + self.hidden_size = hidden_size + + num_embeddings = len(dictionary) + self.padding_idx = dictionary.pad() + if pretrained_embed is None: + self.embed_tokens = Embedding(num_embeddings, embed_dim, self.padding_idx) + else: + self.embed_tokens = pretrained_embed + if fixed_embeddings: + self.embed_tokens.weight.requires_grad = False + + self.lstm = LSTM( + input_size=embed_dim, + hidden_size=hidden_size, + num_layers=num_layers, + dropout=self.dropout_out if num_layers > 1 else 0.0, + bidirectional=bidirectional, + ) + self.left_pad = left_pad + self.padding_value = padding_value + + self.output_units = hidden_size + if bidirectional: + self.output_units *= 2 + + def forward(self, src_tokens, src_lengths, dataset_name): + if self.left_pad: + # convert left-padding to right-padding + src_tokens = utils.convert_padding_direction( + src_tokens, + self.padding_idx, + left_to_right=True, + ) + + bsz, seqlen = src_tokens.size() + + # embed tokens + x = self.embed_tokens(src_tokens) + x = F.dropout(x, p=self.dropout_in, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # pack embedded source tokens into a PackedSequence + try: + packed_x = nn.utils.rnn.pack_padded_sequence(x, src_lengths.data.tolist()) + except BaseException: + raise Exception(f"Packing failed in dataset {dataset_name}") + + # apply LSTM + if self.bidirectional: + state_size = 2 * self.num_layers, bsz, self.hidden_size + else: + state_size = self.num_layers, bsz, self.hidden_size + h0 = x.data.new(*state_size).zero_() + c0 = x.data.new(*state_size).zero_() + packed_outs, (final_hiddens, final_cells) = self.lstm(packed_x, (h0, c0)) + + # unpack outputs and apply dropout + x, _ = nn.utils.rnn.pad_packed_sequence( + packed_outs, padding_value=self.padding_value + ) + x = F.dropout(x, p=self.dropout_out, training=self.training) + assert list(x.size()) == [seqlen, bsz, self.output_units] + + if self.bidirectional: + + def combine_bidir(outs): + return torch.cat( + [ + torch.cat([outs[2 * i], outs[2 * i + 1]], dim=0).view( + 1, bsz, self.output_units + ) + for i in range(self.num_layers) + ], + dim=0, + ) + + final_hiddens = combine_bidir(final_hiddens) + final_cells = combine_bidir(final_cells) + + encoder_padding_mask = src_tokens.eq(self.padding_idx).t() + + # Set padded outputs to -inf so they are not selected by max-pooling + padding_mask = src_tokens.eq(self.padding_idx).t().unsqueeze(-1) + if padding_mask.any(): + x = x.float().masked_fill_(padding_mask, float("-inf")).type_as(x) + + # Build the sentence embedding by max-pooling over the encoder outputs + sentemb = x.max(dim=0)[0] + + return { + "sentemb": sentemb, + "encoder_out": (x, final_hiddens, final_cells), + "encoder_padding_mask": encoder_padding_mask + if encoder_padding_mask.any() + else None, + } + + def reorder_encoder_out(self, encoder_out_dict, new_order): + encoder_out_dict["sentemb"] = encoder_out_dict["sentemb"].index_select( + 0, new_order + ) + encoder_out_dict["encoder_out"] = tuple( + eo.index_select(1, new_order) for eo in encoder_out_dict["encoder_out"] + ) + if encoder_out_dict["encoder_padding_mask"] is not None: + encoder_out_dict["encoder_padding_mask"] = encoder_out_dict[ + "encoder_padding_mask" + ].index_select(1, new_order) + return encoder_out_dict + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return int(1e5) # an arbitrary large number + + +class LSTMDecoder(FairseqIncrementalDecoder): + """LSTM decoder.""" + + def __init__( + self, + dictionary, + embed_dim=512, + hidden_size=512, + out_embed_dim=512, + num_layers=1, + dropout_in=0.1, + dropout_out=0.1, + zero_init=False, + encoder_embed_dim=512, + encoder_output_units=512, + pretrained_embed=None, + num_langs=1, + lang_embed_dim=0, + ): + super().__init__(dictionary) + self.dropout_in = dropout_in + self.dropout_out = dropout_out + self.hidden_size = hidden_size + + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + if pretrained_embed is None: + self.embed_tokens = Embedding(num_embeddings, embed_dim, padding_idx) + else: + self.embed_tokens = pretrained_embed + + self.layers = nn.ModuleList( + [ + LSTMCell( + input_size=encoder_output_units + embed_dim + lang_embed_dim + if layer == 0 + else hidden_size, + hidden_size=hidden_size, + ) + for layer in range(num_layers) + ] + ) + if hidden_size != out_embed_dim: + self.additional_fc = Linear(hidden_size, out_embed_dim) + self.fc_out = Linear(out_embed_dim, num_embeddings, dropout=dropout_out) + + if zero_init: + self.sentemb2init = None + else: + self.sentemb2init = Linear( + encoder_output_units, 2 * num_layers * hidden_size + ) + + if lang_embed_dim == 0: + self.embed_lang = None + else: + self.embed_lang = nn.Embedding(num_langs, lang_embed_dim) + nn.init.uniform_(self.embed_lang.weight, -0.1, 0.1) + + def forward( + self, prev_output_tokens, encoder_out_dict, incremental_state=None, lang_id=0 + ): + sentemb = encoder_out_dict["sentemb"] + encoder_out = encoder_out_dict["encoder_out"] + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + bsz, seqlen = prev_output_tokens.size() + + # get outputs from encoder + encoder_outs, _, _ = encoder_out[:3] + srclen = encoder_outs.size(0) + + # embed tokens + x = self.embed_tokens(prev_output_tokens) + x = F.dropout(x, p=self.dropout_in, training=self.training) + + # embed language identifier + if self.embed_lang is not None: + lang_ids = prev_output_tokens.data.new_full((bsz,), lang_id) + langemb = self.embed_lang(lang_ids) + # TODO Should we dropout here??? + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # initialize previous states (or get from cache during incremental generation) + cached_state = utils.get_incremental_state( + self, incremental_state, "cached_state" + ) + if cached_state is not None: + prev_hiddens, prev_cells, input_feed = cached_state + else: + num_layers = len(self.layers) + if self.sentemb2init is None: + prev_hiddens = [ + x.data.new(bsz, self.hidden_size).zero_() for i in range(num_layers) + ] + prev_cells = [ + x.data.new(bsz, self.hidden_size).zero_() for i in range(num_layers) + ] + else: + init = self.sentemb2init(sentemb) + prev_hiddens = [ + init[:, (2 * i) * self.hidden_size : (2 * i + 1) * self.hidden_size] + for i in range(num_layers) + ] + prev_cells = [ + init[ + :, + (2 * i + 1) * self.hidden_size : (2 * i + 2) * self.hidden_size, + ] + for i in range(num_layers) + ] + input_feed = x.data.new(bsz, self.hidden_size).zero_() + + attn_scores = x.data.new(srclen, seqlen, bsz).zero_() + outs = [] + for j in range(seqlen): + if self.embed_lang is None: + input = torch.cat((x[j, :, :], sentemb), dim=1) + else: + input = torch.cat((x[j, :, :], sentemb, langemb), dim=1) + + for i, rnn in enumerate(self.layers): + # recurrent cell + hidden, cell = rnn(input, (prev_hiddens[i], prev_cells[i])) + + # hidden state becomes the input to the next layer + input = F.dropout(hidden, p=self.dropout_out, training=self.training) + + # save state for next time step + prev_hiddens[i] = hidden + prev_cells[i] = cell + + out = hidden + out = F.dropout(out, p=self.dropout_out, training=self.training) + + # input feeding + input_feed = out + + # save final output + outs.append(out) + + # cache previous states (no-op except during incremental generation) + utils.set_incremental_state( + self, + incremental_state, + "cached_state", + (prev_hiddens, prev_cells, input_feed), + ) + + # collect outputs across time steps + x = torch.cat(outs, dim=0).view(seqlen, bsz, self.hidden_size) + + # T x B x C -> B x T x C + x = x.transpose(1, 0) + + # srclen x tgtlen x bsz -> bsz x tgtlen x srclen + attn_scores = attn_scores.transpose(0, 2) + + # project back to size of vocabulary + if hasattr(self, "additional_fc"): + x = self.additional_fc(x) + x = F.dropout(x, p=self.dropout_out, training=self.training) + x = self.fc_out(x) + + return x, attn_scores + + def reorder_incremental_state(self, incremental_state, new_order): + super().reorder_incremental_state(incremental_state, new_order) + cached_state = utils.get_incremental_state( + self, incremental_state, "cached_state" + ) + if cached_state is None: + return + + def reorder_state(state): + if isinstance(state, list): + return [reorder_state(state_i) for state_i in state] + return state.index_select(0, new_order) + + new_state = tuple(map(reorder_state, cached_state)) + utils.set_incremental_state(self, incremental_state, "cached_state", new_state) + + def max_positions(self): + """Maximum output length supported by the decoder.""" + return int(1e5) # an arbitrary large number + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.uniform_(m.weight, -0.1, 0.1) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def LSTM(input_size, hidden_size, **kwargs): + m = nn.LSTM(input_size, hidden_size, **kwargs) + for name, param in m.named_parameters(): + if "weight" in name or "bias" in name: + param.data.uniform_(-0.1, 0.1) + return m + + +def LSTMCell(input_size, hidden_size, **kwargs): + m = nn.LSTMCell(input_size, hidden_size, **kwargs) + for name, param in m.named_parameters(): + if "weight" in name or "bias" in name: + param.data.uniform_(-0.1, 0.1) + return m + + +def Linear(in_features, out_features, bias=True, dropout=0): + """Weight-normalized Linear layer (input: N x T x C)""" + m = nn.Linear(in_features, out_features, bias=bias) + m.weight.data.uniform_(-0.1, 0.1) + if bias: + m.bias.data.uniform_(-0.1, 0.1) + return m + + +@register_model_architecture("laser_lstm", "laser_lstm") +def base_architecture(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_hidden_size = getattr( + args, "encoder_hidden_size", args.encoder_embed_dim + ) + args.encoder_layers = getattr(args, "encoder_layers", 1) + args.encoder_bidirectional = getattr(args, "encoder_bidirectional", False) + args.encoder_dropout_in = getattr(args, "encoder_dropout_in", args.dropout) + args.encoder_dropout_out = getattr(args, "encoder_dropout_out", args.dropout) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_hidden_size = getattr( + args, "decoder_hidden_size", args.decoder_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 1) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 512) + args.decoder_dropout_in = getattr(args, "decoder_dropout_in", args.dropout) + args.decoder_dropout_out = getattr(args, "decoder_dropout_out", args.dropout) + args.decoder_zero_init = getattr(args, "decoder_zero_init", "0") + args.decoder_lang_embed_dim = getattr(args, "decoder_lang_embed_dim", 0) + args.fixed_embeddings = getattr(args, "fixed_embeddings", False) diff --git a/SpeechT5/fairseq/examples/laser/laser_src/laser_task.py b/SpeechT5/fairseq/examples/laser/laser_src/laser_task.py new file mode 100644 index 0000000..c8ac805 --- /dev/null +++ b/SpeechT5/fairseq/examples/laser/laser_src/laser_task.py @@ -0,0 +1,326 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from collections import OrderedDict, defaultdict +import json +import os +import logging + +from fairseq import options, models +from fairseq.data import ( + data_utils, + Dictionary, + LanguagePairDataset, + IndexedDataset, + FairseqDataset, +) +from .multitask_data_utils import ( + MultitaskDatasetWrapper, + MultidatasetEpochBatchIterator, +) + + +from fairseq.tasks import LegacyFairseqTask, register_task + +logger = logging.getLogger(__name__) + + +@register_task("laser") +class LaserTask(LegacyFairseqTask): + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument( + "configfile", metavar="PATH", help="dataset configuration file in json" + ) + parser.add_argument( + "--weighting-alpha", + type=float, + default=None, + help="alpha for automatic weighting", + ) + parser.add_argument( + "--raw-text", action="store_true", help="load raw text dataset" + ) + parser.add_argument( + "--left-pad-source", + default="True", + type=str, + metavar="BOOL", + help="pad the source on the left (default: True)", + ) + parser.add_argument( + "--left-pad-target", + default="False", + type=str, + metavar="BOOL", + help="pad the target on the left (default: False)", + ) + parser.add_argument( + "--max-source-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the source sequence", + ) + parser.add_argument( + "--max-target-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the target sequence", + ) + + def __init__(self, args, config, src_dictionary, tgt_dictionary, num_tasks): + super().__init__(args) + self.config = config + self.src_dictionary = src_dictionary + self.tgt_dictionary = tgt_dictionary + self.num_tasks = num_tasks + + @classmethod + def setup_task(cls, args, **kwargs): + with open(args.configfile, "r") as f: + config = json.load(f) + num_tasks = max(dataset["id"] for dataset in config["train"]) + 1 + + args.left_pad_source = options.eval_bool(args.left_pad_source) + args.left_pad_target = options.eval_bool(args.left_pad_target) + + src_dictionary = Dictionary.load(config["src_vocab"]) + tgt_dictionary = Dictionary.load(config["tgt_vocab"]) + + logger.info( + "| src Dictionary {} : {} types".format( + config["src_vocab"], len(src_dictionary) + ) + ) + logger.info( + "| tgt Dictionary {} : {} types".format( + config["tgt_vocab"], len(tgt_dictionary) + ) + ) + + return cls(args, config, src_dictionary, tgt_dictionary, num_tasks) + + # Experimental overriding for backtranslation + def build_model(self, args): + model = models.build_model(args, self) + return model + + def dataset(self, split): + if split not in self.datasets: + raise KeyError("Dataset not loaded: " + split) + return self.datasets[split] + + def load_dataset(self, split, epoch=1, **kwargs): + """Load a dataset split.""" + + def indexed_dataset(path, dictionary): + if self.args.raw_text: + raise Exception("Unable to handle raw text.") + dataset = IndexedDataset(path, fix_lua_indexing=True) + + return dataset + + pair_datasets = OrderedDict() + + if split == "valid": + self.datasets[split] = pair_datasets + return + + if split not in self.config: + raise FileNotFoundError( + "Dataset not found in config file: {}".format(split) + ) + + size_by_corpus = defaultdict(int) + size_sum = 0 + size_sum_with_subsampling = 0 + init_pair_datasets = {} + + for dataset_config in self.config[split]: + src_path = os.path.dirname(dataset_config["src"]) + corpus_name = src_path.split("/")[-2] + language_pair_name = src_path.split("/")[-1] + pair_datasets_key = corpus_name + "-" + language_pair_name + + logger.info(f"loading... {pair_datasets_key}") + if "src" in dataset_config: + src_dataset = indexed_dataset( + dataset_config["src"], self.src_dictionary + ) + else: + src_dataset = None + + if "tgt" in dataset_config: + tgt_dataset = indexed_dataset( + dataset_config["tgt"], self.tgt_dictionary + ) + else: + tgt_dataset = None + + dataset = LanguagePairDataset( + src_dataset, + src_dataset.sizes, + self.src_dictionary, + tgt_dataset, + tgt_dataset.sizes, + self.tgt_dictionary, + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + ) + + if pair_datasets_key in init_pair_datasets: + logger.warning( + f"Ignoring already added {pair_datasets_key}. " + f"Consider using `sample` key in order to upsample." + ) + else: + init_pair_datasets[pair_datasets_key] = { + "dataset": dataset, + "sample": dataset_config.get("sample", None), + "id": dataset_config.get("id", None), + "len": len(dataset), + } + + length_sum = 0 + weighted_freqs_sum = 0 + freq_per_dataset = {} + vmax = 0 + vmin = 1 + weighted_freq_per_dataset = {} + + if self.args.weighting_alpha: + for key in init_pair_datasets: + if init_pair_datasets[key]["sample"] is None: + length_sum += len(init_pair_datasets[key]["dataset"]) + + for key in init_pair_datasets: + if init_pair_datasets[key]["sample"] is None: + val = float(init_pair_datasets[key]["len"]) / length_sum + freq_per_dataset[key] = val + weighted_freqs_sum += val ** self.args.weighting_alpha + + for key in freq_per_dataset: + val = ( + freq_per_dataset[key] ** self.args.weighting_alpha + / weighted_freqs_sum + ) + vmin = min(vmin, val) + vmax = max(vmax, val) + weighted_freq_per_dataset[key] = val + + for pair_datasets_key in init_pair_datasets: + dataset_config = init_pair_datasets[pair_datasets_key] + dataset = dataset_config["dataset"] + sample = dataset_config["sample"] + if sample is None: + sample = 1.0 + + if pair_datasets_key in weighted_freq_per_dataset: + w = vmax / weighted_freq_per_dataset[pair_datasets_key] + sample = w + + sample = round(sample) + + initial_sample = sample + initial_pair_datasets_key = pair_datasets_key + + while sample >= 1.0: + assert ( + pair_datasets_key not in pair_datasets + ), f"{pair_datasets_key} already in" + size_sum_with_subsampling += len(dataset) + pair_datasets[pair_datasets_key] = MultitaskDatasetWrapper( + dataset, dataset_config.get("id", 0), 1.0, name=pair_datasets_key + ) + size_sum += len(dataset) + sample -= 1.0 + pair_datasets_key += "-up" + + assert sample < 1e-6, f"sample remains > 0 {pair_datasets_key}" + + logger.info( + f"added pair {initial_pair_datasets_key} length {len(dataset)} new_length = {len(dataset)*initial_sample}" + ) + size_by_corpus[corpus_name] += len(dataset) + + self.datasets[split] = pair_datasets + logger.info( + f"Datasets number = {len(self.datasets[split])} size = {size_sum} size_sum_with_subsampling = {size_sum_with_subsampling}" + ) + + @property + def source_dictionary(self): + return self.src_dictionary + + @property + def target_dictionary(self): + return self.tgt_dictionary + + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + ): + + assert isinstance(dataset, OrderedDict) + assert len(dataset) + assert isinstance(dataset[next(iter(dataset))], FairseqDataset) + + # initialize the dataset with the correct starting epoch + for _, dt in dataset.items(): + dt.set_epoch(epoch) + + indices = OrderedDict() + batch_sampler = OrderedDict() + + with data_utils.numpy_seed(seed + epoch): + for key, dt in dataset.items(): + logger.info(f"\t ordered_indices {key}") + indices[key] = dt.ordered_indices() + + # filter examples that are too large + if max_positions is not None: + for key, dt in dataset.items(): + logger.info(f"\t filter_by_size {key}") + indices[key], ignored = dt.filter_indices_by_size( + indices[key], max_positions + ) + + for key, dt in dataset.items(): + logger.info(f"\t batch_by_size {key}") + batch_sampler[key] = data_utils.batch_by_size( + indices[key], + dt.num_tokens, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + + epoch_iter = MultidatasetEpochBatchIterator( + dataset=dataset, + batch_sampler=batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + ) + + return epoch_iter diff --git a/SpeechT5/fairseq/examples/laser/laser_src/laser_transformer.py b/SpeechT5/fairseq/examples/laser/laser_src/laser_transformer.py new file mode 100644 index 0000000..0be0309 --- /dev/null +++ b/SpeechT5/fairseq/examples/laser/laser_src/laser_transformer.py @@ -0,0 +1,354 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +from typing import Any, Dict, List, Optional +from torch import Tensor + +import torch +import torch.nn as nn + +from fairseq.models import ( + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) +from fairseq.models.transformer import ( + base_architecture, + Embedding, + TransformerModel, + TransformerEncoder, + TransformerDecoder, +) +from fairseq.modules import ( + TransformerDecoderLayer, +) + +logger = logging.getLogger(__name__) + + +@register_model("laser_transformer") +class LaserTransformerModel(FairseqEncoderDecoderModel): + """Train Transformer for LASER task + + Requires --task laser + """ + + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + def forward( + self, + src_tokens, + src_lengths, + prev_output_tokens=None, + tgt_tokens=None, + tgt_lengths=None, + target_language_id=-1, + dataset_name="", + ): + laser_encoder_out = self.encoder(src_tokens, src_lengths) + return self.decoder( + prev_output_tokens, laser_encoder_out, lang_id=target_language_id + ) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + TransformerModel.add_args(parser) + parser.add_argument( + "--decoder-lang-embed-dim", + type=int, + metavar="N", + help="decoder language embedding dimension", + ) + + @classmethod + def build_model(cls, args, task): + base_laser_transformer_architecture(args) + + num_langs = task.num_tasks if hasattr(task, "num_tasks") else 0 + + def load_embed_tokens(dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + + return Embedding(num_embeddings, embed_dim, padding_idx) + + encoder_embed_tokens = load_embed_tokens( + task.source_dictionary, args.encoder_embed_dim + ) + decoder_embed_tokens = load_embed_tokens( + task.target_dictionary, args.decoder_embed_dim + ) + num_langs = task.num_tasks if hasattr(task, "num_tasks") else 0 + + encoder = LaserTransformerEncoder( + args, task.source_dictionary, encoder_embed_tokens + ) + + decoder = LaserTransformerDecoder( + args, + task.target_dictionary, + decoder_embed_tokens, + num_langs=num_langs, + lang_embed_dim=args.decoder_lang_embed_dim, + ) + + return cls(encoder, decoder) + + +class LaserTransformerEncoder(TransformerEncoder): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def forward(self, src_tokens, *args, **kwargs): + encoder_out = super().forward(src_tokens, *args, **kwargs) + + x = encoder_out["encoder_out"][0] # T x B x C + padding_mask = src_tokens.eq(self.padding_idx).t().unsqueeze(-1) + + if padding_mask.any(): + x = x.float().masked_fill_(padding_mask, float("-inf")).type_as(x) + + # Build the sentence embedding by max-pooling over the encoder outputs + sentemb = x.max(dim=0)[0] + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `foward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + return {"sentemb": [sentemb]} # B x C + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Same as the one in transformer.py, with new_sentemb + """ + if len(encoder_out["sentemb"]) == 0: + new_sentemb = [] + else: + new_sentemb = [encoder_out["sentemb"][0].index_select(0, new_order)] + + return { + "sentemb": new_sentemb, # B x C + } + + +class LaserTransformerDecoder(TransformerDecoder): + def __init__(self, args, dictionary, *kargs, **kwargs): + self.num_langs = kwargs.get("num_langs", 1) + self.lang_embed_dim = kwargs.get("lang_embed_dim", 0) + kwargs.pop("num_langs", None) + kwargs.pop("lang_embed_dim", None) + + super().__init__(args, dictionary, *kargs, **kwargs, no_encoder_attn=True) + + if self.lang_embed_dim == 0: + self.embed_lang = None + else: + self.embed_lang = nn.Embedding(self.num_langs, self.lang_embed_dim) + nn.init.uniform_(self.embed_lang.weight, -0.1, 0.1) + + if self.output_projection is not None: + laser_output_embed_dim = ( + self.output_embed_dim + self.lang_embed_dim + args.encoder_embed_dim + ) + self.output_projection = nn.Linear( + laser_output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, + mean=0, + std=laser_output_embed_dim ** -0.5, + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + decoder_embed_dim = args.decoder_embed_dim + args.decoder_embed_dim = ( + decoder_embed_dim + self.lang_embed_dim + args.encoder_embed_dim + ) + res = TransformerDecoderLayer(args, no_encoder_attn=True) + args.decoder_embed_dim = decoder_embed_dim + + return res + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + lang_id: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + # embed positions + positions = ( + self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + if self.embed_positions is not None + else None + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + bsz, seqlen = prev_output_tokens.size() + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + if self.embed_lang is not None: + lang_ids = prev_output_tokens.data.new_full((bsz,), lang_id) + langemb = self.embed_lang(lang_ids) + langemb = langemb.unsqueeze(0) + repeat_vals = [x.shape[0] // langemb.shape[0]] + [-1] * ( + len(langemb.shape) - 1 + ) + x = torch.cat((x, langemb.expand(*repeat_vals)), dim=-1) + + sentemb = encoder_out["sentemb"][0] + sentemb = sentemb.unsqueeze(0) + + repeat_vals = [x.shape[0] // sentemb.shape[0]] + [-1] * (len(sentemb.shape) - 1) + x = torch.cat((x, sentemb.expand(*repeat_vals)), dim=-1) + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + None, + None, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + lang_id: Optional[int] = None, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + assert lang_id is not None + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + lang_id=lang_id, + ) + if not features_only: + x = self.output_layer(x) + return x, extra + + +@register_model_architecture("laser_transformer", "laser_transformer") +def base_laser_transformer_architecture(args): + base_architecture(args) + args.decoder_lang_embed_dim = getattr(args, "decoder_lang_embed_dim", 0) diff --git a/SpeechT5/fairseq/examples/laser/laser_src/multitask_data_utils.py b/SpeechT5/fairseq/examples/laser/laser_src/multitask_data_utils.py new file mode 100644 index 0000000..b05caea --- /dev/null +++ b/SpeechT5/fairseq/examples/laser/laser_src/multitask_data_utils.py @@ -0,0 +1,143 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections import OrderedDict + +import numpy as np + +from fairseq.data import BaseWrapperDataset, FairseqDataset, iterators + + +class MultiItr(object): + def __init__(self, itr): + self.itr = itr + self._counts = [0 for x in itr] + + def __len__(self): + return sum(len(itr) for itr in self.itr) + + def __iter__(self): + return self + + def __next__(self): + ratios = [count / len(itr) for count, itr in zip(self._counts, self.itr)] + idx = ratios.index(min(ratios)) + self._counts[idx] += 1 + return next(self.itr[idx]) + + +class MultidatasetEpochBatchIterator(iterators.EpochBatchIterating): + """A wrapper around multiple epoch batch iterators.""" + + def __init__( + self, + dataset, + batch_sampler, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + ): + + assert isinstance(dataset, OrderedDict) + assert len(dataset) + assert isinstance(dataset[next(iter(dataset))], FairseqDataset) + + self.iterators = [] + + self.epoch = epoch + for key, dt in dataset.items(): + epoch_iter = iterators.EpochBatchIterator( + dataset=dt, + collate_fn=dt.collater, + batch_sampler=batch_sampler[key], + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=0, + epoch=epoch, + ) + self.iterators.append(epoch_iter) + + def __len__(self): + return sum(len(itr) for itr in self.iterators) + + def next_epoch_itr(self, shuffle=True, fix_batches_to_gpus=False): + # `self.epoch += 1` should be handled by underlying `EpochBatchIterator`s. + return MultiItr( + [ + itr.next_epoch_itr( + shuffle=shuffle, fix_batches_to_gpus=fix_batches_to_gpus + ) + for itr in self.iterators + ] + ) + + def end_of_epoch(self): + return all(itr.end_of_epoch() for itr in self.iterators) + + @property + def next_epoch_idx(self): + """Return the epoch index after *next_epoch_itr* is called.""" + + epochs = [itr.next_epoch_idx for itr in self.iterators] + self.epoch = epochs[0] + assert all(epoch == self.epoch for epoch in epochs) + + return self.epoch + + @property + def iterations_in_epoch(self): + return sum(itr.iterations_in_epoch for itr in self.iterators) + + def state_dict(self): + return { + "iterators": [it.state_dict() for it in self.iterators], + "epoch": self.epoch, + } + + def load_state_dict(self, state_dict): + self.epoch = state_dict["epoch"] + for it, d in zip(self.iterators, state_dict["iterators"]): + it.load_state_dict(d) + + +class MultitaskDatasetWrapper(BaseWrapperDataset): + """A wrapper for a multitask dataset.""" + + def __init__(self, dataset, target_language_id, sample=1.0, name=""): + super().__init__(dataset) + self.target_language_id = target_language_id + self.sample = sample + self.name = name + + def collater(self, *args, **kwargs): + ans = self.dataset.collater(*args, **kwargs) + if "net_input" in ans: + ans["net_input"]["target_language_id"] = self.target_language_id + ans["net_input"]["dataset_name"] = self.name + return ans + + def num_tokens(self, *args, **kwargs): + return self.dataset.num_tokens(*args, **kwargs) + + def ordered_indices(self, *args, **kwargs): + indices = self.dataset.ordered_indices(*args, **kwargs) + # Hacky solution for sampling + size = int(self.sample * indices.shape[0]) + + return indices.take(np.sort(np.random.permutation(indices.shape[0])[:size])) + + def size(self, index: int): + return self.dataset.size(index) + + @property + def supports_prefetch(self): + """Whether this dataset supports prefetching.""" + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + return self.dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/examples/latent_depth/README.md b/SpeechT5/fairseq/examples/latent_depth/README.md new file mode 100644 index 0000000..7774c33 --- /dev/null +++ b/SpeechT5/fairseq/examples/latent_depth/README.md @@ -0,0 +1,77 @@ +# Deep Transformers with Latent Depth (Li et al., 2020) + +[https://arxiv.org/abs/2009.13102](https://arxiv.org/abs/2009.13102). + +## Introduction + +We present a probabilistic framework to automatically learn which layer(s) to use by learning the posterior distributions of layer selection. As an extension of this framework, we propose a novel method to train one shared Transformer network for multilingual machine translation with different layer selection posteriors for each language pair. + +## Training a multilingual model with latent depth + +Below is an example of training with latent depth in decoder for one-to-many (O2M) related languages. We use the same preprocessed (numberized and binarized) TED8 dataset as in [Balancing Training for Multilingual Neural Machine Translation (Wang et al., 2020)](https://github.com/cindyxinyiwang/multiDDS), which could be generated by [the script](https://github.com/cindyxinyiwang/multiDDS/blob/multiDDS/util_scripts/prepare_multilingual_data.sh) the author provided. +```bash +lang_pairs_str="eng-aze,eng-bel,eng-ces,eng-glg,eng-por,eng-rus,eng-slk,eng-tur" +databin_dir= + +fairseq-train ${databin_dir} \ + --user-dir examples/latent_depth/latent_depth_src \ + --lang-pairs "${lang_pairs_str}" \ + --arch multilingual_transformer_iwslt_de_en \ + --task multilingual_translation_latent_depth \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --share-encoders \ + --share-decoders \ + --decoder-langtok \ + --share-decoder-input-output-embed \ + --dropout 0.3 --attention-dropout 0.3 \ + --optimizer adam --adam-eps 1e-06 --adam-betas '(0.9, 0.98)' \ + --lr-scheduler inverse_sqrt --stop-min-lr 1e-9 --warmup-init-lr 1e-7 --warmup-updates 8000 \ + --max-tokens 4096 --update-freq 1 \ + --lr 0.0015 \ + --clip-norm 1.0 \ + --seed 2 \ + --ddp-backend=legacy_ddp \ + --encoder-layers 12 \ + --decoder-layers 24 \ + --decoder-latent-layer \ + --sparsity-weight 0.1 \ + --anneal-updates 5000 \ + --soft-update 500 \ + --target-layers 12 \ + --share-weight 0.1 +``` +## Inference command + +```bash +lang_pairs_str="eng-aze,eng-bel,eng-ces,eng-glg,eng-por,eng-rus,eng-slk,eng-tur" +databin_dir= +model_path= +src_lang= +tgt_lang= +gen_data= + +fairseq-generate ${databin_dir} \ + --path ${model_path} \ + --task multilingual_translation_latent_depth \ + --decoder-latent-layer \ + --lang-pairs "${lang_pairs_str}" \ + -s ${src_lang} -t ${tgt_lang} \ + --gen-subset $gen_data \ + --scoring sacrebleu \ + --remove-bpe 'sentencepiece' \ + --lenpen 1.0 \ + --beam 5 \ + --decoder-langtok \ + --max-tokens 4096 +``` + + +## Citation +```bibtex +@article{li2020deep, + title={Deep Transformers with Latent Depth}, + author={Li, Xian and Stickland, Asa Cooper and Tang, Yuqing and Kong, Xiang}, + journal={arXiv preprint arXiv:2009.13102}, + year={2020} +} +``` diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/__init__.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/__init__.py new file mode 100644 index 0000000..c5fa760 --- /dev/null +++ b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import multilingual_translation_latent_depth # noqa +from .loss import latent_depth # noqa +from .models import latent_multilingual_transformer # noqa +from .modules import latent_layers # noqa diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/loss/__init__.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/loss/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/loss/latent_depth.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/loss/latent_depth.py new file mode 100644 index 0000000..a3b9535 --- /dev/null +++ b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/loss/latent_depth.py @@ -0,0 +1,99 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +from torch.nn.modules.loss import _Loss + + +class LatentLayersKLLoss(_Loss): + def __init__(self, args): + super().__init__() + self.args = args + + def forward(self, layer_samples, lang_idx, update_num, sample_size): + prior = self.args.prior + samples = layer_samples[lang_idx] + eps = 1e-7 + if prior == "uniform": + # uniform prior + kl_loss = (samples * (torch.log(samples + eps) - math.log(0.5))).sum(-1) + elif prior == "agged_posterior": + # aggregated posterior + y_t = torch.stack([x.detach() for x in layer_samples], dim=0) + agged_q = torch.sum(y_t, dim=0) + row_norm = agged_q.sum(-1) + normed_agg_q = agged_q / row_norm + kl_loss = ( + samples * (torch.log(samples + eps) - torch.log(normed_agg_q + eps)) + ).sum(-1) + else: + raise NotImplementedError("The specified prior is not implemented.") + + # normalized by number of layers + kl_loss /= layer_samples[0].size()[0] + kl_weight = min( + self.args.sparsity_weight, + (update_num - self.args.soft_update) + * self.args.sparsity_weight + / self.args.anneal_updates, + ) + kl_loss *= kl_weight * sample_size + return kl_loss + + +class LatentLayersSparsityLoss(_Loss): + def __init__(self, args): + super().__init__() + self.args = args + + def is_valid(self, update_num): + if self.args.target_layers <= 0: + return False + return update_num > (self.args.soft_update + self.args.anneal_updates) + + def forward(self, layer_samples_list, update_num, sample_size): + batch_loss = 0 + share_loss = 0 + global_sparsity_loss = 0 + layer_samples = torch.stack(layer_samples_list, dim=0) + if ( + self.args.target_layers > 0 or self.args.share_weight > 0 + ) and update_num > (self.args.soft_update + self.args.anneal_updates): + # anneal sparsity weight + if update_num < (self.args.anneal_updates + self.args.soft_update): + weight_anneal = 0 + elif update_num < (2 * self.args.anneal_updates + self.args.soft_update): + weight_anneal = ( + (update_num - self.args.soft_update - self.args.anneal_updates) + * self.args.share_weight + / self.args.anneal_updates + ) + else: + weight_anneal = 1 + # compute ratio among languages + layer_utilization = torch.sum(layer_samples, dim=0) + layer_utilization /= layer_samples.size()[0] + if self.args.share_weight > 0: + # encouraging sharing across languages + share_loss = sum( + -1.0 * v * math.log(v) for v in layer_utilization if v > 0 + ) + batch_loss += ( + weight_anneal * self.args.share_weight * sample_size * share_loss + ) + if self.args.target_layers > 0: + # computed expected number of layers selected + expeted_layers = sum(layer_utilization) + # compute l2 loss wrt target number of layers + global_sparsity_loss = (expeted_layers - self.args.target_layers) ** 2 + batch_loss += ( + weight_anneal + * self.args.share_weight + * sample_size + * global_sparsity_loss + ) + return batch_loss diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/__init__.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_multilingual_transformer.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_multilingual_transformer.py new file mode 100644 index 0000000..12b7e67 --- /dev/null +++ b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_multilingual_transformer.py @@ -0,0 +1,75 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.models import register_model, register_model_architecture +from fairseq.models.multilingual_transformer import MultilingualTransformerModel +from fairseq.models.transformer import ( + TransformerDecoder, + TransformerEncoder, + base_architecture, +) + +from .latent_transformer import LatentTransformerDecoder, LatentTransformerEncoder + + +@register_model("latent_multilingual_transformer") +class LatentMultilingualTransformerModel(MultilingualTransformerModel): + """A variant of standard multilingual Transformer models which encoder and/or + decoders supports latent depth, as is in "Deep Transformer with Latent Depth" + (https://arxiv.org/abs/2009.13102). + """ + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + MultilingualTransformerModel.add_args(parser) + parser.add_argument( + '--soft-select', + action='store_true', + help='use soft samples in training an inference', + ) + parser.add_argument( + '--sampling-tau', + type=float, + default=5., + help='sampling temperature', + ) + + @classmethod + def _get_module_class(cls, is_encoder, args, lang_dict, embed_tokens, langs): + if is_encoder: + if hasattr(args, "encoder_latent_layer") and args.encoder_latent_layer: + return LatentTransformerEncoder( + args, lang_dict, embed_tokens, num_logits=len(langs) + ) + else: + return TransformerEncoder(args, lang_dict, embed_tokens) + else: + if hasattr(args, "decoder_latent_layer") and args.decoder_latent_layer: + return LatentTransformerDecoder( + args, lang_dict, embed_tokens, num_logits=len(langs) + ) + else: + return TransformerDecoder(args, lang_dict, embed_tokens) + + +@register_model_architecture( + "latent_multilingual_transformer", "latent_multilingual_transformer" +) +def latent_multilingual_architecture(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 1024) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4) + args.encoder_layers = getattr(args, "encoder_layers", 12) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 1024) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4) + args.decoder_layers = getattr(args, "decoder_layers", 24) + args.share_encoders = getattr(args, "share_encoders", True) + args.share_decoders = getattr(args, "share_decoders", True) + args.share_encoder_embeddings = getattr(args, "share_encoder_embeddings", True) + args.share_decoder_embeddings = getattr(args, "share_decoder_embeddings", True) + + base_architecture(args) diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_transformer.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_transformer.py new file mode 100644 index 0000000..6a82530 --- /dev/null +++ b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/models/latent_transformer.py @@ -0,0 +1,156 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Any, Dict, Optional + +import torch.nn as nn +from fairseq.models.fairseq_encoder import EncoderOut +from fairseq.models.transformer import TransformerDecoder, TransformerEncoder +from fairseq.modules import TransformerDecoderLayer, TransformerEncoderLayer +from torch import Tensor + +from ..modules.latent_layers import LayerSelect + + +class LatentTransformerEncoder(TransformerEncoder): + """Latent depth (https://arxiv.org/abs/2009.13102) implemented in + TransformerEncoder. + """ + + def __init__(self, args, dictionary, embed_tokens, num_logits=1): + self.num_logits = num_logits + self.num_layers = args.encoder_layers + super().__init__(args, dictionary, embed_tokens) + self.layer_select = LayerSelect( + num_layers=self.num_layers, + num_logits=self.num_logits, + soft_select=getattr(args, "soft_select", False), + sampling_tau=getattr(args, "sampling_tau", 5.), + ) + self.lang_idx = None + self.layers = nn.ModuleList( + [self._build_encoder_layer(args, idx) for idx in range(args.encoder_layers)] + ) + + def set_lang_idx(self, lang_idx): + self.lang_idx = lang_idx + + def _build_encoder_layer(self, args, idx=None): + return LatentTransformerEncoderLayer(args, idx, layer_select=self.layer_select) + + def forward(self, src_tokens, src_lengths, return_all_hiddens: bool = False): + self.layer_select.sample(self.lang_idx) + return super().forward(src_tokens, src_lengths, return_all_hiddens) + + +class LatentTransformerEncoderLayer(TransformerEncoderLayer): + """Encoder layer with each (non_residual) block weighted by samples of Bernouli + or Gumbel Signmoid samples. + + Args: + args (argparse.Namespace): parsed command-line arguments from standard + TransformerEncoderLayer. + idx (int): layer index (used to retrieve samples). + layer_select (LayerSelect, optional): instance of LayerSelect module with logits + parameters and sampling method. + """ + + def __init__(self, args, idx, layer_select=None): + super().__init__(args) + self.idx = idx + self.layer_select = layer_select + + def residual_connection(self, x, residual): + return residual + x * self.layer_select(self.idx) + + +class LatentTransformerDecoder(TransformerDecoder): + """Latent depth (https://arxiv.org/abs/2009.13102) implemented in + TransformerDecoder. + """ + + def __init__( + self, args, dictionary, embed_tokens, no_encoder_attn=False, num_logits=1 + ): + self.num_logits = num_logits + self.num_layers = args.decoder_layers + super().__init__( + args, dictionary, embed_tokens, no_encoder_attn=no_encoder_attn + ) + self.layer_select = LayerSelect( + num_layers=self.num_layers, + num_logits=self.num_logits, + soft_select=getattr(args, "soft_select", False), + sampling_tau=getattr(args, "sampling_tau", 5.), + ) + self.lang_idx = None + self.layers = nn.ModuleList( + [ + self._build_decoder_layer(args, no_encoder_attn, idx) + for idx in range(args.decoder_layers) + ] + ) + + def set_lang_idx(self, lang_idx): + self.lang_idx = lang_idx + + def _build_decoder_layer(self, args, no_encoder_attn=False, idx=None): + return LatentTransformerDecoderLayer( + args, idx, layer_select=self.layer_select, no_encoder_attn=no_encoder_attn + ) + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[EncoderOut] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + self.layer_select.sample(self.lang_idx) + return super().forward( + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + features_only=features_only, + alignment_layer=alignment_layer, + src_lengths=src_lengths, + return_all_hiddens=return_all_hiddens, + ) + + +class LatentTransformerDecoderLayer(TransformerDecoderLayer): + """Decoder layer with each (non_residual) block weighted by samples of Bernouli + or Gumbel Signmoid samples. + + Args: + args (argparse.Namespace): parsed command-line arguments from standard + TransformerDecoderLayer. + idx (int): layer index (used to retrieve samples). + layer_select (LayerSelect, optional): instance of LayerSelect module with logits + parameters and sampling method. + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + + """ + + def __init__( + self, + args, + idx, + layer_select=None, + no_encoder_attn=False, + add_bias_kv=False, + add_zero_attn=False, + ): + super().__init__(args, no_encoder_attn, add_bias_kv, add_zero_attn) + self.idx = idx + self.layer_select = layer_select + + def residual_connection(self, x, residual): + return residual + x * self.layer_select(self.idx) diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/modules/__init__.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/modules/latent_layers.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/modules/latent_layers.py new file mode 100644 index 0000000..2be05d5 --- /dev/null +++ b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/modules/latent_layers.py @@ -0,0 +1,75 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn + + +class LayerSelect(nn.Module): + """Compute samples (from a Gumbel-Sigmoid distribution) which is used as + either (soft) weighting or (hard) selection of residual connection. + https://arxiv.org/abs/2009.13102 + """ + def __init__(self, num_layers, num_logits, soft_select=False, sampling_tau=5.): + super(LayerSelect, self).__init__() + self.layer_logits = torch.nn.Parameter( + torch.Tensor(num_logits, num_layers), + requires_grad=True, + ) + self.hard_select = not soft_select + self.tau = sampling_tau + self.detach_grad = False + self.layer_samples = [None] * num_logits + + def sample(self, logit_idx): + """To leverage the efficiency of distributed training, samples for all + layers are computed at once for each logit_idx. Logits are parameters + learnt independent of each other. + + Args: + logit_idx: The index of logit parameters used for sampling. + """ + assert logit_idx is not None + self.samples = self._gumbel_sigmoid( + self.layer_logits[logit_idx, :].detach() + if self.detach_grad + else self.layer_logits[logit_idx, :], + dim=-1, + tau=self.tau, + hard=self.hard_select, + ) + self.layer_samples[logit_idx] = self.samples + + def forward(self, i): + sample = self.samples[i] + return sample + + def _gumbel_sigmoid( + self, logits, tau=1, hard=False, eps=1e-10, dim=-1, threshold=0.5 + ): + # ~Gumbel(0,1) + gumbels1 = ( + -torch.empty_like(logits, memory_format=torch.legacy_contiguous_format) + .exponential_() + .log() + ) + gumbels2 = ( + -torch.empty_like(logits, memory_format=torch.legacy_contiguous_format) + .exponential_() + .log() + ) + # Difference of two gumbels because we apply a sigmoid + gumbels1 = (logits + gumbels1 - gumbels2) / tau + y_soft = gumbels1.sigmoid() + if hard: + # Straight through. + y_hard = torch.zeros_like( + logits, memory_format=torch.legacy_contiguous_format + ).masked_fill(y_soft > threshold, 1.0) + ret = y_hard - y_soft.detach() + y_soft + else: + # Reparametrization trick. + ret = y_soft + return ret diff --git a/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/multilingual_translation_latent_depth.py b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/multilingual_translation_latent_depth.py new file mode 100644 index 0000000..b5cd51a --- /dev/null +++ b/SpeechT5/fairseq/examples/latent_depth/latent_depth_src/multilingual_translation_latent_depth.py @@ -0,0 +1,194 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.tasks import register_task +from fairseq.tasks.multilingual_translation import MultilingualTranslationTask + +from .loss.latent_depth import LatentLayersKLLoss, LatentLayersSparsityLoss + + +@register_task("multilingual_translation_latent_depth") +class MultilingualTranslationTaskLatentDepth(MultilingualTranslationTask): + """A task for multiple translation with latent depth. + + See `"Deep Transformer with Latent Depth" + (Li et al., 2020) `_. + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + # fmt: off + MultilingualTranslationTask.add_args(parser) + parser.add_argument('--encoder-latent-layer', action='store_true', help='latent layer selection in encoder') + parser.add_argument('--decoder-latent-layer', action='store_true', help='latent layer selection in decoder') + parser.add_argument('--target-layers', default=-1, type=int, + help='number of effective layers to learn; -1 means no constraint') + parser.add_argument('--sparsity-weight', default=0.0, type=float, + help='weight for sparsity loss') + parser.add_argument('--share-weight', default=0.0, type=float, + help='weight for sharing loss') + parser.add_argument('--soft-update', default=1, type=int, + help='number of updates with soft sampling') + parser.add_argument('--anneal-updates', default=1, type=int, + help='number of updates to anneal the KL loss weight') + parser.add_argument('--prior', default="uniform", type=str, + help='prior used for computing KL loss') + # fmt: on + + def __init__(self, args, dicts, training): + super().__init__(args, dicts, training) + self.src_langs, self.tgt_langs = zip( + *[(lang.split("-")[0], lang.split("-")[1]) for lang in args.lang_pairs] + ) + if self.training and self.encoder_latent_layer: + assert self.args.share_encoders + if self.training and self.decoder_latent_layer: + assert self.args.share_decoders + if training or self.encoder_latent_layer or self.decoder_latent_layer: + self.lang_pairs = args.lang_pairs + else: + self.lang_pairs = ["{}-{}".format(args.source_lang, args.target_lang)] + self.eval_lang_pairs = self.lang_pairs + self.model_lang_pairs = self.lang_pairs + if self.training and (self.encoder_latent_layer or self.decoder_latent_layer): + self.kl_loss = LatentLayersKLLoss(self.args) + self.sparsity_loss = LatentLayersSparsityLoss(self.args) + + def _per_lang_pair_train_loss( + self, lang_pair, model, update_num, criterion, sample, optimizer, ignore_grad + ): + src, tgt = lang_pair.split("-") + if self.encoder_latent_layer: + src_lang_idx = self.src_lang_idx_dict[src] + model.models[lang_pair].encoder.set_lang_idx(src_lang_idx) + model.models[lang_pair].encoder.layer_select.hard_select = ( + update_num > self.args.soft_update + ) + if self.decoder_latent_layer: + tgt_lang_idx = self.tgt_lang_idx_dict[tgt] + model.models[lang_pair].decoder.set_lang_idx(tgt_lang_idx) + model.models[lang_pair].decoder.layer_select.hard_select = ( + update_num > self.args.soft_update + ) + + loss, sample_size, logging_output = criterion( + model.models[lang_pair], sample[lang_pair] + ) + if self.encoder_latent_layer: + none_samples = sum( + 1 if x is None else 0 + for x in model.models[lang_pair].encoder.layer_select.layer_samples + ) + if none_samples == 0 or self.args.prior != "agged_posterior": + loss += self.kl_loss( + model.models[lang_pair].encoder.layer_select.layer_samples, + src_lang_idx, + update_num, + sample_size, + ) + if self.decoder_latent_layer: + none_samples = sum( + 1 if x is None else 0 + for x in model.models[lang_pair].decoder.layer_select.layer_samples + ) + if none_samples == 0 or self.args.prior != "agged_posterior": + loss += self.kl_loss( + model.models[lang_pair].decoder.layer_select.layer_samples, + tgt_lang_idx, + update_num, + sample_size, + ) + if ignore_grad: + loss *= 0 + + if hasattr(self, "sparsity_loss") and self.sparsity_loss.is_valid(update_num): + # need to retain the graph if sparsity loss needs to be added + loss.backward(retain_graph=True) + else: + optimizer.backward(loss) + + return loss, sample_size, logging_output + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + agg_loss, agg_sample_size, agg_logging_output = super().train_step( + sample, model, criterion, optimizer, update_num, ignore_grad + ) + # compute auxiliary loss from layere sparsity, based on all samples from all languages + if hasattr(self, "sparsity_loss") and self.sparsity_loss.is_valid(update_num): + sparsity_loss = 0 + if self.encoder_latent_layer: + sparsity_loss += self.sparsity_loss( + next( + iter(model.models.values()) + ).encoder.layer_select.layer_samples, + update_num, + agg_sample_size, + ) + if self.decoder_latent_layer: + sparsity_loss += self.sparsity_loss( + next( + iter(model.models.values()) + ).decoder.layer_select.layer_samples, + update_num, + agg_sample_size, + ) + if sparsity_loss > 0: + optimizer.backward(sparsity_loss) + return agg_loss, agg_sample_size, agg_logging_output + + def _per_lang_pair_valid_loss(self, lang_pair, model, criterion, sample): + src, tgt = lang_pair.split("-") + if self.encoder_latent_layer: + src_lang_idx = self.src_lang_idx_dict[src] + model.models[lang_pair].encoder.set_lang_idx(src_lang_idx) + if self.decoder_latent_layer: + tgt_lang_idx = self.tgt_lang_idx_dict[tgt] + model.models[lang_pair].decoder.set_lang_idx(tgt_lang_idx) + loss, sample_size, logging_output = criterion( + model.models[lang_pair], sample[lang_pair] + ) + return loss, sample_size, logging_output + + def inference_step( + self, generator, models, sample, prefix_tokens=None, constraints=None + ): + if self.encoder_latent_layer or self.decoder_latent_layer: + for model in models: + if self.encoder_latent_layer: + assert model.encoder.layer_select is not None + src_lang_idx = self.src_lang_idx_dict[self.args.source_lang] + model.encoder.set_lang_idx(src_lang_idx) + if self.decoder_latent_layer: + assert model.decoder.layer_select is not None + tgt_lang_idx = self.tgt_lang_idx_dict[self.args.target_lang] + model.decoder.set_lang_idx(tgt_lang_idx) + return super().inference_step( + generator, models, sample, prefix_tokens, constraints + ) + + @property + def encoder_latent_layer(self): + return ( + hasattr(self.args, "encoder_latent_layer") + and self.args.encoder_latent_layer + ) + + @property + def decoder_latent_layer(self): + return ( + hasattr(self.args, "decoder_latent_layer") + and self.args.decoder_latent_layer + ) + + @property + def src_lang_idx_dict(self): + return {lang: lang_idx for lang_idx, lang in enumerate(self.src_langs)} + + @property + def tgt_lang_idx_dict(self): + return {lang: lang_idx for lang_idx, lang in enumerate(self.tgt_langs)} diff --git a/SpeechT5/fairseq/examples/layerdrop/README.md b/SpeechT5/fairseq/examples/layerdrop/README.md new file mode 100644 index 0000000..394e710 --- /dev/null +++ b/SpeechT5/fairseq/examples/layerdrop/README.md @@ -0,0 +1,154 @@ +# Reducing Transformer Depth on Demand with Structured Dropout (Fan et al., 2019) +This page contains information for how to train models with LayerDrop, based on this [paper](https://arxiv.org/abs/1909.11556). + +## Citation: +If you found this technique useful, please cite our paper: +```bibtex +@article{fan2019reducing, + title={Reducing Transformer Depth on Demand with Structured Dropout}, + author={Fan, Angela and Grave, Edouard and Joulin, Armand}, + journal={arXiv preprint arXiv:1909.11556}, + year={2019} +} +``` + +## Pre-trained models + +Model | Description | Download +---|---|--- +`layerdrop_wmt_en_de_12_6` | Transformer + LayerDrop 0.2 trained on WMT16 en-de with 12 encoder and 6 decoder layers | [layerdrop_wmt_en_de_12_6.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/layerdrop_wmt_en_de_12_6.tar.gz) +`roberta_layerdrop.base` | RoBERTa Base + LayerDrop 0.2 | [roberta_layerdrop.base.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta_layerdrop.base.qnli.tar.gz) +`roberta_layerdrop.large` | RoBERTa Large + LayerDrop 0.2 | [roberta_layerdrop.large.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta_layerdrop.large.tar.gz) +`roberta_layerdrop.large.mnli` | `roberta_layerdrop.large` finetuned on [MNLI](http://www.nyu.edu/projects/bowman/multinli) | [roberta_layerdrop.large.mnli.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta_layerdrop.large.mnli.tar.gz) +`roberta_layerdrop.large.qnli` | `roberta_layerdrop.large` finetuned on [QNLI](https://arxiv.org/abs/1804.07461) | [roberta_layerdrop.large.mnli.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta_layerdrop.large.qnli.tar.gz) + + +Evaluate performance of these pre-trained models: +```bash +# Example for Machine Translation +fairseq-generate /path/to/bped/wmt/data --path nmt_checkpoint.pt \ + --beam 8 --lenpen 0.4 \ + --batch-size 64 \ + --remove-bpe \ + --gen-subset test > wmt16_gen.txt +bash scripts/compound_split_bleu.sh wmt16_gen.txt +# prints BLEU4 = 30.17 +``` + +```python +# Example for RoBERTa + LayerDrop finetuned on MNLI: +from fairseq.models.roberta import RobertaModel + +roberta_layerdrop = RobertaModel.from_pretrained( + '/path/to/MNLI/model', + checkpoint_file='mnli_checkpoint.pt', + data_name_or_path='/path/to/MNLI/data/MNLI-bin' +) +label_map = {0: 'contradiction', 2: 'neutral', 1: 'entailment'} +ncorrect, nsamples = 0, 0 +roberta_layerdrop.cuda() +roberta_layerdrop.eval() +with open('/path/to/MNLI/data/dev_matched.tsv') as fin: + fin.readline() + for index, line in enumerate(fin): + tokens = line.strip().split('\t') + sent1, sent2, target = tokens[8], tokens[9], tokens[-1] + tokens = roberta_layerdrop.encode(sent1, sent2) + prediction = roberta_layerdrop.predict('sentence_classification_head', tokens).argmax().item() + prediction_label = label_map[prediction] + ncorrect += int(prediction_label == target) + nsamples += 1 +print('| Accuracy: ', float(ncorrect)/float(nsamples)) +# prints | Accuracy: 0.9026999490575649 + + +# Example for RoBERTa + LayerDrop finetuned on QNLI: +roberta = RobertaModel.from_pretrained( + '/path/to/QNLI/model', + checkpoint_file='qnli_checkpoint.pt', + data_name_or_path='/path/to/QNLI/data/QNLI-bin' +) + +label_fn = lambda label: roberta.task.label_dictionary.string( + [label + roberta.task.target_dictionary.nspecial] +) +ncorrect, nsamples = 0, 0 +roberta.cuda() +roberta.eval() +with open('/path/to/QNLI/data/dev.tsv') as fin: + fin.readline() + for index, line in enumerate(fin): + tokens = line.strip().split('\t') + sent1, sent2, target = tokens[1], tokens[2], tokens[3] + tokens = roberta.encode(sent1, sent2) + prediction = roberta.predict('sentence_classification_head', tokens).argmax().item() + prediction_label = label_fn(prediction) + ncorrect += int(prediction_label == target) + nsamples += 1 +print('| Accuracy: ', float(ncorrect)/float(nsamples)) +# prints | Accuracy: 0.9480139117700896 +``` + + +## Example usage + +To train a model with LayerDrop, add the following flags. We recommend 0.2, a value that worked well in our experiments. For Language Models that are decoder-only, you need only the decoder flag. For RoBERTa, an encoder, you need only the encoder flag. The encoder and decoder LayerDrop values can be set differently. +``` +--encoder-layerdrop 0.2 --decoder-layerdrop 0.2 +``` + +To prune a model that has been trained with LayerDrop, add the following flags followed by a comma separated list of which layers you would like to keep. +``` +--encoder-layers-to-keep 0,2,4,6,8,10,12,14 --decoder-layers-to-keep 0,2,4,6,8,10,12,14 +``` +Setting these flags should print a message such as: +``` +| Pruning model to specified layer configuration +``` +You should also see a smaller number of parameters in the model, for example the 16-Layer Transformer Language Model prints: +``` +num. model params: 246933504 +``` +while a model pruned to 8 Layers prints: +``` +num. model params: 146163712 +``` + +If you would like to pick up training with a model that has been pruned, simply adding these flags is sufficient. If you would like to use a script that only does evaluation (no training), you may need to pass an override command. A specific example would be for language modeling: +```bash +fairseq-eval-lm /path/to/wikitext-103 \ + --path /path/to/model/checkpoint.pt \ + --model-overrides "{'decoder_layers_to_keep':'0,2,4,6,8,10,12,14'}" +``` +This model override command overrides the training parameters and updates the model arguments so that the pruned model is run instead of the full model. + +## Reproduce Paper Results + +Looking to reproduce the results in the paper? + +1. For Translation on WMT16 en-de, we followed this setting [here](https://github.com/pytorch/fairseq/blob/master/examples/scaling_nmt/README.md) +2. To train RoBERTa, we followed this setting [here](https://github.com/pytorch/fairseq/tree/master/examples/roberta) +3. To train Language Models on Wikitext-103, we followed this setting [here](https://github.com/pytorch/fairseq/tree/master/examples/language_model) + + +## Tips + +1. If you would like to train large models with better performance, LayerDrop should be set to a smaller value such as 0.1 or 0.2. Too much LayerDrop will mean the model has too much regularization, so may not reach the best performance. Since LayerDrop adds regularization, you may achieve the best performance by slightly reducing the amount of standard dropout (for example, reduce by 0.1). + +2. If you would like to train large models to be pruned and made smaller, LayerDrop should be set to a larger value such as 0.5 if you want to prune very aggressively (such as removing half the network or more). If you would like to prune fewer layers away, LayerDrop can be set to a smaller value such as 0.2. Our experiments were conducted with low values of LayerDrop (such as 0.1 and 0.2), for reference. + +3. When pruning layers at inference time, it is best to spread out the layers remaining so they are evenly spaced throughout the network. For example, if you want to remove 50% of the network, keeping every other layer is good. + + +## FAQ + +1. How did the sharing layers experiment work? In an appendix (https://openreview.net/pdf?id=SylO2yStDr) we added an experiment on Wikitext-103 language modeling that combined LayerDrop with Weight Sharing. We shared chunks of 2 layers such that every other layer had shared weights. For example, if our network has layers 1 through 6, then layer 1 and 2 are shared, layer 3 and 4 are shared, and layer 5 and 6 are shared. + +2. LayerDrop hasn't been helping in my setting? During training time, LayerDrop can help regularize your network. This is most important if your network is already overfitting - if your network is underfitting, it is possible LayerDrop is adding too much regularization. We recommend using smaller values (such as 0.1 or 0.2) and also decreasing the quantity of standard dropout (for example, reduce by 0.1). + +3. Can you train a model without LayerDrop and finetune with LayerDrop (e.g. for BERT)? In our experiments, we did not see great performance. Models such as RoBERTa have trained for a long time in the pre-training setting, so only finetuning with LayerDrop for a few epochs on a downstream task such as MNLI does not achieve the robustness required for successful pruning. + + +## Having an issue or have a question? + +Please open an issue in this repository with the details of your question. Thanks! diff --git a/SpeechT5/fairseq/examples/linformer/README.md b/SpeechT5/fairseq/examples/linformer/README.md new file mode 100644 index 0000000..f8b36bc --- /dev/null +++ b/SpeechT5/fairseq/examples/linformer/README.md @@ -0,0 +1,22 @@ +# Linformer: Self-Attention with Linear Complexity (Wang et al., 2020) + +This example contains code to train Linformer models as described in our paper +[Linformer: Self-Attention with Linear Complexity](https://arxiv.org/abs/2006.04768). + +## Training a new Linformer RoBERTa model + +You can mostly follow the [RoBERTa pretraining README](/examples/roberta/README.pretraining.md), +updating your training command with `--user-dir examples/linformer/linformer_src --arch linformer_roberta_base`. + +## Citation + +If you use our work, please cite: + +```bibtex +@article{wang2020linformer, + title={Linformer: Self-Attention with Linear Complexity}, + author={Wang, Sinong and Li, Belinda and Khabsa, Madian and Fang, Han and Ma, Hao}, + journal={arXiv preprint arXiv:2006.04768}, + year={2020} +} +``` diff --git a/SpeechT5/fairseq/examples/linformer/linformer_src/__init__.py b/SpeechT5/fairseq/examples/linformer/linformer_src/__init__.py new file mode 100644 index 0000000..1c52f13 --- /dev/null +++ b/SpeechT5/fairseq/examples/linformer/linformer_src/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .models import linformer_roberta # noqa diff --git a/SpeechT5/fairseq/examples/linformer/linformer_src/models/__init__.py b/SpeechT5/fairseq/examples/linformer/linformer_src/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/linformer/linformer_src/models/linformer_roberta.py b/SpeechT5/fairseq/examples/linformer/linformer_src/models/linformer_roberta.py new file mode 100644 index 0000000..18ad44f --- /dev/null +++ b/SpeechT5/fairseq/examples/linformer/linformer_src/models/linformer_roberta.py @@ -0,0 +1,119 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Linformer: Self-Attention with Linear Complexity +""" + +import logging + +import torch +from fairseq import utils +from fairseq.models import register_model, register_model_architecture +from fairseq.models.roberta import ( + init_bert_params, + roberta_base_architecture, + roberta_large_architecture, + RobertaEncoder, + RobertaModel, +) + +from ..modules.linformer_sentence_encoder import LinformerTransformerEncoder + + +logger = logging.getLogger(__name__) + + +@register_model("linformer_roberta") +class LinformerModel(RobertaModel): + @staticmethod + def add_args(parser): + RobertaModel.add_args(parser) + + # add args for Linformer + parser.add_argument( + "--compressed", type=int, help="compressed ratio of sequence length" + ) + parser.add_argument( + "--shared-kv-compressed", + type=int, + help="share compressed matrix between k and v, in each layer", + ) + parser.add_argument( + "--shared-layer-kv-compressed", + type=int, + help="share compressed matrix between k and v and across all layers", + ) + parser.add_argument( + "--freeze-compress", + type=int, + help="freeze the parameters in compressed layer", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present + base_architecture(args) + + if not hasattr(args, "max_positions"): + args.max_positions = args.tokens_per_sample + + encoder = LinformerEncoder(args, task.source_dictionary) + return cls(args, encoder) + + +class LinformerEncoder(RobertaEncoder): + """Linformer encoder.""" + + def __init__(self, args, dictionary): + super().__init__(args, dictionary) + self.register_buffer("version", torch.tensor(2)) + + def build_encoder(self, args, dictionary, embed_tokens): + encoder = LinformerTransformerEncoder(args, dictionary, embed_tokens) + encoder.apply(init_bert_params) + return encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + prefix = name + "." if name != "" else "" + + # some old checkpoints had weight sharing implemented incorrectly + # (note: this was correct in the original paper code) + if utils.item(state_dict.get(f"{prefix}version", torch.tensor(1))) < 2: + state_dict[f"{prefix}version"] = torch.tensor(1) + # check if input embeddings and output embeddings were tied + if not torch.allclose( + state_dict[f"{prefix}sentence_encoder.embed_tokens.weight"], + state_dict[f"{prefix}lm_head.weight"], + ): + # they weren't tied, re-init the LM head without weight sharing + self.lm_head = self.build_lm_head( + embed_dim=self.args.encoder_embed_dim, + output_dim=len(self.dictionary), + activation_fn=self.args.activation_fn, + weight=None, # don't share weights + ) + + +@register_model_architecture("linformer_roberta", "linformer_roberta") +def base_architecture(args): + args.compressed = getattr(args, "compressed", 4) + args.shared_kv_compressed = getattr(args, "shared_kv_compressed", 0) + args.shared_layer_kv_compressed = getattr(args, "shared_layer_kv_compressed", 0) + args.freeze_compress = getattr(args, "freeze_compress", 0) + roberta_base_architecture(args) + + +@register_model_architecture("linformer_roberta", "linformer_roberta_base") +def linformer_roberta_base_architecture(args): + base_architecture(args) + + +@register_model_architecture("linformer_roberta", "linformer_roberta_large") +def linformer_roberta_large_architecture(args): + roberta_large_architecture(args) + base_architecture(args) diff --git a/SpeechT5/fairseq/examples/linformer/linformer_src/modules/__init__.py b/SpeechT5/fairseq/examples/linformer/linformer_src/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder.py b/SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder.py new file mode 100644 index 0000000..44f7989 --- /dev/null +++ b/SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder.py @@ -0,0 +1,54 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch.nn as nn +from fairseq.models.transformer import TransformerEncoder + +from .linformer_sentence_encoder_layer import LinformerTransformerEncoderLayer + + +class LinformerTransformerEncoder(TransformerEncoder): + """ + Implementation for a Bi-directional Linformer based Sentence Encoder used + in BERT/XLM style pre-trained models. + + This first computes the token embedding using the token embedding matrix, + position embeddings (if specified) and segment embeddings + (if specified). After applying the specified number of + LinformerEncoderLayers, it outputs all the internal states of the + encoder as well as the final representation associated with the first + token (usually CLS token). + + Input: + - tokens: B x T matrix representing sentences + - segment_labels: B x T matrix representing segment label for tokens + + Output: + - a tuple of the following: + - a list of internal model states used to compute the + predictions where each tensor has shape T x B x C + - sentence representation associated with first input token + in format B x C. + """ + + def __init__(self, args, dictionary, embed_tokens): + self.compress_layer = None + super().__init__(args, dictionary, embed_tokens) + + def build_encoder_layer(self, args): + if self.args.shared_layer_kv_compressed == 1 and self.compress_layer is None: + compress_layer = nn.Linear( + self.args.max_positions, + self.args.max_positions // self.args.compressed, + ) + # intialize parameters for compressed layer + nn.init.xavier_uniform_(compress_layer.weight, gain=1 / math.sqrt(2)) + if self.args.freeze_compress == 1: + compress_layer.weight.requires_grad = False + self.compress_layer = compress_layer + + return LinformerTransformerEncoderLayer(args, self.compress_layer) diff --git a/SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder_layer.py b/SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder_layer.py new file mode 100644 index 0000000..7e2caa0 --- /dev/null +++ b/SpeechT5/fairseq/examples/linformer/linformer_src/modules/linformer_sentence_encoder_layer.py @@ -0,0 +1,65 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq import utils +from fairseq.modules import TransformerEncoderLayer + +from .multihead_linear_attention import MultiheadLinearAttention + + +class LinformerTransformerEncoderLayer(TransformerEncoderLayer): + """ + Implements a Linformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__(self, args, shared_compress_layer): + # wrap in a list so it's not automatically registered by PyTorch + self.shared_compress_layer = [shared_compress_layer] + + super().__init__(args) + + self.register_buffer("version", torch.tensor(2)) + + def build_self_attention(self, embed_dim, args): + return MultiheadLinearAttention( + embed_dim, + args.encoder_attention_heads, + dropout=args.dropout, + self_attention=True, + q_noise=args.quant_noise_pq, + qn_block_size=args.quant_noise_pq_block_size, + compressed=args.compressed, + max_seq_len=args.max_positions, + shared_kv_compressed=args.shared_kv_compressed, + shared_compress_layer=self.shared_compress_layer[0], + freeze_compress=args.freeze_compress, + ) + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + prefix = name + "." if name != "" else "" + + # some old checkpoints had weight sharing implemented incorrectly + # (note: this was correct in the original paper code) + if utils.item(state_dict.get(f"{prefix}version", torch.tensor(1))) < 2: + state_dict[f"{prefix}version"] = torch.tensor(1) + # check compression layer sharing + if f"{prefix}shared_compress_layer.weight" in state_dict: + # reinitialize block without sharing compression layer to match + # old behavior + self.shared_compress_layer = [ + torch.nn.Linear( + self.shared_compress_layer[0].weight.size(1), + self.shared_compress_layer[0].weight.size(0), + ) + ] + self.self_attn = self.build_self_attention(self.embed_dim, self.args) + # delete shared_compress_layer, since it's already copied to + # self_attn.compress_k.weight + del state_dict[f"{prefix}shared_compress_layer.weight"] + if f"{prefix}shared_compress_layer.bias" in state_dict: + del state_dict[f"{prefix}shared_compress_layer.bias"] diff --git a/SpeechT5/fairseq/examples/linformer/linformer_src/modules/multihead_linear_attention.py b/SpeechT5/fairseq/examples/linformer/linformer_src/modules/multihead_linear_attention.py new file mode 100644 index 0000000..6be1007 --- /dev/null +++ b/SpeechT5/fairseq/examples/linformer/linformer_src/modules/multihead_linear_attention.py @@ -0,0 +1,481 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.quant_noise import quant_noise +from torch import Tensor, nn +from torch.nn import Parameter + + +@with_incremental_state +class MultiheadLinearAttention(nn.Module): + """Multi-headed linformer attention. + + Projects the key and values down to the compressed dimension, before computing self-attention. + + See "Linformer: Self-Attention with Linear Complexity" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + compressed=1, + max_seq_len=256, + shared_kv_compressed=0, + shared_compress_layer=None, + freeze_compress=0, + ): + super().__init__() + self.embed_dim = embed_dim + self.kdim = kdim if kdim is not None else embed_dim + self.vdim = vdim if vdim is not None else embed_dim + self.qkv_same_dim = self.kdim == embed_dim and self.vdim == embed_dim + + self.num_heads = num_heads + self.dropout = dropout + self.head_dim = embed_dim // num_heads + assert ( + self.head_dim * num_heads == self.embed_dim + ), "embed_dim must be divisible by num_heads" + self.scaling = self.head_dim ** -0.5 + + self.self_attention = self_attention + self.encoder_decoder_attention = encoder_decoder_attention + + assert not self.self_attention or self.qkv_same_dim, ( + "Self-attention requires query, key and " "value to be of the same size" + ) + + self.k_proj = quant_noise( + nn.Linear(self.kdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.v_proj = quant_noise( + nn.Linear(self.vdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.q_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + # used for compress sequence to subsequence + if shared_compress_layer is None: + self.compress_seq_len = max_seq_len // compressed + self.compress_k = nn.Linear(max_seq_len, self.compress_seq_len, bias=False) + if shared_kv_compressed == 0: + self.compress_v = nn.Linear( + max_seq_len, self.compress_seq_len, bias=False + ) + self.layerwise_sharing = False + else: + self.compress_k = shared_compress_layer + if shared_kv_compressed == 0: + self.compress_v = shared_compress_layer + self.layerwise_sharing = True + self.shared_kv_compressed = shared_kv_compressed + + self.out_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + if add_bias_kv: + self.bias_k = Parameter(torch.Tensor(1, 1, embed_dim)) + self.bias_v = Parameter(torch.Tensor(1, 1, embed_dim)) + else: + self.bias_k = self.bias_v = None + + self.add_zero_attn = add_zero_attn + + self.reset_parameters() + + if freeze_compress == 1: + self.compress_k.weight.requires_grad = False + if shared_kv_compressed == 0: + self.compress_v.weight.requires_grad = False + + self.onnx_trace = False + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def reset_parameters(self): + if self.qkv_same_dim: + # Empirically observed the convergence to be much better with + # the scaled initialization + nn.init.xavier_uniform_(self.k_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.v_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.q_proj.weight, gain=1 / math.sqrt(2)) + if ( + not self.layerwise_sharing + ): # otherwise, we already initialize the parameters + nn.init.xavier_uniform_(self.compress_k.weight, gain=1 / math.sqrt(2)) + if self.shared_kv_compressed == 0: + nn.init.xavier_uniform_( + self.compress_v.weight, gain=1 / math.sqrt(2) + ) + else: + nn.init.xavier_uniform_(self.k_proj.weight) + nn.init.xavier_uniform_(self.v_proj.weight) + nn.init.xavier_uniform_(self.q_proj.weight) + if ( + not self.layerwise_sharing + ): # otherwise, we already initialize the parameters + nn.init.xavier_uniform_(self.compress_k.weight) + if self.shared_kv_compressed == 0: + nn.init.xavier_uniform_(self.compress_v.weight) + + nn.init.xavier_uniform_(self.out_proj.weight) + if self.out_proj.bias is not None: + nn.init.constant_(self.out_proj.bias, 0.0) + if self.bias_k is not None: + nn.init.xavier_normal_(self.bias_k) + if self.bias_v is not None: + nn.init.xavier_normal_(self.bias_v) + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + tgt_len, bsz, embed_dim = query.size() + assert embed_dim == self.embed_dim + assert list(query.size()) == [tgt_len, bsz, embed_dim] + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + + k_input = query.permute(1, 2, 0).contiguous() # B * C * T + k_input = ( + F.linear(k_input, self.compress_k.weight[:, 0:tgt_len]) + .permute(2, 0, 1) + .contiguous() + ) + k = self.k_proj(k_input) + + v_input = query.permute(1, 2, 0).contiguous() # B * C * T + if self.shared_kv_compressed == 0: + v_input = ( + F.linear(v_input, self.compress_v.weight[:, 0:tgt_len]) + .permute(2, 0, 1) + .contiguous() + ) + if self.shared_kv_compressed == 1: # use shared kv compressed linear layer + v_input = ( + F.linear(v_input, self.compress_k.weight[:, 0:tgt_len]) + .permute(2, 0, 1) + .contiguous() + ) + v = self.v_proj(v_input) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadLinearAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + src_len = k.size(1) + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = MultiheadLinearAttention.apply_sparse_mask( + attn_weights, tgt_len, src_len, bsz + ) + + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = F.dropout( + attn_weights, + p=self.dropout, + training=self.training, + ) + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights + + @staticmethod + def _append_prev_key_padding_mask( + key_padding_mask: Optional[Tensor], + prev_key_padding_mask: Optional[Tensor], + batch_size: int, + src_len: int, + static_kv: bool, + ) -> Optional[Tensor]: + # saved key padding masks have shape (bsz, seq_len) + if prev_key_padding_mask is not None and static_kv: + new_key_padding_mask = prev_key_padding_mask + elif prev_key_padding_mask is not None and key_padding_mask is not None: + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), key_padding_mask.float()], dim=1 + ) + # During incremental decoding, as the padding token enters and + # leaves the frame, there will be a time when prev or current + # is None + elif prev_key_padding_mask is not None: + filler = torch.zeros( + (batch_size, src_len - prev_key_padding_mask.size(1)), + device=prev_key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), filler.float()], dim=1 + ) + elif key_padding_mask is not None: + filler = torch.zeros( + (batch_size, src_len - key_padding_mask.size(1)), + device=key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [filler.float(), key_padding_mask.float()], dim=1 + ) + else: + new_key_padding_mask = prev_key_padding_mask + return new_key_padding_mask + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + """Reorder buffered internal state (for incremental generation).""" + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + for k in input_buffer.keys(): + input_buffer_k = input_buffer[k] + if input_buffer_k is not None: + if self.encoder_decoder_attention and input_buffer_k.size( + 0 + ) == new_order.size(0): + break + input_buffer[k] = input_buffer_k.index_select(0, new_order) + incremental_state = self._set_input_buffer(incremental_state, input_buffer) + return incremental_state + + def _get_input_buffer( + self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ) -> Dict[str, Optional[Tensor]]: + result = self.get_incremental_state(incremental_state, "attn_state") + if result is not None: + return result + else: + empty_result: Dict[str, Optional[Tensor]] = {} + return empty_result + + def _set_input_buffer( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + buffer: Dict[str, Optional[Tensor]], + ): + return self.set_incremental_state(incremental_state, "attn_state", buffer) + + def apply_sparse_mask(attn_weights, tgt_len: int, src_len: int, bsz: int): + return attn_weights + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + items_to_add = {} + keys_to_remove = [] + for k in state_dict.keys(): + if k.endswith(prefix + "in_proj_weight"): + # in_proj_weight used to be q + k + v with same dimensions + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.weight"] = state_dict[k][:dim] + items_to_add[prefix + "k_proj.weight"] = state_dict[k][dim : 2 * dim] + items_to_add[prefix + "v_proj.weight"] = state_dict[k][2 * dim :] + + keys_to_remove.append(k) + + k_bias = prefix + "in_proj_bias" + if k_bias in state_dict.keys(): + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.bias"] = state_dict[k_bias][:dim] + items_to_add[prefix + "k_proj.bias"] = state_dict[k_bias][ + dim : 2 * dim + ] + items_to_add[prefix + "v_proj.bias"] = state_dict[k_bias][2 * dim :] + + keys_to_remove.append(prefix + "in_proj_bias") + + for k in keys_to_remove: + del state_dict[k] + + for key, value in items_to_add.items(): + state_dict[key] = value diff --git a/SpeechT5/fairseq/examples/m2m_100/README.md b/SpeechT5/fairseq/examples/m2m_100/README.md new file mode 100644 index 0000000..0580158 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/README.md @@ -0,0 +1,241 @@ +# Beyond English-Centric Multilingual Machine Translation + +## Introduction +In this work, we create a true Many-to-Many multilingual translation model that can translate directly between any pair of 100 languages. Our focus on non-English-Centric models brings gains of more than 10 BLEU when directly translating between non-English directions while performing competitively with the best single systems of WMT. + +If you are new to using fairseq, read the following walkthrough. Otherwise, skip to the sections below. + +0. **Generation Data** + +To download the generation data, follow the below commands. Note that all datasets need to be detokenized *before* applying SPM in the data preprocessing step. If you use these evaluation datasets, please cite their associated papers. +```bash +# WMT - use sacrebleu, example here: +sacrebleu -t wmt14 -l fr-en --echo src > wmt.test.fr-en.fr +sacrebleu -t wmt14 -l fr-en --echo ref > wmt.test.fr-en.en + +# WAT +wget http://lotus.kuee.kyoto-u.ac.jp/WAT/my-en-data/wat2020.my-en.zip +unzip wat2020.my-en.zip + +# FLORES +# download from: https://github.com/facebookresearch/flores + +# TED - need to detokenize with Moses! +# from: https://github.com/neulab/word-embeddings-for-nmt +wget http://phontron.com/data/ted_talks.tar.gz + +# Autshumato +# request to download: https://repo.sadilar.org/handle/20.500.12185/397 + +# Tatoeba Challenge +# available here: https://github.com/Helsinki-NLP/Tatoeba-Challenge +``` + +1. **Training Data** + +To produce the training data, we use a combination of [CCMatrix](https://arxiv.org/abs/1911.04944) and [CCAligned](https://arxiv.org/abs/1911.06154). Check out the instructions [here](https://github.com/facebookresearch/LASER/tree/master/tasks/CCMatrix) to download the raw data. + +2. **Preprocess Data** + +After downloading raw data, you will need to postprocess the data, then apply SPM, then binarize. Note that it is very important you run the postprocessing script, because this removes any instance of the evaluation data in the mined training data. + +```bash +# preprocess data + +# remove sentences with more than 50% punctuation +python /path/to/fairseq/examples/m2m_100/process_data/remove_too_much_punc.py + +# deduplicate training data +paste /path/to/datadir/train.$src /path/to/datadir/train.$tgt | awk '!x[$0]++' > /path/to/datadir/train.dedup +echo "keeping $(wc -l /path/to/datadir/train.dedup) bitext out of $(wc -l /path/to/datadir/train.$src)" +cut -f1 /path/to/datadir/train.dedup > /path/to/datadir/train.$src +cut -f2 /path/to/datadir/train.dedup > /path/to/datadir/train.$tgt + +# remove all instances of evaluation data from the training data +python /path/to/fairseq/examples/m2m_100/process_data/dedup_data.py + +# frequency cleaning +wget https://dl.fbaipublicfiles.com/m2m_100/histograms.tar.gz +tar -xvzf histograms.tar.gz +python /path/to/fairseq/examples/m2m_100/process_data/clean_histogram.py --src $src --tgt $tgt --src-file /path/to/source/file --tgt-file /path/to/output/file --src-output-file source_output.$src --tgt-output-file target_output.$tgt --histograms /path/to/histograms + +# apply SPM +wget https://dl.fbaipublicfiles.com/m2m_100/spm.128k.model +python /path/to/fairseq/scripts/spm_encode.py \ + --model spm.128k.model \ + --output_format=piece \ + --inputs=/path/to/input/file/here \ + --outputs=/path/to/output/file/here + +# length ratio cleaning +perl mosesdecoder/scripts/training/clean-corpus-n.perl --ratio 3 /path/to/training/data/train.spm.$src-$tgt $src $tgt /path/to/output/directory/train.spm.$src-$tgt 1 250 + +# binarize data +wget https://dl.fbaipublicfiles.com/m2m_100/data_dict.128k.txt +fairseq-preprocess \ + --source-lang $src --target-lang $tgt \ + --testpref spm.$src.$tgt \ + --thresholdsrc 0 --thresholdtgt 0 \ + --destdir data_bin \ + --srcdict data_dict.128k.txt --tgtdict data_dict.128k.txt +``` + +3. **Training Scripts** + +To reproduce the training of our models, we train with fairseq-py's multilingual translation [task](https://github.com/pytorch/fairseq/tree/master/examples/multilingual). If you are interested in model parallel training, also check out [fairscale](https://github.com/facebookresearch/fairscale). + +4. **Generation** + +To generate from our models, follow the the commands in the generation section below. + + +If you use any of the resources listed here, please cite: +```bibtex +@article{fan2020beyond, + title={Beyond English-Centric Multilingual Machine Translation}, + author={Fan, Angela and Bhosale, Shruti and Schwenk, Holger and Ma, Zhiyi and El-Kishky, Ahmed and Goyal, Siddharth and Baines, Mandeep and Celebi, Onur and Wenzek, Guillaume and Chaudhary, Vishrav and Goyal, Naman and Birch, Tom and Liptchinsky, Vitaliy and Edunov, Sergey and Grave, Edouard and Auli, Michael and Joulin, Armand}, + journal={arXiv preprint}, + year={2020} +} + +@article{schwenk2019ccmatrix, + title={Ccmatrix: Mining billions of high-quality parallel sentences on the web}, + author={Schwenk, Holger and Wenzek, Guillaume and Edunov, Sergey and Grave, Edouard and Joulin, Armand}, + journal={arXiv preprint arXiv:1911.04944}, + year={2019} +} + +@article{el2019massive, + title={A Massive Collection of Cross-Lingual Web-Document Pairs}, + author={El-Kishky, Ahmed and Chaudhary, Vishrav and Guzman, Francisco and Koehn, Philipp}, + journal={arXiv preprint arXiv:1911.06154}, + year={2019} +} +``` + + +## Trained Models + +### 418M and 1.2B Model +We include the last checkpoint for both of these models. + +```bash +wget https://dl.fbaipublicfiles.com/m2m_100/model_dict.128k.txt +wget https://dl.fbaipublicfiles.com/m2m_100/language_pairs_small_models.txt + +# 418M parameter model +wget https://dl.fbaipublicfiles.com/m2m_100/418M_last_checkpoint.pt + +# 1.2B parameter model +wget https://dl.fbaipublicfiles.com/m2m_100/1.2B_last_checkpoint.pt + +# Generation: +fairseq-generate $binarized_data_path --batch-size 32 --path $path_to_model --fixed-dictionary model_dict.128k.txt -s en -t fr --remove-bpe 'sentencepiece' --beam 5 --task translation_multi_simple_epoch --lang-pairs language_pairs_small_models.txt --decoder-langtok --encoder-langtok src --gen-subset test > gen_out +``` + +### 12B Model +12B parameter model trained on many-to-many training data for 100 languages. We include the last checkpoint, average of last 5 checkpoints, average of last 10 checkpoints. There isn't a universally best choice out of these three, but all three versions are pretty close in accuracy. You can either sweep over the 3 checkpoints on a dev test and use the best performing checkpoint for final testing. Or the last checkpoint can be a good default choice. + +**Model Download Links** +Configuration | 2 32GB GPUs | 4 16GB GPUs | 6 12GB GPUs | 8 8GB GPUs +:--|:--|:--|:--|:-- +Last Checkpoint | [12b_last_chk_2_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_last_chk_2_gpus.pt) | [12b_last_chk_4_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_last_chk_4_gpus.pt) | [12b_last_chk_6_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_last_chk_6_gpus.pt) | [12b_last_chk_8_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_last_chk_8_gpus.pt) +Average of last 5 checkpoints | [12b_avg5_chk_2_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg5_chk_2_gpus.pt) | [12b_avg5_chk_4_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg5_chk_4_gpus.pt) | [12b_avg5_chk_6_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg5_chk_6_gpus.pt) | [12b_avg5_chk_8_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg5_chk_8_gpus.pt) +Average of last 10 checkpoints | [12b_avg10_chk_2_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg10_chk_2_gpus.pt) | [12b_avg10_chk_4_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg10_chk_4_gpus.pt) | [12b_avg10_chk_6_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg10_chk_6_gpus.pt) | [12b_avg10_chk_8_gpus.pt](https://dl.fbaipublicfiles.com/m2m_100/12b_avg10_chk_8_gpus.pt) + +**Generation Arguments** +Configuration | 2 32GB GPUs | 4 16GB GPUs | 6 12GB GPUs | 8 8GB GPUs +:--|:--|:--|:--|:-- +`--pipeline-encoder-balance` | `[26]` | `[1,15,10]` | `[1,9,9,7]` | `[1,6,6,6,7]` +`--pipeline-encoder-devices` | `[0]` | `[0,1,0]` | `[0,1,2,0]` | `[0,4,5,1,0]` +`--pipeline-decoder-balance` | `[3,22,1]` | `[3,11,11,1]` | `[3,7,7,8,1]` | `[1,6,6,6,6,1]` +`--pipeline-decoder-devices` | `[0,1,0]` | `[0,2,3,0]` | `[0,3,4,5,0]` | `[0,2,6,7,3,0]` + + +## SentencePiece Model + +```bash +wget https://dl.fbaipublicfiles.com/m2m_100/spm.128k.model +``` + +## Generation with M2M-100 + +### Encode using our SentencePiece Model + +Note: Install SentencePiece from [here](https://github.com/google/sentencepiece) + +```bash +fairseq=/path/to/fairseq +cd $fairseq +sacrebleu --echo src -l de-fr -t wmt19 | head -n 20 > raw_input.de-fr.de +sacrebleu --echo ref -l de-fr -t wmt19 | head -n 20 > raw_input.de-fr.fr +wget https://dl.fbaipublicfiles.com/m2m_100/spm.128k.model +for lang in de fr ; do + python scripts/spm_encode.py \ + --model spm.128k.model \ + --output_format=piece \ + --inputs=raw_input.de-fr.${lang} \ + --outputs=spm.de-fr.${lang} +done +``` + +### Binarization + +```bash +wget https://dl.fbaipublicfiles.com/m2m_100/data_dict.128k.txt +fairseq-preprocess \ + --source-lang de --target-lang fr \ + --testpref spm.de-fr \ + --thresholdsrc 0 --thresholdtgt 0 \ + --destdir data_bin \ + --srcdict data_dict.128k.txt --tgtdict data_dict.128k.txt +``` + +### Generation for the 12B model + +Note that generation can currently be run using 2 32GB / 4 16GB / 6 12GB / 8 8GB GPUs, and the corresponding model checkpoints and pipeline arguments can be found in the [12B Model Section](#12b-model). +Generation on CPUs will be added in the future. + +```bash +wget https://dl.fbaipublicfiles.com/m2m_100/model_dict.128k.txt +wget https://dl.fbaipublicfiles.com/m2m_100/language_pairs.txt +wget https://dl.fbaipublicfiles.com/m2m_100/12b_last_chk_4_gpus.pt +fairseq-generate \ + data_bin \ + --batch-size 1 \ + --path 12b_last_chk_4_gpus.pt \ + --fixed-dictionary model_dict.128k.txt \ + -s de -t fr \ + --remove-bpe 'sentencepiece' \ + --beam 5 \ + --task translation_multi_simple_epoch \ + --lang-pairs language_pairs.txt \ + --decoder-langtok --encoder-langtok src \ + --gen-subset test \ + --fp16 \ + --dataset-impl mmap \ + --distributed-world-size 1 --distributed-no-spawn \ + --pipeline-model-parallel \ + --pipeline-chunks 1 \ + --pipeline-encoder-balance '[1,15,10]' \ + --pipeline-encoder-devices '[0,1,0]' \ + --pipeline-decoder-balance '[3,11,11,1]' \ + --pipeline-decoder-devices '[0,2,3,0]' > gen_out +``` +## Evaluation with M2M-100 + +### Tokenization + +Note: Refer to tokenizers/README.md for more details on tokenization. + +```bash +cd ${fairseq}/examples/m2m_100 +cat ${fairseq}/gen_out | grep -P "^H" | sort -V | cut -f 3- | sh tok.sh fr > hyp +cat ${fairseq}/raw_input.de-fr.fr | sh tok.sh fr > ref +``` + +### BLEU + +```bash +sacrebleu -tok 'none' ref < hyp +``` diff --git a/SpeechT5/fairseq/examples/m2m_100/install_dependecies.sh b/SpeechT5/fairseq/examples/m2m_100/install_dependecies.sh new file mode 100644 index 0000000..82a1054 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/install_dependecies.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +CWD=`pwd` +INSTALL_PATH=$CWD/tokenizers/thirdparty + +MOSES=$INSTALL_PATH/mosesdecoder +if [ ! -d $MOSES ]; then + echo 'Cloning Moses github repository (for tokenization scripts)...' + git clone https://github.com/moses-smt/mosesdecoder.git $MOSES + cd $MOSES + # To deal with differences in handling ' vs " + git checkout 03578921cc1a03402 + cd - +fi + +WMT16_SCRIPTS=$INSTALL_PATH/wmt16-scripts +if [ ! -d $WMT16_SCRIPTS ]; then + echo 'Cloning Romanian tokenization scripts' + git clone https://github.com/rsennrich/wmt16-scripts.git $WMT16_SCRIPTS +fi + +KYTEA=$INSTALL_PATH/kytea +if [ ! -f $KYTEA/bin/kytea ]; then + git clone https://github.com/neubig/kytea.git $KYTEA + cd $KYTEA + autoreconf -i + ./configure --prefix=`pwd` + make + make install + cd .. +fi + +export MECAB=$INSTALL_PATH/mecab-0.996-ko-0.9.2 +if [ ! -f $MECAB/bin/mecab ]; then + cd $INSTALL_PATH + curl -LO https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz + tar zxfv mecab-0.996-ko-0.9.2.tar.gz + cd mecab-0.996-ko-0.9.2/ + ./configure --prefix=`pwd` + make + make install + + cd .. + curl -LO https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.1.1-20180720.tar.gz + tar zxfv mecab-ko-dic-2.1.1-20180720.tar.gz + cd mecab-ko-dic-2.1.1-20180720/ + ./autogen.sh + ./configure --prefix=`pwd` --with-dicdir=$MECAB/lib/mecab/dic/mecab-ko-dic --with-mecab-config=$MECAB/bin/mecab-config + make + sh -c 'echo "dicdir=$MECAB/lib/mecab/dic/mecab-ko-dic" > $MECAB/etc/mecabrc' + make install + cd $CWD +fi + +INDIC_RESOURCES_PATH=$INSTALL_PATH/indic_nlp_resources +if [ ! -d $INDIC_RESOURCES_PATH ]; then + echo 'Cloning indic_nlp_resources' + git clone https://github.com/anoopkunchukuttan/indic_nlp_resources.git $INDIC_RESOURCES_PATH +fi + + +if [ ! -f $INSTALL_PATH/seg_my.py ]; then + cd $INSTALL_PATH + wget http://lotus.kuee.kyoto-u.ac.jp/WAT/my-en-data/wat2020.my-en.zip + unzip wat2020.my-en.zip + # switch to python3 + cat wat2020.my-en/myseg.py |sed 's/^sys.std/###sys.std/g' | sed 's/### sys/sys/g' | sed 's/unichr/chr/g' > seg_my.py + cd $CWD +fi + + +pip install pythainlp sacrebleu indic-nlp-library + diff --git a/SpeechT5/fairseq/examples/m2m_100/process_data/clean_histogram.py b/SpeechT5/fairseq/examples/m2m_100/process_data/clean_histogram.py new file mode 100644 index 0000000..e24e073 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/process_data/clean_histogram.py @@ -0,0 +1,52 @@ +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument('--src', type=str, help='Source language') +parser.add_argument('--tgt', type=str, help='Target language') +parser.add_argument('--src-file', type=str, help='Input source file') +parser.add_argument('--tgt-file', type=str, help='Input target file') +parser.add_argument('--src-output-file', type=str, help='Output source file') +parser.add_argument('--tgt-output-file', type=str, help='Output target file') +parser.add_argument('--threshold', type=float, default=0.5, help='Threshold') +parser.add_argument('--threshold-character', type=str, default=']', help='Threshold character') +parser.add_argument('--histograms', type=str, help='Path to histograms') + +args = parser.parse_args() + + +def read_hist(f): + ch = [] + for line in f: + c = line[0] + if c == args.threshold_character: + break + ch.append(c) + return ch + + +with(open("{}/{}".format(args.histograms, args.src), 'r', encoding='utf8')) as f: + ch1 = read_hist(f) + +with(open("{}/{}".format(args.histograms, args.tgt), 'r', encoding='utf8')) as f: + ch2 = read_hist(f) + +print("Accepted characters for {}: {}".format(args.src, ch1)) +print("Accepted characters for {}: {}".format(args.tgt, ch2)) + +with open(args.src_file, 'r', encoding='utf8') as fs1, open(args.tgt_file, 'r', encoding='utf8') as fs2, open(args.src_output_file, 'w', encoding='utf8') as fos1, open(args.tgt_output_file, 'w', encoding='utf8') as fos2: + ls1 = fs1.readline() + ls2 = fs2.readline() + + while ls1 or ls2: + cnt1 = len([c for c in ls1.strip() if c in ch1]) + cnt2 = len([c for c in ls2.strip() if c in ch2]) + + if cnt1 / len(ls1) > args.threshold and cnt2 / len(ls2) > args.threshold: + fos1.write(ls1) + fos2.write(ls2) + else: + print("{} {} {} \n{} {} {}".format(args.src, cnt1 / len(ls1), ls1.strip(), args.tgt, cnt2 / len(ls2), ls2.strip())) + + ls1 = fs1.readline() + ls2 = fs2.readline() + \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/m2m_100/process_data/dedup_data.py b/SpeechT5/fairseq/examples/m2m_100/process_data/dedup_data.py new file mode 100644 index 0000000..58d9ed1 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/process_data/dedup_data.py @@ -0,0 +1,91 @@ +import argparse +from collections import namedtuple +import os + +DATADIR = "/path/to/train_data" +DEDUP_FROM_DIR = "/path/to/eval/data" +OUTPUT_DIR = "/path/to/output/data" + + +def main(args): + languages = set() + for language_directory in os.listdir(DATADIR): + if "_" in language_directory: + src, tgt = language_directory.split("_") + languages.add(LanguagePair(src=src, tgt=tgt)) + + data = existing_data() + train_languages = sorted(languages) + for language_pair in train_languages[args.start_index:args.start_index + args.size]: + print(language_pair) + dedup(language_pair, data) + + +LanguagePair = namedtuple("LanguagePair", ["src", "tgt"]) + + +def existing_data(): + data = set() + for file in os.listdir(DEDUP_FROM_DIR): + with open(os.path.join(DEDUP_FROM_DIR, file)) as f: + data |= set(f.readlines()) + return data + +def dedup(language_pair, data, verbose=True, output=True): + train_filenames = LanguagePair( + src=f"{DATADIR}/{language_pair.src}_{language_pair.tgt}/train.{language_pair.src}", + tgt=f"{DATADIR}/{language_pair.src}_{language_pair.tgt}/train.{language_pair.tgt}", + ) + + output_filenames = LanguagePair( + src=f"{OUTPUT_DIR}/train.dedup.{language_pair.src}-{language_pair.tgt}.{language_pair.src}", + tgt=f"{OUTPUT_DIR}/train.dedup.{language_pair.src}-{language_pair.tgt}.{language_pair.tgt}" + ) + + # If output exists, skip this pair. It has already been done. + if (os.path.exists(output_filenames.src) and + os.path.exists(output_filenames.tgt)): + if verbose: + print(f"{language_pair.src}-{language_pair.tgt} already done.") + return + + if verbose: + print(f"{language_pair.src}-{language_pair.tgt} ready, will check dups.") + + # If there is no output, no need to actually do the loop. + if not output: + return + + if os.path.exists(train_filenames.src) and os.path.exists(train_filenames.tgt): + with open(train_filenames.src) as f: + train_source = f.readlines() + + with open(train_filenames.tgt) as f: + train_target = f.readlines() + + # do dedup + new_train_source = [] + new_train_target = [] + for i, train_line in enumerate(train_source): + if train_line not in data and train_target[i] not in data: + new_train_source.append(train_line) + new_train_target.append(train_target[i]) + + assert len(train_source) == len(train_target) + assert len(new_train_source) == len(new_train_target) + assert len(new_train_source) <= len(train_source) + + with open(output_filenames.src, "w") as o: + for line in new_train_source: + o.write(line) + + with open(output_filenames.tgt, "w") as o: + for line in new_train_target: + o.write(line) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("-s", "--start-index", required=True, type=int) + parser.add_argument("-n", "--size", required=True, type=int) + main(parser.parse_args()) diff --git a/SpeechT5/fairseq/examples/m2m_100/process_data/remove_too_much_punc.py b/SpeechT5/fairseq/examples/m2m_100/process_data/remove_too_much_punc.py new file mode 100644 index 0000000..6c280de --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/process_data/remove_too_much_punc.py @@ -0,0 +1,36 @@ +import gzip +import argparse +from string import punctuation + +def len_no_punc(s, punc): + return len([ch for ch in s if ch in punc]) + +def filter_overpunc(len_npunc, len_sen): + return len_npunc < 0.5*len_sen + +def main(args): + punc = punctuation + "—|–" + print('Processing file {}'.format(args.input)) + with gzip.open(args.input, 'rt', encoding=args.encoding) as tsv: + with open(args.bitext + '.' + args.src_lang, 'wt', encoding=args.encoding) as fsrc: + with open(args.bitext + '.' + args.tgt_lang, 'wt', encoding=args.encoding) as ftgt: + line = tsv.readline() + fields = line.split('\t') + + src, tgt = fields[1], fields[2] + + nchar_npunc_src = len_no_punc(src, punc) + nchar_npunc_tgt = len_no_punc(tgt, punc) + + if filter_overpunc(nchar_npunc_src, len(src)) and filter_overpunc(nchar_npunc_tgt, len(tgt)): + fsrc.write(src.strip() + '\n') + ftgt.write(tgt.strip() + '\n') + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--input", required=True, type=str) + parser.add_argument('--encoding', default='utf-8', help='character encoding for input/output') + parser.add_argument('--bitext', type=str, required=True, help='language direction') + parser.add_argument('--src-lang', type=str, required=True, help='Source language') + parser.add_argument('--tgt-lang', type=str, required=True, help='Target language') + main(parser.parse_args()) diff --git a/SpeechT5/fairseq/examples/m2m_100/tok.sh b/SpeechT5/fairseq/examples/m2m_100/tok.sh new file mode 100644 index 0000000..ba2ec5a --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tok.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +# Copyright (c) 2019-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# + +set -e + +TOKENIZERS_SCRIPTS=tokenizers +INSTALL_PATH=$TOKENIZERS_SCRIPTS/thirdparty + +N_THREADS=8 + +lg=$1 + +MOSES=$INSTALL_PATH/mosesdecoder +REPLACE_UNICODE_PUNCT=$MOSES/scripts/tokenizer/replace-unicode-punctuation.perl +NORM_PUNC=$MOSES/scripts/tokenizer/normalize-punctuation.perl +REM_NON_PRINT_CHAR=$MOSES/scripts/tokenizer/remove-non-printing-char.perl +TOKENIZER=$MOSES/scripts/tokenizer/tokenizer.perl + +# special tokenization for Romanian +WMT16_SCRIPTS=$INSTALL_PATH/wmt16-scripts + +NORMALIZE_ROMANIAN=$WMT16_SCRIPTS/preprocess/normalise-romanian.py +REMOVE_DIACRITICS=$WMT16_SCRIPTS/preprocess/remove-diacritics.py + +# Burmese +MY_SEGMENT=$INSTALL_PATH/seg_my.py + +# Arabic +AR_TOKENIZER=$TOKENIZERS_SCRIPTS/tokenizer_ar.sh + +# Korean +KO_SEGMENT=$TOKENIZERS_SCRIPTS/seg_ko.sh + +# Japanese +JA_SEGMENT=$TOKENIZERS_SCRIPTS/seg_ja.sh + +# Indic +IN_TOKENIZER=$TOKENIZERS_SCRIPTS/tokenize_indic.py +INDIC_RESOURCES_PATH=$INSTALL_PATH/indic_nlp_resources + +# Thai +THAI_TOKENIZER=$TOKENIZERS_SCRIPTS/tokenize_thai.py + +# Chinese +CHINESE_TOKENIZER=$TOKENIZERS_SCRIPTS/tokenize_zh.py + +# Chinese +if [ "$lg" = "zh" ]; then + cat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | python $CHINESE_TOKENIZER +# Thai +elif [ "$lg" = "th" ]; then + cat - | python $THAI_TOKENIZER +# Japanese +elif [ "$lg" = "ja" ]; then + cat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | ${JA_SEGMENT} +# Korean +elif [ "$lg" = "ko" ]; then + cat - | $REM_NON_PRINT_CHAR | ${KO_SEGMENT} +# Romanian +elif [ "$lg" = "ro" ]; then + cat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | $NORMALIZE_ROMANIAN | $REMOVE_DIACRITICS | $TOKENIZER -no-escape -threads $N_THREADS -l $lg +# Burmese +elif [ "$lg" = "my" ]; then + cat - | python ${MY_SEGMENT} +# Arabic +elif [ "$lg" = "ar" ]; then + cat - | ${AR_TOKENIZER} +# Indic +elif [ "$lg" = "ne" ]; then + cat - | python ${IN_TOKENIZER} $lg +elif [ "$lg" = "si" ]; then + cat - | python ${IN_TOKENIZER} $lg +elif [ "$lg" = "hi" ]; then + cat - | python ${IN_TOKENIZER} $lg +# other languages +else + cat - | $REPLACE_UNICODE_PUNCT | $NORM_PUNC -l $lg | $REM_NON_PRINT_CHAR | $TOKENIZER -no-escape -threads $N_THREADS -l $lg +fi diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/README.md b/SpeechT5/fairseq/examples/m2m_100/tokenizers/README.md new file mode 100644 index 0000000..e116932 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/README.md @@ -0,0 +1,18 @@ +# M2M-100 Tokenization + +We apply different tokenization strategies for different languages following the existing literature. Here we provide tok.sh a tokenizer that can be used to reproduce our results. + +To reproduce the results, follow these steps: + +``` +tgt_lang=... +reference_translation=... +cat generation_output | grep -P "^H" | sort -V | cut -f 3- | sh tok.sh $tgt_lang > hyp +cat $reference_translation |sh tok.sh $tgt_lang > ref +sacrebleu -tok 'none' ref < hyp +``` + +## Installation + +Tools needed for all the languages except Arabic can be installed by running install_dependencies.sh +If you want to evaluate Arabic models, please follow the instructions provided here: http://alt.qcri.org/tools/arabic-normalizer/ to install diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ja.sh b/SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ja.sh new file mode 100644 index 0000000..be6f5ca --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ja.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +SCRIPT=`realpath $0` +KYTEA=`dirname $SCRIPT`/thirdparty/kytea +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$KYTEA/lib:/usr/local/lib +export PATH=$PATH:"$KYTEA/bin" + +cat - | tr -d "[:blank:]" | kytea -notags diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ko.sh b/SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ko.sh new file mode 100644 index 0000000..c523d92 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/seg_ko.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +SCRIPT=`realpath $0` +MECAB=`dirname $SCRIPT`/thirdparty/mecab-0.996-ko-0.9.2 + +export PATH=$PATH:"$MECAB/bin":"$MECAB/lib" +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"$MECAB/lib" + +cat - | mecab -O wakati diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/thirdparty/.gitignore b/SpeechT5/fairseq/examples/m2m_100/tokenizers/thirdparty/.gitignore new file mode 100644 index 0000000..19eb6a9 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/thirdparty/.gitignore @@ -0,0 +1,12 @@ +seg_my.py +indic_nlp_library/ +indic_nlp_resources/ +kytea/ +mecab-0.996-ko-0.9.2.tar.gz +mecab-0.996-ko-0.9.2/ +mosesdecoder/ +wat2020.my-en.zip +wat2020.my-en/ +wmt16-scripts/ +mecab-ko-dic-2.1.1-20180720/ +mecab-ko-dic-2.1.1-20180720.tar.gz \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_indic.py b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_indic.py new file mode 100644 index 0000000..a44fad0 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_indic.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +# Use: echo {text} | python tokenize_indic.py {language} + +import sys + +from indicnlp.normalize.indic_normalize import IndicNormalizerFactory +from indicnlp.tokenize.indic_tokenize import trivial_tokenize + + +factory = IndicNormalizerFactory() +normalizer = factory.get_normalizer( + sys.argv[1], remove_nuktas=False, nasals_mode="do_nothing" +) + +for line in sys.stdin: + normalized_line = normalizer.normalize(line.strip()) + tokenized_line = " ".join(trivial_tokenize(normalized_line, sys.argv[1])) + print(tokenized_line) diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_thai.py b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_thai.py new file mode 100644 index 0000000..9c72cb8 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_thai.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + +from pythainlp import word_tokenize + + +for line in sys.stdin: + print(" ".join(word_tokenize(line.strip()))) diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_zh.py b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_zh.py new file mode 100644 index 0000000..674b584 --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenize_zh.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import fileinput + +import sacrebleu + + +for line in fileinput.input(): + print(sacrebleu.tokenize_zh(line)) diff --git a/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenizer_ar.sh b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenizer_ar.sh new file mode 100644 index 0000000..ad35d7a --- /dev/null +++ b/SpeechT5/fairseq/examples/m2m_100/tokenizers/tokenizer_ar.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env sh +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +# +# Please follow the instructions here http://alt.qcri.org/tools/arabic-normalizer/ +# to install tools needed for Arabic + +echo "Please install Arabic tools: http://alt.qcri.org/tools/arabic-normalizer/" +echo "Then update environment variables in tokenizer_ar.sh" +exit 1 + +SVMTOOL=... +GOMOSESGO=... +QCRI_ARABIC_NORMALIZER=... + +export PERL5LIB="$SVMTOOL/lib":"$GOMOSESGO/bin/MADA-3.2":$PERL5LIB + + +tempfile=$(mktemp) +cat - > $tempfile + +cd $QCRI_ARABIC_NORMALIZER + +bash qcri_normalizer_mada3.2_aramorph1.2.1.sh $tempfile +cat $tempfile.mada_norm-aramorph.europarl_tok diff --git a/SpeechT5/fairseq/examples/mbart/README.md b/SpeechT5/fairseq/examples/mbart/README.md new file mode 100644 index 0000000..a45e372 --- /dev/null +++ b/SpeechT5/fairseq/examples/mbart/README.md @@ -0,0 +1,123 @@ +# MBART: Multilingual Denoising Pre-training for Neural Machine Translation +[https://arxiv.org/abs/2001.08210] + +## Introduction + +MBART is a sequence-to-sequence denoising auto-encoder pre-trained on large-scale monolingual corpora in many languages using the BART objective. mBART is one of the first methods for pre-training a complete sequence-to-sequence model by denoising full texts in multiple languages, while previous approaches have focused only on the encoder, decoder, or reconstructing parts of the text. + +## Pre-trained models + +Model | Description | # params | Download +---|---|---|--- +`mbart.CC25` | mBART model with 12 encoder and decoder layers trained on 25 languages' monolingual corpus | 610M | [mbart.CC25.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/mbart/mbart.cc25.v2.tar.gz) +`mbart.ft.ro_en` | finetune mBART cc25 model on ro-en language pairs | 610M | [mbart.cc25.ft.enro.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/mbart/mbart.cc25.ft.enro.tar.gz) + +## Results + +**[WMT16 EN-RO](https://www.statmt.org/wmt16/translation-task.html)** + +_(test set, no additional data used)_ + +Model | en-ro | ro-en +---|---|--- +`Random` | 34.3 | 34.0 +`mbart.cc25` | 37.7 | 37.8 +`mbart.enro.bilingual` | 38.5 | 38.5 + +## BPE data +# download model +wget https://dl.fbaipublicfiles.com/fairseq/models/mbart/mbart.cc25.v2.tar.gz +tar -xzvf mbart.CC25.tar.gz +# bpe data +install SPM [here](https://github.com/google/sentencepiece) +```bash +SPM=/path/to/sentencepiece/build/src/spm_encode +MODEL=sentence.bpe.model +${SPM} --model=${MODEL} < ${DATA}/${TRAIN}.${SRC} > ${DATA}/${TRAIN}.spm.${SRC} & +${SPM} --model=${MODEL} < ${DATA}/${TRAIN}.${TGT} > ${DATA}/${TRAIN}.spm.${TGT} & +${SPM} --model=${MODEL} < ${DATA}/${VALID}.${SRC} > ${DATA}/${VALID}.spm.${SRC} & +${SPM} --model=${MODEL} < ${DATA}/${VALID}.${TGT} > ${DATA}/${VALID}.spm.${TGT} & +${SPM} --model=${MODEL} < ${DATA}/${TEST}.${SRC} > ${DATA}/${TEST}.spm.${SRC} & +${SPM} --model=${MODEL} < ${DATA}/${TEST}.${TGT} > ${DATA}/${TEST}.spm.${TGT} & +``` + +## Preprocess data + +```bash +DICT=dict.txt +fairseq-preprocess \ + --source-lang ${SRC} \ + --target-lang ${TGT} \ + --trainpref ${DATA}/${TRAIN}.spm \ + --validpref ${DATA}/${VALID}.spm \ + --testpref ${DATA}/${TEST}.spm \ + --destdir ${DEST}/${NAME} \ + --thresholdtgt 0 \ + --thresholdsrc 0 \ + --srcdict ${DICT} \ + --tgtdict ${DICT} \ + --workers 70 +``` + +## Finetune on EN-RO +Finetune on mbart CC25 + +```bash +PRETRAIN=mbart.cc25 # fix if you moved the downloaded checkpoint +langs=ar_AR,cs_CZ,de_DE,en_XX,es_XX,et_EE,fi_FI,fr_XX,gu_IN,hi_IN,it_IT,ja_XX,kk_KZ,ko_KR,lt_LT,lv_LV,my_MM,ne_NP,nl_XX,ro_RO,ru_RU,si_LK,tr_TR,vi_VN,zh_CN + +fairseq-train path_2_data \ + --encoder-normalize-before --decoder-normalize-before \ + --arch mbart_large --layernorm-embedding \ + --task translation_from_pretrained_bart \ + --source-lang en_XX --target-lang ro_RO \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ + --optimizer adam --adam-eps 1e-06 --adam-betas '(0.9, 0.98)' \ + --lr-scheduler polynomial_decay --lr 3e-05 --warmup-updates 2500 --total-num-update 40000 \ + --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ + --max-tokens 1024 --update-freq 2 \ + --save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints \ + --seed 222 --log-format simple --log-interval 2 \ + --restore-file $PRETRAIN \ + --reset-optimizer --reset-meters --reset-dataloader --reset-lr-scheduler \ + --langs $langs \ + --ddp-backend legacy_ddp +``` +## Generate on EN-RO +Get sacrebleu on finetuned en-ro model + +get tokenizer [here](https://github.com/rsennrich/wmt16-scripts) +```bash +wget https://dl.fbaipublicfiles.com/fairseq/models/mbart/mbart.cc25.ft.enro.tar.gz +tar -xzvf mbart.cc25.ft.enro.tar.gz +``` + +```bash +model_dir=MBART_finetuned_enro # fix if you moved the checkpoint + +fairseq-generate path_2_data \ + --path $model_dir/model.pt \ + --task translation_from_pretrained_bart \ + --gen-subset test \ + -t ro_RO -s en_XX \ + --bpe 'sentencepiece' --sentencepiece-model $model_dir/sentence.bpe.model \ + --sacrebleu --remove-bpe 'sentencepiece' \ + --batch-size 32 --langs $langs > en_ro + +cat en_ro | grep -P "^H" |sort -V |cut -f 3- | sed 's/\[ro_RO\]//g' |$TOKENIZER ro > en_ro.hyp +cat en_ro | grep -P "^T" |sort -V |cut -f 2- | sed 's/\[ro_RO\]//g' |$TOKENIZER ro > en_ro.ref +sacrebleu -tok 'none' -s 'none' en_ro.ref < en_ro.hyp +``` + +## Citation + +```bibtex +@article{liu2020multilingual, + title={Multilingual Denoising Pre-training for Neural Machine Translation}, + author={Yinhan Liu and Jiatao Gu and Naman Goyal and Xian Li and Sergey Edunov and Marjan Ghazvininejad and Mike Lewis and Luke Zettlemoyer}, + year={2020}, + eprint={2001.08210}, + archivePrefix={arXiv}, + primaryClass={cs.CL} +} +``` diff --git a/SpeechT5/fairseq/examples/megatron_11b/README.md b/SpeechT5/fairseq/examples/megatron_11b/README.md new file mode 100644 index 0000000..945c96c --- /dev/null +++ b/SpeechT5/fairseq/examples/megatron_11b/README.md @@ -0,0 +1,161 @@ +# Megatron-11b + +Megatron-11b is a unidirectional language model with `11B` parameters based on [Megatron-LM](https://arxiv.org/pdf/1909.08053.pdf). Following the original Megatron work, we trained the model using intra-layer model parallelism with each layer's parameters split across 8 GPUs. + +Megatron-11b is trained on the same data and uses the same byte-pair encoding (BPE) as [RoBERTa](https://arxiv.org/pdf/1907.11692.pdf). + +## Pre-trained models + +Model | Description | # params | # filesize | Download +---|---|---|---|--- +`megatron_11b` | megatron_11b unidirectional language model | 11B | 19Gb | [megatron_11b.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/model_parallel/megatron_11b.tar.gz) + +#### Architecture: + +Param | Value +---|--- +embed_dim | 3072 +ffn_dim | 3072 * 6 +layers | 72 +attention heads | 32 + +#### Training details: + +Param | value +---|--- +bsz | 512 +num_updates | 300,000 +peak_lr | 1.5e-04 +lr scheduler | inverse_sqrt +clip norm | 0.0 + + +## Example training command (model parallel) + +Megatron-11b contains too many parameters to train on a single GPU. Following +the original Megatron work, we adopt an intra-layer model parallel training +approach in which each layer's parameters are split across multiple GPUs and +activations and gradients are communicated during the forward/backward pass, +respectively. We similarly split the loss computation using the +`vocab_parallel_cross_entropy` criterion. + +The following training command illustrates how to do model parallel training in +fairseq. We assume that each machine (node) has 8 GPUs among which to split the +model parameters (`--model-parallel-size 8`). If you have access to multiple +nodes, you may combine this with data parallel training by increasing +`--distributed-world-size`. + +To train Megatron-11b on a single node: + + +```bash +fairseq-train \ + --distributed-world-size 8 \ + --memory-efficient-fp16 \ + --num-workers 2 \ + --model-parallel-size 8 \ + --criterion vocab_parallel_cross_entropy \ + --task language_modeling \ + --sample-break-mode none \ + --tokens-per-sample 1024 \ + --arch transformer_lm_megatron_11b \ + --share-decoder-input-output-embed \ + --optimizer adam --adam-betas "(0.9, 0.98)" --adam-eps 1e-08 --clip-norm 0.0 \ + --lr-scheduler inverse_sqrt --lr 0.00015 \ + --warmup-updates 3000 --weight-decay 0.01 \ + --dropout 0.1 --attention-dropout 0.1 \ + --batch-size 2 \ + --max-update 300000; +``` + +Note: Above was tested on `DGX-1` box, with `8xV100-32Gb` GPUs. + +## Results + +**[Wikitext103](https://blog.einstein.ai/the-wikitext-long-term-dependency-language-modeling-dataset/)** + +Model | Valid perplexity | Test perplexity +---|---|--- +`megatron_11b` | 10.64 | 10.54 + + +## Evaluating `megatron_11b` on Wikitext-103 + +#### 1. Downloading Megatron-11b +```bash +# WARNING: this file is 19GB +wget https://dl.fbaipublicfiles.com/fairseq/models/model_parallel/megatron_11b.tar.gz +tar -xzvf megatron_11b.tar.gz +``` + +#### 2. Download Wikitext-103 +```bash +wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip +unzip wikitext-103-raw-v1.zip +``` + +#### 3. Detokenize test tokens +Megatron-11b uses a byte-level BPE that expects raw (untokenized) input. Since +the wikitext-103 dataset comes tokenized, we apply a simple detokenization +process to restore the untokenized test set: + +```bash +python -m examples.megatron_11b.detok wikitext-103-raw/wiki.test.raw > wikitext-103-raw/wiki.test.detok +``` + +#### 4. BPE encoding +```bash +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe' + +python -m examples.roberta.multiprocessing_bpe_encoder \ + --encoder-json encoder.json \ + --vocab-bpe vocab.bpe \ + --inputs "wikitext-103-raw/wiki.test.detok" \ + --outputs "wikitext-103-raw/wiki.test.bpe" \ + --workers 60; +``` + +#### 5. Fairseq binarize +```bash +fairseq-preprocess \ + --only-source \ + --testpref wikitext-103-raw/wiki.test.bpe \ + --srcdict megatron_11b/dict.txt \ + --destdir wikitext103-bin; +``` + +#### 6. Evaluating perplexity. +We can now evaluate perplexity on the test set. Note that because we've modified +the test set (via detokenization and BPE), the perplexity reported by +`fairseq-eval-lm` needs to be renormalized. + +Compute unnormalized perplexity: + +```bash +DATA_PATH=wikitext103-bin/ +fairseq-eval-lm \ + $DATA_PATH \ + --path megatron_11b/model.pt \ + --task language_modeling \ + --gen-subset test \ + --batch-size 8 \ + --criterion cross_entropy \ + --context-window 992 \ + --distributed-world-size 8 \ + --model-parallel-size 8; +# Expected PPL (unnormalized_ppl): [8.46] +# Note: the eval command needs to run on 8 GPUs for the released model +``` +Renormalizing formula: `2 ^ ( log_2(unnormalized_PPL) * (270847 / 245566))`. +PPL After normalization: `10.54` + +To renormalize the perplexity, we must account for the change in token count +after detokenizing and appling BPE. The formula for this is: +`2 ^ ( log_2(unnormalized_PPL) * (new_token_cnt / orig_token_cnt))` + +For the wikitext-103 test set, the original token count is `245566` and the +token count after detokenization and applying BPE is `270847`. + +The perplexity after renormalization is: +`2 ^ ( log_2(8.46) * (270847 / 245566)) = 10.54` diff --git a/SpeechT5/fairseq/examples/megatron_11b/detok.py b/SpeechT5/fairseq/examples/megatron_11b/detok.py new file mode 100644 index 0000000..49921b2 --- /dev/null +++ b/SpeechT5/fairseq/examples/megatron_11b/detok.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import fileinput + +import sacremoses + + +def main(): + parser = argparse.ArgumentParser(description="") + parser.add_argument("files", nargs="*", help="input files") + args = parser.parse_args() + + detok = sacremoses.MosesDetokenizer() + + for line in fileinput.input(args.files, openhook=fileinput.hook_compressed): + print( + detok.detokenize(line.strip().split(" ")) + .replace(" @", "") + .replace("@ ", "") + .replace(" =", "=") + .replace("= ", "=") + .replace(" – ", "–") + ) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/multilingual/ML50_langs.txt b/SpeechT5/fairseq/examples/multilingual/ML50_langs.txt new file mode 100644 index 0000000..558abbc --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/ML50_langs.txt @@ -0,0 +1,52 @@ +ar_AR +cs_CZ +de_DE +en_XX +es_XX +et_EE +fi_FI +fr_XX +gu_IN +hi_IN +it_IT +ja_XX +kk_KZ +ko_KR +lt_LT +lv_LV +my_MM +ne_NP +nl_XX +ro_RO +ru_RU +si_LK +tr_TR +vi_VN +zh_CN +af_ZA +az_AZ +bn_IN +fa_IR +he_IL +hr_HR +id_ID +ka_GE +km_KH +mk_MK +ml_IN +mn_MN +mr_IN +pl_PL +ps_AF +pt_XX +sv_SE +sw_KE +ta_IN +te_IN +th_TH +tl_XX +uk_UA +ur_PK +xh_ZA +gl_ES +sl_SI \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/multilingual/README.md b/SpeechT5/fairseq/examples/multilingual/README.md new file mode 100644 index 0000000..0076f5e --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/README.md @@ -0,0 +1,158 @@ +# Multilingual Translation + +[[Multilingual Translation with Extensible Multilingual Pretraining and Finetuning, https://arxiv.org/abs/2008.00401]](https://arxiv.org/abs/2008.00401) + +## Introduction + +This work is for training multilingual translation models with multiple bitext datasets. This multilingual translation framework supports (see [[training section]](#Training) and [[finetuning section]](#Finetuning) for examples) + +* temperature based sampling over unbalancing datasets of different translation directions + - --sampling-method' with + choices=['uniform', 'temperature', 'concat'] + - --sampling-temperature +* configurable to automatically add source and/or target language tokens to source/target sentences using data which are prepared in the same way as bilignual training + - --encoder-langtok with choices=['src', 'tgt', None] to specify whether to add source or target language tokens to the source sentences + - --decoder-langtok (binary option) to specify whether to add target language tokens to the target sentences or not +* finetuning mBART pretrained models for multilingual translation + - --finetune-from-model to specify the path from which to load the pretrained model + +## Preprocessing data +Multilingual training requires a joint BPE vocab. Please follow [mBART's preprocessing steps](https://github.com/pytorch/fairseq/tree/master/examples/mbart#bpe-data) to reuse our pretrained sentence-piece model. + +You can also train a joint BPE model on your own dataset and then follow the steps in [[link]](https://github.com/pytorch/fairseq/tree/master/examples/translation#multilingual-translation). + +## Training + + +```bash +lang_pairs= +path_2_data= +lang_list=
    + +fairseq-train $path_2_data \ + --encoder-normalize-before --decoder-normalize-before \ + --arch transformer --layernorm-embedding \ + --task translation_multi_simple_epoch \ + --sampling-method "temperature" \ + --sampling-temperature 1.5 \ + --encoder-langtok "src" \ + --decoder-langtok \ + --lang-dict "$lang_list" \ + --lang-pairs "$lang_pairs" \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ + --optimizer adam --adam-eps 1e-06 --adam-betas '(0.9, 0.98)' \ + --lr-scheduler inverse_sqrt --lr 3e-05 --warmup-updates 2500 --max-update 40000 \ + --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ + --max-tokens 1024 --update-freq 2 \ + --save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints \ + --seed 222 --log-format simple --log-interval 2 +``` + +## Finetuning +We can also finetune multilingual models from a monolingual pretrained models, e.g. [mMBART](https://github.com/pytorch/fairseq/tree/master/examples/mbart). +```bash +lang_pairs= +path_2_data= +lang_list= +pretrained_model= + +fairseq-train $path_2_data \ + --finetune-from-model $pretrained_model \ + --encoder-normalize-before --decoder-normalize-before \ + --arch transformer --layernorm-embedding \ + --task translation_multi_simple_epoch \ + --sampling-method "temperature" \ + --sampling-temperature 1.5 \ + --encoder-langtok "src" \ + --decoder-langtok \ + --lang-dict "$lang_list" \ + --lang-pairs "$lang_pairs" \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ + --optimizer adam --adam-eps 1e-06 --adam-betas '(0.9, 0.98)' \ + --lr-scheduler inverse_sqrt --lr 3e-05 --warmup-updates 2500 --max-update 40000 \ + --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ + --max-tokens 1024 --update-freq 2 \ + --save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints \ + --seed 222 --log-format simple --log-interval 2 +``` +## Generate +The following command uses the multilingual task (translation_multi_simple_epoch) to generate translation from $source_lang to $target_lang on the test dataset. During generaton, the source language tokens are added to source sentences and the target language tokens are added as the starting token to decode target sentences. Options --lang-dict and --lang-pairs are needed to tell the generation process the ordered list of languages and translation directions that the trained model are awared of; they will need to be consistent with the training. + +```bash +model= +source_lang= +target_lang= + +fairseq-generate $path_2_data \ + --path $model \ + --task translation_multi_simple_epoch \ + --gen-subset test \ + --source-lang $source_lang \ + --target-lang $target_lang + --sacrebleu --remove-bpe 'sentencepiece'\ + --batch-size 32 \ + --encoder-langtok "src" \ + --decoder-langtok \ + --lang-dict "$lang_list" \ + --lang-pairs "$lang_pairs" > ${source_lang}_${target_lang}.txt +``` +Fairseq will generate translation into a file {source_lang}_${target_lang}.txt with sacreblue at the end. + +You can also use costomized tokenizer to compare the performance with the literature. For example, you get a tokenizer [here](https://github.com/rsennrich/wmt16-scripts) and do the following: +```bash +TOKENIZER= +TOK_CMD=<"$TOKENIZER $target_lang" or cat for sacrebleu> + +cat {source_lang}_${target_lang}.txt | grep -P "^H" |sort -V |cut -f 3- |$TOK_CMD > ${source_lang}_${target_lang}.hyp +cat {source_lang}_${target_lang}.txt | grep -P "^T" |sort -V |cut -f 2- |$TOK_CMD > ${source_lang}_${target_lang}.ref +sacrebleu -tok 'none' -s 'none' ${source_lang}_${target_lang}.ref < ${source_lang}_${target_lang}.hyp +``` + +# mBART50 models + +* [mMBART 50 pretrained model](https://dl.fbaipublicfiles.com/fairseq/models/mbart50/mbart50.pretrained.tar.gz). +* [mMBART 50 finetuned many-to-one](https://dl.fbaipublicfiles.com/fairseq/models/mbart50/mbart50.ft.n1.tar.gz). +* [mMBART 50 finetuned one-to-many](https://dl.fbaipublicfiles.com/fairseq/models/mbart50/mbart50.ft.1n.tar.gz). +* [mMBART 50 finetuned many-to-many](https://dl.fbaipublicfiles.com/fairseq/models/mbart50/mbart50.ft.nn.tar.gz). + +Please download and extract from the above tarballs. Each tarball contains +* The fairseq model checkpoint: model.pt +* The list of supported languages: ML50_langs.txt +* Sentence piece model: sentence.bpe.model +* Fairseq dictionary of each language: dict.{lang}.txt (please replace lang with a language specified in ML50_langs.txt) + +To use the trained models, +* use the tool [binarize.py](./data_scripts/binarize.py) to binarize your data using sentence.bpe.model and dict.{lang}.txt, and copy the dictionaries to your data path +* then run the generation command: +```bash +path_2_data= +model=/model.pt +lang_list=/ML50_langs.txt +source_lang= +target_lang= + +fairseq-generate $path_2_data \ + --path $model \ + --task translation_multi_simple_epoch \ + --gen-subset test \ + --source-lang $source_lang \ + --target-lang $target_lang + --sacrebleu --remove-bpe 'sentencepiece'\ + --batch-size 32 \ + --encoder-langtok "src" \ + --decoder-langtok \ + --lang-dict "$lang_list" +``` + +## Citation + +```bibtex +@article{tang2020multilingual, + title={Multilingual Translation with Extensible Multilingual Pretraining and Finetuning}, + author={Yuqing Tang and Chau Tran and Xian Li and Peng-Jen Chen and Naman Goyal and Vishrav Chaudhary and Jiatao Gu and Angela Fan}, + year={2020}, + eprint={2008.00401}, + archivePrefix={arXiv}, + primaryClass={cs.CL} +} +``` diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/README.md b/SpeechT5/fairseq/examples/multilingual/data_scripts/README.md new file mode 100644 index 0000000..cc610c0 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/README.md @@ -0,0 +1,24 @@ + +# Install dependency +```bash +pip install -r requirement.txt +``` + +# Download the data set +```bash +export WORKDIR_ROOT= + +``` +The downloaded data will be at $WORKDIR_ROOT/ML50 + +# preprocess the data +Install SPM [here](https://github.com/google/sentencepiece) +```bash +export WORKDIR_ROOT= +export SPM_PATH= +``` +* $WORKDIR_ROOT/ML50/raw: extracted raw data +* $WORKDIR_ROOT/ML50/dedup: dedup data +* $WORKDIR_ROOT/ML50/clean: data with valid and test sentences removed from the dedup data + + diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/binarize.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/binarize.py new file mode 100644 index 0000000..ee54c6a --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/binarize.py @@ -0,0 +1,200 @@ +import shutil +import os, sys +from subprocess import check_call, check_output +import glob +import argparse +import shutil +import pathlib +import itertools + +def call_output(cmd): + print(f"Executing: {cmd}") + ret = check_output(cmd, shell=True) + print(ret) + return ret + +def call(cmd): + print(cmd) + check_call(cmd, shell=True) + + +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + +SPM_PATH = os.environ.get('SPM_PATH', None) + +if SPM_PATH is None or not SPM_PATH.strip(): + print("Please install sentence piecence from https://github.com/google/sentencepiece and set SPM_PATH pointing to the installed spm_encode.py. Exitting...") + sys.exit(-1) + + +SPM_MODEL = f'{WORKDIR_ROOT}/sentence.bpe.model' +SPM_VOCAB = f'{WORKDIR_ROOT}/dict_250k.txt' + +SPM_ENCODE = f'{SPM_PATH}' + +if not os.path.exists(SPM_MODEL): + call(f"wget https://dl.fbaipublicfiles.com/fairseq/models/mbart50/sentence.bpe.model -O {SPM_MODEL}") + + +if not os.path.exists(SPM_VOCAB): + call(f"wget https://dl.fbaipublicfiles.com/fairseq/models/mbart50/dict_250k.txt -O {SPM_VOCAB}") + + + +def get_data_size(raw): + cmd = f'wc -l {raw}' + ret = call_output(cmd) + return int(ret.split()[0]) + +def encode_spm(model, direction, prefix='', splits=['train', 'test', 'valid'], pairs_per_shard=None): + src, tgt = direction.split('-') + + for split in splits: + src_raw, tgt_raw = f'{RAW_DIR}/{split}{prefix}.{direction}.{src}', f'{RAW_DIR}/{split}{prefix}.{direction}.{tgt}' + if os.path.exists(src_raw) and os.path.exists(tgt_raw): + cmd = f"""python {SPM_ENCODE} \ + --model {model}\ + --output_format=piece \ + --inputs {src_raw} {tgt_raw} \ + --outputs {BPE_DIR}/{direction}{prefix}/{split}.bpe.{src} {BPE_DIR}/{direction}{prefix}/{split}.bpe.{tgt} """ + print(cmd) + call(cmd) + + +def binarize_( + bpe_dir, + databin_dir, + direction, spm_vocab=SPM_VOCAB, + splits=['train', 'test', 'valid'], +): + src, tgt = direction.split('-') + + try: + shutil.rmtree(f'{databin_dir}', ignore_errors=True) + os.mkdir(f'{databin_dir}') + except OSError as error: + print(error) + cmds = [ + "fairseq-preprocess", + f"--source-lang {src} --target-lang {tgt}", + f"--destdir {databin_dir}/", + f"--workers 8", + ] + if isinstance(spm_vocab, tuple): + src_vocab, tgt_vocab = spm_vocab + cmds.extend( + [ + f"--srcdict {src_vocab}", + f"--tgtdict {tgt_vocab}", + ] + ) + else: + cmds.extend( + [ + f"--joined-dictionary", + f"--srcdict {spm_vocab}", + ] + ) + input_options = [] + if 'train' in splits and glob.glob(f"{bpe_dir}/train.bpe*"): + input_options.append( + f"--trainpref {bpe_dir}/train.bpe", + ) + if 'valid' in splits and glob.glob(f"{bpe_dir}/valid.bpe*"): + input_options.append(f"--validpref {bpe_dir}/valid.bpe") + if 'test' in splits and glob.glob(f"{bpe_dir}/test.bpe*"): + input_options.append(f"--testpref {bpe_dir}/test.bpe") + if len(input_options) > 0: + cmd = " ".join(cmds + input_options) + print(cmd) + call(cmd) + + +def binarize( + databin_dir, + direction, spm_vocab=SPM_VOCAB, prefix='', + splits=['train', 'test', 'valid'], + pairs_per_shard=None, +): + def move_databin_files(from_folder, to_folder): + for bin_file in glob.glob(f"{from_folder}/*.bin") \ + + glob.glob(f"{from_folder}/*.idx") \ + + glob.glob(f"{from_folder}/dict*"): + try: + shutil.move(bin_file, to_folder) + except OSError as error: + print(error) + bpe_databin_dir = f"{BPE_DIR}/{direction}{prefix}_databin" + bpe_dir = f"{BPE_DIR}/{direction}{prefix}" + if pairs_per_shard is None: + binarize_(bpe_dir, bpe_databin_dir, direction, spm_vocab=spm_vocab, splits=splits) + move_databin_files(bpe_databin_dir, databin_dir) + else: + # binarize valid and test which will not be sharded + binarize_( + bpe_dir, bpe_databin_dir, direction, + spm_vocab=spm_vocab, splits=[s for s in splits if s != "train"]) + for shard_bpe_dir in glob.glob(f"{bpe_dir}/shard*"): + path_strs = os.path.split(shard_bpe_dir) + shard_str = path_strs[-1] + shard_folder = f"{bpe_databin_dir}/{shard_str}" + databin_shard_folder = f"{databin_dir}/{shard_str}" + print(f'working from {shard_folder} to {databin_shard_folder}') + os.makedirs(databin_shard_folder, exist_ok=True) + binarize_( + shard_bpe_dir, shard_folder, direction, + spm_vocab=spm_vocab, splits=["train"]) + + for test_data in glob.glob(f"{bpe_databin_dir}/valid.*") + glob.glob(f"{bpe_databin_dir}/test.*"): + filename = os.path.split(test_data)[-1] + try: + os.symlink(test_data, f"{databin_shard_folder}/{filename}") + except OSError as error: + print(error) + move_databin_files(shard_folder, databin_shard_folder) + + +def load_langs(path): + with open(path) as fr: + langs = [l.strip() for l in fr] + return langs + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--data_root", default=f"{WORKDIR_ROOT}/ML50") + parser.add_argument("--raw-folder", default='raw') + parser.add_argument("--bpe-folder", default='bpe') + parser.add_argument("--databin-folder", default='databin') + + args = parser.parse_args() + + DATA_PATH = args.data_root #'/private/home/yuqtang/public_data/ML50' + RAW_DIR = f'{DATA_PATH}/{args.raw_folder}' + BPE_DIR = f'{DATA_PATH}/{args.bpe_folder}' + DATABIN_DIR = f'{DATA_PATH}/{args.databin_folder}' + os.makedirs(BPE_DIR, exist_ok=True) + + raw_files = itertools.chain( + glob.glob(f'{RAW_DIR}/train*'), + glob.glob(f'{RAW_DIR}/valid*'), + glob.glob(f'{RAW_DIR}/test*'), + ) + + directions = [os.path.split(file_path)[-1].split('.')[1] for file_path in raw_files] + + for direction in directions: + prefix = "" + splits = ['train', 'valid', 'test'] + try: + shutil.rmtree(f'{BPE_DIR}/{direction}{prefix}', ignore_errors=True) + os.mkdir(f'{BPE_DIR}/{direction}{prefix}') + os.makedirs(DATABIN_DIR, exist_ok=True) + except OSError as error: + print(error) + spm_model, spm_vocab = SPM_MODEL, SPM_VOCAB + encode_spm(spm_model, direction=direction, splits=splits) + binarize(DATABIN_DIR, direction, spm_vocab=spm_vocab, splits=splits) diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/check_iswlt_test_data.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/check_iswlt_test_data.py new file mode 100644 index 0000000..f8e2eb0 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/check_iswlt_test_data.py @@ -0,0 +1,67 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import os, sys +import subprocess +import re +from subprocess import check_call, check_output + +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + + +BLEU_REGEX = re.compile("^BLEU\\S* = (\\S+) ") +def run_eval_bleu(cmd): + output = check_output(cmd, shell=True, stderr=subprocess.STDOUT).decode("utf-8").strip() + print(output) + bleu = -1.0 + for line in output.strip().split('\n'): + m = BLEU_REGEX.search(line) + if m is not None: + bleu = m.groups()[0] + bleu = float(bleu) + break + return bleu + +def check_data_test_bleu(raw_folder, data_lang_pairs): + not_matchings = [] + for sacrebleu_set, src_tgts in data_lang_pairs: + for src_tgt in src_tgts: + print(f'checking test bleus for: {src_tgt} at {sacrebleu_set}') + src, tgt = src_tgt.split('-') + ssrc, stgt = src[:2], tgt[:2] + if os.path.exists(f'{raw_folder}/test.{tgt}-{src}.{src}'): + # reversed direction may have different test set + test_src = f'{raw_folder}/test.{tgt}-{src}.{src}' + else: + test_src = f'{raw_folder}/test.{src}-{tgt}.{src}' + cmd1 = f'cat {test_src} | sacrebleu -t "{sacrebleu_set}" -l {stgt}-{ssrc}; [ $? -eq 0 ] || echo ""' + test_tgt = f'{raw_folder}/test.{src}-{tgt}.{tgt}' + cmd2 = f'cat {test_tgt} | sacrebleu -t "{sacrebleu_set}" -l {ssrc}-{stgt}; [ $? -eq 0 ] || echo ""' + bleu1 = run_eval_bleu(cmd1) + if bleu1 != 100.0: + not_matchings.append(f'{sacrebleu_set}:{src_tgt} source side not matching: {test_src}') + bleu2 = run_eval_bleu(cmd2) + if bleu2 != 100.0: + not_matchings.append(f'{sacrebleu_set}:{src_tgt} target side not matching: {test_tgt}') + return not_matchings + +if __name__ == "__main__": + to_data_path = f'{WORKDIR_ROOT}/iwsltv2' + not_matching = check_data_test_bleu( + f'{to_data_path}/raw', + [ + ('iwslt17', ['en_XX-ar_AR', 'en_XX-ko_KR', 'ar_AR-en_XX', 'ko_KR-en_XX']), + ('iwslt17', ['en_XX-it_IT', 'en_XX-nl_XX', 'it_IT-en_XX', 'nl_XX-en_XX']), + ('iwslt17/tst2015', ['en_XX-vi_VN', "vi_VN-en_XX"]), + ] + ) + if len(not_matching) > 0: + print('the following datasets do not have matching test datasets:\n\t', '\n\t'.join(not_matching)) + diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/check_self_overlaps.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/check_self_overlaps.py new file mode 100644 index 0000000..07b338d --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/check_self_overlaps.py @@ -0,0 +1,103 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import os +import glob +import argparse +from utils.dedup import deup +import sys + +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + +def get_directions(folder): + raw_files = glob.glob(f'{folder}/train*') + directions = [os.path.split(file_path)[-1].split('.')[1] for file_path in raw_files] + return directions + +def diff_list(lhs, rhs): + return set(lhs).difference(set(rhs)) + +def check_diff( + from_src_file, from_tgt_file, + to_src_file, to_tgt_file, +): + seen_in_from = set() + seen_src_in_from = set() + seen_tgt_in_from = set() + from_count = 0 + with open(from_src_file, encoding='utf-8') as fsrc, \ + open(from_tgt_file, encoding='utf-8') as ftgt: + for s, t in zip(fsrc, ftgt): + seen_in_from.add((s, t)) + seen_src_in_from.add(s) + seen_tgt_in_from.add(t) + from_count += 1 + common = 0 + common_src = 0 + common_tgt = 0 + to_count = 0 + seen = set() + + with open(to_src_file, encoding='utf-8') as fsrc, \ + open(to_tgt_file, encoding='utf-8') as ftgt: + for s, t in zip(fsrc, ftgt): + to_count += 1 + if (s, t) not in seen: + if (s, t) in seen_in_from: + common += 1 + if s in seen_src_in_from: + common_src += 1 + seen_src_in_from.remove(s) + if t in seen_tgt_in_from: + common_tgt += 1 + seen_tgt_in_from.remove(t) + seen.add((s, t)) + return common, common_src, common_tgt, from_count, to_count + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--folder", type=str, required=True, + help="the data folder ") + parser.add_argument("--split", type=str, default='test', + help="split (valid, test) to check against training data") + parser.add_argument('--directions', type=str, default=None, required=False) + + args = parser.parse_args() + + if args.directions is None: + directions = set(get_directions(args.folder)) + directions = sorted(directions) + else: + directions = args.directions.split(',') + directions = sorted(set(directions)) + + results = [] + print(f'checking where {args.split} split data are in training') + print(f'direction\tcommon_count\tsrc common\ttgt common\tfrom_size\tto_size') + + for direction in directions: + src, tgt = direction.split('-') + from_src_file = f'{args.folder}/{args.split}.{src}-{tgt}.{src}' + from_tgt_file = f'{args.folder}/{args.split}.{src}-{tgt}.{tgt}' + if not os.path.exists(from_src_file): + # some test/valid data might in reverse directinos: + from_src_file = f'{args.folder}/{args.split}.{tgt}-{src}.{src}' + from_tgt_file = f'{args.folder}/{args.split}.{tgt}-{src}.{tgt}' + to_src_file = f'{args.folder}/train.{src}-{tgt}.{src}' + to_tgt_file = f'{args.folder}/train.{src}-{tgt}.{tgt}' + if not os.path.exists(to_src_file) or not os.path.exists(from_src_file): + continue + r = check_diff(from_src_file, from_tgt_file, to_src_file, to_tgt_file) + results.append(r) + print(f'{direction}\t', '\t'.join(map(str, r))) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/check_valid_test_overlaps.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/check_valid_test_overlaps.py new file mode 100644 index 0000000..40fa9ae --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/check_valid_test_overlaps.py @@ -0,0 +1,124 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import os +import argparse +import pandas as pd +import sys + + +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + +def load_langs(path): + with open(path) as fr: + langs = [l.strip() for l in fr] + return langs + + + +def load_sentences(raw_data, split, direction): + src, tgt = direction.split('-') + src_path = f"{raw_data}/{split}.{direction}.{src}" + tgt_path = f"{raw_data}/{split}.{direction}.{tgt}" + if os.path.exists(src_path) and os.path.exists(tgt_path): + return [(src, open(src_path).read().splitlines()), (tgt, open(tgt_path).read().splitlines())] + else: + return [] + +def swap_direction(d): + src, tgt = d.split('-') + return f'{tgt}-{src}' + +def get_all_test_data(raw_data, directions, split='test'): + test_data = [ + x + for dd in directions + for d in [dd, swap_direction(dd)] + for x in load_sentences(raw_data, split, d) + ] + # all_test_data = {s for _, d in test_data for s in d} + all_test_data = {} + for lang, d in test_data: + for s in d: + s = s.strip() + lgs = all_test_data.get(s, set()) + lgs.add(lang) + all_test_data[s] = lgs + return all_test_data, test_data + + +def check_train_sentences(src_path, tgt_path, direction, all_test_data, mess_up_train={}): + # src, tgt = direction.split('-') + print(f'check training data for {direction} in {src_path} and {tgt_path}') + size = 0 + overlapped_size_counted_dup = 0 + if not os.path.exists(tgt_path) or not os.path.exists(src_path): + return mess_up_train, size, overlapped_size_counted_dup + + with open(src_path) as f, open(tgt_path) as g: + for src_line, tgt_line in zip(f, g): + s = src_line.strip() + t = tgt_line.strip() + size += 1 + if s in all_test_data: + langs = mess_up_train.get(s, set()) + langs.add(direction) + mess_up_train[s] = langs + overlapped_size_counted_dup += 1 + if t in all_test_data: + langs = mess_up_train.get(t, set()) + langs.add(direction) + mess_up_train[t] = langs + overlapped_size_counted_dup += 1 + print(f'{direction}: size={size}, overlapped={overlapped_size_counted_dup}') + return mess_up_train, size, overlapped_size_counted_dup + +def check_train_all(raw_data, directions, all_test_data): + mess_up_train = {} + data_sizes = {} + # raw_data = '~chau/data-bin/MineBART/multilingual_mined_100M/en_XX/et_EE-en_XX/all.{en_XX, et_EE}' + print(f'checking training data againsts # {len(all_test_data)} sentences') + print(f'example test data: ', [s for i, s in enumerate(all_test_data.keys()) if i < 10]) + for direction in directions: + src, tgt = direction.split('-') + path = f'{raw_data}/en_XX/{direction}/all' + src_path = f'{path}.{src}' + tgt_path = f'{path}.{tgt}' + print(f'checking {src_path} {tgt_path}') + _, size, overlapped_size_counted_dup = check_train_sentences(src_path, tgt_path, direction, all_test_data, mess_up_train) + data_sizes[direction] = (size, overlapped_size_counted_dup) + return mess_up_train, data_sizes + + + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--folder", type=str, required=True, + help="the data folder ") + parser.add_argument("--test-data", type=str, required=True, + help="the test data folder ") + parser.add_argument('--directions', type=str, default=None, required=False) + + args = parser.parse_args() + directions = args.directions.split(',') + directions = sorted(set(directions)) + + results = [] + # print(f'checking where {args.split} split data are in training') + # print(f'direction\tcommon_count\tsrc common\ttgt common\tfrom_size\tto_size') + raw_data = args.folder + all_test_data, test_data = get_all_test_data(args.test_data, directions, split='test') + mess_up_train, data_sizes = check_train_all(raw_data, directions, all_test_data) + print(data_sizes) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/dedup_all.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/dedup_all.py new file mode 100644 index 0000000..ef39c05 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/dedup_all.py @@ -0,0 +1,52 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + + +import os +import glob +import argparse +from utils.dedup import deup + +import sys +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--from-folder", type=str, required=True, + help="the data folder to be dedup") + parser.add_argument("--to-folder", type=str, required=True, + help="the data folder to save deduped data") + parser.add_argument('--directions', type=str, default=None, required=False) + + args = parser.parse_args() + + if args.directions is None: + raw_files = glob.glob(f'{args.from_folder}/train*') + + directions = [os.path.split(file_path)[-1].split('.')[1] for file_path in raw_files] + else: + directions = args.directions.split(',') + directions = sorted(set(directions)) + + for direction in directions: + src, tgt = direction.split('-') + src_file = f'{args.from_folder}/train.{src}-{tgt}.{src}' + tgt_file = f'{args.from_folder}/train.{src}-{tgt}.{tgt}' + src_file_out = f'{args.to_folder}/train.{src}-{tgt}.{src}' + tgt_file_out = f'{args.to_folder}/train.{src}-{tgt}.{tgt}' + assert src_file != src_file_out + assert tgt_file != tgt_file_out + print(f'deduping {src_file}, {tgt_file}') + deup(src_file, tgt_file, src_file_out, tgt_file_out) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_ML50_v1.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_ML50_v1.sh new file mode 100644 index 0000000..99fbc75 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_ML50_v1.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + +# first run download_wmt20.sh; it will install a few useful tools for other scripts +# TODO: need to print out instructions on downloading a few files which requires manually authentication from the websites +bash ./download_wmt20.sh + +python ./download_wmt19_and_before.py +bash ./download_wat19_my.sh +python ./download_ted_and_extract.py +bash ./download_lotus.sh +bash ./download_iitb.sh +bash ./download_af_xh.sh + + +# IWSLT downloading URLs have changed in between; TODO: fix them: +bash ./download_iwslt_and_extract.sh + +# TODO: globalvoices URLs changed; need to be fixed +bash ./download_flores_data.sh diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_af_xh.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_af_xh.sh new file mode 100644 index 0000000..a78fbbb --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_af_xh.sh @@ -0,0 +1,164 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +# set -x -e + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + + +# put intermediate files +TMP_DIR=$WORKDIR_ROOT/temp/af_xhv2 +# output {train,valid,test} files to dest +DEST=${WORKDIR_ROOT}/ML50/raw + + + +ROOT=${WORKDIR_ROOT} +UTILS=$PWD/utils +TMX2CORPUS="${UTILS}/tmx2corpus" +TMX_TOOL="python ${TMX2CORPUS}/tmx2corpus.py" + +mkdir -p $TMP_DIR +mkdir -p $DEST +mkdir -p $UTILS + +function download_opus(){ + src=$1 + tgt=$2 + subset=$3 + ulr=$4 + + mkdir extract_$subset.$src-$tgt + pushd extract_$subset.$src-$tgt + if [ ! -f "$subset.$src-$tgt.tmx.gz" ]; then + wget $url -O "$subset.$src-$tgt.tmx.gz" + gzip -d "$subset.$src-$tgt.tmx.gz" + f=$subset.$src-$tgt.tmx + $TMX_TOOL $f + mv bitext.$src ../$subset.$src-$tgt.$src + mv bitext.$tgt ../$subset.$src-$tgt.$tgt + fi + popd +} + +function concat_subsets(){ + src=$1 + tgt=$2 + subsets=$3 + src_train=raw_train.$src-$tgt.$src + tgt_train=raw_train.$src-$tgt.$tgt + > $src_train + > $tgt_train + for subset in $subsets; do + cat $subset.$src-$tgt.$src >> $src_train + cat $subset.$src-$tgt.$tgt >> $tgt_train + done +} + + + +function get_seeded_random() +{ + seed="$1" + openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \ + /dev/null +} + +function split_train_valid(){ + src=$1 + tgt=$2 + raw_src_train=raw_train.$src-$tgt.$src + raw_tgt_train=raw_train.$src-$tgt.$tgt + + shuf --random-source=<(get_seeded_random 43) $raw_src_train > shuffled.$src-$tgt.$src + shuf --random-source=<(get_seeded_random 43) $raw_tgt_train > shuffled.$src-$tgt.$tgt + + head -n 1500 shuffled.$src-$tgt.$src > valid.$src-$tgt.$src + head -n 1500 shuffled.$src-$tgt.$tgt > valid.$src-$tgt.$tgt + + tail +1501 shuffled.$src-$tgt.$src > train.$src-$tgt.$src + tail +1501 shuffled.$src-$tgt.$tgt > train.$src-$tgt.$tgt +} + +function copy2dst(){ + lsrc=$1 + ltgt=$2 + src=${lsrc:0:2} + tgt=${ltgt:0:2} + + + cp valid.$src-$tgt.$src $DEST/valid.$lsrc-$ltgt.$lsrc + cp valid.$src-$tgt.$tgt $DEST/valid.$lsrc-$ltgt.$ltgt + + cp train.$src-$tgt.$src $DEST/train.$lsrc-$ltgt.$lsrc + cp train.$src-$tgt.$tgt $DEST/train.$lsrc-$ltgt.$ltgt +} + + + + +#for xh-en +declare -A xh_en_urls +xh_en_urls=( + [Tatoeba]=https://object.pouta.csc.fi/OPUS-Tatoeba/v20190709/tmx/en-xh.tmx.gz + [wikimedia]=https://object.pouta.csc.fi/OPUS-wikimedia/v20190628/tmx/en-xh.tmx.gz + [memat]=https://object.pouta.csc.fi/OPUS-memat/v1/tmx/en-xh.tmx.gz + [uedin]=https://object.pouta.csc.fi/OPUS-bible-uedin/v1/tmx/en-xh.tmx.gz + [GNOME]=https://object.pouta.csc.fi/OPUS-GNOME/v1/tmx/en-xh.tmx.gz + [XhosaNavy]=https://object.pouta.csc.fi/OPUS-XhosaNavy/v1/tmx/en-xh.tmx.gz + [KDE4]=https://object.pouta.csc.fi/OPUS-KDE4/v2/tmx/en-xh.tmx.gz + [Ubuntu]=https://object.pouta.csc.fi/OPUS-Ubuntu/v14.10/tmx/en-xh.tmx.gz +) + +mkdir $TMP_DIR/xh-en +pushd $TMP_DIR/xh-en +for k in "${!xh_en_urls[@]}" +do + name=$k + url=${xh_en_urls[$k]} + echo "$name: $url" + download_opus xh en $name $ulr +done +concat_subsets xh en "${!xh_en_urls[@]}" +split_train_valid xh en +copy2dst xh_ZA en_XX +popd + + +## +#for af-en +declare -A af_en_urls +af_en_urls=( + [Tatoeba]=https://object.pouta.csc.fi/OPUS-Tatoeba/v20190709/tmx/af-en.tmx.gz + [uedin]=https://object.pouta.csc.fi/OPUS-bible-uedin/v1/tmx/af-en.tmx.gz + [GNOME]=https://object.pouta.csc.fi/OPUS-GNOME/v1/tmx/af-en.tmx.gz + [QED]=https://object.pouta.csc.fi/OPUS-QED/v2.0a/tmx/af-en.tmx.gz + [KDE4]=https://object.pouta.csc.fi/OPUS-KDE4/v2/tmx/af-en.tmx.gz + [OpenSubtitles]=https://object.pouta.csc.fi/OPUS-OpenSubtitles/v2018/tmx/af-en.tmx.gz + [SPC]=https://object.pouta.csc.fi/OPUS-SPC/v1/tmx/af-en.tmx.gz + [Ubuntu]=https://object.pouta.csc.fi/OPUS-Ubuntu/v14.10/tmx/af-en.tmx.gz +) + +mkdir $TMP_DIR/af-en +pushd $TMP_DIR/af-en +for k in "${!af_en_urls[@]}" +do + name=$k + url=${af_en_urls[$k]} + echo "$name: $url" + download_opus af en $name $ulr +done +concat_subsets af en "${!af_en_urls[@]}" +split_train_valid af en +copy2dst af_ZA en_XX +popd + + diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_flores_data.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_flores_data.sh new file mode 100644 index 0000000..e6175ce --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_flores_data.sh @@ -0,0 +1,246 @@ +#!/bin/bash + +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. +# + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + + +set -e +set -o pipefail + +SRC=en +SI_TGT=si +NE_TGT=ne + +DESTDIR=${WORKDIR_ROOT}/ML50/raw/ + +ROOT=${WORKDIR_ROOT}/tmp +mkdir -p $ROOT +DATA=$ROOT/data +NE_ROOT=$DATA/all-clean-ne +SI_ROOT=$DATA/all-clean-si + +mkdir -p $DATA $NE_ROOT $SI_ROOT + +SI_OPUS_DATASETS=( + "$SI_ROOT/GNOME.en-si" + "$SI_ROOT/Ubuntu.en-si" + "$SI_ROOT/KDE4.en-si" + "$SI_ROOT/OpenSubtitles.en-si" +) + +SI_OPUS_URLS=( + "https://object.pouta.csc.fi/OPUS-GNOME/v1/moses/en-si.txt.zip" + "https://object.pouta.csc.fi/OPUS-Ubuntu/v14.10/moses/en-si.txt.zip" + "https://object.pouta.csc.fi/OPUS-KDE4/v2/moses/en-si.txt.zip" + "https://object.pouta.csc.fi/OPUS-OpenSubtitles/v2018/moses/en-si.txt.zip" +) + +NE_OPUS_DATASETS=( + "$NE_ROOT/GNOME.en-ne" + "$NE_ROOT/Ubuntu.en-ne" + "$NE_ROOT/KDE4.en-ne" +) + +NE_OPUS_URLS=( + "https://object.pouta.csc.fi/OPUS-GNOME/v1/moses/en-ne.txt.zip" + "https://object.pouta.csc.fi/OPUS-Ubuntu/v14.10/moses/en-ne.txt.zip" + "https://object.pouta.csc.fi/OPUS-KDE4/v2/moses/en-ne.txt.zip" +) + +REMOVE_FILE_PATHS=() + +# Download data +download_data() { + CORPORA=$1 + URL=$2 + + if [ -f $CORPORA ]; then + echo "$CORPORA already exists, skipping download" + else + echo "Downloading $URL" + wget $URL -O $CORPORA --no-check-certificate || rm -f $CORPORA + if [ -f $CORPORA ]; then + echo "$URL successfully downloaded." + else + echo "$URL not successfully downloaded." + rm -f $CORPORA + exit -1 + fi + fi +} + +# Example: download_opus_data $LANG_ROOT $TGT +download_opus_data() { + LANG_ROOT=$1 + TGT=$2 + + if [ "$TGT" = "si" ]; then + URLS=("${SI_OPUS_URLS[@]}") + DATASETS=("${SI_OPUS_DATASETS[@]}") + else + URLS=("${NE_OPUS_URLS[@]}") + DATASETS=("${NE_OPUS_DATASETS[@]}") + fi + + # Download and extract data + for ((i=0;i<${#URLS[@]};++i)); do + URL=${URLS[i]} + CORPORA=${DATASETS[i]} + + download_data $CORPORA $URL + unzip -o $CORPORA -d $LANG_ROOT + REMOVE_FILE_PATHS+=( $CORPORA $CORPORA.xml $CORPORA.ids $LANG_ROOT/README $LANG_ROOT/LICENSE ) + done + + cat ${DATASETS[0]}.$SRC ${DATASETS[1]}.$SRC ${DATASETS[2]}.$SRC > $LANG_ROOT/GNOMEKDEUbuntu.$SRC-$TGT.$SRC + cat ${DATASETS[0]}.$TGT ${DATASETS[1]}.$TGT ${DATASETS[2]}.$TGT > $LANG_ROOT/GNOMEKDEUbuntu.$SRC-$TGT.$TGT + + REMOVE_FILE_PATHS+=( ${DATASETS[0]}.$SRC ${DATASETS[1]}.$SRC ${DATASETS[2]}.$SRC ) + REMOVE_FILE_PATHS+=( ${DATASETS[0]}.$TGT ${DATASETS[1]}.$TGT ${DATASETS[2]}.$TGT ) +} + +download_opus_data $SI_ROOT $SI_TGT +cp ${SI_OPUS_DATASETS[3]}.$SRC $SI_ROOT/OpenSubtitles2018.$SRC-$SI_TGT.$SRC +cp ${SI_OPUS_DATASETS[3]}.$SI_TGT $SI_ROOT/OpenSubtitles2018.$SRC-$SI_TGT.$SI_TGT +REMOVE_FILE_PATHS+=( ${SI_OPUS_DATASETS[3]}.$SRC ${SI_OPUS_DATASETS[3]}.$SI_TGT ) + +download_opus_data $NE_ROOT $NE_TGT + + +# Download and extract Global Voices data +GLOBAL_VOICES="$NE_ROOT/globalvoices.2018q4.ne-en" +GLOBAL_VOICES_URL="http://www.casmacat.eu/corpus/global-voices/globalvoices.ne-en.xliff.gz" + +download_data $GLOBAL_VOICES.gz $GLOBAL_VOICES_URL +gunzip -Nf $GLOBAL_VOICES.gz + +sed -ne 's?.*\(.*\).*?\1?p' $GLOBAL_VOICES > $GLOBAL_VOICES.$NE_TGT +sed -ne 's?.*]*>\(.*\).*?\1?p' $GLOBAL_VOICES > $GLOBAL_VOICES.$SRC + +REMOVE_FILE_PATHS+=( $GLOBAL_VOICES ) + +# Download and extract the bible dataset +BIBLE_TOOLS=bible-corpus-tools +XML_BIBLES=XML_Bibles +XML_BIBLES_DUP=XML_Bibles_dup + +if [ ! -e $BIBLE_TOOLS ]; then + echo "Cloning bible-corpus-tools repository..." + git clone https://github.com/christos-c/bible-corpus-tools.git +fi + +mkdir -p $BIBLE_TOOLS/bin $XML_BIBLES $XML_BIBLES_DUP +javac -cp "$BIBLE_TOOLS/lib/*" -d $BIBLE_TOOLS/bin $BIBLE_TOOLS/src/bible/readers/*.java $BIBLE_TOOLS/src/bible/*.java + +download_data bible.tar.gz "https://github.com/christos-c/bible-corpus/archive/v1.2.1.tar.gz" +tar xvzf bible.tar.gz + +cp bible-corpus-1.2.1/bibles/{Greek.xml,English.xml,Nepali.xml} $XML_BIBLES/ +cp bible-corpus-1.2.1/bibles/{Greek.xml,English-WEB.xml,Nepali.xml} $XML_BIBLES_DUP/ + +java -cp $BIBLE_TOOLS/lib/*:$BIBLE_TOOLS/bin bible.CreateMLBooks $XML_BIBLES +java -cp $BIBLE_TOOLS/lib/*:$BIBLE_TOOLS/bin bible.CreateMLBooks $XML_BIBLES_DUP +java -cp $BIBLE_TOOLS/lib/*:$BIBLE_TOOLS/bin bible.CreateVerseAlignedBooks $XML_BIBLES +java -cp $BIBLE_TOOLS/lib/*:$BIBLE_TOOLS/bin bible.CreateVerseAlignedBooks $XML_BIBLES_DUP + +cat $XML_BIBLES/aligned/*/English.txt > $NE_ROOT/bible.$SRC-$NE_TGT.$SRC +cat $XML_BIBLES/aligned/*/Nepali.txt > $NE_ROOT/bible.$SRC-$NE_TGT.$NE_TGT +cat $XML_BIBLES_DUP/aligned/*/English-WEB.txt > $NE_ROOT/bible_dup.$SRC-$NE_TGT.$SRC +cat $XML_BIBLES_DUP/aligned/*/Nepali.txt > $NE_ROOT/bible_dup.$SRC-$NE_TGT.$NE_TGT +REMOVE_FILE_PATHS+=( bible-corpus-1.2.1 bible.tar.gz $BIBLE_TOOLS $XML_BIBLES $XML_BIBLES_DUP ) + +# Download and extract the Penn Treebank dataset +NE_TAGGED=$ROOT/new_submissions_parallel_corpus_project_Nepal +NE_TAGGED_URL="http://www.cle.org.pk/Downloads/ling_resources/parallelcorpus/NepaliTaggedCorpus.zip" +EN_TAGGED_PATCH_URL="https://dl.fbaipublicfiles.com/fairseq/data/nepali-penn-treebank.en.patch" +NE_TAGGED_PATCH_URL="https://dl.fbaipublicfiles.com/fairseq/data/nepali-penn-treebank.ne.patch" +MOSES=mosesdecoder +MOSES_TOK=$MOSES/scripts/tokenizer +EN_PATCH_REGEX="{s:\\\/:\/:g;s/\*\T\*\-\n+//g;s/\-LCB\-/\{/g;s/\-RCB\-/\}/g; s/\-LSB\-/\[/g; s/\-RSB\-/\]/g;s/\-LRB\-/\(/g; s/\-RRB\-/\)/g; s/\'\'/\"/g; s/\`\`/\"/g; s/\ +\'s\ +/\'s /g; s/\ +\'re\ +/\'re /g; s/\"\ +/\"/g; s/\ +\"/\"/g; s/\ n't([\ \.\"])/n't\1/g; s/\r+(.)/\1/g;}" +NE_PATCH_REGEX="{s:\p{Cf}::g;s:\\\/:\/:g;s/\*\T\*\-\n+//g;s/\-LCB\-/\{/g;s/\-RCB\-/\}/g; s/\-LSB\-/\[/g; s/\-RSB\-/\]/g;s/\-LRB\-/\(/g; s/\-RRB\-/\)/g; s/\'\'/\"/g; s/\`\`/\"/g; s/\ +\'s\ +/\'s /g; s/\ +\'re\ +/\'re /g; s/\"\ +/\"/g; s/\ +\"/\"/g; s/\ n't([\ \.\"])/n't\1/g; s/\r+(.)/\1/g;}" + +download_data $DATA/nepali-penn-treebank.$SRC.patch $EN_TAGGED_PATCH_URL +download_data $DATA/nepali-penn-treebank.$NE_TGT.patch $NE_TAGGED_PATCH_URL +download_data original.zip $NE_TAGGED_URL +unzip -o original.zip -d $ROOT + +cat $NE_TAGGED/00.txt $NE_TAGGED/01.txt $NE_TAGGED/02.txt > $NE_TAGGED/nepali-penn-treebank.$SRC +cat $NE_TAGGED/00ne_revised.txt $NE_TAGGED/01ne_revised.txt $NE_TAGGED/02ne_revised.txt > $NE_TAGGED/nepali-penn-treebank.$NE_TGT + +patch $NE_TAGGED/nepali-penn-treebank.$SRC -i $DATA/nepali-penn-treebank.$SRC.patch -o $NE_TAGGED/nepali-penn-treebank-patched.$SRC +patch $NE_TAGGED/nepali-penn-treebank.$NE_TGT -i $DATA/nepali-penn-treebank.$NE_TGT.patch -o $NE_TAGGED/nepali-penn-treebank-patched.$NE_TGT + +if [ ! -e $MOSES ]; then + echo "Cloning moses repository..." + git clone https://github.com/moses-smt/mosesdecoder.git +fi + +cat $NE_TAGGED/nepali-penn-treebank-patched.$SRC | \ + perl -anpe "$EN_PATCH_REGEX" | \ + $MOSES_TOK/tokenizer.perl -l $SRC | \ + $MOSES_TOK/detokenizer.perl -l $SRC > $NE_ROOT/nepali-penn-treebank.$SRC + +cat $NE_TAGGED/nepali-penn-treebank-patched.$NE_TGT | \ + perl -CIO -anpe "$NE_PATCH_REGEX" | \ + $MOSES_TOK/detokenizer.perl -l $SRC > $NE_ROOT/nepali-penn-treebank.$NE_TGT + + +# Download nepali dictionary data +NE_DICT=$NE_ROOT/dictionaries +download_data $NE_DICT "http://www.seas.upenn.edu/~nlp/resources/TACL-data-release/dictionaries.tar.gz" +tar xvzf $NE_DICT +cp dictionaries/dict.ne $NE_ROOT/dictionary.$NE_TGT-$SRC +REMOVE_FILE_PATHS+=( $NE_DICT dictionaries ) + +REMOVE_FILE_PATHS+=( $MOSES $NE_TAGGED original.zip $DATA/nepali-penn-treebank.$SRC.patch $DATA/nepali-penn-treebank.$NE_TGT.patch ) + + +# Remove the temporary files +for ((i=0;i<${#REMOVE_FILE_PATHS[@]};++i)); do + rm -rf ${REMOVE_FILE_PATHS[i]} +done + +# Copy the training data +si=si_LK +ne=ne_NP +en=en_XX +cat $SI_ROOT/GNOMEKDEUbuntu.en-si.si $SI_ROOT/OpenSubtitles2018.en-si.si > $DESTDIR/train.$si-$en.$si +cat $SI_ROOT/GNOMEKDEUbuntu.en-si.en $SI_ROOT/OpenSubtitles2018.en-si.en > $DESTDIR/train.$si-$en.$en + +cat $NE_ROOT/bible_dup.en-ne.ne $NE_ROOT/bible.en-ne.ne $NE_ROOT/globalvoices.2018q4.ne-en.ne $NE_ROOT/GNOMEKDEUbuntu.en-ne.ne $NE_ROOT/nepali-penn-treebank.ne > $DESTDIR/train.$ne-$en.$ne +cat $NE_ROOT/bible_dup.en-ne.en $NE_ROOT/bible.en-ne.en $NE_ROOT/globalvoices.2018q4.ne-en.en $NE_ROOT/GNOMEKDEUbuntu.en-ne.en $NE_ROOT/nepali-penn-treebank.en > $DESTDIR/train.$ne-$en.$en + + +#Download the test sets +wget https://github.com/facebookresearch/flores/raw/master/data/wikipedia_en_ne_si_test_sets.tgz +tar -xvzf wikipedia_en_ne_si_test_sets.tgz + +cp wikipedia_en_ne_si_test_sets/wikipedia.dev.ne-en.ne $DESTDIR/valid.$ne-$en.$ne +cp wikipedia_en_ne_si_test_sets/wikipedia.dev.ne-en.en $DESTDIR/valid.$ne-$en.$en + +cp wikipedia_en_ne_si_test_sets/wikipedia.dev.si-en.si $DESTDIR/valid.$si-$en.$si +cp wikipedia_en_ne_si_test_sets/wikipedia.dev.si-en.en $DESTDIR/valid.$si-$en.$en + +cp wikipedia_en_ne_si_test_sets/wikipedia.devtest.ne-en.ne $DESTDIR/devtest.$ne-$en.$ne +cp wikipedia_en_ne_si_test_sets/wikipedia.devtest.ne-en.en $DESTDIR/devtest.$ne-$en.$en + +cp wikipedia_en_ne_si_test_sets/wikipedia.devtest.si-en.si $DESTDIR/devtest.$si-$en.$si +cp wikipedia_en_ne_si_test_sets/wikipedia.devtest.si-en.en $DESTDIR/devtest.$si-$en.$en + +cp wikipedia_en_ne_si_test_sets/wikipedia.test.ne-en.ne $DESTDIR/test.$ne-$en.$ne +cp wikipedia_en_ne_si_test_sets/wikipedia.test.ne-en.en $DESTDIR/test.$ne-$en.$en + +cp wikipedia_en_ne_si_test_sets/wikipedia.test.si-en.si $DESTDIR/test.$si-$en.$si +cp wikipedia_en_ne_si_test_sets/wikipedia.test.si-en.en $DESTDIR/test.$si-$en.$en + +rm -rf wikipedia_en_ne_si_test_sets.tgz wikipedia_en_ne_si_test_sets diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_iitb.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_iitb.sh new file mode 100644 index 0000000..a884e20 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_iitb.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + +IITB=$WORKDIR_ROOT/IITB +mkdir -p $IITB +pushd $IITB + +wget http://www.cfilt.iitb.ac.in/~moses/iitb_en_hi_parallel/iitb_corpus_download/parallel.tgz +tar -xvzf parallel.tgz + +wget http://www.cfilt.iitb.ac.in/~moses/iitb_en_hi_parallel/iitb_corpus_download/dev_test.tgz +tar -xvzf dev_test.tgz + +DESTDIR=${WORKDIR_ROOT}/ML50/raw/ + +cp parallel/IITB.en-hi.en $DESTDIR/train.hi_IN-en_XX.en_XX +cp parallel/IITB.en-hi.hi $DESTDIR/train.hi_IN-en_XX.hi_IN + +cp dev_test/dev.en $DESTDIR/valid.hi_IN-en_XX.en_XX +cp dev_test/dev.hi $DESTDIR/valid.hi_IN-en_XX.hi_IN + +cp dev_test/test.en $DESTDIR/test.hi_IN-en_XX.en_XX +cp dev_test/test.hi $DESTDIR/test.hi_IN-en_XX.hi_IN +popd \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_iwslt_and_extract.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_iwslt_and_extract.sh new file mode 100644 index 0000000..ca3591b --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_iwslt_and_extract.sh @@ -0,0 +1,225 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +#echo 'Cloning Moses github repository (for tokenization scripts)...' +#git clone https://github.com/moses-smt/mosesdecoder.git + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + + + +data_root=${WORKDIR_ROOT}/iwsltv2 +DESTDIR=${WORKDIR_ROOT}/ML50/raw + + +langs="ar_AR it_IT nl_XX ko_KR vi_VN" +echo "data_root: $data_root" + +download_path=${data_root}/downloads +raw=${DESTDIR} +tmp=${data_root}/tmp +orig=${data_root}/orig + +mkdir -p $download_path $orig $raw $tmp +####################### +download_iwslt(){ + iwslt_key=$1 + src=$2 + tgt=$3 + save_prefix=$4 + pushd ${download_path} + if [[ ! -f ${save_prefix}$src-$tgt.tgz ]]; then + wget https://wit3.fbk.eu/archive/${iwslt_key}/texts/$src/$tgt/$src-$tgt.tgz -O ${save_prefix}$src-$tgt.tgz + [ $? -eq 0 ] && return 0 + fi + popd +} + +extract_iwslt(){ + src=$1 + tgt=$2 + prefix=$3 + pushd $orig + tar zxvf ${download_path}/${prefix}$src-${tgt}.tgz + popd +} + +generate_train(){ + lsrc=$1 + ltgt=$2 + src=${lsrc:0:2} + tgt=${ltgt:0:2} + for ll in $lsrc $ltgt; do + l=${ll:0:2} + f="$orig/*/train.tags.$src-$tgt.$l" + f_raw=$raw/train.$lsrc-$ltgt.$ll + cat $f \ + | grep -v '' \ + | grep -v '' \ + | grep -v '' \ + | grep -v '' \ + | grep -v '' \ + | sed -e 's///g' \ + | sed -e 's/<\/title>//g' \ + | sed -e 's/<description>//g' \ + | sed -e 's/<\/description>//g' \ + | sed 's/^\s*//g' \ + | sed 's/\s*$//g' \ + > $f_raw + [ $? -eq 0 ] && echo "extracted $f to $f_raw" + done + return 0 +} + +convert_valid_test(){ + src=$1 + tgt=$2 + for l in $src $tgt; do + echo "lang: ${l}" + for o in `ls $orig/*/IWSLT*.TED*.$src-$tgt.$l.xml`; do + fname=${o##*/} + f=$tmp/${fname%.*} + echo "$o => $f" + grep '<seg id' $o \ + | sed -e 's/<seg id="[0-9]*">\s*//g' \ + | sed -e 's/\s*<\/seg>\s*//g' \ + | sed -e "s/\’/\'/g" \ + > $f + echo "" + done + done +} + +generate_subset(){ + lsrc=$1 + ltgt=$2 + src=${lsrc:0:2} + tgt=${ltgt:0:2} + subset=$3 + prefix=$4 + for ll in $lsrc $ltgt; do + l=${ll:0:2} + f=$tmp/$prefix.${src}-${tgt}.$l + if [[ -f $f ]]; then + cp $f $raw/$subset.${lsrc}-$ltgt.${ll} + fi + done +} +################# + +echo "downloading iwslt training and dev data" +# using multilingual for it, nl +download_iwslt "2017-01-trnmted" DeEnItNlRo DeEnItNlRo +download_iwslt "2017-01-trnted" ar en +download_iwslt "2017-01-trnted" en ar +download_iwslt "2017-01-trnted" ko en +download_iwslt "2017-01-trnted" en ko +download_iwslt "2015-01" vi en +download_iwslt "2015-01" en vi + +echo "donwloading iwslt test data" +download_iwslt "2017-01-mted-test" it en "test." +download_iwslt "2017-01-mted-test" en it "test." +download_iwslt "2017-01-mted-test" nl en "test." +download_iwslt "2017-01-mted-test" en nl "test." + +download_iwslt "2017-01-ted-test" ar en "test." +download_iwslt "2017-01-ted-test" en ar "test." +download_iwslt "2017-01-ted-test" ko en "test." +download_iwslt "2017-01-ted-test" en ko "test." +download_iwslt "2015-01-test" vi en "test." +download_iwslt "2015-01-test" en vi "test." + +echo "extract training data tar balls" +extract_iwslt DeEnItNlRo DeEnItNlRo +extract_iwslt ar en +extract_iwslt en ar +extract_iwslt ko en +extract_iwslt en ko +extract_iwslt vi en +extract_iwslt en vi + + +echo "extracting iwslt test data" +for lang in $langs; do + l=${lang:0:2} + extract_iwslt $l en "test." + extract_iwslt en $l "test." +done + +echo "convert dev and test data" +for lang in $langs; do + s_lang=${lang:0:2} + convert_valid_test $s_lang en + convert_valid_test en $s_lang +done + + + +echo "creating training data into $raw" +for lang in $langs; do + generate_train $lang en_XX + generate_train en_XX $lang +done + +echo "creating iwslt dev data into raw" +generate_subset en_XX vi_VN valid "IWSLT15.TED.tst2013" +generate_subset vi_VN en_XX valid "IWSLT15.TED.tst2013" + +generate_subset en_XX ar_AR valid "IWSLT17.TED.tst2016" +generate_subset ar_AR en_XX valid "IWSLT17.TED.tst2016" +generate_subset en_XX ko_KR valid "IWSLT17.TED.tst2016" +generate_subset ko_KR en_XX valid "IWSLT17.TED.tst2016" + + +generate_subset en_XX it_IT valid "IWSLT17.TED.tst2010" +generate_subset it_IT en_XX valid "IWSLT17.TED.tst2010" +generate_subset en_XX nl_XX valid "IWSLT17.TED.tst2010" +generate_subset nl_XX en_XX valid "IWSLT17.TED.tst2010" + +echo "creating iswslt test data into raw" +generate_subset en_XX vi_VN test "IWSLT15.TED.tst2015" +generate_subset vi_VN en_XX test "IWSLT15.TED.tst2015" + +generate_subset en_XX ar_AR test "IWSLT17.TED.tst2017" +generate_subset ar_AR en_XX test "IWSLT17.TED.tst2017" +generate_subset en_XX ko_KR test "IWSLT17.TED.tst2017" +generate_subset ko_KR en_XX test "IWSLT17.TED.tst2017" + +generate_subset en_XX it_IT test "IWSLT17.TED.tst2017.mltlng" +generate_subset it_IT en_XX test "IWSLT17.TED.tst2017.mltlng" +generate_subset en_XX nl_XX test "IWSLT17.TED.tst2017.mltlng" +generate_subset nl_XX en_XX test "IWSLT17.TED.tst2017.mltlng" + +# normalze iwslt directions into x-en +pushd $raw +for lang in $langs; do + for split in test valid; do + x_en_f1=$split.$lang-en_XX.en_XX + x_en_f2=$split.$lang-en_XX.${lang} + + en_x_f1=$split.en_XX-$lang.en_XX + en_x_f2=$split.en_XX-$lang.${lang} + + if [ -f $en_x_f1 ] && [ ! -f $x_en_f1 ]; then + echo "cp $en_x_f1 $x_en_f1" + cp $en_x_f1 $x_en_f1 + fi + if [ -f $x_en_f2 ] && [ ! -f $x_en_f2 ]; then + echo "cp $en_x_f2 $x_en_f2" + cp $en_x_f2 $x_en_f2 + fi + done +done +popd \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_lotus.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_lotus.sh new file mode 100644 index 0000000..c08c701 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_lotus.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + + +SRCDIR=$WORKDIR_ROOT/indic_languages_corpus +DESTDIR=${WORKDIR_ROOT}/ML50/raw/ +mkdir -p $SRCDIR +mkdir -p $DESTDIR + +cd $SRCDIR +wget http://lotus.kuee.kyoto-u.ac.jp/WAT/indic-multilingual/indic_languages_corpus.tar.gz +tar -xvzf indic_languages_corpus.tar.gz + +SRC_EXTRACT_DIR=$SRCDIR/indic_languages_corpus/bilingual + +cp $SRC_EXTRACT_DIR/ml-en/train.ml $DESTDIR/train.ml_IN-en_XX.ml_IN +cp $SRC_EXTRACT_DIR/ml-en/train.en $DESTDIR/train.ml_IN-en_XX.en_XX +cp $SRC_EXTRACT_DIR/ml-en/dev.ml $DESTDIR/valid.ml_IN-en_XX.ml_IN +cp $SRC_EXTRACT_DIR/ml-en/dev.en $DESTDIR/valid.ml_IN-en_XX.en_XX +cp $SRC_EXTRACT_DIR/ml-en/test.ml $DESTDIR/test.ml_IN-en_XX.ml_IN +cp $SRC_EXTRACT_DIR/ml-en/test.en $DESTDIR/test.ml_IN-en_XX.en_XX + +cp $SRC_EXTRACT_DIR/ur-en/train.ur $DESTDIR/train.ur_PK-en_XX.ur_PK +cp $SRC_EXTRACT_DIR/ur-en/train.en $DESTDIR/train.ur_PK-en_XX.en_XX +cp $SRC_EXTRACT_DIR/ur-en/dev.ur $DESTDIR/valid.ur_PK-en_XX.ur_PK +cp $SRC_EXTRACT_DIR/ur-en/dev.en $DESTDIR/valid.ur_PK-en_XX.en_XX +cp $SRC_EXTRACT_DIR/ur-en/test.ur $DESTDIR/test.ur_PK-en_XX.ur_PK +cp $SRC_EXTRACT_DIR/ur-en/test.en $DESTDIR/test.ur_PK-en_XX.en_XX + +cp $SRC_EXTRACT_DIR/te-en/train.te $DESTDIR/train.te_IN-en_XX.te_IN +cp $SRC_EXTRACT_DIR/te-en/train.en $DESTDIR/train.te_IN-en_XX.en_XX +cp $SRC_EXTRACT_DIR/te-en/dev.te $DESTDIR/valid.te_IN-en_XX.te_IN +cp $SRC_EXTRACT_DIR/te-en/dev.en $DESTDIR/valid.te_IN-en_XX.en_XX +cp $SRC_EXTRACT_DIR/te-en/test.te $DESTDIR/test.te_IN-en_XX.te_IN +cp $SRC_EXTRACT_DIR/te-en/test.en $DESTDIR/test.te_IN-en_XX.en_XX diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_ted_and_extract.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_ted_and_extract.py new file mode 100644 index 0000000..eb75668 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_ted_and_extract.py @@ -0,0 +1,338 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import itertools +import os +import csv +from collections import defaultdict +from six.moves import zip +import io +import wget +import sys + +from subprocess import check_call, check_output + +# scripts and data locations +CWD = os.getcwd() +UTILS = f"{CWD}/utils" + +MOSES = f"{UTILS}/mosesdecoder" + +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + + +# please donwload mosesdecoder here: +detok_cmd = f'{MOSES}/scripts/tokenizer/detokenizer.perl' + + +def call(cmd): + print(f"Executing: {cmd}") + check_call(cmd, shell=True) + +class MultiLingualAlignedCorpusReader(object): + """A class to read TED talk dataset + """ + + def __init__(self, corpus_path, delimiter='\t', + target_token=True, bilingual=True, corpus_type='file', + lang_dict={'source': ['fr'], 'target': ['en']}, + eval_lang_dict=None, zero_shot=False, + detok=True, + ): + + self.empty_line_flag = 'NULL' + self.corpus_path = corpus_path + self.delimiter = delimiter + self.bilingual = bilingual + self.lang_dict = lang_dict + self.lang_set = set() + self.target_token = target_token + self.zero_shot = zero_shot + self.eval_lang_dict = eval_lang_dict + self.corpus_type = corpus_type + self.detok = detok + + for list_ in self.lang_dict.values(): + for lang in list_: + self.lang_set.add(lang) + + self.data = dict() + self.data['train'] = self.read_aligned_corpus(split_type='train') + self.data['test'] = self.read_aligned_corpus(split_type='test') + self.data['dev'] = self.read_aligned_corpus(split_type='dev') + + def read_data(self, file_loc_): + data_list = list() + with io.open(file_loc_, 'r', encoding='utf8') as fp: + for line in fp: + try: + text = line.strip() + except IndexError: + text = self.empty_line_flag + data_list.append(text) + return data_list + + def filter_text(self, dict_): + if self.target_token: + field_index = 1 + else: + field_index = 0 + data_dict = defaultdict(list) + list1 = dict_['source'] + list2 = dict_['target'] + for sent1, sent2 in zip(list1, list2): + try: + src_sent = ' '.join(sent1.split()[field_index: ]) + except IndexError: + src_sent = 'NULL' + + if src_sent.find(self.empty_line_flag) != -1 or len(src_sent) == 0: + continue + + elif sent2.find(self.empty_line_flag) != -1 or len(sent2) == 0: + continue + + else: + data_dict['source'].append(sent1) + data_dict['target'].append(sent2) + return data_dict + + def read_file(self, split_type, data_type): + return self.data[split_type][data_type] + + def save_file(self, path_, split_type, data_type, lang): + tok_file = tok_file_name(path_, lang) + with io.open(tok_file, 'w', encoding='utf8') as fp: + for line in self.data[split_type][data_type]: + fp.write(line + '\n') + if self.detok: + de_tok(tok_file, lang) + + def add_target_token(self, list_, lang_id): + new_list = list() + token = '__' + lang_id + '__' + for sent in list_: + new_list.append(token + ' ' + sent) + return new_list + + def read_from_single_file(self, path_, s_lang, t_lang): + data_dict = defaultdict(list) + with io.open(path_, 'r', encoding='utf8') as fp: + reader = csv.DictReader(fp, delimiter='\t', quoting=csv.QUOTE_NONE) + for row in reader: + data_dict['source'].append(row[s_lang]) + data_dict['target'].append(row[t_lang]) + + if self.target_token: + text = self.add_target_token(data_dict['source'], t_lang) + data_dict['source'] = text + + return data_dict['source'], data_dict['target'] + + def read_aligned_corpus(self, split_type='train'): + data_dict = defaultdict(list) + iterable = [] + s_list = [] + t_list = [] + + if self.zero_shot: + if split_type == "train": + iterable = zip(self.lang_dict['source'], self.lang_dict['target']) + else: + iterable = zip(self.eval_lang_dict['source'], self.eval_lang_dict['target']) + + elif self.bilingual: + iterable = itertools.product(self.lang_dict['source'], self.lang_dict['target']) + + for s_lang, t_lang in iterable: + if s_lang == t_lang: + continue + if self.corpus_type == 'file': + split_type_file_path = os.path.join(self.corpus_path, + "all_talks_{}.tsv".format(split_type)) + s_list, t_list = self.read_from_single_file(split_type_file_path, + s_lang=s_lang, + t_lang=t_lang) + data_dict['source'] += s_list + data_dict['target'] += t_list + new_data_dict = self.filter_text(data_dict) + return new_data_dict + + +def read_langs(corpus_path): + split_type_file_path = os.path.join(corpus_path, 'extracted', + "all_talks_dev.tsv") + with io.open(split_type_file_path, 'r', encoding='utf8') as fp: + reader = csv.DictReader(fp, delimiter='\t', quoting=csv.QUOTE_NONE) + header = next(reader) + return [k for k in header.keys() if k != 'talk_name'] + +def extra_english(corpus_path, split): + split_type_file_path = os.path.join(corpus_path, + f"all_talks_{split}.tsv") + output_split_type_file_path = os.path.join(corpus_path, + f"all_talks_{split}.en") + with io.open(split_type_file_path, 'r', encoding='utf8') as fp, io.open(output_split_type_file_path, 'w', encoding='utf8') as fw: + reader = csv.DictReader(fp, delimiter='\t', quoting=csv.QUOTE_NONE) + for row in reader: + line = row['en'] + fw.write(line + '\n') + de_tok(output_split_type_file_path, 'en') + + + +def tok_file_name(filename, lang): + seps = filename.split('.') + seps.insert(-1, 'tok') + tok_file = '.'.join(seps) + return tok_file + +def de_tok(tok_file, lang): + # seps = tok_file.split('.') + # seps.insert(-1, 'detok') + # de_tok_file = '.'.join(seps) + de_tok_file = tok_file.replace('.tok.', '.') + cmd = 'perl {detok_cmd} -l {lang} < {tok_file} > {de_tok_file}'.format( + detok_cmd=detok_cmd, tok_file=tok_file, + de_tok_file=de_tok_file, lang=lang[:2]) + call(cmd) + +def extra_bitex( + ted_data_path, + lsrc_lang, + ltrg_lang, + target_token, + output_data_path, +): + def get_ted_lang(lang): + long_langs = ['pt-br', 'zh-cn', 'zh-tw', 'fr-ca'] + if lang[:5] in long_langs: + return lang[:5] + elif lang[:4] =='calv': + return lang[:5] + elif lang in ['pt_BR', 'zh_CN', 'zh_TW', 'fr_CA']: + return lang.lower().replace('_', '-') + return lang[:2] + src_lang = get_ted_lang(lsrc_lang) + trg_lang = get_ted_lang(ltrg_lang) + train_lang_dict={'source': [src_lang], 'target': [trg_lang]} + eval_lang_dict = {'source': [src_lang], 'target': [trg_lang]} + + obj = MultiLingualAlignedCorpusReader(corpus_path=ted_data_path, + lang_dict=train_lang_dict, + target_token=target_token, + corpus_type='file', + eval_lang_dict=eval_lang_dict, + zero_shot=False, + bilingual=True) + + os.makedirs(output_data_path, exist_ok=True) + lsrc_lang = lsrc_lang.replace('-', '_') + ltrg_lang = ltrg_lang.replace('-', '_') + obj.save_file(output_data_path + f"/train.{lsrc_lang}-{ltrg_lang}.{lsrc_lang}", + split_type='train', data_type='source', lang=src_lang) + obj.save_file(output_data_path + f"/train.{lsrc_lang}-{ltrg_lang}.{ltrg_lang}", + split_type='train', data_type='target', lang=trg_lang) + + obj.save_file(output_data_path + f"/test.{lsrc_lang}-{ltrg_lang}.{lsrc_lang}", + split_type='test', data_type='source', lang=src_lang) + obj.save_file(output_data_path + f"/test.{lsrc_lang}-{ltrg_lang}.{ltrg_lang}", + split_type='test', data_type='target', lang=trg_lang) + + obj.save_file(output_data_path + f"/valid.{lsrc_lang}-{ltrg_lang}.{lsrc_lang}", + split_type='dev', data_type='source', lang=src_lang) + obj.save_file(output_data_path + f"/valid.{lsrc_lang}-{ltrg_lang}.{ltrg_lang}", + split_type='dev', data_type='target', lang=trg_lang) + + +def bar_custom(current, total, width=80): + print("Downloading: %d%% [%d / %d] Ks" % (current / total * 100, current / 1000, total / 1000), end='\r') + + +def download_and_extract(download_to, extract_to): + url = 'http://phontron.com/data/ted_talks.tar.gz' + filename = f"{download_to}/ted_talks.tar.gz" + if os.path.exists(filename): + print(f'{filename} has already been downloaded so skip') + else: + filename = wget.download(url, filename, bar=bar_custom) + if os.path.exists(f'{extract_to}/all_talks_train.tsv'): + print(f'Already extracted so skip') + else: + extract_cmd = f'tar xzfv "{filename}" -C "{extract_to}"' + call(extract_cmd) + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--ted_data_path', type=str, default=WORKDIR_ROOT, required=False) + parser.add_argument( + '--direction-list', + type=str, + # default=None, + #for ML50 + default=( + "bn_IN-en_XX,he_IL-en_XX,fa_IR-en_XX,id_ID-en_XX,sv_SE-en_XX,pt_XX-en_XX,ka_GE-en_XX,ka_GE-en_XX,th_TH-en_XX," + "mr_IN-en_XX,hr_HR-en_XX,uk_UA-en_XX,az_AZ-en_XX,mk_MK-en_XX,gl_ES-en_XX,sl_SI-en_XX,mn_MN-en_XX," + #non-english directions + # "fr_XX-de_DE," # replaced with wmt20 + # "ja_XX-ko_KR,es_XX-pt_XX,ru_RU-sv_SE,hi_IN-bn_IN,id_ID-ar_AR,cs_CZ-pl_PL,ar_AR-tr_TR" + ), + required=False) + parser.add_argument('--target-token', action='store_true', default=False) + parser.add_argument('--extract-all-english', action='store_true', default=False) + + args = parser.parse_args() + + import sys + import json + + # TED Talks data directory + ted_data_path = args.ted_data_path + + download_to = f'{ted_data_path}/downloads' + extract_to = f'{ted_data_path}/extracted' + + #DESTDIR=${WORKDIR_ROOT}/ML50/raw/ + output_path = f'{ted_data_path}/ML50/raw' + os.makedirs(download_to, exist_ok=True) + os.makedirs(extract_to, exist_ok=True) + os.makedirs(output_path, exist_ok=True) + download_and_extract(download_to, extract_to) + + + if args.extract_all_english: + for split in ['train', 'dev', 'test']: + extra_english(ted_data_path, split) + exit(0) + if args.direction_list is not None: + directions = args.direction_list.strip().split(',') + directions = [tuple(d.strip().split('-', 1)) for d in directions if d] + else: + langs = read_langs(ted_data_path) + # directions = [ + # '{}.{}'.format(src, tgt) + # for src in langs + # for tgt in langs + # if src < tgt + # ] + directions = [('en', tgt) for tgt in langs if tgt != 'en'] + print(f'num directions={len(directions)}: {directions}') + + for src_lang, trg_lang in directions: + print('--working on {}-{}'.format(src_lang, trg_lang)) + extra_bitex( + extract_to, + src_lang, + trg_lang, + target_token=args.target_token, + output_data_path=output_path + ) diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wat19_my.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wat19_my.sh new file mode 100644 index 0000000..c1e2d47 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wat19_my.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + + +SRCDIR=$WORKDIR_ROOT/indic_languages_corpus +DESTDIR=$WORKDIR_ROOT/ML50/raw +mkdir -p $SRCDIR +mkdir -p $DESTDIR + +WAT_MY_EN=wat2020.my-en.zip +cd $SRCDIR +# please refer to http://lotus.kuee.kyoto-u.ac.jp/WAT/my-en-data/ for latest URL if the following url expired +#- The data used for WAT2020 are identical to those used in WAT2019. +wget http://lotus.kuee.kyoto-u.ac.jp/WAT/my-en-data/$WAT_MY_EN +unzip $WAT_MY_EN + + +SRC_EXTRACT_DIR=$SRCDIR/wat2020.my-en/alt + +cp $SRC_EXTRACT_DIR/train.alt.en $DESTDIR/train.my_MM-en_XX.en_XX +cp $SRC_EXTRACT_DIR/train.alt.my $DESTDIR/train.my_MM-en_XX.my_MM +cp $SRC_EXTRACT_DIR/dev.alt.en $DESTDIR/valid.my_MM-en_XX.en_XX +cp $SRC_EXTRACT_DIR/dev.alt.my $DESTDIR/valid.my_MM-en_XX.my_MM +cp $SRC_EXTRACT_DIR/test.alt.en $DESTDIR/test.my_MM-en_XX.en_XX +cp $SRC_EXTRACT_DIR/test.alt.my $DESTDIR/test.my_MM-en_XX.my_MM diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt19_and_before.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt19_and_before.py new file mode 100644 index 0000000..3465731 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt19_and_before.py @@ -0,0 +1,899 @@ +from typing import NamedTuple, List +from urllib.parse import urlparse +import os, sys +import subprocess +from subprocess import check_call, check_output +import glob +import wget +import re +import multiprocessing as mp +from functools import partial +import pathlib +from collections import OrderedDict + +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + +# scripts and data locations +CWD = os.getcwd() +UTILS = f"{CWD}/utils" + +MOSES = f"{UTILS}/mosesdecoder" +SGM_TOOL = f'{MOSES}/scripts/ems/support/input-from-sgm.perl' + +TMX2CORPUS = f"{UTILS}/tmx2corpus" +TMX_TOOL = f'python {TMX2CORPUS}/tmx2corpus.py' + +to_data_path = f'{WORKDIR_ROOT}/wmt' +download_to = f'{to_data_path}/downloads' +manually_downloads = f'{to_data_path}/downloads' +extract_to = f'{to_data_path}/extracted' +#DESTDIR=${WORKDIR_ROOT}/ML50/raw/ +raw_data = f'{WORKDIR_ROOT}/ML50/raw' +#### + +class DLDataset(NamedTuple): + name: str + train_urls: List[str] + valid_urls: List[str] + test_urls: List[str] + train_files_patterns: List[str] = [] + valid_files_patterns: List[str] = [] + test_files_patterns: List[str] = [] + + + +def bar_custom(current, total, width=80): + print("Downloading: %d%% [%d / %d] Ks" % (current / total * 100, current / 1000, total / 1000), end='\r') + +def get_downloaded_file(dl_folder, url): + if isinstance(url, tuple): + url, f = url + else: + url_f = urlparse(url) + # f = os.path.split(url_f.path)[-1] + f = '_'.join(url_f.path.split('/')[1:]) + return url, f"{dl_folder}/{f}" + +def download_parts_and_combine(dl_folder, urls, filename): + parts = [] + for url_record in urls: + url, part_file = get_downloaded_file(dl_folder, url_record) + if os.path.exists(part_file): + print(f'{part_file} has already been downloaded so skip') + else: + part_file = wget.download(url, part_file, bar=bar_custom) + parts.append(part_file) + + def get_combine_cmd(parts): + #default as tar.gz.?? + return f'cat {" ".join(parts)} > {filename}' + + combine_cmd = get_combine_cmd(parts) + call(combine_cmd, debug=True) + return filename + +def download_a_url(dl_folder, url): + url, filename = get_downloaded_file(dl_folder, url) + if os.path.exists(filename): + print(f'{filename} has already been downloaded so skip') + return filename + + print(f'downloading {url} to {filename}') + if isinstance(url, list) or isinstance(url, tuple): + download_parts_and_combine(dl_folder, url, filename) + else: + wget.download(url, filename, bar=bar_custom) + print(f'dowloaded: {filename}') + return filename + +def download_files(dl_folder, urls, completed_urls={}): + for url_record in urls: + url, _ = get_downloaded_file(dl_folder, url_record) + filename = download_a_url(dl_folder, url_record) + completed_urls[str(url)] = filename + return completed_urls + +def check_need_manual_downalod(dl_folder, to_manually_download_urls): + to_be_manually_dowloaded = [] + manually_completed_urls = {} + for url_record, instruction in to_manually_download_urls: + url, filename = get_downloaded_file(dl_folder, url_record) + if not os.path.exists(filename): + print(f'{url} need to be download manually, please download it manually following {instruction}; and copy it to {filename}') + to_be_manually_dowloaded.append((url, filename)) + else: + manually_completed_urls[url] = filename + # if len(to_be_manually_dowloaded) > 0: + # raise ValueError('Missing files that need to be downloaded manually; stop the process now.') + return to_be_manually_dowloaded + +def download_dataset(to_folder, dl_dataset, completed_urls={}): + download_files(to_folder, dl_dataset.train_urls, completed_urls) + download_files(to_folder, dl_dataset.valid_urls, completed_urls) + download_files(to_folder, dl_dataset.test_urls, completed_urls) + print('completed downloading') + return completed_urls + +def call(cmd, debug=False): + if debug: + print(cmd) + check_call(cmd, shell=True) + + +def get_extract_name(file_path): + path = os.path.split(file_path) + return path[-1] + '_extract' #.split('.')[0] + +def extract_file(downloaded_file, extract_folder, get_extract_name=get_extract_name, debug=False): + extract_name = get_extract_name(downloaded_file) + extract_to = f'{extract_folder}/{extract_name}' + os.makedirs(extract_to, exist_ok=True) + if os.path.exists(f'{extract_to}/DONE'): + print(f'{downloaded_file} has already been extracted to {extract_to} so skip') + return extract_to + def get_extract_cmd(filename): + if filename.endswith('.tgz') or filename.endswith('tar.gz'): + return f'tar xzfv {filename} -C {extract_to}' + elif filename.endswith('.gz.tar'): + return f'tar xfv {filename} -C {extract_to}; (cd {extract_to}; gzip -d *.gz; [ $? -eq 0 ] || gzip -d */*.gz)' + elif filename.endswith('.tar'): + return f'tar xfv {filename} -C {extract_to}' + elif filename.endswith('.gz'): + return f'cp {filename} {extract_to}; (cd {extract_to}; gzip -d *.gz)' + elif filename.endswith('.zip'): + return f'unzip {filename} -d {extract_to}' + extract_cmd = get_extract_cmd(downloaded_file) + print(f'extracting {downloaded_file}') + if isinstance(extract_cmd, list): + for c in extract_cmd: + call(c, debug=debug) + else: + call(extract_cmd, debug=debug) + call(f'echo DONE > {extract_to}/DONE') + return extract_to + + +def extract_all_files( + completed_urls, extract_folder, + get_extract_name=get_extract_name, + completed_extraction={}, + debug=False): + extracted_folders = OrderedDict() + for url, downloaded_file in set(completed_urls.items()): + if downloaded_file in completed_extraction: + print(f'{downloaded_file} is already extracted; so skip') + continue + folder = extract_file(downloaded_file, extract_folder, get_extract_name, debug) + extracted_folders[url] = folder + return extracted_folders + + +def my_glob(folder): + for p in [f'{folder}/*', f'{folder}/*/*', f'{folder}/*/*/*']: + for f in glob.glob(p): + yield f + + +def sgm2raw(sgm, debug): + to_file = sgm[0:len(sgm) - len('.sgm')] + if os.path.exists(to_file): + debug and print(f'{sgm} already converted to {to_file}; so skip') + return to_file + cmd = f'{SGM_TOOL} < {sgm} > {to_file}' + call(cmd, debug) + return to_file + +def tmx2raw(tmx, debug): + to_file = tmx[0:len(tmx) - len('.tmx')] + to_folder = os.path.join(*os.path.split(tmx)[:-1]) + if os.path.exists(f'{to_folder}/bitext.en'): + debug and print(f'{tmx} already extracted to {to_file}; so skip') + return to_file + cmd = f'(cd {to_folder}; {TMX_TOOL} {tmx})' + call(cmd, debug) + return to_file + +CZENG16_REGEX = re.compile(r'.*?data.plaintext-format/0[0-9]train$') +WMT19_WIKITITLES_REGEX = re.compile(r'.*?wikititles-v1.(\w\w)-en.tsv.gz') +TSV_REGEX = re.compile(r'.*?(\w\w)-(\w\w).tsv$') + + + +def cut_wikitles(wiki_file, debug): + # different languages have different file names: + if wiki_file.endswith('wiki/fi-en/titles.fi-en'): + to_file1 = f'{wiki_file}.fi' + to_file2 = f'{wiki_file}.en' + BACKSLASH = '\\' + cmd1 = f"cat {wiki_file} | sed 's/|||/{BACKSLASH}t/g' |cut -f1 |awk '{{$1=$1}};1' > {to_file1}" + cmd2 = f"cat {wiki_file} | sed 's/|||/{BACKSLASH}t/g' |cut -f2 |awk '{{$1=$1}};1' > {to_file2}" +# elif WMT19_WIKITITLES_REGEX.match(wiki_file): +# src = WMT19_WIKITITLES_REGEX.match(wiki_file).groups()[0] +# to_file1 = f'{wiki_file}.{src}' +# to_file2 = f'{wiki_file}.en' +# cmd1 = f"cat {wiki_file} | cut -f1 |awk '{{$1=$1}};1' > {to_file1}" +# cmd2 = f"cat {wiki_file} | cut -f2 |awk '{{$1=$1}};1' > {to_file2}" + else: + return None + if os.path.exists(to_file1) and os.path.exists(to_file2): + debug and print(f'{wiki_file} already processed to {to_file1} and {to_file2}; so skip') + return wiki_file + + call(cmd1, debug=debug) + call(cmd2, debug=debug) + return wiki_file + +def cut_tsv(file, debug): + m = TSV_REGEX.match(file) + if m is None: + raise ValueError(f'{file} is not matching tsv pattern') + src = m.groups()[0] + tgt = m.groups()[1] + + to_file1 = f'{file}.{src}' + to_file2 = f'{file}.{tgt}' + cmd1 = f"cat {file} | cut -f1 |awk '{{$1=$1}};1' > {to_file1}" + cmd2 = f"cat {file} | cut -f2 |awk '{{$1=$1}};1' > {to_file2}" + if os.path.exists(to_file1) and os.path.exists(to_file2): + debug and print(f'{file} already processed to {to_file1} and {to_file2}; so skip') + return file + + call(cmd1, debug=debug) + call(cmd2, debug=debug) + return file + + +def convert_file_if_needed(file, debug): + if file.endswith('.sgm'): + return sgm2raw(file, debug) + elif file.endswith('.tmx'): + return tmx2raw(file, debug) + elif file.endswith('wiki/fi-en/titles.fi-en'): + return cut_wikitles(file, debug) +# elif WMT19_WIKITITLES_REGEX.match(file): +# return cut_wikitles(file, debug) + elif file.endswith('.tsv'): + return cut_tsv(file, debug) + elif CZENG16_REGEX.match(file): + return convert2czeng17(file, debug) + else: + return file + + +def convert_files_if_needed(extracted_foldrs, my_glob=my_glob, debug=False): + return { + url: list(sorted(set(convert_file_if_needed(f, debug)) for f in sorted(set(my_glob(folder))))) + for url, folder in extracted_foldrs.items() + } + +def match_patt(file_path, file_pattern, src, tgt, lang): + return file_pattern.format(src=src, tgt=tgt, lang=lang) in file_path + +def match_patts(file_path, file_patterns, src, tgt, lang): + for file_pattern in file_patterns: + params = { k: v for k, v in [('src', src), ('tgt', tgt), ('lang', lang)] if k in file_pattern} + matching = file_pattern.format(**params) + + if isinstance(file_pattern, tuple): + pattern, directions = file_pattern + if f'{src}-{tgt}' in directions and matching in file_path: + return True + else: + if matching in file_path: + return True + return False + +def extracted_glob(extracted_folder, file_patterns, src, tgt, lang): + def get_matching_pattern(file_pattern): + params = { + k: v + for k, v in [('src', src), ('tgt', tgt), ('lang', lang)] + if '{' + k + '}' in file_pattern + } + file_pattern = re.sub(r'{src:(.*?)}', r'\1' if lang == src else '', file_pattern) + file_pattern = re.sub(r'{tgt:(.*?)}', r'\1' if lang == tgt else '', file_pattern) + file_pattern = file_pattern.format(**params) + return file_pattern + for file_pattern in file_patterns: + if isinstance(file_pattern, tuple): + file_pattern, lang_pairs = file_pattern + if f'{src}-{tgt}' not in lang_pairs: + continue +# print('working on pattern: ', file_pattern, lang_pairs ) + matching_pattern = get_matching_pattern(file_pattern) + if matching_pattern is None: + continue + glob_patterns = f'{extracted_folder}/{matching_pattern}' +# print('glob_patterns: ', glob_patterns) + for f in glob.glob(glob_patterns): + yield f + +# for debug usage +def all_extracted_files(split, src, tgt, extracted_folders, split_urls): + def get_url(url): + if isinstance(url, tuple): + url, downloaded_file = url + return url + return [ + f + for url in split_urls + for f in my_glob(extracted_folders[str(get_url(url))]) + ] + +def concat_files(split, src, tgt, extracted_folders, split_urls, path_patterns, to_folder, debug=False): +# if debug: +# print('extracted files to be filtered by patterns: ', +# '\n\t'.join(sorted(all_extracted_files(split, src, tgt, extracted_folders, split_urls)))) + for lang in [src, tgt]: + to_file = f'{to_folder}/{split}.{src}-{tgt}.{lang}' + s_src, s_tgt, s_lang = src.split('_')[0], tgt.split('_')[0], lang.split('_')[0] + files = [] + for url in split_urls: + if isinstance(url, tuple): + url, downloaded_file = url + if str(url) not in extracted_folders: + print(f'warning: {url} not in extracted files') + for extracted_file in set( + extracted_glob( + extracted_folders[str(url)], path_patterns, + s_src, s_tgt, s_lang)): + files.append(extracted_file) + if len(files) == 0: + print('warning: ', f'No files found for split {to_file}') + continue + files = sorted(set(files)) + print(f'concating {len(files)} files into {to_file}') + cmd = ['cat'] + [f'"{f}"' for f in files] + [f'>{to_file}'] + cmd = " ".join(cmd) + call(cmd, debug=debug) + +UTILS = os.path.join(pathlib.Path(__file__).parent, 'utils') +LID_MODEL = f'{download_to}/lid.176.bin' +LID_MULTI = f'{UTILS}/fasttext_multi_filter.py' + +def lid_filter(split, src, tgt, from_folder, to_folder, debug=False): + if not os.path.exists(LID_MODEL): + call(f'wget -nc https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin -O {LID_MODEL}') + from_prefix = f'{from_folder}/{split}.{src}-{tgt}' + to_prefix = f'{to_folder}/{split}.{src}-{tgt}' + if os.path.exists(f'{from_prefix}.{src}') and os.path.exists(f'{from_prefix}.{tgt}'): + s_src, s_tgt = src.split('_')[0], tgt.split('_')[0] + cmd = ( + f'python {LID_MULTI} --model {LID_MODEL} --inputs {from_prefix}.{src} {from_prefix}.{tgt} ' + f'--langs {s_src} {s_tgt} --outputs {to_prefix}.{src} {to_prefix}.{tgt}' + ) + print(f'filtering {from_prefix}') + call(cmd, debug=debug) + +def concat_into_splits(dl_dataset, src, tgt, extracted_folders, to_folder, debug): + to_folder_tmp = f"{to_folder}_tmp" + os.makedirs(to_folder_tmp, exist_ok=True) + concat_files('train', src, tgt, + extracted_folders, + split_urls=dl_dataset.train_urls, + path_patterns=dl_dataset.train_files_patterns, + to_folder=to_folder_tmp, debug=debug) + lid_filter('train', src, tgt, to_folder_tmp, to_folder, debug) + + concat_files('valid', src, tgt, + extracted_folders, + split_urls=dl_dataset.valid_urls, + path_patterns=dl_dataset.valid_files_patterns, + to_folder=to_folder, debug=debug) + concat_files('test', src, tgt, + extracted_folders, + split_urls=dl_dataset.test_urls, + path_patterns=dl_dataset.test_files_patterns, + to_folder=to_folder, debug=debug) + + +def download_multi(dl_folder, extract_folder, urls, num_processes=8, debug=False): + pool = mp.Pool(processes=num_processes) + download_f = partial(download_a_url, dl_folder) + downloaded_files = pool.imap_unordered(download_f, urls) + pool.close() + pool.join() + +BLEU_REGEX = re.compile("^BLEU\\S* = (\\S+) ") +def run_eval_bleu(cmd): + output = check_output(cmd, shell=True, stderr=subprocess.STDOUT).decode("utf-8").strip() + print(output) + bleu = -1.0 + for line in output.strip().split('\n'): + m = BLEU_REGEX.search(line) + if m is not None: + bleu = m.groups()[0] + bleu = float(bleu) + break + return bleu + +def check_wmt_test_bleu(raw_folder, wmt_lang_pairs): + not_matchings = [] + for wmt, src_tgts in wmt_lang_pairs: + for src_tgt in src_tgts: + print(f'checking test bleus for: {src_tgt} at {wmt}') + src, tgt = src_tgt.split('-') + ssrc, stgt = src[:2], tgt[:2] + if os.path.exists(f'{raw_folder}/test.{tgt}-{src}.{src}'): + # reversed direction may have different test set + test_src = f'{raw_folder}/test.{tgt}-{src}.{src}' + else: + test_src = f'{raw_folder}/test.{src}-{tgt}.{src}' + cmd1 = f'cat {test_src} | sacrebleu -t "{wmt}" -l {stgt}-{ssrc}; [ $? -eq 0 ] || echo ""' + test_tgt = f'{raw_folder}/test.{src}-{tgt}.{tgt}' + cmd2 = f'cat {test_tgt} | sacrebleu -t "{wmt}" -l {ssrc}-{stgt}; [ $? -eq 0 ] || echo ""' + bleu1 = run_eval_bleu(cmd1) + if bleu1 != 100.0: + not_matchings.append(f'{wmt}:{src_tgt} source side not matching: {test_src}') + bleu2 = run_eval_bleu(cmd2) + if bleu2 != 100.0: + not_matchings.append(f'{wmt}:{src_tgt} target side not matching: {test_tgt}') + return not_matchings + +def download_and_extract( + to_folder, lang_pairs, dl_dataset, + to_manually_download_urls, + completed_urls={}, completed_extraction={}, + debug=False): + + dl_folder = f'{to_folder}/downloads' + extract_folder = f'{to_folder}/extracted' + raw_folder = f'{to_folder}/raw' + lid_filtered = f'{to_folder}/lid_filtered' + + os.makedirs(extract_folder, exist_ok=True) + os.makedirs(raw_folder, exist_ok=True) + os.makedirs(lid_filtered, exist_ok=True) + + + to_be_manually_dowloaded = check_need_manual_downalod(dl_folder, to_manually_download_urls) + + completed_urls = download_dataset( + dl_folder, dl_dataset, completed_urls) + if debug: + print('completed urls: ', completed_urls) + + + extracted_folders = extract_all_files( + completed_urls, + extract_folder=extract_folder, + completed_extraction=completed_extraction, + debug=debug) + if debug: + print('download files have been extracted to folders: ', extracted_folders) + + converted_files = convert_files_if_needed(extracted_folders, debug=False) + for src_tgt in lang_pairs: + print(f'working on {dl_dataset.name}: {src_tgt}') + src, tgt = src_tgt.split('-') + concat_into_splits(dl_dataset, + src=src, tgt=tgt, + extracted_folders=extracted_folders, + to_folder=raw_folder, debug=debug) + print('completed data into: ', raw_folder) + +def download_czang16(download_to, username=None): + wgets = [ + f'wget --user={username} --password=czeng -P {download_to} http://ufallab.ms.mff.cuni.cz/~bojar/czeng16-data/data-plaintext-format.{i}.tar' + for i in range(10)] + cmds = [] + for i, cmd in enumerate(wgets): + filename = f'{download_to}/data-plaintext-format.{i}.tar' + if os.path.exists(filename): + print(f'{filename} has already been downloaded; so skip') + continue + cmds.append(cmd) + if cmds and username is None: + raise ValueError('No czeng username is given; please register at http://ufal.mff.cuni.cz/czeng/czeng16 to obtain username to download') + for cmd in cmds: + call(cmd) + print('done with downloading czeng1.6') + +def download_czeng17_script(download_to, extract_folder, debug=False): + url = 'http://ufal.mff.cuni.cz/czeng/download.php?f=convert_czeng16_to_17.pl.zip' + filename = f'{download_to}/convert_czeng16_to_17.pl.zip' + extract_to = f'{extract_folder}/{get_extract_name(filename)}' + script_path = f'{extract_to}/convert_czeng16_to_17.pl' + + if not os.path.exists(script_path): + wget.download(url, filename, bar=bar_custom) + extract_to = extract_file(f'{download_to}/convert_czeng16_to_17.pl.zip', extract_folder, get_extract_name=get_extract_name, debug=debug) + return script_path + +czeng17_script_path = "" +def convert2czeng17(file, debug): + en_file = f'{file}.en' + cs_file = f'{file}.cs' + + if not os.path.exists(en_file) or not os.path.exists(cs_file): + cs_cmd = f'cat {file} | perl {czeng17_script_path} | cut -f3 > {cs_file}' + en_cmd = f'cat {file} | perl {czeng17_script_path} | cut -f4 > {en_file}' + call(cs_cmd, debug) + call(en_cmd, debug) + else: + print(f'already extracted: {en_file} and {cs_file}') + return file + +def extract_czeng17(extract_folder, debug=False): + url = 'http://ufal.mff.cuni.cz/czeng/download.php?f=convert_czeng16_to_17.pl.zip' + filename = f'{download_to}/convert_czeng16_to_17.pl.zip' + extract_to = f'{extract_folder}/{get_extract_name(filename)}' + script_path = f'{extract_to}/convert_czeng16_to_17.pl' + + if not os.path.exists(script_path): + wget.download(url, filename, bar=bar_custom) + extract_to = extract_file(f'{download_to}/convert_czeng16_to_17.pl.zip', extract_folder, get_extract_name=get_extract_name, debug=debug) + return script_path + +######### +# definitions of wmt data sources +# for es-en +# Punctuation in the official test sets will be encoded with ASCII characters (not complex Unicode characters) as much as possible. You may want to normalize your system's output before submission. You are able able to use a rawer version of the test sets that does not have this normalization. +# script to normalize punctuation: http://www.statmt.org/wmt11/normalize-punctuation.perl +wmt13_es_en = DLDataset( + name='wmt13_es-en', + train_urls=[ + 'http://www.statmt.org/wmt13/training-parallel-europarl-v7.tgz', + 'http://www.statmt.org/wmt13/training-parallel-commoncrawl.tgz', + 'http://www.statmt.org/wmt13/training-parallel-un.tgz', + 'http://www.statmt.org/wmt13/training-parallel-nc-v8.tgz', + ], + valid_urls=[ + ('http://www.statmt.org/wmt13/dev.tgz', 'wmt13_dev.tgz') + ], + test_urls=[ + ('http://www.statmt.org/wmt13/test.tgz', 'wmt13_test.tgz') + ], + train_files_patterns=[ + ('*/europarl-v7.{src}-{tgt}.{lang}', ['es-en']), + ('*commoncrawl.{src}-{tgt}.{lang}', ['es-en']), + ('*/news-commentary-v8.{src}-{tgt}.{lang}', ['es-en']), + ('un/*undoc.2000.{src}-{tgt}.{lang}', ['es-en']), + ] , + valid_files_patterns=[ + ('dev/newstest2012.{lang}', ['es-en']) + ], + test_files_patterns=[ + ('test/newstest*.{lang}', ['es-en']) + ], +) + +wmt14_de_fr_en = DLDataset( + name='wmt14_de_fr_en', + train_urls=[ + 'http://www.statmt.org/wmt13/training-parallel-europarl-v7.tgz', + 'http://www.statmt.org/wmt13/training-parallel-commoncrawl.tgz', + 'http://www.statmt.org/wmt13/training-parallel-un.tgz', + 'http://www.statmt.org/wmt14/training-parallel-nc-v9.tgz', + ('http://www.statmt.org/wmt10/training-giga-fren.tar', 'training-giga-fren.gz.tar'), #it is actuall a gz.tar + ], + valid_urls=[ + ('http://www.statmt.org/wmt14/dev.tgz', 'wmt14_dev.tgz'), + ], + test_urls=[ + ('http://www.statmt.org/wmt14/test-full.tgz', 'wmt14_test_full.tgz'), # cleaned test sets + ], + train_files_patterns=[ + ('*/europarl-v7.{src}-{tgt}.{lang}', ['fr-en', 'de-en']), + ('*commoncrawl.{src}-{tgt}.{lang}', ['fr-en', 'de-en']), + ('*/*news-commentary-v9.{src}-{tgt}.{lang}', ['fr-en', 'de-en']), + ('un/undoc.2000.{src}-{tgt}.{lang}', ['fr-en']), + ('*giga-{src}{tgt}*{lang}', ['fr-en']) + ], + valid_files_patterns=[ + ('dev/newstest2013.{lang}', ['fr-en', 'de-en']) + ], + test_files_patterns=[ + ('test-full/newstest*{src}{tgt}-{src:src}{tgt:ref}.{lang}', ['en-de', 'de-en', 'fr-en', 'en-fr']), + ], +) + +# pip install git+https://github.com/amake/tmx2corpus.git +wmt16_ro_en = DLDataset( + name='wmt16_ro-en', + train_urls=[ + ('http://data.statmt.org/wmt16/translation-task/training-parallel-ep-v8.tgz', 'wmt16_training-parallel-ep-v8.tgz'), + ('http://opus.nlpl.eu/download.php?f=SETIMES/v2/tmx/en-ro.tmx.gz', 'en-ro.tmx.gz'), + ], + valid_urls=[ + ('http://data.statmt.org/wmt16/translation-task/dev-romanian-updated.tgz', 'wmt16_dev.tgz') + ], + test_urls=[ + ('http://data.statmt.org/wmt16/translation-task/test.tgz', 'wmt16_test.tgz') + ], + train_files_patterns=[ + ('*/*europarl-v8.{src}-{tgt}.{lang}', ['ro-en']), + ('bitext.{lang}', ['ro-en']) #setimes from tmux + ] , + valid_files_patterns=[ + ('dev/newsdev2016*{src}{tgt}*.{lang}', ['ro-en', 'ro-en']) + ], + test_files_patterns=[ + ('test/newstest*{src}{tgt}*.{lang}', ['ro-en', 'en-ro']) + ], +) + +cwmt_wmt_instruction = 'cwmt download instruction at: http://nlp.nju.edu.cn/cwmt-wmt' +wmt17_fi_lv_tr_zh_en_manual_downloads = [ + # fake urls to have unique keys for the data + ( ('http://nlp.nju.edu.cn/cwmt-wmt/CASIA2015.zip', 'CASIA2015.zip'), cwmt_wmt_instruction), + ( ('http://nlp.nju.edu.cn/cwmt-wmt/CASICT2011.zip', 'CASICT2011.zip'), cwmt_wmt_instruction), + ( ('http://nlp.nju.edu.cn/cwmt-wmt/CASICT2015.zip', 'CASICT2015.zip'), cwmt_wmt_instruction), + ( ('http://nlp.nju.edu.cn/cwmt-wmt/Datum2015.zip', 'Datum2015.zip'), cwmt_wmt_instruction), + ( ('http://nlp.nju.edu.cn/cwmt-wmt/Datum2017.zip', 'Datum2017.zip'), cwmt_wmt_instruction), + ( ('http://nlp.nju.edu.cn/cwmt-wmt/NEU2017.zip', 'NEU2017.zip'), cwmt_wmt_instruction), +] +wmt17_fi_lv_tr_zh_en = DLDataset( + name='wmt17_fi_lv_tr_zh_en', + train_urls=[ + ('http://data.statmt.org/wmt17/translation-task/training-parallel-ep-v8.tgz', 'wmt17_training-parallel-ep-v8.tgz'), + 'http://data.statmt.org/wmt17/translation-task/training-parallel-nc-v12.tgz', + 'http://www.statmt.org/wmt15/wiki-titles.tgz', + ('http://opus.nlpl.eu/download.php?f=SETIMES/v2/tmx/en-tr.tmx.gz', 'en-tr.tmx.gz'), + ('http://data.statmt.org/wmt17/translation-task/rapid2016.tgz', 'wmt17_rapid2016.tgz'), + 'http://data.statmt.org/wmt17/translation-task/leta.v1.tgz', + 'http://data.statmt.org/wmt17/translation-task/dcep.lv-en.v1.tgz', + 'http://data.statmt.org/wmt17/translation-task/books.lv-en.v1.tgz', + (('https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-zh.tar.gz.00', + 'https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-zh.tar.gz.01',), 'UNv1.0.en-zh.tar.gz'), + #manually download files: + ('http://nlp.nju.edu.cn/cwmt-wmt/CASIA2015.zip', 'CASIA2015.zip'), + ('http://nlp.nju.edu.cn/cwmt-wmt/CASICT2011.zip', 'CASICT2011.zip'), + ('http://nlp.nju.edu.cn/cwmt-wmt/CASICT2015.zip', 'CASICT2015.zip'), + ('http://nlp.nju.edu.cn/cwmt-wmt/Datum2015.zip', 'Datum2015.zip'), + ('http://nlp.nju.edu.cn/cwmt-wmt/Datum2017.zip', 'Datum2017.zip'), + ('http://nlp.nju.edu.cn/cwmt-wmt/NEU2017.zip', 'NEU2017.zip'), + ], + valid_urls=[ + ('http://data.statmt.org/wmt17/translation-task/dev.tgz', 'wmt17_dev.tgz'), + ], + test_urls=[ + #NEW: Improved translations for zh test sets + ('http://data.statmt.org/wmt17/translation-task/test-update-1.tgz', 'wmt17_test_zh_en.tgz'), + ('http://data.statmt.org/wmt17/translation-task/test.tgz', 'wmt17_test_others.tgz') + ], + train_files_patterns=[ + ('casict*/cas*{src:ch}{tgt:en}.txt', ['zh-en', 'zh-en'] ), + ('casia*/cas*{src:ch}{tgt:en}.txt', ['zh-en', 'zh-en'] ), + ('dataum*/Book*{src:cn}{tgt:en}.txt', ['zh-en', 'zh-en']), + ('neu*/NEU*{src:cn}{tgt:en}.txt', ['zh-en', 'zh-en'] ), + ('*/*UNv1.0.en-zh.{src:zh}{tgt:en}', ['zh-en']), + ('training/*news-commentary-v12.{src}-{tgt}.{lang}', ['zh-en', ]), + + ('*/*europarl-v8.{src}-{tgt}.{lang}', ['fi-en', 'lv-en']), + ('wiki/fi-en/titles.{src}-{tgt}.{lang}', ['fi-en', ]), + ('rapid2016.{tgt}-{src}.{lang}', ['fi-en', 'lv-en']), + ('*/leta.{lang}', ['lv-en']), + ('*/dcep.{lang}', ['lv-en']), + ('*/farewell.{lang}', ['lv-en']), + ('bitext.{lang}', ['tr-en']), + ] , + valid_files_patterns=[ + ('dev/newsdev2017*{src}{tgt}-{src:src}{tgt:ref}.{lang}', + [ + 'fi-en', 'lv-en', 'tr-en', 'zh-en', + 'en-fi', 'en-lv', 'en-tr', 'en-zh' + ]), + ('dev/newstest2016*{src}{tgt}-{src:src}{tgt:ref}.{lang}', + [ + 'fi-en', 'tr-en', + 'en-fi', 'en-tr', + ]), + ], + test_files_patterns=[ + ('test/newstest2017-{src}{tgt}-{src:src}{tgt:ref}.{lang}', + [ + 'fi-en', 'lv-en', 'tr-en', + 'en-fi', 'en-lv', 'en-tr', + ]), + ('newstest2017-{src}{tgt}-{src:src}{tgt:ref}.{lang}', + [ + 'zh-en', + 'en-zh' + ]), + ], +) + +czeng_instruction = 'download instruction at: http://ufal.mff.cuni.cz/czeng/czeng16' +#alternative: use the prepared data but detokenize it? +wmt18_cs_et_en_manual_downloads = [ +#for cs, need to register and download; Register and download CzEng 1.6. +#Better results can be obtained by using a subset of sentences, released under a new version name CzEng 1.7. + # ((f'http://ufallab.ms.mff.cuni.cz/~bojar/czeng16-data/data-plaintext-format.{i}.tar', + # f'data-plaintext-format.{i}.tar'), czeng_instruction) + # for i in range(10) +] + +wmt18_cs_et_en = DLDataset( + name='wmt18_cs_et_en', + train_urls=[ + 'http://www.statmt.org/wmt13/training-parallel-europarl-v7.tgz', + 'http://data.statmt.org/wmt18/translation-task/training-parallel-ep-v8.tgz', + 'https://s3.amazonaws.com/web-language-models/paracrawl/release1/paracrawl-release1.en-cs.zipporah0-dedup-clean.tgz', + 'https://s3.amazonaws.com/web-language-models/paracrawl/release1/paracrawl-release1.en-et.zipporah0-dedup-clean.tgz', + 'http://www.statmt.org/wmt13/training-parallel-commoncrawl.tgz', + 'http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz', + ('http://data.statmt.org/wmt18/translation-task/rapid2016.tgz', 'wmt18_rapid2016.tgz'), + # (tuple( + # (f'http://ufallab.ms.mff.cuni.cz/~bojar/czeng16-data/data-plaintext-format.{i}.tar', + # f'data-plaintext-format.{i}.tar') + # for i in range(10) + # ), + # 'czeng16_data_plaintext.gz.tar'), + ], + valid_urls=[ + ('http://data.statmt.org/wmt18/translation-task/dev.tgz', 'wmt18_dev.tgz'), + ], + test_urls=[ + ('http://data.statmt.org/wmt18/translation-task/test.tgz', 'wmt18_test.tgz'), + ], + train_files_patterns=[ + # ('*/*europarl-v7.{src}-{tgt}.{lang}', ['cs-en']), + ('*/*europarl-v8.{src}-{tgt}.{lang}', ['et-en']), + # ('*paracrawl-release1.{tgt}-{src}.zipporah0-dedup-clean.{lang}', ['cs-en', 'et-en']), + ('*paracrawl-release1.{tgt}-{src}.zipporah0-dedup-clean.{lang}', ['et-en']), + # ('*commoncrawl.{src}-{tgt}.{lang}', ['cs-en']), + # ('*/news-commentary-v13.{src}-{tgt}.{lang}', ['cs-en']), + # ('data.plaintext-format/*train.{lang}', ['cs-en']), + ('rapid2016.{tgt}-{src}.{lang}', ['et-en']), + ] , + valid_files_patterns=[ + ('dev/newsdev2018*{src}{tgt}-{src:src}{tgt:ref}.{lang}', ['et-en']), + # ('dev/newstest2017*{src}{tgt}-{src:src}{tgt:ref}.{lang}', ['cs-en']) + ], + test_files_patterns=[ + ('test/newstest2018-{src}{tgt}-{src:src}{tgt:ref}.{lang}', + # ['cs-en', 'et-en']), + ['et-en']), + ] +) + +ru_en_yandex_instruction = 'Yandex Corpus download instruction at: https://translate.yandex.ru/corpus?lang=en' +wmt19_ru_gu_kk_lt_manual_downloads = [ + (('https://translate.yandex.ru/corpus?lang=en', 'wmt19_1mcorpus.zip'), ru_en_yandex_instruction) +] +wmt19_ru_gu_kk_lt = DLDataset( + name='wmt19_ru_gu_kk_lt', + train_urls=[ + 'http://www.statmt.org/europarl/v9/training/europarl-v9.lt-en.tsv.gz', + 'https://s3.amazonaws.com/web-language-models/paracrawl/release3/en-lt.bicleaner07.tmx.gz', + 'https://s3.amazonaws.com/web-language-models/paracrawl/release1/paracrawl-release1.en-ru.zipporah0-dedup-clean.tgz', + 'http://www.statmt.org/wmt13/training-parallel-commoncrawl.tgz', + 'http://data.statmt.org/news-commentary/v14/training/news-commentary-v14-wmt19.en-kk.tsv.gz', + 'http://data.statmt.org/news-commentary/v14/training/news-commentary-v14.en-ru.tsv.gz', + 'http://data.statmt.org/wikititles/v1/wikititles-v1.kk-en.tsv.gz', + 'http://data.statmt.org/wikititles/v1/wikititles-v1.ru-en.tsv.gz', + 'http://data.statmt.org/wikititles/v1/wikititles-v1.kk-en.tsv.gz', + 'http://data.statmt.org/wikititles/v1/wikititles-v1.lt-en.tsv.gz', + 'http://data.statmt.org/wikititles/v1/wikititles-v1.gu-en.tsv.gz', + (('https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-ru.tar.gz.00', + 'https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-ru.tar.gz.01', + 'https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-ru.tar.gz.02',), + 'wmt19_UNv1.0.en-ru.tar.gz'), + 'https://tilde-model.s3-eu-west-1.amazonaws.com/rapid2016.en-lt.tmx.zip', + ('https://translate.yandex.ru/corpus?lang=en', 'wmt19_1mcorpus.zip'), + ], + valid_urls=[ + ('http://data.statmt.org/wmt19/translation-task/dev.tgz', 'wmt19_dev.tgz'), + ], + test_urls=[ + ('http://data.statmt.org/wmt19/translation-task/test.tgz', 'wmt19_test.tgz'), + ], + train_files_patterns=[ + ('*europarl-v9.{src}-{tgt}.tsv.{lang}', ['lt-en']), + #paracrawl + ('*paracrawl-release1.{tgt}-{src}.zipporah0-dedup-clean.{lang}', ['ru-en']), + ('bitext.{lang}', ['lt-en',]), + ('*commoncrawl.{src}-{tgt}.{lang}', ['ru-en',]), + ('*news-commentary-v14-wmt19.{tgt}-{src}.tsv.{lang}', ['kk-en', ]), + ('*news-commentary-v14.{tgt}-{src}.tsv.{lang}', ['ru-en']), + #yandex + ('corpus.{tgt}_{src}.1m.{lang}', ['ru-en']), + ('wikititles_v1_wikititles-v1.{src}-{tgt}.tsv.{lang}', ['ru-en', 'kk-en', 'lt-en', 'gu-en']), + ('*/UNv1.0.{tgt}-{src}.{lang}', ['ru-en']), + #rapid + ('bitext.{lang}', ['lt-en']) + ], + valid_files_patterns=[ + ('dev/newsdev2019*{src}{tgt}-{src:src}{tgt:ref}.{lang}', ['gu-en', 'kk-en', 'lt-en']), + ('dev/newstest2018*{src}{tgt}-{src:src}{tgt:ref}.{lang}', ['ru-en']), + ], + test_files_patterns=[ + ('sgm/newstest2019-{src}{tgt}-{src:src}{tgt:ref}.{lang}', + ['ru-en', 'gu-en', 'kk-en', 'lt-en', 'en-ru', 'en-gu', 'en-kk', 'en-lt']), + ] +) + + +######### + +if __name__ == "__main__": + # speed up the downloads with multiple processing + dl_folder = f'{to_data_path}/downloads' + extract_folder = f'{to_data_path}/extracted' + + urls = [ + url + for dataset in [wmt13_es_en, wmt14_de_fr_en, wmt16_ro_en, wmt18_cs_et_en, wmt19_ru_gu_kk_lt] + for urls in [dataset.train_urls, dataset.valid_urls, dataset.test_urls] + for url in urls + ] + urls = set(urls) + download_multi(dl_folder, extract_folder, urls, num_processes=8, debug=True) + + # check manually downlaods + to_manually_download_urls = ( + wmt17_fi_lv_tr_zh_en_manual_downloads + wmt18_cs_et_en_manual_downloads + wmt19_ru_gu_kk_lt_manual_downloads + ) + to_be_manually_dowloaded = check_need_manual_downalod(dl_folder, to_manually_download_urls) + if len(to_be_manually_dowloaded) > 0: + print('Missing files that need to be downloaded manually; stop the process now.') + exit(-1) + + completed_urls = {} + completed_extraction = {} + def work_on_wmt(directions, wmt_data): + download_and_extract( + to_data_path, + directions, + wmt_data, + to_manually_download_urls=to_manually_download_urls, + completed_urls=completed_urls, completed_extraction=completed_extraction, debug=True) + + work_on_wmt( + ['es_XX-en_XX'], + wmt13_es_en,) + work_on_wmt( + [ + 'fr_XX-en_XX', 'en_XX-fr_XX', + # 'en_XX-de_DE', 'de_DE-en_XX', + ], + wmt14_de_fr_en,) + work_on_wmt( + ['ro_RO-en_XX', 'en_XX-ro_XX'], + wmt16_ro_en,) + work_on_wmt( + [ + # 'zh_CN-en_XX', + 'lv_LV-en_XX', 'fi_FI-en_XX', 'tr_TR-en_XX', + #in case the reversed directions have different train/valid/test data + # 'en_XX-zh_CN', + 'en_XX-lv_LV', 'en_XX-fi_FI', 'en_XX-tr_TR', + ], + wmt17_fi_lv_tr_zh_en, ) + # czeng17_script_path = download_czeng17_script(download_to, extract_to, debug=False) + # cz_username = None + work_on_wmt( + [ + # 'cs_CZ-en_XX', + 'et_EE-en_XX'], + wmt18_cs_et_en,) + work_on_wmt( + [ + # 'ru_RU-en_XX', 'en_XX-ru_RU', + 'gu_IN-en_XX', 'kk_KZ-en_XX', 'lt_LT-en_XX', + #in case the reversed directions have different train/valid/test data + 'en_XX-gu_IN', 'en_XX-kk_KZ', 'en_XX-lt_LT' + ], + wmt19_ru_gu_kk_lt,) + + not_matching = check_wmt_test_bleu( + f'{to_data_path}/raw', + [ + ('wmt13', ['es_XX-en_XX']), + ('wmt14/full', ['fr_XX-en_XX',]), + ('wmt16', ['ro_RO-en_XX',]), + # ('wmt17/improved', ['zh_CN-en_XX']), + ('wmt17', [ 'lv_LV-en_XX', 'fi_FI-en_XX', 'tr_TR-en_XX']), + ('wmt18', ['cs_CZ-en_XX', 'et_EE-en_XX']), + ('wmt19', ['gu_IN-en_XX', 'kk_KZ-en_XX', 'lt_LT-en_XX']), + #'ru_RU-en_XX', + ] + ) + if len(not_matching) > 0: + print('the following datasets do not have matching test datasets:\n\t', '\n\t'.join(not_matching)) + diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt20.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt20.sh new file mode 100644 index 0000000..31cd5c7 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/download_wmt20.sh @@ -0,0 +1,547 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + + + +set -x -e + +# TODO update the workdir and dest dir name +# put fasttext model +WORKDIR=$WORKDIR_ROOT +# put intermediate files +TMP_DIR=$WORKDIR_ROOT/tmp/tmp_wmt20_lowres_download +# output {train,valid,test} files to dest +DEST=$WORKDIR_ROOT/ML50/raw + +UTILS=$PWD/utils + +# per dataset locations +COMMONCRAWL_DIR=$TMP_DIR/commoncrawl +YANDEX_CORPUS=$WORKDIR_ROOT/wmt20/official/ru/yandex/1mcorpus.zip +# unzipped +CZENG_CORPUS=$WORKDIR_ROOT/wmt20/official/cs/czeng/czeng20-train +CCMT_DIR=$WORKDIR_ROOT/wmt20/official/zh/ccmt/parallel + +download_and_select() { + SUBFOLDER=$1 + URL=$2 + UNCOMPRESS_CMD=$3 + LANG=$4 + INPUT_FILEPATH=$5 + if [[ $# -gt 5 ]]; then + LANG_COL=$6 + EN_COL=$7 + fi + + mkdir -p $SUBFOLDER + cd $SUBFOLDER + wget -nc --content-disposition $URL + $UNCOMPRESS_CMD + + if [[ $# -gt 5 ]]; then + cut -f$LANG_COL $INPUT_FILEPATH > $INPUT_FILEPATH.$LANG + cut -f$EN_COL $INPUT_FILEPATH > $INPUT_FILEPATH.en + fi + cd .. + + ln -sf $SUBFOLDER/$INPUT_FILEPATH.$LANG $SUBFOLDER.$LANG + ln -sf $SUBFOLDER/$INPUT_FILEPATH.en $SUBFOLDER.en +} + +prepare_lid() { + pip install fasttext + + # TODO specify global workdir + MODEL=$WORKDIR/fasttext/lid.176.bin + LID_MULTI=$UTILS/fasttext_multi_filter.py + + if [ ! -f "$MODEL" ]; then + echo "downloading fasttext lid model..." + mkdir -p $WORKDIR/fasttext + wget -nc https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin -O $MODEL + fi +} + +prepare_moses() { + pushd $UTILS + echo 'Cloning Moses github repository (for tokenization scripts)...' + git clone https://github.com/moses-smt/mosesdecoder.git + popd +} + +lid_filter() { + # TODO specify global workdir + MODEL=$WORKDIR/fasttext/lid.176.bin + LID_MULTI=$UTILS/fasttext_multi_filter.py + + prepare_lid + + SRC=$1 + SRC_FILE=$2 + SRC_OUTPUT=$3 + TGT=$4 + TGT_FILE=$5 + TGT_OUTPUT=$6 + python $LID_MULTI --model $MODEL --inputs $SRC_FILE $TGT_FILE --langs $SRC $TGT --outputs $SRC_OUTPUT $TGT_OUTPUT +} + +prepare_ja_ted() { + mkdir -p ted + cd ted + + wget -nc https://wit3.fbk.eu/archive/2017-01-trnted//texts/en/ja/en-ja.tgz + tar -zxvf en-ja.tgz + cat en-ja/train.tags.en-ja.en | grep -v -P "^[ ]*\<" | sed 's/^[ \t]*//g' | sed 's/[ \t]*$//g' > en-ja/train.en-ja.en + cat en-ja/train.tags.en-ja.ja | grep -v -P "^[ ]*\<" | sed 's/^[ \t]*//g' | sed 's/[ \t]*$//g' > en-ja/train.en-ja.ja + + cd .. + ln -sf ted/en-ja/train.en-ja.ja ted.ja + ln -sf ted/en-ja/train.en-ja.en ted.en +} + +prepare_ja() { + OUTPUT_DIR=$TMP_DIR/ja + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select paracrawl "http://www.kecl.ntt.co.jp/icl/lirg/jparacrawl/release/2.0/bitext/en-ja.tar.gz" "tar -zxvf en-ja.tar.gz" ja en-ja/en-ja.bicleaner05.txt 4 3 & + download_and_select newscommentary "http://data.statmt.org/news-commentary/v15/training/news-commentary-v15.en-ja.tsv.gz" "gunzip -f news-commentary-v15.en-ja.tsv.gz" ja news-commentary-v15.en-ja.tsv 2 1 & + download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.ja-en.tsv.gz" "gunzip -f wikititles-v2.ja-en.tsv.gz" ja wikititles-v2.ja-en.tsv 1 2 & + download_and_select wikimatrix "http://data.statmt.org/wmt20/translation-task/WikiMatrix/WikiMatrix.v1.en-ja.langid.tsv.gz" "gunzip -f WikiMatrix.v1.en-ja.langid.tsv.gz" ja WikiMatrix.v1.en-ja.langid.tsv 3 2 & + download_and_select subtitle "https://nlp.stanford.edu/projects/jesc/data/split.tar.gz" "tar -zxvf split.tar.gz" ja split/train 2 1 & + download_and_select kftt "http://www.phontron.com/kftt/download/kftt-data-1.0.tar.gz" "tar -zxvf kftt-data-1.0.tar.gz" ja kftt-data-1.0/data/orig/kyoto-train & + + prepare_ja_ted & + + # ted data needs to + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.ja" | sort -V | xargs cat > all.ja + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter ja all.ja $DEST/train.ja_XX-en_XX.ja_XX en all.en $DEST/train.ja_XX-en_XX.en_XX +} + +prepare_ta() { + OUTPUT_DIR=$TMP_DIR/ta + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.ta-en.tsv.gz" "gunzip -f wikititles-v2.ta-en.tsv.gz" ta wikititles-v2.ta-en.tsv 1 2 & + download_and_select wikimatrix "http://data.statmt.org/wmt20/translation-task/WikiMatrix/WikiMatrix.v1.en-ta.langid.tsv.gz" "gunzip -f WikiMatrix.v1.en-ta.langid.tsv.gz" ta WikiMatrix.v1.en-ta.langid.tsv 3 2 & + download_and_select pmindia "http://data.statmt.org/pmindia/v1/parallel/pmindia.v1.ta-en.tsv" "" ta pmindia.v1.ta-en.tsv 2 1 & + download_and_select tanzil "https://object.pouta.csc.fi/OPUS-Tanzil/v1/moses/en-ta.txt.zip" "unzip en-ta.txt.zip" ta Tanzil.en-ta & + download_and_select pib "http://preon.iiit.ac.in/~jerin/resources/datasets/pib-v0.tar" "tar -xvf pib-v0.tar" ta pib/en-ta/train & + download_and_select mkb "http://preon.iiit.ac.in/~jerin/resources/datasets/mkb-v0.tar" "tar -xvf mkb-v0.tar" ta mkb/en-ta/mkb & + download_and_select ufal "http://ufal.mff.cuni.cz/~ramasamy/parallel/data/v2/en-ta-parallel-v2.tar.gz" "tar -zxvf en-ta-parallel-v2.tar.gz" ta en-ta-parallel-v2/corpus.bcn.train & + + wait + + # need special handling for nlpc + mkdir -p nlpc + cd nlpc + wget -nc https://raw.githubusercontent.com/nlpc-uom/English-Tamil-Parallel-Corpus/master/En-Ta%20Corpus/En-Ta%20English.txt + wget -nc https://github.com/nlpc-uom/English-Tamil-Parallel-Corpus/raw/master/En-Ta%20Corpus/En-Ta%20Tamil.txt + tail -n +4 "En-Ta English.txt" > en-ta.en + tail -n +4 "En-Ta Tamil.txt" > en-ta.ta + cd .. + ln -sf nlpc/en-ta.en nlpc.en + ln -sf nlpc/en-ta.ta nlpc.ta + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.ta" | sort -V | xargs cat > all.ta + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter ta all.ta $DEST/train.ta_IN-en_XX.ta_IN en all.en $DEST/train.ta_IN-en_XX.en_XX +} + +prepare_iu() { + OUTPUT_DIR=$TMP_DIR/iu + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select nh "https://nrc-digital-repository.canada.ca/eng/view/dataset/?id=c7e34fa7-7629-43c2-bd6d-19b32bf64f60" "tar -zxvf Nunavut-Hansard-Inuktitut-English-Parallel-Corpus-3.0.1.tgz" iu Nunavut-Hansard-Inuktitut-English-Parallel-Corpus-3.0/NunavutHansard > /dev/null & + download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.iu-en.tsv.gz" "gunzip -f wikititles-v2.iu-en.tsv.gz" iu wikititles-v2.iu-en.tsv 1 2 & + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.iu" | sort -V | xargs cat | nh/Nunavut-Hansard-Inuktitut-English-Parallel-Corpus-3.0/scripts/normalize-iu-spelling.pl > all.iu + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + paste all.iu all.en | awk -F $'\t' '$1!=""&&$2!=""' > all.iuen + cut -f1 all.iuen > $DEST/train.iu_CA-en_XX.iu_CA + cut -f2 all.iuen > $DEST/train.iu_CA-en_XX.en_XX +} + +prepare_km() { + OUTPUT_DIR=$TMP_DIR/km + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select paracrawl "http://data.statmt.org/wmt20/translation-task/ps-km/wmt20-sent.en-km.xz" "unxz wmt20-sent.en-km.zx" km wmt20-sent.en-km 2 1 & + + # km-parallel has multiple sets, concat all of them together + mkdir -p opus + cd opus + wget -nc "http://data.statmt.org/wmt20/translation-task/ps-km/km-parallel.tgz" + tar -zxvf km-parallel.tgz + find ./km-parallel -maxdepth 1 -name "*.km" | sort -V | xargs cat > opus.km + find ./km-parallel -maxdepth 1 -name "*.en" | sort -V | xargs cat > opus.en + cd .. + ln -sf opus/opus.km . + ln -sf opus/opus.en . + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.km" | sort -V | xargs cat > all.km + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter km all.km $DEST/train.km_KH-en_XX.km_KH en all.en $DEST/train.km_KH-en_XX.en_XX +} + +prepare_ps() { + OUTPUT_DIR=$TMP_DIR/ps + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select paracrawl "http://data.statmt.org/wmt20/translation-task/ps-km/wmt20-sent.en-ps.xz" "unxz wmt20-sent.en-ps.xz" ps wmt20-sent.en-ps 2 1 & + download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.ps-en.tsv.gz" "gunzip -f wikititles-v2.ps-en.tsv.gz" ps wikititles-v2.ps-en.tsv 1 2 & + # ps-parallel has multiple sets, concat all of them together + mkdir -p opus + cd opus + wget -nc "http://data.statmt.org/wmt20/translation-task/ps-km/ps-parallel.tgz" + tar -zxvf ps-parallel.tgz + find ./ps-parallel -maxdepth 1 -name "*.ps" | sort -V | xargs cat > opus.ps + find ./ps-parallel -maxdepth 1 -name "*.en" | sort -V | xargs cat > opus.en + cd .. + ln -sf opus/opus.ps opus.ps + ln -sf opus/opus.en opus.en + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.ps" | sort -V | xargs cat > all.ps + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter ps all.ps $DEST/train.ps_AF-en_XX.ps_AF en all.en $DEST/train.ps_AF-en_XX.en_XX +} + +download_commoncrawl() { + mkdir -p $COMMONCRAWL_DIR + cd $COMMONCRAWL_DIR + + wget -nc "http://www.statmt.org/wmt13/training-parallel-commoncrawl.tgz" + tar -zxvf training-parallel-commoncrawl.tgz +} +link_commoncrawl() { + LANG=$1 + ln -sf $COMMONCRAWL_DIR/commoncrawl.$LANG-en.en commoncrawl.en + ln -sf $COMMONCRAWL_DIR/commoncrawl.$LANG-en.$LANG commoncrawl.$LANG +} + +strip_xlf() { + INPUT_FILE=$1 + SRC=$2 + TGT=$3 + grep '<source xml:lang=' $INPUT_FILE | sed 's/^<[^<>]*>//g' | sed 's/<[^<>]*>$//g' > $INPUT_FILE.$SRC + grep '<target xml:lang=' $INPUT_FILE | sed 's/^<[^<>]*>//g' | sed 's/<[^<>]*>$//g' > $INPUT_FILE.$TGT +} + +download_and_process_tilde() { + URL=$1 + UNCOMPRESS_CMD=$2 + FILENAME=$3 + LANG=$4 + PROCESS_CMD=$5 + + mkdir -p tilde + cd tilde + wget -nc $URL + $UNCOMPRESS_CMD + echo "executing cmd" + echo $PROCESS_CMD + $PROCESS_CMD + cd .. + ln -sf tilde/$FILENAME.$LANG tilde.$LANG + ln -sf tilde/$FILENAME.en tilde.en +} + +prepare_cs() { + OUTPUT_DIR=$TMP_DIR/cs + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + #download_and_select europarl "http://www.statmt.org/europarl/v10/training/europarl-v10.cs-en.tsv.gz" "gunzip europarl-v10.cs-en.tsv.gz" cs europarl-v10.cs-en.tsv 1 2 & + #download_and_select paracrawl "https://s3.amazonaws.com/web-language-models/paracrawl/release5.1/en-cs.txt.gz" "gunzip en-cs.txt.gz" cs en-cs.txt 2 1 & + #link_commoncrawl cs + #download_and_select newscommentary "http://data.statmt.org/news-commentary/v15/training/news-commentary-v15.cs-en.tsv.gz" "gunzip news-commentary-v15.cs-en.tsv.gz" cs news-commentary-v15.cs-en.tsv 1 2 & + #download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.cs-en.tsv.gz" "gunzip wikititles-v2.cs-en.tsv.gz" cs wikititles-v2.cs-en.tsv 1 2 & + #download_and_process_tilde "http://data.statmt.org/wmt20/translation-task/rapid/RAPID_2019.cs-en.xlf.gz" "gunzip RAPID_2019.cs-en.xlf.gz" RAPID_2019.cs-en.xlf cs "strip_xlf RAPID_2019.cs-en.xlf cs en" & + #download_and_select wikimatrix "http://data.statmt.org/wmt20/translation-task/WikiMatrix/WikiMatrix.v1.cs-en.langid.tsv.gz" "gunzip WikiMatrix.v1.cs-en.langid.tsv.gz" cs WikiMatrix.v1.cs-en.langid.tsv 2 3 & + + #wait + + # remove previous results + #rm -f all.?? + #find ./ -maxdepth 1 -name "*.cs" | sort -V | xargs cat > all.cs + #find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + if [ -z $CZENG_CORPUS ] ; + then + echo "Please download CZENG_CORPUS manually and place them at $CZENG_CORPUS. Exitting..." + exit + fi + cat $CZENG_CORPUS | sed '/^$/d' | cut -f5 > all.cs + cat $CZENG_CORPUS | sed '/^$/d' | cut -f6 > all.en + + lid_filter cs all.cs $DEST/train.cs_CZ-en_XX.cs_CZ en all.en $DEST/train.cs_CZ-en_XX.en_XX +} + +prepare_de() { + OUTPUT_DIR=$TMP_DIR/de + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select europarl "http://www.statmt.org/europarl/v10/training/europarl-v10.de-en.tsv.gz" "gunzip europarl-v10.de-en.tsv.gz" de europarl-v10.de-en.tsv 1 2 & + download_and_select paracrawl "https://s3.amazonaws.com/web-language-models/paracrawl/release5.1/en-de.txt.gz" "gunzip en-de.txt.gz" de en-de.txt 2 1 & + link_commoncrawl de + download_and_select newscommentary "http://data.statmt.org/news-commentary/v15/training/news-commentary-v15.de-en.tsv.gz" "gunzip news-commentary-v15.de-en.tsv.gz" de news-commentary-v15.de-en.tsv 1 2 & + download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.de-en.tsv.gz" "gunzip wikititles-v2.de-en.tsv.gz" de wikititles-v2.de-en.tsv 1 2 & + download_and_process_tilde "http://data.statmt.org/wmt20/translation-task/rapid/RAPID_2019.de-en.xlf.gz" "gunzip RAPID_2019.de-en.xlf.gz" RAPID_2019.de-en.xlf de "strip_xlf RAPID_2019.de-en.xlf de en" & + download_and_select wikimatrix "http://data.statmt.org/wmt20/translation-task/WikiMatrix/WikiMatrix.v1.de-en.langid.tsv.gz" "gunzip WikiMatrix.v1.de-en.langid.tsv.gz" de WikiMatrix.v1.de-en.langid.tsv 2 3 & + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.de" | sort -V | xargs cat > all.de + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter de all.de $DEST/train.de_DE-en_XX.de_DE en all.en $DEST/train.de_DE-en_XX.en_XX +} + +prepare_tmx() { + TMX_FILE=$1 + git clone https://github.com/amake/TMX2Corpus $UTILS/tmx2corpus + pip install tinysegmenter + + python $UTILS/tmx2corpus/tmx2corpus.py $TMX_FILE +} + +prepare_pl() { + OUTPUT_DIR=$TMP_DIR/pl + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + # download_and_select europarl "http://www.statmt.org/europarl/v10/training/europarl-v10.pl-en.tsv.gz" "gunzip europarl-v10.pl-en.tsv.gz" pl europarl-v10.pl-en.tsv 1 2 & + # download_and_select paracrawl "https://s3.amazonaws.com/web-language-models/paracrawl/release5.1/en-pl.txt.gz" "gunzip en-pl.txt.gz" pl en-pl.txt 2 1 & + # download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.pl-en.tsv.gz" "gunzip wikititles-v2.pl-en.tsv.gz" pl wikititles-v2.pl-en.tsv 1 2 & + download_and_select tilde "https://tilde-model.s3-eu-west-1.amazonaws.com/rapid2019.en-pl.tmx.zip" "gunzip rapid2019.en-pl.tmx.zip" bitext pl "prepare_tmx RAPID_2019.UNIQUE.en-pl.tmx" & + # download_and_select wikimatrix "http://data.statmt.org/wmt20/translation-task/WikiMatrix/WikiMatrix.v1.en-pl.langid.tsv.gz" "gunzip WikiMatrix.v1.en-pl.langid.tsv.gz" pl WikiMatrix.v1.en-pl.langid.tsv 3 2 & + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.pl" | sort -V | xargs cat > all.pl + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter pl all.pl $DEST/train.pl_PL-en_XX.pl_PL en all.en $DEST/train.pl_PL-en_XX.en_XX +} + +prepare_uncorpus() { + $URLS=$1 + $FILES=$2 + + mkdir -p uncorpus + cd uncorpus + + for URL in $URLS; do + wget -nc $URL + done + cat $FILES > uncorpus.tar.gz + tar -zxvf uncorpus.tar.gz + + cd .. + ln -sf uncorpus/en-$LANG/UNv1.0.en-$LANG.$LANG uncorpus.$LANG + ln -sf uncorpus/en-$LANG/UNv1.0.en-$LANG.en uncorpus.en +} + +prepare_yandex() { + mkdir -p yandex + cd yandex + unzip $YANDEX_CORPUS ./ + cd .. + ln -s yandex/corpus.en_ru.1m.en yandex.en + ln -s yandex/corpus.en_ru.1m.ru yandex.ru +} + +prepare_ru() { + OUTPUT_DIR=$TMP_DIR/ru + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select paracrawl "https://s3.amazonaws.com/web-language-models/paracrawl/release1/paracrawl-release1.en-ru.zipporah0-dedup-clean.tgz" "tar -zxvf paracrawl-release1.en-ru.zipporah0-dedup-clean.tgz" ru paracrawl-release1.en-ru.zipporah0-dedup-clean & + link_commoncrawl ru + download_and_select newscommentary "http://data.statmt.org/news-commentary/v15/training/news-commentary-v15.en-ru.tsv.gz" "gunzip news-commentary-v15.en-ru.tsv.gz" ru news-commentary-v15.en-ru.tsv 2 1 & + prepare_yandex & + download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.ru-en.tsv.gz" "gunzip wikititles-v2.ru-en.tsv.gz" ru wikititles-v2.ru-en.tsv 1 2 & + prepare_uncorpus "https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-ru.tar.gz.00 https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-ru.tar.gz.01 https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-ru.tar.gz.02" "UNv1.0.en-ru.tar.gz.00 UNv1.0.en-ru.tar.gz.01 UNv1.0.en-ru.tar.gz.02" & + download_and_select wikimatrix "http://data.statmt.org/wmt20/translation-task/WikiMatrix/WikiMatrix.v1.en-ru.langid.tsv.gz" "gunzip WikiMatrix.v1.en-ru.langid.tsv.gz" ru WikiMatrix.v1.en-ru.langid.tsv 3 2 & + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.ru" | sort -V | xargs cat > all.ru + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter ru all.ru $DEST/train.ru_RU-en_XX.ru_RU en all.en $DEST/train.ru_RU-en_XX.en_XX +} + +prepare_ccmt() { + mkdir -p ccmt + cd ccmt + # assume ccmt data is already unzipped under CCMT_DIR folder + cat $CCMT_DIR/datum2017/Book*_cn.txt | sed 's/ //g' > datum2017.detok.zh + cat $CCMT_DIR/datum2017/Book*_en.txt > datum2017.detok.en + cat $CCMT_DIR/casict2011/casict-A_ch.txt $CCMT_DIR/casict2011/casict-B_ch.txt $CCMT_DIR/casict2015/casict2015_ch.txt $CCMT_DIR/datum2015/datum_ch.txt $CCMT_DIR/neu2017/NEU_cn.txt datum2017.detok.zh > ccmt.zh + cat $CCMT_DIR/casict2011/casict-A_en.txt $CCMT_DIR/casict2011/casict-B_en.txt $CCMT_DIR/casict2015/casict2015_en.txt $CCMT_DIR/datum2015/datum_en.txt $CCMT_DIR/neu2017/NEU_en.txt datum2017.detok.en > ccmt.en + cd .. + ln -sf ccmt/ccmt.zh ccmt.zh + ln -sf ccmt/ccmt.en ccmt.en +} + +prepare_zh() { + OUTPUT_DIR=$TMP_DIR/zh + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + + download_and_select newscommentary "http://data.statmt.org/news-commentary/v15/training/news-commentary-v15.en-zh.tsv.gz" "gunzip news-commentary-v15.en-zh.tsv.gz" zh news-commentary-v15.en-zh.tsv 2 1 & + download_and_select wikititles "http://data.statmt.org/wikititles/v2/wikititles-v2.zh-en.tsv.gz" "gunzip wikititles-v2.zh-en.tsv.gz" zh wikititles-v2.zh-en.tsv 1 2 & + prepare_uncorpus "https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-zh.tar.gz.00 https://stuncorpusprod.blob.core.windows.net/corpusfiles/UNv1.0.en-zh.tar.gz.01" "UNv1.0.en-zh.tar.gz.00 UNv1.0.en-zh.tar.gz.01" & + prepare_ccmt & + download_and_select wikimatrix "http://data.statmt.org/wmt20/translation-task/WikiMatrix/WikiMatrix.v1.en-zh.langid.tsv.gz" "gunzip WikiMatrix.v1.en-zh.langid.tsv.gz" zh WikiMatrix.v1.en-zh.langid.tsv 3 2 & + + wait + + # remove previous results + rm -f all.?? + find ./ -maxdepth 1 -name "*.zh" | sort -V | xargs cat > all.zh + find ./ -maxdepth 1 -name "*.en" | sort -V | xargs cat > all.en + lid_filter zh all.zh $DEST/train.zh_CN-en_XX.zh_CN en all.en $DEST/train.zh_CN-en_XX.en_XX +} + +prepare_tests() { + OUTPUT_DIR=$TMP_DIR + mkdir -p $OUTPUT_DIR + cd $OUTPUT_DIR + wget -nc http://data.statmt.org/wmt20/translation-task/dev.tgz + tar -zxvf dev.tgz + cd dev + + cat newsdev2020-jaen-src.ja.sgm | $UTILS/strip_sgm.sh > newsdev2020-jaen.ja + cat newsdev2020-jaen-ref.en.sgm | $UTILS/strip_sgm.sh > newsdev2020-jaen.en + split newsdev2020-jaen.ja -a 0 -n r/1/2 > $DEST/valid.ja_XX-en_XX.ja_XX + split newsdev2020-jaen.en -a 0 -n r/1/2 > $DEST/valid.ja_XX-en_XX.en_XX + split newsdev2020-jaen.ja -a 0 -n r/2/2 > $DEST/test.ja_XX-en_XX.ja_XX + split newsdev2020-jaen.en -a 0 -n r/2/2 > $DEST/test.ja_XX-en_XX.en_XX + + cat newsdev2020-iuen-src.iu.sgm | strip_sgm.sh > newsdev2020-iuen.iu + cat newsdev2020-iuen-ref.en.sgm | strip_sgm.sh > newsdev2020-iuen.en + split newsdev2020-iuen.iu -a 0 -n r/1/2 > $DEST/valid.iu_CA-en_XX.iu_CA + split newsdev2020-iuen.en -a 0 -n r/1/2 > $DEST/valid.iu_CA-en_XX.en_XX + split newsdev2020-iuen.iu -a 0 -n r/2/2 > $DEST/test.iu_CA-en_XX.iu_CA + split newsdev2020-iuen.en -a 0 -n r/2/2 > $DEST/test.iu_CA-en_XX.en_XX + + cat newsdev2020-taen-src.ta.sgm | strip_sgm.sh > newsdev2020-taen.ta + cat newsdev2020-taen-ref.en.sgm | strip_sgm.sh > newsdev2020-taen.en + split newsdev2020-taen.ta -a 0 -n r/1/2 > $DEST/valid.ta_IN-en_XX.ta_IN + split newsdev2020-taen.en -a 0 -n r/1/2 > $DEST/valid.ta_IN-en_XX.en_XX + split newsdev2020-taen.ta -a 0 -n r/2/2 > $DEST/test.ta_IN-en_XX.ta_IN + split newsdev2020-taen.en -a 0 -n r/2/2 > $DEST/test.ta_IN-en_XX.en_XX + + cp wikipedia.dev.km-en.km $DEST/valid.km_KH-en_XX.km_KH + cp wikipedia.dev.km-en.en $DEST/valid.km_KH-en_XX.en_XX + cp wikipedia.devtest.km-en.km $DEST/test.km_KH-en_XX.km_KH + cp wikipedia.devtest.km-en.en $DEST/test.km_KH-en_XX.en_XX + + cp wikipedia.dev.ps-en.ps $DEST/valid.ps_AF-en_XX.ps_AF + cp wikipedia.dev.ps-en.en $DEST/valid.ps_AF-en_XX.en_XX + cp wikipedia.devtest.ps-en.ps $DEST/test.ps_AF-en_XX.ps_AF + cp wikipedia.devtest.ps-en.en $DEST/test.ps_AF-en_XX.en_XX + + cat newsdev2020-plen-src.pl.sgm | strip_sgm.sh > newsdev2020-plen.pl + cat newsdev2020-plen-ref.en.sgm | strip_sgm.sh > newsdev2020-plen.en + split newsdev2020-plen.pl -a 0 -n r/1/2 > $DEST/valid.pl_PL-en_XX.pl_PL + split newsdev2020-plen.en -a 0 -n r/1/2 > $DEST/valid.pl_PL-en_XX.en_XX + split newsdev2020-plen.pl -a 0 -n r/2/2 > $DEST/test.pl_PL-en_XX.pl_PL + split newsdev2020-plen.en -a 0 -n r/2/2 > $DEST/test.pl_PL-en_XX.en_XX + + cat newstest2018-encs-src.en.sgm | strip_sgm.sh > $DEST/valid.en_XX-cs_CZ.en_XX + cat newstest2018-encs-ref.cs.sgm | strip_sgm.sh > $DEST/valid.en_XX-cs_CZ.cs_CZ + cat newstest2019-encs-src.en.sgm | strip_sgm.sh > $DEST/test.en_XX-cs_CZ.en_XX + cat newstest2019-encs-ref.cs.sgm | strip_sgm.sh > $DEST/test.en_XX-cs_CZ.cs_CZ + + cat newstest2018-deen-src.de.sgm | strip_sgm.sh > $DEST/valid.de_DE-en_XX.de_DE + cat newstest2018-deen-ref.en.sgm | strip_sgm.sh > $DEST/valid.de_DE-en_XX.en_XX + cat newstest2018-ende-src.en.sgm | strip_sgm.sh > $DEST/valid.en_XX-de_DE.en_XX + cat newstest2018-ende-ref.de.sgm | strip_sgm.sh > $DEST/valid.en_XX-de_DE.de_DE + cat newstest2019-deen-src.de.sgm | strip_sgm.sh > $DEST/test.de_DE-en_XX.de_DE + cat newstest2019-deen-ref.en.sgm | strip_sgm.sh > $DEST/test.de_DE-en_XX.en_XX + cat newstest2019-ende-src.en.sgm | strip_sgm.sh > $DEST/test.en_XX-de_DE.en_XX + cat newstest2019-ende-ref.de.sgm | strip_sgm.sh > $DEST/test.en_XX-de_DE.de_DE + + cat newstest2018-ruen-src.ru.sgm | strip_sgm.sh > $DEST/valid.ru_RU-en_XX.ru_RU + cat newstest2018-ruen-ref.en.sgm | strip_sgm.sh > $DEST/valid.ru_RU-en_XX.en_XX + cat newstest2018-enru-src.en.sgm | strip_sgm.sh > $DEST/valid.en_XX-ru_RU.en_XX + cat newstest2018-enru-ref.ru.sgm | strip_sgm.sh > $DEST/valid.en_XX-ru_RU.ru_RU + cat newstest2019-ruen-src.ru.sgm | strip_sgm.sh > $DEST/test.ru_RU-en_XX.ru_RU + cat newstest2019-ruen-ref.en.sgm | strip_sgm.sh > $DEST/test.ru_RU-en_XX.en_XX + cat newstest2019-enru-src.en.sgm | strip_sgm.sh > $DEST/test.en_XX-ru_RU.en_XX + cat newstest2019-enru-ref.ru.sgm | strip_sgm.sh > $DEST/test.en_XX-ru_RU.ru_RU + + cat newstest2018-zhen-src.zh.sgm | strip_sgm.sh > $DEST/valid.zh_CN-en_XX.zh_CN + cat newstest2018-zhen-ref.en.sgm | strip_sgm.sh > $DEST/valid.zh_CN-en_XX.en_XX + cat newstest2018-enzh-src.en.sgm | strip_sgm.sh > $DEST/valid.en_XX-zh_CN.en_XX + cat newstest2018-enzh-ref.zh.sgm | strip_sgm.sh > $DEST/valid.en_XX-zh_CN.zh_CN + cat newstest2019-zhen-src.zh.sgm | strip_sgm.sh > $DEST/test.zh_CN-en_XX.zh_CN + cat newstest2019-zhen-ref.en.sgm | strip_sgm.sh > $DEST/test.zh_CN-en_XX.en_XX + cat newstest2019-enzh-src.en.sgm | strip_sgm.sh > $DEST/test.en_XX-zh_CN.en_XX + cat newstest2019-enzh-ref.zh.sgm | strip_sgm.sh > $DEST/test.en_XX-zh_CN.zh_CN +} + +mkdir -p $DEST + +prepare_lid +prepare_moses +download_commoncrawl + +prepare_ja & +prepare_ta & +prepare_km & +prepare_ps & +prepare_iu & +prepare_cs & +prepare_de & +prepare_pl & +prepare_ru & +prepare_zh & + +# prepare valid/test set +prepare_tests & + +# wait + +# TODO remove intermediate files +# rm -rf $TMP_DIR diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/preprocess_ML50_v1.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/preprocess_ML50_v1.sh new file mode 100644 index 0000000..4655936 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/preprocess_ML50_v1.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +if [ -z $WORKDIR_ROOT ] ; +then + echo "please specify your working directory root in environment variable WORKDIR_ROOT. Exitting..." + exit +fi + +if [ -z $SPM_PATH ] ; +then + echo "Please install sentence piecence from https://github.com/google/sentencepiece and set SPM_PATH pointing to the installed spm_encode.py. Exitting..." + exit +fi + +ML50=${WORKDIR_ROOT}/ML50 + +mkdir -p $ML50/dedup +mkdir -p $ML50/cleaned_dedup + +python ./dedup_all.py --from-folder $ML50/raw --to-folder $ML50/dedup +python ./remove_valid_test_in_train.py --from-folder $ML50/dedup --to-folder $ML50/clean +python ./binarize.py --raw-folder $ML50/clean \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/remove_valid_test_in_train.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/remove_valid_test_in_train.py new file mode 100644 index 0000000..ef618ad --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/remove_valid_test_in_train.py @@ -0,0 +1,290 @@ +import os, sys +import glob, itertools +import pandas as pd + +WORKDIR_ROOT = os.environ.get('WORKDIR_ROOT', None) + +if WORKDIR_ROOT is None or not WORKDIR_ROOT.strip(): + print('please specify your working directory root in OS environment variable WORKDIR_ROOT. Exitting..."') + sys.exit(-1) + + +def load_langs(path): + with open(path) as fr: + langs = [l.strip() for l in fr] + return langs + + + +def load_sentences(raw_data, split, direction): + src, tgt = direction.split('-') + src_path = f"{raw_data}/{split}.{direction}.{src}" + tgt_path = f"{raw_data}/{split}.{direction}.{tgt}" + if os.path.exists(src_path) and os.path.exists(tgt_path): + return [(src, open(src_path).read().splitlines()), (tgt, open(tgt_path).read().splitlines())] + else: + return [] + +def swap_direction(d): + src, tgt = d.split('-') + return f'{tgt}-{src}' + +def get_all_test_data(raw_data, directions, split='test'): + test_data = [ + x + for dd in directions + for d in [dd, swap_direction(dd)] + for x in load_sentences(raw_data, split, d) + ] + # all_test_data = {s for _, d in test_data for s in d} + all_test_data = {} + for lang, d in test_data: + for s in d: + s = s.strip() + lgs = all_test_data.get(s, set()) + lgs.add(lang) + all_test_data[s] = lgs + return all_test_data, test_data + +def check_train_sentences(raw_data, direction, all_test_data, mess_up_train={}): + src, tgt = direction.split('-') + tgt_path = f"{raw_data}/train.{direction}.{tgt}" + src_path = f"{raw_data}/train.{direction}.{src}" + print(f'check training data in {raw_data}/train.{direction}') + size = 0 + if not os.path.exists(tgt_path) or not os.path.exists(src_path): + return mess_up_train, size + with open(src_path) as f, open(tgt_path) as g: + for src_line, tgt_line in zip(f, g): + s = src_line.strip() + t = tgt_line.strip() + size += 1 + if s in all_test_data: + langs = mess_up_train.get(s, set()) + langs.add(direction) + mess_up_train[s] = langs + if t in all_test_data: + langs = mess_up_train.get(t, set()) + langs.add(direction) + mess_up_train[t] = langs + return mess_up_train, size + +def check_train_all(raw_data, directions, all_test_data): + mess_up_train = {} + data_sizes = {} + for direction in directions: + _, size = check_train_sentences(raw_data, direction, all_test_data, mess_up_train) + data_sizes[direction] = size + return mess_up_train, data_sizes + +def count_train_in_other_set(mess_up_train): + train_in_others = [(direction, s) for s, directions in mess_up_train.items() for direction in directions] + counts = {} + for direction, s in train_in_others: + counts[direction] = counts.get(direction, 0) + 1 + return counts + +def train_size_if_remove_in_otherset(data_sizes, mess_up_train): + counts_in_other = count_train_in_other_set(mess_up_train) + remain_sizes = [] + for direction, count in counts_in_other.items(): + remain_sizes.append((direction, data_sizes[direction] - count, data_sizes[direction], count, 100 * count / data_sizes[direction] )) + return remain_sizes + + +def remove_messed_up_sentences(raw_data, direction, mess_up_train, mess_up_train_pairs, corrected_langs): + split = 'train' + src_lang, tgt_lang = direction.split('-') + + tgt = f"{raw_data}/{split}.{direction}.{tgt_lang}" + src = f"{raw_data}/{split}.{direction}.{src_lang}" + print(f'working on {direction}: ', src, tgt) + if not os.path.exists(tgt) or not os.path.exists(src) : + return + + corrected_tgt = f"{to_folder}/{split}.{direction}.{tgt_lang}" + corrected_src = f"{to_folder}/{split}.{direction}.{src_lang}" + line_num = 0 + keep_num = 0 + with open(src, encoding='utf8',) as fsrc, \ + open(tgt, encoding='utf8',) as ftgt, \ + open(corrected_src, 'w', encoding='utf8') as fsrc_corrected, \ + open(corrected_tgt, 'w', encoding='utf8') as ftgt_corrected: + for s, t in zip(fsrc, ftgt): + s = s.strip() + t = t.strip() + if t not in mess_up_train \ + and s not in mess_up_train \ + and (s, t) not in mess_up_train_pairs \ + and (t, s) not in mess_up_train_pairs: + corrected_langs.add(direction) + print(s, file=fsrc_corrected) + print(t, file=ftgt_corrected) + keep_num += 1 + line_num += 1 + if line_num % 1000 == 0: + print(f'completed {line_num} lines', end='\r') + return line_num, keep_num + +########## + + +def merge_valid_test_messup(mess_up_train_valid, mess_up_train_test): + merged_mess = [] + for s in set(list(mess_up_train_valid.keys()) + list(mess_up_train_test.keys())): + if not s: + continue + valid = mess_up_train_valid.get(s, set()) + test = mess_up_train_test.get(s, set()) + merged_mess.append((s, valid | test)) + return dict(merged_mess) + + + +######### +def check_train_pairs(raw_data, direction, all_test_data, mess_up_train={}): + src, tgt = direction.split('-') + #a hack; TODO: check the reversed directions + path1 = f"{raw_data}/train.{src}-{tgt}.{src}" + path2 = f"{raw_data}/train.{src}-{tgt}.{tgt}" + if not os.path.exists(path1) or not os.path.exists(path2) : + return + + with open(path1) as f1, open(path2) as f2: + for src_line, tgt_line in zip(f1, f2): + s = src_line.strip() + t = tgt_line.strip() + if (s, t) in all_test_data or (t, s) in all_test_data: + langs = mess_up_train.get( (s, t), set()) + langs.add(src) + langs.add(tgt) + mess_up_train[(s, t)] = langs + + +def load_pairs(raw_data, split, direction): + src, tgt = direction.split('-') + src_f = f"{raw_data}/{split}.{direction}.{src}" + tgt_f = f"{raw_data}/{split}.{direction}.{tgt}" + if tgt != 'en_XX': + src_f, tgt_f = tgt_f, src_f + if os.path.exists(src_f) and os.path.exists(tgt_f): + return list(zip(open(src_f).read().splitlines(), + open(tgt_f).read().splitlines(), + )) + else: + return [] + +# skip_langs = ['cs_CZ', 'en_XX', 'tl_XX', 'tr_TR'] +def get_messed_up_test_pairs(split, directions): + test_pairs = [ + (d, load_pairs(raw_data, split, d)) + for d in directions + ] + # all_test_data = {s for _, d in test_data for s in d} + all_test_pairs = {} + for direction, d in test_pairs: + src, tgt = direction.split('-') + for s in d: + langs = all_test_pairs.get(s, set()) + langs.add(src) + langs.add(tgt) + all_test_pairs[s] = langs + mess_up_train_pairs = {} + for direction in directions: + check_train_pairs(raw_data, direction, all_test_pairs, mess_up_train_pairs) + return all_test_pairs, mess_up_train_pairs + + + +if __name__ == "__main__": + ####### + import argparse + parser = argparse.ArgumentParser() + parser.add_argument( + '--from-folder', + required=True, + type=str) + parser.add_argument( + '--to-folder', + required=True, + type=str) + parser.add_argument( + '--directions', + default=None, + type=str) + + + args = parser.parse_args() + raw_data = args.from_folder + to_folder = args.to_folder + os.makedirs(to_folder, exist_ok=True) + + if args.directions: + directions = args.directions.split(',') + else: + raw_files = itertools.chain( + glob.glob(f'{raw_data}/train*'), + glob.glob(f'{raw_data}/valid*'), + glob.glob(f'{raw_data}/test*'), + ) + directions = [os.path.split(file_path)[-1].split('.')[1] for file_path in raw_files] + print('working on directions: ', directions) + + ########## + + + + all_test_data, test_data = get_all_test_data(raw_data, directions, 'test') + print('==loaded test data==') + all_valid_data, valid_data = get_all_test_data(raw_data, directions, 'valid') + print('==loaded valid data==') + all_valid_test_data = merge_valid_test_messup(all_test_data, all_valid_data) + mess_up_train, data_sizes = check_train_all(raw_data, directions, all_valid_test_data) + print('training messing up with valid, test data:', len(mess_up_train)) + data_situation = train_size_if_remove_in_otherset(data_sizes, mess_up_train) + df = pd.DataFrame(data_situation, columns=['direction', 'train_size_after_remove', 'orig_size', 'num_to_remove', 'remove_percent']) + df.sort_values('remove_percent', ascending=False) + df.to_csv(f'{raw_data}/clean_summary.tsv', sep='\t') + print(f'projected data clean summary in: {raw_data}/clean_summary.tsv') + + # correct the dataset: + all_test_pairs, mess_up_test_train_pairs = get_messed_up_test_pairs('test', directions) + all_valid_pairs, mess_up_valid_train_pairs = get_messed_up_test_pairs('valid', directions) + + all_messed_pairs = set(mess_up_test_train_pairs.keys()).union(set(mess_up_valid_train_pairs.keys())) + corrected_directions = set() + + real_data_situation = [] + for direction in directions: + org_size, new_size = remove_messed_up_sentences(raw_data, direction, mess_up_train, all_messed_pairs, corrected_directions) + if org_size == 0: + print(f"{direction} has size 0") + continue + real_data_situation.append( + (direction, new_size, org_size, org_size - new_size, (org_size - new_size) / org_size * 100) + ) + print('corrected directions: ', corrected_directions) + df = pd.DataFrame(real_data_situation, columns=['direction', 'train_size_after_remove', 'orig_size', 'num_to_remove', 'remove_percent']) + df.sort_values('remove_percent', ascending=False) + df.to_csv(f'{raw_data}/actual_clean_summary.tsv', sep='\t') + print(f'actual data clean summary (which can be different from the projected one because of duplications) in: {raw_data}/actual_clean_summary.tsv') + + import shutil + for direction in directions: + src_lang, tgt_lang = direction.split('-') + for split in ['train', 'valid', 'test']: + # copying valid, test and uncorrected train + if direction in corrected_directions and split == 'train': + continue + tgt = f"{raw_data}/{split}.{direction}.{tgt_lang}" + src = f"{raw_data}/{split}.{direction}.{src_lang}" + if not (os.path.exists(src) and os.path.exists(tgt)): + continue + corrected_tgt = f"{to_folder}/{split}.{direction}.{tgt_lang}" + corrected_src = f"{to_folder}/{split}.{direction}.{src_lang}" + print(f'copying {src} to {corrected_src}') + shutil.copyfile(src, corrected_src) + print(f'copying {tgt} to {corrected_tgt}') + shutil.copyfile(tgt, corrected_tgt) + + print('completed') \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/requirement.txt b/SpeechT5/fairseq/examples/multilingual/data_scripts/requirement.txt new file mode 100644 index 0000000..e85d7d5 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/requirement.txt @@ -0,0 +1,2 @@ +wget +pandas \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/dedup.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/dedup.py new file mode 100644 index 0000000..d6fed8c --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/dedup.py @@ -0,0 +1,41 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import argparse + +def deup(src_file, tgt_file, src_file_out, tgt_file_out): + seen = set() + dup_count = 0 + with open(src_file, encoding='utf-8') as fsrc, \ + open(tgt_file, encoding='utf-8') as ftgt, \ + open(src_file_out, 'w', encoding='utf-8') as fsrc_out, \ + open(tgt_file_out, 'w', encoding='utf-8') as ftgt_out: + for s, t in zip(fsrc, ftgt): + if (s, t) not in seen: + fsrc_out.write(s) + ftgt_out.write(t) + seen.add((s, t)) + else: + dup_count += 1 + print(f'number of duplication: {dup_count}') + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--src-file", type=str, required=True, + help="src file") + parser.add_argument("--tgt-file", type=str, required=True, + help="tgt file") + parser.add_argument("--src-file-out", type=str, required=True, + help="src ouptut file") + parser.add_argument("--tgt-file-out", type=str, required=True, + help="tgt ouput file") + args = parser.parse_args() + deup(args.src_file, args.tgt_file, args.src_file_out, args.tgt_file_out) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/fasttext_multi_filter.py b/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/fasttext_multi_filter.py new file mode 100644 index 0000000..41b38ba --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/fasttext_multi_filter.py @@ -0,0 +1,63 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +#!/bin/python + +import fasttext +from multiprocessing import Pool +import contextlib +import sys +import argparse +from functools import partial +import io + +model = None +def init(model_path): + global model + model = fasttext.load_model(model_path) + +def pred(lines): + return lines, [model.predict(line.strip())[0][0][9:] for line in lines] + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--model", type=str, required=True, + help="model to load") + parser.add_argument("--inputs", nargs="+", default=['-'], + help="input files to filter") + parser.add_argument("--langs", nargs="+", required=True, + help="lang ids of each input file") + parser.add_argument("--outputs", nargs="+", default=['-'], + help="path to save lid filtered outputs") + parser.add_argument("--num-workers", type=int, metavar="N", default=10, + help="number of processes in parallel") + args = parser.parse_args() + + assert len(args.inputs) == len(args.langs) and len(args.inputs) == len(args.outputs) + + with contextlib.ExitStack() as stack: + inputs = [ + stack.enter_context(open(input, "r", encoding="utf-8", newline="\n", errors="replace")) + if input != "-" else io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors="replace") + for input in args.inputs + ] + outputs = [ + stack.enter_context(open(output, "w", encoding="utf-8", newline="\n")) + if output != "-" else sys.stdout + for output in args.outputs + ] + with Pool(args.num_workers, initializer=partial(init, args.model)) as p: + skip_cnt = 0 + for lines, preds in p.imap(pred, list(zip(*inputs)), chunksize=500): + if not all(a == b for a, b in zip(preds, args.langs)): + skip_cnt += 1 + continue + for line, output_h in zip(lines, outputs): + print(line.strip(), file=output_h) + print(f"Skipped {skip_cnt} lines.") + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/strip_sgm.sh b/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/strip_sgm.sh new file mode 100644 index 0000000..7f4f61d --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/data_scripts/utils/strip_sgm.sh @@ -0,0 +1 @@ +grep "seg id" | sed 's/<seg id="[0-9]\+">//g' | sed 's/<\/seg>//g' diff --git a/SpeechT5/fairseq/examples/multilingual/finetune_multilingual_model.sh b/SpeechT5/fairseq/examples/multilingual/finetune_multilingual_model.sh new file mode 100644 index 0000000..25960c5 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/finetune_multilingual_model.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +path_2_data=$1 # <path to data> which contains binarized data for each directions +lang_list=$2 # <path to a file which contains a list of languages separted by new lines> +lang_pairs=$3 #a list language pairs to train multilingual models, e.g. "en-fr,en-cs,fr-en,cs-en" +# pretrained can be an mBART pretrained model as well +pretrained_model=$4 #<path to a pretrained model> + + +fairseq-train "$path_2_data" \ + --encoder-normalize-before --decoder-normalize-before \ + --arch transformer --layernorm-embedding \ + --task translation_multi_simple_epoch \ + --finetune-from-model "$pretrained_model" \ + --sampling-method "temperature" \ + --sampling-temperature "1.5" \ + --encoder-langtok "src" \ + --decoder-langtok \ + --lang-dict "$lang_list" \ + --lang-pairs "$lang_pairs" \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ + --optimizer adam --adam-eps 1e-06 --adam-betas '(0.9, 0.98)' \ + --lr-scheduler inverse_sqrt --lr 3e-05 --warmup-updates 2500 --max-update 40000 \ + --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ + --max-tokens 1024 --update-freq 2 \ + --save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints \ + --seed 222 --log-format simple --log-interval 2 diff --git a/SpeechT5/fairseq/examples/multilingual/multilingual_fairseq_gen.sh b/SpeechT5/fairseq/examples/multilingual/multilingual_fairseq_gen.sh new file mode 100644 index 0000000..65aa322 --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/multilingual_fairseq_gen.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +lang_pairs="en-fr,en-cs,fr-en,cs-en" +path_2_data=$1 # <path to data> +lang_list=$2 # <path to a file which contains list of languages separted by new lines> +model=$3 # <path to a trained model> +source_lang=cs +target_lang=en + +fairseq-generate "$path_2_data" \ + --path "$model" \ + --task translation_multi_simple_epoch \ + --gen-subset test \ + --source-lang "$source_lang" \ + --target-lang "$target_lang" \ + --sacrebleu --remove-bpe 'sentencepiece'\ + --batch-size 32 \ + --encoder-langtok "src" \ + --decoder-langtok \ + --lang-dict "$lang_list" \ + --lang-pairs "$lang_pairs" diff --git a/SpeechT5/fairseq/examples/multilingual/train_multilingual_model.sh b/SpeechT5/fairseq/examples/multilingual/train_multilingual_model.sh new file mode 100644 index 0000000..cc050bd --- /dev/null +++ b/SpeechT5/fairseq/examples/multilingual/train_multilingual_model.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +path_2_data=$1 # <path to data> which contains binarized data for each directions +lang_list=$2 # <path to a file which contains a list of languages separted by new lines> +lang_pairs=$3 #a list language pairs to train multilingual models, e.g. "en-fr,en-cs,fr-en,cs-en" + +fairseq-train "$path_2_data" \ + --encoder-normalize-before --decoder-normalize-before \ + --arch transformer --layernorm-embedding \ + --task translation_multi_simple_epoch \ + --sampling-method "temperature" \ + --sampling-temperature 1.5 \ + --encoder-langtok "src" \ + --decoder-langtok \ + --lang-dict "$lang_list" \ + --lang-pairs "$lang_pairs" \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.2 \ + --optimizer adam --adam-eps 1e-06 --adam-betas '(0.9, 0.98)' \ + --lr-scheduler inverse_sqrt --lr 3e-05 --warmup-updates 2500 --max-update 40000 \ + --dropout 0.3 --attention-dropout 0.1 --weight-decay 0.0 \ + --max-tokens 1024 --update-freq 2 \ + --save-interval 1 --save-interval-updates 5000 --keep-interval-updates 10 --no-epoch-checkpoints \ + --seed 222 --log-format simple --log-interval 2 diff --git a/SpeechT5/fairseq/examples/noisychannel/README.md b/SpeechT5/fairseq/examples/noisychannel/README.md new file mode 100644 index 0000000..9d101aa --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/README.md @@ -0,0 +1,72 @@ +# Simple and Effective Noisy Channel Modeling for Neural Machine Translation (Yee et al., 2019) +This page contains pointers to pre-trained models as well as instructions on how to run the reranking scripts. + +## Citation: +```bibtex +@inproceedings{yee2019simple, + title = {Simple and Effective Noisy Channel Modeling for Neural Machine Translation}, + author = {Kyra Yee and Yann Dauphin and Michael Auli}, + booktitle = {Conference on Empirical Methods in Natural Language Processing}, + year = {2019}, +} +``` + +## Pre-trained Models: + +Model | Description | Download +---|---|--- +`transformer.noisychannel.de-en` | De->En Forward Model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/forward_de2en.tar.bz2) +`transformer.noisychannel.en-de` | En->De Channel Model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/backward_en2de.tar.bz2) +`transformer_lm.noisychannel.en` | En Language model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/reranking_en_lm.tar.bz2) + +Test Data: [newstest_wmt17](https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/wmt17test.tar.bz2) + +## Example usage + +``` +mkdir rerank_example +curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/forward_de2en.tar.bz2 | tar xvjf - -C rerank_example +curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/backward_en2de.tar.bz2 | tar xvjf - -C rerank_example +curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/reranking_en_lm.tar.bz2 | tar xvjf - -C rerank_example +curl https://dl.fbaipublicfiles.com/fairseq/models/noisychannel/wmt17test.tar.bz2 | tar xvjf - -C rerank_example + +beam=50 +num_trials=1000 +fw_name=fw_model_ex +bw_name=bw_model_ex +lm_name=lm_ex +data_dir=rerank_example/hyphen-splitting-mixed-case-wmt17test-wmt14bpe +data_dir_name=wmt17 +lm=rerank_example/lm/checkpoint_best.pt +lm_bpe_code=rerank_example/lm/bpe32k.code +lm_dict=rerank_example/lm/dict.txt +batch_size=32 +bw=rerank_example/backward_en2de.pt +fw=rerank_example/forward_de2en.pt + +# reranking with P(T|S) P(S|T) and P(T) +python examples/noisychannel/rerank_tune.py $data_dir --tune-param lenpen weight1 weight3 \ + --lower-bound 0 0 0 --upper-bound 3 3 3 --data-dir-name $data_dir_name \ + --num-trials $num_trials --source-lang de --target-lang en --gen-model $fw \ + -n $beam --batch-size $batch_size --score-model2 $fw --score-model1 $bw \ + --backwards1 --weight2 1 \ + -lm $lm --lm-dict $lm_dict --lm-name en_newscrawl --lm-bpe-code $lm_bpe_code \ + --model2-name $fw_name --model1-name $bw_name --gen-model-name $fw_name + +# reranking with P(T|S) and P(T) +python examples/noisychannel/rerank_tune.py $data_dir --tune-param lenpen weight3 \ + --lower-bound 0 0 --upper-bound 3 3 --data-dir-name $data_dir_name \ + --num-trials $num_trials --source-lang de --target-lang en --gen-model $fw \ + -n $beam --batch-size $batch_size --score-model1 $fw \ + -lm $lm --lm-dict $lm_dict --lm-name en_newscrawl --lm-bpe-code $lm_bpe_code \ + --model1-name $fw_name --gen-model-name $fw_name + +# to run with a preconfigured set of hyperparameters for the lenpen and model weights, using rerank.py instead. +python examples/noisychannel/rerank.py $data_dir \ + --lenpen 0.269 --weight1 1 --weight2 0.929 --weight3 0.831 \ + --data-dir-name $data_dir_name --source-lang de --target-lang en --gen-model $fw \ + -n $beam --batch-size $batch_size --score-model2 $fw --score-model1 $bw --backwards1 \ + -lm $lm --lm-dict $lm_dict --lm-name en_newscrawl --lm-bpe-code $lm_bpe_code \ + --model2-name $fw_name --model1-name $bw_name --gen-model-name $fw_name +``` + diff --git a/SpeechT5/fairseq/examples/noisychannel/__init__.py b/SpeechT5/fairseq/examples/noisychannel/__init__.py new file mode 100644 index 0000000..89f1aef --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .rerank_options import * # noqa diff --git a/SpeechT5/fairseq/examples/noisychannel/rerank.py b/SpeechT5/fairseq/examples/noisychannel/rerank.py new file mode 100644 index 0000000..bb80d11 --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/rerank.py @@ -0,0 +1,428 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from multiprocessing import Pool + +import numpy as np +from fairseq import options +from fairseq.data import dictionary +from fairseq.scoring import bleu + +from examples.noisychannel import ( + rerank_generate, + rerank_options, + rerank_score_bw, + rerank_score_lm, + rerank_utils, +) + + +def score_target_hypo( + args, a, b, c, lenpen, target_outfile, hypo_outfile, write_hypos, normalize +): + + print("lenpen", lenpen, "weight1", a, "weight2", b, "weight3", c) + gen_output_lst, bitext1_lst, bitext2_lst, lm_res_lst = load_score_files(args) + dict = dictionary.Dictionary() + scorer = scorer = bleu.Scorer( + bleu.BleuConfig( + pad=dict.pad(), + eos=dict.eos(), + unk=dict.unk(), + ) + ) + + ordered_hypos = {} + ordered_targets = {} + + for shard_id in range(len(bitext1_lst)): + bitext1 = bitext1_lst[shard_id] + bitext2 = bitext2_lst[shard_id] + gen_output = gen_output_lst[shard_id] + lm_res = lm_res_lst[shard_id] + + total = len(bitext1.rescore_source.keys()) + source_lst = [] + hypo_lst = [] + score_lst = [] + reference_lst = [] + j = 1 + best_score = -math.inf + + for i in range(total): + # length is measured in terms of words, not bpe tokens, since models may not share the same bpe + target_len = len(bitext1.rescore_hypo[i].split()) + + if lm_res is not None: + lm_score = lm_res.score[i] + else: + lm_score = 0 + + if bitext2 is not None: + bitext2_score = bitext2.rescore_score[i] + bitext2_backwards = bitext2.backwards + else: + bitext2_score = None + bitext2_backwards = None + + score = rerank_utils.get_score( + a, + b, + c, + target_len, + bitext1.rescore_score[i], + bitext2_score, + lm_score=lm_score, + lenpen=lenpen, + src_len=bitext1.source_lengths[i], + tgt_len=bitext1.target_lengths[i], + bitext1_backwards=bitext1.backwards, + bitext2_backwards=bitext2_backwards, + normalize=normalize, + ) + + if score > best_score: + best_score = score + best_hypo = bitext1.rescore_hypo[i] + + if j == gen_output.num_hypos[i] or j == args.num_rescore: + j = 1 + hypo_lst.append(best_hypo) + score_lst.append(best_score) + source_lst.append(bitext1.rescore_source[i]) + reference_lst.append(bitext1.rescore_target[i]) + + best_score = -math.inf + best_hypo = "" + else: + j += 1 + + gen_keys = list(sorted(gen_output.no_bpe_target.keys())) + + for key in range(len(gen_keys)): + if args.prefix_len is None: + assert hypo_lst[key] in gen_output.no_bpe_hypo[gen_keys[key]], ( + "pred and rescore hypo mismatch: i: " + + str(key) + + ", " + + str(hypo_lst[key]) + + str(gen_keys[key]) + + str(gen_output.no_bpe_hypo[key]) + ) + sys_tok = dict.encode_line(hypo_lst[key]) + ref_tok = dict.encode_line(gen_output.no_bpe_target[gen_keys[key]]) + scorer.add(ref_tok, sys_tok) + + else: + full_hypo = rerank_utils.get_full_from_prefix( + hypo_lst[key], gen_output.no_bpe_hypo[gen_keys[key]] + ) + sys_tok = dict.encode_line(full_hypo) + ref_tok = dict.encode_line(gen_output.no_bpe_target[gen_keys[key]]) + scorer.add(ref_tok, sys_tok) + + # if only one set of hyper parameters is provided, write the predictions to a file + if write_hypos: + # recover the orinal ids from n best list generation + for key in range(len(gen_output.no_bpe_target)): + if args.prefix_len is None: + assert hypo_lst[key] in gen_output.no_bpe_hypo[gen_keys[key]], ( + "pred and rescore hypo mismatch:" + + "i:" + + str(key) + + str(hypo_lst[key]) + + str(gen_output.no_bpe_hypo[key]) + ) + ordered_hypos[gen_keys[key]] = hypo_lst[key] + ordered_targets[gen_keys[key]] = gen_output.no_bpe_target[ + gen_keys[key] + ] + + else: + full_hypo = rerank_utils.get_full_from_prefix( + hypo_lst[key], gen_output.no_bpe_hypo[gen_keys[key]] + ) + ordered_hypos[gen_keys[key]] = full_hypo + ordered_targets[gen_keys[key]] = gen_output.no_bpe_target[ + gen_keys[key] + ] + + # write the hypos in the original order from nbest list generation + if args.num_shards == (len(bitext1_lst)): + with open(target_outfile, "w") as t: + with open(hypo_outfile, "w") as h: + for key in range(len(ordered_hypos)): + t.write(ordered_targets[key]) + h.write(ordered_hypos[key]) + + res = scorer.result_string(4) + if write_hypos: + print(res) + score = rerank_utils.parse_bleu_scoring(res) + return score + + +def match_target_hypo(args, target_outfile, hypo_outfile): + """combine scores from the LM and bitext models, and write the top scoring hypothesis to a file""" + if len(args.weight1) == 1: + res = score_target_hypo( + args, + args.weight1[0], + args.weight2[0], + args.weight3[0], + args.lenpen[0], + target_outfile, + hypo_outfile, + True, + args.normalize, + ) + rerank_scores = [res] + else: + print("launching pool") + with Pool(32) as p: + rerank_scores = p.starmap( + score_target_hypo, + [ + ( + args, + args.weight1[i], + args.weight2[i], + args.weight3[i], + args.lenpen[i], + target_outfile, + hypo_outfile, + False, + args.normalize, + ) + for i in range(len(args.weight1)) + ], + ) + + if len(rerank_scores) > 1: + best_index = np.argmax(rerank_scores) + best_score = rerank_scores[best_index] + print("best score", best_score) + print("best lenpen", args.lenpen[best_index]) + print("best weight1", args.weight1[best_index]) + print("best weight2", args.weight2[best_index]) + print("best weight3", args.weight3[best_index]) + return ( + args.lenpen[best_index], + args.weight1[best_index], + args.weight2[best_index], + args.weight3[best_index], + best_score, + ) + + else: + return ( + args.lenpen[0], + args.weight1[0], + args.weight2[0], + args.weight3[0], + rerank_scores[0], + ) + + +def load_score_files(args): + if args.all_shards: + shard_ids = list(range(args.num_shards)) + else: + shard_ids = [args.shard_id] + + gen_output_lst = [] + bitext1_lst = [] + bitext2_lst = [] + lm_res1_lst = [] + + for shard_id in shard_ids: + using_nbest = args.nbest_list is not None + ( + pre_gen, + left_to_right_preprocessed_dir, + right_to_left_preprocessed_dir, + backwards_preprocessed_dir, + lm_preprocessed_dir, + ) = rerank_utils.get_directories( + args.data_dir_name, + args.num_rescore, + args.gen_subset, + args.gen_model_name, + shard_id, + args.num_shards, + args.sampling, + args.prefix_len, + args.target_prefix_frac, + args.source_prefix_frac, + ) + + rerank1_is_gen = ( + args.gen_model == args.score_model1 and args.source_prefix_frac is None + ) + rerank2_is_gen = ( + args.gen_model == args.score_model2 and args.source_prefix_frac is None + ) + + score1_file = rerank_utils.rescore_file_name( + pre_gen, + args.prefix_len, + args.model1_name, + target_prefix_frac=args.target_prefix_frac, + source_prefix_frac=args.source_prefix_frac, + backwards=args.backwards1, + ) + if args.score_model2 is not None: + score2_file = rerank_utils.rescore_file_name( + pre_gen, + args.prefix_len, + args.model2_name, + target_prefix_frac=args.target_prefix_frac, + source_prefix_frac=args.source_prefix_frac, + backwards=args.backwards2, + ) + if args.language_model is not None: + lm_score_file = rerank_utils.rescore_file_name( + pre_gen, args.prefix_len, args.lm_name, lm_file=True + ) + + # get gen output + predictions_bpe_file = pre_gen + "/generate_output_bpe.txt" + if using_nbest: + print("Using predefined n-best list from interactive.py") + predictions_bpe_file = args.nbest_list + gen_output = rerank_utils.BitextOutputFromGen( + predictions_bpe_file, + bpe_symbol=args.post_process, + nbest=using_nbest, + prefix_len=args.prefix_len, + target_prefix_frac=args.target_prefix_frac, + ) + + if rerank1_is_gen: + bitext1 = gen_output + else: + bitext1 = rerank_utils.BitextOutput( + score1_file, + args.backwards1, + args.right_to_left1, + args.post_process, + args.prefix_len, + args.target_prefix_frac, + args.source_prefix_frac, + ) + + if args.score_model2 is not None or args.nbest_list is not None: + if rerank2_is_gen: + bitext2 = gen_output + else: + bitext2 = rerank_utils.BitextOutput( + score2_file, + args.backwards2, + args.right_to_left2, + args.post_process, + args.prefix_len, + args.target_prefix_frac, + args.source_prefix_frac, + ) + + assert ( + bitext2.source_lengths == bitext1.source_lengths + ), "source lengths for rescoring models do not match" + assert ( + bitext2.target_lengths == bitext1.target_lengths + ), "target lengths for rescoring models do not match" + else: + if args.diff_bpe: + assert args.score_model2 is None + bitext2 = gen_output + else: + bitext2 = None + + if args.language_model is not None: + lm_res1 = rerank_utils.LMOutput( + lm_score_file, + args.lm_dict, + args.prefix_len, + args.post_process, + args.target_prefix_frac, + ) + else: + lm_res1 = None + + gen_output_lst.append(gen_output) + bitext1_lst.append(bitext1) + bitext2_lst.append(bitext2) + lm_res1_lst.append(lm_res1) + return gen_output_lst, bitext1_lst, bitext2_lst, lm_res1_lst + + +def rerank(args): + if type(args.lenpen) is not list: + args.lenpen = [args.lenpen] + if type(args.weight1) is not list: + args.weight1 = [args.weight1] + if type(args.weight2) is not list: + args.weight2 = [args.weight2] + if type(args.weight3) is not list: + args.weight3 = [args.weight3] + if args.all_shards: + shard_ids = list(range(args.num_shards)) + else: + shard_ids = [args.shard_id] + + for shard_id in shard_ids: + ( + pre_gen, + left_to_right_preprocessed_dir, + right_to_left_preprocessed_dir, + backwards_preprocessed_dir, + lm_preprocessed_dir, + ) = rerank_utils.get_directories( + args.data_dir_name, + args.num_rescore, + args.gen_subset, + args.gen_model_name, + shard_id, + args.num_shards, + args.sampling, + args.prefix_len, + args.target_prefix_frac, + args.source_prefix_frac, + ) + rerank_generate.gen_and_reprocess_nbest(args) + rerank_score_bw.score_bw(args) + rerank_score_lm.score_lm(args) + + if args.write_hypos is None: + write_targets = pre_gen + "/matched_targets" + write_hypos = pre_gen + "/matched_hypos" + else: + write_targets = args.write_hypos + "_targets" + args.gen_subset + write_hypos = args.write_hypos + "_hypos" + args.gen_subset + + if args.all_shards: + write_targets += "_all_shards" + write_hypos += "_all_shards" + + ( + best_lenpen, + best_weight1, + best_weight2, + best_weight3, + best_score, + ) = match_target_hypo(args, write_targets, write_hypos) + + return best_lenpen, best_weight1, best_weight2, best_weight3, best_score + + +def cli_main(): + parser = rerank_options.get_reranking_parser() + args = options.parse_args_and_arch(parser) + rerank(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/noisychannel/rerank_generate.py b/SpeechT5/fairseq/examples/noisychannel/rerank_generate.py new file mode 100644 index 0000000..daeeae0 --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/rerank_generate.py @@ -0,0 +1,397 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Generate n-best translations using a trained model. +""" + +import os +import subprocess +from contextlib import redirect_stdout + +from fairseq import options +from fairseq_cli import generate, preprocess + +from examples.noisychannel import rerank_options, rerank_utils + + +def gen_and_reprocess_nbest(args): + if args.score_dict_dir is None: + args.score_dict_dir = args.data + if args.prefix_len is not None: + assert ( + args.right_to_left1 is False + ), "prefix length not compatible with right to left models" + assert ( + args.right_to_left2 is False + ), "prefix length not compatible with right to left models" + + if args.nbest_list is not None: + assert args.score_model2 is None + + if args.backwards1: + scorer1_src = args.target_lang + scorer1_tgt = args.source_lang + else: + scorer1_src = args.source_lang + scorer1_tgt = args.target_lang + + store_data = ( + os.path.join(os.path.dirname(__file__)) + "/rerank_data/" + args.data_dir_name + ) + if not os.path.exists(store_data): + os.makedirs(store_data) + + ( + pre_gen, + left_to_right_preprocessed_dir, + right_to_left_preprocessed_dir, + backwards_preprocessed_dir, + lm_preprocessed_dir, + ) = rerank_utils.get_directories( + args.data_dir_name, + args.num_rescore, + args.gen_subset, + args.gen_model_name, + args.shard_id, + args.num_shards, + args.sampling, + args.prefix_len, + args.target_prefix_frac, + args.source_prefix_frac, + ) + assert not ( + args.right_to_left1 and args.backwards1 + ), "backwards right to left not supported" + assert not ( + args.right_to_left2 and args.backwards2 + ), "backwards right to left not supported" + assert not ( + args.prefix_len is not None and args.target_prefix_frac is not None + ), "target prefix frac and target prefix len incompatible" + + # make directory to store generation results + if not os.path.exists(pre_gen): + os.makedirs(pre_gen) + + rerank1_is_gen = ( + args.gen_model == args.score_model1 and args.source_prefix_frac is None + ) + rerank2_is_gen = ( + args.gen_model == args.score_model2 and args.source_prefix_frac is None + ) + + if args.nbest_list is not None: + rerank2_is_gen = True + + # make directories to store preprossed nbest list for reranking + if not os.path.exists(left_to_right_preprocessed_dir): + os.makedirs(left_to_right_preprocessed_dir) + if not os.path.exists(right_to_left_preprocessed_dir): + os.makedirs(right_to_left_preprocessed_dir) + if not os.path.exists(lm_preprocessed_dir): + os.makedirs(lm_preprocessed_dir) + if not os.path.exists(backwards_preprocessed_dir): + os.makedirs(backwards_preprocessed_dir) + + score1_file = rerank_utils.rescore_file_name( + pre_gen, + args.prefix_len, + args.model1_name, + target_prefix_frac=args.target_prefix_frac, + source_prefix_frac=args.source_prefix_frac, + backwards=args.backwards1, + ) + if args.score_model2 is not None: + score2_file = rerank_utils.rescore_file_name( + pre_gen, + args.prefix_len, + args.model2_name, + target_prefix_frac=args.target_prefix_frac, + source_prefix_frac=args.source_prefix_frac, + backwards=args.backwards2, + ) + + predictions_bpe_file = pre_gen + "/generate_output_bpe.txt" + + using_nbest = args.nbest_list is not None + + if using_nbest: + print("Using predefined n-best list from interactive.py") + predictions_bpe_file = args.nbest_list + + else: + if not os.path.isfile(predictions_bpe_file): + print("STEP 1: generate predictions using the p(T|S) model with bpe") + print(args.data) + param1 = [ + args.data, + "--path", + args.gen_model, + "--shard-id", + str(args.shard_id), + "--num-shards", + str(args.num_shards), + "--nbest", + str(args.num_rescore), + "--batch-size", + str(args.batch_size), + "--beam", + str(args.num_rescore), + "--batch-size", + str(args.num_rescore), + "--gen-subset", + args.gen_subset, + "--source-lang", + args.source_lang, + "--target-lang", + args.target_lang, + ] + if args.sampling: + param1 += ["--sampling"] + + gen_parser = options.get_generation_parser() + input_args = options.parse_args_and_arch(gen_parser, param1) + + print(input_args) + with open(predictions_bpe_file, "w") as f: + with redirect_stdout(f): + generate.main(input_args) + + gen_output = rerank_utils.BitextOutputFromGen( + predictions_bpe_file, + bpe_symbol=args.post_process, + nbest=using_nbest, + prefix_len=args.prefix_len, + target_prefix_frac=args.target_prefix_frac, + ) + + if args.diff_bpe: + rerank_utils.write_reprocessed( + gen_output.no_bpe_source, + gen_output.no_bpe_hypo, + gen_output.no_bpe_target, + pre_gen + "/source_gen_bpe." + args.source_lang, + pre_gen + "/target_gen_bpe." + args.target_lang, + pre_gen + "/reference_gen_bpe." + args.target_lang, + ) + bitext_bpe = args.rescore_bpe_code + bpe_src_param = [ + "-c", + bitext_bpe, + "--input", + pre_gen + "/source_gen_bpe." + args.source_lang, + "--output", + pre_gen + "/rescore_data." + args.source_lang, + ] + bpe_tgt_param = [ + "-c", + bitext_bpe, + "--input", + pre_gen + "/target_gen_bpe." + args.target_lang, + "--output", + pre_gen + "/rescore_data." + args.target_lang, + ] + + subprocess.call( + [ + "python", + os.path.join( + os.path.dirname(__file__), "subword-nmt/subword_nmt/apply_bpe.py" + ), + ] + + bpe_src_param, + shell=False, + ) + + subprocess.call( + [ + "python", + os.path.join( + os.path.dirname(__file__), "subword-nmt/subword_nmt/apply_bpe.py" + ), + ] + + bpe_tgt_param, + shell=False, + ) + + if (not os.path.isfile(score1_file) and not rerank1_is_gen) or ( + args.score_model2 is not None + and not os.path.isfile(score2_file) + and not rerank2_is_gen + ): + print( + "STEP 2: process the output of generate.py so we have clean text files with the translations" + ) + + rescore_file = "/rescore_data" + if args.prefix_len is not None: + prefix_len_rescore_file = rescore_file + "prefix" + str(args.prefix_len) + if args.target_prefix_frac is not None: + target_prefix_frac_rescore_file = ( + rescore_file + "target_prefix_frac" + str(args.target_prefix_frac) + ) + if args.source_prefix_frac is not None: + source_prefix_frac_rescore_file = ( + rescore_file + "source_prefix_frac" + str(args.source_prefix_frac) + ) + + if not args.right_to_left1 or not args.right_to_left2: + if not args.diff_bpe: + rerank_utils.write_reprocessed( + gen_output.source, + gen_output.hypo, + gen_output.target, + pre_gen + rescore_file + "." + args.source_lang, + pre_gen + rescore_file + "." + args.target_lang, + pre_gen + "/reference_file", + bpe_symbol=args.post_process, + ) + if args.prefix_len is not None: + bw_rescore_file = prefix_len_rescore_file + rerank_utils.write_reprocessed( + gen_output.source, + gen_output.hypo, + gen_output.target, + pre_gen + prefix_len_rescore_file + "." + args.source_lang, + pre_gen + prefix_len_rescore_file + "." + args.target_lang, + pre_gen + "/reference_file", + prefix_len=args.prefix_len, + bpe_symbol=args.post_process, + ) + elif args.target_prefix_frac is not None: + bw_rescore_file = target_prefix_frac_rescore_file + rerank_utils.write_reprocessed( + gen_output.source, + gen_output.hypo, + gen_output.target, + pre_gen + + target_prefix_frac_rescore_file + + "." + + args.source_lang, + pre_gen + + target_prefix_frac_rescore_file + + "." + + args.target_lang, + pre_gen + "/reference_file", + bpe_symbol=args.post_process, + target_prefix_frac=args.target_prefix_frac, + ) + else: + bw_rescore_file = rescore_file + + if args.source_prefix_frac is not None: + fw_rescore_file = source_prefix_frac_rescore_file + rerank_utils.write_reprocessed( + gen_output.source, + gen_output.hypo, + gen_output.target, + pre_gen + + source_prefix_frac_rescore_file + + "." + + args.source_lang, + pre_gen + + source_prefix_frac_rescore_file + + "." + + args.target_lang, + pre_gen + "/reference_file", + bpe_symbol=args.post_process, + source_prefix_frac=args.source_prefix_frac, + ) + else: + fw_rescore_file = rescore_file + + if args.right_to_left1 or args.right_to_left2: + rerank_utils.write_reprocessed( + gen_output.source, + gen_output.hypo, + gen_output.target, + pre_gen + "/right_to_left_rescore_data." + args.source_lang, + pre_gen + "/right_to_left_rescore_data." + args.target_lang, + pre_gen + "/right_to_left_reference_file", + right_to_left=True, + bpe_symbol=args.post_process, + ) + + print("STEP 3: binarize the translations") + if ( + not args.right_to_left1 + or args.score_model2 is not None + and not args.right_to_left2 + or not rerank1_is_gen + ): + + if args.backwards1 or args.backwards2: + if args.backwards_score_dict_dir is not None: + bw_dict = args.backwards_score_dict_dir + else: + bw_dict = args.score_dict_dir + bw_preprocess_param = [ + "--source-lang", + scorer1_src, + "--target-lang", + scorer1_tgt, + "--trainpref", + pre_gen + bw_rescore_file, + "--srcdict", + bw_dict + "/dict." + scorer1_src + ".txt", + "--tgtdict", + bw_dict + "/dict." + scorer1_tgt + ".txt", + "--destdir", + backwards_preprocessed_dir, + ] + preprocess_parser = options.get_preprocessing_parser() + input_args = preprocess_parser.parse_args(bw_preprocess_param) + preprocess.main(input_args) + + preprocess_param = [ + "--source-lang", + scorer1_src, + "--target-lang", + scorer1_tgt, + "--trainpref", + pre_gen + fw_rescore_file, + "--srcdict", + args.score_dict_dir + "/dict." + scorer1_src + ".txt", + "--tgtdict", + args.score_dict_dir + "/dict." + scorer1_tgt + ".txt", + "--destdir", + left_to_right_preprocessed_dir, + ] + preprocess_parser = options.get_preprocessing_parser() + input_args = preprocess_parser.parse_args(preprocess_param) + preprocess.main(input_args) + + if args.right_to_left1 or args.right_to_left2: + preprocess_param = [ + "--source-lang", + scorer1_src, + "--target-lang", + scorer1_tgt, + "--trainpref", + pre_gen + "/right_to_left_rescore_data", + "--srcdict", + args.score_dict_dir + "/dict." + scorer1_src + ".txt", + "--tgtdict", + args.score_dict_dir + "/dict." + scorer1_tgt + ".txt", + "--destdir", + right_to_left_preprocessed_dir, + ] + preprocess_parser = options.get_preprocessing_parser() + input_args = preprocess_parser.parse_args(preprocess_param) + preprocess.main(input_args) + + return gen_output + + +def cli_main(): + parser = rerank_options.get_reranking_parser() + args = options.parse_args_and_arch(parser) + gen_and_reprocess_nbest(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/noisychannel/rerank_options.py b/SpeechT5/fairseq/examples/noisychannel/rerank_options.py new file mode 100644 index 0000000..de91939 --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/rerank_options.py @@ -0,0 +1,149 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq import options + + +def get_reranking_parser(default_task="translation"): + parser = options.get_parser("Generation and reranking", default_task) + add_reranking_args(parser) + return parser + + +def get_tuning_parser(default_task="translation"): + parser = options.get_parser("Reranking tuning", default_task) + add_reranking_args(parser) + add_tuning_args(parser) + return parser + + +def add_reranking_args(parser): + group = parser.add_argument_group("Reranking") + # fmt: off + group.add_argument('--score-model1', '-s1', type=str, metavar='FILE', required=True, + help='path to first model or ensemble of models for rescoring') + group.add_argument('--score-model2', '-s2', type=str, metavar='FILE', required=False, + help='path to second model or ensemble of models for rescoring') + group.add_argument('--num-rescore', '-n', type=int, metavar='N', default=10, + help='the number of candidate hypothesis to rescore') + group.add_argument('-bz', '--batch-size', type=int, metavar='N', default=128, + help='batch size for generating the nbest list') + group.add_argument('--gen-subset', default='test', metavar='SET', choices=['test', 'train', 'valid'], + help='data subset to generate (train, valid, test)') + group.add_argument('--gen-model', default=None, metavar='FILE', + help='the model to generate translations') + group.add_argument('-b1', '--backwards1', action='store_true', + help='whether or not the first model group is backwards') + group.add_argument('-b2', '--backwards2', action='store_true', + help='whether or not the second model group is backwards') + group.add_argument('-a', '--weight1', default=1, nargs='+', type=float, + help='the weight(s) of the first model') + group.add_argument('-b', '--weight2', default=1, nargs='+', type=float, + help='the weight(s) of the second model, or the gen model if using nbest from interactive.py') + group.add_argument('-c', '--weight3', default=1, nargs='+', type=float, + help='the weight(s) of the third model') + + # lm arguments + group.add_argument('-lm', '--language-model', default=None, metavar='FILE', + help='language model for target language to rescore translations') + group.add_argument('--lm-dict', default=None, metavar='FILE', + help='the dict of the language model for the target language') + group.add_argument('--lm-name', default=None, + help='the name of the language model for the target language') + group.add_argument('--lm-bpe-code', default=None, metavar='FILE', + help='the bpe code for the language model for the target language') + group.add_argument('--data-dir-name', default=None, + help='name of data directory') + group.add_argument('--lenpen', default=1, nargs='+', type=float, + help='length penalty: <1.0 favors shorter, >1.0 favors longer sentences') + group.add_argument('--score-dict-dir', default=None, + help='the directory with dictionaries for the scoring models') + group.add_argument('--right-to-left1', action='store_true', + help='whether the first model group is a right to left model') + group.add_argument('--right-to-left2', action='store_true', + help='whether the second model group is a right to left model') + group.add_argument('--post-process', '--remove-bpe', default='@@ ', + help='the bpe symbol, used for the bitext and LM') + group.add_argument('--prefix-len', default=None, type=int, + help='the length of the target prefix to use in rescoring (in terms of words wo bpe)') + group.add_argument('--sampling', action='store_true', + help='use sampling instead of beam search for generating n best list') + group.add_argument('--diff-bpe', action='store_true', + help='bpe for rescoring and nbest list not the same') + group.add_argument('--rescore-bpe-code', default=None, + help='bpe code for rescoring models') + group.add_argument('--nbest-list', default=None, + help='use predefined nbest list in interactive.py format') + group.add_argument('--write-hypos', default=None, + help='filename prefix to write hypos to') + group.add_argument('--ref-translation', default=None, + help='reference translation to use with nbest list from interactive.py') + group.add_argument('--backwards-score-dict-dir', default=None, + help='the directory with dictionaries for the backwards model,' + 'if None then it is assumed the fw and backwards models share dictionaries') + + # extra scaling args + group.add_argument('--gen-model-name', default=None, + help='the name of the models that generated the nbest list') + group.add_argument('--model1-name', default=None, + help='the name of the set for model1 group ') + group.add_argument('--model2-name', default=None, + help='the name of the set for model2 group') + group.add_argument('--shard-id', default=0, type=int, + help='the id of the shard to generate') + group.add_argument('--num-shards', default=1, type=int, + help='the number of shards to generate across') + group.add_argument('--all-shards', action='store_true', + help='use all shards') + group.add_argument('--target-prefix-frac', default=None, type=float, + help='the fraction of the target prefix to use in rescoring (in terms of words wo bpe)') + group.add_argument('--source-prefix-frac', default=None, type=float, + help='the fraction of the source prefix to use in rescoring (in terms of words wo bpe)') + group.add_argument('--normalize', action='store_true', + help='whether to normalize by src and target len') + # fmt: on + return group + + +def add_tuning_args(parser): + group = parser.add_argument_group("Tuning") + + group.add_argument( + "--lower-bound", + default=[-0.7], + nargs="+", + type=float, + help="lower bound of search space", + ) + group.add_argument( + "--upper-bound", + default=[3], + nargs="+", + type=float, + help="upper bound of search space", + ) + group.add_argument( + "--tune-param", + default=["lenpen"], + nargs="+", + choices=["lenpen", "weight1", "weight2", "weight3"], + help="the parameter(s) to tune", + ) + group.add_argument( + "--tune-subset", + default="valid", + choices=["valid", "test", "train"], + help="the subset to tune on ", + ) + group.add_argument( + "--num-trials", + default=1000, + type=int, + help="number of trials to do for random search", + ) + group.add_argument( + "--share-weights", action="store_true", help="share weight2 and weight 3" + ) + return group diff --git a/SpeechT5/fairseq/examples/noisychannel/rerank_score_bw.py b/SpeechT5/fairseq/examples/noisychannel/rerank_score_bw.py new file mode 100644 index 0000000..b0bc913 --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/rerank_score_bw.py @@ -0,0 +1,143 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +from contextlib import redirect_stdout + +from fairseq import options +from fairseq_cli import generate + +from examples.noisychannel import rerank_options, rerank_utils + + +def score_bw(args): + if args.backwards1: + scorer1_src = args.target_lang + scorer1_tgt = args.source_lang + else: + scorer1_src = args.source_lang + scorer1_tgt = args.target_lang + + if args.score_model2 is not None: + if args.backwards2: + scorer2_src = args.target_lang + scorer2_tgt = args.source_lang + else: + scorer2_src = args.source_lang + scorer2_tgt = args.target_lang + + rerank1_is_gen = ( + args.gen_model == args.score_model1 and args.source_prefix_frac is None + ) + rerank2_is_gen = ( + args.gen_model == args.score_model2 and args.source_prefix_frac is None + ) + + ( + pre_gen, + left_to_right_preprocessed_dir, + right_to_left_preprocessed_dir, + backwards_preprocessed_dir, + lm_preprocessed_dir, + ) = rerank_utils.get_directories( + args.data_dir_name, + args.num_rescore, + args.gen_subset, + args.gen_model_name, + args.shard_id, + args.num_shards, + args.sampling, + args.prefix_len, + args.target_prefix_frac, + args.source_prefix_frac, + ) + + score1_file = rerank_utils.rescore_file_name( + pre_gen, + args.prefix_len, + args.model1_name, + target_prefix_frac=args.target_prefix_frac, + source_prefix_frac=args.source_prefix_frac, + backwards=args.backwards1, + ) + + if args.score_model2 is not None: + score2_file = rerank_utils.rescore_file_name( + pre_gen, + args.prefix_len, + args.model2_name, + target_prefix_frac=args.target_prefix_frac, + source_prefix_frac=args.source_prefix_frac, + backwards=args.backwards2, + ) + + if args.right_to_left1: + rerank_data1 = right_to_left_preprocessed_dir + elif args.backwards1: + rerank_data1 = backwards_preprocessed_dir + else: + rerank_data1 = left_to_right_preprocessed_dir + + gen_param = ["--batch-size", str(128), "--score-reference", "--gen-subset", "train"] + if not rerank1_is_gen and not os.path.isfile(score1_file): + print("STEP 4: score the translations for model 1") + + model_param1 = [ + "--path", + args.score_model1, + "--source-lang", + scorer1_src, + "--target-lang", + scorer1_tgt, + ] + gen_model1_param = [rerank_data1] + gen_param + model_param1 + + gen_parser = options.get_generation_parser() + input_args = options.parse_args_and_arch(gen_parser, gen_model1_param) + + with open(score1_file, "w") as f: + with redirect_stdout(f): + generate.main(input_args) + + if ( + args.score_model2 is not None + and not os.path.isfile(score2_file) + and not rerank2_is_gen + ): + print("STEP 4: score the translations for model 2") + + if args.right_to_left2: + rerank_data2 = right_to_left_preprocessed_dir + elif args.backwards2: + rerank_data2 = backwards_preprocessed_dir + else: + rerank_data2 = left_to_right_preprocessed_dir + + model_param2 = [ + "--path", + args.score_model2, + "--source-lang", + scorer2_src, + "--target-lang", + scorer2_tgt, + ] + gen_model2_param = [rerank_data2] + gen_param + model_param2 + + gen_parser = options.get_generation_parser() + input_args = options.parse_args_and_arch(gen_parser, gen_model2_param) + + with open(score2_file, "w") as f: + with redirect_stdout(f): + generate.main(input_args) + + +def cli_main(): + parser = rerank_options.get_reranking_parser() + args = options.parse_args_and_arch(parser) + score_bw(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/noisychannel/rerank_score_lm.py b/SpeechT5/fairseq/examples/noisychannel/rerank_score_lm.py new file mode 100644 index 0000000..e80948d --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/rerank_score_lm.py @@ -0,0 +1,81 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os + +from fairseq import options + +from examples.noisychannel import rerank_options, rerank_utils + + +def score_lm(args): + using_nbest = args.nbest_list is not None + ( + pre_gen, + left_to_right_preprocessed_dir, + right_to_left_preprocessed_dir, + backwards_preprocessed_dir, + lm_preprocessed_dir, + ) = rerank_utils.get_directories( + args.data_dir_name, + args.num_rescore, + args.gen_subset, + args.gen_model_name, + args.shard_id, + args.num_shards, + args.sampling, + args.prefix_len, + args.target_prefix_frac, + args.source_prefix_frac, + ) + + predictions_bpe_file = pre_gen + "/generate_output_bpe.txt" + if using_nbest: + print("Using predefined n-best list from interactive.py") + predictions_bpe_file = args.nbest_list + + gen_output = rerank_utils.BitextOutputFromGen( + predictions_bpe_file, bpe_symbol=args.post_process, nbest=using_nbest + ) + + if args.language_model is not None: + lm_score_file = rerank_utils.rescore_file_name( + pre_gen, args.prefix_len, args.lm_name, lm_file=True + ) + + if args.language_model is not None and not os.path.isfile(lm_score_file): + print("STEP 4.5: language modeling for P(T)") + if args.lm_bpe_code is None: + bpe_status = "no bpe" + elif args.lm_bpe_code == "shared": + bpe_status = "shared" + else: + bpe_status = "different" + + rerank_utils.lm_scoring( + lm_preprocessed_dir, + bpe_status, + gen_output, + pre_gen, + args.lm_dict, + args.lm_name, + args.language_model, + args.lm_bpe_code, + 128, + lm_score_file, + args.target_lang, + args.source_lang, + prefix_len=args.prefix_len, + ) + + +def cli_main(): + parser = rerank_options.get_reranking_parser() + args = options.parse_args_and_arch(parser) + score_lm(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/noisychannel/rerank_tune.py b/SpeechT5/fairseq/examples/noisychannel/rerank_tune.py new file mode 100644 index 0000000..b2e8b75 --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/rerank_tune.py @@ -0,0 +1,102 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import random + +import numpy as np +from fairseq import options + +from examples.noisychannel import rerank, rerank_options + + +def random_search(args): + param_values = [] + tuneable_parameters = ["lenpen", "weight1", "weight2", "weight3"] + initial_params = [args.lenpen, args.weight1, args.weight2, args.weight3] + for i, elem in enumerate(initial_params): + if type(elem) is not list: + initial_params[i] = [elem] + else: + initial_params[i] = elem + + tune_parameters = args.tune_param.copy() + for i in range(len(args.tune_param)): + assert args.upper_bound[i] >= args.lower_bound[i] + index = tuneable_parameters.index(args.tune_param[i]) + del tuneable_parameters[index] + del initial_params[index] + + tune_parameters += tuneable_parameters + param_values += initial_params + random.seed(args.seed) + + random_params = np.array( + [ + [ + random.uniform(args.lower_bound[i], args.upper_bound[i]) + for i in range(len(args.tune_param)) + ] + for k in range(args.num_trials) + ] + ) + set_params = np.array( + [ + [initial_params[i][0] for i in range(len(tuneable_parameters))] + for k in range(args.num_trials) + ] + ) + random_params = np.concatenate((random_params, set_params), 1) + + rerank_args = vars(args).copy() + if args.nbest_list: + rerank_args["gen_subset"] = "test" + else: + rerank_args["gen_subset"] = args.tune_subset + + for k in range(len(tune_parameters)): + rerank_args[tune_parameters[k]] = list(random_params[:, k]) + + if args.share_weights: + k = tune_parameters.index("weight2") + rerank_args["weight3"] = list(random_params[:, k]) + + rerank_args = argparse.Namespace(**rerank_args) + best_lenpen, best_weight1, best_weight2, best_weight3, best_score = rerank.rerank( + rerank_args + ) + rerank_args = vars(args).copy() + rerank_args["lenpen"] = [best_lenpen] + rerank_args["weight1"] = [best_weight1] + rerank_args["weight2"] = [best_weight2] + rerank_args["weight3"] = [best_weight3] + + # write the hypothesis from the valid set from the best trial + + if args.gen_subset != "valid": + rerank_args["gen_subset"] = "valid" + rerank_args = argparse.Namespace(**rerank_args) + rerank.rerank(rerank_args) + + # test with the best hyperparameters on gen subset + rerank_args = vars(args).copy() + rerank_args["gen_subset"] = args.gen_subset + rerank_args["lenpen"] = [best_lenpen] + rerank_args["weight1"] = [best_weight1] + rerank_args["weight2"] = [best_weight2] + rerank_args["weight3"] = [best_weight3] + rerank_args = argparse.Namespace(**rerank_args) + rerank.rerank(rerank_args) + + +def cli_main(): + parser = rerank_options.get_tuning_parser() + args = options.parse_args_and_arch(parser) + + random_search(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/noisychannel/rerank_utils.py b/SpeechT5/fairseq/examples/noisychannel/rerank_utils.py new file mode 100644 index 0000000..2c6bf1b --- /dev/null +++ b/SpeechT5/fairseq/examples/noisychannel/rerank_utils.py @@ -0,0 +1,850 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +import os +import re +import subprocess +from contextlib import redirect_stdout + +from fairseq import options +from fairseq_cli import eval_lm, preprocess + + +def reprocess(fle): + # takes in a file of generate.py translation generate_output + # returns a source dict and hypothesis dict, where keys are the ID num (as a string) + # and values and the corresponding source and translation. There may be several translations + # per source, so the values for hypothesis_dict are lists. + # parses output of generate.py + + with open(fle, "r") as f: + txt = f.read() + + """reprocess generate.py output""" + p = re.compile(r"[STHP][-]\d+\s*") + hp = re.compile(r"(\s*[-]?\d+[.]?\d+\s*)|(\s*(-inf)\s*)") + source_dict = {} + hypothesis_dict = {} + score_dict = {} + target_dict = {} + pos_score_dict = {} + lines = txt.split("\n") + + for line in lines: + line += "\n" + prefix = re.search(p, line) + if prefix is not None: + assert len(prefix.group()) > 2, "prefix id not found" + _, j = prefix.span() + id_num = prefix.group()[2:] + id_num = int(id_num) + line_type = prefix.group()[0] + if line_type == "H": + h_txt = line[j:] + hypo = re.search(hp, h_txt) + assert ( + hypo is not None + ), "regular expression failed to find the hypothesis scoring" + _, i = hypo.span() + score = hypo.group() + if id_num in hypothesis_dict: + hypothesis_dict[id_num].append(h_txt[i:]) + score_dict[id_num].append(float(score)) + else: + hypothesis_dict[id_num] = [h_txt[i:]] + score_dict[id_num] = [float(score)] + + elif line_type == "S": + source_dict[id_num] = line[j:] + elif line_type == "T": + target_dict[id_num] = line[j:] + elif line_type == "P": + pos_scores = (line[j:]).split() + pos_scores = [float(x) for x in pos_scores] + if id_num in pos_score_dict: + pos_score_dict[id_num].append(pos_scores) + else: + pos_score_dict[id_num] = [pos_scores] + + return source_dict, hypothesis_dict, score_dict, target_dict, pos_score_dict + + +def reprocess_nbest(fle): + """reprocess interactive.py output""" + with open(fle, "r") as f: + txt = f.read() + + source_dict = {} + hypothesis_dict = {} + score_dict = {} + target_dict = {} + pos_score_dict = {} + lines = txt.split("\n") + + hp = re.compile(r"[-]?\d+[.]?\d+") + j = -1 + + for _i, line in enumerate(lines): + line += "\n" + line_type = line[0] + + if line_type == "H": + hypo = re.search(hp, line) + _, start_index = hypo.span() + score = hypo.group() + if j in score_dict: + score_dict[j].append(float(score)) + hypothesis_dict[j].append(line[start_index:].strip("\t")) + else: + score_dict[j] = [float(score)] + hypothesis_dict[j] = [line[start_index:].strip("\t")] + elif line_type == "O": + j += 1 + source_dict[j] = line[2:] + # we don't have the targets for interactive.py + target_dict[j] = "filler" + + elif line_type == "P": + pos_scores = [float(pos_score) for pos_score in line.split()[1:]] + if j in pos_score_dict: + pos_score_dict[j].append(pos_scores) + else: + pos_score_dict[j] = [pos_scores] + + assert source_dict.keys() == hypothesis_dict.keys() + assert source_dict.keys() == pos_score_dict.keys() + assert source_dict.keys() == score_dict.keys() + + return source_dict, hypothesis_dict, score_dict, target_dict, pos_score_dict + + +def write_reprocessed( + sources, + hypos, + targets, + source_outfile, + hypo_outfile, + target_outfile, + right_to_left=False, + prefix_len=None, + bpe_symbol=None, + target_prefix_frac=None, + source_prefix_frac=None, +): + + """writes nbest hypothesis for rescoring""" + assert not ( + prefix_len is not None and target_prefix_frac is not None + ), "in writing reprocessed, only one type of prefix may be used" + assert not ( + prefix_len is not None and source_prefix_frac is not None + ), "in writing reprocessed, only one type of prefix may be used" + assert not ( + target_prefix_frac is not None and source_prefix_frac is not None + ), "in writing reprocessed, only one type of prefix may be used" + + with open(source_outfile, "w") as source_file, open( + hypo_outfile, "w" + ) as hypo_file, open(target_outfile, "w") as target_file: + + assert len(sources) == len(hypos), "sources and hypos list length mismatch" + if right_to_left: + for i in range(len(sources)): + for j in range(len(hypos[i])): + if prefix_len is None: + hypo_file.write(make_right_to_left(hypos[i][j]) + "\n") + else: + raise NotImplementedError() + source_file.write(make_right_to_left(sources[i]) + "\n") + target_file.write(make_right_to_left(targets[i]) + "\n") + else: + for i in sorted(sources.keys()): + for j in range(len(hypos[i])): + if prefix_len is not None: + shortened = ( + get_prefix_no_bpe(hypos[i][j], bpe_symbol, prefix_len) + + "\n" + ) + hypo_file.write(shortened) + source_file.write(sources[i]) + target_file.write(targets[i]) + elif target_prefix_frac is not None: + num_words, shortened, num_bpe_tokens = calc_length_from_frac( + hypos[i][j], target_prefix_frac, bpe_symbol + ) + shortened += "\n" + hypo_file.write(shortened) + source_file.write(sources[i]) + target_file.write(targets[i]) + elif source_prefix_frac is not None: + num_words, shortened, num_bpe_tokensn = calc_length_from_frac( + sources[i], source_prefix_frac, bpe_symbol + ) + shortened += "\n" + hypo_file.write(hypos[i][j]) + source_file.write(shortened) + target_file.write(targets[i]) + else: + hypo_file.write(hypos[i][j]) + source_file.write(sources[i]) + target_file.write(targets[i]) + + +def calc_length_from_frac(bpe_sentence, prefix_frac, bpe_symbol): + # return number of words, (not bpe tokens) that we want + no_bpe_sen = remove_bpe(bpe_sentence, bpe_symbol) + len_sen = len(no_bpe_sen.split()) + + num_words = math.ceil(len_sen * prefix_frac) + prefix = get_prefix_no_bpe(bpe_sentence, bpe_symbol, num_words) + num_bpe_tokens = len(prefix.split()) + return num_words, prefix, num_bpe_tokens + + +def get_prefix(sentence, prefix_len): + """assuming no bpe, gets the prefix of the sentence with prefix_len words""" + tokens = sentence.strip("\n").split() + if prefix_len >= len(tokens): + return sentence.strip("\n") + else: + return " ".join(tokens[:prefix_len]) + + +def get_prefix_no_bpe(sentence, bpe_symbol, prefix_len): + if bpe_symbol is None: + return get_prefix(sentence, prefix_len) + else: + return " ".join(get_prefix_from_len(sentence.split(), bpe_symbol, prefix_len)) + + +def get_prefix_from_len(sentence, bpe_symbol, prefix_len): + """get the prefix of sentence with bpe, with prefix len in terms of words, not bpe tokens""" + bpe_count = sum([bpe_symbol.strip(" ") in t for t in sentence[:prefix_len]]) + if bpe_count == 0: + return sentence[:prefix_len] + else: + return sentence[:prefix_len] + get_prefix_from_len( + sentence[prefix_len:], bpe_symbol, bpe_count + ) + + +def get_num_bpe_tokens_from_len(sentence, bpe_symbol, prefix_len): + """given a prefix length in terms of words, return the number of bpe tokens""" + prefix = get_prefix_no_bpe(sentence, bpe_symbol, prefix_len) + assert len(remove_bpe(prefix, bpe_symbol).split()) <= prefix_len + return len(prefix.split(" ")) + + +def make_right_to_left(line): + tokens = line.split() + tokens.reverse() + new_line = " ".join(tokens) + return new_line + + +def remove_bpe(line, bpe_symbol): + line = line.replace("\n", "") + line = (line + " ").replace(bpe_symbol, "").rstrip() + return line + ("\n") + + +def remove_bpe_dict(pred_dict, bpe_symbol): + new_dict = {} + for i in pred_dict: + if type(pred_dict[i]) == list: + new_list = [remove_bpe(elem, bpe_symbol) for elem in pred_dict[i]] + new_dict[i] = new_list + else: + new_dict[i] = remove_bpe(pred_dict[i], bpe_symbol) + return new_dict + + +def parse_bleu_scoring(line): + p = re.compile(r"(BLEU4 = )\d+[.]\d+") + res = re.search(p, line) + assert res is not None, line + return float(res.group()[8:]) + + +def get_full_from_prefix(hypo_prefix, hypos): + """given a hypo prefix, recover the first hypo from the list of complete hypos beginning with that prefix""" + for hypo in hypos: + hypo_prefix = hypo_prefix.strip("\n") + len_prefix = len(hypo_prefix) + if hypo[:len_prefix] == hypo_prefix: + return hypo + # no match found + raise Exception() + + +def get_score( + a, + b, + c, + target_len, + bitext_score1, + bitext_score2=None, + lm_score=None, + lenpen=None, + src_len=None, + tgt_len=None, + bitext1_backwards=False, + bitext2_backwards=False, + normalize=False, +): + if bitext1_backwards: + bitext1_norm = src_len + else: + bitext1_norm = tgt_len + if bitext_score2 is not None: + if bitext2_backwards: + bitext2_norm = src_len + else: + bitext2_norm = tgt_len + else: + bitext2_norm = 1 + bitext_score2 = 0 + if normalize: + score = ( + a * bitext_score1 / bitext1_norm + + b * bitext_score2 / bitext2_norm + + c * lm_score / src_len + ) + else: + score = a * bitext_score1 + b * bitext_score2 + c * lm_score + + if lenpen is not None: + score /= (target_len) ** float(lenpen) + + return score + + +class BitextOutput(object): + def __init__( + self, + output_file, + backwards, + right_to_left, + bpe_symbol, + prefix_len=None, + target_prefix_frac=None, + source_prefix_frac=None, + ): + """process output from rescoring""" + source, hypo, score, target, pos_score = reprocess(output_file) + if backwards: + self.hypo_fracs = source_prefix_frac + else: + self.hypo_fracs = target_prefix_frac + + # remove length penalty so we can use raw scores + score, num_bpe_tokens = get_score_from_pos( + pos_score, prefix_len, hypo, bpe_symbol, self.hypo_fracs, backwards + ) + source_lengths = {} + target_lengths = {} + + assert hypo.keys() == source.keys(), "key mismatch" + if backwards: + tmp = hypo + hypo = source + source = tmp + for i in source: + # since we are reranking, there should only be one hypo per source sentence + if backwards: + len_src = len(source[i][0].split()) + # record length without <eos> + if len_src == num_bpe_tokens[i][0] - 1: + source_lengths[i] = num_bpe_tokens[i][0] - 1 + else: + source_lengths[i] = num_bpe_tokens[i][0] + + target_lengths[i] = len(hypo[i].split()) + + source[i] = remove_bpe(source[i][0], bpe_symbol) + target[i] = remove_bpe(target[i], bpe_symbol) + hypo[i] = remove_bpe(hypo[i], bpe_symbol) + + score[i] = float(score[i][0]) + pos_score[i] = pos_score[i][0] + + else: + len_tgt = len(hypo[i][0].split()) + # record length without <eos> + if len_tgt == num_bpe_tokens[i][0] - 1: + target_lengths[i] = num_bpe_tokens[i][0] - 1 + else: + target_lengths[i] = num_bpe_tokens[i][0] + + source_lengths[i] = len(source[i].split()) + + if right_to_left: + source[i] = remove_bpe(make_right_to_left(source[i]), bpe_symbol) + target[i] = remove_bpe(make_right_to_left(target[i]), bpe_symbol) + hypo[i] = remove_bpe(make_right_to_left(hypo[i][0]), bpe_symbol) + score[i] = float(score[i][0]) + pos_score[i] = pos_score[i][0] + else: + assert ( + len(hypo[i]) == 1 + ), "expected only one hypothesis per source sentence" + source[i] = remove_bpe(source[i], bpe_symbol) + target[i] = remove_bpe(target[i], bpe_symbol) + hypo[i] = remove_bpe(hypo[i][0], bpe_symbol) + score[i] = float(score[i][0]) + pos_score[i] = pos_score[i][0] + + self.rescore_source = source + self.rescore_hypo = hypo + self.rescore_score = score + self.rescore_target = target + self.rescore_pos_score = pos_score + self.backwards = backwards + self.right_to_left = right_to_left + self.target_lengths = target_lengths + self.source_lengths = source_lengths + + +class BitextOutputFromGen(object): + def __init__( + self, + predictions_bpe_file, + bpe_symbol=None, + nbest=False, + prefix_len=None, + target_prefix_frac=None, + ): + if nbest: + ( + pred_source, + pred_hypo, + pred_score, + pred_target, + pred_pos_score, + ) = reprocess_nbest(predictions_bpe_file) + else: + pred_source, pred_hypo, pred_score, pred_target, pred_pos_score = reprocess( + predictions_bpe_file + ) + + assert len(pred_source) == len(pred_hypo) + assert len(pred_source) == len(pred_score) + assert len(pred_source) == len(pred_target) + assert len(pred_source) == len(pred_pos_score) + + # remove length penalty so we can use raw scores + pred_score, num_bpe_tokens = get_score_from_pos( + pred_pos_score, prefix_len, pred_hypo, bpe_symbol, target_prefix_frac, False + ) + + self.source = pred_source + self.target = pred_target + self.score = pred_score + self.pos_score = pred_pos_score + self.hypo = pred_hypo + self.target_lengths = {} + self.source_lengths = {} + + self.no_bpe_source = remove_bpe_dict(pred_source.copy(), bpe_symbol) + self.no_bpe_hypo = remove_bpe_dict(pred_hypo.copy(), bpe_symbol) + self.no_bpe_target = remove_bpe_dict(pred_target.copy(), bpe_symbol) + + # indexes to match those from the rescoring models + self.rescore_source = {} + self.rescore_target = {} + self.rescore_pos_score = {} + self.rescore_hypo = {} + self.rescore_score = {} + self.num_hypos = {} + self.backwards = False + self.right_to_left = False + + index = 0 + + for i in sorted(pred_source.keys()): + for j in range(len(pred_hypo[i])): + + self.target_lengths[index] = len(self.hypo[i][j].split()) + self.source_lengths[index] = len(self.source[i].split()) + + self.rescore_source[index] = self.no_bpe_source[i] + self.rescore_target[index] = self.no_bpe_target[i] + self.rescore_hypo[index] = self.no_bpe_hypo[i][j] + self.rescore_score[index] = float(pred_score[i][j]) + self.rescore_pos_score[index] = pred_pos_score[i][j] + self.num_hypos[index] = len(pred_hypo[i]) + index += 1 + + +def get_score_from_pos( + pos_score_dict, prefix_len, hypo_dict, bpe_symbol, hypo_frac, backwards +): + score_dict = {} + num_bpe_tokens_dict = {} + assert prefix_len is None or hypo_frac is None + for key in pos_score_dict: + score_dict[key] = [] + num_bpe_tokens_dict[key] = [] + for i in range(len(pos_score_dict[key])): + if prefix_len is not None and not backwards: + num_bpe_tokens = get_num_bpe_tokens_from_len( + hypo_dict[key][i], bpe_symbol, prefix_len + ) + score_dict[key].append(sum(pos_score_dict[key][i][:num_bpe_tokens])) + num_bpe_tokens_dict[key].append(num_bpe_tokens) + elif hypo_frac is not None: + num_words, shortened, hypo_prefix_len = calc_length_from_frac( + hypo_dict[key][i], hypo_frac, bpe_symbol + ) + score_dict[key].append(sum(pos_score_dict[key][i][:hypo_prefix_len])) + num_bpe_tokens_dict[key].append(hypo_prefix_len) + else: + score_dict[key].append(sum(pos_score_dict[key][i])) + num_bpe_tokens_dict[key].append(len(pos_score_dict[key][i])) + return score_dict, num_bpe_tokens_dict + + +class LMOutput(object): + def __init__( + self, + lm_score_file, + lm_dict=None, + prefix_len=None, + bpe_symbol=None, + target_prefix_frac=None, + ): + ( + lm_sentences, + lm_sen_scores, + lm_sen_pos_scores, + lm_no_bpe_sentences, + lm_bpe_tokens, + ) = parse_lm( + lm_score_file, + prefix_len=prefix_len, + bpe_symbol=bpe_symbol, + target_prefix_frac=target_prefix_frac, + ) + + self.sentences = lm_sentences + self.score = lm_sen_scores + self.pos_score = lm_sen_pos_scores + self.lm_dict = lm_dict + self.no_bpe_sentences = lm_no_bpe_sentences + self.bpe_tokens = lm_bpe_tokens + + +def parse_lm(input_file, prefix_len=None, bpe_symbol=None, target_prefix_frac=None): + """parse output of eval_lm""" + with open(input_file, "r") as f: + text = f.readlines() + text = text[7:] + cleaned_text = text[:-2] + + sentences = {} + sen_scores = {} + sen_pos_scores = {} + no_bpe_sentences = {} + num_bpe_tokens_dict = {} + for _i, line in enumerate(cleaned_text): + tokens = line.split() + if tokens[0].isdigit(): + line_id = int(tokens[0]) + scores = [float(x[1:-1]) for x in tokens[2::2]] + sentences[line_id] = " ".join(tokens[1::2][:-1]) + "\n" + if bpe_symbol is not None: + # exclude <eos> symbol to match output from generate.py + bpe_sen = " ".join(tokens[1::2][:-1]) + "\n" + no_bpe_sen = remove_bpe(bpe_sen, bpe_symbol) + no_bpe_sentences[line_id] = no_bpe_sen + + if prefix_len is not None: + num_bpe_tokens = get_num_bpe_tokens_from_len( + bpe_sen, bpe_symbol, prefix_len + ) + sen_scores[line_id] = sum(scores[:num_bpe_tokens]) + num_bpe_tokens_dict[line_id] = num_bpe_tokens + elif target_prefix_frac is not None: + num_words, shortened, target_prefix_len = calc_length_from_frac( + bpe_sen, target_prefix_frac, bpe_symbol + ) + sen_scores[line_id] = sum(scores[:target_prefix_len]) + num_bpe_tokens_dict[line_id] = target_prefix_len + else: + sen_scores[line_id] = sum(scores) + num_bpe_tokens_dict[line_id] = len(scores) + + sen_pos_scores[line_id] = scores + + return sentences, sen_scores, sen_pos_scores, no_bpe_sentences, num_bpe_tokens_dict + + +def get_directories( + data_dir_name, + num_rescore, + gen_subset, + fw_name, + shard_id, + num_shards, + sampling=False, + prefix_len=None, + target_prefix_frac=None, + source_prefix_frac=None, +): + nbest_file_id = ( + "nbest_" + + str(num_rescore) + + "_subset_" + + gen_subset + + "_fw_name_" + + fw_name + + "_shard_" + + str(shard_id) + + "_of_" + + str(num_shards) + ) + + if sampling: + nbest_file_id += "_sampling" + + # the directory containing all information for this nbest list + pre_gen = ( + os.path.join(os.path.dirname(__file__)) + + "/rerank_data/" + + data_dir_name + + "/" + + nbest_file_id + ) + # the directory to store the preprocessed nbest list, for left to right rescoring + left_to_right_preprocessed_dir = pre_gen + "/left_to_right_preprocessed" + if source_prefix_frac is not None: + left_to_right_preprocessed_dir = ( + left_to_right_preprocessed_dir + "/prefix_frac" + str(source_prefix_frac) + ) + # the directory to store the preprocessed nbest list, for right to left rescoring + right_to_left_preprocessed_dir = pre_gen + "/right_to_left_preprocessed" + # the directory to store the preprocessed nbest list, for backwards rescoring + backwards_preprocessed_dir = pre_gen + "/backwards" + if target_prefix_frac is not None: + backwards_preprocessed_dir = ( + backwards_preprocessed_dir + "/prefix_frac" + str(target_prefix_frac) + ) + elif prefix_len is not None: + backwards_preprocessed_dir = ( + backwards_preprocessed_dir + "/prefix_" + str(prefix_len) + ) + + # the directory to store the preprocessed nbest list, for rescoring with P(T) + lm_preprocessed_dir = pre_gen + "/lm_preprocessed" + + return ( + pre_gen, + left_to_right_preprocessed_dir, + right_to_left_preprocessed_dir, + backwards_preprocessed_dir, + lm_preprocessed_dir, + ) + + +def lm_scoring( + preprocess_directory, + bpe_status, + gen_output, + pre_gen, + cur_lm_dict, + cur_lm_name, + cur_language_model, + cur_lm_bpe_code, + batch_size, + lm_score_file, + target_lang, + source_lang, + prefix_len=None, +): + if prefix_len is not None: + assert ( + bpe_status == "different" + ), "bpe status must be different to use prefix len" + if bpe_status == "no bpe": + # run lm on output without bpe + write_reprocessed( + gen_output.no_bpe_source, + gen_output.no_bpe_hypo, + gen_output.no_bpe_target, + pre_gen + "/rescore_data_no_bpe.de", + pre_gen + "/rescore_data_no_bpe.en", + pre_gen + "/reference_file_no_bpe", + ) + + preprocess_lm_param = [ + "--only-source", + "--trainpref", + pre_gen + "/rescore_data_no_bpe." + target_lang, + "--srcdict", + cur_lm_dict, + "--destdir", + preprocess_directory, + ] + preprocess_parser = options.get_preprocessing_parser() + input_args = preprocess_parser.parse_args(preprocess_lm_param) + preprocess.main(input_args) + + eval_lm_param = [ + preprocess_directory, + "--path", + cur_language_model, + "--output-word-probs", + "--batch-size", + str(batch_size), + "--max-tokens", + "1024", + "--sample-break-mode", + "eos", + "--gen-subset", + "train", + ] + + eval_lm_parser = options.get_eval_lm_parser() + input_args = options.parse_args_and_arch(eval_lm_parser, eval_lm_param) + + with open(lm_score_file, "w") as f: + with redirect_stdout(f): + eval_lm.main(input_args) + + elif bpe_status == "shared": + preprocess_lm_param = [ + "--only-source", + "--trainpref", + pre_gen + "/rescore_data." + target_lang, + "--srcdict", + cur_lm_dict, + "--destdir", + preprocess_directory, + ] + preprocess_parser = options.get_preprocessing_parser() + input_args = preprocess_parser.parse_args(preprocess_lm_param) + preprocess.main(input_args) + + eval_lm_param = [ + preprocess_directory, + "--path", + cur_language_model, + "--output-word-probs", + "--batch-size", + str(batch_size), + "--sample-break-mode", + "eos", + "--gen-subset", + "train", + ] + + eval_lm_parser = options.get_eval_lm_parser() + input_args = options.parse_args_and_arch(eval_lm_parser, eval_lm_param) + + with open(lm_score_file, "w") as f: + with redirect_stdout(f): + eval_lm.main(input_args) + + elif bpe_status == "different": + rescore_file = pre_gen + "/rescore_data_no_bpe" + rescore_bpe = pre_gen + "/rescore_data_new_bpe" + + rescore_file += "." + rescore_bpe += "." + + write_reprocessed( + gen_output.no_bpe_source, + gen_output.no_bpe_hypo, + gen_output.no_bpe_target, + rescore_file + source_lang, + rescore_file + target_lang, + pre_gen + "/reference_file_no_bpe", + bpe_symbol=None, + ) + + # apply LM bpe to nbest list + bpe_src_param = [ + "-c", + cur_lm_bpe_code, + "--input", + rescore_file + target_lang, + "--output", + rescore_bpe + target_lang, + ] + subprocess.call( + [ + "python", + os.path.join( + os.path.dirname(__file__), "subword-nmt/subword_nmt/apply_bpe.py" + ), + ] + + bpe_src_param, + shell=False, + ) + # uncomment to use fastbpe instead of subword-nmt bpe + # bpe_src_param = [rescore_bpe+target_lang, rescore_file+target_lang, cur_lm_bpe_code] + # subprocess.call(["/private/home/edunov/fastBPE/fast", "applybpe"] + bpe_src_param, shell=False) + + preprocess_dir = preprocess_directory + + preprocess_lm_param = [ + "--only-source", + "--trainpref", + rescore_bpe + target_lang, + "--srcdict", + cur_lm_dict, + "--destdir", + preprocess_dir, + ] + preprocess_parser = options.get_preprocessing_parser() + input_args = preprocess_parser.parse_args(preprocess_lm_param) + preprocess.main(input_args) + + eval_lm_param = [ + preprocess_dir, + "--path", + cur_language_model, + "--output-word-probs", + "--batch-size", + str(batch_size), + "--max-tokens", + "1024", + "--sample-break-mode", + "eos", + "--gen-subset", + "train", + ] + + eval_lm_parser = options.get_eval_lm_parser() + input_args = options.parse_args_and_arch(eval_lm_parser, eval_lm_param) + + with open(lm_score_file, "w") as f: + with redirect_stdout(f): + eval_lm.main(input_args) + + +def rescore_file_name( + nbest_dir, + prefix_len, + scorer_name, + lm_file=False, + target_prefix_frac=None, + source_prefix_frac=None, + backwards=None, +): + if lm_file: + score_file = nbest_dir + "/lm_score_translations_model_" + scorer_name + ".txt" + else: + score_file = nbest_dir + "/" + scorer_name + "_score_translations.txt" + if backwards: + if prefix_len is not None: + score_file += "prefix_len" + str(prefix_len) + elif target_prefix_frac is not None: + score_file += "target_prefix_frac" + str(target_prefix_frac) + else: + if source_prefix_frac is not None: + score_file += "source_prefix_frac" + str(source_prefix_frac) + return score_file diff --git a/SpeechT5/fairseq/examples/nonautoregressive_translation/README.md b/SpeechT5/fairseq/examples/nonautoregressive_translation/README.md new file mode 100644 index 0000000..8793e22 --- /dev/null +++ b/SpeechT5/fairseq/examples/nonautoregressive_translation/README.md @@ -0,0 +1,146 @@ +# Non-autoregressive Neural Machine Translation (NAT) + +This page mainly includes instructions for reproducing results from the following papers +* [Levenshtein Transformer (Gu et al., 2019)](https://arxiv.org/abs/1905.11006). +* [Understanding Knowledge Distillation in Non-autoregressive Machine Translation (Zhou et al., 2019)](https://arxiv.org/abs/1911.02727). + +We also provided our own implementations for several popular non-autoregressive-based models as reference:<br> +* [Non-Autoregressive Neural Machine Translation (Gu et al., 2017)](https://arxiv.org/abs/1711.02281)<br> +* [Deterministic Non-Autoregressive Neural Sequence Modeling by Iterative Refinement (Lee et al., 2018)](https://arxiv.org/abs/1802.06901)<br> +* [Insertion Transformer: Flexible Sequence Generation via Insertion Operations (Stern et al., 2019)](https://arxiv.org/abs/1902.03249)<br> +* [Mask-Predict: Parallel Decoding of Conditional Masked Language Models (Ghazvininejad et al., 2019)](https://arxiv.org/abs/1904.09324v2)<br> +* [Fast Structured Decoding for Sequence Models (Sun et al., 2019)](https://arxiv.org/abs/1910.11555) + +## Dataset + +First, follow the [instructions to download and preprocess the WMT'14 En-De dataset](../translation#wmt14-english-to-german-convolutional). +Make sure to learn a joint vocabulary by passing the `--joined-dictionary` option to `fairseq-preprocess`. + +### Knowledge Distillation +Following [Gu et al. 2019](https://arxiv.org/abs/1905.11006), [knowledge distillation](https://arxiv.org/abs/1606.07947) from an autoregressive model can effectively simplify the training data distribution, which is sometimes essential for NAT-based models to learn good translations. +The easiest way of performing distillation is to follow the [instructions of training a standard transformer model](../translation) on the same data, and then decode the training set to produce a distillation dataset for NAT. + +### Download +We also provided the preprocessed [original](http://dl.fbaipublicfiles.com/nat/original_dataset.zip) and [distillation](http://dl.fbaipublicfiles.com/nat/distill_dataset.zip) datasets. Please build the binarized dataset on your own. + + +## Train a model + +Then we can train a nonautoregressive model using the `translation_lev` task and a new criterion `nat_loss`. +Use the `--noise` flag to specify the input noise used on the target sentences. +In default, we run the task for *Levenshtein Transformer*, with `--noise='random_delete'`. Full scripts to run other models can also be found [here](./scripts.md). + +The following command will train a *Levenshtein Transformer* on the binarized dataset. + +```bash +fairseq-train \ + data-bin/wmt14_en_de_distill \ + --save-dir checkpoints \ + --ddp-backend=legacy_ddp \ + --task translation_lev \ + --criterion nat_loss \ + --arch levenshtein_transformer \ + --noise random_delete \ + --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9,0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --stop-min-lr '1e-09' --warmup-updates 10000 \ + --warmup-init-lr '1e-07' --label-smoothing 0.1 \ + --dropout 0.3 --weight-decay 0.01 \ + --decoder-learned-pos \ + --encoder-learned-pos \ + --apply-bert-init \ + --log-format 'simple' --log-interval 100 \ + --fixed-validation-seed 7 \ + --max-tokens 8000 \ + --save-interval-updates 10000 \ + --max-update 300000 +``` + +## Translate + +Once a model is trained, we can generate translations using an `iterative_refinement_generator` which will based on the model's initial output and iteratively read and greedily refine the translation until (1) the model predicts the same translations for two consecutive iterations; or (2) the generator reaches the maximum iterations (`--iter-decode-max-iter`). Use `--print-step` to check the actual # of iteration for each sentence. + +For *Levenshtein Transformer*, it sometimes helps to apply a `--iter-decode-eos-penalty` (typically, 0~3) to penalize the model finishing generation too early and generating too short translations. + +For example, to generate with `--iter-decode-max-iter=9`: +```bash +fairseq-generate \ + data-bin/wmt14_en_de_distill \ + --gen-subset test \ + --task translation_lev \ + --path checkpoints/checkpoint_best.pt \ + --iter-decode-max-iter 9 \ + --iter-decode-eos-penalty 0 \ + --beam 1 --remove-bpe \ + --print-step \ + --batch-size 400 +``` +In the end of the generation, we can see the tokenized BLEU score for the translation. + +## Advanced Decoding Methods +### Ensemble +The NAT models use special implementations of [ensembling](https://github.com/fairinternal/fairseq-py/blob/b98d88da52f2f21f1b169bab8c70c1c4ca19a768/fairseq/sequence_generator.py#L522) to support iterative refinement and a variety of parallel operations in different models, while it shares the same API as standard autoregressive models as follows: +```bash +fairseq-generate \ + data-bin/wmt14_en_de_distill \ + --gen-subset test \ + --task translation_lev \ + --path checkpoint_1.pt:checkpoint_2.pt:checkpoint_3.pt \ + --iter-decode-max-iter 9 \ + --iter-decode-eos-penalty 0 \ + --beam 1 --remove-bpe \ + --print-step \ + --batch-size 400 +``` +We use ``:`` to split multiple models. Note that, not all NAT models support ensembling for now. + + +### Length-beam +For models that predict lengths before decoding (e.g. the vanilla NAT, Mask-Predict, etc), it is possible to improve the translation quality by varying the target lengths around the predicted value, and translating the same example multiple times in parallel. We can select the best translation with the highest scores defined by your model's output. + +Note that, not all models support length beams. For models which dynamically change the lengths (e.g. *Insertion Transformer*, *Levenshtein Transformer*), the same trick does not apply. + +### Re-ranking +If the model generates multiple translations with length beam, we can also introduce an autoregressive model to rerank the translations considering scoring from an autoregressive model is much faster than decoding from that. + +For example, to generate translations with length beam and reranking, +```bash +fairseq-generate \ + data-bin/wmt14_en_de_distill \ + --gen-subset test \ + --task translation_lev \ + --path checkpoints/checkpoint_best.pt:at_checkpoints/checkpoint_best.pt \ + --iter-decode-max-iter 9 \ + --iter-decode-eos-penalty 0 \ + --iter-decode-with-beam 9 \ + --iter-decode-with-external-reranker \ + --beam 1 --remove-bpe \ + --print-step \ + --batch-size 100 +``` +Note that we need to make sure the autoregressive model shares the same vocabulary as our target non-autoregressive model. + + +## Citation + +```bibtex +@incollection{NIPS2019_9297, + title = {Levenshtein Transformer}, + author = {Gu, Jiatao and Wang, Changhan and Zhao, Junbo}, + booktitle = {Advances in Neural Information Processing Systems 32}, + editor = {H. Wallach and H. Larochelle and A. Beygelzimer and F. d\textquotesingle Alch\'{e}-Buc and E. Fox and R. Garnett}, + pages = {11179--11189}, + year = {2019}, + publisher = {Curran Associates, Inc.}, + url = {http://papers.nips.cc/paper/9297-levenshtein-transformer.pdf} +} +``` +```bibtex +@article{zhou2019understanding, + title={Understanding Knowledge Distillation in Non-autoregressive Machine Translation}, + author={Zhou, Chunting and Neubig, Graham and Gu, Jiatao}, + journal={arXiv preprint arXiv:1911.02727}, + year={2019} +} +``` diff --git a/SpeechT5/fairseq/examples/nonautoregressive_translation/scripts.md b/SpeechT5/fairseq/examples/nonautoregressive_translation/scripts.md new file mode 100644 index 0000000..9d3d7b6 --- /dev/null +++ b/SpeechT5/fairseq/examples/nonautoregressive_translation/scripts.md @@ -0,0 +1,179 @@ +# Examples of Training scripts for Non-autoregressive Machine Translation models + +### Non-autoregressive Transformer (NAT, Gu et al., 2017) +Note that we need to have an additional module to perform "length prediction" (`--length-loss-factor`) before generating the whole sequence. +```bash +fairseq-train \ + data-bin/wmt14_en_de_distill \ + --save-dir checkpoints \ + --ddp-backend=legacy_ddp \ + --task translation_lev \ + --criterion nat_loss \ + --arch nonautoregressive_transformer \ + --noise full_mask \ + --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9,0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --stop-min-lr '1e-09' --warmup-updates 10000 \ + --warmup-init-lr '1e-07' --label-smoothing 0.1 \ + --dropout 0.3 --weight-decay 0.01 \ + --decoder-learned-pos \ + --encoder-learned-pos \ + --pred-length-offset \ + --length-loss-factor 0.1 \ + --apply-bert-init \ + --log-format 'simple' --log-interval 100 \ + --fixed-validation-seed 7 \ + --max-tokens 8000 \ + --save-interval-updates 10000 \ + --max-update 300000 +``` + +### Fast Structured Decoding for Sequence Models (NAT-CRF, Sun et al., 2019) +Note that we implemented a low-rank appromixated CRF model by setting `--crf-lowrank-approx=32` and `--crf-beam-approx=64` as discribed in the original paper. All other settings are the same as the vanilla NAT model. +```bash +fairseq-train \ + data-bin/wmt14_en_de_distill \ + --save-dir checkpoints \ + --ddp-backend=legacy_ddp \ + --task translation_lev \ + --criterion nat_loss \ + --arch nacrf_transformer \ + --noise full_mask \ + --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9,0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --stop-min-lr '1e-09' --warmup-updates 10000 \ + --warmup-init-lr '1e-07' --label-smoothing 0.1 \ + --dropout 0.3 --weight-decay 0.01 \ + --decoder-learned-pos \ + --encoder-learned-pos \ + --pred-length-offset \ + --length-loss-factor 0.1 \ + --word-ins-loss-factor 0.5 \ + --crf-lowrank-approx 32 \ + --crf-beam-approx 64 \ + --apply-bert-init \ + --log-format 'simple' --log-interval 100 \ + --fixed-validation-seed 7 \ + --max-tokens 8000 \ + --save-interval-updates 10000 \ + --max-update 300000 +``` + + +### Non-autoregressive Transformer with Iterative Refinement (iNAT, Lee et al., 2018) +Note that `--train-step` means how many iterations of refinement we used during training, and `--dae-ratio` controls the ratio of denoising auto-encoder training described in the original paper. +```bash +fairseq-train \ + data-bin/wmt14_en_de_distill \ + --save-dir checkpoints \ + --ddp-backend=legacy_ddp \ + --task translation_lev \ + --criterion nat_loss \ + --arch iterative_nonautoregressive_transformer \ + --noise full_mask \ + --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9,0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --stop-min-lr '1e-09' --warmup-updates 10000 \ + --warmup-init-lr '1e-07' --label-smoothing 0.1 \ + --dropout 0.3 --weight-decay 0.01 \ + --decoder-learned-pos \ + --encoder-learned-pos \ + --pred-length-offset \ + --length-loss-factor 0.1 \ + --train-step 4 \ + --dae-ratio 0.5 \ + --stochastic-approx \ + --apply-bert-init \ + --log-format 'simple' --log-interval 100 \ + --fixed-validation-seed 7 \ + --max-tokens 8000 \ + --save-interval-updates 10000 \ + --max-update 300000 +``` + +### Insertion Transformer (InsT, Stern et al., 2019) +Note that we need to specify the "slot-loss" (uniform or balanced tree) described in the original paper. Here we use `--label-tau` to control the temperature. + +```bash +fairseq-train \ + data-bin/wmt14_en_de_distill \ + --save-dir checkpoints \ + --ddp-backend=legacy_ddp \ + --task translation_lev \ + --criterion nat_loss \ + --arch insertion_transformer \ + --noise random_delete \ + --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9,0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --stop-min-lr '1e-09' --warmup-updates 10000 \ + --warmup-init-lr '1e-07' --label-smoothing 0.1 \ + --dropout 0.3 --weight-decay 0.01 \ + --decoder-learned-pos \ + --encoder-learned-pos \ + --apply-bert-init \ + --log-format 'simple' --log-interval 100 \ + --fixed-validation-seed 7 \ + --max-tokens 8000 \ + --save-interval-updates 10000 \ + --max-update 300000 +``` + + +### Mask Predict (CMLM, Ghazvininejad et al., 2019) +```bash +fairseq-train \ + data-bin/wmt14_en_de_distill \ + --save-dir checkpoints \ + --ddp-backend=legacy_ddp \ + --task translation_lev \ + --criterion nat_loss \ + --arch cmlm_transformer \ + --noise random_mask \ + --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9,0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --stop-min-lr '1e-09' --warmup-updates 10000 \ + --warmup-init-lr '1e-07' --label-smoothing 0.1 \ + --dropout 0.3 --weight-decay 0.01 \ + --decoder-learned-pos \ + --encoder-learned-pos \ + --apply-bert-init \ + --log-format 'simple' --log-interval 100 \ + --fixed-validation-seed 7 \ + --max-tokens 8000 \ + --save-interval-updates 10000 \ + --max-update 300000 +``` + + + + +### Levenshtein Transformer (LevT, Gu et al., 2019) +```bash +fairseq-train \ + data-bin/wmt14_en_de_distill \ + --save-dir checkpoints \ + --ddp-backend=legacy_ddp \ + --task translation_lev \ + --criterion nat_loss \ + --arch levenshtein_transformer \ + --noise random_delete \ + --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9,0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --stop-min-lr '1e-09' --warmup-updates 10000 \ + --warmup-init-lr '1e-07' --label-smoothing 0.1 \ + --dropout 0.3 --weight-decay 0.01 \ + --decoder-learned-pos \ + --encoder-learned-pos \ + --apply-bert-init \ + --log-format 'simple' --log-interval 100 \ + --fixed-validation-seed 7 \ + --max-tokens 8000 \ + --save-interval-updates 10000 \ + --max-update 300000 +``` diff --git a/SpeechT5/fairseq/examples/paraphraser/README.md b/SpeechT5/fairseq/examples/paraphraser/README.md new file mode 100644 index 0000000..3810311 --- /dev/null +++ b/SpeechT5/fairseq/examples/paraphraser/README.md @@ -0,0 +1,46 @@ +# Paraphrasing with round-trip translation and mixture of experts + +Machine translation models can be used to paraphrase text by translating it to +an intermediate language and back (round-trip translation). + +This example shows how to paraphrase text by first passing it to an +English-French translation model, followed by a French-English [mixture of +experts translation model](/examples/translation_moe). + +##### 0. Setup + +Clone fairseq from source and install necessary dependencies: +```bash +git clone https://github.com/pytorch/fairseq.git +cd fairseq +pip install --editable . +pip install sacremoses sentencepiece +``` + +##### 1. Download models +```bash +wget https://dl.fbaipublicfiles.com/fairseq/models/paraphraser.en-fr.tar.gz +wget https://dl.fbaipublicfiles.com/fairseq/models/paraphraser.fr-en.hMoEup.tar.gz +tar -xzvf paraphraser.en-fr.tar.gz +tar -xzvf paraphraser.fr-en.hMoEup.tar.gz +``` + +##### 2. Paraphrase +```bash +python examples/paraphraser/paraphrase.py \ + --en2fr paraphraser.en-fr \ + --fr2en paraphraser.fr-en.hMoEup +# Example input: +# The new date for the Games, postponed for a year in response to the coronavirus pandemic, gives athletes time to recalibrate their training schedules. +# Example outputs: +# Delayed one year in response to the coronavirus pandemic, the new date of the Games gives athletes time to rebalance their training schedule. +# The new date of the Games, which was rescheduled one year in response to the coronavirus (CV) pandemic, gives athletes time to rebalance their training schedule. +# The new date of the Games, postponed one year in response to the coronavirus pandemic, provides athletes with time to rebalance their training schedule. +# The Games' new date, postponed one year in response to the coronavirus pandemic, gives athletes time to rebalance their training schedule. +# The new Games date, postponed one year in response to the coronavirus pandemic, gives the athletes time to rebalance their training schedule. +# The new date of the Games, which was postponed one year in response to the coronavirus pandemic, gives the athletes time to rebalance their training schedule. +# The new date of the Games, postponed one year in response to the coronavirus pandemic, gives athletes time to rebalance their training schedule. +# The new date of the Games, postponed one year in response to the coronavirus pandemic, gives athletes time to re-balance their training schedule. +# The new date of the Games, postponed one year in response to the coronavirus pandemic, gives the athletes time to rebalance their schedule of training. +# The new date of the Games, postponed one year in response to the pandemic of coronavirus, gives the athletes time to rebalance their training schedule. +``` diff --git a/SpeechT5/fairseq/examples/paraphraser/paraphrase.py b/SpeechT5/fairseq/examples/paraphraser/paraphrase.py new file mode 100644 index 0000000..d3422fb --- /dev/null +++ b/SpeechT5/fairseq/examples/paraphraser/paraphrase.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 -u + +import argparse +import fileinput +import logging +import os +import sys + +from fairseq.models.transformer import TransformerModel + + +logging.getLogger().setLevel(logging.INFO) + + +def main(): + parser = argparse.ArgumentParser(description="") + parser.add_argument("--en2fr", required=True, help="path to en2fr model") + parser.add_argument( + "--fr2en", required=True, help="path to fr2en mixture of experts model" + ) + parser.add_argument( + "--user-dir", help="path to fairseq examples/translation_moe/src directory" + ) + parser.add_argument( + "--num-experts", + type=int, + default=10, + help="(keep at 10 unless using a different model)", + ) + parser.add_argument( + "files", + nargs="*", + default=["-"], + help='input files to paraphrase; "-" for stdin', + ) + args = parser.parse_args() + + if args.user_dir is None: + args.user_dir = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), # examples/ + "translation_moe", + "src", + ) + if os.path.exists(args.user_dir): + logging.info("found user_dir:" + args.user_dir) + else: + raise RuntimeError( + "cannot find fairseq examples/translation_moe/src " + "(tried looking here: {})".format(args.user_dir) + ) + + logging.info("loading en2fr model from:" + args.en2fr) + en2fr = TransformerModel.from_pretrained( + model_name_or_path=args.en2fr, + tokenizer="moses", + bpe="sentencepiece", + ).eval() + + logging.info("loading fr2en model from:" + args.fr2en) + fr2en = TransformerModel.from_pretrained( + model_name_or_path=args.fr2en, + tokenizer="moses", + bpe="sentencepiece", + user_dir=args.user_dir, + task="translation_moe", + ).eval() + + def gen_paraphrases(en): + fr = en2fr.translate(en) + return [ + fr2en.translate(fr, inference_step_args={"expert": i}) + for i in range(args.num_experts) + ] + + logging.info("Type the input sentence and press return:") + for line in fileinput.input(args.files): + line = line.strip() + if len(line) == 0: + continue + for paraphrase in gen_paraphrases(line): + print(paraphrase) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/pay_less_attention_paper/README.md b/SpeechT5/fairseq/examples/pay_less_attention_paper/README.md new file mode 100644 index 0000000..5adab11 --- /dev/null +++ b/SpeechT5/fairseq/examples/pay_less_attention_paper/README.md @@ -0,0 +1,176 @@ +# Pay Less Attention with Lightweight and Dynamic Convolutions (Wu et al., 2019) + +This page contains pointers to pre-trained models as well as instructions on how to train new models for [our paper](https://arxiv.org/abs/1901.10430). + +## Citation: +```bibtex +@inproceedings{wu2018pay, + title = {Pay Less Attention with Lightweight and Dynamic Convolutions}, + author = {Felix Wu and Angela Fan and Alexei Baevski and Yann Dauphin and Michael Auli}, + booktitle = {International Conference on Learning Representations}, + year = {2019}, + url = {https://arxiv.org/abs/1901.10430}, +} +``` + +## Translation + +### Pre-trained models +For some datasets we release models without GLUs which are faster at inference. + +Model | Description | Dataset | Download +---|---|---|--- +`lightconv.no_glu.iwslt14.de-en` | LightConv (without GLUs) | [IWSLT14 German-English](https://wit3.fbk.eu/archive/2014-01/texts/de/en/de-en.tgz) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/iwslt14.de-en.lightconv.tar.gz) <br> IWSLT14 test: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/iwslt14.de-en.test.tar.bz2) +`dynamicconv.no_glu.iwslt14.de-en` | DynamicConv (without GLUs) | [IWSLT14 German-English](https://wit3.fbk.eu/archive/2014-01/texts/de/en/de-en.tgz) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/iwslt14.de-en.dynamicconv.tar.gz) <br> IWSLT14 test: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/iwslt14.de-en.test.tar.bz2) +`lightconv.no_glu.wmt16.en-de` | LightConv (without GLUs) | [WMT16 English-German](https://drive.google.com/uc?export=download&id=0B_bZck-ksdkpM25jRUN2X2UxMm8) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.lightconv.tar.gz) <br> newstest2014 (shared vocab): <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt16.en-de.joined-dict.newstest2014.tar.bz2) +`dynamicconv.no_glu.wmt16.en-de` | DynamicConv (without GLUs) | [WMT16 English-German](https://drive.google.com/uc?export=download&id=0B_bZck-ksdkpM25jRUN2X2UxMm8) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.dynamicconv.tar.gz) <br> newstest2014 (shared vocab): <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt16.en-de.joined-dict.newstest2014.tar.bz2) +`lightconv.glu.wmt16.en-de` | LightConv | [WMT16 English-German](https://drive.google.com/uc?export=download&id=0B_bZck-ksdkpM25jRUN2X2UxMm8) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.lightconv-glu.tar.gz) <br> newstest2014 (shared vocab): <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt16.en-de.joined-dict.newstest2014.tar.bz2) +`dynamicconv.glu.wmt16.en-de` | DynamicConv | [WMT16 English-German](https://drive.google.com/uc?export=download&id=0B_bZck-ksdkpM25jRUN2X2UxMm8) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.dynamicconv-glu.tar.gz) <br> newstest2014 (shared vocab): <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt16.en-de.joined-dict.newstest2014.tar.bz2) +`lightconv.glu.wmt14.en-fr` | LightConv | [WMT14 English-French](http://statmt.org/wmt14/translation-task.html#Download) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt14.en-fr.joined-dict.lightconv-glu.tar.gz) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.en-fr.joined-dict.newstest2014.tar.bz2) +`dynamicconv.glu.wmt14.en-fr` | DynamicConv | [WMT14 English-French](http://statmt.org/wmt14/translation-task.html#Download) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt14.en-fr.joined-dict.dynamicconv-glu.tar.gz) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.en-fr.joined-dict.newstest2014.tar.bz2) +`lightconv.glu.wmt17.zh-en` | LightConv | [WMT17 Chinese-English](http://statmt.org/wmt17/translation-task.html#Download) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt17.zh-en.lightconv-glu.tar.gz) <br> newstest2017: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt17.zh-en.newstest2017.tar.bz2) +`dynamicconv.glu.wmt17.zh-en` | DynamicConv | [WMT17 Chinese-English](http://statmt.org/wmt17/translation-task.html#Download) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt17.zh-en.dynamicconv-glu.tar.gz) <br> newstest2017: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt17.zh-en.newstest2017.tar.bz2) + +### Memory-Efficient CUDA Kernels + +Since the PyTorch implementations of Light/Dynamic conv are quite memory intensive, we have developed CUDA kernels that implement the light and dynamic convolution operator in a memory-efficient and performant manner. For large sequence lengths, these kernels save about 50% memory compared to the PyTorch equivalent. + +To install the kernels, use the commands below. Once installed, they will automatically be used in place of the PyTorch implementations whenever a light or dynamic convolution is used. + +```sh +# to install lightconv +cd fairseq/modules/lightconv_layer +python cuda_function_gen.py +python setup.py install + +# to install dynamicconv +cd fairseq/modules/dynamicconv_layer +python cuda_function_gen.py +python setup.py install +``` + +### Example usage (torch.hub) + +We require a few additional Python dependencies for preprocessing: +```bash +pip install sacremoses subword_nmt +``` + +Interactive translation via PyTorch Hub: +```python +import torch + +# List available models +torch.hub.list('pytorch/fairseq') # [..., 'lightconv.glu.wmt17.zh-en', ... ] + +# Load a transformer trained on WMT'16 En-De +zh2en = torch.hub.load('pytorch/fairseq', 'lightconv.glu.wmt17.zh-en', tokenizer='moses', bpe='subword_nmt') + +# The underlying model is available under the *models* attribute +assert isinstance(zh2en.models[0], fairseq.models.lightconv.LightConvModel) + +# Translate a sentence +zh2en.translate('你好 世界') +# 'Hello World' +``` + +Loading custom models: +```python +from fairseq.models.lightconv import LightConvModel +en2fr = LightConvModel.from_pretrained( + '/path/to/checkpoints', + checkpoint_file='checkpoint_best.pt', + data_name_or_path='data-bin/wmt14_en_fr', + bpe='subword_nmt', + bpe_codes='data-bin/wmt14_en_fr/en.code' +) +en2fr.translate('Hello world!') +# 'Bonjour le monde' +``` + +### Preprocessing the training datasets + +Please follow the instructions in [`examples/translation/README.md`](../translation/README.md) to preprocess the data. + +### Training and evaluation options: +To use the model without GLU, please set `--encoder-glu 0 --decoder-glu 0`. +For LightConv, please use `--encoder-conv-type lightweight --decoder-conv-type lightweight`, otherwise the default is DynamicConv. +For best BLEU results, lenpen may need to be manually tuned. + +To use the CUDA kernels, first install the PyTorch modules using the commands +above. Once the CUDA modules are installed, they will automatically be used +instead of the PyTorch modules. + +### IWSLT14 De-En +Training and evaluating DynamicConv (without GLU) on a GPU: +```sh +# Training +SAVE="save/dynamic_conv_iwslt" +mkdir -p $SAVE +CUDA_VISIBLE_DEVICES=0 $(which fairseq-train) data-bin/iwslt14.tokenized.de-en \ + --clip-norm 0 --optimizer adam --lr 0.0005 \ + --source-lang de --target-lang en --max-tokens 4000 --no-progress-bar \ + --log-interval 100 --stop-min-lr '1e-09' --weight-decay 0.0001 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --lr-scheduler inverse_sqrt \ + --ddp-backend=legacy_ddp \ + --max-update 50000 --warmup-updates 4000 --warmup-init-lr '1e-07' \ + --adam-betas '(0.9, 0.98)' --keep-last-epochs 10 \ + -a lightconv_iwslt_de_en --save-dir $SAVE \ + --dropout 0.3 --attention-dropout 0.1 --weight-dropout 0.1 \ + --encoder-glu 0 --decoder-glu 0 +python scripts/average_checkpoints.py --inputs $SAVE \ + --num-epoch-checkpoints 10 --output "${SAVE}/checkpoint_last10_avg.pt" + +# Evaluation +CUDA_VISIBLE_DEVICES=0 fairseq-generate data-bin/iwslt14.tokenized.de-en --path "${SAVE}/checkpoint_last10_avg.pt" --batch-size 128 --beam 4 --remove-bpe --lenpen 1 --gen-subset test --quiet +``` + +### WMT16 En-De +Training and evaluating DynamicConv (with GLU) on WMT16 En-De using cosine scheduler on one machine with 8 V100 GPUs: +```sh +# Training +SAVE="save/dynamic_conv_wmt16en2de" +mkdir -p $SAVE +python -m torch.distributed.launch --nproc_per_node 8 $(which fairseq-train) \ + data-bin/wmt16_en_de_bpe32k --fp16 --log-interval 100 --no-progress-bar \ + --max-update 30000 --share-all-embeddings --optimizer adam \ + --adam-betas '(0.9, 0.98)' --clip-norm 0.0 --weight-decay 0.0 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --stop-min-lr 1e-09 --update-freq 16 --attention-dropout 0.1 --keep-last-epochs 10 \ + --ddp-backend=legacy_ddp --max-tokens 3584 \ + --lr-scheduler cosine --warmup-init-lr 1e-7 --warmup-updates 10000 \ + --lr-shrink 1 --lr 0.001 --min-lr 1e-7 --warmup-init-lr 1e-07 \ + --t-mult 1 --lr-period-updates 20000 \ + --arch lightconv_wmt_en_de_big --save-dir $SAVE \ + --dropout 0.3 --attention-dropout 0.1 --weight-dropout 0.1 \ + --encoder-glu 1 --decoder-glu 1 + +# Evaluation +CUDA_VISIBLE_DEVICES=0 fairseq-generate data-bin/wmt16.en-de.joined-dict.newstest2014 --path "${SAVE}/checkpoint_best.pt" --batch-size 128 --beam 5 --remove-bpe --lenpen 0.5 --gen-subset test > wmt16_gen.txt +bash scripts/compound_split_bleu.sh wmt16_gen.txt +``` + +### WMT14 En-Fr +Training DynamicConv (with GLU) on WMT14 En-Fr using cosine scheduler on one machine with 8 V100 GPUs: +```sh +# Training +SAVE="save/dynamic_conv_wmt14en2fr" +mkdir -p $SAVE +python -m torch.distributed.launch --nproc_per_node 8 $(which fairseq-train) \ + data-bin/wmt14_en_fr --fp16 --log-interval 100 --no-progress-bar \ + --max-update 30000 --share-all-embeddings --optimizer adam \ + --adam-betas '(0.9, 0.98)' --clip-norm 0.0 --weight-decay 0.0 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --stop-min-lr 1e-09 --update-freq 16 --attention-dropout 0.1 --keep-last-epochs 10 \ + --ddp-backend=legacy_ddp --max-tokens 3584 \ + --lr-scheduler cosine --warmup-init-lr 1e-7 --warmup-updates 10000 \ + --lr-shrink 1 --lr 0.001 --min-lr 1e-7 --warmup-init-lr 1e-07 \ + --t-mult 1 --lr-period-updates 70000 \ + --arch lightconv_wmt_en_fr_big --save-dir $SAVE \ + --dropout 0.1 --attention-dropout 0.1 --weight-dropout 0.1 \ + --encoder-glu 1 --decoder-glu 1 + +# Evaluation +CUDA_VISIBLE_DEVICES=0 fairseq-generate data-bin/wmt14.en-fr.joined-dict.newstest2014 --path "${SAVE}/checkpoint_best.pt" --batch-size 128 --beam 5 --remove-bpe --lenpen 0.9 --gen-subset test +``` diff --git a/SpeechT5/fairseq/examples/pointer_generator/README.md b/SpeechT5/fairseq/examples/pointer_generator/README.md new file mode 100644 index 0000000..6096570 --- /dev/null +++ b/SpeechT5/fairseq/examples/pointer_generator/README.md @@ -0,0 +1,82 @@ +# Transformer with Pointer-Generator Network + +This page describes the `transformer_pointer_generator` model that incorporates +a pointing mechanism in the Transformer model that facilitates copying of input +words to the output. This architecture is described in [Enarvi et al. (2020)](https://www.aclweb.org/anthology/2020.nlpmc-1.4/). + +## Background + +The pointer-generator network was introduced in [See et al. (2017)](https://arxiv.org/abs/1704.04368) +for RNN encoder-decoder attention models. A similar mechanism can be +incorporated in a Transformer model by reusing one of the many attention +distributions for pointing. The attention distribution over the input words is +interpolated with the normal output distribution over the vocabulary words. This +allows the model to generate words that appear in the input, even if they don't +appear in the vocabulary, helping especially with small vocabularies. + +## Implementation + +The mechanism for copying out-of-vocabulary words from the input has been +implemented differently to See et al. In their [implementation](https://github.com/abisee/pointer-generator) +they convey the word identities through the model in order to be able to produce +words that appear in the input sequence but not in the vocabulary. A different +approach was taken in the Fairseq implementation to keep it self-contained in +the model file, avoiding any changes to the rest of the code base. Copying +out-of-vocabulary words is possible by pre-processing the input and +post-processing the output. This is described in detail in the next section. + +## Usage + +The training and evaluation procedure is outlined below. You can also find a +more detailed example for the XSum dataset on [this page](README.xsum.md). + +##### 1. Create a vocabulary and extend it with source position markers + +The pointing mechanism is especially helpful with small vocabularies, if we are +able to recover the identities of any out-of-vocabulary words that are copied +from the input. For this purpose, the model allows extending the vocabulary with +special tokens that can be used in place of `<unk>` tokens to identify different +input positions. For example, the user may add `<unk-0>`, `<unk-1>`, `<unk-2>`, +etc. to the end of the vocabulary, after the normal words. Below is an example +of how to create a vocabulary of 10000 most common words and add 1000 input +position markers. + +```bash +vocab_size=10000 +position_markers=1000 +export LC_ALL=C +cat train.src train.tgt | + tr -s '[:space:]' '\n' | + sort | + uniq -c | + sort -k1,1bnr -k2 | + head -n "$((vocab_size - 4))" | + awk '{ print $2 " " $1 }' >dict.pg.txt +python3 -c "[print('<unk-{}> 0'.format(n)) for n in range($position_markers)]" >>dict.pg.txt +``` + +##### 2. Preprocess the text data + +The idea is that any `<unk>` tokens in the text are replaced with `<unk-0>` if +it appears in the first input position, `<unk-1>` if it appears in the second +input position, and so on. This can be achieved using the `preprocess.py` script +that is provided in this directory. + +##### 3. Train a model + +The number of these special tokens is given to the model with the +`--source-position-markers` argument—the model simply maps all of these to the +same word embedding as `<unk>`. + +The attention distribution that is used for pointing is selected using the +`--alignment-heads` and `--alignment-layer` command-line arguments in the same +way as with the `transformer_align` model. + +##### 4. Generate text and postprocess it + +When using the model to generate text, you want to preprocess the input text in +the same way that training data was processed, replacing out-of-vocabulary words +with `<unk-N>` tokens. If any of these tokens are copied to the output, the +actual words can be retrieved from the unprocessed input text. Any `<unk-N>` +token should be replaced with the word at position N in the original input +sequence. This can be achieved using the `postprocess.py` script. diff --git a/SpeechT5/fairseq/examples/pointer_generator/README.xsum.md b/SpeechT5/fairseq/examples/pointer_generator/README.xsum.md new file mode 100644 index 0000000..ac3a8c3 --- /dev/null +++ b/SpeechT5/fairseq/examples/pointer_generator/README.xsum.md @@ -0,0 +1,180 @@ +## Training a pointer-generator model on the Extreme Summarization dataset + +##### 1. Download the Extreme Summarization data and preprocess it + +Follow the instructions [here](https://github.com/EdinburghNLP/XSum) to obtain +the original Extreme Summarization dataset. You should have six files, +{train,validation,test}.{document,summary}. + +##### 2. Create a vocabulary and extend it with source position markers + +```bash +vocab_size=10000 +position_markers=1000 +export LC_ALL=C +cat train.document train.summary | + tr -s '[:space:]' '\n' | + sort | + uniq -c | + sort -k1,1bnr -k2 | + head -n "$((vocab_size - 4))" | + awk '{ print $2 " " $1 }' >dict.pg.txt +python3 -c "[print('<unk-{}> 0'.format(n)) for n in range($position_markers)]" >>dict.pg.txt +``` + +This creates the file dict.pg.txt that contains the 10k most frequent words, +followed by 1k source position markers: + +``` +the 4954867 +. 4157552 +, 3439668 +to 2212159 +a 1916857 +of 1916820 +and 1823350 +... +<unk-0> 0 +<unk-1> 0 +<unk-2> 0 +<unk-3> 0 +<unk-4> 0 +... +``` + +##### 2. Preprocess the text data + +```bash +./preprocess.py --source train.document --target train.summary --vocab <(cut -d' ' -f1 dict.pg.txt) --source-out train.pg.src --target-out train.pg.tgt +./preprocess.py --source validation.document --target validation.summary --vocab <(cut -d' ' -f1 dict.pg.txt) --source-out valid.pg.src --target-out valid.pg.tgt +./preprocess.py --source test.document --vocab <(cut -d' ' -f1 dict.pg.txt) --source-out test.pg.src +``` + +The data should now contain `<unk-N>` tokens in place of out-of-vocabulary words. + +##### 3. Binarize the dataset: + +```bash +fairseq-preprocess \ + --source-lang src \ + --target-lang tgt \ + --trainpref train.pg \ + --validpref valid.pg \ + --destdir bin \ + --workers 60 \ + --srcdict dict.pg.txt \ + --joined-dictionary +``` + +##### 3. Train a model + +```bash +total_updates=20000 +warmup_updates=500 +lr=0.001 +max_tokens=4096 +update_freq=4 +pointer_layer=-2 + +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 fairseq-train bin \ + --user-dir examples/pointer_generator/pointer_generator_src \ + --max-tokens "$max_tokens" \ + --task translation \ + --source-lang src --target-lang tgt \ + --truncate-source \ + --layernorm-embedding \ + --share-all-embeddings \ + --encoder-normalize-before \ + --decoder-normalize-before \ + --required-batch-size-multiple 1 \ + --arch transformer_pointer_generator \ + --alignment-layer "$pointer_layer" \ + --alignment-heads 1 \ + --source-position-markers 1000 \ + --criterion label_smoothed_cross_entropy \ + --label-smoothing 0.1 \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.01 --optimizer adam --adam-betas "(0.9, 0.999)" --adam-eps 1e-08 \ + --clip-norm 0.1 \ + --lr-scheduler inverse_sqrt --lr "$lr" --max-update "$total_updates" --warmup-updates "$warmup_updates" \ + --update-freq "$update_freq" \ + --skip-invalid-size-inputs-valid-test +``` + +Above we specify that our dictionary contains 1000 source position markers, and +that we want to use one attention head from the penultimate decoder layer for +pointing. It should run in 5.5 hours on one node with eight 32GB V100 GPUs. The +logged messages confirm that dictionary indices above 10000 will be mapped to +the `<unk>` embedding: + +``` +2020-09-24 20:43:53 | INFO | fairseq.tasks.translation | [src] dictionary: 11000 types +2020-09-24 20:43:53 | INFO | fairseq.tasks.translation | [tgt] dictionary: 11000 types +2020-09-24 20:43:53 | INFO | fairseq.data.data_utils | loaded 11332 examples from: bin/valid.src-tgt.src +2020-09-24 20:43:53 | INFO | fairseq.data.data_utils | loaded 11332 examples from: bin/valid.src-tgt.tgt +2020-09-24 20:43:53 | INFO | fairseq.tasks.translation | bin valid src-tgt 11332 examples +2020-09-24 20:43:53 | INFO | fairseq.models.transformer_pg | dictionary indices from 10000 to 10999 will be mapped to 3 +``` + +##### 4. Summarize the test sequences + +```bash +batch_size=32 +beam_size=6 +max_length=60 +length_penalty=1.0 + +fairseq-interactive bin \ + --user-dir examples/pointer_generator/pointer_generator_src \ + --batch-size "$batch_size" \ + --task translation \ + --source-lang src --target-lang tgt \ + --path checkpoints/checkpoint_last.pt \ + --input test.pg.src \ + --buffer-size 200 \ + --max-len-a 0 \ + --max-len-b "$max_length" \ + --lenpen "$length_penalty" \ + --beam "$beam_size" \ + --skip-invalid-size-inputs-valid-test | + tee generate.out +grep ^H generate.out | cut -f 3- >generate.hyp +``` + +Now you should have the generated sequences in `generate.hyp`. They contain +`<unk-N>` tokens that the model has copied from the source sequence. In order to +retrieve the original words, we need the unprocessed source sequences from +`test.document`. + +##### 5. Process the generated output + +Since we skipped too long inputs when producing `generate.hyp`, we also have to +skip too long sequences now that we read `test.document`. + +```bash +./postprocess.py \ + --source <(awk 'NF<1024' test.document) \ + --target generate.hyp \ + --target-out generate.hyp.processed +``` + +Now you'll find the final sequences from `generate.hyp.processed`, with +`<unk-N>` replaced with the original word from the source sequence. + +##### An example of a summarized sequence + +The original source document in `test.document`: + +> de roon moved to teesside in june 2016 for an initial # 8.8 m fee and played 33 premier league games last term . the netherlands international , 26 , scored five goals in 36 league and cup games during his spell at boro . meanwhile , manager garry monk confirmed the championship club 's interest in signing chelsea midfielder lewis baker . `` he 's a target and one of many that we 've had throughout the summer months , '' said monk . find all the latest football transfers on our dedicated page . + +The preprocessed source document in `test.src.pg`: + +> de \<unk-1> moved to \<unk-4> in june 2016 for an initial # \<unk-12> m fee and played 33 premier league games last term . the netherlands international , 26 , scored five goals in 36 league and cup games during his spell at boro . meanwhile , manager garry monk confirmed the championship club 's interest in signing chelsea midfielder lewis baker . `` he 's a target and one of many that we 've had throughout the summer months , '' said monk . find all the latest football transfers on our dedicated page . + +The generated summary in `generate.hyp`: + +> middlesbrough striker \<unk> de \<unk-1> has joined spanish side \<unk> on a season-long loan . + +The generated summary after postprocessing in `generate.hyp.processed`: + +> middlesbrough striker \<unk> de roon has joined spanish side \<unk> on a season-long loan . diff --git a/SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/__init__.py b/SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/__init__.py new file mode 100644 index 0000000..c361ff6 --- /dev/null +++ b/SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import transformer_pg # noqa diff --git a/SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/transformer_pg.py b/SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/transformer_pg.py new file mode 100644 index 0000000..4ccf30f --- /dev/null +++ b/SpeechT5/fairseq/examples/pointer_generator/pointer_generator_src/transformer_pg.py @@ -0,0 +1,518 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from typing import Any, Dict, Optional, List, Tuple + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.models import register_model, register_model_architecture +from fairseq.models.transformer import ( + DEFAULT_MAX_SOURCE_POSITIONS, + DEFAULT_MAX_TARGET_POSITIONS, + TransformerDecoder, + TransformerEncoder, + TransformerModel, + base_architecture, +) +from torch import Tensor + + +logger = logging.getLogger(__name__) + + +@register_model("transformer_pointer_generator") +class TransformerPointerGeneratorModel(TransformerModel): + """ + Transformer model from `"Attention Is All You Need" (Vaswani et al, 2017) + <https://arxiv.org/abs/1706.03762>`_, augmented with a pointer-generator + network from `"Get To The Point: Summarization with Pointer-Generator + Networks" (See et al, 2017) <https://arxiv.org/abs/1704.04368>`_. + + Args: + encoder (TransformerPointerGeneratorEncoder): the encoder + decoder (TransformerPointerGeneratorDecoder): the decoder + + The Transformer pointer-generator model provides the following named + architectures and command-line arguments: + + .. argparse:: + :ref: fairseq.models.transformer_pointer_generator_parser + :prog: + """ + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + TransformerModel.add_args(parser) + parser.add_argument('--alignment-heads', type=int, metavar='N', + help='number of attention heads to be used for ' + 'pointing') + parser.add_argument('--alignment-layer', type=int, metavar='I', + help='layer number to be used for pointing (0 ' + 'corresponding to the bottommost layer)') + parser.add_argument('--source-position-markers', type=int, metavar='N', + help='dictionary includes N additional items that ' + 'represent an OOV token at a particular input ' + 'position') + parser.add_argument('--force-generation', type=float, metavar='P', + default=None, + help='set the vocabulary distribution weight to P, ' + 'instead of predicting it from the input (1.0 ' + 'corresponding to generation, 0.0 to pointing)') + # fmt: on + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + if args.encoder_layers_to_keep: + args.encoder_layers = len(args.encoder_layers_to_keep.split(",")) + if args.decoder_layers_to_keep: + args.decoder_layers = len(args.decoder_layers_to_keep.split(",")) + + if getattr(args, "max_source_positions", None) is None: + args.max_source_positions = DEFAULT_MAX_SOURCE_POSITIONS + if getattr(args, "max_target_positions", None) is None: + args.max_target_positions = DEFAULT_MAX_TARGET_POSITIONS + if getattr(args, "source_position_markers", None) is None: + args.source_position_markers = args.max_source_positions + + src_dict, tgt_dict = task.source_dictionary, task.target_dictionary + if src_dict != tgt_dict: + raise ValueError("Pointer-generator requires a joined dictionary") + + def build_embedding(dictionary, embed_dim, path=None): + # The dictionary may include additional items that can be used in + # place of the normal OOV token and that all map to the same + # embedding. Using a different token for each input position allows + # one to restore the word identities from the original source text. + num_embeddings = len(dictionary) - args.source_position_markers + padding_idx = dictionary.pad() + unk_idx = dictionary.unk() + logger.info( + "dictionary indices from {0} to {1} will be mapped to {2}".format( + num_embeddings, len(dictionary) - 1, unk_idx + ) + ) + emb = Embedding(num_embeddings, embed_dim, padding_idx, unk_idx) + # if provided, load from preloaded dictionaries + if path: + embed_dict = utils.parse_embedding(path) + utils.load_embedding(embed_dict, dictionary, emb) + return emb + + if args.share_all_embeddings: + if args.encoder_embed_dim != args.decoder_embed_dim: + raise ValueError( + "--share-all-embeddings requires --encoder-embed-dim to match --decoder-embed-dim" + ) + if args.decoder_embed_path and ( + args.decoder_embed_path != args.encoder_embed_path + ): + raise ValueError( + "--share-all-embeddings not compatible with --decoder-embed-path" + ) + encoder_embed_tokens = build_embedding( + src_dict, args.encoder_embed_dim, args.encoder_embed_path + ) + decoder_embed_tokens = encoder_embed_tokens + args.share_decoder_input_output_embed = True + else: + encoder_embed_tokens = build_embedding( + src_dict, args.encoder_embed_dim, args.encoder_embed_path + ) + decoder_embed_tokens = build_embedding( + tgt_dict, args.decoder_embed_dim, args.decoder_embed_path + ) + + encoder = cls.build_encoder(args, src_dict, encoder_embed_tokens) + decoder = cls.build_decoder(args, tgt_dict, decoder_embed_tokens) + return cls(args, encoder, decoder) + + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return TransformerPointerGeneratorEncoder(args, src_dict, embed_tokens) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + return TransformerPointerGeneratorDecoder(args, tgt_dict, embed_tokens) + + +class TransformerPointerGeneratorEncoder(TransformerEncoder): + """ + Transformer encoder consisting of *args.encoder_layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. The pointer-generator variant adds + the source tokens to the encoder output as these are otherwise not passed + to the decoder. + """ + + def forward( + self, + src_tokens, + src_lengths: Optional[Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[Tensor] = None + ): + """ + Runs the `forward()` method of the parent Transformer class. Then adds + the source tokens into the encoder output tuple. + + While it might be more elegant that the model would pass the source + tokens to the `forward()` method of the decoder too, this would require + changes to `SequenceGenerator`. + + Args: + src_tokens (torch.LongTensor): tokens in the source language of + shape `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + namedtuple: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + - **src_tokens** (Tensor): input token ids of shape + `(batch, src_len)` + """ + encoder_out = self.forward_scriptable(src_tokens, + src_lengths, + return_all_hiddens, + token_embeddings) + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `forward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + return { + "encoder_out": encoder_out["encoder_out"], # T x B x C + "encoder_padding_mask": encoder_out["encoder_padding_mask"], # B x T + "encoder_embedding": encoder_out["encoder_embedding"], # B x T x C + "encoder_states": encoder_out["encoder_states"], # List[T x B x C] + "src_tokens": [src_tokens], # B x T + "src_lengths": [], + } + + +class TransformerPointerGeneratorDecoder(TransformerDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. The pointer-generator variant mixes + the output probabilities with an attention distribution in the output layer. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + """ + + def __init__(self, args, dictionary, embed_tokens): + super().__init__(args, dictionary, embed_tokens, no_encoder_attn=False) + + # In the pointer-generator model these arguments define the decoder + # layer and the number of attention heads that will be averaged to + # create the alignment for pointing. + self.alignment_heads = args.alignment_heads + self.alignment_layer = args.alignment_layer + + input_embed_dim = embed_tokens.embedding_dim + + # Generation probabilities / interpolation coefficients are predicted + # from the current decoder input embedding and the decoder output, which + # is the size of output_embed_dim. + p_gen_input_size = input_embed_dim + self.output_embed_dim + self.project_p_gens = nn.Linear(p_gen_input_size, 1) + nn.init.zeros_(self.project_p_gens.bias) + + # The dictionary may include a separate entry for an OOV token in each + # input position, so that their identity can be restored from the + # original source text. + self.num_types = len(dictionary) + self.num_oov_types = args.source_position_markers + self.num_embeddings = self.num_types - self.num_oov_types + self.force_p_gen = args.force_generation + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + alignment_layer: Optional[int] = 0, + alignment_heads: Optional[int] = 1, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention + incremental_state (dict, optional): dictionary used for storing + state during :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False) + alignment_layer (int, optional): 0-based index of the layer to be + used for pointing (default: 0) + alignment_heads (int, optional): number of attention heads to be + used for pointing (default: 1) + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + # The normal Transformer model doesn't pass the alignment_layer and + # alignment_heads parameters correctly. We use our local variables. + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + alignment_layer=self.alignment_layer, + alignment_heads=self.alignment_heads, + ) + if not features_only: + # Embedding the tokens again for generation probability prediction, + # so that we don't have to reimplement the whole extract_features() + # method. + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + prev_output_embed = self.embed_tokens(prev_output_tokens) + prev_output_embed *= self.embed_scale + predictors = torch.cat((prev_output_embed, x), 2) + p_gens = self.project_p_gens(predictors) + p_gens = torch.sigmoid(p_gens.float()) + # Torchscript complains if encoder_out or attn are None because + # `output_layer()` signature expects tensors instead + attn: Optional[Tensor] = extra["attn"][0] + assert encoder_out is not None + assert attn is not None + x = self.output_layer(x, attn, encoder_out["src_tokens"][0], p_gens) + return x, extra + + def output_layer( + self, + features: Tensor, + attn: Tensor, + src_tokens: Tensor, + p_gens: Tensor + ) -> Tensor: + """ + Project features to the vocabulary size and mix with the attention + distributions. + """ + if self.force_p_gen is not None: + p_gens = self.force_p_gen + + # project back to size of vocabulary + if self.adaptive_softmax is None: + logits = self.output_projection(features) + else: + logits = features + + batch_size = logits.shape[0] + output_length = logits.shape[1] + assert logits.shape[2] == self.num_embeddings + assert src_tokens.shape[0] == batch_size + src_length = src_tokens.shape[1] + + # The final output distribution will be a mixture of the normal output + # distribution (softmax of logits) and attention weights. + gen_dists = self.get_normalized_probs_scriptable( + (logits, None), log_probs=False, sample=None + ) + gen_dists = torch.mul(gen_dists, p_gens) + padding_size = (batch_size, output_length, self.num_oov_types) + padding = gen_dists.new_zeros(padding_size) + gen_dists = torch.cat((gen_dists, padding), 2) + assert gen_dists.shape[2] == self.num_types + + # Scatter attention distributions to distributions over the extended + # vocabulary in a tensor of shape [batch_size, output_length, + # vocab_size]. Each attention weight will be written into a location + # that is for other dimensions the same as in the index tensor, but for + # the third dimension it's the value of the index tensor (the token ID). + attn = torch.mul(attn.float(), 1 - p_gens) + index = src_tokens[:, None, :] + index = index.expand(batch_size, output_length, src_length) + attn_dists_size = (batch_size, output_length, self.num_types) + attn_dists = attn.new_zeros(attn_dists_size) + attn_dists.scatter_add_(2, index, attn.float()) + + # Final distributions, [batch_size, output_length, num_types]. + return gen_dists + attn_dists + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + """ + Get normalized probabilities (or log probs) from a net's output. + Pointer-generator network output is already normalized. + """ + probs = net_output[0] + # Make sure the probabilities are greater than zero when returning log + # probabilities. + return probs.clamp(1e-10, 1.0).log() if log_probs else probs + + +class Embedding(nn.Embedding): + r"""A simple lookup table that stores embeddings of a fixed dictionary and size. + This module is often used to store word embeddings and retrieve them using indices. + The input to the module is a list of indices, and the output is the corresponding + word embeddings. This subclass differs from the standard PyTorch Embedding class by + allowing additional vocabulary entries that will be mapped to the unknown token + embedding. + Args: + num_embeddings (int): size of the dictionary of embeddings + embedding_dim (int): the size of each embedding vector + padding_idx (int): Pads the output with the embedding vector at :attr:`padding_idx` + (initialized to zeros) whenever it encounters the index. + unk_idx (int): Maps all token indices that are greater than or equal to + num_embeddings to this index. + Attributes: + weight (Tensor): the learnable weights of the module of shape (num_embeddings, embedding_dim) + initialized from :math:`\mathcal{N}(0, 1)` + Shape: + - Input: :math:`(*)`, LongTensor of arbitrary shape containing the indices to extract + - Output: :math:`(*, H)`, where `*` is the input shape and :math:`H=\text{embedding\_dim}` + .. note:: + Keep in mind that only a limited number of optimizers support + sparse gradients: currently it's :class:`optim.SGD` (`CUDA` and `CPU`), + :class:`optim.SparseAdam` (`CUDA` and `CPU`) and :class:`optim.Adagrad` (`CPU`) + .. note:: + With :attr:`padding_idx` set, the embedding vector at + :attr:`padding_idx` is initialized to all zeros. However, note that this + vector can be modified afterwards, e.g., using a customized + initialization method, and thus changing the vector used to pad the + output. The gradient for this vector from :class:`~torch.nn.Embedding` + is always zero. + """ + __constants__ = ["unk_idx"] + + # Torchscript: Inheriting from Embedding class produces an error when exporting to Torchscript + # -> RuntimeError: Unable to cast Python instance to C++ type (compile in debug mode for details + # It's happening because max_norm attribute from nn.Embedding is None by default and it cannot be + # cast to a C++ type + def __init__( + self, + num_embeddings: int, + embedding_dim: int, + padding_idx: Optional[int], + unk_idx: int, + max_norm: Optional[float] = float("inf"), + ): + super().__init__(num_embeddings, embedding_dim, padding_idx=padding_idx, max_norm=max_norm) + self.unk_idx = unk_idx + nn.init.normal_(self.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(self.weight[padding_idx], 0) + + def forward(self, input): + input = torch.where( + input >= self.num_embeddings, torch.ones_like(input) * self.unk_idx, input + ) + return nn.functional.embedding( + input, self.weight, self.padding_idx, self.max_norm, + self.norm_type, self.scale_grad_by_freq, self.sparse + ) + + +@register_model_architecture( + "transformer_pointer_generator", "transformer_pointer_generator" +) +def transformer_pointer_generator(args): + args.alignment_heads = getattr(args, "alignment_heads", 1) + args.alignment_layer = getattr(args, "alignment_layer", -1) + base_architecture(args) + if args.alignment_layer < 0: + args.alignment_layer = args.decoder_layers + args.alignment_layer + + +@register_model_architecture( + "transformer_pointer_generator", "transformer_pointer_generator_iwslt_de_en" +) +def transformer_pointer_generator_iwslt_de_en(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 1024) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 1024) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4) + args.decoder_layers = getattr(args, "decoder_layers", 6) + transformer_pointer_generator(args) + + +@register_model_architecture( + "transformer_pointer_generator", "transformer_pointer_generator_wmt_en_de" +) +def transformer_pointer_generator_wmt_en_de(args): + transformer_pointer_generator(args) + + +# Transformer pointer-generator with the base Transformer parameters as used in +# the "Attention Is All You Need" paper (Vaswani et al., 2017) +@register_model_architecture( + "transformer_pointer_generator", + "transformer_pointer_generator_vaswani_wmt_en_de_big", +) +def transformer_pointer_generator_vaswani_wmt_en_de_big(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.3) + transformer_pointer_generator(args) + + +@register_model_architecture( + "transformer_pointer_generator", + "transformer_pointer_generator_vaswani_wmt_en_fr_big", +) +def transformer_pointer_generator_vaswani_wmt_en_fr_big(args): + args.dropout = getattr(args, "dropout", 0.1) + transformer_pointer_generator_vaswani_wmt_en_de_big(args) + + +@register_model_architecture( + "transformer_pointer_generator", "transformer_pointer_generator_wmt_en_de_big" +) +def transformer_pointer_generator_wmt_en_de_big(args): + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + transformer_pointer_generator_vaswani_wmt_en_de_big(args) + + +# default parameters used in tensor2tensor implementation +@register_model_architecture( + "transformer_pointer_generator", "transformer_pointer_generator_wmt_en_de_big_t2t" +) +def transformer_pointer_generator_wmt_en_de_big_t2t(args): + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", True) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", True) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_dropout = getattr(args, "activation_dropout", 0.1) + transformer_pointer_generator_vaswani_wmt_en_de_big(args) diff --git a/SpeechT5/fairseq/examples/pointer_generator/postprocess.py b/SpeechT5/fairseq/examples/pointer_generator/postprocess.py new file mode 100644 index 0000000..b213aed --- /dev/null +++ b/SpeechT5/fairseq/examples/pointer_generator/postprocess.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import re +import sys + + +class OOVIndexError(IndexError): + def __init__(self, pos, source_seq, target_seq): + super(OOVIndexError, self).__init__( + "A <unk-N> tag in the target sequence refers to a position that is " + "outside the source sequence. Most likely there was a mismatch in " + "provided source and target sequences. Otherwise this would mean that " + "the pointing mechanism somehow attended to a position that is past " + "the actual sequence end." + ) + self.source_pos = pos + self.source_seq = source_seq + self.target_seq = target_seq + + +def replace_oovs(source_in, target_in, target_out): + """Replaces <unk-N> tokens in the target text with the corresponding word in + the source text. + """ + + oov_re = re.compile("^<unk-([0-9]+)>$") + + for source_seq, target_seq in zip(source_in, target_in): + target_seq_out = [] + + pos_to_word = source_seq.strip().split() + for token in target_seq.strip().split(): + m = oov_re.match(token) + if m: + pos = int(m.group(1)) + if pos >= len(pos_to_word): + raise OOVIndexError(pos, source_seq, target_seq) + token_out = pos_to_word[pos] + else: + token_out = token + target_seq_out.append(token_out) + target_out.write(" ".join(target_seq_out) + "\n") + + +def main(): + parser = argparse.ArgumentParser( + description="Replaces <unk-N> tokens in target sequences with words from " + "the corresponding position in the source sequence." + ) + parser.add_argument( + "--source", type=str, help="text file with source sequences", required=True + ) + parser.add_argument( + "--target", type=str, help="text file with target sequences", required=True + ) + parser.add_argument( + "--target-out", + type=str, + help="where to write target sequences without <unk-N> " "entries", + required=True, + ) + args = parser.parse_args() + + target_in = ( + open(args.target, "r", encoding="utf-8") if args.target is not None else None + ) + target_out = ( + open(args.target_out, "w", encoding="utf-8") + if args.target_out is not None + else None + ) + with open(args.source, "r", encoding="utf-8") as source_in, open( + args.target, "r", encoding="utf-8" + ) as target_in, open(args.target_out, "w", encoding="utf-8") as target_out: + replace_oovs(source_in, target_in, target_out) + + +if __name__ == "__main__": + try: + main() + except OOVIndexError as e: + print(e, file=sys.stderr) + print("Source sequence:", e.source_seq.strip(), file=sys.stderr) + print("Target sequence:", e.target_seq.strip(), file=sys.stderr) + print( + "Source sequence length:", + len(e.source_seq.strip().split()), + file=sys.stderr, + ) + print("The offending tag points to:", e.source_pos) + sys.exit(2) diff --git a/SpeechT5/fairseq/examples/pointer_generator/preprocess.py b/SpeechT5/fairseq/examples/pointer_generator/preprocess.py new file mode 100644 index 0000000..f72ca7d --- /dev/null +++ b/SpeechT5/fairseq/examples/pointer_generator/preprocess.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +from itertools import zip_longest + + +def replace_oovs(source_in, target_in, vocabulary, source_out, target_out): + """Replaces out-of-vocabulary words in source and target text with <unk-N>, + where N in is the position of the word in the source sequence. + """ + + def format_unk(pos): + return "<unk-{}>".format(pos) + + if target_in is None: + target_in = [] + + for seq_num, (source_seq, target_seq) in enumerate( + zip_longest(source_in, target_in) + ): + source_seq_out = [] + target_seq_out = [] + + word_to_pos = dict() + for position, token in enumerate(source_seq.strip().split()): + if token in vocabulary: + token_out = token + else: + if token in word_to_pos: + oov_pos = word_to_pos[token] + else: + word_to_pos[token] = position + oov_pos = position + token_out = format_unk(oov_pos) + source_seq_out.append(token_out) + source_out.write(" ".join(source_seq_out) + "\n") + + if target_seq is not None: + for token in target_seq.strip().split(): + if token in word_to_pos: + token_out = format_unk(word_to_pos[token]) + else: + token_out = token + target_seq_out.append(token_out) + if target_out is not None: + target_out.write(" ".join(target_seq_out) + "\n") + + +def main(): + parser = argparse.ArgumentParser( + description="Replaces out-of-vocabulary words in both source and target " + "sequences with tokens that indicate the position of the word " + "in the source sequence." + ) + parser.add_argument( + "--source", type=str, help="text file with source sequences", required=True + ) + parser.add_argument( + "--target", type=str, help="text file with target sequences", default=None + ) + parser.add_argument("--vocab", type=str, help="vocabulary file", required=True) + parser.add_argument( + "--source-out", + type=str, + help="where to write source sequences with <unk-N> entries", + required=True, + ) + parser.add_argument( + "--target-out", + type=str, + help="where to write target sequences with <unk-N> entries", + default=None, + ) + args = parser.parse_args() + + with open(args.vocab, encoding="utf-8") as vocab: + vocabulary = vocab.read().splitlines() + + target_in = ( + open(args.target, "r", encoding="utf-8") if args.target is not None else None + ) + target_out = ( + open(args.target_out, "w", encoding="utf-8") + if args.target_out is not None + else None + ) + with open(args.source, "r", encoding="utf-8") as source_in, open( + args.source_out, "w", encoding="utf-8" + ) as source_out: + replace_oovs(source_in, target_in, vocabulary, source_out, target_out) + if target_in is not None: + target_in.close() + if target_out is not None: + target_out.close() + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/quant_noise/README.md b/SpeechT5/fairseq/examples/quant_noise/README.md new file mode 100644 index 0000000..539c3d5 --- /dev/null +++ b/SpeechT5/fairseq/examples/quant_noise/README.md @@ -0,0 +1,298 @@ +# Training with Quantization Noise for Extreme Model Compression ({Fan\*, Stock\*} *et al.*, 2020) +This page contains information for how to train and quantize models with Quantization Noise, for both scalar quantization like `int8` and Iterative Product Quantization. +Check out our paper [here](https://arxiv.org/abs/2004.07320). + +Looking for pretrained models? They will be added shortly. +Looking for code to train vision models? We are working on open sourcing our code as part of ClassyVision. Please check back, but note that both the Scalar and Iterative Product Quantization counterparts of the `nn.Conv2d` module are already included in this release. + +**Contents**: +- [Walk through of code](#walk-through-the-code) +- [Reproduce NLP Results](#looking-to-reproduce-the-nlp-results-in-the-paper) +- [Reproduce Vision Results](#looking-to-reproduce-the-vision-results-in-the-paper) + + +## Citation +```bibtex +@article{fan2020training, + title={Training with Quantization Noise for Extreme Model Compression}, + author={Angela Fan* and Pierre Stock* and and Benjamin Graham and Edouard Grave and Remi Gribonval and Herve Jegou and Armand Joulin}, + year={2020}, + eprint={2004.07320}, + archivePrefix={arXiv}, + primaryClass={cs.ML} +} +``` + +## Walk through the code + +Training a model with Quant-Noise improves the performance in subsequent inference-time quantization by training models to be robust to quantization. This technique is useful for both scalar and product quantization methods, as well as multiple domains. We detail below our approach to train, quantize models and integrate our code to quantize your favorite models. + +### Scalar Quantization + +Unlike the section [Iterative Product Quantization](#iterative-product-quantization) which gives state-of-the-art compression, this section showcases the usefulness of our approach for simple scalar quantization baselines such as int8 using on-GPU Fake Quantization. + +#### Training + +Scalar quantization with Quant-Noise consists in randomly quantizing a proportion `p` of the weights during training. Scalar quantization is implemented [here](https://github.com/pytorch/fairseq/tree/master/fairseq/modules/quantization/scalar) under the form of Fake Quantization, meaning that we emulate int8 on GPU by quantizing and de-quantizing both the weights and the activations. We rely on PyTorch's [quantization primitives](https://github.com/pytorch/pytorch/tree/master/torch/quantization). + +To train a model with Quant-Noise, add the following flag: +``` +--quant-noise-scalar 0.5 +``` +Large values of noise make the network easier to quantize but may result in higher non-quantized test and validation perplexities. + +#### Quantization + +When evaluating a network, all quantized modules and activation hooks automatically switch to `p=1` so the validation accuracy reported by Fairseq is actually the quantized one, nothing more to do. + + +#### Integration with your own code + +Looking to quantize your own models with Quant-Noise + Scalar Quantization? +- Use the function `quantize_model_` implemented [here](https://github.com/pytorch/fairseq/tree/master/fairseq/modules/quantization/scalar/utils.py) to (1) replace all your modules by their quantized counterparts and (2) add hooks to those modules to quantize the activations. +- Then, perform your training as usual. Note that in `eval()` mode, the network is always fully quantized (weights and activations) by default (`p=1`). + + + +### Iterative Product Quantization + + +Iterative Product Quantization with Quant-Noise proceeds in two steps. First, a model must be trained uncompressed with Quant-Noise. Second, the model must be quantized with iPQ. Note that we implement here the simplest form of noise, which consists in randomly dropping a proportion `p` of blocks, and that worked as well as assigning those blocks to their current centroid. + +#### Training + +To train a model with Quant-Noise, add the following flags: +``` +--quant-noise-pq 0.1 --quant-noise-pq-block-size 8 +``` +`quant-noise-pq` controls how much dropout is applied to the blocks of the weight matrix. `quant-noise-pq-block-size` controls the size of the weight matrix blocks. +We recommend training with 0.05 to 0.2 Quant-Noise, a value that worked well in our experiments. For the block-size, we recommend training with block-size of 8. Note that the block size must be a multiple of `input_features`, see the size checks [here](https://github.com/pytorch/fairseq/tree/master/fairseq/modules/quant_noise.py). Large block sizes result in higher compression ratio but may induce a loss in accuracy. + +We currently support training Transformer based models, such as sequence-to-sequence, language models, and BERT architectures. The `quant_noise` function [here](https://github.com/pytorch/fairseq/tree/master/fairseq/modules/quant_noise.py) wraps a module. It splits a weight matrix into blocks and applies random dropout to these blocks. +In the Transformer architectures, quant-noise is applied to the input and output embeddings, the attention, and the FFN. + +Quant-Noise can also be combined with **LayerDrop** (see [here](https://github.com/pytorch/fairseq/tree/master/examples/layerdrop)) to add its pruning effect to the quantized model and make the model even smaller. We recommend training with LayerDrop 0.1 or 0.2. + +#### Quantization + +We implement an improved version of product quantization from Stock et al, **iPQ**, described [here](https://arxiv.org/abs/1907.05686), see code with old API [here](https://github.com/facebookresearch/kill-the-bits). Note that we improved the iPQ API in terms of both compute speed and usability as described below. + +For the particular case of PQ, quantization is made sequentially. We recommend first quantizing the FFNs, then the EMBs, and finally the ATTNs. Quantization is done in two sub-steps: +- First, perform `n` steps of Product Quantization (generally `n=20` is enough). +- Then, finetune the obtained centroids. + +#### Integration with your own code + +Looking to quantize your own models with Quant-Noise + iPQ? +- First wrap your modules with the `quant_noise` function [here](https://github.com/pytorch/fairseq/tree/master/fairseq/modules/quant_noise.py), which is module-agnostic and train your favorite model. +- Then, quantize your trained model using the code [here](https://github.com/pytorch/fairseq/tree/master/fairseq/modules/quantization/pq). This can be done *without any changes to your training loop*. Below is an example code for integration. +Note that we tried our approach only on Transformers and various Convolutional Models such as EfficientNets. + +```python +from fairseq.modules.quantization.pq import quantize_model_, SizeTracker + +# get configuration parameters +n_centroids_config = config["n_centroids"] +block_sizes_config = config["block_sizes"] +layers_to_quantize = config["layers_to_quantize"] + +# size tracker for keeping track of assignments, centroids and non-compressed sizes +size_tracker = SizeTracker(model) + +# Quantize model by stages +for step in range(len(layers_to_quantize)): + + # quantize model in-place + quantized_layers = quantize_model_( + model, + size_tracker, + layers_to_quantize, + block_sizes_config, + n_centroids_config, + step=step, + ) + logger.info(f"Finetuning stage {step}, quantized layers: {quantized_layers}") + logger.info(f"{size_tracker}") + + # Don't forget to re-create/update trainer/optimizer since model parameters have changed + optimizer = ... + + # Finetune the centroids with your usual training loop for a few epochs + trainer.train_epoch() +``` + + +## Looking to reproduce the NLP results in the paper? + +We detail below how to reproduce the state-of-the-art results in reported in the paper for Quant-Noise + Iterative Product Quantization. + +### Training with Quant-Noise + +To **train** RoBERTa + QuantNoise, we followed this setting [here](https://github.com/pytorch/fairseq/tree/master/examples/roberta). +The following command can be used to train a RoBERTa Base + QuantNoise model: + +```bash +TOTAL_UPDATES=125000 +WARMUP_UPDATES=10000 +PEAK_LR=0.0005 +TOKENS_PER_SAMPLE=512 +MAX_POSITIONS=512 +MAX_SENTENCES=16 +UPDATE_FREQ=2 +DATA_DIR=/path/to/data/here + +fairseq-train $DATA_DIR \ + --task masked_lm --criterion masked_lm --arch roberta_base \ + --sample-break-mode complete \ + --tokens-per-sample $TOKENS_PER_SAMPLE --max-positions $MAX_POSITIONS \ + --optimizer adam --adam-betas '(0.9, 0.98)' --adam-eps 1e-6 \ + --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $PEAK_LR \ + --warmup-updates $WARMUP_UPDATES --total-num-update $TOTAL_UPDATES \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.01 \ + --batch-size $MAX_SENTENCES \ + --update-freq $UPDATE_FREQ --max-update $TOTAL_UPDATES \ + --save-dir checkpoint/roberta \ + --ddp-backend legacy_ddp --encoder-layerdrop 0.2 \ + --quant-noise-pq 0.2 --quant-noise-pq-block-size 8 --untie-weights-roberta +``` + +To **finetune** RoBERTa + QuantNoise, we followed this setting [here](https://github.com/pytorch/fairseq/blob/master/examples/roberta/README.glue.md). +The following command can be used to finetune a RoBERTa Base + QuantNoise model on the RTE dataset: + +```bash +TOTAL_NUM_UPDATES=2036 +WARMUP_UPDATES=122 +LR=2e-05 +NUM_CLASSES=2 +MAX_SENTENCES=16 +ROBERTA_PATH=/path/to/roberta_quantnoise/model.pt + +fairseq-train /path/to/rte/data/ \ + --restore-file $ROBERTA_PATH \ + --max-positions 512 \ + --batch-size $MAX_SENTENCES \ + --max-tokens 4400 \ + --task sentence_prediction \ + --reset-optimizer --reset-dataloader --reset-meters \ + --required-batch-size-multiple 1 \ + --init-token 0 --separator-token 2 \ + --arch roberta_large \ + --criterion sentence_prediction \ + --num-classes $NUM_CLASSES \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.1 --optimizer adam --adam-betas "(0.9, 0.98)" --adam-eps 1e-06 \ + --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $LR --total-num-update $TOTAL_NUM_UPDATES --warmup-updates $WARMUP_UPDATES \ + --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ + --max-epoch 10 \ + --find-unused-parameters \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + --ddp-backend legacy_ddp \ + --quant-noise-pq 0.2 --quant-noise-pq-block-size 8 +``` + +To **train** Language Models on Wikitext-103, we followed this setting [here](https://github.com/pytorch/fairseq/tree/master/examples/language_model). +The following command can be used to train a Transformer + QuantNoise model on Wikitext-103: + +```bash +fairseq-train --task language_modeling /path/to/wikitext-103/data \ + --save-dir checkpoints/transformer_wikitext-103 \ + --adaptive-input --adaptive-input-cutoff 20000,60000 --adaptive-input-factor 4 \ + --adaptive-softmax-cutoff 20000,60000 --adaptive-softmax-dropout 0.2 --adaptive-softmax-factor 4.0 \ + --tie-adaptive-proj --tie-adaptive-weights \ + --arch transformer_lm_gbw \ + --attention-dropout 0.1 --dropout 0.2 --relu-dropout 0.1 \ + --clip-norm 0.1 --criterion adaptive_loss \ + --ddp-backend legacy_ddp \ + --decoder-attention-heads 8 --decoder-embed-dim 1024 --decoder-ffn-embed-dim 4096 --decoder-input-dim 1024 \ + --decoder-layers 16 --decoder-normalize-before --decoder-output-dim 1024 \ + --min-lr 0.0001 --lr-period-updates 270000 --lr-scheduler cosine --lr-shrink 0.75 --lr 1.0 --t-mult 2.0 \ + --max-tokens 3072 --tokens-per-sample 3072 --momentum 0.99 --optimizer nag \ + --sample-break-mode none --update-freq 3 \ + --warmup-init-lr 1e-07 --warmup-updates 16000 \ + --weight-decay 0 --seed 1 --stop-min-lr 1e-09 \ + --quant-noise-pq 0.05 --quant-noise-pq-block-size 8 +``` + +To **evaluate** this model, note you need to use the `eval.py` script. The following command can be used to evaluate: + +```bash +fairseq-eval-lm /path/to/wikitext-103/data --path /path/to/model/checkpoint \ + --sample-break-mode complete \ + --max-tokens 3072 \ + --context-window 2560 \ + --softmax-batch 1024 \ + --gen-subset valid +``` +and change the `--gen-subset` to `test` if you would like to evaluate on the test set instead. + + +### Iterative Product Quantization + +To quantize the finetuned RoBERTa model, we use this command on 1 GPU. This should run in a day. +```bash +TOTAL_NUM_UPDATES=6108 # 2036 updates for each iteration +WARMUP_UPDATES=122 +LR=2e-05 +NUM_CLASSES=2 +MAX_SENTENCES=16 +fairseq-train --task sentence_prediction /path/to/data/ \ + --restore-file $ROBERTA_PATH \ + --save-dir checkpoints/roberta_finetuned \ + --max-positions 512 \ + --batch-size $MAX_SENTENCES \ + --max-tokens 4400 \ + --init-token 0 --separator-token 2 \ + --arch roberta_large \ + --criterion sentence_prediction \ + --num-classes $NUM_CLASSES \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.1 --optimizer adam --adam-betas "(0.9, 0.98)" --adam-eps 1e-06 \ + --clip-norm 0.0 --lr-scheduler polynomial_decay \ + --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ + --no-progress-bar --skip-invalid-size-inputs-valid-test --ddp-backend legacy_ddp \ + --quantization-config-path /path/to/config/yaml +``` + +To quantize the trained Language Model, we use this command on 8 V100 23GB GPUs. This should run in a couple of hours. +```bash +fairseq-train --task language_modeling /path/to/wikitext-103/data \ + --save-dir checkpoints/transformer_wikitext-103 \ + --adaptive-input --adaptive-input-cutoff 20000,60000 --adaptive-input-factor 4 \ + --adaptive-softmax-cutoff 20000,60000 --adaptive-softmax-dropout 0.2 --adaptive-softmax-factor 4.0 \ + --arch transformer_lm_gbw \ + --attention-dropout 0.1 --dropout 0.2 --relu-dropout 0.1 \ + --bucket-cap-mb 25 --char-embedder-highway-layers 2 --character-embedding-dim 4 \ + --clip-norm 0.1 --criterion adaptive_loss \ + --ddp-backend legacy_ddp \ + --decoder-attention-heads 8 --decoder-embed-dim 1024 --decoder-ffn-embed-dim 4096 --decoder-input-dim 1024 --decoder-layers 16 --decoder-normalize-before --decoder-output-dim 1024 \ + --fp16 --keep-last-epochs -1 \ + --min-lr 0.0001 --lr-period-updates 270000 --lr-scheduler cosine --lr-shrink 0.75 --lr 0.05 --stop-min-lr 1e-09 \ + --max-tokens 2944 --tokens-per-sample 2944\ + --momentum 0.99 --no-epoch-checkpoints --no-progress-bar --optimizer nag --required-batch-size-multiple 8 \ + --sample-break-mode none --t-mult 2.0 --skip-invalid-size-inputs-valid-test \ + --tie-adaptive-proj --tie-adaptive-weights --update-freq 3 --weight-decay 0 --seed 1 \ + --log-interval 100 --no-progress-bar --skip-invalid-size-inputs-valid-test \ + --restore-file path/to/trained/lm/with/quant/noise \ + --max-update 13500 --quantization-config-path /path/to/config/yaml +``` +If you have less capacity or if your distributed training freezes, try reducing `--max-tokens` and `--tokens-per-sample` (this may reduce the quantized accuracy a bit). + +### Remarks + +We try to keep the open-sourced code as readable and as easy-to-plug as possible. Therefore, we did not test it for the following cases: +- Scalar quantization with RoBERTa. +- Quantization with iPQ and `int8` combined. + +If you have trouble adapting it, we will be more than happy to help! + +## Looking to reproduce the Vision results in the paper? + +We are working on open sourcing our code as part of ClassyVision. Please check back. + + +## Having an issue or have a question? + +Please open an issue in this repository with the details of your question. Thanks! diff --git a/SpeechT5/fairseq/examples/quant_noise/transformer_quantization_config.yaml b/SpeechT5/fairseq/examples/quant_noise/transformer_quantization_config.yaml new file mode 100644 index 0000000..d4be14a --- /dev/null +++ b/SpeechT5/fairseq/examples/quant_noise/transformer_quantization_config.yaml @@ -0,0 +1,33 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +# This file defines example configuration arguments for quantizing +# a transformer model with product quantization + +# Number of Centroids for Product Quantization, by default 256 (byte-aligned) +n_centroids: + Linear: + key: in_features + value: {"*": 256} + Embedding: + key: embedding_dim + value: {"*": 256} + +# Block Sizes for Product Quantization +# We suggest: 8 for FFN, 4 for ATTN, 4 for embedding projections, 8 for embeddings +block_sizes: + Linear: + key: fuzzy_name + value: {fc: 8, attn: 4, emb: 4} + Embedding: + key: fuzzy_name + value: {emb: 8} + +# Layers to Quantize Sequentially +# We suggest: first FFN, then EMB, then ATTN +layers_to_quantize: + - decoder\\.layers\\.\d+\\.fc[12] + - decoder\\.embed_tokens\\.embeddings\\.[012]\\.[01] + - decoder\\.layers\\.\d+\\.self_attn\\.(k_proj|v_proj|q_proj|out_proj) diff --git a/SpeechT5/fairseq/examples/roberta/README.custom_classification.md b/SpeechT5/fairseq/examples/roberta/README.custom_classification.md new file mode 100644 index 0000000..7254bb7 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/README.custom_classification.md @@ -0,0 +1,168 @@ +# Finetuning RoBERTa on a custom classification task + +This example shows how to finetune RoBERTa on the IMDB dataset, but should illustrate the process for most classification tasks. + +### 1) Get the data + +```bash +wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz +tar zxvf aclImdb_v1.tar.gz +``` + + +### 2) Format data + +`IMDB` data has one data-sample in each file, below python code-snippet converts it one file for train and valid each for ease of processing. +```python +import argparse +import os +import random +from glob import glob + +random.seed(0) + +def main(args): + for split in ['train', 'test']: + samples = [] + for class_label in ['pos', 'neg']: + fnames = glob(os.path.join(args.datadir, split, class_label) + '/*.txt') + for fname in fnames: + with open(fname) as fin: + line = fin.readline() + samples.append((line, 1 if class_label == 'pos' else 0)) + random.shuffle(samples) + out_fname = 'train' if split == 'train' else 'dev' + f1 = open(os.path.join(args.datadir, out_fname + '.input0'), 'w') + f2 = open(os.path.join(args.datadir, out_fname + '.label'), 'w') + for sample in samples: + f1.write(sample[0] + '\n') + f2.write(str(sample[1]) + '\n') + f1.close() + f2.close() + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--datadir', default='aclImdb') + args = parser.parse_args() + main(args) +``` + + +### 3) BPE encode + +Run `multiprocessing_bpe_encoder`, you can also do this in previous step for each sample but that might be slower. +```bash +# Download encoder.json and vocab.bpe +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe' + +for SPLIT in train dev; do + python -m examples.roberta.multiprocessing_bpe_encoder \ + --encoder-json encoder.json \ + --vocab-bpe vocab.bpe \ + --inputs "aclImdb/$SPLIT.input0" \ + --outputs "aclImdb/$SPLIT.input0.bpe" \ + --workers 60 \ + --keep-empty +done +``` + + +### 4) Preprocess data + +```bash +# Download fairseq dictionary. +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt' + +fairseq-preprocess \ + --only-source \ + --trainpref "aclImdb/train.input0.bpe" \ + --validpref "aclImdb/dev.input0.bpe" \ + --destdir "IMDB-bin/input0" \ + --workers 60 \ + --srcdict dict.txt + +fairseq-preprocess \ + --only-source \ + --trainpref "aclImdb/train.label" \ + --validpref "aclImdb/dev.label" \ + --destdir "IMDB-bin/label" \ + --workers 60 + +``` + + +### 5) Run training + +```bash +TOTAL_NUM_UPDATES=7812 # 10 epochs through IMDB for bsz 32 +WARMUP_UPDATES=469 # 6 percent of the number of updates +LR=1e-05 # Peak LR for polynomial LR scheduler. +HEAD_NAME=imdb_head # Custom name for the classification head. +NUM_CLASSES=2 # Number of classes for the classification task. +MAX_SENTENCES=8 # Batch size. +ROBERTA_PATH=/path/to/roberta.large/model.pt + +CUDA_VISIBLE_DEVICES=0 fairseq-train IMDB-bin/ \ + --restore-file $ROBERTA_PATH \ + --max-positions 512 \ + --batch-size $MAX_SENTENCES \ + --max-tokens 4400 \ + --task sentence_prediction \ + --reset-optimizer --reset-dataloader --reset-meters \ + --required-batch-size-multiple 1 \ + --init-token 0 --separator-token 2 \ + --arch roberta_large \ + --criterion sentence_prediction \ + --classification-head-name $HEAD_NAME \ + --num-classes $NUM_CLASSES \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.1 --optimizer adam --adam-betas "(0.9, 0.98)" --adam-eps 1e-06 \ + --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $LR --total-num-update $TOTAL_NUM_UPDATES --warmup-updates $WARMUP_UPDATES \ + --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ + --max-epoch 10 \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + --shorten-method "truncate" \ + --find-unused-parameters \ + --update-freq 4 +``` + +The above command will finetune RoBERTa-large with an effective batch-size of 32 +sentences (`--batch-size=8 --update-freq=4`). The expected +`best-validation-accuracy` after 10 epochs is ~96.5%. + +If you run out of GPU memory, try decreasing `--batch-size` and increase +`--update-freq` to compensate. + + +### 6) Load model using hub interface + +Now we can load the trained model checkpoint using the RoBERTa hub interface. + +Assuming your checkpoints are stored in `checkpoints/`: +```python +from fairseq.models.roberta import RobertaModel +roberta = RobertaModel.from_pretrained( + 'checkpoints', + checkpoint_file='checkpoint_best.pt', + data_name_or_path='IMDB-bin' +) +roberta.eval() # disable dropout +``` + +Finally you can make predictions using the `imdb_head` (or whatever you set +`--classification-head-name` to during training): +```python +label_fn = lambda label: roberta.task.label_dictionary.string( + [label + roberta.task.label_dictionary.nspecial] +) + +tokens = roberta.encode('Best movie this year') +pred = label_fn(roberta.predict('imdb_head', tokens).argmax().item()) +assert pred == '1' # positive + +tokens = roberta.encode('Worst movie ever') +pred = label_fn(roberta.predict('imdb_head', tokens).argmax().item()) +assert pred == '0' # negative +``` diff --git a/SpeechT5/fairseq/examples/roberta/README.glue.md b/SpeechT5/fairseq/examples/roberta/README.glue.md new file mode 100644 index 0000000..77015d2 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/README.glue.md @@ -0,0 +1,99 @@ +# Finetuning RoBERTa on GLUE tasks + +### 1) Download the data from GLUE website (https://gluebenchmark.com/tasks) using following commands: +```bash +wget https://gist.githubusercontent.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e/raw/17b8dd0d724281ed7c3b2aeeda662b92809aadd5/download_glue_data.py +python download_glue_data.py --data_dir glue_data --tasks all +``` + +### 2) Preprocess GLUE task data: +```bash +./examples/roberta/preprocess_GLUE_tasks.sh glue_data <glue_task_name> +``` +`glue_task_name` is one of the following: +`{ALL, QQP, MNLI, QNLI, MRPC, RTE, STS-B, SST-2, CoLA}` +Use `ALL` for preprocessing all the glue tasks. + +### 3) Fine-tuning on GLUE task: +Example fine-tuning cmd for `RTE` task +```bash +TOTAL_NUM_UPDATES=2036 # 10 epochs through RTE for bsz 16 +WARMUP_UPDATES=122 # 6 percent of the number of updates +LR=2e-05 # Peak LR for polynomial LR scheduler. +NUM_CLASSES=2 +MAX_SENTENCES=16 # Batch size. +ROBERTA_PATH=/path/to/roberta/model.pt + +CUDA_VISIBLE_DEVICES=0 fairseq-train RTE-bin/ \ + --restore-file $ROBERTA_PATH \ + --max-positions 512 \ + --batch-size $MAX_SENTENCES \ + --max-tokens 4400 \ + --task sentence_prediction \ + --reset-optimizer --reset-dataloader --reset-meters \ + --required-batch-size-multiple 1 \ + --init-token 0 --separator-token 2 \ + --arch roberta_large \ + --criterion sentence_prediction \ + --num-classes $NUM_CLASSES \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.1 --optimizer adam --adam-betas "(0.9, 0.98)" --adam-eps 1e-06 \ + --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $LR --total-num-update $TOTAL_NUM_UPDATES --warmup-updates $WARMUP_UPDATES \ + --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ + --max-epoch 10 \ + --find-unused-parameters \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric; +``` + +For each of the GLUE task, you will need to use following cmd-line arguments: + +Model | MNLI | QNLI | QQP | RTE | SST-2 | MRPC | CoLA | STS-B +---|---|---|---|---|---|---|---|--- +`--num-classes` | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 +`--lr` | 1e-5 | 1e-5 | 1e-5 | 2e-5 | 1e-5 | 1e-5 | 1e-5 | 2e-5 +`--batch-size` | 32 | 32 | 32 | 16 | 32 | 16 | 16 | 16 +`--total-num-update` | 123873 | 33112 | 113272 | 2036 | 20935 | 2296 | 5336 | 3598 +`--warmup-updates` | 7432 | 1986 | 28318 | 122 | 1256 | 137 | 320 | 214 + +For `STS-B` additionally add `--regression-target --best-checkpoint-metric loss` and remove `--maximize-best-checkpoint-metric`. + +**Note:** + +a) `--total-num-updates` is used by `--polynomial_decay` scheduler and is calculated for `--max-epoch=10` and `--batch-size=16/32` depending on the task. + +b) Above cmd-args and hyperparams are tested on one Nvidia `V100` GPU with `32gb` of memory for each task. Depending on the GPU memory resources available to you, you can use increase `--update-freq` and reduce `--batch-size`. + +c) All the settings in above table are suggested settings based on our hyperparam search within a fixed search space (for careful comparison across models). You might be able to find better metrics with wider hyperparam search. + +### Inference on GLUE task +After training the model as mentioned in previous step, you can perform inference with checkpoints in `checkpoints/` directory using following python code snippet: + +```python +from fairseq.models.roberta import RobertaModel + +roberta = RobertaModel.from_pretrained( + 'checkpoints/', + checkpoint_file='checkpoint_best.pt', + data_name_or_path='RTE-bin' +) + +label_fn = lambda label: roberta.task.label_dictionary.string( + [label + roberta.task.label_dictionary.nspecial] +) +ncorrect, nsamples = 0, 0 +roberta.cuda() +roberta.eval() +with open('glue_data/RTE/dev.tsv') as fin: + fin.readline() + for index, line in enumerate(fin): + tokens = line.strip().split('\t') + sent1, sent2, target = tokens[1], tokens[2], tokens[3] + tokens = roberta.encode(sent1, sent2) + prediction = roberta.predict('sentence_classification_head', tokens).argmax().item() + prediction_label = label_fn(prediction) + ncorrect += int(prediction_label == target) + nsamples += 1 +print('| Accuracy: ', float(ncorrect)/float(nsamples)) + +``` diff --git a/SpeechT5/fairseq/examples/roberta/README.md b/SpeechT5/fairseq/examples/roberta/README.md new file mode 100644 index 0000000..58091b2 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/README.md @@ -0,0 +1,296 @@ +# RoBERTa: A Robustly Optimized BERT Pretraining Approach + +https://arxiv.org/abs/1907.11692 + +## Introduction + +RoBERTa iterates on BERT's pretraining procedure, including training the model longer, with bigger batches over more data; removing the next sentence prediction objective; training on longer sequences; and dynamically changing the masking pattern applied to the training data. See the associated paper for more details. + +### What's New: + +- December 2020: German model (GottBERT) is available: [GottBERT](https://github.com/pytorch/fairseq/tree/master/examples/gottbert). +- January 2020: Italian model (UmBERTo) is available from Musixmatch Research: [UmBERTo](https://github.com/musixmatchresearch/umberto). +- November 2019: French model (CamemBERT) is available: [CamemBERT](https://github.com/pytorch/fairseq/tree/master/examples/camembert). +- November 2019: Multilingual encoder (XLM-RoBERTa) is available: [XLM-R](https://github.com/pytorch/fairseq/tree/master/examples/xlmr). +- September 2019: TensorFlow and TPU support via the [transformers library](https://github.com/huggingface/transformers). +- August 2019: RoBERTa is now supported in the [pytorch-transformers library](https://github.com/huggingface/pytorch-transformers). +- August 2019: Added [tutorial for finetuning on WinoGrande](https://github.com/pytorch/fairseq/tree/master/examples/roberta/wsc#roberta-training-on-winogrande-dataset). +- August 2019: Added [tutorial for pretraining RoBERTa using your own data](README.pretraining.md). + +## Pre-trained models + +Model | Description | # params | Download +---|---|---|--- +`roberta.base` | RoBERTa using the BERT-base architecture | 125M | [roberta.base.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta.base.tar.gz) +`roberta.large` | RoBERTa using the BERT-large architecture | 355M | [roberta.large.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta.large.tar.gz) +`roberta.large.mnli` | `roberta.large` finetuned on [MNLI](http://www.nyu.edu/projects/bowman/multinli) | 355M | [roberta.large.mnli.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta.large.mnli.tar.gz) +`roberta.large.wsc` | `roberta.large` finetuned on [WSC](wsc/README.md) | 355M | [roberta.large.wsc.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/roberta.large.wsc.tar.gz) + +## Results + +**[GLUE (Wang et al., 2019)](https://gluebenchmark.com/)** +_(dev set, single model, single-task finetuning)_ + +Model | MNLI | QNLI | QQP | RTE | SST-2 | MRPC | CoLA | STS-B +---|---|---|---|---|---|---|---|--- +`roberta.base` | 87.6 | 92.8 | 91.9 | 78.7 | 94.8 | 90.2 | 63.6 | 91.2 +`roberta.large` | 90.2 | 94.7 | 92.2 | 86.6 | 96.4 | 90.9 | 68.0 | 92.4 +`roberta.large.mnli` | 90.2 | - | - | - | - | - | - | - + +**[SuperGLUE (Wang et al., 2019)](https://super.gluebenchmark.com/)** +_(dev set, single model, single-task finetuning)_ + +Model | BoolQ | CB | COPA | MultiRC | RTE | WiC | WSC +---|---|---|---|---|---|---|--- +`roberta.large` | 86.9 | 98.2 | 94.0 | 85.7 | 89.5 | 75.6 | - +`roberta.large.wsc` | - | - | - | - | - | - | 91.3 + +**[SQuAD (Rajpurkar et al., 2018)](https://rajpurkar.github.io/SQuAD-explorer/)** +_(dev set, no additional data used)_ + +Model | SQuAD 1.1 EM/F1 | SQuAD 2.0 EM/F1 +---|---|--- +`roberta.large` | 88.9/94.6 | 86.5/89.4 + +**[RACE (Lai et al., 2017)](http://www.qizhexie.com/data/RACE_leaderboard.html)** +_(test set)_ + +Model | Accuracy | Middle | High +---|---|---|--- +`roberta.large` | 83.2 | 86.5 | 81.3 + +**[HellaSwag (Zellers et al., 2019)](https://rowanzellers.com/hellaswag/)** +_(test set)_ + +Model | Overall | In-domain | Zero-shot | ActivityNet | WikiHow +---|---|---|---|---|--- +`roberta.large` | 85.2 | 87.3 | 83.1 | 74.6 | 90.9 + +**[Commonsense QA (Talmor et al., 2019)](https://www.tau-nlp.org/commonsenseqa)** +_(test set)_ + +Model | Accuracy +---|--- +`roberta.large` (single model) | 72.1 +`roberta.large` (ensemble) | 72.5 + +**[Winogrande (Sakaguchi et al., 2019)](https://arxiv.org/abs/1907.10641)** +_(test set)_ + +Model | Accuracy +---|--- +`roberta.large` | 78.1 + +**[XNLI (Conneau et al., 2018)](https://arxiv.org/abs/1809.05053)** +_(TRANSLATE-TEST)_ + +Model | en | fr | es | de | el | bg | ru | tr | ar | vi | th | zh | hi | sw | ur +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +`roberta.large.mnli` | 91.3 | 82.91 | 84.27 | 81.24 | 81.74 | 83.13 | 78.28 | 76.79 | 76.64 | 74.17 | 74.05 | 77.5 | 70.9 | 66.65 | 66.81 + +## Example usage + +##### Load RoBERTa from torch.hub (PyTorch >= 1.1): +```python +import torch +roberta = torch.hub.load('pytorch/fairseq', 'roberta.large') +roberta.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Load RoBERTa (for PyTorch 1.0 or custom models): +```python +# Download roberta.large model +wget https://dl.fbaipublicfiles.com/fairseq/models/roberta.large.tar.gz +tar -xzvf roberta.large.tar.gz + +# Load the model in fairseq +from fairseq.models.roberta import RobertaModel +roberta = RobertaModel.from_pretrained('/path/to/roberta.large', checkpoint_file='model.pt') +roberta.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Apply Byte-Pair Encoding (BPE) to input text: +```python +tokens = roberta.encode('Hello world!') +assert tokens.tolist() == [0, 31414, 232, 328, 2] +roberta.decode(tokens) # 'Hello world!' +``` + +##### Extract features from RoBERTa: +```python +# Extract the last layer's features +last_layer_features = roberta.extract_features(tokens) +assert last_layer_features.size() == torch.Size([1, 5, 1024]) + +# Extract all layer's features (layer 0 is the embedding layer) +all_layers = roberta.extract_features(tokens, return_all_hiddens=True) +assert len(all_layers) == 25 +assert torch.all(all_layers[-1] == last_layer_features) +``` + +##### Use RoBERTa for sentence-pair classification tasks: +```python +# Download RoBERTa already finetuned for MNLI +roberta = torch.hub.load('pytorch/fairseq', 'roberta.large.mnli') +roberta.eval() # disable dropout for evaluation + +# Encode a pair of sentences and make a prediction +tokens = roberta.encode('Roberta is a heavily optimized version of BERT.', 'Roberta is not very optimized.') +roberta.predict('mnli', tokens).argmax() # 0: contradiction + +# Encode another pair of sentences +tokens = roberta.encode('Roberta is a heavily optimized version of BERT.', 'Roberta is based on BERT.') +roberta.predict('mnli', tokens).argmax() # 2: entailment +``` + +##### Register a new (randomly initialized) classification head: +```python +roberta.register_classification_head('new_task', num_classes=3) +logprobs = roberta.predict('new_task', tokens) # tensor([[-1.1050, -1.0672, -1.1245]], grad_fn=<LogSoftmaxBackward>) +``` + +##### Batched prediction: +```python +import torch +from fairseq.data.data_utils import collate_tokens + +roberta = torch.hub.load('pytorch/fairseq', 'roberta.large.mnli') +roberta.eval() + +batch_of_pairs = [ + ['Roberta is a heavily optimized version of BERT.', 'Roberta is not very optimized.'], + ['Roberta is a heavily optimized version of BERT.', 'Roberta is based on BERT.'], + ['potatoes are awesome.', 'I like to run.'], + ['Mars is very far from earth.', 'Mars is very close.'], +] + +batch = collate_tokens( + [roberta.encode(pair[0], pair[1]) for pair in batch_of_pairs], pad_idx=1 +) + +logprobs = roberta.predict('mnli', batch) +print(logprobs.argmax(dim=1)) +# tensor([0, 2, 1, 0]) +``` + +##### Using the GPU: +```python +roberta.cuda() +roberta.predict('new_task', tokens) # tensor([[-1.1050, -1.0672, -1.1245]], device='cuda:0', grad_fn=<LogSoftmaxBackward>) +``` + +## Advanced usage + +#### Filling masks: + +RoBERTa can be used to fill `<mask>` tokens in the input. Some examples from the +[Natural Questions dataset](https://ai.google.com/research/NaturalQuestions/): +```python +roberta.fill_mask('The first Star wars movie came out in <mask>', topk=3) +# [('The first Star wars movie came out in 1977', 0.9504708051681519, ' 1977'), ('The first Star wars movie came out in 1978', 0.009986862540245056, ' 1978'), ('The first Star wars movie came out in 1979', 0.009574787691235542, ' 1979')] + +roberta.fill_mask('Vikram samvat calender is official in <mask>', topk=3) +# [('Vikram samvat calender is official in India', 0.21878819167613983, ' India'), ('Vikram samvat calender is official in Delhi', 0.08547237515449524, ' Delhi'), ('Vikram samvat calender is official in Gujarat', 0.07556215673685074, ' Gujarat')] + +roberta.fill_mask('<mask> is the common currency of the European Union', topk=3) +# [('Euro is the common currency of the European Union', 0.9456493854522705, 'Euro'), ('euro is the common currency of the European Union', 0.025748178362846375, 'euro'), ('€ is the common currency of the European Union', 0.011183084920048714, '€')] +``` + +#### Pronoun disambiguation (Winograd Schema Challenge): + +RoBERTa can be used to disambiguate pronouns. First install spaCy and download the English-language model: +```bash +pip install spacy +python -m spacy download en_core_web_lg +``` + +Next load the `roberta.large.wsc` model and call the `disambiguate_pronoun` +function. The pronoun should be surrounded by square brackets (`[]`) and the +query referent surrounded by underscores (`_`), or left blank to return the +predicted candidate text directly: +```python +roberta = torch.hub.load('pytorch/fairseq', 'roberta.large.wsc', user_dir='examples/roberta/wsc') +roberta.cuda() # use the GPU (optional) + +roberta.disambiguate_pronoun('The _trophy_ would not fit in the brown suitcase because [it] was too big.') +# True +roberta.disambiguate_pronoun('The trophy would not fit in the brown _suitcase_ because [it] was too big.') +# False + +roberta.disambiguate_pronoun('The city councilmen refused the demonstrators a permit because [they] feared violence.') +# 'The city councilmen' +roberta.disambiguate_pronoun('The city councilmen refused the demonstrators a permit because [they] advocated violence.') +# 'demonstrators' +``` + +See the [RoBERTA Winograd Schema Challenge (WSC) README](wsc/README.md) for more details on how to train this model. + +#### Extract features aligned to words: + +By default RoBERTa outputs one feature vector per BPE token. You can instead +realign the features to match [spaCy's word-level tokenization](https://spacy.io/usage/linguistic-features#tokenization) +with the `extract_features_aligned_to_words` method. This will compute a +weighted average of the BPE-level features for each word and expose them in +spaCy's `Token.vector` attribute: +```python +doc = roberta.extract_features_aligned_to_words('I said, "hello RoBERTa."') +assert len(doc) == 10 +for tok in doc: + print('{:10}{} (...)'.format(str(tok), tok.vector[:5])) +# <s> tensor([-0.1316, -0.0386, -0.0832, -0.0477, 0.1943], grad_fn=<SliceBackward>) (...) +# I tensor([ 0.0559, 0.1541, -0.4832, 0.0880, 0.0120], grad_fn=<SliceBackward>) (...) +# said tensor([-0.1565, -0.0069, -0.8915, 0.0501, -0.0647], grad_fn=<SliceBackward>) (...) +# , tensor([-0.1318, -0.0387, -0.0834, -0.0477, 0.1944], grad_fn=<SliceBackward>) (...) +# " tensor([-0.0486, 0.1818, -0.3946, -0.0553, 0.0981], grad_fn=<SliceBackward>) (...) +# hello tensor([ 0.0079, 0.1799, -0.6204, -0.0777, -0.0923], grad_fn=<SliceBackward>) (...) +# RoBERTa tensor([-0.2339, -0.1184, -0.7343, -0.0492, 0.5829], grad_fn=<SliceBackward>) (...) +# . tensor([-0.1341, -0.1203, -0.1012, -0.0621, 0.1892], grad_fn=<SliceBackward>) (...) +# " tensor([-0.1341, -0.1203, -0.1012, -0.0621, 0.1892], grad_fn=<SliceBackward>) (...) +# </s> tensor([-0.0930, -0.0392, -0.0821, 0.0158, 0.0649], grad_fn=<SliceBackward>) (...) +``` + +#### Evaluating the `roberta.large.mnli` model: + +Example python code snippet to evaluate accuracy on the MNLI `dev_matched` set. +```python +label_map = {0: 'contradiction', 1: 'neutral', 2: 'entailment'} +ncorrect, nsamples = 0, 0 +roberta.cuda() +roberta.eval() +with open('glue_data/MNLI/dev_matched.tsv') as fin: + fin.readline() + for index, line in enumerate(fin): + tokens = line.strip().split('\t') + sent1, sent2, target = tokens[8], tokens[9], tokens[-1] + tokens = roberta.encode(sent1, sent2) + prediction = roberta.predict('mnli', tokens).argmax().item() + prediction_label = label_map[prediction] + ncorrect += int(prediction_label == target) + nsamples += 1 +print('| Accuracy: ', float(ncorrect)/float(nsamples)) +# Expected output: 0.9060 +``` + +## Finetuning + +- [Finetuning on GLUE](README.glue.md) +- [Finetuning on custom classification tasks (e.g., IMDB)](README.custom_classification.md) +- [Finetuning on Winograd Schema Challenge (WSC)](wsc/README.md) +- [Finetuning on Commonsense QA (CQA)](commonsense_qa/README.md) + +## Pretraining using your own data + +See the [tutorial for pretraining RoBERTa using your own data](README.pretraining.md). + +## Citation + +```bibtex +@article{liu2019roberta, + title = {RoBERTa: A Robustly Optimized BERT Pretraining Approach}, + author = {Yinhan Liu and Myle Ott and Naman Goyal and Jingfei Du and + Mandar Joshi and Danqi Chen and Omer Levy and Mike Lewis and + Luke Zettlemoyer and Veselin Stoyanov}, + journal={arXiv preprint arXiv:1907.11692}, + year = {2019}, +} +``` diff --git a/SpeechT5/fairseq/examples/roberta/README.pretraining.md b/SpeechT5/fairseq/examples/roberta/README.pretraining.md new file mode 100644 index 0000000..8b6e10c --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/README.pretraining.md @@ -0,0 +1,98 @@ +# Pretraining RoBERTa using your own data + +This tutorial will walk you through pretraining RoBERTa over your own data. + +### 1) Preprocess the data + +Data should be preprocessed following the [language modeling format](/examples/language_model), i.e. each document should be separated by an empty line (only useful with `--sample-break-mode complete_doc`). Lines will be concatenated as a 1D text stream during training. + +We'll use the [WikiText-103 dataset](https://www.salesforce.com/products/einstein/ai-research/the-wikitext-dependency-language-modeling-dataset/) +to demonstrate how to preprocess raw text data with the GPT-2 BPE. Of course +this dataset is quite small, so the resulting pretrained model will perform +poorly, but it gives the general idea. + +First download the dataset: +```bash +wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip +unzip wikitext-103-raw-v1.zip +``` + +Next encode it with the GPT-2 BPE: +```bash +mkdir -p gpt2_bpe +wget -O gpt2_bpe/encoder.json https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json +wget -O gpt2_bpe/vocab.bpe https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe +for SPLIT in train valid test; do \ + python -m examples.roberta.multiprocessing_bpe_encoder \ + --encoder-json gpt2_bpe/encoder.json \ + --vocab-bpe gpt2_bpe/vocab.bpe \ + --inputs wikitext-103-raw/wiki.${SPLIT}.raw \ + --outputs wikitext-103-raw/wiki.${SPLIT}.bpe \ + --keep-empty \ + --workers 60; \ +done +``` + +Finally preprocess/binarize the data using the GPT-2 fairseq dictionary: +```bash +wget -O gpt2_bpe/dict.txt https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt +fairseq-preprocess \ + --only-source \ + --srcdict gpt2_bpe/dict.txt \ + --trainpref wikitext-103-raw/wiki.train.bpe \ + --validpref wikitext-103-raw/wiki.valid.bpe \ + --testpref wikitext-103-raw/wiki.test.bpe \ + --destdir data-bin/wikitext-103 \ + --workers 60 +``` + +### 2) Train RoBERTa base +```bash +TOTAL_UPDATES=125000 # Total number of training steps +WARMUP_UPDATES=10000 # Warmup the learning rate over this many updates +PEAK_LR=0.0005 # Peak learning rate, adjust as needed +TOKENS_PER_SAMPLE=512 # Max sequence length +MAX_POSITIONS=512 # Num. positional embeddings (usually same as above) +MAX_SENTENCES=16 # Number of sequences per batch (batch size) +UPDATE_FREQ=16 # Increase the batch size 16x + +DATA_DIR=data-bin/wikitext-103 + +fairseq-train --fp16 $DATA_DIR \ + --task masked_lm --criterion masked_lm \ + --arch roberta_base --sample-break-mode complete --tokens-per-sample $TOKENS_PER_SAMPLE \ + --optimizer adam --adam-betas '(0.9,0.98)' --adam-eps 1e-6 --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $PEAK_LR --warmup-updates $WARMUP_UPDATES --total-num-update $TOTAL_UPDATES \ + --dropout 0.1 --attention-dropout 0.1 --weight-decay 0.01 \ + --batch-size $MAX_SENTENCES --update-freq $UPDATE_FREQ \ + --max-update $TOTAL_UPDATES --log-format simple --log-interval 1 +``` + +**Note:** You can optionally resume training the released RoBERTa base model by +adding `--restore-file /path/to/roberta.base/model.pt`. + +**Note:** The above command assumes training on 8x32GB V100 GPUs. Each GPU uses +a batch size of 16 sequences (`$MAX_SENTENCES`) and accumulates gradients to +further increase the batch size by 16x (`$UPDATE_FREQ`), for a total batch size +of 2048 sequences. If you have fewer GPUs or GPUs with less memory you may need +to reduce `$MAX_SENTENCES` and increase `$UPDATE_FREQ` to compensate. +Alternatively if you have more GPUs you can decrease `$UPDATE_FREQ` accordingly +to increase training speed. + +**Note:** The learning rate and batch size are tightly connected and need to be +adjusted together. We generally recommend increasing the learning rate as you +increase the batch size according to the following table (although it's also +dataset dependent, so don't rely on the following values too closely): + +batch size | peak learning rate +---|--- +256 | 0.0001 +2048 | 0.0005 +8192 | 0.0007 + +### 3) Load your pretrained model +```python +from fairseq.models.roberta import RobertaModel +roberta = RobertaModel.from_pretrained('checkpoints', 'checkpoint_best.pt', 'path/to/data') +assert isinstance(roberta.model, torch.nn.Module) +``` diff --git a/SpeechT5/fairseq/examples/roberta/README.race.md b/SpeechT5/fairseq/examples/roberta/README.race.md new file mode 100644 index 0000000..13c917e --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/README.race.md @@ -0,0 +1,68 @@ +# Finetuning RoBERTa on RACE tasks + +### 1) Download the data from RACE website (http://www.cs.cmu.edu/~glai1/data/race/) + +### 2) Preprocess RACE data: +```bash +python ./examples/roberta/preprocess_RACE.py --input-dir <input-dir> --output-dir <extracted-data-dir> +./examples/roberta/preprocess_RACE.sh <extracted-data-dir> <output-dir> +``` + +### 3) Fine-tuning on RACE: + +```bash +MAX_EPOCH=5 # Number of training epochs. +LR=1e-05 # Peak LR for fixed LR scheduler. +NUM_CLASSES=4 +MAX_SENTENCES=1 # Batch size per GPU. +UPDATE_FREQ=8 # Accumulate gradients to simulate training on 8 GPUs. +DATA_DIR=/path/to/race-output-dir +ROBERTA_PATH=/path/to/roberta/model.pt + +CUDA_VISIBLE_DEVICES=0,1 fairseq-train $DATA_DIR --ddp-backend=legacy_ddp \ + --restore-file $ROBERTA_PATH \ + --reset-optimizer --reset-dataloader --reset-meters \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + --task sentence_ranking \ + --num-classes $NUM_CLASSES \ + --init-token 0 --separator-token 2 \ + --max-option-length 128 \ + --max-positions 512 \ + --shorten-method "truncate" \ + --arch roberta_large \ + --dropout 0.1 --attention-dropout 0.1 --weight-decay 0.01 \ + --criterion sentence_ranking \ + --optimizer adam --adam-betas '(0.9, 0.98)' --adam-eps 1e-06 \ + --clip-norm 0.0 \ + --lr-scheduler fixed --lr $LR \ + --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ + --batch-size $MAX_SENTENCES \ + --required-batch-size-multiple 1 \ + --update-freq $UPDATE_FREQ \ + --max-epoch $MAX_EPOCH +``` + +**Note:** + +a) As contexts in RACE are relatively long, we are using smaller batch size per GPU while increasing update-freq to achieve larger effective batch size. + +b) Above cmd-args and hyperparams are tested on one Nvidia `V100` GPU with `32gb` of memory for each task. Depending on the GPU memory resources available to you, you can use increase `--update-freq` and reduce `--batch-size`. + +c) The setting in above command is based on our hyperparam search within a fixed search space (for careful comparison across models). You might be able to find better metrics with wider hyperparam search. + +### 4) Evaluation: + +``` +DATA_DIR=/path/to/race-output-dir # data directory used during training +MODEL_PATH=/path/to/checkpoint_best.pt # path to the finetuned model checkpoint +PREDS_OUT=preds.tsv # output file path to save prediction +TEST_SPLIT=test # can be test (Middle) or test1 (High) +fairseq-validate \ + $DATA_DIR \ + --valid-subset $TEST_SPLIT \ + --path $MODEL_PATH \ + --batch-size 1 \ + --task sentence_ranking \ + --criterion sentence_ranking \ + --save-predictions $PREDS_OUT +``` diff --git a/SpeechT5/fairseq/examples/roberta/commonsense_qa/README.md b/SpeechT5/fairseq/examples/roberta/commonsense_qa/README.md new file mode 100644 index 0000000..05c6f84 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/commonsense_qa/README.md @@ -0,0 +1,99 @@ +# Finetuning RoBERTa on Commonsense QA + +We follow a similar approach to [finetuning RACE](../README.race.md). Specifically +for each question we construct five inputs, one for each of the five candidate +answer choices. Each input is constructed by concatenating the question and +candidate answer. We then encode each input and pass the resulting "[CLS]" +representations through a fully-connected layer to predict the correct answer. +We train with a standard cross-entropy loss. + +We also found it helpful to prepend a prefix of `Q:` to the question and `A:` to +the answer. The complete input format is: +``` +<s> Q: Where would I not want a fox? </s> A: hen house </s> +``` + +Our final submission is based on a hyperparameter search over the learning rate +(1e-5, 2e-5, 3e-5), batch size (8, 16), number of training steps (2000, 3000, +4000) and random seed. We selected the model with the best performance on the +development set after 100 trials. + +### 1) Download data from the Commonsense QA website (https://www.tau-nlp.org/commonsenseqa) +```bash +bash examples/roberta/commonsense_qa/download_cqa_data.sh +``` + +### 2) Finetune + +```bash +MAX_UPDATES=3000 # Number of training steps. +WARMUP_UPDATES=150 # Linearly increase LR over this many steps. +LR=1e-05 # Peak LR for polynomial LR scheduler. +MAX_SENTENCES=16 # Batch size. +SEED=1 # Random seed. +ROBERTA_PATH=/path/to/roberta/model.pt +DATA_DIR=data/CommonsenseQA + +# we use the --user-dir option to load the task from +# the examples/roberta/commonsense_qa directory: +FAIRSEQ_PATH=/path/to/fairseq +FAIRSEQ_USER_DIR=${FAIRSEQ_PATH}/examples/roberta/commonsense_qa + +CUDA_VISIBLE_DEVICES=0 fairseq-train --fp16 --ddp-backend=legacy_ddp \ + $DATA_DIR \ + --user-dir $FAIRSEQ_USER_DIR \ + --restore-file $ROBERTA_PATH \ + --reset-optimizer --reset-dataloader --reset-meters \ + --no-epoch-checkpoints --no-last-checkpoints --no-save-optimizer-state \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + --task commonsense_qa --init-token 0 --bpe gpt2 \ + --arch roberta_large --max-positions 512 \ + --dropout 0.1 --attention-dropout 0.1 --weight-decay 0.01 \ + --criterion sentence_ranking --num-classes 5 \ + --optimizer adam --adam-betas '(0.9, 0.98)' --adam-eps 1e-06 --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $LR \ + --warmup-updates $WARMUP_UPDATES --total-num-update $MAX_UPDATES \ + --batch-size $MAX_SENTENCES \ + --max-update $MAX_UPDATES \ + --log-format simple --log-interval 25 \ + --seed $SEED +``` + +The above command assumes training on 1 GPU with 32GB of RAM. For GPUs with +less memory, decrease `--batch-size` and increase `--update-freq` +accordingly to compensate. + +### 3) Evaluate +```python +import json +import torch +from fairseq.models.roberta import RobertaModel +from examples.roberta import commonsense_qa # load the Commonsense QA task +roberta = RobertaModel.from_pretrained('checkpoints', 'checkpoint_best.pt', 'data/CommonsenseQA') +roberta.eval() # disable dropout +roberta.cuda() # use the GPU (optional) +nsamples, ncorrect = 0, 0 +with open('data/CommonsenseQA/valid.jsonl') as h: + for line in h: + example = json.loads(line) + scores = [] + for choice in example['question']['choices']: + input = roberta.encode( + 'Q: ' + example['question']['stem'], + 'A: ' + choice['text'], + no_separator=True + ) + score = roberta.predict('sentence_classification_head', input, return_logits=True) + scores.append(score) + pred = torch.cat(scores).argmax() + answer = ord(example['answerKey']) - ord('A') + nsamples += 1 + if pred == answer: + ncorrect += 1 + +print('Accuracy: ' + str(ncorrect / float(nsamples))) +# Accuracy: 0.7846027846027847 +``` + +The above snippet is not batched, which makes it quite slow. See [instructions +for batched prediction with RoBERTa](https://github.com/pytorch/fairseq/tree/master/examples/roberta#batched-prediction). diff --git a/SpeechT5/fairseq/examples/roberta/commonsense_qa/__init__.py b/SpeechT5/fairseq/examples/roberta/commonsense_qa/__init__.py new file mode 100644 index 0000000..42d21f3 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/commonsense_qa/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import commonsense_qa_task # noqa diff --git a/SpeechT5/fairseq/examples/roberta/commonsense_qa/commonsense_qa_task.py b/SpeechT5/fairseq/examples/roberta/commonsense_qa/commonsense_qa_task.py new file mode 100644 index 0000000..216093f --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/commonsense_qa/commonsense_qa_task.py @@ -0,0 +1,190 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import json +import os + +import numpy as np +import torch +from fairseq.data import ( + Dictionary, + IdDataset, + ListDataset, + NestedDictionaryDataset, + NumelDataset, + NumSamplesDataset, + RawLabelDataset, + RightPadDataset, + SortDataset, + data_utils, + encoders, +) +from fairseq.tasks import LegacyFairseqTask, register_task + + +@register_task("commonsense_qa") +class CommonsenseQATask(LegacyFairseqTask): + """Task to finetune RoBERTa for Commonsense QA.""" + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument( + "data", metavar="DIR", help="path to data directory; we load <split>.jsonl" + ) + parser.add_argument( + "--init-token", + type=int, + default=None, + help="add token at the beginning of each batch item", + ) + parser.add_argument("--num-classes", type=int, default=5) + + def __init__(self, args, vocab): + super().__init__(args) + self.vocab = vocab + self.mask = vocab.add_symbol("<mask>") + + self.bpe = encoders.build_bpe(args) + + @classmethod + def load_dictionary(cls, filename): + """Load the dictionary from the filename + + Args: + filename (str): the filename + """ + dictionary = Dictionary.load(filename) + dictionary.add_symbol("<mask>") + return dictionary + + @classmethod + def setup_task(cls, args, **kwargs): + assert ( + args.criterion == "sentence_ranking" + ), "Must set --criterion=sentence_ranking" + + # load data and label dictionaries + vocab = cls.load_dictionary(os.path.join(args.data, "dict.txt")) + print("| dictionary: {} types".format(len(vocab))) + + return cls(args, vocab) + + def load_dataset( + self, split, epoch=1, combine=False, data_path=None, return_only=False, **kwargs + ): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + + def binarize(s, append_bos=False): + if self.bpe is not None: + s = self.bpe.encode(s) + tokens = self.vocab.encode_line( + s, + append_eos=True, + add_if_not_exist=False, + ).long() + if append_bos and self.args.init_token is not None: + tokens = torch.cat([tokens.new([self.args.init_token]), tokens]) + return tokens + + if data_path is None: + data_path = os.path.join(self.args.data, split + ".jsonl") + if not os.path.exists(data_path): + raise FileNotFoundError("Cannot find data: {}".format(data_path)) + + src_tokens = [[] for i in range(self.args.num_classes)] + src_lengths = [[] for i in range(self.args.num_classes)] + labels = [] + + with open(data_path) as h: + for line in h: + example = json.loads(line.strip()) + if "answerKey" in example: + label = ord(example["answerKey"]) - ord("A") + labels.append(label) + question = example["question"]["stem"] + assert len(example["question"]["choices"]) == self.args.num_classes + # format: `<s> Q: Where would I not want a fox? </s> A: hen house </s>` + question = "Q: " + question + question_toks = binarize(question, append_bos=True) + for i, choice in enumerate(example["question"]["choices"]): + src = "A: " + choice["text"] + src_bin = torch.cat([question_toks, binarize(src)]) + src_tokens[i].append(src_bin) + src_lengths[i].append(len(src_bin)) + assert all( + len(src_tokens[0]) == len(src_tokens[i]) + for i in range(self.args.num_classes) + ) + assert len(src_tokens[0]) == len(src_lengths[0]) + assert len(labels) == 0 or len(labels) == len(src_tokens[0]) + + for i in range(self.args.num_classes): + src_lengths[i] = np.array(src_lengths[i]) + src_tokens[i] = ListDataset(src_tokens[i], src_lengths[i]) + src_lengths[i] = ListDataset(src_lengths[i]) + + dataset = { + "id": IdDataset(), + "nsentences": NumSamplesDataset(), + "ntokens": NumelDataset(src_tokens[0], reduce=True), + } + + for i in range(self.args.num_classes): + dataset.update( + { + "net_input{}".format(i + 1): { + "src_tokens": RightPadDataset( + src_tokens[i], + pad_idx=self.source_dictionary.pad(), + ), + "src_lengths": src_lengths[i], + } + } + ) + + if len(labels) > 0: + dataset.update({"target": RawLabelDataset(labels)}) + + dataset = NestedDictionaryDataset( + dataset, + sizes=[np.maximum.reduce([src_token.sizes for src_token in src_tokens])], + ) + + with data_utils.numpy_seed(self.args.seed): + dataset = SortDataset( + dataset, + # shuffle + sort_order=[np.random.permutation(len(dataset))], + ) + + print("| Loaded {} with {} samples".format(split, len(dataset))) + + self.datasets[split] = dataset + return self.datasets[split] + + def build_model(self, args): + from fairseq import models + + model = models.build_model(args, self) + + model.register_classification_head( + "sentence_classification_head", + num_classes=1, + ) + + return model + + @property + def source_dictionary(self): + return self.vocab + + @property + def target_dictionary(self): + return self.vocab diff --git a/SpeechT5/fairseq/examples/roberta/commonsense_qa/download_cqa_data.sh b/SpeechT5/fairseq/examples/roberta/commonsense_qa/download_cqa_data.sh new file mode 100644 index 0000000..5f30009 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/commonsense_qa/download_cqa_data.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +OUTDIR=data/CommonsenseQA + +mkdir -p $OUTDIR + +wget -O $OUTDIR/train.jsonl https://s3.amazonaws.com/commensenseqa/train_rand_split.jsonl +wget -O $OUTDIR/valid.jsonl https://s3.amazonaws.com/commensenseqa/dev_rand_split.jsonl +wget -O $OUTDIR/test.jsonl https://s3.amazonaws.com/commensenseqa/test_rand_split_no_answers.jsonl +wget -O $OUTDIR/dict.txt https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt diff --git a/SpeechT5/fairseq/examples/roberta/multiprocessing_bpe_encoder.py b/SpeechT5/fairseq/examples/roberta/multiprocessing_bpe_encoder.py new file mode 100644 index 0000000..43fe045 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/multiprocessing_bpe_encoder.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import contextlib +import sys +from collections import Counter +from multiprocessing import Pool + +from fairseq.data.encoders.gpt2_bpe import get_encoder + + +def main(): + """ + Helper script to encode raw text with the GPT-2 BPE using multiple processes. + + The encoder.json and vocab.bpe files can be obtained here: + - https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json + - https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "--encoder-json", + help="path to encoder.json", + ) + parser.add_argument( + "--vocab-bpe", + type=str, + help="path to vocab.bpe", + ) + parser.add_argument( + "--inputs", + nargs="+", + default=["-"], + help="input files to filter/encode", + ) + parser.add_argument( + "--outputs", + nargs="+", + default=["-"], + help="path to save encoded outputs", + ) + parser.add_argument( + "--keep-empty", + action="store_true", + help="keep empty lines", + ) + parser.add_argument("--workers", type=int, default=20) + args = parser.parse_args() + + assert len(args.inputs) == len( + args.outputs + ), "number of input and output paths should match" + + with contextlib.ExitStack() as stack: + inputs = [ + stack.enter_context(open(input, "r", encoding="utf-8")) + if input != "-" + else sys.stdin + for input in args.inputs + ] + outputs = [ + stack.enter_context(open(output, "w", encoding="utf-8")) + if output != "-" + else sys.stdout + for output in args.outputs + ] + + encoder = MultiprocessingEncoder(args) + pool = Pool(args.workers, initializer=encoder.initializer) + encoded_lines = pool.imap(encoder.encode_lines, zip(*inputs), 100) + + stats = Counter() + for i, (filt, enc_lines) in enumerate(encoded_lines, start=1): + if filt == "PASS": + for enc_line, output_h in zip(enc_lines, outputs): + print(enc_line, file=output_h) + else: + stats["num_filtered_" + filt] += 1 + if i % 10000 == 0: + print("processed {} lines".format(i), file=sys.stderr) + + for k, v in stats.most_common(): + print("[{}] filtered {} lines".format(k, v), file=sys.stderr) + + +class MultiprocessingEncoder(object): + def __init__(self, args): + self.args = args + + def initializer(self): + global bpe + bpe = get_encoder(self.args.encoder_json, self.args.vocab_bpe) + + def encode(self, line): + global bpe + ids = bpe.encode(line) + return list(map(str, ids)) + + def decode(self, tokens): + global bpe + return bpe.decode(tokens) + + def encode_lines(self, lines): + """ + Encode a set of lines. All lines will be encoded together. + """ + enc_lines = [] + for line in lines: + line = line.strip() + if len(line) == 0 and not self.args.keep_empty: + return ["EMPTY", None] + tokens = self.encode(line) + enc_lines.append(" ".join(tokens)) + return ["PASS", enc_lines] + + def decode_lines(self, lines): + dec_lines = [] + for line in lines: + tokens = map(int, line.strip().split()) + dec_lines.append(self.decode(tokens)) + return ["PASS", dec_lines] + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/roberta/preprocess_GLUE_tasks.sh b/SpeechT5/fairseq/examples/roberta/preprocess_GLUE_tasks.sh new file mode 100644 index 0000000..7f215a3 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/preprocess_GLUE_tasks.sh @@ -0,0 +1,185 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +# raw glue data as downloaded by glue download script (https://gist.github.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e) +if [[ $# -ne 2 ]]; then + echo "Run as following:" + echo "./examples/roberta/preprocess_GLUE_tasks.sh <glud_data_folder> <task_name>" + exit 1 +fi + +GLUE_DATA_FOLDER=$1 + +# download bpe encoder.json, vocabulary and fairseq dictionary +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt' + +TASKS=$2 # QQP + +if [ "$TASKS" = "ALL" ] +then + TASKS="QQP MNLI QNLI MRPC RTE STS-B SST-2 CoLA" +fi + +for TASK in $TASKS +do + echo "Preprocessing $TASK" + + TASK_DATA_FOLDER="$GLUE_DATA_FOLDER/$TASK" + echo "Raw data as downloaded from glue website: $TASK_DATA_FOLDER" + + SPLITS="train dev test" + INPUT_COUNT=2 + if [ "$TASK" = "QQP" ] + then + INPUT_COLUMNS=( 4 5 ) + TEST_INPUT_COLUMNS=( 2 3 ) + LABEL_COLUMN=6 + elif [ "$TASK" = "MNLI" ] + then + SPLITS="train dev_matched dev_mismatched test_matched test_mismatched" + INPUT_COLUMNS=( 9 10 ) + TEST_INPUT_COLUMNS=( 9 10 ) + DEV_LABEL_COLUMN=16 + LABEL_COLUMN=12 + elif [ "$TASK" = "QNLI" ] + then + INPUT_COLUMNS=( 2 3 ) + TEST_INPUT_COLUMNS=( 2 3 ) + LABEL_COLUMN=4 + elif [ "$TASK" = "MRPC" ] + then + INPUT_COLUMNS=( 4 5 ) + TEST_INPUT_COLUMNS=( 4 5 ) + LABEL_COLUMN=1 + elif [ "$TASK" = "RTE" ] + then + INPUT_COLUMNS=( 2 3 ) + TEST_INPUT_COLUMNS=( 2 3 ) + LABEL_COLUMN=4 + elif [ "$TASK" = "STS-B" ] + then + INPUT_COLUMNS=( 8 9 ) + TEST_INPUT_COLUMNS=( 8 9 ) + LABEL_COLUMN=10 + # Following are single sentence tasks. + elif [ "$TASK" = "SST-2" ] + then + INPUT_COLUMNS=( 1 ) + TEST_INPUT_COLUMNS=( 2 ) + LABEL_COLUMN=2 + INPUT_COUNT=1 + elif [ "$TASK" = "CoLA" ] + then + INPUT_COLUMNS=( 4 ) + TEST_INPUT_COLUMNS=( 2 ) + LABEL_COLUMN=2 + INPUT_COUNT=1 + fi + + # Strip out header and filter lines that don't have expected number of fields. + rm -rf "$TASK_DATA_FOLDER/processed" + mkdir -p "$TASK_DATA_FOLDER/processed" + for SPLIT in $SPLITS + do + # CoLA train and dev doesn't have header. + if [[ ( "$TASK" = "CoLA") && ( "$SPLIT" != "test" ) ]] + then + cp "$TASK_DATA_FOLDER/$SPLIT.tsv" "$TASK_DATA_FOLDER/processed/$SPLIT.tsv.temp"; + else + tail -n +2 "$TASK_DATA_FOLDER/$SPLIT.tsv" > "$TASK_DATA_FOLDER/processed/$SPLIT.tsv.temp"; + fi + + # Remove unformatted lines from train and dev files for QQP dataset. + if [[ ( "$TASK" = "QQP") && ( "$SPLIT" != "test" ) ]] + then + awk -F '\t' -v NUM_FIELDS=6 'NF==NUM_FIELDS{print}{}' "$TASK_DATA_FOLDER/processed/$SPLIT.tsv.temp" > "$TASK_DATA_FOLDER/processed/$SPLIT.tsv"; + else + cp "$TASK_DATA_FOLDER/processed/$SPLIT.tsv.temp" "$TASK_DATA_FOLDER/processed/$SPLIT.tsv"; + fi + rm "$TASK_DATA_FOLDER/processed/$SPLIT.tsv.temp"; + done + + # Split into input0, input1 and label + for SPLIT in $SPLITS + do + for INPUT_TYPE in $(seq 0 $((INPUT_COUNT-1))) + do + if [[ "$SPLIT" != test* ]] + then + COLUMN_NUMBER=${INPUT_COLUMNS[$INPUT_TYPE]} + else + COLUMN_NUMBER=${TEST_INPUT_COLUMNS[$INPUT_TYPE]} + fi + cut -f"$COLUMN_NUMBER" "$TASK_DATA_FOLDER/processed/$SPLIT.tsv" > "$TASK_DATA_FOLDER/processed/$SPLIT.raw.input$INPUT_TYPE"; + done + + if [[ "$SPLIT" != test* ]] + then + if [ "$TASK" = "MNLI" ] && [ "$SPLIT" != "train" ] + then + cut -f"$DEV_LABEL_COLUMN" "$TASK_DATA_FOLDER/processed/$SPLIT.tsv" > "$TASK_DATA_FOLDER/processed/$SPLIT.label"; + else + cut -f"$LABEL_COLUMN" "$TASK_DATA_FOLDER/processed/$SPLIT.tsv" > "$TASK_DATA_FOLDER/processed/$SPLIT.label"; + fi + fi + + # BPE encode. + for INPUT_TYPE in $(seq 0 $((INPUT_COUNT-1))) + do + LANG="input$INPUT_TYPE" + echo "BPE encoding $SPLIT/$LANG" + python -m examples.roberta.multiprocessing_bpe_encoder \ + --encoder-json encoder.json \ + --vocab-bpe vocab.bpe \ + --inputs "$TASK_DATA_FOLDER/processed/$SPLIT.raw.$LANG" \ + --outputs "$TASK_DATA_FOLDER/processed/$SPLIT.$LANG" \ + --workers 60 \ + --keep-empty; + done + done + + # Remove output directory. + rm -rf "$TASK-bin" + + DEVPREF="$TASK_DATA_FOLDER/processed/dev.LANG" + TESTPREF="$TASK_DATA_FOLDER/processed/test.LANG" + if [ "$TASK" = "MNLI" ] + then + DEVPREF="$TASK_DATA_FOLDER/processed/dev_matched.LANG,$TASK_DATA_FOLDER/processed/dev_mismatched.LANG" + TESTPREF="$TASK_DATA_FOLDER/processed/test_matched.LANG,$TASK_DATA_FOLDER/processed/test_mismatched.LANG" + fi + + # Run fairseq preprocessing: + for INPUT_TYPE in $(seq 0 $((INPUT_COUNT-1))) + do + LANG="input$INPUT_TYPE" + fairseq-preprocess \ + --only-source \ + --trainpref "$TASK_DATA_FOLDER/processed/train.$LANG" \ + --validpref "${DEVPREF//LANG/$LANG}" \ + --testpref "${TESTPREF//LANG/$LANG}" \ + --destdir "$TASK-bin/$LANG" \ + --workers 60 \ + --srcdict dict.txt; + done + if [[ "$TASK" != "STS-B" ]] + then + fairseq-preprocess \ + --only-source \ + --trainpref "$TASK_DATA_FOLDER/processed/train.label" \ + --validpref "${DEVPREF//LANG/label}" \ + --destdir "$TASK-bin/label" \ + --workers 60; + else + # For STS-B output range is converted to be between: [0.0, 1.0] + mkdir -p "$TASK-bin/label" + awk '{print $1 / 5.0 }' "$TASK_DATA_FOLDER/processed/train.label" > "$TASK-bin/label/train.label" + awk '{print $1 / 5.0 }' "$TASK_DATA_FOLDER/processed/dev.label" > "$TASK-bin/label/valid.label" + fi +done diff --git a/SpeechT5/fairseq/examples/roberta/preprocess_RACE.py b/SpeechT5/fairseq/examples/roberta/preprocess_RACE.py new file mode 100644 index 0000000..cdd6607 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/preprocess_RACE.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import json +import os +import re + + +class InputExample: + def __init__(self, paragraph, qa_list, label): + self.paragraph = paragraph + self.qa_list = qa_list + self.label = label + + +def get_examples(data_dir, set_type): + """ + Extract paragraph and question-answer list from each json file + """ + examples = [] + + levels = ["middle", "high"] + set_type_c = set_type.split("-") + if len(set_type_c) == 2: + levels = [set_type_c[1]] + set_type = set_type_c[0] + for level in levels: + cur_dir = os.path.join(data_dir, set_type, level) + for filename in os.listdir(cur_dir): + cur_path = os.path.join(cur_dir, filename) + with open(cur_path, "r") as f: + cur_data = json.load(f) + answers = cur_data["answers"] + options = cur_data["options"] + questions = cur_data["questions"] + context = cur_data["article"].replace("\n", " ") + context = re.sub(r"\s+", " ", context) + for i in range(len(answers)): + label = ord(answers[i]) - ord("A") + qa_list = [] + question = questions[i] + for j in range(4): + option = options[i][j] + if "_" in question: + qa_cat = question.replace("_", option) + else: + qa_cat = " ".join([question, option]) + qa_cat = re.sub(r"\s+", " ", qa_cat) + qa_list.append(qa_cat) + examples.append(InputExample(context, qa_list, label)) + + return examples + + +def main(): + """ + Helper script to extract paragraphs questions and answers from RACE datasets. + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "--input-dir", + help="input directory for downloaded RACE dataset", + ) + parser.add_argument( + "--output-dir", + help="output directory for extracted data", + ) + args = parser.parse_args() + + if not os.path.exists(args.output_dir): + os.makedirs(args.output_dir, exist_ok=True) + + for set_type in ["train", "dev", "test-middle", "test-high"]: + examples = get_examples(args.input_dir, set_type) + qa_file_paths = [ + os.path.join(args.output_dir, set_type + ".input" + str(i + 1)) + for i in range(4) + ] + qa_files = [open(qa_file_path, "w") for qa_file_path in qa_file_paths] + outf_context_path = os.path.join(args.output_dir, set_type + ".input0") + outf_label_path = os.path.join(args.output_dir, set_type + ".label") + outf_context = open(outf_context_path, "w") + outf_label = open(outf_label_path, "w") + for example in examples: + outf_context.write(example.paragraph + "\n") + for i in range(4): + qa_files[i].write(example.qa_list[i] + "\n") + outf_label.write(str(example.label) + "\n") + + for f in qa_files: + f.close() + outf_label.close() + outf_context.close() + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/roberta/preprocess_RACE.sh b/SpeechT5/fairseq/examples/roberta/preprocess_RACE.sh new file mode 100644 index 0000000..932d2ab --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/preprocess_RACE.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +# data should be downloaded and processed with reprocess_RACE.py +if [[ $# -ne 2 ]]; then + echo "Run as following:" + echo "./examples/roberta/preprocess_RACE.sh <race_data_folder> <output_folder>" + exit 1 +fi + +RACE_DATA_FOLDER=$1 +OUT_DATA_FOLDER=$2 + +# download bpe encoder.json, vocabulary and fairseq dictionary +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe' +wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt' + +SPLITS="train dev test-middle test-high" +INPUT_TYPES="input0 input1 input2 input3 input4" +for INPUT_TYPE in $INPUT_TYPES +do + for SPLIT in $SPLITS + do + echo "BPE encoding $SPLIT/$INPUT_TYPE" + python -m examples.roberta.multiprocessing_bpe_encoder \ + --encoder-json encoder.json \ + --vocab-bpe vocab.bpe \ + --inputs "$RACE_DATA_FOLDER/$SPLIT.$INPUT_TYPE" \ + --outputs "$RACE_DATA_FOLDER/$SPLIT.$INPUT_TYPE.bpe" \ + --workers 10 \ + --keep-empty; + + done +done + +for INPUT_TYPE in $INPUT_TYPES + do + LANG="input$INPUT_TYPE" + fairseq-preprocess \ + --only-source \ + --trainpref "$RACE_DATA_FOLDER/train.$INPUT_TYPE.bpe" \ + --validpref "$RACE_DATA_FOLDER/dev.$INPUT_TYPE.bpe" \ + --testpref "$RACE_DATA_FOLDER/test-middle.$INPUT_TYPE.bpe,$RACE_DATA_FOLDER/test-high.$INPUT_TYPE.bpe" \ + --destdir "$OUT_DATA_FOLDER/$INPUT_TYPE" \ + --workers 10 \ + --srcdict dict.txt; +done + +rm -rf "$OUT_DATA_FOLDER/label" +mkdir -p "$OUT_DATA_FOLDER/label" +cp "$RACE_DATA_FOLDER/train.label" "$OUT_DATA_FOLDER/label/" +cp "$RACE_DATA_FOLDER/dev.label" "$OUT_DATA_FOLDER/label/valid.label" +cp "$RACE_DATA_FOLDER/test-middle.label" "$OUT_DATA_FOLDER/label/test.label" +cp "$RACE_DATA_FOLDER/test-high.label" "$OUT_DATA_FOLDER/label/test1.label" diff --git a/SpeechT5/fairseq/examples/roberta/wsc/README.md b/SpeechT5/fairseq/examples/roberta/wsc/README.md new file mode 100644 index 0000000..21a045d --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/wsc/README.md @@ -0,0 +1,125 @@ +# Finetuning RoBERTa on Winograd Schema Challenge (WSC) data + +The following instructions can be used to finetune RoBERTa on the WSC training +data provided by [SuperGLUE](https://super.gluebenchmark.com/). + +Note that there is high variance in the results. For our GLUE/SuperGLUE +submission we swept over the learning rate (1e-5, 2e-5, 3e-5), batch size (16, +32, 64) and total number of updates (500, 1000, 2000, 3000), as well as the +random seed. Out of ~100 runs we chose the best 7 models and ensembled them. + +**Approach:** The instructions below use a slightly different loss function than +what's described in the original RoBERTa arXiv paper. In particular, +[Kocijan et al. (2019)](https://arxiv.org/abs/1905.06290) introduce a margin +ranking loss between `(query, candidate)` pairs with tunable hyperparameters +alpha and beta. This is supported in our code as well with the `--wsc-alpha` and +`--wsc-beta` arguments. However, we achieved slightly better (and more robust) +results on the development set by instead using a single cross entropy loss term +over the log-probabilities for the query and all mined candidates. **The +candidates are mined using spaCy from each input sentence in isolation, so the +approach remains strictly pointwise.** This reduces the number of +hyperparameters and our best model achieved 92.3% development set accuracy, +compared to ~90% accuracy for the margin loss. Later versions of the RoBERTa +arXiv paper will describe this updated formulation. + +### 1) Download the WSC data from the SuperGLUE website: +```bash +wget https://dl.fbaipublicfiles.com/glue/superglue/data/v2/WSC.zip +unzip WSC.zip + +# we also need to copy the RoBERTa dictionary into the same directory +wget -O WSC/dict.txt https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt +``` + +### 2) Finetune over the provided training data: +```bash +TOTAL_NUM_UPDATES=2000 # Total number of training steps. +WARMUP_UPDATES=250 # Linearly increase LR over this many steps. +LR=2e-05 # Peak LR for polynomial LR scheduler. +MAX_SENTENCES=16 # Batch size per GPU. +SEED=1 # Random seed. +ROBERTA_PATH=/path/to/roberta/model.pt + +# we use the --user-dir option to load the task and criterion +# from the examples/roberta/wsc directory: +FAIRSEQ_PATH=/path/to/fairseq +FAIRSEQ_USER_DIR=${FAIRSEQ_PATH}/examples/roberta/wsc + +CUDA_VISIBLE_DEVICES=0,1,2,3 fairseq-train WSC/ \ + --restore-file $ROBERTA_PATH \ + --reset-optimizer --reset-dataloader --reset-meters \ + --no-epoch-checkpoints --no-last-checkpoints --no-save-optimizer-state \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + --valid-subset val \ + --fp16 --ddp-backend legacy_ddp \ + --user-dir $FAIRSEQ_USER_DIR \ + --task wsc --criterion wsc --wsc-cross-entropy \ + --arch roberta_large --bpe gpt2 --max-positions 512 \ + --dropout 0.1 --attention-dropout 0.1 --weight-decay 0.01 \ + --optimizer adam --adam-betas '(0.9, 0.98)' --adam-eps 1e-06 \ + --lr-scheduler polynomial_decay --lr $LR \ + --warmup-updates $WARMUP_UPDATES --total-num-update $TOTAL_NUM_UPDATES \ + --batch-size $MAX_SENTENCES \ + --max-update $TOTAL_NUM_UPDATES \ + --log-format simple --log-interval 100 \ + --seed $SEED +``` + +The above command assumes training on 4 GPUs, but you can achieve the same +results on a single GPU by adding `--update-freq=4`. + +### 3) Evaluate +```python +from fairseq.models.roberta import RobertaModel +from examples.roberta.wsc import wsc_utils # also loads WSC task and criterion +roberta = RobertaModel.from_pretrained('checkpoints', 'checkpoint_best.pt', 'WSC/') +roberta.cuda() +nsamples, ncorrect = 0, 0 +for sentence, label in wsc_utils.jsonl_iterator('WSC/val.jsonl', eval=True): + pred = roberta.disambiguate_pronoun(sentence) + nsamples += 1 + if pred == label: + ncorrect += 1 +print('Accuracy: ' + str(ncorrect / float(nsamples))) +# Accuracy: 0.9230769230769231 +``` + +## RoBERTa training on WinoGrande dataset +We have also provided `winogrande` task and criterion for finetuning on the +[WinoGrande](https://mosaic.allenai.org/projects/winogrande) like datasets +where there are always two candidates and one is correct. +It's more efficient implementation for such subcases. + +```bash +TOTAL_NUM_UPDATES=23750 # Total number of training steps. +WARMUP_UPDATES=2375 # Linearly increase LR over this many steps. +LR=1e-05 # Peak LR for polynomial LR scheduler. +MAX_SENTENCES=32 # Batch size per GPU. +SEED=1 # Random seed. +ROBERTA_PATH=/path/to/roberta/model.pt + +# we use the --user-dir option to load the task and criterion +# from the examples/roberta/wsc directory: +FAIRSEQ_PATH=/path/to/fairseq +FAIRSEQ_USER_DIR=${FAIRSEQ_PATH}/examples/roberta/wsc + +cd fairseq +CUDA_VISIBLE_DEVICES=0 fairseq-train winogrande_1.0/ \ + --restore-file $ROBERTA_PATH \ + --reset-optimizer --reset-dataloader --reset-meters \ + --no-epoch-checkpoints --no-last-checkpoints --no-save-optimizer-state \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + --valid-subset val \ + --fp16 --ddp-backend legacy_ddp \ + --user-dir $FAIRSEQ_USER_DIR \ + --task winogrande --criterion winogrande \ + --wsc-margin-alpha 5.0 --wsc-margin-beta 0.4 \ + --arch roberta_large --bpe gpt2 --max-positions 512 \ + --dropout 0.1 --attention-dropout 0.1 --weight-decay 0.01 \ + --optimizer adam --adam-betas '(0.9, 0.98)' --adam-eps 1e-06 \ + --lr-scheduler polynomial_decay --lr $LR \ + --warmup-updates $WARMUP_UPDATES --total-num-update $TOTAL_NUM_UPDATES \ + --batch-size $MAX_SENTENCES \ + --max-update $TOTAL_NUM_UPDATES \ + --log-format simple --log-interval 100 +``` diff --git a/SpeechT5/fairseq/examples/roberta/wsc/__init__.py b/SpeechT5/fairseq/examples/roberta/wsc/__init__.py new file mode 100644 index 0000000..78afa47 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/wsc/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import wsc_criterion # noqa +from . import wsc_task # noqa diff --git a/SpeechT5/fairseq/examples/roberta/wsc/wsc_criterion.py b/SpeechT5/fairseq/examples/roberta/wsc/wsc_criterion.py new file mode 100644 index 0000000..ed0251f --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/wsc/wsc_criterion.py @@ -0,0 +1,167 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.criterions import LegacyFairseqCriterion, register_criterion +from fairseq.data import encoders + + +@register_criterion("wsc") +class WSCCriterion(LegacyFairseqCriterion): + def __init__(self, args, task): + super().__init__(args, task) + if self.args.save_predictions is not None: + self.prediction_h = open(self.args.save_predictions, "w") + else: + self.prediction_h = None + self.bpe = encoders.build_bpe(args.bpe) + self.tokenizer = encoders.build_tokenizer(args.tokenizer) + + def __del__(self): + if self.prediction_h is not None: + self.prediction_h.close() + + @staticmethod + def add_args(parser): + """Add criterion-specific arguments to the parser.""" + parser.add_argument("--wsc-margin-alpha", type=float, metavar="A", default=1.0) + parser.add_argument("--wsc-margin-beta", type=float, metavar="B", default=0.0) + parser.add_argument( + "--wsc-cross-entropy", + action="store_true", + help="use cross entropy formulation instead of margin loss", + ) + parser.add_argument( + "--save-predictions", metavar="FILE", help="file to save predictions to" + ) + + def get_masked_input(self, tokens, mask): + masked_tokens = tokens.clone() + masked_tokens[mask] = self.task.mask + return masked_tokens + + def get_lprobs(self, model, tokens, mask): + logits, _ = model(src_tokens=self.get_masked_input(tokens, mask)) + lprobs = F.log_softmax(logits, dim=-1, dtype=torch.float) + scores = lprobs.gather(2, tokens.unsqueeze(-1)).squeeze(-1) + mask = mask.type_as(scores) + scores = (scores * mask).sum(dim=-1) / mask.sum(dim=-1) + return scores + + def get_loss(self, query_lprobs, cand_lprobs): + if self.args.wsc_cross_entropy: + return F.cross_entropy( + torch.cat([query_lprobs, cand_lprobs]).unsqueeze(0), + query_lprobs.new([0]).long(), + ) + else: + return ( + -query_lprobs + + self.args.wsc_margin_alpha + * (cand_lprobs - query_lprobs + self.args.wsc_margin_beta).clamp(min=0) + ).sum() + + def forward(self, model, sample, reduce=True): + # compute loss and accuracy + loss, nloss = 0.0, 0 + ncorrect, nqueries = 0, 0 + + for i, label in enumerate(sample["labels"]): + query_lprobs = self.get_lprobs( + model, + sample["query_tokens"][i].unsqueeze(0), + sample["query_masks"][i].unsqueeze(0), + ) + cand_lprobs = self.get_lprobs( + model, + sample["candidate_tokens"][i], + sample["candidate_masks"][i], + ) + + pred = (query_lprobs >= cand_lprobs).all().item() + + if label is not None: + label = 1 if label else 0 + ncorrect += 1 if pred == label else 0 + nqueries += 1 + + if label: + # only compute a loss for positive instances + nloss += 1 + loss += self.get_loss(query_lprobs, cand_lprobs) + + id = sample["id"][i].item() + if self.prediction_h is not None: + print("{}\t{}\t{}".format(id, pred, label), file=self.prediction_h) + + if nloss == 0: + loss = torch.tensor(0.0, requires_grad=True) + + sample_size = nqueries if nqueries > 0 else 1 + logging_output = { + "loss": utils.item(loss.data) if reduce else loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["nsentences"], + "sample_size": sample_size, + "ncorrect": ncorrect, + "nqueries": nqueries, + } + return loss, sample_size, logging_output + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + agg_output = { + "loss": loss_sum / sample_size / math.log(2), + "ntokens": ntokens, + "nsentences": nsentences, + "sample_size": sample_size, + } + + ncorrect = sum(log.get("ncorrect", 0) for log in logging_outputs) + nqueries = sum(log.get("nqueries", 0) for log in logging_outputs) + if nqueries > 0: + agg_output["accuracy"] = ncorrect / float(nqueries) + + return agg_output + + +@register_criterion("winogrande") +class WinograndeCriterion(WSCCriterion): + def forward(self, model, sample, reduce=True): + # compute loss and accuracy + query_lprobs = self.get_lprobs( + model, + sample["query_tokens"], + sample["query_masks"], + ) + cand_lprobs = self.get_lprobs( + model, + sample["candidate_tokens"], + sample["candidate_masks"], + ) + pred = query_lprobs >= cand_lprobs + loss = self.get_loss(query_lprobs, cand_lprobs) + + sample_size = sample["query_tokens"].size(0) + ncorrect = pred.sum().item() + logging_output = { + "loss": utils.item(loss.data) if reduce else loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["nsentences"], + "sample_size": sample_size, + "ncorrect": ncorrect, + "nqueries": sample_size, + } + return loss, sample_size, logging_output diff --git a/SpeechT5/fairseq/examples/roberta/wsc/wsc_task.py b/SpeechT5/fairseq/examples/roberta/wsc/wsc_task.py new file mode 100644 index 0000000..602ea73 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/wsc/wsc_task.py @@ -0,0 +1,401 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import json +import os +import tempfile + +import numpy as np +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.data import ( + Dictionary, + IdDataset, + ListDataset, + NestedDictionaryDataset, + NumelDataset, + NumSamplesDataset, + PadDataset, + SortDataset, + data_utils, + encoders, +) +from fairseq.tasks import LegacyFairseqTask, register_task + +from . import wsc_utils + + +@register_task("wsc") +class WSCTask(LegacyFairseqTask): + """Task to finetune RoBERTa for Winograd Schemas.""" + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument( + "data", metavar="DIR", help="path to data directory; we load <split>.jsonl" + ) + parser.add_argument( + "--init-token", + type=int, + default=None, + help="add token at the beginning of each batch item", + ) + + def __init__(self, args, vocab): + super().__init__(args) + self.vocab = vocab + self.mask = vocab.add_symbol("<mask>") + + self.bpe = encoders.build_bpe(args) + self.tokenizer = encoders.build_tokenizer(args) + + # hack to handle GPT-2 BPE, which includes leading spaces + if args.bpe == "gpt2": + self.leading_space = True + self.trailing_space = False + else: + self.leading_space = False + self.trailing_space = True + + @classmethod + def load_dictionary(cls, filename): + """Load the dictionary from the filename + + Args: + filename (str): the filename + """ + dictionary = Dictionary.load(filename) + dictionary.add_symbol("<mask>") + return dictionary + + @classmethod + def setup_task(cls, args, **kwargs): + assert args.criterion == "wsc", "Must set --criterion=wsc" + + # load data and label dictionaries + vocab = cls.load_dictionary(os.path.join(args.data, "dict.txt")) + print("| dictionary: {} types".format(len(vocab))) + + return cls(args, vocab) + + def binarize(self, s: str, append_eos: bool = False): + if self.tokenizer is not None: + s = self.tokenizer.encode(s) + if self.bpe is not None: + s = self.bpe.encode(s) + tokens = self.vocab.encode_line( + s, + append_eos=append_eos, + add_if_not_exist=False, + ).long() + if self.args.init_token is not None: + tokens = torch.cat([tokens.new([self.args.init_token]), tokens]) + return tokens + + def binarize_with_mask(self, txt, prefix, suffix, leading_space, trailing_space): + toks = self.binarize( + prefix + leading_space + txt + trailing_space + suffix, + append_eos=True, + ) + mask = torch.zeros_like(toks, dtype=torch.bool) + mask_start = len(self.binarize(prefix)) + mask_size = len(self.binarize(leading_space + txt)) + mask[mask_start : mask_start + mask_size] = 1 + return toks, mask + + def load_dataset( + self, split, epoch=1, combine=False, data_path=None, return_only=False, **kwargs + ): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + if data_path is None: + data_path = os.path.join(self.args.data, split + ".jsonl") + if not os.path.exists(data_path): + raise FileNotFoundError("Cannot find data: {}".format(data_path)) + + query_tokens = [] + query_masks = [] + query_lengths = [] + candidate_tokens = [] + candidate_masks = [] + candidate_lengths = [] + labels = [] + + for sentence, pronoun_span, query, label in wsc_utils.jsonl_iterator(data_path): + prefix = sentence[: pronoun_span.start].text + suffix = sentence[pronoun_span.end :].text_with_ws + + # spaCy spans include trailing spaces, but we need to know about + # leading spaces for the GPT-2 BPE + leading_space = ( + " " if sentence[: pronoun_span.start].text_with_ws.endswith(" ") else "" + ) + trailing_space = " " if pronoun_span.text_with_ws.endswith(" ") else "" + + # get noun phrases, excluding pronouns and anything overlapping with the query + cand_spans = wsc_utils.filter_noun_chunks( + wsc_utils.extended_noun_chunks(sentence), + exclude_pronouns=True, + exclude_query=query, + exact_match=False, + ) + + if query is not None: + query_toks, query_mask = self.binarize_with_mask( + query, prefix, suffix, leading_space, trailing_space + ) + query_len = len(query_toks) + else: + query_toks, query_mask, query_len = None, None, 0 + + query_tokens.append(query_toks) + query_masks.append(query_mask) + query_lengths.append(query_len) + + cand_toks, cand_masks = [], [] + for cand_span in cand_spans: + toks, mask = self.binarize_with_mask( + cand_span.text, + prefix, + suffix, + leading_space, + trailing_space, + ) + cand_toks.append(toks) + cand_masks.append(mask) + + # collate candidates + cand_toks = data_utils.collate_tokens(cand_toks, pad_idx=self.vocab.pad()) + cand_masks = data_utils.collate_tokens(cand_masks, pad_idx=0) + assert cand_toks.size() == cand_masks.size() + + candidate_tokens.append(cand_toks) + candidate_masks.append(cand_masks) + candidate_lengths.append(cand_toks.size(1)) + + labels.append(label) + + query_lengths = np.array(query_lengths) + query_tokens = ListDataset(query_tokens, query_lengths) + query_masks = ListDataset(query_masks, query_lengths) + + candidate_lengths = np.array(candidate_lengths) + candidate_tokens = ListDataset(candidate_tokens, candidate_lengths) + candidate_masks = ListDataset(candidate_masks, candidate_lengths) + + labels = ListDataset(labels, [1] * len(labels)) + + dataset = { + "id": IdDataset(), + "query_tokens": query_tokens, + "query_masks": query_masks, + "candidate_tokens": candidate_tokens, + "candidate_masks": candidate_masks, + "labels": labels, + "nsentences": NumSamplesDataset(), + "ntokens": NumelDataset(query_tokens, reduce=True), + } + + nested_dataset = NestedDictionaryDataset( + dataset, + sizes=[query_lengths], + ) + + with data_utils.numpy_seed(self.args.seed): + shuffle = np.random.permutation(len(query_tokens)) + dataset = SortDataset( + nested_dataset, + # shuffle + sort_order=[shuffle], + ) + + if return_only: + return dataset + + self.datasets[split] = dataset + return self.datasets[split] + + def build_dataset_for_inference(self, sample_json): + with tempfile.NamedTemporaryFile(buffering=0) as h: + h.write((json.dumps(sample_json) + "\n").encode("utf-8")) + dataset = self.load_dataset( + "disambiguate_pronoun", + data_path=h.name, + return_only=True, + ) + return dataset + + def disambiguate_pronoun(self, model, sentence, use_cuda=False): + sample_json = wsc_utils.convert_sentence_to_json(sentence) + dataset = self.build_dataset_for_inference(sample_json) + sample = dataset.collater([dataset[0]]) + if use_cuda: + sample = utils.move_to_cuda(sample) + + def get_masked_input(tokens, mask): + masked_tokens = tokens.clone() + masked_tokens[mask.bool()] = self.mask + return masked_tokens + + def get_lprobs(tokens, mask): + logits, _ = model(src_tokens=get_masked_input(tokens, mask)) + lprobs = F.log_softmax(logits, dim=-1, dtype=torch.float) + scores = lprobs.gather(2, tokens.unsqueeze(-1)).squeeze(-1) + mask = mask.type_as(scores) + scores = (scores * mask).sum(dim=-1) / mask.sum(dim=-1) + return scores + + cand_lprobs = get_lprobs( + sample["candidate_tokens"][0], + sample["candidate_masks"][0], + ) + if sample["query_tokens"][0] is not None: + query_lprobs = get_lprobs( + sample["query_tokens"][0].unsqueeze(0), + sample["query_masks"][0].unsqueeze(0), + ) + return (query_lprobs >= cand_lprobs).all().item() == 1 + else: + best_idx = cand_lprobs.argmax().item() + full_cand = sample["candidate_tokens"][0][best_idx] + mask = sample["candidate_masks"][0][best_idx] + toks = full_cand[mask.bool()] + return self.bpe.decode(self.source_dictionary.string(toks)).strip() + + @property + def source_dictionary(self): + return self.vocab + + @property + def target_dictionary(self): + return self.vocab + + +@register_task("winogrande") +class WinograndeTask(WSCTask): + """ + Task for WinoGrande dataset. Efficient implementation for Winograd schema + tasks with exactly two candidates, one of which is correct. + """ + + @classmethod + def setup_task(cls, args, **kwargs): + assert args.criterion == "winogrande", "Must set --criterion=winogrande" + + # load data and label dictionaries + vocab = cls.load_dictionary(os.path.join(args.data, "dict.txt")) + print("| dictionary: {} types".format(len(vocab))) + + return cls(args, vocab) + + def load_dataset( + self, split, epoch=1, combine=False, data_path=None, return_only=False, **kwargs + ): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + if data_path is None: + data_path = os.path.join(self.args.data, split + ".jsonl") + if not os.path.exists(data_path): + raise FileNotFoundError("Cannot find data: {}".format(data_path)) + + query_tokens = [] + query_masks = [] + query_lengths = [] + candidate_tokens = [] + candidate_masks = [] + candidate_lengths = [] + + itr = wsc_utils.winogrande_jsonl_iterator(data_path, eval=(split == "test")) + + for sample in itr: + sentence, pronoun_span, query, cand_text = sample + prefix = sentence[: pronoun_span[0]].rstrip() + suffix = sentence[pronoun_span[1] :] + + leading_space = " " if sentence[: pronoun_span[0]].endswith(" ") else "" + trailing_space = "" + + if query is not None: + query_toks, query_mask = self.binarize_with_mask( + query, + prefix, + suffix, + leading_space, + trailing_space, + ) + query_len = len(query_toks) + else: + query_toks, query_mask, query_len = None, None, 0 + + query_tokens.append(query_toks) + query_masks.append(query_mask) + query_lengths.append(query_len) + + cand_toks, cand_mask = self.binarize_with_mask( + cand_text, + prefix, + suffix, + leading_space, + trailing_space, + ) + + candidate_tokens.append(cand_toks) + candidate_masks.append(cand_mask) + candidate_lengths.append(cand_toks.size(0)) + + query_lengths = np.array(query_lengths) + + def get_pad_dataset_fn(tokens, length, pad_idx): + return PadDataset( + ListDataset(tokens, length), + pad_idx=pad_idx, + left_pad=False, + ) + + query_tokens = get_pad_dataset_fn(query_tokens, query_lengths, self.vocab.pad()) + query_masks = get_pad_dataset_fn(query_masks, query_lengths, 0) + + candidate_lengths = np.array(candidate_lengths) + candidate_tokens = get_pad_dataset_fn( + candidate_tokens, candidate_lengths, self.vocab.pad() + ) + candidate_masks = get_pad_dataset_fn(candidate_masks, candidate_lengths, 0) + + dataset = { + "id": IdDataset(), + "query_tokens": query_tokens, + "query_masks": query_masks, + "candidate_tokens": candidate_tokens, + "candidate_masks": candidate_masks, + "nsentences": NumSamplesDataset(), + "ntokens": NumelDataset(query_tokens, reduce=True), + } + + nested_dataset = NestedDictionaryDataset( + dataset, + sizes=[query_lengths], + ) + + with data_utils.numpy_seed(self.args.seed): + shuffle = np.random.permutation(len(query_tokens)) + dataset = SortDataset( + nested_dataset, + # shuffle + sort_order=[shuffle], + ) + + if return_only: + return dataset + + self.datasets[split] = dataset + return self.datasets[split] diff --git a/SpeechT5/fairseq/examples/roberta/wsc/wsc_utils.py b/SpeechT5/fairseq/examples/roberta/wsc/wsc_utils.py new file mode 100644 index 0000000..da6ba74 --- /dev/null +++ b/SpeechT5/fairseq/examples/roberta/wsc/wsc_utils.py @@ -0,0 +1,241 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import json +from functools import lru_cache + + +def convert_sentence_to_json(sentence): + if "_" in sentence: + prefix, rest = sentence.split("_", 1) + query, rest = rest.split("_", 1) + query_index = len(prefix.rstrip().split(" ")) + else: + query, query_index = None, None + + prefix, rest = sentence.split("[", 1) + pronoun, rest = rest.split("]", 1) + pronoun_index = len(prefix.rstrip().split(" ")) + + sentence = sentence.replace("_", "").replace("[", "").replace("]", "") + + return { + "idx": 0, + "text": sentence, + "target": { + "span1_index": query_index, + "span1_text": query, + "span2_index": pronoun_index, + "span2_text": pronoun, + }, + } + + +def extended_noun_chunks(sentence): + noun_chunks = {(np.start, np.end) for np in sentence.noun_chunks} + np_start, cur_np = 0, "NONE" + for i, token in enumerate(sentence): + np_type = token.pos_ if token.pos_ in {"NOUN", "PROPN"} else "NONE" + if np_type != cur_np: + if cur_np != "NONE": + noun_chunks.add((np_start, i)) + if np_type != "NONE": + np_start = i + cur_np = np_type + if cur_np != "NONE": + noun_chunks.add((np_start, len(sentence))) + return [sentence[s:e] for (s, e) in sorted(noun_chunks)] + + +def find_token(sentence, start_pos): + found_tok = None + for tok in sentence: + if tok.idx == start_pos: + found_tok = tok + break + return found_tok + + +def find_span(sentence, search_text, start=0): + search_text = search_text.lower() + for tok in sentence[start:]: + remainder = sentence[tok.i :].text.lower() + if remainder.startswith(search_text): + len_to_consume = len(search_text) + start_idx = tok.idx + for next_tok in sentence[tok.i :]: + end_idx = next_tok.idx + len(next_tok.text) + if end_idx - start_idx == len_to_consume: + span = sentence[tok.i : next_tok.i + 1] + return span + return None + + +@lru_cache(maxsize=1) +def get_detokenizer(): + from sacremoses import MosesDetokenizer + + detok = MosesDetokenizer(lang="en") + return detok + + +@lru_cache(maxsize=1) +def get_spacy_nlp(): + import en_core_web_lg + + nlp = en_core_web_lg.load() + return nlp + + +def jsonl_iterator(input_fname, positive_only=False, ngram_order=3, eval=False): + detok = get_detokenizer() + nlp = get_spacy_nlp() + + with open(input_fname) as fin: + for line in fin: + sample = json.loads(line.strip()) + + if positive_only and "label" in sample and not sample["label"]: + # only consider examples where the query is correct + continue + + target = sample["target"] + + # clean up the query + query = target["span1_text"] + if query is not None: + if "\n" in query: + continue + if query.endswith(".") or query.endswith(","): + query = query[:-1] + + # split tokens + tokens = sample["text"].split(" ") + + def strip_pronoun(x): + return x.rstrip('.,"') + + # find the pronoun + pronoun_idx = target["span2_index"] + pronoun = strip_pronoun(target["span2_text"]) + if strip_pronoun(tokens[pronoun_idx]) != pronoun: + # hack: sometimes the index is misaligned + if strip_pronoun(tokens[pronoun_idx + 1]) == pronoun: + pronoun_idx += 1 + else: + raise Exception("Misaligned pronoun!") + assert strip_pronoun(tokens[pronoun_idx]) == pronoun + + # split tokens before and after the pronoun + before = tokens[:pronoun_idx] + after = tokens[pronoun_idx + 1 :] + + # the GPT BPE attaches leading spaces to tokens, so we keep track + # of whether we need spaces before or after the pronoun + leading_space = " " if pronoun_idx > 0 else "" + trailing_space = " " if len(after) > 0 else "" + + # detokenize + before = detok.detokenize(before, return_str=True) + pronoun = detok.detokenize([pronoun], return_str=True) + after = detok.detokenize(after, return_str=True) + + # hack: when the pronoun ends in a period (or comma), move the + # punctuation to the "after" part + if pronoun.endswith(".") or pronoun.endswith(","): + after = pronoun[-1] + trailing_space + after + pronoun = pronoun[:-1] + + # hack: when the "after" part begins with a comma or period, remove + # the trailing space + if after.startswith(".") or after.startswith(","): + trailing_space = "" + + # parse sentence with spacy + sentence = nlp(before + leading_space + pronoun + trailing_space + after) + + # find pronoun span + start = len(before + leading_space) + first_pronoun_tok = find_token(sentence, start_pos=start) + pronoun_span = find_span(sentence, pronoun, start=first_pronoun_tok.i) + assert pronoun_span.text == pronoun + + if eval: + # convert to format where pronoun is surrounded by "[]" and + # query is surrounded by "_" + query_span = find_span(sentence, query) + query_with_ws = "_{}_{}".format( + query_span.text, + (" " if query_span.text_with_ws.endswith(" ") else ""), + ) + pronoun_with_ws = "[{}]{}".format( + pronoun_span.text, + (" " if pronoun_span.text_with_ws.endswith(" ") else ""), + ) + if query_span.start < pronoun_span.start: + first = (query_span, query_with_ws) + second = (pronoun_span, pronoun_with_ws) + else: + first = (pronoun_span, pronoun_with_ws) + second = (query_span, query_with_ws) + sentence = ( + sentence[: first[0].start].text_with_ws + + first[1] + + sentence[first[0].end : second[0].start].text_with_ws + + second[1] + + sentence[second[0].end :].text + ) + yield sentence, sample.get("label", None) + else: + yield sentence, pronoun_span, query, sample.get("label", None) + + +def winogrande_jsonl_iterator(input_fname, eval=False): + with open(input_fname) as fin: + for line in fin: + sample = json.loads(line.strip()) + sentence, option1, option2 = ( + sample["sentence"], + sample["option1"], + sample["option2"], + ) + + pronoun_span = (sentence.index("_"), sentence.index("_") + 1) + + if eval: + query, cand = option1, option2 + else: + query = option1 if sample["answer"] == "1" else option2 + cand = option2 if sample["answer"] == "1" else option1 + yield sentence, pronoun_span, query, cand + + +def filter_noun_chunks( + chunks, exclude_pronouns=False, exclude_query=None, exact_match=False +): + if exclude_pronouns: + chunks = [ + np + for np in chunks + if (np.lemma_ != "-PRON-" and not all(tok.pos_ == "PRON" for tok in np)) + ] + + if exclude_query is not None: + excl_txt = [exclude_query.lower()] + filtered_chunks = [] + for chunk in chunks: + lower_chunk = chunk.text.lower() + found = False + for excl in excl_txt: + if ( + not exact_match and (lower_chunk in excl or excl in lower_chunk) + ) or lower_chunk == excl: + found = True + break + if not found: + filtered_chunks.append(chunk) + chunks = filtered_chunks + + return chunks diff --git a/SpeechT5/fairseq/examples/rxf/README.md b/SpeechT5/fairseq/examples/rxf/README.md new file mode 100644 index 0000000..22a1cc4 --- /dev/null +++ b/SpeechT5/fairseq/examples/rxf/README.md @@ -0,0 +1,52 @@ +[Better Fine-Tuning by Reducing Representational Collapse](https://arxiv.org/abs/2008.03156) +===================== +This repo contains the code to replicate all experiments from the _Better Fine-Tuning by Reducing Representational Collapse_ paper excluding the probing results. + +The R3F sentence prediction criterion is registered as `sentence_prediction_r3f` while the label smoothing version of it is implemented as `label_smoothed_cross_entropy_r3f`. The R4F version of the sentence prediction criterion can be achieved by applying spectral norm to the classification head via the `--spectral-norm-classification-head` parameter. + +## Hyper-parameters +Our methods introduce 3 new hyper-parameters; `--eps` which sets the standard deviation or range of the distribution we're sampling from, `--r3f-lambda` which controls the combining of logistic loss and noisy KL loss and `--noise-type` which controls which parametric distribution we use ('normal', 'uniform'). + +For example to run R3F on RTE from GLUE + +``` +TOTAL_NUM_UPDATES=3120 +WARMUP_UPDATES=187 +LR=1e-05 +NUM_CLASSES=2 +MAX_SENTENCES=8 # Batch size. +ROBERTA_PATH=/path/to/roberta/model.pt + +CUDA_VISIBLE_DEVICES=0 fairseq-train RTE-bin \ + --restore-file $ROBERTA_PATH \ + --max-positions 512 \ + --max-sentences $MAX_SENTENCES \ + --max-tokens 4400 \ + --task sentence_prediction \ + --reset-optimizer --reset-dataloader --reset-meters \ + --required-batch-size-multiple 1 \ + --init-token 0 --separator-token 2 \ + --arch roberta_large \ + --criterion sentence_prediction_r3f \ + --num-classes $NUM_CLASSES \ + --dropout 0.1 --attention-dropout 0.1 \ + --weight-decay 0.1 --optimizer adam --adam-betas "(0.9, 0.98)" --adam-eps 1e-06 \ + --clip-norm 0.0 \ + --lr-scheduler polynomial_decay --lr $LR --total-num-update $TOTAL_NUM_UPDATES --warmup-updates $WARMUP_UPDATES \ + --fp16 --fp16-init-scale 4 --threshold-loss-scale 1 --fp16-scale-window 128 \ + --max-epoch 10 \ + --find-unused-parameters \ + --best-checkpoint-metric accuracy --maximize-best-checkpoint-metric \ + --noise-type uniform --r3f-lambda 0.7 \ + --user-dir examples/rxf/rxf_src +``` + +## Citation +```bibtex +@article{aghajanyan2020better, + title={Better Fine-Tuning by Reducing Representational Collapse}, + author={Aghajanyan, Armen and Shrivastava, Akshat and Gupta, Anchit and Goyal, Naman and Zettlemoyer, Luke and Gupta, Sonal}, + journal={arXiv preprint arXiv:2008.03156}, + year={2020} +} +``` diff --git a/SpeechT5/fairseq/examples/rxf/__init__.py b/SpeechT5/fairseq/examples/rxf/__init__.py new file mode 100644 index 0000000..b24cb6b --- /dev/null +++ b/SpeechT5/fairseq/examples/rxf/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import rxf_src # noqa diff --git a/SpeechT5/fairseq/examples/rxf/rxf_src/__init__.py b/SpeechT5/fairseq/examples/rxf/rxf_src/__init__.py new file mode 100644 index 0000000..306e232 --- /dev/null +++ b/SpeechT5/fairseq/examples/rxf/rxf_src/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import label_smoothed_cross_entropy_r3f, sentence_prediction_r3f # noqa diff --git a/SpeechT5/fairseq/examples/rxf/rxf_src/label_smoothed_cross_entropy_r3f.py b/SpeechT5/fairseq/examples/rxf/rxf_src/label_smoothed_cross_entropy_r3f.py new file mode 100644 index 0000000..079db13 --- /dev/null +++ b/SpeechT5/fairseq/examples/rxf/rxf_src/label_smoothed_cross_entropy_r3f.py @@ -0,0 +1,157 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss + + +@register_criterion("label_smoothed_cross_entropy_r3f") +class LabelSmoothedCrossEntropyR3FCriterion(FairseqCriterion): + def __init__( + self, task, sentence_avg, label_smoothing, eps, r3f_lambda, noise_type + ): + super().__init__(task) + self.sentence_avg = sentence_avg + self.label_smoothing = label_smoothing + self.eps = eps + self.r3f_lambda = r3f_lambda + self.noise_type = noise_type + if self.noise_type in {"normal"}: + self.noise_sampler = torch.distributions.normal.Normal( + loc=0.0, scale=self.eps + ) + elif self.noise_type == "uniform": + self.noise_sampler = torch.distributions.uniform.Uniform( + low=-self.eps, high=self.eps + ) + else: + raise Exception(f"unrecognized noise type {self.noise_type}") + + @staticmethod + def add_args(parser): + """Add criterion-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--label-smoothing', default=0., type=float, metavar='D', + help='epsilon for label smoothing, 0 means no label smoothing') + parser.add_argument('--eps', type=float, default=1e-5, + help='noise eps') + parser.add_argument('--r3f-lambda', type=float, default=1.0, + help='lambda for combining logistic loss and noisy KL loss') + parser.add_argument('--noise-type', type=str, default='normal', + choices=['normal', 'uniform'], + help='type of noises') + # fmt: on + + def _get_symm_kl(self, noised_logits, input_logits): + return ( + F.kl_div( + F.log_softmax(noised_logits, dim=-1, dtype=torch.float32), + F.softmax(input_logits, dim=-1, dtype=torch.float32), + None, + None, + "sum", + ) + + F.kl_div( + F.log_softmax(input_logits, dim=-1, dtype=torch.float32), + F.softmax(noised_logits, dim=-1, dtype=torch.float32), + None, + None, + "sum", + ) + ) / noised_logits.size(0) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + token_embeddings = model.encoder.embed_tokens(sample["net_input"]["src_tokens"]) + input_logits, extra = model(**sample["net_input"]) + loss, nll_loss = self.compute_loss( + model, (input_logits, extra), sample, reduce=reduce + ) + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + + if model.training: + noise = self.noise_sampler.sample(sample_shape=token_embeddings.shape).to( + token_embeddings + ) + noised_embeddings = token_embeddings.clone() + noise + + noised_logits, _ = model( + **sample["net_input"], token_embeddings=noised_embeddings + ) + symm_kl = self._get_symm_kl(noised_logits, input_logits) + + if model.training: + symm_kl = symm_kl * sample_size + loss = loss + self.r3f_lambda * symm_kl + + logging_output = { + "loss": loss.data, + "nll_loss": nll_loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + + if model.training: + logging_output.update( + symm_kl=utils.item(symm_kl.data) if reduce else symm_kl.data + ) + + return loss, sample_size, logging_output + + def compute_loss(self, model, net_output, sample, reduce=True): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + lprobs = lprobs.view(-1, lprobs.size(-1)) + target = model.get_targets(sample, net_output).view(-1, 1) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.label_smoothing, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + nll_loss_sum = sum(log.get("nll_loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + symm_kl_sum = sum(log.get("symm_kl", 0) for log in logging_outputs) + + metrics.log_scalar("symm_kl", symm_kl_sum / sample_size, sample_size, round=3) + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "nll_loss", nll_loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/examples/rxf/rxf_src/sentence_prediction_r3f.py b/SpeechT5/fairseq/examples/rxf/rxf_src/sentence_prediction_r3f.py new file mode 100644 index 0000000..62dd633 --- /dev/null +++ b/SpeechT5/fairseq/examples/rxf/rxf_src/sentence_prediction_r3f.py @@ -0,0 +1,170 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +@register_criterion("sentence_prediction_r3f") +class SentencePredictionR3F(FairseqCriterion): + def __init__( + self, + task, + eps, + r3f_lambda, + noise_type, + classification_head_name, + regression_target, + ): + super().__init__(task) + self.eps = eps + self.r3f_lambda = r3f_lambda + self.noise_type = noise_type + self.classification_head_name = classification_head_name + self.regression_target = regression_target + if self.noise_type in {"normal"}: + self.noise_sampler = torch.distributions.normal.Normal( + loc=0.0, scale=self.eps + ) + elif self.noise_type == "uniform": + self.noise_sampler = torch.distributions.uniform.Uniform( + low=-self.eps, high=self.eps + ) + else: + raise Exception(f"unrecognized noise type {self.noise_type}") + + @staticmethod + def add_args(parser): + # fmt: off + parser.add_argument('--eps', type=float, default=1e-5, + help='noise eps') + parser.add_argument('--r3f-lambda', type=float, default=1.0, + help='lambda for combining logistic loss and noisy KL loss') + parser.add_argument('--noise-type', type=str, default='uniform', + choices=['normal', 'uniform'], + help='type of noises for RXF methods') + parser.add_argument('--classification-head-name', + default='sentence_classification_head', + help='name of the classification head to use') + # fmt: on + + def _get_symm_kl(self, noised_logits, input_logits): + return ( + F.kl_div( + F.log_softmax(noised_logits, dim=-1, dtype=torch.float32), + F.softmax(input_logits, dim=-1, dtype=torch.float32), + None, + None, + "sum", + ) + + F.kl_div( + F.log_softmax(input_logits, dim=-1, dtype=torch.float32), + F.softmax(noised_logits, dim=-1, dtype=torch.float32), + None, + None, + "sum", + ) + ) / noised_logits.size(0) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + assert ( + hasattr(model, "classification_heads") + and self.classification_head_name in model.classification_heads + ), "model must provide sentence classification head for --criterion=sentence_prediction" + + token_embeddings = model.encoder.sentence_encoder.embed_tokens( + sample["net_input"]["src_tokens"] + ) + input_logits, _ = model( + **sample["net_input"], + features_only=True, + classification_head_name=self.classification_head_name, + token_embeddings=token_embeddings, + ) + if model.training and self.noise_sampler: + noise = self.noise_sampler.sample(sample_shape=token_embeddings.shape).to( + token_embeddings + ) + noised_embeddings = token_embeddings.detach().clone() + noise + + noised_logits, _ = model( + **sample["net_input"], + features_only=True, + classification_head_name=self.classification_head_name, + token_embeddings=noised_embeddings, + ) + symm_kl = self._get_symm_kl(noised_logits, input_logits) + else: + symm_kl = 0 + + targets = model.get_targets(sample, [input_logits]).view(-1) + sample_size = targets.numel() + + if not self.regression_target: + loss = F.nll_loss( + F.log_softmax(input_logits, dim=-1, dtype=torch.float32), + targets, + reduction="sum", + ) + if model.training: + symm_kl = symm_kl * sample_size + loss = loss + self.r3f_lambda * symm_kl + else: + logits = input_logits.squeeze().float() + targets = targets.float() + loss = F.mse_loss(logits, targets, reduction="sum") + + logging_output = { + "loss": utils.item(loss.data) if reduce else loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample_size, + "sample_size": sample_size, + } + + if not self.regression_target: + preds = input_logits.max(dim=1)[1] + logging_output.update(ncorrect=(preds == targets).sum().item()) + + if model.training and self.noise_sampler: + logging_output.update( + symm_kl=utils.item(symm_kl.data) if reduce else symm_kl.data + ) + return loss, sample_size, logging_output + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + symm_kl_sum = sum(log.get("symm_kl", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + agg_output = { + "loss": loss_sum / sample_size / math.log(2), + "symm_kl": symm_kl_sum / sample_size, + "ntokens": ntokens, + "nsentences": nsentences, + "sample_size": sample_size, + } + + if len(logging_outputs) > 0 and "ncorrect" in logging_outputs[0]: + ncorrect = sum(log.get("ncorrect", 0) for log in logging_outputs) + agg_output.update(accuracy=ncorrect / nsentences) + + if sample_size != ntokens: + agg_output["nll_loss"] = loss_sum / ntokens / math.log(2) + return agg_output diff --git a/SpeechT5/fairseq/examples/scaling_nmt/README.md b/SpeechT5/fairseq/examples/scaling_nmt/README.md new file mode 100644 index 0000000..0cc3360 --- /dev/null +++ b/SpeechT5/fairseq/examples/scaling_nmt/README.md @@ -0,0 +1,114 @@ +# Scaling Neural Machine Translation (Ott et al., 2018) + +This page includes instructions for reproducing results from the paper [Scaling Neural Machine Translation (Ott et al., 2018)](https://arxiv.org/abs/1806.00187). + +## Pre-trained models + +Model | Description | Dataset | Download +---|---|---|--- +`transformer.wmt14.en-fr` | Transformer <br> ([Ott et al., 2018](https://arxiv.org/abs/1806.00187)) | [WMT14 English-French](http://statmt.org/wmt14/translation-task.html#Download) | model: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt14.en-fr.joined-dict.transformer.tar.bz2) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.en-fr.joined-dict.newstest2014.tar.bz2) +`transformer.wmt16.en-de` | Transformer <br> ([Ott et al., 2018](https://arxiv.org/abs/1806.00187)) | [WMT16 English-German](https://drive.google.com/uc?export=download&id=0B_bZck-ksdkpM25jRUN2X2UxMm8) | model: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt16.en-de.joined-dict.transformer.tar.bz2) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt16.en-de.joined-dict.newstest2014.tar.bz2) + +## Training a new model on WMT'16 En-De + +First download the [preprocessed WMT'16 En-De data provided by Google](https://drive.google.com/uc?export=download&id=0B_bZck-ksdkpM25jRUN2X2UxMm8). + +Then: + +##### 1. Extract the WMT'16 En-De data +```bash +TEXT=wmt16_en_de_bpe32k +mkdir -p $TEXT +tar -xzvf wmt16_en_de.tar.gz -C $TEXT +``` + +##### 2. Preprocess the dataset with a joined dictionary +```bash +fairseq-preprocess \ + --source-lang en --target-lang de \ + --trainpref $TEXT/train.tok.clean.bpe.32000 \ + --validpref $TEXT/newstest2013.tok.bpe.32000 \ + --testpref $TEXT/newstest2014.tok.bpe.32000 \ + --destdir data-bin/wmt16_en_de_bpe32k \ + --nwordssrc 32768 --nwordstgt 32768 \ + --joined-dictionary \ + --workers 20 +``` + +##### 3. Train a model +```bash +fairseq-train \ + data-bin/wmt16_en_de_bpe32k \ + --arch transformer_vaswani_wmt_en_de_big --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ + --lr 0.0005 --lr-scheduler inverse_sqrt --warmup-updates 4000 --warmup-init-lr 1e-07 \ + --dropout 0.3 --weight-decay 0.0 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --max-tokens 3584 \ + --fp16 +``` + +Note that the `--fp16` flag requires you have CUDA 9.1 or greater and a Volta GPU or newer. + +***IMPORTANT:*** You will get better performance by training with big batches and +increasing the learning rate. If you want to train the above model with big batches +(assuming your machine has 8 GPUs): +- add `--update-freq 16` to simulate training on 8x16=128 GPUs +- increase the learning rate; 0.001 works well for big batches + +##### 4. Evaluate + +Now we can evaluate our trained model. + +Note that the original [Attention Is All You Need](https://arxiv.org/abs/1706.03762) +paper used a couple tricks to achieve better BLEU scores. We use these same tricks in +the Scaling NMT paper, so it's important to apply them when reproducing our results. + +First, use the [average_checkpoints.py](/scripts/average_checkpoints.py) script to +average the last few checkpoints. Averaging the last 5-10 checkpoints is usually +good, but you may need to adjust this depending on how long you've trained: +```bash +python scripts/average_checkpoints \ + --inputs /path/to/checkpoints \ + --num-epoch-checkpoints 10 \ + --output checkpoint.avg10.pt +``` + +Next, generate translations using a beam width of 4 and length penalty of 0.6: +```bash +fairseq-generate \ + data-bin/wmt16_en_de_bpe32k \ + --path checkpoint.avg10.pt \ + --beam 4 --lenpen 0.6 --remove-bpe > gen.out +``` + +Finally, we apply the ["compound splitting" script](/scripts/compound_split_bleu.sh) to +add spaces around dashes. For example "Café-Liebhaber" would become three tokens: +"Café - Liebhaber". This typically results in larger BLEU scores, but it is not +appropriate to compare these inflated scores to work which does not include this trick. +This trick was used in the [original AIAYN code](https://github.com/tensorflow/tensor2tensor/blob/fc9335c0203685cbbfe2b30c92db4352d8f60779/tensor2tensor/utils/get_ende_bleu.sh), +so we used it in the Scaling NMT paper as well. That said, it's strongly advised to +report [sacrebleu](https://github.com/mjpost/sacrebleu) scores instead. + +To compute "compound split" tokenized BLEU (not recommended!): +```bash +bash scripts/compound_split_bleu.sh gen.out +# BLEU4 = 29.29, 60.3/35.0/22.8/15.3 (BP=1.000, ratio=1.004, syslen=64763, reflen=64496) +``` + +To compute detokenized BLEU with sacrebleu (preferred): +```bash +bash scripts/sacrebleu.sh wmt14/full en de gen.out +# BLEU+case.mixed+lang.en-de+numrefs.1+smooth.exp+test.wmt14/full+tok.13a+version.1.4.3 = 28.6 59.3/34.3/22.1/14.9 (BP = 1.000 ratio = 1.016 hyp_len = 63666 ref_len = 62688) +``` + +## Citation + +```bibtex +@inproceedings{ott2018scaling, + title = {Scaling Neural Machine Translation}, + author = {Ott, Myle and Edunov, Sergey and Grangier, David and Auli, Michael}, + booktitle = {Proceedings of the Third Conference on Machine Translation (WMT)}, + year = 2018, +} +``` diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/README.md b/SpeechT5/fairseq/examples/simultaneous_translation/README.md new file mode 100644 index 0000000..62a005e --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/README.md @@ -0,0 +1,5 @@ +# Simultaneous Translation +Examples of simultaneous translation in fairseq +- [English-to-Japanese text-to-text wait-k model](docs/enja-waitk.md) +- [English-to-Germen text-to-text monotonic multihead attention model](docs/ende-mma.md) +- [English-to-Germen speech-to-text simultaneous translation model](../speech_to_text/docs/simulst_mustc_example.md) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/__init__.py b/SpeechT5/fairseq/examples/simultaneous_translation/__init__.py new file mode 100644 index 0000000..5835316 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import models # noqa diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/docs/ende-mma.md b/SpeechT5/fairseq/examples/simultaneous_translation/docs/ende-mma.md new file mode 100644 index 0000000..241d604 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/docs/ende-mma.md @@ -0,0 +1,74 @@ +# Simultaneous Machine Translation + +This directory contains the code for the paper [Monotonic Multihead Attention](https://openreview.net/forum?id=Hyg96gBKPS) + +## Prepare Data + +[Please follow the instructions to download and preprocess the WMT'15 En-De dataset.](https://github.com/pytorch/fairseq/tree/simulastsharedtask/examples/translation#prepare-wmt14en2desh) + +Another example of training an English to Japanese model can be found [here](docs/enja.md) + +## Training + +- MMA-IL + +```shell +fairseq-train \ + data-bin/wmt15_en_de_32k \ + --simul-type infinite_lookback \ + --user-dir $FAIRSEQ/example/simultaneous_translation \ + --mass-preservation \ + --criterion latency_augmented_label_smoothed_cross_entropy \ + --latency-weight-avg 0.1 \ + --max-update 50000 \ + --arch transformer_monotonic_iwslt_de_en save_dir_key=lambda \ + --optimizer adam --adam-betas '(0.9, 0.98)' \ + --lr-scheduler 'inverse_sqrt' \ + --warmup-init-lr 1e-7 --warmup-updates 4000 \ + --lr 5e-4 --stop-min-lr 1e-9 --clip-norm 0.0 --weight-decay 0.0001\ + --dropout 0.3 \ + --label-smoothing 0.1\ + --max-tokens 3584 +``` + +- MMA-H + +```shell +fairseq-train \ + data-bin/wmt15_en_de_32k \ + --simul-type hard_aligned \ + --user-dir $FAIRSEQ/example/simultaneous_translation \ + --mass-preservation \ + --criterion latency_augmented_label_smoothed_cross_entropy \ + --latency-weight-var 0.1 \ + --max-update 50000 \ + --arch transformer_monotonic_iwslt_de_en save_dir_key=lambda \ + --optimizer adam --adam-betas '(0.9, 0.98)' \ + --lr-scheduler 'inverse_sqrt' \ + --warmup-init-lr 1e-7 --warmup-updates 4000 \ + --lr 5e-4 --stop-min-lr 1e-9 --clip-norm 0.0 --weight-decay 0.0001\ + --dropout 0.3 \ + --label-smoothing 0.1\ + --max-tokens 3584 +``` + +- wait-k + +```shell +fairseq-train \ + data-bin/wmt15_en_de_32k \ + --simul-type wait-k \ + --waitk-lagging 3 \ + --user-dir $FAIRSEQ/example/simultaneous_translation \ + --mass-preservation \ + --criterion latency_augmented_label_smoothed_cross_entropy \ + --max-update 50000 \ + --arch transformer_monotonic_iwslt_de_en save_dir_key=lambda \ + --optimizer adam --adam-betas '(0.9, 0.98)' \ + --lr-scheduler 'inverse_sqrt' \ + --warmup-init-lr 1e-7 --warmup-updates 4000 \ + --lr 5e-4 --stop-min-lr 1e-9 --clip-norm 0.0 --weight-decay 0.0001\ + --dropout 0.3 \ + --label-smoothing 0.1\ + --max-tokens 3584 +``` diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/docs/enja-waitk.md b/SpeechT5/fairseq/examples/simultaneous_translation/docs/enja-waitk.md new file mode 100644 index 0000000..fb9d825 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/docs/enja-waitk.md @@ -0,0 +1,106 @@ +# An example of English to Japaneses Simultaneous Translation System + +This is an example of training and evaluating a transformer *wait-k* English to Japanese simultaneous text-to-text translation model. + +## Data Preparation +This section introduces the data preparation for training and evaluation. +If you only want to evaluate the model, please jump to [Inference & Evaluation](#inference-&-evaluation) + +For illustration, we only use the following subsets of the available data from [WMT20 news translation task](http://www.statmt.org/wmt20/translation-task.html), which results in 7,815,391 sentence pairs. +- News Commentary v16 +- Wiki Titles v3 +- WikiMatrix V1 +- Japanese-English Subtitle Corpus +- The Kyoto Free Translation Task Corpus + +We use WMT20 development data as development set. Training `transformer_vaswani_wmt_en_de_big` model on such amount of data will result in 17.3 BLEU with greedy search and 19.7 with beam (10) search. Notice that a better performance can be achieved with the full WMT training data. + +We use [sentencepiece](https://github.com/google/sentencepiece) toolkit to tokenize the data with a vocabulary size of 32000. +Additionally, we filtered out the sentences longer than 200 words after tokenization. +Assuming the tokenized text data is saved at `${DATA_DIR}`, +we prepare the data binary with the following command. + +```bash +fairseq-preprocess \ + --source-lang en --target-lang ja \ + --trainpref ${DATA_DIR}/train \ + --validpref ${DATA_DIR}/dev \ + --testpref ${DATA_DIR}/test \ + --destdir ${WMT20_ENJA_DATA_BIN} \ + --nwordstgt 32000 --nwordssrc 32000 \ + --workers 20 +``` + +## Simultaneous Translation Model Training +To train a wait-k `(k=10)` model. +```bash +fairseq-train ${WMT20_ENJA_DATA_BIN} \ + --save-dir ${SAVEDIR} + --simul-type waitk \ + --waitk-lagging 10 \ + --max-epoch 70 \ + --arch transformer_monotonic_vaswani_wmt_en_de_big \ + --optimizer adam \ + --adam-betas '(0.9, 0.98)' \ + --lr-scheduler inverse_sqrt \ + --warmup-init-lr 1e-07 \ + --warmup-updates 4000 \ + --lr 0.0005 \ + --stop-min-lr 1e-09 \ + --clip-norm 10.0 \ + --dropout 0.3 \ + --weight-decay 0.0 \ + --criterion label_smoothed_cross_entropy \ + --label-smoothing 0.1 \ + --max-tokens 3584 +``` +This command is for training on 8 GPUs. Equivalently, the model can be trained on one GPU with `--update-freq 8`. + +## Inference & Evaluation +First of all, install [SimulEval](https://github.com/facebookresearch/SimulEval) for evaluation. + +```bash +git clone https://github.com/facebookresearch/SimulEval.git +cd SimulEval +pip install -e . +``` + +The following command is for the evaluation. +Assuming the source and reference files are `${SRC_FILE}` and `${REF_FILE}`, the sentencepiece model file for English is saved at `${SRC_SPM_PATH}` + + +```bash +simuleval \ + --source ${SRC_FILE} \ + --target ${TGT_FILE} \ + --data-bin ${WMT20_ENJA_DATA_BIN} \ + --sacrebleu-tokenizer ja-mecab \ + --eval-latency-unit char \ + --no-space \ + --src-splitter-type sentencepiecemodel \ + --src-splitter-path ${SRC_SPM_PATH} \ + --agent ${FAIRSEQ}/examples/simultaneous_translation/agents/simul_trans_text_agent_enja.py \ + --model-path ${SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --output ${OUTPUT} \ + --scores +``` + +The `--data-bin` should be the same in previous sections if you prepare the data from the scratch. +If only for evaluation, a prepared data directory can be found [here](https://dl.fbaipublicfiles.com/simultaneous_translation/wmt20_enja_medium_databin.tgz) and a pretrained checkpoint (wait-k=10 model) can be downloaded from [here](https://dl.fbaipublicfiles.com/simultaneous_translation/wmt20_enja_medium_wait10_ckpt.pt). + +The output should look like this: +```bash +{ + "Quality": { + "BLEU": 11.442253287568398 + }, + "Latency": { + "AL": 8.6587861866951, + "AP": 0.7863304776251316, + "DAL": 9.477850951194764 + } +} +``` +The latency is evaluated by characters (`--eval-latency-unit`) on the target side. The latency is evaluated with `sacrebleu` with `MeCab` tokenizer `--sacrebleu-tokenizer ja-mecab`. `--no-space` indicates that do not add space when merging the predicted words. + +If `--output ${OUTPUT}` option is used, the detailed log and scores will be stored under the `${OUTPUT}` directory. diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/eval/agents/simul_t2t_enja.py b/SpeechT5/fairseq/examples/simultaneous_translation/eval/agents/simul_t2t_enja.py new file mode 100644 index 0000000..8f3c870 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/eval/agents/simul_t2t_enja.py @@ -0,0 +1,226 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os + +from fairseq import checkpoint_utils, tasks +import sentencepiece as spm +import torch + +try: + from simuleval import READ_ACTION, WRITE_ACTION, DEFAULT_EOS + from simuleval.agents import TextAgent +except ImportError: + print("Please install simuleval 'pip install simuleval'") + + +BOS_PREFIX = "\u2581" + + +class SimulTransTextAgentJA(TextAgent): + """ + Simultaneous Translation + Text agent for Japanese + """ + def __init__(self, args): + + # Whether use gpu + self.gpu = getattr(args, "gpu", False) + + # Max len + self.max_len = args.max_len + + # Load Model + self.load_model_vocab(args) + + # build word splitter + self.build_word_splitter(args) + + self.eos = DEFAULT_EOS + + def initialize_states(self, states): + states.incremental_states = dict() + states.incremental_states["online"] = dict() + + def to_device(self, tensor): + if self.gpu: + return tensor.cuda() + else: + return tensor.cpu() + + def load_model_vocab(self, args): + + filename = args.model_path + if not os.path.exists(filename): + raise IOError("Model file not found: {}".format(filename)) + + state = checkpoint_utils.load_checkpoint_to_cpu(filename) + + task_args = state["cfg"]["task"] + task_args.data = args.data_bin + + task = tasks.setup_task(task_args) + + # build model for ensemble + state["cfg"]["model"].load_pretrained_encoder_from = None + state["cfg"]["model"].load_pretrained_decoder_from = None + + self.model = task.build_model(state["cfg"]["model"]) + self.model.load_state_dict(state["model"], strict=True) + self.model.eval() + self.model.share_memory() + + if self.gpu: + self.model.cuda() + + # Set dictionary + self.dict = {} + self.dict["tgt"] = task.target_dictionary + self.dict["src"] = task.source_dictionary + + @staticmethod + def add_args(parser): + # fmt: off + parser.add_argument('--model-path', type=str, required=True, + help='path to your pretrained model.') + parser.add_argument("--data-bin", type=str, required=True, + help="Path of data binary") + parser.add_argument("--max-len", type=int, default=100, + help="Max length of translation") + parser.add_argument("--tgt-splitter-type", type=str, default="SentencePiece", + help="Subword splitter type for target text.") + parser.add_argument("--tgt-splitter-path", type=str, default=None, + help="Subword splitter model path for target text.") + parser.add_argument("--src-splitter-type", type=str, default="SentencePiece", + help="Subword splitter type for source text.") + parser.add_argument("--src-splitter-path", type=str, default=None, + help="Subword splitter model path for source text.") + # fmt: on + return parser + + def build_word_splitter(self, args): + self.spm = {} + for lang in ['src', 'tgt']: + if getattr(args, f'{lang}_splitter_type', None): + path = getattr(args, f'{lang}_splitter_path', None) + if path: + self.spm[lang] = spm.SentencePieceProcessor() + self.spm[lang].Load(path) + + def segment_to_units(self, segment, states): + # Split a full word (segment) into subwords (units) + return self.spm['src'].EncodeAsPieces(segment) + + def update_model_encoder(self, states): + if len(states.units.source) == 0: + return + + src_indices = [ + self.dict['src'].index(x) + for x in states.units.source.value + ] + + if states.finish_read(): + # Append the eos index when the prediction is over + src_indices += [self.dict["tgt"].eos_index] + + src_indices = self.to_device( + torch.LongTensor(src_indices).unsqueeze(0) + ) + src_lengths = self.to_device( + torch.LongTensor([src_indices.size(1)]) + ) + + states.encoder_states = self.model.encoder(src_indices, src_lengths) + + torch.cuda.empty_cache() + + def update_states_read(self, states): + # Happens after a read action. + self.update_model_encoder(states) + + def units_to_segment(self, units, states): + # Merge sub words (units) to full word (segment). + # For Japanese, we can directly send + # the untokenized token to server except the BOS token + # with following option + # --sacrebleu-tokenizer MeCab + # --eval-latency-unit char + # --no-space + token = units.value.pop() + + if ( + token == self.dict["tgt"].eos_word + or len(states.segments.target) > self.max_len + ): + return DEFAULT_EOS + + if BOS_PREFIX == token: + return None + if token[0] == BOS_PREFIX: + return token[1:] + else: + return token + + def policy(self, states): + + if not getattr(states, "encoder_states", None): + # No encoder states, read a token first + return READ_ACTION + + # encode previous predicted target tokens + tgt_indices = self.to_device( + torch.LongTensor( + [self.model.decoder.dictionary.eos()] + + [ + self.dict['tgt'].index(x) + for x in states.units.target.value + if x is not None + ] + ).unsqueeze(0) + ) + + # Current steps + states.incremental_states["steps"] = { + "src": states.encoder_states["encoder_out"][0].size(0), + "tgt": 1 + len(states.units.target), + } + + # Online only means the reading is not finished + states.incremental_states["online"]["only"] = ( + torch.BoolTensor([not states.finish_read()]) + ) + + x, outputs = self.model.decoder.forward( + prev_output_tokens=tgt_indices, + encoder_out=states.encoder_states, + incremental_state=states.incremental_states, + ) + + states.decoder_out = x + + torch.cuda.empty_cache() + + if outputs.action == 0: + return READ_ACTION + else: + return WRITE_ACTION + + def predict(self, states): + # Predict target token from decoder states + decoder_states = states.decoder_out + + lprobs = self.model.get_normalized_probs( + [decoder_states[:, -1:]], log_probs=True + ) + + index = lprobs.argmax(dim=-1)[0, 0].item() + + if index != self.dict['tgt'].eos_index: + token = self.dict['tgt'].string([index]) + else: + token = self.dict['tgt'].eos_word + + return token diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/models/__init__.py b/SpeechT5/fairseq/examples/simultaneous_translation/models/__init__.py new file mode 100644 index 0000000..257a965 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/models/__init__.py @@ -0,0 +1,15 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import os + + +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + model_name = file[: file.find(".py")] + importlib.import_module( + "examples.simultaneous_translation.models." + model_name + ) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/models/convtransformer_simul_trans.py b/SpeechT5/fairseq/examples/simultaneous_translation/models/convtransformer_simul_trans.py new file mode 100644 index 0000000..4a26422 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/models/convtransformer_simul_trans.py @@ -0,0 +1,204 @@ +# Copyright (c) 2017-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the LICENSE file in +# the root directory of this source tree. An additional grant of patent rights +# can be found in the PATENTS file in the same directory. + +from fairseq import checkpoint_utils +from fairseq.models import ( + register_model, + register_model_architecture, +) +from fairseq.models.speech_to_text import ( + ConvTransformerModel, + convtransformer_espnet, + ConvTransformerEncoder, +) +from fairseq.models.speech_to_text.modules.augmented_memory_attention import ( + augmented_memory, + SequenceEncoder, + AugmentedMemoryConvTransformerEncoder, +) + +from torch import nn, Tensor +from typing import Dict, List +from fairseq.models.speech_to_text.modules.emformer import NoSegAugmentedMemoryTransformerEncoderLayer + +@register_model("convtransformer_simul_trans") +class SimulConvTransformerModel(ConvTransformerModel): + """ + Implementation of the paper: + + SimulMT to SimulST: Adapting Simultaneous Text Translation to + End-to-End Simultaneous Speech Translation + + https://www.aclweb.org/anthology/2020.aacl-main.58.pdf + """ + + @staticmethod + def add_args(parser): + super(SimulConvTransformerModel, SimulConvTransformerModel).add_args(parser) + parser.add_argument( + "--train-monotonic-only", + action="store_true", + default=False, + help="Only train monotonic attention", + ) + + @classmethod + def build_decoder(cls, args, task, embed_tokens): + tgt_dict = task.tgt_dict + + from examples.simultaneous_translation.models.transformer_monotonic_attention import ( + TransformerMonotonicDecoder, + ) + + decoder = TransformerMonotonicDecoder(args, tgt_dict, embed_tokens) + + if getattr(args, "load_pretrained_decoder_from", None): + decoder = checkpoint_utils.load_pretrained_component_from_model( + component=decoder, checkpoint=args.load_pretrained_decoder_from + ) + return decoder + + +@register_model_architecture( + "convtransformer_simul_trans", "convtransformer_simul_trans_espnet" +) +def convtransformer_simul_trans_espnet(args): + convtransformer_espnet(args) + + +@register_model("convtransformer_augmented_memory") +@augmented_memory +class AugmentedMemoryConvTransformerModel(SimulConvTransformerModel): + @classmethod + def build_encoder(cls, args): + encoder = SequenceEncoder(args, AugmentedMemoryConvTransformerEncoder(args)) + + if getattr(args, "load_pretrained_encoder_from", None) is not None: + encoder = checkpoint_utils.load_pretrained_component_from_model( + component=encoder, checkpoint=args.load_pretrained_encoder_from + ) + + return encoder + + +@register_model_architecture( + "convtransformer_augmented_memory", "convtransformer_augmented_memory" +) +def augmented_memory_convtransformer_espnet(args): + convtransformer_espnet(args) + + +# ============================================================================ # +# Convtransformer +# with monotonic attention decoder +# with emformer encoder +# ============================================================================ # + + +class ConvTransformerEmformerEncoder(ConvTransformerEncoder): + def __init__(self, args): + super().__init__(args) + stride = self.conv_layer_stride(args) + trf_left_context = args.segment_left_context // stride + trf_right_context = args.segment_right_context // stride + context_config = [trf_left_context, trf_right_context] + self.transformer_layers = nn.ModuleList( + [ + NoSegAugmentedMemoryTransformerEncoderLayer( + input_dim=args.encoder_embed_dim, + num_heads=args.encoder_attention_heads, + ffn_dim=args.encoder_ffn_embed_dim, + num_layers=args.encoder_layers, + dropout_in_attn=args.dropout, + dropout_on_attn=args.dropout, + dropout_on_fc1=args.dropout, + dropout_on_fc2=args.dropout, + activation_fn=args.activation_fn, + context_config=context_config, + segment_size=args.segment_length, + max_memory_size=args.max_memory_size, + scaled_init=True, # TODO: use constant for now. + tanh_on_mem=args.amtrf_tanh_on_mem, + ) + ] + ) + self.conv_transformer_encoder = ConvTransformerEncoder(args) + + def forward(self, src_tokens, src_lengths): + encoder_out: Dict[str, List[Tensor]] = self.conv_transformer_encoder(src_tokens, src_lengths.to(src_tokens.device)) + output = encoder_out["encoder_out"][0] + encoder_padding_masks = encoder_out["encoder_padding_mask"] + + return { + "encoder_out": [output], + # This is because that in the original implementation + # the output didn't consider the last segment as right context. + "encoder_padding_mask": [encoder_padding_masks[0][:, : output.size(0)]] if len(encoder_padding_masks) > 0 + else [], + "encoder_embedding": [], + "encoder_states": [], + "src_tokens": [], + "src_lengths": [], + } + + @staticmethod + def conv_layer_stride(args): + # TODO: make it configurable from the args + return 4 + + +@register_model("convtransformer_emformer") +class ConvtransformerEmformer(SimulConvTransformerModel): + @staticmethod + def add_args(parser): + super(ConvtransformerEmformer, ConvtransformerEmformer).add_args(parser) + + parser.add_argument( + "--segment-length", + type=int, + metavar="N", + help="length of each segment (not including left context / right context)", + ) + parser.add_argument( + "--segment-left-context", + type=int, + help="length of left context in a segment", + ) + parser.add_argument( + "--segment-right-context", + type=int, + help="length of right context in a segment", + ) + parser.add_argument( + "--max-memory-size", + type=int, + default=-1, + help="Right context for the segment.", + ) + parser.add_argument( + "--amtrf-tanh-on-mem", + default=False, + action="store_true", + help="whether to use tanh on memory vector", + ) + + @classmethod + def build_encoder(cls, args): + encoder = ConvTransformerEmformerEncoder(args) + if getattr(args, "load_pretrained_encoder_from", None): + encoder = checkpoint_utils.load_pretrained_component_from_model( + component=encoder, checkpoint=args.load_pretrained_encoder_from + ) + return encoder + + +@register_model_architecture( + "convtransformer_emformer", + "convtransformer_emformer", +) +def convtransformer_emformer_base(args): + convtransformer_espnet(args) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/models/transformer_monotonic_attention.py b/SpeechT5/fairseq/examples/simultaneous_translation/models/transformer_monotonic_attention.py new file mode 100644 index 0000000..1062e9b --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/models/transformer_monotonic_attention.py @@ -0,0 +1,315 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, List, NamedTuple, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from examples.simultaneous_translation.modules.monotonic_transformer_layer import ( + TransformerMonotonicDecoderLayer, + TransformerMonotonicEncoderLayer, +) +from fairseq.models import ( + register_model, + register_model_architecture, +) +from fairseq.models.transformer import ( + TransformerModel, + TransformerEncoder, + TransformerDecoder, + base_architecture, + transformer_iwslt_de_en, + transformer_vaswani_wmt_en_de_big, + transformer_vaswani_wmt_en_fr_big, +) +from torch import Tensor + +DEFAULT_MAX_SOURCE_POSITIONS = 1024 +DEFAULT_MAX_TARGET_POSITIONS = 1024 + +TransformerMonotonicDecoderOut = NamedTuple( + "TransformerMonotonicDecoderOut", + [ + ("action", int), + ("attn_list", Optional[List[Optional[Dict[str, Tensor]]]]), + ("step_list", Optional[List[Optional[Tensor]]]), + ("encoder_out", Optional[Dict[str, List[Tensor]]]), + ("encoder_padding_mask", Optional[Tensor]), + ], +) + + +@register_model("transformer_unidirectional") +class TransformerUnidirectionalModel(TransformerModel): + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return TransformerMonotonicEncoder(args, src_dict, embed_tokens) + + +@register_model("transformer_monotonic") +class TransformerModelSimulTrans(TransformerModel): + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return TransformerMonotonicEncoder(args, src_dict, embed_tokens) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + return TransformerMonotonicDecoder(args, tgt_dict, embed_tokens) + + def _indices_from_states(self, states): + if type(states["indices"]["src"]) == list: + if next(self.parameters()).is_cuda: + tensor = torch.cuda.LongTensor + else: + tensor = torch.LongTensor + + src_indices = tensor( + [states["indices"]["src"][: 1 + states["steps"]["src"]]] + ) + + tgt_indices = tensor( + [[self.decoder.dictionary.eos()] + states["indices"]["tgt"]] + ) + else: + src_indices = states["indices"]["src"][: 1 + states["steps"]["src"]] + tgt_indices = states["indices"]["tgt"] + + return src_indices, None, tgt_indices + + +class TransformerMonotonicEncoder(TransformerEncoder): + def __init__(self, args, dictionary, embed_tokens): + super().__init__(args, dictionary, embed_tokens) + + self.dictionary = dictionary + self.layers = nn.ModuleList([]) + self.layers.extend( + [TransformerMonotonicEncoderLayer(args) for i in range(args.encoder_layers)] + ) + + +class TransformerMonotonicDecoder(TransformerDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__(self, args, dictionary, embed_tokens, no_encoder_attn=False): + super().__init__(args, dictionary, embed_tokens, no_encoder_attn=False) + + self.dictionary = dictionary + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + TransformerMonotonicDecoderLayer(args, no_encoder_attn) + for _ in range(args.decoder_layers) + ] + ) + + def pre_attention( + self, + prev_output_tokens, + encoder_out_dict: Dict[str, List[Tensor]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + ): + positions = ( + self.embed_positions( + prev_output_tokens, + incremental_state=incremental_state, + ) + if self.embed_positions is not None + else None + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + encoder_out = encoder_out_dict["encoder_out"][0] + encoder_padding_mask = ( + encoder_out_dict["encoder_padding_mask"][0] + if encoder_out_dict["encoder_padding_mask"] + and len(encoder_out_dict["encoder_padding_mask"]) > 0 + else None + ) + + return x, encoder_out, encoder_padding_mask + + def post_attention(self, x): + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x + + def clear_cache( + self, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], + end_id: Optional[int] = None, + ): + """ + Clear cache in the monotonic layers. + The cache is generated because of a forward pass of decode but no prediction. + end_id is the last idx of the layers + """ + if end_id is None: + end_id = len(self.layers) + + for index, layer in enumerate(self.layers): + if index < end_id: + layer.prune_incremental_state(incremental_state) + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, # unused + alignment_layer: Optional[int] = None, # unused + alignment_heads: Optional[int] = None, # unsed + ): + """ + Similar to *forward* but only return features. + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + # incremental_state = None + assert encoder_out is not None + (x, encoder_outs, encoder_padding_mask) = self.pre_attention( + prev_output_tokens, encoder_out, incremental_state + ) + attn = None + inner_states = [x] + attn_list: List[Optional[Dict[str, Tensor]]] = [] + step_list: List[Optional[Tensor]] = [] + + for i, layer in enumerate(self.layers): + + x, attn, _ = layer( + x=x, + encoder_out=encoder_outs, + encoder_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + self_attn_mask=self.buffered_future_mask(x) + if incremental_state is None + else None, + ) + + inner_states.append(x) + attn_list.append(attn) + + if incremental_state is not None: + curr_steps = layer.get_head_steps(incremental_state) + step_list.append(curr_steps) + if_online = incremental_state["online"]["only"] + assert if_online is not None + if if_online.to(torch.bool): + # Online indicates that the encoder states are still changing + assert attn is not None + assert curr_steps is not None + p_choose = ( + attn["p_choose"].squeeze(0).squeeze(1).gather(1, curr_steps.t()) + ) + + new_steps = curr_steps + (p_choose < 0.5).t().type_as(curr_steps) + src = incremental_state["steps"]["src"] + assert src is not None + + if (new_steps >= src).any(): + # We need to prune the last self_attn saved_state + # if model decide not to read + # otherwise there will be duplicated saved_state + self.clear_cache(incremental_state, i + 1) + + return x, TransformerMonotonicDecoderOut( + action=0, + attn_list=None, + step_list=None, + encoder_out=None, + encoder_padding_mask=None, + ) + + x = self.post_attention(x) + + return x, TransformerMonotonicDecoderOut( + action=1, + attn_list=attn_list, + step_list=step_list, + encoder_out=encoder_out, + encoder_padding_mask=encoder_padding_mask, + ) + + def reorder_incremental_state(self, incremental_state, new_order): + super().reorder_incremental_state(incremental_state, new_order) + if "fastest_step" in incremental_state: + incremental_state["fastest_step"] = incremental_state[ + "fastest_step" + ].index_select(0, new_order) + + +@register_model_architecture("transformer_monotonic", "transformer_monotonic") +def base_monotonic_architecture(args): + base_architecture(args) + args.encoder_unidirectional = getattr(args, "encoder_unidirectional", False) + + +@register_model_architecture( + "transformer_monotonic", "transformer_monotonic_iwslt_de_en" +) +def transformer_monotonic_iwslt_de_en(args): + transformer_iwslt_de_en(args) + base_monotonic_architecture(args) + + +# parameters used in the "Attention Is All You Need" paper (Vaswani et al., 2017) +@register_model_architecture( + "transformer_monotonic", "transformer_monotonic_vaswani_wmt_en_de_big" +) +def transformer_monotonic_vaswani_wmt_en_de_big(args): + transformer_vaswani_wmt_en_de_big(args) + + +@register_model_architecture( + "transformer_monotonic", "transformer_monotonic_vaswani_wmt_en_fr_big" +) +def transformer_monotonic_vaswani_wmt_en_fr_big(args): + transformer_monotonic_vaswani_wmt_en_fr_big(args) + + +@register_model_architecture( + "transformer_unidirectional", "transformer_unidirectional_iwslt_de_en" +) +def transformer_unidirectional_iwslt_de_en(args): + transformer_iwslt_de_en(args) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/modules/__init__.py b/SpeechT5/fairseq/examples/simultaneous_translation/modules/__init__.py new file mode 100644 index 0000000..c695850 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/modules/__init__.py @@ -0,0 +1,24 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import os + +from fairseq import registry + + +( + build_monotonic_attention, + register_monotonic_attention, + MONOTONIC_ATTENTION_REGISTRY, + _, +) = registry.setup_registry("--simul-type") + +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + model_name = file[: file.find(".py")] + importlib.import_module( + "examples.simultaneous_translation.modules." + model_name + ) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/modules/fixed_pre_decision.py b/SpeechT5/fairseq/examples/simultaneous_translation/modules/fixed_pre_decision.py new file mode 100644 index 0000000..dd29c03 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/modules/fixed_pre_decision.py @@ -0,0 +1,254 @@ +from functools import partial + +import torch +from torch import Tensor +import math +import torch.nn.functional as F + +from . import register_monotonic_attention +from .monotonic_multihead_attention import ( + MonotonicMultiheadAttentionWaitK, + MonotonicMultiheadAttentionHardAligned, + MonotonicMultiheadAttentionInfiniteLookback, +) +from typing import Dict, Optional +from examples.simultaneous_translation.utils import p_choose_strategy + +def fixed_pooling_monotonic_attention(monotonic_attention): + def create_model(monotonic_attention, klass): + class FixedStrideMonotonicAttention(monotonic_attention): + def __init__(self, args): + self.waitk_lagging = 0 + self.num_heads = 0 + self.noise_mean = 0.0 + self.noise_var = 0.0 + super().__init__(args) + self.pre_decision_type = args.fixed_pre_decision_type + self.pre_decision_ratio = args.fixed_pre_decision_ratio + self.pre_decision_pad_threshold = args.fixed_pre_decision_pad_threshold + if self.pre_decision_ratio == 1: + return + + self.strategy = args.simul_type + + if args.fixed_pre_decision_type == "average": + self.pooling_layer = torch.nn.AvgPool1d( + kernel_size=self.pre_decision_ratio, + stride=self.pre_decision_ratio, + ceil_mode=True, + ) + elif args.fixed_pre_decision_type == "last": + + def last(key): + if key.size(2) < self.pre_decision_ratio: + return key + else: + k = key[ + :, + :, + self.pre_decision_ratio - 1 :: self.pre_decision_ratio, + ].contiguous() + if key.size(-1) % self.pre_decision_ratio != 0: + k = torch.cat([k, key[:, :, -1:]], dim=-1).contiguous() + return k + + self.pooling_layer = last + else: + raise NotImplementedError + + @staticmethod + def add_args(parser): + super( + FixedStrideMonotonicAttention, FixedStrideMonotonicAttention + ).add_args(parser) + parser.add_argument( + "--fixed-pre-decision-ratio", + type=int, + required=True, + help=( + "Ratio for the fixed pre-decision," + "indicating how many encoder steps will start" + "simultaneous decision making process." + ), + ) + parser.add_argument( + "--fixed-pre-decision-type", + default="average", + choices=["average", "last"], + help="Pooling type", + ) + parser.add_argument( + "--fixed-pre-decision-pad-threshold", + type=float, + default=0.3, + help="If a part of the sequence has pad" + ",the threshold the pooled part is a pad.", + ) + + def insert_zeros(self, x): + bsz_num_heads, tgt_len, src_len = x.size() + stride = self.pre_decision_ratio + weight = F.pad(torch.ones(1, 1, 1).to(x), (stride - 1, 0)) + x_upsample = F.conv_transpose1d( + x.view(-1, src_len).unsqueeze(1), + weight, + stride=stride, + padding=0, + ) + return x_upsample.squeeze(1).view(bsz_num_heads, tgt_len, -1) + + def p_choose_waitk( + self, query, key, key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None + ): + """ + query: bsz, tgt_len + key: bsz, src_len + key_padding_mask: bsz, src_len + """ + if incremental_state is not None: + # Retrieve target length from incremental states + # For inference the length of query is always 1 + tgt = incremental_state["steps"]["tgt"] + assert tgt is not None + tgt_len = int(tgt) + else: + tgt_len, bsz, _ = query.size() + + src_len, bsz, _ = key.size() + + p_choose = torch.ones(bsz, tgt_len, src_len).to(query) + p_choose = torch.tril(p_choose, diagonal=self.waitk_lagging - 1) + p_choose = torch.triu(p_choose, diagonal=self.waitk_lagging - 1) + + if incremental_state is not None: + p_choose = p_choose[:, -1:] + tgt_len = 1 + + # Extend to each head + p_choose = ( + p_choose.contiguous() + .unsqueeze(1) + .expand(-1, self.num_heads, -1, -1) + .contiguous() + .view(-1, tgt_len, src_len) + ) + + return p_choose + + def p_choose( + self, + query: Optional[Tensor], + key: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + ): + assert key is not None + assert query is not None + src_len = key.size(0) + tgt_len = query.size(0) + batch_size = query.size(1) + + if self.pre_decision_ratio == 1: + if self.strategy == "waitk": + return p_choose_strategy.waitk( + query, + key, + self.waitk_lagging, + self.num_heads, + key_padding_mask, + incremental_state=incremental_state, + ) + else: # hard_aligned or infinite_lookback + q_proj, k_proj, _ = self.input_projections(query, key, None, "monotonic") + attn_energy = self.attn_energy(q_proj, k_proj, key_padding_mask) + return p_choose_strategy.hard_aligned( + q_proj, + k_proj, + attn_energy, + self.noise_mean, + self.noise_var, + self.training + ) + + key_pool = self.pooling_layer(key.transpose(0, 2)).transpose(0, 2) + + if key_padding_mask is not None: + key_padding_mask_pool = ( + self.pooling_layer(key_padding_mask.unsqueeze(0).float()) + .squeeze(0) + .gt(self.pre_decision_pad_threshold) + ) + # Make sure at least one element is not pad + key_padding_mask_pool[:, 0] = 0 + else: + key_padding_mask_pool = None + + if incremental_state is not None: + # The floor instead of ceil is used for inference + # But make sure the length key_pool at least 1 + if ( + max(1, math.floor(key.size(0) / self.pre_decision_ratio)) + ) < key_pool.size(0): + key_pool = key_pool[:-1] + if key_padding_mask_pool is not None: + key_padding_mask_pool = key_padding_mask_pool[:-1] + + p_choose_pooled = self.p_choose_waitk( + query, + key_pool, + key_padding_mask_pool, + incremental_state=incremental_state, + ) + + # Upsample, interpolate zeros + p_choose = self.insert_zeros(p_choose_pooled) + + if p_choose.size(-1) < src_len: + # Append zeros if the upsampled p_choose is shorter than src_len + p_choose = torch.cat( + [ + p_choose, + torch.zeros( + p_choose.size(0), + tgt_len, + src_len - p_choose.size(-1) + ).to(p_choose) + ], + dim=2 + ) + else: + # can be larger than src_len because we used ceil before + p_choose = p_choose[:, :, :src_len] + p_choose[:, :, -1] = p_choose_pooled[:, :, -1] + + assert list(p_choose.size()) == [ + batch_size * self.num_heads, + tgt_len, + src_len, + ] + + return p_choose + + FixedStrideMonotonicAttention.__name__ = klass.__name__ + return FixedStrideMonotonicAttention + + return partial(create_model, monotonic_attention) + + +@register_monotonic_attention("waitk_fixed_pre_decision") +@fixed_pooling_monotonic_attention(MonotonicMultiheadAttentionWaitK) +class MonotonicMultiheadAttentionWaitkFixedStride: + pass + + +@register_monotonic_attention("hard_aligned_fixed_pre_decision") +@fixed_pooling_monotonic_attention(MonotonicMultiheadAttentionHardAligned) +class MonotonicMultiheadAttentionHardFixedStride: + pass + + +@register_monotonic_attention("infinite_lookback_fixed_pre_decision") +@fixed_pooling_monotonic_attention(MonotonicMultiheadAttentionInfiniteLookback) +class MonotonicMultiheadAttentionInfiniteLookbackFixedStride: + pass diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_multihead_attention.py b/SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_multihead_attention.py new file mode 100644 index 0000000..f49b1da --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_multihead_attention.py @@ -0,0 +1,910 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +from torch import Tensor +import torch.nn as nn + +from examples.simultaneous_translation.utils.functions import ( + exclusive_cumprod, + lengths_to_mask, +) +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules import MultiheadAttention + +from . import register_monotonic_attention +from typing import Dict, Optional + +from examples.simultaneous_translation.utils import p_choose_strategy + +@with_incremental_state +class MonotonicAttention(nn.Module): + """ + Abstract class of monotonic attentions + """ + + def __init__(self, args): + self.eps = args.attention_eps + self.mass_preservation = args.mass_preservation + + self.noise_type = args.noise_type + self.noise_mean = args.noise_mean + self.noise_var = args.noise_var + + self.energy_bias_init = args.energy_bias_init + self.energy_bias = ( + nn.Parameter(self.energy_bias_init * torch.ones([1])) + if args.energy_bias is True + else 0 + ) + + @staticmethod + def add_args(parser): + # fmt: off + parser.add_argument('--no-mass-preservation', action="store_false", + dest="mass_preservation", + help='Do not stay on the last token when decoding') + parser.add_argument('--mass-preservation', action="store_true", + dest="mass_preservation", + help='Stay on the last token when decoding') + parser.set_defaults(mass_preservation=True) + parser.add_argument('--noise-var', type=float, default=1.0, + help='Variance of discretness noise') + parser.add_argument('--noise-mean', type=float, default=0.0, + help='Mean of discretness noise') + parser.add_argument('--noise-type', type=str, default="flat", + help='Type of discretness noise') + parser.add_argument('--energy-bias', action="store_true", + default=False, + help='Bias for energy') + parser.add_argument('--energy-bias-init', type=float, default=-2.0, + help='Initial value of the bias for energy') + parser.add_argument('--attention-eps', type=float, default=1e-6, + help='Epsilon when calculating expected attention') + + def p_choose(self, *args): + raise NotImplementedError + + def input_projections(self, *args): + raise NotImplementedError + + def attn_energy( + self, q_proj, k_proj, key_padding_mask=None, attn_mask=None + ): + """ + Calculating monotonic energies + + ============================================================ + Expected input size + q_proj: bsz * num_heads, tgt_len, self.head_dim + k_proj: bsz * num_heads, src_len, self.head_dim + key_padding_mask: bsz, src_len + attn_mask: tgt_len, src_len + """ + bsz, tgt_len, embed_dim = q_proj.size() + bsz = bsz // self.num_heads + src_len = k_proj.size(1) + + attn_energy = ( + torch.bmm(q_proj, k_proj.transpose(1, 2)) + self.energy_bias + ) + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + attn_energy += attn_mask + + attn_energy = attn_energy.view(bsz, self.num_heads, tgt_len, src_len) + + if key_padding_mask is not None: + attn_energy = attn_energy.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + + return attn_energy + + def expected_alignment_train(self, p_choose, key_padding_mask: Optional[Tensor]): + """ + Calculating expected alignment for MMA + Mask is not need because p_choose will be 0 if masked + + q_ij = (1 − p_{ij−1})q_{ij−1} + a+{i−1j} + a_ij = p_ij q_ij + + Parallel solution: + ai = p_i * cumprod(1 − pi) * cumsum(a_i / cumprod(1 − pi)) + + ============================================================ + Expected input size + p_choose: bsz * num_heads, tgt_len, src_len + """ + + # p_choose: bsz * num_heads, tgt_len, src_len + bsz_num_heads, tgt_len, src_len = p_choose.size() + + # cumprod_1mp : bsz * num_heads, tgt_len, src_len + cumprod_1mp = exclusive_cumprod(1 - p_choose, dim=2, eps=self.eps) + cumprod_1mp_clamp = torch.clamp(cumprod_1mp, self.eps, 1.0) + + init_attention = p_choose.new_zeros([bsz_num_heads, 1, src_len]) + init_attention[:, :, 0] = 1.0 + + previous_attn = [init_attention] + + for i in range(tgt_len): + # p_choose: bsz * num_heads, tgt_len, src_len + # cumprod_1mp_clamp : bsz * num_heads, tgt_len, src_len + # previous_attn[i]: bsz * num_heads, 1, src_len + # alpha_i: bsz * num_heads, src_len + alpha_i = ( + p_choose[:, i] + * cumprod_1mp[:, i] + * torch.cumsum(previous_attn[i][:, 0] / cumprod_1mp_clamp[:, i], dim=1) + ).clamp(0, 1.0) + previous_attn.append(alpha_i.unsqueeze(1)) + + # alpha: bsz * num_heads, tgt_len, src_len + alpha = torch.cat(previous_attn[1:], dim=1) + + if self.mass_preservation: + # Last token has the residual probabilities + if key_padding_mask is not None and key_padding_mask[:, -1].any(): + # right padding + batch_size = key_padding_mask.size(0) + residuals = 1 - alpha.sum(dim=-1, keepdim=True).clamp(0.0, 1.0) + src_lens = src_len - key_padding_mask.sum(dim=1, keepdim=True) + src_lens = src_lens.expand( + batch_size, self.num_heads + ).contiguous().view(-1, 1) + src_lens = src_lens.expand(-1, tgt_len).contiguous() + # add back the last value + residuals += alpha.gather(2, src_lens.unsqueeze(-1) - 1) + alpha = alpha.scatter(2, src_lens.unsqueeze(-1) - 1, residuals) + else: + residuals = 1 - alpha[:, :, :-1].sum(dim=-1).clamp(0.0, 1.0) + alpha[:, :, -1] = residuals + + if torch.isnan(alpha).any(): + # Something is wrong + raise RuntimeError("NaN in alpha.") + + return alpha + + def expected_alignment_infer( + self, p_choose, encoder_padding_mask: Optional[Tensor], incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ): + # TODO modify this function + """ + Calculating mo alignment for MMA during inference time + + ============================================================ + Expected input size + p_choose: bsz * num_heads, tgt_len, src_len + incremental_state: dict + encodencoder_padding_mask: bsz * src_len + """ + # p_choose: bsz * self.num_heads, src_len + bsz_num_heads, tgt_len, src_len = p_choose.size() + # One token at a time + assert tgt_len == 1 + p_choose = p_choose[:, 0, :] + + monotonic_cache = self._get_monotonic_buffer(incremental_state) + + # prev_monotonic_step: bsz, num_heads + bsz = bsz_num_heads // self.num_heads + prev_monotonic_step = monotonic_cache.get( + "head_step", + p_choose.new_zeros([bsz, self.num_heads]).long() + ) + assert prev_monotonic_step is not None + bsz, num_heads = prev_monotonic_step.size() + assert num_heads == self.num_heads + assert bsz * num_heads == bsz_num_heads + + # p_choose: bsz, num_heads, src_len + p_choose = p_choose.view(bsz, num_heads, src_len) + + if encoder_padding_mask is not None: + src_lengths = src_len - \ + encoder_padding_mask.sum(dim=1, keepdim=True).long() + else: + src_lengths = prev_monotonic_step.new_ones(bsz, 1) * src_len + + # src_lengths: bsz, num_heads + src_lengths = src_lengths.expand_as(prev_monotonic_step) + # new_monotonic_step: bsz, num_heads + new_monotonic_step = prev_monotonic_step + + step_offset = 0 + if encoder_padding_mask is not None: + if encoder_padding_mask[:, 0].any(): + # left_pad_source = True: + step_offset = encoder_padding_mask.sum(dim=-1, keepdim=True) + + max_steps = src_lengths - 1 if self.mass_preservation else src_lengths + + # finish_read: bsz, num_heads + finish_read = new_monotonic_step.eq(max_steps) + p_choose_i = 1 + while finish_read.sum().item() < bsz * self.num_heads: + # p_choose: bsz * self.num_heads, src_len + # only choose the p at monotonic steps + # p_choose_i: bsz , self.num_heads + p_choose_i = ( + p_choose.gather( + 2, + (step_offset + new_monotonic_step) + .unsqueeze(2) + .clamp(0, src_len - 1), + ) + ).squeeze(2) + + action = ( + (p_choose_i < 0.5) + .type_as(prev_monotonic_step) + .masked_fill(finish_read, 0) + ) + # 1 x bsz + # sample actions on unfinished seq + # 1 means stay, finish reading + # 0 means leave, continue reading + # dist = torch.distributions.bernoulli.Bernoulli(p_choose) + # action = dist.sample().type_as(finish_read) * (1 - finish_read) + + new_monotonic_step += action + + finish_read = new_monotonic_step.eq(max_steps) | (action == 0) + + monotonic_cache["head_step"] = new_monotonic_step + # Whether a head is looking for new input + monotonic_cache["head_read"] = ( + new_monotonic_step.eq(max_steps) & (p_choose_i < 0.5) + ) + + # alpha: bsz * num_heads, 1, src_len + # new_monotonic_step: bsz, num_heads + alpha = ( + p_choose + .new_zeros([bsz * self.num_heads, src_len]) + .scatter( + 1, + (step_offset + new_monotonic_step) + .view(bsz * self.num_heads, 1).clamp(0, src_len - 1), + 1 + ) + ) + + if not self.mass_preservation: + alpha = alpha.masked_fill( + (new_monotonic_step == max_steps) + .view(bsz * self.num_heads, 1), + 0 + ) + + alpha = alpha.unsqueeze(1) + + self._set_monotonic_buffer(incremental_state, monotonic_cache) + + return alpha + + def _get_monotonic_buffer(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]]): + return self.get_incremental_state( + incremental_state, + 'monotonic', + ) or {} + + def _set_monotonic_buffer(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], buffer: Dict[str, Optional[Tensor]]): + self.set_incremental_state( + incremental_state, + 'monotonic', + buffer, + ) + + def v_proj_output(self, value): + raise NotImplementedError + + def forward( + self, query, key, value, + key_padding_mask=None, attn_mask=None, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights=True, static_kv=False + ): + + tgt_len, bsz, embed_dim = query.size() + src_len = value.size(0) + + # stepwise prob + # p_choose: bsz * self.num_heads, tgt_len, src_len + p_choose = self.p_choose( + query, key, key_padding_mask, incremental_state, + ) + + # expected alignment alpha + # bsz * self.num_heads, tgt_len, src_len + if incremental_state is not None: + alpha = self.expected_alignment_infer( + p_choose, key_padding_mask, incremental_state) + else: + alpha = self.expected_alignment_train( + p_choose, key_padding_mask) + + # expected attention beta + # bsz * self.num_heads, tgt_len, src_len + beta = self.expected_attention( + alpha, query, key, value, + key_padding_mask, attn_mask, + incremental_state + ) + + attn_weights = beta + + v_proj = self.v_proj_output(value) + + attn = torch.bmm(attn_weights.type_as(v_proj), v_proj) + + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + + attn = self.out_proj(attn) + + beta = beta.view(bsz, self.num_heads, tgt_len, src_len) + alpha = alpha.view(bsz, self.num_heads, tgt_len, src_len) + p_choose = p_choose.view(bsz, self.num_heads, tgt_len, src_len) + + return attn, { + "alpha": alpha, + "beta": beta, + "p_choose": p_choose, + } + + +@register_monotonic_attention("hard_aligned") +class MonotonicMultiheadAttentionHardAligned( + MonotonicAttention, MultiheadAttention +): + def __init__(self, args): + MultiheadAttention.__init__( + self, + embed_dim=args.decoder_embed_dim, + num_heads=args.decoder_attention_heads, + kdim=getattr(args, "encoder_embed_dim", None), + vdim=getattr(args, "encoder_embed_dim", None), + dropout=args.attention_dropout, + encoder_decoder_attention=True, + ) + + MonotonicAttention.__init__(self, args) + + self.k_in_proj = {"monotonic": self.k_proj} + self.q_in_proj = {"monotonic": self.q_proj} + self.v_in_proj = {"output": self.v_proj} + + @staticmethod + def add_args(parser): + # fmt: off + parser.add_argument('--no-mass-preservation', action="store_false", + dest="mass_preservation", + help='Do not stay on the last token when decoding') + parser.add_argument('--mass-preservation', action="store_true", + dest="mass_preservation", + help='Stay on the last token when decoding') + parser.set_defaults(mass_preservation=True) + parser.add_argument('--noise-var', type=float, default=1.0, + help='Variance of discretness noise') + parser.add_argument('--noise-mean', type=float, default=0.0, + help='Mean of discretness noise') + parser.add_argument('--noise-type', type=str, default="flat", + help='Type of discretness noise') + parser.add_argument('--energy-bias', action="store_true", + default=False, + help='Bias for energy') + parser.add_argument('--energy-bias-init', type=float, default=-2.0, + help='Initial value of the bias for energy') + parser.add_argument('--attention-eps', type=float, default=1e-6, + help='Epsilon when calculating expected attention') + + def attn_energy( + self, q_proj: Optional[Tensor], k_proj: Optional[Tensor], key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None + ): + """ + Calculating monotonic energies + + ============================================================ + Expected input size + q_proj: bsz * num_heads, tgt_len, self.head_dim + k_proj: bsz * num_heads, src_len, self.head_dim + key_padding_mask: bsz, src_len + attn_mask: tgt_len, src_len + """ + assert q_proj is not None # Optional[Tensor] annotations in the signature above are to make the JIT compiler happy + assert k_proj is not None + bsz, tgt_len, embed_dim = q_proj.size() + bsz = bsz // self.num_heads + src_len = k_proj.size(1) + + attn_energy = ( + torch.bmm(q_proj, k_proj.transpose(1, 2)) + self.energy_bias + ) + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + attn_energy += attn_mask + + attn_energy = attn_energy.view(bsz, self.num_heads, tgt_len, src_len) + + if key_padding_mask is not None: + attn_energy = attn_energy.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + + return attn_energy + + def expected_alignment_train(self, p_choose, key_padding_mask: Optional[Tensor]): + """ + Calculating expected alignment for MMA + Mask is not need because p_choose will be 0 if masked + + q_ij = (1 − p_{ij−1})q_{ij−1} + a+{i−1j} + a_ij = p_ij q_ij + + Parallel solution: + ai = p_i * cumprod(1 − pi) * cumsum(a_i / cumprod(1 − pi)) + + ============================================================ + Expected input size + p_choose: bsz * num_heads, tgt_len, src_len + """ + + # p_choose: bsz * num_heads, tgt_len, src_len + bsz_num_heads, tgt_len, src_len = p_choose.size() + + # cumprod_1mp : bsz * num_heads, tgt_len, src_len + cumprod_1mp = exclusive_cumprod(1 - p_choose, dim=2, eps=self.eps) + cumprod_1mp_clamp = torch.clamp(cumprod_1mp, self.eps, 1.0) + + init_attention = p_choose.new_zeros([bsz_num_heads, 1, src_len]) + init_attention[:, :, 0] = 1.0 + + previous_attn = [init_attention] + + for i in range(tgt_len): + # p_choose: bsz * num_heads, tgt_len, src_len + # cumprod_1mp_clamp : bsz * num_heads, tgt_len, src_len + # previous_attn[i]: bsz * num_heads, 1, src_len + # alpha_i: bsz * num_heads, src_len + alpha_i = ( + p_choose[:, i] + * cumprod_1mp[:, i] + * torch.cumsum(previous_attn[i][:, 0] / cumprod_1mp_clamp[:, i], dim=1) + ).clamp(0, 1.0) + previous_attn.append(alpha_i.unsqueeze(1)) + + # alpha: bsz * num_heads, tgt_len, src_len + alpha = torch.cat(previous_attn[1:], dim=1) + + if self.mass_preservation: + # Last token has the residual probabilities + if key_padding_mask is not None and key_padding_mask[:, -1].any(): + # right padding + batch_size = key_padding_mask.size(0) + residuals = 1 - alpha.sum(dim=-1, keepdim=True).clamp(0.0, 1.0) + src_lens = src_len - key_padding_mask.sum(dim=1, keepdim=True) + src_lens = src_lens.expand( + batch_size, self.num_heads + ).contiguous().view(-1, 1) + src_lens = src_lens.expand(-1, tgt_len).contiguous() + # add back the last value + residuals += alpha.gather(2, src_lens.unsqueeze(-1) - 1) + alpha = alpha.scatter(2, src_lens.unsqueeze(-1) - 1, residuals) + else: + residuals = 1 - alpha[:, :, :-1].sum(dim=-1).clamp(0.0, 1.0) + alpha[:, :, -1] = residuals + + if torch.isnan(alpha).any(): + # Something is wrong + raise RuntimeError("NaN in alpha.") + + return alpha + + def expected_alignment_infer( + self, p_choose, encoder_padding_mask: Optional[Tensor], incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ): + # TODO modify this function + """ + Calculating mo alignment for MMA during inference time + + ============================================================ + Expected input size + p_choose: bsz * num_heads, tgt_len, src_len + incremental_state: dict + encodencoder_padding_mask: bsz * src_len + """ + # p_choose: bsz * self.num_heads, src_len + bsz_num_heads, tgt_len, src_len = p_choose.size() + # One token at a time + assert tgt_len == 1 + p_choose = p_choose[:, 0, :] + + monotonic_cache = self._get_monotonic_buffer(incremental_state) + + # prev_monotonic_step: bsz, num_heads + bsz = bsz_num_heads // self.num_heads + prev_monotonic_step = monotonic_cache.get( + "head_step", + p_choose.new_zeros([bsz, self.num_heads]).long() + ) + assert prev_monotonic_step is not None + bsz, num_heads = prev_monotonic_step.size() + assert num_heads == self.num_heads + assert bsz * num_heads == bsz_num_heads + + # p_choose: bsz, num_heads, src_len + p_choose = p_choose.view(bsz, num_heads, src_len) + + if encoder_padding_mask is not None: + src_lengths = src_len - \ + encoder_padding_mask.sum(dim=1, keepdim=True).long() + else: + src_lengths = torch.ones(bsz, 1).to(prev_monotonic_step) * src_len + + # src_lengths: bsz, num_heads + src_lengths = src_lengths.expand_as(prev_monotonic_step) + # new_monotonic_step: bsz, num_heads + new_monotonic_step = prev_monotonic_step + + step_offset = torch.tensor(0) + if encoder_padding_mask is not None: + if encoder_padding_mask[:, 0].any(): + # left_pad_source = True: + step_offset = encoder_padding_mask.sum(dim=-1, keepdim=True) + + max_steps = src_lengths - 1 if self.mass_preservation else src_lengths + + # finish_read: bsz, num_heads + finish_read = new_monotonic_step.eq(max_steps) + p_choose_i = torch.tensor(1) + while finish_read.sum().item() < bsz * self.num_heads: + # p_choose: bsz * self.num_heads, src_len + # only choose the p at monotonic steps + # p_choose_i: bsz , self.num_heads + p_choose_i = ( + p_choose.gather( + 2, + (step_offset + new_monotonic_step) + .unsqueeze(2) + .clamp(0, src_len - 1), + ) + ).squeeze(2) + + action = ( + (p_choose_i < 0.5) + .type_as(prev_monotonic_step) + .masked_fill(finish_read, 0) + ) + # 1 x bsz + # sample actions on unfinished seq + # 1 means stay, finish reading + # 0 means leave, continue reading + # dist = torch.distributions.bernoulli.Bernoulli(p_choose) + # action = dist.sample().type_as(finish_read) * (1 - finish_read) + + new_monotonic_step += action + + finish_read = new_monotonic_step.eq(max_steps) | (action == 0) + + monotonic_cache["head_step"] = new_monotonic_step + # Whether a head is looking for new input + monotonic_cache["head_read"] = ( + new_monotonic_step.eq(max_steps) & (p_choose_i < 0.5) + ) + + # alpha: bsz * num_heads, 1, src_len + # new_monotonic_step: bsz, num_heads + alpha = ( + p_choose + .new_zeros([bsz * self.num_heads, src_len]) + .scatter( + 1, + (step_offset + new_monotonic_step) + .view(bsz * self.num_heads, 1).clamp(0, src_len - 1), + 1 + ) + ) + + if not self.mass_preservation: + alpha = alpha.masked_fill( + (new_monotonic_step == max_steps) + .view(bsz * self.num_heads, 1), + 0 + ) + + alpha = alpha.unsqueeze(1) + + self._set_monotonic_buffer(incremental_state, monotonic_cache) + + return alpha + + def _get_monotonic_buffer(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]]): + maybe_incremental_state = self.get_incremental_state( + incremental_state, + 'monotonic', + ) + if maybe_incremental_state is None: + typed_empty_dict: Dict[str, Optional[Tensor]] = {} + return typed_empty_dict + else: + return maybe_incremental_state + + def _set_monotonic_buffer(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], buffer: Dict[str, Optional[Tensor]]): + self.set_incremental_state( + incremental_state, + 'monotonic', + buffer, + ) + + def forward( + self, query: Optional[Tensor], key: Optional[Tensor], value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, attn_mask: Optional[Tensor] = None, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, static_kv: bool = False, need_head_weights: bool = False, + ): + assert query is not None + assert value is not None + tgt_len, bsz, embed_dim = query.size() + src_len = value.size(0) + + # stepwise prob + # p_choose: bsz * self.num_heads, tgt_len, src_len + p_choose = self.p_choose( + query, key, key_padding_mask, incremental_state, + ) + + # expected alignment alpha + # bsz * self.num_heads, tgt_len, src_len + if incremental_state is not None: + alpha = self.expected_alignment_infer( + p_choose, key_padding_mask, incremental_state) + else: + alpha = self.expected_alignment_train( + p_choose, key_padding_mask) + + # expected attention beta + # bsz * self.num_heads, tgt_len, src_len + beta = self.expected_attention( + alpha, query, key, value, + key_padding_mask, attn_mask, + incremental_state + ) + + attn_weights = beta + + v_proj = self.v_proj_output(value) + assert v_proj is not None + + attn = torch.bmm(attn_weights.type_as(v_proj), v_proj) + + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + + attn = self.out_proj(attn) + + beta = beta.view(bsz, self.num_heads, tgt_len, src_len) + alpha = alpha.view(bsz, self.num_heads, tgt_len, src_len) + p_choose = p_choose.view(bsz, self.num_heads, tgt_len, src_len) + + return attn, { + "alpha": alpha, + "beta": beta, + "p_choose": p_choose, + } + + def input_projections(self, query: Optional[Tensor], key: Optional[Tensor], value: Optional[Tensor], name: str): + """ + Prepare inputs for multihead attention + + ============================================================ + Expected input size + query: tgt_len, bsz, embed_dim + key: src_len, bsz, embed_dim + value: src_len, bsz, embed_dim + name: monotonic or soft + """ + + if query is not None: + bsz = query.size(1) + q = self.q_proj(query) + q *= self.scaling + q = q.contiguous().view( + -1, bsz * self.num_heads, self.head_dim + ).transpose(0, 1) + else: + q = None + + if key is not None: + bsz = key.size(1) + k = self.k_proj(key) + k = k.contiguous().view( + -1, bsz * self.num_heads, self.head_dim + ).transpose(0, 1) + else: + k = None + + if value is not None: + bsz = value.size(1) + v = self.v_proj(value) + v = v.contiguous().view( + -1, bsz * self.num_heads, self.head_dim + ).transpose(0, 1) + else: + v = None + + return q, k, v + + def p_choose( + self, query: Optional[Tensor], key: Optional[Tensor], key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None + ): + """ + Calculating step wise prob for reading and writing + 1 to read, 0 to write + + ============================================================ + Expected input size + query: bsz, tgt_len, embed_dim + key: bsz, src_len, embed_dim + value: bsz, src_len, embed_dim + key_padding_mask: bsz, src_len + attn_mask: bsz, src_len + query: bsz, tgt_len, embed_dim + """ + + # prepare inputs + q_proj, k_proj, _ = self.input_projections( + query, key, None, "monotonic" + ) + + # attention energy + attn_energy = self.attn_energy(q_proj, k_proj, key_padding_mask) + + return p_choose_strategy.hard_aligned(q_proj, k_proj, attn_energy, self.noise_mean, self.noise_var, self.training) + + def expected_attention(self, alpha, *args): + """ + For MMA-H, beta = alpha + """ + return alpha + + def v_proj_output(self, value): + _, _, v_proj = self.input_projections(None, None, value, "output") + return v_proj + + +@register_monotonic_attention("infinite_lookback") +class MonotonicMultiheadAttentionInfiniteLookback( + MonotonicMultiheadAttentionHardAligned +): + def __init__(self, args): + super().__init__(args) + self.init_soft_attention() + + def init_soft_attention(self): + self.k_proj_soft = nn.Linear(self.kdim, self.embed_dim, bias=True) + self.q_proj_soft = nn.Linear(self.embed_dim, self.embed_dim, bias=True) + self.k_in_proj["soft"] = self.k_proj_soft + self.q_in_proj["soft"] = self.q_proj_soft + + if self.qkv_same_dim: + # Empirically observed the convergence to be much better with + # the scaled initialization + nn.init.xavier_uniform_( + self.k_in_proj["soft"].weight, gain=1 / math.sqrt(2) + ) + nn.init.xavier_uniform_( + self.q_in_proj["soft"].weight, gain=1 / math.sqrt(2) + ) + else: + nn.init.xavier_uniform_(self.k_in_proj["soft"].weight) + nn.init.xavier_uniform_(self.q_in_proj["soft"].weight) + + def expected_attention( + self, alpha, query: Optional[Tensor], key: Optional[Tensor], value: Optional[Tensor], + key_padding_mask: Optional[Tensor], attn_mask: Optional[Tensor], incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ): + # monotonic attention, we will calculate milk here + bsz_x_num_heads, tgt_len, src_len = alpha.size() + bsz = int(bsz_x_num_heads / self.num_heads) + + q, k, _ = self.input_projections(query, key, None, "soft") + soft_energy = self.attn_energy(q, k, key_padding_mask, attn_mask) + + assert list(soft_energy.size()) == \ + [bsz, self.num_heads, tgt_len, src_len] + + soft_energy = soft_energy.view(bsz * self.num_heads, tgt_len, src_len) + + if incremental_state is not None: + monotonic_cache = self._get_monotonic_buffer(incremental_state) + head_step = monotonic_cache["head_step"] + assert head_step is not None + monotonic_length = head_step + 1 + step_offset = 0 + if key_padding_mask is not None: + if key_padding_mask[:, 0].any(): + # left_pad_source = True: + step_offset = key_padding_mask.sum(dim=-1, keepdim=True) + monotonic_length += step_offset + mask = lengths_to_mask( + monotonic_length.view(-1), + soft_energy.size(2), 1 + ).unsqueeze(1) + + soft_energy = soft_energy.masked_fill(~mask.to(torch.bool), float("-inf")) + soft_energy = soft_energy - soft_energy.max(dim=2, keepdim=True)[0] + exp_soft_energy = torch.exp(soft_energy) + exp_soft_energy_sum = exp_soft_energy.sum(dim=2) + beta = exp_soft_energy / exp_soft_energy_sum.unsqueeze(2) + + else: + soft_energy = soft_energy - soft_energy.max(dim=2, keepdim=True)[0] + exp_soft_energy = torch.exp(soft_energy) + self.eps + inner_items = alpha / (torch.cumsum(exp_soft_energy, dim=2)) + + beta = ( + exp_soft_energy + * torch.cumsum(inner_items.flip(dims=[2]), dim=2) + .flip(dims=[2]) + ) + + beta = beta.view(bsz, self.num_heads, tgt_len, src_len) + + if key_padding_mask is not None: + beta = beta.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), 0) + + beta = beta / beta.sum(dim=3, keepdim=True) + beta = beta.view(bsz * self.num_heads, tgt_len, src_len) + beta = self.dropout_module(beta) + + if torch.isnan(beta).any(): + # Something is wrong + raise RuntimeError("NaN in beta.") + + return beta + + +@register_monotonic_attention("waitk") +class MonotonicMultiheadAttentionWaitK( + MonotonicMultiheadAttentionInfiniteLookback +): + def __init__(self, args): + super().__init__(args) + self.q_in_proj["soft"] = self.q_in_proj["monotonic"] + self.k_in_proj["soft"] = self.k_in_proj["monotonic"] + self.waitk_lagging = args.waitk_lagging + assert self.waitk_lagging > 0, ( + f"Lagging has to been larger than 0, get {self.waitk_lagging}." + ) + + @staticmethod + def add_args(parser): + super( + MonotonicMultiheadAttentionWaitK, + MonotonicMultiheadAttentionWaitK, + ).add_args(parser) + + parser.add_argument( + "--waitk-lagging", type=int, required=True, help="Wait K lagging" + ) + + def p_choose( + self, query: Optional[Tensor], key: Optional[Tensor], key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + ): + """ + query: bsz, tgt_len + key: bsz, src_len + key_padding_mask: bsz, src_len + """ + return p_choose_strategy.waitk(query, key, self.waitk_lagging, self.num_heads, key_padding_mask, incremental_state) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_transformer_layer.py b/SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_transformer_layer.py new file mode 100644 index 0000000..bcd45aa --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/modules/monotonic_transformer_layer.py @@ -0,0 +1,198 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.modules import LayerNorm, TransformerDecoderLayer, TransformerEncoderLayer + +from . import build_monotonic_attention + +from typing import Dict, List, Optional + +import torch +from torch import Tensor + + +class TransformerMonotonicEncoderLayer(TransformerEncoderLayer): + def forward(self, x, encoder_padding_mask): + seq_len, _, _ = x.size() + attn_mask = x.new_ones([seq_len, seq_len]).triu(1) + attn_mask = attn_mask.masked_fill(attn_mask.bool(), float("-inf")) + return super().forward(x, encoder_padding_mask, attn_mask) + + +class TransformerMonotonicDecoderLayer(TransformerDecoderLayer): + def __init__( + self, args, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False + ): + super().__init__( + args, + no_encoder_attn=True, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + ) + + assert args.simul_type is not None, "A --simul-type is needed." + + self.encoder_attn = build_monotonic_attention(args) + self.encoder_attn_layer_norm = LayerNorm( + self.embed_dim, export=getattr(args, "char_inputs", False) + ) + + def get_head_steps(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]]): + return self.encoder_attn._get_monotonic_buffer(incremental_state).get( + "head_step" + ) + + def prune_incremental_state(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]]): + input_buffer = self.self_attn._get_input_buffer(incremental_state) + for key in ["prev_key", "prev_value"]: + input_buffer_key = input_buffer[key] + assert input_buffer_key is not None + if input_buffer_key.size(2) > 1: + input_buffer[key] = input_buffer_key[:, :, :-1, :] + else: + typed_empty_dict: Dict[str, Optional[Tensor]] = {} + input_buffer = typed_empty_dict + break + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, input_buffer) + + def get_steps(self, incremental_state): + return self.encoder_attn._get_monotonic_buffer(incremental_state).get("step", 0) + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + assert self.encoder_attn is not None + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/utils/__init__.py b/SpeechT5/fairseq/examples/simultaneous_translation/utils/__init__.py new file mode 100644 index 0000000..1e9ce84 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/utils/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import os + + +# automatically import any Python files in the criterions/ directory +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + module = file[: file.find(".py")] + importlib.import_module("examples.simultaneous_translation.utils." + module) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/utils/data_utils.py b/SpeechT5/fairseq/examples/simultaneous_translation/utils/data_utils.py new file mode 100644 index 0000000..a763ea6 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/utils/data_utils.py @@ -0,0 +1,100 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + + +def calc_mean_invstddev(feature): + if len(feature.size()) != 2: + raise ValueError("We expect the input feature to be 2-D tensor") + mean = feature.mean(0) + var = feature.var(0) + # avoid division by ~zero + eps = 1e-8 + if (var < eps).any(): + return mean, 1.0 / (torch.sqrt(var) + eps) + return mean, 1.0 / torch.sqrt(var) + + +def apply_mv_norm(features): + # If there is less than 2 spectrograms, the variance cannot be computed (is NaN) + # and normalization is not possible, so return the item as it is + if features.size(0) < 2: + return features + mean, invstddev = calc_mean_invstddev(features) + res = (features - mean) * invstddev + return res + + +def lengths_to_encoder_padding_mask(lengths, batch_first: bool = False): + """ + convert lengths (a 1-D Long/Int tensor) to 2-D binary tensor + + Args: + lengths: a (B, )-shaped tensor + + Return: + max_length: maximum length of B sequences + encoder_padding_mask: a (max_length, B) binary mask, where + [t, b] = 0 for t < lengths[b] and 1 otherwise + + TODO: + kernelize this function if benchmarking shows this function is slow + """ + max_lengths = torch.max(lengths).item() + bsz = lengths.size(0) + encoder_padding_mask = torch.arange( + max_lengths + ).to( # a (T, ) tensor with [0, ..., T-1] + lengths.device + ).view( # move to the right device + 1, max_lengths + ).expand( # reshape to (1, T)-shaped tensor + bsz, -1 + ) >= lengths.view( # expand to (B, T)-shaped tensor + bsz, 1 + ).expand( + -1, max_lengths + ) + if not batch_first: + return encoder_padding_mask.t(), max_lengths + else: + return encoder_padding_mask, max_lengths + + +def encoder_padding_mask_to_lengths( + encoder_padding_mask, max_lengths, batch_size, device +): + """ + convert encoder_padding_mask (2-D binary tensor) to a 1-D tensor + + Conventionally, encoder output contains a encoder_padding_mask, which is + a 2-D mask in a shape (T, B), whose (t, b) element indicate whether + encoder_out[t, b] is a valid output (=0) or not (=1). Occasionally, we + need to convert this mask tensor to a 1-D tensor in shape (B, ), where + [b] denotes the valid length of b-th sequence + + Args: + encoder_padding_mask: a (T, B)-shaped binary tensor or None; if None, + indicating all are valid + Return: + seq_lengths: a (B,)-shaped tensor, where its (b, )-th element is the + number of valid elements of b-th sequence + + max_lengths: maximum length of all sequence, if encoder_padding_mask is + not None, max_lengths must equal to encoder_padding_mask.size(0) + + batch_size: batch size; if encoder_padding_mask is + not None, max_lengths must equal to encoder_padding_mask.size(1) + + device: which device to put the result on + """ + if encoder_padding_mask is None: + return torch.Tensor([max_lengths] * batch_size).to(torch.int32).to(device) + + assert encoder_padding_mask.size(0) == max_lengths, "max_lengths does not match" + assert encoder_padding_mask.size(1) == batch_size, "batch_size does not match" + + return max_lengths - torch.sum(encoder_padding_mask, dim=0) diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/utils/functions.py b/SpeechT5/fairseq/examples/simultaneous_translation/utils/functions.py new file mode 100644 index 0000000..f795b5f --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/utils/functions.py @@ -0,0 +1,149 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + + +def exclusive_cumprod(tensor, dim: int, eps: float = 1e-10): + """ + Implementing exclusive cumprod. + There is cumprod in pytorch, however there is no exclusive mode. + cumprod(x) = [x1, x1x2, x2x3x4, ..., prod_{i=1}^n x_i] + exclusive means cumprod(x) = [1, x1, x1x2, x1x2x3, ..., prod_{i=1}^{n-1} x_i] + """ + tensor_size = list(tensor.size()) + tensor_size[dim] = 1 + return_tensor = safe_cumprod( + torch.cat([torch.ones(tensor_size).type_as(tensor), tensor], dim=dim), + dim=dim, + eps=eps, + ) + + if dim == 0: + return return_tensor[:-1] + elif dim == 1: + return return_tensor[:, :-1] + elif dim == 2: + return return_tensor[:, :, :-1] + else: + raise RuntimeError("Cumprod on dimension 3 and more is not implemented") + + +def safe_cumprod(tensor, dim: int, eps: float = 1e-10): + """ + An implementation of cumprod to prevent precision issue. + cumprod(x) + = [x1, x1x2, x1x2x3, ....] + = [exp(log(x1)), exp(log(x1) + log(x2)), exp(log(x1) + log(x2) + log(x3)), ...] + = exp(cumsum(log(x))) + """ + + if (tensor + eps < 0).any().item(): + raise RuntimeError( + "Safe cumprod can only take non-negative tensors as input." + "Consider use torch.cumprod if you want to calculate negative values." + ) + + log_tensor = torch.log(tensor + eps) + cumsum_log_tensor = torch.cumsum(log_tensor, dim) + exp_cumsum_log_tensor = torch.exp(cumsum_log_tensor) + return exp_cumsum_log_tensor + + +def lengths_to_mask(lengths, max_len: int, dim: int = 0, negative_mask: bool = False): + """ + Convert a tensor of lengths to mask + For example, lengths = [[2, 3, 4]], max_len = 5 + mask = + [[1, 1, 1], + [1, 1, 1], + [0, 1, 1], + [0, 0, 1], + [0, 0, 0]] + """ + assert len(lengths.size()) <= 2 + if len(lengths) == 2: + if dim == 1: + lengths = lengths.t() + lengths = lengths + else: + lengths = lengths.unsqueeze(1) + + # lengths : batch_size, 1 + lengths = lengths.view(-1, 1) + + batch_size = lengths.size(0) + # batch_size, max_len + mask = torch.arange(max_len).expand(batch_size, max_len).type_as(lengths) < lengths + + if negative_mask: + mask = ~mask + + if dim == 0: + # max_len, batch_size + mask = mask.t() + + return mask + + +def moving_sum(x, start_idx: int, end_idx: int): + """ + From MONOTONIC CHUNKWISE ATTENTION + https://arxiv.org/pdf/1712.05382.pdf + Equation (18) + + x = [x_1, x_2, ..., x_N] + MovingSum(x, start_idx, end_idx)_n = Sigma_{m=n−(start_idx−1)}^{n+end_idx-1} x_m + for n in {1, 2, 3, ..., N} + + x : src_len, batch_size + start_idx : start idx + end_idx : end idx + + Example + src_len = 5 + batch_size = 3 + x = + [[ 0, 5, 10], + [ 1, 6, 11], + [ 2, 7, 12], + [ 3, 8, 13], + [ 4, 9, 14]] + + MovingSum(x, 3, 1) = + [[ 0, 5, 10], + [ 1, 11, 21], + [ 3, 18, 33], + [ 6, 21, 36], + [ 9, 24, 39]] + + MovingSum(x, 1, 3) = + [[ 3, 18, 33], + [ 6, 21, 36], + [ 9, 24, 39], + [ 7, 17, 27], + [ 4, 9, 14]] + """ + assert start_idx > 0 and end_idx > 0 + assert len(x.size()) == 2 + src_len, batch_size = x.size() + # batch_size, 1, src_len + x = x.t().unsqueeze(1) + # batch_size, 1, src_len + moving_sum_weight = x.new_ones([1, 1, end_idx + start_idx - 1]) + + moving_sum = ( + torch.nn.functional.conv1d( + x, moving_sum_weight, padding=start_idx + end_idx - 1 + ) + .squeeze(1) + .t() + ) + moving_sum = moving_sum[end_idx:-start_idx] + + assert src_len == moving_sum.size(0) + assert batch_size == moving_sum.size(1) + + return moving_sum diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/utils/latency.py b/SpeechT5/fairseq/examples/simultaneous_translation/utils/latency.py new file mode 100644 index 0000000..5d800a5 --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/utils/latency.py @@ -0,0 +1,451 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + + +class LatencyMetric(object): + @staticmethod + def length_from_padding_mask(padding_mask, batch_first: bool = False): + dim = 1 if batch_first else 0 + return padding_mask.size(dim) - padding_mask.sum(dim=dim, keepdim=True) + + def prepare_latency_metric( + self, + delays, + src_lens, + target_padding_mask=None, + batch_first: bool = False, + start_from_zero: bool = True, + ): + assert len(delays.size()) == 2 + assert len(src_lens.size()) == 2 + + if start_from_zero: + delays = delays + 1 + + if batch_first: + # convert to batch_last + delays = delays.t() + src_lens = src_lens.t() + tgt_len, bsz = delays.size() + _, bsz_1 = src_lens.size() + + if target_padding_mask is not None: + target_padding_mask = target_padding_mask.t() + tgt_len_1, bsz_2 = target_padding_mask.size() + assert tgt_len == tgt_len_1 + assert bsz == bsz_2 + + assert bsz == bsz_1 + + if target_padding_mask is None: + tgt_lens = tgt_len * delays.new_ones([1, bsz]).float() + else: + # 1, batch_size + tgt_lens = self.length_from_padding_mask(target_padding_mask, False).float() + delays = delays.masked_fill(target_padding_mask, 0) + + return delays, src_lens, tgt_lens, target_padding_mask + + def __call__( + self, + delays, + src_lens, + target_padding_mask=None, + batch_first: bool = False, + start_from_zero: bool = True, + ): + delays, src_lens, tgt_lens, target_padding_mask = self.prepare_latency_metric( + delays, src_lens, target_padding_mask, batch_first, start_from_zero + ) + return self.cal_metric(delays, src_lens, tgt_lens, target_padding_mask) + + @staticmethod + def cal_metric(delays, src_lens, tgt_lens, target_padding_mask): + """ + Expected sizes: + delays: tgt_len, batch_size + src_lens: 1, batch_size + target_padding_mask: tgt_len, batch_size + """ + raise NotImplementedError + + +class AverageProportion(LatencyMetric): + """ + Function to calculate Average Proportion from + Can neural machine translation do simultaneous translation? + (https://arxiv.org/abs/1606.02012) + + Delays are monotonic steps, range from 1 to src_len. + Give src x tgt y, AP is calculated as: + + AP = 1 / (|x||y]) sum_i^|Y| deleys_i + """ + + @staticmethod + def cal_metric(delays, src_lens, tgt_lens, target_padding_mask): + if target_padding_mask is not None: + AP = torch.sum( + delays.masked_fill(target_padding_mask, 0), dim=0, keepdim=True + ) + else: + AP = torch.sum(delays, dim=0, keepdim=True) + + AP = AP / (src_lens * tgt_lens) + return AP + + +class AverageLagging(LatencyMetric): + """ + Function to calculate Average Lagging from + STACL: Simultaneous Translation with Implicit Anticipation + and Controllable Latency using Prefix-to-Prefix Framework + (https://arxiv.org/abs/1810.08398) + + Delays are monotonic steps, range from 1 to src_len. + Give src x tgt y, AP is calculated as: + + AL = 1 / tau sum_i^tau delays_i - (i - 1) / gamma + + Where + gamma = |y| / |x| + tau = argmin_i(delays_i = |x|) + """ + + @staticmethod + def cal_metric(delays, src_lens, tgt_lens, target_padding_mask): + # tau = argmin_i(delays_i = |x|) + tgt_len, bsz = delays.size() + lagging_padding_mask = delays >= src_lens + lagging_padding_mask = torch.nn.functional.pad( + lagging_padding_mask.t(), (1, 0) + ).t()[:-1, :] + gamma = tgt_lens / src_lens + lagging = ( + delays + - torch.arange(delays.size(0)) + .unsqueeze(1) + .type_as(delays) + .expand_as(delays) + / gamma + ) + lagging.masked_fill_(lagging_padding_mask, 0) + tau = (1 - lagging_padding_mask.type_as(lagging)).sum(dim=0, keepdim=True) + AL = lagging.sum(dim=0, keepdim=True) / tau + + return AL + + +class DifferentiableAverageLagging(LatencyMetric): + """ + Function to calculate Differentiable Average Lagging from + Monotonic Infinite Lookback Attention for Simultaneous Machine Translation + (https://arxiv.org/abs/1906.05218) + + Delays are monotonic steps, range from 0 to src_len-1. + (In the original paper thery are from 1 to src_len) + Give src x tgt y, AP is calculated as: + + DAL = 1 / |Y| sum_i^|Y| delays'_i - (i - 1) / gamma + + Where + delays'_i = + 1. delays_i if i == 1 + 2. max(delays_i, delays'_{i-1} + 1 / gamma) + + """ + + @staticmethod + def cal_metric(delays, src_lens, tgt_lens, target_padding_mask): + tgt_len, bsz = delays.size() + + gamma = tgt_lens / src_lens + new_delays = torch.zeros_like(delays) + + for i in range(delays.size(0)): + if i == 0: + new_delays[i] = delays[i] + else: + new_delays[i] = torch.cat( + [ + new_delays[i - 1].unsqueeze(0) + 1 / gamma, + delays[i].unsqueeze(0), + ], + dim=0, + ).max(dim=0)[0] + + DAL = ( + new_delays + - torch.arange(delays.size(0)) + .unsqueeze(1) + .type_as(delays) + .expand_as(delays) + / gamma + ) + if target_padding_mask is not None: + DAL = DAL.masked_fill(target_padding_mask, 0) + + DAL = DAL.sum(dim=0, keepdim=True) / tgt_lens + + return DAL + + +class LatencyMetricVariance(LatencyMetric): + def prepare_latency_metric( + self, + delays, + src_lens, + target_padding_mask=None, + batch_first: bool = True, + start_from_zero: bool = True, + ): + assert batch_first + assert len(delays.size()) == 3 + assert len(src_lens.size()) == 2 + + if start_from_zero: + delays = delays + 1 + + # convert to batch_last + bsz, num_heads_x_layers, tgt_len = delays.size() + bsz_1, _ = src_lens.size() + assert bsz == bsz_1 + + if target_padding_mask is not None: + bsz_2, tgt_len_1 = target_padding_mask.size() + assert tgt_len == tgt_len_1 + assert bsz == bsz_2 + + if target_padding_mask is None: + tgt_lens = tgt_len * delays.new_ones([bsz, tgt_len]).float() + else: + # batch_size, 1 + tgt_lens = self.length_from_padding_mask(target_padding_mask, True).float() + delays = delays.masked_fill(target_padding_mask.unsqueeze(1), 0) + + return delays, src_lens, tgt_lens, target_padding_mask + + +class VarianceDelay(LatencyMetricVariance): + @staticmethod + def cal_metric(delays, src_lens, tgt_lens, target_padding_mask): + """ + delays : bsz, num_heads_x_layers, tgt_len + src_lens : bsz, 1 + target_lens : bsz, 1 + target_padding_mask: bsz, tgt_len or None + """ + if delays.size(1) == 1: + return delays.new_zeros([1]) + + variance_delays = delays.var(dim=1) + + if target_padding_mask is not None: + variance_delays.masked_fill_(target_padding_mask, 0) + + return variance_delays.sum(dim=1, keepdim=True) / tgt_lens + + +class LatencyInference(object): + def __init__(self, start_from_zero=True): + self.metric_calculator = { + "differentiable_average_lagging": DifferentiableAverageLagging(), + "average_lagging": AverageLagging(), + "average_proportion": AverageProportion(), + } + + self.start_from_zero = start_from_zero + + def __call__(self, monotonic_step, src_lens): + """ + monotonic_step range from 0 to src_len. src_len means eos + delays: bsz, tgt_len + src_lens: bsz, 1 + """ + if not self.start_from_zero: + monotonic_step -= 1 + + src_lens = src_lens + + delays = monotonic_step.view( + monotonic_step.size(0), -1, monotonic_step.size(-1) + ).max(dim=1)[0] + + delays = delays.masked_fill(delays >= src_lens, 0) + (src_lens - 1).expand_as( + delays + ).masked_fill(delays < src_lens, 0) + return_dict = {} + for key, func in self.metric_calculator.items(): + return_dict[key] = func( + delays.float(), + src_lens.float(), + target_padding_mask=None, + batch_first=True, + start_from_zero=True, + ).t() + + return return_dict + + +class LatencyTraining(object): + def __init__( + self, + avg_weight, + var_weight, + avg_type, + var_type, + stay_on_last_token, + average_method, + ): + self.avg_weight = avg_weight + self.var_weight = var_weight + self.avg_type = avg_type + self.var_type = var_type + self.stay_on_last_token = stay_on_last_token + self.average_method = average_method + + self.metric_calculator = { + "differentiable_average_lagging": DifferentiableAverageLagging(), + "average_lagging": AverageLagging(), + "average_proportion": AverageProportion(), + } + + self.variance_calculator = { + "variance_delay": VarianceDelay(), + } + + def expected_delays_from_attention( + self, attention, source_padding_mask=None, target_padding_mask=None + ): + if type(attention) == list: + # bsz, num_heads, tgt_len, src_len + bsz, num_heads, tgt_len, src_len = attention[0].size() + attention = torch.cat(attention, dim=1) + bsz, num_heads_x_layers, tgt_len, src_len = attention.size() + # bsz * num_heads * num_layers, tgt_len, src_len + attention = attention.view(-1, tgt_len, src_len) + else: + # bsz * num_heads * num_layers, tgt_len, src_len + bsz, tgt_len, src_len = attention.size() + num_heads_x_layers = 1 + attention = attention.view(-1, tgt_len, src_len) + + if not self.stay_on_last_token: + residual_attention = 1 - attention[:, :, :-1].sum(dim=2, keepdim=True) + attention = torch.cat([attention[:, :, :-1], residual_attention], dim=2) + + # bsz * num_heads_x_num_layers, tgt_len, src_len for MMA + steps = ( + torch.arange(1, 1 + src_len) + .unsqueeze(0) + .unsqueeze(1) + .expand_as(attention) + .type_as(attention) + ) + + if source_padding_mask is not None: + src_offset = ( + source_padding_mask.type_as(attention) + .sum(dim=1, keepdim=True) + .expand(bsz, num_heads_x_layers) + .contiguous() + .view(-1, 1) + ) + src_lens = src_len - src_offset + if source_padding_mask[:, 0].any(): + # Pad left + src_offset = src_offset.view(-1, 1, 1) + steps = steps - src_offset + steps = steps.masked_fill(steps <= 0, 0) + else: + src_lens = attention.new_ones([bsz, num_heads_x_layers]) * src_len + src_lens = src_lens.view(-1, 1) + + # bsz * num_heads_num_layers, tgt_len, src_len + expected_delays = ( + (steps * attention).sum(dim=2).view(bsz, num_heads_x_layers, tgt_len) + ) + + if target_padding_mask is not None: + expected_delays.masked_fill_(target_padding_mask.unsqueeze(1), 0) + + return expected_delays, src_lens + + def avg_loss(self, expected_delays, src_lens, target_padding_mask): + + bsz, num_heads_x_layers, tgt_len = expected_delays.size() + target_padding_mask = ( + target_padding_mask.unsqueeze(1) + .expand_as(expected_delays) + .contiguous() + .view(-1, tgt_len) + ) + + if self.average_method == "average": + # bsz * tgt_len + expected_delays = expected_delays.mean(dim=1) + elif self.average_method == "weighted_average": + weights = torch.nn.functional.softmax(expected_delays, dim=1) + expected_delays = torch.sum(expected_delays * weights, dim=1) + elif self.average_method == "max": + # bsz * num_heads_x_num_layers, tgt_len + expected_delays = expected_delays.max(dim=1)[0] + else: + raise RuntimeError(f"{self.average_method} is not supported") + + src_lens = src_lens.view(bsz, -1)[:, :1] + target_padding_mask = target_padding_mask.view(bsz, -1, tgt_len)[:, 0] + + if self.avg_weight > 0.0: + if self.avg_type in self.metric_calculator: + average_delays = self.metric_calculator[self.avg_type]( + expected_delays, + src_lens, + target_padding_mask, + batch_first=True, + start_from_zero=False, + ) + else: + raise RuntimeError(f"{self.avg_type} is not supported.") + + # bsz * num_heads_x_num_layers, 1 + return self.avg_weight * average_delays.sum() + else: + return 0.0 + + def var_loss(self, expected_delays, src_lens, target_padding_mask): + src_lens = src_lens.view(expected_delays.size(0), expected_delays.size(1))[ + :, :1 + ] + if self.var_weight > 0.0: + if self.var_type in self.variance_calculator: + variance_delays = self.variance_calculator[self.var_type]( + expected_delays, + src_lens, + target_padding_mask, + batch_first=True, + start_from_zero=False, + ) + else: + raise RuntimeError(f"{self.var_type} is not supported.") + + return self.var_weight * variance_delays.sum() + else: + return 0.0 + + def loss(self, attention, source_padding_mask=None, target_padding_mask=None): + expected_delays, src_lens = self.expected_delays_from_attention( + attention, source_padding_mask, target_padding_mask + ) + + latency_loss = 0 + + latency_loss += self.avg_loss(expected_delays, src_lens, target_padding_mask) + + latency_loss += self.var_loss(expected_delays, src_lens, target_padding_mask) + + return latency_loss diff --git a/SpeechT5/fairseq/examples/simultaneous_translation/utils/p_choose_strategy.py b/SpeechT5/fairseq/examples/simultaneous_translation/utils/p_choose_strategy.py new file mode 100644 index 0000000..308227e --- /dev/null +++ b/SpeechT5/fairseq/examples/simultaneous_translation/utils/p_choose_strategy.py @@ -0,0 +1,124 @@ +from typing import Optional, Dict +from torch import Tensor +import torch + + +def waitk( + query, key, waitk_lagging: int, num_heads: int, key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None +): + if incremental_state is not None: + # Retrieve target length from incremental states + # For inference the length of query is always 1 + tgt_len = incremental_state["steps"]["tgt"] + assert tgt_len is not None + tgt_len = int(tgt_len) + else: + tgt_len, bsz, _ = query.size() + + max_src_len, bsz, _ = key.size() + + if max_src_len < waitk_lagging: + if incremental_state is not None: + tgt_len = 1 + return query.new_zeros( + bsz * num_heads, tgt_len, max_src_len + ) + + # Assuming the p_choose looks like this for wait k=3 + # src_len = 6, tgt_len = 5 + # [0, 0, 1, 0, 0, 0, 0] + # [0, 0, 0, 1, 0, 0, 0] + # [0, 0, 0, 0, 1, 0, 0] + # [0, 0, 0, 0, 0, 1, 0] + # [0, 0, 0, 0, 0, 0, 1] + # linearize the p_choose matrix: + # [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0...] + # The indices of linearized matrix that equals 1 is + # 2 + 6 * 0 + # 3 + 6 * 1 + # ... + # n + src_len * n + k - 1 = n * (src_len + 1) + k - 1 + # n from 0 to tgt_len - 1 + # + # First, generate the indices (activate_indices_offset: bsz, tgt_len) + # Second, scatter a zeros tensor (bsz, tgt_len * src_len) + # with activate_indices_offset + # Third, resize the tensor to (bsz, tgt_len, src_len) + + activate_indices_offset = ( + ( + torch.arange(tgt_len) * (max_src_len + 1) + + waitk_lagging - 1 + ) + .unsqueeze(0) + .expand(bsz, tgt_len) + .to(query) + .long() + ) + + if key_padding_mask is not None: + if key_padding_mask[:, 0].any(): + # Left padding + activate_indices_offset += ( + key_padding_mask.sum(dim=1, keepdim=True) + ) + + # Need to clamp the indices that are too large + activate_indices_offset = ( + activate_indices_offset + .clamp( + 0, + min( + [ + tgt_len, + max_src_len - waitk_lagging + 1 + ] + ) * max_src_len - 1 + ) + ) + + p_choose = torch.zeros(bsz, tgt_len * max_src_len).to(query) + + p_choose = p_choose.scatter( + 1, + activate_indices_offset, + 1.0 + ).view(bsz, tgt_len, max_src_len) + + if incremental_state is not None: + p_choose = p_choose[:, -1:] + tgt_len = 1 + + # Extend to each head + p_choose = ( + p_choose.contiguous() + .unsqueeze(1) + .expand(-1, num_heads, -1, -1) + .contiguous() + .view(-1, tgt_len, max_src_len) + ) + + return p_choose + + +def hard_aligned(q_proj: Optional[Tensor], k_proj: Optional[Tensor], attn_energy, noise_mean: float = 0.0, noise_var: float = 0.0, training: bool = True): + """ + Calculating step wise prob for reading and writing + 1 to read, 0 to write + """ + + noise = 0 + if training: + # add noise here to encourage discretness + noise = ( + torch.normal(noise_mean, noise_var, attn_energy.size()) + .type_as(attn_energy) + .to(attn_energy.device) + ) + + p_choose = torch.sigmoid(attn_energy + noise) + _, _, tgt_len, src_len = p_choose.size() + + # p_choose: bsz * self.num_heads, tgt_len, src_len + return p_choose.view(-1, tgt_len, src_len) diff --git a/SpeechT5/fairseq/examples/speech_recognition/README.md b/SpeechT5/fairseq/examples/speech_recognition/README.md new file mode 100644 index 0000000..17030bf --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/README.md @@ -0,0 +1,83 @@ +### 2021 Update: We are merging this example into the [S2T framework](../speech_to_text), which supports more generic speech-to-text tasks (e.g. speech translation) and more flexible data processing pipelines. Please stay tuned. + +# Speech Recognition +`examples/speech_recognition` is implementing ASR task in Fairseq, along with needed features, datasets, models and loss functions to train and infer model described in [Transformers with convolutional context for ASR (Abdelrahman Mohamed et al., 2019)](https://arxiv.org/abs/1904.11660). + + +## Additional dependencies +On top of main fairseq dependencies there are couple more additional requirements. + +1) Please follow the instructions to install [torchaudio](https://github.com/pytorch/audio). This is required to compute audio fbank features. +2) [Sclite](http://www1.icsi.berkeley.edu/Speech/docs/sctk-1.2/sclite.htm#sclite_name_0) is used to measure WER. Sclite can be downloaded and installed from source from sctk package [here](http://www.openslr.org/4/). Training and inference doesn't require Sclite dependency. +3) [sentencepiece](https://github.com/google/sentencepiece) is required in order to create dataset with word-piece targets. + +## Preparing librispeech data +``` +./examples/speech_recognition/datasets/prepare-librispeech.sh $DIR_TO_SAVE_RAW_DATA $DIR_FOR_PREPROCESSED_DATA +``` + +## Training librispeech data +``` +python train.py $DIR_FOR_PREPROCESSED_DATA --save-dir $MODEL_PATH --max-epoch 80 --task speech_recognition --arch vggtransformer_2 --optimizer adadelta --lr 1.0 --adadelta-eps 1e-8 --adadelta-rho 0.95 --clip-norm 10.0 --max-tokens 5000 --log-format json --log-interval 1 --criterion cross_entropy_acc --user-dir examples/speech_recognition/ +``` + +## Inference for librispeech +`$SET` can be `test_clean` or `test_other` +Any checkpoint in `$MODEL_PATH` can be selected. In this example we are working with `checkpoint_last.pt` +``` +python examples/speech_recognition/infer.py $DIR_FOR_PREPROCESSED_DATA --task speech_recognition --max-tokens 25000 --nbest 1 --path $MODEL_PATH/checkpoint_last.pt --beam 20 --results-path $RES_DIR --batch-size 40 --gen-subset $SET --user-dir examples/speech_recognition/ +``` + +## Inference for librispeech +``` +sclite -r ${RES_DIR}/ref.word-checkpoint_last.pt-${SET}.txt -h ${RES_DIR}/hypo.word-checkpoint_last.pt-${SET}.txt -i rm -o all stdout > $RES_REPORT +``` +`Sum/Avg` row from first table of the report has WER + +## Using flashlight (previously called [wav2letter](https://github.com/facebookresearch/wav2letter)) components +[flashlight](https://github.com/facebookresearch/flashlight) now has integration with fairseq. Currently this includes: + +* AutoSegmentationCriterion (ASG) +* flashlight-style Conv/GLU model +* flashlight's beam search decoder + +To use these, follow the instructions on [this page](https://github.com/facebookresearch/flashlight/tree/master/bindings/python) to install python bindings. + +## Training librispeech data (flashlight style, Conv/GLU + ASG loss) +Training command: +``` +python train.py $DIR_FOR_PREPROCESSED_DATA --save-dir $MODEL_PATH --max-epoch 100 --task speech_recognition --arch w2l_conv_glu_enc --batch-size 4 --optimizer sgd --lr 0.3,0.8 --momentum 0.8 --clip-norm 0.2 --max-tokens 50000 --log-format json --log-interval 100 --num-workers 0 --sentence-avg --criterion asg_loss --asg-transitions-init 5 --max-replabel 2 --linseg-updates 8789 --user-dir examples/speech_recognition +``` + +Note that ASG loss currently doesn't do well with word-pieces. You should prepare a dataset with character targets by setting `nbpe=31` in `prepare-librispeech.sh`. + +## Inference for librispeech (flashlight decoder, n-gram LM) +Inference command: +``` +python examples/speech_recognition/infer.py $DIR_FOR_PREPROCESSED_DATA --task speech_recognition --seed 1 --nbest 1 --path $MODEL_PATH/checkpoint_last.pt --gen-subset $SET --results-path $RES_DIR --w2l-decoder kenlm --kenlm-model $KENLM_MODEL_PATH --lexicon $LEXICON_PATH --beam 200 --beam-threshold 15 --lm-weight 1.5 --word-score 1.5 --sil-weight -0.3 --criterion asg_loss --max-replabel 2 --user-dir examples/speech_recognition +``` + +`$KENLM_MODEL_PATH` should be a standard n-gram language model file. `$LEXICON_PATH` should be a flashlight-style lexicon (list of known words and their spellings). For ASG inference, a lexicon line should look like this (note the repetition labels): +``` +doorbell D O 1 R B E L 1 ▁ +``` +For CTC inference with word-pieces, repetition labels are not used and the lexicon should have most common spellings for each word (one can use sentencepiece's `NBestEncodeAsPieces` for this): +``` +doorbell ▁DOOR BE LL +doorbell ▁DOOR B E LL +doorbell ▁DO OR BE LL +doorbell ▁DOOR B EL L +doorbell ▁DOOR BE L L +doorbell ▁DO OR B E LL +doorbell ▁DOOR B E L L +doorbell ▁DO OR B EL L +doorbell ▁DO O R BE LL +doorbell ▁DO OR BE L L +``` +Lowercase vs. uppercase matters: the *word* should match the case of the n-gram language model (i.e. `$KENLM_MODEL_PATH`), while the *spelling* should match the case of the token dictionary (i.e. `$DIR_FOR_PREPROCESSED_DATA/dict.txt`). + +## Inference for librispeech (flashlight decoder, viterbi only) +Inference command: +``` +python examples/speech_recognition/infer.py $DIR_FOR_PREPROCESSED_DATA --task speech_recognition --seed 1 --nbest 1 --path $MODEL_PATH/checkpoint_last.pt --gen-subset $SET --results-path $RES_DIR --w2l-decoder viterbi --criterion asg_loss --max-replabel 2 --user-dir examples/speech_recognition +``` diff --git a/SpeechT5/fairseq/examples/speech_recognition/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/__init__.py new file mode 100644 index 0000000..0278f6a --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/__init__.py @@ -0,0 +1 @@ +from . import criterions, models, tasks # noqa diff --git a/SpeechT5/fairseq/examples/speech_recognition/criterions/ASG_loss.py b/SpeechT5/fairseq/examples/speech_recognition/criterions/ASG_loss.py new file mode 100644 index 0000000..41f50bb --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/criterions/ASG_loss.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from examples.speech_recognition.data.replabels import pack_replabels +from fairseq import utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +@register_criterion("asg_loss") +class ASGCriterion(FairseqCriterion): + @staticmethod + def add_args(parser): + group = parser.add_argument_group("ASG Loss") + group.add_argument( + "--asg-transitions-init", + help="initial diagonal value of transition matrix", + type=float, + default=0.0, + ) + group.add_argument( + "--max-replabel", help="maximum # of replabels", type=int, default=2 + ) + group.add_argument( + "--linseg-updates", + help="# of training updates to use LinSeg initialization", + type=int, + default=0, + ) + group.add_argument( + "--hide-linseg-messages", + help="hide messages about LinSeg initialization", + action="store_true", + ) + + def __init__( + self, + task, + silence_token, + asg_transitions_init, + max_replabel, + linseg_updates, + hide_linseg_messages, + ): + from flashlight.lib.sequence.criterion import ASGLoss, CriterionScaleMode + + super().__init__(task) + self.tgt_dict = task.target_dictionary + self.eos = self.tgt_dict.eos() + self.silence = ( + self.tgt_dict.index(silence_token) + if silence_token in self.tgt_dict + else None + ) + self.max_replabel = max_replabel + + num_labels = len(self.tgt_dict) + self.asg = ASGLoss(num_labels, scale_mode=CriterionScaleMode.TARGET_SZ_SQRT) + self.asg.trans = torch.nn.Parameter( + asg_transitions_init * torch.eye(num_labels), requires_grad=True + ) + + self.linseg_progress = torch.nn.Parameter( + torch.tensor([0], dtype=torch.int), requires_grad=False + ) + self.linseg_maximum = linseg_updates + self.linseg_message_state = "none" if hide_linseg_messages else "start" + + @classmethod + def build_criterion(cls, args, task): + return cls( + task, + args.silence_token, + args.asg_transitions_init, + args.max_replabel, + args.linseg_updates, + args.hide_linseg_messages, + ) + + def linseg_step(self): + if not self.training: + return False + if self.linseg_progress.item() < self.linseg_maximum: + if self.linseg_message_state == "start": + print("| using LinSeg to initialize ASG") + self.linseg_message_state = "finish" + self.linseg_progress.add_(1) + return True + elif self.linseg_message_state == "finish": + print("| finished LinSeg initialization") + self.linseg_message_state = "none" + return False + + def replace_eos_with_silence(self, tgt): + if tgt[-1] != self.eos: + return tgt + elif self.silence is None or (len(tgt) > 1 and tgt[-2] == self.silence): + return tgt[:-1] + else: + return tgt[:-1] + [self.silence] + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + + net_output = model(**sample["net_input"]) + emissions = net_output["encoder_out"].transpose(0, 1).contiguous() + B = emissions.size(0) + T = emissions.size(1) + device = emissions.device + + target = torch.IntTensor(B, T) + target_size = torch.IntTensor(B) + using_linseg = self.linseg_step() + + for b in range(B): + initial_target_size = sample["target_lengths"][b].item() + if initial_target_size == 0: + raise ValueError("target size cannot be zero") + + tgt = sample["target"][b, :initial_target_size].tolist() + tgt = self.replace_eos_with_silence(tgt) + tgt = pack_replabels(tgt, self.tgt_dict, self.max_replabel) + tgt = tgt[:T] + + if using_linseg: + tgt = [tgt[t * len(tgt) // T] for t in range(T)] + + target[b][: len(tgt)] = torch.IntTensor(tgt) + target_size[b] = len(tgt) + + loss = self.asg.forward(emissions, target.to(device), target_size.to(device)) + + if reduce: + loss = torch.sum(loss) + + sample_size = ( + sample["target"].size(0) if self.args.sentence_avg else sample["ntokens"] + ) + logging_output = { + "loss": utils.item(loss.data) if reduce else loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + return loss, sample_size, logging_output + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + agg_output = { + "loss": loss_sum / nsentences, + "ntokens": ntokens, + "nsentences": nsentences, + "sample_size": sample_size, + } + return agg_output diff --git a/SpeechT5/fairseq/examples/speech_recognition/criterions/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/criterions/__init__.py new file mode 100644 index 0000000..579abd2 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/criterions/__init__.py @@ -0,0 +1,17 @@ +import importlib +import os + + +# ASG loss requires flashlight bindings +files_to_skip = set() +try: + import flashlight.lib.sequence.criterion +except ImportError: + files_to_skip.add("ASG_loss.py") + +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_") and file not in files_to_skip: + criterion_name = file[: file.find(".py")] + importlib.import_module( + "examples.speech_recognition.criterions." + criterion_name + ) diff --git a/SpeechT5/fairseq/examples/speech_recognition/criterions/cross_entropy_acc.py b/SpeechT5/fairseq/examples/speech_recognition/criterions/cross_entropy_acc.py new file mode 100644 index 0000000..7c4d8ba --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/criterions/cross_entropy_acc.py @@ -0,0 +1,130 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import logging +import math + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +@register_criterion("cross_entropy_acc") +class CrossEntropyWithAccCriterion(FairseqCriterion): + def __init__(self, task, sentence_avg): + super().__init__(task) + self.sentence_avg = sentence_avg + + def compute_loss(self, model, net_output, target, reduction, log_probs): + # N, T -> N * T + target = target.view(-1) + lprobs = model.get_normalized_probs(net_output, log_probs=log_probs) + if not hasattr(lprobs, "batch_first"): + logging.warning( + "ERROR: we need to know whether " + "batch first for the net output; " + "you need to set batch_first attribute for the return value of " + "model.get_normalized_probs. Now, we assume this is true, but " + "in the future, we will raise exception instead. " + ) + batch_first = getattr(lprobs, "batch_first", True) + if not batch_first: + lprobs = lprobs.transpose(0, 1) + + # N, T, D -> N * T, D + lprobs = lprobs.view(-1, lprobs.size(-1)) + loss = F.nll_loss( + lprobs, target, ignore_index=self.padding_idx, reduction=reduction + ) + return lprobs, loss + + def get_logging_output(self, sample, target, lprobs, loss): + target = target.view(-1) + mask = target != self.padding_idx + correct = torch.sum( + lprobs.argmax(1).masked_select(mask) == target.masked_select(mask) + ) + total = torch.sum(mask) + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + + logging_output = { + "loss": utils.item(loss.data), # * sample['ntokens'], + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + "correct": utils.item(correct.data), + "total": utils.item(total.data), + "nframes": torch.sum(sample["net_input"]["src_lengths"]).item(), + } + + return sample_size, logging_output + + def forward(self, model, sample, reduction="sum", log_probs=True): + """Computes the cross entropy with accuracy metric for the given sample. + + This is similar to CrossEntropyCriterion in fairseq, but also + computes accuracy metrics as part of logging + + Args: + logprobs (Torch.tensor) of shape N, T, D i.e. + batchsize, timesteps, dimensions + targets (Torch.tensor) of shape N, T i.e batchsize, timesteps + + Returns: + tuple: With three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + + TODO: + * Currently this Criterion will only work with LSTMEncoderModels or + FairseqModels which have decoder, or Models which return TorchTensor + as net_output. + We need to make a change to support all FairseqEncoder models. + """ + net_output = model(**sample["net_input"]) + target = model.get_targets(sample, net_output) + lprobs, loss = self.compute_loss( + model, net_output, target, reduction, log_probs + ) + sample_size, logging_output = self.get_logging_output( + sample, target, lprobs, loss + ) + return loss, sample_size, logging_output + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + correct_sum = sum(log.get("correct", 0) for log in logging_outputs) + total_sum = sum(log.get("total", 0) for log in logging_outputs) + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + nframes = sum(log.get("nframes", 0) for log in logging_outputs) + agg_output = { + "loss": loss_sum / sample_size / math.log(2) if sample_size > 0 else 0.0, + # if args.sentence_avg, then sample_size is nsentences, then loss + # is per-sentence loss; else sample_size is ntokens, the loss + # becomes per-output token loss + "ntokens": ntokens, + "nsentences": nsentences, + "nframes": nframes, + "sample_size": sample_size, + "acc": correct_sum * 100.0 / total_sum if total_sum > 0 else 0.0, + "correct": correct_sum, + "total": total_sum, + # total is the number of validate tokens + } + if sample_size != ntokens: + agg_output["nll_loss"] = loss_sum / ntokens / math.log(2) + # loss: per output token loss + # nll_loss: per sentence loss + return agg_output diff --git a/SpeechT5/fairseq/examples/speech_recognition/data/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/data/__init__.py new file mode 100644 index 0000000..47bb6e2 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/data/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .asr_dataset import AsrDataset + + +__all__ = [ + "AsrDataset", +] diff --git a/SpeechT5/fairseq/examples/speech_recognition/data/asr_dataset.py b/SpeechT5/fairseq/examples/speech_recognition/data/asr_dataset.py new file mode 100644 index 0000000..63a6fca --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/data/asr_dataset.py @@ -0,0 +1,122 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os + +import numpy as np +from fairseq.data import FairseqDataset + +from . import data_utils +from .collaters import Seq2SeqCollater + + +class AsrDataset(FairseqDataset): + """ + A dataset representing speech and corresponding transcription. + + Args: + aud_paths: (List[str]): A list of str with paths to audio files. + aud_durations_ms (List[int]): A list of int containing the durations of + audio files. + tgt (List[torch.LongTensor]): A list of LongTensors containing the indices + of target transcriptions. + tgt_dict (~fairseq.data.Dictionary): target vocabulary. + ids (List[str]): A list of utterance IDs. + speakers (List[str]): A list of speakers corresponding to utterances. + num_mel_bins (int): Number of triangular mel-frequency bins (default: 80) + frame_length (float): Frame length in milliseconds (default: 25.0) + frame_shift (float): Frame shift in milliseconds (default: 10.0) + """ + + def __init__( + self, + aud_paths, + aud_durations_ms, + tgt, + tgt_dict, + ids, + speakers, + num_mel_bins=80, + frame_length=25.0, + frame_shift=10.0, + ): + assert frame_length > 0 + assert frame_shift > 0 + assert all(x > frame_length for x in aud_durations_ms) + self.frame_sizes = [ + int(1 + (d - frame_length) / frame_shift) for d in aud_durations_ms + ] + + assert len(aud_paths) > 0 + assert len(aud_paths) == len(aud_durations_ms) + assert len(aud_paths) == len(tgt) + assert len(aud_paths) == len(ids) + assert len(aud_paths) == len(speakers) + self.aud_paths = aud_paths + self.tgt_dict = tgt_dict + self.tgt = tgt + self.ids = ids + self.speakers = speakers + self.num_mel_bins = num_mel_bins + self.frame_length = frame_length + self.frame_shift = frame_shift + + self.s2s_collater = Seq2SeqCollater( + 0, + 1, + pad_index=self.tgt_dict.pad(), + eos_index=self.tgt_dict.eos(), + move_eos_to_beginning=True, + ) + + def __getitem__(self, index): + import torchaudio + import torchaudio.compliance.kaldi as kaldi + + tgt_item = self.tgt[index] if self.tgt is not None else None + + path = self.aud_paths[index] + if not os.path.exists(path): + raise FileNotFoundError("Audio file not found: {}".format(path)) + sound, sample_rate = torchaudio.load_wav(path) + output = kaldi.fbank( + sound, + num_mel_bins=self.num_mel_bins, + frame_length=self.frame_length, + frame_shift=self.frame_shift, + ) + output_cmvn = data_utils.apply_mv_norm(output) + + return {"id": index, "data": [output_cmvn.detach(), tgt_item]} + + def __len__(self): + return len(self.aud_paths) + + def collater(self, samples): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[int]): sample indices to collate + + Returns: + dict: a mini-batch suitable for forwarding with a Model + """ + return self.s2s_collater.collate(samples) + + def num_tokens(self, index): + return self.frame_sizes[index] + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return ( + self.frame_sizes[index], + len(self.tgt[index]) if self.tgt is not None else 0, + ) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + return np.arange(len(self)) diff --git a/SpeechT5/fairseq/examples/speech_recognition/data/collaters.py b/SpeechT5/fairseq/examples/speech_recognition/data/collaters.py new file mode 100644 index 0000000..6acfec8 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/data/collaters.py @@ -0,0 +1,131 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" + This module contains collection of classes which implement + collate functionalities for various tasks. + + Collaters should know what data to expect for each sample + and they should pack / collate them into batches +""" + + +from __future__ import absolute_import, division, print_function, unicode_literals + +import numpy as np +import torch +from fairseq.data import data_utils as fairseq_data_utils + + +class Seq2SeqCollater(object): + """ + Implements collate function mainly for seq2seq tasks + This expects each sample to contain feature (src_tokens) and + targets. + This collator is also used for aligned training task. + """ + + def __init__( + self, + feature_index=0, + label_index=1, + pad_index=1, + eos_index=2, + move_eos_to_beginning=True, + ): + self.feature_index = feature_index + self.label_index = label_index + self.pad_index = pad_index + self.eos_index = eos_index + self.move_eos_to_beginning = move_eos_to_beginning + + def _collate_frames(self, frames): + """Convert a list of 2d frames into a padded 3d tensor + Args: + frames (list): list of 2d frames of size L[i]*f_dim. Where L[i] is + length of i-th frame and f_dim is static dimension of features + Returns: + 3d tensor of size len(frames)*len_max*f_dim where len_max is max of L[i] + """ + len_max = max(frame.size(0) for frame in frames) + f_dim = frames[0].size(1) + res = frames[0].new(len(frames), len_max, f_dim).fill_(0.0) + + for i, v in enumerate(frames): + res[i, : v.size(0)] = v + + return res + + def collate(self, samples): + """ + utility function to collate samples into batch for speech recognition. + """ + if len(samples) == 0: + return {} + + # parse samples into torch tensors + parsed_samples = [] + for s in samples: + # skip invalid samples + if s["data"][self.feature_index] is None: + continue + source = s["data"][self.feature_index] + if isinstance(source, (np.ndarray, np.generic)): + source = torch.from_numpy(source) + target = s["data"][self.label_index] + if isinstance(target, (np.ndarray, np.generic)): + target = torch.from_numpy(target).long() + elif isinstance(target, list): + target = torch.LongTensor(target) + + parsed_sample = {"id": s["id"], "source": source, "target": target} + parsed_samples.append(parsed_sample) + samples = parsed_samples + + id = torch.LongTensor([s["id"] for s in samples]) + frames = self._collate_frames([s["source"] for s in samples]) + # sort samples by descending number of frames + frames_lengths = torch.LongTensor([s["source"].size(0) for s in samples]) + frames_lengths, sort_order = frames_lengths.sort(descending=True) + id = id.index_select(0, sort_order) + frames = frames.index_select(0, sort_order) + + target = None + target_lengths = None + prev_output_tokens = None + if samples[0].get("target", None) is not None: + ntokens = sum(len(s["target"]) for s in samples) + target = fairseq_data_utils.collate_tokens( + [s["target"] for s in samples], + self.pad_index, + self.eos_index, + left_pad=False, + move_eos_to_beginning=False, + ) + target = target.index_select(0, sort_order) + target_lengths = torch.LongTensor( + [s["target"].size(0) for s in samples] + ).index_select(0, sort_order) + prev_output_tokens = fairseq_data_utils.collate_tokens( + [s["target"] for s in samples], + self.pad_index, + self.eos_index, + left_pad=False, + move_eos_to_beginning=self.move_eos_to_beginning, + ) + prev_output_tokens = prev_output_tokens.index_select(0, sort_order) + else: + ntokens = sum(len(s["source"]) for s in samples) + + batch = { + "id": id, + "ntokens": ntokens, + "net_input": {"src_tokens": frames, "src_lengths": frames_lengths}, + "target": target, + "target_lengths": target_lengths, + "nsentences": len(samples), + } + if prev_output_tokens is not None: + batch["net_input"]["prev_output_tokens"] = prev_output_tokens + return batch diff --git a/SpeechT5/fairseq/examples/speech_recognition/data/data_utils.py b/SpeechT5/fairseq/examples/speech_recognition/data/data_utils.py new file mode 100644 index 0000000..cc4729e --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/data/data_utils.py @@ -0,0 +1,100 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + + +def calc_mean_invstddev(feature): + if len(feature.size()) != 2: + raise ValueError("We expect the input feature to be 2-D tensor") + mean = feature.mean(0) + var = feature.var(0) + # avoid division by ~zero + eps = 1e-8 + if (var < eps).any(): + return mean, 1.0 / (torch.sqrt(var) + eps) + return mean, 1.0 / torch.sqrt(var) + + +def apply_mv_norm(features): + # If there is less than 2 spectrograms, the variance cannot be computed (is NaN) + # and normalization is not possible, so return the item as it is + if features.size(0) < 2: + return features + mean, invstddev = calc_mean_invstddev(features) + res = (features - mean) * invstddev + return res + + +def lengths_to_encoder_padding_mask(lengths, batch_first=False): + """ + convert lengths (a 1-D Long/Int tensor) to 2-D binary tensor + + Args: + lengths: a (B, )-shaped tensor + + Return: + max_length: maximum length of B sequences + encoder_padding_mask: a (max_length, B) binary mask, where + [t, b] = 0 for t < lengths[b] and 1 otherwise + + TODO: + kernelize this function if benchmarking shows this function is slow + """ + max_lengths = torch.max(lengths).item() + bsz = lengths.size(0) + encoder_padding_mask = torch.arange( + max_lengths + ).to( # a (T, ) tensor with [0, ..., T-1] + lengths.device + ).view( # move to the right device + 1, max_lengths + ).expand( # reshape to (1, T)-shaped tensor + bsz, -1 + ) >= lengths.view( # expand to (B, T)-shaped tensor + bsz, 1 + ).expand( + -1, max_lengths + ) + if not batch_first: + return encoder_padding_mask.t(), max_lengths + else: + return encoder_padding_mask, max_lengths + + +def encoder_padding_mask_to_lengths( + encoder_padding_mask, max_lengths, batch_size, device +): + """ + convert encoder_padding_mask (2-D binary tensor) to a 1-D tensor + + Conventionally, encoder output contains a encoder_padding_mask, which is + a 2-D mask in a shape (T, B), whose (t, b) element indicate whether + encoder_out[t, b] is a valid output (=0) or not (=1). Occasionally, we + need to convert this mask tensor to a 1-D tensor in shape (B, ), where + [b] denotes the valid length of b-th sequence + + Args: + encoder_padding_mask: a (T, B)-shaped binary tensor or None; if None, + indicating all are valid + Return: + seq_lengths: a (B,)-shaped tensor, where its (b, )-th element is the + number of valid elements of b-th sequence + + max_lengths: maximum length of all sequence, if encoder_padding_mask is + not None, max_lengths must equal to encoder_padding_mask.size(0) + + batch_size: batch size; if encoder_padding_mask is + not None, max_lengths must equal to encoder_padding_mask.size(1) + + device: which device to put the result on + """ + if encoder_padding_mask is None: + return torch.Tensor([max_lengths] * batch_size).to(torch.int32).to(device) + + assert encoder_padding_mask.size(0) == max_lengths, "max_lengths does not match" + assert encoder_padding_mask.size(1) == batch_size, "batch_size does not match" + + return max_lengths - torch.sum(encoder_padding_mask, dim=0) diff --git a/SpeechT5/fairseq/examples/speech_recognition/data/replabels.py b/SpeechT5/fairseq/examples/speech_recognition/data/replabels.py new file mode 100644 index 0000000..441f1bd --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/data/replabels.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Replabel transforms for use with flashlight's ASG criterion. +""" + + +def replabel_symbol(i): + """ + Replabel symbols used in flashlight, currently just "1", "2", ... + This prevents training with numeral tokens, so this might change in the future + """ + return str(i) + + +def pack_replabels(tokens, dictionary, max_reps): + """ + Pack a token sequence so that repeated symbols are replaced by replabels + """ + if len(tokens) == 0 or max_reps <= 0: + return tokens + + replabel_value_to_idx = [0] * (max_reps + 1) + for i in range(1, max_reps + 1): + replabel_value_to_idx[i] = dictionary.index(replabel_symbol(i)) + + result = [] + prev_token = -1 + num_reps = 0 + for token in tokens: + if token == prev_token and num_reps < max_reps: + num_reps += 1 + else: + if num_reps > 0: + result.append(replabel_value_to_idx[num_reps]) + num_reps = 0 + result.append(token) + prev_token = token + if num_reps > 0: + result.append(replabel_value_to_idx[num_reps]) + return result + + +def unpack_replabels(tokens, dictionary, max_reps): + """ + Unpack a token sequence so that replabels are replaced by repeated symbols + """ + if len(tokens) == 0 or max_reps <= 0: + return tokens + + replabel_idx_to_value = {} + for i in range(1, max_reps + 1): + replabel_idx_to_value[dictionary.index(replabel_symbol(i))] = i + + result = [] + prev_token = -1 + for token in tokens: + try: + for _ in range(replabel_idx_to_value[token]): + result.append(prev_token) + prev_token = -1 + except KeyError: + result.append(token) + prev_token = token + return result diff --git a/SpeechT5/fairseq/examples/speech_recognition/datasets/asr_prep_json.py b/SpeechT5/fairseq/examples/speech_recognition/datasets/asr_prep_json.py new file mode 100644 index 0000000..b8db8ff --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/datasets/asr_prep_json.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import argparse +import concurrent.futures +import json +import multiprocessing +import os +from collections import namedtuple +from itertools import chain + +import sentencepiece as spm +from fairseq.data import Dictionary + + +MILLISECONDS_TO_SECONDS = 0.001 + + +def process_sample(aud_path, lable, utt_id, sp, tgt_dict): + import torchaudio + + input = {} + output = {} + si, ei = torchaudio.info(aud_path) + input["length_ms"] = int( + si.length / si.channels / si.rate / MILLISECONDS_TO_SECONDS + ) + input["path"] = aud_path + + token = " ".join(sp.EncodeAsPieces(lable)) + ids = tgt_dict.encode_line(token, append_eos=False) + output["text"] = lable + output["token"] = token + output["tokenid"] = ", ".join(map(str, [t.tolist() for t in ids])) + return {utt_id: {"input": input, "output": output}} + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--audio-dirs", + nargs="+", + default=["-"], + required=True, + help="input directories with audio files", + ) + parser.add_argument( + "--labels", + required=True, + help="aggregated input labels with format <ID LABEL> per line", + type=argparse.FileType("r", encoding="UTF-8"), + ) + parser.add_argument( + "--spm-model", + required=True, + help="sentencepiece model to use for encoding", + type=argparse.FileType("r", encoding="UTF-8"), + ) + parser.add_argument( + "--dictionary", + required=True, + help="file to load fairseq dictionary from", + type=argparse.FileType("r", encoding="UTF-8"), + ) + parser.add_argument("--audio-format", choices=["flac", "wav"], default="wav") + parser.add_argument( + "--output", + required=True, + type=argparse.FileType("w"), + help="path to save json output", + ) + args = parser.parse_args() + + sp = spm.SentencePieceProcessor() + sp.Load(args.spm_model.name) + + tgt_dict = Dictionary.load(args.dictionary) + + labels = {} + for line in args.labels: + (utt_id, label) = line.split(" ", 1) + labels[utt_id] = label + if len(labels) == 0: + raise Exception("No labels found in ", args.labels_path) + + Sample = namedtuple("Sample", "aud_path utt_id") + samples = [] + for path, _, files in chain.from_iterable( + os.walk(path) for path in args.audio_dirs + ): + for f in files: + if f.endswith(args.audio_format): + if len(os.path.splitext(f)) != 2: + raise Exception("Expect <utt_id.extension> file name. Got: ", f) + utt_id = os.path.splitext(f)[0] + if utt_id not in labels: + continue + samples.append(Sample(os.path.join(path, f), utt_id)) + + utts = {} + num_cpu = multiprocessing.cpu_count() + with concurrent.futures.ThreadPoolExecutor(max_workers=num_cpu) as executor: + future_to_sample = { + executor.submit( + process_sample, s.aud_path, labels[s.utt_id], s.utt_id, sp, tgt_dict + ): s + for s in samples + } + for future in concurrent.futures.as_completed(future_to_sample): + try: + data = future.result() + except Exception as exc: + print("generated an exception: ", exc) + else: + utts.update(data) + json.dump({"utts": utts}, args.output, indent=4) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/speech_recognition/datasets/prepare-librispeech.sh b/SpeechT5/fairseq/examples/speech_recognition/datasets/prepare-librispeech.sh new file mode 100644 index 0000000..9e9297f --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/datasets/prepare-librispeech.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +# Prepare librispeech dataset + +base_url=www.openslr.org/resources/12 +train_dir=train_960 + +if [ "$#" -ne 2 ]; then + echo "Usage: $0 <download_dir> <out_dir>" + echo "e.g.: $0 /tmp/librispeech_raw/ ~/data/librispeech_final" + exit 1 +fi + +download_dir=${1%/} +out_dir=${2%/} + +fairseq_root=~/fairseq-py/ +mkdir -p ${out_dir} +cd ${out_dir} || exit + +nbpe=5000 +bpemode=unigram + +if [ ! -d "$fairseq_root" ]; then + echo "$0: Please set correct fairseq_root" + exit 1 +fi + +echo "Data Download" +for part in dev-clean test-clean dev-other test-other train-clean-100 train-clean-360 train-other-500; do + url=$base_url/$part.tar.gz + if ! wget -P $download_dir $url; then + echo "$0: wget failed for $url" + exit 1 + fi + if ! tar -C $download_dir -xvzf $download_dir/$part.tar.gz; then + echo "$0: error un-tarring archive $download_dir/$part.tar.gz" + exit 1 + fi +done + +echo "Merge all train packs into one" +mkdir -p ${download_dir}/LibriSpeech/${train_dir}/ +for part in train-clean-100 train-clean-360 train-other-500; do + mv ${download_dir}/LibriSpeech/${part}/* $download_dir/LibriSpeech/${train_dir}/ +done +echo "Merge train text" +find ${download_dir}/LibriSpeech/${train_dir}/ -name '*.txt' -exec cat {} \; >> ${download_dir}/LibriSpeech/${train_dir}/text + +# Use combined dev-clean and dev-other as validation set +find ${download_dir}/LibriSpeech/dev-clean/ ${download_dir}/LibriSpeech/dev-other/ -name '*.txt' -exec cat {} \; >> ${download_dir}/LibriSpeech/valid_text +find ${download_dir}/LibriSpeech/test-clean/ -name '*.txt' -exec cat {} \; >> ${download_dir}/LibriSpeech/test-clean/text +find ${download_dir}/LibriSpeech/test-other/ -name '*.txt' -exec cat {} \; >> ${download_dir}/LibriSpeech/test-other/text + + +dict=data/lang_char/${train_dir}_${bpemode}${nbpe}_units.txt +encoded=data/lang_char/${train_dir}_${bpemode}${nbpe}_encoded.txt +fairseq_dict=data/lang_char/${train_dir}_${bpemode}${nbpe}_fairseq_dict.txt +bpemodel=data/lang_char/${train_dir}_${bpemode}${nbpe} +echo "dictionary: ${dict}" +echo "Dictionary preparation" +mkdir -p data/lang_char/ +echo "<unk> 3" > ${dict} +echo "</s> 2" >> ${dict} +echo "<pad> 1" >> ${dict} +cut -f 2- -d" " ${download_dir}/LibriSpeech/${train_dir}/text > data/lang_char/input.txt +spm_train --input=data/lang_char/input.txt --vocab_size=${nbpe} --model_type=${bpemode} --model_prefix=${bpemodel} --input_sentence_size=100000000 --unk_id=3 --eos_id=2 --pad_id=1 --bos_id=-1 --character_coverage=1 +spm_encode --model=${bpemodel}.model --output_format=piece < data/lang_char/input.txt > ${encoded} +cat ${encoded} | tr ' ' '\n' | sort | uniq | awk '{print $0 " " NR+3}' >> ${dict} +cat ${encoded} | tr ' ' '\n' | sort | uniq -c | awk '{print $2 " " $1}' > ${fairseq_dict} +wc -l ${dict} + +echo "Prepare train and test jsons" +for part in train_960 test-other test-clean; do + python ${fairseq_root}/examples/speech_recognition/datasets/asr_prep_json.py --audio-dirs ${download_dir}/LibriSpeech/${part} --labels ${download_dir}/LibriSpeech/${part}/text --spm-model ${bpemodel}.model --audio-format flac --dictionary ${fairseq_dict} --output ${part}.json +done +# fairseq expects to find train.json and valid.json during training +mv train_960.json train.json + +echo "Prepare valid json" +python ${fairseq_root}/examples/speech_recognition/datasets/asr_prep_json.py --audio-dirs ${download_dir}/LibriSpeech/dev-clean ${download_dir}/LibriSpeech/dev-other --labels ${download_dir}/LibriSpeech/valid_text --spm-model ${bpemodel}.model --audio-format flac --dictionary ${fairseq_dict} --output valid.json + +cp ${fairseq_dict} ./dict.txt +cp ${bpemodel}.model ./spm.model diff --git a/SpeechT5/fairseq/examples/speech_recognition/infer.py b/SpeechT5/fairseq/examples/speech_recognition/infer.py new file mode 100644 index 0000000..6e9a878 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/infer.py @@ -0,0 +1,427 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Run inference for pre-processed data with a trained model. +""" + +import ast +import logging +import math +import os +import sys + +import editdistance +import numpy as np +import torch +from fairseq import checkpoint_utils, options, progress_bar, tasks, utils +from fairseq.data.data_utils import post_process +from fairseq.logging.meters import StopwatchMeter, TimeMeter + + +logging.basicConfig() +logging.root.setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def add_asr_eval_argument(parser): + parser.add_argument("--kspmodel", default=None, help="sentence piece model") + parser.add_argument( + "--wfstlm", default=None, help="wfstlm on dictonary output units" + ) + parser.add_argument( + "--rnnt_decoding_type", + default="greedy", + help="wfstlm on dictonary\ +output units", + ) + try: + parser.add_argument( + "--lm-weight", + "--lm_weight", + type=float, + default=0.2, + help="weight for lm while interpolating with neural score", + ) + except: + pass + parser.add_argument( + "--rnnt_len_penalty", default=-0.5, help="rnnt length penalty on word level" + ) + parser.add_argument( + "--w2l-decoder", + choices=["viterbi", "kenlm", "fairseqlm"], + help="use a w2l decoder", + ) + parser.add_argument("--lexicon", help="lexicon for w2l decoder") + parser.add_argument("--unit-lm", action="store_true", help="if using a unit lm") + parser.add_argument("--kenlm-model", "--lm-model", help="lm model for w2l decoder") + parser.add_argument("--beam-threshold", type=float, default=25.0) + parser.add_argument("--beam-size-token", type=float, default=100) + parser.add_argument("--word-score", type=float, default=1.0) + parser.add_argument("--unk-weight", type=float, default=-math.inf) + parser.add_argument("--sil-weight", type=float, default=0.0) + parser.add_argument( + "--dump-emissions", + type=str, + default=None, + help="if present, dumps emissions into this file and exits", + ) + parser.add_argument( + "--dump-features", + type=str, + default=None, + help="if present, dumps features into this file and exits", + ) + parser.add_argument( + "--load-emissions", + type=str, + default=None, + help="if present, loads emissions from this file", + ) + return parser + + +def check_args(args): + # assert args.path is not None, "--path required for generation!" + # assert args.results_path is not None, "--results_path required for generation!" + assert ( + not args.sampling or args.nbest == args.beam + ), "--sampling requires --nbest to be equal to --beam" + assert ( + args.replace_unk is None or args.raw_text + ), "--replace-unk requires a raw text dataset (--raw-text)" + + +def get_dataset_itr(args, task, models): + return task.get_batch_iterator( + dataset=task.dataset(args.gen_subset), + max_tokens=args.max_tokens, + max_sentences=args.batch_size, + max_positions=(sys.maxsize, sys.maxsize), + ignore_invalid_inputs=args.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=args.required_batch_size_multiple, + num_shards=args.num_shards, + shard_id=args.shard_id, + num_workers=args.num_workers, + data_buffer_size=args.data_buffer_size, + ).next_epoch_itr(shuffle=False) + + +def process_predictions( + args, hypos, sp, tgt_dict, target_tokens, res_files, speaker, id +): + for hypo in hypos[: min(len(hypos), args.nbest)]: + hyp_pieces = tgt_dict.string(hypo["tokens"].int().cpu()) + + if "words" in hypo: + hyp_words = " ".join(hypo["words"]) + else: + hyp_words = post_process(hyp_pieces, args.post_process) + + if res_files is not None: + print( + "{} ({}-{})".format(hyp_pieces, speaker, id), + file=res_files["hypo.units"], + ) + print( + "{} ({}-{})".format(hyp_words, speaker, id), + file=res_files["hypo.words"], + ) + + tgt_pieces = tgt_dict.string(target_tokens) + tgt_words = post_process(tgt_pieces, args.post_process) + + if res_files is not None: + print( + "{} ({}-{})".format(tgt_pieces, speaker, id), + file=res_files["ref.units"], + ) + print( + "{} ({}-{})".format(tgt_words, speaker, id), file=res_files["ref.words"] + ) + + if not args.quiet: + logger.info("HYPO:" + hyp_words) + logger.info("TARGET:" + tgt_words) + logger.info("___________________") + + hyp_words = hyp_words.split() + tgt_words = tgt_words.split() + return editdistance.eval(hyp_words, tgt_words), len(tgt_words) + + +def prepare_result_files(args): + def get_res_file(file_prefix): + if args.num_shards > 1: + file_prefix = f"{args.shard_id}_{file_prefix}" + path = os.path.join( + args.results_path, + "{}-{}-{}.txt".format( + file_prefix, os.path.basename(args.path), args.gen_subset + ), + ) + return open(path, "w", buffering=1) + + if not args.results_path: + return None + + return { + "hypo.words": get_res_file("hypo.word"), + "hypo.units": get_res_file("hypo.units"), + "ref.words": get_res_file("ref.word"), + "ref.units": get_res_file("ref.units"), + } + + +def optimize_models(args, use_cuda, models): + """Optimize ensemble for generation""" + for model in models: + model.make_generation_fast_( + beamable_mm_beam_size=None if args.no_beamable_mm else args.beam, + need_attn=args.print_alignment, + ) + if args.fp16: + model.half() + if use_cuda: + model.cuda() + + +class ExistingEmissionsDecoder(object): + def __init__(self, decoder, emissions): + self.decoder = decoder + self.emissions = emissions + + def generate(self, models, sample, **unused): + ids = sample["id"].cpu().numpy() + try: + emissions = np.stack(self.emissions[ids]) + except: + print([x.shape for x in self.emissions[ids]]) + raise Exception("invalid sizes") + emissions = torch.from_numpy(emissions) + return self.decoder.decode(emissions) + + +def main(args, task=None, model_state=None): + check_args(args) + + if args.max_tokens is None and args.batch_size is None: + args.max_tokens = 4000000 + logger.info(args) + + use_cuda = torch.cuda.is_available() and not args.cpu + + logger.info("| decoding with criterion {}".format(args.criterion)) + + task = tasks.setup_task(args) + + # Load ensemble + if args.load_emissions: + models, criterions = [], [] + task.load_dataset(args.gen_subset) + else: + logger.info("| loading model(s) from {}".format(args.path)) + models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task( + utils.split_paths(args.path, separator="\\"), + arg_overrides=ast.literal_eval(args.model_overrides), + task=task, + suffix=args.checkpoint_suffix, + strict=(args.checkpoint_shard_count == 1), + num_shards=args.checkpoint_shard_count, + state=model_state, + ) + optimize_models(args, use_cuda, models) + task.load_dataset(args.gen_subset, task_cfg=saved_cfg.task) + + + # Set dictionary + tgt_dict = task.target_dictionary + + logger.info( + "| {} {} {} examples".format( + args.data, args.gen_subset, len(task.dataset(args.gen_subset)) + ) + ) + + # hack to pass transitions to W2lDecoder + if args.criterion == "asg_loss": + raise NotImplementedError("asg_loss is currently not supported") + # trans = criterions[0].asg.trans.data + # args.asg_transitions = torch.flatten(trans).tolist() + + # Load dataset (possibly sharded) + itr = get_dataset_itr(args, task, models) + + # Initialize generator + gen_timer = StopwatchMeter() + + def build_generator(args): + w2l_decoder = getattr(args, "w2l_decoder", None) + if w2l_decoder == "viterbi": + from examples.speech_recognition.w2l_decoder import W2lViterbiDecoder + + return W2lViterbiDecoder(args, task.target_dictionary) + elif w2l_decoder == "kenlm": + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + return W2lKenLMDecoder(args, task.target_dictionary) + elif w2l_decoder == "fairseqlm": + from examples.speech_recognition.w2l_decoder import W2lFairseqLMDecoder + + return W2lFairseqLMDecoder(args, task.target_dictionary) + else: + print( + "only flashlight decoders with (viterbi, kenlm, fairseqlm) options are supported at the moment" + ) + + # please do not touch this unless you test both generate.py and infer.py with audio_pretraining task + generator = build_generator(args) + + if args.load_emissions: + generator = ExistingEmissionsDecoder( + generator, np.load(args.load_emissions, allow_pickle=True) + ) + logger.info("loaded emissions from " + args.load_emissions) + + num_sentences = 0 + + if args.results_path is not None and not os.path.exists(args.results_path): + os.makedirs(args.results_path) + + max_source_pos = ( + utils.resolve_max_positions( + task.max_positions(), *[model.max_positions() for model in models] + ), + ) + + if max_source_pos is not None: + max_source_pos = max_source_pos[0] + if max_source_pos is not None: + max_source_pos = max_source_pos[0] - 1 + + if args.dump_emissions: + emissions = {} + if args.dump_features: + features = {} + models[0].bert.proj = None + else: + res_files = prepare_result_files(args) + errs_t = 0 + lengths_t = 0 + with progress_bar.build_progress_bar(args, itr) as t: + wps_meter = TimeMeter() + for sample in t: + sample = utils.move_to_cuda(sample) if use_cuda else sample + if "net_input" not in sample: + continue + + prefix_tokens = None + if args.prefix_size > 0: + prefix_tokens = sample["target"][:, : args.prefix_size] + + gen_timer.start() + if args.dump_emissions: + with torch.no_grad(): + encoder_out = models[0](**sample["net_input"]) + emm = models[0].get_normalized_probs(encoder_out, log_probs=True) + emm = emm.transpose(0, 1).cpu().numpy() + for i, id in enumerate(sample["id"]): + emissions[id.item()] = emm[i] + continue + elif args.dump_features: + with torch.no_grad(): + encoder_out = models[0](**sample["net_input"]) + feat = encoder_out["encoder_out"].transpose(0, 1).cpu().numpy() + for i, id in enumerate(sample["id"]): + padding = ( + encoder_out["encoder_padding_mask"][i].cpu().numpy() + if encoder_out["encoder_padding_mask"] is not None + else None + ) + features[id.item()] = (feat[i], padding) + continue + hypos = task.inference_step(generator, models, sample, prefix_tokens) + num_generated_tokens = sum(len(h[0]["tokens"]) for h in hypos) + gen_timer.stop(num_generated_tokens) + + for i, sample_id in enumerate(sample["id"].tolist()): + speaker = None + # id = task.dataset(args.gen_subset).ids[int(sample_id)] + id = sample_id + toks = ( + sample["target"][i, :] + if "target_label" not in sample + else sample["target_label"][i, :] + ) + target_tokens = utils.strip_pad(toks, tgt_dict.pad()).int().cpu() + # Process top predictions + errs, length = process_predictions( + args, + hypos[i], + None, + tgt_dict, + target_tokens, + res_files, + speaker, + id, + ) + errs_t += errs + lengths_t += length + + wps_meter.update(num_generated_tokens) + t.log({"wps": round(wps_meter.avg)}) + num_sentences += ( + sample["nsentences"] if "nsentences" in sample else sample["id"].numel() + ) + + wer = None + if args.dump_emissions: + emm_arr = [] + for i in range(len(emissions)): + emm_arr.append(emissions[i]) + np.save(args.dump_emissions, emm_arr) + logger.info(f"saved {len(emissions)} emissions to {args.dump_emissions}") + elif args.dump_features: + feat_arr = [] + for i in range(len(features)): + feat_arr.append(features[i]) + np.save(args.dump_features, feat_arr) + logger.info(f"saved {len(features)} emissions to {args.dump_features}") + else: + if lengths_t > 0: + wer = errs_t * 100.0 / lengths_t + logger.info(f"WER: {wer}") + + logger.info( + "| Processed {} sentences ({} tokens) in {:.1f}s ({:.2f}" + "sentences/s, {:.2f} tokens/s)".format( + num_sentences, + gen_timer.n, + gen_timer.sum, + num_sentences / gen_timer.sum, + 1.0 / gen_timer.avg, + ) + ) + logger.info("| Generate {} with beam={}".format(args.gen_subset, args.beam)) + return task, wer + + +def make_parser(): + parser = options.get_generation_parser() + parser = add_asr_eval_argument(parser) + return parser + + +def cli_main(): + parser = make_parser() + args = options.parse_args_and_arch(parser) + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/speech_recognition/kaldi/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/kaldi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/speech_recognition/kaldi/add-self-loop-simple.cc b/SpeechT5/fairseq/examples/speech_recognition/kaldi/add-self-loop-simple.cc new file mode 100644 index 0000000..89754b9 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/kaldi/add-self-loop-simple.cc @@ -0,0 +1,94 @@ +/* +* Copyright (c) Facebook, Inc. and its affiliates. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + +#include <iostream> +#include "fstext/fstext-lib.h" // @manual +#include "util/common-utils.h" // @manual + +/* + * This program is to modify a FST without self-loop by: + * for each incoming arc with non-eps input symbol, add a self-loop arc + * with that non-eps symbol as input and eps as output. + * + * This is to make sure the resultant FST can do deduplication for repeated + * symbols, which is very common in acoustic model + * + */ +namespace { +int32 AddSelfLoopsSimple(fst::StdVectorFst* fst) { + typedef fst::MutableArcIterator<fst::StdVectorFst> IterType; + + int32 num_states_before = fst->NumStates(); + fst::MakePrecedingInputSymbolsSame(false, fst); + int32 num_states_after = fst->NumStates(); + KALDI_LOG << "There are " << num_states_before + << " states in the original FST; " + << " after MakePrecedingInputSymbolsSame, there are " + << num_states_after << " states " << std::endl; + + auto weight_one = fst::StdArc::Weight::One(); + + int32 num_arc_added = 0; + + fst::StdArc self_loop_arc; + self_loop_arc.weight = weight_one; + + int32 num_states = fst->NumStates(); + std::vector<std::set<int32>> incoming_non_eps_label_per_state(num_states); + + for (int32 state = 0; state < num_states; state++) { + for (IterType aiter(fst, state); !aiter.Done(); aiter.Next()) { + fst::StdArc arc(aiter.Value()); + if (arc.ilabel != 0) { + incoming_non_eps_label_per_state[arc.nextstate].insert(arc.ilabel); + } + } + } + + for (int32 state = 0; state < num_states; state++) { + if (!incoming_non_eps_label_per_state[state].empty()) { + auto& ilabel_set = incoming_non_eps_label_per_state[state]; + for (auto it = ilabel_set.begin(); it != ilabel_set.end(); it++) { + self_loop_arc.ilabel = *it; + self_loop_arc.olabel = 0; + self_loop_arc.nextstate = state; + fst->AddArc(state, self_loop_arc); + num_arc_added++; + } + } + } + return num_arc_added; +} + +void print_usage() { + std::cout << "add-self-loop-simple usage:\n" + "\tadd-self-loop-simple <in-fst> <out-fst> \n"; +} +} // namespace + +int main(int argc, char** argv) { + if (argc != 3) { + print_usage(); + exit(1); + } + + auto input = argv[1]; + auto output = argv[2]; + + auto fst = fst::ReadFstKaldi(input); + auto num_states = fst->NumStates(); + KALDI_LOG << "Loading FST from " << input << " with " << num_states + << " states." << std::endl; + + int32 num_arc_added = AddSelfLoopsSimple(fst); + KALDI_LOG << "Adding " << num_arc_added << " self-loop arcs " << std::endl; + + fst::WriteFstKaldi(*fst, std::string(output)); + KALDI_LOG << "Writing FST to " << output << std::endl; + + delete fst; +} \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/speech_recognition/kaldi/config/kaldi_initializer.yaml b/SpeechT5/fairseq/examples/speech_recognition/kaldi/config/kaldi_initializer.yaml new file mode 100644 index 0000000..be9ba98 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/kaldi/config/kaldi_initializer.yaml @@ -0,0 +1,8 @@ +# @package _group_ + +data_dir: ??? +fst_dir: ??? +in_labels: ??? +kaldi_root: ??? +lm_arpa: ??? +blank_symbol: <s> diff --git a/SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_decoder.py b/SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_decoder.py new file mode 100644 index 0000000..5f62cc5 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_decoder.py @@ -0,0 +1,244 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from concurrent.futures import ThreadPoolExecutor +import logging +from omegaconf import MISSING +import os +import torch +from typing import Optional +import warnings + + +from dataclasses import dataclass +from fairseq.dataclass import FairseqDataclass +from .kaldi_initializer import KaldiInitializerConfig, initalize_kaldi + + +logger = logging.getLogger(__name__) + + +@dataclass +class KaldiDecoderConfig(FairseqDataclass): + hlg_graph_path: Optional[str] = None + output_dict: str = MISSING + + kaldi_initializer_config: Optional[KaldiInitializerConfig] = None + + acoustic_scale: float = 0.5 + max_active: int = 10000 + beam_delta: float = 0.5 + hash_ratio: float = 2.0 + + is_lattice: bool = False + lattice_beam: float = 10.0 + prune_interval: int = 25 + determinize_lattice: bool = True + prune_scale: float = 0.1 + max_mem: int = 0 + phone_determinize: bool = True + word_determinize: bool = True + minimize: bool = True + + num_threads: int = 1 + + +class KaldiDecoder(object): + def __init__( + self, + cfg: KaldiDecoderConfig, + beam: int, + nbest: int = 1, + ): + try: + from kaldi.asr import FasterRecognizer, LatticeFasterRecognizer + from kaldi.base import set_verbose_level + from kaldi.decoder import ( + FasterDecoder, + FasterDecoderOptions, + LatticeFasterDecoder, + LatticeFasterDecoderOptions, + ) + from kaldi.lat.functions import DeterminizeLatticePhonePrunedOptions + from kaldi.fstext import read_fst_kaldi, SymbolTable + except: + warnings.warn( + "pykaldi is required for this functionality. Please install from https://github.com/pykaldi/pykaldi" + ) + + # set_verbose_level(2) + + self.acoustic_scale = cfg.acoustic_scale + self.nbest = nbest + + if cfg.hlg_graph_path is None: + assert ( + cfg.kaldi_initializer_config is not None + ), "Must provide hlg graph path or kaldi initializer config" + cfg.hlg_graph_path = initalize_kaldi(cfg.kaldi_initializer_config) + + assert os.path.exists(cfg.hlg_graph_path), cfg.hlg_graph_path + + if cfg.is_lattice: + self.dec_cls = LatticeFasterDecoder + opt_cls = LatticeFasterDecoderOptions + self.rec_cls = LatticeFasterRecognizer + else: + assert self.nbest == 1, "nbest > 1 requires lattice decoder" + self.dec_cls = FasterDecoder + opt_cls = FasterDecoderOptions + self.rec_cls = FasterRecognizer + + self.decoder_options = opt_cls() + self.decoder_options.beam = beam + self.decoder_options.max_active = cfg.max_active + self.decoder_options.beam_delta = cfg.beam_delta + self.decoder_options.hash_ratio = cfg.hash_ratio + + if cfg.is_lattice: + self.decoder_options.lattice_beam = cfg.lattice_beam + self.decoder_options.prune_interval = cfg.prune_interval + self.decoder_options.determinize_lattice = cfg.determinize_lattice + self.decoder_options.prune_scale = cfg.prune_scale + det_opts = DeterminizeLatticePhonePrunedOptions() + det_opts.max_mem = cfg.max_mem + det_opts.phone_determinize = cfg.phone_determinize + det_opts.word_determinize = cfg.word_determinize + det_opts.minimize = cfg.minimize + self.decoder_options.det_opts = det_opts + + self.output_symbols = {} + with open(cfg.output_dict, "r") as f: + for line in f: + items = line.rstrip().split() + assert len(items) == 2 + self.output_symbols[int(items[1])] = items[0] + + logger.info(f"Loading FST from {cfg.hlg_graph_path}") + self.fst = read_fst_kaldi(cfg.hlg_graph_path) + self.symbol_table = SymbolTable.read_text(cfg.output_dict) + + self.executor = ThreadPoolExecutor(max_workers=cfg.num_threads) + + def generate(self, models, sample, **unused): + """Generate a batch of inferences.""" + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in sample["net_input"].items() if k != "prev_output_tokens" + } + emissions, padding = self.get_emissions(models, encoder_input) + return self.decode(emissions, padding) + + def get_emissions(self, models, encoder_input): + """Run encoder and normalize emissions""" + model = models[0] + + all_encoder_out = [m(**encoder_input) for m in models] + + if len(all_encoder_out) > 1: + + if "encoder_out" in all_encoder_out[0]: + encoder_out = { + "encoder_out": sum(e["encoder_out"] for e in all_encoder_out) + / len(all_encoder_out), + "encoder_padding_mask": all_encoder_out[0]["encoder_padding_mask"], + } + padding = encoder_out["encoder_padding_mask"] + else: + encoder_out = { + "logits": sum(e["logits"] for e in all_encoder_out) + / len(all_encoder_out), + "padding_mask": all_encoder_out[0]["padding_mask"], + } + padding = encoder_out["padding_mask"] + else: + encoder_out = all_encoder_out[0] + padding = ( + encoder_out["padding_mask"] + if "padding_mask" in encoder_out + else encoder_out["encoder_padding_mask"] + ) + + if hasattr(model, "get_logits"): + emissions = model.get_logits(encoder_out, normalize=True) + else: + emissions = model.get_normalized_probs(encoder_out, log_probs=True) + + return ( + emissions.cpu().float().transpose(0, 1), + padding.cpu() if padding is not None and padding.any() else None, + ) + + def decode_one(self, logits, padding): + from kaldi.matrix import Matrix + + decoder = self.dec_cls(self.fst, self.decoder_options) + asr = self.rec_cls( + decoder, self.symbol_table, acoustic_scale=self.acoustic_scale + ) + + if padding is not None: + logits = logits[~padding] + + mat = Matrix(logits.numpy()) + + out = asr.decode(mat) + + if self.nbest > 1: + from kaldi.fstext import shortestpath + from kaldi.fstext.utils import ( + convert_compact_lattice_to_lattice, + convert_lattice_to_std, + convert_nbest_to_list, + get_linear_symbol_sequence, + ) + + lat = out["lattice"] + + sp = shortestpath(lat, nshortest=self.nbest) + + sp = convert_compact_lattice_to_lattice(sp) + sp = convert_lattice_to_std(sp) + seq = convert_nbest_to_list(sp) + + results = [] + for s in seq: + _, o, w = get_linear_symbol_sequence(s) + words = list(self.output_symbols[z] for z in o) + results.append( + { + "tokens": words, + "words": words, + "score": w.value, + "emissions": logits, + } + ) + return results + else: + words = out["text"].split() + return [ + { + "tokens": words, + "words": words, + "score": out["likelihood"], + "emissions": logits, + } + ] + + def decode(self, emissions, padding): + if padding is None: + padding = [None] * len(emissions) + + ret = list( + map( + lambda e, p: self.executor.submit(self.decode_one, e, p), + emissions, + padding, + ) + ) + return ret diff --git a/SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_initializer.py b/SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_initializer.py new file mode 100644 index 0000000..6d2a2a4 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/kaldi/kaldi_initializer.py @@ -0,0 +1,698 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass +import hydra +from hydra.core.config_store import ConfigStore +import logging +from omegaconf import MISSING, OmegaConf +import os +import os.path as osp +from pathlib import Path +import subprocess +from typing import Optional + +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass import FairseqDataclass + +script_dir = Path(__file__).resolve().parent +config_path = script_dir / "config" + + +logger = logging.getLogger(__name__) + + +@dataclass +class KaldiInitializerConfig(FairseqDataclass): + data_dir: str = MISSING + fst_dir: Optional[str] = None + in_labels: str = MISSING + out_labels: Optional[str] = None + wav2letter_lexicon: Optional[str] = None + lm_arpa: str = MISSING + kaldi_root: str = MISSING + blank_symbol: str = "<s>" + silence_symbol: Optional[str] = None + + +def create_units(fst_dir: Path, in_labels: str, vocab: Dictionary) -> Path: + in_units_file = fst_dir / f"kaldi_dict.{in_labels}.txt" + if not in_units_file.exists(): + + logger.info(f"Creating {in_units_file}") + + with open(in_units_file, "w") as f: + print("<eps> 0", file=f) + i = 1 + for symb in vocab.symbols[vocab.nspecial :]: + if not symb.startswith("madeupword"): + print(f"{symb} {i}", file=f) + i += 1 + return in_units_file + + +def create_lexicon( + cfg: KaldiInitializerConfig, + fst_dir: Path, + unique_label: str, + in_units_file: Path, + out_words_file: Path, +) -> (Path, Path): + + disambig_in_units_file = fst_dir / f"kaldi_dict.{cfg.in_labels}_disambig.txt" + lexicon_file = fst_dir / f"kaldi_lexicon.{unique_label}.txt" + disambig_lexicon_file = fst_dir / f"kaldi_lexicon.{unique_label}_disambig.txt" + if ( + not lexicon_file.exists() + or not disambig_lexicon_file.exists() + or not disambig_in_units_file.exists() + ): + logger.info(f"Creating {lexicon_file} (in units file: {in_units_file})") + + assert cfg.wav2letter_lexicon is not None or cfg.in_labels == cfg.out_labels + + if cfg.wav2letter_lexicon is not None: + lm_words = set() + with open(out_words_file, "r") as lm_dict_f: + for line in lm_dict_f: + lm_words.add(line.split()[0]) + + num_skipped = 0 + total = 0 + with open(cfg.wav2letter_lexicon, "r") as w2l_lex_f, open( + lexicon_file, "w" + ) as out_f: + for line in w2l_lex_f: + items = line.rstrip().split("\t") + assert len(items) == 2, items + if items[0] in lm_words: + print(items[0], items[1], file=out_f) + else: + num_skipped += 1 + logger.debug( + f"Skipping word {items[0]} as it was not found in LM" + ) + total += 1 + if num_skipped > 0: + logger.warning( + f"Skipped {num_skipped} out of {total} words as they were not found in LM" + ) + else: + with open(in_units_file, "r") as in_f, open(lexicon_file, "w") as out_f: + for line in in_f: + symb = line.split()[0] + if symb != "<eps>" and symb != "<ctc_blank>" and symb != "<SIL>": + print(symb, symb, file=out_f) + + lex_disambig_path = ( + Path(cfg.kaldi_root) / "egs/wsj/s5/utils/add_lex_disambig.pl" + ) + res = subprocess.run( + [lex_disambig_path, lexicon_file, disambig_lexicon_file], + check=True, + capture_output=True, + ) + ndisambig = int(res.stdout) + disamib_path = Path(cfg.kaldi_root) / "egs/wsj/s5/utils/add_disambig.pl" + res = subprocess.run( + [disamib_path, "--include-zero", in_units_file, str(ndisambig)], + check=True, + capture_output=True, + ) + with open(disambig_in_units_file, "wb") as f: + f.write(res.stdout) + + return disambig_lexicon_file, disambig_in_units_file + + +def create_G( + kaldi_root: Path, fst_dir: Path, lm_arpa: Path, arpa_base: str +) -> (Path, Path): + + out_words_file = fst_dir / f"kaldi_dict.{arpa_base}.txt" + grammar_graph = fst_dir / f"G_{arpa_base}.fst" + if not grammar_graph.exists() or not out_words_file.exists(): + logger.info(f"Creating {grammar_graph}") + arpa2fst = kaldi_root / "src/lmbin/arpa2fst" + subprocess.run( + [ + arpa2fst, + "--disambig-symbol=#0", + f"--write-symbol-table={out_words_file}", + lm_arpa, + grammar_graph, + ], + check=True, + ) + return grammar_graph, out_words_file + + +def create_L( + kaldi_root: Path, + fst_dir: Path, + unique_label: str, + lexicon_file: Path, + in_units_file: Path, + out_words_file: Path, +) -> Path: + lexicon_graph = fst_dir / f"L.{unique_label}.fst" + + if not lexicon_graph.exists(): + logger.info(f"Creating {lexicon_graph} (in units: {in_units_file})") + make_lex = kaldi_root / "egs/wsj/s5/utils/make_lexicon_fst.pl" + fstcompile = kaldi_root / "tools/openfst-1.6.7/bin/fstcompile" + fstaddselfloops = kaldi_root / "src/fstbin/fstaddselfloops" + fstarcsort = kaldi_root / "tools/openfst-1.6.7/bin/fstarcsort" + + def write_disambig_symbol(file): + with open(file, "r") as f: + for line in f: + items = line.rstrip().split() + if items[0] == "#0": + out_path = str(file) + "_disamig" + with open(out_path, "w") as out_f: + print(items[1], file=out_f) + return out_path + + return None + + in_disambig_sym = write_disambig_symbol(in_units_file) + assert in_disambig_sym is not None + out_disambig_sym = write_disambig_symbol(out_words_file) + assert out_disambig_sym is not None + + try: + with open(lexicon_graph, "wb") as out_f: + res = subprocess.run( + [make_lex, lexicon_file], capture_output=True, check=True + ) + assert len(res.stderr) == 0, res.stderr.decode("utf-8") + res = subprocess.run( + [ + fstcompile, + f"--isymbols={in_units_file}", + f"--osymbols={out_words_file}", + "--keep_isymbols=false", + "--keep_osymbols=false", + ], + input=res.stdout, + capture_output=True, + ) + assert len(res.stderr) == 0, res.stderr.decode("utf-8") + res = subprocess.run( + [fstaddselfloops, in_disambig_sym, out_disambig_sym], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstarcsort, "--sort_type=olabel"], + input=res.stdout, + capture_output=True, + check=True, + ) + out_f.write(res.stdout) + except subprocess.CalledProcessError as e: + logger.error(f"cmd: {e.cmd}, err: {e.stderr.decode('utf-8')}") + os.remove(lexicon_graph) + raise + except AssertionError: + os.remove(lexicon_graph) + raise + + return lexicon_graph + + +def create_LG( + kaldi_root: Path, + fst_dir: Path, + unique_label: str, + lexicon_graph: Path, + grammar_graph: Path, +) -> Path: + lg_graph = fst_dir / f"LG.{unique_label}.fst" + + if not lg_graph.exists(): + logger.info(f"Creating {lg_graph}") + + fsttablecompose = kaldi_root / "src/fstbin/fsttablecompose" + fstdeterminizestar = kaldi_root / "src/fstbin/fstdeterminizestar" + fstminimizeencoded = kaldi_root / "src/fstbin/fstminimizeencoded" + fstpushspecial = kaldi_root / "src/fstbin/fstpushspecial" + fstarcsort = kaldi_root / "tools/openfst-1.6.7/bin/fstarcsort" + + try: + with open(lg_graph, "wb") as out_f: + res = subprocess.run( + [fsttablecompose, lexicon_graph, grammar_graph], + capture_output=True, + check=True, + ) + res = subprocess.run( + [ + fstdeterminizestar, + "--use-log=true", + ], + input=res.stdout, + capture_output=True, + ) + res = subprocess.run( + [fstminimizeencoded], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstpushspecial], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstarcsort, "--sort_type=ilabel"], + input=res.stdout, + capture_output=True, + check=True, + ) + out_f.write(res.stdout) + except subprocess.CalledProcessError as e: + logger.error(f"cmd: {e.cmd}, err: {e.stderr.decode('utf-8')}") + os.remove(lg_graph) + raise + + return lg_graph + + +def create_H( + kaldi_root: Path, + fst_dir: Path, + disambig_out_units_file: Path, + in_labels: str, + vocab: Dictionary, + blk_sym: str, + silence_symbol: Optional[str], +) -> (Path, Path, Path): + h_graph = ( + fst_dir / f"H.{in_labels}{'_' + silence_symbol if silence_symbol else ''}.fst" + ) + h_out_units_file = fst_dir / f"kaldi_dict.h_out.{in_labels}.txt" + disambig_in_units_file_int = Path(str(h_graph) + "isym_disambig.int") + disambig_out_units_file_int = Path(str(disambig_out_units_file) + ".int") + if ( + not h_graph.exists() + or not h_out_units_file.exists() + or not disambig_in_units_file_int.exists() + ): + logger.info(f"Creating {h_graph}") + eps_sym = "<eps>" + + num_disambig = 0 + osymbols = [] + + with open(disambig_out_units_file, "r") as f, open( + disambig_out_units_file_int, "w" + ) as out_f: + for line in f: + symb, id = line.rstrip().split() + if line.startswith("#"): + num_disambig += 1 + print(id, file=out_f) + else: + if len(osymbols) == 0: + assert symb == eps_sym, symb + osymbols.append((symb, id)) + + i_idx = 0 + isymbols = [(eps_sym, 0)] + + imap = {} + + for i, s in enumerate(vocab.symbols): + i_idx += 1 + isymbols.append((s, i_idx)) + imap[s] = i_idx + + fst_str = [] + + node_idx = 0 + root_node = node_idx + + special_symbols = [blk_sym] + if silence_symbol is not None: + special_symbols.append(silence_symbol) + + for ss in special_symbols: + fst_str.append("{} {} {} {}".format(root_node, root_node, ss, eps_sym)) + + for symbol, _ in osymbols: + if symbol == eps_sym or symbol.startswith("#"): + continue + + node_idx += 1 + # 1. from root to emitting state + fst_str.append("{} {} {} {}".format(root_node, node_idx, symbol, symbol)) + # 2. from emitting state back to root + fst_str.append("{} {} {} {}".format(node_idx, root_node, eps_sym, eps_sym)) + # 3. from emitting state to optional blank state + pre_node = node_idx + node_idx += 1 + for ss in special_symbols: + fst_str.append("{} {} {} {}".format(pre_node, node_idx, ss, eps_sym)) + # 4. from blank state back to root + fst_str.append("{} {} {} {}".format(node_idx, root_node, eps_sym, eps_sym)) + + fst_str.append("{}".format(root_node)) + + fst_str = "\n".join(fst_str) + h_str = str(h_graph) + isym_file = h_str + ".isym" + + with open(isym_file, "w") as f: + for sym, id in isymbols: + f.write("{} {}\n".format(sym, id)) + + with open(h_out_units_file, "w") as f: + for sym, id in osymbols: + f.write("{} {}\n".format(sym, id)) + + with open(disambig_in_units_file_int, "w") as f: + disam_sym_id = len(isymbols) + for _ in range(num_disambig): + f.write("{}\n".format(disam_sym_id)) + disam_sym_id += 1 + + fstcompile = kaldi_root / "tools/openfst-1.6.7/bin/fstcompile" + fstaddselfloops = kaldi_root / "src/fstbin/fstaddselfloops" + fstarcsort = kaldi_root / "tools/openfst-1.6.7/bin/fstarcsort" + + try: + with open(h_graph, "wb") as out_f: + res = subprocess.run( + [ + fstcompile, + f"--isymbols={isym_file}", + f"--osymbols={h_out_units_file}", + "--keep_isymbols=false", + "--keep_osymbols=false", + ], + input=str.encode(fst_str), + capture_output=True, + check=True, + ) + res = subprocess.run( + [ + fstaddselfloops, + disambig_in_units_file_int, + disambig_out_units_file_int, + ], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstarcsort, "--sort_type=olabel"], + input=res.stdout, + capture_output=True, + check=True, + ) + out_f.write(res.stdout) + except subprocess.CalledProcessError as e: + logger.error(f"cmd: {e.cmd}, err: {e.stderr.decode('utf-8')}") + os.remove(h_graph) + raise + return h_graph, h_out_units_file, disambig_in_units_file_int + + +def create_HLGa( + kaldi_root: Path, + fst_dir: Path, + unique_label: str, + h_graph: Path, + lg_graph: Path, + disambig_in_words_file_int: Path, +) -> Path: + hlga_graph = fst_dir / f"HLGa.{unique_label}.fst" + + if not hlga_graph.exists(): + logger.info(f"Creating {hlga_graph}") + + fsttablecompose = kaldi_root / "src/fstbin/fsttablecompose" + fstdeterminizestar = kaldi_root / "src/fstbin/fstdeterminizestar" + fstrmsymbols = kaldi_root / "src/fstbin/fstrmsymbols" + fstrmepslocal = kaldi_root / "src/fstbin/fstrmepslocal" + fstminimizeencoded = kaldi_root / "src/fstbin/fstminimizeencoded" + + try: + with open(hlga_graph, "wb") as out_f: + res = subprocess.run( + [ + fsttablecompose, + h_graph, + lg_graph, + ], + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstdeterminizestar, "--use-log=true"], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstrmsymbols, disambig_in_words_file_int], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstrmepslocal], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstminimizeencoded], + input=res.stdout, + capture_output=True, + check=True, + ) + out_f.write(res.stdout) + except subprocess.CalledProcessError as e: + logger.error(f"cmd: {e.cmd}, err: {e.stderr.decode('utf-8')}") + os.remove(hlga_graph) + raise + + return hlga_graph + + +def create_HLa( + kaldi_root: Path, + fst_dir: Path, + unique_label: str, + h_graph: Path, + l_graph: Path, + disambig_in_words_file_int: Path, +) -> Path: + hla_graph = fst_dir / f"HLa.{unique_label}.fst" + + if not hla_graph.exists(): + logger.info(f"Creating {hla_graph}") + + fsttablecompose = kaldi_root / "src/fstbin/fsttablecompose" + fstdeterminizestar = kaldi_root / "src/fstbin/fstdeterminizestar" + fstrmsymbols = kaldi_root / "src/fstbin/fstrmsymbols" + fstrmepslocal = kaldi_root / "src/fstbin/fstrmepslocal" + fstminimizeencoded = kaldi_root / "src/fstbin/fstminimizeencoded" + + try: + with open(hla_graph, "wb") as out_f: + res = subprocess.run( + [ + fsttablecompose, + h_graph, + l_graph, + ], + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstdeterminizestar, "--use-log=true"], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstrmsymbols, disambig_in_words_file_int], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstrmepslocal], + input=res.stdout, + capture_output=True, + check=True, + ) + res = subprocess.run( + [fstminimizeencoded], + input=res.stdout, + capture_output=True, + check=True, + ) + out_f.write(res.stdout) + except subprocess.CalledProcessError as e: + logger.error(f"cmd: {e.cmd}, err: {e.stderr.decode('utf-8')}") + os.remove(hla_graph) + raise + + return hla_graph + + +def create_HLG( + kaldi_root: Path, + fst_dir: Path, + unique_label: str, + hlga_graph: Path, + prefix: str = "HLG", +) -> Path: + hlg_graph = fst_dir / f"{prefix}.{unique_label}.fst" + + if not hlg_graph.exists(): + logger.info(f"Creating {hlg_graph}") + + add_self_loop = script_dir / "add-self-loop-simple" + kaldi_src = kaldi_root / "src" + kaldi_lib = kaldi_src / "lib" + + try: + if not add_self_loop.exists(): + fst_include = kaldi_root / "tools/openfst-1.6.7/include" + add_self_loop_src = script_dir / "add-self-loop-simple.cc" + + subprocess.run( + [ + "c++", + f"-I{kaldi_src}", + f"-I{fst_include}", + f"-L{kaldi_lib}", + add_self_loop_src, + "-lkaldi-base", + "-lkaldi-fstext", + "-o", + add_self_loop, + ], + check=True, + ) + + my_env = os.environ.copy() + my_env["LD_LIBRARY_PATH"] = f"{kaldi_lib}:{my_env['LD_LIBRARY_PATH']}" + + subprocess.run( + [ + add_self_loop, + hlga_graph, + hlg_graph, + ], + check=True, + capture_output=True, + env=my_env, + ) + except subprocess.CalledProcessError as e: + logger.error(f"cmd: {e.cmd}, err: {e.stderr.decode('utf-8')}") + raise + + return hlg_graph + + +def initalize_kaldi(cfg: KaldiInitializerConfig) -> Path: + if cfg.fst_dir is None: + cfg.fst_dir = osp.join(cfg.data_dir, "kaldi") + if cfg.out_labels is None: + cfg.out_labels = cfg.in_labels + + kaldi_root = Path(cfg.kaldi_root) + data_dir = Path(cfg.data_dir) + fst_dir = Path(cfg.fst_dir) + fst_dir.mkdir(parents=True, exist_ok=True) + + arpa_base = osp.splitext(osp.basename(cfg.lm_arpa))[0] + unique_label = f"{cfg.in_labels}.{arpa_base}" + + with open(data_dir / f"dict.{cfg.in_labels}.txt", "r") as f: + vocab = Dictionary.load(f) + + in_units_file = create_units(fst_dir, cfg.in_labels, vocab) + + grammar_graph, out_words_file = create_G( + kaldi_root, fst_dir, Path(cfg.lm_arpa), arpa_base + ) + + disambig_lexicon_file, disambig_L_in_units_file = create_lexicon( + cfg, fst_dir, unique_label, in_units_file, out_words_file + ) + + h_graph, h_out_units_file, disambig_in_units_file_int = create_H( + kaldi_root, + fst_dir, + disambig_L_in_units_file, + cfg.in_labels, + vocab, + cfg.blank_symbol, + cfg.silence_symbol, + ) + lexicon_graph = create_L( + kaldi_root, + fst_dir, + unique_label, + disambig_lexicon_file, + disambig_L_in_units_file, + out_words_file, + ) + lg_graph = create_LG( + kaldi_root, fst_dir, unique_label, lexicon_graph, grammar_graph + ) + hlga_graph = create_HLGa( + kaldi_root, fst_dir, unique_label, h_graph, lg_graph, disambig_in_units_file_int + ) + hlg_graph = create_HLG(kaldi_root, fst_dir, unique_label, hlga_graph) + + # for debugging + # hla_graph = create_HLa(kaldi_root, fst_dir, unique_label, h_graph, lexicon_graph, disambig_in_units_file_int) + # hl_graph = create_HLG(kaldi_root, fst_dir, unique_label, hla_graph, prefix="HL_looped") + # create_HLG(kaldi_root, fst_dir, "phnc", h_graph, prefix="H_looped") + + return hlg_graph + + +@hydra.main(config_path=config_path, config_name="kaldi_initializer") +def cli_main(cfg: KaldiInitializerConfig) -> None: + container = OmegaConf.to_container(cfg, resolve=True, enum_to_str=True) + cfg = OmegaConf.create(container) + OmegaConf.set_struct(cfg, True) + initalize_kaldi(cfg) + + +if __name__ == "__main__": + + logging.root.setLevel(logging.INFO) + logging.basicConfig(level=logging.INFO) + + try: + from hydra._internal.utils import ( + get_args, + ) # pylint: disable=import-outside-toplevel + + cfg_name = get_args().config_name or "kaldi_initializer" + except ImportError: + logger.warning("Failed to get config name from hydra args") + cfg_name = "kaldi_initializer" + + cs = ConfigStore.instance() + cs.store(name=cfg_name, node=KaldiInitializerConfig) + + cli_main() diff --git a/SpeechT5/fairseq/examples/speech_recognition/models/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/models/__init__.py new file mode 100644 index 0000000..54b5a1c --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/models/__init__.py @@ -0,0 +1,8 @@ +import importlib +import os + + +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + model_name = file[: file.find(".py")] + importlib.import_module("examples.speech_recognition.models." + model_name) diff --git a/SpeechT5/fairseq/examples/speech_recognition/models/vggtransformer.py b/SpeechT5/fairseq/examples/speech_recognition/models/vggtransformer.py new file mode 100644 index 0000000..9797436 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/models/vggtransformer.py @@ -0,0 +1,1019 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import math +from collections.abc import Iterable + +import torch +import torch.nn as nn +from examples.speech_recognition.data.data_utils import lengths_to_encoder_padding_mask +from fairseq import utils +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqEncoderModel, + FairseqIncrementalDecoder, + register_model, + register_model_architecture, +) +from fairseq.modules import ( + LinearizedConvolution, + TransformerDecoderLayer, + TransformerEncoderLayer, + VGGBlock, +) + + +@register_model("asr_vggtransformer") +class VGGTransformerModel(FairseqEncoderDecoderModel): + """ + Transformers with convolutional context for ASR + https://arxiv.org/abs/1904.11660 + """ + + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--input-feat-per-channel", + type=int, + metavar="N", + help="encoder input dimension per input channel", + ) + parser.add_argument( + "--vggblock-enc-config", + type=str, + metavar="EXPR", + help=""" + an array of tuples each containing the configuration of one vggblock: + [(out_channels, + conv_kernel_size, + pooling_kernel_size, + num_conv_layers, + use_layer_norm), ...]) + """, + ) + parser.add_argument( + "--transformer-enc-config", + type=str, + metavar="EXPR", + help="""" + a tuple containing the configuration of the encoder transformer layers + configurations: + [(input_dim, + num_heads, + ffn_dim, + normalize_before, + dropout, + attention_dropout, + relu_dropout), ...]') + """, + ) + parser.add_argument( + "--enc-output-dim", + type=int, + metavar="N", + help=""" + encoder output dimension, can be None. If specified, projecting the + transformer output to the specified dimension""", + ) + parser.add_argument( + "--in-channels", + type=int, + metavar="N", + help="number of encoder input channels", + ) + parser.add_argument( + "--tgt-embed-dim", + type=int, + metavar="N", + help="embedding dimension of the decoder target tokens", + ) + parser.add_argument( + "--transformer-dec-config", + type=str, + metavar="EXPR", + help=""" + a tuple containing the configuration of the decoder transformer layers + configurations: + [(input_dim, + num_heads, + ffn_dim, + normalize_before, + dropout, + attention_dropout, + relu_dropout), ...] + """, + ) + parser.add_argument( + "--conv-dec-config", + type=str, + metavar="EXPR", + help=""" + an array of tuples for the decoder 1-D convolution config + [(out_channels, conv_kernel_size, use_layer_norm), ...]""", + ) + + @classmethod + def build_encoder(cls, args, task): + return VGGTransformerEncoder( + input_feat_per_channel=args.input_feat_per_channel, + vggblock_config=eval(args.vggblock_enc_config), + transformer_config=eval(args.transformer_enc_config), + encoder_output_dim=args.enc_output_dim, + in_channels=args.in_channels, + ) + + @classmethod + def build_decoder(cls, args, task): + return TransformerDecoder( + dictionary=task.target_dictionary, + embed_dim=args.tgt_embed_dim, + transformer_config=eval(args.transformer_dec_config), + conv_config=eval(args.conv_dec_config), + encoder_output_dim=args.enc_output_dim, + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + # make sure that all args are properly defaulted + # (in case there are any new ones) + base_architecture(args) + + encoder = cls.build_encoder(args, task) + decoder = cls.build_decoder(args, task) + return cls(encoder, decoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + lprobs = super().get_normalized_probs(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + +DEFAULT_ENC_VGGBLOCK_CONFIG = ((32, 3, 2, 2, False),) * 2 +DEFAULT_ENC_TRANSFORMER_CONFIG = ((256, 4, 1024, True, 0.2, 0.2, 0.2),) * 2 +# 256: embedding dimension +# 4: number of heads +# 1024: FFN +# True: apply layerNorm before (dropout + resiaul) instead of after +# 0.2 (dropout): dropout after MultiheadAttention and second FC +# 0.2 (attention_dropout): dropout in MultiheadAttention +# 0.2 (relu_dropout): dropout after ReLu +DEFAULT_DEC_TRANSFORMER_CONFIG = ((256, 2, 1024, True, 0.2, 0.2, 0.2),) * 2 +DEFAULT_DEC_CONV_CONFIG = ((256, 3, True),) * 2 + + +# TODO: repace transformer encoder config from one liner +# to explicit args to get rid of this transformation +def prepare_transformer_encoder_params( + input_dim, + num_heads, + ffn_dim, + normalize_before, + dropout, + attention_dropout, + relu_dropout, +): + args = argparse.Namespace() + args.encoder_embed_dim = input_dim + args.encoder_attention_heads = num_heads + args.attention_dropout = attention_dropout + args.dropout = dropout + args.activation_dropout = relu_dropout + args.encoder_normalize_before = normalize_before + args.encoder_ffn_embed_dim = ffn_dim + return args + + +def prepare_transformer_decoder_params( + input_dim, + num_heads, + ffn_dim, + normalize_before, + dropout, + attention_dropout, + relu_dropout, +): + args = argparse.Namespace() + args.decoder_embed_dim = input_dim + args.decoder_attention_heads = num_heads + args.attention_dropout = attention_dropout + args.dropout = dropout + args.activation_dropout = relu_dropout + args.decoder_normalize_before = normalize_before + args.decoder_ffn_embed_dim = ffn_dim + return args + + +class VGGTransformerEncoder(FairseqEncoder): + """VGG + Transformer encoder""" + + def __init__( + self, + input_feat_per_channel, + vggblock_config=DEFAULT_ENC_VGGBLOCK_CONFIG, + transformer_config=DEFAULT_ENC_TRANSFORMER_CONFIG, + encoder_output_dim=512, + in_channels=1, + transformer_context=None, + transformer_sampling=None, + ): + """constructor for VGGTransformerEncoder + + Args: + - input_feat_per_channel: feature dim (not including stacked, + just base feature) + - in_channel: # input channels (e.g., if stack 8 feature vector + together, this is 8) + - vggblock_config: configuration of vggblock, see comments on + DEFAULT_ENC_VGGBLOCK_CONFIG + - transformer_config: configuration of transformer layer, see comments + on DEFAULT_ENC_TRANSFORMER_CONFIG + - encoder_output_dim: final transformer output embedding dimension + - transformer_context: (left, right) if set, self-attention will be focused + on (t-left, t+right) + - transformer_sampling: an iterable of int, must match with + len(transformer_config), transformer_sampling[i] indicates sampling + factor for i-th transformer layer, after multihead att and feedfoward + part + """ + super().__init__(None) + + self.num_vggblocks = 0 + if vggblock_config is not None: + if not isinstance(vggblock_config, Iterable): + raise ValueError("vggblock_config is not iterable") + self.num_vggblocks = len(vggblock_config) + + self.conv_layers = nn.ModuleList() + self.in_channels = in_channels + self.input_dim = input_feat_per_channel + self.pooling_kernel_sizes = [] + + if vggblock_config is not None: + for _, config in enumerate(vggblock_config): + ( + out_channels, + conv_kernel_size, + pooling_kernel_size, + num_conv_layers, + layer_norm, + ) = config + self.conv_layers.append( + VGGBlock( + in_channels, + out_channels, + conv_kernel_size, + pooling_kernel_size, + num_conv_layers, + input_dim=input_feat_per_channel, + layer_norm=layer_norm, + ) + ) + self.pooling_kernel_sizes.append(pooling_kernel_size) + in_channels = out_channels + input_feat_per_channel = self.conv_layers[-1].output_dim + + transformer_input_dim = self.infer_conv_output_dim( + self.in_channels, self.input_dim + ) + # transformer_input_dim is the output dimension of VGG part + + self.validate_transformer_config(transformer_config) + self.transformer_context = self.parse_transformer_context(transformer_context) + self.transformer_sampling = self.parse_transformer_sampling( + transformer_sampling, len(transformer_config) + ) + + self.transformer_layers = nn.ModuleList() + + if transformer_input_dim != transformer_config[0][0]: + self.transformer_layers.append( + Linear(transformer_input_dim, transformer_config[0][0]) + ) + self.transformer_layers.append( + TransformerEncoderLayer( + prepare_transformer_encoder_params(*transformer_config[0]) + ) + ) + + for i in range(1, len(transformer_config)): + if transformer_config[i - 1][0] != transformer_config[i][0]: + self.transformer_layers.append( + Linear(transformer_config[i - 1][0], transformer_config[i][0]) + ) + self.transformer_layers.append( + TransformerEncoderLayer( + prepare_transformer_encoder_params(*transformer_config[i]) + ) + ) + + self.encoder_output_dim = encoder_output_dim + self.transformer_layers.extend( + [ + Linear(transformer_config[-1][0], encoder_output_dim), + LayerNorm(encoder_output_dim), + ] + ) + + def forward(self, src_tokens, src_lengths, **kwargs): + """ + src_tokens: padded tensor (B, T, C * feat) + src_lengths: tensor of original lengths of input utterances (B,) + """ + bsz, max_seq_len, _ = src_tokens.size() + x = src_tokens.view(bsz, max_seq_len, self.in_channels, self.input_dim) + x = x.transpose(1, 2).contiguous() + # (B, C, T, feat) + + for layer_idx in range(len(self.conv_layers)): + x = self.conv_layers[layer_idx](x) + + bsz, _, output_seq_len, _ = x.size() + + # (B, C, T, feat) -> (B, T, C, feat) -> (T, B, C, feat) -> (T, B, C * feat) + x = x.transpose(1, 2).transpose(0, 1) + x = x.contiguous().view(output_seq_len, bsz, -1) + + input_lengths = src_lengths.clone() + for s in self.pooling_kernel_sizes: + input_lengths = (input_lengths.float() / s).ceil().long() + + encoder_padding_mask, _ = lengths_to_encoder_padding_mask( + input_lengths, batch_first=True + ) + if not encoder_padding_mask.any(): + encoder_padding_mask = None + + subsampling_factor = int(max_seq_len * 1.0 / output_seq_len + 0.5) + attn_mask = self.lengths_to_attn_mask(input_lengths, subsampling_factor) + + transformer_layer_idx = 0 + + for layer_idx in range(len(self.transformer_layers)): + + if isinstance(self.transformer_layers[layer_idx], TransformerEncoderLayer): + x = self.transformer_layers[layer_idx]( + x, encoder_padding_mask, attn_mask + ) + + if self.transformer_sampling[transformer_layer_idx] != 1: + sampling_factor = self.transformer_sampling[transformer_layer_idx] + x, encoder_padding_mask, attn_mask = self.slice( + x, encoder_padding_mask, attn_mask, sampling_factor + ) + + transformer_layer_idx += 1 + + else: + x = self.transformer_layers[layer_idx](x) + + # encoder_padding_maks is a (T x B) tensor, its [t, b] elements indicate + # whether encoder_output[t, b] is valid or not (valid=0, invalid=1) + + return { + "encoder_out": x, # (T, B, C) + "encoder_padding_mask": encoder_padding_mask.t() + if encoder_padding_mask is not None + else None, + # (B, T) --> (T, B) + } + + def infer_conv_output_dim(self, in_channels, input_dim): + sample_seq_len = 200 + sample_bsz = 10 + x = torch.randn(sample_bsz, in_channels, sample_seq_len, input_dim) + for i, _ in enumerate(self.conv_layers): + x = self.conv_layers[i](x) + x = x.transpose(1, 2) + mb, seq = x.size()[:2] + return x.contiguous().view(mb, seq, -1).size(-1) + + def validate_transformer_config(self, transformer_config): + for config in transformer_config: + input_dim, num_heads = config[:2] + if input_dim % num_heads != 0: + msg = ( + "ERROR in transformer config {}: ".format(config) + + "input dimension {} ".format(input_dim) + + "not dividable by number of heads {}".format(num_heads) + ) + raise ValueError(msg) + + def parse_transformer_context(self, transformer_context): + """ + transformer_context can be the following: + - None; indicates no context is used, i.e., + transformer can access full context + - a tuple/list of two int; indicates left and right context, + any number <0 indicates infinite context + * e.g., (5, 6) indicates that for query at x_t, transformer can + access [t-5, t+6] (inclusive) + * e.g., (-1, 6) indicates that for query at x_t, transformer can + access [0, t+6] (inclusive) + """ + if transformer_context is None: + return None + + if not isinstance(transformer_context, Iterable): + raise ValueError("transformer context must be Iterable if it is not None") + + if len(transformer_context) != 2: + raise ValueError("transformer context must have length 2") + + left_context = transformer_context[0] + if left_context < 0: + left_context = None + + right_context = transformer_context[1] + if right_context < 0: + right_context = None + + if left_context is None and right_context is None: + return None + + return (left_context, right_context) + + def parse_transformer_sampling(self, transformer_sampling, num_layers): + """ + parsing transformer sampling configuration + + Args: + - transformer_sampling, accepted input: + * None, indicating no sampling + * an Iterable with int (>0) as element + - num_layers, expected number of transformer layers, must match with + the length of transformer_sampling if it is not None + + Returns: + - A tuple with length num_layers + """ + if transformer_sampling is None: + return (1,) * num_layers + + if not isinstance(transformer_sampling, Iterable): + raise ValueError( + "transformer_sampling must be an iterable if it is not None" + ) + + if len(transformer_sampling) != num_layers: + raise ValueError( + "transformer_sampling {} does not match with the number " + "of layers {}".format(transformer_sampling, num_layers) + ) + + for layer, value in enumerate(transformer_sampling): + if not isinstance(value, int): + raise ValueError("Invalid value in transformer_sampling: ") + if value < 1: + raise ValueError( + "{} layer's subsampling is {}.".format(layer, value) + + " This is not allowed! " + ) + return transformer_sampling + + def slice(self, embedding, padding_mask, attn_mask, sampling_factor): + """ + embedding is a (T, B, D) tensor + padding_mask is a (B, T) tensor or None + attn_mask is a (T, T) tensor or None + """ + embedding = embedding[::sampling_factor, :, :] + if padding_mask is not None: + padding_mask = padding_mask[:, ::sampling_factor] + if attn_mask is not None: + attn_mask = attn_mask[::sampling_factor, ::sampling_factor] + + return embedding, padding_mask, attn_mask + + def lengths_to_attn_mask(self, input_lengths, subsampling_factor=1): + """ + create attention mask according to sequence lengths and transformer + context + + Args: + - input_lengths: (B, )-shape Int/Long tensor; input_lengths[b] is + the length of b-th sequence + - subsampling_factor: int + * Note that the left_context and right_context is specified in + the input frame-level while input to transformer may already + go through subsampling (e.g., the use of striding in vggblock) + we use subsampling_factor to scale the left/right context + + Return: + - a (T, T) binary tensor or None, where T is max(input_lengths) + * if self.transformer_context is None, None + * if left_context is None, + * attn_mask[t, t + right_context + 1:] = 1 + * others = 0 + * if right_context is None, + * attn_mask[t, 0:t - left_context] = 1 + * others = 0 + * elsif + * attn_mask[t, t - left_context: t + right_context + 1] = 0 + * others = 1 + """ + if self.transformer_context is None: + return None + + maxT = torch.max(input_lengths).item() + attn_mask = torch.zeros(maxT, maxT) + + left_context = self.transformer_context[0] + right_context = self.transformer_context[1] + if left_context is not None: + left_context = math.ceil(self.transformer_context[0] / subsampling_factor) + if right_context is not None: + right_context = math.ceil(self.transformer_context[1] / subsampling_factor) + + for t in range(maxT): + if left_context is not None: + st = 0 + en = max(st, t - left_context) + attn_mask[t, st:en] = 1 + if right_context is not None: + st = t + right_context + 1 + st = min(st, maxT - 1) + attn_mask[t, st:] = 1 + + return attn_mask.to(input_lengths.device) + + def reorder_encoder_out(self, encoder_out, new_order): + encoder_out["encoder_out"] = encoder_out["encoder_out"].index_select( + 1, new_order + ) + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(1, new_order) + return encoder_out + + +class TransformerDecoder(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs. + Default: ``False`` + left_pad (bool, optional): whether the input is left-padded. Default: + ``False`` + """ + + def __init__( + self, + dictionary, + embed_dim=512, + transformer_config=DEFAULT_ENC_TRANSFORMER_CONFIG, + conv_config=DEFAULT_DEC_CONV_CONFIG, + encoder_output_dim=512, + ): + + super().__init__(dictionary) + vocab_size = len(dictionary) + self.padding_idx = dictionary.pad() + self.embed_tokens = Embedding(vocab_size, embed_dim, self.padding_idx) + + self.conv_layers = nn.ModuleList() + for i in range(len(conv_config)): + out_channels, kernel_size, layer_norm = conv_config[i] + if i == 0: + conv_layer = LinearizedConv1d( + embed_dim, out_channels, kernel_size, padding=kernel_size - 1 + ) + else: + conv_layer = LinearizedConv1d( + conv_config[i - 1][0], + out_channels, + kernel_size, + padding=kernel_size - 1, + ) + self.conv_layers.append(conv_layer) + if layer_norm: + self.conv_layers.append(nn.LayerNorm(out_channels)) + self.conv_layers.append(nn.ReLU()) + + self.layers = nn.ModuleList() + if conv_config[-1][0] != transformer_config[0][0]: + self.layers.append(Linear(conv_config[-1][0], transformer_config[0][0])) + self.layers.append( + TransformerDecoderLayer( + prepare_transformer_decoder_params(*transformer_config[0]) + ) + ) + + for i in range(1, len(transformer_config)): + if transformer_config[i - 1][0] != transformer_config[i][0]: + self.layers.append( + Linear(transformer_config[i - 1][0], transformer_config[i][0]) + ) + self.layers.append( + TransformerDecoderLayer( + prepare_transformer_decoder_params(*transformer_config[i]) + ) + ) + self.fc_out = Linear(transformer_config[-1][0], vocab_size) + + def forward(self, prev_output_tokens, encoder_out=None, incremental_state=None): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for input feeding/teacher forcing + encoder_out (Tensor, optional): output from the encoder, used for + encoder-side attention + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + Returns: + tuple: + - the last decoder layer's output of shape `(batch, tgt_len, + vocab)` + - the last decoder layer's attention weights of shape `(batch, + tgt_len, src_len)` + """ + target_padding_mask = ( + (prev_output_tokens == self.padding_idx).to(prev_output_tokens.device) + if incremental_state is None + else None + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + + # embed tokens + x = self.embed_tokens(prev_output_tokens) + + # B x T x C -> T x B x C + x = self._transpose_if_training(x, incremental_state) + + for layer in self.conv_layers: + if isinstance(layer, LinearizedConvolution): + x = layer(x, incremental_state) + else: + x = layer(x) + + # B x T x C -> T x B x C + x = self._transpose_if_inference(x, incremental_state) + + # decoder layers + for layer in self.layers: + if isinstance(layer, TransformerDecoderLayer): + x, *_ = layer( + x, + (encoder_out["encoder_out"] if encoder_out is not None else None), + ( + encoder_out["encoder_padding_mask"].t() + if encoder_out["encoder_padding_mask"] is not None + else None + ), + incremental_state, + self_attn_mask=( + self.buffered_future_mask(x) + if incremental_state is None + else None + ), + self_attn_padding_mask=( + target_padding_mask if incremental_state is None else None + ), + ) + else: + x = layer(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + x = self.fc_out(x) + + return x, None + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + if ( + not hasattr(self, "_future_mask") + or self._future_mask is None + or self._future_mask.device != tensor.device + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(tensor.new(dim, dim)), 1 + ) + if self._future_mask.size(0) < dim: + self._future_mask = torch.triu( + utils.fill_with_neg_inf(self._future_mask.resize_(dim, dim)), 1 + ) + return self._future_mask[:dim, :dim] + + def _transpose_if_training(self, x, incremental_state): + if incremental_state is None: + x = x.transpose(0, 1) + return x + + def _transpose_if_inference(self, x, incremental_state): + if incremental_state: + x = x.transpose(0, 1) + return x + + +@register_model("asr_vggtransformer_encoder") +class VGGTransformerEncoderModel(FairseqEncoderModel): + def __init__(self, encoder): + super().__init__(encoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--input-feat-per-channel", + type=int, + metavar="N", + help="encoder input dimension per input channel", + ) + parser.add_argument( + "--vggblock-enc-config", + type=str, + metavar="EXPR", + help=""" + an array of tuples each containing the configuration of one vggblock + [(out_channels, conv_kernel_size, pooling_kernel_size,num_conv_layers), ...] + """, + ) + parser.add_argument( + "--transformer-enc-config", + type=str, + metavar="EXPR", + help=""" + a tuple containing the configuration of the Transformer layers + configurations: + [(input_dim, + num_heads, + ffn_dim, + normalize_before, + dropout, + attention_dropout, + relu_dropout), ]""", + ) + parser.add_argument( + "--enc-output-dim", + type=int, + metavar="N", + help="encoder output dimension, projecting the LSTM output", + ) + parser.add_argument( + "--in-channels", + type=int, + metavar="N", + help="number of encoder input channels", + ) + parser.add_argument( + "--transformer-context", + type=str, + metavar="EXPR", + help=""" + either None or a tuple of two ints, indicating left/right context a + transformer can have access to""", + ) + parser.add_argument( + "--transformer-sampling", + type=str, + metavar="EXPR", + help=""" + either None or a tuple of ints, indicating sampling factor in each layer""", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + base_architecture_enconly(args) + encoder = VGGTransformerEncoderOnly( + vocab_size=len(task.target_dictionary), + input_feat_per_channel=args.input_feat_per_channel, + vggblock_config=eval(args.vggblock_enc_config), + transformer_config=eval(args.transformer_enc_config), + encoder_output_dim=args.enc_output_dim, + in_channels=args.in_channels, + transformer_context=eval(args.transformer_context), + transformer_sampling=eval(args.transformer_sampling), + ) + return cls(encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (T, B, D) tensor + lprobs = super().get_normalized_probs(net_output, log_probs, sample) + # lprobs is a (T, B, D) tensor + # we need to transoose to get (B, T, D) tensor + lprobs = lprobs.transpose(0, 1).contiguous() + lprobs.batch_first = True + return lprobs + + +class VGGTransformerEncoderOnly(VGGTransformerEncoder): + def __init__( + self, + vocab_size, + input_feat_per_channel, + vggblock_config=DEFAULT_ENC_VGGBLOCK_CONFIG, + transformer_config=DEFAULT_ENC_TRANSFORMER_CONFIG, + encoder_output_dim=512, + in_channels=1, + transformer_context=None, + transformer_sampling=None, + ): + super().__init__( + input_feat_per_channel=input_feat_per_channel, + vggblock_config=vggblock_config, + transformer_config=transformer_config, + encoder_output_dim=encoder_output_dim, + in_channels=in_channels, + transformer_context=transformer_context, + transformer_sampling=transformer_sampling, + ) + self.fc_out = Linear(self.encoder_output_dim, vocab_size) + + def forward(self, src_tokens, src_lengths, **kwargs): + """ + src_tokens: padded tensor (B, T, C * feat) + src_lengths: tensor of original lengths of input utterances (B,) + """ + + enc_out = super().forward(src_tokens, src_lengths) + x = self.fc_out(enc_out["encoder_out"]) + # x = F.log_softmax(x, dim=-1) + # Note: no need this line, because model.get_normalized_prob will call + # log_softmax + return { + "encoder_out": x, # (T, B, C) + "encoder_padding_mask": enc_out["encoder_padding_mask"], # (T, B) + } + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return (1e6, 1e6) # an arbitrary large number + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + # nn.init.uniform_(m.weight, -0.1, 0.1) + # nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True, dropout=0): + """Linear layer (input: N x T x C)""" + m = nn.Linear(in_features, out_features, bias=bias) + # m.weight.data.uniform_(-0.1, 0.1) + # if bias: + # m.bias.data.uniform_(-0.1, 0.1) + return m + + +def LinearizedConv1d(in_channels, out_channels, kernel_size, dropout=0, **kwargs): + """Weight-normalized Conv1d layer optimized for decoding""" + m = LinearizedConvolution(in_channels, out_channels, kernel_size, **kwargs) + std = math.sqrt((4 * (1.0 - dropout)) / (m.kernel_size[0] * in_channels)) + nn.init.normal_(m.weight, mean=0, std=std) + nn.init.constant_(m.bias, 0) + return nn.utils.weight_norm(m, dim=2) + + +def LayerNorm(embedding_dim): + m = nn.LayerNorm(embedding_dim) + return m + + +# seq2seq models +def base_architecture(args): + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 40) + args.vggblock_enc_config = getattr( + args, "vggblock_enc_config", DEFAULT_ENC_VGGBLOCK_CONFIG + ) + args.transformer_enc_config = getattr( + args, "transformer_enc_config", DEFAULT_ENC_TRANSFORMER_CONFIG + ) + args.enc_output_dim = getattr(args, "enc_output_dim", 512) + args.in_channels = getattr(args, "in_channels", 1) + args.tgt_embed_dim = getattr(args, "tgt_embed_dim", 128) + args.transformer_dec_config = getattr( + args, "transformer_dec_config", DEFAULT_ENC_TRANSFORMER_CONFIG + ) + args.conv_dec_config = getattr(args, "conv_dec_config", DEFAULT_DEC_CONV_CONFIG) + args.transformer_context = getattr(args, "transformer_context", "None") + + +@register_model_architecture("asr_vggtransformer", "vggtransformer_1") +def vggtransformer_1(args): + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 80) + args.vggblock_enc_config = getattr( + args, "vggblock_enc_config", "[(64, 3, 2, 2, True), (128, 3, 2, 2, True)]" + ) + args.transformer_enc_config = getattr( + args, + "transformer_enc_config", + "((1024, 16, 4096, True, 0.15, 0.15, 0.15),) * 14", + ) + args.enc_output_dim = getattr(args, "enc_output_dim", 1024) + args.tgt_embed_dim = getattr(args, "tgt_embed_dim", 128) + args.conv_dec_config = getattr(args, "conv_dec_config", "((256, 3, True),) * 4") + args.transformer_dec_config = getattr( + args, + "transformer_dec_config", + "((1024, 16, 4096, True, 0.15, 0.15, 0.15),) * 4", + ) + + +@register_model_architecture("asr_vggtransformer", "vggtransformer_2") +def vggtransformer_2(args): + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 80) + args.vggblock_enc_config = getattr( + args, "vggblock_enc_config", "[(64, 3, 2, 2, True), (128, 3, 2, 2, True)]" + ) + args.transformer_enc_config = getattr( + args, + "transformer_enc_config", + "((1024, 16, 4096, True, 0.15, 0.15, 0.15),) * 16", + ) + args.enc_output_dim = getattr(args, "enc_output_dim", 1024) + args.tgt_embed_dim = getattr(args, "tgt_embed_dim", 512) + args.conv_dec_config = getattr(args, "conv_dec_config", "((256, 3, True),) * 4") + args.transformer_dec_config = getattr( + args, + "transformer_dec_config", + "((1024, 16, 4096, True, 0.15, 0.15, 0.15),) * 6", + ) + + +@register_model_architecture("asr_vggtransformer", "vggtransformer_base") +def vggtransformer_base(args): + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 80) + args.vggblock_enc_config = getattr( + args, "vggblock_enc_config", "[(64, 3, 2, 2, True), (128, 3, 2, 2, True)]" + ) + args.transformer_enc_config = getattr( + args, "transformer_enc_config", "((512, 8, 2048, True, 0.15, 0.15, 0.15),) * 12" + ) + + args.enc_output_dim = getattr(args, "enc_output_dim", 512) + args.tgt_embed_dim = getattr(args, "tgt_embed_dim", 512) + args.conv_dec_config = getattr(args, "conv_dec_config", "((256, 3, True),) * 4") + args.transformer_dec_config = getattr( + args, "transformer_dec_config", "((512, 8, 2048, True, 0.15, 0.15, 0.15),) * 6" + ) + # Size estimations: + # Encoder: + # - vggblock param: 64*1*3*3 + 64*64*3*3 + 128*64*3*3 + 128*128*3 = 258K + # Transformer: + # - input dimension adapter: 2560 x 512 -> 1.31M + # - transformer_layers (x12) --> 37.74M + # * MultiheadAttention: 512*512*3 (in_proj) + 512*512 (out_proj) = 1.048M + # * FFN weight: 512*2048*2 = 2.097M + # - output dimension adapter: 512 x 512 -> 0.26 M + # Decoder: + # - LinearizedConv1d: 512 * 256 * 3 + 256 * 256 * 3 * 3 + # - transformer_layer: (x6) --> 25.16M + # * MultiheadAttention (self-attention): 512*512*3 + 512*512 = 1.048M + # * MultiheadAttention (encoder-attention): 512*512*3 + 512*512 = 1.048M + # * FFN: 512*2048*2 = 2.097M + # Final FC: + # - FC: 512*5000 = 256K (assuming vocab size 5K) + # In total: + # ~65 M + + +# CTC models +def base_architecture_enconly(args): + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 40) + args.vggblock_enc_config = getattr( + args, "vggblock_enc_config", "[(32, 3, 2, 2, True)] * 2" + ) + args.transformer_enc_config = getattr( + args, "transformer_enc_config", "((256, 4, 1024, True, 0.2, 0.2, 0.2),) * 2" + ) + args.enc_output_dim = getattr(args, "enc_output_dim", 512) + args.in_channels = getattr(args, "in_channels", 1) + args.transformer_context = getattr(args, "transformer_context", "None") + args.transformer_sampling = getattr(args, "transformer_sampling", "None") + + +@register_model_architecture("asr_vggtransformer_encoder", "vggtransformer_enc_1") +def vggtransformer_enc_1(args): + # vggtransformer_1 is the same as vggtransformer_enc_big, except the number + # of layers is increased to 16 + # keep it here for backward compatiablity purpose + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 80) + args.vggblock_enc_config = getattr( + args, "vggblock_enc_config", "[(64, 3, 2, 2, True), (128, 3, 2, 2, True)]" + ) + args.transformer_enc_config = getattr( + args, + "transformer_enc_config", + "((1024, 16, 4096, True, 0.15, 0.15, 0.15),) * 16", + ) + args.enc_output_dim = getattr(args, "enc_output_dim", 1024) diff --git a/SpeechT5/fairseq/examples/speech_recognition/models/w2l_conv_glu_enc.py b/SpeechT5/fairseq/examples/speech_recognition/models/w2l_conv_glu_enc.py new file mode 100644 index 0000000..655a9b0 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/models/w2l_conv_glu_enc.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderModel, + register_model, + register_model_architecture, +) +from fairseq.modules.fairseq_dropout import FairseqDropout + + +default_conv_enc_config = """[ + (400, 13, 170, 0.2), + (440, 14, 0, 0.214), + (484, 15, 0, 0.22898), + (532, 16, 0, 0.2450086), + (584, 17, 0, 0.262159202), + (642, 18, 0, 0.28051034614), + (706, 19, 0, 0.30014607037), + (776, 20, 0, 0.321156295296), + (852, 21, 0, 0.343637235966), + (936, 22, 0, 0.367691842484), + (1028, 23, 0, 0.393430271458), + (1130, 24, 0, 0.42097039046), + (1242, 25, 0, 0.450438317792), + (1366, 26, 0, 0.481969000038), + (1502, 27, 0, 0.51570683004), + (1652, 28, 0, 0.551806308143), + (1816, 29, 0, 0.590432749713), +]""" + + +@register_model("asr_w2l_conv_glu_encoder") +class W2lConvGluEncoderModel(FairseqEncoderModel): + def __init__(self, encoder): + super().__init__(encoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--input-feat-per-channel", + type=int, + metavar="N", + help="encoder input dimension per input channel", + ) + parser.add_argument( + "--in-channels", + type=int, + metavar="N", + help="number of encoder input channels", + ) + parser.add_argument( + "--conv-enc-config", + type=str, + metavar="EXPR", + help=""" + an array of tuples each containing the configuration of one conv layer + [(out_channels, kernel_size, padding, dropout), ...] + """, + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + conv_enc_config = getattr(args, "conv_enc_config", default_conv_enc_config) + encoder = W2lConvGluEncoder( + vocab_size=len(task.target_dictionary), + input_feat_per_channel=args.input_feat_per_channel, + in_channels=args.in_channels, + conv_enc_config=eval(conv_enc_config), + ) + return cls(encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + lprobs = super().get_normalized_probs(net_output, log_probs, sample) + lprobs.batch_first = False + return lprobs + + +class W2lConvGluEncoder(FairseqEncoder): + def __init__( + self, vocab_size, input_feat_per_channel, in_channels, conv_enc_config + ): + super().__init__(None) + + self.input_dim = input_feat_per_channel + if in_channels != 1: + raise ValueError("only 1 input channel is currently supported") + + self.conv_layers = nn.ModuleList() + self.linear_layers = nn.ModuleList() + self.dropouts = [] + cur_channels = input_feat_per_channel + + for out_channels, kernel_size, padding, dropout in conv_enc_config: + layer = nn.Conv1d(cur_channels, out_channels, kernel_size, padding=padding) + layer.weight.data.mul_(math.sqrt(3)) # match wav2letter init + self.conv_layers.append(nn.utils.weight_norm(layer)) + self.dropouts.append( + FairseqDropout(dropout, module_name=self.__class__.__name__) + ) + if out_channels % 2 != 0: + raise ValueError("odd # of out_channels is incompatible with GLU") + cur_channels = out_channels // 2 # halved by GLU + + for out_channels in [2 * cur_channels, vocab_size]: + layer = nn.Linear(cur_channels, out_channels) + layer.weight.data.mul_(math.sqrt(3)) + self.linear_layers.append(nn.utils.weight_norm(layer)) + cur_channels = out_channels // 2 + + def forward(self, src_tokens, src_lengths, **kwargs): + + """ + src_tokens: padded tensor (B, T, C * feat) + src_lengths: tensor of original lengths of input utterances (B,) + """ + B, T, _ = src_tokens.size() + x = src_tokens.transpose(1, 2).contiguous() # (B, feat, T) assuming C == 1 + + for layer_idx in range(len(self.conv_layers)): + x = self.conv_layers[layer_idx](x) + x = F.glu(x, dim=1) + x = self.dropouts[layer_idx](x) + + x = x.transpose(1, 2).contiguous() # (B, T, 908) + x = self.linear_layers[0](x) + x = F.glu(x, dim=2) + x = self.dropouts[-1](x) + x = self.linear_layers[1](x) + + assert x.size(0) == B + assert x.size(1) == T + + encoder_out = x.transpose(0, 1) # (T, B, vocab_size) + + # need to debug this -- find a simpler/elegant way in pytorch APIs + encoder_padding_mask = ( + torch.arange(T).view(1, T).expand(B, -1).to(x.device) + >= src_lengths.view(B, 1).expand(-1, T) + ).t() # (B x T) -> (T x B) + + return { + "encoder_out": encoder_out, # (T, B, vocab_size) + "encoder_padding_mask": encoder_padding_mask, # (T, B) + } + + def reorder_encoder_out(self, encoder_out, new_order): + encoder_out["encoder_out"] = encoder_out["encoder_out"].index_select( + 1, new_order + ) + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(1, new_order) + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return (1e6, 1e6) # an arbitrary large number + + +@register_model_architecture("asr_w2l_conv_glu_encoder", "w2l_conv_glu_enc") +def w2l_conv_glu_enc(args): + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 80) + args.in_channels = getattr(args, "in_channels", 1) + args.conv_enc_config = getattr(args, "conv_enc_config", default_conv_enc_config) diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/README.md b/SpeechT5/fairseq/examples/speech_recognition/new/README.md new file mode 100644 index 0000000..5fa0e97 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/README.md @@ -0,0 +1,43 @@ +# Flashlight Decoder + +This script runs decoding for pre-trained speech recognition models. + +## Usage + +Assuming a few variables: + +```bash +checkpoint=<path-to-checkpoint> +data=<path-to-data-directory> +lm_model=<path-to-language-model> +lexicon=<path-to-lexicon> +``` + +Example usage for decoding a fine-tuned Wav2Vec model: + +```bash +python $FAIRSEQ_ROOT/examples/speech_recognition/new/infer.py --multirun \ + task=audio_pretraining \ + task.data=$data \ + task.labels=ltr \ + common_eval.path=$checkpoint \ + decoding.type=kenlm \ + decoding.lexicon=$lexicon \ + decoding.lmpath=$lm_model \ + dataset.gen_subset=dev_clean,dev_other,test_clean,test_other +``` + +Example usage for using Ax to sweep WER parameters (requires `pip install hydra-ax-sweeper`): + +```bash +python $FAIRSEQ_ROOT/examples/speech_recognition/new/infer.py --multirun \ + hydra/sweeper=ax \ + task=audio_pretraining \ + task.data=$data \ + task.labels=ltr \ + common_eval.path=$checkpoint \ + decoding.type=kenlm \ + decoding.lexicon=$lexicon \ + decoding.lmpath=$lm_model \ + dataset.gen_subset=dev_other +``` diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/new/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/conf/hydra/sweeper/ax.yaml b/SpeechT5/fairseq/examples/speech_recognition/new/conf/hydra/sweeper/ax.yaml new file mode 100644 index 0000000..fbeff17 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/conf/hydra/sweeper/ax.yaml @@ -0,0 +1,26 @@ +# @package hydra.sweeper +_target_: hydra_plugins.hydra_ax_sweeper.ax_sweeper.AxSweeper +max_batch_size: null +ax_config: + max_trials: 128 + early_stop: + minimize: true + max_epochs_without_improvement: 32 + epsilon: 1.0e-05 + experiment: + name: ${dataset.gen_subset} + objective_name: wer + minimize: true + parameter_constraints: null + outcome_constraints: null + status_quo: null + client: + verbose_logging: false + random_seed: null + params: + decoding.lmweight: + type: range + bounds: [0.0, 5.0] + decoding.wordscore: + type: range + bounds: [-5.0, 5.0] diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/conf/infer.yaml b/SpeechT5/fairseq/examples/speech_recognition/new/conf/infer.yaml new file mode 100644 index 0000000..f176228 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/conf/infer.yaml @@ -0,0 +1,25 @@ +# @package _group_ + +defaults: + - task: null + - model: null + +hydra: + run: + dir: ${common_eval.results_path}/${dataset.gen_subset} + sweep: + dir: ${common_eval.results_path} + subdir: ${dataset.gen_subset} +common_eval: + results_path: null + path: null + post_process: letter + quiet: true +dataset: + max_tokens: 1000000 + gen_subset: test +distributed_training: + distributed_world_size: 1 +decoding: + beam: 5 + type: viterbi diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/decoders/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/decoders/base_decoder.py b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/base_decoder.py new file mode 100644 index 0000000..a097969 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/base_decoder.py @@ -0,0 +1,62 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import itertools as it +from typing import Any, Dict, List + +import torch +from fairseq.data.dictionary import Dictionary +from fairseq.models.fairseq_model import FairseqModel + + +class BaseDecoder: + def __init__(self, tgt_dict: Dictionary) -> None: + self.tgt_dict = tgt_dict + self.vocab_size = len(tgt_dict) + + self.blank = ( + tgt_dict.index("<ctc_blank>") + if "<ctc_blank>" in tgt_dict.indices + else tgt_dict.bos() + ) + if "<sep>" in tgt_dict.indices: + self.silence = tgt_dict.index("<sep>") + elif "|" in tgt_dict.indices: + self.silence = tgt_dict.index("|") + else: + self.silence = tgt_dict.eos() + + def generate( + self, models: List[FairseqModel], sample: Dict[str, Any], **unused + ) -> List[List[Dict[str, torch.LongTensor]]]: + encoder_input = { + k: v for k, v in sample["net_input"].items() if k != "prev_output_tokens" + } + emissions = self.get_emissions(models, encoder_input) + return self.decode(emissions) + + def get_emissions( + self, + models: List[FairseqModel], + encoder_input: Dict[str, Any], + ) -> torch.FloatTensor: + model = models[0] + encoder_out = model(**encoder_input) + if hasattr(model, "get_logits"): + emissions = model.get_logits(encoder_out) + else: + emissions = model.get_normalized_probs(encoder_out, log_probs=True) + return emissions.transpose(0, 1).float().cpu().contiguous() + + def get_tokens(self, idxs: torch.IntTensor) -> torch.LongTensor: + idxs = (g[0] for g in it.groupby(idxs)) + idxs = filter(lambda x: x != self.blank, idxs) + return torch.LongTensor(list(idxs)) + + def decode( + self, + emissions: torch.FloatTensor, + ) -> List[List[Dict[str, torch.LongTensor]]]: + raise NotImplementedError diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder.py b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder.py new file mode 100644 index 0000000..b5bec8c --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Union + +from fairseq.data.dictionary import Dictionary + +from .decoder_config import DecoderConfig, FlashlightDecoderConfig +from .base_decoder import BaseDecoder + + +def Decoder( + cfg: Union[DecoderConfig, FlashlightDecoderConfig], tgt_dict: Dictionary +) -> BaseDecoder: + + if cfg.type == "viterbi": + from .viterbi_decoder import ViterbiDecoder + + return ViterbiDecoder(tgt_dict) + if cfg.type == "kenlm": + from .flashlight_decoder import KenLMDecoder + + return KenLMDecoder(cfg, tgt_dict) + if cfg.type == "fairseqlm": + from .flashlight_decoder import FairseqLMDecoder + + return FairseqLMDecoder(cfg, tgt_dict) + raise NotImplementedError(f"Invalid decoder name: {cfg.name}") diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder_config.py b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder_config.py new file mode 100644 index 0000000..659eb94 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/decoder_config.py @@ -0,0 +1,70 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass, field +from typing import Optional + +from fairseq.dataclass.configs import FairseqDataclass +from fairseq.dataclass.constants import ChoiceEnum +from omegaconf import MISSING + + +DECODER_CHOICES = ChoiceEnum(["viterbi", "kenlm", "fairseqlm"]) + + +@dataclass +class DecoderConfig(FairseqDataclass): + type: DECODER_CHOICES = field( + default="viterbi", + metadata={"help": "The type of decoder to use"}, + ) + + +@dataclass +class FlashlightDecoderConfig(FairseqDataclass): + nbest: int = field( + default=1, + metadata={"help": "Number of decodings to return"}, + ) + unitlm: bool = field( + default=False, + metadata={"help": "If set, use unit language model"}, + ) + lmpath: str = field( + default=MISSING, + metadata={"help": "Language model for KenLM decoder"}, + ) + lexicon: Optional[str] = field( + default=None, + metadata={"help": "Lexicon for Flashlight decoder"}, + ) + beam: int = field( + default=50, + metadata={"help": "Number of beams to use for decoding"}, + ) + beamthreshold: float = field( + default=50.0, + metadata={"help": "Threshold for beam search decoding"}, + ) + beamsizetoken: Optional[int] = field( + default=None, metadata={"help": "Beam size to use"} + ) + wordscore: float = field( + default=-1, + metadata={"help": "Word score for KenLM decoder"}, + ) + unkweight: float = field( + default=-math.inf, + metadata={"help": "Unknown weight for KenLM decoder"}, + ) + silweight: float = field( + default=0, + metadata={"help": "Silence weight for KenLM decoder"}, + ) + lmweight: float = field( + default=2, + metadata={"help": "Weight for LM while interpolating score"}, + ) diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/decoders/flashlight_decoder.py b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/flashlight_decoder.py new file mode 100644 index 0000000..38c7ac4 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/flashlight_decoder.py @@ -0,0 +1,431 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import gc +import os.path as osp +import warnings +from collections import deque, namedtuple +from typing import Any, Dict, Tuple + +import numpy as np +import torch +from fairseq import tasks +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models.fairseq_model import FairseqModel +from fairseq.utils import apply_to_sample +from omegaconf import open_dict, OmegaConf + +from typing import List + +from .decoder_config import FlashlightDecoderConfig +from .base_decoder import BaseDecoder + +try: + from flashlight.lib.text.decoder import ( + LM, + CriterionType, + DecodeResult, + KenLM, + LexiconDecoder, + LexiconDecoderOptions, + LexiconFreeDecoder, + LexiconFreeDecoderOptions, + LMState, + SmearingMode, + Trie, + ) + from flashlight.lib.text.dictionary import create_word_dict, load_words +except ImportError: + warnings.warn( + "flashlight python bindings are required to use this functionality. " + "Please install from " + "https://github.com/facebookresearch/flashlight/tree/master/bindings/python" + ) + LM = object + LMState = object + + +class KenLMDecoder(BaseDecoder): + def __init__(self, cfg: FlashlightDecoderConfig, tgt_dict: Dictionary) -> None: + super().__init__(tgt_dict) + + self.nbest = cfg.nbest + self.unitlm = cfg.unitlm + + if cfg.lexicon: + self.lexicon = load_words(cfg.lexicon) + self.word_dict = create_word_dict(self.lexicon) + self.unk_word = self.word_dict.get_index("<unk>") + + self.lm = KenLM(cfg.lmpath, self.word_dict) + self.trie = Trie(self.vocab_size, self.silence) + + start_state = self.lm.start(False) + for word, spellings in self.lexicon.items(): + word_idx = self.word_dict.get_index(word) + _, score = self.lm.score(start_state, word_idx) + for spelling in spellings: + spelling_idxs = [tgt_dict.index(token) for token in spelling] + assert ( + tgt_dict.unk() not in spelling_idxs + ), f"{word} {spelling} {spelling_idxs}" + self.trie.insert(spelling_idxs, word_idx, score) + self.trie.smear(SmearingMode.MAX) + + self.decoder_opts = LexiconDecoderOptions( + beam_size=cfg.beam, + beam_size_token=cfg.beamsizetoken or len(tgt_dict), + beam_threshold=cfg.beamthreshold, + lm_weight=cfg.lmweight, + word_score=cfg.wordscore, + unk_score=cfg.unkweight, + sil_score=cfg.silweight, + log_add=False, + criterion_type=CriterionType.CTC, + ) + + self.decoder = LexiconDecoder( + self.decoder_opts, + self.trie, + self.lm, + self.silence, + self.blank, + self.unk_word, + [], + self.unitlm, + ) + else: + assert self.unitlm, "Lexicon-free decoding requires unit LM" + + d = {w: [[w]] for w in tgt_dict.symbols} + self.word_dict = create_word_dict(d) + self.lm = KenLM(cfg.lmpath, self.word_dict) + self.decoder_opts = LexiconFreeDecoderOptions( + beam_size=cfg.beam, + beam_size_token=cfg.beamsizetoken or len(tgt_dict), + beam_threshold=cfg.beamthreshold, + lm_weight=cfg.lmweight, + sil_score=cfg.silweight, + log_add=False, + criterion_type=CriterionType.CTC, + ) + self.decoder = LexiconFreeDecoder( + self.decoder_opts, self.lm, self.silence, self.blank, [] + ) + + def get_timesteps(self, token_idxs: List[int]) -> List[int]: + """Returns frame numbers corresponding to every non-blank token. + + Parameters + ---------- + token_idxs : List[int] + IDs of decoded tokens. + + Returns + ------- + List[int] + Frame numbers corresponding to every non-blank token. + """ + timesteps = [] + for i, token_idx in enumerate(token_idxs): + if token_idx == self.blank: + continue + if i == 0 or token_idx != token_idxs[i-1]: + timesteps.append(i) + return timesteps + + def decode( + self, + emissions: torch.FloatTensor, + ) -> List[List[Dict[str, torch.LongTensor]]]: + B, T, N = emissions.size() + hypos = [] + for b in range(B): + emissions_ptr = emissions.data_ptr() + 4 * b * emissions.stride(0) + results = self.decoder.decode(emissions_ptr, T, N) + + nbest_results = results[: self.nbest] + hypos.append( + [ + { + "tokens": self.get_tokens(result.tokens), + "score": result.score, + "timesteps": self.get_timesteps(result.tokens), + "words": [ + self.word_dict.get_entry(x) for x in result.words if x >= 0 + ], + } + for result in nbest_results + ] + ) + return hypos + + +FairseqLMState = namedtuple( + "FairseqLMState", + [ + "prefix", + "incremental_state", + "probs", + ], +) + + +class FairseqLM(LM): + def __init__(self, dictionary: Dictionary, model: FairseqModel) -> None: + super().__init__() + + self.dictionary = dictionary + self.model = model + self.unk = self.dictionary.unk() + + self.save_incremental = False # this currently does not work properly + self.max_cache = 20_000 + + if torch.cuda.is_available(): + model.cuda() + model.eval() + model.make_generation_fast_() + + self.states = {} + self.stateq = deque() + + def start(self, start_with_nothing: bool) -> LMState: + state = LMState() + prefix = torch.LongTensor([[self.dictionary.eos()]]) + incremental_state = {} if self.save_incremental else None + with torch.no_grad(): + res = self.model(prefix.cuda(), incremental_state=incremental_state) + probs = self.model.get_normalized_probs(res, log_probs=True, sample=None) + + if incremental_state is not None: + incremental_state = apply_to_sample(lambda x: x.cpu(), incremental_state) + self.states[state] = FairseqLMState( + prefix.numpy(), incremental_state, probs[0, -1].cpu().numpy() + ) + self.stateq.append(state) + + return state + + def score( + self, + state: LMState, + token_index: int, + no_cache: bool = False, + ) -> Tuple[LMState, int]: + """ + Evaluate language model based on the current lm state and new word + Parameters: + ----------- + state: current lm state + token_index: index of the word + (can be lexicon index then you should store inside LM the + mapping between indices of lexicon and lm, or lm index of a word) + Returns: + -------- + (LMState, float): pair of (new state, score for the current word) + """ + curr_state = self.states[state] + + def trim_cache(targ_size: int) -> None: + while len(self.stateq) > targ_size: + rem_k = self.stateq.popleft() + rem_st = self.states[rem_k] + rem_st = FairseqLMState(rem_st.prefix, None, None) + self.states[rem_k] = rem_st + + if curr_state.probs is None: + new_incremental_state = ( + curr_state.incremental_state.copy() + if curr_state.incremental_state is not None + else None + ) + with torch.no_grad(): + if new_incremental_state is not None: + new_incremental_state = apply_to_sample( + lambda x: x.cuda(), new_incremental_state + ) + elif self.save_incremental: + new_incremental_state = {} + + res = self.model( + torch.from_numpy(curr_state.prefix).cuda(), + incremental_state=new_incremental_state, + ) + probs = self.model.get_normalized_probs( + res, log_probs=True, sample=None + ) + + if new_incremental_state is not None: + new_incremental_state = apply_to_sample( + lambda x: x.cpu(), new_incremental_state + ) + + curr_state = FairseqLMState( + curr_state.prefix, new_incremental_state, probs[0, -1].cpu().numpy() + ) + + if not no_cache: + self.states[state] = curr_state + self.stateq.append(state) + + score = curr_state.probs[token_index].item() + + trim_cache(self.max_cache) + + outstate = state.child(token_index) + if outstate not in self.states and not no_cache: + prefix = np.concatenate( + [curr_state.prefix, torch.LongTensor([[token_index]])], -1 + ) + incr_state = curr_state.incremental_state + + self.states[outstate] = FairseqLMState(prefix, incr_state, None) + + if token_index == self.unk: + score = float("-inf") + + return outstate, score + + def finish(self, state: LMState) -> Tuple[LMState, int]: + """ + Evaluate eos for language model based on the current lm state + Returns: + -------- + (LMState, float): pair of (new state, score for the current word) + """ + return self.score(state, self.dictionary.eos()) + + def empty_cache(self) -> None: + self.states = {} + self.stateq = deque() + gc.collect() + + +class FairseqLMDecoder(BaseDecoder): + def __init__(self, cfg: FlashlightDecoderConfig, tgt_dict: Dictionary) -> None: + super().__init__(tgt_dict) + + self.nbest = cfg.nbest + self.unitlm = cfg.unitlm + + self.lexicon = load_words(cfg.lexicon) if cfg.lexicon else None + self.idx_to_wrd = {} + + checkpoint = torch.load(cfg.lmpath, map_location="cpu") + + if "cfg" in checkpoint and checkpoint["cfg"] is not None: + lm_args = checkpoint["cfg"] + else: + lm_args = convert_namespace_to_omegaconf(checkpoint["args"]) + + if not OmegaConf.is_dict(lm_args): + lm_args = OmegaConf.create(lm_args) + + with open_dict(lm_args.task): + lm_args.task.data = osp.dirname(cfg.lmpath) + + task = tasks.setup_task(lm_args.task) + model = task.build_model(lm_args.model) + model.load_state_dict(checkpoint["model"], strict=False) + + self.trie = Trie(self.vocab_size, self.silence) + + self.word_dict = task.dictionary + self.unk_word = self.word_dict.unk() + self.lm = FairseqLM(self.word_dict, model) + + if self.lexicon: + start_state = self.lm.start(False) + for i, (word, spellings) in enumerate(self.lexicon.items()): + if self.unitlm: + word_idx = i + self.idx_to_wrd[i] = word + score = 0 + else: + word_idx = self.word_dict.index(word) + _, score = self.lm.score(start_state, word_idx, no_cache=True) + + for spelling in spellings: + spelling_idxs = [tgt_dict.index(token) for token in spelling] + assert ( + tgt_dict.unk() not in spelling_idxs + ), f"{spelling} {spelling_idxs}" + self.trie.insert(spelling_idxs, word_idx, score) + self.trie.smear(SmearingMode.MAX) + + self.decoder_opts = LexiconDecoderOptions( + beam_size=cfg.beam, + beam_size_token=cfg.beamsizetoken or len(tgt_dict), + beam_threshold=cfg.beamthreshold, + lm_weight=cfg.lmweight, + word_score=cfg.wordscore, + unk_score=cfg.unkweight, + sil_score=cfg.silweight, + log_add=False, + criterion_type=CriterionType.CTC, + ) + + self.decoder = LexiconDecoder( + self.decoder_opts, + self.trie, + self.lm, + self.silence, + self.blank, + self.unk_word, + [], + self.unitlm, + ) + else: + assert self.unitlm, "Lexicon-free decoding requires unit LM" + + d = {w: [[w]] for w in tgt_dict.symbols} + self.word_dict = create_word_dict(d) + self.lm = KenLM(cfg.lmpath, self.word_dict) + self.decoder_opts = LexiconFreeDecoderOptions( + beam_size=cfg.beam, + beam_size_token=cfg.beamsizetoken or len(tgt_dict), + beam_threshold=cfg.beamthreshold, + lm_weight=cfg.lmweight, + sil_score=cfg.silweight, + log_add=False, + criterion_type=CriterionType.CTC, + ) + self.decoder = LexiconFreeDecoder( + self.decoder_opts, self.lm, self.silence, self.blank, [] + ) + + def decode( + self, + emissions: torch.FloatTensor, + ) -> List[List[Dict[str, torch.LongTensor]]]: + B, T, N = emissions.size() + hypos = [] + + def make_hypo(result: DecodeResult) -> Dict[str, Any]: + hypo = { + "tokens": self.get_tokens(result.tokens), + "score": result.score, + } + if self.lexicon: + hypo["words"] = [ + self.idx_to_wrd[x] if self.unitlm else self.word_dict[x] + for x in result.words + if x >= 0 + ] + return hypo + + for b in range(B): + emissions_ptr = emissions.data_ptr() + 4 * b * emissions.stride(0) + results = self.decoder.decode(emissions_ptr, T, N) + + nbest_results = results[: self.nbest] + hypos.append([make_hypo(result) for result in nbest_results]) + self.lm.empty_cache() + + return hypos diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/decoders/viterbi_decoder.py b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/viterbi_decoder.py new file mode 100644 index 0000000..b1c4786 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/decoders/viterbi_decoder.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from typing import List, Dict + +from .base_decoder import BaseDecoder + + +class ViterbiDecoder(BaseDecoder): + def decode( + self, + emissions: torch.FloatTensor, + ) -> List[List[Dict[str, torch.LongTensor]]]: + def get_pred(e): + toks = e.argmax(dim=-1).unique_consecutive() + return toks[toks != self.blank] + + return [[{"tokens": get_pred(x), "score": 0}] for x in emissions] diff --git a/SpeechT5/fairseq/examples/speech_recognition/new/infer.py b/SpeechT5/fairseq/examples/speech_recognition/new/infer.py new file mode 100644 index 0000000..79afbc4 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/new/infer.py @@ -0,0 +1,471 @@ +#!/usr/bin/env python -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import ast +import hashlib +import logging +import os +import shutil +import sys +from dataclasses import dataclass, field, is_dataclass +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple, Union + +import editdistance +import torch +import torch.distributed as dist +from examples.speech_recognition.new.decoders.decoder_config import ( + DecoderConfig, + FlashlightDecoderConfig, +) +from examples.speech_recognition.new.decoders.decoder import Decoder +from fairseq import checkpoint_utils, distributed_utils, progress_bar, tasks, utils +from fairseq.data.data_utils import post_process +from fairseq.dataclass.configs import ( + CheckpointConfig, + CommonConfig, + CommonEvalConfig, + DatasetConfig, + DistributedTrainingConfig, + FairseqDataclass, +) +from fairseq.logging.meters import StopwatchMeter, TimeMeter +from fairseq.logging.progress_bar import BaseProgressBar +from fairseq.models.fairseq_model import FairseqModel +from omegaconf import OmegaConf + +import hydra +from hydra.core.config_store import ConfigStore + +logging.root.setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +config_path = Path(__file__).resolve().parent / "conf" + + +@dataclass +class DecodingConfig(DecoderConfig, FlashlightDecoderConfig): + unique_wer_file: bool = field( + default=False, + metadata={"help": "If set, use a unique file for storing WER"}, + ) + results_path: Optional[str] = field( + default=None, + metadata={ + "help": "If set, write hypothesis and reference sentences into this directory" + }, + ) + + +@dataclass +class InferConfig(FairseqDataclass): + task: Any = None + decoding: DecodingConfig = DecodingConfig() + common: CommonConfig = CommonConfig() + common_eval: CommonEvalConfig = CommonEvalConfig() + checkpoint: CheckpointConfig = CheckpointConfig() + distributed_training: DistributedTrainingConfig = DistributedTrainingConfig() + dataset: DatasetConfig = DatasetConfig() + is_ax: bool = field( + default=False, + metadata={ + "help": "if true, assumes we are using ax for tuning and returns a tuple for ax to consume" + }, + ) + + +def reset_logging(): + root = logging.getLogger() + for handler in root.handlers: + root.removeHandler(handler) + root.setLevel(os.environ.get("LOGLEVEL", "INFO").upper()) + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter( + logging.Formatter( + fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + ) + root.addHandler(handler) + + +class InferenceProcessor: + cfg: InferConfig + + def __init__(self, cfg: InferConfig) -> None: + self.cfg = cfg + self.task = tasks.setup_task(cfg.task) + self.tgt_dict = self.task.target_dictionary + + models, saved_cfg = self.load_model_ensemble() + self.models = models + self.saved_cfg = saved_cfg + + self.task.load_dataset( + self.cfg.dataset.gen_subset, + task_cfg=saved_cfg.task, + ) + self.generator = Decoder(cfg.decoding, self.tgt_dict) + self.gen_timer = StopwatchMeter() + self.wps_meter = TimeMeter() + self.num_sentences = 0 + self.total_errors = 0 + self.total_length = 0 + + self.hypo_words_file = None + self.hypo_units_file = None + self.ref_words_file = None + self.ref_units_file = None + + self.progress_bar = self.build_progress_bar() + + def __enter__(self) -> "InferenceProcessor": + if self.cfg.decoding.results_path is not None: + self.hypo_words_file = self.get_res_file("hypo.word") + self.hypo_units_file = self.get_res_file("hypo.units") + self.ref_words_file = self.get_res_file("ref.word") + self.ref_units_file = self.get_res_file("ref.units") + return self + + def __exit__(self, *exc) -> bool: + if self.cfg.decoding.results_path is not None: + self.hypo_words_file.close() + self.hypo_units_file.close() + self.ref_words_file.close() + self.ref_units_file.close() + return False + + def __iter__(self) -> Any: + for sample in self.progress_bar: + if not self.cfg.common.cpu: + sample = utils.move_to_cuda(sample) + + # Happens on the last batch. + if "net_input" not in sample: + continue + yield sample + + def log(self, *args, **kwargs): + self.progress_bar.log(*args, **kwargs) + + def print(self, *args, **kwargs): + self.progress_bar.print(*args, **kwargs) + + def get_res_file(self, fname: str) -> None: + fname = os.path.join(self.cfg.decoding.results_path, fname) + if self.data_parallel_world_size > 1: + fname = f"{fname}.{self.data_parallel_rank}" + return open(fname, "w", buffering=1) + + def merge_shards(self) -> None: + """Merges all shard files into shard 0, then removes shard suffix.""" + + shard_id = self.data_parallel_rank + num_shards = self.data_parallel_world_size + + if self.data_parallel_world_size > 1: + + def merge_shards_with_root(fname: str) -> None: + fname = os.path.join(self.cfg.decoding.results_path, fname) + logger.info("Merging %s on shard %d", fname, shard_id) + base_fpath = Path(f"{fname}.0") + with open(base_fpath, "a") as out_file: + for s in range(1, num_shards): + shard_fpath = Path(f"{fname}.{s}") + with open(shard_fpath, "r") as in_file: + for line in in_file: + out_file.write(line) + shard_fpath.unlink() + shutil.move(f"{fname}.0", fname) + + dist.barrier() # ensure all shards finished writing + if shard_id == (0 % num_shards): + merge_shards_with_root("hypo.word") + if shard_id == (1 % num_shards): + merge_shards_with_root("hypo.units") + if shard_id == (2 % num_shards): + merge_shards_with_root("ref.word") + if shard_id == (3 % num_shards): + merge_shards_with_root("ref.units") + dist.barrier() + + def optimize_model(self, model: FairseqModel) -> None: + model.make_generation_fast_() + if self.cfg.common.fp16: + model.half() + if not self.cfg.common.cpu: + model.cuda() + + def load_model_ensemble(self) -> Tuple[List[FairseqModel], FairseqDataclass]: + arg_overrides = ast.literal_eval(self.cfg.common_eval.model_overrides) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + utils.split_paths(self.cfg.common_eval.path, separator="\\"), + arg_overrides=arg_overrides, + task=self.task, + suffix=self.cfg.checkpoint.checkpoint_suffix, + strict=(self.cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=self.cfg.checkpoint.checkpoint_shard_count, + ) + for model in models: + self.optimize_model(model) + return models, saved_cfg + + def get_dataset_itr(self, disable_iterator_cache: bool = False) -> None: + return self.task.get_batch_iterator( + dataset=self.task.dataset(self.cfg.dataset.gen_subset), + max_tokens=self.cfg.dataset.max_tokens, + max_sentences=self.cfg.dataset.batch_size, + max_positions=(sys.maxsize, sys.maxsize), + ignore_invalid_inputs=self.cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=self.cfg.dataset.required_batch_size_multiple, + seed=self.cfg.common.seed, + num_shards=self.data_parallel_world_size, + shard_id=self.data_parallel_rank, + num_workers=self.cfg.dataset.num_workers, + data_buffer_size=self.cfg.dataset.data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + ).next_epoch_itr(shuffle=False) + + def build_progress_bar( + self, + epoch: Optional[int] = None, + prefix: Optional[str] = None, + default_log_format: str = "tqdm", + ) -> BaseProgressBar: + return progress_bar.progress_bar( + iterator=self.get_dataset_itr(), + log_format=self.cfg.common.log_format, + log_interval=self.cfg.common.log_interval, + epoch=epoch, + prefix=prefix, + tensorboard_logdir=self.cfg.common.tensorboard_logdir, + default_log_format=default_log_format, + ) + + @property + def data_parallel_world_size(self): + if self.cfg.distributed_training.distributed_world_size == 1: + return 1 + return distributed_utils.get_data_parallel_world_size() + + @property + def data_parallel_rank(self): + if self.cfg.distributed_training.distributed_world_size == 1: + return 0 + return distributed_utils.get_data_parallel_rank() + + def process_sentence( + self, + sample: Dict[str, Any], + hypo: Dict[str, Any], + sid: int, + batch_id: int, + ) -> Tuple[int, int]: + speaker = None # Speaker can't be parsed from dataset. + + if "target_label" in sample: + toks = sample["target_label"] + else: + toks = sample["target"] + toks = toks[batch_id, :] + + # Processes hypothesis. + hyp_pieces = self.tgt_dict.string(hypo["tokens"].int().cpu()) + if "words" in hypo: + hyp_words = " ".join(hypo["words"]) + else: + hyp_words = post_process(hyp_pieces, self.cfg.common_eval.post_process) + + # Processes target. + target_tokens = utils.strip_pad(toks, self.tgt_dict.pad()) + tgt_pieces = self.tgt_dict.string(target_tokens.int().cpu()) + tgt_words = post_process(tgt_pieces, self.cfg.common_eval.post_process) + + if self.cfg.decoding.results_path is not None: + print(f"{hyp_pieces} ({speaker}-{sid})", file=self.hypo_units_file) + print(f"{hyp_words} ({speaker}-{sid})", file=self.hypo_words_file) + print(f"{tgt_pieces} ({speaker}-{sid})", file=self.ref_units_file) + print(f"{tgt_words} ({speaker}-{sid})", file=self.ref_words_file) + + if not self.cfg.common_eval.quiet: + logger.info(f"HYPO: {hyp_words}") + logger.info(f"REF: {tgt_words}") + logger.info("---------------------") + + hyp_words, tgt_words = hyp_words.split(), tgt_words.split() + + return editdistance.eval(hyp_words, tgt_words), len(tgt_words) + + def process_sample(self, sample: Dict[str, Any]) -> None: + self.gen_timer.start() + hypos = self.task.inference_step( + generator=self.generator, + models=self.models, + sample=sample, + ) + num_generated_tokens = sum(len(h[0]["tokens"]) for h in hypos) + self.gen_timer.stop(num_generated_tokens) + self.wps_meter.update(num_generated_tokens) + + for batch_id, sample_id in enumerate(sample["id"].tolist()): + errs, length = self.process_sentence( + sample=sample, + sid=sample_id, + batch_id=batch_id, + hypo=hypos[batch_id][0], + ) + self.total_errors += errs + self.total_length += length + + self.log({"wps": round(self.wps_meter.avg)}) + if "nsentences" in sample: + self.num_sentences += sample["nsentences"] + else: + self.num_sentences += sample["id"].numel() + + def log_generation_time(self) -> None: + logger.info( + "Processed %d sentences (%d tokens) in %.1fs %.2f " + "sentences per second, %.2f tokens per second)", + self.num_sentences, + self.gen_timer.n, + self.gen_timer.sum, + self.num_sentences / self.gen_timer.sum, + 1.0 / self.gen_timer.avg, + ) + + +def parse_wer(wer_file: Path) -> float: + with open(wer_file, "r") as f: + return float(f.readline().strip().split(" ")[1]) + + +def get_wer_file(cfg: InferConfig) -> Path: + """Hashes the decoding parameters to a unique file ID.""" + base_path = "wer" + if cfg.decoding.results_path is not None: + base_path = os.path.join(cfg.decoding.results_path, base_path) + + if cfg.decoding.unique_wer_file: + yaml_str = OmegaConf.to_yaml(cfg.decoding) + fid = int(hashlib.md5(yaml_str.encode("utf-8")).hexdigest(), 16) + return Path(f"{base_path}.{fid % 1000000}") + else: + return Path(base_path) + + +def main(cfg: InferConfig) -> float: + """Entry point for main processing logic. + + Args: + cfg: The inferance configuration to use. + wer: Optional shared memory pointer for returning the WER. If not None, + the final WER value will be written here instead of being returned. + + Returns: + The final WER if `wer` is None, otherwise None. + """ + + yaml_str, wer_file = OmegaConf.to_yaml(cfg.decoding), get_wer_file(cfg) + + # Validates the provided configuration. + if cfg.dataset.max_tokens is None and cfg.dataset.batch_size is None: + cfg.dataset.max_tokens = 4000000 + if not cfg.common.cpu and not torch.cuda.is_available(): + raise ValueError("CUDA not found; set `cpu=True` to run without CUDA") + + with InferenceProcessor(cfg) as processor: + for sample in processor: + processor.process_sample(sample) + + processor.log_generation_time() + + if cfg.decoding.results_path is not None: + processor.merge_shards() + + errs_t, leng_t = processor.total_errors, processor.total_length + + if cfg.common.cpu: + logger.warning("Merging WER requires CUDA.") + elif processor.data_parallel_world_size > 1: + stats = torch.LongTensor([errs_t, leng_t]).cuda() + dist.all_reduce(stats, op=dist.ReduceOp.SUM) + errs_t, leng_t = stats[0].item(), stats[1].item() + + wer = errs_t * 100.0 / leng_t + + if distributed_utils.is_master(cfg.distributed_training): + with open(wer_file, "w") as f: + f.write( + ( + f"WER: {wer}\n" + f"err / num_ref_words = {errs_t} / {leng_t}\n\n" + f"{yaml_str}" + ) + ) + + return wer + + +@hydra.main(config_path=config_path, config_name="infer") +def hydra_main(cfg: InferConfig) -> Union[float, Tuple[float, Optional[float]]]: + container = OmegaConf.to_container(cfg, resolve=True, enum_to_str=True) + cfg = OmegaConf.create(container) + OmegaConf.set_struct(cfg, True) + + if cfg.common.reset_logging: + reset_logging() + + # logger.info("Config:\n%s", OmegaConf.to_yaml(cfg)) + wer = float("inf") + + try: + if cfg.common.profile: + with torch.cuda.profiler.profile(): + with torch.autograd.profiler.emit_nvtx(): + distributed_utils.call_main(cfg, main) + else: + distributed_utils.call_main(cfg, main) + + wer = parse_wer(get_wer_file(cfg)) + except BaseException as e: # pylint: disable=broad-except + if not cfg.common.suppress_crashes: + raise + else: + logger.error("Crashed! %s", str(e)) + + logger.info("Word error rate: %.4f", wer) + if cfg.is_ax: + return wer, None + + return wer + + +def cli_main() -> None: + try: + from hydra._internal.utils import ( + get_args, + ) # pylint: disable=import-outside-toplevel + + cfg_name = get_args().config_name or "infer" + except ImportError: + logger.warning("Failed to get config name from hydra args") + cfg_name = "infer" + + cs = ConfigStore.instance() + cs.store(name=cfg_name, node=InferConfig) + + for k in InferConfig.__dataclass_fields__: + if is_dataclass(InferConfig.__dataclass_fields__[k].type): + v = InferConfig.__dataclass_fields__[k].default + cs.store(name=k, node=v) + + hydra_main() # pylint: disable=no-value-for-parameter + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/speech_recognition/tasks/__init__.py b/SpeechT5/fairseq/examples/speech_recognition/tasks/__init__.py new file mode 100644 index 0000000..7ac3b8d --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/tasks/__init__.py @@ -0,0 +1,8 @@ +import importlib +import os + + +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + task_name = file[: file.find(".py")] + importlib.import_module("examples.speech_recognition.tasks." + task_name) diff --git a/SpeechT5/fairseq/examples/speech_recognition/tasks/speech_recognition.py b/SpeechT5/fairseq/examples/speech_recognition/tasks/speech_recognition.py new file mode 100644 index 0000000..d9f011d --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/tasks/speech_recognition.py @@ -0,0 +1,157 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import json +import os +import re +import sys + +import torch +from examples.speech_recognition.data import AsrDataset +from examples.speech_recognition.data.replabels import replabel_symbol +from fairseq.data import Dictionary +from fairseq.tasks import LegacyFairseqTask, register_task + + +def get_asr_dataset_from_json(data_json_path, tgt_dict): + """ + Parse data json and create dataset. + See scripts/asr_prep_json.py which pack json from raw files + + Json example: + { + "utts": { + "4771-29403-0025": { + "input": { + "length_ms": 170, + "path": "/tmp/file1.flac" + }, + "output": { + "text": "HELLO \n", + "token": "HE LLO", + "tokenid": "4815, 861" + } + }, + "1564-142299-0096": { + ... + } + } + """ + if not os.path.isfile(data_json_path): + raise FileNotFoundError("Dataset not found: {}".format(data_json_path)) + with open(data_json_path, "rb") as f: + data_samples = json.load(f)["utts"] + assert len(data_samples) != 0 + sorted_samples = sorted( + data_samples.items(), + key=lambda sample: int(sample[1]["input"]["length_ms"]), + reverse=True, + ) + aud_paths = [s[1]["input"]["path"] for s in sorted_samples] + ids = [s[0] for s in sorted_samples] + speakers = [] + for s in sorted_samples: + m = re.search("(.+?)-(.+?)-(.+?)", s[0]) + speakers.append(m.group(1) + "_" + m.group(2)) + frame_sizes = [s[1]["input"]["length_ms"] for s in sorted_samples] + tgt = [ + [int(i) for i in s[1]["output"]["tokenid"].split(", ")] + for s in sorted_samples + ] + # append eos + tgt = [[*t, tgt_dict.eos()] for t in tgt] + return AsrDataset(aud_paths, frame_sizes, tgt, tgt_dict, ids, speakers) + + +@register_task("speech_recognition") +class SpeechRecognitionTask(LegacyFairseqTask): + """ + Task for training speech recognition model. + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument("data", help="path to data directory") + parser.add_argument( + "--silence-token", default="\u2581", help="token for silence (used by w2l)" + ) + parser.add_argument( + "--max-source-positions", + default=sys.maxsize, + type=int, + metavar="N", + help="max number of frames in the source sequence", + ) + parser.add_argument( + "--max-target-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the target sequence", + ) + + def __init__(self, args, tgt_dict): + super().__init__(args) + self.tgt_dict = tgt_dict + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task (e.g., load dictionaries).""" + dict_path = os.path.join(args.data, "dict.txt") + if not os.path.isfile(dict_path): + raise FileNotFoundError("Dict not found: {}".format(dict_path)) + tgt_dict = Dictionary.load(dict_path) + + if args.criterion == "ctc_loss": + tgt_dict.add_symbol("<ctc_blank>") + elif args.criterion == "asg_loss": + for i in range(1, args.max_replabel + 1): + tgt_dict.add_symbol(replabel_symbol(i)) + + print("| dictionary: {} types".format(len(tgt_dict))) + return cls(args, tgt_dict) + + def load_dataset(self, split, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + data_json_path = os.path.join(self.args.data, "{}.json".format(split)) + self.datasets[split] = get_asr_dataset_from_json(data_json_path, self.tgt_dict) + + def build_generator(self, models, args, **unused): + w2l_decoder = getattr(args, "w2l_decoder", None) + if w2l_decoder == "viterbi": + from examples.speech_recognition.w2l_decoder import W2lViterbiDecoder + + return W2lViterbiDecoder(args, self.target_dictionary) + elif w2l_decoder == "kenlm": + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + return W2lKenLMDecoder(args, self.target_dictionary) + elif w2l_decoder == "fairseqlm": + from examples.speech_recognition.w2l_decoder import W2lFairseqLMDecoder + + return W2lFairseqLMDecoder(args, self.target_dictionary) + else: + return super().build_generator(models, args) + + @property + def target_dictionary(self): + """Return the :class:`~fairseq.data.Dictionary` for the language + model.""" + return self.tgt_dict + + @property + def source_dictionary(self): + """Return the source :class:`~fairseq.data.Dictionary` (if applicable + for this task).""" + return None + + def max_positions(self): + """Return the max speech and sentence length allowed by the task.""" + return (self.args.max_source_positions, self.args.max_target_positions) diff --git a/SpeechT5/fairseq/examples/speech_recognition/utils/wer_utils.py b/SpeechT5/fairseq/examples/speech_recognition/utils/wer_utils.py new file mode 100644 index 0000000..cf6f3d0 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/utils/wer_utils.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import re +from collections import deque +from enum import Enum + +import numpy as np + + +""" + Utility modules for computation of Word Error Rate, + Alignments, as well as more granular metrics like + deletion, insersion and substitutions. +""" + + +class Code(Enum): + match = 1 + substitution = 2 + insertion = 3 + deletion = 4 + + +class Token(object): + def __init__(self, lbl="", st=np.nan, en=np.nan): + if np.isnan(st): + self.label, self.start, self.end = "", 0.0, 0.0 + else: + self.label, self.start, self.end = lbl, st, en + + +class AlignmentResult(object): + def __init__(self, refs, hyps, codes, score): + self.refs = refs # std::deque<int> + self.hyps = hyps # std::deque<int> + self.codes = codes # std::deque<Code> + self.score = score # float + + +def coordinate_to_offset(row, col, ncols): + return int(row * ncols + col) + + +def offset_to_row(offset, ncols): + return int(offset / ncols) + + +def offset_to_col(offset, ncols): + return int(offset % ncols) + + +def trimWhitespace(str): + return re.sub(" +", " ", re.sub(" *$", "", re.sub("^ *", "", str))) + + +def str2toks(str): + pieces = trimWhitespace(str).split(" ") + toks = [] + for p in pieces: + toks.append(Token(p, 0.0, 0.0)) + return toks + + +class EditDistance(object): + def __init__(self, time_mediated): + self.time_mediated_ = time_mediated + self.scores_ = np.nan # Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> + self.backtraces_ = ( + np.nan + ) # Eigen::Matrix<size_t, Eigen::Dynamic, Eigen::Dynamic> backtraces_; + self.confusion_pairs_ = {} + + def cost(self, ref, hyp, code): + if self.time_mediated_: + if code == Code.match: + return abs(ref.start - hyp.start) + abs(ref.end - hyp.end) + elif code == Code.insertion: + return hyp.end - hyp.start + elif code == Code.deletion: + return ref.end - ref.start + else: # substitution + return abs(ref.start - hyp.start) + abs(ref.end - hyp.end) + 0.1 + else: + if code == Code.match: + return 0 + elif code == Code.insertion or code == Code.deletion: + return 3 + else: # substitution + return 4 + + def get_result(self, refs, hyps): + res = AlignmentResult(refs=deque(), hyps=deque(), codes=deque(), score=np.nan) + + num_rows, num_cols = self.scores_.shape + res.score = self.scores_[num_rows - 1, num_cols - 1] + + curr_offset = coordinate_to_offset(num_rows - 1, num_cols - 1, num_cols) + + while curr_offset != 0: + curr_row = offset_to_row(curr_offset, num_cols) + curr_col = offset_to_col(curr_offset, num_cols) + + prev_offset = self.backtraces_[curr_row, curr_col] + + prev_row = offset_to_row(prev_offset, num_cols) + prev_col = offset_to_col(prev_offset, num_cols) + + res.refs.appendleft(curr_row - 1) # Note: this was .push_front() in C++ + res.hyps.appendleft(curr_col - 1) + if curr_row - 1 == prev_row and curr_col == prev_col: + res.codes.appendleft(Code.deletion) + elif curr_row == prev_row and curr_col - 1 == prev_col: + res.codes.appendleft(Code.insertion) + else: + # assert(curr_row - 1 == prev_row and curr_col - 1 == prev_col) + ref_str = refs[res.refs[0]].label + hyp_str = hyps[res.hyps[0]].label + + if ref_str == hyp_str: + res.codes.appendleft(Code.match) + else: + res.codes.appendleft(Code.substitution) + + confusion_pair = "%s -> %s" % (ref_str, hyp_str) + if confusion_pair not in self.confusion_pairs_: + self.confusion_pairs_[confusion_pair] = 1 + else: + self.confusion_pairs_[confusion_pair] += 1 + + curr_offset = prev_offset + + return res + + def align(self, refs, hyps): + if len(refs) == 0 and len(hyps) == 0: + return np.nan + + # NOTE: we're not resetting the values in these matrices because every value + # will be overridden in the loop below. If this assumption doesn't hold, + # be sure to set all entries in self.scores_ and self.backtraces_ to 0. + self.scores_ = np.zeros((len(refs) + 1, len(hyps) + 1)) + self.backtraces_ = np.zeros((len(refs) + 1, len(hyps) + 1)) + + num_rows, num_cols = self.scores_.shape + + for i in range(num_rows): + for j in range(num_cols): + if i == 0 and j == 0: + self.scores_[i, j] = 0.0 + self.backtraces_[i, j] = 0 + continue + + if i == 0: + self.scores_[i, j] = self.scores_[i, j - 1] + self.cost( + None, hyps[j - 1], Code.insertion + ) + self.backtraces_[i, j] = coordinate_to_offset(i, j - 1, num_cols) + continue + + if j == 0: + self.scores_[i, j] = self.scores_[i - 1, j] + self.cost( + refs[i - 1], None, Code.deletion + ) + self.backtraces_[i, j] = coordinate_to_offset(i - 1, j, num_cols) + continue + + # Below here both i and j are greater than 0 + ref = refs[i - 1] + hyp = hyps[j - 1] + best_score = self.scores_[i - 1, j - 1] + ( + self.cost(ref, hyp, Code.match) + if (ref.label == hyp.label) + else self.cost(ref, hyp, Code.substitution) + ) + + prev_row = i - 1 + prev_col = j - 1 + ins = self.scores_[i, j - 1] + self.cost(None, hyp, Code.insertion) + if ins < best_score: + best_score = ins + prev_row = i + prev_col = j - 1 + + delt = self.scores_[i - 1, j] + self.cost(ref, None, Code.deletion) + if delt < best_score: + best_score = delt + prev_row = i - 1 + prev_col = j + + self.scores_[i, j] = best_score + self.backtraces_[i, j] = coordinate_to_offset( + prev_row, prev_col, num_cols + ) + + return self.get_result(refs, hyps) + + +class WERTransformer(object): + def __init__(self, hyp_str, ref_str, verbose=True): + self.ed_ = EditDistance(False) + self.id2oracle_errs_ = {} + self.utts_ = 0 + self.words_ = 0 + self.insertions_ = 0 + self.deletions_ = 0 + self.substitutions_ = 0 + + self.process(["dummy_str", hyp_str, ref_str]) + + if verbose: + print("'%s' vs '%s'" % (hyp_str, ref_str)) + self.report_result() + + def process(self, input): # std::vector<std::string>&& input + if len(input) < 3: + print( + "Input must be of the form <id> ... <hypo> <ref> , got ", + len(input), + " inputs:", + ) + return None + + # Align + # std::vector<Token> hyps; + # std::vector<Token> refs; + + hyps = str2toks(input[-2]) + refs = str2toks(input[-1]) + + alignment = self.ed_.align(refs, hyps) + if alignment is None: + print("Alignment is null") + return np.nan + + # Tally errors + ins = 0 + dels = 0 + subs = 0 + for code in alignment.codes: + if code == Code.substitution: + subs += 1 + elif code == Code.insertion: + ins += 1 + elif code == Code.deletion: + dels += 1 + + # Output + row = input + row.append(str(len(refs))) + row.append(str(ins)) + row.append(str(dels)) + row.append(str(subs)) + # print(row) + + # Accumulate + kIdIndex = 0 + kNBestSep = "/" + + pieces = input[kIdIndex].split(kNBestSep) + + if len(pieces) == 0: + print( + "Error splitting ", + input[kIdIndex], + " on '", + kNBestSep, + "', got empty list", + ) + return np.nan + + id = pieces[0] + if id not in self.id2oracle_errs_: + self.utts_ += 1 + self.words_ += len(refs) + self.insertions_ += ins + self.deletions_ += dels + self.substitutions_ += subs + self.id2oracle_errs_[id] = [ins, dels, subs] + else: + curr_err = ins + dels + subs + prev_err = np.sum(self.id2oracle_errs_[id]) + if curr_err < prev_err: + self.id2oracle_errs_[id] = [ins, dels, subs] + + return 0 + + def report_result(self): + # print("---------- Summary ---------------") + if self.words_ == 0: + print("No words counted") + return + + # 1-best + best_wer = ( + 100.0 + * (self.insertions_ + self.deletions_ + self.substitutions_) + / self.words_ + ) + + print( + "\tWER = %0.2f%% (%i utts, %i words, %0.2f%% ins, " + "%0.2f%% dels, %0.2f%% subs)" + % ( + best_wer, + self.utts_, + self.words_, + 100.0 * self.insertions_ / self.words_, + 100.0 * self.deletions_ / self.words_, + 100.0 * self.substitutions_ / self.words_, + ) + ) + + def wer(self): + if self.words_ == 0: + wer = np.nan + else: + wer = ( + 100.0 + * (self.insertions_ + self.deletions_ + self.substitutions_) + / self.words_ + ) + return wer + + def stats(self): + if self.words_ == 0: + stats = {} + else: + wer = ( + 100.0 + * (self.insertions_ + self.deletions_ + self.substitutions_) + / self.words_ + ) + stats = dict( + { + "wer": wer, + "utts": self.utts_, + "numwords": self.words_, + "ins": self.insertions_, + "dels": self.deletions_, + "subs": self.substitutions_, + "confusion_pairs": self.ed_.confusion_pairs_, + } + ) + return stats + + +def calc_wer(hyp_str, ref_str): + t = WERTransformer(hyp_str, ref_str, verbose=0) + return t.wer() + + +def calc_wer_stats(hyp_str, ref_str): + t = WERTransformer(hyp_str, ref_str, verbose=0) + return t.stats() + + +def get_wer_alignment_codes(hyp_str, ref_str): + """ + INPUT: hypothesis string, reference string + OUTPUT: List of alignment codes (intermediate results from WER computation) + """ + t = WERTransformer(hyp_str, ref_str, verbose=0) + return t.ed_.align(str2toks(ref_str), str2toks(hyp_str)).codes + + +def merge_counts(x, y): + # Merge two hashes which have 'counts' as their values + # This can be used for example to merge confusion pair counts + # conf_pairs = merge_counts(conf_pairs, stats['confusion_pairs']) + for k, v in y.items(): + if k not in x: + x[k] = 0 + x[k] += v + return x diff --git a/SpeechT5/fairseq/examples/speech_recognition/w2l_decoder.py b/SpeechT5/fairseq/examples/speech_recognition/w2l_decoder.py new file mode 100644 index 0000000..fbf2d35 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_recognition/w2l_decoder.py @@ -0,0 +1,486 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Flashlight decoders. +""" + +import gc +import itertools as it +import os.path as osp +from typing import List +import warnings +from collections import deque, namedtuple + +import numpy as np +import torch +from examples.speech_recognition.data.replabels import unpack_replabels +from fairseq import tasks +from fairseq.utils import apply_to_sample +from omegaconf import open_dict +from fairseq.dataclass.utils import convert_namespace_to_omegaconf + + +try: + from flashlight.lib.text.dictionary import create_word_dict, load_words + from flashlight.lib.sequence.criterion import CpuViterbiPath, get_data_ptr_as_bytes + from flashlight.lib.text.decoder import ( + CriterionType, + LexiconDecoderOptions, + KenLM, + LM, + LMState, + SmearingMode, + Trie, + LexiconDecoder, + ) +except: + warnings.warn( + "flashlight python bindings are required to use this functionality. Please install from https://github.com/facebookresearch/flashlight/tree/master/bindings/python" + ) + LM = object + LMState = object + + +class W2lDecoder(object): + def __init__(self, args, tgt_dict): + self.tgt_dict = tgt_dict + self.vocab_size = len(tgt_dict) + self.nbest = args.nbest + + # criterion-specific init + self.criterion_type = CriterionType.CTC + self.blank = ( + tgt_dict.index("<ctc_blank>") + if "<ctc_blank>" in tgt_dict.indices + else tgt_dict.bos() + ) + if "<sep>" in tgt_dict.indices: + self.silence = tgt_dict.index("<sep>") + elif "|" in tgt_dict.indices: + self.silence = tgt_dict.index("|") + else: + self.silence = tgt_dict.eos() + self.asg_transitions = None + + def generate(self, models, sample, **unused): + """Generate a batch of inferences.""" + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in sample["net_input"].items() if k != "prev_output_tokens" + } + emissions = self.get_emissions(models, encoder_input) + return self.decode(emissions) + + def get_emissions(self, models, encoder_input): + """Run encoder and normalize emissions""" + model = models[0] + encoder_out = model(**encoder_input) + if hasattr(model, "get_logits"): + emissions = model.get_logits(encoder_out) # no need to normalize emissions + else: + emissions = model.get_normalized_probs(encoder_out, log_probs=True) + return emissions.transpose(0, 1).float().cpu().contiguous() + + def get_tokens(self, idxs): + """Normalize tokens by handling CTC blank, ASG replabels, etc.""" + idxs = (g[0] for g in it.groupby(idxs)) + idxs = filter(lambda x: x != self.blank, idxs) + return torch.LongTensor(list(idxs)) + + +class W2lViterbiDecoder(W2lDecoder): + def __init__(self, args, tgt_dict): + super().__init__(args, tgt_dict) + + def decode(self, emissions): + B, T, N = emissions.size() + hypos = [] + if self.asg_transitions is None: + transitions = torch.FloatTensor(N, N).zero_() + else: + transitions = torch.FloatTensor(self.asg_transitions).view(N, N) + viterbi_path = torch.IntTensor(B, T) + workspace = torch.ByteTensor(CpuViterbiPath.get_workspace_size(B, T, N)) + CpuViterbiPath.compute( + B, + T, + N, + get_data_ptr_as_bytes(emissions), + get_data_ptr_as_bytes(transitions), + get_data_ptr_as_bytes(viterbi_path), + get_data_ptr_as_bytes(workspace), + ) + return [ + [{"tokens": self.get_tokens(viterbi_path[b].tolist()), "score": 0}] + for b in range(B) + ] + + +class W2lKenLMDecoder(W2lDecoder): + def __init__(self, args, tgt_dict): + super().__init__(args, tgt_dict) + + self.unit_lm = getattr(args, "unit_lm", False) + + if args.lexicon: + self.lexicon = load_words(args.lexicon) + self.word_dict = create_word_dict(self.lexicon) + self.unk_word = self.word_dict.get_index("<unk>") + + self.lm = KenLM(args.kenlm_model, self.word_dict) + self.trie = Trie(self.vocab_size, self.silence) + + start_state = self.lm.start(False) + for i, (word, spellings) in enumerate(self.lexicon.items()): + word_idx = self.word_dict.get_index(word) + _, score = self.lm.score(start_state, word_idx) + for spelling in spellings: + spelling_idxs = [tgt_dict.index(token) for token in spelling] + assert ( + tgt_dict.unk() not in spelling_idxs + ), f"{spelling} {spelling_idxs}" + self.trie.insert(spelling_idxs, word_idx, score) + self.trie.smear(SmearingMode.MAX) + + self.decoder_opts = LexiconDecoderOptions( + beam_size=args.beam, + beam_size_token=int(getattr(args, "beam_size_token", len(tgt_dict))), + beam_threshold=args.beam_threshold, + lm_weight=args.lm_weight, + word_score=args.word_score, + unk_score=args.unk_weight, + sil_score=args.sil_weight, + log_add=False, + criterion_type=self.criterion_type, + ) + + if self.asg_transitions is None: + N = 768 + # self.asg_transitions = torch.FloatTensor(N, N).zero_() + self.asg_transitions = [] + + self.decoder = LexiconDecoder( + self.decoder_opts, + self.trie, + self.lm, + self.silence, + self.blank, + self.unk_word, + self.asg_transitions, + self.unit_lm, + ) + else: + assert args.unit_lm, "lexicon free decoding can only be done with a unit language model" + from flashlight.lib.text.decoder import LexiconFreeDecoder, LexiconFreeDecoderOptions + + d = {w: [[w]] for w in tgt_dict.symbols} + self.word_dict = create_word_dict(d) + self.lm = KenLM(args.kenlm_model, self.word_dict) + self.decoder_opts = LexiconFreeDecoderOptions( + beam_size=args.beam, + beam_size_token=int(getattr(args, "beam_size_token", len(tgt_dict))), + beam_threshold=args.beam_threshold, + lm_weight=args.lm_weight, + sil_score=args.sil_weight, + log_add=False, + criterion_type=self.criterion_type, + ) + self.decoder = LexiconFreeDecoder( + self.decoder_opts, self.lm, self.silence, self.blank, [] + ) + + def get_timesteps(self, token_idxs: List[int]) -> List[int]: + """Returns frame numbers corresponding to every non-blank token. + + Parameters + ---------- + token_idxs : List[int] + IDs of decoded tokens. + + Returns + ------- + List[int] + Frame numbers corresponding to every non-blank token. + """ + timesteps = [] + for i, token_idx in enumerate(token_idxs): + if token_idx == self.blank: + continue + if i == 0 or token_idx != token_idxs[i-1]: + timesteps.append(i) + return timesteps + + def decode(self, emissions): + B, T, N = emissions.size() + hypos = [] + for b in range(B): + emissions_ptr = emissions.data_ptr() + 4 * b * emissions.stride(0) + results = self.decoder.decode(emissions_ptr, T, N) + + nbest_results = results[: self.nbest] + hypos.append( + [ + { + "tokens": self.get_tokens(result.tokens), + "score": result.score, + "timesteps": self.get_timesteps(result.tokens), + "words": [ + self.word_dict.get_entry(x) for x in result.words if x >= 0 + ], + } + for result in nbest_results + ] + ) + return hypos + + +FairseqLMState = namedtuple("FairseqLMState", ["prefix", "incremental_state", "probs"]) + + +class FairseqLM(LM): + def __init__(self, dictionary, model): + LM.__init__(self) + self.dictionary = dictionary + self.model = model + self.unk = self.dictionary.unk() + + self.save_incremental = False # this currently does not work properly + self.max_cache = 20_000 + + model.cuda() + model.eval() + model.make_generation_fast_() + + self.states = {} + self.stateq = deque() + + def start(self, start_with_nothing): + state = LMState() + prefix = torch.LongTensor([[self.dictionary.eos()]]) + incremental_state = {} if self.save_incremental else None + with torch.no_grad(): + res = self.model(prefix.cuda(), incremental_state=incremental_state) + probs = self.model.get_normalized_probs(res, log_probs=True, sample=None) + + if incremental_state is not None: + incremental_state = apply_to_sample(lambda x: x.cpu(), incremental_state) + self.states[state] = FairseqLMState( + prefix.numpy(), incremental_state, probs[0, -1].cpu().numpy() + ) + self.stateq.append(state) + + return state + + def score(self, state: LMState, token_index: int, no_cache: bool = False): + """ + Evaluate language model based on the current lm state and new word + Parameters: + ----------- + state: current lm state + token_index: index of the word + (can be lexicon index then you should store inside LM the + mapping between indices of lexicon and lm, or lm index of a word) + + Returns: + -------- + (LMState, float): pair of (new state, score for the current word) + """ + curr_state = self.states[state] + + def trim_cache(targ_size): + while len(self.stateq) > targ_size: + rem_k = self.stateq.popleft() + rem_st = self.states[rem_k] + rem_st = FairseqLMState(rem_st.prefix, None, None) + self.states[rem_k] = rem_st + + if curr_state.probs is None: + new_incremental_state = ( + curr_state.incremental_state.copy() + if curr_state.incremental_state is not None + else None + ) + with torch.no_grad(): + if new_incremental_state is not None: + new_incremental_state = apply_to_sample( + lambda x: x.cuda(), new_incremental_state + ) + elif self.save_incremental: + new_incremental_state = {} + + res = self.model( + torch.from_numpy(curr_state.prefix).cuda(), + incremental_state=new_incremental_state, + ) + probs = self.model.get_normalized_probs( + res, log_probs=True, sample=None + ) + + if new_incremental_state is not None: + new_incremental_state = apply_to_sample( + lambda x: x.cpu(), new_incremental_state + ) + + curr_state = FairseqLMState( + curr_state.prefix, new_incremental_state, probs[0, -1].cpu().numpy() + ) + + if not no_cache: + self.states[state] = curr_state + self.stateq.append(state) + + score = curr_state.probs[token_index].item() + + trim_cache(self.max_cache) + + outstate = state.child(token_index) + if outstate not in self.states and not no_cache: + prefix = np.concatenate( + [curr_state.prefix, torch.LongTensor([[token_index]])], -1 + ) + incr_state = curr_state.incremental_state + + self.states[outstate] = FairseqLMState(prefix, incr_state, None) + + if token_index == self.unk: + score = float("-inf") + + return outstate, score + + def finish(self, state: LMState): + """ + Evaluate eos for language model based on the current lm state + + Returns: + -------- + (LMState, float): pair of (new state, score for the current word) + """ + return self.score(state, self.dictionary.eos()) + + def empty_cache(self): + self.states = {} + self.stateq = deque() + gc.collect() + + +class W2lFairseqLMDecoder(W2lDecoder): + def __init__(self, args, tgt_dict): + super().__init__(args, tgt_dict) + + self.unit_lm = getattr(args, "unit_lm", False) + + self.lexicon = load_words(args.lexicon) if args.lexicon else None + self.idx_to_wrd = {} + + checkpoint = torch.load(args.kenlm_model, map_location="cpu") + + if "cfg" in checkpoint and checkpoint["cfg"] is not None: + lm_args = checkpoint["cfg"] + else: + lm_args = convert_namespace_to_omegaconf(checkpoint["args"]) + + with open_dict(lm_args.task): + lm_args.task.data = osp.dirname(args.kenlm_model) + + task = tasks.setup_task(lm_args.task) + model = task.build_model(lm_args.model) + model.load_state_dict(checkpoint["model"], strict=False) + + self.trie = Trie(self.vocab_size, self.silence) + + self.word_dict = task.dictionary + self.unk_word = self.word_dict.unk() + self.lm = FairseqLM(self.word_dict, model) + + if self.lexicon: + start_state = self.lm.start(False) + for i, (word, spellings) in enumerate(self.lexicon.items()): + if self.unit_lm: + word_idx = i + self.idx_to_wrd[i] = word + score = 0 + else: + word_idx = self.word_dict.index(word) + _, score = self.lm.score(start_state, word_idx, no_cache=True) + + for spelling in spellings: + spelling_idxs = [tgt_dict.index(token) for token in spelling] + assert ( + tgt_dict.unk() not in spelling_idxs + ), f"{spelling} {spelling_idxs}" + self.trie.insert(spelling_idxs, word_idx, score) + self.trie.smear(SmearingMode.MAX) + + self.decoder_opts = LexiconDecoderOptions( + beam_size=args.beam, + beam_size_token=int(getattr(args, "beam_size_token", len(tgt_dict))), + beam_threshold=args.beam_threshold, + lm_weight=args.lm_weight, + word_score=args.word_score, + unk_score=args.unk_weight, + sil_score=args.sil_weight, + log_add=False, + criterion_type=self.criterion_type, + ) + + self.decoder = LexiconDecoder( + self.decoder_opts, + self.trie, + self.lm, + self.silence, + self.blank, + self.unk_word, + [], + self.unit_lm, + ) + else: + assert args.unit_lm, "lexicon free decoding can only be done with a unit language model" + from flashlight.lib.text.decoder import LexiconFreeDecoder, LexiconFreeDecoderOptions + + d = {w: [[w]] for w in tgt_dict.symbols} + self.word_dict = create_word_dict(d) + self.lm = KenLM(args.kenlm_model, self.word_dict) + self.decoder_opts = LexiconFreeDecoderOptions( + beam_size=args.beam, + beam_size_token=int(getattr(args, "beam_size_token", len(tgt_dict))), + beam_threshold=args.beam_threshold, + lm_weight=args.lm_weight, + sil_score=args.sil_weight, + log_add=False, + criterion_type=self.criterion_type, + ) + self.decoder = LexiconFreeDecoder( + self.decoder_opts, self.lm, self.silence, self.blank, [] + ) + + def decode(self, emissions): + B, T, N = emissions.size() + hypos = [] + + def idx_to_word(idx): + if self.unit_lm: + return self.idx_to_wrd[idx] + else: + return self.word_dict[idx] + + def make_hypo(result): + hypo = {"tokens": self.get_tokens(result.tokens), "score": result.score} + if self.lexicon: + hypo["words"] = [idx_to_word(x) for x in result.words if x >= 0] + return hypo + + for b in range(B): + emissions_ptr = emissions.data_ptr() + 4 * b * emissions.stride(0) + results = self.decoder.decode(emissions_ptr, T, N) + + nbest_results = results[: self.nbest] + hypos.append([make_hypo(result) for result in nbest_results]) + self.lm.empty_cache() + + return hypos diff --git a/SpeechT5/fairseq/examples/speech_to_text/README.md b/SpeechT5/fairseq/examples/speech_to_text/README.md new file mode 100644 index 0000000..f639d30 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/README.md @@ -0,0 +1,77 @@ +# Speech-to-Text (S2T) Modeling + +[https://www.aclweb.org/anthology/2020.aacl-demo.6](https://www.aclweb.org/anthology/2020.aacl-demo.6.pdf) + +Speech recognition (ASR) and speech-to-text translation (ST) with fairseq. + +## Data Preparation +S2T modeling data consists of source speech features, target text and other optional information +(source text, speaker id, etc.). Fairseq S2T uses per-dataset-split TSV manifest files +to store these information. Each data field is represented by a column in the TSV file. + +Unlike text token embeddings, speech features (e.g. log mel-scale filter banks) are usually fixed +during model training and can be pre-computed. The manifest file contains the path to +either the feature file in NumPy format or the WAV/FLAC audio file. For the latter, +features will be extracted on-the-fly by fairseq S2T. Optionally, feature/audio files can be packed +into uncompressed ZIP files (then accessed via byte offset and length) to improve I/O performance. + +Fairseq S2T also employs a YAML file for data related configurations: tokenizer type and dictionary path +for the target text, feature transforms such as CMVN (cepstral mean and variance normalization) and SpecAugment, +temperature-based resampling, etc. + +## Model Training +Fairseq S2T uses the unified `fairseq-train` interface for model training. It requires arguments `--task speech_to_text`, + `--arch <model architecture in fairseq.models.speech_to_text.*>` and `--config-yaml <config YAML filename>`. + +## Inference & Evaluation +Fairseq S2T uses the unified `fairseq-generate`/`fairseq-interactive` interface for inference and evaluation. It +requires arguments `--task speech_to_text` and `--config-yaml <config YAML filename>`. The interactive console takes +audio paths (one per line) as inputs. + + +## Examples +- [Speech Recognition (ASR) on LibriSpeech](docs/librispeech_example.md) + +- [Speech-to-Text Translation (ST) on MuST-C](docs/mustc_example.md) + +- [Speech-to-Text Translation (ST) on CoVoST 2](docs/covost_example.md) + +- [Speech-to-Text Translation (ST) on Multilingual TEDx](docs/mtedx_example.md) +- [Simultaneous Speech-to-Text Translation (SimulST) on MuST-C](docs/simulst_mustc_example.md) + +## Updates +- 02/04/2021: Added interactive decoding (`fairseq-interactive`) support. Examples: + [ASR (LibriSpeech)](docs/librispeech_example.md#interactive-decoding) + and [ST (CoVoST 2)](docs/covost_example.md#interactive-decoding). +- 01/08/2021: Several fixes for S2T Transformer model, inference-time de-tokenization, scorer configuration and data + preparation scripts. We also add pre-trained models to the examples and revise the instructions. + Breaking changes: the data preparation scripts now extract filterbank features without CMVN. CMVN is instead applied + on-the-fly (defined in the config YAML). + +## What's Next +- We are migrating the old fairseq [ASR example](../speech_recognition) into this S2T framework and + merging the features from both sides. +- The following papers also base their experiments on fairseq S2T. We are adding more examples for replication. + - [Improving Cross-Lingual Transfer Learning for End-to-End Speech Recognition with Speech Translation (Wang et al., 2020)](https://arxiv.org/abs/2006.05474) + - [Self-Supervised Representations Improve End-to-End Speech Translation (Wu et al., 2020)](https://arxiv.org/abs/2006.12124) + - [Self-Training for End-to-End Speech Translation (Pino et al., 2020)](https://arxiv.org/abs/2006.02490) + - [CoVoST: A Diverse Multilingual Speech-To-Text Translation Corpus (Wang et al., 2020)](https://arxiv.org/abs/2002.01320) + - [Harnessing Indirect Training Data for End-to-End Automatic Speech Translation: Tricks of the Trade (Pino et al., 2019)](https://arxiv.org/abs/1909.06515) + +## Citation +Please cite as: +``` +@inproceedings{wang2020fairseqs2t, + title = {fairseq S2T: Fast Speech-to-Text Modeling with fairseq}, + author = {Changhan Wang and Yun Tang and Xutai Ma and Anne Wu and Dmytro Okhonko and Juan Pino}, + booktitle = {Proceedings of the 2020 Conference of the Asian Chapter of the Association for Computational Linguistics (AACL): System Demonstrations}, + year = {2020}, +} + +@inproceedings{ott2019fairseq, + title = {fairseq: A Fast, Extensible Toolkit for Sequence Modeling}, + author = {Myle Ott and Sergey Edunov and Alexei Baevski and Angela Fan and Sam Gross and Nathan Ng and David Grangier and Michael Auli}, + booktitle = {Proceedings of NAACL-HLT 2019: Demonstrations}, + year = {2019}, +} +``` diff --git a/SpeechT5/fairseq/examples/speech_to_text/data_utils.py b/SpeechT5/fairseq/examples/speech_to_text/data_utils.py new file mode 100644 index 0000000..2bcff04 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/data_utils.py @@ -0,0 +1,339 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import csv +from pathlib import Path +import zipfile +from functools import reduce +from multiprocessing import cpu_count +from typing import Any, Dict, List, Optional, Union + +import numpy as np +import pandas as pd +import sentencepiece as sp +from fairseq.data.audio.audio_utils import ( + _convert_to_mono, _get_kaldi_fbank, _get_torchaudio_fbank +) +import torch +from tqdm import tqdm + + +UNK_TOKEN, UNK_TOKEN_ID = "<unk>", 3 +BOS_TOKEN, BOS_TOKEN_ID = "<s>", 0 +EOS_TOKEN, EOS_TOKEN_ID = "</s>", 2 +PAD_TOKEN, PAD_TOKEN_ID = "<pad>", 1 + + +def gen_vocab( + input_path: Path, output_path_prefix: Path, model_type="bpe", + vocab_size=1000, special_symbols: Optional[List[str]] = None +): + # Train SentencePiece Model + arguments = [ + f"--input={input_path.as_posix()}", + f"--model_prefix={output_path_prefix.as_posix()}", + f"--model_type={model_type}", + f"--vocab_size={vocab_size}", + "--character_coverage=1.0", + f"--num_threads={cpu_count()}", + f"--unk_id={UNK_TOKEN_ID}", + f"--bos_id={BOS_TOKEN_ID}", + f"--eos_id={EOS_TOKEN_ID}", + f"--pad_id={PAD_TOKEN_ID}", + ] + if special_symbols is not None: + _special_symbols = ",".join(special_symbols) + arguments.append(f"--user_defined_symbols={_special_symbols}") + sp.SentencePieceTrainer.Train(" ".join(arguments)) + # Export fairseq dictionary + spm = sp.SentencePieceProcessor() + spm.Load(output_path_prefix.as_posix() + ".model") + vocab = {i: spm.IdToPiece(i) for i in range(spm.GetPieceSize())} + assert ( + vocab.get(UNK_TOKEN_ID) == UNK_TOKEN + and vocab.get(PAD_TOKEN_ID) == PAD_TOKEN + and vocab.get(BOS_TOKEN_ID) == BOS_TOKEN + and vocab.get(EOS_TOKEN_ID) == EOS_TOKEN + ) + vocab = { + i: s + for i, s in vocab.items() + if s not in {UNK_TOKEN, BOS_TOKEN, EOS_TOKEN, PAD_TOKEN} + } + with open(output_path_prefix.as_posix() + ".txt", "w") as f_out: + for _, s in sorted(vocab.items(), key=lambda x: x[0]): + f_out.write(f"{s} 1\n") + + +def extract_fbank_features( + waveform: torch.FloatTensor, + sample_rate: int, + output_path: Optional[Path] = None, + n_mel_bins: int = 80, + overwrite: bool = False, +): + if output_path is not None and output_path.is_file() and not overwrite: + return + + _waveform = _convert_to_mono(waveform, sample_rate) + _waveform = _waveform * (2 ** 15) # Kaldi compliance: 16-bit signed integers + _waveform = _waveform.numpy() + + features = _get_kaldi_fbank(_waveform, sample_rate, n_mel_bins) + if features is None: + features = _get_torchaudio_fbank(_waveform, sample_rate, n_mel_bins) + if features is None: + raise ImportError( + "Please install pyKaldi or torchaudio to enable fbank feature extraction" + ) + + if output_path is not None: + np.save(output_path.as_posix(), features) + else: + return features + + +def create_zip(data_root: Path, zip_path: Path): + paths = list(data_root.glob("*.npy")) + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_STORED) as f: + for path in tqdm(paths): + f.write(path, arcname=path.name) + + +def is_npy_data(data: bytes) -> bool: + return data[0] == 147 and data[1] == 78 + + +def get_zip_manifest(zip_path: Path, zip_root: Optional[Path] = None): + _zip_path = zip_path if zip_root is None else Path.joinpath(zip_root, zip_path) + with zipfile.ZipFile(_zip_path, mode="r") as f: + info = f.infolist() + manifest = {} + for i in tqdm(info): + utt_id = Path(i.filename).stem + offset, file_size = i.header_offset + 30 + len(i.filename), i.file_size + manifest[utt_id] = f"{zip_path.as_posix()}:{offset}:{file_size}" + with open(_zip_path, "rb") as f: + f.seek(offset) + data = f.read(file_size) + assert len(data) > 1 and is_npy_data(data) + return manifest + + +def gen_config_yaml( + manifest_root: Path, + spm_filename: str, + yaml_filename: str = "config.yaml", + specaugment_policy: str = "lb", + prepend_tgt_lang_tag: bool = False, + sampling_alpha: float = 1.0, + audio_root: str = "", + cmvn_type: str = "utterance", + gcmvn_path: Optional[Path] = None, +): + manifest_root = manifest_root.absolute() + writer = S2TDataConfigWriter(manifest_root / yaml_filename) + writer.set_vocab_filename(spm_filename.replace(".model", ".txt")) + writer.set_input_channels(1) + writer.set_input_feat_per_channel(80) + specaugment_setters = { + "lb": writer.set_specaugment_lb_policy, + "ld": writer.set_specaugment_ld_policy, + "sm": writer.set_specaugment_sm_policy, + "ss": writer.set_specaugment_ss_policy, + } + specaugment_setter = specaugment_setters.get(specaugment_policy, None) + if specaugment_setter is not None: + specaugment_setter() + writer.set_bpe_tokenizer( + { + "bpe": "sentencepiece", + "sentencepiece_model": (manifest_root / spm_filename).as_posix(), + } + ) + if prepend_tgt_lang_tag: + writer.set_prepend_tgt_lang_tag(True) + writer.set_sampling_alpha(sampling_alpha) + + if cmvn_type not in ["global", "utterance"]: + raise NotImplementedError + + writer.set_feature_transforms("_train", [f"{cmvn_type}_cmvn", "specaugment"]) + writer.set_feature_transforms("*", [f"{cmvn_type}_cmvn"]) + + if cmvn_type == "global": + assert gcmvn_path is not None, ( + 'Please provide path of global cmvn file.' + ) + writer.set_global_cmvn(str(gcmvn_path)) + + if len(audio_root) > 0: + writer.set_audio_root(audio_root) + writer.flush() + + +def load_df_from_tsv(path: Union[str, Path]): + _path = path if isinstance(path, str) else path.as_posix() + return pd.read_csv( + _path, + sep="\t", + header=0, + encoding="utf-8", + escapechar="\\", + quoting=csv.QUOTE_NONE, + na_filter=False, + ) + + +def save_df_to_tsv(dataframe, path: Union[str, Path]): + _path = path if isinstance(path, str) else path.as_posix() + dataframe.to_csv( + _path, + sep="\t", + header=True, + index=False, + encoding="utf-8", + escapechar="\\", + quoting=csv.QUOTE_NONE, + ) + + +def filter_manifest_df( + df, is_train_split=False, extra_filters=None, min_n_frames=5, max_n_frames=3000 +): + filters = { + "no speech": df["audio"] == "", + f"short speech (<{min_n_frames} frames)": df["n_frames"] < min_n_frames, + "empty sentence": df["tgt_text"] == "", + } + if is_train_split: + filters[f"long speech (>{max_n_frames} frames)"] = df["n_frames"] > max_n_frames + if extra_filters is not None: + filters.update(extra_filters) + invalid = reduce(lambda x, y: x | y, filters.values()) + valid = ~invalid + print( + "| " + + ", ".join(f"{n}: {f.sum()}" for n, f in filters.items()) + + f", total {invalid.sum()} filtered, {valid.sum()} remained." + ) + return df[valid] + + +def cal_gcmvn_stats(features_list): + features = np.concatenate(features_list) + square_sums = (features ** 2).sum(axis=0) + mean = features.mean(axis=0) + features = np.subtract(features, mean) + var = square_sums / features.shape[0] - mean ** 2 + std = np.sqrt(np.maximum(var, 1e-8)) + return {"mean": mean.astype("float32"), "std": std.astype("float32")} + + +class S2TDataConfigWriter(object): + DEFAULT_VOCAB_FILENAME = "dict.txt" + DEFAULT_INPUT_FEAT_PER_CHANNEL = 80 + DEFAULT_INPUT_CHANNELS = 1 + + def __init__(self, yaml_path: Path): + try: + import yaml + except ImportError: + print("Please install PyYAML for S2T data config YAML files") + self.yaml = yaml + self.yaml_path = yaml_path + self.config = {} + + def flush(self): + with open(self.yaml_path, "w") as f: + self.yaml.dump(self.config, f) + + def set_audio_root(self, audio_root=""): + self.config["audio_root"] = audio_root + + def set_vocab_filename(self, vocab_filename: str = "dict.txt"): + self.config["vocab_filename"] = vocab_filename + + def set_specaugment( + self, + time_wrap_w: int, + freq_mask_n: int, + freq_mask_f: int, + time_mask_n: int, + time_mask_t: int, + time_mask_p: float, + ): + self.config["specaugment"] = { + "time_wrap_W": time_wrap_w, + "freq_mask_N": freq_mask_n, + "freq_mask_F": freq_mask_f, + "time_mask_N": time_mask_n, + "time_mask_T": time_mask_t, + "time_mask_p": time_mask_p, + } + + def set_specaugment_lb_policy(self): + self.set_specaugment( + time_wrap_w=0, + freq_mask_n=1, + freq_mask_f=27, + time_mask_n=1, + time_mask_t=100, + time_mask_p=1.0, + ) + + def set_specaugment_ld_policy(self): + self.set_specaugment( + time_wrap_w=0, + freq_mask_n=2, + freq_mask_f=27, + time_mask_n=2, + time_mask_t=100, + time_mask_p=1.0, + ) + + def set_specaugment_sm_policy(self): + self.set_specaugment( + time_wrap_w=0, + freq_mask_n=2, + freq_mask_f=15, + time_mask_n=2, + time_mask_t=70, + time_mask_p=0.2, + ) + + def set_specaugment_ss_policy(self): + self.set_specaugment( + time_wrap_w=0, + freq_mask_n=2, + freq_mask_f=27, + time_mask_n=2, + time_mask_t=70, + time_mask_p=0.2, + ) + + def set_input_channels(self, input_channels: int = 1): + self.config["input_channels"] = input_channels + + def set_input_feat_per_channel(self, input_feat_per_channel: int = 80): + self.config["input_feat_per_channel"] = input_feat_per_channel + + def set_bpe_tokenizer(self, bpe_tokenizer: Dict[str, Any]): + self.config["bpe_tokenizer"] = bpe_tokenizer + + def set_global_cmvn(self, stats_npz_path: str): + self.config["global_cmvn"] = {"stats_npz_path": stats_npz_path} + + def set_feature_transforms(self, split: str, transforms: List[str]): + if "transforms" not in self.config: + self.config["transforms"] = {} + self.config["transforms"][split] = transforms + + def set_prepend_tgt_lang_tag(self, flag: bool = True): + self.config["prepend_tgt_lang_tag"] = flag + + def set_sampling_alpha(self, sampling_alpha: float = 1.0): + self.config["sampling_alpha"] = sampling_alpha diff --git a/SpeechT5/fairseq/examples/speech_to_text/docs/covost_example.md b/SpeechT5/fairseq/examples/speech_to_text/docs/covost_example.md new file mode 100644 index 0000000..16447f0 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/docs/covost_example.md @@ -0,0 +1,102 @@ +[[Back]](..) + +# S2T Example: ST on CoVoST +We replicate the experiments in +[CoVoST 2 and Massively Multilingual Speech-to-Text Translation (Wang et al., 2020)](https://arxiv.org/abs/2007.10310). + +## Data Preparation +[Download](https://commonvoice.mozilla.org/en/datasets) and unpack Common Voice v4 to a path +`${COVOST_ROOT}/${SOURCE_LANG_ID}`, then preprocess it with +```bash +# additional Python packages for S2T data processing/model training +pip install pandas torchaudio sentencepiece + +# En ASR +python examples/speech_to_text/prep_covost_data.py \ + --data-root ${COVOST_ROOT} --vocab-type char --src-lang en +# ST +python examples/speech_to_text/prep_covost_data.py \ + --data-root ${COVOST_ROOT} --vocab-type char \ + --src-lang fr --tgt-lang en +``` +The generated files (manifest, features, vocabulary and data configuration) will be added to +`${COVOST_ROOT}/${SOURCE_LANG_ID}`. + +Download our vocabulary files if you want to use our pre-trained models: +- ASR: [En](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_asr_vocab_char.zip) +- ST: [Fr-En](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_fr_en_st_vocab_char.zip), [De-En](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_de_en_st_vocab_char.zip), [Es-En](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_es_en_st_vocab_char.zip), [Ca-En](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_ca_en_st_vocab_char.zip), [En-De](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_de_st_vocab_char.zip), [En-Ca](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_ca_st_vocab_char.zip), [En-Fa](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_fa_st_vocab_char.zip), [En-Et](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_et_st_vocab_char.zip) + +## ASR +#### Training +We train an En ASR model for encoder pre-training of all ST models: +```bash +fairseq-train ${COVOST_ROOT}/en \ + --config-yaml config_asr_en.yaml --train-subset train_asr_en --valid-subset dev_asr_en \ + --save-dir ${ASR_SAVE_DIR} --num-workers 4 --max-tokens 50000 --max-update 60000 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --report-accuracy --arch s2t_transformer_s --dropout 0.15 --optimizer adam --lr 2e-3 \ + --lr-scheduler inverse_sqrt --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8 +``` +where `ASR_SAVE_DIR` is the checkpoint root path. We set `--update-freq 8` to simulate 8 GPUs with 1 GPU. +You may want to update it accordingly when using more than 1 GPU. + +#### Inference & Evaluation +```bash +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py \ + --inputs ${ASR_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME}" +fairseq-generate ${COVOST_ROOT}/en \ + --config-yaml config_asr_en.yaml --gen-subset test_asr_en --task speech_to_text \ + --path ${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} --max-tokens 50000 --beam 5 \ + --scoring wer --wer-tokenizer 13a --wer-lowercase --wer-remove-punct +``` +#### Results +| --arch | Params | En | Model | +|---|---|---|---| +| s2t_transformer_s | 31M | 25.6 | [Download](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_asr_transformer_s.pt) | + +## ST +#### Training +Fr-En as example: +```bash +fairseq-train ${COVOST_ROOT}/fr \ + --config-yaml config_st_fr_en.yaml --train-subset train_st_fr_en --valid-subset dev_st_fr_en \ + --save-dir ${ST_SAVE_DIR} --num-workers 4 --max-update 30000 --max-tokens 40000 \ # --max-tokens 50000 for en-* + --task speech_to_text --criterion label_smoothed_cross_entropy --label-smoothing 0.1 --report-accuracy \ + --arch s2t_transformer_s --encoder-freezing-updates 1000 --optimizer adam --lr 2e-3 \ + --lr-scheduler inverse_sqrt --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8 \ + --load-pretrained-encoder-from ${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} +``` +where `ST_SAVE_DIR` is the checkpoint root path. The ST encoder is pre-trained by En ASR for faster training and better +performance: `--load-pretrained-encoder-from <ASR checkpoint path>`. We set `--update-freq 8` to simulate 8 GPUs with 1 GPU. +You may want to update it accordingly when using more than 1 GPU. + +#### Inference & Evaluation +Average the last 10 checkpoints and evaluate on test split: +```bash +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py \ + --inputs ${ST_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${ST_SAVE_DIR}/${CHECKPOINT_FILENAME}" +fairseq-generate ${COVOST_ROOT}/fr \ + --config-yaml config_st_fr_en.yaml --gen-subset test_st_fr_en --task speech_to_text \ + --path ${ST_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 50000 --beam 5 --scoring sacrebleu +``` + +## Interactive Decoding +Launch the interactive console via +```bash +fairseq-interactive ${COVOST_ROOT}/fr --config-yaml config_st_fr_en.yaml \ + --task speech_to_text --path ${SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 50000 --beam 5 +``` +Type in WAV/FLAC/OGG audio paths (one per line) after the prompt. + +#### Results +| --arch | Params | Fr-En | De-En | Es-En | Ca-En | En-De | En-Ca | En-Fa | En-Et | Model | +|---|---|---|---|---|---|---|---|---|---|---| +| s2t_transformer_s | 31M | [27.2](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_fr_en_st_transformer_s.pt) | [17.7](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_de_en_st_transformer_s.pt) | [23.1](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_es_en_st_transformer_s.pt) | [19.3](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_ca_en_st_transformer_s.pt) | [16.1](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_de_st_transformer_s.pt) | [21.6](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_ca_st_transformer_s.pt) | [12.9](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_fa_st_transformer_s.pt) | [12.8](https://dl.fbaipublicfiles.com/fairseq/s2t/covost2_en_et_st_transformer_s.pt) | (<-Download) | + +[[Back]](..) diff --git a/SpeechT5/fairseq/examples/speech_to_text/docs/librispeech_example.md b/SpeechT5/fairseq/examples/speech_to_text/docs/librispeech_example.md new file mode 100644 index 0000000..4040fda --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/docs/librispeech_example.md @@ -0,0 +1,69 @@ +[[Back]](..) + +# S2T Example: Speech Recognition (ASR) on LibriSpeech +[LibriSpeech](https://www.danielpovey.com/files/2015_icassp_librispeech.pdf) is a de-facto standard English ASR +benchmark. We provide competitive +vanilla [Transformer](https://papers.nips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf) baselines. + +## Data preparation +Download and preprocess LibriSpeech data with +```bash +# additional Python packages for S2T data processing/model training +pip install pandas torchaudio sentencepiece + +python examples/speech_to_text/prep_librispeech_data.py \ + --output-root ${LS_ROOT} --vocab-type unigram --vocab-size 10000 +``` +where `LS_ROOT` is the root path for downloaded data as well as generated files (manifest, features, vocabulary and +data configuration). + +[Download](https://dl.fbaipublicfiles.com/fairseq/s2t/librispeech_vocab_unigram10000.zip) our vocabulary files +if you want to use our pre-trained models. + +## Training +```bash +fairseq-train ${LS_ROOT} --save-dir ${SAVE_DIR} \ + --config-yaml config.yaml --train-subset train-clean-100,train-clean-360,train-other-500 --valid-subset dev-clean,dev-other \ + --num-workers 4 --max-tokens 40000 --max-update 300000 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --label-smoothing 0.1 --report-accuracy \ + --arch s2t_transformer_s --share-decoder-input-output-embed \ + --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt --warmup-updates 10000 \ + --clip-norm 10.0 --seed 1 --update-freq 8 +``` +where `SAVE_DIR` is the checkpoint root path. Here we use `--arch s2t_transformer_s` (31M parameters) as example. +For better performance, you may switch to `s2t_transformer_m` (71M, with `--lr 1e-3`) or `s2t_transformer_l` +(268M, with `--lr 5e-4`). We set `--update-freq 8` to simulate 8 GPUs with 1 GPU. You may want to update it accordingly +when using more than 1 GPU. + +## Inference & Evaluation +Average the last 10 checkpoints and evaluate on the 4 splits +(`dev-clean`, `dev-other`, `test-clean` and `test-other`): +```bash +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py --inputs ${SAVE_DIR} \ + --num-epoch-checkpoints 10 \ + --output "${SAVE_DIR}/${CHECKPOINT_FILENAME}" +for SUBSET in dev-clean dev-other test-clean test-other; do + fairseq-generate ${LS_ROOT} --config-yaml config.yaml --gen-subset ${SUBSET} \ + --task speech_to_text --path ${SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 50000 --beam 5 --scoring wer +done +``` + +## Interactive Decoding +Launch the interactive console via +```bash +fairseq-interactive ${LS_ROOT} --config-yaml config.yaml --task speech_to_text \ + --path ${SAVE_DIR}/${CHECKPOINT_FILENAME} --max-tokens 50000 --beam 5 +``` +Type in WAV/FLAC/OGG audio paths (one per line) after the prompt. + +## Results + +| --arch | Params | dev-clean | dev-other | test-clean | test-other | Model | +|---|---|---|---|---|---|---| +| s2t_transformer_s | 30M | 3.8 | 8.9 | 4.4 | 9.0 | [Download](https://dl.fbaipublicfiles.com/fairseq/s2t/librispeech_transformer_s.pt) | +| s2t_transformer_m | 71M | 3.2 | 8.0 | 3.4 | 7.9 | [Download](https://dl.fbaipublicfiles.com/fairseq/s2t/librispeech_transformer_m.pt) | +| s2t_transformer_l | 268M | 3.0 | 7.5 | 3.2 | 7.5 | [Download](https://dl.fbaipublicfiles.com/fairseq/s2t/librispeech_transformer_l.pt) | + +[[Back]](..) diff --git a/SpeechT5/fairseq/examples/speech_to_text/docs/mtedx_example.md b/SpeechT5/fairseq/examples/speech_to_text/docs/mtedx_example.md new file mode 100644 index 0000000..25b4556 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/docs/mtedx_example.md @@ -0,0 +1,200 @@ +[[Back]](..) + +# S2T Example: Speech Translation (ST) on Multilingual TEDx + +[Multilingual TEDx](https://arxiv.org/abs/2102.01757) is multilingual corpus for speech recognition and +speech translation. The data is derived from TEDx talks in 8 source languages +with translations to a subset of 5 target languages. + +## Data Preparation +[Download](http://openslr.org/100/) and unpack Multilingual TEDx data to a path +`${MTEDX_ROOT}/${LANG_PAIR}`, then preprocess it with +```bash +# additional Python packages for S2T data processing/model training +pip install pandas torchaudio soundfile sentencepiece + +# Generate TSV manifests, features, vocabulary +# and configuration for each language +python examples/speech_to_text/prep_mtedx_data.py \ + --data-root ${MTEDX_ROOT} --task asr \ + --vocab-type unigram --vocab-size 1000 +python examples/speech_to_text/prep_mtedx_data.py \ + --data-root ${MTEDX_ROOT} --task st \ + --vocab-type unigram --vocab-size 1000 + +# Add vocabulary and configuration for joint data +# (based on the manifests and features generated above) +python examples/speech_to_text/prep_mtedx_data.py \ + --data-root ${MTEDX_ROOT} --task asr --joint \ + --vocab-type unigram --vocab-size 8000 +python examples/speech_to_text/prep_mtedx_data.py \ + --data-root ${MTEDX_ROOT} --task st --joint \ + --vocab-type unigram --vocab-size 8000 +``` +The generated files (manifest, features, vocabulary and data configuration) will be added to +`${MTEDX_ROOT}/${LANG_PAIR}` (per-language data) and `MTEDX_ROOT` (joint data). + + +## ASR +#### Training +Spanish as example: +```bash +fairseq-train ${MTEDX_ROOT}/es-es \ + --config-yaml config_asr.yaml --train-subset train_asr --valid-subset valid_asr \ + --save-dir ${ASR_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-epoch 200 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --report-accuracy \ + --arch s2t_transformer_xs --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --dropout 0.3 --label-smoothing 0.1 \ + --load-pretrained-encoder-from ${PRETRAINED_ENCODER} \ + --skip-invalid-size-inputs-valid-test \ + --keep-last-epochs 10 --update-freq 8 --patience 10 +``` +For joint model (using ASR data from all 8 languages): +```bash +fairseq-train ${MTEDX_ROOT} \ + --config-yaml config_asr.yaml \ + --train-subset train_es-es_asr,train_fr-fr_asr,train_pt-pt_asr,train_it-it_asr,train_ru-ru_asr,train_el-el_asr,train_ar-ar_asr,train_de-de_asr \ + --valid-subset valid_es-es_asr,valid_fr-fr_asr,valid_pt-pt_asr,valid_it-it_asr,valid_ru-ru_asr,valid_el-el_asr,valid_ar-ar_asr,valid_de-de_asr \ + --save-dir ${MULTILINGUAL_ASR_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-epoch 200 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --report-accuracy \ + --arch s2t_transformer_s --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --dropout 0.3 --label-smoothing 0.1 \ + --skip-invalid-size-inputs-valid-test \ + --keep-last-epochs 10 --update-freq 8 --patience 10 \ + --ignore-prefix-size 1 +``` +where `MULTILINGUAL_ASR_SAVE_DIR` is the checkpoint root path. We set `--update-freq 8` to simulate 8 GPUs +with 1 GPU. You may want to update it accordingly when using more than 1 GPU. +For multilingual models, we prepend target language ID token as target BOS, which should be excluded from +the training loss via `--ignore-prefix-size 1`. + +#### Inference & Evaluation +```bash +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py \ + --inputs ${ASR_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME}" + +fairseq-generate ${MTEDX_ROOT}/es-es \ + --config-yaml config_asr.yaml --gen-subset test --task speech_to_text \ + --path ${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} --max-tokens 50000 --beam 5 \ + --skip-invalid-size-inputs-valid-test \ + --scoring wer --wer-tokenizer 13a --wer-lowercase --wer-remove-punct --remove-bpe + +# For models trained on joint data +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py \ + --inputs ${MULTILINGUAL_ASR_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${MULTILINGUAL_ASR_SAVE_DIR}/${CHECKPOINT_FILENAME}" + +for LANG in es fr pt it ru el ar de; do + fairseq-generate ${MTEDX_ROOT} \ + --config-yaml config_asr.yaml --gen-subset test_${LANG}-${LANG}_asr --task speech_to_text \ + --prefix-size 1 --path ${MULTILINGUAL_ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 40000 --beam 5 \ + --skip-invalid-size-inputs-valid-test \ + --scoring wer --wer-tokenizer 13a --wer-lowercase --wer-remove-punct --remove-bpe +done +``` +#### Results +| Data | --arch | Params | Es | Fr | Pt | It | Ru | El | Ar | De | +|--------------|--------------------|--------|------|------|------|------|------|-------|-------|-------| +| Monolingual | s2t_transformer_xs | 10M | 46.4 | 45.6 | 54.8 | 48.0 | 74.7 | 109.5 | 104.4 | 111.1 | + + +## ST +#### Training +Es-En as example: +```bash +fairseq-train ${MTEDX_ROOT}/es-en \ + --config-yaml config_st.yaml --train-subset train_st --valid-subset valid_st \ + --save-dir ${ST_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-epoch 200 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --report-accuracy \ + --arch s2t_transformer_xs --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --dropout 0.3 --label-smoothing 0.1 \ + --load-pretrained-encoder-from ${PRETRAINED_ENCODER} \ + --skip-invalid-size-inputs-valid-test \ + --keep-last-epochs 10 --update-freq 8 --patience 10 +``` +For multilingual model (all 12 directions): +```bash +fairseq-train ${MTEDX_ROOT} \ + --config-yaml config_st.yaml \ + --train-subset train_el-en_st,train_es-en_st,train_es-fr_st,train_es-it_st,train_es-pt_st,train_fr-en_st,train_fr-es_st,train_fr-pt_st,train_it-en_st,train_it-es_st,train_pt-en_st,train_pt-es_st,train_ru-en_st \ + --valid-subset valid_el-en_st,valid_es-en_st,valid_es-fr_st,valid_es-it_st,valid_es-pt_st,valid_fr-en_st,valid_fr-es_st,valid_fr-pt_st,valid_it-en_st,valid_it-es_st,valid_pt-en_st,valid_pt-es_st,valid_ru-en_st \ + --save-dir ${MULTILINGUAL_ST_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-epoch 200 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --report-accuracy \ + --arch s2t_transformer_s --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --dropout 0.3 --label-smoothing 0.1 \ + --skip-invalid-size-inputs-valid-test \ + --keep-last-epochs 10 --update-freq 8 --patience 10 \ + --ignore-prefix-size 1 \ + --load-pretrained-encoder-from ${PRETRAINED_ENCODER} +``` +where `ST_SAVE_DIR` (`MULTILINGUAL_ST_SAVE_DIR`) is the checkpoint root path. The ST encoder is pre-trained by ASR +for faster training and better performance: `--load-pretrained-encoder-from <(JOINT_)ASR checkpoint path>`. We set +`--update-freq 8` to simulate 8 GPUs with 1 GPU. You may want to update it accordingly when using more than 1 GPU. +For multilingual models, we prepend target language ID token as target BOS, which should be excluded from +the training loss via `--ignore-prefix-size 1`. + +#### Inference & Evaluation +Average the last 10 checkpoints and evaluate on the `test` split: +```bash +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py \ + --inputs ${ST_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${ST_SAVE_DIR}/${CHECKPOINT_FILENAME}" + +fairseq-generate ${MTEDX_ROOT}/es-en \ + --config-yaml config_st.yaml --gen-subset test --task speech_to_text \ + --path ${ST_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 50000 --beam 5 --scoring sacrebleu --remove-bpe + +# For multilingual models +python scripts/average_checkpoints.py \ + --inputs ${MULTILINGUAL_ST_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${MULTILINGUAL_ST_SAVE_DIR}/${CHECKPOINT_FILENAME}" + +for LANGPAIR in es-en es-fr es-pt fr-en fr-es fr-pt pt-en pt-es it-en it-es ru-en el-en; do + fairseq-generate ${MTEDX_ROOT} \ + --config-yaml config_st.yaml --gen-subset test_${LANGPAIR}_st --task speech_to_text \ + --prefix-size 1 --path ${MULTILINGUAL_ST_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 40000 --beam 5 \ + --skip-invalid-size-inputs-valid-test \ + --scoring sacrebleu --remove-bpe +done +``` +For multilingual models, we force decoding from the target language ID token (as BOS) via `--prefix-size 1`. + +#### Results +| Data | --arch | Params | Es-En | Es-Pt | Es-Fr | Fr-En | Fr-Es | Fr-Pt | Pt-En | Pt-Es | It-En | It-Es | Ru-En | El-En | +|--------------|--------------------|-----|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------| +| Bilingual | s2t_transformer_xs | 10M | 7.0 | 12.2 | 1.7 | 8.9 | 10.6 | 7.9 | 8.1 | 8.7 | 6.4 | 1.0 | 0.7 | 0.6 | +| Multilingual | s2t_transformer_s | 31M | 12.3 | 17.4 | 6.1 | 12.0 | 13.6 | 13.2 | 12.0 | 13.7 | 10.7 | 13.1 | 0.6 | 0.8 | + + +## Citation +Please cite as: +``` +@misc{salesky2021mtedx, + title={Multilingual TEDx Corpus for Speech Recognition and Translation}, + author={Elizabeth Salesky and Matthew Wiesner and Jacob Bremerman and Roldano Cattoni and Matteo Negri and Marco Turchi and Douglas W. Oard and Matt Post}, + year={2021}, +} + +@inproceedings{wang2020fairseqs2t, + title = {fairseq S2T: Fast Speech-to-Text Modeling with fairseq}, + author = {Changhan Wang and Yun Tang and Xutai Ma and Anne Wu and Dmytro Okhonko and Juan Pino}, + booktitle = {Proceedings of the 2020 Conference of the Asian Chapter of the Association for Computational Linguistics (AACL): System Demonstrations}, + year = {2020}, +} + +@inproceedings{ott2019fairseq, + title = {fairseq: A Fast, Extensible Toolkit for Sequence Modeling}, + author = {Myle Ott and Sergey Edunov and Alexei Baevski and Angela Fan and Sam Gross and Nathan Ng and David Grangier and Michael Auli}, + booktitle = {Proceedings of NAACL-HLT 2019: Demonstrations}, + year = {2019}, +} +``` + +[[Back]](..) diff --git a/SpeechT5/fairseq/examples/speech_to_text/docs/mustc_example.md b/SpeechT5/fairseq/examples/speech_to_text/docs/mustc_example.md new file mode 100644 index 0000000..c95ef3e --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/docs/mustc_example.md @@ -0,0 +1,155 @@ +[[Back]](..) + +# S2T Example: Speech Translation (ST) on MuST-C + +[MuST-C](https://www.aclweb.org/anthology/N19-1202) is multilingual speech-to-text translation corpus with +8-language translations on English TED talks. We match the state-of-the-art performance in +[ESPNet-ST](https://arxiv.org/pdf/2004.10234.pdf) with a simpler model training pipeline. + +## Data Preparation +[Download](https://ict.fbk.eu/must-c) and unpack MuST-C data to a path +`${MUSTC_ROOT}/en-${TARGET_LANG_ID}`, then preprocess it with +```bash +# additional Python packages for S2T data processing/model training +pip install pandas torchaudio soundfile sentencepiece + +# Generate TSV manifests, features, vocabulary +# and configuration for each language +python examples/speech_to_text/prep_mustc_data.py \ + --data-root ${MUSTC_ROOT} --task asr \ + --vocab-type unigram --vocab-size 5000 +python examples/speech_to_text/prep_mustc_data.py \ + --data-root ${MUSTC_ROOT} --task st \ + --vocab-type unigram --vocab-size 8000 + +# Add vocabulary and configuration for joint data +# (based on the manifests and features generated above) +python examples/speech_to_text/prep_mustc_data.py \ + --data-root ${MUSTC_ROOT} --task asr --joint \ + --vocab-type unigram --vocab-size 10000 +python examples/speech_to_text/prep_mustc_data.py \ + --data-root ${MUSTC_ROOT} --task st --joint \ + --vocab-type unigram --vocab-size 10000 +``` +The generated files (manifest, features, vocabulary and data configuration) will be added to +`${MUSTC_ROOT}/en-${TARGET_LANG_ID}` (per-language data) and `MUSTC_ROOT` (joint data). + +Download our vocabulary files if you want to use our pre-trained models: +- ASR: [En-De](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_de_asr_vocab_unigram5000.zip), [En-Nl](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_nl_asr_vocab_unigram5000.zip), [En-Es](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_es_asr_vocab_unigram5000.zip), [En-Fr](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_fr_asr_vocab_unigram5000.zip), [En-It](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_it_asr_vocab_unigram5000.zip), [En-Pt](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_pt_asr_vocab_unigram5000.zip), [En-Ro](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ro_asr_vocab_unigram5000.zip), [En-Ru](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ru_asr_vocab_unigram5000.zip), [Joint](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_joint_asr_vocab_unigram10000.zip) +- ST: [En-De](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_de_st_vocab_unigram8000.zip), [En-Nl](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_nl_st_vocab_unigram8000.zip), [En-Es](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_es_st_vocab_unigram8000.zip), [En-Fr](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_fr_st_vocab_unigram8000.zip), [En-It](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_it_st_vocab_unigram8000.zip), [En-Pt](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_pt_st_vocab_unigram8000.zip), [En-Ro](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ro_st_vocab_unigram8000.zip), [En-Ru](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ru_st_vocab_unigram8000.zip), [Multilingual](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_multilingual_st_vocab_unigram10000.zip) + +## ASR +#### Training +En-De as example: +```bash +fairseq-train ${MUSTC_ROOT}/en-de \ + --config-yaml config_asr.yaml --train-subset train_asr --valid-subset dev_asr \ + --save-dir ${ASR_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-update 100000 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --label-smoothing 0.1 --report-accuracy \ + --arch s2t_transformer_s --optimizer adam --lr 1e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8 +``` +For joint model (using ASR data from all 8 directions): +```bash +fairseq-train ${MUSTC_ROOT} \ + --config-yaml config_asr.yaml \ + --train-subset train_de_asr,train_nl_asr,train_es_asr,train_fr_asr,train_it_asr,train_pt_asr,train_ro_asr,train_ru_asr \ + --valid-subset dev_de_asr,dev_nl_asr,dev_es_asr,dev_fr_asr,dev_it_asr,dev_pt_asr,dev_ro_asr,dev_ru_asr \ + --save-dir ${JOINT_ASR_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-update 100000 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --label-smoothing 0.1 --report-accuracy \ + --arch s2t_transformer_s --optimizer adam --lr 1e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8 +``` +where `ASR_SAVE_DIR` (`JOINT_ASR_SAVE_DIR`) is the checkpoint root path. We set `--update-freq 8` to simulate 8 GPUs +with 1 GPU. You may want to update it accordingly when using more than 1 GPU. + +#### Inference & Evaluation +```bash +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py \ + --inputs ${ASR_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME}" +fairseq-generate ${MUSTC_ROOT}/en-de \ + --config-yaml config_asr.yaml --gen-subset tst-COMMON_asr --task speech_to_text \ + --path ${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} --max-tokens 50000 --beam 5 \ + --scoring wer --wer-tokenizer 13a --wer-lowercase --wer-remove-punct + +# For models trained on joint data +python scripts/average_checkpoints.py \ + --inputs ${JOINT_ASR_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${JOINT_ASR_SAVE_DIR}/${CHECKPOINT_FILENAME}" +for LANG in de nl es fr it pt ro ru; do + fairseq-generate ${MUSTC_ROOT} \ + --config-yaml config_asr.yaml --gen-subset tst-COMMON_${LANG}_asr --task speech_to_text \ + --path ${JOINT_ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} --max-tokens 50000 --beam 5 \ + --scoring wer --wer-tokenizer 13a --wer-lowercase --wer-remove-punct +done +``` +#### Results +| Data | --arch | Params | En-De | En-Nl | En-Es | En-Fr | En-It | En-Pt | En-Ro | En-Ru | Model | +|---|---|---|---|---|---|---|---|---|---|---|---| +| Single | s2t_transformer_s | 31M | [18.2](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_de_asr_transformer_s.pt) | [17.6](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_nl_asr_transformer_s.pt) | [17.7](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_es_asr_transformer_s.pt) | [17.2](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_fr_asr_transformer_s.pt) | [17.9](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_it_asr_transformer_s.pt) | [19.1](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_pt_asr_transformer_s.pt) | [18.1](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ro_asr_transformer_s.pt) | [17.7](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ru_asr_transformer_s.pt) | (<-Download) | +| Joint | s2t_transformer_m | 76M | 16.8 | 16.7 | 16.9 | 16.9 | 17.0 | 17.4 | 17.0 | 16.9 | [Download](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_joint_asr_transformer_m.pt) | + +## ST +#### Training +En-De as example: +```bash +fairseq-train ${MUSTC_ROOT}/en-de \ + --config-yaml config_st.yaml --train-subset train_st --valid-subset dev_st \ + --save-dir ${ST_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-update 100000 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --label-smoothing 0.1 --report-accuracy \ + --arch s2t_transformer_s --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8 \ + --load-pretrained-encoder-from ${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} +``` +For multilingual model (all 8 directions): +```bash +fairseq-train ${MUSTC_ROOT} \ + --config-yaml config_st.yaml \ + --train-subset train_de_st,train_nl_st,train_es_st,train_fr_st,train_it_st,train_pt_st,train_ro_st,train_ru_st \ + --valid-subset dev_de_st,dev_nl_st,dev_es_st,dev_fr_st,dev_it_st,dev_pt_st,dev_ro_st,dev_ru_st \ + --save-dir ${MULTILINGUAL_ST_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-update 100000 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --label-smoothing 0.1 --report-accuracy \ + --arch s2t_transformer_s --ignore-prefix-size 1 --optimizer adam --lr 2e-3 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8 \ + --load-pretrained-encoder-from ${JOINT_ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} +``` +where `ST_SAVE_DIR` (`MULTILINGUAL_ST_SAVE_DIR`) is the checkpoint root path. The ST encoder is pre-trained by ASR +for faster training and better performance: `--load-pretrained-encoder-from <(JOINT_)ASR checkpoint path>`. We set +`--update-freq 8` to simulate 8 GPUs with 1 GPU. You may want to update it accordingly when using more than 1 GPU. +For multilingual models, we prepend target language ID token as target BOS, which should be excluded from +the training loss via `--ignore-prefix-size 1`. + +#### Inference & Evaluation +Average the last 10 checkpoints and evaluate on the `tst-COMMON` split: +```bash +CHECKPOINT_FILENAME=avg_last_10_checkpoint.pt +python scripts/average_checkpoints.py \ + --inputs ${ST_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${ST_SAVE_DIR}/${CHECKPOINT_FILENAME}" +fairseq-generate ${MUSTC_ROOT}/en-de \ + --config-yaml config_st.yaml --gen-subset tst-COMMON_st --task speech_to_text \ + --path ${ST_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 50000 --beam 5 --scoring sacrebleu + +# For multilingual models +python scripts/average_checkpoints.py \ + --inputs ${MULTILINGUAL_ST_SAVE_DIR} --num-epoch-checkpoints 10 \ + --output "${MULTILINGUAL_ST_SAVE_DIR}/${CHECKPOINT_FILENAME}" +for LANG in de nl es fr it pt ro ru; do + fairseq-generate ${MUSTC_ROOT} \ + --config-yaml config_st.yaml --gen-subset tst-COMMON_${LANG}_st --task speech_to_text \ + --prefix-size 1 --path ${MULTILINGUAL_ST_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --max-tokens 50000 --beam 5 --scoring sacrebleu +done +``` +For multilingual models, we force decoding from the target language ID token (as BOS) via `--prefix-size 1`. + +#### Results +| Data | --arch | Params | En-De | En-Nl | En-Es | En-Fr | En-It | En-Pt | En-Ro | En-Ru | Model | +|---|---|---|---|---|---|---|---|---|---|---|---| +| Bilingual | s2t_transformer_s | 31M | [22.7](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_de_st_transformer_s.pt) | [27.3](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_nl_st_transformer_s.pt) | [27.2](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_es_st_transformer_s.pt) | [32.9](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_fr_st_transformer_s.pt) | [22.7](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_it_st_transformer_s.pt) | [28.1](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_pt_st_transformer_s.pt) | [21.9](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ro_st_transformer_s.pt) | [15.3](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_ru_st_transformer_s.pt) | (<-Download) | +| Multilingual | s2t_transformer_m | 76M | 24.5 | 28.6 | 28.2 | 34.9 | 24.6 | 31.1 | 23.8 | 16.0 | [Download](https://dl.fbaipublicfiles.com/fairseq/s2t/mustc_multilingual_st_transformer_m.pt) | + +[[Back]](..) diff --git a/SpeechT5/fairseq/examples/speech_to_text/docs/simulst_mustc_example.md b/SpeechT5/fairseq/examples/speech_to_text/docs/simulst_mustc_example.md new file mode 100644 index 0000000..52ca9ac --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/docs/simulst_mustc_example.md @@ -0,0 +1,190 @@ +# Simultaneous Speech Translation (SimulST) on MuST-C + +This is a tutorial of training and evaluating a transformer *wait-k* simultaneous model on MUST-C English-Germen Dataset, from [SimulMT to SimulST: Adapting Simultaneous Text Translation to End-to-End Simultaneous Speech Translation](https://www.aclweb.org/anthology/2020.aacl-main.58.pdf). + +[MuST-C](https://www.aclweb.org/anthology/N19-1202) is multilingual speech-to-text translation corpus with 8-language translations on English TED talks. + +## Data Preparation +This section introduces the data preparation for training and evaluation. +If you only want to evaluate the model, please jump to [Inference & Evaluation](#inference-&-evaluation) + +[Download](https://ict.fbk.eu/must-c) and unpack MuST-C data to a path +`${MUSTC_ROOT}/en-${TARGET_LANG_ID}`, then preprocess it with +```bash +# Additional Python packages for S2T data processing/model training +pip install pandas torchaudio sentencepiece + +# Generate TSV manifests, features, vocabulary, +# global cepstral and mean estimation, +# and configuration for each language +cd fairseq + +python examples/speech_to_text/prep_mustc_data.py \ + --data-root ${MUSTC_ROOT} --task asr \ + --vocab-type unigram --vocab-size 10000 \ + --cmvn-type global + +python examples/speech_to_text/prep_mustc_data.py \ + --data-root ${MUSTC_ROOT} --task st \ + --vocab-type unigram --vocab-size 10000 \ + --cmvn-type global +``` + +## ASR Pretraining +We need a pretrained offline ASR model. Assuming the save directory of the ASR model is `${ASR_SAVE_DIR}`. +The following command (and the subsequent training commands in this tutorial) assume training on 1 GPU (you can also train on 8 GPUs and remove the `--update-freq 8` option). +``` +fairseq-train ${MUSTC_ROOT}/en-de \ + --config-yaml config_asr.yaml --train-subset train_asr --valid-subset dev_asr \ + --save-dir ${ASR_SAVE_DIR} --num-workers 4 --max-tokens 40000 --max-update 100000 \ + --task speech_to_text --criterion label_smoothed_cross_entropy --report-accuracy \ + --arch convtransformer_espnet --optimizer adam --lr 0.0005 --lr-scheduler inverse_sqrt \ + --warmup-updates 10000 --clip-norm 10.0 --seed 1 --update-freq 8 +``` +A pretrained ASR checkpoint can be downloaded [here](https://dl.fbaipublicfiles.com/simultaneous_translation/must_c_v1_en_de_pretrained_asr) + +## Simultaneous Speech Translation Training + +### Wait-K with fixed pre-decision module +Fixed pre-decision indicates that the model operate simultaneous policy on the boundaries of fixed chunks. +Here is a example of fixed pre-decision ratio 7 (the simultaneous decision is made every 7 encoder states) and +a wait-3 policy model. Assuming the save directory is `${ST_SAVE_DIR}` +```bash + fairseq-train ${MUSTC_ROOT}/en-de \ + --config-yaml config_st.yaml --train-subset train_st --valid-subset dev_st \ + --save-dir ${ST_SAVE_DIR} --num-workers 8 \ + --optimizer adam --lr 0.0001 --lr-scheduler inverse_sqrt --clip-norm 10.0 \ + --criterion label_smoothed_cross_entropy \ + --warmup-updates 4000 --max-update 100000 --max-tokens 40000 --seed 2 \ + --load-pretrained-encoder-from ${ASR_SAVE_DIR}/checkpoint_best.pt \ + --task speech_to_text \ + --arch convtransformer_simul_trans_espnet \ + --simul-type waitk_fixed_pre_decision \ + --waitk-lagging 3 \ + --fixed-pre-decision-ratio 7 \ + --update-freq 8 + +``` +### Monotonic multihead attention with fixed pre-decision module +``` + fairseq-train ${MUSTC_ROOT}/en-de \ + --config-yaml config_st.yaml --train-subset train_st --valid-subset dev_st \ + --save-dir ${ST_SAVE_DIR} --num-workers 8 \ + --optimizer adam --lr 0.0001 --lr-scheduler inverse_sqrt --clip-norm 10.0 \ + --warmup-updates 4000 --max-update 100000 --max-tokens 40000 --seed 2 \ + --load-pretrained-encoder-from ${ASR_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --task speech_to_text \ + --criterion latency_augmented_label_smoothed_cross_entropy \ + --latency-weight-avg 0.1 \ + --arch convtransformer_simul_trans_espnet \ + --simul-type infinite_lookback_fixed_pre_decision \ + --fixed-pre-decision-ratio 7 \ + --update-freq 8 +``` +## Inference & Evaluation +[SimulEval](https://github.com/facebookresearch/SimulEval) is used for evaluation. +The following command is for evaluation. + +``` +git clone https://github.com/facebookresearch/SimulEval.git +cd SimulEval +pip install -e . + +simuleval \ + --agent ${FAIRSEQ}/examples/speech_to_text/simultaneous_translation/agents/fairseq_simul_st_agent.py + --source ${SRC_LIST_OF_AUDIO} + --target ${TGT_FILE} + --data-bin ${MUSTC_ROOT}/en-de \ + --config config_st.yaml \ + --model-path ${ST_SAVE_DIR}/${CHECKPOINT_FILENAME} \ + --output ${OUTPUT} \ + --scores +``` + +The source file `${SRC_LIST_OF_AUDIO}` is a list of paths of audio files. Assuming your audio files stored at `/home/user/data`, +it should look like this + +```bash +/home/user/data/audio-1.wav +/home/user/data/audio-2.wav +``` + +Each line of target file `${TGT_FILE}` is the translation for each audio file input. +```bash +Translation_1 +Translation_2 +``` +The evaluation runs on the original MUSTC segmentation. +The following command will generate the wav list and text file for a evaluation set `${SPLIT}` (chose from `dev`, `tst-COMMON` and `tst-HE`) in MUSTC to `${EVAL_DATA}`. +```bash +python ${FAIRSEQ}/examples/speech_to_text/seg_mustc_data.py \ + --data-root ${MUSTC_ROOT} --lang de \ + --split ${SPLIT} --task st \ + --output ${EVAL_DATA} +``` + +The `--data-bin` and `--config` should be the same in previous section if you prepare the data from the scratch. +If only for evaluation, a prepared data directory can be found [here](https://dl.fbaipublicfiles.com/simultaneous_translation/must_c_v1.0_en_de_databin.tgz). It contains +- `spm_unigram10000_st.model`: a sentencepiece model binary. +- `spm_unigram10000_st.txt`: the dictionary file generated by the sentencepiece model. +- `gcmvn.npz`: the binary for global cepstral mean and variance. +- `config_st.yaml`: the config yaml file. It looks like this. +You will need to set the absolute paths for `sentencepiece_model` and `stats_npz_path` if the data directory is downloaded. +```yaml +bpe_tokenizer: + bpe: sentencepiece + sentencepiece_model: ABS_PATH_TO_SENTENCEPIECE_MODEL +global_cmvn: + stats_npz_path: ABS_PATH_TO_GCMVN_FILE +input_channels: 1 +input_feat_per_channel: 80 +sampling_alpha: 1.0 +specaugment: + freq_mask_F: 27 + freq_mask_N: 1 + time_mask_N: 1 + time_mask_T: 100 + time_mask_p: 1.0 + time_wrap_W: 0 +transforms: + '*': + - global_cmvn + _train: + - global_cmvn + - specaugment +vocab_filename: spm_unigram10000_st.txt +``` + +Notice that once a `--data-bin` is set, the `--config` is the base name of the config yaml, not the full path. + +Set `--model-path` to the model checkpoint. +A pretrained checkpoint can be downloaded from [here](https://dl.fbaipublicfiles.com/simultaneous_translation/convtransformer_wait5_pre7), which is a wait-5 model with a pre-decision of 280 ms. + +The result of this model on `tst-COMMON` is: +```bash +{ + "Quality": { + "BLEU": 13.94974229366959 + }, + "Latency": { + "AL": 1751.8031870037803, + "AL_CA": 2338.5911762796536, + "AP": 0.7931395378788959, + "AP_CA": 0.9405103863210942, + "DAL": 1987.7811616943081, + "DAL_CA": 2425.2751560926167 + } +} +``` + +If `--output ${OUTPUT}` option is used, the detailed log and scores will be stored under the `${OUTPUT}` directory. + + +The quality is measured by detokenized BLEU. So make sure that the predicted words sent to the server are detokenized. + +The latency metrics are +* Average Proportion +* Average Lagging +* Differentiable Average Lagging + +Again they will also be evaluated on detokenized text. diff --git a/SpeechT5/fairseq/examples/speech_to_text/prep_covost_data.py b/SpeechT5/fairseq/examples/speech_to_text/prep_covost_data.py new file mode 100644 index 0000000..af1d3fc --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/prep_covost_data.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import logging +from pathlib import Path +import shutil +from tempfile import NamedTemporaryFile +from typing import Optional, Tuple + +import pandas as pd +import torchaudio +from examples.speech_to_text.data_utils import ( + create_zip, + extract_fbank_features, + filter_manifest_df, + gen_config_yaml, + gen_vocab, + get_zip_manifest, + load_df_from_tsv, + save_df_to_tsv, +) +from torch import Tensor +from torch.utils.data import Dataset +from torchaudio.datasets.utils import download_url, extract_archive +from tqdm import tqdm + + +log = logging.getLogger(__name__) + + +MANIFEST_COLUMNS = ["id", "audio", "n_frames", "tgt_text", "speaker"] + + +class CoVoST(Dataset): + """Create a Dataset for CoVoST (https://github.com/facebookresearch/covost). + + Args: + root (str): root path to the dataset and generated manifests/features + source_language (str): source (audio) language + target_language (str, optional): target (text) language, + None for no translation (default: None) + version (int, optional): CoVoST version. (default: 2) + download (bool, optional): Whether to download the dataset if it is not + found at root path. (default: ``False``). + """ + + COVOST_URL_TEMPLATE = ( + "https://dl.fbaipublicfiles.com/covost/" + "covost_v2.{src_lang}_{tgt_lang}.tsv.tar.gz" + ) + + VERSIONS = {2} + SPLITS = ["train", "dev", "test"] + + XX_EN_LANGUAGES = { + 1: ["fr", "de", "nl", "ru", "es", "it", "tr", "fa", "sv-SE", "mn", "zh-CN"], + 2: [ + "fr", + "de", + "es", + "ca", + "it", + "ru", + "zh-CN", + "pt", + "fa", + "et", + "mn", + "nl", + "tr", + "ar", + "sv-SE", + "lv", + "sl", + "ta", + "ja", + "id", + "cy", + ], + } + EN_XX_LANGUAGES = { + 1: [], + 2: [ + "de", + "tr", + "fa", + "sv-SE", + "mn", + "zh-CN", + "cy", + "ca", + "sl", + "et", + "id", + "ar", + "ta", + "lv", + "ja", + ], + } + + def __init__( + self, + root: str, + split: str, + source_language: str, + target_language: Optional[str] = None, + version: int = 2, + ) -> None: + assert version in self.VERSIONS and split in self.SPLITS + assert source_language is not None + self.no_translation = target_language is None + if not self.no_translation: + assert "en" in {source_language, target_language} + if source_language == "en": + assert target_language in self.EN_XX_LANGUAGES[version] + else: + assert source_language in self.XX_EN_LANGUAGES[version] + else: + # Hack here so that we can get "split" column from CoVoST TSV. + # Note that we use CoVoST train split for ASR which is an extension + # to Common Voice train split. + target_language = "de" if source_language == "en" else "en" + + self.root: Path = Path(root) + + cv_tsv_path = self.root / "validated.tsv" + assert cv_tsv_path.is_file() + + covost_url = self.COVOST_URL_TEMPLATE.format( + src_lang=source_language, tgt_lang=target_language + ) + covost_archive = self.root / Path(covost_url).name + if not covost_archive.is_file(): + download_url(covost_url, self.root.as_posix(), hash_value=None) + extract_archive(covost_archive.as_posix()) + + cv_tsv = load_df_from_tsv(cv_tsv_path) + covost_tsv = load_df_from_tsv( + self.root / Path(covost_url).name.replace(".tar.gz", "") + ) + df = pd.merge( + left=cv_tsv[["path", "sentence", "client_id"]], + right=covost_tsv[["path", "translation", "split"]], + how="inner", + on="path", + ) + if split == "train": + df = df[(df["split"] == split) | (df["split"] == f"{split}_covost")] + else: + df = df[df["split"] == split] + data = df.to_dict(orient="index").items() + data = [v for k, v in sorted(data, key=lambda x: x[0])] + self.data = [] + for e in data: + try: + path = self.root / "clips" / e["path"] + _ = torchaudio.info(path.as_posix()) + self.data.append(e) + except RuntimeError: + pass + + def __getitem__( + self, n: int + ) -> Tuple[Tensor, int, str, str, Optional[str], str, str]: + """Load the n-th sample from the dataset. + + Args: + n (int): The index of the sample to be loaded + + Returns: + tuple: ``(waveform, sample_rate, sentence, translation, speaker_id, + sample_id)`` + """ + data = self.data[n] + path = self.root / "clips" / data["path"] + waveform, sample_rate = torchaudio.load(path) + sentence = data["sentence"] + translation = None if self.no_translation else data["translation"] + speaker_id = data["client_id"] + _id = data["path"].replace(".mp3", "") + return waveform, sample_rate, sentence, translation, speaker_id, _id + + def __len__(self) -> int: + return len(self.data) + + +def process(args): + root = Path(args.data_root).absolute() / args.src_lang + if not root.is_dir(): + raise NotADirectoryError(f"{root} does not exist") + # Extract features + feature_root = root / "fbank80" + feature_root.mkdir(exist_ok=True) + for split in CoVoST.SPLITS: + print(f"Fetching split {split}...") + dataset = CoVoST(root, split, args.src_lang, args.tgt_lang) + print("Extracting log mel filter bank features...") + for waveform, sample_rate, _, _, _, utt_id in tqdm(dataset): + extract_fbank_features( + waveform, sample_rate, feature_root / f"{utt_id}.npy" + ) + # Pack features into ZIP + zip_path = root / "fbank80.zip" + print("ZIPing features...") + create_zip(feature_root, zip_path) + print("Fetching ZIP manifest...") + zip_manifest = get_zip_manifest(zip_path) + # Generate TSV manifest + print("Generating manifest...") + train_text = [] + task = f"asr_{args.src_lang}" + if args.tgt_lang is not None: + task = f"st_{args.src_lang}_{args.tgt_lang}" + for split in CoVoST.SPLITS: + manifest = {c: [] for c in MANIFEST_COLUMNS} + dataset = CoVoST(root, split, args.src_lang, args.tgt_lang) + for wav, sr, src_utt, tgt_utt, speaker_id, utt_id in tqdm(dataset): + manifest["id"].append(utt_id) + manifest["audio"].append(zip_manifest[utt_id]) + duration_ms = int(wav.size(1) / sr * 1000) + manifest["n_frames"].append(int(1 + (duration_ms - 25) / 10)) + manifest["tgt_text"].append(src_utt if args.tgt_lang is None else tgt_utt) + manifest["speaker"].append(speaker_id) + is_train_split = split.startswith("train") + if is_train_split: + train_text.extend(manifest["tgt_text"]) + df = pd.DataFrame.from_dict(manifest) + df = filter_manifest_df(df, is_train_split=is_train_split) + save_df_to_tsv(df, root / f"{split}_{task}.tsv") + # Generate vocab + vocab_size_str = "" if args.vocab_type == "char" else str(args.vocab_size) + spm_filename_prefix = f"spm_{args.vocab_type}{vocab_size_str}_{task}" + with NamedTemporaryFile(mode="w") as f: + for t in train_text: + f.write(t + "\n") + gen_vocab( + Path(f.name), + root / spm_filename_prefix, + args.vocab_type, + args.vocab_size + ) + # Generate config YAML + gen_config_yaml( + root, + spm_filename_prefix + ".model", + yaml_filename=f"config_{task}.yaml", + specaugment_policy="lb", + ) + # Clean up + shutil.rmtree(feature_root) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--data-root", "-d", required=True, type=str, + help="data root with sub-folders for each language <root>/<src_lang>" + ) + parser.add_argument( + "--vocab-type", + default="unigram", + required=True, + type=str, + choices=["bpe", "unigram", "char"], + ), + parser.add_argument("--vocab-size", default=1000, type=int) + parser.add_argument("--src-lang", "-s", required=True, type=str) + parser.add_argument("--tgt-lang", "-t", type=str) + args = parser.parse_args() + + process(args) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/speech_to_text/prep_librispeech_data.py b/SpeechT5/fairseq/examples/speech_to_text/prep_librispeech_data.py new file mode 100644 index 0000000..7b08447 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/prep_librispeech_data.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import logging +from pathlib import Path +import shutil +from tempfile import NamedTemporaryFile + +import pandas as pd +from examples.speech_to_text.data_utils import ( + create_zip, + extract_fbank_features, + gen_config_yaml, + gen_vocab, + get_zip_manifest, + save_df_to_tsv, +) +from torchaudio.datasets import LIBRISPEECH +from tqdm import tqdm + + +log = logging.getLogger(__name__) + +SPLITS = [ + "train-clean-100", + "train-clean-360", + "train-other-500", + "dev-clean", + "dev-other", + "test-clean", + "test-other", +] + +MANIFEST_COLUMNS = ["id", "audio", "n_frames", "tgt_text", "speaker"] + + +def process(args): + out_root = Path(args.output_root).absolute() + out_root.mkdir(exist_ok=True) + # Extract features + feature_root = out_root / "fbank80" + feature_root.mkdir(exist_ok=True) + for split in SPLITS: + print(f"Fetching split {split}...") + dataset = LIBRISPEECH(out_root.as_posix(), url=split, download=True) + print("Extracting log mel filter bank features...") + for wav, sample_rate, _, spk_id, chapter_no, utt_no in tqdm(dataset): + sample_id = f"{spk_id}-{chapter_no}-{utt_no}" + extract_fbank_features( + wav, sample_rate, feature_root / f"{sample_id}.npy" + ) + # Pack features into ZIP + zip_path = out_root / "fbank80.zip" + print("ZIPing features...") + create_zip(feature_root, zip_path) + print("Fetching ZIP manifest...") + zip_manifest = get_zip_manifest(zip_path) + # Generate TSV manifest + print("Generating manifest...") + train_text = [] + for split in SPLITS: + manifest = {c: [] for c in MANIFEST_COLUMNS} + dataset = LIBRISPEECH(out_root.as_posix(), url=split) + for wav, sample_rate, utt, spk_id, chapter_no, utt_no in tqdm(dataset): + sample_id = f"{spk_id}-{chapter_no}-{utt_no}" + manifest["id"].append(sample_id) + manifest["audio"].append(zip_manifest[sample_id]) + duration_ms = int(wav.size(1) / sample_rate * 1000) + manifest["n_frames"].append(int(1 + (duration_ms - 25) / 10)) + manifest["tgt_text"].append(utt.lower()) + manifest["speaker"].append(spk_id) + save_df_to_tsv( + pd.DataFrame.from_dict(manifest), out_root / f"{split}.tsv" + ) + if split.startswith("train"): + train_text.extend(manifest["tgt_text"]) + # Generate vocab + vocab_size = "" if args.vocab_type == "char" else str(args.vocab_size) + spm_filename_prefix = f"spm_{args.vocab_type}{vocab_size}" + with NamedTemporaryFile(mode="w") as f: + for t in train_text: + f.write(t + "\n") + gen_vocab( + Path(f.name), + out_root / spm_filename_prefix, + args.vocab_type, + args.vocab_size, + ) + # Generate config YAML + gen_config_yaml( + out_root, spm_filename_prefix + ".model", specaugment_policy="ld" + ) + # Clean up + shutil.rmtree(feature_root) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--output-root", "-o", required=True, type=str) + parser.add_argument( + "--vocab-type", + default="unigram", + required=True, + type=str, + choices=["bpe", "unigram", "char"], + ), + parser.add_argument("--vocab-size", default=10000, type=int) + args = parser.parse_args() + + process(args) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/speech_to_text/prep_mtedx_data.py b/SpeechT5/fairseq/examples/speech_to_text/prep_mtedx_data.py new file mode 100644 index 0000000..34b1c39 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/prep_mtedx_data.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import logging +import os +from pathlib import Path +import shutil +from itertools import groupby +from tempfile import NamedTemporaryFile +from typing import Tuple + +import pandas as pd +import soundfile as sf +from examples.speech_to_text.data_utils import ( + create_zip, + extract_fbank_features, + filter_manifest_df, + gen_config_yaml, + gen_vocab, + get_zip_manifest, + load_df_from_tsv, + save_df_to_tsv, +) +import torch +from torch.utils.data import Dataset +from tqdm import tqdm + +from fairseq.data.audio.audio_utils import get_waveform + + +log = logging.getLogger(__name__) + + +MANIFEST_COLUMNS = ["id", "audio", "n_frames", "tgt_text", "speaker", "tgt_lang"] + + +class mTEDx(Dataset): + """ + Create a Dataset for Multilingual TEDx. + Each item is a tuple of the form: waveform, sample_rate, source utterance, + target utterance, speaker_id, utterance_id + """ + + SPLITS = ["train", "valid", "test"] + LANGPAIRS = ["es-es", "fr-fr", "pt-pt", "it-it", "ru-ru", "el-el", "ar-ar", "de-de", + "es-en", "es-fr", "es-pt", "es-it", "fr-en", "fr-es", "fr-pt", + "pt-en", "pt-es", "it-en", "it-es", "ru-en", "el-en"] + + def __init__(self, root: str, lang: str, split: str) -> None: + assert split in self.SPLITS and lang in self.LANGPAIRS + _root = Path(root) / f"{lang}" / "data" / split + wav_root, txt_root = _root / "wav", _root / "txt" + assert _root.is_dir() and wav_root.is_dir() and txt_root.is_dir() + # Load audio segments + try: + import yaml + except ImportError: + print("Please install PyYAML to load the Multilingual TEDx YAML files") + with open(txt_root / f"{split}.yaml") as f: + segments = yaml.load(f, Loader=yaml.BaseLoader) + # Load source and target utterances + src, tgt = lang.split("-") + for _lang in [src, tgt]: + with open(txt_root / f"{split}.{_lang}") as f: + utterances = [r.strip() for r in f] + assert len(segments) == len(utterances) + for i, u in enumerate(utterances): + segments[i][_lang] = u + # Gather info + self.data = [] + for wav_filename, _seg_group in groupby(segments, lambda x: x["wav"]): + wav_filename = wav_filename.replace(".wav", ".flac") + wav_path = wav_root / wav_filename + sample_rate = sf.info(wav_path.as_posix()).samplerate + seg_group = sorted(_seg_group, key=lambda x: float(x["offset"])) + for i, segment in enumerate(seg_group): + offset = int(float(segment["offset"]) * sample_rate) + n_frames = int(float(segment["duration"]) * sample_rate) + _id = f"{wav_path.stem}_{i}" + self.data.append( + ( + wav_path.as_posix(), + offset, + n_frames, + sample_rate, + segment[src], + segment[tgt], + segment["speaker_id"], + tgt, + _id, + ) + ) + + def __getitem__(self, n: int) -> Tuple[torch.Tensor, int, str, str, str, str, str]: + wav_path, offset, n_frames, sr, src_utt, tgt_utt, spk_id, tgt_lang, utt_id = self.data[n] + waveform, _ = get_waveform(wav_path, frames=n_frames, start=offset) + waveform = torch.from_numpy(waveform) + return waveform, sr, src_utt, tgt_utt, spk_id, tgt_lang, utt_id + + def __len__(self) -> int: + return len(self.data) + + +def process(args): + root = Path(args.data_root).absolute() + for lang in mTEDx.LANGPAIRS: + cur_root = root / f"{lang}" + if not cur_root.is_dir(): + print(f"{cur_root.as_posix()} does not exist. Skipped.") + continue + # Extract features + feature_root = cur_root / "fbank80" + feature_root.mkdir(exist_ok=True) + for split in mTEDx.SPLITS: + print(f"Fetching split {split}...") + dataset = mTEDx(root.as_posix(), lang, split) + print("Extracting log mel filter bank features...") + for waveform, sample_rate, _, _, _, _, utt_id in tqdm(dataset): + extract_fbank_features( + waveform, sample_rate, feature_root / f"{utt_id}.npy" + ) + # Pack features into ZIP + zip_path = cur_root / "fbank80.zip" + print("ZIPing features...") + create_zip(feature_root, zip_path) + print("Fetching ZIP manifest...") + zip_manifest = get_zip_manifest(zip_path) + # Generate TSV manifest + print("Generating manifest...") + train_text = [] + for split in mTEDx.SPLITS: + is_train_split = split.startswith("train") + manifest = {c: [] for c in MANIFEST_COLUMNS} + dataset = mTEDx(args.data_root, lang, split) + for wav, sr, src_utt, tgt_utt, speaker_id, tgt_lang, utt_id in tqdm(dataset): + manifest["id"].append(utt_id) + manifest["audio"].append(zip_manifest[utt_id]) + duration_ms = int(wav.size(1) / sr * 1000) + manifest["n_frames"].append(int(1 + (duration_ms - 25) / 10)) + manifest["tgt_text"].append(src_utt if args.task == "asr" else tgt_utt) + manifest["speaker"].append(speaker_id) + manifest["tgt_lang"].append(tgt_lang) + if is_train_split: + train_text.extend(manifest["tgt_text"]) + df = pd.DataFrame.from_dict(manifest) + df = filter_manifest_df(df, is_train_split=is_train_split) + save_df_to_tsv(df, cur_root / f"{split}_{args.task}.tsv") + # Generate vocab + v_size_str = "" if args.vocab_type == "char" else str(args.vocab_size) + spm_filename_prefix = f"spm_{args.vocab_type}{v_size_str}_{args.task}" + with NamedTemporaryFile(mode="w") as f: + for t in train_text: + f.write(t + "\n") + gen_vocab( + Path(f.name), + cur_root / spm_filename_prefix, + args.vocab_type, + args.vocab_size, + ) + # Generate config YAML + gen_config_yaml( + cur_root, + spm_filename_prefix + ".model", + yaml_filename=f"config_{args.task}.yaml", + specaugment_policy="lb", + ) + # Clean up + shutil.rmtree(feature_root) + + +def process_joint(args): + cur_root = Path(args.data_root) + assert all((cur_root / f"{lang}").is_dir() for lang in mTEDx.LANGPAIRS), \ + "do not have downloaded data available for all languages" + # Generate vocab + vocab_size_str = "" if args.vocab_type == "char" else str(args.vocab_size) + spm_filename_prefix = f"spm_{args.vocab_type}{vocab_size_str}_{args.task}" + with NamedTemporaryFile(mode="w") as f: + for lang in mTEDx.LANGPAIRS: + tsv_path = cur_root / f"{lang}" / f"train_{args.task}.tsv" + df = load_df_from_tsv(tsv_path) + for t in df["tgt_text"]: + f.write(t + "\n") + special_symbols = None + if args.joint: + # Add tgt_lang tags to dict + special_symbols = list({f'<lang:{lang.split("-")[1]}>' for lang in mTEDx.LANGPAIRS}) + gen_vocab( + Path(f.name), + cur_root / spm_filename_prefix, + args.vocab_type, + args.vocab_size, + special_symbols=special_symbols + ) + # Generate config YAML + gen_config_yaml( + cur_root, + spm_filename_prefix + ".model", + yaml_filename=f"config_{args.task}.yaml", + specaugment_policy="ld", + prepend_tgt_lang_tag=(args.joint), + ) + # Make symbolic links to manifests + for lang in mTEDx.LANGPAIRS: + for split in mTEDx.SPLITS: + src_path = cur_root / f"{lang}" / f"{split}_{args.task}.tsv" + desc_path = cur_root / f"{split}_{lang}_{args.task}.tsv" + if not desc_path.is_symlink(): + os.symlink(src_path, desc_path) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--data-root", "-d", required=True, type=str) + parser.add_argument( + "--vocab-type", + default="unigram", + required=True, + type=str, + choices=["bpe", "unigram", "char"], + ), + parser.add_argument("--vocab-size", default=8000, type=int) + parser.add_argument("--task", type=str, choices=["asr", "st"]) + parser.add_argument("--joint", action="store_true", help="") + args = parser.parse_args() + + if args.joint: + process_joint(args) + else: + process(args) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/speech_to_text/prep_mustc_data.py b/SpeechT5/fairseq/examples/speech_to_text/prep_mustc_data.py new file mode 100644 index 0000000..0ee204e --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/prep_mustc_data.py @@ -0,0 +1,264 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import logging +import os +from pathlib import Path +import shutil +from itertools import groupby +from tempfile import NamedTemporaryFile +from typing import Tuple + +import numpy as np +import pandas as pd +import soundfile as sf +from examples.speech_to_text.data_utils import ( + create_zip, + extract_fbank_features, + filter_manifest_df, + gen_config_yaml, + gen_vocab, + get_zip_manifest, + load_df_from_tsv, + save_df_to_tsv, + cal_gcmvn_stats, +) +import torch +from torch.utils.data import Dataset +from tqdm import tqdm + +from fairseq.data.audio.audio_utils import get_waveform + + +log = logging.getLogger(__name__) + + +MANIFEST_COLUMNS = ["id", "audio", "n_frames", "tgt_text", "speaker"] + + +class MUSTC(Dataset): + """ + Create a Dataset for MuST-C. Each item is a tuple of the form: + waveform, sample_rate, source utterance, target utterance, speaker_id, + utterance_id + """ + + SPLITS = ["train", "dev", "tst-COMMON", "tst-HE"] + LANGUAGES = ["de", "es", "fr", "it", "nl", "pt", "ro", "ru"] + + def __init__(self, root: str, lang: str, split: str) -> None: + assert split in self.SPLITS and lang in self.LANGUAGES + _root = Path(root) / f"en-{lang}" / "data" / split + wav_root, txt_root = _root / "wav", _root / "txt" + assert _root.is_dir() and wav_root.is_dir() and txt_root.is_dir() + # Load audio segments + try: + import yaml + except ImportError: + print("Please install PyYAML to load the MuST-C YAML files") + with open(txt_root / f"{split}.yaml") as f: + segments = yaml.load(f, Loader=yaml.BaseLoader) + # Load source and target utterances + for _lang in ["en", lang]: + with open(txt_root / f"{split}.{_lang}") as f: + utterances = [r.strip() for r in f] + assert len(segments) == len(utterances) + for i, u in enumerate(utterances): + segments[i][_lang] = u + # Gather info + self.data = [] + for wav_filename, _seg_group in groupby(segments, lambda x: x["wav"]): + wav_path = wav_root / wav_filename + sample_rate = sf.info(wav_path.as_posix()).samplerate + seg_group = sorted(_seg_group, key=lambda x: x["offset"]) + for i, segment in enumerate(seg_group): + offset = int(float(segment["offset"]) * sample_rate) + n_frames = int(float(segment["duration"]) * sample_rate) + _id = f"{wav_path.stem}_{i}" + self.data.append( + ( + wav_path.as_posix(), + offset, + n_frames, + sample_rate, + segment["en"], + segment[lang], + segment["speaker_id"], + _id, + ) + ) + + def __getitem__(self, n: int) -> Tuple[torch.Tensor, int, str, str, str, str]: + wav_path, offset, n_frames, sr, src_utt, tgt_utt, spk_id, utt_id = self.data[n] + waveform, _ = get_waveform(wav_path, frames=n_frames, start=offset) + waveform = torch.from_numpy(waveform) + return waveform, sr, src_utt, tgt_utt, spk_id, utt_id + + def __len__(self) -> int: + return len(self.data) + + +def process(args): + root = Path(args.data_root).absolute() + for lang in MUSTC.LANGUAGES: + cur_root = root / f"en-{lang}" + if not cur_root.is_dir(): + print(f"{cur_root.as_posix()} does not exist. Skipped.") + continue + # Extract features + feature_root = cur_root / "fbank80" + feature_root.mkdir(exist_ok=True) + for split in MUSTC.SPLITS: + print(f"Fetching split {split}...") + dataset = MUSTC(root.as_posix(), lang, split) + print("Extracting log mel filter bank features...") + if split == 'train' and args.cmvn_type == "global": + print("And estimating cepstral mean and variance stats...") + gcmvn_feature_list = [] + + for waveform, sample_rate, _, _, _, utt_id in tqdm(dataset): + features = extract_fbank_features(waveform, sample_rate) + + np.save( + (feature_root / f"{utt_id}.npy").as_posix(), + features + ) + + if split == 'train' and args.cmvn_type == "global": + if len(gcmvn_feature_list) < args.gcmvn_max_num: + gcmvn_feature_list.append(features) + + if split == 'train' and args.cmvn_type == "global": + # Estimate and save cmv + stats = cal_gcmvn_stats(gcmvn_feature_list) + with open(cur_root / "gcmvn.npz", "wb") as f: + np.savez(f, mean=stats["mean"], std=stats["std"]) + + # Pack features into ZIP + zip_path = cur_root / "fbank80.zip" + print("ZIPing features...") + create_zip(feature_root, zip_path) + print("Fetching ZIP manifest...") + zip_manifest = get_zip_manifest(zip_path) + # Generate TSV manifest + print("Generating manifest...") + train_text = [] + for split in MUSTC.SPLITS: + is_train_split = split.startswith("train") + manifest = {c: [] for c in MANIFEST_COLUMNS} + dataset = MUSTC(args.data_root, lang, split) + for wav, sr, src_utt, tgt_utt, speaker_id, utt_id in tqdm(dataset): + manifest["id"].append(utt_id) + manifest["audio"].append(zip_manifest[utt_id]) + duration_ms = int(wav.size(1) / sr * 1000) + manifest["n_frames"].append(int(1 + (duration_ms - 25) / 10)) + manifest["tgt_text"].append(src_utt if args.task == "asr" else tgt_utt) + manifest["speaker"].append(speaker_id) + if is_train_split: + train_text.extend(manifest["tgt_text"]) + df = pd.DataFrame.from_dict(manifest) + df = filter_manifest_df(df, is_train_split=is_train_split) + save_df_to_tsv(df, cur_root / f"{split}_{args.task}.tsv") + # Generate vocab + v_size_str = "" if args.vocab_type == "char" else str(args.vocab_size) + spm_filename_prefix = f"spm_{args.vocab_type}{v_size_str}_{args.task}" + with NamedTemporaryFile(mode="w") as f: + for t in train_text: + f.write(t + "\n") + gen_vocab( + Path(f.name), + cur_root / spm_filename_prefix, + args.vocab_type, + args.vocab_size, + ) + # Generate config YAML + gen_config_yaml( + cur_root, + spm_filename_prefix + ".model", + yaml_filename=f"config_{args.task}.yaml", + specaugment_policy="lb", + cmvn_type=args.cmvn_type, + gcmvn_path=( + cur_root / "gcmvn.npz" if args.cmvn_type == "global" + else None + ), + ) + # Clean up + shutil.rmtree(feature_root) + + +def process_joint(args): + cur_root = Path(args.data_root) + assert all((cur_root / f"en-{lang}").is_dir() for lang in MUSTC.LANGUAGES), \ + "do not have downloaded data available for all 8 languages" + # Generate vocab + vocab_size_str = "" if args.vocab_type == "char" else str(args.vocab_size) + spm_filename_prefix = f"spm_{args.vocab_type}{vocab_size_str}_{args.task}" + with NamedTemporaryFile(mode="w") as f: + for lang in MUSTC.LANGUAGES: + tsv_path = cur_root / f"en-{lang}" / f"train_{args.task}.tsv" + df = load_df_from_tsv(tsv_path) + for t in df["tgt_text"]: + f.write(t + "\n") + special_symbols = None + if args.task == 'st': + special_symbols = [f'<lang:{lang}>' for lang in MUSTC.LANGUAGES] + gen_vocab( + Path(f.name), + cur_root / spm_filename_prefix, + args.vocab_type, + args.vocab_size, + special_symbols=special_symbols + ) + # Generate config YAML + gen_config_yaml( + cur_root, + spm_filename_prefix + ".model", + yaml_filename=f"config_{args.task}.yaml", + specaugment_policy="ld", + prepend_tgt_lang_tag=(args.task == "st"), + ) + # Make symbolic links to manifests + for lang in MUSTC.LANGUAGES: + for split in MUSTC.SPLITS: + src_path = cur_root / f"en-{lang}" / f"{split}_{args.task}.tsv" + desc_path = cur_root / f"{split}_{lang}_{args.task}.tsv" + if not desc_path.is_symlink(): + os.symlink(src_path, desc_path) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--data-root", "-d", required=True, type=str) + parser.add_argument( + "--vocab-type", + default="unigram", + required=True, + type=str, + choices=["bpe", "unigram", "char"], + ), + parser.add_argument("--vocab-size", default=8000, type=int) + parser.add_argument("--task", type=str, choices=["asr", "st"]) + parser.add_argument("--joint", action="store_true", help="") + parser.add_argument("--cmvn-type", default="utterance", + choices=["global", "utterance"], + help="The type of cepstral mean and variance normalization") + parser.add_argument("--gcmvn-max-num", default=150000, type=int, + help=( + "Maximum number of sentences to use to estimate" + "global mean and variance" + )) + args = parser.parse_args() + + if args.joint: + process_joint(args) + else: + process(args) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/speech_to_text/seg_mustc_data.py b/SpeechT5/fairseq/examples/speech_to_text/seg_mustc_data.py new file mode 100644 index 0000000..1ee665d --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/seg_mustc_data.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import logging +from pathlib import Path +import soundfile as sf +from examples.speech_to_text.prep_mustc_data import ( + MUSTC +) + +from tqdm import tqdm + +log = logging.getLogger(__name__) + + +def main(args): + root = Path(args.data_root).absolute() + lang = args.lang + split = args.split + + cur_root = root / f"en-{lang}" + assert cur_root.is_dir(), ( + f"{cur_root.as_posix()} does not exist. Skipped." + ) + + dataset = MUSTC(root.as_posix(), lang, split) + output = Path(args.output).absolute() + output.mkdir(exist_ok=True) + f_text = open(output / f"{split}.{lang}", "w") + f_wav_list = open(output / f"{split}.wav_list", "w") + for waveform, sample_rate, _, text, _, utt_id in tqdm(dataset): + sf.write( + output / f"{utt_id}.wav", + waveform.squeeze(0).numpy(), + samplerate=int(sample_rate) + ) + f_text.write(text + "\n") + f_wav_list.write(str(output / f"{utt_id}.wav") + "\n") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--data-root", "-d", required=True, type=str) + parser.add_argument("--task", required=True, type=str, choices=["asr", "st"]) + parser.add_argument("--lang", required=True, type=str) + parser.add_argument("--output", required=True, type=str) + parser.add_argument("--split", required=True, choices=MUSTC.SPLITS) + args = parser.parse_args() + + main(args) diff --git a/SpeechT5/fairseq/examples/speech_to_text/simultaneous_translation/agents/fairseq_simul_st_agent.py b/SpeechT5/fairseq/examples/speech_to_text/simultaneous_translation/agents/fairseq_simul_st_agent.py new file mode 100644 index 0000000..61617a1 --- /dev/null +++ b/SpeechT5/fairseq/examples/speech_to_text/simultaneous_translation/agents/fairseq_simul_st_agent.py @@ -0,0 +1,363 @@ +import math +import os +import json +import numpy as np +import torch +import torchaudio.compliance.kaldi as kaldi +import yaml +from fairseq import checkpoint_utils, tasks +from fairseq.file_io import PathManager + +try: + from simuleval import READ_ACTION, WRITE_ACTION, DEFAULT_EOS + from simuleval.agents import SpeechAgent + from simuleval.states import ListEntry, SpeechStates +except ImportError: + print("Please install simuleval 'pip install simuleval'") + +SHIFT_SIZE = 10 +WINDOW_SIZE = 25 +SAMPLE_RATE = 16000 +FEATURE_DIM = 80 +BOW_PREFIX = "\u2581" + + +class OnlineFeatureExtractor: + """ + Extract speech feature on the fly. + """ + + def __init__(self, args): + self.shift_size = args.shift_size + self.window_size = args.window_size + assert self.window_size >= self.shift_size + + self.sample_rate = args.sample_rate + self.feature_dim = args.feature_dim + self.num_samples_per_shift = int(self.shift_size * self.sample_rate / 1000) + self.num_samples_per_window = int(self.window_size * self.sample_rate / 1000) + self.len_ms_to_samples = lambda x: x * self.sample_rate / 1000 + self.previous_residual_samples = [] + self.global_cmvn = args.global_cmvn + + def clear_cache(self): + self.previous_residual_samples = [] + + def __call__(self, new_samples): + samples = self.previous_residual_samples + new_samples + if len(samples) < self.num_samples_per_window: + self.previous_residual_samples = samples + return + + # num_frames is the number of frames from the new segment + num_frames = math.floor( + (len(samples) - self.len_ms_to_samples(self.window_size - self.shift_size)) + / self.num_samples_per_shift + ) + + # the number of frames used for feature extraction + # including some part of thte previous segment + effective_num_samples = int( + num_frames * self.len_ms_to_samples(self.shift_size) + + self.len_ms_to_samples(self.window_size - self.shift_size) + ) + + input_samples = samples[:effective_num_samples] + self.previous_residual_samples = samples[ + num_frames * self.num_samples_per_shift: + ] + + torch.manual_seed(1) + output = kaldi.fbank( + torch.FloatTensor(input_samples).unsqueeze(0), + num_mel_bins=self.feature_dim, + frame_length=self.window_size, + frame_shift=self.shift_size, + ).numpy() + + output = self.transform(output) + + return torch.from_numpy(output) + + def transform(self, input): + if self.global_cmvn is None: + return input + + mean = self.global_cmvn["mean"] + std = self.global_cmvn["std"] + + x = np.subtract(input, mean) + x = np.divide(x, std) + return x + + +class TensorListEntry(ListEntry): + """ + Data structure to store a list of tensor. + """ + + def append(self, value): + + if len(self.value) == 0: + self.value = value + return + + self.value = torch.cat([self.value] + [value], dim=0) + + def info(self): + return { + "type": str(self.new_value_type), + "length": self.__len__(), + "value": "" if type(self.value) is list else self.value.size(), + } + + +class FairseqSimulSTAgent(SpeechAgent): + + speech_segment_size = 40 # in ms, 4 pooling ratio * 10 ms step size + + def __init__(self, args): + super().__init__(args) + + self.eos = DEFAULT_EOS + + self.gpu = getattr(args, "gpu", False) + + self.args = args + + self.load_model_vocab(args) + + if getattr( + self.model.decoder.layers[0].encoder_attn, + 'pre_decision_ratio', + None + ) is not None: + self.speech_segment_size *= ( + self.model.decoder.layers[0].encoder_attn.pre_decision_ratio + ) + + args.global_cmvn = None + if args.config: + with open(os.path.join(args.data_bin, args.config), "r") as f: + config = yaml.load(f, Loader=yaml.BaseLoader) + + if "global_cmvn" in config: + args.global_cmvn = np.load(config["global_cmvn"]["stats_npz_path"]) + + if args.global_stats: + with PathManager.open(args.global_stats, "r") as f: + global_cmvn = json.loads(f.read()) + self.global_cmvn = {"mean": global_cmvn["mean"], "std": global_cmvn["stddev"]} + + self.feature_extractor = OnlineFeatureExtractor(args) + + self.max_len = args.max_len + + self.force_finish = args.force_finish + + torch.set_grad_enabled(False) + + def build_states(self, args, client, sentence_id): + # Initialize states here, for example add customized entry to states + # This function will be called at beginning of every new sentence + states = SpeechStates(args, client, sentence_id, self) + self.initialize_states(states) + return states + + def to_device(self, tensor): + if self.gpu: + return tensor.cuda() + else: + return tensor.cpu() + + @staticmethod + def add_args(parser): + # fmt: off + parser.add_argument('--model-path', type=str, required=True, + help='path to your pretrained model.') + parser.add_argument("--data-bin", type=str, required=True, + help="Path of data binary") + parser.add_argument("--config", type=str, default=None, + help="Path to config yaml file") + parser.add_argument("--global-stats", type=str, default=None, + help="Path to json file containing cmvn stats") + parser.add_argument("--tgt-splitter-type", type=str, default="SentencePiece", + help="Subword splitter type for target text") + parser.add_argument("--tgt-splitter-path", type=str, default=None, + help="Subword splitter model path for target text") + parser.add_argument("--user-dir", type=str, default="examples/simultaneous_translation", + help="User directory for simultaneous translation") + parser.add_argument("--max-len", type=int, default=200, + help="Max length of translation") + parser.add_argument("--force-finish", default=False, action="store_true", + help="Force the model to finish the hypothsis if the source is not finished") + parser.add_argument("--shift-size", type=int, default=SHIFT_SIZE, + help="Shift size of feature extraction window.") + parser.add_argument("--window-size", type=int, default=WINDOW_SIZE, + help="Window size of feature extraction window.") + parser.add_argument("--sample-rate", type=int, default=SAMPLE_RATE, + help="Sample rate") + parser.add_argument("--feature-dim", type=int, default=FEATURE_DIM, + help="Acoustic feature dimension.") + + # fmt: on + return parser + + def load_model_vocab(self, args): + + filename = args.model_path + if not os.path.exists(filename): + raise IOError("Model file not found: {}".format(filename)) + + state = checkpoint_utils.load_checkpoint_to_cpu(filename) + + task_args = state["cfg"]["task"] + task_args.data = args.data_bin + + if args.config is not None: + task_args.config_yaml = args.config + + task = tasks.setup_task(task_args) + + # build model for ensemble + state["cfg"]["model"].load_pretrained_encoder_from = None + state["cfg"]["model"].load_pretrained_decoder_from = None + self.model = task.build_model(state["cfg"]["model"]) + self.model.load_state_dict(state["model"], strict=True) + self.model.eval() + self.model.share_memory() + + if self.gpu: + self.model.cuda() + + # Set dictionary + self.dict = {} + self.dict["tgt"] = task.target_dictionary + + def initialize_states(self, states): + self.feature_extractor.clear_cache() + states.units.source = TensorListEntry() + states.units.target = ListEntry() + states.incremental_states = dict() + + def segment_to_units(self, segment, states): + # Convert speech samples to features + features = self.feature_extractor(segment) + if features is not None: + return [features] + else: + return [] + + def units_to_segment(self, units, states): + # Merge sub word to full word. + if self.model.decoder.dictionary.eos() == units[0]: + return DEFAULT_EOS + + segment = [] + if None in units.value: + units.value.remove(None) + + for index in units: + if index is None: + units.pop() + token = self.model.decoder.dictionary.string([index]) + if token.startswith(BOW_PREFIX): + if len(segment) == 0: + segment += [token.replace(BOW_PREFIX, "")] + else: + for j in range(len(segment)): + units.pop() + + string_to_return = ["".join(segment)] + + if self.model.decoder.dictionary.eos() == units[0]: + string_to_return += [DEFAULT_EOS] + + return string_to_return + else: + segment += [token.replace(BOW_PREFIX, "")] + + if ( + len(units) > 0 + and self.model.decoder.dictionary.eos() == units[-1] + or len(states.units.target) > self.max_len + ): + tokens = [self.model.decoder.dictionary.string([unit]) for unit in units] + return ["".join(tokens).replace(BOW_PREFIX, "")] + [DEFAULT_EOS] + + return None + + def update_model_encoder(self, states): + if len(states.units.source) == 0: + return + src_indices = self.to_device( + states.units.source.value.unsqueeze(0) + ) + src_lengths = self.to_device( + torch.LongTensor([states.units.source.value.size(0)]) + ) + + states.encoder_states = self.model.encoder(src_indices, src_lengths) + torch.cuda.empty_cache() + + def update_states_read(self, states): + # Happens after a read action. + self.update_model_encoder(states) + + def policy(self, states): + if not getattr(states, "encoder_states", None): + return READ_ACTION + + tgt_indices = self.to_device( + torch.LongTensor( + [self.model.decoder.dictionary.eos()] + + [x for x in states.units.target.value if x is not None] + ).unsqueeze(0) + ) + + states.incremental_states["steps"] = { + "src": states.encoder_states["encoder_out"][0].size(0), + "tgt": 1 + len(states.units.target), + } + + states.incremental_states["online"] = {"only": torch.tensor(not states.finish_read())} + + x, outputs = self.model.decoder.forward( + prev_output_tokens=tgt_indices, + encoder_out=states.encoder_states, + incremental_state=states.incremental_states, + ) + + states.decoder_out = x + + states.decoder_out_extra = outputs + + torch.cuda.empty_cache() + + if outputs.action == 0: + return READ_ACTION + else: + return WRITE_ACTION + + def predict(self, states): + decoder_states = states.decoder_out + + lprobs = self.model.get_normalized_probs( + [decoder_states[:, -1:]], log_probs=True + ) + + index = lprobs.argmax(dim=-1) + + index = index[0, 0].item() + + if ( + self.force_finish + and index == self.model.decoder.dictionary.eos() + and not states.finish_read() + ): + # If we want to force finish the translation + # (don't stop before finish reading), return a None + # self.model.decoder.clear_cache(states.incremental_states) + index = None + + return index diff --git a/SpeechT5/fairseq/examples/stories/README.md b/SpeechT5/fairseq/examples/stories/README.md new file mode 100644 index 0000000..588941e --- /dev/null +++ b/SpeechT5/fairseq/examples/stories/README.md @@ -0,0 +1,66 @@ +# Hierarchical Neural Story Generation (Fan et al., 2018) + +The following commands provide an example of pre-processing data, training a model, and generating text for story generation with the WritingPrompts dataset. + +## Pre-trained models + +Description | Dataset | Model | Test set(s) +---|---|---|--- +Stories with Convolutional Model <br> ([Fan et al., 2018](https://arxiv.org/abs/1805.04833)) | [WritingPrompts](https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/stories_checkpoint.tar.bz2) | [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/stories_test.tar.bz2) + +We provide sample stories generated by the [convolutional seq2seq model](https://dl.fbaipublicfiles.com/fairseq/data/seq2seq_stories.txt) and [fusion model](https://dl.fbaipublicfiles.com/fairseq/data/fusion_stories.txt) from [Fan et al., 2018](https://arxiv.org/abs/1805.04833). The corresponding prompts for the fusion model can be found [here](https://dl.fbaipublicfiles.com/fairseq/data/fusion_prompts.txt). Note that there are unk in the file, as we modeled a small full vocabulary (no BPE or pre-training). We did not use these unk prompts for human evaluation. + +## Dataset + +The dataset can be downloaded like this: + +```bash +cd examples/stories +curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf - +``` + +and contains a train, test, and valid split. The dataset is described here: https://arxiv.org/abs/1805.04833. We model only the first 1000 words of each story, including one newLine token. + +## Example usage + +First we will preprocess the dataset. Note that the dataset release is the full data, but the paper models the first 1000 words of each story. Here is example code that trims the dataset to the first 1000 words of each story: +```python +data = ["train", "test", "valid"] +for name in data: + with open(name + ".wp_target") as f: + stories = f.readlines() + stories = [" ".join(i.split()[0:1000]) for i in stories] + with open(name + ".wp_target", "w") as o: + for line in stories: + o.write(line.strip() + "\n") +``` + +Once we've trimmed the data we can binarize it and train our model: +```bash +# Binarize the dataset: +export TEXT=examples/stories/writingPrompts +fairseq-preprocess --source-lang wp_source --target-lang wp_target \ + --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ + --destdir data-bin/writingPrompts --padding-factor 1 --thresholdtgt 10 --thresholdsrc 10 + +# Train the model: +fairseq-train data-bin/writingPrompts -a fconv_self_att_wp --lr 0.25 --optimizer nag --clip-norm 0.1 --max-tokens 1500 --lr-scheduler reduce_lr_on_plateau --decoder-attention True --encoder-attention False --criterion label_smoothed_cross_entropy --weight-decay .0000001 --label-smoothing 0 --source-lang wp_source --target-lang wp_target --gated-attention True --self-attention True --project-input True --pretrained False + +# Train a fusion model: +# add the arguments: --pretrained True --pretrained-checkpoint path/to/checkpoint + +# Generate: +# Note: to load the pretrained model at generation time, you need to pass in a model-override argument to communicate to the fusion model at generation time where you have placed the pretrained checkpoint. By default, it will load the exact path of the fusion model's pretrained model from training time. You should use model-override if you have moved the pretrained model (or are using our provided models). If you are generating from a non-fusion model, the model-override argument is not necessary. + +fairseq-generate data-bin/writingPrompts --path /path/to/trained/model/checkpoint_best.pt --batch-size 32 --beam 1 --sampling --sampling-topk 10 --temperature 0.8 --nbest 1 --model-overrides "{'pretrained_checkpoint':'/path/to/pretrained/model/checkpoint'}" +``` + +## Citation +```bibtex +@inproceedings{fan2018hierarchical, + title = {Hierarchical Neural Story Generation}, + author = {Fan, Angela and Lewis, Mike and Dauphin, Yann}, + booktitle = {Conference of the Association for Computational Linguistics (ACL)}, + year = 2018, +} +``` diff --git a/SpeechT5/fairseq/examples/translation/README.md b/SpeechT5/fairseq/examples/translation/README.md new file mode 100644 index 0000000..2941f5e --- /dev/null +++ b/SpeechT5/fairseq/examples/translation/README.md @@ -0,0 +1,301 @@ +# Neural Machine Translation + +This README contains instructions for [using pretrained translation models](#example-usage-torchhub) +as well as [training new models](#training-a-new-model). + +## Pre-trained models + +Model | Description | Dataset | Download +---|---|---|--- +`conv.wmt14.en-fr` | Convolutional <br> ([Gehring et al., 2017](https://arxiv.org/abs/1705.03122)) | [WMT14 English-French](http://statmt.org/wmt14/translation-task.html#Download) | model: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt14.v2.en-fr.fconv-py.tar.bz2) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.v2.en-fr.newstest2014.tar.bz2) <br> newstest2012/2013: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.v2.en-fr.ntst1213.tar.bz2) +`conv.wmt14.en-de` | Convolutional <br> ([Gehring et al., 2017](https://arxiv.org/abs/1705.03122)) | [WMT14 English-German](http://statmt.org/wmt14/translation-task.html#Download) | model: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt14.en-de.fconv-py.tar.bz2) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.en-de.newstest2014.tar.bz2) +`conv.wmt17.en-de` | Convolutional <br> ([Gehring et al., 2017](https://arxiv.org/abs/1705.03122)) | [WMT17 English-German](http://statmt.org/wmt17/translation-task.html#Download) | model: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt17.v2.en-de.fconv-py.tar.bz2) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt17.v2.en-de.newstest2014.tar.bz2) +`transformer.wmt14.en-fr` | Transformer <br> ([Ott et al., 2018](https://arxiv.org/abs/1806.00187)) | [WMT14 English-French](http://statmt.org/wmt14/translation-task.html#Download) | model: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt14.en-fr.joined-dict.transformer.tar.bz2) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt14.en-fr.joined-dict.newstest2014.tar.bz2) +`transformer.wmt16.en-de` | Transformer <br> ([Ott et al., 2018](https://arxiv.org/abs/1806.00187)) | [WMT16 English-German](https://drive.google.com/uc?export=download&id=0B_bZck-ksdkpM25jRUN2X2UxMm8) | model: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/models/wmt16.en-de.joined-dict.transformer.tar.bz2) <br> newstest2014: <br> [download (.tar.bz2)](https://dl.fbaipublicfiles.com/fairseq/data/wmt16.en-de.joined-dict.newstest2014.tar.bz2) +`transformer.wmt18.en-de` | Transformer <br> ([Edunov et al., 2018](https://arxiv.org/abs/1808.09381)) <br> WMT'18 winner | [WMT'18 English-German](http://www.statmt.org/wmt18/translation-task.html) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt18.en-de.ensemble.tar.gz) <br> See NOTE in the archive +`transformer.wmt19.en-de` | Transformer <br> ([Ng et al., 2019](https://arxiv.org/abs/1907.06616)) <br> WMT'19 winner | [WMT'19 English-German](http://www.statmt.org/wmt19/translation-task.html) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-de.joined-dict.ensemble.tar.gz) +`transformer.wmt19.de-en` | Transformer <br> ([Ng et al., 2019](https://arxiv.org/abs/1907.06616)) <br> WMT'19 winner | [WMT'19 German-English](http://www.statmt.org/wmt19/translation-task.html) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.de-en.joined-dict.ensemble.tar.gz) +`transformer.wmt19.en-ru` | Transformer <br> ([Ng et al., 2019](https://arxiv.org/abs/1907.06616)) <br> WMT'19 winner | [WMT'19 English-Russian](http://www.statmt.org/wmt19/translation-task.html) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-ru.ensemble.tar.gz) +`transformer.wmt19.ru-en` | Transformer <br> ([Ng et al., 2019](https://arxiv.org/abs/1907.06616)) <br> WMT'19 winner | [WMT'19 Russian-English](http://www.statmt.org/wmt19/translation-task.html) | model: <br> [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.ru-en.ensemble.tar.gz) + +## Example usage (torch.hub) + +We require a few additional Python dependencies for preprocessing: +```bash +pip install fastBPE sacremoses subword_nmt +``` + +Interactive translation via PyTorch Hub: +```python +import torch + +# List available models +torch.hub.list('pytorch/fairseq') # [..., 'transformer.wmt16.en-de', ... ] + +# Load a transformer trained on WMT'16 En-De +# Note: WMT'19 models use fastBPE instead of subword_nmt, see instructions below +en2de = torch.hub.load('pytorch/fairseq', 'transformer.wmt16.en-de', + tokenizer='moses', bpe='subword_nmt') +en2de.eval() # disable dropout + +# The underlying model is available under the *models* attribute +assert isinstance(en2de.models[0], fairseq.models.transformer.TransformerModel) + +# Move model to GPU for faster translation +en2de.cuda() + +# Translate a sentence +en2de.translate('Hello world!') +# 'Hallo Welt!' + +# Batched translation +en2de.translate(['Hello world!', 'The cat sat on the mat.']) +# ['Hallo Welt!', 'Die Katze saß auf der Matte.'] +``` + +Loading custom models: +```python +from fairseq.models.transformer import TransformerModel +zh2en = TransformerModel.from_pretrained( + '/path/to/checkpoints', + checkpoint_file='checkpoint_best.pt', + data_name_or_path='data-bin/wmt17_zh_en_full', + bpe='subword_nmt', + bpe_codes='data-bin/wmt17_zh_en_full/zh.code' +) +zh2en.translate('你好 世界') +# 'Hello World' +``` + +If you are using a `transformer.wmt19` models, you will need to set the `bpe` +argument to `'fastbpe'` and (optionally) load the 4-model ensemble: +```python +en2de = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.en-de', + checkpoint_file='model1.pt:model2.pt:model3.pt:model4.pt', + tokenizer='moses', bpe='fastbpe') +en2de.eval() # disable dropout +``` + +## Example usage (CLI tools) + +Generation with the binarized test sets can be run in batch mode as follows, e.g. for WMT 2014 English-French on a GTX-1080ti: +```bash +mkdir -p data-bin +curl https://dl.fbaipublicfiles.com/fairseq/models/wmt14.v2.en-fr.fconv-py.tar.bz2 | tar xvjf - -C data-bin +curl https://dl.fbaipublicfiles.com/fairseq/data/wmt14.v2.en-fr.newstest2014.tar.bz2 | tar xvjf - -C data-bin +fairseq-generate data-bin/wmt14.en-fr.newstest2014 \ + --path data-bin/wmt14.en-fr.fconv-py/model.pt \ + --beam 5 --batch-size 128 --remove-bpe | tee /tmp/gen.out +# ... +# | Translated 3003 sentences (96311 tokens) in 166.0s (580.04 tokens/s) +# | Generate test with beam=5: BLEU4 = 40.83, 67.5/46.9/34.4/25.5 (BP=1.000, ratio=1.006, syslen=83262, reflen=82787) + +# Compute BLEU score +grep ^H /tmp/gen.out | cut -f3- > /tmp/gen.out.sys +grep ^T /tmp/gen.out | cut -f2- > /tmp/gen.out.ref +fairseq-score --sys /tmp/gen.out.sys --ref /tmp/gen.out.ref +# BLEU4 = 40.83, 67.5/46.9/34.4/25.5 (BP=1.000, ratio=1.006, syslen=83262, reflen=82787) +``` + +## Training a new model + +### IWSLT'14 German to English (Transformer) + +The following instructions can be used to train a Transformer model on the [IWSLT'14 German to English dataset](http://workshop2014.iwslt.org/downloads/proceeding.pdf). + +First download and preprocess the data: +```bash +# Download and prepare the data +cd examples/translation/ +bash prepare-iwslt14.sh +cd ../.. + +# Preprocess/binarize the data +TEXT=examples/translation/iwslt14.tokenized.de-en +fairseq-preprocess --source-lang de --target-lang en \ + --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ + --destdir data-bin/iwslt14.tokenized.de-en \ + --workers 20 +``` + +Next we'll train a Transformer translation model over this data: +```bash +CUDA_VISIBLE_DEVICES=0 fairseq-train \ + data-bin/iwslt14.tokenized.de-en \ + --arch transformer_iwslt_de_en --share-decoder-input-output-embed \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ + --lr 5e-4 --lr-scheduler inverse_sqrt --warmup-updates 4000 \ + --dropout 0.3 --weight-decay 0.0001 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --max-tokens 4096 \ + --eval-bleu \ + --eval-bleu-args '{"beam": 5, "max_len_a": 1.2, "max_len_b": 10}' \ + --eval-bleu-detok moses \ + --eval-bleu-remove-bpe \ + --eval-bleu-print-samples \ + --best-checkpoint-metric bleu --maximize-best-checkpoint-metric +``` + +Finally we can evaluate our trained model: +```bash +fairseq-generate data-bin/iwslt14.tokenized.de-en \ + --path checkpoints/checkpoint_best.pt \ + --batch-size 128 --beam 5 --remove-bpe +``` + +### WMT'14 English to German (Convolutional) + +The following instructions can be used to train a Convolutional translation model on the WMT English to German dataset. +See the [Scaling NMT README](../scaling_nmt/README.md) for instructions to train a Transformer translation model on this data. + +The WMT English to German dataset can be preprocessed using the `prepare-wmt14en2de.sh` script. +By default it will produce a dataset that was modeled after [Attention Is All You Need (Vaswani et al., 2017)](https://arxiv.org/abs/1706.03762), but with additional news-commentary-v12 data from WMT'17. + +To use only data available in WMT'14 or to replicate results obtained in the original [Convolutional Sequence to Sequence Learning (Gehring et al., 2017)](https://arxiv.org/abs/1705.03122) paper, please use the `--icml17` option. + +```bash +# Download and prepare the data +cd examples/translation/ +# WMT'17 data: +bash prepare-wmt14en2de.sh +# or to use WMT'14 data: +# bash prepare-wmt14en2de.sh --icml17 +cd ../.. + +# Binarize the dataset +TEXT=examples/translation/wmt17_en_de +fairseq-preprocess \ + --source-lang en --target-lang de \ + --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ + --destdir data-bin/wmt17_en_de --thresholdtgt 0 --thresholdsrc 0 \ + --workers 20 + +# Train the model +mkdir -p checkpoints/fconv_wmt_en_de +fairseq-train \ + data-bin/wmt17_en_de \ + --arch fconv_wmt_en_de \ + --dropout 0.2 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --optimizer nag --clip-norm 0.1 \ + --lr 0.5 --lr-scheduler fixed --force-anneal 50 \ + --max-tokens 4000 \ + --save-dir checkpoints/fconv_wmt_en_de + +# Evaluate +fairseq-generate data-bin/wmt17_en_de \ + --path checkpoints/fconv_wmt_en_de/checkpoint_best.pt \ + --beam 5 --remove-bpe +``` + +### WMT'14 English to French +```bash +# Download and prepare the data +cd examples/translation/ +bash prepare-wmt14en2fr.sh +cd ../.. + +# Binarize the dataset +TEXT=examples/translation/wmt14_en_fr +fairseq-preprocess \ + --source-lang en --target-lang fr \ + --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \ + --destdir data-bin/wmt14_en_fr --thresholdtgt 0 --thresholdsrc 0 \ + --workers 60 + +# Train the model +mkdir -p checkpoints/fconv_wmt_en_fr +fairseq-train \ + data-bin/wmt14_en_fr \ + --arch fconv_wmt_en_fr \ + --dropout 0.1 \ + --criterion label_smoothed_cross_entropy --label-smoothing 0.1 \ + --optimizer nag --clip-norm 0.1 \ + --lr 0.5 --lr-scheduler fixed --force-anneal 50 \ + --max-tokens 3000 \ + --save-dir checkpoints/fconv_wmt_en_fr + +# Evaluate +fairseq-generate \ + data-bin/fconv_wmt_en_fr \ + --path checkpoints/fconv_wmt_en_fr/checkpoint_best.pt \ + --beam 5 --remove-bpe +``` + +## Multilingual Translation + +We also support training multilingual translation models. In this example we'll +train a multilingual `{de,fr}-en` translation model using the IWSLT'17 datasets. + +Note that we use slightly different preprocessing here than for the IWSLT'14 +En-De data above. In particular we learn a joint BPE code for all three +languages and use fairseq-interactive and sacrebleu for scoring the test set. + +```bash +# First install sacrebleu and sentencepiece +pip install sacrebleu sentencepiece + +# Then download and preprocess the data +cd examples/translation/ +bash prepare-iwslt17-multilingual.sh +cd ../.. + +# Binarize the de-en dataset +TEXT=examples/translation/iwslt17.de_fr.en.bpe16k +fairseq-preprocess --source-lang de --target-lang en \ + --trainpref $TEXT/train.bpe.de-en \ + --validpref $TEXT/valid0.bpe.de-en,$TEXT/valid1.bpe.de-en,$TEXT/valid2.bpe.de-en,$TEXT/valid3.bpe.de-en,$TEXT/valid4.bpe.de-en,$TEXT/valid5.bpe.de-en \ + --destdir data-bin/iwslt17.de_fr.en.bpe16k \ + --workers 10 + +# Binarize the fr-en dataset +# NOTE: it's important to reuse the en dictionary from the previous step +fairseq-preprocess --source-lang fr --target-lang en \ + --trainpref $TEXT/train.bpe.fr-en \ + --validpref $TEXT/valid0.bpe.fr-en,$TEXT/valid1.bpe.fr-en,$TEXT/valid2.bpe.fr-en,$TEXT/valid3.bpe.fr-en,$TEXT/valid4.bpe.fr-en,$TEXT/valid5.bpe.fr-en \ + --tgtdict data-bin/iwslt17.de_fr.en.bpe16k/dict.en.txt \ + --destdir data-bin/iwslt17.de_fr.en.bpe16k \ + --workers 10 + +# Train a multilingual transformer model +# NOTE: the command below assumes 1 GPU, but accumulates gradients from +# 8 fwd/bwd passes to simulate training on 8 GPUs +mkdir -p checkpoints/multilingual_transformer +CUDA_VISIBLE_DEVICES=0 fairseq-train data-bin/iwslt17.de_fr.en.bpe16k/ \ + --max-epoch 50 \ + --ddp-backend=legacy_ddp \ + --task multilingual_translation --lang-pairs de-en,fr-en \ + --arch multilingual_transformer_iwslt_de_en \ + --share-decoders --share-decoder-input-output-embed \ + --optimizer adam --adam-betas '(0.9, 0.98)' \ + --lr 0.0005 --lr-scheduler inverse_sqrt \ + --warmup-updates 4000 --warmup-init-lr '1e-07' \ + --label-smoothing 0.1 --criterion label_smoothed_cross_entropy \ + --dropout 0.3 --weight-decay 0.0001 \ + --save-dir checkpoints/multilingual_transformer \ + --max-tokens 4000 \ + --update-freq 8 + +# Generate and score the test set with sacrebleu +SRC=de +sacrebleu --test-set iwslt17 --language-pair ${SRC}-en --echo src \ + | python scripts/spm_encode.py --model examples/translation/iwslt17.de_fr.en.bpe16k/sentencepiece.bpe.model \ + > iwslt17.test.${SRC}-en.${SRC}.bpe +cat iwslt17.test.${SRC}-en.${SRC}.bpe \ + | fairseq-interactive data-bin/iwslt17.de_fr.en.bpe16k/ \ + --task multilingual_translation --lang-pairs de-en,fr-en \ + --source-lang ${SRC} --target-lang en \ + --path checkpoints/multilingual_transformer/checkpoint_best.pt \ + --buffer-size 2000 --batch-size 128 \ + --beam 5 --remove-bpe=sentencepiece \ + > iwslt17.test.${SRC}-en.en.sys +grep ^H iwslt17.test.${SRC}-en.en.sys | cut -f3 \ + | sacrebleu --test-set iwslt17 --language-pair ${SRC}-en +``` + +##### Argument format during inference + +During inference it is required to specify a single `--source-lang` and +`--target-lang`, which indicates the inference langauge direction. +`--lang-pairs`, `--encoder-langtok`, `--decoder-langtok` have to be set to +the same value as training. diff --git a/SpeechT5/fairseq/examples/translation/prepare-iwslt14.sh b/SpeechT5/fairseq/examples/translation/prepare-iwslt14.sh new file mode 100644 index 0000000..2fb6643 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation/prepare-iwslt14.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +# +# Adapted from https://github.com/facebookresearch/MIXER/blob/master/prepareData.sh + +echo 'Cloning Moses github repository (for tokenization scripts)...' +git clone https://github.com/moses-smt/mosesdecoder.git + +echo 'Cloning Subword NMT repository (for BPE pre-processing)...' +git clone https://github.com/rsennrich/subword-nmt.git + +SCRIPTS=mosesdecoder/scripts +TOKENIZER=$SCRIPTS/tokenizer/tokenizer.perl +LC=$SCRIPTS/tokenizer/lowercase.perl +CLEAN=$SCRIPTS/training/clean-corpus-n.perl +BPEROOT=subword-nmt/subword_nmt +BPE_TOKENS=10000 + +URL="http://dl.fbaipublicfiles.com/fairseq/data/iwslt14/de-en.tgz" +GZ=de-en.tgz + +if [ ! -d "$SCRIPTS" ]; then + echo "Please set SCRIPTS variable correctly to point to Moses scripts." + exit +fi + +src=de +tgt=en +lang=de-en +prep=iwslt14.tokenized.de-en +tmp=$prep/tmp +orig=orig + +mkdir -p $orig $tmp $prep + +echo "Downloading data from ${URL}..." +cd $orig +wget "$URL" + +if [ -f $GZ ]; then + echo "Data successfully downloaded." +else + echo "Data not successfully downloaded." + exit +fi + +tar zxvf $GZ +cd .. + +echo "pre-processing train data..." +for l in $src $tgt; do + f=train.tags.$lang.$l + tok=train.tags.$lang.tok.$l + + cat $orig/$lang/$f | \ + grep -v '<url>' | \ + grep -v '<talkid>' | \ + grep -v '<keywords>' | \ + sed -e 's/<title>//g' | \ + sed -e 's/<\/title>//g' | \ + sed -e 's/<description>//g' | \ + sed -e 's/<\/description>//g' | \ + perl $TOKENIZER -threads 8 -l $l > $tmp/$tok + echo "" +done +perl $CLEAN -ratio 1.5 $tmp/train.tags.$lang.tok $src $tgt $tmp/train.tags.$lang.clean 1 175 +for l in $src $tgt; do + perl $LC < $tmp/train.tags.$lang.clean.$l > $tmp/train.tags.$lang.$l +done + +echo "pre-processing valid/test data..." +for l in $src $tgt; do + for o in `ls $orig/$lang/IWSLT14.TED*.$l.xml`; do + fname=${o##*/} + f=$tmp/${fname%.*} + echo $o $f + grep '<seg id' $o | \ + sed -e 's/<seg id="[0-9]*">\s*//g' | \ + sed -e 's/\s*<\/seg>\s*//g' | \ + sed -e "s/\’/\'/g" | \ + perl $TOKENIZER -threads 8 -l $l | \ + perl $LC > $f + echo "" + done +done + + +echo "creating train, valid, test..." +for l in $src $tgt; do + awk '{if (NR%23 == 0) print $0; }' $tmp/train.tags.de-en.$l > $tmp/valid.$l + awk '{if (NR%23 != 0) print $0; }' $tmp/train.tags.de-en.$l > $tmp/train.$l + + cat $tmp/IWSLT14.TED.dev2010.de-en.$l \ + $tmp/IWSLT14.TEDX.dev2012.de-en.$l \ + $tmp/IWSLT14.TED.tst2010.de-en.$l \ + $tmp/IWSLT14.TED.tst2011.de-en.$l \ + $tmp/IWSLT14.TED.tst2012.de-en.$l \ + > $tmp/test.$l +done + +TRAIN=$tmp/train.en-de +BPE_CODE=$prep/code +rm -f $TRAIN +for l in $src $tgt; do + cat $tmp/train.$l >> $TRAIN +done + +echo "learn_bpe.py on ${TRAIN}..." +python $BPEROOT/learn_bpe.py -s $BPE_TOKENS < $TRAIN > $BPE_CODE + +for L in $src $tgt; do + for f in train.$L valid.$L test.$L; do + echo "apply_bpe.py to ${f}..." + python $BPEROOT/apply_bpe.py -c $BPE_CODE < $tmp/$f > $prep/$f + done +done diff --git a/SpeechT5/fairseq/examples/translation/prepare-iwslt17-multilingual.sh b/SpeechT5/fairseq/examples/translation/prepare-iwslt17-multilingual.sh new file mode 100644 index 0000000..23be875 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation/prepare-iwslt17-multilingual.sh @@ -0,0 +1,133 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +SRCS=( + "de" + "fr" +) +TGT=en + +ROOT=$(dirname "$0") +SCRIPTS=$ROOT/../../scripts +SPM_TRAIN=$SCRIPTS/spm_train.py +SPM_ENCODE=$SCRIPTS/spm_encode.py + +BPESIZE=16384 +ORIG=$ROOT/iwslt17_orig +DATA=$ROOT/iwslt17.de_fr.en.bpe16k +mkdir -p "$ORIG" "$DATA" + +TRAIN_MINLEN=1 # remove sentences with <1 BPE token +TRAIN_MAXLEN=250 # remove sentences with >250 BPE tokens + +URLS=( + "https://wit3.fbk.eu/archive/2017-01-trnted/texts/de/en/de-en.tgz" + "https://wit3.fbk.eu/archive/2017-01-trnted/texts/fr/en/fr-en.tgz" +) +ARCHIVES=( + "de-en.tgz" + "fr-en.tgz" +) +VALID_SETS=( + "IWSLT17.TED.dev2010.de-en IWSLT17.TED.tst2010.de-en IWSLT17.TED.tst2011.de-en IWSLT17.TED.tst2012.de-en IWSLT17.TED.tst2013.de-en IWSLT17.TED.tst2014.de-en IWSLT17.TED.tst2015.de-en" + "IWSLT17.TED.dev2010.fr-en IWSLT17.TED.tst2010.fr-en IWSLT17.TED.tst2011.fr-en IWSLT17.TED.tst2012.fr-en IWSLT17.TED.tst2013.fr-en IWSLT17.TED.tst2014.fr-en IWSLT17.TED.tst2015.fr-en" +) + +# download and extract data +for ((i=0;i<${#URLS[@]};++i)); do + ARCHIVE=$ORIG/${ARCHIVES[i]} + if [ -f "$ARCHIVE" ]; then + echo "$ARCHIVE already exists, skipping download" + else + URL=${URLS[i]} + wget -P "$ORIG" "$URL" + if [ -f "$ARCHIVE" ]; then + echo "$URL successfully downloaded." + else + echo "$URL not successfully downloaded." + exit 1 + fi + fi + FILE=${ARCHIVE: -4} + if [ -e "$FILE" ]; then + echo "$FILE already exists, skipping extraction" + else + tar -C "$ORIG" -xzvf "$ARCHIVE" + fi +done + +echo "pre-processing train data..." +for SRC in "${SRCS[@]}"; do + for LANG in "${SRC}" "${TGT}"; do + cat "$ORIG/${SRC}-${TGT}/train.tags.${SRC}-${TGT}.${LANG}" \ + | grep -v '<url>' \ + | grep -v '<talkid>' \ + | grep -v '<keywords>' \ + | grep -v '<speaker>' \ + | grep -v '<reviewer' \ + | grep -v '<translator' \ + | grep -v '<doc' \ + | grep -v '</doc>' \ + | sed -e 's/<title>//g' \ + | sed -e 's/<\/title>//g' \ + | sed -e 's/<description>//g' \ + | sed -e 's/<\/description>//g' \ + | sed 's/^\s*//g' \ + | sed 's/\s*$//g' \ + > "$DATA/train.${SRC}-${TGT}.${LANG}" + done +done + +echo "pre-processing valid data..." +for ((i=0;i<${#SRCS[@]};++i)); do + SRC=${SRCS[i]} + VALID_SET=(${VALID_SETS[i]}) + for ((j=0;j<${#VALID_SET[@]};++j)); do + FILE=${VALID_SET[j]} + for LANG in "$SRC" "$TGT"; do + grep '<seg id' "$ORIG/${SRC}-${TGT}/${FILE}.${LANG}.xml" \ + | sed -e 's/<seg id="[0-9]*">\s*//g' \ + | sed -e 's/\s*<\/seg>\s*//g' \ + | sed -e "s/\’/\'/g" \ + > "$DATA/valid${j}.${SRC}-${TGT}.${LANG}" + done + done +done + +# learn BPE with sentencepiece +TRAIN_FILES=$(for SRC in "${SRCS[@]}"; do echo $DATA/train.${SRC}-${TGT}.${SRC}; echo $DATA/train.${SRC}-${TGT}.${TGT}; done | tr "\n" ",") +echo "learning joint BPE over ${TRAIN_FILES}..." +python "$SPM_TRAIN" \ + --input=$TRAIN_FILES \ + --model_prefix=$DATA/sentencepiece.bpe \ + --vocab_size=$BPESIZE \ + --character_coverage=1.0 \ + --model_type=bpe + +# encode train/valid +echo "encoding train with learned BPE..." +for SRC in "${SRCS[@]}"; do + python "$SPM_ENCODE" \ + --model "$DATA/sentencepiece.bpe.model" \ + --output_format=piece \ + --inputs $DATA/train.${SRC}-${TGT}.${SRC} $DATA/train.${SRC}-${TGT}.${TGT} \ + --outputs $DATA/train.bpe.${SRC}-${TGT}.${SRC} $DATA/train.bpe.${SRC}-${TGT}.${TGT} \ + --min-len $TRAIN_MINLEN --max-len $TRAIN_MAXLEN +done + +echo "encoding valid with learned BPE..." +for ((i=0;i<${#SRCS[@]};++i)); do + SRC=${SRCS[i]} + VALID_SET=(${VALID_SETS[i]}) + for ((j=0;j<${#VALID_SET[@]};++j)); do + python "$SPM_ENCODE" \ + --model "$DATA/sentencepiece.bpe.model" \ + --output_format=piece \ + --inputs $DATA/valid${j}.${SRC}-${TGT}.${SRC} $DATA/valid${j}.${SRC}-${TGT}.${TGT} \ + --outputs $DATA/valid${j}.bpe.${SRC}-${TGT}.${SRC} $DATA/valid${j}.bpe.${SRC}-${TGT}.${TGT} + done +done diff --git a/SpeechT5/fairseq/examples/translation/prepare-wmt14en2de.sh b/SpeechT5/fairseq/examples/translation/prepare-wmt14en2de.sh new file mode 100644 index 0000000..6702c88 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation/prepare-wmt14en2de.sh @@ -0,0 +1,142 @@ +#!/bin/bash +# Adapted from https://github.com/facebookresearch/MIXER/blob/master/prepareData.sh + +echo 'Cloning Moses github repository (for tokenization scripts)...' +git clone https://github.com/moses-smt/mosesdecoder.git + +echo 'Cloning Subword NMT repository (for BPE pre-processing)...' +git clone https://github.com/rsennrich/subword-nmt.git + +SCRIPTS=mosesdecoder/scripts +TOKENIZER=$SCRIPTS/tokenizer/tokenizer.perl +CLEAN=$SCRIPTS/training/clean-corpus-n.perl +NORM_PUNC=$SCRIPTS/tokenizer/normalize-punctuation.perl +REM_NON_PRINT_CHAR=$SCRIPTS/tokenizer/remove-non-printing-char.perl +BPEROOT=subword-nmt/subword_nmt +BPE_TOKENS=40000 + +URLS=( + "http://statmt.org/wmt13/training-parallel-europarl-v7.tgz" + "http://statmt.org/wmt13/training-parallel-commoncrawl.tgz" + "http://data.statmt.org/wmt17/translation-task/training-parallel-nc-v12.tgz" + "http://data.statmt.org/wmt17/translation-task/dev.tgz" + "http://statmt.org/wmt14/test-full.tgz" +) +FILES=( + "training-parallel-europarl-v7.tgz" + "training-parallel-commoncrawl.tgz" + "training-parallel-nc-v12.tgz" + "dev.tgz" + "test-full.tgz" +) +CORPORA=( + "training/europarl-v7.de-en" + "commoncrawl.de-en" + "training/news-commentary-v12.de-en" +) + +# This will make the dataset compatible to the one used in "Convolutional Sequence to Sequence Learning" +# https://arxiv.org/abs/1705.03122 +if [ "$1" == "--icml17" ]; then + URLS[2]="http://statmt.org/wmt14/training-parallel-nc-v9.tgz" + FILES[2]="training-parallel-nc-v9.tgz" + CORPORA[2]="training/news-commentary-v9.de-en" + OUTDIR=wmt14_en_de +else + OUTDIR=wmt17_en_de +fi + +if [ ! -d "$SCRIPTS" ]; then + echo "Please set SCRIPTS variable correctly to point to Moses scripts." + exit +fi + +src=en +tgt=de +lang=en-de +prep=$OUTDIR +tmp=$prep/tmp +orig=orig +dev=dev/newstest2013 + +mkdir -p $orig $tmp $prep + +cd $orig + +for ((i=0;i<${#URLS[@]};++i)); do + file=${FILES[i]} + if [ -f $file ]; then + echo "$file already exists, skipping download" + else + url=${URLS[i]} + wget "$url" + if [ -f $file ]; then + echo "$url successfully downloaded." + else + echo "$url not successfully downloaded." + exit -1 + fi + if [ ${file: -4} == ".tgz" ]; then + tar zxvf $file + elif [ ${file: -4} == ".tar" ]; then + tar xvf $file + fi + fi +done +cd .. + +echo "pre-processing train data..." +for l in $src $tgt; do + rm $tmp/train.tags.$lang.tok.$l + for f in "${CORPORA[@]}"; do + cat $orig/$f.$l | \ + perl $NORM_PUNC $l | \ + perl $REM_NON_PRINT_CHAR | \ + perl $TOKENIZER -threads 8 -a -l $l >> $tmp/train.tags.$lang.tok.$l + done +done + +echo "pre-processing test data..." +for l in $src $tgt; do + if [ "$l" == "$src" ]; then + t="src" + else + t="ref" + fi + grep '<seg id' $orig/test-full/newstest2014-deen-$t.$l.sgm | \ + sed -e 's/<seg id="[0-9]*">\s*//g' | \ + sed -e 's/\s*<\/seg>\s*//g' | \ + sed -e "s/\’/\'/g" | \ + perl $TOKENIZER -threads 8 -a -l $l > $tmp/test.$l + echo "" +done + +echo "splitting train and valid..." +for l in $src $tgt; do + awk '{if (NR%100 == 0) print $0; }' $tmp/train.tags.$lang.tok.$l > $tmp/valid.$l + awk '{if (NR%100 != 0) print $0; }' $tmp/train.tags.$lang.tok.$l > $tmp/train.$l +done + +TRAIN=$tmp/train.de-en +BPE_CODE=$prep/code +rm -f $TRAIN +for l in $src $tgt; do + cat $tmp/train.$l >> $TRAIN +done + +echo "learn_bpe.py on ${TRAIN}..." +python $BPEROOT/learn_bpe.py -s $BPE_TOKENS < $TRAIN > $BPE_CODE + +for L in $src $tgt; do + for f in train.$L valid.$L test.$L; do + echo "apply_bpe.py to ${f}..." + python $BPEROOT/apply_bpe.py -c $BPE_CODE < $tmp/$f > $tmp/bpe.$f + done +done + +perl $CLEAN -ratio 1.5 $tmp/bpe.train $src $tgt $prep/train 1 250 +perl $CLEAN -ratio 1.5 $tmp/bpe.valid $src $tgt $prep/valid 1 250 + +for L in $src $tgt; do + cp $tmp/bpe.test.$L $prep/test.$L +done diff --git a/SpeechT5/fairseq/examples/translation/prepare-wmt14en2fr.sh b/SpeechT5/fairseq/examples/translation/prepare-wmt14en2fr.sh new file mode 100644 index 0000000..2ac97a5 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation/prepare-wmt14en2fr.sh @@ -0,0 +1,136 @@ +#!/bin/bash +# Adapted from https://github.com/facebookresearch/MIXER/blob/master/prepareData.sh + +echo 'Cloning Moses github repository (for tokenization scripts)...' +git clone https://github.com/moses-smt/mosesdecoder.git + +echo 'Cloning Subword NMT repository (for BPE pre-processing)...' +git clone https://github.com/rsennrich/subword-nmt.git + +SCRIPTS=mosesdecoder/scripts +TOKENIZER=$SCRIPTS/tokenizer/tokenizer.perl +CLEAN=$SCRIPTS/training/clean-corpus-n.perl +NORM_PUNC=$SCRIPTS/tokenizer/normalize-punctuation.perl +REM_NON_PRINT_CHAR=$SCRIPTS/tokenizer/remove-non-printing-char.perl +BPEROOT=subword-nmt/subword_nmt +BPE_TOKENS=40000 + +URLS=( + "http://statmt.org/wmt13/training-parallel-europarl-v7.tgz" + "http://statmt.org/wmt13/training-parallel-commoncrawl.tgz" + "http://statmt.org/wmt13/training-parallel-un.tgz" + "http://statmt.org/wmt14/training-parallel-nc-v9.tgz" + "http://statmt.org/wmt10/training-giga-fren.tar" + "http://statmt.org/wmt14/test-full.tgz" +) +FILES=( + "training-parallel-europarl-v7.tgz" + "training-parallel-commoncrawl.tgz" + "training-parallel-un.tgz" + "training-parallel-nc-v9.tgz" + "training-giga-fren.tar" + "test-full.tgz" +) +CORPORA=( + "training/europarl-v7.fr-en" + "commoncrawl.fr-en" + "un/undoc.2000.fr-en" + "training/news-commentary-v9.fr-en" + "giga-fren.release2.fixed" +) + +if [ ! -d "$SCRIPTS" ]; then + echo "Please set SCRIPTS variable correctly to point to Moses scripts." + exit +fi + +src=en +tgt=fr +lang=en-fr +prep=wmt14_en_fr +tmp=$prep/tmp +orig=orig + +mkdir -p $orig $tmp $prep + +cd $orig + +for ((i=0;i<${#URLS[@]};++i)); do + file=${FILES[i]} + if [ -f $file ]; then + echo "$file already exists, skipping download" + else + url=${URLS[i]} + wget "$url" + if [ -f $file ]; then + echo "$url successfully downloaded." + else + echo "$url not successfully downloaded." + exit -1 + fi + if [ ${file: -4} == ".tgz" ]; then + tar zxvf $file + elif [ ${file: -4} == ".tar" ]; then + tar xvf $file + fi + fi +done + +gunzip giga-fren.release2.fixed.*.gz +cd .. + +echo "pre-processing train data..." +for l in $src $tgt; do + rm $tmp/train.tags.$lang.tok.$l + for f in "${CORPORA[@]}"; do + cat $orig/$f.$l | \ + perl $NORM_PUNC $l | \ + perl $REM_NON_PRINT_CHAR | \ + perl $TOKENIZER -threads 8 -a -l $l >> $tmp/train.tags.$lang.tok.$l + done +done + +echo "pre-processing test data..." +for l in $src $tgt; do + if [ "$l" == "$src" ]; then + t="src" + else + t="ref" + fi + grep '<seg id' $orig/test-full/newstest2014-fren-$t.$l.sgm | \ + sed -e 's/<seg id="[0-9]*">\s*//g' | \ + sed -e 's/\s*<\/seg>\s*//g' | \ + sed -e "s/\’/\'/g" | \ + perl $TOKENIZER -threads 8 -a -l $l > $tmp/test.$l + echo "" +done + +echo "splitting train and valid..." +for l in $src $tgt; do + awk '{if (NR%1333 == 0) print $0; }' $tmp/train.tags.$lang.tok.$l > $tmp/valid.$l + awk '{if (NR%1333 != 0) print $0; }' $tmp/train.tags.$lang.tok.$l > $tmp/train.$l +done + +TRAIN=$tmp/train.fr-en +BPE_CODE=$prep/code +rm -f $TRAIN +for l in $src $tgt; do + cat $tmp/train.$l >> $TRAIN +done + +echo "learn_bpe.py on ${TRAIN}..." +python $BPEROOT/learn_bpe.py -s $BPE_TOKENS < $TRAIN > $BPE_CODE + +for L in $src $tgt; do + for f in train.$L valid.$L test.$L; do + echo "apply_bpe.py to ${f}..." + python $BPEROOT/apply_bpe.py -c $BPE_CODE < $tmp/$f > $tmp/bpe.$f + done +done + +perl $CLEAN -ratio 1.5 $tmp/bpe.train $src $tgt $prep/train 1 250 +perl $CLEAN -ratio 1.5 $tmp/bpe.valid $src $tgt $prep/valid 1 250 + +for L in $src $tgt; do + cp $tmp/bpe.test.$L $prep/test.$L +done diff --git a/SpeechT5/fairseq/examples/translation_moe/README.md b/SpeechT5/fairseq/examples/translation_moe/README.md new file mode 100644 index 0000000..2e5c8af --- /dev/null +++ b/SpeechT5/fairseq/examples/translation_moe/README.md @@ -0,0 +1,89 @@ +# Mixture Models for Diverse Machine Translation: Tricks of the Trade (Shen et al., 2019) + +This page includes instructions for reproducing results from the paper [Mixture Models for Diverse Machine Translation: Tricks of the Trade (Shen et al., 2019)](https://arxiv.org/abs/1902.07816). + +## Download data + +First, follow the [instructions to download and preprocess the WMT'17 En-De dataset](../translation#prepare-wmt14en2desh). +Make sure to learn a joint vocabulary by passing the `--joined-dictionary` option to `fairseq-preprocess`. + +## Train a model + +Then we can train a mixture of experts model using the `translation_moe` task. +Use the `--method` flag to choose the MoE variant; we support hard mixtures with a learned or uniform prior (`--method hMoElp` and `hMoEup`, respectively) and soft mixures (`--method sMoElp` and `sMoEup`). +The model is trained with online responsibility assignment and shared parameterization. + +The following command will train a `hMoElp` model with `3` experts: +```bash +fairseq-train --ddp-backend='legacy_ddp' \ + data-bin/wmt17_en_de \ + --max-update 100000 \ + --task translation_moe --user-dir examples/translation_moe/translation_moe_src \ + --method hMoElp --mean-pool-gating-network \ + --num-experts 3 \ + --arch transformer_wmt_en_de --share-all-embeddings \ + --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 \ + --lr-scheduler inverse_sqrt --warmup-init-lr 1e-07 --warmup-updates 4000 \ + --lr 0.0007 \ + --dropout 0.1 --weight-decay 0.0 --criterion cross_entropy \ + --max-tokens 3584 +``` + +## Translate + +Once a model is trained, we can generate translations from different experts using the `--gen-expert` option. +For example, to generate from expert 0: +```bash +fairseq-generate data-bin/wmt17_en_de \ + --path checkpoints/checkpoint_best.pt \ + --beam 1 --remove-bpe \ + --task translation_moe --user-dir examples/translation_moe/translation_moe_src \ + --method hMoElp --mean-pool-gating-network \ + --num-experts 3 \ + --gen-expert 0 +``` + +## Evaluate + +First download a tokenized version of the WMT'14 En-De test set with multiple references: +```bash +wget dl.fbaipublicfiles.com/fairseq/data/wmt14-en-de.extra_refs.tok +``` + +Next apply BPE on the fly and run generation for each expert: +```bash +BPE_CODE=examples/translation/wmt17_en_de/code +for EXPERT in $(seq 0 2); do \ + cat wmt14-en-de.extra_refs.tok \ + | grep ^S | cut -f 2 \ + | fairseq-interactive data-bin/wmt17_en_de \ + --path checkpoints/checkpoint_best.pt \ + --beam 1 \ + --bpe subword_nmt --bpe-codes $BPE_CODE \ + --buffer-size 500 --max-tokens 6000 \ + --task translation_moe --user-dir examples/translation_moe/translation_moe_src \ + --method hMoElp --mean-pool-gating-network \ + --num-experts 3 \ + --gen-expert $EXPERT ; \ +done > wmt14-en-de.extra_refs.tok.gen.3experts +``` + +Finally use `score_moe.py` to compute pairwise BLUE and average oracle BLEU: +```bash +python examples/translation_moe/score.py --sys wmt14-en-de.extra_refs.tok.gen.3experts --ref wmt14-en-de.extra_refs.tok +# pairwise BLEU: 48.26 +# #refs covered: 2.11 +# multi-reference BLEU (leave-one-out): 59.46 +``` +This matches row 3 from Table 7 in the paper. + +## Citation + +```bibtex +@article{shen2019mixture, + title = {Mixture Models for Diverse Machine Translation: Tricks of the Trade}, + author = {Tianxiao Shen and Myle Ott and Michael Auli and Marc'Aurelio Ranzato}, + journal = {International Conference on Machine Learning}, + year = 2019, +} +``` diff --git a/SpeechT5/fairseq/examples/translation_moe/score.py b/SpeechT5/fairseq/examples/translation_moe/score.py new file mode 100644 index 0000000..9a529a9 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation_moe/score.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Scoring script for computing pairwise BLEU and multi-ref BLEU over a set of +candidate hypotheses. + +See `"Mixture Models for Diverse Machine Translation: Tricks of the Trade" +(Shen et al., 2019) <https://arxiv.org/abs/1902.07816>`_. +""" + +import argparse +import random +import sys +from itertools import chain + +import numpy as np +from sacrebleu import compute_bleu, corpus_bleu as _corpus_bleu + + +def main(): + parser = argparse.ArgumentParser(sys.argv[0]) + parser.add_argument( + "--sys", nargs="*", default="", metavar="FILE", help="path to system output" + ) + parser.add_argument("--ref", default="", metavar="FILE", help="path to references") + parser.add_argument( + "--output", + default="", + metavar="FILE", + help="print outputs into a pretty format", + ) + args = parser.parse_args() + + if args.sys: + src, tgt, hypos, log_probs = load_sys(args.sys) + print("pairwise BLEU: %.2f" % pairwise(hypos)) + if args.output: + merge(src, tgt, hypos, log_probs, args.output) + + if args.ref: + _, _, refs = load_ref(args.ref) + if args.sys: + multi_ref(refs, hypos) + else: + intra_ref(refs) + + +def dictolist(d): + a = sorted(d.items(), key=lambda i: i[0]) + return [i[1] for i in a] + + +def load_sys(paths): + src, tgt, hypos, log_probs = {}, {}, {}, {} + for path in paths: + with open(path) as f: + for line in f: + line = line.rstrip() + # S: source + # T: target + # D: detokenized system output + if line.startswith(("S-", "T-", "D-")): + i = int(line[line.find("-") + 1 : line.find("\t")]) + if line.startswith("S-"): + src[i] = line.split("\t")[1] + if line.startswith("T-"): + tgt[i] = line.split("\t")[1] + if line.startswith("D-"): + if i not in hypos: + hypos[i] = [] + log_probs[i] = [] + hypos[i].append(line.split("\t")[2]) + log_probs[i].append(float(line.split("\t")[1])) + return dictolist(src), dictolist(tgt), dictolist(hypos), dictolist(log_probs) + + +def load_ref(path): + with open(path) as f: + lines = f.readlines() + src, tgt, refs = [], [], [] + i = 0 + while i < len(lines): + if lines[i].startswith("S-"): + src.append(lines[i].split("\t")[1].rstrip()) + i += 1 + elif lines[i].startswith("T-"): + tgt.append(lines[i].split("\t")[1].rstrip()) + i += 1 + else: + a = [] + while i < len(lines) and lines[i].startswith("R"): + a.append(lines[i].split("\t")[1].rstrip()) + i += 1 + refs.append(a) + return src, tgt, refs + + +def merge(src, tgt, hypos, log_probs, path): + with open(path, "w") as f: + for s, t, hs, lps in zip(src, tgt, hypos, log_probs): + f.write(s + "\n") + f.write(t + "\n") + f.write("\n") + for h, lp in zip(hs, lps): + f.write("\t%f\t%s\n" % (lp, h.strip())) + f.write("------------------------------------------------------\n") + + +def corpus_bleu(sys_stream, ref_streams): + bleu = _corpus_bleu(sys_stream, ref_streams, tokenize="none") + return bleu.score + + +def sentence_bleu(hypothesis, reference): + bleu = _corpus_bleu(hypothesis, reference) + for i in range(1, 4): + bleu.counts[i] += 1 + bleu.totals[i] += 1 + bleu = compute_bleu( + bleu.counts, + bleu.totals, + bleu.sys_len, + bleu.ref_len, + smooth_method="exp", + ) + return bleu.score + + +def pairwise(sents): + _ref, _hypo = [], [] + for s in sents: + for i in range(len(s)): + for j in range(len(s)): + if i != j: + _ref.append(s[i]) + _hypo.append(s[j]) + return corpus_bleu(_hypo, [_ref]) + + +def multi_ref(refs, hypos): + _ref, _hypo = [], [] + ref_cnt = 0 + assert len(refs) == len(hypos) + + # count number of refs covered + for rs, hs in zip(refs, hypos): + a = set() + for h in hs: + s = [sentence_bleu(h, r) for r in rs] + j = np.argmax(s) + _ref.append(rs[j]) + _hypo.append(h) + best = [k for k in range(len(rs)) if s[k] == s[j]] + a.add(random.choice(best)) + ref_cnt += len(a) + print("#refs covered: %.2f" % (ref_cnt / len(refs))) + + # transpose refs and hypos + refs = list(zip(*refs)) + hypos = list(zip(*hypos)) + + # compute multi-ref corpus BLEU (leave-one-out to be comparable to intra_ref) + k = len(hypos) + m = len(refs) + flat_hypos = [hypos[j][i] for i in range(len(hypos[0])) for j in range(k)] + duplicated_refs = [[ref for ref in refs_i for _ in range(k)] for refs_i in refs] + loo_bleus = [] + for held_out_ref in range(m): + remaining_refs = ( + duplicated_refs[:held_out_ref] + duplicated_refs[held_out_ref + 1 :] + ) + assert len(remaining_refs) == m - 1 + loo_bleus.append(corpus_bleu(flat_hypos, remaining_refs)) + print("average multi-reference BLEU (leave-one-out): %.2f" % np.mean(loo_bleus)) + + +def intra_ref(refs): + print("ref pairwise BLEU: %.2f" % pairwise(refs)) + refs = list(zip(*refs)) + m = len(refs) + concat_h = [] + concat_rest = [[] for j in range(m - 1)] + for i, h in enumerate(refs): + rest = refs[:i] + refs[i + 1 :] + concat_h.append(h) + for j in range(m - 1): + concat_rest[j].extend(rest[j]) + concat_h = list(chain.from_iterable(concat_h)) + bleu = corpus_bleu(concat_h, concat_rest) + print("multi-reference BLEU (leave-one-out): %.2f" % bleu) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/__init__.py b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/__init__.py new file mode 100644 index 0000000..c0abe53 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import translation_moe # noqa diff --git a/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/logsumexp_moe.py b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/logsumexp_moe.py new file mode 100644 index 0000000..fb299da --- /dev/null +++ b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/logsumexp_moe.py @@ -0,0 +1,26 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + + +class LogSumExpMoE(torch.autograd.Function): + """Standard LogSumExp forward pass, but use *posterior* for the backward. + + See `"Mixture Models for Diverse Machine Translation: Tricks of the Trade" + (Shen et al., 2019) <https://arxiv.org/abs/1902.07816>`_. + """ + + @staticmethod + def forward(ctx, logp, posterior, dim=-1): + ctx.save_for_backward(posterior) + ctx.dim = dim + return torch.logsumexp(logp, dim=dim) + + @staticmethod + def backward(ctx, grad_output): + (posterior,) = ctx.saved_tensors + grad_logp = grad_output.unsqueeze(ctx.dim) * posterior + return grad_logp, None, None diff --git a/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/mean_pool_gating_network.py b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/mean_pool_gating_network.py new file mode 100644 index 0000000..efc7ae4 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/mean_pool_gating_network.py @@ -0,0 +1,50 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn.functional as F + + +class MeanPoolGatingNetwork(torch.nn.Module): + """A simple mean-pooling gating network for selecting experts. + + This module applies mean pooling over an encoder's output and returns + reponsibilities for each expert. The encoder format is expected to match + :class:`fairseq.models.transformer.TransformerEncoder`. + """ + + def __init__(self, embed_dim, num_experts, dropout=None): + super().__init__() + self.embed_dim = embed_dim + self.num_experts = num_experts + + self.fc1 = torch.nn.Linear(embed_dim, embed_dim) + self.dropout = torch.nn.Dropout(dropout) if dropout is not None else None + self.fc2 = torch.nn.Linear(embed_dim, num_experts) + + def forward(self, encoder_out): + if not ( + "encoder_out" in encoder_out + and "encoder_padding_mask" in encoder_out + and encoder_out["encoder_out"][0].size(2) == self.embed_dim + ): + raise ValueError("Unexpected format for encoder_out") + + # mean pooling over time + encoder_padding_mask = encoder_out["encoder_padding_mask"][0] # B x T + encoder_out = encoder_out["encoder_out"][0].transpose(0, 1) # B x T x C + if encoder_padding_mask is not None: + encoder_out = encoder_out.clone() # required because of transpose above + encoder_out[encoder_padding_mask] = 0 + ntokens = torch.sum(~encoder_padding_mask, dim=1, keepdim=True) + x = torch.sum(encoder_out, dim=1) / ntokens.type_as(encoder_out) + else: + x = torch.mean(encoder_out, dim=1) + + x = torch.tanh(self.fc1(x)) + if self.dropout is not None: + x = self.dropout(x) + x = self.fc2(x) + return F.log_softmax(x, dim=-1, dtype=torch.float32).type_as(x) diff --git a/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/translation_moe.py b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/translation_moe.py new file mode 100644 index 0000000..7f28c32 --- /dev/null +++ b/SpeechT5/fairseq/examples/translation_moe/translation_moe_src/translation_moe.py @@ -0,0 +1,258 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +import torch +from omegaconf import II + +from fairseq import metrics, utils +from fairseq.dataclass import ChoiceEnum +from fairseq.tasks import register_task +from fairseq.tasks.translation import TranslationConfig, TranslationTask + +from .logsumexp_moe import LogSumExpMoE +from .mean_pool_gating_network import MeanPoolGatingNetwork + + +METHOD_CHOICES = ChoiceEnum(["sMoElp", "sMoEup", "hMoElp", "hMoEup"]) + + +@dataclass +class TranslationMoEConfig(TranslationConfig): + method: METHOD_CHOICES = field( + default="hMoEup", + metadata={"help": "MoE method"}, + ) + num_experts: int = field( + default=3, + metadata={"help": "number of experts"}, + ) + mean_pool_gating_network: bool = field( + default=False, + metadata={"help": "use a simple mean-pooling gating network"}, + ) + mean_pool_gating_network_dropout: float = field( + default=0, + metadata={"help": "dropout for mean-pooling gating network"}, + ) + mean_pool_gating_network_encoder_dim: int = field( + default=0, + metadata={"help": "encoder output dim for mean-pooling gating network"}, + ) + gen_expert: int = field( + default=0, + metadata={"help": "which expert to use for generation"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + + +@register_task("translation_moe", dataclass=TranslationMoEConfig) +class TranslationMoETask(TranslationTask): + """ + Translation task for Mixture of Experts (MoE) models. + + See `"Mixture Models for Diverse Machine Translation: Tricks of the Trade" + (Shen et al., 2019) <https://arxiv.org/abs/1902.07816>`_. + + Args: + src_dict (~fairseq.data.Dictionary): dictionary for the source language + tgt_dict (~fairseq.data.Dictionary): dictionary for the target language + + .. note:: + + The translation task is compatible with :mod:`fairseq-train`, + :mod:`fairseq-generate` and :mod:`fairseq-interactive`. + + The translation task provides the following additional command-line + arguments: + + .. argparse:: + :ref: fairseq.tasks.translation_parser + :prog: + """ + + cfg: TranslationMoEConfig + + def __init__(self, cfg: TranslationMoEConfig, src_dict, tgt_dict): + if cfg.method == "sMoElp": + # soft MoE with learned prior + self.uniform_prior = False + self.hard_selection = False + elif cfg.method == "sMoEup": + # soft MoE with uniform prior + self.uniform_prior = True + self.hard_selection = False + elif cfg.method == "hMoElp": + # hard MoE with learned prior + self.uniform_prior = False + self.hard_selection = True + elif cfg.method == "hMoEup": + # hard MoE with uniform prior + self.uniform_prior = True + self.hard_selection = True + + # add indicator tokens for each expert + for i in range(cfg.num_experts): + # add to both dictionaries in case we're sharing embeddings + src_dict.add_symbol("<expert_{}>".format(i)) + tgt_dict.add_symbol("<expert_{}>".format(i)) + + super().__init__(cfg, src_dict, tgt_dict) + + def build_model(self, cfg): + from fairseq import models + + model = models.build_model(cfg, self) + if not self.uniform_prior and not hasattr(model, "gating_network"): + if self.cfg.mean_pool_gating_network: + if self.cfg.mean_pool_gating_network_encoder_dim > 0: + encoder_dim = self.cfg.mean_pool_gating_network_encoder_dim + elif getattr(cfg, "encoder_embed_dim", None): + # assume that encoder_embed_dim is the encoder's output dimension + encoder_dim = cfg.encoder_embed_dim + else: + raise ValueError( + "Must specify --mean-pool-gating-network-encoder-dim" + ) + + if self.cfg.mean_pool_gating_network_dropout > 0: + dropout = self.cfg.mean_pool_gating_network_dropout + elif getattr(cfg, "dropout", None): + dropout = cfg.dropout + else: + raise ValueError("Must specify task.mean_pool_gating_network_dropout") + + model.gating_network = MeanPoolGatingNetwork( + encoder_dim, + self.cfg.num_experts, + dropout, + ) + else: + raise ValueError( + "translation_moe task with learned prior requires the model to " + "have a gating network; try using --mean-pool-gating-network" + ) + return model + + def expert_index(self, i): + return i + self.tgt_dict.index("<expert_0>") + + def _get_loss(self, sample, model, criterion): + assert hasattr( + criterion, "compute_loss" + ), "translation_moe task requires the criterion to implement the compute_loss() method" + + k = self.cfg.num_experts + bsz = sample["target"].size(0) + + def get_lprob_y(encoder_out, prev_output_tokens_k): + net_output = model.decoder( + prev_output_tokens=prev_output_tokens_k, + encoder_out=encoder_out, + ) + loss, _ = criterion.compute_loss(model, net_output, sample, reduce=False) + loss = loss.view(bsz, -1) + return -loss.sum(dim=1, keepdim=True) # -> B x 1 + + def get_lprob_yz(winners=None): + encoder_out = model.encoder( + src_tokens=sample["net_input"]["src_tokens"], + src_lengths=sample["net_input"]["src_lengths"], + ) + + if winners is None: + lprob_y = [] + for i in range(k): + prev_output_tokens_k = sample["net_input"][ + "prev_output_tokens" + ].clone() + assert not prev_output_tokens_k.requires_grad + prev_output_tokens_k[:, 0] = self.expert_index(i) + lprob_y.append(get_lprob_y(encoder_out, prev_output_tokens_k)) + lprob_y = torch.cat(lprob_y, dim=1) # -> B x K + else: + prev_output_tokens_k = sample["net_input"]["prev_output_tokens"].clone() + prev_output_tokens_k[:, 0] = self.expert_index(winners) + lprob_y = get_lprob_y(encoder_out, prev_output_tokens_k) # -> B + + if self.uniform_prior: + lprob_yz = lprob_y + else: + lprob_z = model.gating_network(encoder_out) # B x K + if winners is not None: + lprob_z = lprob_z.gather(dim=1, index=winners.unsqueeze(-1)) + lprob_yz = lprob_y + lprob_z.type_as(lprob_y) # B x K + + return lprob_yz + + # compute responsibilities without dropout + with utils.model_eval(model): # disable dropout + with torch.no_grad(): # disable autograd + lprob_yz = get_lprob_yz() # B x K + prob_z_xy = torch.nn.functional.softmax(lprob_yz, dim=1) + assert not prob_z_xy.requires_grad + + # compute loss with dropout + if self.hard_selection: + winners = prob_z_xy.max(dim=1)[1] + loss = -get_lprob_yz(winners) + else: + lprob_yz = get_lprob_yz() # B x K + loss = -LogSumExpMoE.apply(lprob_yz, prob_z_xy, 1) + + loss = loss.sum() + sample_size = ( + sample["target"].size(0) if self.cfg.sentence_avg else sample["ntokens"] + ) + logging_output = { + "loss": utils.item(loss.data), + "ntokens": sample["ntokens"], + "nsentences": bsz, + "sample_size": sample_size, + "posterior": prob_z_xy.float().sum(dim=0).cpu(), + } + return loss, sample_size, logging_output + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + model.train() + loss, sample_size, logging_output = self._get_loss(sample, model, criterion) + if ignore_grad: + loss *= 0 + optimizer.backward(loss) + return loss, sample_size, logging_output + + def valid_step(self, sample, model, criterion): + model.eval() + with torch.no_grad(): + loss, sample_size, logging_output = self._get_loss(sample, model, criterion) + return loss, sample_size, logging_output + + def inference_step( + self, + generator, + models, + sample, + prefix_tokens=None, + expert=None, + constraints=None, + ): + expert = expert or self.cfg.gen_expert + with torch.no_grad(): + return generator.generate( + models, + sample, + prefix_tokens=prefix_tokens, + constraints=constraints, + bos_token=self.expert_index(expert), + ) + + def reduce_metrics(self, logging_outputs, criterion): + super().reduce_metrics(logging_outputs, criterion) + metrics.log_scalar( + "posterior", + sum(log["posterior"] for log in logging_outputs if "posterior" in log), + ) diff --git a/SpeechT5/fairseq/examples/truncated_bptt/README.md b/SpeechT5/fairseq/examples/truncated_bptt/README.md new file mode 100644 index 0000000..86518c9 --- /dev/null +++ b/SpeechT5/fairseq/examples/truncated_bptt/README.md @@ -0,0 +1,70 @@ +# Truncated Backpropagation Through Time (BPTT) + +Truncated BPTT is a useful technique for training language models on very long +sequences. Typically a long sequences is split into chunks and a language model +is trained over the chunks sequentially. The LM may condition on previous +chunks, but gradients only flow through the current chunk. This technique was +the basis for the paper: [Transformer-XL: Attentive Language Models Beyond a +Fixed-Length Context](https://arxiv.org/abs/1901.02860), which achieved +state-of-the-art language modeling results at the time of publication. + +It is slightly tricky to implement Truncated BPTT efficiently in fairseq, since +we need to iterate over the data sequentially and disable any batch shuffling +logic. The code provided in this example illustrates how to implement Truncated +BPTT in fairseq by overriding ``FairseqTask::get_batch_iterator`` to iterate +over the data sequentially. Crucially, this example supports batching and +multi-GPU (data parallel) training. + +##### 0. Setup + +First, see the general [language modeling README](README.md) for instructions on +preprocessing the WikiText-103 data. + +##### 1. Train a Transformer-XL model on WikiText-103 + +We will train a 16-layer Transformer-XL model following the [hyperparameters +used in the original +paper](https://github.com/kimiyoung/transformer-xl/blob/master/pytorch/run_wt103_base.sh). + +The following command assumes 4 GPUs, so that the total batch size is 60 +sequences (15 x 4). Training should take ~24 hours on 4 V100 GPUs: +```bash +CUDA_VISIBLE_DEVICES=0,1,2,3 fairseq-train \ + --user-dir examples/truncated_bptt \ + data-bin/wikitext-103/ \ + --task truncated_bptt_lm --tokens-per-sample 150 \ + --batch-size 15 --max-update 200000 \ + --arch transformer_xl --n-layer 16 --d-model 410 --n-head 10 \ + --d-head 41 --d-inner 2100 --dropout 0.1 --dropatt 0.0 --mem-len 150 \ + --optimizer adam --clip-norm 0.25 \ + --lr-scheduler cosine --warmup-updates 0 --min-lr 0.0 --lr 0.00025 \ + --log-format json --log-interval 25 \ + --fp16 +``` + +If training on a single GPU, set `--update-freq=4` to accumulate 4x gradients +and simulate training on 4 GPUs. + +##### 2. Evaluate + +```bash +fairseq-eval-lm data-bin/wikitext-103/ \ + --path checkpoints/checkpoint_best.pt \ + --user-dir examples/truncated_bptt/ \ + --task truncated_bptt_lm \ + --batch-size 1 --required-batch-size-multiple 1 \ + --model-overrides '{"mem_len":640,"clamp_len":400,"same_length":True}' \ + --tokens-per-sample 64 +# ... | INFO | fairseq_cli.eval_lm | num. model params: 151123537 +# ... | INFO | fairseq_cli.eval_lm | Evaluated 245569 tokens in 83.1s (2956.82 tokens/s) +# ... | INFO | fairseq_cli.eval_lm | Loss (base 2): 4.5668, Perplexity: 23.70 +# Compare to 24.0 test perplexity from the paper +``` + +*Note:* During training the model saw 150 tokens of context +(``--tokens-per-sample=150``) and 150 extra memory tokens (``--mem-len=150``). +During evaluation we measure perplexity on sequences of 64 tokens +(``--tokens-per-sample=64``) and increase the memory length +(``--model-overrides='{"mem_len":640}'``). These settings match the evaluation +settings from [the original +paper](https://github.com/kimiyoung/transformer-xl/blob/master/pytorch/run_wt103_base.sh). diff --git a/SpeechT5/fairseq/examples/truncated_bptt/__init__.py b/SpeechT5/fairseq/examples/truncated_bptt/__init__.py new file mode 100644 index 0000000..eee484d --- /dev/null +++ b/SpeechT5/fairseq/examples/truncated_bptt/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import transformer_xl_model, truncated_bptt_lm_task # noqa diff --git a/SpeechT5/fairseq/examples/truncated_bptt/transformer_xl_model.py b/SpeechT5/fairseq/examples/truncated_bptt/transformer_xl_model.py new file mode 100644 index 0000000..a6c8b25 --- /dev/null +++ b/SpeechT5/fairseq/examples/truncated_bptt/transformer_xl_model.py @@ -0,0 +1,155 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from dataclasses import dataclass, field +from typing import Dict, List, Optional + +import torch +from fairseq.dataclass import FairseqDataclass +from fairseq.models import ( + FairseqIncrementalDecoder, + FairseqLanguageModel, + register_model, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from omegaconf import II + + +logger = logging.getLogger(__name__) + + +@dataclass +class TransformerXLConfig(FairseqDataclass): + # defaults come from the original Transformer-XL code + cutoffs: List[int] = field(default_factory=lambda: [20000, 40000, 200000]) + d_model: int = 500 + n_head: int = 10 + d_head: int = 50 + d_inner: int = 1000 + div_val: int = 1 + n_layer: int = 12 + mem_len: int = 0 + clamp_len: int = -1 + same_length: bool = False + dropout: float = 0.0 + dropatt: float = 0.0 + checkpoint_activations: bool = False + offload_activations: bool = False + max_target_positions: int = II("task.max_target_positions") + + +@register_model("transformer_xl", dataclass=TransformerXLConfig) +class TransformerXLLanguageModel(FairseqLanguageModel): + @classmethod + def build_model(cls, cfg: TransformerXLConfig, task): + return cls(TransformerXLDecoder(cfg, task)) + + +class TransformerXLDecoder(FairseqIncrementalDecoder): + def __init__(self, cfg, task): + try: + from transformers.models.transfo_xl import ( + TransfoXLConfig, + TransfoXLLMHeadModel, + ) + except ImportError: + from transformers.configuration_transfo_xl import TransfoXLConfig + from transformers.modeling_transfo_xl import TransfoXLLMHeadModel + + super().__init__(task.target_dictionary) + self.cfg = cfg + + # remove any cutoffs larger than the vocab size + cutoffs = [ + cutoff for cutoff in cfg.cutoffs if cutoff < len(task.target_dictionary) + ] + + config = TransfoXLConfig( + vocab_size=len(task.target_dictionary), + cutoffs=cutoffs, + d_model=cfg.d_model, + d_embed=cfg.d_model, + n_head=cfg.n_head, + d_head=cfg.d_head, + d_inner=cfg.d_inner, + div_val=cfg.div_val, + n_layer=cfg.n_layer, + mem_len=cfg.mem_len, + clamp_len=cfg.clamp_len, + same_length=cfg.same_length, + dropout=cfg.dropout, + dropatt=cfg.dropatt, + ) + logger.info(config) + self.model = TransfoXLLMHeadModel(config) + + # Workaround a bug in huggingface's ``ProjectedAdaptiveLogSoftmax`` + # which adds ``None`` values to an ``nn.ParameterList``, which is not + # supported in PyTorch. Instead we can replace this with an + # ``nn.ModuleList``, which does support ``None`` values. + try: + if all(p is None for p in self.model.crit.out_projs._parameters.values()): + self.model.crit.out_projs = torch.nn.ModuleList( + [None] * len(self.model.crit.out_projs._parameters) + ) + except Exception: + pass + + if cfg.checkpoint_activations or cfg.offload_activations: + for i in range(len(self.model.transformer.layers)): + self.model.transformer.layers[i] = checkpoint_wrapper( + self.model.transformer.layers[i], + offload_to_cpu=cfg.offload_activations, + ) + # TODO: may save mem to wrap(layer.pos_ff.CoreNet[3]) + + self._mems = None + + def forward( + self, + src_tokens, + src_lengths=None, # unused + incremental_state: Optional[Dict[str, List[torch.Tensor]]] = None, + encoder_out=None, + ): + if incremental_state is not None: # used during inference + mems = self.get_incremental_state(incremental_state, "mems") + src_tokens = src_tokens[:, -1:] # only keep the most recent token + else: + mems = self._mems + + output = self.model( + input_ids=src_tokens, + mems=mems, + return_dict=False, + ) + + if len(output) >= 2: + if incremental_state is not None: + self.set_incremental_state(incremental_state, "mems", output[1]) + else: + self._mems = output[1] + + return (output[0],) + + def max_positions(self): + return self.cfg.max_target_positions + + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[torch.Tensor]]], + new_order: torch.Tensor, + ): + """Reorder incremental state. + + This will be called when the order of the input has changed from the + previous time step. A typical use case is beam search, where the input + order changes between time steps based on the selection of beams. + """ + mems = self.get_incremental_state(incremental_state, "mems") + if mems is not None: + new_mems = [mems_i.index_select(1, new_order) for mems_i in mems] + self.set_incremental_state(incremental_state, "mems", new_mems) diff --git a/SpeechT5/fairseq/examples/truncated_bptt/truncated_bptt_lm_task.py b/SpeechT5/fairseq/examples/truncated_bptt/truncated_bptt_lm_task.py new file mode 100644 index 0000000..02be0e7 --- /dev/null +++ b/SpeechT5/fairseq/examples/truncated_bptt/truncated_bptt_lm_task.py @@ -0,0 +1,281 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +from dataclasses import dataclass, field +from typing import List, Optional, Tuple + +import torch +from fairseq import utils +from fairseq.data import ( + Dictionary, + TokenBlockDataset, + data_utils, + iterators, +) +from fairseq.dataclass import FairseqDataclass +from fairseq.distributed import utils as dist_utils +from fairseq.tasks import FairseqTask, register_task +from omegaconf import II + + +logger = logging.getLogger(__name__) + + +@dataclass +class TruncatedBPTTLMConfig(FairseqDataclass): + data: str = field(default="???", metadata={"help": "path to data directory"}) + tokens_per_sample: int = field( + default=1024, + metadata={"help": "max number of tokens per sequence"}, + ) + batch_size: int = II("dataset.batch_size") + # Some models use *max_target_positions* to know how many positional + # embeddings to learn. We use II(...) to make it default to + # *tokens_per_sample*, but in principle there could be more positional + # embeddings than tokens in a single batch. This may also be irrelevant for + # custom model implementations. + max_target_positions: int = II("task.tokens_per_sample") + # these will be populated automatically if not provided + data_parallel_rank: Optional[int] = None + data_parallel_size: Optional[int] = None + + +@register_task("truncated_bptt_lm", dataclass=TruncatedBPTTLMConfig) +class TruncatedBPTTLMTask(FairseqTask): + def __init__(self, cfg: TruncatedBPTTLMConfig): + super().__init__(cfg) + + if cfg.data_parallel_rank is None or cfg.data_parallel_size is None: + if torch.distributed.is_initialized(): + cfg.data_parallel_rank = dist_utils.get_data_parallel_rank() + cfg.data_parallel_size = dist_utils.get_data_parallel_world_size() + else: + cfg.data_parallel_rank = 0 + cfg.data_parallel_size = 1 + + # load the dictionary + paths = utils.split_paths(cfg.data) + assert len(paths) > 0 + self.dictionary = Dictionary.load(os.path.join(paths[0], "dict.txt")) + logger.info("dictionary: {} types".format(len(self.dictionary))) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split (e.g., train, valid, test)""" + + # support sharded datasets + paths = utils.split_paths(self.cfg.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + split_path = os.path.join(data_path, split) + + # each element of *data* will be a tensorized line from the original + # text dataset, similar to ``open(split_path).readlines()`` + data = data_utils.load_indexed_dataset( + split_path, self.dictionary, combine=combine + ) + if data is None: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, split_path) + ) + + # this is similar to ``data.view(-1).split(tokens_per_sample)`` + data = TokenBlockDataset( + data, + data.sizes, + block_size=self.cfg.tokens_per_sample, + pad=None, # unused + eos=None, # unused + break_mode="none", + ) + + self.datasets[split] = TruncatedBPTTDataset( + data=data, + bsz_per_shard=self.cfg.batch_size, + shard_id=self.cfg.data_parallel_rank, + num_shards=self.cfg.data_parallel_size, + ) + + def dataset(self, split): + return self.datasets[split] + + def get_batch_iterator( + self, dataset, num_workers=0, epoch=1, data_buffer_size=0, **kwargs + ): + return iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=self._collate_fn, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + # we don't use the batching functionality from EpochBatchIterator; + # instead every item in *dataset* is a whole batch + batch_sampler=[[i] for i in range(len(dataset))], + disable_shuffling=True, + ) + + def _collate_fn(self, items: List[List[torch.Tensor]]): + # we don't use fairseq's batching functionality, so we expect a single + # Tensor of type List[torch.Tensor] + assert len(items) == 1 + + # item will have shape B x T (the last batch may have length < T) + id, item = items[0] + item = data_utils.collate_tokens(item, pad_idx=self.source_dictionary.pad()) + B, T = item.size() + + # shift item one position over and append a padding token for the target + target = torch.nn.functional.pad( + item[:, 1:], (0, 1, 0, 0), value=self.target_dictionary.pad() + ) + + # fairseq expects batches to have the following structure + return { + "id": torch.tensor([id]*item.size(0)), + "net_input": { + "src_tokens": item, + }, + "target": target, + "nsentences": item.size(0), + "ntokens": item.numel(), + } + + def build_dataset_for_inference( + self, src_tokens: List[torch.Tensor], src_lengths: List[int], **kwargs + ) -> torch.utils.data.Dataset: + eos = self.source_dictionary.eos() + dataset = TokenBlockDataset( + src_tokens, + src_lengths, + block_size=None, # ignored for "eos" break mode + pad=self.source_dictionary.pad(), + eos=eos, + break_mode="eos", + ) + + class Dataset(torch.utils.data.Dataset): + def __getitem__(self, i): + item = dataset[i] + if item[-1] == eos: + # remove eos to support generating with a prefix + item = item[:-1] + return (i, [item]) + + def __len__(self): + return len(dataset) + + return Dataset() + + def inference_step( + self, generator, models, sample, prefix_tokens=None, constraints=None + ): + with torch.no_grad(): + if constraints is not None: + raise NotImplementedError + + # SequenceGenerator doesn't use *src_tokens* directly, we need to + # pass the *prefix_tokens* argument instead. + if prefix_tokens is None and sample["net_input"]["src_tokens"].nelement(): + prefix_tokens = sample["net_input"]["src_tokens"] + + # begin generation with the end-of-sentence token + bos_token = self.source_dictionary.eos() + + return generator.generate( + models, sample, prefix_tokens=prefix_tokens, bos_token=bos_token + ) + + def eval_lm_dataloader( + self, + dataset, + max_tokens: Optional[int] = 36000, + batch_size: Optional[int] = None, + max_positions: Optional[int] = None, + num_shards: int = 1, + shard_id: int = 0, + num_workers: int = 1, + data_buffer_size: int = 10, + context_window: int = 0, + ): + if context_window > 0: + raise NotImplementedError( + "Transformer-XL doesn't need --context-window, try " + "--model-overrides '{\"mem_len\":42}' instead " + ) + return self.get_batch_iterator( + dataset=dataset, + max_tokens=max_tokens, + max_sentences=batch_size, + max_positions=max_positions, + ignore_invalid_inputs=True, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + data_buffer_size=data_buffer_size, + ).next_epoch_itr(shuffle=False) + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary + + +class TruncatedBPTTDataset(torch.utils.data.Dataset): + def __init__( + self, + data: List[torch.Tensor], # ordered list of items + bsz_per_shard, # number of items processed per GPUs per forward + shard_id, # current GPU ID + num_shards, # number of GPUs + ): + super().__init__() + self.data = data + + def batchify(data, bsz): + # Work out how cleanly we can divide the dataset into bsz parts. + nbatch = data.size(0) // bsz + # Trim off any extra elements that wouldn't cleanly fit (remainders). + data = data.narrow(0, 0, nbatch * bsz) + # Evenly divide the data across the bsz batches. + data = data.view(bsz, -1).contiguous() + return data + + # total number of sequences processed by all GPUs in each forward pass + global_batch_size = bsz_per_shard * num_shards + + """ + With a 16 item dataset, bsz_per_shard=2 and num_shards=3, + *indices* might look like: + + indices = [[0, 1], + [2, 3], + [4, 5], + [6, 7], + [8, 9], + [10, 11]] + + The size of the TruncatedBPTTDataset instance will be 2, + and shard 1 will see items: + + [(0, [data[4], data[6]]), + (1, [data[5], data[7]])] + """ + indices = batchify(torch.arange(len(data)), global_batch_size) + assert indices.size(0) == global_batch_size + + self.my_indices = indices[ + shard_id * bsz_per_shard : (shard_id + 1) * bsz_per_shard + ] + assert self.my_indices.size(0) == bsz_per_shard + + def __len__(self): + return self.my_indices.size(1) + + def __getitem__(self, i) -> Tuple[int, List[torch.Tensor]]: + return (i, [self.data[idx] for idx in self.my_indices[:, i]]) diff --git a/SpeechT5/fairseq/examples/unsupervised_quality_estimation/README.md b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/README.md new file mode 100644 index 0000000..e86a0d1 --- /dev/null +++ b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/README.md @@ -0,0 +1,126 @@ +# Unsupervised Quality Estimation for Neural Machine Translation (Fomicheva et al., 2020) + +This page includes instructions for reproducing results from the paper [Unsupervised Quality Estimation for Neural +Machine Translation (Fomicheva et al., 2020)](https://arxiv.org/abs/2005.10608) + +## Requirements: + +* mosesdecoder: https://github.com/moses-smt/mosesdecoder +* subword-nmt: https://github.com/rsennrich/subword-nmt +* flores: https://github.com/facebookresearch/flores + +## Download Models and Test Data + +Download translation models and test data from [MLQE dataset repository](https://github.com/facebookresearch/mlqe). + +## Set up: + +Given a testset consisting of source sentences and reference translations: + +* `SRC_LANG`: source language +* `TGT_LANG`: target language +* `INPUT`: input prefix, such that the file `$INPUT.$SRC_LANG` contains source sentences and `$INPUT.$TGT_LANG` +contains the reference sentences +* `OUTPUT_DIR`: output path to store results +* `MOSES_DECODER`: path to mosesdecoder installation +* `BPE_ROOT`: path to subword-nmt installation +* `BPE`: path to BPE model +* `MODEL_DIR`: directory containing the NMT model `.pt` file as well as the source and target vocabularies. +* `TMP`: directory for intermediate temporary files +* `GPU`: if translating with GPU, id of the GPU to use for inference +* `DROPOUT_N`: number of stochastic forward passes + +`$DROPOUT_N` is set to 30 in the experiments reported in the paper. However, we observed that increasing it beyond 10 +does not bring substantial improvements. + +## Translate the data using standard decoding + +Preprocess the input data: +``` +for LANG in $SRC_LANG $TGT_LANG; do + perl $MOSES_DECODER/scripts/tokenizer/tokenizer.perl -threads 80 -a -l $LANG < $INPUT.$LANG > $TMP/preprocessed.tok.$LANG + python $BPE_ROOT/apply_bpe.py -c ${BPE} < $TMP/preprocessed.tok.$LANG > $TMP/preprocessed.tok.bpe.$LANG +done +``` + +Binarize the data for faster translation: + +``` +fairseq-preprocess --srcdict $MODEL_DIR/dict.$SRC_LANG.txt --tgtdict $MODEL_DIR/dict.$TGT_LANG.txt +--source-lang ${SRC_LANG} --target-lang ${TGT_LANG} --testpref $TMP/preprocessed.tok.bpe --destdir $TMP/bin --workers 4 +``` + +Translate + +``` +CUDA_VISIBLE_DEVICES=$GPU fairseq-generate $TMP/bin --path ${MODEL_DIR}/${SRC_LANG}-${TGT_LANG}.pt --beam 5 +--source-lang $SRC_LANG --target-lang $TGT_LANG --no-progress-bar --unkpen 5 > $TMP/fairseq.out +grep ^H $TMP/fairseq.out | cut -d- -f2- | sort -n | cut -f3- > $TMP/mt.out +``` + +Post-process + +``` +sed -r 's/(@@ )| (@@ ?$)//g' < $TMP/mt.out | perl $MOSES_DECODER/scripts/tokenizer/detokenizer.perl +-l $TGT_LANG > $OUTPUT_DIR/mt.out +``` + +## Produce uncertainty estimates + +### Scoring + +Make temporary files to store the translations repeated N times. + +``` +python ${SCRIPTS}/scripts/uncertainty/repeat_lines.py -i $TMP/preprocessed.tok.bpe.$SRC_LANG -n $DROPOUT_N +-o $TMP/repeated.$SRC_LANG +python ${SCRIPTS}/scripts/uncertainty/repeat_lines.py -i $TMP/mt.out -n $DROPOUT_N -o $TMP/repeated.$TGT_LANG + +fairseq-preprocess --srcdict ${MODEL_DIR}/dict.${SRC_LANG}.txt $TGT_DIC --source-lang ${SRC_LANG} +--target-lang ${TGT_LANG} --testpref ${TMP}/repeated --destdir ${TMP}/bin-repeated +``` + +Produce model scores for the generated translations using `--retain-dropout` option to apply dropout at inference time: + +``` +CUDA_VISIBLE_DEVICES=${GPU} fairseq-generate ${TMP}/bin-repeated --path ${MODEL_DIR}/${LP}.pt --beam 5 + --source-lang $SRC_LANG --target-lang $TGT_LANG --no-progress-bar --unkpen 5 --score-reference --retain-dropout + --retain-dropout-modules '["TransformerModel","TransformerEncoder","TransformerDecoder","TransformerEncoderLayer"]' + TransformerDecoderLayer --seed 46 > $TMP/dropout.scoring.out + +grep ^H $TMP/dropout.scoring.out | cut -d- -f2- | sort -n | cut -f2 > $TMP/dropout.scores + +``` + +Use `--retain-dropout-modules` to specify the modules. By default, dropout is applied in the same places +as for training. + +Compute the mean of the resulting output distribution: + +``` +python $SCRIPTS/scripts/uncertainty/aggregate_scores.py -i $TMP/dropout.scores -o $OUTPUT_DIR/dropout.scores.mean +-n $DROPOUT_N +``` + +### Generation + +Produce multiple translation hypotheses for the same source using `--retain-dropout` option: + +``` +CUDA_VISIBLE_DEVICES=${GPU} fairseq-generate ${TMP}/bin-repeated --path ${MODEL_DIR}/${LP}.pt + --beam 5 --source-lang $SRC_LANG --target-lang $TGT_LANG --no-progress-bar --retain-dropout + --unkpen 5 --retain-dropout-modules TransformerModel TransformerEncoder TransformerDecoder +TransformerEncoderLayer TransformerDecoderLayer --seed 46 > $TMP/dropout.generation.out + +grep ^H $TMP/dropout.generation.out | cut -d- -f2- | sort -n | cut -f3- > $TMP/dropout.hypotheses_ + +sed -r 's/(@@ )| (@@ ?$)//g' < $TMP/dropout.hypotheses_ | perl $MOSES_DECODER/scripts/tokenizer/detokenizer.perl +-l $TGT_LANG > $TMP/dropout.hypotheses +``` + +Compute similarity between multiple hypotheses corresponding to the same source sentence using Meteor +evaluation metric: +``` +python meteor.py -i $TMP/dropout.hypotheses -m <path_to_meteor_installation> -n $DROPOUT_N -o +$OUTPUT_DIR/dropout.gen.sim.meteor +``` diff --git a/SpeechT5/fairseq/examples/unsupervised_quality_estimation/aggregate_scores.py b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/aggregate_scores.py new file mode 100644 index 0000000..66d50d0 --- /dev/null +++ b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/aggregate_scores.py @@ -0,0 +1,41 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import sys + +import numpy as np + + +aggregate_funcs = { + "std": np.std, + "var": np.var, + "median": np.median, + "mean": np.mean, + "min": np.min, + "max": np.max, +} + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--input_file", required=True, type=str) + parser.add_argument("-n", "--repeat_times", required=True, type=int) + parser.add_argument("-o", "--output_file", required=False) + parser.add_argument("-f", "--func", required=False, default="mean") + args = parser.parse_args() + + stream = open(args.output_file, "w") if args.output_file else sys.stdout + + segment_scores = [] + for line in open(args.input_file): + segment_scores.append(float(line.strip())) + if len(segment_scores) == args.repeat_times: + stream.write("{}\n".format(aggregate_funcs[args.func](segment_scores))) + segment_scores = [] + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/unsupervised_quality_estimation/meteor.py b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/meteor.py new file mode 100644 index 0000000..2ee0448 --- /dev/null +++ b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/meteor.py @@ -0,0 +1,109 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import math +import os +import subprocess +import sys +import tempfile +from collections import defaultdict +from itertools import combinations + + +def read_translations(path, n_repeats): + segment_counter = 0 + segment_translations = [] + translations = defaultdict(list) + for line in open(path): + segment_translations.append(" ".join(line.split())) + if len(segment_translations) == n_repeats: + translations[segment_counter] = segment_translations + segment_translations = [] + segment_counter += 1 + return translations + + +def generate_input(translations, n_repeats): + _, ref_path = tempfile.mkstemp() + _, mt_path = tempfile.mkstemp() + ref_fh = open(ref_path, "w") + mt_fh = open(mt_path, "w") + for segid in sorted(translations.keys()): + assert len(translations[segid]) == n_repeats + indexes = combinations(range(n_repeats), 2) + for idx1, idx2 in indexes: + mt_fh.write(translations[segid][idx1].strip() + "\n") + ref_fh.write(translations[segid][idx2].strip() + "\n") + sys.stderr.write("\nSaved translations to %s and %s" % (ref_path, mt_path)) + return ref_path, mt_path + + +def run_meteor(ref_path, mt_path, metric_path, lang="en"): + _, out_path = tempfile.mkstemp() + subprocess.call( + [ + "java", + "-Xmx2G", + "-jar", + metric_path, + mt_path, + ref_path, + "-p", + "0.5 0.2 0.6 0.75", # default parameters, only changed alpha to give equal weight to P and R + "-norm", + "-l", + lang, + ], + stdout=open(out_path, "w"), + ) + os.remove(ref_path) + os.remove(mt_path) + sys.stderr.write("\nSaved Meteor output to %s" % out_path) + return out_path + + +def read_output(meteor_output_path, n_repeats): + n_combinations = math.factorial(n_repeats) / ( + math.factorial(2) * math.factorial(n_repeats - 2) + ) + raw_scores = [] + average_scores = [] + for line in open(meteor_output_path): + if not line.startswith("Segment "): + continue + score = float(line.strip().split("\t")[1]) + raw_scores.append(score) + if len(raw_scores) == n_combinations: + average_scores.append(sum(raw_scores) / n_combinations) + raw_scores = [] + os.remove(meteor_output_path) + return average_scores + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--infile") + parser.add_argument("-n", "--repeat_times", type=int) + parser.add_argument("-m", "--meteor") + parser.add_argument("-o", "--output") + args = parser.parse_args() + + translations = read_translations(args.infile, args.repeat_times) + sys.stderr.write("\nGenerating input for Meteor...") + ref_path, mt_path = generate_input(translations, args.repeat_times) + sys.stderr.write("\nRunning Meteor...") + out_path = run_meteor(ref_path, mt_path, args.meteor) + sys.stderr.write("\nReading output...") + scores = read_output(out_path, args.repeat_times) + sys.stderr.write("\nWriting results...") + with open(args.output, "w") as o: + for scr in scores: + o.write("{}\n".format(scr)) + o.close() + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/unsupervised_quality_estimation/repeat_lines.py b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/repeat_lines.py new file mode 100644 index 0000000..5a04851 --- /dev/null +++ b/SpeechT5/fairseq/examples/unsupervised_quality_estimation/repeat_lines.py @@ -0,0 +1,28 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import sys + + +def _normalize_spaces(line): + return " ".join(line.split()) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--input_file", required=True, type=str) + parser.add_argument("-n", "--repeat_times", required=True, type=int) + parser.add_argument("-o", "--output_file", required=False, type=str) + args = parser.parse_args() + stream = open(args.output_file, "w") if args.output_file else sys.stdout + + for line in open(args.input_file): + for _ in range(args.repeat_times): + stream.write(_normalize_spaces(line) + "\n") + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/README.md b/SpeechT5/fairseq/examples/wav2vec/README.md new file mode 100644 index 0000000..238639a --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/README.md @@ -0,0 +1,369 @@ +# wav2vec 2.0 + +wav2vec 2.0 learns speech representations on unlabeled data as described in [wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations (Baevski et al., 2020)](https://arxiv.org/abs/2006.11477). + +We learned speech representations in multiple languages as well in [Unsupervised Cross-lingual Representation Learning for Speech Recognition (Conneau et al., 2020)](https://arxiv.org/abs/2006.13979). + +We also combined wav2vec 2.0 with self-training in [Self-training and Pre-training are Complementary for Speech Recognition (Xu et al., 2020)](https://arxiv.org/abs/2010.11430). + +## Pre-trained models + +Model | Finetuning split | Dataset | Model +|---|---|---|--- +Wav2Vec 2.0 Base | No finetuning | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_small.pt) +Wav2Vec 2.0 Base | 10 minutes | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_small_10m.pt) +Wav2Vec 2.0 Base | 100 hours | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_small_100h.pt) +Wav2Vec 2.0 Base | 960 hours | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_small_960h.pt) +Wav2Vec 2.0 Large | No finetuning | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/libri960_big.pt) +Wav2Vec 2.0 Large | 10 minutes | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_big_10m.pt) +Wav2Vec 2.0 Large | 100 hours | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_big_100h.pt) +Wav2Vec 2.0 Large | 960 hours | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_big_960h.pt) +Wav2Vec 2.0 Large (LV-60)* | No finetuning | [Libri-Light](https://github.com/facebookresearch/libri-light) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_vox_new.pt) +Wav2Vec 2.0 Large (LV-60)* | 10 minutes | [Libri-Light](https://github.com/facebookresearch/libri-light) + [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_vox_10m_new.pt) +Wav2Vec 2.0 Large (LV-60)* | 100 hours | [Libri-Light](https://github.com/facebookresearch/libri-light) + [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_vox_100h_new.pt) +Wav2Vec 2.0 Large (LV-60)* | 960 hours | [Libri-Light](https://github.com/facebookresearch/libri-light) + [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec2_vox_960h_new.pt) +Wav2Vec 2.0 Large (LV-60) + Self Training * | 10 minutes | [Libri-Light](https://github.com/facebookresearch/libri-light) + [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_vox_10m_pl.pt) +Wav2Vec 2.0 Large (LV-60) + Self Training * | 100 hours | [Libri-Light](https://github.com/facebookresearch/libri-light) + [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_vox_100h_pl.pt) +Wav2Vec 2.0 Large (LV-60) + Self Training * | 960 hours | [Libri-Light](https://github.com/facebookresearch/libri-light) + [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_vox_960h_pl.pt) + +\* updated (Oct. 24, 2020) + +We also release multilingual pre-trained wav2vec 2.0 (XLSR) models: + +Model | Architecture | Hours | Languages | Datasets | Model +|---|---|---|---|---|--- +XLSR-53 | Large | 56k | 53 | MLS, CommonVoice, BABEL | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/xlsr_53_56k.pt) + +The XLSR model uses the following datasets for multilingual pretraining: + +* **[MLS: Multilingual LibriSpeech](https://indico2.conference4me.psnc.pl/event/35/contributions/3585/attachments/1060/1101/Wed-2-6-10.pdf)** (8 languages, 50.7k hours): *Dutch, English, French, German, Italian, Polish, Portuguese, Spanish* + +* **[CommonVoice](https://commonvoice.mozilla.org/en/languages)** (36 languages, 3.6k hours): *Arabic, Basque, Breton, Chinese (CN), Chinese (HK), Chinese (TW), Chuvash, Dhivehi, Dutch, English, Esperanto, Estonian, French, German, Hakh-Chin, Indonesian, Interlingua, Irish, Italian, Japanese, Kabyle, Kinyarwanda, Kyrgyz, Latvian, Mongolian, Persian, Portuguese, Russian, Sakha, Slovenian, Spanish, Swedish, Tamil, Tatar, Turkish, Welsh* (see also [finetuning splits]([https://dl.fbaipublicfiles.com/cpc_audio/common_voices_splits.tar.gz]) from [this paper](https://arxiv.org/abs/2002.02848)). + +* **[Babel](https://catalog.ldc.upenn.edu/byyear)** (17 languages, 1.7k hours): *Assamese, Bengali, Cantonese, Cebuano, Georgian, Haitian, Kazakh, Kurmanji, Lao, Pashto, Swahili, Tagalog, Tamil, Tok, Turkish, Vietnamese, Zulu* + + +## Training a new model with the CLI tools + +Given a directory containing wav files to be used for pretraining (we recommend splitting each file into separate file 10 to 30 seconds in length) + +### Prepare training data manifest: + +First, install the `soundfile` library: +```shell script +pip install soundfile +``` + +Next, run: + +```shell script +$ python examples/wav2vec/wav2vec_manifest.py /path/to/waves --dest /manifest/path --ext $ext --valid-percent $valid +``` + +$ext should be set to flac, wav, or whatever format your dataset happens to use that soundfile can read. + +$valid should be set to some reasonable percentage (like 0.01) of training data to use for validation. +To use a pre-defined validation set (like dev-other from librispeech), set to it 0 and then overwrite valid.tsv with a +separately pre-processed manifest file. + +### Train a wav2vec 2.0 base model: + +This configuration was used for the base model trained on the Librispeech dataset in the wav2vec 2.0 paper + +Note that the input is expected to be single channel, sampled at 16 kHz + +```shell script +$ fairseq-hydra-train \ + task.data=/path/to/data \ + --config-dir /path/to/fairseq-py/examples/wav2vec/config/pretraining \ + --config-name wav2vec2_base_librispeech +``` + +Note: you can simulate 64 GPUs by using k GPUs and adding command line parameters (before `--config-dir`) +`distributed_training.distributed_world_size=k` `+optimization.update_freq='[x]'` where x = 64/k + +### Train a wav2vec 2.0 large model: + +This configuration was used for the large model trained on the Libri-light dataset in the wav2vec 2.0 paper + +```shell script +$ fairseq-hydra-train \ + task.data=/path/to/data \ + --config-dir /path/to/fairseq-py/examples/wav2vec/config/pretraining \ + --config-name wav2vec2_large_librivox +``` + +Note: you can simulate 128 GPUs by using k GPUs and adding command line parameters (before `--config-dir`) +`distributed_training.distributed_world_size=k` `+optimization.update_freq='[x]'` where x = 128/k + +### Fine-tune a pre-trained model with CTC: + +Fine-tuning a model requires parallel audio and labels file, as well as a vocabulary file in fairseq format. +A letter vocabulary can be downloaded [here](https://dl.fbaipublicfiles.com/fairseq/wav2vec/dict.ltr.txt). +An example [script](libri_labels.py) that generates labels for the Librispeech dataset from the tsv file produced by wav2vec_manifest.py can be used as follows: + +```shell script +split=train +$ python libri_labels.py /path/to/tsv --output-dir /output/dir --output-name $split +``` + +Fine-tuning on 100h of Librispeech with letter targets: +```shell script +$ fairseq-hydra-train \ + distributed_training.distributed_port=$PORT \ + task.data=/path/to/data \ + model.w2v_path=/path/to/model.pt \ + --config-dir /path/to/fairseq-py/examples/wav2vec/config/finetuning \ + --config-name base_100h +``` + +There are other config files in the config/finetuning directory that can be used to fine-tune on other splits. +You can specify the right config via the `--config-name` parameter. + +Note: you can simulate 24 GPUs by using k GPUs and adding command line parameters (before `--config-dir`) +`distributed_training.distributed_world_size=k` `+optimization.update_freq='[x]'` where x = 24/k + +Decoding with a language model during training requires flashlight [python bindings](https://github.com/facebookresearch/flashlight/tree/master/bindings/python) (previously called [wav2letter](https://github.com/facebookresearch/wav2letter). +If you want to use a language model, add `+criterion.wer_args='[/path/to/kenlm, /path/to/lexicon, 2, -1]'` to the command line. + +### Evaluating a CTC model: + +Evaluating a CTC model with a language model requires [flashlight python bindings](https://github.com/facebookresearch/flashlight/tree/master/bindings/python) (previously called [wav2letter](https://github.com/facebookresearch/wav2letter) to be installed. + +Fairseq transformer language model used in the wav2vec 2.0 paper can be obtained from the [wav2letter model repository](https://github.com/facebookresearch/wav2letter/tree/master/recipes/sota/2019). +Be sure to upper-case the language model vocab after downloading it. + +Letter dictionary for pre-trained models can be found [here](https://dl.fbaipublicfiles.com/fairseq/wav2vec/dict.ltr.txt). + +Next, run the evaluation command: + +```shell script +$subset=dev_other +python examples/speech_recognition/infer.py /checkpoint/abaevski/data/speech/libri/10h/wav2vec/raw --task audio_pretraining \ +--nbest 1 --path /path/to/model --gen-subset $subset --results-path /path/to/save/results/for/sclite --w2l-decoder kenlm \ +--lm-model /path/to/kenlm.bin --lm-weight 2 --word-score -1 --sil-weight 0 --criterion ctc --labels ltr --max-tokens 4000000 \ +--post-process letter +``` + +To get raw numbers, use --w2l-decoder viterbi and omit the lexicon. To use the transformer language model, use --w2l-decoder fairseqlm. + +## Use wav2vec 2.0 with 🤗Transformers: + +Wav2Vec2 is also available in the [🤗Transformers library](https://github.com/huggingface/transformers) since version 4.4. + +Pretrained Models can be found on the [hub](https://huggingface.co/models?filter=wav2vec2) +and documentation can be found [here](https://huggingface.co/transformers/master/model_doc/wav2vec2.html). + +Usage example: + +```python +# !pip install transformers +# !pip install datasets +import soundfile as sf +import torch +from datasets import load_dataset +from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor + +# load pretrained model +processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h") +model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h") + + +librispeech_samples_ds = load_dataset("patrickvonplaten/librispeech_asr_dummy", "clean", split="validation") + +# load audio +audio_input, sample_rate = sf.read(librispeech_samples_ds[0]["file"]) + +# pad input values and return pt tensor +input_values = processor(audio_input, sampling_rate=sample_rate, return_tensors="pt").input_values + +# INFERENCE + +# retrieve logits & take argmax +logits = model(input_values).logits +predicted_ids = torch.argmax(logits, dim=-1) + +# transcribe +transcription = processor.decode(predicted_ids[0]) + +# FINE-TUNE + +target_transcription = "A MAN SAID TO THE UNIVERSE I EXIST" + +# encode labels +with processor.as_target_processor(): + labels = processor(target_transcription, return_tensors="pt").input_ids + +# compute loss by passing labels +loss = model(input_values, labels=labels).loss +loss.backward() +``` + +# wav2vec + +Example to train a wav2vec model as described in [wav2vec: Unsupervised Pre-training for Speech Recognition (Schneider et al., 2019)](https://arxiv.org/abs/1904.05862). + +## Pre-trained models + +Description | Dataset | Model +---|---|--- +Wav2Vec large | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/wav2vec_large.pt) + +#### Example usage: +```python +import torch +import fairseq + +cp_path = '/path/to/wav2vec.pt' +model, cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task([cp_path]) +model = model[0] +model.eval() + +wav_input_16khz = torch.randn(1,10000) +z = model.feature_extractor(wav_input_16khz) +c = model.feature_aggregator(z) +``` + +## Training a new model with the CLI tools + +Given a directory containing wav files to be used for pretraining (we recommend splitting each file into separate files 10 to 30 seconds in length) + +### Prepare training data manifest: + +``` +$ python examples/wav2vec/wav2vec_manifest.py /path/to/waves --dest /manifest/path --ext wav +``` + +### Train a wav2vec model: + +``` +$ python train.py /manifest/path --save-dir /model/path --num-workers 6 --fp16 --max-update 400000 --save-interval 1 --no-epoch-checkpoints \ +--arch wav2vec --task audio_pretraining --min-lr 1e-06 --stop-min-lr 1e-09 --optimizer adam --lr 0.005 --lr-scheduler cosine \ +--conv-feature-layers [(512, 10, 5), (512, 8, 4), (512, 4, 2), (512, 4, 2), (512, 4, 2), (512, 1, 1), (512, 1, 1)] \ +--conv-aggregator-layers [(512, 2, 1), (512, 3, 1), (512, 4, 1), (512, 5, 1), (512, 6, 1), (512, 7, 1), (512, 8, 1), (512, 9, 1), (512, 10, 1), (512, 11, 1), (512, 12, 1), (512, 13, 1)] \ +--skip-connections-agg --residual-scale 0.5 --log-compression --warmup-updates 500 --warmup-init-lr 1e-07 --criterion wav2vec --num-negatives 10 \ +--max-sample-size 150000 --max-tokens 1500000 --skip-invalid-size-inputs-valid-test +``` + +### Run wav2vec2 pre-training on Google Cloud TPUs: + +Wav2Vec2 is now supported on TPUs! It's currently pre-training only. + +#### Using hydra on a v3-8: + +``` +$ OMP_NUM_THREADS=1 fairseq-hydra-train \ + task.data=/manifest/path \ + --config-dir /PATH/TO/FAIRSEQ/examples/wav2vec/config/pretraining \ + --config-name wav2vec2_large_librivox_tpu.yaml +``` + +#### Using command line arguments on a v3-8: + +``` +$ OMP_NUM_THREADS=1 python train.py /manifest/path --save-dir /model/path --num-workers 6 --fp16 --max-update 400000 --save-interval 1 --no-epoch-checkpoints \ +--arch wav2vec2 --task audio_pretraining --min-lr 1e-06 --stop-min-lr 1e-09 --optimizer adam --lr 0.005 --lr-scheduler cosine \ +--conv-feature-layers [(512, 10, 5), (512, 8, 4), (512, 4, 2), (512, 4, 2), (512, 4, 2), (512, 1, 1), (512, 1, 1)] \ +--conv-aggregator-layers [(512, 2, 1), (512, 3, 1), (512, 4, 1), (512, 5, 1), (512, 6, 1), (512, 7, 1), (512, 8, 1), (512, 9, 1), (512, 10, 1), (512, 11, 1), (512, 12, 1), (512, 13, 1)] \ +--skip-connections-agg --residual-scale 0.5 --log-compression --warmup-updates 500 --warmup-init-lr 1e-07 --criterion wav2vec --num-negatives 10 \ +--max-sample-size 150000 --max-tokens 1500000 --skip-invalid-size-inputs-valid-test \ +--tpu --distributed-world-size 8 --num-batch-buckets 3 --enable-padding \ +--encoder-layerdrop 0 --mask-channel-prob 0.1 +``` + +#### Using hydra on a pod slice (v3-N with N > 8): + +``` +$ OMP_NUM_THREADS=1 fairseq-hydra-train \ + task.data=/manifest/path \ + --config-dir /PATH/TO/FAIRSEQ/examples/wav2vec/config/pretraining \ + --config-name wav2vec2_large_librivox_tpu-pod.yaml # edit distributed-world-size accordingly +``` + +#### Using command line arguments on a pod slice (v3-N with N > 8): + + +``` +$ python -m torch_xla.distributed.xla_dist \ + --tpu ${TPUNAME} --conda-env=torch-xla-${TORCH_XLA_VERSION} --env OMP_NUM_THREADS=1 \ + -- \ +python train.py /manifest/path --save-dir /model/path --num-workers 6 --fp16 --max-update 400000 --save-interval 1 --no-epoch-checkpoints \ +--arch wav2vec2 --task audio_pretraining --min-lr 1e-06 --stop-min-lr 1e-09 --optimizer adam --lr 0.005 --lr-scheduler cosine \ +--conv-feature-layers [(512, 10, 5), (512, 8, 4), (512, 4, 2), (512, 4, 2), (512, 4, 2), (512, 1, 1), (512, 1, 1)] \ +--conv-aggregator-layers [(512, 2, 1), (512, 3, 1), (512, 4, 1), (512, 5, 1), (512, 6, 1), (512, 7, 1), (512, 8, 1), (512, 9, 1), (512, 10, 1), (512, 11, 1), (512, 12, 1), (512, 13, 1)] \ +--skip-connections-agg --residual-scale 0.5 --log-compression --warmup-updates 500 --warmup-init-lr 1e-07 --criterion wav2vec --num-negatives 10 \ +--max-sample-size 150000 --max-tokens 1500000 --skip-invalid-size-inputs-valid-test \ +--tpu --distributed-world-size ${WORLD_SIZE} --num-batch-buckets 3 --enable-padding \ +--encoder-layerdrop 0 --mask-channel-prob 0.1 +``` + +### Extract embeddings from the downstream task data: + +``` +$ PYTHONPATH=/path/to/fairseq python examples/wav2vec/wav2vec_featurize.py --input /path/to/task/waves --output /path/to/output \ +--model /model/path/checkpoint_best.pt --split train valid test +``` + +# vq-wav2vec + +Example to train a vq-wav2vec model as described in [vq-wav2vec: Self-Supervised Learning of Discrete Speech Representations (Baevski et al., 2019)](https://arxiv.org/abs/1910.05453). + +These models are also used in [Effectiveness of self-supervised pre-training for speech recognition (Baevski et al., 2019)](https://arxiv.org/abs/1911.03912). + +## Pre-trained models + +Description | Dataset | Model +---|---|--- +vq-wav2vec Gumbel | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/vq-wav2vec.pt) +vq-wav2vec K-means | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/vq-wav2vec_kmeans.pt) +Roberta on K-means codes | [Librispeech](http://www.openslr.org/12) | [download](https://dl.fbaipublicfiles.com/fairseq/wav2vec/bert_kmeans.tar) + +#### Example usage: +```python +import torch +import fairseq + +cp = torch.load('/path/to/vq-wav2vec.pt') +model, cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task([cp]) +model = model[0] +model.eval() + +wav_input_16khz = torch.randn(1,10000) +z = model.feature_extractor(wav_input_16khz) +_, idxs = model.vector_quantizer.forward_idx(z) +print(idxs.shape) # output: torch.Size([1, 60, 2]), 60 timesteps with 2 indexes corresponding to 2 groups in the model +``` + +## Training a new model with the CLI tools + +Given a directory containing wav files to be used for pretraining (we recommend splitting each file into separate file 10 to 30 seconds in length) + +### Prepare training data manifest: + +``` +$ python examples/wav2vec/wav2vec_manifest.py /path/to/waves --dest /manifest/path --ext wav +``` + +### Train a gumbel vq-wav2vec model: + +``` +$ python train.py /manifest/path --save-dir /model/path --num-workers 6 --fp16 --max-update 400000 \ +--save-interval 1 --no-epoch-checkpoints --arch wav2vec --task audio_pretraining --min-lr 1e-06 --stop-min-lr 1e-09 \ +--optimizer adam --lr 1e-05 --lr-scheduler cosine \ +--conv-feature-layers [(512, 10, 5), (512, 8, 4), (512, 4, 2), (512, 4, 2), (512, 4, 2), (512, 1, 1), (512, 1, 1), (512, 1, 1)] \ +--conv-aggregator-layers [(512, 2, 1), (512, 3, 1), (512, 4, 1), (512, 5, 1), (512, 6, 1), (512, 7, 1), (512, 8, 1), (512, 9, 1), (512, 10, 1), (512, 11, 1), (512, 12, 1), (512, 13, 1)] \ +--activation gelu --offset auto --skip-connections-agg --residual-scale 0.5 \ +--log-keys ["prob_perplexity","code_perplexity","temp"] --vq-type gumbel --vq-groups 2 --vq-depth 2 \ +--combine-groups --vq-vars 320 --vq-temp (2,0.5,0.999995) --prediction-steps 12 --warmup-updates 1000 \ +--warmup-init-lr 1e-07 --criterion wav2vec --num-negatives 10 --max-sample-size 150000 \ +--max-tokens 300000 --cross-sample-negatives 0 --update-freq 1 --seed 2 --skip-invalid-size-inputs-valid-test +``` + +for k-means training, set vq-type with "kmeans" and add --loss-weights [1] argument. Pre-trained models were trained on 16 GPUs. + +### Tokenize audio data (e.g. for BERT training): + +``` +$ PYTHONPATH=/path/to/fairseq python examples/wav2vec/vq-wav2vec_featurize.py --data-dir /manifest/path --output-dir /path/to/output \ +--checkpoint /model/path/checkpoint_best.pt --split train valid test --extension tsv +``` diff --git a/SpeechT5/fairseq/examples/wav2vec/__init__.py b/SpeechT5/fairseq/examples/wav2vec/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_100h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_100h.yaml new file mode 100644 index 0000000..539dabb --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_100h.yaml @@ -0,0 +1,59 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: false + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 2 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 80000 + lr: [0.00003] + sentence_avg: true + update_freq: [4] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10h.yaml new file mode 100644 index 0000000..16a3c4d --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10h.yaml @@ -0,0 +1,64 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval: 50 + save_interval_updates: 10000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: false + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: 10000 + validate_interval: 50 + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 2 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 20000 + lr: [0.00005] + sentence_avg: true + update_freq: [4] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.05 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10m.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10m.yaml new file mode 100644 index 0000000..3ceb77a --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_10m.yaml @@ -0,0 +1,64 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval: 1000 + save_interval_updates: 50 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: false + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: 10000 + validate_interval: 1000 + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 2 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 13000 + lr: [0.00005] + sentence_avg: true + update_freq: [4] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_1h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_1h.yaml new file mode 100644 index 0000000..3ceb77a --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_1h.yaml @@ -0,0 +1,64 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval: 1000 + save_interval_updates: 50 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: false + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: 10000 + validate_interval: 1000 + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 2 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 13000 + lr: [0.00005] + sentence_avg: true + update_freq: [4] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_960h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_960h.yaml new file mode 100644 index 0000000..2d38211 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/base_960h.yaml @@ -0,0 +1,58 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: false + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 8 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 320000 + lr: [0.0001] + sentence_avg: true + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.1 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_100h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_100h.yaml new file mode 100644 index 0000000..2fdb0c5 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_100h.yaml @@ -0,0 +1,59 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: true + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 1280000 + skip_invalid_size_inputs_valid_test: true + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 4 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 80000 + lr: [0.00003] + sentence_avg: true + update_freq: [5] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10h.yaml new file mode 100644 index 0000000..f1a979e --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10h.yaml @@ -0,0 +1,64 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval: 50 + save_interval_updates: 10000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: true + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 1280000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: 10000 + validate_interval: 50 + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 4 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 20000 + lr: [0.0001] + sentence_avg: true + update_freq: [5] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.75 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10m.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10m.yaml new file mode 100644 index 0000000..d12439b --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_10m.yaml @@ -0,0 +1,64 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval: 1000 + save_interval_updates: 50 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: true + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 1280000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: 10000 + validate_interval: 1000 + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 4 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 13000 + lr: [0.0001] + sentence_avg: true + update_freq: [5] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_1h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_1h.yaml new file mode 100644 index 0000000..7f3b04c --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_1h.yaml @@ -0,0 +1,64 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval: 1000 + save_interval_updates: 50 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: true + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 1280000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: 10000 + validate_interval: 1000 + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 4 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 13000 + lr: [0.0003] + sentence_avg: true + update_freq: [5] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.75 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_960h.yaml b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_960h.yaml new file mode 100644 index 0000000..0633915 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/finetuning/vox_960h.yaml @@ -0,0 +1,58 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + no_epoch_checkpoints: true + best_checkpoint_metric: wer + +task: + _name: audio_pretraining + data: ??? + normalize: true + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 1280000 + skip_invalid_size_inputs_valid_test: true + valid_subset: dev_other + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 24 + +criterion: + _name: ctc + zero_infinity: true + +optimization: + max_update: 320000 + lr: [0.00003] + sentence_avg: true + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 10000 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_base_librispeech.yaml b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_base_librispeech.yaml new file mode 100644 index 0000000..b686e21 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_base_librispeech.yaml @@ -0,0 +1,57 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + +task: + _name: audio_pretraining + data: ??? + max_sample_size: 250000 + min_sample_size: 32000 + normalize: false + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + +distributed_training: + distributed_world_size: 64 + ddp_backend: legacy_ddp + +criterion: + _name: wav2vec + infonce: true + log_keys: ["prob_perplexity","code_perplexity","temp"] + loss_weights: [0.1, 10] + +optimization: + max_update: 400000 + lr: [0.0005] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: wav2vec2 + quantize_targets: true + final_dim: 256 + encoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + feature_grad_mult: 0.1 + encoder_embed_dim: 768 diff --git a/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox.yaml b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox.yaml new file mode 100644 index 0000000..bee4115 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox.yaml @@ -0,0 +1,69 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + +task: + _name: audio_pretraining + data: ??? + max_sample_size: 320000 + min_sample_size: 32000 + normalize: true + +dataset: + num_workers: 6 + max_tokens: 1200000 + skip_invalid_size_inputs_valid_test: true + +distributed_training: + distributed_world_size: 128 + ddp_backend: legacy_ddp + +criterion: + _name: wav2vec + infonce: true + log_keys: ["prob_perplexity","code_perplexity","temp"] + loss_weights: [0.1, 0] + +optimization: + max_update: 1000000 + lr: [0.005] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: wav2vec2 + quantize_targets: true + extractor_mode: layer_norm + layer_norm_first: true + final_dim: 768 + latent_temp: [2.0,0.1,0.999995] + encoder_layerdrop: 0.00 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + conv_bias: true + + encoder_layers: 24 + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + encoder_attention_heads: 16 + + feature_grad_mult: 1.0 + diff --git a/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu-pod.yaml b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu-pod.yaml new file mode 100644 index 0000000..ff35a95 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu-pod.yaml @@ -0,0 +1,72 @@ +# @package _group_ + +common: + tpu: true + fp16: false + log_format: json + log_interval: 10 + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + +task: + _name: audio_pretraining + data: ??? + max_sample_size: 250000 + min_sample_size: 32000 + normalize: true + num_batch_buckets: 3 + precompute_mask_indices: true + enable_padding: true + +dataset: + num_workers: 6 + max_tokens: 1200000 + skip_invalid_size_inputs_valid_test: true + +distributed_training: + distributed_world_size: 128 + ddp_backend: legacy_ddp + +criterion: + _name: wav2vec + infonce: true + log_keys: ["prob_perplexity","code_perplexity","temp"] + loss_weights: [0.1, 0] + +optimization: + max_update: 1000000 + lr: [0.005] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: wav2vec2 + quantize_targets: true + extractor_mode: layer_norm + layer_norm_first: true + final_dim: 768 + latent_temp: [2.0,0.1,0.999995] + encoder_layerdrop: 0.00 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + conv_bias: true + + encoder_layers: 24 + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + encoder_attention_heads: 16 + + feature_grad_mult: 1.0 diff --git a/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu.yaml b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu.yaml new file mode 100644 index 0000000..2036e23 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/config/pretraining/wav2vec2_large_librivox_tpu.yaml @@ -0,0 +1,72 @@ +# @package _group_ + +common: + tpu: true + fp16: false + log_format: json + log_interval: 10 + +checkpoint: + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: true + +task: + _name: audio_pretraining + data: ??? + max_sample_size: 250000 + min_sample_size: 32000 + normalize: true + num_batch_buckets: 3 + precompute_mask_indices: true + enable_padding: true + +dataset: + num_workers: 6 + max_tokens: 1200000 + skip_invalid_size_inputs_valid_test: true + +distributed_training: + distributed_world_size: 8 + ddp_backend: legacy_ddp + +criterion: + _name: wav2vec + infonce: true + log_keys: ["prob_perplexity","code_perplexity","temp"] + loss_weights: [0.1, 0] + +optimization: + max_update: 1000000 + lr: [0.005] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: wav2vec2 + quantize_targets: true + extractor_mode: layer_norm + layer_norm_first: true + final_dim: 768 + latent_temp: [2.0,0.1,0.999995] + encoder_layerdrop: 0.00 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + conv_bias: true + + encoder_layers: 24 + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + encoder_attention_heads: 16 + + feature_grad_mult: 1.0 diff --git a/SpeechT5/fairseq/examples/wav2vec/libri_labels.py b/SpeechT5/fairseq/examples/wav2vec/libri_labels.py new file mode 100644 index 0000000..589bce5 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/libri_labels.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Helper script to pre-compute embeddings for a flashlight (previously called wav2letter++) dataset +""" + +import argparse +import os + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("tsv") + parser.add_argument("--output-dir", required=True) + parser.add_argument("--output-name", required=True) + args = parser.parse_args() + + os.makedirs(args.output_dir, exist_ok=True) + + transcriptions = {} + + with open(args.tsv, "r") as tsv, open( + os.path.join(args.output_dir, args.output_name + ".ltr"), "w" + ) as ltr_out, open( + os.path.join(args.output_dir, args.output_name + ".txt"), "w" + ) as wrd_out: + root = next(tsv).strip() + for line in tsv: + line = line.strip() + dir = os.path.dirname(line) + if dir not in transcriptions: + parts = dir.split(os.path.sep) + trans_path = f"{parts[-2]}-{parts[-1]}.trans.txt" + path = os.path.join(root, dir, trans_path) + assert os.path.exists(path) + texts = {} + with open(path, "r") as trans_f: + for tline in trans_f: + items = tline.strip().split() + texts[items[0]] = " ".join(items[1:]) + transcriptions[dir] = texts + part = os.path.basename(line).split(".")[0] + assert part in transcriptions[dir] + print(transcriptions[dir][part], file=wrd_out) + print( + " ".join(list(transcriptions[dir][part].replace(" ", "|"))) + " |", + file=ltr_out, + ) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/scripts/binarize_manifest.sh b/SpeechT5/fairseq/examples/wav2vec/scripts/binarize_manifest.sh new file mode 100644 index 0000000..6f201bd --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/scripts/binarize_manifest.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +# usage: bash binarize_manifest <dest_dir> <train_split> <valid_split> + +DEST_DIR=$1 +TRAIN_SPLIT=$2 +VALID_SPLIT=$3 +FAIRSEQ_ROOT=$4 + +mkdir -p $DEST_DIR + +# split file path and lengths into separate files +cut -f1 $TRAIN_SPLIT.tsv > $DEST_DIR/train_fnames.txt +cut -f1 $VALID_SPLIT.tsv > $DEST_DIR/valid_fnames.txt +cut -f2 $TRAIN_SPLIT.tsv > $DEST_DIR/train.lengths +cut -f2 $VALID_SPLIT.tsv > $DEST_DIR/valid.lengths + +# copy root directory +head -1 $TRAIN_SPLIT.tsv > $DEST_DIR/train.root +head -1 $VALID_SPLIT.tsv > $DEST_DIR/valid.root + +# remove root directory +sed -i '1d' $DEST_DIR/train_fnames.txt +sed -i '1d' $DEST_DIR/valid_fnames.txt +sed -i '1d' $DEST_DIR/train.lengths +sed -i '1d' $DEST_DIR/valid.lengths + +# insert spaces between characters +sed -i -e 's/\(.\)/\1 /g' $DEST_DIR/train_fnames.txt +sed -i -e 's/\(.\)/\1 /g' $DEST_DIR/valid_fnames.txt + +# run preprocessor +PYTHONPATH=$FAIRSEQ_ROOT python $FAIRSEQ_ROOT/fairseq_cli/preprocess.py --dataset-impl mmap --trainpref $DEST_DIR/train_fnames.txt --validpref $DEST_DIR/valid_fnames.txt --workers 60 --only-source --destdir $DEST_DIR diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/README.md b/SpeechT5/fairseq/examples/wav2vec/unsupervised/README.md new file mode 100644 index 0000000..046202e --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/README.md @@ -0,0 +1,103 @@ +# wav2vec Unsupervised (wav2vec-U) + +Wav2vec Unsupervised (wav2vec-U) is a framework for building speech recognition systems without any labeled training data as described in [Unsupervised Speech Recognition (Baevski et al., 2021)](https://ai.facebook.com/research/publications/unsupervised-speech-recognition). The model takes as input wav2vec 2.0 or XLSR representations (see [pretrained models](https://github.com/pytorch/fairseq/blob/master/examples/wav2vec)) as well as unlabeled speech and text data. + + The wav2vec-U training procedure consists of three consecutive main steps: +* Preparation of speech representations and text data +* Generative adversarial training (GAN) +* Iterative self-training + Kaldi LM-decoding + +## Preparation of speech and text data +Similar to [wav2vec 2.0](https://github.com/pytorch/fairseq/blob/master/examples/wav2vec/README.md), data folders contain {train,valid,test}.{tsv,wrd,phn} files, where audio paths are stored in tsv files, and word, letter or phoneme transcriptions are stored in .{wrd,ltr,phn}. + +In **/path/to/data/with_silence** you need a *train.tsv* file as well as (optionally) *{valid,test}.{tsv,wrd,phn}*. It is nice to have *10h.{tsv,phn}* files there too for reproducing the ablation study on layer selection. In **/path/to/data/without_silence** you have the same files, except *.tsv* files contain audios with silences removed using rVAD. + +Pre-requisites: +* set FAIRSEQ_ROOT environmental variable to your fairseq installation +* set RVAD_ROOT environmental variable to a checkout of [rVADfast](https://github.com/zhenghuatan/rVADfast) +* set KENLM_ROOT environmental variable to the location of [KenLM](https://github.com/kpu/kenlm) binaries +* install [PyKaldi](https://github.com/pykaldi/pykaldi) and set KALDI_ROOT environmental variable to the location of your kaldi installation. To use the version bundled with PyKaldi, you can use /path/to/pykaldi/tools/kaldi + +Create new audio files without silences: +```shell +# create a manifest file for the set original of audio files +python $FAIRSEQ_ROOT/examples/wav2vec/wav2vec_manifest.py /dir/to/save/audio/files --ext wav --dest /path/to/new/train.tsv --valid-percent 0 + +python scripts/vads.py -r $RVAD_ROOT < /path/to/train.tsv > train.vads + +python scripts/remove_silence.py --tsv /path/to/train.tsv --vads train.vads --out /dir/to/save/audio/files + +python $FAIRSEQ_ROOT/examples/wav2vec/wav2vec_manifest.py /dir/to/save/audio/files --ext wav --dest /path/to/new/train.tsv --valid-percent 0.01 +``` + +Next, we need to preprocess the audio data to better match phonemized text data: + +```shell +zsh scripts/prepare_audio.sh /dir/with/{train,test,valid}.tsv /output/dir /path/to/wav2vec2/model.pt 512 14 +``` +Note that if you have splits different than train/valid/test, you will need to modify this script. The last two arguments are the PCA dimensionality and the 0-based index of the layer from which to extract representations. + +Now we need to prepare text data: +```shell +zsh scripts/prepare_text.sh language /path/to/text/file /output/dir 1000 espeak /path/to/fasttext/lid/model +``` + +The fourth argument is minimum number observations of phones to keep. If your text corpus is small, you might want to reduce this number. + +The fifth argument is which phonemizer to use. Supported values are [espeak](http://espeak.sourceforge.net/), [espeak-ng](https://github.com/espeak-ng/espeak-ng), and [G2P](https://github.com/Kyubyong/g2p) (english only). + +Pre-trained fasttext LID models can be downloaded [here](https://fasttext.cc/docs/en/language-identification.html). + +### Prepare TIMIT data +TIMIT transcripts include silence. Therefore VAD is not used for audio preprocessing, and we do not wrap transcripts with silences or insert random silence in between words. + +To prepare TIMIT data for both the matched an unmatched setup: +```shell +bash scripts/prepare_timit.sh /dir/to/timit/raw/data /output/dir /path/to/wav2vec2/model.pt +``` + +Note that we assume the TIMIT distribution with capitalized directories and filenames are used (e.g., `TRAIN/DR1/FCJF0/SA1.PHN`). + +## Generative adversarial training (GAN) + +We then use a GAN model to build a first unsupervised ASR model. The data preparation above of both speech features and text data is a necessary procedure that enables the generator to match speech to text in an unsupervised way. + +Launching GAN training on top of preprocessed features, with default hyperparameters can be done with: + +``` +PREFIX=w2v_unsup_gan_xp +TASK_DATA=/path/to/features/precompute_unfiltered_pca512_cls128_mean_pooled +TEXT_DATA=/path/to/data/phones # path to fairseq-preprocessed GAN data (phones dir) +KENLM_PATH=/path/to/data/phones/kenlm.phn.o4.bin # KenLM 4-gram phoneme language model (LM data = GAN data here) + +PYTHONPATH=$FAIRSEQ_ROOT PREFIX=$PREFIX fairseq-hydra-train \ + -m --config-dir config/gan \ + --config-name w2vu \ + task.data=${TASK_DATA} \ + task.text_data=${TEXT_DATA} \ + task.kenlm_path=${KENLM_PATH} \ + common.user_dir=${FAIRSEQ_ROOT}/examples/wav2vec/unsupervised \ + model.code_penalty=2,4 model.gradient_penalty=1.5,2.0 \ + model.smoothness_weight=0.5,0.75,1.0 'common.seed=range(0,5)' +``` + + +Once we find the best checkpoint (chosen using unsupervised metric that combined language model perplexity and vocabulary usage), we can use it to generate phone labels (or word labels with an appropriate kaldi WFST): + +```shell +python w2vu_generate.py --config-dir config/generate --config-name viterbi \ +fairseq.common.user_dir=${FAIRSEQ_ROOT}/examples/wav2vec/unsupervised \ +fairseq.task.data=/path/to/dir/with/features \ +fairseq.common_eval.path=/path/to/gan/checkpoint \ +fairseq.dataset.gen_subset=valid results_path=/where/to/save/transcriptions +``` + +The decoding without LM works best on the same adjacent-mean-pooled features that the gan was trained on, while decoding with LM works better on features before the adjacent timestep mean-pooling step (without the "_pooled" suffix). + +## Iterative self-training + Kaldi LM-decoding +After the GAN training provides a first unsupervised model, we can then progressively refine the quality of transcriptions using several iterations of semi-supervised learning. We perform two iterations: first, pseudo-label the training data with the unsupervised GAN model and train an HMM on the pseudo-labels. Second, we relabel the training data with the HMM and then fine-tune the original wav2vec 2.0 model using the HMM pseudo-labels with a CTC loss. Note that HMM models use phonemes as output, while wav2vec 2.0 use letter. Both are decoded using WFST decoders into words. + + +Please see [this README](kaldi_self_train/README.md) for more instructions on how to do iterative self-training + Kaldi LM-decoding. + +*** Note: these instructions are a work in progress and will be updated over the next few days diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/__init__.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/finetuning/w2v_finetune.yaml b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/finetuning/w2v_finetune.yaml new file mode 100644 index 0000000..e94da2b --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/finetuning/w2v_finetune.yaml @@ -0,0 +1,62 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tb + +checkpoint: + no_epoch_checkpoints: true + save_interval_updates: 20000 + +task: + _name: audio_pretraining + data: ??? + normalize: true + labels: ltr + +dataset: + num_workers: 6 + max_tokens: 800000 + skip_invalid_size_inputs_valid_test: true + train_subset: train + valid_subset: valid + +distributed_training: + ddp_backend: legacy_ddp + distributed_world_size: 8 + find_unused_parameters: True + +criterion: + _name: ctc + zero_infinity: true + post_process: letter + +optimization: + max_update: 80000 + lr: [0.00003] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: wav2vec_ctc + w2v_path: ??? + apply_mask: true + mask_prob: 0.25 + mask_channel_prob: 0.1 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/gan/w2vu.yaml b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/gan/w2vu.yaml new file mode 100644 index 0000000..74f1829 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/gan/w2vu.yaml @@ -0,0 +1,115 @@ +# @package _group_ + +common: + fp16: false + fp16_no_flatten_grads: true + log_format: json + log_interval: 100 + tensorboard_logdir: tb + reset_logging: false + suppress_crashes: false + +checkpoint: + save_interval: 1000 + save_interval_updates: 1000 + no_epoch_checkpoints: true + best_checkpoint_metric: weighted_lm_ppl + save_dir: . + +distributed_training: + distributed_world_size: 1 + +task: + _name: unpaired_audio_text + data: ??? + text_data: ??? + labels: phn + sort_by_length: false + unfiltered: false + max_length: null + append_eos: false + kenlm_path: ??? + +dataset: + num_workers: 6 + batch_size: 160 + skip_invalid_size_inputs_valid_test: true + valid_subset: valid + validate_interval: 1000 + validate_interval_updates: 1000 + +criterion: + _name: model + log_keys: + - accuracy_dense + - accuracy_token + - temp + - code_ppl + +optimization: + max_update: 150000 + clip_norm: 5.0 + lr: [0] + +optimizer: + _name: composite + groups: + generator: + lr: [0.0004] + lr_float: null + optimizer: + _name: adam + adam_betas: [0.5,0.98] + adam_eps: 1e-06 + weight_decay: 0 + amsgrad: false + lr_scheduler: + _name: fixed + warmup_updates: 0 + discriminator: + lr: [ 0.0005 ] + lr_float: null + optimizer: + _name: adam + adam_betas: [0.5,0.98] + adam_eps: 1e-06 + weight_decay: 0.0001 + amsgrad: false + lr_scheduler: + _name: fixed + warmup_updates: 0 + +lr_scheduler: pass_through + +model: + _name: wav2vec_u + + discriminator_dim: 384 + discriminator_depth: 2 + discriminator_kernel: 6 + discriminator_linear_emb: false + discriminator_causal: true + discriminator_max_pool: false + discriminator_act_after_linear: false + discriminator_dropout: 0.0 + discriminator_weight_norm: false + + generator_stride: 1 + generator_kernel: 4 + generator_bias: false + generator_dropout: 0.1 + + smoothness_weight: 0.5 + smoothing: 0 + smoothing_one_sided: false + gumbel: false + hard_gumbel: false + gradient_penalty: 1.5 + code_penalty: 4.0 + temp: [ 2,0.1,0.99995 ] + input_dim: 512 + + segmentation: + type: JOIN + mean_pool_join: false + remove_zeros: false diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/generate/viterbi.yaml b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/generate/viterbi.yaml new file mode 100644 index 0000000..9c88bee --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/generate/viterbi.yaml @@ -0,0 +1,21 @@ +# @package _group_ + +fairseq: + task: + _name: unpaired_audio_text + labels: phn + data: ??? + sort_by_length: false + shuffle: false + text_data: '' + + common_eval: + path: ??? + quiet: true + + dataset: + gen_subset: valid + batch_size: 1 + +w2l_decoder: VITERBI +post_process: silence diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/test.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/test.uid new file mode 100644 index 0000000..4010082 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/test.uid @@ -0,0 +1,192 @@ +FDHC0_SI1559 +FDHC0_SI2189 +FDHC0_SI929 +FDHC0_SX119 +FDHC0_SX209 +FDHC0_SX29 +FDHC0_SX299 +FDHC0_SX389 +FELC0_SI1386 +FELC0_SI2016 +FELC0_SI756 +FELC0_SX126 +FELC0_SX216 +FELC0_SX306 +FELC0_SX36 +FELC0_SX396 +FJLM0_SI1043 +FJLM0_SI1673 +FJLM0_SI2303 +FJLM0_SX143 +FJLM0_SX233 +FJLM0_SX323 +FJLM0_SX413 +FJLM0_SX53 +FMGD0_SI1564 +FMGD0_SI2194 +FMGD0_SI934 +FMGD0_SX124 +FMGD0_SX214 +FMGD0_SX304 +FMGD0_SX34 +FMGD0_SX394 +FMLD0_SI2185 +FMLD0_SI822 +FMLD0_SI925 +FMLD0_SX115 +FMLD0_SX205 +FMLD0_SX25 +FMLD0_SX295 +FMLD0_SX385 +FNLP0_SI1308 +FNLP0_SI1938 +FNLP0_SI678 +FNLP0_SX138 +FNLP0_SX228 +FNLP0_SX318 +FNLP0_SX408 +FNLP0_SX48 +FPAS0_SI1272 +FPAS0_SI2204 +FPAS0_SI944 +FPAS0_SX134 +FPAS0_SX224 +FPAS0_SX314 +FPAS0_SX404 +FPAS0_SX44 +FPKT0_SI1538 +FPKT0_SI2168 +FPKT0_SI908 +FPKT0_SX188 +FPKT0_SX278 +FPKT0_SX368 +FPKT0_SX8 +FPKT0_SX98 +MBPM0_SI1577 +MBPM0_SI1584 +MBPM0_SI947 +MBPM0_SX137 +MBPM0_SX227 +MBPM0_SX317 +MBPM0_SX407 +MBPM0_SX47 +MCMJ0_SI1094 +MCMJ0_SI464 +MCMJ0_SI602 +MCMJ0_SX104 +MCMJ0_SX14 +MCMJ0_SX194 +MCMJ0_SX284 +MCMJ0_SX374 +MDAB0_SI1039 +MDAB0_SI1669 +MDAB0_SI2299 +MDAB0_SX139 +MDAB0_SX229 +MDAB0_SX319 +MDAB0_SX409 +MDAB0_SX49 +MGRT0_SI1450 +MGRT0_SI2080 +MGRT0_SI820 +MGRT0_SX10 +MGRT0_SX100 +MGRT0_SX190 +MGRT0_SX280 +MGRT0_SX370 +MJDH0_SI1354 +MJDH0_SI1984 +MJDH0_SI724 +MJDH0_SX184 +MJDH0_SX274 +MJDH0_SX364 +MJDH0_SX4 +MJDH0_SX94 +MJLN0_SI1449 +MJLN0_SI2079 +MJLN0_SI819 +MJLN0_SX189 +MJLN0_SX279 +MJLN0_SX369 +MJLN0_SX9 +MJLN0_SX99 +MJMP0_SI1535 +MJMP0_SI1791 +MJMP0_SI905 +MJMP0_SX185 +MJMP0_SX275 +MJMP0_SX365 +MJMP0_SX5 +MJMP0_SX95 +MKLT0_SI1213 +MKLT0_SI1843 +MKLT0_SI583 +MKLT0_SX133 +MKLT0_SX223 +MKLT0_SX313 +MKLT0_SX403 +MKLT0_SX43 +MLLL0_SI1363 +MLLL0_SI1993 +MLLL0_SI733 +MLLL0_SX103 +MLLL0_SX13 +MLLL0_SX193 +MLLL0_SX283 +MLLL0_SX373 +MLNT0_SI1574 +MLNT0_SI1902 +MLNT0_SI642 +MLNT0_SX102 +MLNT0_SX12 +MLNT0_SX192 +MLNT0_SX282 +MLNT0_SX372 +MNJM0_SI1580 +MNJM0_SI2210 +MNJM0_SI950 +MNJM0_SX140 +MNJM0_SX230 +MNJM0_SX320 +MNJM0_SX410 +MNJM0_SX50 +MPAM0_SI1189 +MPAM0_SI1819 +MPAM0_SI1961 +MPAM0_SX109 +MPAM0_SX19 +MPAM0_SX199 +MPAM0_SX289 +MPAM0_SX379 +MTAS1_SI1473 +MTAS1_SI2098 +MTAS1_SI838 +MTAS1_SX118 +MTAS1_SX208 +MTAS1_SX28 +MTAS1_SX298 +MTAS1_SX388 +MTLS0_SI1370 +MTLS0_SI2000 +MTLS0_SI740 +MTLS0_SX110 +MTLS0_SX20 +MTLS0_SX200 +MTLS0_SX290 +MTLS0_SX380 +MWBT0_SI1553 +MWBT0_SI2183 +MWBT0_SI923 +MWBT0_SX113 +MWBT0_SX203 +MWBT0_SX23 +MWBT0_SX293 +MWBT0_SX383 +MWEW0_SI1361 +MWEW0_SI1991 +MWEW0_SI731 +MWEW0_SX101 +MWEW0_SX11 +MWEW0_SX191 +MWEW0_SX281 +MWEW0_SX371 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train.uid new file mode 100644 index 0000000..c39fd0b --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train.uid @@ -0,0 +1,3696 @@ +FAEM0_SI1392 +FAEM0_SI2022 +FAEM0_SI762 +FAEM0_SX132 +FAEM0_SX222 +FAEM0_SX312 +FAEM0_SX402 +FAEM0_SX42 +FAJW0_SI1263 +FAJW0_SI1893 +FAJW0_SI633 +FAJW0_SX183 +FAJW0_SX273 +FAJW0_SX3 +FAJW0_SX363 +FAJW0_SX93 +FALK0_SI1086 +FALK0_SI456 +FALK0_SI658 +FALK0_SX186 +FALK0_SX276 +FALK0_SX366 +FALK0_SX6 +FALK0_SX96 +FALR0_SI1325 +FALR0_SI1955 +FALR0_SI695 +FALR0_SX155 +FALR0_SX245 +FALR0_SX335 +FALR0_SX425 +FALR0_SX65 +FAPB0_SI1063 +FAPB0_SI1693 +FAPB0_SI2323 +FAPB0_SX163 +FAPB0_SX253 +FAPB0_SX343 +FAPB0_SX433 +FAPB0_SX73 +FBAS0_SI1387 +FBAS0_SI1472 +FBAS0_SI2066 +FBAS0_SX127 +FBAS0_SX217 +FBAS0_SX307 +FBAS0_SX37 +FBAS0_SX397 +FBCG1_SI1612 +FBCG1_SI2242 +FBCG1_SI982 +FBCG1_SX172 +FBCG1_SX262 +FBCG1_SX352 +FBCG1_SX442 +FBCG1_SX82 +FBCH0_SI1586 +FBCH0_SI956 +FBCH0_SI959 +FBCH0_SX146 +FBCH0_SX236 +FBCH0_SX326 +FBCH0_SX416 +FBCH0_SX56 +FBJL0_SI1552 +FBJL0_SI2182 +FBJL0_SI922 +FBJL0_SX112 +FBJL0_SX202 +FBJL0_SX22 +FBJL0_SX292 +FBJL0_SX382 +FBLV0_SI1058 +FBLV0_SI1688 +FBLV0_SI2318 +FBLV0_SX158 +FBLV0_SX248 +FBLV0_SX338 +FBLV0_SX428 +FBLV0_SX68 +FBMH0_SI1136 +FBMH0_SI1766 +FBMH0_SI970 +FBMH0_SX146 +FBMH0_SX236 +FBMH0_SX326 +FBMH0_SX416 +FBMH0_SX56 +FBMJ0_SI1776 +FBMJ0_SI516 +FBMJ0_SI815 +FBMJ0_SX156 +FBMJ0_SX246 +FBMJ0_SX336 +FBMJ0_SX426 +FBMJ0_SX66 +FCAG0_SI1503 +FCAG0_SI1641 +FCAG0_SI2133 +FCAG0_SX153 +FCAG0_SX243 +FCAG0_SX333 +FCAG0_SX423 +FCAG0_SX63 +FCAJ0_SI1479 +FCAJ0_SI1804 +FCAJ0_SI849 +FCAJ0_SX129 +FCAJ0_SX219 +FCAJ0_SX309 +FCAJ0_SX39 +FCAJ0_SX399 +FCDR1_SI1186 +FCDR1_SI1816 +FCDR1_SI556 +FCDR1_SX106 +FCDR1_SX16 +FCDR1_SX196 +FCDR1_SX286 +FCDR1_SX376 +FCEG0_SI1248 +FCEG0_SI1878 +FCEG0_SI618 +FCEG0_SX168 +FCEG0_SX258 +FCEG0_SX348 +FCEG0_SX438 +FCEG0_SX78 +FCJF0_SI1027 +FCJF0_SI1657 +FCJF0_SI648 +FCJF0_SX127 +FCJF0_SX217 +FCJF0_SX307 +FCJF0_SX37 +FCJF0_SX397 +FCJS0_SI1607 +FCJS0_SI2237 +FCJS0_SI977 +FCJS0_SX167 +FCJS0_SX257 +FCJS0_SX347 +FCJS0_SX437 +FCJS0_SX77 +FCKE0_SI1111 +FCKE0_SI1741 +FCKE0_SI481 +FCKE0_SX121 +FCKE0_SX211 +FCKE0_SX301 +FCKE0_SX31 +FCKE0_SX391 +FCLT0_SI1438 +FCLT0_SI2068 +FCLT0_SI808 +FCLT0_SX178 +FCLT0_SX268 +FCLT0_SX358 +FCLT0_SX448 +FCLT0_SX88 +FCMG0_SI1142 +FCMG0_SI1242 +FCMG0_SI1872 +FCMG0_SX162 +FCMG0_SX252 +FCMG0_SX342 +FCMG0_SX432 +FCMG0_SX72 +FCMM0_SI1083 +FCMM0_SI1957 +FCMM0_SI453 +FCMM0_SX183 +FCMM0_SX273 +FCMM0_SX363 +FCMM0_SX420 +FCMM0_SX93 +FCRZ0_SI1913 +FCRZ0_SI2053 +FCRZ0_SI793 +FCRZ0_SX163 +FCRZ0_SX253 +FCRZ0_SX343 +FCRZ0_SX433 +FCRZ0_SX73 +FCYL0_SI1297 +FCYL0_SI1927 +FCYL0_SI667 +FCYL0_SX127 +FCYL0_SX217 +FCYL0_SX349 +FCYL0_SX37 +FCYL0_SX397 +FDAS1_SI1461 +FDAS1_SI2091 +FDAS1_SI831 +FDAS1_SX111 +FDAS1_SX201 +FDAS1_SX21 +FDAS1_SX291 +FDAS1_SX381 +FDAW0_SI1271 +FDAW0_SI1406 +FDAW0_SI2036 +FDAW0_SX146 +FDAW0_SX236 +FDAW0_SX326 +FDAW0_SX416 +FDAW0_SX56 +FDFB0_SI1318 +FDFB0_SI1948 +FDFB0_SI2010 +FDFB0_SX148 +FDFB0_SX238 +FDFB0_SX328 +FDFB0_SX418 +FDFB0_SX58 +FDJH0_SI1565 +FDJH0_SI2195 +FDJH0_SI935 +FDJH0_SX125 +FDJH0_SX215 +FDJH0_SX305 +FDJH0_SX35 +FDJH0_SX395 +FDKN0_SI1081 +FDKN0_SI1202 +FDKN0_SI1711 +FDKN0_SX181 +FDKN0_SX271 +FDKN0_SX361 +FDKN0_SX451 +FDKN0_SX91 +FDML0_SI1149 +FDML0_SI1779 +FDML0_SI2075 +FDML0_SX159 +FDML0_SX249 +FDML0_SX339 +FDML0_SX429 +FDML0_SX69 +FDMY0_SI1197 +FDMY0_SI567 +FDMY0_SI714 +FDMY0_SX117 +FDMY0_SX207 +FDMY0_SX27 +FDMY0_SX297 +FDMY0_SX387 +FDNC0_SI1278 +FDNC0_SI1908 +FDNC0_SI2287 +FDNC0_SX108 +FDNC0_SX18 +FDNC0_SX198 +FDNC0_SX288 +FDNC0_SX378 +FDTD0_SI1561 +FDTD0_SI2191 +FDTD0_SI931 +FDTD0_SX121 +FDTD0_SX211 +FDTD0_SX301 +FDTD0_SX321 +FDTD0_SX391 +FDXW0_SI1511 +FDXW0_SI2141 +FDXW0_SI881 +FDXW0_SX161 +FDXW0_SX251 +FDXW0_SX341 +FDXW0_SX431 +FDXW0_SX71 +FEAC0_SI1245 +FEAC0_SI1875 +FEAC0_SI615 +FEAC0_SX165 +FEAC0_SX255 +FEAC0_SX345 +FEAC0_SX435 +FEAC0_SX75 +FEAR0_SI1252 +FEAR0_SI1882 +FEAR0_SI622 +FEAR0_SX172 +FEAR0_SX262 +FEAR0_SX352 +FEAR0_SX442 +FEAR0_SX82 +FECD0_SI1418 +FECD0_SI2048 +FECD0_SI788 +FECD0_SX158 +FECD0_SX248 +FECD0_SX338 +FECD0_SX428 +FECD0_SX68 +FEEH0_SI1112 +FEEH0_SI1742 +FEEH0_SI471 +FEEH0_SX122 +FEEH0_SX212 +FEEH0_SX302 +FEEH0_SX32 +FEEH0_SX392 +FEME0_SI1505 +FEME0_SI2135 +FEME0_SI875 +FEME0_SX155 +FEME0_SX245 +FEME0_SX335 +FEME0_SX425 +FEME0_SX65 +FETB0_SI1148 +FETB0_SI1778 +FETB0_SI518 +FETB0_SX158 +FETB0_SX248 +FETB0_SX338 +FETB0_SX428 +FETB0_SX68 +FEXM0_SI1101 +FEXM0_SI1731 +FEXM0_SI482 +FEXM0_SX111 +FEXM0_SX201 +FEXM0_SX291 +FEXM0_SX366 +FEXM0_SX381 +FGCS0_SI1486 +FGCS0_SI2116 +FGCS0_SI856 +FGCS0_SX136 +FGCS0_SX226 +FGCS0_SX316 +FGCS0_SX406 +FGCS0_SX46 +FGDP0_SI1618 +FGDP0_SI2248 +FGDP0_SI988 +FGDP0_SX178 +FGDP0_SX268 +FGDP0_SX358 +FGDP0_SX448 +FGDP0_SX88 +FGMB0_SI1145 +FGMB0_SI1775 +FGMB0_SI515 +FGMB0_SX155 +FGMB0_SX245 +FGMB0_SX335 +FGMB0_SX425 +FGMB0_SX65 +FGRW0_SI1152 +FGRW0_SI1782 +FGRW0_SI1990 +FGRW0_SX162 +FGRW0_SX252 +FGRW0_SX342 +FGRW0_SX432 +FGRW0_SX72 +FHLM0_SI1560 +FHLM0_SI2190 +FHLM0_SI930 +FHLM0_SX120 +FHLM0_SX210 +FHLM0_SX300 +FHLM0_SX349 +FHLM0_SX390 +FHXS0_SI1075 +FHXS0_SI2302 +FHXS0_SI2335 +FHXS0_SX175 +FHXS0_SX265 +FHXS0_SX355 +FHXS0_SX445 +FHXS0_SX85 +FJDM2_SI1582 +FJDM2_SI1964 +FJDM2_SI2212 +FJDM2_SX142 +FJDM2_SX232 +FJDM2_SX322 +FJDM2_SX412 +FJDM2_SX52 +FJEN0_SI1047 +FJEN0_SI1677 +FJEN0_SI2307 +FJEN0_SX147 +FJEN0_SX237 +FJEN0_SX327 +FJEN0_SX417 +FJEN0_SX57 +FJHK0_SI1022 +FJHK0_SI1652 +FJHK0_SI2282 +FJHK0_SX122 +FJHK0_SX212 +FJHK0_SX302 +FJHK0_SX32 +FJHK0_SX392 +FJKL0_SI1562 +FJKL0_SI2192 +FJKL0_SI932 +FJKL0_SX122 +FJKL0_SX212 +FJKL0_SX302 +FJKL0_SX32 +FJKL0_SX392 +FJLG0_SI1506 +FJLG0_SI1889 +FJLG0_SI2306 +FJLG0_SX179 +FJLG0_SX269 +FJLG0_SX359 +FJLG0_SX449 +FJLG0_SX89 +FJLR0_SI1231 +FJLR0_SI1861 +FJLR0_SI601 +FJLR0_SX151 +FJLR0_SX241 +FJLR0_SX331 +FJLR0_SX421 +FJLR0_SX61 +FJRB0_SI1302 +FJRB0_SI1932 +FJRB0_SI672 +FJRB0_SX132 +FJRB0_SX222 +FJRB0_SX312 +FJRB0_SX402 +FJRB0_SX42 +FJRP1_SI1432 +FJRP1_SI2062 +FJRP1_SI802 +FJRP1_SX172 +FJRP1_SX262 +FJRP1_SX352 +FJRP1_SX442 +FJRP1_SX82 +FJSK0_SI1052 +FJSK0_SI1682 +FJSK0_SI2312 +FJSK0_SX152 +FJSK0_SX242 +FJSK0_SX332 +FJSK0_SX422 +FJSK0_SX62 +FJSP0_SI1434 +FJSP0_SI1763 +FJSP0_SI804 +FJSP0_SX174 +FJSP0_SX264 +FJSP0_SX354 +FJSP0_SX444 +FJSP0_SX84 +FJWB1_SI2055 +FJWB1_SI748 +FJWB1_SI795 +FJWB1_SX165 +FJWB1_SX255 +FJWB1_SX345 +FJWB1_SX435 +FJWB1_SX75 +FJXM0_SI1211 +FJXM0_SI1971 +FJXM0_SI581 +FJXM0_SX131 +FJXM0_SX221 +FJXM0_SX311 +FJXM0_SX401 +FJXM0_SX41 +FJXP0_SI1122 +FJXP0_SI1752 +FJXP0_SI492 +FJXP0_SX132 +FJXP0_SX222 +FJXP0_SX312 +FJXP0_SX402 +FJXP0_SX42 +FKAA0_SI1208 +FKAA0_SI1838 +FKAA0_SI578 +FKAA0_SX128 +FKAA0_SX218 +FKAA0_SX308 +FKAA0_SX38 +FKAA0_SX398 +FKDE0_SI1141 +FKDE0_SI1771 +FKDE0_SI2221 +FKDE0_SX151 +FKDE0_SX241 +FKDE0_SX331 +FKDE0_SX421 +FKDE0_SX61 +FKDW0_SI1207 +FKDW0_SI1891 +FKDW0_SI577 +FKDW0_SX127 +FKDW0_SX217 +FKDW0_SX307 +FKDW0_SX37 +FKDW0_SX397 +FKFB0_SI1608 +FKFB0_SI2238 +FKFB0_SI978 +FKFB0_SX168 +FKFB0_SX258 +FKFB0_SX348 +FKFB0_SX438 +FKFB0_SX78 +FKKH0_SI1290 +FKKH0_SI1920 +FKKH0_SI660 +FKKH0_SX120 +FKKH0_SX210 +FKKH0_SX30 +FKKH0_SX300 +FKKH0_SX390 +FKLC0_SI1615 +FKLC0_SI2245 +FKLC0_SI985 +FKLC0_SX175 +FKLC0_SX265 +FKLC0_SX355 +FKLC0_SX445 +FKLC0_SX85 +FKLC1_SI1048 +FKLC1_SI1678 +FKLC1_SI2308 +FKLC1_SX148 +FKLC1_SX238 +FKLC1_SX328 +FKLC1_SX418 +FKLC1_SX58 +FKLH0_SI1257 +FKLH0_SI1887 +FKLH0_SI627 +FKLH0_SX177 +FKLH0_SX267 +FKLH0_SX357 +FKLH0_SX447 +FKLH0_SX87 +FKSR0_SI1117 +FKSR0_SI1747 +FKSR0_SI487 +FKSR0_SX161 +FKSR0_SX217 +FKSR0_SX366 +FKSR0_SX37 +FKSR0_SX397 +FLAC0_SI1339 +FLAC0_SI2161 +FLAC0_SI901 +FLAC0_SX181 +FLAC0_SX271 +FLAC0_SX361 +FLAC0_SX451 +FLAC0_SX91 +FLAG0_SI1464 +FLAG0_SI2094 +FLAG0_SI834 +FLAG0_SX114 +FLAG0_SX204 +FLAG0_SX24 +FLAG0_SX294 +FLAG0_SX384 +FLEH0_SI1051 +FLEH0_SI1681 +FLEH0_SI2311 +FLEH0_SX151 +FLEH0_SX241 +FLEH0_SX331 +FLEH0_SX421 +FLEH0_SX61 +FLET0_SI1137 +FLET0_SI1767 +FLET0_SI507 +FLET0_SX147 +FLET0_SX237 +FLET0_SX277 +FLET0_SX417 +FLET0_SX57 +FLHD0_SI1344 +FLHD0_SI1827 +FLHD0_SI1974 +FLHD0_SX174 +FLHD0_SX264 +FLHD0_SX354 +FLHD0_SX444 +FLHD0_SX84 +FLJA0_SI1078 +FLJA0_SI1708 +FLJA0_SI2338 +FLJA0_SX178 +FLJA0_SX268 +FLJA0_SX358 +FLJA0_SX448 +FLJA0_SX88 +FLJD0_SI1516 +FLJD0_SI2146 +FLJD0_SI886 +FLJD0_SX166 +FLJD0_SX256 +FLJD0_SX346 +FLJD0_SX436 +FLJD0_SX76 +FLJG0_SI1611 +FLJG0_SI2241 +FLJG0_SI981 +FLJG0_SX171 +FLJG0_SX261 +FLJG0_SX351 +FLJG0_SX441 +FLJG0_SX81 +FLKM0_SI1880 +FLKM0_SI620 +FLKM0_SI686 +FLKM0_SX116 +FLKM0_SX260 +FLKM0_SX350 +FLKM0_SX440 +FLKM0_SX80 +FLMA0_SI1243 +FLMA0_SI1873 +FLMA0_SI613 +FLMA0_SX163 +FLMA0_SX253 +FLMA0_SX343 +FLMA0_SX433 +FLMA0_SX73 +FLMC0_SI1372 +FLMC0_SI2002 +FLMC0_SI742 +FLMC0_SX112 +FLMC0_SX22 +FLMC0_SX292 +FLMC0_SX336 +FLMC0_SX382 +FLMK0_SI1035 +FLMK0_SI1229 +FLMK0_SI2295 +FLMK0_SX135 +FLMK0_SX225 +FLMK0_SX315 +FLMK0_SX405 +FLMK0_SX45 +FLOD0_SI1287 +FLOD0_SI1917 +FLOD0_SI657 +FLOD0_SX117 +FLOD0_SX171 +FLOD0_SX207 +FLOD0_SX297 +FLOD0_SX387 +FLTM0_SI1070 +FLTM0_SI1700 +FLTM0_SI2330 +FLTM0_SX170 +FLTM0_SX260 +FLTM0_SX350 +FLTM0_SX440 +FLTM0_SX80 +FMAH1_SI1509 +FMAH1_SI2139 +FMAH1_SI879 +FMAH1_SX159 +FMAH1_SX249 +FMAH1_SX339 +FMAH1_SX429 +FMAH1_SX69 +FMBG0_SI1160 +FMBG0_SI1790 +FMBG0_SI2264 +FMBG0_SX260 +FMBG0_SX3 +FMBG0_SX350 +FMBG0_SX440 +FMBG0_SX80 +FMEM0_SI1377 +FMEM0_SI2007 +FMEM0_SI747 +FMEM0_SX117 +FMEM0_SX207 +FMEM0_SX297 +FMEM0_SX333 +FMEM0_SX387 +FMJB0_SI1177 +FMJB0_SI1807 +FMJB0_SI547 +FMJB0_SX187 +FMJB0_SX277 +FMJB0_SX367 +FMJB0_SX7 +FMJB0_SX97 +FMJF0_SI1254 +FMJF0_SI1884 +FMJF0_SI624 +FMJF0_SX174 +FMJF0_SX264 +FMJF0_SX354 +FMJF0_SX444 +FMJF0_SX84 +FMJU0_SI1389 +FMJU0_SI2019 +FMJU0_SI759 +FMJU0_SX129 +FMJU0_SX219 +FMJU0_SX309 +FMJU0_SX39 +FMJU0_SX399 +FMKC0_SI1041 +FMKC0_SI1072 +FMKC0_SI1702 +FMKC0_SX172 +FMKC0_SX262 +FMKC0_SX352 +FMKC0_SX442 +FMKC0_SX82 +FMKF0_SI1018 +FMKF0_SI1536 +FMKF0_SI906 +FMKF0_SX186 +FMKF0_SX276 +FMKF0_SX366 +FMKF0_SX6 +FMKF0_SX96 +FMMH0_SI1537 +FMMH0_SI2167 +FMMH0_SI907 +FMMH0_SX187 +FMMH0_SX367 +FMMH0_SX420 +FMMH0_SX7 +FMMH0_SX97 +FMPG0_SI1602 +FMPG0_SI2232 +FMPG0_SI972 +FMPG0_SX162 +FMPG0_SX252 +FMPG0_SX342 +FMPG0_SX432 +FMPG0_SX72 +FNKL0_SI1522 +FNKL0_SI2152 +FNKL0_SI892 +FNKL0_SX172 +FNKL0_SX196 +FNKL0_SX262 +FNKL0_SX442 +FNKL0_SX82 +FNTB0_SI1203 +FNTB0_SI573 +FNTB0_SI679 +FNTB0_SX123 +FNTB0_SX213 +FNTB0_SX303 +FNTB0_SX33 +FNTB0_SX393 +FPAB1_SI1471 +FPAB1_SI2101 +FPAB1_SI841 +FPAB1_SX121 +FPAB1_SX211 +FPAB1_SX301 +FPAB1_SX31 +FPAB1_SX391 +FPAC0_SI1921 +FPAC0_SI2011 +FPAC0_SI661 +FPAC0_SX121 +FPAC0_SX211 +FPAC0_SX301 +FPAC0_SX31 +FPAC0_SX391 +FPAD0_SI1346 +FPAD0_SI1976 +FPAD0_SI716 +FPAD0_SX176 +FPAD0_SX266 +FPAD0_SX356 +FPAD0_SX446 +FPAD0_SX86 +FPAF0_SI1054 +FPAF0_SI1684 +FPAF0_SI2314 +FPAF0_SX154 +FPAF0_SX244 +FPAF0_SX334 +FPAF0_SX424 +FPAF0_SX64 +FPAZ0_SI1593 +FPAZ0_SI2223 +FPAZ0_SI963 +FPAZ0_SX153 +FPAZ0_SX243 +FPAZ0_SX27 +FPAZ0_SX423 +FPAZ0_SX63 +FPJF0_SI1046 +FPJF0_SI1259 +FPJF0_SI1676 +FPJF0_SX146 +FPJF0_SX236 +FPJF0_SX326 +FPJF0_SX352 +FPJF0_SX56 +FPLS0_SI1590 +FPLS0_SI2220 +FPLS0_SI960 +FPLS0_SX150 +FPLS0_SX240 +FPLS0_SX3 +FPLS0_SX330 +FPLS0_SX60 +FPMY0_SI1153 +FPMY0_SI1783 +FPMY0_SI523 +FPMY0_SX163 +FPMY0_SX196 +FPMY0_SX253 +FPMY0_SX343 +FPMY0_SX73 +FREH0_SI1315 +FREH0_SI1945 +FREH0_SI685 +FREH0_SX145 +FREH0_SX235 +FREH0_SX325 +FREH0_SX415 +FREH0_SX55 +FRJB0_SI1427 +FRJB0_SI1470 +FRJB0_SI1794 +FRJB0_SX167 +FRJB0_SX257 +FRJB0_SX347 +FRJB0_SX437 +FRJB0_SX77 +FRLL0_SI1514 +FRLL0_SI805 +FRLL0_SI884 +FRLL0_SX164 +FRLL0_SX254 +FRLL0_SX344 +FRLL0_SX434 +FRLL0_SX74 +FSAG0_SI1323 +FSAG0_SI1953 +FSAG0_SI693 +FSAG0_SX153 +FSAG0_SX243 +FSAG0_SX333 +FSAG0_SX423 +FSAG0_SX63 +FSAH0_SI1244 +FSAH0_SI1874 +FSAH0_SI614 +FSAH0_SX164 +FSAH0_SX327 +FSAH0_SX344 +FSAH0_SX434 +FSAH0_SX74 +FSAK0_SI1300 +FSAK0_SI1930 +FSAK0_SI670 +FSAK0_SX130 +FSAK0_SX220 +FSAK0_SX310 +FSAK0_SX40 +FSAK0_SX400 +FSBK0_SI1069 +FSBK0_SI1699 +FSBK0_SI2329 +FSBK0_SX169 +FSBK0_SX259 +FSBK0_SX349 +FSBK0_SX439 +FSBK0_SX79 +FSCN0_SI1886 +FSCN0_SI626 +FSCN0_SI705 +FSCN0_SX176 +FSCN0_SX266 +FSCN0_SX356 +FSCN0_SX446 +FSCN0_SX86 +FSDC0_SI1312 +FSDC0_SI1942 +FSDC0_SI2234 +FSDC0_SX142 +FSDC0_SX232 +FSDC0_SX322 +FSDC0_SX412 +FSDC0_SX52 +FSDJ0_SI1115 +FSDJ0_SI1745 +FSDJ0_SI485 +FSDJ0_SX125 +FSDJ0_SX215 +FSDJ0_SX305 +FSDJ0_SX35 +FSDJ0_SX395 +FSGF0_SI1557 +FSGF0_SI2187 +FSGF0_SI927 +FSGF0_SX117 +FSGF0_SX207 +FSGF0_SX27 +FSGF0_SX297 +FSGF0_SX387 +FSJG0_SI1570 +FSJG0_SI2200 +FSJG0_SI940 +FSJG0_SX130 +FSJG0_SX220 +FSJG0_SX310 +FSJG0_SX40 +FSJG0_SX400 +FSJK1_SI1025 +FSJK1_SI2285 +FSJK1_SI696 +FSJK1_SX125 +FSJK1_SX215 +FSJK1_SX305 +FSJK1_SX35 +FSJK1_SX395 +FSJS0_SI1171 +FSJS0_SI1801 +FSJS0_SI541 +FSJS0_SX181 +FSJS0_SX271 +FSJS0_SX361 +FSJS0_SX451 +FSJS0_SX91 +FSJW0_SI1333 +FSJW0_SI1963 +FSJW0_SI703 +FSJW0_SX163 +FSJW0_SX253 +FSJW0_SX343 +FSJW0_SX433 +FSJW0_SX73 +FSKC0_SI1416 +FSKC0_SI2046 +FSKC0_SI786 +FSKC0_SX156 +FSKC0_SX246 +FSKC0_SX336 +FSKC0_SX426 +FSKC0_SX66 +FSKL0_SI1529 +FSKL0_SI2159 +FSKL0_SI899 +FSKL0_SX179 +FSKL0_SX269 +FSKL0_SX359 +FSKL0_SX449 +FSKL0_SX89 +FSKP0_SI1098 +FSKP0_SI1728 +FSKP0_SI468 +FSKP0_SX108 +FSKP0_SX18 +FSKP0_SX198 +FSKP0_SX288 +FSKP0_SX378 +FSLS0_SI1056 +FSLS0_SI1686 +FSLS0_SI2316 +FSLS0_SX156 +FSLS0_SX202 +FSLS0_SX246 +FSLS0_SX426 +FSLS0_SX66 +FSMA0_SI1621 +FSMA0_SI2251 +FSMA0_SI991 +FSMA0_SX181 +FSMA0_SX271 +FSMA0_SX361 +FSMA0_SX451 +FSMA0_SX91 +FSMM0_SI1314 +FSMM0_SI1944 +FSMM0_SI684 +FSMM0_SX144 +FSMM0_SX234 +FSMM0_SX324 +FSMM0_SX414 +FSMM0_SX54 +FSMS1_SI1504 +FSMS1_SI2134 +FSMS1_SI874 +FSMS1_SX154 +FSMS1_SX244 +FSMS1_SX334 +FSMS1_SX347 +FSMS1_SX64 +FSPM0_SI1241 +FSPM0_SI1871 +FSPM0_SI611 +FSPM0_SX161 +FSPM0_SX251 +FSPM0_SX341 +FSPM0_SX431 +FSPM0_SX71 +FSRH0_SI1719 +FSRH0_SI1931 +FSRH0_SI671 +FSRH0_SX131 +FSRH0_SX221 +FSRH0_SX311 +FSRH0_SX401 +FSRH0_SX41 +FSSB0_SI1082 +FSSB0_SI1712 +FSSB0_SI2342 +FSSB0_SX182 +FSSB0_SX272 +FSSB0_SX362 +FSSB0_SX452 +FSSB0_SX92 +FTAJ0_SI1329 +FTAJ0_SI474 +FTAJ0_SI699 +FTAJ0_SX159 +FTAJ0_SX249 +FTAJ0_SX339 +FTAJ0_SX429 +FTAJ0_SX69 +FTBR0_SI1402 +FTBR0_SI2181 +FTBR0_SI921 +FTBR0_SX111 +FTBR0_SX201 +FTBR0_SX21 +FTBR0_SX291 +FTBR0_SX381 +FTBW0_SI1345 +FTBW0_SI1975 +FTBW0_SI715 +FTBW0_SX175 +FTBW0_SX265 +FTBW0_SX355 +FTBW0_SX445 +FTBW0_SX85 +FTLG0_SI1743 +FTLG0_SI483 +FTLG0_SI840 +FTLG0_SX123 +FTLG0_SX213 +FTLG0_SX303 +FTLG0_SX33 +FTLG0_SX393 +FTMG0_SI1532 +FTMG0_SI2162 +FTMG0_SI902 +FTMG0_SX182 +FTMG0_SX272 +FTMG0_SX362 +FTMG0_SX452 +FTMG0_SX92 +FVFB0_SI1032 +FVFB0_SI1510 +FVFB0_SI2292 +FVFB0_SX132 +FVFB0_SX222 +FVFB0_SX312 +FVFB0_SX402 +FVFB0_SX42 +FVKB0_SI1159 +FVKB0_SI1789 +FVKB0_SI529 +FVKB0_SX169 +FVKB0_SX259 +FVKB0_SX349 +FVKB0_SX439 +FVKB0_SX79 +FVMH0_SI1466 +FVMH0_SI2096 +FVMH0_SI836 +FVMH0_SX116 +FVMH0_SX206 +FVMH0_SX26 +FVMH0_SX296 +FVMH0_SX386 +MABC0_SI1620 +MABC0_SI2041 +MABC0_SI781 +MABC0_SX151 +MABC0_SX241 +MABC0_SX331 +MABC0_SX421 +MABC0_SX61 +MADC0_SI1367 +MADC0_SI1997 +MADC0_SI737 +MADC0_SX107 +MADC0_SX17 +MADC0_SX197 +MADC0_SX287 +MADC0_SX377 +MADD0_SI1295 +MADD0_SI1798 +MADD0_SI538 +MADD0_SX178 +MADD0_SX268 +MADD0_SX358 +MADD0_SX448 +MADD0_SX88 +MAEB0_SI1411 +MAEB0_SI2250 +MAEB0_SI990 +MAEB0_SX180 +MAEB0_SX270 +MAEB0_SX360 +MAEB0_SX450 +MAEB0_SX90 +MAEO0_SI1326 +MAEO0_SI1655 +MAEO0_SI1956 +MAEO0_SX156 +MAEO0_SX246 +MAEO0_SX336 +MAEO0_SX426 +MAEO0_SX66 +MAFM0_SI1569 +MAFM0_SI2199 +MAFM0_SI939 +MAFM0_SX129 +MAFM0_SX219 +MAFM0_SX309 +MAFM0_SX39 +MAFM0_SX399 +MAJP0_SI1074 +MAJP0_SI1704 +MAJP0_SI2334 +MAJP0_SX174 +MAJP0_SX264 +MAJP0_SX354 +MAJP0_SX444 +MAJP0_SX84 +MAKB0_SI1016 +MAKB0_SI1646 +MAKB0_SI2276 +MAKB0_SX116 +MAKB0_SX206 +MAKB0_SX26 +MAKB0_SX296 +MAKB0_SX386 +MAKR0_SI1352 +MAKR0_SI1982 +MAKR0_SI722 +MAKR0_SX182 +MAKR0_SX272 +MAKR0_SX362 +MAKR0_SX452 +MAKR0_SX92 +MAPV0_SI1293 +MAPV0_SI1923 +MAPV0_SI663 +MAPV0_SX123 +MAPV0_SX213 +MAPV0_SX303 +MAPV0_SX33 +MAPV0_SX393 +MARC0_SI1188 +MARC0_SI1818 +MARC0_SI558 +MARC0_SX108 +MARC0_SX18 +MARC0_SX198 +MARC0_SX288 +MARC0_SX378 +MARW0_SI1276 +MARW0_SI1906 +MARW0_SI646 +MARW0_SX106 +MARW0_SX16 +MARW0_SX286 +MARW0_SX349 +MARW0_SX376 +MBAR0_SI1319 +MBAR0_SI1949 +MBAR0_SI689 +MBAR0_SX149 +MBAR0_SX239 +MBAR0_SX329 +MBAR0_SX419 +MBAR0_SX59 +MBBR0_SI1055 +MBBR0_SI1685 +MBBR0_SI2315 +MBBR0_SX155 +MBBR0_SX245 +MBBR0_SX335 +MBBR0_SX425 +MBBR0_SX65 +MBCG0_SI2217 +MBCG0_SI486 +MBCG0_SI957 +MBCG0_SX147 +MBCG0_SX237 +MBCG0_SX327 +MBCG0_SX417 +MBCG0_SX57 +MBEF0_SI1281 +MBEF0_SI1911 +MBEF0_SI651 +MBEF0_SX111 +MBEF0_SX201 +MBEF0_SX21 +MBEF0_SX291 +MBEF0_SX381 +MBGT0_SI1341 +MBGT0_SI1841 +MBGT0_SI711 +MBGT0_SX171 +MBGT0_SX261 +MBGT0_SX351 +MBGT0_SX441 +MBGT0_SX81 +MBJV0_SI1247 +MBJV0_SI1877 +MBJV0_SI617 +MBJV0_SX167 +MBJV0_SX257 +MBJV0_SX347 +MBJV0_SX437 +MBJV0_SX77 +MBMA0_SI1222 +MBMA0_SI1852 +MBMA0_SI592 +MBMA0_SX142 +MBMA0_SX232 +MBMA0_SX322 +MBMA0_SX412 +MBMA0_SX52 +MBMA1_SI2207 +MBMA1_SI2214 +MBMA1_SI954 +MBMA1_SX144 +MBMA1_SX234 +MBMA1_SX324 +MBMA1_SX414 +MBMA1_SX54 +MBML0_SI1169 +MBML0_SI1799 +MBML0_SI539 +MBML0_SX179 +MBML0_SX269 +MBML0_SX359 +MBML0_SX449 +MBML0_SX89 +MBOM0_SI1014 +MBOM0_SI1644 +MBOM0_SI2274 +MBOM0_SX114 +MBOM0_SX204 +MBOM0_SX294 +MBOM0_SX311 +MBOM0_SX384 +MBSB0_SI1353 +MBSB0_SI1983 +MBSB0_SI723 +MBSB0_SX183 +MBSB0_SX273 +MBSB0_SX3 +MBSB0_SX363 +MBSB0_SX93 +MBTH0_SI2102 +MBTH0_SI505 +MBTH0_SI757 +MBTH0_SX122 +MBTH0_SX212 +MBTH0_SX302 +MBTH0_SX32 +MBTH0_SX392 +MBWP0_SI1531 +MBWP0_SI1969 +MBWP0_SI709 +MBWP0_SX169 +MBWP0_SX259 +MBWP0_SX349 +MBWP0_SX439 +MBWP0_SX79 +MCAE0_SI1447 +MCAE0_SI2077 +MCAE0_SI817 +MCAE0_SX187 +MCAE0_SX277 +MCAE0_SX367 +MCAE0_SX7 +MCAE0_SX97 +MCAL0_SI1138 +MCAL0_SI1768 +MCAL0_SI508 +MCAL0_SX148 +MCAL0_SX238 +MCAL0_SX328 +MCAL0_SX418 +MCAL0_SX58 +MCDC0_SI1292 +MCDC0_SI1922 +MCDC0_SI662 +MCDC0_SX122 +MCDC0_SX212 +MCDC0_SX302 +MCDC0_SX32 +MCDC0_SX392 +MCDD0_SI1513 +MCDD0_SI2143 +MCDD0_SI883 +MCDD0_SX163 +MCDD0_SX253 +MCDD0_SX343 +MCDD0_SX433 +MCDD0_SX73 +MCDR0_SI1154 +MCDR0_SI1784 +MCDR0_SI524 +MCDR0_SX164 +MCDR0_SX254 +MCDR0_SX344 +MCDR0_SX434 +MCDR0_SX74 +MCEF0_SI1135 +MCEF0_SI1765 +MCEF0_SI842 +MCEF0_SX145 +MCEF0_SX235 +MCEF0_SX325 +MCEF0_SX415 +MCEF0_SX55 +MCEW0_SI1442 +MCEW0_SI2072 +MCEW0_SI812 +MCEW0_SX182 +MCEW0_SX272 +MCEW0_SX362 +MCEW0_SX452 +MCEW0_SX92 +MCHL0_SI1347 +MCHL0_SI1404 +MCHL0_SI1977 +MCHL0_SX177 +MCHL0_SX267 +MCHL0_SX357 +MCHL0_SX447 +MCHL0_SX87 +MCLK0_SI1660 +MCLK0_SI2290 +MCLK0_SI650 +MCLK0_SX130 +MCLK0_SX220 +MCLK0_SX310 +MCLK0_SX40 +MCLK0_SX400 +MCLM0_SI1456 +MCLM0_SI2086 +MCLM0_SI826 +MCLM0_SX106 +MCLM0_SX16 +MCLM0_SX196 +MCLM0_SX286 +MCLM0_SX376 +MCPM0_SI1194 +MCPM0_SI1824 +MCPM0_SI564 +MCPM0_SX114 +MCPM0_SX204 +MCPM0_SX24 +MCPM0_SX294 +MCPM0_SX384 +MCRE0_SI1121 +MCRE0_SI1725 +MCRE0_SI1751 +MCRE0_SX131 +MCRE0_SX221 +MCRE0_SX24 +MCRE0_SX401 +MCRE0_SX41 +MCSS0_SI1380 +MCSS0_SI688 +MCSS0_SI750 +MCSS0_SX120 +MCSS0_SX210 +MCSS0_SX30 +MCSS0_SX300 +MCSS0_SX390 +MCTH0_SI1209 +MCTH0_SI1839 +MCTH0_SI579 +MCTH0_SX129 +MCTH0_SX219 +MCTH0_SX309 +MCTH0_SX39 +MCTH0_SX399 +MCTM0_SI1350 +MCTM0_SI1980 +MCTM0_SI720 +MCTM0_SX180 +MCTM0_SX270 +MCTM0_SX360 +MCTM0_SX450 +MCTM0_SX90 +MCXM0_SI1351 +MCXM0_SI1981 +MCXM0_SI721 +MCXM0_SX181 +MCXM0_SX271 +MCXM0_SX361 +MCXM0_SX451 +MCXM0_SX91 +MDAC0_SI1261 +MDAC0_SI1837 +MDAC0_SI631 +MDAC0_SX181 +MDAC0_SX271 +MDAC0_SX361 +MDAC0_SX451 +MDAC0_SX91 +MDAS0_SI1266 +MDAS0_SI1896 +MDAS0_SI636 +MDAS0_SX186 +MDAS0_SX21 +MDAS0_SX276 +MDAS0_SX6 +MDAS0_SX96 +MDBB1_SI1006 +MDBB1_SI1636 +MDBB1_SI2056 +MDBB1_SX106 +MDBB1_SX16 +MDBB1_SX196 +MDBB1_SX286 +MDBB1_SX376 +MDBP0_SI1158 +MDBP0_SI1788 +MDBP0_SI528 +MDBP0_SX168 +MDBP0_SX258 +MDBP0_SX348 +MDBP0_SX438 +MDBP0_SX78 +MDCD0_SI1415 +MDCD0_SI2045 +MDCD0_SI785 +MDCD0_SX155 +MDCD0_SX245 +MDCD0_SX335 +MDCD0_SX425 +MDCD0_SX65 +MDCM0_SI1480 +MDCM0_SI2110 +MDCM0_SI850 +MDCM0_SX130 +MDCM0_SX220 +MDCM0_SX310 +MDCM0_SX40 +MDCM0_SX400 +MDDC0_SI1419 +MDDC0_SI2049 +MDDC0_SI789 +MDDC0_SX159 +MDDC0_SX249 +MDDC0_SX339 +MDDC0_SX429 +MDDC0_SX69 +MDED0_SI1170 +MDED0_SI1800 +MDED0_SI540 +MDED0_SX180 +MDED0_SX270 +MDED0_SX360 +MDED0_SX450 +MDED0_SX90 +MDEF0_SI1123 +MDEF0_SI1563 +MDEF0_SI2193 +MDEF0_SX123 +MDEF0_SX213 +MDEF0_SX303 +MDEF0_SX33 +MDEF0_SX393 +MDEM0_SI1868 +MDEM0_SI608 +MDEM0_SI800 +MDEM0_SX158 +MDEM0_SX248 +MDEM0_SX338 +MDEM0_SX428 +MDEM0_SX68 +MDHL0_SI1439 +MDHL0_SI2069 +MDHL0_SI809 +MDHL0_SX179 +MDHL0_SX269 +MDHL0_SX359 +MDHL0_SX449 +MDHL0_SX89 +MDHS0_SI1530 +MDHS0_SI2160 +MDHS0_SI900 +MDHS0_SX180 +MDHS0_SX270 +MDHS0_SX360 +MDHS0_SX450 +MDHS0_SX90 +MDJM0_SI1455 +MDJM0_SI2085 +MDJM0_SI825 +MDJM0_SX105 +MDJM0_SX15 +MDJM0_SX195 +MDJM0_SX285 +MDJM0_SX375 +MDKS0_SI1066 +MDKS0_SI1696 +MDKS0_SI2326 +MDKS0_SX166 +MDKS0_SX256 +MDKS0_SX346 +MDKS0_SX436 +MDKS0_SX76 +MDLB0_SI1306 +MDLB0_SI1936 +MDLB0_SI676 +MDLB0_SX136 +MDLB0_SX226 +MDLB0_SX316 +MDLB0_SX406 +MDLB0_SX46 +MDLC0_SI1395 +MDLC0_SI2025 +MDLC0_SI765 +MDLC0_SX135 +MDLC0_SX225 +MDLC0_SX315 +MDLC0_SX405 +MDLC0_SX45 +MDLC1_SI1435 +MDLC1_SI2065 +MDLC1_SI2144 +MDLC1_SX175 +MDLC1_SX265 +MDLC1_SX355 +MDLC1_SX445 +MDLC1_SX85 +MDLC2_SI1614 +MDLC2_SI2244 +MDLC2_SI984 +MDLC2_SX174 +MDLC2_SX264 +MDLC2_SX354 +MDLC2_SX444 +MDLC2_SX84 +MDLH0_SI1960 +MDLH0_SI574 +MDLH0_SI700 +MDLH0_SX160 +MDLH0_SX250 +MDLH0_SX340 +MDLH0_SX430 +MDLH0_SX70 +MDLM0_SI1234 +MDLM0_SI1864 +MDLM0_SI604 +MDLM0_SX154 +MDLM0_SX244 +MDLM0_SX334 +MDLM0_SX424 +MDLM0_SX64 +MDLR0_SI1233 +MDLR0_SI1863 +MDLR0_SI603 +MDLR0_SX153 +MDLR0_SX243 +MDLR0_SX333 +MDLR0_SX423 +MDLR0_SX63 +MDLR1_SI1299 +MDLR1_SI1929 +MDLR1_SI669 +MDLR1_SX129 +MDLR1_SX219 +MDLR1_SX309 +MDLR1_SX39 +MDLR1_SX399 +MDMA0_SI1238 +MDMA0_SI1430 +MDMA0_SI2060 +MDMA0_SX170 +MDMA0_SX260 +MDMA0_SX350 +MDMA0_SX440 +MDMA0_SX80 +MDMT0_SI1832 +MDMT0_SI2341 +MDMT0_SI572 +MDMT0_SX122 +MDMT0_SX212 +MDMT0_SX302 +MDMT0_SX32 +MDMT0_SX392 +MDNS0_SI1011 +MDNS0_SI2271 +MDNS0_SI873 +MDNS0_SX111 +MDNS0_SX201 +MDNS0_SX21 +MDNS0_SX291 +MDNS0_SX381 +MDPB0_SI1760 +MDPB0_SI2126 +MDPB0_SI866 +MDPB0_SX146 +MDPB0_SX236 +MDPB0_SX326 +MDPB0_SX416 +MDPB0_SX56 +MDPK0_SI1053 +MDPK0_SI1683 +MDPK0_SI552 +MDPK0_SX153 +MDPK0_SX243 +MDPK0_SX333 +MDPK0_SX423 +MDPK0_SX63 +MDPS0_SI1651 +MDPS0_SI1979 +MDPS0_SI719 +MDPS0_SX179 +MDPS0_SX269 +MDPS0_SX359 +MDPS0_SX449 +MDPS0_SX89 +MDRD0_SI1382 +MDRD0_SI2012 +MDRD0_SI752 +MDRD0_SX122 +MDRD0_SX212 +MDRD0_SX302 +MDRD0_SX32 +MDRD0_SX392 +MDSJ0_SI1462 +MDSJ0_SI2092 +MDSJ0_SI832 +MDSJ0_SX112 +MDSJ0_SX22 +MDSJ0_SX292 +MDSJ0_SX382 +MDSJ0_SX438 +MDSS0_SI1881 +MDSS0_SI2087 +MDSS0_SI621 +MDSS0_SX171 +MDSS0_SX261 +MDSS0_SX351 +MDSS0_SX441 +MDSS0_SX81 +MDSS1_SI1327 +MDSS1_SI1713 +MDSS1_SI697 +MDSS1_SX157 +MDSS1_SX247 +MDSS1_SX337 +MDSS1_SX427 +MDSS1_SX67 +MDTB0_SI1200 +MDTB0_SI1830 +MDTB0_SI570 +MDTB0_SX120 +MDTB0_SX210 +MDTB0_SX300 +MDTB0_SX321 +MDTB0_SX390 +MDWD0_SI1260 +MDWD0_SI1890 +MDWD0_SI557 +MDWD0_SX180 +MDWD0_SX270 +MDWD0_SX360 +MDWD0_SX450 +MDWD0_SX90 +MDWH0_SI1168 +MDWH0_SI1925 +MDWH0_SI665 +MDWH0_SX125 +MDWH0_SX215 +MDWH0_SX305 +MDWH0_SX35 +MDWH0_SX395 +MDWM0_SI1546 +MDWM0_SI2176 +MDWM0_SI916 +MDWM0_SX106 +MDWM0_SX16 +MDWM0_SX286 +MDWM0_SX376 +MDWM0_SX433 +MEAL0_SI1547 +MEAL0_SI2177 +MEAL0_SI917 +MEAL0_SX107 +MEAL0_SX197 +MEAL0_SX287 +MEAL0_SX347 +MEAL0_SX377 +MEDR0_SI1374 +MEDR0_SI2004 +MEDR0_SI744 +MEDR0_SX114 +MEDR0_SX204 +MEDR0_SX24 +MEDR0_SX294 +MEDR0_SX384 +MEFG0_SI465 +MEFG0_SI491 +MEFG0_SI598 +MEFG0_SX105 +MEFG0_SX15 +MEFG0_SX195 +MEFG0_SX285 +MEFG0_SX375 +MEGJ0_SI1337 +MEGJ0_SI1967 +MEGJ0_SI707 +MEGJ0_SX167 +MEGJ0_SX257 +MEGJ0_SX3 +MEGJ0_SX437 +MEGJ0_SX77 +MEJL0_SI1592 +MEJL0_SI1654 +MEJL0_SI962 +MEJL0_SX152 +MEJL0_SX242 +MEJL0_SX332 +MEJL0_SX422 +MEJL0_SX62 +MEJS0_SI1240 +MEJS0_SI1870 +MEJS0_SI610 +MEJS0_SX160 +MEJS0_SX250 +MEJS0_SX340 +MEJS0_SX430 +MEJS0_SX70 +MESG0_SI1332 +MESG0_SI1962 +MESG0_SI702 +MESG0_SX162 +MESG0_SX252 +MESG0_SX342 +MESG0_SX432 +MESG0_SX72 +MESJ0_SI2039 +MESJ0_SI2257 +MESJ0_SI997 +MESJ0_SX187 +MESJ0_SX277 +MESJ0_SX367 +MESJ0_SX7 +MESJ0_SX97 +MEWM0_SI1348 +MEWM0_SI1978 +MEWM0_SI718 +MEWM0_SX178 +MEWM0_SX268 +MEWM0_SX358 +MEWM0_SX448 +MEWM0_SX88 +MFER0_SI1492 +MFER0_SI2122 +MFER0_SI862 +MFER0_SX142 +MFER0_SX232 +MFER0_SX322 +MFER0_SX412 +MFER0_SX52 +MFMC0_SI1132 +MFMC0_SI1762 +MFMC0_SI502 +MFMC0_SX142 +MFMC0_SX232 +MFMC0_SX322 +MFMC0_SX412 +MFMC0_SX52 +MFRM0_SI1155 +MFRM0_SI1717 +MFRM0_SI1785 +MFRM0_SX165 +MFRM0_SX255 +MFRM0_SX345 +MFRM0_SX435 +MFRM0_SX75 +MFWK0_SI1249 +MFWK0_SI1879 +MFWK0_SI619 +MFWK0_SX169 +MFWK0_SX259 +MFWK0_SX349 +MFWK0_SX439 +MFWK0_SX79 +MFXS0_SI1674 +MFXS0_SI2225 +MFXS0_SI2304 +MFXS0_SX144 +MFXS0_SX234 +MFXS0_SX324 +MFXS0_SX414 +MFXS0_SX54 +MFXV0_SI1005 +MFXV0_SI1342 +MFXV0_SI1635 +MFXV0_SX105 +MFXV0_SX15 +MFXV0_SX195 +MFXV0_SX285 +MFXV0_SX375 +MGAF0_SI1282 +MGAF0_SI1912 +MGAF0_SI652 +MGAF0_SX112 +MGAF0_SX202 +MGAF0_SX22 +MGAF0_SX292 +MGAF0_SX382 +MGAG0_SI1321 +MGAG0_SI645 +MGAG0_SI691 +MGAG0_SX151 +MGAG0_SX241 +MGAG0_SX331 +MGAG0_SX421 +MGAG0_SX61 +MGAK0_SI1036 +MGAK0_SI1666 +MGAK0_SI2296 +MGAK0_SX136 +MGAK0_SX226 +MGAK0_SX316 +MGAK0_SX406 +MGAK0_SX46 +MGAR0_SI1212 +MGAR0_SI1694 +MGAR0_SI1842 +MGAR0_SX132 +MGAR0_SX222 +MGAR0_SX312 +MGAR0_SX402 +MGAR0_SX42 +MGAW0_SI1165 +MGAW0_SI1802 +MGAW0_SI535 +MGAW0_SX175 +MGAW0_SX265 +MGAW0_SX355 +MGAW0_SX445 +MGAW0_SX85 +MGES0_SI1481 +MGES0_SI2111 +MGES0_SI851 +MGES0_SX131 +MGES0_SX221 +MGES0_SX311 +MGES0_SX401 +MGES0_SX41 +MGJC0_SI1256 +MGJC0_SI1335 +MGJC0_SI1965 +MGJC0_SX165 +MGJC0_SX255 +MGJC0_SX345 +MGJC0_SX435 +MGJC0_SX75 +MGRL0_SI1497 +MGRL0_SI2127 +MGRL0_SI867 +MGRL0_SX147 +MGRL0_SX237 +MGRL0_SX327 +MGRL0_SX417 +MGRL0_SX57 +MGRP0_SI1317 +MGRP0_SI1947 +MGRP0_SI687 +MGRP0_SX147 +MGRP0_SX237 +MGRP0_SX327 +MGRP0_SX417 +MGRP0_SX57 +MGSH0_SI1176 +MGSH0_SI1806 +MGSH0_SI546 +MGSH0_SX127 +MGSH0_SX186 +MGSH0_SX276 +MGSH0_SX6 +MGSH0_SX96 +MGSL0_SI1164 +MGSL0_SI534 +MGSL0_SI797 +MGSL0_SX174 +MGSL0_SX264 +MGSL0_SX354 +MGSL0_SX444 +MGSL0_SX84 +MGXP0_SI1087 +MGXP0_SI457 +MGXP0_SI525 +MGXP0_SX187 +MGXP0_SX277 +MGXP0_SX367 +MGXP0_SX7 +MGXP0_SX97 +MHBS0_SI1575 +MHBS0_SI2205 +MHBS0_SI945 +MHBS0_SX135 +MHBS0_SX225 +MHBS0_SX315 +MHBS0_SX405 +MHBS0_SX45 +MHIT0_SI1613 +MHIT0_SI2243 +MHIT0_SI983 +MHIT0_SX173 +MHIT0_SX263 +MHIT0_SX353 +MHIT0_SX443 +MHIT0_SX83 +MHJB0_SI1017 +MHJB0_SI1647 +MHJB0_SI2277 +MHJB0_SX117 +MHJB0_SX207 +MHJB0_SX27 +MHJB0_SX297 +MHJB0_SX387 +MHMG0_SI1365 +MHMG0_SI1995 +MHMG0_SI735 +MHMG0_SX105 +MHMG0_SX15 +MHMG0_SX195 +MHMG0_SX285 +MHMG0_SX375 +MHMR0_SI1119 +MHMR0_SI1692 +MHMR0_SI489 +MHMR0_SX129 +MHMR0_SX219 +MHMR0_SX309 +MHMR0_SX39 +MHMR0_SX399 +MHRM0_SI1475 +MHRM0_SI2218 +MHRM0_SI958 +MHRM0_SX148 +MHRM0_SX238 +MHRM0_SX328 +MHRM0_SX418 +MHRM0_SX58 +MHXL0_SI1772 +MHXL0_SI512 +MHXL0_SI612 +MHXL0_SX152 +MHXL0_SX242 +MHXL0_SX332 +MHXL0_SX422 +MHXL0_SX62 +MILB0_SI2163 +MILB0_SI807 +MILB0_SI903 +MILB0_SX183 +MILB0_SX273 +MILB0_SX3 +MILB0_SX363 +MILB0_SX93 +MJAC0_SI1331 +MJAC0_SI2148 +MJAC0_SI701 +MJAC0_SX251 +MJAC0_SX307 +MJAC0_SX341 +MJAC0_SX431 +MJAC0_SX71 +MJAE0_SI1524 +MJAE0_SI1999 +MJAE0_SI2154 +MJAE0_SX174 +MJAE0_SX264 +MJAE0_SX354 +MJAE0_SX444 +MJAE0_SX84 +MJAI0_SI1604 +MJAI0_SI682 +MJAI0_SI710 +MJAI0_SX164 +MJAI0_SX254 +MJAI0_SX344 +MJAI0_SX434 +MJAI0_SX74 +MJBG0_SI1232 +MJBG0_SI1724 +MJBG0_SI1862 +MJBG0_SX152 +MJBG0_SX242 +MJBG0_SX332 +MJBG0_SX422 +MJBG0_SX62 +MJDA0_SI1031 +MJDA0_SI1661 +MJDA0_SI2291 +MJDA0_SX131 +MJDA0_SX221 +MJDA0_SX311 +MJDA0_SX401 +MJDA0_SX41 +MJDC0_SI1161 +MJDC0_SI2165 +MJDC0_SI531 +MJDC0_SX171 +MJDC0_SX261 +MJDC0_SX351 +MJDC0_SX441 +MJDC0_SX81 +MJDE0_SI1120 +MJDE0_SI463 +MJDE0_SI490 +MJDE0_SX130 +MJDE0_SX220 +MJDE0_SX310 +MJDE0_SX40 +MJDE0_SX400 +MJDG0_SI1042 +MJDG0_SI1672 +MJDG0_SI1705 +MJDG0_SX142 +MJDG0_SX232 +MJDG0_SX322 +MJDG0_SX412 +MJDG0_SX52 +MJDM0_SI1340 +MJDM0_SI1937 +MJDM0_SI974 +MJDM0_SX170 +MJDM0_SX260 +MJDM0_SX350 +MJDM0_SX440 +MJDM0_SX80 +MJEB0_SI1286 +MJEB0_SI1916 +MJEB0_SI656 +MJEB0_SX170 +MJEB0_SX206 +MJEB0_SX26 +MJEB0_SX296 +MJEB0_SX386 +MJEB1_SI1467 +MJEB1_SI2097 +MJEB1_SI837 +MJEB1_SX117 +MJEB1_SX207 +MJEB1_SX27 +MJEB1_SX297 +MJEB1_SX387 +MJEE0_SI1237 +MJEE0_SI1867 +MJEE0_SI607 +MJEE0_SX157 +MJEE0_SX247 +MJEE0_SX337 +MJEE0_SX427 +MJEE0_SX67 +MJFH0_SI1107 +MJFH0_SI1737 +MJFH0_SI477 +MJFH0_SX117 +MJFH0_SX207 +MJFH0_SX27 +MJFH0_SX297 +MJFH0_SX387 +MJFR0_SI1605 +MJFR0_SI2235 +MJFR0_SI975 +MJFR0_SX165 +MJFR0_SX255 +MJFR0_SX345 +MJFR0_SX435 +MJFR0_SX75 +MJHI0_SI1328 +MJHI0_SI555 +MJHI0_SI698 +MJHI0_SX158 +MJHI0_SX248 +MJHI0_SX338 +MJHI0_SX428 +MJHI0_SX68 +MJJB0_SI1139 +MJJB0_SI1277 +MJJB0_SI1769 +MJJB0_SX149 +MJJB0_SX239 +MJJB0_SX329 +MJJB0_SX419 +MJJB0_SX59 +MJJJ0_SI1163 +MJJJ0_SI1793 +MJJJ0_SI533 +MJJJ0_SX173 +MJJJ0_SX263 +MJJJ0_SX353 +MJJJ0_SX443 +MJJJ0_SX83 +MJJM0_SI1251 +MJJM0_SI1457 +MJJM0_SI827 +MJJM0_SX107 +MJJM0_SX17 +MJJM0_SX197 +MJJM0_SX287 +MJJM0_SX377 +MJKR0_SI1201 +MJKR0_SI1831 +MJKR0_SI571 +MJKR0_SX121 +MJKR0_SX211 +MJKR0_SX301 +MJKR0_SX31 +MJKR0_SX391 +MJLB0_SI1616 +MJLB0_SI2246 +MJLB0_SI986 +MJLB0_SX176 +MJLB0_SX266 +MJLB0_SX356 +MJLB0_SX446 +MJLB0_SX86 +MJLG1_SI1012 +MJLG1_SI1642 +MJLG1_SI2272 +MJLG1_SX112 +MJLG1_SX202 +MJLG1_SX22 +MJLG1_SX292 +MJLG1_SX382 +MJLS0_SI1096 +MJLS0_SI1726 +MJLS0_SI466 +MJLS0_SX106 +MJLS0_SX16 +MJLS0_SX196 +MJLS0_SX286 +MJLS0_SX376 +MJMA0_SI1495 +MJMA0_SI2125 +MJMA0_SI865 +MJMA0_SX145 +MJMA0_SX235 +MJMA0_SX325 +MJMA0_SX415 +MJMA0_SX55 +MJMD0_SI1028 +MJMD0_SI1658 +MJMD0_SI2288 +MJMD0_SX128 +MJMD0_SX218 +MJMD0_SX308 +MJMD0_SX38 +MJMD0_SX398 +MJMM0_SI1255 +MJMM0_SI1885 +MJMM0_SI625 +MJMM0_SX175 +MJMM0_SX265 +MJMM0_SX355 +MJMM0_SX445 +MJMM0_SX85 +MJPG0_SI1191 +MJPG0_SI1821 +MJPG0_SI561 +MJPG0_SX111 +MJPG0_SX201 +MJPG0_SX21 +MJPG0_SX291 +MJPG0_SX381 +MJPM0_SI1368 +MJPM0_SI1998 +MJPM0_SI738 +MJPM0_SX108 +MJPM0_SX18 +MJPM0_SX198 +MJPM0_SX288 +MJPM0_SX378 +MJPM1_SI1897 +MJPM1_SI2280 +MJPM1_SI761 +MJPM1_SX131 +MJPM1_SX221 +MJPM1_SX311 +MJPM1_SX401 +MJPM1_SX41 +MJRA0_SI1236 +MJRA0_SI1866 +MJRA0_SI606 +MJRA0_SX156 +MJRA0_SX246 +MJRA0_SX336 +MJRA0_SX426 +MJRA0_SX66 +MJRG0_SI1366 +MJRG0_SI1996 +MJRG0_SI736 +MJRG0_SX106 +MJRG0_SX16 +MJRG0_SX286 +MJRG0_SX352 +MJRG0_SX376 +MJRH0_SI1125 +MJRH0_SI1755 +MJRH0_SI1840 +MJRH0_SX135 +MJRH0_SX225 +MJRH0_SX315 +MJRH0_SX405 +MJRH0_SX45 +MJRH1_SI1558 +MJRH1_SI1774 +MJRH1_SI514 +MJRH1_SX154 +MJRH1_SX244 +MJRH1_SX334 +MJRH1_SX424 +MJRH1_SX64 +MJRK0_SI1662 +MJRK0_SI2103 +MJRK0_SI880 +MJRK0_SX160 +MJRK0_SX250 +MJRK0_SX340 +MJRK0_SX430 +MJRK0_SX70 +MJRP0_SI1835 +MJRP0_SI1845 +MJRP0_SI585 +MJRP0_SX135 +MJRP0_SX225 +MJRP0_SX315 +MJRP0_SX405 +MJRP0_SX45 +MJSR0_SI1424 +MJSR0_SI2054 +MJSR0_SI794 +MJSR0_SX164 +MJSR0_SX254 +MJSR0_SX344 +MJSR0_SX434 +MJSR0_SX74 +MJWG0_SI2155 +MJWG0_SI813 +MJWG0_SI895 +MJWG0_SX175 +MJWG0_SX265 +MJWG0_SX355 +MJWG0_SX445 +MJWG0_SX85 +MJWS0_SI1143 +MJWS0_SI1773 +MJWS0_SI513 +MJWS0_SX153 +MJWS0_SX243 +MJWS0_SX333 +MJWS0_SX423 +MJWS0_SX63 +MJWT0_SI1291 +MJWT0_SI1381 +MJWT0_SI751 +MJWT0_SX121 +MJWT0_SX211 +MJWT0_SX301 +MJWT0_SX31 +MJWT0_SX391 +MJXA0_SI1507 +MJXA0_SI2137 +MJXA0_SI877 +MJXA0_SX157 +MJXA0_SX247 +MJXA0_SX337 +MJXA0_SX427 +MJXA0_SX67 +MJXL0_SI1172 +MJXL0_SI1795 +MJXL0_SI542 +MJXL0_SX182 +MJXL0_SX272 +MJXL0_SX362 +MJXL0_SX452 +MJXL0_SX92 +MKAG0_SI1609 +MKAG0_SI2239 +MKAG0_SI979 +MKAG0_SX169 +MKAG0_SX259 +MKAG0_SX30 +MKAG0_SX439 +MKAG0_SX79 +MKAH0_SI1528 +MKAH0_SI2158 +MKAH0_SI898 +MKAH0_SX178 +MKAH0_SX268 +MKAH0_SX358 +MKAH0_SX448 +MKAH0_SX88 +MKAJ0_SI1414 +MKAJ0_SI2044 +MKAJ0_SI784 +MKAJ0_SX154 +MKAJ0_SX244 +MKAJ0_SX334 +MKAJ0_SX424 +MKAJ0_SX64 +MKAM0_SI1250 +MKAM0_SI1316 +MKAM0_SI1465 +MKAM0_SX146 +MKAM0_SX236 +MKAM0_SX326 +MKAM0_SX416 +MKAM0_SX56 +MKDB0_SI2132 +MKDB0_SI588 +MKDB0_SI872 +MKDB0_SX152 +MKDB0_SX242 +MKDB0_SX332 +MKDB0_SX422 +MKDB0_SX62 +MKDD0_SI1567 +MKDD0_SI2197 +MKDD0_SI937 +MKDD0_SX127 +MKDD0_SX217 +MKDD0_SX307 +MKDD0_SX37 +MKDD0_SX397 +MKDT0_SI2153 +MKDT0_SI814 +MKDT0_SI893 +MKDT0_SX173 +MKDT0_SX263 +MKDT0_SX353 +MKDT0_SX443 +MKDT0_SX83 +MKES0_SI1253 +MKES0_SI1883 +MKES0_SI623 +MKES0_SX173 +MKES0_SX263 +MKES0_SX353 +MKES0_SX443 +MKES0_SX83 +MKJO0_SI1517 +MKJO0_SI2147 +MKJO0_SI887 +MKJO0_SX167 +MKJO0_SX257 +MKJO0_SX424 +MKJO0_SX437 +MKJO0_SX77 +MKLN0_SI1598 +MKLN0_SI2228 +MKLN0_SI968 +MKLN0_SX158 +MKLN0_SX248 +MKLN0_SX338 +MKLN0_SX428 +MKLN0_SX68 +MKLR0_SI1059 +MKLR0_SI1689 +MKLR0_SI2319 +MKLR0_SX159 +MKLR0_SX249 +MKLR0_SX339 +MKLR0_SX429 +MKLR0_SX69 +MKLS0_SI1437 +MKLS0_SI1533 +MKLS0_SI2067 +MKLS0_SX177 +MKLS0_SX267 +MKLS0_SX357 +MKLS0_SX447 +MKLS0_SX87 +MKLS1_SI1545 +MKLS1_SI2175 +MKLS1_SI915 +MKLS1_SX105 +MKLS1_SX15 +MKLS1_SX195 +MKLS1_SX285 +MKLS1_SX375 +MKLW0_SI1571 +MKLW0_SI1844 +MKLW0_SI2201 +MKLW0_SX131 +MKLW0_SX221 +MKLW0_SX311 +MKLW0_SX401 +MKLW0_SX41 +MKRG0_SI1491 +MKRG0_SI2121 +MKRG0_SI861 +MKRG0_SX141 +MKRG0_SX231 +MKRG0_SX31 +MKRG0_SX411 +MKRG0_SX51 +MKXL0_SI1185 +MKXL0_SI1815 +MKXL0_SI1958 +MKXL0_SX105 +MKXL0_SX15 +MKXL0_SX195 +MKXL0_SX285 +MKXL0_SX375 +MLBC0_SI1239 +MLBC0_SI1869 +MLBC0_SI609 +MLBC0_SX159 +MLBC0_SX249 +MLBC0_SX339 +MLBC0_SX429 +MLBC0_SX69 +MLEL0_SI1246 +MLEL0_SI1876 +MLEL0_SI616 +MLEL0_SX166 +MLEL0_SX256 +MLEL0_SX346 +MLEL0_SX436 +MLEL0_SX76 +MLJC0_SI1225 +MLJC0_SI1855 +MLJC0_SI595 +MLJC0_SX145 +MLJC0_SX235 +MLJC0_SX325 +MLJC0_SX415 +MLJC0_SX55 +MLJH0_SI1324 +MLJH0_SI1422 +MLJH0_SI694 +MLJH0_SX154 +MLJH0_SX244 +MLJH0_SX334 +MLJH0_SX424 +MLJH0_SX64 +MLNS0_SI1407 +MLNS0_SI2037 +MLNS0_SI777 +MLNS0_SX147 +MLNS0_SX237 +MLNS0_SX327 +MLNS0_SX417 +MLNS0_SX57 +MLSH0_SI1417 +MLSH0_SI2047 +MLSH0_SI787 +MLSH0_SX157 +MLSH0_SX247 +MLSH0_SX337 +MLSH0_SX427 +MLSH0_SX67 +MMAA0_SI1588 +MMAA0_SI2105 +MMAA0_SI845 +MMAA0_SX125 +MMAA0_SX215 +MMAA0_SX305 +MMAA0_SX35 +MMAA0_SX395 +MMAB1_SI1494 +MMAB1_SI2124 +MMAB1_SI864 +MMAB1_SX144 +MMAB1_SX234 +MMAB1_SX324 +MMAB1_SX414 +MMAB1_SX54 +MMAG0_SI1126 +MMAG0_SI1756 +MMAG0_SI496 +MMAG0_SX136 +MMAG0_SX226 +MMAG0_SX316 +MMAG0_SX406 +MMAG0_SX46 +MMAM0_SI1597 +MMAM0_SI1668 +MMAM0_SI2227 +MMAM0_SX157 +MMAM0_SX247 +MMAM0_SX337 +MMAM0_SX427 +MMAM0_SX67 +MMAR0_SI1336 +MMAR0_SI1966 +MMAR0_SI706 +MMAR0_SX166 +MMAR0_SX256 +MMAR0_SX346 +MMAR0_SX436 +MMAR0_SX76 +MMBS0_SI1151 +MMBS0_SI1781 +MMBS0_SI521 +MMBS0_SX161 +MMBS0_SX251 +MMBS0_SX341 +MMBS0_SX431 +MMBS0_SX71 +MMCC0_SI1338 +MMCC0_SI1968 +MMCC0_SI708 +MMCC0_SX168 +MMCC0_SX258 +MMCC0_SX348 +MMCC0_SX438 +MMCC0_SX78 +MMDB0_SI1358 +MMDB0_SI1617 +MMDB0_SI987 +MMDB0_SX177 +MMDB0_SX267 +MMDB0_SX357 +MMDB0_SX447 +MMDB0_SX87 +MMDG0_SI1780 +MMDG0_SI2035 +MMDG0_SI520 +MMDG0_SX160 +MMDG0_SX250 +MMDG0_SX340 +MMDG0_SX430 +MMDG0_SX70 +MMDM0_SI1311 +MMDM0_SI1941 +MMDM0_SI681 +MMDM0_SX141 +MMDM0_SX231 +MMDM0_SX321 +MMDM0_SX411 +MMDM0_SX51 +MMDM1_SI1650 +MMDM1_SI2043 +MMDM1_SI783 +MMDM1_SX153 +MMDM1_SX243 +MMDM1_SX333 +MMDM1_SX423 +MMDM1_SX63 +MMDS0_SI1343 +MMDS0_SI1973 +MMDS0_SI713 +MMDS0_SX173 +MMDS0_SX263 +MMDS0_SX353 +MMDS0_SX443 +MMDS0_SX83 +MMEA0_SI1388 +MMEA0_SI2018 +MMEA0_SI758 +MMEA0_SX128 +MMEA0_SX218 +MMEA0_SX308 +MMEA0_SX38 +MMEA0_SX398 +MMEB0_SI1357 +MMEB0_SI1987 +MMEB0_SI727 +MMEB0_SX187 +MMEB0_SX327 +MMEB0_SX367 +MMEB0_SX7 +MMEB0_SX97 +MMGC0_SI1305 +MMGC0_SI1935 +MMGC0_SI2184 +MMGC0_SX135 +MMGC0_SX225 +MMGC0_SX315 +MMGC0_SX405 +MMGC0_SX45 +MMGG0_SI1079 +MMGG0_SI1709 +MMGG0_SI2339 +MMGG0_SX179 +MMGG0_SX269 +MMGG0_SX359 +MMGG0_SX449 +MMGG0_SX89 +MMGK0_SI1322 +MMGK0_SI1952 +MMGK0_SI692 +MMGK0_SX152 +MMGK0_SX242 +MMGK0_SX332 +MMGK0_SX422 +MMGK0_SX62 +MMJB1_SI1408 +MMJB1_SI2038 +MMJB1_SI778 +MMJB1_SX148 +MMJB1_SX238 +MMJB1_SX328 +MMJB1_SX418 +MMJB1_SX58 +MMLM0_SI1527 +MMLM0_SI2150 +MMLM0_SI897 +MMLM0_SX177 +MMLM0_SX267 +MMLM0_SX357 +MMLM0_SX447 +MMLM0_SX87 +MMPM0_SI1061 +MMPM0_SI1691 +MMPM0_SI2321 +MMPM0_SX161 +MMPM0_SX251 +MMPM0_SX341 +MMPM0_SX431 +MMPM0_SX71 +MMRP0_SI2034 +MMRP0_SI717 +MMRP0_SI774 +MMRP0_SX144 +MMRP0_SX234 +MMRP0_SX324 +MMRP0_SX414 +MMRP0_SX54 +MMSM0_SI1106 +MMSM0_SI1736 +MMSM0_SI476 +MMSM0_SX116 +MMSM0_SX206 +MMSM0_SX26 +MMSM0_SX296 +MMSM0_SX386 +MMVP0_SI1284 +MMVP0_SI1914 +MMVP0_SI654 +MMVP0_SX114 +MMVP0_SX204 +MMVP0_SX294 +MMVP0_SX347 +MMVP0_SX384 +MMWB0_SI1619 +MMWB0_SI2249 +MMWB0_SI989 +MMWB0_SX179 +MMWB0_SX269 +MMWB0_SX359 +MMWB0_SX449 +MMWB0_SX89 +MMWS0_SI1518 +MMWS0_SI559 +MMWS0_SI888 +MMWS0_SX168 +MMWS0_SX258 +MMWS0_SX348 +MMWS0_SX438 +MMWS0_SX78 +MMWS1_SI1071 +MMWS1_SI1701 +MMWS1_SI2331 +MMWS1_SX261 +MMWS1_SX27 +MMWS1_SX351 +MMWS1_SX441 +MMWS1_SX81 +MMXS0_SI2136 +MMXS0_SI629 +MMXS0_SI876 +MMXS0_SX156 +MMXS0_SX246 +MMXS0_SX336 +MMXS0_SX426 +MMXS0_SX66 +MNET0_SI1446 +MNET0_SI2076 +MNET0_SI816 +MNET0_SX186 +MNET0_SX276 +MNET0_SX366 +MNET0_SX6 +MNET0_SX96 +MNTW0_SI1068 +MNTW0_SI1698 +MNTW0_SI2328 +MNTW0_SX168 +MNTW0_SX202 +MNTW0_SX258 +MNTW0_SX348 +MNTW0_SX78 +MPAR0_SI1576 +MPAR0_SI2206 +MPAR0_SI946 +MPAR0_SX136 +MPAR0_SX226 +MPAR0_SX316 +MPAR0_SX406 +MPAR0_SX46 +MPEB0_SI1034 +MPEB0_SI1860 +MPEB0_SI600 +MPEB0_SX150 +MPEB0_SX240 +MPEB0_SX330 +MPEB0_SX420 +MPEB0_SX60 +MPFU0_SI1258 +MPFU0_SI1888 +MPFU0_SI628 +MPFU0_SX178 +MPFU0_SX268 +MPFU0_SX358 +MPFU0_SX448 +MPFU0_SX88 +MPGH0_SI1554 +MPGH0_SI675 +MPGH0_SI924 +MPGH0_SX114 +MPGH0_SX204 +MPGH0_SX24 +MPGH0_SX294 +MPGH0_SX384 +MPGR0_SI1410 +MPGR0_SI2040 +MPGR0_SI780 +MPGR0_SX150 +MPGR0_SX240 +MPGR0_SX330 +MPGR0_SX420 +MPGR0_SX60 +MPGR1_SI1269 +MPGR1_SI1499 +MPGR1_SI2129 +MPGR1_SX149 +MPGR1_SX239 +MPGR1_SX329 +MPGR1_SX419 +MPGR1_SX59 +MPMB0_SI1501 +MPMB0_SI2131 +MPMB0_SI871 +MPMB0_SX151 +MPMB0_SX241 +MPMB0_SX331 +MPMB0_SX421 +MPMB0_SX61 +MPPC0_SI1412 +MPPC0_SI2042 +MPPC0_SI782 +MPPC0_SX152 +MPPC0_SX242 +MPPC0_SX332 +MPPC0_SX422 +MPPC0_SX62 +MPRB0_SI1205 +MPRB0_SI1215 +MPRB0_SI575 +MPRB0_SX125 +MPRB0_SX215 +MPRB0_SX305 +MPRB0_SX35 +MPRB0_SX395 +MPRD0_SI1431 +MPRD0_SI2061 +MPRD0_SI801 +MPRD0_SX171 +MPRD0_SX261 +MPRD0_SX351 +MPRD0_SX441 +MPRD0_SX81 +MPRK0_SI1097 +MPRK0_SI1727 +MPRK0_SI467 +MPRK0_SX107 +MPRK0_SX17 +MPRK0_SX197 +MPRK0_SX287 +MPRK0_SX377 +MPRT0_SI1210 +MPRT0_SI495 +MPRT0_SI580 +MPRT0_SX130 +MPRT0_SX220 +MPRT0_SX310 +MPRT0_SX40 +MPRT0_SX400 +MPSW0_SI1067 +MPSW0_SI1697 +MPSW0_SI2327 +MPSW0_SX167 +MPSW0_SX24 +MPSW0_SX257 +MPSW0_SX437 +MPSW0_SX77 +MRAB0_SI1224 +MRAB0_SI1854 +MRAB0_SI594 +MRAB0_SX144 +MRAB0_SX234 +MRAB0_SX324 +MRAB0_SX414 +MRAB0_SX54 +MRAB1_SI1478 +MRAB1_SI2108 +MRAB1_SI848 +MRAB1_SX128 +MRAB1_SX218 +MRAB1_SX308 +MRAB1_SX38 +MRAB1_SX398 +MRAI0_SI1954 +MRAI0_SI2052 +MRAI0_SI792 +MRAI0_SX162 +MRAI0_SX252 +MRAI0_SX342 +MRAI0_SX432 +MRAI0_SX72 +MRAM0_SI1275 +MRAM0_SI1905 +MRAM0_SI1951 +MRAM0_SX105 +MRAM0_SX15 +MRAM0_SX195 +MRAM0_SX285 +MRAM0_SX375 +MRAV0_SI1008 +MRAV0_SI1638 +MRAV0_SI2268 +MRAV0_SX108 +MRAV0_SX18 +MRAV0_SX198 +MRAV0_SX288 +MRAV0_SX378 +MRBC0_SI1665 +MRBC0_SI1859 +MRBC0_SI599 +MRBC0_SX149 +MRBC0_SX239 +MRBC0_SX329 +MRBC0_SX419 +MRBC0_SX59 +MRCG0_SI1428 +MRCG0_SI2058 +MRCG0_SI798 +MRCG0_SX168 +MRCG0_SX258 +MRCG0_SX348 +MRCG0_SX438 +MRCG0_SX78 +MRCW0_SI1371 +MRCW0_SI2001 +MRCW0_SI741 +MRCW0_SX111 +MRCW0_SX201 +MRCW0_SX21 +MRCW0_SX291 +MRCW0_SX381 +MRDD0_SI1050 +MRDD0_SI1680 +MRDD0_SI2310 +MRDD0_SX150 +MRDD0_SX240 +MRDD0_SX277 +MRDD0_SX330 +MRDD0_SX60 +MRDM0_SI1044 +MRDM0_SI1595 +MRDM0_SI965 +MRDM0_SX155 +MRDM0_SX245 +MRDM0_SX335 +MRDM0_SX425 +MRDM0_SX65 +MRDS0_SI1167 +MRDS0_SI1797 +MRDS0_SI537 +MRDS0_SX177 +MRDS0_SX267 +MRDS0_SX357 +MRDS0_SX447 +MRDS0_SX87 +MREE0_SI1104 +MREE0_SI1734 +MREE0_SI1959 +MREE0_SX114 +MREE0_SX204 +MREE0_SX24 +MREE0_SX294 +MREE0_SX384 +MREH1_SI1599 +MREH1_SI2229 +MREH1_SI969 +MREH1_SX159 +MREH1_SX249 +MREH1_SX339 +MREH1_SX429 +MREH1_SX69 +MREM0_SI1591 +MREM0_SI511 +MREM0_SI961 +MREM0_SX151 +MREM0_SX241 +MREM0_SX331 +MREM0_SX421 +MREM0_SX61 +MREW1_SI1500 +MREW1_SI2130 +MREW1_SI870 +MREW1_SX150 +MREW1_SX240 +MREW1_SX330 +MREW1_SX420 +MREW1_SX60 +MRFK0_SI1076 +MRFK0_SI1706 +MRFK0_SI2336 +MRFK0_SX176 +MRFK0_SX266 +MRFK0_SX356 +MRFK0_SX446 +MRFK0_SX86 +MRFL0_SI1156 +MRFL0_SI1786 +MRFL0_SI526 +MRFL0_SX166 +MRFL0_SX256 +MRFL0_SX346 +MRFL0_SX436 +MRFL0_SX76 +MRGM0_SI1162 +MRGM0_SI1792 +MRGM0_SI532 +MRGM0_SX172 +MRGM0_SX262 +MRGM0_SX416 +MRGM0_SX442 +MRGM0_SX82 +MRGS0_SI1356 +MRGS0_SI1986 +MRGS0_SI726 +MRGS0_SX186 +MRGS0_SX276 +MRGS0_SX366 +MRGS0_SX6 +MRGS0_SX96 +MRHL0_SI1515 +MRHL0_SI2145 +MRHL0_SI885 +MRHL0_SX165 +MRHL0_SX255 +MRHL0_SX345 +MRHL0_SX435 +MRHL0_SX75 +MRJB1_SI1020 +MRJB1_SI1413 +MRJB1_SI2021 +MRJB1_SX120 +MRJB1_SX210 +MRJB1_SX30 +MRJB1_SX300 +MRJB1_SX390 +MRJH0_SI1519 +MRJH0_SI889 +MRJH0_SI914 +MRJH0_SX169 +MRJH0_SX259 +MRJH0_SX307 +MRJH0_SX439 +MRJH0_SX79 +MRJM0_SI1095 +MRJM0_SI1228 +MRJM0_SI1858 +MRJM0_SX148 +MRJM0_SX238 +MRJM0_SX328 +MRJM0_SX418 +MRJM0_SX58 +MRJM1_SI1298 +MRJM1_SI1928 +MRJM1_SI668 +MRJM1_SX128 +MRJM1_SX218 +MRJM1_SX308 +MRJM1_SX38 +MRJM1_SX398 +MRJT0_SI1498 +MRJT0_SI1805 +MRJT0_SI868 +MRJT0_SX148 +MRJT0_SX238 +MRJT0_SX328 +MRJT0_SX418 +MRJT0_SX58 +MRKM0_SI1267 +MRKM0_SI1391 +MRKM0_SI637 +MRKM0_SX187 +MRKM0_SX277 +MRKM0_SX367 +MRKM0_SX7 +MRKM0_SX97 +MRLD0_SI1594 +MRLD0_SI2224 +MRLD0_SI964 +MRLD0_SX154 +MRLD0_SX244 +MRLD0_SX334 +MRLD0_SX424 +MRLD0_SX64 +MRLJ0_SI1420 +MRLJ0_SI2050 +MRLJ0_SI790 +MRLJ0_SX160 +MRLJ0_SX250 +MRLJ0_SX340 +MRLJ0_SX430 +MRLJ0_SX70 +MRLJ1_SI1671 +MRLJ1_SI2301 +MRLJ1_SI2332 +MRLJ1_SX141 +MRLJ1_SX231 +MRLJ1_SX321 +MRLJ1_SX411 +MRLJ1_SX51 +MRLK0_SI1468 +MRLK0_SI2140 +MRLK0_SI843 +MRLK0_SX123 +MRLK0_SX213 +MRLK0_SX303 +MRLK0_SX33 +MRLK0_SX393 +MRLR0_SI1196 +MRLR0_SI1826 +MRLR0_SI566 +MRLR0_SX116 +MRLR0_SX206 +MRLR0_SX26 +MRLR0_SX296 +MRLR0_SX386 +MRMB0_SI1581 +MRMB0_SI2211 +MRMB0_SI951 +MRMB0_SX141 +MRMB0_SX231 +MRMB0_SX321 +MRMB0_SX411 +MRMB0_SX51 +MRMG0_SI1080 +MRMG0_SI1710 +MRMG0_SI2340 +MRMG0_SX180 +MRMG0_SX270 +MRMG0_SX360 +MRMG0_SX450 +MRMG0_SX90 +MRMH0_SI1021 +MRMH0_SI1349 +MRMH0_SI2281 +MRMH0_SX121 +MRMH0_SX211 +MRMH0_SX301 +MRMH0_SX31 +MRMH0_SX391 +MRML0_SI1421 +MRML0_SI2051 +MRML0_SI791 +MRML0_SX161 +MRML0_SX251 +MRML0_SX341 +MRML0_SX431 +MRML0_SX71 +MRMS0_SI1113 +MRMS0_SI2057 +MRMS0_SI2100 +MRMS0_SX120 +MRMS0_SX210 +MRMS0_SX30 +MRMS0_SX300 +MRMS0_SX390 +MRPC1_SI1482 +MRPC1_SI2026 +MRPC1_SI2112 +MRPC1_SX132 +MRPC1_SX222 +MRPC1_SX312 +MRPC1_SX402 +MRPC1_SX42 +MRRE0_SI1334 +MRRE0_SI704 +MRRE0_SI952 +MRRE0_SX164 +MRRE0_SX254 +MRRE0_SX344 +MRRE0_SX434 +MRRE0_SX74 +MRSO0_SI1206 +MRSO0_SI1659 +MRSO0_SI2289 +MRSO0_SX129 +MRSO0_SX219 +MRSO0_SX309 +MRSO0_SX39 +MRSO0_SX399 +MRSP0_SI1429 +MRSP0_SI2059 +MRSP0_SI799 +MRSP0_SX169 +MRSP0_SX196 +MRSP0_SX259 +MRSP0_SX439 +MRSP0_SX79 +MRTC0_SI1458 +MRTC0_SI2088 +MRTC0_SI828 +MRTC0_SX108 +MRTC0_SX18 +MRTC0_SX198 +MRTC0_SX288 +MRTC0_SX378 +MRTJ0_SI1551 +MRTJ0_SI2032 +MRTJ0_SI772 +MRTJ0_SX142 +MRTJ0_SX232 +MRTJ0_SX322 +MRTJ0_SX412 +MRTJ0_SX52 +MRVG0_SI1140 +MRVG0_SI1770 +MRVG0_SI510 +MRVG0_SX150 +MRVG0_SX240 +MRVG0_SX330 +MRVG0_SX420 +MRVG0_SX60 +MRWA0_SI1603 +MRWA0_SI2233 +MRWA0_SI973 +MRWA0_SX163 +MRWA0_SX253 +MRWA0_SX343 +MRWA0_SX433 +MRWA0_SX73 +MRWS0_SI1102 +MRWS0_SI1732 +MRWS0_SI472 +MRWS0_SX112 +MRWS0_SX202 +MRWS0_SX22 +MRWS0_SX292 +MRWS0_SX382 +MRXB0_SI1585 +MRXB0_SI2215 +MRXB0_SI955 +MRXB0_SX145 +MRXB0_SX235 +MRXB0_SX325 +MRXB0_SX415 +MRXB0_SX55 +MSAH1_SI1049 +MSAH1_SI1679 +MSAH1_SI2309 +MSAH1_SX149 +MSAH1_SX239 +MSAH1_SX329 +MSAH1_SX419 +MSAH1_SX59 +MSAS0_SI1376 +MSAS0_SI2006 +MSAS0_SI746 +MSAS0_SX116 +MSAS0_SX206 +MSAS0_SX26 +MSAS0_SX296 +MSAS0_SX386 +MSAT0_SI1526 +MSAT0_SI2156 +MSAT0_SI896 +MSAT0_SX176 +MSAT0_SX266 +MSAT0_SX356 +MSAT0_SX446 +MSAT0_SX86 +MSAT1_SI1073 +MSAT1_SI1703 +MSAT1_SI2333 +MSAT1_SX173 +MSAT1_SX263 +MSAT1_SX353 +MSAT1_SX443 +MSAT1_SX83 +MSDB0_SI1007 +MSDB0_SI1637 +MSDB0_SI2267 +MSDB0_SX107 +MSDB0_SX17 +MSDB0_SX197 +MSDB0_SX287 +MSDB0_SX377 +MSDH0_SI2113 +MSDH0_SI2240 +MSDH0_SI980 +MSDH0_SX170 +MSDH0_SX260 +MSDH0_SX350 +MSDH0_SX440 +MSDH0_SX80 +MSDS0_SI1077 +MSDS0_SI1707 +MSDS0_SI2337 +MSDS0_SX177 +MSDS0_SX267 +MSDS0_SX357 +MSDS0_SX447 +MSDS0_SX87 +MSEM1_SI1440 +MSEM1_SI2070 +MSEM1_SI810 +MSEM1_SX180 +MSEM1_SX270 +MSEM1_SX360 +MSEM1_SX450 +MSEM1_SX90 +MSES0_SI1589 +MSES0_SI2216 +MSES0_SI2219 +MSES0_SX149 +MSES0_SX239 +MSES0_SX329 +MSES0_SX419 +MSES0_SX59 +MSFH0_SI1216 +MSFH0_SI1738 +MSFH0_SI586 +MSFH0_SX136 +MSFH0_SX226 +MSFH0_SX316 +MSFH0_SX406 +MSFH0_SX46 +MSFV0_SI1262 +MSFV0_SI1892 +MSFV0_SI632 +MSFV0_SX182 +MSFV0_SX272 +MSFV0_SX362 +MSFV0_SX452 +MSFV0_SX92 +MSJK0_SI1596 +MSJK0_SI2226 +MSJK0_SI966 +MSJK0_SX156 +MSJK0_SX246 +MSJK0_SX336 +MSJK0_SX426 +MSJK0_SX66 +MSMC0_SI1907 +MSMC0_SI509 +MSMC0_SI647 +MSMC0_SX107 +MSMC0_SX17 +MSMC0_SX197 +MSMC0_SX287 +MSMC0_SX377 +MSMR0_SI1150 +MSMR0_SI1405 +MSMR0_SI775 +MSMR0_SX145 +MSMR0_SX235 +MSMR0_SX325 +MSMR0_SX415 +MSMR0_SX55 +MSMS0_SI1433 +MSMS0_SI2063 +MSMS0_SI803 +MSMS0_SX173 +MSMS0_SX263 +MSMS0_SX353 +MSMS0_SX443 +MSMS0_SX83 +MSRG0_SI1221 +MSRG0_SI1851 +MSRG0_SI591 +MSRG0_SX141 +MSRG0_SX231 +MSRG0_SX321 +MSRG0_SX411 +MSRG0_SX51 +MSRR0_SI1131 +MSRR0_SI1761 +MSRR0_SI501 +MSRR0_SX141 +MSRR0_SX231 +MSRR0_SX30 +MSRR0_SX411 +MSRR0_SX51 +MSTF0_SI1396 +MSTF0_SI766 +MSTF0_SI852 +MSTF0_SX136 +MSTF0_SX226 +MSTF0_SX316 +MSTF0_SX406 +MSTF0_SX46 +MSVS0_SI1568 +MSVS0_SI2198 +MSVS0_SI938 +MSVS0_SX128 +MSVS0_SX218 +MSVS0_SX308 +MSVS0_SX38 +MSVS0_SX398 +MTAB0_SI1572 +MTAB0_SI2202 +MTAB0_SI942 +MTAB0_SX132 +MTAB0_SX222 +MTAB0_SX312 +MTAB0_SX402 +MTAB0_SX42 +MTAS0_SI1385 +MTAS0_SI2015 +MTAS0_SI755 +MTAS0_SX125 +MTAS0_SX215 +MTAS0_SX305 +MTAS0_SX35 +MTAS0_SX395 +MTAT0_SI1110 +MTAT0_SI1740 +MTAT0_SI811 +MTAT0_SX120 +MTAT0_SX210 +MTAT0_SX30 +MTAT0_SX300 +MTAT0_SX390 +MTAT1_SI1409 +MTAT1_SI1627 +MTAT1_SI779 +MTAT1_SX149 +MTAT1_SX239 +MTAT1_SX329 +MTAT1_SX419 +MTAT1_SX59 +MTBC0_SI1173 +MTBC0_SI1803 +MTBC0_SI543 +MTBC0_SX183 +MTBC0_SX273 +MTBC0_SX347 +MTBC0_SX363 +MTBC0_SX93 +MTCS0_SI1972 +MTCS0_SI2265 +MTCS0_SI712 +MTCS0_SX172 +MTCS0_SX262 +MTCS0_SX352 +MTCS0_SX442 +MTCS0_SX82 +MTDB0_SI1401 +MTDB0_SI2031 +MTDB0_SI771 +MTDB0_SX141 +MTDB0_SX231 +MTDB0_SX321 +MTDB0_SX411 +MTDB0_SX51 +MTDP0_SI1274 +MTDP0_SI1521 +MTDP0_SI2151 +MTDP0_SX171 +MTDP0_SX261 +MTDP0_SX351 +MTDP0_SX441 +MTDP0_SX81 +MTER0_SI1157 +MTER0_SI1787 +MTER0_SI527 +MTER0_SX167 +MTER0_SX17 +MTER0_SX257 +MTER0_SX437 +MTER0_SX77 +MTJG0_SI1520 +MTJG0_SI2157 +MTJG0_SI890 +MTJG0_SX170 +MTJG0_SX260 +MTJG0_SX350 +MTJG0_SX440 +MTJG0_SX80 +MTJM0_SI1226 +MTJM0_SI1856 +MTJM0_SI655 +MTJM0_SX146 +MTJM0_SX236 +MTJM0_SX326 +MTJM0_SX416 +MTJM0_SX56 +MTJS0_SI1192 +MTJS0_SI1822 +MTJS0_SI562 +MTJS0_SX112 +MTJS0_SX202 +MTJS0_SX22 +MTJS0_SX292 +MTJS0_SX382 +MTJU0_SI2020 +MTJU0_SI2269 +MTJU0_SI760 +MTJU0_SX130 +MTJU0_SX220 +MTJU0_SX310 +MTJU0_SX40 +MTJU0_SX400 +MTKD0_SI1187 +MTKD0_SI1817 +MTKD0_SI630 +MTKD0_SX107 +MTKD0_SX17 +MTKD0_SX197 +MTKD0_SX287 +MTKD0_SX377 +MTKP0_SI1023 +MTKP0_SI2283 +MTKP0_SI454 +MTKP0_SX123 +MTKP0_SX213 +MTKP0_SX303 +MTKP0_SX33 +MTKP0_SX393 +MTLB0_SI1134 +MTLB0_SI1764 +MTLB0_SI504 +MTLB0_SX144 +MTLB0_SX234 +MTLB0_SX324 +MTLB0_SX414 +MTLB0_SX54 +MTLC0_SI1313 +MTLC0_SI1477 +MTLC0_SI847 +MTLC0_SX127 +MTLC0_SX217 +MTLC0_SX307 +MTLC0_SX37 +MTLC0_SX397 +MTML0_SI1065 +MTML0_SI1695 +MTML0_SI2325 +MTML0_SX165 +MTML0_SX255 +MTML0_SX345 +MTML0_SX435 +MTML0_SX75 +MTMN0_SI1064 +MTMN0_SI2324 +MTMN0_SI582 +MTMN0_SX164 +MTMN0_SX254 +MTMN0_SX344 +MTMN0_SX434 +MTMN0_SX74 +MTMT0_SI1118 +MTMT0_SI1748 +MTMT0_SI488 +MTMT0_SX128 +MTMT0_SX218 +MTMT0_SX308 +MTMT0_SX38 +MTMT0_SX398 +MTPF0_SI1235 +MTPF0_SI1865 +MTPF0_SI605 +MTPF0_SX155 +MTPF0_SX245 +MTPF0_SX335 +MTPF0_SX425 +MTPF0_SX65 +MTPG0_SI1383 +MTPG0_SI2013 +MTPG0_SI753 +MTPG0_SX123 +MTPG0_SX213 +MTPG0_SX303 +MTPG0_SX33 +MTPG0_SX393 +MTPP0_SI1508 +MTPP0_SI2138 +MTPP0_SI878 +MTPP0_SX158 +MTPP0_SX248 +MTPP0_SX338 +MTPP0_SX428 +MTPP0_SX68 +MTPR0_SI1600 +MTPR0_SI2230 +MTPR0_SI506 +MTPR0_SX160 +MTPR0_SX250 +MTPR0_SX340 +MTPR0_SX430 +MTPR0_SX70 +MTQC0_SI1441 +MTQC0_SI2071 +MTQC0_SI480 +MTQC0_SX181 +MTQC0_SX271 +MTQC0_SX361 +MTQC0_SX451 +MTQC0_SX91 +MTRC0_SI1623 +MTRC0_SI589 +MTRC0_SI993 +MTRC0_SX170 +MTRC0_SX183 +MTRC0_SX273 +MTRC0_SX363 +MTRC0_SX93 +MTRR0_SI1548 +MTRR0_SI2178 +MTRR0_SI918 +MTRR0_SX108 +MTRR0_SX18 +MTRR0_SX198 +MTRR0_SX288 +MTRR0_SX378 +MTRT0_SI1227 +MTRT0_SI1857 +MTRT0_SI597 +MTRT0_SX147 +MTRT0_SX237 +MTRT0_SX254 +MTRT0_SX417 +MTRT0_SX57 +MTWH1_SI1512 +MTWH1_SI2142 +MTWH1_SI882 +MTWH1_SX162 +MTWH1_SX252 +MTWH1_SX342 +MTWH1_SX432 +MTWH1_SX72 +MTXS0_SI1060 +MTXS0_SI1690 +MTXS0_SI2320 +MTXS0_SX160 +MTXS0_SX250 +MTXS0_SX340 +MTXS0_SX430 +MTXS0_SX70 +MVJH0_SI1556 +MVJH0_SI2186 +MVJH0_SI926 +MVJH0_SX116 +MVJH0_SX206 +MVJH0_SX26 +MVJH0_SX296 +MVJH0_SX386 +MVLO0_SI1147 +MVLO0_SI1777 +MVLO0_SI517 +MVLO0_SX157 +MVLO0_SX247 +MVLO0_SX337 +MVLO0_SX427 +MVLO0_SX67 +MVRW0_SI1485 +MVRW0_SI2115 +MVRW0_SI855 +MVRW0_SX135 +MVRW0_SX225 +MVRW0_SX315 +MVRW0_SX405 +MVRW0_SX45 +MWAC0_SI1601 +MWAC0_SI2231 +MWAC0_SI971 +MWAC0_SX161 +MWAC0_SX251 +MWAC0_SX341 +MWAC0_SX431 +MWAC0_SX71 +MWAD0_SI1062 +MWAD0_SI1749 +MWAD0_SI2322 +MWAD0_SX162 +MWAD0_SX252 +MWAD0_SX342 +MWAD0_SX432 +MWAD0_SX72 +MWAR0_SI1045 +MWAR0_SI1675 +MWAR0_SI2305 +MWAR0_SX145 +MWAR0_SX235 +MWAR0_SX325 +MWAR0_SX415 +MWAR0_SX55 +MWCH0_SI1622 +MWCH0_SI1895 +MWCH0_SI2252 +MWCH0_SX182 +MWCH0_SX272 +MWCH0_SX362 +MWCH0_SX452 +MWCH0_SX92 +MWDK0_SI1436 +MWDK0_SI2017 +MWDK0_SI806 +MWDK0_SX176 +MWDK0_SX266 +MWDK0_SX356 +MWDK0_SX446 +MWDK0_SX86 +MWEM0_SI1320 +MWEM0_SI1393 +MWEM0_SI1950 +MWEM0_SX150 +MWEM0_SX240 +MWEM0_SX330 +MWEM0_SX420 +MWEM0_SX60 +MWGR0_SI1606 +MWGR0_SI2236 +MWGR0_SI976 +MWGR0_SX166 +MWGR0_SX256 +MWGR0_SX346 +MWGR0_SX436 +MWGR0_SX76 +MWRE0_SI1057 +MWRE0_SI1687 +MWRE0_SI2317 +MWRE0_SX157 +MWRE0_SX247 +MWRE0_SX337 +MWRE0_SX427 +MWRE0_SX67 +MWRP0_SI1443 +MWRP0_SI1525 +MWRP0_SI2073 +MWRP0_SX183 +MWRP0_SX273 +MWRP0_SX3 +MWRP0_SX363 +MWRP0_SX93 +MWSB0_SI1626 +MWSB0_SI2256 +MWSB0_SI996 +MWSB0_SX186 +MWSB0_SX276 +MWSB0_SX366 +MWSB0_SX6 +MWSB0_SX96 +MWSH0_SI1426 +MWSH0_SI2266 +MWSH0_SI796 +MWSH0_SX166 +MWSH0_SX256 +MWSH0_SX346 +MWSH0_SX436 +MWSH0_SX76 +MZMB0_SI1166 +MZMB0_SI1796 +MZMB0_SI536 +MZMB0_SX176 +MZMB0_SX266 +MZMB0_SX356 +MZMB0_SX446 +MZMB0_SX86 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train_text.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train_text.uid new file mode 100644 index 0000000..c39fd0b --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/train_text.uid @@ -0,0 +1,3696 @@ +FAEM0_SI1392 +FAEM0_SI2022 +FAEM0_SI762 +FAEM0_SX132 +FAEM0_SX222 +FAEM0_SX312 +FAEM0_SX402 +FAEM0_SX42 +FAJW0_SI1263 +FAJW0_SI1893 +FAJW0_SI633 +FAJW0_SX183 +FAJW0_SX273 +FAJW0_SX3 +FAJW0_SX363 +FAJW0_SX93 +FALK0_SI1086 +FALK0_SI456 +FALK0_SI658 +FALK0_SX186 +FALK0_SX276 +FALK0_SX366 +FALK0_SX6 +FALK0_SX96 +FALR0_SI1325 +FALR0_SI1955 +FALR0_SI695 +FALR0_SX155 +FALR0_SX245 +FALR0_SX335 +FALR0_SX425 +FALR0_SX65 +FAPB0_SI1063 +FAPB0_SI1693 +FAPB0_SI2323 +FAPB0_SX163 +FAPB0_SX253 +FAPB0_SX343 +FAPB0_SX433 +FAPB0_SX73 +FBAS0_SI1387 +FBAS0_SI1472 +FBAS0_SI2066 +FBAS0_SX127 +FBAS0_SX217 +FBAS0_SX307 +FBAS0_SX37 +FBAS0_SX397 +FBCG1_SI1612 +FBCG1_SI2242 +FBCG1_SI982 +FBCG1_SX172 +FBCG1_SX262 +FBCG1_SX352 +FBCG1_SX442 +FBCG1_SX82 +FBCH0_SI1586 +FBCH0_SI956 +FBCH0_SI959 +FBCH0_SX146 +FBCH0_SX236 +FBCH0_SX326 +FBCH0_SX416 +FBCH0_SX56 +FBJL0_SI1552 +FBJL0_SI2182 +FBJL0_SI922 +FBJL0_SX112 +FBJL0_SX202 +FBJL0_SX22 +FBJL0_SX292 +FBJL0_SX382 +FBLV0_SI1058 +FBLV0_SI1688 +FBLV0_SI2318 +FBLV0_SX158 +FBLV0_SX248 +FBLV0_SX338 +FBLV0_SX428 +FBLV0_SX68 +FBMH0_SI1136 +FBMH0_SI1766 +FBMH0_SI970 +FBMH0_SX146 +FBMH0_SX236 +FBMH0_SX326 +FBMH0_SX416 +FBMH0_SX56 +FBMJ0_SI1776 +FBMJ0_SI516 +FBMJ0_SI815 +FBMJ0_SX156 +FBMJ0_SX246 +FBMJ0_SX336 +FBMJ0_SX426 +FBMJ0_SX66 +FCAG0_SI1503 +FCAG0_SI1641 +FCAG0_SI2133 +FCAG0_SX153 +FCAG0_SX243 +FCAG0_SX333 +FCAG0_SX423 +FCAG0_SX63 +FCAJ0_SI1479 +FCAJ0_SI1804 +FCAJ0_SI849 +FCAJ0_SX129 +FCAJ0_SX219 +FCAJ0_SX309 +FCAJ0_SX39 +FCAJ0_SX399 +FCDR1_SI1186 +FCDR1_SI1816 +FCDR1_SI556 +FCDR1_SX106 +FCDR1_SX16 +FCDR1_SX196 +FCDR1_SX286 +FCDR1_SX376 +FCEG0_SI1248 +FCEG0_SI1878 +FCEG0_SI618 +FCEG0_SX168 +FCEG0_SX258 +FCEG0_SX348 +FCEG0_SX438 +FCEG0_SX78 +FCJF0_SI1027 +FCJF0_SI1657 +FCJF0_SI648 +FCJF0_SX127 +FCJF0_SX217 +FCJF0_SX307 +FCJF0_SX37 +FCJF0_SX397 +FCJS0_SI1607 +FCJS0_SI2237 +FCJS0_SI977 +FCJS0_SX167 +FCJS0_SX257 +FCJS0_SX347 +FCJS0_SX437 +FCJS0_SX77 +FCKE0_SI1111 +FCKE0_SI1741 +FCKE0_SI481 +FCKE0_SX121 +FCKE0_SX211 +FCKE0_SX301 +FCKE0_SX31 +FCKE0_SX391 +FCLT0_SI1438 +FCLT0_SI2068 +FCLT0_SI808 +FCLT0_SX178 +FCLT0_SX268 +FCLT0_SX358 +FCLT0_SX448 +FCLT0_SX88 +FCMG0_SI1142 +FCMG0_SI1242 +FCMG0_SI1872 +FCMG0_SX162 +FCMG0_SX252 +FCMG0_SX342 +FCMG0_SX432 +FCMG0_SX72 +FCMM0_SI1083 +FCMM0_SI1957 +FCMM0_SI453 +FCMM0_SX183 +FCMM0_SX273 +FCMM0_SX363 +FCMM0_SX420 +FCMM0_SX93 +FCRZ0_SI1913 +FCRZ0_SI2053 +FCRZ0_SI793 +FCRZ0_SX163 +FCRZ0_SX253 +FCRZ0_SX343 +FCRZ0_SX433 +FCRZ0_SX73 +FCYL0_SI1297 +FCYL0_SI1927 +FCYL0_SI667 +FCYL0_SX127 +FCYL0_SX217 +FCYL0_SX349 +FCYL0_SX37 +FCYL0_SX397 +FDAS1_SI1461 +FDAS1_SI2091 +FDAS1_SI831 +FDAS1_SX111 +FDAS1_SX201 +FDAS1_SX21 +FDAS1_SX291 +FDAS1_SX381 +FDAW0_SI1271 +FDAW0_SI1406 +FDAW0_SI2036 +FDAW0_SX146 +FDAW0_SX236 +FDAW0_SX326 +FDAW0_SX416 +FDAW0_SX56 +FDFB0_SI1318 +FDFB0_SI1948 +FDFB0_SI2010 +FDFB0_SX148 +FDFB0_SX238 +FDFB0_SX328 +FDFB0_SX418 +FDFB0_SX58 +FDJH0_SI1565 +FDJH0_SI2195 +FDJH0_SI935 +FDJH0_SX125 +FDJH0_SX215 +FDJH0_SX305 +FDJH0_SX35 +FDJH0_SX395 +FDKN0_SI1081 +FDKN0_SI1202 +FDKN0_SI1711 +FDKN0_SX181 +FDKN0_SX271 +FDKN0_SX361 +FDKN0_SX451 +FDKN0_SX91 +FDML0_SI1149 +FDML0_SI1779 +FDML0_SI2075 +FDML0_SX159 +FDML0_SX249 +FDML0_SX339 +FDML0_SX429 +FDML0_SX69 +FDMY0_SI1197 +FDMY0_SI567 +FDMY0_SI714 +FDMY0_SX117 +FDMY0_SX207 +FDMY0_SX27 +FDMY0_SX297 +FDMY0_SX387 +FDNC0_SI1278 +FDNC0_SI1908 +FDNC0_SI2287 +FDNC0_SX108 +FDNC0_SX18 +FDNC0_SX198 +FDNC0_SX288 +FDNC0_SX378 +FDTD0_SI1561 +FDTD0_SI2191 +FDTD0_SI931 +FDTD0_SX121 +FDTD0_SX211 +FDTD0_SX301 +FDTD0_SX321 +FDTD0_SX391 +FDXW0_SI1511 +FDXW0_SI2141 +FDXW0_SI881 +FDXW0_SX161 +FDXW0_SX251 +FDXW0_SX341 +FDXW0_SX431 +FDXW0_SX71 +FEAC0_SI1245 +FEAC0_SI1875 +FEAC0_SI615 +FEAC0_SX165 +FEAC0_SX255 +FEAC0_SX345 +FEAC0_SX435 +FEAC0_SX75 +FEAR0_SI1252 +FEAR0_SI1882 +FEAR0_SI622 +FEAR0_SX172 +FEAR0_SX262 +FEAR0_SX352 +FEAR0_SX442 +FEAR0_SX82 +FECD0_SI1418 +FECD0_SI2048 +FECD0_SI788 +FECD0_SX158 +FECD0_SX248 +FECD0_SX338 +FECD0_SX428 +FECD0_SX68 +FEEH0_SI1112 +FEEH0_SI1742 +FEEH0_SI471 +FEEH0_SX122 +FEEH0_SX212 +FEEH0_SX302 +FEEH0_SX32 +FEEH0_SX392 +FEME0_SI1505 +FEME0_SI2135 +FEME0_SI875 +FEME0_SX155 +FEME0_SX245 +FEME0_SX335 +FEME0_SX425 +FEME0_SX65 +FETB0_SI1148 +FETB0_SI1778 +FETB0_SI518 +FETB0_SX158 +FETB0_SX248 +FETB0_SX338 +FETB0_SX428 +FETB0_SX68 +FEXM0_SI1101 +FEXM0_SI1731 +FEXM0_SI482 +FEXM0_SX111 +FEXM0_SX201 +FEXM0_SX291 +FEXM0_SX366 +FEXM0_SX381 +FGCS0_SI1486 +FGCS0_SI2116 +FGCS0_SI856 +FGCS0_SX136 +FGCS0_SX226 +FGCS0_SX316 +FGCS0_SX406 +FGCS0_SX46 +FGDP0_SI1618 +FGDP0_SI2248 +FGDP0_SI988 +FGDP0_SX178 +FGDP0_SX268 +FGDP0_SX358 +FGDP0_SX448 +FGDP0_SX88 +FGMB0_SI1145 +FGMB0_SI1775 +FGMB0_SI515 +FGMB0_SX155 +FGMB0_SX245 +FGMB0_SX335 +FGMB0_SX425 +FGMB0_SX65 +FGRW0_SI1152 +FGRW0_SI1782 +FGRW0_SI1990 +FGRW0_SX162 +FGRW0_SX252 +FGRW0_SX342 +FGRW0_SX432 +FGRW0_SX72 +FHLM0_SI1560 +FHLM0_SI2190 +FHLM0_SI930 +FHLM0_SX120 +FHLM0_SX210 +FHLM0_SX300 +FHLM0_SX349 +FHLM0_SX390 +FHXS0_SI1075 +FHXS0_SI2302 +FHXS0_SI2335 +FHXS0_SX175 +FHXS0_SX265 +FHXS0_SX355 +FHXS0_SX445 +FHXS0_SX85 +FJDM2_SI1582 +FJDM2_SI1964 +FJDM2_SI2212 +FJDM2_SX142 +FJDM2_SX232 +FJDM2_SX322 +FJDM2_SX412 +FJDM2_SX52 +FJEN0_SI1047 +FJEN0_SI1677 +FJEN0_SI2307 +FJEN0_SX147 +FJEN0_SX237 +FJEN0_SX327 +FJEN0_SX417 +FJEN0_SX57 +FJHK0_SI1022 +FJHK0_SI1652 +FJHK0_SI2282 +FJHK0_SX122 +FJHK0_SX212 +FJHK0_SX302 +FJHK0_SX32 +FJHK0_SX392 +FJKL0_SI1562 +FJKL0_SI2192 +FJKL0_SI932 +FJKL0_SX122 +FJKL0_SX212 +FJKL0_SX302 +FJKL0_SX32 +FJKL0_SX392 +FJLG0_SI1506 +FJLG0_SI1889 +FJLG0_SI2306 +FJLG0_SX179 +FJLG0_SX269 +FJLG0_SX359 +FJLG0_SX449 +FJLG0_SX89 +FJLR0_SI1231 +FJLR0_SI1861 +FJLR0_SI601 +FJLR0_SX151 +FJLR0_SX241 +FJLR0_SX331 +FJLR0_SX421 +FJLR0_SX61 +FJRB0_SI1302 +FJRB0_SI1932 +FJRB0_SI672 +FJRB0_SX132 +FJRB0_SX222 +FJRB0_SX312 +FJRB0_SX402 +FJRB0_SX42 +FJRP1_SI1432 +FJRP1_SI2062 +FJRP1_SI802 +FJRP1_SX172 +FJRP1_SX262 +FJRP1_SX352 +FJRP1_SX442 +FJRP1_SX82 +FJSK0_SI1052 +FJSK0_SI1682 +FJSK0_SI2312 +FJSK0_SX152 +FJSK0_SX242 +FJSK0_SX332 +FJSK0_SX422 +FJSK0_SX62 +FJSP0_SI1434 +FJSP0_SI1763 +FJSP0_SI804 +FJSP0_SX174 +FJSP0_SX264 +FJSP0_SX354 +FJSP0_SX444 +FJSP0_SX84 +FJWB1_SI2055 +FJWB1_SI748 +FJWB1_SI795 +FJWB1_SX165 +FJWB1_SX255 +FJWB1_SX345 +FJWB1_SX435 +FJWB1_SX75 +FJXM0_SI1211 +FJXM0_SI1971 +FJXM0_SI581 +FJXM0_SX131 +FJXM0_SX221 +FJXM0_SX311 +FJXM0_SX401 +FJXM0_SX41 +FJXP0_SI1122 +FJXP0_SI1752 +FJXP0_SI492 +FJXP0_SX132 +FJXP0_SX222 +FJXP0_SX312 +FJXP0_SX402 +FJXP0_SX42 +FKAA0_SI1208 +FKAA0_SI1838 +FKAA0_SI578 +FKAA0_SX128 +FKAA0_SX218 +FKAA0_SX308 +FKAA0_SX38 +FKAA0_SX398 +FKDE0_SI1141 +FKDE0_SI1771 +FKDE0_SI2221 +FKDE0_SX151 +FKDE0_SX241 +FKDE0_SX331 +FKDE0_SX421 +FKDE0_SX61 +FKDW0_SI1207 +FKDW0_SI1891 +FKDW0_SI577 +FKDW0_SX127 +FKDW0_SX217 +FKDW0_SX307 +FKDW0_SX37 +FKDW0_SX397 +FKFB0_SI1608 +FKFB0_SI2238 +FKFB0_SI978 +FKFB0_SX168 +FKFB0_SX258 +FKFB0_SX348 +FKFB0_SX438 +FKFB0_SX78 +FKKH0_SI1290 +FKKH0_SI1920 +FKKH0_SI660 +FKKH0_SX120 +FKKH0_SX210 +FKKH0_SX30 +FKKH0_SX300 +FKKH0_SX390 +FKLC0_SI1615 +FKLC0_SI2245 +FKLC0_SI985 +FKLC0_SX175 +FKLC0_SX265 +FKLC0_SX355 +FKLC0_SX445 +FKLC0_SX85 +FKLC1_SI1048 +FKLC1_SI1678 +FKLC1_SI2308 +FKLC1_SX148 +FKLC1_SX238 +FKLC1_SX328 +FKLC1_SX418 +FKLC1_SX58 +FKLH0_SI1257 +FKLH0_SI1887 +FKLH0_SI627 +FKLH0_SX177 +FKLH0_SX267 +FKLH0_SX357 +FKLH0_SX447 +FKLH0_SX87 +FKSR0_SI1117 +FKSR0_SI1747 +FKSR0_SI487 +FKSR0_SX161 +FKSR0_SX217 +FKSR0_SX366 +FKSR0_SX37 +FKSR0_SX397 +FLAC0_SI1339 +FLAC0_SI2161 +FLAC0_SI901 +FLAC0_SX181 +FLAC0_SX271 +FLAC0_SX361 +FLAC0_SX451 +FLAC0_SX91 +FLAG0_SI1464 +FLAG0_SI2094 +FLAG0_SI834 +FLAG0_SX114 +FLAG0_SX204 +FLAG0_SX24 +FLAG0_SX294 +FLAG0_SX384 +FLEH0_SI1051 +FLEH0_SI1681 +FLEH0_SI2311 +FLEH0_SX151 +FLEH0_SX241 +FLEH0_SX331 +FLEH0_SX421 +FLEH0_SX61 +FLET0_SI1137 +FLET0_SI1767 +FLET0_SI507 +FLET0_SX147 +FLET0_SX237 +FLET0_SX277 +FLET0_SX417 +FLET0_SX57 +FLHD0_SI1344 +FLHD0_SI1827 +FLHD0_SI1974 +FLHD0_SX174 +FLHD0_SX264 +FLHD0_SX354 +FLHD0_SX444 +FLHD0_SX84 +FLJA0_SI1078 +FLJA0_SI1708 +FLJA0_SI2338 +FLJA0_SX178 +FLJA0_SX268 +FLJA0_SX358 +FLJA0_SX448 +FLJA0_SX88 +FLJD0_SI1516 +FLJD0_SI2146 +FLJD0_SI886 +FLJD0_SX166 +FLJD0_SX256 +FLJD0_SX346 +FLJD0_SX436 +FLJD0_SX76 +FLJG0_SI1611 +FLJG0_SI2241 +FLJG0_SI981 +FLJG0_SX171 +FLJG0_SX261 +FLJG0_SX351 +FLJG0_SX441 +FLJG0_SX81 +FLKM0_SI1880 +FLKM0_SI620 +FLKM0_SI686 +FLKM0_SX116 +FLKM0_SX260 +FLKM0_SX350 +FLKM0_SX440 +FLKM0_SX80 +FLMA0_SI1243 +FLMA0_SI1873 +FLMA0_SI613 +FLMA0_SX163 +FLMA0_SX253 +FLMA0_SX343 +FLMA0_SX433 +FLMA0_SX73 +FLMC0_SI1372 +FLMC0_SI2002 +FLMC0_SI742 +FLMC0_SX112 +FLMC0_SX22 +FLMC0_SX292 +FLMC0_SX336 +FLMC0_SX382 +FLMK0_SI1035 +FLMK0_SI1229 +FLMK0_SI2295 +FLMK0_SX135 +FLMK0_SX225 +FLMK0_SX315 +FLMK0_SX405 +FLMK0_SX45 +FLOD0_SI1287 +FLOD0_SI1917 +FLOD0_SI657 +FLOD0_SX117 +FLOD0_SX171 +FLOD0_SX207 +FLOD0_SX297 +FLOD0_SX387 +FLTM0_SI1070 +FLTM0_SI1700 +FLTM0_SI2330 +FLTM0_SX170 +FLTM0_SX260 +FLTM0_SX350 +FLTM0_SX440 +FLTM0_SX80 +FMAH1_SI1509 +FMAH1_SI2139 +FMAH1_SI879 +FMAH1_SX159 +FMAH1_SX249 +FMAH1_SX339 +FMAH1_SX429 +FMAH1_SX69 +FMBG0_SI1160 +FMBG0_SI1790 +FMBG0_SI2264 +FMBG0_SX260 +FMBG0_SX3 +FMBG0_SX350 +FMBG0_SX440 +FMBG0_SX80 +FMEM0_SI1377 +FMEM0_SI2007 +FMEM0_SI747 +FMEM0_SX117 +FMEM0_SX207 +FMEM0_SX297 +FMEM0_SX333 +FMEM0_SX387 +FMJB0_SI1177 +FMJB0_SI1807 +FMJB0_SI547 +FMJB0_SX187 +FMJB0_SX277 +FMJB0_SX367 +FMJB0_SX7 +FMJB0_SX97 +FMJF0_SI1254 +FMJF0_SI1884 +FMJF0_SI624 +FMJF0_SX174 +FMJF0_SX264 +FMJF0_SX354 +FMJF0_SX444 +FMJF0_SX84 +FMJU0_SI1389 +FMJU0_SI2019 +FMJU0_SI759 +FMJU0_SX129 +FMJU0_SX219 +FMJU0_SX309 +FMJU0_SX39 +FMJU0_SX399 +FMKC0_SI1041 +FMKC0_SI1072 +FMKC0_SI1702 +FMKC0_SX172 +FMKC0_SX262 +FMKC0_SX352 +FMKC0_SX442 +FMKC0_SX82 +FMKF0_SI1018 +FMKF0_SI1536 +FMKF0_SI906 +FMKF0_SX186 +FMKF0_SX276 +FMKF0_SX366 +FMKF0_SX6 +FMKF0_SX96 +FMMH0_SI1537 +FMMH0_SI2167 +FMMH0_SI907 +FMMH0_SX187 +FMMH0_SX367 +FMMH0_SX420 +FMMH0_SX7 +FMMH0_SX97 +FMPG0_SI1602 +FMPG0_SI2232 +FMPG0_SI972 +FMPG0_SX162 +FMPG0_SX252 +FMPG0_SX342 +FMPG0_SX432 +FMPG0_SX72 +FNKL0_SI1522 +FNKL0_SI2152 +FNKL0_SI892 +FNKL0_SX172 +FNKL0_SX196 +FNKL0_SX262 +FNKL0_SX442 +FNKL0_SX82 +FNTB0_SI1203 +FNTB0_SI573 +FNTB0_SI679 +FNTB0_SX123 +FNTB0_SX213 +FNTB0_SX303 +FNTB0_SX33 +FNTB0_SX393 +FPAB1_SI1471 +FPAB1_SI2101 +FPAB1_SI841 +FPAB1_SX121 +FPAB1_SX211 +FPAB1_SX301 +FPAB1_SX31 +FPAB1_SX391 +FPAC0_SI1921 +FPAC0_SI2011 +FPAC0_SI661 +FPAC0_SX121 +FPAC0_SX211 +FPAC0_SX301 +FPAC0_SX31 +FPAC0_SX391 +FPAD0_SI1346 +FPAD0_SI1976 +FPAD0_SI716 +FPAD0_SX176 +FPAD0_SX266 +FPAD0_SX356 +FPAD0_SX446 +FPAD0_SX86 +FPAF0_SI1054 +FPAF0_SI1684 +FPAF0_SI2314 +FPAF0_SX154 +FPAF0_SX244 +FPAF0_SX334 +FPAF0_SX424 +FPAF0_SX64 +FPAZ0_SI1593 +FPAZ0_SI2223 +FPAZ0_SI963 +FPAZ0_SX153 +FPAZ0_SX243 +FPAZ0_SX27 +FPAZ0_SX423 +FPAZ0_SX63 +FPJF0_SI1046 +FPJF0_SI1259 +FPJF0_SI1676 +FPJF0_SX146 +FPJF0_SX236 +FPJF0_SX326 +FPJF0_SX352 +FPJF0_SX56 +FPLS0_SI1590 +FPLS0_SI2220 +FPLS0_SI960 +FPLS0_SX150 +FPLS0_SX240 +FPLS0_SX3 +FPLS0_SX330 +FPLS0_SX60 +FPMY0_SI1153 +FPMY0_SI1783 +FPMY0_SI523 +FPMY0_SX163 +FPMY0_SX196 +FPMY0_SX253 +FPMY0_SX343 +FPMY0_SX73 +FREH0_SI1315 +FREH0_SI1945 +FREH0_SI685 +FREH0_SX145 +FREH0_SX235 +FREH0_SX325 +FREH0_SX415 +FREH0_SX55 +FRJB0_SI1427 +FRJB0_SI1470 +FRJB0_SI1794 +FRJB0_SX167 +FRJB0_SX257 +FRJB0_SX347 +FRJB0_SX437 +FRJB0_SX77 +FRLL0_SI1514 +FRLL0_SI805 +FRLL0_SI884 +FRLL0_SX164 +FRLL0_SX254 +FRLL0_SX344 +FRLL0_SX434 +FRLL0_SX74 +FSAG0_SI1323 +FSAG0_SI1953 +FSAG0_SI693 +FSAG0_SX153 +FSAG0_SX243 +FSAG0_SX333 +FSAG0_SX423 +FSAG0_SX63 +FSAH0_SI1244 +FSAH0_SI1874 +FSAH0_SI614 +FSAH0_SX164 +FSAH0_SX327 +FSAH0_SX344 +FSAH0_SX434 +FSAH0_SX74 +FSAK0_SI1300 +FSAK0_SI1930 +FSAK0_SI670 +FSAK0_SX130 +FSAK0_SX220 +FSAK0_SX310 +FSAK0_SX40 +FSAK0_SX400 +FSBK0_SI1069 +FSBK0_SI1699 +FSBK0_SI2329 +FSBK0_SX169 +FSBK0_SX259 +FSBK0_SX349 +FSBK0_SX439 +FSBK0_SX79 +FSCN0_SI1886 +FSCN0_SI626 +FSCN0_SI705 +FSCN0_SX176 +FSCN0_SX266 +FSCN0_SX356 +FSCN0_SX446 +FSCN0_SX86 +FSDC0_SI1312 +FSDC0_SI1942 +FSDC0_SI2234 +FSDC0_SX142 +FSDC0_SX232 +FSDC0_SX322 +FSDC0_SX412 +FSDC0_SX52 +FSDJ0_SI1115 +FSDJ0_SI1745 +FSDJ0_SI485 +FSDJ0_SX125 +FSDJ0_SX215 +FSDJ0_SX305 +FSDJ0_SX35 +FSDJ0_SX395 +FSGF0_SI1557 +FSGF0_SI2187 +FSGF0_SI927 +FSGF0_SX117 +FSGF0_SX207 +FSGF0_SX27 +FSGF0_SX297 +FSGF0_SX387 +FSJG0_SI1570 +FSJG0_SI2200 +FSJG0_SI940 +FSJG0_SX130 +FSJG0_SX220 +FSJG0_SX310 +FSJG0_SX40 +FSJG0_SX400 +FSJK1_SI1025 +FSJK1_SI2285 +FSJK1_SI696 +FSJK1_SX125 +FSJK1_SX215 +FSJK1_SX305 +FSJK1_SX35 +FSJK1_SX395 +FSJS0_SI1171 +FSJS0_SI1801 +FSJS0_SI541 +FSJS0_SX181 +FSJS0_SX271 +FSJS0_SX361 +FSJS0_SX451 +FSJS0_SX91 +FSJW0_SI1333 +FSJW0_SI1963 +FSJW0_SI703 +FSJW0_SX163 +FSJW0_SX253 +FSJW0_SX343 +FSJW0_SX433 +FSJW0_SX73 +FSKC0_SI1416 +FSKC0_SI2046 +FSKC0_SI786 +FSKC0_SX156 +FSKC0_SX246 +FSKC0_SX336 +FSKC0_SX426 +FSKC0_SX66 +FSKL0_SI1529 +FSKL0_SI2159 +FSKL0_SI899 +FSKL0_SX179 +FSKL0_SX269 +FSKL0_SX359 +FSKL0_SX449 +FSKL0_SX89 +FSKP0_SI1098 +FSKP0_SI1728 +FSKP0_SI468 +FSKP0_SX108 +FSKP0_SX18 +FSKP0_SX198 +FSKP0_SX288 +FSKP0_SX378 +FSLS0_SI1056 +FSLS0_SI1686 +FSLS0_SI2316 +FSLS0_SX156 +FSLS0_SX202 +FSLS0_SX246 +FSLS0_SX426 +FSLS0_SX66 +FSMA0_SI1621 +FSMA0_SI2251 +FSMA0_SI991 +FSMA0_SX181 +FSMA0_SX271 +FSMA0_SX361 +FSMA0_SX451 +FSMA0_SX91 +FSMM0_SI1314 +FSMM0_SI1944 +FSMM0_SI684 +FSMM0_SX144 +FSMM0_SX234 +FSMM0_SX324 +FSMM0_SX414 +FSMM0_SX54 +FSMS1_SI1504 +FSMS1_SI2134 +FSMS1_SI874 +FSMS1_SX154 +FSMS1_SX244 +FSMS1_SX334 +FSMS1_SX347 +FSMS1_SX64 +FSPM0_SI1241 +FSPM0_SI1871 +FSPM0_SI611 +FSPM0_SX161 +FSPM0_SX251 +FSPM0_SX341 +FSPM0_SX431 +FSPM0_SX71 +FSRH0_SI1719 +FSRH0_SI1931 +FSRH0_SI671 +FSRH0_SX131 +FSRH0_SX221 +FSRH0_SX311 +FSRH0_SX401 +FSRH0_SX41 +FSSB0_SI1082 +FSSB0_SI1712 +FSSB0_SI2342 +FSSB0_SX182 +FSSB0_SX272 +FSSB0_SX362 +FSSB0_SX452 +FSSB0_SX92 +FTAJ0_SI1329 +FTAJ0_SI474 +FTAJ0_SI699 +FTAJ0_SX159 +FTAJ0_SX249 +FTAJ0_SX339 +FTAJ0_SX429 +FTAJ0_SX69 +FTBR0_SI1402 +FTBR0_SI2181 +FTBR0_SI921 +FTBR0_SX111 +FTBR0_SX201 +FTBR0_SX21 +FTBR0_SX291 +FTBR0_SX381 +FTBW0_SI1345 +FTBW0_SI1975 +FTBW0_SI715 +FTBW0_SX175 +FTBW0_SX265 +FTBW0_SX355 +FTBW0_SX445 +FTBW0_SX85 +FTLG0_SI1743 +FTLG0_SI483 +FTLG0_SI840 +FTLG0_SX123 +FTLG0_SX213 +FTLG0_SX303 +FTLG0_SX33 +FTLG0_SX393 +FTMG0_SI1532 +FTMG0_SI2162 +FTMG0_SI902 +FTMG0_SX182 +FTMG0_SX272 +FTMG0_SX362 +FTMG0_SX452 +FTMG0_SX92 +FVFB0_SI1032 +FVFB0_SI1510 +FVFB0_SI2292 +FVFB0_SX132 +FVFB0_SX222 +FVFB0_SX312 +FVFB0_SX402 +FVFB0_SX42 +FVKB0_SI1159 +FVKB0_SI1789 +FVKB0_SI529 +FVKB0_SX169 +FVKB0_SX259 +FVKB0_SX349 +FVKB0_SX439 +FVKB0_SX79 +FVMH0_SI1466 +FVMH0_SI2096 +FVMH0_SI836 +FVMH0_SX116 +FVMH0_SX206 +FVMH0_SX26 +FVMH0_SX296 +FVMH0_SX386 +MABC0_SI1620 +MABC0_SI2041 +MABC0_SI781 +MABC0_SX151 +MABC0_SX241 +MABC0_SX331 +MABC0_SX421 +MABC0_SX61 +MADC0_SI1367 +MADC0_SI1997 +MADC0_SI737 +MADC0_SX107 +MADC0_SX17 +MADC0_SX197 +MADC0_SX287 +MADC0_SX377 +MADD0_SI1295 +MADD0_SI1798 +MADD0_SI538 +MADD0_SX178 +MADD0_SX268 +MADD0_SX358 +MADD0_SX448 +MADD0_SX88 +MAEB0_SI1411 +MAEB0_SI2250 +MAEB0_SI990 +MAEB0_SX180 +MAEB0_SX270 +MAEB0_SX360 +MAEB0_SX450 +MAEB0_SX90 +MAEO0_SI1326 +MAEO0_SI1655 +MAEO0_SI1956 +MAEO0_SX156 +MAEO0_SX246 +MAEO0_SX336 +MAEO0_SX426 +MAEO0_SX66 +MAFM0_SI1569 +MAFM0_SI2199 +MAFM0_SI939 +MAFM0_SX129 +MAFM0_SX219 +MAFM0_SX309 +MAFM0_SX39 +MAFM0_SX399 +MAJP0_SI1074 +MAJP0_SI1704 +MAJP0_SI2334 +MAJP0_SX174 +MAJP0_SX264 +MAJP0_SX354 +MAJP0_SX444 +MAJP0_SX84 +MAKB0_SI1016 +MAKB0_SI1646 +MAKB0_SI2276 +MAKB0_SX116 +MAKB0_SX206 +MAKB0_SX26 +MAKB0_SX296 +MAKB0_SX386 +MAKR0_SI1352 +MAKR0_SI1982 +MAKR0_SI722 +MAKR0_SX182 +MAKR0_SX272 +MAKR0_SX362 +MAKR0_SX452 +MAKR0_SX92 +MAPV0_SI1293 +MAPV0_SI1923 +MAPV0_SI663 +MAPV0_SX123 +MAPV0_SX213 +MAPV0_SX303 +MAPV0_SX33 +MAPV0_SX393 +MARC0_SI1188 +MARC0_SI1818 +MARC0_SI558 +MARC0_SX108 +MARC0_SX18 +MARC0_SX198 +MARC0_SX288 +MARC0_SX378 +MARW0_SI1276 +MARW0_SI1906 +MARW0_SI646 +MARW0_SX106 +MARW0_SX16 +MARW0_SX286 +MARW0_SX349 +MARW0_SX376 +MBAR0_SI1319 +MBAR0_SI1949 +MBAR0_SI689 +MBAR0_SX149 +MBAR0_SX239 +MBAR0_SX329 +MBAR0_SX419 +MBAR0_SX59 +MBBR0_SI1055 +MBBR0_SI1685 +MBBR0_SI2315 +MBBR0_SX155 +MBBR0_SX245 +MBBR0_SX335 +MBBR0_SX425 +MBBR0_SX65 +MBCG0_SI2217 +MBCG0_SI486 +MBCG0_SI957 +MBCG0_SX147 +MBCG0_SX237 +MBCG0_SX327 +MBCG0_SX417 +MBCG0_SX57 +MBEF0_SI1281 +MBEF0_SI1911 +MBEF0_SI651 +MBEF0_SX111 +MBEF0_SX201 +MBEF0_SX21 +MBEF0_SX291 +MBEF0_SX381 +MBGT0_SI1341 +MBGT0_SI1841 +MBGT0_SI711 +MBGT0_SX171 +MBGT0_SX261 +MBGT0_SX351 +MBGT0_SX441 +MBGT0_SX81 +MBJV0_SI1247 +MBJV0_SI1877 +MBJV0_SI617 +MBJV0_SX167 +MBJV0_SX257 +MBJV0_SX347 +MBJV0_SX437 +MBJV0_SX77 +MBMA0_SI1222 +MBMA0_SI1852 +MBMA0_SI592 +MBMA0_SX142 +MBMA0_SX232 +MBMA0_SX322 +MBMA0_SX412 +MBMA0_SX52 +MBMA1_SI2207 +MBMA1_SI2214 +MBMA1_SI954 +MBMA1_SX144 +MBMA1_SX234 +MBMA1_SX324 +MBMA1_SX414 +MBMA1_SX54 +MBML0_SI1169 +MBML0_SI1799 +MBML0_SI539 +MBML0_SX179 +MBML0_SX269 +MBML0_SX359 +MBML0_SX449 +MBML0_SX89 +MBOM0_SI1014 +MBOM0_SI1644 +MBOM0_SI2274 +MBOM0_SX114 +MBOM0_SX204 +MBOM0_SX294 +MBOM0_SX311 +MBOM0_SX384 +MBSB0_SI1353 +MBSB0_SI1983 +MBSB0_SI723 +MBSB0_SX183 +MBSB0_SX273 +MBSB0_SX3 +MBSB0_SX363 +MBSB0_SX93 +MBTH0_SI2102 +MBTH0_SI505 +MBTH0_SI757 +MBTH0_SX122 +MBTH0_SX212 +MBTH0_SX302 +MBTH0_SX32 +MBTH0_SX392 +MBWP0_SI1531 +MBWP0_SI1969 +MBWP0_SI709 +MBWP0_SX169 +MBWP0_SX259 +MBWP0_SX349 +MBWP0_SX439 +MBWP0_SX79 +MCAE0_SI1447 +MCAE0_SI2077 +MCAE0_SI817 +MCAE0_SX187 +MCAE0_SX277 +MCAE0_SX367 +MCAE0_SX7 +MCAE0_SX97 +MCAL0_SI1138 +MCAL0_SI1768 +MCAL0_SI508 +MCAL0_SX148 +MCAL0_SX238 +MCAL0_SX328 +MCAL0_SX418 +MCAL0_SX58 +MCDC0_SI1292 +MCDC0_SI1922 +MCDC0_SI662 +MCDC0_SX122 +MCDC0_SX212 +MCDC0_SX302 +MCDC0_SX32 +MCDC0_SX392 +MCDD0_SI1513 +MCDD0_SI2143 +MCDD0_SI883 +MCDD0_SX163 +MCDD0_SX253 +MCDD0_SX343 +MCDD0_SX433 +MCDD0_SX73 +MCDR0_SI1154 +MCDR0_SI1784 +MCDR0_SI524 +MCDR0_SX164 +MCDR0_SX254 +MCDR0_SX344 +MCDR0_SX434 +MCDR0_SX74 +MCEF0_SI1135 +MCEF0_SI1765 +MCEF0_SI842 +MCEF0_SX145 +MCEF0_SX235 +MCEF0_SX325 +MCEF0_SX415 +MCEF0_SX55 +MCEW0_SI1442 +MCEW0_SI2072 +MCEW0_SI812 +MCEW0_SX182 +MCEW0_SX272 +MCEW0_SX362 +MCEW0_SX452 +MCEW0_SX92 +MCHL0_SI1347 +MCHL0_SI1404 +MCHL0_SI1977 +MCHL0_SX177 +MCHL0_SX267 +MCHL0_SX357 +MCHL0_SX447 +MCHL0_SX87 +MCLK0_SI1660 +MCLK0_SI2290 +MCLK0_SI650 +MCLK0_SX130 +MCLK0_SX220 +MCLK0_SX310 +MCLK0_SX40 +MCLK0_SX400 +MCLM0_SI1456 +MCLM0_SI2086 +MCLM0_SI826 +MCLM0_SX106 +MCLM0_SX16 +MCLM0_SX196 +MCLM0_SX286 +MCLM0_SX376 +MCPM0_SI1194 +MCPM0_SI1824 +MCPM0_SI564 +MCPM0_SX114 +MCPM0_SX204 +MCPM0_SX24 +MCPM0_SX294 +MCPM0_SX384 +MCRE0_SI1121 +MCRE0_SI1725 +MCRE0_SI1751 +MCRE0_SX131 +MCRE0_SX221 +MCRE0_SX24 +MCRE0_SX401 +MCRE0_SX41 +MCSS0_SI1380 +MCSS0_SI688 +MCSS0_SI750 +MCSS0_SX120 +MCSS0_SX210 +MCSS0_SX30 +MCSS0_SX300 +MCSS0_SX390 +MCTH0_SI1209 +MCTH0_SI1839 +MCTH0_SI579 +MCTH0_SX129 +MCTH0_SX219 +MCTH0_SX309 +MCTH0_SX39 +MCTH0_SX399 +MCTM0_SI1350 +MCTM0_SI1980 +MCTM0_SI720 +MCTM0_SX180 +MCTM0_SX270 +MCTM0_SX360 +MCTM0_SX450 +MCTM0_SX90 +MCXM0_SI1351 +MCXM0_SI1981 +MCXM0_SI721 +MCXM0_SX181 +MCXM0_SX271 +MCXM0_SX361 +MCXM0_SX451 +MCXM0_SX91 +MDAC0_SI1261 +MDAC0_SI1837 +MDAC0_SI631 +MDAC0_SX181 +MDAC0_SX271 +MDAC0_SX361 +MDAC0_SX451 +MDAC0_SX91 +MDAS0_SI1266 +MDAS0_SI1896 +MDAS0_SI636 +MDAS0_SX186 +MDAS0_SX21 +MDAS0_SX276 +MDAS0_SX6 +MDAS0_SX96 +MDBB1_SI1006 +MDBB1_SI1636 +MDBB1_SI2056 +MDBB1_SX106 +MDBB1_SX16 +MDBB1_SX196 +MDBB1_SX286 +MDBB1_SX376 +MDBP0_SI1158 +MDBP0_SI1788 +MDBP0_SI528 +MDBP0_SX168 +MDBP0_SX258 +MDBP0_SX348 +MDBP0_SX438 +MDBP0_SX78 +MDCD0_SI1415 +MDCD0_SI2045 +MDCD0_SI785 +MDCD0_SX155 +MDCD0_SX245 +MDCD0_SX335 +MDCD0_SX425 +MDCD0_SX65 +MDCM0_SI1480 +MDCM0_SI2110 +MDCM0_SI850 +MDCM0_SX130 +MDCM0_SX220 +MDCM0_SX310 +MDCM0_SX40 +MDCM0_SX400 +MDDC0_SI1419 +MDDC0_SI2049 +MDDC0_SI789 +MDDC0_SX159 +MDDC0_SX249 +MDDC0_SX339 +MDDC0_SX429 +MDDC0_SX69 +MDED0_SI1170 +MDED0_SI1800 +MDED0_SI540 +MDED0_SX180 +MDED0_SX270 +MDED0_SX360 +MDED0_SX450 +MDED0_SX90 +MDEF0_SI1123 +MDEF0_SI1563 +MDEF0_SI2193 +MDEF0_SX123 +MDEF0_SX213 +MDEF0_SX303 +MDEF0_SX33 +MDEF0_SX393 +MDEM0_SI1868 +MDEM0_SI608 +MDEM0_SI800 +MDEM0_SX158 +MDEM0_SX248 +MDEM0_SX338 +MDEM0_SX428 +MDEM0_SX68 +MDHL0_SI1439 +MDHL0_SI2069 +MDHL0_SI809 +MDHL0_SX179 +MDHL0_SX269 +MDHL0_SX359 +MDHL0_SX449 +MDHL0_SX89 +MDHS0_SI1530 +MDHS0_SI2160 +MDHS0_SI900 +MDHS0_SX180 +MDHS0_SX270 +MDHS0_SX360 +MDHS0_SX450 +MDHS0_SX90 +MDJM0_SI1455 +MDJM0_SI2085 +MDJM0_SI825 +MDJM0_SX105 +MDJM0_SX15 +MDJM0_SX195 +MDJM0_SX285 +MDJM0_SX375 +MDKS0_SI1066 +MDKS0_SI1696 +MDKS0_SI2326 +MDKS0_SX166 +MDKS0_SX256 +MDKS0_SX346 +MDKS0_SX436 +MDKS0_SX76 +MDLB0_SI1306 +MDLB0_SI1936 +MDLB0_SI676 +MDLB0_SX136 +MDLB0_SX226 +MDLB0_SX316 +MDLB0_SX406 +MDLB0_SX46 +MDLC0_SI1395 +MDLC0_SI2025 +MDLC0_SI765 +MDLC0_SX135 +MDLC0_SX225 +MDLC0_SX315 +MDLC0_SX405 +MDLC0_SX45 +MDLC1_SI1435 +MDLC1_SI2065 +MDLC1_SI2144 +MDLC1_SX175 +MDLC1_SX265 +MDLC1_SX355 +MDLC1_SX445 +MDLC1_SX85 +MDLC2_SI1614 +MDLC2_SI2244 +MDLC2_SI984 +MDLC2_SX174 +MDLC2_SX264 +MDLC2_SX354 +MDLC2_SX444 +MDLC2_SX84 +MDLH0_SI1960 +MDLH0_SI574 +MDLH0_SI700 +MDLH0_SX160 +MDLH0_SX250 +MDLH0_SX340 +MDLH0_SX430 +MDLH0_SX70 +MDLM0_SI1234 +MDLM0_SI1864 +MDLM0_SI604 +MDLM0_SX154 +MDLM0_SX244 +MDLM0_SX334 +MDLM0_SX424 +MDLM0_SX64 +MDLR0_SI1233 +MDLR0_SI1863 +MDLR0_SI603 +MDLR0_SX153 +MDLR0_SX243 +MDLR0_SX333 +MDLR0_SX423 +MDLR0_SX63 +MDLR1_SI1299 +MDLR1_SI1929 +MDLR1_SI669 +MDLR1_SX129 +MDLR1_SX219 +MDLR1_SX309 +MDLR1_SX39 +MDLR1_SX399 +MDMA0_SI1238 +MDMA0_SI1430 +MDMA0_SI2060 +MDMA0_SX170 +MDMA0_SX260 +MDMA0_SX350 +MDMA0_SX440 +MDMA0_SX80 +MDMT0_SI1832 +MDMT0_SI2341 +MDMT0_SI572 +MDMT0_SX122 +MDMT0_SX212 +MDMT0_SX302 +MDMT0_SX32 +MDMT0_SX392 +MDNS0_SI1011 +MDNS0_SI2271 +MDNS0_SI873 +MDNS0_SX111 +MDNS0_SX201 +MDNS0_SX21 +MDNS0_SX291 +MDNS0_SX381 +MDPB0_SI1760 +MDPB0_SI2126 +MDPB0_SI866 +MDPB0_SX146 +MDPB0_SX236 +MDPB0_SX326 +MDPB0_SX416 +MDPB0_SX56 +MDPK0_SI1053 +MDPK0_SI1683 +MDPK0_SI552 +MDPK0_SX153 +MDPK0_SX243 +MDPK0_SX333 +MDPK0_SX423 +MDPK0_SX63 +MDPS0_SI1651 +MDPS0_SI1979 +MDPS0_SI719 +MDPS0_SX179 +MDPS0_SX269 +MDPS0_SX359 +MDPS0_SX449 +MDPS0_SX89 +MDRD0_SI1382 +MDRD0_SI2012 +MDRD0_SI752 +MDRD0_SX122 +MDRD0_SX212 +MDRD0_SX302 +MDRD0_SX32 +MDRD0_SX392 +MDSJ0_SI1462 +MDSJ0_SI2092 +MDSJ0_SI832 +MDSJ0_SX112 +MDSJ0_SX22 +MDSJ0_SX292 +MDSJ0_SX382 +MDSJ0_SX438 +MDSS0_SI1881 +MDSS0_SI2087 +MDSS0_SI621 +MDSS0_SX171 +MDSS0_SX261 +MDSS0_SX351 +MDSS0_SX441 +MDSS0_SX81 +MDSS1_SI1327 +MDSS1_SI1713 +MDSS1_SI697 +MDSS1_SX157 +MDSS1_SX247 +MDSS1_SX337 +MDSS1_SX427 +MDSS1_SX67 +MDTB0_SI1200 +MDTB0_SI1830 +MDTB0_SI570 +MDTB0_SX120 +MDTB0_SX210 +MDTB0_SX300 +MDTB0_SX321 +MDTB0_SX390 +MDWD0_SI1260 +MDWD0_SI1890 +MDWD0_SI557 +MDWD0_SX180 +MDWD0_SX270 +MDWD0_SX360 +MDWD0_SX450 +MDWD0_SX90 +MDWH0_SI1168 +MDWH0_SI1925 +MDWH0_SI665 +MDWH0_SX125 +MDWH0_SX215 +MDWH0_SX305 +MDWH0_SX35 +MDWH0_SX395 +MDWM0_SI1546 +MDWM0_SI2176 +MDWM0_SI916 +MDWM0_SX106 +MDWM0_SX16 +MDWM0_SX286 +MDWM0_SX376 +MDWM0_SX433 +MEAL0_SI1547 +MEAL0_SI2177 +MEAL0_SI917 +MEAL0_SX107 +MEAL0_SX197 +MEAL0_SX287 +MEAL0_SX347 +MEAL0_SX377 +MEDR0_SI1374 +MEDR0_SI2004 +MEDR0_SI744 +MEDR0_SX114 +MEDR0_SX204 +MEDR0_SX24 +MEDR0_SX294 +MEDR0_SX384 +MEFG0_SI465 +MEFG0_SI491 +MEFG0_SI598 +MEFG0_SX105 +MEFG0_SX15 +MEFG0_SX195 +MEFG0_SX285 +MEFG0_SX375 +MEGJ0_SI1337 +MEGJ0_SI1967 +MEGJ0_SI707 +MEGJ0_SX167 +MEGJ0_SX257 +MEGJ0_SX3 +MEGJ0_SX437 +MEGJ0_SX77 +MEJL0_SI1592 +MEJL0_SI1654 +MEJL0_SI962 +MEJL0_SX152 +MEJL0_SX242 +MEJL0_SX332 +MEJL0_SX422 +MEJL0_SX62 +MEJS0_SI1240 +MEJS0_SI1870 +MEJS0_SI610 +MEJS0_SX160 +MEJS0_SX250 +MEJS0_SX340 +MEJS0_SX430 +MEJS0_SX70 +MESG0_SI1332 +MESG0_SI1962 +MESG0_SI702 +MESG0_SX162 +MESG0_SX252 +MESG0_SX342 +MESG0_SX432 +MESG0_SX72 +MESJ0_SI2039 +MESJ0_SI2257 +MESJ0_SI997 +MESJ0_SX187 +MESJ0_SX277 +MESJ0_SX367 +MESJ0_SX7 +MESJ0_SX97 +MEWM0_SI1348 +MEWM0_SI1978 +MEWM0_SI718 +MEWM0_SX178 +MEWM0_SX268 +MEWM0_SX358 +MEWM0_SX448 +MEWM0_SX88 +MFER0_SI1492 +MFER0_SI2122 +MFER0_SI862 +MFER0_SX142 +MFER0_SX232 +MFER0_SX322 +MFER0_SX412 +MFER0_SX52 +MFMC0_SI1132 +MFMC0_SI1762 +MFMC0_SI502 +MFMC0_SX142 +MFMC0_SX232 +MFMC0_SX322 +MFMC0_SX412 +MFMC0_SX52 +MFRM0_SI1155 +MFRM0_SI1717 +MFRM0_SI1785 +MFRM0_SX165 +MFRM0_SX255 +MFRM0_SX345 +MFRM0_SX435 +MFRM0_SX75 +MFWK0_SI1249 +MFWK0_SI1879 +MFWK0_SI619 +MFWK0_SX169 +MFWK0_SX259 +MFWK0_SX349 +MFWK0_SX439 +MFWK0_SX79 +MFXS0_SI1674 +MFXS0_SI2225 +MFXS0_SI2304 +MFXS0_SX144 +MFXS0_SX234 +MFXS0_SX324 +MFXS0_SX414 +MFXS0_SX54 +MFXV0_SI1005 +MFXV0_SI1342 +MFXV0_SI1635 +MFXV0_SX105 +MFXV0_SX15 +MFXV0_SX195 +MFXV0_SX285 +MFXV0_SX375 +MGAF0_SI1282 +MGAF0_SI1912 +MGAF0_SI652 +MGAF0_SX112 +MGAF0_SX202 +MGAF0_SX22 +MGAF0_SX292 +MGAF0_SX382 +MGAG0_SI1321 +MGAG0_SI645 +MGAG0_SI691 +MGAG0_SX151 +MGAG0_SX241 +MGAG0_SX331 +MGAG0_SX421 +MGAG0_SX61 +MGAK0_SI1036 +MGAK0_SI1666 +MGAK0_SI2296 +MGAK0_SX136 +MGAK0_SX226 +MGAK0_SX316 +MGAK0_SX406 +MGAK0_SX46 +MGAR0_SI1212 +MGAR0_SI1694 +MGAR0_SI1842 +MGAR0_SX132 +MGAR0_SX222 +MGAR0_SX312 +MGAR0_SX402 +MGAR0_SX42 +MGAW0_SI1165 +MGAW0_SI1802 +MGAW0_SI535 +MGAW0_SX175 +MGAW0_SX265 +MGAW0_SX355 +MGAW0_SX445 +MGAW0_SX85 +MGES0_SI1481 +MGES0_SI2111 +MGES0_SI851 +MGES0_SX131 +MGES0_SX221 +MGES0_SX311 +MGES0_SX401 +MGES0_SX41 +MGJC0_SI1256 +MGJC0_SI1335 +MGJC0_SI1965 +MGJC0_SX165 +MGJC0_SX255 +MGJC0_SX345 +MGJC0_SX435 +MGJC0_SX75 +MGRL0_SI1497 +MGRL0_SI2127 +MGRL0_SI867 +MGRL0_SX147 +MGRL0_SX237 +MGRL0_SX327 +MGRL0_SX417 +MGRL0_SX57 +MGRP0_SI1317 +MGRP0_SI1947 +MGRP0_SI687 +MGRP0_SX147 +MGRP0_SX237 +MGRP0_SX327 +MGRP0_SX417 +MGRP0_SX57 +MGSH0_SI1176 +MGSH0_SI1806 +MGSH0_SI546 +MGSH0_SX127 +MGSH0_SX186 +MGSH0_SX276 +MGSH0_SX6 +MGSH0_SX96 +MGSL0_SI1164 +MGSL0_SI534 +MGSL0_SI797 +MGSL0_SX174 +MGSL0_SX264 +MGSL0_SX354 +MGSL0_SX444 +MGSL0_SX84 +MGXP0_SI1087 +MGXP0_SI457 +MGXP0_SI525 +MGXP0_SX187 +MGXP0_SX277 +MGXP0_SX367 +MGXP0_SX7 +MGXP0_SX97 +MHBS0_SI1575 +MHBS0_SI2205 +MHBS0_SI945 +MHBS0_SX135 +MHBS0_SX225 +MHBS0_SX315 +MHBS0_SX405 +MHBS0_SX45 +MHIT0_SI1613 +MHIT0_SI2243 +MHIT0_SI983 +MHIT0_SX173 +MHIT0_SX263 +MHIT0_SX353 +MHIT0_SX443 +MHIT0_SX83 +MHJB0_SI1017 +MHJB0_SI1647 +MHJB0_SI2277 +MHJB0_SX117 +MHJB0_SX207 +MHJB0_SX27 +MHJB0_SX297 +MHJB0_SX387 +MHMG0_SI1365 +MHMG0_SI1995 +MHMG0_SI735 +MHMG0_SX105 +MHMG0_SX15 +MHMG0_SX195 +MHMG0_SX285 +MHMG0_SX375 +MHMR0_SI1119 +MHMR0_SI1692 +MHMR0_SI489 +MHMR0_SX129 +MHMR0_SX219 +MHMR0_SX309 +MHMR0_SX39 +MHMR0_SX399 +MHRM0_SI1475 +MHRM0_SI2218 +MHRM0_SI958 +MHRM0_SX148 +MHRM0_SX238 +MHRM0_SX328 +MHRM0_SX418 +MHRM0_SX58 +MHXL0_SI1772 +MHXL0_SI512 +MHXL0_SI612 +MHXL0_SX152 +MHXL0_SX242 +MHXL0_SX332 +MHXL0_SX422 +MHXL0_SX62 +MILB0_SI2163 +MILB0_SI807 +MILB0_SI903 +MILB0_SX183 +MILB0_SX273 +MILB0_SX3 +MILB0_SX363 +MILB0_SX93 +MJAC0_SI1331 +MJAC0_SI2148 +MJAC0_SI701 +MJAC0_SX251 +MJAC0_SX307 +MJAC0_SX341 +MJAC0_SX431 +MJAC0_SX71 +MJAE0_SI1524 +MJAE0_SI1999 +MJAE0_SI2154 +MJAE0_SX174 +MJAE0_SX264 +MJAE0_SX354 +MJAE0_SX444 +MJAE0_SX84 +MJAI0_SI1604 +MJAI0_SI682 +MJAI0_SI710 +MJAI0_SX164 +MJAI0_SX254 +MJAI0_SX344 +MJAI0_SX434 +MJAI0_SX74 +MJBG0_SI1232 +MJBG0_SI1724 +MJBG0_SI1862 +MJBG0_SX152 +MJBG0_SX242 +MJBG0_SX332 +MJBG0_SX422 +MJBG0_SX62 +MJDA0_SI1031 +MJDA0_SI1661 +MJDA0_SI2291 +MJDA0_SX131 +MJDA0_SX221 +MJDA0_SX311 +MJDA0_SX401 +MJDA0_SX41 +MJDC0_SI1161 +MJDC0_SI2165 +MJDC0_SI531 +MJDC0_SX171 +MJDC0_SX261 +MJDC0_SX351 +MJDC0_SX441 +MJDC0_SX81 +MJDE0_SI1120 +MJDE0_SI463 +MJDE0_SI490 +MJDE0_SX130 +MJDE0_SX220 +MJDE0_SX310 +MJDE0_SX40 +MJDE0_SX400 +MJDG0_SI1042 +MJDG0_SI1672 +MJDG0_SI1705 +MJDG0_SX142 +MJDG0_SX232 +MJDG0_SX322 +MJDG0_SX412 +MJDG0_SX52 +MJDM0_SI1340 +MJDM0_SI1937 +MJDM0_SI974 +MJDM0_SX170 +MJDM0_SX260 +MJDM0_SX350 +MJDM0_SX440 +MJDM0_SX80 +MJEB0_SI1286 +MJEB0_SI1916 +MJEB0_SI656 +MJEB0_SX170 +MJEB0_SX206 +MJEB0_SX26 +MJEB0_SX296 +MJEB0_SX386 +MJEB1_SI1467 +MJEB1_SI2097 +MJEB1_SI837 +MJEB1_SX117 +MJEB1_SX207 +MJEB1_SX27 +MJEB1_SX297 +MJEB1_SX387 +MJEE0_SI1237 +MJEE0_SI1867 +MJEE0_SI607 +MJEE0_SX157 +MJEE0_SX247 +MJEE0_SX337 +MJEE0_SX427 +MJEE0_SX67 +MJFH0_SI1107 +MJFH0_SI1737 +MJFH0_SI477 +MJFH0_SX117 +MJFH0_SX207 +MJFH0_SX27 +MJFH0_SX297 +MJFH0_SX387 +MJFR0_SI1605 +MJFR0_SI2235 +MJFR0_SI975 +MJFR0_SX165 +MJFR0_SX255 +MJFR0_SX345 +MJFR0_SX435 +MJFR0_SX75 +MJHI0_SI1328 +MJHI0_SI555 +MJHI0_SI698 +MJHI0_SX158 +MJHI0_SX248 +MJHI0_SX338 +MJHI0_SX428 +MJHI0_SX68 +MJJB0_SI1139 +MJJB0_SI1277 +MJJB0_SI1769 +MJJB0_SX149 +MJJB0_SX239 +MJJB0_SX329 +MJJB0_SX419 +MJJB0_SX59 +MJJJ0_SI1163 +MJJJ0_SI1793 +MJJJ0_SI533 +MJJJ0_SX173 +MJJJ0_SX263 +MJJJ0_SX353 +MJJJ0_SX443 +MJJJ0_SX83 +MJJM0_SI1251 +MJJM0_SI1457 +MJJM0_SI827 +MJJM0_SX107 +MJJM0_SX17 +MJJM0_SX197 +MJJM0_SX287 +MJJM0_SX377 +MJKR0_SI1201 +MJKR0_SI1831 +MJKR0_SI571 +MJKR0_SX121 +MJKR0_SX211 +MJKR0_SX301 +MJKR0_SX31 +MJKR0_SX391 +MJLB0_SI1616 +MJLB0_SI2246 +MJLB0_SI986 +MJLB0_SX176 +MJLB0_SX266 +MJLB0_SX356 +MJLB0_SX446 +MJLB0_SX86 +MJLG1_SI1012 +MJLG1_SI1642 +MJLG1_SI2272 +MJLG1_SX112 +MJLG1_SX202 +MJLG1_SX22 +MJLG1_SX292 +MJLG1_SX382 +MJLS0_SI1096 +MJLS0_SI1726 +MJLS0_SI466 +MJLS0_SX106 +MJLS0_SX16 +MJLS0_SX196 +MJLS0_SX286 +MJLS0_SX376 +MJMA0_SI1495 +MJMA0_SI2125 +MJMA0_SI865 +MJMA0_SX145 +MJMA0_SX235 +MJMA0_SX325 +MJMA0_SX415 +MJMA0_SX55 +MJMD0_SI1028 +MJMD0_SI1658 +MJMD0_SI2288 +MJMD0_SX128 +MJMD0_SX218 +MJMD0_SX308 +MJMD0_SX38 +MJMD0_SX398 +MJMM0_SI1255 +MJMM0_SI1885 +MJMM0_SI625 +MJMM0_SX175 +MJMM0_SX265 +MJMM0_SX355 +MJMM0_SX445 +MJMM0_SX85 +MJPG0_SI1191 +MJPG0_SI1821 +MJPG0_SI561 +MJPG0_SX111 +MJPG0_SX201 +MJPG0_SX21 +MJPG0_SX291 +MJPG0_SX381 +MJPM0_SI1368 +MJPM0_SI1998 +MJPM0_SI738 +MJPM0_SX108 +MJPM0_SX18 +MJPM0_SX198 +MJPM0_SX288 +MJPM0_SX378 +MJPM1_SI1897 +MJPM1_SI2280 +MJPM1_SI761 +MJPM1_SX131 +MJPM1_SX221 +MJPM1_SX311 +MJPM1_SX401 +MJPM1_SX41 +MJRA0_SI1236 +MJRA0_SI1866 +MJRA0_SI606 +MJRA0_SX156 +MJRA0_SX246 +MJRA0_SX336 +MJRA0_SX426 +MJRA0_SX66 +MJRG0_SI1366 +MJRG0_SI1996 +MJRG0_SI736 +MJRG0_SX106 +MJRG0_SX16 +MJRG0_SX286 +MJRG0_SX352 +MJRG0_SX376 +MJRH0_SI1125 +MJRH0_SI1755 +MJRH0_SI1840 +MJRH0_SX135 +MJRH0_SX225 +MJRH0_SX315 +MJRH0_SX405 +MJRH0_SX45 +MJRH1_SI1558 +MJRH1_SI1774 +MJRH1_SI514 +MJRH1_SX154 +MJRH1_SX244 +MJRH1_SX334 +MJRH1_SX424 +MJRH1_SX64 +MJRK0_SI1662 +MJRK0_SI2103 +MJRK0_SI880 +MJRK0_SX160 +MJRK0_SX250 +MJRK0_SX340 +MJRK0_SX430 +MJRK0_SX70 +MJRP0_SI1835 +MJRP0_SI1845 +MJRP0_SI585 +MJRP0_SX135 +MJRP0_SX225 +MJRP0_SX315 +MJRP0_SX405 +MJRP0_SX45 +MJSR0_SI1424 +MJSR0_SI2054 +MJSR0_SI794 +MJSR0_SX164 +MJSR0_SX254 +MJSR0_SX344 +MJSR0_SX434 +MJSR0_SX74 +MJWG0_SI2155 +MJWG0_SI813 +MJWG0_SI895 +MJWG0_SX175 +MJWG0_SX265 +MJWG0_SX355 +MJWG0_SX445 +MJWG0_SX85 +MJWS0_SI1143 +MJWS0_SI1773 +MJWS0_SI513 +MJWS0_SX153 +MJWS0_SX243 +MJWS0_SX333 +MJWS0_SX423 +MJWS0_SX63 +MJWT0_SI1291 +MJWT0_SI1381 +MJWT0_SI751 +MJWT0_SX121 +MJWT0_SX211 +MJWT0_SX301 +MJWT0_SX31 +MJWT0_SX391 +MJXA0_SI1507 +MJXA0_SI2137 +MJXA0_SI877 +MJXA0_SX157 +MJXA0_SX247 +MJXA0_SX337 +MJXA0_SX427 +MJXA0_SX67 +MJXL0_SI1172 +MJXL0_SI1795 +MJXL0_SI542 +MJXL0_SX182 +MJXL0_SX272 +MJXL0_SX362 +MJXL0_SX452 +MJXL0_SX92 +MKAG0_SI1609 +MKAG0_SI2239 +MKAG0_SI979 +MKAG0_SX169 +MKAG0_SX259 +MKAG0_SX30 +MKAG0_SX439 +MKAG0_SX79 +MKAH0_SI1528 +MKAH0_SI2158 +MKAH0_SI898 +MKAH0_SX178 +MKAH0_SX268 +MKAH0_SX358 +MKAH0_SX448 +MKAH0_SX88 +MKAJ0_SI1414 +MKAJ0_SI2044 +MKAJ0_SI784 +MKAJ0_SX154 +MKAJ0_SX244 +MKAJ0_SX334 +MKAJ0_SX424 +MKAJ0_SX64 +MKAM0_SI1250 +MKAM0_SI1316 +MKAM0_SI1465 +MKAM0_SX146 +MKAM0_SX236 +MKAM0_SX326 +MKAM0_SX416 +MKAM0_SX56 +MKDB0_SI2132 +MKDB0_SI588 +MKDB0_SI872 +MKDB0_SX152 +MKDB0_SX242 +MKDB0_SX332 +MKDB0_SX422 +MKDB0_SX62 +MKDD0_SI1567 +MKDD0_SI2197 +MKDD0_SI937 +MKDD0_SX127 +MKDD0_SX217 +MKDD0_SX307 +MKDD0_SX37 +MKDD0_SX397 +MKDT0_SI2153 +MKDT0_SI814 +MKDT0_SI893 +MKDT0_SX173 +MKDT0_SX263 +MKDT0_SX353 +MKDT0_SX443 +MKDT0_SX83 +MKES0_SI1253 +MKES0_SI1883 +MKES0_SI623 +MKES0_SX173 +MKES0_SX263 +MKES0_SX353 +MKES0_SX443 +MKES0_SX83 +MKJO0_SI1517 +MKJO0_SI2147 +MKJO0_SI887 +MKJO0_SX167 +MKJO0_SX257 +MKJO0_SX424 +MKJO0_SX437 +MKJO0_SX77 +MKLN0_SI1598 +MKLN0_SI2228 +MKLN0_SI968 +MKLN0_SX158 +MKLN0_SX248 +MKLN0_SX338 +MKLN0_SX428 +MKLN0_SX68 +MKLR0_SI1059 +MKLR0_SI1689 +MKLR0_SI2319 +MKLR0_SX159 +MKLR0_SX249 +MKLR0_SX339 +MKLR0_SX429 +MKLR0_SX69 +MKLS0_SI1437 +MKLS0_SI1533 +MKLS0_SI2067 +MKLS0_SX177 +MKLS0_SX267 +MKLS0_SX357 +MKLS0_SX447 +MKLS0_SX87 +MKLS1_SI1545 +MKLS1_SI2175 +MKLS1_SI915 +MKLS1_SX105 +MKLS1_SX15 +MKLS1_SX195 +MKLS1_SX285 +MKLS1_SX375 +MKLW0_SI1571 +MKLW0_SI1844 +MKLW0_SI2201 +MKLW0_SX131 +MKLW0_SX221 +MKLW0_SX311 +MKLW0_SX401 +MKLW0_SX41 +MKRG0_SI1491 +MKRG0_SI2121 +MKRG0_SI861 +MKRG0_SX141 +MKRG0_SX231 +MKRG0_SX31 +MKRG0_SX411 +MKRG0_SX51 +MKXL0_SI1185 +MKXL0_SI1815 +MKXL0_SI1958 +MKXL0_SX105 +MKXL0_SX15 +MKXL0_SX195 +MKXL0_SX285 +MKXL0_SX375 +MLBC0_SI1239 +MLBC0_SI1869 +MLBC0_SI609 +MLBC0_SX159 +MLBC0_SX249 +MLBC0_SX339 +MLBC0_SX429 +MLBC0_SX69 +MLEL0_SI1246 +MLEL0_SI1876 +MLEL0_SI616 +MLEL0_SX166 +MLEL0_SX256 +MLEL0_SX346 +MLEL0_SX436 +MLEL0_SX76 +MLJC0_SI1225 +MLJC0_SI1855 +MLJC0_SI595 +MLJC0_SX145 +MLJC0_SX235 +MLJC0_SX325 +MLJC0_SX415 +MLJC0_SX55 +MLJH0_SI1324 +MLJH0_SI1422 +MLJH0_SI694 +MLJH0_SX154 +MLJH0_SX244 +MLJH0_SX334 +MLJH0_SX424 +MLJH0_SX64 +MLNS0_SI1407 +MLNS0_SI2037 +MLNS0_SI777 +MLNS0_SX147 +MLNS0_SX237 +MLNS0_SX327 +MLNS0_SX417 +MLNS0_SX57 +MLSH0_SI1417 +MLSH0_SI2047 +MLSH0_SI787 +MLSH0_SX157 +MLSH0_SX247 +MLSH0_SX337 +MLSH0_SX427 +MLSH0_SX67 +MMAA0_SI1588 +MMAA0_SI2105 +MMAA0_SI845 +MMAA0_SX125 +MMAA0_SX215 +MMAA0_SX305 +MMAA0_SX35 +MMAA0_SX395 +MMAB1_SI1494 +MMAB1_SI2124 +MMAB1_SI864 +MMAB1_SX144 +MMAB1_SX234 +MMAB1_SX324 +MMAB1_SX414 +MMAB1_SX54 +MMAG0_SI1126 +MMAG0_SI1756 +MMAG0_SI496 +MMAG0_SX136 +MMAG0_SX226 +MMAG0_SX316 +MMAG0_SX406 +MMAG0_SX46 +MMAM0_SI1597 +MMAM0_SI1668 +MMAM0_SI2227 +MMAM0_SX157 +MMAM0_SX247 +MMAM0_SX337 +MMAM0_SX427 +MMAM0_SX67 +MMAR0_SI1336 +MMAR0_SI1966 +MMAR0_SI706 +MMAR0_SX166 +MMAR0_SX256 +MMAR0_SX346 +MMAR0_SX436 +MMAR0_SX76 +MMBS0_SI1151 +MMBS0_SI1781 +MMBS0_SI521 +MMBS0_SX161 +MMBS0_SX251 +MMBS0_SX341 +MMBS0_SX431 +MMBS0_SX71 +MMCC0_SI1338 +MMCC0_SI1968 +MMCC0_SI708 +MMCC0_SX168 +MMCC0_SX258 +MMCC0_SX348 +MMCC0_SX438 +MMCC0_SX78 +MMDB0_SI1358 +MMDB0_SI1617 +MMDB0_SI987 +MMDB0_SX177 +MMDB0_SX267 +MMDB0_SX357 +MMDB0_SX447 +MMDB0_SX87 +MMDG0_SI1780 +MMDG0_SI2035 +MMDG0_SI520 +MMDG0_SX160 +MMDG0_SX250 +MMDG0_SX340 +MMDG0_SX430 +MMDG0_SX70 +MMDM0_SI1311 +MMDM0_SI1941 +MMDM0_SI681 +MMDM0_SX141 +MMDM0_SX231 +MMDM0_SX321 +MMDM0_SX411 +MMDM0_SX51 +MMDM1_SI1650 +MMDM1_SI2043 +MMDM1_SI783 +MMDM1_SX153 +MMDM1_SX243 +MMDM1_SX333 +MMDM1_SX423 +MMDM1_SX63 +MMDS0_SI1343 +MMDS0_SI1973 +MMDS0_SI713 +MMDS0_SX173 +MMDS0_SX263 +MMDS0_SX353 +MMDS0_SX443 +MMDS0_SX83 +MMEA0_SI1388 +MMEA0_SI2018 +MMEA0_SI758 +MMEA0_SX128 +MMEA0_SX218 +MMEA0_SX308 +MMEA0_SX38 +MMEA0_SX398 +MMEB0_SI1357 +MMEB0_SI1987 +MMEB0_SI727 +MMEB0_SX187 +MMEB0_SX327 +MMEB0_SX367 +MMEB0_SX7 +MMEB0_SX97 +MMGC0_SI1305 +MMGC0_SI1935 +MMGC0_SI2184 +MMGC0_SX135 +MMGC0_SX225 +MMGC0_SX315 +MMGC0_SX405 +MMGC0_SX45 +MMGG0_SI1079 +MMGG0_SI1709 +MMGG0_SI2339 +MMGG0_SX179 +MMGG0_SX269 +MMGG0_SX359 +MMGG0_SX449 +MMGG0_SX89 +MMGK0_SI1322 +MMGK0_SI1952 +MMGK0_SI692 +MMGK0_SX152 +MMGK0_SX242 +MMGK0_SX332 +MMGK0_SX422 +MMGK0_SX62 +MMJB1_SI1408 +MMJB1_SI2038 +MMJB1_SI778 +MMJB1_SX148 +MMJB1_SX238 +MMJB1_SX328 +MMJB1_SX418 +MMJB1_SX58 +MMLM0_SI1527 +MMLM0_SI2150 +MMLM0_SI897 +MMLM0_SX177 +MMLM0_SX267 +MMLM0_SX357 +MMLM0_SX447 +MMLM0_SX87 +MMPM0_SI1061 +MMPM0_SI1691 +MMPM0_SI2321 +MMPM0_SX161 +MMPM0_SX251 +MMPM0_SX341 +MMPM0_SX431 +MMPM0_SX71 +MMRP0_SI2034 +MMRP0_SI717 +MMRP0_SI774 +MMRP0_SX144 +MMRP0_SX234 +MMRP0_SX324 +MMRP0_SX414 +MMRP0_SX54 +MMSM0_SI1106 +MMSM0_SI1736 +MMSM0_SI476 +MMSM0_SX116 +MMSM0_SX206 +MMSM0_SX26 +MMSM0_SX296 +MMSM0_SX386 +MMVP0_SI1284 +MMVP0_SI1914 +MMVP0_SI654 +MMVP0_SX114 +MMVP0_SX204 +MMVP0_SX294 +MMVP0_SX347 +MMVP0_SX384 +MMWB0_SI1619 +MMWB0_SI2249 +MMWB0_SI989 +MMWB0_SX179 +MMWB0_SX269 +MMWB0_SX359 +MMWB0_SX449 +MMWB0_SX89 +MMWS0_SI1518 +MMWS0_SI559 +MMWS0_SI888 +MMWS0_SX168 +MMWS0_SX258 +MMWS0_SX348 +MMWS0_SX438 +MMWS0_SX78 +MMWS1_SI1071 +MMWS1_SI1701 +MMWS1_SI2331 +MMWS1_SX261 +MMWS1_SX27 +MMWS1_SX351 +MMWS1_SX441 +MMWS1_SX81 +MMXS0_SI2136 +MMXS0_SI629 +MMXS0_SI876 +MMXS0_SX156 +MMXS0_SX246 +MMXS0_SX336 +MMXS0_SX426 +MMXS0_SX66 +MNET0_SI1446 +MNET0_SI2076 +MNET0_SI816 +MNET0_SX186 +MNET0_SX276 +MNET0_SX366 +MNET0_SX6 +MNET0_SX96 +MNTW0_SI1068 +MNTW0_SI1698 +MNTW0_SI2328 +MNTW0_SX168 +MNTW0_SX202 +MNTW0_SX258 +MNTW0_SX348 +MNTW0_SX78 +MPAR0_SI1576 +MPAR0_SI2206 +MPAR0_SI946 +MPAR0_SX136 +MPAR0_SX226 +MPAR0_SX316 +MPAR0_SX406 +MPAR0_SX46 +MPEB0_SI1034 +MPEB0_SI1860 +MPEB0_SI600 +MPEB0_SX150 +MPEB0_SX240 +MPEB0_SX330 +MPEB0_SX420 +MPEB0_SX60 +MPFU0_SI1258 +MPFU0_SI1888 +MPFU0_SI628 +MPFU0_SX178 +MPFU0_SX268 +MPFU0_SX358 +MPFU0_SX448 +MPFU0_SX88 +MPGH0_SI1554 +MPGH0_SI675 +MPGH0_SI924 +MPGH0_SX114 +MPGH0_SX204 +MPGH0_SX24 +MPGH0_SX294 +MPGH0_SX384 +MPGR0_SI1410 +MPGR0_SI2040 +MPGR0_SI780 +MPGR0_SX150 +MPGR0_SX240 +MPGR0_SX330 +MPGR0_SX420 +MPGR0_SX60 +MPGR1_SI1269 +MPGR1_SI1499 +MPGR1_SI2129 +MPGR1_SX149 +MPGR1_SX239 +MPGR1_SX329 +MPGR1_SX419 +MPGR1_SX59 +MPMB0_SI1501 +MPMB0_SI2131 +MPMB0_SI871 +MPMB0_SX151 +MPMB0_SX241 +MPMB0_SX331 +MPMB0_SX421 +MPMB0_SX61 +MPPC0_SI1412 +MPPC0_SI2042 +MPPC0_SI782 +MPPC0_SX152 +MPPC0_SX242 +MPPC0_SX332 +MPPC0_SX422 +MPPC0_SX62 +MPRB0_SI1205 +MPRB0_SI1215 +MPRB0_SI575 +MPRB0_SX125 +MPRB0_SX215 +MPRB0_SX305 +MPRB0_SX35 +MPRB0_SX395 +MPRD0_SI1431 +MPRD0_SI2061 +MPRD0_SI801 +MPRD0_SX171 +MPRD0_SX261 +MPRD0_SX351 +MPRD0_SX441 +MPRD0_SX81 +MPRK0_SI1097 +MPRK0_SI1727 +MPRK0_SI467 +MPRK0_SX107 +MPRK0_SX17 +MPRK0_SX197 +MPRK0_SX287 +MPRK0_SX377 +MPRT0_SI1210 +MPRT0_SI495 +MPRT0_SI580 +MPRT0_SX130 +MPRT0_SX220 +MPRT0_SX310 +MPRT0_SX40 +MPRT0_SX400 +MPSW0_SI1067 +MPSW0_SI1697 +MPSW0_SI2327 +MPSW0_SX167 +MPSW0_SX24 +MPSW0_SX257 +MPSW0_SX437 +MPSW0_SX77 +MRAB0_SI1224 +MRAB0_SI1854 +MRAB0_SI594 +MRAB0_SX144 +MRAB0_SX234 +MRAB0_SX324 +MRAB0_SX414 +MRAB0_SX54 +MRAB1_SI1478 +MRAB1_SI2108 +MRAB1_SI848 +MRAB1_SX128 +MRAB1_SX218 +MRAB1_SX308 +MRAB1_SX38 +MRAB1_SX398 +MRAI0_SI1954 +MRAI0_SI2052 +MRAI0_SI792 +MRAI0_SX162 +MRAI0_SX252 +MRAI0_SX342 +MRAI0_SX432 +MRAI0_SX72 +MRAM0_SI1275 +MRAM0_SI1905 +MRAM0_SI1951 +MRAM0_SX105 +MRAM0_SX15 +MRAM0_SX195 +MRAM0_SX285 +MRAM0_SX375 +MRAV0_SI1008 +MRAV0_SI1638 +MRAV0_SI2268 +MRAV0_SX108 +MRAV0_SX18 +MRAV0_SX198 +MRAV0_SX288 +MRAV0_SX378 +MRBC0_SI1665 +MRBC0_SI1859 +MRBC0_SI599 +MRBC0_SX149 +MRBC0_SX239 +MRBC0_SX329 +MRBC0_SX419 +MRBC0_SX59 +MRCG0_SI1428 +MRCG0_SI2058 +MRCG0_SI798 +MRCG0_SX168 +MRCG0_SX258 +MRCG0_SX348 +MRCG0_SX438 +MRCG0_SX78 +MRCW0_SI1371 +MRCW0_SI2001 +MRCW0_SI741 +MRCW0_SX111 +MRCW0_SX201 +MRCW0_SX21 +MRCW0_SX291 +MRCW0_SX381 +MRDD0_SI1050 +MRDD0_SI1680 +MRDD0_SI2310 +MRDD0_SX150 +MRDD0_SX240 +MRDD0_SX277 +MRDD0_SX330 +MRDD0_SX60 +MRDM0_SI1044 +MRDM0_SI1595 +MRDM0_SI965 +MRDM0_SX155 +MRDM0_SX245 +MRDM0_SX335 +MRDM0_SX425 +MRDM0_SX65 +MRDS0_SI1167 +MRDS0_SI1797 +MRDS0_SI537 +MRDS0_SX177 +MRDS0_SX267 +MRDS0_SX357 +MRDS0_SX447 +MRDS0_SX87 +MREE0_SI1104 +MREE0_SI1734 +MREE0_SI1959 +MREE0_SX114 +MREE0_SX204 +MREE0_SX24 +MREE0_SX294 +MREE0_SX384 +MREH1_SI1599 +MREH1_SI2229 +MREH1_SI969 +MREH1_SX159 +MREH1_SX249 +MREH1_SX339 +MREH1_SX429 +MREH1_SX69 +MREM0_SI1591 +MREM0_SI511 +MREM0_SI961 +MREM0_SX151 +MREM0_SX241 +MREM0_SX331 +MREM0_SX421 +MREM0_SX61 +MREW1_SI1500 +MREW1_SI2130 +MREW1_SI870 +MREW1_SX150 +MREW1_SX240 +MREW1_SX330 +MREW1_SX420 +MREW1_SX60 +MRFK0_SI1076 +MRFK0_SI1706 +MRFK0_SI2336 +MRFK0_SX176 +MRFK0_SX266 +MRFK0_SX356 +MRFK0_SX446 +MRFK0_SX86 +MRFL0_SI1156 +MRFL0_SI1786 +MRFL0_SI526 +MRFL0_SX166 +MRFL0_SX256 +MRFL0_SX346 +MRFL0_SX436 +MRFL0_SX76 +MRGM0_SI1162 +MRGM0_SI1792 +MRGM0_SI532 +MRGM0_SX172 +MRGM0_SX262 +MRGM0_SX416 +MRGM0_SX442 +MRGM0_SX82 +MRGS0_SI1356 +MRGS0_SI1986 +MRGS0_SI726 +MRGS0_SX186 +MRGS0_SX276 +MRGS0_SX366 +MRGS0_SX6 +MRGS0_SX96 +MRHL0_SI1515 +MRHL0_SI2145 +MRHL0_SI885 +MRHL0_SX165 +MRHL0_SX255 +MRHL0_SX345 +MRHL0_SX435 +MRHL0_SX75 +MRJB1_SI1020 +MRJB1_SI1413 +MRJB1_SI2021 +MRJB1_SX120 +MRJB1_SX210 +MRJB1_SX30 +MRJB1_SX300 +MRJB1_SX390 +MRJH0_SI1519 +MRJH0_SI889 +MRJH0_SI914 +MRJH0_SX169 +MRJH0_SX259 +MRJH0_SX307 +MRJH0_SX439 +MRJH0_SX79 +MRJM0_SI1095 +MRJM0_SI1228 +MRJM0_SI1858 +MRJM0_SX148 +MRJM0_SX238 +MRJM0_SX328 +MRJM0_SX418 +MRJM0_SX58 +MRJM1_SI1298 +MRJM1_SI1928 +MRJM1_SI668 +MRJM1_SX128 +MRJM1_SX218 +MRJM1_SX308 +MRJM1_SX38 +MRJM1_SX398 +MRJT0_SI1498 +MRJT0_SI1805 +MRJT0_SI868 +MRJT0_SX148 +MRJT0_SX238 +MRJT0_SX328 +MRJT0_SX418 +MRJT0_SX58 +MRKM0_SI1267 +MRKM0_SI1391 +MRKM0_SI637 +MRKM0_SX187 +MRKM0_SX277 +MRKM0_SX367 +MRKM0_SX7 +MRKM0_SX97 +MRLD0_SI1594 +MRLD0_SI2224 +MRLD0_SI964 +MRLD0_SX154 +MRLD0_SX244 +MRLD0_SX334 +MRLD0_SX424 +MRLD0_SX64 +MRLJ0_SI1420 +MRLJ0_SI2050 +MRLJ0_SI790 +MRLJ0_SX160 +MRLJ0_SX250 +MRLJ0_SX340 +MRLJ0_SX430 +MRLJ0_SX70 +MRLJ1_SI1671 +MRLJ1_SI2301 +MRLJ1_SI2332 +MRLJ1_SX141 +MRLJ1_SX231 +MRLJ1_SX321 +MRLJ1_SX411 +MRLJ1_SX51 +MRLK0_SI1468 +MRLK0_SI2140 +MRLK0_SI843 +MRLK0_SX123 +MRLK0_SX213 +MRLK0_SX303 +MRLK0_SX33 +MRLK0_SX393 +MRLR0_SI1196 +MRLR0_SI1826 +MRLR0_SI566 +MRLR0_SX116 +MRLR0_SX206 +MRLR0_SX26 +MRLR0_SX296 +MRLR0_SX386 +MRMB0_SI1581 +MRMB0_SI2211 +MRMB0_SI951 +MRMB0_SX141 +MRMB0_SX231 +MRMB0_SX321 +MRMB0_SX411 +MRMB0_SX51 +MRMG0_SI1080 +MRMG0_SI1710 +MRMG0_SI2340 +MRMG0_SX180 +MRMG0_SX270 +MRMG0_SX360 +MRMG0_SX450 +MRMG0_SX90 +MRMH0_SI1021 +MRMH0_SI1349 +MRMH0_SI2281 +MRMH0_SX121 +MRMH0_SX211 +MRMH0_SX301 +MRMH0_SX31 +MRMH0_SX391 +MRML0_SI1421 +MRML0_SI2051 +MRML0_SI791 +MRML0_SX161 +MRML0_SX251 +MRML0_SX341 +MRML0_SX431 +MRML0_SX71 +MRMS0_SI1113 +MRMS0_SI2057 +MRMS0_SI2100 +MRMS0_SX120 +MRMS0_SX210 +MRMS0_SX30 +MRMS0_SX300 +MRMS0_SX390 +MRPC1_SI1482 +MRPC1_SI2026 +MRPC1_SI2112 +MRPC1_SX132 +MRPC1_SX222 +MRPC1_SX312 +MRPC1_SX402 +MRPC1_SX42 +MRRE0_SI1334 +MRRE0_SI704 +MRRE0_SI952 +MRRE0_SX164 +MRRE0_SX254 +MRRE0_SX344 +MRRE0_SX434 +MRRE0_SX74 +MRSO0_SI1206 +MRSO0_SI1659 +MRSO0_SI2289 +MRSO0_SX129 +MRSO0_SX219 +MRSO0_SX309 +MRSO0_SX39 +MRSO0_SX399 +MRSP0_SI1429 +MRSP0_SI2059 +MRSP0_SI799 +MRSP0_SX169 +MRSP0_SX196 +MRSP0_SX259 +MRSP0_SX439 +MRSP0_SX79 +MRTC0_SI1458 +MRTC0_SI2088 +MRTC0_SI828 +MRTC0_SX108 +MRTC0_SX18 +MRTC0_SX198 +MRTC0_SX288 +MRTC0_SX378 +MRTJ0_SI1551 +MRTJ0_SI2032 +MRTJ0_SI772 +MRTJ0_SX142 +MRTJ0_SX232 +MRTJ0_SX322 +MRTJ0_SX412 +MRTJ0_SX52 +MRVG0_SI1140 +MRVG0_SI1770 +MRVG0_SI510 +MRVG0_SX150 +MRVG0_SX240 +MRVG0_SX330 +MRVG0_SX420 +MRVG0_SX60 +MRWA0_SI1603 +MRWA0_SI2233 +MRWA0_SI973 +MRWA0_SX163 +MRWA0_SX253 +MRWA0_SX343 +MRWA0_SX433 +MRWA0_SX73 +MRWS0_SI1102 +MRWS0_SI1732 +MRWS0_SI472 +MRWS0_SX112 +MRWS0_SX202 +MRWS0_SX22 +MRWS0_SX292 +MRWS0_SX382 +MRXB0_SI1585 +MRXB0_SI2215 +MRXB0_SI955 +MRXB0_SX145 +MRXB0_SX235 +MRXB0_SX325 +MRXB0_SX415 +MRXB0_SX55 +MSAH1_SI1049 +MSAH1_SI1679 +MSAH1_SI2309 +MSAH1_SX149 +MSAH1_SX239 +MSAH1_SX329 +MSAH1_SX419 +MSAH1_SX59 +MSAS0_SI1376 +MSAS0_SI2006 +MSAS0_SI746 +MSAS0_SX116 +MSAS0_SX206 +MSAS0_SX26 +MSAS0_SX296 +MSAS0_SX386 +MSAT0_SI1526 +MSAT0_SI2156 +MSAT0_SI896 +MSAT0_SX176 +MSAT0_SX266 +MSAT0_SX356 +MSAT0_SX446 +MSAT0_SX86 +MSAT1_SI1073 +MSAT1_SI1703 +MSAT1_SI2333 +MSAT1_SX173 +MSAT1_SX263 +MSAT1_SX353 +MSAT1_SX443 +MSAT1_SX83 +MSDB0_SI1007 +MSDB0_SI1637 +MSDB0_SI2267 +MSDB0_SX107 +MSDB0_SX17 +MSDB0_SX197 +MSDB0_SX287 +MSDB0_SX377 +MSDH0_SI2113 +MSDH0_SI2240 +MSDH0_SI980 +MSDH0_SX170 +MSDH0_SX260 +MSDH0_SX350 +MSDH0_SX440 +MSDH0_SX80 +MSDS0_SI1077 +MSDS0_SI1707 +MSDS0_SI2337 +MSDS0_SX177 +MSDS0_SX267 +MSDS0_SX357 +MSDS0_SX447 +MSDS0_SX87 +MSEM1_SI1440 +MSEM1_SI2070 +MSEM1_SI810 +MSEM1_SX180 +MSEM1_SX270 +MSEM1_SX360 +MSEM1_SX450 +MSEM1_SX90 +MSES0_SI1589 +MSES0_SI2216 +MSES0_SI2219 +MSES0_SX149 +MSES0_SX239 +MSES0_SX329 +MSES0_SX419 +MSES0_SX59 +MSFH0_SI1216 +MSFH0_SI1738 +MSFH0_SI586 +MSFH0_SX136 +MSFH0_SX226 +MSFH0_SX316 +MSFH0_SX406 +MSFH0_SX46 +MSFV0_SI1262 +MSFV0_SI1892 +MSFV0_SI632 +MSFV0_SX182 +MSFV0_SX272 +MSFV0_SX362 +MSFV0_SX452 +MSFV0_SX92 +MSJK0_SI1596 +MSJK0_SI2226 +MSJK0_SI966 +MSJK0_SX156 +MSJK0_SX246 +MSJK0_SX336 +MSJK0_SX426 +MSJK0_SX66 +MSMC0_SI1907 +MSMC0_SI509 +MSMC0_SI647 +MSMC0_SX107 +MSMC0_SX17 +MSMC0_SX197 +MSMC0_SX287 +MSMC0_SX377 +MSMR0_SI1150 +MSMR0_SI1405 +MSMR0_SI775 +MSMR0_SX145 +MSMR0_SX235 +MSMR0_SX325 +MSMR0_SX415 +MSMR0_SX55 +MSMS0_SI1433 +MSMS0_SI2063 +MSMS0_SI803 +MSMS0_SX173 +MSMS0_SX263 +MSMS0_SX353 +MSMS0_SX443 +MSMS0_SX83 +MSRG0_SI1221 +MSRG0_SI1851 +MSRG0_SI591 +MSRG0_SX141 +MSRG0_SX231 +MSRG0_SX321 +MSRG0_SX411 +MSRG0_SX51 +MSRR0_SI1131 +MSRR0_SI1761 +MSRR0_SI501 +MSRR0_SX141 +MSRR0_SX231 +MSRR0_SX30 +MSRR0_SX411 +MSRR0_SX51 +MSTF0_SI1396 +MSTF0_SI766 +MSTF0_SI852 +MSTF0_SX136 +MSTF0_SX226 +MSTF0_SX316 +MSTF0_SX406 +MSTF0_SX46 +MSVS0_SI1568 +MSVS0_SI2198 +MSVS0_SI938 +MSVS0_SX128 +MSVS0_SX218 +MSVS0_SX308 +MSVS0_SX38 +MSVS0_SX398 +MTAB0_SI1572 +MTAB0_SI2202 +MTAB0_SI942 +MTAB0_SX132 +MTAB0_SX222 +MTAB0_SX312 +MTAB0_SX402 +MTAB0_SX42 +MTAS0_SI1385 +MTAS0_SI2015 +MTAS0_SI755 +MTAS0_SX125 +MTAS0_SX215 +MTAS0_SX305 +MTAS0_SX35 +MTAS0_SX395 +MTAT0_SI1110 +MTAT0_SI1740 +MTAT0_SI811 +MTAT0_SX120 +MTAT0_SX210 +MTAT0_SX30 +MTAT0_SX300 +MTAT0_SX390 +MTAT1_SI1409 +MTAT1_SI1627 +MTAT1_SI779 +MTAT1_SX149 +MTAT1_SX239 +MTAT1_SX329 +MTAT1_SX419 +MTAT1_SX59 +MTBC0_SI1173 +MTBC0_SI1803 +MTBC0_SI543 +MTBC0_SX183 +MTBC0_SX273 +MTBC0_SX347 +MTBC0_SX363 +MTBC0_SX93 +MTCS0_SI1972 +MTCS0_SI2265 +MTCS0_SI712 +MTCS0_SX172 +MTCS0_SX262 +MTCS0_SX352 +MTCS0_SX442 +MTCS0_SX82 +MTDB0_SI1401 +MTDB0_SI2031 +MTDB0_SI771 +MTDB0_SX141 +MTDB0_SX231 +MTDB0_SX321 +MTDB0_SX411 +MTDB0_SX51 +MTDP0_SI1274 +MTDP0_SI1521 +MTDP0_SI2151 +MTDP0_SX171 +MTDP0_SX261 +MTDP0_SX351 +MTDP0_SX441 +MTDP0_SX81 +MTER0_SI1157 +MTER0_SI1787 +MTER0_SI527 +MTER0_SX167 +MTER0_SX17 +MTER0_SX257 +MTER0_SX437 +MTER0_SX77 +MTJG0_SI1520 +MTJG0_SI2157 +MTJG0_SI890 +MTJG0_SX170 +MTJG0_SX260 +MTJG0_SX350 +MTJG0_SX440 +MTJG0_SX80 +MTJM0_SI1226 +MTJM0_SI1856 +MTJM0_SI655 +MTJM0_SX146 +MTJM0_SX236 +MTJM0_SX326 +MTJM0_SX416 +MTJM0_SX56 +MTJS0_SI1192 +MTJS0_SI1822 +MTJS0_SI562 +MTJS0_SX112 +MTJS0_SX202 +MTJS0_SX22 +MTJS0_SX292 +MTJS0_SX382 +MTJU0_SI2020 +MTJU0_SI2269 +MTJU0_SI760 +MTJU0_SX130 +MTJU0_SX220 +MTJU0_SX310 +MTJU0_SX40 +MTJU0_SX400 +MTKD0_SI1187 +MTKD0_SI1817 +MTKD0_SI630 +MTKD0_SX107 +MTKD0_SX17 +MTKD0_SX197 +MTKD0_SX287 +MTKD0_SX377 +MTKP0_SI1023 +MTKP0_SI2283 +MTKP0_SI454 +MTKP0_SX123 +MTKP0_SX213 +MTKP0_SX303 +MTKP0_SX33 +MTKP0_SX393 +MTLB0_SI1134 +MTLB0_SI1764 +MTLB0_SI504 +MTLB0_SX144 +MTLB0_SX234 +MTLB0_SX324 +MTLB0_SX414 +MTLB0_SX54 +MTLC0_SI1313 +MTLC0_SI1477 +MTLC0_SI847 +MTLC0_SX127 +MTLC0_SX217 +MTLC0_SX307 +MTLC0_SX37 +MTLC0_SX397 +MTML0_SI1065 +MTML0_SI1695 +MTML0_SI2325 +MTML0_SX165 +MTML0_SX255 +MTML0_SX345 +MTML0_SX435 +MTML0_SX75 +MTMN0_SI1064 +MTMN0_SI2324 +MTMN0_SI582 +MTMN0_SX164 +MTMN0_SX254 +MTMN0_SX344 +MTMN0_SX434 +MTMN0_SX74 +MTMT0_SI1118 +MTMT0_SI1748 +MTMT0_SI488 +MTMT0_SX128 +MTMT0_SX218 +MTMT0_SX308 +MTMT0_SX38 +MTMT0_SX398 +MTPF0_SI1235 +MTPF0_SI1865 +MTPF0_SI605 +MTPF0_SX155 +MTPF0_SX245 +MTPF0_SX335 +MTPF0_SX425 +MTPF0_SX65 +MTPG0_SI1383 +MTPG0_SI2013 +MTPG0_SI753 +MTPG0_SX123 +MTPG0_SX213 +MTPG0_SX303 +MTPG0_SX33 +MTPG0_SX393 +MTPP0_SI1508 +MTPP0_SI2138 +MTPP0_SI878 +MTPP0_SX158 +MTPP0_SX248 +MTPP0_SX338 +MTPP0_SX428 +MTPP0_SX68 +MTPR0_SI1600 +MTPR0_SI2230 +MTPR0_SI506 +MTPR0_SX160 +MTPR0_SX250 +MTPR0_SX340 +MTPR0_SX430 +MTPR0_SX70 +MTQC0_SI1441 +MTQC0_SI2071 +MTQC0_SI480 +MTQC0_SX181 +MTQC0_SX271 +MTQC0_SX361 +MTQC0_SX451 +MTQC0_SX91 +MTRC0_SI1623 +MTRC0_SI589 +MTRC0_SI993 +MTRC0_SX170 +MTRC0_SX183 +MTRC0_SX273 +MTRC0_SX363 +MTRC0_SX93 +MTRR0_SI1548 +MTRR0_SI2178 +MTRR0_SI918 +MTRR0_SX108 +MTRR0_SX18 +MTRR0_SX198 +MTRR0_SX288 +MTRR0_SX378 +MTRT0_SI1227 +MTRT0_SI1857 +MTRT0_SI597 +MTRT0_SX147 +MTRT0_SX237 +MTRT0_SX254 +MTRT0_SX417 +MTRT0_SX57 +MTWH1_SI1512 +MTWH1_SI2142 +MTWH1_SI882 +MTWH1_SX162 +MTWH1_SX252 +MTWH1_SX342 +MTWH1_SX432 +MTWH1_SX72 +MTXS0_SI1060 +MTXS0_SI1690 +MTXS0_SI2320 +MTXS0_SX160 +MTXS0_SX250 +MTXS0_SX340 +MTXS0_SX430 +MTXS0_SX70 +MVJH0_SI1556 +MVJH0_SI2186 +MVJH0_SI926 +MVJH0_SX116 +MVJH0_SX206 +MVJH0_SX26 +MVJH0_SX296 +MVJH0_SX386 +MVLO0_SI1147 +MVLO0_SI1777 +MVLO0_SI517 +MVLO0_SX157 +MVLO0_SX247 +MVLO0_SX337 +MVLO0_SX427 +MVLO0_SX67 +MVRW0_SI1485 +MVRW0_SI2115 +MVRW0_SI855 +MVRW0_SX135 +MVRW0_SX225 +MVRW0_SX315 +MVRW0_SX405 +MVRW0_SX45 +MWAC0_SI1601 +MWAC0_SI2231 +MWAC0_SI971 +MWAC0_SX161 +MWAC0_SX251 +MWAC0_SX341 +MWAC0_SX431 +MWAC0_SX71 +MWAD0_SI1062 +MWAD0_SI1749 +MWAD0_SI2322 +MWAD0_SX162 +MWAD0_SX252 +MWAD0_SX342 +MWAD0_SX432 +MWAD0_SX72 +MWAR0_SI1045 +MWAR0_SI1675 +MWAR0_SI2305 +MWAR0_SX145 +MWAR0_SX235 +MWAR0_SX325 +MWAR0_SX415 +MWAR0_SX55 +MWCH0_SI1622 +MWCH0_SI1895 +MWCH0_SI2252 +MWCH0_SX182 +MWCH0_SX272 +MWCH0_SX362 +MWCH0_SX452 +MWCH0_SX92 +MWDK0_SI1436 +MWDK0_SI2017 +MWDK0_SI806 +MWDK0_SX176 +MWDK0_SX266 +MWDK0_SX356 +MWDK0_SX446 +MWDK0_SX86 +MWEM0_SI1320 +MWEM0_SI1393 +MWEM0_SI1950 +MWEM0_SX150 +MWEM0_SX240 +MWEM0_SX330 +MWEM0_SX420 +MWEM0_SX60 +MWGR0_SI1606 +MWGR0_SI2236 +MWGR0_SI976 +MWGR0_SX166 +MWGR0_SX256 +MWGR0_SX346 +MWGR0_SX436 +MWGR0_SX76 +MWRE0_SI1057 +MWRE0_SI1687 +MWRE0_SI2317 +MWRE0_SX157 +MWRE0_SX247 +MWRE0_SX337 +MWRE0_SX427 +MWRE0_SX67 +MWRP0_SI1443 +MWRP0_SI1525 +MWRP0_SI2073 +MWRP0_SX183 +MWRP0_SX273 +MWRP0_SX3 +MWRP0_SX363 +MWRP0_SX93 +MWSB0_SI1626 +MWSB0_SI2256 +MWSB0_SI996 +MWSB0_SX186 +MWSB0_SX276 +MWSB0_SX366 +MWSB0_SX6 +MWSB0_SX96 +MWSH0_SI1426 +MWSH0_SI2266 +MWSH0_SI796 +MWSH0_SX166 +MWSH0_SX256 +MWSH0_SX346 +MWSH0_SX436 +MWSH0_SX76 +MZMB0_SI1166 +MZMB0_SI1796 +MZMB0_SI536 +MZMB0_SX176 +MZMB0_SX266 +MZMB0_SX356 +MZMB0_SX446 +MZMB0_SX86 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/valid.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/valid.uid new file mode 100644 index 0000000..ab5ef38 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_matched/valid.uid @@ -0,0 +1,400 @@ +FADG0_SI1279 +FADG0_SI1909 +FADG0_SI649 +FADG0_SX109 +FADG0_SX19 +FADG0_SX199 +FADG0_SX289 +FADG0_SX379 +FAKS0_SI1573 +FAKS0_SI2203 +FAKS0_SI943 +FAKS0_SX133 +FAKS0_SX223 +FAKS0_SX313 +FAKS0_SX403 +FAKS0_SX43 +FCAL1_SI1403 +FCAL1_SI2033 +FCAL1_SI773 +FCAL1_SX143 +FCAL1_SX233 +FCAL1_SX323 +FCAL1_SX413 +FCAL1_SX53 +FCMH0_SI1454 +FCMH0_SI2084 +FCMH0_SI824 +FCMH0_SX104 +FCMH0_SX14 +FCMH0_SX194 +FCMH0_SX284 +FCMH0_SX374 +FDAC1_SI1474 +FDAC1_SI2104 +FDAC1_SI844 +FDAC1_SX124 +FDAC1_SX214 +FDAC1_SX304 +FDAC1_SX34 +FDAC1_SX394 +FDMS0_SI1218 +FDMS0_SI1502 +FDMS0_SI1848 +FDMS0_SX138 +FDMS0_SX228 +FDMS0_SX318 +FDMS0_SX408 +FDMS0_SX48 +FDRW0_SI1283 +FDRW0_SI1423 +FDRW0_SI653 +FDRW0_SX113 +FDRW0_SX203 +FDRW0_SX23 +FDRW0_SX293 +FDRW0_SX383 +FEDW0_SI1084 +FEDW0_SI1653 +FEDW0_SI1714 +FEDW0_SX184 +FEDW0_SX274 +FEDW0_SX364 +FEDW0_SX4 +FEDW0_SX94 +FGJD0_SI1179 +FGJD0_SI549 +FGJD0_SI818 +FGJD0_SX189 +FGJD0_SX279 +FGJD0_SX369 +FGJD0_SX9 +FGJD0_SX99 +FJEM0_SI1264 +FJEM0_SI1894 +FJEM0_SI634 +FJEM0_SX184 +FJEM0_SX274 +FJEM0_SX364 +FJEM0_SX4 +FJEM0_SX94 +FJMG0_SI1181 +FJMG0_SI1811 +FJMG0_SI551 +FJMG0_SX101 +FJMG0_SX11 +FJMG0_SX191 +FJMG0_SX281 +FJMG0_SX371 +FJSJ0_SI1484 +FJSJ0_SI2114 +FJSJ0_SI854 +FJSJ0_SX134 +FJSJ0_SX224 +FJSJ0_SX314 +FJSJ0_SX404 +FJSJ0_SX44 +FKMS0_SI1490 +FKMS0_SI2120 +FKMS0_SI860 +FKMS0_SX140 +FKMS0_SX230 +FKMS0_SX320 +FKMS0_SX410 +FKMS0_SX50 +FMAH0_SI1289 +FMAH0_SI1919 +FMAH0_SI659 +FMAH0_SX119 +FMAH0_SX209 +FMAH0_SX29 +FMAH0_SX299 +FMAH0_SX389 +FMML0_SI1040 +FMML0_SI1670 +FMML0_SI2300 +FMML0_SX140 +FMML0_SX230 +FMML0_SX320 +FMML0_SX410 +FMML0_SX50 +FNMR0_SI1399 +FNMR0_SI2029 +FNMR0_SI769 +FNMR0_SX139 +FNMR0_SX229 +FNMR0_SX319 +FNMR0_SX409 +FNMR0_SX49 +FREW0_SI1030 +FREW0_SI1280 +FREW0_SI1910 +FREW0_SX110 +FREW0_SX20 +FREW0_SX200 +FREW0_SX290 +FREW0_SX380 +FSEM0_SI1198 +FSEM0_SI1828 +FSEM0_SI568 +FSEM0_SX118 +FSEM0_SX208 +FSEM0_SX28 +FSEM0_SX298 +FSEM0_SX388 +MAJC0_SI1946 +MAJC0_SI2095 +MAJC0_SI835 +MAJC0_SX115 +MAJC0_SX205 +MAJC0_SX25 +MAJC0_SX295 +MAJC0_SX385 +MBDG0_SI1463 +MBDG0_SI2093 +MBDG0_SI833 +MBDG0_SX113 +MBDG0_SX203 +MBDG0_SX23 +MBDG0_SX293 +MBDG0_SX383 +MBNS0_SI1220 +MBNS0_SI1850 +MBNS0_SI590 +MBNS0_SX140 +MBNS0_SX230 +MBNS0_SX320 +MBNS0_SX410 +MBNS0_SX50 +MBWM0_SI1304 +MBWM0_SI1934 +MBWM0_SI674 +MBWM0_SX134 +MBWM0_SX224 +MBWM0_SX314 +MBWM0_SX404 +MBWM0_SX44 +MCSH0_SI1549 +MCSH0_SI2179 +MCSH0_SI919 +MCSH0_SX109 +MCSH0_SX19 +MCSH0_SX199 +MCSH0_SX289 +MCSH0_SX379 +MDLF0_SI1583 +MDLF0_SI2213 +MDLF0_SI953 +MDLF0_SX143 +MDLF0_SX233 +MDLF0_SX323 +MDLF0_SX413 +MDLF0_SX53 +MDLS0_SI1628 +MDLS0_SI2258 +MDLS0_SI998 +MDLS0_SX188 +MDLS0_SX278 +MDLS0_SX368 +MDLS0_SX8 +MDLS0_SX98 +MDVC0_SI2174 +MDVC0_SI2196 +MDVC0_SI936 +MDVC0_SX126 +MDVC0_SX216 +MDVC0_SX306 +MDVC0_SX36 +MDVC0_SX396 +MERS0_SI1019 +MERS0_SI1649 +MERS0_SI497 +MERS0_SX119 +MERS0_SX209 +MERS0_SX29 +MERS0_SX299 +MERS0_SX389 +MGJF0_SI1901 +MGJF0_SI641 +MGJF0_SI776 +MGJF0_SX101 +MGJF0_SX11 +MGJF0_SX191 +MGJF0_SX281 +MGJF0_SX371 +MGLB0_SI1534 +MGLB0_SI2164 +MGLB0_SI904 +MGLB0_SX184 +MGLB0_SX274 +MGLB0_SX364 +MGLB0_SX4 +MGLB0_SX94 +MGWT0_SI1539 +MGWT0_SI2169 +MGWT0_SI909 +MGWT0_SX189 +MGWT0_SX279 +MGWT0_SX369 +MGWT0_SX9 +MGWT0_SX99 +MJAR0_SI1988 +MJAR0_SI2247 +MJAR0_SI728 +MJAR0_SX188 +MJAR0_SX278 +MJAR0_SX368 +MJAR0_SX8 +MJAR0_SX98 +MJFC0_SI1033 +MJFC0_SI1663 +MJFC0_SI2293 +MJFC0_SX133 +MJFC0_SX223 +MJFC0_SX313 +MJFC0_SX403 +MJFC0_SX43 +MJSW0_SI1010 +MJSW0_SI1640 +MJSW0_SI2270 +MJSW0_SX110 +MJSW0_SX20 +MJSW0_SX200 +MJSW0_SX290 +MJSW0_SX380 +MMDB1_SI1625 +MMDB1_SI2255 +MMDB1_SI995 +MMDB1_SX185 +MMDB1_SX275 +MMDB1_SX365 +MMDB1_SX5 +MMDB1_SX95 +MMDM2_SI1452 +MMDM2_SI1555 +MMDM2_SI2082 +MMDM2_SX102 +MMDM2_SX12 +MMDM2_SX192 +MMDM2_SX282 +MMDM2_SX372 +MMJR0_SI1648 +MMJR0_SI2166 +MMJR0_SI2278 +MMJR0_SX118 +MMJR0_SX208 +MMJR0_SX28 +MMJR0_SX298 +MMJR0_SX388 +MMWH0_SI1089 +MMWH0_SI1301 +MMWH0_SI459 +MMWH0_SX189 +MMWH0_SX279 +MMWH0_SX369 +MMWH0_SX9 +MMWH0_SX99 +MPDF0_SI1542 +MPDF0_SI2172 +MPDF0_SI912 +MPDF0_SX102 +MPDF0_SX12 +MPDF0_SX192 +MPDF0_SX282 +MPDF0_SX372 +MRCS0_SI1223 +MRCS0_SI1853 +MRCS0_SI593 +MRCS0_SX143 +MRCS0_SX233 +MRCS0_SX323 +MRCS0_SX413 +MRCS0_SX53 +MREB0_SI1375 +MREB0_SI2005 +MREB0_SI745 +MREB0_SX115 +MREB0_SX205 +MREB0_SX25 +MREB0_SX295 +MREB0_SX385 +MRJM4_SI1489 +MRJM4_SI2119 +MRJM4_SI859 +MRJM4_SX139 +MRJM4_SX229 +MRJM4_SX319 +MRJM4_SX409 +MRJM4_SX49 +MRJR0_SI1182 +MRJR0_SI1812 +MRJR0_SI2313 +MRJR0_SX102 +MRJR0_SX12 +MRJR0_SX192 +MRJR0_SX282 +MRJR0_SX372 +MROA0_SI1307 +MROA0_SI1970 +MROA0_SI677 +MROA0_SX137 +MROA0_SX227 +MROA0_SX317 +MROA0_SX407 +MROA0_SX47 +MRTK0_SI1093 +MRTK0_SI1723 +MRTK0_SI1750 +MRTK0_SX103 +MRTK0_SX13 +MRTK0_SX193 +MRTK0_SX283 +MRTK0_SX373 +MRWS1_SI1130 +MRWS1_SI1496 +MRWS1_SI500 +MRWS1_SX140 +MRWS1_SX230 +MRWS1_SX320 +MRWS1_SX410 +MRWS1_SX50 +MTAA0_SI1285 +MTAA0_SI1915 +MTAA0_SI596 +MTAA0_SX115 +MTAA0_SX205 +MTAA0_SX25 +MTAA0_SX295 +MTAA0_SX385 +MTDT0_SI1994 +MTDT0_SI2254 +MTDT0_SI994 +MTDT0_SX184 +MTDT0_SX274 +MTDT0_SX364 +MTDT0_SX4 +MTDT0_SX94 +MTEB0_SI1133 +MTEB0_SI2064 +MTEB0_SI503 +MTEB0_SX143 +MTEB0_SX233 +MTEB0_SX323 +MTEB0_SX413 +MTEB0_SX53 +MTHC0_SI1015 +MTHC0_SI1645 +MTHC0_SI2275 +MTHC0_SX115 +MTHC0_SX205 +MTHC0_SX25 +MTHC0_SX295 +MTHC0_SX385 +MWJG0_SI1124 +MWJG0_SI1754 +MWJG0_SI494 +MWJG0_SX134 +MWJG0_SX224 +MWJG0_SX314 +MWJG0_SX404 +MWJG0_SX44 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/test.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/test.uid new file mode 100644 index 0000000..e3967e4 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/test.uid @@ -0,0 +1,1680 @@ +FADG0_SA1 +FADG0_SA2 +FADG0_SI1279 +FADG0_SI1909 +FADG0_SI649 +FADG0_SX109 +FADG0_SX19 +FADG0_SX199 +FADG0_SX289 +FADG0_SX379 +FAKS0_SA1 +FAKS0_SA2 +FAKS0_SI1573 +FAKS0_SI2203 +FAKS0_SI943 +FAKS0_SX133 +FAKS0_SX223 +FAKS0_SX313 +FAKS0_SX403 +FAKS0_SX43 +FASW0_SA1 +FASW0_SA2 +FASW0_SI1550 +FASW0_SI2180 +FASW0_SI920 +FASW0_SX110 +FASW0_SX20 +FASW0_SX200 +FASW0_SX290 +FASW0_SX380 +FAWF0_SA1 +FAWF0_SA2 +FAWF0_SI1000 +FAWF0_SI1630 +FAWF0_SI2260 +FAWF0_SX10 +FAWF0_SX100 +FAWF0_SX190 +FAWF0_SX280 +FAWF0_SX370 +FCAL1_SA1 +FCAL1_SA2 +FCAL1_SI1403 +FCAL1_SI2033 +FCAL1_SI773 +FCAL1_SX143 +FCAL1_SX233 +FCAL1_SX323 +FCAL1_SX413 +FCAL1_SX53 +FCAU0_SA1 +FCAU0_SA2 +FCAU0_SI1037 +FCAU0_SI1667 +FCAU0_SI2297 +FCAU0_SX137 +FCAU0_SX227 +FCAU0_SX317 +FCAU0_SX407 +FCAU0_SX47 +FCFT0_SA1 +FCFT0_SA2 +FCFT0_SI1178 +FCFT0_SI1808 +FCFT0_SI548 +FCFT0_SX188 +FCFT0_SX278 +FCFT0_SX368 +FCFT0_SX8 +FCFT0_SX98 +FCMH0_SA1 +FCMH0_SA2 +FCMH0_SI1454 +FCMH0_SI2084 +FCMH0_SI824 +FCMH0_SX104 +FCMH0_SX14 +FCMH0_SX194 +FCMH0_SX284 +FCMH0_SX374 +FCMH1_SA1 +FCMH1_SA2 +FCMH1_SI1493 +FCMH1_SI2123 +FCMH1_SI863 +FCMH1_SX143 +FCMH1_SX233 +FCMH1_SX323 +FCMH1_SX413 +FCMH1_SX53 +FCMR0_SA1 +FCMR0_SA2 +FCMR0_SI1105 +FCMR0_SI1735 +FCMR0_SI475 +FCMR0_SX115 +FCMR0_SX205 +FCMR0_SX25 +FCMR0_SX295 +FCMR0_SX385 +FCRH0_SA1 +FCRH0_SA2 +FCRH0_SI1088 +FCRH0_SI1718 +FCRH0_SI458 +FCRH0_SX188 +FCRH0_SX278 +FCRH0_SX368 +FCRH0_SX8 +FCRH0_SX98 +FDAC1_SA1 +FDAC1_SA2 +FDAC1_SI1474 +FDAC1_SI2104 +FDAC1_SI844 +FDAC1_SX124 +FDAC1_SX214 +FDAC1_SX304 +FDAC1_SX34 +FDAC1_SX394 +FDHC0_SA1 +FDHC0_SA2 +FDHC0_SI1559 +FDHC0_SI2189 +FDHC0_SI929 +FDHC0_SX119 +FDHC0_SX209 +FDHC0_SX29 +FDHC0_SX299 +FDHC0_SX389 +FDMS0_SA1 +FDMS0_SA2 +FDMS0_SI1218 +FDMS0_SI1502 +FDMS0_SI1848 +FDMS0_SX138 +FDMS0_SX228 +FDMS0_SX318 +FDMS0_SX408 +FDMS0_SX48 +FDRD1_SA1 +FDRD1_SA2 +FDRD1_SI1544 +FDRD1_SI1566 +FDRD1_SI2149 +FDRD1_SX104 +FDRD1_SX14 +FDRD1_SX194 +FDRD1_SX284 +FDRD1_SX374 +FDRW0_SA1 +FDRW0_SA2 +FDRW0_SI1283 +FDRW0_SI1423 +FDRW0_SI653 +FDRW0_SX113 +FDRW0_SX203 +FDRW0_SX23 +FDRW0_SX293 +FDRW0_SX383 +FEDW0_SA1 +FEDW0_SA2 +FEDW0_SI1084 +FEDW0_SI1653 +FEDW0_SI1714 +FEDW0_SX184 +FEDW0_SX274 +FEDW0_SX364 +FEDW0_SX4 +FEDW0_SX94 +FELC0_SA1 +FELC0_SA2 +FELC0_SI1386 +FELC0_SI2016 +FELC0_SI756 +FELC0_SX126 +FELC0_SX216 +FELC0_SX306 +FELC0_SX36 +FELC0_SX396 +FGJD0_SA1 +FGJD0_SA2 +FGJD0_SI1179 +FGJD0_SI549 +FGJD0_SI818 +FGJD0_SX189 +FGJD0_SX279 +FGJD0_SX369 +FGJD0_SX9 +FGJD0_SX99 +FGMD0_SA1 +FGMD0_SA2 +FGMD0_SI1943 +FGMD0_SI2107 +FGMD0_SI683 +FGMD0_SX143 +FGMD0_SX233 +FGMD0_SX323 +FGMD0_SX413 +FGMD0_SX53 +FGWR0_SA1 +FGWR0_SA2 +FGWR0_SI1578 +FGWR0_SI2208 +FGWR0_SI948 +FGWR0_SX138 +FGWR0_SX228 +FGWR0_SX318 +FGWR0_SX408 +FGWR0_SX48 +FHES0_SA1 +FHES0_SA2 +FHES0_SI1109 +FHES0_SI1739 +FHES0_SI479 +FHES0_SX119 +FHES0_SX209 +FHES0_SX29 +FHES0_SX299 +FHES0_SX389 +FHEW0_SA1 +FHEW0_SA2 +FHEW0_SI2023 +FHEW0_SI690 +FHEW0_SI763 +FHEW0_SX133 +FHEW0_SX223 +FHEW0_SX313 +FHEW0_SX403 +FHEW0_SX43 +FISB0_SA1 +FISB0_SA2 +FISB0_SI1579 +FISB0_SI2209 +FISB0_SI949 +FISB0_SX139 +FISB0_SX229 +FISB0_SX319 +FISB0_SX409 +FISB0_SX49 +FJAS0_SA1 +FJAS0_SA2 +FJAS0_SI1400 +FJAS0_SI2030 +FJAS0_SI770 +FJAS0_SX140 +FJAS0_SX230 +FJAS0_SX320 +FJAS0_SX410 +FJAS0_SX50 +FJCS0_SA1 +FJCS0_SA2 +FJCS0_SI1309 +FJCS0_SI1833 +FJCS0_SI1939 +FJCS0_SX139 +FJCS0_SX229 +FJCS0_SX319 +FJCS0_SX409 +FJCS0_SX49 +FJEM0_SA1 +FJEM0_SA2 +FJEM0_SI1264 +FJEM0_SI1894 +FJEM0_SI634 +FJEM0_SX184 +FJEM0_SX274 +FJEM0_SX364 +FJEM0_SX4 +FJEM0_SX94 +FJLM0_SA1 +FJLM0_SA2 +FJLM0_SI1043 +FJLM0_SI1673 +FJLM0_SI2303 +FJLM0_SX143 +FJLM0_SX233 +FJLM0_SX323 +FJLM0_SX413 +FJLM0_SX53 +FJMG0_SA1 +FJMG0_SA2 +FJMG0_SI1181 +FJMG0_SI1811 +FJMG0_SI551 +FJMG0_SX101 +FJMG0_SX11 +FJMG0_SX191 +FJMG0_SX281 +FJMG0_SX371 +FJRE0_SA1 +FJRE0_SA2 +FJRE0_SI1116 +FJRE0_SI1587 +FJRE0_SI1746 +FJRE0_SX126 +FJRE0_SX216 +FJRE0_SX306 +FJRE0_SX36 +FJRE0_SX396 +FJSA0_SA1 +FJSA0_SA2 +FJSA0_SI1379 +FJSA0_SI2009 +FJSA0_SI749 +FJSA0_SX119 +FJSA0_SX209 +FJSA0_SX29 +FJSA0_SX299 +FJSA0_SX389 +FJSJ0_SA1 +FJSJ0_SA2 +FJSJ0_SI1484 +FJSJ0_SI2114 +FJSJ0_SI854 +FJSJ0_SX134 +FJSJ0_SX224 +FJSJ0_SX314 +FJSJ0_SX404 +FJSJ0_SX44 +FJWB0_SA1 +FJWB0_SA2 +FJWB0_SI1265 +FJWB0_SI635 +FJWB0_SI992 +FJWB0_SX185 +FJWB0_SX275 +FJWB0_SX365 +FJWB0_SX5 +FJWB0_SX95 +FKMS0_SA1 +FKMS0_SA2 +FKMS0_SI1490 +FKMS0_SI2120 +FKMS0_SI860 +FKMS0_SX140 +FKMS0_SX230 +FKMS0_SX320 +FKMS0_SX410 +FKMS0_SX50 +FLAS0_SA1 +FLAS0_SA2 +FLAS0_SI1026 +FLAS0_SI1488 +FLAS0_SI858 +FLAS0_SX138 +FLAS0_SX228 +FLAS0_SX318 +FLAS0_SX408 +FLAS0_SX48 +FLBW0_SA1 +FLBW0_SA2 +FLBW0_SI1219 +FLBW0_SI1849 +FLBW0_SI2253 +FLBW0_SX139 +FLBW0_SX229 +FLBW0_SX319 +FLBW0_SX409 +FLBW0_SX49 +FLKD0_SA1 +FLKD0_SA2 +FLKD0_SI1369 +FLKD0_SI739 +FLKD0_SI894 +FLKD0_SX109 +FLKD0_SX19 +FLKD0_SX199 +FLKD0_SX289 +FLKD0_SX379 +FLNH0_SA1 +FLNH0_SA2 +FLNH0_SI1214 +FLNH0_SI584 +FLNH0_SI941 +FLNH0_SX134 +FLNH0_SX224 +FLNH0_SX314 +FLNH0_SX404 +FLNH0_SX44 +FMAF0_SA1 +FMAF0_SA2 +FMAF0_SI1459 +FMAF0_SI2089 +FMAF0_SI829 +FMAF0_SX109 +FMAF0_SX19 +FMAF0_SX199 +FMAF0_SX289 +FMAF0_SX379 +FMAH0_SA1 +FMAH0_SA2 +FMAH0_SI1289 +FMAH0_SI1919 +FMAH0_SI659 +FMAH0_SX119 +FMAH0_SX209 +FMAH0_SX29 +FMAH0_SX299 +FMAH0_SX389 +FMCM0_SA1 +FMCM0_SA2 +FMCM0_SI1180 +FMCM0_SI1810 +FMCM0_SI550 +FMCM0_SX10 +FMCM0_SX100 +FMCM0_SX190 +FMCM0_SX280 +FMCM0_SX370 +FMGD0_SA1 +FMGD0_SA2 +FMGD0_SI1564 +FMGD0_SI2194 +FMGD0_SI934 +FMGD0_SX124 +FMGD0_SX214 +FMGD0_SX304 +FMGD0_SX34 +FMGD0_SX394 +FMLD0_SA1 +FMLD0_SA2 +FMLD0_SI2185 +FMLD0_SI822 +FMLD0_SI925 +FMLD0_SX115 +FMLD0_SX205 +FMLD0_SX25 +FMLD0_SX295 +FMLD0_SX385 +FMML0_SA1 +FMML0_SA2 +FMML0_SI1040 +FMML0_SI1670 +FMML0_SI2300 +FMML0_SX140 +FMML0_SX230 +FMML0_SX320 +FMML0_SX410 +FMML0_SX50 +FNLP0_SA1 +FNLP0_SA2 +FNLP0_SI1308 +FNLP0_SI1938 +FNLP0_SI678 +FNLP0_SX138 +FNLP0_SX228 +FNLP0_SX318 +FNLP0_SX408 +FNLP0_SX48 +FNMR0_SA1 +FNMR0_SA2 +FNMR0_SI1399 +FNMR0_SI2029 +FNMR0_SI769 +FNMR0_SX139 +FNMR0_SX229 +FNMR0_SX319 +FNMR0_SX409 +FNMR0_SX49 +FPAS0_SA1 +FPAS0_SA2 +FPAS0_SI1272 +FPAS0_SI2204 +FPAS0_SI944 +FPAS0_SX134 +FPAS0_SX224 +FPAS0_SX314 +FPAS0_SX404 +FPAS0_SX44 +FPKT0_SA1 +FPKT0_SA2 +FPKT0_SI1538 +FPKT0_SI2168 +FPKT0_SI908 +FPKT0_SX188 +FPKT0_SX278 +FPKT0_SX368 +FPKT0_SX8 +FPKT0_SX98 +FRAM1_SA1 +FRAM1_SA2 +FRAM1_SI1360 +FRAM1_SI522 +FRAM1_SI730 +FRAM1_SX10 +FRAM1_SX100 +FRAM1_SX190 +FRAM1_SX280 +FRAM1_SX370 +FREW0_SA1 +FREW0_SA2 +FREW0_SI1030 +FREW0_SI1280 +FREW0_SI1910 +FREW0_SX110 +FREW0_SX20 +FREW0_SX200 +FREW0_SX290 +FREW0_SX380 +FRNG0_SA1 +FRNG0_SA2 +FRNG0_SI1355 +FRNG0_SI1985 +FRNG0_SI725 +FRNG0_SX185 +FRNG0_SX275 +FRNG0_SX365 +FRNG0_SX5 +FRNG0_SX95 +FSEM0_SA1 +FSEM0_SA2 +FSEM0_SI1198 +FSEM0_SI1828 +FSEM0_SI568 +FSEM0_SX118 +FSEM0_SX208 +FSEM0_SX28 +FSEM0_SX298 +FSEM0_SX388 +FSLB1_SA1 +FSLB1_SA2 +FSLB1_SI1904 +FSLB1_SI644 +FSLB1_SI891 +FSLB1_SX104 +FSLB1_SX14 +FSLB1_SX194 +FSLB1_SX284 +FSLB1_SX374 +FSXA0_SA1 +FSXA0_SA2 +FSXA0_SI1108 +FSXA0_SI1846 +FSXA0_SI478 +FSXA0_SX118 +FSXA0_SX208 +FSXA0_SX28 +FSXA0_SX298 +FSXA0_SX388 +FTLH0_SA1 +FTLH0_SA2 +FTLH0_SI1009 +FTLH0_SI1390 +FTLH0_SI1639 +FTLH0_SX109 +FTLH0_SX19 +FTLH0_SX199 +FTLH0_SX289 +FTLH0_SX379 +FUTB0_SA1 +FUTB0_SA2 +FUTB0_SI1204 +FUTB0_SI1330 +FUTB0_SI1834 +FUTB0_SX124 +FUTB0_SX214 +FUTB0_SX304 +FUTB0_SX34 +FUTB0_SX394 +MABW0_SA1 +MABW0_SA2 +MABW0_SI1230 +MABW0_SI1664 +MABW0_SI2294 +MABW0_SX134 +MABW0_SX224 +MABW0_SX314 +MABW0_SX404 +MABW0_SX44 +MAHH0_SA1 +MAHH0_SA2 +MAHH0_SI1294 +MAHH0_SI1924 +MAHH0_SI664 +MAHH0_SX124 +MAHH0_SX214 +MAHH0_SX304 +MAHH0_SX34 +MAHH0_SX394 +MAJC0_SA1 +MAJC0_SA2 +MAJC0_SI1946 +MAJC0_SI2095 +MAJC0_SI835 +MAJC0_SX115 +MAJC0_SX205 +MAJC0_SX25 +MAJC0_SX295 +MAJC0_SX385 +MBDG0_SA1 +MBDG0_SA2 +MBDG0_SI1463 +MBDG0_SI2093 +MBDG0_SI833 +MBDG0_SX113 +MBDG0_SX203 +MBDG0_SX23 +MBDG0_SX293 +MBDG0_SX383 +MBJK0_SA1 +MBJK0_SA2 +MBJK0_SI1175 +MBJK0_SI2128 +MBJK0_SI545 +MBJK0_SX185 +MBJK0_SX275 +MBJK0_SX365 +MBJK0_SX5 +MBJK0_SX95 +MBNS0_SA1 +MBNS0_SA2 +MBNS0_SI1220 +MBNS0_SI1850 +MBNS0_SI590 +MBNS0_SX140 +MBNS0_SX230 +MBNS0_SX320 +MBNS0_SX410 +MBNS0_SX50 +MBPM0_SA1 +MBPM0_SA2 +MBPM0_SI1577 +MBPM0_SI1584 +MBPM0_SI947 +MBPM0_SX137 +MBPM0_SX227 +MBPM0_SX317 +MBPM0_SX407 +MBPM0_SX47 +MBWM0_SA1 +MBWM0_SA2 +MBWM0_SI1304 +MBWM0_SI1934 +MBWM0_SI674 +MBWM0_SX134 +MBWM0_SX224 +MBWM0_SX314 +MBWM0_SX404 +MBWM0_SX44 +MCCS0_SA1 +MCCS0_SA2 +MCCS0_SI1469 +MCCS0_SI2099 +MCCS0_SI839 +MCCS0_SX119 +MCCS0_SX209 +MCCS0_SX29 +MCCS0_SX299 +MCCS0_SX389 +MCEM0_SA1 +MCEM0_SA2 +MCEM0_SI1398 +MCEM0_SI2028 +MCEM0_SI768 +MCEM0_SX138 +MCEM0_SX228 +MCEM0_SX318 +MCEM0_SX408 +MCEM0_SX48 +MCHH0_SA1 +MCHH0_SA2 +MCHH0_SI1004 +MCHH0_SI1634 +MCHH0_SI530 +MCHH0_SX104 +MCHH0_SX14 +MCHH0_SX194 +MCHH0_SX284 +MCHH0_SX374 +MCMB0_SA1 +MCMB0_SA2 +MCMB0_SI1268 +MCMB0_SI1898 +MCMB0_SI638 +MCMB0_SX188 +MCMB0_SX278 +MCMB0_SX368 +MCMB0_SX8 +MCMB0_SX98 +MCMJ0_SA1 +MCMJ0_SA2 +MCMJ0_SI1094 +MCMJ0_SI464 +MCMJ0_SI602 +MCMJ0_SX104 +MCMJ0_SX14 +MCMJ0_SX194 +MCMJ0_SX284 +MCMJ0_SX374 +MCRC0_SA1 +MCRC0_SA2 +MCRC0_SI1092 +MCRC0_SI1722 +MCRC0_SI462 +MCRC0_SX102 +MCRC0_SX12 +MCRC0_SX192 +MCRC0_SX282 +MCRC0_SX372 +MCSH0_SA1 +MCSH0_SA2 +MCSH0_SI1549 +MCSH0_SI2179 +MCSH0_SI919 +MCSH0_SX109 +MCSH0_SX19 +MCSH0_SX199 +MCSH0_SX289 +MCSH0_SX379 +MCTT0_SA1 +MCTT0_SA2 +MCTT0_SI1144 +MCTT0_SI2188 +MCTT0_SI928 +MCTT0_SX118 +MCTT0_SX208 +MCTT0_SX28 +MCTT0_SX298 +MCTT0_SX388 +MCTW0_SA1 +MCTW0_SA2 +MCTW0_SI1373 +MCTW0_SI2003 +MCTW0_SI743 +MCTW0_SX113 +MCTW0_SX203 +MCTW0_SX23 +MCTW0_SX293 +MCTW0_SX383 +MDAB0_SA1 +MDAB0_SA2 +MDAB0_SI1039 +MDAB0_SI1669 +MDAB0_SI2299 +MDAB0_SX139 +MDAB0_SX229 +MDAB0_SX319 +MDAB0_SX409 +MDAB0_SX49 +MDAC2_SA1 +MDAC2_SA2 +MDAC2_SI2259 +MDAC2_SI560 +MDAC2_SI999 +MDAC2_SX189 +MDAC2_SX279 +MDAC2_SX369 +MDAC2_SX9 +MDAC2_SX99 +MDAW1_SA1 +MDAW1_SA2 +MDAW1_SI1453 +MDAW1_SI2083 +MDAW1_SI823 +MDAW1_SX103 +MDAW1_SX13 +MDAW1_SX193 +MDAW1_SX283 +MDAW1_SX373 +MDBB0_SA1 +MDBB0_SA2 +MDBB0_SI1195 +MDBB0_SI1825 +MDBB0_SI565 +MDBB0_SX115 +MDBB0_SX205 +MDBB0_SX25 +MDBB0_SX295 +MDBB0_SX385 +MDLD0_SA1 +MDLD0_SA2 +MDLD0_SI1543 +MDLD0_SI2173 +MDLD0_SI913 +MDLD0_SX103 +MDLD0_SX13 +MDLD0_SX193 +MDLD0_SX283 +MDLD0_SX373 +MDLF0_SA1 +MDLF0_SA2 +MDLF0_SI1583 +MDLF0_SI2213 +MDLF0_SI953 +MDLF0_SX143 +MDLF0_SX233 +MDLF0_SX323 +MDLF0_SX413 +MDLF0_SX53 +MDLS0_SA1 +MDLS0_SA2 +MDLS0_SI1628 +MDLS0_SI2258 +MDLS0_SI998 +MDLS0_SX188 +MDLS0_SX278 +MDLS0_SX368 +MDLS0_SX8 +MDLS0_SX98 +MDRB0_SA1 +MDRB0_SA2 +MDRB0_SI1174 +MDRB0_SI2109 +MDRB0_SI544 +MDRB0_SX184 +MDRB0_SX274 +MDRB0_SX364 +MDRB0_SX4 +MDRB0_SX94 +MDRM0_SA1 +MDRM0_SA2 +MDRM0_SI1013 +MDRM0_SI1643 +MDRM0_SI2273 +MDRM0_SX113 +MDRM0_SX203 +MDRM0_SX23 +MDRM0_SX293 +MDRM0_SX383 +MDSC0_SA1 +MDSC0_SA2 +MDSC0_SI1038 +MDSC0_SI2298 +MDSC0_SI967 +MDSC0_SX138 +MDSC0_SX228 +MDSC0_SX318 +MDSC0_SX408 +MDSC0_SX48 +MDVC0_SA1 +MDVC0_SA2 +MDVC0_SI2174 +MDVC0_SI2196 +MDVC0_SI936 +MDVC0_SX126 +MDVC0_SX216 +MDVC0_SX306 +MDVC0_SX36 +MDVC0_SX396 +MDWA0_SA1 +MDWA0_SA2 +MDWA0_SI1146 +MDWA0_SI1445 +MDWA0_SI519 +MDWA0_SX185 +MDWA0_SX275 +MDWA0_SX365 +MDWA0_SX5 +MDWA0_SX95 +MDWK0_SA1 +MDWK0_SA2 +MDWK0_SI1540 +MDWK0_SI2170 +MDWK0_SI910 +MDWK0_SX10 +MDWK0_SX100 +MDWK0_SX190 +MDWK0_SX280 +MDWK0_SX370 +MERS0_SA1 +MERS0_SA2 +MERS0_SI1019 +MERS0_SI1649 +MERS0_SI497 +MERS0_SX119 +MERS0_SX209 +MERS0_SX29 +MERS0_SX299 +MERS0_SX389 +MESD0_SA1 +MESD0_SA2 +MESD0_SI1002 +MESD0_SI1632 +MESD0_SI2262 +MESD0_SX102 +MESD0_SX12 +MESD0_SX192 +MESD0_SX282 +MESD0_SX372 +MFGK0_SA1 +MFGK0_SA2 +MFGK0_SI1451 +MFGK0_SI1744 +MFGK0_SI484 +MFGK0_SX124 +MFGK0_SX214 +MFGK0_SX304 +MFGK0_SX34 +MFGK0_SX394 +MGJF0_SA1 +MGJF0_SA2 +MGJF0_SI1901 +MGJF0_SI641 +MGJF0_SI776 +MGJF0_SX101 +MGJF0_SX11 +MGJF0_SX191 +MGJF0_SX281 +MGJF0_SX371 +MGLB0_SA1 +MGLB0_SA2 +MGLB0_SI1534 +MGLB0_SI2164 +MGLB0_SI904 +MGLB0_SX184 +MGLB0_SX274 +MGLB0_SX364 +MGLB0_SX4 +MGLB0_SX94 +MGMM0_SA1 +MGMM0_SA2 +MGMM0_SI1129 +MGMM0_SI1759 +MGMM0_SI499 +MGMM0_SX139 +MGMM0_SX229 +MGMM0_SX319 +MGMM0_SX409 +MGMM0_SX49 +MGRT0_SA1 +MGRT0_SA2 +MGRT0_SI1450 +MGRT0_SI2080 +MGRT0_SI820 +MGRT0_SX10 +MGRT0_SX100 +MGRT0_SX190 +MGRT0_SX280 +MGRT0_SX370 +MGWT0_SA1 +MGWT0_SA2 +MGWT0_SI1539 +MGWT0_SI2169 +MGWT0_SI909 +MGWT0_SX189 +MGWT0_SX279 +MGWT0_SX369 +MGWT0_SX9 +MGWT0_SX99 +MHPG0_SA1 +MHPG0_SA2 +MHPG0_SI1090 +MHPG0_SI1720 +MHPG0_SI460 +MHPG0_SX10 +MHPG0_SX100 +MHPG0_SX190 +MHPG0_SX280 +MHPG0_SX370 +MJAR0_SA1 +MJAR0_SA2 +MJAR0_SI1988 +MJAR0_SI2247 +MJAR0_SI728 +MJAR0_SX188 +MJAR0_SX278 +MJAR0_SX368 +MJAR0_SX8 +MJAR0_SX98 +MJBR0_SA1 +MJBR0_SA2 +MJBR0_SI1001 +MJBR0_SI1631 +MJBR0_SI2261 +MJBR0_SX101 +MJBR0_SX11 +MJBR0_SX191 +MJBR0_SX281 +MJBR0_SX371 +MJDH0_SA1 +MJDH0_SA2 +MJDH0_SI1354 +MJDH0_SI1984 +MJDH0_SI724 +MJDH0_SX184 +MJDH0_SX274 +MJDH0_SX364 +MJDH0_SX4 +MJDH0_SX94 +MJDM1_SA1 +MJDM1_SA2 +MJDM1_SI1085 +MJDM1_SI1715 +MJDM1_SI455 +MJDM1_SX185 +MJDM1_SX275 +MJDM1_SX365 +MJDM1_SX5 +MJDM1_SX95 +MJES0_SA1 +MJES0_SA2 +MJES0_SI1384 +MJES0_SI2014 +MJES0_SI754 +MJES0_SX124 +MJES0_SX214 +MJES0_SX304 +MJES0_SX34 +MJES0_SX394 +MJFC0_SA1 +MJFC0_SA2 +MJFC0_SI1033 +MJFC0_SI1663 +MJFC0_SI2293 +MJFC0_SX133 +MJFC0_SX223 +MJFC0_SX313 +MJFC0_SX403 +MJFC0_SX43 +MJJG0_SA1 +MJJG0_SA2 +MJJG0_SI1003 +MJJG0_SI1633 +MJJG0_SI2263 +MJJG0_SX103 +MJJG0_SX13 +MJJG0_SX193 +MJJG0_SX283 +MJJG0_SX373 +MJLN0_SA1 +MJLN0_SA2 +MJLN0_SI1449 +MJLN0_SI2079 +MJLN0_SI819 +MJLN0_SX189 +MJLN0_SX279 +MJLN0_SX369 +MJLN0_SX9 +MJLN0_SX99 +MJMP0_SA1 +MJMP0_SA2 +MJMP0_SI1535 +MJMP0_SI1791 +MJMP0_SI905 +MJMP0_SX185 +MJMP0_SX275 +MJMP0_SX365 +MJMP0_SX5 +MJMP0_SX95 +MJRF0_SA1 +MJRF0_SA2 +MJRF0_SI1114 +MJRF0_SI2081 +MJRF0_SI821 +MJRF0_SX101 +MJRF0_SX11 +MJRF0_SX191 +MJRF0_SX281 +MJRF0_SX371 +MJSW0_SA1 +MJSW0_SA2 +MJSW0_SI1010 +MJSW0_SI1640 +MJSW0_SI2270 +MJSW0_SX110 +MJSW0_SX20 +MJSW0_SX200 +MJSW0_SX290 +MJSW0_SX380 +MJTC0_SA1 +MJTC0_SA2 +MJTC0_SI1460 +MJTC0_SI2090 +MJTC0_SI830 +MJTC0_SX110 +MJTC0_SX20 +MJTC0_SX200 +MJTC0_SX290 +MJTC0_SX380 +MJTH0_SA1 +MJTH0_SA2 +MJTH0_SI1296 +MJTH0_SI1926 +MJTH0_SI666 +MJTH0_SX126 +MJTH0_SX216 +MJTH0_SX306 +MJTH0_SX36 +MJTH0_SX396 +MJVW0_SA1 +MJVW0_SA2 +MJVW0_SI1733 +MJVW0_SI1758 +MJVW0_SI473 +MJVW0_SX113 +MJVW0_SX203 +MJVW0_SX23 +MJVW0_SX293 +MJVW0_SX383 +MKCH0_SA1 +MKCH0_SA2 +MKCH0_SI1378 +MKCH0_SI1425 +MKCH0_SI2008 +MKCH0_SX118 +MKCH0_SX208 +MKCH0_SX28 +MKCH0_SX298 +MKCH0_SX388 +MKCL0_SA1 +MKCL0_SA2 +MKCL0_SI1091 +MKCL0_SI1721 +MKCL0_SI461 +MKCL0_SX101 +MKCL0_SX11 +MKCL0_SX191 +MKCL0_SX281 +MKCL0_SX371 +MKDR0_SA1 +MKDR0_SA2 +MKDR0_SI1273 +MKDR0_SI1903 +MKDR0_SI643 +MKDR0_SX103 +MKDR0_SX13 +MKDR0_SX193 +MKDR0_SX283 +MKDR0_SX373 +MKJL0_SA1 +MKJL0_SA2 +MKJL0_SI1100 +MKJL0_SI1730 +MKJL0_SI470 +MKJL0_SX110 +MKJL0_SX20 +MKJL0_SX200 +MKJL0_SX290 +MKJL0_SX380 +MKLT0_SA1 +MKLT0_SA2 +MKLT0_SI1213 +MKLT0_SI1843 +MKLT0_SI583 +MKLT0_SX133 +MKLT0_SX223 +MKLT0_SX313 +MKLT0_SX403 +MKLT0_SX43 +MLIH0_SA1 +MLIH0_SA2 +MLIH0_SI1183 +MLIH0_SI1813 +MLIH0_SI553 +MLIH0_SX103 +MLIH0_SX13 +MLIH0_SX193 +MLIH0_SX283 +MLIH0_SX373 +MLJB0_SA1 +MLJB0_SA2 +MLJB0_SI1310 +MLJB0_SI1940 +MLJB0_SI680 +MLJB0_SX140 +MLJB0_SX230 +MLJB0_SX320 +MLJB0_SX410 +MLJB0_SX50 +MLLL0_SA1 +MLLL0_SA2 +MLLL0_SI1363 +MLLL0_SI1993 +MLLL0_SI733 +MLLL0_SX103 +MLLL0_SX13 +MLLL0_SX193 +MLLL0_SX283 +MLLL0_SX373 +MLNT0_SA1 +MLNT0_SA2 +MLNT0_SI1574 +MLNT0_SI1902 +MLNT0_SI642 +MLNT0_SX102 +MLNT0_SX12 +MLNT0_SX192 +MLNT0_SX282 +MLNT0_SX372 +MMAB0_SA1 +MMAB0_SA2 +MMAB0_SI1362 +MMAB0_SI1992 +MMAB0_SI732 +MMAB0_SX102 +MMAB0_SX12 +MMAB0_SX192 +MMAB0_SX282 +MMAB0_SX372 +MMDB1_SA1 +MMDB1_SA2 +MMDB1_SI1625 +MMDB1_SI2255 +MMDB1_SI995 +MMDB1_SX185 +MMDB1_SX275 +MMDB1_SX365 +MMDB1_SX5 +MMDB1_SX95 +MMDH0_SA1 +MMDH0_SA2 +MMDH0_SI1656 +MMDH0_SI2118 +MMDH0_SI2286 +MMDH0_SX126 +MMDH0_SX216 +MMDH0_SX306 +MMDH0_SX36 +MMDH0_SX396 +MMDM2_SA1 +MMDM2_SA2 +MMDM2_SI1452 +MMDM2_SI1555 +MMDM2_SI2082 +MMDM2_SX102 +MMDM2_SX12 +MMDM2_SX192 +MMDM2_SX282 +MMDM2_SX372 +MMJR0_SA1 +MMJR0_SA2 +MMJR0_SI1648 +MMJR0_SI2166 +MMJR0_SI2278 +MMJR0_SX118 +MMJR0_SX208 +MMJR0_SX28 +MMJR0_SX298 +MMJR0_SX388 +MMWH0_SA1 +MMWH0_SA2 +MMWH0_SI1089 +MMWH0_SI1301 +MMWH0_SI459 +MMWH0_SX189 +MMWH0_SX279 +MMWH0_SX369 +MMWH0_SX9 +MMWH0_SX99 +MNJM0_SA1 +MNJM0_SA2 +MNJM0_SI1580 +MNJM0_SI2210 +MNJM0_SI950 +MNJM0_SX140 +MNJM0_SX230 +MNJM0_SX320 +MNJM0_SX410 +MNJM0_SX50 +MNLS0_SA1 +MNLS0_SA2 +MNLS0_SI1483 +MNLS0_SI1610 +MNLS0_SI853 +MNLS0_SX133 +MNLS0_SX223 +MNLS0_SX313 +MNLS0_SX403 +MNLS0_SX43 +MPAB0_SA1 +MPAB0_SA2 +MPAB0_SI1103 +MPAB0_SI1128 +MPAB0_SI498 +MPAB0_SX138 +MPAB0_SX228 +MPAB0_SX318 +MPAB0_SX408 +MPAB0_SX48 +MPAM0_SA1 +MPAM0_SA2 +MPAM0_SI1189 +MPAM0_SI1819 +MPAM0_SI1961 +MPAM0_SX109 +MPAM0_SX19 +MPAM0_SX199 +MPAM0_SX289 +MPAM0_SX379 +MPAM1_SA1 +MPAM1_SA2 +MPAM1_SI1029 +MPAM1_SI1836 +MPAM1_SI576 +MPAM1_SX126 +MPAM1_SX216 +MPAM1_SX306 +MPAM1_SX36 +MPAM1_SX396 +MPCS0_SA1 +MPCS0_SA2 +MPCS0_SI1359 +MPCS0_SI1989 +MPCS0_SI729 +MPCS0_SX189 +MPCS0_SX279 +MPCS0_SX369 +MPCS0_SX9 +MPCS0_SX99 +MPDF0_SA1 +MPDF0_SA2 +MPDF0_SI1542 +MPDF0_SI2172 +MPDF0_SI912 +MPDF0_SX102 +MPDF0_SX12 +MPDF0_SX192 +MPDF0_SX282 +MPDF0_SX372 +MPGL0_SA1 +MPGL0_SA2 +MPGL0_SI1099 +MPGL0_SI1729 +MPGL0_SI469 +MPGL0_SX109 +MPGL0_SX19 +MPGL0_SX199 +MPGL0_SX289 +MPGL0_SX379 +MPLB0_SA1 +MPLB0_SA2 +MPLB0_SI1394 +MPLB0_SI2024 +MPLB0_SI764 +MPLB0_SX134 +MPLB0_SX224 +MPLB0_SX314 +MPLB0_SX404 +MPLB0_SX44 +MPWM0_SA1 +MPWM0_SA2 +MPWM0_SI1127 +MPWM0_SI1757 +MPWM0_SI2279 +MPWM0_SX137 +MPWM0_SX227 +MPWM0_SX317 +MPWM0_SX407 +MPWM0_SX47 +MRCS0_SA1 +MRCS0_SA2 +MRCS0_SI1223 +MRCS0_SI1853 +MRCS0_SI593 +MRCS0_SX143 +MRCS0_SX233 +MRCS0_SX323 +MRCS0_SX413 +MRCS0_SX53 +MRCZ0_SA1 +MRCZ0_SA2 +MRCZ0_SI1541 +MRCZ0_SI2171 +MRCZ0_SI911 +MRCZ0_SX101 +MRCZ0_SX11 +MRCZ0_SX191 +MRCZ0_SX281 +MRCZ0_SX371 +MREB0_SA1 +MREB0_SA2 +MREB0_SI1375 +MREB0_SI2005 +MREB0_SI745 +MREB0_SX115 +MREB0_SX205 +MREB0_SX25 +MREB0_SX295 +MREB0_SX385 +MRES0_SA1 +MRES0_SA2 +MRES0_SI1217 +MRES0_SI1847 +MRES0_SI587 +MRES0_SX137 +MRES0_SX227 +MRES0_SX317 +MRES0_SX407 +MRES0_SX47 +MRGG0_SA1 +MRGG0_SA2 +MRGG0_SI1199 +MRGG0_SI1829 +MRGG0_SI569 +MRGG0_SX119 +MRGG0_SX209 +MRGG0_SX29 +MRGG0_SX299 +MRGG0_SX389 +MRJM3_SA1 +MRJM3_SA2 +MRJM3_SI1448 +MRJM3_SI1809 +MRJM3_SI2078 +MRJM3_SX188 +MRJM3_SX278 +MRJM3_SX368 +MRJM3_SX8 +MRJM3_SX98 +MRJM4_SA1 +MRJM4_SA2 +MRJM4_SI1489 +MRJM4_SI2119 +MRJM4_SI859 +MRJM4_SX139 +MRJM4_SX229 +MRJM4_SX319 +MRJM4_SX409 +MRJM4_SX49 +MRJO0_SA1 +MRJO0_SA2 +MRJO0_SI1364 +MRJO0_SI1624 +MRJO0_SI734 +MRJO0_SX104 +MRJO0_SX14 +MRJO0_SX194 +MRJO0_SX284 +MRJO0_SX374 +MRJR0_SA1 +MRJR0_SA2 +MRJR0_SI1182 +MRJR0_SI1812 +MRJR0_SI2313 +MRJR0_SX102 +MRJR0_SX12 +MRJR0_SX192 +MRJR0_SX282 +MRJR0_SX372 +MRJS0_SA1 +MRJS0_SA2 +MRJS0_SI1444 +MRJS0_SI1523 +MRJS0_SI2074 +MRJS0_SX184 +MRJS0_SX274 +MRJS0_SX364 +MRJS0_SX4 +MRJS0_SX94 +MRKO0_SA1 +MRKO0_SA2 +MRKO0_SI1397 +MRKO0_SI2027 +MRKO0_SI767 +MRKO0_SX137 +MRKO0_SX227 +MRKO0_SX317 +MRKO0_SX407 +MRKO0_SX47 +MRMS1_SA1 +MRMS1_SA2 +MRMS1_SI1487 +MRMS1_SI2117 +MRMS1_SI857 +MRMS1_SX137 +MRMS1_SX227 +MRMS1_SX317 +MRMS1_SX407 +MRMS1_SX47 +MROA0_SA1 +MROA0_SA2 +MROA0_SI1307 +MROA0_SI1970 +MROA0_SI677 +MROA0_SX137 +MROA0_SX227 +MROA0_SX317 +MROA0_SX407 +MROA0_SX47 +MRPC0_SA1 +MRPC0_SA2 +MRPC0_SI1753 +MRPC0_SI493 +MRPC0_SI933 +MRPC0_SX133 +MRPC0_SX223 +MRPC0_SX313 +MRPC0_SX403 +MRPC0_SX43 +MRPP0_SA1 +MRPP0_SA2 +MRPP0_SI1184 +MRPP0_SI1814 +MRPP0_SI554 +MRPP0_SX104 +MRPP0_SX14 +MRPP0_SX194 +MRPP0_SX284 +MRPP0_SX374 +MRRK0_SA1 +MRRK0_SA2 +MRRK0_SI1288 +MRRK0_SI1716 +MRRK0_SI1918 +MRRK0_SX118 +MRRK0_SX208 +MRRK0_SX28 +MRRK0_SX298 +MRRK0_SX388 +MRTK0_SA1 +MRTK0_SA2 +MRTK0_SI1093 +MRTK0_SI1723 +MRTK0_SI1750 +MRTK0_SX103 +MRTK0_SX13 +MRTK0_SX193 +MRTK0_SX283 +MRTK0_SX373 +MRWS1_SA1 +MRWS1_SA2 +MRWS1_SI1130 +MRWS1_SI1496 +MRWS1_SI500 +MRWS1_SX140 +MRWS1_SX230 +MRWS1_SX320 +MRWS1_SX410 +MRWS1_SX50 +MSFH1_SA1 +MSFH1_SA2 +MSFH1_SI1270 +MSFH1_SI1900 +MSFH1_SI640 +MSFH1_SX10 +MSFH1_SX100 +MSFH1_SX190 +MSFH1_SX280 +MSFH1_SX370 +MSJS1_SA1 +MSJS1_SA2 +MSJS1_SI1899 +MSJS1_SI639 +MSJS1_SI869 +MSJS1_SX189 +MSJS1_SX279 +MSJS1_SX369 +MSJS1_SX9 +MSJS1_SX99 +MSLB0_SA1 +MSLB0_SA2 +MSLB0_SI1193 +MSLB0_SI1823 +MSLB0_SI563 +MSLB0_SX113 +MSLB0_SX203 +MSLB0_SX23 +MSLB0_SX293 +MSLB0_SX383 +MSTK0_SA1 +MSTK0_SA2 +MSTK0_SI1024 +MSTK0_SI2222 +MSTK0_SI2284 +MSTK0_SX124 +MSTK0_SX214 +MSTK0_SX304 +MSTK0_SX34 +MSTK0_SX394 +MTAA0_SA1 +MTAA0_SA2 +MTAA0_SI1285 +MTAA0_SI1915 +MTAA0_SI596 +MTAA0_SX115 +MTAA0_SX205 +MTAA0_SX25 +MTAA0_SX295 +MTAA0_SX385 +MTAS1_SA1 +MTAS1_SA2 +MTAS1_SI1473 +MTAS1_SI2098 +MTAS1_SI838 +MTAS1_SX118 +MTAS1_SX208 +MTAS1_SX28 +MTAS1_SX298 +MTAS1_SX388 +MTDT0_SA1 +MTDT0_SA2 +MTDT0_SI1994 +MTDT0_SI2254 +MTDT0_SI994 +MTDT0_SX184 +MTDT0_SX274 +MTDT0_SX364 +MTDT0_SX4 +MTDT0_SX94 +MTEB0_SA1 +MTEB0_SA2 +MTEB0_SI1133 +MTEB0_SI2064 +MTEB0_SI503 +MTEB0_SX143 +MTEB0_SX233 +MTEB0_SX323 +MTEB0_SX413 +MTEB0_SX53 +MTHC0_SA1 +MTHC0_SA2 +MTHC0_SI1015 +MTHC0_SI1645 +MTHC0_SI2275 +MTHC0_SX115 +MTHC0_SX205 +MTHC0_SX25 +MTHC0_SX295 +MTHC0_SX385 +MTLS0_SA1 +MTLS0_SA2 +MTLS0_SI1370 +MTLS0_SI2000 +MTLS0_SI740 +MTLS0_SX110 +MTLS0_SX20 +MTLS0_SX200 +MTLS0_SX290 +MTLS0_SX380 +MTMR0_SA1 +MTMR0_SA2 +MTMR0_SI1303 +MTMR0_SI1933 +MTMR0_SI673 +MTMR0_SX133 +MTMR0_SX223 +MTMR0_SX313 +MTMR0_SX403 +MTMR0_SX43 +MTWH0_SA1 +MTWH0_SA2 +MTWH0_SI1190 +MTWH0_SI1629 +MTWH0_SI1820 +MTWH0_SX110 +MTWH0_SX20 +MTWH0_SX200 +MTWH0_SX290 +MTWH0_SX380 +MWBT0_SA1 +MWBT0_SA2 +MWBT0_SI1553 +MWBT0_SI2183 +MWBT0_SI923 +MWBT0_SX113 +MWBT0_SX203 +MWBT0_SX23 +MWBT0_SX293 +MWBT0_SX383 +MWEW0_SA1 +MWEW0_SA2 +MWEW0_SI1361 +MWEW0_SI1991 +MWEW0_SI731 +MWEW0_SX101 +MWEW0_SX11 +MWEW0_SX191 +MWEW0_SX281 +MWEW0_SX371 +MWJG0_SA1 +MWJG0_SA2 +MWJG0_SI1124 +MWJG0_SI1754 +MWJG0_SI494 +MWJG0_SX134 +MWJG0_SX224 +MWJG0_SX314 +MWJG0_SX404 +MWJG0_SX44 +MWVW0_SA1 +MWVW0_SA2 +MWVW0_SI1476 +MWVW0_SI2106 +MWVW0_SI846 +MWVW0_SX126 +MWVW0_SX216 +MWVW0_SX306 +MWVW0_SX36 +MWVW0_SX396 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train.uid new file mode 100644 index 0000000..35b02e7 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train.uid @@ -0,0 +1,3000 @@ +FAEM0_SA1 +FAEM0_SA2 +FAEM0_SI2022 +FAEM0_SX132 +FAEM0_SX222 +FAEM0_SX312 +FAEM0_SX402 +FAJW0_SA2 +FAJW0_SI1893 +FAJW0_SX183 +FAJW0_SX273 +FAJW0_SX363 +FALK0_SA1 +FALK0_SA2 +FALK0_SI1086 +FALK0_SI456 +FALK0_SX276 +FALK0_SX366 +FALK0_SX96 +FALR0_SA1 +FALR0_SA2 +FALR0_SI1955 +FALR0_SI695 +FALR0_SX155 +FALR0_SX245 +FALR0_SX425 +FALR0_SX65 +FAPB0_SA1 +FAPB0_SA2 +FAPB0_SI1693 +FAPB0_SX163 +FAPB0_SX253 +FAPB0_SX343 +FAPB0_SX73 +FBAS0_SA2 +FBAS0_SI1387 +FBAS0_SX127 +FBAS0_SX307 +FBAS0_SX37 +FBAS0_SX397 +FBCG1_SA2 +FBCG1_SI1612 +FBCG1_SI2242 +FBCG1_SI982 +FBCG1_SX262 +FBCG1_SX82 +FBCH0_SA1 +FBCH0_SA2 +FBCH0_SI1586 +FBCH0_SI956 +FBCH0_SX146 +FBCH0_SX326 +FBCH0_SX56 +FBJL0_SA1 +FBJL0_SA2 +FBJL0_SI1552 +FBJL0_SI2182 +FBJL0_SX112 +FBJL0_SX202 +FBJL0_SX22 +FBJL0_SX292 +FBJL0_SX382 +FBLV0_SA2 +FBLV0_SI2318 +FBLV0_SX158 +FBLV0_SX248 +FBLV0_SX428 +FBMH0_SA2 +FBMH0_SI1766 +FBMH0_SX146 +FBMH0_SX236 +FBMH0_SX326 +FBMH0_SX416 +FBMH0_SX56 +FBMJ0_SA2 +FBMJ0_SX156 +FBMJ0_SX246 +FBMJ0_SX426 +FBMJ0_SX66 +FCAG0_SA2 +FCAG0_SI1503 +FCAG0_SI1641 +FCAG0_SI2133 +FCAG0_SX333 +FCAG0_SX423 +FCAG0_SX63 +FCAJ0_SA1 +FCAJ0_SA2 +FCAJ0_SI1804 +FCAJ0_SI849 +FCAJ0_SX129 +FCAJ0_SX219 +FCAJ0_SX39 +FCAJ0_SX399 +FCDR1_SA1 +FCDR1_SA2 +FCDR1_SX16 +FCDR1_SX376 +FCEG0_SA1 +FCEG0_SI1248 +FCEG0_SI1878 +FCEG0_SI618 +FCEG0_SX168 +FCEG0_SX258 +FCEG0_SX348 +FCEG0_SX438 +FCEG0_SX78 +FCJF0_SA2 +FCJF0_SI1027 +FCJF0_SI1657 +FCJF0_SI648 +FCJF0_SX217 +FCJF0_SX307 +FCJF0_SX37 +FCJF0_SX397 +FCJS0_SA1 +FCJS0_SA2 +FCJS0_SI977 +FCJS0_SX167 +FCJS0_SX347 +FCJS0_SX437 +FCJS0_SX77 +FCKE0_SA1 +FCKE0_SI1111 +FCKE0_SX211 +FCKE0_SX301 +FCKE0_SX31 +FCKE0_SX391 +FCLT0_SA1 +FCLT0_SA2 +FCLT0_SI1438 +FCLT0_SX178 +FCLT0_SX268 +FCLT0_SX358 +FCMG0_SA1 +FCMG0_SI1242 +FCMG0_SX162 +FCMG0_SX252 +FCMG0_SX342 +FCMM0_SI1083 +FCMM0_SI453 +FCMM0_SX273 +FCMM0_SX363 +FCMM0_SX93 +FCRZ0_SA1 +FCRZ0_SA2 +FCRZ0_SI1913 +FCRZ0_SI793 +FCRZ0_SX163 +FCRZ0_SX253 +FCRZ0_SX343 +FCRZ0_SX73 +FCYL0_SA2 +FCYL0_SI1297 +FCYL0_SI1927 +FCYL0_SX127 +FCYL0_SX217 +FCYL0_SX397 +FDAS1_SA1 +FDAS1_SA2 +FDAS1_SX111 +FDAS1_SX21 +FDAS1_SX291 +FDAW0_SA1 +FDAW0_SA2 +FDAW0_SX146 +FDAW0_SX236 +FDAW0_SX326 +FDAW0_SX416 +FDAW0_SX56 +FDFB0_SI1318 +FDFB0_SI1948 +FDFB0_SX148 +FDFB0_SX238 +FDFB0_SX328 +FDFB0_SX418 +FDJH0_SA1 +FDJH0_SA2 +FDJH0_SI1565 +FDJH0_SI2195 +FDJH0_SX125 +FDJH0_SX215 +FDJH0_SX35 +FDJH0_SX395 +FDKN0_SA1 +FDKN0_SA2 +FDKN0_SI1081 +FDKN0_SI1711 +FDKN0_SX271 +FDKN0_SX361 +FDKN0_SX91 +FDML0_SA1 +FDML0_SI1149 +FDML0_SI1779 +FDML0_SI2075 +FDML0_SX339 +FDML0_SX69 +FDMY0_SI1197 +FDMY0_SX117 +FDMY0_SX207 +FDMY0_SX297 +FDNC0_SA1 +FDNC0_SA2 +FDNC0_SI2287 +FDNC0_SX108 +FDNC0_SX18 +FDNC0_SX378 +FDTD0_SA2 +FDTD0_SI1561 +FDTD0_SI2191 +FDTD0_SI931 +FDTD0_SX121 +FDTD0_SX301 +FDTD0_SX391 +FDXW0_SA2 +FDXW0_SI1511 +FDXW0_SI2141 +FDXW0_SI881 +FDXW0_SX161 +FDXW0_SX431 +FEAC0_SA1 +FEAC0_SA2 +FEAC0_SI1245 +FEAC0_SI1875 +FEAC0_SX255 +FEAC0_SX345 +FEAC0_SX435 +FEAR0_SA1 +FEAR0_SA2 +FEAR0_SI1252 +FEAR0_SI1882 +FEAR0_SX172 +FEAR0_SX262 +FEAR0_SX442 +FEAR0_SX82 +FECD0_SA2 +FECD0_SI2048 +FECD0_SX158 +FECD0_SX248 +FECD0_SX338 +FECD0_SX428 +FEEH0_SA2 +FEEH0_SI1112 +FEEH0_SX212 +FEEH0_SX302 +FEEH0_SX32 +FEEH0_SX392 +FEME0_SA2 +FEME0_SI1505 +FEME0_SI2135 +FEME0_SX245 +FEME0_SX425 +FETB0_SA2 +FETB0_SI1778 +FETB0_SI518 +FETB0_SX248 +FETB0_SX338 +FETB0_SX428 +FETB0_SX68 +FEXM0_SA2 +FEXM0_SI1731 +FEXM0_SX111 +FEXM0_SX201 +FEXM0_SX291 +FEXM0_SX381 +FGCS0_SA1 +FGCS0_SA2 +FGCS0_SI1486 +FGCS0_SI2116 +FGCS0_SI856 +FGCS0_SX46 +FGDP0_SA2 +FGDP0_SI1618 +FGDP0_SI2248 +FGDP0_SX178 +FGDP0_SX268 +FGDP0_SX358 +FGDP0_SX448 +FGMB0_SA1 +FGMB0_SA2 +FGMB0_SI515 +FGMB0_SX155 +FGMB0_SX425 +FGMB0_SX65 +FGRW0_SA2 +FGRW0_SI1782 +FGRW0_SI1990 +FGRW0_SX252 +FGRW0_SX342 +FGRW0_SX72 +FHLM0_SA1 +FHLM0_SA2 +FHLM0_SI1560 +FHLM0_SI2190 +FHLM0_SI930 +FHLM0_SX210 +FHLM0_SX300 +FHXS0_SI2335 +FHXS0_SX265 +FHXS0_SX355 +FHXS0_SX85 +FJDM2_SI1582 +FJDM2_SI1964 +FJDM2_SI2212 +FJDM2_SX322 +FJDM2_SX412 +FJEN0_SA2 +FJEN0_SI1047 +FJEN0_SI1677 +FJEN0_SI2307 +FJEN0_SX147 +FJEN0_SX237 +FJEN0_SX57 +FJHK0_SA1 +FJHK0_SA2 +FJHK0_SI1022 +FJHK0_SI1652 +FJHK0_SX122 +FJHK0_SX212 +FJHK0_SX32 +FJHK0_SX392 +FJKL0_SA1 +FJKL0_SA2 +FJKL0_SI1562 +FJKL0_SI2192 +FJKL0_SX122 +FJKL0_SX302 +FJKL0_SX32 +FJLG0_SA1 +FJLG0_SA2 +FJLG0_SI1506 +FJLG0_SX179 +FJLG0_SX269 +FJLG0_SX359 +FJLG0_SX449 +FJLG0_SX89 +FJLR0_SA2 +FJLR0_SI1861 +FJLR0_SI601 +FJLR0_SX151 +FJLR0_SX241 +FJLR0_SX331 +FJLR0_SX421 +FJLR0_SX61 +FJRB0_SA1 +FJRB0_SA2 +FJRB0_SI1302 +FJRB0_SI1932 +FJRB0_SI672 +FJRB0_SX132 +FJRB0_SX222 +FJRB0_SX312 +FJRB0_SX42 +FJRP1_SA2 +FJRP1_SI802 +FJRP1_SX172 +FJRP1_SX442 +FJSK0_SA2 +FJSK0_SI1682 +FJSK0_SI2312 +FJSK0_SX152 +FJSK0_SX242 +FJSK0_SX332 +FJSK0_SX422 +FJSK0_SX62 +FJSP0_SA1 +FJSP0_SA2 +FJSP0_SI1763 +FJSP0_SI804 +FJSP0_SX174 +FJSP0_SX84 +FJWB1_SA2 +FJWB1_SI2055 +FJWB1_SI795 +FJWB1_SX165 +FJWB1_SX255 +FJWB1_SX75 +FJXM0_SA2 +FJXM0_SI1211 +FJXM0_SI1971 +FJXM0_SX131 +FJXM0_SX221 +FJXP0_SA2 +FJXP0_SI492 +FJXP0_SX222 +FJXP0_SX312 +FJXP0_SX402 +FJXP0_SX42 +FKAA0_SA2 +FKAA0_SI1208 +FKAA0_SI1838 +FKAA0_SI578 +FKAA0_SX218 +FKAA0_SX308 +FKAA0_SX38 +FKDE0_SA2 +FKDE0_SI2221 +FKDE0_SX331 +FKDW0_SA1 +FKDW0_SA2 +FKDW0_SI577 +FKDW0_SX127 +FKDW0_SX217 +FKDW0_SX307 +FKDW0_SX37 +FKFB0_SA1 +FKFB0_SI2238 +FKFB0_SI978 +FKFB0_SX168 +FKFB0_SX258 +FKKH0_SI660 +FKKH0_SX210 +FKKH0_SX30 +FKKH0_SX300 +FKLC0_SA1 +FKLC0_SA2 +FKLC0_SI1615 +FKLC0_SI2245 +FKLC0_SX265 +FKLC0_SX445 +FKLC0_SX85 +FKLC1_SA1 +FKLC1_SA2 +FKLC1_SI1678 +FKLC1_SX148 +FKLC1_SX58 +FKLH0_SA1 +FKLH0_SI1887 +FKLH0_SI627 +FKLH0_SX267 +FKLH0_SX357 +FKLH0_SX447 +FKLH0_SX87 +FKSR0_SI1117 +FKSR0_SX161 +FKSR0_SX37 +FKSR0_SX397 +FLAC0_SA1 +FLAC0_SA2 +FLAC0_SI2161 +FLAC0_SI901 +FLAC0_SX181 +FLAC0_SX271 +FLAC0_SX361 +FLAC0_SX91 +FLAG0_SA1 +FLAG0_SI2094 +FLAG0_SX294 +FLEH0_SA1 +FLEH0_SA2 +FLEH0_SX151 +FLEH0_SX241 +FLEH0_SX421 +FLEH0_SX61 +FLET0_SA2 +FLET0_SI1137 +FLET0_SI1767 +FLET0_SX147 +FLET0_SX237 +FLET0_SX277 +FLET0_SX417 +FLET0_SX57 +FLHD0_SA1 +FLHD0_SA2 +FLHD0_SI1344 +FLHD0_SI1974 +FLHD0_SX174 +FLHD0_SX264 +FLHD0_SX444 +FLHD0_SX84 +FLJA0_SA2 +FLJA0_SI1708 +FLJA0_SX268 +FLJA0_SX358 +FLJA0_SX448 +FLJA0_SX88 +FLJD0_SA1 +FLJD0_SA2 +FLJD0_SI2146 +FLJD0_SX166 +FLJD0_SX256 +FLJD0_SX346 +FLJD0_SX436 +FLJG0_SA1 +FLJG0_SI1611 +FLJG0_SI2241 +FLJG0_SX261 +FLJG0_SX441 +FLJG0_SX81 +FLKM0_SI1880 +FLKM0_SX116 +FLMA0_SA2 +FLMA0_SI1243 +FLMA0_SI1873 +FLMA0_SX163 +FLMA0_SX253 +FLMA0_SX343 +FLMC0_SA1 +FLMC0_SA2 +FLMC0_SI2002 +FLMC0_SI742 +FLMC0_SX112 +FLMC0_SX292 +FLMC0_SX336 +FLMC0_SX382 +FLMK0_SA2 +FLMK0_SI2295 +FLMK0_SX135 +FLMK0_SX225 +FLMK0_SX45 +FLOD0_SA1 +FLOD0_SA2 +FLOD0_SI1287 +FLOD0_SI657 +FLOD0_SX207 +FLOD0_SX387 +FLTM0_SA2 +FLTM0_SI1700 +FLTM0_SX260 +FLTM0_SX80 +FMAH1_SA1 +FMAH1_SI1509 +FMAH1_SI2139 +FMAH1_SX249 +FMAH1_SX339 +FMAH1_SX429 +FMAH1_SX69 +FMBG0_SA1 +FMBG0_SI1790 +FMBG0_SX260 +FMBG0_SX3 +FMBG0_SX350 +FMBG0_SX440 +FMBG0_SX80 +FMEM0_SA2 +FMEM0_SI1377 +FMEM0_SI2007 +FMEM0_SX117 +FMEM0_SX207 +FMEM0_SX297 +FMJB0_SA1 +FMJB0_SA2 +FMJB0_SI1807 +FMJB0_SX187 +FMJB0_SX277 +FMJB0_SX367 +FMJB0_SX7 +FMJF0_SA1 +FMJF0_SI1254 +FMJF0_SI1884 +FMJF0_SX264 +FMJF0_SX354 +FMJF0_SX444 +FMJU0_SA1 +FMJU0_SA2 +FMJU0_SI2019 +FMJU0_SI759 +FMJU0_SX129 +FMJU0_SX219 +FMJU0_SX39 +FMKC0_SA1 +FMKC0_SA2 +FMKC0_SI1072 +FMKC0_SX172 +FMKC0_SX262 +FMKC0_SX352 +FMKF0_SA1 +FMKF0_SA2 +FMKF0_SI1536 +FMKF0_SI906 +FMKF0_SX276 +FMKF0_SX366 +FMKF0_SX6 +FMKF0_SX96 +FMMH0_SA1 +FMMH0_SA2 +FMMH0_SI1537 +FMMH0_SI2167 +FMMH0_SI907 +FMMH0_SX187 +FMMH0_SX367 +FMMH0_SX420 +FMMH0_SX7 +FMMH0_SX97 +FMPG0_SI1602 +FMPG0_SI2232 +FMPG0_SX252 +FMPG0_SX72 +FNKL0_SA1 +FNKL0_SA2 +FNKL0_SI2152 +FNKL0_SX172 +FNKL0_SX196 +FNKL0_SX262 +FNKL0_SX442 +FNKL0_SX82 +FNTB0_SA1 +FNTB0_SA2 +FNTB0_SX123 +FNTB0_SX213 +FNTB0_SX33 +FNTB0_SX393 +FPAB1_SA2 +FPAB1_SX121 +FPAB1_SX301 +FPAB1_SX31 +FPAB1_SX391 +FPAC0_SA1 +FPAC0_SI2011 +FPAC0_SX121 +FPAC0_SX211 +FPAC0_SX301 +FPAC0_SX31 +FPAC0_SX391 +FPAD0_SA1 +FPAD0_SI1346 +FPAD0_SI1976 +FPAD0_SX266 +FPAD0_SX446 +FPAF0_SI1684 +FPAF0_SI2314 +FPAF0_SX244 +FPAF0_SX334 +FPAF0_SX424 +FPAF0_SX64 +FPAZ0_SI1593 +FPAZ0_SX153 +FPAZ0_SX27 +FPAZ0_SX423 +FPAZ0_SX63 +FPJF0_SA2 +FPJF0_SI1046 +FPJF0_SI1676 +FPJF0_SX236 +FPJF0_SX326 +FPLS0_SA1 +FPLS0_SA2 +FPLS0_SI2220 +FPLS0_SX150 +FPLS0_SX240 +FPLS0_SX3 +FPLS0_SX60 +FPMY0_SA2 +FPMY0_SI1783 +FPMY0_SX163 +FPMY0_SX196 +FPMY0_SX253 +FPMY0_SX73 +FREH0_SI1315 +FREH0_SI685 +FREH0_SX145 +FREH0_SX235 +FREH0_SX325 +FREH0_SX55 +FRJB0_SA1 +FRJB0_SA2 +FRJB0_SI1427 +FRJB0_SI1470 +FRJB0_SI1794 +FRJB0_SX167 +FRJB0_SX257 +FRJB0_SX437 +FRJB0_SX77 +FRLL0_SA1 +FRLL0_SA2 +FRLL0_SI1514 +FRLL0_SI884 +FRLL0_SX164 +FRLL0_SX254 +FRLL0_SX344 +FRLL0_SX74 +FSAG0_SA2 +FSAG0_SI1953 +FSAG0_SI693 +FSAG0_SX63 +FSAH0_SI1244 +FSAH0_SI1874 +FSAH0_SX344 +FSAH0_SX74 +FSAK0_SA1 +FSAK0_SA2 +FSAK0_SI1930 +FSAK0_SI670 +FSAK0_SX130 +FSAK0_SX220 +FSAK0_SX310 +FSAK0_SX40 +FSAK0_SX400 +FSBK0_SA1 +FSBK0_SI1699 +FSBK0_SI2329 +FSBK0_SX259 +FSBK0_SX439 +FSBK0_SX79 +FSCN0_SI1886 +FSCN0_SX356 +FSDC0_SA1 +FSDC0_SI1942 +FSDC0_SI2234 +FSDC0_SX232 +FSDC0_SX412 +FSDJ0_SA1 +FSDJ0_SA2 +FSDJ0_SI1745 +FSDJ0_SX125 +FSDJ0_SX35 +FSGF0_SA1 +FSGF0_SA2 +FSGF0_SI1557 +FSGF0_SX207 +FSGF0_SX27 +FSGF0_SX297 +FSGF0_SX387 +FSJG0_SI1570 +FSJG0_SI2200 +FSJG0_SX310 +FSJK1_SA1 +FSJK1_SI1025 +FSJK1_SI2285 +FSJK1_SI696 +FSJK1_SX215 +FSJK1_SX305 +FSJK1_SX395 +FSJS0_SA2 +FSJS0_SI1171 +FSJS0_SI1801 +FSJS0_SI541 +FSJS0_SX271 +FSJS0_SX361 +FSJS0_SX91 +FSJW0_SA1 +FSJW0_SA2 +FSJW0_SI703 +FSJW0_SX163 +FSJW0_SX253 +FSJW0_SX343 +FSJW0_SX73 +FSKC0_SA1 +FSKC0_SA2 +FSKC0_SI2046 +FSKC0_SX156 +FSKC0_SX336 +FSKC0_SX426 +FSKC0_SX66 +FSKL0_SA1 +FSKL0_SA2 +FSKL0_SI2159 +FSKL0_SI899 +FSKL0_SX179 +FSKL0_SX269 +FSKL0_SX359 +FSKL0_SX89 +FSKP0_SA1 +FSKP0_SI1728 +FSKP0_SI468 +FSKP0_SX108 +FSKP0_SX18 +FSKP0_SX198 +FSKP0_SX288 +FSKP0_SX378 +FSLS0_SA1 +FSLS0_SA2 +FSLS0_SI1056 +FSLS0_SI1686 +FSLS0_SI2316 +FSLS0_SX202 +FSLS0_SX246 +FSLS0_SX66 +FSMA0_SA1 +FSMA0_SI1621 +FSMA0_SI2251 +FSMA0_SX271 +FSMA0_SX361 +FSMA0_SX91 +FSMM0_SA1 +FSMM0_SA2 +FSMM0_SI1314 +FSMM0_SI1944 +FSMM0_SI684 +FSMM0_SX414 +FSMM0_SX54 +FSMS1_SA1 +FSMS1_SA2 +FSMS1_SI1504 +FSMS1_SI2134 +FSMS1_SI874 +FSMS1_SX154 +FSMS1_SX334 +FSMS1_SX64 +FSPM0_SA1 +FSPM0_SI1871 +FSPM0_SI611 +FSPM0_SX341 +FSPM0_SX431 +FSRH0_SA1 +FSRH0_SA2 +FSRH0_SI1719 +FSRH0_SX131 +FSRH0_SX41 +FSSB0_SA1 +FSSB0_SA2 +FSSB0_SI1082 +FSSB0_SI2342 +FSSB0_SX182 +FSSB0_SX272 +FSSB0_SX452 +FSSB0_SX92 +FTAJ0_SA1 +FTAJ0_SA2 +FTAJ0_SI1329 +FTAJ0_SI474 +FTAJ0_SX339 +FTAJ0_SX69 +FTBR0_SA1 +FTBR0_SA2 +FTBR0_SI2181 +FTBR0_SX111 +FTBR0_SX201 +FTBR0_SX291 +FTBR0_SX381 +FTBW0_SA2 +FTBW0_SI1345 +FTBW0_SI1975 +FTBW0_SX265 +FTBW0_SX355 +FTBW0_SX445 +FTBW0_SX85 +FTLG0_SA1 +FTLG0_SA2 +FTLG0_SI840 +FTLG0_SX123 +FTLG0_SX213 +FTLG0_SX303 +FTLG0_SX33 +FTLG0_SX393 +FTMG0_SA1 +FTMG0_SA2 +FTMG0_SX182 +FTMG0_SX272 +FTMG0_SX362 +FTMG0_SX92 +FVFB0_SA1 +FVFB0_SI1032 +FVFB0_SI2292 +FVFB0_SX222 +FVFB0_SX312 +FVFB0_SX402 +FVKB0_SA2 +FVKB0_SI1159 +FVKB0_SI1789 +FVKB0_SI529 +FVKB0_SX169 +FVKB0_SX259 +FVKB0_SX439 +FVKB0_SX79 +FVMH0_SA1 +FVMH0_SI2096 +FVMH0_SX206 +FVMH0_SX296 +FVMH0_SX386 +MABC0_SA1 +MABC0_SA2 +MABC0_SX151 +MABC0_SX241 +MABC0_SX331 +MABC0_SX421 +MABC0_SX61 +MADC0_SA1 +MADC0_SA2 +MADC0_SI1997 +MADC0_SX17 +MADC0_SX197 +MADC0_SX287 +MADD0_SA1 +MADD0_SI1798 +MADD0_SI538 +MADD0_SX358 +MADD0_SX448 +MAEB0_SA1 +MAEB0_SA2 +MAEB0_SI2250 +MAEB0_SI990 +MAEB0_SX180 +MAEB0_SX270 +MAEB0_SX360 +MAEB0_SX90 +MAEO0_SA2 +MAEO0_SI1655 +MAEO0_SI1956 +MAEO0_SX156 +MAEO0_SX246 +MAEO0_SX336 +MAEO0_SX426 +MAEO0_SX66 +MAFM0_SA1 +MAFM0_SA2 +MAFM0_SI1569 +MAFM0_SI2199 +MAFM0_SX219 +MAFM0_SX39 +MAFM0_SX399 +MAJP0_SA1 +MAJP0_SI1074 +MAJP0_SI2334 +MAJP0_SX264 +MAJP0_SX354 +MAJP0_SX444 +MAJP0_SX84 +MAKB0_SA1 +MAKB0_SX206 +MAKB0_SX296 +MAKR0_SA1 +MAKR0_SA2 +MAKR0_SI1352 +MAKR0_SI1982 +MAKR0_SI722 +MAKR0_SX182 +MAKR0_SX272 +MAKR0_SX452 +MAPV0_SA1 +MAPV0_SA2 +MAPV0_SI1923 +MAPV0_SX123 +MAPV0_SX303 +MAPV0_SX33 +MAPV0_SX393 +MARC0_SA1 +MARC0_SI1188 +MARC0_SI1818 +MARC0_SI558 +MARC0_SX288 +MARC0_SX378 +MARW0_SA1 +MARW0_SA2 +MARW0_SI1276 +MARW0_SI646 +MARW0_SX106 +MARW0_SX16 +MARW0_SX376 +MBAR0_SA2 +MBAR0_SI1319 +MBAR0_SI1949 +MBAR0_SI689 +MBAR0_SX149 +MBAR0_SX239 +MBAR0_SX329 +MBBR0_SA1 +MBBR0_SA2 +MBBR0_SI1685 +MBBR0_SX155 +MBBR0_SX245 +MBBR0_SX425 +MBCG0_SA2 +MBCG0_SI2217 +MBCG0_SX147 +MBCG0_SX237 +MBCG0_SX417 +MBCG0_SX57 +MBEF0_SA1 +MBEF0_SA2 +MBEF0_SX111 +MBEF0_SX201 +MBEF0_SX291 +MBGT0_SA1 +MBGT0_SI1341 +MBGT0_SI711 +MBGT0_SX81 +MBJV0_SA2 +MBJV0_SI1247 +MBJV0_SI1877 +MBJV0_SX167 +MBJV0_SX257 +MBJV0_SX437 +MBJV0_SX77 +MBMA0_SA1 +MBMA0_SA2 +MBMA0_SI1852 +MBMA0_SX142 +MBMA0_SX322 +MBMA0_SX412 +MBMA1_SA1 +MBMA1_SA2 +MBMA1_SI2207 +MBMA1_SX144 +MBMA1_SX234 +MBMA1_SX414 +MBML0_SA1 +MBML0_SI1799 +MBML0_SI539 +MBML0_SX179 +MBML0_SX269 +MBML0_SX359 +MBML0_SX449 +MBOM0_SA1 +MBOM0_SI1014 +MBOM0_SI1644 +MBOM0_SX114 +MBOM0_SX204 +MBOM0_SX311 +MBOM0_SX384 +MBSB0_SA2 +MBSB0_SI1353 +MBSB0_SI1983 +MBSB0_SI723 +MBSB0_SX183 +MBSB0_SX273 +MBSB0_SX363 +MBSB0_SX93 +MBTH0_SA1 +MBTH0_SI505 +MBTH0_SI757 +MBTH0_SX212 +MBTH0_SX302 +MBTH0_SX392 +MBWP0_SA1 +MBWP0_SA2 +MBWP0_SI1531 +MBWP0_SI1969 +MBWP0_SI709 +MBWP0_SX169 +MBWP0_SX259 +MBWP0_SX439 +MBWP0_SX79 +MCAE0_SA1 +MCAE0_SA2 +MCAE0_SX187 +MCAE0_SX367 +MCAE0_SX7 +MCAE0_SX97 +MCAL0_SA1 +MCAL0_SI508 +MCAL0_SX148 +MCAL0_SX238 +MCAL0_SX328 +MCAL0_SX418 +MCAL0_SX58 +MCDC0_SA2 +MCDC0_SI1292 +MCDC0_SI1922 +MCDC0_SI662 +MCDC0_SX122 +MCDC0_SX302 +MCDC0_SX32 +MCDC0_SX392 +MCDD0_SA1 +MCDD0_SI1513 +MCDD0_SI2143 +MCDD0_SX163 +MCDD0_SX343 +MCDD0_SX73 +MCDR0_SA1 +MCDR0_SA2 +MCDR0_SX164 +MCDR0_SX254 +MCDR0_SX344 +MCDR0_SX434 +MCDR0_SX74 +MCEF0_SA1 +MCEF0_SA2 +MCEF0_SI1135 +MCEF0_SI1765 +MCEF0_SX145 +MCEF0_SX325 +MCEF0_SX55 +MCEW0_SI1442 +MCEW0_SX182 +MCEW0_SX272 +MCEW0_SX92 +MCHL0_SA1 +MCHL0_SA2 +MCHL0_SI1977 +MCHL0_SX177 +MCHL0_SX267 +MCHL0_SX357 +MCHL0_SX447 +MCLK0_SA1 +MCLK0_SA2 +MCLK0_SI1660 +MCLK0_SX130 +MCLK0_SX220 +MCLK0_SX40 +MCLK0_SX400 +MCLM0_SA2 +MCLM0_SI1456 +MCLM0_SX106 +MCLM0_SX16 +MCLM0_SX196 +MCLM0_SX286 +MCLM0_SX376 +MCPM0_SA2 +MCPM0_SI1194 +MCPM0_SI564 +MCPM0_SX204 +MCPM0_SX24 +MCRE0_SA1 +MCRE0_SA2 +MCRE0_SI1121 +MCRE0_SI1725 +MCRE0_SI1751 +MCRE0_SX131 +MCRE0_SX221 +MCRE0_SX24 +MCRE0_SX401 +MCRE0_SX41 +MCSS0_SA1 +MCSS0_SA2 +MCSS0_SX120 +MCSS0_SX210 +MCSS0_SX30 +MCSS0_SX300 +MCSS0_SX390 +MCTH0_SA2 +MCTH0_SI1209 +MCTH0_SI1839 +MCTH0_SI579 +MCTH0_SX129 +MCTH0_SX219 +MCTH0_SX309 +MCTH0_SX399 +MCTM0_SA1 +MCTM0_SA2 +MCTM0_SI720 +MCTM0_SX180 +MCTM0_SX270 +MCTM0_SX360 +MCTM0_SX450 +MCTM0_SX90 +MCXM0_SA1 +MCXM0_SA2 +MCXM0_SI1351 +MCXM0_SI1981 +MCXM0_SI721 +MCXM0_SX181 +MCXM0_SX271 +MCXM0_SX361 +MCXM0_SX451 +MDAC0_SA2 +MDAC0_SI1261 +MDAC0_SI1837 +MDAC0_SX271 +MDAC0_SX451 +MDAC0_SX91 +MDAS0_SA1 +MDAS0_SA2 +MDAS0_SI1266 +MDAS0_SX186 +MDAS0_SX21 +MDAS0_SX276 +MDAS0_SX96 +MDBB1_SA1 +MDBB1_SA2 +MDBB1_SI1006 +MDBB1_SI1636 +MDBB1_SI2056 +MDBB1_SX196 +MDBB1_SX286 +MDBP0_SA1 +MDBP0_SA2 +MDBP0_SI1158 +MDBP0_SI1788 +MDBP0_SX258 +MDBP0_SX348 +MDBP0_SX78 +MDCD0_SA1 +MDCD0_SA2 +MDCD0_SI2045 +MDCD0_SX155 +MDCD0_SX65 +MDCM0_SA1 +MDCM0_SA2 +MDCM0_SI2110 +MDCM0_SI850 +MDCM0_SX130 +MDCM0_SX220 +MDCM0_SX310 +MDDC0_SA1 +MDDC0_SA2 +MDDC0_SX249 +MDDC0_SX339 +MDDC0_SX429 +MDED0_SI1170 +MDED0_SI1800 +MDED0_SX180 +MDED0_SX270 +MDED0_SX360 +MDED0_SX450 +MDED0_SX90 +MDEF0_SA1 +MDEF0_SA2 +MDEF0_SI1563 +MDEF0_SI2193 +MDEF0_SX213 +MDEF0_SX33 +MDEF0_SX393 +MDEM0_SA2 +MDEM0_SI1868 +MDEM0_SX158 +MDEM0_SX248 +MDEM0_SX338 +MDEM0_SX68 +MDHL0_SA1 +MDHL0_SA2 +MDHL0_SI2069 +MDHL0_SI809 +MDHL0_SX179 +MDHL0_SX359 +MDHL0_SX89 +MDHS0_SX180 +MDHS0_SX270 +MDHS0_SX360 +MDHS0_SX450 +MDHS0_SX90 +MDJM0_SA1 +MDJM0_SA2 +MDJM0_SI2085 +MDJM0_SI825 +MDJM0_SX195 +MDJM0_SX285 +MDJM0_SX375 +MDKS0_SA1 +MDKS0_SA2 +MDKS0_SI1066 +MDKS0_SI1696 +MDKS0_SI2326 +MDKS0_SX256 +MDKS0_SX76 +MDLB0_SA1 +MDLB0_SI1936 +MDLB0_SI676 +MDLB0_SX226 +MDLB0_SX316 +MDLB0_SX46 +MDLC0_SA1 +MDLC0_SA2 +MDLC0_SI765 +MDLC0_SX135 +MDLC0_SX225 +MDLC0_SX315 +MDLC0_SX45 +MDLC1_SA1 +MDLC1_SX175 +MDLC1_SX265 +MDLC1_SX355 +MDLC1_SX85 +MDLC2_SA1 +MDLC2_SA2 +MDLC2_SI1614 +MDLC2_SI984 +MDLC2_SX174 +MDLC2_SX264 +MDLC2_SX444 +MDLC2_SX84 +MDLH0_SA1 +MDLH0_SI1960 +MDLH0_SI574 +MDLH0_SI700 +MDLH0_SX250 +MDLH0_SX340 +MDLH0_SX70 +MDLM0_SA1 +MDLM0_SA2 +MDLM0_SX244 +MDLM0_SX334 +MDLM0_SX64 +MDLR0_SI1233 +MDLR0_SX243 +MDLR0_SX423 +MDLR0_SX63 +MDLR1_SI1299 +MDLR1_SI1929 +MDLR1_SX129 +MDLR1_SX219 +MDLR1_SX309 +MDLR1_SX39 +MDLR1_SX399 +MDMA0_SA1 +MDMA0_SA2 +MDMA0_SI1238 +MDMA0_SI2060 +MDMT0_SI2341 +MDMT0_SI572 +MDMT0_SX212 +MDMT0_SX302 +MDMT0_SX392 +MDNS0_SA1 +MDNS0_SX111 +MDNS0_SX291 +MDNS0_SX381 +MDPB0_SA1 +MDPB0_SA2 +MDPB0_SI2126 +MDPB0_SX146 +MDPB0_SX236 +MDPB0_SX326 +MDPB0_SX56 +MDPK0_SA1 +MDPK0_SA2 +MDPK0_SI1683 +MDPK0_SI552 +MDPK0_SX153 +MDPK0_SX243 +MDPK0_SX63 +MDPS0_SA1 +MDPS0_SA2 +MDPS0_SI1651 +MDPS0_SI1979 +MDPS0_SX179 +MDPS0_SX269 +MDPS0_SX449 +MDPS0_SX89 +MDRD0_SA2 +MDRD0_SI1382 +MDRD0_SI2012 +MDRD0_SX122 +MDRD0_SX212 +MDRD0_SX302 +MDRD0_SX392 +MDSJ0_SA1 +MDSJ0_SA2 +MDSJ0_SI832 +MDSJ0_SX112 +MDSJ0_SX22 +MDSJ0_SX292 +MDSJ0_SX382 +MDSS0_SA1 +MDSS0_SI1881 +MDSS0_SI2087 +MDSS0_SI621 +MDSS0_SX171 +MDSS0_SX261 +MDSS0_SX351 +MDSS0_SX81 +MDSS1_SA2 +MDSS1_SI1713 +MDSS1_SX247 +MDSS1_SX337 +MDSS1_SX427 +MDTB0_SA1 +MDTB0_SA2 +MDTB0_SI570 +MDTB0_SX210 +MDTB0_SX300 +MDTB0_SX321 +MDTB0_SX390 +MDWD0_SA1 +MDWD0_SI1890 +MDWD0_SI557 +MDWD0_SX180 +MDWD0_SX360 +MDWD0_SX450 +MDWH0_SA2 +MDWH0_SI1925 +MDWH0_SX125 +MDWH0_SX35 +MDWH0_SX395 +MDWM0_SI1546 +MDWM0_SI2176 +MDWM0_SX106 +MDWM0_SX376 +MDWM0_SX433 +MEAL0_SA1 +MEAL0_SI1547 +MEAL0_SI917 +MEAL0_SX197 +MEAL0_SX287 +MEAL0_SX377 +MEDR0_SI744 +MEDR0_SX114 +MEDR0_SX204 +MEDR0_SX24 +MEDR0_SX294 +MEDR0_SX384 +MEFG0_SA2 +MEFG0_SI465 +MEFG0_SX105 +MEFG0_SX15 +MEFG0_SX195 +MEFG0_SX285 +MEFG0_SX375 +MEGJ0_SI1967 +MEGJ0_SX437 +MEGJ0_SX77 +MEJL0_SA2 +MEJL0_SI1592 +MEJL0_SI1654 +MEJL0_SI962 +MEJL0_SX332 +MEJL0_SX422 +MEJL0_SX62 +MEJS0_SA1 +MEJS0_SA2 +MEJS0_SI1870 +MEJS0_SX250 +MEJS0_SX430 +MEJS0_SX70 +MESG0_SA1 +MESG0_SA2 +MESG0_SI1332 +MESG0_SI1962 +MESG0_SX162 +MESG0_SX252 +MESG0_SX342 +MESG0_SX72 +MESJ0_SA1 +MESJ0_SA2 +MESJ0_SI2257 +MESJ0_SI997 +MESJ0_SX277 +MESJ0_SX367 +MESJ0_SX7 +MEWM0_SA1 +MEWM0_SA2 +MEWM0_SI1348 +MEWM0_SI1978 +MEWM0_SX268 +MEWM0_SX358 +MEWM0_SX448 +MFER0_SA1 +MFER0_SA2 +MFER0_SI1492 +MFER0_SI2122 +MFER0_SX232 +MFER0_SX322 +MFER0_SX412 +MFER0_SX52 +MFMC0_SA1 +MFMC0_SA2 +MFMC0_SI1132 +MFMC0_SI1762 +MFMC0_SI502 +MFMC0_SX142 +MFMC0_SX232 +MFMC0_SX322 +MFMC0_SX412 +MFMC0_SX52 +MFRM0_SA1 +MFRM0_SA2 +MFRM0_SI1155 +MFRM0_SI1717 +MFRM0_SI1785 +MFRM0_SX165 +MFRM0_SX255 +MFRM0_SX75 +MFWK0_SA1 +MFWK0_SA2 +MFWK0_SI1249 +MFWK0_SI619 +MFWK0_SX259 +MFWK0_SX439 +MFWK0_SX79 +MFXS0_SA1 +MFXS0_SA2 +MFXS0_SI1674 +MFXS0_SI2225 +MFXS0_SI2304 +MFXS0_SX144 +MFXS0_SX234 +MFXS0_SX414 +MFXV0_SA1 +MFXV0_SI1635 +MFXV0_SX15 +MFXV0_SX195 +MFXV0_SX285 +MFXV0_SX375 +MGAF0_SA2 +MGAF0_SI1912 +MGAF0_SI652 +MGAF0_SX112 +MGAF0_SX202 +MGAF0_SX292 +MGAG0_SA1 +MGAG0_SI1321 +MGAG0_SI645 +MGAG0_SX151 +MGAG0_SX241 +MGAG0_SX331 +MGAG0_SX421 +MGAG0_SX61 +MGAK0_SA1 +MGAK0_SA2 +MGAK0_SI1666 +MGAK0_SI2296 +MGAK0_SX316 +MGAK0_SX406 +MGAR0_SA1 +MGAR0_SA2 +MGAR0_SI1212 +MGAR0_SI1694 +MGAR0_SI1842 +MGAR0_SX222 +MGAR0_SX402 +MGAR0_SX42 +MGAW0_SA1 +MGAW0_SA2 +MGAW0_SI1802 +MGAW0_SX265 +MGAW0_SX355 +MGAW0_SX445 +MGAW0_SX85 +MGES0_SA2 +MGES0_SI1481 +MGES0_SX131 +MGES0_SX221 +MGES0_SX401 +MGES0_SX41 +MGJC0_SA1 +MGJC0_SI1256 +MGJC0_SI1335 +MGJC0_SI1965 +MGJC0_SX165 +MGJC0_SX255 +MGJC0_SX345 +MGRL0_SA1 +MGRL0_SA2 +MGRL0_SI1497 +MGRL0_SX237 +MGRL0_SX417 +MGRL0_SX57 +MGRP0_SA1 +MGRP0_SI1947 +MGRP0_SI687 +MGRP0_SX147 +MGRP0_SX237 +MGRP0_SX417 +MGRP0_SX57 +MGSH0_SA1 +MGSH0_SX186 +MGSH0_SX96 +MGSL0_SA2 +MGSL0_SI1164 +MGSL0_SX174 +MGSL0_SX354 +MGSL0_SX444 +MGSL0_SX84 +MGXP0_SA1 +MGXP0_SA2 +MGXP0_SI457 +MGXP0_SX277 +MGXP0_SX367 +MGXP0_SX97 +MHBS0_SA1 +MHBS0_SA2 +MHBS0_SI1575 +MHBS0_SI2205 +MHBS0_SX135 +MHBS0_SX225 +MHBS0_SX405 +MHIT0_SA2 +MHIT0_SI1613 +MHIT0_SI2243 +MHIT0_SX173 +MHIT0_SX263 +MHIT0_SX353 +MHIT0_SX443 +MHIT0_SX83 +MHJB0_SA2 +MHJB0_SI1647 +MHJB0_SI2277 +MHJB0_SX117 +MHJB0_SX207 +MHJB0_SX27 +MHJB0_SX297 +MHJB0_SX387 +MHMG0_SA1 +MHMG0_SA2 +MHMG0_SI1365 +MHMG0_SI1995 +MHMG0_SX105 +MHMG0_SX15 +MHMG0_SX285 +MHMG0_SX375 +MHMR0_SA2 +MHMR0_SI1119 +MHMR0_SX129 +MHMR0_SX219 +MHMR0_SX309 +MHMR0_SX39 +MHMR0_SX399 +MHRM0_SA2 +MHRM0_SI1475 +MHRM0_SI2218 +MHRM0_SX238 +MHRM0_SX328 +MHRM0_SX418 +MHXL0_SA1 +MHXL0_SA2 +MHXL0_SI512 +MHXL0_SI612 +MHXL0_SX152 +MHXL0_SX332 +MHXL0_SX422 +MHXL0_SX62 +MILB0_SA1 +MILB0_SI2163 +MILB0_SI807 +MILB0_SX183 +MILB0_SX273 +MILB0_SX3 +MILB0_SX363 +MILB0_SX93 +MJAC0_SA1 +MJAC0_SA2 +MJAC0_SI1331 +MJAC0_SI2148 +MJAC0_SX341 +MJAC0_SX431 +MJAE0_SA1 +MJAE0_SA2 +MJAE0_SI1524 +MJAE0_SI1999 +MJAE0_SI2154 +MJAE0_SX264 +MJAE0_SX354 +MJAE0_SX444 +MJAI0_SI1604 +MJAI0_SX164 +MJAI0_SX254 +MJAI0_SX344 +MJAI0_SX434 +MJAI0_SX74 +MJBG0_SA1 +MJBG0_SA2 +MJBG0_SI1232 +MJBG0_SI1724 +MJBG0_SI1862 +MJBG0_SX152 +MJBG0_SX242 +MJBG0_SX332 +MJBG0_SX422 +MJDA0_SA1 +MJDA0_SA2 +MJDA0_SI1661 +MJDA0_SI2291 +MJDA0_SX131 +MJDA0_SX221 +MJDA0_SX401 +MJDA0_SX41 +MJDC0_SA1 +MJDC0_SA2 +MJDC0_SI1161 +MJDC0_SI2165 +MJDC0_SX171 +MJDC0_SX261 +MJDC0_SX351 +MJDC0_SX441 +MJDC0_SX81 +MJDE0_SA2 +MJDE0_SX130 +MJDE0_SX310 +MJDE0_SX40 +MJDE0_SX400 +MJDG0_SA1 +MJDG0_SI1672 +MJDG0_SX142 +MJDG0_SX232 +MJDG0_SX322 +MJDG0_SX412 +MJDG0_SX52 +MJDM0_SA2 +MJDM0_SI1937 +MJDM0_SX260 +MJDM0_SX440 +MJDM0_SX80 +MJEB0_SA1 +MJEB0_SA2 +MJEB0_SI1286 +MJEB0_SI1916 +MJEB0_SX206 +MJEB0_SX26 +MJEB0_SX386 +MJEB1_SA1 +MJEB1_SI2097 +MJEB1_SX117 +MJEB1_SX27 +MJEB1_SX297 +MJEE0_SA2 +MJEE0_SI1237 +MJEE0_SI1867 +MJEE0_SI607 +MJEE0_SX157 +MJEE0_SX427 +MJEE0_SX67 +MJFH0_SA1 +MJFH0_SI1737 +MJFH0_SI477 +MJFH0_SX117 +MJFH0_SX207 +MJFH0_SX27 +MJFH0_SX297 +MJFH0_SX387 +MJFR0_SA2 +MJFR0_SI1605 +MJFR0_SI2235 +MJFR0_SI975 +MJFR0_SX165 +MJFR0_SX255 +MJFR0_SX345 +MJHI0_SA2 +MJHI0_SI555 +MJHI0_SI698 +MJHI0_SX248 +MJHI0_SX338 +MJHI0_SX428 +MJHI0_SX68 +MJJB0_SA2 +MJJB0_SI1139 +MJJB0_SI1277 +MJJB0_SI1769 +MJJB0_SX149 +MJJB0_SX329 +MJJB0_SX419 +MJJB0_SX59 +MJJJ0_SA1 +MJJJ0_SA2 +MJJJ0_SI1793 +MJJJ0_SI533 +MJJJ0_SX173 +MJJJ0_SX263 +MJJJ0_SX353 +MJJJ0_SX83 +MJJM0_SA1 +MJJM0_SI1457 +MJJM0_SX17 +MJJM0_SX197 +MJJM0_SX287 +MJJM0_SX377 +MJKR0_SA2 +MJKR0_SI1201 +MJKR0_SI1831 +MJKR0_SX121 +MJKR0_SX211 +MJKR0_SX301 +MJKR0_SX31 +MJKR0_SX391 +MJLB0_SA1 +MJLB0_SA2 +MJLB0_SI2246 +MJLB0_SI986 +MJLB0_SX266 +MJLB0_SX356 +MJLB0_SX446 +MJLB0_SX86 +MJLG1_SA1 +MJLG1_SA2 +MJLG1_SI1012 +MJLG1_SI1642 +MJLG1_SI2272 +MJLG1_SX112 +MJLG1_SX202 +MJLG1_SX22 +MJLG1_SX382 +MJLS0_SA1 +MJLS0_SA2 +MJLS0_SI1096 +MJLS0_SI466 +MJLS0_SX16 +MJLS0_SX196 +MJLS0_SX286 +MJLS0_SX376 +MJMA0_SI1495 +MJMA0_SI865 +MJMA0_SX145 +MJMA0_SX235 +MJMA0_SX325 +MJMA0_SX415 +MJMA0_SX55 +MJMD0_SA1 +MJMD0_SI1028 +MJMD0_SI1658 +MJMD0_SX128 +MJMD0_SX218 +MJMD0_SX398 +MJMM0_SA1 +MJMM0_SA2 +MJMM0_SI1885 +MJMM0_SI625 +MJMM0_SX265 +MJMM0_SX355 +MJMM0_SX445 +MJPG0_SA1 +MJPG0_SA2 +MJPG0_SI561 +MJPG0_SX291 +MJPG0_SX381 +MJPM0_SA1 +MJPM0_SI1998 +MJPM0_SI738 +MJPM0_SX108 +MJPM0_SX18 +MJPM0_SX198 +MJPM0_SX288 +MJPM1_SA1 +MJPM1_SA2 +MJPM1_SI1897 +MJPM1_SI761 +MJPM1_SX131 +MJPM1_SX221 +MJPM1_SX41 +MJRA0_SI606 +MJRA0_SX156 +MJRA0_SX246 +MJRA0_SX66 +MJRG0_SA1 +MJRG0_SA2 +MJRG0_SX106 +MJRG0_SX16 +MJRG0_SX286 +MJRH0_SA1 +MJRH0_SA2 +MJRH0_SI1125 +MJRH0_SI1755 +MJRH0_SX135 +MJRH0_SX315 +MJRH0_SX405 +MJRH0_SX45 +MJRH1_SA2 +MJRH1_SI1774 +MJRH1_SX334 +MJRH1_SX64 +MJRK0_SI2103 +MJRK0_SX340 +MJRK0_SX70 +MJRP0_SI1835 +MJRP0_SI585 +MJRP0_SX135 +MJRP0_SX315 +MJRP0_SX405 +MJRP0_SX45 +MJSR0_SA2 +MJSR0_SX164 +MJSR0_SX254 +MJSR0_SX434 +MJSR0_SX74 +MJWG0_SA2 +MJWG0_SI2155 +MJWG0_SX355 +MJWG0_SX445 +MJWG0_SX85 +MJWS0_SA1 +MJWS0_SA2 +MJWS0_SI1143 +MJWS0_SI1773 +MJWS0_SX243 +MJWS0_SX423 +MJWT0_SA2 +MJWT0_SI751 +MJXA0_SA1 +MJXA0_SA2 +MJXA0_SI1507 +MJXA0_SI2137 +MJXA0_SI877 +MJXA0_SX157 +MJXA0_SX247 +MJXA0_SX337 +MJXA0_SX67 +MJXL0_SA1 +MJXL0_SA2 +MJXL0_SI1795 +MJXL0_SX182 +MJXL0_SX272 +MJXL0_SX362 +MJXL0_SX452 +MJXL0_SX92 +MKAG0_SA2 +MKAG0_SI1609 +MKAG0_SI2239 +MKAG0_SX169 +MKAG0_SX30 +MKAG0_SX439 +MKAG0_SX79 +MKAH0_SA1 +MKAH0_SA2 +MKAH0_SI1528 +MKAH0_SI2158 +MKAH0_SI898 +MKAH0_SX268 +MKAH0_SX358 +MKAH0_SX448 +MKAH0_SX88 +MKAJ0_SA1 +MKAJ0_SI1414 +MKAJ0_SI2044 +MKAJ0_SI784 +MKAJ0_SX244 +MKAJ0_SX334 +MKAJ0_SX424 +MKAJ0_SX64 +MKAM0_SA2 +MKAM0_SI1316 +MKAM0_SX236 +MKAM0_SX416 +MKDB0_SI2132 +MKDB0_SI588 +MKDB0_SI872 +MKDB0_SX242 +MKDB0_SX332 +MKDB0_SX422 +MKDB0_SX62 +MKDD0_SA1 +MKDD0_SX127 +MKDD0_SX217 +MKDD0_SX307 +MKDD0_SX37 +MKDD0_SX397 +MKDT0_SA1 +MKDT0_SA2 +MKDT0_SI2153 +MKDT0_SI893 +MKDT0_SX173 +MKDT0_SX263 +MKDT0_SX353 +MKDT0_SX443 +MKDT0_SX83 +MKES0_SA2 +MKES0_SX263 +MKES0_SX353 +MKES0_SX443 +MKES0_SX83 +MKJO0_SA1 +MKJO0_SA2 +MKJO0_SI2147 +MKJO0_SX167 +MKJO0_SX257 +MKJO0_SX424 +MKJO0_SX77 +MKLN0_SA1 +MKLN0_SA2 +MKLN0_SI1598 +MKLN0_SI2228 +MKLN0_SX158 +MKLN0_SX338 +MKLN0_SX428 +MKLN0_SX68 +MKLR0_SA1 +MKLR0_SI1059 +MKLR0_SI2319 +MKLR0_SX159 +MKLR0_SX249 +MKLR0_SX339 +MKLR0_SX429 +MKLR0_SX69 +MKLS0_SA2 +MKLS0_SI1533 +MKLS0_SX177 +MKLS0_SX267 +MKLS0_SX447 +MKLS1_SI1545 +MKLS1_SI2175 +MKLS1_SX105 +MKLS1_SX15 +MKLS1_SX195 +MKLS1_SX285 +MKLW0_SA2 +MKLW0_SI1844 +MKLW0_SI2201 +MKLW0_SX131 +MKLW0_SX221 +MKLW0_SX401 +MKLW0_SX41 +MKRG0_SA1 +MKRG0_SA2 +MKRG0_SI1491 +MKRG0_SI2121 +MKRG0_SX141 +MKRG0_SX231 +MKRG0_SX31 +MKRG0_SX51 +MKXL0_SA1 +MKXL0_SI1185 +MKXL0_SX105 +MKXL0_SX195 +MKXL0_SX285 +MLBC0_SA2 +MLBC0_SI609 +MLBC0_SX159 +MLBC0_SX339 +MLBC0_SX429 +MLBC0_SX69 +MLEL0_SI1876 +MLEL0_SX346 +MLEL0_SX76 +MLJC0_SA1 +MLJC0_SA2 +MLJC0_SI1855 +MLJC0_SI595 +MLJC0_SX235 +MLJC0_SX325 +MLJC0_SX55 +MLJH0_SI1324 +MLJH0_SX154 +MLJH0_SX334 +MLJH0_SX424 +MLNS0_SA1 +MLNS0_SA2 +MLNS0_SI1407 +MLNS0_SI777 +MLNS0_SX147 +MLNS0_SX237 +MLNS0_SX327 +MLNS0_SX417 +MLNS0_SX57 +MLSH0_SA1 +MLSH0_SA2 +MLSH0_SI2047 +MLSH0_SI787 +MLSH0_SX157 +MLSH0_SX337 +MLSH0_SX427 +MLSH0_SX67 +MMAA0_SI2105 +MMAA0_SX125 +MMAA0_SX215 +MMAA0_SX305 +MMAA0_SX395 +MMAB1_SA1 +MMAB1_SA2 +MMAB1_SI2124 +MMAB1_SX144 +MMAB1_SX414 +MMAB1_SX54 +MMAG0_SI496 +MMAG0_SX226 +MMAG0_SX406 +MMAG0_SX46 +MMAM0_SA1 +MMAM0_SA2 +MMAM0_SI1597 +MMAM0_SI1668 +MMAM0_SX247 +MMAM0_SX337 +MMAM0_SX67 +MMAR0_SA1 +MMAR0_SA2 +MMAR0_SI1336 +MMAR0_SI706 +MMAR0_SX436 +MMAR0_SX76 +MMBS0_SA1 +MMBS0_SA2 +MMBS0_SI1151 +MMBS0_SX251 +MMBS0_SX341 +MMBS0_SX431 +MMBS0_SX71 +MMCC0_SA1 +MMCC0_SI1968 +MMCC0_SI708 +MMCC0_SX168 +MMCC0_SX258 +MMCC0_SX348 +MMCC0_SX438 +MMCC0_SX78 +MMDB0_SA1 +MMDB0_SA2 +MMDB0_SI1358 +MMDB0_SI1617 +MMDB0_SX267 +MMDB0_SX357 +MMDB0_SX447 +MMDB0_SX87 +MMDG0_SI2035 +MMDG0_SX340 +MMDG0_SX430 +MMDG0_SX70 +MMDM0_SA1 +MMDM0_SA2 +MMDM0_SX231 +MMDM0_SX321 +MMDM0_SX411 +MMDM0_SX51 +MMDM1_SA1 +MMDM1_SI1650 +MMDM1_SI783 +MMDM1_SX243 +MMDS0_SA2 +MMDS0_SI1343 +MMDS0_SI1973 +MMDS0_SI713 +MMDS0_SX173 +MMDS0_SX263 +MMDS0_SX353 +MMDS0_SX443 +MMDS0_SX83 +MMEA0_SA2 +MMEA0_SI1388 +MMEA0_SI2018 +MMEA0_SI758 +MMEA0_SX218 +MMEA0_SX308 +MMEA0_SX38 +MMEB0_SA1 +MMEB0_SI1357 +MMEB0_SI1987 +MMEB0_SI727 +MMEB0_SX7 +MMEB0_SX97 +MMGC0_SA1 +MMGC0_SI1935 +MMGC0_SI2184 +MMGC0_SX315 +MMGC0_SX405 +MMGC0_SX45 +MMGG0_SA1 +MMGG0_SA2 +MMGG0_SI1709 +MMGG0_SI2339 +MMGG0_SX179 +MMGG0_SX359 +MMGG0_SX89 +MMGK0_SA1 +MMGK0_SA2 +MMGK0_SI1322 +MMGK0_SI1952 +MMGK0_SI692 +MMGK0_SX152 +MMGK0_SX242 +MMGK0_SX422 +MMJB1_SA1 +MMJB1_SI1408 +MMJB1_SI2038 +MMJB1_SI778 +MMJB1_SX148 +MMJB1_SX238 +MMJB1_SX328 +MMJB1_SX418 +MMJB1_SX58 +MMLM0_SA1 +MMLM0_SA2 +MMLM0_SI1527 +MMLM0_SI897 +MMLM0_SX177 +MMLM0_SX267 +MMLM0_SX357 +MMLM0_SX447 +MMLM0_SX87 +MMPM0_SA1 +MMPM0_SA2 +MMPM0_SI1061 +MMPM0_SI1691 +MMPM0_SI2321 +MMPM0_SX251 +MMPM0_SX341 +MMPM0_SX431 +MMPM0_SX71 +MMRP0_SA1 +MMRP0_SI2034 +MMRP0_SI717 +MMRP0_SI774 +MMRP0_SX234 +MMRP0_SX414 +MMRP0_SX54 +MMSM0_SA1 +MMSM0_SA2 +MMSM0_SI1736 +MMSM0_SX26 +MMSM0_SX296 +MMSM0_SX386 +MMVP0_SI1284 +MMVP0_SI1914 +MMVP0_SX114 +MMVP0_SX204 +MMVP0_SX294 +MMVP0_SX384 +MMWB0_SA2 +MMWB0_SI1619 +MMWB0_SX179 +MMWB0_SX269 +MMWS0_SA1 +MMWS0_SI1518 +MMWS0_SI559 +MMWS0_SI888 +MMWS0_SX258 +MMWS0_SX78 +MMWS1_SA1 +MMWS1_SA2 +MMWS1_SI1071 +MMWS1_SI2331 +MMWS1_SX261 +MMWS1_SX27 +MMWS1_SX351 +MMWS1_SX441 +MMWS1_SX81 +MMXS0_SA1 +MMXS0_SA2 +MMXS0_SI629 +MMXS0_SI876 +MMXS0_SX156 +MMXS0_SX336 +MMXS0_SX66 +MNET0_SA1 +MNET0_SA2 +MNET0_SI1446 +MNET0_SI2076 +MNET0_SX186 +MNET0_SX276 +MNET0_SX366 +MNET0_SX96 +MNTW0_SA1 +MNTW0_SI2328 +MNTW0_SX202 +MNTW0_SX258 +MNTW0_SX348 +MPAR0_SA1 +MPAR0_SA2 +MPAR0_SI1576 +MPAR0_SX226 +MPAR0_SX406 +MPAR0_SX46 +MPEB0_SA1 +MPEB0_SA2 +MPEB0_SX150 +MPEB0_SX420 +MPEB0_SX60 +MPFU0_SA1 +MPFU0_SA2 +MPFU0_SI1888 +MPFU0_SX178 +MPFU0_SX268 +MPFU0_SX358 +MPFU0_SX88 +MPGH0_SA1 +MPGH0_SA2 +MPGH0_SI1554 +MPGH0_SI924 +MPGH0_SX204 +MPGH0_SX294 +MPGH0_SX384 +MPGR0_SA1 +MPGR0_SA2 +MPGR0_SI2040 +MPGR0_SI780 +MPGR0_SX150 +MPGR0_SX420 +MPGR0_SX60 +MPGR1_SA1 +MPGR1_SA2 +MPGR1_SI1269 +MPGR1_SI2129 +MPGR1_SX239 +MPGR1_SX329 +MPGR1_SX419 +MPGR1_SX59 +MPMB0_SX241 +MPPC0_SA2 +MPPC0_SI2042 +MPPC0_SI782 +MPPC0_SX152 +MPPC0_SX242 +MPPC0_SX332 +MPPC0_SX422 +MPPC0_SX62 +MPRB0_SA1 +MPRB0_SA2 +MPRB0_SI1205 +MPRB0_SX125 +MPRB0_SX215 +MPRB0_SX305 +MPRB0_SX35 +MPRB0_SX395 +MPRD0_SA2 +MPRD0_SI1431 +MPRD0_SI2061 +MPRK0_SA2 +MPRK0_SX17 +MPRK0_SX197 +MPRT0_SA2 +MPRT0_SI1210 +MPRT0_SI495 +MPRT0_SI580 +MPRT0_SX130 +MPRT0_SX220 +MPRT0_SX40 +MPRT0_SX400 +MPSW0_SA1 +MPSW0_SA2 +MPSW0_SI1697 +MPSW0_SI2327 +MPSW0_SX24 +MPSW0_SX257 +MPSW0_SX77 +MRAB0_SA1 +MRAB0_SA2 +MRAB0_SI1224 +MRAB0_SI594 +MRAB0_SX144 +MRAB0_SX234 +MRAB0_SX324 +MRAB0_SX414 +MRAB0_SX54 +MRAB1_SA1 +MRAB1_SA2 +MRAB1_SI1478 +MRAB1_SI2108 +MRAB1_SX218 +MRAB1_SX38 +MRAB1_SX398 +MRAI0_SI1954 +MRAI0_SX162 +MRAI0_SX252 +MRAI0_SX342 +MRAM0_SI1275 +MRAM0_SI1905 +MRAM0_SX105 +MRAM0_SX195 +MRAM0_SX285 +MRAM0_SX375 +MRAV0_SA1 +MRAV0_SA2 +MRAV0_SI1008 +MRAV0_SI1638 +MRAV0_SI2268 +MRAV0_SX108 +MRAV0_SX18 +MRAV0_SX198 +MRAV0_SX288 +MRAV0_SX378 +MRBC0_SA1 +MRBC0_SA2 +MRBC0_SI1665 +MRBC0_SI599 +MRBC0_SX149 +MRBC0_SX239 +MRBC0_SX59 +MRCG0_SA1 +MRCG0_SI2058 +MRCG0_SX258 +MRCG0_SX78 +MRCW0_SA2 +MRCW0_SI1371 +MRCW0_SI2001 +MRCW0_SX111 +MRCW0_SX201 +MRCW0_SX21 +MRCW0_SX381 +MRDD0_SA1 +MRDD0_SA2 +MRDD0_SI1050 +MRDD0_SI2310 +MRDD0_SX240 +MRDD0_SX330 +MRDM0_SA1 +MRDM0_SA2 +MRDM0_SI965 +MRDM0_SX155 +MRDM0_SX245 +MRDM0_SX425 +MRDS0_SA2 +MRDS0_SI1167 +MRDS0_SI1797 +MRDS0_SI537 +MRDS0_SX177 +MRDS0_SX267 +MRDS0_SX357 +MRDS0_SX447 +MRDS0_SX87 +MREE0_SA1 +MREE0_SA2 +MREE0_SI1734 +MREE0_SX114 +MREE0_SX204 +MREE0_SX294 +MREE0_SX384 +MREH1_SA2 +MREH1_SI2229 +MREH1_SX159 +MREH1_SX339 +MREH1_SX429 +MREM0_SA1 +MREM0_SI1591 +MREM0_SI961 +MREM0_SX151 +MREM0_SX241 +MREM0_SX331 +MREM0_SX421 +MREM0_SX61 +MREW1_SA1 +MREW1_SA2 +MREW1_SI1500 +MREW1_SI2130 +MREW1_SX150 +MREW1_SX240 +MREW1_SX330 +MREW1_SX420 +MREW1_SX60 +MRFK0_SA1 +MRFK0_SA2 +MRFK0_SI1706 +MRFK0_SI2336 +MRFK0_SX176 +MRFK0_SX266 +MRFK0_SX356 +MRFK0_SX86 +MRFL0_SA2 +MRFL0_SI1786 +MRFL0_SX346 +MRGM0_SA1 +MRGM0_SI1162 +MRGM0_SI1792 +MRGM0_SX416 +MRGM0_SX82 +MRGS0_SA1 +MRGS0_SI1986 +MRGS0_SX276 +MRGS0_SX366 +MRGS0_SX96 +MRHL0_SA1 +MRHL0_SA2 +MRHL0_SI1515 +MRHL0_SI2145 +MRHL0_SX165 +MRHL0_SX255 +MRHL0_SX75 +MRJB1_SI1020 +MRJB1_SX300 +MRJH0_SA1 +MRJH0_SI914 +MRJH0_SX259 +MRJH0_SX439 +MRJM0_SA1 +MRJM0_SA2 +MRJM0_SI1095 +MRJM0_SI1228 +MRJM0_SI1858 +MRJM0_SX238 +MRJM0_SX328 +MRJM0_SX418 +MRJM0_SX58 +MRJM1_SA1 +MRJM1_SI668 +MRJM1_SX218 +MRJM1_SX308 +MRJM1_SX38 +MRJM1_SX398 +MRJT0_SA1 +MRJT0_SI1805 +MRJT0_SX148 +MRJT0_SX238 +MRKM0_SA1 +MRKM0_SX187 +MRKM0_SX277 +MRKM0_SX7 +MRKM0_SX97 +MRLD0_SA1 +MRLD0_SI1594 +MRLD0_SI964 +MRLD0_SX244 +MRLD0_SX334 +MRLD0_SX64 +MRLJ0_SA2 +MRLJ0_SI1420 +MRLJ0_SI2050 +MRLJ0_SX160 +MRLJ0_SX430 +MRLJ0_SX70 +MRLJ1_SI1671 +MRLJ1_SI2332 +MRLJ1_SX141 +MRLJ1_SX231 +MRLJ1_SX411 +MRLJ1_SX51 +MRLK0_SA1 +MRLK0_SA2 +MRLK0_SI2140 +MRLK0_SX303 +MRLK0_SX33 +MRLK0_SX393 +MRLR0_SA1 +MRLR0_SA2 +MRLR0_SI1826 +MRLR0_SI566 +MRLR0_SX116 +MRLR0_SX206 +MRLR0_SX26 +MRLR0_SX296 +MRLR0_SX386 +MRMB0_SA1 +MRMB0_SI2211 +MRMB0_SI951 +MRMB0_SX141 +MRMB0_SX231 +MRMB0_SX321 +MRMB0_SX51 +MRMG0_SA2 +MRMG0_SI1710 +MRMG0_SI2340 +MRMG0_SX180 +MRMG0_SX270 +MRMG0_SX360 +MRMG0_SX90 +MRMH0_SA1 +MRMH0_SA2 +MRMH0_SI1021 +MRMH0_SX211 +MRMH0_SX301 +MRMH0_SX31 +MRMH0_SX391 +MRML0_SI2051 +MRML0_SI791 +MRML0_SX431 +MRML0_SX71 +MRMS0_SA1 +MRMS0_SA2 +MRMS0_SI1113 +MRMS0_SI2100 +MRMS0_SX120 +MRMS0_SX210 +MRMS0_SX30 +MRMS0_SX300 +MRMS0_SX390 +MRPC1_SA1 +MRPC1_SA2 +MRPC1_SI1482 +MRPC1_SI2026 +MRPC1_SX132 +MRPC1_SX222 +MRPC1_SX312 +MRPC1_SX402 +MRPC1_SX42 +MRRE0_SI704 +MRRE0_SX254 +MRRE0_SX434 +MRSO0_SA1 +MRSO0_SA2 +MRSO0_SI1659 +MRSO0_SI2289 +MRSO0_SX219 +MRSO0_SX309 +MRSO0_SX399 +MRSP0_SA1 +MRSP0_SA2 +MRSP0_SI2059 +MRSP0_SI799 +MRSP0_SX169 +MRSP0_SX196 +MRSP0_SX439 +MRSP0_SX79 +MRTC0_SA1 +MRTC0_SA2 +MRTC0_SI2088 +MRTC0_SI828 +MRTC0_SX108 +MRTC0_SX18 +MRTC0_SX198 +MRTC0_SX288 +MRTJ0_SA2 +MRTJ0_SI1551 +MRTJ0_SI2032 +MRTJ0_SX322 +MRTJ0_SX412 +MRVG0_SA1 +MRVG0_SA2 +MRVG0_SI1770 +MRVG0_SI510 +MRVG0_SX150 +MRVG0_SX330 +MRVG0_SX420 +MRVG0_SX60 +MRWA0_SA1 +MRWA0_SA2 +MRWA0_SI1603 +MRWA0_SI2233 +MRWA0_SX253 +MRWA0_SX343 +MRWA0_SX433 +MRWS0_SA1 +MRWS0_SA2 +MRWS0_SX112 +MRWS0_SX202 +MRWS0_SX292 +MRXB0_SA1 +MRXB0_SI1585 +MRXB0_SX145 +MRXB0_SX235 +MRXB0_SX325 +MRXB0_SX55 +MSAH1_SA1 +MSAH1_SA2 +MSAH1_SI1049 +MSAH1_SI2309 +MSAH1_SX149 +MSAH1_SX239 +MSAH1_SX329 +MSAH1_SX419 +MSAH1_SX59 +MSAS0_SA1 +MSAS0_SA2 +MSAS0_SI2006 +MSAS0_SX26 +MSAS0_SX296 +MSAT0_SA2 +MSAT0_SI1526 +MSAT0_SI2156 +MSAT0_SI896 +MSAT0_SX176 +MSAT0_SX266 +MSAT0_SX356 +MSAT0_SX446 +MSAT0_SX86 +MSAT1_SA1 +MSAT1_SA2 +MSAT1_SI1073 +MSAT1_SI1703 +MSAT1_SI2333 +MSAT1_SX173 +MSAT1_SX353 +MSDB0_SA1 +MSDB0_SA2 +MSDB0_SI1007 +MSDB0_SI1637 +MSDB0_SI2267 +MSDB0_SX107 +MSDB0_SX17 +MSDH0_SA1 +MSDH0_SA2 +MSDH0_SI2113 +MSDH0_SX260 +MSDH0_SX350 +MSDS0_SA2 +MSDS0_SI1707 +MSDS0_SI2337 +MSDS0_SX177 +MSDS0_SX447 +MSDS0_SX87 +MSEM1_SA1 +MSEM1_SA2 +MSEM1_SX360 +MSEM1_SX450 +MSEM1_SX90 +MSES0_SA1 +MSES0_SA2 +MSES0_SI2216 +MSES0_SI2219 +MSES0_SX149 +MSES0_SX329 +MSES0_SX59 +MSFH0_SA2 +MSFH0_SI1216 +MSFH0_SI586 +MSFH0_SX226 +MSFH0_SX46 +MSFV0_SA1 +MSFV0_SA2 +MSFV0_SI1262 +MSFV0_SX182 +MSFV0_SX272 +MSFV0_SX452 +MSJK0_SA1 +MSJK0_SA2 +MSJK0_SI2226 +MSJK0_SI966 +MSJK0_SX156 +MSJK0_SX246 +MSJK0_SX426 +MSJK0_SX66 +MSMC0_SA1 +MSMC0_SA2 +MSMC0_SI1907 +MSMC0_SI647 +MSMC0_SX107 +MSMC0_SX17 +MSMC0_SX197 +MSMC0_SX287 +MSMC0_SX377 +MSMR0_SA1 +MSMR0_SA2 +MSMR0_SI1405 +MSMR0_SI775 +MSMR0_SX145 +MSMR0_SX235 +MSMR0_SX325 +MSMR0_SX55 +MSMS0_SA2 +MSMS0_SI2063 +MSMS0_SI803 +MSMS0_SX263 +MSMS0_SX353 +MSMS0_SX443 +MSRG0_SA2 +MSRG0_SI1851 +MSRG0_SI591 +MSRG0_SX141 +MSRG0_SX231 +MSRG0_SX321 +MSRG0_SX411 +MSRG0_SX51 +MSRR0_SA1 +MSRR0_SA2 +MSRR0_SI1131 +MSRR0_SX141 +MSRR0_SX231 +MSRR0_SX30 +MSRR0_SX411 +MSRR0_SX51 +MSTF0_SA1 +MSTF0_SA2 +MSTF0_SI1396 +MSTF0_SX136 +MSTF0_SX226 +MSTF0_SX406 +MSVS0_SA1 +MSVS0_SI1568 +MSVS0_SX128 +MSVS0_SX218 +MSVS0_SX38 +MTAB0_SA1 +MTAB0_SA2 +MTAB0_SI2202 +MTAB0_SI942 +MTAB0_SX132 +MTAB0_SX222 +MTAB0_SX402 +MTAB0_SX42 +MTAS0_SA1 +MTAS0_SA2 +MTAS0_SI1385 +MTAS0_SI2015 +MTAS0_SI755 +MTAS0_SX125 +MTAS0_SX305 +MTAT0_SA2 +MTAT0_SI1740 +MTAT0_SX120 +MTAT0_SX210 +MTAT0_SX30 +MTAT0_SX300 +MTAT1_SA1 +MTAT1_SA2 +MTAT1_SI1409 +MTAT1_SI1627 +MTAT1_SX239 +MTAT1_SX419 +MTBC0_SA1 +MTBC0_SA2 +MTBC0_SI1173 +MTBC0_SX183 +MTBC0_SX273 +MTBC0_SX347 +MTBC0_SX363 +MTBC0_SX93 +MTCS0_SA1 +MTCS0_SI1972 +MTCS0_SX172 +MTCS0_SX262 +MTCS0_SX352 +MTCS0_SX442 +MTDB0_SA1 +MTDB0_SA2 +MTDB0_SI2031 +MTDB0_SX141 +MTDB0_SX231 +MTDB0_SX321 +MTDB0_SX411 +MTDB0_SX51 +MTDP0_SI1274 +MTDP0_SI2151 +MTDP0_SX261 +MTDP0_SX441 +MTDP0_SX81 +MTER0_SI527 +MTER0_SX167 +MTER0_SX17 +MTER0_SX257 +MTER0_SX77 +MTJG0_SA2 +MTJG0_SI1520 +MTJG0_SI890 +MTJG0_SX350 +MTJG0_SX440 +MTJG0_SX80 +MTJM0_SA1 +MTJM0_SA2 +MTJM0_SI1226 +MTJM0_SI655 +MTJM0_SX236 +MTJM0_SX326 +MTJM0_SX416 +MTJM0_SX56 +MTJS0_SA1 +MTJS0_SI1192 +MTJS0_SX112 +MTJS0_SX202 +MTJS0_SX22 +MTJS0_SX292 +MTJU0_SA1 +MTJU0_SA2 +MTJU0_SI2269 +MTJU0_SI760 +MTJU0_SX220 +MTJU0_SX310 +MTJU0_SX40 +MTKD0_SA1 +MTKD0_SA2 +MTKD0_SI1187 +MTKD0_SI1817 +MTKD0_SX17 +MTKD0_SX197 +MTKD0_SX377 +MTKP0_SA1 +MTKP0_SA2 +MTKP0_SX123 +MTKP0_SX213 +MTKP0_SX303 +MTKP0_SX33 +MTKP0_SX393 +MTLB0_SA2 +MTLB0_SI1764 +MTLB0_SI504 +MTLB0_SX144 +MTLB0_SX414 +MTLB0_SX54 +MTLC0_SA2 +MTLC0_SI847 +MTLC0_SX127 +MTLC0_SX217 +MTLC0_SX307 +MTLC0_SX37 +MTLC0_SX397 +MTML0_SA1 +MTML0_SA2 +MTML0_SI1065 +MTML0_SI1695 +MTML0_SX255 +MTML0_SX345 +MTML0_SX75 +MTMN0_SA1 +MTMN0_SX164 +MTMN0_SX254 +MTMN0_SX344 +MTMN0_SX74 +MTMT0_SA1 +MTMT0_SI1118 +MTMT0_SX128 +MTMT0_SX218 +MTMT0_SX308 +MTMT0_SX38 +MTMT0_SX398 +MTPF0_SA1 +MTPF0_SA2 +MTPF0_SI1235 +MTPF0_SI1865 +MTPF0_SI605 +MTPF0_SX155 +MTPF0_SX245 +MTPF0_SX335 +MTPF0_SX425 +MTPG0_SA1 +MTPG0_SA2 +MTPG0_SI2013 +MTPG0_SX123 +MTPG0_SX213 +MTPG0_SX33 +MTPG0_SX393 +MTPP0_SA1 +MTPP0_SA2 +MTPP0_SI2138 +MTPP0_SI878 +MTPP0_SX158 +MTPP0_SX248 +MTPP0_SX428 +MTPP0_SX68 +MTPR0_SA1 +MTPR0_SA2 +MTPR0_SI1600 +MTPR0_SI506 +MTPR0_SX250 +MTPR0_SX70 +MTQC0_SA2 +MTQC0_SI2071 +MTQC0_SX271 +MTQC0_SX361 +MTRC0_SA1 +MTRC0_SA2 +MTRC0_SI1623 +MTRC0_SI993 +MTRC0_SX170 +MTRC0_SX183 +MTRC0_SX273 +MTRC0_SX363 +MTRC0_SX93 +MTRR0_SA1 +MTRR0_SA2 +MTRR0_SI1548 +MTRR0_SI2178 +MTRR0_SX108 +MTRR0_SX18 +MTRR0_SX378 +MTRT0_SA1 +MTRT0_SI1857 +MTRT0_SI597 +MTRT0_SX147 +MTRT0_SX237 +MTRT0_SX417 +MTWH1_SA1 +MTWH1_SA2 +MTWH1_SI1512 +MTWH1_SI2142 +MTWH1_SI882 +MTWH1_SX162 +MTWH1_SX252 +MTWH1_SX342 +MTWH1_SX432 +MTXS0_SI1690 +MTXS0_SX250 +MTXS0_SX340 +MTXS0_SX70 +MVJH0_SA1 +MVJH0_SA2 +MVJH0_SI2186 +MVJH0_SX116 +MVJH0_SX26 +MVJH0_SX386 +MVLO0_SA2 +MVLO0_SI1147 +MVLO0_SI1777 +MVLO0_SX157 +MVLO0_SX247 +MVLO0_SX337 +MVLO0_SX427 +MVLO0_SX67 +MVRW0_SA1 +MVRW0_SI1485 +MVRW0_SI2115 +MVRW0_SI855 +MVRW0_SX315 +MVRW0_SX405 +MVRW0_SX45 +MWAC0_SA1 +MWAC0_SI2231 +MWAC0_SI971 +MWAC0_SX71 +MWAD0_SA1 +MWAD0_SA2 +MWAD0_SI1062 +MWAD0_SI1749 +MWAD0_SI2322 +MWAD0_SX162 +MWAD0_SX252 +MWAD0_SX342 +MWAR0_SA2 +MWAR0_SI2305 +MWAR0_SX145 +MWAR0_SX235 +MWAR0_SX325 +MWAR0_SX415 +MWAR0_SX55 +MWCH0_SA1 +MWCH0_SA2 +MWCH0_SI1622 +MWCH0_SX272 +MWCH0_SX362 +MWCH0_SX92 +MWDK0_SX266 +MWDK0_SX356 +MWDK0_SX446 +MWEM0_SA1 +MWEM0_SI1950 +MWEM0_SX240 +MWEM0_SX330 +MWEM0_SX60 +MWGR0_SA1 +MWGR0_SA2 +MWGR0_SI1606 +MWGR0_SI2236 +MWGR0_SI976 +MWGR0_SX166 +MWGR0_SX256 +MWGR0_SX436 +MWGR0_SX76 +MWRE0_SA1 +MWRE0_SI1687 +MWRE0_SI2317 +MWRE0_SX157 +MWRP0_SA2 +MWRP0_SI1525 +MWRP0_SI2073 +MWRP0_SX183 +MWRP0_SX3 +MWRP0_SX93 +MWSB0_SA1 +MWSB0_SA2 +MWSB0_SI1626 +MWSB0_SI2256 +MWSB0_SX186 +MWSB0_SX366 +MWSB0_SX6 +MWSB0_SX96 +MWSH0_SA1 +MWSH0_SA2 +MWSH0_SI2266 +MWSH0_SX346 +MWSH0_SX436 +MZMB0_SA2 +MZMB0_SI1166 +MZMB0_SI1796 +MZMB0_SI536 +MZMB0_SX176 +MZMB0_SX266 +MZMB0_SX356 +MZMB0_SX446 +MZMB0_SX86 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train_text.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train_text.uid new file mode 100644 index 0000000..0e0c251 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/train_text.uid @@ -0,0 +1,1000 @@ +FAEM0_SI762 +FAEM0_SX42 +FAJW0_SA1 +FAJW0_SX3 +FAJW0_SX93 +FALK0_SX186 +FALK0_SX6 +FALR0_SI1325 +FBAS0_SA1 +FBAS0_SX217 +FBCG1_SA1 +FBCG1_SX172 +FBCG1_SX442 +FBCH0_SX236 +FBCH0_SX416 +FBLV0_SA1 +FBLV0_SI1058 +FBLV0_SX338 +FBLV0_SX68 +FBMH0_SA1 +FBMJ0_SI815 +FCAG0_SA1 +FCAG0_SX153 +FCAG0_SX243 +FCAJ0_SI1479 +FCAJ0_SX309 +FCDR1_SX106 +FCDR1_SX196 +FCEG0_SA2 +FCJF0_SA1 +FCJF0_SX127 +FCJS0_SI1607 +FCJS0_SI2237 +FCJS0_SX257 +FCKE0_SA2 +FCKE0_SX121 +FCLT0_SI2068 +FCLT0_SX448 +FCLT0_SX88 +FCMG0_SA2 +FCMG0_SI1872 +FCMG0_SX72 +FCMM0_SA1 +FCMM0_SA2 +FCMM0_SX183 +FCRZ0_SI2053 +FCRZ0_SX433 +FCYL0_SA1 +FCYL0_SX37 +FDAS1_SI2091 +FDAS1_SX201 +FDAS1_SX381 +FDAW0_SI1406 +FDFB0_SA1 +FDFB0_SA2 +FDFB0_SI2010 +FDFB0_SX58 +FDJH0_SX305 +FDML0_SA2 +FDML0_SX159 +FDML0_SX249 +FDML0_SX429 +FDMY0_SA2 +FDMY0_SX27 +FDNC0_SX198 +FDNC0_SX288 +FDTD0_SX211 +FDXW0_SA1 +FDXW0_SX251 +FDXW0_SX341 +FDXW0_SX71 +FEAC0_SX165 +FEAC0_SX75 +FEAR0_SI622 +FECD0_SX68 +FEEH0_SA1 +FEEH0_SI1742 +FEEH0_SI471 +FEEH0_SX122 +FEME0_SA1 +FEME0_SX155 +FEME0_SX65 +FETB0_SA1 +FETB0_SI1148 +FETB0_SX158 +FEXM0_SI1101 +FGCS0_SX136 +FGCS0_SX226 +FGCS0_SX316 +FGCS0_SX406 +FGDP0_SA1 +FGMB0_SI1775 +FGMB0_SX245 +FHLM0_SX390 +FHXS0_SA2 +FHXS0_SX445 +FJDM2_SA1 +FJDM2_SX232 +FJDM2_SX52 +FJHK0_SX302 +FJKL0_SX212 +FJKL0_SX392 +FJLG0_SI2306 +FJLR0_SA1 +FJRP1_SI2062 +FJRP1_SX82 +FJSK0_SA1 +FJSP0_SX264 +FJSP0_SX354 +FJSP0_SX444 +FJWB1_SA1 +FJWB1_SX345 +FJWB1_SX435 +FJXM0_SA1 +FJXM0_SI581 +FJXM0_SX401 +FJXP0_SA1 +FJXP0_SI1122 +FJXP0_SX132 +FKAA0_SX128 +FKAA0_SX398 +FKDE0_SA1 +FKDE0_SX151 +FKDE0_SX241 +FKDE0_SX421 +FKDE0_SX61 +FKDW0_SX397 +FKFB0_SA2 +FKFB0_SX348 +FKFB0_SX78 +FKKH0_SA1 +FKKH0_SA2 +FKKH0_SX120 +FKKH0_SX390 +FKLC0_SX355 +FKLC1_SI2308 +FKLC1_SX238 +FKLC1_SX328 +FKLC1_SX418 +FKLH0_SA2 +FKLH0_SX177 +FKSR0_SA1 +FKSR0_SA2 +FKSR0_SI1747 +FKSR0_SI487 +FKSR0_SX217 +FLAC0_SX451 +FLAG0_SA2 +FLAG0_SX114 +FLAG0_SX204 +FLAG0_SX24 +FLAG0_SX384 +FLEH0_SI1681 +FLEH0_SI2311 +FLEH0_SX331 +FLET0_SA1 +FLHD0_SI1827 +FLHD0_SX354 +FLJA0_SA1 +FLJA0_SI2338 +FLJD0_SI886 +FLJD0_SX76 +FLJG0_SA2 +FLKM0_SA2 +FLKM0_SI686 +FLKM0_SX260 +FLKM0_SX80 +FLMA0_SA1 +FLMA0_SI613 +FLMA0_SX433 +FLMA0_SX73 +FLMC0_SX22 +FLMK0_SI1035 +FLMK0_SX315 +FLMK0_SX405 +FLOD0_SI1917 +FLOD0_SX117 +FLOD0_SX171 +FLOD0_SX297 +FLTM0_SA1 +FLTM0_SI1070 +FLTM0_SI2330 +FMAH1_SA2 +FMAH1_SX159 +FMBG0_SA2 +FMBG0_SI2264 +FMEM0_SI747 +FMEM0_SX387 +FMJB0_SI547 +FMJB0_SX97 +FMJF0_SA2 +FMJU0_SX309 +FMJU0_SX399 +FMKC0_SI1702 +FMKC0_SX442 +FMKC0_SX82 +FMKF0_SX186 +FMPG0_SA2 +FNKL0_SI1522 +FNTB0_SI1203 +FNTB0_SI573 +FNTB0_SX303 +FPAB1_SI1471 +FPAB1_SX211 +FPAC0_SA2 +FPAD0_SA2 +FPAD0_SX356 +FPAD0_SX86 +FPAF0_SA2 +FPAF0_SX154 +FPAZ0_SA1 +FPAZ0_SA2 +FPAZ0_SX243 +FPJF0_SA1 +FPJF0_SX146 +FPJF0_SX56 +FPLS0_SI1590 +FPLS0_SX330 +FPMY0_SA1 +FPMY0_SX343 +FREH0_SA1 +FREH0_SA2 +FREH0_SX415 +FRJB0_SX347 +FRLL0_SX434 +FSAG0_SA1 +FSAG0_SX243 +FSAH0_SA1 +FSAH0_SA2 +FSAH0_SX164 +FSAH0_SX434 +FSBK0_SA2 +FSBK0_SI1069 +FSBK0_SX169 +FSCN0_SA2 +FSCN0_SI626 +FSCN0_SX266 +FSCN0_SX446 +FSCN0_SX86 +FSDC0_SA2 +FSDC0_SX142 +FSDC0_SX322 +FSDC0_SX52 +FSDJ0_SI485 +FSDJ0_SX215 +FSDJ0_SX305 +FSDJ0_SX395 +FSGF0_SX117 +FSJG0_SX130 +FSJK1_SA2 +FSJK1_SX125 +FSJK1_SX35 +FSJS0_SX181 +FSJW0_SI1963 +FSJW0_SX433 +FSKC0_SI1416 +FSKC0_SI786 +FSKC0_SX246 +FSKL0_SI1529 +FSKL0_SX449 +FSKP0_SA2 +FSLS0_SX156 +FSLS0_SX426 +FSMA0_SA2 +FSMA0_SX181 +FSMM0_SX144 +FSMM0_SX234 +FSMS1_SX244 +FSMS1_SX347 +FSPM0_SA2 +FSPM0_SX161 +FSPM0_SX71 +FSRH0_SI1931 +FSRH0_SI671 +FSRH0_SX221 +FSRH0_SX401 +FTAJ0_SI699 +FTAJ0_SX159 +FTAJ0_SX249 +FTAJ0_SX429 +FTBR0_SX21 +FTBW0_SA1 +FTMG0_SI1532 +FTMG0_SI2162 +FTMG0_SX452 +FVFB0_SA2 +FVFB0_SX132 +FVFB0_SX42 +FVKB0_SA1 +FVMH0_SA2 +FVMH0_SX116 +FVMH0_SX26 +MABC0_SI1620 +MABC0_SI2041 +MABC0_SI781 +MADC0_SX107 +MADC0_SX377 +MADD0_SA2 +MADD0_SI1295 +MADD0_SX178 +MADD0_SX268 +MADD0_SX88 +MAEB0_SX450 +MAEO0_SA1 +MAFM0_SI939 +MAFM0_SX129 +MAFM0_SX309 +MAJP0_SA2 +MAKB0_SI1646 +MAKB0_SX26 +MAKB0_SX386 +MAKR0_SX362 +MAKR0_SX92 +MAPV0_SX213 +MARC0_SA2 +MARC0_SX108 +MARC0_SX18 +MARC0_SX198 +MARW0_SI1906 +MBAR0_SA1 +MBAR0_SX419 +MBAR0_SX59 +MBBR0_SI2315 +MBBR0_SX65 +MBCG0_SA1 +MBCG0_SI486 +MBEF0_SI1281 +MBEF0_SI1911 +MBEF0_SI651 +MBEF0_SX21 +MBEF0_SX381 +MBGT0_SA2 +MBGT0_SX261 +MBGT0_SX351 +MBGT0_SX441 +MBJV0_SA1 +MBJV0_SI617 +MBJV0_SX347 +MBMA0_SI592 +MBMA0_SX232 +MBMA0_SX52 +MBMA1_SI2214 +MBMA1_SX54 +MBML0_SA2 +MBML0_SI1169 +MBML0_SX89 +MBOM0_SA2 +MBOM0_SI2274 +MBOM0_SX294 +MBSB0_SA1 +MBSB0_SX3 +MBTH0_SA2 +MBTH0_SX122 +MBTH0_SX32 +MCAE0_SX277 +MCAL0_SA2 +MCAL0_SI1768 +MCDC0_SA1 +MCDC0_SX212 +MCDD0_SA2 +MCDD0_SI883 +MCDD0_SX253 +MCDD0_SX433 +MCDR0_SI1154 +MCEF0_SX235 +MCEF0_SX415 +MCEW0_SA2 +MCHL0_SX87 +MCLK0_SX310 +MCLM0_SA1 +MCLM0_SI2086 +MCLM0_SI826 +MCPM0_SA1 +MCPM0_SX114 +MCPM0_SX294 +MCPM0_SX384 +MCSS0_SI750 +MCTH0_SA1 +MCTH0_SX39 +MCXM0_SX91 +MDAC0_SA1 +MDAC0_SX181 +MDAC0_SX361 +MDAS0_SX6 +MDBB1_SX106 +MDBB1_SX16 +MDBB1_SX376 +MDBP0_SX168 +MDCD0_SI1415 +MDCD0_SX245 +MDCD0_SX425 +MDCM0_SX40 +MDCM0_SX400 +MDDC0_SI2049 +MDDC0_SI789 +MDDC0_SX159 +MDDC0_SX69 +MDED0_SA1 +MDED0_SA2 +MDEF0_SX123 +MDEF0_SX303 +MDHL0_SI1439 +MDHL0_SX269 +MDHL0_SX449 +MDHS0_SA1 +MDHS0_SA2 +MDHS0_SI1530 +MDHS0_SI2160 +MDJM0_SX105 +MDJM0_SX15 +MDKS0_SX436 +MDLB0_SA2 +MDLC0_SX405 +MDLC1_SA2 +MDLC1_SI2065 +MDLC1_SI2144 +MDLC1_SX445 +MDLC2_SI2244 +MDLC2_SX354 +MDLH0_SA2 +MDLM0_SI1234 +MDLM0_SI1864 +MDLM0_SX154 +MDLM0_SX424 +MDLR0_SA1 +MDLR0_SA2 +MDLR0_SI1863 +MDLR0_SI603 +MDLR0_SX153 +MDLR1_SA1 +MDLR1_SA2 +MDMA0_SI1430 +MDMA0_SX260 +MDMA0_SX80 +MDMT0_SA1 +MDMT0_SA2 +MDMT0_SI1832 +MDMT0_SX122 +MDMT0_SX32 +MDNS0_SA2 +MDNS0_SI2271 +MDNS0_SX201 +MDNS0_SX21 +MDPB0_SX416 +MDPK0_SI1053 +MDPK0_SX333 +MDPK0_SX423 +MDPS0_SI719 +MDPS0_SX359 +MDRD0_SA1 +MDRD0_SX32 +MDSJ0_SI2092 +MDSS0_SA2 +MDSS0_SX441 +MDSS1_SA1 +MDSS1_SI1327 +MDSS1_SI697 +MDSS1_SX157 +MDSS1_SX67 +MDTB0_SI1200 +MDTB0_SI1830 +MDTB0_SX120 +MDWD0_SA2 +MDWD0_SX270 +MDWD0_SX90 +MDWH0_SX215 +MDWH0_SX305 +MDWM0_SA1 +MDWM0_SA2 +MDWM0_SX16 +MDWM0_SX286 +MEAL0_SA2 +MEAL0_SI2177 +MEAL0_SX107 +MEAL0_SX347 +MEDR0_SA1 +MEDR0_SA2 +MEDR0_SI1374 +MEFG0_SA1 +MEGJ0_SA2 +MEGJ0_SX257 +MEGJ0_SX3 +MEJL0_SA1 +MEJL0_SX152 +MEJL0_SX242 +MEJS0_SI610 +MEJS0_SX160 +MEJS0_SX340 +MESG0_SX432 +MESJ0_SX187 +MESJ0_SX97 +MEWM0_SI718 +MEWM0_SX178 +MEWM0_SX88 +MFER0_SI862 +MFER0_SX142 +MFRM0_SX345 +MFRM0_SX435 +MFWK0_SI1879 +MFWK0_SX169 +MFXS0_SX54 +MFXV0_SA2 +MFXV0_SX105 +MGAF0_SA1 +MGAF0_SX22 +MGAF0_SX382 +MGAG0_SA2 +MGAK0_SX226 +MGAK0_SX46 +MGAR0_SX132 +MGAW0_SI535 +MGAW0_SX175 +MGES0_SA1 +MGES0_SI2111 +MGES0_SI851 +MGJC0_SA2 +MGJC0_SX75 +MGRL0_SI2127 +MGRL0_SI867 +MGRL0_SX147 +MGRP0_SA2 +MGSH0_SA2 +MGSH0_SI1806 +MGSH0_SX127 +MGSH0_SX276 +MGSH0_SX6 +MGSL0_SA1 +MGSL0_SI534 +MGSL0_SX264 +MGXP0_SX187 +MGXP0_SX7 +MHBS0_SX315 +MHBS0_SX45 +MHIT0_SA1 +MHJB0_SA1 +MHJB0_SI1017 +MHMG0_SX195 +MHMR0_SA1 +MHMR0_SI489 +MHRM0_SA1 +MHRM0_SI958 +MHRM0_SX148 +MHRM0_SX58 +MHXL0_SI1772 +MHXL0_SX242 +MILB0_SA2 +MJAC0_SX307 +MJAC0_SX71 +MJAE0_SX174 +MJAI0_SA1 +MJAI0_SA2 +MJBG0_SX62 +MJDA0_SI1031 +MJDA0_SX311 +MJDE0_SI463 +MJDG0_SA2 +MJDG0_SI1042 +MJDG0_SI1705 +MJDM0_SA1 +MJDM0_SI974 +MJEB0_SI656 +MJEB0_SX296 +MJEB1_SA2 +MJEB1_SX207 +MJEB1_SX387 +MJEE0_SA1 +MJEE0_SX247 +MJEE0_SX337 +MJFH0_SA2 +MJFH0_SI1107 +MJFR0_SX75 +MJHI0_SA1 +MJHI0_SX158 +MJJB0_SA1 +MJJB0_SX239 +MJJJ0_SX443 +MJJM0_SA2 +MJJM0_SI827 +MJJM0_SX107 +MJKR0_SA1 +MJKR0_SI571 +MJLB0_SX176 +MJLG1_SX292 +MJLS0_SX106 +MJMA0_SA1 +MJMA0_SA2 +MJMD0_SA2 +MJMD0_SX308 +MJMD0_SX38 +MJMM0_SX85 +MJPG0_SI1191 +MJPG0_SX111 +MJPG0_SX201 +MJPG0_SX21 +MJPM0_SA2 +MJPM0_SX378 +MJPM1_SI2280 +MJPM1_SX401 +MJRA0_SA1 +MJRA0_SA2 +MJRA0_SI1236 +MJRA0_SI1866 +MJRA0_SX426 +MJRG0_SI1366 +MJRG0_SI1996 +MJRG0_SX376 +MJRH0_SX225 +MJRH1_SA1 +MJRH1_SI514 +MJRH1_SX154 +MJRH1_SX244 +MJRH1_SX424 +MJRK0_SA1 +MJRK0_SA2 +MJRK0_SI1662 +MJRK0_SX160 +MJRK0_SX250 +MJRK0_SX430 +MJRP0_SA1 +MJRP0_SA2 +MJRP0_SX225 +MJSR0_SA1 +MJSR0_SI1424 +MJSR0_SX344 +MJWG0_SA1 +MJWG0_SX265 +MJWS0_SI513 +MJWS0_SX153 +MJWS0_SX63 +MJWT0_SA1 +MJWT0_SX121 +MJWT0_SX211 +MJWT0_SX301 +MJWT0_SX31 +MJWT0_SX391 +MJXA0_SX427 +MJXL0_SI542 +MKAG0_SA1 +MKAG0_SX259 +MKAJ0_SA2 +MKAJ0_SX154 +MKAM0_SA1 +MKAM0_SX146 +MKAM0_SX326 +MKAM0_SX56 +MKDB0_SA1 +MKDB0_SA2 +MKDB0_SX152 +MKDD0_SA2 +MKES0_SA1 +MKES0_SI1253 +MKES0_SI1883 +MKES0_SX173 +MKJO0_SI1517 +MKJO0_SI887 +MKJO0_SX437 +MKLN0_SI968 +MKLN0_SX248 +MKLR0_SA2 +MKLR0_SI1689 +MKLS0_SA1 +MKLS0_SX357 +MKLS0_SX87 +MKLS1_SA1 +MKLS1_SA2 +MKLS1_SX375 +MKLW0_SA1 +MKRG0_SX411 +MKXL0_SA2 +MKXL0_SX15 +MKXL0_SX375 +MLBC0_SA1 +MLBC0_SI1869 +MLBC0_SX249 +MLEL0_SA1 +MLEL0_SA2 +MLEL0_SI1246 +MLEL0_SX256 +MLEL0_SX436 +MLJC0_SX145 +MLJC0_SX415 +MLJH0_SX64 +MLNS0_SI2037 +MMAA0_SA1 +MMAA0_SA2 +MMAA0_SX35 +MMAB1_SI1494 +MMAB1_SX234 +MMAG0_SA2 +MMAG0_SI1126 +MMAG0_SX316 +MMAM0_SI2227 +MMAM0_SX157 +MMAM0_SX427 +MMAR0_SX256 +MMBS0_SI1781 +MMCC0_SA2 +MMDB0_SX177 +MMDG0_SA1 +MMDG0_SA2 +MMDG0_SI520 +MMDG0_SX160 +MMDG0_SX250 +MMDM0_SI1941 +MMDM0_SI681 +MMDM0_SX141 +MMDM1_SA2 +MMDM1_SI2043 +MMDM1_SX423 +MMDM1_SX63 +MMDS0_SA1 +MMEA0_SA1 +MMEA0_SX128 +MMEA0_SX398 +MMEB0_SA2 +MMEB0_SX187 +MMEB0_SX367 +MMGC0_SA2 +MMGC0_SX135 +MMGC0_SX225 +MMGG0_SX269 +MMGK0_SX332 +MMGK0_SX62 +MMJB1_SA2 +MMRP0_SA2 +MMRP0_SX144 +MMSM0_SX116 +MMSM0_SX206 +MMVP0_SA1 +MMVP0_SA2 +MMWB0_SI989 +MMWB0_SX89 +MMWS0_SA2 +MMWS0_SX168 +MMWS0_SX348 +MMWS0_SX438 +MMWS1_SI1701 +MMXS0_SI2136 +MMXS0_SX246 +MMXS0_SX426 +MNET0_SI816 +MNET0_SX6 +MNTW0_SA2 +MNTW0_SX168 +MNTW0_SX78 +MPAR0_SI2206 +MPAR0_SI946 +MPAR0_SX136 +MPAR0_SX316 +MPEB0_SI1034 +MPEB0_SI1860 +MPEB0_SX240 +MPEB0_SX330 +MPFU0_SI628 +MPFU0_SX448 +MPGH0_SX114 +MPGH0_SX24 +MPGR0_SX240 +MPGR0_SX330 +MPGR1_SX149 +MPPC0_SA1 +MPRD0_SA1 +MPRD0_SX261 +MPRD0_SX351 +MPRD0_SX441 +MPRD0_SX81 +MPRK0_SI1727 +MPRK0_SX107 +MPRK0_SX377 +MPRT0_SA1 +MPRT0_SX310 +MPSW0_SI1067 +MPSW0_SX167 +MPSW0_SX437 +MRAB1_SX128 +MRAB1_SX308 +MRAI0_SA1 +MRAI0_SA2 +MRAI0_SX72 +MRAM0_SA1 +MRAM0_SA2 +MRAM0_SX15 +MRBC0_SI1859 +MRBC0_SX329 +MRBC0_SX419 +MRCG0_SI798 +MRCG0_SX168 +MRCW0_SA1 +MRCW0_SX291 +MRDD0_SI1680 +MRDD0_SX150 +MRDD0_SX277 +MRDD0_SX60 +MRDM0_SI1595 +MRDM0_SX65 +MRDS0_SA1 +MREE0_SX24 +MREH1_SX249 +MREH1_SX69 +MREM0_SA2 +MREW1_SI870 +MRFK0_SX446 +MRFL0_SA1 +MRFL0_SX256 +MRFL0_SX436 +MRFL0_SX76 +MRGM0_SA2 +MRGM0_SX262 +MRGS0_SA2 +MRGS0_SX186 +MRHL0_SI885 +MRHL0_SX345 +MRHL0_SX435 +MRJB1_SA1 +MRJB1_SA2 +MRJB1_SX210 +MRJB1_SX30 +MRJB1_SX390 +MRJH0_SA2 +MRJH0_SX307 +MRJH0_SX79 +MRJM0_SX148 +MRJM1_SA2 +MRJM1_SI1298 +MRJM1_SI1928 +MRJM1_SX128 +MRJT0_SA2 +MRJT0_SI1498 +MRJT0_SX328 +MRJT0_SX418 +MRKM0_SA2 +MRKM0_SX367 +MRLD0_SA2 +MRLD0_SI2224 +MRLD0_SX154 +MRLD0_SX424 +MRLJ0_SA1 +MRLJ0_SX250 +MRLJ0_SX340 +MRLJ1_SA1 +MRLJ1_SA2 +MRLJ1_SX321 +MRLK0_SI843 +MRLK0_SX123 +MRLK0_SX213 +MRMB0_SA2 +MRMB0_SI1581 +MRMB0_SX411 +MRMG0_SA1 +MRMG0_SI1080 +MRMG0_SX450 +MRMH0_SI1349 +MRMH0_SI2281 +MRMH0_SX121 +MRML0_SA2 +MRML0_SX341 +MRPC1_SI2112 +MRRE0_SA2 +MRRE0_SX164 +MRRE0_SX344 +MRRE0_SX74 +MRSO0_SX129 +MRSO0_SX39 +MRSP0_SX259 +MRTC0_SX378 +MRVG0_SI1140 +MRVG0_SX240 +MRWA0_SI973 +MRWA0_SX163 +MRWA0_SX73 +MRWS0_SI1732 +MRWS0_SI472 +MRWS0_SX22 +MRWS0_SX382 +MRXB0_SA2 +MRXB0_SX415 +MSAH1_SI1679 +MSAS0_SX116 +MSAS0_SX206 +MSAS0_SX386 +MSAT0_SA1 +MSAT1_SX263 +MSAT1_SX443 +MSAT1_SX83 +MSDB0_SX197 +MSDB0_SX287 +MSDB0_SX377 +MSDH0_SI2240 +MSDH0_SX440 +MSDH0_SX80 +MSDS0_SA1 +MSEM1_SI1440 +MSEM1_SX180 +MSEM1_SX270 +MSES0_SI1589 +MSES0_SX239 +MSES0_SX419 +MSFH0_SX316 +MSFV0_SI1892 +MSFV0_SX362 +MSFV0_SX92 +MSMR0_SX415 +MSMS0_SA1 +MSMS0_SX173 +MSMS0_SX83 +MSRG0_SA1 +MSRG0_SI1221 +MSTF0_SI766 +MSTF0_SX316 +MSTF0_SX46 +MSVS0_SA2 +MSVS0_SX308 +MTAS0_SX215 +MTAS0_SX35 +MTAS0_SX395 +MTAT0_SX390 +MTAT1_SX59 +MTBC0_SI1803 +MTCS0_SA2 +MTCS0_SI2265 +MTCS0_SX82 +MTDP0_SA2 +MTER0_SA2 +MTER0_SI1787 +MTJG0_SA1 +MTJG0_SI2157 +MTJG0_SX260 +MTJM0_SI1856 +MTJM0_SX146 +MTJU0_SX130 +MTJU0_SX400 +MTKD0_SX107 +MTKD0_SX287 +MTKP0_SI1023 +MTLB0_SA1 +MTLB0_SX234 +MTLC0_SA1 +MTML0_SI2325 +MTML0_SX165 +MTMN0_SA2 +MTMN0_SI1064 +MTMN0_SI2324 +MTMN0_SX434 +MTMT0_SA2 +MTMT0_SI1748 +MTPF0_SX65 +MTPG0_SI1383 +MTPG0_SI753 +MTPG0_SX303 +MTPP0_SX338 +MTPR0_SX340 +MTQC0_SI480 +MTQC0_SX91 +MTRR0_SX198 +MTRR0_SX288 +MTRT0_SA2 +MTRT0_SX254 +MTRT0_SX57 +MTWH1_SX72 +MTXS0_SA1 +MTXS0_SA2 +MVJH0_SI926 +MVJH0_SX206 +MVJH0_SX296 +MVLO0_SA1 +MVRW0_SA2 +MVRW0_SX135 +MVRW0_SX225 +MWAC0_SA2 +MWAC0_SX341 +MWAC0_SX431 +MWAD0_SX432 +MWAD0_SX72 +MWAR0_SA1 +MWAR0_SI1675 +MWCH0_SI1895 +MWCH0_SI2252 +MWCH0_SX182 +MWCH0_SX452 +MWDK0_SA1 +MWDK0_SA2 +MWDK0_SI2017 +MWDK0_SI806 +MWDK0_SX176 +MWDK0_SX86 +MWEM0_SA2 +MWEM0_SI1320 +MWEM0_SI1393 +MWEM0_SX150 +MWGR0_SX346 +MWRE0_SX247 +MWRE0_SX337 +MWRE0_SX427 +MWRP0_SA1 +MWRP0_SX273 +MWRP0_SX363 +MWSB0_SX276 +MWSH0_SX256 +MWSH0_SX76 +MZMB0_SA1 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/valid.uid b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/valid.uid new file mode 100644 index 0000000..e99edfe --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/config/timit_unmatched/valid.uid @@ -0,0 +1,620 @@ +FAEM0_SI1392 +FAJW0_SI1263 +FAJW0_SI633 +FALK0_SI658 +FALR0_SX335 +FAPB0_SI1063 +FAPB0_SI2323 +FAPB0_SX433 +FBAS0_SI1472 +FBAS0_SI2066 +FBCG1_SX352 +FBCH0_SI959 +FBJL0_SI922 +FBLV0_SI1688 +FBMH0_SI1136 +FBMH0_SI970 +FBMJ0_SA1 +FBMJ0_SI1776 +FBMJ0_SI516 +FBMJ0_SX336 +FCDR1_SI1186 +FCDR1_SI1816 +FCDR1_SI556 +FCDR1_SX286 +FCKE0_SI1741 +FCKE0_SI481 +FCLT0_SI808 +FCMG0_SI1142 +FCMG0_SX432 +FCMM0_SI1957 +FCMM0_SX420 +FCYL0_SI667 +FCYL0_SX349 +FDAS1_SI1461 +FDAS1_SI831 +FDAW0_SI1271 +FDAW0_SI2036 +FDJH0_SI935 +FDKN0_SI1202 +FDKN0_SX181 +FDKN0_SX451 +FDMY0_SA1 +FDMY0_SI567 +FDMY0_SI714 +FDMY0_SX387 +FDNC0_SI1278 +FDNC0_SI1908 +FDTD0_SA1 +FDTD0_SX321 +FEAC0_SI615 +FEAR0_SX352 +FECD0_SA1 +FECD0_SI1418 +FECD0_SI788 +FEME0_SI875 +FEME0_SX335 +FEXM0_SA1 +FEXM0_SI482 +FEXM0_SX366 +FGDP0_SI988 +FGDP0_SX88 +FGMB0_SI1145 +FGMB0_SX335 +FGRW0_SA1 +FGRW0_SI1152 +FGRW0_SX162 +FGRW0_SX432 +FHLM0_SX120 +FHLM0_SX349 +FHXS0_SA1 +FHXS0_SI1075 +FHXS0_SI2302 +FHXS0_SX175 +FJDM2_SA2 +FJDM2_SX142 +FJEN0_SA1 +FJEN0_SX327 +FJEN0_SX417 +FJHK0_SI2282 +FJKL0_SI932 +FJLG0_SI1889 +FJLR0_SI1231 +FJRB0_SX402 +FJRP1_SA1 +FJRP1_SI1432 +FJRP1_SX262 +FJRP1_SX352 +FJSK0_SI1052 +FJSP0_SI1434 +FJWB1_SI748 +FJXM0_SX311 +FJXM0_SX41 +FJXP0_SI1752 +FKAA0_SA1 +FKDE0_SI1141 +FKDE0_SI1771 +FKDW0_SI1207 +FKDW0_SI1891 +FKFB0_SI1608 +FKFB0_SX438 +FKKH0_SI1290 +FKKH0_SI1920 +FKLC0_SI985 +FKLC0_SX175 +FKLC1_SI1048 +FKLH0_SI1257 +FKSR0_SX366 +FLAC0_SI1339 +FLAG0_SI1464 +FLAG0_SI834 +FLEH0_SI1051 +FLET0_SI507 +FLJA0_SI1078 +FLJA0_SX178 +FLJD0_SI1516 +FLJG0_SI981 +FLJG0_SX171 +FLJG0_SX351 +FLKM0_SA1 +FLKM0_SI620 +FLKM0_SX350 +FLKM0_SX440 +FLMC0_SI1372 +FLMK0_SA1 +FLMK0_SI1229 +FLTM0_SX170 +FLTM0_SX350 +FLTM0_SX440 +FMAH1_SI879 +FMBG0_SI1160 +FMEM0_SA1 +FMEM0_SX333 +FMJB0_SI1177 +FMJF0_SI624 +FMJF0_SX174 +FMJF0_SX84 +FMJU0_SI1389 +FMKC0_SI1041 +FMKF0_SI1018 +FMPG0_SA1 +FMPG0_SI972 +FMPG0_SX162 +FMPG0_SX342 +FMPG0_SX432 +FNKL0_SI892 +FNTB0_SI679 +FPAB1_SA1 +FPAB1_SI2101 +FPAB1_SI841 +FPAC0_SI1921 +FPAC0_SI661 +FPAD0_SI716 +FPAD0_SX176 +FPAF0_SA1 +FPAF0_SI1054 +FPAZ0_SI2223 +FPAZ0_SI963 +FPJF0_SI1259 +FPJF0_SX352 +FPLS0_SI960 +FPMY0_SI1153 +FPMY0_SI523 +FREH0_SI1945 +FRLL0_SI805 +FSAG0_SI1323 +FSAG0_SX153 +FSAG0_SX333 +FSAG0_SX423 +FSAH0_SI614 +FSAH0_SX327 +FSAK0_SI1300 +FSBK0_SX349 +FSCN0_SA1 +FSCN0_SI705 +FSCN0_SX176 +FSDC0_SI1312 +FSDJ0_SI1115 +FSGF0_SI2187 +FSGF0_SI927 +FSJG0_SA1 +FSJG0_SA2 +FSJG0_SI940 +FSJG0_SX220 +FSJG0_SX40 +FSJG0_SX400 +FSJS0_SA1 +FSJS0_SX451 +FSJW0_SI1333 +FSKP0_SI1098 +FSMA0_SI991 +FSMA0_SX451 +FSMM0_SX324 +FSPM0_SI1241 +FSPM0_SX251 +FSRH0_SX311 +FSSB0_SI1712 +FSSB0_SX362 +FTBR0_SI1402 +FTBR0_SI921 +FTBW0_SI715 +FTBW0_SX175 +FTLG0_SI1743 +FTLG0_SI483 +FTMG0_SI902 +FVFB0_SI1510 +FVKB0_SX349 +FVMH0_SI1466 +FVMH0_SI836 +MADC0_SI1367 +MADC0_SI737 +MAEB0_SI1411 +MAEO0_SI1326 +MAJP0_SI1704 +MAJP0_SX174 +MAKB0_SA2 +MAKB0_SI1016 +MAKB0_SI2276 +MAKB0_SX116 +MAPV0_SI1293 +MAPV0_SI663 +MARW0_SX286 +MARW0_SX349 +MBBR0_SI1055 +MBBR0_SX335 +MBCG0_SI957 +MBCG0_SX327 +MBGT0_SI1841 +MBGT0_SX171 +MBMA0_SI1222 +MBMA1_SI954 +MBMA1_SX324 +MBTH0_SI2102 +MBWP0_SX349 +MCAE0_SI1447 +MCAE0_SI2077 +MCAE0_SI817 +MCAL0_SI1138 +MCDR0_SI1784 +MCDR0_SI524 +MCEF0_SI842 +MCEW0_SA1 +MCEW0_SI2072 +MCEW0_SI812 +MCEW0_SX362 +MCEW0_SX452 +MCHL0_SI1347 +MCHL0_SI1404 +MCLK0_SI2290 +MCLK0_SI650 +MCPM0_SI1824 +MCSS0_SI1380 +MCSS0_SI688 +MCTM0_SI1350 +MCTM0_SI1980 +MDAC0_SI631 +MDAS0_SI1896 +MDAS0_SI636 +MDBP0_SI528 +MDBP0_SX438 +MDCD0_SI785 +MDCD0_SX335 +MDCM0_SI1480 +MDDC0_SI1419 +MDED0_SI540 +MDEF0_SI1123 +MDEM0_SA1 +MDEM0_SI608 +MDEM0_SI800 +MDEM0_SX428 +MDHS0_SI900 +MDJM0_SI1455 +MDKS0_SX166 +MDKS0_SX346 +MDLB0_SI1306 +MDLB0_SX136 +MDLB0_SX406 +MDLC0_SI1395 +MDLC0_SI2025 +MDLC1_SI1435 +MDLH0_SX160 +MDLH0_SX430 +MDLM0_SI604 +MDLR0_SX333 +MDLR1_SI669 +MDMA0_SX170 +MDMA0_SX350 +MDMA0_SX440 +MDNS0_SI1011 +MDNS0_SI873 +MDPB0_SI1760 +MDPB0_SI866 +MDRD0_SI752 +MDSJ0_SI1462 +MDSJ0_SX438 +MDWD0_SI1260 +MDWH0_SA1 +MDWH0_SI1168 +MDWH0_SI665 +MDWM0_SI916 +MEDR0_SI2004 +MEFG0_SI491 +MEFG0_SI598 +MEGJ0_SA1 +MEGJ0_SI1337 +MEGJ0_SI707 +MEGJ0_SX167 +MEJS0_SI1240 +MESG0_SI702 +MESJ0_SI2039 +MFWK0_SX349 +MFXS0_SX324 +MFXV0_SI1005 +MFXV0_SI1342 +MGAF0_SI1282 +MGAG0_SI691 +MGAK0_SI1036 +MGAK0_SX136 +MGAR0_SX312 +MGAW0_SI1165 +MGES0_SX311 +MGJC0_SX435 +MGRL0_SX327 +MGRP0_SI1317 +MGRP0_SX327 +MGSH0_SI1176 +MGSH0_SI546 +MGSL0_SI797 +MGXP0_SI1087 +MGXP0_SI525 +MHBS0_SI945 +MHIT0_SI983 +MHMG0_SI735 +MHMR0_SI1692 +MILB0_SI903 +MJAC0_SI701 +MJAC0_SX251 +MJAE0_SX84 +MJAI0_SI682 +MJAI0_SI710 +MJDC0_SI531 +MJDE0_SA1 +MJDE0_SI1120 +MJDE0_SI490 +MJDE0_SX220 +MJDM0_SI1340 +MJDM0_SX170 +MJDM0_SX350 +MJEB0_SX170 +MJEB1_SI1467 +MJEB1_SI837 +MJFR0_SA1 +MJFR0_SX435 +MJHI0_SI1328 +MJJJ0_SI1163 +MJJM0_SI1251 +MJLB0_SI1616 +MJLS0_SI1726 +MJMA0_SI2125 +MJMD0_SI2288 +MJMM0_SI1255 +MJMM0_SX175 +MJPG0_SI1821 +MJPM0_SI1368 +MJPM1_SX311 +MJRA0_SX336 +MJRG0_SI736 +MJRG0_SX352 +MJRH0_SI1840 +MJRH1_SI1558 +MJRK0_SI880 +MJRP0_SI1845 +MJSR0_SI2054 +MJSR0_SI794 +MJWG0_SI813 +MJWG0_SI895 +MJWG0_SX175 +MJWS0_SX333 +MJWT0_SI1291 +MJWT0_SI1381 +MJXL0_SI1172 +MKAG0_SI979 +MKAH0_SX178 +MKAM0_SI1250 +MKAM0_SI1465 +MKDD0_SI1567 +MKDD0_SI2197 +MKDD0_SI937 +MKDT0_SI814 +MKES0_SI623 +MKLS0_SI1437 +MKLS0_SI2067 +MKLS1_SI915 +MKLW0_SI1571 +MKLW0_SX311 +MKRG0_SI861 +MKXL0_SI1815 +MKXL0_SI1958 +MLBC0_SI1239 +MLEL0_SI616 +MLEL0_SX166 +MLJC0_SI1225 +MLJH0_SA1 +MLJH0_SA2 +MLJH0_SI1422 +MLJH0_SI694 +MLJH0_SX244 +MLSH0_SI1417 +MLSH0_SX247 +MMAA0_SI1588 +MMAA0_SI845 +MMAB1_SI864 +MMAB1_SX324 +MMAG0_SA1 +MMAG0_SI1756 +MMAG0_SX136 +MMAR0_SI1966 +MMAR0_SX166 +MMAR0_SX346 +MMBS0_SI521 +MMBS0_SX161 +MMCC0_SI1338 +MMDB0_SI987 +MMDG0_SI1780 +MMDM0_SI1311 +MMDM1_SX153 +MMDM1_SX333 +MMEB0_SX327 +MMGC0_SI1305 +MMGG0_SI1079 +MMGG0_SX449 +MMLM0_SI2150 +MMPM0_SX161 +MMRP0_SX324 +MMSM0_SI1106 +MMSM0_SI476 +MMVP0_SI654 +MMVP0_SX347 +MMWB0_SA1 +MMWB0_SI2249 +MMWB0_SX359 +MMWB0_SX449 +MNTW0_SI1068 +MNTW0_SI1698 +MPEB0_SI600 +MPFU0_SI1258 +MPGH0_SI675 +MPGR0_SI1410 +MPGR1_SI1499 +MPMB0_SA1 +MPMB0_SA2 +MPMB0_SI1501 +MPMB0_SI2131 +MPMB0_SI871 +MPMB0_SX151 +MPMB0_SX331 +MPMB0_SX421 +MPMB0_SX61 +MPPC0_SI1412 +MPRB0_SI1215 +MPRB0_SI575 +MPRD0_SI801 +MPRD0_SX171 +MPRK0_SA1 +MPRK0_SI1097 +MPRK0_SI467 +MPRK0_SX287 +MRAB0_SI1854 +MRAB1_SI848 +MRAI0_SI2052 +MRAI0_SI792 +MRAI0_SX432 +MRAM0_SI1951 +MRCG0_SA2 +MRCG0_SI1428 +MRCG0_SX348 +MRCG0_SX438 +MRCW0_SI741 +MRDM0_SI1044 +MRDM0_SX335 +MREE0_SI1104 +MREE0_SI1959 +MREH1_SA1 +MREH1_SI1599 +MREH1_SI969 +MREM0_SI511 +MRFK0_SI1076 +MRFL0_SI1156 +MRFL0_SI526 +MRFL0_SX166 +MRGM0_SI532 +MRGM0_SX172 +MRGM0_SX442 +MRGS0_SI1356 +MRGS0_SI726 +MRGS0_SX6 +MRJB1_SI1413 +MRJB1_SI2021 +MRJB1_SX120 +MRJH0_SI1519 +MRJH0_SI889 +MRJH0_SX169 +MRJT0_SI868 +MRJT0_SX58 +MRKM0_SI1267 +MRKM0_SI1391 +MRKM0_SI637 +MRLJ0_SI790 +MRLJ1_SI2301 +MRLK0_SI1468 +MRLR0_SI1196 +MRML0_SA1 +MRML0_SI1421 +MRML0_SX161 +MRML0_SX251 +MRMS0_SI2057 +MRRE0_SA1 +MRRE0_SI1334 +MRRE0_SI952 +MRSO0_SI1206 +MRSP0_SI1429 +MRTC0_SI1458 +MRTJ0_SA1 +MRTJ0_SI772 +MRTJ0_SX142 +MRTJ0_SX232 +MRTJ0_SX52 +MRWS0_SI1102 +MRXB0_SI2215 +MRXB0_SI955 +MSAS0_SI1376 +MSAS0_SI746 +MSDH0_SI980 +MSDH0_SX170 +MSDS0_SI1077 +MSDS0_SX267 +MSDS0_SX357 +MSEM1_SI2070 +MSEM1_SI810 +MSFH0_SA1 +MSFH0_SI1738 +MSFH0_SX136 +MSFH0_SX406 +MSFV0_SI632 +MSJK0_SI1596 +MSJK0_SX336 +MSMC0_SI509 +MSMR0_SI1150 +MSMS0_SI1433 +MSRR0_SI1761 +MSRR0_SI501 +MSTF0_SI852 +MSVS0_SI2198 +MSVS0_SI938 +MSVS0_SX398 +MTAB0_SI1572 +MTAB0_SX312 +MTAT0_SA1 +MTAT0_SI1110 +MTAT0_SI811 +MTAT1_SI779 +MTAT1_SX149 +MTAT1_SX329 +MTBC0_SI543 +MTCS0_SI712 +MTDB0_SI1401 +MTDB0_SI771 +MTDP0_SA1 +MTDP0_SI1521 +MTDP0_SX171 +MTDP0_SX351 +MTER0_SA1 +MTER0_SI1157 +MTER0_SX437 +MTJG0_SX170 +MTJS0_SA2 +MTJS0_SI1822 +MTJS0_SI562 +MTJS0_SX382 +MTJU0_SI2020 +MTKD0_SI630 +MTKP0_SI2283 +MTKP0_SI454 +MTLB0_SI1134 +MTLB0_SX324 +MTLC0_SI1313 +MTLC0_SI1477 +MTML0_SX435 +MTMN0_SI582 +MTMT0_SI488 +MTPP0_SI1508 +MTPR0_SI2230 +MTPR0_SX160 +MTPR0_SX430 +MTQC0_SA1 +MTQC0_SI1441 +MTQC0_SX181 +MTQC0_SX451 +MTRC0_SI589 +MTRR0_SI918 +MTRT0_SI1227 +MTXS0_SI1060 +MTXS0_SI2320 +MTXS0_SX160 +MTXS0_SX430 +MVJH0_SI1556 +MVLO0_SI517 +MWAC0_SI1601 +MWAC0_SX161 +MWAC0_SX251 +MWAR0_SI1045 +MWDK0_SI1436 +MWEM0_SX420 +MWRE0_SA2 +MWRE0_SI1057 +MWRE0_SX67 +MWRP0_SI1443 +MWSB0_SI996 +MWSH0_SI1426 +MWSH0_SI796 +MWSH0_SX166 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/__init__.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/__init__.py new file mode 100644 index 0000000..d054562 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .extracted_features_dataset import ExtractedFeaturesDataset +from .random_input_dataset import RandomInputDataset + + +__all__ = [ + "ExtractedFeaturesDataset", + "RandomInputDataset", +] diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/extracted_features_dataset.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/extracted_features_dataset.py new file mode 100644 index 0000000..d6ee9c4 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/extracted_features_dataset.py @@ -0,0 +1,144 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import logging +import os +import contextlib + +import numpy as np +import torch + +from fairseq.data import FairseqDataset, data_utils + + +logger = logging.getLogger(__name__) + + +class ExtractedFeaturesDataset(FairseqDataset): + def __init__( + self, + path, + split, + min_length=3, + max_length=None, + labels=None, + label_dict=None, + shuffle=True, + sort_by_length=True, + ): + super().__init__() + + self.min_length = min_length + self.max_length = max_length + self.shuffle = shuffle + self.sort_by_length = sort_by_length + self.label_dict = label_dict + + if labels is not None: + assert label_dict is not None + + self.sizes = [] + self.offsets = [] + self.labels = [] + + path = os.path.join(path, split) + data_path = path + self.data = np.load(data_path + ".npy", mmap_mode="r") + + offset = 0 + skipped = 0 + + if not os.path.exists(path + f".{labels}"): + labels = None + + with open(data_path + ".lengths", "r") as len_f, open( + path + f".{labels}", "r" + ) if labels is not None else contextlib.ExitStack() as lbl_f: + for line in len_f: + length = int(line.rstrip()) + lbl = None if labels is None else next(lbl_f).rstrip().split() + if length >= min_length and ( + max_length is None or length <= max_length + ): + self.sizes.append(length) + self.offsets.append(offset) + if lbl is not None: + self.labels.append(lbl) + offset += length + + self.sizes = np.asarray(self.sizes) + self.offsets = np.asarray(self.offsets) + + logger.info(f"loaded {len(self.offsets)}, skipped {skipped} samples") + + def __getitem__(self, index): + offset = self.offsets[index] + end = self.sizes[index] + offset + feats = torch.from_numpy(self.data[offset:end].copy()).float() + + res = {"id": index, "features": feats} + if len(self.labels) > 0: + res["target"] = self.label_dict.encode_line( + self.labels[index], + line_tokenizer=lambda x: x, + append_eos=False, + ) + + return res + + def __len__(self): + return len(self.sizes) + + def collater(self, samples): + if len(samples) == 0: + return {} + + features = [s["features"] for s in samples] + sizes = [len(s) for s in features] + + target_size = max(sizes) + + collated_features = features[0].new_zeros( + len(features), target_size, features[0].size(-1) + ) + padding_mask = torch.BoolTensor(collated_features.shape[:-1]).fill_(False) + for i, (f, size) in enumerate(zip(features, sizes)): + collated_features[i, :size] = f + padding_mask[i, size:] = True + + res = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": {"features": collated_features, "padding_mask": padding_mask}, + } + + if len(self.labels) > 0: + target = data_utils.collate_tokens( + [s["target"] for s in samples], + pad_idx=self.label_dict.pad(), + left_pad=False, + ) + res["target"] = target + return res + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + return self.sizes[index] + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + if self.sort_by_length: + order.append(self.sizes) + return np.lexsort(order)[::-1] + else: + return order[0] diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/random_input_dataset.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/random_input_dataset.py new file mode 100644 index 0000000..8865056 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/data/random_input_dataset.py @@ -0,0 +1,62 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import random +from typing import List + +from fairseq.data import BaseWrapperDataset, data_utils + + +class RandomInputDataset(BaseWrapperDataset): + def __init__( + self, + dataset, + random_input_dataset, + input_key_path: List[str], + add_to_input, + pad_idx, + ): + super().__init__(dataset) + self.random_input_dataset = random_input_dataset + if isinstance(input_key_path, str): + input_key_path = [input_key_path] + assert len(input_key_path) > 0 + self.input_key_path = input_key_path + self.add_to_input = add_to_input + self.pad_idx = pad_idx + + def get_target(self, item): + target_loc = item + for p in self.input_key_path[:-1]: + target_loc = target_loc[p] + return self.input_key_path[-1], target_loc + + def get_target_value(self, item): + k, target_loc = self.get_target(item) + return target_loc[k] + + def __getitem__(self, index): + item = self.dataset[index] + k, target_loc = self.get_target(item) + target_loc[k] = random.choice(self.random_input_dataset) + return item + + def collater(self, samples): + collated = self.dataset.collater(samples) + if len(collated) == 0: + return collated + indices = set(collated["id"].tolist()) + + random_inputs = data_utils.collate_tokens( + [self.get_target_value(s) for s in samples if s["id"] in indices], + pad_idx=self.pad_idx, + left_pad=False, + ) + k, target_loc = self.get_target( + collated if not self.add_to_input else collated["net_input"] + ) + target_loc[k] = random_inputs + + return collated diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/README.md b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/README.md new file mode 100644 index 0000000..314984f --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/README.md @@ -0,0 +1,56 @@ +# Self-Training with Kaldi HMM Models +This folder contains recipes for self-training on pseudo phone transcripts and +decoding into phones or words with [kaldi](https://github.com/kaldi-asr/kaldi). + +To start, download and install kaldi follow its instruction, and place this +folder in `path/to/kaldi/egs`. + +## Training +Assuming the following has been prepared: +- `w2v_dir`: contains features `{train,valid}.{npy,lengths}`, real transcripts `{train,valid}.${label}`, and dict `dict.${label}.txt` +- `lab_dir`: contains pseudo labels `{train,valid}.txt` +- `arpa_lm`: Arpa-format n-gram phone LM for decoding +- `arpa_lm_bin`: Arpa-format n-gram phone LM for unsupervised model selection to be used with KenLM + +Set these variables in `train.sh`, as well as `out_dir`, the output directory, +and then run it. + +The output will be: +``` +==== WER w.r.t. real transcript (select based on unsupervised metric) +INFO:root:./out/exp/mono/decode_valid/scoring/14.0.0.tra.txt: score 0.9178 wer 28.71% lm_ppl 24.4500 gt_wer 25.57% +INFO:root:./out/exp/tri1/decode_valid/scoring/17.1.0.tra.txt: score 0.9257 wer 26.99% lm_ppl 30.8494 gt_wer 21.90% +INFO:root:./out/exp/tri2b/decode_valid/scoring/8.0.0.tra.txt: score 0.7506 wer 23.15% lm_ppl 25.5944 gt_wer 15.78% +``` +where `wer` is the word eror rate with respect to the pseudo label, `gt_wer` to +the ground truth label, `lm_ppl` the language model perplexity of HMM prediced +transcripts, and `score` is the unsupervised metric for model selection. We +choose the model and the LM parameter of the one with the lowest score. In the +example above, it is `tri2b`, `8.0.0`. + + +## Decoding into Phones +In `decode_phone.sh`, set `out_dir` the same as used in `train.sh`, set +`dec_exp` and `dec_lmparam` to the selected model and LM parameter (e.g. +`tri2b` and `8.0.0` in the above example). `dec_script` needs to be set +according to `dec_exp`: for mono/tri1/tri2b, use `decode.sh`; for tri3b, use +`decode_fmllr.sh`. + +The output will be saved at `out_dir/dec_data` + + +## Decoding into Words +`decode_word_step1.sh` prepares WFSTs for word decoding. Besides the variables +mentioned above, set +- `wrd_arpa_lm`: Arpa-format n-gram word LM for decoding +- `wrd_arpa_lm_bin`: Arpa-format n-gram word LM for unsupervised model selection + +`decode_word_step1.sh` decodes the `train` and `valid` split into word and runs +unsupervised model selection using the `valid` split. The output is like: +``` +INFO:root:./out/exp/tri2b/decodeword_valid/scoring/17.0.0.tra.txt: score 1.8693 wer 24.97% lm_ppl 1785.5333 gt_wer 31.45% +``` + +After determining the LM parameter (`17.0.0` in the example above), set it in +`decode_word_step2.sh` and run it. The output will be saved at +`out_dir/dec_data_word`. diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/cmd.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/cmd.sh new file mode 100644 index 0000000..e749531 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/cmd.sh @@ -0,0 +1,15 @@ +# you can change cmd.sh depending on what type of queue you are using. +# If you have no queueing system and want to run on a local machine, you +# can change all instances 'queue.pl' to run.pl (but be careful and run +# commands one by one: most recipes will exhaust the memory on your +# machine). queue.pl works with GridEngine (qsub). slurm.pl works +# with slurm. Different queues are configured differently, with different +# queue names and different ways of specifying things like memory; +# to account for these differences you can create and edit the file +# conf/queue.conf to match your queue's configuration. Search for +# conf/queue.conf in http://kaldi-asr.org/doc/queue.html for more information, +# or search for the string 'default_config' in utils/queue.pl or utils/slurm.pl. + +export train_cmd="run.pl --mem 2G" +export decode_cmd="run.pl --mem 4G" +export mkgraph_cmd="run.pl --mem 8G" diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_phone.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_phone.sh new file mode 100644 index 0000000..947342a --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_phone.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# decode into phones (and prepare a new data directory for HMM outputs) + +. ./path.sh + +set -eu + +out_dir= # same as in train.sh +dec_lmparam= # LM hyperparameters (e.g., 7.0.0) +dec_exp= +dec_script= +dec_splits="train valid" +dec_data_dir=$out_dir/dec_data # where to write HMM output + +data_dir=${out_dir}/data + +local/decode.sh --nj 40 --graph_name graph \ + --val_sets "$dec_splits" --decode_script $dec_script \ + $out_dir/exp/$dec_exp $data_dir $data_dir/lang_test + +if [ ! -z $dec_lmparam ]; then + for x in $dec_splits; do + mkdir -p $dec_data_dir/$x + cp $data_dir/$x/{feats.scp,cmvn.scp,utt2spk,spk2utt} $dec_data_dir/$x/ + + tra=$out_dir/exp/$dec_exp/decode_${x}/scoring/${dec_lmparam}.tra + cat $tra | utils/int2sym.pl -f 2- $data_dir/lang/words.txt | \ + sed 's:<UNK>::g' | sed 's:<SIL>::g' > $dec_data_dir/${x}/text + utils/fix_data_dir.sh $dec_data_dir/${x} + echo "WER on ${x} is" $(compute-wer ark:$data_dir/${x}_gt/text ark:$dec_data_dir/$x/text | cut -d" " -f2-) + done +fi diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step1.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step1.sh new file mode 100644 index 0000000..c1276bb --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step1.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# prepare word WFSTs, reference data, and decode + +set -eu + +w2v_dir= # same as in train.sh +out_dir= # same as in train.sh +lexicon= # word to phone mapping +wrd_arpa_lm= # word LM +wrd_arpa_lm_bin= # word LM for KenLM, used in unsupervised selection + +dec_exp= # what HMM stage to decode (e.g., tri3b) +dec_script= # what decoding script to use (e.g., steps/decode_fmllr.sh) +phn_label=phnc +wrd_label=wrd +dec_suffix=word +dec_splits="train valid" +valid_split="valid" + +data_dir=$out_dir/data +wrd_data_dir=$out_dir/data_word + +lexicon_clean=$(mktemp) +cat $lexicon | sort | uniq > $lexicon_clean +local/prepare_lang_word.sh $w2v_dir/dict.${phn_label}.txt $data_dir $lexicon_clean && rm $lexicon_clean +local/prepare_lm.sh --langdir $data_dir/lang_word --lmdir $data_dir/lang_test_word $wrd_arpa_lm $data_dir + +for x in $dec_splits; do + x_gt=${x}_gt + mkdir -p $wrd_data_dir/$x_gt + cp $data_dir/$x_gt/{feats.scp,cmvn.scp,utt2spk,spk2utt} $wrd_data_dir/$x_gt/ + python local/copy_aligned_text.py < $w2v_dir/$x.$wrd_label > $wrd_data_dir/$x_gt/text +done + +local/decode.sh --nj 40 --graph_name graph${dec_suffix} --decode_suffix $dec_suffix \ + --val_sets "$dec_splits" --decode_script $dec_script \ + $out_dir/exp/$dec_exp $data_dir $data_dir/lang_test_word + +local/unsup_select_decode_word.sh \ + --split $valid_split --kenlm_path $wrd_arpa_lm_bin \ + --ref_txt $wrd_data_dir/${valid_split}_gt/text \ + --psd_txt $data_dir/${valid_split}/text \ + --dec_name decode${dec_suffix} --graph_name graph${dec_suffix} \ + --phonemize_lexicon $data_dir/local/dict_word/lexicon.txt \ + $out_dir/exp diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step2.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step2.sh new file mode 100644 index 0000000..59a6cbb --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/decode_word_step2.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# prepare a new data directory of HMM word output + +. ./path.sh + +set -eu + +out_dir= # same as in train.sh +dec_lmparam= # LM hyperparameters (e.g., 7.0.0) + +dec_exp=tri3b # what HMM stage to decode (e.g., tri3b) +dec_suffix=word +dec_splits="train valid" +dec_data_dir=$out_dir/dec_data_word # where to write HMM output + +data_dir=$out_dir/data +wrd_data_dir=$out_dir/data_word + +for x in $dec_splits; do + mkdir -p $dec_data_dir/$x + cp $data_dir/$x/{feats.scp,cmvn.scp,utt2spk,spk2utt} $dec_data_dir/$x/ + + tra=$out_dir/exp/$dec_exp/decode${dec_suffix}_${x}/scoring/${dec_lmparam}.tra + cat $tra | utils/int2sym.pl -f 2- $data_dir/lang_word/words.txt | \ + sed 's:<UNK>::g' | sed 's:<SIL>::g' > $dec_data_dir/$x/text + utils/fix_data_dir.sh $dec_data_dir/$x + echo "WER on $x is" $(compute-wer ark:$wrd_data_dir/${x}_gt/text ark:$dec_data_dir/$x/text | cut -d" " -f2-) +done + diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/copy_aligned_text.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/copy_aligned_text.py new file mode 100644 index 0000000..5f4faa9 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/copy_aligned_text.py @@ -0,0 +1,4 @@ +import sys + +for idx, line in enumerate(sys.stdin): + print(f"utt{idx:010d} {line}", end='') \ No newline at end of file diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/decode.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/decode.sh new file mode 100644 index 0000000..811cb63 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/decode.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +set -u + +val_sets="dev_other" +graph_name=graph +decode_suffix="" +decode_script="steps/decode_fmllr.sh" +decode_args="" +nj=60 + +. ./cmd.sh +. ./path.sh +. parse_options.sh + +set -x +exp_dir=$1 +data_root=$2 +lang_test=$3 + +graph=$exp_dir/$graph_name + +if [ ! -d $graph ]; then + utils/mkgraph.sh $lang_test $exp_dir $graph +fi + +for part in $val_sets; do + dec_dir=$exp_dir/decode${decode_suffix}_${part} + if [ ! -d $dec_dir ]; then + echo "decoding $part for $exp_dir" + $decode_script --nj $nj --cmd "$decode_cmd" $decode_args \ + $graph $data_root/$part $dec_dir & + else + echo "$dec_dir exists. skip" + fi +done + +wait diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_data_from_w2v.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_data_from_w2v.py new file mode 100644 index 0000000..66954ea --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_data_from_w2v.py @@ -0,0 +1,56 @@ +import kaldi_io +import numpy as np +import os + + +def get_parser(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("w2v_dir", help="wav2vec feature and text directory") + parser.add_argument("tar_root", help="output data directory in kaldi's format") + parser.add_argument("split", help="name of the subset") + parser.add_argument("--label", default="", help="if specified, copy labels too") + return parser + +def main(): + parser = get_parser() + args = parser.parse_args() + + tar_dir = os.path.join(args.tar_root, args.split) + os.makedirs(tar_dir, exist_ok=True) + + lengths_path = os.path.join(args.w2v_dir, f"{args.split}.lengths") + with open(lengths_path) as f: + lengths = [int(line.rstrip()) for line in f] + offsets = [0] + np.cumsum(lengths[:-1]).tolist() + feats = np.load( + os.path.join(args.w2v_dir, f"{args.split}.npy"), + mmap_mode="r" + ) + assert feats.shape[0] == sum(lengths), \ + f"lengths mismatch {feats.shape[0]} != {sum(lengths)}" + + ark_path = os.path.join(tar_dir, "feats.ark") + scp_path = os.path.join(tar_dir, "feats.scp") + wspec = f"ark:| copy-feats --compress=true ark:- ark,scp:{ark_path},{scp_path}" + with kaldi_io.open_or_fd(wspec, "wb") as f: + for idx, (offset, length) in enumerate(zip(offsets, lengths)): + feat = feats[offset:offset+length] + kaldi_io.write_mat(f, feat, key=f"utt{idx:010d}") + + u2s_path = os.path.join(tar_dir, "utt2spk") + s2u_path = os.path.join(tar_dir, "spk2utt") + with open(u2s_path, "w") as f_u2s, open(s2u_path, "w") as f_s2u: + for idx in range(len(lengths)): + f_u2s.write(f"utt{idx:010d} utt{idx:010d}\n") + f_s2u.write(f"utt{idx:010d} utt{idx:010d}\n") + + if bool(args.label): + lab_path = os.path.join(args.w2v_dir, f"{args.split}.{args.label}") + txt_path = os.path.join(tar_dir, "text") + with open(lab_path) as f_lab, open(txt_path, "w") as f_txt: + for idx, line in enumerate(f_lab): + f_txt.write(f"utt{idx:010d} {line}") + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang.sh new file mode 100644 index 0000000..e9a8000 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +sil_prob=0.5 +num_sil_states=3 +num_nonsil_states=1 + +. ./cmd.sh +. ./path.sh +. parse_options.sh + +set -eux + +dict=$1 +data_dir=$2 + +dict_dir=$data_dir/local/dict +tmplm_dir=$data_dir/local/lang_tmp +lm_dir=$data_dir/lang + +mkdir -p $dict_dir $tmplm_dir $lm_dir + +# prepare dict +echo "SIL" > $dict_dir/silence_phones.txt +echo "SIL" > $dict_dir/optional_silence.txt +awk '{print $1}' $dict > $dict_dir/nonsilence_phones.txt + +echo "SIL SIL" > $dict_dir/lexicon.txt +echo "<UNK> SIL" >> $dict_dir/lexicon.txt +awk '{print $1" "$1}' $dict >> $dict_dir/lexicon.txt + +echo "SIL" > $dict_dir/extra_questions.txt +awk '{printf $1" "} END {printf "\n"}' $dict >> $dict_dir/extra_questions.txt + +# prepare lang +utils/prepare_lang.sh --sil-prob $sil_prob --position-dependent-phones false \ + --num_sil_states $num_sil_states --num_nonsil_states $num_nonsil_states \ + $dict_dir "<UNK>" $tmplm_dir $lm_dir diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang_word.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang_word.sh new file mode 100644 index 0000000..a7ea387 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lang_word.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +num_sil_states=3 +num_nonsil_states=1 + +. ./cmd.sh +. ./path.sh +. parse_options.sh + +set -eux + +dict=$1 +data_dir=$2 +lexicon=$3 + +dict_dir=$data_dir/local/dict_word +tmplm_dir=$data_dir/local/lang_tmp_word +lm_dir=$data_dir/lang_word + +mkdir -p $dict_dir $tmplm_dir $lm_dir + +# prepare dict +echo "SIL" > $dict_dir/silence_phones.txt +echo "SIL" > $dict_dir/optional_silence.txt +awk '{print $1}' $dict > $dict_dir/nonsilence_phones.txt + +(echo "!SIL SIL"; echo "<UNK> SIL";) | cat - $lexicon > $dict_dir/lexicon.txt + +echo "SIL" > $dict_dir/extra_questions.txt +awk '{printf $1" "} END {printf "\n"}' $dict >> $dict_dir/extra_questions.txt + +# prepare lang +utils/prepare_lang.sh --position-dependent-phones false \ + --num_sil_states $num_sil_states --num_nonsil_states $num_nonsil_states \ + $dict_dir "<UNK>" $tmplm_dir $lm_dir diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lm.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lm.sh new file mode 100644 index 0000000..c2edcef --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/prepare_lm.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +langdir="" +lmdir="" + +. ./cmd.sh +. ./path.sh +. parse_options.sh + +arpa_lm=$1 +data=$2 + +if [ -z $langdir ]; then + langdir=$data/lang +fi +if [ -z $lmdir ]; then + lmdir=$data/lang_test +fi + +if [ ! -d $langdir ]; then + echo "$langdir not found. run local/prepare_lang.sh first" && exit 1 +fi + +mkdir -p $lmdir +cp -r $langdir/* $lmdir + +if [[ "$arpa_lm" == *.gz ]]; then + gunzip -c $arpa_lm | arpa2fst --disambig-symbol=#0 --read-symbol-table=$lmdir/words.txt - $lmdir/G.fst +else + arpa2fst --disambig-symbol=#0 --read-symbol-table=$lmdir/words.txt $arpa_lm $lmdir/G.fst +fi +fstisstochastic $lmdir/G.fst +utils/validate_lang.pl $lmdir || exit 1 + +echo "done preparing lm ($lmdir)" diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/score.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/score.sh new file mode 100644 index 0000000..cb5bbb7 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/score.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# Copyright 2012 Johns Hopkins University (Author: Daniel Povey) +# 2014 Guoguo Chen +# Apache 2.0 + +[ -f ./path.sh ] && . ./path.sh + +# begin configuration section. +cmd=run.pl +stage=0 +decode_mbr=true +word_ins_penalty=0.0,0.5,1.0 +min_lmwt=7 +max_lmwt=17 +iter=final +#end configuration section. + +[ -f ./path.sh ] && . ./path.sh +. parse_options.sh || exit 1; + +if [ $# -ne 3 ]; then + echo "Usage: local/score.sh [--cmd (run.pl|queue.pl...)] <data-dir> <lang-dir|graph-dir> <decode-dir>" + echo " Options:" + echo " --cmd (run.pl|queue.pl...) # specify how to run the sub-processes." + echo " --stage (0|1|2) # start scoring script from part-way through." + echo " --decode_mbr (true/false) # maximum bayes risk decoding (confusion network)." + echo " --min_lmwt <int> # minumum LM-weight for lattice rescoring " + echo " --max_lmwt <int> # maximum LM-weight for lattice rescoring " + exit 1; +fi + +data=$1 +lang_or_graph=$2 +dir=$3 + +symtab=$lang_or_graph/words.txt + +for f in $symtab $dir/lat.1.gz $data/text; do + [ ! -f $f ] && echo "score.sh: no such file $f" && exit 1; +done + +mkdir -p $dir/scoring/log + +cat $data/text | sed 's:<NOISE>::g' | sed 's:<SPOKEN_NOISE>::g' > $dir/scoring/test_filt.txt + +for wip in $(echo $word_ins_penalty | sed 's/,/ /g'); do + $cmd LMWT=$min_lmwt:$max_lmwt $dir/scoring/log/best_path.LMWT.$wip.log \ + lattice-scale --inv-acoustic-scale=LMWT "ark:gunzip -c $dir/lat.*.gz|" ark:- \| \ + lattice-add-penalty --word-ins-penalty=$wip ark:- ark:- \| \ + lattice-best-path --word-symbol-table=$symtab \ + ark:- ark,t:$dir/scoring/LMWT.$wip.tra || exit 1; +done + +# Note: the double level of quoting for the sed command +for wip in $(echo $word_ins_penalty | sed 's/,/ /g'); do + $cmd LMWT=$min_lmwt:$max_lmwt $dir/scoring/log/score.LMWT.$wip.log \ + cat $dir/scoring/LMWT.$wip.tra \| \ + utils/int2sym.pl -f 2- $symtab \| sed 's:\<UNK\>::g' \| \ + compute-wer --text --mode=present \ + ark:$dir/scoring/test_filt.txt ark,p:- ">&" $dir/wer_LMWT_$wip || exit 1; +done + +exit 0; diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/show_wer.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/show_wer.sh new file mode 100644 index 0000000..9ecf169 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/show_wer.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +split="dev_other" +ref_data="" +get_best_wer=true +dec_name="decode" +graph_name="graph" + +. ./cmd.sh +. ./path.sh +. parse_options.sh + +exp_root=$1 + +set -eu + +echo "==== WER w.r.t. pseudo transcript" +for x in $exp_root/*/${dec_name}_${split}*; do grep WER $x/wer_* 2>/dev/null | utils/best_wer.sh; done + + +if [ ! -z $ref_data ]; then + echo "==== WER w.r.t. real transcript (select based on pseudo WER)" + ref_txt=$ref_data/$split/text + for x in $exp_root/*/${dec_name}_${split}*; do + lang=$(dirname $x)/$graph_name + + lmwt=$( + grep WER $x/wer_* 2>/dev/null | utils/best_wer.sh | + sed 's/.*wer_\(.*\)$/\1/g' | sed 's/_/./g' + ) + tra=$x/scoring/$lmwt.tra + cat $tra | utils/int2sym.pl -f 2- $lang/words.txt | sed 's:<UNK>::g' | sed 's:<SIL>::g' | \ + compute-wer --text --mode=present \ + ark:$ref_txt ark,p:- 2> /dev/null | grep WER | xargs -I{} echo {} $tra + done +fi + +if [ ! -z $ref_data ] && $get_best_wer; then + echo "==== WER w.r.t. real transcript (select based on true WER)" + ref_txt=$ref_data/$split/text + for x in $exp_root/*/${dec_name}_${split}*; do + lang=$(dirname $x)/$graph_name + + for tra in $x/scoring/*.tra; do + cat $tra | utils/int2sym.pl -f 2- $lang/words.txt | sed 's:<UNK>::g' | sed 's:<SIL>::g' | \ + compute-wer --text --mode=present \ + ark:$ref_txt ark,p:- 2> /dev/null | grep WER | xargs -I{} echo {} $tra + done | sort -k2n | head -n1 + done +fi + +exit 0; diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/train_subset_lgbeam.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/train_subset_lgbeam.sh new file mode 100644 index 0000000..913c1d8 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/train_subset_lgbeam.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash + +out_root=/tmp +out_name=train_${RANDOM} +num_nonsil_states=1 + +valid="dev_other" +train="train" +mono_size="-1" # 2000 +tri1_size="-1" # 5000 +tri2b_size="-1" # 10000 +tri3b_size="-1" # 10000 + +# Acoustic model parameters +numLeavesTri1=2000 +numGaussTri1=10000 +numLeavesMLLT=2500 +numGaussMLLT=15000 +numLeavesSAT=2500 +numGaussSAT=15000 + +stage=1 +max_stage=1 + +. ./cmd.sh +. ./path.sh +. parse_options.sh + +data=$1 +lang=$2 +lang_test=$3 + +exp_root=$out_root/$out_name + +# you might not want to do this for interactive shells. +set -e + + +if [ $stage -le 1 ] && [ $max_stage -ge 1 ]; then + # train a monophone system + if [ ! $mono_size -eq -1 ]; then + utils/subset_data_dir.sh $data/$train $mono_size $data/${train}_${mono_size} + mono_train=${train}_${mono_size} + else + mono_train=${train} + fi + + steps/train_mono.sh --boost-silence 1.25 --nj 20 --cmd "$train_cmd" \ + --initial-beam 40 --regular-beam 60 --retry-beam 120 \ + $data/$mono_train $lang $exp_root/mono + + utils/mkgraph.sh $lang_test $exp_root/mono $exp_root/mono/graph + steps/decode.sh --nj 20 --cmd "$decode_cmd" \ + $exp_root/mono/graph $data/$valid $exp_root/mono/decode_$valid & +fi + + +if [ $stage -le 2 ] && [ $max_stage -ge 2 ]; then + # train a first delta + delta-delta triphone system on a subset of 5000 utterances + if [ ! $tri1_size -eq -1 ]; then + utils/subset_data_dir.sh $data/$train $tri1_size $data/${train}_${tri1_size} + tri1_train=${train}_${tri1_size} + else + tri1_train=${train} + fi + + steps/align_si.sh --boost-silence 1.25 --nj 10 --cmd "$train_cmd" \ + $data/$tri1_train $lang \ + $exp_root/mono $exp_root/mono_ali_${tri1_train} + + steps_gan/train_deltas.sh --boost-silence 1.25 --cmd "$train_cmd" \ + --num_nonsil_states $num_nonsil_states $numLeavesTri1 $numGaussTri1 \ + $data/$tri1_train $lang \ + $exp_root/mono_ali_${tri1_train} $exp_root/tri1 + + utils/mkgraph.sh $lang_test $exp_root/tri1 $exp_root/tri1/graph + steps/decode.sh --nj 20 --cmd "$decode_cmd" \ + $exp_root/tri1/graph $data/$valid $exp_root/tri1/decode_$valid & +fi + +if [ $stage -le 3 ] && [ $max_stage -ge 3 ]; then + # train an LDA+MLLT system. + if [ ! $tri2b_size -eq -1 ]; then + utils/subset_data_dir.sh $data/$train $tri2b_size $data/${train}_${tri2b_size} + tri2b_train=${train}_${tri2b_size} + else + tri2b_train=${train} + fi + + steps/align_si.sh --nj 10 --cmd "$train_cmd" \ + $data/$tri2b_train $lang \ + $exp_root/tri1 $exp_root/tri1_ali_${tri2b_train} + + steps_gan/train_lda_mllt.sh --cmd "$train_cmd" \ + --num_nonsil_states $num_nonsil_states \ + --splice-opts "--left-context=3 --right-context=3" $numLeavesMLLT $numGaussMLLT \ + $data/$tri2b_train $lang \ + $exp_root/tri1_ali_${tri2b_train} $exp_root/tri2b + + utils/mkgraph.sh $lang_test $exp_root/tri2b $exp_root/tri2b/graph + steps/decode.sh --nj 20 --cmd "$decode_cmd" \ + $exp_root/tri2b/graph $data/$valid $exp_root/tri2b/decode_$valid & +fi + + +if [ $stage -le 4 ] && [ $max_stage -ge 4 ]; then + # Train tri3b, which is LDA+MLLT+SAT on 10k utts + if [ ! $tri3b_size -eq -1 ]; then + utils/subset_data_dir.sh $data/$train $tri3b_size $data/${train}_${tri3b_size} + tri3b_train=${train}_${tri3b_size} + else + tri3b_train=${train} + fi + + steps/align_si.sh --nj 10 --cmd "$train_cmd" --use-graphs true \ + $data/$tri3b_train $lang \ + $exp_root/tri2b $exp_root/tri2b_ali_${tri2b_train} + + steps_gan/train_sat.sh --cmd "$train_cmd" \ + --num_nonsil_states $num_nonsil_states $numLeavesSAT $numGaussSAT \ + $data/$tri3b_train $lang \ + $exp_root/tri2b_ali_${tri2b_train} $exp_root/tri3b + + utils/mkgraph.sh $lang_test $exp_root/tri3b $exp_root/tri3b/graph + steps/decode_fmllr.sh --nj 20 --cmd "$decode_cmd" \ + $exp_root/tri3b/graph $data/$valid $exp_root/tri3b/decode_$valid & +fi + +wait diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select.py new file mode 100644 index 0000000..1122c88 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select.py @@ -0,0 +1,135 @@ +""" +Implement unsupervised metric for decoding hyperparameter selection: + $$ alpha * LM_PPL + ViterbitUER(%) * 100 $$ +""" +import argparse +import logging +import math +import sys + +import kenlm +import editdistance +from g2p_en import G2p + +logging.root.setLevel(logging.INFO) +logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logger = logging.getLogger(__name__) + + +def get_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("ref_tra", help="reference pseudo labels") + parser.add_argument("hyp_tra", help="decoded pseudo labels to be assess") + parser.add_argument("--kenlm_path", default="/checkpoint/abaevski/data/speech/libri/librispeech_lm_novox.phnc_o5.bin", help="") + parser.add_argument("--uppercase", action="store_true", help="") + parser.add_argument("--skipwords", default="", help="") + parser.add_argument("--gt_tra", default="", help="ground truth pseudo labels for computing oracle WER") + parser.add_argument("--min_vt_uer", default=0.0, type=float) + parser.add_argument("--phonemize", action="store_true", help="phonemize word hypotheses, used when reference is phone transcript") + parser.add_argument("--phonemize_lexicon", default="", type=str, help="use a lexicon for phonemizing") + return parser + +def load_tra(tra_path): + with open(tra_path, "r") as f: + uid_to_tra = {} + for line in f: + toks = line.rstrip().split() + uid, tra = toks[0], " ".join(toks[1:]) + uid_to_tra[uid] = tra + logger.debug(f"loaded {len(uid_to_tra)} utterances from {tra_path}") + return uid_to_tra + +def load_lex(lex_path): + with open(lex_path, "r") as f: + w2p = {} + for line in f: + w, p = line.rstrip().split(None, 1) + w2p[w] = p.split() + return w2p + +def compute_wer(ref_uid_to_tra, hyp_uid_to_tra, g2p, g2p_dict): + d_cnt = 0 + w_cnt = 0 + w_cnt_h = 0 + for uid in hyp_uid_to_tra: + ref = ref_uid_to_tra[uid].split() + if g2p_dict is not None: + hyp = [] + for word in hyp_uid_to_tra[uid].split(): + if word in g2p_dict: + hyp = hyp + g2p_dict[word] + else: + logger.warning(f"{word} not in g2p_dict") + elif g2p is not None: + hyp = g2p(hyp_uid_to_tra[uid]) + hyp = [p for p in hyp if p != "'" and p != " "] + hyp = [p[:-1] if p[-1].isnumeric() else p for p in hyp] + else: + hyp = hyp_uid_to_tra[uid].split() + logger.debug(( + f"======================\n" + f"HYP: {' '.join(hyp)}\n" + f"REF: {' '.join(ref)}" + )) + d_cnt += editdistance.eval(ref, hyp) + w_cnt += len(ref) + w_cnt_h += len(hyp) + wer = float(d_cnt) / w_cnt + logger.debug(( + f"wer = {wer*100:.2f}%; num. of ref words = {w_cnt}; " + f"num. of hyp words = {w_cnt_h}; num. of sentences = {len(ref_uid_to_tra)}" + )) + return wer + +def compute_lm_ppl(hyp_uid_to_tra, score_fn): + lm_score = 0. + w_cnt = 0 + for hyp in hyp_uid_to_tra.values(): + cur_score = score_fn(hyp) + cur_cnt = len(hyp.split()) + 1 # plus one for </s> + lm_score += cur_score + w_cnt += cur_cnt + logger.debug(( + f"======================\n" + f"score sum/avg = {cur_score:.2f}/{cur_score/cur_cnt:.2f}\n" + f"hyp = {hyp}" + )) + lm_ppl = math.pow(10, -lm_score / w_cnt) + logger.debug(f"lm ppl = {lm_ppl:.2f}; num. of words = {w_cnt}") + return lm_ppl + +def main(): + args = get_parser().parse_args() + logger.debug(f"Args: {args}") + + ref_uid_to_tra = load_tra(args.ref_tra) + hyp_uid_to_tra = load_tra(args.hyp_tra) + assert not bool(set(hyp_uid_to_tra.keys()) - set(ref_uid_to_tra.keys())) + + lm = kenlm.Model(args.kenlm_path) + skipwords = set(args.skipwords.split(",")) + def compute_lm_score(s): + s = " ".join(w for w in s.split() if w not in skipwords) + s = s.upper() if args.uppercase else s + return lm.score(s) + + g2p, g2p_dict = None, None + if args.phonemize: + if args.phonemize_lexicon: + g2p_dict = load_lex(args.phonemize_lexicon) + else: + g2p = G2p() + + wer = compute_wer(ref_uid_to_tra, hyp_uid_to_tra, g2p, g2p_dict) + lm_ppl = compute_lm_ppl(hyp_uid_to_tra, compute_lm_score) + + gt_wer = -math.inf + if args.gt_tra: + gt_uid_to_tra = load_tra(args.gt_tra) + gt_wer = compute_wer(gt_uid_to_tra, hyp_uid_to_tra, None, None) + + score = math.log(lm_ppl) * max(wer, args.min_vt_uer) + logging.info(f"{args.hyp_tra}: score={score:.4f}; wer={wer*100:.2f}%; lm_ppl={lm_ppl:.4f}; gt_wer={gt_wer*100:.2f}%") + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode.sh new file mode 100644 index 0000000..b34c5b6 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +split="dev_other" +ref_txt="" # ground truth transcript path +psd_txt="" # pseudo transcript path +get_best_wer=true +dec_name="decode" +graph_name="graph" +kenlm_path=/checkpoint/abaevski/data/speech/libri/librispeech_lm_novox.phnc_o6.bin + +. ./cmd.sh +. ./path.sh +. parse_options.sh + +exp_root=$1 +unsup_args="" +if [ $# -ge 2 ]; then + unsup_args=$2 +fi + +set -eu + +if [ ! -z $ref_txt ] && $get_best_wer; then + echo "==== WER w.r.t. real transcript (select based on unsupervised metric)" + for x in $exp_root/*/${dec_name}_${split}*; do + lang=$(dirname $x)/$graph_name + + ( + for tra in $x/scoring/*.tra; do + cat $tra | utils/int2sym.pl -f 2- $lang/words.txt | sed 's:<UNK>::g' | sed 's:<SIL>::g' > $tra.txt + python local/unsup_select.py $psd_txt $tra.txt --kenlm_path $kenlm_path --gt_tra $ref_txt $unsup_args + done 2>/dev/null | grep "score=" | sed 's/=/ /g' | sed 's/;//g' | sort -k3n | head -n1 + ) & + done +fi +wait + diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode_word.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode_word.sh new file mode 100644 index 0000000..c10a6b8 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/local/unsup_select_decode_word.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +split="dev_other" +ref_txt="" # ground truth transcript path +psd_txt="" # pseudo transcript path +get_best_wer=true +dec_name="decode" +graph_name="graph" +kenlm_path=/checkpoint/abaevski/data/speech/libri/librispeech_lm_novox.phnc_o6.bin +phonemize_lexicon="" + +. ./cmd.sh +. ./path.sh +. parse_options.sh +. /private/home/wnhsu/unsup_asr/fairseq-py-unsup/env.sh + +exp_root=$1 + +set -eu + +if [ ! -z $ref_txt ] && $get_best_wer; then + echo "==== WER w.r.t. real transcript (select based on unsupervised metric)" + for x in $exp_root/*/${dec_name}_${split}*; do + lang=$(dirname $x)/$graph_name + + for tra in $x/scoring/*.tra; do + cat $tra | utils/int2sym.pl -f 2- $lang/words.txt | sed 's:\<UNK\>::g' > $tra.txt + python local/unsup_select.py $psd_txt $tra.txt \ + --kenlm_path $kenlm_path --gt_tra $ref_txt --phonemize \ + --phonemize_lexicon "$phonemize_lexicon" + done | grep "score=" | sed 's/=/ /g' | sed 's/;//g' | sort -k3n | head -n1 + done +fi + + diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/path.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/path.sh new file mode 100644 index 0000000..1a6fb5f --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/path.sh @@ -0,0 +1,5 @@ +export KALDI_ROOT=`pwd`/../../.. +export PATH=$PWD/utils/:$KALDI_ROOT/tools/openfst/bin:$PWD:$PATH +[ ! -f $KALDI_ROOT/tools/config/common_path.sh ] && echo >&2 "The standard file $KALDI_ROOT/tools/config/common_path.sh is not present -> Exit!" && exit 1 +. $KALDI_ROOT/tools/config/common_path.sh +export LC_ALL=C diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_deltas.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_deltas.sh new file mode 100644 index 0000000..af68715 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_deltas.sh @@ -0,0 +1,175 @@ +#!/usr/bin/env bash + +# Copyright 2012 Johns Hopkins University (Author: Daniel Povey) +# Apache 2.0 + +# Begin configuration. +stage=-4 # This allows restarting after partway, when something when wrong. +config= +cmd=run.pl +scale_opts="--transition-scale=1.0 --acoustic-scale=0.1 --self-loop-scale=0.1" +realign_iters="10 20 30"; +num_iters=35 # Number of iterations of training +max_iter_inc=25 # Last iter to increase #Gauss on. +beam=10 +careful=false +retry_beam=40 +boost_silence=1.0 # Factor by which to boost silence likelihoods in alignment +power=0.25 # Exponent for number of gaussians according to occurrence counts +cluster_thresh=-1 # for build-tree control final bottom-up clustering of leaves +norm_vars=false # deprecated. Prefer --cmvn-opts "--norm-vars=true" + # use the option --cmvn-opts "--norm-means=false" +cmvn_opts= +delta_opts= +context_opts= # use"--context-width=5 --central-position=2" for quinphone +num_nonsil_states=3 +# End configuration. + +echo "$0 $@" # Print the command line for logging + +[ -f path.sh ] && . ./path.sh; +. parse_options.sh || exit 1; + +if [ $# != 6 ]; then + echo "Usage: steps/train_deltas.sh <num-leaves> <tot-gauss> <data-dir> <lang-dir> <alignment-dir> <exp-dir>" + echo "e.g.: steps/train_deltas.sh 2000 10000 data/train_si84_half data/lang exp/mono_ali exp/tri1" + echo "main options (for others, see top of script file)" + echo " --cmd (utils/run.pl|utils/queue.pl <queue opts>) # how to run jobs." + echo " --config <config-file> # config containing options" + echo " --stage <stage> # stage to do partial re-run from." + exit 1; +fi + +numleaves=$1 +totgauss=$2 +data=$3 +lang=$4 +alidir=$5 +dir=$6 + +for f in $alidir/final.mdl $alidir/ali.1.gz $data/feats.scp $lang/phones.txt; do + [ ! -f $f ] && echo "train_deltas.sh: no such file $f" && exit 1; +done + +numgauss=$numleaves +incgauss=$[($totgauss-$numgauss)/$max_iter_inc] # per-iter increment for #Gauss +oov=`cat $lang/oov.int` || exit 1; +ciphonelist=`cat $lang/phones/context_indep.csl` || exit 1; +nj=`cat $alidir/num_jobs` || exit 1; +mkdir -p $dir/log +echo $nj > $dir/num_jobs + +utils/lang/check_phones_compatible.sh $lang/phones.txt $alidir/phones.txt || exit 1; +cp $lang/phones.txt $dir || exit 1; + +sdata=$data/split$nj; +split_data.sh $data $nj || exit 1; + + +[ $(cat $alidir/cmvn_opts 2>/dev/null | wc -c) -gt 1 ] && [ -z "$cmvn_opts" ] && \ + echo "$0: warning: ignoring CMVN options from source directory $alidir" +$norm_vars && cmvn_opts="--norm-vars=true $cmvn_opts" +echo $cmvn_opts > $dir/cmvn_opts # keep track of options to CMVN. +[ ! -z $delta_opts ] && echo $delta_opts > $dir/delta_opts + +feats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | add-deltas $delta_opts ark:- ark:- |" + +rm $dir/.error 2>/dev/null + +if [ $stage -le -3 ]; then + echo "$0: accumulating tree stats" + $cmd JOB=1:$nj $dir/log/acc_tree.JOB.log \ + acc-tree-stats $context_opts \ + --ci-phones=$ciphonelist $alidir/final.mdl "$feats" \ + "ark:gunzip -c $alidir/ali.JOB.gz|" $dir/JOB.treeacc || exit 1; + sum-tree-stats $dir/treeacc $dir/*.treeacc 2>$dir/log/sum_tree_acc.log || exit 1; + rm $dir/*.treeacc +fi + +if [ $stage -le -2 ]; then + echo "$0: getting questions for tree-building, via clustering" + # preparing questions, roots file... + cluster-phones --pdf-class-list=$(($num_nonsil_states / 2)) $context_opts \ + $dir/treeacc $lang/phones/sets.int \ + $dir/questions.int 2> $dir/log/questions.log || exit 1; + cat $lang/phones/extra_questions.int >> $dir/questions.int + compile-questions $context_opts $lang/topo $dir/questions.int \ + $dir/questions.qst 2>$dir/log/compile_questions.log || exit 1; + + echo "$0: building the tree" + $cmd $dir/log/build_tree.log \ + build-tree $context_opts --verbose=1 --max-leaves=$numleaves \ + --cluster-thresh=$cluster_thresh $dir/treeacc $lang/phones/roots.int \ + $dir/questions.qst $lang/topo $dir/tree || exit 1; + + $cmd $dir/log/init_model.log \ + gmm-init-model --write-occs=$dir/1.occs \ + $dir/tree $dir/treeacc $lang/topo $dir/1.mdl || exit 1; + if grep 'no stats' $dir/log/init_model.log; then + echo "** The warnings above about 'no stats' generally mean you have phones **" + echo "** (or groups of phones) in your phone set that had no corresponding data. **" + echo "** You should probably figure out whether something went wrong, **" + echo "** or whether your data just doesn't happen to have examples of those **" + echo "** phones. **" + fi + + gmm-mixup --mix-up=$numgauss $dir/1.mdl $dir/1.occs $dir/1.mdl 2>$dir/log/mixup.log || exit 1; + rm $dir/treeacc +fi + +if [ $stage -le -1 ]; then + # Convert the alignments. + echo "$0: converting alignments from $alidir to use current tree" + $cmd JOB=1:$nj $dir/log/convert.JOB.log \ + convert-ali $alidir/final.mdl $dir/1.mdl $dir/tree \ + "ark:gunzip -c $alidir/ali.JOB.gz|" "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1; +fi + +if [ $stage -le 0 ]; then + echo "$0: compiling graphs of transcripts" + $cmd JOB=1:$nj $dir/log/compile_graphs.JOB.log \ + compile-train-graphs --read-disambig-syms=$lang/phones/disambig.int $dir/tree $dir/1.mdl $lang/L.fst \ + "ark:utils/sym2int.pl --map-oov $oov -f 2- $lang/words.txt < $sdata/JOB/text |" \ + "ark:|gzip -c >$dir/fsts.JOB.gz" || exit 1; +fi + +x=1 +while [ $x -lt $num_iters ]; do + echo "$0: training pass $x" + if [ $stage -le $x ]; then + if echo $realign_iters | grep -w $x >/dev/null; then + echo "$0: aligning data" + mdl="gmm-boost-silence --boost=$boost_silence `cat $lang/phones/optional_silence.csl` $dir/$x.mdl - |" + $cmd JOB=1:$nj $dir/log/align.$x.JOB.log \ + gmm-align-compiled $scale_opts --beam=$beam --retry-beam=$retry_beam --careful=$careful "$mdl" \ + "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" \ + "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1; + fi + $cmd JOB=1:$nj $dir/log/acc.$x.JOB.log \ + gmm-acc-stats-ali $dir/$x.mdl "$feats" \ + "ark,s,cs:gunzip -c $dir/ali.JOB.gz|" $dir/$x.JOB.acc || exit 1; + $cmd $dir/log/update.$x.log \ + gmm-est --mix-up=$numgauss --power=$power \ + --write-occs=$dir/$[$x+1].occs $dir/$x.mdl \ + "gmm-sum-accs - $dir/$x.*.acc |" $dir/$[$x+1].mdl || exit 1; + rm $dir/$x.mdl $dir/$x.*.acc + rm $dir/$x.occs + fi + [ $x -le $max_iter_inc ] && numgauss=$[$numgauss+$incgauss]; + x=$[$x+1]; +done + +rm $dir/final.mdl $dir/final.occs 2>/dev/null +ln -s $x.mdl $dir/final.mdl +ln -s $x.occs $dir/final.occs + +steps/diagnostic/analyze_alignments.sh --cmd "$cmd" $lang $dir + +# Summarize warning messages... +utils/summarize_warnings.pl $dir/log + +steps/info/gmm_dir_info.pl $dir + +echo "$0: Done training system with delta+delta-delta features in $dir" + +exit 0 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_lda_mllt.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_lda_mllt.sh new file mode 100644 index 0000000..9d8c319 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_lda_mllt.sh @@ -0,0 +1,239 @@ +#!/usr/bin/env bash + +# Copyright 2012 Johns Hopkins University (Author: Daniel Povey) +# +# LDA+MLLT refers to the way we transform the features after computing +# the MFCCs: we splice across several frames, reduce the dimension (to 40 +# by default) using Linear Discriminant Analysis), and then later estimate, +# over multiple iterations, a diagonalizing transform known as MLLT or STC. +# See http://kaldi-asr.org/doc/transform.html for more explanation. +# +# Apache 2.0. + +# Begin configuration. +cmd=run.pl +config= +stage=-5 +scale_opts="--transition-scale=1.0 --acoustic-scale=0.1 --self-loop-scale=0.1" +realign_iters="10 20 30"; +mllt_iters="2 4 6 12"; +num_iters=35 # Number of iterations of training +max_iter_inc=25 # Last iter to increase #Gauss on. +dim=40 +beam=10 +retry_beam=40 +careful=false +boost_silence=1.0 # Factor by which to boost silence likelihoods in alignment +power=0.25 # Exponent for number of gaussians according to occurrence counts +randprune=4.0 # This is approximately the ratio by which we will speed up the + # LDA and MLLT calculations via randomized pruning. +splice_opts= +cluster_thresh=-1 # for build-tree control final bottom-up clustering of leaves +norm_vars=false # deprecated. Prefer --cmvn-opts "--norm-vars=false" +cmvn_opts= +context_opts= # use "--context-width=5 --central-position=2" for quinphone. +# End configuration. +train_tree=true # if false, don't actually train the tree. +use_lda_mat= # If supplied, use this LDA[+MLLT] matrix. +num_nonsil_states=3 + +echo "$0 $@" # Print the command line for logging + +[ -f path.sh ] && . ./path.sh +. parse_options.sh || exit 1; + +if [ $# != 6 ]; then + echo "Usage: steps/train_lda_mllt.sh [options] <#leaves> <#gauss> <data> <lang> <alignments> <dir>" + echo " e.g.: steps/train_lda_mllt.sh 2500 15000 data/train_si84 data/lang exp/tri1_ali_si84 exp/tri2b" + echo "Main options (for others, see top of script file)" + echo " --cmd (utils/run.pl|utils/queue.pl <queue opts>) # how to run jobs." + echo " --config <config-file> # config containing options" + echo " --stage <stage> # stage to do partial re-run from." + exit 1; +fi + +numleaves=$1 +totgauss=$2 +data=$3 +lang=$4 +alidir=$5 +dir=$6 + +for f in $alidir/final.mdl $alidir/ali.1.gz $data/feats.scp $lang/phones.txt; do + [ ! -f $f ] && echo "train_lda_mllt.sh: no such file $f" && exit 1; +done + +numgauss=$numleaves +incgauss=$[($totgauss-$numgauss)/$max_iter_inc] # per-iter #gauss increment +oov=`cat $lang/oov.int` || exit 1; +nj=`cat $alidir/num_jobs` || exit 1; +silphonelist=`cat $lang/phones/silence.csl` || exit 1; +ciphonelist=`cat $lang/phones/context_indep.csl` || exit 1; + +mkdir -p $dir/log + +utils/lang/check_phones_compatible.sh $lang/phones.txt $alidir/phones.txt || exit 1; +cp $lang/phones.txt $dir || exit 1; + +echo $nj >$dir/num_jobs +echo "$splice_opts" >$dir/splice_opts # keep track of frame-splicing options + # so that later stages of system building can know what they were. + + +[ $(cat $alidir/cmvn_opts 2>/dev/null | wc -c) -gt 1 ] && [ -z "$cmvn_opts" ] && \ + echo "$0: warning: ignoring CMVN options from source directory $alidir" +$norm_vars && cmvn_opts="--norm-vars=true $cmvn_opts" +echo $cmvn_opts > $dir/cmvn_opts # keep track of options to CMVN. + +sdata=$data/split$nj; +split_data.sh $data $nj || exit 1; + +splicedfeats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | splice-feats $splice_opts ark:- ark:- |" +# Note: $feats gets overwritten later in the script. +feats="$splicedfeats transform-feats $dir/0.mat ark:- ark:- |" + + + +if [ $stage -le -5 ]; then + if [ -z "$use_lda_mat" ]; then + echo "$0: Accumulating LDA statistics." + rm $dir/lda.*.acc 2>/dev/null + $cmd JOB=1:$nj $dir/log/lda_acc.JOB.log \ + ali-to-post "ark:gunzip -c $alidir/ali.JOB.gz|" ark:- \| \ + weight-silence-post 0.0 $silphonelist $alidir/final.mdl ark:- ark:- \| \ + acc-lda --rand-prune=$randprune $alidir/final.mdl "$splicedfeats" ark,s,cs:- \ + $dir/lda.JOB.acc || exit 1; + est-lda --write-full-matrix=$dir/full.mat --dim=$dim $dir/0.mat $dir/lda.*.acc \ + 2>$dir/log/lda_est.log || exit 1; + rm $dir/lda.*.acc + else + echo "$0: Using supplied LDA matrix $use_lda_mat" + cp $use_lda_mat $dir/0.mat || exit 1; + [ ! -z "$mllt_iters" ] && \ + echo "$0: Warning: using supplied LDA matrix $use_lda_mat but we will do MLLT," && \ + echo " which you might not want; to disable MLLT, specify --mllt-iters ''" && \ + sleep 5 + fi +fi + +cur_lda_iter=0 + +if [ $stage -le -4 ] && $train_tree; then + echo "$0: Accumulating tree stats" + $cmd JOB=1:$nj $dir/log/acc_tree.JOB.log \ + acc-tree-stats $context_opts \ + --ci-phones=$ciphonelist $alidir/final.mdl "$feats" \ + "ark:gunzip -c $alidir/ali.JOB.gz|" $dir/JOB.treeacc || exit 1; + [ `ls $dir/*.treeacc | wc -w` -ne "$nj" ] && echo "$0: Wrong #tree-accs" && exit 1; + $cmd $dir/log/sum_tree_acc.log \ + sum-tree-stats $dir/treeacc $dir/*.treeacc || exit 1; + rm $dir/*.treeacc +fi + + +if [ $stage -le -3 ] && $train_tree; then + echo "$0: Getting questions for tree clustering." + # preparing questions, roots file... + cluster-phones --pdf-class-list=$(($num_nonsil_states / 2)) $context_opts $dir/treeacc $lang/phones/sets.int \ + $dir/questions.int 2> $dir/log/questions.log || exit 1; + cat $lang/phones/extra_questions.int >> $dir/questions.int + compile-questions $context_opts $lang/topo $dir/questions.int \ + $dir/questions.qst 2>$dir/log/compile_questions.log || exit 1; + + echo "$0: Building the tree" + $cmd $dir/log/build_tree.log \ + build-tree $context_opts --verbose=1 --max-leaves=$numleaves \ + --cluster-thresh=$cluster_thresh $dir/treeacc $lang/phones/roots.int \ + $dir/questions.qst $lang/topo $dir/tree || exit 1; +fi + +if [ $stage -le -2 ]; then + echo "$0: Initializing the model" + if $train_tree; then + gmm-init-model --write-occs=$dir/1.occs \ + $dir/tree $dir/treeacc $lang/topo $dir/1.mdl 2> $dir/log/init_model.log || exit 1; + grep 'no stats' $dir/log/init_model.log && echo "This is a bad warning."; + rm $dir/treeacc + else + cp $alidir/tree $dir/ || exit 1; + $cmd JOB=1 $dir/log/init_model.log \ + gmm-init-model-flat $dir/tree $lang/topo $dir/1.mdl \ + "$feats subset-feats ark:- ark:-|" || exit 1; + fi +fi + + +if [ $stage -le -1 ]; then + # Convert the alignments. + echo "$0: Converting alignments from $alidir to use current tree" + $cmd JOB=1:$nj $dir/log/convert.JOB.log \ + convert-ali $alidir/final.mdl $dir/1.mdl $dir/tree \ + "ark:gunzip -c $alidir/ali.JOB.gz|" "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1; +fi + +if [ $stage -le 0 ] && [ "$realign_iters" != "" ]; then + echo "$0: Compiling graphs of transcripts" + $cmd JOB=1:$nj $dir/log/compile_graphs.JOB.log \ + compile-train-graphs --read-disambig-syms=$lang/phones/disambig.int $dir/tree $dir/1.mdl $lang/L.fst \ + "ark:utils/sym2int.pl --map-oov $oov -f 2- $lang/words.txt < $data/split$nj/JOB/text |" \ + "ark:|gzip -c >$dir/fsts.JOB.gz" || exit 1; +fi + + +x=1 +while [ $x -lt $num_iters ]; do + echo Training pass $x + if echo $realign_iters | grep -w $x >/dev/null && [ $stage -le $x ]; then + echo Aligning data + mdl="gmm-boost-silence --boost=$boost_silence `cat $lang/phones/optional_silence.csl` $dir/$x.mdl - |" + $cmd JOB=1:$nj $dir/log/align.$x.JOB.log \ + gmm-align-compiled $scale_opts --beam=$beam --retry-beam=$retry_beam --careful=$careful "$mdl" \ + "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" \ + "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1; + fi + if echo $mllt_iters | grep -w $x >/dev/null; then + if [ $stage -le $x ]; then + echo "$0: Estimating MLLT" + $cmd JOB=1:$nj $dir/log/macc.$x.JOB.log \ + ali-to-post "ark:gunzip -c $dir/ali.JOB.gz|" ark:- \| \ + weight-silence-post 0.0 $silphonelist $dir/$x.mdl ark:- ark:- \| \ + gmm-acc-mllt --rand-prune=$randprune $dir/$x.mdl "$feats" ark:- $dir/$x.JOB.macc \ + || exit 1; + est-mllt $dir/$x.mat.new $dir/$x.*.macc 2> $dir/log/mupdate.$x.log || exit 1; + gmm-transform-means $dir/$x.mat.new $dir/$x.mdl $dir/$x.mdl \ + 2> $dir/log/transform_means.$x.log || exit 1; + compose-transforms --print-args=false $dir/$x.mat.new $dir/$cur_lda_iter.mat $dir/$x.mat || exit 1; + rm $dir/$x.*.macc + fi + feats="$splicedfeats transform-feats $dir/$x.mat ark:- ark:- |" + cur_lda_iter=$x + fi + + if [ $stage -le $x ]; then + $cmd JOB=1:$nj $dir/log/acc.$x.JOB.log \ + gmm-acc-stats-ali $dir/$x.mdl "$feats" \ + "ark,s,cs:gunzip -c $dir/ali.JOB.gz|" $dir/$x.JOB.acc || exit 1; + $cmd $dir/log/update.$x.log \ + gmm-est --write-occs=$dir/$[$x+1].occs --mix-up=$numgauss --power=$power \ + $dir/$x.mdl "gmm-sum-accs - $dir/$x.*.acc |" $dir/$[$x+1].mdl || exit 1; + rm $dir/$x.mdl $dir/$x.*.acc $dir/$x.occs + fi + [ $x -le $max_iter_inc ] && numgauss=$[$numgauss+$incgauss]; + x=$[$x+1]; +done + +rm $dir/final.{mdl,mat,occs} 2>/dev/null +ln -s $x.mdl $dir/final.mdl +ln -s $x.occs $dir/final.occs +ln -s $cur_lda_iter.mat $dir/final.mat + +steps/diagnostic/analyze_alignments.sh --cmd "$cmd" $lang $dir + +# Summarize warning messages... +utils/summarize_warnings.pl $dir/log + +steps/info/gmm_dir_info.pl $dir + +echo "$0: Done training system with LDA+MLLT features in $dir" + +exit 0 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_sat.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_sat.sh new file mode 100644 index 0000000..f75afaf --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/steps_gan/train_sat.sh @@ -0,0 +1,281 @@ +#!/usr/bin/env bash +# Copyright 2012 Johns Hopkins University (Author: Daniel Povey). Apache 2.0. + + +# This does Speaker Adapted Training (SAT), i.e. train on +# fMLLR-adapted features. It can be done on top of either LDA+MLLT, or +# delta and delta-delta features. If there are no transforms supplied +# in the alignment directory, it will estimate transforms itself before +# building the tree (and in any case, it estimates transforms a number +# of times during training). + + +# Begin configuration section. +stage=-5 +exit_stage=-100 # you can use this to require it to exit at the + # beginning of a specific stage. Not all values are + # supported. +fmllr_update_type=full +cmd=run.pl +scale_opts="--transition-scale=1.0 --acoustic-scale=0.1 --self-loop-scale=0.1" +beam=10 +retry_beam=40 +careful=false +boost_silence=1.0 # Factor by which to boost silence likelihoods in alignment +context_opts= # e.g. set this to "--context-width 5 --central-position 2" for quinphone. +realign_iters="10 20 30"; +fmllr_iters="2 4 6 12"; +silence_weight=0.0 # Weight on silence in fMLLR estimation. +num_iters=35 # Number of iterations of training +max_iter_inc=25 # Last iter to increase #Gauss on. +power=0.2 # Exponent for number of gaussians according to occurrence counts +cluster_thresh=-1 # for build-tree control final bottom-up clustering of leaves +phone_map= +train_tree=true +tree_stats_opts= +cluster_phones_opts= +compile_questions_opts= +# End configuration section. +num_nonsil_states=3 + +echo "$0 $@" # Print the command line for logging + +[ -f path.sh ] && . ./path.sh +. parse_options.sh || exit 1; + +if [ $# != 6 ]; then + echo "Usage: steps/train_sat.sh <#leaves> <#gauss> <data> <lang> <ali-dir> <exp-dir>" + echo " e.g.: steps/train_sat.sh 2500 15000 data/train_si84 data/lang exp/tri2b_ali_si84 exp/tri3b" + echo "Main options (for others, see top of script file)" + echo " --cmd (utils/run.pl|utils/queue.pl <queue opts>) # how to run jobs." + echo " --config <config-file> # config containing options" + echo " --stage <stage> # stage to do partial re-run from." + exit 1; +fi + +numleaves=$1 +totgauss=$2 +data=$3 +lang=$4 +alidir=$5 +dir=$6 + +for f in $data/feats.scp $lang/phones.txt $alidir/final.mdl $alidir/ali.1.gz; do + [ ! -f $f ] && echo "train_sat.sh: no such file $f" && exit 1; +done + +numgauss=$numleaves +incgauss=$[($totgauss-$numgauss)/$max_iter_inc] # per-iter #gauss increment +oov=`cat $lang/oov.int` +nj=`cat $alidir/num_jobs` || exit 1; +silphonelist=`cat $lang/phones/silence.csl` +ciphonelist=`cat $lang/phones/context_indep.csl` || exit 1; +sdata=$data/split$nj; +splice_opts=`cat $alidir/splice_opts 2>/dev/null` # frame-splicing options. +cmvn_opts=`cat $alidir/cmvn_opts 2>/dev/null` +delta_opts=`cat $alidir/delta_opts 2>/dev/null` +phone_map_opt= +[ ! -z "$phone_map" ] && phone_map_opt="--phone-map='$phone_map'" + +mkdir -p $dir/log +cp $alidir/splice_opts $dir 2>/dev/null # frame-splicing options. +cp $alidir/cmvn_opts $dir 2>/dev/null # cmn/cmvn option. +cp $alidir/delta_opts $dir 2>/dev/null # delta option. + +utils/lang/check_phones_compatible.sh $lang/phones.txt $alidir/phones.txt || exit 1; +cp $lang/phones.txt $dir || exit 1; + +echo $nj >$dir/num_jobs +[[ -d $sdata && $data/feats.scp -ot $sdata ]] || split_data.sh $data $nj || exit 1; + +# Set up features. + +if [ -f $alidir/final.mat ]; then feat_type=lda; else feat_type=delta; fi +echo "$0: feature type is $feat_type" + +## Set up speaker-independent features. +case $feat_type in + delta) sifeats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | add-deltas $delta_opts ark:- ark:- |";; + lda) sifeats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | splice-feats $splice_opts ark:- ark:- | transform-feats $alidir/final.mat ark:- ark:- |" + cp $alidir/final.mat $dir + cp $alidir/full.mat $dir 2>/dev/null + ;; + *) echo "$0: invalid feature type $feat_type" && exit 1; +esac + +## Get initial fMLLR transforms (possibly from alignment dir) +if [ -f $alidir/trans.1 ]; then + echo "$0: Using transforms from $alidir" + feats="$sifeats transform-feats --utt2spk=ark:$sdata/JOB/utt2spk ark,s,cs:$alidir/trans.JOB ark:- ark:- |" + cur_trans_dir=$alidir +else + if [ $stage -le -5 ]; then + echo "$0: obtaining initial fMLLR transforms since not present in $alidir" + # The next line is necessary because of $silphonelist otherwise being incorrect; would require + # old $lang dir which would require another option. Not needed anyway. + [ ! -z "$phone_map" ] && \ + echo "$0: error: you must provide transforms if you use the --phone-map option." && exit 1; + $cmd JOB=1:$nj $dir/log/fmllr.0.JOB.log \ + ali-to-post "ark:gunzip -c $alidir/ali.JOB.gz|" ark:- \| \ + weight-silence-post $silence_weight $silphonelist $alidir/final.mdl ark:- ark:- \| \ + gmm-est-fmllr --fmllr-update-type=$fmllr_update_type \ + --spk2utt=ark:$sdata/JOB/spk2utt $alidir/final.mdl "$sifeats" \ + ark:- ark:$dir/trans.JOB || exit 1; + fi + feats="$sifeats transform-feats --utt2spk=ark:$sdata/JOB/utt2spk ark,s,cs:$dir/trans.JOB ark:- ark:- |" + cur_trans_dir=$dir +fi + +if [ $stage -le -4 ] && $train_tree; then + # Get tree stats. + echo "$0: Accumulating tree stats" + $cmd JOB=1:$nj $dir/log/acc_tree.JOB.log \ + acc-tree-stats $context_opts $tree_stats_opts $phone_map_opt --ci-phones=$ciphonelist $alidir/final.mdl "$feats" \ + "ark:gunzip -c $alidir/ali.JOB.gz|" $dir/JOB.treeacc || exit 1; + [ "`ls $dir/*.treeacc | wc -w`" -ne "$nj" ] && echo "$0: Wrong #tree-accs" && exit 1; + $cmd $dir/log/sum_tree_acc.log \ + sum-tree-stats $dir/treeacc $dir/*.treeacc || exit 1; + rm $dir/*.treeacc +fi + +if [ $stage -le -3 ] && $train_tree; then + echo "$0: Getting questions for tree clustering." + # preparing questions, roots file... + cluster-phones --pdf-class-list=$(($num_nonsil_states / 2)) \ + $cluster_phones_opts $context_opts \ + $dir/treeacc $lang/phones/sets.int $dir/questions.int 2>$dir/log/questions.log || exit 1; + cat $lang/phones/extra_questions.int >> $dir/questions.int + compile-questions $context_opts $compile_questions_opts $lang/topo $dir/questions.int $dir/questions.qst 2>$dir/log/compile_questions.log || exit 1; + + echo "$0: Building the tree" + $cmd $dir/log/build_tree.log \ + build-tree $context_opts --verbose=1 --max-leaves=$numleaves \ + --cluster-thresh=$cluster_thresh $dir/treeacc $lang/phones/roots.int \ + $dir/questions.qst $lang/topo $dir/tree || exit 1; +fi + +if [ $stage -le -2 ]; then + echo "$0: Initializing the model" + if $train_tree; then + gmm-init-model --write-occs=$dir/1.occs \ + $dir/tree $dir/treeacc $lang/topo $dir/1.mdl 2> $dir/log/init_model.log || exit 1; + grep 'no stats' $dir/log/init_model.log && echo "This is a bad warning."; + rm $dir/treeacc + else + cp $alidir/tree $dir/ || exit 1; + $cmd JOB=1 $dir/log/init_model.log \ + gmm-init-model-flat $dir/tree $lang/topo $dir/1.mdl \ + "$feats subset-feats ark:- ark:-|" || exit 1; + fi +fi + +if [ $stage -le -1 ]; then + # Convert the alignments. + echo "$0: Converting alignments from $alidir to use current tree" + $cmd JOB=1:$nj $dir/log/convert.JOB.log \ + convert-ali $phone_map_opt $alidir/final.mdl $dir/1.mdl $dir/tree \ + "ark:gunzip -c $alidir/ali.JOB.gz|" "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1; +fi + +[ "$exit_stage" -eq 0 ] && echo "$0: Exiting early: --exit-stage $exit_stage" && exit 0; + +if [ $stage -le 0 ] && [ "$realign_iters" != "" ]; then + echo "$0: Compiling graphs of transcripts" + $cmd JOB=1:$nj $dir/log/compile_graphs.JOB.log \ + compile-train-graphs --read-disambig-syms=$lang/phones/disambig.int $dir/tree $dir/1.mdl $lang/L.fst \ + "ark:utils/sym2int.pl --map-oov $oov -f 2- $lang/words.txt < $sdata/JOB/text |" \ + "ark:|gzip -c >$dir/fsts.JOB.gz" || exit 1; +fi + +x=1 +while [ $x -lt $num_iters ]; do + echo Pass $x + if echo $realign_iters | grep -w $x >/dev/null && [ $stage -le $x ]; then + echo Aligning data + mdl="gmm-boost-silence --boost=$boost_silence `cat $lang/phones/optional_silence.csl` $dir/$x.mdl - |" + $cmd JOB=1:$nj $dir/log/align.$x.JOB.log \ + gmm-align-compiled $scale_opts --beam=$beam --retry-beam=$retry_beam --careful=$careful "$mdl" \ + "ark:gunzip -c $dir/fsts.JOB.gz|" "$feats" \ + "ark:|gzip -c >$dir/ali.JOB.gz" || exit 1; + fi + + if echo $fmllr_iters | grep -w $x >/dev/null; then + if [ $stage -le $x ]; then + echo Estimating fMLLR transforms + # We estimate a transform that's additional to the previous transform; + # we'll compose them. + $cmd JOB=1:$nj $dir/log/fmllr.$x.JOB.log \ + ali-to-post "ark:gunzip -c $dir/ali.JOB.gz|" ark:- \| \ + weight-silence-post $silence_weight $silphonelist $dir/$x.mdl ark:- ark:- \| \ + gmm-est-fmllr --fmllr-update-type=$fmllr_update_type \ + --spk2utt=ark:$sdata/JOB/spk2utt $dir/$x.mdl \ + "$feats" ark:- ark:$dir/tmp_trans.JOB || exit 1; + for n in `seq $nj`; do + ! ( compose-transforms --b-is-affine=true \ + ark:$dir/tmp_trans.$n ark:$cur_trans_dir/trans.$n ark:$dir/composed_trans.$n \ + && mv $dir/composed_trans.$n $dir/trans.$n && \ + rm $dir/tmp_trans.$n ) 2>$dir/log/compose_transforms.$x.log \ + && echo "$0: Error composing transforms" && exit 1; + done + fi + feats="$sifeats transform-feats --utt2spk=ark:$sdata/JOB/utt2spk ark:$dir/trans.JOB ark:- ark:- |" + cur_trans_dir=$dir + fi + + if [ $stage -le $x ]; then + $cmd JOB=1:$nj $dir/log/acc.$x.JOB.log \ + gmm-acc-stats-ali $dir/$x.mdl "$feats" \ + "ark,s,cs:gunzip -c $dir/ali.JOB.gz|" $dir/$x.JOB.acc || exit 1; + [ `ls $dir/$x.*.acc | wc -w` -ne "$nj" ] && echo "$0: Wrong #accs" && exit 1; + $cmd $dir/log/update.$x.log \ + gmm-est --power=$power --write-occs=$dir/$[$x+1].occs --mix-up=$numgauss $dir/$x.mdl \ + "gmm-sum-accs - $dir/$x.*.acc |" $dir/$[$x+1].mdl || exit 1; + rm $dir/$x.mdl $dir/$x.*.acc + rm $dir/$x.occs + fi + [ $x -le $max_iter_inc ] && numgauss=$[$numgauss+$incgauss]; + x=$[$x+1]; +done + + +if [ $stage -le $x ]; then + # Accumulate stats for "alignment model"-- this model is + # computed with the speaker-independent features, but matches Gaussian-for-Gaussian + # with the final speaker-adapted model. + $cmd JOB=1:$nj $dir/log/acc_alimdl.JOB.log \ + ali-to-post "ark:gunzip -c $dir/ali.JOB.gz|" ark:- \| \ + gmm-acc-stats-twofeats $dir/$x.mdl "$feats" "$sifeats" \ + ark,s,cs:- $dir/$x.JOB.acc || exit 1; + [ `ls $dir/$x.*.acc | wc -w` -ne "$nj" ] && echo "$0: Wrong #accs" && exit 1; + # Update model. + $cmd $dir/log/est_alimdl.log \ + gmm-est --power=$power --remove-low-count-gaussians=false $dir/$x.mdl \ + "gmm-sum-accs - $dir/$x.*.acc|" $dir/$x.alimdl || exit 1; + rm $dir/$x.*.acc +fi + +rm $dir/final.{mdl,alimdl,occs} 2>/dev/null +ln -s $x.mdl $dir/final.mdl +ln -s $x.occs $dir/final.occs +ln -s $x.alimdl $dir/final.alimdl + + +steps/diagnostic/analyze_alignments.sh --cmd "$cmd" $lang $dir + +utils/summarize_warnings.pl $dir/log +( + echo "$0: Likelihood evolution:" + for x in `seq $[$num_iters-1]`; do + tail -n 30 $dir/log/acc.$x.*.log | awk '/Overall avg like/{l += $(NF-3)*$(NF-1); t += $(NF-1); } + /Overall average logdet/{d += $(NF-3)*$(NF-1); t2 += $(NF-1);} + END{ d /= t2; l /= t; printf("%s ", d+l); } ' + done + echo +) | tee $dir/log/summary.log + + +steps/info/gmm_dir_info.pl $dir + +echo "$0: done training SAT system in $dir" + +exit 0 diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/train.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/train.sh new file mode 100644 index 0000000..f3a3d3f --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/kaldi_self_train/st/train.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -eu + +w2v_dir= # contains features `{train,valid}.{npy,lengths}`, real transcripts `{train,valid}.${label}`, and dict `dict.${label}.txt` +lab_dir= # contains pseudo labels `{train,valid}.txt` +out_dir= # output root +arpa_lm= # phone LM +arpa_lm_bin= # (binary) phone LM for KenLM, used in unsupervised selection + +label=phnc +train_name="train" +valid_name="valid" +data_dir=${out_dir}/data + +mkdir -p ${out_dir}/exp +local/prepare_lang.sh $w2v_dir/dict.${label}.txt $data_dir +local/prepare_lm.sh $arpa_lm $data_dir + +for x in $train_name $valid_name; do + x_gt=${x}_gt + + # prepare pseudo data + python local/prepare_data_from_w2v.py $w2v_dir $data_dir $x + steps/compute_cmvn_stats.sh $data_dir/$x $out_dir/exp/make_feat/$x $out_dir/feats/$x + python local/copy_aligned_text.py < $lab_dir/$x.txt > $data_dir/$x/text + + # prepare ground truth data + mkdir $data_dir/$x_gt + cp $data_dir/$x/{feats.scp,cmvn.scp,utt2spk,spk2utt} $data_dir/$x_gt/ + python local/copy_aligned_text.py < $w2v_dir/$x.$label > $data_dir/$x_gt/text +done + +local/train_subset_lgbeam.sh \ + --out_root ${out_dir} --out_name exp --train $train_name --valid $valid_name \ + --mono_size 2000 --tri1_size 5000 --tri2b_size -1 --tri3b_size -1 \ + --stage 1 --max_stage 3 $data_dir $data_dir/lang $data_dir/lang_test + +local/unsup_select_decode.sh \ + --split $valid_name --kenlm_path $arpa_lm_bin \ + --ref_txt $data_dir/${valid_name}_gt/text \ + --psd_txt $data_dir/${valid_name}/text \ + $out_dir/exp diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/models/__init__.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/models/__init__.py new file mode 100644 index 0000000..3e3039b --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/models/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .wav2vec_u import Wav2vec_U + + +__all__ = [ + "Wav2vec_U", +] diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/models/wav2vec_u.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/models/wav2vec_u.py new file mode 100644 index 0000000..27792eb --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/models/wav2vec_u.py @@ -0,0 +1,637 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass +from enum import Enum, auto +import math +import numpy as np +from typing import Tuple, List, Optional, Dict + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch import autograd + +from fairseq import checkpoint_utils, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.models import BaseFairseqModel, register_model +from fairseq.modules import ( + SamePad, + TransposeLast, +) + + +class SegmentationType(Enum): + NONE = auto() + RANDOM = auto() + UNIFORM_RANDOM = auto() + UNIFORM_RANDOM_JOIN = auto() + JOIN = auto() + + +@dataclass +class SegmentationConfig(FairseqDataclass): + type: SegmentationType = SegmentationType.NONE + subsample_rate: float = 0.25 + mean_pool: bool = True + mean_pool_join: bool = False + remove_zeros: bool = False + + +@dataclass +class Wav2vec_UConfig(FairseqDataclass): + + discriminator_kernel: int = 3 + discriminator_dilation: int = 1 + discriminator_dim: int = 256 + discriminator_causal: bool = True + discriminator_linear_emb: bool = False + discriminator_depth: int = 1 + discriminator_max_pool: bool = False + discriminator_act_after_linear: bool = False + discriminator_dropout: float = 0.0 + discriminator_spectral_norm: bool = False + discriminator_weight_norm: bool = False + + generator_kernel: int = 4 + generator_dilation: int = 1 + generator_stride: int = 1 + generator_bias: bool = False + generator_dropout: float = 0.0 + + blank_weight: float = 0 + blank_mode: str = "add" + blank_is_sil: bool = False + no_softmax: bool = False + + smoothness_weight: float = 0.0 + smoothing: float = 0.0 + smoothing_one_sided: bool = False + gradient_penalty: float = 0.0 + probabilistic_grad_penalty_slicing: bool = False + code_penalty: float = 0.0 + gumbel: bool = False + hard_gumbel: bool = True + temp: Tuple[float, float, float] = (2, 0.1, 0.99995) + input_dim: int = 128 + + segmentation: SegmentationConfig = SegmentationConfig() + + +class Segmenter(nn.Module): + cfg: SegmentationConfig + + def __init__(self, cfg: SegmentationConfig): + super().__init__() + self.cfg = cfg + self.subsample_rate = cfg.subsample_rate + + def pre_segment(self, dense_x, dense_padding_mask): + return dense_x, dense_padding_mask + + def logit_segment(self, logits, padding_mask): + return logits, padding_mask + + +class RandomSegmenter(Segmenter): + def pre_segment(self, dense_x, dense_padding_mask): + target_num = math.ceil(dense_x.size(1) * self.subsample_rate) + ones = torch.ones(dense_x.shape[:-1], device=dense_x.device) + indices, _ = ones.multinomial(target_num).sort(dim=-1) + indices_ld = indices.unsqueeze(-1).expand(-1, -1, dense_x.size(-1)) + dense_x = dense_x.gather(1, indices_ld) + dense_padding_mask = dense_padding_mask.gather(1, index=indices) + return dense_x, dense_padding_mask + + +class UniformRandomSegmenter(Segmenter): + def pre_segment(self, dense_x, dense_padding_mask): + bsz, tsz, fsz = dense_x.shape + + target_num = math.ceil(tsz * self.subsample_rate) + + rem = tsz % target_num + + if rem > 0: + dense_x = F.pad(dense_x, [0, 0, 0, target_num - rem]) + dense_padding_mask = F.pad( + dense_padding_mask, [0, target_num - rem], value=True + ) + + dense_x = dense_x.view(bsz, target_num, -1, fsz) + dense_padding_mask = dense_padding_mask.view(bsz, target_num, -1) + + if self.cfg.mean_pool: + dense_x = dense_x.mean(dim=-2) + dense_padding_mask = dense_padding_mask.all(dim=-1) + else: + ones = torch.ones((bsz, dense_x.size(2)), device=dense_x.device) + indices = ones.multinomial(1) + indices = indices.unsqueeze(-1).expand(-1, target_num, -1) + indices_ld = indices.unsqueeze(-1).expand(-1, -1, -1, fsz) + dense_x = dense_x.gather(2, indices_ld).reshape(bsz, -1, fsz) + dense_padding_mask = dense_padding_mask.gather(2, index=indices).reshape( + bsz, -1 + ) + return dense_x, dense_padding_mask + + +class JoinSegmenter(Segmenter): + def logit_segment(self, logits, padding_mask): + preds = logits.argmax(dim=-1) + + if padding_mask.any(): + preds[padding_mask] = -1 # mark pad + uniques = [] + + bsz, tsz, csz = logits.shape + + for p in preds: + uniques.append( + p.cpu().unique_consecutive(return_inverse=True, return_counts=True) + ) + + new_tsz = max(u[0].numel() for u in uniques) + new_logits = logits.new_zeros(bsz, new_tsz, csz) + new_pad = padding_mask.new_zeros(bsz, new_tsz) + + for b in range(bsz): + u, idx, c = uniques[b] + keep = u != -1 + + if self.cfg.remove_zeros: + keep.logical_and_(u != 0) + + if self.training and not self.cfg.mean_pool_join: + u[0] = 0 + u[1:] = c.cumsum(0)[:-1] + m = c > 1 + r = torch.rand(m.sum()) + o = (c[m] * r).long() + u[m] += o + new_logits[b, : u.numel()] = logits[b, u] + else: + new_logits[b].index_add_( + dim=0, index=idx.to(new_logits.device), source=logits[b] + ) + new_logits[b, : c.numel()] /= c.unsqueeze(-1).to(new_logits.device) + + new_sz = keep.sum() + if not keep.all(): + kept_logits = new_logits[b, : c.numel()][keep] + new_logits[b, :new_sz] = kept_logits + + if new_sz < new_tsz: + pad = new_tsz - new_sz + new_logits[b, -pad:] = 0 + new_pad[b, -pad:] = True + + return new_logits, new_pad + + +class UniformRandomJoinSegmenter(UniformRandomSegmenter, JoinSegmenter): + pass + + +SEGMENT_FACTORY = { + SegmentationType.NONE: Segmenter, + SegmentationType.RANDOM: RandomSegmenter, + SegmentationType.UNIFORM_RANDOM: UniformRandomSegmenter, + SegmentationType.UNIFORM_RANDOM_JOIN: UniformRandomJoinSegmenter, + SegmentationType.JOIN: JoinSegmenter, +} + + +class Discriminator(nn.Module): + def __init__(self, dim, cfg: Wav2vec_UConfig): + super().__init__() + + inner_dim = cfg.discriminator_dim + kernel = cfg.discriminator_kernel + dilation = cfg.discriminator_dilation + self.max_pool = cfg.discriminator_max_pool + + if cfg.discriminator_causal: + padding = kernel - 1 + else: + padding = kernel // 2 + + def make_conv(in_d, out_d, k, p=0, has_dilation=True): + conv = nn.Conv1d( + in_d, + out_d, + kernel_size=k, + padding=p, + dilation=dilation if has_dilation else 1, + ) + if cfg.discriminator_spectral_norm: + conv = nn.utils.spectral_norm(conv) + elif cfg.discriminator_weight_norm: + conv = nn.utils.weight_norm(conv) + return conv + + inner_net = [ + nn.Sequential( + make_conv(inner_dim, inner_dim, kernel, padding), + SamePad(kernel_size=kernel, causal=cfg.discriminator_causal), + nn.Dropout(cfg.discriminator_dropout), + nn.GELU(), + ) + for _ in range(cfg.discriminator_depth - 1) + ] + [ + make_conv(inner_dim, 1, kernel, padding, has_dilation=False), + SamePad(kernel_size=kernel, causal=cfg.discriminator_causal), + ] + + if cfg.discriminator_linear_emb: + emb_net = [make_conv(dim, inner_dim, 1)] + else: + emb_net = [ + make_conv(dim, inner_dim, kernel, padding), + SamePad(kernel_size=kernel, causal=cfg.discriminator_causal), + ] + + if cfg.discriminator_act_after_linear: + emb_net.append(nn.GELU()) + + self.net = nn.Sequential( + *emb_net, + nn.Dropout(cfg.discriminator_dropout), + *inner_net, + ) + + def forward(self, x, padding_mask): + x = x.transpose(1, 2) # BTC -> BCT + x = self.net(x) + x = x.transpose(1, 2) + x_sz = x.size(1) + if padding_mask is not None and padding_mask.any() and padding_mask.dim() > 1: + padding_mask = padding_mask[:, : x.size(1)] + x[padding_mask] = float("-inf") if self.max_pool else 0 + x_sz = x_sz - padding_mask.sum(dim=-1) + x = x.squeeze(-1) + if self.max_pool: + x, _ = x.max(dim=-1) + else: + x = x.sum(dim=-1) + x = x / x_sz + return x + + +class Generator(nn.Module): + def __init__(self, input_dim, output_dim, cfg: Wav2vec_UConfig): + super().__init__() + + self.cfg = cfg + self.output_dim = output_dim + self.stride = cfg.generator_stride + self.dropout = nn.Dropout(cfg.generator_dropout) + + padding = cfg.generator_kernel // 2 + self.proj = nn.Sequential( + TransposeLast(), + nn.Conv1d( + input_dim, + output_dim, + kernel_size=cfg.generator_kernel, + stride=cfg.generator_stride, + dilation=cfg.generator_dilation, + padding=padding, + bias=cfg.generator_bias, + ), + TransposeLast(), + ) + + def forward(self, dense_x, tokens, dense_padding_mask): + dense_x = self.dropout(dense_x) + + dense_x = self.proj(dense_x) + if self.stride > 1: + dense_padding_mask = dense_padding_mask[:, :: self.stride] + + if dense_padding_mask.size(1) != dense_x.size(1): + new_padding = dense_padding_mask.new_zeros(dense_x.shape[:-1]) + diff = new_padding.size(1) - dense_padding_mask.size(1) + assert ( + diff > 0 + ), f"{new_padding.shape}, {dense_padding_mask.shape}, {dense_x.shape}, {diff}" + if diff > 0: + new_padding[:, diff:] = dense_padding_mask + else: + assert diff < 0 + new_padding = dense_padding_mask[:, :diff] + + dense_padding_mask = new_padding + + result = {} + + token_x = None + if tokens is not None: + token_x = dense_x.new_zeros(tokens.numel(), self.output_dim) + token_x.scatter_(1, tokens.view(-1, 1).long(), 1) + token_x = token_x.view(tokens.shape + (self.output_dim,)) + + result["dense_x"] = dense_x + result["token_x"] = token_x + result["dense_padding_mask"] = dense_padding_mask + + return result + + +@register_model("wav2vec_u", dataclass=Wav2vec_UConfig) +class Wav2vec_U(BaseFairseqModel): + def calc_gradient_penalty(self, real_data, fake_data): + + b_size = min(real_data.size(0), fake_data.size(0)) + t_size = min(real_data.size(1), fake_data.size(1)) + + if self.cfg.probabilistic_grad_penalty_slicing: + + def get_slice(data, dim, target_size): + + size = data.size(dim) + diff = size - target_size + if diff <= 0: + return data + + start = np.random.randint(0, diff + 1) + return data.narrow(dim=dim, start=start, length=target_size) + + real_data = get_slice(real_data, 0, b_size) + real_data = get_slice(real_data, 1, t_size) + fake_data = get_slice(fake_data, 0, b_size) + fake_data = get_slice(fake_data, 1, t_size) + + else: + real_data = real_data[:b_size, :t_size] + fake_data = fake_data[:b_size, :t_size] + + alpha = torch.rand(real_data.size(0), 1, 1) + alpha = alpha.expand(real_data.size()) + alpha = alpha.to(real_data.device) + + interpolates = alpha * real_data + ((1 - alpha) * fake_data) + + disc_interpolates = self.discriminator(interpolates, None) + + gradients = autograd.grad( + outputs=disc_interpolates, + inputs=interpolates, + grad_outputs=torch.ones(disc_interpolates.size(), device=real_data.device), + create_graph=True, + retain_graph=True, + only_inputs=True, + )[0] + + gradient_penalty = (gradients.norm(2, dim=1) - 1) ** 2 + return gradient_penalty + + def set_num_updates(self, num_updates): + super().set_num_updates(num_updates) + self.update_num = num_updates + self.curr_temp = max( + self.max_temp * self.temp_decay ** num_updates, self.min_temp + ) + + def discrim_step(self, num_updates): + return num_updates % 2 == 1 + + def get_groups_for_update(self, num_updates): + return "discriminator" if self.discrim_step(num_updates) else "generator" + + def __init__(self, cfg: Wav2vec_UConfig, target_dict): + super().__init__() + + self.cfg = cfg + self.zero_index = target_dict.index("<SIL>") if "<SIL>" in target_dict else 0 + self.smoothness_weight = cfg.smoothness_weight + + output_size = len(target_dict) + self.pad = target_dict.pad() + self.eos = target_dict.eos() + self.smoothing = cfg.smoothing + self.smoothing_one_sided = cfg.smoothing_one_sided + self.no_softmax = cfg.no_softmax + self.gumbel = cfg.gumbel + self.hard_gumbel = cfg.hard_gumbel + self.last_acc = None + + self.gradient_penalty = cfg.gradient_penalty + self.code_penalty = cfg.code_penalty + self.blank_weight = cfg.blank_weight + self.blank_mode = cfg.blank_mode + self.blank_index = target_dict.index("<SIL>") if cfg.blank_is_sil else 0 + assert self.blank_index != target_dict.unk() + + self.discriminator = Discriminator(output_size, cfg) + for p in self.discriminator.parameters(): + p.param_group = "discriminator" + + self.pca_A = self.pca_b = None + d = cfg.input_dim + + self.segmenter = SEGMENT_FACTORY[cfg.segmentation.type](cfg.segmentation) + + self.generator = Generator(d, output_size, cfg) + + for p in self.generator.parameters(): + p.param_group = "generator" + + for p in self.segmenter.parameters(): + p.param_group = "generator" + + self.max_temp, self.min_temp, self.temp_decay = cfg.temp + self.curr_temp = self.max_temp + self.update_num = 0 + + @classmethod + def build_model(cls, cfg, task): + return cls(cfg, task.target_dictionary) + + def get_logits( + self, + net_output: Optional[Dict[str, List[Optional[torch.Tensor]]]], + normalize: bool = False, + ): + logits = net_output["logits"] + + if self.blank_weight != 0: + if self.blank_mode == "add": + logits[..., self.blank_index] += self.blank_weight + elif self.blank_mode == "set": + logits[..., self.blank_index] = self.blank_weight + else: + raise Exception(f"invalid blank mode {self.blank_mode}") + + padding = net_output["padding_mask"] + if padding.any(): + logits[padding] = float("-inf") + logits[padding][..., self.blank_index] = float("inf") + + if normalize: + logits = utils.log_softmax(logits.float(), dim=-1) + + return logits.transpose(0, 1) + + def get_normalized_probs( + self, + net_output: Tuple[ + torch.Tensor, Optional[Dict[str, List[Optional[torch.Tensor]]]] + ], + log_probs: bool, + sample: Optional[Dict[str, torch.Tensor]] = None, + ): + logits = self.get_logits(net_output) + + probs = super().get_normalized_probs(logits, log_probs, sample) + # BTC -> TBC for ctc + probs = probs.transpose(0, 1) + return probs + + def normalize(self, dense_x): + + bsz, tsz, csz = dense_x.shape + + if dense_x.numel() == 0: + raise Exception(dense_x.shape) + _, k = dense_x.max(-1) + hard_x = ( + dense_x.new_zeros(bsz * tsz, csz) + .scatter_(-1, k.view(-1, 1), 1.0) + .view(-1, csz) + ) + hard_probs = torch.mean(hard_x.float(), dim=0) + code_perplexity = torch.exp( + -torch.sum(hard_probs * torch.log(hard_probs + 1e-7), dim=-1) + ) + + avg_probs = torch.softmax(dense_x.reshape(-1, csz).float(), dim=-1).mean(dim=0) + prob_perplexity = torch.exp( + -torch.sum(avg_probs * torch.log(avg_probs + 1e-7), dim=-1) + ) + + if not self.no_softmax: + if self.training and self.gumbel: + dense_x = F.gumbel_softmax( + dense_x.float(), tau=self.curr_temp, hard=self.hard_gumbel + ).type_as(dense_x) + else: + dense_x = dense_x.softmax(-1) + + return dense_x, code_perplexity, prob_perplexity + + def forward( + self, + features, + padding_mask, + random_label=None, + dense_x_only=False, + segment=True, + ): + if segment: + features, padding_mask = self.segmenter.pre_segment(features, padding_mask) + + orig_size = features.size(0) * features.size(1) - padding_mask.sum() + + gen_result = self.generator(features, random_label, padding_mask) + + orig_dense_x, token_x = gen_result["dense_x"], gen_result["token_x"] + orig_dense_padding_mask = gen_result["dense_padding_mask"] + + if segment: + dense_x, dense_padding_mask = self.segmenter.logit_segment( + orig_dense_x, orig_dense_padding_mask + ) + else: + dense_x = orig_dense_x + dense_padding_mask = orig_dense_padding_mask + + dense_logits = dense_x + prob_perplexity = None + code_perplexity = None + + if not (self.no_softmax and dense_x_only): + dense_x, code_perplexity, prob_perplexity = self.normalize(dense_logits) + + if dense_x_only or self.discriminator is None: + return { + "logits": dense_x, + "padding_mask": dense_padding_mask, + } + + token_padding_mask = random_label == self.pad + + dense_y = self.discriminator(dense_x, dense_padding_mask) + token_y = self.discriminator(token_x, token_padding_mask) + + sample_size = features.size(0) + + d_step = self.discrim_step(self.update_num) + + fake_smooth = self.smoothing + real_smooth = self.smoothing + if self.smoothing_one_sided: + fake_smooth = 0 + + zero_loss = None + smoothness_loss = None + code_pen = None + + if d_step: + loss_dense = F.binary_cross_entropy_with_logits( + dense_y, + dense_y.new_ones(dense_y.shape) - fake_smooth, + reduction="sum", + ) + loss_token = F.binary_cross_entropy_with_logits( + token_y, + token_y.new_zeros(token_y.shape) + real_smooth, + reduction="sum", + ) + if self.training and self.gradient_penalty > 0: + grad_pen = self.calc_gradient_penalty(token_x, dense_x) + grad_pen = grad_pen.sum() * self.gradient_penalty + else: + grad_pen = None + else: + grad_pen = None + loss_token = None + loss_dense = F.binary_cross_entropy_with_logits( + dense_y, + dense_y.new_zeros(dense_y.shape) + fake_smooth, + reduction="sum", + ) + num_vars = dense_x.size(-1) + if prob_perplexity is not None: + code_pen = (num_vars - prob_perplexity) / num_vars + code_pen = code_pen * sample_size * self.code_penalty + + if self.smoothness_weight > 0: + smoothness_loss = F.mse_loss( + dense_logits[:, :-1], dense_logits[:, 1:], reduction="none" + ) + smoothness_loss[dense_padding_mask[:, 1:]] = 0 + smoothness_loss = ( + smoothness_loss.mean() * sample_size * self.smoothness_weight + ) + + result = { + "losses": { + "grad_pen": grad_pen, + "code_pen": code_pen, + "smoothness": smoothness_loss, + }, + "temp": self.curr_temp, + "code_ppl": code_perplexity, + "prob_ppl": prob_perplexity, + "d_steps": int(d_step), + "sample_size": sample_size, + } + + suff = "_d" if d_step else "_g" + result["losses"]["dense" + suff] = loss_dense + result["losses"]["token" + suff] = loss_token + + return result diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/apply_pca.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/apply_pca.py new file mode 100644 index 0000000..10ad6ce --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/apply_pca.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import os.path as osp +import math +import numpy as np +import tqdm +import torch +from shutil import copyfile + +from npy_append_array import NpyAppendArray + + +def get_parser(): + parser = argparse.ArgumentParser( + description="transforms features via a given pca and stored them in target dir" + ) + # fmt: off + parser.add_argument('source', help='directory with features') + parser.add_argument('--split', help='which split to read', required=True) + parser.add_argument('--save-dir', help='where to save the output', required=True) + parser.add_argument('--pca-path', type=str, help='pca location. will append _A.npy and _b.npy', required=True) + parser.add_argument('--batch-size', type=int, default=2048000, help='batch size') + parser.add_argument('--unfiltered', action='store_true', help='process the unfiltered version') + # fmt: on + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + source_path = osp.join(args.source, args.split) + data_poth = source_path + "_unfiltered" if args.unfiltered else source_path + + print(f"data path: {data_poth}") + + features = np.load(data_poth + ".npy", mmap_mode="r") + pca_A = torch.from_numpy(np.load(args.pca_path + "_A.npy")).cuda() + pca_b = torch.from_numpy(np.load(args.pca_path + "_b.npy")).cuda() + + os.makedirs(args.save_dir, exist_ok=True) + save_path = osp.join(args.save_dir, args.split) + + copyfile(source_path + ".tsv", save_path + ".tsv") + copyfile(data_poth + ".lengths", save_path + ".lengths") + + if osp.exists(source_path + ".phn"): + copyfile(source_path + ".phn", save_path + ".phn") + + if osp.exists(source_path + ".wrd"): + copyfile(source_path + ".wrd", save_path + ".wrd") + + if osp.exists(save_path + ".npy"): + os.remove(save_path + ".npy") + npaa = NpyAppendArray(save_path + ".npy") + + batches = math.ceil(features.shape[0] / args.batch_size) + + with torch.no_grad(): + for b in tqdm.trange(batches): + start = b * args.batch_size + end = start + args.batch_size + x = torch.from_numpy(features[start:end]).cuda() + x = torch.matmul(x, pca_A) + pca_b + npaa.append(x.cpu().numpy()) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/copy_labels.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/copy_labels.py new file mode 100644 index 0000000..9898683 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/copy_labels.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + +for idx, line in enumerate(sys.stdin): + print(f"utt{idx:010d} {line}", end="") diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_lexicon.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_lexicon.py new file mode 100644 index 0000000..5bf3e51 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_lexicon.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import sys + +from fairseq.data import Dictionary + + +def get_parser(): + parser = argparse.ArgumentParser( + description="filters a lexicon given a unit dictionary" + ) + parser.add_argument("-d", "--unit-dict", help="unit dictionary", required=True) + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + d = Dictionary.load(args.unit_dict) + symbols = set(d.symbols) + + for line in sys.stdin: + items = line.rstrip().split() + skip = len(items) < 2 + for x in items[1:]: + if x not in symbols: + skip = True + break + if not skip: + print(line, end="") + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_tsv.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_tsv.py new file mode 100644 index 0000000..a09d79a --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/filter_tsv.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +import argparse +import sys + + +parser = argparse.ArgumentParser() +parser.add_argument("--tsv", required=True, type=str) +parser.add_argument("--no-skip", action="store_true") +parser.add_argument("--keep", action="store_true") +params = parser.parse_args() + + +def get_fname(line): + p = os.path.basename(line.split("\t")[0]) + p = os.path.splitext(p)[0] + return p + + +# filenames to exclude +seen = set() +with open(params.tsv) as f: + if not params.no_skip: + root = next(f).rstrip() + for line in f: + seen.add(get_fname(line)) + +for i, line in enumerate(sys.stdin): + exists = get_fname(line) in seen + keep = (exists and params.keep) or (not exists and not params.keep) + if i == 0 or keep: + print(line, end="") diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/g2p_wrd_to_phn.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/g2p_wrd_to_phn.py new file mode 100644 index 0000000..2e31c30 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/g2p_wrd_to_phn.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import sys + +from g2p_en import G2p + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--compact", + action="store_true", + help="if set, compacts phones", + ) + args = parser.parse_args() + + compact = args.compact + + wrd_to_phn = {} + g2p = G2p() + for line in sys.stdin: + words = line.strip().split() + phones = [] + for w in words: + if w not in wrd_to_phn: + wrd_to_phn[w] = g2p(w) + if compact: + wrd_to_phn[w] = [ + p[:-1] if p[-1].isnumeric() else p for p in wrd_to_phn[w] + ] + phones.extend(wrd_to_phn[w]) + try: + print(" ".join(phones)) + except: + print(wrd_to_phn, words, phones, file=sys.stderr) + raise + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/ltr_to_wrd.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/ltr_to_wrd.py new file mode 100644 index 0000000..36c85d1 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/ltr_to_wrd.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + + +def main(): + for line in sys.stdin: + print(line.replace(" ", "").replace("|", " ").strip()) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/mean_pool.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/mean_pool.py new file mode 100644 index 0000000..4eea048 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/mean_pool.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import os.path as osp +import math +import numpy as np +import tqdm +import torch +import torch.nn.functional as F +from shutil import copyfile + +from npy_append_array import NpyAppendArray + + +def get_parser(): + parser = argparse.ArgumentParser( + description="mean pools representations by compressing uniform splits of the data" + ) + # fmt: off + parser.add_argument('source', help='directory with features') + parser.add_argument('--split', help='which split to read', required=True) + parser.add_argument('--save-dir', help='where to save the output', required=True) + parser.add_argument('--subsample-rate', type=float, default=0.5, help='size to subsample data to') + + parser.add_argument('--remove-extra', action='store_true', help='if true, removes extra states that cant be pooled, otherwise pads with 0s') + # fmt: on + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + source_path = osp.join(args.source, args.split) + + print(f"data path: {source_path}") + + features = np.load(source_path + ".npy", mmap_mode="r") + + os.makedirs(args.save_dir, exist_ok=True) + save_path = osp.join(args.save_dir, args.split) + + copyfile(source_path + ".tsv", save_path + ".tsv") + + if os.path.exists(source_path + ".phn"): + copyfile(source_path + ".phn", save_path + ".phn") + if os.path.exists(source_path + ".wrd"): + copyfile(source_path + ".wrd", save_path + ".wrd") + + if os.path.exists(osp.join(args.source, "dict.phn.txt")): + copyfile( + osp.join(args.source, "dict.phn.txt"), + osp.join(args.save_dir, "dict.phn.txt"), + ) + + if osp.exists(save_path + ".npy"): + os.remove(save_path + ".npy") + npaa = NpyAppendArray(save_path + ".npy") + + with open(source_path + ".lengths", "r") as lf: + lengths = lf.readlines() + + fsz = features.shape[-1] + start = 0 + with torch.no_grad(): + with open(save_path + ".lengths", "w") as lengths_out: + for length in tqdm.tqdm(lengths): + length = int(length) + end = start + length + feats = features[start:end] + start += length + x = torch.from_numpy(feats).cuda() + target_num = math.ceil(length * args.subsample_rate) + rem = length % target_num + + if rem > 0: + if args.remove_extra: + to_rem = target_num - rem + target_num -= 1 + x = x[:-to_rem] + else: + to_add = target_num - rem + x = F.pad(x, [0, 0, 0, to_add]) + x[-to_add:] = x[-to_add - 1] + + x = x.view(target_num, -1, fsz) + x = x.mean(dim=-2) + print(target_num, file=lengths_out) + npaa.append(x.cpu().numpy()) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/merge_clusters.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/merge_clusters.py new file mode 100644 index 0000000..2780f9d --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/merge_clusters.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import os.path as osp +import numpy as np +import tqdm +import torch +import random +from shutil import copyfile + +from npy_append_array import NpyAppendArray + + +def get_parser(): + parser = argparse.ArgumentParser( + description="transforms features via a given pca and stored them in target dir" + ) + # fmt: off + parser.add_argument('source', help='directory with features') + parser.add_argument('--split', help='which split to read', required=True) + parser.add_argument('--save-dir', help='where to save the output', required=True) + parser.add_argument('--cluster-dir', help='where the clusters are') + parser.add_argument('--pooling', type=str, default='mean', choices=['mean', 'sample'], help='how to pool') + # fmt: on + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + source_path = osp.join(args.source, args.split) + cluster_path = osp.join(args.cluster_dir, args.split + ".src") + print(f"data path: {source_path}") + + features = np.load(source_path + ".npy", mmap_mode="r") + sizes = [] + offsets = [] + offset = 0 + with open(source_path + ".lengths", "r") as len_f: + for line in len_f: + length = int(line.rstrip()) + sizes.append(length) + offsets.append(offset) + offset += length + + clusters = [] + with open(cluster_path, "r") as cf: + for line in cf: + line = line.rstrip() + items = line.split() + items = list(map(int, items)) + clusters.append(items) + + os.makedirs(args.save_dir, exist_ok=True) + save_path = osp.join(args.save_dir, args.split) + + copyfile(source_path + ".tsv", save_path + ".tsv") + + if os.path.exists(source_path + ".phn"): + copyfile(source_path + ".phn", save_path + ".phn") + if os.path.exists(osp.join(args.source, "dict.phn.txt")): + copyfile( + osp.join(args.source, "dict.phn.txt"), + osp.join(args.save_dir, "dict.phn.txt"), + ) + if os.path.exists(source_path + ".wrd"): + copyfile(source_path + ".wrd", save_path + ".wrd") + + if osp.exists(save_path + ".npy"): + os.remove(save_path + ".npy") + npaa = NpyAppendArray(save_path + ".npy") + + def merge(feats, clust): + feats = torch.from_numpy(feats.copy()) + clust = torch.LongTensor(clust) + _, counts = clust.unique_consecutive(return_counts=True) + curr = 0 + + merged = [] + for c in counts: + c = c.item() + start = curr + end = curr + c + curr += c + if args.pooling == "mean": + new_x = feats[start:end].mean(dim=0) + elif args.pooling == "sample": + new_x = feats[start + int(random.random() * c)] + else: + raise NotImplementedError() + merged.append(new_x) + + return torch.stack(merged, dim=0).numpy() + + with open(save_path + ".lengths", "w") as l_f: + for size, offset, clust in tqdm.tqdm( + zip(sizes, offsets, clusters), total=len(sizes) + ): + end = size + offset + feats = features[offset:end] + feats = merge(feats, clust) + print(len(feats), file=l_f) + npaa.append(feats) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_and_filter_text.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_and_filter_text.py new file mode 100644 index 0000000..c2bd16e --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_and_filter_text.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import fasttext as ft +import os +import regex +import sys + + +def get_parser(): + parser = argparse.ArgumentParser( + description="reads text from stdin and outputs normalized, lid-filtered version to stdout" + ) + parser.add_argument( + "--fasttext-model", + help="path to fasttext model", + default="lid.187.bin", + ) + parser.add_argument("--lang", help="language id", required=True) + parser.add_argument( + "--lid-threshold", + type=float, + help="threshold for this lang id probability", + default=0.4, + ) + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + filter_r = regex.compile(r"[^\p{L}\p{N}\p{M}\' \-]") + + lg = args.lang.lower() + lg_label = f"__label__{lg}" + thresh = args.lid_threshold + + if os.path.exists(args.fasttext_model): + model = ft.load_model(args.fasttext_model) + else: + print( + f"fasttext language id model {args.fasttext_model} not found. Proceeding without language filtering. " + f"To enable language filtering, please download the latest language id model " + f"from https://fasttext.cc/docs/en/language-identification.html", + file=sys.stderr, + ) + model = None + + for line in sys.stdin: + line = line.strip() + line = filter_r.sub(" ", line) + line = " ".join(line.split()) + + if model is not None: + lid, prob = model.predict(line, k=100) + try: + target_idx = lid.index(lg_label) + except ValueError: + continue + if target_idx == 0 or prob[target_idx] >= thresh: + print(line) + else: + print(line) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_text.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_text.py new file mode 100644 index 0000000..9d0ffeb --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/normalize_text.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import regex +import sys + + +def main(): + filter_r = regex.compile(r"[^\p{L}\p{N}\p{M}\' \-]") + + for line in sys.stdin: + line = line.strip() + line = filter_r.sub(" ", line) + line = " ".join(line.split()) + print(line) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/pca.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/pca.py new file mode 100644 index 0000000..948cf53 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/pca.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import os.path as osp +import numpy as np + +import faiss + + + +def get_parser(): + parser = argparse.ArgumentParser( + description="compute a pca matrix given an array of numpy features" + ) + # fmt: off + parser.add_argument('data', help='numpy file containing features') + parser.add_argument('--output', help='where to save the pca matrix', required=True) + parser.add_argument('--dim', type=int, help='dim for pca reduction', required=True) + parser.add_argument('--eigen-power', type=float, default=0, help='eigen power, -0.5 for whitening') + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + print("Reading features") + x = np.load(args.data, mmap_mode="r") + + print("Computing PCA") + pca = faiss.PCAMatrix(x.shape[-1], args.dim, args.eigen_power) + pca.train(x) + b = faiss.vector_to_array(pca.b) + A = faiss.vector_to_array(pca.A).reshape(pca.d_out, pca.d_in) + + os.makedirs(args.output, exist_ok=True) + + prefix = str(args.dim) + if args.eigen_power != 0: + prefix += f"_{args.eigen_power}" + + np.save(osp.join(args.output, f"{prefix}_pca_A"), A.T) + np.save(osp.join(args.output, f"{prefix}_pca_b"), b) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/phonemize_with_sil.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/phonemize_with_sil.py new file mode 100644 index 0000000..c6512d7 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/phonemize_with_sil.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import numpy as np +import sys + + +def get_parser(): + parser = argparse.ArgumentParser( + description="converts words to phones adding optional silences around in between words" + ) + parser.add_argument( + "--sil-prob", + "-s", + type=float, + default=0, + help="probability of inserting silence between each word", + ) + parser.add_argument( + "--surround", + action="store_true", + help="if set, surrounds each example with silence", + ) + parser.add_argument( + "--lexicon", + help="lexicon to convert to phones", + required=True, + ) + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + sil_prob = args.sil_prob + surround = args.surround + sil = "<SIL>" + + wrd_to_phn = {} + + with open(args.lexicon, "r") as lf: + for line in lf: + items = line.rstrip().split() + assert len(items) > 1, line + assert items[0] not in wrd_to_phn, items + wrd_to_phn[items[0]] = items[1:] + + for line in sys.stdin: + words = line.strip().split() + + if not all(w in wrd_to_phn for w in words): + continue + + phones = [] + if surround: + phones.append(sil) + + sample_sil_probs = None + if sil_prob > 0 and len(words) > 1: + sample_sil_probs = np.random.random(len(words) - 1) + + for i, w in enumerate(words): + phones.extend(wrd_to_phn[w]) + if ( + sample_sil_probs is not None + and i < len(sample_sil_probs) + and sample_sil_probs[i] < sil_prob + ): + phones.append(sil) + + if surround: + phones.append(sil) + print(" ".join(phones)) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_audio.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_audio.sh new file mode 100644 index 0000000..013f7a9 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_audio.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env zsh +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +source_dir=$1 +tgt_dir=$2 +model=$3 + +if [ -z "$4" ] + then + dim=512 + else + dim=$4 +fi + +echo "using $dim dim for PCA" + +if [ -z "$5" ] + then + layer=14 + else + layer=$5 +fi + +echo "extracting from layer $layer" + +train_split=train +valid_split=valid +test_split=test + +all_splits=($train_split) + +if [[ -f "$source_dir/valid.tsv" ]]; then + all_splits+=('valid') +fi + +if [[ -f "$source_dir/test.tsv" ]]; then + all_splits+=('test') +fi + +echo "processing splits: $all_splits" + +mkdir -p $tgt_dir + +cp $source_dir/*.tsv $tgt_dir +cp $source_dir/*.wrd $tgt_dir +cp $source_dir/*.ltr $tgt_dir +cp $source_dir/*.phn $tgt_dir +cp $source_dir/dict* $tgt_dir + +setopt shwordsplit + +for split in $all_splits; do + python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/wav2vec_extract_features.py $source_dir --split $split \ + --save-dir $tgt_dir --checkpoint $model --layer $layer +done + +python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/wav2vec_cluster_faiss.py $tgt_dir/${train_split}.tsv \ +--checkpoint $model --save-dir $tgt_dir -f "CLUS128" --sample-pct 1.0 + +for split in $all_splits; do + python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/wav2vec_apply_cluster_faiss.py $tgt_dir \ + --checkpoint $model --path $tgt_dir/CLUS128 --split $split +done + +python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/pca.py $tgt_dir/${train_split}.npy --output $tgt_dir/pca --dim $dim + +for split in $all_splits; do + python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/apply_pca.py $tgt_dir --split $split --save-dir $tgt_dir/precompute_pca$dim --pca-path $tgt_dir/pca/${dim}_pca --batch-size 1048000 + + python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/merge_clusters.py $tgt_dir/precompute_pca$dim --cluster-dir $tgt_dir/CLUS128 \ + --split $split --save-dir $tgt_dir/precompute_pca${dim}_cls128_mean --pooling mean + + python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/mean_pool.py $tgt_dir/precompute_pca${dim}_cls128_mean \ + --save-dir $tgt_dir/precompute_pca${dim}_cls128_mean_pooled --split $split +done diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_text.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_text.sh new file mode 100644 index 0000000..1caf13c --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_text.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env zsh +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +lg=$1 +text_path=$2 +target_dir=$3 +min_phones=$4 +phonemizer=$5 +lid_path=$6 + +if [ -z "$lid_path" ]; then + lid_path="lid.187.bin" +fi + +ph_lg=${lg:l} +if test "$lg" = 'fr'; then + ph_lg='fr-fr' +elif test "$lg" = 'en'; then + ph_lg='en-us' +elif test "$lg" = 'pt'; then + ph_lg='pt-br' +fi + +ESPEAK_PATH='' +if test "$phonemizer" = 'espeak'; then + ESPEAK_PATH=$(which espeak) +elif test "$phonemizer" = 'espeak-ng'; then + ESPEAK_PATH=$(which espeak-ng) +elif test "$phonemizer" = 'G2P'; then + ESPEAK_PATH='' +else + echo "Unknown phonemizer $phonemizer. Valid options are espeak, espean-ng and G2P" + exit 1 +fi + +echo $lg +echo $ph_lg +echo $text_path +echo $target_dir +echo "min phone seen threshold is $min_phones" + +mkdir -p $target_dir +python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/normalize_and_filter_text.py --lang $lg --fasttext-model $lid_path < $text_path | grep -v '\-\-\-' >! $target_dir/lm.upper.lid.txt +python $FAIRSEQ_ROOT/fairseq_cli/preprocess.py --dataset-impl mmap --trainpref $target_dir/lm.upper.lid.txt --only-source --destdir $target_dir --thresholdsrc 2 --padding-factor 1 --dict-only +cut -f1 -d' ' $target_dir/dict.txt | grep -v -x '[[:punct:]]*' | grep -Pv '\d\d\d\d\d+' >! $target_dir/words.txt + + +if [ -z "$ESPEAK_PATH" ]; then + python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/g2p_wrd_to_phn.py --compact < $target_dir/words.txt > $target_dir/phones.txt +else + # echoing 1 into corpus will prevent the mismatch lines between lexicon and phones in case the phonemizer fails + one=$(echo "1" | PHONEMIZER_ESPEAK_PATH=$ESPEAK_PATH phonemize -p ' ' -w '' -l $ph_lg --language-switch remove-flags) + sed 's/$/ 1/' $target_dir/words.txt | PHONEMIZER_ESPEAK_PATH=$ESPEAK_PATH phonemize -o $target_dir/phones.txt -p ' ' -w '' -l $ph_lg -j 70 --language-switch remove-flags + echo "one is ${one}" + sed -i "s/${one}$//" $target_dir/phones.txt +fi + +paste $target_dir/words.txt $target_dir/phones.txt >! $target_dir/lexicon.lst + +python $FAIRSEQ_ROOT/fairseq_cli/preprocess.py --dataset-impl mmap --trainpref $target_dir/phones.txt --only-source --destdir $target_dir/phones --thresholdsrc $min_phones --padding-factor 1 --dict-only + +python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/filter_lexicon.py -d $target_dir/phones/dict.txt < $target_dir/lexicon.lst >! $target_dir/lexicon_filtered.lst +python $FAIRSEQ_ROOT/examples/wav2vec/unsupervised/scripts/phonemize_with_sil.py -s 0.25 --surround --lexicon $target_dir/lexicon_filtered.lst < $target_dir/lm.upper.lid.txt >! $target_dir/phones/lm.phones.filtered.txt +cp $target_dir/phones/dict.txt $target_dir/phones/dict.phn.txt +echo "<SIL> 0" >> $target_dir/phones/dict.phn.txt +python $FAIRSEQ_ROOT/fairseq_cli/preprocess.py --dataset-impl mmap --trainpref $target_dir/phones/lm.phones.filtered.txt --workers 70 --only-source --destdir $target_dir/phones --srcdict $target_dir/phones/dict.phn.txt + +$KENLM_ROOT/lmplz -o 4 < $target_dir/lm.upper.lid.txt --discount_fallback --prune 0 0 0 3 >! $target_dir/kenlm.wrd.o40003.arpa +$KENLM_ROOT/build_binary $target_dir/kenlm.wrd.o40003.arpa $target_dir/kenlm.wrd.o40003.bin + +lg=$lg python $FAIRSEQ_ROOT/examples/speech_recognition/kaldi/kaldi_initializer.py kaldi_root=$KALDI_ROOT fst_dir=$target_dir/fst/phn_to_words_sil lm_arpa=$target_dir/kenlm.wrd.o40003.arpa wav2letter_lexicon=$target_dir/lexicon_filtered.lst data_dir=$target_dir/phones in_labels=phn "blank_symbol='<SIL>'" +lg=$lg python $FAIRSEQ_ROOT/examples/speech_recognition/kaldi/kaldi_initializer.py kaldi_root=$KALDI_ROOT fst_dir=$target_dir/fst/phn_to_words lm_arpa=$target_dir/kenlm.wrd.o40003.arpa wav2letter_lexicon=$target_dir/lexicon_filtered.lst data_dir=$target_dir/phones in_labels=phn + +$KENLM_ROOT/lmplz -o 4 < $target_dir/phones/lm.phones.filtered.txt --discount_fallback >! $target_dir/phones/lm.phones.filtered.04.arpa +$KENLM_ROOT/build_binary $target_dir/phones/lm.phones.filtered.04.arpa $target_dir/phones/lm.phones.filtered.04.bin +$KENLM_ROOT/lmplz -o 6 < $target_dir/phones/lm.phones.filtered.txt --discount_fallback >! $target_dir/phones/lm.phones.filtered.06.arpa +$KENLM_ROOT/build_binary $target_dir/phones/lm.phones.filtered.06.arpa $target_dir/phones/lm.phones.filtered.06.bin + +lg=$lg python $FAIRSEQ_ROOT/examples/speech_recognition/kaldi/kaldi_initializer.py kaldi_root=$KALDI_ROOT fst_dir=$target_dir/fst/phn_to_phn_sil lm_arpa=$target_dir/phones/lm.phones.filtered.06.arpa data_dir=$target_dir/phones in_labels=phn "blank_symbol='<SIL>'" diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_timit.sh b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_timit.sh new file mode 100644 index 0000000..d8f5d59 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/prepare_timit.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +timit_root=$1 # assume it is the upper-cased version +tgt_dir=$2 +model=$3 + +set -eu + +setups="matched unmatched" +splits="test valid train train_text" + +tgt_dir=$(realpath $tgt_dir) +sph2wav=$KALDI_ROOT/tools/sph2pipe_v2.5/sph2pipe +wav_dir=$tgt_dir/wav + + +mkdir -p $tgt_dir $wav_dir +find $timit_root/{TRAIN,TEST} -iname "*.WAV" > $tgt_dir/all_sph.flist +cat $tgt_dir/all_sph.flist | sed -e 's#//*#/#g' -e 's#.*/\([^/]*\)/\([^/]*\).WAV#\1_\2#g' > $tgt_dir/all.uid +paste -d' ' $tgt_dir/{all_sph.flist,all.uid} | \ + awk -v sph2wav=$sph2wav -v wav_dir=$wav_dir '{print sph2wav " -f wav " $1 " > " wav_dir "/" $2 ".wav"}' \ + > $tgt_dir/sph2wav.sh +bash $tgt_dir/sph2wav.sh +cat $tgt_dir/all.uid | awk -v wav_dir=$(pwd)/$wav_dir '{print $1" "wav_dir"/"$1".wav"}' | sort > $tgt_dir/all_wav.scp +cut -d' ' -f2 $tgt_dir/all_wav.scp | xargs -I{} soxi -s {} > $tgt_dir/all.dur +paste -d' ' $tgt_dir/{all_wav.scp,all.dur} > $tgt_dir/all_wav_dur.scp +rm $tgt_dir/{all.uid,all_sph.flist,sph2wav.sh} + +find $timit_root/{TRAIN,TEST} -iname "*.PHN" > $tgt_dir/all_phn60.flist +while read line; do + if [ ! -f $line ]; then + >&2 echo "Cannot find transcription file '$line'" && exit 1; + fi + cut -f3 -d' ' "$line" | tr '\n' ' ' | perl -ape 's: *$:\n:;' +done < $tgt_dir/all_phn60.flist > $tgt_dir/all.phn60 +cat $tgt_dir/all_phn60.flist | sed -e 's#//*#/#g' -e 's#.*/\([^/]*\)/\([^/]*\).PHN#\1_\2#g' | \ + paste -d' ' - $tgt_dir/all.phn60 | \ + $KALDI_ROOT/egs/timit/s5/local/timit_norm_trans.pl -i - -m $KALDI_ROOT/egs/timit/s5/conf/phones.60-48-39.map -to 39 | \ + sort > $tgt_dir/all.phn +echo "done preparing wav and 39-phone transcripts" + + +for s in $setups; do + mkdir -p $tgt_dir/$s + for x in $splits; do + uid_path=config/timit_${s}/${x}.uid + grep -w -f $uid_path $tgt_dir/all.phn | cut -d' ' -f2- > $tgt_dir/$s/$x.phn + ln -sf $(realpath $tgt_dir/$s/$x.phn) $tgt_dir/$s/$x.wrd + + echo "/" > $tgt_dir/$s/$x.tsv && grep -w -f $uid_path $tgt_dir/all_wav_dur.scp | cut -d' ' -f2- | sed 's# #\t#' >> $tgt_dir/$s/$x.tsv + done + + for x in $splits; do + cat $tgt_dir/$s/$x.phn + done | tr ' ' '\n' | sort -u | awk '{print $1" "1}' > $tgt_dir/$s/dict.phn.txt + ln -sf $(realpath $tgt_dir/$s/dict.phn.txt) $tgt_dir/$s/dict.wrd.txt +done +echo "done preparing unmatched and matched setups for TIMIT" + + +for s in $setups; do + zsh scripts/prepare_audio.sh $tgt_dir/$s $tgt_dir/$s/feat $model + + lm_dir=$tgt_dir/$s/phones + fst_dir=$tgt_dir/$s/fst/phn_to_phn + + python $FAIRSEQ_ROOT/fairseq_cli/preprocess.py --dataset-impl mmap --trainpref $tgt_dir/$s/train_text.phn --workers 10 --only-source --destdir $lm_dir --srcdict $tgt_dir/$s/dict.phn.txt + $KENLM_ROOT/lmplz -o 3 < $tgt_dir/$s/train_text.phn --discount_fallback >$lm_dir/train_text_phn.03.arpa + $KENLM_ROOT/build_binary $lm_dir/train_text_phn.03.arpa $lm_dir/train_text_phn.03.bin + $KENLM_ROOT/lmplz -o 4 < $tgt_dir/$s/train_text.phn --discount_fallback >$lm_dir/train_text_phn.04.arpa + $KENLM_ROOT/build_binary $lm_dir/train_text_phn.04.arpa $lm_dir/train_text_phn.04.bin + + python $FAIRSEQ_ROOT/examples/speech_recognition/kaldi/kaldi_initializer.py kaldi_root=$KALDI_ROOT fst_dir=$fst_dir lm_arpa=$lm_dir/train_text_phn.03.arpa data_dir=$tgt_dir/$s in_labels=phn +done +echo "done preprocessing audio and text for wav2vec-U" diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/remove_silence.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/remove_silence.py new file mode 100644 index 0000000..fac88b9 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/remove_silence.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +get intervals from .vads file, specify output data, and this script removes silences and saves the audio data in out path folder +paths=shards/train.tsv +vads=shards/train.vads +python remove_silence.py --paths $paths --vads $vads +""" + +import os +import argparse +import torch +import torchaudio +import tqdm + + +parser = argparse.ArgumentParser() +parser.add_argument("--tsv", default="", type=str) +parser.add_argument("--vads", default="", type=str) +parser.add_argument("--out", type=str) +params = parser.parse_args() + +# load paths +paths = [] +with open(params.tsv) as f: + root = next(f).rstrip() + for line in f: + paths.append(os.path.join(root, line.rstrip().split("\t")[0])) + +# load vads +list_intervals = [] +with open(params.vads) as f: + for line in f: + interval = [ + [int(w.split(":")[0]), int(w.split(":")[1])] for w in line.rstrip().split() + ] + list_intervals.append(interval) + + +# load audio and keep only intervals (i.e. remove silences) +for i in tqdm.trange(len(paths)): + data, _ = torchaudio.load(paths[i]) + if len(list_intervals[i]) > 0: + data_filtered = torch.cat( + [data[0][int(it[0]) : int(it[1])] for it in list_intervals[i]] + ).unsqueeze(0) + else: + data_filtered = data + + # YOU MAY NEED TO MODIFY THIS TO GET THE RIGHT SUBPATH + # outpath = params.out + '/'.join(paths[i].split('/')[-1]) + outpath = params.out + "/" + "/".join(paths[i].split("/")[-2:]) + + if not os.path.isdir("/".join(outpath.split("/")[:-1])): + os.makedirs("/".join(outpath.split("/")[:-1])) + if not os.path.exists(outpath): + torchaudio.save(outpath, data_filtered, sample_rate=16000) + else: + print(outpath, "exists!") diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/vads.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/vads.py new file mode 100644 index 0000000..2398da9 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/vads.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import sys + +from copy import deepcopy +from scipy.signal import lfilter + +import numpy as np +from tqdm import tqdm +import soundfile as sf +import os.path as osp + + +def get_parser(): + parser = argparse.ArgumentParser(description="compute vad segments") + parser.add_argument( + "--rvad-home", + "-r", + help="path to rvad home (see https://github.com/zhenghuatan/rVADfast)", + required=True, + ) + + return parser + + +def rvad(speechproc, path): + winlen, ovrlen, pre_coef, nfilter, nftt = 0.025, 0.01, 0.97, 20, 512 + ftThres = 0.5 + vadThres = 0.4 + opts = 1 + + data, fs = sf.read(path) + assert fs == 16_000, "sample rate must be 16khz" + ft, flen, fsh10, nfr10 = speechproc.sflux(data, fs, winlen, ovrlen, nftt) + + # --spectral flatness -- + pv01 = np.zeros(ft.shape[0]) + pv01[np.less_equal(ft, ftThres)] = 1 + pitch = deepcopy(ft) + + pvblk = speechproc.pitchblockdetect(pv01, pitch, nfr10, opts) + + # --filtering-- + ENERGYFLOOR = np.exp(-50) + b = np.array([0.9770, -0.9770]) + a = np.array([1.0000, -0.9540]) + fdata = lfilter(b, a, data, axis=0) + + # --pass 1-- + noise_samp, noise_seg, n_noise_samp = speechproc.snre_highenergy( + fdata, nfr10, flen, fsh10, ENERGYFLOOR, pv01, pvblk + ) + + # sets noisy segments to zero + for j in range(n_noise_samp): + fdata[range(int(noise_samp[j, 0]), int(noise_samp[j, 1]) + 1)] = 0 + + vad_seg = speechproc.snre_vad( + fdata, nfr10, flen, fsh10, ENERGYFLOOR, pv01, pvblk, vadThres + ) + return vad_seg, data + + +def main(): + parser = get_parser() + args = parser.parse_args() + + sys.path.append(args.rvad_home) + import speechproc + + stride = 160 + lines = sys.stdin.readlines() + root = lines[0].rstrip() + for fpath in tqdm(lines[1:]): + path = osp.join(root, fpath.split()[0]) + vads, wav = rvad(speechproc, path) + + start = None + vad_segs = [] + for i, v in enumerate(vads): + if start is None and v == 1: + start = i * stride + elif start is not None and v == 0: + vad_segs.append((start, i * stride)) + start = None + if start is not None: + vad_segs.append((start, len(wav))) + + print(" ".join(f"{v[0]}:{v[1]}" for v in vad_segs)) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_apply_cluster_faiss.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_apply_cluster_faiss.py new file mode 100644 index 0000000..a5dd7ae --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_apply_cluster_faiss.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import os.path as osp +import numpy as np +import tqdm +import torch +import sys + +import faiss +import torch.nn.functional as F + +from wav2vec_cluster_faiss import parse_faiss_specs, Wav2VecFeatureReader + + +def get_parser(): + parser = argparse.ArgumentParser(description="apply clusters") + # fmt: off + parser.add_argument('data', help='location of tsv files') + parser.add_argument('--split', help='split to process', required=True) + parser.add_argument('--labels', help='split to process', default="phn") + parser.add_argument('--path', help='path to pca and centroids', required=True) + parser.add_argument('--checkpoint', type=str, help='checkpoint for wav2vec model (if using wav2vec features)', required=True) + parser.add_argument('--layer', '-l', type=int, help='which layer to read', default=14) + parser.add_argument('--max-tsz', type=int, help='batch kmeans up to this much', default=14) + # fmt: on + + return parser + + +def get_iterator(args): + label_path = osp.join(args.data, f"{args.split}.{args.labels}") + if osp.exists(label_path): + lp = open(label_path, "r") + else: + lp = None + + with open(osp.join(args.data, f"{args.split}.tsv"), "r") as fp: + lines = fp.read().split("\n") + root = lines.pop(0).strip() + files = [line.rstrip() for line in lines if len(line) > 0] + + if lp is not None: + lbls = [line.rstrip() for line in lp] + else: + lbls = [None] * len(files) + + num = len(files) + reader = Wav2VecFeatureReader(args.checkpoint, args.layer) + + def iterate(): + for fname, lbl in zip(files, lbls): + file = osp.join(root, fname.split("\t")[0]) + feats = reader.get_feats(file) + yield feats.data, fname, lbl + + return iterate, num, root + + +def main(): + parser = get_parser() + args = parser.parse_args() + + spec = osp.basename(args.path) + + try: + faiss_spec = parse_faiss_specs(spec.rstrip("/"))[0] + except: + print(spec) + raise + + print("Faiss Spec:", faiss_spec, file=sys.stderr) + + if faiss_spec.pca: + A = torch.from_numpy(np.load(osp.join(args.path, "pca_A.npy"))).cuda() + b = torch.from_numpy(np.load(osp.join(args.path, "pca_b.npy"))).cuda() + print("Loaded PCA", file=sys.stderr) + + centroids = np.load(osp.join(args.path, "centroids.npy")) + print("Loaded centroids", centroids.shape, file=sys.stderr) + + res = faiss.StandardGpuResources() + index_flat = ( + faiss.IndexFlatL2(centroids.shape[1]) + if not faiss_spec.sphere + else faiss.IndexFlatIP(centroids.shape[1]) + ) + faiss_index = faiss.index_cpu_to_gpu(res, 0, index_flat) + faiss_index.add(centroids) + + generator, num, root = get_iterator(args) + iterator = generator() + + had_labels = False + label_path = osp.join(args.path, f"{args.split}.{args.labels}") + + with torch.no_grad(): + with open(osp.join(args.path, f"{args.split}.src"), "w") as fp, open( + osp.join(args.path, f"{args.split}.tsv"), "w" + ) as pp, open(label_path, "w") as lp: + print(root, file=pp) + for f, fname, lbl in tqdm.tqdm(iterator, total=num): + if faiss_spec.pca: + f = torch.mm(f, A) + b + if faiss_spec.norm: + f = F.normalize(f, p=2, dim=-1) + + f = f.cpu().numpy() + + _, z = faiss_index.search(f, 1) + + print(" ".join(str(x.item()) for x in z), file=fp) + print(fname, file=pp) + + if lbl is not None: + print(lbl, file=lp) + had_labels = True + if not had_labels: + os.remove(label_path) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_cluster_faiss.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_cluster_faiss.py new file mode 100644 index 0000000..632a69e --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_cluster_faiss.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import gc +import os +import os.path as osp +import random +import numpy as np +import tqdm +import torch + +from collections import namedtuple + +import faiss + +import fairseq +import soundfile as sf + + +def get_parser(): + parser = argparse.ArgumentParser( + description="compute kmeans codebook from kaldi-computed feats" + ) + # fmt: off + parser.add_argument('data', help='location of tsv files') + parser.add_argument('--save-dir', help='where to save the output', required=True) + parser.add_argument('--checkpoint', type=str, help='checkpoint for wav2vec model (if using wav2vec features)', required=True) + parser.add_argument('--sample-pct', '-r', type=float, help='percentage of timesteps to sample', default=0) + parser.add_argument('--layer', '-l', type=int, help='which layer to read', default=14) + parser.add_argument('--faiss-specs', '-f', type=str, + help='faiss index specs; separated by space ' + 'format is: PCAx_NORM_CLUSx_SPHERICAL -> ' + 'PCAx if exists first apply PCA ' + 'NORM if exists, normalize the vector by L2 norm ' + 'CLUSx must exist, cluster to x clusters ' + 'SPEHRICAL if exists, apply spherical kmeans', + default='l2') + # fmt: on + + return parser + + +faiss_spec = namedtuple("faiss_spec", ["pca", "norm", "n_clus", "sphere", "spec_str"]) + + +def parse_faiss_specs(specs_str): + specs = [] + for ss in specs_str.split(): + comps = ss.split("_") + pca = 0 + norm = False + n_clus = 0 + sphere = False + for c in comps: + if c.startswith("PCA"): + pca = int(c[3:]) + elif c == "NORM": + norm = True + elif c.startswith("CLUS"): + n_clus = int(c[4:]) + elif c == "SPHERICAL": + sphere = True + assert n_clus > 0 + specs.append( + faiss_spec(pca=pca, norm=norm, n_clus=n_clus, sphere=sphere, spec_str=ss) + ) + return specs + + +class Wav2VecFeatureReader(object): + def __init__(self, cp_file, layer): + state = fairseq.checkpoint_utils.load_checkpoint_to_cpu(cp_file) + + self.layer = layer + + if "cfg" in state: + w2v_args = state["cfg"] + task = fairseq.tasks.setup_task(w2v_args.task) + model = task.build_model(w2v_args.model) + else: + w2v_args = state["args"] + task = fairseq.tasks.setup_task(w2v_args) + model = task.build_model(w2v_args) + model.load_state_dict(state["model"], strict=True) + model.eval() + model.cuda() + self.model = model + + def read_audio(self, fname): + """Load an audio file and return PCM along with the sample rate""" + wav, sr = sf.read(fname) + assert sr == 16e3 + + return wav + + def get_feats(self, loc): + x = self.read_audio(loc) + with torch.no_grad(): + source = torch.from_numpy(x).view(1, -1).float().cuda() + res = self.model( + source=source, mask=False, features_only=True, layer=self.layer + ) + return res["layer_results"][self.layer][0].squeeze(1) + + +def get_iterator(args): + with open(args.data, "r") as fp: + lines = fp.read().split("\n") + root = lines.pop(0).strip() + files = [osp.join(root, line.split("\t")[0]) for line in lines if len(line) > 0] + + if getattr(args, "sample_pct", 0) > 0: + files = random.sample(files, int(args.sample_pct * len(files))) + num = len(files) + reader = Wav2VecFeatureReader(args.checkpoint, args.layer) + + def iterate(): + for fname in files: + feats = reader.get_feats(fname) + yield feats.cpu().numpy() + + return iterate, num + + +def main(): + parser = get_parser() + args = parser.parse_args() + + faiss_specs = parse_faiss_specs(args.faiss_specs) + print("Faiss Specs:", faiss_specs) + + feat_path = osp.join(args.save_dir, "features") + if osp.exists(feat_path + ".npy"): + feats = np.load(feat_path + ".npy") + else: + generator, num = get_iterator(args) + iterator = generator() + + feats = [] + for f in tqdm.tqdm(iterator, total=num): + feats.append(f) + + del iterator + del generator + + feats = np.concatenate(feats) + + print(feats.shape) + + os.makedirs(args.save_dir, exist_ok=True) + # np.save(feat_path, feats) + + gc.collect() + torch.cuda.empty_cache() + + reload = False + for spec in faiss_specs: + print("Processing spec", spec) + + if reload: + print("Reloading...") + del feats + gc.collect() + feats = np.load(feat_path + ".npy") + + save_path = osp.join(args.save_dir, spec.spec_str) + os.makedirs(save_path, exist_ok=True) + d = feats.shape[-1] + x = feats + if spec.pca > 0: + print("Computing PCA") + pca = faiss.PCAMatrix(d, spec.pca) + pca.train(x) + d = spec.pca + b = faiss.vector_to_array(pca.b) + A = faiss.vector_to_array(pca.A).reshape(pca.d_out, pca.d_in) + np.save(osp.join(save_path, "pca_A"), A.T) + np.save(osp.join(save_path, "pca_b"), b) + print("Applying PCA") + x = pca.apply_py(x) + + if spec.norm: + reload = spec.pca <= 0 + print("Normalizing") + faiss.normalize_L2(x) + + print("Computing kmeans") + kmeans = faiss.Kmeans( + d, + spec.n_clus, + niter=50, + verbose=True, + spherical=spec.sphere, + max_points_per_centroid=feats.shape[0], + gpu=True, + nredo=3, + ) + kmeans.train(x) + np.save(osp.join(save_path, "centroids"), kmeans.centroids) + del kmeans + del x + gc.collect() + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_extract_features.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_extract_features.py new file mode 100644 index 0000000..b07e274 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wav2vec_extract_features.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import os.path as osp +import tqdm +import torch +import torch.nn.functional as F +from shutil import copyfile + +from npy_append_array import NpyAppendArray + +import fairseq +import soundfile as sf + + +def get_parser(): + parser = argparse.ArgumentParser( + description="compute kmeans codebook from kaldi-computed feats" + ) + # fmt: off + parser.add_argument('data', help='location of tsv files') + parser.add_argument('--split', help='which split to read', required=True) + parser.add_argument('--save-dir', help='where to save the output', required=True) + parser.add_argument('--checkpoint', type=str, help='checkpoint for wav2vec ctc model', required=True) + parser.add_argument('--layer', type=int, default=14, help='which layer to use') + # fmt: on + + return parser + + +class Wav2VecFeatureReader(object): + def __init__(self, cp_file, layer): + model, cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task( + [cp_file] + ) + model = model[0] + model.eval() + model.cuda() + self.model = model + self.task = task + self.layer = layer + + def read_audio(self, fname): + """Load an audio file and return PCM along with the sample rate""" + wav, sr = sf.read(fname) + assert sr == 16e3 + + return wav + + def get_feats(self, loc): + x = self.read_audio(loc) + with torch.no_grad(): + source = torch.from_numpy(x).float().cuda() + if self.task.cfg.normalize: + assert source.dim() == 1, source.dim() + with torch.no_grad(): + source = F.layer_norm(source, source.shape) + source = source.view(1, -1) + + m_res = self.model(source=source, mask=False, features_only=True, layer=self.layer) + return m_res["x"].squeeze(0).cpu() + + +def get_iterator(args): + with open(osp.join(args.data, args.split) + ".tsv", "r") as fp: + lines = fp.read().split("\n") + root = lines.pop(0).strip() + files = [osp.join(root, line.split("\t")[0]) for line in lines if len(line) > 0] + + num = len(files) + reader = Wav2VecFeatureReader(args.checkpoint, args.layer) + + def iterate(): + for fname in files: + w2v_feats = reader.get_feats(fname) + yield w2v_feats + + return iterate, num + + +def main(): + parser = get_parser() + args = parser.parse_args() + + os.makedirs(args.save_dir, exist_ok=True) + + def create_files(dest): + copyfile(osp.join(args.data, args.split) + ".tsv", dest + ".tsv") + if osp.exists(osp.join(args.data, args.split) + ".wrd"): + copyfile(osp.join(args.data, args.split) + ".wrd", dest + ".wrd") + if osp.exists(osp.join(args.data, args.split) + ".phn"): + copyfile(osp.join(args.data, args.split) + ".phn", dest + ".phn") + + if osp.exists(dest + ".npy"): + os.remove(dest + ".npy") + npaa = NpyAppendArray(dest + ".npy") + return npaa + + save_path = osp.join(args.save_dir, args.split) + npaa = create_files(save_path) + + generator, num = get_iterator(args) + iterator = generator() + + with open(save_path + ".lengths", "w") as l_f: + for w2v_feats in tqdm.tqdm(iterator, total=num): + print(len(w2v_feats), file=l_f) + + if len(w2v_feats) > 0: + npaa.append(w2v_feats.numpy()) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wer.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wer.py new file mode 100644 index 0000000..613ab50 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wer.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Implement unsupervised metric for decoding hyperparameter selection: + $$ alpha * LM_PPL + ViterbitUER(%) * 100 $$ +""" +import argparse +import logging +import sys + +import editdistance + +logging.root.setLevel(logging.INFO) +logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logger = logging.getLogger(__name__) + + +def get_parser(): + parser = argparse.ArgumentParser() + parser.add_argument("-s", "--hypo", help="hypo transcription", required=True) + parser.add_argument( + "-r", "--reference", help="reference transcription", required=True + ) + return parser + + +def compute_wer(ref_uid_to_tra, hyp_uid_to_tra, g2p): + d_cnt = 0 + w_cnt = 0 + w_cnt_h = 0 + for uid in hyp_uid_to_tra: + ref = ref_uid_to_tra[uid].split() + if g2p is not None: + hyp = g2p(hyp_uid_to_tra[uid]) + hyp = [p for p in hyp if p != "'" and p != " "] + hyp = [p[:-1] if p[-1].isnumeric() else p for p in hyp] + else: + hyp = hyp_uid_to_tra[uid].split() + d_cnt += editdistance.eval(ref, hyp) + w_cnt += len(ref) + w_cnt_h += len(hyp) + wer = float(d_cnt) / w_cnt + logger.debug( + ( + f"wer = {wer * 100:.2f}%; num. of ref words = {w_cnt}; " + f"num. of hyp words = {w_cnt_h}; num. of sentences = {len(ref_uid_to_tra)}" + ) + ) + return wer + + +def main(): + args = get_parser().parse_args() + + errs = 0 + count = 0 + with open(args.hypo, "r") as hf, open(args.reference, "r") as rf: + for h, r in zip(hf, rf): + h = h.rstrip().split() + r = r.rstrip().split() + errs += editdistance.eval(r, h) + count += len(r) + + logger.info(f"UER: {errs / count * 100:.2f}%") + + +if __name__ == "__main__": + main() + + +def load_tra(tra_path): + with open(tra_path, "r") as f: + uid_to_tra = {} + for line in f: + uid, tra = line.split(None, 1) + uid_to_tra[uid] = tra + logger.debug(f"loaded {len(uid_to_tra)} utterances from {tra_path}") + return uid_to_tra diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wrd_to_ltr.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wrd_to_ltr.py new file mode 100644 index 0000000..f834714 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/scripts/wrd_to_ltr.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + + +def main(): + for line in sys.stdin: + print(" ".join(list(line.strip().replace(" ", "|"))) + " |") + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/__init__.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/__init__.py new file mode 100644 index 0000000..6d7dd62 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .unpaired_audio_text import UnpairedAudioText + + +__all__ = [ + "UnpairedAudioText", +] diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/unpaired_audio_text.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/unpaired_audio_text.py new file mode 100644 index 0000000..5f29252 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/tasks/unpaired_audio_text.py @@ -0,0 +1,447 @@ +# Copyright (c) 2017-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the LICENSE file in +# the root directory of this source tree. An additional grant of patent rights +# can be found in the PATENTS file in the same directory. + +from dataclasses import dataclass, field +import logging +import math +import os +from typing import Optional +import torch + +from fairseq.logging import metrics +from fairseq.tasks import FairseqTask, register_task +from ..data import ExtractedFeaturesDataset, RandomInputDataset + +from fairseq.data import ( + Dictionary, + data_utils, + StripTokenDataset, +) +from fairseq.dataclass import FairseqDataclass +from fairseq.distributed.utils import get_data_parallel_world_size +from omegaconf import MISSING + +from examples.speech_recognition.kaldi.kaldi_decoder import ( + KaldiDecoder, + KaldiDecoderConfig, +) + + +logger = logging.getLogger(__name__) + + +@dataclass +class DecodingConfig(FairseqDataclass): + kenlm_path: Optional[str] = None + lm_weight: float = 0 + blank_weight: float = 0 + + +@dataclass +class UnpairedAudioTextConfig(FairseqDataclass): + data: str = field( + default=MISSING, metadata={"help": "path to data directory containing audio"} + ) + text_data: str = field( + default=MISSING, metadata={"help": "path to data directory containing text"} + ) + max_length: Optional[int] = None + labels: Optional[str] = field( + default=None, + metadata={"help": "extension of the label file to load, used for fine-tuning"}, + ) + unfiltered: bool = field( + default=False, metadata={"help": "load data with _unfiltered suffix"} + ) + ctc_eval: bool = field( + default=False, metadata={"help": "eval UER as if computed by CTC"} + ) + sort_by_length: bool = field( + default=True, metadata={"help": "sort examples by length of audio timesteps"} + ) + shuffle: bool = field(default=True, metadata={"help": "shuffle examples"}) + append_eos: bool = field(default=False, metadata={"help": "append eos"}) + uppercase: Optional[bool] = field( + default=False, metadata={"help": "uppercase for LM score computation"} + ) + skipwords: Optional[str] = field( + default="", + metadata={ + "help": "comma-separated words to be removed for LM score computation" + }, + ) + kenlm_path: Optional[str] = None + vocab_usage_power: float = 2 + + word_decoder_config: Optional[KaldiDecoderConfig] = None + word_kenlm_path: Optional[str] = None + + decoding_config: DecodingConfig = DecodingConfig() + + +@register_task("unpaired_audio_text", dataclass=UnpairedAudioTextConfig) +class UnpairedAudioText(FairseqTask): + """ """ + + cfg: UnpairedAudioTextConfig + + def __init__( + self, + cfg: UnpairedAudioTextConfig, + source_dictionary=None, + target_dictionary=None, + ): + super().__init__(cfg) + + self._target_dictionary = target_dictionary + self._source_dictionary = source_dictionary + self.num_symbols = ( + len([s for s in target_dictionary.symbols if not s.startswith("madeup")]) + - target_dictionary.nspecial + ) + self.sil_id = ( + target_dictionary.index("<SIL>") if "<SIL>" in target_dictionary else -1 + ) + self.kenlm = None + if cfg.kenlm_path is not None: + import kenlm + + self.kenlm = kenlm.Model(cfg.kenlm_path) + + self.word_kenlm = None + if cfg.word_kenlm_path is not None: + import kenlm + + self.word_kenlm = kenlm.Model(cfg.word_kenlm_path) + + self.uppercase = cfg.uppercase + self.skipwords = set(cfg.skipwords.split(",")) + + def str_postprocess(s): + s = " ".join(w for w in s.split() if w not in self.skipwords) + s = s.upper() if self.uppercase else s + return s + + self.str_postprocess = str_postprocess + self.compute_lm_score = lambda s: self.kenlm.score(self.str_postprocess(s)) + + self.compute_word_score = None + if cfg.word_decoder_config is not None: + self.kaldi_decoder = KaldiDecoder(cfg.word_decoder_config, beam=10) + + def compute_word_score(logits, padding): + res = self.kaldi_decoder.decode(logits, padding) + for r in res: + r = r.result() + assert len(r) == 1 + r = r[0] + yield r["score"], r["words"] + + self.compute_word_score = compute_word_score + + @classmethod + def setup_task(cls, cfg: UnpairedAudioTextConfig, **kwargs): + """Setup the task (e.g., load dictionaries). + + Args: + cfg (AudioPretrainingConfig): configuration of this task + """ + + dict_path = os.path.join(cfg.text_data, "dict.txt") + if os.path.exists(dict_path): + target_dictionary = Dictionary.load(dict_path) + else: + dict_path = os.path.join(cfg.data, f"dict.{cfg.labels}.txt") + target_dictionary = Dictionary.load(dict_path) + + return cls(cfg, target_dictionary=target_dictionary) + + def optimizer_step(self, optimizer, model, update_num): + if hasattr(model, "get_groups_for_update"): + groups = model.get_groups_for_update(update_num) + optimizer.step(groups={groups}) + else: + optimizer.step() + + def valid_step(self, sample, model, criterion): + res = model( + **sample["net_input"], + dense_x_only=True, + ) + + dense_x = res["logits"] + padding_mask = res["padding_mask"] + + word_scores = None + if self.compute_word_score is not None: + word_scores = self.compute_word_score(dense_x.cpu(), padding_mask.cpu()) + + z = dense_x.argmax(-1) + z[padding_mask] = self.target_dictionary.pad() + + vocab_seen = torch.zeros(self.num_symbols, dtype=torch.bool) + + import editdistance + + c_err = 0 + c_len = 0 + pred_c_len = 0 + lm_score_sum = 0 + for i, (x, t, id) in enumerate( + zip( + z, + sample["target"] if "target" in sample else [None] * len(z), + sample["id"], + ) + ): + + if t is not None: + t = t[(t >= self.target_dictionary.nspecial)] + x = x[ + (x >= self.target_dictionary.nspecial) + & (x < (self.num_symbols + self.target_dictionary.nspecial)) + ] + if self.sil_id >= 0: + x = x[x != self.sil_id] + + vocab_seen[x - self.target_dictionary.nspecial] = True + + pred_units_arr = x + if self.cfg.ctc_eval: + pred_units_arr = pred_units_arr.unique_consecutive() + pred_units_arr = pred_units_arr[pred_units_arr != 0] + + if id == 0: + if t is not None: + logger.info(f"REF: {self.target_dictionary.string(t)}") + logger.info(f"HYP: {self.target_dictionary.string(pred_units_arr)}") + + if self.kenlm is not None: + if t is not None: + ref_lm_s = self.compute_lm_score( + self.target_dictionary.string(t) + ) + logger.info( + f"LM [REF]: {ref_lm_s}, {math.pow(10, -ref_lm_s / (len(t) + 1))}" + ) + + hyp_lm_s = self.compute_lm_score( + self.target_dictionary.string(pred_units_arr) + ) + logger.info( + f"LM [HYP]: {hyp_lm_s}, {math.pow(10, -hyp_lm_s / (len(pred_units_arr) + 1))}" + ) + + pred_units_arr = pred_units_arr.tolist() + + pred_c_len += len(pred_units_arr) + + if t is not None: + t = t.tolist() + c_err += editdistance.eval(pred_units_arr, t) + c_len += len(t) + else: + c_len = pred_c_len + + if self.kenlm is not None: + pred_str = self.target_dictionary.string(pred_units_arr) + lm_score = self.compute_lm_score(pred_str) + lm_score_sum += lm_score + + kaldi_score_sum = 0 + word_lm_sum = 0 + num_words = 0 + if word_scores is not None: + for score, words in word_scores: + kaldi_score_sum += score + num_words += len(words) + if self.word_kenlm is not None: + word_lm_sum += self.kenlm.score(" ".join(words)) + + try: + world_size = get_data_parallel_world_size() + except: + world_size = 1 + + logging_output = { + "loss": c_err, + "_num_char_errors": c_err, + "_num_chars": c_len, + "_num_pred_chars": pred_c_len, + "ntokens": c_len, + "nsentences": z.size(0), + "sample_size": c_len, + "_world_size": world_size, + "_lm_score_sum": lm_score_sum, + "_kaldi_score_sum": kaldi_score_sum, + "_word_lm_sum": word_lm_sum, + "_num_words": num_words, + "_vocab_seen": vocab_seen, + } + + return c_err, c_len, logging_output + + def load_dataset(self, split: str, task_cfg: FairseqDataclass = None, **kwargs): + data_path = self.cfg.data + task_cfg = task_cfg or self.cfg + + has_unpaired_text = os.path.exists( + os.path.join(self.cfg.text_data, f"{split}.idx") + ) + + self.datasets[split] = ExtractedFeaturesDataset( + path=data_path, + split=split, + min_length=3, + max_length=task_cfg.max_length, + labels=None if has_unpaired_text else task_cfg.labels, + label_dict=self.target_dictionary, + shuffle=getattr(task_cfg, "shuffle", True), + sort_by_length=task_cfg.sort_by_length, + ) + + logger.info(f"split {split} has unpaired text? {has_unpaired_text}") + if has_unpaired_text: + text_dataset = data_utils.load_indexed_dataset( + os.path.join(self.cfg.text_data, split), self.target_dictionary + ) + text_dataset = StripTokenDataset(text_dataset, self.target_dictionary.eos()) + self.datasets[split] = RandomInputDataset( + self.datasets[split], + text_dataset, + ["random_label"], + add_to_input=True, + pad_idx=self.target_dictionary.pad(), + ) + + @property + def source_dictionary(self): + return self._source_dictionary + + @property + def target_dictionary(self): + """Return the :class:`~fairseq.data.Dictionary` for the language + model.""" + return self._target_dictionary + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def reduce_metrics(self, logging_outputs, criterion): + super().reduce_metrics(logging_outputs, criterion) + + zero = torch.scalar_tensor(0.0) + num_char_errors = sum( + log.get("_num_char_errors", zero) for log in logging_outputs + ) + num_chars = sum(log.get("_num_chars", zero) for log in logging_outputs) + num_word_errors = sum( + log.get("_num_word_errors", zero) for log in logging_outputs + ) + num_words = sum(log.get("_num_words", zero) for log in logging_outputs) + num_pred_chars = sum( + log.get("_num_pred_chars", zero) for log in logging_outputs + ) + + lm_score_sum = sum(log.get("_lm_score_sum", zero) for log in logging_outputs) + vocab_seen = ( + sum(log.get("_vocab_seen", zero) for log in logging_outputs) + .bool() + .sum() + .item() + ) + kaldi_score_sum = sum( + log.get("_kaldi_score_sum", zero) for log in logging_outputs + ) + word_lm_sum = sum(log.get("_word_lm_sum", zero) for log in logging_outputs) + + metrics.log_scalar_sum("_num_char_errors", num_char_errors) + metrics.log_scalar_sum("_num_chars", num_chars) + metrics.log_scalar_sum("_num_word_errors", num_word_errors) + metrics.log_scalar_sum("_num_words", num_words) + + metrics.log_scalar_sum("lm_score_sum", lm_score_sum) + metrics.log_scalar_sum("num_pred_chars", num_pred_chars) + + if self.cfg.word_kenlm_path is not None: + metrics.log_scalar_sum("kaldi_score_sum", kaldi_score_sum) + metrics.log_scalar_sum("word_lm_sum", word_lm_sum) + + if num_chars > 0: + metrics.log_derived( + "uer", + lambda meters: meters["_num_char_errors"].sum + * 100.0 + / meters["_num_chars"].sum + if meters["_num_chars"].sum > 0 + else float("nan"), + ) + + if lm_score_sum < 0 and vocab_seen > 0: + metrics.log_scalar("vocab_seen_pct", vocab_seen / self.num_symbols) + + metrics.log_derived( + "weighted_lm_ppl", + lambda meters: math.pow( + 10, + -meters["lm_score_sum"].sum + / ( + meters["num_pred_chars"].sum + meters["nsentences"].sum + ), # account for </s> + ) + / meters["vocab_seen_pct"].avg ** self.cfg.vocab_usage_power, + ) + + metrics.log_derived( + "lm_ppl", + lambda meters: math.pow( + 10, + -meters["lm_score_sum"].sum + / ( + meters["num_pred_chars"].sum + meters["nsentences"].sum + ), # account for </s> + ), + ) + else: + metrics.log_derived("weighted_lm_ppl", lambda meters: float("inf")) + + if num_words > 0: + if word_lm_sum != 0: + metrics.log_derived( + "word_lm_ppl", + lambda meters: math.pow( + 10, + -meters["word_lm_sum"].sum + / ( + meters["_num_words"].sum + meters["nsentences"].sum + ), # account for </s> + ), + ) + metrics.log_derived( + "weighted_word_lm_ppl", + lambda meters: math.pow( + 10, + -meters["word_lm_sum"].sum + / ( + meters["_num_words"].sum + meters["nsentences"].sum + ), # account for </s> + ) + / meters["vocab_seen_pct"].avg ** self.cfg.vocab_usage_power, + ) + + if self.cfg.word_kenlm_path is not None: + metrics.log_derived( + "kaldi_score", + lambda meters: meters["kaldi_score_sum"].sum + / meters["nsentences"].sum, + ) + + def build_model(self, cfg: FairseqDataclass): + model = super().build_model(cfg) + + return model diff --git a/SpeechT5/fairseq/examples/wav2vec/unsupervised/w2vu_generate.py b/SpeechT5/fairseq/examples/wav2vec/unsupervised/w2vu_generate.py new file mode 100644 index 0000000..2bad873 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/unsupervised/w2vu_generate.py @@ -0,0 +1,709 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Run inference for pre-processed data with a trained model. +""" + +import ast +from collections import namedtuple +from dataclasses import dataclass, field +from enum import Enum, auto +import hydra +from hydra.core.config_store import ConfigStore +import logging +import math +import os +from omegaconf import OmegaConf +from typing import Optional +import sys + +import editdistance +import torch + +from hydra.core.hydra_config import HydraConfig + +from fairseq import checkpoint_utils, progress_bar, tasks, utils +from fairseq.data.data_utils import post_process +from fairseq.dataclass.configs import FairseqDataclass, FairseqConfig +from fairseq.logging.meters import StopwatchMeter +from omegaconf import open_dict + +from examples.speech_recognition.kaldi.kaldi_decoder import KaldiDecoderConfig + +logging.root.setLevel(logging.INFO) +logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logger = logging.getLogger(__name__) + + +class DecoderType(Enum): + VITERBI = auto() + KENLM = auto() + FAIRSEQ = auto() + KALDI = auto() + + +@dataclass +class UnsupGenerateConfig(FairseqDataclass): + fairseq: FairseqConfig = FairseqConfig() + lm_weight: float = field( + default=2.0, + metadata={"help": "language model weight"}, + ) + w2l_decoder: DecoderType = field( + default=DecoderType.VITERBI, + metadata={"help": "type of decoder to use"}, + ) + kaldi_decoder_config: Optional[KaldiDecoderConfig] = None + lexicon: Optional[str] = field( + default=None, + metadata={ + "help": "path to lexicon. This is also used to 'phonemize' for unsupvised param tuning" + }, + ) + lm_model: Optional[str] = field( + default=None, + metadata={"help": "path to language model (kenlm or fairseq)"}, + ) + unit_lm: bool = field( + default=False, + metadata={"help": "whether to use unit lm"}, + ) + beam_threshold: float = field( + default=50.0, + metadata={"help": "beam score threshold"}, + ) + beam_size_token: float = field( + default=100.0, + metadata={"help": "max tokens per beam"}, + ) + beam: int = field( + default=5, + metadata={"help": "decoder beam size"}, + ) + nbest: int = field( + default=1, + metadata={"help": "number of results to return"}, + ) + word_score: float = field( + default=1.0, + metadata={"help": "word score to add at end of word"}, + ) + unk_weight: float = field( + default=-math.inf, + metadata={"help": "unknown token weight"}, + ) + sil_weight: float = field( + default=0.0, + metadata={"help": "silence token weight"}, + ) + targets: Optional[str] = field( + default=None, + metadata={"help": "extension of ground truth labels to compute UER"}, + ) + results_path: Optional[str] = field( + default=None, + metadata={"help": "where to store results"}, + ) + post_process: Optional[str] = field( + default=None, + metadata={"help": "how to post process results"}, + ) + vocab_usage_power: float = field( + default=2, + metadata={"help": "for unsupervised param tuning"}, + ) + + viterbi_transcript: Optional[str] = field( + default=None, + metadata={"help": "for unsupervised param tuning"}, + ) + min_lm_ppl: float = field( + default=0, + metadata={"help": "for unsupervised param tuning"}, + ) + min_vt_uer: float = field( + default=0, + metadata={"help": "for unsupervised param tuning"}, + ) + + blank_weight: float = field( + default=0, + metadata={"help": "value to add or set for blank emission"}, + ) + blank_mode: str = field( + default="set", + metadata={ + "help": "can be add or set, how to modify blank emission with blank weight" + }, + ) + sil_is_blank: bool = field( + default=False, + metadata={"help": "if true, <SIL> token is same as blank token"}, + ) + + unsupervised_tuning: bool = field( + default=False, + metadata={ + "help": "if true, returns a score based on unsupervised param selection metric instead of UER" + }, + ) + is_ax: bool = field( + default=False, + metadata={ + "help": "if true, assumes we are using ax for tuning and returns a tuple for ax to consume" + }, + ) + + +def get_dataset_itr(cfg, task): + return task.get_batch_iterator( + dataset=task.dataset(cfg.fairseq.dataset.gen_subset), + max_tokens=cfg.fairseq.dataset.max_tokens, + max_sentences=cfg.fairseq.dataset.batch_size, + max_positions=(sys.maxsize, sys.maxsize), + ignore_invalid_inputs=cfg.fairseq.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.fairseq.dataset.required_batch_size_multiple, + num_shards=cfg.fairseq.dataset.num_shards, + shard_id=cfg.fairseq.dataset.shard_id, + num_workers=cfg.fairseq.dataset.num_workers, + data_buffer_size=cfg.fairseq.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + + +def process_predictions( + cfg: UnsupGenerateConfig, + hypos, + tgt_dict, + target_tokens, + res_files, +): + retval = [] + word_preds = [] + transcriptions = [] + dec_scores = [] + + for i, hypo in enumerate(hypos[: min(len(hypos), cfg.nbest)]): + if torch.is_tensor(hypo["tokens"]): + tokens = hypo["tokens"].int().cpu() + tokens = tokens[tokens >= tgt_dict.nspecial] + hyp_pieces = tgt_dict.string(tokens) + else: + hyp_pieces = " ".join(hypo["tokens"]) + + if "words" in hypo and len(hypo["words"]) > 0: + hyp_words = " ".join(hypo["words"]) + else: + hyp_words = post_process(hyp_pieces, cfg.post_process) + + to_write = {} + if res_files is not None: + to_write[res_files["hypo.units"]] = hyp_pieces + to_write[res_files["hypo.words"]] = hyp_words + + tgt_words = "" + if target_tokens is not None: + if isinstance(target_tokens, str): + tgt_pieces = tgt_words = target_tokens + else: + tgt_pieces = tgt_dict.string(target_tokens) + tgt_words = post_process(tgt_pieces, cfg.post_process) + + if res_files is not None: + to_write[res_files["ref.units"]] = tgt_pieces + to_write[res_files["ref.words"]] = tgt_words + + if not cfg.fairseq.common_eval.quiet: + logger.info(f"HYPO {i}:" + hyp_words) + if tgt_words: + logger.info("TARGET:" + tgt_words) + + if "am_score" in hypo and "lm_score" in hypo: + logger.info( + f"DECODER AM SCORE: {hypo['am_score']}, DECODER LM SCORE: {hypo['lm_score']}, DECODER SCORE: {hypo['score']}" + ) + elif "score" in hypo: + logger.info(f"DECODER SCORE: {hypo['score']}") + + logger.info("___________________") + + hyp_words_arr = hyp_words.split() + tgt_words_arr = tgt_words.split() + + retval.append( + ( + editdistance.eval(hyp_words_arr, tgt_words_arr), + len(hyp_words_arr), + len(tgt_words_arr), + hyp_pieces, + hyp_words, + ) + ) + word_preds.append(hyp_words_arr) + transcriptions.append(to_write) + dec_scores.append(-hypo.get("score", 0)) # negate cuz kaldi returns NLL + + if len(retval) > 1: + best = None + for r, t in zip(retval, transcriptions): + if best is None or r[0] < best[0][0]: + best = r, t + for dest, tran in best[1].items(): + print(tran, file=dest) + dest.flush() + return best[0] + + assert len(transcriptions) == 1 + for dest, tran in transcriptions[0].items(): + print(tran, file=dest) + + return retval[0] + + +def prepare_result_files(cfg: UnsupGenerateConfig): + def get_res_file(file_prefix): + if cfg.fairseq.dataset.num_shards > 1: + file_prefix = f"{cfg.fairseq.dataset.shard_id}_{file_prefix}" + path = os.path.join( + cfg.results_path, + "{}{}.txt".format( + cfg.fairseq.dataset.gen_subset, + file_prefix, + ), + ) + return open(path, "w", buffering=1) + + if not cfg.results_path: + return None + + return { + "hypo.words": get_res_file(""), + "hypo.units": get_res_file("_units"), + "ref.words": get_res_file("_ref"), + "ref.units": get_res_file("_ref_units"), + "hypo.nbest.words": get_res_file("_nbest_words"), + } + + +def optimize_models(cfg: UnsupGenerateConfig, use_cuda, models): + """Optimize ensemble for generation""" + for model in models: + model.eval() + if cfg.fairseq.common.fp16: + model.half() + if use_cuda: + model.cuda() + + +GenResult = namedtuple( + "GenResult", + [ + "count", + "errs_t", + "gen_timer", + "lengths_hyp_unit_t", + "lengths_hyp_t", + "lengths_t", + "lm_score_t", + "num_feats", + "num_sentences", + "num_symbols", + "vt_err_t", + "vt_length_t", + ], +) + + +def generate(cfg: UnsupGenerateConfig, models, saved_cfg, use_cuda): + task = tasks.setup_task(cfg.fairseq.task) + saved_cfg.task.labels = cfg.fairseq.task.labels + task.load_dataset(cfg.fairseq.dataset.gen_subset, task_cfg=saved_cfg.task) + # Set dictionary + tgt_dict = task.target_dictionary + logger.info( + "| {} {} {} examples".format( + cfg.fairseq.task.data, + cfg.fairseq.dataset.gen_subset, + len(task.dataset(cfg.fairseq.dataset.gen_subset)), + ) + ) + # Load dataset (possibly sharded) + itr = get_dataset_itr(cfg, task) + # Initialize generator + gen_timer = StopwatchMeter() + + def build_generator(cfg: UnsupGenerateConfig): + w2l_decoder = cfg.w2l_decoder + if w2l_decoder == DecoderType.VITERBI: + from examples.speech_recognition.w2l_decoder import W2lViterbiDecoder + + return W2lViterbiDecoder(cfg, task.target_dictionary) + elif w2l_decoder == DecoderType.KENLM: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + return W2lKenLMDecoder(cfg, task.target_dictionary) + elif w2l_decoder == DecoderType.FAIRSEQ: + from examples.speech_recognition.w2l_decoder import W2lFairseqLMDecoder + + return W2lFairseqLMDecoder(cfg, task.target_dictionary) + elif w2l_decoder == DecoderType.KALDI: + from examples.speech_recognition.kaldi.kaldi_decoder import KaldiDecoder + + assert cfg.kaldi_decoder_config is not None + + return KaldiDecoder( + cfg.kaldi_decoder_config, + cfg.beam, + ) + else: + raise NotImplementedError( + "only wav2letter decoders with (viterbi, kenlm, fairseqlm) options are supported at the moment but found " + + str(w2l_decoder) + ) + + generator = build_generator(cfg) + + kenlm = None + fairseq_lm = None + if cfg.lm_model is not None: + import kenlm + + kenlm = kenlm.Model(cfg.lm_model) + + num_sentences = 0 + if cfg.results_path is not None and not os.path.exists(cfg.results_path): + os.makedirs(cfg.results_path) + + res_files = prepare_result_files(cfg) + errs_t = 0 + lengths_hyp_t = 0 + lengths_hyp_unit_t = 0 + lengths_t = 0 + count = 0 + num_feats = 0 + all_hyp_pieces = [] + all_hyp_words = [] + + num_symbols = ( + len([s for s in tgt_dict.symbols if not s.startswith("madeup")]) + - tgt_dict.nspecial + ) + targets = None + if cfg.targets is not None: + tgt_path = os.path.join( + cfg.fairseq.task.data, cfg.fairseq.dataset.gen_subset + "." + cfg.targets + ) + if os.path.exists(tgt_path): + with open(tgt_path, "r") as f: + targets = f.read().splitlines() + viterbi_transcript = None + if cfg.viterbi_transcript is not None and len(cfg.viterbi_transcript) > 0: + logger.info(f"loading viterbi transcript from {cfg.viterbi_transcript}") + with open(cfg.viterbi_transcript, "r") as vf: + viterbi_transcript = vf.readlines() + viterbi_transcript = [v.rstrip().split() for v in viterbi_transcript] + + gen_timer.start() + + start = 0 + end = len(itr) + + hypo_futures = None + if cfg.w2l_decoder == DecoderType.KALDI: + logger.info("Extracting features") + hypo_futures = [] + samples = [] + with progress_bar.build_progress_bar(cfg.fairseq.common, itr) as t: + for i, sample in enumerate(t): + if "net_input" not in sample or i < start or i >= end: + continue + if "padding_mask" not in sample["net_input"]: + sample["net_input"]["padding_mask"] = None + + hypos, num_feats = gen_hypos( + generator, models, num_feats, sample, task, use_cuda + ) + hypo_futures.append(hypos) + samples.append(sample) + if cfg.debug: + break + itr = list(zip(hypo_futures, samples)) + start = 0 + end = len(itr) + logger.info("Finished extracting features") + + with progress_bar.build_progress_bar(cfg.fairseq.common, itr) as t: + for i, sample in enumerate(t): + if i < start or i >= end: + continue + + if hypo_futures is not None: + hypos, sample = sample + hypos = [h.result() for h in hypos] + else: + if "net_input" not in sample: + continue + + hypos, num_feats = gen_hypos( + generator, models, num_feats, sample, task, use_cuda + ) + + for i, sample_id in enumerate(sample["id"].tolist()): + if targets is not None: + target_tokens = targets[sample_id] + elif "target" in sample or "target_label" in sample: + toks = ( + sample["target"][i, :] + if "target_label" not in sample + else sample["target_label"][i, :] + ) + + target_tokens = utils.strip_pad(toks, tgt_dict.pad()).int().cpu() + else: + target_tokens = None + + # Process top predictions + ( + errs, + length_hyp, + length, + hyp_pieces, + hyp_words, + ) = process_predictions( + cfg, + hypos[i], + tgt_dict, + target_tokens, + res_files, + ) + errs_t += errs + lengths_hyp_t += length_hyp + lengths_hyp_unit_t += ( + len(hyp_pieces) if len(hyp_pieces) > 0 else len(hyp_words) + ) + lengths_t += length + count += 1 + all_hyp_pieces.append(hyp_pieces) + all_hyp_words.append(hyp_words) + + num_sentences += ( + sample["nsentences"] if "nsentences" in sample else sample["id"].numel() + ) + + lm_score_sum = 0 + if kenlm is not None: + + if cfg.unit_lm: + lm_score_sum = sum(kenlm.score(w) for w in all_hyp_pieces) + else: + lm_score_sum = sum(kenlm.score(w) for w in all_hyp_words) + elif fairseq_lm is not None: + lm_score_sum = sum(fairseq_lm.score([h.split() for h in all_hyp_words])[0]) + + vt_err_t = 0 + vt_length_t = 0 + if viterbi_transcript is not None: + unit_hyps = [] + if cfg.targets is not None and cfg.lexicon is not None: + lex = {} + with open(cfg.lexicon, "r") as lf: + for line in lf: + items = line.rstrip().split() + lex[items[0]] = items[1:] + for h in all_hyp_pieces: + hyp_ws = [] + for w in h.split(): + assert w in lex, w + hyp_ws.extend(lex[w]) + unit_hyps.append(hyp_ws) + + else: + unit_hyps.extend([h.split() for h in all_hyp_words]) + + vt_err_t = sum( + editdistance.eval(vt, h) for vt, h in zip(viterbi_transcript, unit_hyps) + ) + + vt_length_t = sum(len(h) for h in viterbi_transcript) + + if res_files is not None: + for r in res_files.values(): + r.close() + + gen_timer.stop(lengths_hyp_t) + + return GenResult( + count, + errs_t, + gen_timer, + lengths_hyp_unit_t, + lengths_hyp_t, + lengths_t, + lm_score_sum, + num_feats, + num_sentences, + num_symbols, + vt_err_t, + vt_length_t, + ) + + +def gen_hypos(generator, models, num_feats, sample, task, use_cuda): + sample = utils.move_to_cuda(sample) if use_cuda else sample + + if "features" in sample["net_input"]: + sample["net_input"]["dense_x_only"] = True + num_feats += ( + sample["net_input"]["features"].shape[0] + * sample["net_input"]["features"].shape[1] + ) + hypos = task.inference_step(generator, models, sample, None) + return hypos, num_feats + + +def main(cfg: UnsupGenerateConfig, model=None): + if ( + cfg.fairseq.dataset.max_tokens is None + and cfg.fairseq.dataset.batch_size is None + ): + cfg.fairseq.dataset.max_tokens = 1024000 + + use_cuda = torch.cuda.is_available() and not cfg.fairseq.common.cpu + + task = tasks.setup_task(cfg.fairseq.task) + + overrides = ast.literal_eval(cfg.fairseq.common_eval.model_overrides) + + if cfg.fairseq.task._name == "unpaired_audio_text": + overrides["model"] = { + "blank_weight": cfg.blank_weight, + "blank_mode": cfg.blank_mode, + "blank_is_sil": cfg.sil_is_blank, + "no_softmax": True, + "segmentation": { + "type": "NONE", + }, + } + else: + overrides["model"] = { + "blank_weight": cfg.blank_weight, + "blank_mode": cfg.blank_mode, + } + + if model is None: + # Load ensemble + logger.info("| loading model(s) from {}".format(cfg.fairseq.common_eval.path)) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + cfg.fairseq.common_eval.path.split("\\"), + arg_overrides=overrides, + task=task, + suffix=cfg.fairseq.checkpoint.checkpoint_suffix, + strict=(cfg.fairseq.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.fairseq.checkpoint.checkpoint_shard_count, + ) + optimize_models(cfg, use_cuda, models) + else: + models = [model] + saved_cfg = cfg.fairseq + + with open_dict(saved_cfg.task): + saved_cfg.task.shuffle = False + saved_cfg.task.sort_by_length = False + + gen_result = generate(cfg, models, saved_cfg, use_cuda) + + wer = None + if gen_result.lengths_t > 0: + wer = gen_result.errs_t * 100.0 / gen_result.lengths_t + logger.info(f"WER: {wer}") + + lm_ppl = float("inf") + + if gen_result.lm_score_t != 0 and gen_result.lengths_hyp_t > 0: + hyp_len = gen_result.lengths_hyp_t + lm_ppl = math.pow( + 10, -gen_result.lm_score_t / (hyp_len + gen_result.num_sentences) + ) + logger.info(f"LM PPL: {lm_ppl}") + + logger.info( + "| Processed {} sentences ({} tokens) in {:.1f}s ({:.2f}" + " sentences/s, {:.2f} tokens/s)".format( + gen_result.num_sentences, + gen_result.gen_timer.n, + gen_result.gen_timer.sum, + gen_result.num_sentences / gen_result.gen_timer.sum, + 1.0 / gen_result.gen_timer.avg, + ) + ) + + vt_diff = None + if gen_result.vt_length_t > 0: + vt_diff = gen_result.vt_err_t / gen_result.vt_length_t + vt_diff = max(cfg.min_vt_uer, vt_diff) + + lm_ppl = max(cfg.min_lm_ppl, lm_ppl) + + if not cfg.unsupervised_tuning == 0: + weighted_score = wer + else: + weighted_score = math.log(lm_ppl) * (vt_diff or 1.0) + + res = ( + f"| Generate {cfg.fairseq.dataset.gen_subset} with beam={cfg.beam}, " + f"lm_weight={cfg.kaldi_decoder_config.acoustic_scale if cfg.kaldi_decoder_config else cfg.lm_weight}, " + f"word_score={cfg.word_score}, sil_weight={cfg.sil_weight}, blank_weight={cfg.blank_weight}, " + f"WER: {wer}, LM_PPL: {lm_ppl}, num feats: {gen_result.num_feats}, " + f"length: {gen_result.lengths_hyp_t}, UER to viterbi: {(vt_diff or 0) * 100}, score: {weighted_score}" + ) + + logger.info(res) + # print(res) + + return task, weighted_score + + +@hydra.main( + config_path=os.path.join("../../..", "fairseq", "config"), config_name="config" +) +def hydra_main(cfg): + with open_dict(cfg): + # make hydra logging work with ddp (see # see https://github.com/facebookresearch/hydra/issues/1126) + cfg.job_logging_cfg = OmegaConf.to_container( + HydraConfig.get().job_logging, resolve=True + ) + + cfg = OmegaConf.create( + OmegaConf.to_container(cfg, resolve=False, enum_to_str=False) + ) + OmegaConf.set_struct(cfg, True) + logger.info(cfg) + + utils.import_user_module(cfg.fairseq.common) + + _, score = main(cfg) + + if cfg.is_ax: + return score, None + return score + + +def cli_main(): + try: + from hydra._internal.utils import get_args + + cfg_name = get_args().config_name or "config" + except: + logger.warning("Failed to get config name from hydra args") + cfg_name = "config" + + cs = ConfigStore.instance() + cs.store(name=cfg_name, node=UnsupGenerateConfig) + hydra_main() + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/examples/wav2vec/vq-wav2vec_featurize.py b/SpeechT5/fairseq/examples/wav2vec/vq-wav2vec_featurize.py new file mode 100644 index 0000000..627072e --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/vq-wav2vec_featurize.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Helper script to pre-compute embeddings for a flashlight (previously called wav2letter++) dataset +""" + +import argparse +import glob +import os +import os.path as osp +import pprint + +import soundfile as sf +import torch +import fairseq +from torch import nn +from torch.utils.data import DataLoader + + +try: + import tqdm +except: + print("Install tqdm to use --log-format=tqdm") + + +class FilesDataset: + def __init__(self, files, labels): + self.files = files + if labels and osp.exists(labels): + with open(labels, "r") as lbl_f: + self.labels = [line.rstrip() for line in lbl_f] + else: + self.labels = labels + + def __len__(self): + return len(self.files) + + def __getitem__(self, index): + fname = self.files[index] + + wav, sr = sf.read(fname) + assert sr == 16000 + + wav = torch.from_numpy(wav).float() + lbls = None + if self.labels: + if isinstance(self.labels, str): + lbl_file = osp.splitext(fname)[0] + "." + self.labels + with open(lbl_file, "r") as lblf: + lbls = lblf.readline() + assert lbls is not None + else: + lbls = self.labels[index] + return wav, lbls + + def collate(self, batch): + return batch + + +class ArgTypes: + @staticmethod + def existing_path(arg): + arg = str(arg) + assert osp.exists(arg), f"File {arg} does not exist" + return arg + + @staticmethod + def mkdir(arg): + arg = str(arg) + os.makedirs(arg, exist_ok=True) + return arg + + +class DatasetWriter: + def __init__(self): + + self.args = self.load_config() + pprint.pprint(self.args.__dict__) + + self.model = self.load_model() + + def __getattr__(self, attr): + return getattr(self.args, attr) + + def read_manifest(self, fname): + + with open(fname, "r") as fp: + lines = fp.read().split("\n") + root = lines.pop(0).strip() + fnames = [ + osp.join(root, line.split("\t")[0]) for line in lines if len(line) > 0 + ] + + return fnames + + def process_splits(self): + + if self.args.shard is not None or self.args.num_shards is not None: + assert self.args.shard is not None and self.args.num_shards is not None + + for split in self.splits: + print(split) + + if self.extension == "tsv": + datadir = osp.join(self.data_dir, f"{split}.{self.extension}") + print("Reading manifest file: ", datadir) + files = self.read_manifest(datadir) + else: + datadir = osp.join(self.data_dir, split, f"**/*.{self.extension}") + files = glob.glob(datadir, recursive=True) + + assert len(files) > 0 + + if self.args.shard is not None: + files = files[self.args.shard :: self.args.num_shards] + + lbls = [] + with open(self.data_file(split), "w") as srcf: + for line, lbl in self.iterate(files): + print(line, file=srcf) + if self.args.labels: + lbls.append(lbl + "\n") + + if self.args.labels: + assert all(a is not None for a in lbls) + with open(self.lbl_file(split), "w") as lblf: + lblf.writelines(lbls) + + def iterate(self, files): + + data = self.load_data(files) + for samples in tqdm.tqdm(data, total=len(files) // 32): + + for wav, lbl in samples: + x = wav.unsqueeze(0).float().cuda() + + div = 1 + while x.size(-1) // div > self.args.max_size: + div += 1 + + xs = x.chunk(div, dim=-1) + + result = [] + for x in xs: + torch.cuda.empty_cache() + x = self.model.feature_extractor(x) + if self.quantize_location == "encoder": + with torch.no_grad(): + _, idx = self.model.vector_quantizer.forward_idx(x) + idx = idx.squeeze(0).cpu() + else: + with torch.no_grad(): + z = self.model.feature_aggregator(x) + _, idx = self.model.vector_quantizer.forward_idx(z) + idx = idx.squeeze(0).cpu() + result.append(idx) + + idx = torch.cat(result, dim=0) + yield " ".join("-".join(map(str, a.tolist())) for a in idx), lbl + + def lbl_file(self, name): + shard_part = "" if self.args.shard is None else f".{self.args.shard}" + return osp.join(self.output_dir, f"{name}.lbl{shard_part}") + + def data_file(self, name): + shard_part = "" if self.args.shard is None else f".{self.args.shard}" + return osp.join(self.output_dir, f"{name}.src{shard_part}") + + def var_file(self): + return osp.join(self.output_dir, f"vars.pt") + + def load_config(self): + + parser = argparse.ArgumentParser("Vector Quantized wav2vec features") + + # Model Arguments + parser.add_argument("--checkpoint", type=ArgTypes.existing_path, required=True) + parser.add_argument("--data-parallel", action="store_true") + + # Output Arguments + parser.add_argument("--output-dir", type=ArgTypes.mkdir, required=True) + + # Data Arguments + parser.add_argument("--data-dir", type=ArgTypes.existing_path, required=True) + parser.add_argument("--splits", type=str, nargs="+", required=True) + parser.add_argument("--extension", type=str, required=True) + parser.add_argument("--labels", type=str, required=False) + + parser.add_argument("--shard", type=int, default=None) + parser.add_argument("--num-shards", type=int, default=None) + parser.add_argument("--max-size", type=int, default=1300000) + + # Logger Arguments + parser.add_argument( + "--log-format", type=str, choices=["none", "simple", "tqdm"] + ) + + return parser.parse_args() + + def load_data(self, fnames): + + dataset = FilesDataset(fnames, self.args.labels) + loader = DataLoader( + dataset, batch_size=32, collate_fn=dataset.collate, num_workers=8 + ) + return loader + + def load_model(self): + model, cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task([self.checkpoint]) + model = model[0] + + self.quantize_location = getattr(cfg.model, "vq", "encoder") + + model.eval().float() + model.cuda() + + if self.data_parallel: + model = nn.DataParallel(model) + + return model + + def __call__(self): + + self.process_splits() + + if hasattr(self.model.feature_extractor, "vars") and ( + self.args.shard is None or self.args.shard == 0 + ): + vars = ( + self.model.feature_extractor.vars.view( + self.model.feature_extractor.banks, + self.model.feature_extractor.num_vars, + -1, + ) + .cpu() + .detach() + ) + print("writing learned latent variable embeddings: ", vars.shape) + torch.save(vars, self.var_file()) + + +if __name__ == "__main__": + write_data = DatasetWriter() + + write_data() + print("Done.") diff --git a/SpeechT5/fairseq/examples/wav2vec/wav2vec_featurize.py b/SpeechT5/fairseq/examples/wav2vec/wav2vec_featurize.py new file mode 100644 index 0000000..588268b --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/wav2vec_featurize.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Helper script to pre-compute embeddings for a flashlight (previously called wav2letter++) dataset +""" + +import argparse +import glob +import os +from shutil import copy + +import h5py +import numpy as np +import soundfile as sf +import torch +import tqdm +import fairseq +from torch import nn + + +def read_audio(fname): + """ Load an audio file and return PCM along with the sample rate """ + + wav, sr = sf.read(fname) + assert sr == 16e3 + + return wav, 16e3 + + +class PretrainedWav2VecModel(nn.Module): + def __init__(self, fname): + super().__init__() + + model, cfg, task = fairseq.checkpoint_utils.load_model_ensemble_and_task([fname]) + model = model[0] + model.eval() + + self.model = model + + def forward(self, x): + with torch.no_grad(): + z = self.model.feature_extractor(x) + if isinstance(z, tuple): + z = z[0] + c = self.model.feature_aggregator(z) + return z, c + + +class EmbeddingWriterConfig(argparse.ArgumentParser): + def __init__(self): + super().__init__("Pre-compute embeddings for flashlight datasets") + + kwargs = {"action": "store", "type": str, "required": True} + + self.add_argument("--input", "-i", help="Input Directory", **kwargs) + self.add_argument("--output", "-o", help="Output Directory", **kwargs) + self.add_argument("--model", help="Path to model checkpoint", **kwargs) + self.add_argument("--split", help="Dataset Splits", nargs="+", **kwargs) + self.add_argument( + "--ext", default="wav", required=False, help="Audio file extension" + ) + + self.add_argument( + "--no-copy-labels", + action="store_true", + help="Do not copy label files. Useful for large datasets, use --targetdir in flashlight then.", + ) + self.add_argument( + "--use-feat", + action="store_true", + help="Use the feature vector ('z') instead of context vector ('c') for features", + ) + self.add_argument("--gpu", help="GPU to use", default=0, type=int) + + +class Prediction: + """ Lightweight wrapper around a fairspeech embedding model """ + + def __init__(self, fname, gpu=0): + self.gpu = gpu + self.model = PretrainedWav2VecModel(fname).cuda(gpu) + + def __call__(self, x): + x = torch.from_numpy(x).float().cuda(self.gpu) + with torch.no_grad(): + z, c = self.model(x.unsqueeze(0)) + + return z.squeeze(0).cpu().numpy(), c.squeeze(0).cpu().numpy() + + +class H5Writer: + """ Write features as hdf5 file in flashlight compatible format """ + + def __init__(self, fname): + self.fname = fname + os.makedirs(os.path.dirname(self.fname), exist_ok=True) + + def write(self, data): + channel, T = data.shape + + with h5py.File(self.fname, "w") as out_ds: + data = data.T.flatten() + out_ds["features"] = data + out_ds["info"] = np.array([16e3 // 160, T, channel]) + + +class EmbeddingDatasetWriter(object): + """Given a model and a flashlight dataset, pre-compute and store embeddings + + Args: + input_root, str : + Path to the flashlight dataset + output_root, str : + Desired output directory. Will be created if non-existent + split, str : + Dataset split + """ + + def __init__( + self, + input_root, + output_root, + split, + model_fname, + extension="wav", + gpu=0, + verbose=False, + use_feat=False, + ): + + assert os.path.exists(model_fname) + + self.model_fname = model_fname + self.model = Prediction(self.model_fname, gpu) + + self.input_root = input_root + self.output_root = output_root + self.split = split + self.verbose = verbose + self.extension = extension + self.use_feat = use_feat + + assert os.path.exists(self.input_path), "Input path '{}' does not exist".format( + self.input_path + ) + + def _progress(self, iterable, **kwargs): + if self.verbose: + return tqdm.tqdm(iterable, **kwargs) + return iterable + + def require_output_path(self, fname=None): + path = self.get_output_path(fname) + os.makedirs(path, exist_ok=True) + + @property + def input_path(self): + return self.get_input_path() + + @property + def output_path(self): + return self.get_output_path() + + def get_input_path(self, fname=None): + if fname is None: + return os.path.join(self.input_root, self.split) + return os.path.join(self.get_input_path(), fname) + + def get_output_path(self, fname=None): + if fname is None: + return os.path.join(self.output_root, self.split) + return os.path.join(self.get_output_path(), fname) + + def copy_labels(self): + self.require_output_path() + + labels = list( + filter( + lambda x: self.extension not in x, glob.glob(self.get_input_path("*")) + ) + ) + for fname in tqdm.tqdm(labels): + copy(fname, self.output_path) + + @property + def input_fnames(self): + return sorted(glob.glob(self.get_input_path("*.{}".format(self.extension)))) + + def __len__(self): + return len(self.input_fnames) + + def write_features(self): + + paths = self.input_fnames + + fnames_context = map( + lambda x: os.path.join( + self.output_path, x.replace("." + self.extension, ".h5context") + ), + map(os.path.basename, paths), + ) + + for name, target_fname in self._progress( + zip(paths, fnames_context), total=len(self) + ): + wav, sr = read_audio(name) + z, c = self.model(wav) + feat = z if self.use_feat else c + writer = H5Writer(target_fname) + writer.write(feat) + + def __repr__(self): + + return "EmbeddingDatasetWriter ({n_files} files)\n\tinput:\t{input_root}\n\toutput:\t{output_root}\n\tsplit:\t{split})".format( + n_files=len(self), **self.__dict__ + ) + + +if __name__ == "__main__": + + args = EmbeddingWriterConfig().parse_args() + + for split in args.split: + + writer = EmbeddingDatasetWriter( + input_root=args.input, + output_root=args.output, + split=split, + model_fname=args.model, + gpu=args.gpu, + extension=args.ext, + use_feat=args.use_feat, + ) + + print(writer) + writer.require_output_path() + + print("Writing Features...") + writer.write_features() + print("Done.") + + if not args.no_copy_labels: + print("Copying label data...") + writer.copy_labels() + print("Done.") diff --git a/SpeechT5/fairseq/examples/wav2vec/wav2vec_manifest.py b/SpeechT5/fairseq/examples/wav2vec/wav2vec_manifest.py new file mode 100644 index 0000000..9b8aa18 --- /dev/null +++ b/SpeechT5/fairseq/examples/wav2vec/wav2vec_manifest.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Data pre-processing: build vocabularies and binarize training data. +""" + +import argparse +import glob +import os +import random + +import soundfile + + +def get_parser(): + parser = argparse.ArgumentParser() + parser.add_argument( + "root", metavar="DIR", help="root directory containing flac files to index" + ) + parser.add_argument( + "--valid-percent", + default=0.01, + type=float, + metavar="D", + help="percentage of data to use as validation set (between 0 and 1)", + ) + parser.add_argument( + "--dest", default=".", type=str, metavar="DIR", help="output directory" + ) + parser.add_argument( + "--ext", default="flac", type=str, metavar="EXT", help="extension to look for" + ) + parser.add_argument("--seed", default=42, type=int, metavar="N", help="random seed") + parser.add_argument( + "--path-must-contain", + default=None, + type=str, + metavar="FRAG", + help="if set, path must contain this substring for a file to be included in the manifest", + ) + return parser + + +def main(args): + assert args.valid_percent >= 0 and args.valid_percent <= 1.0 + + if not os.path.exists(args.dest): + os.makedirs(args.dest) + + dir_path = os.path.realpath(args.root) + search_path = os.path.join(dir_path, "**/*." + args.ext) + rand = random.Random(args.seed) + + valid_f = ( + open(os.path.join(args.dest, "valid.tsv"), "w") + if args.valid_percent > 0 + else None + ) + + with open(os.path.join(args.dest, "train.tsv"), "w") as train_f: + print(dir_path, file=train_f) + + if valid_f is not None: + print(dir_path, file=valid_f) + + for fname in glob.iglob(search_path, recursive=True): + file_path = os.path.realpath(fname) + + if args.path_must_contain and args.path_must_contain not in file_path: + continue + + frames = soundfile.info(fname).frames + dest = train_f if rand.random() > args.valid_percent else valid_f + print( + "{}\t{}".format(os.path.relpath(file_path, dir_path), frames), file=dest + ) + if valid_f is not None: + valid_f.close() + + +if __name__ == "__main__": + parser = get_parser() + args = parser.parse_args() + main(args) diff --git a/SpeechT5/fairseq/examples/wmt19/README.md b/SpeechT5/fairseq/examples/wmt19/README.md new file mode 100644 index 0000000..5c90d0e --- /dev/null +++ b/SpeechT5/fairseq/examples/wmt19/README.md @@ -0,0 +1,85 @@ +# WMT 19 + +This page provides pointers to the models of Facebook-FAIR's WMT'19 news translation task submission [(Ng et al., 2019)](https://arxiv.org/abs/1907.06616). + +## Pre-trained models + +Model | Description | Download +---|---|--- +`transformer.wmt19.en-de` | En->De Ensemble | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-de.joined-dict.ensemble.tar.gz) +`transformer.wmt19.de-en` | De->En Ensemble | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.de-en.joined-dict.ensemble.tar.gz) +`transformer.wmt19.en-ru` | En->Ru Ensemble | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-ru.ensemble.tar.gz) +`transformer.wmt19.ru-en` | Ru->En Ensemble | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.ru-en.ensemble.tar.gz) +`transformer_lm.wmt19.en` | En Language Model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.en.tar.gz) +`transformer_lm.wmt19.de` | De Language Model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.de.tar.gz) +`transformer_lm.wmt19.ru` | Ru Language Model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.ru.tar.gz) + +## Pre-trained single models before finetuning + +Model | Description | Download +---|---|--- +`transformer.wmt19.en-de` | En->De Single, no finetuning | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-de.ffn8192.tar.gz) +`transformer.wmt19.de-en` | De->En Single, no finetuning | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.de-en.ffn8192.tar.gz) +`transformer.wmt19.en-ru` | En->Ru Single, no finetuning | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-ru.ffn8192.tar.gz) +`transformer.wmt19.ru-en` | Ru->En Single, no finetuning | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt19.ru-en.ffn8192.tar.gz) + +## Example usage (torch.hub) + +#### Requirements + +We require a few additional Python dependencies for preprocessing: +```bash +pip install fastBPE sacremoses +``` + +#### Translation + +```python +import torch + +# English to German translation +en2de = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.en-de', checkpoint_file='model1.pt:model2.pt:model3.pt:model4.pt', + tokenizer='moses', bpe='fastbpe') +en2de.translate("Machine learning is great!") # 'Maschinelles Lernen ist großartig!' + +# German to English translation +de2en = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.de-en', checkpoint_file='model1.pt:model2.pt:model3.pt:model4.pt', + tokenizer='moses', bpe='fastbpe') +de2en.translate("Maschinelles Lernen ist großartig!") # 'Machine learning is great!' + +# English to Russian translation +en2ru = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.en-ru', checkpoint_file='model1.pt:model2.pt:model3.pt:model4.pt', + tokenizer='moses', bpe='fastbpe') +en2ru.translate("Machine learning is great!") # 'Машинное обучение - это здорово!' + +# Russian to English translation +ru2en = torch.hub.load('pytorch/fairseq', 'transformer.wmt19.ru-en', checkpoint_file='model1.pt:model2.pt:model3.pt:model4.pt', + tokenizer='moses', bpe='fastbpe') +ru2en.translate("Машинное обучение - это здорово!") # 'Machine learning is great!' +``` + +#### Language Modeling + +```python +# Sample from the English LM +en_lm = torch.hub.load('pytorch/fairseq', 'transformer_lm.wmt19.en', tokenizer='moses', bpe='fastbpe') +en_lm.sample("Machine learning is") # 'Machine learning is the future of computing, says Microsoft boss Satya Nadella ...' + +# Sample from the German LM +de_lm = torch.hub.load('pytorch/fairseq', 'transformer_lm.wmt19.de', tokenizer='moses', bpe='fastbpe') +de_lm.sample("Maschinelles lernen ist") # 'Maschinelles lernen ist das A und O (neues-deutschland.de) Die Arbeitsbedingungen für Lehrerinnen und Lehrer sind seit Jahren verbesserungswürdig ...' + +# Sample from the Russian LM +ru_lm = torch.hub.load('pytorch/fairseq', 'transformer_lm.wmt19.ru', tokenizer='moses', bpe='fastbpe') +ru_lm.sample("машинное обучение это") # 'машинное обучение это то, что мы называем "искусственным интеллектом".' +``` + +## Citation +```bibtex +@inproceedings{ng2019facebook}, + title = {Facebook FAIR's WMT19 News Translation Task Submission}, + author = {Ng, Nathan and Yee, Kyra and Baevski, Alexei and Ott, Myle and Auli, Michael and Edunov, Sergey}, + booktitle = {Proc. of WMT}, + year = 2019, +} +``` diff --git a/SpeechT5/fairseq/examples/wmt20/README.md b/SpeechT5/fairseq/examples/wmt20/README.md new file mode 100644 index 0000000..b4f2874 --- /dev/null +++ b/SpeechT5/fairseq/examples/wmt20/README.md @@ -0,0 +1,72 @@ +# WMT 20 + +This page provides pointers to the models of Facebook-FAIR's WMT'20 news translation task submission [(Chen et al., 2020)](https://arxiv.org/abs/2011.08298). + +## Single best MT models (after finetuning on part of WMT20 news dev set) + +Model | Description | Download +---|---|--- +`transformer.wmt20.ta-en` | Ta->En | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.ta-en.single.tar.gz) +`transformer.wmt20.en-ta` | En->Ta | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.en-ta.single.tar.gz) +`transformer.wmt20.iu-en.news` | Iu->En (News domain) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.iu-en.news.single.tar.gz) +`transformer.wmt20.en-iu.news` | En->Iu (News domain) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.en-iu.news.single.tar.gz) +`transformer.wmt20.iu-en.nh` | Iu->En (Nunavut Hansard domain) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.iu-en.nh.single.tar.gz) +`transformer.wmt20.en-iu.nh` | En->Iu (Nunavut Hansard domain) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.en-iu.nh.single.tar.gz) + +## Language models +Model | Description | Download +---|---|--- +`transformer_lm.wmt20.en` | En Language Model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.en.tar.gz) +`transformer_lm.wmt20.ta` | Ta Language Model | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.ta.tar.gz) +`transformer_lm.wmt20.iu.news` | Iu Language Model (News domain) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.iu.news.tar.gz) +`transformer_lm.wmt20.iu.nh` | Iu Language Model (Nunavut Hansard domain) | [download (.tar.gz)](https://dl.fbaipublicfiles.com/fairseq/models/wmt20.iu.nh.tar.gz) + +## Example usage (torch.hub) + +#### Translation + +```python +import torch + +# English to Tamil translation +en2ta = torch.hub.load('pytorch/fairseq', 'transformer.wmt20.en-ta') +en2ta.translate("Machine learning is great!") # 'இயந்திரக் கற்றல் அருமை!' + +# Tamil to English translation +ta2en = torch.hub.load('pytorch/fairseq', 'transformer.wmt20.ta-en') +ta2en.translate("இயந்திரக் கற்றல் அருமை!") # 'Machine learning is great!' + +# English to Inuktitut translation +en2iu = torch.hub.load('pytorch/fairseq', 'transformer.wmt20.en-iu.news') +en2iu.translate("machine learning is great!") # 'ᖃᒧᑕᐅᔭᓄᑦ ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᐅᔪᒻᒪᕆᒃ!' + +# Inuktitut to English translation +iu2en = torch.hub.load('pytorch/fairseq', 'transformer.wmt20.iu-en.news') +iu2en.translate("ᖃᒧᑕᐅᔭᓄᑦ ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᐅᔪᒻᒪᕆᒃ!") # 'Machine learning excellence!' +``` + +#### Language Modeling + +```python +# Sample from the English LM +en_lm = torch.hub.load('pytorch/fairseq', 'transformer_lm.wmt20.en') +en_lm.sample("Machine learning is") # 'Machine learning is a type of artificial intelligence that uses machine learning to learn from data and make predictions.' + +# Sample from the Tamil LM +ta_lm = torch.hub.load('pytorch/fairseq', 'transformer_lm.wmt20.ta') +ta_lm.sample("இயந்திரக் கற்றல் என்பது செயற்கை நுண்ணறிவின்") # 'இயந்திரக் கற்றல் என்பது செயற்கை நுண்ணறிவின் ஒரு பகுதியாகும்.' + +# Sample from the Inuktitut LM +iu_lm = torch.hub.load('pytorch/fairseq', 'transformer_lm.wmt20.iu.news') +iu_lm.sample("ᖃᒧᑕᐅᔭᓄᑦ ᐃᓕᓐᓂᐊᕐᓂᖅ") # 'ᖃᒧᑕᐅᔭᓄᑦ ᐃᓕᓐᓂᐊᕐᓂᖅ, ᐊᒻᒪᓗ ᓯᓚᐅᑉ ᐊᓯᙳᖅᐸᓪᓕᐊᓂᖓᓄᑦ ᖃᓄᐃᓕᐅᕈᑎᒃᓴᑦ, ᐃᓚᖃᖅᖢᑎᒃ ᐅᑯᓂᖓ:' +``` + +## Citation +```bibtex +@inproceedings{chen2020facebook + title={Facebook AI's WMT20 News Translation Task Submission}, + author={Peng-Jen Chen and Ann Lee and Changhan Wang and Naman Goyal and Angela Fan and Mary Williamson and Jiatao Gu}, + booktitle={Proc. of WMT}, + year={2020}, +} +``` diff --git a/SpeechT5/fairseq/examples/xlmr/README.md b/SpeechT5/fairseq/examples/xlmr/README.md new file mode 100644 index 0000000..b95bfe1 --- /dev/null +++ b/SpeechT5/fairseq/examples/xlmr/README.md @@ -0,0 +1,144 @@ +# Unsupervised Cross-lingual Representation Learning at Scale (XLM-RoBERTa) +https://arxiv.org/pdf/1911.02116.pdf + +# Larger-Scale Transformers for Multilingual Masked Language Modeling +https://arxiv.org/pdf/2105.00572.pdf + + +## What's New: +- June 2021: `XLMR-XL` AND `XLMR-XXL` models released. + +## Introduction + +`XLM-R` (`XLM-RoBERTa`) is a generic cross lingual sentence encoder that obtains state-of-the-art results on many cross-lingual understanding (XLU) benchmarks. It is trained on `2.5T` of filtered CommonCrawl data in 100 languages (list below). + + Language | Language|Language |Language | Language +---|---|---|---|--- +Afrikaans | Albanian | Amharic | Arabic | Armenian +Assamese | Azerbaijani | Basque | Belarusian | Bengali +Bengali Romanize | Bosnian | Breton | Bulgarian | Burmese +Burmese zawgyi font | Catalan | Chinese (Simplified) | Chinese (Traditional) | Croatian +Czech | Danish | Dutch | English | Esperanto +Estonian | Filipino | Finnish | French | Galician +Georgian | German | Greek | Gujarati | Hausa +Hebrew | Hindi | Hindi Romanize | Hungarian | Icelandic +Indonesian | Irish | Italian | Japanese | Javanese +Kannada | Kazakh | Khmer | Korean | Kurdish (Kurmanji) +Kyrgyz | Lao | Latin | Latvian | Lithuanian +Macedonian | Malagasy | Malay | Malayalam | Marathi +Mongolian | Nepali | Norwegian | Oriya | Oromo +Pashto | Persian | Polish | Portuguese | Punjabi +Romanian | Russian | Sanskrit | Scottish Gaelic | Serbian +Sindhi | Sinhala | Slovak | Slovenian | Somali +Spanish | Sundanese | Swahili | Swedish | Tamil +Tamil Romanize | Telugu | Telugu Romanize | Thai | Turkish +Ukrainian | Urdu | Urdu Romanize | Uyghur | Uzbek +Vietnamese | Welsh | Western Frisian | Xhosa | Yiddish + +## Pre-trained models + +Model | Description | #params | vocab size | Download +---|---|---|---|--- +`xlmr.base` | XLM-R using the BERT-base architecture | 250M | 250k | [xlm.base.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/xlmr.base.tar.gz) +`xlmr.large` | XLM-R using the BERT-large architecture | 560M | 250k | [xlm.large.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/xlmr.large.tar.gz) +`xlmr.xl` | XLM-R (`layers=36, model_dim=2560`) | 3.5B | 250k | [xlm.xl.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/xlmr/xlmr.xl.tar.gz) +`xlmr.xxl` | XLM-R (`layers=48, model_dim=4096`) | 10.7B | 250k | [xlm.xxl.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/xlmr/xlmr.xxl.tar.gz) + +## Results + +**[XNLI (Conneau et al., 2018)](https://arxiv.org/abs/1809.05053)** + +Model | average | en | fr | es | de | el | bg | ru | tr | ar | vi | th | zh | hi | sw | ur +---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--- +`roberta.large.mnli` _(TRANSLATE-TEST)_ | 77.8 | 91.3 | 82.9 | 84.3 | 81.2 | 81.7 | 83.1 | 78.3 | 76.8 | 76.6 | 74.2 | 74.1 | 77.5 | 70.9 | 66.7 | 66.8 +`xlmr.large` _(TRANSLATE-TRAIN-ALL)_ | 83.6 | 89.1 | 85.1 | 86.6 | 85.7 | 85.3 | 85.9 | 83.5 | 83.2 | 83.1 | 83.7 | 81.5 | 83.7 | 81.6 | 78.0 | 78.1 +`xlmr.xl` _(TRANSLATE-TRAIN-ALL)_ | 85.4 | 91.1 | 87.2 | 88.1 | 87.0 | 87.4 | 87.8 | 85.3 | 85.2 | 85.3 | 86.2 | 83.8 | 85.3 | 83.1 | 79.8 | 78.2 | 85.4 +`xlmr.xxl` _(TRANSLATE-TRAIN-ALL)_ | 86.0 | 91.5 | 87.6 | 88.7 | 87.8 | 87.4 | 88.2 | 85.6 | 85.1 | 85.8 | 86.3 | 83.9 | 85.6 | 84.6 | 81.7 | 80.6 + +**[MLQA (Lewis et al., 2018)](https://arxiv.org/abs/1910.07475)** + +Model | average | en | es | de | ar | hi | vi | zh +---|---|---|---|---|---|---|---|--- +`BERT-large` | - | 80.2/67.4 | - | - | - | - | - | - +`mBERT` | 57.7 / 41.6 | 77.7 / 65.2 | 64.3 / 46.6 | 57.9 / 44.3 | 45.7 / 29.8| 43.8 / 29.7 | 57.1 / 38.6 | 57.5 / 37.3 +`xlmr.large` | 70.7 / 52.7 | 80.6 / 67.8 | 74.1 / 56.0 | 68.5 / 53.6 | 63.1 / 43.5 | 69.2 / 51.6 | 71.3 / 50.9 | 68.0 / 45.4 +`xlmr.xl` | 73.4 / 55.3 | 85.1 / 72.6 | 66.7 / 46.2 | 70.5 / 55.5 | 74.3 / 56.9 | 72.2 / 54.7 | 74.4 / 52.9 | 70.9 / 48.5 +`xlmr.xxl` | 74.8 / 56.6 | 85.5 / 72.4 | 68.6 / 48.4 | 72.7 / 57.8 | 75.4 / 57.6 | 73.7 / 55.8 | 76.0 / 55.0 | 71.7 / 48.9 + + +## Example usage + +##### Load XLM-R from torch.hub (PyTorch >= 1.1): +```python +import torch +xlmr = torch.hub.load('pytorch/fairseq', 'xlmr.large') +xlmr.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Load XLM-R (for PyTorch 1.0 or custom models): +```python +# Download xlmr.large model +wget https://dl.fbaipublicfiles.com/fairseq/models/xlmr.large.tar.gz +tar -xzvf xlmr.large.tar.gz + +# Load the model in fairseq +from fairseq.models.roberta import XLMRModel +xlmr = XLMRModel.from_pretrained('/path/to/xlmr.large', checkpoint_file='model.pt') +xlmr.eval() # disable dropout (or leave in train mode to finetune) +``` + +##### Apply sentence-piece-model (SPM) encoding to input text: +```python +en_tokens = xlmr.encode('Hello world!') +assert en_tokens.tolist() == [0, 35378, 8999, 38, 2] +xlmr.decode(en_tokens) # 'Hello world!' + +zh_tokens = xlmr.encode('你好,世界') +assert zh_tokens.tolist() == [0, 6, 124084, 4, 3221, 2] +xlmr.decode(zh_tokens) # '你好,世界' + +hi_tokens = xlmr.encode('नमस्ते दुनिया') +assert hi_tokens.tolist() == [0, 68700, 97883, 29405, 2] +xlmr.decode(hi_tokens) # 'नमस्ते दुनिया' + +ar_tokens = xlmr.encode('مرحبا بالعالم') +assert ar_tokens.tolist() == [0, 665, 193478, 258, 1705, 77796, 2] +xlmr.decode(ar_tokens) # 'مرحبا بالعالم' + +fr_tokens = xlmr.encode('Bonjour le monde') +assert fr_tokens.tolist() == [0, 84602, 95, 11146, 2] +xlmr.decode(fr_tokens) # 'Bonjour le monde' +``` + +##### Extract features from XLM-R: +```python +# Extract the last layer's features +last_layer_features = xlmr.extract_features(zh_tokens) +assert last_layer_features.size() == torch.Size([1, 6, 1024]) + +# Extract all layer's features (layer 0 is the embedding layer) +all_layers = xlmr.extract_features(zh_tokens, return_all_hiddens=True) +assert len(all_layers) == 25 +assert torch.all(all_layers[-1] == last_layer_features) +``` + +## Citation + +```bibtex +@article{conneau2019unsupervised, + title={Unsupervised Cross-lingual Representation Learning at Scale}, + author={Conneau, Alexis and Khandelwal, Kartikay and Goyal, Naman and Chaudhary, Vishrav and Wenzek, Guillaume and Guzm{\'a}n, Francisco and Grave, Edouard and Ott, Myle and Zettlemoyer, Luke and Stoyanov, Veselin}, + journal={arXiv preprint arXiv:1911.02116}, + year={2019} +} +``` + + +```bibtex +@article{goyal2021larger, + title={Larger-Scale Transformers for Multilingual Masked Language Modeling}, + author={Goyal, Naman and Du, Jingfei and Ott, Myle and Anantharaman, Giri and Conneau, Alexis}, + journal={arXiv preprint arXiv:2105.00572}, + year={2021} +} +``` diff --git a/SpeechT5/fairseq/fairseq/__init__.py b/SpeechT5/fairseq/fairseq/__init__.py new file mode 100644 index 0000000..dc9fd18 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/__init__.py @@ -0,0 +1,44 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import os +import sys + +try: + from .version import __version__ # noqa +except ImportError: + version_txt = os.path.join(os.path.dirname(__file__), "version.txt") + with open(version_txt) as f: + __version__ = f.read().strip() + +__all__ = ["pdb"] + +# backwards compatibility to support `from fairseq.X import Y` +from fairseq.distributed import utils as distributed_utils +from fairseq.logging import meters, metrics, progress_bar # noqa + +sys.modules["fairseq.distributed_utils"] = distributed_utils +sys.modules["fairseq.meters"] = meters +sys.modules["fairseq.metrics"] = metrics +sys.modules["fairseq.progress_bar"] = progress_bar + +# initialize hydra +from fairseq.dataclass.initialize import hydra_init +hydra_init() + +import fairseq.criterions # noqa +import fairseq.distributed # noqa +import fairseq.models # noqa +import fairseq.modules # noqa +import fairseq.optim # noqa +import fairseq.optim.lr_scheduler # noqa +import fairseq.pdb # noqa +import fairseq.scoring # noqa +import fairseq.tasks # noqa +import fairseq.token_generation_constraints # noqa + +import fairseq.benchmark # noqa +import fairseq.model_parallel # noqa diff --git a/SpeechT5/fairseq/fairseq/benchmark/__init__.py b/SpeechT5/fairseq/fairseq/benchmark/__init__.py new file mode 100644 index 0000000..0317d5c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/benchmark/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +# import models/tasks to register them +from . import dummy_dataset, dummy_lm, dummy_masked_lm, dummy_model, dummy_mt # noqa diff --git a/SpeechT5/fairseq/fairseq/benchmark/dummy_dataset.py b/SpeechT5/fairseq/fairseq/benchmark/dummy_dataset.py new file mode 100644 index 0000000..2f05175 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/benchmark/dummy_dataset.py @@ -0,0 +1,36 @@ +import numpy as np +from fairseq.data import FairseqDataset + + +class DummyDataset(FairseqDataset): + def __init__(self, batch, num_items, item_size): + super().__init__() + self.batch = batch + self.num_items = num_items + self.item_size = item_size + + def __getitem__(self, index): + return index + + def __len__(self): + return self.num_items + + def collater(self, samples): + return self.batch + + @property + def sizes(self): + return np.array([self.item_size] * self.num_items) + + def num_tokens(self, index): + return self.item_size + + def size(self, index): + return self.item_size + + def ordered_indices(self): + return np.arange(self.num_items) + + @property + def supports_prefetch(self): + return False diff --git a/SpeechT5/fairseq/fairseq/benchmark/dummy_lm.py b/SpeechT5/fairseq/fairseq/benchmark/dummy_lm.py new file mode 100644 index 0000000..c6246a0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/benchmark/dummy_lm.py @@ -0,0 +1,83 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from dataclasses import dataclass, field +from typing import Optional + +import torch +from .dummy_dataset import DummyDataset +from fairseq.data import Dictionary +from fairseq.dataclass import FairseqDataclass +from fairseq.tasks import FairseqTask, register_task +from omegaconf import II + + +logger = logging.getLogger(__name__) + + +@dataclass +class DummyLMConfig(FairseqDataclass): + dict_size: int = 49996 + dataset_size: int = 100000 + tokens_per_sample: int = field( + default=512, metadata={"help": "max sequence length"} + ) + add_bos_token: bool = False + batch_size: Optional[int] = II("dataset.batch_size") + max_tokens: Optional[int] = II("dataset.max_tokens") + max_target_positions: int = II("task.tokens_per_sample") + + +@register_task("dummy_lm", dataclass=DummyLMConfig) +class DummyLMTask(FairseqTask): + def __init__(self, cfg: DummyLMConfig): + super().__init__(cfg) + + # load dictionary + self.dictionary = Dictionary() + for i in range(cfg.dict_size): + self.dictionary.add_symbol("word{}".format(i)) + self.dictionary.pad_to_multiple_(8) # often faster if divisible by 8 + logger.info("dictionary: {} types".format(len(self.dictionary))) + + seq = torch.arange(cfg.tokens_per_sample + 1) + self.dictionary.pad() + 1 + + self.dummy_src = seq[:-1] + self.dummy_tgt = seq[1:] + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + Args: + split (str): name of the split (e.g., train, valid, test) + """ + if self.cfg.batch_size is not None: + bsz = self.cfg.batch_size + else: + bsz = max(1, self.cfg.max_tokens // self.cfg.tokens_per_sample) + self.datasets[split] = DummyDataset( + { + "id": 1, + "net_input": { + "src_tokens": torch.stack([self.dummy_src for _ in range(bsz)]), + "src_lengths": torch.full( + (bsz,), self.cfg.tokens_per_sample, dtype=torch.long + ), + }, + "target": torch.stack([self.dummy_tgt for _ in range(bsz)]), + "nsentences": bsz, + "ntokens": bsz * self.cfg.tokens_per_sample, + }, + num_items=self.cfg.dataset_size, + item_size=self.cfg.tokens_per_sample, + ) + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary diff --git a/SpeechT5/fairseq/fairseq/benchmark/dummy_masked_lm.py b/SpeechT5/fairseq/fairseq/benchmark/dummy_masked_lm.py new file mode 100644 index 0000000..12b9c5d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/benchmark/dummy_masked_lm.py @@ -0,0 +1,94 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from dataclasses import dataclass, field +from typing import Optional + +import torch +from omegaconf import II + +from .dummy_dataset import DummyDataset +from fairseq.data import Dictionary +from fairseq.dataclass import FairseqDataclass +from fairseq.tasks import FairseqTask, register_task + +logger = logging.getLogger(__name__) + + +@dataclass +class DummyMaskedLMConfig(FairseqDataclass): + dict_size: int = 49996 + dataset_size: int = 100000 + tokens_per_sample: int = field( + default=512, + metadata={ + "help": "max number of total tokens over all" + " segments per sample for BERT dataset" + }, + ) + batch_size: Optional[int] = II("dataset.batch_size") + max_tokens: Optional[int] = II("dataset.max_tokens") + max_target_positions: int = II("task.tokens_per_sample") + + +@register_task("dummy_masked_lm", dataclass=DummyMaskedLMConfig) +class DummyMaskedLMTask(FairseqTask): + def __init__(self, cfg: DummyMaskedLMConfig): + super().__init__(cfg) + + self.dictionary = Dictionary() + for i in range(cfg.dict_size): + self.dictionary.add_symbol("word{}".format(i)) + logger.info("dictionary: {} types".format(len(self.dictionary))) + # add mask token + self.mask_idx = self.dictionary.add_symbol("<mask>") + self.dictionary.pad_to_multiple_(8) # often faster if divisible by 8 + + mask_idx = 0 + pad_idx = 1 + seq = torch.arange(cfg.tokens_per_sample) + pad_idx + 1 + mask = torch.arange(2, cfg.tokens_per_sample, 7) # ~15% + src = seq.clone() + src[mask] = mask_idx + tgt = torch.full_like(seq, pad_idx) + tgt[mask] = seq[mask] + + self.dummy_src = src + self.dummy_tgt = tgt + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + Args: + split (str): name of the split (e.g., train, valid, test) + """ + if self.cfg.batch_size is not None: + bsz = self.cfg.batch_size + else: + bsz = max(1, self.cfg.max_tokens // self.cfg.tokens_per_sample) + self.datasets[split] = DummyDataset( + { + "id": 1, + "net_input": { + "src_tokens": torch.stack([self.dummy_src for _ in range(bsz)]), + "src_lengths": torch.full( + (bsz,), self.cfg.tokens_per_sample, dtype=torch.long + ), + }, + "target": torch.stack([self.dummy_tgt for _ in range(bsz)]), + "nsentences": bsz, + "ntokens": bsz * self.cfg.tokens_per_sample, + }, + num_items=self.cfg.dataset_size, + item_size=self.cfg.tokens_per_sample, + ) + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary diff --git a/SpeechT5/fairseq/fairseq/benchmark/dummy_model.py b/SpeechT5/fairseq/fairseq/benchmark/dummy_model.py new file mode 100644 index 0000000..ff26e4f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/benchmark/dummy_model.py @@ -0,0 +1,96 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.nn as nn +import torch.nn.functional as F +from fairseq.data import Dictionary +from fairseq.models import ( + FairseqDecoder, + FairseqLanguageModel, + register_model, + register_model_architecture, +) + + +@register_model("dummy_model") +class DummyModel(FairseqLanguageModel): + def __init__(self, args, encoder): + super().__init__(encoder) + self.args = args + + @staticmethod + def add_args(parser): + parser.add_argument("--num-layers", type=int, default=24) + parser.add_argument("--embed-dim", type=int, default=1024) + + @classmethod + def build_model(cls, args, task): + encoder = DummyEncoder( + num_embed=len(task.target_dictionary), + embed_dim=args.embed_dim, + num_layers=args.num_layers, + ) + return cls(args, encoder) + + def forward(self, src_tokens, masked_tokens=None, **kwargs): + return self.decoder(src_tokens, masked_tokens=masked_tokens) + + +class DummyEncoder(FairseqDecoder): + def __init__(self, num_embed=50000, embed_dim=1024, num_layers=24): + super().__init__(Dictionary()) + self.embed = nn.Embedding( + num_embeddings=num_embed, embedding_dim=embed_dim, padding_idx=0 + ) + self.layers_a = nn.ModuleList( + [ + nn.Sequential( + nn.LayerNorm(embed_dim), + nn.Linear(embed_dim, 3 * embed_dim), # q, k, v input projection + nn.Linear(3 * embed_dim, embed_dim), # skip self-attention + nn.Linear(embed_dim, embed_dim), # output projection + nn.Dropout(), + ) + for i in range(num_layers) + ] + ) + self.layers_b = nn.ModuleList( + [ + nn.Sequential( + nn.LayerNorm(embed_dim), + nn.Linear(embed_dim, 4 * embed_dim), # FFN + nn.ReLU(), + nn.Linear(4 * embed_dim, embed_dim), # FFN + nn.Dropout(0.1), + ) + for i in range(num_layers) + ] + ) + self.out_proj = nn.Linear(embed_dim, num_embed) + + def forward(self, tokens, masked_tokens=None): + x = self.embed(tokens) + for layer_a, layer_b in zip(self.layers_a, self.layers_b): + x = x + layer_a(x) + x = x + layer_b(x) + x = self.out_proj(x) + if masked_tokens is not None: + x = x[masked_tokens] + return (x,) + + def max_positions(self): + return 1024 + + def get_normalized_probs(self, net_output, log_probs, sample=None): + logits = net_output[0].float() + if log_probs: + return F.log_softmax(logits, dim=-1) + else: + return F.softmax(logits, dim=-1) + + +@register_model_architecture("dummy_model", "dummy_model") +def base_architecture(args): + pass diff --git a/SpeechT5/fairseq/fairseq/benchmark/dummy_mt.py b/SpeechT5/fairseq/fairseq/benchmark/dummy_mt.py new file mode 100644 index 0000000..4ca7be9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/benchmark/dummy_mt.py @@ -0,0 +1,119 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import numpy as np +import torch +from fairseq.data import Dictionary, FairseqDataset +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("dummy_mt") +class DummyMTTask(LegacyFairseqTask): + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument("--dict-size", default=49996, type=int) + parser.add_argument("--dataset-size", default=100000, type=int) + parser.add_argument("--src-len", default=30, type=int) + parser.add_argument("--tgt-len", default=30, type=int) + + def __init__(self, args, dictionary): + super().__init__(args) + self.dictionary = dictionary + self.seed = args.seed + + dictionary.pad_to_multiple_(8) # often faster if divisible by 8 + + self.dummy_src = torch.arange(args.src_len + 1) + dictionary.pad() + 1 + self.dummy_tgt = torch.arange(args.tgt_len + 1) + dictionary.pad() + 1 + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task. """ + dictionary = Dictionary() + for i in range(args.dict_size): + dictionary.add_symbol("word{}".format(i)) + logger.info("dictionary: {} types".format(len(dictionary))) + + args.max_source_positions = args.src_len + dictionary.pad() + 2 + args.max_target_positions = args.tgt_len + dictionary.pad() + 2 + + return cls(args, dictionary) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + Args: + split (str): name of the split (e.g., train, valid, test) + """ + item_size = max(self.args.src_len, self.args.tgt_len) + if self.args.batch_size is not None: + bsz = self.args.batch_size + else: + bsz = max(1, self.args.max_tokens // item_size) + tgt = torch.stack([self.dummy_tgt for _ in range(bsz)]) + self.datasets[split] = DummyDataset( + { + "id": 1, + "net_input": { + "src_tokens": torch.stack([self.dummy_src for _ in range(bsz)]), + "src_lengths": torch.full( + (bsz,), self.args.src_len, dtype=torch.long + ), + "prev_output_tokens": tgt.clone(), + }, + "target": tgt, + "nsentences": bsz, + "ntokens": bsz * self.args.tgt_len, + }, + num_items=self.args.dataset_size, + item_size=item_size, + ) + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary + + +class DummyDataset(FairseqDataset): + def __init__(self, batch, num_items, item_size): + super().__init__() + self.batch = batch + self.num_items = num_items + self.item_size = item_size + + def __getitem__(self, index): + return index + + def __len__(self): + return self.num_items + + def collater(self, samples): + return self.batch + + @property + def sizes(self): + return np.array([self.item_size] * self.num_items) + + def num_tokens(self, index): + return self.item_size + + def size(self, index): + return self.item_size + + def ordered_indices(self): + return np.arange(self.num_items) + + @property + def supports_prefetch(self): + return False diff --git a/SpeechT5/fairseq/fairseq/binarizer.py b/SpeechT5/fairseq/fairseq/binarizer.py new file mode 100644 index 0000000..18ae67b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/binarizer.py @@ -0,0 +1,114 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +from collections import Counter + +import torch +from fairseq.file_io import PathManager +from fairseq.tokenizer import tokenize_line +from typing import List, Dict + + +def safe_readline(f): + pos = f.tell() + while True: + try: + return f.readline() + except UnicodeDecodeError: + pos -= 1 + f.seek(pos) # search where this character begins + + +class Binarizer: + @staticmethod + def binarize( + filename, + dict, + consumer, + tokenize=tokenize_line, + append_eos=True, + reverse_order=False, + offset=0, + end=-1, + already_numberized=False, + ) -> Dict[str, int]: + nseq, ntok = 0, 0 + replaced = Counter() + + def replaced_consumer(word, idx): + if idx == dict.unk_index and word != dict.unk_word: + replaced.update([word]) + + with open(PathManager.get_local_path(filename), "r", encoding="utf-8") as f: + f.seek(offset) + # next(f) breaks f.tell(), hence readline() must be used + line = safe_readline(f) + while line: + # f.tell() does not always give the byte position in the file + # sometimes it skips to a very large number + # it is unlikely that through a normal read we go from + # end bytes to end + 2**32 bytes (4 GB) and this makes it unlikely + # that the procedure breaks by the undeterministic behavior of + # f.tell() + if end > 0 and f.tell() > end and f.tell() < end + 2 ** 32: + break + if already_numberized: + id_strings = line.strip().split() + id_list = [int(id_string) for id_string in id_strings] + if reverse_order: + id_list.reverse() + if append_eos: + id_list.append(dict.eos()) + ids = torch.IntTensor(id_list) + else: + ids = dict.encode_line( + line=line, + line_tokenizer=tokenize, + add_if_not_exist=False, + consumer=replaced_consumer, + append_eos=append_eos, + reverse_order=reverse_order, + ) + nseq += 1 + ntok += len(ids) + consumer(ids) + line = f.readline() + return { + "nseq": nseq, + "nunk": sum(replaced.values()), + "ntok": ntok, + "replaced": replaced, + } + + @staticmethod + def binarize_alignments( + filename, alignment_parser, consumer, offset=0, end=-1 + ) -> Dict[str, int]: + nseq = 0 + + with open(PathManager.get_local_path(filename), "r") as f: + f.seek(offset) + line = safe_readline(f) + while line: + if end > 0 and f.tell() > end: + break + ids = alignment_parser(line) + nseq += 1 + consumer(ids) + line = f.readline() + return {"nseq": nseq} + + @staticmethod + def find_offsets(filename, num_chunks) -> List[int]: + with open(PathManager.get_local_path(filename), "r", encoding="utf-8") as f: + size = os.fstat(f.fileno()).st_size + chunk_size = size // num_chunks + offsets = [0 for _ in range(num_chunks + 1)] + for i in range(1, num_chunks): + f.seek(chunk_size * i) + safe_readline(f) + offsets[i] = f.tell() + return offsets diff --git a/SpeechT5/fairseq/fairseq/checkpoint_utils.py b/SpeechT5/fairseq/fairseq/checkpoint_utils.py new file mode 100644 index 0000000..627f141 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/checkpoint_utils.py @@ -0,0 +1,798 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import ast +import collections +import contextlib +import logging +import os +import re +import time +import traceback +from collections import OrderedDict +from typing import Any, Dict, Optional, Union +from random import randint + +import torch +from fairseq.dataclass.configs import CheckpointConfig +from fairseq.dataclass.utils import ( + convert_namespace_to_omegaconf, + overwrite_args_by_name, +) +from fairseq.distributed.fully_sharded_data_parallel import FSDP, has_FSDP +from fairseq.file_io import PathManager +from fairseq.models import FairseqDecoder, FairseqEncoder +from omegaconf import DictConfig, open_dict, OmegaConf + + +logger = logging.getLogger(__name__) + + +def save_checkpoint(cfg: CheckpointConfig, trainer, epoch_itr, val_loss): + from fairseq import meters + + # only one worker should attempt to create the required dir + if trainer.data_parallel_rank == 0: + os.makedirs(cfg.save_dir, exist_ok=True) + + prev_best = getattr(save_checkpoint, "best", val_loss) + if val_loss is not None: + best_function = max if cfg.maximize_best_checkpoint_metric else min + save_checkpoint.best = best_function(val_loss, prev_best) + + if cfg.no_save: + return + + trainer.consolidate_optimizer() # TODO(SS): do we need this if no_save_optimizer_state + + if not trainer.should_save_checkpoint_on_current_rank: + if trainer.always_call_state_dict_during_save_checkpoint: + trainer.state_dict() + return + + write_timer = meters.StopwatchMeter() + write_timer.start() + + epoch = epoch_itr.epoch + end_of_epoch = epoch_itr.end_of_epoch() + updates = trainer.get_num_updates() + + logger.info(f"Preparing to save checkpoint for epoch {epoch} @ {updates} updates") + + def is_better(a, b): + return a >= b if cfg.maximize_best_checkpoint_metric else a <= b + + suffix = trainer.checkpoint_suffix + checkpoint_conds = collections.OrderedDict() + checkpoint_conds["checkpoint{}{}.pt".format(epoch, suffix)] = ( + end_of_epoch and not cfg.no_epoch_checkpoints and epoch % cfg.save_interval == 0 + ) + checkpoint_conds["checkpoint_{}_{}{}.pt".format(epoch, updates, suffix)] = ( + not end_of_epoch + and cfg.save_interval_updates > 0 + and updates % cfg.save_interval_updates == 0 + ) + checkpoint_conds["checkpoint_best{}.pt".format(suffix)] = val_loss is not None and ( + not hasattr(save_checkpoint, "best") + or is_better(val_loss, save_checkpoint.best) + ) + if val_loss is not None and cfg.keep_best_checkpoints > 0: + worst_best = getattr(save_checkpoint, "best", None) + chkpts = checkpoint_paths( + cfg.save_dir, + pattern=r"checkpoint\.best_{}_(\d+\.?\d*)\.pt".format( + cfg.best_checkpoint_metric + ), + ) + if len(chkpts) > 0: + p = chkpts[-1] if cfg.maximize_best_checkpoint_metric else chkpts[0] + worst_best = float(p.rsplit("_")[-1].replace(".pt", "")) + # add random digits to resolve ties + rand_sfx = randint(0, cfg.keep_best_checkpoints) + checkpoint_conds[ + "checkpoint.best_{}_{:.3f}{}.pt".format(cfg.best_checkpoint_metric, + val_loss, rand_sfx) + ] = worst_best is None or is_better(val_loss, worst_best) + checkpoint_conds[ + "checkpoint_last{}.pt".format(suffix) + ] = not cfg.no_last_checkpoints + + extra_state = {"train_iterator": epoch_itr.state_dict(), "val_loss": val_loss} + if hasattr(save_checkpoint, "best"): + extra_state.update({"best": save_checkpoint.best}) + + checkpoints = [ + os.path.join(cfg.save_dir, fn) for fn, cond in checkpoint_conds.items() if cond + ] + if len(checkpoints) > 0: + trainer.save_checkpoint(checkpoints[0], extra_state) + for cp in checkpoints[1:]: + if cfg.write_checkpoints_asynchronously: + # TODO[ioPath]: Need to implement a delayed asynchronous + # file copying/moving feature. + logger.warning( + f"ioPath is not copying {checkpoints[0]} to {cp} " + "since async write mode is on." + ) + else: + assert PathManager.copy( + checkpoints[0], cp, overwrite=True + ), f"Failed to copy {checkpoints[0]} to {cp}" + + write_timer.stop() + logger.info( + "Saved checkpoint {} (epoch {} @ {} updates, score {}) (writing took {} seconds)".format( + checkpoints[0], epoch, updates, val_loss, write_timer.sum + ) + ) + + if not end_of_epoch and cfg.keep_interval_updates > 0: + # remove old checkpoints; checkpoints are sorted in descending order + if cfg.keep_interval_updates_pattern == -1: + checkpoints = checkpoint_paths( + cfg.save_dir, pattern=r"checkpoint_\d+_(\d+){}\.pt".format(suffix) + ) + else: + checkpoints = checkpoint_paths( + cfg.save_dir, + pattern=r"checkpoint_\d+_(\d+){}\.pt".format(suffix), + keep_match=True, + ) + checkpoints = [ + x[0] + for x in checkpoints + if x[1] % cfg.keep_interval_updates_pattern != 0 + ] + + for old_chk in checkpoints[cfg.keep_interval_updates :]: + if os.path.lexists(old_chk): + os.remove(old_chk) + elif PathManager.exists(old_chk): + PathManager.rm(old_chk) + + if cfg.keep_last_epochs > 0: + # remove old epoch checkpoints; checkpoints are sorted in descending order + checkpoints = checkpoint_paths( + cfg.save_dir, pattern=r"checkpoint(\d+){}\.pt".format(suffix) + ) + for old_chk in checkpoints[cfg.keep_last_epochs :]: + if os.path.lexists(old_chk): + os.remove(old_chk) + + if cfg.keep_best_checkpoints > 0: + # only keep the best N checkpoints according to validation metric + checkpoints = checkpoint_paths( + cfg.save_dir, + pattern=r"checkpoint\.best_{}_(\d+\.?\d*){}\.pt".format( + cfg.best_checkpoint_metric, suffix + ), + ) + if not cfg.maximize_best_checkpoint_metric: + checkpoints = checkpoints[::-1] + for old_chk in checkpoints[cfg.keep_best_checkpoints :]: + if os.path.lexists(old_chk): + os.remove(old_chk) + + +def load_checkpoint(cfg: CheckpointConfig, trainer, **passthrough_args): + """ + Load a checkpoint and restore the training iterator. + + *passthrough_args* will be passed through to + ``trainer.get_train_iterator``. + """ + + reset_optimizer = cfg.reset_optimizer + reset_lr_scheduler = cfg.reset_lr_scheduler + optimizer_overrides = ast.literal_eval(cfg.optimizer_overrides) + reset_meters = cfg.reset_meters + reset_dataloader = cfg.reset_dataloader + + if cfg.finetune_from_model is not None and ( + reset_optimizer or reset_lr_scheduler or reset_meters or reset_dataloader + ): + raise ValueError( + "--finetune-from-model can not be set together with either --reset-optimizer" + " or reset_lr_scheduler or reset_meters or reset_dataloader" + ) + + suffix = trainer.checkpoint_suffix + if ( + cfg.restore_file == "checkpoint_last.pt" + ): # default value of restore_file is 'checkpoint_last.pt' + checkpoint_path = os.path.join( + cfg.save_dir, "checkpoint_last{}.pt".format(suffix) + ) + first_launch = not PathManager.exists(checkpoint_path) + if cfg.finetune_from_model is not None and first_launch: + # if there is no last checkpoint to restore, start the finetune from pretrained model + # else just use usual logic to load checkpoint, e.g. restart from last checkpoint and etc. + if PathManager.exists(cfg.finetune_from_model): + checkpoint_path = cfg.finetune_from_model + reset_optimizer = True + reset_lr_scheduler = True + reset_meters = True + reset_dataloader = True + logger.info( + f"loading pretrained model from {checkpoint_path}: " + "optimizer, lr scheduler, meters, dataloader will be reset" + ) + else: + raise ValueError( + f"--funetune-from-model {cfg.finetune_from_model} does not exist" + ) + elif suffix is not None: + checkpoint_path = cfg.restore_file.replace(".pt", suffix + ".pt") + else: + checkpoint_path = cfg.restore_file + + if cfg.restore_file != "checkpoint_last.pt" and cfg.finetune_from_model: + raise ValueError( + "--finetune-from-model and --restore-file (non-default value) " + "can not be specified together: " + str(cfg) + ) + + extra_state = trainer.load_checkpoint( + checkpoint_path, + reset_optimizer, + reset_lr_scheduler, + optimizer_overrides, + reset_meters=reset_meters, + ) + + if ( + extra_state is not None + and "best" in extra_state + and not reset_optimizer + and not reset_meters + ): + save_checkpoint.best = extra_state["best"] + + if extra_state is not None and not reset_dataloader: + # restore iterator from checkpoint + itr_state = extra_state["train_iterator"] + epoch_itr = trainer.get_train_iterator( + epoch=itr_state["epoch"], load_dataset=True, **passthrough_args + ) + epoch_itr.load_state_dict(itr_state) + else: + epoch_itr = trainer.get_train_iterator( + epoch=1, load_dataset=True, **passthrough_args + ) + + trainer.lr_step(epoch_itr.epoch) + + return extra_state, epoch_itr + + +def load_checkpoint_to_cpu(path, arg_overrides=None, load_on_all_ranks=False): + """Loads a checkpoint to CPU (with upgrading for backward compatibility). + + If doing single-GPU training or if the checkpoint is only being loaded by at + most one process on each node (current default behavior is for only rank 0 + to read the checkpoint from disk), load_on_all_ranks should be False to + avoid errors from torch.distributed not having been initialized or + torch.distributed.barrier() hanging. + + If all processes on each node may be loading the checkpoint + simultaneously, load_on_all_ranks should be set to True to avoid I/O + conflicts. + + There's currently no support for > 1 but < all processes loading the + checkpoint on each node. + """ + local_path = PathManager.get_local_path(path) + # The locally cached file returned by get_local_path() may be stale for + # remote files that are periodically updated/overwritten (ex: + # checkpoint_last.pt) - so we remove the local copy, sync across processes + # (if needed), and then download a fresh copy. + if local_path != path and PathManager.path_requires_pathmanager(path): + try: + os.remove(local_path) + except FileNotFoundError: + # With potentially multiple processes removing the same file, the + # file being missing is benign (missing_ok isn't available until + # Python 3.8). + pass + if load_on_all_ranks: + torch.distributed.barrier() + local_path = PathManager.get_local_path(path) + + with open(local_path, "rb") as f: + state = torch.load(f, map_location=torch.device("cpu")) + + if "args" in state and state["args"] is not None and arg_overrides is not None: + args = state["args"] + for arg_name, arg_val in arg_overrides.items(): + setattr(args, arg_name, arg_val) + + if "cfg" in state and state["cfg"] is not None: + + # hack to be able to set Namespace in dict config. this should be removed when we update to newer + # omegaconf version that supports object flags, or when we migrate all existing models + from omegaconf import _utils + + old_primitive = _utils.is_primitive_type + _utils.is_primitive_type = lambda _: True + + state["cfg"] = OmegaConf.create(state["cfg"]) + + _utils.is_primitive_type = old_primitive + OmegaConf.set_struct(state["cfg"], True) + + if arg_overrides is not None: + overwrite_args_by_name(state["cfg"], arg_overrides) + + state = _upgrade_state_dict(state) + return state + + +def load_model_ensemble( + filenames, + arg_overrides: Optional[Dict[str, Any]] = None, + task=None, + strict=True, + suffix="", + num_shards=1, + state=None, +): + """Loads an ensemble of models. + + Args: + filenames (List[str]): checkpoint files to load + arg_overrides (Dict[str,Any], optional): override model args that + were used during model training + task (fairseq.tasks.FairseqTask, optional): task to use for loading + """ + assert not ( + strict and num_shards > 1 + ), "Cannot load state dict with strict=True and checkpoint shards > 1" + ensemble, args, _task = load_model_ensemble_and_task( + filenames, + arg_overrides, + task, + strict, + suffix, + num_shards, + state, + ) + return ensemble, args + + +def get_maybe_sharded_checkpoint_filename( + filename: str, suffix: str, shard_idx: int, num_shards: int +) -> str: + orig_filename = filename + filename = filename.replace(".pt", suffix + ".pt") + fsdp_filename = filename[:-3] + f"-shard{shard_idx}.pt" + model_parallel_filename = orig_filename[:-3] + f"_part{shard_idx}.pt" + if PathManager.exists(fsdp_filename): + return fsdp_filename + elif num_shards > 1: + return model_parallel_filename + else: + return filename + + +def load_model_ensemble_and_task( + filenames, + arg_overrides: Optional[Dict[str, Any]] = None, + task=None, + strict=True, + suffix="", + num_shards=1, + state=None, +): + assert state is None or len(filenames) == 1 + + from fairseq import tasks + + assert not ( + strict and num_shards > 1 + ), "Cannot load state dict with strict=True and checkpoint shards > 1" + ensemble = [] + cfg = None + for filename in filenames: + orig_filename = filename + model_shard_state = {"shard_weights": [], "shard_metadata": []} + assert num_shards > 0 + st = time.time() + for shard_idx in range(num_shards): + filename = get_maybe_sharded_checkpoint_filename( + orig_filename, suffix, shard_idx, num_shards + ) + + if not PathManager.exists(filename): + raise IOError("Model file not found: {}".format(filename)) + if state is None: + state = load_checkpoint_to_cpu(filename, arg_overrides) + if "args" in state and state["args"] is not None: + cfg = convert_namespace_to_omegaconf(state["args"]) + elif "cfg" in state and state["cfg"] is not None: + cfg = state["cfg"] + else: + raise RuntimeError( + f"Neither args nor cfg exist in state keys = {state.keys()}" + ) + + if task is None: + task = tasks.setup_task(cfg.task) + + if "task_state" in state: + task.load_state_dict(state["task_state"]) + + if "fsdp_metadata" in state and num_shards > 1: + model_shard_state["shard_weights"].append(state["model"]) + model_shard_state["shard_metadata"].append(state["fsdp_metadata"]) + # check FSDP import before the code goes too far + if not has_FSDP: + raise ImportError( + "Cannot find FullyShardedDataParallel. " + "Please install fairscale with: pip install fairscale" + ) + if shard_idx == num_shards - 1: + consolidated_model_state = FSDP.consolidate_shard_weights( + shard_weights=model_shard_state["shard_weights"], + shard_metadata=model_shard_state["shard_metadata"], + ) + model = task.build_model(cfg.model) + model.load_state_dict( + consolidated_model_state, strict=strict, model_cfg=cfg.model + ) + else: + # model parallel checkpoint or unsharded checkpoint + model = task.build_model(cfg.model) + model.load_state_dict( + state["model"], strict=strict, model_cfg=cfg.model + ) + + # reset state so it gets loaded for the next model in ensemble + state = None + if shard_idx % 10 == 0 and shard_idx > 0: + elapsed = time.time() - st + logger.info(f"Loaded {shard_idx} shards in {elapsed:.2f}s, {elapsed / (shard_idx+1):.2f}s/shard") + + # build model for ensemble + ensemble.append(model) + return ensemble, cfg, task + + +def checkpoint_paths(path, pattern=r"checkpoint(\d+)\.pt", keep_match=False): + """Retrieves all checkpoints found in `path` directory. + + Checkpoints are identified by matching filename to the specified pattern. If + the pattern contains groups, the result will be sorted by the first group in + descending order. + """ + pt_regexp = re.compile(pattern) + files = PathManager.ls(path) + + entries = [] + for i, f in enumerate(files): + m = pt_regexp.fullmatch(f) + if m is not None: + idx = float(m.group(1)) if len(m.groups()) > 0 else i + entries.append((idx, m.group(0))) + if keep_match: + return [(os.path.join(path, x[1]), x[0]) for x in sorted(entries, reverse=True)] + else: + return [os.path.join(path, x[1]) for x in sorted(entries, reverse=True)] + + +def torch_persistent_save(obj, filename, async_write: bool = False): + if async_write: + with PathManager.opena(filename, "wb") as f: + _torch_persistent_save(obj, f) + else: + if PathManager.supports_rename(filename): + # do atomic save + with PathManager.open(filename + ".tmp", "wb") as f: + _torch_persistent_save(obj, f) + PathManager.rename(filename + ".tmp", filename) + else: + # fallback to non-atomic save + with PathManager.open(filename, "wb") as f: + _torch_persistent_save(obj, f) + + +def _torch_persistent_save(obj, f): + if isinstance(f, str): + with PathManager.open(f, "wb") as h: + torch_persistent_save(obj, h) + return + for i in range(3): + try: + return torch.save(obj, f) + except Exception: + if i == 2: + logger.error(traceback.format_exc()) + + +def _upgrade_state_dict(state): + """Helper for upgrading old model checkpoints.""" + + # add optimizer_history + if "optimizer_history" not in state: + state["optimizer_history"] = [ + {"criterion_name": "CrossEntropyCriterion", "best_loss": state["best_loss"]} + ] + state["last_optimizer_state"] = state["optimizer"] + del state["optimizer"] + del state["best_loss"] + # move extra_state into sub-dictionary + if "epoch" in state and "extra_state" not in state: + state["extra_state"] = { + "epoch": state["epoch"], + "batch_offset": state["batch_offset"], + "val_loss": state["val_loss"], + } + del state["epoch"] + del state["batch_offset"] + del state["val_loss"] + # reduce optimizer history's memory usage (only keep the last state) + if "optimizer" in state["optimizer_history"][-1]: + state["last_optimizer_state"] = state["optimizer_history"][-1]["optimizer"] + for optim_hist in state["optimizer_history"]: + del optim_hist["optimizer"] + # record the optimizer class name + if "optimizer_name" not in state["optimizer_history"][-1]: + state["optimizer_history"][-1]["optimizer_name"] = "FairseqNAG" + # move best_loss into lr_scheduler_state + if "lr_scheduler_state" not in state["optimizer_history"][-1]: + state["optimizer_history"][-1]["lr_scheduler_state"] = { + "best": state["optimizer_history"][-1]["best_loss"] + } + del state["optimizer_history"][-1]["best_loss"] + # keep track of number of updates + if "num_updates" not in state["optimizer_history"][-1]: + state["optimizer_history"][-1]["num_updates"] = 0 + # old model checkpoints may not have separate source/target positions + if ( + "args" in state + and hasattr(state["args"], "max_positions") + and not hasattr(state["args"], "max_source_positions") + ): + state["args"].max_source_positions = state["args"].max_positions + state["args"].max_target_positions = state["args"].max_positions + # use stateful training data iterator + if "train_iterator" not in state["extra_state"]: + state["extra_state"]["train_iterator"] = { + "epoch": state["extra_state"]["epoch"], + "iterations_in_epoch": state["extra_state"].get("batch_offset", 0), + } + + # backward compatibility, cfg updates + if "args" in state and state["args"] is not None: + # default to translation task + if not hasattr(state["args"], "task"): + state["args"].task = "translation" + # --raw-text and --lazy-load are deprecated + if getattr(state["args"], "raw_text", False): + state["args"].dataset_impl = "raw" + elif getattr(state["args"], "lazy_load", False): + state["args"].dataset_impl = "lazy" + # epochs start at 1 + if state["extra_state"]["train_iterator"] is not None: + state["extra_state"]["train_iterator"]["epoch"] = max( + state["extra_state"]["train_iterator"].get("epoch", 1), 1 + ) + # --remove-bpe ==> --postprocess + if hasattr(state["args"], "remove_bpe"): + state["args"].post_process = state["args"].remove_bpe + # --min-lr ==> --stop-min-lr + if hasattr(state["args"], "min_lr"): + state["args"].stop_min_lr = state["args"].min_lr + del state["args"].min_lr + # binary_cross_entropy / kd_binary_cross_entropy => wav2vec criterion + if ( + hasattr(state["args"], "criterion") + and state["args"].criterion in [ + "binary_cross_entropy", + "kd_binary_cross_entropy", + ] + ): + state["args"].criterion = "wav2vec" + # remove log_keys if it's None (criteria will supply a default value of []) + if hasattr(state["args"], "log_keys") and state["args"].log_keys is None: + delattr(state["args"], "log_keys") + # speech_pretraining => audio pretraining + if ( + hasattr(state["args"], "task") + and state["args"].task == "speech_pretraining" + ): + state["args"].task = "audio_pretraining" + # audio_cpc => wav2vec + if hasattr(state["args"], "arch") and state["args"].arch == "audio_cpc": + state["args"].arch = "wav2vec" + # convert legacy float learning rate to List[float] + if hasattr(state["args"], "lr") and isinstance(state["args"].lr, float): + state["args"].lr = [state["args"].lr] + # convert task data arg to a string instead of List[string] + if ( + hasattr(state["args"], "data") + and isinstance(state["args"].data, list) + and len(state["args"].data) > 0 + ): + state["args"].data = state["args"].data[0] + # remove keys in state["args"] related to teacher-student learning + for key in [ + "static_teachers", + "static_teacher_weights", + "dynamic_teachers", + "dynamic_teacher_weights", + ]: + if key in state["args"]: + delattr(state["args"], key) + + state["cfg"] = convert_namespace_to_omegaconf(state["args"]) + + if "cfg" in state and state["cfg"] is not None: + cfg = state["cfg"] + with open_dict(cfg): + # any upgrades for Hydra-based configs + if ( + "task" in cfg + and "eval_wer_config" in cfg.task + and isinstance(cfg.task.eval_wer_config.print_alignment, bool) + ): + cfg.task.eval_wer_config.print_alignment = "hard" + if "generation" in cfg and isinstance(cfg.generation.print_alignment, bool): + cfg.generation.print_alignment = "hard" + if ( + "model" in cfg + and "w2v_args" in cfg.model + and cfg.model.w2v_args is not None + and ( + hasattr(cfg.model.w2v_args, "task") or "task" in cfg.model.w2v_args + ) + and hasattr(cfg.model.w2v_args.task, "eval_wer_config") + and cfg.model.w2v_args.task.eval_wer_config is not None + and isinstance( + cfg.model.w2v_args.task.eval_wer_config.print_alignment, bool + ) + ): + cfg.model.w2v_args.task.eval_wer_config.print_alignment = "hard" + + return state + + +def prune_state_dict(state_dict, model_cfg: Optional[DictConfig]): + """Prune the given state_dict if desired for LayerDrop + (https://arxiv.org/abs/1909.11556). + + Training with LayerDrop allows models to be robust to pruning at inference + time. This function prunes state_dict to allow smaller models to be loaded + from a larger model and re-maps the existing state_dict for this to occur. + + It's called by functions that load models from checkpoints and does not + need to be called directly. + """ + arch = None + if model_cfg is not None: + arch = ( + model_cfg._name + if isinstance(model_cfg, DictConfig) + else getattr(model_cfg, "arch", None) + ) + + if not model_cfg or arch is None or arch == "ptt_transformer": + # args should not be none, but don't crash if it is. + return state_dict + + encoder_layers_to_keep = getattr(model_cfg, "encoder_layers_to_keep", None) + decoder_layers_to_keep = getattr(model_cfg, "decoder_layers_to_keep", None) + + if not encoder_layers_to_keep and not decoder_layers_to_keep: + return state_dict + + # apply pruning + logger.info( + "Pruning model to specified layer configuration - this works best if the model was trained with LayerDrop" + ) + + def create_pruning_pass(layers_to_keep, layer_name): + keep_layers = sorted( + int(layer_string) for layer_string in layers_to_keep.split(",") + ) + mapping_dict = {} + for i in range(len(keep_layers)): + mapping_dict[str(keep_layers[i])] = str(i) + + regex = re.compile(r"^{layer}.*\.layers\.(\d+)".format(layer=layer_name)) + return {"substitution_regex": regex, "mapping_dict": mapping_dict} + + pruning_passes = [] + if encoder_layers_to_keep: + pruning_passes.append(create_pruning_pass(encoder_layers_to_keep, "encoder")) + if decoder_layers_to_keep: + pruning_passes.append(create_pruning_pass(decoder_layers_to_keep, "decoder")) + + new_state_dict = {} + for layer_name in state_dict.keys(): + match = re.search(r"\.layers\.(\d+)\.", layer_name) + # if layer has no number in it, it is a supporting layer, such as an + # embedding + if not match: + new_state_dict[layer_name] = state_dict[layer_name] + continue + + # otherwise, layer should be pruned. + original_layer_number = match.group(1) + # figure out which mapping dict to replace from + for pruning_pass in pruning_passes: + if original_layer_number in pruning_pass["mapping_dict"] and pruning_pass[ + "substitution_regex" + ].search(layer_name): + new_layer_number = pruning_pass["mapping_dict"][original_layer_number] + substitution_match = pruning_pass["substitution_regex"].search( + layer_name + ) + new_state_key = ( + layer_name[: substitution_match.start(1)] + + new_layer_number + + layer_name[substitution_match.end(1) :] + ) + new_state_dict[new_state_key] = state_dict[layer_name] + + # Since layers are now pruned, *_layers_to_keep are no longer needed. + # This is more of "It would make it work fix" rather than a proper fix. + if isinstance(model_cfg, DictConfig): + context = open_dict(model_cfg) + else: + context = contextlib.ExitStack() + with context: + if hasattr(model_cfg, "encoder_layers_to_keep"): + model_cfg.encoder_layers_to_keep = None + if hasattr(model_cfg, "decoder_layers_to_keep"): + model_cfg.decoder_layers_to_keep = None + + return new_state_dict + + +def load_pretrained_component_from_model( + component: Union[FairseqEncoder, FairseqDecoder], checkpoint: str +): + """ + Load a pretrained FairseqEncoder or FairseqDecoder from checkpoint into the + provided `component` object. If state_dict fails to load, there may be a + mismatch in the architecture of the corresponding `component` found in the + `checkpoint` file. + """ + if not PathManager.exists(checkpoint): + raise IOError("Model file not found: {}".format(checkpoint)) + state = load_checkpoint_to_cpu(checkpoint) + if isinstance(component, FairseqEncoder): + component_type = "encoder" + elif isinstance(component, FairseqDecoder): + component_type = "decoder" + else: + raise ValueError( + "component to load must be either a FairseqEncoder or " + "FairseqDecoder. Loading other component types are not supported." + ) + component_state_dict = OrderedDict() + for key in state["model"].keys(): + if key.startswith(component_type): + # encoder.input_layers.0.0.weight --> input_layers.0.0.weight + component_subkey = key[len(component_type) + 1 :] + component_state_dict[component_subkey] = state["model"][key] + component.load_state_dict(component_state_dict, strict=True) + return component + + +def verify_checkpoint_directory(save_dir: str) -> None: + if not os.path.exists(save_dir): + os.makedirs(save_dir, exist_ok=True) + temp_file_path = os.path.join(save_dir, "dummy") + try: + with open(temp_file_path, "w"): + pass + except OSError as e: + logger.warning( + "Unable to access checkpoint save directory: {}".format(save_dir) + ) + raise e + else: + os.remove(temp_file_path) diff --git a/SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda.cpp b/SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda.cpp new file mode 100644 index 0000000..4199cd6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda.cpp @@ -0,0 +1,47 @@ +/* +Copyright (c) Microsoft Corporation. +Licensed under the MIT License. +*/ + +#include <torch/extension.h> +#include <vector> + +/* +CPP Binding for CUDA OP +*/ + +// CUDA forward declarations +torch::Tensor ngram_repeat_block_cuda_forward(torch::Tensor tokens, + torch::Tensor lprobs, int bsz, + int step, int beam_size, + int no_repeat_ngram_size); + +#define CHECK_CUDA(x) \ + TORCH_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CONTIGUOUS(x) \ + TORCH_CHECK(x.is_contiguous(), #x " must be contiguous") +#define CHECK_INPUT(x) \ + CHECK_CUDA(x); \ + CHECK_CONTIGUOUS(x) + +// Input check and call to CUDA OP +// Backward method not required +torch::Tensor ngram_repeat_block_forward(torch::Tensor tokens, + torch::Tensor lprobs, int bsz, + int step, int beam_size, + int no_repeat_ngram_size) { + CHECK_INPUT(tokens); + CHECK_INPUT(lprobs); + assert(bsz > 0); + assert(step >= 0); + assert(beam_size > 0); + assert(no_repeat_ngram_size > 0); + + return ngram_repeat_block_cuda_forward(tokens, lprobs, bsz, step, beam_size, + no_repeat_ngram_size); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &ngram_repeat_block_forward, + "No Repeat Ngram Block forward (CUDA)"); +} diff --git a/SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda_kernel.cu b/SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda_kernel.cu new file mode 100644 index 0000000..b458b09 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/cuda/ngram_repeat_block_cuda_kernel.cu @@ -0,0 +1,76 @@ +/* +Copyright (c) Microsoft Corporation. +Licensed under the MIT License. +*/ + +/* +Kernel implementation for blocking repeated n-grams. +*/ + +#include <cuda.h> +#include <cuda_runtime.h> +#include <math.h> +#include <torch/extension.h> +#include <vector> + +// Ban repeated ngrams of length = 'no_repeat_ngram_size' +__global__ void banRepeatedTokens(long* __restrict__ tokens, + float* __restrict__ lprobs, + int max_predict_len, int vocab_size, + int no_repeat_ngram_size) { + auto row = blockIdx.x; + auto col = threadIdx.x; + auto start = row * (max_predict_len) + col; + // Each thread compares ngram starting from + // thread index with final ngram starting from + // step - no_repeat_ngram_size +2 + auto check_start_pos = blockDim.x; + auto lprob_start = row * vocab_size; + bool is_banned = true; + extern __shared__ long tokens_shm[]; + tokens_shm[col] = tokens[start]; + if (col == blockDim.x - 1) { + for (int i=1; i<no_repeat_ngram_size; i++){ + if (col+i < max_predict_len){ + tokens_shm[col + i] = tokens[start + i]; + } + } + } + __syncthreads(); + + for (int k = 0; k < no_repeat_ngram_size - 1; k++) { + if (tokens_shm[col + k] != tokens_shm[check_start_pos + k]) { + is_banned = false; + } + } + if (is_banned == true) { + auto token_to_be_banned = tokens_shm[col + no_repeat_ngram_size - 1]; + lprobs[lprob_start + token_to_be_banned] = -INFINITY; + } +} + +// Allocate blocks and threads based on +// batch size and sequence length and launch +// kernel +torch::Tensor ngram_repeat_block_cuda_forward(const torch::Tensor tokens, + torch::Tensor lprobs, int bsz, + int step, int beam_size, + int no_repeat_ngram_size) { + int threads = step - no_repeat_ngram_size + 2; + if (threads <= 0) return lprobs; + int max_predict_len = tokens.size(1); + int vocab_size = lprobs.size(1); + auto token_ptr = tokens.data_ptr<long>(); + auto lprob_ptr = lprobs.data_ptr<float>(); + int blocks = bsz * beam_size; + int shared_mem_size = (step + 1) * sizeof(long); + + // Launching N blocks where N is number of samples in a batch (beams*bsz) + // Launching T threads where T is number of previous ngrams in a sample + // Allocating shared mem per block for fastser access of input tokens since + // each token will be accessed N times to compare with current Ngram where + // N is Ngram size. + banRepeatedTokens<<<blocks, threads, shared_mem_size>>>( + token_ptr, lprob_ptr, max_predict_len, vocab_size, no_repeat_ngram_size); + return lprobs; +} diff --git a/SpeechT5/fairseq/fairseq/clib/libbase/balanced_assignment.cpp b/SpeechT5/fairseq/fairseq/clib/libbase/balanced_assignment.cpp new file mode 100644 index 0000000..296f03b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/libbase/balanced_assignment.cpp @@ -0,0 +1,95 @@ +/** + * Copyright 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the license found in the + * LICENSE file in the root directory of this source tree. + */ + +/* +C++ code for solving the linear assignment problem. +Based on the Auction Algorithm from https://dspace.mit.edu/bitstream/handle/1721.1/3265/P-2108-26912652.pdf and the implementation from: +https://github.com/bkj/auction-lap +Adapted to be more efficient when each worker is looking for k jobs instead of 1. +*/ +#include <torch/extension.h> +#include <iostream> +using namespace torch::indexing; +torch::Tensor balanced_assignment(torch::Tensor job_and_worker_to_score) { + int max_iterations = 100; + torch::Tensor epsilon = (job_and_worker_to_score.max() - job_and_worker_to_score.min()) / 50; + epsilon.clamp_min_(1e-04); + torch::Tensor worker_and_job_to_score = job_and_worker_to_score.detach().transpose(0,1).contiguous(); + int num_workers = worker_and_job_to_score.size(0); + int num_jobs = worker_and_job_to_score.size(1); + auto device = worker_and_job_to_score.device(); + int jobs_per_worker = num_jobs / num_workers; + torch::Tensor value = worker_and_job_to_score.clone(); + int counter = 0; + torch::Tensor max_value = worker_and_job_to_score.max(); + + torch::Tensor bid_indices; + torch::Tensor cost = worker_and_job_to_score.new_zeros({1, num_jobs}); + torch::Tensor bids = worker_and_job_to_score.new_empty({num_workers, num_jobs}); + torch::Tensor bid_increments = worker_and_job_to_score.new_empty({num_workers, jobs_per_worker}); + torch::Tensor top_values = worker_and_job_to_score.new_empty({num_workers, jobs_per_worker + 1}); + torch::Tensor high_bids = worker_and_job_to_score.new_empty({num_jobs}); + + torch::Tensor top_index = top_values.to(torch::kLong); + torch::Tensor high_bidders = top_index.new_empty({num_jobs}); + torch::Tensor have_bids = high_bidders.to(torch::kBool); + torch::Tensor jobs_indices = torch::arange({num_jobs}, torch::dtype(torch::kLong).device(device)); + torch::Tensor true_tensor = torch::ones({1}, torch::dtype(torch::kBool).device(device)); + + while (true) { + bids.zero_(); + torch::topk_out(top_values, top_index, value, jobs_per_worker + 1, 1); + + // Each worker bids the difference in value between that job and the k+1th job + torch::sub_out(bid_increments, + top_values.index({Slice(None, None), Slice(0, jobs_per_worker)}), + top_values.index({Slice(None, None), jobs_per_worker}).unsqueeze(1)); + + bid_increments.add_(epsilon); + bids.scatter_(1, + top_index.index({Slice(None, None),Slice(0, jobs_per_worker)}), + bid_increments); + + if (counter < max_iterations && counter > 0) { + // Put in a minimal bid to retain items from the last round if no-one else bids for them this round + bids.view(-1).index_put_({bid_indices}, epsilon); + } + + // Find the highest bidding worker per job + torch::max_out(high_bids, high_bidders, bids, 0); + torch::gt_out(have_bids, high_bids, 0); + + if (have_bids.all().item<bool>()) { + // All jobs were bid for + break; + } + + // Make popular items more expensive + cost.add_(high_bids); + torch::sub_out(value, worker_and_job_to_score, cost); + + bid_indices = ((high_bidders * num_jobs) + jobs_indices).index({have_bids}); + + if (counter < max_iterations) { + // Make sure that this item will be in the winning worker's top-k next time. + value.view(-1).index_put_({bid_indices}, max_value); + } + else { + // Suboptimal approximation that converges quickly from current solution + value.view(-1).index_put_({bid_indices}, worker_and_job_to_score.view(-1).index({bid_indices})); + } + + counter += 1; + } + + return top_index.index({Slice(None, None), Slice(0, jobs_per_worker)}).reshape(-1); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("balanced_assignment", &balanced_assignment, "Balanced Assignment"); +} diff --git a/SpeechT5/fairseq/fairseq/clib/libbleu/libbleu.cpp b/SpeechT5/fairseq/fairseq/clib/libbleu/libbleu.cpp new file mode 100644 index 0000000..3cf2d65 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/libbleu/libbleu.cpp @@ -0,0 +1,141 @@ +/** + * Copyright 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include <map> +#include <array> +#include <cstring> +#include <cstdio> + +typedef struct +{ + size_t reflen; + size_t predlen; + size_t match1; + size_t count1; + size_t match2; + size_t count2; + size_t match3; + size_t count3; + size_t match4; + size_t count4; +} bleu_stat; + +// left trim (remove pad) +void bleu_ltrim(size_t* len, int** sent, int pad) { + size_t start = 0; + while(start < *len) { + if (*(*sent + start) != pad) { break; } + start++; + } + *sent += start; + *len -= start; +} + +// right trim remove (eos) +void bleu_rtrim(size_t* len, int** sent, int pad, int eos) { + size_t end = *len - 1; + while (end > 0) { + if (*(*sent + end) != eos && *(*sent + end) != pad) { break; } + end--; + } + *len = end + 1; +} + +// left and right trim +void bleu_trim(size_t* len, int** sent, int pad, int eos) { + bleu_ltrim(len, sent, pad); + bleu_rtrim(len, sent, pad, eos); +} + +size_t bleu_hash(int len, int* data) { + size_t h = 14695981039346656037ul; + size_t prime = 0x100000001b3; + char* b = (char*) data; + size_t blen = sizeof(int) * len; + + while (blen-- > 0) { + h ^= *b++; + h *= prime; + } + + return h; +} + +void bleu_addngram( + size_t *ntotal, size_t *nmatch, size_t n, + size_t reflen, int* ref, size_t predlen, int* pred) { + + if (predlen < n) { return; } + + predlen = predlen - n + 1; + (*ntotal) += predlen; + + if (reflen < n) { return; } + + reflen = reflen - n + 1; + + std::map<size_t, size_t> count; + while (predlen > 0) { + size_t w = bleu_hash(n, pred++); + count[w]++; + predlen--; + } + + while (reflen > 0) { + size_t w = bleu_hash(n, ref++); + if (count[w] > 0) { + (*nmatch)++; + count[w] -=1; + } + reflen--; + } +} + +extern "C" { + +#ifdef _WIN64 +__declspec(dllexport) +#endif +void bleu_zero_init(bleu_stat* stat) { + std::memset(stat, 0, sizeof(bleu_stat)); +} + +#ifdef _WIN64 +__declspec(dllexport) +#endif +void bleu_one_init(bleu_stat* stat) { + bleu_zero_init(stat); + stat->count1 = 0; + stat->count2 = 1; + stat->count3 = 1; + stat->count4 = 1; + stat->match1 = 0; + stat->match2 = 1; + stat->match3 = 1; + stat->match4 = 1; +} + +#ifdef _WIN64 +__declspec(dllexport) +#endif +void bleu_add( + bleu_stat* stat, + size_t reflen, int* ref, size_t predlen, int* pred, int pad, int eos) { + + bleu_trim(&reflen, &ref, pad, eos); + bleu_trim(&predlen, &pred, pad, eos); + stat->reflen += reflen; + stat->predlen += predlen; + + bleu_addngram(&stat->count1, &stat->match1, 1, reflen, ref, predlen, pred); + bleu_addngram(&stat->count2, &stat->match2, 2, reflen, ref, predlen, pred); + bleu_addngram(&stat->count3, &stat->match3, 3, reflen, ref, predlen, pred); + bleu_addngram(&stat->count4, &stat->match4, 4, reflen, ref, predlen, pred); +} + +} diff --git a/SpeechT5/fairseq/fairseq/clib/libbleu/module.cpp b/SpeechT5/fairseq/fairseq/clib/libbleu/module.cpp new file mode 100644 index 0000000..8ed9a84 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/libbleu/module.cpp @@ -0,0 +1,37 @@ +/** + * Copyright 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include <Python.h> + + +static PyMethodDef method_def[] = { + {NULL, NULL, 0, NULL} +}; + +static struct PyModuleDef module_def = { + PyModuleDef_HEAD_INIT, + "libbleu", /* name of module */ + NULL, /* module documentation, may be NULL */ + -1, /* size of per-interpreter state of the module, + or -1 if the module keeps state in global variables. */ + method_def +}; + + +#if PY_MAJOR_VERSION == 2 +PyMODINIT_FUNC init_libbleu() +#else +PyMODINIT_FUNC PyInit_libbleu() +#endif +{ + PyObject *m = PyModule_Create(&module_def); + if (!m) { + return NULL; + } + return m; +} diff --git a/SpeechT5/fairseq/fairseq/clib/libnat/edit_dist.cpp b/SpeechT5/fairseq/fairseq/clib/libnat/edit_dist.cpp new file mode 100644 index 0000000..6bc6a93 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/libnat/edit_dist.cpp @@ -0,0 +1,231 @@ +/** + * Copyright 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include <torch/torch.h> // @manual=//caffe2:torch_extension +#include <pybind11/detail/common.h> +#include <pybind11/pybind11.h> +#include <vector> +#include <algorithm> +#include <cstdint> +#include <iosfwd> +#include <memory> +#include <new> +#include <string> +#include <utility> + +using namespace ::std; + +vector<vector<uint32_t>> edit_distance2_with_dp( + vector<uint32_t>& x, + vector<uint32_t>& y) { + uint32_t lx = x.size(); + uint32_t ly = y.size(); + vector<vector<uint32_t>> d(lx + 1, vector<uint32_t>(ly + 1)); + for (uint32_t i = 0; i < lx + 1; i++) { + d[i][0] = i; + } + for (uint32_t j = 0; j < ly + 1; j++) { + d[0][j] = j; + } + for (uint32_t i = 1; i < lx + 1; i++) { + for (uint32_t j = 1; j < ly + 1; j++) { + d[i][j] = + min(min(d[i - 1][j], d[i][j - 1]) + 1, + d[i - 1][j - 1] + 2 * (x.at(i - 1) == y.at(j - 1) ? 0 : 1)); + } + } + return d; +} + +vector<vector<uint32_t>> edit_distance2_backtracking( + vector<vector<uint32_t>>& d, + vector<uint32_t>& x, + vector<uint32_t>& y, + uint32_t terminal_symbol) { + vector<uint32_t> seq; + vector<vector<uint32_t>> edit_seqs(x.size() + 2, vector<uint32_t>()); + /* + edit_seqs: + 0~x.size() cell is the insertion sequences + last cell is the delete sequence + */ + + if (x.size() == 0) { + edit_seqs.at(0) = y; + return edit_seqs; + } + + uint32_t i = d.size() - 1; + uint32_t j = d.at(0).size() - 1; + + while ((i >= 0) && (j >= 0)) { + if ((i == 0) && (j == 0)) { + break; + } + + if ((j > 0) && (d.at(i).at(j - 1) < d.at(i).at(j))) { + seq.push_back(1); // insert + seq.push_back(y.at(j - 1)); + j--; + } else if ((i > 0) && (d.at(i - 1).at(j) < d.at(i).at(j))) { + seq.push_back(2); // delete + seq.push_back(x.at(i - 1)); + i--; + } else { + seq.push_back(3); // keep + seq.push_back(x.at(i - 1)); + i--; + j--; + } + } + + uint32_t prev_op, op, s, word; + prev_op = 0, s = 0; + for (uint32_t k = 0; k < seq.size() / 2; k++) { + op = seq.at(seq.size() - 2 * k - 2); + word = seq.at(seq.size() - 2 * k - 1); + if (prev_op != 1) { + s++; + } + if (op == 1) // insert + { + edit_seqs.at(s - 1).push_back(word); + } else if (op == 2) // delete + { + edit_seqs.at(x.size() + 1).push_back(1); + } else { + edit_seqs.at(x.size() + 1).push_back(0); + } + + prev_op = op; + } + + for (uint32_t k = 0; k < edit_seqs.size(); k++) { + if (edit_seqs[k].size() == 0) { + edit_seqs[k].push_back(terminal_symbol); + } + } + return edit_seqs; +} + +vector<vector<uint32_t>> edit_distance2_backtracking_with_delete( + vector<vector<uint32_t>>& d, + vector<uint32_t>& x, + vector<uint32_t>& y, + uint32_t terminal_symbol, + uint32_t deletion_symbol) { + vector<uint32_t> seq; + vector<vector<uint32_t>> edit_seqs(x.size() + 1, vector<uint32_t>()); + /* + edit_seqs: + 0~x.size() cell is the insertion sequences + last cell is the delete sequence + */ + + if (x.size() == 0) { + edit_seqs.at(0) = y; + return edit_seqs; + } + + uint32_t i = d.size() - 1; + uint32_t j = d.at(0).size() - 1; + + while ((i >= 0) && (j >= 0)) { + if ((i == 0) && (j == 0)) { + break; + } + + if ((j > 0) && (d.at(i).at(j - 1) < d.at(i).at(j))) { + seq.push_back(1); // insert + seq.push_back(y.at(j - 1)); + j--; + } else if ((i > 0) && (d.at(i - 1).at(j) < d.at(i).at(j))) { + seq.push_back(2); // delete + seq.push_back(x.at(i - 1)); + i--; + } else { + seq.push_back(3); // keep + seq.push_back(x.at(i - 1)); + i--; + j--; + } + } + + uint32_t prev_op, op, s, word; + prev_op = 0, s = 0; + for (uint32_t k = 0; k < seq.size() / 2; k++) { + op = seq.at(seq.size() - 2 * k - 2); + word = seq.at(seq.size() - 2 * k - 1); + if (prev_op != 1) { + s++; + } + if (op == 1) // insert + { + edit_seqs.at(s - 1).push_back(word); + } else if (op == 2) // delete + { + edit_seqs.at(s - 1).push_back(deletion_symbol); + } + + prev_op = op; + } + + for (uint32_t k = 0; k < edit_seqs.size(); k++) { + if (edit_seqs.at(k).size() == 0) { + edit_seqs.at(k).push_back(terminal_symbol); + } + } + return edit_seqs; +} + +vector<uint32_t> compute_ed2( + vector<vector<uint32_t>>& xs, + vector<vector<uint32_t>>& ys) { + vector<uint32_t> distances(xs.size()); + for (uint32_t i = 0; i < xs.size(); i++) { + vector<vector<uint32_t>> d = edit_distance2_with_dp(xs.at(i), ys.at(i)); + distances.at(i) = d.at(xs.at(i).size()).at(ys.at(i).size()); + } + return distances; +} + +vector<vector<vector<uint32_t>>> suggested_ed2_path( + vector<vector<uint32_t>>& xs, + vector<vector<uint32_t>>& ys, + uint32_t terminal_symbol) { + vector<vector<vector<uint32_t>>> seq(xs.size()); + for (uint32_t i = 0; i < xs.size(); i++) { + vector<vector<uint32_t>> d = edit_distance2_with_dp(xs.at(i), ys.at(i)); + seq.at(i) = + edit_distance2_backtracking(d, xs.at(i), ys.at(i), terminal_symbol); + } + return seq; +} + +vector<vector<vector<uint32_t>>> suggested_ed2_path_with_delete( + vector<vector<uint32_t>>& xs, + vector<vector<uint32_t>>& ys, + uint32_t terminal_symbol, + uint32_t deletion_symbol) { + vector<vector<vector<uint32_t>>> seq(xs.size()); + for (uint32_t i = 0; i < xs.size(); i++) { + vector<vector<uint32_t>> d = edit_distance2_with_dp(xs.at(i), ys.at(i)); + seq.at(i) = edit_distance2_backtracking_with_delete( + d, xs.at(i), ys.at(i), terminal_symbol, deletion_symbol); + } + return seq; +} + +PYBIND11_MODULE(libnat, m) { + m.def("compute_ed2", &compute_ed2, "compute_ed2"); + m.def("suggested_ed2_path", &suggested_ed2_path, "suggested_ed2_path"); + m.def( + "suggested_ed2_path_with_delete", + &suggested_ed2_path_with_delete, + "suggested_ed2_path_with_delete"); +} diff --git a/SpeechT5/fairseq/fairseq/clib/libnat_cuda/binding.cpp b/SpeechT5/fairseq/fairseq/clib/libnat_cuda/binding.cpp new file mode 100644 index 0000000..aaa6244 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/libnat_cuda/binding.cpp @@ -0,0 +1,60 @@ +/** + * Copyright 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the license found in the + * LICENSE file in the root directory of this source tree. + */ + +/* + This code is partially adpoted from https://github.com/1ytic/pytorch-edit-distance + */ + +#include "edit_dist.h" +#include <torch/types.h> + +#ifndef TORCH_CHECK +#define TORCH_CHECK AT_CHECK +#endif + +#define CHECK_CUDA(x) TORCH_CHECK(x.type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CONTIGUOUS(x) TORCH_CHECK(x.is_contiguous(), #x " must be contiguous") +#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) + + +torch::Tensor LevenshteinDistance( + torch::Tensor source, + torch::Tensor target, + torch::Tensor source_length, + torch::Tensor target_length) { + + CHECK_INPUT(source); + CHECK_INPUT(target); + CHECK_INPUT(source_length); + CHECK_INPUT(target_length); + return LevenshteinDistanceCuda(source, target, source_length, target_length); +} + +torch::Tensor GenerateDeletionLabel( + torch::Tensor source, + torch::Tensor operations) { + + CHECK_INPUT(source); + CHECK_INPUT(operations); + return GenerateDeletionLabelCuda(source, operations); +} + +std::pair<torch::Tensor, torch::Tensor> GenerateInsertionLabel( + torch::Tensor target, + torch::Tensor operations) { + + CHECK_INPUT(target); + CHECK_INPUT(operations); + return GenerateInsertionLabelCuda(target, operations); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("levenshtein_distance", &LevenshteinDistance, "Levenshtein distance"); + m.def("generate_deletion_labels", &GenerateDeletionLabel, "Generate Deletion Label"); + m.def("generate_insertion_labels", &GenerateInsertionLabel, "Generate Insertion Label"); +} diff --git a/SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.cu b/SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.cu new file mode 100644 index 0000000..22de16b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.cu @@ -0,0 +1,332 @@ +/** +* Copyright 2017-present, Facebook, Inc. +* All rights reserved. +* +* This source code is licensed under the license found in the +* LICENSE file in the root directory of this source tree. +*/ + +#include "edit_dist.h" +#include <THC/THC.h> +#include <cuda.h> +#include <cuda_runtime.h> +#include <device_launch_parameters.h> +#include <utility> // std::pair + +template <typename scalar_t> +__global__ void generate_deletion_label_kernel( + const scalar_t* __restrict__ source, + const size_t source_size, + const size_t operation_size, + int* __restrict__ operations, + int* __restrict__ labels) { + + const int index = blockIdx.x; + const int offset = index * operation_size; + const int offset_label = index * source_size; + + for (int i = 0; i < source_size; i++) { + labels[offset_label + i] = 0; + } + + int k = 0; + for (int i = 0; i < operation_size; i++){ + if (operations[offset + i] == 0){ + break; + } else if (operations[offset + i] == 1){ + continue; + } else { + labels[offset_label + k] = 3 - operations[offset + i]; + k++; + } + } +} + +template <typename scalar_t> +__global__ void generate_insertion_label_kernel( + const scalar_t* __restrict__ target, + const size_t target_size, + const size_t operation_size, + int* __restrict__ operations, + int* __restrict__ labels, + int* __restrict__ masks) { + + const int index = blockIdx.x; + const int offset = index * operation_size; + const int offset_label = index * target_size; + + int k = 0; + int u = 0; + int m = 0; + + for (int i = 0; i < target_size; i++) { + labels[offset_label + i] = 0; + masks[offset_label + i] = 0; + } + + for (int i = 0; i < operation_size-1; i++){ + if (operations[offset + i] == 0){ + break; + } else if (operations[offset + i] == 2){ + continue; + } else if (operations[offset + i] == 1){ + masks[offset_label + m] = 1; + u++; m++; + } else { + labels[offset_label + k] = u; + masks[offset_label + m] = 0; + k++; m++; + u = 0; + } + } +} + +template <typename scalar_t> +__global__ void levenshtein_distance_kernel( + const scalar_t* __restrict__ source, + const scalar_t* __restrict__ target, + const int* __restrict__ source_length, + const int* __restrict__ target_length, + const size_t source_size, + const size_t target_size, + int* __restrict__ operations, + int* __restrict__ errors_curr) { + + const int index = blockIdx.x; + const int offset = index * (source_size + target_size); + const int d = index * (source_size + 1) * (target_size + 1); + const int t = target_size + 1; + + auto err_idx = [d, t](int i, int j) { return d + i * t + j; }; + auto opt_idx = [offset](int k) { return offset + k; }; + + const int hyp_len = source_length[index]; + const int ref_len = target_length[index]; + const scalar_t* hyp_begin = source + index * source_size; + const scalar_t* ref_begin = target + index * target_size; + + // dynamic programming + for (int i = 0; i <= hyp_len; i++){ + errors_curr[err_idx(i, 0)] = i; + } + for (int j = 0; j <= ref_len; j++){ + errors_curr[err_idx(0, j)] = j; + } + for (int i = 1; i <= hyp_len; i++){ + for (int j = 1; j <= ref_len; j++){ + errors_curr[err_idx(i, j)] = min( + min( + errors_curr[err_idx(i-1, j)], + errors_curr[err_idx(i, j-1)] + ) + 1, + errors_curr[err_idx(i-1, j-1)] + 2 * ( + *(hyp_begin+i-1) == *(ref_begin+j-1) ? 0 : 1 + ) + ); + } + } + + // back-tracing + int i = hyp_len; + int j = ref_len; + int o = hyp_len + ref_len; + + for (int k = 0; k < source_size + target_size; k++) { + operations[opt_idx(k)] = 0; + } + + while ((i >= 0) && (j >= 0)) { + if ((i == 0) && (j == 0)) { + break; + } + + if ((j > 0) && (errors_curr[err_idx(i, j-1)] < errors_curr[err_idx(i, j)])) { + o--; operations[opt_idx(o)] = 1; j--; // insertion + } else if ((i > 0) && (errors_curr[err_idx(i-1, j)] < errors_curr[err_idx(i, j)])) { + o--; operations[opt_idx(o)] = 2; i--; // deletion + } else { + o--; operations[opt_idx(o)] = 3; i--; j--; // do nothing + } + } + + // moving to the left + for (int k = 0; k < hyp_len + ref_len; k++) { + if (k + o < hyp_len + ref_len){ + operations[opt_idx(k)] = operations[opt_idx(k+o)]; + } else{ + operations[opt_idx(k)] = 0; // padding + } + } + +} + +template <typename scalar_t> +__global__ void faster_levenshtein_distance_kernel( + const scalar_t* __restrict__ source, + const scalar_t* __restrict__ target, + const int* __restrict__ source_length, + const int* __restrict__ target_length, + const size_t source_size, + const size_t target_size, + int* __restrict__ operations) { + + extern __shared__ short errors[]; + auto errors_curr = errors; + + const int index = blockIdx.x; + const int offset = index * (source_size + target_size); + const int t = target_size + 1; + + auto err_idx = [t](int i, int j) { return i * t + j; }; + auto opt_idx = [offset](int k) { return offset + k; }; + + const int hyp_len = source_length[index]; + const int ref_len = target_length[index]; + const scalar_t* hyp_begin = source + index * source_size; + const scalar_t* ref_begin = target + index * target_size; + + // dynamic programming + for (int i = 0; i <= hyp_len; i++){ + errors_curr[err_idx(i, 0)] = i; + } + for (int j = 0; j <= ref_len; j++){ + errors_curr[err_idx(0, j)] = j; + } + for (int i = 1; i <= hyp_len; i++){ + for (int j = 1; j <= ref_len; j++){ + errors_curr[err_idx(i, j)] = min( + min( + errors_curr[err_idx(i-1, j)], + errors_curr[err_idx(i, j-1)] + ) + 1, + errors_curr[err_idx(i-1, j-1)] + 2 * ( + *(hyp_begin+i-1) == *(ref_begin+j-1) ? 0 : 1 + ) + ); + } + } + + // back-tracing + int i = hyp_len; + int j = ref_len; + int o = hyp_len + ref_len; + + for (int k = 0; k < source_size + target_size; k++) { + operations[opt_idx(k)] = 0; + } + + while ((i >= 0) && (j >= 0)) { + if ((i == 0) && (j == 0)) { + break; + } + + if ((j > 0) && (errors_curr[err_idx(i, j-1)] < errors_curr[err_idx(i, j)])) { + o--; operations[opt_idx(o)] = 1; j--; // insertion + } else if ((i > 0) && (errors_curr[err_idx(i-1, j)] < errors_curr[err_idx(i, j)])) { + o--; operations[opt_idx(o)] = 2; i--; // deletion + } else { + o--; operations[opt_idx(o)] = 3; i--; j--; // do nothing + } + } + + // moving to the left + for (int k = 0; k < hyp_len + ref_len; k++) { + if (k + o < hyp_len + ref_len){ + operations[opt_idx(k)] = operations[opt_idx(k+o)]; + } else{ + operations[opt_idx(k)] = 0; // padding + } + } + +} + + +torch::Tensor GenerateDeletionLabelCuda( + torch::Tensor source, + torch::Tensor operations) { + + const auto batch_size = source.size(0); + at::TensorOptions options(source.device()); + options = options.dtype(at::ScalarType::Int); + auto labels = torch::empty({batch_size, source.size(1)}, options); + auto stream = at::cuda::getCurrentCUDAStream(source.device().index()); + + AT_DISPATCH_ALL_TYPES(source.scalar_type(), "generate_deletion_labels", ([&] { + generate_deletion_label_kernel<scalar_t><<<batch_size, 1, 0, stream>>>( + source.data_ptr<scalar_t>(), + source.size(1), + operations.size(1), + operations.data_ptr<int>(), + labels.data_ptr<int>()); + })); + + return labels; +} + +std::pair<torch::Tensor, torch::Tensor> GenerateInsertionLabelCuda( + torch::Tensor target, + torch::Tensor operations) { + +const auto batch_size = target.size(0); +at::TensorOptions options(target.device()); +options = options.dtype(at::ScalarType::Int); +auto labels = torch::empty({batch_size, target.size(1)}, options); +auto masks = torch::empty({batch_size, target.size(1)}, options); +auto stream = at::cuda::getCurrentCUDAStream(target.device().index()); + +AT_DISPATCH_ALL_TYPES(target.scalar_type(), "generate_insertion_labels", ([&] { + generate_insertion_label_kernel<scalar_t><<<batch_size, 1, 0, stream>>>( + target.data_ptr<scalar_t>(), + target.size(1), + operations.size(1), + operations.data_ptr<int>(), + labels.data_ptr<int>(), + masks.data_ptr<int>()); +})); + +return std::make_pair(labels, masks); +} + + +torch::Tensor LevenshteinDistanceCuda( + torch::Tensor source, + torch::Tensor target, + torch::Tensor source_length, + torch::Tensor target_length) { + + const auto batch_size = source.size(0); + const auto shared_size = (source.size(1) + 1) * (target.size(1) + 1) * sizeof(short); + + at::TensorOptions options(source.device()); + options = options.dtype(at::ScalarType::Int); + auto operations = torch::empty({batch_size, source.size(1) + target.size(1)}, options); + auto stream = at::cuda::getCurrentCUDAStream(source.device().index()); + + if (shared_size > 40000) { + auto distances = torch::empty({batch_size, (source.size(1) + 1) * (target.size(1) + 1)}, options); + AT_DISPATCH_ALL_TYPES(source.scalar_type(), "levenshtein_distance", ([&] { + levenshtein_distance_kernel<scalar_t><<<batch_size, 1, 0, stream>>>( + source.data_ptr<scalar_t>(), + target.data_ptr<scalar_t>(), + source_length.data_ptr<int>(), + target_length.data_ptr<int>(), + source.size(1), + target.size(1), + operations.data_ptr<int>(), + distances.data_ptr<int>()); + })); + } else { + AT_DISPATCH_ALL_TYPES(source.scalar_type(), "faster_levenshtein_distance", ([&] { + faster_levenshtein_distance_kernel<scalar_t><<<batch_size, 1, shared_size, stream>>>( + source.data_ptr<scalar_t>(), + target.data_ptr<scalar_t>(), + source_length.data_ptr<int>(), + target_length.data_ptr<int>(), + source.size(1), + target.size(1), + operations.data_ptr<int>()); + })); + } + + return operations; +} diff --git a/SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.h b/SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.h new file mode 100644 index 0000000..e3506cd --- /dev/null +++ b/SpeechT5/fairseq/fairseq/clib/libnat_cuda/edit_dist.h @@ -0,0 +1,25 @@ +/** + * Copyright 2017-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the license found in the + * LICENSE file in the root directory of this source tree. + */ + +#pragma once + +#include <torch/extension.h> + +torch::Tensor LevenshteinDistanceCuda( + torch::Tensor source, + torch::Tensor target, + torch::Tensor source_length, + torch::Tensor target_length); + +torch::Tensor GenerateDeletionLabelCuda( + torch::Tensor source, + torch::Tensor operations); + +std::pair<torch::Tensor, torch::Tensor> GenerateInsertionLabelCuda( + torch::Tensor source, + torch::Tensor operations); diff --git a/SpeechT5/fairseq/fairseq/config/__init__.py b/SpeechT5/fairseq/fairseq/config/__init__.py new file mode 100644 index 0000000..6264236 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. diff --git a/SpeechT5/fairseq/fairseq/config/config.yaml b/SpeechT5/fairseq/fairseq/config/config.yaml new file mode 100644 index 0000000..e20d914 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/config.yaml @@ -0,0 +1,18 @@ +# @package _group_ + +hydra: + run: + dir: . + +defaults: + - task: null + - model: null + - criterion: cross_entropy + - optimizer: null + - lr_scheduler: fixed + - bpe: null + - tokenizer: null + - scoring: null + - generation: null + - common_eval: null + - eval_lm: null diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_gbw.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_gbw.yaml new file mode 100644 index 0000000..30b1a4f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_gbw.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "relu" +dropout: 0.1 +attention_dropout: 0.1 +activation_dropout: 0.0 +relu_dropout: 0.0 +decoder_embed_dim: 512 +decoder_output_dim: 512 +decoder_input_dim: 512 +decoder_ffn_embed_dim: 4096 +decoder_layers: 12 +decoder_attention_heads: 16 +decoder_normalize_before: true +no_decoder_final_norm: true +adaptive_softmax_cutoff: null +adaptive_softmax_dropout: 0 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: false +adaptive_input_factor: 4 +adaptive_input_cutoff: null +tie_adaptive_weights: false +tie_adaptive_proj: false +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_wiki103.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_wiki103.yaml new file mode 100644 index 0000000..1154cfa --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_baevski_wiki103.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "relu" +dropout: 0.3 +attention_dropout: 0.1 +activation_dropout: 0.1 +relu_dropout: 0.1 +decoder_embed_dim: 1024 +decoder_output_dim: 1024 +decoder_input_dim: 1024 +decoder_ffn_embed_dim: 4096 +decoder_layers: 16 +decoder_attention_heads: 8 +decoder_normalize_before: true +no_decoder_final_norm: true +adaptive_softmax_cutoff: "20000,60000" +adaptive_softmax_dropout: 0.2 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: true +adaptive_input_factor: 4 +adaptive_input_cutoff: "20000,60000" +tie_adaptive_weights: true +tie_adaptive_proj: true +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_big.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_big.yaml new file mode 100644 index 0000000..3095753 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_big.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "relu" +dropout: 0.1 +attention_dropout: 0.0 +activation_dropout: 0.0 +relu_dropout: 0.0 +decoder_embed_dim: 1024 +decoder_output_dim: 1024 +decoder_input_dim: 1024 +decoder_ffn_embed_dim: 4096 +decoder_layers: 12 +decoder_attention_heads: 16 +decoder_normalize_before: true +no_decoder_final_norm: false +adaptive_softmax_cutoff: null +adaptive_softmax_dropout: 0 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: false +adaptive_input_factor: 4 +adaptive_input_cutoff: null +tie_adaptive_weights: false +tie_adaptive_proj: false +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gbw.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gbw.yaml new file mode 100644 index 0000000..30b1a4f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gbw.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "relu" +dropout: 0.1 +attention_dropout: 0.1 +activation_dropout: 0.0 +relu_dropout: 0.0 +decoder_embed_dim: 512 +decoder_output_dim: 512 +decoder_input_dim: 512 +decoder_ffn_embed_dim: 4096 +decoder_layers: 12 +decoder_attention_heads: 16 +decoder_normalize_before: true +no_decoder_final_norm: true +adaptive_softmax_cutoff: null +adaptive_softmax_dropout: 0 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: false +adaptive_input_factor: 4 +adaptive_input_cutoff: null +tie_adaptive_weights: false +tie_adaptive_proj: false +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt.yaml new file mode 100644 index 0000000..2c6cb7b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "gelu" +dropout: 0.1 +attention_dropout: 0.1 +activation_dropout: 0.0 +relu_dropout: 0.0 +decoder_embed_dim: 768 +decoder_output_dim: 768 +decoder_input_dim: 768 +decoder_ffn_embed_dim: 3072 +decoder_layers: 12 +decoder_attention_heads: 12 +decoder_normalize_before: true +no_decoder_final_norm: false +adaptive_softmax_cutoff: null +adaptive_softmax_dropout: 0 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: false +adaptive_input_factor: 4 +adaptive_input_cutoff: null +tie_adaptive_weights: false +tie_adaptive_proj: false +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_big.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_big.yaml new file mode 100644 index 0000000..a08769a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_big.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "gelu" +dropout: 0.1 +attention_dropout: 0.1 +activation_dropout: 0.0 +relu_dropout: 0.0 +decoder_embed_dim: 1600 +decoder_output_dim: 1600 +decoder_input_dim: 1600 +decoder_ffn_embed_dim: 6400 +decoder_layers: 48 +decoder_attention_heads: 25 +decoder_normalize_before: true +no_decoder_final_norm: false +adaptive_softmax_cutoff: null +adaptive_softmax_dropout: 0 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: false +adaptive_input_factor: 4 +adaptive_input_cutoff: null +tie_adaptive_weights: false +tie_adaptive_proj: false +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_medium.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_medium.yaml new file mode 100644 index 0000000..64261d7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_medium.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "gelu" +dropout: 0.1 +attention_dropout: 0.1 +activation_dropout: 0.0 +relu_dropout: 0.0 +decoder_embed_dim: 1280 +decoder_output_dim: 1280 +decoder_input_dim: 1280 +decoder_ffn_embed_dim: 5120 +decoder_layers: 36 +decoder_attention_heads: 20 +decoder_normalize_before: true +no_decoder_final_norm: false +adaptive_softmax_cutoff: null +adaptive_softmax_dropout: 0 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: false +adaptive_input_factor: 4 +adaptive_input_cutoff: null +tie_adaptive_weights: false +tie_adaptive_proj: false +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_small.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_small.yaml new file mode 100644 index 0000000..702e81f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_gpt2_small.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "gelu" +dropout: 0.1 +attention_dropout: 0.1 +activation_dropout: 0.0 +relu_dropout: 0.0 +decoder_embed_dim: 1024 +decoder_output_dim: 1024 +decoder_input_dim: 1024 +decoder_ffn_embed_dim: 4096 +decoder_layers: 24 +decoder_attention_heads: 16 +decoder_normalize_before: true +no_decoder_final_norm: false +adaptive_softmax_cutoff: null +adaptive_softmax_dropout: 0 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: false +adaptive_input_factor: 4 +adaptive_input_cutoff: null +tie_adaptive_weights: false +tie_adaptive_proj: false +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_wiki103.yaml b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_wiki103.yaml new file mode 100644 index 0000000..1154cfa --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/transformer_lm/transformer_lm_wiki103.yaml @@ -0,0 +1,36 @@ +# @package _group_ +activation_fn: "relu" +dropout: 0.3 +attention_dropout: 0.1 +activation_dropout: 0.1 +relu_dropout: 0.1 +decoder_embed_dim: 1024 +decoder_output_dim: 1024 +decoder_input_dim: 1024 +decoder_ffn_embed_dim: 4096 +decoder_layers: 16 +decoder_attention_heads: 8 +decoder_normalize_before: true +no_decoder_final_norm: true +adaptive_softmax_cutoff: "20000,60000" +adaptive_softmax_dropout: 0.2 +adaptive_softmax_factor: 4 +no_token_positional_embeddings: false +share_decoder_input_output_embed: false +character_embeddings: false +character_filters: "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]" +character_embedding_dim: 4 +char_embedder_highway_layers: 2 +adaptive_input: true +adaptive_input_factor: 4 +adaptive_input_cutoff: "20000,60000" +tie_adaptive_weights: true +tie_adaptive_proj: true +decoder_learned_pos: false +decoder_layerdrop: 0 +decoder_layers_to_keep: null +layernorm_embedding: false +no_scale_embedding: false +quant_noise_pq: 0 +quant_noise_pq_block_size: 8 +quant_noise_scalar: 0 diff --git a/SpeechT5/fairseq/fairseq/config/model/wav2vec/vq_wav2vec_gumbel.yaml b/SpeechT5/fairseq/fairseq/config/model/wav2vec/vq_wav2vec_gumbel.yaml new file mode 100644 index 0000000..ee1329b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/wav2vec/vq_wav2vec_gumbel.yaml @@ -0,0 +1,5 @@ +# @package _group_ +activation: gelu +vq_type: gumbel +vq_depth: 2 +combine_groups: true diff --git a/SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_base.yaml b/SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_base.yaml new file mode 100644 index 0000000..ce65499 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_base.yaml @@ -0,0 +1,8 @@ +# @package _group_ + +quantize_targets: true +final_dim: 256 +encoder_layerdrop: 0.05 +dropout_input: 0.1 +dropout_features: 0.1 +feature_grad_mult: 0.1 diff --git a/SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_large.yaml b/SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_large.yaml new file mode 100644 index 0000000..5846f75 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/config/model/wav2vec2/wav2vec2_large.yaml @@ -0,0 +1,20 @@ +# @package _group_ + +quantize_targets: true +extractor_mode: layer_norm +layer_norm_first: true +final_dim: 768 +latent_temp: [2.0,0.1,0.999995] +encoder_layerdrop: 0.0 +dropout_input: 0.0 +dropout_features: 0.0 +dropout: 0.0 +attention_dropout: 0.0 +conv_bias: true + +encoder_layers: 24 +encoder_embed_dim: 1024 +encoder_ffn_embed_dim: 4096 +encoder_attention_heads: 16 + +feature_grad_mult: 1.0 diff --git a/SpeechT5/fairseq/fairseq/criterions/__init__.py b/SpeechT5/fairseq/fairseq/criterions/__init__.py new file mode 100644 index 0000000..4dbf46a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import importlib +import os + +from fairseq import registry +from fairseq.criterions.fairseq_criterion import ( # noqa + FairseqCriterion, + LegacyFairseqCriterion, +) +from omegaconf import DictConfig + + +( + build_criterion_, + register_criterion, + CRITERION_REGISTRY, + CRITERION_DATACLASS_REGISTRY, +) = registry.setup_registry( + "--criterion", base_class=FairseqCriterion, default="cross_entropy" +) + + +def build_criterion(cfg: DictConfig, task): + return build_criterion_(cfg, task) + + +# automatically import any Python files in the criterions/ directory +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + file_name = file[: file.find(".py")] + importlib.import_module("fairseq.criterions." + file_name) diff --git a/SpeechT5/fairseq/fairseq/criterions/adaptive_loss.py b/SpeechT5/fairseq/fairseq/criterions/adaptive_loss.py new file mode 100644 index 0000000..6209cea --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/adaptive_loss.py @@ -0,0 +1,123 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass + +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.constants import DDP_BACKEND_CHOICES +from omegaconf import II + + +@dataclass +class AdaptiveLossConfig(FairseqDataclass): + sentence_avg: bool = II("optimization.sentence_avg") + ddp_backend: DDP_BACKEND_CHOICES = II("distributed_training.ddp_backend") + + +@register_criterion("adaptive_loss", dataclass=AdaptiveLossConfig) +class AdaptiveLoss(FairseqCriterion): + """This is an implementation of the loss function accompanying the adaptive softmax approximation for + graphical processing units (GPU), described in the paper "Efficient softmax approximation for GPUs" + (http://arxiv.org/abs/1609.04309).""" + + def __init__(self, task, sentence_avg): + super().__init__(task) + self.sentence_avg = sentence_avg + + @classmethod + def build_criterion(cls, cfg: AdaptiveLossConfig, task): + if cfg.ddp_backend in {"c10d", "pytorch_ddp"}: + raise Exception( + "AdaptiveLoss is not compatible with the PyTorch " + "version of DistributedDataParallel. Please use " + "`--ddp-backend=legacy_ddp` instead." + ) + return cls(task, cfg.sentence_avg) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + + assert ( + hasattr(model.decoder, "adaptive_softmax") + and model.decoder.adaptive_softmax is not None + ) + adaptive_softmax = model.decoder.adaptive_softmax + + net_output = model(**sample["net_input"]) + orig_target = model.get_targets(sample, net_output) + + nsentences = orig_target.size(0) + orig_target = orig_target.view(-1) + + bsz = orig_target.size(0) + + logits, target = adaptive_softmax(net_output[0], orig_target) + assert len(target) == len(logits) + + loss = net_output[0].new(1 if reduce else bsz).zero_() + + for i in range(len(target)): + if target[i] is not None: + assert target[i].min() >= 0 and target[i].max() <= logits[i].size(1) + loss += F.cross_entropy( + logits[i], + target[i], + ignore_index=self.padding_idx, + reduction="sum" if reduce else "none", + ) + + orig = utils.strip_pad(orig_target, self.padding_idx) + ntokens = orig.numel() + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + logging_output = { + "loss": loss.data, + "ntokens": ntokens, + "nsentences": nsentences, + "sample_size": sample_size, + } + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/composite_loss.py b/SpeechT5/fairseq/fairseq/criterions/composite_loss.py new file mode 100644 index 0000000..98e835f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/composite_loss.py @@ -0,0 +1,100 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq import utils +from fairseq.criterions import LegacyFairseqCriterion, register_criterion +from torch import nn + + +@register_criterion("composite_loss") +class CompositeLoss(LegacyFairseqCriterion): + """This is a composite loss that, given a list of model outputs and a list of targets, + computes an average of losses for each output-target pair""" + + def __init__(self, args, task): + super().__init__(args, task) + self.underlying_criterion = args.underlying_criterion + + @staticmethod + def add_args(parser): + """Add criterion-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--underlying-criterion', type=str, metavar='VAL', required=True, + help='underlying criterion to use for the composite loss') + # fmt: on + + @staticmethod + def build_underlying_criterion(args, task): + saved_criterion = args.criterion + args.criterion = args.underlying_criterion + assert saved_criterion != args.underlying_criterion + underlying_criterion = task.build_criterion(args) + args.criterion = saved_criterion + return underlying_criterion + + @classmethod + def build_criterion(cls, args, task): + underlying_criterion = CompositeLoss.build_underlying_criterion(args, task) + + class FakeModel(nn.Module): + def __init__(self, model, net_out, target): + super().__init__() + self.model = model + self.net_out = net_out + self.target = target + + def forward(self, **unused): + return self.net_out + + def get_normalized_probs(self, net_output, log_probs, sample=None): + return self.model.get_normalized_probs( + net_output, log_probs, sample=sample + ) + + def get_targets(self, *unused): + return self.target + + @property + def decoder(self): + return self.model.decoder + + class _CompositeLoss(LegacyFairseqCriterion): + def __init__(self, args, task, underlying_criterion): + super().__init__(args, task) + self.underlying_criterion = underlying_criterion + + def forward(self, model, sample, reduce=True): + net_outputs = model(**sample["net_input"]) + targets = sample["target"] + + bsz = targets[0].size(0) + loss = net_outputs[0][0].new(1 if reduce else bsz).float().zero_() + + sample_size = 0 + logging_output = {} + for o, t in zip(net_outputs[0], targets): + m = FakeModel(model, (o, net_outputs[1]), t) + sample["target"] = t + l, ss, logging_output = self.underlying_criterion(m, sample, reduce) + loss += l + sample_size += ss + + loss.div_(len(targets)) + sample_size /= len(targets) + + logging_output["loss"] = utils.item(loss.data) if reduce else loss.data + return loss, sample_size, logging_output + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + return underlying_criterion.__class__.aggregate_logging_outputs( + logging_outputs + ) + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + underlying_criterion.__class__.reduce_metrics(logging_outputs) + + return _CompositeLoss(args, task, underlying_criterion) diff --git a/SpeechT5/fairseq/fairseq/criterions/cross_entropy.py b/SpeechT5/fairseq/fairseq/criterions/cross_entropy.py new file mode 100644 index 0000000..fe46106 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/cross_entropy.py @@ -0,0 +1,90 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass + +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from omegaconf import II + + +@dataclass +class CrossEntropyCriterionConfig(FairseqDataclass): + sentence_avg: bool = II("optimization.sentence_avg") + + +@register_criterion("cross_entropy", dataclass=CrossEntropyCriterionConfig) +class CrossEntropyCriterion(FairseqCriterion): + def __init__(self, task, sentence_avg): + super().__init__(task) + self.sentence_avg = sentence_avg + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(**sample["net_input"]) + loss, _ = self.compute_loss(model, net_output, sample, reduce=reduce) + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + logging_output = { + "loss": loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + return loss, sample_size, logging_output + + def compute_loss(self, model, net_output, sample, reduce=True): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + lprobs = lprobs.view(-1, lprobs.size(-1)) + target = model.get_targets(sample, net_output).view(-1) + loss = F.nll_loss( + lprobs, + target, + ignore_index=self.padding_idx, + reduction="sum" if reduce else "none", + ) + return loss, loss + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + # we divide by log(2) to convert the loss from base e to base 2 + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/ctc.py b/SpeechT5/fairseq/fairseq/criterions/ctc.py new file mode 100644 index 0000000..10e3618 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/ctc.py @@ -0,0 +1,295 @@ +# All rights reserved. +# +# This source code is licensed under the license found in the LICENSE file in +# the root directory of this source tree. An additional grant of patent rights +# can be found in the PATENTS file in the same directory. + +import math +from argparse import Namespace +from dataclasses import dataclass, field +from omegaconf import II +from typing import Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from fairseq.data.data_utils import post_process +from fairseq.tasks import FairseqTask +from fairseq.logging.meters import safe_round + + +@dataclass +class CtcCriterionConfig(FairseqDataclass): + zero_infinity: bool = field( + default=False, + metadata={"help": "zero inf loss when source length <= target length"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + post_process: str = field( + default="letter", + metadata={ + "help": "how to post process predictions into words. can be letter, " + "wordpiece, BPE symbols, etc. " + "See fairseq.data.data_utils.post_process() for full list of options" + }, + ) + wer_kenlm_model: Optional[str] = field( + default=None, + metadata={ + "help": "if this is provided, use kenlm to compute wer (along with other wer_* args)" + }, + ) + wer_lexicon: Optional[str] = field( + default=None, + metadata={"help": "lexicon to use with wer_kenlm_model"}, + ) + wer_lm_weight: float = field( + default=2.0, + metadata={"help": "lm weight to use with wer_kenlm_model"}, + ) + wer_word_score: float = field( + default=-1.0, + metadata={"help": "lm word score to use with wer_kenlm_model"}, + ) + + wer_args: Optional[str] = field( + default=None, + metadata={ + "help": "DEPRECATED: tuple of (wer_kenlm_model, wer_lexicon, wer_lm_weight, wer_word_score)" + }, + ) + + +@register_criterion("ctc", dataclass=CtcCriterionConfig) +class CtcCriterion(FairseqCriterion): + def __init__(self, cfg: CtcCriterionConfig, task: FairseqTask): + super().__init__(task) + self.blank_idx = ( + task.target_dictionary.index(task.blank_symbol) + if hasattr(task, "blank_symbol") + else 0 + ) + self.pad_idx = task.target_dictionary.pad() + self.eos_idx = task.target_dictionary.eos() + self.post_process = cfg.post_process + + if cfg.wer_args is not None: + ( + cfg.wer_kenlm_model, + cfg.wer_lexicon, + cfg.wer_lm_weight, + cfg.wer_word_score, + ) = eval(cfg.wer_args) + + if cfg.wer_kenlm_model is not None: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + dec_args = Namespace() + dec_args.nbest = 1 + dec_args.criterion = "ctc" + dec_args.kenlm_model = cfg.wer_kenlm_model + dec_args.lexicon = cfg.wer_lexicon + dec_args.beam = 50 + dec_args.beam_size_token = min(50, len(task.target_dictionary)) + dec_args.beam_threshold = min(50, len(task.target_dictionary)) + dec_args.lm_weight = cfg.wer_lm_weight + dec_args.word_score = cfg.wer_word_score + dec_args.unk_weight = -math.inf + dec_args.sil_weight = 0 + + self.w2l_decoder = W2lKenLMDecoder(dec_args, task.target_dictionary) + else: + self.w2l_decoder = None + + self.zero_infinity = cfg.zero_infinity + self.sentence_avg = cfg.sentence_avg + + def forward(self, model, sample, reduce=True): + net_output = model(**sample["net_input"]) + lprobs = model.get_normalized_probs( + net_output, log_probs=True + ).contiguous() # (T, B, C) from the encoder + + if "src_lengths" in sample["net_input"]: + input_lengths = sample["net_input"]["src_lengths"] + else: + if net_output["padding_mask"] is not None: + non_padding_mask = ~net_output["padding_mask"] + input_lengths = non_padding_mask.long().sum(-1) + else: + input_lengths = lprobs.new_full( + (lprobs.size(1),), lprobs.size(0), dtype=torch.long + ) + + pad_mask = (sample["target"] != self.pad_idx) & ( + sample["target"] != self.eos_idx + ) + targets_flat = sample["target"].masked_select(pad_mask) + if "target_lengths" in sample: + target_lengths = sample["target_lengths"] + else: + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction="sum", + zero_infinity=self.zero_infinity, + ) + + ntokens = ( + sample["ntokens"] if "ntokens" in sample else target_lengths.sum().item() + ) + + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + logging_output = { + "loss": utils.item(loss.data), # * sample['ntokens'], + "ntokens": ntokens, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + } + + if not model.training: + import editdistance + + with torch.no_grad(): + lprobs_t = lprobs.transpose(0, 1).float().contiguous().cpu() + + c_err = 0 + c_len = 0 + w_errs = 0 + w_len = 0 + wv_errs = 0 + for lp, t, inp_l in zip( + lprobs_t, + sample["target_label"] + if "target_label" in sample + else sample["target"], + input_lengths, + ): + lp = lp[:inp_l].unsqueeze(0) + + decoded = None + if self.w2l_decoder is not None: + decoded = self.w2l_decoder.decode(lp) + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + + p = (t != self.task.target_dictionary.pad()) & ( + t != self.task.target_dictionary.eos() + ) + targ = t[p] + targ_units = self.task.target_dictionary.string(targ) + targ_units_arr = targ.tolist() + + toks = lp.argmax(dim=-1).unique_consecutive() + pred_units_arr = toks[toks != self.blank_idx].tolist() + + c_err += editdistance.eval(pred_units_arr, targ_units_arr) + c_len += len(targ_units_arr) + + targ_words = post_process(targ_units, self.post_process).split() + + pred_units = self.task.target_dictionary.string(pred_units_arr) + pred_words_raw = post_process(pred_units, self.post_process).split() + + if decoded is not None and "words" in decoded: + pred_words = decoded["words"] + w_errs += editdistance.eval(pred_words, targ_words) + wv_errs += editdistance.eval(pred_words_raw, targ_words) + else: + dist = editdistance.eval(pred_words_raw, targ_words) + w_errs += dist + wv_errs += dist + + w_len += len(targ_words) + + logging_output["wv_errors"] = wv_errs + logging_output["w_errors"] = w_errs + logging_output["w_total"] = w_len + logging_output["c_errors"] = c_err + logging_output["c_total"] = c_len + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + c_errors = sum(log.get("c_errors", 0) for log in logging_outputs) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in logging_outputs) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in logging_outputs) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in logging_outputs) + metrics.log_scalar("_w_total", w_total) + + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/fairseq_criterion.py b/SpeechT5/fairseq/fairseq/criterions/fairseq_criterion.py new file mode 100644 index 0000000..ff4beb0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/fairseq_criterion.py @@ -0,0 +1,120 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import inspect +from typing import Any, Dict, List + +from fairseq import metrics, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import gen_parser_from_dataclass +from torch.nn.modules.loss import _Loss + + +class FairseqCriterion(_Loss): + def __init__(self, task): + super().__init__() + self.task = task + if hasattr(task, "target_dictionary"): + tgt_dict = task.target_dictionary + self.padding_idx = tgt_dict.pad() if tgt_dict is not None else -100 + + @classmethod + def add_args(cls, parser): + """Add criterion-specific arguments to the parser.""" + dc = getattr(cls, "__dataclass", None) + if dc is not None: + gen_parser_from_dataclass(parser, dc()) + + @classmethod + def build_criterion(cls, cfg: FairseqDataclass, task): + """Construct a criterion from command-line args.""" + # arguments in the __init__. + init_args = {} + for p in inspect.signature(cls).parameters.values(): + if ( + p.kind == p.POSITIONAL_ONLY + or p.kind == p.VAR_POSITIONAL + or p.kind == p.VAR_KEYWORD + ): + # we haven't implemented inference for these argument types, + # but PRs welcome :) + raise NotImplementedError("{} not supported".format(p.kind)) + + assert p.kind in {p.POSITIONAL_OR_KEYWORD, p.KEYWORD_ONLY} + + if p.name == "task": + init_args["task"] = task + elif p.name == "cfg": + init_args["cfg"] = cfg + elif hasattr(cfg, p.name): + init_args[p.name] = getattr(cfg, p.name) + elif p.default != p.empty: + pass # we'll use the default value + else: + raise NotImplementedError( + "Unable to infer Criterion arguments, please implement " + "{}.build_criterion".format(cls.__name__) + ) + return cls(**init_args) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + raise NotImplementedError + + @staticmethod + def aggregate_logging_outputs( + logging_outputs: List[Dict[str, Any]] + ) -> Dict[str, Any]: + """Aggregate logging outputs from data parallel training.""" + utils.deprecation_warning( + "The aggregate_logging_outputs API is deprecated. " + "Please use the reduce_metrics API instead." + ) + raise NotImplementedError + + @classmethod + def reduce_metrics(cls, logging_outputs: List[Dict[str, Any]]) -> None: + """Aggregate logging outputs from data parallel training.""" + utils.deprecation_warning( + "Criterions should implement the reduce_metrics API. " + "Falling back to deprecated aggregate_logging_outputs API." + ) + agg_logging_outputs = cls.aggregate_logging_outputs(logging_outputs) + for k, v in agg_logging_outputs.items(): + if k in {"nsentences", "ntokens", "sample_size"}: + continue + metrics.log_scalar(k, v) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False + + +class LegacyFairseqCriterion(FairseqCriterion): + def __init__(self, args, task): + super().__init__(task=task) + self.args = args + + utils.deprecation_warning( + "Criterions should take explicit arguments instead of an " + "argparse.Namespace object, please update your criterion by " + "extending FairseqCriterion instead of LegacyFairseqCriterion." + ) + + @classmethod + def build_criterion(cls, args, task): + """Construct a criterion from command-line args.""" + return cls(args, task) diff --git a/SpeechT5/fairseq/fairseq/criterions/hubert_criterion.py b/SpeechT5/fairseq/fairseq/criterions/hubert_criterion.py new file mode 100644 index 0000000..68cb24e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/hubert_criterion.py @@ -0,0 +1,177 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class HubertCriterionConfig(FairseqDataclass): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + + +@register_criterion("hubert", dataclass=HubertCriterionConfig) +class HubertCriterion(FairseqCriterion): + def __init__(self, task, pred_masked_weight, pred_nomask_weight, loss_weights=None, log_keys=None): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(target_list=sample["target_list"], **sample["net_input"]) + loss = 0. + sample_size = 0 + logging_output = {} + reduction = "sum" if reduce else "none" + + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_{i}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() + + logging_output = { + "loss": loss.item() if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + **logging_output, + } + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + def compute_correct(logits): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == 0 + min = logits.argmin(-1) == 0 + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + corr_m, count_m = compute_correct(logp_m) + logging_output[f"correct_m_{i}"] = corr_m + logging_output[f"count_m_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + corr_u, count_u = compute_correct(logp_u) + logging_output[f"correct_u_{i}"] = corr_u + logging_output[f"count_u_{i}"] = count_u + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar("loss", loss_sum / sample_size / math.log(2), sample_size, round=3) + if sample_size != ntokens: + metrics.log_scalar("nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3) + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg)) + else: + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["loss"].avg)) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy.py b/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy.py new file mode 100644 index 0000000..56d63e3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy.py @@ -0,0 +1,170 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass, field + +import torch +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from omegaconf import II + + +@dataclass +class LabelSmoothedCrossEntropyCriterionConfig(FairseqDataclass): + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + report_accuracy: bool = field( + default=False, + metadata={"help": "report accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + + +def label_smoothed_nll_loss(lprobs, target, epsilon, ignore_index=None, reduce=True): + if target.dim() == lprobs.dim() - 1: + target = target.unsqueeze(-1) + nll_loss = -lprobs.gather(dim=-1, index=target) + smooth_loss = -lprobs.sum(dim=-1, keepdim=True) + if ignore_index is not None: + pad_mask = target.eq(ignore_index) + nll_loss.masked_fill_(pad_mask, 0.0) + smooth_loss.masked_fill_(pad_mask, 0.0) + else: + nll_loss = nll_loss.squeeze(-1) + smooth_loss = smooth_loss.squeeze(-1) + if reduce: + nll_loss = nll_loss.sum() + smooth_loss = smooth_loss.sum() + eps_i = epsilon / (lprobs.size(-1) - 1) + loss = (1.0 - epsilon - eps_i) * nll_loss + eps_i * smooth_loss + return loss, nll_loss + + +@register_criterion( + "label_smoothed_cross_entropy", dataclass=LabelSmoothedCrossEntropyCriterionConfig +) +class LabelSmoothedCrossEntropyCriterion(FairseqCriterion): + def __init__( + self, + task, + sentence_avg, + label_smoothing, + ignore_prefix_size=0, + report_accuracy=False, + ): + super().__init__(task) + self.sentence_avg = sentence_avg + self.eps = label_smoothing + self.ignore_prefix_size = ignore_prefix_size + self.report_accuracy = report_accuracy + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(**sample["net_input"]) + loss, nll_loss = self.compute_loss(model, net_output, sample, reduce=reduce) + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + logging_output = { + "loss": loss.data, + "nll_loss": nll_loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output, sample) + logging_output["n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + return loss, sample_size, logging_output + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = model.get_targets(sample, net_output) + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + def compute_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + @classmethod + def reduce_metrics(cls, logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + nll_loss_sum = sum(log.get("nll_loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "nll_loss", nll_loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("n_correct", n_correct) + metrics.log_derived( + "accuracy", + lambda meters: round( + meters["n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_latency_augmented.py b/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_latency_augmented.py new file mode 100644 index 0000000..0517852 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_latency_augmented.py @@ -0,0 +1,108 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.criterions import register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import ( + LabelSmoothedCrossEntropyCriterion, +) + + +@register_criterion("latency_augmented_label_smoothed_cross_entropy") +class LatencyAugmentedLabelSmoothedCrossEntropyCriterion( + LabelSmoothedCrossEntropyCriterion +): + def __init__( + self, + task, + sentence_avg, + label_smoothing, + ignore_prefix_size, + report_accuracy, + latency_weight_avg, + latency_weight_avg_type, + latency_weight_var, + latency_weight_var_type, + mass_preservation, + average_method, + ): + super().__init__( + task, sentence_avg, label_smoothing, ignore_prefix_size, report_accuracy + ) + from examples.simultaneous_translation.utils.latency import LatencyTraining + self.eps = label_smoothing + self.latency_weight_avg = latency_weight_avg + self.latency_weight_avg_type = latency_weight_avg_type + self.latency_weight_var = latency_weight_var + self.latency_weight_var_type = latency_weight_var_type + self.mass_preservation = mass_preservation + self.average_method = average_method + self.latency_train = LatencyTraining( + self.latency_weight_avg, + self.latency_weight_var, + self.latency_weight_avg_type, + self.latency_weight_var_type, + self.mass_preservation, + self.average_method, + ) + + @staticmethod + def add_args(parser): + super( + LatencyAugmentedLabelSmoothedCrossEntropyCriterion, + LatencyAugmentedLabelSmoothedCrossEntropyCriterion, + ).add_args(parser) + # fmt: off + + """Add criterion-specific arguments to the parser.""" + parser.add_argument( + "--label-smoothing", + default=0.0, + type=float, + metavar="D", + help="epsilon for label smoothing, 0 means no label smoothing", + ) + parser.add_argument( + "--ignore_prefix_size", + default=0, + type=int, + help="ignore first N tokens", + ) + parser.add_argument( + "--report-accuracy", + default=False, + type=bool, + help="report accuracy metric", + ) + parser.add_argument("--latency-weight-avg", default=0., type=float, metavar='D', + help="Average loss weight") + parser.add_argument("--latency-weight-var", default=0., type=float, metavar='D', + help="Variance loss weight") + parser.add_argument("--latency-weight-avg-type", default="differentiable_average_lagging", + help="Statistics for Average loss type") + parser.add_argument("--latency-weight-var-type", default="variance_delay", + help="Statistics for variance loss type") + parser.add_argument("--average-method", default="weighted_average", + help="Average loss type") + # fmt: on + + def compute_loss(self, model, net_output, sample, reduce=True): + # Compute cross entropy loss first + loss, nll_loss = super().compute_loss(model, net_output, sample, reduce) + + # Obtain the expected alignment + attn_list = [item["alpha"] for item in net_output[-1]["attn_list"]] + + target_padding_mask = model.get_targets(sample, net_output).eq(self.padding_idx) + + source_padding_mask = net_output[-1].get("encoder_padding_mask", None) + + # Get latency loss + latency_loss = self.latency_train.loss( + attn_list, source_padding_mask, target_padding_mask + ) + + loss += latency_loss + + return loss, nll_loss diff --git a/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_with_alignment.py b/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_with_alignment.py new file mode 100644 index 0000000..73cfa05 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/label_smoothed_cross_entropy_with_alignment.py @@ -0,0 +1,125 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +from fairseq import metrics, utils +from fairseq.criterions import register_criterion + +from .label_smoothed_cross_entropy import LabelSmoothedCrossEntropyCriterion + + +@register_criterion("label_smoothed_cross_entropy_with_alignment") +class LabelSmoothedCrossEntropyCriterionWithAlignment( + LabelSmoothedCrossEntropyCriterion +): + def __init__(self, task, sentence_avg, label_smoothing, alignment_lambda): + super().__init__(task, sentence_avg, label_smoothing) + self.alignment_lambda = alignment_lambda + + @staticmethod + def add_args(parser): + """Add criterion-specific arguments to the parser.""" + LabelSmoothedCrossEntropyCriterion.add_args(parser) + parser.add_argument( + "--alignment-lambda", + default=0.05, + type=float, + metavar="D", + help="weight for the alignment loss", + ) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(**sample["net_input"]) + loss, nll_loss = self.compute_loss(model, net_output, sample, reduce=reduce) + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + logging_output = { + "loss": utils.item(loss.data) if reduce else loss.data, + "nll_loss": utils.item(nll_loss.data) if reduce else nll_loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + + alignment_loss = None + + # Compute alignment loss only for training set and non dummy batches. + if "alignments" in sample and sample["alignments"] is not None: + alignment_loss = self.compute_alignment_loss(sample, net_output) + + if alignment_loss is not None: + logging_output["alignment_loss"] = utils.item(alignment_loss.data) + loss += self.alignment_lambda * alignment_loss + + return loss, sample_size, logging_output + + def compute_alignment_loss(self, sample, net_output): + attn_prob = net_output[1]["attn"][0] + bsz, tgt_sz, src_sz = attn_prob.shape + attn = attn_prob.view(bsz * tgt_sz, src_sz) + + align = sample["alignments"] + align_weights = sample["align_weights"].float() + + if len(align) > 0: + # Alignment loss computation. align (shape [:, 2]) contains the src-tgt index pairs corresponding to + # the alignments. align_weights (shape [:]) contains the 1 / frequency of a tgt index for normalizing. + loss = -( + (attn[align[:, 1][:, None], align[:, 0][:, None]]).log() + * align_weights[:, None] + ).sum() + else: + return None + + return loss + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + nll_loss_sum = utils.item( + sum(log.get("nll_loss", 0) for log in logging_outputs) + ) + alignment_loss_sum = utils.item( + sum(log.get("alignment_loss", 0) for log in logging_outputs) + ) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "nll_loss", nll_loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_scalar( + "alignment_loss", + alignment_loss_sum / sample_size / math.log(2), + sample_size, + round=3, + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/legacy_masked_lm.py b/SpeechT5/fairseq/fairseq/criterions/legacy_masked_lm.py new file mode 100644 index 0000000..c70608c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/legacy_masked_lm.py @@ -0,0 +1,177 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +def compute_cross_entropy_loss(logits, targets, ignore_index=-100): + """ + Function to compute the cross entropy loss. The default value of + ignore_index is the same as the default value for F.cross_entropy in + pytorch. + """ + assert logits.size(0) == targets.size( + -1 + ), "Logits and Targets tensor shapes don't match up" + + loss = F.nll_loss( + F.log_softmax(logits, -1, dtype=torch.float32), + targets, + reduction="sum", + ignore_index=ignore_index, + ) + return loss + + +@register_criterion("legacy_masked_lm_loss") +class LegacyMaskedLmLoss(FairseqCriterion): + """ + Implementation for the loss used in masked language model (MLM) training. + This optionally also computes the next sentence prediction (NSP) loss and + adds it to the overall loss based on the specified args. There are three + cases to consider: + 1) Generic MLM training without NSP loss. In this case sentence_targets + and sentence_logits are both None. + 2) BERT training without NSP loss. In this case sentence_targets is + not None but sentence_logits is None and we should not be computing + a sentence level loss. + 3) BERT training with NSP loss. In this case both sentence_targets and + sentence_logits are not None and we should be computing a sentence + level loss. The weight of the sentence level loss is specified as + an argument. + """ + + def __init__(self, task, masked_lm_only, nsp_loss_weight): + super().__init__(task) + self.masked_lm_only = masked_lm_only + self.nsp_loss_weight = nsp_loss_weight + + @staticmethod + def add_args(parser): + """Args for MaskedLM Loss""" + # Default for masked_lm_only is False so as to not break BERT training + parser.add_argument( + "--masked-lm-only", + default=False, + action="store_true", + help="compute MLM loss only", + ) + parser.add_argument( + "--nsp-loss-weight", + default=1.0, + type=float, + help="weight for next sentence prediction" " loss (default 1)", + ) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + lm_logits, output_metadata = model(**sample["net_input"]) + + # reshape lm_logits from (N,T,C) to (N*T,C) + lm_logits = lm_logits.view(-1, lm_logits.size(-1)) + lm_targets = sample["lm_target"].view(-1) + lm_loss = compute_cross_entropy_loss(lm_logits, lm_targets, self.padding_idx) + + # compute the number of tokens for which loss is computed. This is used + # to normalize the loss + ntokens = utils.strip_pad(lm_targets, self.padding_idx).numel() + loss = lm_loss / ntokens + nsentences = sample["nsentences"] + # nsentences = 0 + + # Compute sentence loss if masked_lm_only is False + sentence_loss = None + if not self.masked_lm_only: + sentence_logits = output_metadata["sentence_logits"] + sentence_targets = sample["sentence_target"].view(-1) + # This needs to be recomputed due to some differences between + # TokenBlock and BlockPair dataset. This can be resolved with a + # refactor of BERTModel which we will do in the future. + # TODO: Remove this after refactor of BERTModel + nsentences = sentence_targets.size(0) + + # Check for logits being none which can happen when remove_heads + # is set to true in the BERT model. Ideally we should set + # masked_lm_only to true in this case, but that requires some + # refactor in the BERT model. + if sentence_logits is not None: + sentence_loss = compute_cross_entropy_loss( + sentence_logits, sentence_targets + ) + + loss += self.nsp_loss_weight * (sentence_loss / nsentences) + + # NOTE: as we are summing up per token mlm loss and per sentence nsp loss + # we don't need to use sample_size as denominator for the gradient + # here sample_size is just used for logging + sample_size = 1 + logging_output = { + "loss": utils.item(loss.data) if reduce else loss.data, + "lm_loss": utils.item(lm_loss.data) if reduce else lm_loss.data, + # sentence loss is not always computed + "sentence_loss": ( + (utils.item(sentence_loss.data) if reduce else sentence_loss.data) + if sentence_loss is not None + else 0.0 + ), + "ntokens": ntokens, + "nsentences": nsentences, + "sample_size": sample_size, + } + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + lm_loss_sum = sum(log.get("lm_loss", 0) for log in logging_outputs) + sentence_loss_sum = sum(log.get("sentence_loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + agg_loss = sum(log.get("loss", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", + agg_loss / sample_size / math.log(2) if sample_size > 0 else 0.0, + sample_size, + round=3, + ) + metrics.log_scalar( + "lm_loss", + lm_loss_sum / ntokens / math.log(2) if ntokens > 0 else 0.0, + ntokens, + round=3, + ) + metrics.log_scalar( + "sentence_loss", + sentence_loss_sum / nsentences / math.log(2) if nsentences > 0 else 0.0, + nsentences, + round=3, + ) + metrics.log_scalar( + "nll_loss", + lm_loss_sum / ntokens / math.log(2) if ntokens > 0 else 0.0, + ntokens, + round=3, + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/masked_lm.py b/SpeechT5/fairseq/fairseq/criterions/masked_lm.py new file mode 100644 index 0000000..b04cfbf --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/masked_lm.py @@ -0,0 +1,91 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import metrics, modules, utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +@register_criterion("masked_lm") +class MaskedLmLoss(FairseqCriterion): + """ + Implementation for the loss used in masked language model (MLM) training. + """ + + def __init__(self, task, tpu=False): + super().__init__(task) + self.tpu = tpu + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + masked_tokens = sample["target"].ne(self.padding_idx) + sample_size = masked_tokens.int().sum() + + # Rare: when all tokens are masked, project all tokens. + # We use torch.where to avoid device-to-host transfers, + # except on CPU where torch.where is not well supported + # (see github.com/pytorch/pytorch/issues/26247). + if self.tpu: + masked_tokens = None # always project all tokens on TPU + elif masked_tokens.device == torch.device("cpu"): + if not masked_tokens.any(): + masked_tokens = None + else: + masked_tokens = torch.where( + masked_tokens.any(), + masked_tokens, + masked_tokens.new([True]), + ) + + logits = model(**sample["net_input"], masked_tokens=masked_tokens)[0] + targets = model.get_targets(sample, [logits]) + if masked_tokens is not None: + targets = targets[masked_tokens] + + loss = modules.cross_entropy( + logits.view(-1, logits.size(-1)), + targets.view(-1), + reduction="sum", + ignore_index=self.padding_idx, + ) + + logging_output = { + "loss": loss if self.tpu else loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["nsentences"], + "sample_size": sample_size, + } + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/model_criterion.py b/SpeechT5/fairseq/fairseq/criterions/model_criterion.py new file mode 100644 index 0000000..30350f1 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/model_criterion.py @@ -0,0 +1,138 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from dataclasses import dataclass, field +from typing import Dict, List + +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass + + +logger = logging.getLogger(__name__) + + +@dataclass +class ModelCriterionConfig(FairseqDataclass): + loss_weights: Dict[str, float] = field( + default_factory=dict, + metadata={"help": "weights for the loss terms"}, + ) + log_keys: List[str] = field( + default_factory=list, + metadata={"help": "additional output keys to log"}, + ) + + +@register_criterion("model", dataclass=ModelCriterionConfig) +class ModelCriterion(FairseqCriterion): + """ + This criterion relies on the model to supply losses. + The losses should be a dictionary of name -> scalar returned by + the model either by including it in the net_output dict or by + implementing a get_losses(net_output, sample) method. The final loss is + a scaled sum of all losses according to weights in loss_weights. + If no weights are provided, then all losses are scaled by 1.0. + + The losses will be automatically logged. Additional keys from + net_output dict can be logged via the log_keys parameter. + """ + + def __init__(self, task, loss_weights=None, log_keys=None): + super().__init__(task) + self.loss_weights = loss_weights + self.log_keys = log_keys + + def forward(self, model, sample, reduce=True): + net_output = model(**sample["net_input"]) + + sample_size = net_output["sample_size"] + scaled_losses = {} + + if hasattr(model, "get_losses"): + losses = model.get_losses(net_output, sample) + elif isinstance(net_output, dict) and "losses" in net_output: + losses = net_output["losses"] + else: + raise Exception("Could not retrieve losses") + + for lk, p in losses.items(): + try: + coef = 1.0 if len(self.loss_weights) == 0 else self.loss_weights[lk] + except KeyError: + logger.error( + f"weight for loss {lk} is not in loss_weights ({self.loss_weights})" + ) + raise + if coef != 0 and p is not None: + scaled_losses[lk] = coef * p.float() + + loss = sum(scaled_losses.values()) + if reduce and loss.numel() > 1: + loss = loss.sum() + + logging_output = { + "loss": loss.data, + "ntokens": sample_size, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + "_world_size": 1, + } + + for lk in self.log_keys: + if lk in net_output and net_output[lk] is not None: + logging_output[lk] = float(net_output[lk]) + + if len(scaled_losses) > 1: + for lk, l in scaled_losses.items(): + logging_output[f"loss_{lk}"] = l.item() + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar("loss", loss_sum / sample_size, sample_size, round=3) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + + builtin_keys = { + "loss", + "ntokens", + "nsentences", + "sample_size", + "_world_size", + } + + world_size = utils.item( + sum(log.get("_world_size", 0) for log in logging_outputs) + ) + + for k in logging_outputs[0]: + if k not in builtin_keys: + val = sum(log.get(k, 0) for log in logging_outputs) + if k.startswith("loss_"): + metrics.log_scalar(k, val / sample_size, sample_size, round=3) + else: + metrics.log_scalar(k, val / world_size, round=3) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/nat_loss.py b/SpeechT5/fairseq/fairseq/criterions/nat_loss.py new file mode 100644 index 0000000..cdc7da8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/nat_loss.py @@ -0,0 +1,180 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from torch import Tensor + + +@register_criterion("nat_loss") +class LabelSmoothedDualImitationCriterion(FairseqCriterion): + def __init__(self, task, label_smoothing): + super().__init__(task) + self.label_smoothing = label_smoothing + + @staticmethod + def add_args(parser): + """Add criterion-specific arguments to the parser.""" + parser.add_argument( + "--label-smoothing", + default=0.0, + type=float, + metavar="D", + help="epsilon for label smoothing, 0 means no label smoothing", + ) + + def _compute_loss( + self, outputs, targets, masks=None, label_smoothing=0.0, name="loss", factor=1.0 + ): + """ + outputs: batch x len x d_model + targets: batch x len + masks: batch x len + + policy_logprob: if there is some policy + depends on the likelihood score as rewards. + """ + + def mean_ds(x: Tensor, dim=None) -> Tensor: + return ( + x.float().mean().type_as(x) + if dim is None + else x.float().mean(dim).type_as(x) + ) + + if masks is not None: + outputs, targets = outputs[masks], targets[masks] + + if masks is not None and not masks.any(): + nll_loss = torch.tensor(0) + loss = nll_loss + else: + logits = F.log_softmax(outputs, dim=-1) + if targets.dim() == 1: + losses = F.nll_loss(logits, targets.to(logits.device), reduction="none") + + else: # soft-labels + losses = F.kl_div(logits, targets.to(logits.device), reduction="none") + losses = losses.sum(-1) + + nll_loss = mean_ds(losses) + if label_smoothing > 0: + loss = ( + nll_loss * (1 - label_smoothing) - mean_ds(logits) * label_smoothing + ) + else: + loss = nll_loss + + loss = loss * factor + return {"name": name, "loss": loss, "nll_loss": nll_loss, "factor": factor} + + def _custom_loss(self, loss, name="loss", factor=1.0): + return {"name": name, "loss": loss, "factor": factor} + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + nsentences, ntokens = sample["nsentences"], sample["ntokens"] + + # B x T + src_tokens, src_lengths = ( + sample["net_input"]["src_tokens"], + sample["net_input"]["src_lengths"], + ) + tgt_tokens, prev_output_tokens = sample["target"], sample["prev_target"] + + outputs = model(src_tokens, src_lengths, prev_output_tokens, tgt_tokens) + losses, nll_loss = [], [] + + for obj in outputs: + if outputs[obj].get("loss", None) is None: + _losses = self._compute_loss( + outputs[obj].get("out"), + outputs[obj].get("tgt"), + outputs[obj].get("mask", None), + outputs[obj].get("ls", 0.0), + name=obj + "-loss", + factor=outputs[obj].get("factor", 1.0), + ) + else: + _losses = self._custom_loss( + outputs[obj].get("loss"), + name=obj + "-loss", + factor=outputs[obj].get("factor", 1.0), + ) + + losses += [_losses] + if outputs[obj].get("nll_loss", False): + nll_loss += [_losses.get("nll_loss", 0.0)] + + loss = sum(l["loss"] for l in losses) + nll_loss = sum(l for l in nll_loss) if len(nll_loss) > 0 else loss.new_tensor(0) + + # NOTE: + # we don't need to use sample_size as denominator for the gradient + # here sample_size is just used for logging + sample_size = 1 + logging_output = { + "loss": loss.data, + "nll_loss": nll_loss.data, + "ntokens": ntokens, + "nsentences": nsentences, + "sample_size": sample_size, + } + + for l in losses: + logging_output[l["name"]] = ( + utils.item(l["loss"].data / l["factor"]) + if reduce + else l[["loss"]].data / l["factor"] + ) + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + loss = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + nll_loss = utils.item(sum(log.get("nll_loss", 0) for log in logging_outputs)) + + metrics.log_scalar( + "loss", loss / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "nll_loss", nll_loss / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + for key in logging_outputs[0]: + if key[-5:] == "-loss": + val = sum(log.get(key, 0) for log in logging_outputs) + metrics.log_scalar( + key[:-5], + val / sample_size / math.log(2) if sample_size > 0 else 0.0, + sample_size, + round=3, + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/sentence_prediction.py b/SpeechT5/fairseq/fairseq/criterions/sentence_prediction.py new file mode 100644 index 0000000..9519fdc --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/sentence_prediction.py @@ -0,0 +1,99 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +@register_criterion("sentence_prediction") +class SentencePredictionCriterion(FairseqCriterion): + def __init__(self, task, classification_head_name, regression_target): + super().__init__(task) + self.classification_head_name = classification_head_name + self.regression_target = regression_target + + @staticmethod + def add_args(parser): + # fmt: off + parser.add_argument('--classification-head-name', + default='sentence_classification_head', + help='name of the classification head to use') + # fmt: on + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + assert ( + hasattr(model, "classification_heads") + and self.classification_head_name in model.classification_heads + ), "model must provide sentence classification head for --criterion=sentence_prediction" + + logits, _ = model( + **sample["net_input"], + features_only=True, + classification_head_name=self.classification_head_name, + ) + targets = model.get_targets(sample, [logits]).view(-1) + sample_size = targets.numel() + + if not self.regression_target: + lprobs = F.log_softmax(logits, dim=-1, dtype=torch.float32) + loss = F.nll_loss(lprobs, targets, reduction="sum") + else: + logits = logits.view(-1).float() + targets = targets.float() + loss = F.mse_loss(logits, targets, reduction="sum") + + logging_output = { + "loss": loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample_size, + "sample_size": sample_size, + } + if not self.regression_target: + preds = logits.argmax(dim=1) + logging_output["ncorrect"] = (preds == targets).sum() + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + if len(logging_outputs) > 0 and "ncorrect" in logging_outputs[0]: + ncorrect = sum(log.get("ncorrect", 0) for log in logging_outputs) + metrics.log_scalar( + "accuracy", 100.0 * ncorrect / nsentences, nsentences, round=1 + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/sentence_ranking.py b/SpeechT5/fairseq/fairseq/criterions/sentence_ranking.py new file mode 100644 index 0000000..d4c7634 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/sentence_ranking.py @@ -0,0 +1,120 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +@register_criterion("sentence_ranking") +class SentenceRankingCriterion(FairseqCriterion): + def __init__(self, task, ranking_head_name, save_predictions, num_classes): + super().__init__(task) + self.ranking_head_name = ranking_head_name + if save_predictions is not None: + self.prediction_h = open(save_predictions, "w") + else: + self.prediction_h = None + self.num_classes = num_classes + + def __del__(self): + if self.prediction_h is not None: + self.prediction_h.close() + + @staticmethod + def add_args(parser): + # fmt: off + parser.add_argument('--save-predictions', metavar='FILE', + help='file to save predictions to') + parser.add_argument('--ranking-head-name', + default='sentence_classification_head', + help='name of the ranking head to use') + # fmt: on + + def forward(self, model, sample, reduce=True): + """Compute ranking loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + assert ( + hasattr(model, "classification_heads") + and self.ranking_head_name in model.classification_heads + ), "model must provide sentence ranking head for --criterion=sentence_ranking" + + scores = [] + for idx in range(self.num_classes): + score, _ = model( + **sample["net_input{idx}".format(idx=idx + 1)], + classification_head_name=self.ranking_head_name, + ) + scores.append(score) + + logits = torch.cat(scores, dim=1) + sample_size = logits.size(0) + + if "target" in sample: + targets = model.get_targets(sample, [logits]).view(-1) + lprobs = F.log_softmax(logits, dim=-1, dtype=torch.float32) + loss = F.nll_loss(lprobs, targets, reduction="sum") + else: + targets = None + loss = torch.tensor(0.0, requires_grad=True) + + if self.prediction_h is not None: + preds = logits.argmax(dim=1) + for i, (id, pred) in enumerate(zip(sample["id"].tolist(), preds.tolist())): + if targets is not None: + label = targets[i].item() + print("{}\t{}\t{}".format(id, pred, label), file=self.prediction_h) + else: + print("{}\t{}".format(id, pred), file=self.prediction_h) + + logging_output = { + "loss": loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample_size, + "sample_size": sample_size, + } + if targets is not None: + logging_output["ncorrect"] = (logits.argmax(dim=1) == targets).sum() + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + if len(logging_outputs) > 0 and "ncorrect" in logging_outputs[0]: + ncorrect = sum(log.get("ncorrect", 0) for log in logging_outputs) + metrics.log_scalar( + "accuracy", 100.0 * ncorrect / nsentences, nsentences, round=1 + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/criterions/wav2vec_criterion.py b/SpeechT5/fairseq/fairseq/criterions/wav2vec_criterion.py new file mode 100644 index 0000000..e04786c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/criterions/wav2vec_criterion.py @@ -0,0 +1,229 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass, field +from typing import List, Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from fairseq.logging.meters import safe_round +from fairseq.utils import is_xla_tensor + + +@dataclass +class Wav2VecCriterionConfig(FairseqDataclass): + infonce: bool = field( + default=False, + metadata={ + "help": "if set, uses cross entropy instead of binary cross entropy (i.e. InfoNCE loss)" + }, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + +@register_criterion("wav2vec", dataclass=Wav2VecCriterionConfig) +class Wav2vecCriterion(FairseqCriterion): + def __init__(self, task, infonce=False, loss_weights=None, log_keys=None): + super().__init__(task) + self.infonce = infonce + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(**sample["net_input"]) + logits = model.get_logits(net_output).float() + target = model.get_targets(sample, net_output) + self.xla = is_xla_tensor(logits) + + # XXX: handle weights on xla. + weights = None + if hasattr(model, "get_target_weights") and not self.infonce: + weights = model.get_target_weights(target, net_output) + if torch.is_tensor(weights): + weights = weights.float() + + losses = [] + + reduction = "none" if ((not reduce) or self.xla) else "sum" + if self.infonce: + loss = F.cross_entropy(logits, target, reduction=reduction) + else: + loss = F.binary_cross_entropy_with_logits( + logits, target.float(), weights, reduction=reduction + ) + + if self.xla: + # tpu-comment: since dynamic shapes lead to recompilations on xla, + # we don't shrink tensors using mask_indices. + # Instead, we use mask indices to adjust loss. + mi = ( + sample['net_input']['mask_indices'] + .transpose(0, 1) # logits are transposed in `model.get_logits` + .reshape(logits.size(0)) + ) + loss = (loss * mi).sum() if reduce else (loss * mi) + + if 'sample_size' in sample: + sample_size = sample['sample_size'] + elif 'mask_indices' in sample['net_input']: + sample_size = sample['net_input']['mask_indices'].sum() + else: + sample_size = target.numel() if self.infonce else target.long().sum().item() + losses.append(loss.detach().clone()) + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len( + self.loss_weights + ), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, coef in zip(extra_losses, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + losses.append(p) + + logging_output = { + "loss": loss.item() if (reduce and not self.xla) else loss.detach(), + "ntokens": sample_size, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + } + + for lk in self.log_keys: + # Only store "logits" and "target" for computing MAP and MAUC + # during validation + if lk == "logits": + if not self.training: + logging_output["logits"] = logits.cpu().numpy() + elif lk == "target": + if not self.training: + # If the targets have been mixed with the predictions of + # teacher models, find the original targets + if hasattr(model, "get_original_targets"): + original_target = model.get_original_targets(sample, net_output) + else: + original_target = target + logging_output["target"] = original_target.cpu().numpy() + elif lk in net_output: + value = net_output[lk] + if not is_xla_tensor(value): + value = float(value) + logging_output[lk] = value + + if len(losses) > 1: + for i, l in enumerate(losses): + logging_output[f"loss_{i}"] = l.item() if not self.xla else l.detach() + + if self.infonce: + with torch.no_grad(): + if logits.numel() == 0: + corr = 0 + count = 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == 0 + min = logits.argmin(-1) == 0 + if is_xla_tensor(logits): + max, min = max * mi, min * mi + both = max & min + corr = max.long().sum() - both.long().sum() + count = mi.sum() + else: + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = float(max.numel()) + + logging_output["correct"] = corr + logging_output["count"] = count + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / (sample_size or 1) / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + + correct = sum(log.get("correct", 0) for log in logging_outputs) + metrics.log_scalar("_correct", correct) + + total = sum(log.get("count", 0) for log in logging_outputs) + metrics.log_scalar("_total", total) + + if total > 0: + metrics.log_derived( + "accuracy", + lambda meters: safe_round( + meters["_correct"].sum / meters["_total"].sum, 5 + ) + if meters["_total"].sum > 0 + else float("nan"), + ) + + builtin_keys = { + "loss", + "ntokens", + "nsentences", + "sample_size", + "correct", + "count", + } + + for k in logging_outputs[0]: + if k not in builtin_keys: + val = sum(log.get(k, 0) for log in logging_outputs) + if k.startswith("loss"): + metrics.log_scalar( + k, val / (sample_size or 1) / math.log(2), sample_size, round=3 + ) + else: + metrics.log_scalar(k, val / len(logging_outputs), round=3) + + # FIXME: revert when gather based xla reduction is implemented + #@staticmethod + #def logging_outputs_can_be_summed() -> bool: + def logging_outputs_can_be_summed(self) -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + # XXX: Gather based reduction not implemented for xla yet. + # So we fall to sum based reduction for xla. + return self.xla diff --git a/SpeechT5/fairseq/fairseq/data/__init__.py b/SpeechT5/fairseq/fairseq/data/__init__.py new file mode 100644 index 0000000..8b7eb2e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/__init__.py @@ -0,0 +1,128 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +from .dictionary import Dictionary, TruncatedDictionary + +from .fairseq_dataset import FairseqDataset, FairseqIterableDataset + +from .base_wrapper_dataset import BaseWrapperDataset + +from .add_target_dataset import AddTargetDataset +from .append_token_dataset import AppendTokenDataset +from .audio.raw_audio_dataset import BinarizedAudioDataset, FileAudioDataset +from .audio.hubert_dataset import HubertDataset +from .backtranslation_dataset import BacktranslationDataset +from .bucket_pad_length_dataset import BucketPadLengthDataset +from .colorize_dataset import ColorizeDataset +from .concat_dataset import ConcatDataset +from .concat_sentences_dataset import ConcatSentencesDataset +from .denoising_dataset import DenoisingDataset +from .id_dataset import IdDataset +from .indexed_dataset import ( + IndexedCachedDataset, + IndexedDataset, + IndexedRawTextDataset, + MMapIndexedDataset, +) +from .language_pair_dataset import LanguagePairDataset +from .list_dataset import ListDataset +from .lm_context_window_dataset import LMContextWindowDataset +from .lru_cache_dataset import LRUCacheDataset +from .mask_tokens_dataset import MaskTokensDataset +from .monolingual_dataset import MonolingualDataset +from .multi_corpus_sampled_dataset import MultiCorpusSampledDataset +from .nested_dictionary_dataset import NestedDictionaryDataset +from .noising import NoisingDataset +from .numel_dataset import NumelDataset +from .num_samples_dataset import NumSamplesDataset +from .offset_tokens_dataset import OffsetTokensDataset +from .pad_dataset import LeftPadDataset, PadDataset, RightPadDataset +from .prepend_dataset import PrependDataset +from .prepend_token_dataset import PrependTokenDataset +from .raw_label_dataset import RawLabelDataset +from .replace_dataset import ReplaceDataset +from .resampling_dataset import ResamplingDataset +from .roll_dataset import RollDataset +from .round_robin_zip_datasets import RoundRobinZipDatasets +from .sort_dataset import SortDataset +from .strip_token_dataset import StripTokenDataset +from .subsample_dataset import SubsampleDataset +from .token_block_dataset import TokenBlockDataset +from .transform_eos_dataset import TransformEosDataset +from .transform_eos_lang_pair_dataset import TransformEosLangPairDataset +from .shorten_dataset import TruncateDataset, RandomCropDataset +from .multilingual.sampled_multi_dataset import SampledMultiDataset +from .multilingual.sampled_multi_epoch_dataset import SampledMultiEpochDataset +from .fasta_dataset import FastaDataset, EncodedFastaDataset + +from .iterators import ( + CountingIterator, + EpochBatchIterator, + GroupedIterator, + ShardedIterator, +) + +__all__ = [ + "AddTargetDataset", + "AppendTokenDataset", + "BacktranslationDataset", + "BaseWrapperDataset", + "BinarizedAudioDataset", + "BucketPadLengthDataset", + "ColorizeDataset", + "ConcatDataset", + "ConcatSentencesDataset", + "CountingIterator", + "DenoisingDataset", + "Dictionary", + "EncodedFastaDataset", + "EpochBatchIterator", + "FairseqDataset", + "FairseqIterableDataset", + "FastaDataset", + "FileAudioDataset", + "GroupedIterator", + "HubertDataset", + "IdDataset", + "IndexedCachedDataset", + "IndexedDataset", + "IndexedRawTextDataset", + "LanguagePairDataset", + "LeftPadDataset", + "ListDataset", + "LMContextWindowDataset", + "LRUCacheDataset", + "MaskTokensDataset", + "MMapIndexedDataset", + "MonolingualDataset", + "MultiCorpusSampledDataset", + "NestedDictionaryDataset", + "NoisingDataset", + "NumelDataset", + "NumSamplesDataset", + "OffsetTokensDataset", + "PadDataset", + "PrependDataset", + "PrependTokenDataset", + "RandomCropDataset", + "RawLabelDataset", + "ResamplingDataset", + "ReplaceDataset", + "RightPadDataset", + "RollDataset", + "RoundRobinZipDatasets", + "SampledMultiDataset", + "SampledMultiEpochDataset", + "ShardedIterator", + "SortDataset", + "StripTokenDataset", + "SubsampleDataset", + "TokenBlockDataset", + "TransformEosDataset", + "TransformEosLangPairDataset", + "TruncateDataset", + "TruncatedDictionary", +] diff --git a/SpeechT5/fairseq/fairseq/data/add_target_dataset.py b/SpeechT5/fairseq/fairseq/data/add_target_dataset.py new file mode 100644 index 0000000..9ef4670 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/add_target_dataset.py @@ -0,0 +1,70 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from . import BaseWrapperDataset, data_utils + + +class AddTargetDataset(BaseWrapperDataset): + def __init__( + self, + dataset, + labels, + pad, + eos, + batch_targets, + process_label=None, + add_to_input=False, + ): + super().__init__(dataset) + self.labels = labels + self.batch_targets = batch_targets + self.pad = pad + self.eos = eos + self.process_label = process_label + self.add_to_input = add_to_input + + def get_label(self, index): + return ( + self.labels[index] + if self.process_label is None + else self.process_label(self.labels[index]) + ) + + def __getitem__(self, index): + item = self.dataset[index] + item["label"] = self.get_label(index) + return item + + def size(self, index): + sz = self.dataset.size(index) + own_sz = len(self.get_label(index)) + return (sz, own_sz) + + def collater(self, samples): + collated = self.dataset.collater(samples) + if len(collated) == 0: + return collated + indices = set(collated["id"].tolist()) + target = [s["label"] for s in samples if s["id"] in indices] + + if self.batch_targets: + collated["target_lengths"] = torch.LongTensor([len(t) for t in target]) + target = data_utils.collate_tokens(target, pad_idx=self.pad, left_pad=False) + collated["ntokens"] = collated["target_lengths"].sum().item() + else: + collated["ntokens"] = sum([len(t) for t in target]) + + collated["target"] = target + + if self.add_to_input: + eos = target.new_full((target.size(0), 1), self.eos) + collated["target"] = torch.cat([target, eos], dim=-1).long() + collated["net_input"]["prev_output_tokens"] = torch.cat( + [eos, target], dim=-1 + ).long() + collated["ntokens"] += target.size(0) + return collated diff --git a/SpeechT5/fairseq/fairseq/data/append_token_dataset.py b/SpeechT5/fairseq/fairseq/data/append_token_dataset.py new file mode 100644 index 0000000..87695bd --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/append_token_dataset.py @@ -0,0 +1,41 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch + +from . import BaseWrapperDataset + + +class AppendTokenDataset(BaseWrapperDataset): + def __init__(self, dataset, token=None): + super().__init__(dataset) + self.token = token + if token is not None: + self._sizes = np.array(dataset.sizes) + 1 + else: + self._sizes = dataset.sizes + + def __getitem__(self, idx): + item = self.dataset[idx] + if self.token is not None: + item = torch.cat([item, item.new([self.token])]) + return item + + @property + def sizes(self): + return self._sizes + + def num_tokens(self, index): + n = self.dataset.num_tokens(index) + if self.token is not None: + n += 1 + return n + + def size(self, index): + n = self.dataset.size(index) + if self.token is not None: + n += 1 + return n diff --git a/SpeechT5/fairseq/fairseq/data/audio/__init__.py b/SpeechT5/fairseq/fairseq/data/audio/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/fairseq/data/audio/audio_utils.py b/SpeechT5/fairseq/fairseq/data/audio/audio_utils.py new file mode 100644 index 0000000..f51cb0c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/audio_utils.py @@ -0,0 +1,174 @@ +from pathlib import Path +from typing import BinaryIO, Optional, Tuple, Union, List + +import numpy as np +import torch + + +SF_AUDIO_FILE_EXTENSIONS = {".wav", ".flac", ".ogg"} +FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS = {".npy", ".wav", ".flac", ".ogg"} + + +def _convert_to_mono( + waveform: torch.FloatTensor, sample_rate: int +) -> torch.FloatTensor: + if waveform.shape[0] > 1: + try: + import torchaudio.sox_effects as ta_sox + except ImportError: + raise ImportError( + "Please install torchaudio to convert multi-channel audios" + ) + effects = [['channels', '1']] + return ta_sox.apply_effects_tensor(waveform, sample_rate, effects)[0] + return waveform + + +def convert_to_mono(waveform: np.ndarray, sample_rate: int) -> np.ndarray: + if waveform.shape[0] > 1: + _waveform = torch.from_numpy(waveform) + return _convert_to_mono(_waveform, sample_rate).numpy() + return waveform + + +def get_waveform( + path_or_fp: Union[str, BinaryIO], normalization=True, mono=True, + frames=-1, start=0, always_2d=True +) -> Tuple[np.ndarray, int]: + """Get the waveform and sample rate of a 16-bit WAV/FLAC/OGG Vorbis audio. + + Args: + path_or_fp (str or BinaryIO): the path or file-like object + normalization (bool): Normalize values to [-1, 1] (Default: True) + mono (bool): convert multi-channel audio to mono-channel one + frames (int): the number of frames to read. (-1 for reading all) + start (int): Where to start reading. A negative value counts from the end. + always_2d (bool): always return 2D array even for mono-channel audios + Returns: + waveform (numpy.ndarray): 1D or 2D waveform (channels x length) + sample_rate (float): sample rate + """ + if isinstance(path_or_fp, str): + ext = Path(path_or_fp).suffix + if ext not in SF_AUDIO_FILE_EXTENSIONS: + raise ValueError(f"Unsupported audio format: {ext}") + + try: + import soundfile as sf + except ImportError: + raise ImportError( + "Please install soundfile to load WAV/FLAC/OGG Vorbis audios" + ) + + waveform, sample_rate = sf.read( + path_or_fp, dtype="float32", always_2d=True, frames=frames, start=start + ) + waveform = waveform.T # T x C -> C x T + if mono and waveform.shape[0] > 1: + waveform = convert_to_mono(waveform, sample_rate) + if not normalization: + waveform *= 2 ** 15 # denormalized to 16-bit signed integers + if not always_2d: + waveform = waveform.squeeze(axis=0) + return waveform, sample_rate + + +def _get_kaldi_fbank( + waveform: np.ndarray, sample_rate: int, n_bins=80 +) -> Optional[np.ndarray]: + """Get mel-filter bank features via PyKaldi.""" + try: + from kaldi.feat.mel import MelBanksOptions + from kaldi.feat.fbank import FbankOptions, Fbank + from kaldi.feat.window import FrameExtractionOptions + from kaldi.matrix import Vector + + mel_opts = MelBanksOptions() + mel_opts.num_bins = n_bins + frame_opts = FrameExtractionOptions() + frame_opts.samp_freq = sample_rate + opts = FbankOptions() + opts.mel_opts = mel_opts + opts.frame_opts = frame_opts + fbank = Fbank(opts=opts) + features = fbank.compute(Vector(waveform.squeeze()), 1.0).numpy() + return features + except ImportError: + return None + + +def _get_torchaudio_fbank( + waveform: np.ndarray, sample_rate, n_bins=80 +) -> Optional[np.ndarray]: + """Get mel-filter bank features via TorchAudio.""" + try: + import torchaudio.compliance.kaldi as ta_kaldi + waveform = torch.from_numpy(waveform) + features = ta_kaldi.fbank( + waveform, num_mel_bins=n_bins, sample_frequency=sample_rate + ) + return features.numpy() + except ImportError: + return None + + +def get_fbank(path_or_fp: Union[str, BinaryIO], n_bins=80) -> np.ndarray: + """Get mel-filter bank features via PyKaldi or TorchAudio. Prefer PyKaldi + (faster CPP implementation) to TorchAudio (Python implementation). Note that + Kaldi/TorchAudio requires 16-bit signed integers as inputs and hence the + waveform should not be normalized.""" + waveform, sample_rate = get_waveform(path_or_fp, normalization=False) + + features = _get_kaldi_fbank(waveform, sample_rate, n_bins) + if features is None: + features = _get_torchaudio_fbank(waveform, sample_rate, n_bins) + if features is None: + raise ImportError( + "Please install pyKaldi or torchaudio to enable " + "online filterbank feature extraction" + ) + + return features + + +def is_npy_data(data: bytes) -> bool: + return data[0] == 147 and data[1] == 78 + + +def is_sf_audio_data(data: bytes) -> bool: + is_wav = (data[0] == 82 and data[1] == 73 and data[2] == 70) + is_flac = (data[0] == 102 and data[1] == 76 and data[2] == 97) + is_ogg = (data[0] == 79 and data[1] == 103 and data[2] == 103) + return is_wav or is_flac or is_ogg + + +def read_from_stored_zip(zip_path: str, offset: int, file_size: int) -> bytes: + with open(zip_path, "rb") as f: + f.seek(offset) + data = f.read(file_size) + return data + + +def parse_path(path: str) -> Tuple[str, List[int]]: + """Parse data path which is either a path to + 1. a .npy/.wav/.flac/.ogg file + 2. a stored ZIP file with slicing info: "[zip_path]:[offset]:[length]" + + Args: + path (str): the data path to parse + + Returns: + file_path (str): the file path + slice_ptr (list of int): empty in case 1; + byte offset and length for the slice in case 2 + """ + + if Path(path).suffix in FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS: + _path, slice_ptr = path, [] + else: + _path, *slice_ptr = path.split(":") + if not Path(_path).is_file(): + raise FileNotFoundError(f"File not found: {_path}") + assert len(slice_ptr) in {0, 2}, f"Invalid path: {path}" + slice_ptr = [int(i) for i in slice_ptr] + return _path, slice_ptr diff --git a/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/__init__.py b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/__init__.py new file mode 100644 index 0000000..359fa06 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/__init__.py @@ -0,0 +1,82 @@ +import importlib +import os +from abc import ABC, abstractmethod +from typing import Dict, Optional + + +class AudioFeatureTransform(ABC): + @classmethod + @abstractmethod + def from_config_dict(cls, config: Optional[Dict] = None): + pass + + +AUDIO_FEATURE_TRANSFORM_REGISTRY = {} +AUDIO_FEATURE_TRANSFORM_CLASS_NAMES = set() + + +def register_audio_feature_transform(name): + def register_audio_feature_transform_cls(cls): + if name in AUDIO_FEATURE_TRANSFORM_REGISTRY: + raise ValueError(f"Cannot register duplicate transform ({name})") + if not issubclass(cls, AudioFeatureTransform): + raise ValueError( + f"Transform ({name}: {cls.__name__}) must extend " + "AudioFeatureTransform" + ) + if cls.__name__ in AUDIO_FEATURE_TRANSFORM_CLASS_NAMES: + raise ValueError( + f"Cannot register audio feature transform with duplicate " + f"class name ({cls.__name__})" + ) + AUDIO_FEATURE_TRANSFORM_REGISTRY[name] = cls + AUDIO_FEATURE_TRANSFORM_CLASS_NAMES.add(cls.__name__) + return cls + + return register_audio_feature_transform_cls + + +def get_audio_feature_transform(name): + return AUDIO_FEATURE_TRANSFORM_REGISTRY[name] + + +transforms_dir = os.path.dirname(__file__) +for file in os.listdir(transforms_dir): + path = os.path.join(transforms_dir, file) + if ( + not file.startswith("_") + and not file.startswith(".") + and (file.endswith(".py") or os.path.isdir(path)) + ): + name = file[: file.find(".py")] if file.endswith(".py") else file + importlib.import_module("fairseq.data.audio.feature_transforms." + name) + + +class CompositeAudioFeatureTransform(AudioFeatureTransform): + @classmethod + def from_config_dict(cls, config=None): + _config = {} if config is None else config + _transforms = _config.get("transforms") + if _transforms is None: + return None + transforms = [ + get_audio_feature_transform(_t).from_config_dict(_config.get(_t)) + for _t in _transforms + ] + return CompositeAudioFeatureTransform(transforms) + + def __init__(self, transforms): + self.transforms = [t for t in transforms if t is not None] + + def __call__(self, x): + for t in self.transforms: + x = t(x) + return x + + def __repr__(self): + format_string = ( + [self.__class__.__name__ + "("] + + [f" {t.__repr__()}" for t in self.transforms] + + [")"] + ) + return "\n".join(format_string) diff --git a/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/global_cmvn.py b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/global_cmvn.py new file mode 100644 index 0000000..e457ff1 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/global_cmvn.py @@ -0,0 +1,29 @@ +import numpy as np +from fairseq.data.audio.feature_transforms import ( + AudioFeatureTransform, + register_audio_feature_transform, +) + + +@register_audio_feature_transform("global_cmvn") +class GlobalCMVN(AudioFeatureTransform): + """Global CMVN (cepstral mean and variance normalization). The global mean + and variance need to be pre-computed and stored in NumPy format (.npz).""" + + @classmethod + def from_config_dict(cls, config=None): + _config = {} if config is None else config + return GlobalCMVN(_config.get("stats_npz_path")) + + def __init__(self, stats_npz_path): + self.stats_npz_path = stats_npz_path + stats = np.load(stats_npz_path) + self.mean, self.std = stats["mean"], stats["std"] + + def __repr__(self): + return self.__class__.__name__ + f'(stats_npz_path="{self.stats_npz_path}")' + + def __call__(self, x): + x = np.subtract(x, self.mean) + x = np.divide(x, self.std) + return x diff --git a/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/specaugment.py b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/specaugment.py new file mode 100644 index 0000000..ce5802b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/specaugment.py @@ -0,0 +1,131 @@ +import math +import numbers +from typing import Optional + +import numpy as np +from fairseq.data.audio.feature_transforms import ( + AudioFeatureTransform, + register_audio_feature_transform, +) + + +@register_audio_feature_transform("specaugment") +class SpecAugmentTransform(AudioFeatureTransform): + """SpecAugment (https://arxiv.org/abs/1904.08779)""" + + @classmethod + def from_config_dict(cls, config=None): + _config = {} if config is None else config + return SpecAugmentTransform( + _config.get("time_warp_W", 0), + _config.get("freq_mask_N", 0), + _config.get("freq_mask_F", 0), + _config.get("time_mask_N", 0), + _config.get("time_mask_T", 0), + _config.get("time_mask_p", 0.0), + _config.get("mask_value", None), + ) + + def __init__( + self, + time_warp_w: int = 0, + freq_mask_n: int = 0, + freq_mask_f: int = 0, + time_mask_n: int = 0, + time_mask_t: int = 0, + time_mask_p: float = 0.0, + mask_value: Optional[float] = 0.0, + ): + # Sanity checks + assert mask_value is None or isinstance( + mask_value, numbers.Number + ), f"mask_value (type: {type(mask_value)}) must be None or a number" + if freq_mask_n > 0: + assert freq_mask_f > 0, ( + f"freq_mask_F ({freq_mask_f}) " + f"must be larger than 0 when doing freq masking." + ) + if time_mask_n > 0: + assert time_mask_t > 0, ( + f"time_mask_T ({time_mask_t}) must be larger than 0 when " + f"doing time masking." + ) + + self.time_warp_w = time_warp_w + self.freq_mask_n = freq_mask_n + self.freq_mask_f = freq_mask_f + self.time_mask_n = time_mask_n + self.time_mask_t = time_mask_t + self.time_mask_p = time_mask_p + self.mask_value = mask_value + + def __repr__(self): + return ( + self.__class__.__name__ + + "(" + + ", ".join( + [ + f"time_warp_w={self.time_warp_w}", + f"freq_mask_n={self.freq_mask_n}", + f"freq_mask_f={self.freq_mask_f}", + f"time_mask_n={self.time_mask_n}", + f"time_mask_t={self.time_mask_t}", + f"time_mask_p={self.time_mask_p}", + ] + ) + + ")" + ) + + def __call__(self, spectrogram): + assert len(spectrogram.shape) == 2, "spectrogram must be a 2-D tensor." + + distorted = spectrogram.copy() # make a copy of input spectrogram. + num_frames = spectrogram.shape[0] # or 'tau' in the paper. + num_freqs = spectrogram.shape[1] # or 'miu' in the paper. + mask_value = self.mask_value + + if mask_value is None: # if no value was specified, use local mean. + mask_value = spectrogram.mean() + + if num_frames == 0: + return spectrogram + + if num_freqs < self.freq_mask_f: + return spectrogram + + if self.time_warp_w > 0: + if 2 * self.time_warp_w < num_frames: + import cv2 + + w0 = np.random.randint(self.time_warp_w, num_frames - self.time_warp_w) + w = np.random.randint(-self.time_warp_w + 1, self.time_warp_w) + upper, lower = distorted[:w0, :], distorted[w0:, :] + upper = cv2.resize( + upper, dsize=(num_freqs, w0 + w), interpolation=cv2.INTER_LINEAR + ) + lower = cv2.resize( + lower, + dsize=(num_freqs, num_frames - w0 - w), + interpolation=cv2.INTER_LINEAR, + ) + distorted = np.concatenate((upper, lower), axis=0) + + for _i in range(self.freq_mask_n): + f = np.random.randint(0, self.freq_mask_f) + f0 = np.random.randint(0, num_freqs - f) + if f != 0: + distorted[:, f0 : f0 + f] = mask_value + + max_time_mask_t = min( + self.time_mask_t, math.floor(num_frames * self.time_mask_p) + ) + if max_time_mask_t < 1: + return distorted + + for _i in range(self.time_mask_n): + t = np.random.randint(0, max_time_mask_t) + t0 = np.random.randint(0, num_frames - t) + if t != 0: + distorted[t0 : t0 + t, :] = mask_value + + return distorted diff --git a/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/utterance_cmvn.py b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/utterance_cmvn.py new file mode 100644 index 0000000..6bbd0ae --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/feature_transforms/utterance_cmvn.py @@ -0,0 +1,40 @@ +import numpy as np +from fairseq.data.audio.feature_transforms import ( + AudioFeatureTransform, + register_audio_feature_transform, +) + + +@register_audio_feature_transform("utterance_cmvn") +class UtteranceCMVN(AudioFeatureTransform): + """Utterance-level CMVN (cepstral mean and variance normalization)""" + + @classmethod + def from_config_dict(cls, config=None): + _config = {} if config is None else config + return UtteranceCMVN( + _config.get("norm_means", True), + _config.get("norm_vars", True), + ) + + def __init__(self, norm_means=True, norm_vars=True): + self.norm_means, self.norm_vars = norm_means, norm_vars + + def __repr__(self): + return ( + self.__class__.__name__ + + f"(norm_means={self.norm_means}, norm_vars={self.norm_vars})" + ) + + def __call__(self, x): + mean = x.mean(axis=0) + square_sums = (x ** 2).sum(axis=0) + + if self.norm_means: + x = np.subtract(x, mean) + if self.norm_vars: + var = square_sums / x.shape[0] - mean ** 2 + std = np.sqrt(np.maximum(var, 1e-10)) + x = np.divide(x, std) + + return x diff --git a/SpeechT5/fairseq/fairseq/data/audio/hubert_dataset.py b/SpeechT5/fairseq/fairseq/data/audio/hubert_dataset.py new file mode 100644 index 0000000..f00fe30 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/hubert_dataset.py @@ -0,0 +1,358 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import itertools +import logging +import os +import sys +from typing import Any, List, Optional, Union + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils +from fairseq.data.fairseq_dataset import FairseqDataset + +logger = logging.getLogger(__name__) + + +def load_audio(manifest_path, max_keep, min_keep): + n_long, n_short = 0, 0 + names, inds, sizes = [], [], [] + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) == 2, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + names.append(items[0]) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes + + +def load_label(label_path, inds, tot): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +class HubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + ): + self.audio_root, self.audio_names, inds, tot, self.sizes = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + self.random_crop = random_crop + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.single_target = single_target + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + self.store_labels = store_labels + if store_labels: + self.label_list = [load_label(p, inds, tot) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot) for p in label_paths + ] + assert ( + label_processors is None + or len(label_processors) == self.num_labels + ) + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths( + self.sizes, sample_rate, label_path, label_rate, inds, tot + ) + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + logger.info( + f"pad_audio={pad_audio}, random_crop={random_crop}, " + f"normalize={normalize}, max_sample_size={self.max_sample_size}" + ) + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + wav, cur_sample_rate = sf.read(wav_path) + wav = torch.from_numpy(wav).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def __getitem__(self, index): + wav = self.get_audio(index) + labels = self.get_labels(index) + return {"id": index, "source": wav, "label_list": labels} + + def __len__(self): + return len(self.sizes) + + def crop_to_max_size(self, wav, target_size): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + + start, end = 0, target_size + if self.random_crop: + start = np.random.randint(0, diff + 1) + end = size - diff + start + return wav[start:end], start + + def collater(self, samples): + # target = max(sizes) -> random_crop not used + # target = max_sample_size -> random_crop used for long + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + collated_audios, padding_mask, audio_starts = self.collater_audio( + audios, audio_size + ) + + targets_by_label = [ + [s["label_list"][i] for s in samples] + for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + net_input = {"source": collated_audios, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch + + def collater_audio(self, audios, audio_size): + collated_audios = audios[0].new_zeros(len(audios), audio_size) + padding_mask = ( + torch.BoolTensor(collated_audios.shape).fill_(False) + # if self.pad_audio else None + ) + audio_starts = [0 for _ in audios] + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat( + [audio, audio.new_full((-diff,), 0.0)] + ) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size + ) + return collated_audios, padding_mask, audio_starts + + def collater_frm_label( + self, targets, audio_size, audio_starts, label_rate, pad + ): + assert label_rate > 0 + s2f = label_rate / self.sample_rate + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s: s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1: + targets, lengths, ntokens = self.collater_seq_label( + targets, pad + ) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.sizes[index] + return min(self.sizes[index], self.max_sample_size) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.sizes) + return np.lexsort(order)[::-1] + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechT5/fairseq/fairseq/data/audio/raw_audio_dataset.py b/SpeechT5/fairseq/fairseq/data/audio/raw_audio_dataset.py new file mode 100644 index 0000000..9ce3f7e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/raw_audio_dataset.py @@ -0,0 +1,386 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import logging +import os +import sys +import io + +import numpy as np +import torch +import torch.nn.functional as F + +from .. import FairseqDataset +from ..data_utils import compute_mask_indices, get_buckets, get_bucketed_sizes +from fairseq.data.audio.audio_utils import ( + parse_path, + read_from_stored_zip, + is_sf_audio_data, +) + + +logger = logging.getLogger(__name__) + + +class RawAudioDataset(FairseqDataset): + def __init__( + self, + sample_rate, + max_sample_size=None, + min_sample_size=0, + shuffle=True, + pad=False, + normalize=False, + compute_mask_indices=False, + **mask_compute_kwargs, + ): + super().__init__() + + self.sample_rate = sample_rate + self.sizes = [] + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.min_sample_size = min_sample_size + self.pad = pad + self.shuffle = shuffle + self.normalize = normalize + self.compute_mask_indices = compute_mask_indices + if self.compute_mask_indices: + self.mask_compute_kwargs = mask_compute_kwargs + self._features_size_map = {} + self._C = mask_compute_kwargs["encoder_embed_dim"] + self._conv_feature_layers = eval(mask_compute_kwargs["conv_feature_layers"]) + + def __getitem__(self, index): + raise NotImplementedError() + + def __len__(self): + return len(self.sizes) + + def postprocess(self, feats, curr_sample_rate): + if feats.dim() == 2: + feats = feats.mean(-1) + + if curr_sample_rate != self.sample_rate: + raise Exception(f"sample rate: {curr_sample_rate}, need {self.sample_rate}") + + assert feats.dim() == 1, feats.dim() + + if self.normalize: + with torch.no_grad(): + feats = F.layer_norm(feats, feats.shape) + return feats + + def crop_to_max_size(self, wav, target_size): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav + + start = np.random.randint(0, diff + 1) + end = size - diff + start + return wav[start:end] + + def _compute_mask_indices(self, dims, padding_mask): + B, T, C = dims + mask_indices, mask_channel_indices = None, None + if self.mask_compute_kwargs["mask_prob"] > 0: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_compute_kwargs["mask_prob"], + self.mask_compute_kwargs["mask_length"], + self.mask_compute_kwargs["mask_selection"], + self.mask_compute_kwargs["mask_other"], + min_masks=2, + no_overlap=self.mask_compute_kwargs["no_mask_overlap"], + min_space=self.mask_compute_kwargs["mask_min_space"], + ) + mask_indices = torch.from_numpy(mask_indices) + if self.mask_compute_kwargs["mask_channel_prob"] > 0: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_compute_kwargs["mask_channel_prob"], + self.mask_compute_kwargs["mask_channel_length"], + self.mask_compute_kwargs["mask_channel_selection"], + self.mask_compute_kwargs["mask_channel_other"], + no_overlap=self.mask_compute_kwargs["no_mask_channel_overlap"], + min_space=self.mask_compute_kwargs["mask_channel_min_space"], + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices).unsqueeze(1).expand(-1, T, -1) + ) + + return mask_indices, mask_channel_indices + + @staticmethod + def _bucket_tensor(tensor, num_pad, value): + return F.pad(tensor, (0, num_pad), value=value) + + def collater(self, samples): + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + sources = [s["source"] for s in samples] + sizes = [len(s) for s in sources] + + if self.pad: + target_size = min(max(sizes), self.max_sample_size) + else: + target_size = min(min(sizes), self.max_sample_size) + + collated_sources = sources[0].new_zeros(len(sources), target_size) + padding_mask = ( + torch.BoolTensor(collated_sources.shape).fill_(False) if self.pad else None + ) + for i, (source, size) in enumerate(zip(sources, sizes)): + diff = size - target_size + if diff == 0: + collated_sources[i] = source + elif diff < 0: + assert self.pad + collated_sources[i] = torch.cat( + [source, source.new_full((-diff,), 0.0)] + ) + padding_mask[i, diff:] = True + else: + collated_sources[i] = self.crop_to_max_size(source, target_size) + + input = {"source": collated_sources} + out = {"id": torch.LongTensor([s["id"] for s in samples])} + if self.pad: + input["padding_mask"] = padding_mask + + if hasattr(self, "num_buckets") and self.num_buckets > 0: + assert self.pad, "Cannot bucket without padding first." + bucket = max(self._bucketed_sizes[s["id"]] for s in samples) + num_pad = bucket - collated_sources.size(-1) + if num_pad: + input["source"] = self._bucket_tensor(collated_sources, num_pad, 0) + input["padding_mask"] = self._bucket_tensor(padding_mask, num_pad, True) + + if self.compute_mask_indices: + B = input["source"].size(0) + T = self._get_mask_indices_dims(input["source"].size(-1)) + padding_mask_reshaped = input["padding_mask"].clone() + extra = padding_mask_reshaped.size(1) % T + if extra > 0: + padding_mask_reshaped = padding_mask_reshaped[:, :-extra] + padding_mask_reshaped = padding_mask_reshaped.view( + padding_mask_reshaped.size(0), T, -1 + ) + padding_mask_reshaped = padding_mask_reshaped.all(-1) + input["padding_count"] = padding_mask_reshaped.sum(-1).max().item() + mask_indices, mask_channel_indices = self._compute_mask_indices( + (B, T, self._C), + padding_mask_reshaped, + ) + input["mask_indices"] = mask_indices + input["mask_channel_indices"] = mask_channel_indices + out["sample_size"] = mask_indices.sum().item() + + out["net_input"] = input + return out + + def _get_mask_indices_dims(self, size, padding=0, dilation=1): + if size not in self._features_size_map: + L_in = size + for (_, kernel_size, stride) in self._conv_feature_layers: + L_out = L_in + 2 * padding - dilation * (kernel_size - 1) - 1 + L_out = 1 + L_out // stride + L_in = L_out + self._features_size_map[size] = L_out + return self._features_size_map[size] + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + if self.pad: + return self.sizes[index] + return min(self.sizes[index], self.max_sample_size) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + + if self.shuffle: + order = [np.random.permutation(len(self))] + order.append( + np.minimum( + np.array(self.sizes), + self.max_sample_size, + ) + ) + return np.lexsort(order)[::-1] + else: + return np.arange(len(self)) + + def set_bucket_info(self, num_buckets): + self.num_buckets = num_buckets + if self.num_buckets > 0: + self._collated_sizes = np.minimum( + np.array(self.sizes), + self.max_sample_size, + ) + self.buckets = get_buckets( + self._collated_sizes, + self.num_buckets, + ) + self._bucketed_sizes = get_bucketed_sizes( + self._collated_sizes, self.buckets + ) + logger.info( + f"{len(self.buckets)} bucket(s) for the audio dataset: " + f"{self.buckets}" + ) + + +class FileAudioDataset(RawAudioDataset): + def __init__( + self, + manifest_path, + sample_rate, + max_sample_size=None, + min_sample_size=0, + shuffle=True, + pad=False, + normalize=False, + num_buckets=0, + compute_mask_indices=False, + **mask_compute_kwargs, + ): + super().__init__( + sample_rate=sample_rate, + max_sample_size=max_sample_size, + min_sample_size=min_sample_size, + shuffle=shuffle, + pad=pad, + normalize=normalize, + compute_mask_indices=compute_mask_indices, + **mask_compute_kwargs, + ) + + skipped = 0 + self.fnames = [] + sizes = [] + self.skipped_indices = set() + + with open(manifest_path, "r") as f: + self.root_dir = f.readline().strip() + for i, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) == 2, line + sz = int(items[1]) + if min_sample_size is not None and sz < min_sample_size: + skipped += 1 + self.skipped_indices.add(i) + continue + self.fnames.append(items[0]) + sizes.append(sz) + logger.info(f"loaded {len(self.fnames)}, skipped {skipped} samples") + + self.sizes = np.array(sizes, dtype=np.int64) + + try: + import pyarrow + + self.fnames = pyarrow.array(self.fnames) + except: + logger.debug( + "Could not create a pyarrow array. Please install pyarrow for better performance" + ) + pass + + self.set_bucket_info(num_buckets) + + def __getitem__(self, index): + import soundfile as sf + + path_or_fp = os.path.join(self.root_dir, str(self.fnames[index])) + _path, slice_ptr = parse_path(path_or_fp) + if len(slice_ptr) == 2: + byte_data = read_from_stored_zip(_path, slice_ptr[0], slice_ptr[1]) + assert is_sf_audio_data(byte_data) + path_or_fp = io.BytesIO(byte_data) + + wav, curr_sample_rate = sf.read(path_or_fp, dtype="float32") + + feats = torch.from_numpy(wav).float() + feats = self.postprocess(feats, curr_sample_rate) + return {"id": index, "source": feats} + + +class BinarizedAudioDataset(RawAudioDataset): + def __init__( + self, + data_dir, + split, + sample_rate, + max_sample_size=None, + min_sample_size=0, + shuffle=True, + pad=False, + normalize=False, + num_buckets=0, + compute_mask_indices=False, + **mask_compute_kwargs, + ): + super().__init__( + sample_rate=sample_rate, + max_sample_size=max_sample_size, + min_sample_size=min_sample_size, + shuffle=shuffle, + pad=pad, + normalize=normalize, + compute_mask_indices=compute_mask_indices, + **mask_compute_kwargs, + ) + + from fairseq.data import data_utils, Dictionary + + self.fnames_dict = Dictionary.load(os.path.join(data_dir, "dict.txt")) + + root_path = os.path.join(data_dir, f"{split}.root") + if os.path.exists(root_path): + with open(root_path, "r") as f: + self.root_dir = next(f).strip() + else: + self.root_dir = None + + fnames_path = os.path.join(data_dir, split) + self.fnames = data_utils.load_indexed_dataset(fnames_path, self.fnames_dict) + lengths_path = os.path.join(data_dir, f"{split}.lengths") + + with open(lengths_path, "r") as f: + for line in f: + sz = int(line.rstrip()) + assert ( + sz >= min_sample_size + ), f"Min sample size is not supported for binarized dataset, but found a sample with size {sz}" + self.sizes.append(sz) + + self.sizes = np.array(self.sizes, dtype=np.int64) + + self.set_bucket_info(num_buckets) + logger.info(f"loaded {len(self.fnames)} samples") + + def __getitem__(self, index): + import soundfile as sf + + fname = self.fnames_dict.string(self.fnames[index], separator="") + if self.root_dir: + fname = os.path.join(self.root_dir, fname) + + wav, curr_sample_rate = sf.read(fname) + feats = torch.from_numpy(wav).float() + feats = self.postprocess(feats, curr_sample_rate) + return {"id": index, "source": feats} diff --git a/SpeechT5/fairseq/fairseq/data/audio/speech_to_text_dataset.py b/SpeechT5/fairseq/fairseq/data/audio/speech_to_text_dataset.py new file mode 100644 index 0000000..d4b5668 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/audio/speech_to_text_dataset.py @@ -0,0 +1,511 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import csv +import io +import logging +import os.path as op +import re +from typing import Dict, List, Optional, Tuple + +import numpy as np +import torch +from fairseq.data import ( + ConcatDataset, + Dictionary, + FairseqDataset, + ResamplingDataset, + data_utils as fairseq_data_utils, +) +from fairseq.data.audio.audio_utils import ( + get_fbank, get_waveform, read_from_stored_zip, is_npy_data, + is_sf_audio_data, parse_path, FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS +) +from fairseq.data.audio.feature_transforms import CompositeAudioFeatureTransform + + +logger = logging.getLogger(__name__) + + +class S2TDataConfig(object): + """Wrapper class for data config YAML""" + + def __init__(self, yaml_path): + try: + import yaml + except ImportError: + print("Please install PyYAML to load YAML files for " "S2T data config") + self.config = {} + if op.isfile(yaml_path): + try: + with open(yaml_path) as f: + self.config = yaml.load(f, Loader=yaml.FullLoader) + except Exception as e: + raise Exception(f"Failed to load config from {yaml_path}: {e}") + else: + raise FileNotFoundError(f"{yaml_path} not found") + + @property + def vocab_filename(self): + """fairseq vocabulary file under data root""" + return self.config.get("vocab_filename", "dict.txt") + + @property + def shuffle(self) -> bool: + """Shuffle dataset samples before batching""" + return self.config.get("shuffle", False) + + @property + def pre_tokenizer(self) -> Dict: + """Pre-tokenizer to apply before subword tokenization. Returning + a dictionary with `tokenizer` providing the tokenizer name and + the other items providing the tokenizer-specific arguments. + Tokenizers are defined in `fairseq.data.encoders.*`""" + return self.config.get("pre_tokenizer", {"tokenizer": None}) + + @property + def bpe_tokenizer(self) -> Dict: + """Subword tokenizer to apply after pre-tokenization. Returning + a dictionary with `bpe` providing the tokenizer name and + the other items providing the tokenizer-specific arguments. + Tokenizers are defined in `fairseq.data.encoders.*`""" + return self.config.get("bpe_tokenizer", {"bpe": None}) + + @property + def prepend_tgt_lang_tag(self) -> bool: + """Prepend target lang ID token as the target BOS (e.g. for to-many + multilingual setting). During inference, this requires `--prefix-size 1` + to force BOS to be lang ID token.""" + return self.config.get("prepend_tgt_lang_tag", False) + + @property + def input_feat_per_channel(self): + """The dimension of input features (per audio channel)""" + return self.config.get("input_feat_per_channel", 80) + + @property + def input_channels(self): + """The number of channels in the input audio""" + return self.config.get("input_channels", 1) + + @property + def sampling_alpha(self): + """Hyper-parameter alpha = 1/T for temperature-based resampling. + (alpha = 1 for no resampling)""" + return self.config.get("sampling_alpha", 1.0) + + @property + def use_audio_input(self): + """Needed by the dataset loader to see if the model requires + raw audio as inputs.""" + return self.config.get("use_audio_input", False) + + @property + def audio_root(self): + """Audio paths in the manifest TSV can be relative and this provides + the root path. Set this to empty string when using absolute paths.""" + return self.config.get("audio_root", "") + + def get_feature_transforms(self, split, is_train): + """Split-specific feature transforms. Allowing train set wildcard `_train`, + evaluation set wildcard `_eval` and general wildcard `*` for matching.""" + from copy import deepcopy + + cfg = deepcopy(self.config) + _cur = cfg.get("transforms", {}) + cur = _cur.get(split) + cur = _cur.get("_train") if cur is None and is_train else cur + cur = _cur.get("_eval") if cur is None and not is_train else cur + cur = _cur.get("*") if cur is None else cur + cfg["transforms"] = cur + return cfg + + +def get_features_from_npy_or_audio(path): + ext = op.splitext(op.basename(path))[1] + if ext not in FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS: + raise ValueError(f'Unsupported file format for "{path}"') + return np.load(path) if ext == ".npy" else get_fbank(path) + + +def get_features_or_waveform_from_stored_zip( + path, byte_offset, byte_size, need_waveform=False +): + assert path.endswith(".zip") + data = read_from_stored_zip(path, byte_offset, byte_size) + f = io.BytesIO(data) + if is_npy_data(data): + features_or_waveform = np.load(f) + elif is_sf_audio_data(data): + features_or_waveform = \ + get_waveform(f, always_2d=False)[0] if need_waveform else get_fbank(f) + else: + raise ValueError(f'Unknown file format for "{path}"') + return features_or_waveform + + +def get_features_or_waveform(path: str, need_waveform=False): + """Get speech features from .npy file or waveform from .wav/.flac file. + The file may be inside an uncompressed ZIP file and is accessed via byte + offset and length. + + Args: + path (str): File path in the format of "<.npy/.wav/.flac path>" or + "<zip path>:<byte offset>:<byte length>". + need_waveform (bool): return waveform instead of features. + + Returns: + features_or_waveform (numpy.ndarray): speech features or waveform. + """ + _path, slice_ptr = parse_path(path) + if len(slice_ptr) == 0: + if need_waveform: + return get_waveform(_path, always_2d=False) + return get_features_from_npy_or_audio(_path) + elif len(slice_ptr) == 2: + features_or_waveform = get_features_or_waveform_from_stored_zip( + _path, slice_ptr[0], slice_ptr[1], need_waveform=need_waveform + ) + else: + raise ValueError(f"Invalid path: {path}") + + return features_or_waveform + + +def _collate_frames( + frames: List[torch.Tensor], is_audio_input: bool = False +) -> torch.Tensor: + """ + Convert a list of 2D frames into a padded 3D tensor + Args: + frames (list): list of 2D frames of size L[i]*f_dim. Where L[i] is + length of i-th frame and f_dim is static dimension of features + Returns: + 3D tensor of size len(frames)*len_max*f_dim where len_max is max of L[i] + """ + max_len = max(frame.size(0) for frame in frames) + if is_audio_input: + out = frames[0].new_zeros((len(frames), max_len)) + else: + out = frames[0].new_zeros((len(frames), max_len, frames[0].size(1))) + for i, v in enumerate(frames): + out[i, : v.size(0)] = v + return out + + +class SpeechToTextDataset(FairseqDataset): + LANG_TAG_TEMPLATE = "<lang:{}>" + + def __init__( + self, + split: str, + is_train_split: bool, + data_cfg: S2TDataConfig, + audio_paths: List[str], + n_frames: List[int], + src_texts: Optional[List[str]] = None, + tgt_texts: Optional[List[str]] = None, + speakers: Optional[List[str]] = None, + src_langs: Optional[List[str]] = None, + tgt_langs: Optional[List[str]] = None, + ids: Optional[List[str]] = None, + tgt_dict: Optional[Dictionary] = None, + pre_tokenizer=None, + bpe_tokenizer=None, + ): + self.split, self.is_train_split = split, is_train_split + self.data_cfg = data_cfg + self.audio_paths, self.n_frames = audio_paths, n_frames + self.n_samples = len(audio_paths) + assert len(n_frames) == self.n_samples > 0 + assert src_texts is None or len(src_texts) == self.n_samples + assert tgt_texts is None or len(tgt_texts) == self.n_samples + assert speakers is None or len(speakers) == self.n_samples + assert src_langs is None or len(src_langs) == self.n_samples + assert tgt_langs is None or len(tgt_langs) == self.n_samples + assert ids is None or len(ids) == self.n_samples + assert (tgt_dict is None and tgt_texts is None) or ( + tgt_dict is not None and tgt_texts is not None + ) + self.src_texts, self.tgt_texts = src_texts, tgt_texts + self.src_langs, self.tgt_langs = src_langs, tgt_langs + self.tgt_dict = tgt_dict + self.check_tgt_lang_tag() + self.ids = ids + self.shuffle = data_cfg.shuffle if is_train_split else False + + self.feature_transforms = CompositeAudioFeatureTransform.from_config_dict( + self.data_cfg.get_feature_transforms(split, is_train_split) + ) + + self.pre_tokenizer = pre_tokenizer + self.bpe_tokenizer = bpe_tokenizer + + logger.info(self.__repr__()) + + def __repr__(self): + return ( + self.__class__.__name__ + + f'(split="{self.split}", n_samples={self.n_samples}, ' + f"prepend_tgt_lang_tag={self.data_cfg.prepend_tgt_lang_tag}, " + f"shuffle={self.shuffle}, transforms={self.feature_transforms})" + ) + + @classmethod + def is_lang_tag(cls, token): + pattern = cls.LANG_TAG_TEMPLATE.replace("{}", "(.*)") + return re.match(pattern, token) + + def check_tgt_lang_tag(self): + if self.data_cfg.prepend_tgt_lang_tag: + assert self.tgt_langs is not None and self.tgt_dict is not None + tgt_lang_tags = [ + self.LANG_TAG_TEMPLATE.format(t) for t in set(self.tgt_langs) + ] + assert all(t in self.tgt_dict for t in tgt_lang_tags) + + def tokenize_text(self, text: str): + if self.pre_tokenizer is not None: + text = self.pre_tokenizer.encode(text) + if self.bpe_tokenizer is not None: + text = self.bpe_tokenizer.encode(text) + return text + + def __getitem__( + self, index: int + ) -> Tuple[int, torch.Tensor, Optional[torch.Tensor]]: + source = get_features_or_waveform( + self.audio_paths[index], need_waveform=self.data_cfg.use_audio_input + ) + if self.feature_transforms is not None: + assert not self.data_cfg.use_audio_input + source = self.feature_transforms(source) + source = torch.from_numpy(source).float() + + target = None + if self.tgt_texts is not None: + tokenized = self.tokenize_text(self.tgt_texts[index]) + target = self.tgt_dict.encode_line( + tokenized, add_if_not_exist=False, append_eos=True + ).long() + if self.data_cfg.prepend_tgt_lang_tag: + lang_tag = self.LANG_TAG_TEMPLATE.format(self.tgt_langs[index]) + lang_tag_idx = self.tgt_dict.index(lang_tag) + target = torch.cat((torch.LongTensor([lang_tag_idx]), target), 0) + return index, source, target + + def __len__(self): + return self.n_samples + + def collater(self, samples: List[Tuple[int, torch.Tensor, torch.Tensor]]) -> Dict: + if len(samples) == 0: + return {} + indices = torch.tensor([i for i, _, _ in samples], dtype=torch.long) + frames = _collate_frames( + [s for _, s, _ in samples], self.data_cfg.use_audio_input + ) + # sort samples by descending number of frames + n_frames = torch.tensor([s.size(0) for _, s, _ in samples], dtype=torch.long) + n_frames, order = n_frames.sort(descending=True) + indices = indices.index_select(0, order) + frames = frames.index_select(0, order) + + target, target_lengths = None, None + prev_output_tokens = None + ntokens = None + if self.tgt_texts is not None: + target = fairseq_data_utils.collate_tokens( + [t for _, _, t in samples], + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=False, + ) + target = target.index_select(0, order) + target_lengths = torch.tensor( + [t.size(0) for _, _, t in samples], dtype=torch.long + ).index_select(0, order) + prev_output_tokens = fairseq_data_utils.collate_tokens( + [t for _, _, t in samples], + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=True, + ) + prev_output_tokens = prev_output_tokens.index_select(0, order) + ntokens = sum(t.size(0) for _, _, t in samples) + + out = { + "id": indices, + "net_input": { + "src_tokens": frames, + "src_lengths": n_frames, + "prev_output_tokens": prev_output_tokens, + }, + "target": target, + "target_lengths": target_lengths, + "ntokens": ntokens, + "nsentences": len(samples), + } + return out + + def num_tokens(self, index): + return self.n_frames[index] + + def size(self, index): + t_len = 0 + if self.tgt_texts is not None: + tokenized = self.tokenize_text(self.tgt_texts[index]) + t_len = len(tokenized.split(" ")) + return self.n_frames[index], t_len + + @property + def sizes(self): + return np.array(self.n_frames) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return True + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + # first by descending order of # of frames then by original/random order + order.append([-n for n in self.n_frames]) + return np.lexsort(order) + + def prefetch(self, indices): + raise False + + +class SpeechToTextDatasetCreator(object): + # mandatory columns + KEY_ID, KEY_AUDIO, KEY_N_FRAMES = "id", "audio", "n_frames" + KEY_TGT_TEXT = "tgt_text" + # optional columns + KEY_SPEAKER, KEY_SRC_TEXT = "speaker", "src_text" + KEY_SRC_LANG, KEY_TGT_LANG = "src_lang", "tgt_lang" + # default values + DEFAULT_SPEAKER = DEFAULT_SRC_TEXT = DEFAULT_LANG = "" + + @classmethod + def _from_list( + cls, + split_name: str, + is_train_split, + samples: List[List[Dict]], + data_cfg: S2TDataConfig, + tgt_dict, + pre_tokenizer, + bpe_tokenizer, + ) -> SpeechToTextDataset: + audio_paths, n_frames, src_texts, tgt_texts, ids = [], [], [], [], [] + speakers, src_langs, tgt_langs = [], [], [] + for s in samples: + ids.extend([ss[cls.KEY_ID] for ss in s]) + audio_paths.extend( + [op.join(data_cfg.audio_root, ss[cls.KEY_AUDIO]) for ss in s] + ) + n_frames.extend([int(ss[cls.KEY_N_FRAMES]) for ss in s]) + tgt_texts.extend([ss[cls.KEY_TGT_TEXT] for ss in s]) + src_texts.extend( + [ss.get(cls.KEY_SRC_TEXT, cls.DEFAULT_SRC_TEXT) for ss in s] + ) + speakers.extend([ss.get(cls.KEY_SPEAKER, cls.DEFAULT_SPEAKER) for ss in s]) + src_langs.extend([ss.get(cls.KEY_SRC_LANG, cls.DEFAULT_LANG) for ss in s]) + tgt_langs.extend([ss.get(cls.KEY_TGT_LANG, cls.DEFAULT_LANG) for ss in s]) + return SpeechToTextDataset( + split_name, + is_train_split, + data_cfg, + audio_paths, + n_frames, + src_texts, + tgt_texts, + speakers, + src_langs, + tgt_langs, + ids, + tgt_dict, + pre_tokenizer, + bpe_tokenizer, + ) + + @classmethod + def _get_size_ratios(cls, ids: List[str], sizes: List[int], alpha: float = 1.0): + """Size ratios for temperature-based sampling + (https://arxiv.org/abs/1907.05019)""" + _sizes = np.array(sizes) + prob = _sizes / _sizes.sum() + smoothed_prob = prob ** alpha + smoothed_prob = smoothed_prob / smoothed_prob.sum() + size_ratio = (smoothed_prob * _sizes.sum()) / _sizes + + o_str = str({_i: f"{prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"original sampling probability: {o_str}") + p_str = str({_i: f"{smoothed_prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"balanced sampling probability: {p_str}") + sr_str = str({_id: f"{size_ratio[i]:.3f}" for i, _id in enumerate(ids)}) + logger.info(f"balanced sampling size ratio: {sr_str}") + return size_ratio.tolist() + + @classmethod + def from_tsv( + cls, + root: str, + data_cfg: S2TDataConfig, + splits: str, + tgt_dict, + pre_tokenizer, + bpe_tokenizer, + is_train_split: bool, + epoch: int, + seed: int, + ) -> SpeechToTextDataset: + samples = [] + _splits = splits.split(",") + for split in _splits: + tsv_path = op.join(root, f"{split}.tsv") + if not op.isfile(tsv_path): + raise FileNotFoundError(f"Dataset not found: {tsv_path}") + with open(tsv_path) as f: + reader = csv.DictReader( + f, + delimiter="\t", + quotechar=None, + doublequote=False, + lineterminator="\n", + quoting=csv.QUOTE_NONE, + ) + samples.append([dict(e) for e in reader]) + assert len(samples) > 0 + + datasets = [ + cls._from_list( + name, + is_train_split, + [s], + data_cfg, + tgt_dict, + pre_tokenizer, + bpe_tokenizer, + ) + for name, s in zip(_splits, samples) + ] + + if is_train_split and len(_splits) > 1 and data_cfg.sampling_alpha != 1.0: + # temperature-based sampling + size_ratios = cls._get_size_ratios( + _splits, [len(s) for s in samples], alpha=data_cfg.sampling_alpha + ) + datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=seed, epoch=epoch, replace=(r >= 1.0) + ) + for d, r in zip(datasets, size_ratios) + ] + return ConcatDataset(datasets) diff --git a/SpeechT5/fairseq/fairseq/data/backtranslation_dataset.py b/SpeechT5/fairseq/fairseq/data/backtranslation_dataset.py new file mode 100644 index 0000000..8f70c90 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/backtranslation_dataset.py @@ -0,0 +1,165 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq import utils + +from . import FairseqDataset + + +def backtranslate_samples(samples, collate_fn, generate_fn, cuda=True): + """Backtranslate a list of samples. + + Given an input (*samples*) of the form: + + [{'id': 1, 'source': 'hallo welt'}] + + this will return: + + [{'id': 1, 'source': 'hello world', 'target': 'hallo welt'}] + + Args: + samples (List[dict]): samples to backtranslate. Individual samples are + expected to have a 'source' key, which will become the 'target' + after backtranslation. + collate_fn (callable): function to collate samples into a mini-batch + generate_fn (callable): function to generate backtranslations + cuda (bool): use GPU for generation (default: ``True``) + + Returns: + List[dict]: an updated list of samples with a backtranslated source + """ + collated_samples = collate_fn(samples) + s = utils.move_to_cuda(collated_samples) if cuda else collated_samples + generated_sources = generate_fn(s) + + id_to_src = {sample["id"]: sample["source"] for sample in samples} + + # Go through each tgt sentence in batch and its corresponding best + # generated hypothesis and create a backtranslation data pair + # {id: id, source: generated backtranslation, target: original tgt} + return [ + { + "id": id.item(), + "target": id_to_src[id.item()], + "source": hypos[0]["tokens"].cpu(), + } + for id, hypos in zip(collated_samples["id"], generated_sources) + ] + + +class BacktranslationDataset(FairseqDataset): + """ + Sets up a backtranslation dataset which takes a tgt batch, generates + a src using a tgt-src backtranslation function (*backtranslation_fn*), + and returns the corresponding `{generated src, input tgt}` batch. + + Args: + tgt_dataset (~fairseq.data.FairseqDataset): the dataset to be + backtranslated. Only the source side of this dataset will be used. + After backtranslation, the source sentences in this dataset will be + returned as the targets. + src_dict (~fairseq.data.Dictionary): the dictionary of backtranslated + sentences. + tgt_dict (~fairseq.data.Dictionary, optional): the dictionary of + sentences to be backtranslated. + backtranslation_fn (callable, optional): function to call to generate + backtranslations. This is typically the `generate` method of a + :class:`~fairseq.sequence_generator.SequenceGenerator` object. + Pass in None when it is not available at initialization time, and + use set_backtranslation_fn function to set it when available. + output_collater (callable, optional): function to call on the + backtranslated samples to create the final batch + (default: ``tgt_dataset.collater``). + cuda: use GPU for generation + """ + + def __init__( + self, + tgt_dataset, + src_dict, + tgt_dict=None, + backtranslation_fn=None, + output_collater=None, + cuda=True, + **kwargs + ): + self.tgt_dataset = tgt_dataset + self.backtranslation_fn = backtranslation_fn + self.output_collater = ( + output_collater if output_collater is not None else tgt_dataset.collater + ) + self.cuda = cuda if torch.cuda.is_available() else False + self.src_dict = src_dict + self.tgt_dict = tgt_dict + + def __getitem__(self, index): + """ + Returns a single sample from *tgt_dataset*. Note that backtranslation is + not applied in this step; use :func:`collater` instead to backtranslate + a batch of samples. + """ + return self.tgt_dataset[index] + + def __len__(self): + return len(self.tgt_dataset) + + def set_backtranslation_fn(self, backtranslation_fn): + self.backtranslation_fn = backtranslation_fn + + def collater(self, samples): + """Merge and backtranslate a list of samples to form a mini-batch. + + Using the samples from *tgt_dataset*, load a collated target sample to + feed to the backtranslation model. Then take the backtranslation with + the best score as the source and the original input as the target. + + Note: we expect *tgt_dataset* to provide a function `collater()` that + will collate samples into the format expected by *backtranslation_fn*. + After backtranslation, we will feed the new list of samples (i.e., the + `(backtranslated source, original source)` pairs) to *output_collater* + and return the result. + + Args: + samples (List[dict]): samples to backtranslate and collate + + Returns: + dict: a mini-batch with keys coming from *output_collater* + """ + if samples[0].get("is_dummy", False): + return samples + samples = backtranslate_samples( + samples=samples, + collate_fn=self.tgt_dataset.collater, + generate_fn=(lambda net_input: self.backtranslation_fn(net_input)), + cuda=self.cuda, + ) + return self.output_collater(samples) + + def num_tokens(self, index): + """Just use the tgt dataset num_tokens""" + return self.tgt_dataset.num_tokens(index) + + def ordered_indices(self): + """Just use the tgt dataset ordered_indices""" + return self.tgt_dataset.ordered_indices() + + def size(self, index): + """Return an example's size as a float or tuple. This value is used + when filtering a dataset with ``--max-positions``. + + Note: we use *tgt_dataset* to approximate the length of the source + sentence, since we do not know the actual length until after + backtranslation. + """ + tgt_size = self.tgt_dataset.size(index)[0] + return (tgt_size, tgt_size) + + @property + def supports_prefetch(self): + return getattr(self.tgt_dataset, "supports_prefetch", False) + + def prefetch(self, indices): + return self.tgt_dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/fairseq/data/base_wrapper_dataset.py b/SpeechT5/fairseq/fairseq/data/base_wrapper_dataset.py new file mode 100644 index 0000000..134d398 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/base_wrapper_dataset.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from torch.utils.data.dataloader import default_collate + +from . import FairseqDataset + + +class BaseWrapperDataset(FairseqDataset): + def __init__(self, dataset): + super().__init__() + self.dataset = dataset + + def __getitem__(self, index): + return self.dataset[index] + + def __len__(self): + return len(self.dataset) + + def collater(self, samples): + if hasattr(self.dataset, "collater"): + return self.dataset.collater(samples) + else: + return default_collate(samples) + + @property + def sizes(self): + return self.dataset.sizes + + def num_tokens(self, index): + return self.dataset.num_tokens(index) + + def size(self, index): + return self.dataset.size(index) + + def ordered_indices(self): + return self.dataset.ordered_indices() + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def attr(self, attr: str, index: int): + return self.dataset.attr(attr, index) + + def prefetch(self, indices): + self.dataset.prefetch(indices) + + def get_batch_shapes(self): + return self.dataset.get_batch_shapes() + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + return self.dataset.batch_by_size( + indices, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + + def filter_indices_by_size(self, indices, max_sizes): + return self.dataset.filter_indices_by_size(indices, max_sizes) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return self.dataset.can_reuse_epoch_itr_across_epochs + + def set_epoch(self, epoch): + super().set_epoch(epoch) + if hasattr(self.dataset, "set_epoch"): + self.dataset.set_epoch(epoch) diff --git a/SpeechT5/fairseq/fairseq/data/bucket_pad_length_dataset.py b/SpeechT5/fairseq/fairseq/data/bucket_pad_length_dataset.py new file mode 100644 index 0000000..0f94100 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/bucket_pad_length_dataset.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch.nn.functional as F +from fairseq.data import BaseWrapperDataset +from fairseq.data.data_utils import get_buckets, get_bucketed_sizes + + +class BucketPadLengthDataset(BaseWrapperDataset): + """ + Bucket and pad item lengths to the nearest bucket size. This can be used to + reduce the number of unique batch shapes, which is important on TPUs since + each new batch shape requires a recompilation. + + Args: + dataset (FairseqDatset): dataset to bucket + sizes (List[int]): all item sizes + num_buckets (int): number of buckets to create + pad_idx (int): padding symbol + left_pad (bool): if True, pad on the left; otherwise right pad + """ + + def __init__( + self, + dataset, + sizes, + num_buckets, + pad_idx, + left_pad, + tensor_key=None, + ): + super().__init__(dataset) + self.pad_idx = pad_idx + self.left_pad = left_pad + + assert num_buckets > 0 + self.buckets = get_buckets(sizes, num_buckets) + self._bucketed_sizes = get_bucketed_sizes(sizes, self.buckets) + self._tensor_key = tensor_key + + def _set_tensor(self, item, val): + if self._tensor_key is None: + return val + item[self._tensor_key] = val + return item + + def _get_tensor(self, item): + if self._tensor_key is None: + return item + return item[self._tensor_key] + + def _pad(self, tensor, bucket_size, dim=-1): + num_pad = bucket_size - tensor.size(dim) + return F.pad( + tensor, + (num_pad if self.left_pad else 0, 0 if self.left_pad else num_pad), + value=self.pad_idx, + ) + + def __getitem__(self, index): + item = self.dataset[index] + bucket_size = self._bucketed_sizes[index] + tensor = self._get_tensor(item) + padded = self._pad(tensor, bucket_size) + return self._set_tensor(item, padded) + + @property + def sizes(self): + return self._bucketed_sizes + + def num_tokens(self, index): + return self._bucketed_sizes[index] + + def size(self, index): + return self._bucketed_sizes[index] diff --git a/SpeechT5/fairseq/fairseq/data/colorize_dataset.py b/SpeechT5/fairseq/fairseq/data/colorize_dataset.py new file mode 100644 index 0000000..6ef097b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/colorize_dataset.py @@ -0,0 +1,25 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from . import BaseWrapperDataset + + +class ColorizeDataset(BaseWrapperDataset): + """ Adds 'colors' property to net input that is obtained from the provided color getter for use by models """ + + def __init__(self, dataset, color_getter): + super().__init__(dataset) + self.color_getter = color_getter + + def collater(self, samples): + base_collate = super().collater(samples) + if len(base_collate) > 0: + base_collate["net_input"]["colors"] = torch.tensor( + list(self.color_getter(self.dataset, s["id"]) for s in samples), + dtype=torch.long, + ) + return base_collate diff --git a/SpeechT5/fairseq/fairseq/data/concat_dataset.py b/SpeechT5/fairseq/fairseq/data/concat_dataset.py new file mode 100644 index 0000000..01a4078 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/concat_dataset.py @@ -0,0 +1,124 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import bisect + +import numpy as np +from torch.utils.data.dataloader import default_collate + +from . import FairseqDataset + + +class ConcatDataset(FairseqDataset): + @staticmethod + def cumsum(sequence, sample_ratios): + r, s = [], 0 + for e, ratio in zip(sequence, sample_ratios): + curr_len = int(ratio * len(e)) + r.append(curr_len + s) + s += curr_len + return r + + def __init__(self, datasets, sample_ratios=1): + super(ConcatDataset, self).__init__() + assert len(datasets) > 0, "datasets should not be an empty iterable" + self.datasets = list(datasets) + if isinstance(sample_ratios, int): + sample_ratios = [sample_ratios] * len(self.datasets) + self.sample_ratios = sample_ratios + self.cumulative_sizes = self.cumsum(self.datasets, sample_ratios) + self.real_sizes = [len(d) for d in self.datasets] + + def __len__(self): + return self.cumulative_sizes[-1] + + def __getitem__(self, idx): + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx][sample_idx] + + def _get_dataset_and_sample_index(self, idx: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + sample_idx = sample_idx % self.real_sizes[dataset_idx] + return dataset_idx, sample_idx + + def collater(self, samples, **extra_args): + # For now only supports datasets with same underlying collater implementations + if hasattr(self.datasets[0], "collater"): + return self.datasets[0].collater(samples, **extra_args) + else: + return default_collate(samples, **extra_args) + + def size(self, idx: int): + """ + Return an example's size as a float or tuple. + """ + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx].size(sample_idx) + + def num_tokens(self, index: int): + return np.max(self.size(index)) + + def attr(self, attr: str, index: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, index) + return getattr(self.datasets[dataset_idx], attr, None) + + @property + def sizes(self): + _dataset_sizes = [] + for ds, sr in zip(self.datasets, self.sample_ratios): + if isinstance(ds.sizes, np.ndarray): + _dataset_sizes.append(np.tile(ds.sizes, sr)) + else: + # Only support underlying dataset with single size array. + assert isinstance(ds.sizes, list) + _dataset_sizes.append(np.tile(ds.sizes[0], sr)) + return np.concatenate(_dataset_sizes) + + @property + def supports_prefetch(self): + return all(d.supports_prefetch for d in self.datasets) + + def ordered_indices(self): + """ + Returns indices sorted by length. So less padding is needed. + """ + if isinstance(self.sizes, np.ndarray) and len(self.sizes.shape) > 1: + # special handling for concatenating lang_pair_datasets + indices = np.arange(len(self)) + sizes = self.sizes + tgt_sizes = ( + sizes[:, 1] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else None + ) + src_sizes = ( + sizes[:, 0] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else sizes + ) + # sort by target length, then source length + if tgt_sizes is not None: + indices = indices[np.argsort(tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(src_sizes[indices], kind="mergesort")] + else: + return np.argsort(self.sizes) + + def prefetch(self, indices): + frm = 0 + for to, ds in zip(self.cumulative_sizes, self.datasets): + real_size = len(ds) + if getattr(ds, "supports_prefetch", False): + ds.prefetch([(i - frm) % real_size for i in indices if frm <= i < to]) + frm = to + + @property + def can_reuse_epoch_itr_across_epochs(self): + return all(d.can_reuse_epoch_itr_across_epochs for d in self.datasets) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.datasets: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) diff --git a/SpeechT5/fairseq/fairseq/data/concat_sentences_dataset.py b/SpeechT5/fairseq/fairseq/data/concat_sentences_dataset.py new file mode 100644 index 0000000..625a293 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/concat_sentences_dataset.py @@ -0,0 +1,54 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from . import FairseqDataset + + +class ConcatSentencesDataset(FairseqDataset): + def __init__(self, *datasets): + super().__init__() + self.datasets = datasets + assert all( + len(ds) == len(datasets[0]) for ds in datasets + ), "datasets must have the same length" + + def __getitem__(self, index): + return torch.cat([ds[index] for ds in self.datasets]) + + def __len__(self): + return len(self.datasets[0]) + + def collater(self, samples): + return self.datasets[0].collater(samples) + + @property + def sizes(self): + return sum(ds.sizes for ds in self.datasets) + + def num_tokens(self, index): + return sum(ds.num_tokens(index) for ds in self.datasets) + + def size(self, index): + return sum(ds.size(index) for ds in self.datasets) + + def ordered_indices(self): + return self.datasets[0].ordered_indices() + + @property + def supports_prefetch(self): + return any(getattr(ds, "supports_prefetch", False) for ds in self.datasets) + + def prefetch(self, indices): + for ds in self.datasets: + if getattr(ds, "supports_prefetch", False): + ds.prefetch(indices) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.datasets: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) diff --git a/SpeechT5/fairseq/fairseq/data/data_utils.py b/SpeechT5/fairseq/fairseq/data/data_utils.py new file mode 100644 index 0000000..b3de576 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/data_utils.py @@ -0,0 +1,595 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +try: + from collections.abc import Iterable +except ImportError: + from collections import Iterable +import contextlib +import itertools +import logging +import re +import warnings +from typing import Optional, Tuple + +import numpy as np +import torch + +from fairseq.file_io import PathManager +from fairseq import utils +import os + +logger = logging.getLogger(__name__) + + +def infer_language_pair(path): + """Infer language pair from filename: <split>.<lang1>-<lang2>.(...).idx""" + src, dst = None, None + for filename in PathManager.ls(path): + parts = filename.split(".") + if len(parts) >= 3 and len(parts[1].split("-")) == 2: + return parts[1].split("-") + return src, dst + + +def collate_tokens( + values, + pad_idx, + eos_idx=None, + left_pad=False, + move_eos_to_beginning=False, + pad_to_length=None, + pad_to_multiple=1, + pad_to_bsz=None, +): + """Convert a list of 1d tensors into a padded 2d tensor.""" + size = max(v.size(0) for v in values) + size = size if pad_to_length is None else max(size, pad_to_length) + if pad_to_multiple != 1 and size % pad_to_multiple != 0: + size = int(((size - 0.1) // pad_to_multiple + 1) * pad_to_multiple) + + batch_size = len(values) if pad_to_bsz is None else max(len(values), pad_to_bsz) + res = values[0].new(batch_size, size).fill_(pad_idx) + + def copy_tensor(src, dst): + assert dst.numel() == src.numel() + if move_eos_to_beginning: + if eos_idx is None: + # if no eos_idx is specified, then use the last token in src + dst[0] = src[-1] + else: + dst[0] = eos_idx + dst[1:] = src[:-1] + else: + dst.copy_(src) + + for i, v in enumerate(values): + copy_tensor(v, res[i][size - len(v) :] if left_pad else res[i][: len(v)]) + return res + +def load_indexed_dataset( + path, dictionary=None, dataset_impl=None, combine=False, default="cached" +): + """A helper function for loading indexed datasets. + + Args: + path (str): path to indexed dataset (e.g., 'data-bin/train') + dictionary (~fairseq.data.Dictionary): data dictionary + dataset_impl (str, optional): which dataset implementation to use. If + not provided, it will be inferred automatically. For legacy indexed + data we use the 'cached' implementation by default. + combine (bool, optional): automatically load and combine multiple + datasets. For example, if *path* is 'data-bin/train', then we will + combine 'data-bin/train', 'data-bin/train1', ... and return a + single ConcatDataset instance. + """ + import fairseq.data.indexed_dataset as indexed_dataset + from fairseq.data.concat_dataset import ConcatDataset + + datasets = [] + for k in itertools.count(): + path_k = path + (str(k) if k > 0 else "") + try: + path_k = indexed_dataset.get_indexed_dataset_to_local(path_k) + except Exception as e: + if "StorageException: [404] Path not found" in str(e): + logger.warning(f"path_k: {e} not found") + else: + raise e + + dataset_impl_k = dataset_impl + if dataset_impl_k is None: + dataset_impl_k = indexed_dataset.infer_dataset_impl(path_k) + dataset = indexed_dataset.make_dataset( + path_k, + impl=dataset_impl_k or default, + fix_lua_indexing=True, + dictionary=dictionary, + ) + if dataset is None: + break + logger.info("loaded {:,} examples from: {}".format(len(dataset), path_k)) + datasets.append(dataset) + if not combine: + break + if len(datasets) == 0: + return None + elif len(datasets) == 1: + return datasets[0] + else: + return ConcatDataset(datasets) + + +@contextlib.contextmanager +def numpy_seed(seed, *addl_seeds): + """Context manager which seeds the NumPy PRNG with the specified seed and + restores the state afterward""" + if seed is None: + yield + return + if len(addl_seeds) > 0: + seed = int(hash((seed, *addl_seeds)) % 1e6) + state = np.random.get_state() + np.random.seed(seed) + try: + yield + finally: + np.random.set_state(state) + + +def collect_filtered(function, iterable, filtered): + """ + Similar to :func:`filter` but collects filtered elements in ``filtered``. + + Args: + function (callable): function that returns ``False`` for elements that + should be filtered + iterable (iterable): iterable to filter + filtered (list): list to store filtered elements + """ + for el in iterable: + if function(el): + yield el + else: + filtered.append(el) + + +def _filter_by_size_dynamic(indices, size_fn, max_positions, raise_exception=False): + def compare_leq(a, b): + return a <= b if not isinstance(a, tuple) else max(a) <= b + + def check_size(idx): + if isinstance(max_positions, float) or isinstance(max_positions, int): + return size_fn(idx) <= max_positions + elif isinstance(max_positions, dict): + idx_size = size_fn(idx) + assert isinstance(idx_size, dict) + intersect_keys = set(max_positions.keys()) & set(idx_size.keys()) + return all( + all( + a is None or b is None or a <= b + for a, b in zip(idx_size[key], max_positions[key]) + ) + for key in intersect_keys + ) + else: + # For MultiCorpusSampledDataset, will generalize it later + if not isinstance(size_fn(idx), Iterable): + return all(size_fn(idx) <= b for b in max_positions) + return all( + a is None or b is None or a <= b + for a, b in zip(size_fn(idx), max_positions) + ) + + ignored = [] + itr = collect_filtered(check_size, indices, ignored) + indices = np.fromiter(itr, dtype=np.int64, count=-1) + return indices, ignored + + +def filter_by_size(indices, dataset, max_positions, raise_exception=False): + """ + [deprecated] Filter indices based on their size. + Use `FairseqDataset::filter_indices_by_size` instead. + + Args: + indices (List[int]): ordered list of dataset indices + dataset (FairseqDataset): fairseq dataset instance + max_positions (tuple): filter elements larger than this size. + Comparisons are done component-wise. + raise_exception (bool, optional): if ``True``, raise an exception if + any elements are filtered (default: False). + """ + warnings.warn( + "data_utils.filter_by_size is deprecated. " + "Use `FairseqDataset::filter_indices_by_size` instead.", + stacklevel=2, + ) + if isinstance(max_positions, float) or isinstance(max_positions, int): + if hasattr(dataset, "sizes") and isinstance(dataset.sizes, np.ndarray): + ignored = indices[dataset.sizes[indices] > max_positions].tolist() + indices = indices[dataset.sizes[indices] <= max_positions] + elif ( + hasattr(dataset, "sizes") + and isinstance(dataset.sizes, list) + and len(dataset.sizes) == 1 + ): + ignored = indices[dataset.sizes[0][indices] > max_positions].tolist() + indices = indices[dataset.sizes[0][indices] <= max_positions] + else: + indices, ignored = _filter_by_size_dynamic( + indices, dataset.size, max_positions + ) + else: + indices, ignored = _filter_by_size_dynamic(indices, dataset.size, max_positions) + + if len(ignored) > 0 and raise_exception: + raise Exception( + ( + "Size of sample #{} is invalid (={}) since max_positions={}, " + "skip this example with --skip-invalid-size-inputs-valid-test" + ).format(ignored[0], dataset.size(ignored[0]), max_positions) + ) + if len(ignored) > 0: + logger.warning( + ( + "{} samples have invalid sizes and will be skipped, " + "max_positions={}, first few sample ids={}" + ).format(len(ignored), max_positions, ignored[:10]) + ) + return indices + + +def filter_paired_dataset_indices_by_size(src_sizes, tgt_sizes, indices, max_sizes): + """Filter a list of sample indices. Remove those that are longer + than specified in max_sizes. + + Args: + indices (np.array): original array of sample indices + max_sizes (int or list[int] or tuple[int]): max sample size, + can be defined separately for src and tgt (then list or tuple) + + Returns: + np.array: filtered sample array + list: list of removed indices + """ + if max_sizes is None: + return indices, [] + if type(max_sizes) in (int, float): + max_src_size, max_tgt_size = max_sizes, max_sizes + else: + max_src_size, max_tgt_size = max_sizes + if tgt_sizes is None: + ignored = indices[src_sizes[indices] > max_src_size] + else: + ignored = indices[ + (src_sizes[indices] > max_src_size) | (tgt_sizes[indices] > max_tgt_size) + ] + if len(ignored) > 0: + if tgt_sizes is None: + indices = indices[src_sizes[indices] <= max_src_size] + else: + indices = indices[ + (src_sizes[indices] <= max_src_size) + & (tgt_sizes[indices] <= max_tgt_size) + ] + return indices, ignored.tolist() + + +def batch_by_size( + indices, + num_tokens_fn, + num_tokens_vec=None, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + fixed_shapes=None, +): + """ + Yield mini-batches of indices bucketed by size. Batches may contain + sequences of different lengths. + + Args: + indices (List[int]): ordered list of dataset indices + num_tokens_fn (callable): function that returns the number of tokens at + a given index + num_tokens_vec (List[int], optional): precomputed vector of the number + of tokens for each index in indices (to enable faster batch generation) + max_tokens (int, optional): max number of tokens in each batch + (default: None). + max_sentences (int, optional): max number of sentences in each + batch (default: None). + required_batch_size_multiple (int, optional): require batch size to + be less than N or a multiple of N (default: 1). + fixed_shapes (List[Tuple[int, int]], optional): if given, batches will + only be created with the given shapes. *max_sentences* and + *required_batch_size_multiple* will be ignored (default: None). + """ + try: + from fairseq.data.data_utils_fast import ( + batch_by_size_fn, + batch_by_size_vec, + batch_fixed_shapes_fast, + ) + except ImportError: + raise ImportError( + "Please build Cython components with: " + "`python setup.py build_ext --inplace`" + ) + except ValueError: + raise ValueError( + "Please build (or rebuild) Cython components with `python setup.py build_ext --inplace`." + ) + + # added int() to avoid TypeError: an integer is required + max_tokens = ( + int(max_tokens) if max_tokens is not None else -1 + ) + max_sentences = max_sentences if max_sentences is not None else -1 + bsz_mult = required_batch_size_multiple + + if not isinstance(indices, np.ndarray): + indices = np.fromiter(indices, dtype=np.int64, count=-1) + + if num_tokens_vec is not None and not isinstance(num_tokens_vec, np.ndarray): + num_tokens_vec = np.fromiter(num_tokens_vec, dtype=np.int64, count=-1) + + if fixed_shapes is None: + if num_tokens_vec is None: + return batch_by_size_fn( + indices, + num_tokens_fn, + max_tokens, + max_sentences, + bsz_mult, + ) + else: + return batch_by_size_vec( + indices, + num_tokens_vec, + max_tokens, + max_sentences, + bsz_mult, + ) + + else: + fixed_shapes = np.array(fixed_shapes, dtype=np.int64) + sort_order = np.lexsort( + [ + fixed_shapes[:, 1].argsort(), # length + fixed_shapes[:, 0].argsort(), # bsz + ] + ) + fixed_shapes_sorted = fixed_shapes[sort_order] + return batch_fixed_shapes_fast(indices, num_tokens_fn, fixed_shapes_sorted) + + +def post_process(sentence: str, symbol: str): + if symbol == "sentencepiece": + sentence = sentence.replace(" ", "").replace("\u2581", " ").strip() + elif symbol == "wordpiece": + sentence = sentence.replace(" ", "").replace("_", " ").strip() + elif symbol == "letter": + sentence = sentence.replace(" ", "").replace("|", " ").strip() + elif symbol == "silence": + import re + sentence = sentence.replace("<SIL>", "") + sentence = re.sub(' +', ' ', sentence).strip() + elif symbol == "_EOW": + sentence = sentence.replace(" ", "").replace("_EOW", " ").strip() + elif symbol in {"subword_nmt", "@@ ", "@@"}: + if symbol == "subword_nmt": + symbol = "@@ " + sentence = (sentence + " ").replace(symbol, "").rstrip() + elif symbol == "none": + pass + elif symbol is not None: + raise NotImplementedError(f"Unknown post_process option: {symbol}") + return sentence + + +def compute_mask_indices( + shape: Tuple[int, int], + padding_mask: Optional[torch.Tensor], + mask_prob: float, + mask_length: int, + mask_type: str = "static", + mask_other: float = 0.0, + min_masks: int = 0, + no_overlap: bool = False, + min_space: int = 0, +) -> np.ndarray: + """ + Computes random mask spans for a given shape + + Args: + shape: the the shape for which to compute masks. + should be of size 2 where first element is batch size and 2nd is timesteps + padding_mask: optional padding mask of the same size as shape, which will prevent masking padded elements + mask_prob: probability for each token to be chosen as start of the span to be masked. this will be multiplied by + number of timesteps divided by length of mask span to mask approximately this percentage of all elements. + however due to overlaps, the actual number will be smaller (unless no_overlap is True) + mask_type: how to compute mask lengths + static = fixed size + uniform = sample from uniform distribution [mask_other, mask_length*2] + normal = sample from normal distribution with mean mask_length and stdev mask_other. mask is min 1 element + poisson = sample from possion distribution with lambda = mask length + min_masks: minimum number of masked spans + no_overlap: if false, will switch to an alternative recursive algorithm that prevents spans from overlapping + min_space: only used if no_overlap is True, this is how many elements to keep unmasked between spans + """ + + bsz, all_sz = shape + mask = np.full((bsz, all_sz), False) + + all_num_mask = int( + # add a random number for probabilistic rounding + mask_prob * all_sz / float(mask_length) + + np.random.rand() + ) + + all_num_mask = max(min_masks, all_num_mask) + + mask_idcs = [] + for i in range(bsz): + if padding_mask is not None: + sz = all_sz - padding_mask[i].long().sum().item() + num_mask = int( + # add a random number for probabilistic rounding + mask_prob * sz / float(mask_length) + + np.random.rand() + ) + num_mask = max(min_masks, num_mask) + else: + sz = all_sz + num_mask = all_num_mask + + if mask_type == "static": + lengths = np.full(num_mask, mask_length) + elif mask_type == "uniform": + lengths = np.random.randint(mask_other, mask_length * 2 + 1, size=num_mask) + elif mask_type == "normal": + lengths = np.random.normal(mask_length, mask_other, size=num_mask) + lengths = [max(1, int(round(x))) for x in lengths] + elif mask_type == "poisson": + lengths = np.random.poisson(mask_length, size=num_mask) + lengths = [int(round(x)) for x in lengths] + else: + raise Exception("unknown mask selection " + mask_type) + + if sum(lengths) == 0: + lengths[0] = min(mask_length, sz - 1) + + if no_overlap: + mask_idc = [] + + def arrange(s, e, length, keep_length): + span_start = np.random.randint(s, e - length) + mask_idc.extend(span_start + i for i in range(length)) + + new_parts = [] + if span_start - s - min_space >= keep_length: + new_parts.append((s, span_start - min_space + 1)) + if e - span_start - keep_length - min_space > keep_length: + new_parts.append((span_start + length + min_space, e)) + return new_parts + + parts = [(0, sz)] + min_length = min(lengths) + for length in sorted(lengths, reverse=True): + lens = np.fromiter( + (e - s if e - s >= length + min_space else 0 for s, e in parts), + np.int, + ) + l_sum = np.sum(lens) + if l_sum == 0: + break + probs = lens / np.sum(lens) + c = np.random.choice(len(parts), p=probs) + s, e = parts.pop(c) + parts.extend(arrange(s, e, length, min_length)) + mask_idc = np.asarray(mask_idc) + else: + min_len = min(lengths) + if sz - min_len <= num_mask: + min_len = sz - num_mask - 1 + + mask_idc = np.random.choice(sz - min_len, num_mask, replace=False) + + mask_idc = np.asarray( + [ + mask_idc[j] + offset + for j in range(len(mask_idc)) + for offset in range(lengths[j]) + ] + ) + + mask_idcs.append(np.unique(mask_idc[mask_idc < sz])) + + min_len = min([len(m) for m in mask_idcs]) + for i, mask_idc in enumerate(mask_idcs): + if len(mask_idc) > min_len: + mask_idc = np.random.choice(mask_idc, min_len, replace=False) + mask[i, mask_idc] = True + + return mask + + +def get_mem_usage(): + try: + import psutil + + mb = 1024 * 1024 + return f"used={psutil.virtual_memory().used / mb}Mb; avail={psutil.virtual_memory().available / mb}Mb" + except ImportError: + return "N/A" + + +# lens: torch.LongTensor +# returns: torch.BoolTensor +def lengths_to_padding_mask(lens): + bsz, max_lens = lens.size(0), torch.max(lens).item() + mask = torch.arange(max_lens).to(lens.device).view(1, max_lens) + mask = mask.expand(bsz, -1) >= lens.view(bsz, 1).expand(-1, max_lens) + return mask + + +# lens: torch.LongTensor +# returns: torch.BoolTensor +def lengths_to_mask(lens): + return ~lengths_to_padding_mask(lens) + + +def get_buckets(sizes, num_buckets): + buckets = np.unique( + np.percentile( + sizes, + np.linspace(0, 100, num_buckets + 1), + interpolation='lower', + )[1:] + ) + return buckets + + +def get_bucketed_sizes(orig_sizes, buckets): + sizes = np.copy(orig_sizes) + assert np.min(sizes) >= 0 + start_val = -1 + for end_val in buckets: + mask = (sizes > start_val) & (sizes <= end_val) + sizes[mask] = end_val + start_val = end_val + return sizes + + + +def _find_extra_valid_paths(dataset_path: str) -> set: + paths = utils.split_paths(dataset_path) + all_valid_paths = set() + for sub_dir in paths: + contents = PathManager.ls(sub_dir) + valid_paths = [c for c in contents if re.match("valid*[0-9].*", c) is not None] + all_valid_paths |= {os.path.basename(p) for p in valid_paths} + # Remove .bin, .idx etc + roots = {os.path.splitext(p)[0] for p in all_valid_paths} + return roots + + +def raise_if_valid_subsets_unintentionally_ignored(train_cfg) -> None: + """Raises if there are paths matching 'valid*[0-9].*' which are not combined or ignored.""" + if ( + train_cfg.dataset.ignore_unused_valid_subsets + or train_cfg.dataset.combine_valid_subsets + or train_cfg.dataset.disable_validation + or not hasattr(train_cfg.task, "data") + ): + return + other_paths = _find_extra_valid_paths(train_cfg.task.data) + specified_subsets = train_cfg.dataset.valid_subset.split(",") + ignored_paths = [p for p in other_paths if p not in specified_subsets] + if ignored_paths: + advice = "Set --combine-val to combine them or --ignore-unused-valid-subsets to ignore them." + msg = f"Valid paths {ignored_paths} will be ignored. {advice}" + raise ValueError(msg) diff --git a/SpeechT5/fairseq/fairseq/data/data_utils_fast.pyx b/SpeechT5/fairseq/fairseq/data/data_utils_fast.pyx new file mode 100644 index 0000000..c61f31d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/data_utils_fast.pyx @@ -0,0 +1,178 @@ +# cython: language_level=3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np + +cimport cython +cimport numpy as np + +from libc.stdint cimport int32_t, int64_t +from libcpp cimport bool as bool_t + +ctypedef int64_t DTYPE_t + +@cython.cdivision(True) +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef list batch_by_size_vec( + np.ndarray[int64_t, ndim=1] indices, + np.ndarray[int64_t, ndim=1] num_tokens_vec, + int64_t max_tokens, + int64_t max_sentences, + int32_t bsz_mult, +): + if indices.shape[0] == 0: + return [] + + assert max_tokens <= 0 or np.max(num_tokens_vec) <= max_tokens, ( + f"Sentences lengths should not exceed max_tokens={max_tokens}" + ) + + cdef int32_t indices_len = indices.shape[0] + cdef np.ndarray[int32_t, ndim=1] batches_ends = \ + np.zeros(indices_len, dtype=np.int32) + cdef int32_t[:] batches_ends_view = batches_ends + cdef int64_t[:] num_tokens_view = num_tokens_vec + + cdef int32_t pos = 0 + cdef int32_t new_batch_end = 0 + + cdef int64_t new_batch_max_tokens = 0 + cdef int32_t new_batch_sentences = 0 + cdef int64_t new_batch_num_tokens = 0 + + cdef bool_t overflow = False + cdef bool_t size_matches_with_bsz_mult = False + + cdef int32_t batches_count = 0 + cdef int32_t batch_start = 0 + cdef int64_t tail_max_tokens = 0 + cdef int64_t batch_max_tokens = 0 + + for pos in range(indices_len): + # At every pos we keep stats about the last complete batch [batch_start:batch_end), + # and tail [batch_end:pos]. + # 1) Every time when (batch + tail) forms a valid batch + # (according to max_tokens, max_sentences and bsz_mult) we append tail to batch. + # 2) When (batch+tail) violates max_tokens or max_sentences constraints + # we finalize running batch, and tail becomes a new batch. + # 3) There is a corner case when tail also violates constraints. + # In that situation [batch_end:pos-1] (tail without the current pos) + # gets added to the finalized batches, while [pos:pos] becomes a new tail. + # + # Important: For the sake of performance try to avoid using function calls within this loop. + + tail_max_tokens = tail_max_tokens \ + if tail_max_tokens > num_tokens_view[pos] \ + else num_tokens_view[pos] + new_batch_end = pos + 1 + new_batch_max_tokens = batch_max_tokens \ + if batch_max_tokens > tail_max_tokens \ + else tail_max_tokens + new_batch_sentences = new_batch_end - batch_start + new_batch_num_tokens = new_batch_sentences * new_batch_max_tokens + + overflow = (new_batch_sentences > max_sentences > 0 or + new_batch_num_tokens > max_tokens > 0) + size_matches_with_bsz_mult = (new_batch_sentences < bsz_mult or + new_batch_sentences % bsz_mult == 0) + + if overflow: + tail_num_tokens = tail_max_tokens * \ + (new_batch_end - batches_ends_view[batches_count]) + tail_overflow = tail_num_tokens > max_tokens > 0 + # In case of a tail overflow finalize two batches + if tail_overflow: + batches_count += 1 + batches_ends_view[batches_count] = pos + tail_max_tokens = num_tokens_view[pos] + batch_start = batches_ends_view[batches_count] + batches_count += 1 + new_batch_max_tokens = tail_max_tokens + + if overflow or size_matches_with_bsz_mult: + batches_ends_view[batches_count] = new_batch_end + batch_max_tokens = new_batch_max_tokens + tail_max_tokens = 0 + if batches_ends_view[batches_count] != indices_len: + batches_count += 1 + # Memory and time-efficient split + return np.split(indices, batches_ends[:batches_count]) + + +@cython.boundscheck(False) +@cython.wraparound(False) +cpdef list batch_by_size_fn( + np.ndarray[DTYPE_t, ndim=1] indices, + num_tokens_fn, + int64_t max_tokens, + int64_t max_sentences, + int32_t bsz_mult, +): + cdef int32_t indices_len = indices.shape[0] + cdef np.ndarray[int64_t, ndim=1] num_tokens_vec = np.zeros(indices_len, + dtype=np.int64) + cdef DTYPE_t[:] indices_view = indices + cdef DTYPE_t[:] num_tokens_vec_view = num_tokens_vec + cdef int64_t pos + for pos in range(indices_len): + num_tokens_vec[pos] = num_tokens_fn(indices_view[pos]) + return batch_by_size_vec(indices, num_tokens_vec, max_tokens, + max_sentences, bsz_mult,) + + +cdef _find_valid_shape( + DTYPE_t[:, :] shapes_view, + int64_t num_sentences, + int64_t num_tokens, +): + """Return index of first valid shape of -1 if none is found.""" + for i in range(shapes_view.shape[0]): + if num_sentences <= shapes_view[i][0] and num_tokens <= shapes_view[i][1]: + return i + return -1 + + +@cython.cdivision(True) +cpdef list batch_fixed_shapes_fast( + np.ndarray[DTYPE_t, ndim=1] indices, + num_tokens_fn, + np.ndarray[DTYPE_t, ndim=2] fixed_shapes_sorted, +): + cdef int64_t sample_len = 0 + cdef list sample_lens = [] + cdef list batch = [] + cdef list batches = [] + cdef int64_t mod_len + cdef int64_t i + cdef int64_t idx + cdef int64_t num_tokens + cdef DTYPE_t[:] indices_view = indices + cdef DTYPE_t[:, :] shapes_view = fixed_shapes_sorted + + for i in range(len(indices_view)): + idx = indices_view[i] + num_tokens = num_tokens_fn(idx) + sample_lens.append(num_tokens) + sample_len = max(sample_len, num_tokens) + + shape_idx = _find_valid_shape(shapes_view, len(batch) + 1, sample_len) + if shape_idx == -1: + batches.append(batch) + batch = [] + sample_lens = [] + sample_len = 0 + shapes_view = fixed_shapes_sorted + elif shape_idx > 0: + # small optimization for the next call to _find_valid_shape + shapes_view = shapes_view[shape_idx:] + + batch.append(idx) + + if len(batch) > 0: + batches.append(batch) + + return batches diff --git a/SpeechT5/fairseq/fairseq/data/denoising_dataset.py b/SpeechT5/fairseq/fairseq/data/denoising_dataset.py new file mode 100644 index 0000000..bdb62c8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/denoising_dataset.py @@ -0,0 +1,436 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import numpy as np +import torch + +from . import FairseqDataset, data_utils + + +def collate( + samples, + pad_idx, + eos_idx, + vocab, + left_pad_source=False, + left_pad_target=False, + input_feeding=True, + pad_to_length=None, +): + assert input_feeding + if len(samples) == 0: + return {} + + def merge(key, left_pad, move_eos_to_beginning=False, pad_to_length=None): + return data_utils.collate_tokens( + [s[key] for s in samples], + pad_idx, + eos_idx=None, # use eos_idx of each sample instead of vocab.eos() + left_pad=left_pad, + move_eos_to_beginning=move_eos_to_beginning, + pad_to_length=pad_to_length, + ) + + id = torch.LongTensor([s["id"] for s in samples]) + src_tokens = merge( + "source", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + # sort by descending source length + src_lengths = torch.LongTensor([s["source"].numel() for s in samples]) + src_lengths, sort_order = src_lengths.sort(descending=True) + id = id.index_select(0, sort_order) + src_tokens = src_tokens.index_select(0, sort_order) + + prev_output_tokens = None + target = None + if samples[0].get("target", None) is not None: + target = merge( + "target", + left_pad=left_pad_target, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + target = target.index_select(0, sort_order) + ntokens = sum(len(s["target"]) for s in samples) + + if input_feeding: + # we create a shifted version of targets for feeding the + # previous output token(s) into the next decoder step + prev_output_tokens = merge( + "target", + left_pad=left_pad_target, + move_eos_to_beginning=True, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + prev_output_tokens = prev_output_tokens.index_select(0, sort_order) + else: + ntokens = sum(len(s["source"]) for s in samples) + + batch = { + "id": id, + "ntokens": ntokens, + "net_input": { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + }, + "target": target, + "nsentences": samples[0]["source"].size(0), + "sort_order": sort_order, + } + if prev_output_tokens is not None: + batch["net_input"]["prev_output_tokens"] = prev_output_tokens + + return batch + + +class DenoisingDataset(FairseqDataset): + """ + A wrapper around TokenBlockDataset for BART dataset. + + Args: + dataset (TokenBlockDataset): dataset to wrap + sizes (List[int]): sentence lengths + vocab (~fairseq.data.Dictionary): vocabulary + mask_idx (int): dictionary index used for masked token + mask_whole_words: only mask whole words. This should be a byte mask + over vocab indices, indicating whether it is the beginning of a + word. We will extend any mask to encompass the whole word. + shuffle (bool, optional): shuffle the elements before batching. + Default: ``True`` + seed: Seed for random number generator for reproducibility. + args: argparse arguments. + """ + + def __init__( + self, + dataset, + sizes, + vocab, + mask_idx, + mask_whole_words, + shuffle, + seed, + args, + eos=None, + item_transform_func=None, + ): + self.dataset = dataset + + self.sizes = sizes + + self.vocab = vocab + self.shuffle = shuffle + self.seed = seed + self.mask_idx = mask_idx + self.mask_whole_word = mask_whole_words + self.mask_ratio = args.mask + self.random_ratio = args.mask_random + self.insert_ratio = args.insert + self.rotate_ratio = args.rotate + self.permute_sentence_ratio = args.permute_sentences + self.eos = eos if eos is not None else vocab.eos() + self.item_transform_func = item_transform_func + + if args.bpe != "gpt2": + self.full_stop_index = self.vocab.eos() + else: + assert args.bpe == "gpt2" + self.full_stop_index = self.vocab.index("13") + + self.replace_length = args.replace_length + if self.replace_length not in [-1, 0, 1]: + raise ValueError(f"invalid arg: replace_length={self.replace_length}") + if args.mask_length not in ["subword", "word", "span-poisson"]: + raise ValueError(f"invalid arg: mask-length={args.mask_length}") + if args.mask_length == "subword" and args.replace_length not in [0, 1]: + raise ValueError(f"if using subwords, use replace-length=1 or 0") + + self.mask_span_distribution = None + if args.mask_length == "span-poisson": + _lambda = args.poisson_lambda + + lambda_to_the_k = 1 + e_to_the_minus_lambda = math.exp(-_lambda) + k_factorial = 1 + ps = [] + for k in range(0, 128): + ps.append(e_to_the_minus_lambda * lambda_to_the_k / k_factorial) + lambda_to_the_k *= _lambda + k_factorial *= k + 1 + if ps[-1] < 0.0000001: + break + ps = torch.FloatTensor(ps) + self.mask_span_distribution = torch.distributions.Categorical(ps) + + self.epoch = 0 + + @property + def can_reuse_epoch_itr_across_epochs(self): + return True # only the noise changes, not item sizes + + def set_epoch(self, epoch, **unused): + self.epoch = epoch + + def __getitem__(self, index): + with data_utils.numpy_seed(self.seed, self.epoch, index): + tokens = self.dataset[index] + assert tokens[-1] == self.eos + source, target = tokens, tokens.clone() + + if self.permute_sentence_ratio > 0.0: + source = self.permute_sentences(source, self.permute_sentence_ratio) + + if self.mask_ratio > 0: + source = self.add_whole_word_mask(source, self.mask_ratio) + + if self.insert_ratio > 0: + source = self.add_insertion_noise(source, self.insert_ratio) + + if self.rotate_ratio > 0.0 and np.random.random() < self.rotate_ratio: + source = self.add_rolling_noise(source) + # there can additional changes to make: + if self.item_transform_func is not None: + source, target = self.item_transform_func(source, target) + + assert (source >= 0).all() + assert (source[1:-1] >= 1).all() + assert (source <= len(self.vocab)).all() + assert source[0] == self.vocab.bos() + assert source[-1] == self.eos + return { + "id": index, + "source": source, + "target": target, + } + + def __len__(self): + return len(self.dataset) + + def permute_sentences(self, source, p=1.0): + full_stops = source == self.full_stop_index + # Pretend it ends with a full stop so last span is a sentence + full_stops[-2] = 1 + + # Tokens that are full stops, where the previous token is not + sentence_ends = (full_stops[1:] * ~full_stops[:-1]).nonzero(as_tuple=False) + 2 + result = source.clone() + + num_sentences = sentence_ends.size(0) + num_to_permute = math.ceil((num_sentences * 2 * p) / 2.0) + substitutions = torch.randperm(num_sentences)[:num_to_permute] + ordering = torch.arange(0, num_sentences) + ordering[substitutions] = substitutions[torch.randperm(num_to_permute)] + + # Ignore <bos> at start + index = 1 + for i in ordering: + sentence = source[(sentence_ends[i - 1] if i > 0 else 1) : sentence_ends[i]] + result[index : index + sentence.size(0)] = sentence + index += sentence.size(0) + return result + + def word_starts(self, source): + if self.mask_whole_word is not None: + is_word_start = self.mask_whole_word.gather(0, source) + else: + is_word_start = torch.ones(source.size()) + is_word_start[0] = 0 + is_word_start[-1] = 0 + return is_word_start + + def add_whole_word_mask(self, source, p): + is_word_start = self.word_starts(source) + num_to_mask = int(math.ceil(is_word_start.float().sum() * p)) + num_inserts = 0 + if num_to_mask == 0: + return source + + if self.mask_span_distribution is not None: + lengths = self.mask_span_distribution.sample(sample_shape=(num_to_mask,)) + + # Make sure we have enough to mask + cum_length = torch.cumsum(lengths, 0) + while cum_length[-1] < num_to_mask: + lengths = torch.cat( + [ + lengths, + self.mask_span_distribution.sample(sample_shape=(num_to_mask,)), + ], + dim=0, + ) + cum_length = torch.cumsum(lengths, 0) + + # Trim to masking budget + i = 0 + while cum_length[i] < num_to_mask: + i += 1 + lengths[i] = num_to_mask - (0 if i == 0 else cum_length[i - 1]) + num_to_mask = i + 1 + lengths = lengths[:num_to_mask] + + # Handle 0-length mask (inserts) separately + lengths = lengths[lengths > 0] + num_inserts = num_to_mask - lengths.size(0) + num_to_mask -= num_inserts + if num_to_mask == 0: + return self.add_insertion_noise(source, num_inserts / source.size(0)) + + assert (lengths > 0).all() + else: + lengths = torch.ones((num_to_mask,)).long() + assert is_word_start[-1] == 0 + word_starts = is_word_start.nonzero(as_tuple=False) + indices = word_starts[ + torch.randperm(word_starts.size(0))[:num_to_mask] + ].squeeze(1) + mask_random = torch.FloatTensor(num_to_mask).uniform_() < self.random_ratio + + source_length = source.size(0) + assert source_length - 1 not in indices + to_keep = torch.ones(source_length, dtype=torch.bool) + is_word_start[ + -1 + ] = 255 # acts as a long length, so spans don't go over the end of doc + if self.replace_length == 0: + to_keep[indices] = 0 + else: + # keep index, but replace it with [MASK] + source[indices] = self.mask_idx + source[indices[mask_random]] = torch.randint( + 1, len(self.vocab), size=(mask_random.sum(),) + ) + + if self.mask_span_distribution is not None: + assert len(lengths.size()) == 1 + assert lengths.size() == indices.size() + lengths -= 1 + while indices.size(0) > 0: + assert lengths.size() == indices.size() + lengths -= is_word_start[indices + 1].long() + uncompleted = lengths >= 0 + indices = indices[uncompleted] + 1 + mask_random = mask_random[uncompleted] + lengths = lengths[uncompleted] + if self.replace_length != -1: + # delete token + to_keep[indices] = 0 + else: + # keep index, but replace it with [MASK] + source[indices] = self.mask_idx + source[indices[mask_random]] = torch.randint( + 1, len(self.vocab), size=(mask_random.sum(),) + ) + else: + # A bit faster when all lengths are 1 + while indices.size(0) > 0: + uncompleted = is_word_start[indices + 1] == 0 + indices = indices[uncompleted] + 1 + mask_random = mask_random[uncompleted] + if self.replace_length != -1: + # delete token + to_keep[indices] = 0 + else: + # keep index, but replace it with [MASK] + source[indices] = self.mask_idx + source[indices[mask_random]] = torch.randint( + 1, len(self.vocab), size=(mask_random.sum(),) + ) + + assert source_length - 1 not in indices + + source = source[to_keep] + + if num_inserts > 0: + source = self.add_insertion_noise(source, num_inserts / source.size(0)) + + return source + + def add_permuted_noise(self, tokens, p): + num_words = len(tokens) + num_to_permute = math.ceil(((num_words * 2) * p) / 2.0) + substitutions = torch.randperm(num_words - 2)[:num_to_permute] + 1 + tokens[substitutions] = tokens[substitutions[torch.randperm(num_to_permute)]] + return tokens + + def add_rolling_noise(self, tokens): + offset = np.random.randint(1, max(1, tokens.size(-1) - 1) + 1) + tokens = torch.cat( + (tokens[0:1], tokens[offset:-1], tokens[1:offset], tokens[-1:]), + dim=0, + ) + return tokens + + def add_insertion_noise(self, tokens, p): + if p == 0.0: + return tokens + + num_tokens = len(tokens) + n = int(math.ceil(num_tokens * p)) + + noise_indices = torch.randperm(num_tokens + n - 2)[:n] + 1 + noise_mask = torch.zeros(size=(num_tokens + n,), dtype=torch.bool) + noise_mask[noise_indices] = 1 + result = torch.LongTensor(n + len(tokens)).fill_(-1) + + num_random = int(math.ceil(n * self.random_ratio)) + result[noise_indices[num_random:]] = self.mask_idx + result[noise_indices[:num_random]] = torch.randint( + low=1, high=len(self.vocab), size=(num_random,) + ) + + result[~noise_mask] = tokens + + assert (result >= 0).all() + return result + + def collater(self, samples, pad_to_length=None): + """Merge a list of samples to form a mini-batch. + Args: + samples (List[dict]): samples to collate + Returns: + dict: a mini-batch of data + """ + return collate( + samples, self.vocab.pad(), self.eos, self.vocab, pad_to_length=pad_to_length + ) + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return self.sizes[index] + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return self.sizes[index] + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + indices = np.random.permutation(len(self)) + else: + indices = np.arange(len(self)) + return indices[np.argsort(self.sizes[indices], kind="mergesort")] + + def prefetch(self, indices): + self.src.prefetch(indices) + self.tgt.prefetch(indices) + + @property + def supports_prefetch(self): + return ( + hasattr(self.src, "supports_prefetch") + and self.src.supports_prefetch + and hasattr(self.tgt, "supports_prefetch") + and self.tgt.supports_prefetch + ) diff --git a/SpeechT5/fairseq/fairseq/data/dictionary.py b/SpeechT5/fairseq/fairseq/data/dictionary.py new file mode 100644 index 0000000..0d8308a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/dictionary.py @@ -0,0 +1,395 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +from collections import Counter +from multiprocessing import Pool + +import torch +from fairseq import utils +from fairseq.binarizer import safe_readline +from fairseq.data import data_utils +from fairseq.file_io import PathManager +from fairseq.tokenizer import tokenize_line + + +class Dictionary: + """A mapping from symbols to consecutive integers""" + + def __init__( + self, + *, # begin keyword-only arguments + bos="<s>", + pad="<pad>", + eos="</s>", + unk="<unk>", + extra_special_symbols=None, + ): + self.bos_word, self.unk_word, self.pad_word, self.eos_word = bos, unk, pad, eos + self.symbols = [] + self.count = [] + self.indices = {} + self.bos_index = self.add_symbol(bos) + self.pad_index = self.add_symbol(pad) + self.eos_index = self.add_symbol(eos) + self.unk_index = self.add_symbol(unk) + if extra_special_symbols: + for s in extra_special_symbols: + self.add_symbol(s) + self.nspecial = len(self.symbols) + + def __eq__(self, other): + return self.indices == other.indices + + def __getitem__(self, idx): + if idx < len(self.symbols): + return self.symbols[idx] + return self.unk_word + + def __len__(self): + """Returns the number of symbols in the dictionary""" + return len(self.symbols) + + def __contains__(self, sym): + return sym in self.indices + + def index(self, sym): + """Returns the index of the specified symbol""" + assert isinstance(sym, str) + if sym in self.indices: + return self.indices[sym] + return self.unk_index + + def string( + self, + tensor, + bpe_symbol=None, + escape_unk=False, + extra_symbols_to_ignore=None, + unk_string=None, + include_eos=False, + separator=" ", + ): + """Helper for converting a tensor of token indices to a string. + + Can optionally remove BPE symbols or escape <unk> words. + """ + if torch.is_tensor(tensor) and tensor.dim() == 2: + return "\n".join( + self.string(t, bpe_symbol, escape_unk, extra_symbols_to_ignore, include_eos=include_eos) + for t in tensor + ) + + extra_symbols_to_ignore = set(extra_symbols_to_ignore or []) + extra_symbols_to_ignore.add(self.eos()) + + def token_string(i): + if i == self.unk(): + if unk_string is not None: + return unk_string + else: + return self.unk_string(escape_unk) + else: + return self[i] + + if hasattr(self, "bos_index"): + extra_symbols_to_ignore.add(self.bos()) + + sent = separator.join( + token_string(i) + for i in tensor + if utils.item(i) not in extra_symbols_to_ignore + ) + + return data_utils.post_process(sent, bpe_symbol) + + def unk_string(self, escape=False): + """Return unknown string, optionally escaped as: <<unk>>""" + if escape: + return "<{}>".format(self.unk_word) + else: + return self.unk_word + + def add_symbol(self, word, n=1, overwrite=False): + """Adds a word to the dictionary""" + if word in self.indices and not overwrite: + idx = self.indices[word] + self.count[idx] = self.count[idx] + n + return idx + else: + idx = len(self.symbols) + self.indices[word] = idx + self.symbols.append(word) + self.count.append(n) + return idx + + def update(self, new_dict): + """Updates counts from new dictionary.""" + for word in new_dict.symbols: + idx2 = new_dict.indices[word] + if word in self.indices: + idx = self.indices[word] + self.count[idx] = self.count[idx] + new_dict.count[idx2] + else: + idx = len(self.symbols) + self.indices[word] = idx + self.symbols.append(word) + self.count.append(new_dict.count[idx2]) + + def finalize(self, threshold=-1, nwords=-1, padding_factor=8): + """Sort symbols by frequency in descending order, ignoring special ones. + + Args: + - threshold defines the minimum word count + - nwords defines the total number of words in the final dictionary, + including special symbols + - padding_factor can be used to pad the dictionary size to be a + multiple of 8, which is important on some hardware (e.g., Nvidia + Tensor Cores). + """ + if nwords <= 0: + nwords = len(self) + + new_indices = dict(zip(self.symbols[: self.nspecial], range(self.nspecial))) + new_symbols = self.symbols[: self.nspecial] + new_count = self.count[: self.nspecial] + + c = Counter( + dict( + sorted(zip(self.symbols[self.nspecial :], self.count[self.nspecial :])) + ) + ) + for symbol, count in c.most_common(nwords - self.nspecial): + if count >= threshold: + new_indices[symbol] = len(new_symbols) + new_symbols.append(symbol) + new_count.append(count) + else: + break + + assert len(new_symbols) == len(new_indices) + + self.count = list(new_count) + self.symbols = list(new_symbols) + self.indices = new_indices + + self.pad_to_multiple_(padding_factor) + + def pad_to_multiple_(self, padding_factor): + """Pad Dictionary size to be a multiple of *padding_factor*.""" + if padding_factor > 1: + i = 0 + while len(self) % padding_factor != 0: + symbol = "madeupword{:04d}".format(i) + self.add_symbol(symbol, n=0) + i += 1 + + def bos(self): + """Helper to get index of beginning-of-sentence symbol""" + return self.bos_index + + def pad(self): + """Helper to get index of pad symbol""" + return self.pad_index + + def eos(self): + """Helper to get index of end-of-sentence symbol""" + return self.eos_index + + def unk(self): + """Helper to get index of unk symbol""" + return self.unk_index + + @classmethod + def load(cls, f): + """Loads the dictionary from a text file with the format: + + ``` + <symbol0> <count0> + <symbol1> <count1> + ... + ``` + """ + d = cls() + d.add_from_file(f) + return d + + def add_from_file(self, f): + """ + Loads a pre-existing dictionary from a text file and adds its symbols + to this instance. + """ + if isinstance(f, str): + try: + with open(PathManager.get_local_path(f), "r", encoding="utf-8") as fd: + self.add_from_file(fd) + except FileNotFoundError as fnfe: + raise fnfe + except UnicodeError: + raise Exception( + "Incorrect encoding detected in {}, please " + "rebuild the dataset".format(f) + ) + return + + lines = f.readlines() + indices_start_line = self._load_meta(lines) + + for line in lines[indices_start_line:]: + try: + line, field = line.rstrip().rsplit(" ", 1) + if field == "#fairseq:overwrite": + overwrite = True + line, field = line.rsplit(" ", 1) + else: + overwrite = False + count = int(field) + word = line + if word in self and not overwrite: + raise RuntimeError( + "Duplicate word found when loading Dictionary: '{}'. " + "Duplicate words can overwrite earlier ones by adding the " + "#fairseq:overwrite flag at the end of the corresponding row " + "in the dictionary file. If using the Camembert model, please " + "download an updated copy of the model file.".format(word) + ) + self.add_symbol(word, n=count, overwrite=overwrite) + except ValueError: + raise ValueError( + "Incorrect dictionary format, expected '<token> <cnt> [flags]'" + ) + + def _save(self, f, kv_iterator): + if isinstance(f, str): + PathManager.mkdirs(os.path.dirname(f)) + with PathManager.open(f, "w", encoding="utf-8") as fd: + return self.save(fd) + for k, v in kv_iterator: + print("{} {}".format(k, v), file=f) + + def _get_meta(self): + return [], [] + + def _load_meta(self, lines): + return 0 + + def save(self, f): + """Stores dictionary into a text file""" + ex_keys, ex_vals = self._get_meta() + self._save( + f, + zip( + ex_keys + self.symbols[self.nspecial :], + ex_vals + self.count[self.nspecial :], + ), + ) + + def dummy_sentence(self, length): + t = torch.Tensor(length).uniform_(self.nspecial + 1, len(self)).long() + t[-1] = self.eos() + return t + + def encode_line( + self, + line, + line_tokenizer=tokenize_line, + add_if_not_exist=True, + consumer=None, + append_eos=True, + reverse_order=False, + ) -> torch.IntTensor: + words = line_tokenizer(line) + if reverse_order: + words = list(reversed(words)) + nwords = len(words) + ids = torch.IntTensor(nwords + 1 if append_eos else nwords) + + for i, word in enumerate(words): + if add_if_not_exist: + idx = self.add_symbol(word) + else: + idx = self.index(word) + if consumer is not None: + consumer(word, idx) + ids[i] = idx + if append_eos: + ids[nwords] = self.eos_index + return ids + + @staticmethod + def _add_file_to_dictionary_single_worker( + filename, tokenize, eos_word, worker_id=0, num_workers=1 + ): + counter = Counter() + with open(PathManager.get_local_path(filename), "r", encoding="utf-8") as f: + size = os.fstat(f.fileno()).st_size + chunk_size = size // num_workers + offset = worker_id * chunk_size + end = offset + chunk_size + f.seek(offset) + if offset > 0: + safe_readline(f) # drop first incomplete line + line = f.readline() + while line: + for word in tokenize(line): + counter.update([word]) + counter.update([eos_word]) + # f.tell() returns only an opaque number which can + # return to the position in the file via f.seek() + # and does not necessarily represent a byte position + # in the file. However, f.tell() is faithful to the + # byte position _most of the time_. Thus we can just + # check against the file size to prevent early exit. + if f.tell() > end and f.tell() < size: + break + line = f.readline() + return counter + + @staticmethod + def add_file_to_dictionary(filename, dict, tokenize, num_workers): + def merge_result(counter): + for w, c in sorted(counter.items()): + dict.add_symbol(w, c) + + if num_workers > 1: + pool = Pool(processes=num_workers) + results = [] + for worker_id in range(num_workers): + results.append( + pool.apply_async( + Dictionary._add_file_to_dictionary_single_worker, + (filename, tokenize, dict.eos_word, worker_id, num_workers), + ) + ) + pool.close() + pool.join() + for r in results: + merge_result(r.get()) + else: + merge_result( + Dictionary._add_file_to_dictionary_single_worker( + filename, tokenize, dict.eos_word + ) + ) + + +class TruncatedDictionary(object): + def __init__(self, wrapped_dict, length): + self.__class__ = type( + wrapped_dict.__class__.__name__, + (self.__class__, wrapped_dict.__class__), + {}, + ) + self.__dict__ = wrapped_dict.__dict__ + self.wrapped_dict = wrapped_dict + self.length = min(len(self.wrapped_dict), length) + + def __len__(self): + return self.length + + def __getitem__(self, i): + if i < self.length: + return self.wrapped_dict[i] + return self.wrapped_dict.unk() diff --git a/SpeechT5/fairseq/fairseq/data/encoders/__init__.py b/SpeechT5/fairseq/fairseq/data/encoders/__init__.py new file mode 100644 index 0000000..7cbe00a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/__init__.py @@ -0,0 +1,29 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import importlib +import os + +from fairseq import registry + + +build_tokenizer, register_tokenizer, TOKENIZER_REGISTRY, _ = registry.setup_registry( + "--tokenizer", + default=None, +) + + +build_bpe, register_bpe, BPE_REGISTRY, _ = registry.setup_registry( + "--bpe", + default=None, +) + + +# automatically import any Python files in the encoders/ directory +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + module = file[: file.find(".py")] + importlib.import_module("fairseq.data.encoders." + module) diff --git a/SpeechT5/fairseq/fairseq/data/encoders/byte_bpe.py b/SpeechT5/fairseq/fairseq/data/encoders/byte_bpe.py new file mode 100644 index 0000000..31e3a06 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/byte_bpe.py @@ -0,0 +1,48 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from dataclasses import dataclass, field + +from fairseq import file_utils +from fairseq.data.encoders import register_bpe +from fairseq.data.encoders.byte_utils import ( + SPACE, + SPACE_ESCAPE, + byte_encode, + smart_byte_decode, +) +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class ByteBpeConfig(FairseqDataclass): + sentencepiece_model_path: str = field( + default="???", metadata={"help": "path to sentencepiece model"} + ) + + +@register_bpe("byte_bpe", dataclass=ByteBpeConfig) +class ByteBPE(object): + def __init__(self, cfg): + vocab = file_utils.cached_path(cfg.sentencepiece_model_path) + try: + import sentencepiece as spm + + self.sp = spm.SentencePieceProcessor() + self.sp.Load(vocab) + except ImportError: + raise ImportError( + "Please install sentencepiece with: pip install sentencepiece" + ) + + def encode(self, x: str) -> str: + byte_encoded = byte_encode(x) + return SPACE.join(self.sp.EncodeAsPieces(byte_encoded)) + + @staticmethod + def decode(x: str) -> str: + unescaped = x.replace(SPACE, "").replace(SPACE_ESCAPE, SPACE) + return smart_byte_decode(unescaped) diff --git a/SpeechT5/fairseq/fairseq/data/encoders/byte_utils.py b/SpeechT5/fairseq/fairseq/data/encoders/byte_utils.py new file mode 100644 index 0000000..a305c08 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/byte_utils.py @@ -0,0 +1,51 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import re + + +WHITESPACE_NORMALIZER = re.compile(r"\s+") +SPACE = chr(32) +SPACE_ESCAPE = chr(9601) +# excluding non-breaking space (160) here +PRINTABLE_LATIN = set( + list(range(32, 126 + 1)) + list(range(161, 172 + 1)) + list(range(174, 255 + 1)) +) +BYTE_TO_BCHAR = { + b: chr(b) if b in PRINTABLE_LATIN else chr(256 + b) for b in range(256) +} +BCHAR_TO_BYTE = {bc: b for b, bc in BYTE_TO_BCHAR.items()} + + +def byte_encode(x: str) -> str: + normalized = WHITESPACE_NORMALIZER.sub(SPACE, x) + return "".join([BYTE_TO_BCHAR[b] for b in normalized.encode("utf-8")]) + + +def byte_decode(x: str) -> str: + try: + return bytes([BCHAR_TO_BYTE[bc] for bc in x]).decode("utf-8") + except ValueError: + return "" + + +def smart_byte_decode(x: str) -> str: + output = byte_decode(x) + if output == "": + # DP the best recovery (max valid chars) if it's broken + n_bytes = len(x) + f = [0 for _ in range(n_bytes + 1)] + pt = [0 for _ in range(n_bytes + 1)] + for i in range(1, n_bytes + 1): + f[i], pt[i] = f[i - 1], i - 1 + for j in range(1, min(4, i) + 1): + if f[i - j] + 1 > f[i] and len(byte_decode(x[i - j : i])) > 0: + f[i], pt[i] = f[i - j] + 1, i - j + cur_pt = n_bytes + while cur_pt > 0: + if f[cur_pt] == f[pt[cur_pt]] + 1: + output = byte_decode(x[pt[cur_pt] : cur_pt]) + output + cur_pt = pt[cur_pt] + return output diff --git a/SpeechT5/fairseq/fairseq/data/encoders/bytes.py b/SpeechT5/fairseq/fairseq/data/encoders/bytes.py new file mode 100644 index 0000000..f88f8f6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/bytes.py @@ -0,0 +1,34 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from fairseq.data.encoders import register_bpe +from fairseq.data.encoders.byte_utils import ( + SPACE, + SPACE_ESCAPE, + byte_encode, + smart_byte_decode, +) + + +@register_bpe("bytes") +class Bytes(object): + def __init__(self, *unused): + pass + + @staticmethod + def add_args(parser): + pass + + @staticmethod + def encode(x: str) -> str: + encoded = byte_encode(x) + escaped = encoded.replace(SPACE, SPACE_ESCAPE) + return SPACE.join(list(escaped)) + + @staticmethod + def decode(x: str) -> str: + unescaped = x.replace(SPACE, "").replace(SPACE_ESCAPE, SPACE) + return smart_byte_decode(unescaped) diff --git a/SpeechT5/fairseq/fairseq/data/encoders/characters.py b/SpeechT5/fairseq/fairseq/data/encoders/characters.py new file mode 100644 index 0000000..494ea21 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/characters.py @@ -0,0 +1,30 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from fairseq.data.encoders import register_bpe + + +SPACE = chr(32) +SPACE_ESCAPE = chr(9601) + + +@register_bpe("characters") +class Characters(object): + def __init__(self, *unused): + pass + + @staticmethod + def add_args(parser): + pass + + @staticmethod + def encode(x: str) -> str: + escaped = x.replace(SPACE, SPACE_ESCAPE) + return SPACE.join(list(escaped)) + + @staticmethod + def decode(x: str) -> str: + return x.replace(SPACE, "").replace(SPACE_ESCAPE, SPACE) diff --git a/SpeechT5/fairseq/fairseq/data/encoders/fastbpe.py b/SpeechT5/fairseq/fairseq/data/encoders/fastbpe.py new file mode 100644 index 0000000..f7c2103 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/fastbpe.py @@ -0,0 +1,36 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +from fairseq import file_utils +from fairseq.data.encoders import register_bpe +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class fastBPEConfig(FairseqDataclass): + bpe_codes: str = field(default="???", metadata={"help": "path to fastBPE BPE"}) + + +@register_bpe("fastbpe", dataclass=fastBPEConfig) +class fastBPE(object): + def __init__(self, cfg): + if cfg.bpe_codes is None: + raise ValueError("--bpe-codes is required for --bpe=fastbpe") + codes = file_utils.cached_path(cfg.bpe_codes) + try: + import fastBPE + + self.bpe = fastBPE.fastBPE(codes) + self.bpe_symbol = "@@ " + except ImportError: + raise ImportError("Please install fastBPE with: pip install fastBPE") + + def encode(self, x: str) -> str: + return self.bpe.apply([x])[0] + + def decode(self, x: str) -> str: + return (x + " ").replace(self.bpe_symbol, "").rstrip() diff --git a/SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe.py b/SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe.py new file mode 100644 index 0000000..e661426 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe.py @@ -0,0 +1,45 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +from fairseq import file_utils +from fairseq.data.encoders import register_bpe +from fairseq.dataclass import FairseqDataclass + +from .gpt2_bpe_utils import get_encoder + + +DEFAULT_ENCODER_JSON = "https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/encoder.json" +DEFAULT_VOCAB_BPE = "https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/vocab.bpe" + + +@dataclass +class GPT2BPEConfig(FairseqDataclass): + gpt2_encoder_json: str = field( + default=DEFAULT_ENCODER_JSON, metadata={"help": "path to encoder.json"} + ) + gpt2_vocab_bpe: str = field( + default=DEFAULT_VOCAB_BPE, metadata={"help": "path to vocab.bpe"} + ) + + +@register_bpe("gpt2", dataclass=GPT2BPEConfig) +class GPT2BPE(object): + def __init__(self, cfg): + encoder_json = file_utils.cached_path(cfg.gpt2_encoder_json) + vocab_bpe = file_utils.cached_path(cfg.gpt2_vocab_bpe) + self.bpe = get_encoder(encoder_json, vocab_bpe) + + def encode(self, x: str) -> str: + return " ".join(map(str, self.bpe.encode(x))) + + def decode(self, x: str) -> str: + return self.bpe.decode( + [int(tok) if tok not in {"<unk>", "<mask>"} else tok for tok in x.split()] + ) + + def is_beginning_of_word(self, x: str) -> bool: + return self.decode(x).startswith(" ") diff --git a/SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe_utils.py b/SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe_utils.py new file mode 100644 index 0000000..688d4e3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/gpt2_bpe_utils.py @@ -0,0 +1,140 @@ +""" +Byte pair encoding utilities from GPT-2. + +Original source: https://github.com/openai/gpt-2/blob/master/src/encoder.py +Original license: MIT +""" + +import json +from functools import lru_cache + + +@lru_cache() +def bytes_to_unicode(): + """ + Returns list of utf-8 byte and a corresponding list of unicode strings. + The reversible bpe codes work on unicode strings. + This means you need a large # of unicode characters in your vocab if you want to avoid UNKs. + When you're at something like a 10B token dataset you end up needing around 5K for decent coverage. + This is a signficant percentage of your normal, say, 32K bpe vocab. + To avoid that, we want lookup tables between utf-8 bytes and unicode strings. + And avoids mapping to whitespace/control characters the bpe code barfs on. + """ + bs = ( + list(range(ord("!"), ord("~") + 1)) + + list(range(ord("¡"), ord("¬") + 1)) + + list(range(ord("®"), ord("ÿ") + 1)) + ) + cs = bs[:] + n = 0 + for b in range(2 ** 8): + if b not in bs: + bs.append(b) + cs.append(2 ** 8 + n) + n += 1 + cs = [chr(n) for n in cs] + return dict(zip(bs, cs)) + + +def get_pairs(word): + """Return set of symbol pairs in a word. + Word is represented as tuple of symbols (symbols being variable-length strings). + """ + pairs = set() + prev_char = word[0] + for char in word[1:]: + pairs.add((prev_char, char)) + prev_char = char + return pairs + + +class Encoder: + def __init__(self, encoder, bpe_merges, errors="replace"): + self.encoder = encoder + self.decoder = {v: k for k, v in self.encoder.items()} + self.errors = errors # how to handle errors in decoding + self.byte_encoder = bytes_to_unicode() + self.byte_decoder = {v: k for k, v in self.byte_encoder.items()} + self.bpe_ranks = dict(zip(bpe_merges, range(len(bpe_merges)))) + self.cache = {} + + try: + import regex as re + + self.re = re + except ImportError: + raise ImportError("Please install regex with: pip install regex") + + # Should haved added re.IGNORECASE so BPE merges can happen for capitalized versions of contractions + self.pat = self.re.compile( + r"""'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+""" + ) + + def bpe(self, token): + if token in self.cache: + return self.cache[token] + word = tuple(token) + pairs = get_pairs(word) + + if not pairs: + return token + + while True: + bigram = min(pairs, key=lambda pair: self.bpe_ranks.get(pair, float("inf"))) + if bigram not in self.bpe_ranks: + break + first, second = bigram + new_word = [] + i = 0 + while i < len(word): + try: + j = word.index(first, i) + new_word.extend(word[i:j]) + i = j + except: + new_word.extend(word[i:]) + break + + if word[i] == first and i < len(word) - 1 and word[i + 1] == second: + new_word.append(first + second) + i += 2 + else: + new_word.append(word[i]) + i += 1 + new_word = tuple(new_word) + word = new_word + if len(word) == 1: + break + else: + pairs = get_pairs(word) + word = " ".join(word) + self.cache[token] = word + return word + + def encode(self, text): + bpe_tokens = [] + for token in self.re.findall(self.pat, text): + token = "".join(self.byte_encoder[b] for b in token.encode("utf-8")) + bpe_tokens.extend( + self.encoder[bpe_token] for bpe_token in self.bpe(token).split(" ") + ) + return bpe_tokens + + def decode(self, tokens): + text = "".join([self.decoder.get(token, token) for token in tokens]) + text = bytearray([self.byte_decoder[c] for c in text]).decode( + "utf-8", errors=self.errors + ) + return text + + +def get_encoder(encoder_json_path, vocab_bpe_path): + with open(encoder_json_path, "r") as f: + encoder = json.load(f) + with open(vocab_bpe_path, "r", encoding="utf-8") as f: + bpe_data = f.read() + bpe_merges = [tuple(merge_str.split()) for merge_str in bpe_data.split("\n")[1:-1]] + return Encoder( + encoder=encoder, + bpe_merges=bpe_merges, + ) diff --git a/SpeechT5/fairseq/fairseq/data/encoders/hf_bert_bpe.py b/SpeechT5/fairseq/fairseq/data/encoders/hf_bert_bpe.py new file mode 100644 index 0000000..a41c059 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/hf_bert_bpe.py @@ -0,0 +1,50 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +from typing import Optional + +from fairseq.data.encoders import register_bpe +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class BertBPEConfig(FairseqDataclass): + bpe_cased: bool = field(default=False, metadata={"help": "set for cased BPE"}) + bpe_vocab_file: Optional[str] = field( + default=None, metadata={"help": "bpe vocab file"} + ) + + +@register_bpe("bert", dataclass=BertBPEConfig) +class BertBPE(object): + def __init__(self, cfg): + try: + from transformers import BertTokenizer + except ImportError: + raise ImportError( + "Please install transformers with: pip install transformers" + ) + + if cfg.bpe_vocab_file: + self.bert_tokenizer = BertTokenizer( + cfg.bpe_vocab_file, do_lower_case=not cfg.bpe_cased + ) + else: + vocab_file_name = ( + "bert-base-cased" if cfg.bpe_cased else "bert-base-uncased" + ) + self.bert_tokenizer = BertTokenizer.from_pretrained(vocab_file_name) + + def encode(self, x: str) -> str: + return " ".join(self.bert_tokenizer.tokenize(x)) + + def decode(self, x: str) -> str: + return self.bert_tokenizer.clean_up_tokenization( + self.bert_tokenizer.convert_tokens_to_string(x.split(" ")) + ) + + def is_beginning_of_word(self, x: str) -> bool: + return not x.startswith("##") diff --git a/SpeechT5/fairseq/fairseq/data/encoders/hf_byte_bpe.py b/SpeechT5/fairseq/fairseq/data/encoders/hf_byte_bpe.py new file mode 100644 index 0000000..c508578 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/hf_byte_bpe.py @@ -0,0 +1,50 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +from fairseq.data.encoders import register_bpe +from fairseq.dataclass import FairseqDataclass +from fairseq import file_utils + + +@dataclass +class HuggingFaceByteLevelBPEConfig(FairseqDataclass): + bpe_merges: str = field(default="???", metadata={"help": "path to merges.txt"}) + bpe_vocab: str = field(default="???", metadata={"help": "path to vocab.json"}) + bpe_add_prefix_space: bool = field( + default=False, metadata={"help": "add prefix space before encoding"} + ) + + +@register_bpe("hf_byte_bpe", dataclass=HuggingFaceByteLevelBPEConfig) +class HuggingFaceByteLevelBPE(object): + def __init__(self, cfg): + try: + from tokenizers import ByteLevelBPETokenizer + except ImportError: + raise ImportError( + "Please install huggingface/tokenizers with: " "pip install tokenizers" + ) + + bpe_vocab = file_utils.cached_path(cfg.bpe_vocab) + bpe_merges = file_utils.cached_path(cfg.bpe_merges) + + self.bpe = ByteLevelBPETokenizer( + bpe_vocab, + bpe_merges, + add_prefix_space=cfg.bpe_add_prefix_space, + ) + + def encode(self, x: str) -> str: + return " ".join(map(str, self.bpe.encode(x).ids)) + + def decode(self, x: str) -> str: + return self.bpe.decode( + [int(tok) if tok not in {"<unk>", "<mask>"} else tok for tok in x.split()] + ) + + def is_beginning_of_word(self, x: str) -> bool: + return self.decode(x).startswith(" ") diff --git a/SpeechT5/fairseq/fairseq/data/encoders/moses_tokenizer.py b/SpeechT5/fairseq/fairseq/data/encoders/moses_tokenizer.py new file mode 100644 index 0000000..e236dad --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/moses_tokenizer.py @@ -0,0 +1,49 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +from fairseq.data.encoders import register_tokenizer +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class MosesTokenizerConfig(FairseqDataclass): + source_lang: str = field(default="en", metadata={"help": "source language"}) + target_lang: str = field(default="en", metadata={"help": "target language"}) + moses_no_dash_splits: bool = field( + default=False, metadata={"help": "don't apply dash split rules"} + ) + moses_no_escape: bool = field( + default=False, + metadata={"help": "don't perform HTML escaping on apostrophe, quotes, etc."}, + ) + + +@register_tokenizer("moses", dataclass=MosesTokenizerConfig) +class MosesTokenizer(object): + def __init__(self, cfg: MosesTokenizerConfig): + self.cfg = cfg + + try: + from sacremoses import MosesTokenizer, MosesDetokenizer + + self.tok = MosesTokenizer(cfg.source_lang) + self.detok = MosesDetokenizer(cfg.target_lang) + except ImportError: + raise ImportError( + "Please install Moses tokenizer with: pip install sacremoses" + ) + + def encode(self, x: str) -> str: + return self.tok.tokenize( + x, + aggressive_dash_splits=(not self.cfg.moses_no_dash_splits), + return_str=True, + escape=(not self.cfg.moses_no_escape), + ) + + def decode(self, x: str) -> str: + return self.detok.detokenize(x.split()) diff --git a/SpeechT5/fairseq/fairseq/data/encoders/nltk_tokenizer.py b/SpeechT5/fairseq/fairseq/data/encoders/nltk_tokenizer.py new file mode 100644 index 0000000..0ab9237 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/nltk_tokenizer.py @@ -0,0 +1,24 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.data.encoders import register_tokenizer +from fairseq.dataclass import FairseqDataclass + + +@register_tokenizer("nltk", dataclass=FairseqDataclass) +class NLTKTokenizer(object): + def __init__(self, *unused): + try: + from nltk.tokenize import word_tokenize + + self.word_tokenize = word_tokenize + except ImportError: + raise ImportError("Please install nltk with: pip install nltk") + + def encode(self, x: str) -> str: + return " ".join(self.word_tokenize(x)) + + def decode(self, x: str) -> str: + return x diff --git a/SpeechT5/fairseq/fairseq/data/encoders/sentencepiece_bpe.py b/SpeechT5/fairseq/fairseq/data/encoders/sentencepiece_bpe.py new file mode 100644 index 0000000..a76d46a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/sentencepiece_bpe.py @@ -0,0 +1,48 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +from fairseq import file_utils +from fairseq.data.encoders import register_bpe +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class SentencepieceConfig(FairseqDataclass): + sentencepiece_model: str = field( + default="???", metadata={"help": "path to sentencepiece model"} + ) + + +@register_bpe("sentencepiece", dataclass=SentencepieceConfig) +class SentencepieceBPE(object): + def __init__(self, cfg): + sentencepiece_model = file_utils.cached_path(cfg.sentencepiece_model) + try: + import sentencepiece as spm + + self.sp = spm.SentencePieceProcessor() + self.sp.Load(sentencepiece_model) + except ImportError: + raise ImportError( + "Please install sentencepiece with: pip install sentencepiece" + ) + + def encode(self, x: str) -> str: + return " ".join(self.sp.EncodeAsPieces(x)) + + def decode(self, x: str) -> str: + return x.replace(" ", "").replace("\u2581", " ").strip() + + def is_beginning_of_word(self, x: str) -> bool: + if x in ["<unk>", "<s>", "</s>", "<pad>"]: + # special elements are always considered beginnings + # HACK: this logic is already present in fairseq/tasks/masked_lm.py + # but these special tokens are also contained in the sentencepiece + # vocabulary which causes duplicate special tokens. This hack makes + # sure that they are all taken into account. + return True + return x.startswith("\u2581") diff --git a/SpeechT5/fairseq/fairseq/data/encoders/space_tokenizer.py b/SpeechT5/fairseq/fairseq/data/encoders/space_tokenizer.py new file mode 100644 index 0000000..925ad41 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/space_tokenizer.py @@ -0,0 +1,21 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import re + +from fairseq.data.encoders import register_tokenizer +from fairseq.dataclass import FairseqDataclass + + +@register_tokenizer("space", dataclass=FairseqDataclass) +class SpaceTokenizer(object): + def __init__(self, *unused): + self.space_tok = re.compile(r"\s+") + + def encode(self, x: str) -> str: + return self.space_tok.sub(" ", x) + + def decode(self, x: str) -> str: + return x diff --git a/SpeechT5/fairseq/fairseq/data/encoders/subword_nmt_bpe.py b/SpeechT5/fairseq/fairseq/data/encoders/subword_nmt_bpe.py new file mode 100644 index 0000000..5d724d2 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/subword_nmt_bpe.py @@ -0,0 +1,54 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +from fairseq import file_utils +from fairseq.data.encoders import register_bpe +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class SubwordNMTBPEConfig(FairseqDataclass): + bpe_codes: str = field(default="???", metadata={"help": "path to subword NMT BPE"}) + bpe_separator: str = field(default="@@", metadata={"help": "BPE separator"}) + + +@register_bpe("subword_nmt", dataclass=SubwordNMTBPEConfig) +class SubwordNMTBPE(object): + def __init__(self, cfg): + if cfg.bpe_codes is None: + raise ValueError("--bpe-codes is required for --bpe=subword_nmt") + codes = file_utils.cached_path(cfg.bpe_codes) + try: + from subword_nmt import apply_bpe + + bpe_parser = apply_bpe.create_parser() + bpe_args = bpe_parser.parse_args( + [ + "--codes", + codes, + "--separator", + cfg.bpe_separator, + ] + ) + self.bpe = apply_bpe.BPE( + bpe_args.codes, + bpe_args.merges, + bpe_args.separator, + None, + bpe_args.glossaries, + ) + self.bpe_symbol = bpe_args.separator + " " + except ImportError: + raise ImportError( + "Please install subword_nmt with: pip install subword-nmt" + ) + + def encode(self, x: str) -> str: + return self.bpe.process_line(x) + + def decode(self, x: str) -> str: + return (x + " ").replace(self.bpe_symbol, "").rstrip() diff --git a/SpeechT5/fairseq/fairseq/data/encoders/utils.py b/SpeechT5/fairseq/fairseq/data/encoders/utils.py new file mode 100644 index 0000000..d93eb53 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/encoders/utils.py @@ -0,0 +1,30 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq.data import encoders + + +def get_whole_word_mask(args, dictionary): + bpe = encoders.build_bpe(args) + if bpe is not None: + + def is_beginning_of_word(i): + if i < dictionary.nspecial: + # special elements are always considered beginnings + return True + tok = dictionary[i] + if tok.startswith("madeupword"): + return True + try: + return bpe.is_beginning_of_word(tok) + except ValueError: + return True + + mask_whole_words = torch.ByteTensor( + list(map(is_beginning_of_word, range(len(dictionary)))) + ) + return mask_whole_words + return None diff --git a/SpeechT5/fairseq/fairseq/data/fairseq_dataset.py b/SpeechT5/fairseq/fairseq/data/fairseq_dataset.py new file mode 100644 index 0000000..23e6992 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/fairseq_dataset.py @@ -0,0 +1,205 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import numpy as np +import torch.utils.data +from fairseq.data import data_utils + +logger = logging.getLogger(__name__) + + +class EpochListening: + """Mixin for receiving updates whenever the epoch increments.""" + + @property + def can_reuse_epoch_itr_across_epochs(self): + """ + Whether we can reuse the :class:`fairseq.data.EpochBatchIterator` for + this dataset across epochs. + + This needs to return ``False`` if the sample sizes can change across + epochs, in which case we may need to regenerate batches at each epoch. + If your dataset relies in ``set_epoch`` then you should consider setting + this to ``False``. + """ + return True + + def set_epoch(self, epoch): + """Will receive the updated epoch number at the beginning of the epoch.""" + pass + + +class FairseqDataset(torch.utils.data.Dataset, EpochListening): + """A dataset that provides helpers for batching.""" + + def __getitem__(self, index): + raise NotImplementedError + + def __len__(self): + raise NotImplementedError + + def collater(self, samples): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + + Returns: + dict: a mini-batch suitable for forwarding with a Model + """ + raise NotImplementedError + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + raise NotImplementedError + + def num_tokens_vec(self, indices): + """Return the number of tokens for a set of positions defined by indices. + This value is used to enforce ``--max-tokens`` during batching.""" + raise NotImplementedError + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + raise NotImplementedError + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + return np.arange(len(self), dtype=np.int64) + + @property + def supports_prefetch(self): + """Whether this dataset supports prefetching.""" + return False + + def attr(self, attr: str, index: int): + return getattr(self, attr, None) + + def prefetch(self, indices): + """Prefetch the data required for this epoch.""" + raise NotImplementedError + + def get_batch_shapes(self): + """ + Return a list of valid batch shapes, for example:: + + [(8, 512), (16, 256), (32, 128)] + + The first dimension of each tuple is the batch size and can be ``None`` + to automatically infer the max batch size based on ``--max-tokens``. + The second dimension of each tuple is the max supported length as given + by :func:`fairseq.data.FairseqDataset.num_tokens`. + + This will be used by :func:`fairseq.data.FairseqDataset.batch_by_size` + to restrict batch shapes. This is useful on TPUs to avoid too many + dynamic shapes (and recompilations). + """ + return None + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + """ + Given an ordered set of indices, return batches according to + *max_tokens*, *max_sentences* and *required_batch_size_multiple*. + """ + from fairseq.data import data_utils + + fixed_shapes = self.get_batch_shapes() + if fixed_shapes is not None: + + def adjust_bsz(bsz, num_tokens): + if bsz is None: + assert max_tokens is not None, "Must specify --max-tokens" + bsz = max_tokens // num_tokens + if max_sentences is not None: + bsz = min(bsz, max_sentences) + elif ( + bsz >= required_batch_size_multiple + and bsz % required_batch_size_multiple != 0 + ): + bsz -= bsz % required_batch_size_multiple + return bsz + + fixed_shapes = np.array( + [ + [adjust_bsz(bsz, num_tokens), num_tokens] + for (bsz, num_tokens) in fixed_shapes + ] + ) + + try: + num_tokens_vec = self.num_tokens_vec(indices).astype('int64') + except NotImplementedError: + num_tokens_vec = None + + return data_utils.batch_by_size( + indices, + num_tokens_fn=self.num_tokens, + num_tokens_vec=num_tokens_vec, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + fixed_shapes=fixed_shapes, + ) + + def filter_indices_by_size(self, indices, max_sizes): + """ + Filter a list of sample indices. Remove those that are longer than + specified in *max_sizes*. + + WARNING: don't update, override method in child classes + + Args: + indices (np.array): original array of sample indices + max_sizes (int or list[int] or tuple[int]): max sample size, + can be defined separately for src and tgt (then list or tuple) + + Returns: + np.array: filtered sample array + list: list of removed indices + """ + if isinstance(max_sizes, float) or isinstance(max_sizes, int): + if hasattr(self, "sizes") and isinstance(self.sizes, np.ndarray): + ignored = indices[self.sizes[indices] > max_sizes].tolist() + indices = indices[self.sizes[indices] <= max_sizes] + elif ( + hasattr(self, "sizes") + and isinstance(self.sizes, list) + and len(self.sizes) == 1 + ): + ignored = indices[self.sizes[0][indices] > max_sizes].tolist() + indices = indices[self.sizes[0][indices] <= max_sizes] + else: + indices, ignored = data_utils._filter_by_size_dynamic( + indices, self.size, max_sizes + ) + else: + indices, ignored = data_utils._filter_by_size_dynamic( + indices, self.size, max_sizes + ) + return indices, ignored + + @property + def supports_fetch_outside_dataloader(self): + """Whether this dataset supports fetching outside the workers of the dataloader.""" + return True + + +class FairseqIterableDataset(torch.utils.data.IterableDataset, EpochListening): + """ + For datasets that need to be read sequentially, usually because the data is + being streamed or otherwise can't be manipulated on a single machine. + """ + + def __iter__(self): + raise NotImplementedError diff --git a/SpeechT5/fairseq/fairseq/data/fasta_dataset.py b/SpeechT5/fairseq/fairseq/data/fasta_dataset.py new file mode 100644 index 0000000..0070119 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/fasta_dataset.py @@ -0,0 +1,107 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +import subprocess +import threading +from pathlib import Path + +import numpy as np +import torch + + +def fasta_file_path(prefix_path): + return prefix_path + ".fasta" + + +class FastaDataset(torch.utils.data.Dataset): + """ + For loading protein sequence datasets in the common FASTA data format + """ + + def __init__(self, path: str, cache_indices=False): + self.fn = fasta_file_path(path) + self.threadlocal = threading.local() + self.cache = Path(f"{path}.fasta.idx.npy") + if cache_indices: + if self.cache.exists(): + self.offsets, self.sizes = np.load(self.cache) + else: + self.offsets, self.sizes = self._build_index(path) + np.save(self.cache, np.stack([self.offsets, self.sizes])) + else: + self.offsets, self.sizes = self._build_index(path) + + def _get_file(self): + if not hasattr(self.threadlocal, "f"): + self.threadlocal.f = open(self.fn, "r") + return self.threadlocal.f + + def __getitem__(self, idx): + f = self._get_file() + f.seek(self.offsets[idx]) + desc = f.readline().strip() + line = f.readline() + seq = "" + while line != "" and line[0] != ">": + seq += line.strip() + line = f.readline() + return desc, seq + + def __len__(self): + return self.offsets.size + + def _build_index(self, path: str): + # Use grep and awk to get 100M/s on local SSD. + # Should process your enormous 100G fasta in ~10 min single core... + path = fasta_file_path(path) + bytes_offsets = subprocess.check_output( + f"cat {path} | tqdm --bytes --total $(wc -c < {path})" + "| grep --byte-offset '^>' -o | cut -d: -f1", + shell=True, + ) + fasta_lengths = subprocess.check_output( + f"cat {path} | tqdm --bytes --total $(wc -c < {path})" + "| awk '/^>/ {print \"\";next;} { printf(\"%s\",$0);}' | tail -n+2 | awk '{print length($1)}'", + shell=True, + ) + bytes_np = np.fromstring(bytes_offsets, dtype=np.int64, sep=" ") + sizes_np = np.fromstring(fasta_lengths, dtype=np.int64, sep=" ") + return bytes_np, sizes_np + + def __setstate__(self, state): + self.__dict__ = state + self.threadlocal = threading.local() + + def __getstate__(self): + d = {} + for i, v in self.__dict__.items(): + if i != "threadlocal": + d[i] = v + return d + + def __del__(self): + if hasattr(self.threadlocal, "f"): + self.threadlocal.f.close() + del self.threadlocal.f + + @staticmethod + def exists(path): + return os.path.exists(fasta_file_path(path)) + + +class EncodedFastaDataset(FastaDataset): + """ + The FastaDataset returns raw sequences - this allows us to return + indices with a dictionary instead. + """ + + def __init__(self, path, dictionary): + super().__init__(path, cache_indices=True) + self.dictionary = dictionary + + def __getitem__(self, idx): + desc, seq = super().__getitem__(idx) + return self.dictionary.encode_line(seq, line_tokenizer=list).long() diff --git a/SpeechT5/fairseq/fairseq/data/id_dataset.py b/SpeechT5/fairseq/fairseq/data/id_dataset.py new file mode 100644 index 0000000..3e4d796 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/id_dataset.py @@ -0,0 +1,19 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from . import FairseqDataset + + +class IdDataset(FairseqDataset): + def __getitem__(self, index): + return index + + def __len__(self): + return 0 + + def collater(self, samples): + return torch.tensor(samples) diff --git a/SpeechT5/fairseq/fairseq/data/indexed_dataset.py b/SpeechT5/fairseq/fairseq/data/indexed_dataset.py new file mode 100644 index 0000000..802e37a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/indexed_dataset.py @@ -0,0 +1,576 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import shutil +import struct +from functools import lru_cache + +import numpy as np +import torch +from fairseq.dataclass.constants import DATASET_IMPL_CHOICES +from fairseq.data.fasta_dataset import FastaDataset +from fairseq.file_io import PathManager + +from . import FairseqDataset + +from typing import Union + + +def best_fitting_int_dtype( + max_int_to_represent, +) -> Union[np.uint16, np.uint32, np.int64]: + + if max_int_to_represent is None: + return np.uint32 # Safe guess + elif max_int_to_represent < 65500: + return np.uint16 + elif max_int_to_represent < 4294967295: + return np.uint32 + else: + return np.int64 + # we avoid np.uint64 because it doesn't save space and its type promotion behaves unexpectedly + # https://github.com/numpy/numpy/issues/5745 + + +def get_available_dataset_impl(): + return list(map(str, DATASET_IMPL_CHOICES)) + + +def infer_dataset_impl(path): + if IndexedRawTextDataset.exists(path): + return "raw" + elif IndexedDataset.exists(path): + with open(index_file_path(path), "rb") as f: + magic = f.read(8) + if magic == IndexedDataset._HDR_MAGIC: + return "cached" + elif magic == MMapIndexedDataset.Index._HDR_MAGIC[:8]: + return "mmap" + else: + return None + elif FastaDataset.exists(path): + return "fasta" + else: + return None + + +def make_builder(out_file, impl, vocab_size=None): + if impl == "mmap": + return MMapIndexedDatasetBuilder( + out_file, dtype=best_fitting_int_dtype(vocab_size) + ) + elif impl == "fasta": + raise NotImplementedError + else: + return IndexedDatasetBuilder(out_file) + + +def make_dataset(path, impl, fix_lua_indexing=False, dictionary=None): + if impl == "raw" and IndexedRawTextDataset.exists(path): + assert dictionary is not None + return IndexedRawTextDataset(path, dictionary) + elif impl == "lazy" and IndexedDataset.exists(path): + return IndexedDataset(path, fix_lua_indexing=fix_lua_indexing) + elif impl == "cached" and IndexedDataset.exists(path): + return IndexedCachedDataset(path, fix_lua_indexing=fix_lua_indexing) + elif impl == "mmap" and MMapIndexedDataset.exists(path): + return MMapIndexedDataset(path) + elif impl == "fasta" and FastaDataset.exists(path): + from fairseq.data.fasta_dataset import EncodedFastaDataset + + return EncodedFastaDataset(path, dictionary) + return None + + +def dataset_exists(path, impl): + if impl == "raw": + return IndexedRawTextDataset.exists(path) + elif impl == "mmap": + return MMapIndexedDataset.exists(path) + else: + return IndexedDataset.exists(path) + + +def read_longs(f, n): + a = np.empty(n, dtype=np.int64) + f.readinto(a) + return a + + +def write_longs(f, a): + f.write(np.array(a, dtype=np.int64)) + + +_code_to_dtype = { + 1: np.uint8, + 2: np.int8, + 3: np.int16, + 4: np.int32, + 5: np.int64, + 6: np.float, + 7: np.double, + 8: np.uint16, + 9: np.uint32, + 10: np.uint64, +} + + +def _dtype_header_code(dtype) -> int: + for k in _code_to_dtype.keys(): + if _code_to_dtype[k] == dtype: + return k + raise ValueError(dtype) + + +def index_file_path(prefix_path): + return prefix_path + ".idx" + + +def data_file_path(prefix_path): + return prefix_path + ".bin" + + +class IndexedDataset(FairseqDataset): + """Loader for TorchNet IndexedDataset""" + + _HDR_MAGIC = b"TNTIDX\x00\x00" + + def __init__(self, path, fix_lua_indexing=False): + super().__init__() + self.path = path + self.fix_lua_indexing = fix_lua_indexing + self.data_file = None + self.read_index(path) + + def read_index(self, path): + with open(index_file_path(path), "rb") as f: + magic = f.read(8) + assert magic == self._HDR_MAGIC, ( + "Index file doesn't match expected format. " + "Make sure that --dataset-impl is configured properly." + ) + version = f.read(8) + assert struct.unpack("<Q", version) == (1,) + code, self.element_size = struct.unpack("<QQ", f.read(16)) + self.dtype = _code_to_dtype[code] + self._len, self.s = struct.unpack("<QQ", f.read(16)) + self.dim_offsets = read_longs(f, self._len + 1) + self.data_offsets = read_longs(f, self._len + 1) + self.sizes = read_longs(f, self.s) + + def read_data(self, path): + self.data_file = open(data_file_path(path), "rb", buffering=0) + + def check_index(self, i): + if i < 0 or i >= self._len: + raise IndexError("index out of range") + + def __del__(self): + if self.data_file: + self.data_file.close() + + @lru_cache(maxsize=8) + def __getitem__(self, i) -> torch.Tensor: + if not self.data_file: + self.read_data(self.path) + self.check_index(i) + tensor_size = self.sizes[self.dim_offsets[i] : self.dim_offsets[i + 1]] + a = np.empty(tensor_size, dtype=self.dtype) + self.data_file.seek(self.data_offsets[i] * self.element_size) + self.data_file.readinto(a) + item = torch.from_numpy(a).long() + if self.fix_lua_indexing: + item -= 1 # subtract 1 for 0-based indexing + return item + + def __len__(self): + return self._len + + def num_tokens(self, index): + return self.sizes[index] + + def size(self, index): + return self.sizes[index] + + @staticmethod + def exists(path): + return PathManager.exists(index_file_path(path)) and PathManager.exists( + data_file_path(path) + ) + + @property + def supports_prefetch(self): + return False # avoid prefetching to save memory + + +class IndexedCachedDataset(IndexedDataset): + def __init__(self, path, fix_lua_indexing=False): + super().__init__(path, fix_lua_indexing=fix_lua_indexing) + self.cache = None + self.cache_index = {} + + @property + def supports_prefetch(self): + return True + + def prefetch(self, indices): + if all(i in self.cache_index for i in indices): + return + if not self.data_file: + self.read_data(self.path) + indices = sorted(set(indices)) + total_size = 0 + for i in indices: + total_size += self.data_offsets[i + 1] - self.data_offsets[i] + self.cache = np.empty(total_size, dtype=self.dtype) + ptx = 0 + self.cache_index.clear() + for i in indices: + self.cache_index[i] = ptx + size = self.data_offsets[i + 1] - self.data_offsets[i] + a = self.cache[ptx : ptx + size] + self.data_file.seek(self.data_offsets[i] * self.element_size) + self.data_file.readinto(a) + ptx += size + if self.data_file: + # close and delete data file after prefetch so we can pickle + self.data_file.close() + self.data_file = None + + @lru_cache(maxsize=8) + def __getitem__(self, i): + self.check_index(i) + tensor_size = self.sizes[self.dim_offsets[i] : self.dim_offsets[i + 1]] + a = np.empty(tensor_size, dtype=self.dtype) + ptx = self.cache_index[i] + np.copyto(a, self.cache[ptx : ptx + a.size]) + item = torch.from_numpy(a).long() + if self.fix_lua_indexing: + item -= 1 # subtract 1 for 0-based indexing + return item + + +class IndexedRawTextDataset(FairseqDataset): + """Takes a text file as input and binarizes it in memory at instantiation. + Original lines are also kept in memory""" + + def __init__(self, path, dictionary, append_eos=True, reverse_order=False): + self.tokens_list = [] + self.lines = [] + self.sizes = [] + self.append_eos = append_eos + self.reverse_order = reverse_order + self.read_data(path, dictionary) + self.size = len(self.tokens_list) + + def read_data(self, path, dictionary): + with open(path, "r", encoding="utf-8") as f: + for line in f: + self.lines.append(line.strip("\n")) + tokens = dictionary.encode_line( + line, + add_if_not_exist=False, + append_eos=self.append_eos, + reverse_order=self.reverse_order, + ).long() + self.tokens_list.append(tokens) + self.sizes.append(len(tokens)) + self.sizes = np.array(self.sizes) + + def check_index(self, i): + if i < 0 or i >= self.size: + raise IndexError("index out of range") + + @lru_cache(maxsize=8) + def __getitem__(self, i): + self.check_index(i) + return self.tokens_list[i] + + def get_original_text(self, i): + self.check_index(i) + return self.lines[i] + + def __del__(self): + pass + + def __len__(self): + return self.size + + def num_tokens(self, index): + return self.sizes[index] + + def size(self, index): + return self.sizes[index] + + @staticmethod + def exists(path): + return PathManager.exists(path) + + +class IndexedDatasetBuilder: + element_sizes = { + np.uint8: 1, + np.int8: 1, + np.int16: 2, + np.int32: 4, + np.int64: 8, + np.float: 4, + np.double: 8, + } + + def __init__(self, out_file, dtype=np.int32): + self.out_file = open(out_file, "wb") + self.dtype = dtype + self.data_offsets = [0] + self.dim_offsets = [0] + self.sizes = [] + self.element_size = self.element_sizes[self.dtype] + + def add_item(self, tensor): + # +1 for Lua compatibility + bytes = self.out_file.write(np.array(tensor.numpy() + 1, dtype=self.dtype)) + self.data_offsets.append(self.data_offsets[-1] + bytes / self.element_size) + for s in tensor.size(): + self.sizes.append(s) + self.dim_offsets.append(self.dim_offsets[-1] + len(tensor.size())) + + def merge_file_(self, another_file): + index = IndexedDataset(another_file) + assert index.dtype == self.dtype + + begin = self.data_offsets[-1] + for offset in index.data_offsets[1:]: + self.data_offsets.append(begin + offset) + self.sizes.extend(index.sizes) + begin = self.dim_offsets[-1] + for dim_offset in index.dim_offsets[1:]: + self.dim_offsets.append(begin + dim_offset) + + with open(data_file_path(another_file), "rb") as f: + while True: + data = f.read(1024) + if data: + self.out_file.write(data) + else: + break + + def finalize(self, index_file): + self.out_file.close() + index = open(index_file, "wb") + index.write(b"TNTIDX\x00\x00") + index.write(struct.pack("<Q", 1)) + index.write( + struct.pack("<QQ", _dtype_header_code(self.dtype), self.element_size) + ) + index.write(struct.pack("<QQ", len(self.data_offsets) - 1, len(self.sizes))) + write_longs(index, self.dim_offsets) + write_longs(index, self.data_offsets) + write_longs(index, self.sizes) + index.close() + + +def _warmup_mmap_file(path): + with open(path, "rb") as stream: + while stream.read(100 * 1024 * 1024): + pass + + +class MMapIndexedDataset(torch.utils.data.Dataset): + class Index: + _HDR_MAGIC = b"MMIDIDX\x00\x00" + + @classmethod + def writer(cls, path, dtype): + class _Writer: + def __enter__(self): + self._file = open(path, "wb") + + self._file.write(cls._HDR_MAGIC) + self._file.write(struct.pack("<Q", 1)) + self._file.write(struct.pack("<B", _dtype_header_code(dtype))) + + return self + + @staticmethod + def _get_pointers(sizes): + dtype_size = dtype().itemsize + address = 0 + pointers = [] + + for size in sizes: + pointers.append(address) + address += size * dtype_size + + return pointers + + def write(self, sizes): + pointers = self._get_pointers(sizes) + + self._file.write(struct.pack("<Q", len(sizes))) + + sizes = np.array(sizes, dtype=np.int32) + self._file.write(sizes.tobytes(order="C")) + del sizes + + pointers = np.array(pointers, dtype=np.int64) + self._file.write(pointers.tobytes(order="C")) + del pointers + + def __exit__(self, exc_type, exc_val, exc_tb): + self._file.close() + + return _Writer() + + def __init__(self, path): + with open(path, "rb") as stream: + magic_test = stream.read(9) + assert self._HDR_MAGIC == magic_test, ( + "Index file doesn't match expected format. " + "Make sure that --dataset-impl is configured properly." + ) + version = struct.unpack("<Q", stream.read(8)) + assert (1,) == version + + (dtype_code,) = struct.unpack("<B", stream.read(1)) + self._dtype = _code_to_dtype[dtype_code] + self._dtype_size = self._dtype().itemsize + + self._len = struct.unpack("<Q", stream.read(8))[0] + offset = stream.tell() + + _warmup_mmap_file(path) + + self._bin_buffer_mmap = np.memmap(path, mode="r", order="C") + self._bin_buffer = memoryview(self._bin_buffer_mmap) + self._sizes = np.frombuffer( + self._bin_buffer, dtype=np.int32, count=self._len, offset=offset + ) + self._pointers = np.frombuffer( + self._bin_buffer, + dtype=np.int64, + count=self._len, + offset=offset + self._sizes.nbytes, + ) + + def __del__(self): + self._bin_buffer_mmap._mmap.close() + del self._bin_buffer_mmap + + @property + def dtype(self): + return self._dtype + + @property + def sizes(self): + return self._sizes + + @lru_cache(maxsize=8) + def __getitem__(self, i): + return self._pointers[i], self._sizes[i] + + def __len__(self): + return self._len + + def __init__(self, path): + super().__init__() + + self._path = None + self._index = None + self._bin_buffer = None + + self._do_init(path) + + def __getstate__(self): + return self._path + + def __setstate__(self, state): + self._do_init(state) + + def _do_init(self, path): + self._path = path + self._index = self.Index(index_file_path(self._path)) + + _warmup_mmap_file(data_file_path(self._path)) + self._bin_buffer_mmap = np.memmap( + data_file_path(self._path), mode="r", order="C" + ) + self._bin_buffer = memoryview(self._bin_buffer_mmap) + + def __del__(self): + self._bin_buffer_mmap._mmap.close() + del self._bin_buffer_mmap + del self._index + + def __len__(self): + return len(self._index) + + @lru_cache(maxsize=8) + def __getitem__(self, i): + ptr, size = self._index[i] + np_array = np.frombuffer( + self._bin_buffer, dtype=self._index.dtype, count=size, offset=ptr + ) + if self._index.dtype != np.int64: + np_array = np_array.astype(np.int64) + + return torch.from_numpy(np_array) + + @property + def sizes(self): + return self._index.sizes + + @property + def supports_prefetch(self): + return False + + @staticmethod + def exists(path): + return PathManager.exists(index_file_path(path)) and PathManager.exists( + data_file_path(path) + ) + + +def get_indexed_dataset_to_local(path) -> str: + local_index_path = PathManager.get_local_path(index_file_path(path)) + local_data_path = PathManager.get_local_path(data_file_path(path)) + + assert local_index_path.endswith(".idx") and local_data_path.endswith(".bin"), ( + "PathManager.get_local_path does not return files with expected patterns: " + f"{local_index_path} and {local_data_path}" + ) + + local_path = local_data_path[:-4] # stripping surfix ".bin" + assert local_path == local_index_path[:-4] # stripping surfix ".idx" + return local_path + + +class MMapIndexedDatasetBuilder: + def __init__(self, out_file, dtype=np.int64): + self._data_file = open(out_file, "wb") + self._dtype = dtype + self._sizes = [] + + def add_item(self, tensor): + np_array = np.array(tensor.numpy(), dtype=self._dtype) + self._data_file.write(np_array.tobytes(order="C")) + self._sizes.append(np_array.size) + + def merge_file_(self, another_file): + # Concatenate index + index = MMapIndexedDataset.Index(index_file_path(another_file)) + assert index.dtype == self._dtype + + for size in index.sizes: + self._sizes.append(size) + + # Concatenate data + with open(data_file_path(another_file), "rb") as f: + shutil.copyfileobj(f, self._data_file) + + def finalize(self, index_file): + self._data_file.close() + + with MMapIndexedDataset.Index.writer(index_file, self._dtype) as index: + index.write(self._sizes) diff --git a/SpeechT5/fairseq/fairseq/data/iterators.py b/SpeechT5/fairseq/fairseq/data/iterators.py new file mode 100644 index 0000000..86f6d05 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/iterators.py @@ -0,0 +1,640 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import itertools +import logging +import math +import operator +import os +import queue +import time +from threading import Thread + +import numpy as np +import torch +from fairseq.data import data_utils + + +logger = logging.getLogger(__name__) + +# Object used by _background_consumer to signal the source is exhausted +# to the main thread. +_sentinel = object() + + +class CountingIterator(object): + """Wrapper around an iterable that maintains the iteration count. + + Args: + iterable (iterable): iterable to wrap + start (int): starting iteration count. Note that this doesn't + actually advance the iterator. + total (int): override the iterator length returned by ``__len``. + This can be used to truncate *iterator*. + + Attributes: + n (int): number of elements consumed from this iterator + """ + + def __init__(self, iterable, start=None, total=None): + self._itr = iter(iterable) + self.n = start or getattr(iterable, "n", 0) + self.total = total or self.n + len(iterable) + + def __len__(self): + return self.total + + def __iter__(self): + return self + + def __next__(self): + if not self.has_next(): + raise StopIteration + try: + x = next(self._itr) + except StopIteration: + raise IndexError(f"Iterator expected to have length {self.total}, " + "but exhausted at position {self.n}.") + self.n += 1 + return x + + def has_next(self): + """Whether the iterator has been exhausted.""" + return self.n < self.total + + def skip(self, n): + """Fast-forward the iterator by skipping n elements.""" + for _ in range(n): + next(self) + return self + + def take(self, n): + """Truncate the iterator to n elements at most.""" + self.total = min(self.total, n) + # Propagate this change to the underlying iterator + if hasattr(self._itr, "take"): + self._itr.take(max(n - self.n, 0)) + return self + + +class EpochBatchIterating(object): + def __len__(self) -> int: + raise NotImplementedError + + @property + def next_epoch_idx(self): + raise NotImplementedError + + def next_epoch_itr( + self, shuffle=True, fix_batches_to_gpus=False, set_dataset_epoch=True + ): + """Return a new iterator over the dataset. + + Args: + shuffle (bool, optional): shuffle batches before returning the + iterator (default: True). + fix_batches_to_gpus (bool, optional): ensure that batches are always + allocated to the same shards across epochs. Requires + that :attr:`dataset` supports prefetching (default: False). + set_dataset_epoch (bool, optional): update the wrapped Dataset with + the new epoch number (default: True). + """ + raise NotImplementedError + + def end_of_epoch(self) -> bool: + """Returns whether the most recent epoch iterator has been exhausted""" + raise NotImplementedError + + @property + def iterations_in_epoch(self) -> int: + """The number of consumed batches in the current epoch.""" + raise NotImplementedError + + def state_dict(self): + """Returns a dictionary containing a whole state of the iterator.""" + raise NotImplementedError + + def load_state_dict(self, state_dict): + """Copies the state of the iterator from the given *state_dict*.""" + raise NotImplementedError + + @property + def first_batch(self): + return "DUMMY" + + +class StreamingEpochBatchIterator(EpochBatchIterating): + """A steaming-style iterator over a :class:`torch.utils.data.IterableDataset`. + + Args: + dataset (~torch.utils.data.Dataset): dataset from which to load the data + max_sentences: batch size + collate_fn (callable): merges a list of samples to form a mini-batch + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 1). + buffer_size (int, optional): the number of batches to keep ready in the + queue. Helps speeding up dataloading. When buffer_size is zero, the + default torch.utils.data.DataLoader preloading is used. + timeout (int, optional): if positive, the timeout value for collecting a batch + from workers. Should always be non-negative (default: ``0``). + """ + + def __init__( + self, + dataset, + max_sentences=1, + collate_fn=None, + epoch=1, + num_workers=0, + buffer_size=0, + timeout=0, + ): + assert isinstance(dataset, torch.utils.data.IterableDataset) + self.dataset = dataset + self.max_sentences = max_sentences + self.collate_fn = collate_fn + self.epoch = max(epoch, 1) # we use 1-based indexing for epochs + self.num_workers = num_workers + # This upper limit here is to prevent people from abusing this feature + # in a shared computing environment. + self.buffer_size = min(buffer_size, 20) + self.timeout = timeout + + self._current_epoch_iterator = None + + @property + def next_epoch_idx(self): + """Return the epoch index after *next_epoch_itr* is called.""" + if self._current_epoch_iterator is not None and self.end_of_epoch(): + return self.epoch + 1 + else: + return self.epoch + + def next_epoch_itr( + self, shuffle=True, fix_batches_to_gpus=False, set_dataset_epoch=True + ): + self.epoch = self.next_epoch_idx + if set_dataset_epoch and hasattr(self.dataset, "set_epoch"): + self.dataset.set_epoch(self.epoch) + self._current_epoch_iterator = self._get_iterator_for_epoch(self.epoch, shuffle) + return self._current_epoch_iterator + + def end_of_epoch(self) -> bool: + return not self._current_epoch_iterator.has_next() + + @property + def iterations_in_epoch(self) -> int: + if self._current_epoch_iterator is not None: + return self._current_epoch_iterator.n + return 0 + + def state_dict(self): + return { + "epoch": self.epoch, + } + + def load_state_dict(self, state_dict): + self.epoch = state_dict["epoch"] + + def _get_iterator_for_epoch(self, epoch, shuffle, offset=0): + if self.num_workers > 0: + os.environ["PYTHONWARNINGS"] = "ignore:semaphore_tracker:UserWarning" + + # Create data loader + worker_init_fn = getattr(self.dataset, "worker_init_fn", None) + itr = torch.utils.data.DataLoader( + self.dataset, + batch_size=self.max_sentences, + collate_fn=self.collate_fn, + num_workers=self.num_workers, + timeout=self.timeout, + worker_init_fn=worker_init_fn, + pin_memory=True, + ) + + # Wrap with a BufferedIterator if needed + if self.buffer_size > 0: + itr = BufferedIterator(self.buffer_size, itr) + + # Wrap with CountingIterator + itr = CountingIterator(itr, start=offset) + + return itr + + +class EpochBatchIterator(EpochBatchIterating): + """A multi-epoch iterator over a :class:`torch.utils.data.Dataset`. + + Compared to :class:`torch.utils.data.DataLoader`, this iterator: + + - can be reused across multiple epochs with the :func:`next_epoch_itr` + method (optionally shuffled between epochs) + - can be serialized/deserialized with the :func:`state_dict` and + :func:`load_state_dict` methods + - supports sharding with the *num_shards* and *shard_id* arguments + + Args: + dataset (~torch.utils.data.Dataset): dataset from which to load the data + collate_fn (callable): merges a list of samples to form a mini-batch + batch_sampler (~torch.utils.data.Sampler or a callable): an iterator over batches of + indices, or a callable to create such an iterator (~torch.utils.data.Sampler). + A callable batch_sampler will be called for each epoch to enable per epoch dynamic + batch iterators defined by this callable batch_sampler. + seed (int, optional): seed for random number generator for + reproducibility (default: 1). + num_shards (int, optional): shard the data iterator into N + shards (default: 1). + shard_id (int, optional): which shard of the data iterator to + return (default: 0). + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 1). + buffer_size (int, optional): the number of batches to keep ready in the + queue. Helps speeding up dataloading. When buffer_size is zero, the + default torch.utils.data.DataLoader preloading is used. + timeout (int, optional): if positive, the timeout value for collecting a batch + from workers. Should always be non-negative (default: ``0``). + disable_shuffling (bool, optional): force disable shuffling + (default: ``False``). + """ + + def __init__( + self, + dataset, + collate_fn, + batch_sampler, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + buffer_size=0, + timeout=0, + disable_shuffling=False, + ): + assert isinstance(dataset, torch.utils.data.Dataset) + self.dataset = dataset + self.collate_fn = collate_fn + self.batch_sampler = batch_sampler + self._frozen_batches = ( + tuple(batch_sampler) if not callable(batch_sampler) else None + ) + self.seed = seed + self.num_shards = num_shards + self.shard_id = shard_id + self.num_workers = num_workers + # This upper limit here is to prevent people from abusing this feature + # in a shared computing environment. + self.buffer_size = min(buffer_size, 20) + self.timeout = timeout + self.disable_shuffling = disable_shuffling + + self.epoch = max(epoch, 1) # we use 1-based indexing for epochs + self.shuffle = not disable_shuffling + self._cur_epoch_itr = None + self._next_epoch_itr = None + self._supports_prefetch = getattr(dataset, "supports_prefetch", False) + + @property + def frozen_batches(self): + if self._frozen_batches is None: + self._frozen_batches = tuple(self.batch_sampler(self.dataset, self.epoch)) + return self._frozen_batches + + @property + def first_batch(self): + if len(self.frozen_batches) == 0: + raise Exception( + "The dataset is empty. This could indicate " + "that all elements in the dataset have been skipped. " + "Try increasing the max number of allowed tokens or using " + "a larger dataset." + ) + + if getattr(self.dataset, "supports_fetch_outside_dataloader", True): + return self.collate_fn([self.dataset[i] for i in self.frozen_batches[0]]) + else: + return "DUMMY" + + def __len__(self): + return int(math.ceil(len(self.frozen_batches) / float(self.num_shards))) + + @property + def n(self): + return self.iterations_in_epoch + + @property + def next_epoch_idx(self): + """Return the epoch index after *next_epoch_itr* is called.""" + if self._next_epoch_itr is not None: + return self.epoch + elif self._cur_epoch_itr is not None and self.end_of_epoch(): + return self.epoch + 1 + else: + return self.epoch + + def next_epoch_itr( + self, shuffle=True, fix_batches_to_gpus=False, set_dataset_epoch=True + ): + """Return a new iterator over the dataset. + + Args: + shuffle (bool, optional): shuffle batches before returning the + iterator (default: True). + fix_batches_to_gpus (bool, optional): ensure that batches are always + allocated to the same shards across epochs. Requires + that :attr:`dataset` supports prefetching (default: False). + set_dataset_epoch (bool, optional): update the wrapped Dataset with + the new epoch number (default: True). + """ + if self.disable_shuffling: + shuffle = False + prev_epoch = self.epoch + self.epoch = self.next_epoch_idx + if set_dataset_epoch and hasattr(self.dataset, "set_epoch"): + self.dataset.set_epoch(self.epoch) + if self._next_epoch_itr is not None: + self._cur_epoch_itr = self._next_epoch_itr + self._next_epoch_itr = None + else: + if callable(self.batch_sampler) and prev_epoch != self.epoch: + # reset _frozen_batches to refresh the next epoch + self._frozen_batches = None + self._cur_epoch_itr = self._get_iterator_for_epoch( + self.epoch, + shuffle, + fix_batches_to_gpus=fix_batches_to_gpus, + ) + self.shuffle = shuffle + return self._cur_epoch_itr + + def end_of_epoch(self) -> bool: + """Returns whether the most recent epoch iterator has been exhausted""" + return not self._cur_epoch_itr.has_next() + + @property + def iterations_in_epoch(self): + """The number of consumed batches in the current epoch.""" + if self._cur_epoch_itr is not None: + return self._cur_epoch_itr.n + elif self._next_epoch_itr is not None: + return self._next_epoch_itr.n + return 0 + + def state_dict(self): + """Returns a dictionary containing a whole state of the iterator.""" + if self.end_of_epoch(): + epoch = self.epoch + 1 + iter_in_epoch = 0 + else: + epoch = self.epoch + iter_in_epoch = self.iterations_in_epoch + return { + "version": 2, + "epoch": epoch, + "iterations_in_epoch": iter_in_epoch, + "shuffle": self.shuffle, + } + + def load_state_dict(self, state_dict): + """Copies the state of the iterator from the given *state_dict*.""" + self.epoch = state_dict["epoch"] + itr_pos = state_dict.get("iterations_in_epoch", 0) + version = state_dict.get("version", 1) + if itr_pos > 0: + # fast-forward epoch iterator + self._next_epoch_itr = self._get_iterator_for_epoch( + self.epoch, + shuffle=state_dict.get("shuffle", True), + offset=itr_pos, + ) + if self._next_epoch_itr is None: + if version == 1: + # legacy behavior: we finished the epoch, increment epoch counter + self.epoch += 1 + else: + raise RuntimeError( + "Cannot resume training due to dataloader mismatch, please " + "report this to the fairseq developers. You can relaunch " + "training with `--reset-dataloader` and it should work." + ) + else: + self._next_epoch_itr = None + + def _get_iterator_for_epoch( + self, epoch, shuffle, fix_batches_to_gpus=False, offset=0 + ): + def shuffle_batches(batches, seed): + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + return batches + + if self._supports_prefetch: + batches = self.frozen_batches + + if shuffle and not fix_batches_to_gpus: + batches = shuffle_batches(list(batches), self.seed + epoch) + + batches = list( + ShardedIterator(batches, self.num_shards, self.shard_id, fill_value=[]) + ) + self.dataset.prefetch([i for s in batches for i in s]) + + if shuffle and fix_batches_to_gpus: + batches = shuffle_batches(batches, self.seed + epoch + self.shard_id) + else: + if shuffle: + batches = shuffle_batches(list(self.frozen_batches), self.seed + epoch) + else: + batches = self.frozen_batches + batches = list( + ShardedIterator(batches, self.num_shards, self.shard_id, fill_value=[]) + ) + + if offset > 0 and offset >= len(batches): + return None + + if self.num_workers > 0: + os.environ["PYTHONWARNINGS"] = "ignore:semaphore_tracker:UserWarning" + + # Create data loader + itr = torch.utils.data.DataLoader( + self.dataset, + collate_fn=self.collate_fn, + batch_sampler=batches[offset:], + num_workers=self.num_workers, + timeout=self.timeout, + pin_memory=True, + ) + + # Wrap with a BufferedIterator if needed + if self.buffer_size > 0: + itr = BufferedIterator(self.buffer_size, itr) + + # Wrap with CountingIterator + itr = CountingIterator(itr, start=offset) + return itr + + +class GroupedIterator(CountingIterator): + """Wrapper around an iterable that returns groups (chunks) of items. + + Args: + iterable (iterable): iterable to wrap + chunk_size (int): size of each chunk + + Attributes: + n (int): number of elements consumed from this iterator + """ + + def __init__(self, iterable, chunk_size): + itr = _chunk_iterator(iterable, chunk_size) + super().__init__( + itr, + start=int(math.ceil(getattr(iterable, "n", 0) / float(chunk_size))), + total=int(math.ceil(len(iterable) / float(chunk_size))), + ) + self.chunk_size = chunk_size + + +def _chunk_iterator(itr, chunk_size): + chunk = [] + for x in itr: + chunk.append(x) + if len(chunk) == chunk_size: + yield chunk + chunk = [] + if len(chunk) > 0: + yield chunk + + +class ShardedIterator(CountingIterator): + """A sharded wrapper around an iterable, padded to length. + + Args: + iterable (iterable): iterable to wrap + num_shards (int): number of shards to split the iterable into + shard_id (int): which shard to iterator over + fill_value (Any, optional): padding value when the iterable doesn't + evenly divide *num_shards* (default: None). + + Attributes: + n (int): number of elements consumed from this iterator + """ + + def __init__(self, iterable, num_shards, shard_id, fill_value=None): + if shard_id < 0 or shard_id >= num_shards: + raise ValueError("shard_id must be between 0 and num_shards") + sharded_len = int(math.ceil(len(iterable) / float(num_shards))) + itr = map( + operator.itemgetter(1), + itertools.zip_longest( + range(sharded_len), + itertools.islice(iterable, shard_id, len(iterable), num_shards), + fillvalue=fill_value, + ), + ) + super().__init__( + itr, + start=int(math.ceil(getattr(iterable, "n", 0) / float(num_shards))), + total=sharded_len, + ) + + +class BackgroundConsumer(Thread): + def __init__(self, queue, source, max_len, cuda_device): + Thread.__init__(self) + + self._queue = queue + self._source = source + self._max_len = max_len + self.count = 0 + self.cuda_device = cuda_device + + def run(self): + # set_device to avoid creation of GPU0 context when using pin_memory + if self.cuda_device is not None: + torch.cuda.set_device(self.cuda_device) + + try: + for item in self._source: + self._queue.put(item) + + # Stop if we reached the maximum length + self.count += 1 + if self._max_len is not None and self.count >= self._max_len: + break + + # Signal the consumer we are done. + self._queue.put(_sentinel) + except Exception as e: + self._queue.put(e) + + +class BufferedIterator(object): + def __init__(self, size, iterable): + self._queue = queue.Queue(size) + self._iterable = iterable + self._consumer = None + + self.start_time = time.time() + self.warning_time = None + + self.total = len(iterable) + + def _create_consumer(self): + self._consumer = BackgroundConsumer( + self._queue, + self._iterable, + self.total, + torch.cuda.current_device() if torch.cuda.is_available() else None + ) + self._consumer.daemon = True + self._consumer.start() + + def __iter__(self): + return self + + def __len__(self): + return self.total + + def take(self, n): + self.total = min(self.total, n) + # Propagate this change to the underlying iterator + if hasattr(self._iterable, "take"): + self._iterable.take(n) + return self + + def __next__(self): + # Create consumer if not created yet + if self._consumer is None: + self._create_consumer() + + # Notify the user if there is a data loading bottleneck + if self._queue.qsize() < min(2, max(1, self._queue.maxsize // 2)): + if time.time() - self.start_time > 5 * 60: + if ( + self.warning_time is None + or time.time() - self.warning_time > 15 * 60 + ): + logger.debug( + "Data loading buffer is empty or nearly empty. This may " + "indicate a data loading bottleneck, and increasing the " + "number of workers (--num-workers) may help." + ) + self.warning_time = time.time() + + # Get next example + item = self._queue.get(True) + if isinstance(item, Exception): + raise item + if item is _sentinel: + raise StopIteration() + return item diff --git a/SpeechT5/fairseq/fairseq/data/language_pair_dataset.py b/SpeechT5/fairseq/fairseq/data/language_pair_dataset.py new file mode 100644 index 0000000..ff3e14b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/language_pair_dataset.py @@ -0,0 +1,471 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import numpy as np +import torch +from fairseq.data import FairseqDataset, data_utils + + +logger = logging.getLogger(__name__) + + +def collate( + samples, + pad_idx, + eos_idx, + left_pad_source=True, + left_pad_target=False, + input_feeding=True, + pad_to_length=None, + pad_to_multiple=1, +): + if len(samples) == 0: + return {} + + def merge(key, left_pad, move_eos_to_beginning=False, pad_to_length=None): + return data_utils.collate_tokens( + [s[key] for s in samples], + pad_idx, + eos_idx, + left_pad, + move_eos_to_beginning, + pad_to_length=pad_to_length, + pad_to_multiple=pad_to_multiple, + ) + + def check_alignment(alignment, src_len, tgt_len): + if alignment is None or len(alignment) == 0: + return False + if ( + alignment[:, 0].max().item() >= src_len - 1 + or alignment[:, 1].max().item() >= tgt_len - 1 + ): + logger.warning("alignment size mismatch found, skipping alignment!") + return False + return True + + def compute_alignment_weights(alignments): + """ + Given a tensor of shape [:, 2] containing the source-target indices + corresponding to the alignments, a weight vector containing the + inverse frequency of each target index is computed. + For e.g. if alignments = [[5, 7], [2, 3], [1, 3], [4, 2]], then + a tensor containing [1., 0.5, 0.5, 1] should be returned (since target + index 3 is repeated twice) + """ + align_tgt = alignments[:, 1] + _, align_tgt_i, align_tgt_c = torch.unique( + align_tgt, return_inverse=True, return_counts=True + ) + align_weights = align_tgt_c[align_tgt_i[np.arange(len(align_tgt))]] + return 1.0 / align_weights.float() + + id = torch.LongTensor([s["id"] for s in samples]) + src_tokens = merge( + "source", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + # sort by descending source length + src_lengths = torch.LongTensor( + [s["source"].ne(pad_idx).long().sum() for s in samples] + ) + src_lengths, sort_order = src_lengths.sort(descending=True) + id = id.index_select(0, sort_order) + src_tokens = src_tokens.index_select(0, sort_order) + + prev_output_tokens = None + target = None + if samples[0].get("target", None) is not None: + target = merge( + "target", + left_pad=left_pad_target, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + target = target.index_select(0, sort_order) + tgt_lengths = torch.LongTensor( + [s["target"].ne(pad_idx).long().sum() for s in samples] + ).index_select(0, sort_order) + ntokens = tgt_lengths.sum().item() + + if samples[0].get("prev_output_tokens", None) is not None: + prev_output_tokens = merge("prev_output_tokens", left_pad=left_pad_target) + elif input_feeding: + # we create a shifted version of targets for feeding the + # previous output token(s) into the next decoder step + prev_output_tokens = merge( + "target", + left_pad=left_pad_target, + move_eos_to_beginning=True, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + else: + ntokens = src_lengths.sum().item() + + batch = { + "id": id, + "nsentences": len(samples), + "ntokens": ntokens, + "net_input": {"src_tokens": src_tokens, "src_lengths": src_lengths,}, + "target": target, + } + if prev_output_tokens is not None: + batch["net_input"]["prev_output_tokens"] = prev_output_tokens.index_select( + 0, sort_order + ) + + if samples[0].get("alignment", None) is not None: + bsz, tgt_sz = batch["target"].shape + src_sz = batch["net_input"]["src_tokens"].shape[1] + + offsets = torch.zeros((len(sort_order), 2), dtype=torch.long) + offsets[:, 1] += torch.arange(len(sort_order), dtype=torch.long) * tgt_sz + if left_pad_source: + offsets[:, 0] += src_sz - src_lengths + if left_pad_target: + offsets[:, 1] += tgt_sz - tgt_lengths + + alignments = [ + alignment + offset + for align_idx, offset, src_len, tgt_len in zip( + sort_order, offsets, src_lengths, tgt_lengths + ) + for alignment in [samples[align_idx]["alignment"].view(-1, 2)] + if check_alignment(alignment, src_len, tgt_len) + ] + + if len(alignments) > 0: + alignments = torch.cat(alignments, dim=0) + align_weights = compute_alignment_weights(alignments) + + batch["alignments"] = alignments + batch["align_weights"] = align_weights + + if samples[0].get("constraints", None) is not None: + # Collate the packed constraints across the samples, padding to + # the length of the longest sample. + lens = [sample.get("constraints").size(0) for sample in samples] + max_len = max(lens) + constraints = torch.zeros((len(samples), max(lens))).long() + for i, sample in enumerate(samples): + constraints[i, 0 : lens[i]] = samples[i].get("constraints") + batch["constraints"] = constraints.index_select(0, sort_order) + + return batch + + +class LanguagePairDataset(FairseqDataset): + """ + A pair of torch.utils.data.Datasets. + + Args: + src (torch.utils.data.Dataset): source dataset to wrap + src_sizes (List[int]): source sentence lengths + src_dict (~fairseq.data.Dictionary): source vocabulary + tgt (torch.utils.data.Dataset, optional): target dataset to wrap + tgt_sizes (List[int], optional): target sentence lengths + tgt_dict (~fairseq.data.Dictionary, optional): target vocabulary + left_pad_source (bool, optional): pad source tensors on the left side + (default: True). + left_pad_target (bool, optional): pad target tensors on the left side + (default: False). + shuffle (bool, optional): shuffle dataset elements before batching + (default: True). + input_feeding (bool, optional): create a shifted version of the targets + to be passed into the model for teacher forcing (default: True). + remove_eos_from_source (bool, optional): if set, removes eos from end + of source if it's present (default: False). + append_eos_to_target (bool, optional): if set, appends eos to end of + target if it's absent (default: False). + align_dataset (torch.utils.data.Dataset, optional): dataset + containing alignments. + constraints (Tensor, optional): 2d tensor with a concatenated, zero- + delimited list of constraints for each sentence. + append_bos (bool, optional): if set, appends bos to the beginning of + source/target sentence. + num_buckets (int, optional): if set to a value greater than 0, then + batches will be bucketed into the given number of batch shapes. + src_lang_id (int, optional): source language ID, if set, the collated batch + will contain a field 'src_lang_id' in 'net_input' which indicates the + source language of the samples. + tgt_lang_id (int, optional): target language ID, if set, the collated batch + will contain a field 'tgt_lang_id' which indicates the target language + of the samples. + """ + + def __init__( + self, + src, + src_sizes, + src_dict, + tgt=None, + tgt_sizes=None, + tgt_dict=None, + left_pad_source=True, + left_pad_target=False, + shuffle=True, + input_feeding=True, + remove_eos_from_source=False, + append_eos_to_target=False, + align_dataset=None, + constraints=None, + append_bos=False, + eos=None, + num_buckets=0, + src_lang_id=None, + tgt_lang_id=None, + pad_to_multiple=1, + ): + if tgt_dict is not None: + assert src_dict.pad() == tgt_dict.pad() + assert src_dict.eos() == tgt_dict.eos() + assert src_dict.unk() == tgt_dict.unk() + if tgt is not None: + assert len(src) == len( + tgt + ), "Source and target must contain the same number of examples" + self.src = src + self.tgt = tgt + self.src_sizes = np.array(src_sizes) + self.tgt_sizes = np.array(tgt_sizes) if tgt_sizes is not None else None + self.sizes = ( + np.vstack((self.src_sizes, self.tgt_sizes)).T + if self.tgt_sizes is not None + else self.src_sizes + ) + self.src_dict = src_dict + self.tgt_dict = tgt_dict + self.left_pad_source = left_pad_source + self.left_pad_target = left_pad_target + self.shuffle = shuffle + self.input_feeding = input_feeding + self.remove_eos_from_source = remove_eos_from_source + self.append_eos_to_target = append_eos_to_target + self.align_dataset = align_dataset + if self.align_dataset is not None: + assert ( + self.tgt_sizes is not None + ), "Both source and target needed when alignments are provided" + self.constraints = constraints + self.append_bos = append_bos + self.eos = eos if eos is not None else src_dict.eos() + self.src_lang_id = src_lang_id + self.tgt_lang_id = tgt_lang_id + if num_buckets > 0: + from fairseq.data import BucketPadLengthDataset + + self.src = BucketPadLengthDataset( + self.src, + sizes=self.src_sizes, + num_buckets=num_buckets, + pad_idx=self.src_dict.pad(), + left_pad=self.left_pad_source, + ) + self.src_sizes = self.src.sizes + logger.info("bucketing source lengths: {}".format(list(self.src.buckets))) + if self.tgt is not None: + self.tgt = BucketPadLengthDataset( + self.tgt, + sizes=self.tgt_sizes, + num_buckets=num_buckets, + pad_idx=self.tgt_dict.pad(), + left_pad=self.left_pad_target, + ) + self.tgt_sizes = self.tgt.sizes + logger.info( + "bucketing target lengths: {}".format(list(self.tgt.buckets)) + ) + + # determine bucket sizes using self.num_tokens, which will return + # the padded lengths (thanks to BucketPadLengthDataset) + num_tokens = np.vectorize(self.num_tokens, otypes=[np.compat.long]) + self.bucketed_num_tokens = num_tokens(np.arange(len(self.src))) + self.buckets = [ + (None, num_tokens) for num_tokens in np.unique(self.bucketed_num_tokens) + ] + else: + self.buckets = None + self.pad_to_multiple = pad_to_multiple + + def get_batch_shapes(self): + return self.buckets + + def __getitem__(self, index): + tgt_item = self.tgt[index] if self.tgt is not None else None + src_item = self.src[index] + # Append EOS to end of tgt sentence if it does not have an EOS and remove + # EOS from end of src sentence if it exists. This is useful when we use + # use existing datasets for opposite directions i.e., when we want to + # use tgt_dataset as src_dataset and vice versa + if self.append_eos_to_target: + eos = self.tgt_dict.eos() if self.tgt_dict else self.src_dict.eos() + if self.tgt and self.tgt[index][-1] != eos: + tgt_item = torch.cat([self.tgt[index], torch.LongTensor([eos])]) + + if self.append_bos: + bos = self.tgt_dict.bos() if self.tgt_dict else self.src_dict.bos() + if self.tgt and self.tgt[index][0] != bos: + tgt_item = torch.cat([torch.LongTensor([bos]), self.tgt[index]]) + + bos = self.src_dict.bos() + if self.src[index][0] != bos: + src_item = torch.cat([torch.LongTensor([bos]), self.src[index]]) + + if self.remove_eos_from_source: + eos = self.src_dict.eos() + if self.src[index][-1] == eos: + src_item = self.src[index][:-1] + + example = { + "id": index, + "source": src_item, + "target": tgt_item, + } + if self.align_dataset is not None: + example["alignment"] = self.align_dataset[index] + if self.constraints is not None: + example["constraints"] = self.constraints[index] + return example + + def __len__(self): + return len(self.src) + + def collater(self, samples, pad_to_length=None): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + pad_to_length (dict, optional): a dictionary of + {'source': source_pad_to_length, 'target': target_pad_to_length} + to indicate the max length to pad to in source and target respectively. + + Returns: + dict: a mini-batch with the following keys: + + - `id` (LongTensor): example IDs in the original input order + - `ntokens` (int): total number of tokens in the batch + - `net_input` (dict): the input to the Model, containing keys: + + - `src_tokens` (LongTensor): a padded 2D Tensor of tokens in + the source sentence of shape `(bsz, src_len)`. Padding will + appear on the left if *left_pad_source* is ``True``. + - `src_lengths` (LongTensor): 1D Tensor of the unpadded + lengths of each source sentence of shape `(bsz)` + - `prev_output_tokens` (LongTensor): a padded 2D Tensor of + tokens in the target sentence, shifted right by one + position for teacher forcing, of shape `(bsz, tgt_len)`. + This key will not be present if *input_feeding* is + ``False``. Padding will appear on the left if + *left_pad_target* is ``True``. + - `src_lang_id` (LongTensor): a long Tensor which contains source + language IDs of each sample in the batch + + - `target` (LongTensor): a padded 2D Tensor of tokens in the + target sentence of shape `(bsz, tgt_len)`. Padding will appear + on the left if *left_pad_target* is ``True``. + - `tgt_lang_id` (LongTensor): a long Tensor which contains target language + IDs of each sample in the batch + """ + res = collate( + samples, + pad_idx=self.src_dict.pad(), + eos_idx=self.eos, + left_pad_source=self.left_pad_source, + left_pad_target=self.left_pad_target, + input_feeding=self.input_feeding, + pad_to_length=pad_to_length, + pad_to_multiple=self.pad_to_multiple, + ) + if self.src_lang_id is not None or self.tgt_lang_id is not None: + src_tokens = res["net_input"]["src_tokens"] + bsz = src_tokens.size(0) + if self.src_lang_id is not None: + res["net_input"]["src_lang_id"] = ( + torch.LongTensor([[self.src_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + if self.tgt_lang_id is not None: + res["tgt_lang_id"] = ( + torch.LongTensor([[self.tgt_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + return res + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return max( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def num_tokens_vec(self, indices): + """Return the number of tokens for a set of positions defined by indices. + This value is used to enforce ``--max-tokens`` during batching.""" + sizes = self.src_sizes[indices] + if self.tgt_sizes is not None: + sizes = np.maximum(sizes, self.tgt_sizes[indices]) + return sizes + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return ( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + if self.buckets is None: + # sort by target length, then source length + if self.tgt_sizes is not None: + indices = indices[np.argsort(self.tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(self.src_sizes[indices], kind="mergesort")] + else: + # sort by bucketed_num_tokens, which is: + # max(padded_src_len, padded_tgt_len) + return indices[ + np.argsort(self.bucketed_num_tokens[indices], kind="mergesort") + ] + + @property + def supports_prefetch(self): + return getattr(self.src, "supports_prefetch", False) and ( + getattr(self.tgt, "supports_prefetch", False) or self.tgt is None + ) + + def prefetch(self, indices): + self.src.prefetch(indices) + if self.tgt is not None: + self.tgt.prefetch(indices) + if self.align_dataset is not None: + self.align_dataset.prefetch(indices) + + def filter_indices_by_size(self, indices, max_sizes): + """Filter a list of sample indices. Remove those that are longer + than specified in max_sizes. + + Args: + indices (np.array): original array of sample indices + max_sizes (int or list[int] or tuple[int]): max sample size, + can be defined separately for src and tgt (then list or tuple) + + Returns: + np.array: filtered sample array + list: list of removed indices + """ + return data_utils.filter_paired_dataset_indices_by_size( + self.src_sizes, self.tgt_sizes, indices, max_sizes, + ) diff --git a/SpeechT5/fairseq/fairseq/data/legacy/__init__.py b/SpeechT5/fairseq/fairseq/data/legacy/__init__.py new file mode 100644 index 0000000..9bd5c72 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/legacy/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .block_pair_dataset import BlockPairDataset +from .masked_lm_dataset import MaskedLMDataset +from .masked_lm_dictionary import BertDictionary, MaskedLMDictionary + + +__all__ = [ + "BertDictionary", + "BlockPairDataset", + "MaskedLMDataset", + "MaskedLMDictionary", +] diff --git a/SpeechT5/fairseq/fairseq/data/legacy/block_pair_dataset.py b/SpeechT5/fairseq/fairseq/data/legacy/block_pair_dataset.py new file mode 100644 index 0000000..ba069b4 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/legacy/block_pair_dataset.py @@ -0,0 +1,311 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import numpy as np +import torch +from fairseq.data import FairseqDataset + + +class BlockPairDataset(FairseqDataset): + """Break a Dataset of tokens into sentence pair blocks for next sentence + prediction as well as masked language model. + + High-level logics are: + 1. break input tensor to tensor blocks + 2. pair the blocks with 50% next sentence and 50% random sentence + 3. return paired blocks as well as related segment labels + + Args: + dataset (~torch.utils.data.Dataset): dataset to break into blocks + sizes: array of sentence lengths + dictionary: dictionary for the task + block_size: maximum block size + break_mode: mode for breaking copurs into block pairs. currently we support + 2 modes + doc: respect document boundaries and each part of the pair should belong to on document + none: don't respect any boundary and cut tokens evenly + short_seq_prob: probability for generating shorter block pairs + doc_break_size: Size for empty line separating documents. Typically 1 if + the sentences have eos, 0 otherwise. + """ + + def __init__( + self, + dataset, + dictionary, + sizes, + block_size, + break_mode="doc", + short_seq_prob=0.1, + doc_break_size=1, + ): + super().__init__() + self.dataset = dataset + self.pad = dictionary.pad() + self.eos = dictionary.eos() + self.cls = dictionary.cls() + self.mask = dictionary.mask() + self.sep = dictionary.sep() + self.break_mode = break_mode + self.dictionary = dictionary + self.short_seq_prob = short_seq_prob + self.block_indices = [] + + assert len(dataset) == len(sizes) + + if break_mode == "doc": + cur_doc = [] + for sent_id, sz in enumerate(sizes): + assert doc_break_size == 0 or sz != 0, ( + "when doc_break_size is non-zero, we expect documents to be" + "separated by a blank line with a single eos." + ) + # empty line as document separator + if sz == doc_break_size: + if len(cur_doc) == 0: + continue + self.block_indices.append(cur_doc) + cur_doc = [] + else: + cur_doc.append(sent_id) + max_num_tokens = block_size - 3 # Account for [CLS], [SEP], [SEP] + self.sent_pairs = [] + self.sizes = [] + for doc_id, doc in enumerate(self.block_indices): + self._generate_sentence_pair(doc, doc_id, max_num_tokens, sizes) + elif break_mode is None or break_mode == "none": + # each block should have half of the block size since we are constructing block pair + sent_length = (block_size - 3) // 2 + total_len = sum(dataset.sizes) + length = math.ceil(total_len / sent_length) + + def block_at(i): + start = i * sent_length + end = min(start + sent_length, total_len) + return (start, end) + + sent_indices = np.array([block_at(i) for i in range(length)]) + sent_sizes = np.array([e - s for s, e in sent_indices]) + dataset_index = self._sent_to_dataset_index(sent_sizes) + + # pair sentences + self._pair_sentences(dataset_index) + else: + raise ValueError("Invalid break_mode: " + break_mode) + + def _pair_sentences(self, dataset_index): + """ + Give a list of evenly cut blocks/sentences, pair these sentences with 50% + consecutive sentences and 50% random sentences. + This is used for none break mode + """ + # pair sentences + for sent_id, sent in enumerate(dataset_index): + next_sent_label = ( + 1 if np.random.rand() > 0.5 and sent_id != len(dataset_index) - 1 else 0 + ) + if next_sent_label: + next_sent = dataset_index[sent_id + 1] + else: + next_sent = dataset_index[ + self._skip_sampling(len(dataset_index), [sent_id, sent_id + 1]) + ] + self.sent_pairs.append((sent, next_sent, next_sent_label)) + + # The current blocks don't include the special tokens but the + # sizes already account for this + self.sizes.append(3 + sent[3] + next_sent[3]) + + def _sent_to_dataset_index(self, sent_sizes): + """ + Build index mapping block indices to the underlying dataset indices + """ + dataset_index = [] + ds_idx, ds_remaining = -1, 0 + for to_consume in sent_sizes: + sent_size = to_consume + if ds_remaining == 0: + ds_idx += 1 + ds_remaining = sent_sizes[ds_idx] + start_ds_idx = ds_idx + start_offset = sent_sizes[ds_idx] - ds_remaining + while to_consume > ds_remaining: + to_consume -= ds_remaining + ds_idx += 1 + ds_remaining = sent_sizes[ds_idx] + ds_remaining -= to_consume + dataset_index.append( + ( + start_ds_idx, # starting index in dataset + start_offset, # starting offset within starting index + ds_idx, # ending index in dataset + sent_size, # sentence length + ) + ) + assert ds_remaining == 0 + assert ds_idx == len(self.dataset) - 1 + return dataset_index + + def _generate_sentence_pair(self, doc, doc_id, max_num_tokens, sizes): + """ + Go through a single document and genrate sentence paris from it + """ + current_chunk = [] + current_length = 0 + curr = 0 + # To provide more randomness, we decrease target seq length for parts of + # samples (10% by default). Note that max_num_tokens is the hard threshold + # for batching and will never be changed. + target_seq_length = max_num_tokens + if np.random.random() < self.short_seq_prob: + target_seq_length = np.random.randint(2, max_num_tokens) + # loop through all sentences in document + while curr < len(doc): + sent_id = doc[curr] + current_chunk.append(sent_id) + current_length = sum(sizes[current_chunk]) + # split chunk and generate pair when exceed target_seq_length or + # finish the loop + if curr == len(doc) - 1 or current_length >= target_seq_length: + # split the chunk into 2 parts + a_end = 1 + if len(current_chunk) > 2: + a_end = np.random.randint(1, len(current_chunk) - 1) + sent_a = current_chunk[:a_end] + len_a = sum(sizes[sent_a]) + # generate next sentence label, note that if there is only 1 sentence + # in current chunk, label is always 0 + next_sent_label = ( + 1 if np.random.rand() > 0.5 and len(current_chunk) != 1 else 0 + ) + if not next_sent_label: + # if next sentence label is 0, sample sent_b from a random doc + target_b_length = target_seq_length - len_a + rand_doc_id = self._skip_sampling(len(self.block_indices), [doc_id]) + random_doc = self.block_indices[rand_doc_id] + random_start = np.random.randint(0, len(random_doc)) + sent_b = [] + len_b = 0 + for j in range(random_start, len(random_doc)): + sent_b.append(random_doc[j]) + len_b = sum(sizes[sent_b]) + if len_b >= target_b_length: + break + # return the second part of the chunk since it's not used + num_unused_segments = len(current_chunk) - a_end + curr -= num_unused_segments + else: + # if next sentence label is 1, use the second part of chunk as sent_B + sent_b = current_chunk[a_end:] + len_b = sum(sizes[sent_b]) + # currently sent_a and sent_B may be longer than max_num_tokens, + # truncate them and return block idx and offsets for them + sent_a, sent_b = self._truncate_sentences( + sent_a, sent_b, max_num_tokens + ) + self.sent_pairs.append((sent_a, sent_b, next_sent_label)) + self.sizes.append(3 + sent_a[3] + sent_b[3]) + current_chunk = [] + curr += 1 + + def _skip_sampling(self, total, skip_ids): + """ + Generate a random integer which is not in skip_ids. Sample range is [0, total) + TODO: ids in skip_ids should be consecutive, we can extend it to more generic version later + """ + rand_id = np.random.randint(total - len(skip_ids)) + return rand_id if rand_id < min(skip_ids) else rand_id + len(skip_ids) + + def _truncate_sentences(self, sent_a, sent_b, max_num_tokens): + """ + Trancate a pair of sentence to limit total length under max_num_tokens + Logics: + 1. Truncate longer sentence + 2. Tokens to be truncated could be at the beginning or the end of the sentnce + Returns: + Truncated sentences represented by dataset idx + """ + len_a, len_b = sum(self.dataset.sizes[sent_a]), sum(self.dataset.sizes[sent_b]) + front_cut_a = front_cut_b = end_cut_a = end_cut_b = 0 + + while True: + total_length = ( + len_a + len_b - front_cut_a - front_cut_b - end_cut_a - end_cut_b + ) + if total_length <= max_num_tokens: + break + + if len_a - front_cut_a - end_cut_a > len_b - front_cut_b - end_cut_b: + if np.random.rand() < 0.5: + front_cut_a += 1 + else: + end_cut_a += 1 + else: + if np.random.rand() < 0.5: + front_cut_b += 1 + else: + end_cut_b += 1 + + # calculate ds indices as well as offsets and return + truncated_sent_a = self._cut_sentence(sent_a, front_cut_a, end_cut_a) + truncated_sent_b = self._cut_sentence(sent_b, front_cut_b, end_cut_b) + return truncated_sent_a, truncated_sent_b + + def _cut_sentence(self, sent, front_cut, end_cut): + """ + Cut a sentence based on the numbers of tokens to be cut from beginning and end + Represent the sentence as dataset idx and return + """ + start_ds_idx, end_ds_idx, offset = sent[0], sent[-1], 0 + target_len = sum(self.dataset.sizes[sent]) - front_cut - end_cut + while front_cut > 0: + if self.dataset.sizes[start_ds_idx] > front_cut: + offset += front_cut + break + else: + front_cut -= self.dataset.sizes[start_ds_idx] + start_ds_idx += 1 + while end_cut > 0: + if self.dataset.sizes[end_ds_idx] > end_cut: + break + else: + end_cut -= self.dataset.sizes[end_ds_idx] + end_ds_idx -= 1 + return start_ds_idx, offset, end_ds_idx, target_len + + def _fetch_block(self, start_ds_idx, offset, end_ds_idx, length): + """ + Fetch a block of tokens based on its dataset idx + """ + buffer = torch.cat( + [self.dataset[idx] for idx in range(start_ds_idx, end_ds_idx + 1)] + ) + s, e = offset, offset + length + return buffer[s:e] + + def __getitem__(self, index): + block1, block2, next_sent_label = self.sent_pairs[index] + block1 = self._fetch_block(*block1) + block2 = self._fetch_block(*block2) + return block1, block2, next_sent_label + + def __len__(self): + return len(self.sizes) + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + prefetch_idx = set() + for index in indices: + for block1, block2, _ in [self.sent_pairs[index]]: + for ds_idx in range(block1[0], block1[2] + 1): + prefetch_idx.add(ds_idx) + for ds_idx in range(block2[0], block2[2] + 1): + prefetch_idx.add(ds_idx) + self.dataset.prefetch(prefetch_idx) diff --git a/SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dataset.py b/SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dataset.py new file mode 100644 index 0000000..dd8ea2c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dataset.py @@ -0,0 +1,303 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Dict, List, Tuple + +import numpy as np +import torch +from fairseq.data import Dictionary, FairseqDataset, data_utils +from fairseq.data.concat_dataset import ConcatDataset +from fairseq.data.legacy.block_pair_dataset import BlockPairDataset +from fairseq.data.token_block_dataset import TokenBlockDataset + + +class MaskedLMDataset(FairseqDataset): + """ + A wrapper Dataset for masked language modelling. The dataset + wraps around TokenBlockDataset or BlockedPairDataset and creates a batch + where the input blocks are masked according to the specified masking + probability. Additionally the batch can also contain sentence level targets + if this is specified. + + Args: + dataset: Dataset which generates blocks of data. Only BlockPairDataset + and TokenBlockDataset are supported. + sizes: Sentence lengths + vocab: Dictionary with the vocabulary and special tokens. + pad_idx: Id of padding token in dictionary + mask_idx: Id of mask token in dictionary + classif_token_idx: Id of classification token in dictionary. This is the + token associated with the sentence embedding (Eg: CLS for BERT) + sep_token_idx: Id of separator token in dictionary + (Eg: SEP in BERT) + seed: Seed for random number generator for reproducibility. + shuffle: Shuffle the elements before batching. + has_pairs: Specifies whether the underlying dataset + generates a pair of blocks along with a sentence_target or not. + Setting it to True assumes that the underlying dataset generates a + label for the pair of sentences which is surfaced as + sentence_target. The default value assumes a single block with no + sentence target. + segment_id: An optional segment id for filling in the segment labels + when we are in the single block setting (Eg: XLM). Default is 0. + masking_ratio: specifies what percentage of the blocks should be masked. + masking_prob: specifies the probability of a given token being + replaced with the "MASK" token. + random_token_prob: specifies the probability of a given token being + replaced by a random token from the vocabulary. + """ + + def __init__( + self, + dataset: FairseqDataset, + sizes: np.ndarray, + vocab: Dictionary, + pad_idx: int, + mask_idx: int, + classif_token_idx: int, + sep_token_idx: int, + seed: int = 1, + shuffle: bool = True, + has_pairs: bool = True, + segment_id: int = 0, + masking_ratio: float = 0.15, + masking_prob: float = 0.8, + random_token_prob: float = 0.1, + ): + # Make sure the input datasets are the ones supported + assert ( + isinstance(dataset, TokenBlockDataset) + or isinstance(dataset, BlockPairDataset) + or isinstance(dataset, ConcatDataset) + ), ( + "MaskedLMDataset only wraps TokenBlockDataset or BlockPairDataset or " + "ConcatDataset" + ) + + self.dataset = dataset + self.sizes = np.array(sizes) + self.vocab = vocab + self.pad_idx = pad_idx + self.mask_idx = mask_idx + self.classif_token_idx = classif_token_idx + self.sep_token_idx = sep_token_idx + self.shuffle = shuffle + self.seed = seed + self.has_pairs = has_pairs + self.segment_id = segment_id + self.masking_ratio = masking_ratio + self.masking_prob = masking_prob + self.random_token_prob = random_token_prob + + # If we have only one block then sizes needs to be updated to include + # the classification token + if not has_pairs: + self.sizes = self.sizes + 1 + + def __getitem__(self, index: int): + # if has_pairs, then expect 2 blocks and a sentence target + if self.has_pairs: + (block_one, block_two, sentence_target) = self.dataset[index] + else: + block_one = self.dataset[index] + + return { + "id": index, + "block_one": block_one, + "block_two": block_two if self.has_pairs else None, + "sentence_target": sentence_target if self.has_pairs else None, + } + + def __len__(self): + return len(self.dataset) + + def _mask_block( + self, + sentence: np.ndarray, + mask_idx: int, + pad_idx: int, + dictionary_token_range: Tuple, + ): + """ + Mask tokens for Masked Language Model training + Samples mask_ratio tokens that will be predicted by LM. + + Note:This function may not be efficient enough since we had multiple + conversions between np and torch, we can replace them with torch + operators later. + + Args: + sentence: 1d tensor to be masked + mask_idx: index to use for masking the sentence + pad_idx: index to use for masking the target for tokens we aren't + predicting + dictionary_token_range: range of indices in dictionary which can + be used for random word replacement + (e.g. without special characters) + Return: + masked_sent: masked sentence + target: target with words which we are not predicting replaced + by pad_idx + """ + masked_sent = np.copy(sentence) + sent_length = len(sentence) + mask_num = math.ceil(sent_length * self.masking_ratio) + mask = np.random.choice(sent_length, mask_num, replace=False) + target = np.copy(sentence) + + for i in range(sent_length): + if i in mask: + rand = np.random.random() + + # replace with mask if probability is less than masking_prob + # (Eg: 0.8) + if rand < self.masking_prob: + masked_sent[i] = mask_idx + + # replace with random token if probability is less than + # masking_prob + random_token_prob (Eg: 0.9) + elif rand < (self.masking_prob + self.random_token_prob): + # sample random token from dictionary + masked_sent[i] = np.random.randint( + dictionary_token_range[0], dictionary_token_range[1] + ) + else: + target[i] = pad_idx + + return masked_sent, target + + def _collate(self, samples: List[Dict], pad_idx: int, eos_idx: int): + """ + Does the heavy lifting for creating a batch from the input list of + examples. The logic is as follows: + 1. Mask the input blocks. In case has_pair is True then we have 2 + blocks to mask. + 2. Prepend the first masked block tensor with the special token + used as sentence embedding. Eg: CLS in BERT. This happens + irrespective of the value of has_pair. + 3. If has_pair is True, then append the first masked block with the + special separator token (eg: SEP for BERT) and compute segment + label accordingly. In this case, also append the second masked + block with this special separator token and compute its segment + label. + 4. For the targets tensor, prepend and append with padding index + accordingly. + 5. Concatenate all tensors. + """ + if len(samples) == 0: + return {} + # To ensure determinism, we reset the state of the PRNG after every + # batch based on the seed and the first id of the batch. This ensures + # that across epochs we get the same mask for the same example. This + # is needed for reproducibility and is how BERT does masking + # TODO: Can we add deteminism without this constraint? + with data_utils.numpy_seed(self.seed + samples[0]["id"]): + for s in samples: + + # token range is needed for replacing with random token during + # masking + token_range = (self.vocab.nspecial, len(self.vocab)) + + # mask according to specified probabilities. + masked_blk_one, masked_tgt_one = self._mask_block( + s["block_one"], + self.mask_idx, + self.pad_idx, + token_range, + ) + + tokens = np.concatenate([[self.classif_token_idx], masked_blk_one]) + targets = np.concatenate([[self.pad_idx], masked_tgt_one]) + segments = np.ones(len(tokens)) * self.segment_id + + # if has_pairs is True then we need to add the SEP token to both + # the blocks after masking and re-compute segments based on the new + # lengths. + if self.has_pairs: + tokens_one = np.concatenate([tokens, [self.sep_token_idx]]) + targets_one = np.concatenate([targets, [self.pad_idx]]) + + masked_blk_two, masked_tgt_two = self._mask_block( + s["block_two"], self.mask_idx, self.pad_idx, token_range + ) + tokens_two = np.concatenate([masked_blk_two, [self.sep_token_idx]]) + targets_two = np.concatenate([masked_tgt_two, [self.pad_idx]]) + + # block + 1 sep + 1 special (CLS) + segments_one = np.zeros(len(tokens_one)) + # block + 1 sep + segments_two = np.ones(len(tokens_two)) + + tokens = np.concatenate([tokens_one, tokens_two]) + targets = np.concatenate([targets_one, targets_two]) + segments = np.concatenate([segments_one, segments_two]) + + s["source"] = torch.LongTensor(tokens) + s["segment_labels"] = torch.LongTensor(segments) + s["lm_target"] = torch.LongTensor(targets) + + def merge(key): + return data_utils.collate_tokens( + [s[key] for s in samples], pad_idx, eos_idx, left_pad=False + ) + + return { + "id": torch.LongTensor([s["id"] for s in samples]), + "ntokens": sum(len(s["source"]) for s in samples), + "net_input": { + "src_tokens": merge("source"), + "segment_labels": merge("segment_labels"), + }, + "lm_target": merge("lm_target"), + "sentence_target": torch.LongTensor([s["sentence_target"] for s in samples]) + if self.has_pairs + else None, + "nsentences": len(samples), + } + + def collater(self, samples: List[Dict]): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + + Returns: + dict: a mini-batch of data + """ + return self._collate(samples, self.vocab.pad(), self.vocab.eos()) + + def num_tokens(self, index: int): + """ + Return the number of tokens in a sample. This value is used to + enforce max-tokens during batching. + """ + return self.sizes[index] + + def size(self, index: int): + """ + Return an example's size as a float or tuple. This value is used when + filtering a dataset with max-positions. + """ + return self.sizes[index] + + def ordered_indices(self): + """ + Return an ordered list of indices. Batches will be constructed based + on this order. + """ + if self.shuffle: + return np.random.permutation(len(self)) + else: + order = [np.arange(len(self))] + order.append(self.sizes) + return np.lexsort(order) + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + self.dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dictionary.py b/SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dictionary.py new file mode 100644 index 0000000..dee88f7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/legacy/masked_lm_dictionary.py @@ -0,0 +1,60 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.data import Dictionary + + +class MaskedLMDictionary(Dictionary): + """ + Dictionary for Masked Language Modelling tasks. This extends Dictionary by + adding the mask symbol. + """ + + def __init__( + self, + pad="<pad>", + eos="</s>", + unk="<unk>", + mask="<mask>", + ): + super().__init__(pad=pad, eos=eos, unk=unk) + self.mask_word = mask + self.mask_index = self.add_symbol(mask) + self.nspecial = len(self.symbols) + + def mask(self): + """Helper to get index of mask symbol""" + return self.mask_index + + +class BertDictionary(MaskedLMDictionary): + """ + Dictionary for BERT task. This extends MaskedLMDictionary by adding support + for cls and sep symbols. + """ + + def __init__( + self, + pad="<pad>", + eos="</s>", + unk="<unk>", + mask="<mask>", + cls="<cls>", + sep="<sep>", + ): + super().__init__(pad=pad, eos=eos, unk=unk, mask=mask) + self.cls_word = cls + self.sep_word = sep + self.cls_index = self.add_symbol(cls) + self.sep_index = self.add_symbol(sep) + self.nspecial = len(self.symbols) + + def cls(self): + """Helper to get index of cls symbol""" + return self.cls_index + + def sep(self): + """Helper to get index of sep symbol""" + return self.sep_index diff --git a/SpeechT5/fairseq/fairseq/data/list_dataset.py b/SpeechT5/fairseq/fairseq/data/list_dataset.py new file mode 100644 index 0000000..12f00aa --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/list_dataset.py @@ -0,0 +1,32 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import BaseWrapperDataset + + +class ListDataset(BaseWrapperDataset): + def __init__(self, dataset, sizes=None): + super().__init__(dataset) + self._sizes = sizes + + def __iter__(self): + for x in self.dataset: + yield x + + def collater(self, samples): + return samples + + @property + def sizes(self): + return self._sizes + + def num_tokens(self, index): + return self.sizes[index] + + def size(self, index): + return self.sizes[index] + + def set_epoch(self, epoch): + pass diff --git a/SpeechT5/fairseq/fairseq/data/lm_context_window_dataset.py b/SpeechT5/fairseq/fairseq/data/lm_context_window_dataset.py new file mode 100644 index 0000000..1a94592 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/lm_context_window_dataset.py @@ -0,0 +1,97 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch +from typing import Dict + +from fairseq.data.monolingual_dataset import MonolingualDataset + +from . import FairseqDataset + + +class LMContextWindowDataset(FairseqDataset): + """ + Wraps a MonolingualDataset and provides more context for evaluation. + + Each item in the new dataset will have a maximum size of + ``tokens_per_sample + context_window``. + + Args: + dataset: dataset to wrap + tokens_per_sample (int): the max number of tokens in each dataset item + context_window (int): the number of accumulated tokens to add to each + dataset item + pad_idx (int): padding symbol + """ + + def __init__( + self, + dataset: MonolingualDataset, + tokens_per_sample: int, + context_window: int, + pad_idx: int, + ): + assert context_window > 0 + self.dataset = dataset + self.tokens_per_sample = tokens_per_sample + self.context_window = context_window + self.pad_idx = pad_idx + self.prev_tokens = np.empty([0]) + + def __getitem__(self, index): + return self.dataset[index] + + def __len__(self): + return len(self.dataset) + + def collater(self, samples) -> Dict: + sample = self.dataset.collater(samples) + + pad = self.pad_idx + max_sample_len = self.tokens_per_sample + self.context_window + + bsz, tsz = sample["net_input"]["src_tokens"].shape + start_idxs = [0] * bsz + toks = sample["net_input"]["src_tokens"] + lengths = sample["net_input"]["src_lengths"] + tgt = sample["target"] + new_toks = np.empty([bsz, tsz + self.context_window], dtype=np.int64) + new_tgt = np.full([bsz, tsz + self.context_window], pad, dtype=np.int64) + sample_lens = toks.ne(pad).long().sum(dim=1).cpu() + for i in range(bsz): + sample_len = sample_lens[i] + extra = len(self.prev_tokens) + sample_len - max_sample_len + if extra > 0: + self.prev_tokens = self.prev_tokens[extra:] + pads = np.full(self.context_window - len(self.prev_tokens), pad) + new_toks[i] = np.concatenate([self.prev_tokens, toks[i].numpy(), pads]) + new_tgt[ + i, len(self.prev_tokens) : len(self.prev_tokens) + len(tgt[i]) + ] = tgt[i] + start_idxs[i] = len(self.prev_tokens) + lengths[i] += len(self.prev_tokens) + self.prev_tokens = new_toks[i][new_toks[i] != pad][-self.context_window :] + sample["net_input"]["src_tokens"] = torch.from_numpy(new_toks) + sample["target"] = torch.from_numpy(new_tgt) + sample["start_indices"] = start_idxs + return sample + + def num_tokens(self, index): + return self.dataset.num_tokens(index) + + def size(self, index): + return self.dataset.size(index) + + def ordered_indices(self): + # NOTE we don't shuffle the data to retain access to the previous dataset elements + return np.arange(len(self.dataset)) + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + return self.dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/fairseq/data/lru_cache_dataset.py b/SpeechT5/fairseq/fairseq/data/lru_cache_dataset.py new file mode 100644 index 0000000..a7854ac --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/lru_cache_dataset.py @@ -0,0 +1,21 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from functools import lru_cache + +from . import BaseWrapperDataset + + +class LRUCacheDataset(BaseWrapperDataset): + def __init__(self, dataset, token=None): + super().__init__(dataset) + + @lru_cache(maxsize=8) + def __getitem__(self, index): + return self.dataset[index] + + @lru_cache(maxsize=8) + def collater(self, samples): + return self.dataset.collater(samples) diff --git a/SpeechT5/fairseq/fairseq/data/mask_tokens_dataset.py b/SpeechT5/fairseq/fairseq/data/mask_tokens_dataset.py new file mode 100644 index 0000000..9123235 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/mask_tokens_dataset.py @@ -0,0 +1,220 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from functools import lru_cache + +import numpy as np +import torch +from fairseq.data import Dictionary, data_utils + +from . import BaseWrapperDataset, LRUCacheDataset + + +class MaskTokensDataset(BaseWrapperDataset): + """ + A wrapper Dataset for masked language modeling. + + Input items are masked according to the specified masking probability. + + Args: + dataset: Dataset to wrap. + sizes: Sentence lengths + vocab: Dictionary with the vocabulary and special tokens. + pad_idx: Id of pad token in vocab + mask_idx: Id of mask token in vocab + return_masked_tokens: controls whether to return the non-masked tokens + (the default) or to return a tensor with the original masked token + IDs (and *pad_idx* elsewhere). The latter is useful as targets for + masked LM training. + seed: Seed for random number generator for reproducibility. + mask_prob: probability of replacing a token with *mask_idx*. + leave_unmasked_prob: probability that a masked token is unmasked. + random_token_prob: probability of replacing a masked token with a + random token from the vocabulary. + freq_weighted_replacement: sample random replacement words based on + word frequencies in the vocab. + mask_whole_words: only mask whole words. This should be a byte mask + over vocab indices, indicating whether it is the beginning of a + word. We will extend any mask to encompass the whole word. + bpe: BPE to use for whole-word masking. + mask_multiple_length : repeat each mask index multiple times. Default + value is 1. + mask_stdev : standard deviation of masks distribution in case of + multiple masking. Default value is 0. + """ + + @classmethod + def apply_mask(cls, dataset: torch.utils.data.Dataset, *args, **kwargs): + """Return the source and target datasets for masked LM training.""" + dataset = LRUCacheDataset(dataset) + return ( + LRUCacheDataset(cls(dataset, *args, **kwargs, return_masked_tokens=False)), + LRUCacheDataset(cls(dataset, *args, **kwargs, return_masked_tokens=True)), + ) + + def __init__( + self, + dataset: torch.utils.data.Dataset, + vocab: Dictionary, + pad_idx: int, + mask_idx: int, + return_masked_tokens: bool = False, + seed: int = 1, + mask_prob: float = 0.15, + leave_unmasked_prob: float = 0.1, + random_token_prob: float = 0.1, + freq_weighted_replacement: bool = False, + mask_whole_words: torch.Tensor = None, + mask_multiple_length: int = 1, + mask_stdev: float = 0.0, + ): + assert 0.0 < mask_prob < 1.0 + assert 0.0 <= random_token_prob <= 1.0 + assert 0.0 <= leave_unmasked_prob <= 1.0 + assert random_token_prob + leave_unmasked_prob <= 1.0 + assert mask_multiple_length >= 1 + assert mask_stdev >= 0.0 + + self.dataset = dataset + self.vocab = vocab + self.pad_idx = pad_idx + self.mask_idx = mask_idx + self.return_masked_tokens = return_masked_tokens + self.seed = seed + self.mask_prob = mask_prob + self.leave_unmasked_prob = leave_unmasked_prob + self.random_token_prob = random_token_prob + self.mask_whole_words = mask_whole_words + self.mask_multiple_length = mask_multiple_length + self.mask_stdev = mask_stdev + + if random_token_prob > 0.0: + if freq_weighted_replacement: + weights = np.array(self.vocab.count) + else: + weights = np.ones(len(self.vocab)) + weights[: self.vocab.nspecial] = 0 + self.weights = weights / weights.sum() + + self.epoch = 0 + + @property + def can_reuse_epoch_itr_across_epochs(self): + return True # only the noise changes, not item sizes + + def set_epoch(self, epoch, **unused): + super().set_epoch(epoch) + self.epoch = epoch + + def __getitem__(self, index: int): + return self.__getitem_cached__(self.seed, self.epoch, index) + + @lru_cache(maxsize=8) + def __getitem_cached__(self, seed: int, epoch: int, index: int): + with data_utils.numpy_seed(self.seed, self.epoch, index): + item = self.dataset[index] + sz = len(item) + + assert ( + self.mask_idx not in item + ), "Dataset contains mask_idx (={}), this is not expected!".format( + self.mask_idx, + ) + + if self.mask_whole_words is not None: + word_begins_mask = self.mask_whole_words.gather(0, item) + word_begins_idx = word_begins_mask.nonzero().view(-1) + sz = len(word_begins_idx) + words = np.split(word_begins_mask, word_begins_idx)[1:] + assert len(words) == sz + word_lens = list(map(len, words)) + + # decide elements to mask + mask = np.full(sz, False) + num_mask = int( + # add a random number for probabilistic rounding + self.mask_prob * sz / float(self.mask_multiple_length) + + np.random.rand() + ) + + # multiple masking as described in the vq-wav2vec paper (https://arxiv.org/abs/1910.05453) + mask_idc = np.random.choice(sz, num_mask, replace=False) + if self.mask_stdev > 0.0: + lengths = np.random.normal( + self.mask_multiple_length, self.mask_stdev, size=num_mask + ) + lengths = [max(0, int(round(x))) for x in lengths] + mask_idc = np.asarray( + [ + mask_idc[j] + offset + for j in range(len(mask_idc)) + for offset in range(lengths[j]) + ], + dtype=np.int64, + ) + else: + mask_idc = np.concatenate( + [mask_idc + i for i in range(self.mask_multiple_length)] + ) + mask_idc = mask_idc[mask_idc < len(mask)] + try: + mask[mask_idc] = True + except: # something wrong + print( + "Assigning mask indexes {} to mask {} failed!".format( + mask_idc, mask + ) + ) + raise + + if self.return_masked_tokens: + # exit early if we're just returning the masked tokens + # (i.e., the targets for masked LM training) + if self.mask_whole_words is not None: + mask = np.repeat(mask, word_lens) + new_item = np.full(len(mask), self.pad_idx) + new_item[mask] = item[torch.from_numpy(mask.astype(np.uint8)) == 1] + return torch.from_numpy(new_item) + + # decide unmasking and random replacement + rand_or_unmask_prob = self.random_token_prob + self.leave_unmasked_prob + if rand_or_unmask_prob > 0.0: + rand_or_unmask = mask & (np.random.rand(sz) < rand_or_unmask_prob) + if self.random_token_prob == 0.0: + unmask = rand_or_unmask + rand_mask = None + elif self.leave_unmasked_prob == 0.0: + unmask = None + rand_mask = rand_or_unmask + else: + unmask_prob = self.leave_unmasked_prob / rand_or_unmask_prob + decision = np.random.rand(sz) < unmask_prob + unmask = rand_or_unmask & decision + rand_mask = rand_or_unmask & (~decision) + else: + unmask = rand_mask = None + + if unmask is not None: + mask = mask ^ unmask + + if self.mask_whole_words is not None: + mask = np.repeat(mask, word_lens) + + new_item = np.copy(item) + new_item[mask] = self.mask_idx + if rand_mask is not None: + num_rand = rand_mask.sum() + if num_rand > 0: + if self.mask_whole_words is not None: + rand_mask = np.repeat(rand_mask, word_lens) + num_rand = rand_mask.sum() + + new_item[rand_mask] = np.random.choice( + len(self.vocab), + num_rand, + p=self.weights, + ) + + return torch.from_numpy(new_item) diff --git a/SpeechT5/fairseq/fairseq/data/monolingual_dataset.py b/SpeechT5/fairseq/fairseq/data/monolingual_dataset.py new file mode 100644 index 0000000..54fd583 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/monolingual_dataset.py @@ -0,0 +1,253 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch + +from . import FairseqDataset, data_utils + + +def collate(samples, pad_idx, eos_idx, fixed_pad_length=None, pad_to_bsz=None): + if len(samples) == 0: + return {} + + def merge(key, is_list=False): + if is_list: + res = [] + for i in range(len(samples[0][key])): + res.append( + data_utils.collate_tokens( + [s[key][i] for s in samples], + pad_idx, + eos_idx, + left_pad=False, + pad_to_length=fixed_pad_length, + pad_to_bsz=pad_to_bsz, + ) + ) + return res + else: + return data_utils.collate_tokens( + [s[key] for s in samples], + pad_idx, + eos_idx, + left_pad=False, + pad_to_length=fixed_pad_length, + pad_to_bsz=pad_to_bsz, + ) + + src_tokens = merge("source") + if samples[0]["target"] is not None: + is_target_list = isinstance(samples[0]["target"], list) + target = merge("target", is_target_list) + else: + target = src_tokens + + return { + "id": torch.LongTensor([s["id"] for s in samples]), + "nsentences": len(samples), + "ntokens": sum(len(s["source"]) for s in samples), + "net_input": { + "src_tokens": src_tokens, + "src_lengths": torch.LongTensor([s["source"].numel() for s in samples]), + }, + "target": target, + } + + +class MonolingualDataset(FairseqDataset): + """ + A wrapper around torch.utils.data.Dataset for monolingual data. + + Args: + dataset (torch.utils.data.Dataset): dataset to wrap + sizes (List[int]): sentence lengths + vocab (~fairseq.data.Dictionary): vocabulary + shuffle (bool, optional): shuffle the elements before batching + (default: True). + """ + + def __init__( + self, + dataset, + sizes, + src_vocab, + tgt_vocab=None, + add_eos_for_other_targets=False, + shuffle=False, + targets=None, + add_bos_token=False, + fixed_pad_length=None, + pad_to_bsz=None, + src_lang_idx=None, + tgt_lang_idx=None, + ): + self.dataset = dataset + self.sizes = np.array(sizes) + self.vocab = src_vocab + self.tgt_vocab = tgt_vocab or src_vocab + self.add_eos_for_other_targets = add_eos_for_other_targets + self.shuffle = shuffle + self.add_bos_token = add_bos_token + self.fixed_pad_length = fixed_pad_length + self.pad_to_bsz = pad_to_bsz + self.src_lang_idx = src_lang_idx + self.tgt_lang_idx = tgt_lang_idx + + assert targets is None or all( + t in {"self", "future", "past"} for t in targets + ), "targets must be none or one of 'self', 'future', 'past'" + if targets is not None and len(targets) == 0: + targets = None + self.targets = targets + + def __getitem__(self, index): + if self.targets is not None: + # *future_target* is the original sentence + # *source* is shifted right by 1 (maybe left-padded with eos) + # *past_target* is shifted right by 2 (left-padded as needed) + # + # Left-to-right language models should condition on *source* and + # predict *future_target*. + # Right-to-left language models should condition on *source* and + # predict *past_target*. + source, future_target, past_target = self.dataset[index] + source, target = self._make_source_target( + source, future_target, past_target + ) + else: + source = self.dataset[index] + target = None + source, target = self._maybe_add_bos(source, target) + return {"id": index, "source": source, "target": target} + + def __len__(self): + return len(self.dataset) + + def _make_source_target(self, source, future_target, past_target): + if self.targets is not None: + target = [] + + if ( + self.add_eos_for_other_targets + and (("self" in self.targets) or ("past" in self.targets)) + and source[-1] != self.vocab.eos() + ): + # append eos at the end of source + source = torch.cat([source, source.new([self.vocab.eos()])]) + + if "future" in self.targets: + future_target = torch.cat( + [future_target, future_target.new([self.vocab.pad()])] + ) + if "past" in self.targets: + # first token is before the start of sentence which is only used in "none" break mode when + # add_eos_for_other_targets is False + past_target = torch.cat( + [ + past_target.new([self.vocab.pad()]), + past_target[1:], + source[-2, None], + ] + ) + + for t in self.targets: + if t == "self": + target.append(source) + elif t == "future": + target.append(future_target) + elif t == "past": + target.append(past_target) + else: + raise Exception("invalid target " + t) + + if len(target) == 1: + target = target[0] + else: + target = future_target + + return source, self._filter_vocab(target) + + def _maybe_add_bos(self, source, target): + if self.add_bos_token: + source = torch.cat([source.new([self.vocab.bos()]), source]) + if target is not None: + target = torch.cat([target.new([self.tgt_vocab.bos()]), target]) + return source, target + + def num_tokens_vec(self, indices): + """Return the number of tokens for a set of positions defined by indices. + This value is used to enforce ``--max-tokens`` during batching.""" + return self.sizes[indices] + + def _filter_vocab(self, target): + if len(self.tgt_vocab) != len(self.vocab): + + def _filter(target): + mask = target.ge(len(self.tgt_vocab)) + if mask.any(): + target[mask] = self.tgt_vocab.unk() + return target + + if isinstance(target, list): + return [_filter(t) for t in target] + return _filter(target) + return target + + def collater(self, samples): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + + Returns: + dict: a mini-batch with the following keys: + + - `id` (LongTensor): example IDs in the original input order + - `ntokens` (int): total number of tokens in the batch + - `net_input` (dict): the input to the Model, containing keys: + + - `src_tokens` (LongTensor): a padded 2D Tensor of tokens in + the source sentence of shape `(bsz, src_len)`. Padding will + appear on the right. + + - `target` (LongTensor): a padded 2D Tensor of tokens in the + target sentence of shape `(bsz, tgt_len)`. Padding will appear + on the right. + """ + return collate( + samples, + self.vocab.pad(), + self.vocab.eos(), + self.fixed_pad_length, + self.pad_to_bsz, + ) + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return self.sizes[index] + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return self.sizes[index] + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + order.append(self.sizes) + return np.lexsort(order) + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + self.dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/fairseq/data/multi_corpus_dataset.py b/SpeechT5/fairseq/fairseq/data/multi_corpus_dataset.py new file mode 100644 index 0000000..1bd61c3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multi_corpus_dataset.py @@ -0,0 +1,240 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import time +from collections import OrderedDict +from typing import Dict, List + +import numpy as np +from fairseq.data import data_utils + +from . import FairseqDataset + +logger = logging.getLogger(__name__) + + +class MultiCorpusDataset(FairseqDataset): + """ + Stores multiple instances of FairseqDataset together. Requires each instance + to be the same dataset, as the collate method needs to work on batches with + samples from each dataset. + + Allows specifying a distribution over the datasets to use. Note that unlike + MultiCorpusSampledDataset, this distribution allows sampling for each item, + rather than on a batch level. + + Each time ordered_indices() is called, a new sample is generated with + the specified distribution. + + Args: + datasets: a OrderedDict of FairseqDataset instances. + distribution: a List containing the probability of getting an utterance from + corresponding dataset + seed: random seed for sampling the datsets + sort_indices: if true, will sort the ordered indices by size + batch_sample: if true, will ensure each batch is from a single dataset + """ + + def __init__( + self, + datasets: Dict[str, FairseqDataset], + distribution: List[float], + seed: int, + sort_indices: bool = False, + batch_sample: bool = False, + distributed_rank=None, + ): + super().__init__() + assert isinstance(datasets, OrderedDict) + assert len(datasets) == len(distribution) + assert sum(distribution) == 1 + self.datasets = datasets + self.distribution = distribution + self.seed = seed + self.sort_indices = sort_indices + self.batch_sample = batch_sample + self.distributed_rank = distributed_rank + + # Avoid repeated conversions to list later + self.dataset_list = list(datasets.values()) + self.total_num_instances = 0 + + first_dataset = list(self.datasets.values())[0] + + self.dataset_offsets = [] + for dataset in datasets.values(): + assert isinstance(dataset, FairseqDataset) + assert type(dataset) is type(first_dataset) + self.dataset_offsets.append(self.total_num_instances) + self.total_num_instances += len(dataset) + + def ordered_indices(self): + start = time.time() + with data_utils.numpy_seed(self.seed, self.epoch): + logger.info(f"sampling new dataset with seed {self.seed} epoch {self.epoch}") + sampled_indices = [] + num_selected_instances = 0 + + # For each dataset i, sample self.distribution[i] * self.total_num_instances + for i, key in enumerate(self.datasets): + + if i < len(self.datasets) - 1: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.dataset_offsets[i + 1] + else: + num_instances = self.total_num_instances - num_selected_instances + high = self.total_num_instances + + logger.info(f"sampling {num_instances} from {key} dataset") + num_selected_instances += num_instances + + # First, add k copies of the dataset where k = num_instances // len(dataset). + # This ensures an equal distribution of the data points as much as possible. + # For the remaining entries randomly sample them + dataset_size = len(self.datasets[key]) + num_copies = num_instances // dataset_size + dataset_indices = ( + np.random.permutation(high - self.dataset_offsets[i]) + + self.dataset_offsets[i] + )[: num_instances - num_copies * dataset_size] + if num_copies > 0: + sampled_indices += list( + np.concatenate( + ( + np.repeat( + np.arange(self.dataset_offsets[i], high), num_copies + ), + dataset_indices, + ) + ) + ) + else: + sampled_indices += list(dataset_indices) + + assert ( + len(sampled_indices) == self.total_num_instances + ), f"{len(sampled_indices)} vs {self.total_num_instances}" + + np.random.shuffle(sampled_indices) + if self.sort_indices: + sampled_indices.sort(key=lambda i: self.num_tokens(i)) + + logger.info( + "multi_corpus_dataset ordered_indices took {}s".format( + time.time() - start + ) + ) + return np.array(sampled_indices, dtype=np.int64) + + def _map_index(self, index: int): + """ + If dataset A has length N and dataset B has length M + then index 1 maps to index 1 of dataset A, and index N + 1 + maps to index 1 of B. + """ + counter = 0 + for key, dataset in self.datasets.items(): + if index < counter + len(dataset): + return index - counter, key + counter += len(dataset) + raise ValueError( + "Invalid index: {}, max: {}".format(index, self.total_num_instances) + ) + + def __len__(self): + """ + Length of this dataset is the sum of individual datasets + """ + return self.total_num_instances + + def __getitem__(self, index): + new_index, key = self._map_index(index) + try: + item = self.datasets[key][new_index] + item["full_id"] = index + return item + except Exception as e: + e.args = (f"Error from {key} dataset", *e.args) + raise + + def collater(self, samples): + """ + If we are doing batch sampling, then pick the right collater to use. + + Otherwise we assume all collaters are the same. + """ + if len(samples) == 0: + return None + if "full_id" in samples[0]: + _, key = self._map_index(samples[0]["full_id"]) + return self.datasets[key].collater(samples) + else: + # Subclasses may override __getitem__ to not specify full_id + return list(self.datasets.values())[0].collater(samples) + + def num_tokens(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].num_tokens(index) + + def size(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].size(index) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return False + + def set_epoch(self, epoch, **unused): + super().set_epoch(epoch) + logger.info(f"setting epoch of multi_corpus_dataset to {epoch}") + self.epoch = epoch + + @property + def supports_prefetch(self): + return False + + @property + def supports_fetch_outside_dataloader(self): + return all( + self.datasets[key].supports_fetch_outside_dataloader + for key in self.datasets + ) + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + if not self.batch_sample: + return super().batch_by_size( + indices, max_tokens, max_sentences, required_batch_size_multiple + ) + + dataset_indices = {key: [] for key in self.datasets} + for i in indices: + _, key = self._map_index(i) + dataset_indices[key].append(i) + + batches = [] + for key in dataset_indices: + cur_batches = super().batch_by_size( + np.array(dataset_indices[key], dtype=np.int64), + max_tokens, + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {len(cur_batches)} batches for dataset {key}") + batches += cur_batches + + # If this dataset is used in a distributed training setup, + # then shuffle such that the order is seeded by the distributed rank + # as well + if self.distributed_rank is not None: + with data_utils.numpy_seed(self.seed, self.epoch, self.distributed_rank): + np.random.shuffle(batches) + return batches diff --git a/SpeechT5/fairseq/fairseq/data/multi_corpus_sampled_dataset.py b/SpeechT5/fairseq/fairseq/data/multi_corpus_sampled_dataset.py new file mode 100644 index 0000000..e2e9fdf --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multi_corpus_sampled_dataset.py @@ -0,0 +1,152 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections import OrderedDict +from typing import Callable, Dict, List + +import numpy as np + +from . import FairseqDataset + + +def uniform_sampler(x): + # Sample from uniform distribution + return np.random.choice(x, 1).item() + + +class MultiCorpusSampledDataset(FairseqDataset): + """ + Stores multiple instances of FairseqDataset together and in every iteration + creates a batch by first sampling a dataset according to a specified + probability distribution and then getting instances from that dataset. + + Args: + datasets: an OrderedDict of FairseqDataset instances. + sampling_func: A function for sampling over list of dataset keys. + The default strategy is to sample uniformly. + """ + + def __init__( + self, + datasets: Dict[str, FairseqDataset], + sampling_func: Callable[[List], int] = None, + ): + super().__init__() + assert isinstance(datasets, OrderedDict) + self.datasets = datasets + if sampling_func is None: + sampling_func = uniform_sampler + self.sampling_func = sampling_func + + self.total_num_instances = 0 + for _, dataset in datasets.items(): + assert isinstance(dataset, FairseqDataset) + self.total_num_instances += len(dataset) + + self._ordered_indices = None + + def __len__(self): + """ + Length of this dataset is the sum of individual datasets + """ + return self.total_num_instances + + def ordered_indices(self): + """ + Ordered indices for batching. Here we call the underlying + dataset's ordered_indices() so that we get the same random ordering + as we would have from using the underlying dataset directly. + """ + if self._ordered_indices is None: + self._ordered_indices = OrderedDict( + [ + (key, dataset.ordered_indices()) + for key, dataset in self.datasets.items() + ] + ) + return np.arange(len(self)) + + def _map_index_to_dataset(self, key: int, index: int): + """ + Different underlying datasets have different lengths. In order to ensure + we are not accessing an index outside the range of the current dataset + size, we wrap around. This function should be called after we have + created an ordering for this and all underlying datasets. + """ + assert ( + self._ordered_indices is not None + ), "Must call MultiCorpusSampledDataset.ordered_indices() first" + mapped_index = index % len(self.datasets[key]) + return self._ordered_indices[key][mapped_index] + + def __getitem__(self, index: int): + """ + Get the item associated with index from each underlying dataset. + Since index is in the range of [0, TotalNumInstances], we need to + map the index to the dataset before retrieving the item. + """ + return OrderedDict( + [ + (key, dataset[self._map_index_to_dataset(key, index)]) + for key, dataset in self.datasets.items() + ] + ) + + def collater(self, samples: List[Dict]): + """ + Generate a mini-batch for this dataset. + To convert this into a regular mini-batch we use the following + logic: + 1. Select a dataset using the specified probability distribution. + 2. Call the collater function of the selected dataset. + """ + if len(samples) == 0: + return None + + selected_key = self.sampling_func(list(self.datasets.keys())) + selected_samples = [sample[selected_key] for sample in samples] + return self.datasets[selected_key].collater(selected_samples) + + def num_tokens(self, index: int): + """ + Return an example's length (number of tokens), used for batching. Here + we return the max across all examples at index across all underlying + datasets. + """ + return max( + dataset.num_tokens(self._map_index_to_dataset(key, index)) + for key, dataset in self.datasets.items() + ) + + def size(self, index: int): + """ + Return an example's size as a float or tuple. Here we return the max + across all underlying datasets. This value is used when filtering a + dataset with max-positions. + """ + return max( + dataset.size(self._map_index_to_dataset(key, index)) + for key, dataset in self.datasets.items() + ) + + @property + def supports_prefetch(self): + return all( + getattr(dataset, "supports_prefetch", False) + for dataset in self.datasets.values() + ) + + def prefetch(self, indices): + for key, dataset in self.datasets.items(): + dataset.prefetch( + [self._map_index_to_dataset(key, index) for index in indices] + ) + + @property + def supports_fetch_outside_dataloader(self): + return all( + self.datasets[key].supports_fetch_outside_dataloader + for key in self.datasets + ) diff --git a/SpeechT5/fairseq/fairseq/data/multilingual/__init__.py b/SpeechT5/fairseq/fairseq/data/multilingual/__init__.py new file mode 100644 index 0000000..6264236 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multilingual/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. diff --git a/SpeechT5/fairseq/fairseq/data/multilingual/multilingual_data_manager.py b/SpeechT5/fairseq/fairseq/data/multilingual/multilingual_data_manager.py new file mode 100644 index 0000000..a2fae5b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multilingual/multilingual_data_manager.py @@ -0,0 +1,1131 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import itertools +import json +import logging +import math +import os +from collections import OrderedDict, defaultdict + +from fairseq import utils +from fairseq.data import ( + AppendTokenDataset, + ConcatDataset, + Dictionary, + LanguagePairDataset, + PrependTokenDataset, + SampledMultiDataset, + SampledMultiEpochDataset, + StripTokenDataset, + TransformEosLangPairDataset, + TruncateDataset, + data_utils, + indexed_dataset, +) +from fairseq.data.multilingual.multilingual_utils import ( + EncoderLangtok, + LangTokSpec, + LangTokStyle, + augment_dictionary, + get_lang_tok, +) +from fairseq.data.multilingual.sampled_multi_dataset import CollateFormat +from fairseq.file_io import PathManager +from fairseq.utils import FileContentsAction, csv_str_list, eval_str_dict + + +logger = logging.getLogger(__name__) + +SRC_DICT_NAME = 'src' +TGT_DICT_NAME = 'tgt' + + +def _lang_id(dic: Dictionary, lang: str): + """Return language ID index.""" + idx = dic.index(lang) + assert idx != dic.unk_index, "cannot find language ID for lang {}".format(lang) + return idx + + +def load_sampling_weights(from_file): + with open(from_file) as f: + weights = json.load(f) + return weights + + +class MultilingualDatasetManager(object): + def __init__(self, args, lang_pairs, langs, dicts, sampling_method): + super().__init__() + self.args = args + self.seed = args.seed + self.lang_pairs = lang_pairs + self.extra_lang_pairs = ( + list( + {p for _, v in args.extra_lang_pairs.items() for p in v.split(",")} + ) + if args.extra_lang_pairs + else [] + ) + self.src_langs = {p.split("-")[0] for p in args.lang_pairs + self.extra_lang_pairs} + self.tgt_langs = {p.split("-")[1] for p in args.lang_pairs + self.extra_lang_pairs} + self.langs = langs + self.dicts = dicts + self.lang_dict = self.create_lang_dictionary(self.langs) + self.sampling_method = sampling_method + self.sampling_scheduler = None + self._has_sharded_data = False + self._num_shards_dict = {} + self._training_data_sizes = defaultdict(lambda: {}) + + @classmethod + def setup_data_manager(cls, args, lang_pairs, langs, dicts, sampling_method): + return MultilingualDatasetManager( + args, lang_pairs, langs, dicts, sampling_method + ) + + @staticmethod + def add_args(parser): + parser.add_argument( + "data", + help="colon separated path to data directories list, \ + will be iterated upon during epochs in round-robin manner", + action=FileContentsAction, + ) + parser.add_argument( + "--langs", + default=None, + type=csv_str_list, + help="a list of languages comma sperated languages which can appear in lang-pairs; " + "note that the ordering determines language token IDs", + ) + parser.add_argument( + "--lang-dict", + default=None, + type=str, + help="an external file which contains a list of " + "languages which can appear in lang-pairs; " + "note that the ordering determines language token IDs; " + "--langs and --lang-dict are two exclusive options", + ) + parser.add_argument('--source-dict', default=None, type=str, + help='path to source dictionary; if specified it will override per language dictionary loading') + parser.add_argument('--target-dict', default=None, type=str, + help='path to target dictionary; if specified it will override per language dictionary loading') + parser.add_argument( + "--lang-tok-style", + default=LangTokStyle.multilingual.value, + type=str, + choices=[LangTokStyle.multilingual.value, LangTokStyle.mbart.value], + help="language token styles", + ) + + parser.add_argument( + "--load-alignments", + action="store_true", + help="load the binarized alignments", + ) + parser.add_argument( + "--left-pad-source", + default="True", + type=str, + metavar="BOOL", + help="pad the source on the left", + ) + parser.add_argument( + "--left-pad-target", + default="False", + type=str, + metavar="BOOL", + help="pad the target on the left", + ) + parser.add_argument( + "--max-source-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the source sequence", + ) + parser.add_argument( + "--max-target-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the target sequence", + ) + parser.add_argument( + "--upsample-primary", + default=1, + type=int, + help="amount to upsample primary dataset", + ) + parser.add_argument( + "--truncate-source", + action="store_true", + default=False, + help="truncate source to max-source-positions", + ) + parser.add_argument( + "--encoder-langtok", + default=None, + type=str, + choices=[EncoderLangtok.src.value, EncoderLangtok.tgt.value], + metavar="SRCTGT", + help="prepend to the beginning of source sentence the source or target " + "language token. (src/tgt)", + ) + parser.add_argument( + "--decoder-langtok", + action="store_true", + help="prepend to the beginning of target sentence the target language token", + ) + parser.add_argument( + "--lang-tok-replacing-bos-eos", action="store_true", default=False + ) + parser.add_argument( + "--enable-lang-ids", + default=False, + action="store_true", + help="whether to include language IDs in samples", + ) + parser.add_argument( + "--enable-reservsed-directions-shared-datasets", + default=False, + action="store_true", + help="whether to allow datasets be used in reversed directions", + ) + + parser.add_argument( + "--extra-data", + help='a dictionary of data name to this path, \ + e.g. {"mined", path_to_mined_data, "denoised": path_to_denoised_data}', + type=lambda uf: eval_str_dict(uf, type=str), + default=None, + ) + parser.add_argument( + "--extra-lang-pairs", + help='a dictionary of data name to the language pairs they serve, \ + e.g. {"mined": comma-separated-lang-pairs, "denoised": comma-separated-lang-pairs}', + type=lambda uf: eval_str_dict(uf, type=str), + default=None, + ) + parser.add_argument( + "--fixed-dictionary", + help="Fixed dictionary to use with model path", + default=None, + type=str, + ) + parser.add_argument( + "--langtoks-specs", + help='a list of comma separated data types that a set of language tokens to be specialized for, \ + e.g. "main,dae,mined". There will be a set of language tokens added to the vocab to \ + distinguish languages in different training data types. If not specified, default language \ + tokens per languages will be added', + default=LangTokSpec.main.value, + type=csv_str_list, + ) + parser.add_argument( + "--langtoks", + help='a dictionary of how to add language tokens, \ + e.g. {"mined": (None, "tgt"), "mono_dae": ("src.dae", "tgt"), "main": \ + ("src", "tgt")}, or {"mined": ("src.mined", "tgt")}', + default=None, + type=lambda uf: eval_str_dict(uf, type=str), + ) + parser.add_argument( + "--sampling-weights-from-file", + help='a file contain a python dictionary of how to sample data sets, \ + e.g. { "main:en_XX-es_XX": 0.2, "mined:en_XX-pt_XX": 0.5, \ + "mono_dae:es_XX-es_XX: 0.3, "main:en_xx-fr_XX": 0.8 }', + default=None, + type=str, + ) + parser.add_argument( + "--sampling-weights", + help='a dictionary of how to sample data sets, \ + e.g. { "main:en_XX-es_XX": 0.2, "mined:en_XX-pt_XX": 0.5, \ + "mono_dae:es_XX-es_XX: 0.3, "main:en_xx-fr_XX": 0.8 }', + default=None, + type=lambda uf: eval_str_dict(uf, type=str), + ) + parser.add_argument( + "--virtual-epoch-size", + default=None, + type=int, + help="virtual epoch size to speed up data loading", + ) + parser.add_argument( + "--virtual-data-size", + default=None, + type=int, + help="virtual data size of the whole joint dataset to speed" + "up data loading and have specific dynamic sampling strategy interval", + ) + + @classmethod + def load_langs(cls, args, **kwargs): + if args.lang_dict and args.langs: + raise ValueError("--langs and --lang-dict can not both be specified") + if args.lang_dict is None and args.langs is None: + logger.warning( + "External language dictionary is not provided; " + "use lang-pairs to infer the set of supported languages. " + "The language ordering is not stable which might cause " + "misalignment in pretraining and finetuning." + ) + # infer from lang_pairs as it is + langs = list( + {x for lang_pair in args.lang_pairs for x in lang_pair.split("-")} + ) + langs = sorted(langs) + logger.info(f"inferred language list: {langs}") + elif args.lang_dict: + with open( + PathManager.get_local_path(args.lang_dict), "r", encoding="utf-8" + ) as f: + langs = [lang.strip() for lang in f.readlines() if lang.strip()] + logger.info( + f"loaded language list from {args.lang_dict} as they are ordered in file" + ) + elif args.langs: + langs = args.langs + logger.info( + f"parsed the language list as they are ordered in the option: {langs}" + ) + return langs + + def has_sharded_data(self, split): + return self._has_sharded_data and split == getattr( + self.args, "train_subset", None + ) + + def _shared_collater(self): + return not (self.args.extra_data and "mono_dae" in self.args.extra_data) and ( + not self.args.lang_tok_replacing_bos_eos + ) + + def estimate_global_pass_epoch(self, epoch): + if self.args.virtual_epoch_size is None or self.args.virtual_data_size is None: + return None + # one epoch more for remaining data in each shard + virtual_epochs_per_shard = math.ceil( + self.args.virtual_data_size / self.args.virtual_epoch_size + ) + # note that fairseq epoch / shard_epoch starts from 1 + shard_epoch = (epoch - 1) // virtual_epochs_per_shard + 1 + return shard_epoch + + @classmethod + def prepare(cls, load_dictionary, args, **kargs): + args.left_pad_source = utils.eval_bool(args.left_pad_source) + args.left_pad_target = utils.eval_bool(args.left_pad_target) + + if not hasattr(args, "shuffle_instance"): + args.shuffle_instance = False + if args.langtoks is None: + args.langtoks = {} + if "main" not in args.langtoks: + src_langtok_spec = args.encoder_langtok if args.encoder_langtok else None + tgt_langtok_spec = "tgt" if args.decoder_langtok else None + args.langtoks["main"] = (src_langtok_spec, tgt_langtok_spec) + + def check_langs(langs, pairs): + messages = [] + for src, tgt in pairs: + if src not in langs or tgt not in langs: + messages.append( + f"language pair {src}-{tgt} contains languages " + "that are not in the language dictionary" + ) + if len(messages) > 0: + raise ValueError(" ".join(messages) + f"; langs: {langs}") + + if args.lang_pairs is None: + raise ValueError( + "--lang-pairs is required. List all the language pairs in the training objective." + ) + if isinstance(args.lang_pairs, str): + args.lang_pairs = args.lang_pairs.split(",") + if args.source_lang is not None or args.target_lang is not None: + training = False + else: + training = True + language_list = cls.load_langs(args, **kargs) + check_langs( + language_list, + ( + [p.split("-") for p in args.lang_pairs] + if training + else [(args.source_lang, args.target_lang)] + ), + ) + + def load_dictionary_and_postproc(path): + d = load_dictionary(path) + augment_dictionary( + dictionary=d, + language_list=language_list, + lang_tok_style=args.lang_tok_style, + langtoks_specs=args.langtoks_specs, + extra_data=args.extra_data, + ) + return d + + dicts = cls.load_all_dictionaries(args, language_list, load_dictionary_and_postproc, training) + return language_list, dicts, training + + @classmethod + def load_all_dictionaries(cls, args, language_list, load_dictionary, training): + dicts = OrderedDict() + if args.source_dict is not None: + dicts[SRC_DICT_NAME] = load_dictionary(args.source_dict) + if args.target_dict is not None: + dicts[TGT_DICT_NAME] = load_dictionary(args.target_dict) + + if training: + extra_lang_pairs = ( + list( + {p for _, v in args.extra_lang_pairs.items() for p in v.split(",")} + ) + if args.extra_lang_pairs + else [] + ) + src_langs_to_load_dicts = sorted( + {p.split("-")[0] for p in (args.lang_pairs + extra_lang_pairs)} + ) + tgt_langs_to_load_dicts = sorted( + {p.split("-")[1] for p in (args.lang_pairs + extra_lang_pairs)} + ) + else: + src_langs_to_load_dicts = [args.source_lang] + tgt_langs_to_load_dicts = [args.target_lang] + + paths = utils.split_paths(args.data) + assert len(paths) > 0 + + def load_dicts(langs_to_load_dicts): + for lang in langs_to_load_dicts: + dicts[lang] = load_dictionary( + os.path.join(paths[0], "dict.{}.txt".format(lang)) + ) + if len(dicts) > 0: + dict0 = next(iter(dicts.values())) + assert dicts[lang].pad() == dict0.pad() + assert dicts[lang].eos() == dict0.eos() + assert dicts[lang].unk() == dict0.unk() + logger.info("[{}] dictionary: {} types".format(lang, len(dicts[lang]))) + + if args.fixed_dictionary is not None: + fixed_dict = load_dictionary(args.fixed_dictionary) + dicts = {lang: fixed_dict for lang in src_langs_to_load_dicts + tgt_langs_to_load_dicts} + else: + if args.source_dict is None: + load_dicts(src_langs_to_load_dicts) + if args.target_dict is None: + load_dicts(tgt_langs_to_load_dicts) + return dicts + + def get_source_dictionary(self, lang): + if self.args.source_dict is not None: + return self.dicts[SRC_DICT_NAME] + else: + return self.dicts[lang] + + def get_target_dictionary(self, lang): + if self.args.target_dict is not None: + return self.dicts[TGT_DICT_NAME] + else: + return self.dicts[lang] + + @classmethod + def create_lang_dictionary(cls, langs): + unk = "<unk>" + # hack to remove symbols other than unk as they are not needed by lang dict + lang_dict = Dictionary(pad=unk, eos=unk, unk=unk, bos=unk) + for lang in langs: + lang_dict.add_symbol(lang) + return lang_dict + + @classmethod + def get_langtok_index(cls, lang_tok, dic): + idx = dic.index(lang_tok) + assert ( + idx != dic.unk_index + ), "cannot find language token {} in the dictionary".format(lang_tok) + return idx + + def get_encoder_langtok(self, src_lang, tgt_lang, spec=None): + if spec is None: + return None + if spec and spec.startswith("src"): + if src_lang is None: + return None + langtok = get_lang_tok( + lang=src_lang, lang_tok_style=self.args.lang_tok_style, spec=spec + ) + else: + if tgt_lang is None: + return None + langtok = get_lang_tok( + lang=tgt_lang, lang_tok_style=self.args.lang_tok_style, spec=spec + ) + return self.get_langtok_index( + langtok, self.get_source_dictionary(src_lang) if src_lang else self.get_target_dictionary(tgt_lang) + ) + + def get_decoder_langtok(self, tgt_lang, spec=None): + if spec is None: + return None + langtok = get_lang_tok( + lang=tgt_lang, lang_tok_style=self.args.lang_tok_style, spec=spec + ) + return self.get_langtok_index(langtok, self.get_target_dictionary(tgt_lang)) + + @classmethod + def load_data(cls, path, vdict, impl): + dataset = data_utils.load_indexed_dataset(path, vdict, impl) + return dataset + + @classmethod + def split_exists(cls, split, src, tgt, lang, data_path, dataset_impl): + filename = os.path.join(data_path, "{}.{}-{}.{}".format(split, src, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + def load_lang_dataset( + self, + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + max_source_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + ): + + src_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if self.split_exists(split_k, src, tgt, src, data_path, dataset_impl): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, src, tgt)) + elif self.split_exists(split_k, tgt, src, src, data_path, dataset_impl): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, tgt, src)) + else: + if k > 0: + break + else: + logger.error( + f"Dataset not found: {data_path}, {split_k}, {src}, {tgt}" + ) + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = self.load_data(prefix + src, src_dict, dataset_impl) + if truncate_source: + src_dataset = AppendTokenDataset( + TruncateDataset( + StripTokenDataset(src_dataset, src_dict.eos()), + max_source_positions - 1, + ), + src_dict.eos(), + ) + src_datasets.append(src_dataset) + tgt_datasets.append(self.load_data(prefix + tgt, tgt_dict, dataset_impl)) + + logger.info( + "{} {} {}-{} {} examples".format( + data_path, split_k, src, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(tgt_datasets) + + if len(src_datasets) == 1: + src_dataset, tgt_dataset = src_datasets[0], tgt_datasets[0] + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + + align_dataset = None + if load_alignments: + align_path = os.path.join( + data_path, "{}.align.{}-{}".format(split, src, tgt) + ) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + return src_dataset, tgt_dataset, align_dataset + + def load_langpair_dataset( + self, + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + src_dataset_transform_func=lambda dataset: dataset, + tgt_dataset_transform_func=lambda dataset: dataset, + src_lang_id=None, + tgt_lang_id=None, + langpairs_sharing_datasets=None, + ): + norm_direction = "-".join(sorted([src, tgt])) + if langpairs_sharing_datasets is not None: + src_dataset = langpairs_sharing_datasets.get( + (data_path, split, norm_direction, src), "NotInCache" + ) + tgt_dataset = langpairs_sharing_datasets.get( + (data_path, split, norm_direction, tgt), "NotInCache" + ) + align_dataset = langpairs_sharing_datasets.get( + (data_path, split, norm_direction, src, tgt), "NotInCache" + ) + + # a hack: any one is not in cache, we need to reload them + if ( + langpairs_sharing_datasets is None + or src_dataset == "NotInCache" + or tgt_dataset == "NotInCache" + or align_dataset == "NotInCache" + or split != getattr(self.args, "train_subset", None) + ): + # source and target datasets can be reused in reversed directions to save memory + # reversed directions of valid and test data will not share source and target datasets + src_dataset, tgt_dataset, align_dataset = self.load_lang_dataset( + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + max_source_positions=max_source_positions, + prepend_bos=prepend_bos, + load_alignments=load_alignments, + truncate_source=truncate_source, + ) + src_dataset = src_dataset_transform_func(src_dataset) + tgt_dataset = tgt_dataset_transform_func(tgt_dataset) + if langpairs_sharing_datasets is not None: + langpairs_sharing_datasets[ + (data_path, split, norm_direction, src) + ] = src_dataset + langpairs_sharing_datasets[ + (data_path, split, norm_direction, tgt) + ] = tgt_dataset + langpairs_sharing_datasets[ + (data_path, split, norm_direction, src, tgt) + ] = align_dataset + if align_dataset is None: + # no align data so flag the reverse direction as well in sharing + langpairs_sharing_datasets[ + (data_path, split, norm_direction, tgt, src) + ] = align_dataset + else: + logger.info( + f"Reusing source and target datasets of [{split}] {tgt}-{src} for reversed direction: " + f"[{split}] {src}-{tgt}: src length={len(src_dataset)}; tgt length={len(tgt_dataset)}" + ) + + return LanguagePairDataset( + src_dataset, + src_dataset.sizes, + src_dict, + tgt_dataset, + tgt_dataset.sizes if tgt_dataset is not None else None, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + src_lang_id=src_lang_id, + tgt_lang_id=tgt_lang_id, + ) + + def src_dataset_tranform_func(self, src_lang, tgt_lang, dataset, spec=None): + if self.args.lang_tok_replacing_bos_eos: + # it is handled by self.alter_dataset_langtok + # TODO: Unifiy with alter_dataset_langtok + return dataset + if spec is None: + return dataset + tok = self.get_encoder_langtok(src_lang, tgt_lang, spec) + if tok: + return PrependTokenDataset(dataset, tok) + return dataset + + def tgt_dataset_tranform_func(self, source_lang, target_lang, dataset, spec=None): + if dataset is None: + # note that target dataset can be None during inference time + return None + if self.args.lang_tok_replacing_bos_eos: + # TODO: Unifiy with alter_dataset_langtok + # It is handled by self.alter_dataset_langtok. + # The complication in self.alter_dataset_langtok + # makes a unified framework difficult. + return dataset + # if not self.args.decoder_langtok: + if not spec: + return dataset + tok = self.get_decoder_langtok(target_lang, spec) + if tok: + return PrependTokenDataset(dataset, tok) + return dataset + + def alter_dataset_langtok( + self, + lang_pair_dataset, + src_eos=None, + src_lang=None, + tgt_eos=None, + tgt_lang=None, + src_langtok_spec=None, + tgt_langtok_spec=None, + ): + if src_langtok_spec is None and tgt_langtok_spec is None: + return lang_pair_dataset + + new_src_eos = None + if ( + src_langtok_spec is not None + and src_eos is not None + and (src_lang is not None or tgt_lang is not None) + ): + new_src_eos = self.get_encoder_langtok(src_lang, tgt_lang, src_langtok_spec) + else: + src_eos = None + + new_tgt_bos = None + if tgt_langtok_spec and tgt_eos is not None and tgt_lang is not None: + new_tgt_bos = self.get_decoder_langtok(tgt_lang, tgt_langtok_spec) + else: + tgt_eos = None + + return TransformEosLangPairDataset( + lang_pair_dataset, + src_eos=src_eos, + new_src_eos=new_src_eos, + tgt_bos=tgt_eos, + new_tgt_bos=new_tgt_bos, + ) + + def load_a_dataset( + self, + split, + data_path, + src, + src_dict, + tgt, + tgt_dict, + combine, + prepend_bos=False, + langpairs_sharing_datasets=None, + data_category=None, + **extra_kwargs, + ): + dataset_impl = self.args.dataset_impl + upsample_primary = self.args.upsample_primary + left_pad_source = self.args.left_pad_source + left_pad_target = self.args.left_pad_target + max_source_positions = self.args.max_source_positions + max_target_positions = self.args.max_target_positions + load_alignments = self.args.load_alignments + truncate_source = self.args.truncate_source + src_dataset_transform_func = self.src_dataset_tranform_func + tgt_dataset_transform_func = self.tgt_dataset_tranform_func + enable_lang_ids = self.args.enable_lang_ids + lang_dictionary = self.lang_dict + src_langtok_spec, tgt_langtok_spec = extra_kwargs["langtok_spec"] + + src_langtok = self.get_encoder_langtok(src, tgt, src_langtok_spec) + tgt_langtok = self.get_decoder_langtok(tgt, tgt_langtok_spec) + logger.info( + f"{data_category}:{src}-{tgt} src_langtok: {src_langtok}; tgt_langtok: {tgt_langtok}" + ) + + langpair_ds = self.load_langpair_dataset( + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos, + load_alignments, + truncate_source, + src_dataset_transform_func=lambda dataset: src_dataset_transform_func( + src, tgt, dataset, src_langtok_spec + ), + tgt_dataset_transform_func=lambda dataset: tgt_dataset_transform_func( + src, tgt, dataset, tgt_langtok_spec + ), + src_lang_id=_lang_id(lang_dictionary, src) + if enable_lang_ids and lang_dictionary is not None + else None, + tgt_lang_id=_lang_id(lang_dictionary, tgt) + if enable_lang_ids and lang_dictionary is not None + else None, + langpairs_sharing_datasets=langpairs_sharing_datasets, + ) + # TODO: handle modified lang toks for mined data and dae data + if self.args.lang_tok_replacing_bos_eos: + ds = self.alter_dataset_langtok( + langpair_ds, + src_eos=self.get_source_dictionary(src).eos() if src else self.get_target_dictionary(tgt).eos(), + src_lang=src, + tgt_eos=self.get_target_dictionary(tgt).eos(), + tgt_lang=tgt, + src_langtok_spec=src_langtok_spec, + tgt_langtok_spec=tgt_langtok_spec, + ) + else: + ds = langpair_ds + return ds + + def load_split_langpair_datasets(self, split, data_param_list): + datasets = [] + langpairs_sharing_datasets = ( + {} if self.args.enable_reservsed_directions_shared_datasets else None + ) + for param in data_param_list: + ds = self.load_a_dataset( + split=split, + langpairs_sharing_datasets=langpairs_sharing_datasets, + **param, + ) + datasets.append(ds) + return datasets + + def get_data_paths_and_lang_pairs(self, split): + datapaths = {"main": self.args.data} + lang_pairs = {"main": self.lang_pairs} + if split == getattr(self.args, "train_subset", None): + # only training data can have extra data and extra language pairs + if self.args.extra_data: + extra_datapaths = self.args.extra_data + datapaths.update(extra_datapaths) + if self.args.extra_lang_pairs: + extra_lang_pairs = { + k: v.split(",") for k, v in self.args.extra_lang_pairs.items() + } + lang_pairs.update(extra_lang_pairs) + return datapaths, lang_pairs + + @classmethod + def get_dataset_key(cls, data_category, src, tgt): + return f"{data_category}:{src}-{tgt}" + + @classmethod + def _get_shard_num_dict(cls, split, paths): + shards = defaultdict(int) + for path in paths: + files = PathManager.ls(path) + directions = set() + for f in files: + if f.startswith(split) and f.endswith(".idx"): + # idx files of the form "{split}.{src}-{tgt}.{lang}.idx" + direction = f.split(".")[-3] + directions.add(direction) + for direction in directions: + shards[direction] += 1 + return shards + + def get_split_num_data_shards(self, split): + if split in self._num_shards_dict: + return self._num_shards_dict[split] + num_shards_dict = {} + data_paths, lang_pairs = self.get_data_paths_and_lang_pairs(split) + + for data_category, paths in data_paths.items(): + if data_category not in lang_pairs: + continue + paths = utils.split_paths(paths) + shards_dict = self._get_shard_num_dict(split, paths) + lang_dirs = [ + lang_pair.split("-") for lang_pair in lang_pairs[data_category] + ] + lang_dirs = [x if len(x) > 1 else (x[0], x[0]) for x in lang_dirs] + for src, tgt in lang_dirs: + key = self.get_dataset_key(data_category, src, tgt) + if "mono_" in data_category: + # monolingual data requires tgt only + assert src is None or src == tgt, ( + f"error: src={src}, " + "tgt={tgt} for data_category={data_category}" + ) + num_shards_dict[key] = shards_dict[tgt] + else: + if f"{src}-{tgt}" in shards_dict: + num_shards_dict[key] = shards_dict[f"{src}-{tgt}"] + elif f"{tgt}-{src}" in shards_dict: + # follow the fairseq tradition to use reversed direction data if it is not available + num_shards_dict[key] = shards_dict[f"{tgt}-{src}"] + self._num_shards_dict[split] = num_shards_dict + logger.info(f"[{split}] num of shards: {num_shards_dict}") + return num_shards_dict + + @classmethod + def get_shard_id(cls, num_shards, epoch, shard_epoch=None): + shard = epoch if shard_epoch is None else shard_epoch + shard = (shard - 1) % num_shards + return shard + + def get_split_data_path(self, paths, epoch, shard_epoch, num_shards): + path = paths[self.get_shard_id(num_shards, epoch, shard_epoch)] + return path + + def get_split_data_param_list(self, split, epoch, shard_epoch=None): + # TODO: to extend with extra datasets and keys and loop over different shard data paths + param_list = [] + data_paths, lang_pairs = self.get_data_paths_and_lang_pairs(split) + logger.info(f"langtoks settings: {self.args.langtoks}") + split_num_shards_dict = self.get_split_num_data_shards(split) + for data_category, paths in data_paths.items(): + if data_category not in lang_pairs: + continue + paths = utils.split_paths(paths) + assert len(paths) > 0 + if len(paths) > 1: + self._has_sharded_data = True + if split != getattr(self.args, "train_subset", None): + # if not training data set, use the first shard for valid and test + paths = paths[:1] + + if data_category in self.args.langtoks: + lang_tok_spec = self.args.langtoks[data_category] + else: + # default to None + lang_tok_spec = (None, None) + + # infer langcode + lang_dirs = [ + lang_pair.split("-") for lang_pair in lang_pairs[data_category] + ] + lang_dirs = [x if len(x) > 1 else (x[0], x[0]) for x in lang_dirs] + for src, tgt in lang_dirs: + assert src is not None or data_category == "mono_dae", ( + f"error: src={src}, " "tgt={tgt} for data_category={data_category}" + ) + # logger.info(f"preparing param for {data_category}: {src} - {tgt}") + key = self.get_dataset_key(data_category, src, tgt) + data_path = self.get_split_data_path( + paths, epoch, shard_epoch, split_num_shards_dict[key] + ) + param_list.append( + { + "key": key, + "data_path": data_path, + "split": split, + "src": src, + "src_dict": self.get_source_dictionary(src) + if src and data_category != "mono_dae" + else None, + "tgt": tgt, + "tgt_dict": self.get_target_dictionary(tgt), + "data_category": data_category, + "langtok_spec": lang_tok_spec, + } + ) + return param_list + + def get_train_dataset_sizes( + self, data_param_list, datasets, epoch, shard_epoch=None + ): + num_shards = [ + self.get_split_num_data_shards(param["split"])[param["key"]] + for param in data_param_list + ] + data_sizes = [] + for (key, d), num_shard in zip(datasets, num_shards): + my_data_sizes = self._training_data_sizes[key] + shard_ind = self.get_shard_id(num_shard, epoch, shard_epoch) + if shard_ind not in my_data_sizes: + my_data_sizes[shard_ind] = len(d) + known_size = max(my_data_sizes.values()) + data_sizes.append( + # If we don't know the data size of the shard yet, + # use the the max known data size to approximate. + # Note that we preprocess shards by a designated shard size + # and put any remaining data at the end into the last shard so + # the max shard size approximation is almost correct before loading + # the last shard; after loading the last shard, it will have the + # exact data sizes of the whole data size. + (key, sum(my_data_sizes.get(i, known_size) for i in range(num_shard))) + ) + logger.info( + f"estimated total data sizes of all shards used in sampling ratios: {data_sizes}. " + "Note that if the data a shard has not been loaded yet, use the max known data size to approximate" + ) + return [s for _, s in data_sizes] + + def get_train_sampling_ratios( + self, data_param_list, datasets, epoch=1, shard_epoch=None + ): + data_sizes = self.get_train_dataset_sizes( + data_param_list, datasets, epoch, shard_epoch + ) + sampling_func = self.sampling_method.sampling_method_selector() + sample_ratios = sampling_func(data_sizes) if sampling_func is not None else None + return sample_ratios + + def get_sampling_ratios(self, data_param_list, datasets, epoch, shard_epoch=None): + if self.args.sampling_weights_from_file: + weights = load_sampling_weights(self.args.sampling_weights_from_file) + sample_ratios = [weights[k] for k, _ in datasets] + logger.info( + "| ignoring --sampling-weights when loadding sampling weights " + f"from file {self.args.sampling_weights_from_file}" + ) + elif self.args.sampling_weights: + sample_ratios = [self.args.sampling_weights[k] for k, _ in datasets] + else: + sample_ratios = self.get_train_sampling_ratios( + data_param_list, datasets, epoch, shard_epoch + ) + + if sample_ratios is not None: + logger.info( + "| Upsample ratios: {}".format( + list(zip(map(lambda x: x["key"], data_param_list), sample_ratios)) + ) + ) + assert len(sample_ratios) == len(datasets) + return sample_ratios + + def load_split_datasets( + self, split, training, epoch=1, combine=False, shard_epoch=None, **kwargs + ): + data_param_list = self.get_split_data_param_list( + split, epoch, shard_epoch=shard_epoch + ) + langpairs_sharing_datasets = ( + {} if self.args.enable_reservsed_directions_shared_datasets else None + ) + datasets = [ + ( + param["key"], + self.load_a_dataset( + combine=combine, + langpairs_sharing_datasets=langpairs_sharing_datasets, + **param, + ), + ) + for param in data_param_list + ] + return datasets, data_param_list + + def load_into_concat_dataset(self, split, datasets, data_param_list): + if self.args.lang_tok_replacing_bos_eos: + # TODO: to investigate why TransformEosLangPairDataset doesn't work with ConcatDataset + return SampledMultiDataset( + OrderedDict(datasets), + sampling_ratios=None, + eval_key=None, + collate_format=CollateFormat.single, + virtual_size=None, + split=split, + ) + return ConcatDataset([d for _, d in datasets]) + + def load_sampled_multi_epoch_dataset( + self, split, training, epoch=0, combine=False, shard_epoch=None, **kwargs + ): + datasets, data_param_list = self.load_split_datasets( + split, training, epoch, combine, shard_epoch=shard_epoch, **kwargs + ) + if training and split == getattr(self.args, "train_subset", None): + sample_ratios = self.get_sampling_ratios(data_param_list, datasets, epoch) + return SampledMultiEpochDataset( + OrderedDict(datasets), + epoch=epoch, + shard_epoch=shard_epoch, + # valid and test datasets will be degenerate to concating datasets: + sampling_ratios=sample_ratios, + eval_key=None, + collate_format=CollateFormat.single, + virtual_size=self.args.virtual_data_size, + split=split, + virtual_epoch_size=self.args.virtual_epoch_size, + # if not using lang_tok altering, simplified to use the same collater + shared_collater=self._shared_collater(), + ) + else: + return self.load_into_concat_dataset(split, datasets, data_param_list) + + def load_sampled_multi_dataset( + self, split, training, epoch=0, combine=False, shard_epoch=None, **kwargs + ): + datasets, data_param_list = self.load_split_datasets( + split, training, epoch, combine, shard_epoch=shard_epoch, **kwargs + ) + if training and split == getattr(self.args, "train_subset", None): + sample_ratios = self.get_sampling_ratios(data_param_list, datasets, epoch) + return SampledMultiDataset( + OrderedDict(datasets), + epoch=epoch, + # valid and test datasets will be degerate to concating datasets: + sampling_ratios=sample_ratios, + eval_key=None, + collate_format=CollateFormat.single, + virtual_size=self.args.virtual_data_size, + split=split, + # if not using lang_tok altering, simplified to use the same collater + shared_collater=self._shared_collater(), + ) + else: + return self.load_into_concat_dataset(split, datasets, data_param_list) + + def load_dataset( + self, split, training, epoch=0, combine=False, shard_epoch=None, **kwargs + ): + if self.args.virtual_epoch_size is None: + return self.load_sampled_multi_dataset( + split, training, epoch, combine, shard_epoch, **kwargs + ) + else: + return self.load_sampled_multi_epoch_dataset( + split, training, epoch, combine, shard_epoch, **kwargs + ) diff --git a/SpeechT5/fairseq/fairseq/data/multilingual/multilingual_utils.py b/SpeechT5/fairseq/fairseq/data/multilingual/multilingual_utils.py new file mode 100644 index 0000000..b4e0f98 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multilingual/multilingual_utils.py @@ -0,0 +1,63 @@ +from enum import Enum +from typing import Dict, List, Optional, Sequence + +import torch +from fairseq.data import Dictionary + + +class EncoderLangtok(Enum): + """ + Prepend to the beginning of source sentence either the + source or target language token. (src/tgt). + """ + + src = "src" + tgt = "tgt" + + +class LangTokSpec(Enum): + main = "main" + mono_dae = "mono_dae" + + +class LangTokStyle(Enum): + multilingual = "multilingual" + mbart = "mbart" + + +@torch.jit.export +def get_lang_tok( + lang: str, lang_tok_style: str, spec: str = LangTokSpec.main.value +) -> str: + # TOKEN_STYLES can't be defined outside this fn since it needs to be + # TorchScriptable. + TOKEN_STYLES: Dict[str, str] = { + LangTokStyle.mbart.value: "[{}]", + LangTokStyle.multilingual.value: "__{}__", + } + + if spec.endswith("dae"): + lang = f"{lang}_dae" + elif spec.endswith("mined"): + lang = f"{lang}_mined" + style = TOKEN_STYLES[lang_tok_style] + return style.format(lang) + + +def augment_dictionary( + dictionary: Dictionary, + language_list: List[str], + lang_tok_style: str, + langtoks_specs: Sequence[str] = (LangTokSpec.main.value,), + extra_data: Optional[Dict[str, str]] = None, +) -> None: + for spec in langtoks_specs: + for language in language_list: + dictionary.add_symbol( + get_lang_tok(lang=language, lang_tok_style=lang_tok_style, spec=spec) + ) + + if lang_tok_style == LangTokStyle.mbart.value or ( + extra_data is not None and LangTokSpec.mono_dae.value in extra_data + ): + dictionary.add_symbol("<mask>") diff --git a/SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_dataset.py b/SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_dataset.py new file mode 100644 index 0000000..b0a6174 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_dataset.py @@ -0,0 +1,467 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import datetime +import hashlib +import logging +import time +from bisect import bisect_right +from collections import OrderedDict, defaultdict +from enum import Enum +from typing import List + +import numpy as np +import torch +from fairseq.data import FairseqDataset, data_utils +from fairseq.distributed import utils as distributed_utils + + +def get_time_gap(s, e): + return ( + datetime.datetime.fromtimestamp(e) - datetime.datetime.fromtimestamp(s) + ).__str__() + + +logger = logging.getLogger(__name__) + + +def default_virtual_size_func(datasets, ratios, max_scale_up=1.5): + sizes = [len(d) for d in datasets] + if ratios is None: + return sum(sizes) + largest_idx = np.argmax(sizes) + largest_r = ratios[largest_idx] + largest_s = sizes[largest_idx] + # set virtual sizes relative to the largest dataset + virtual_sizes = [(r / largest_r) * largest_s for r in ratios] + vsize = sum(virtual_sizes) + max_size = sum(sizes) * max_scale_up + return int(vsize if vsize < max_size else max_size) + + +class CollateFormat(Enum): + single = 1 + ordered_dict = 2 + + +class SampledMultiDataset(FairseqDataset): + """Samples from multiple sub-datasets according to given sampling ratios. + Args: + datasets ( + List[~torch.utils.data.Dataset] + or OrderedDict[str, ~torch.utils.data.Dataset] + ): datasets + sampling_ratios (List[float]): list of probability of each dataset to be sampled + (default: None, which corresponds to concatenating all dataset together). + seed (int): RNG seed to use (default: 2). + epoch (int): starting epoch number (default: 1). + eval_key (str, optional): a key used at evaluation time that causes + this instance to pass-through batches from *datasets[eval_key]*. + collate_format (CollateFormat): collater output format, either CollateFormat.ordered_dict or + CollateFormat.single (default: CollateFormat.single) where CollateFormat.single configures + the collater to output batches of data mixed from all sub-datasets, + and CollateFormat.ordered_dict configures the collater to output a dictionary of batches indexed by keys + of sub-datasets. + Note that not all sub-datasets will present in a single batch in both formats. + virtual_size (int, or callable): the expected virtual size of the dataset (default: default_virtual_size_func). + split (str): the split of the data, e.g. 'train', 'valid' or 'test'. + shared_collater (bool): whether or not to all sub-datasets have the same collater. + shuffle (bool): whether or not to shuffle data (default: True). + """ + + def __init__( + self, + datasets, + sampling_ratios=None, + seed=2, + epoch=1, + eval_key=None, + collate_format=CollateFormat.single, + virtual_size=default_virtual_size_func, + split="", + shared_collater=False, + shuffle=True, + ): + super().__init__() + self.shared_collater = shared_collater + self.shuffle = shuffle + + if isinstance(datasets, OrderedDict): + self.keys = list(datasets.keys()) + datasets = list(datasets.values()) + elif isinstance(datasets, List): + self.keys = list(range(len(datasets))) + else: + raise AssertionError() + self.datasets = datasets + self.split = split + + self.eval_key = eval_key + if self.eval_key is not None: + self.collate_format = CollateFormat.single + else: + self.collate_format = collate_format + + self.seed = seed + self._cur_epoch = None + + self.cumulated_sizes = None + # self.datasets[k][self._cur_indices[i]] is the data item i in this sampled dataset + # namely, data item i is sampled from the kth sub-dataset self.datasets[k] + # where self.cumulated_sizes[k-1] <= i < self.cumulated_sizes[k] + self._cur_indices = None + + self._sizes = None + self.virtual_size_per_dataset = None + # caching properties + self._reset_cached_properties() + self.setup_sampling(sampling_ratios, virtual_size) + self.set_epoch(epoch) + + def _clean_if_not_none(self, var_list): + for v in var_list: + if v is not None: + del v + + def _reset_cached_properties(self): + self._clean_if_not_none([self._sizes, self._cur_indices]) + self._sizes = None + self._cur_indices = None + + def setup_sampling(self, sample_ratios, virtual_size): + sizes = [len(d) for d in self.datasets] + if sample_ratios is None: + # default back to concating datasets + self.sample_ratios = None + self.virtual_size = sum(sizes) + else: + if not isinstance(sample_ratios, np.ndarray): + sample_ratios = np.array(sample_ratios) + self.sample_ratios = sample_ratios + virtual_size = ( + default_virtual_size_func if virtual_size is None else virtual_size + ) + self.virtual_size = ( + virtual_size(self.datasets, self.sample_ratios) + if callable(virtual_size) + else virtual_size + ) + + def adjust_sampling(self, epoch, sampling_ratios, virtual_size): + if sampling_ratios is not None: + sampling_ratios = self._sync_sample_ratios(sampling_ratios) + self.setup_sampling(sampling_ratios, virtual_size) + + def _sync_sample_ratios(self, ratios): + # in case the ratios are not precisely the same across processes + # also to ensure every procresses update the ratios in the same pace + ratios = torch.DoubleTensor(ratios) + if torch.distributed.is_initialized(): + if torch.cuda.is_available(): + distributed_utils.all_reduce( + ratios.cuda(), group=distributed_utils.get_data_parallel_group() + ) + else: + distributed_utils.all_reduce( + ratios, group=distributed_utils.get_data_parallel_group() + ) + ret = ratios.cpu() + ret = ret.numpy() + return ret + + def random_choice_in_dataset(self, rng, dataset, choice_size): + if hasattr(dataset, "random_choice_in_dataset"): + return dataset.random_choice_in_dataset(rng, choice_size) + dataset_size = len(dataset) + return rng.choice( + dataset_size, choice_size, replace=(choice_size > dataset_size) + ) + + def get_virtual_indices(self, rng, datasets, sample_ratios, virtual_size): + def get_counts(sample_ratios): + counts = np.array([virtual_size * r for r in sample_ratios], dtype=np.int64) + diff = virtual_size - counts.sum() + assert diff >= 0 + # due to round-offs, the size might not match the desired sizes + if diff > 0: + dataset_indices = rng.choice( + len(sample_ratios), size=diff, p=sample_ratios + ) + for i in dataset_indices: + counts[i] += 1 + return counts + + def get_in_dataset_indices(datasets, sizes, sample_ratios): + counts = get_counts(sample_ratios) + # uniformally sample desired counts for each dataset + # if the desired counts are large, sample with replacement: + indices = [ + self.random_choice_in_dataset(rng, d, c) + for c, d in zip(counts, datasets) + ] + return indices + + sizes = [len(d) for d in datasets] + if sample_ratios is None: + # default back to concating datasets + in_dataset_indices = [list(range(s)) for s in sizes] + virtual_sizes_per_dataset = sizes + else: + ratios = sample_ratios / sample_ratios.sum() + in_dataset_indices = get_in_dataset_indices(datasets, sizes, ratios) + virtual_sizes_per_dataset = [len(d) for d in in_dataset_indices] + virtual_sizes_per_dataset = np.array(virtual_sizes_per_dataset, np.int64) + cumulative_sizes = np.cumsum(virtual_sizes_per_dataset) + assert sum(virtual_sizes_per_dataset) == virtual_size + assert cumulative_sizes[-1] == virtual_size + if virtual_size < sum(sizes): + logger.warning( + f"virtual data size ({virtual_size}) is less than real data size ({sum(sizes)})." + " If virtual size << real data size, there could be data coverage issue." + ) + in_dataset_indices = np.hstack(in_dataset_indices) + return in_dataset_indices, cumulative_sizes, virtual_sizes_per_dataset + + def _get_dataset_and_index(self, index): + i = bisect_right(self.cumulated_sizes, index) + return i, self._cur_indices[index] + + def __getitem__(self, index): + # self.__getitem__(index) returns self.datasets[k][self._cur_indices[index]] + # where k satisfies self.cumulated_sizes[k - 1] <= k < self.cumulated_sizes[k] + ds_idx, ds_sample_idx = self._get_dataset_and_index(index) + ret = (ds_idx, self.datasets[ds_idx][ds_sample_idx]) + return ret + + def num_tokens(self, index): + return self.sizes[index].max() + + def num_tokens_vec(self, indices): + sizes_vec = self.sizes[np.array(indices)] + # max across all dimensions but first one + return np.amax(sizes_vec, axis=tuple(range(1, len(sizes_vec.shape)))) + + def size(self, index): + return self.sizes[index] + + def __len__(self): + return self.virtual_size + + def collater(self, samples, **extra_args): + """Merge a list of samples to form a mini-batch.""" + if len(samples) == 0: + return None + if self.collate_format == "ordered_dict": + collect_samples = [[] for _ in range(len(self.datasets))] + for (i, sample) in samples: + collect_samples[i].append(sample) + batch = OrderedDict( + [ + (self.keys[i], dataset.collater(collect_samples[i])) + for i, (key, dataset) in enumerate(zip(self.keys, self.datasets)) + if len(collect_samples[i]) > 0 + ] + ) + elif self.shared_collater: + batch = self.datasets[0].collater([s for _, s in samples]) + else: + samples_dict = defaultdict(list) + pad_to_length = ( + defaultdict(int) + if "pad_to_length" not in extra_args + else extra_args["pad_to_length"] + ) + for ds_idx, s in samples: + pad_to_length["source"] = max( + pad_to_length["source"], s["source"].size(0) + ) + if s["target"] is not None: + pad_to_length["target"] = max( + pad_to_length["target"], s["target"].size(0) + ) + samples_dict[ds_idx].append(s) + batches = [ + self.datasets[i].collater(samples_dict[i], pad_to_length=pad_to_length) + for i in range(len(self.datasets)) + if len(samples_dict[i]) > 0 + ] + + def straight_data(tensors): + batch = torch.cat(tensors, dim=0) + return batch + + src_lengths = straight_data( + [b["net_input"]["src_lengths"] for b in batches] + ) + src_lengths, sort_order = src_lengths.sort(descending=True) + + def straight_order(tensors): + batch = straight_data(tensors) + return batch.index_select(0, sort_order) + + batch = { + "id": straight_order([b["id"] for b in batches]), + "nsentences": sum(b["nsentences"] for b in batches), + "ntokens": sum(b["ntokens"] for b in batches), + "net_input": { + "src_tokens": straight_order( + [b["net_input"]["src_tokens"] for b in batches] + ), + "src_lengths": src_lengths, + }, + "target": straight_order([b["target"] for b in batches]) + if batches[0]["target"] is not None + else None, + } + if "prev_output_tokens" in batches[0]["net_input"]: + batch["net_input"]["prev_output_tokens"] = straight_order( + [b["net_input"]["prev_output_tokens"] for b in batches] + ) + if "src_lang_id" in batches[0]["net_input"]: + batch["net_input"]["src_lang_id"] = straight_order( + [b["net_input"]["src_lang_id"] for b in batches] + ) + if "tgt_lang_id" in batches[0]: + batch["tgt_lang_id"] = straight_order( + [b["tgt_lang_id"] for b in batches] + ) + return batch + + @property + def sizes(self): + if self._sizes is not None: + return self._sizes + start_time = time.time() + in_sub_dataset_indices = [ + self._cur_indices[ + 0 if i == 0 else self.cumulated_sizes[i - 1] : self.cumulated_sizes[i] + ] + for i in range(len(self.datasets)) + ] + sub_dataset_sizes = [ + d.sizes[indices] + for d, indices in zip(self.datasets, in_sub_dataset_indices) + ] + self._sizes = np.vstack(sub_dataset_sizes) + logger.info(f"sizes() calling time: {get_time_gap(start_time, time.time())}") + return self._sizes + + def ordered_indices(self): + if self.shuffle: + indices = np.random.permutation(len(self)) + else: + indices = np.arange(len(self)) + + sizes = self.sizes + tgt_sizes = sizes[:, 1] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else None + src_sizes = ( + sizes[:, 0] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else sizes + ) + + # sort by target length, then source length + if tgt_sizes is not None: + indices = indices[np.argsort(tgt_sizes[indices], kind="mergesort")] + sort_indices = indices[np.argsort(src_sizes[indices], kind="mergesort")] + return sort_indices + + def prefetch(self, indices): + prefetch_indices = [[] for _ in range(len(self.datasets))] + for i in indices: + ds_idx, ds_sample_idx = self._get_dataset_and_index(i) + prefetch_indices[ds_idx].append(ds_sample_idx) + for i in range(len(prefetch_indices)): + self.datasets[i].prefetch(prefetch_indices[i]) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return False + + def set_epoch(self, epoch): + super().set_epoch(epoch) + if epoch == self._cur_epoch: + # re-enter so return + return + for d in self.datasets: + if hasattr(d, "set_epoch"): + d.set_epoch(epoch) + self._cur_epoch = epoch + self._establish_virtual_datasets() + + def _establish_virtual_datasets(self): + if self.sample_ratios is None and self._cur_indices is not None: + # not a samping dataset, no need to resample if indices are already established + return + self._reset_cached_properties() + + start_time = time.time() + # Generate a weighted sample of indices as a function of the + # random seed and the current epoch. + rng = np.random.RandomState( + [ + int( + hashlib.sha1( + str(self.__class__.__name__).encode("utf-8") + ).hexdigest(), + 16, + ) + % (2 ** 32), + self.seed % (2 ** 32), # global seed + self._cur_epoch, # epoch index, + ] + ) + self._clean_if_not_none( + [self.cumulated_sizes, self.virtual_size_per_dataset, self._sizes] + ) + self._sizes = None + + indices, cumulated_sizes, virtual_size_per_dataset = self.get_virtual_indices( + rng, self.datasets, self.sample_ratios, self.virtual_size + ) + self._cur_indices = indices + self.cumulated_sizes = cumulated_sizes + self.virtual_size_per_dataset = virtual_size_per_dataset + + raw_sizes = [len(d) for d in self.datasets] + sampled_sizes = self.virtual_size_per_dataset + logger.info( + f"[{self.split}] Raw sizes: {str(dict(zip(self.keys, raw_sizes)))}; " + f"raw total size: {sum(raw_sizes)}" + ) + logger.info( + f"[{self.split}] Resampled sizes: {str(dict(zip(self.keys, sampled_sizes)))}; " + f"resampled total size: {sum(sampled_sizes)}" + ) + if self.sample_ratios is not None: + logger.info( + f"[{self.split}] Upsampling ratios: {str(dict(zip(self.keys, self.sample_ratios)))}" + ) + else: + logger.info(f"[{self.split}] A concat dataset") + logger.info( + f"[{self.split}] virtual dataset established time: {get_time_gap(start_time, time.time())}" + ) + + def filter_indices_by_size(self, indices, max_sizes): + """Filter a list of sample indices. Remove those that are longer + than specified in max_sizes. + + Args: + indices (np.array): original array of sample indices + max_sizes (int or list[int] or tuple[int]): max sample size, + can be defined separately for src and tgt (then list or tuple) + + Returns: + np.array: filtered sample array + list: list of removed indices + """ + sizes = self.sizes + tgt_sizes = sizes[:, 1] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else None + src_sizes = ( + sizes[:, 0] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else sizes + ) + + return data_utils.filter_paired_dataset_indices_by_size( + src_sizes, tgt_sizes, indices, max_sizes + ) diff --git a/SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_epoch_dataset.py b/SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_epoch_dataset.py new file mode 100644 index 0000000..17387b2 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multilingual/sampled_multi_epoch_dataset.py @@ -0,0 +1,199 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import hashlib +import logging +import math + +import numpy as np +from fairseq.data import SampledMultiDataset + +from .sampled_multi_dataset import CollateFormat, default_virtual_size_func + + +logger = logging.getLogger(__name__) + + +class SampledMultiEpochDataset(SampledMultiDataset): + """Samples from multiple sub-datasets according to sampling ratios + using virtual epoch sizes to speed up dataloading. + Args: + datasets ( + List[~torch.utils.data.Dataset] + or OrderedDict[str, ~torch.utils.data.Dataset] + ): datasets + sampling_ratios (List[float]): list of probability of each dataset to be sampled + (default: None, which corresponds to concating all dataset together). + seed (int): RNG seed to use (default: 2). + epoch (int): starting epoch number (default: 1). + eval_key (str, optional): a key used at evaluation time that causes + this instance to pass-through batches from *datasets[eval_key]*. + collate_format (CollateFormat): collater output format, either CollateFormat.ordered_dict or + CollateFormat.single (default: CollateFormat.single) where CollateFormat.single configures + the collater to output batches of data mixed from all sub-datasets, + and CollateFormat.ordered_dict configures the collater to output a dictionary of batches indexed by keys + of sub-datasets. + Note that not all sub-datasets will present in a single batch in both formats. + virtual_size (int, or callable): the expected virtual size of the dataset (default: default_virtual_size_func). + split (str): the split of the data, e.g. 'train', 'valid' or 'test'. + virtual_epoch_size (int): virtual epoch size, the dataset will go through the data by + this virtual epoch size one by one to speed up data loading, e.g. indicing and filtering + can be performed whenever a virtual epoch is loaded without waiting for the whole dataset to be loaded. + shared_collater (bool): whether or not to all sub-datasets have the same collater. + shard_epoch (int): the real epoch number for shard selection. + shuffle (bool): whether or not to shuffle data (default: True). + """ + + def __init__( + self, + datasets, + sampling_ratios=None, + seed=2, + epoch=1, + eval_key=None, + collate_format=CollateFormat.single, + virtual_size=default_virtual_size_func, + split="", + virtual_epoch_size=None, + shared_collater=False, + shard_epoch=1, + shuffle=True, + ): + self.virtual_epoch_size = virtual_epoch_size + self._current_epoch_start_index = None + self._random_global_indices = None + self.shard_epoch = shard_epoch if shard_epoch is not None else 1 + self.load_next_shard = None + self._epoch_sizes = None + super().__init__( + datasets=datasets, + sampling_ratios=sampling_ratios, + seed=seed, + epoch=epoch, + eval_key=eval_key, + collate_format=collate_format, + virtual_size=virtual_size, + split=split, + shared_collater=shared_collater, + shuffle=shuffle, + ) + + def _setup(self, epoch): + self.virtual_epoch_size = ( + self.virtual_epoch_size + if self.virtual_epoch_size is not None + else self.virtual_size + ) + if self.virtual_epoch_size > self.virtual_size: + logger.warning( + f"virtual epoch size {self.virtual_epoch_size} " + f"is greater than virtual dataset size {self.virtual_size}" + ) + self.virtual_epoch_size = self.virtual_size + self.num_virtual_epochs = math.ceil(self.virtual_size / self.virtual_epoch_size) + self._current_epoch_start_index = self._get_epoch_start_index(epoch) + logger.info( + f"virtual epoch size {self.virtual_epoch_size}; virtual dataset size {self.virtual_size}" + ) + + def _map_epoch_index_to_global(self, index): + index = self._current_epoch_start_index + index + # add randomness + return self._random_global_indices[index] + + @property + def sizes(self): + if self._epoch_sizes is not None: + return self._epoch_sizes + _sizes = super().sizes + indices = self._random_global_indices[ + self._current_epoch_start_index : self._current_epoch_start_index + + len(self) + ] + self._epoch_sizes = _sizes[indices] + # del super()._sizes to save memory + del self._sizes + self._sizes = None + return self._epoch_sizes + + def _get_dataset_and_index(self, index): + i = self._map_epoch_index_to_global(index) + return super()._get_dataset_and_index(i) + + def __len__(self): + return ( + self.virtual_epoch_size + if self._current_epoch_start_index + self.virtual_epoch_size + < self.virtual_size + else self.virtual_size - self._current_epoch_start_index + ) + + def set_epoch(self, epoch): + if self._current_epoch_start_index is None: + # initializing epoch idnices of a virtual dataset + self._setup(epoch) + self._next_virtual_epoch(epoch) + else: + # working on already intialized epoch indices + if epoch == self._cur_epoch: + # re-enter so return + return + self._next_virtual_epoch(epoch) + + def _get_epoch_start_index(self, epoch): + assert epoch >= 1 # fairseq is using 1-based epoch everywhere + return ((epoch - 1) % self.num_virtual_epochs) * self.virtual_epoch_size + + def _next_global_indices(self, epoch): + rng = np.random.RandomState( + [ + int( + hashlib.sha1( + str(self.__class__.__name__).encode("utf-8") + ).hexdigest(), + 16, + ) + % (2 ** 32), + self.seed % (2 ** 32), # global seed + epoch, # epoch index, + ] + ) + del self._random_global_indices + self._random_global_indices = rng.choice( + self.virtual_size, self.virtual_size, replace=False + ) + if self.load_next_shard is None: + self.load_next_shard = False + else: + # increase shard epoch for next loading + self.shard_epoch += 1 + self.load_next_shard = True + logger.info( + "to load next epoch/shard in next load_dataset: " + f"epoch={epoch}/shard_epoch={self.shard_epoch}" + ) + + def _next_virtual_epoch(self, epoch): + index = self._get_epoch_start_index(epoch) + if index == 0 or self._random_global_indices is None: + # need to start from the beginning, + # so call super().set_epoch(epoch) to establish the global virtual indices + logger.info( + "establishing a new set of global virtual indices for " + f"epoch={epoch}/shard_epoch={self.shard_epoch}" + ) + super().set_epoch(epoch) + self._next_global_indices(epoch) + else: + self._cur_epoch = epoch + + # reset cache sizes and ordered_indices for the epoch after moving to a new epoch + self._clean_if_not_none( + [ + self._epoch_sizes, + ] + ) + self._epoch_sizes = None + self._current_epoch_start_index = index diff --git a/SpeechT5/fairseq/fairseq/data/multilingual/sampling_method.py b/SpeechT5/fairseq/fairseq/data/multilingual/sampling_method.py new file mode 100644 index 0000000..140c68f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/multilingual/sampling_method.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from typing import List + + +logger = logging.getLogger(__name__) + + +def uniform(dataset_sizes: List[int]): + return [1.0] * len(dataset_sizes) + + +def temperature_sampling(dataset_sizes, temp): + total_size = sum(dataset_sizes) + return [(size / total_size) ** (1.0 / temp) for size in dataset_sizes] + + +def make_temperature_sampling(temp=1.0): + def sampling_func(dataset_sizes): + return temperature_sampling(dataset_sizes, temp) + + return sampling_func + + +def make_ratio_sampling(ratios): + def sampling_func(dataset_sizes): + return ratios + + return sampling_func + + +class SamplingMethod: + @staticmethod + def add_arguments(parser): + parser.add_argument( + "--sampling-method", + choices=[ + "uniform", + "temperature", + "concat", + "RoundRobin", + ], + type=str, + default="concat", + help="The method to sample data per language pairs", + ) + parser.add_argument( + "--sampling-temperature", + default=1.5, + type=float, + help="only work with --sampling-method temperature", + ) + + @staticmethod + def build_sampler(args, task): + return SamplingMethod(args, task) + + def __init__(self, args, task): + self.args = args + self.task = task + + def is_adaptive(self): + return False + + def sampling_method_selector(self): + args = self.args + logger.info(f"selected sampler: {args.sampling_method}") + if args.sampling_method == "uniform": + return uniform + elif args.sampling_method == "temperature" or self.is_adaptive(): + return make_temperature_sampling(float(args.sampling_temperature)) + else: + # default to concating all data set together + return None diff --git a/SpeechT5/fairseq/fairseq/data/nested_dictionary_dataset.py b/SpeechT5/fairseq/fairseq/data/nested_dictionary_dataset.py new file mode 100644 index 0000000..52e74ab --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/nested_dictionary_dataset.py @@ -0,0 +1,125 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections import OrderedDict + +import torch +from torch.utils.data.dataloader import default_collate + +from . import FairseqDataset + + +def _flatten(dico, prefix=None): + """Flatten a nested dictionary.""" + new_dico = OrderedDict() + if isinstance(dico, dict): + prefix = prefix + "." if prefix is not None else "" + for k, v in dico.items(): + if v is None: + continue + new_dico.update(_flatten(v, prefix + k)) + elif isinstance(dico, list): + for i, v in enumerate(dico): + new_dico.update(_flatten(v, prefix + ".[" + str(i) + "]")) + else: + new_dico = OrderedDict({prefix: dico}) + return new_dico + + +def _unflatten(dico): + """Unflatten a flattened dictionary into a nested dictionary.""" + new_dico = OrderedDict() + for full_k, v in dico.items(): + full_k = full_k.split(".") + node = new_dico + for k in full_k[:-1]: + if k.startswith("[") and k.endswith("]"): + k = int(k[1:-1]) + if k not in node: + node[k] = OrderedDict() + node = node[k] + node[full_k[-1]] = v + return new_dico + + +class NestedDictionaryDataset(FairseqDataset): + def __init__(self, defn, sizes=None): + super().__init__() + self.defn = _flatten(defn) + self.sizes = [sizes] if not isinstance(sizes, (list, tuple)) else sizes + + first = None + for v in self.defn.values(): + if not isinstance( + v, + ( + FairseqDataset, + torch.utils.data.Dataset, + ), + ): + raise ValueError("Expected Dataset but found: {}".format(v.__class__)) + first = first or v + if len(v) > 0: + assert len(v) == len(first), "dataset lengths must match" + + self._len = len(first) + + def __getitem__(self, index): + return OrderedDict((k, ds[index]) for k, ds in self.defn.items()) + + def __len__(self): + return self._len + + def collater(self, samples): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + + Returns: + dict: a mini-batch suitable for forwarding with a Model + """ + if len(samples) == 0: + return {} + sample = OrderedDict() + for k, ds in self.defn.items(): + try: + sample[k] = ds.collater([s[k] for s in samples]) + except NotImplementedError: + sample[k] = default_collate([s[k] for s in samples]) + return _unflatten(sample) + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return max(s[index] for s in self.sizes) + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + if len(self.sizes) == 1: + return self.sizes[0][index] + else: + return (s[index] for s in self.sizes) + + @property + def supports_prefetch(self): + """Whether this dataset supports prefetching.""" + return any(ds.supports_prefetch for ds in self.defn.values()) + + def prefetch(self, indices): + """Prefetch the data required for this epoch.""" + for ds in self.defn.values(): + if getattr(ds, "supports_prefetch", False): + ds.prefetch(indices) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return all(ds.can_reuse_epoch_itr_across_epochs for ds in self.defn.values()) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.defn.values(): + ds.set_epoch(epoch) diff --git a/SpeechT5/fairseq/fairseq/data/noising.py b/SpeechT5/fairseq/fairseq/data/noising.py new file mode 100644 index 0000000..2b1cc34 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/noising.py @@ -0,0 +1,335 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch +from fairseq.data import data_utils + + +class WordNoising(object): + """Generate a noisy version of a sentence, without changing words themselves.""" + + def __init__(self, dictionary, bpe_cont_marker="@@", bpe_end_marker=None): + self.dictionary = dictionary + self.bpe_end = None + if bpe_cont_marker: + self.bpe_end = np.array( + [ + not self.dictionary[i].endswith(bpe_cont_marker) + for i in range(len(self.dictionary)) + ] + ) + elif bpe_end_marker: + self.bpe_end = np.array( + [ + self.dictionary[i].endswith(bpe_end_marker) + for i in range(len(self.dictionary)) + ] + ) + + self.get_word_idx = ( + self._get_bpe_word_idx if self.bpe_end is not None else self._get_token_idx + ) + + def noising(self, x, lengths, noising_prob=0.0): + raise NotImplementedError() + + def _get_bpe_word_idx(self, x): + """ + Given a list of BPE tokens, for every index in the tokens list, + return the index of the word grouping that it belongs to. + For example, for input x corresponding to ["how", "are", "y@@", "ou"], + return [[0], [1], [2], [2]]. + """ + # x: (T x B) + bpe_end = self.bpe_end[x] + + if x.size(0) == 1 and x.size(1) == 1: + # Special case when we only have one word in x. If x = [[N]], + # bpe_end is a scalar (bool) instead of a 2-dim array of bools, + # which makes the sum operation below fail. + return np.array([[0]]) + + # do a reduce front sum to generate word ids + word_idx = bpe_end[::-1].cumsum(0)[::-1] + word_idx = word_idx.max(0)[None, :] - word_idx + return word_idx + + def _get_token_idx(self, x): + """ + This is to extend noising functions to be able to apply to non-bpe + tokens, e.g. word or characters. + """ + x = torch.t(x) + word_idx = np.array([range(len(x_i)) for x_i in x]) + return np.transpose(word_idx) + + +class WordDropout(WordNoising): + """Randomly drop input words. If not passing blank_idx (default is None), + then dropped words will be removed. Otherwise, it will be replaced by the + blank_idx.""" + + def __init__( + self, + dictionary, + default_dropout_prob=0.1, + bpe_cont_marker="@@", + bpe_end_marker=None, + ): + super().__init__(dictionary, bpe_cont_marker, bpe_end_marker) + self.default_dropout_prob = default_dropout_prob + + def noising(self, x, lengths, dropout_prob=None, blank_idx=None): + if dropout_prob is None: + dropout_prob = self.default_dropout_prob + # x: (T x B), lengths: B + if dropout_prob == 0: + return x, lengths + + assert 0 < dropout_prob < 1 + + # be sure to drop entire words + word_idx = self.get_word_idx(x) + sentences = [] + modified_lengths = [] + for i in range(lengths.size(0)): + # Since dropout probabilities need to apply over non-pad tokens, + # it is not trivial to generate the keep mask without consider + # input lengths; otherwise, this could be done outside the loop + + # We want to drop whole words based on word_idx grouping + num_words = max(word_idx[:, i]) + 1 + + # ith example: [x0, x1, ..., eos, pad, ..., pad] + # We should only generate keep probs for non-EOS tokens. Thus if the + # input sentence ends in EOS, the last word idx is not included in + # the dropout mask generation and we append True to always keep EOS. + # Otherwise, just generate the dropout mask for all word idx + # positions. + has_eos = x[lengths[i] - 1, i] == self.dictionary.eos() + if has_eos: # has eos? + keep = np.random.rand(num_words - 1) >= dropout_prob + keep = np.append(keep, [True]) # keep EOS symbol + else: + keep = np.random.rand(num_words) >= dropout_prob + + words = x[: lengths[i], i].tolist() + + # TODO: speed up the following loop + # drop words from the input according to keep + new_s = [ + w if keep[word_idx[j, i]] else blank_idx for j, w in enumerate(words) + ] + new_s = [w for w in new_s if w is not None] + # we need to have at least one word in the sentence (more than the + # start / end sentence symbols) + if len(new_s) <= 1: + # insert at beginning in case the only token left is EOS + # EOS should be at end of list. + new_s.insert(0, words[np.random.randint(0, len(words))]) + assert len(new_s) >= 1 and ( + not has_eos # Either don't have EOS at end or last token is EOS + or (len(new_s) >= 2 and new_s[-1] == self.dictionary.eos()) + ), "New sentence is invalid." + sentences.append(new_s) + modified_lengths.append(len(new_s)) + # re-construct input + modified_lengths = torch.LongTensor(modified_lengths) + modified_x = torch.LongTensor( + modified_lengths.max(), modified_lengths.size(0) + ).fill_(self.dictionary.pad()) + for i in range(modified_lengths.size(0)): + modified_x[: modified_lengths[i], i].copy_(torch.LongTensor(sentences[i])) + + return modified_x, modified_lengths + + +class WordShuffle(WordNoising): + """Shuffle words by no more than k positions.""" + + def __init__( + self, + dictionary, + default_max_shuffle_distance=3, + bpe_cont_marker="@@", + bpe_end_marker=None, + ): + super().__init__(dictionary, bpe_cont_marker, bpe_end_marker) + self.default_max_shuffle_distance = 3 + + def noising(self, x, lengths, max_shuffle_distance=None): + if max_shuffle_distance is None: + max_shuffle_distance = self.default_max_shuffle_distance + # x: (T x B), lengths: B + if max_shuffle_distance == 0: + return x, lengths + + # max_shuffle_distance < 1 will return the same sequence + assert max_shuffle_distance > 1 + + # define noise word scores + noise = np.random.uniform( + 0, + max_shuffle_distance, + size=(x.size(0), x.size(1)), + ) + noise[0] = -1 # do not move start sentence symbol + # be sure to shuffle entire words + word_idx = self.get_word_idx(x) + x2 = x.clone() + for i in range(lengths.size(0)): + length_no_eos = lengths[i] + if x[lengths[i] - 1, i] == self.dictionary.eos(): + length_no_eos = lengths[i] - 1 + # generate a random permutation + scores = word_idx[:length_no_eos, i] + noise[word_idx[:length_no_eos, i], i] + # ensure no reordering inside a word + scores += 1e-6 * np.arange(length_no_eos.item()) + permutation = scores.argsort() + # shuffle words + x2[:length_no_eos, i].copy_( + x2[:length_no_eos, i][torch.from_numpy(permutation)] + ) + return x2, lengths + + +class UnsupervisedMTNoising(WordNoising): + """ + Implements the default configuration for noising in UnsupervisedMT + (github.com/facebookresearch/UnsupervisedMT) + """ + + def __init__( + self, + dictionary, + max_word_shuffle_distance, + word_dropout_prob, + word_blanking_prob, + bpe_cont_marker="@@", + bpe_end_marker=None, + ): + super().__init__(dictionary) + self.max_word_shuffle_distance = max_word_shuffle_distance + self.word_dropout_prob = word_dropout_prob + self.word_blanking_prob = word_blanking_prob + + self.word_dropout = WordDropout( + dictionary=dictionary, + bpe_cont_marker=bpe_cont_marker, + bpe_end_marker=bpe_end_marker, + ) + self.word_shuffle = WordShuffle( + dictionary=dictionary, + bpe_cont_marker=bpe_cont_marker, + bpe_end_marker=bpe_end_marker, + ) + + def noising(self, x, lengths): + # 1. Word Shuffle + noisy_src_tokens, noisy_src_lengths = self.word_shuffle.noising( + x=x, + lengths=lengths, + max_shuffle_distance=self.max_word_shuffle_distance, + ) + # 2. Word Dropout + noisy_src_tokens, noisy_src_lengths = self.word_dropout.noising( + x=noisy_src_tokens, + lengths=noisy_src_lengths, + dropout_prob=self.word_dropout_prob, + ) + # 3. Word Blanking + noisy_src_tokens, noisy_src_lengths = self.word_dropout.noising( + x=noisy_src_tokens, + lengths=noisy_src_lengths, + dropout_prob=self.word_blanking_prob, + blank_idx=self.dictionary.unk(), + ) + + return noisy_src_tokens + + +class NoisingDataset(torch.utils.data.Dataset): + def __init__( + self, + src_dataset, + src_dict, + seed, + noiser=None, + noising_class=UnsupervisedMTNoising, + **kwargs + ): + """ + Wrap a :class:`~torch.utils.data.Dataset` and apply noise to the + samples based on the supplied noising configuration. + + Args: + src_dataset (~torch.utils.data.Dataset): dataset to wrap. + to build self.src_dataset -- + a LanguagePairDataset with src dataset as the source dataset and + None as the target dataset. Should NOT have padding so that + src_lengths are accurately calculated by language_pair_dataset + collate function. + We use language_pair_dataset here to encapsulate the tgt_dataset + so we can re-use the LanguagePairDataset collater to format the + batches in the structure that SequenceGenerator expects. + src_dict (~fairseq.data.Dictionary): source dictionary + seed (int): seed to use when generating random noise + noiser (WordNoising): a pre-initialized :class:`WordNoising` + instance. If this is None, a new instance will be created using + *noising_class* and *kwargs*. + noising_class (class, optional): class to use to initialize a + default :class:`WordNoising` instance. + kwargs (dict, optional): arguments to initialize the default + :class:`WordNoising` instance given by *noiser*. + """ + self.src_dataset = src_dataset + self.src_dict = src_dict + self.seed = seed + self.noiser = ( + noiser + if noiser is not None + else noising_class( + dictionary=src_dict, + **kwargs, + ) + ) + self.sizes = src_dataset.sizes + + + def __getitem__(self, index): + """ + Returns a single noisy sample. Multiple samples are fed to the collater + create a noising dataset batch. + """ + src_tokens = self.src_dataset[index] + src_lengths = torch.LongTensor([len(src_tokens)]) + src_tokens = src_tokens.unsqueeze(0) + + # Transpose src tokens to fit expected shape of x in noising function + # (batch size, sequence length) -> (sequence length, batch size) + src_tokens_t = torch.t(src_tokens) + + with data_utils.numpy_seed(self.seed + index): + noisy_src_tokens = self.noiser.noising(src_tokens_t, src_lengths) + + # Transpose back to expected src_tokens format + # (sequence length, 1) -> (1, sequence length) + noisy_src_tokens = torch.t(noisy_src_tokens) + return noisy_src_tokens[0] + + def __len__(self): + """ + The length of the noising dataset is the length of src. + """ + return len(self.src_dataset) + + @property + def supports_prefetch(self): + return self.src_dataset.supports_prefetch + + def prefetch(self, indices): + if self.src_dataset.supports_prefetch: + self.src_dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/fairseq/data/num_samples_dataset.py b/SpeechT5/fairseq/fairseq/data/num_samples_dataset.py new file mode 100644 index 0000000..99a1749 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/num_samples_dataset.py @@ -0,0 +1,17 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import FairseqDataset + + +class NumSamplesDataset(FairseqDataset): + def __getitem__(self, index): + return 1 + + def __len__(self): + return 0 + + def collater(self, samples): + return sum(samples) diff --git a/SpeechT5/fairseq/fairseq/data/numel_dataset.py b/SpeechT5/fairseq/fairseq/data/numel_dataset.py new file mode 100644 index 0000000..ac86dfd --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/numel_dataset.py @@ -0,0 +1,31 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch + +from . import BaseWrapperDataset + + +class NumelDataset(BaseWrapperDataset): + def __init__(self, dataset, reduce=False): + super().__init__(dataset) + self.reduce = reduce + + def __getitem__(self, index): + item = self.dataset[index] + if torch.is_tensor(item): + return torch.numel(item) + else: + return np.size(item) + + def __len__(self): + return len(self.dataset) + + def collater(self, samples): + if self.reduce: + return sum(samples) + else: + return torch.tensor(samples) diff --git a/SpeechT5/fairseq/fairseq/data/offset_tokens_dataset.py b/SpeechT5/fairseq/fairseq/data/offset_tokens_dataset.py new file mode 100644 index 0000000..6fabbdc --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/offset_tokens_dataset.py @@ -0,0 +1,15 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import BaseWrapperDataset + + +class OffsetTokensDataset(BaseWrapperDataset): + def __init__(self, dataset, offset): + super().__init__(dataset) + self.offset = offset + + def __getitem__(self, idx): + return self.dataset[idx] + self.offset diff --git a/SpeechT5/fairseq/fairseq/data/pad_dataset.py b/SpeechT5/fairseq/fairseq/data/pad_dataset.py new file mode 100644 index 0000000..8075bba --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/pad_dataset.py @@ -0,0 +1,28 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.data import data_utils + +from . import BaseWrapperDataset + + +class PadDataset(BaseWrapperDataset): + def __init__(self, dataset, pad_idx, left_pad): + super().__init__(dataset) + self.pad_idx = pad_idx + self.left_pad = left_pad + + def collater(self, samples): + return data_utils.collate_tokens(samples, self.pad_idx, left_pad=self.left_pad) + + +class LeftPadDataset(PadDataset): + def __init__(self, dataset, pad_idx): + super().__init__(dataset, pad_idx, left_pad=True) + + +class RightPadDataset(PadDataset): + def __init__(self, dataset, pad_idx): + super().__init__(dataset, pad_idx, left_pad=False) diff --git a/SpeechT5/fairseq/fairseq/data/plasma_utils.py b/SpeechT5/fairseq/fairseq/data/plasma_utils.py new file mode 100644 index 0000000..b9fab3b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/plasma_utils.py @@ -0,0 +1,197 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import subprocess +import json +import tempfile +import hashlib +from typing import Hashable + +try: + import pyarrow.plasma as plasma + + PYARROW_AVAILABLE = True +except ImportError: + plasma = None + PYARROW_AVAILABLE = False + + +class PlasmaArray: + """ + Wrapper around numpy arrays that automatically moves the data to shared + memory upon serialization. This is particularly helpful when passing numpy + arrays through multiprocessing, so that data is not unnecessarily + duplicated or pickled. + """ + + def __init__(self, array): + super().__init__() + self.array = array + self.disable = array.nbytes < 134217728 # disable for arrays <128MB + self.object_id = None + self.path = None + + # variables with underscores shouldn't be pickled + self._client = None + self._server = None + self._server_tmp = None + self._plasma = None + + @property + def plasma(self): + if self._plasma is None and not self.disable: + self._plasma = plasma + return self._plasma + + def start_server(self): + if self.plasma is None or self._server is not None: + return + assert self.object_id is None + assert self.path is None + self._server_tmp = tempfile.NamedTemporaryFile() + self.path = self._server_tmp.name + self._server = subprocess.Popen( + ["plasma_store", "-m", str(int(1.05 * self.array.nbytes)), "-s", self.path] + ) + + @property + def client(self): + if self._client is None: + assert self.path is not None + self._client = self.plasma.connect(self.path, num_retries=200) + return self._client + + def __getstate__(self): + """Called on pickle load""" + if self.plasma is None: + return self.__dict__ + if self.object_id is None: + self.start_server() + self.object_id = self.client.put(self.array) + state = self.__dict__.copy() + del state["array"] + state["_client"] = None + state["_server"] = None + state["_server_tmp"] = None + state["_plasma"] = None + return state + + def __setstate__(self, state): + """Called on pickle save""" + self.__dict__.update(state) + if self.plasma is None: + return + self.array = self.client.get(self.object_id) + + def __del__(self): + if self._server is not None: + self._server.kill() + self._server = None + self._server_tmp.close() + self._server_tmp = None + + +DEFAULT_PLASMA_PATH = "/tmp/plasma" + + +class PlasmaView: + """Interface to write and read from shared memory. Whereas PlasmaArray writes to plasma on serialization, + PlasmaView writes to shared memory on instantiation.""" + + def __init__(self, array, split_path: str, hash_data: Hashable, plasma_path=None): + """ + Args: + array: numpy array to store. This can be read with ``PlasmaView().array`` + split_path: the path whence the data was read, used for hashing + hash_data: other metadata about the array that can be used to create a unique key. + as of writing, the 3 callers in ``TokenBlockDataset`` use:: + + hash_data = ((block_size, document_sep_len, str(break_mode), len(dataset)), 0|1|2) + + + """ + assert PYARROW_AVAILABLE + assert split_path is not None + if plasma_path is None: + plasma_path = DEFAULT_PLASMA_PATH + + self.path = plasma_path + self.split_path = split_path + self._client = None # Initialize lazily for pickle. plasma clients should not be deep copied or serialized. + self._n = None + + self.object_id = self.get_object_id(self.split_path, hash_data) + try: + self.client.put(array, object_id=self.object_id) + except plasma.PlasmaObjectExists: + pass + + @property + def client(self): + if self._client is None: + self._client = plasma.connect(self.path, num_retries=200) + return self._client + + @property + def array(self): + """Fetch a read only view of an np.array, stored in plasma.""" + ret = self.client.get(self.object_id) + return ret + + @staticmethod + def get_object_id(split_path: str, hash_data: Hashable): + """Returns plasma.ObjectID from hashing split_path and object_num.""" + hash = hashlib.blake2b(bytes(split_path, "utf-8"), digest_size=20) + harg = json.dumps(hash_data).encode("utf-8") + hash.update(harg) + return plasma.ObjectID(hash.digest()) + + def __getstate__(self): + """Called on pickle save""" + self.disconnect() + state = self.__dict__.copy() + assert state["_client"] is None + assert "object_id" in state + return state + + def __setstate__(self, state): + """Called on pickle load""" + self.__dict__.update(state) + + def __del__(self): + self.disconnect() + + def disconnect(self): + if self._client is not None: + self._client.disconnect() + self._client = None + + def __len__(self): + """Save reads by caching len""" + if self._n is None: + self._n = len(self.array) + return self._n + + +GB100 = (1024 ** 3) * 100 + + +class PlasmaStore: + def __init__(self, path=DEFAULT_PLASMA_PATH, nbytes: int = GB100): + + self.server = self.start(path, nbytes) + + def __del__(self): + self.server.kill() + + @staticmethod + def start(path=DEFAULT_PLASMA_PATH, nbytes: int = GB100) -> subprocess.Popen: + if not PYARROW_AVAILABLE: + raise ImportError("please run pip install pyarrow to use --use_plasma_view") + # best practice is to allocate more space than we need. The limitation seems to be the size of /dev/shm + _server = subprocess.Popen(["plasma_store", "-m", str(nbytes), "-s", path]) + plasma.connect(path, num_retries=200) # If we can't connect we fail immediately + return _server diff --git a/SpeechT5/fairseq/fairseq/data/prepend_dataset.py b/SpeechT5/fairseq/fairseq/data/prepend_dataset.py new file mode 100644 index 0000000..ad74784 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/prepend_dataset.py @@ -0,0 +1,28 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch + +from . import BaseWrapperDataset + + +class PrependDataset(BaseWrapperDataset): + def __init__(self, dataset, prepend_getter, ensure_first_token_is=None): + super().__init__(dataset) + self.prepend_getter = prepend_getter + self.ensure_first_token = ensure_first_token_is + + def __getitem__(self, idx): + item = self.dataset[idx] + is_tuple = isinstance(item, tuple) + src = item[0] if is_tuple else item + + assert self.ensure_first_token is None or src[0] == self.ensure_first_token + prepend_idx = self.prepend_getter(self.dataset, idx) + assert isinstance(prepend_idx, int) + src[0] = prepend_idx + item = tuple((src,) + item[1:]) if is_tuple else src + return item diff --git a/SpeechT5/fairseq/fairseq/data/prepend_token_dataset.py b/SpeechT5/fairseq/fairseq/data/prepend_token_dataset.py new file mode 100644 index 0000000..fd1331f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/prepend_token_dataset.py @@ -0,0 +1,41 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch + +from . import BaseWrapperDataset + + +class PrependTokenDataset(BaseWrapperDataset): + def __init__(self, dataset, token=None): + super().__init__(dataset) + self.token = token + if token is not None: + self._sizes = np.array(dataset.sizes) + 1 + else: + self._sizes = dataset.sizes + + def __getitem__(self, idx): + item = self.dataset[idx] + if self.token is not None: + item = torch.cat([item.new([self.token]), item]) + return item + + @property + def sizes(self): + return self._sizes + + def num_tokens(self, index): + n = self.dataset.num_tokens(index) + if self.token is not None: + n += 1 + return n + + def size(self, index): + n = self.dataset.size(index) + if self.token is not None: + n += 1 + return n diff --git a/SpeechT5/fairseq/fairseq/data/raw_label_dataset.py b/SpeechT5/fairseq/fairseq/data/raw_label_dataset.py new file mode 100644 index 0000000..d054904 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/raw_label_dataset.py @@ -0,0 +1,23 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from . import FairseqDataset + + +class RawLabelDataset(FairseqDataset): + def __init__(self, labels): + super().__init__() + self.labels = labels + + def __getitem__(self, index): + return self.labels[index] + + def __len__(self): + return len(self.labels) + + def collater(self, samples): + return torch.tensor(samples) diff --git a/SpeechT5/fairseq/fairseq/data/replace_dataset.py b/SpeechT5/fairseq/fairseq/data/replace_dataset.py new file mode 100644 index 0000000..5aac2ba --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/replace_dataset.py @@ -0,0 +1,36 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import BaseWrapperDataset + + +class ReplaceDataset(BaseWrapperDataset): + """Replaces tokens found in the dataset by a specified replacement token + + Args: + dataset (~torch.utils.data.Dataset): dataset to replace tokens in + replace_map(Dictionary[int,int]): map of token to replace -> replacement token + offsets (List[int]): do not replace tokens before (from left if pos, right if neg) this offset. should be + as many as the number of objects returned by the underlying dataset __getitem__ method. + """ + + def __init__(self, dataset, replace_map, offsets): + super().__init__(dataset) + assert len(replace_map) > 0 + self.replace_map = replace_map + self.offsets = offsets + + def __getitem__(self, index): + item = self.dataset[index] + is_tuple = isinstance(item, tuple) + srcs = item if is_tuple else [item] + + for offset, src in zip(self.offsets, srcs): + for k, v in self.replace_map.items(): + src_off = src[offset:] if offset >= 0 else src[:offset] + src_off.masked_fill_(src_off == k, v) + + item = srcs if is_tuple else srcs[0] + return item diff --git a/SpeechT5/fairseq/fairseq/data/resampling_dataset.py b/SpeechT5/fairseq/fairseq/data/resampling_dataset.py new file mode 100644 index 0000000..3d3b993 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/resampling_dataset.py @@ -0,0 +1,139 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import numpy as np +from fairseq.data import BaseWrapperDataset, plasma_utils + + +logger = logging.getLogger(__name__) + + +class ResamplingDataset(BaseWrapperDataset): + """Randomly samples from a given dataset at each epoch. + + Sampling is done with or without replacement, depending on the "replace" + parameter. + + Optionally, the epoch size can be rescaled. This is potentially desirable + to increase per-epoch coverage of the base dataset (since sampling with + replacement means that many items in the dataset will be left out). In the + case of sampling without replacement, size_ratio should be strictly less + than 1. + + Args: + dataset (~torch.utils.data.Dataset): dataset on which to sample. + weights (List[float]): list of probability weights + (default: None, which corresponds to uniform sampling). + replace (bool): sampling mode; True for "with replacement", or False + for "without replacement" (default: True) + size_ratio (float): the ratio to subsample to; must be positive + (default: 1.0). + batch_by_size (bool): whether or not to batch by sequence length + (default: True). + seed (int): RNG seed to use (default: 0). + epoch (int): starting epoch number (default: 1). + """ + + def __init__( + self, + dataset, + weights=None, + replace=True, + size_ratio=1.0, + batch_by_size=True, + seed=0, + epoch=1, + ): + super().__init__(dataset) + + if weights is None: + self.weights = None + + else: + assert len(weights) == len(dataset) + weights_arr = np.array(weights, dtype=np.float64) + weights_arr /= weights_arr.sum() + self.weights = plasma_utils.PlasmaArray(weights_arr) + + self.replace = replace + + assert size_ratio > 0.0 + if not self.replace: + assert size_ratio < 1.0 + self.size_ratio = float(size_ratio) + self.actual_size = np.ceil(len(dataset) * self.size_ratio).astype(int) + + self.batch_by_size = batch_by_size + self.seed = seed + + self._cur_epoch = None + self._cur_indices = None + + self.set_epoch(epoch) + + def __getitem__(self, index): + return self.dataset[self._cur_indices.array[index]] + + def __len__(self): + return self.actual_size + + @property + def sizes(self): + if isinstance(self.dataset.sizes, list): + return [s[self._cur_indices.array] for s in self.dataset.sizes] + return self.dataset.sizes[self._cur_indices.array] + + def num_tokens(self, index): + return self.dataset.num_tokens(self._cur_indices.array[index]) + + def size(self, index): + return self.dataset.size(self._cur_indices.array[index]) + + def ordered_indices(self): + if self.batch_by_size: + order = [ + np.arange(len(self)), + self.sizes, + ] # No need to handle `self.shuffle == True` + return np.lexsort(order) + else: + return np.arange(len(self)) + + def prefetch(self, indices): + self.dataset.prefetch(self._cur_indices.array[indices]) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return False + + def set_epoch(self, epoch): + logger.debug("ResamplingDataset.set_epoch: {}".format(epoch)) + super().set_epoch(epoch) + + if epoch == self._cur_epoch: + return + + self._cur_epoch = epoch + + # Generate a weighted sample of indices as a function of the + # random seed and the current epoch. + + rng = np.random.RandomState( + [ + 42, # magic number + self.seed % (2 ** 32), # global seed + self._cur_epoch, # epoch index + ] + ) + self._cur_indices = plasma_utils.PlasmaArray( + rng.choice( + len(self.dataset), + self.actual_size, + replace=self.replace, + p=(None if self.weights is None else self.weights.array), + ) + ) diff --git a/SpeechT5/fairseq/fairseq/data/roll_dataset.py b/SpeechT5/fairseq/fairseq/data/roll_dataset.py new file mode 100644 index 0000000..a2915ee --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/roll_dataset.py @@ -0,0 +1,18 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from . import BaseWrapperDataset + + +class RollDataset(BaseWrapperDataset): + def __init__(self, dataset, shifts): + super().__init__(dataset) + self.shifts = shifts + + def __getitem__(self, index): + item = self.dataset[index] + return torch.roll(item, self.shifts) diff --git a/SpeechT5/fairseq/fairseq/data/round_robin_zip_datasets.py b/SpeechT5/fairseq/fairseq/data/round_robin_zip_datasets.py new file mode 100644 index 0000000..2cb7447 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/round_robin_zip_datasets.py @@ -0,0 +1,160 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from collections import OrderedDict +from typing import Dict, Sequence + +import numpy as np + +from . import FairseqDataset, LanguagePairDataset + +logger = logging.getLogger(__name__) + + +class RoundRobinZipDatasets(FairseqDataset): + """Zip multiple :class:`~fairseq.data.FairseqDataset` instances together. + + Shorter datasets are repeated in a round-robin fashion to match the length + of the longest one. + + Args: + datasets (Dict[~fairseq.data.FairseqDataset]): a dictionary of + :class:`~fairseq.data.FairseqDataset` instances. + eval_key (str, optional): a key used at evaluation time that causes + this instance to pass-through batches from *datasets[eval_key]*. + """ + + def __init__(self, datasets, eval_key=None): + super().__init__() + if isinstance(datasets, dict): + datasets = OrderedDict(datasets) + assert isinstance(datasets, OrderedDict) + assert datasets, "Can't make a RoundRobinZipDatasets out of nothing" + for dataset in datasets.values(): + assert isinstance(dataset, FairseqDataset) + + self.datasets = datasets + self.eval_key = eval_key + + self.longest_dataset_key = max(datasets, key=lambda k: len(datasets[k])) + self.longest_dataset = datasets[self.longest_dataset_key] + self._ordered_indices: Dict[str, Sequence[int]] = None + + def _map_index(self, key, index): + assert ( + self._ordered_indices is not None + ), "Must call RoundRobinZipDatasets.ordered_indices() first" + o = self._ordered_indices[key] + return o[index % len(o)] + + def __getitem__(self, index): + if self.eval_key is None: + return OrderedDict( + [ + (key, dataset[self._map_index(key, index)]) + for key, dataset in self.datasets.items() + ] + ) + else: + # at evaluation time it's useful to pass-through batches from a single key + return self.datasets[self.eval_key][self._map_index(self.eval_key, index)] + + def __len__(self): + if self._ordered_indices is not None: + return len(self._ordered_indices[self.longest_dataset_key]) + return len(self.longest_dataset) + + def collater(self, samples): + """Merge a list of samples to form a mini-batch.""" + if len(samples) == 0: + return None + if self.eval_key is None: + return OrderedDict( + [ + (key, dataset.collater([sample[key] for sample in samples])) + for key, dataset in self.datasets.items() + ] + ) + else: + # at evaluation time it's useful to pass-through batches from a single key + return self.datasets[self.eval_key].collater(samples) + + def num_tokens(self, index): + """Return an example's length (number of tokens), used for batching.""" + # TODO make it configurable whether to use max() or sum() here + return max( + dataset.num_tokens(self._map_index(key, index)) + for key, dataset in self.datasets.items() + ) + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return { + key: dataset.size(self._map_index(key, index)) + for key, dataset in self.datasets.items() + } + + def ordered_indices(self): + """Ordered indices for batching.""" + if self._ordered_indices is None: + # Call the underlying dataset's ordered_indices() here, so that we + # get the same random ordering as we would have from using the + # underlying sub-datasets directly. + self._ordered_indices = OrderedDict( + [ + (key, dataset.ordered_indices()) + for key, dataset in self.datasets.items() + ] + ) + return np.arange(len(self)) + + def filter_indices_by_size(self, indices, max_positions=None): + """ + Filter each sub-dataset independently, then update the round robin to work + on the filtered sub-datasets. + """ + + def _deep_until_language_pair(dataset): + if isinstance(dataset, LanguagePairDataset): + return dataset + if hasattr(dataset, "tgt_dataset"): + return _deep_until_language_pair(dataset.tgt_dataset) + if hasattr(dataset, "dataset"): + return _deep_until_language_pair(dataset.dataset) + raise Exception(f"Don't know how to unwrap this dataset: {dataset}") + + if not isinstance(max_positions, dict): + max_positions = {k: max_positions for k in self.datasets.keys()} + ignored_some = False + for key, dataset in self.datasets.items(): + dataset = _deep_until_language_pair(dataset) + self._ordered_indices[key], ignored = dataset.filter_indices_by_size( + self._ordered_indices[key], max_positions[key] + ) + if len(ignored) > 0: + ignored_some = True + logger.warning( + f"{len(ignored)} samples from {key} have invalid sizes and will be skipped, " + f"max_positions={max_positions[key]}, first few sample ids={ignored[:10]}" + ) + # Since we are modifying in place the _ordered_indices, + # it's not possible anymore to return valid ignored indices. + # Hopefully the extra debug information print above should be enough to debug. + # Ideally we would receive ignore_invalid_inputs so that we could have + # a proper error message. + return (np.arange(len(self)), [0] if ignored_some else []) + + @property + def supports_prefetch(self): + return all( + getattr(dataset, "supports_prefetch", False) + for dataset in self.datasets.values() + ) + + def prefetch(self, indices): + for key, dataset in self.datasets.items(): + dataset.prefetch([self._map_index(key, index) for index in indices]) diff --git a/SpeechT5/fairseq/fairseq/data/shorten_dataset.py b/SpeechT5/fairseq/fairseq/data/shorten_dataset.py new file mode 100644 index 0000000..6ebb5d8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/shorten_dataset.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +from fairseq.data import data_utils + +from . import BaseWrapperDataset + + +class TruncateDataset(BaseWrapperDataset): + """Truncate a sequence by returning the first truncation_length tokens""" + + def __init__(self, dataset, truncation_length): + super().__init__(dataset) + assert truncation_length is not None + self.truncation_length = truncation_length + self.dataset = dataset + + def __getitem__(self, index): + item = self.dataset[index] + item_len = item.size(0) + if item_len > self.truncation_length: + item = item[: self.truncation_length] + return item + + @property + def sizes(self): + return np.minimum(self.dataset.sizes, self.truncation_length) + + def __len__(self): + return len(self.dataset) + + +class RandomCropDataset(TruncateDataset): + """Truncate a sequence by returning a random crop of truncation_length tokens""" + + def __init__(self, dataset, truncation_length, seed=1): + super().__init__(dataset, truncation_length) + self.seed = seed + self.epoch = 0 + + @property + def can_reuse_epoch_itr_across_epochs(self): + return True # only the crop changes, not item sizes + + def set_epoch(self, epoch, **unused): + super().set_epoch(epoch) + self.epoch = epoch + + def __getitem__(self, index): + with data_utils.numpy_seed(self.seed, self.epoch, index): + item = self.dataset[index] + item_len = item.size(0) + excess = item_len - self.truncation_length + if excess > 0: + start_idx = np.random.randint(0, excess) + item = item[start_idx : start_idx + self.truncation_length] + return item + + +def maybe_shorten_dataset( + dataset, + split, + shorten_data_split_list, + shorten_method, + tokens_per_sample, + seed, +): + truncate_split = ( + split in shorten_data_split_list.split(",") or len(shorten_data_split_list) == 0 + ) + if shorten_method == "truncate" and truncate_split: + dataset = TruncateDataset(dataset, tokens_per_sample) + elif shorten_method == "random_crop" and truncate_split: + dataset = RandomCropDataset(dataset, tokens_per_sample, seed) + return dataset diff --git a/SpeechT5/fairseq/fairseq/data/sort_dataset.py b/SpeechT5/fairseq/fairseq/data/sort_dataset.py new file mode 100644 index 0000000..b3890e7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/sort_dataset.py @@ -0,0 +1,21 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np + +from . import BaseWrapperDataset + + +class SortDataset(BaseWrapperDataset): + def __init__(self, dataset, sort_order): + super().__init__(dataset) + if not isinstance(sort_order, (list, tuple)): + sort_order = [sort_order] + self.sort_order = sort_order + + assert all(len(so) == len(dataset) for so in sort_order) + + def ordered_indices(self): + return np.lexsort(self.sort_order) diff --git a/SpeechT5/fairseq/fairseq/data/strip_token_dataset.py b/SpeechT5/fairseq/fairseq/data/strip_token_dataset.py new file mode 100644 index 0000000..cae39ba --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/strip_token_dataset.py @@ -0,0 +1,20 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import BaseWrapperDataset + + +class StripTokenDataset(BaseWrapperDataset): + def __init__(self, dataset, id_to_strip): + super().__init__(dataset) + self.id_to_strip = id_to_strip + + def __getitem__(self, index): + item = self.dataset[index] + while len(item) > 0 and item[-1] == self.id_to_strip: + item = item[:-1] + while len(item) > 0 and item[0] == self.id_to_strip: + item = item[1:] + return item diff --git a/SpeechT5/fairseq/fairseq/data/subsample_dataset.py b/SpeechT5/fairseq/fairseq/data/subsample_dataset.py new file mode 100644 index 0000000..48feaf8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/subsample_dataset.py @@ -0,0 +1,72 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import numpy as np + +from . import BaseWrapperDataset + + +logger = logging.getLogger(__name__) + + +class SubsampleDataset(BaseWrapperDataset): + """Subsamples a given dataset by a specified ratio. Subsampling is done on the number of examples + + Args: + dataset (~torch.utils.data.Dataset): dataset to subsample + size_ratio(float): the ratio to subsample to. must be between 0 and 1 (exclusive) + """ + + def __init__(self, dataset, size_ratio, shuffle=False): + super().__init__(dataset) + assert size_ratio < 1 + self.actual_size = np.ceil(len(dataset) * size_ratio).astype(int) + self.indices = np.random.choice( + list(range(len(self.dataset))), self.actual_size, replace=False + ) + self.shuffle = shuffle + logger.info( + "subsampled dataset from {} to {} (ratio={})".format( + len(self.dataset), self.actual_size, size_ratio + ) + ) + + def __getitem__(self, index): + return self.dataset[self.indices[index]] + + def __len__(self): + return self.actual_size + + def collater(self, samples): + return self.dataset.collater(samples) + + @property + def sizes(self): + return self.dataset.sizes[self.indices] + + @property + def name(self): + return self.dataset.name + + def num_tokens(self, index): + return self.dataset.num_tokens(self.indices[index]) + + def size(self, index): + return self.dataset.size(self.indices[index]) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + order.append(self.sizes) + return np.lexsort(order) + + def prefetch(self, indices): + self.dataset.prefetch(self.indices[indices]) diff --git a/SpeechT5/fairseq/fairseq/data/token_block_dataset.py b/SpeechT5/fairseq/fairseq/data/token_block_dataset.py new file mode 100644 index 0000000..d2c65fd --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/token_block_dataset.py @@ -0,0 +1,202 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch +from fairseq.data import FairseqDataset, plasma_utils +from fairseq.data.indexed_dataset import best_fitting_int_dtype +from typing import Tuple + + +class TokenBlockDataset(FairseqDataset): + """Break a Dataset of tokens into blocks. + + Args: + dataset (~torch.utils.data.Dataset): dataset to break into blocks + sizes (List[int]): sentence lengths (required for 'complete' and 'eos') + block_size (int): maximum block size (ignored in 'eos' break mode) + break_mode (str, optional): Mode used for breaking tokens. Values can + be one of: + - 'none': break tokens into equally sized blocks (up to block_size) + - 'complete': break tokens into blocks (up to block_size) such that + blocks contains complete sentences, although block_size may be + exceeded if some sentences exceed block_size + - 'complete_doc': similar to 'complete' mode, but do not + cross document boundaries + - 'eos': each block contains one sentence (block_size is ignored) + include_targets (bool, optional): return next tokens as targets + (default: False). + document_sep_len (int, optional): document separator size (required for + 'complete_doc' break mode). Typically 1 if the sentences have eos + and 0 otherwise. + """ + + def __init__( + self, + dataset, + sizes, + block_size, + pad, + eos, + break_mode=None, + include_targets=False, + document_sep_len=1, + use_plasma_view=False, + split_path=None, + plasma_path=None, + ): + + super().__init__() + self.dataset = dataset + self.pad = pad + self.eos = eos + self.include_targets = include_targets + + assert len(dataset) > 0 + + assert len(dataset) == len(sizes) + _sizes, block_to_dataset_index, slice_indices = self._build_slice_indices( + sizes, break_mode, document_sep_len, block_size + ) + if use_plasma_view: + plasma_id = (block_size, document_sep_len, str(break_mode), len(dataset)) + self._slice_indices = plasma_utils.PlasmaView( + slice_indices, split_path, (plasma_id, 0), plasma_path=plasma_path + ) + self._sizes = plasma_utils.PlasmaView( + _sizes, split_path, (plasma_id, 1), plasma_path=plasma_path + ) + self._block_to_dataset_index = plasma_utils.PlasmaView( + block_to_dataset_index, split_path, (plasma_id, 2), plasma_path=plasma_path, + ) + else: + self._slice_indices = plasma_utils.PlasmaArray(slice_indices) + self._sizes = plasma_utils.PlasmaArray(_sizes) + self._block_to_dataset_index = plasma_utils.PlasmaArray( + block_to_dataset_index + ) + + @staticmethod + def _build_slice_indices( + sizes, break_mode, document_sep_len, block_size + ) -> Tuple[np.ndarray]: + """Use token_block_utils_fast to build arrays for indexing into self.dataset""" + try: + from fairseq.data.token_block_utils_fast import ( + _get_slice_indices_fast, + _get_block_to_dataset_index_fast, + ) + except ImportError: + raise ImportError( + "Please build Cython components with: `pip install --editable .` " + "or `python setup.py build_ext --inplace`" + ) + + if isinstance(sizes, list): + sizes = np.array(sizes, dtype=np.int64) + else: + if torch.is_tensor(sizes): + sizes = sizes.numpy() + sizes = sizes.astype(np.int64) + + break_mode = break_mode if break_mode is not None else "none" + + # For "eos" break-mode, block_size is not required parameters. + if break_mode == "eos" and block_size is None: + block_size = 0 + + slice_indices = _get_slice_indices_fast( + sizes, str(break_mode), block_size, document_sep_len + ) + _sizes = slice_indices[:, 1] - slice_indices[:, 0] + + # build index mapping block indices to the underlying dataset indices + if break_mode == "eos": + # much faster version for eos break mode + block_to_dataset_index = np.stack( + [ + np.arange(len(sizes)), # starting index in dataset + np.zeros( + len(sizes), dtype=np.compat.long + ), # starting offset within starting index + np.arange(len(sizes)), # ending index in dataset + ], + 1, + ) + else: + block_to_dataset_index = _get_block_to_dataset_index_fast( + sizes, slice_indices, + ) + size_dtype = np.uint16 if block_size < 65535 else np.uint32 + num_tokens = slice_indices[-1].max() + slice_indices_dtype = best_fitting_int_dtype(num_tokens) + slice_indices = slice_indices.astype(slice_indices_dtype) + _sizes = _sizes.astype(size_dtype) + block_to_dataset_index = block_to_dataset_index.astype(slice_indices_dtype) + return _sizes, block_to_dataset_index, slice_indices + + @property + def slice_indices(self): + return self._slice_indices.array + + @property + def sizes(self): + return self._sizes.array + + @property + def block_to_dataset_index(self): + return self._block_to_dataset_index.array + + def attr(self, attr: str, index: int): + start_ds_idx, _, _ = self.block_to_dataset_index[index] + return self.dataset.attr(attr, start_ds_idx) + + def __getitem__(self, index): + start_ds_idx, start_offset, end_ds_idx = self.block_to_dataset_index[index] + + buffer = torch.cat( + [self.dataset[idx] for idx in range(start_ds_idx, end_ds_idx + 1)] + ) + slice_s, slice_e = self.slice_indices[index] + length = slice_e - slice_s + s, e = start_offset, start_offset + length + item = buffer[s:e] + + if self.include_targets: + # *target* is the original sentence (=item) + # *source* is shifted right by 1 (maybe left-padded with eos) + # *past_target* is shifted right by 2 (left-padded as needed) + if s == 0: + source = torch.cat([item.new([self.eos]), buffer[0 : e - 1]]) + past_target = torch.cat( + [item.new([self.pad, self.eos]), buffer[0 : e - 2]] + ) + else: + source = buffer[s - 1 : e - 1] + if s == 1: + past_target = torch.cat([item.new([self.eos]), buffer[0 : e - 2]]) + else: + past_target = buffer[s - 2 : e - 2] + + return source, item, past_target + + return item + + def __len__(self): + return len(self.slice_indices) + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + self.dataset.prefetch( + { + ds_idx + for index in indices + for start_ds_idx, _, end_ds_idx in [self.block_to_dataset_index[index]] + for ds_idx in range(start_ds_idx, end_ds_idx + 1) + } + ) diff --git a/SpeechT5/fairseq/fairseq/data/token_block_utils_fast.pyx b/SpeechT5/fairseq/fairseq/data/token_block_utils_fast.pyx new file mode 100644 index 0000000..08af4f3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/token_block_utils_fast.pyx @@ -0,0 +1,187 @@ +# cython: language_level=3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch +from itertools import chain +from libc.math cimport ceil + +cimport cython +cimport numpy as np + +from libc.stdint cimport int32_t, int64_t + +DTYPE = np.int64 +ctypedef int64_t DTYPE_t + + +@cython.boundscheck(False) +@cython.wraparound(False) +@cython.nonecheck(False) +cdef np.ndarray[DTYPE_t, ndim=2] _get_slice_indices_none_mode(np.ndarray[DTYPE_t, ndim=1] sizes, int block_size): + cdef DTYPE_t total_size = sizes.sum() + cdef DTYPE_t length = <DTYPE_t> ceil(total_size / <double> block_size) + cdef np.ndarray[DTYPE_t, ndim=2] slice_indices = np.zeros([length, 2], dtype=DTYPE) + cdef DTYPE_t[:, :] slice_indices_view = slice_indices + cdef DTYPE_t i + cdef DTYPE_t start + cdef DTYPE_t end + for i in range(length): + start = i * block_size + end = min(start + block_size, total_size) + slice_indices_view[i][0] = start + slice_indices_view[i][1] = end + return slice_indices + + +cdef np.ndarray[DTYPE_t, ndim=2] _fast_convert_to_np_array(list list_of_list): + """ + Faster function to convert DTYPE_t list of list. + Only fast when there are huge number of rows and low number of columns. + """ + cdef np.ndarray[DTYPE_t, ndim=1] flat = np.fromiter(chain.from_iterable(list_of_list), DTYPE, -1) + return flat.reshape((len(list_of_list), -1)) + + +@cython.boundscheck(False) +@cython.wraparound(False) +@cython.nonecheck(False) +cpdef np.ndarray[DTYPE_t, ndim=2] _get_slice_indices_fast(np.ndarray[DTYPE_t, ndim=1] sizes, str break_mode, int block_size, int document_sep_len): + cdef DTYPE_t tok_idx = 0 + cdef DTYPE_t sz_idx = 0 + cdef DTYPE_t curr_size = 0 + cdef DTYPE_t i = 0 + cdef DTYPE_t length + cdef DTYPE_t total_size + cdef DTYPE_t[:] sizes_view = sizes + cdef np.ndarray[DTYPE_t, ndim=2] slice_indices + cdef list slice_indices_list = [] + + if break_mode is None or break_mode == 'none': + slice_indices = _get_slice_indices_none_mode(sizes, block_size) + elif break_mode == 'complete': + while sz_idx < len(sizes_view): + if curr_size + sizes_view[sz_idx] <= block_size or curr_size == 0: + curr_size += sizes_view[sz_idx] + sz_idx += 1 + else: + slice_indices_list.append((tok_idx, tok_idx + curr_size)) + tok_idx += curr_size + curr_size = 0 + if curr_size > 0: + slice_indices_list.append((tok_idx, tok_idx + curr_size)) + slice_indices = _fast_convert_to_np_array(slice_indices_list) + elif break_mode == 'complete_doc': + while sz_idx < len(sizes_view): + if ( + (curr_size + sizes_view[sz_idx] <= block_size or curr_size == 0) + # an empty sentence indicates end-of-document: + and sizes_view[sz_idx] != document_sep_len + ): + curr_size += sizes_view[sz_idx] + sz_idx += 1 + else: + # Only keep non-empty documents. + if curr_size > 1: + slice_indices_list.append((tok_idx, tok_idx + curr_size)) + tok_idx += curr_size + curr_size = 0 + if sizes_view[sz_idx] == document_sep_len: + tok_idx += sizes_view[sz_idx] + sz_idx += 1 + if curr_size > 1: + slice_indices_list.append((tok_idx, tok_idx + curr_size)) + slice_indices = _fast_convert_to_np_array(slice_indices_list) + elif break_mode == 'eos': + slice_indices = np.zeros((len(sizes), 2), dtype=DTYPE) + cumsum = sizes.cumsum(axis=0) + slice_indices[1:, 0] = cumsum[:cumsum.shape[0] - 1] + slice_indices[:, 1] = cumsum + else: + raise ValueError('Invalid break_mode: ' + break_mode) + return slice_indices + + +@cython.boundscheck(False) +@cython.wraparound(False) +@cython.nonecheck(False) +cpdef np.ndarray[DTYPE_t, ndim=2] _get_block_to_dataset_index_fast(np.ndarray[DTYPE_t, ndim=1] sizes, np.ndarray[DTYPE_t, ndim=2] slice_indices): + cdef DTYPE_t start_ds_idx + cdef DTYPE_t start_offset + cdef DTYPE_t end_ds_idx + cdef DTYPE_t i + cdef DTYPE_t s + cdef DTYPE_t e + cdef DatasetSearcher ds = DatasetSearcher(sizes) + cdef np.ndarray[DTYPE_t, ndim=2] block_to_dataset_index = np.zeros([len(slice_indices), 3], dtype=DTYPE) + cdef DTYPE_t[:, :] block_to_dataset_index_view = block_to_dataset_index + cdef DTYPE_t[:, :] slice_indices_view = slice_indices + cdef Py_ssize_t x_max = slice_indices.shape[0] + + for i in range(x_max): + s = slice_indices_view[i][0] + e = slice_indices_view[i][1] + ds.seek(s) + start_ds_idx = ds.current_index + start_offset = ds.current_offset + if e <= s: + end_ds_idx = start_ds_idx + else: + ds.seek(e - 1) + end_ds_idx = ds.current_index + block_to_dataset_index_view[i][0] = start_ds_idx # starting index in dataset + block_to_dataset_index_view[i][1] = start_offset # starting offset within starting index + block_to_dataset_index_view[i][2] = end_ds_idx # ending index in dataset + return block_to_dataset_index + + +cdef class DatasetSearcher(object): + """Helper for mapping "flat" indices to indices and offsets in an + underlying dataset.""" + cdef DTYPE_t current_i + cdef DTYPE_t current_offset + cdef DTYPE_t current_index + cdef DTYPE_t[:] sizes + + def __init__(self, DTYPE_t[:] sizes): + self.sizes = sizes + self.reset() + + cdef reset(self): + self.current_offset = 0 # offset within current index in underlying dataset + self.current_i = 0 # "flat" index + self.current_index = 0 # index in underlying dataset + + @cython.boundscheck(False) + @cython.wraparound(False) + @cython.nonecheck(False) + cdef int step(self, DTYPE_t i): + cdef DTYPE_t to_consume + cdef DTYPE_t remaining + if i < self.current_i: + self.reset() + if i > self.current_i: + to_consume = i - self.current_i + remaining = self.sizes[self.current_index] - self.current_offset + if remaining > to_consume: + self.current_offset += to_consume + self.current_i += to_consume + else: + assert remaining >= 0 + self.current_i += remaining + self.current_index += 1 + self.current_offset = 0 + return 1 + return 0 + + @cython.boundscheck(False) + @cython.wraparound(False) + @cython.nonecheck(False) + cdef seek(self, DTYPE_t i): + cdef int not_done = 1 + while not_done == 1: + not_done = self.step(i) + assert self.current_i == i diff --git a/SpeechT5/fairseq/fairseq/data/transform_eos_dataset.py b/SpeechT5/fairseq/fairseq/data/transform_eos_dataset.py new file mode 100644 index 0000000..fb14ff0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/transform_eos_dataset.py @@ -0,0 +1,120 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from . import FairseqDataset + + +class TransformEosDataset(FairseqDataset): + """A :class:`~fairseq.data.FairseqDataset` wrapper that appends/prepends/strips EOS. + + Note that the transformation is applied in :func:`collater`. + + Args: + dataset (~fairseq.data.FairseqDataset): dataset to wrap + eos (int): index of the end-of-sentence symbol + append_eos_to_src (bool, optional): append EOS to the end of src + remove_eos_from_src (bool, optional): remove EOS from the end of src + append_eos_to_tgt (bool, optional): append EOS to the end of tgt + remove_eos_from_tgt (bool, optional): remove EOS from the end of tgt + """ + + def __init__( + self, + dataset, + eos, + append_eos_to_src=False, + remove_eos_from_src=False, + append_eos_to_tgt=False, + remove_eos_from_tgt=False, + has_target=True, + ): + if not isinstance(dataset, FairseqDataset): + raise ValueError("dataset must be an instance of FairseqDataset") + if append_eos_to_src and remove_eos_from_src: + raise ValueError("cannot combine append_eos_to_src and remove_eos_from_src") + if append_eos_to_tgt and remove_eos_from_tgt: + raise ValueError("cannot combine append_eos_to_tgt and remove_eos_from_tgt") + + self.dataset = dataset + self.eos = torch.LongTensor([eos]) + self.append_eos_to_src = append_eos_to_src + self.remove_eos_from_src = remove_eos_from_src + self.append_eos_to_tgt = append_eos_to_tgt + self.remove_eos_from_tgt = remove_eos_from_tgt + self.has_target = has_target + + # precompute how we should adjust the reported sizes + self._src_delta = 0 + self._src_delta += 1 if append_eos_to_src else 0 + self._src_delta -= 1 if remove_eos_from_src else 0 + self._tgt_delta = 0 + self._tgt_delta += 1 if append_eos_to_tgt else 0 + self._tgt_delta -= 1 if remove_eos_from_tgt else 0 + + self._checked_src = False + self._checked_tgt = False + + def _check_src(self, src, expect_eos): + if not self._checked_src: + assert (src[-1] == self.eos[0]) == expect_eos + self._checked_src = True + + def _check_tgt(self, tgt, expect_eos): + if self.has_target and not self._checked_tgt: + assert (tgt[-1] == self.eos[0]) == expect_eos + self._checked_tgt = True + + def __getitem__(self, index): + return self.dataset[index] + + def __len__(self): + return len(self.dataset) + + def collater(self, samples): + def transform(item): + if self.append_eos_to_src: + self.eos = self.eos.to(device=item["source"].device) + self._check_src(item["source"], expect_eos=False) + item["source"] = torch.cat([item["source"], self.eos]) + if self.remove_eos_from_src: + self.eos = self.eos.to(device=item["source"].device) + self._check_src(item["source"], expect_eos=True) + item["source"] = item["source"][:-1] + if self.append_eos_to_tgt: + self.eos = self.eos.to(device=item["target"].device) + self._check_tgt(item["target"], expect_eos=False) + item["target"] = torch.cat([item["target"], self.eos]) + if self.remove_eos_from_tgt: + self.eos = self.eos.to(device=item["target"].device) + self._check_tgt(item["target"], expect_eos=True) + item["target"] = item["target"][:-1] + return item + + samples = list(map(transform, samples)) + return self.dataset.collater(samples) + + def num_tokens(self, index): + return self.dataset.num_tokens(index) + + def size(self, index): + if self.has_target: + src_len, tgt_len = self.dataset.size(index) + return (src_len + self._src_delta, tgt_len + self._tgt_delta) + else: + return self.dataset.size(index) + + def ordered_indices(self): + # NOTE: we assume that the ordering does not change based on the + # addition or removal of eos + return self.dataset.ordered_indices() + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + return self.dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/fairseq/data/transform_eos_lang_pair_dataset.py b/SpeechT5/fairseq/fairseq/data/transform_eos_lang_pair_dataset.py new file mode 100644 index 0000000..07ebdd5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/data/transform_eos_lang_pair_dataset.py @@ -0,0 +1,111 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from typing import Optional + +import torch + +from . import FairseqDataset + + +class TransformEosLangPairDataset(FairseqDataset): + """A :class:`~fairseq.data.FairseqDataset` wrapper that transform bos on + collated samples of language pair dataset. + + Note that the transformation is applied in :func:`collater`. + + Args: + dataset (~fairseq.data.FairseqDataset): dataset that collates sample into + LanguagePairDataset schema + src_eos (int): original source end-of-sentence symbol index to be replaced + new_src_eos (int, optional): new end-of-sentence symbol index to replace source eos symbol + tgt_bos (int, optional): original target beginning-of-sentence symbol index to be replaced + new_tgt_bos (int, optional): new beginning-of-sentence symbol index to replace at the + beginning of 'prev_output_tokens' + """ + + def __init__( + self, + dataset: FairseqDataset, + src_eos: int, + new_src_eos: Optional[int] = None, + tgt_bos: Optional[int] = None, + new_tgt_bos: Optional[int] = None, + ): + self.dataset = dataset + self.src_eos = src_eos + self.new_src_eos = new_src_eos + self.tgt_bos = tgt_bos + self.new_tgt_bos = new_tgt_bos + + def __getitem__(self, index): + return self.dataset[index] + + def __len__(self): + return len(self.dataset) + + def collater(self, samples, **extra_args): + samples = self.dataset.collater(samples, **extra_args) + + if 'net_input' not in samples: + return samples + + if self.new_src_eos is not None: + if self.dataset.left_pad_source: + assert ( + samples["net_input"]["src_tokens"][:, -1] != self.src_eos + ).sum() == 0 + samples["net_input"]["src_tokens"][:, -1] = self.new_src_eos + else: + eos_idx = samples["net_input"]["src_lengths"] - 1 + assert ( + samples["net_input"]["src_tokens"][ + torch.arange(eos_idx.size(0)), eos_idx + ] + != self.src_eos + ).sum() == 0 + eos_idx = eos_idx.resize_(len(samples["net_input"]["src_lengths"]), 1) + samples["net_input"]["src_tokens"].scatter_( + 1, eos_idx, self.new_src_eos + ) + + if ( + self.new_tgt_bos is not None + and "prev_output_tokens" in samples["net_input"] + ): + if self.dataset.left_pad_target: + # TODO: support different padding direction on target side + raise NotImplementedError( + "TransformEosLangPairDataset does not implement --left-pad-target True option" + ) + else: + assert ( + samples["net_input"]["prev_output_tokens"][:, 0] != self.tgt_bos + ).sum() == 0 + samples["net_input"]["prev_output_tokens"][:, 0] = self.new_tgt_bos + + return samples + + def num_tokens(self, index): + return self.dataset.num_tokens(index) + + def size(self, index): + return self.dataset.size(index) + + @property + def sizes(self): + # dataset.sizes can be a dynamically computed sizes: + return self.dataset.sizes + + def ordered_indices(self): + return self.dataset.ordered_indices() + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + return self.dataset.prefetch(indices) diff --git a/SpeechT5/fairseq/fairseq/dataclass/__init__.py b/SpeechT5/fairseq/fairseq/dataclass/__init__.py new file mode 100644 index 0000000..25408d2 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/dataclass/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .configs import FairseqDataclass +from .constants import ChoiceEnum + + +__all__ = [ + "FairseqDataclass", + "ChoiceEnum", +] diff --git a/SpeechT5/fairseq/fairseq/dataclass/configs.py b/SpeechT5/fairseq/fairseq/dataclass/configs.py new file mode 100644 index 0000000..b0146fa --- /dev/null +++ b/SpeechT5/fairseq/fairseq/dataclass/configs.py @@ -0,0 +1,990 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys +from dataclasses import _MISSING_TYPE, dataclass, field +from typing import Any, List, Optional + +import torch + +from fairseq.dataclass.constants import ( + DATASET_IMPL_CHOICES, + DDP_BACKEND_CHOICES, + DDP_COMM_HOOK_CHOICES, + GENERATION_CONSTRAINTS_CHOICES, + GENERATION_DECODING_FORMAT_CHOICES, + LOG_FORMAT_CHOICES, + PIPELINE_CHECKPOINT_CHOICES, + PRINT_ALIGNMENT_CHOICES, + ZERO_SHARDING_CHOICES, +) + +from omegaconf import II, MISSING + + +@dataclass +class FairseqDataclass: + """fairseq base dataclass that supported fetching attributes and metas""" + + _name: Optional[str] = None + + @staticmethod + def name(): + return None + + def _get_all_attributes(self) -> List[str]: + return [k for k in self.__dataclass_fields__.keys()] + + def _get_meta( + self, attribute_name: str, meta: str, default: Optional[Any] = None + ) -> Any: + return self.__dataclass_fields__[attribute_name].metadata.get(meta, default) + + def _get_name(self, attribute_name: str) -> str: + return self.__dataclass_fields__[attribute_name].name + + def _get_default(self, attribute_name: str) -> Any: + if hasattr(self, attribute_name): + if str(getattr(self, attribute_name)).startswith("${"): + return str(getattr(self, attribute_name)) + elif str(self.__dataclass_fields__[attribute_name].default).startswith( + "${" + ): + return str(self.__dataclass_fields__[attribute_name].default) + elif ( + getattr(self, attribute_name) + != self.__dataclass_fields__[attribute_name].default + ): + return getattr(self, attribute_name) + + f = self.__dataclass_fields__[attribute_name] + if not isinstance(f.default_factory, _MISSING_TYPE): + return f.default_factory() + return f.default + + def _get_type(self, attribute_name: str) -> Any: + return self.__dataclass_fields__[attribute_name].type + + def _get_help(self, attribute_name: str) -> Any: + return self._get_meta(attribute_name, "help") + + def _get_argparse_const(self, attribute_name: str) -> Any: + return self._get_meta(attribute_name, "argparse_const") + + def _get_argparse_alias(self, attribute_name: str) -> Any: + return self._get_meta(attribute_name, "argparse_alias") + + def _get_choices(self, attribute_name: str) -> Any: + return self._get_meta(attribute_name, "choices") + + +@dataclass +class CommonConfig(FairseqDataclass): + # This is the core dataclass including common parameters shared by all different jobs. Please append your params to other dataclasses if they were + # used for a particular purpose or task, such as those dedicated for `distributed training`, `optimization`, etc. + no_progress_bar: bool = field( + default=False, metadata={"help": "disable progress bar"} + ) + log_interval: int = field( + default=100, + metadata={ + "help": "log progress every N batches (when progress bar is disabled)" + }, + ) + log_format: Optional[LOG_FORMAT_CHOICES] = field( + default=None, metadata={"help": "log format to use"} + ) + log_file: Optional[str] = field( + default=None, metadata={"help": "log file to copy metrics to."} + ) + tensorboard_logdir: Optional[str] = field( + default=None, + metadata={ + "help": "path to save logs for tensorboard, should match --logdir " + "of running tensorboard (default: no tensorboard logging)" + }, + ) + wandb_project: Optional[str] = field( + default=None, + metadata={"help": "Weights and Biases project name to use for logging"}, + ) + azureml_logging: Optional[bool] = field( + default=False, metadata={"help": "Log scalars to AzureML context"}, + ) + seed: int = field( + default=1, metadata={"help": "pseudo random number generator seed"} + ) + cpu: bool = field(default=False, metadata={"help": "use CPU instead of CUDA"}) + tpu: bool = field(default=False, metadata={"help": "use TPU instead of CUDA"}) + bf16: bool = field(default=False, metadata={"help": "use bfloat16; implies --tpu"}) + memory_efficient_bf16: bool = field( + default=False, + metadata={ + "help": "use a memory-efficient version of BF16 training; implies --bf16" + }, + ) + fp16: bool = field(default=False, metadata={"help": "use FP16"}) + memory_efficient_fp16: bool = field( + default=False, + metadata={ + "help": "use a memory-efficient version of FP16 training; implies --fp16" + }, + ) + fp16_no_flatten_grads: bool = field( + default=False, metadata={"help": "don't flatten FP16 grads tensor"} + ) + fp16_init_scale: int = field( + default=2 ** 7, metadata={"help": "default FP16 loss scale"} + ) + fp16_scale_window: Optional[int] = field( + default=None, + metadata={"help": "number of updates before increasing loss scale"}, + ) + fp16_scale_tolerance: float = field( + default=0.0, + metadata={ + "help": "pct of updates that can overflow before decreasing the loss scale" + }, + ) + on_cpu_convert_precision: bool = field( + default=False, + metadata={ + "help": "if set, the floating point conversion to fp16/bf16 runs on CPU. " + "This reduces bus transfer time and GPU memory usage." + } + ) + min_loss_scale: float = field( + default=1e-4, + metadata={"help": "minimum FP16/AMP loss scale, after which training is stopped"}, + ) + threshold_loss_scale: Optional[float] = field( + default=None, metadata={"help": "threshold FP16 loss scale from below"} + ) + amp: bool = field(default=False, metadata={"help": "use automatic mixed precision"}) + amp_batch_retries: int = field( + default=2, + metadata={"help": "number of retries of same batch after reducing loss scale with AMP"}, + ) + amp_init_scale: int = field( + default=2 ** 7, metadata={"help": "default AMP loss scale"} + ) + amp_scale_window: Optional[int] = field( + default=None, + metadata={"help": "number of updates before increasing AMP loss scale"}, + ) + user_dir: Optional[str] = field( + default=None, + metadata={ + "help": "path to a python module containing custom extensions (tasks and/or architectures)" + }, + ) + empty_cache_freq: int = field( + default=0, + metadata={"help": "how often to clear the PyTorch CUDA cache (0 to disable)"}, + ) + all_gather_list_size: int = field( + default=16384, + metadata={"help": "number of bytes reserved for gathering stats from workers"}, + ) + model_parallel_size: int = field( + default=1, metadata={"help": "total number of GPUs to parallelize model over"} + ) + quantization_config_path: Optional[str] = field( + default=None, metadata={"help": "path to quantization config file"} + ) + profile: bool = field( + default=False, metadata={"help": "enable autograd profiler emit_nvtx"} + ) + reset_logging: bool = field( + default=False, + metadata={ + "help": "when using Hydra, reset the logging at the beginning of training" + }, + ) + suppress_crashes: bool = field( + default=False, + metadata={ + "help": "suppress crashes when training with the hydra_train entry point so that the " + "main method can return a value (useful for sweeps)" + }, + ) + use_plasma_view: bool = field( + default=False, metadata={"help": "Store indices and sizes in shared memory"} + ) + plasma_path: Optional[str] = field( + default="/tmp/plasma", + metadata={ + "help": "path to run plasma_store, defaults to /tmp/plasma. Paths outside /tmp tend to fail." + }, + ) + + +@dataclass +class DistributedTrainingConfig(FairseqDataclass): + distributed_world_size: int = field( + default=max(1, torch.cuda.device_count()), + metadata={ + "help": "total number of GPUs across all nodes (default: all visible GPUs)" + }, + ) + distributed_num_procs: Optional[int] = field( + default=max(1, torch.cuda.device_count()), + metadata={ + "help": "total number of processes to fork (default: all visible GPUs)" + }, + ) + distributed_rank: Optional[int] = field( + default=0, metadata={"help": "rank of the current worker"} + ) + distributed_backend: str = field( + default="nccl", metadata={"help": "distributed backend"} + ) + distributed_init_method: Optional[str] = field( + default=None, + metadata={ + "help": "typically tcp://hostname:port that will be used to " + "establish initial connetion" + }, + ) + distributed_port: int = field( + default=-1, + metadata={ + "help": "port number (not required if using --distributed-init-method)" + }, + ) + device_id: int = field( + default=0, + metadata={ + "help": "which GPU to use (usually configured automatically)", + "argparse_alias": "--local_rank", + }, + ) + distributed_no_spawn: bool = field( + default=False, + metadata={ + "help": "do not spawn multiple processes even if multiple GPUs are visible" + }, + ) + ddp_backend: DDP_BACKEND_CHOICES = field( + default="pytorch_ddp", metadata={"help": "DistributedDataParallel backend"} + ) + ddp_comm_hook: DDP_COMM_HOOK_CHOICES = field( + default="none", metadata={"help": "communication hook"} + ) + bucket_cap_mb: int = field( + default=25, metadata={"help": "bucket size for reduction"} + ) + fix_batches_to_gpus: bool = field( + default=False, + metadata={ + "help": "don't shuffle batches between GPUs; this reduces overall " + "randomness and may affect precision but avoids the cost of re-reading the data" + }, + ) + find_unused_parameters: bool = field( + default=False, + metadata={ + "help": "disable unused parameter detection (not applicable to " + "--ddp-backend=legacy_ddp)" + }, + ) + fast_stat_sync: bool = field( + default=False, + metadata={"help": "[deprecated] this is now defined per Criterion"}, + ) + heartbeat_timeout: int = field( + default=-1, + metadata={ + "help": "kill the job if no progress is made in N seconds; " + "set to -1 to disable" + }, + ) + broadcast_buffers: bool = field( + default=False, + metadata={ + "help": "Copy non-trainable parameters between GPUs, such as " + "batchnorm population statistics" + }, + ) + slowmo_momentum: Optional[float] = field( + default=None, + metadata={ + "help": "SlowMo momentum term; by default use 0.0 for 16 GPUs, " + "0.2 for 32 GPUs; 0.5 for 64 GPUs, 0.6 for > 64 GPUs" + }, + ) + slowmo_algorithm: str = field( + default="LocalSGD", metadata={"help": "whether to use LocalSGD or SGP"} + ) + localsgd_frequency: int = field( + default=3, metadata={"help": "Local SGD allreduce frequency"} + ) + nprocs_per_node: int = field( + default=max(1, torch.cuda.device_count()), + metadata={ + "help": "number of GPUs in each node. An allreduce operation across GPUs in " + "a node is very fast. Hence, we do allreduce across GPUs in a node, " + "and gossip across different nodes" + }, + ) + pipeline_model_parallel: bool = field( + default=False, + metadata={"help": "if set, use pipeline model parallelism across GPUs"}, + ) + pipeline_balance: Optional[str] = field( + default=None, + metadata={ + "help": "partition the model into N_K pieces, where each piece " + "contains N_i layers. The sum(args.pipeline_balance) " + "should equal the total number of layers in the model" + }, + ) + pipeline_devices: Optional[str] = field( + default=None, + metadata={ + "help": "a list of device indices indicating which device to place " + "each of the N_K partitions. The length of this list should " + "equal the length of the --pipeline-balance argument" + }, + ) + pipeline_chunks: Optional[int] = field( + default=0, metadata={"help": "microbatch count for pipeline model parallelism"} + ) + pipeline_encoder_balance: Optional[str] = field( + default=None, + metadata={ + "help": "partition the pipeline parallel encoder into N_K pieces, where each piece " + "contains N_i layers. The sum(args.pipeline_encoder_balance) " + "should equal the total number of encoder layers in the model" + }, + ) + pipeline_encoder_devices: Optional[str] = field( + default=None, + metadata={ + "help": "a list of device indices indicating which device to place " + "each of the N_K partitions. The length of this list should " + "equal the length of the --pipeline-encoder-balance argument" + }, + ) + pipeline_decoder_balance: Optional[str] = field( + default=None, + metadata={ + "help": "partition the pipeline parallel decoder into N_K pieces, where each piece " + "contains N_i layers. The sum(args.pipeline_decoder_balance) " + "should equal the total number of decoder layers in the model" + }, + ) + pipeline_decoder_devices: Optional[str] = field( + default=None, + metadata={ + "help": "a list of device indices indicating which device to place " + "each of the N_K partitions. The length of this list should " + "equal the length of the --pipeline-decoder-balance argument" + }, + ) + pipeline_checkpoint: PIPELINE_CHECKPOINT_CHOICES = field( + default="never", + metadata={"help": "checkpointing mode for pipeline model parallelism"}, + ) + zero_sharding: ZERO_SHARDING_CHOICES = field( + default="none", metadata={"help": "ZeRO sharding"} + ) + fp16: bool = II("common.fp16") + memory_efficient_fp16: bool = II("common.memory_efficient_fp16") + tpu: bool = II("common.tpu") + # configuration for --ddp-backend=fully_sharded + no_reshard_after_forward: bool = field( + default=False, metadata={"help": "don't reshard parameters after forward pass"}, + ) + fp32_reduce_scatter: bool = field( + default=False, metadata={"help": "reduce-scatter grads in FP32"}, + ) + cpu_offload: bool = field( + default=False, metadata={"help": "offload FP32 params to CPU"} + ) + use_sharded_state: bool = field( + default=False, metadata={"help": "use sharded checkpoint files"}, + ) + + +@dataclass +class DatasetConfig(FairseqDataclass): + num_workers: int = field( + default=1, metadata={"help": "how many subprocesses to use for data loading"} + ) + skip_invalid_size_inputs_valid_test: bool = field( + default=False, + metadata={"help": "ignore too long or too short lines in valid and test set"}, + ) + max_tokens: Optional[int] = field( + default=None, metadata={"help": "maximum number of tokens in a batch"} + ) + batch_size: Optional[int] = field( + default=None, + metadata={ + "help": "number of examples in a batch", + "argparse_alias": "--max-sentences", + }, + ) + required_batch_size_multiple: int = field( + default=8, metadata={"help": "batch size will be a multiplier of this value"} + ) + required_seq_len_multiple: int = field( + default=1, + metadata={ + "help": "maximum sequence length in batch will be a multiplier of this value" + }, + ) + dataset_impl: Optional[DATASET_IMPL_CHOICES] = field( + default=None, metadata={"help": "output dataset implementation"} + ) + data_buffer_size: int = field( + default=10, metadata={"help": "Number of batches to preload"} + ) + train_subset: str = field( + default="train", + metadata={"help": "data subset to use for training (e.g. train, valid, test)"}, + ) + valid_subset: str = field( + default="valid", + metadata={ + "help": "comma separated list of data subsets to use for validation" + " (e.g. train, valid, test)" + }, + ) + combine_valid_subsets: Optional[bool] = field( + default=None, + metadata={ + "help": "comma separated list of data subsets to use for validation" + " (e.g. train, valid, test)", + "argparse_alias": "--combine-val", + }, + ) + ignore_unused_valid_subsets: Optional[bool] = field( + default=False, + metadata={"help": "do not raise error if valid subsets are ignored"}, + ) + + validate_interval: int = field( + default=1, metadata={"help": "validate every N epochs"} + ) + validate_interval_updates: int = field( + default=0, metadata={"help": "validate every N updates"} + ) + validate_after_updates: int = field( + default=0, metadata={"help": "dont validate until reaching this many updates"} + ) + fixed_validation_seed: Optional[int] = field( + default=None, metadata={"help": "specified random seed for validation"} + ) + disable_validation: bool = field( + default=False, metadata={"help": "disable validation"} + ) + max_tokens_valid: Optional[int] = field( + default=II("dataset.max_tokens"), + metadata={ + "help": "maximum number of tokens in a validation batch" + " (defaults to --max-tokens)" + }, + ) + batch_size_valid: Optional[int] = field( + default=II("dataset.batch_size"), + metadata={ + "help": "batch size of the validation batch (defaults to --batch-size)", + "argparse_alias": "--max-sentences-valid", + }, + ) + max_valid_steps: Optional[int] = field(default=None, metadata={'help': 'How many batches to evaluate', + "argparse_alias": "--nval"}) + curriculum: int = field( + default=0, metadata={"help": "don't shuffle batches for first N epochs"} + ) + gen_subset: str = field( + default="test", + metadata={"help": "data subset to generate (train, valid, test)"}, + ) + num_shards: int = field( + default=1, metadata={"help": "shard generation over N shards"} + ) + shard_id: int = field( + default=0, metadata={"help": "id of the shard to generate (id < num_shards)"} + ) + + +@dataclass +class OptimizationConfig(FairseqDataclass): + max_epoch: int = field( + default=0, metadata={"help": "force stop training at specified epoch"} + ) + max_update: int = field( + default=0, metadata={"help": "force stop training at specified update"} + ) + stop_time_hours: float = field( + default=0, + metadata={ + "help": "force stop training after specified cumulative time (if >0)" + }, + ) + clip_norm: float = field( + default=0.0, metadata={"help": "clip threshold of gradients"} + ) + sentence_avg: bool = field( + default=False, + metadata={ + "help": "normalize gradients by the number of sentences in a batch" + " (default is to normalize by number of tokens)" + }, + ) + update_freq: List[int] = field( + default_factory=lambda: [1], + metadata={"help": "update parameters every N_i batches, when in epoch i"}, + ) + lr: List[float] = field( + default_factory=lambda: [0.25], + metadata={ + "help": "learning rate for the first N epochs; all epochs >N using LR_N" + " (note: this may be interpreted differently depending on --lr-scheduler)" + }, + ) + stop_min_lr: float = field( + default=-1.0, + metadata={"help": "stop training when the learning rate reaches this minimum"}, + ) + use_bmuf: bool = field( + default=False, + metadata={ + "help": "specify global optimizer for syncing models on different GPUs/shards" + }, + ) + + +@dataclass +class CheckpointConfig(FairseqDataclass): + save_dir: str = field( + default="checkpoints", metadata={"help": "path to save checkpoints"} + ) + restore_file: str = field( + default="checkpoint_last.pt", + metadata={ + "help": "filename from which to load checkpoint " + "(default: <save-dir>/checkpoint_last.pt" + }, + ) + finetune_from_model: Optional[str] = field( + default=None, + metadata={ + "help": "finetune from a pretrained model; note that meters and lr scheduler will be reset" + }, + ) + reset_dataloader: bool = field( + default=False, + metadata={ + "help": "if set, does not reload dataloader state from the checkpoint" + }, + ) + reset_lr_scheduler: bool = field( + default=False, + metadata={ + "help": "if set, does not load lr scheduler state from the checkpoint" + }, + ) + reset_meters: bool = field( + default=False, + metadata={"help": "if set, does not load meters from the checkpoint"}, + ) + reset_optimizer: bool = field( + default=False, + metadata={"help": "if set, does not load optimizer state from the checkpoint"}, + ) + optimizer_overrides: str = field( + default="{}", + metadata={ + "help": "a dictionary used to override optimizer args when loading a checkpoint" + }, + ) + save_interval: int = field( + default=1, metadata={"help": "save a checkpoint every N epochs"} + ) + save_interval_updates: int = field( + default=0, metadata={"help": "save a checkpoint (and validate) every N updates"} + ) + keep_interval_updates: int = field( + default=-1, + metadata={ + "help": "keep the last N checkpoints saved with --save-interval-updates" + }, + ) + keep_interval_updates_pattern: int = field( + default=-1, + metadata={ + "help": "when used with --keep-interval-updates, skips deleting " + "any checkpoints with update X where " + "X %% keep_interval_updates_pattern == 0" + }, + ) + keep_last_epochs: int = field( + default=-1, metadata={"help": "keep last N epoch checkpoints"} + ) + keep_best_checkpoints: int = field( + default=-1, metadata={"help": "keep best N checkpoints based on scores"} + ) + no_save: bool = field( + default=False, metadata={"help": "don't save models or checkpoints"} + ) + no_epoch_checkpoints: bool = field( + default=False, metadata={"help": "only store last and best checkpoints"} + ) + no_last_checkpoints: bool = field( + default=False, metadata={"help": "don't store last checkpoints"} + ) + no_save_optimizer_state: bool = field( + default=False, + metadata={"help": "don't save optimizer-state as part of checkpoint"}, + ) + best_checkpoint_metric: str = field( + default="loss", metadata={"help": 'metric to use for saving "best" checkpoints'} + ) + maximize_best_checkpoint_metric: bool = field( + default=False, + metadata={ + "help": 'select the largest metric value for saving "best" checkpoints' + }, + ) + patience: int = field( + default=-1, + metadata={ + "help": ( + "early stop training if valid performance doesn't " + "improve for N consecutive validation runs; note " + "that this is influenced by --validate-interval" + ) + }, + ) + checkpoint_suffix: str = field( + default="", metadata={"help": "suffix to add to the checkpoint file name"} + ) + checkpoint_shard_count: int = field( + default=1, + metadata={ + "help": "Number of shards containing the checkpoint - " + "if the checkpoint is over 300GB, it is preferable " + "to split it into shards to prevent OOM on CPU while loading " + "the checkpoint" + }, + ) + load_checkpoint_on_all_dp_ranks: bool = field( + default=False, + metadata={ + "help": "load checkpoints on all data parallel devices " + "(default: only load on rank 0 and broadcast to other devices)" + }, + ) + write_checkpoints_asynchronously: bool = field( + default=False, + metadata={ + "help": ( + "Write checkpoints asynchronously in a separate " + "thread. NOTE: This feature is currently being tested." + ), + "argparse_alias": "--save-async", + }, + ) + model_parallel_size: int = II("common.model_parallel_size") + + +@dataclass +class FairseqBMUFConfig(FairseqDataclass): + block_lr: float = field( + default=1, metadata={"help": "block learning rate for bmuf"} + ) + block_momentum: float = field( + default=0.875, metadata={"help": "block momentum for bmuf"} + ) + global_sync_iter: int = field( + default=50, metadata={"help": "Iteration for syncing global model"} + ) + warmup_iterations: int = field( + default=500, metadata={"help": "warmup iterations for model to broadcast"} + ) + use_nbm: bool = field( + default=False, + metadata={"help": "Specify whether you want to use classical BM / Nesterov BM"}, + ) + average_sync: bool = field( + default=False, + metadata={ + "help": "Specify whether you want to average the local momentum after each sync" + }, + ) + distributed_world_size: int = II("distributed_training.distributed_world_size") + + +@dataclass +class GenerationConfig(FairseqDataclass): + beam: int = field( + default=5, metadata={"help": "beam size"}, + ) + nbest: int = field( + default=1, metadata={"help": "number of hypotheses to output"}, + ) + max_len_a: float = field( + default=0, + metadata={ + "help": "generate sequences of maximum length ax + b, where x is the source length" + }, + ) + max_len_b: int = field( + default=200, + metadata={ + "help": "generate sequences of maximum length ax + b, where x is the source length" + }, + ) + min_len: int = field( + default=1, metadata={"help": "minimum generation length"}, + ) + match_source_len: bool = field( + default=False, metadata={"help": "generations should match the source length"}, + ) + unnormalized: bool = field( + default=False, metadata={"help": "compare unnormalized hypothesis scores"}, + ) + no_early_stop: bool = field( + default=False, metadata={"help": "deprecated"}, + ) + no_beamable_mm: bool = field( + default=False, metadata={"help": "don't use BeamableMM in attention layers"}, + ) + lenpen: float = field( + default=1, + metadata={ + "help": "length penalty: <1.0 favors shorter, >1.0 favors longer sentences" + }, + ) + unkpen: float = field( + default=0, + metadata={ + "help": "unknown word penalty: <0 produces more unks, >0 produces fewer" + }, + ) + replace_unk: Optional[str] = field( + default=None, + metadata={ + "help": "perform unknown replacement (optionally with alignment dictionary)", + "argparse_const": "@@ ", + }, + ) + sacrebleu: bool = field( + default=False, metadata={"help": "score with sacrebleu"}, + ) + score_reference: bool = field( + default=False, metadata={"help": "just score the reference translation"}, + ) + prefix_size: int = field( + default=0, + metadata={"help": "initialize generation by target prefix of given length"}, + ) + no_repeat_ngram_size: int = field( + default=0, + metadata={ + "help": "ngram blocking such that this size ngram cannot be repeated in the generation" + }, + ) + sampling: bool = field( + default=False, + metadata={"help": "sample hypotheses instead of using beam search"}, + ) + sampling_topk: int = field( + default=-1, + metadata={"help": "sample from top K likely next words instead of all words"}, + ) + sampling_topp: float = field( + default=-1.0, + metadata={ + "help": "sample from the smallest set whose cumulative probability mass exceeds p for next words" + }, + ) + constraints: Optional[GENERATION_CONSTRAINTS_CHOICES] = field( + default=None, + metadata={ + "help": "enables lexically constrained decoding", + "argparse_const": "ordered", + }, + ) + temperature: float = field( + default=1.0, metadata={"help": "temperature for generation"}, + ) + diverse_beam_groups: int = field( + default=-1, metadata={"help": "number of groups for Diverse Beam Search"}, + ) + diverse_beam_strength: float = field( + default=0.5, + metadata={"help": "strength of diversity penalty for Diverse Beam Search"}, + ) + diversity_rate: float = field( + default=-1.0, + metadata={"help": "strength of diversity penalty for Diverse Siblings Search"}, + ) + print_alignment: Optional[PRINT_ALIGNMENT_CHOICES] = field( + default=None, + metadata={ + "help": "if set, uses attention feedback to compute and print alignment to source tokens " + "(valid options are: hard, soft, otherwise treated as hard alignment)", + "argparse_const": "hard", + }, + ) + print_step: bool = field( + default=False, metadata={"help": "print steps"}, + ) + lm_path: Optional[str] = field( + default=None, metadata={"help": "path to lm checkpoint for lm fusion"}, + ) + lm_weight: float = field( + default=0.0, metadata={"help": "weight for lm probs for lm fusion"}, + ) + + # arguments for iterative refinement generator + iter_decode_eos_penalty: float = field( + default=0.0, + metadata={"help": "if > 0.0, it penalized early-stopping in decoding."}, + ) + iter_decode_max_iter: int = field( + default=10, metadata={"help": "maximum iterations for iterative refinement."}, + ) + iter_decode_force_max_iter: bool = field( + default=False, + metadata={ + "help": "if set, run exact the maximum number of iterations without early stop" + }, + ) + iter_decode_with_beam: int = field( + default=1, + metadata={ + "help": "if > 1, model will generate translations varying by the lengths." + }, + ) + iter_decode_with_external_reranker: bool = field( + default=False, + metadata={ + "help": "if set, the last checkpoint are assumed to be a reranker to rescore the translations" + }, + ) + retain_iter_history: bool = field( + default=False, + metadata={ + "help": "if set, decoding returns the whole history of iterative refinement" + }, + ) + retain_dropout: bool = field( + default=False, metadata={"help": "Use dropout at inference time"}, + ) + # temporarily set to Any until https://github.com/facebookresearch/hydra/issues/1117 is fixed + # retain_dropout_modules: Optional[List[str]] = field( + retain_dropout_modules: Any = field( + default=None, + metadata={ + "help": "if set, only retain dropout for the specified modules; " + "if not set, then dropout will be retained for all modules" + }, + ) + # special decoding format for advanced decoding. + decoding_format: Optional[GENERATION_DECODING_FORMAT_CHOICES] = field( + default=None, + metadata={"help": "special decoding format for advanced decoding."}, + ) + no_seed_provided: bool = field( + default=False, + metadata={"help": "if set, dont use seed for initializing random generators"}, + ) + + +@dataclass +class CommonEvalConfig(FairseqDataclass): + path: Optional[str] = field( + default=None, metadata={"help": "path(s) to model file(s), colon separated"}, + ) + post_process: Optional[str] = field( + default=None, + metadata={ + "help": ( + "post-process text by removing BPE, letter segmentation, etc. " + "Valid options can be found in fairseq.data.utils.post_process." + ), + "argparse_const": "subword_nmt", + "argparse_alias": "--remove-bpe", + }, + ) + quiet: bool = field(default=False, metadata={"help": "only print final scores"}) + model_overrides: str = field( + default="{}", + metadata={ + "help": "a dictionary used to override model args at generation that were used during model training" + }, + ) + results_path: Optional[str] = field( + default=None, metadata={"help": "path to save eval results (optional)"} + ) + + +@dataclass +class EvalLMConfig(FairseqDataclass): + output_word_probs: bool = field( + default=False, + metadata={ + "help": "if set, outputs words and their predicted log probabilities to standard output" + }, + ) + output_word_stats: bool = field( + default=False, + metadata={ + "help": "if set, outputs word statistics such as word count, average probability, etc" + }, + ) + context_window: int = field( + default=0, + metadata={ + "help": "ensures that every evaluated token has access to a context of at least this size, if possible" + }, + ) + softmax_batch: int = field( + default=sys.maxsize, + metadata={ + "help": "if BxT is more than this, will batch the softmax over vocab to this amount of tokens, in order to fit into GPU memory" + }, + ) + + +@dataclass +class InteractiveConfig(FairseqDataclass): + buffer_size: int = field( + default=0, + metadata={ + "help": "read this many sentences into a buffer before processing them" + }, + ) + input: str = field( + default="-", metadata={"help": "file to read from; use - for stdin"}, + ) + + +@dataclass +class FairseqConfig(FairseqDataclass): + common: CommonConfig = CommonConfig() + common_eval: CommonEvalConfig = CommonEvalConfig() + distributed_training: DistributedTrainingConfig = DistributedTrainingConfig() + dataset: DatasetConfig = DatasetConfig() + optimization: OptimizationConfig = OptimizationConfig() + checkpoint: CheckpointConfig = CheckpointConfig() + bmuf: FairseqBMUFConfig = FairseqBMUFConfig() + generation: GenerationConfig = GenerationConfig() + eval_lm: EvalLMConfig = EvalLMConfig() + interactive: InteractiveConfig = InteractiveConfig() + model: Any = MISSING + task: Any = None + criterion: Any = None + optimizer: Any = None + lr_scheduler: Any = None + scoring: Any = None + bpe: Any = None + tokenizer: Any = None diff --git a/SpeechT5/fairseq/fairseq/dataclass/constants.py b/SpeechT5/fairseq/fairseq/dataclass/constants.py new file mode 100644 index 0000000..442c259 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/dataclass/constants.py @@ -0,0 +1,54 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from enum import Enum, EnumMeta +from typing import List + + +class StrEnumMeta(EnumMeta): + # this is workaround for submitit pickling leading to instance checks failing in hydra for StrEnum, see + # https://github.com/facebookresearch/hydra/issues/1156 + @classmethod + def __instancecheck__(cls, other): + return "enum" in str(type(other)) + + +class StrEnum(Enum, metaclass=StrEnumMeta): + def __str__(self): + return self.value + + def __eq__(self, other: str): + return self.value == other + + def __repr__(self): + return self.value + + def __hash__(self): + return hash(str(self)) + + +def ChoiceEnum(choices: List[str]): + """return the Enum class used to enforce list of choices""" + return StrEnum("Choices", {k: k for k in choices}) + + +LOG_FORMAT_CHOICES = ChoiceEnum(["json", "none", "simple", "tqdm"]) +DDP_BACKEND_CHOICES = ChoiceEnum([ + "c10d", # alias for pytorch_ddp + "fully_sharded", # FullyShardedDataParallel from fairscale + "legacy_ddp", + "no_c10d", # alias for legacy_ddp + "pytorch_ddp", + "slow_mo", +]) +DDP_COMM_HOOK_CHOICES = ChoiceEnum(["none", "fp16"]) +DATASET_IMPL_CHOICES = ChoiceEnum(["raw", "lazy", "cached", "mmap", "fasta"]) +GENERATION_CONSTRAINTS_CHOICES = ChoiceEnum(["ordered", "unordered"]) +GENERATION_DECODING_FORMAT_CHOICES = ChoiceEnum( + ["unigram", "ensemble", "vote", "dp", "bs"] +) +ZERO_SHARDING_CHOICES = ChoiceEnum(["none", "os"]) +PIPELINE_CHECKPOINT_CHOICES = ChoiceEnum(["always", "never", "except_last"]) +PRINT_ALIGNMENT_CHOICES = ChoiceEnum(["hard", "soft"]) diff --git a/SpeechT5/fairseq/fairseq/dataclass/initialize.py b/SpeechT5/fairseq/fairseq/dataclass/initialize.py new file mode 100644 index 0000000..479aeb8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/dataclass/initialize.py @@ -0,0 +1,61 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import logging +from hydra.core.config_store import ConfigStore +from fairseq.dataclass.configs import FairseqConfig +from omegaconf import DictConfig, OmegaConf + + +logger = logging.getLogger(__name__) + + +def hydra_init(cfg_name="config") -> None: + + cs = ConfigStore.instance() + cs.store(name=cfg_name, node=FairseqConfig) + + for k in FairseqConfig.__dataclass_fields__: + v = FairseqConfig.__dataclass_fields__[k].default + try: + cs.store(name=k, node=v) + except BaseException: + logger.error(f"{k} - {v}") + raise + + +def add_defaults(cfg: DictConfig) -> None: + """This function adds default values that are stored in dataclasses that hydra doesn't know about """ + + from fairseq.registry import REGISTRIES + from fairseq.tasks import TASK_DATACLASS_REGISTRY + from fairseq.models import ARCH_MODEL_NAME_REGISTRY, MODEL_DATACLASS_REGISTRY + from fairseq.dataclass.utils import merge_with_parent + from typing import Any + + OmegaConf.set_struct(cfg, False) + + for k, v in FairseqConfig.__dataclass_fields__.items(): + field_cfg = cfg.get(k) + if field_cfg is not None and v.type == Any: + dc = None + + if isinstance(field_cfg, str): + field_cfg = DictConfig({"_name": field_cfg}) + field_cfg.__dict__["_parent"] = field_cfg.__dict__["_parent"] + + name = field_cfg.get("_name") + + if k == "task": + dc = TASK_DATACLASS_REGISTRY.get(name) + elif k == "model": + name = ARCH_MODEL_NAME_REGISTRY.get(name, name) + dc = MODEL_DATACLASS_REGISTRY.get(name) + elif k in REGISTRIES: + dc = REGISTRIES[k]["dataclass_registry"].get(name) + + if dc is not None: + cfg[k] = merge_with_parent(dc, field_cfg) diff --git a/SpeechT5/fairseq/fairseq/dataclass/utils.py b/SpeechT5/fairseq/fairseq/dataclass/utils.py new file mode 100644 index 0000000..8920612 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/dataclass/utils.py @@ -0,0 +1,476 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import ast +import inspect +import logging +import os +import re +from argparse import ArgumentError, ArgumentParser, Namespace +from dataclasses import _MISSING_TYPE, MISSING, is_dataclass +from enum import Enum +from typing import Any, Dict, List, Optional, Tuple, Type + +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.configs import FairseqConfig +from hydra.core.global_hydra import GlobalHydra +from hydra.experimental import compose, initialize +from omegaconf import DictConfig, OmegaConf, open_dict + +logger = logging.getLogger(__name__) + + +def eval_str_list(x, x_type=float): + if x is None: + return None + if isinstance(x, str): + if len(x) == 0: + return [] + x = ast.literal_eval(x) + try: + return list(map(x_type, x)) + except TypeError: + return [x_type(x)] + + +def interpret_dc_type(field_type): + if isinstance(field_type, str): + raise RuntimeError("field should be a type") + + if field_type == Any: + return str + + typestring = str(field_type) + if re.match( + r"(typing.|^)Union\[(.*), NoneType\]$", typestring + ) or typestring.startswith("typing.Optional"): + return field_type.__args__[0] + return field_type + + +def gen_parser_from_dataclass( + parser: ArgumentParser, + dataclass_instance: FairseqDataclass, + delete_default: bool = False, +) -> None: + """convert a dataclass instance to tailing parser arguments""" + + def argparse_name(name: str): + if name == "data": + # normally data is positional args + return name + if name == "_name": + # private member, skip + return None + return "--" + name.replace("_", "-") + + def get_kwargs_from_dc( + dataclass_instance: FairseqDataclass, k: str + ) -> Dict[str, Any]: + """k: dataclass attributes""" + + kwargs = {} + + field_type = dataclass_instance._get_type(k) + inter_type = interpret_dc_type(field_type) + + field_default = dataclass_instance._get_default(k) + + if isinstance(inter_type, type) and issubclass(inter_type, Enum): + field_choices = [t.value for t in list(inter_type)] + else: + field_choices = None + + field_help = dataclass_instance._get_help(k) + field_const = dataclass_instance._get_argparse_const(k) + + if isinstance(field_default, str) and field_default.startswith("${"): + kwargs["default"] = field_default + else: + if field_default is MISSING: + kwargs["required"] = True + if field_choices is not None: + kwargs["choices"] = field_choices + if ( + isinstance(inter_type, type) + and (issubclass(inter_type, List) or issubclass(inter_type, Tuple)) + ) or ("List" in str(inter_type) or "Tuple" in str(inter_type)): + if "int" in str(inter_type): + kwargs["type"] = lambda x: eval_str_list(x, int) + elif "float" in str(inter_type): + kwargs["type"] = lambda x: eval_str_list(x, float) + elif "str" in str(inter_type): + kwargs["type"] = lambda x: eval_str_list(x, str) + else: + raise NotImplementedError( + "parsing of type " + str(inter_type) + " is not implemented" + ) + if field_default is not MISSING: + kwargs["default"] = ( + ",".join(map(str, field_default)) + if field_default is not None + else None + ) + elif ( + isinstance(inter_type, type) and issubclass(inter_type, Enum) + ) or "Enum" in str(inter_type): + kwargs["type"] = str + if field_default is not MISSING: + if isinstance(field_default, Enum): + kwargs["default"] = field_default.value + else: + kwargs["default"] = field_default + elif inter_type is bool: + kwargs["action"] = ( + "store_false" if field_default is True else "store_true" + ) + kwargs["default"] = field_default + else: + kwargs["type"] = inter_type + if field_default is not MISSING: + kwargs["default"] = field_default + + kwargs["help"] = field_help + if field_const is not None: + kwargs["const"] = field_const + kwargs["nargs"] = "?" + + return kwargs + + for k in dataclass_instance._get_all_attributes(): + field_name = argparse_name(dataclass_instance._get_name(k)) + field_type = dataclass_instance._get_type(k) + if field_name is None: + continue + elif inspect.isclass(field_type) and issubclass(field_type, FairseqDataclass): + gen_parser_from_dataclass(parser, field_type(), delete_default) + continue + + kwargs = get_kwargs_from_dc(dataclass_instance, k) + + field_args = [field_name] + alias = dataclass_instance._get_argparse_alias(k) + if alias is not None: + field_args.append(alias) + + if "default" in kwargs: + if isinstance(kwargs["default"], str) and kwargs["default"].startswith( + "${" + ): + if kwargs["help"] is None: + # this is a field with a name that will be added elsewhere + continue + else: + del kwargs["default"] + if delete_default and "default" in kwargs: + del kwargs["default"] + try: + parser.add_argument(*field_args, **kwargs) + except ArgumentError: + pass + + +def _set_legacy_defaults(args, cls): + """Helper to set default arguments based on *add_args*.""" + if not hasattr(cls, "add_args"): + return + + import argparse + + parser = argparse.ArgumentParser( + argument_default=argparse.SUPPRESS, allow_abbrev=False + ) + cls.add_args(parser) + # copied from argparse.py: + defaults = argparse.Namespace() + for action in parser._actions: + if action.dest is not argparse.SUPPRESS: + if not hasattr(defaults, action.dest): + if action.default is not argparse.SUPPRESS: + setattr(defaults, action.dest, action.default) + for key, default_value in vars(defaults).items(): + if not hasattr(args, key): + setattr(args, key, default_value) + + +def _override_attr( + sub_node: str, data_class: Type[FairseqDataclass], args: Namespace +) -> List[str]: + overrides = [] + + if not inspect.isclass(data_class) or not issubclass(data_class, FairseqDataclass): + return overrides + + def get_default(f): + if not isinstance(f.default_factory, _MISSING_TYPE): + return f.default_factory() + return f.default + + for k, v in data_class.__dataclass_fields__.items(): + if k.startswith("_"): + # private member, skip + continue + + val = get_default(v) if not hasattr(args, k) else getattr(args, k) + + field_type = interpret_dc_type(v.type) + if ( + isinstance(val, str) + and not val.startswith("${") # not interpolation + and field_type != str + and ( + not inspect.isclass(field_type) or not issubclass(field_type, Enum) + ) # not choices enum + ): + # upgrade old models that stored complex parameters as string + val = ast.literal_eval(val) + + if isinstance(val, tuple): + val = list(val) + + v_type = getattr(v.type, "__origin__", None) + if ( + (v_type is List or v_type is list or v_type is Optional) + # skip interpolation + and not (isinstance(val, str) and val.startswith("${")) + ): + # if type is int but val is float, then we will crash later - try to convert here + if hasattr(v.type, "__args__"): + t_args = v.type.__args__ + if len(t_args) == 1 and (t_args[0] is float or t_args[0] is int): + val = list(map(t_args[0], val)) + elif val is not None and ( + field_type is int or field_type is bool or field_type is float + ): + try: + val = field_type(val) + except: + pass # ignore errors here, they are often from interpolation args + + if val is None: + overrides.append("{}.{}=null".format(sub_node, k)) + elif val == "": + overrides.append("{}.{}=''".format(sub_node, k)) + elif isinstance(val, str): + val = val.replace("'", r"\'") + overrides.append("{}.{}='{}'".format(sub_node, k, val)) + elif isinstance(val, FairseqDataclass): + overrides += _override_attr(f"{sub_node}.{k}", type(val), args) + elif isinstance(val, Namespace): + sub_overrides, _ = override_module_args(val) + for so in sub_overrides: + overrides.append(f"{sub_node}.{k}.{so}") + else: + overrides.append("{}.{}={}".format(sub_node, k, val)) + + return overrides + + +def migrate_registry( + name, value, registry, args, overrides, deletes, use_name_as_val=False +): + if value in registry: + overrides.append("{}={}".format(name, value)) + overrides.append("{}._name={}".format(name, value)) + overrides.extend(_override_attr(name, registry[value], args)) + elif use_name_as_val and value is not None: + overrides.append("{}={}".format(name, value)) + else: + deletes.append(name) + + +def override_module_args(args: Namespace) -> Tuple[List[str], List[str]]: + """use the field in args to overrides those in cfg""" + overrides = [] + deletes = [] + + for k in FairseqConfig.__dataclass_fields__.keys(): + overrides.extend( + _override_attr(k, FairseqConfig.__dataclass_fields__[k].type, args) + ) + + if args is not None: + if hasattr(args, "task"): + from fairseq.tasks import TASK_DATACLASS_REGISTRY + + migrate_registry( + "task", args.task, TASK_DATACLASS_REGISTRY, args, overrides, deletes + ) + else: + deletes.append("task") + + # these options will be set to "None" if they have not yet been migrated + # so we can populate them with the entire flat args + CORE_REGISTRIES = {"criterion", "optimizer", "lr_scheduler"} + + from fairseq.registry import REGISTRIES + + for k, v in REGISTRIES.items(): + if hasattr(args, k): + migrate_registry( + k, + getattr(args, k), + v["dataclass_registry"], + args, + overrides, + deletes, + use_name_as_val=k not in CORE_REGISTRIES, + ) + else: + deletes.append(k) + + no_dc = True + if hasattr(args, "arch"): + from fairseq.models import ARCH_MODEL_REGISTRY, ARCH_MODEL_NAME_REGISTRY + + if args.arch in ARCH_MODEL_REGISTRY: + m_cls = ARCH_MODEL_REGISTRY[args.arch] + dc = getattr(m_cls, "__dataclass", None) + if dc is not None: + m_name = ARCH_MODEL_NAME_REGISTRY[args.arch] + overrides.append("model={}".format(m_name)) + overrides.append("model._name={}".format(args.arch)) + # override model params with those exist in args + overrides.extend(_override_attr("model", dc, args)) + no_dc = False + if no_dc: + deletes.append("model") + + return overrides, deletes + + +def convert_namespace_to_omegaconf(args: Namespace) -> DictConfig: + """Convert a flat argparse.Namespace to a structured DictConfig.""" + + # Here we are using field values provided in args to override counterparts inside config object + overrides, deletes = override_module_args(args) + + # configs will be in fairseq/config after installation + config_path = os.path.join("..", "config") + + GlobalHydra.instance().clear() + + with initialize(config_path=config_path): + try: + composed_cfg = compose("config", overrides=overrides, strict=False) + except: + logger.error("Error when composing. Overrides: " + str(overrides)) + raise + + for k in deletes: + composed_cfg[k] = None + + cfg = OmegaConf.create( + OmegaConf.to_container(composed_cfg, resolve=True, enum_to_str=True) + ) + + # hack to be able to set Namespace in dict config. this should be removed when we update to newer + # omegaconf version that supports object flags, or when we migrate all existing models + from omegaconf import _utils + + old_primitive = _utils.is_primitive_type + _utils.is_primitive_type = lambda _: True + + if cfg.task is None and getattr(args, "task", None): + cfg.task = Namespace(**vars(args)) + from fairseq.tasks import TASK_REGISTRY + + _set_legacy_defaults(cfg.task, TASK_REGISTRY[args.task]) + cfg.task._name = args.task + if cfg.model is None and getattr(args, "arch", None): + cfg.model = Namespace(**vars(args)) + from fairseq.models import ARCH_MODEL_REGISTRY + + _set_legacy_defaults(cfg.model, ARCH_MODEL_REGISTRY[args.arch]) + cfg.model._name = args.arch + if cfg.optimizer is None and getattr(args, "optimizer", None): + cfg.optimizer = Namespace(**vars(args)) + from fairseq.optim import OPTIMIZER_REGISTRY + + _set_legacy_defaults(cfg.optimizer, OPTIMIZER_REGISTRY[args.optimizer]) + cfg.optimizer._name = args.optimizer + if cfg.lr_scheduler is None and getattr(args, "lr_scheduler", None): + cfg.lr_scheduler = Namespace(**vars(args)) + from fairseq.optim.lr_scheduler import LR_SCHEDULER_REGISTRY + + _set_legacy_defaults(cfg.lr_scheduler, LR_SCHEDULER_REGISTRY[args.lr_scheduler]) + cfg.lr_scheduler._name = args.lr_scheduler + if cfg.criterion is None and getattr(args, "criterion", None): + cfg.criterion = Namespace(**vars(args)) + from fairseq.criterions import CRITERION_REGISTRY + + _set_legacy_defaults(cfg.criterion, CRITERION_REGISTRY[args.criterion]) + cfg.criterion._name = args.criterion + + _utils.is_primitive_type = old_primitive + OmegaConf.set_struct(cfg, True) + return cfg + + +def populate_dataclass( + dataclass: FairseqDataclass, + args: Namespace, +) -> FairseqDataclass: + for k in dataclass.__dataclass_fields__.keys(): + if k.startswith("_"): + # private member, skip + continue + if hasattr(args, k): + setattr(dataclass, k, getattr(args, k)) + + return dataclass + + +def overwrite_args_by_name(cfg: DictConfig, overrides: Dict[str, any]): + # this will be deprecated when we get rid of argparse and model_overrides logic + + from fairseq.registry import REGISTRIES + + with open_dict(cfg): + for k in cfg.keys(): + # "k in cfg" will return false if its a "mandatory value (e.g. ???)" + if k in cfg and isinstance(cfg[k], DictConfig): + if k in overrides and isinstance(overrides[k], dict): + for ok, ov in overrides[k].items(): + if isinstance(ov, dict) and cfg[k][ok] is not None: + overwrite_args_by_name(cfg[k][ok], ov) + else: + cfg[k][ok] = ov + else: + overwrite_args_by_name(cfg[k], overrides) + elif k in cfg and isinstance(cfg[k], Namespace): + for override_key, val in overrides.items(): + setattr(cfg[k], override_key, val) + elif k in overrides: + if ( + k in REGISTRIES + and overrides[k] in REGISTRIES[k]["dataclass_registry"] + ): + cfg[k] = DictConfig( + REGISTRIES[k]["dataclass_registry"][overrides[k]] + ) + overwrite_args_by_name(cfg[k], overrides) + cfg[k]._name = overrides[k] + else: + cfg[k] = overrides[k] + + +def merge_with_parent(dc: FairseqDataclass, cfg: DictConfig, remove_missing=True): + if remove_missing: + + if is_dataclass(dc): + target_keys = set(dc.__dataclass_fields__.keys()) + else: + target_keys = set(dc.keys()) + + with open_dict(cfg): + for k in list(cfg.keys()): + if k not in target_keys: + del cfg[k] + + merged_cfg = OmegaConf.merge(dc, cfg) + merged_cfg.__dict__["_parent"] = cfg.__dict__["_parent"] + OmegaConf.set_struct(merged_cfg, True) + return merged_cfg diff --git a/SpeechT5/fairseq/fairseq/distributed/__init__.py b/SpeechT5/fairseq/fairseq/distributed/__init__.py new file mode 100644 index 0000000..d0b96b7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/distributed/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .distributed_timeout_wrapper import DistributedTimeoutWrapper +from .fully_sharded_data_parallel import fsdp_enable_wrap, fsdp_wrap, FullyShardedDataParallel +from .legacy_distributed_data_parallel import LegacyDistributedDataParallel +from .module_proxy_wrapper import ModuleProxyWrapper +from .tpu_distributed_data_parallel import TPUDistributedDataParallel + + +__all__ = [ + "DistributedTimeoutWrapper", + "fsdp_enable_wrap", + "fsdp_wrap", + "FullyShardedDataParallel", + "LegacyDistributedDataParallel", + "ModuleProxyWrapper", + "TPUDistributedDataParallel", +] diff --git a/SpeechT5/fairseq/fairseq/distributed/distributed_timeout_wrapper.py b/SpeechT5/fairseq/fairseq/distributed/distributed_timeout_wrapper.py new file mode 100644 index 0000000..18107ef --- /dev/null +++ b/SpeechT5/fairseq/fairseq/distributed/distributed_timeout_wrapper.py @@ -0,0 +1,94 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import signal +import threading + +from torch import nn + + +logger = logging.getLogger(__name__) + + +class DistributedTimeoutWrapper(nn.Module): + """ + A wrapper that kills the process if no progress is made within a given + *timeout*. The timer is reset every time :func:`forward` is called. + + Usage:: + + module = DistributedTimeoutWrapper(module, timeout=30) + x = module(input) + time.sleep(20) # safe + x = module(input) + time.sleep(45) # job will be killed before this returns + + Args: + module (nn.Module): module to wrap + timeout (int): number of seconds before killing the process + (set to a value <= 0 to disable the timeout) + signal (Optional): signal to send once timeout is triggered + """ + def __init__(self, module: nn.Module, timeout: int, signal=signal.SIGINT): + super().__init__() + self.module = module + self.timeout = timeout + self.signal = signal + + if timeout > 0: + self._heartbeat = threading.Event() + self._heartbeat_thread = threading.Thread( + target=self._check_heartbeat, + args=(os.getpid(),), + daemon=True, + ) + self._heartbeat_thread.start() + self._terminated = False + else: + self._heartbeat = None + self._heartbeat_thread = None + + def __del__(self): + self.stop_timeout() + + def __getattr__(self, name): + """Forward missing attributes to wrapped module.""" + try: + return super().__getattr__(name) # defer to nn.Module's logic + except AttributeError: + return getattr(self.module, name) + + def stop_timeout(self): + if self._heartbeat_thread is not None: + self._terminated = True + self._heartbeat_thread.join() + + def state_dict(self, *args, **kwargs): + return self.module.state_dict(*args, **kwargs) + + def load_state_dict(self, *args, **kwargs): + return self.module.load_state_dict(*args, **kwargs) + + def forward(self, *args, **kwargs): + if self._heartbeat is not None: + self._heartbeat.set() + return self.module(*args, **kwargs) + + def _check_heartbeat(self, parent_pid): + self._heartbeat.wait() # wait for the first forward pass + while True: + self._heartbeat.clear() + success = self._heartbeat.wait(timeout=self.timeout) + if self._terminated: + break + elif not success: + logger.error(( + "Killing job for not making progress in {} seconds. " + "Set --heartbeat-timeout=-1 to disable this timeout." + ).format(int(self.timeout))) + os.kill(parent_pid, self.signal) + return diff --git a/SpeechT5/fairseq/fairseq/distributed/fully_sharded_data_parallel.py b/SpeechT5/fairseq/fairseq/distributed/fully_sharded_data_parallel.py new file mode 100644 index 0000000..8a96bfc --- /dev/null +++ b/SpeechT5/fairseq/fairseq/distributed/fully_sharded_data_parallel.py @@ -0,0 +1,135 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +from typing import Optional + +import torch +from fairseq.dataclass.configs import DistributedTrainingConfig +from fairseq.distributed import utils as dist_utils + + +try: + from fairscale.nn.data_parallel import FullyShardedDataParallel as FSDP + + has_FSDP = True +except ImportError: + FSDP = torch.nn.Module + has_FSDP = False + + +class FullyShardedDataParallel(FSDP): + """ + A small wrapper around fairscale's FullyShardedDataParallel (FSDP) with some + fairseq-specific checkpoint saving/loading logic. + + Args: + use_sharded_state (bool): if True, then ``state_dict`` will return + ``FSDP.local_state_dict`` and ``load_state_dict`` will call + ``FSDP.load_local_state_dict``. Otherwise, ``state_dict`` will + return the full model weights on data parallel rank 0 (empty on + other ranks) and ``load_state_dict`` will broadcast model weights + from rank 0 to other ranks. + """ + + def __init__(self, *args, use_sharded_state: bool = False, **kwargs): + if not has_FSDP: + raise ImportError( + "Cannot find FullyShardedDataParallel. " + "Please install fairscale with: pip install fairscale" + ) + super().__init__(*args, **kwargs) + self.use_sharded_state = use_sharded_state + + @property + def unwrapped_module(self) -> torch.nn.Module: + if self.flatten_parameters: + return self.module.module + else: + return self.module + + def state_dict(self, destination=None, prefix="", keep_vars=False): + if self.use_sharded_state: + return super().local_state_dict( + destination=destination, prefix=prefix, keep_vars=keep_vars + ) + else: + if self.rank == 0: + return super().state_dict( + destination=destination, prefix=prefix, keep_vars=keep_vars + ) + else: + # We must call state_dict() due to use of communication + # primitives. But we don't use the result. + super().state_dict() + return destination or {} + + def load_state_dict(self, state_dict, strict=True, model_cfg=None): + if self.use_sharded_state: + return super().load_local_state_dict(state_dict, strict=strict) + else: + state_dict = dist_utils.broadcast_object( + state_dict, src_rank=0, group=self.process_group + ) + return super().load_state_dict(state_dict, strict=strict) + + +@contextlib.contextmanager +def fsdp_enable_wrap(cfg: DistributedTrainingConfig): + try: + from fairscale.nn import enable_wrap + except ImportError: + raise ImportError( + "Cannot find FullyShardedDataParallel. " + "Please install fairscale with: pip install fairscale" + ) + if cfg.memory_efficient_fp16: + assert cfg.fp16 # memory_efficient_fp16 should imply fp16 + group = dist_utils.get_data_parallel_group() + if group is None and cfg.distributed_world_size == 1: + from fairscale.utils.testing import DummyProcessGroup + + group = DummyProcessGroup(rank=0, size=1) + fsdp_config = { + "process_group": group, + "reshard_after_forward": not cfg.no_reshard_after_forward, + "mixed_precision": cfg.fp16 and not cfg.memory_efficient_fp16, + "fp32_reduce_scatter": cfg.fp32_reduce_scatter, + "flatten_parameters": True, + "cpu_offload": cfg.cpu_offload, + "compute_dtype": torch.float16 if cfg.fp16 else torch.float32, + "bucket_cap_mb": cfg.bucket_cap_mb, + "state_dict_device": torch.device("cpu"), # reduce GPU mem usage + } + with enable_wrap( + wrapper_cls=FullyShardedDataParallel, + use_sharded_state=cfg.use_sharded_state, + **fsdp_config, + ): + yield + + +def fsdp_wrap(module, min_num_params: Optional[int] = None, **kwargs): + """ + Helper to wrap layers/modules in FSDP. This falls back to a no-op if + fairscale is not available. + + Args: + module (nn.Module): module to (maybe) wrap + min_num_params (int, Optional): minimum number of layer params to wrap + """ + try: + from fairscale.nn import wrap + + if min_num_params is not None: + num_params = sum(p.numel() for p in module.parameters()) + if num_params >= min_num_params: + return wrap(module, **kwargs) + else: + return module + else: + return wrap(module, **kwargs) + except ImportError: + return module diff --git a/SpeechT5/fairseq/fairseq/distributed/legacy_distributed_data_parallel.py b/SpeechT5/fairseq/fairseq/distributed/legacy_distributed_data_parallel.py new file mode 100644 index 0000000..f2308f8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/distributed/legacy_distributed_data_parallel.py @@ -0,0 +1,165 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +A modified version of the legacy DistributedDataParallel module that uses c10d +communication primitives. This version is simpler than the latest PyTorch +version and is useful for debugging. Notably it does not overlap gradient +communication with the backward pass, which makes it slower but more robust +than the PyTorch version. + +This version also supports the *no_sync* context manager, which allows faster +training with `--update-freq`. +""" + +from collections import OrderedDict +from contextlib import contextmanager + +import torch +from torch import nn + +from fairseq.distributed import utils + + +class LegacyDistributedDataParallel(nn.Module): + """Implements distributed data parallelism at the module level. + + A simplified version of :class:`torch.nn.parallel.DistributedDataParallel`. + This version uses a c10d process group for communication and does not + broadcast buffers. + + Args: + module (~torch.nn.Module): module to be parallelized + process_group: the c10d process group to be used for distributed data + parallel all-reduction. + buffer_size (int, optional): number of elements to buffer before + performing all-reduce (default: 256M). + """ + + def __init__(self, module, process_group, buffer_size=2 ** 28): + super().__init__() + + self.module = module + self.process_group = process_group + self.world_size = utils.get_world_size(self.process_group) + + # Never use a bigger buffer than the number of model params + self.buffer_size = min(buffer_size, sum(p.numel() for p in module.parameters())) + self.buffer = None + + # We can also forcibly accumulate grads locally and only do the + # all-reduce at some later time + self.accumulate_grads = False + + # make per-device lists of parameters + paramlists = OrderedDict() + for param in self.module.parameters(): + device = param.device + if paramlists.get(device) is None: + paramlists[device] = [] + paramlists[device] += [param] + self.per_device_params = list(paramlists.values()) + + @contextmanager + def no_sync(self): + """A context manager to disable gradient synchronization.""" + old_accumulate_grads = self.accumulate_grads + self.accumulate_grads = True + yield + self.accumulate_grads = old_accumulate_grads + + def forward(self, *inputs, **kwargs): + return self.module(*inputs, **kwargs) + + def all_reduce_grads(self): + """ + This function must be called explicitly after backward to reduce + gradients. There is no automatic hook like c10d. + """ + + def all_reduce_params(params): + buffer = self.buffer + nonzero_buffer = False + if len(params) > 1: + offset = 0 + for p in params: + sz = p.numel() + if p.grad is not None: + buffer[offset : offset + sz].copy_(p.grad.data.view(-1)) + nonzero_buffer = True + else: + buffer[offset : offset + sz].zero_() + offset += sz + else: + # we only have a single grad to all-reduce + p = params[0] + if p.grad is not None: + buffer = p.grad.data + nonzero_buffer = True + elif p.numel() <= self.buffer.numel(): + buffer = buffer[: p.numel()] + buffer.zero_() + else: + buffer = torch.zeros_like(p) + + if nonzero_buffer: + buffer.div_(self.world_size) + + utils.all_reduce(buffer, self.process_group) + + # copy all-reduced grads back into their original place + offset = 0 + for p in params: + sz = p.numel() + if p.grad is not None: + p.grad.data.copy_(buffer[offset : offset + sz].view_as(p)) + else: + p.grad = buffer[offset : offset + sz].view_as(p).clone() + offset += sz + + def reduction_fn(): + # This function only needs to be called once + if self.accumulate_grads: + return + + if self.buffer is None: + self.buffer = next(self.module.parameters()).new(self.buffer_size) + + for params in self.per_device_params: + # All-reduce the gradients in buckets + offset = 0 + buffered_params = [] + for param in params: + if not param.requires_grad: + continue + if param.grad is None: + param.grad = torch.zeros_like(param) + + if hasattr(param, 'expert'): + # Skip gradient sync for unshared parameters + continue + + if param.grad.requires_grad: + raise RuntimeError( + "DistributedDataParallel only works " + "with gradients that don't require " + "grad" + ) + sz = param.numel() + if sz > self.buffer.numel(): + # all-reduce big params directly + all_reduce_params([param]) + else: + if offset + sz > self.buffer.numel(): + all_reduce_params(buffered_params) + offset = 0 + buffered_params.clear() + buffered_params.append(param) + offset += sz + + if len(buffered_params) > 0: + all_reduce_params(buffered_params) + + reduction_fn() diff --git a/SpeechT5/fairseq/fairseq/distributed/module_proxy_wrapper.py b/SpeechT5/fairseq/fairseq/distributed/module_proxy_wrapper.py new file mode 100644 index 0000000..fc2c6f8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/distributed/module_proxy_wrapper.py @@ -0,0 +1,55 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from torch import nn + + +class ModuleProxyWrapper(nn.Module): + """ + Wrap a DistributedDataParallel module and forward requests for missing + attributes to the module wrapped by DDP (the twice-wrapped module). + Also forward calls to :func:`state_dict` and :func:`load_state_dict`. + + Usage:: + + module.xyz = "hello world" + wrapped_module = DistributedDataParallel(module, **ddp_args) + wrapped_module = ModuleProxyWrapper(wrapped_module) + assert wrapped_module.xyz == "hello world" + assert wrapped_module.state_dict().keys() == module.state_dict().keys() + + Args: + module (nn.Module): module to wrap + """ + + def __init__(self, module: nn.Module): + super().__init__() + assert hasattr(module, "module"), \ + "ModuleProxyWrapper expects input to wrap another module" + self.module = module + + def __getattr__(self, name): + """Forward missing attributes to twice-wrapped module.""" + try: + # defer to nn.Module's logic + return super().__getattr__(name) + except AttributeError: + try: + # forward to the once-wrapped module + return getattr(self.module, name) + except AttributeError: + # forward to the twice-wrapped module + return getattr(self.module.module, name) + + def state_dict(self, *args, **kwargs): + """Forward to the twice-wrapped module.""" + return self.module.module.state_dict(*args, **kwargs) + + def load_state_dict(self, *args, **kwargs): + """Forward to the twice-wrapped module.""" + return self.module.module.load_state_dict(*args, **kwargs) + + def forward(self, *args, **kwargs): + return self.module(*args, **kwargs) diff --git a/SpeechT5/fairseq/fairseq/distributed/tpu_distributed_data_parallel.py b/SpeechT5/fairseq/fairseq/distributed/tpu_distributed_data_parallel.py new file mode 100644 index 0000000..e971cf0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/distributed/tpu_distributed_data_parallel.py @@ -0,0 +1,43 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from torch import nn + +from fairseq.distributed import utils + + +class TPUDistributedDataParallel(nn.Module): + + def __init__(self, module, process_group): + super().__init__() + self.module = module + self.process_group = process_group + self.world_size = utils.get_world_size(self.process_group) + + def forward(self, *inputs, **kwargs): + return self.module(*inputs, **kwargs) + + def all_reduce_grads(self): + gradients = [] + for p in self.parameters(): + if not p.requires_grad: + continue + if p.grad is None: + p.grad = torch.zeros_like(p) + if p.grad.requires_grad: + raise RuntimeError( + "TPUDistributedDataParallel only works with gradients that don't " + "require grad" + ) + gradients.append(p.grad) + + import torch_xla.core.xla_model as xm + xm.all_reduce( + 'sum', + gradients, + scale=1. / self.world_size, + groups=self.process_group[1], + ) diff --git a/SpeechT5/fairseq/fairseq/distributed/utils.py b/SpeechT5/fairseq/fairseq/distributed/utils.py new file mode 100644 index 0000000..b773611 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/distributed/utils.py @@ -0,0 +1,805 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import io +import logging +import os +import pickle +import random +import socket +import struct +import subprocess +import warnings +from argparse import Namespace +from collections import OrderedDict +from dataclasses import dataclass +from typing import Any, Dict, List, Mapping, Optional + +import torch +import torch.distributed as dist +from fairseq.dataclass.configs import DistributedTrainingConfig, FairseqConfig +from omegaconf import open_dict + +try: + import torch_xla.core.xla_model as xm +except ImportError: + xm = None + + +# Flag to indicate if we're using Megatron +# NOTE: this is a temporary hack until we move away from Megatron's model parallel init +_USE_MEGATRON = False + +# Whether to use XLA ops (e.g., on TPUs) instead of CUDA ops. +_USE_XLA = False + + +logger = logging.getLogger(__name__) + + +def is_master(cfg: DistributedTrainingConfig): + return cfg.distributed_rank == 0 + + +def infer_init_method(cfg: DistributedTrainingConfig, force_distributed=False): + if cfg.distributed_init_method is not None or cfg.tpu: + return + + num_pipelines_per_node = None + if cfg.pipeline_model_parallel: + num_pipeline_devices, num_pipelines_per_node = _pipeline_parallel_pre_init(cfg) + + if all( + key in os.environ + for key in ["MASTER_ADDR", "MASTER_PORT", "WORLD_SIZE", "RANK"] + ): + # support torch.distributed.launch + _infer_torch_distributed_launch_init(cfg) + elif cfg.distributed_port > 0: + # we can determine the init method automatically for Slurm + _infer_slurm_init(cfg, num_pipelines_per_node) + elif cfg.distributed_world_size > 1 or force_distributed: + # fallback for single node with multiple GPUs + _infer_single_node_init(cfg) + + if cfg.pipeline_model_parallel: + _pipeline_parallel_post_init(cfg, num_pipeline_devices, num_pipelines_per_node) + elif not cfg.distributed_no_spawn: + with open_dict(cfg): + cfg.distributed_num_procs = min( + torch.cuda.device_count(), cfg.distributed_world_size + ) + + +def _infer_torch_distributed_launch_init(cfg: DistributedTrainingConfig): + cfg.distributed_init_method = "env://" + cfg.distributed_world_size = int(os.environ["WORLD_SIZE"]) + cfg.distributed_rank = int(os.environ["RANK"]) + # processes are created by torch.distributed.launch + cfg.distributed_no_spawn = True + + +def _infer_slurm_init(cfg: DistributedTrainingConfig, num_pipelines_per_node): + node_list = os.environ.get("SLURM_STEP_NODELIST") + if node_list is None: + node_list = os.environ.get("SLURM_JOB_NODELIST") + if node_list is not None: + try: + hostnames = subprocess.check_output( + ["scontrol", "show", "hostnames", node_list] + ) + cfg.distributed_init_method = "tcp://{host}:{port}".format( + host=hostnames.split()[0].decode("utf-8"), + port=cfg.distributed_port, + ) + nnodes = int(os.environ.get("SLURM_NNODES")) + ntasks_per_node = os.environ.get("SLURM_NTASKS_PER_NODE") + if ntasks_per_node is not None: + ntasks_per_node = int(ntasks_per_node) + else: + ntasks = int(os.environ.get("SLURM_NTASKS")) + nnodes = int(os.environ.get("SLURM_NNODES")) + assert ntasks % nnodes == 0 + ntasks_per_node = int(ntasks / nnodes) + if ntasks_per_node == 1: + gpus_per_node = torch.cuda.device_count() + node_id = int(os.environ.get("SLURM_NODEID")) + cfg.distributed_rank = node_id * gpus_per_node + cfg.distributed_world_size = nnodes * gpus_per_node + elif cfg.pipeline_model_parallel: + assert ntasks_per_node == num_pipelines_per_node, ( + "SLURM --ntasks-per-node must match number of pipelines per " + "node (={})".format(num_pipelines_per_node) + ) + cfg.distributed_no_spawn = True + # For 4-way MP on nodes with 8 GPUs, ranks will be [0, 1] on + # the first node, [1, 2] on the second node, etc. This + # matches torch.distributed.launch. + node_id = int(os.environ.get("SLURM_NODEID")) + local_id = int(os.environ.get("SLURM_LOCALID")) + cfg.distributed_rank = node_id * num_pipelines_per_node + local_id + # In the above example, device_id will always be in [0, 1], + # which also matches torch.distributed.launch. + cfg.device_id = local_id + # We also want to set distributed_world_size to be the total + # number of pipelines across all nodes. + cfg.distributed_world_size = nnodes * num_pipelines_per_node + else: + assert ntasks_per_node == cfg.distributed_world_size // nnodes + cfg.distributed_no_spawn = True + cfg.distributed_rank = int(os.environ.get("SLURM_PROCID")) + cfg.device_id = int(os.environ.get("SLURM_LOCALID")) + except subprocess.CalledProcessError as e: # scontrol failed + raise e + except FileNotFoundError: # Slurm is not installed + pass + + +def _infer_single_node_init(cfg: DistributedTrainingConfig): + assert ( + cfg.distributed_world_size <= torch.cuda.device_count() + ), f"world size is {cfg.distributed_world_size} but have {torch.cuda.device_count()} available devices" + port = random.randint(10000, 20000) + cfg.distributed_init_method = "tcp://localhost:{port}".format(port=port) + + +def _pipeline_parallel_pre_init(cfg: DistributedTrainingConfig): + from fairseq import utils + + balance_exists = ( + cfg.pipeline_balance is not None + or cfg.pipeline_encoder_balance is not None + or cfg.pipeline_decoder_balance is not None + ) + devices_exist = ( + cfg.pipeline_devices is not None + or cfg.pipeline_encoder_devices is not None + or cfg.pipeline_decoder_devices is not None + ) + if not balance_exists: + raise ValueError( + "--pipeline-balance is currently required for pipeline model parallelism" + ) + if not devices_exist: + raise ValueError( + "--pipeline-devices is currently required for pipeline model parallelism" + ) + + cfg.pipeline_balance = utils.eval_str_list(cfg.pipeline_balance, type=int) + if cfg.pipeline_devices is not None: + cfg.pipeline_devices = utils.eval_str_list(cfg.pipeline_devices, type=int) + num_pipeline_devices = len(set(cfg.pipeline_devices)) + else: + cfg.pipeline_encoder_devices = utils.eval_str_list( + cfg.pipeline_encoder_devices, type=int + ) + cfg.pipeline_decoder_devices = utils.eval_str_list( + cfg.pipeline_decoder_devices, type=int + ) + num_pipeline_devices = len( + set(cfg.pipeline_encoder_devices + cfg.pipeline_decoder_devices) + ) + gpus_per_node = torch.cuda.device_count() + assert ( + gpus_per_node >= num_pipeline_devices + and gpus_per_node % num_pipeline_devices == 0 + ), ( + "the number of unique device IDs in --pipeline-devices must evenly divide " + "the number of GPUs per node (multi-node pipelining is not yet supported)" + ) + num_pipelines_per_node = gpus_per_node // num_pipeline_devices + return num_pipeline_devices, num_pipelines_per_node + + +def _pipeline_parallel_post_init( + cfg: DistributedTrainingConfig, num_pipeline_devices, num_pipelines_per_node +): + if not cfg.distributed_no_spawn: + # When distributed_no_spawn is False, we expect distributed_rank and + # distributed_world_size to be based on the total number of GPUs, so + # we need to correct them to be based on the number of pipelines. + assert cfg.distributed_world_size % num_pipeline_devices == 0 + cfg.distributed_world_size = ( + cfg.distributed_world_size // num_pipeline_devices + ) + # In the case of 4-way MP on nodes with 8 GPUs, we want + # distributed_rank to be the starting GPU index for each pipeline + # i.e., 0, 2, ... + gpus_per_node = torch.cuda.device_count() + assert cfg.distributed_rank % gpus_per_node == 0 + assert cfg.distributed_rank % num_pipeline_devices == 0 + + with open_dict(cfg): + cfg.distributed_rank = cfg.distributed_rank // num_pipeline_devices + # launch one process per pipeline + cfg.distributed_num_procs = num_pipelines_per_node + + # if we have 4-way MP on a node with 8 GPUs, we want device_ids to be 0 + # and 4, indicating the starting device IDs for each pipeline + cfg.device_id *= num_pipeline_devices + + if cfg.device_id > 0: + # if there's multiple pipelines on a node (e.g., 4-way MP on an 8 + # GPU node), we need to adjust pipeline_devices accordingly + logger.debug( + "setting CUDA device={} on rank {}".format( + cfg.device_id, cfg.distributed_rank + ) + ) + torch.cuda.set_device(cfg.device_id) + with open_dict(cfg): + cfg.pipeline_devices = [cfg.device_id + d for d in cfg.pipeline_devices] + logger.info( + "setting pipeline_devices={} on rank {}".format( + cfg.pipeline_devices, cfg.distributed_rank + ) + ) + + +def distributed_init(cfg: FairseqConfig): + if isinstance(cfg, Namespace): + from fairseq.dataclass.utils import convert_namespace_to_omegaconf + + cfg = convert_namespace_to_omegaconf(cfg) + + if not cfg.common.tpu: + if torch.distributed.is_available() and torch.distributed.is_initialized(): + warnings.warn( + "Distributed is already initialized, cannot initialize twice!" + ) + else: + logger.info( + "distributed init (rank {}): {}".format( + cfg.distributed_training.distributed_rank, + cfg.distributed_training.distributed_init_method, + ) + ) + dist.init_process_group( + backend=cfg.distributed_training.distributed_backend, + init_method=cfg.distributed_training.distributed_init_method, + world_size=cfg.distributed_training.distributed_world_size, + rank=cfg.distributed_training.distributed_rank, + ) + logger.info( + "initialized host {} as rank {}".format( + socket.gethostname(), + cfg.distributed_training.distributed_rank, + ) + ) + + # perform a dummy all-reduce to initialize the NCCL communicator + if torch.cuda.is_available(): + dist.all_reduce(torch.zeros(1).cuda()) + + cfg.distributed_training.distributed_rank = torch.distributed.get_rank() + else: + assert xm.xrt_world_size() == cfg.distributed_training.distributed_world_size + global _USE_XLA + _USE_XLA = True + cfg.distributed_training.device_id = xm.get_local_ordinal() + cfg.distributed_training.distributed_rank = xm.get_ordinal() + xm.rendezvous("distributed_init") # wait for all workers + + if is_master(cfg.distributed_training): + logging.getLogger().setLevel(logging.INFO) + else: + logging.getLogger().setLevel(logging.WARNING) + + if cfg.common.model_parallel_size > 1: + try: + from fairseq.model_parallel.megatron.mpu import ( + initialize_model_parallel, + model_parallel_cuda_manual_seed, + ) + except ImportError: + raise ImportError( + "\n\nPlease install the megatron submodule:" + "\n\n git submodule update --init " + "fairseq/model_parallel/megatron" + ) + global _USE_MEGATRON + _USE_MEGATRON = True + initialize_model_parallel(cfg.common.model_parallel_size) + model_parallel_cuda_manual_seed(cfg.common.seed) + model_part_number = get_model_parallel_rank() + cfg.checkpoint.checkpoint_suffix += "-model_part-{0}".format(model_part_number) + + if hasattr(cfg, "model") and getattr(cfg.model, "base_layers", 0) > 0: + cfg.checkpoint.checkpoint_suffix = f"-rank-{cfg.distributed_training.distributed_rank}" + + return cfg.distributed_training.distributed_rank + + +def distributed_main(i, main, cfg: FairseqConfig, kwargs): + cfg.distributed_training.device_id = i + if torch.cuda.is_available() and not cfg.common.cpu and not cfg.common.tpu: + torch.cuda.set_device(cfg.distributed_training.device_id) + if cfg.distributed_training.distributed_rank is None: # torch.multiprocessing.spawn + cfg.distributed_training.distributed_rank = kwargs.pop("start_rank", 0) + i + + cfg.distributed_training.distributed_rank = distributed_init(cfg) + + after_distributed_init_fn = kwargs.pop("after_distributed_init_fn", None) + if after_distributed_init_fn: + cfg = after_distributed_init_fn(cfg) + + main(cfg, **kwargs) + + if torch.distributed.is_initialized(): + torch.distributed.barrier(get_global_group()) + + +def call_main(cfg: FairseqConfig, main, **kwargs): + if cfg.distributed_training.distributed_init_method is None: + infer_init_method(cfg.distributed_training) + + if cfg.distributed_training.distributed_init_method is not None: + # distributed training + if not cfg.distributed_training.distributed_no_spawn: + start_rank = cfg.distributed_training.distributed_rank + cfg.distributed_training.distributed_rank = None # assign automatically + kwargs["start_rank"] = start_rank + torch.multiprocessing.spawn( + fn=distributed_main, + args=(main, cfg, kwargs), + nprocs=min( + torch.cuda.device_count(), + cfg.distributed_training.distributed_world_size, + ), + join=True, + ) + else: + distributed_main(cfg.distributed_training.device_id, main, cfg, kwargs) + elif cfg.common.tpu and cfg.distributed_training.distributed_world_size > 1: + import torch_xla.distributed.xla_multiprocessing as xmp + + torch.multiprocessing.set_sharing_strategy("file_system") + xmp.spawn( + fn=distributed_main, + args=(main, cfg, kwargs), + # tpu-comment: + # 8 devices in one TPU VM, is the max processes to be spawned. + # The rest is driven by xm.distributed.xla_dist + nprocs=min(cfg.distributed_training.distributed_world_size, 8), + ) + else: + # single GPU main + main(cfg, **kwargs) + + +def use_xla(): + global _USE_XLA + return _USE_XLA + + +def new_groups(grouped_ranks: List[List[int]]): + if use_xla(): + return ("tpu", grouped_ranks) + else: + groups = [dist.new_group(g) for g in grouped_ranks] + my_group_idx = _find_my_group_index(grouped_ranks) + return groups[my_group_idx] + + +def _find_my_group_index(grouped_ranks): + my_rank = get_global_rank() + for i, group in enumerate(grouped_ranks): + if my_rank in group: + return i + raise RuntimeError + + +def _find_my_group(grouped_ranks): + index = _find_my_group_index(grouped_ranks) + return grouped_ranks[index] + + +def get_rank(group): + if use_xla(): + assert group[0] == "tpu" + my_group = _find_my_group(group[1]) + return my_group.index(get_global_rank()) + else: + return dist.get_rank(group=group) + + +def get_world_size(group): + if use_xla(): + assert group[0] == "tpu" + my_group = _find_my_group(group[1]) + return len(my_group) + elif torch.distributed.is_initialized(): + return dist.get_world_size(group=group) + else: + return 1 + + +def get_global_group(): + if use_xla(): + return new_groups([list(range(get_global_world_size()))]) + elif torch.distributed.is_initialized(): + if not hasattr(get_global_group, "_global_group"): + # ideally we could use torch.distributed.group.WORLD, but it seems + # to cause random NCCL hangs in some cases + get_global_group._global_group = dist.new_group() + return get_global_group._global_group + else: + return None + + +def get_global_rank(): + if use_xla(): + return xm.get_ordinal() + elif torch.distributed.is_initialized(): + return torch.distributed.get_rank() + else: + return 0 + + +def get_global_world_size(): + if use_xla(): + return xm.xrt_world_size() + elif torch.distributed.is_initialized(): + return torch.distributed.get_world_size() + else: + return 1 + + +def get_data_parallel_group(): + """Get the data parallel group the caller rank belongs to.""" + global _USE_MEGATRON + if _USE_MEGATRON: + from fairseq.model_parallel.megatron import mpu + + return mpu.get_data_parallel_group() + else: + return get_global_group() + + +def get_data_parallel_rank(): + """Return my rank for the data parallel group.""" + return get_rank(get_data_parallel_group()) + + +def get_data_parallel_world_size(): + """Return world size for the data parallel group.""" + return get_world_size(get_data_parallel_group()) + + +def get_model_parallel_group(): + global _USE_MEGATRON + if _USE_MEGATRON: + from fairseq.model_parallel.megatron import mpu + + return mpu.get_model_parallel_group() + else: + return None + + +def get_model_parallel_rank(): + """Return my rank for the model parallel group.""" + return get_rank(get_model_parallel_group()) + + +def get_model_parallel_world_size(): + """Return world size for the model parallel group.""" + return get_world_size(get_model_parallel_group()) + + +def all_reduce(tensor, group, op="sum"): + if use_xla(): + assert isinstance(group, tuple) and group[0] == "tpu" + tensor = [tensor] # wrap in a list to make xm.all_reduce in-place + return xm.all_reduce(op, tensor, groups=group[1])[0] + else: + if op == "sum": + op = dist.ReduceOp.SUM + elif op == "max": + op = dist.ReduceOp.MAX + else: + raise NotImplementedError + dist.all_reduce(tensor, op=op, group=group) + return tensor + + +def broadcast(tensor, src, group): + if use_xla(): + # XLA doesn't support broadcast, hack it with all_reduce + if get_rank(group) != src: + tensor.zero_() + all_reduce(tensor, group) + else: + dist.broadcast(tensor, src=src, group=group) + + +def all_to_all(tensor, group): + """Perform an all-to-all operation on a 1D Tensor.""" + assert tensor.dim() == 1 + split_count = get_world_size(group=group) + assert tensor.numel() % split_count == 0 + if use_xla(): + assert isinstance(group, tuple) and group[0] == "tpu" + return xm.all_to_all( + tensor, + split_dimension=0, + concat_dimension=0, + split_count=split_count, + groups=group[1], + ) + else: + output = torch.zeros_like(tensor) + dist.all_to_all_single(output, tensor, group=group) + return output + + +def all_gather(tensor, group, return_tensor=False): + """Perform an all-gather operation.""" + if use_xla(): + result = xm.all_gather(tensor, groups=group[1]) + world_size = get_world_size(group=group) + result = result.view(world_size, *tensor.size()) + if return_tensor: + return result + else: + return [result[i] for i in range(world_size)] + else: + world_size = get_world_size(group=group) + rank = get_rank(group=group) + tensor_list = [ + tensor if i == rank else torch.empty_like(tensor) for i in range(world_size) + ] + dist.all_gather(tensor_list, tensor, group=group) + if return_tensor: + return torch.stack(tensor_list, dim=0) + else: + return tensor_list + + +def all_gather_list(data, group=None, max_size=16384): + """Gathers arbitrary data from all nodes into a list. + + Similar to :func:`~torch.distributed.all_gather` but for arbitrary Python + data. Note that *data* must be picklable and any CUDA tensors will be moved + to CPU and returned on CPU as well. + + Args: + data (Any): data from the local worker to be gathered on other workers + group: group of the collective + max_size (int, optional): maximum size of the data to be gathered + across workers + """ + from fairseq import utils + + if group is None: + group = get_global_group() + rank = get_rank(group=group) + world_size = get_world_size(group=group) + + buffer_size = max_size * world_size + if ( + not hasattr(all_gather_list, "_buffer") + or all_gather_list._buffer.numel() < buffer_size + ): + all_gather_list._buffer = torch.cuda.ByteTensor(buffer_size) + all_gather_list._cpu_buffer = torch.ByteTensor(max_size).pin_memory() + buffer = all_gather_list._buffer + buffer.zero_() + cpu_buffer = all_gather_list._cpu_buffer + + data = utils.move_to_cpu(data) + enc = pickle.dumps(data) + enc_size = len(enc) + header_size = 4 # size of header that contains the length of the encoded data + size = header_size + enc_size + if size > max_size: + raise ValueError( + "encoded data size ({}) exceeds max_size ({})".format(size, max_size) + ) + + header = struct.pack(">I", enc_size) + cpu_buffer[:size] = torch.ByteTensor(list(header + enc)) + start = rank * max_size + buffer[start : start + size].copy_(cpu_buffer[:size]) + + all_reduce(buffer, group=group) + + buffer = buffer.cpu() + try: + result = [] + for i in range(world_size): + out_buffer = buffer[i * max_size : (i + 1) * max_size] + (enc_size,) = struct.unpack(">I", bytes(out_buffer[:header_size].tolist())) + if enc_size > 0: + result.append( + pickle.loads( + bytes(out_buffer[header_size : header_size + enc_size].tolist()) + ) + ) + return result + except pickle.UnpicklingError: + raise Exception( + "Unable to unpickle data from other workers. all_gather_list requires all " + "workers to enter the function together, so this error usually indicates " + "that the workers have fallen out of sync somehow. Workers can fall out of " + "sync if one of them runs out of memory, or if there are other conditions " + "in your training script that can cause one worker to finish an epoch " + "while other workers are still iterating over their portions of the data. " + "Try rerunning with --ddp-backend=legacy_ddp and see if that helps." + ) + + +def all_reduce_dict(data: Mapping[str, Any], device, group) -> Dict[str, Any]: + """ + AllReduce a dictionary of values across workers. We separately + reduce items that are already on the device and items on CPU for + better performance. + + Args: + data (Mapping[str, Any]): dictionary of data to all-reduce, but + cannot be a nested dictionary + device (torch.device): device for the reduction + group: group of the collective + """ + data_keys = list(data.keys()) + + # We want to separately reduce items that are already on the + # device and items on CPU for performance reasons. + cpu_data = OrderedDict() + device_data = OrderedDict() + for k in data_keys: + t = data[k] + if not torch.is_tensor(t): + cpu_data[k] = torch.tensor(t, dtype=torch.double) + elif t.device.type != device.type: + cpu_data[k] = t.to(dtype=torch.double) + else: + device_data[k] = t.to(dtype=torch.double) + + def _all_reduce_dict(data: OrderedDict): + if len(data) == 0: + return data + buf = torch.cat([t.view(-1) for t in data.values()]).to(device=device) + all_reduce(buf, group=group) + split_buf = torch.split(buf, [t.numel() for t in data.values()]) + reduced_data = [t.view_as(orig) for t, orig in zip(split_buf, data.values())] + return OrderedDict(zip(data.keys(), reduced_data)) + + cpu_data = _all_reduce_dict(cpu_data) + device_data = _all_reduce_dict(device_data) + + def get_from_stack(key): + if key in cpu_data: + return cpu_data[key] + elif key in device_data: + return device_data[key] + raise KeyError + + return OrderedDict([(key, get_from_stack(key)) for key in data_keys]) + + +def broadcast_tensors( + tensors: Optional[List[torch.Tensor]], + src_rank: int, + group: object, + dist_device: Optional[torch.device] = None, +) -> List[torch.Tensor]: + """ + Broadcasts a list of tensors without other (non-src) ranks needing to know + the dtypes/shapes of the tensors. + """ + if dist_device is None: + if torch.distributed.get_backend(group) == "nccl": + dist_device = torch.device("cuda") + else: + dist_device = torch.device("cpu") + + # share metadata first to simplify transfer + is_src_rank = (get_rank(group) == src_rank) + if is_src_rank: + metadata = [ + {"size": t.size(), "dtype": t.dtype, "device": t.device} for t in tensors + ] + metadata = _broadcast_object_slow(metadata, src_rank, group, dist_device) + else: + metadata = _broadcast_object_slow(None, src_rank, group, dist_device) + + out_tensors = [] + for i, meta in enumerate(metadata): + if is_src_rank: + tensor = tensors[i] + broadcast(tensors[i].to(dist_device), src=src_rank, group=group) + else: + tensor = torch.zeros( + [meta["size"].numel()], dtype=meta["dtype"], device=dist_device + ) + broadcast(tensor, src=src_rank, group=group) + tensor = tensor.view(meta["size"]).to(meta["device"]) + out_tensors.append(tensor) + return out_tensors + + +def broadcast_object( + obj: Any, + src_rank: int, + group: object, + dist_device: Optional[torch.device] = None, +) -> Any: + """Broadcast an arbitrary Python object to other workers.""" + if dist_device is None: + if torch.distributed.get_backend(group) == "nccl": + dist_device = torch.device("cuda") + else: + dist_device = torch.device("cpu") + + if get_rank(group) == src_rank: + # split the tensors from the non-tensors so we can broadcast them + # directly, avoiding unnecessary serialization/deserialization + tensors = [] + obj = _split_tensors_from_obj(obj, tensors) + obj = _broadcast_object_slow(obj, src_rank, group, dist_device) + tensors = broadcast_tensors(tensors, src_rank, group, dist_device) + else: + obj = _broadcast_object_slow(None, src_rank, group, dist_device) + tensors = broadcast_tensors(None, src_rank, group, dist_device) + return _put_tensors_in_obj(obj, tensors) + + +def _broadcast_object_slow( + obj: Any, src_rank: int, group: object, dist_device: torch.device, +) -> Any: + if get_rank(group) == src_rank: + # Emit data + buffer = io.BytesIO() + torch.save(obj, buffer) + buffer = torch.ByteTensor(buffer.getbuffer()).to(dist_device) + length = torch.LongTensor([len(buffer)]).to(dist_device) + broadcast(length, src=src_rank, group=group) + broadcast(buffer, src=src_rank, group=group) + else: + # Fetch from the source + length = torch.LongTensor([0]).to(dist_device) + broadcast(length, src=src_rank, group=group) + buffer = torch.ByteTensor(int(length.item())).to(dist_device) + broadcast(buffer, src=src_rank, group=group) + buffer = io.BytesIO(buffer.cpu().numpy()) + obj = torch.load(buffer, map_location="cpu") + return obj + + +@dataclass(frozen=True) +class _TensorPlaceholder: + index: int + + +def _split_tensors_from_obj(obj: Any, tensors: List[torch.Tensor]) -> Any: + if torch.is_tensor(obj): + placeholder = _TensorPlaceholder(index=len(tensors)) + tensors.append(obj) + return placeholder + elif isinstance(obj, dict): + return {k: _split_tensors_from_obj(v, tensors) for k, v in obj.items()} + elif isinstance(obj, list): + return [_split_tensors_from_obj(v, tensors) for v in obj] + elif isinstance(obj, tuple): + return tuple(_split_tensors_from_obj(v, tensors) for v in obj) + elif isinstance(obj, set): + return {_split_tensors_from_obj(v, tensors) for v in obj} + else: + return obj + + +def _put_tensors_in_obj(obj: Any, tensors: List[torch.Tensor]) -> Any: + if isinstance(obj, _TensorPlaceholder): + return tensors[obj.index] + elif isinstance(obj, dict): + return {k: _put_tensors_in_obj(v, tensors) for k, v in obj.items()} + elif isinstance(obj, list): + return [_put_tensors_in_obj(v, tensors) for v in obj] + elif isinstance(obj, tuple): + return tuple(_put_tensors_in_obj(v, tensors) for v in obj) + elif isinstance(obj, set): + return {_put_tensors_in_obj(v, tensors) for v in obj} + else: + return obj diff --git a/SpeechT5/fairseq/fairseq/file_io.py b/SpeechT5/fairseq/fairseq/file_io.py new file mode 100644 index 0000000..dba663d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/file_io.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 + +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import shutil +from typing import List, Optional + + +logger = logging.getLogger(__file__) + + +try: + from iopath.common.file_io import g_pathmgr as IOPathManager + + try: + # [FB only - for now] AWS PathHandler for PathManager + from .fb_pathhandlers import S3PathHandler + + IOPathManager.register_handler(S3PathHandler()) + except KeyError: + logging.warning("S3PathHandler already registered.") + except ImportError: + logging.debug( + "S3PathHandler couldn't be imported. Either missing fb-only files, or boto3 module." + ) + +except ImportError: + IOPathManager = None + + +class PathManager: + """ + Wrapper for insulating OSS I/O (using Python builtin operations) from + iopath's PathManager abstraction (for transparently handling various + internal backends). + """ + + @staticmethod + def open( + path: str, + mode: str = "r", + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + ): + if IOPathManager: + return IOPathManager.open( + path=path, + mode=mode, + buffering=buffering, + encoding=encoding, + errors=errors, + newline=newline, + ) + return open( + path, + mode=mode, + buffering=buffering, + encoding=encoding, + errors=errors, + newline=newline, + ) + + @staticmethod + def copy(src_path: str, dst_path: str, overwrite: bool = False) -> bool: + if IOPathManager: + return IOPathManager.copy( + src_path=src_path, dst_path=dst_path, overwrite=overwrite + ) + return shutil.copyfile(src_path, dst_path) + + @staticmethod + def get_local_path(path: str, **kwargs) -> str: + if IOPathManager: + return IOPathManager.get_local_path(path, **kwargs) + return path + + @staticmethod + def exists(path: str) -> bool: + if IOPathManager: + return IOPathManager.exists(path) + return os.path.exists(path) + + @staticmethod + def isfile(path: str) -> bool: + if IOPathManager: + return IOPathManager.isfile(path) + return os.path.isfile(path) + + @staticmethod + def ls(path: str) -> List[str]: + if IOPathManager: + return IOPathManager.ls(path) + return os.listdir(path) + + @staticmethod + def mkdirs(path: str) -> None: + if IOPathManager: + return IOPathManager.mkdirs(path) + os.makedirs(path, exist_ok=True) + + @staticmethod + def rm(path: str) -> None: + if IOPathManager: + return IOPathManager.rm(path) + os.remove(path) + + @staticmethod + def chmod(path: str, mode: int) -> None: + if not PathManager.path_requires_pathmanager(path): + os.chmod(path, mode) + + @staticmethod + def register_handler(handler) -> None: + if IOPathManager: + return IOPathManager.register_handler(handler=handler) + + @staticmethod + def copy_from_local( + local_path: str, dst_path: str, overwrite: bool = False, **kwargs + ) -> None: + if IOPathManager: + return IOPathManager.copy_from_local( + local_path=local_path, dst_path=dst_path, overwrite=overwrite, **kwargs + ) + return shutil.copyfile(local_path, dst_path) + + @staticmethod + def path_requires_pathmanager(path: str) -> bool: + """Do we require PathManager to access given path?""" + if IOPathManager: + for p in IOPathManager._path_handlers.keys(): + if path.startswith(p): + return True + return False + + @staticmethod + def supports_rename(path: str) -> bool: + # PathManager doesn't yet support renames + return not PathManager.path_requires_pathmanager(path) + + @staticmethod + def rename(src: str, dst: str): + os.rename(src, dst) + + """ + ioPath async PathManager methods: + """ + @staticmethod + def opena( + path: str, + mode: str = "r", + buffering: int = -1, + encoding: Optional[str] = None, + errors: Optional[str] = None, + newline: Optional[str] = None, + ): + """ + Return file descriptor with asynchronous write operations. + """ + global IOPathManager + if not IOPathManager: + logging.info("ioPath is initializing PathManager.") + try: + from iopath.common.file_io import PathManager + IOPathManager = PathManager() + except Exception: + logging.exception("Failed to initialize ioPath PathManager object.") + return IOPathManager.opena( + path=path, + mode=mode, + buffering=buffering, + encoding=encoding, + errors=errors, + newline=newline, + ) + + @staticmethod + def async_close() -> bool: + """ + Wait for files to be written and clean up asynchronous PathManager. + NOTE: `PathManager.async_close()` must be called at the end of any + script that uses `PathManager.opena(...)`. + """ + global IOPathManager + if IOPathManager: + return IOPathManager.async_close() + return False diff --git a/SpeechT5/fairseq/fairseq/file_utils.py b/SpeechT5/fairseq/fairseq/file_utils.py new file mode 100644 index 0000000..d1d5ea6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/file_utils.py @@ -0,0 +1,369 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Utilities for working with the local dataset cache. +This file is adapted from `AllenNLP <https://github.com/allenai/allennlp>`_. +and `huggingface <https://github.com/huggingface>`_. +""" + +import fnmatch +import json +import logging +import os +import shutil +import tarfile +import tempfile +from functools import partial, wraps +from hashlib import sha256 +from io import open + + +try: + from torch.hub import _get_torch_home + + torch_cache_home = _get_torch_home() +except ImportError: + torch_cache_home = os.path.expanduser( + os.getenv( + "TORCH_HOME", os.path.join(os.getenv("XDG_CACHE_HOME", "~/.cache"), "torch") + ) + ) +default_cache_path = os.path.join(torch_cache_home, "pytorch_fairseq") + +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse + +try: + from pathlib import Path + + PYTORCH_FAIRSEQ_CACHE = Path(os.getenv("PYTORCH_FAIRSEQ_CACHE", default_cache_path)) +except (AttributeError, ImportError): + PYTORCH_FAIRSEQ_CACHE = os.getenv("PYTORCH_FAIRSEQ_CACHE", default_cache_path) + +CONFIG_NAME = "config.json" +WEIGHTS_NAME = "pytorch_model.bin" + +logger = logging.getLogger(__name__) # pylint: disable=invalid-name + + +def load_archive_file(archive_file): + # redirect to the cache, if necessary + try: + resolved_archive_file = cached_path(archive_file, cache_dir=None) + except EnvironmentError: + logger.info( + "Archive name '{}' was not found in archive name list. " + "We assumed '{}' was a path or URL but couldn't find any file " + "associated to this path or URL.".format( + archive_file, + archive_file, + ) + ) + return None + + if resolved_archive_file == archive_file: + logger.info("loading archive file {}".format(archive_file)) + else: + logger.info( + "loading archive file {} from cache at {}".format( + archive_file, resolved_archive_file + ) + ) + + # Extract archive to temp dir and replace .tar.bz2 if necessary + tempdir = None + if not os.path.isdir(resolved_archive_file): + tempdir = tempfile.mkdtemp() + logger.info( + "extracting archive file {} to temp dir {}".format( + resolved_archive_file, tempdir + ) + ) + ext = os.path.splitext(archive_file)[1][1:] + with tarfile.open(resolved_archive_file, "r:" + ext) as archive: + top_dir = os.path.commonprefix(archive.getnames()) + archive.extractall(tempdir) + os.remove(resolved_archive_file) + shutil.move(os.path.join(tempdir, top_dir), resolved_archive_file) + shutil.rmtree(tempdir) + + return resolved_archive_file + + +def url_to_filename(url, etag=None): + """ + Convert `url` into a hashed filename in a repeatable way. + If `etag` is specified, append its hash to the URL's, delimited + by a period. + """ + url_bytes = url.encode("utf-8") + url_hash = sha256(url_bytes) + filename = url_hash.hexdigest() + + if etag: + etag_bytes = etag.encode("utf-8") + etag_hash = sha256(etag_bytes) + filename += "." + etag_hash.hexdigest() + + return filename + + +def filename_to_url(filename, cache_dir=None): + """ + Return the url and etag (which may be ``None``) stored for `filename`. + Raise ``EnvironmentError`` if `filename` or its stored metadata do not exist. + """ + if cache_dir is None: + cache_dir = PYTORCH_FAIRSEQ_CACHE + if isinstance(cache_dir, Path): + cache_dir = str(cache_dir) + + cache_path = os.path.join(cache_dir, filename) + if not os.path.exists(cache_path): + raise EnvironmentError("file {} not found".format(cache_path)) + + meta_path = cache_path + ".json" + if not os.path.exists(meta_path): + raise EnvironmentError("file {} not found".format(meta_path)) + + with open(meta_path, encoding="utf-8") as meta_file: + metadata = json.load(meta_file) + url = metadata["url"] + etag = metadata["etag"] + + return url, etag + + +def cached_path_from_pm(url_or_filename): + """ + Tries to cache the specified URL using PathManager class. + Returns the cached path if success otherwise failure. + """ + try: + from fairseq.file_io import PathManager + local_path = PathManager.get_local_path(url_or_filename) + return local_path + except Exception: + return None + + +def cached_path(url_or_filename, cache_dir=None): + """ + Given something that might be a URL (or might be a local path), + determine which. If it's a URL, download the file and cache it, and + return the path to the cached file. If it's already a local path, + make sure the file exists and then return the path. + """ + if cache_dir is None: + cache_dir = PYTORCH_FAIRSEQ_CACHE + if isinstance(url_or_filename, Path): + url_or_filename = str(url_or_filename) + if isinstance(cache_dir, Path): + cache_dir = str(cache_dir) + + parsed = urlparse(url_or_filename) + + if parsed.scheme in ("http", "https", "s3"): + # URL, so get it from the cache (downloading if necessary) + return get_from_cache(url_or_filename, cache_dir) + elif os.path.exists(url_or_filename): + # File, and it exists. + return url_or_filename + elif parsed.scheme == "": + # File, but it doesn't exist. + raise EnvironmentError("file {} not found".format(url_or_filename)) + else: + cached_path = cached_path_from_pm(url_or_filename) + if cached_path: + return cached_path + # Something unknown + raise ValueError( + "unable to parse {} as a URL or as a local path".format(url_or_filename) + ) + + +def split_s3_path(url): + """Split a full s3 path into the bucket name and path.""" + parsed = urlparse(url) + if not parsed.netloc or not parsed.path: + raise ValueError("bad s3 path {}".format(url)) + bucket_name = parsed.netloc + s3_path = parsed.path + # Remove '/' at beginning of path. + if s3_path.startswith("/"): + s3_path = s3_path[1:] + return bucket_name, s3_path + + +def s3_request(func): + """ + Wrapper function for s3 requests in order to create more helpful error + messages. + """ + + @wraps(func) + def wrapper(url, *args, **kwargs): + from botocore.exceptions import ClientError + + try: + return func(url, *args, **kwargs) + except ClientError as exc: + if int(exc.response["Error"]["Code"]) == 404: + raise EnvironmentError("file {} not found".format(url)) + else: + raise + + return wrapper + + +@s3_request +def s3_etag(url): + """Check ETag on S3 object.""" + import boto3 + + s3_resource = boto3.resource("s3") + bucket_name, s3_path = split_s3_path(url) + s3_object = s3_resource.Object(bucket_name, s3_path) + return s3_object.e_tag + + +@s3_request +def s3_get(url, temp_file): + """Pull a file directly from S3.""" + import boto3 + + s3_resource = boto3.resource("s3") + bucket_name, s3_path = split_s3_path(url) + s3_resource.Bucket(bucket_name).download_fileobj(s3_path, temp_file) + + +def request_wrap_timeout(func, url): + import requests + + for attempt, timeout in enumerate([10, 20, 40, 60, 60]): + try: + return func(timeout=timeout) + except requests.exceptions.Timeout as e: + logger.warning( + "Request for %s timed-out (attempt %d). Retrying with a timeout of %d secs", + url, + attempt, + timeout, + exc_info=e, + ) + continue + raise RuntimeError(f"Unable to fetch file {url}") + + +def http_get(url, temp_file): + import requests + from tqdm import tqdm + + req = request_wrap_timeout(partial(requests.get, url, stream=True), url) + content_length = req.headers.get("Content-Length") + total = int(content_length) if content_length is not None else None + progress = tqdm(unit="B", total=total) + for chunk in req.iter_content(chunk_size=1024): + if chunk: # filter out keep-alive new chunks + progress.update(len(chunk)) + temp_file.write(chunk) + progress.close() + + +def get_from_cache(url, cache_dir=None): + """ + Given a URL, look for the corresponding dataset in the local cache. + If it's not there, download it. Then return the path to the cached file. + """ + if cache_dir is None: + cache_dir = PYTORCH_FAIRSEQ_CACHE + if isinstance(cache_dir, Path): + cache_dir = str(cache_dir) + + if not os.path.exists(cache_dir): + os.makedirs(cache_dir) + + # Get eTag to add to filename, if it exists. + if url.startswith("s3://"): + etag = s3_etag(url) + else: + try: + import requests + + response = request_wrap_timeout( + partial(requests.head, url, allow_redirects=True), url + ) + if response.status_code != 200: + etag = None + else: + etag = response.headers.get("ETag") + except RuntimeError: + etag = None + + filename = url_to_filename(url, etag) + + # get cache path to put the file + cache_path = os.path.join(cache_dir, filename) + + # If we don't have a connection (etag is None) and can't identify the file + # try to get the last downloaded one + if not os.path.exists(cache_path) and etag is None: + matching_files = fnmatch.filter(os.listdir(cache_dir), filename + ".*") + matching_files = list(filter(lambda s: not s.endswith(".json"), matching_files)) + if matching_files: + cache_path = os.path.join(cache_dir, matching_files[-1]) + + if not os.path.exists(cache_path): + # Download to temporary file, then copy to cache dir once finished. + # Otherwise you get corrupt cache entries if the download gets interrupted. + with tempfile.NamedTemporaryFile() as temp_file: + logger.info("%s not found in cache, downloading to %s", url, temp_file.name) + + # GET file object + if url.startswith("s3://"): + s3_get(url, temp_file) + else: + http_get(url, temp_file) + + # we are copying the file before closing it, so flush to avoid truncation + temp_file.flush() + # shutil.copyfileobj() starts at the current position, so go to the start + temp_file.seek(0) + + logger.info("copying %s to cache at %s", temp_file.name, cache_path) + with open(cache_path, "wb") as cache_file: + shutil.copyfileobj(temp_file, cache_file) + + logger.info("creating metadata file for %s", cache_path) + meta = {"url": url, "etag": etag} + meta_path = cache_path + ".json" + with open(meta_path, "w") as meta_file: + output_string = json.dumps(meta) + meta_file.write(output_string) + + logger.info("removing temp file %s", temp_file.name) + + return cache_path + + +def read_set_from_file(filename): + """ + Extract a de-duped collection (set) of text from a file. + Expected file format is one item per line. + """ + collection = set() + with open(filename, "r", encoding="utf-8") as file_: + for line in file_: + collection.add(line.rstrip()) + return collection + + +def get_file_extension(path, dot=True, lower=True): + ext = os.path.splitext(path)[1] + ext = ext if dot else ext[1:] + return ext.lower() if lower else ext diff --git a/SpeechT5/fairseq/fairseq/hub_utils.py b/SpeechT5/fairseq/fairseq/hub_utils.py new file mode 100644 index 0000000..d74470d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/hub_utils.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import copy +import logging +import os +from typing import Any, Dict, Iterator, List + +import torch +from fairseq import utils +from fairseq.data import encoders +from omegaconf import open_dict +from torch import nn + + +logger = logging.getLogger(__name__) + + +def from_pretrained( + model_name_or_path, + checkpoint_file="model.pt", + data_name_or_path=".", + archive_map=None, + **kwargs +): + from fairseq import checkpoint_utils, file_utils + + if archive_map is not None: + if model_name_or_path in archive_map: + model_name_or_path = archive_map[model_name_or_path] + if data_name_or_path is not None and data_name_or_path in archive_map: + data_name_or_path = archive_map[data_name_or_path] + + # allow archive_map to set default arg_overrides (e.g., tokenizer, bpe) + # for each model + if isinstance(model_name_or_path, dict): + for k, v in model_name_or_path.items(): + if k == "checkpoint_file": + checkpoint_file = v + elif ( + k != "path" + # only set kwargs that don't already have overrides + and k not in kwargs + ): + kwargs[k] = v + model_name_or_path = model_name_or_path["path"] + + model_path = file_utils.load_archive_file(model_name_or_path) + + # convenience hack for loading data and BPE codes from model archive + if data_name_or_path.startswith("."): + kwargs["data"] = os.path.abspath(os.path.join(model_path, data_name_or_path)) + else: + kwargs["data"] = file_utils.load_archive_file(data_name_or_path) + for file, arg in { + "code": "bpe_codes", + "bpecodes": "bpe_codes", + "sentencepiece.bpe.model": "sentencepiece_model", + "merges.txt": "bpe_merges", + "vocab.json": "bpe_vocab", + }.items(): + path = os.path.join(model_path, file) + if os.path.exists(path): + kwargs[arg] = path + + if "user_dir" in kwargs: + utils.import_user_module(argparse.Namespace(user_dir=kwargs["user_dir"])) + + models, args, task = checkpoint_utils.load_model_ensemble_and_task( + [os.path.join(model_path, cpt) for cpt in checkpoint_file.split(os.pathsep)], + arg_overrides=kwargs, + ) + + return { + "args": args, + "task": task, + "models": models, + } + + +class GeneratorHubInterface(nn.Module): + """ + PyTorch Hub interface for generating sequences from a pre-trained + translation or language model. + """ + + def __init__(self, cfg, task, models): + super().__init__() + self.cfg = cfg + self.task = task + self.models = nn.ModuleList(models) + self.src_dict = task.source_dictionary + self.tgt_dict = task.target_dictionary + + # optimize model for generation + for model in self.models: + model.prepare_for_inference_(cfg) + + # Load alignment dictionary for unknown word replacement + # (None if no unknown word replacement, empty if no path to align dictionary) + self.align_dict = utils.load_align_dict(cfg.generation.replace_unk) + + self.tokenizer = encoders.build_tokenizer(cfg.tokenizer) + self.bpe = encoders.build_bpe(cfg.bpe) + + self.max_positions = utils.resolve_max_positions( + self.task.max_positions(), *[model.max_positions() for model in models] + ) + + # this is useful for determining the device + self.register_buffer("_float_tensor", torch.tensor([0], dtype=torch.float)) + + @property + def device(self): + return self._float_tensor.device + + def translate( + self, sentences: List[str], beam: int = 5, verbose: bool = False, **kwargs + ) -> List[str]: + return self.sample(sentences, beam, verbose, **kwargs) + + def sample( + self, sentences: List[str], beam: int = 1, verbose: bool = False, **kwargs + ) -> List[str]: + if isinstance(sentences, str): + return self.sample([sentences], beam=beam, verbose=verbose, **kwargs)[0] + tokenized_sentences = [self.encode(sentence) for sentence in sentences] + batched_hypos = self.generate(tokenized_sentences, beam, verbose, **kwargs) + return [self.decode(hypos[0]["tokens"]) for hypos in batched_hypos] + + def score(self, sentences: List[str], **kwargs): + if isinstance(sentences, str): + return self.score([sentences], **kwargs)[0] + # NOTE: this doesn't support translation tasks currently + tokenized_sentences = [self.encode(sentence) for sentence in sentences] + return [ + hypos[0] + for hypos in self.generate( + tokenized_sentences, score_reference=True, **kwargs + ) + ] + + def generate( + self, + tokenized_sentences: List[torch.LongTensor], + beam: int = 5, + verbose: bool = False, + skip_invalid_size_inputs=False, + inference_step_args=None, + prefix_allowed_tokens_fn=None, + **kwargs + ) -> List[List[Dict[str, torch.Tensor]]]: + if torch.is_tensor(tokenized_sentences) and tokenized_sentences.dim() == 1: + return self.generate( + tokenized_sentences.unsqueeze(0), beam=beam, verbose=verbose, **kwargs + )[0] + + # build generator using current args as well as any kwargs + gen_args = copy.deepcopy(self.cfg.generation) + with open_dict(gen_args): + gen_args.beam = beam + for k, v in kwargs.items(): + setattr(gen_args, k, v) + generator = self.task.build_generator( + self.models, + gen_args, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + ) + + inference_step_args = inference_step_args or {} + results = [] + for batch in self._build_batches(tokenized_sentences, skip_invalid_size_inputs): + batch = utils.apply_to_sample(lambda t: t.to(self.device), batch) + translations = self.task.inference_step( + generator, self.models, batch, **inference_step_args + ) + for id, hypos in zip(batch["id"].tolist(), translations): + results.append((id, hypos)) + + # sort output to match input order + outputs = [hypos for _, hypos in sorted(results, key=lambda x: x[0])] + + if verbose: + + def getarg(name, default): + return getattr(gen_args, name, getattr(self.cfg, name, default)) + + for source_tokens, target_hypotheses in zip(tokenized_sentences, outputs): + src_str_with_unk = self.string(source_tokens) + logger.info("S\t{}".format(src_str_with_unk)) + for hypo in target_hypotheses: + hypo_str = self.decode(hypo["tokens"]) + logger.info("H\t{}\t{}".format(hypo["score"], hypo_str)) + logger.info( + "P\t{}".format( + " ".join( + map( + lambda x: "{:.4f}".format(x), + hypo["positional_scores"].tolist(), + ) + ) + ) + ) + if hypo["alignment"] is not None and getarg( + "print_alignment", False + ): + logger.info( + "A\t{}".format( + " ".join( + [ + "{}-{}".format(src_idx, tgt_idx) + for src_idx, tgt_idx in hypo["alignment"] + ] + ) + ) + ) + return outputs + + def encode(self, sentence: str) -> torch.LongTensor: + sentence = self.tokenize(sentence) + sentence = self.apply_bpe(sentence) + return self.binarize(sentence) + + def decode(self, tokens: torch.LongTensor) -> str: + sentence = self.string(tokens) + sentence = self.remove_bpe(sentence) + return self.detokenize(sentence) + + def tokenize(self, sentence: str) -> str: + if self.tokenizer is not None: + sentence = self.tokenizer.encode(sentence) + return sentence + + def detokenize(self, sentence: str) -> str: + if self.tokenizer is not None: + sentence = self.tokenizer.decode(sentence) + return sentence + + def apply_bpe(self, sentence: str) -> str: + if self.bpe is not None: + sentence = self.bpe.encode(sentence) + return sentence + + def remove_bpe(self, sentence: str) -> str: + if self.bpe is not None: + sentence = self.bpe.decode(sentence) + return sentence + + def binarize(self, sentence: str) -> torch.LongTensor: + return self.src_dict.encode_line(sentence, add_if_not_exist=False).long() + + def string(self, tokens: torch.LongTensor) -> str: + return self.tgt_dict.string(tokens) + + def _build_batches( + self, tokens: List[List[int]], skip_invalid_size_inputs: bool + ) -> Iterator[Dict[str, Any]]: + lengths = torch.LongTensor([t.numel() for t in tokens]) + batch_iterator = self.task.get_batch_iterator( + dataset=self.task.build_dataset_for_inference(tokens, lengths), + max_tokens=self.cfg.dataset.max_tokens, + max_sentences=self.cfg.dataset.batch_size, + max_positions=self.max_positions, + ignore_invalid_inputs=skip_invalid_size_inputs, + disable_iterator_cache=True, + ).next_epoch_itr(shuffle=False) + return batch_iterator + + +class BPEHubInterface(object): + """PyTorch Hub interface for Byte-Pair Encoding (BPE).""" + + def __init__(self, bpe, **kwargs): + super().__init__() + args = argparse.Namespace(bpe=bpe, **kwargs) + self.bpe = encoders.build_bpe(args) + assert self.bpe is not None + + def encode(self, sentence: str) -> str: + return self.bpe.encode(sentence) + + def decode(self, sentence: str) -> str: + return self.bpe.decode(sentence) + + +class TokenizerHubInterface(object): + """PyTorch Hub interface for tokenization.""" + + def __init__(self, tokenizer, **kwargs): + super().__init__() + args = argparse.Namespace(tokenizer=tokenizer, **kwargs) + self.tokenizer = encoders.build_tokenizer(args) + assert self.tokenizer is not None + + def encode(self, sentence: str) -> str: + return self.tokenizer.encode(sentence) + + def decode(self, sentence: str) -> str: + return self.tokenizer.decode(sentence) diff --git a/SpeechT5/fairseq/fairseq/incremental_decoding_utils.py b/SpeechT5/fairseq/fairseq/incremental_decoding_utils.py new file mode 100644 index 0000000..b26e6cd --- /dev/null +++ b/SpeechT5/fairseq/fairseq/incremental_decoding_utils.py @@ -0,0 +1,51 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import uuid +from typing import Dict, Optional + +from torch import Tensor + + +class FairseqIncrementalState(object): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.init_incremental_state() + + def init_incremental_state(self): + self._incremental_state_id = str(uuid.uuid4()) + + def _get_full_incremental_state_key(self, key: str) -> str: + return "{}.{}".format(self._incremental_state_id, key) + + def get_incremental_state( + self, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], + key: str, + ) -> Optional[Dict[str, Optional[Tensor]]]: + """Helper for getting incremental state for an nn.Module.""" + full_key = self._get_full_incremental_state_key(key) + if incremental_state is None or full_key not in incremental_state: + return None + return incremental_state[full_key] + + def set_incremental_state( + self, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], + key: str, + value: Dict[str, Optional[Tensor]], + ) -> Optional[Dict[str, Dict[str, Optional[Tensor]]]]: + """Helper for setting incremental state for an nn.Module.""" + if incremental_state is not None: + full_key = self._get_full_incremental_state_key(key) + incremental_state[full_key] = value + return incremental_state + + +def with_incremental_state(cls): + cls.__bases__ = (FairseqIncrementalState,) + tuple( + b for b in cls.__bases__ if b != FairseqIncrementalState + ) + return cls diff --git a/SpeechT5/fairseq/fairseq/iterative_refinement_generator.py b/SpeechT5/fairseq/fairseq/iterative_refinement_generator.py new file mode 100644 index 0000000..4fb0946 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/iterative_refinement_generator.py @@ -0,0 +1,359 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections import namedtuple + +import numpy as np +import torch +from fairseq import utils + + +DecoderOut = namedtuple( + "IterativeRefinementDecoderOut", + ["output_tokens", "output_scores", "attn", "step", "max_step", "history"], +) + + +class IterativeRefinementGenerator(object): + def __init__( + self, + tgt_dict, + models=None, + eos_penalty=0.0, + max_iter=10, + max_ratio=2, + beam_size=1, + decoding_format=None, + retain_dropout=False, + adaptive=True, + retain_history=False, + reranking=False, + ): + """ + Generates translations based on iterative refinement. + + Args: + tgt_dict: target dictionary + eos_penalty: if > 0.0, it penalized early-stopping in decoding + max_iter: maximum number of refinement iterations + max_ratio: generate sequences of maximum length ax, where x is the source length + decoding_format: decoding mode in {'unigram', 'ensemble', 'vote', 'dp', 'bs'} + retain_dropout: retaining dropout in the inference + adaptive: decoding with early stop + """ + self.bos = tgt_dict.bos() + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() + self.vocab_size = len(tgt_dict) + self.eos_penalty = eos_penalty + self.max_iter = max_iter + self.max_ratio = max_ratio + self.beam_size = beam_size + self.reranking = reranking + self.decoding_format = decoding_format + self.retain_dropout = retain_dropout + self.retain_history = retain_history + self.adaptive = adaptive + self.models = models + + def generate_batched_itr( + self, + data_itr, + maxlen_a=None, + maxlen_b=None, + cuda=False, + timer=None, + prefix_size=0, + ): + """Iterate over a batched dataset and yield individual translations. + + Args: + maxlen_a/b: generate sequences of maximum length ax + b, + where x is the source sentence length. + cuda: use GPU for generation + timer: StopwatchMeter for timing generations. + """ + + for sample in data_itr: + if "net_input" not in sample: + continue + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate( + self.models, + sample, + prefix_tokens=sample["target"][:, :prefix_size] + if prefix_size > 0 + else None, + ) + if timer is not None: + timer.stop(sample["ntokens"]) + for i, id in enumerate(sample["id"]): + # remove padding + src = utils.strip_pad(sample["net_input"]["src_tokens"][i, :], self.pad) + ref = utils.strip_pad(sample["target"][i, :], self.pad) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate(self, models, sample, prefix_tokens=None, constraints=None): + if constraints is not None: + raise NotImplementedError( + "Constrained decoding with the IterativeRefinementGenerator is not supported" + ) + + # TODO: iterative refinement generator does not support ensemble for now. + if not self.retain_dropout: + for model in models: + model.eval() + + model, reranker = models[0], None + if self.reranking: + assert len(models) > 1, "Assuming the last checkpoint is the reranker" + assert ( + self.beam_size > 1 + ), "Reranking requires multiple translation for each example" + + reranker = models[-1] + models = models[:-1] + + if len(models) > 1 and hasattr(model, "enable_ensemble"): + assert model.allow_ensemble, "{} does not support ensembling".format( + model.__class__.__name__ + ) + model.enable_ensemble(models) + + # TODO: better encoder inputs? + src_tokens = sample["net_input"]["src_tokens"] + src_lengths = sample["net_input"]["src_lengths"] + bsz, src_len = src_tokens.size() + + # initialize + encoder_out = model.forward_encoder([src_tokens, src_lengths]) + prev_decoder_out = model.initialize_output_tokens(encoder_out, src_tokens) + + if self.beam_size > 1: + assert ( + model.allow_length_beam + ), "{} does not support decoding with length beam.".format( + model.__class__.__name__ + ) + + # regenerate data based on length-beam + length_beam_order = ( + utils.new_arange(src_tokens, self.beam_size, bsz).t().reshape(-1) + ) + encoder_out = model.encoder.reorder_encoder_out( + encoder_out, length_beam_order + ) + prev_decoder_out = model.regenerate_length_beam( + prev_decoder_out, self.beam_size + ) + bsz = bsz * self.beam_size + + sent_idxs = torch.arange(bsz) + prev_output_tokens = prev_decoder_out.output_tokens.clone() + + if self.retain_history: + prev_decoder_out = prev_decoder_out._replace(history=[prev_output_tokens]) + + finalized = [[] for _ in range(bsz)] + + def is_a_loop(x, y, s, a): + b, l_x, l_y = x.size(0), x.size(1), y.size(1) + if l_x > l_y: + y = torch.cat([y, x.new_zeros(b, l_x - l_y).fill_(self.pad)], 1) + s = torch.cat([s, s.new_zeros(b, l_x - l_y)], 1) + if a is not None: + a = torch.cat([a, a.new_zeros(b, l_x - l_y, a.size(2))], 1) + elif l_x < l_y: + x = torch.cat([x, y.new_zeros(b, l_y - l_x).fill_(self.pad)], 1) + return (x == y).all(1), y, s, a + + def finalized_hypos(step, prev_out_token, prev_out_score, prev_out_attn): + cutoff = prev_out_token.ne(self.pad) + tokens = prev_out_token[cutoff] + if prev_out_score is None: + scores, score = None, None + else: + scores = prev_out_score[cutoff] + score = scores.mean() + + if prev_out_attn is None: + hypo_attn, alignment = None, None + else: + hypo_attn = prev_out_attn[cutoff] + alignment = hypo_attn.max(dim=1)[1] + return { + "steps": step, + "tokens": tokens, + "positional_scores": scores, + "score": score, + "hypo_attn": hypo_attn, + "alignment": alignment, + } + + for step in range(self.max_iter + 1): + + decoder_options = { + "eos_penalty": self.eos_penalty, + "max_ratio": self.max_ratio, + "decoding_format": self.decoding_format, + } + prev_decoder_out = prev_decoder_out._replace( + step=step, + max_step=self.max_iter + 1, + ) + + decoder_out = model.forward_decoder( + prev_decoder_out, encoder_out, **decoder_options + ) + + if self.adaptive: + # terminate if there is a loop + terminated, out_tokens, out_scores, out_attn = is_a_loop( + prev_output_tokens, + decoder_out.output_tokens, + decoder_out.output_scores, + decoder_out.attn, + ) + decoder_out = decoder_out._replace( + output_tokens=out_tokens, + output_scores=out_scores, + attn=out_attn, + ) + + else: + terminated = decoder_out.output_tokens.new_zeros( + decoder_out.output_tokens.size(0) + ).bool() + + if step == self.max_iter: # reach last iteration, terminate + terminated.fill_(1) + + # collect finalized sentences + finalized_idxs = sent_idxs[terminated] + finalized_tokens = decoder_out.output_tokens[terminated] + finalized_scores = decoder_out.output_scores[terminated] + finalized_attn = ( + None + if (decoder_out.attn is None or decoder_out.attn.size(0) == 0) + else decoder_out.attn[terminated] + ) + + if self.retain_history: + finalized_history_tokens = [h[terminated] for h in decoder_out.history] + + for i in range(finalized_idxs.size(0)): + finalized[finalized_idxs[i]] = [ + finalized_hypos( + step, + finalized_tokens[i], + finalized_scores[i], + None if finalized_attn is None else finalized_attn[i], + ) + ] + + if self.retain_history: + finalized[finalized_idxs[i]][0]["history"] = [] + for j in range(len(finalized_history_tokens)): + finalized[finalized_idxs[i]][0]["history"].append( + finalized_hypos( + step, finalized_history_tokens[j][i], None, None + ) + ) + + # check if all terminated + if terminated.sum() == terminated.size(0): + break + + # for next step + not_terminated = ~terminated + prev_decoder_out = decoder_out._replace( + output_tokens=decoder_out.output_tokens[not_terminated], + output_scores=decoder_out.output_scores[not_terminated], + attn=decoder_out.attn[not_terminated] + if (decoder_out.attn is not None and decoder_out.attn.size(0) > 0) + else None, + history=[h[not_terminated] for h in decoder_out.history] + if decoder_out.history is not None + else None, + ) + encoder_out = model.encoder.reorder_encoder_out( + encoder_out, not_terminated.nonzero(as_tuple=False).squeeze() + ) + sent_idxs = sent_idxs[not_terminated] + prev_output_tokens = prev_decoder_out.output_tokens.clone() + + if self.beam_size > 1: + if reranker is not None: + finalized = self.rerank( + reranker, finalized, [src_tokens, src_lengths], self.beam_size + ) + + # aggregate information from length beam + finalized = [ + finalized[ + np.argmax( + [ + finalized[self.beam_size * i + j][0]["score"] + for j in range(self.beam_size) + ] + ) + + self.beam_size * i + ] + for i in range(len(finalized) // self.beam_size) + ] + + return finalized + + def rerank(self, reranker, finalized, encoder_input, beam_size): + def rebuild_batch(finalized): + finalized_tokens = [f[0]["tokens"] for f in finalized] + finalized_maxlen = max(f.size(0) for f in finalized_tokens) + final_output_tokens = ( + finalized_tokens[0] + .new_zeros(len(finalized_tokens), finalized_maxlen) + .fill_(self.pad) + ) + for i, f in enumerate(finalized_tokens): + final_output_tokens[i, : f.size(0)] = f + return final_output_tokens + + final_output_tokens = rebuild_batch(finalized) + final_output_tokens[ + :, 0 + ] = self.eos # autoregressive model assumes starting with EOS + + reranker_encoder_out = reranker.encoder(*encoder_input) + length_beam_order = ( + utils.new_arange( + final_output_tokens, beam_size, reranker_encoder_out.encoder_out.size(1) + ) + .t() + .reshape(-1) + ) + reranker_encoder_out = reranker.encoder.reorder_encoder_out( + reranker_encoder_out, length_beam_order + ) + reranking_scores = reranker.get_normalized_probs( + reranker.decoder(final_output_tokens[:, :-1], reranker_encoder_out), + True, + None, + ) + reranking_scores = reranking_scores.gather(2, final_output_tokens[:, 1:, None]) + reranking_masks = final_output_tokens[:, 1:].ne(self.pad) + reranking_scores = ( + reranking_scores[:, :, 0].masked_fill_(~reranking_masks, 0).sum(1) + ) + reranking_scores = reranking_scores / reranking_masks.sum(1).type_as( + reranking_scores + ) + + for i in range(len(finalized)): + finalized[i][0]["score"] = reranking_scores[i] + + return finalized diff --git a/SpeechT5/fairseq/fairseq/logging/__init__.py b/SpeechT5/fairseq/fairseq/logging/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/fairseq/logging/meters.py b/SpeechT5/fairseq/fairseq/logging/meters.py new file mode 100644 index 0000000..2100b1f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/logging/meters.py @@ -0,0 +1,323 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import bisect +import time +from collections import OrderedDict +from typing import Dict, Optional + + +try: + import torch + + def type_as(a, b): + if torch.is_tensor(a) and torch.is_tensor(b): + return a.to(b) + else: + return a + + +except ImportError: + torch = None + + def type_as(a, b): + return a + + +try: + import numpy as np +except ImportError: + np = None + + +class Meter(object): + """Base class for Meters.""" + + def __init__(self): + pass + + def state_dict(self): + return {} + + def load_state_dict(self, state_dict): + pass + + def reset(self): + raise NotImplementedError + + @property + def smoothed_value(self) -> float: + """Smoothed value used for logging.""" + raise NotImplementedError + + +def safe_round(number, ndigits): + if hasattr(number, "__round__"): + return round(number, ndigits) + elif torch is not None and torch.is_tensor(number) and number.numel() == 1: + return safe_round(number.item(), ndigits) + elif np is not None and np.ndim(number) == 0 and hasattr(number, "item"): + return safe_round(number.item(), ndigits) + else: + return number + + +class AverageMeter(Meter): + """Computes and stores the average and current value""" + + def __init__(self, round: Optional[int] = None): + self.round = round + self.reset() + + def reset(self): + self.val = None # most recent update + self.sum = 0 # sum from all updates + self.count = 0 # total n from all updates + + def update(self, val, n=1): + if val is not None: + self.val = val + if n > 0: + self.sum = type_as(self.sum, val) + (val * n) + self.count = type_as(self.count, n) + n + + def state_dict(self): + return { + "val": self.val, + "sum": self.sum, + "count": self.count, + "round": self.round, + } + + def load_state_dict(self, state_dict): + self.val = state_dict["val"] + self.sum = state_dict["sum"] + self.count = state_dict["count"] + self.round = state_dict.get("round", None) + + @property + def avg(self): + return self.sum / self.count if self.count > 0 else self.val + + @property + def smoothed_value(self) -> float: + val = self.avg + if self.round is not None and val is not None: + val = safe_round(val, self.round) + return val + + +class SumMeter(Meter): + """Computes and stores the sum""" + + def __init__(self, round: Optional[int] = None): + self.round = round + self.reset() + + def reset(self): + self.sum = 0 # sum from all updates + + def update(self, val): + if val is not None: + self.sum = type_as(self.sum, val) + val + + def state_dict(self): + return { + "sum": self.sum, + "round": self.round, + } + + def load_state_dict(self, state_dict): + self.sum = state_dict["sum"] + self.round = state_dict.get("round", None) + + @property + def smoothed_value(self) -> float: + val = self.sum + if self.round is not None and val is not None: + val = safe_round(val, self.round) + return val + + +class TimeMeter(Meter): + """Computes the average occurrence of some event per second""" + + def __init__( + self, + init: int = 0, + n: int = 0, + round: Optional[int] = None, + ): + self.round = round + self.reset(init, n) + + def reset(self, init=0, n=0): + self.init = init + self.start = time.perf_counter() + self.n = n + self.i = 0 + + def update(self, val=1): + self.n = type_as(self.n, val) + val + self.i += 1 + + def state_dict(self): + return { + "init": self.elapsed_time, + "n": self.n, + "round": self.round, + } + + def load_state_dict(self, state_dict): + if "start" in state_dict: + # backwards compatibility for old state_dicts + self.reset(init=state_dict["init"]) + else: + self.reset(init=state_dict["init"], n=state_dict["n"]) + self.round = state_dict.get("round", None) + + @property + def avg(self): + return self.n / self.elapsed_time + + @property + def elapsed_time(self): + return self.init + (time.perf_counter() - self.start) + + @property + def smoothed_value(self) -> float: + val = self.avg + if self.round is not None and val is not None: + val = safe_round(val, self.round) + return val + + +class StopwatchMeter(Meter): + """Computes the sum/avg duration of some event in seconds""" + + def __init__(self, round: Optional[int] = None): + self.round = round + self.sum = 0 + self.n = 0 + self.start_time = None + + def start(self): + self.start_time = time.perf_counter() + + def stop(self, n=1, prehook=None): + if self.start_time is not None: + if prehook is not None: + prehook() + delta = time.perf_counter() - self.start_time + self.sum = self.sum + delta + self.n = type_as(self.n, n) + n + + def reset(self): + self.sum = 0 # cumulative time during which stopwatch was active + self.n = 0 # total n across all start/stop + self.start() + + def state_dict(self): + return { + "sum": self.sum, + "n": self.n, + "round": self.round, + } + + def load_state_dict(self, state_dict): + self.sum = state_dict["sum"] + self.n = state_dict["n"] + self.start_time = None + self.round = state_dict.get("round", None) + + @property + def avg(self): + return self.sum / self.n if self.n > 0 else self.sum + + @property + def elapsed_time(self): + if self.start_time is None: + return 0.0 + return time.perf_counter() - self.start_time + + @property + def smoothed_value(self) -> float: + val = self.avg if self.sum > 0 else self.elapsed_time + if self.round is not None and val is not None: + val = safe_round(val, self.round) + return val + + +class MetersDict(OrderedDict): + """A sorted dictionary of :class:`Meters`. + + Meters are sorted according to a priority that is given when the + meter is first added to the dictionary. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.priorities = [] + + def __setitem__(self, key, value): + assert key not in self, "MetersDict doesn't support reassignment" + priority, value = value + bisect.insort(self.priorities, (priority, len(self.priorities), key)) + super().__setitem__(key, value) + for _, _, key in self.priorities: # reorder dict to match priorities + self.move_to_end(key) + + def add_meter(self, key, meter, priority): + self.__setitem__(key, (priority, meter)) + + def state_dict(self): + return [ + (pri, key, self[key].__class__.__name__, self[key].state_dict()) + for pri, _, key in self.priorities + # can't serialize DerivedMeter instances + if not isinstance(self[key], MetersDict._DerivedMeter) + ] + + def load_state_dict(self, state_dict): + self.clear() + self.priorities.clear() + for pri, key, meter_cls, meter_state in state_dict: + meter = globals()[meter_cls]() + meter.load_state_dict(meter_state) + self.add_meter(key, meter, pri) + + def get_smoothed_value(self, key: str) -> float: + """Get a single smoothed value.""" + meter = self[key] + if isinstance(meter, MetersDict._DerivedMeter): + return meter.fn(self) + else: + return meter.smoothed_value + + def get_smoothed_values(self) -> Dict[str, float]: + """Get all smoothed values.""" + return OrderedDict( + [ + (key, self.get_smoothed_value(key)) + for key in self.keys() + if not key.startswith("_") + ] + ) + + def reset(self): + """Reset Meter instances.""" + for meter in self.values(): + if isinstance(meter, MetersDict._DerivedMeter): + continue + meter.reset() + + class _DerivedMeter(Meter): + """A Meter whose values are derived from other Meters.""" + + def __init__(self, fn): + self.fn = fn + + def reset(self): + pass diff --git a/SpeechT5/fairseq/fairseq/logging/metrics.py b/SpeechT5/fairseq/fairseq/logging/metrics.py new file mode 100644 index 0000000..58c2fb6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/logging/metrics.py @@ -0,0 +1,314 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +A standalone module for aggregating metrics. + +Metrics can be logged from anywhere using the `log_*` functions defined +in this module. The logged values will be aggregated dynamically based +on the aggregation context in which the logging occurs. See the +:func:`aggregate` context manager for more details. +""" + +import contextlib +import uuid +from collections import defaultdict +from typing import Callable, List, Optional + +from .meters import * + + +# Aggregation contexts are considered "active" when inside the scope +# created by the :func:`aggregate` context manager. +_aggregators = OrderedDict() +_active_aggregators = OrderedDict() +_active_aggregators_cnt = defaultdict(lambda: 0) + + +def reset() -> None: + """Reset all metrics aggregators.""" + _aggregators.clear() + _active_aggregators.clear() + _active_aggregators_cnt.clear() + + # The "default" aggregator observes all logged values. + _aggregators["default"] = MetersDict() + _active_aggregators["default"] = _aggregators["default"] + _active_aggregators_cnt["default"] = 1 + + +reset() + + +@contextlib.contextmanager +def aggregate(name: Optional[str] = None, new_root: bool = False): + """Context manager to aggregate metrics under a given name. + + Aggregations can be nested. If *new_root* is ``False``, then logged + metrics will be recorded along the entire stack of nested + aggregators, including a global "default" aggregator. If *new_root* + is ``True``, then this aggregator will be the root of a new + aggregation stack, thus bypassing any parent aggregators. + + Note that aggregation contexts are uniquely identified by their + *name* (e.g., train, valid). Creating a context with an existing + name will reuse the corresponding :class:`MetersDict` instance. + If no name is given, then a temporary aggregator will be created. + + Usage:: + + with metrics.aggregate("train"): + for step, batch in enumerate(epoch): + with metrics.aggregate("train_inner") as agg: + metrics.log_scalar("loss", get_loss(batch)) + if step % log_interval == 0: + print(agg.get_smoothed_value("loss")) + agg.reset() + print(metrics.get_smoothed_values("train")["loss"]) + + Args: + name (str): name of the aggregation. Defaults to a + random/temporary name if not given explicitly. + new_root (bool): make this aggregation the root of a new + aggregation stack. + """ + if name is None: + # generate a temporary name + name = str(uuid.uuid4()) + assert name not in _aggregators + agg = MetersDict() + else: + assert name != "default" + agg = _aggregators.setdefault(name, MetersDict()) + + if new_root: + backup_aggregators = _active_aggregators.copy() + _active_aggregators.clear() + backup_aggregators_cnt = _active_aggregators_cnt.copy() + _active_aggregators_cnt.clear() + + _active_aggregators[name] = agg + _active_aggregators_cnt[name] += 1 + + yield agg + + _active_aggregators_cnt[name] -= 1 + if _active_aggregators_cnt[name] == 0 and name in _active_aggregators: + del _active_aggregators[name] + + if new_root: + _active_aggregators.clear() + _active_aggregators.update(backup_aggregators) + _active_aggregators_cnt.clear() + _active_aggregators_cnt.update(backup_aggregators_cnt) + + +def get_active_aggregators() -> List[MetersDict]: + return list(_active_aggregators.values()) + + +def log_scalar( + key: str, + value: float, + weight: float = 1, + priority: int = 10, + round: Optional[int] = None, +): + """Log a scalar value. + + Args: + key (str): name of the field to log + value (float): value to log + weight (float): weight that this value contributes to the average. + A weight of 0 will always log the latest value. + priority (int): smaller values are logged earlier in the output + round (Optional[int]): number of digits to round to when displaying + """ + for agg in get_active_aggregators(): + if key not in agg: + agg.add_meter(key, AverageMeter(round=round), priority) + agg[key].update(value, weight) + +def log_scalar_sum( + key: str, + value: float, + priority: int = 10, + round: Optional[int] = None, +): + """Log a scalar value that is summed for reporting. + + Args: + key (str): name of the field to log + value (float): value to log + priority (int): smaller values are logged earlier in the output + round (Optional[int]): number of digits to round to when displaying + """ + for agg in get_active_aggregators(): + if key not in agg: + agg.add_meter(key, SumMeter(round=round), priority) + agg[key].update(value) + + +def log_derived(key: str, fn: Callable[[MetersDict], float], priority: int = 20): + """Log a scalar value derived from other meters. + + Args: + key (str): name of the field to log + fn (Callable[[MetersDict], float]): function that takes a single + argument *meters* and returns the derived value + priority (int): smaller values are logged earlier in the output + """ + for agg in get_active_aggregators(): + if key not in agg: + agg.add_meter(key, MetersDict._DerivedMeter(fn), priority) + + +def log_speed( + key: str, + value: float, + priority: int = 30, + round: Optional[int] = None, +): + """Log the rate of some quantity per second. + + Args: + key (str): name of the field to log + value (float): value to log + priority (int): smaller values are logged earlier in the output + round (Optional[int]): number of digits to round to when displaying + """ + for agg in get_active_aggregators(): + if key not in agg: + agg.add_meter(key, TimeMeter(round=round), priority) + agg[key].reset() # reset meter on the first call + else: + agg[key].update(value) + + +def log_start_time(key: str, priority: int = 40, round: Optional[int] = None): + """Log the duration of some event in seconds. + + The duration will be computed once :func:`log_stop_time` is called. + + Args: + key (str): name of the field to log + priority (int): smaller values are logged earlier in the output + round (Optional[int]): number of digits to round to when displaying + """ + for agg in get_active_aggregators(): + if key not in agg: + agg.add_meter(key, StopwatchMeter(round=round), priority) + agg[key].start() + + +def log_stop_time(key: str, weight: float = 0.0, prehook=None): + """Log the duration of some event in seconds. + + The duration will be computed since :func:`log_start_time` was called. + Set weight > 0 to report the average time instead of the sum. + + Args: + key (str): name of the field to log + weight (float): weight that this time contributes to the average + prehook (function, no arguments): will be called before the timer + is stopped. For example, use prehook=torch.cuda.synchronize to + make sure all gpu operations are done before timer is stopped. + """ + for agg in get_active_aggregators(): + if key in agg: + agg[key].stop(weight, prehook) + + +def log_custom( + new_meter_fn: Callable[[], Meter], + key: str, + *args, + priority: int = 50, + **kwargs, +): + """Log using a custom Meter. + + Any extra *args* or *kwargs* will be passed through to the Meter's + *update* method. + + Args: + new_meter_fn (Callable[[], Meter]): function that returns a new + Meter instance + key (str): name of the field to log + priority (int): smaller values are logged earlier in the output + """ + for agg in get_active_aggregators(): + if key not in agg: + agg.add_meter(key, new_meter_fn(), priority) + agg[key].update(*args, **kwargs) + + +def reset_meter(name: str, key: str) -> None: + """Reset Meter instance aggregated under a given *name* and *key*.""" + meter = get_meter(name, key) + if meter is not None: + meter.reset() + + +def reset_meters(name: str) -> None: + """Reset Meter instances aggregated under a given *name*.""" + meters = get_meters(name) + if meters is not None: + meters.reset() + + +def get_meter(name: str, key: str) -> Meter: + """Get a single Meter instance aggregated under *name* and *key*. + + Returns: + Meter or None if no metrics have been logged under *name* and *key*. + """ + if name not in _aggregators: + return None + return _aggregators[name].get(key, None) + + +def get_meters(name: str) -> MetersDict: + """Get Meter instances aggregated under a given *name*. + + Returns: + MetersDict or None if no metrics have been logged under *name*. + """ + return _aggregators.get(name, None) + + +def get_smoothed_value(name: str, key: str) -> float: + """Get a single smoothed value. + + Raises: + KeyError: if no metrics have been logged under *name* and *key*. + """ + return _aggregators[name].get_smoothed_value(key) + + +def get_smoothed_values(name: str) -> Dict[str, float]: + """Get smoothed values aggregated under a given *name*. + + Raises: + KeyError: if no metrics have been logged under *name*. + """ + return _aggregators[name].get_smoothed_values() + + +def state_dict(): + return OrderedDict([(name, agg.state_dict()) for name, agg in _aggregators.items()]) + + +def load_state_dict(state_dict): + for name, agg_state in state_dict.items(): + _aggregators[name] = MetersDict() + _aggregators[name].load_state_dict(agg_state) + + +def xla_metrics_report(): + try: + import torch_xla.debug.metrics as met + print(met.metrics_report()) + except ImportError: + return diff --git a/SpeechT5/fairseq/fairseq/logging/progress_bar.py b/SpeechT5/fairseq/fairseq/logging/progress_bar.py new file mode 100644 index 0000000..061082c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/logging/progress_bar.py @@ -0,0 +1,490 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Wrapper around various loggers and progress bars (e.g., tqdm). +""" + +import atexit +import json +import logging +import os +import sys +from collections import OrderedDict +from contextlib import contextmanager +from numbers import Number +from typing import Optional + +import torch + +from .meters import AverageMeter, StopwatchMeter, TimeMeter + + +logger = logging.getLogger(__name__) + + +def progress_bar( + iterator, + log_format: Optional[str] = None, + log_interval: int = 100, + log_file: Optional[str] = None, + epoch: Optional[int] = None, + prefix: Optional[str] = None, + tensorboard_logdir: Optional[str] = None, + default_log_format: str = "tqdm", + wandb_project: Optional[str] = None, + wandb_run_name: Optional[str] = None, + azureml_logging: Optional[bool] = False, +): + if log_format is None: + log_format = default_log_format + if log_file is not None: + handler = logging.FileHandler(filename=log_file) + logger.addHandler(handler) + + if log_format == "tqdm" and not sys.stderr.isatty(): + log_format = "simple" + + if log_format == "json": + bar = JsonProgressBar(iterator, epoch, prefix, log_interval) + elif log_format == "none": + bar = NoopProgressBar(iterator, epoch, prefix) + elif log_format == "simple": + bar = SimpleProgressBar(iterator, epoch, prefix, log_interval) + elif log_format == "tqdm": + bar = TqdmProgressBar(iterator, epoch, prefix) + else: + raise ValueError("Unknown log format: {}".format(log_format)) + + if tensorboard_logdir: + try: + # [FB only] custom wrapper for TensorBoard + import palaas # noqa + from .fb_tbmf_wrapper import FbTbmfWrapper + + bar = FbTbmfWrapper(bar, log_interval) + except ImportError: + bar = TensorboardProgressBarWrapper(bar, tensorboard_logdir) + + if wandb_project: + bar = WandBProgressBarWrapper(bar, wandb_project, run_name=wandb_run_name) + + if azureml_logging: + bar = AzureMLProgressBarWrapper(bar) + + return bar + + +def build_progress_bar( + args, + iterator, + epoch: Optional[int] = None, + prefix: Optional[str] = None, + default: str = "tqdm", + no_progress_bar: str = "none", +): + """Legacy wrapper that takes an argparse.Namespace.""" + if getattr(args, "no_progress_bar", False): + default = no_progress_bar + if getattr(args, "distributed_rank", 0) == 0: + tensorboard_logdir = getattr(args, "tensorboard_logdir", None) + else: + tensorboard_logdir = None + return progress_bar( + iterator, + log_format=args.log_format, + log_interval=args.log_interval, + epoch=epoch, + prefix=prefix, + tensorboard_logdir=tensorboard_logdir, + default_log_format=default, + ) + + +def format_stat(stat): + if isinstance(stat, Number): + stat = "{:g}".format(stat) + elif isinstance(stat, AverageMeter): + stat = "{:.3f}".format(stat.avg) + elif isinstance(stat, TimeMeter): + stat = "{:g}".format(round(stat.avg)) + elif isinstance(stat, StopwatchMeter): + stat = "{:g}".format(round(stat.sum)) + elif torch.is_tensor(stat): + stat = stat.tolist() + return stat + + +class BaseProgressBar(object): + """Abstract class for progress bars.""" + + def __init__(self, iterable, epoch=None, prefix=None): + self.iterable = iterable + self.n = getattr(iterable, "n", 0) + self.epoch = epoch + self.prefix = "" + if epoch is not None: + self.prefix += "epoch {:03d}".format(epoch) + if prefix is not None: + self.prefix += (" | " if self.prefix != "" else "") + prefix + + def __len__(self): + return len(self.iterable) + + def __enter__(self): + return self + + def __exit__(self, *exc): + return False + + def __iter__(self): + raise NotImplementedError + + def log(self, stats, tag=None, step=None): + """Log intermediate stats according to log_interval.""" + raise NotImplementedError + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats.""" + raise NotImplementedError + + def update_config(self, config): + """Log latest configuration.""" + pass + + def _str_commas(self, stats): + return ", ".join(key + "=" + stats[key].strip() for key in stats.keys()) + + def _str_pipes(self, stats): + return " | ".join(key + " " + stats[key].strip() for key in stats.keys()) + + def _format_stats(self, stats): + postfix = OrderedDict(stats) + # Preprocess stats according to datatype + for key in postfix.keys(): + postfix[key] = str(format_stat(postfix[key])) + return postfix + + +@contextmanager +def rename_logger(logger, new_name): + old_name = logger.name + if new_name is not None: + logger.name = new_name + yield logger + logger.name = old_name + + +class JsonProgressBar(BaseProgressBar): + """Log output in JSON format.""" + + def __init__(self, iterable, epoch=None, prefix=None, log_interval=1000): + super().__init__(iterable, epoch, prefix) + self.log_interval = log_interval + self.i = None + self.size = None + + def __iter__(self): + self.size = len(self.iterable) + for i, obj in enumerate(self.iterable, start=self.n): + self.i = i + yield obj + + def log(self, stats, tag=None, step=None): + """Log intermediate stats according to log_interval.""" + step = step or self.i or 0 + if step > 0 and self.log_interval is not None and step % self.log_interval == 0: + update = ( + self.epoch - 1 + (self.i + 1) / float(self.size) + if self.epoch is not None + else None + ) + stats = self._format_stats(stats, epoch=self.epoch, update=update) + with rename_logger(logger, tag): + logger.info(json.dumps(stats)) + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats.""" + self.stats = stats + if tag is not None: + self.stats = OrderedDict( + [(tag + "_" + k, v) for k, v in self.stats.items()] + ) + stats = self._format_stats(self.stats, epoch=self.epoch) + with rename_logger(logger, tag): + logger.info(json.dumps(stats)) + + def _format_stats(self, stats, epoch=None, update=None): + postfix = OrderedDict() + if epoch is not None: + postfix["epoch"] = epoch + if update is not None: + postfix["update"] = round(update, 3) + # Preprocess stats according to datatype + for key in stats.keys(): + postfix[key] = format_stat(stats[key]) + return postfix + + +class NoopProgressBar(BaseProgressBar): + """No logging.""" + + def __init__(self, iterable, epoch=None, prefix=None): + super().__init__(iterable, epoch, prefix) + + def __iter__(self): + for obj in self.iterable: + yield obj + + def log(self, stats, tag=None, step=None): + """Log intermediate stats according to log_interval.""" + pass + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats.""" + pass + + +class SimpleProgressBar(BaseProgressBar): + """A minimal logger for non-TTY environments.""" + + def __init__(self, iterable, epoch=None, prefix=None, log_interval=1000): + super().__init__(iterable, epoch, prefix) + self.log_interval = log_interval + self.i = None + self.size = None + + def __iter__(self): + self.size = len(self.iterable) + for i, obj in enumerate(self.iterable, start=self.n): + self.i = i + yield obj + + def log(self, stats, tag=None, step=None): + """Log intermediate stats according to log_interval.""" + step = step or self.i or 0 + if step > 0 and self.log_interval is not None and step % self.log_interval == 0: + stats = self._format_stats(stats) + postfix = self._str_commas(stats) + with rename_logger(logger, tag): + logger.info( + "{}: {:5d} / {:d} {}".format( + self.prefix, self.i + 1, self.size, postfix + ) + ) + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats.""" + postfix = self._str_pipes(self._format_stats(stats)) + with rename_logger(logger, tag): + logger.info("{} | {}".format(self.prefix, postfix)) + + +class TqdmProgressBar(BaseProgressBar): + """Log to tqdm.""" + + def __init__(self, iterable, epoch=None, prefix=None): + super().__init__(iterable, epoch, prefix) + from tqdm import tqdm + + self.tqdm = tqdm( + iterable, + self.prefix, + leave=False, + disable=(logger.getEffectiveLevel() > logging.INFO), + ) + + def __iter__(self): + return iter(self.tqdm) + + def log(self, stats, tag=None, step=None): + """Log intermediate stats according to log_interval.""" + self.tqdm.set_postfix(self._format_stats(stats), refresh=False) + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats.""" + postfix = self._str_pipes(self._format_stats(stats)) + with rename_logger(logger, tag): + logger.info("{} | {}".format(self.prefix, postfix)) + + +try: + _tensorboard_writers = {} + from torch.utils.tensorboard import SummaryWriter +except ImportError: + try: + from tensorboardX import SummaryWriter + except ImportError: + SummaryWriter = None + + +def _close_writers(): + for w in _tensorboard_writers.values(): + w.close() + + +atexit.register(_close_writers) + + +class TensorboardProgressBarWrapper(BaseProgressBar): + """Log to tensorboard.""" + + def __init__(self, wrapped_bar, tensorboard_logdir): + self.wrapped_bar = wrapped_bar + self.tensorboard_logdir = tensorboard_logdir + + if SummaryWriter is None: + logger.warning( + "tensorboard not found, please install with: pip install tensorboard" + ) + + def _writer(self, key): + if SummaryWriter is None: + return None + _writers = _tensorboard_writers + if key not in _writers: + _writers[key] = SummaryWriter(os.path.join(self.tensorboard_logdir, key)) + _writers[key].add_text("sys.argv", " ".join(sys.argv)) + return _writers[key] + + def __iter__(self): + return iter(self.wrapped_bar) + + def log(self, stats, tag=None, step=None): + """Log intermediate stats to tensorboard.""" + self._log_to_tensorboard(stats, tag, step) + self.wrapped_bar.log(stats, tag=tag, step=step) + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats.""" + self._log_to_tensorboard(stats, tag, step) + self.wrapped_bar.print(stats, tag=tag, step=step) + + def update_config(self, config): + """Log latest configuration.""" + # TODO add hparams to Tensorboard + self.wrapped_bar.update_config(config) + + def _log_to_tensorboard(self, stats, tag=None, step=None): + writer = self._writer(tag or "") + if writer is None: + return + if step is None: + step = stats["num_updates"] + for key in stats.keys() - {"num_updates"}: + if isinstance(stats[key], AverageMeter): + writer.add_scalar(key, stats[key].val, step) + elif isinstance(stats[key], Number): + writer.add_scalar(key, stats[key], step) + elif torch.is_tensor(stats[key]) and stats[key].numel() == 1: + writer.add_scalar(key, stats[key].item(), step) + writer.flush() + + +try: + import wandb +except ImportError: + wandb = None + + +class WandBProgressBarWrapper(BaseProgressBar): + """Log to Weights & Biases.""" + + def __init__(self, wrapped_bar, wandb_project, run_name=None): + self.wrapped_bar = wrapped_bar + if wandb is None: + logger.warning("wandb not found, pip install wandb") + return + + # reinit=False to ensure if wandb.init() is called multiple times + # within one process it still references the same run + wandb.init(project=wandb_project, reinit=False, name=run_name) + + def __iter__(self): + return iter(self.wrapped_bar) + + def log(self, stats, tag=None, step=None): + """Log intermediate stats to tensorboard.""" + self._log_to_wandb(stats, tag, step) + self.wrapped_bar.log(stats, tag=tag, step=step) + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats.""" + self._log_to_wandb(stats, tag, step) + self.wrapped_bar.print(stats, tag=tag, step=step) + + def update_config(self, config): + """Log latest configuration.""" + if wandb is not None: + wandb.config.update(config) + self.wrapped_bar.update_config(config) + + def _log_to_wandb(self, stats, tag=None, step=None): + if wandb is None: + return + if step is None: + step = stats["num_updates"] + + prefix = "" if tag is None else tag + "/" + + for key in stats.keys() - {"num_updates"}: + if isinstance(stats[key], AverageMeter): + wandb.log({prefix + key: stats[key].val}, step=step) + elif isinstance(stats[key], Number): + wandb.log({prefix + key: stats[key]}, step=step) + + +try: + from azureml.core import Run +except ImportError: + Run = None + + +class AzureMLProgressBarWrapper(BaseProgressBar): + """Log to Azure ML""" + + def __init__(self, wrapped_bar): + self.wrapped_bar = wrapped_bar + if Run is None: + logger.warning("azureml.core not found, pip install azureml-core") + return + self.run = Run.get_context() + + def __exit__(self, *exc): + if Run is not None: + self.run.complete() + return False + + def __iter__(self): + return iter(self.wrapped_bar) + + def log(self, stats, tag=None, step=None): + """Log intermediate stats to AzureML""" + self._log_to_azureml(stats, tag, step) + self.wrapped_bar.log(stats, tag=tag, step=step) + + def print(self, stats, tag=None, step=None): + """Print end-of-epoch stats""" + self._log_to_azureml(stats, tag, step) + self.wrapped_bar.print(stats, tag=tag, step=step) + + def update_config(self, config): + """Log latest configuration.""" + self.wrapped_bar.update_config(config) + + def _log_to_azureml(self, stats, tag=None, step=None): + if Run is None: + return + if step is None: + step = stats["num_updates"] + + prefix = "" if tag is None else tag + "/" + + for key in stats.keys() - {"num_updates"}: + name = prefix + key + if isinstance(stats[key], AverageMeter): + self.run.log_row(name=name, **{"step": step, key: stats[key].val}) + elif isinstance(stats[key], Number): + self.run.log_row(name=name, **{"step": step, key: stats[key]}) diff --git a/SpeechT5/fairseq/fairseq/model_parallel/__init__.py b/SpeechT5/fairseq/fairseq/model_parallel/__init__.py new file mode 100644 index 0000000..69f2168 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import criterions, models, modules # noqa diff --git a/SpeechT5/fairseq/fairseq/model_parallel/criterions/__init__.py b/SpeechT5/fairseq/fairseq/model_parallel/criterions/__init__.py new file mode 100644 index 0000000..5fae7bd --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/criterions/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import os + + +# automatically import any Python files in the criterions/ directory +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + module = file[: file.find(".py")] + importlib.import_module("fairseq.model_parallel.criterions." + module) diff --git a/SpeechT5/fairseq/fairseq/model_parallel/criterions/vocab_parallel_cross_entropy.py b/SpeechT5/fairseq/fairseq/model_parallel/criterions/vocab_parallel_cross_entropy.py new file mode 100644 index 0000000..35c50ee --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/criterions/vocab_parallel_cross_entropy.py @@ -0,0 +1,87 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion + + +try: + from fairseq.model_parallel.megatron.mpu.cross_entropy import ( + vocab_parallel_cross_entropy, + ) + + has_megatron_submodule = True +except (ImportError, ModuleNotFoundError): + has_megatron_submodule = False + + +@register_criterion("vocab_parallel_cross_entropy") +class VocabParallelCrossEntropyCriterion(FairseqCriterion): + def __init__(self, task, sentence_avg): + super().__init__(task) + self.sentence_avg = sentence_avg + if not has_megatron_submodule: + raise ImportError( + "\n\nPlease install the megatron submodule:" + "\n\n git submodule update --init " + "fairseq/model_parallel/megatron" + ) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(**sample["net_input"]) + target = sample["target"] + + loss = vocab_parallel_cross_entropy(net_output[0].float(), target) + loss = (loss * (target != self.padding_idx)).sum() + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + logging_output = { + "loss": utils.item(loss.data) if reduce else loss.data, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/fairseq/fairseq/model_parallel/megatron_trainer.py b/SpeechT5/fairseq/fairseq/model_parallel/megatron_trainer.py new file mode 100644 index 0000000..8ab4657 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/megatron_trainer.py @@ -0,0 +1,71 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Train a network across multiple GPUs. +""" + +from fairseq.dataclass.configs import FairseqConfig +from fairseq.distributed import utils as distributed_utils +from fairseq.trainer import Trainer + +try: + from fairseq.model_parallel.megatron.mpu import ( + get_data_parallel_rank, + get_data_parallel_world_size, + get_model_parallel_src_rank, + get_cuda_rng_tracker, + ) + + has_megatron_submodule = True +except (ImportError, ModuleNotFoundError): + has_megatron_submodule = False + + +class MegatronTrainer(Trainer): + """Main class for model parallel with data parallel training.""" + + def __init__(self, cfg: FairseqConfig, task, model, criterion, **kwargs): + if not has_megatron_submodule: + raise ImportError( + "\n\nPlease install the megatron submodule:" + "\n\n git submodule update --init " + "fairseq/model_parallel/megatron" + ) + super().__init__(cfg, task, model, criterion, **kwargs) + + def clip_grad_norm(self, clip_norm): + def _aggregate_model_parallel_grad_norm(total_norm): + total_norm = total_norm ** 2 + distributed_utils.all_reduce( + total_norm, group=distributed_utils.get_model_parallel_group() + ) + total_norm = total_norm ** 0.5 + return total_norm + + return self.optimizer.clip_grad_norm( + clip_norm, + aggregate_norm_fn=_aggregate_model_parallel_grad_norm, + ) + + def save_checkpoint(self, filename, extra_state): + """Save all training state in a checkpoint file.""" + extra_state['rng_tracker_states'] \ + = get_cuda_rng_tracker().get_states() + super().save_checkpoint(filename, extra_state) + + def load_checkpoint( + self, + filename, + reset_optimizer=False, + reset_lr_scheduler=False, + optimizer_overrides=None, + reset_meters=False, + ): + extra_state = super().load_checkpoint(filename, reset_optimizer=reset_optimizer, reset_lr_scheduler=reset_lr_scheduler, optimizer_overrides=optimizer_overrides, reset_meters=reset_meters) + if extra_state is not None and 'rng_tracker_states' in extra_state: + get_cuda_rng_tracker().set_states( + extra_state['rng_tracker_states']) + return extra_state diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/__init__.py b/SpeechT5/fairseq/fairseq/model_parallel/models/__init__.py new file mode 100644 index 0000000..3532479 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import os + + +# automatically import any Python files in the models/ directory +models_dir = os.path.dirname(__file__) +for file in os.listdir(models_dir): + path = os.path.join(models_dir, file) + if ( + not file.startswith("_") + and not file.startswith(".") + and (file.endswith(".py") or os.path.isdir(path)) + ): + model_name = file[: file.find(".py")] if file.endswith(".py") else file + module = importlib.import_module("fairseq.model_parallel.models." + model_name) diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/__init__.py b/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/__init__.py new file mode 100644 index 0000000..117827c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .model import * # noqa diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/layers.py b/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/layers.py new file mode 100644 index 0000000..eb81ded --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/layers.py @@ -0,0 +1,600 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from collections import namedtuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import options, utils +from fairseq.modules import ( + AdaptiveSoftmax, + LayerNorm, + MultiheadAttention, + PositionalEmbedding, +) + + +EncoderOut = namedtuple( + "TransformerEncoderOut", + [ + "encoder_out", # T x B x C + "encoder_padding_mask", # B x T + "encoder_embedding", # B x T x C + "encoder_states", # List[T x B x C] + ], +) + + +class TransformerEncoderEmbedding(nn.Module): + """ Encoder Embedding + Positional Embedding """ + + def __init__(self, args, embed_tokens): + super().__init__() + self.dropout = args.dropout + self.max_source_positions = args.max_source_positions + self.embed_tokens = embed_tokens + if isinstance(embed_tokens, nn.ModuleList): + self.padding_idx = embed_tokens[0].padding_idx + embed_dim = sum(e.embedding_dim for e in embed_tokens) + else: + self.padding_idx = embed_tokens.padding_idx + embed_dim = embed_tokens.embedding_dim + self.embed_scale = math.sqrt(embed_dim) + self.embed_positions = ( + PositionalEmbedding( + args.max_source_positions, + embed_dim, + self.padding_idx, + learned=args.encoder_learned_pos, + ) + if not args.no_token_positional_embeddings + else None + ) + if getattr(args, "layernorm_embedding", False): + self.layernorm_embedding = LayerNorm(embed_dim) + else: + self.layernorm_embedding = None + + def forward(self, input): + # embed tokens and positions + src_tokens = input[0] + prev_output_tokens = input[2] + if isinstance(self.embed_tokens, nn.ModuleList): + x_embed_list = [] + for embed_tokens_part in self.embed_tokens: + x_embed_list.append(embed_tokens_part(src_tokens)) + + embedded = torch.cat(x_embed_list, dim=-1) + else: + embedded = self.embed_tokens(src_tokens) + x = embed = self.embed_scale * embedded + if self.embed_positions is not None: + x = embed + self.embed_positions(src_tokens) + if self.layernorm_embedding: + x = self.layernorm_embedding(x) + x = F.dropout(x, p=self.dropout, training=self.training) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # compute padding mask + encoder_padding_mask = src_tokens.eq(self.padding_idx) + return (x, encoder_padding_mask, prev_output_tokens) + + +class TransformerEncoderLayerNorm(nn.Module): + """ + Layer norm at the the end of all encoder layers if + args.encoder_enormalize_before = True + """ + + def __init__(self, args, embed_dim): + super().__init__() + if args.encoder_normalize_before: + self.layer_norm = LayerNorm(embed_dim) + else: + self.layer_norm = None + + def forward(self, input): + x = input[0] + encoder_padding_mask = input[1] + prev_output_tokens = input[2] + if self.layer_norm: + x = self.layer_norm(x) + # keeping track of the incremental_state is not supported yet + return (x, encoder_padding_mask, prev_output_tokens) + + +class TransformerDecoderEmbedding(nn.Module): + """ Decoder Embedding + Positional Embedding """ + + def __init__(self, args, embed_tokens): + super().__init__() + self.dropout = args.dropout + self.share_input_output_embed = args.share_decoder_input_output_embed + input_embed_dim = ( + sum(e.embedding_dim for e in embed_tokens) + if isinstance(embed_tokens, nn.ModuleList) + else embed_tokens.embedding_dim + ) + embed_dim = args.decoder_embed_dim + self.output_embed_dim = args.decoder_output_dim + + padding_idx = ( + embed_tokens[0].padding_idx + if isinstance(embed_tokens, nn.ModuleList) + else embed_tokens.padding_idx + ) + self.max_target_positions = args.max_target_positions + + self.embed_tokens = embed_tokens + self.embed_scale = math.sqrt(embed_dim) # todo: try with input_embed_dim + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + + self.embed_positions = ( + PositionalEmbedding( + args.max_target_positions, + embed_dim, + padding_idx, + learned=args.decoder_learned_pos, + ) + if not args.no_token_positional_embeddings + else None + ) + + def forward(self, input): + mt_task = False + if isinstance(input, tuple): + if len(input) == 3: + encoder_out = input[0] + encoder_padding_mask = input[1] + prev_output_tokens = input[2] + incremental_state = None # Hardcoding to avoid passing of None objects + mt_task = True + else: + # HACK for now, need to fix (TODO sidgoyal) + prev_output_tokens = input[0] + # discard "src_lengths" + encoder_out = None + encoder_padding_mask = None + incremental_state = None + + else: + prev_output_tokens = input + encoder_out = None + encoder_padding_mask = None + incremental_state = None + + positions = ( + self.embed_positions( + prev_output_tokens, + incremental_state=incremental_state, + ) + if self.embed_positions is not None + else None + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + + if isinstance(self.embed_tokens, nn.ModuleList): + x_embed_list = [] + for embed_tokens_part in self.embed_tokens: + x_embed_list.append(embed_tokens_part(prev_output_tokens)) + + x = self.embed_scale * torch.cat(x_embed_list, dim=-1) + else: + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if mt_task: + return (x, encoder_out, encoder_padding_mask) + return x + + +class TransformerDecoderOutputLayer(nn.Module): + def __init__(self, args, embed_tokens, dictionary): + super().__init__() + self.share_input_output_embed = args.share_decoder_input_output_embed + self.embed_tokens = embed_tokens + self.output_embed_dim = args.decoder_output_dim + embed_dim = args.decoder_embed_dim + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not args.tie_adaptive_weights + else None + ) + self.adaptive_softmax = None + if args.adaptive_softmax_cutoff is not None: + assert not isinstance(embed_tokens, nn.ModuleList) + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + options.eval_str_list(args.adaptive_softmax_cutoff, type=int), + dropout=args.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if args.tie_adaptive_weights else None, + factor=args.adaptive_softmax_factor, + tie_proj=args.tie_adaptive_proj, + ) + elif not self.share_input_output_embed: + self.embed_tokens = nn.Parameter( + torch.Tensor(len(dictionary), self.output_embed_dim) + ) + nn.init.normal_( + self.embed_tokens, mean=0, std=self.output_embed_dim ** -0.5 + ) + + if args.decoder_normalize_before and not getattr( + args, "no_decoder_final_norm", False + ): + self.layer_norm = LayerNorm(embed_dim) + else: + self.layer_norm = None + + def forward(self, input, apply_final_proj=True): + if isinstance(input, tuple): + x = input[0] + else: + x = input + + if self.layer_norm: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + if apply_final_proj: + x = self.output_layer(x) + return x + + def output_layer(self, features, **kwargs): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + if self.share_input_output_embed: + if isinstance(self.embed_tokens, nn.ModuleList): + output = None + for i, emb in enumerate(self.embed_tokens): + sidx = i * emb.embedding_dim + eidx = (i + 1) * emb.embedding_dim + if output is None: + output = F.linear(features[:, :, sidx:eidx], emb.weight) + else: + output += F.linear(features[:, :, sidx:eidx], emb.weight) + + return output + else: + return F.linear(features, self.embed_tokens.weight) + else: + return F.linear(features, self.embed_tokens) + else: + return features + + +class TransformerEncoderLayer(nn.Module): + """Encoder layer block. + In the original paper each operation (multi-head attention or FFN) is + postprocessed with: `dropout -> add residual -> layernorm`. In the + tensor2tensor code they suggest that learning is more robust when + preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *args.encoder_normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + + def __init__(self, args): + super().__init__() + self.embed_dim = args.encoder_embed_dim + self.self_attn = MultiheadAttention( + self.embed_dim, + args.encoder_attention_heads, + dropout=args.attention_dropout, + self_attention=True, + ) + self.self_attn_layer_norm = LayerNorm(self.embed_dim) + self.dropout = args.dropout + self.activation_fn = utils.get_activation_fn( + activation=getattr(args, "activation_fn", "relu") + ) + self.activation_dropout = getattr(args, "activation_dropout", 0) + if self.activation_dropout == 0: + # for backwards compatibility with models that use args.relu_dropout + self.activation_dropout = getattr(args, "relu_dropout", 0) + self.normalize_before = args.encoder_normalize_before + self.fc1 = Linear(self.embed_dim, args.encoder_ffn_embed_dim) + self.fc2 = Linear(args.encoder_ffn_embed_dim, self.embed_dim) + self.final_layer_norm = LayerNorm(self.embed_dim) + + def upgrade_state_dict_named(self, state_dict, name): + """ + Rename layer norm states from `...layer_norms.0.weight` to + `...self_attn_layer_norm.weight` and `...layer_norms.1.weight` to + `...final_layer_norm.weight` + """ + layer_norm_map = {"0": "self_attn_layer_norm", "1": "final_layer_norm"} + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layer_norms.{}.{}".format(name, old, m) + if k in state_dict: + state_dict["{}.{}.{}".format(name, new, m)] = state_dict[k] + del state_dict[k] + + def forward(self, input): + """ + Args: + input (Tuple): + input[0] (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + input[1] (ByteTensor/FloatTensor): encoder padding mask - + binary ByteTensor of shape `(batch, src_len)` where padding elements + are indicated by ``1``. + input[2] (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing) + Returns: + output (Tuple): + output[0] (Tensor): encoded output of shape `(batch, src_len, embed_dim)` + output[1] (ByteTensor/FloatTensor): encoder padding mask + output[2] (LongTensor): previous decoder outputs + """ + x = input[0] + encoder_padding_mask = input[1] + prev_output_tokens = input[2] + residual = x + x = self.maybe_layer_norm(self.self_attn_layer_norm, x, before=True) + x, _ = self.self_attn( + query=x, key=x, value=x, key_padding_mask=encoder_padding_mask + ) + x = F.dropout(x, p=self.dropout, training=self.training) + x = residual + x + x = self.maybe_layer_norm(self.self_attn_layer_norm, x, after=True) + + residual = x + x = self.maybe_layer_norm(self.final_layer_norm, x, before=True) + x = self.activation_fn(self.fc1(x)) + x = F.dropout(x, p=self.activation_dropout, training=self.training) + x = self.fc2(x) + x = F.dropout(x, p=self.dropout, training=self.training) + x = residual + x + x = self.maybe_layer_norm(self.final_layer_norm, x, after=True) + return (x, encoder_padding_mask, prev_output_tokens) + + def maybe_layer_norm(self, layer_norm, x, before=False, after=False): + assert before ^ after + if after ^ self.normalize_before: + return layer_norm(x) + else: + return x + + +class TransformerDecoderLayer(nn.Module): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *args.decoder_normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, args, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False + ): + super().__init__() + self.embed_dim = args.decoder_embed_dim + self.self_attn = MultiheadAttention( + embed_dim=self.embed_dim, + num_heads=args.decoder_attention_heads, + dropout=args.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=True, + ) + self.dropout = args.dropout + self.activation_fn = utils.get_activation_fn( + activation=getattr(args, "activation_fn", "relu") + ) + self.activation_dropout = getattr(args, "activation_dropout", 0) + if self.activation_dropout == 0: + # for backwards compatibility with models that use args.relu_dropout + self.activation_dropout = getattr(args, "relu_dropout", 0) + self.normalize_before = args.decoder_normalize_before + + # use layerNorm rather than FusedLayerNorm for exporting. + # char_inputs can be used to determint this. + # TODO remove this once we update apex with the fix + export = getattr(args, "char_inputs", False) + self.self_attn_layer_norm = LayerNorm(self.embed_dim, export=export) + + if no_encoder_attn: + self.encoder_attn = None + self.encoder_attn_layer_norm = None + else: + self.encoder_attn = MultiheadAttention( + self.embed_dim, + args.decoder_attention_heads, + kdim=getattr(args, "encoder_embed_dim", None), + vdim=getattr(args, "encoder_embed_dim", None), + dropout=args.attention_dropout, + encoder_decoder_attention=True, + ) + self.encoder_attn_layer_norm = LayerNorm(self.embed_dim, export=export) + + self.fc1 = Linear(self.embed_dim, args.decoder_ffn_embed_dim) + self.fc2 = Linear(args.decoder_ffn_embed_dim, self.embed_dim) + + self.final_layer_norm = LayerNorm(self.embed_dim, export=export) + self.need_attn = True + + self.onnx_trace = False + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def forward(self, input): + """ + Args: + input (Tuple): + input[0] (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + input[1] (Tensor): encoder output of shape `(batch, src_len, embed_dim)` + input[2] (ByteTensor/FloatTensor): encoder padding mask - + binary ByteTensor of shape `(batch, src_len)` where padding elements + are indicated by ``1``. + Returns: + output (Tuple): + output[0] (Tensor): encoded output of shape `(batch, src_len, embed_dim)` + output[1] (ByteTensor/FloatTensor): encoder padding mask + output[2] (LongTensor): previous decoder outputs + """ + # Note: incremental state is not yet supported + mt_task = False + if isinstance(input, tuple): + x = input[0] + encoder_out = input[1] + encoder_padding_mask = input[2] + incremental_state = None + mt_task = True + else: + x = input + encoder_out = None + encoder_padding_mask = None + incremental_state = None + + if incremental_state is None: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + # TODO: add back prev_self_attn_state, prev_attn_state, + # self_attn_padding_mask + prev_self_attn_state = None + prev_attn_state = None + self_attn_padding_mask = None + + residual = x + x = self.maybe_layer_norm(self.self_attn_layer_norm, x, before=True) + if prev_self_attn_state is not None: + if incremental_state is None: + incremental_state = {} + prev_key, prev_value = prev_self_attn_state + saved_state = {"prev_key": prev_key, "prev_value": prev_value} + self.self_attn._set_input_buffer(incremental_state, saved_state) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + ) + x = F.dropout(x, p=self.dropout, training=self.training) + x = residual + x + x = self.maybe_layer_norm(self.self_attn_layer_norm, x, after=True) + + if self.encoder_attn is not None: + residual = x + x = self.maybe_layer_norm(self.encoder_attn_layer_norm, x, before=True) + if prev_attn_state is not None: + if incremental_state is None: + incremental_state = {} + prev_key, prev_value = prev_attn_state + saved_state = {"prev_key": prev_key, "prev_value": prev_value} + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=(not self.training and self.need_attn), + ) + x = F.dropout(x, p=self.dropout, training=self.training) + x = residual + x + x = self.maybe_layer_norm(self.encoder_attn_layer_norm, x, after=True) + + residual = x + x = self.maybe_layer_norm(self.final_layer_norm, x, before=True) + x = self.activation_fn(self.fc1(x)) + x = F.dropout(x, p=self.activation_dropout, training=self.training) + x = self.fc2(x) + x = F.dropout(x, p=self.dropout, training=self.training) + x = residual + x + x = self.maybe_layer_norm(self.final_layer_norm, x, after=True) + + if mt_task: + return (x, encoder_out, encoder_padding_mask) + return x + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + if ( + not hasattr(self, "_future_mask") + or self._future_mask is None + or self._future_mask.device != tensor.device + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(tensor.new(dim, dim)), 1 + ) + if self._future_mask.size(0) < dim: + self._future_mask = torch.triu( + utils.fill_with_neg_inf(self._future_mask.resize_(dim, dim)), 1 + ) + return self._future_mask[:dim, :dim] + + def maybe_layer_norm(self, layer_norm, x, before=False, after=False): + assert before ^ after + if after ^ self.normalize_before: + return layer_norm(x) + else: + return x + + def make_generation_fast_(self, need_attn=False, **kwargs): + self.need_attn = need_attn + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/model.py b/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/model.py new file mode 100644 index 0000000..7f30dd9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/pipeline_parallel_transformer/model.py @@ -0,0 +1,767 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.model_parallel.models.pipeline_parallel_transformer.layers import ( + Embedding, + TransformerDecoderEmbedding, + TransformerDecoderLayer, + TransformerDecoderOutputLayer, + TransformerEncoderEmbedding, + TransformerEncoderLayer, + TransformerEncoderLayerNorm, +) +from fairseq.models import ( + BaseFairseqModel, + FairseqDecoder, + FairseqEncoder, + register_model, + register_model_architecture, +) +from fairseq.models.fairseq_encoder import EncoderOut +from fairseq.models.transformer import ( + base_architecture, + transformer_iwslt_de_en, + transformer_wmt_en_de_big, +) +from fairseq.modules import SinusoidalPositionalEmbedding + + +logger = logging.getLogger(__name__) + + +DEFAULT_MAX_SOURCE_POSITIONS = 1024 +DEFAULT_MAX_TARGET_POSITIONS = 1024 +TORCH_PIPE = False +RPC_INIT = False + +def import_pipe(): + global TORCH_PIPE + global RPC_INIT + try: + from torch.distributed.pipeline.sync import Pipe # noqa + global Pipe + from torch.distributed.pipeline.sync.utils import partition_model + global partition_model + from torch.distributed import rpc + import tempfile + TORCH_PIPE = True + # Initialize single process RPC agent since TORCH_PIPE requires + # RRef. RRef depends on RPC being initialized and as a result we initialize + # RPC with a single node. + tmpfile = tempfile.NamedTemporaryFile() + if not RPC_INIT: + rpc.init_rpc( + name="worker", + rank=0, + world_size=1, + rpc_backend_options=rpc.TensorPipeRpcBackendOptions( + init_method="file://{}".format(tmpfile.name), + ) + ) + RPC_INIT = True + logger.info('Using torch pipe') + except ImportError: + try: + from fairscale.nn import Pipe # noqa + logger.info('Using fairscale pipe') + except ImportError: + raise ImportError("Please install fairscale with: pip install fairscale") + + +@register_model("pipeline_parallel_transformer") +class PipelineParallelTransformerModel(BaseFairseqModel): + def __init__(self, encoder, decoder, balance, devices, chunks, checkpoint): + import_pipe() + super().__init__() + assert isinstance(encoder, FairseqEncoder) + assert isinstance(decoder, FairseqDecoder) + encoder_module_list = ( + [encoder.embedding_layer] + + list(encoder.encoder_layers) + + [encoder.final_layer_norm] + ) + self.num_encoder_modules = len(encoder_module_list) + decoder_module_list = ( + [decoder.embedding_layer] + + list(decoder.decoder_layers) + + [decoder.decoder_output_layer] + ) + self.num_decoder_modules = len(decoder_module_list) + module_list = encoder_module_list + decoder_module_list + self.devices = devices + if TORCH_PIPE: + self.model = Pipe( + partition_model(nn.Sequential(*module_list), balance, devices), + chunks=chunks, + checkpoint=checkpoint, + ) + else: + self.model = Pipe( + nn.Sequential(*module_list), + balance=balance, + devices=devices, + chunks=chunks, + checkpoint=checkpoint, + ) + self.encoder_max_positions = self.max_positions_helper( + encoder.embedding_layer, "max_source_positions" + ) + self.decoder_max_positions = self.max_positions_helper( + decoder.embedding_layer, "max_target_positions" + ) + self.adaptive_softmax = getattr(decoder, "adaptive_softmax", None) + # Note: To be populated during inference + self.encoder = None + self.decoder = None + + def forward(self, src_tokens, src_lengths, prev_output_tokens): + if self.training: + input_lst = [src_tokens, src_lengths, prev_output_tokens] + input = tuple(i.to(self.devices[0], non_blocking=True) for i in input_lst) + if TORCH_PIPE: + return self.model(input).local_value() + else: + return self.model(input) + else: + assert self.encoder is not None and self.decoder is not None, ( + "encoder and decoder need to be initialized by " + + "calling the `prepare_for_inference_()` method" + ) + encoder_output_tuple = self.encoder(input) + return self.decoder(encoder_output_tuple) + + def prepare_for_inference_(self, cfg): + if self.encoder is not None and self.decoder is not None: + logger.info("Encoder and Decoder already initialized") + return + encoder_module_list = [] + decoder_module_list = [] + module_count = 0 + for partition in self.model.partitions: + for module in partition: + if module_count < self.num_encoder_modules: + encoder_module_list.append(module) + else: + decoder_module_list.append(module) + module_count += 1 + self.model = None + self.encoder = TransformerEncoder(cfg.distributed_training, None, None, encoder_module_list) + self.decoder = TransformerDecoder( + cfg.distributed_training, None, None, decoder_module_list=decoder_module_list + ) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--activation-fn', + choices=utils.get_available_activation_fns(), + help='activation function to use') + parser.add_argument('--dropout', type=float, metavar='D', + help='dropout probability') + parser.add_argument('--attention-dropout', type=float, metavar='D', + help='dropout probability for attention weights') + parser.add_argument('--activation-dropout', '--relu-dropout', type=float, metavar='D', + help='dropout probability after activation in FFN.') + parser.add_argument('--encoder-embed-path', type=str, metavar='STR', + help='path to pre-trained encoder embedding') + parser.add_argument('--encoder-embed-dim', type=int, metavar='N', + help='encoder embedding dimension') + parser.add_argument('--encoder-ffn-embed-dim', type=int, metavar='N', + help='encoder embedding dimension for FFN') + parser.add_argument('--encoder-layers', type=int, metavar='N', + help='num encoder layers') + parser.add_argument('--encoder-attention-heads', type=int, metavar='N', + help='num encoder attention heads') + parser.add_argument('--encoder-normalize-before', action='store_true', + help='apply layernorm before each encoder block') + parser.add_argument('--encoder-learned-pos', action='store_true', + help='use learned positional embeddings in the encoder') + parser.add_argument('--decoder-embed-path', type=str, metavar='STR', + help='path to pre-trained decoder embedding') + parser.add_argument('--decoder-embed-dim', type=int, metavar='N', + help='decoder embedding dimension') + parser.add_argument('--decoder-ffn-embed-dim', type=int, metavar='N', + help='decoder embedding dimension for FFN') + parser.add_argument('--decoder-layers', type=int, metavar='N', + help='num decoder layers') + parser.add_argument('--decoder-attention-heads', type=int, metavar='N', + help='num decoder attention heads') + parser.add_argument('--decoder-learned-pos', action='store_true', + help='use learned positional embeddings in the decoder') + parser.add_argument('--decoder-normalize-before', action='store_true', + help='apply layernorm before each decoder block') + parser.add_argument('--share-decoder-input-output-embed', action='store_true', + help='share decoder input and output embeddings') + parser.add_argument('--share-all-embeddings', action='store_true', + help='share encoder, decoder and output embeddings' + ' (requires shared dictionary and embed dim)') + parser.add_argument('--no-token-positional-embeddings', default=False, action='store_true', + help='if set, disables positional embeddings (outside self attention)') + parser.add_argument('--adaptive-softmax-cutoff', metavar='EXPR', + help='comma separated list of adaptive softmax cutoff points. ' + 'Must be used with adaptive_loss criterion'), + parser.add_argument('--adaptive-softmax-dropout', type=float, metavar='D', + help='sets adaptive softmax dropout for the tail projections') + parser.add_argument('--num-embedding-chunks', type=int, metavar='N', default=1, + help='Number of embedding layer chunks (enables more even distribution' + 'of optimizer states across data parallel nodes' + 'when using optimizer state sharding and' + 'a big embedding vocabulary)') + # fmt: on + + @classmethod + def build_model_base(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + if not hasattr(args, "max_source_positions"): + args.max_source_positions = DEFAULT_MAX_SOURCE_POSITIONS + if not hasattr(args, "max_target_positions"): + args.max_target_positions = DEFAULT_MAX_TARGET_POSITIONS + + src_dict, tgt_dict = task.source_dictionary, task.target_dictionary + + def build_embedding(dictionary, embed_dim, path=None, num_embed_chunks=1): + assert embed_dim % num_embed_chunks == 0, ( + f"Number of embedding chunks = {num_embed_chunks} should be " + + f"divisible by the embedding dimension = {embed_dim}" + ) + assert path is None or num_embed_chunks == 1, ( + "Loading embedding from a path with number of embedding chunks > 1" + + " is not yet supported" + ) + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + # if provided, load from preloaded dictionaries + if path: + emb = Embedding(num_embeddings, embed_dim, padding_idx) + embed_dict = utils.parse_embedding(path) + utils.load_embedding(embed_dict, dictionary, emb) + else: + embed_chunk_dim = embed_dim // num_embed_chunks + emb = nn.ModuleList() + for i in range(num_embed_chunks): + emb.append(Embedding(num_embeddings, embed_chunk_dim, padding_idx)) + return emb + + num_embed_chunks = args.num_embedding_chunks + if args.share_all_embeddings: + if src_dict != tgt_dict: + raise ValueError("--share-all-embeddings requires a joined dictionary") + if args.encoder_embed_dim != args.decoder_embed_dim: + raise ValueError( + "--share-all-embeddings requires --encoder-embed-dim to match --decoder-embed-dim" + ) + if args.decoder_embed_path and ( + args.decoder_embed_path != args.encoder_embed_path + ): + raise ValueError( + "--share-all-embeddings not compatible with --decoder-embed-path" + ) + encoder_embed_tokens = build_embedding( + src_dict, + args.encoder_embed_dim, + args.encoder_embed_path, + num_embed_chunks, + ) + decoder_embed_tokens = encoder_embed_tokens + args.share_decoder_input_output_embed = True + else: + assert args.share_decoder_input_output_embed or num_embed_chunks == 1, ( + "Not sharing decoder I/O embeddings is not yet supported with number of " + + "embedding chunks > 1" + ) + encoder_embed_tokens = build_embedding( + src_dict, + args.encoder_embed_dim, + args.encoder_embed_path, + num_embed_chunks, + ) + decoder_embed_tokens = build_embedding( + tgt_dict, + args.decoder_embed_dim, + args.decoder_embed_path, + num_embed_chunks, + ) + + encoder = cls.build_encoder(args, src_dict, encoder_embed_tokens) + decoder = cls.build_decoder(args, tgt_dict, decoder_embed_tokens) + return (encoder, decoder) + + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return TransformerEncoder(args, src_dict, embed_tokens) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + return TransformerDecoder(args, tgt_dict, embed_tokens) + + @classmethod + def build_model(cls, args, task): + encoder, decoder = cls.build_model_base(args, task) + return PipelineParallelTransformerModel( + encoder=encoder, + decoder=decoder, + balance=utils.eval_str_list(args.pipeline_balance, type=int), + devices=utils.eval_str_list(args.pipeline_devices, type=int), + chunks=args.pipeline_chunks, + checkpoint=args.pipeline_checkpoint, + ) + + def output_layer(self, features, **kwargs): + """Project features to the default output size (typically vocabulary size).""" + return self.decoder.output_layer(features, **kwargs) + + def max_positions(self): + """Maximum length supported by the model.""" + return (self.encoder_max_positions, self.decoder_max_positions) + + def max_positions_helper( + self, embedding_layer, max_positions_field="max_source_positions" + ): + """Maximum input length supported by the encoder or decoder.""" + if embedding_layer.embed_positions is None: + return getattr(embedding_layer, max_positions_field) + return min( + getattr(embedding_layer, max_positions_field), + embedding_layer.embed_positions.max_positions, + ) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + + if hasattr(self, "adaptive_softmax") and self.adaptive_softmax is not None: + if sample is not None: + assert "target" in sample + target = sample["target"] + else: + target = None + out = self.adaptive_softmax.get_log_prob(net_output, target=target) + return out.exp_() if not log_probs else out + + # A Pipe() module returns a tuple of tensors as the output. + # In this case, the tuple has one element - the output tensor of logits + logits = net_output if isinstance(net_output, torch.Tensor) else net_output[0] + if log_probs: + return utils.log_softmax(logits, dim=-1, onnx_trace=False) + else: + return utils.softmax(logits, dim=-1, onnx_trace=False) + + def max_decoder_positions(self): + """Maximum length supported by the decoder.""" + return self.decoder_max_positions + + def load_state_dict(self, state_dict, strict=True, model_cfg=None): + """Copies parameters and buffers from *state_dict* into this module and + its descendants. + + Overrides the method in :class:`nn.Module`. Compared with that method + this additionally "upgrades" *state_dicts* from old checkpoints. + """ + self.upgrade_state_dict(state_dict) + is_regular_transformer = not any("model.partitions" in k for k in state_dict) + if is_regular_transformer: + state_dict = self.convert_to_pipeline_parallel_state_dict(state_dict) + return super().load_state_dict(state_dict, strict) + + def convert_to_pipeline_parallel_state_dict(self, state_dict): + new_state_dict = self.state_dict() + encoder_layer_idx = 0 + decoder_layer_idx = 0 + encoder_key_suffixes = [ + "self_attn.k_proj.weight", + "self_attn.k_proj.bias", + "self_attn.v_proj.weight", + "self_attn.v_proj.bias", + "self_attn.q_proj.weight", + "self_attn.q_proj.bias", + "self_attn.out_proj.weight", + "self_attn.out_proj.bias", + "self_attn_layer_norm.weight", + "self_attn_layer_norm.bias", + "fc1.weight", + "fc1.bias", + "fc2.weight", + "fc2.bias", + "final_layer_norm.weight", + "final_layer_norm.bias", + ] + decoder_key_suffixes = [ + "self_attn.k_proj.weight", + "self_attn.k_proj.bias", + "self_attn.v_proj.weight", + "self_attn.v_proj.bias", + "self_attn.q_proj.weight", + "self_attn.q_proj.bias", + "self_attn.out_proj.weight", + "self_attn.out_proj.bias", + "self_attn_layer_norm.weight", + "self_attn_layer_norm.bias", + "encoder_attn.k_proj.weight", + "encoder_attn.k_proj.bias", + "encoder_attn.v_proj.weight", + "encoder_attn.v_proj.bias", + "encoder_attn.q_proj.weight", + "encoder_attn.q_proj.bias", + "encoder_attn.out_proj.weight", + "encoder_attn.out_proj.bias", + "encoder_attn_layer_norm.weight", + "encoder_attn_layer_norm.bias", + "fc1.weight", + "fc1.bias", + "fc2.weight", + "fc2.bias", + "final_layer_norm.weight", + "final_layer_norm.bias", + ] + for pid, partition in enumerate(self.model.partitions): + logger.info(f"Begin Partition {pid}") + for mid, module in enumerate(partition): + # fmt: off + if isinstance(module, TransformerEncoderEmbedding): + new_state_dict[f'model.partitions.{pid}.{mid}.embed_tokens.weight'] = state_dict['encoder.embed_tokens.weight'] + new_state_dict[f'model.partitions.{pid}.{mid}.embed_positions._float_tensor'] = state_dict['encoder.embed_positions._float_tensor'] + if isinstance(module, TransformerEncoderLayer): + for suffix in encoder_key_suffixes: + new_state_dict[f'model.partitions.{pid}.{mid}.{suffix}'] = state_dict[f'encoder.layers.{encoder_layer_idx}.{suffix}'] + encoder_layer_idx += 1 + if isinstance(module, TransformerDecoderLayer): + for suffix in decoder_key_suffixes: + new_state_dict[f'model.partitions.{pid}.{mid}.{suffix}'] = state_dict[f'decoder.layers.{decoder_layer_idx}.{suffix}'] + decoder_layer_idx += 1 + if isinstance(module, TransformerEncoderLayerNorm): + if 'encoder.layer_norm.weight' in state_dict: + new_state_dict[f'model.partitions.{pid}.{mid}.layer_norm.weight'] = state_dict['encoder.layer_norm.weight'] + new_state_dict[f'model.partitions.{pid}.{mid}.layer_norm.bias'] = state_dict['encoder.layer_norm.bias'] + if isinstance(module, TransformerDecoderEmbedding): + new_state_dict[f'model.partitions.{pid}.{mid}.embed_tokens.weight'] = state_dict['decoder.embed_tokens.weight'] + new_state_dict[f'model.partitions.{pid}.{mid}.embed_positions._float_tensor'] = state_dict['decoder.embed_positions._float_tensor'] + if isinstance(module, TransformerDecoderOutputLayer): + new_state_dict[f'model.partitions.{pid}.{mid}.output_projection.weight'] = state_dict['decoder.output_projection.weight'] + # fmt: on + return new_state_dict + + +class TransformerEncoder(FairseqEncoder): + """ + Transformer encoder consisting of *args.encoder_layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, args, dictionary, embed_tokens, encoder_module_list=None): + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + import_pipe() + self.use_pipeline = encoder_module_list is not None + if not self.use_pipeline: + self.embedding_layer = TransformerEncoderEmbedding(args, embed_tokens) + self.encoder_layers = nn.Sequential(*[TransformerEncoderLayer(args) for i in range(args.encoder_layers)]) + if isinstance(embed_tokens, nn.ModuleList): + emb_dim = sum(e.embedding_dim for e in embed_tokens) + else: + emb_dim = embed_tokens.embedding_dim + self.final_layer_norm = TransformerEncoderLayerNorm(args, emb_dim) + else: + encoder_balance = utils.eval_str_list( + args.pipeline_encoder_balance, type=int + ) + encoder_devices = utils.eval_str_list( + args.pipeline_encoder_devices, type=int + ) + assert sum(encoder_balance) == len(encoder_module_list), ( + f"Sum of encoder_balance={encoder_balance} is not equal " + + f"to num_encoder_modules={len(encoder_module_list)}" + ) + if TORCH_PIPE: + self.model = Pipe( + module=partition_model(nn.Sequential(*encoder_module_list), encoder_balance, encoder_devices), + chunks=args.pipeline_chunks, + checkpoint=args.pipeline_checkpoint, + ) + else: + self.model = Pipe( + module=nn.Sequential(*encoder_module_list), + balance=encoder_balance, + devices=encoder_devices, + chunks=args.pipeline_chunks, + checkpoint=args.pipeline_checkpoint, + ) + + def forward(self, src_tokens, src_lengths): + """ + Args: + input_tuple( + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + ) + + Returns: + output_tuple( + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - prev_output_tokens + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + ) + """ + dummy_prev_output_tokens = torch.zeros( + 1, dtype=src_tokens.dtype, device=src_tokens.device + ) + input_tuple = (src_tokens, src_lengths, dummy_prev_output_tokens) + if self.use_pipeline: + input_tuple = tuple(i.to(self.model.devices[0]) for i in input_tuple) + if TORCH_PIPE: + encoder_out = self.model(input_tuple).local_value() + else: + encoder_out = self.model(input_tuple) + else: + encoder_embed_output_tuple = self.embedding_layer(input_tuple) + encoder_layers_output = self.encoder_layers(encoder_embed_output_tuple) + encoder_out = self.final_layer_norm(encoder_layers_output) + # first element is the encoder output + # second element is the encoder padding mask + # the remaining elements of EncoderOut are not computed by + # the PipelineParallelTransformer + return EncoderOut(encoder_out[0], encoder_out[1], None, None, None, None) + + def reorder_encoder_out(self, encoder_out, new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if encoder_out.encoder_out is not None: + encoder_out = encoder_out._replace( + encoder_out=encoder_out.encoder_out.index_select(1, new_order) + ) + if encoder_out.encoder_padding_mask is not None: + encoder_out = encoder_out._replace( + encoder_padding_mask=encoder_out.encoder_padding_mask.index_select( + 0, new_order + ) + ) + if encoder_out.encoder_embedding is not None: + encoder_out = encoder_out._replace( + encoder_embedding=encoder_out.encoder_embedding.index_select( + 0, new_order + ) + ) + if encoder_out.encoder_states is not None: + for idx, state in enumerate(encoder_out.encoder_states): + encoder_out.encoder_states[idx] = state.index_select(1, new_order) + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + if self.embedding_layer.embed_positions is None: + return self.embedding_layer.max_source_positions + return min( + self.embedding_layer.max_source_positions, + self.embedding_layer.embed_positions.max_positions, + ) + + +class TransformerDecoder(FairseqDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + args, + dictionary, + embed_tokens, + no_encoder_attn=False, + decoder_module_list=None, + ): + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + import_pipe() + self.use_pipeline = decoder_module_list is not None + if not self.use_pipeline: + self.embedding_layer = TransformerDecoderEmbedding(args, embed_tokens) + self.decoder_layers = nn.Sequential(*[ + TransformerDecoderLayer(args, no_encoder_attn) + for _ in range(args.decoder_layers) + ]) + self.decoder_output_layer = TransformerDecoderOutputLayer( + args, embed_tokens, dictionary + ) + else: + decoder_balance = utils.eval_str_list( + args.pipeline_decoder_balance, type=int + ) + decoder_devices = utils.eval_str_list( + args.pipeline_decoder_devices, type=int + ) + assert sum(decoder_balance) == len(decoder_module_list), ( + f"Sum of decoder_balance={decoder_balance} is not equal " + + f"to num_decoder_modules={len(decoder_module_list)}" + ) + if TORCH_PIPE: + self.model = Pipe( + module=partition_model(nn.Sequential(*decoder_module_list), decoder_balance, decoder_devices), + chunks=args.pipeline_chunks, + checkpoint=args.pipeline_checkpoint, + ) + else: + self.model = Pipe( + module=nn.Sequential(*decoder_module_list), + balance=decoder_balance, + devices=decoder_devices, + chunks=args.pipeline_chunks, + checkpoint=args.pipeline_checkpoint, + ) + + def forward( + self, + prev_output_tokens, + encoder_out=None, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + input_tuple = ( + encoder_out.encoder_out, + encoder_out.encoder_padding_mask, + prev_output_tokens, + ) + if self.use_pipeline: + input_tuple = tuple(i.to(self.model.devices[0]) for i in input_tuple) + if TORCH_PIPE: + return (self.model(input_tuple).local_value(),) + else: + return (self.model(input_tuple),) + else: + embed_layer_output = self.embedding_layer(input_tuple) + state = self.decoder_layers(embed_layer_output) + return (self.decoder_output_layer(state),) + + def output_layer(self, features, **kwargs): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + if self.share_input_output_embed: + return F.linear(features, self.embed_tokens.weight) + else: + return F.linear(features, self.embed_out) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embedding_layer.embed_positions is None: + return self.embedding_layer.max_target_positions + return min( + self.embedding_layer.max_target_positions, + self.embedding_layer.embed_positions.max_positions, + ) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + if ( + not hasattr(self, "_future_mask") + or self._future_mask is None + or self._future_mask.device != tensor.device + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(tensor.new(dim, dim)), 1 + ) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + for i in range(len(self.layers)): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +@register_model_architecture( + "pipeline_parallel_transformer", "transformer_iwslt_de_en_pipeline_parallel" +) +def transformer_iwslt_de_en_dist(args): + transformer_iwslt_de_en(args) + + +@register_model_architecture( + "pipeline_parallel_transformer", "transformer_wmt_en_de_big_pipeline_parallel" +) +def transformer_wmt_en_de_big_dist(args): + transformer_wmt_en_de_big(args) diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/roberta/__init__.py b/SpeechT5/fairseq/fairseq/model_parallel/models/roberta/__init__.py new file mode 100644 index 0000000..117827c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/roberta/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .model import * # noqa diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/roberta/model.py b/SpeechT5/fairseq/fairseq/model_parallel/models/roberta/model.py new file mode 100644 index 0000000..77a80ef --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/roberta/model.py @@ -0,0 +1,225 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +RoBERTa: A Robustly Optimized BERT Pretraining Approach. +""" + +import logging + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.model_parallel.models.transformer import ModelParallelTransformerEncoder +from fairseq.models import register_model, register_model_architecture +from fairseq.models.roberta import ( + roberta_base_architecture, + roberta_prenorm_architecture, + RobertaEncoder, + RobertaModel, +) +from fairseq.modules import LayerNorm + + +try: + from fairseq.model_parallel.megatron.mpu import ( + copy_to_model_parallel_region, + gather_from_model_parallel_region, + ColumnParallelLinear, + VocabParallelEmbedding, + ) + + has_megatron_submodule = True +except (ImportError, ModuleNotFoundError): + has_megatron_submodule = False + +logger = logging.getLogger(__name__) + + +@register_model("model_parallel_roberta") +class ModelParallelRobertaModel(RobertaModel): + def __init__(self, args, encoder): + super().__init__(args, encoder) + + self.classification_heads = nn.ModuleDict() + + @staticmethod + def add_args(parser): + RobertaModel.add_args(parser) + parser.add_argument( + "--no-final-layer-norm", + action="store_true", + help=( + "don't add final layernorm (only applicable when " + "--encoder-normalize-before=True" + ), + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present + base_architecture(args) + + task.source_dictionary.pad_to_multiple_(args.model_parallel_size * 8) + task.target_dictionary.pad_to_multiple_(args.model_parallel_size * 8) + + if not hasattr(args, "max_positions"): + args.max_positions = args.tokens_per_sample + + if getattr(args, "untie_weights_roberta", False): + raise NotImplementedError( + "--untie-weights-roberta is not supported in model parallel mode" + ) + + encoder = ModelParallelRobertaEncoder(args, task.source_dictionary) + return cls(args, encoder) + + def forward( + self, + src_tokens, + features_only=False, + return_all_hiddens=False, + classification_head_name=None, + **kwargs + ): + if classification_head_name is not None: + features_only = True + + x, extra = self.encoder(src_tokens, features_only, return_all_hiddens, **kwargs) + + if classification_head_name is not None: + x = self.classification_heads[classification_head_name](x) + return x, extra + + def register_classification_head( + self, name, num_classes=None, inner_dim=None, **kwargs + ): + """Register a classification head.""" + if name in self.classification_heads: + prev_num_classes = self.classification_heads[name].out_proj.out_features + prev_inner_dim = self.classification_heads[name].dense.out_features + if num_classes != prev_num_classes or inner_dim != prev_inner_dim: + logger.warning( + 're-registering head "{}" with num_classes {} (prev: {}) ' + "and inner_dim {} (prev: {})".format( + name, num_classes, prev_num_classes, inner_dim, prev_inner_dim + ) + ) + self.classification_heads[name] = ModelParallelRobertaClassificationHead( + self.args.encoder_embed_dim, + inner_dim or self.args.encoder_embed_dim, + num_classes, + self.args.pooler_activation_fn, + self.args.pooler_dropout, + ) + + +class ModelParallelRobertaLMHead(nn.Module): + """Head for masked language modeling.""" + + def __init__(self, embed_dim, output_dim, activation_fn, weight=None): + super().__init__() + self.dense = ColumnParallelLinear(embed_dim, embed_dim, gather_output=True) + self.activation_fn = utils.get_activation_fn(activation_fn) + self.layer_norm = LayerNorm(embed_dim) + + if weight is None: + weight = nn.Linear(embed_dim, output_dim, bias=False).weight + self.weight = weight + self.bias = nn.Parameter(torch.zeros(output_dim)) + + def forward(self, features, masked_tokens=None, **kwargs): + # Only project the unmasked tokens while training, + # saves both memory and computation + if masked_tokens is not None: + features = features[masked_tokens, :] + + x = self.dense(features) + x = self.activation_fn(x) + x = self.layer_norm(x) + + x = copy_to_model_parallel_region(x) + # project back to size of vocabulary with bias + x = F.linear(x, self.weight) + x = gather_from_model_parallel_region(x).contiguous() + x = x + self.bias + return x + + +class ModelParallelRobertaClassificationHead(nn.Module): + """Head for sentence-level classification tasks.""" + + def __init__( + self, input_dim, inner_dim, num_classes, activation_fn, pooler_dropout + ): + super().__init__() + self.dense = ColumnParallelLinear(input_dim, inner_dim, gather_output=True) + self.activation_fn = utils.get_activation_fn(activation_fn) + self.dropout = nn.Dropout(p=pooler_dropout) + self.out_proj = nn.Linear(inner_dim, num_classes) + + def forward(self, features, **kwargs): + x = features[:, 0, :] # take <s> token (equiv. to [CLS]) + x = self.dropout(x) + x = self.dense(x) + x = self.activation_fn(x) + x = self.dropout(x) + x = self.out_proj(x) + return x + + +class ModelParallelRobertaEncoder(RobertaEncoder): + """RoBERTa encoder.""" + + def __init__(self, args, dictionary): + super().__init__(args, dictionary) + assert not self.args.untie_weights_roberta + + def build_embedding(self, vocab_size, embedding_dim, padding_idx): + return VocabParallelEmbedding(vocab_size, embedding_dim, padding_idx) + + def build_encoder(self, args, dictionary, embed_tokens): + return ModelParallelTransformerEncoder(args, dictionary, embed_tokens) + + def build_lm_head(self, embed_dim, output_dim, activation_fn, weight): + return ModelParallelRobertaLMHead(embed_dim, output_dim, activation_fn, weight) + + +@register_model_architecture("model_parallel_roberta", "model_parallel_roberta") +def base_architecture(args): + args.no_final_layer_norm = getattr(args, "no_final_layer_norm", False) + # model parallel RoBERTa defaults to "Pre-LN" formulation + roberta_prenorm_architecture(args) + + +# earlier versions of model parallel RoBERTa removed the final layer norm +@register_model_architecture("model_parallel_roberta", "model_parallel_roberta_v1") +def model_parallel_roberta_v1_architecture(args): + args.no_final_layer_norm = getattr(args, "no_final_layer_norm", True) + base_architecture(args) + + +@register_model_architecture( + "model_parallel_roberta", "model_parallel_roberta_postnorm" +) +def model_parallel_roberta_postnorm_architecture(args): + # the original BERT/RoBERTa uses the "Post-LN" formulation + roberta_base_architecture(args) + + +@register_model_architecture("model_parallel_roberta", "model_parallel_roberta_base") +def model_parallel_roberta_base_architecture(args): + base_architecture(args) + + +@register_model_architecture("model_parallel_roberta", "model_parallel_roberta_large") +def model_parallel_roberta_large_architecture(args): + args.encoder_layers = getattr(args, "encoder_layers", 24) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/transformer.py b/SpeechT5/fairseq/fairseq/model_parallel/models/transformer.py new file mode 100644 index 0000000..6b330ef --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/transformer.py @@ -0,0 +1,121 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import torch.nn as nn +from fairseq.model_parallel.modules import ( + ModelParallelTransformerDecoderLayer, + ModelParallelTransformerEncoderLayer, +) +from fairseq.models import register_model +from fairseq.models.transformer import ( + TransformerDecoder, + TransformerEncoder, + TransformerModel, +) + + +try: + from fairseq.model_parallel.megatron.mpu import ( + copy_to_model_parallel_region, + gather_from_model_parallel_region, + VocabParallelEmbedding, + ) + + has_megatron_submodule = True +except (ImportError, ModuleNotFoundError): + has_megatron_submodule = False + + +logger = logging.getLogger(__name__) + + +@register_model("model_parallel_transformer") +class ModelParallelTransformerModel(TransformerModel): + """ + Model parallel Transformer model. + """ + + @classmethod + def build_embedding(cls, args, dictionary, embed_dim, path=None): + if not has_megatron_submodule: + raise ImportError( + "\n\nPlease install the megatron submodule:" + "\n\n git submodule update --init " + "fairseq/model_parallel/megatron" + ) + dictionary.pad_to_multiple_(args.model_parallel_size * 8) + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + + def _vocab_init(tensor, **kwargs): + nn.init.normal_(tensor, mean=0, std=num_embeddings ** -0.5) + nn.init.constant_(tensor[1], 0) + + emb = VocabParallelEmbedding( + num_embeddings, embed_dim, padding_idx, init_method=_vocab_init + ) + # if provided, load from preloaded dictionaries + if path: + raise NotImplementedError( + "Loading of embedding from path is not supported for model parallel" + ) + return emb + + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return ModelParallelTransformerEncoder(args, src_dict, embed_tokens) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + return ModelParallelTransformerDecoder( + args, + tgt_dict, + embed_tokens, + no_encoder_attn=getattr(args, "no_cross_attention", False), + ) + + +class ModelParallelTransformerEncoder(TransformerEncoder): + """ + Model parallel Transformer encoder consisting of *args.encoder_layers* layers. Each layer + is a :class:`ModelParallelTransformerEncoderLayer`. + """ + + def __init__(self, args, dictionary, embed_tokens): + super().__init__(args, dictionary, embed_tokens) + + if args.no_final_layer_norm: + self.layer_norm = None + + def build_encoder_layer(self, args): + return ModelParallelTransformerEncoderLayer(args) + + +class ModelParallelTransformerDecoder(TransformerDecoder): + """ + Model Parallel Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`ModelParallelTransformerDecoderLayer`. + """ + + def build_decoder_layer(self, args, no_encoder_attn=False): + return ModelParallelTransformerDecoderLayer(args, no_encoder_attn) + + def output_layer(self, features, **kwargs): + """Project features to the vocabulary size.""" + if not self.share_input_output_embed: + raise NotImplementedError( + "Model parallel training currently requires --share-decoder-input-output-embed" + ) + + features = copy_to_model_parallel_region(features) + + # project back to size of vocabulary + x = self.output_projection(features) + + if getattr(self.args, "criterion") != "vocab_parallel_cross_entropy": + x = gather_from_model_parallel_region(x).contiguous() + return x diff --git a/SpeechT5/fairseq/fairseq/model_parallel/models/transformer_lm.py b/SpeechT5/fairseq/fairseq/model_parallel/models/transformer_lm.py new file mode 100644 index 0000000..dc52f6e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/models/transformer_lm.py @@ -0,0 +1,174 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.nn as nn +from fairseq.model_parallel.models.transformer import ModelParallelTransformerDecoder +from fairseq.models import register_model, register_model_architecture +from fairseq.models.transformer_lm import TransformerLanguageModel + + +try: + from fairseq.model_parallel.megatron.mpu import VocabParallelEmbedding + + has_megatron_submodule = True +except (ImportError, ModuleNotFoundError): + has_megatron_submodule = False + + +DEFAULT_MAX_TARGET_POSITIONS = 1024 + + +@register_model("model_parallel_transformer_lm") +class ModelParallelTransformerLanguageModel(TransformerLanguageModel): + + @staticmethod + def add_args(parser): + TransformerLanguageModel.add_args(parser) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + if not has_megatron_submodule: + raise ImportError( + "\n\nPlease install the megatron submodule:" + "\n\n git submodule update --init " + "fairseq/model_parallel/megatron" + ) + + # make sure all arguments are present in older models + base_lm_architecture(args) + + task.source_dictionary.pad_to_multiple_(args.model_parallel_size * 8) + task.target_dictionary.pad_to_multiple_(args.model_parallel_size * 8) + + if args.decoder_layers_to_keep: + args.decoder_layers = len(args.decoder_layers_to_keep.split(",")) + + if getattr(args, "max_target_positions", None) is None: + args.max_target_positions = getattr( + args, "tokens_per_sample", DEFAULT_MAX_TARGET_POSITIONS + ) + + if args.character_embeddings: + raise NotImplementedError( + "Character embeddings is not supported for model parallel" + ) + elif args.adaptive_input: + raise NotImplementedError( + "Adaptive input is not supported for model parallel" + ) + else: + embed_tokens = cls.build_embedding( + args, task.source_dictionary, args.decoder_input_dim + ) + + decoder = ModelParallelTransformerDecoder( + args, + task.target_dictionary, + embed_tokens, + no_encoder_attn=True, + ) + return cls(decoder) + + @staticmethod + def add_args(parser): + TransformerLanguageModel.add_args(parser) + + @classmethod + def build_embedding(cls, args, dictionary, embed_dim, path=None): + def _vocab_init(tensor, **kwargs): + nn.init.normal_(tensor, mean=0, std=embed_dim ** -0.5) + nn.init.constant_(tensor[1], 0) + + embed_tokens = VocabParallelEmbedding( + len(dictionary), embed_dim, dictionary.pad(), init_method=_vocab_init + ) + return embed_tokens + + +def base_lm_architecture(args): + # backward compatibility for older model checkpoints + if hasattr(args, "no_tie_adaptive_proj"): + # previous models defined --no-tie-adaptive-proj, so use the existence of + # that option to determine if this is an "old" model checkpoint + args.no_decoder_final_norm = True # old models always set this to True + if args.no_tie_adaptive_proj is False: + args.tie_adaptive_proj = True + if hasattr(args, "decoder_final_norm"): + args.no_decoder_final_norm = not args.decoder_final_norm + + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.relu_dropout = getattr(args, "relu_dropout", 0.0) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 2048) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + # Model training is not stable without this + args.decoder_normalize_before = True + args.no_decoder_final_norm = getattr(args, "no_decoder_final_norm", False) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.adaptive_softmax_factor = getattr(args, "adaptive_softmax_factor", 4) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.character_embeddings = getattr(args, "character_embeddings", False) + args.character_filters = getattr( + args, + "character_filters", + "[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]", + ) + args.character_embedding_dim = getattr(args, "character_embedding_dim", 4) + args.char_embedder_highway_layers = getattr(args, "char_embedder_highway_layers", 2) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.adaptive_input_factor = getattr(args, "adaptive_input_factor", 4) + args.adaptive_input_cutoff = getattr(args, "adaptive_input_cutoff", None) + args.tie_adaptive_weights = getattr(args, "tie_adaptive_weights", False) + args.tie_adaptive_proj = getattr(args, "tie_adaptive_proj", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0.0) + args.decoder_layers_to_keep = getattr(args, "decoder_layers_to_keep", None) + args.layernorm_embedding = getattr(args, "layernorm_embedding", False) + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + args.quant_noise_pq = getattr(args, "quant_noise_pq", 0.0) + args.quant_noise_pq_block_size = getattr(args, "quant_noise_pq_block_size", 8) + args.quant_noise_scalar = getattr(args, "quant_noise_scalar", 0.0) + args.add_bos_token = getattr(args, "add_bos_token", False) + + +@register_model_architecture("model_parallel_transformer_lm", "transformer_lm_megatron") +def transformer_lm_megatron(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 3072) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 3072 * 4) + args.decoder_layers = getattr(args, "decoder_layers", 72) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 32) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) + + +@register_model_architecture( + "model_parallel_transformer_lm", "transformer_lm_megatron_11b" +) +def transformer_lm_megatron_11b(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 3072) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 3072 * 6) + args.decoder_layers = getattr(args, "decoder_layers", 72) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 32) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/model_parallel/modules/__init__.py b/SpeechT5/fairseq/fairseq/model_parallel/modules/__init__.py new file mode 100644 index 0000000..1160321 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/modules/__init__.py @@ -0,0 +1,17 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +from .multihead_attention import ModelParallelMultiheadAttention +from .transformer_layer import ( + ModelParallelTransformerEncoderLayer, + ModelParallelTransformerDecoderLayer, +) + +__all__ = [ + "ModelParallelMultiheadAttention", + "ModelParallelTransformerEncoderLayer", + "ModelParallelTransformerDecoderLayer", +] diff --git a/SpeechT5/fairseq/fairseq/model_parallel/modules/multihead_attention.py b/SpeechT5/fairseq/fairseq/model_parallel/modules/multihead_attention.py new file mode 100644 index 0000000..8eb9d09 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/modules/multihead_attention.py @@ -0,0 +1,349 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.fairseq_dropout import FairseqDropout +from torch import Tensor, nn + + +try: + from fairseq.model_parallel.megatron.mpu import ( + get_cuda_rng_tracker, + get_model_parallel_world_size, + ColumnParallelLinear, + RowParallelLinear, + ) + + has_megatron_submodule = True +except (ImportError, ModuleNotFoundError): + has_megatron_submodule = False + + +@with_incremental_state +class ModelParallelMultiheadAttention(nn.Module): + """Model parallel Multi-headed attention. + This performs the Multi-headed attention over multiple gpus. + + See "Megatron-LM: https://arxiv.org/pdf/1909.08053.pdf" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + self_attention=False, + encoder_decoder_attention=False, + ): + super().__init__() + if not has_megatron_submodule: + raise ImportError( + "\n\nPlease install the megatron submodule:" + "\n\n git submodule update --init " + "fairseq/model_parallel/megatron" + ) + self.embed_dim = embed_dim + self.kdim = kdim if kdim is not None else embed_dim + self.vdim = vdim if vdim is not None else embed_dim + self.qkv_same_dim = self.kdim == embed_dim and self.vdim == embed_dim + + self.model_parallel_size = get_model_parallel_world_size() + + self.num_heads_partition = num_heads // self.model_parallel_size + assert ( + self.num_heads_partition * self.model_parallel_size == num_heads + ), "Number of heads must be divisible by model parallel size" + + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.head_dim = embed_dim // num_heads + assert ( + self.head_dim * num_heads == self.embed_dim + ), "embed_dim must be divisible by num_heads" + self.scaling = self.head_dim ** -0.5 + + self.self_attention = self_attention + self.encoder_decoder_attention = encoder_decoder_attention + + assert ( + not self.self_attention or self.qkv_same_dim + ), "Self-attention requires query, key and value to be of the same size" + + self.k_proj = ColumnParallelLinear( + self.kdim, embed_dim, bias=bias, gather_output=False + ) + self.v_proj = ColumnParallelLinear( + self.vdim, embed_dim, bias=bias, gather_output=False + ) + self.q_proj = ColumnParallelLinear( + embed_dim, embed_dim, bias=bias, gather_output=False + ) + self.out_proj = RowParallelLinear( + embed_dim, embed_dim, bias=bias, input_is_parallel=True + ) + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + **unused_kwargs, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + """ + tgt_len, bsz, embed_dim = query.size() + assert embed_dim == self.embed_dim + assert list(query.size()) == [tgt_len, bsz, embed_dim] + + is_tpu = query.device.type == "xla" + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads_partition, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads_partition, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads_partition, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads_partition, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view( + bsz * self.num_heads_partition, -1, self.head_dim + ) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view( + bsz * self.num_heads_partition, -1, self.head_dim + ) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = ( + ModelParallelMultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + ) + + saved_state["prev_key"] = k.view( + bsz, self.num_heads_partition, -1, self.head_dim + ) + saved_state["prev_value"] = v.view( + bsz, self.num_heads_partition, -1, self.head_dim + ) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + src_len = k.size(1) + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + + assert list(attn_weights.size()) == [ + bsz * self.num_heads_partition, + tgt_len, + src_len, + ] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view( + bsz, self.num_heads_partition, tgt_len, src_len + ) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view( + bsz * self.num_heads_partition, tgt_len, src_len + ) + + attn_weights_float = utils.softmax(attn_weights, dim=-1) + attn_weights = attn_weights_float.type_as(attn_weights) + + with get_cuda_rng_tracker().fork(): + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [ + bsz * self.num_heads_partition, + tgt_len, + self.head_dim, + ] + embed_dim_partition = embed_dim // self.model_parallel_size + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim_partition) + attn = self.out_proj(attn) + # return attn_weights None to keep the return type same as single gpu multihead attention + # This will be deprecated. + attn_weights: Optional[Tensor] = None + + return attn, attn_weights + + @staticmethod + def _append_prev_key_padding_mask( + key_padding_mask: Optional[Tensor], + prev_key_padding_mask: Optional[Tensor], + batch_size: int, + src_len: int, + static_kv: bool, + ) -> Optional[Tensor]: + # saved key padding masks have shape (bsz, seq_len) + if prev_key_padding_mask is not None and static_kv: + new_key_padding_mask = prev_key_padding_mask + elif prev_key_padding_mask is not None and key_padding_mask is not None: + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), key_padding_mask.float()], dim=1 + ) + # During incremental decoding, as the padding token enters and + # leaves the frame, there will be a time when prev or current + # is None + elif prev_key_padding_mask is not None: + + filler = torch.zeros(batch_size, src_len - prev_key_padding_mask.size(1)) + if prev_key_padding_mask.is_cuda: + filler = filler.cuda() + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), filler.float()], dim=1 + ) + elif key_padding_mask is not None: + filler = torch.zeros(batch_size, src_len - key_padding_mask.size(1)) + if key_padding_mask.is_cuda: + filler = filler.cuda() + new_key_padding_mask = torch.cat( + [filler.float(), key_padding_mask.float()], dim=1 + ) + else: + new_key_padding_mask = prev_key_padding_mask + return new_key_padding_mask + + def reorder_incremental_state( + self, incremental_state: Dict[str, Dict[str, Optional[Tensor]]], new_order + ): + """Reorder buffered internal state (for incremental generation).""" + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + for k in input_buffer.keys(): + if input_buffer[k] is not None: + input_buffer[k] = input_buffer[k].index_select(0, new_order) + incremental_state = self._set_input_buffer(incremental_state, input_buffer) + return incremental_state + + def _get_input_buffer( + self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ) -> Dict[str, Optional[Tensor]]: + result = self.get_incremental_state(incremental_state, "attn_state") + if result is not None: + return result + else: + empty_result: Dict[str, Optional[Tensor]] = {} + return empty_result + + def _set_input_buffer( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + buffer: Dict[str, Optional[Tensor]], + ): + return self.set_incremental_state(incremental_state, "attn_state", buffer) diff --git a/SpeechT5/fairseq/fairseq/model_parallel/modules/transformer_layer.py b/SpeechT5/fairseq/fairseq/model_parallel/modules/transformer_layer.py new file mode 100644 index 0000000..7ab53c6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/model_parallel/modules/transformer_layer.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.model_parallel.modules import ModelParallelMultiheadAttention +from fairseq.modules import TransformerDecoderLayer, TransformerEncoderLayer + + +try: + from fairseq.model_parallel.megatron.mpu import ( + ColumnParallelLinear, + RowParallelLinear, + ) + + has_megatron_submodule = True +except (ImportError, ModuleNotFoundError): + has_megatron_submodule = False + + +class ModelParallelTransformerEncoderLayer(TransformerEncoderLayer): + """Encoder layer block over multiple gpus. + + See "Megatron-LM: https://arxiv.org/pdf/1909.08053.pdf" for more details. + """ + + def build_fc1(self, input_dim, output_dim, q_noise, qn_block_size): + if q_noise > 0: + raise NotImplementedError + return ColumnParallelLinear(input_dim, output_dim, gather_output=False) + + def build_fc2(self, input_dim, output_dim, q_noise, qn_block_size): + if q_noise > 0: + raise NotImplementedError + return RowParallelLinear(input_dim, output_dim, input_is_parallel=True) + + def build_self_attention(self, embed_dim, args, **unused_kwargs): + return ModelParallelMultiheadAttention( + embed_dim, + args.encoder_attention_heads, + dropout=args.attention_dropout, + self_attention=True, + ) + + +class ModelParallelTransformerDecoderLayer(TransformerDecoderLayer): + """Decoder layer block. + + See "Megatron-LM: https://arxiv.org/pdf/1909.08053.pdf" for more details. + """ + + def build_fc1(self, input_dim, output_dim, q_noise, qn_block_size): + if q_noise > 0: + raise NotImplementedError + return ColumnParallelLinear(input_dim, output_dim, gather_output=False) + + def build_fc2(self, input_dim, output_dim, q_noise, qn_block_size): + if q_noise > 0: + raise NotImplementedError + return RowParallelLinear(input_dim, output_dim, input_is_parallel=True) + + def build_self_attention(self, embed_dim, args, **unused_kwargs): + return ModelParallelMultiheadAttention( + embed_dim=embed_dim, + num_heads=args.decoder_attention_heads, + dropout=args.attention_dropout, + self_attention=not getattr(args, "cross_self_attention", False), + ) + + def build_encoder_attention(self, embed_dim, args, **unused_kwargs): + return ModelParallelMultiheadAttention( + embed_dim=embed_dim, + num_heads=args.decoder_attention_heads, + kdim=getattr(args, "encoder_embed_dim", None), + vdim=getattr(args, "encoder_embed_dim", None), + dropout=args.attention_dropout, + encoder_decoder_attention=True, + ) diff --git a/SpeechT5/fairseq/fairseq/models/__init__.py b/SpeechT5/fairseq/fairseq/models/__init__.py new file mode 100644 index 0000000..61425c8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/__init__.py @@ -0,0 +1,225 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import argparse +import importlib +import os + +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import merge_with_parent, populate_dataclass +from hydra.core.config_store import ConfigStore + +from .composite_encoder import CompositeEncoder +from .distributed_fairseq_model import DistributedFairseqModel +from .fairseq_decoder import FairseqDecoder +from .fairseq_encoder import FairseqEncoder +from .fairseq_incremental_decoder import FairseqIncrementalDecoder +from .fairseq_model import ( + BaseFairseqModel, + FairseqEncoderDecoderModel, + FairseqEncoderModel, + FairseqLanguageModel, + FairseqModel, + FairseqMultiModel, +) + + +MODEL_REGISTRY = {} +MODEL_DATACLASS_REGISTRY = {} +ARCH_MODEL_REGISTRY = {} +ARCH_MODEL_NAME_REGISTRY = {} +ARCH_MODEL_INV_REGISTRY = {} +ARCH_CONFIG_REGISTRY = {} + + +__all__ = [ + "BaseFairseqModel", + "CompositeEncoder", + "DistributedFairseqModel", + "FairseqDecoder", + "FairseqEncoder", + "FairseqEncoderDecoderModel", + "FairseqEncoderModel", + "FairseqIncrementalDecoder", + "FairseqLanguageModel", + "FairseqModel", + "FairseqMultiModel", +] + + +def build_model(cfg: FairseqDataclass, task): + + model = None + model_type = getattr(cfg, "_name", None) or getattr(cfg, "arch", None) + + if not model_type and len(cfg) == 1: + # this is hit if config object is nested in directory that is named after model type + + model_type = next(iter(cfg)) + if model_type in MODEL_DATACLASS_REGISTRY: + cfg = cfg[model_type] + else: + raise Exception( + "Could not infer model type from directory. Please add _name field to indicate model type. " + "Available models: " + + str(MODEL_DATACLASS_REGISTRY.keys()) + + " Requested model type: " + + model_type + ) + + if model_type in ARCH_MODEL_REGISTRY: + # case 1: legacy models + model = ARCH_MODEL_REGISTRY[model_type] + elif model_type in MODEL_DATACLASS_REGISTRY: + # case 2: config-driven models + model = MODEL_REGISTRY[model_type] + + if model_type in MODEL_DATACLASS_REGISTRY: + # set defaults from dataclass. note that arch name and model name can be the same + dc = MODEL_DATACLASS_REGISTRY[model_type] + if isinstance(cfg, argparse.Namespace): + cfg = populate_dataclass(dc(), cfg) + else: + cfg = merge_with_parent(dc(), cfg) + + assert model is not None, ( + f"Could not infer model type from {cfg}. " + f"Available models: " + + str(MODEL_DATACLASS_REGISTRY.keys()) + + " Requested model type: " + + model_type + ) + + return model.build_model(cfg, task) + + +def register_model(name, dataclass=None): + """ + New model types can be added to fairseq with the :func:`register_model` + function decorator. + + For example:: + + @register_model('lstm') + class LSTM(FairseqEncoderDecoderModel): + (...) + + .. note:: All models must implement the :class:`BaseFairseqModel` interface. + Typically you will extend :class:`FairseqEncoderDecoderModel` for + sequence-to-sequence tasks or :class:`FairseqLanguageModel` for + language modeling tasks. + + Args: + name (str): the name of the model + """ + + def register_model_cls(cls): + if name in MODEL_REGISTRY: + raise ValueError("Cannot register duplicate model ({})".format(name)) + if not issubclass(cls, BaseFairseqModel): + raise ValueError( + "Model ({}: {}) must extend BaseFairseqModel".format(name, cls.__name__) + ) + MODEL_REGISTRY[name] = cls + if dataclass is not None and not issubclass(dataclass, FairseqDataclass): + raise ValueError( + "Dataclass {} must extend FairseqDataclass".format(dataclass) + ) + + cls.__dataclass = dataclass + if dataclass is not None: + MODEL_DATACLASS_REGISTRY[name] = dataclass + + cs = ConfigStore.instance() + node = dataclass() + node._name = name + cs.store(name=name, group="model", node=node, provider="fairseq") + + @register_model_architecture(name, name) + def noop(_): + pass + + return cls + + return register_model_cls + + +def register_model_architecture(model_name, arch_name): + """ + New model architectures can be added to fairseq with the + :func:`register_model_architecture` function decorator. After registration, + model architectures can be selected with the ``--arch`` command-line + argument. + + For example:: + + @register_model_architecture('lstm', 'lstm_luong_wmt_en_de') + def lstm_luong_wmt_en_de(cfg): + args.encoder_embed_dim = getattr(cfg.model, 'encoder_embed_dim', 1000) + (...) + + The decorated function should take a single argument *cfg*, which is a + :class:`omegaconf.DictConfig`. The decorated function should modify these + arguments in-place to match the desired architecture. + + Args: + model_name (str): the name of the Model (Model must already be + registered) + arch_name (str): the name of the model architecture (``--arch``) + """ + + def register_model_arch_fn(fn): + if model_name not in MODEL_REGISTRY: + raise ValueError( + "Cannot register model architecture for unknown model type ({})".format( + model_name + ) + ) + if arch_name in ARCH_MODEL_REGISTRY: + raise ValueError( + "Cannot register duplicate model architecture ({})".format(arch_name) + ) + if not callable(fn): + raise ValueError( + "Model architecture must be callable ({})".format(arch_name) + ) + ARCH_MODEL_REGISTRY[arch_name] = MODEL_REGISTRY[model_name] + ARCH_MODEL_NAME_REGISTRY[arch_name] = model_name + ARCH_MODEL_INV_REGISTRY.setdefault(model_name, []).append(arch_name) + ARCH_CONFIG_REGISTRY[arch_name] = fn + return fn + + return register_model_arch_fn + + +def import_models(models_dir, namespace): + for file in os.listdir(models_dir): + path = os.path.join(models_dir, file) + if ( + not file.startswith("_") + and not file.startswith(".") + and (file.endswith(".py") or os.path.isdir(path)) + ): + model_name = file[: file.find(".py")] if file.endswith(".py") else file + importlib.import_module(namespace + "." + model_name) + + # extra `model_parser` for sphinx + if model_name in MODEL_REGISTRY: + parser = argparse.ArgumentParser(add_help=False) + group_archs = parser.add_argument_group("Named architectures") + group_archs.add_argument( + "--arch", choices=ARCH_MODEL_INV_REGISTRY[model_name] + ) + group_args = parser.add_argument_group( + "Additional command-line arguments" + ) + MODEL_REGISTRY[model_name].add_args(group_args) + globals()[model_name + "_parser"] = parser + + +# automatically import any Python files in the models/ directory +models_dir = os.path.dirname(__file__) +import_models(models_dir, "fairseq.models") diff --git a/SpeechT5/fairseq/fairseq/models/bart/__init__.py b/SpeechT5/fairseq/fairseq/models/bart/__init__.py new file mode 100644 index 0000000..a701923 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/bart/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .hub_interface import * # noqa +from .model import * # noqa diff --git a/SpeechT5/fairseq/fairseq/models/bart/hub_interface.py b/SpeechT5/fairseq/fairseq/models/bart/hub_interface.py new file mode 100644 index 0000000..9afe385 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/bart/hub_interface.py @@ -0,0 +1,208 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import copy +import logging +from typing import Dict, List + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.data import encoders +from fairseq.hub_utils import GeneratorHubInterface +from omegaconf import open_dict + + +logger = logging.getLogger(__name__) + + +class BARTHubInterface(GeneratorHubInterface): + """A simple PyTorch Hub interface to BART. + + Usage: https://github.com/pytorch/fairseq/tree/master/examples/bart + """ + + def __init__(self, cfg, task, model): + super().__init__(cfg, task, [model]) + self.model = self.models[0] + + def encode( + self, sentence: str, *addl_sentences, no_separator=True + ) -> torch.LongTensor: + """ + BPE-encode a sentence (or multiple sentences). + + Every sequence begins with a beginning-of-sentence (`<s>`) symbol. + Every sentence ends with an end-of-sentence (`</s>`). + + Example (single sentence): `<s> a b c </s>` + Example (sentence pair): `<s> d e f </s> 1 2 3 </s>` + + The BPE encoding follows GPT-2. One subtle detail is that the GPT-2 BPE + requires leading spaces. For example:: + + >>> bart.encode('Hello world').tolist() + [0, 31414, 232, 2] + >>> bart.encode(' world').tolist() + [0, 232, 2] + >>> bart.encode('world').tolist() + [0, 8331, 2] + """ + tokens = self.bpe.encode(sentence) + if len(tokens.split(" ")) > min(self.max_positions) - 2: + tokens = " ".join(tokens.split(" ")[: min(self.max_positions) - 2]) + bpe_sentence = "<s> " + tokens + " </s>" + for s in addl_sentences: + bpe_sentence += " </s>" if not no_separator else "" + bpe_sentence += " " + self.bpe.encode(s) + " </s>" + tokens = self.task.source_dictionary.encode_line(bpe_sentence, append_eos=False) + return tokens.long() + + def decode(self, tokens: torch.LongTensor): + assert tokens.dim() == 1 + tokens = tokens.cpu().numpy() + if tokens[0] == self.task.source_dictionary.bos(): + tokens = tokens[1:] # remove <s> + eos_mask = tokens == self.task.source_dictionary.eos() + doc_mask = eos_mask[1:] & eos_mask[:-1] + sentences = np.split(tokens, doc_mask.nonzero()[0] + 1) + sentences = [ + self.bpe.decode(self.task.source_dictionary.string(s)) for s in sentences + ] + if len(sentences) == 1: + return sentences[0] + return sentences + + def _build_sample(self, src_tokens: List[torch.LongTensor]): + # assert torch.is_tensor(src_tokens) + dataset = self.task.build_dataset_for_inference( + src_tokens, + [x.numel() for x in src_tokens], + ) + sample = dataset.collater(dataset) + sample = utils.apply_to_sample(lambda tensor: tensor.to(self.device), sample) + return sample + + def generate( + self, + tokenized_sentences: List[torch.LongTensor], + *args, + inference_step_args=None, + skip_invalid_size_inputs=False, + **kwargs + ) -> List[List[Dict[str, torch.Tensor]]]: + inference_step_args = inference_step_args or {} + if "prefix_tokens" in inference_step_args: + raise NotImplementedError("prefix generation not implemented for BART") + res = [] + for batch in self._build_batches(tokenized_sentences, skip_invalid_size_inputs): + src_tokens = batch['net_input']['src_tokens'] + inference_step_args["prefix_tokens"] =src_tokens.new_full( + (src_tokens.size(0), 1), fill_value=self.task.source_dictionary.bos() + ).to(device=self.device) + results = super().generate( + src_tokens, + *args, + inference_step_args=inference_step_args, + skip_invalid_size_inputs=skip_invalid_size_inputs, + **kwargs + ) + for id, hypos in zip(batch['id'].tolist(), results): + res.append((id, hypos)) + res = [hypos for _, hypos in sorted(res, key=lambda x: x[0])] + return res + + def extract_features( + self, tokens: torch.LongTensor, return_all_hiddens: bool = False + ) -> torch.Tensor: + if tokens.dim() == 1: + tokens = tokens.unsqueeze(0) + if tokens.size(-1) > min(self.model.max_positions()): + raise ValueError( + "tokens exceeds maximum length: {} > {}".format( + tokens.size(-1), self.model.max_positions() + ) + ) + tokens.to(device=self.device), + prev_output_tokens = tokens.clone() + + prev_output_tokens[:, 0] = tokens.gather( + 1, + (tokens.ne(self.task.source_dictionary.pad()).sum(dim=1) - 1).unsqueeze(-1), + ).squeeze() + + prev_output_tokens[:, 1:] = tokens[:, :-1] + features, extra = self.model( + src_tokens=tokens, + src_lengths=None, + prev_output_tokens=prev_output_tokens, + features_only=True, + return_all_hiddens=return_all_hiddens, + ) + if return_all_hiddens: + # convert from T x B x C -> B x T x C + inner_states = extra["inner_states"] + return [inner_state.transpose(0, 1) for inner_state in inner_states] + else: + return features # just the last layer's features + + def register_classification_head( + self, name: str, num_classes: int = None, embedding_size: int = None, **kwargs + ): + self.model.register_classification_head( + name, num_classes=num_classes, embedding_size=embedding_size, **kwargs + ) + + def predict(self, head: str, tokens: torch.LongTensor, return_logits: bool = False): + if tokens.dim() == 1: + tokens = tokens.unsqueeze(0) + features = self.extract_features(tokens.to(device=self.device)) + sentence_representation = features[ + tokens.eq(self.task.source_dictionary.eos()), : + ].view(features.size(0), -1, features.size(-1))[:, -1, :] + + logits = self.model.classification_heads[head](sentence_representation) + if return_logits: + return logits + return F.log_softmax(logits, dim=-1) + + def fill_mask( + self, + masked_inputs: List[str], + topk: int = 5, + match_source_len: bool = True, + **generate_kwargs + ): + masked_token = '<mask>' + batch_tokens = [] + for masked_input in masked_inputs: + assert masked_token in masked_input, \ + "please add one {} token for the input".format(masked_token) + + text_spans = masked_input.split(masked_token) + text_spans_bpe = (' {0} '.format(masked_token)).join( + [self.bpe.encode(text_span.rstrip()) for text_span in text_spans] + ).strip() + tokens = self.task.source_dictionary.encode_line( + '<s> ' + text_spans_bpe + ' </s>', + append_eos=False, + add_if_not_exist=False, + ).long() + batch_tokens.append(tokens) + + # ensure beam size is at least as big as topk + generate_kwargs['beam'] = max( + topk, + generate_kwargs.get('beam', -1), + ) + generate_kwargs['match_source_len'] = match_source_len + batch_hypos = self.generate(batch_tokens, **generate_kwargs) + + return [ + [(self.decode(hypo['tokens']), hypo['score']) for hypo in hypos[:topk]] + for hypos in batch_hypos + ] diff --git a/SpeechT5/fairseq/fairseq/models/bart/model.py b/SpeechT5/fairseq/fairseq/models/bart/model.py new file mode 100644 index 0000000..71d0b27 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/bart/model.py @@ -0,0 +1,384 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +BART: Denoising Sequence-to-Sequence Pre-training for +Natural Language Generation, Translation, and Comprehension +""" +from typing import Optional + +import logging + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.models import register_model, register_model_architecture +from fairseq.models.transformer import TransformerModel +from fairseq.modules.transformer_sentence_encoder import init_bert_params + +from .hub_interface import BARTHubInterface + + +logger = logging.getLogger(__name__) + + +@register_model("bart") +class BARTModel(TransformerModel): + __jit_unused_properties__ = ["supported_targets"] + + @classmethod + def hub_models(cls): + return { + "bart.base": "http://dl.fbaipublicfiles.com/fairseq/models/bart.base.tar.gz", + "bart.large": "http://dl.fbaipublicfiles.com/fairseq/models/bart.large.tar.gz", + "bart.large.mnli": "http://dl.fbaipublicfiles.com/fairseq/models/bart.large.mnli.tar.gz", + "bart.large.cnn": "http://dl.fbaipublicfiles.com/fairseq/models/bart.large.cnn.tar.gz", + "bart.large.xsum": "http://dl.fbaipublicfiles.com/fairseq/models/bart.large.xsum.tar.gz", + } + + def __init__(self, args, encoder, decoder): + super().__init__(args, encoder, decoder) + + # We follow BERT's random weight initialization + self.apply(init_bert_params) + + self.classification_heads = nn.ModuleDict() + if hasattr(self.encoder, "dictionary"): + self.eos: int = self.encoder.dictionary.eos() + + @staticmethod + def add_args(parser): + super(BARTModel, BARTModel).add_args(parser) + parser.add_argument( + "--pooler-dropout", + type=float, + metavar="D", + help="dropout probability in the masked_lm pooler layers", + ) + parser.add_argument( + "--pooler-activation-fn", + choices=utils.get_available_activation_fns(), + help="activation function to use for pooler layer", + ) + parser.add_argument( + "--spectral-norm-classification-head", + action="store_true", + help="Apply spectral normalization on the classification head", + ) + + @property + def supported_targets(self): + return {"self"} + + def forward( + self, + src_tokens, + src_lengths, + prev_output_tokens, + features_only: bool = False, + classification_head_name: Optional[str] = None, + token_embeddings: Optional[torch.Tensor] = None, + return_all_hiddens: bool = True, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + if classification_head_name is not None: + features_only = True + + encoder_out = self.encoder( + src_tokens, + src_lengths=src_lengths, + token_embeddings=token_embeddings, + return_all_hiddens=return_all_hiddens + ) + x, extra = self.decoder( + prev_output_tokens, + encoder_out=encoder_out, + features_only=features_only, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + src_lengths=src_lengths, + return_all_hiddens=return_all_hiddens, + ) + eos: int = self.eos + if classification_head_name is not None: + sentence_representation = x[ + src_tokens.eq(eos), : + ].view(x.size(0), -1, x.size(-1))[:, -1, :] + for k, head in self.classification_heads.items(): + # for torch script only supports iteration + if k == classification_head_name: + x = head(sentence_representation) + break + return x, extra + + @classmethod + def from_pretrained( + cls, + model_name_or_path, + checkpoint_file="model.pt", + data_name_or_path=".", + bpe="gpt2", + sample_break_mode="eos", + **kwargs, + ): + from fairseq import hub_utils + + x = hub_utils.from_pretrained( + model_name_or_path, + checkpoint_file, + data_name_or_path, + archive_map=cls.hub_models(), + bpe=bpe, + load_checkpoint_heads=True, + sample_break_mode=sample_break_mode, + **kwargs, + ) + return BARTHubInterface(x["args"], x["task"], x["models"][0]) + + def register_classification_head( + self, name, num_classes=None, inner_dim=None, **kwargs + ): + """Register a classification head.""" + logger.info("Registering classification head: {0}".format(name)) + if name in self.classification_heads: + prev_num_classes = self.classification_heads[name].out_proj.out_features + prev_inner_dim = self.classification_heads[name].dense.out_features + if num_classes != prev_num_classes or inner_dim != prev_inner_dim: + logger.warning( + 're-registering head "{}" with num_classes {} (prev: {}) ' + "and inner_dim {} (prev: {})".format( + name, num_classes, prev_num_classes, inner_dim, prev_inner_dim + ) + ) + self.classification_heads[name] = BARTClassificationHead( + input_dim=self.args.encoder_embed_dim, + inner_dim=inner_dim or self.args.encoder_embed_dim, + num_classes=num_classes, + activation_fn=self.args.pooler_activation_fn, + pooler_dropout=self.args.pooler_dropout, + do_spectral_norm=getattr( + self.args, "spectral_norm_classification_head", False + ), + ) + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + + prefix = name + "." if name != "" else "" + current_head_names = ( + [] + if not hasattr(self, "classification_heads") + else self.classification_heads.keys() + ) + + # Handle new classification heads present in the state dict. + keys_to_delete = [] + for k in state_dict.keys(): + if not k.startswith(prefix + "classification_heads."): + continue + + head_name = k[len(prefix + "classification_heads.") :].split(".")[0] + num_classes = state_dict[ + prefix + "classification_heads." + head_name + ".out_proj.weight" + ].size(0) + inner_dim = state_dict[ + prefix + "classification_heads." + head_name + ".dense.weight" + ].size(0) + + if getattr(self.args, "load_checkpoint_heads", False): + if head_name not in current_head_names: + self.register_classification_head(head_name, num_classes, inner_dim) + else: + if head_name not in current_head_names: + logger.warning( + "deleting classification head ({}) from checkpoint " + "not present in current model: {}".format(head_name, k) + ) + keys_to_delete.append(k) + elif ( + num_classes + != self.classification_heads[head_name].out_proj.out_features + or inner_dim + != self.classification_heads[head_name].dense.out_features + ): + logger.warning( + "deleting classification head ({}) from checkpoint " + "with different dimensions than current model: {}".format( + head_name, k + ) + ) + keys_to_delete.append(k) + for k in keys_to_delete: + del state_dict[k] + + def truncate_emb(key): + if key in state_dict: + state_dict[key] = state_dict[key][:-1, :] + + # When finetuning on translation task, remove last row of + # embedding matrix that corresponds to mask_idx token. + loaded_dict_size = state_dict["encoder.embed_tokens.weight"].size(0) + if ( + loaded_dict_size == len(self.encoder.dictionary) + 1 + and "<mask>" not in self.encoder.dictionary + ): + truncate_emb("encoder.embed_tokens.weight") + truncate_emb("decoder.embed_tokens.weight") + truncate_emb("encoder.output_projection.weight") + truncate_emb("decoder.output_projection.weight") + + # When continued pretraining on new set of languages for mbart, + # add extra lang embeddings at the end of embed_tokens. + # Note: newly added languages are assumed to have been added at the end. + if self.args.task == "multilingual_denoising" and loaded_dict_size < len( + self.encoder.dictionary + ): + logger.info( + "Adding extra language embeddings not found in pretrained model for " + "continued pretraining of MBART on new set of languages." + ) + loaded_mask_token_embedding = state_dict["encoder.embed_tokens.weight"][ + -1, : + ] + + num_langids_to_add = len(self.encoder.dictionary) - loaded_dict_size + embed_dim = state_dict["encoder.embed_tokens.weight"].size(1) + + new_lang_embed_to_add = torch.zeros(num_langids_to_add, embed_dim) + nn.init.normal_(new_lang_embed_to_add, mean=0, std=embed_dim ** -0.5) + new_lang_embed_to_add = new_lang_embed_to_add.to( + dtype=state_dict["encoder.embed_tokens.weight"].dtype, + ) + + state_dict["encoder.embed_tokens.weight"] = torch.cat( + [ + state_dict["encoder.embed_tokens.weight"][ + : loaded_dict_size - 1, : + ], + new_lang_embed_to_add, + loaded_mask_token_embedding.unsqueeze(0), + ] + ) + state_dict["decoder.embed_tokens.weight"] = torch.cat( + [ + state_dict["decoder.embed_tokens.weight"][ + : loaded_dict_size - 1, : + ], + new_lang_embed_to_add, + loaded_mask_token_embedding.unsqueeze(0), + ] + ) + + # Copy any newly-added classification heads into the state dict + # with their current weights. + if hasattr(self, "classification_heads"): + cur_state = self.classification_heads.state_dict() + for k, v in cur_state.items(): + if prefix + "classification_heads." + k not in state_dict: + logger.info("Overwriting " + prefix + "classification_heads." + k) + state_dict[prefix + "classification_heads." + k] = v + + +class BARTClassificationHead(nn.Module): + """Head for sentence-level classification tasks.""" + + def __init__( + self, + input_dim, + inner_dim, + num_classes, + activation_fn, + pooler_dropout, + do_spectral_norm=False, + ): + super().__init__() + self.dense = nn.Linear(input_dim, inner_dim) + self.activation_fn = utils.get_activation_fn(activation_fn) + self.dropout = nn.Dropout(p=pooler_dropout) + self.out_proj = nn.Linear(inner_dim, num_classes) + + if do_spectral_norm: + self.out_proj = torch.nn.utils.spectral_norm(self.out_proj) + + def forward(self, features, **kwargs): + x = features + x = self.dropout(x) + x = self.dense(x) + x = self.activation_fn(x) + x = self.dropout(x) + x = self.out_proj(x) + return x + + +@register_model_architecture("bart", "bart_large") +def bart_large_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4 * 1024) + args.encoder_layers = getattr(args, "encoder_layers", 12) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", True) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 12) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", True) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.relu_dropout = getattr(args, "relu_dropout", 0.0) + args.dropout = getattr(args, "dropout", 0.1) + args.max_target_positions = getattr(args, "max_target_positions", 1024) + args.max_source_positions = getattr(args, "max_source_positions", 1024) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", True + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", True) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + args.no_scale_embedding = getattr(args, "no_scale_embedding", True) + args.layernorm_embedding = getattr(args, "layernorm_embedding", True) + + args.activation_fn = getattr(args, "activation_fn", "gelu") + args.pooler_activation_fn = getattr(args, "pooler_activation_fn", "tanh") + args.pooler_dropout = getattr(args, "pooler_dropout", 0.0) + + +@register_model_architecture("bart", "bart_base") +def bart_base_architecture(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 768) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4 * 768) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 12) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 12) + bart_large_architecture(args) + + +@register_model_architecture("bart", "mbart_large") +def mbart_large_architecture(args): + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + bart_large_architecture(args) + + +@register_model_architecture("bart", "mbart_base") +def mbart_base_architecture(args): + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + bart_base_architecture(args) + + +@register_model_architecture("bart", "mbart_base_wmt20") +def mbart_base_wmt20_architecture(args): + args.layernorm_embedding = getattr(args, "layernorm_embedding", False) + mbart_base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/composite_encoder.py b/SpeechT5/fairseq/fairseq/models/composite_encoder.py new file mode 100644 index 0000000..4e20fe3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/composite_encoder.py @@ -0,0 +1,57 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .fairseq_encoder import FairseqEncoder + + +class CompositeEncoder(FairseqEncoder): + """ + A wrapper around a dictionary of :class:`FairseqEncoder` objects. + + We run forward on each encoder and return a dictionary of outputs. The first + encoder's dictionary is used for initialization. + + Args: + encoders (dict): a dictionary of :class:`FairseqEncoder` objects. + """ + + def __init__(self, encoders): + super().__init__(next(iter(encoders.values())).dictionary) + self.encoders = encoders + for key in self.encoders: + self.add_module(key, self.encoders[key]) + + def forward(self, src_tokens, src_lengths): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (LongTensor): lengths of each source sentence of shape + `(batch)` + + Returns: + dict: + the outputs from each Encoder + """ + encoder_out = {} + for key in self.encoders: + encoder_out[key] = self.encoders[key](src_tokens, src_lengths) + return encoder_out + + def reorder_encoder_out(self, encoder_out, new_order): + """Reorder encoder output according to new_order.""" + for key in self.encoders: + encoder_out[key] = self.encoders[key].reorder_encoder_out( + encoder_out[key], new_order + ) + return encoder_out + + def max_positions(self): + return min(self.encoders[key].max_positions() for key in self.encoders) + + def upgrade_state_dict(self, state_dict): + for key in self.encoders: + self.encoders[key].upgrade_state_dict(state_dict) + return state_dict diff --git a/SpeechT5/fairseq/fairseq/models/distributed_fairseq_model.py b/SpeechT5/fairseq/fairseq/models/distributed_fairseq_model.py new file mode 100644 index 0000000..0690545 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/distributed_fairseq_model.py @@ -0,0 +1,145 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import signal +import threading + +import torch +import torch.nn as nn +from torch.nn.parallel import DistributedDataParallel + +from fairseq.distributed import ( + DistributedTimeoutWrapper, + LegacyDistributedDataParallel, + ModuleProxyWrapper, + TPUDistributedDataParallel, +) + + +logger = logging.getLogger(__name__) + + +_GOSSIP_DISABLED = False +try: + import gossip +except ImportError: + _GOSSIP_DISABLED = True + + +def DistributedFairseqModel(args, model, process_group, device): + """ + Wrap a *model* to support distributed data parallel training. + + This is similar to the built-in DistributedDataParallel, but allows + additional configuration of the DistributedDataParallel class to + use, and also provides easier access to the wrapped model by + forwarding requests for missing attributes to the wrapped model. + + Args: + args (argparse.Namespace): fairseq args + model (BaseFairseqModel): model to wrap + process_group: the c10d process group to be used for distributed data + parallel all-reduction. + device: device to move model to + """ + assert isinstance(model, nn.Module) + if args.tpu: + wrapped_model = TPUDistributedDataParallel( + module=model.to(device), + process_group=process_group, + ) + # forward missing getattr and state_dict/load_state_dict to orig model + wrapped_model = ModuleProxyWrapper(wrapped_model) + elif args.ddp_backend in {"c10d", "pytorch_ddp"}: + wrapped_model = DistributedDataParallel( + module=model.to(device), + device_ids=[args.device_id], + output_device=args.device_id, + broadcast_buffers=args.broadcast_buffers, + bucket_cap_mb=args.bucket_cap_mb, + process_group=process_group, + find_unused_parameters=args.find_unused_parameters, + ) + if args.ddp_comm_hook == "fp16": + logger.info("enable fp16 communication hook in DDP") + try: + from torch.distributed.algorithms.ddp_comm_hooks import ( + register_ddp_comm_hook, + DDPCommHookType, + ) + except: + logger.error( + "Could not import from torch.distributed.algorithms.ddp_comm_hooks; you may need to update your pytorch version" + ) + raise + + register_ddp_comm_hook(DDPCommHookType.FP16_COMPRESS, wrapped_model) + # forward missing getattr and state_dict/load_state_dict to orig model + wrapped_model = ModuleProxyWrapper(wrapped_model) + elif args.ddp_backend in {"no_c10d", "legacy_ddp"}: + wrapped_model = LegacyDistributedDataParallel( + module=model.to(device), + buffer_size=2 ** 28, + process_group=process_group, + ) + # forward missing getattr and state_dict/load_state_dict to orig model + wrapped_model = ModuleProxyWrapper(wrapped_model) + elif args.ddp_backend == "slow_mo": + if _GOSSIP_DISABLED: + raise ImportError( + "Cannot find gossip library. Please install from: " + "github.com/facebookresearch/stochastic_gradient_push" + ) + + # The values of slowmo_momentum below were obtained by tuning on the + # En-De 16 dataset by training the transformer_wmt_en_de_large model + if args.slowmo_momentum is None: + if args.distributed_world_size <= 16: + args.slowmo_momentum = 0.0 + elif args.distributed_world_size <= 32: + args.slowmo_momentum = 0.2 + elif args.distributed_world_size <= 64: + args.slowmo_momentum = 0.5 + else: + args.slowmo_momentum = 0.6 + + wrapped_model = gossip.GossipDataParallel( + module=model.to(device), + device_ids=[args.device_id], + output_device=args.device_id, + broadcast_buffers=args.broadcast_buffers, + nprocs_per_node=args.nprocs_per_node, + slowmo_momentum=args.slowmo_momentum, + localsgd=(args.slowmo_algorithm == "LocalSGD"), + localsgd_frequency=args.localsgd_frequency, + ) + # forward missing getattr and state_dict/load_state_dict to orig model + wrapped_model = ModuleProxyWrapper(wrapped_model) + elif args.ddp_backend == "fully_sharded": + try: + from fairscale.nn.data_parallel import FullyShardedDataParallel as FSDP + except ImportError: + raise ImportError( + "Cannot find FullyShardedDataParallel. " + "Please install fairscale with: pip install fairscale" + ) + assert isinstance(model, FSDP), "expected model to already be wrapped in FSDP" + wrapped_model = model + if args.memory_efficient_fp16: + wrapped_model = wrapped_model.half() + if not args.cpu_offload: + wrapped_model = wrapped_model.to(device=device) + else: + raise ValueError("Unknown --ddp-backend: " + args.ddp_backend) + + # kill hung distributed jobs after a timeout + if getattr(args, "heartbeat_timeout", -1) > 0: + wrapped_model = DistributedTimeoutWrapper( + wrapped_model, timeout=getattr(args, "heartbeat_timeout", -1) + ) + + return wrapped_model diff --git a/SpeechT5/fairseq/fairseq/models/fairseq_decoder.py b/SpeechT5/fairseq/fairseq/models/fairseq_decoder.py new file mode 100644 index 0000000..4f1e8b5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/fairseq_decoder.py @@ -0,0 +1,105 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, List, Optional, Tuple + +import torch.nn as nn +from fairseq import utils +from torch import Tensor + + +class FairseqDecoder(nn.Module): + """Base class for decoders.""" + + def __init__(self, dictionary): + super().__init__() + self.dictionary = dictionary + self.onnx_trace = False + self.adaptive_softmax = None + + + def forward(self, prev_output_tokens, encoder_out=None, **kwargs): + """ + Args: + prev_output_tokens (LongTensor): shifted output tokens of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (dict, optional): output from the encoder, used for + encoder-side attention + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + x, extra = self.extract_features( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) + x = self.output_layer(x) + return x, extra + + def extract_features(self, prev_output_tokens, encoder_out=None, **kwargs): + """ + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + raise NotImplementedError + + def output_layer(self, features, **kwargs): + """ + Project features to the default output size, e.g., vocabulary size. + + Args: + features (Tensor): features returned by *extract_features*. + """ + raise NotImplementedError + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + """Get normalized probabilities (or log probs) from a net's output.""" + return self.get_normalized_probs_scriptable(net_output, log_probs, sample) + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def get_normalized_probs_scriptable( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + """Get normalized probabilities (or log probs) from a net's output.""" + + if hasattr(self, "adaptive_softmax") and self.adaptive_softmax is not None: + if sample is not None: + assert "target" in sample + target = sample["target"] + else: + target = None + out = self.adaptive_softmax.get_log_prob(net_output[0], target=target) + return out.exp_() if not log_probs else out + + logits = net_output[0] + if log_probs: + return utils.log_softmax(logits, dim=-1, onnx_trace=self.onnx_trace) + else: + return utils.softmax(logits, dim=-1, onnx_trace=self.onnx_trace) + + def max_positions(self): + """Maximum input length supported by the decoder.""" + return 1e6 # an arbitrary large number + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade old state dicts to work with newer code.""" + return state_dict + + def prepare_for_onnx_export_(self): + self.onnx_trace = True diff --git a/SpeechT5/fairseq/fairseq/models/fairseq_encoder.py b/SpeechT5/fairseq/fairseq/models/fairseq_encoder.py new file mode 100644 index 0000000..08cbde1 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/fairseq_encoder.py @@ -0,0 +1,92 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, List, NamedTuple, Optional + +import torch +import torch.nn as nn +from torch import Tensor + + +EncoderOut = NamedTuple( + "EncoderOut", + [ + ("encoder_out", Tensor), # T x B x C + ("encoder_padding_mask", Optional[Tensor]), # B x T + ("encoder_embedding", Optional[Tensor]), # B x T x C + ("encoder_states", Optional[List[Tensor]]), # List[T x B x C] + ("src_tokens", Optional[Tensor]), # B x T + ("src_lengths", Optional[Tensor]), # B x 1 + ], +) + + +class FairseqEncoder(nn.Module): + """Base class for encoders.""" + + def __init__(self, dictionary): + super().__init__() + self.dictionary = dictionary + + def forward(self, src_tokens, src_lengths=None, **kwargs): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (LongTensor): lengths of each source sentence of shape + `(batch)` + """ + raise NotImplementedError + + def forward_torchscript(self, net_input: Dict[str, Tensor]): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + if torch.jit.is_scripting(): + return self.forward( + src_tokens=net_input["src_tokens"], + src_lengths=net_input["src_lengths"], + ) + else: + return self.forward_non_torchscript(net_input) + + @torch.jit.unused + def forward_non_torchscript(self, net_input: Dict[str, Tensor]): + encoder_input = { + k: v for k, v in net_input.items() if k != "prev_output_tokens" + } + return self.forward(**encoder_input) + + def reorder_encoder_out(self, encoder_out, new_order): + """ + Reorder encoder output according to `new_order`. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + `encoder_out` rearranged according to `new_order` + """ + raise NotImplementedError + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return 1e6 # an arbitrary large number + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade old state dicts to work with newer code.""" + return state_dict + + def set_num_updates(self, num_updates): + """State from trainer to pass along to model at every update.""" + + def _apply(m): + if hasattr(m, "set_num_updates") and m != self: + m.set_num_updates(num_updates) + + self.apply(_apply) diff --git a/SpeechT5/fairseq/fairseq/models/fairseq_incremental_decoder.py b/SpeechT5/fairseq/fairseq/models/fairseq_incremental_decoder.py new file mode 100644 index 0000000..cc72a0f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/fairseq_incremental_decoder.py @@ -0,0 +1,118 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from typing import Dict, Optional + +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.models import FairseqDecoder +from torch import Tensor + + +logger = logging.getLogger(__name__) + + +@with_incremental_state +class FairseqIncrementalDecoder(FairseqDecoder): + """Base class for incremental decoders. + + Incremental decoding is a special mode at inference time where the Model + only receives a single timestep of input corresponding to the previous + output token (for teacher forcing) and must produce the next output + *incrementally*. Thus the model must cache any long-term state that is + needed about the sequence, e.g., hidden states, convolutional states, etc. + + Compared to the standard :class:`FairseqDecoder` interface, the incremental + decoder interface allows :func:`forward` functions to take an extra keyword + argument (*incremental_state*) that can be used to cache state across + time-steps. + + The :class:`FairseqIncrementalDecoder` interface also defines the + :func:`reorder_incremental_state` method, which is used during beam search + to select and reorder the incremental state based on the selection of beams. + + To learn more about how incremental decoding works, refer to `this blog + <http://www.telesens.co/2019/04/21/understanding-incremental-decoding-in-fairseq/>`_. + """ + + def __init__(self, dictionary): + super().__init__(dictionary) + + def forward( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **kwargs + ): + """ + Args: + prev_output_tokens (LongTensor): shifted output tokens of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (dict, optional): output from the encoder, used for + encoder-side attention + incremental_state (dict, optional): dictionary used for storing + state during :ref:`Incremental decoding` + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + raise NotImplementedError + + def extract_features( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **kwargs + ): + """ + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + raise NotImplementedError + + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + """Reorder incremental state. + + This will be called when the order of the input has changed from the + previous time step. A typical use case is beam search, where the input + order changes between time steps based on the selection of beams. + """ + pass + + def reorder_incremental_state_scripting( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + """Main entry point for reordering the incremental state. + + Due to limitations in TorchScript, we call this function in + :class:`fairseq.sequence_generator.SequenceGenerator` instead of + calling :func:`reorder_incremental_state` directly. + """ + for module in self.modules(): + if hasattr(module, "reorder_incremental_state"): + result = module.reorder_incremental_state(incremental_state, new_order) + if result is not None: + incremental_state = result + + def set_beam_size(self, beam_size): + """Sets the beam size in the decoder and all children.""" + if getattr(self, "_beam_size", -1) != beam_size: + seen = set() + + def apply_set_beam_size(module): + if ( + module != self + and hasattr(module, "set_beam_size") + and module not in seen + ): + seen.add(module) + module.set_beam_size(beam_size) + + self.apply(apply_set_beam_size) + self._beam_size = beam_size diff --git a/SpeechT5/fairseq/fairseq/models/fairseq_model.py b/SpeechT5/fairseq/fairseq/models/fairseq_model.py new file mode 100644 index 0000000..e55c7ba --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/fairseq_model.py @@ -0,0 +1,569 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Base classes for various fairseq models. +""" + +import logging +from argparse import Namespace +from typing import Dict, List, Optional, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.data import Dictionary +from fairseq.dataclass.utils import ( + convert_namespace_to_omegaconf, + gen_parser_from_dataclass, +) +from fairseq.models import FairseqDecoder, FairseqEncoder +from omegaconf import DictConfig +from torch import Tensor + + +logger = logging.getLogger(__name__) + + +def check_type(module, expected_type): + if hasattr(module, "unwrapped_module"): + assert isinstance(module.unwrapped_module, expected_type), \ + f"{type(module.unwrapped_module)} != {expected_type}" + else: + assert isinstance(module, expected_type), f"{type(module)} != {expected_type}" + + +class BaseFairseqModel(nn.Module): + """Base class for fairseq models.""" + + def __init__(self): + super().__init__() + self._is_generation_fast = False + + @classmethod + def add_args(cls, parser): + """Add model-specific arguments to the parser.""" + dc = getattr(cls, "__dataclass", None) + if dc is not None: + # do not set defaults so that settings defaults from various architectures still works + gen_parser_from_dataclass(parser, dc(), delete_default=True) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + raise NotImplementedError("Model must implement the build_model method") + + def get_targets(self, sample, net_output): + """Get targets from either the sample or the net's output.""" + return sample["target"] + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + """Get normalized probabilities (or log probs) from a net's output.""" + return self.get_normalized_probs_scriptable(net_output, log_probs, sample) + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def get_normalized_probs_scriptable( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + """Scriptable helper function for get_normalized_probs in ~BaseFairseqModel""" + if hasattr(self, "decoder"): + return self.decoder.get_normalized_probs(net_output, log_probs, sample) + elif torch.is_tensor(net_output): + # syntactic sugar for simple models which don't have a decoder + # (e.g., the classification tutorial) + logits = net_output.float() + if log_probs: + return F.log_softmax(logits, dim=-1) + else: + return F.softmax(logits, dim=-1) + raise NotImplementedError + + def extract_features(self, *args, **kwargs): + """Similar to *forward* but only return features.""" + return self(*args, **kwargs) + + def max_positions(self): + """Maximum length supported by the model.""" + return None + + def load_state_dict( + self, + state_dict, + strict=True, + model_cfg: Optional[DictConfig] = None, + args: Optional[Namespace] = None, + ): + """Copies parameters and buffers from *state_dict* into this module and + its descendants. + + Overrides the method in :class:`nn.Module`. Compared with that method + this additionally "upgrades" *state_dicts* from old checkpoints. + """ + + if model_cfg is None and args is not None: + logger.warn("using 'args' is deprecated, please update your code to use dataclass config") + model_cfg = convert_namespace_to_omegaconf(args).model + + self.upgrade_state_dict(state_dict) + + from fairseq.checkpoint_utils import prune_state_dict + + new_state_dict = prune_state_dict(state_dict, model_cfg) + return super().load_state_dict(new_state_dict, strict) + + def upgrade_state_dict(self, state_dict): + """Upgrade old state dicts to work with newer code.""" + self.upgrade_state_dict_named(state_dict, "") + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade old state dicts to work with newer code. + + Args: + state_dict (dict): state dictionary to upgrade, in place + name (str): the state dict key corresponding to the current module + """ + assert state_dict is not None + + def do_upgrade(m, prefix): + if len(prefix) > 0: + prefix += "." + + for n, c in m.named_children(): + name = prefix + n + if hasattr(c, "upgrade_state_dict_named"): + c.upgrade_state_dict_named(state_dict, name) + elif hasattr(c, "upgrade_state_dict"): + c.upgrade_state_dict(state_dict) + do_upgrade(c, name) + + do_upgrade(self, name) + + def set_num_updates(self, num_updates): + """State from trainer to pass along to model at every update.""" + for m in self.modules(): + if hasattr(m, "set_num_updates") and m != self: + m.set_num_updates(num_updates) + + def prepare_for_inference_(self, cfg: DictConfig): + """Prepare model for inference.""" + kwargs = {} + kwargs["beamable_mm_beam_size"] = ( + None + if getattr(cfg.generation, "no_beamable_mm", False) + else getattr(cfg.generation, "beam", 5) + ) + kwargs["need_attn"] = getattr(cfg.generation, "print_alignment", False) + if getattr(cfg.generation, "retain_dropout", False): + kwargs["retain_dropout"] = cfg.generation.retain_dropout + kwargs["retain_dropout_modules"] = cfg.generation.retain_dropout_modules + self.make_generation_fast_(**kwargs) + + def make_generation_fast_(self, **kwargs): + """ + Legacy entry point to optimize model for faster generation. + Prefer prepare_for_inference_. + """ + if self._is_generation_fast: + return # only apply once + self._is_generation_fast = True + + # remove weight norm from all modules in the network + def apply_remove_weight_norm(module): + try: + nn.utils.remove_weight_norm(module) + except (AttributeError, ValueError): # this module didn't have weight norm + return + + self.apply(apply_remove_weight_norm) + + def apply_make_generation_fast_(module, prefix): + if len(prefix) > 0: + prefix += "." + + base_func = BaseFairseqModel.make_generation_fast_ + for n, m in module.named_modules(): + if ( + m != self + and hasattr(m, "make_generation_fast_") + # don't call this implementation again, e.g., if + # children modules also inherit from BaseFairseqModel + and m.make_generation_fast_.__func__ is not base_func + ): + name = prefix + n + m.make_generation_fast_(name=name, **kwargs) + + apply_make_generation_fast_(self, "") + + def train(mode=True): + if mode: + raise RuntimeError("cannot train after make_generation_fast") + + # this model should no longer be used for training + self.eval() + self.train = train + + def prepare_for_onnx_export_(self, **kwargs): + """Make model exportable via ONNX trace.""" + seen = set() + + def apply_prepare_for_onnx_export_(module): + if ( + module != self + and hasattr(module, "prepare_for_onnx_export_") + and module not in seen + ): + seen.add(module) + module.prepare_for_onnx_export_(**kwargs) + + self.apply(apply_prepare_for_onnx_export_) + + @classmethod + def from_pretrained( + cls, + model_name_or_path, + checkpoint_file="model.pt", + data_name_or_path=".", + **kwargs, + ): + """ + Load a :class:`~fairseq.models.FairseqModel` from a pre-trained model + file. Downloads and caches the pre-trained model file if needed. + + The base implementation returns a + :class:`~fairseq.hub_utils.GeneratorHubInterface`, which can be used to + generate translations or sample from language models. The underlying + :class:`~fairseq.models.FairseqModel` can be accessed via the + *generator.models* attribute. + + Other models may override this to implement custom hub interfaces. + + Args: + model_name_or_path (str): either the name of a pre-trained model to + load or a path/URL to a pre-trained model state dict + checkpoint_file (str, optional): colon-separated list of checkpoint + files in the model archive to ensemble (default: 'model.pt') + data_name_or_path (str, optional): point args.data to the archive + at the given path/URL. Can start with '.' or './' to reuse the + model archive path. + """ + from fairseq import hub_utils + + x = hub_utils.from_pretrained( + model_name_or_path, + checkpoint_file, + data_name_or_path, + archive_map=cls.hub_models(), + **kwargs, + ) + logger.info(x["args"]) + return hub_utils.GeneratorHubInterface(x["args"], x["task"], x["models"]) + + @classmethod + def hub_models(cls): + return {} + + +class FairseqEncoderDecoderModel(BaseFairseqModel): + """Base class for encoder-decoder models. + + Args: + encoder (FairseqEncoder): the encoder + decoder (FairseqDecoder): the decoder + """ + + def __init__(self, encoder, decoder): + super().__init__() + + self.encoder = encoder + self.decoder = decoder + + check_type(self.encoder, FairseqEncoder) + check_type(self.decoder, FairseqDecoder) + + def forward(self, src_tokens, src_lengths, prev_output_tokens, **kwargs): + """ + Run the forward pass for an encoder-decoder model. + + First feed a batch of source tokens through the encoder. Then, feed the + encoder output and previous decoder outputs (i.e., teacher forcing) to + the decoder to produce the next outputs:: + + encoder_out = self.encoder(src_tokens, src_lengths) + return self.decoder(prev_output_tokens, encoder_out) + + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (LongTensor): source sentence lengths of shape `(batch)` + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + decoder_out = self.decoder( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) + return decoder_out + + def forward_decoder(self, prev_output_tokens, **kwargs): + return self.decoder(prev_output_tokens, **kwargs) + + def extract_features(self, src_tokens, src_lengths, prev_output_tokens, **kwargs): + """ + Similar to *forward* but only return features. + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + features = self.decoder.extract_features( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) + return features + + def output_layer(self, features, **kwargs): + """Project features to the default output size (typically vocabulary size).""" + return self.decoder.output_layer(features, **kwargs) + + def max_positions(self): + """Maximum length supported by the model.""" + return (self.encoder.max_positions(), self.decoder.max_positions()) + + def max_decoder_positions(self): + """Maximum length supported by the decoder.""" + return self.decoder.max_positions() + + +class FairseqModel(FairseqEncoderDecoderModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + utils.deprecation_warning( + "FairseqModel is deprecated, please use FairseqEncoderDecoderModel " + "or BaseFairseqModel instead", + stacklevel=4, + ) + + +class FairseqMultiModel(BaseFairseqModel): + """Base class for combining multiple encoder-decoder models.""" + + def __init__(self, encoders, decoders): + super().__init__() + assert encoders.keys() == decoders.keys() + self.keys = list(encoders.keys()) + for key in self.keys: + check_type(encoders[key], FairseqEncoder) + check_type(decoders[key], FairseqDecoder) + + self.models = nn.ModuleDict( + { + key: FairseqEncoderDecoderModel(encoders[key], decoders[key]) + for key in self.keys + } + ) + + @staticmethod + def build_shared_embeddings( + dicts: Dict[str, Dictionary], + langs: List[str], + embed_dim: int, + build_embedding: callable, + pretrained_embed_path: Optional[str] = None, + ): + """ + Helper function to build shared embeddings for a set of languages after + checking that all dicts corresponding to those languages are equivalent. + + Args: + dicts: Dict of lang_id to its corresponding Dictionary + langs: languages that we want to share embeddings for + embed_dim: embedding dimension + build_embedding: callable function to actually build the embedding + pretrained_embed_path: Optional path to load pretrained embeddings + """ + shared_dict = dicts[langs[0]] + if any(dicts[lang] != shared_dict for lang in langs): + raise ValueError( + "--share-*-embeddings requires a joined dictionary: " + "--share-encoder-embeddings requires a joined source " + "dictionary, --share-decoder-embeddings requires a joined " + "target dictionary, and --share-all-embeddings requires a " + "joint source + target dictionary." + ) + return build_embedding(shared_dict, embed_dim, pretrained_embed_path) + + def forward(self, src_tokens, src_lengths, prev_output_tokens, **kwargs): + raise NotImplementedError + + def max_positions(self): + """Maximum length supported by the model.""" + return { + key: ( + self.models[key].encoder.max_positions(), + self.models[key].decoder.max_positions(), + ) + for key in self.keys + } + + def max_decoder_positions(self): + """Maximum length supported by the decoder.""" + return min(model.decoder.max_positions() for model in self.models.values()) + + @property + def encoder(self): + return self.models[self.keys[0]].encoder + + @property + def decoder(self): + return self.models[self.keys[0]].decoder + + def forward_decoder(self, prev_output_tokens, **kwargs): + return self.decoder(prev_output_tokens, **kwargs) + + def load_state_dict( + self, + state_dict, + strict=True, + model_cfg=None, + args: Optional[Namespace] = None, + ): + """Copies parameters and buffers from *state_dict* into this module and + its descendants. + + Overrides the method in :class:`nn.Module`. Compared with that method + this additionally "upgrades" *state_dicts* from old checkpoints. + """ + + if model_cfg is None and args is not None: + logger.warn("using 'args' is deprecated, please update your code to use dataclass config") + model_cfg = convert_namespace_to_omegaconf(args).model + + self.upgrade_state_dict(state_dict) + + from fairseq.checkpoint_utils import prune_state_dict + + new_state_dict = prune_state_dict(state_dict, model_cfg) + return super().load_state_dict(new_state_dict, strict) + + +class FairseqLanguageModel(BaseFairseqModel): + """Base class for decoder-only models. + + Args: + decoder (FairseqDecoder): the decoder + """ + + def __init__(self, decoder): + super().__init__() + self.decoder = decoder + check_type(self.decoder, FairseqDecoder) + + def forward(self, src_tokens, **kwargs): + """ + Run the forward pass for a decoder-only model. + + Feeds a batch of tokens through the decoder to predict the next tokens. + + Args: + src_tokens (LongTensor): tokens on which to condition the decoder, + of shape `(batch, tgt_len)` + src_lengths (LongTensor): source sentence lengths of shape `(batch)` + + Returns: + tuple: + - the decoder's output of shape `(batch, seq_len, vocab)` + - a dictionary with any model-specific outputs + """ + return self.decoder(src_tokens, **kwargs) + + def forward_decoder(self, prev_output_tokens, **kwargs): + return self.decoder(prev_output_tokens, **kwargs) + + def extract_features(self, src_tokens, **kwargs): + """ + Similar to *forward* but only return features. + + Returns: + tuple: + - the decoder's features of shape `(batch, seq_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + return self.decoder.extract_features(src_tokens, **kwargs) + + def output_layer(self, features, **kwargs): + """Project features to the default output size (typically vocabulary size).""" + return self.decoder.output_layer(features, **kwargs) + + def max_positions(self): + """Maximum length supported by the model.""" + return self.decoder.max_positions() + + def max_decoder_positions(self): + """Maximum length supported by the decoder.""" + return self.decoder.max_positions() + + @property + def supported_targets(self): + return {"future"} + + +class FairseqEncoderModel(BaseFairseqModel): + """Base class for encoder-only models. + + Args: + encoder (FairseqEncoder): the encoder + """ + + def __init__(self, encoder): + super().__init__() + self.encoder = encoder + check_type(self.encoder, FairseqEncoder) + + def forward(self, src_tokens, src_lengths, **kwargs): + """ + Run the forward pass for a encoder-only model. + + Feeds a batch of tokens through the encoder to generate features. + + Args: + src_tokens (LongTensor): input tokens of shape `(batch, src_len)` + src_lengths (LongTensor): source sentence lengths of shape `(batch)` + + Returns: + the encoder's output, typically of shape `(batch, src_len, features)` + """ + return self.encoder(src_tokens, src_lengths, **kwargs) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + encoder_out = net_output["encoder_out"] + if torch.is_tensor(encoder_out): + logits = encoder_out.float() + if log_probs: + return F.log_softmax(logits, dim=-1) + else: + return F.softmax(logits, dim=-1) + raise NotImplementedError + + def max_positions(self): + """Maximum length supported by the model.""" + return self.encoder.max_positions() diff --git a/SpeechT5/fairseq/fairseq/models/fconv.py b/SpeechT5/fairseq/fairseq/models/fconv.py new file mode 100644 index 0000000..c99a215 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/fconv.py @@ -0,0 +1,756 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, + register_model_architecture, +) +from fairseq.modules import ( + AdaptiveSoftmax, + BeamableMM, + FairseqDropout, + GradMultiply, + LearnedPositionalEmbedding, + LinearizedConvolution, +) + + +@register_model("fconv") +class FConvModel(FairseqEncoderDecoderModel): + """ + A fully convolutional model, i.e. a convolutional encoder and a + convolutional decoder, as described in `"Convolutional Sequence to Sequence + Learning" (Gehring et al., 2017) <https://arxiv.org/abs/1705.03122>`_. + + Args: + encoder (FConvEncoder): the encoder + decoder (FConvDecoder): the decoder + + The Convolutional model provides the following named architectures and + command-line arguments: + + .. argparse:: + :ref: fairseq.models.fconv_parser + :prog: + """ + + @classmethod + def hub_models(cls): + def moses_subword(path): + return { + "path": path, + "tokenizer": "moses", + "bpe": "subword_nmt", + } + + return { + "conv.wmt14.en-fr": moses_subword( + "https://dl.fbaipublicfiles.com/fairseq/models/wmt14.v2.en-fr.fconv-py.tar.bz2" + ), + "conv.wmt14.en-de": moses_subword( + "https://dl.fbaipublicfiles.com/fairseq/models/wmt14.en-de.fconv-py.tar.bz2" + ), + "conv.wmt17.en-de": moses_subword( + "https://dl.fbaipublicfiles.com/fairseq/models/wmt17.v2.en-de.fconv-py.tar.bz2" + ), + } + + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + self.encoder.num_attention_layers = sum( + layer is not None for layer in decoder.attention + ) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--dropout', type=float, metavar='D', + help='dropout probability') + parser.add_argument('--encoder-embed-dim', type=int, metavar='N', + help='encoder embedding dimension') + parser.add_argument('--encoder-embed-path', type=str, metavar='STR', + help='path to pre-trained encoder embedding') + parser.add_argument('--encoder-layers', type=str, metavar='EXPR', + help='encoder layers [(dim, kernel_size), ...]') + parser.add_argument('--decoder-embed-dim', type=int, metavar='N', + help='decoder embedding dimension') + parser.add_argument('--decoder-embed-path', type=str, metavar='STR', + help='path to pre-trained decoder embedding') + parser.add_argument('--decoder-layers', type=str, metavar='EXPR', + help='decoder layers [(dim, kernel_size), ...]') + parser.add_argument('--decoder-out-embed-dim', type=int, metavar='N', + help='decoder output embedding dimension') + parser.add_argument('--decoder-attention', type=str, metavar='EXPR', + help='decoder attention [True, ...]') + parser.add_argument('--share-input-output-embed', action='store_true', + help='share input and output embeddings (requires' + ' --decoder-out-embed-dim and --decoder-embed-dim' + ' to be equal)') + # fmt: on + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + # make sure that all args are properly defaulted (in case there are any new ones) + base_architecture(args) + + encoder_embed_dict = None + if args.encoder_embed_path: + encoder_embed_dict = utils.parse_embedding(args.encoder_embed_path) + utils.print_embed_overlap(encoder_embed_dict, task.source_dictionary) + + decoder_embed_dict = None + if args.decoder_embed_path: + decoder_embed_dict = utils.parse_embedding(args.decoder_embed_path) + utils.print_embed_overlap(decoder_embed_dict, task.target_dictionary) + + encoder = FConvEncoder( + dictionary=task.source_dictionary, + embed_dim=args.encoder_embed_dim, + embed_dict=encoder_embed_dict, + convolutions=eval(args.encoder_layers), + dropout=args.dropout, + max_positions=args.max_source_positions, + ) + decoder = FConvDecoder( + dictionary=task.target_dictionary, + embed_dim=args.decoder_embed_dim, + embed_dict=decoder_embed_dict, + convolutions=eval(args.decoder_layers), + out_embed_dim=args.decoder_out_embed_dim, + attention=eval(args.decoder_attention), + dropout=args.dropout, + max_positions=args.max_target_positions, + share_embed=args.share_input_output_embed, + ) + return FConvModel(encoder, decoder) + + +class FConvEncoder(FairseqEncoder): + """ + Convolutional encoder consisting of `len(convolutions)` layers. + + Args: + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_dim (int, optional): embedding dimension + embed_dict (str, optional): filename from which to load pre-trained + embeddings + max_positions (int, optional): maximum supported input sequence length + convolutions (list, optional): the convolutional layer structure. Each + list item `i` corresponds to convolutional layer `i`. Layers are + given as ``(out_channels, kernel_width, [residual])``. Residual + connections are added between layers when ``residual=1`` (which is + the default behavior). + dropout (float, optional): dropout to be applied before each conv layer + """ + + def __init__( + self, + dictionary, + embed_dim=512, + embed_dict=None, + max_positions=1024, + convolutions=((512, 3),) * 20, + dropout=0.1, + ): + super().__init__(dictionary) + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.num_attention_layers = None + + num_embeddings = len(dictionary) + self.padding_idx = dictionary.pad() + self.embed_tokens = Embedding(num_embeddings, embed_dim, self.padding_idx) + if embed_dict: + self.embed_tokens = utils.load_embedding( + embed_dict, self.dictionary, self.embed_tokens + ) + + self.embed_positions = PositionalEmbedding( + max_positions, + embed_dim, + self.padding_idx, + ) + + convolutions = extend_conv_spec(convolutions) + in_channels = convolutions[0][0] + self.fc1 = Linear(embed_dim, in_channels, dropout=dropout) + self.projections = nn.ModuleList() + self.convolutions = nn.ModuleList() + self.residuals = [] + + layer_in_channels = [in_channels] + for _, (out_channels, kernel_size, residual) in enumerate(convolutions): + if residual == 0: + residual_dim = out_channels + else: + residual_dim = layer_in_channels[-residual] + self.projections.append( + Linear(residual_dim, out_channels) + if residual_dim != out_channels + else None + ) + if kernel_size % 2 == 1: + padding = kernel_size // 2 + else: + padding = 0 + self.convolutions.append( + ConvTBC( + in_channels, + out_channels * 2, + kernel_size, + dropout=dropout, + padding=padding, + ) + ) + self.residuals.append(residual) + in_channels = out_channels + layer_in_channels.append(out_channels) + self.fc2 = Linear(in_channels, embed_dim) + + def forward(self, src_tokens, src_lengths): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (LongTensor): lengths of each source sentence of shape + `(batch)` + + Returns: + dict: + - **encoder_out** (tuple): a tuple with two elements, where the + first element is the last encoder layer's output and the + second element is the same quantity summed with the input + embedding (used for attention). The shape of both tensors is + `(batch, src_len, embed_dim)`. + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + """ + # embed tokens and positions + x = self.embed_tokens(src_tokens) + self.embed_positions(src_tokens) + x = self.dropout_module(x) + input_embedding = x + + # project to size of convolution + x = self.fc1(x) + + # used to mask padding in input + encoder_padding_mask = src_tokens.eq(self.padding_idx).t() # -> T x B + if not encoder_padding_mask.any(): + encoder_padding_mask = None + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + residuals = [x] + # temporal convolutions + for proj, conv, res_layer in zip( + self.projections, self.convolutions, self.residuals + ): + if res_layer > 0: + residual = residuals[-res_layer] + residual = residual if proj is None else proj(residual) + else: + residual = None + + if encoder_padding_mask is not None: + x = x.masked_fill(encoder_padding_mask.unsqueeze(-1), 0) + + x = self.dropout_module(x) + if conv.kernel_size[0] % 2 == 1: + # padding is implicit in the conv + x = conv(x) + else: + padding_l = (conv.kernel_size[0] - 1) // 2 + padding_r = conv.kernel_size[0] // 2 + x = F.pad(x, (0, 0, 0, 0, padding_l, padding_r)) + x = conv(x) + x = F.glu(x, dim=2) + + if residual is not None: + x = (x + residual) * math.sqrt(0.5) + residuals.append(x) + + # T x B x C -> B x T x C + x = x.transpose(1, 0) + + # project back to size of embedding + x = self.fc2(x) + + if encoder_padding_mask is not None: + encoder_padding_mask = encoder_padding_mask.t() # -> B x T + x = x.masked_fill(encoder_padding_mask.unsqueeze(-1), 0) + + # scale gradients (this only affects backward, not forward) + x = GradMultiply.apply(x, 1.0 / (2.0 * self.num_attention_layers)) + + # add output to input embedding for attention + y = (x + input_embedding) * math.sqrt(0.5) + + return { + "encoder_out": (x, y), + "encoder_padding_mask": encoder_padding_mask, # B x T + } + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = ( + encoder_out["encoder_out"][0].index_select(0, new_order), + encoder_out["encoder_out"][1].index_select(0, new_order), + ) + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return self.embed_positions.max_positions + + +class AttentionLayer(nn.Module): + def __init__(self, conv_channels, embed_dim, bmm=None): + super().__init__() + # projects from output of convolution to embedding dimension + self.in_projection = Linear(conv_channels, embed_dim) + # projects from embedding dimension to convolution size + self.out_projection = Linear(embed_dim, conv_channels) + + self.bmm = bmm if bmm is not None else torch.bmm + + def forward(self, x, target_embedding, encoder_out, encoder_padding_mask): + residual = x + + # attention + x = (self.in_projection(x) + target_embedding) * math.sqrt(0.5) + x = self.bmm(x, encoder_out[0]) + + # don't attend over padding + if encoder_padding_mask is not None: + x = ( + x.float() + .masked_fill(encoder_padding_mask.unsqueeze(1), float("-inf")) + .type_as(x) + ) # FP16 support: cast to float and back + + # softmax over last dim + sz = x.size() + x = F.softmax(x.view(sz[0] * sz[1], sz[2]), dim=1) + x = x.view(sz) + attn_scores = x + + x = self.bmm(x, encoder_out[1]) + + # scale attention output (respecting potentially different lengths) + s = encoder_out[1].size(1) + if encoder_padding_mask is None: + x = x * (s * math.sqrt(1.0 / s)) + else: + s = s - encoder_padding_mask.type_as(x).sum( + dim=1, keepdim=True + ) # exclude padding + s = s.unsqueeze(-1) + x = x * (s * s.rsqrt()) + + # project back + x = (self.out_projection(x) + residual) * math.sqrt(0.5) + return x, attn_scores + + def make_generation_fast_(self, beamable_mm_beam_size=None, **kwargs): + """Replace torch.bmm with BeamableMM.""" + if beamable_mm_beam_size is not None: + del self.bmm + self.add_module("bmm", BeamableMM(beamable_mm_beam_size)) + + +class FConvDecoder(FairseqIncrementalDecoder): + """Convolutional decoder""" + + def __init__( + self, + dictionary, + embed_dim=512, + embed_dict=None, + out_embed_dim=256, + max_positions=1024, + convolutions=((512, 3),) * 20, + attention=True, + dropout=0.1, + share_embed=False, + positional_embeddings=True, + adaptive_softmax_cutoff=None, + adaptive_softmax_dropout=0.0, + ): + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([2])) + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.need_attn = True + + convolutions = extend_conv_spec(convolutions) + in_channels = convolutions[0][0] + if isinstance(attention, bool): + # expand True into [True, True, ...] and do the same with False + attention = [attention] * len(convolutions) + if not isinstance(attention, list) or len(attention) != len(convolutions): + raise ValueError( + "Attention is expected to be a list of booleans of " + "length equal to the number of layers." + ) + + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + self.embed_tokens = Embedding(num_embeddings, embed_dim, padding_idx) + if embed_dict: + self.embed_tokens = utils.load_embedding( + embed_dict, self.dictionary, self.embed_tokens + ) + + self.embed_positions = ( + PositionalEmbedding( + max_positions, + embed_dim, + padding_idx, + ) + if positional_embeddings + else None + ) + + self.fc1 = Linear(embed_dim, in_channels, dropout=dropout) + self.projections = nn.ModuleList() + self.convolutions = nn.ModuleList() + self.attention = nn.ModuleList() + self.residuals = [] + + layer_in_channels = [in_channels] + for i, (out_channels, kernel_size, residual) in enumerate(convolutions): + if residual == 0: + residual_dim = out_channels + else: + residual_dim = layer_in_channels[-residual] + self.projections.append( + Linear(residual_dim, out_channels) + if residual_dim != out_channels + else None + ) + self.convolutions.append( + LinearizedConv1d( + in_channels, + out_channels * 2, + kernel_size, + padding=(kernel_size - 1), + dropout=dropout, + ) + ) + self.attention.append( + AttentionLayer(out_channels, embed_dim) if attention[i] else None + ) + self.residuals.append(residual) + in_channels = out_channels + layer_in_channels.append(out_channels) + + self.adaptive_softmax = None + self.fc2 = self.fc3 = None + + if adaptive_softmax_cutoff is not None: + assert not share_embed + self.adaptive_softmax = AdaptiveSoftmax( + num_embeddings, + in_channels, + adaptive_softmax_cutoff, + dropout=adaptive_softmax_dropout, + ) + else: + self.fc2 = Linear(in_channels, out_embed_dim) + if share_embed: + assert out_embed_dim == embed_dim, ( + "Shared embed weights implies same dimensions " + " out_embed_dim={} vs embed_dim={}".format(out_embed_dim, embed_dim) + ) + self.fc3 = nn.Linear(out_embed_dim, num_embeddings) + self.fc3.weight = self.embed_tokens.weight + else: + self.fc3 = Linear(out_embed_dim, num_embeddings, dropout=dropout) + + def forward( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **unused + ): + if encoder_out is not None: + encoder_padding_mask = encoder_out["encoder_padding_mask"] + encoder_out = encoder_out["encoder_out"] + + # split and transpose encoder outputs + encoder_a, encoder_b = self._split_encoder_out( + encoder_out, incremental_state + ) + + if self.embed_positions is not None: + pos_embed = self.embed_positions(prev_output_tokens, incremental_state) + else: + pos_embed = 0 + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + x = self._embed_tokens(prev_output_tokens, incremental_state) + + # embed tokens and combine with positional embeddings + x += pos_embed + x = self.dropout_module(x) + target_embedding = x + + # project to size of convolution + x = self.fc1(x) + + # B x T x C -> T x B x C + x = self._transpose_if_training(x, incremental_state) + + # temporal convolutions + avg_attn_scores = None + num_attn_layers = len(self.attention) + residuals = [x] + for proj, conv, attention, res_layer in zip( + self.projections, self.convolutions, self.attention, self.residuals + ): + if res_layer > 0: + residual = residuals[-res_layer] + residual = residual if proj is None else proj(residual) + else: + residual = None + + x = self.dropout_module(x) + x = conv(x, incremental_state) + x = F.glu(x, dim=2) + + # attention + if attention is not None: + x = self._transpose_if_training(x, incremental_state) + + x, attn_scores = attention( + x, target_embedding, (encoder_a, encoder_b), encoder_padding_mask + ) + + if not self.training and self.need_attn: + attn_scores = attn_scores / num_attn_layers + if avg_attn_scores is None: + avg_attn_scores = attn_scores + else: + avg_attn_scores.add_(attn_scores) + + x = self._transpose_if_training(x, incremental_state) + + # residual + if residual is not None: + x = (x + residual) * math.sqrt(0.5) + residuals.append(x) + + # T x B x C -> B x T x C + x = self._transpose_if_training(x, incremental_state) + + # project back to size of vocabulary if not using adaptive softmax + if self.fc2 is not None and self.fc3 is not None: + x = self.fc2(x) + x = self.dropout_module(x) + x = self.fc3(x) + + return x, avg_attn_scores + + def reorder_incremental_state(self, incremental_state, new_order): + super().reorder_incremental_state(incremental_state, new_order) + encoder_out = utils.get_incremental_state( + self, incremental_state, "encoder_out" + ) + if encoder_out is not None: + encoder_out = tuple(eo.index_select(0, new_order) for eo in encoder_out) + utils.set_incremental_state( + self, incremental_state, "encoder_out", encoder_out + ) + + def max_positions(self): + """Maximum output length supported by the decoder.""" + return ( + self.embed_positions.max_positions + if self.embed_positions is not None + else float("inf") + ) + + def upgrade_state_dict(self, state_dict): + if utils.item(state_dict.get("decoder.version", torch.Tensor([1]))[0]) < 2: + # old models use incorrect weight norm dimension + for i, conv in enumerate(self.convolutions): + # reconfigure weight norm + nn.utils.remove_weight_norm(conv) + self.convolutions[i] = nn.utils.weight_norm(conv, dim=0) + state_dict["decoder.version"] = torch.Tensor([1]) + return state_dict + + def make_generation_fast_(self, need_attn=False, **kwargs): + self.need_attn = need_attn + + def _embed_tokens(self, tokens, incremental_state): + if incremental_state is not None: + # keep only the last token for incremental forward pass + tokens = tokens[:, -1:] + return self.embed_tokens(tokens) + + def _split_encoder_out(self, encoder_out, incremental_state): + """Split and transpose encoder outputs. + + This is cached when doing incremental inference. + """ + cached_result = utils.get_incremental_state( + self, incremental_state, "encoder_out" + ) + if cached_result is not None: + return cached_result + + # transpose only once to speed up attention layers + encoder_a, encoder_b = encoder_out + encoder_a = encoder_a.transpose(1, 2).contiguous() + result = (encoder_a, encoder_b) + + if incremental_state is not None: + utils.set_incremental_state(self, incremental_state, "encoder_out", result) + return result + + def _transpose_if_training(self, x, incremental_state): + if incremental_state is None: + x = x.transpose(0, 1) + return x + + +def extend_conv_spec(convolutions): + """ + Extends convolutional spec that is a list of tuples of 2 or 3 parameters + (kernel size, dim size and optionally how many layers behind to look for residual) + to default the residual propagation param if it is not specified + """ + extended = [] + for spec in convolutions: + if len(spec) == 3: + extended.append(spec) + elif len(spec) == 2: + extended.append(spec + (1,)) + else: + raise Exception( + "invalid number of parameters in convolution spec " + + str(spec) + + ". expected 2 or 3" + ) + return tuple(extended) + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, 0, 0.1) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def PositionalEmbedding(num_embeddings, embedding_dim, padding_idx): + m = LearnedPositionalEmbedding(num_embeddings, embedding_dim, padding_idx) + nn.init.normal_(m.weight, 0, 0.1) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, dropout=0.0): + """Weight-normalized Linear layer (input: N x T x C)""" + m = nn.Linear(in_features, out_features) + nn.init.normal_(m.weight, mean=0, std=math.sqrt((1 - dropout) / in_features)) + nn.init.constant_(m.bias, 0) + return nn.utils.weight_norm(m) + + +def LinearizedConv1d(in_channels, out_channels, kernel_size, dropout=0.0, **kwargs): + """Weight-normalized Conv1d layer optimized for decoding""" + m = LinearizedConvolution(in_channels, out_channels, kernel_size, **kwargs) + std = math.sqrt((4 * (1.0 - dropout)) / (m.kernel_size[0] * in_channels)) + nn.init.normal_(m.weight, mean=0, std=std) + nn.init.constant_(m.bias, 0) + return nn.utils.weight_norm(m, dim=2) + + +def ConvTBC(in_channels, out_channels, kernel_size, dropout=0.0, **kwargs): + """Weight-normalized Conv1d layer""" + from fairseq.modules import ConvTBC + + m = ConvTBC(in_channels, out_channels, kernel_size, **kwargs) + std = math.sqrt((4 * (1.0 - dropout)) / (m.kernel_size[0] * in_channels)) + nn.init.normal_(m.weight, mean=0, std=std) + nn.init.constant_(m.bias, 0) + return nn.utils.weight_norm(m, dim=2) + + +@register_model_architecture("fconv", "fconv") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.1) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_layers = getattr(args, "encoder_layers", "[(512, 3)] * 20") + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_layers = getattr(args, "decoder_layers", "[(512, 3)] * 20") + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 256) + args.decoder_attention = getattr(args, "decoder_attention", "True") + args.share_input_output_embed = getattr(args, "share_input_output_embed", False) + + +@register_model_architecture("fconv", "fconv_iwslt_de_en") +def fconv_iwslt_de_en(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 256) + args.encoder_layers = getattr(args, "encoder_layers", "[(256, 3)] * 4") + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 256) + args.decoder_layers = getattr(args, "decoder_layers", "[(256, 3)] * 3") + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 256) + base_architecture(args) + + +@register_model_architecture("fconv", "fconv_wmt_en_ro") +def fconv_wmt_en_ro(args): + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 512) + base_architecture(args) + + +@register_model_architecture("fconv", "fconv_wmt_en_de") +def fconv_wmt_en_de(args): + convs = "[(512, 3)] * 9" # first 9 layers have 512 units + convs += " + [(1024, 3)] * 4" # next 4 layers have 1024 units + convs += " + [(2048, 1)] * 2" # final 2 layers use 1x1 convolutions + + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 768) + args.encoder_layers = getattr(args, "encoder_layers", convs) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 768) + args.decoder_layers = getattr(args, "decoder_layers", convs) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 512) + base_architecture(args) + + +@register_model_architecture("fconv", "fconv_wmt_en_fr") +def fconv_wmt_en_fr(args): + convs = "[(512, 3)] * 6" # first 6 layers have 512 units + convs += " + [(768, 3)] * 4" # next 4 layers have 768 units + convs += " + [(1024, 3)] * 3" # next 3 layers have 1024 units + convs += " + [(2048, 1)] * 1" # next 1 layer uses 1x1 convolutions + convs += " + [(4096, 1)] * 1" # final 1 layer uses 1x1 convolutions + + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 768) + args.encoder_layers = getattr(args, "encoder_layers", convs) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 768) + args.decoder_layers = getattr(args, "decoder_layers", convs) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 512) + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/fconv_lm.py b/SpeechT5/fairseq/fairseq/models/fconv_lm.py new file mode 100644 index 0000000..07391ea --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/fconv_lm.py @@ -0,0 +1,135 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq import utils +from fairseq.models import ( + FairseqLanguageModel, + register_model, + register_model_architecture, +) +from fairseq.models.fconv import FConvDecoder + + +@register_model("fconv_lm") +class FConvLanguageModel(FairseqLanguageModel): + def __init__(self, decoder): + super().__init__(decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--dropout", type=float, metavar="D", help="dropout probability" + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-layers", + type=str, + metavar="EXPR", + help="decoder layers [(dim, kernel_size), ...]", + ) + parser.add_argument( + "--decoder-out-embed-dim", + type=int, + metavar="N", + help="decoder output embedding dimension", + ) + parser.add_argument( + "--adaptive-softmax-cutoff", + metavar="EXPR", + help="comma separated list of adaptive softmax cutoff points. " + "Must be used with adaptive_loss criterion", + ) + parser.add_argument( + "--adaptive-softmax-dropout", + type=float, + metavar="D", + help="sets adaptive softmax dropout for the tail projections", + ) + parser.add_argument( + "--decoder-attention", + type=str, + metavar="EXPR", + help="decoder attention [True, ...]", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + # make sure all arguments are present in older models + base_lm_architecture(args) + + if hasattr(args, "max_target_positions") and not hasattr( + args, "tokens_per_sample" + ): + args.tokens_per_sample = args.max_target_positions + + decoder = FConvDecoder( + dictionary=task.target_dictionary, + embed_dim=args.decoder_embed_dim, + convolutions=eval(args.decoder_layers), + out_embed_dim=args.decoder_embed_dim, + attention=eval(args.decoder_attention), + dropout=args.dropout, + max_positions=args.tokens_per_sample, + share_embed=False, + positional_embeddings=False, + adaptive_softmax_cutoff=( + utils.eval_str_list(args.adaptive_softmax_cutoff, type=int) + if args.criterion == "adaptive_loss" + else None + ), + adaptive_softmax_dropout=args.adaptive_softmax_dropout, + ) + return FConvLanguageModel(decoder) + + +@register_model_architecture("fconv_lm", "fconv_lm") +def base_lm_architecture(args): + args.dropout = getattr(args, "dropout", 0.1) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 128) + args.decoder_layers = getattr(args, "decoder_layers", "[(1268, 4)] * 13") + args.decoder_attention = getattr(args, "decoder_attention", "False") + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + + +@register_model_architecture("fconv_lm", "fconv_lm_dauphin_wikitext103") +def fconv_lm_dauphin_wikitext103(args): + layers = "[(850, 6)] * 3" + layers += " + [(850, 1)] * 1" + layers += " + [(850, 5)] * 4" + layers += " + [(850, 1)] * 1" + layers += " + [(850, 4)] * 3" + layers += " + [(1024, 4)] * 1" + layers += " + [(2048, 4)] * 1" + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 280) + args.decoder_layers = getattr(args, "decoder_layers", layers) + args.decoder_attention = getattr(args, "decoder_attention", "False") + args.adaptive_softmax_cutoff = getattr( + args, "adaptive_softmax_cutoff", "10000,20000,200000" + ) + base_lm_architecture(args) + + +@register_model_architecture("fconv_lm", "fconv_lm_dauphin_gbw") +def fconv_lm_dauphin_gbw(args): + layers = "[(512, 5)]" + layers += " + [(128, 1, 0), (128, 5, 0), (512, 1, 3)] * 3" + layers += " + [(512, 1, 0), (512, 5, 0), (1024, 1, 3)] * 3" + layers += " + [(1024, 1, 0), (1024, 5, 0), (2048, 1, 3)] * 6" + layers += " + [(1024, 1, 0), (1024, 5, 0), (4096, 1, 3)]" + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 128) + args.decoder_layers = getattr(args, "decoder_layers", layers) + args.decoder_attention = getattr(args, "decoder_attention", "False") + args.adaptive_softmax_cutoff = getattr( + args, "adaptive_softmax_cutoff", "10000,50000,200000" + ) + base_lm_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/fconv_self_att.py b/SpeechT5/fairseq/fairseq/models/fconv_self_att.py new file mode 100644 index 0000000..8357ef7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/fconv_self_att.py @@ -0,0 +1,674 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import math +import os + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import checkpoint_utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.models import ( + CompositeEncoder, + FairseqDecoder, + FairseqEncoder, + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) +from fairseq.modules import ( + DownsampledMultiHeadAttention, + FairseqDropout, + GradMultiply, + LayerNorm, + LearnedPositionalEmbedding, + LinearizedConvolution, +) + + +logger = logging.getLogger(__name__) + + +@register_model("fconv_self_att") +class FConvModelSelfAtt(FairseqEncoderDecoderModel): + @classmethod + def hub_models(cls): + return { + "conv.stories.pretrained": { + "path": "https://dl.fbaipublicfiles.com/fairseq/models/stories_checkpoint.tar.gz", + "checkpoint_file": "pretrained_checkpoint.pt", + "tokenizer": "nltk", + }, + "conv.stories": { + "path": "https://dl.fbaipublicfiles.com/fairseq/models/stories_checkpoint.tar.gz", + "checkpoint_file": "fusion_checkpoint.pt", + "tokenizer": "nltk", + "pretrained": "True", + "pretrained_checkpoint": "./pretrained_checkpoint.pt", + }, + # Test set containing dictionaries + "data.stories": "https://dl.fbaipublicfiles.com/fairseq/data/stories_test.tar.bz2", + } + + def __init__(self, encoder, decoder, pretrained_encoder=None): + super().__init__(encoder, decoder) + self.encoder.num_attention_layers = sum( + layer is not None for layer in decoder.attention + ) + self.pretrained_encoder = pretrained_encoder + if self.pretrained_encoder is None: + encoders = {"encoder": encoder} + else: + encoders = {"encoder": encoder, "pretrained": self.pretrained_encoder} + # for fusion model, CompositeEncoder contains both pretrained and training encoders + # these are forwarded and then combined in the decoder + self.encoder = CompositeEncoder(encoders) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--dropout', type=float, metavar='D', + help='dropout probability') + parser.add_argument('--encoder-embed-dim', type=int, metavar='N', + help='encoder embedding dimension') + parser.add_argument('--encoder-layers', type=str, metavar='EXPR', + help='encoder layers [(dim, kernel_size), ...]') + parser.add_argument('--decoder-embed-dim', type=int, metavar='N', + help='decoder embedding dimension') + parser.add_argument('--decoder-layers', type=str, metavar='EXPR', + help='decoder layers [(dim, kernel_size), ...]') + parser.add_argument('--decoder-out-embed-dim', type=int, metavar='N', + help='decoder output embedding dimension') + parser.add_argument('--decoder-attention', type=str, metavar='EXPR', + help='decoder attention [True, ...]') + parser.add_argument('--self-attention', type=str, metavar='EXPR', + help='decoder self-attention layers, ex: [True] + [False]*5') + parser.add_argument('--multihead-attention-nheads', type=int, + help='Number of heads to use in attention') + parser.add_argument('--multihead-self-attention-nheads', type=int, + help='Number of heads to use in self-attention') + parser.add_argument('--encoder-attention', type=str, metavar='EXPR', + help='encoder attention [True, ...]') + parser.add_argument('--encoder-attention-nheads', type=int, + help='Number of heads to use in encoder attention') + parser.add_argument('--project-input', type=str, metavar='EXPR', + help='Use projections in self-attention [True, ...]') + parser.add_argument('--gated-attention', type=str, metavar='EXPR', + help='Use GLU layers in self-attention projections [True, ...]') + parser.add_argument('--downsample', type=str, metavar='EXPR', + help='Use downsampling in self-attention [True, ...]') + parser.add_argument('--pretrained-checkpoint', metavar='DIR', + help='path to load checkpoint from pretrained model') + parser.add_argument('--pretrained', type=str, metavar='EXPR', + help='use pretrained model when training [True, ...]') + # fmt: on + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + trained_encoder, trained_decoder = None, None + pretrained = eval(args.pretrained) + if pretrained: + logger.info("loading pretrained model") + if not os.path.exists(args.pretrained_checkpoint): + new_pretrained_checkpoint = os.path.join( + args.data, args.pretrained_checkpoint + ) + if os.path.exists(new_pretrained_checkpoint): + args.pretrained_checkpoint = new_pretrained_checkpoint + trained_model = checkpoint_utils.load_model_ensemble( + filenames=[args.pretrained_checkpoint], + task=task, + )[0][0] + trained_decoder = list(trained_model.children())[1] + trained_encoder = list(trained_model.children())[0] + + # freeze pretrained model + for param in trained_decoder.parameters(): + param.requires_grad = False + for param in trained_encoder.parameters(): + param.requires_grad = False + + encoder = FConvEncoder( + task.source_dictionary, + embed_dim=args.encoder_embed_dim, + convolutions=eval(args.encoder_layers), + dropout=args.dropout, + max_positions=args.max_source_positions, + attention=eval(args.encoder_attention), + attention_nheads=args.encoder_attention_nheads, + ) + + decoder = FConvDecoder( + task.target_dictionary, + embed_dim=args.decoder_embed_dim, + convolutions=eval(args.decoder_layers), + out_embed_dim=args.decoder_out_embed_dim, + attention=eval(args.decoder_attention), + dropout=args.dropout, + max_positions=args.max_target_positions, + selfattention=eval(args.self_attention), + attention_nheads=args.multihead_attention_nheads, + selfattention_nheads=args.multihead_self_attention_nheads, + project_input=eval(args.project_input), + gated_attention=eval(args.gated_attention), + downsample=eval(args.downsample), + pretrained=pretrained, + trained_decoder=trained_decoder, + ) + model = FConvModelSelfAtt(encoder, decoder, trained_encoder) + + return model + + @property + def pretrained(self): + return self.pretrained_encoder is not None + + +class FConvEncoder(FairseqEncoder): + """Convolutional encoder""" + + def __init__( + self, + dictionary, + embed_dim=512, + max_positions=1024, + convolutions=((512, 3),) * 20, + dropout=0.1, + attention=False, + attention_nheads=1, + ): + super().__init__(dictionary) + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.num_attention_layers = None + + num_embeddings = len(dictionary) + self.padding_idx = dictionary.pad() + self.embed_tokens = Embedding(num_embeddings, embed_dim, self.padding_idx) + self.embed_positions = PositionalEmbedding( + max_positions, + embed_dim, + self.padding_idx, + ) + + def expand_bool_array(val): + if isinstance(val, bool): + # expand True into [True, True, ...] and do the same with False + return [val] * len(convolutions) + return val + + attention = expand_bool_array(attention) + + in_channels = convolutions[0][0] + self.fc1 = Linear(embed_dim, in_channels, dropout=dropout) + self.projections = nn.ModuleList() + self.convolutions = nn.ModuleList() + self.attention = nn.ModuleList() + self.attproj = nn.ModuleList() + for i, (out_channels, kernel_size) in enumerate(convolutions): + self.projections.append( + Linear(in_channels, out_channels) + if in_channels != out_channels + else None + ) + self.convolutions.append( + ConvTBC(in_channels, out_channels * 2, kernel_size, dropout=dropout) + ) + + self.attention.append( + SelfAttention(out_channels, embed_dim, attention_nheads) + if attention[i] + else None + ) + in_channels = out_channels + + self.fc2 = Linear(in_channels, embed_dim) + + def forward(self, src_tokens, src_lengths): + # embed tokens and positions + x = self.embed_tokens(src_tokens) + self.embed_positions(src_tokens) + x = self.dropout_module(x) + input_embedding = x.transpose(0, 1) + + # project to size of convolution + x = self.fc1(x) + + encoder_padding_mask = src_tokens.eq(self.padding_idx).t() # -> T x B + if not encoder_padding_mask.any(): + encoder_padding_mask = None + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # temporal convolutions + for proj, conv, attention in zip( + self.projections, self.convolutions, self.attention + ): + residual = x if proj is None else proj(x) + + if encoder_padding_mask is not None: + x = x.masked_fill(encoder_padding_mask.unsqueeze(-1), 0) + + x = self.dropout_module(x) + padding_l = (conv.kernel_size[0] - 1) // 2 + padding_r = conv.kernel_size[0] // 2 + x = F.pad(x, (0, 0, 0, 0, padding_l, padding_r)) + x = conv(x) + x = F.glu(x, dim=2) + if attention is not None: + x = attention(x) + x = (x + residual) * math.sqrt(0.5) + + # T x B x C -> B x T x C + x = x.transpose(1, 0) + + # project back to size of embedding + x = self.fc2(x) + + if encoder_padding_mask is not None: + encoder_padding_mask = encoder_padding_mask.t() # -> B x T + x = x.masked_fill(encoder_padding_mask.unsqueeze(-1), 0) + + # scale gradients (this only affects backward, not forward) + x = GradMultiply.apply(x, 1.0 / (2.0 * self.num_attention_layers)) + + # add output to input embedding for attention + y = (x + input_embedding.transpose(0, 1)) * math.sqrt(0.5) + + return { + "encoder_out": (x, y), + "encoder_padding_mask": encoder_padding_mask, # B x T + } + + def reorder_encoder_out(self, encoder_out, new_order): + encoder_out["encoder_out"] = tuple( + eo.index_select(0, new_order) for eo in encoder_out["encoder_out"] + ) + + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + + if "pretrained" in encoder_out: + encoder_out["pretrained"]["encoder_out"] = tuple( + eo.index_select(0, new_order) + for eo in encoder_out["pretrained"]["encoder_out"] + ) + + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return self.embed_positions.max_positions + + +@with_incremental_state +class FConvDecoder(FairseqDecoder): + """Convolutional decoder""" + + def __init__( + self, + dictionary, + embed_dim=512, + out_embed_dim=256, + max_positions=1024, + convolutions=((512, 3),) * 8, + attention=True, + dropout=0.1, + selfattention=False, + attention_nheads=1, + selfattention_nheads=1, + project_input=False, + gated_attention=False, + downsample=False, + pretrained=False, + trained_decoder=None, + ): + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([2])) + self.pretrained = pretrained + self.pretrained_decoder = trained_decoder + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.need_attn = True + in_channels = convolutions[0][0] + + def expand_bool_array(val): + if isinstance(val, bool): + # expand True into [True, True, ...] and do the same with False + return [val] * len(convolutions) + return val + + attention = expand_bool_array(attention) + selfattention = expand_bool_array(selfattention) + + if not isinstance(attention, list) or len(attention) != len(convolutions): + raise ValueError( + "Attention is expected to be a list of booleans of " + "length equal to the number of layers." + ) + + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + self.embed_tokens = Embedding(num_embeddings, embed_dim, padding_idx) + + self.embed_positions = PositionalEmbedding( + max_positions, + embed_dim, + padding_idx, + ) + + self.fc1 = Linear(embed_dim, in_channels, dropout=dropout) + self.projections = nn.ModuleList() + self.convolutions = nn.ModuleList() + self.attention = nn.ModuleList() + self.selfattention = nn.ModuleList() + self.attproj = nn.ModuleList() + for i, (out_channels, kernel_size) in enumerate(convolutions): + self.projections.append( + Linear(in_channels, out_channels) + if in_channels != out_channels + else None + ) + self.convolutions.append( + LinearizedConv1d( + in_channels, + out_channels * 2, + kernel_size, + padding=(kernel_size - 1), + dropout=dropout, + ) + ) + + self.attention.append( + DownsampledMultiHeadAttention( + out_channels, + embed_dim, + attention_nheads, + project_input=project_input, + gated=False, + downsample=False, + ) + if attention[i] + else None + ) + + self.attproj.append( + Linear(out_channels, embed_dim, dropout=dropout) + if attention[i] + else None + ) + self.selfattention.append( + SelfAttention( + out_channels, + embed_dim, + selfattention_nheads, + project_input=project_input, + gated=gated_attention, + downsample=downsample, + ) + if selfattention[i] + else None + ) + in_channels = out_channels + + self.fc2 = Linear(in_channels, out_embed_dim) + self.fc3 = Linear(out_embed_dim, num_embeddings, dropout=dropout) + + # model fusion + if self.pretrained: + # independent gates are learned from the concatenated input + self.gate1 = nn.Sequential( + Linear(out_embed_dim * 2, out_embed_dim), nn.Sigmoid() + ) + self.gate2 = nn.Sequential( + Linear(out_embed_dim * 2, out_embed_dim), nn.Sigmoid() + ) + # pretrained and trained models are joined + self.joining = nn.Sequential( + Linear(out_embed_dim * 2, out_embed_dim * 2), + LayerNorm(out_embed_dim * 2), + nn.GLU(), + Linear(out_embed_dim, out_embed_dim * 2), + LayerNorm(out_embed_dim * 2), + nn.GLU(), + Linear(out_embed_dim, out_embed_dim), + LayerNorm(out_embed_dim), + ) + # pretrained model contains an output layer that is nhid -> vocab size + # but the models are combined in their hidden state + # the hook stores the output of the pretrained model forward + self.pretrained_outputs = {} + + def save_output(): + def hook(a, b, output): + self.pretrained_outputs["out"] = output + + return hook + + self.pretrained_decoder.fc2.register_forward_hook(save_output()) + + def forward(self, prev_output_tokens, encoder_out): + trained_encoder_out = encoder_out["pretrained"] if self.pretrained else None + encoder_out = encoder_out["encoder"]["encoder_out"] + + encoder_a, encoder_b = self._split_encoder_out(encoder_out) + + # embed positions + positions = self.embed_positions(prev_output_tokens) + + # embed tokens and positions + x = self.embed_tokens(prev_output_tokens) + positions + x = self.dropout_module(x) + target_embedding = x.transpose(0, 1) + + # project to size of convolution + x = self.fc1(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # temporal convolutions + avg_attn_scores = None + for proj, conv, attention, selfattention, attproj in zip( + self.projections, + self.convolutions, + self.attention, + self.selfattention, + self.attproj, + ): + residual = x if proj is None else proj(x) + + x = self.dropout_module(x) + x = conv(x) + x = F.glu(x, dim=2) + + # attention + if attention is not None: + r = x + x, attn_scores = attention( + attproj(x) + target_embedding, encoder_a, encoder_b + ) + x = x + r + if not self.training and self.need_attn: + if avg_attn_scores is None: + avg_attn_scores = attn_scores + else: + avg_attn_scores.add_(attn_scores) + + if selfattention is not None: + x = selfattention(x) + + x = (x + residual) * math.sqrt(0.5) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + # project back to size of vocabulary + x = self.fc2(x) + x = self.dropout_module(x) + if not self.pretrained: + x = self.fc3(x) + + # fusion gating + if self.pretrained: + trained_x, _ = self.pretrained_decoder.forward( + prev_output_tokens, trained_encoder_out + ) + y = torch.cat([x, self.pretrained_outputs["out"]], dim=-1) + gate1 = self.gate1(y) + gate2 = self.gate2(y) + gated_x1 = gate1 * x + gated_x2 = gate2 * self.pretrained_outputs["out"] + fusion = torch.cat([gated_x1, gated_x2], dim=-1) + fusion = self.joining(fusion) + fusion_output = self.fc3(fusion) + return fusion_output, avg_attn_scores + else: + return x, avg_attn_scores + + def max_positions(self): + """Maximum output length supported by the decoder.""" + return self.embed_positions.max_positions + + def make_generation_fast_(self, need_attn=False, **kwargs): + self.need_attn = need_attn + + def _split_encoder_out(self, encoder_out): + """Split and transpose encoder outputs.""" + # transpose only once to speed up attention layers + encoder_a, encoder_b = encoder_out + encoder_a = encoder_a.transpose(0, 1).contiguous() + encoder_b = encoder_b.transpose(0, 1).contiguous() + result = (encoder_a, encoder_b) + return result + + +class SelfAttention(nn.Module): + def __init__( + self, + out_channels, + embed_dim, + num_heads, + project_input=False, + gated=False, + downsample=False, + ): + super().__init__() + self.attention = DownsampledMultiHeadAttention( + out_channels, + embed_dim, + num_heads, + dropout=0, + bias=True, + project_input=project_input, + gated=gated, + downsample=downsample, + ) + self.in_proj_q = Linear(out_channels, embed_dim) + self.in_proj_k = Linear(out_channels, embed_dim) + self.in_proj_v = Linear(out_channels, embed_dim) + self.ln = LayerNorm(out_channels) + + def forward(self, x): + residual = x + query = self.in_proj_q(x) + key = self.in_proj_k(x) + value = self.in_proj_v(x) + x, _ = self.attention( + query, key, value, mask_future_timesteps=True, use_scalar_bias=True + ) + return self.ln(x + residual) + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + m.weight.data.normal_(0, 0.1) + return m + + +def PositionalEmbedding(num_embeddings, embedding_dim, padding_idx): + m = LearnedPositionalEmbedding(num_embeddings, embedding_dim, padding_idx) + m.weight.data.normal_(0, 0.1) + return m + + +def Linear(in_features, out_features, dropout=0.0): + """Weight-normalized Linear layer (input: N x T x C)""" + m = nn.Linear(in_features, out_features) + m.weight.data.normal_(mean=0, std=math.sqrt((1 - dropout) / in_features)) + m.bias.data.zero_() + return m + + +def LinearizedConv1d(in_channels, out_channels, kernel_size, dropout=0.0, **kwargs): + """Weight-normalized Conv1d layer optimized for decoding""" + m = LinearizedConvolution(in_channels, out_channels, kernel_size, **kwargs) + std = math.sqrt((4 * (1.0 - dropout)) / (m.kernel_size[0] * in_channels)) + m.weight.data.normal_(mean=0, std=std) + m.bias.data.zero_() + return m + + +def ConvTBC(in_channels, out_channels, kernel_size, dropout=0.0, **kwargs): + """Weight-normalized Conv1d layer""" + from fairseq.modules import ConvTBC + + m = ConvTBC(in_channels, out_channels, kernel_size, **kwargs) + std = math.sqrt((4 * (1.0 - dropout)) / (m.kernel_size[0] * in_channels)) + m.weight.data.normal_(mean=0, std=std) + m.bias.data.zero_() + return m + + +@register_model_architecture("fconv_self_att", "fconv_self_att") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.1) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_layers = getattr(args, "encoder_layers", "[(512, 3)] * 3") + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_layers = getattr(args, "decoder_layers", "[(512, 3)] * 8") + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 256) + args.decoder_attention = getattr(args, "decoder_attention", "True") + args.self_attention = getattr(args, "self_attention", "False") + args.encoder_attention = getattr(args, "encoder_attention", "False") + args.multihead_attention_nheads = getattr(args, "multihead_attention_nheads", 1) + args.multihead_self_attention_nheads = getattr( + args, "multihead_self_attention_nheads", 1 + ) + args.encoder_attention_nheads = getattr(args, "encoder_attention_nheads", 1) + args.project_input = getattr(args, "project_input", "False") + args.gated_attention = getattr(args, "gated_attention", "False") + args.downsample = getattr(args, "downsample", "False") + args.pretrained_checkpoint = getattr(args, "pretrained_checkpoint", "") + args.pretrained = getattr(args, "pretrained", "False") + + +@register_model_architecture("fconv_self_att", "fconv_self_att_wp") +def fconv_self_att_wp(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 256) + args.encoder_layers = getattr( + args, "encoder_layers", "[(128, 3)] * 2 + [(512,3)] * 1" + ) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 256) + args.decoder_layers = getattr( + args, "decoder_layers", "[(512, 4)] * 4 + [(768, 4)] * 2 + [(1024, 4)] * 1" + ) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 256) + args.self_attention = getattr(args, "self_attention", "True") + args.multihead_self_attention_nheads = getattr( + args, "multihead_self_attention_nheads", 4 + ) + args.project_input = getattr(args, "project_input", "True") + args.gated_attention = getattr(args, "gated_attention", "True") + args.downsample = getattr(args, "downsample", "True") + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/hubert/__init__.py b/SpeechT5/fairseq/fairseq/models/hubert/__init__.py new file mode 100644 index 0000000..a1b0eab --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/hubert/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .hubert import * # noqa +from .hubert_asr import * # noqa diff --git a/SpeechT5/fairseq/fairseq/models/hubert/hubert.py b/SpeechT5/fairseq/fairseq/models/hubert/hubert.py new file mode 100644 index 0000000..232a5e4 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/hubert/hubert.py @@ -0,0 +1,563 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from typing import Dict, List, Optional, Tuple + +import numpy as np + +import torch +import torch.nn as nn +from dataclasses import dataclass, field +from fairseq import utils +from fairseq.data.data_utils import compute_mask_indices +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.wav2vec.wav2vec2 import ( + ConvFeatureExtractionModel, + TransformerEncoder, +) +from fairseq.modules import GradMultiply, LayerNorm +from fairseq.tasks.hubert_pretraining import ( + HubertPretrainingConfig, + HubertPretrainingTask, +) +from omegaconf import II + +logger = logging.getLogger(__name__) + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum( + ["static", "uniform", "normal", "poisson"] +) + + +@dataclass +class HubertConfig(FairseqDataclass): + label_rate: int = II("task.label_rate") + + extractor_mode: EXTRACTOR_MODE_CHOICES = field( + default="default", + metadata={ + "help": "mode for feature extractor. default has a single group " + "norm with d groups in the first conv block, whereas layer_norm " + "has layer norms in every block (meant to use with normalize=True)" + }, + ) + encoder_layers: int = field( + default=12, metadata={"help": "num encoder layers in the transformer"} + ) + encoder_embed_dim: int = field( + default=768, metadata={"help": "encoder embedding dimension"} + ) + encoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "encoder embedding dimension for FFN"} + ) + encoder_attention_heads: int = field( + default=12, metadata={"help": "num encoder attention heads"} + ) + activation_fn: ChoiceEnum(utils.get_available_activation_fns()) = field( + default="gelu", metadata={"help": "activation function to use"} + ) + + # dropouts + dropout: float = field( + default=0.1, + metadata={"help": "dropout probability for the transformer"}, + ) + attention_dropout: float = field( + default=0.1, + metadata={"help": "dropout probability for attention weights"}, + ) + activation_dropout: float = field( + default=0.0, + metadata={"help": "dropout probability after activation in FFN"}, + ) + encoder_layerdrop: float = field( + default=0.0, + metadata={"help": "probability of dropping a tarnsformer layer"}, + ) + dropout_input: float = field( + default=0.0, + metadata={"help": "dropout to apply to the input (after feat extr)"}, + ) + dropout_features: float = field( + default=0.0, + metadata={ + "help": "dropout to apply to the features (after feat extr)" + }, + ) + + final_dim: int = field( + default=0, + metadata={ + "help": "project final representations and targets to this many " + "dimensions. set to encoder_embed_dim is <= 0" + }, + ) + untie_final_proj: bool = field( + default=False, + metadata={"help": "use separate projection for each target"}, + ) + layer_norm_first: bool = field( + default=False, + metadata={"help": "apply layernorm first in the transformer"}, + ) + conv_feature_layers: str = field( + default="[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2", + metadata={ + "help": "string describing convolutional feature extraction " + "layers in form of a python list that contains " + "[(dim, kernel_size, stride), ...]" + }, + ) + conv_bias: bool = field( + default=False, metadata={"help": "include bias in conv encoder"} + ) + logit_temp: float = field( + default=0.1, metadata={"help": "temperature to divide logits by"} + ) + target_glu: bool = field( + default=False, metadata={"help": "adds projection + glu to targets"} + ) + feature_grad_mult: float = field( + default=1.0, + metadata={"help": "multiply feature extractor var grads by this"}, + ) + + # masking + mask_length: int = field(default=10, metadata={"help": "mask length"}) + mask_prob: float = field( + default=0.65, + metadata={"help": "probability of replacing a token with mask"}, + ) + mask_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", metadata={"help": "how to choose mask length"} + ) + mask_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indicesh" + }, + ) + no_mask_overlap: bool = field( + default=False, metadata={"help": "whether to allow masks to overlap"} + ) + mask_min_space: int = field( + default=1, + metadata={ + "help": "min space between spans (if no overlap is enabled)" + }, + ) + + # channel masking + mask_channel_length: int = field( + default=10, + metadata={"help": "length of the mask for features (channels)"}, + ) + mask_channel_prob: float = field( + default=0.0, + metadata={"help": "probability of replacing a feature with 0"}, + ) + mask_channel_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", + metadata={"help": "how to choose mask length for channel masking"}, + ) + mask_channel_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indicesh" + }, + ) + no_mask_channel_overlap: bool = field( + default=False, + metadata={"help": "whether to allow channel masks to overlap"}, + ) + mask_channel_min_space: int = field( + default=1, + metadata={ + "help": "min space between spans (if no overlap is enabled)" + }, + ) + + # positional embeddings + conv_pos: int = field( + default=128, + metadata={ + "help": "number of filters for convolutional positional embeddings" + }, + ) + conv_pos_groups: int = field( + default=16, + metadata={ + "help": "number of groups for convolutional positional embedding" + }, + ) + + latent_temp: Tuple[float, float, float] = field( + default=(2, 0.5, 0.999995), + metadata={"help": "legacy (to be removed)"}, + ) + + # loss computation + skip_masked: bool = field( + default=False, + metadata={"help": "skip computing losses over masked frames"}, + ) + skip_nomask: bool = field( + default=False, + metadata={"help": "skip computing losses over unmasked frames"}, + ) + + +@register_model("hubert", dataclass=HubertConfig) +class HubertModel(BaseFairseqModel): + def __init__( + self, + cfg: HubertConfig, + task_cfg: HubertPretrainingConfig, + dictionaries: List[Dictionary], + ) -> None: + super().__init__() + logger.info(f"HubertModel Config: {cfg}") + + feature_enc_layers = eval(cfg.conv_feature_layers) # noqa + self.embed = feature_enc_layers[-1][0] + + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + mode=cfg.extractor_mode, + conv_bias=cfg.conv_bias, + ) + feature_ds_rate = np.prod([s for _, _, s in feature_enc_layers]) + self.feat2tar_ratio = ( + cfg.label_rate * feature_ds_rate / task_cfg.sample_rate + ) + + self.post_extract_proj = ( + nn.Linear(self.embed, cfg.encoder_embed_dim) + if self.embed != cfg.encoder_embed_dim + else None + ) + + self.mask_prob = cfg.mask_prob + self.mask_selection = cfg.mask_selection + self.mask_other = cfg.mask_other + self.mask_length = cfg.mask_length + self.no_mask_overlap = cfg.no_mask_overlap + self.mask_min_space = cfg.mask_min_space + + self.mask_channel_prob = cfg.mask_channel_prob + self.mask_channel_selection = cfg.mask_channel_selection + self.mask_channel_other = cfg.mask_channel_other + self.mask_channel_length = cfg.mask_channel_length + self.no_mask_channel_overlap = cfg.no_mask_channel_overlap + self.mask_channel_min_space = cfg.mask_channel_min_space + + self.dropout_input = nn.Dropout(cfg.dropout_input) + self.dropout_features = nn.Dropout(cfg.dropout_features) + + self.feature_grad_mult = cfg.feature_grad_mult + self.logit_temp = cfg.logit_temp + self.skip_masked = cfg.skip_masked + self.skip_nomask = cfg.skip_nomask + + final_dim = ( + cfg.final_dim if cfg.final_dim > 0 else cfg.encoder_embed_dim + ) + + self.mask_emb = nn.Parameter( + torch.FloatTensor(cfg.encoder_embed_dim).uniform_() + ) + + self.encoder = TransformerEncoder(cfg) + self.layer_norm = LayerNorm(self.embed) + + self.target_glu = None + if cfg.target_glu: + self.target_glu = nn.Sequential( + nn.Linear(final_dim, final_dim * 2), nn.GLU() + ) + + self.untie_final_proj = cfg.untie_final_proj + if self.untie_final_proj: + self.final_proj = nn.Linear( + cfg.encoder_embed_dim, final_dim * len(dictionaries) + ) + else: + self.final_proj = nn.Linear(cfg.encoder_embed_dim, final_dim) + + # modules below are not needed during fine-tuning + if any([d is None for d in dictionaries]): + logger.info( + "cannot find dictionary. assume will be used for fine-tuning" + ) + else: + self.num_classes = [len(d) for d in dictionaries] + self.label_embs_concat = nn.Parameter( + torch.FloatTensor(sum(self.num_classes), final_dim) + ) + nn.init.uniform_(self.label_embs_concat) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: HubertConfig, task: HubertPretrainingTask): + """Build a new model instance.""" + + model = HubertModel(cfg, task.cfg, task.dictionaries) + return model + + def apply_mask(self, x, padding_mask, target_list): + B, T, C = x.shape + if self.mask_prob > 0: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob, + self.mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x[mask_indices] = self.mask_emb + else: + mask_indices = None + + if self.mask_channel_prob > 0: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + return x, mask_indices + + def compute_nce(self, x, pos, negs): + neg_is_pos = (pos == negs).all(-1) + pos = pos.unsqueeze(0) + targets = torch.cat([pos, negs], dim=0) + + logits = torch.cosine_similarity( + x.float(), targets.float(), dim=-1 + ).type_as(x) + logits /= self.logit_temp + if neg_is_pos.any(): + logits[1:][neg_is_pos] = float("-inf") + logits = logits.transpose(0, 1) # (num_x, num_cls+1) + return logits + + def forward_features(self, source: torch.Tensor) -> torch.Tensor: + if self.feature_grad_mult > 0: + features = self.feature_extractor(source) + if self.feature_grad_mult != 1.0: + features = GradMultiply.apply(features, self.feature_grad_mult) + else: + with torch.no_grad(): + features = self.feature_extractor(source) + return features + + def forward_targets( + self, features: torch.Tensor, target_list: List[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + # Trim features to ensure labels exist and then get aligned labels + feat_tsz = features.size(2) + targ_tsz = min([t.size(1) for t in target_list]) + if self.feat2tar_ratio * feat_tsz > targ_tsz: + feat_tsz = int(targ_tsz / self.feat2tar_ratio) + features = features[..., :feat_tsz] + target_inds = torch.arange(feat_tsz).float() * self.feat2tar_ratio + target_list = [t[:, target_inds.long()] for t in target_list] + return features, target_list + + def forward_padding_mask( + self, features: torch.Tensor, padding_mask: torch.Tensor, + ) -> torch.Tensor: + extra = padding_mask.size(1) % features.size(1) + if extra > 0: + padding_mask = padding_mask[:, :-extra] + padding_mask = padding_mask.view( + padding_mask.size(0), features.size(1), -1 + ) + padding_mask = padding_mask.all(-1) + return padding_mask + + def forward( + self, + source: torch.Tensor, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + features = self.forward_features(source) + if target_list is not None: + features, target_list = self.forward_targets(features, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + if mask: + x, mask_indices = self.apply_mask( + features, padding_mask, target_list + ) + else: + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1 + ) + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features} + + def compute_pred(proj_x, target, label_embs): + # compute logits for the i-th label set + y = torch.index_select(label_embs, 0, target.long()) + negs = label_embs.unsqueeze(1).expand(-1, proj_x.size(0), -1) + if self.target_glu: + y = self.target_glu(y) + negs = self.target_glu(negs) + # proj_x: (S, D) + # y: (S, D) + # negs: (Neg, S, D) + return self.compute_nce(proj_x, y, negs) + + label_embs_list = self.label_embs_concat.split(self.num_classes, 0) + + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = self.final_proj(x[masked_indices]) + if self.untie_final_proj: + proj_x_m_list = proj_x_m.chunk(len(target_list), dim=-1) + else: + proj_x_m_list = [proj_x_m for _ in range(len(target_list))] + logit_m_list = [ + compute_pred(proj_x_m, t[masked_indices], label_embs_list[i]) + for i, (proj_x_m, t) in enumerate( + zip(proj_x_m_list, target_list) + ) + ] + else: + logit_m_list = [None for _ in target_list] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = self.final_proj(x[nomask_indices]) + if self.untie_final_proj: + proj_x_u_list = proj_x_u.chunk(len(target_list), dim=-1) + else: + proj_x_u_list = [proj_x_u for _ in range(len(target_list))] + + logit_u_list = [ + compute_pred(proj_x_u, t[nomask_indices], label_embs_list[i]) + for i, (proj_x_u, t) in enumerate( + zip(proj_x_u_list, target_list) + ) + ] + else: + logit_u_list = [None for _ in target_list] + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + return result + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + ) -> Tuple[torch.Tensor, torch.Tensor]: + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + feature = res["features"] if ret_conv else res["x"] + return feature, res["padding_mask"] + + def get_logits(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + logits_list = [x.float() for x in logits_list if x is not None] + return logits_list + + def get_targets(self, net_output, is_masked=True): + logits_list = self.get_logits(net_output, is_masked) + targets_list = [ + x.new_zeros(x.size(0), dtype=torch.long) for x in logits_list + ] + return targets_list + + def get_extra_losses(self, net_output): + extra_losses = [] + names = [] + + if "features_pen" in net_output: + extra_losses.append(net_output["features_pen"]) + names.append("features_pen") + + return extra_losses, names + + def remove_pretraining_modules(self): + self.target_glu = None + self.final_proj = None diff --git a/SpeechT5/fairseq/fairseq/models/hubert/hubert_asr.py b/SpeechT5/fairseq/fairseq/models/hubert/hubert_asr.py new file mode 100644 index 0000000..4cb3fb7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/hubert/hubert_asr.py @@ -0,0 +1,373 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +from argparse import Namespace +from typing import Any + +import torch +import torch.nn as nn +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, register_model +from fairseq.models.hubert.hubert import MASKING_DISTRIBUTION_CHOICES +from fairseq.tasks import FairseqTask +from omegaconf import II, MISSING + + +@dataclass +class HubertAsrConfig(FairseqDataclass): + w2v_path: str = field( + default=MISSING, metadata={"help": "path to hubert model"} + ) + no_pretrained_weights: bool = field( + default=False, + metadata={"help": "if true, does not load pretrained weights"}, + ) + dropout_input: float = field( + default=0.0, + metadata={"help": "dropout to apply to the input (after feat extr)"}, + ) + final_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout after transformer and before final projection" + }, + ) + dropout: float = field( + default=0.0, + metadata={"help": "dropout probability inside hubert model"}, + ) + attention_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability for attention weights " + "inside hubert model" + }, + ) + activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN " + "inside hubert model" + }, + ) + + # masking + apply_mask: bool = field( + default=False, metadata={"help": "apply masking during fine-tuning"} + ) + mask_length: int = field( + default=10, metadata={"help": "repeat the mask indices multiple times"} + ) + mask_prob: float = field( + default=0.5, + metadata={ + "help": "probability of replacing a token with mask " + "(normalized by length)" + }, + ) + mask_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", metadata={"help": "how to choose masks"} + ) + mask_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indices" + }, + ) + no_mask_overlap: bool = field( + default=False, metadata={"help": "whether to allow masks to overlap"} + ) + + # channel masking + mask_channel_length: int = field( + default=10, + metadata={"help": "length of the mask for features (channels)"}, + ) + mask_channel_prob: float = field( + default=0.0, + metadata={"help": "probability of replacing a feature with 0"}, + ) + mask_channel_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", + metadata={"help": "how to choose mask length for channel masking"}, + ) + mask_channel_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indices" + }, + ) + no_mask_channel_overlap: bool = field( + default=False, + metadata={"help": "whether to allow channel masks to overlap"}, + ) + freeze_finetune_updates: int = field( + default=0, + metadata={"help": "dont finetune hubert for this many updates"}, + ) + feature_grad_mult: float = field( + default=0.0, + metadata={"help": "reset feature grad mult in hubert to this"}, + ) + layerdrop: float = field( + default=0.0, + metadata={"help": "probability of dropping a layer in hubert"}, + ) + normalize: bool = II("task.normalize") + data: str = II("task.data") + + # this holds the loaded hubert args + w2v_args: Any = None + + +@dataclass +class HubertCtcConfig(HubertAsrConfig): + pass + + +@register_model("hubert_ctc", dataclass=HubertCtcConfig) +class HubertCtc(BaseFairseqModel): + def __init__(self, cfg: HubertCtcConfig, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: HubertCtcConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = HubertEncoder(cfg, task.target_dictionary) + return cls(cfg, w2v_encoder) + + def get_normalized_probs(self, net_output, log_probs): + """Get normalized probabilities (or log probs) from a net's output.""" + + logits = net_output["encoder_out"] + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + def get_logits(self, net_output): + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + +@dataclass +class HubertSeq2SeqConfig(HubertAsrConfig): + decoder_embed_dim: int = field( + default=768, metadata={"help": "decoder embedding dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_layers: int = field( + default=6, metadata={"help": "num of decoder layers"} + ) + decoder_layerdrop: float = field( + default=0.0, metadata={"help": "decoder layerdrop chance"} + ) + decoder_attention_heads: int = field( + default=4, metadata={"help": "num decoder attention heads"} + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "use learned positional embeddings in the decoder"}, + ) + decoder_normalize_before: bool = field( + default=False, + metadata={"help": "apply layernorm before each decoder block"}, + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={ + "help": "if set, disables positional embeddings " + "(outside self attention)" + }, + ) + decoder_dropout: float = field( + default=0.0, metadata={"help": "dropout probability in the decoder"} + ) + decoder_attention_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability for attention weights " + "inside the decoder" + }, + ) + decoder_activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN " + "inside the decoder" + }, + ) + max_target_positions: int = field( + default=2048, metadata={"help": "max target positions"} + ) + share_decoder_input_output_embed: bool = field( + default=False, + metadata={"help": "share decoder input and output embeddings"}, + ) + + +class HubertEncoder(FairseqEncoder): + def __init__(self, cfg: HubertAsrConfig, tgt_dict=None): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu( + cfg.w2v_path, arg_overrides + ) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf( + w2v_args + ) + + assert cfg.normalize == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + w2v_args.task.data = cfg.data + task = tasks.setup_task(w2v_args.task) + model = task.build_model(w2v_args.model) + + if state is not None and not cfg.no_pretrained_weights: + # set strict=False because we omit some modules + model.load_state_dict(state["model"], strict=False) + + model.remove_pretraining_modules() + + super().__init__(task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.num_updates = 0 + + if tgt_dict is not None: + self.proj = Linear(d, len(tgt_dict)) + elif getattr(cfg, "decoder_embed_dim", d) != d: + self.proj = Linear(d, cfg.decoder_embed_dim) + else: + self.proj = None + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, source, padding_mask, tbc=True, **kwargs): + + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + } + + ft = self.freeze_finetune_updates <= self.num_updates + + with torch.no_grad() if not ft else contextlib.ExitStack(): + x, padding_mask = self.w2v_model.extract_features(**w2v_args) + + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + if self.proj: + x = self.proj(x) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": padding_mask, # B x T + "padding_mask": padding_mask, + } + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/SpeechT5/fairseq/fairseq/models/huggingface/__init__.py b/SpeechT5/fairseq/fairseq/models/huggingface/__init__.py new file mode 100644 index 0000000..f7911c2 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/huggingface/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import os + + +# automatically import any Python files in the models/huggingface/ directory +models_dir = os.path.dirname(__file__) +for file in os.listdir(models_dir): + path = os.path.join(models_dir, file) + if ( + not file.startswith("_") + and not file.startswith(".") + and (file.endswith(".py") or os.path.isdir(path)) + ): + model_name = file[: file.find(".py")] if file.endswith(".py") else file + module = importlib.import_module("fairseq.models.huggingface." + model_name) diff --git a/SpeechT5/fairseq/fairseq/models/huggingface/hf_gpt2.py b/SpeechT5/fairseq/fairseq/models/huggingface/hf_gpt2.py new file mode 100644 index 0000000..3a8eb78 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/huggingface/hf_gpt2.py @@ -0,0 +1,168 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import sys +from typing import Dict, List, Optional + +import torch +from fairseq.models import ( + FairseqIncrementalDecoder, + FairseqLanguageModel, + register_model, + register_model_architecture, +) + + +logger = logging.getLogger(__name__) + + +DEFAULT_MAX_TARGET_POSITIONS = 1024 + + +@register_model("hf_gpt2") +class HuggingFaceGPT2LanguageModel(FairseqLanguageModel): + def __init__(self, decoder): + super().__init__(decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--embed-dim', type=int, metavar='N', + help='embedding dimension') + parser.add_argument('--num-attention-heads', type=int, metavar='N', + help='num attention heads') + parser.add_argument('--num-layers', type=int, metavar='N', + help='num layers') + parser.add_argument('--dropout', type=float, metavar='D', + help='dropout probability for all fully connected layers ' + 'in the embeddings, encoder, and pooler') + parser.add_argument('--attention-dropout', type=float, metavar='D', + help='dropout probability for attention weights') + # fmt: on + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + default_architecture(args) + return cls(HuggingFaceGPT2Decoder(args, task)) + + +class HuggingFaceGPT2Decoder(FairseqIncrementalDecoder): + def __init__(self, args, task): + try: + from transformers import GPT2Config, GPT2LMHeadModel + except ImportError: + raise ImportError( + "\n\nPlease install huggingface/transformers with:" + "\n\n pip install transformers" + ) + + super().__init__(task.target_dictionary) + + config = GPT2Config( + vocab_size=len(task.target_dictionary), + n_positions=args.max_target_positions + 1, + n_ctx=args.max_target_positions, + n_embd=args.embed_dim, + n_layer=args.num_layers, + n_head=args.num_attention_heads, + resid_pdrop=args.dropout, + embd_pdrop=args.dropout, + attn_pdrop=args.attention_dropout, + layer_norm_epsilon=1e-6, + ) + self.model = GPT2LMHeadModel(config) + + # set zero embedding for padding symbol + self.pad_idx = task.target_dictionary.pad() + self.model.transformer.wte.weight.data[self.pad_idx].zero_() + self.model.transformer.wpe.weight.data[0].zero_() + + def forward( + self, + prev_output_tokens, + src_lengths=None, + incremental_state: Optional[Dict[str, List[torch.Tensor]]] = None, + encoder_out=None, + ): + features = self.extract_features(prev_output_tokens, incremental_state) + lm_logits = self.model.lm_head(features) + return (lm_logits,) + + def extract_features( + self, + prev_output_tokens, + incremental_state: Optional[Dict[str, List[torch.Tensor]]] = None, + ): + if incremental_state: + past = self.get_incremental_state("past") + else: + past = None + + # don't attend to padding symbols + attention_mask = prev_output_tokens.ne(self.pad_idx).int() + + # set position ids to exclude padding symbols + position_ids = attention_mask * ( + torch.arange(1, 1 + prev_output_tokens.size(1)) + .to(prev_output_tokens) + .repeat(prev_output_tokens.size(0), 1) + ) + + outputs = self.model.transformer( + input_ids=prev_output_tokens, + past=past, + attention_mask=attention_mask, + position_ids=position_ids, + ) + last_hidden_states = outputs[0] + + if incremental_state: + self.set_incremental_state(incremental_state, "past", outputs[1]) + + return last_hidden_states + + def max_positions(self): + return self.model.config.n_positions - 1 + + +@register_model_architecture("hf_gpt2", "hf_gpt2") +def default_architecture(args): + if getattr(args, "max_target_positions", None) is None: + args.max_target_positions = getattr( + args, "tokens_per_sample", DEFAULT_MAX_TARGET_POSITIONS + ) + args.embed_dim = getattr(args, "embed_dim", 768) + args.num_attention_heads = getattr(args, "num_attention_heads", 12) + args.num_layers = getattr(args, "num_layers", 12) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + + +@register_model_architecture("hf_gpt2", "hf_gpt2_medium") +def hf_gpt2_medium(args): + args.embed_dim = getattr(args, "embed_dim", 1024) + args.num_attention_heads = getattr(args, "num_attention_heads", 16) + args.num_layers = getattr(args, "num_layers", 24) + default_architecture(args) + + +@register_model_architecture("hf_gpt2", "hf_gpt2_large") +def hf_gpt2_large(args): + args.embed_dim = getattr(args, "embed_dim", 1280) + args.num_attention_heads = getattr(args, "num_attention_heads", 20) + args.num_layers = getattr(args, "num_layers", 36) + default_architecture(args) + + +@register_model_architecture("hf_gpt2", "hf_gpt2_xl") +def hf_gpt2_xl(args): + args.embed_dim = getattr(args, "embed_dim", 1600) + args.num_attention_heads = getattr(args, "num_attention_heads", 25) + args.num_layers = getattr(args, "num_layers", 48) + default_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/lightconv.py b/SpeechT5/fairseq/fairseq/models/lightconv.py new file mode 100644 index 0000000..b614da3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/lightconv.py @@ -0,0 +1,1018 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, + register_model_architecture, +) +from fairseq.modules import ( + AdaptiveSoftmax, + DynamicConv, + FairseqDropout, + LayerNorm, + LightweightConv, + MultiheadAttention, + PositionalEmbedding, +) + + +@register_model("lightconv") +class LightConvModel(FairseqEncoderDecoderModel): + """ + LightConv and DynamicConv model from `"Pay Less Attention with Lightweight and Dynamic Convolutions" (Wu, et al, 2019) + <https://openreview.net/pdf?id=SkVhlh09tX>`_. + To use LightConv please set ``--encoder-conv-type lightweight --decoder-conv-type lightweight`` + To use DynamicConv please set ``--encoder-conv-type dynamic --decoder-conv-type dynamic`` + + Args: + encoder (LightConvEncoder): the encoder + decoder (LightConvDecoder): the decoder + + The LightConv model provides the following named architectures and + command-line arguments: + + .. argparse:: + :ref: fairseq.models.lightconv_parser + :prog: + """ + + @classmethod + def hub_models(cls): + # fmt: off + + def moses_subword(path): + return { + 'path': path, + 'tokenizer': 'moses', + 'bpe': 'subword_nmt', + } + + return { + 'lightconv.no_glu.iwslt14.de-en': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/iwslt14.de-en.lightconv.tar.gz'), + 'dynamicconv.no_glu.iwslt14.de-en': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/iwslt14.de-en.dynamicconv.tar.gz'), + 'lightconv.no_glu.wmt16.en-de': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.lightconv.tar.gz'), + 'dynamicconv.no_glu.wmt16.en-de': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.dynamicconv.tar.gz'), + 'lightconv.glu.wmt16.en-de': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.lightconv-glu.tar.gz'), + 'dynamicconv.glu.wmt16.en-de': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.dynamicconv-glu.tar.gz'), + 'lightconv.glu.wmt17.en-de': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.lightconv-glu.tar.gz'), + 'dynamicconv.glu.wmt17.en-de': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt16.en-de.joined-dict.dynamicconv-glu.tar.gz'), + 'lightconv.glu.wmt14.en-fr': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt14.en-fr.joined-dict.lightconv-glu.tar.gz'), + 'dynamicconv.glu.wmt14.en-fr': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt14.en-fr.joined-dict.dynamicconv-glu.tar.gz'), + 'lightconv.glu.wmt17.zh-en': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt17.zh-en.lightconv-glu.tar.gz'), + 'dynamicconv.glu.wmt17.zh-en': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/dynamicconv/wmt17.zh-en.dynamicconv-glu.tar.gz'), + } + # fmt: on + + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--dropout", type=float, metavar="D", help="dropout probability" + ) + parser.add_argument( + "--attention-dropout", + type=float, + metavar="D", + help="dropout probability for attention weights", + ) + parser.add_argument( + "--relu-dropout", + type=float, + metavar="D", + help="dropout probability after ReLU in FFN", + ) + parser.add_argument( + "--input-dropout", + type=float, + metavar="D", + help="dropout probability of the inputs", + ) + parser.add_argument( + "--encoder-embed-path", + type=str, + metavar="STR", + help="path to pre-trained encoder embedding", + ) + parser.add_argument( + "--encoder-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension", + ) + parser.add_argument( + "--encoder-conv-dim", + type=int, + metavar="N", + help="encoder embedding dimension", + ) + parser.add_argument( + "--encoder-ffn-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension for FFN", + ) + parser.add_argument( + "--encoder-layers", type=int, metavar="N", help="num encoder layers" + ) + parser.add_argument( + "--encoder-attention-heads", + type=int, + metavar="N", + help="num encoder attention heads or LightConv/DynamicConv heads", + ) + parser.add_argument( + "--encoder-normalize-before", + action="store_true", + help="apply layernorm before each encoder block", + ) + parser.add_argument( + "--encoder-learned-pos", + action="store_true", + help="use learned positional embeddings in the encoder", + ) + parser.add_argument( + "--decoder-embed-path", + type=str, + metavar="STR", + help="path to pre-trained decoder embedding", + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-conv-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-ffn-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension for FFN", + ) + parser.add_argument( + "--decoder-layers", type=int, metavar="N", help="num decoder layers" + ) + parser.add_argument( + "--decoder-attention-heads", + type=int, + metavar="N", + help="num decoder attention heads or LightConv/DynamicConv heads", + ) + parser.add_argument( + "--decoder-learned-pos", + action="store_true", + help="use learned positional embeddings in the decoder", + ) + parser.add_argument( + "--decoder-normalize-before", + action="store_true", + help="apply layernorm before each decoder block", + ) + parser.add_argument( + "--share-decoder-input-output-embed", + action="store_true", + help="share decoder input and output embeddings", + ) + parser.add_argument( + "--share-all-embeddings", + action="store_true", + help="share encoder, decoder and output embeddings" + " (requires shared dictionary and embed dim)", + ) + parser.add_argument( + "--adaptive-softmax-cutoff", + metavar="EXPR", + help="comma separated list of adaptive softmax cutoff points. " + "Must be used with adaptive_loss criterion", + ), + parser.add_argument( + "--adaptive-softmax-dropout", + type=float, + metavar="D", + help="sets adaptive softmax dropout for the tail projections", + ) + + """LightConv and DynamicConv arguments""" + parser.add_argument( + "--encoder-kernel-size-list", + type=lambda x: utils.eval_str_list(x, int), + help='list of kernel size (default: "[3,7,15,31,31,31,31]")', + ) + parser.add_argument( + "--decoder-kernel-size-list", + type=lambda x: utils.eval_str_list(x, int), + help='list of kernel size (default: "[3,7,15,31,31,31]")', + ) + parser.add_argument( + "--encoder-glu", type=utils.eval_bool, help="glu after in proj" + ) + parser.add_argument( + "--decoder-glu", type=utils.eval_bool, help="glu after in proj" + ) + parser.add_argument( + "--encoder-conv-type", + default="dynamic", + type=str, + choices=["dynamic", "lightweight"], + help="type of convolution", + ) + parser.add_argument( + "--decoder-conv-type", + default="dynamic", + type=str, + choices=["dynamic", "lightweight"], + help="type of convolution", + ) + parser.add_argument("--weight-softmax", default=True, type=utils.eval_bool) + parser.add_argument( + "--weight-dropout", + type=float, + metavar="D", + help="dropout probability for conv weights", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + if not hasattr(args, "max_source_positions"): + args.max_source_positions = 1024 + if not hasattr(args, "max_target_positions"): + args.max_target_positions = 1024 + + src_dict, tgt_dict = task.source_dictionary, task.target_dictionary + + def build_embedding(dictionary, embed_dim, path=None): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + emb = Embedding(num_embeddings, embed_dim, padding_idx) + # if provided, load from preloaded dictionaries + if path: + embed_dict = utils.parse_embedding(path) + utils.load_embedding(embed_dict, dictionary, emb) + return emb + + if args.share_all_embeddings: + if src_dict != tgt_dict: + raise RuntimeError( + "--share-all-embeddings requires a joined dictionary" + ) + if args.encoder_embed_dim != args.decoder_embed_dim: + raise RuntimeError( + "--share-all-embeddings requires --encoder-embed-dim to match --decoder-embed-dim" + ) + if args.decoder_embed_path and ( + args.decoder_embed_path != args.encoder_embed_path + ): + raise RuntimeError( + "--share-all-embeddings not compatible with --decoder-embed-path" + ) + encoder_embed_tokens = build_embedding( + src_dict, args.encoder_embed_dim, args.encoder_embed_path + ) + decoder_embed_tokens = encoder_embed_tokens + args.share_decoder_input_output_embed = True + else: + encoder_embed_tokens = build_embedding( + src_dict, args.encoder_embed_dim, args.encoder_embed_path + ) + decoder_embed_tokens = build_embedding( + tgt_dict, args.decoder_embed_dim, args.decoder_embed_path + ) + + encoder = LightConvEncoder(args, src_dict, encoder_embed_tokens) + decoder = LightConvDecoder(args, tgt_dict, decoder_embed_tokens) + return LightConvModel(encoder, decoder) + + +class LightConvEncoder(FairseqEncoder): + """ + LightConv encoder consisting of *args.encoder_layers* layers. Each layer + is a :class:`LightConvEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, args, dictionary, embed_tokens): + super().__init__(dictionary) + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + + embed_dim = embed_tokens.embedding_dim + self.padding_idx = embed_tokens.padding_idx + self.max_source_positions = args.max_source_positions + + self.embed_tokens = embed_tokens + self.embed_scale = math.sqrt(embed_dim) + self.embed_positions = ( + PositionalEmbedding( + args.max_source_positions, + embed_dim, + self.padding_idx, + learned=args.encoder_learned_pos, + ) + if not args.no_token_positional_embeddings + else None + ) + + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + LightConvEncoderLayer( + args, kernel_size=args.encoder_kernel_size_list[i] + ) + for i in range(args.encoder_layers) + ] + ) + self.register_buffer("version", torch.Tensor([2])) + self.normalize = args.encoder_normalize_before + if self.normalize: + self.layer_norm = LayerNorm(embed_dim) + + def forward(self, src_tokens, **unused): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + """ + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(src_tokens) + if self.embed_positions is not None: + x += self.embed_positions(src_tokens) + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # compute padding mask + encoder_padding_mask = src_tokens.eq(self.padding_idx) + if not encoder_padding_mask.any(): + encoder_padding_mask = None + + # encoder layers + for layer in self.layers: + x = layer(x, encoder_padding_mask) + + if self.normalize: + x = self.layer_norm(x) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": encoder_padding_mask, # B x T + } + + def reorder_encoder_out(self, encoder_out, new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = encoder_out["encoder_out"].index_select( + 1, new_order + ) + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + if self.embed_positions is None: + return self.max_source_positions + return min(self.max_source_positions, self.embed_positions.max_positions) + + +class LightConvDecoder(FairseqIncrementalDecoder): + """ + LightConv decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`LightConvDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs. + Default: ``False`` + """ + + def __init__( + self, args, dictionary, embed_tokens, no_encoder_attn=False, final_norm=True + ): + super().__init__(dictionary) + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.share_input_output_embed = args.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = args.decoder_embed_dim + output_embed_dim = args.decoder_output_dim + + padding_idx = embed_tokens.padding_idx + self.max_target_positions = args.max_target_positions + + self.embed_tokens = embed_tokens + self.embed_scale = math.sqrt(embed_dim) # todo: try with input_embed_dim + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + + self.embed_positions = ( + PositionalEmbedding( + args.max_target_positions, + embed_dim, + padding_idx, + learned=args.decoder_learned_pos, + ) + if not args.no_token_positional_embeddings + else None + ) + + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + LightConvDecoderLayer( + args, no_encoder_attn, kernel_size=args.decoder_kernel_size_list[i] + ) + for i in range(args.decoder_layers) + ] + ) + + self.adaptive_softmax = None + + self.project_out_dim = ( + Linear(embed_dim, output_embed_dim, bias=False) + if embed_dim != output_embed_dim and not args.tie_adaptive_weights + else None + ) + + if args.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + output_embed_dim, + utils.eval_str_list(args.adaptive_softmax_cutoff, type=int), + dropout=args.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if args.tie_adaptive_weights else None, + factor=args.adaptive_softmax_factor, + tie_proj=args.tie_adaptive_proj, + ) + elif not self.share_input_output_embed: + self.embed_out = nn.Parameter( + torch.Tensor(len(dictionary), output_embed_dim) + ) + nn.init.normal_(self.embed_out, mean=0, std=output_embed_dim ** -0.5) + self.register_buffer("version", torch.Tensor([2])) + self.normalize = args.decoder_normalize_before and final_norm + if self.normalize: + self.layer_norm = LayerNorm(embed_dim) + + def forward( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **kwargs + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (Tensor, optional): output from the encoder, used for + encoder-side attention + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + + Returns: + tuple: + - the last decoder layer's output of shape `(batch, tgt_len, + vocab)` + - the last decoder layer's attention weights of shape `(batch, + tgt_len, src_len)` + """ + # embed positions + positions = ( + self.embed_positions( + prev_output_tokens, + incremental_state=incremental_state, + ) + if self.embed_positions is not None + else None + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + attn = None + + inner_states = [x] + + # decoder layers + for layer in self.layers: + x, attn = layer( + x, + encoder_out["encoder_out"] if encoder_out is not None else None, + encoder_out["encoder_padding_mask"] + if encoder_out is not None + else None, + incremental_state, + ) + inner_states.append(x) + + if self.normalize: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + if self.adaptive_softmax is None: + # project back to size of vocabulary + if self.share_input_output_embed: + x = F.linear(x, self.embed_tokens.weight) + else: + x = F.linear(x, self.embed_out) + + return x, {"attn": attn, "inner_states": inner_states} + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + if ( + not hasattr(self, "_future_mask") + or self._future_mask is None + or self._future_mask.device != tensor.device + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(tensor.new(dim, dim)), 1 + ) + if self._future_mask.size(0) < dim: + self._future_mask = torch.triu( + utils.fill_with_neg_inf(self._future_mask.resize_(dim, dim)), 1 + ) + return self._future_mask[:dim, :dim] + + +class LightConvEncoderLayer(nn.Module): + """Encoder layer block. + + Args: + args (argparse.Namespace): parsed command-line arguments + kernel_size: kernel size of the convolution + """ + + def __init__(self, args, kernel_size=0): + super().__init__() + self.embed_dim = args.encoder_embed_dim + self.conv_dim = args.encoder_conv_dim + padding_l = ( + kernel_size // 2 + if kernel_size % 2 == 1 + else ((kernel_size - 1) // 2, kernel_size // 2) + ) + + if args.encoder_glu: + self.linear1 = Linear(self.embed_dim, 2 * self.conv_dim) + self.act = nn.GLU() + else: + self.linear1 = Linear(self.embed_dim, self.conv_dim) + self.act = None + if args.encoder_conv_type == "lightweight": + self.conv = LightweightConv( + self.conv_dim, + kernel_size, + padding_l=padding_l, + weight_softmax=args.weight_softmax, + num_heads=args.encoder_attention_heads, + weight_dropout=args.weight_dropout, + ) + elif args.encoder_conv_type == "dynamic": + self.conv = DynamicConv( + self.conv_dim, + kernel_size, + padding_l=padding_l, + weight_softmax=args.weight_softmax, + num_heads=args.encoder_attention_heads, + weight_dropout=args.weight_dropout, + ) + else: + raise NotImplementedError + self.linear2 = Linear(self.conv_dim, self.embed_dim) + + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.relu_dropout_module = FairseqDropout( + args.relu_dropout, module_name=self.__class__.__name__ + ) + self.input_dropout_module = FairseqDropout( + args.input_dropout, module_name=self.__class__.__name__ + ) + self.normalize_before = args.encoder_normalize_before + self.fc1 = Linear(self.embed_dim, args.encoder_ffn_embed_dim) + self.fc2 = Linear(args.encoder_ffn_embed_dim, self.embed_dim) + self.layer_norms = nn.ModuleList([LayerNorm(self.embed_dim) for _ in range(2)]) + + def forward(self, x, encoder_padding_mask): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor): binary ByteTensor of shape + `(batch, src_len)` where padding elements are indicated by ``1``. + + Returns: + encoded output of shape `(batch, src_len, embed_dim)` + """ + residual = x + x = self.maybe_layer_norm(0, x, before=True) + x = self.input_dropout_module(x) + x = self.linear1(x) + if self.act is not None: + x = self.act(x) + if encoder_padding_mask is not None: + x = x.masked_fill(encoder_padding_mask.transpose(0, 1).unsqueeze(2), 0) + x = self.conv(x) + x = self.linear2(x) + x = self.dropout_module(x) + x = residual + x + x = self.maybe_layer_norm(0, x, after=True) + + residual = x + x = self.maybe_layer_norm(1, x, before=True) + x = F.relu(self.fc1(x)) + x = self.relu_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = residual + x + x = self.maybe_layer_norm(1, x, after=True) + return x + + def maybe_layer_norm(self, i, x, before=False, after=False): + assert before ^ after + if after ^ self.normalize_before: + return self.layer_norms[i](x) + else: + return x + + def extra_repr(self): + return ( + "dropout={}, relu_dropout={}, input_dropout={}, normalize_before={}".format( + self.dropout_module.p, + self.relu_dropout_module.p, + self.input_dropout_module.p, + self.normalize_before, + ) + ) + + +class LightConvDecoderLayer(nn.Module): + """Decoder layer block. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs. + Default: ``False`` + kernel_size: kernel size of the convolution + """ + + def __init__(self, args, no_encoder_attn=False, kernel_size=0): + super().__init__() + self.embed_dim = args.decoder_embed_dim + self.conv_dim = args.decoder_conv_dim + if args.decoder_glu: + self.linear1 = Linear(self.embed_dim, 2 * self.conv_dim) + self.act = nn.GLU() + else: + self.linear1 = Linear(self.embed_dim, self.conv_dim) + self.act = None + if args.decoder_conv_type == "lightweight": + self.conv = LightweightConv( + self.conv_dim, + kernel_size, + padding_l=kernel_size - 1, + weight_softmax=args.weight_softmax, + num_heads=args.decoder_attention_heads, + weight_dropout=args.weight_dropout, + ) + elif args.decoder_conv_type == "dynamic": + self.conv = DynamicConv( + self.conv_dim, + kernel_size, + padding_l=kernel_size - 1, + weight_softmax=args.weight_softmax, + num_heads=args.decoder_attention_heads, + weight_dropout=args.weight_dropout, + ) + else: + raise NotImplementedError + self.linear2 = Linear(self.conv_dim, self.embed_dim) + + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.relu_dropout_module = FairseqDropout( + args.relu_dropout, module_name=self.__class__.__name__ + ) + self.input_dropout_module = FairseqDropout( + args.input_dropout, module_name=self.__class__.__name__ + ) + self.normalize_before = args.decoder_normalize_before + + self.conv_layer_norm = LayerNorm(self.embed_dim) + + if no_encoder_attn: + self.encoder_attn = None + self.encoder_attn_layer_norm = None + else: + self.encoder_attn = MultiheadAttention( + self.embed_dim, + args.decoder_attention_heads, + dropout=args.attention_dropout, + encoder_decoder_attention=True, + ) + self.encoder_attn_layer_norm = LayerNorm(self.embed_dim) + + self.fc1 = Linear(self.embed_dim, args.decoder_ffn_embed_dim) + self.fc2 = Linear(args.decoder_ffn_embed_dim, self.embed_dim) + + self.final_layer_norm = LayerNorm(self.embed_dim) + self.need_attn = True + + def forward( + self, + x, + encoder_out, + encoder_padding_mask, + incremental_state, + prev_conv_state=None, + prev_attn_state=None, + conv_mask=None, + conv_padding_mask=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor): binary ByteTensor of shape + `(batch, src_len)` where padding elements are indicated by ``1``. + + Returns: + encoded output of shape `(batch, src_len, embed_dim)` + """ + residual = x + x = self.maybe_layer_norm(self.conv_layer_norm, x, before=True) + if prev_conv_state is not None: + if incremental_state is None: + incremental_state = {} + self.conv._set_input_buffer(incremental_state, prev_conv_state) + x = self.input_dropout_module(x) + x = self.linear1(x) + if self.act is not None: + x = self.act(x) + x = self.conv(x, incremental_state=incremental_state) + x = self.linear2(x) + x = self.dropout_module(x) + x = residual + x + x = self.maybe_layer_norm(self.conv_layer_norm, x, after=True) + + attn = None + if self.encoder_attn is not None: + residual = x + x = self.maybe_layer_norm(self.encoder_attn_layer_norm, x, before=True) + if prev_attn_state is not None: + if incremental_state is None: + incremental_state = {} + prev_key, prev_value = prev_attn_state + saved_state = {"prev_key": prev_key, "prev_value": prev_value} + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=(not self.training and self.need_attn), + ) + x = self.dropout_module(x) + x = residual + x + x = self.maybe_layer_norm(self.encoder_attn_layer_norm, x, after=True) + + residual = x + x = self.maybe_layer_norm(self.final_layer_norm, x, before=True) + x = F.relu(self.fc1(x)) + x = self.relu_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = residual + x + x = self.maybe_layer_norm(self.final_layer_norm, x, after=True) + return x, attn + + def maybe_layer_norm(self, layer_norm, x, before=False, after=False): + assert before ^ after + if after ^ self.normalize_before: + return layer_norm(x) + else: + return x + + def make_generation_fast_(self, need_attn=False, **kwargs): + self.need_attn = need_attn + + def extra_repr(self): + return ( + "dropout={}, relu_dropout={}, input_dropout={}, normalize_before={}".format( + self.dropout_module.p, + self.relu_dropout_module.p, + self.input_dropout_module.p, + self.normalize_before, + ) + ) + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + + +@register_model_architecture("lightconv", "lightconv") +def base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 7) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.relu_dropout = getattr(args, "relu_dropout", 0.0) + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + args.encoder_conv_dim = getattr(args, "encoder_conv_dim", args.encoder_embed_dim) + args.decoder_conv_dim = getattr(args, "decoder_conv_dim", args.decoder_embed_dim) + + args.encoder_kernel_size_list = getattr( + args, "encoder_kernel_size_list", [3, 7, 15, 31, 31, 31, 31] + ) + args.decoder_kernel_size_list = getattr( + args, "decoder_kernel_size_list", [3, 7, 15, 31, 31, 31] + ) + if len(args.encoder_kernel_size_list) == 1: + args.encoder_kernel_size_list = ( + args.encoder_kernel_size_list * args.encoder_layers + ) + if len(args.decoder_kernel_size_list) == 1: + args.decoder_kernel_size_list = ( + args.decoder_kernel_size_list * args.decoder_layers + ) + assert ( + len(args.encoder_kernel_size_list) == args.encoder_layers + ), "encoder_kernel_size_list doesn't match encoder_layers" + assert ( + len(args.decoder_kernel_size_list) == args.decoder_layers + ), "decoder_kernel_size_list doesn't match decoder_layers" + args.encoder_glu = getattr(args, "encoder_glu", True) + args.decoder_glu = getattr(args, "decoder_glu", True) + args.input_dropout = getattr(args, "input_dropout", 0.1) + args.weight_dropout = getattr(args, "weight_dropout", args.attention_dropout) + + +@register_model_architecture("lightconv", "lightconv_iwslt_de_en") +def lightconv_iwslt_de_en(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 1024) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4) + args.encoder_layers = getattr(args, "encoder_layers", 7) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 1024) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.weight_dropout = getattr(args, "weight_dropout", 0.1) + args.encoder_glu = getattr(args, "encoder_glu", False) + args.decoder_glu = getattr(args, "decoder_glu", False) + args.input_dropout = getattr(args, "input_dropout", 0.0) + base_architecture(args) + + +@register_model_architecture("lightconv", "lightconv_wmt_en_de") +def lightconv_wmt_en_de(args): + base_architecture(args) + + +@register_model_architecture("lightconv", "lightconv_wmt_en_de_big") +def lightconv_wmt_en_de_big(args): + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.3) + base_architecture(args) + + +@register_model_architecture("lightconv", "lightconv_wmt_en_fr_big") +def lightconv_wmt_en_fr_big(args): + args.dropout = getattr(args, "dropout", 0.1) + lightconv_wmt_en_de_big(args) + + +@register_model_architecture("lightconv", "lightconv_wmt_zh_en_big") +def lightconv_wmt_zh_en_big(args): + args.dropout = getattr(args, "dropout", 0.2) + args.attention_dropout = getattr(args, "attention_dropout", 0.2) + args.weight_dropout = getattr(args, "weight_dropout", 0.2) + lightconv_wmt_en_de_big(args) diff --git a/SpeechT5/fairseq/fairseq/models/lightconv_lm.py b/SpeechT5/fairseq/fairseq/models/lightconv_lm.py new file mode 100644 index 0000000..1d9efc4 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/lightconv_lm.py @@ -0,0 +1,306 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq import utils +from fairseq.models import ( + FairseqLanguageModel, + register_model, + register_model_architecture, +) +from fairseq.models.lightconv import Embedding, LightConvDecoder +from fairseq.modules import AdaptiveInput, CharacterTokenEmbedder + + +@register_model("lightconv_lm") +class LightConvLanguageModel(FairseqLanguageModel): + def __init__(self, decoder): + super().__init__(decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--dropout", + default=0.1, + type=float, + metavar="D", + help="dropout probability", + ) + parser.add_argument( + "--attention-dropout", + default=0.0, + type=float, + metavar="D", + help="dropout probability for attention weights", + ) + parser.add_argument( + "--relu-dropout", + default=0.0, + type=float, + metavar="D", + help="dropout probability after ReLU in FFN", + ) + parser.add_argument( + "--input-dropout", + type=float, + metavar="D", + help="dropout probability of the inputs", + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-output-dim", + type=int, + metavar="N", + help="decoder output dimension", + ) + parser.add_argument( + "--decoder-input-dim", type=int, metavar="N", help="decoder input dimension" + ) + parser.add_argument( + "--decoder-ffn-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension for FFN", + ) + parser.add_argument( + "--decoder-layers", type=int, metavar="N", help="num decoder layers" + ) + parser.add_argument( + "--decoder-attention-heads", + type=int, + metavar="N", + help="num decoder attention heads or LightConv/DynamicConv heads", + ) + parser.add_argument( + "--decoder-normalize-before", + default=False, + action="store_true", + help="apply layernorm before each decoder block", + ) + parser.add_argument( + "--adaptive-softmax-cutoff", + metavar="EXPR", + help="comma separated list of adaptive softmax cutoff points. " + "Must be used with adaptive_loss criterion", + ) + parser.add_argument( + "--adaptive-softmax-dropout", + type=float, + metavar="D", + help="sets adaptive softmax dropout for the tail projections", + ) + parser.add_argument( + "--adaptive-softmax-factor", + type=float, + metavar="N", + help="adaptive input factor", + ) + parser.add_argument( + "--no-token-positional-embeddings", + default=False, + action="store_true", + help="if set, disables positional embeddings (outside self attention)", + ) + parser.add_argument( + "--share-decoder-input-output-embed", + default=False, + action="store_true", + help="share decoder input and output embeddings", + ) + parser.add_argument( + "--character-embeddings", + default=False, + action="store_true", + help="if set, uses character embedding convolutions to produce token embeddings", + ) + parser.add_argument( + "--character-filters", + type=str, + metavar="LIST", + default="[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]", + help="size of character embeddings", + ) + parser.add_argument( + "--character-embedding-dim", + type=int, + metavar="N", + default=4, + help="size of character embeddings", + ) + parser.add_argument( + "--char-embedder-highway-layers", + type=int, + metavar="N", + default=2, + help="number of highway layers for character token embeddder", + ) + parser.add_argument( + "--adaptive-input", + default=False, + action="store_true", + help="if set, uses adaptive input", + ) + parser.add_argument( + "--adaptive-input-factor", + type=float, + metavar="N", + help="adaptive input factor", + ) + parser.add_argument( + "--adaptive-input-cutoff", + metavar="EXPR", + help="comma separated list of adaptive input cutoff points.", + ) + parser.add_argument( + "--tie-adaptive-weights", + action="store_true", + help="if set, ties the weights of adaptive softmax and adaptive input", + ) + parser.add_argument( + "--tie-adaptive-proj", + action="store_true", + help="if set, ties the projection weights of adaptive softmax and adaptive input", + ) + parser.add_argument( + "--decoder-learned-pos", + action="store_true", + help="use learned positional embeddings in the decoder", + ) + + """LightConv and DynamicConv arguments""" + parser.add_argument( + "--decoder-kernel-size-list", + type=lambda x: utils.eval_str_list(x, int), + help='list of kernel size (default: "[3,7,15,31,31,31]")', + ) + parser.add_argument( + "--decoder-glu", type=utils.eval_bool, help="glu after in proj" + ) + parser.add_argument( + "--decoder-conv-type", + default="dynamic", + type=str, + choices=["dynamic", "lightweight"], + help="type of convolution", + ) + parser.add_argument("--weight-softmax", default=True, type=utils.eval_bool) + parser.add_argument( + "--weight-dropout", + type=float, + metavar="D", + help="dropout probability for conv weights", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_lm_architecture(args) + + if getattr(args, "max_source_positions", None) is None: + args.max_source_positions = args.tokens_per_sample + if getattr(args, "max_target_positions", None) is None: + args.max_target_positions = args.tokens_per_sample + + if args.character_embeddings: + embed_tokens = CharacterTokenEmbedder( + task.dictionary, + eval(args.character_filters), + args.character_embedding_dim, + args.decoder_embed_dim, + args.char_embedder_highway_layers, + ) + elif args.adaptive_input: + embed_tokens = AdaptiveInput( + len(task.dictionary), + task.dictionary.pad(), + args.decoder_input_dim, + args.adaptive_input_factor, + args.decoder_embed_dim, + utils.eval_str_list(args.adaptive_input_cutoff, type=int), + ) + else: + embed_tokens = Embedding( + len(task.dictionary), args.decoder_input_dim, task.dictionary.pad() + ) + + if args.tie_adaptive_weights: + assert args.adaptive_input + assert args.adaptive_input_factor == args.adaptive_softmax_factor + assert ( + args.adaptive_softmax_cutoff == args.adaptive_input_cutoff + ), "{} != {}".format( + args.adaptive_softmax_cutoff, args.adaptive_input_cutoff + ) + assert args.decoder_input_dim == args.decoder_output_dim + + decoder = LightConvDecoder( + args, + task.output_dictionary, + embed_tokens, + no_encoder_attn=True, + final_norm=False, + ) + return LightConvLanguageModel(decoder) + + +@register_model_architecture("lightconv_lm", "lightconv_lm") +def base_lm_architecture(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 2048) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.adaptive_softmax_factor = getattr(args, "adaptive_softmax_factor", 4) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + + args.character_embeddings = getattr(args, "character_embeddings", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + args.decoder_conv_dim = getattr(args, "decoder_conv_dim", args.decoder_embed_dim) + + # The model training is not stable without this + args.decoder_normalize_before = True + + args.adaptive_input = getattr(args, "adaptive_input", False) + args.adaptive_input_factor = getattr(args, "adaptive_input_factor", 4) + args.adaptive_input_cutoff = getattr(args, "adaptive_input_cutoff", None) + + args.tie_adaptive_weights = getattr(args, "tie_adaptive_weights", False) + args.tie_adaptive_proj = getattr(args, "tie_adaptive_proj", False) + + args.decoder_kernel_size_list = getattr( + args, "decoder_kernel_size_list", [3, 7, 15, 31, 31, 31] + ) + if len(args.decoder_kernel_size_list) == 1: + args.decoder_kernel_size_list = ( + args.decoder_kernel_size_list * args.decoder_layers + ) + assert ( + len(args.decoder_kernel_size_list) == args.decoder_layers + ), "decoder_kernel_size_list doesn't match decoder_layers" + args.decoder_glu = getattr(args, "decoder_glu", True) + args.input_dropout = getattr(args, "input_dropout", 0.1) + args.weight_dropout = getattr(args, "weight_dropout", args.attention_dropout) + + +@register_model_architecture("lightconv_lm", "lightconv_lm_gbw") +def lightconv_lm_gbw(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + base_lm_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/lstm.py b/SpeechT5/fairseq/fairseq/models/lstm.py new file mode 100644 index 0000000..12e3aff --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/lstm.py @@ -0,0 +1,753 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, List, Optional, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, + register_model_architecture, +) +from fairseq.modules import AdaptiveSoftmax, FairseqDropout +from torch import Tensor + + +DEFAULT_MAX_SOURCE_POSITIONS = 1e5 +DEFAULT_MAX_TARGET_POSITIONS = 1e5 + + +@register_model("lstm") +class LSTMModel(FairseqEncoderDecoderModel): + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--dropout', type=float, metavar='D', + help='dropout probability') + parser.add_argument('--encoder-embed-dim', type=int, metavar='N', + help='encoder embedding dimension') + parser.add_argument('--encoder-embed-path', type=str, metavar='STR', + help='path to pre-trained encoder embedding') + parser.add_argument('--encoder-freeze-embed', action='store_true', + help='freeze encoder embeddings') + parser.add_argument('--encoder-hidden-size', type=int, metavar='N', + help='encoder hidden size') + parser.add_argument('--encoder-layers', type=int, metavar='N', + help='number of encoder layers') + parser.add_argument('--encoder-bidirectional', action='store_true', + help='make all layers of encoder bidirectional') + parser.add_argument('--decoder-embed-dim', type=int, metavar='N', + help='decoder embedding dimension') + parser.add_argument('--decoder-embed-path', type=str, metavar='STR', + help='path to pre-trained decoder embedding') + parser.add_argument('--decoder-freeze-embed', action='store_true', + help='freeze decoder embeddings') + parser.add_argument('--decoder-hidden-size', type=int, metavar='N', + help='decoder hidden size') + parser.add_argument('--decoder-layers', type=int, metavar='N', + help='number of decoder layers') + parser.add_argument('--decoder-out-embed-dim', type=int, metavar='N', + help='decoder output embedding dimension') + parser.add_argument('--decoder-attention', type=str, metavar='BOOL', + help='decoder attention') + parser.add_argument('--adaptive-softmax-cutoff', metavar='EXPR', + help='comma separated list of adaptive softmax cutoff points. ' + 'Must be used with adaptive_loss criterion') + parser.add_argument('--share-decoder-input-output-embed', default=False, + action='store_true', + help='share decoder input and output embeddings') + parser.add_argument('--share-all-embeddings', default=False, action='store_true', + help='share encoder, decoder and output embeddings' + ' (requires shared dictionary and embed dim)') + + # Granular dropout settings (if not specified these default to --dropout) + parser.add_argument('--encoder-dropout-in', type=float, metavar='D', + help='dropout probability for encoder input embedding') + parser.add_argument('--encoder-dropout-out', type=float, metavar='D', + help='dropout probability for encoder output') + parser.add_argument('--decoder-dropout-in', type=float, metavar='D', + help='dropout probability for decoder input embedding') + parser.add_argument('--decoder-dropout-out', type=float, metavar='D', + help='dropout probability for decoder output') + # fmt: on + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + # make sure that all args are properly defaulted (in case there are any new ones) + base_architecture(args) + + if args.encoder_layers != args.decoder_layers: + raise ValueError("--encoder-layers must match --decoder-layers") + + max_source_positions = getattr( + args, "max_source_positions", DEFAULT_MAX_SOURCE_POSITIONS + ) + max_target_positions = getattr( + args, "max_target_positions", DEFAULT_MAX_TARGET_POSITIONS + ) + + def load_pretrained_embedding_from_file(embed_path, dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + embed_tokens = Embedding(num_embeddings, embed_dim, padding_idx) + embed_dict = utils.parse_embedding(embed_path) + utils.print_embed_overlap(embed_dict, dictionary) + return utils.load_embedding(embed_dict, dictionary, embed_tokens) + + if args.encoder_embed_path: + pretrained_encoder_embed = load_pretrained_embedding_from_file( + args.encoder_embed_path, task.source_dictionary, args.encoder_embed_dim + ) + else: + num_embeddings = len(task.source_dictionary) + pretrained_encoder_embed = Embedding( + num_embeddings, args.encoder_embed_dim, task.source_dictionary.pad() + ) + + if args.share_all_embeddings: + # double check all parameters combinations are valid + if task.source_dictionary != task.target_dictionary: + raise ValueError("--share-all-embeddings requires a joint dictionary") + if args.decoder_embed_path and ( + args.decoder_embed_path != args.encoder_embed_path + ): + raise ValueError( + "--share-all-embed not compatible with --decoder-embed-path" + ) + if args.encoder_embed_dim != args.decoder_embed_dim: + raise ValueError( + "--share-all-embeddings requires --encoder-embed-dim to " + "match --decoder-embed-dim" + ) + pretrained_decoder_embed = pretrained_encoder_embed + args.share_decoder_input_output_embed = True + else: + # separate decoder input embeddings + pretrained_decoder_embed = None + if args.decoder_embed_path: + pretrained_decoder_embed = load_pretrained_embedding_from_file( + args.decoder_embed_path, + task.target_dictionary, + args.decoder_embed_dim, + ) + # one last double check of parameter combinations + if args.share_decoder_input_output_embed and ( + args.decoder_embed_dim != args.decoder_out_embed_dim + ): + raise ValueError( + "--share-decoder-input-output-embeddings requires " + "--decoder-embed-dim to match --decoder-out-embed-dim" + ) + + if args.encoder_freeze_embed: + pretrained_encoder_embed.weight.requires_grad = False + if args.decoder_freeze_embed: + pretrained_decoder_embed.weight.requires_grad = False + + encoder = LSTMEncoder( + dictionary=task.source_dictionary, + embed_dim=args.encoder_embed_dim, + hidden_size=args.encoder_hidden_size, + num_layers=args.encoder_layers, + dropout_in=args.encoder_dropout_in, + dropout_out=args.encoder_dropout_out, + bidirectional=args.encoder_bidirectional, + pretrained_embed=pretrained_encoder_embed, + max_source_positions=max_source_positions, + ) + decoder = LSTMDecoder( + dictionary=task.target_dictionary, + embed_dim=args.decoder_embed_dim, + hidden_size=args.decoder_hidden_size, + out_embed_dim=args.decoder_out_embed_dim, + num_layers=args.decoder_layers, + dropout_in=args.decoder_dropout_in, + dropout_out=args.decoder_dropout_out, + attention=utils.eval_bool(args.decoder_attention), + encoder_output_units=encoder.output_units, + pretrained_embed=pretrained_decoder_embed, + share_input_output_embed=args.share_decoder_input_output_embed, + adaptive_softmax_cutoff=( + utils.eval_str_list(args.adaptive_softmax_cutoff, type=int) + if args.criterion == "adaptive_loss" + else None + ), + max_target_positions=max_target_positions, + residuals=False, + ) + return cls(encoder, decoder) + + def forward( + self, + src_tokens, + src_lengths, + prev_output_tokens, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + ): + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths) + decoder_out = self.decoder( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + ) + return decoder_out + + +class LSTMEncoder(FairseqEncoder): + """LSTM encoder.""" + + def __init__( + self, + dictionary, + embed_dim=512, + hidden_size=512, + num_layers=1, + dropout_in=0.1, + dropout_out=0.1, + bidirectional=False, + left_pad=True, + pretrained_embed=None, + padding_idx=None, + max_source_positions=DEFAULT_MAX_SOURCE_POSITIONS, + ): + super().__init__(dictionary) + self.num_layers = num_layers + self.dropout_in_module = FairseqDropout( + dropout_in, module_name=self.__class__.__name__ + ) + self.dropout_out_module = FairseqDropout( + dropout_out, module_name=self.__class__.__name__ + ) + self.bidirectional = bidirectional + self.hidden_size = hidden_size + self.max_source_positions = max_source_positions + + num_embeddings = len(dictionary) + self.padding_idx = padding_idx if padding_idx is not None else dictionary.pad() + if pretrained_embed is None: + self.embed_tokens = Embedding(num_embeddings, embed_dim, self.padding_idx) + else: + self.embed_tokens = pretrained_embed + + self.lstm = LSTM( + input_size=embed_dim, + hidden_size=hidden_size, + num_layers=num_layers, + dropout=self.dropout_out_module.p if num_layers > 1 else 0.0, + bidirectional=bidirectional, + ) + self.left_pad = left_pad + + self.output_units = hidden_size + if bidirectional: + self.output_units *= 2 + + def forward( + self, + src_tokens: Tensor, + src_lengths: Tensor, + enforce_sorted: bool = True, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of + shape `(batch, src_len)` + src_lengths (LongTensor): lengths of each source sentence of + shape `(batch)` + enforce_sorted (bool, optional): if True, `src_tokens` is + expected to contain sequences sorted by length in a + decreasing order. If False, this condition is not + required. Default: True. + """ + if self.left_pad: + # nn.utils.rnn.pack_padded_sequence requires right-padding; + # convert left-padding to right-padding + src_tokens = utils.convert_padding_direction( + src_tokens, + torch.zeros_like(src_tokens).fill_(self.padding_idx), + left_to_right=True, + ) + + bsz, seqlen = src_tokens.size() + + # embed tokens + x = self.embed_tokens(src_tokens) + x = self.dropout_in_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # pack embedded source tokens into a PackedSequence + packed_x = nn.utils.rnn.pack_padded_sequence( + x, src_lengths.cpu(), enforce_sorted=enforce_sorted + ) + + # apply LSTM + if self.bidirectional: + state_size = 2 * self.num_layers, bsz, self.hidden_size + else: + state_size = self.num_layers, bsz, self.hidden_size + h0 = x.new_zeros(*state_size) + c0 = x.new_zeros(*state_size) + packed_outs, (final_hiddens, final_cells) = self.lstm(packed_x, (h0, c0)) + + # unpack outputs and apply dropout + x, _ = nn.utils.rnn.pad_packed_sequence( + packed_outs, padding_value=self.padding_idx * 1.0 + ) + x = self.dropout_out_module(x) + assert list(x.size()) == [seqlen, bsz, self.output_units] + + if self.bidirectional: + final_hiddens = self.combine_bidir(final_hiddens, bsz) + final_cells = self.combine_bidir(final_cells, bsz) + + encoder_padding_mask = src_tokens.eq(self.padding_idx).t() + + return tuple( + ( + x, # seq_len x batch x hidden + final_hiddens, # num_layers x batch x num_directions*hidden + final_cells, # num_layers x batch x num_directions*hidden + encoder_padding_mask, # seq_len x batch + ) + ) + + def combine_bidir(self, outs, bsz: int): + out = outs.view(self.num_layers, 2, bsz, -1).transpose(1, 2).contiguous() + return out.view(self.num_layers, bsz, -1) + + def reorder_encoder_out(self, encoder_out, new_order): + return tuple( + ( + encoder_out[0].index_select(1, new_order), + encoder_out[1].index_select(1, new_order), + encoder_out[2].index_select(1, new_order), + encoder_out[3].index_select(1, new_order), + ) + ) + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return self.max_source_positions + + +class AttentionLayer(nn.Module): + def __init__(self, input_embed_dim, source_embed_dim, output_embed_dim, bias=False): + super().__init__() + + self.input_proj = Linear(input_embed_dim, source_embed_dim, bias=bias) + self.output_proj = Linear( + input_embed_dim + source_embed_dim, output_embed_dim, bias=bias + ) + + def forward(self, input, source_hids, encoder_padding_mask): + # input: bsz x input_embed_dim + # source_hids: srclen x bsz x source_embed_dim + + # x: bsz x source_embed_dim + x = self.input_proj(input) + + # compute attention + attn_scores = (source_hids * x.unsqueeze(0)).sum(dim=2) + + # don't attend over padding + if encoder_padding_mask is not None: + attn_scores = ( + attn_scores.float() + .masked_fill_(encoder_padding_mask, float("-inf")) + .type_as(attn_scores) + ) # FP16 support: cast to float and back + + attn_scores = F.softmax(attn_scores, dim=0) # srclen x bsz + + # sum weighted sources + x = (attn_scores.unsqueeze(2) * source_hids).sum(dim=0) + + x = torch.tanh(self.output_proj(torch.cat((x, input), dim=1))) + return x, attn_scores + + +class LSTMDecoder(FairseqIncrementalDecoder): + """LSTM decoder.""" + + def __init__( + self, + dictionary, + embed_dim=512, + hidden_size=512, + out_embed_dim=512, + num_layers=1, + dropout_in=0.1, + dropout_out=0.1, + attention=True, + encoder_output_units=512, + pretrained_embed=None, + share_input_output_embed=False, + adaptive_softmax_cutoff=None, + max_target_positions=DEFAULT_MAX_TARGET_POSITIONS, + residuals=False, + ): + super().__init__(dictionary) + self.dropout_in_module = FairseqDropout( + dropout_in, module_name=self.__class__.__name__ + ) + self.dropout_out_module = FairseqDropout( + dropout_out, module_name=self.__class__.__name__ + ) + self.hidden_size = hidden_size + self.share_input_output_embed = share_input_output_embed + self.need_attn = True + self.max_target_positions = max_target_positions + self.residuals = residuals + self.num_layers = num_layers + + self.adaptive_softmax = None + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + if pretrained_embed is None: + self.embed_tokens = Embedding(num_embeddings, embed_dim, padding_idx) + else: + self.embed_tokens = pretrained_embed + + self.encoder_output_units = encoder_output_units + if encoder_output_units != hidden_size and encoder_output_units != 0: + self.encoder_hidden_proj = Linear(encoder_output_units, hidden_size) + self.encoder_cell_proj = Linear(encoder_output_units, hidden_size) + else: + self.encoder_hidden_proj = self.encoder_cell_proj = None + + # disable input feeding if there is no encoder + # input feeding is described in arxiv.org/abs/1508.04025 + input_feed_size = 0 if encoder_output_units == 0 else hidden_size + self.layers = nn.ModuleList( + [ + LSTMCell( + input_size=input_feed_size + embed_dim + if layer == 0 + else hidden_size, + hidden_size=hidden_size, + ) + for layer in range(num_layers) + ] + ) + + if attention: + # TODO make bias configurable + self.attention = AttentionLayer( + hidden_size, encoder_output_units, hidden_size, bias=False + ) + else: + self.attention = None + + if hidden_size != out_embed_dim: + self.additional_fc = Linear(hidden_size, out_embed_dim) + + if adaptive_softmax_cutoff is not None: + # setting adaptive_softmax dropout to dropout_out for now but can be redefined + self.adaptive_softmax = AdaptiveSoftmax( + num_embeddings, + hidden_size, + adaptive_softmax_cutoff, + dropout=dropout_out, + ) + elif not self.share_input_output_embed: + self.fc_out = Linear(out_embed_dim, num_embeddings, dropout=dropout_out) + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Tuple[Tensor, Tensor, Tensor, Tensor]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + src_lengths: Optional[Tensor] = None, + ): + x, attn_scores = self.extract_features( + prev_output_tokens, encoder_out, incremental_state + ) + return self.output_layer(x), attn_scores + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Tuple[Tensor, Tensor, Tensor, Tensor]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + ): + """ + Similar to *forward* but only return features. + """ + # get outputs from encoder + if encoder_out is not None: + encoder_outs = encoder_out[0] + encoder_hiddens = encoder_out[1] + encoder_cells = encoder_out[2] + encoder_padding_mask = encoder_out[3] + else: + encoder_outs = torch.empty(0) + encoder_hiddens = torch.empty(0) + encoder_cells = torch.empty(0) + encoder_padding_mask = torch.empty(0) + srclen = encoder_outs.size(0) + + if incremental_state is not None and len(incremental_state) > 0: + prev_output_tokens = prev_output_tokens[:, -1:] + + bsz, seqlen = prev_output_tokens.size() + + # embed tokens + x = self.embed_tokens(prev_output_tokens) + x = self.dropout_in_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # initialize previous states (or get from cache during incremental generation) + if incremental_state is not None and len(incremental_state) > 0: + prev_hiddens, prev_cells, input_feed = self.get_cached_state( + incremental_state + ) + elif encoder_out is not None: + # setup recurrent cells + prev_hiddens = [encoder_hiddens[i] for i in range(self.num_layers)] + prev_cells = [encoder_cells[i] for i in range(self.num_layers)] + if self.encoder_hidden_proj is not None: + prev_hiddens = [self.encoder_hidden_proj(y) for y in prev_hiddens] + prev_cells = [self.encoder_cell_proj(y) for y in prev_cells] + input_feed = x.new_zeros(bsz, self.hidden_size) + else: + # setup zero cells, since there is no encoder + zero_state = x.new_zeros(bsz, self.hidden_size) + prev_hiddens = [zero_state for i in range(self.num_layers)] + prev_cells = [zero_state for i in range(self.num_layers)] + input_feed = None + + assert ( + srclen > 0 or self.attention is None + ), "attention is not supported if there are no encoder outputs" + attn_scores: Optional[Tensor] = ( + x.new_zeros(srclen, seqlen, bsz) if self.attention is not None else None + ) + outs = [] + for j in range(seqlen): + # input feeding: concatenate context vector from previous time step + if input_feed is not None: + input = torch.cat((x[j, :, :], input_feed), dim=1) + else: + input = x[j] + + for i, rnn in enumerate(self.layers): + # recurrent cell + hidden, cell = rnn(input, (prev_hiddens[i], prev_cells[i])) + + # hidden state becomes the input to the next layer + input = self.dropout_out_module(hidden) + if self.residuals: + input = input + prev_hiddens[i] + + # save state for next time step + prev_hiddens[i] = hidden + prev_cells[i] = cell + + # apply attention using the last layer's hidden state + if self.attention is not None: + assert attn_scores is not None + out, attn_scores[:, j, :] = self.attention( + hidden, encoder_outs, encoder_padding_mask + ) + else: + out = hidden + out = self.dropout_out_module(out) + + # input feeding + if input_feed is not None: + input_feed = out + + # save final output + outs.append(out) + + # Stack all the necessary tensors together and store + prev_hiddens_tensor = torch.stack(prev_hiddens) + prev_cells_tensor = torch.stack(prev_cells) + cache_state = torch.jit.annotate( + Dict[str, Optional[Tensor]], + { + "prev_hiddens": prev_hiddens_tensor, + "prev_cells": prev_cells_tensor, + "input_feed": input_feed, + }, + ) + self.set_incremental_state(incremental_state, "cached_state", cache_state) + + # collect outputs across time steps + x = torch.cat(outs, dim=0).view(seqlen, bsz, self.hidden_size) + + # T x B x C -> B x T x C + x = x.transpose(1, 0) + + if hasattr(self, "additional_fc") and self.adaptive_softmax is None: + x = self.additional_fc(x) + x = self.dropout_out_module(x) + # srclen x tgtlen x bsz -> bsz x tgtlen x srclen + if not self.training and self.need_attn and self.attention is not None: + assert attn_scores is not None + attn_scores = attn_scores.transpose(0, 2) + else: + attn_scores = None + return x, attn_scores + + def output_layer(self, x): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + if self.share_input_output_embed: + x = F.linear(x, self.embed_tokens.weight) + else: + x = self.fc_out(x) + return x + + def get_cached_state( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + ) -> Tuple[List[Tensor], List[Tensor], Optional[Tensor]]: + cached_state = self.get_incremental_state(incremental_state, "cached_state") + assert cached_state is not None + prev_hiddens_ = cached_state["prev_hiddens"] + assert prev_hiddens_ is not None + prev_cells_ = cached_state["prev_cells"] + assert prev_cells_ is not None + prev_hiddens = [prev_hiddens_[i] for i in range(self.num_layers)] + prev_cells = [prev_cells_[j] for j in range(self.num_layers)] + input_feed = cached_state[ + "input_feed" + ] # can be None for decoder-only language models + return prev_hiddens, prev_cells, input_feed + + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + if incremental_state is None or len(incremental_state) == 0: + return + prev_hiddens, prev_cells, input_feed = self.get_cached_state(incremental_state) + prev_hiddens = [p.index_select(0, new_order) for p in prev_hiddens] + prev_cells = [p.index_select(0, new_order) for p in prev_cells] + if input_feed is not None: + input_feed = input_feed.index_select(0, new_order) + cached_state_new = torch.jit.annotate( + Dict[str, Optional[Tensor]], + { + "prev_hiddens": torch.stack(prev_hiddens), + "prev_cells": torch.stack(prev_cells), + "input_feed": input_feed, + }, + ) + self.set_incremental_state(incremental_state, "cached_state", cached_state_new), + return + + def max_positions(self): + """Maximum output length supported by the decoder.""" + return self.max_target_positions + + def make_generation_fast_(self, need_attn=False, **kwargs): + self.need_attn = need_attn + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.uniform_(m.weight, -0.1, 0.1) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def LSTM(input_size, hidden_size, **kwargs): + m = nn.LSTM(input_size, hidden_size, **kwargs) + for name, param in m.named_parameters(): + if "weight" in name or "bias" in name: + param.data.uniform_(-0.1, 0.1) + return m + + +def LSTMCell(input_size, hidden_size, **kwargs): + m = nn.LSTMCell(input_size, hidden_size, **kwargs) + for name, param in m.named_parameters(): + if "weight" in name or "bias" in name: + param.data.uniform_(-0.1, 0.1) + return m + + +def Linear(in_features, out_features, bias=True, dropout=0.0): + """Linear layer (input: N x T x C)""" + m = nn.Linear(in_features, out_features, bias=bias) + m.weight.data.uniform_(-0.1, 0.1) + if bias: + m.bias.data.uniform_(-0.1, 0.1) + return m + + +@register_model_architecture("lstm", "lstm") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.1) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_freeze_embed = getattr(args, "encoder_freeze_embed", False) + args.encoder_hidden_size = getattr( + args, "encoder_hidden_size", args.encoder_embed_dim + ) + args.encoder_layers = getattr(args, "encoder_layers", 1) + args.encoder_bidirectional = getattr(args, "encoder_bidirectional", False) + args.encoder_dropout_in = getattr(args, "encoder_dropout_in", args.dropout) + args.encoder_dropout_out = getattr(args, "encoder_dropout_out", args.dropout) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_freeze_embed = getattr(args, "decoder_freeze_embed", False) + args.decoder_hidden_size = getattr( + args, "decoder_hidden_size", args.decoder_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 1) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 512) + args.decoder_attention = getattr(args, "decoder_attention", "1") + args.decoder_dropout_in = getattr(args, "decoder_dropout_in", args.dropout) + args.decoder_dropout_out = getattr(args, "decoder_dropout_out", args.dropout) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.adaptive_softmax_cutoff = getattr( + args, "adaptive_softmax_cutoff", "10000,50000,200000" + ) + + +@register_model_architecture("lstm", "lstm_wiseman_iwslt_de_en") +def lstm_wiseman_iwslt_de_en(args): + args.dropout = getattr(args, "dropout", 0.1) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 256) + args.encoder_dropout_in = getattr(args, "encoder_dropout_in", 0) + args.encoder_dropout_out = getattr(args, "encoder_dropout_out", 0) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 256) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 256) + args.decoder_dropout_in = getattr(args, "decoder_dropout_in", 0) + args.decoder_dropout_out = getattr(args, "decoder_dropout_out", args.dropout) + base_architecture(args) + + +@register_model_architecture("lstm", "lstm_luong_wmt_en_de") +def lstm_luong_wmt_en_de(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1000) + args.encoder_layers = getattr(args, "encoder_layers", 4) + args.encoder_dropout_out = getattr(args, "encoder_dropout_out", 0) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1000) + args.decoder_layers = getattr(args, "decoder_layers", 4) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 1000) + args.decoder_dropout_out = getattr(args, "decoder_dropout_out", 0) + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/lstm_lm.py b/SpeechT5/fairseq/fairseq/models/lstm_lm.py new file mode 100644 index 0000000..454f0ac --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/lstm_lm.py @@ -0,0 +1,142 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq import utils +from fairseq.models import ( + FairseqLanguageModel, + register_model, + register_model_architecture, +) +from fairseq.models.lstm import Embedding, LSTMDecoder + + +DEFAULT_MAX_TARGET_POSITIONS = 1e5 + + +@register_model("lstm_lm") +class LSTMLanguageModel(FairseqLanguageModel): + def __init__(self, decoder): + super().__init__(decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--dropout', type=float, metavar='D', + help='dropout probability') + parser.add_argument('--decoder-embed-dim', type=int, metavar='N', + help='decoder embedding dimension') + parser.add_argument('--decoder-embed-path', type=str, metavar='STR', + help='path to pre-trained decoder embedding') + parser.add_argument('--decoder-hidden-size', type=int, metavar='N', + help='decoder hidden size') + parser.add_argument('--decoder-layers', type=int, metavar='N', + help='number of decoder layers') + parser.add_argument('--decoder-out-embed-dim', type=int, metavar='N', + help='decoder output embedding dimension') + parser.add_argument('--decoder-attention', type=str, metavar='BOOL', + help='decoder attention') + parser.add_argument('--adaptive-softmax-cutoff', metavar='EXPR', + help='comma separated list of adaptive softmax cutoff points. ' + 'Must be used with adaptive_loss criterion') + parser.add_argument('--residuals', default=False, + action='store_true', + help='applying residuals between LSTM layers') + + # Granular dropout settings (if not specified these default to --dropout) + parser.add_argument('--decoder-dropout-in', type=float, metavar='D', + help='dropout probability for decoder input embedding') + parser.add_argument('--decoder-dropout-out', type=float, metavar='D', + help='dropout probability for decoder output') + parser.add_argument('--share-decoder-input-output-embed', default=False, + action='store_true', + help='share decoder input and output embeddings') + # fmt: on + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + if getattr(args, "max_target_positions", None) is not None: + max_target_positions = args.max_target_positions + else: + max_target_positions = getattr( + args, "tokens_per_sample", DEFAULT_MAX_TARGET_POSITIONS + ) + + def load_pretrained_embedding_from_file(embed_path, dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + embed_tokens = Embedding(num_embeddings, embed_dim, padding_idx) + embed_dict = utils.parse_embedding(embed_path) + utils.print_embed_overlap(embed_dict, dictionary) + return utils.load_embedding(embed_dict, dictionary, embed_tokens) + + pretrained_decoder_embed = None + if args.decoder_embed_path: + pretrained_decoder_embed = load_pretrained_embedding_from_file( + args.decoder_embed_path, task.target_dictionary, args.decoder_embed_dim + ) + + if args.share_decoder_input_output_embed: + # double check all parameters combinations are valid + if task.source_dictionary != task.target_dictionary: + raise ValueError( + "--share-decoder-input-output-embeddings requires a joint dictionary" + ) + + if args.decoder_embed_dim != args.decoder_out_embed_dim: + raise ValueError( + "--share-decoder-input-output-embeddings requires " + "--decoder-embed-dim to match --decoder-out-embed-dim" + ) + + decoder = LSTMDecoder( + dictionary=task.dictionary, + embed_dim=args.decoder_embed_dim, + hidden_size=args.decoder_hidden_size, + out_embed_dim=args.decoder_out_embed_dim, + num_layers=args.decoder_layers, + dropout_in=args.decoder_dropout_in, + dropout_out=args.decoder_dropout_out, + attention=False, # decoder-only language model doesn't support attention + encoder_output_units=0, + pretrained_embed=pretrained_decoder_embed, + share_input_output_embed=args.share_decoder_input_output_embed, + adaptive_softmax_cutoff=( + utils.eval_str_list(args.adaptive_softmax_cutoff, type=int) + if args.criterion == "adaptive_loss" + else None + ), + max_target_positions=max_target_positions, + residuals=args.residuals, + ) + + return cls(decoder) + + +@register_model_architecture("lstm_lm", "lstm_lm") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.1) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_hidden_size = getattr( + args, "decoder_hidden_size", args.decoder_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 1) + args.decoder_out_embed_dim = getattr(args, "decoder_out_embed_dim", 512) + args.decoder_attention = getattr(args, "decoder_attention", "0") + args.decoder_dropout_in = getattr(args, "decoder_dropout_in", args.dropout) + args.decoder_dropout_out = getattr(args, "decoder_dropout_out", args.dropout) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.adaptive_softmax_cutoff = getattr( + args, "adaptive_softmax_cutoff", "10000,50000,200000" + ) + args.residuals = getattr(args, "residuals", False) diff --git a/SpeechT5/fairseq/fairseq/models/masked_lm.py b/SpeechT5/fairseq/fairseq/models/masked_lm.py new file mode 100644 index 0000000..c786de9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/masked_lm.py @@ -0,0 +1,403 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderModel, + register_model, + register_model_architecture, +) +from fairseq.modules import ( + LayerNorm, + SinusoidalPositionalEmbedding, + TransformerSentenceEncoder, +) +from fairseq.modules.transformer_sentence_encoder import init_bert_params + + +logger = logging.getLogger(__name__) + + +@register_model("masked_lm") +class MaskedLMModel(FairseqEncoderModel): + """ + Class for training a Masked Language Model. It also supports an + additional sentence level prediction if the sent-loss argument is set. + """ + + def __init__(self, args, encoder): + super().__init__(encoder) + self.args = args + + # if specified then apply bert initialization on the model. We need + # to explictly call this to make sure that the output embeddings + # and projection layers are also correctly initialized + if getattr(args, "apply_bert_init", False): + self.apply(init_bert_params) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # Arguments related to dropout + parser.add_argument( + "--dropout", type=float, metavar="D", help="dropout probability" + ) + parser.add_argument( + "--attention-dropout", + type=float, + metavar="D", + help="dropout probability for" " attention weights", + ) + parser.add_argument( + "--act-dropout", + type=float, + metavar="D", + help="dropout probability after" " activation in FFN", + ) + + # Arguments related to hidden states and self-attention + parser.add_argument( + "--encoder-ffn-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension for FFN", + ) + parser.add_argument( + "--encoder-layers", type=int, metavar="N", help="num encoder layers" + ) + parser.add_argument( + "--encoder-attention-heads", + type=int, + metavar="N", + help="num encoder attention heads", + ) + + # Arguments related to input and output embeddings + parser.add_argument( + "--encoder-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension", + ) + parser.add_argument( + "--share-encoder-input-output-embed", + action="store_true", + help="share encoder input" " and output embeddings", + ) + parser.add_argument( + "--encoder-learned-pos", + action="store_true", + help="use learned positional embeddings in the encoder", + ) + parser.add_argument( + "--no-token-positional-embeddings", + action="store_true", + help="if set, disables positional embeddings" " (outside self attention)", + ) + parser.add_argument( + "--num-segment", type=int, metavar="N", help="num segment in the input" + ) + parser.add_argument( + "--max-positions", type=int, help="number of positional embeddings to learn" + ) + + # Arguments related to sentence level prediction + parser.add_argument( + "--sentence-class-num", + type=int, + metavar="N", + help="number of classes for sentence task", + ) + parser.add_argument( + "--sent-loss", + action="store_true", + help="if set," " calculate sentence level predictions", + ) + + # Arguments related to parameter initialization + parser.add_argument( + "--apply-bert-init", + action="store_true", + help="use custom param initialization for BERT", + ) + + # misc params + parser.add_argument( + "--activation-fn", + choices=utils.get_available_activation_fns(), + help="activation function to use", + ) + parser.add_argument( + "--pooler-activation-fn", + choices=utils.get_available_activation_fns(), + help="Which activation function to use for pooler layer.", + ) + parser.add_argument( + "--encoder-normalize-before", + action="store_true", + help="apply layernorm before each encoder block", + ) + + def forward(self, src_tokens, segment_labels=None, **kwargs): + return self.encoder(src_tokens, segment_labels=segment_labels, **kwargs) + + def max_positions(self): + return self.encoder.max_positions + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + # make sure all arguments are present in older models + base_architecture(args) + + if not hasattr(args, "max_positions"): + args.max_positions = args.tokens_per_sample + + logger.info(args) + + encoder = MaskedLMEncoder(args, task.dictionary) + return cls(args, encoder) + + +class MaskedLMEncoder(FairseqEncoder): + """ + Encoder for Masked Language Modelling. + """ + + def __init__(self, args, dictionary): + super().__init__(dictionary) + + self.padding_idx = dictionary.pad() + self.vocab_size = dictionary.__len__() + self.max_positions = args.max_positions + + self.sentence_encoder = TransformerSentenceEncoder( + padding_idx=self.padding_idx, + vocab_size=self.vocab_size, + num_encoder_layers=args.encoder_layers, + embedding_dim=args.encoder_embed_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=args.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.act_dropout, + max_seq_len=self.max_positions, + num_segments=args.num_segment, + use_position_embeddings=not args.no_token_positional_embeddings, + encoder_normalize_before=args.encoder_normalize_before, + apply_bert_init=args.apply_bert_init, + activation_fn=args.activation_fn, + learned_pos_embedding=args.encoder_learned_pos, + ) + + self.share_input_output_embed = args.share_encoder_input_output_embed + self.embed_out = None + self.sentence_projection_layer = None + self.sentence_out_dim = args.sentence_class_num + self.lm_output_learned_bias = None + + # Remove head is set to true during fine-tuning + self.load_softmax = not getattr(args, "remove_head", False) + + self.masked_lm_pooler = nn.Linear( + args.encoder_embed_dim, args.encoder_embed_dim + ) + self.pooler_activation = utils.get_activation_fn(args.pooler_activation_fn) + + self.lm_head_transform_weight = nn.Linear( + args.encoder_embed_dim, args.encoder_embed_dim + ) + self.activation_fn = utils.get_activation_fn(args.activation_fn) + self.layer_norm = LayerNorm(args.encoder_embed_dim) + + self.lm_output_learned_bias = None + if self.load_softmax: + self.lm_output_learned_bias = nn.Parameter(torch.zeros(self.vocab_size)) + + if not self.share_input_output_embed: + self.embed_out = nn.Linear( + args.encoder_embed_dim, self.vocab_size, bias=False + ) + + if args.sent_loss: + self.sentence_projection_layer = nn.Linear( + args.encoder_embed_dim, self.sentence_out_dim, bias=False + ) + + def forward(self, src_tokens, segment_labels=None, masked_tokens=None, **unused): + """ + Forward pass for Masked LM encoder. This first computes the token + embedding using the token embedding matrix, position embeddings (if + specified) and segment embeddings (if specified). + + Here we assume that the sentence representation corresponds to the + output of the classification_token (see bert_task or cross_lingual_lm + task for more details). + Args: + - src_tokens: B x T matrix representing sentences + - segment_labels: B x T matrix representing segment label for tokens + Returns: + - a tuple of the following: + - logits for predictions in format B x T x C to be used in + softmax afterwards + - a dictionary of additional data, where 'pooled_output' contains + the representation for classification_token and 'inner_states' + is a list of internal model states used to compute the + predictions (similar in ELMO). 'sentence_logits' + is the prediction logit for NSP task and is only computed if + this is specified in the input arguments. + """ + + inner_states, sentence_rep = self.sentence_encoder( + src_tokens, + segment_labels=segment_labels, + ) + + x = inner_states[-1].transpose(0, 1) + # project masked tokens only + if masked_tokens is not None: + x = x[masked_tokens, :] + x = self.layer_norm(self.activation_fn(self.lm_head_transform_weight(x))) + + pooled_output = self.pooler_activation(self.masked_lm_pooler(sentence_rep)) + + # project back to size of vocabulary + if self.share_input_output_embed and hasattr( + self.sentence_encoder.embed_tokens, "weight" + ): + x = F.linear(x, self.sentence_encoder.embed_tokens.weight) + elif self.embed_out is not None: + x = self.embed_out(x) + if self.lm_output_learned_bias is not None: + x = x + self.lm_output_learned_bias + sentence_logits = None + if self.sentence_projection_layer: + sentence_logits = self.sentence_projection_layer(pooled_output) + + return x, { + "inner_states": inner_states, + "pooled_output": pooled_output, + "sentence_logits": sentence_logits, + } + + def max_positions(self): + """Maximum output length supported by the encoder.""" + return self.max_positions + + def upgrade_state_dict_named(self, state_dict, name): + if isinstance( + self.sentence_encoder.embed_positions, SinusoidalPositionalEmbedding + ): + state_dict[ + name + ".sentence_encoder.embed_positions._float_tensor" + ] = torch.FloatTensor(1) + if not self.load_softmax: + for k in list(state_dict.keys()): + if ( + "embed_out.weight" in k + or "sentence_projection_layer.weight" in k + or "lm_output_learned_bias" in k + ): + del state_dict[k] + return state_dict + + +@register_model_architecture("masked_lm", "masked_lm") +def base_architecture(args): + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.act_dropout = getattr(args, "act_dropout", 0.0) + + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.share_encoder_input_output_embed = getattr( + args, "share_encoder_input_output_embed", False + ) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.num_segment = getattr(args, "num_segment", 2) + + args.sentence_class_num = getattr(args, "sentence_class_num", 2) + args.sent_loss = getattr(args, "sent_loss", False) + + args.apply_bert_init = getattr(args, "apply_bert_init", False) + + args.activation_fn = getattr(args, "activation_fn", "relu") + args.pooler_activation_fn = getattr(args, "pooler_activation_fn", "tanh") + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + + +@register_model_architecture("masked_lm", "bert_base") +def bert_base_architecture(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 768) + args.share_encoder_input_output_embed = getattr( + args, "share_encoder_input_output_embed", True + ) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", True) + args.num_segment = getattr(args, "num_segment", 2) + + args.encoder_layers = getattr(args, "encoder_layers", 12) + + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 12) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 3072) + + args.sentence_class_num = getattr(args, "sentence_class_num", 2) + args.sent_loss = getattr(args, "sent_loss", True) + + args.apply_bert_init = getattr(args, "apply_bert_init", True) + + args.activation_fn = getattr(args, "activation_fn", "gelu") + args.pooler_activation_fn = getattr(args, "pooler_activation_fn", "tanh") + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", True) + base_architecture(args) + + +@register_model_architecture("masked_lm", "bert_large") +def bert_large_architecture(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_layers = getattr(args, "encoder_layers", 24) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + bert_base_architecture(args) + + +@register_model_architecture("masked_lm", "xlm_base") +def xlm_architecture(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.share_encoder_input_output_embed = getattr( + args, "share_encoder_input_output_embed", True + ) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", True) + args.num_segment = getattr(args, "num_segment", 1) + + args.encoder_layers = getattr(args, "encoder_layers", 6) + + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + + args.sent_loss = getattr(args, "sent_loss", False) + + args.activation_fn = getattr(args, "activation_fn", "gelu") + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.pooler_activation_fn = getattr(args, "pooler_activation_fn", "tanh") + args.apply_bert_init = getattr(args, "apply_bert_init", True) + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/model_utils.py b/SpeechT5/fairseq/fairseq/models/model_utils.py new file mode 100644 index 0000000..732d66b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/model_utils.py @@ -0,0 +1,92 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import List, Optional + +import torch +from torch import Tensor + + +@torch.jit.script +def script_skip_tensor_list(x: List[Tensor], mask): + res = [xi[mask] if xi.size(0) == mask.size(0) else xi[:, mask] for xi in x] + outputs = [] + for i, t in enumerate(res): + if t.numel() != 0: + outputs.append(t) + else: + outputs.append(x[i]) + return outputs + + +@torch.jit.script +def script_skip_tensor(x: Tensor, mask): + # None case + if x.size(0) == 0: + return x + res = x[mask] if x.size(0) == mask.size(0) else x[:, mask] + if res.numel() == 0: + return x + else: + return res + + +@torch.jit.script +def expand_2d_or_3d_tensor(x, trg_dim: int, padding_idx: int): + """ + Expand 2D/3D tensor on dim=1 + """ + if x is None: + return None + + assert x.dim() == 2 or x.dim() == 3 + assert trg_dim >= x.size(1), (trg_dim, x.size()) + if trg_dim == x.size(1): + return x + + dims = [x.size(0), trg_dim - x.size(1)] + if x.dim() == 3: + dims.append(x.size(2)) + x = torch.cat([x, torch.zeros(dims).to(x).fill_(padding_idx)], 1) + + return x + + +@torch.jit.script +def coalesce(x: Optional[Tensor], y: Tensor) -> Tensor: + return x if x is not None else y + + +@torch.jit.script +def fill_tensors( + x: Optional[Tensor], mask, y: Optional[Tensor], padding_idx: int +) -> Optional[Tensor]: + """ + Filling tensor x with y at masked positions (dim=0). + """ + if x is None or x.size()[0] == 0 or y is None: + return x + assert x.dim() == y.dim() and mask.size(0) == x.size(0) + assert x.dim() == 2 or (x.dim() == 3 and x.size(2) == y.size(2)) + + n_selected = mask.sum() + if n_selected == 0: + return x + assert n_selected == y.size(0) + if n_selected == x.size(0): + return y + + if x.size(1) < y.size(1): + x = expand_2d_or_3d_tensor(x, y.size(1), padding_idx) + x[mask] = y + elif x.size(1) > y.size(1): + x[mask] = torch.tensor(padding_idx).type_as(x) + if x.dim() == 2: + x[mask, : y.size(1)] = y + else: + x[mask, : y.size(1), :] = y + else: + x[mask] = y + return x diff --git a/SpeechT5/fairseq/fairseq/models/multilingual_transformer.py b/SpeechT5/fairseq/fairseq/models/multilingual_transformer.py new file mode 100644 index 0000000..2e1f86f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/multilingual_transformer.py @@ -0,0 +1,228 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections import OrderedDict + +from fairseq import utils +from fairseq.models import ( + FairseqMultiModel, + register_model, + register_model_architecture, +) +from fairseq.models.transformer import ( + Embedding, + TransformerDecoder, + TransformerEncoder, + TransformerModel, + base_architecture, +) + + +@register_model("multilingual_transformer") +class MultilingualTransformerModel(FairseqMultiModel): + """Train Transformer models for multiple language pairs simultaneously. + + Requires `--task multilingual_translation`. + + We inherit all arguments from TransformerModel and assume that all language + pairs use a single Transformer architecture. In addition, we provide several + options that are specific to the multilingual setting. + + Args: + --share-encoder-embeddings: share encoder embeddings across all source languages + --share-decoder-embeddings: share decoder embeddings across all target languages + --share-encoders: share all encoder params (incl. embeddings) across all source languages + --share-decoders: share all decoder params (incl. embeddings) across all target languages + """ + + def __init__(self, encoders, decoders): + super().__init__(encoders, decoders) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + TransformerModel.add_args(parser) + parser.add_argument( + "--share-encoder-embeddings", + action="store_true", + help="share encoder embeddings across languages", + ) + parser.add_argument( + "--share-decoder-embeddings", + action="store_true", + help="share decoder embeddings across languages", + ) + parser.add_argument( + "--share-encoders", + action="store_true", + help="share encoders across languages", + ) + parser.add_argument( + "--share-decoders", + action="store_true", + help="share decoders across languages", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + from fairseq.tasks.multilingual_translation import MultilingualTranslationTask + + assert isinstance(task, MultilingualTranslationTask) + + # make sure all arguments are present in older models + base_multilingual_architecture(args) + + if not hasattr(args, "max_source_positions"): + args.max_source_positions = 1024 + if not hasattr(args, "max_target_positions"): + args.max_target_positions = 1024 + + src_langs = [lang_pair.split("-")[0] for lang_pair in task.model_lang_pairs] + tgt_langs = [lang_pair.split("-")[1] for lang_pair in task.model_lang_pairs] + + if args.share_encoders: + args.share_encoder_embeddings = True + if args.share_decoders: + args.share_decoder_embeddings = True + + def build_embedding(dictionary, embed_dim, path=None): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + emb = Embedding(num_embeddings, embed_dim, padding_idx) + # if provided, load from preloaded dictionaries + if path: + embed_dict = utils.parse_embedding(path) + utils.load_embedding(embed_dict, dictionary, emb) + return emb + + # build shared embeddings (if applicable) + shared_encoder_embed_tokens, shared_decoder_embed_tokens = None, None + if args.share_all_embeddings: + if args.encoder_embed_dim != args.decoder_embed_dim: + raise ValueError( + "--share-all-embeddings requires --encoder-embed-dim to match --decoder-embed-dim" + ) + if args.decoder_embed_path and ( + args.decoder_embed_path != args.encoder_embed_path + ): + raise ValueError( + "--share-all-embeddings not compatible with --decoder-embed-path" + ) + shared_encoder_embed_tokens = FairseqMultiModel.build_shared_embeddings( + dicts=task.dicts, + langs=task.langs, + embed_dim=args.encoder_embed_dim, + build_embedding=build_embedding, + pretrained_embed_path=args.encoder_embed_path, + ) + shared_decoder_embed_tokens = shared_encoder_embed_tokens + args.share_decoder_input_output_embed = True + else: + if args.share_encoder_embeddings: + shared_encoder_embed_tokens = FairseqMultiModel.build_shared_embeddings( + dicts=task.dicts, + langs=src_langs, + embed_dim=args.encoder_embed_dim, + build_embedding=build_embedding, + pretrained_embed_path=args.encoder_embed_path, + ) + if args.share_decoder_embeddings: + shared_decoder_embed_tokens = FairseqMultiModel.build_shared_embeddings( + dicts=task.dicts, + langs=tgt_langs, + embed_dim=args.decoder_embed_dim, + build_embedding=build_embedding, + pretrained_embed_path=args.decoder_embed_path, + ) + + # encoders/decoders for each language + lang_encoders, lang_decoders = {}, {} + + def get_encoder(lang): + if lang not in lang_encoders: + if shared_encoder_embed_tokens is not None: + encoder_embed_tokens = shared_encoder_embed_tokens + else: + encoder_embed_tokens = build_embedding( + task.dicts[lang], + args.encoder_embed_dim, + args.encoder_embed_path, + ) + lang_encoders[lang] = cls._get_module_class( + True, args, task.dicts[lang], encoder_embed_tokens, src_langs + ) + return lang_encoders[lang] + + def get_decoder(lang): + if lang not in lang_decoders: + if shared_decoder_embed_tokens is not None: + decoder_embed_tokens = shared_decoder_embed_tokens + else: + decoder_embed_tokens = build_embedding( + task.dicts[lang], + args.decoder_embed_dim, + args.decoder_embed_path, + ) + lang_decoders[lang] = cls._get_module_class( + False, args, task.dicts[lang], decoder_embed_tokens, tgt_langs + ) + return lang_decoders[lang] + + # shared encoders/decoders (if applicable) + shared_encoder, shared_decoder = None, None + if args.share_encoders: + shared_encoder = get_encoder(src_langs[0]) + if args.share_decoders: + shared_decoder = get_decoder(tgt_langs[0]) + + encoders, decoders = OrderedDict(), OrderedDict() + for lang_pair, src, tgt in zip(task.model_lang_pairs, src_langs, tgt_langs): + encoders[lang_pair] = ( + shared_encoder if shared_encoder is not None else get_encoder(src) + ) + decoders[lang_pair] = ( + shared_decoder if shared_decoder is not None else get_decoder(tgt) + ) + + return MultilingualTransformerModel(encoders, decoders) + + @classmethod + def _get_module_class(cls, is_encoder, args, lang_dict, embed_tokens, langs): + module_class = TransformerEncoder if is_encoder else TransformerDecoder + return module_class(args, lang_dict, embed_tokens) + + def load_state_dict(self, state_dict, strict=True, model_cfg=None): + state_dict_subset = state_dict.copy() + for k, _ in state_dict.items(): + assert k.startswith("models.") + lang_pair = k.split(".")[1] + if lang_pair not in self.models: + del state_dict_subset[k] + super().load_state_dict(state_dict_subset, strict=strict, model_cfg=model_cfg) + + +@register_model_architecture("multilingual_transformer", "multilingual_transformer") +def base_multilingual_architecture(args): + base_architecture(args) + args.share_encoder_embeddings = getattr(args, "share_encoder_embeddings", False) + args.share_decoder_embeddings = getattr(args, "share_decoder_embeddings", False) + args.share_encoders = getattr(args, "share_encoders", False) + args.share_decoders = getattr(args, "share_decoders", False) + + +@register_model_architecture( + "multilingual_transformer", "multilingual_transformer_iwslt_de_en" +) +def multilingual_transformer_iwslt_de_en(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 1024) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 1024) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4) + args.decoder_layers = getattr(args, "decoder_layers", 6) + base_multilingual_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/nat/__init__.py b/SpeechT5/fairseq/fairseq/models/nat/__init__.py new file mode 100644 index 0000000..05fe822 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +from .fairseq_nat_model import * +from .nonautoregressive_transformer import * +from .nat_crf_transformer import * +from .iterative_nonautoregressive_transformer import * +from .cmlm_transformer import * +from .levenshtein_transformer import * +from .insertion_transformer import * diff --git a/SpeechT5/fairseq/fairseq/models/nat/cmlm_transformer.py b/SpeechT5/fairseq/fairseq/models/nat/cmlm_transformer.py new file mode 100644 index 0000000..c876e94 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/cmlm_transformer.py @@ -0,0 +1,162 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +This file implements: +Ghazvininejad, Marjan, et al. +"Constant-time machine translation with conditional masked language models." +arXiv preprint arXiv:1904.09324 (2019). +""" + +from fairseq.models import register_model, register_model_architecture +from fairseq.models.nat import NATransformerModel +from fairseq.utils import new_arange + + +def _skeptical_unmasking(output_scores, output_masks, p): + sorted_index = output_scores.sort(-1)[1] + boundary_len = ( + (output_masks.sum(1, keepdim=True).type_as(output_scores) - 2) * p + ).long() + skeptical_mask = new_arange(output_masks) < boundary_len + return skeptical_mask.scatter(1, sorted_index, skeptical_mask) + + +@register_model("cmlm_transformer") +class CMLMNATransformerModel(NATransformerModel): + @staticmethod + def add_args(parser): + NATransformerModel.add_args(parser) + + def forward( + self, src_tokens, src_lengths, prev_output_tokens, tgt_tokens, **kwargs + ): + assert not self.decoder.src_embedding_copy, "do not support embedding copy." + + # encoding + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + # length prediction + length_out = self.decoder.forward_length( + normalize=False, encoder_out=encoder_out + ) + length_tgt = self.decoder.forward_length_prediction( + length_out, encoder_out, tgt_tokens + ) + + # decoding + word_ins_out = self.decoder( + normalize=False, + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + ) + word_ins_mask = prev_output_tokens.eq(self.unk) + + return { + "word_ins": { + "out": word_ins_out, + "tgt": tgt_tokens, + "mask": word_ins_mask, + "ls": self.args.label_smoothing, + "nll_loss": True, + }, + "length": { + "out": length_out, + "tgt": length_tgt, + "factor": self.decoder.length_loss_factor, + }, + } + + def forward_decoder(self, decoder_out, encoder_out, decoding_format=None, **kwargs): + + step = decoder_out.step + max_step = decoder_out.max_step + + output_tokens = decoder_out.output_tokens + output_scores = decoder_out.output_scores + history = decoder_out.history + + # execute the decoder + output_masks = output_tokens.eq(self.unk) + _scores, _tokens = self.decoder( + normalize=True, + prev_output_tokens=output_tokens, + encoder_out=encoder_out, + ).max(-1) + output_tokens.masked_scatter_(output_masks, _tokens[output_masks]) + output_scores.masked_scatter_(output_masks, _scores[output_masks]) + + if history is not None: + history.append(output_tokens.clone()) + + # skeptical decoding (depend on the maximum decoding steps.) + if (step + 1) < max_step: + skeptical_mask = _skeptical_unmasking( + output_scores, output_tokens.ne(self.pad), 1 - (step + 1) / max_step + ) + + output_tokens.masked_fill_(skeptical_mask, self.unk) + output_scores.masked_fill_(skeptical_mask, 0.0) + + if history is not None: + history.append(output_tokens.clone()) + + return decoder_out._replace( + output_tokens=output_tokens, + output_scores=output_scores, + attn=None, + history=history, + ) + + +@register_model_architecture("cmlm_transformer", "cmlm_transformer") +def cmlm_base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", True) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.apply_bert_init = getattr(args, "apply_bert_init", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + # --- special arguments --- + args.sg_length_pred = getattr(args, "sg_length_pred", False) + args.pred_length_offset = getattr(args, "pred_length_offset", False) + args.length_loss_factor = getattr(args, "length_loss_factor", 0.1) + args.ngram_predictor = getattr(args, "ngram_predictor", 1) + args.src_embedding_copy = getattr(args, "src_embedding_copy", False) + + +@register_model_architecture("cmlm_transformer", "cmlm_transformer_wmt_en_de") +def cmlm_wmt_en_de(args): + cmlm_base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/nat/fairseq_nat_model.py b/SpeechT5/fairseq/fairseq/models/nat/fairseq_nat_model.py new file mode 100644 index 0000000..b093941 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/fairseq_nat_model.py @@ -0,0 +1,170 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +from fairseq.models.transformer import ( + TransformerDecoder, + TransformerEncoder, + TransformerModel, +) +from fairseq.modules.transformer_sentence_encoder import init_bert_params + + +def ensemble_encoder(func): + def wrapper(self, *args, **kwargs): + if self.ensemble_models is None or len(self.ensemble_models) == 1: + return func(self, *args, **kwargs) + encoder_outs = [func(model, *args, **kwargs, return_all_hiddens=True) for model in self.ensemble_models] + _encoder_out = encoder_outs[0].copy() + + def stack(key): + outs = [e[key][0] for e in encoder_outs] + return [torch.stack(outs, -1) if outs[0] is not None else None] + + _encoder_out["encoder_out"] = stack("encoder_out") + _encoder_out["encoder_embedding"] = stack("encoder_embedding") + + num_layers = len(_encoder_out["encoder_states"]) + if num_layers > 0: + _encoder_out["encoder_states"] = [ + torch.stack([e["encoder_states"][i] for e in encoder_outs], -1) + for i in range(num_layers) + ] + return _encoder_out + + return wrapper + + +def ensemble_decoder(func): + def wrapper(self, normalize=False, encoder_out=None, *args, **kwargs): + if self.ensemble_models is None or len(self.ensemble_models) == 1: + return func( + self, normalize=normalize, encoder_out=encoder_out, *args, **kwargs + ) + + def _replace(encoder_out, new_val): + new_encoder_out = encoder_out.copy() + new_encoder_out["encoder_out"] = [new_val] + return new_encoder_out + + action_outs = [ + func( + model, + normalize=normalize, + encoder_out=_replace( + encoder_out, + encoder_out["encoder_out"][0][:, :, :, i] + ), + *args, + **kwargs + ) + for i, model in enumerate(self.ensemble_models) + ] + + if not isinstance(action_outs[0], tuple): # return multiple values + action_outs = [[a] for a in action_outs] + else: + action_outs = [list(a) for a in action_outs] + + ensembled_outs = [] + for i in range(len(action_outs[0])): + if i == 0 and normalize: + ensembled_outs += [ + torch.logsumexp( + torch.stack([a[i] for a in action_outs], -1), dim=-1 + ) + - math.log(len(self.ensemble_models)) + ] + elif action_outs[0][i] is not None: + ensembled_outs += [torch.stack([a[i] for a in action_outs], -1)] + else: + ensembled_outs += [None] + + if len(ensembled_outs) == 1: + return ensembled_outs[0] + return tuple(ensembled_outs) + + return wrapper + + +class FairseqNATModel(TransformerModel): + """ + Abstract class for all nonautoregressive-based models + """ + + def __init__(self, args, encoder, decoder): + super().__init__(args, encoder, decoder) + self.tgt_dict = decoder.dictionary + self.bos = decoder.dictionary.bos() + self.eos = decoder.dictionary.eos() + self.pad = decoder.dictionary.pad() + self.unk = decoder.dictionary.unk() + + self.ensemble_models = None + + @property + def allow_length_beam(self): + return False + + @property + def allow_ensemble(self): + return True + + def enable_ensemble(self, models): + self.encoder.ensemble_models = [m.encoder for m in models] + self.decoder.ensemble_models = [m.decoder for m in models] + + @staticmethod + def add_args(parser): + TransformerModel.add_args(parser) + parser.add_argument( + "--apply-bert-init", + action="store_true", + help="use custom param initialization for BERT", + ) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + decoder = FairseqNATDecoder(args, tgt_dict, embed_tokens) + if getattr(args, "apply_bert_init", False): + decoder.apply(init_bert_params) + return decoder + + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + encoder = FairseqNATEncoder(args, src_dict, embed_tokens) + if getattr(args, "apply_bert_init", False): + encoder.apply(init_bert_params) + return encoder + + def forward_encoder(self, encoder_inputs): + return self.encoder(*encoder_inputs) + + def forward_decoder(self, *args, **kwargs): + return NotImplementedError + + def initialize_output_tokens(self, *args, **kwargs): + return NotImplementedError + + def forward(self, *args, **kwargs): + return NotImplementedError + + +class FairseqNATEncoder(TransformerEncoder): + def __init__(self, args, dictionary, embed_tokens): + super().__init__(args, dictionary, embed_tokens) + self.ensemble_models = None + + @ensemble_encoder + def forward(self, *args, **kwargs): + return super().forward(*args, **kwargs) + + +class FairseqNATDecoder(TransformerDecoder): + def __init__(self, args, dictionary, embed_tokens, no_encoder_attn=False): + super().__init__(args, dictionary, embed_tokens, no_encoder_attn) + self.ensemble_models = None diff --git a/SpeechT5/fairseq/fairseq/models/nat/insertion_transformer.py b/SpeechT5/fairseq/fairseq/models/nat/insertion_transformer.py new file mode 100644 index 0000000..bc28000 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/insertion_transformer.py @@ -0,0 +1,280 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch +import torch.nn.functional as F +from fairseq.models import register_model, register_model_architecture +from fairseq.models.nat import ( + FairseqNATModel, + LevenshteinTransformerDecoder, + LevenshteinTransformerModel, + ensemble_decoder, +) +from fairseq.models.transformer import Linear +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.utils import new_arange + + +class NegativeDistanceScore(object): + def __init__(self): + + # pre-compute some values + self.scores = {} + + self.scores[0.5] = self.compute_score_full(50, 0.5) + self.scores[1.0] = self.compute_score_full(50, 1.0) + self.scores[2.0] = self.compute_score_full(50, 2.0) + + def __call__(self, i, L, tau): + if (tau is None) or (tau > 1000): + return 1 / L + + if tau in self.scores: + if L < self.scores[tau].shape[0]: + return self.scores[tau][L - 1, i] + return self.compute_score(L, tau)[i] + + def compute_score(self, L, tau): + s = np.array([-abs(L / 2 - i) / tau for i in range(L)]) + s = np.exp(s - s.max()) + return s / s.sum() + + def compute_score_full(self, L, tau): + s = -abs(np.arange(0, L - 1)[:, None] / 2 - np.arange(L)[None, :]) / tau + s = np.tril(s, 0) + np.triu(s - float("inf"), 1) + s = np.exp(s - s.max(1, keepdims=True)) + return s / s.sum(1, keepdims=True) + + +neg_scorer = NegativeDistanceScore() + + +def _get_ins_targets(in_tokens, out_tokens, padding_idx, unk_idx, vocab_size, tau=None): + try: + from fairseq import libnat + except ImportError as e: + import sys + + sys.stderr.write("ERROR: missing libnat. run `pip install --editable .`\n") + raise e + + B = in_tokens.size(0) + T = in_tokens.size(1) + V = vocab_size + + with torch.cuda.device_of(in_tokens): + in_tokens_list = [ + [t for t in s if t != padding_idx] for i, s in enumerate(in_tokens.tolist()) + ] + out_tokens_list = [ + [t for t in s if t != padding_idx] + for i, s in enumerate(out_tokens.tolist()) + ] + + full_labels = libnat.suggested_ed2_path( + in_tokens_list, out_tokens_list, padding_idx + ) + insert_labels = [a[:-1] for a in full_labels] + + # numericalize1 + insert_label_tensors = in_tokens.new_zeros(B * (T - 1) * V).float() + insert_index, insert_labels = zip( + *[ + (w + (j + i * (T - 1)) * V, neg_scorer(k, len(label), tau)) + for i, labels in enumerate(insert_labels) + for j, label in enumerate(labels[1:-1]) + for k, w in enumerate(label) + ] + ) # HACK 1:-1 + insert_index, insert_labels = [ + torch.tensor(list(a), device=in_tokens.device) + for a in [insert_index, insert_labels] + ] + insert_label_tensors.scatter_(0, insert_index.long(), insert_labels) + insert_label_tensors = insert_label_tensors.view(B, T - 1, V) + + return insert_label_tensors + + +def _apply_ins_words(in_tokens, in_scores, word_ins_pred, word_ins_scores, padding_idx): + + padding_masks = in_tokens[:, 1:].eq(padding_idx) + word_ins_scores.masked_fill_(padding_masks, 0.0) + word_ins_pred.masked_fill_(padding_masks, padding_idx) + + in_coords = new_arange(in_tokens).type_as(in_scores) + + # shift all padding predictions to infinite + out_coords = (in_coords[:, 1:] - 0.5).masked_fill( + word_ins_pred.eq(padding_idx), float("inf") + ) + out_coords = torch.cat([in_coords, out_coords], 1).sort(-1)[1] + out_tokens = torch.cat([in_tokens, word_ins_pred], 1).gather(1, out_coords) + out_scores = torch.cat([in_scores, word_ins_scores], 1).gather(1, out_coords) + return out_tokens, out_scores + + +@register_model("insertion_transformer") +class InsertionTransformerModel(LevenshteinTransformerModel): + def __init__(self, args, encoder, decoder): + super().__init__(args, encoder, decoder) + + @staticmethod + def add_args(parser): + FairseqNATModel.add_args(parser) + parser.add_argument("--label-tau", default=None, type=float) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + decoder = InsertionTransformerDecoder(args, tgt_dict, embed_tokens) + if getattr(args, "apply_bert_init", False): + decoder.apply(init_bert_params) + return decoder + + def forward( + self, src_tokens, src_lengths, prev_output_tokens, tgt_tokens, **kwargs + ): + + assert tgt_tokens is not None, "forward function only supports training." + + # encoding + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + + # generate training labels for insertion + word_ins_out = self.decoder.forward_word_ins( + normalize=False, + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + ) + + word_ins_tgt = _get_ins_targets( + prev_output_tokens, + tgt_tokens, + self.pad, + self.unk, + len(self.tgt_dict), + tau=self.decoder.label_tau, + ).type_as(word_ins_out) + word_ins_masks = prev_output_tokens[:, 1:].ne(self.pad) + + return { + "word_ins": { + "out": word_ins_out, + "tgt": word_ins_tgt, + "mask": word_ins_masks, + "ls": self.args.label_smoothing, + "nll_loss": True, + } + } + + def forward_decoder( + self, decoder_out, encoder_out, eos_penalty=0.0, max_ratio=None, **kwargs + ): + + output_tokens = decoder_out.output_tokens + output_scores = decoder_out.output_scores + history = decoder_out.history + + # TODO: decoding for InsertionTransformer + word_ins_score = self.decoder.forward_word_ins( + normalize=True, prev_output_tokens=output_tokens, encoder_out=encoder_out + ) + + if eos_penalty > 0.0: + word_ins_score[:, :, self.pad] -= eos_penalty + word_ins_score, word_ins_pred = word_ins_score.max(-1) + output_tokens, output_scores = _apply_ins_words( + output_tokens, output_scores, word_ins_pred, word_ins_score, self.pad + ) + + # delete some unnecessary paddings + cut_off = output_tokens.ne(self.pad).sum(1).max() + output_tokens = output_tokens[:, :cut_off] + output_scores = output_scores[:, :cut_off] + + if history is not None: + history.append(output_tokens.clone()) + + return decoder_out._replace( + output_tokens=output_tokens, + output_scores=output_scores, + attn=None, + history=history, + ) + + +class InsertionTransformerDecoder(LevenshteinTransformerDecoder): + def __init__(self, args, dictionary, embed_tokens, no_encoder_attn=False): + # use the TransformerDecoder's __init__ + super(LevenshteinTransformerDecoder, self).__init__( + args, dictionary, embed_tokens, no_encoder_attn=no_encoder_attn + ) + + self.dictionary = dictionary + self.bos = dictionary.bos() + self.unk = dictionary.unk() + self.eos = dictionary.eos() + self.pool_out = Linear(self.output_embed_dim * 2, self.output_embed_dim) + + self.label_tau = getattr(args, "label_tau", None) + + @ensemble_decoder + def forward_word_ins(self, normalize, encoder_out, prev_output_tokens): + features = self.extract_features(prev_output_tokens, encoder_out=encoder_out)[0] + features = self.pool_out( + torch.cat([features[:, :-1, :], features[:, 1:, :]], 2) + ) + decoder_out = self.output_layer(features) + return F.log_softmax(decoder_out, -1) if normalize else decoder_out + + def forward_mask_ins(self, *args, **kwargs): + raise NotImplementedError + + def forward_word_del(self, *args, **kwargs): + raise NotImplementedError + + +@register_model_architecture("insertion_transformer", "insertion_transformer") +def insertion_base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.apply_bert_init = getattr(args, "apply_bert_init", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + # special for insertion transformer + args.label_tau = getattr(args, "label_tau", None) diff --git a/SpeechT5/fairseq/fairseq/models/nat/iterative_nonautoregressive_transformer.py b/SpeechT5/fairseq/fairseq/models/nat/iterative_nonautoregressive_transformer.py new file mode 100644 index 0000000..bc39509 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/iterative_nonautoregressive_transformer.py @@ -0,0 +1,228 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq.models import register_model, register_model_architecture +from fairseq.models.nat import NATransformerModel + + +def _sequential_poisoning(s, V, beta=0.33, bos=2, eos=3, pad=1): + # s: input batch + # V: vocabulary size + rand_words = torch.randint(low=4, high=V, size=s.size(), device=s.device) + choices = torch.rand(size=s.size(), device=s.device) + choices.masked_fill_((s == pad) | (s == bos) | (s == eos), 1) + + replace = choices < beta / 3 + repeat = (choices >= beta / 3) & (choices < beta * 2 / 3) + swap = (choices >= beta * 2 / 3) & (choices < beta) + safe = choices >= beta + + for i in range(s.size(1) - 1): + rand_word = rand_words[:, i] + next_word = s[:, i + 1] + self_word = s[:, i] + + replace_i = replace[:, i] + swap_i = swap[:, i] & (next_word != 3) + repeat_i = repeat[:, i] & (next_word != 3) + safe_i = safe[:, i] | ((next_word == 3) & (~replace_i)) + + s[:, i] = ( + self_word * (safe_i | repeat_i).long() + + next_word * swap_i.long() + + rand_word * replace_i.long() + ) + s[:, i + 1] = ( + next_word * (safe_i | replace_i).long() + + self_word * (swap_i | repeat_i).long() + ) + return s + + +def gumbel_noise(input, TINY=1e-8): + return ( + input.new_zeros(*input.size()) + .uniform_() + .add_(TINY) + .log_() + .neg_() + .add_(TINY) + .log_() + .neg_() + ) + + +@register_model("iterative_nonautoregressive_transformer") +class IterNATransformerModel(NATransformerModel): + @staticmethod + def add_args(parser): + NATransformerModel.add_args(parser) + parser.add_argument( + "--train-step", + type=int, + help="number of refinement iterations during training", + ) + parser.add_argument( + "--dae-ratio", + type=float, + help="the probability of switching to the denoising auto-encoder loss", + ) + parser.add_argument( + "--stochastic-approx", + action="store_true", + help="sampling from the decoder as the inputs for next iteration", + ) + + @classmethod + def build_model(cls, args, task): + model = super().build_model(args, task) + model.train_step = getattr(args, "train_step", 4) + model.dae_ratio = getattr(args, "dae_ratio", 0.5) + model.stochastic_approx = getattr(args, "stochastic_approx", False) + return model + + def forward( + self, src_tokens, src_lengths, prev_output_tokens, tgt_tokens, **kwargs + ): + + B, T = prev_output_tokens.size() + + # encoding + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + + # length prediction + length_out = self.decoder.forward_length( + normalize=False, encoder_out=encoder_out + ) + length_tgt = self.decoder.forward_length_prediction( + length_out, encoder_out, tgt_tokens + ) + + # decoding + word_ins_outs, word_ins_tgts, word_ins_masks = [], [], [] + for t in range(self.train_step): + word_ins_out = self.decoder( + normalize=False, + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + step=t, + ) + word_ins_tgt = tgt_tokens + word_ins_mask = word_ins_tgt.ne(self.pad) + + word_ins_outs.append(word_ins_out) + word_ins_tgts.append(word_ins_tgt) + word_ins_masks.append(word_ins_mask) + + if t < (self.train_step - 1): + # prediction for next iteration + if self.stochastic_approx: + word_ins_prediction = ( + word_ins_out + gumbel_noise(word_ins_out) + ).max(-1)[1] + else: + word_ins_prediction = word_ins_out.max(-1)[1] + + prev_output_tokens = prev_output_tokens.masked_scatter( + word_ins_mask, word_ins_prediction[word_ins_mask] + ) + + if self.dae_ratio > 0: + # we do not perform denoising for the first iteration + corrputed = ( + torch.rand(size=(B,), device=prev_output_tokens.device) + < self.dae_ratio + ) + corrputed_tokens = _sequential_poisoning( + tgt_tokens[corrputed], + len(self.tgt_dict), + 0.33, + self.bos, + self.eos, + self.pad, + ) + prev_output_tokens[corrputed] = corrputed_tokens + + # concat everything + word_ins_out = torch.cat(word_ins_outs, 0) + word_ins_tgt = torch.cat(word_ins_tgts, 0) + word_ins_mask = torch.cat(word_ins_masks, 0) + + return { + "word_ins": { + "out": word_ins_out, + "tgt": word_ins_tgt, + "mask": word_ins_mask, + "ls": self.args.label_smoothing, + "nll_loss": True, + }, + "length": { + "out": length_out, + "tgt": length_tgt, + "factor": self.decoder.length_loss_factor, + }, + } + + +@register_model_architecture( + "iterative_nonautoregressive_transformer", "iterative_nonautoregressive_transformer" +) +def inat_base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.apply_bert_init = getattr(args, "apply_bert_init", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + # --- special arguments --- + args.sg_length_pred = getattr(args, "sg_length_pred", False) + args.pred_length_offset = getattr(args, "pred_length_offset", False) + args.length_loss_factor = getattr(args, "length_loss_factor", 0.1) + args.ngram_predictor = getattr(args, "ngram_predictor", 1) + args.src_embedding_copy = getattr(args, "src_embedding_copy", False) + + args.train_step = getattr(args, "train_step", 4) + args.dae_ratio = getattr(args, "dae_ratio", 0.5) + args.stochastic_approx = getattr(args, "stochastic_approx", False) + + +@register_model_architecture( + "iterative_nonautoregressive_transformer", + "iterative_nonautoregressive_transformer_wmt_en_de", +) +def iter_nat_wmt_en_de(args): + inat_base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/nat/levenshtein_transformer.py b/SpeechT5/fairseq/fairseq/models/nat/levenshtein_transformer.py new file mode 100644 index 0000000..9377c3c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/levenshtein_transformer.py @@ -0,0 +1,509 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq.iterative_refinement_generator import DecoderOut +from fairseq.models import register_model, register_model_architecture +from fairseq.models.nat import FairseqNATDecoder, FairseqNATModel, ensemble_decoder +from fairseq.models.transformer import Embedding, TransformerDecoderLayer +from fairseq.modules.transformer_sentence_encoder import init_bert_params + +from .levenshtein_utils import ( + _apply_del_words, + _apply_ins_masks, + _apply_ins_words, + _fill, + _get_del_targets, + _get_ins_targets, + _skip, + _skip_encoder_out, +) + + +@register_model("levenshtein_transformer") +class LevenshteinTransformerModel(FairseqNATModel): + @property + def allow_length_beam(self): + return False + + @staticmethod + def add_args(parser): + FairseqNATModel.add_args(parser) + parser.add_argument( + "--early-exit", + default="6,6,6", + type=str, + help="number of decoder layers before word_del, mask_ins, word_ins", + ) + parser.add_argument( + "--no-share-discriminator", + action="store_true", + help="separate parameters for discriminator", + ) + parser.add_argument( + "--no-share-maskpredictor", + action="store_true", + help="separate parameters for mask-predictor", + ) + parser.add_argument( + "--share-discriminator-maskpredictor", + action="store_true", + help="share the parameters for both mask-predictor and discriminator", + ) + parser.add_argument( + "--sampling-for-deletion", + action="store_true", + help="instead of argmax, use sampling to predict the tokens", + ) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + decoder = LevenshteinTransformerDecoder(args, tgt_dict, embed_tokens) + if getattr(args, "apply_bert_init", False): + decoder.apply(init_bert_params) + return decoder + + def forward( + self, src_tokens, src_lengths, prev_output_tokens, tgt_tokens, **kwargs + ): + + assert tgt_tokens is not None, "forward function only supports training." + + # encoding + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + + # generate training labels for insertion + masked_tgt_masks, masked_tgt_tokens, mask_ins_targets = _get_ins_targets( + prev_output_tokens, tgt_tokens, self.pad, self.unk + ) + mask_ins_targets = mask_ins_targets.clamp(min=0, max=255) # for safe prediction + mask_ins_masks = prev_output_tokens[:, 1:].ne(self.pad) + + mask_ins_out, _ = self.decoder.forward_mask_ins( + normalize=False, + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + ) + word_ins_out, _ = self.decoder.forward_word_ins( + normalize=False, + prev_output_tokens=masked_tgt_tokens, + encoder_out=encoder_out, + ) + + # make online prediction + if self.decoder.sampling_for_deletion: + word_predictions = torch.multinomial( + F.softmax(word_ins_out, -1).view(-1, word_ins_out.size(-1)), 1 + ).view(word_ins_out.size(0), -1) + else: + word_predictions = F.log_softmax(word_ins_out, dim=-1).max(2)[1] + + word_predictions.masked_scatter_( + ~masked_tgt_masks, tgt_tokens[~masked_tgt_masks] + ) + + # generate training labels for deletion + word_del_targets = _get_del_targets(word_predictions, tgt_tokens, self.pad) + word_del_out, _ = self.decoder.forward_word_del( + normalize=False, + prev_output_tokens=word_predictions, + encoder_out=encoder_out, + ) + word_del_masks = word_predictions.ne(self.pad) + + return { + "mask_ins": { + "out": mask_ins_out, + "tgt": mask_ins_targets, + "mask": mask_ins_masks, + "ls": 0.01, + }, + "word_ins": { + "out": word_ins_out, + "tgt": tgt_tokens, + "mask": masked_tgt_masks, + "ls": self.args.label_smoothing, + "nll_loss": True, + }, + "word_del": { + "out": word_del_out, + "tgt": word_del_targets, + "mask": word_del_masks, + }, + } + + def forward_decoder( + self, decoder_out, encoder_out, eos_penalty=0.0, max_ratio=None, **kwargs + ): + + output_tokens = decoder_out.output_tokens + output_scores = decoder_out.output_scores + attn = decoder_out.attn + history = decoder_out.history + + bsz = output_tokens.size(0) + if max_ratio is None: + max_lens = torch.zeros_like(output_tokens).fill_(255) + else: + if not encoder_out["encoder_padding_mask"]: + max_src_len = encoder_out["encoder_out"].size(0) + src_lens = encoder_out["encoder_out"].new(bsz).fill_(max_src_len) + else: + src_lens = (~encoder_out["encoder_padding_mask"][0]).sum(1) + max_lens = (src_lens * max_ratio).clamp(min=10).long() + + # delete words + # do not delete tokens if it is <s> </s> + can_del_word = output_tokens.ne(self.pad).sum(1) > 2 + if can_del_word.sum() != 0: # we cannot delete, skip + word_del_score, word_del_attn = self.decoder.forward_word_del( + normalize=True, + prev_output_tokens=_skip(output_tokens, can_del_word), + encoder_out=_skip_encoder_out(self.encoder, encoder_out, can_del_word), + ) + word_del_pred = word_del_score.max(-1)[1].bool() + + _tokens, _scores, _attn = _apply_del_words( + output_tokens[can_del_word], + output_scores[can_del_word], + word_del_attn, + word_del_pred, + self.pad, + self.bos, + self.eos, + ) + output_tokens = _fill(output_tokens, can_del_word, _tokens, self.pad) + output_scores = _fill(output_scores, can_del_word, _scores, 0) + attn = _fill(attn, can_del_word, _attn, 0.0) + + if history is not None: + history.append(output_tokens.clone()) + + # insert placeholders + can_ins_mask = output_tokens.ne(self.pad).sum(1) < max_lens + if can_ins_mask.sum() != 0: + mask_ins_score, _ = self.decoder.forward_mask_ins( + normalize=True, + prev_output_tokens=_skip(output_tokens, can_ins_mask), + encoder_out=_skip_encoder_out(self.encoder, encoder_out, can_ins_mask), + ) + if eos_penalty > 0.0: + mask_ins_score[:, :, 0] = mask_ins_score[:, :, 0] - eos_penalty + mask_ins_pred = mask_ins_score.max(-1)[1] + mask_ins_pred = torch.min( + mask_ins_pred, max_lens[can_ins_mask, None].expand_as(mask_ins_pred) + ) + + _tokens, _scores = _apply_ins_masks( + output_tokens[can_ins_mask], + output_scores[can_ins_mask], + mask_ins_pred, + self.pad, + self.unk, + self.eos, + ) + output_tokens = _fill(output_tokens, can_ins_mask, _tokens, self.pad) + output_scores = _fill(output_scores, can_ins_mask, _scores, 0) + + if history is not None: + history.append(output_tokens.clone()) + + # insert words + can_ins_word = output_tokens.eq(self.unk).sum(1) > 0 + if can_ins_word.sum() != 0: + word_ins_score, word_ins_attn = self.decoder.forward_word_ins( + normalize=True, + prev_output_tokens=_skip(output_tokens, can_ins_word), + encoder_out=_skip_encoder_out(self.encoder, encoder_out, can_ins_word), + ) + word_ins_score, word_ins_pred = word_ins_score.max(-1) + _tokens, _scores = _apply_ins_words( + output_tokens[can_ins_word], + output_scores[can_ins_word], + word_ins_pred, + word_ins_score, + self.unk, + ) + + output_tokens = _fill(output_tokens, can_ins_word, _tokens, self.pad) + output_scores = _fill(output_scores, can_ins_word, _scores, 0) + attn = _fill(attn, can_ins_word, word_ins_attn, 0.0) + + if history is not None: + history.append(output_tokens.clone()) + + # delete some unnecessary paddings + cut_off = output_tokens.ne(self.pad).sum(1).max() + output_tokens = output_tokens[:, :cut_off] + output_scores = output_scores[:, :cut_off] + attn = None if attn is None else attn[:, :cut_off, :] + + return decoder_out._replace( + output_tokens=output_tokens, + output_scores=output_scores, + attn=attn, + history=history, + ) + + def initialize_output_tokens(self, encoder_out, src_tokens): + initial_output_tokens = src_tokens.new_zeros(src_tokens.size(0), 2) + initial_output_tokens[:, 0] = self.bos + initial_output_tokens[:, 1] = self.eos + + initial_output_scores = initial_output_tokens.new_zeros( + *initial_output_tokens.size() + ).type_as(encoder_out["encoder_out"][0]) + + return DecoderOut( + output_tokens=initial_output_tokens, + output_scores=initial_output_scores, + attn=None, + step=0, + max_step=0, + history=None, + ) + + +class LevenshteinTransformerDecoder(FairseqNATDecoder): + def __init__(self, args, dictionary, embed_tokens, no_encoder_attn=False): + super().__init__( + args, dictionary, embed_tokens, no_encoder_attn=no_encoder_attn + ) + self.dictionary = dictionary + self.bos = dictionary.bos() + self.unk = dictionary.unk() + self.eos = dictionary.eos() + self.sampling_for_deletion = getattr(args, "sampling_for_deletion", False) + self.embed_mask_ins = Embedding(256, self.output_embed_dim * 2, None) + self.embed_word_del = Embedding(2, self.output_embed_dim, None) + + # del_word, ins_mask, ins_word + self.early_exit = [int(i) for i in args.early_exit.split(",")] + assert len(self.early_exit) == 3 + + # copy layers for mask-predict/deletion + self.layers_msk = None + if getattr(args, "no_share_maskpredictor", False): + self.layers_msk = nn.ModuleList( + [ + TransformerDecoderLayer(args, no_encoder_attn) + for _ in range(self.early_exit[1]) + ] + ) + self.layers_del = None + if getattr(args, "no_share_discriminator", False): + self.layers_del = nn.ModuleList( + [ + TransformerDecoderLayer(args, no_encoder_attn) + for _ in range(self.early_exit[0]) + ] + ) + + if getattr(args, "share_discriminator_maskpredictor", False): + assert getattr( + args, "no_share_discriminator", False + ), "must set saperate discriminator" + self.layers_msk = self.layers_del + + def extract_features( + self, + prev_output_tokens, + encoder_out=None, + early_exit=None, + layers=None, + **unused + ): + """ + Similar to *forward* but only return features. + Inputs: + prev_output_tokens: Tensor(B, T) + encoder_out: a dictionary of hidden states and masks + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + the LevenshteinTransformer decoder has full-attention to all generated tokens + """ + # embed positions + positions = ( + self.embed_positions(prev_output_tokens) + if self.embed_positions is not None + else None + ) + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + attn = None + inner_states = [x] + + # decoder layers + decoder_padding_mask = prev_output_tokens.eq(self.padding_idx) + layers = self.layers if layers is None else layers + early_exit = len(layers) if early_exit is None else early_exit + for _, layer in enumerate(layers[:early_exit]): + x, attn, _ = layer( + x, + encoder_out["encoder_out"][0] + if (encoder_out is not None and len(encoder_out["encoder_out"]) > 0) + else None, + encoder_out["encoder_padding_mask"][0] + if ( + encoder_out is not None + and len(encoder_out["encoder_padding_mask"]) > 0 + ) + else None, + self_attn_mask=None, + self_attn_padding_mask=decoder_padding_mask, + ) + inner_states.append(x) + + if self.layer_norm: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": attn, "inner_states": inner_states} + + @ensemble_decoder + def forward_mask_ins(self, normalize, encoder_out, prev_output_tokens, **unused): + features, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + early_exit=self.early_exit[1], + layers=self.layers_msk, + **unused + ) + features_cat = torch.cat([features[:, :-1, :], features[:, 1:, :]], 2) + decoder_out = F.linear(features_cat, self.embed_mask_ins.weight) + if normalize: + return F.log_softmax(decoder_out, -1), extra["attn"] + return decoder_out, extra["attn"] + + @ensemble_decoder + def forward_word_ins(self, normalize, encoder_out, prev_output_tokens, **unused): + features, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + early_exit=self.early_exit[2], + layers=self.layers, + **unused + ) + decoder_out = self.output_layer(features) + if normalize: + return F.log_softmax(decoder_out, -1), extra["attn"] + return decoder_out, extra["attn"] + + @ensemble_decoder + def forward_word_del(self, normalize, encoder_out, prev_output_tokens, **unused): + features, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + early_exit=self.early_exit[0], + layers=self.layers_del, + **unused + ) + decoder_out = F.linear(features, self.embed_word_del.weight) + if normalize: + return F.log_softmax(decoder_out, -1), extra["attn"] + return decoder_out, extra["attn"] + + +@register_model_architecture("levenshtein_transformer", "levenshtein_transformer") +def levenshtein_base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.apply_bert_init = getattr(args, "apply_bert_init", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.sampling_for_deletion = getattr(args, "sampling_for_deletion", False) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + args.early_exit = getattr(args, "early_exit", "6,6,6") + args.no_share_discriminator = getattr(args, "no_share_discriminator", False) + args.no_share_maskpredictor = getattr(args, "no_share_maskpredictor", False) + args.share_discriminator_maskpredictor = getattr( + args, "share_discriminator_maskpredictor", False + ) + args.no_share_last_layer = getattr(args, "no_share_last_layer", False) + + +@register_model_architecture( + "levenshtein_transformer", "levenshtein_transformer_wmt_en_de" +) +def levenshtein_transformer_wmt_en_de(args): + levenshtein_base_architecture(args) + + +# similar parameters used in the "Attention Is All You Need" paper (Vaswani et al., 2017) +@register_model_architecture( + "levenshtein_transformer", "levenshtein_transformer_vaswani_wmt_en_de_big" +) +def levenshtein_transformer_vaswani_wmt_en_de_big(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.3) + levenshtein_base_architecture(args) + + +# default parameters used in tensor2tensor implementation +@register_model_architecture( + "levenshtein_transformer", "levenshtein_transformer_wmt_en_de_big" +) +def levenshtein_transformer_wmt_en_de_big_t2t(args): + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", True) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", True) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_dropout = getattr(args, "activation_dropout", 0.1) + levenshtein_transformer_vaswani_wmt_en_de_big(args) diff --git a/SpeechT5/fairseq/fairseq/models/nat/levenshtein_utils.py b/SpeechT5/fairseq/fairseq/models/nat/levenshtein_utils.py new file mode 100644 index 0000000..375a98c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/levenshtein_utils.py @@ -0,0 +1,293 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq.utils import new_arange + + +# -------------- Helper Functions --------------------------------------------------- # + + +def load_libnat(): + try: + from fairseq import libnat_cuda + + return libnat_cuda, True + + except ImportError as e: + print(str(e) + "... fall back to CPU version") + + try: + from fairseq import libnat + + return libnat, False + + except ImportError as e: + import sys + + sys.stderr.write( + "ERROR: missing libnat_cuda. run `python setup.py build_ext --inplace`\n" + ) + raise e + + +def _get_ins_targets(in_tokens, out_tokens, padding_idx, unk_idx): + libnat, use_cuda = load_libnat() + + def _get_ins_targets_cuda(in_tokens, out_tokens, padding_idx, unk_idx): + in_masks = in_tokens.ne(padding_idx) + out_masks = out_tokens.ne(padding_idx) + mask_ins_targets, masked_tgt_masks = libnat.generate_insertion_labels( + out_tokens.int(), + libnat.levenshtein_distance( + in_tokens.int(), + out_tokens.int(), + in_masks.sum(1).int(), + out_masks.sum(1).int(), + ), + ) + masked_tgt_masks = masked_tgt_masks.bool() & out_masks + mask_ins_targets = mask_ins_targets.type_as(in_tokens)[ + :, 1 : in_masks.size(1) + ].masked_fill_(~in_masks[:, 1:], 0) + masked_tgt_tokens = out_tokens.masked_fill(masked_tgt_masks, unk_idx) + return masked_tgt_masks, masked_tgt_tokens, mask_ins_targets + + def _get_ins_targets_cpu(in_tokens, out_tokens, padding_idx, unk_idx): + in_seq_len, out_seq_len = in_tokens.size(1), out_tokens.size(1) + + in_tokens_list = [ + [t for t in s if t != padding_idx] for i, s in enumerate(in_tokens.tolist()) + ] + out_tokens_list = [ + [t for t in s if t != padding_idx] + for i, s in enumerate(out_tokens.tolist()) + ] + + full_labels = libnat.suggested_ed2_path( + in_tokens_list, out_tokens_list, padding_idx + ) + mask_inputs = [ + [len(c) if c[0] != padding_idx else 0 for c in a[:-1]] for a in full_labels + ] + + # generate labels + masked_tgt_masks = [] + for mask_input in mask_inputs: + mask_label = [] + for beam_size in mask_input[1:-1]: # HACK 1:-1 + mask_label += [0] + [1 for _ in range(beam_size)] + masked_tgt_masks.append( + mask_label + [0 for _ in range(out_seq_len - len(mask_label))] + ) + mask_ins_targets = [ + mask_input[1:-1] + + [0 for _ in range(in_seq_len - 1 - len(mask_input[1:-1]))] + for mask_input in mask_inputs + ] + + # transform to tensor + masked_tgt_masks = torch.tensor( + masked_tgt_masks, device=out_tokens.device + ).bool() + mask_ins_targets = torch.tensor(mask_ins_targets, device=in_tokens.device) + masked_tgt_tokens = out_tokens.masked_fill(masked_tgt_masks, unk_idx) + return masked_tgt_masks, masked_tgt_tokens, mask_ins_targets + + if use_cuda: + return _get_ins_targets_cuda(in_tokens, out_tokens, padding_idx, unk_idx) + return _get_ins_targets_cpu(in_tokens, out_tokens, padding_idx, unk_idx) + + +def _get_del_targets(in_tokens, out_tokens, padding_idx): + libnat, use_cuda = load_libnat() + + def _get_del_targets_cuda(in_tokens, out_tokens, padding_idx): + in_masks = in_tokens.ne(padding_idx) + out_masks = out_tokens.ne(padding_idx) + + word_del_targets = libnat.generate_deletion_labels( + in_tokens.int(), + libnat.levenshtein_distance( + in_tokens.int(), + out_tokens.int(), + in_masks.sum(1).int(), + out_masks.sum(1).int(), + ), + ) + word_del_targets = word_del_targets.type_as(in_tokens).masked_fill_( + ~in_masks, 0 + ) + return word_del_targets + + def _get_del_targets_cpu(in_tokens, out_tokens, padding_idx): + out_seq_len = out_tokens.size(1) + with torch.cuda.device_of(in_tokens): + in_tokens_list = [ + [t for t in s if t != padding_idx] + for i, s in enumerate(in_tokens.tolist()) + ] + out_tokens_list = [ + [t for t in s if t != padding_idx] + for i, s in enumerate(out_tokens.tolist()) + ] + + full_labels = libnat.suggested_ed2_path( + in_tokens_list, out_tokens_list, padding_idx + ) + word_del_targets = [b[-1] for b in full_labels] + word_del_targets = [ + labels + [0 for _ in range(out_seq_len - len(labels))] + for labels in word_del_targets + ] + + # transform to tensor + word_del_targets = torch.tensor(word_del_targets, device=out_tokens.device) + return word_del_targets + + if use_cuda: + return _get_del_targets_cuda(in_tokens, out_tokens, padding_idx) + return _get_del_targets_cpu(in_tokens, out_tokens, padding_idx) + + +def _apply_ins_masks( + in_tokens, in_scores, mask_ins_pred, padding_idx, unk_idx, eos_idx +): + + in_masks = in_tokens.ne(padding_idx) + in_lengths = in_masks.sum(1) + + # HACK: hacky way to shift all the paddings to eos first. + in_tokens.masked_fill_(~in_masks, eos_idx) + mask_ins_pred.masked_fill_(~in_masks[:, 1:], 0) + + out_lengths = in_lengths + mask_ins_pred.sum(1) + out_max_len = out_lengths.max() + out_masks = new_arange(out_lengths, out_max_len)[None, :] < out_lengths[:, None] + + reordering = (mask_ins_pred + in_masks[:, 1:].long()).cumsum(1) + out_tokens = ( + in_tokens.new_zeros(in_tokens.size(0), out_max_len) + .fill_(padding_idx) + .masked_fill_(out_masks, unk_idx) + ) + out_tokens[:, 0] = in_tokens[:, 0] + out_tokens.scatter_(1, reordering, in_tokens[:, 1:]) + + out_scores = None + if in_scores is not None: + in_scores.masked_fill_(~in_masks, 0) + out_scores = in_scores.new_zeros(*out_tokens.size()) + out_scores[:, 0] = in_scores[:, 0] + out_scores.scatter_(1, reordering, in_scores[:, 1:]) + + return out_tokens, out_scores + + +def _apply_ins_words(in_tokens, in_scores, word_ins_pred, word_ins_scores, unk_idx): + word_ins_masks = in_tokens.eq(unk_idx) + out_tokens = in_tokens.masked_scatter(word_ins_masks, word_ins_pred[word_ins_masks]) + + if in_scores is not None: + out_scores = in_scores.masked_scatter( + word_ins_masks, word_ins_scores[word_ins_masks] + ) + else: + out_scores = None + + return out_tokens, out_scores + + +def _apply_del_words( + in_tokens, in_scores, in_attn, word_del_pred, padding_idx, bos_idx, eos_idx +): + # apply deletion to a tensor + in_masks = in_tokens.ne(padding_idx) + bos_eos_masks = in_tokens.eq(bos_idx) | in_tokens.eq(eos_idx) + + max_len = in_tokens.size(1) + word_del_pred.masked_fill_(~in_masks, 1) + word_del_pred.masked_fill_(bos_eos_masks, 0) + + reordering = new_arange(in_tokens).masked_fill_(word_del_pred, max_len).sort(1)[1] + + out_tokens = in_tokens.masked_fill(word_del_pred, padding_idx).gather(1, reordering) + + out_scores = None + if in_scores is not None: + out_scores = in_scores.masked_fill(word_del_pred, 0).gather(1, reordering) + + out_attn = None + if in_attn is not None: + _mask = word_del_pred[:, :, None].expand_as(in_attn) + _reordering = reordering[:, :, None].expand_as(in_attn) + out_attn = in_attn.masked_fill(_mask, 0.0).gather(1, _reordering) + + return out_tokens, out_scores, out_attn + + +def _skip(x, mask): + """ + Getting sliced (dim=0) tensor by mask. Supporting tensor and list/dict of tensors. + """ + if isinstance(x, int): + return x + + if x is None: + return None + + if isinstance(x, torch.Tensor): + if x.size(0) == mask.size(0): + return x[mask] + elif x.size(1) == mask.size(0): + return x[:, mask] + + if isinstance(x, list): + return [_skip(x_i, mask) for x_i in x] + + if isinstance(x, dict): + return {k: _skip(v, mask) for k, v in x.items()} + + raise NotImplementedError + + +def _skip_encoder_out(encoder, encoder_out, mask): + if not mask.any(): + return encoder_out + else: + return encoder.reorder_encoder_out( + encoder_out, mask.nonzero(as_tuple=False).squeeze() + ) + + +def _fill(x, mask, y, padding_idx): + """ + Filling tensor x with y at masked positions (dim=0). + """ + if x is None: + return y + assert x.dim() == y.dim() and mask.size(0) == x.size(0) + assert x.dim() == 2 or (x.dim() == 3 and x.size(2) == y.size(2)) + n_selected = mask.sum() + assert n_selected == y.size(0) + + if n_selected == x.size(0): + return y + + if x.size(1) < y.size(1): + dims = [x.size(0), y.size(1) - x.size(1)] + if x.dim() == 3: + dims.append(x.size(2)) + x = torch.cat([x, x.new_zeros(*dims).fill_(padding_idx)], 1) + x[mask] = y + elif x.size(1) > y.size(1): + x[mask] = padding_idx + if x.dim() == 2: + x[mask, : y.size(1)] = y + else: + x[mask, : y.size(1), :] = y + else: + x[mask] = y + return x diff --git a/SpeechT5/fairseq/fairseq/models/nat/nat_crf_transformer.py b/SpeechT5/fairseq/fairseq/models/nat/nat_crf_transformer.py new file mode 100644 index 0000000..d4b3cd9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/nat_crf_transformer.py @@ -0,0 +1,121 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from fairseq.models import register_model, register_model_architecture +from fairseq.models.nat import NATransformerModel, base_architecture +from fairseq.modules import DynamicCRF + + +@register_model("nacrf_transformer") +class NACRFTransformerModel(NATransformerModel): + def __init__(self, args, encoder, decoder): + super().__init__(args, encoder, decoder) + self.crf_layer = DynamicCRF( + num_embedding=len(self.tgt_dict), + low_rank=args.crf_lowrank_approx, + beam_size=args.crf_beam_approx, + ) + + @property + def allow_ensemble(self): + return False + + @staticmethod + def add_args(parser): + NATransformerModel.add_args(parser) + parser.add_argument( + "--crf-lowrank-approx", + type=int, + help="the dimension of low-rank approximation of transition", + ) + parser.add_argument( + "--crf-beam-approx", + type=int, + help="the beam size for apporixmating the normalizing factor", + ) + parser.add_argument( + "--word-ins-loss-factor", + type=float, + help="weights on NAT loss used to co-training with CRF loss.", + ) + + def forward( + self, src_tokens, src_lengths, prev_output_tokens, tgt_tokens, **kwargs + ): + # encoding + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + + # length prediction + length_out = self.decoder.forward_length( + normalize=False, encoder_out=encoder_out + ) + length_tgt = self.decoder.forward_length_prediction( + length_out, encoder_out, tgt_tokens + ) + + # decoding + word_ins_out = self.decoder( + normalize=False, + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + ) + word_ins_tgt, word_ins_mask = tgt_tokens, tgt_tokens.ne(self.pad) + + # compute the log-likelihood of CRF + crf_nll = -self.crf_layer(word_ins_out, word_ins_tgt, word_ins_mask) + crf_nll = (crf_nll / word_ins_mask.type_as(crf_nll).sum(-1)).mean() + + return { + "word_ins": { + "out": word_ins_out, + "tgt": word_ins_tgt, + "mask": word_ins_mask, + "ls": self.args.label_smoothing, + "nll_loss": True, + "factor": self.args.word_ins_loss_factor, + }, + "word_crf": {"loss": crf_nll}, + "length": { + "out": length_out, + "tgt": length_tgt, + "factor": self.decoder.length_loss_factor, + }, + } + + def forward_decoder(self, decoder_out, encoder_out, decoding_format=None, **kwargs): + output_tokens = decoder_out.output_tokens + output_scores = decoder_out.output_scores + history = decoder_out.history + + # execute the decoder and get emission scores + output_masks = output_tokens.ne(self.pad) + word_ins_out = self.decoder( + normalize=False, prev_output_tokens=output_tokens, encoder_out=encoder_out + ) + + # run viterbi decoding through CRF + _scores, _tokens = self.crf_layer.forward_decoder(word_ins_out, output_masks) + output_tokens.masked_scatter_(output_masks, _tokens[output_masks]) + output_scores.masked_scatter_(output_masks, _scores[output_masks]) + if history is not None: + history.append(output_tokens.clone()) + + return decoder_out._replace( + output_tokens=output_tokens, + output_scores=output_scores, + attn=None, + history=history, + ) + + +@register_model_architecture("nacrf_transformer", "nacrf_transformer") +def nacrf_base_architecture(args): + args.crf_lowrank_approx = getattr(args, "crf_lowrank_approx", 32) + args.crf_beam_approx = getattr(args, "crf_beam_approx", 64) + args.word_ins_loss_factor = getattr(args, "word_ins_loss_factor", 0.5) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", True) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", True) + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_ensembles.py b/SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_ensembles.py new file mode 100644 index 0000000..705a04f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_ensembles.py @@ -0,0 +1,253 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.nn.functional as F +from fairseq.models.nat import ( + _apply_del_words, + _apply_ins_masks, + _apply_ins_words, + _fill, + _skip, + _skip_encoder_out, +) + + +class _EnsembleModelEncoder(object): + def __init__(self, models): + self.models = models + + def reorder_encoder_out(self, encoder_outs, new_order): + encoder_outs = [ + model.encoder.reorder_encoder_out(encoder_out, new_order) + for model, encoder_out in zip(self.models, encoder_outs) + ] + return encoder_outs + + +class BasicEnsembleModel(torch.nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models = torch.nn.ModuleList(models) + self.bos = self.models[0].decoder.dictionary.bos() + self.eos = self.models[0].decoder.dictionary.eos() + self.pad = self.models[0].decoder.dictionary.pad() + self.unk = self.models[0].decoder.dictionary.unk() + self.encoder = _EnsembleModelEncoder(self.models) + + def has_encoder(self): + return hasattr(self.models[0], "encoder") + + def max_decoder_positions(self): + return min(m.max_decoder_positions() for m in self.models) + + @torch.no_grad() + def forward_encoder(self, encoder_input): + if not self.has_encoder(): + return None + return [model.forward_encoder(encoder_input) for model in self.models] + + @torch.no_grad() + def forward_decoder(self, *inputs): + raise NotImplementedError + + def initialize_output_tokens(self, *inputs): + raise NotImplementedError + + +class EnsembleLevT(BasicEnsembleModel): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__(models) + + @torch.no_grad() + def forward_decoder( + self, decoder_out, encoder_outs, eos_penalty=0.0, max_ratio=None, **kwargs + ): + # LevT ensembling + # A pipeline of three steps: deletion, placeholder, and word insertion. + # We need to average scores in each step in a pipeline way because of dependence. + # deletion + output_tokens = decoder_out.output_tokens + output_scores = decoder_out.output_scores + attn = decoder_out.attn + + bsz = output_tokens.size(0) + if max_ratio is None: + max_lens = output_tokens.new().fill_(255) + else: + if not encoder_outs[0]["encoder_padding_mask"]: + src_lens = ( + encoder_outs[0]["encoder_out"][0].new(bsz) + .fill_(encoder_outs[0]["encoder_out"][0].size(1)) + ) + else: + src_lens = (~encoder_outs[0]["encoder_padding_mask"][0]).sum(1) + max_lens = (src_lens * max_ratio).clamp(min=10).long() + + # delete words + # do not delete tokens if it is <s> </s> + can_del_word = output_tokens.ne(self.pad).sum(1) > 2 + if can_del_word.sum() != 0: # we cannot delete, skip + output_tokens, output_scores, attn = self.forward_word_del( + encoder_outs, + output_tokens, + output_scores, + attn, + can_del_word, + ) + + # insert placeholders + can_ins_mask = output_tokens.ne(self.pad).sum(1) < max_lens + if can_ins_mask.sum() != 0: + output_tokens, output_scores = self.forward_mask_ins( + encoder_outs, + output_tokens, + output_scores, + can_ins_mask, + eos_penalty, + max_lens, + ) + + # insert words + can_ins_word = output_tokens.eq(self.unk).sum(1) > 0 + if can_ins_word.sum() != 0: + output_tokens, output_scores, attn = self.forward_word_ins( + encoder_outs, + output_tokens, + output_scores, + attn, + can_ins_word, + ) + + # delete some unnecessary paddings + cut_off = output_tokens.ne(self.pad).sum(1).max() + output_tokens = output_tokens[:, :cut_off] + output_scores = output_scores[:, :cut_off] + attn = None if attn is None else attn[:, :cut_off, :] + return decoder_out._replace( + output_tokens=output_tokens, + output_scores=output_scores, + attn=attn, + history=None, + ) + + def forward_word_del( + self, encoder_outs, output_tokens, output_scores, attn, can_del_word + ): + word_del_score_avg = [] + word_del_attn_avg = [] + for model, encoder_out in zip(self.models, encoder_outs): + word_del_out, word_del_attn = model.decoder.forward_word_del( + _skip(output_tokens, can_del_word), + _skip_encoder_out(model.encoder, encoder_out, can_del_word), + ) + word_del_score = F.log_softmax(word_del_out, 2) + word_del_score_avg.append(word_del_score) + word_del_attn_avg.append(word_del_attn) + word_del_score_avg = torch.logsumexp( + torch.stack(word_del_score_avg, dim=0), dim=0 + ) - math.log(len(self.models)) + word_del_pred = word_del_score_avg.max(-1)[1].bool() + if word_del_attn_avg[0] is not None: + word_del_attn_avg = torch.stack(word_del_attn_avg, dim=0) / len(self.models) + else: + word_del_attn_avg = None + + _tokens, _scores, _attn = _apply_del_words( + output_tokens[can_del_word], + output_scores[can_del_word], + word_del_attn_avg, + word_del_pred, + self.pad, + self.bos, + self.eos, + ) + output_tokens = _fill(output_tokens, can_del_word, _tokens, self.pad) + output_scores = _fill(output_scores, can_del_word, _scores, 0) + attn = _fill(attn, can_del_word, _attn, 0.0) + return output_tokens, output_scores, attn + + def forward_mask_ins( + self, + encoder_outs, + output_tokens, + output_scores, + can_ins_mask, + eos_penalty, + max_lens, + ): + mask_ins_score_avg = [] + for model, encoder_out in zip(self.models, encoder_outs): + mask_ins_out, _ = model.decoder.forward_mask_ins( + _skip(output_tokens, can_ins_mask), + _skip_encoder_out(model.encoder, encoder_out, can_ins_mask), + ) + mask_ins_score = F.log_softmax(mask_ins_out, 2) + if eos_penalty > 0.0: + mask_ins_score[:, :, 0] -= eos_penalty + mask_ins_score_avg.append(mask_ins_score) + mask_ins_score_avg = torch.logsumexp( + torch.stack(mask_ins_score_avg, dim=0), dim=0 + ) - math.log(len(self.models)) + mask_ins_pred = mask_ins_score_avg.max(-1)[1] + mask_ins_pred = torch.min( + mask_ins_pred, max_lens[can_ins_mask, None].expand_as(mask_ins_pred) + ) + _tokens, _scores = _apply_ins_masks( + output_tokens[can_ins_mask], + output_scores[can_ins_mask], + mask_ins_pred, + self.pad, + self.unk, + self.eos, + ) + output_tokens = _fill(output_tokens, can_ins_mask, _tokens, self.pad) + output_scores = _fill(output_scores, can_ins_mask, _scores, 0) + return output_tokens, output_scores + + def forward_word_ins( + self, encoder_outs, output_tokens, output_scores, attn, can_ins_word + ): + word_ins_score_avg = [] + word_ins_attn_avg = [] + for model, encoder_out in zip(self.models, encoder_outs): + word_ins_out, word_ins_attn = model.decoder.forward_word_ins( + _skip(output_tokens, can_ins_word), + _skip_encoder_out(model.encoder, encoder_out, can_ins_word), + ) + word_ins_score = F.log_softmax(word_ins_out, 2) + word_ins_score_avg.append(word_ins_score) + word_ins_attn_avg.append(word_ins_attn) + word_ins_score_avg = torch.logsumexp( + torch.stack(word_ins_score_avg, dim=0), dim=0 + ) - math.log(len(self.models)) + if word_ins_attn_avg[0] is not None: + word_ins_attn_avg = torch.stack(word_ins_attn_avg, dim=0) / len(self.models) + else: + word_ins_attn_avg = None + word_ins_score_max, word_ins_pred = word_ins_score_avg.max(-1) + + _tokens, _scores = _apply_ins_words( + output_tokens[can_ins_word], + output_scores[can_ins_word], + word_ins_pred, + word_ins_score_max, + self.unk, + ) + + output_tokens = _fill(output_tokens, can_ins_word, _tokens, self.pad) + output_scores = _fill(output_scores, can_ins_word, _scores, 0) + attn = _fill(attn, can_ins_word, word_ins_attn, 0.0) + return output_tokens, output_scores, attn + + def initialize_output_tokens(self, encoder_outs, src_tokens): + # LevT doesn't do length prediction. + return self.models[0].initialize_output_tokens(encoder_outs[0], src_tokens) diff --git a/SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_transformer.py b/SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_transformer.py new file mode 100644 index 0000000..d114202 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/nat/nonautoregressive_transformer.py @@ -0,0 +1,456 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.iterative_refinement_generator import DecoderOut +from fairseq.models import register_model, register_model_architecture +from fairseq.models.nat import FairseqNATDecoder, FairseqNATModel, ensemble_decoder +from fairseq.models.transformer import Embedding +from fairseq.modules.transformer_sentence_encoder import init_bert_params + + +def _mean_pooling(enc_feats, src_masks): + # enc_feats: T x B x C + # src_masks: B x T or None + if src_masks is None: + enc_feats = enc_feats.mean(0) + else: + src_masks = (~src_masks).transpose(0, 1).type_as(enc_feats) + enc_feats = ( + (enc_feats / src_masks.sum(0)[None, :, None]) * src_masks[:, :, None] + ).sum(0) + return enc_feats + + +def _argmax(x, dim): + return (x == x.max(dim, keepdim=True)[0]).type_as(x) + + +def _uniform_assignment(src_lens, trg_lens): + max_trg_len = trg_lens.max() + steps = (src_lens.float() - 1) / (trg_lens.float() - 1) # step-size + # max_trg_len + index_t = utils.new_arange(trg_lens, max_trg_len).float() + index_t = steps[:, None] * index_t[None, :] # batch_size X max_trg_len + index_t = torch.round(index_t).long().detach() + return index_t + + +@register_model("nonautoregressive_transformer") +class NATransformerModel(FairseqNATModel): + @property + def allow_length_beam(self): + return True + + @staticmethod + def add_args(parser): + FairseqNATModel.add_args(parser) + + # length prediction + parser.add_argument( + "--src-embedding-copy", + action="store_true", + help="copy encoder word embeddings as the initial input of the decoder", + ) + parser.add_argument( + "--pred-length-offset", + action="store_true", + help="predicting the length difference between the target and source sentences", + ) + parser.add_argument( + "--sg-length-pred", + action="store_true", + help="stop the gradients back-propagated from the length predictor", + ) + parser.add_argument( + "--length-loss-factor", + type=float, + help="weights on the length prediction loss", + ) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + decoder = NATransformerDecoder(args, tgt_dict, embed_tokens) + if getattr(args, "apply_bert_init", False): + decoder.apply(init_bert_params) + return decoder + + def forward( + self, src_tokens, src_lengths, prev_output_tokens, tgt_tokens, **kwargs + ): + # encoding + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + + # length prediction + length_out = self.decoder.forward_length( + normalize=False, encoder_out=encoder_out + ) + length_tgt = self.decoder.forward_length_prediction( + length_out, encoder_out, tgt_tokens + ) + + # decoding + word_ins_out = self.decoder( + normalize=False, + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + ) + + return { + "word_ins": { + "out": word_ins_out, + "tgt": tgt_tokens, + "mask": tgt_tokens.ne(self.pad), + "ls": self.args.label_smoothing, + "nll_loss": True, + }, + "length": { + "out": length_out, + "tgt": length_tgt, + "factor": self.decoder.length_loss_factor, + }, + } + + def forward_decoder(self, decoder_out, encoder_out, decoding_format=None, **kwargs): + step = decoder_out.step + output_tokens = decoder_out.output_tokens + output_scores = decoder_out.output_scores + history = decoder_out.history + + # execute the decoder + output_masks = output_tokens.ne(self.pad) + _scores, _tokens = self.decoder( + normalize=True, + prev_output_tokens=output_tokens, + encoder_out=encoder_out, + step=step, + ).max(-1) + + output_tokens.masked_scatter_(output_masks, _tokens[output_masks]) + output_scores.masked_scatter_(output_masks, _scores[output_masks]) + if history is not None: + history.append(output_tokens.clone()) + + return decoder_out._replace( + output_tokens=output_tokens, + output_scores=output_scores, + attn=None, + history=history, + ) + + def initialize_output_tokens(self, encoder_out, src_tokens): + # length prediction + length_tgt = self.decoder.forward_length_prediction( + self.decoder.forward_length(normalize=True, encoder_out=encoder_out), + encoder_out=encoder_out, + ) + + max_length = length_tgt.clamp_(min=2).max() + idx_length = utils.new_arange(src_tokens, max_length) + + initial_output_tokens = src_tokens.new_zeros( + src_tokens.size(0), max_length + ).fill_(self.pad) + initial_output_tokens.masked_fill_( + idx_length[None, :] < length_tgt[:, None], self.unk + ) + initial_output_tokens[:, 0] = self.bos + initial_output_tokens.scatter_(1, length_tgt[:, None] - 1, self.eos) + + initial_output_scores = initial_output_tokens.new_zeros( + *initial_output_tokens.size() + ).type_as(encoder_out["encoder_out"][0]) + + return DecoderOut( + output_tokens=initial_output_tokens, + output_scores=initial_output_scores, + attn=None, + step=0, + max_step=0, + history=None, + ) + + def regenerate_length_beam(self, decoder_out, beam_size): + output_tokens = decoder_out.output_tokens + length_tgt = output_tokens.ne(self.pad).sum(1) + length_tgt = ( + length_tgt[:, None] + + utils.new_arange(length_tgt, 1, beam_size) + - beam_size // 2 + ) + length_tgt = length_tgt.view(-1).clamp_(min=2) + max_length = length_tgt.max() + idx_length = utils.new_arange(length_tgt, max_length) + + initial_output_tokens = output_tokens.new_zeros( + length_tgt.size(0), max_length + ).fill_(self.pad) + initial_output_tokens.masked_fill_( + idx_length[None, :] < length_tgt[:, None], self.unk + ) + initial_output_tokens[:, 0] = self.bos + initial_output_tokens.scatter_(1, length_tgt[:, None] - 1, self.eos) + + initial_output_scores = initial_output_tokens.new_zeros( + *initial_output_tokens.size() + ).type_as(decoder_out.output_scores) + + return decoder_out._replace( + output_tokens=initial_output_tokens, output_scores=initial_output_scores + ) + + +class NATransformerDecoder(FairseqNATDecoder): + def __init__(self, args, dictionary, embed_tokens, no_encoder_attn=False): + super().__init__( + args, dictionary, embed_tokens, no_encoder_attn=no_encoder_attn + ) + self.dictionary = dictionary + self.bos = dictionary.bos() + self.unk = dictionary.unk() + self.eos = dictionary.eos() + + self.encoder_embed_dim = args.encoder_embed_dim + self.sg_length_pred = getattr(args, "sg_length_pred", False) + self.pred_length_offset = getattr(args, "pred_length_offset", False) + self.length_loss_factor = getattr(args, "length_loss_factor", 0.1) + self.src_embedding_copy = getattr(args, "src_embedding_copy", False) + self.embed_length = Embedding(256, self.encoder_embed_dim, None) + + @ensemble_decoder + def forward(self, normalize, encoder_out, prev_output_tokens, step=0, **unused): + features, _ = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + embedding_copy=(step == 0) & self.src_embedding_copy, + ) + decoder_out = self.output_layer(features) + return F.log_softmax(decoder_out, -1) if normalize else decoder_out + + @ensemble_decoder + def forward_length(self, normalize, encoder_out): + enc_feats = encoder_out["encoder_out"][0] # T x B x C + if len(encoder_out["encoder_padding_mask"]) > 0: + src_masks = encoder_out["encoder_padding_mask"][0] # B x T + else: + src_masks = None + enc_feats = _mean_pooling(enc_feats, src_masks) + if self.sg_length_pred: + enc_feats = enc_feats.detach() + length_out = F.linear(enc_feats, self.embed_length.weight) + return F.log_softmax(length_out, -1) if normalize else length_out + + def extract_features( + self, + prev_output_tokens, + encoder_out=None, + early_exit=None, + embedding_copy=False, + **unused + ): + """ + Similar to *forward* but only return features. + + Inputs: + prev_output_tokens: Tensor(B, T) + encoder_out: a dictionary of hidden states and masks + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + the LevenshteinTransformer decoder has full-attention to all generated tokens + """ + # embedding + if embedding_copy: + src_embd = encoder_out["encoder_embedding"][0] + if len(encoder_out["encoder_padding_mask"]) > 0: + src_mask = encoder_out["encoder_padding_mask"][0] + else: + src_mask = None + src_mask = ( + ~src_mask + if src_mask is not None + else prev_output_tokens.new_ones(*src_embd.size()[:2]).bool() + ) + + x, decoder_padding_mask = self.forward_embedding( + prev_output_tokens, + self.forward_copying_source( + src_embd, src_mask, prev_output_tokens.ne(self.padding_idx) + ), + ) + + else: + + x, decoder_padding_mask = self.forward_embedding(prev_output_tokens) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + attn = None + inner_states = [x] + + # decoder layers + for i, layer in enumerate(self.layers): + + # early exit from the decoder. + if (early_exit is not None) and (i >= early_exit): + break + + x, attn, _ = layer( + x, + encoder_out["encoder_out"][0] + if (encoder_out is not None and len(encoder_out["encoder_out"]) > 0) + else None, + encoder_out["encoder_padding_mask"][0] + if ( + encoder_out is not None + and len(encoder_out["encoder_padding_mask"]) > 0 + ) + else None, + self_attn_mask=None, + self_attn_padding_mask=decoder_padding_mask, + ) + inner_states.append(x) + + if self.layer_norm: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": attn, "inner_states": inner_states} + + def forward_embedding(self, prev_output_tokens, states=None): + # embed positions + positions = ( + self.embed_positions(prev_output_tokens) + if self.embed_positions is not None + else None + ) + + # embed tokens and positions + if states is None: + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + if self.project_in_dim is not None: + x = self.project_in_dim(x) + else: + x = states + + if positions is not None: + x += positions + x = self.dropout_module(x) + decoder_padding_mask = prev_output_tokens.eq(self.padding_idx) + return x, decoder_padding_mask + + def forward_copying_source(self, src_embeds, src_masks, tgt_masks): + length_sources = src_masks.sum(1) + length_targets = tgt_masks.sum(1) + mapped_inputs = _uniform_assignment(length_sources, length_targets).masked_fill( + ~tgt_masks, 0 + ) + copied_embedding = torch.gather( + src_embeds, + 1, + mapped_inputs.unsqueeze(-1).expand( + *mapped_inputs.size(), src_embeds.size(-1) + ), + ) + return copied_embedding + + def forward_length_prediction(self, length_out, encoder_out, tgt_tokens=None): + enc_feats = encoder_out["encoder_out"][0] # T x B x C + if len(encoder_out["encoder_padding_mask"]) > 0: + src_masks = encoder_out["encoder_padding_mask"][0] # B x T + else: + src_masks = None + if self.pred_length_offset: + if src_masks is None: + src_lengs = enc_feats.new_ones(enc_feats.size(1)).fill_( + enc_feats.size(0) + ) + else: + src_lengs = (~src_masks).transpose(0, 1).type_as(enc_feats).sum(0) + src_lengs = src_lengs.long() + + if tgt_tokens is not None: + # obtain the length target + tgt_lengs = tgt_tokens.ne(self.padding_idx).sum(1).long() + if self.pred_length_offset: + length_tgt = tgt_lengs - src_lengs + 128 + else: + length_tgt = tgt_lengs + length_tgt = length_tgt.clamp(min=0, max=255) + + else: + # predict the length target (greedy for now) + # TODO: implementing length-beam + pred_lengs = length_out.max(-1)[1] + if self.pred_length_offset: + length_tgt = pred_lengs - 128 + src_lengs + else: + length_tgt = pred_lengs + + return length_tgt + + +@register_model_architecture( + "nonautoregressive_transformer", "nonautoregressive_transformer" +) +def base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.apply_bert_init = getattr(args, "apply_bert_init", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + # --- special arguments --- + args.sg_length_pred = getattr(args, "sg_length_pred", False) + args.pred_length_offset = getattr(args, "pred_length_offset", False) + args.length_loss_factor = getattr(args, "length_loss_factor", 0.1) + args.src_embedding_copy = getattr(args, "src_embedding_copy", False) + + +@register_model_architecture( + "nonautoregressive_transformer", "nonautoregressive_transformer_wmt_en_de" +) +def nonautoregressive_transformer_wmt_en_de(args): + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/roberta/__init__.py b/SpeechT5/fairseq/fairseq/models/roberta/__init__.py new file mode 100644 index 0000000..4cd723a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .hub_interface import * # noqa +from .model import * # noqa +from .enc_dec import * # noqa +from .model_camembert import * # noqa +from .model_gottbert import * # noqa +from .model_xlmr import * # noqa diff --git a/SpeechT5/fairseq/fairseq/models/roberta/alignment_utils.py b/SpeechT5/fairseq/fairseq/models/roberta/alignment_utils.py new file mode 100644 index 0000000..ccc7f74 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/alignment_utils.py @@ -0,0 +1,118 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections import Counter +from typing import List + +import torch + + +def align_bpe_to_words(roberta, bpe_tokens: torch.LongTensor, other_tokens: List[str]): + """ + Helper to align GPT-2 BPE to other tokenization formats (e.g., spaCy). + + Args: + roberta (RobertaHubInterface): RoBERTa instance + bpe_tokens (torch.LongTensor): GPT-2 BPE tokens of shape `(T_bpe)` + other_tokens (List[str]): other tokens of shape `(T_words)` + + Returns: + List[str]: mapping from *other_tokens* to corresponding *bpe_tokens*. + """ + assert bpe_tokens.dim() == 1 + assert bpe_tokens[0] == 0 + + def clean(text): + return text.strip() + + # remove whitespaces to simplify alignment + bpe_tokens = [roberta.task.source_dictionary.string([x]) for x in bpe_tokens] + bpe_tokens = [ + clean(roberta.bpe.decode(x) if x not in {"<s>", ""} else x) for x in bpe_tokens + ] + other_tokens = [clean(str(o)) for o in other_tokens] + + # strip leading <s> + bpe_tokens = bpe_tokens[1:] + assert "".join(bpe_tokens) == "".join(other_tokens) + + # create alignment from every word to a list of BPE tokens + alignment = [] + bpe_toks = filter(lambda item: item[1] != "", enumerate(bpe_tokens, start=1)) + j, bpe_tok = next(bpe_toks) + for other_tok in other_tokens: + bpe_indices = [] + while True: + if other_tok.startswith(bpe_tok): + bpe_indices.append(j) + other_tok = other_tok[len(bpe_tok) :] + try: + j, bpe_tok = next(bpe_toks) + except StopIteration: + j, bpe_tok = None, None + elif bpe_tok.startswith(other_tok): + # other_tok spans multiple BPE tokens + bpe_indices.append(j) + bpe_tok = bpe_tok[len(other_tok) :] + other_tok = "" + else: + raise Exception('Cannot align "{}" and "{}"'.format(other_tok, bpe_tok)) + if other_tok == "": + break + assert len(bpe_indices) > 0 + alignment.append(bpe_indices) + assert len(alignment) == len(other_tokens) + + return alignment + + +def align_features_to_words(roberta, features, alignment): + """ + Align given features to words. + + Args: + roberta (RobertaHubInterface): RoBERTa instance + features (torch.Tensor): features to align of shape `(T_bpe x C)` + alignment: alignment between BPE tokens and words returned by + func:`align_bpe_to_words`. + """ + assert features.dim() == 2 + + bpe_counts = Counter(j for bpe_indices in alignment for j in bpe_indices) + assert bpe_counts[0] == 0 # <s> shouldn't be aligned + denom = features.new([bpe_counts.get(j, 1) for j in range(len(features))]) + weighted_features = features / denom.unsqueeze(-1) + + output = [weighted_features[0]] + largest_j = -1 + for bpe_indices in alignment: + output.append(weighted_features[bpe_indices].sum(dim=0)) + largest_j = max(largest_j, *bpe_indices) + for j in range(largest_j + 1, len(features)): + output.append(weighted_features[j]) + output = torch.stack(output) + assert torch.all(torch.abs(output.sum(dim=0) - features.sum(dim=0)) < 1e-4) + return output + + +def spacy_nlp(): + if getattr(spacy_nlp, "_nlp", None) is None: + try: + from spacy.lang.en import English + + spacy_nlp._nlp = English() + except ImportError: + raise ImportError("Please install spacy with: pip install spacy") + return spacy_nlp._nlp + + +def spacy_tokenizer(): + if getattr(spacy_tokenizer, "_tokenizer", None) is None: + try: + nlp = spacy_nlp() + spacy_tokenizer._tokenizer = nlp.Defaults.create_tokenizer(nlp) + except ImportError: + raise ImportError("Please install spacy with: pip install spacy") + return spacy_tokenizer._tokenizer diff --git a/SpeechT5/fairseq/fairseq/models/roberta/enc_dec.py b/SpeechT5/fairseq/fairseq/models/roberta/enc_dec.py new file mode 100644 index 0000000..e538dee --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/enc_dec.py @@ -0,0 +1,192 @@ +import argparse +import logging + +import torch.nn as nn +import fairseq.checkpoint_utils +from fairseq.models import ( + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) +from fairseq.models.transformer import TransformerDecoder +from fairseq.models.roberta import model as roberta + +logger = logging.getLogger(__name__) + + +@register_model("roberta_enc_dec") +class RobertaEncDecModel(FairseqEncoderDecoderModel): + @staticmethod + def add_args(parser): + parser.add_argument( + "--pretrained-mlm-checkpoint", + default=None, + type=str, + metavar="PRETRAINED", + help="path to pretrained mlm checkpoint", + ) + parser.add_argument( + "--pretrained-decoder", action="store_true", help="reload decoder" + ) + parser.add_argument( + "--hack-layernorm-embedding", + action="store_true", + help="hack to reload old models trained with encoder-normalize-before=False (no equivalent to encoder-normalize-before=False and layernorm_embedding=False", + ) + parser.add_argument( + "--share-decoder-input-output-embed", + action="store_true", + help="share decoder input and output embeddings", + ) + parser.add_argument( + "--share-all-embeddings", + action="store_true", + help="share encoder, decoder and output embeddings" + " (requires shared dictionary and embed dim)", + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present + base_enc_dec_architecture(args) + if args.pretrained_mlm_checkpoint: + arg_overrides = None + if args.hack_layernorm_embedding: + arg_overrides = {"layernorm_embedding": False} + loaded = fairseq.checkpoint_utils.load_model_ensemble_and_task( + [args.pretrained_mlm_checkpoint], arg_overrides=arg_overrides + ) + ([roberta_enc], _cfg, _task) = loaded + else: + # Do we need to edit untie_weights here ? + share_in_out = ( + args.share_decoder_input_output_embed or args.share_all_embeddings + ) + args.untie_weights_roberta = not share_in_out + if args.hack_layernorm_embedding: + args.layernorm_embedding = False + args.encoder_normalize_before = False + roberta_enc = roberta.RobertaModel.build_model(args, task) + + return cls.from_roberta(roberta_enc, args, task.source_dictionary) + + @staticmethod + def from_roberta(roberta_enc: roberta.RobertaModel, args, dictionary): + encoder = roberta_enc.encoder.sentence_encoder + vocab_size, embed_dim = encoder.embed_tokens.weight.shape + + if args.share_all_embeddings: + lm_head = roberta_enc.encoder.lm_head + assert encoder.embed_tokens.weight is lm_head.weight, ( + "Can't use --share-all-embeddings with a model " + "that was pretraiend with --untie-weights-roberta_enc" + ) + else: + lm_head = roberta.RobertaLMHead( + embed_dim, vocab_size, roberta_enc.args.activation_fn + ) + + dec_embs = nn.Embedding(vocab_size, embed_dim, dictionary.pad()) + if args.share_all_embeddings or args.share_decoder_input_output_embed: + # Note: I wasn't able to use Embedding _weight parameter to achive this sharing. + dec_embs.weight = lm_head.weight + + decoder = TransformerDecoder( + RobertaEncDecModel.read_args_from_roberta(roberta_enc.args), + dictionary, + dec_embs, + no_encoder_attn=False, + output_projection=lm_head, + ) + if getattr(args, "pretrained_decoder", False): + decoder_dict = encoder.state_dict() + + # TODO: hide setting "encoder_attn" layers behind a flag. + for k, w in list(decoder_dict.items()): + if ".self_attn" in k: + k_enc_attn = k.replace(".self_attn", ".encoder_attn") + decoder_dict[k_enc_attn] = w.detach().clone() + + for k, w in lm_head.state_dict().items(): + decoder_dict["output_projection." + k] = w + + missing_keys, unexpected_keys = decoder.load_state_dict( + decoder_dict, strict=False + ) + # missing_keys = [m for m in missing_keys if ".encoder_attn" not in m] + assert not missing_keys and not unexpected_keys, ( + "Failed to load state dict. " + f"Missing keys: {missing_keys}. " + f"Unexpected keys: {unexpected_keys}." + ) + + if args.share_all_embeddings: + assert decoder.output_projection.weight is decoder.embed_tokens.weight + assert encoder.embed_tokens.weight is decoder.embed_tokens.weight + elif args.share_decoder_input_output_embed: + assert decoder.output_projection.weight is decoder.embed_tokens.weight + assert encoder.embed_tokens.weight is not decoder.embed_tokens.weight + else: + assert decoder.output_projection.weight is not decoder.embed_tokens.weight + assert encoder.embed_tokens.weight is not decoder.embed_tokens.weight + + return RobertaEncDecModel(encoder, decoder) + + @staticmethod + def read_args_from_roberta(roberta_args: argparse.Namespace): + # TODO: this would become easier if encoder/decoder where using a similar + # TransformerConfig object + args = argparse.Namespace(**vars(roberta_args)) + attr_map = [ + ("encoder_attention_heads", "decoder_attention_heads"), + ("encoder_embed_dim", "decoder_embed_dim"), + ("encoder_embed_dim", "decoder_output_dim"), + ("encoder_normalize_before", "decoder_normalize_before"), + ("encoder_layers_to_keep", "decoder_layers_to_keep"), + ("encoder_ffn_embed_dim", "decoder_ffn_embed_dim"), + ("encoder_layerdrop", "decoder_layerdrop"), + ("encoder_layers", "decoder_layers"), + ("encoder_learned_pos", "decoder_learned_pos"), + # should this be set from here ? + ("max_positions", "max_target_positions"), + ] + for k1, k2 in attr_map: + setattr(args, k2, getattr(roberta_args, k1)) + + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = not roberta_args.untie_weights_roberta + return args + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + super().upgrade_state_dict_named(state_dict, name) + old_keys = list(state_dict.keys()) + + # rename decoder -> encoder before upgrading children modules + for k in old_keys: + if k.startswith(prefix + "encoder.lm_head"): + state_dict.pop(k) + continue + new_k = k + new_k = new_k.replace(".sentence_encoder.", ".") + new_k = new_k.replace("decoder.lm_head.", "decoder.output_projection.") + if k == new_k: + continue + # print(k, "->", new_k) + state_dict[new_k] = state_dict.pop(k) + + +@register_model_architecture("roberta_enc_dec", "roberta_enc_dec") +def base_enc_dec_architecture(args): + args.hack_layernorm_embedding = getattr(args, "hack_layernorm_embedding", False) + args.pretrained_mlm_checkpoint = getattr(args, "pretrained_mlm_checkpoint", None) + args.pretrained_decoder = getattr(args, "pretrained_decoder", None) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + + roberta.base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/roberta/hub_interface.py b/SpeechT5/fairseq/fairseq/models/roberta/hub_interface.py new file mode 100644 index 0000000..c9af434 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/hub_interface.py @@ -0,0 +1,235 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.data import encoders + + +class RobertaHubInterface(nn.Module): + """A simple PyTorch Hub interface to RoBERTa. + + Usage: https://github.com/pytorch/fairseq/tree/master/examples/roberta + """ + + def __init__(self, cfg, task, model): + super().__init__() + self.cfg = cfg + self.task = task + self.model = model + + self.bpe = encoders.build_bpe(cfg.bpe) + + # this is useful for determining the device + self.register_buffer("_float_tensor", torch.tensor([0], dtype=torch.float)) + + @property + def device(self): + return self._float_tensor.device + + def encode( + self, sentence: str, *addl_sentences, no_separator=False + ) -> torch.LongTensor: + """ + BPE-encode a sentence (or multiple sentences). + + Every sequence begins with a beginning-of-sentence (`<s>`) symbol. + Every sentence ends with an end-of-sentence (`</s>`) and we use an + extra end-of-sentence (`</s>`) as a separator. + + Example (single sentence): `<s> a b c </s>` + Example (sentence pair): `<s> d e f </s> </s> 1 2 3 </s>` + + The BPE encoding follows GPT-2. One subtle detail is that the GPT-2 BPE + requires leading spaces. For example:: + + >>> roberta.encode('Hello world').tolist() + [0, 31414, 232, 2] + >>> roberta.encode(' world').tolist() + [0, 232, 2] + >>> roberta.encode('world').tolist() + [0, 8331, 2] + """ + bpe_sentence = "<s> " + self.bpe.encode(sentence) + " </s>" + for s in addl_sentences: + bpe_sentence += " </s>" if not no_separator else "" + bpe_sentence += " " + self.bpe.encode(s) + " </s>" + tokens = self.task.source_dictionary.encode_line( + bpe_sentence, append_eos=False, add_if_not_exist=False + ) + return tokens.long() + + def decode(self, tokens: torch.LongTensor): + assert tokens.dim() == 1 + tokens = tokens.numpy() + if tokens[0] == self.task.source_dictionary.bos(): + tokens = tokens[1:] # remove <s> + eos_mask = tokens == self.task.source_dictionary.eos() + doc_mask = eos_mask[1:] & eos_mask[:-1] + sentences = np.split(tokens, doc_mask.nonzero()[0] + 1) + sentences = [ + self.bpe.decode(self.task.source_dictionary.string(s)) for s in sentences + ] + if len(sentences) == 1: + return sentences[0] + return sentences + + def extract_features( + self, tokens: torch.LongTensor, return_all_hiddens: bool = False + ) -> torch.Tensor: + if tokens.dim() == 1: + tokens = tokens.unsqueeze(0) + if tokens.size(-1) > self.model.max_positions(): + raise ValueError( + "tokens exceeds maximum length: {} > {}".format( + tokens.size(-1), self.model.max_positions() + ) + ) + features, extra = self.model( + tokens.to(device=self.device), + features_only=True, + return_all_hiddens=return_all_hiddens, + ) + if return_all_hiddens: + # convert from T x B x C -> B x T x C + inner_states = extra["inner_states"] + return [inner_state.transpose(0, 1) for inner_state in inner_states] + else: + return features # just the last layer's features + + def register_classification_head( + self, name: str, num_classes: int = None, embedding_size: int = None, **kwargs + ): + self.model.register_classification_head( + name, num_classes=num_classes, embedding_size=embedding_size, **kwargs + ) + + def predict(self, head: str, tokens: torch.LongTensor, return_logits: bool = False): + features = self.extract_features(tokens.to(device=self.device)) + logits = self.model.classification_heads[head](features) + if return_logits: + return logits + return F.log_softmax(logits, dim=-1) + + def extract_features_aligned_to_words( + self, sentence: str, return_all_hiddens: bool = False + ) -> torch.Tensor: + """Extract RoBERTa features, aligned to spaCy's word-level tokenizer.""" + from fairseq.models.roberta import alignment_utils + from spacy.tokens import Doc + + nlp = alignment_utils.spacy_nlp() + tokenizer = alignment_utils.spacy_tokenizer() + + # tokenize both with GPT-2 BPE and spaCy + bpe_toks = self.encode(sentence) + spacy_toks = tokenizer(sentence) + spacy_toks_ws = [t.text_with_ws for t in tokenizer(sentence)] + alignment = alignment_utils.align_bpe_to_words(self, bpe_toks, spacy_toks_ws) + + # extract features and align them + features = self.extract_features( + bpe_toks, return_all_hiddens=return_all_hiddens + ) + features = features.squeeze(0) + aligned_feats = alignment_utils.align_features_to_words( + self, features, alignment + ) + + # wrap in spaCy Doc + doc = Doc( + nlp.vocab, + words=["<s>"] + [x.text for x in spacy_toks] + ["</s>"], + spaces=[True] + + [x.endswith(" ") for x in spacy_toks_ws[:-1]] + + [True, False], + ) + assert len(doc) == aligned_feats.size(0) + doc.user_token_hooks["vector"] = lambda token: aligned_feats[token.i] + return doc + + def fill_mask(self, masked_input: str, topk: int = 5): + masked_token = "<mask>" + assert ( + masked_token in masked_input and masked_input.count(masked_token) == 1 + ), "Please add one {0} token for the input, eg: 'He is a {0} guy'".format( + masked_token + ) + + text_spans = masked_input.split(masked_token) + text_spans_bpe = ( + (" {0} ".format(masked_token)) + .join([self.bpe.encode(text_span.rstrip()) for text_span in text_spans]) + .strip() + ) + tokens = self.task.source_dictionary.encode_line( + "<s> " + text_spans_bpe + " </s>", + append_eos=False, + add_if_not_exist=False, + ) + + masked_index = (tokens == self.task.mask_idx).nonzero(as_tuple=False) + if tokens.dim() == 1: + tokens = tokens.unsqueeze(0) + + with utils.model_eval(self.model): + features, extra = self.model( + tokens.long().to(device=self.device), + features_only=False, + return_all_hiddens=False, + ) + logits = features[0, masked_index, :].squeeze() + prob = logits.softmax(dim=0) + values, index = prob.topk(k=topk, dim=0) + topk_predicted_token_bpe = self.task.source_dictionary.string(index) + + topk_filled_outputs = [] + for index, predicted_token_bpe in enumerate( + topk_predicted_token_bpe.split(" ") + ): + predicted_token = self.bpe.decode(predicted_token_bpe) + # Quick hack to fix https://github.com/pytorch/fairseq/issues/1306 + if predicted_token_bpe.startswith("\u2581"): + predicted_token = " " + predicted_token + if " {0}".format(masked_token) in masked_input: + topk_filled_outputs.append( + ( + masked_input.replace( + " {0}".format(masked_token), predicted_token + ), + values[index].item(), + predicted_token, + ) + ) + else: + topk_filled_outputs.append( + ( + masked_input.replace(masked_token, predicted_token), + values[index].item(), + predicted_token, + ) + ) + return topk_filled_outputs + + def disambiguate_pronoun(self, sentence: str) -> bool: + """ + Usage:: + + >>> disambiguate_pronoun('The _trophy_ would not fit in the brown suitcase because [it] was too big.') + True + + >>> disambiguate_pronoun('The trophy would not fit in the brown suitcase because [it] was too big.') + 'The trophy' + """ + assert hasattr( + self.task, "disambiguate_pronoun" + ), "roberta.disambiguate_pronoun() requires a model trained with the WSC task." + with utils.model_eval(self.model): + return self.task.disambiguate_pronoun( + self.model, sentence, use_cuda=self.device.type == "cuda" + ) diff --git a/SpeechT5/fairseq/fairseq/models/roberta/model.py b/SpeechT5/fairseq/fairseq/models/roberta/model.py new file mode 100644 index 0000000..d9d0f32 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/model.py @@ -0,0 +1,582 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +RoBERTa: A Robustly Optimized BERT Pretraining Approach. +""" + +import logging + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderModel, + register_model, + register_model_architecture, +) +from fairseq.models.transformer import DEFAULT_MIN_PARAMS_TO_WRAP, TransformerEncoder +from fairseq.modules import LayerNorm +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from fairseq.modules.transformer_sentence_encoder import init_bert_params + +from .hub_interface import RobertaHubInterface + + +logger = logging.getLogger(__name__) + + +@register_model("roberta") +class RobertaModel(FairseqEncoderModel): + @classmethod + def hub_models(cls): + return { + "roberta.base": "http://dl.fbaipublicfiles.com/fairseq/models/roberta.base.tar.gz", + "roberta.large": "http://dl.fbaipublicfiles.com/fairseq/models/roberta.large.tar.gz", + "roberta.large.mnli": "http://dl.fbaipublicfiles.com/fairseq/models/roberta.large.mnli.tar.gz", + "roberta.large.wsc": "http://dl.fbaipublicfiles.com/fairseq/models/roberta.large.wsc.tar.gz", + } + + def __init__(self, args, encoder): + super().__init__(encoder) + self.args = args + + # We follow BERT's random weight initialization + self.apply(init_bert_params) + + self.classification_heads = nn.ModuleDict() + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--encoder-layers", type=int, metavar="L", help="num encoder layers" + ) + parser.add_argument( + "--encoder-embed-dim", + type=int, + metavar="H", + help="encoder embedding dimension", + ) + parser.add_argument( + "--encoder-ffn-embed-dim", + type=int, + metavar="F", + help="encoder embedding dimension for FFN", + ) + parser.add_argument( + "--encoder-attention-heads", + type=int, + metavar="A", + help="num encoder attention heads", + ) + parser.add_argument( + "--activation-fn", + choices=utils.get_available_activation_fns(), + help="activation function to use", + ) + parser.add_argument( + "--pooler-activation-fn", + choices=utils.get_available_activation_fns(), + help="activation function to use for pooler layer", + ) + parser.add_argument( + "--encoder-normalize-before", + action="store_true", + help="apply layernorm before each encoder block", + ) + parser.add_argument( + "--layernorm-embedding", + action="store_true", + help="add layernorm to embedding", + ) + parser.add_argument( + "--dropout", type=float, metavar="D", help="dropout probability" + ) + parser.add_argument( + "--attention-dropout", + type=float, + metavar="D", + help="dropout probability for attention weights", + ) + parser.add_argument( + "--activation-dropout", + type=float, + metavar="D", + help="dropout probability after activation in FFN", + ) + parser.add_argument( + "--pooler-dropout", + type=float, + metavar="D", + help="dropout probability in the masked_lm pooler layers", + ) + parser.add_argument( + "--max-positions", type=int, help="number of positional embeddings to learn" + ) + parser.add_argument( + "--load-checkpoint-heads", + action="store_true", + help="(re-)register and load heads when loading checkpoints", + ) + parser.add_argument( + "--untie-weights-roberta", + action="store_true", + help="Untie weights between embeddings and classifiers in RoBERTa", + ) + # args for "Reducing Transformer Depth on Demand with Structured Dropout" (Fan et al., 2019) + parser.add_argument( + "--encoder-layerdrop", + type=float, + metavar="D", + default=0, + help="LayerDrop probability for encoder", + ) + parser.add_argument( + "--encoder-layers-to-keep", + default=None, + help="which layers to *keep* when pruning as a comma-separated list", + ) + # args for Training with Quantization Noise for Extreme Model Compression ({Fan*, Stock*} et al., 2020) + parser.add_argument( + "--quant-noise-pq", + type=float, + metavar="D", + default=0, + help="iterative PQ quantization noise at training time", + ) + parser.add_argument( + "--quant-noise-pq-block-size", + type=int, + metavar="D", + default=8, + help="block size of quantization noise at training time", + ) + parser.add_argument( + "--quant-noise-scalar", + type=float, + metavar="D", + default=0, + help="scalar quantization noise and scalar quantization at training time", + ) + # args for "Better Fine-Tuning by Reducing Representational Collapse" (Aghajanyan et al. 2020) + parser.add_argument( + "--spectral-norm-classification-head", + action="store_true", + default=False, + help="Apply spectral normalization on the classification head", + ) + # args for Fully Sharded Data Parallel (FSDP) training + parser.add_argument( + "--min-params-to-wrap", + type=int, + metavar="D", + default=DEFAULT_MIN_PARAMS_TO_WRAP, + help=( + "minimum number of params for a layer to be wrapped with FSDP() when " + "training with --ddp-backend=fully_sharded. Smaller values will " + "improve memory efficiency, but may make torch.distributed " + "communication less efficient due to smaller input sizes. This option " + "is set to 0 (i.e., always wrap) when --checkpoint-activations or " + "--offload-activations are passed." + ) + ) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present + base_architecture(args) + + if not hasattr(args, "max_positions"): + args.max_positions = args.tokens_per_sample + + encoder = RobertaEncoder(args, task.source_dictionary) + return cls(args, encoder) + + def forward( + self, + src_tokens, + features_only=False, + return_all_hiddens=False, + classification_head_name=None, + **kwargs, + ): + if classification_head_name is not None: + features_only = True + + x, extra = self.encoder(src_tokens, features_only, return_all_hiddens, **kwargs) + + if classification_head_name is not None: + x = self.classification_heads[classification_head_name](x) + return x, extra + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + logits = net_output[0].float() + if log_probs: + return F.log_softmax(logits, dim=-1) + else: + return F.softmax(logits, dim=-1) + + def register_classification_head( + self, name, num_classes=None, inner_dim=None, **kwargs + ): + """Register a classification head.""" + if name in self.classification_heads: + prev_num_classes = self.classification_heads[name].out_proj.out_features + prev_inner_dim = self.classification_heads[name].dense.out_features + if num_classes != prev_num_classes or inner_dim != prev_inner_dim: + logger.warning( + 're-registering head "{}" with num_classes {} (prev: {}) ' + "and inner_dim {} (prev: {})".format( + name, num_classes, prev_num_classes, inner_dim, prev_inner_dim + ) + ) + self.classification_heads[name] = RobertaClassificationHead( + input_dim=self.args.encoder_embed_dim, + inner_dim=inner_dim or self.args.encoder_embed_dim, + num_classes=num_classes, + activation_fn=self.args.pooler_activation_fn, + pooler_dropout=self.args.pooler_dropout, + q_noise=self.args.quant_noise_pq, + qn_block_size=self.args.quant_noise_pq_block_size, + do_spectral_norm=self.args.spectral_norm_classification_head, + ) + + @property + def supported_targets(self): + return {"self"} + + @classmethod + def from_pretrained( + cls, + model_name_or_path, + checkpoint_file="model.pt", + data_name_or_path=".", + bpe="gpt2", + **kwargs, + ): + from fairseq import hub_utils + + x = hub_utils.from_pretrained( + model_name_or_path, + checkpoint_file, + data_name_or_path, + archive_map=cls.hub_models(), + bpe=bpe, + load_checkpoint_heads=True, + **kwargs, + ) + + logger.info(x["args"]) + return RobertaHubInterface(x["args"], x["task"], x["models"][0]) + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + + # rename decoder -> encoder before upgrading children modules + for k in list(state_dict.keys()): + if k.startswith(prefix + "decoder"): + new_k = prefix + "encoder" + k[len(prefix + "decoder") :] + state_dict[new_k] = state_dict[k] + del state_dict[k] + + # rename emb_layer_norm -> layernorm_embedding + for k in list(state_dict.keys()): + if ".emb_layer_norm." in k: + new_k = k.replace(".emb_layer_norm.", ".layernorm_embedding.") + state_dict[new_k] = state_dict[k] + del state_dict[k] + + # upgrade children modules + super().upgrade_state_dict_named(state_dict, name) + + # Handle new classification heads present in the state dict. + current_head_names = ( + [] + if not hasattr(self, "classification_heads") + else self.classification_heads.keys() + ) + keys_to_delete = [] + for k in state_dict.keys(): + if not k.startswith(prefix + "classification_heads."): + continue + + head_name = k[len(prefix + "classification_heads.") :].split(".")[0] + num_classes = state_dict[ + prefix + "classification_heads." + head_name + ".out_proj.weight" + ].size(0) + inner_dim = state_dict[ + prefix + "classification_heads." + head_name + ".dense.weight" + ].size(0) + + if getattr(self.args, "load_checkpoint_heads", False): + if head_name not in current_head_names: + self.register_classification_head(head_name, num_classes, inner_dim) + else: + if head_name not in current_head_names: + logger.warning( + "deleting classification head ({}) from checkpoint " + "not present in current model: {}".format(head_name, k) + ) + keys_to_delete.append(k) + elif ( + num_classes + != self.classification_heads[head_name].out_proj.out_features + or inner_dim + != self.classification_heads[head_name].dense.out_features + ): + logger.warning( + "deleting classification head ({}) from checkpoint " + "with different dimensions than current model: {}".format( + head_name, k + ) + ) + keys_to_delete.append(k) + for k in keys_to_delete: + del state_dict[k] + + # Copy any newly-added classification heads into the state dict + # with their current weights. + if hasattr(self, "classification_heads"): + cur_state = self.classification_heads.state_dict() + for k, v in cur_state.items(): + if prefix + "classification_heads." + k not in state_dict: + logger.info("Overwriting " + prefix + "classification_heads." + k) + state_dict[prefix + "classification_heads." + k] = v + + +class RobertaLMHead(nn.Module): + """Head for masked language modeling.""" + + def __init__(self, embed_dim, output_dim, activation_fn, weight=None): + super().__init__() + self.dense = nn.Linear(embed_dim, embed_dim) + self.activation_fn = utils.get_activation_fn(activation_fn) + self.layer_norm = LayerNorm(embed_dim) + + if weight is None: + weight = nn.Linear(embed_dim, output_dim, bias=False).weight + self.weight = weight + self.bias = nn.Parameter(torch.zeros(output_dim)) + + def forward(self, features, masked_tokens=None, **kwargs): + # Only project the masked tokens while training, + # saves both memory and computation + if masked_tokens is not None: + features = features[masked_tokens, :] + + x = self.dense(features) + x = self.activation_fn(x) + x = self.layer_norm(x) + # project back to size of vocabulary with bias + x = F.linear(x, self.weight) + self.bias + return x + + +class RobertaClassificationHead(nn.Module): + """Head for sentence-level classification tasks.""" + + def __init__( + self, + input_dim, + inner_dim, + num_classes, + activation_fn, + pooler_dropout, + q_noise=0, + qn_block_size=8, + do_spectral_norm=False, + ): + super().__init__() + self.dense = nn.Linear(input_dim, inner_dim) + self.activation_fn = utils.get_activation_fn(activation_fn) + self.dropout = nn.Dropout(p=pooler_dropout) + self.out_proj = apply_quant_noise_( + nn.Linear(inner_dim, num_classes), q_noise, qn_block_size + ) + if do_spectral_norm: + if q_noise != 0: + raise NotImplementedError( + "Attempting to use Spectral Normalization with Quant Noise. This is not officially supported" + ) + self.out_proj = torch.nn.utils.spectral_norm(self.out_proj) + + def forward(self, features, **kwargs): + x = features[:, 0, :] # take <s> token (equiv. to [CLS]) + x = self.dropout(x) + x = self.dense(x) + x = self.activation_fn(x) + x = self.dropout(x) + x = self.out_proj(x) + return x + + +class RobertaEncoder(FairseqEncoder): + """RoBERTa encoder.""" + + def __init__(self, args, dictionary): + super().__init__(dictionary) + + # set any missing default values + base_architecture(args) + self.args = args + + if args.encoder_layers_to_keep: + args.encoder_layers = len(args.encoder_layers_to_keep.split(",")) + + embed_tokens = self.build_embedding( + len(dictionary), args.encoder_embed_dim, dictionary.pad() + ) + + self.sentence_encoder = self.build_encoder(args, dictionary, embed_tokens) + + self.lm_head = self.build_lm_head( + embed_dim=args.encoder_embed_dim, + output_dim=len(dictionary), + activation_fn=args.activation_fn, + weight=( + self.sentence_encoder.embed_tokens.weight + if not args.untie_weights_roberta + else None + ), + ) + + def build_embedding(self, vocab_size, embedding_dim, padding_idx): + return nn.Embedding(vocab_size, embedding_dim, padding_idx) + + def build_encoder(self, args, dictionary, embed_tokens): + encoder = TransformerEncoder(args, dictionary, embed_tokens) + encoder.apply(init_bert_params) + return encoder + + def build_lm_head(self, embed_dim, output_dim, activation_fn, weight): + return RobertaLMHead(embed_dim, output_dim, activation_fn, weight) + + def forward( + self, + src_tokens, + features_only=False, + return_all_hiddens=False, + masked_tokens=None, + **unused, + ): + """ + Args: + src_tokens (LongTensor): input tokens of shape `(batch, src_len)` + features_only (bool, optional): skip LM head and just return + features. If True, the output will be of shape + `(batch, src_len, embed_dim)`. + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + + Returns: + tuple: + - the LM output of shape `(batch, src_len, vocab)` + - a dictionary of additional data, where 'inner_states' + is a list of hidden states. Note that the hidden + states have shape `(src_len, batch, vocab)`. + """ + x, extra = self.extract_features( + src_tokens, return_all_hiddens=return_all_hiddens + ) + if not features_only: + x = self.output_layer(x, masked_tokens=masked_tokens) + return x, extra + + def extract_features(self, src_tokens, return_all_hiddens=False, **kwargs): + encoder_out = self.sentence_encoder( + src_tokens, + return_all_hiddens=return_all_hiddens, + token_embeddings=kwargs.get("token_embeddings", None), + ) + # T x B x C -> B x T x C + features = encoder_out["encoder_out"][0].transpose(0, 1) + inner_states = encoder_out["encoder_states"] if return_all_hiddens else None + return features, {"inner_states": inner_states} + + def output_layer(self, features, masked_tokens=None, **unused): + return self.lm_head(features, masked_tokens) + + def max_positions(self): + """Maximum output length supported by the encoder.""" + return self.args.max_positions + + +@register_model_architecture("roberta", "roberta") +def base_architecture(args): + args.encoder_layers = getattr(args, "encoder_layers", 12) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 768) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 3072) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 12) + + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.pooler_dropout = getattr(args, "pooler_dropout", 0.0) + + args.max_source_positions = getattr(args, "max_positions", 512) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + + # BERT has a few structural differences compared to the original Transformer + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", True) + args.layernorm_embedding = getattr(args, "layernorm_embedding", True) + args.no_scale_embedding = getattr(args, "no_scale_embedding", True) + args.activation_fn = getattr(args, "activation_fn", "gelu") + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.pooler_activation_fn = getattr(args, "pooler_activation_fn", "tanh") + args.untie_weights_roberta = getattr(args, "untie_weights_roberta", False) + + # Adaptive input config + args.adaptive_input = getattr(args, "adaptive_input", False) + + # LayerDrop config + args.encoder_layerdrop = getattr(args, "encoder_layerdrop", 0.0) + args.encoder_layers_to_keep = getattr(args, "encoder_layers_to_keep", None) + + # Quantization noise config + args.quant_noise_pq = getattr(args, "quant_noise_pq", 0) + args.quant_noise_pq_block_size = getattr(args, "quant_noise_pq_block_size", 8) + args.quant_noise_scalar = getattr(args, "quant_noise_scalar", 0) + + # R4F config + args.spectral_norm_classification_head = getattr( + args, "spectral_norm_classification_head", False + ) + + +@register_model_architecture("roberta", "roberta_prenorm") +def roberta_prenorm_architecture(args): + args.layernorm_embedding = getattr(args, "layernorm_embedding", False) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", True) + base_architecture(args) + + +@register_model_architecture("roberta", "roberta_base") +def roberta_base_architecture(args): + base_architecture(args) + + +@register_model_architecture("roberta", "roberta_large") +def roberta_large_architecture(args): + args.encoder_layers = getattr(args, "encoder_layers", 24) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + base_architecture(args) + + +@register_model_architecture("roberta", "xlm") +def xlm_architecture(args): + args.encoder_layers = getattr(args, "encoder_layers", 16) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1280) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 1280 * 4) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/roberta/model_camembert.py b/SpeechT5/fairseq/fairseq/models/roberta/model_camembert.py new file mode 100644 index 0000000..4644754 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/model_camembert.py @@ -0,0 +1,50 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +CamemBERT: a Tasty French Language Model +""" + +from fairseq.models import register_model + +from .hub_interface import RobertaHubInterface +from .model import RobertaModel + + +@register_model("camembert") +class CamembertModel(RobertaModel): + @classmethod + def hub_models(cls): + return { + "camembert": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-base.tar.gz", + "camembert.v0": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-base.tar.gz", + "camembert-base": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-base.tar.gz", + "camembert-large": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-large.tar.gz", + "camembert-base-ccnet": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-base-ccnet.tar.gz", + "camembert-base-ccnet-4gb": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-base-ccnet-4gb.tar.gz", + "camembert-base-wikipedia-4gb": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-base-wikipedia-4gb.tar.gz", + "camembert-base-oscar-4gb": "http://dl.fbaipublicfiles.com/fairseq/models/camembert-base-oscar-4gb.tar.gz", + } + + @classmethod + def from_pretrained( + cls, + model_name_or_path, + checkpoint_file="model.pt", + data_name_or_path=".", + bpe="sentencepiece", + **kwargs + ): + from fairseq import hub_utils + + x = hub_utils.from_pretrained( + model_name_or_path, + checkpoint_file, + data_name_or_path, + archive_map=cls.hub_models(), + bpe=bpe, + load_checkpoint_heads=True, + **kwargs, + ) + return RobertaHubInterface(x["args"], x["task"], x["models"][0]) diff --git a/SpeechT5/fairseq/fairseq/models/roberta/model_gottbert.py b/SpeechT5/fairseq/fairseq/models/roberta/model_gottbert.py new file mode 100644 index 0000000..2e8c663 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/model_gottbert.py @@ -0,0 +1,49 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +GottBERT: a pure German Language Model +""" + +from fairseq.models import register_model + +from .hub_interface import RobertaHubInterface +from .model import RobertaModel + + +@register_model('gottbert') +class GottbertModel(RobertaModel): + + @classmethod + def hub_models(cls): + return { + 'gottbert-base': 'https://dl.gottbert.de/fairseq/models/gottbert-base.tar.gz', + } + + @classmethod + def from_pretrained(cls, + model_name_or_path, + checkpoint_file='model.pt', + data_name_or_path='.', + bpe='hf_byte_bpe', + bpe_vocab='vocab.json', + bpe_merges='merges.txt', + bpe_add_prefix_space=False, + **kwargs + ): + from fairseq import hub_utils + + x = hub_utils.from_pretrained( + model_name_or_path, + checkpoint_file, + data_name_or_path, + archive_map=cls.hub_models(), + bpe=bpe, + load_checkpoint_heads=True, + bpe_vocab=bpe_vocab, + bpe_merges=bpe_merges, + bpe_add_prefix_space=bpe_add_prefix_space, + **kwargs, + ) + return RobertaHubInterface(x['args'], x['task'], x['models'][0]) diff --git a/SpeechT5/fairseq/fairseq/models/roberta/model_xlmr.py b/SpeechT5/fairseq/fairseq/models/roberta/model_xlmr.py new file mode 100644 index 0000000..cf6e354 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/roberta/model_xlmr.py @@ -0,0 +1,46 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Unsupervised Cross-lingual Representation Learning at Scale +""" + +from fairseq.models import register_model + +from .hub_interface import RobertaHubInterface +from .model import RobertaModel + + +@register_model("xlmr") +class XLMRModel(RobertaModel): + @classmethod + def hub_models(cls): + return { + "xlmr.base": "http://dl.fbaipublicfiles.com/fairseq/models/xlmr.base.tar.gz", + "xlmr.large": "http://dl.fbaipublicfiles.com/fairseq/models/xlmr.large.tar.gz", + "xlmr.xl": "http://dl.fbaipublicfiles.com/fairseq/models/xlmr/xlmr.xl.tar.gz", + "xlmr.xxl": "http://dl.fbaipublicfiles.com/fairseq/models/xlmr/xlmr.xxl.tar.gz", + } + + @classmethod + def from_pretrained( + cls, + model_name_or_path, + checkpoint_file="model.pt", + data_name_or_path=".", + bpe="sentencepiece", + **kwargs + ): + from fairseq import hub_utils + + x = hub_utils.from_pretrained( + model_name_or_path, + checkpoint_file, + data_name_or_path, + archive_map=cls.hub_models(), + bpe=bpe, + load_checkpoint_heads=True, + **kwargs, + ) + return RobertaHubInterface(x["args"], x["task"], x["models"][0]) diff --git a/SpeechT5/fairseq/fairseq/models/speech_to_text/__init__.py b/SpeechT5/fairseq/fairseq/models/speech_to_text/__init__.py new file mode 100644 index 0000000..c6ae9b1 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/speech_to_text/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .berard import * # noqa +from .convtransformer import * # noqa +from .s2t_transformer import * # noqa diff --git a/SpeechT5/fairseq/fairseq/models/speech_to_text/berard.py b/SpeechT5/fairseq/fairseq/models/speech_to_text/berard.py new file mode 100644 index 0000000..c505e3a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/speech_to_text/berard.py @@ -0,0 +1,606 @@ +#!/usr/bin/env python3 + +from ast import literal_eval +from typing import List, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import checkpoint_utils, utils +from fairseq.data.data_utils import lengths_to_padding_mask +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, + register_model_architecture, +) + + +@register_model("s2t_berard") +class BerardModel(FairseqEncoderDecoderModel): + """Implementation of a model similar to https://arxiv.org/abs/1802.04200 + + Paper title: End-to-End Automatic Speech Translation of Audiobooks + An implementation is available in tensorflow at + https://github.com/eske/seq2seq + Relevant files in this implementation are the config + (https://github.com/eske/seq2seq/blob/master/config/LibriSpeech/AST.yaml) + and the model code + (https://github.com/eske/seq2seq/blob/master/translate/models.py). + The encoder and decoder try to be close to the original implementation. + The attention is an MLP as in Bahdanau et al. + (https://arxiv.org/abs/1409.0473). + There is no state initialization by averaging the encoder outputs. + """ + + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @staticmethod + def add_args(parser): + parser.add_argument( + "--input-layers", + type=str, + metavar="EXPR", + help="List of linear layer dimensions. These " + "layers are applied to the input features and " + "are followed by tanh and possibly dropout.", + ) + parser.add_argument( + "--dropout", + type=float, + metavar="D", + help="Dropout probability to use in the encoder/decoder. " + "Note that this parameters control dropout in various places, " + "there is no fine-grained control for dropout for embeddings " + "vs LSTM layers for example.", + ) + parser.add_argument( + "--in-channels", + type=int, + metavar="N", + help="Number of encoder input channels. " "Typically value is 1.", + ) + parser.add_argument( + "--conv-layers", + type=str, + metavar="EXPR", + help="List of conv layers " "(format: (channels, kernel, stride)).", + ) + parser.add_argument( + "--num-blstm-layers", + type=int, + metavar="N", + help="Number of encoder bi-LSTM layers.", + ) + parser.add_argument( + "--lstm-size", type=int, metavar="N", help="LSTM hidden size." + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="Embedding dimension of the decoder target tokens.", + ) + parser.add_argument( + "--decoder-hidden-dim", + type=int, + metavar="N", + help="Decoder LSTM hidden dimension.", + ) + parser.add_argument( + "--decoder-num-layers", + type=int, + metavar="N", + help="Number of decoder LSTM layers.", + ) + parser.add_argument( + "--attention-dim", + type=int, + metavar="N", + help="Hidden layer dimension in MLP attention.", + ) + parser.add_argument( + "--output-layer-dim", + type=int, + metavar="N", + help="Hidden layer dim for linear layer prior to output projection.", + ) + parser.add_argument( + "--load-pretrained-encoder-from", + type=str, + metavar="STR", + help="model to take encoder weights from (for initialization)", + ) + parser.add_argument( + "--load-pretrained-decoder-from", + type=str, + metavar="STR", + help="model to take decoder weights from (for initialization)", + ) + + @classmethod + def build_encoder(cls, args, task): + encoder = BerardEncoder( + input_layers=literal_eval(args.input_layers), + conv_layers=literal_eval(args.conv_layers), + in_channels=args.input_channels, + input_feat_per_channel=args.input_feat_per_channel, + num_blstm_layers=args.num_blstm_layers, + lstm_size=args.lstm_size, + dropout=args.dropout, + ) + if getattr(args, "load_pretrained_encoder_from", None): + encoder = checkpoint_utils.load_pretrained_component_from_model( + component=encoder, checkpoint=args.load_pretrained_encoder_from + ) + return encoder + + @classmethod + def build_decoder(cls, args, task): + decoder = LSTMDecoder( + dictionary=task.target_dictionary, + embed_dim=args.decoder_embed_dim, + num_layers=args.decoder_num_layers, + hidden_size=args.decoder_hidden_dim, + dropout=args.dropout, + encoder_output_dim=2 * args.lstm_size, # bidirectional + attention_dim=args.attention_dim, + output_layer_dim=args.output_layer_dim, + ) + if getattr(args, "load_pretrained_decoder_from", None): + decoder = checkpoint_utils.load_pretrained_component_from_model( + component=decoder, checkpoint=args.load_pretrained_decoder_from + ) + return decoder + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + encoder = cls.build_encoder(args, task) + decoder = cls.build_decoder(args, task) + + return cls(encoder, decoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + lprobs = super().get_normalized_probs(net_output, log_probs, sample) + # lprobs is a (B, T, D) tensor + lprobs.batch_first = True + return lprobs + + +class BerardEncoder(FairseqEncoder): + def __init__( + self, + input_layers: List[int], + conv_layers: List[Tuple[int]], + in_channels: int, + input_feat_per_channel: int, + num_blstm_layers: int, + lstm_size: int, + dropout: float, + ): + """ + Args: + input_layers: list of linear layer dimensions. These layers are + applied to the input features and are followed by tanh and + possibly dropout. + conv_layers: list of conv2d layer configurations. A configuration is + a tuple (out_channels, conv_kernel_size, stride). + in_channels: number of input channels. + input_feat_per_channel: number of input features per channel. These + are speech features, typically 40 or 80. + num_blstm_layers: number of bidirectional LSTM layers. + lstm_size: size of the LSTM hidden (and cell) size. + dropout: dropout probability. Dropout can be applied after the + linear layers and LSTM layers but not to the convolutional + layers. + """ + super().__init__(None) + + self.input_layers = nn.ModuleList() + in_features = input_feat_per_channel + for out_features in input_layers: + if dropout > 0: + self.input_layers.append( + nn.Sequential( + nn.Linear(in_features, out_features), nn.Dropout(p=dropout) + ) + ) + else: + self.input_layers.append(nn.Linear(in_features, out_features)) + in_features = out_features + + self.in_channels = in_channels + self.input_dim = input_feat_per_channel + self.conv_kernel_sizes_and_strides = [] + self.conv_layers = nn.ModuleList() + lstm_input_dim = input_layers[-1] + for conv_layer in conv_layers: + out_channels, conv_kernel_size, conv_stride = conv_layer + self.conv_layers.append( + nn.Conv2d( + in_channels, + out_channels, + conv_kernel_size, + stride=conv_stride, + padding=conv_kernel_size // 2, + ) + ) + self.conv_kernel_sizes_and_strides.append((conv_kernel_size, conv_stride)) + in_channels = out_channels + lstm_input_dim //= conv_stride + + lstm_input_dim *= conv_layers[-1][0] + self.lstm_size = lstm_size + self.num_blstm_layers = num_blstm_layers + self.lstm = nn.LSTM( + input_size=lstm_input_dim, + hidden_size=lstm_size, + num_layers=num_blstm_layers, + dropout=dropout, + bidirectional=True, + ) + self.output_dim = 2 * lstm_size # bidirectional + if dropout > 0: + self.dropout = nn.Dropout(p=dropout) + else: + self.dropout = None + + def forward(self, src_tokens, src_lengths=None, **kwargs): + """ + Args + src_tokens: padded tensor (B, T, C * feat) + src_lengths: tensor of original lengths of input utterances (B,) + """ + bsz, max_seq_len, _ = src_tokens.size() + # (B, C, T, feat) + x = ( + src_tokens.view(bsz, max_seq_len, self.in_channels, self.input_dim) + .transpose(1, 2) + .contiguous() + ) + + for input_layer in self.input_layers: + x = input_layer(x) + x = torch.tanh(x) + + for conv_layer in self.conv_layers: + x = conv_layer(x) + + bsz, _, output_seq_len, _ = x.size() + + # (B, C, T, feat) -> (B, T, C, feat) -> (T, B, C, feat) -> + # (T, B, C * feat) + x = x.transpose(1, 2).transpose(0, 1).contiguous().view(output_seq_len, bsz, -1) + + input_lengths = src_lengths.clone() + for k, s in self.conv_kernel_sizes_and_strides: + p = k // 2 + input_lengths = (input_lengths.float() + 2 * p - k) / s + 1 + input_lengths = input_lengths.floor().long() + + packed_x = nn.utils.rnn.pack_padded_sequence(x, input_lengths) + + h0 = x.new(2 * self.num_blstm_layers, bsz, self.lstm_size).zero_() + c0 = x.new(2 * self.num_blstm_layers, bsz, self.lstm_size).zero_() + packed_outs, _ = self.lstm(packed_x, (h0, c0)) + + # unpack outputs and apply dropout + x, output_lengths = nn.utils.rnn.pad_packed_sequence(packed_outs) + if self.dropout is not None: + x = self.dropout(x) + + encoder_padding_mask = ( + lengths_to_padding_mask(output_lengths).to(src_tokens.device).t() + ) + + return { + "encoder_out": x, # (T, B, C) + "encoder_padding_mask": encoder_padding_mask, # (T, B) + } + + def reorder_encoder_out(self, encoder_out, new_order): + encoder_out["encoder_out"] = encoder_out["encoder_out"].index_select( + 1, new_order + ) + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(1, new_order) + return encoder_out + + +class MLPAttention(nn.Module): + """The original attention from Badhanau et al. (2014) + + https://arxiv.org/abs/1409.0473, based on a Multi-Layer Perceptron. + The attention score between position i in the encoder and position j in the + decoder is: alpha_ij = V_a * tanh(W_ae * enc_i + W_ad * dec_j + b_a) + """ + + def __init__(self, decoder_hidden_state_dim, context_dim, attention_dim): + super().__init__() + + self.context_dim = context_dim + self.attention_dim = attention_dim + # W_ae and b_a + self.encoder_proj = nn.Linear(context_dim, self.attention_dim, bias=True) + # W_ad + self.decoder_proj = nn.Linear( + decoder_hidden_state_dim, self.attention_dim, bias=False + ) + # V_a + self.to_scores = nn.Linear(self.attention_dim, 1, bias=False) + + def forward(self, decoder_state, source_hids, encoder_padding_mask): + """The expected input dimensions are: + decoder_state: bsz x decoder_hidden_state_dim + source_hids: src_len x bsz x context_dim + encoder_padding_mask: src_len x bsz + """ + src_len, bsz, _ = source_hids.size() + # (src_len*bsz) x context_dim (to feed through linear) + flat_source_hids = source_hids.view(-1, self.context_dim) + # (src_len*bsz) x attention_dim + encoder_component = self.encoder_proj(flat_source_hids) + # src_len x bsz x attention_dim + encoder_component = encoder_component.view(src_len, bsz, self.attention_dim) + # 1 x bsz x attention_dim + decoder_component = self.decoder_proj(decoder_state).unsqueeze(0) + # Sum with broadcasting and apply the non linearity + # src_len x bsz x attention_dim + hidden_att = torch.tanh( + (decoder_component + encoder_component).view(-1, self.attention_dim) + ) + # Project onto the reals to get attentions scores (src_len x bsz) + attn_scores = self.to_scores(hidden_att).view(src_len, bsz) + + # Mask + softmax (src_len x bsz) + if encoder_padding_mask is not None: + attn_scores = ( + attn_scores.float() + .masked_fill_(encoder_padding_mask, float("-inf")) + .type_as(attn_scores) + ) # FP16 support: cast to float and back + # srclen x bsz + normalized_masked_attn_scores = F.softmax(attn_scores, dim=0) + + # Sum weighted sources (bsz x context_dim) + attn_weighted_context = ( + source_hids * normalized_masked_attn_scores.unsqueeze(2) + ).sum(dim=0) + + return attn_weighted_context, normalized_masked_attn_scores + + +class LSTMDecoder(FairseqIncrementalDecoder): + def __init__( + self, + dictionary, + embed_dim, + num_layers, + hidden_size, + dropout, + encoder_output_dim, + attention_dim, + output_layer_dim, + ): + """ + Args: + dictionary: target text dictionary. + embed_dim: embedding dimension for target tokens. + num_layers: number of LSTM layers. + hidden_size: hidden size for LSTM layers. + dropout: dropout probability. Dropout can be applied to the + embeddings, the LSTM layers, and the context vector. + encoder_output_dim: encoder output dimension (hidden size of + encoder LSTM). + attention_dim: attention dimension for MLP attention. + output_layer_dim: size of the linear layer prior to output + projection. + """ + super().__init__(dictionary) + self.num_layers = num_layers + self.hidden_size = hidden_size + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + self.embed_tokens = nn.Embedding(num_embeddings, embed_dim, padding_idx) + if dropout > 0: + self.dropout = nn.Dropout(p=dropout) + else: + self.dropout = None + + self.layers = nn.ModuleList() + for layer_id in range(num_layers): + input_size = embed_dim if layer_id == 0 else encoder_output_dim + self.layers.append( + nn.LSTMCell(input_size=input_size, hidden_size=hidden_size) + ) + + self.context_dim = encoder_output_dim + self.attention = MLPAttention( + decoder_hidden_state_dim=hidden_size, + context_dim=encoder_output_dim, + attention_dim=attention_dim, + ) + + self.deep_output_layer = nn.Linear( + hidden_size + encoder_output_dim + embed_dim, output_layer_dim + ) + self.output_projection = nn.Linear(output_layer_dim, num_embeddings) + + def forward( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **kwargs + ): + encoder_padding_mask = encoder_out["encoder_padding_mask"] + encoder_outs = encoder_out["encoder_out"] + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + bsz, seqlen = prev_output_tokens.size() + + srclen = encoder_outs.size(0) + + # embed tokens + embeddings = self.embed_tokens(prev_output_tokens) + x = embeddings + if self.dropout is not None: + x = self.dropout(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + # initialize previous states (or get from cache during incremental + # generation) + cached_state = utils.get_incremental_state( + self, incremental_state, "cached_state" + ) + if cached_state is not None: + prev_hiddens, prev_cells = cached_state + else: + prev_hiddens = [encoder_out["encoder_out"].mean(dim=0)] * self.num_layers + prev_cells = [x.new_zeros(bsz, self.hidden_size)] * self.num_layers + + attn_scores = x.new_zeros(bsz, srclen) + attention_outs = [] + outs = [] + for j in range(seqlen): + input = x[j, :, :] + attention_out = None + for i, layer in enumerate(self.layers): + # the previous state is one layer below except for the bottom + # layer where the previous state is the state emitted by the + # top layer + hidden, cell = layer( + input, + ( + prev_hiddens[(i - 1) % self.num_layers], + prev_cells[(i - 1) % self.num_layers], + ), + ) + if self.dropout is not None: + hidden = self.dropout(hidden) + prev_hiddens[i] = hidden + prev_cells[i] = cell + if attention_out is None: + attention_out, attn_scores = self.attention( + hidden, encoder_outs, encoder_padding_mask + ) + if self.dropout is not None: + attention_out = self.dropout(attention_out) + attention_outs.append(attention_out) + input = attention_out + + # collect the output of the top layer + outs.append(hidden) + + # cache previous states (no-op except during incremental generation) + utils.set_incremental_state( + self, incremental_state, "cached_state", (prev_hiddens, prev_cells) + ) + + # collect outputs across time steps + x = torch.cat(outs, dim=0).view(seqlen, bsz, self.hidden_size) + attention_outs_concat = torch.cat(attention_outs, dim=0).view( + seqlen, bsz, self.context_dim + ) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + attention_outs_concat = attention_outs_concat.transpose(0, 1) + + # concat LSTM output, attention output and embedding + # before output projection + x = torch.cat((x, attention_outs_concat, embeddings), dim=2) + x = self.deep_output_layer(x) + x = torch.tanh(x) + if self.dropout is not None: + x = self.dropout(x) + # project back to size of vocabulary + x = self.output_projection(x) + + # to return the full attn_scores tensor, we need to fix the decoder + # to account for subsampling input frames + # return x, attn_scores + return x, None + + def reorder_incremental_state(self, incremental_state, new_order): + super().reorder_incremental_state(incremental_state, new_order) + cached_state = utils.get_incremental_state( + self, incremental_state, "cached_state" + ) + if cached_state is None: + return + + def reorder_state(state): + if isinstance(state, list): + return [reorder_state(state_i) for state_i in state] + return state.index_select(0, new_order) + + new_state = tuple(map(reorder_state, cached_state)) + utils.set_incremental_state(self, incremental_state, "cached_state", new_state) + + +@register_model_architecture(model_name="s2t_berard", arch_name="s2t_berard") +def berard(args): + """The original version: "End-to-End Automatic Speech Translation of + Audiobooks" (https://arxiv.org/abs/1802.04200) + """ + args.input_layers = getattr(args, "input_layers", "[256, 128]") + args.conv_layers = getattr(args, "conv_layers", "[(16, 3, 2), (16, 3, 2)]") + args.num_blstm_layers = getattr(args, "num_blstm_layers", 3) + args.lstm_size = getattr(args, "lstm_size", 256) + args.dropout = getattr(args, "dropout", 0.2) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 128) + args.decoder_num_layers = getattr(args, "decoder_num_layers", 2) + args.decoder_hidden_dim = getattr(args, "decoder_hidden_dim", 512) + args.attention_dim = getattr(args, "attention_dim", 512) + args.output_layer_dim = getattr(args, "output_layer_dim", 128) + args.load_pretrained_encoder_from = getattr( + args, "load_pretrained_encoder_from", None + ) + args.load_pretrained_decoder_from = getattr( + args, "load_pretrained_decoder_from", None + ) + + +@register_model_architecture(model_name="s2t_berard", arch_name="s2t_berard_256_3_3") +def berard_256_3_3(args): + """Used in + * "Harnessing Indirect Training Data for End-to-End Automatic Speech + Translation: Tricks of the Trade" (https://arxiv.org/abs/1909.06515) + * "CoVoST: A Diverse Multilingual Speech-To-Text Translation Corpus" + (https://arxiv.org/pdf/2002.01320.pdf) + * "Self-Supervised Representations Improve End-to-End Speech Translation" + (https://arxiv.org/abs/2006.12124) + """ + args.decoder_num_layers = getattr(args, "decoder_num_layers", 3) + berard(args) + + +@register_model_architecture(model_name="s2t_berard", arch_name="s2t_berard_512_3_2") +def berard_512_3_2(args): + args.num_blstm_layers = getattr(args, "num_blstm_layers", 3) + args.lstm_size = getattr(args, "lstm_size", 512) + args.dropout = getattr(args, "dropout", 0.3) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 256) + args.decoder_num_layers = getattr(args, "decoder_num_layers", 2) + args.decoder_hidden_dim = getattr(args, "decoder_hidden_dim", 1024) + args.attention_dim = getattr(args, "attention_dim", 512) + args.output_layer_dim = getattr(args, "output_layer_dim", 256) + berard(args) + + +@register_model_architecture(model_name="s2t_berard", arch_name="s2t_berard_512_5_3") +def berard_512_5_3(args): + args.num_blstm_layers = getattr(args, "num_blstm_layers", 5) + args.lstm_size = getattr(args, "lstm_size", 512) + args.dropout = getattr(args, "dropout", 0.3) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 256) + args.decoder_num_layers = getattr(args, "decoder_num_layers", 3) + args.decoder_hidden_dim = getattr(args, "decoder_hidden_dim", 1024) + args.attention_dim = getattr(args, "attention_dim", 512) + args.output_layer_dim = getattr(args, "output_layer_dim", 256) + berard(args) diff --git a/SpeechT5/fairseq/fairseq/models/speech_to_text/convtransformer.py b/SpeechT5/fairseq/fairseq/models/speech_to_text/convtransformer.py new file mode 100644 index 0000000..eba000d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/speech_to_text/convtransformer.py @@ -0,0 +1,448 @@ +#!/usr/bin/env python3 + +import logging +import math +from typing import Dict, List, Optional, Tuple + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import checkpoint_utils, utils +from fairseq.data.data_utils import lengths_to_padding_mask +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) +from fairseq.models.transformer import Embedding, TransformerDecoder +from fairseq.modules import LayerNorm, PositionalEmbedding, TransformerEncoderLayer +from torch import Tensor + +logger = logging.getLogger(__name__) + + +@register_model("convtransformer") +class ConvTransformerModel(FairseqEncoderDecoderModel): + """ + Transformer-based Speech translation model from ESPNet-ST + https://arxiv.org/abs/2004.10234 + """ + + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + parser.add_argument( + "--input-feat-per-channel", + type=int, + metavar="N", + help="encoder input dimension per input channel", + ) + parser.add_argument( + "--activation-fn", + choices=utils.get_available_activation_fns(), + help="activation function to use", + ) + parser.add_argument( + "--dropout", type=float, metavar="D", help="dropout probability" + ) + parser.add_argument( + "--attention-dropout", + type=float, + metavar="D", + help="dropout probability for attention weights", + ) + parser.add_argument( + "--activation-dropout", + "--relu-dropout", + type=float, + metavar="D", + help="dropout probability after activation in FFN.", + ) + parser.add_argument( + "--encoder-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension", + ) + parser.add_argument( + "--encoder-ffn-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension for FFN", + ) + parser.add_argument( + "--encoder-layers", type=int, metavar="N", help="num encoder layers" + ) + parser.add_argument( + "--encoder-attention-heads", + type=int, + metavar="N", + help="num encoder attention heads", + ) + parser.add_argument( + "--encoder-normalize-before", + action="store_true", + help="apply layernorm before each encoder block", + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-ffn-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension for FFN", + ) + parser.add_argument( + "--decoder-layers", type=int, metavar="N", help="num decoder layers" + ) + parser.add_argument( + "--decoder-attention-heads", + type=int, + metavar="N", + help="num decoder attention heads", + ) + parser.add_argument( + "--decoder-normalize-before", + action="store_true", + help="apply layernorm before each decoder block", + ) + parser.add_argument( + "--decoder-output-dim", + type=int, + metavar="N", + help="decoder output dimension (extra linear layer if different from decoder embed dim)", + ) + parser.add_argument( + "--share-decoder-input-output-embed", + action="store_true", + help="share decoder input and output embeddings", + ) + parser.add_argument( + "--layernorm-embedding", + action="store_true", + help="add layernorm to embedding", + ) + parser.add_argument( + "--no-scale-embedding", + action="store_true", + help="if True, dont scale embeddings", + ) + parser.add_argument( + "--load-pretrained-encoder-from", + type=str, + metavar="STR", + help="model to take encoder weights from (for initialization)", + ) + parser.add_argument( + "--load-pretrained-decoder-from", + type=str, + metavar="STR", + help="model to take decoder weights from (for initialization)", + ) + parser.add_argument( + "--conv-out-channels", + type=int, + metavar="INT", + help="the number of output channels of conv layer", + ) + + @classmethod + def build_encoder(cls, args): + encoder = ConvTransformerEncoder(args) + if getattr(args, "load_pretrained_encoder_from", None): + encoder = checkpoint_utils.load_pretrained_component_from_model( + component=encoder, checkpoint=args.load_pretrained_encoder_from + ) + return encoder + + @classmethod + def build_decoder(cls, args, task, embed_tokens): + decoder = TransformerDecoderNoExtra(args, task.target_dictionary, embed_tokens) + if getattr(args, "load_pretrained_decoder_from", None): + decoder = checkpoint_utils.load_pretrained_component_from_model( + component=decoder, checkpoint=args.load_pretrained_decoder_from + ) + return decoder + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + def build_embedding(dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + decoder_embed_tokens = build_embedding( + task.target_dictionary, args.decoder_embed_dim + ) + encoder = cls.build_encoder(args) + decoder = cls.build_decoder(args, task, decoder_embed_tokens) + return cls(encoder, decoder) + + @staticmethod + @torch.jit.unused + def set_batch_first(lprobs): + lprobs.batch_first = True + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + # net_output['encoder_out'] is a (B, T, D) tensor + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + if self.training: + self.set_batch_first(lprobs) + return lprobs + + def output_layout(self): + return "BTD" + + """ + The forward method inherited from the base class has a **kwargs argument in + its input, which is not supported in torchscript. This method overrites the forward + method definition without **kwargs. + """ + + def forward(self, src_tokens, src_lengths, prev_output_tokens): + encoder_out = self.encoder(src_tokens=src_tokens, src_lengths=src_lengths) + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, encoder_out=encoder_out + ) + return decoder_out + + +class ConvTransformerEncoder(FairseqEncoder): + """Conv + Transformer encoder""" + + def __init__(self, args): + """Construct an Encoder object.""" + super().__init__(None) + + self.dropout = args.dropout + self.embed_scale = ( + 1.0 if args.no_scale_embedding else math.sqrt(args.encoder_embed_dim) + ) + self.padding_idx = 1 + self.in_channels = 1 + self.input_dim = args.input_feat_per_channel + self.conv = torch.nn.Sequential( + torch.nn.Conv2d(1, args.conv_out_channels, 3, stride=2, padding=3 // 2), + torch.nn.ReLU(), + torch.nn.Conv2d( + args.conv_out_channels, + args.conv_out_channels, + 3, + stride=2, + padding=3 // 2, + ), + torch.nn.ReLU(), + ) + transformer_input_dim = self.infer_conv_output_dim( + self.in_channels, self.input_dim, args.conv_out_channels + ) + self.out = torch.nn.Linear(transformer_input_dim, args.encoder_embed_dim) + self.embed_positions = PositionalEmbedding( + args.max_source_positions, + args.encoder_embed_dim, + self.padding_idx, + learned=False, + ) + + self.transformer_layers = nn.ModuleList([]) + self.transformer_layers.extend( + [TransformerEncoderLayer(args) for i in range(args.encoder_layers)] + ) + if args.encoder_normalize_before: + self.layer_norm = LayerNorm(args.encoder_embed_dim) + else: + self.layer_norm = None + + def pooling_ratio(self): + return 4 + + def infer_conv_output_dim(self, in_channels, input_dim, out_channels): + sample_seq_len = 200 + sample_bsz = 10 + x = torch.randn(sample_bsz, in_channels, sample_seq_len, input_dim) + x = torch.nn.Conv2d(1, out_channels, 3, stride=2, padding=3 // 2)(x) + x = torch.nn.Conv2d(out_channels, out_channels, 3, stride=2, padding=3 // 2)(x) + x = x.transpose(1, 2) + mb, seq = x.size()[:2] + return x.contiguous().view(mb, seq, -1).size(-1) + + def forward(self, src_tokens, src_lengths): + """Encode input sequence. + :param torch.Tensor xs: input tensor + :param torch.Tensor masks: input mask + :return: position embedded tensor and mask + :rtype Tuple[torch.Tensor, torch.Tensor]: + """ + bsz, max_seq_len, _ = src_tokens.size() + x = ( + src_tokens.view(bsz, max_seq_len, self.in_channels, self.input_dim) + .transpose(1, 2) + .contiguous() + ) + x = self.conv(x) + bsz, _, output_seq_len, _ = x.size() + x = x.transpose(1, 2).transpose(0, 1).contiguous().view(output_seq_len, bsz, -1) + x = self.out(x) + x = self.embed_scale * x + + subsampling_factor = int(max_seq_len * 1.0 / output_seq_len + 0.5) + input_len_0 = (src_lengths.float() / subsampling_factor).ceil().long() + input_len_1 = x.size(0) * torch.ones([src_lengths.size(0)]).long().to( + input_len_0.device + ) + input_lengths = torch.min(input_len_0, input_len_1) + + encoder_padding_mask = lengths_to_padding_mask(input_lengths) + + positions = self.embed_positions(encoder_padding_mask).transpose(0, 1) + x += positions + x = F.dropout(x, p=self.dropout, training=self.training) + + for layer in self.transformer_layers: + x = layer(x, encoder_padding_mask) + + if not encoder_padding_mask.any(): + maybe_encoder_padding_mask = None + else: + maybe_encoder_padding_mask = encoder_padding_mask + + return { + "encoder_out": [x], + "encoder_padding_mask": [maybe_encoder_padding_mask] + if maybe_encoder_padding_mask is not None + else [], + "encoder_embedding": [], + "encoder_states": [], + "src_tokens": [], + "src_lengths": [], + } + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_encoder_out = [encoder_out["encoder_out"][0].index_select(1, new_order)] + if len(encoder_out["encoder_padding_mask"]) == 0: + new_encoder_padding_mask = [] + else: + new_encoder_padding_mask = [ + (encoder_out["encoder_padding_mask"][0]).index_select(0, new_order) + ] + if len(encoder_out["encoder_embedding"]) == 0: + new_encoder_embedding = [] + else: + new_encoder_embedding = [ + (encoder_out["encoder_embedding"][0]).index_select(0, new_order) + ] + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, + "encoder_padding_mask": new_encoder_padding_mask, + "encoder_embedding": new_encoder_embedding, + "encoder_states": encoder_states, + "src_tokens": [], + "src_lengths": [], + } + + +class TransformerDecoderNoExtra(TransformerDecoder): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None + + +@register_model_architecture(model_name="convtransformer", arch_name="convtransformer") +def base_architecture(args): + args.input_feat_per_channel = getattr(args, "input_feat_per_channel", 80) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0.0) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + args.quant_noise_pq = getattr(args, "quant_noise_pq", 0) + args.max_source_positions = getattr(args, "max_source_positions", 3000) + args.max_target_positions = getattr(args, "max_target_positions", 1024) + args.tie_adaptive_weights = getattr(args, "tie_adaptive_weights", False) + args.conv_out_channels = getattr(args, "conv_out_channels", args.encoder_embed_dim) + + +@register_model_architecture("convtransformer", "convtransformer_espnet") +def convtransformer_espnet(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 256) + args.encoder_layers = getattr(args, "encoder_layers", 12) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4) diff --git a/SpeechT5/fairseq/fairseq/models/speech_to_text/modules/augmented_memory_attention.py b/SpeechT5/fairseq/fairseq/models/speech_to_text/modules/augmented_memory_attention.py new file mode 100644 index 0000000..e7465bc --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/speech_to_text/modules/augmented_memory_attention.py @@ -0,0 +1,488 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Tuple, List + +import torch +import torch.nn.functional as F +from fairseq.models import FairseqEncoder +from fairseq.models.speech_to_text import ( + ConvTransformerEncoder, +) +from fairseq.models.speech_to_text.utils import attention_suppression +from fairseq.models.speech_to_text.utils import ( + lengths_to_encoder_padding_mask, + segments_to_sequence, + sequence_to_segments, +) +from fairseq.modules import MultiheadAttention, TransformerEncoderLayer +from torch import nn, Tensor + +# ------------------------------------------------------------------------------ +# AugmentedMemoryConvTransformerEncoder +# ------------------------------------------------------------------------------ + + +class AugmentedMemoryConvTransformerEncoder(ConvTransformerEncoder): + def __init__(self, args): + super().__init__(args) + + args.encoder_stride = self.stride() + + self.left_context = args.left_context // args.encoder_stride + + self.right_context = args.right_context // args.encoder_stride + + self.left_context_after_stride = args.left_context // args.encoder_stride + self.right_context_after_stride = args.right_context // args.encoder_stride + + self.transformer_layers = nn.ModuleList([]) + self.transformer_layers.extend( + [ + AugmentedMemoryTransformerEncoderLayer(args) + for i in range(args.encoder_layers) + ] + ) + + def stride(self): + # Hard coded here. Should infer from convs in future + stride = 4 + return stride + + def forward(self, src_tokens, src_lengths, states=None): + """Encode input sequence. + :param torch.Tensor xs: input tensor + :param torch.Tensor masks: input mask + :return: position embedded tensor and mask + :rtype Tuple[torch.Tensor, torch.Tensor]: + """ + bsz, max_seq_len, _ = src_tokens.size() + x = ( + src_tokens.view(bsz, max_seq_len, self.in_channels, self.input_dim) + .transpose(1, 2) + .contiguous() + ) + x = self.conv(x) + bsz, _, output_seq_len, _ = x.size() + x = x.transpose(1, 2).transpose(0, 1).contiguous().view(output_seq_len, bsz, -1) + x = self.out(x) + x = self.embed_scale * x + + subsampling_factor = 1.0 * max_seq_len / output_seq_len + input_lengths = torch.max( + (src_lengths.float() / subsampling_factor).ceil().long(), + x.size(0) * src_lengths.new_ones([src_lengths.size(0)]).long(), + ) + + encoder_padding_mask, _ = lengths_to_encoder_padding_mask( + input_lengths, batch_first=True + ) + + # TODO: fix positional embedding + positions = self.embed_positions(encoder_padding_mask).transpose(0, 1) + + x += positions + x = F.dropout(x, p=self.dropout, training=self.training) + + # State to store memory banks etc. + if states is None: + states = [ + {"memory_banks": None, "encoder_states": None} + for i in range(len(self.transformer_layers)) + ] + + for i, layer in enumerate(self.transformer_layers): + # x size: + # (self.left_size + self.segment_size + self.right_size) + # / self.stride, num_heads, dim + # TODO: Consider mask here + x = layer(x, states[i]) + states[i]["encoder_states"] = x[ + self.left_context_after_stride : -self.right_context_after_stride + ] + + lengths = ( + ( + ~encoder_padding_mask[ + :, self.left_context_after_stride : -self.right_context_after_stride + ] + ) + .sum(dim=1, keepdim=True) + .long() + ) + + return states[-1]["encoder_states"], lengths, states + + +# ------------------------------------------------------------------------------ +# AugmentedMemoryTransformerEncoderLayer +# ------------------------------------------------------------------------------ +class AugmentedMemoryTransformerEncoderLayer(TransformerEncoderLayer): + def __init__(self, args): + super().__init__(args) + + self.left_context = args.left_context // args.encoder_stride + self.right_context = args.right_context // args.encoder_stride + + def forward(self, x, state): + + length, batch_size, x_dim = x.size() + + residual = x + + if self.normalize_before: + x = self.self_attn_layer_norm(x) + + # init_state + if state.get("memory_banks", None) is None: + state["memory_banks"] = [] + + # TODO reseach new sum_query method + seg_start = self.left_context + seg_end = length - self.right_context + if seg_start < seg_end: + summarization_query = torch.mean(x[seg_start:seg_end], keepdim=True, dim=0) + else: + summarization_query = x.new_zeros(1, batch_size, x_dim) + + x = torch.cat([x, summarization_query], dim=0) + + x = self.self_attn(input_and_summary=x, state=state) + + x = self.dropout_module(x) + x = residual + x + + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = residual + x + if not self.normalize_before: + x = self.final_layer_norm(x) + + return x + + def build_self_attention(self, embed_dim, args): + return AugmentedMemoryMultiheadAttention( + embed_dim=embed_dim, + num_heads=args.encoder_attention_heads, + dropout=args.attention_dropout, + self_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + tanh_on_mem=True, + max_memory_size=args.max_memory_size, + ) + + +# ------------------------------------------------------------------------------ +# AugmentedMemoryMultiheadAttention +# ------------------------------------------------------------------------------ +class AugmentedMemoryMultiheadAttention(MultiheadAttention): + """ + Augmented Memory Attention from + Streaming Transformer-based Acoustic Models + Using Self-attention with Augmented Memory + https://arxiv.org/abs/2005.08042 + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + tanh_on_mem=False, + memory_dim=None, + std_scale=0.5, # 0.5 based on https://arxiv.org/abs/2005.09137 + max_memory_size=-1, + disable_mem_on_mem_attn=True, + ): + super().__init__( + embed_dim, + num_heads, + kdim, + vdim, + dropout, + bias, + add_bias_kv, + add_zero_attn, + self_attention, + encoder_decoder_attention, + q_noise, + qn_block_size, + ) + + self.memory_dim = memory_dim if memory_dim is not None else embed_dim + self.std_scale = std_scale + self.disable_mem_on_mem_attn = disable_mem_on_mem_attn + + # This Operator was used for factorization in PySpeech + self.v2e = lambda x: x + + if tanh_on_mem: + self.squash_mem = torch.tanh + self.nonlinear_squash_mem = True + else: + self.squash_mem = lambda x: x + self.nonlinear_squash_mem = False + + self.max_memory_size = max_memory_size + + def forward(self, input_and_summary, state): + """ + input: Encoder states of current segment with left or right context, + plus one summarization query + + """ + + length, batch_size, _ = input_and_summary.shape + length = length - 1 # not include sum_query, last index + + memory = state["memory_banks"] + # TODO: positional embedding on memory + + if self.max_memory_size > -1 and len(memory) > self.max_memory_size: + # TODO: need to fix here + if self.max_memory_size == 0: + memory = memory.new_zeros(1, memory.size(1), self.memory_dim) + else: + memory = memory[-self.max_memory_size :] + + memory_and_input = torch.cat(memory + [input_and_summary[:-1]], dim=0) + input_and_sum_query = input_and_summary + + q = self.q_proj(self.v2e(input_and_sum_query)) + k = self.k_proj(self.v2e(memory_and_input)) + v = self.v_proj(self.v2e(memory_and_input)) + + q = ( + q.contiguous() + .view(-1, batch_size * self.num_heads, self.head_dim) + .transpose(0, 1) + * self.scaling + ) + k = ( + k.contiguous() + .view(-1, batch_size * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + v = ( + v.contiguous() + .view(-1, batch_size * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + attention_weights = torch.bmm(q, k.transpose(1, 2)) + + if self.disable_mem_on_mem_attn: + attention_weights = self.suppress_mem_on_mem_attention( + batch_size, self.num_heads, len(memory), attention_weights + ) + + if self.std_scale is not None: + attention_weights = attention_suppression(attention_weights, self.std_scale) + + assert list(attention_weights.shape) == [ + batch_size * self.num_heads, + length + 1, + length + len(memory), + ] + + attention_weights = torch.nn.functional.softmax( + attention_weights.float(), dim=-1 + ).type_as(attention_weights) + + attention_probs = self.dropout_module(attention_weights) + + # [T, T, B, n_head] + [T, B, n_head, d_head] -> [T, B, n_head, d_head] + attention = torch.bmm(attention_probs, v) + + assert list(attention.shape) == [ + batch_size * self.num_heads, + length + 1, + self.head_dim, + ] + + attention = ( + attention.transpose(0, 1) + .contiguous() + .view(length + 1, batch_size, self.embed_dim) + ) + + output_and_memory = self.out_proj(attention) + + next_m = output_and_memory[-1:] + next_m = self.squash_mem(next_m) + output = output_and_memory[:-1] + + state["memory_banks"].append(next_m) + + return output + + def suppress_mem_on_mem_attention( + self, B: int, num_heads: int, mem_size: int, attention_weight: Tensor + ): + """ + Arguments: + - B: batch size + - num_heads: number of attention heads + - mem_size: size of memory bank + - attention_weight: a [B*num_heads, T + 1, T + mem_size] vector + + Return: + modified attention_weight with [B*num_heads, -1, :mem_size] = -inf + """ + attention_weight[:, -1, :mem_size] = float("-inf") + return attention_weight + + +# ------------------------------------------------------------------------------ +# SequenceEncoder +# ------------------------------------------------------------------------------ +class SequenceEncoder(FairseqEncoder): + """ + SequenceEncoder encodes sequences. + + More specifically, `src_tokens` and `src_lengths` in `forward()` should + describe a batch of "complete" sequences rather than segments. + + Segment-by-segment inference can be triggered by `segment_size`: + 1) `segment_size` is None: + SequenceEncoder treats the input sequence as one single segment. + 2) `segment_size` is not None (some int instead): + SequenceEncoder does the following: + 1. breaks the input sequence into several segments + 2. inference on each segment and collect the outputs + 3. concatanete segment outputs into the output sequence. + Note that `segment_size` here shouldn't include additional left/right + contexts needed, for example if we wish to infer with LC-BLSTM where the + middle chunk size is 100 and right context is 20, `segment_size` should be + 100. + """ + + def __init__(self, args, module): + super().__init__(None) + + self.module = module + self.input_time_axis = 1 + self.output_time_axis = 0 + self.segment_size = args.segment_size + self.left_context = args.left_context + self.right_context = args.right_context + + def forward( + self, + src_tokens: Tensor, + src_lengths: Tensor, + states=None, + ): + + seg_src_tokens_lengths = sequence_to_segments( + sequence=src_tokens, + time_axis=self.input_time_axis, + lengths=src_lengths, + segment_size=self.segment_size, + extra_left_context=self.left_context, + extra_right_context=self.right_context, + ) + + seg_encoder_states_lengths: List[Tuple[Tensor, Tensor]] = [] + + for seg_src_tokens, seg_src_lengths in seg_src_tokens_lengths: + (seg_encoder_states, seg_enc_lengths, states) = self.module( + seg_src_tokens, + seg_src_lengths, + states=states, + ) + + seg_encoder_states_lengths.append((seg_encoder_states, seg_enc_lengths)) + + encoder_out, enc_lengths = segments_to_sequence( + segments=seg_encoder_states_lengths, time_axis=self.output_time_axis + ) + + encoder_padding_mask, _ = lengths_to_encoder_padding_mask( + enc_lengths, batch_first=True + ) + + if not encoder_padding_mask.any(): + encoder_padding_mask = None + + return { + "encoder_out": [encoder_out], + "encoder_padding_mask": [encoder_padding_mask], + "encoder_embedding": [], + "encoder_states": [states], + "src_tokens": [], + "src_lengths": [], + } + + def incremental_encode( + self, + seg_src_tokens: Tensor, + seg_src_lengths: Tensor, + states=None, + ): + """ + Different from forward function, this function takes segmented speech + as input, and append encoder states to previous states + """ + (seg_encoder_states, seg_enc_lengths, states) = self.module( + seg_src_tokens, + seg_src_lengths, + states=states, + ) + return seg_encoder_states, seg_enc_lengths, states + + +# ------------------------------------------------------------------------------ +# Augmented memory model decorator +# ------------------------------------------------------------------------------ +def augmented_memory(klass): + class StreamSeq2SeqModel(klass): + @staticmethod + def add_args(parser): + super(StreamSeq2SeqModel, StreamSeq2SeqModel).add_args(parser) + parser.add_argument( + "--segment-size", type=int, required=True, help="Length of the segment." + ) + parser.add_argument( + "--left-context", + type=int, + default=0, + help="Left context for the segment.", + ) + parser.add_argument( + "--right-context", + type=int, + default=0, + help="Right context for the segment.", + ) + parser.add_argument( + "--max-memory-size", + type=int, + default=-1, + help="Right context for the segment.", + ) + + StreamSeq2SeqModel.__name__ = klass.__name__ + return StreamSeq2SeqModel diff --git a/SpeechT5/fairseq/fairseq/models/speech_to_text/modules/emformer.py b/SpeechT5/fairseq/fairseq/models/speech_to_text/modules/emformer.py new file mode 100644 index 0000000..6ef76bd --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/speech_to_text/modules/emformer.py @@ -0,0 +1,1837 @@ +#!/usr/bin/env python3 +# Copyright (c) 2017-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the LICENSE file in +# the root directory of this source tree. An additional grant of patent rights +# can be found in the PATENTS file in the same directory. + + +import math +import re +from functools import partial +from typing import List, Optional, Tuple + +import torch +import torch.nn as nn +from fairseq.models import ( + FairseqEncoder, +) +from fairseq.models.speech_to_text.utils import ( + NoOp, + lengths_to_padding_mask, + segments_to_sequence, +) +from fairseq.models.speech_to_text.utils import ( + attention_suppression, + layer_norm_backward_hook, +) +from torch import Tensor, device as Device +from torch.quantization.qconfig import ( + default_dynamic_qconfig, + per_channel_dynamic_qconfig, +) + + +class RelativePositionEmbedding(nn.Module): + """ + Implementation according to https://arxiv.org/abs/1803.02155 + """ + + def __init__(self, head_dim, max_position, norm_init=True): + super().__init__() + self.head_dim = head_dim + self.max_position = max_position + self.embeddings = nn.Parameter(torch.Tensor(max_position * 2 + 1, head_dim)) + if norm_init: + nn.init.xavier_normal_(self.embeddings) + else: + nn.init.xavier_uniform_(self.embeddings) + + def forward(self, input: Tensor): + output = nn.functional.embedding(input.long(), self.embeddings) + return output + + +class Fp32LayerNorm(nn.Module): + def __init__( + self, + input_dim, + clamp_grad=True, + max_grad_value=256, + eps=1e-5, + elementwise_affine=True, + ): + super().__init__() + self.torch_module = torch.nn.LayerNorm( + input_dim, eps=eps, elementwise_affine=elementwise_affine + ) + if clamp_grad: + hook = partial(layer_norm_backward_hook, clamp_value=max_grad_value) + self.torch_module.register_backward_hook(hook) + + def forward(self, input): + output = torch.nn.functional.layer_norm( + input.float(), + self.torch_module.normalized_shape, + self.torch_module.weight.float() + if self.torch_module.weight is not None + else None, + self.torch_module.bias.float() + if self.torch_module.bias is not None + else None, + self.torch_module.eps, + ).type_as(input) + return output + + +# ------------------------------------------------------------------------------ +# PositionwiseFF +# ------------------------------------------------------------------------------ + + +class PositionwiseFF(nn.Module): + """ + FFN layer in transformer. + + Args: + input_dim: input embedding dimension + ffn_dim: FFN layer inner dimension + dropout_on_fc1: dropout for first linear layer + dropout_on_fc2: dropout fr second linear layer + activation_fn: activation function used after first linear layer. \ + Only relu or gelu is supported. + + """ + + def __init__( + self, input_dim, ffn_dim, dropout_on_fc1, dropout_on_fc2, activation_fn + ): + super(PositionwiseFF, self).__init__() + + self.input_dim = input_dim + self.ffn_dim = ffn_dim + if activation_fn == "relu": + ac = nn.ReLU() + elif activation_fn == "gelu": + ac = nn.GELU() + else: + raise ValueError("Unsupported activation_fn = ({})".format(activation_fn)) + + # fc1 -> ac -> dropout -> fc2 -> dropout + self.module = nn.Sequential( + nn.Linear(input_dim, ffn_dim), + ac, + nn.Dropout(dropout_on_fc1), + nn.Linear(ffn_dim, input_dim), + nn.Dropout(dropout_on_fc2), + ) + + self.layer_norm = Fp32LayerNorm(input_dim) + + def forward(self, input): + module_out = self.module(self.layer_norm(input)) + output = module_out + input + + return output + + def quantize_(self, params=None): + if params and "per_channel" in params and params["per_channel"]: + qconfig = per_channel_dynamic_qconfig + else: + qconfig = default_dynamic_qconfig + torch.quantization.quantize_dynamic( + self, {torch.nn.Linear: qconfig}, dtype=torch.qint8, inplace=True + ) + return self + + +# ------------------------------------------------------------------------------ +# SummarizationLayer +# ------------------------------------------------------------------------------ + + +class SummarizationLayer(nn.Module): + def __init__(self, method, segment_size, embedding_dim): + super(SummarizationLayer, self).__init__() + self.segment_size = segment_size + self.embedding_dim = embedding_dim + nonlin_match = re.match(r"nonlinear\((?P<act>[a-z]+),(?P<dim>[0-9]+)\)", method) + self.method = method + if method == "mean": + self.module = nn.AvgPool1d( + kernel_size=segment_size, + stride=segment_size, + ceil_mode=True, + ) + elif method == "max": + self.module = nn.MaxPool1d( + kernel_size=segment_size, + stride=segment_size, + ceil_mode=True, + ) + elif method == "linear": + self.module = nn.Linear(segment_size, 1) + elif nonlin_match: + nonlin_args = nonlin_match.groupdict() + act_type = nonlin_args["act"] + hid_dim = int(nonlin_args["dim"]) + if act_type == "relu": + act = nn.ReLU() + elif act_type == "gelu": + act = nn.GELU() + else: + raise ValueError("Unsupported activation_fn = ({})".format(act_type)) + self.module = nn.Sequential( + nn.Linear(segment_size, hid_dim), + act, + nn.Linear(hid_dim, 1), + ) + else: + raise ValueError("Unsupported summarization method = ({})".format(method)) + + def forward(self, input): + # T, B, D -> B, D, T + input = input.permute(1, 2, 0) + + if self.method == "mean" or self.method == "max": + output = self.module(input) + output = output.permute(2, 0, 1) + return output + + full_seg_length = input.size(2) // self.segment_size * self.segment_size + if full_seg_length > 0: + # at least one seg is full + B = input.size(0) + D = input.size(1) + input_todo = ( + input[:, :, :full_seg_length] + .contiguous() + .view(B, -1, self.segment_size) + ) + output = self.module(input_todo) + output = output.view(B, D, -1) + else: + output = input.new_zeros(input.size(0), input.size(1), 0) + left = input.size(2) - full_seg_length + if left > 0: + # when last seg is not full, use zeros as last memory placeholder + zeros = input.new_zeros(input.size(0), input.size(1), 1) + output = torch.cat([output, zeros], dim=2) + output = output.permute(2, 0, 1) + return output + + +# ------------------------------------------------------------------------------ +# NoSegAugmentedMemoryMultiheadAttentionBmm +# ------------------------------------------------------------------------------ + + +class NoSegAugmentedMemoryMultiheadAttentionBmm(nn.Module): + """ + Whole utterance augmented memory multihead attention using BMM. + + Different with previous augmented memory multihead attention where + the utterance is chunked into segments. Here we use attention mask + achieve so. The input embedding [right_context, utterance, summary] + is a concatenation of right context, utterance and summary. + + Right context block is the concatenation of all the right context for + each segments. [right_context_0, right_context_1, ..., right_context_n] + For example, if we have utterance = [v0, v1, v2, ...., v20]. segment + size 8, right_context size 4. Then the right context blocks = + [v8, v9, v10, v11, v16, v17, v18, v19, 0, 0, 0, 0], where v8, v9, v10, + and v11 are the right context for first segment. v16, v17, v18 and v19 + are the right context for second segment. 0, 0, 0 and 0 are right context + for the last segment. + + utterance is corresponding to input embedding sequence + + summary is concatenation of average of each segments. [summary_0, + summary_1, ..., ]. + + In augmented memory multihead attention, the query is [right_context, + utterance, summary], key is [memory, right_context, utterance]. Different + with AugmentedMemoryMultiheadAttentionBmm, memory here is passed from + previous attention layer. For the first attention layer, memory is average + of each segment. + + Memory is a concatenation of memory from each segments in previous attention + layer. For example, current layer is i, then memory is [m_0, m_1, ..., m_n]. + Each m_k is the output from seg_k in layer i-1. + + args: + input_dim: input embedding dimension + num_heads: number of heads in multihead self-attention + dropout: attention dropout + std_scale: if std_scale is not None. The weak attention suppression is + turned on. For std_scale = 0.5, all the attention smaller than + mean + 0.5 * std will be suppressed. + scaled_init: whether to use scaled init for linear weight + tanh_on_mem: whether to use tanh on memory output + use_mem: whether to use memory or not. When max_memory_size is 0, then + we don't have memory anymore. + layer_index: current self-attention layer index that is used in depth + initialization + max_relative_position: max relative position used in relative position + embedding + rpe_old_option: To be compatible with previous model. The previous model + was trained with attention += attention + rpe. The correct equation + should be attention = attention + rpe + + """ + + def __init__( + self, + input_dim, + num_heads, + dropout=0.0, + std_scale=None, + scaled_init=False, + tanh_on_mem=False, + use_mem=True, + mini_batches=False, + negative_inf="-inf", + layer_index=-1, + max_relative_position=0, + rpe_old_option=True, + ): + if input_dim % num_heads: + raise ValueError( + "input_dim ({}) must be divisible by num_heads ({})".format( + input_dim, num_heads + ) + ) + + super().__init__() + + embed_dim = input_dim + self.e2h_kv = torch.nn.Linear(input_dim, 2 * input_dim, bias=True) + self.e2h_q = torch.nn.Linear(input_dim, input_dim, bias=True) + self.rpe_old_option = rpe_old_option + if max_relative_position > 0: + self.use_rpe = True + self.rpe_k = RelativePositionEmbedding( + head_dim=input_dim // num_heads, + max_position=max_relative_position, + ) + self.rpe_v = RelativePositionEmbedding( + head_dim=input_dim // num_heads, + max_position=max_relative_position, + ) + else: + self.use_rpe = False + self.rpe_k = None + self.rpe_v = None + if scaled_init: + if layer_index == -1: + gain = 1.0 / math.sqrt(2) + else: + # https://arxiv.org/abs/2005.09684 depthwise initialization + # stablize the training greatly. Use depthwise initialization to + # replace incremental loss. + gain = 1.0 / math.sqrt(layer_index + 1) + torch.nn.init.xavier_uniform_(self.e2h_kv.weight, gain=gain) + torch.nn.init.xavier_uniform_(self.e2h_q.weight, gain=gain) + + self.out_proj = torch.nn.Linear(embed_dim, embed_dim, bias=True) + + self.embed_dim = embed_dim + self.num_heads = num_heads + self.dropout = dropout + + self.head_dim = embed_dim // num_heads + self.scaling = self.head_dim ** -0.5 + + self.std_scale = std_scale + self.use_mem = use_mem + self.mini_batches = mini_batches + self.negative_inf = negative_inf + + if tanh_on_mem: + self.squash_mem = torch.tanh + self.nonlinear_squash_mem = True + else: + self.squash_mem = NoOp() + self.nonlinear_squash_mem = False + + def prepare_qkv( + self, + input: Tensor, + mems: Tensor, + lengths: Tensor, + summary_length: int, + lc_length: int, + ): + # T: right_context length + utterance_length + summary_length + T, B, D = input.shape + mem_length = mems.size(0) + utterance_length = torch.max(lengths) + + right_context_blocks_length = T - utterance_length - summary_length + rc_block = input[:right_context_blocks_length, :, :] + utterance_block = input[right_context_blocks_length : T - summary_length, :, :] + + if B == 1: + padding_mask = None + else: + klengths = lengths + mem_length + right_context_blocks_length + lc_length + padding_mask = lengths_to_padding_mask(lengths=klengths) + + mem_rc_input = torch.cat([mems, rc_block, utterance_block], dim=0) + + # In training lc_length = 0 + key_length = mem_rc_input.size(0) + lc_length + rc_input_sum = input + q = self.e2h_q(rc_input_sum) + kv = self.e2h_kv(mem_rc_input) + k, v = kv.chunk(chunks=2, dim=2) + result_qkv = (q, k, v) + input_shape = (T, B, D) + result_lengths_info = ( + mem_length, + utterance_length, + right_context_blocks_length, + key_length, + ) + if padding_mask is not None: + assert padding_mask.size(0) == B + assert padding_mask.size(1) == key_length + + return result_qkv, input_shape, result_lengths_info, padding_mask + + def prepare_attention_weights( + self, + q: Tensor, + new_k: Tensor, + new_v: Tensor, + input_shape: Tuple[int, int, int], + rpe: Optional[Tensor], + ) -> Tuple[Tensor, Tensor, Tensor]: + T, B, D = input_shape + q = ( + q.contiguous().view(-1, B * self.num_heads, self.head_dim).transpose(0, 1) + * self.scaling + ) + + k = ( + new_k.contiguous() + .view(-1, B * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + v = ( + new_v.contiguous() + .view(-1, B * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + attention_weights = torch.bmm(q, k.transpose(1, 2)) + if self.use_rpe and rpe is not None and self.rpe_v is not None: + r_k = self.rpe_k(rpe) + # [q, B*h, d] * [q, k, d] -> [B*h, q, k] + attention_weights_rpe = torch.matmul( + q.transpose(0, 1), r_k.transpose(1, 2) + ).transpose(0, 1) + attention_weights = attention_weights + attention_weights_rpe + attention_weights_float = attention_weights.float() + + return attention_weights, attention_weights_float, v + + def prepare_attention_output( + self, + attention_weights: Tensor, + attention_weights_float: Tensor, + v: Tensor, + input_shape: Tuple[int, int, int], + key_length: int, + padding_mask: Optional[Tensor], + rpe: Optional[Tensor], + ) -> Tensor: + T, B, D = input_shape + if padding_mask is not None: + attention_weights_float = attention_weights_float.view( + B, self.num_heads, T, key_length + ) + attention_weights_float = attention_weights_float.masked_fill( + padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), float("-inf") + ) + attention_weights_float = attention_weights_float.view( + B * self.num_heads, T, key_length + ) + + if self.std_scale is not None: + attention_weights_float = attention_suppression( + attention_weights_float, self.std_scale + ) + + attention_weights_float = torch.nn.functional.softmax( + attention_weights_float, dim=-1 + ) + attention_weights = attention_weights_float.type_as(attention_weights) + + attention_probs = torch.nn.functional.dropout( + attention_weights, p=self.dropout, training=self.training + ) + + # [T, key_length, B, n_head]+ [key_length, B, n_head, d_head] + # -> [T, B, n_head, d_head] + attention = torch.bmm(attention_probs, v) + if self.use_rpe and rpe is not None and self.rpe_v is not None: + r_v = self.rpe_v(rpe) + attention_rpe = torch.matmul( + attention_probs.transpose(0, 1), r_v + ).transpose(0, 1) + + if self.rpe_old_option: + attention += attention + attention_rpe + else: + attention = attention + attention_rpe + + assert list(attention.shape) == [B * self.num_heads, T, self.head_dim] + + attention = attention.transpose(0, 1).contiguous().view(T, B, self.embed_dim) + + rc_output_memory = self.out_proj(attention) + return rc_output_memory + + @torch.jit.unused + def forward( + self, + input: Tensor, + lengths: Tensor, + mems: Tensor, + attention_mask: Tensor, + pre_mems: Optional[Tensor] = None, + left_context_key: Optional[Tensor] = None, + left_context_val: Optional[Tensor] = None, + rpe: Optional[Tensor] = None, + ) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + """ + forward function for NoSegAugmentedMemoryMultiheadAttentionBmm in training. + + args: + input: formed in the following way + [right_context_0, right_contex_1, ..., seg_0, seg_1, + ..., summary_0, summary_1,..] + lengths: the length of query which is [seg_0, seg_1, ....] + mems: [mem_0, mem_1, ...]. + attention_mask: attention mask for query = [right_context, query, summary] + key = [mem, right_context, query]. This is only used for traing. + + """ + if self.use_mem: + mem_length = mems.size(0) + summary_length = mem_length + 1 + if pre_mems is not None: + mems = torch.cat([pre_mems, mems], dim=0) + else: + mem_length = 0 + summary_length = 0 + + # In training, lc_length = 0 + if left_context_key is not None: + lc_length = left_context_key.size(0) + else: + lc_length = 0 + results = self.prepare_qkv( + input=input, + mems=mems, + lengths=lengths, + summary_length=summary_length, + lc_length=lc_length, + ) + result_qkv, input_shape, result_lengths_info, padding_mask = results + q, k, v = result_qkv + ( + mem_length, + utterance_length, + right_context_blocks_length, + key_length, + ) = result_lengths_info + + if left_context_key is not None: + # add the cache key and value + new_k = torch.cat( + [ + k[: mem_length + right_context_blocks_length, :, :], + left_context_key, + k[-utterance_length:, :, :], + ], + dim=0, + ) + new_v = torch.cat( + [ + v[: mem_length + right_context_blocks_length, :, :], + left_context_val, + v[-utterance_length:, :, :], + ], + dim=0, + ) + next_k = new_k[mem_length + right_context_blocks_length :, :, :] + next_v = new_v[mem_length + right_context_blocks_length :, :, :] + else: + new_k = k + new_v = v + next_k = None + next_v = None + + attention_weights, attention_weights_float, v = self.prepare_attention_weights( + q=q, + new_k=new_k, + new_v=new_v, + input_shape=input_shape, + rpe=rpe, + ) + + # mask attention + attention_mask = attention_mask.unsqueeze(0) + attention_weights_float = attention_weights_float.masked_fill( + attention_mask, float(self.negative_inf) + ) + + rc_output_memory = self.prepare_attention_output( + attention_weights=attention_weights, + attention_weights_float=attention_weights_float, + v=v, + input_shape=input_shape, + key_length=key_length, + padding_mask=padding_mask, + rpe=rpe, + ) + + if self.use_mem: + # next_m length equals to summary length - 1 + # last memory is ignored + if self.mini_batches: + next_m = rc_output_memory[-summary_length:] + else: + next_m = rc_output_memory[-summary_length:-1] + + next_m = self.squash_mem(next_m) + # rc and output + rc_output = rc_output_memory[:-summary_length] + if not self.nonlinear_squash_mem: + next_m = torch.clamp(next_m, min=-10, max=10) + else: + next_m = mems + rc_output = rc_output_memory + + return rc_output, next_m, next_k, next_v + + @torch.jit.export + def forward_jit( + self, + input: Tensor, + lengths: Tensor, + mems: Tensor, + left_context_key: Tensor, + left_context_val: Tensor, + rpe: Optional[Tensor], + ) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + """ + forward function for NoSegAugmentedMemoryMultiheadAttentionBmm in decoding. + + args: + input: formed in the following way + [right_context_0, right_contex_1, ..., seg_0, seg_1, + ..., summary_0, summary_1,..] + lengths: the length of query which is [seg_0, seg_1, ....] + mems: [mem_0, mem_1, ...]. + left_context_key: left_context for key part. This is only used for online + decoding. In training, this is empty tensor + left_context_val: left_context for value part. This is only used for online + decoding. In training, this is empty tensor + + """ + lc_length = left_context_key.size(0) + + # In decoding, summary_length = 1 or 0 + if self.use_mem: + summary_length = 1 + else: + summary_length = 0 + + results = self.prepare_qkv( + input=input, + mems=mems, + lengths=lengths, + summary_length=summary_length, + lc_length=lc_length, + ) + result_qkv, input_shape, result_lengths_info, padding_mask = results + q, k, v = result_qkv + ( + mem_length, + utterance_length, + right_context_blocks_length, + key_length, + ) = result_lengths_info + + # add the cache key and value + new_k = torch.cat( + [ + k[: mem_length + right_context_blocks_length, :, :], + left_context_key, + k[-utterance_length:, :, :], + ], + dim=0, + ) + new_v = torch.cat( + [ + v[: mem_length + right_context_blocks_length, :, :], + left_context_val, + v[-utterance_length:, :, :], + ], + dim=0, + ) + next_k = new_k[mem_length + right_context_blocks_length :, :, :] + next_v = new_v[mem_length + right_context_blocks_length :, :, :] + + attention_weights, attention_weights_float, v = self.prepare_attention_weights( + q=q, + new_k=new_k, + new_v=new_v, + input_shape=input_shape, + rpe=rpe, + ) + # In online decoding, we don't have attention mask. But we still need + # to disable the attention from summary query to memory + attention_weights_float[:, -1, :mem_length] = float(self.negative_inf) + rc_output_memory = self.prepare_attention_output( + attention_weights=attention_weights, + attention_weights_float=attention_weights_float, + v=v, + input_shape=input_shape, + key_length=key_length, + padding_mask=padding_mask, + rpe=rpe, + ) + + # In decoding, summary length is 1 + if self.use_mem: + next_m = rc_output_memory[-1:] + next_m = self.squash_mem(next_m) + # rc and output + rc_output = rc_output_memory[:-1] + if not self.nonlinear_squash_mem: + next_m = torch.clamp(next_m, min=-10, max=10) + else: + rc_output = rc_output_memory + # empty tensor as input mems + next_m = mems + + return rc_output, next_m, next_k, next_v + + def quantize_(self, params=None): + if params and "per_channel" in params and params["per_channel"]: + qconfig = per_channel_dynamic_qconfig + else: + qconfig = default_dynamic_qconfig + torch.quantization.quantize_dynamic( + self, {torch.nn.Linear: qconfig}, dtype=torch.qint8, inplace=True + ) + return self + + +class NoSegAugmentedMemoryTransformer(nn.Module): + """ + Whole utterance augmented memory transformer. + + This is not pyspeech nn layer. It is used as a module in a master layer where + multiple transformers is used. + """ + + def __init__( + self, + input_dim, + num_heads, + ffn_dim, + dropout_in_attn=0.0, + dropout_on_attn=None, + dropout_on_fc1=None, + dropout_on_fc2=None, + activation_fn="relu", + tanh_on_mem=False, + std_scale=None, + scaled_init=False, + segment_size=128, + use_mem=True, + mini_batches=False, + negative_inf="-inf", + layer_index=-1, + summarization_method="mean", + max_relative_position=0, + rpe_old_option=True, + ): + super(NoSegAugmentedMemoryTransformer, self).__init__() + + self.attention = NoSegAugmentedMemoryMultiheadAttentionBmm( + input_dim=input_dim, + num_heads=num_heads, + dropout=dropout_in_attn, + scaled_init=scaled_init, + tanh_on_mem=tanh_on_mem, + std_scale=std_scale, + use_mem=use_mem, + mini_batches=mini_batches, + negative_inf=negative_inf, + layer_index=layer_index, + max_relative_position=max_relative_position, + ) + self.dropout = nn.Dropout(dropout_on_attn) + self.pos_ff = PositionwiseFF( + input_dim=input_dim, + ffn_dim=ffn_dim, + dropout_on_fc1=dropout_on_fc1, + dropout_on_fc2=dropout_on_fc2, + activation_fn=activation_fn, + ) + self.layer_norm_pre = Fp32LayerNorm(input_dim) + self.layer_norm = Fp32LayerNorm(input_dim) + self.segment_size = segment_size + self.use_mem = use_mem + + self.memory_op = SummarizationLayer( + summarization_method, segment_size, input_dim + ) + + def set_mini_batches(self, mini_batches): + self.attention.mini_batches = mini_batches + + def gen_summary_queries(self, input): + sum_input = self.memory_op(input) + return sum_input + + def pre_attention_ops(self, input, right_context_blocks): + rc_length = right_context_blocks.size(0) + input_length = input.size(0) + + rc_and_input = torch.cat([right_context_blocks, input], dim=0) + residual_input = rc_and_input + rc_and_input = self.layer_norm_pre(rc_and_input) + + query_input = rc_and_input[-input_length:, :, :] + return rc_length, input_length, residual_input, query_input, rc_and_input + + def after_attention_ops(self, attention_output, residual_input): + output = self.dropout(attention_output) + output = output + residual_input + output = self.pos_ff(output) + output = self.layer_norm(output) + return output + + @torch.jit.export + def forward_jit( + self, + input: Tensor, + lengths: Tensor, + mems: Tensor, + left_context_key: Tensor, + left_context_val: Tensor, + right_context_blocks: Tensor, + rpe: Optional[Tensor], + ) -> Tuple[Tensor, Tensor, Tensor, Tensor, Tensor]: + + results = self.pre_attention_ops(input, right_context_blocks) + rc_length, input_length, residual_input, query_input, rc_and_input = results + + # In online decoding, the summary query size is always 1 or 0 + if self.use_mem: + summary_query = self.gen_summary_queries(query_input) + summary_query = summary_query[0:1, :, :] + rc_qu_su = torch.cat([rc_and_input, summary_query], dim=0) + else: + rc_qu_su = rc_and_input + + rc_output, next_m, next_k, next_v = self.attention.forward_jit( + input=rc_qu_su, + lengths=lengths, + mems=mems, + left_context_key=left_context_key, + left_context_val=left_context_val, + rpe=rpe, + ) + rc_output = self.after_attention_ops(rc_output, residual_input) + results = ( + rc_output[-input_length:, :, :], + next_m, + rc_output[0:rc_length, :, :], + next_k, + next_v, + ) + return results + + @torch.jit.unused + def forward( + self, + input, + lengths, + mems, + right_context_blocks, + attention_mask, + pre_mems, + left_context_key, + left_context_val, + rpe, + ): + + results = self.pre_attention_ops(input, right_context_blocks) + rc_length, input_length, residual_input, query_input, rc_and_input = results + if self.use_mem: + summary_query = self.gen_summary_queries(query_input) + rc_qu_su = torch.cat([rc_and_input, summary_query], dim=0) + else: + rc_qu_su = rc_and_input + + rc_output, next_m, next_k, next_v = self.attention( + input=rc_qu_su, + lengths=lengths, + mems=mems, + attention_mask=attention_mask, + pre_mems=pre_mems, + left_context_key=left_context_key, + left_context_val=left_context_val, + rpe=rpe, + ) + + # [TODO] Note memory did not go through pos_ff. What happen if we pass + # memory through the pos_ff as well? + rc_output = self.after_attention_ops(rc_output, residual_input) + results = ( + rc_output[-input_length:, :, :], + next_m, + rc_output[0:rc_length, :, :], + next_k, + next_v, + ) + + return results + + +class NoSegAugmentedMemoryTransformerEncoderLayer(FairseqEncoder): + """ + Whole utterance augmented memory transformer encoder layer. This is a master layer + where we can define multiple augmented memory transformers. There are two reasons + to setup the master layer. + 1. We only need to define once about the attention mask. All the layers in the master + layer share the same mask. + 2. pyspeech nn layer has special input and output format. Defining one master layer is + easier to passing memory between different layes inside the master layer + + args: + input_dim: input embedding dimension + num_heads: number of heads in multihead self-attention + ffn_dim: ffn dimension in FFN layer + num_layers: number of augmented memory transformer layers + dropout_in_attn: dropout used in multi-head self-attention + dropout_on_attn: dropout used for output from te multihead self-attention + dropout_on_fc1: dropout used in FFN layer for the first linear layer + dropout_on_fc2: dropout used in FFN layer for the second linear layer + segment_size: segment size for each segment + context_config: (left_context_size, right_context_size) defines the surround context size + for each segment + max_memory_size: maximum memory size used for each segment + scaled_init: whether use scaled init for weight initialization in attention layer + std_scale: if std_scale is not None. The weak attention suppression is + turned on. For std_scale = 0.5, all the attention smaller than + mean + 0.5 * std will be suppressed. + activation_fn: activation function used in FFN layer. [ReLU, GELU] supported + tanh_on_mem: whether use tanh on memory + mini_batches: use mini-btach training + negative_inf: the negative infinity value used in attention masking. default is "-inf". + For some situation, e.g. LM. it is better to use "-1e8" to avoid nan issue. + summarization_method: method to generate segment summrization embedding + max_relative_position: max relatie position for relative position embedding + rpe_old_option: To be compatible with previous model. The previous model + was trained with attention += attention + rpe. The correct equation + should be attention = attention + rpe + [TODO]: remove the rpe_old_option by the end of 2021 Q1. + + """ + + def __init__( + self, + input_dim, + num_heads, + ffn_dim, + num_layers=1, + dropout_in_attn=0.0, + dropout_on_attn=0.0, + dropout_on_fc1=0.0, + dropout_on_fc2=0.0, + segment_size=128, + context_config=(0, 0), + max_memory_size=0, + scaled_init=True, + std_scale=None, + activation_fn="relu", + tanh_on_mem=False, + mini_batches=False, + negative_inf="-inf", + deep_init=True, + summarization_method="mean", + max_relative_position=0, + rpe_old_option=True, + ): + super().__init__(None) + if input_dim % num_heads: + raise ValueError( + "input_dim ({}) must be divisible by num_heads ({})".format( + input_dim, num_heads + ) + ) + + # we used to support growing memory size. However, it will cause + # cross stream batching failure. Now we need to have exact max memory size + if max_memory_size < 0: + raise ValueError("max_memory_size must be >= 0") + + # Only assign right_context. In decoding, left context will be cached. + # No need to let the online decoder to re-assign the left context + self.left_context, self.right_context = context_config + self.segment_size = segment_size + self.memory_dim = input_dim + self.max_memory_size = max_memory_size + self.mini_batches = mini_batches + if self.max_memory_size != 0: + self.use_mem = True + else: + self.use_mem = False + + self.memory_op = SummarizationLayer( + summarization_method, segment_size, input_dim + ) + + self.layers = torch.nn.ModuleList() + self.num_layers = num_layers + self.max_relative_position = max_relative_position + if self.max_relative_position > 0: + self.use_rpe = True + else: + self.use_rpe = False + for i in range(self.num_layers): + if deep_init: + layer_index = i + else: + layer_index = -1 + + self.layers.append( + NoSegAugmentedMemoryTransformer( + num_heads=num_heads, + input_dim=input_dim, + ffn_dim=ffn_dim, + dropout_in_attn=dropout_in_attn, + dropout_on_attn=dropout_on_attn, + dropout_on_fc1=dropout_on_fc1, + dropout_on_fc2=dropout_on_fc2, + segment_size=segment_size, + std_scale=std_scale, + activation_fn=activation_fn, + tanh_on_mem=tanh_on_mem, + scaled_init=scaled_init, + use_mem=self.use_mem, + mini_batches=mini_batches, + negative_inf=negative_inf, + layer_index=layer_index, + summarization_method=summarization_method, + max_relative_position=max_relative_position, + rpe_old_option=rpe_old_option, + ) + ) + + def set_mini_batches(self, mini_batches): + # handy function only used for unit test + self.mini_batches = mini_batches + for layer in self.layers: + layer.set_mini_batches(mini_batches) + + def _get_relative_position( + self, + input: Tensor, + max_relative_position: int, + left_context_length: int, + past_length: int, + is_decoding: bool, + ): + # For training, we copy the right context to the start of the utterance + # First dimension in distance is corresponding to query. + # [right context, utterance, summary vector] + # Second dimension in distance is corresponding to key. + # [Memory bank, right context, utterance] + # For summary vector in query part, the distance with + # all other position is 2*max_position. For memory bank in key, + # the distance with all other positions is 0. + + T, B, D = input.shape + num_segs = math.ceil((T - self.right_context) / self.segment_size) + + # utterance + u_st = past_length * self.segment_size + u_ed = u_st + T + utterance_ranges = torch.arange(u_st, u_ed - self.right_context) + + # left context. Only in minibatch or decoding + left_context_ranges = torch.arange(u_st - left_context_length, u_st) + + # Right context block + # right context + utterance + right_context_blocks = [] + for i in range(0, num_segs - 1): + st = (i + 1) * self.segment_size + u_st + ed = st + self.right_context + assert ed < u_ed + temp = torch.arange(st, ed) + right_context_blocks.append(temp) + right_context_blocks.append(torch.arange(u_ed - self.right_context, u_ed)) + right_context_ranges = torch.cat(right_context_blocks) + + if self.use_mem: + # Memory bank + # The position for memory -n, .., -1 + if is_decoding: + memory_size = min(past_length, self.max_memory_size) + else: + memory_size = num_segs + past_length - 1 + memory_bank_ranges = torch.arange( + -max_relative_position - 1, -max_relative_position - 1 - memory_size, -1 + ) + + # summary vector + # The position for summary vector as the T+max_relative_position+1. + # After the clamping, the relative position is max_relative_position + summary_pos_st = u_ed + max_relative_position + 1 + summary_vector_ranges = torch.arange( + summary_pos_st, summary_pos_st + num_segs + ) + + key_ranges = torch.cat( + [ + memory_bank_ranges, + right_context_ranges, + left_context_ranges, + utterance_ranges, + ] + ) + + query_ranges = torch.cat( + [right_context_ranges, utterance_ranges, summary_vector_ranges] + ) + else: + key_ranges = torch.cat( + [right_context_ranges, left_context_ranges, utterance_ranges] + ) + + query_ranges = torch.cat([right_context_ranges, utterance_ranges]) + + distance = key_ranges[None, :] - query_ranges[:, None] + distance_clamp = ( + torch.clamp(distance, -max_relative_position, max_relative_position) + + max_relative_position + ) + distance_clamp = distance_clamp.to(input.device).long().detach() + return distance_clamp + + def _get_attention_mask(self, input, past_length=0, left_context_cache=0): + # attention mask for each query contains three parts: + # 1. memory part + # 2. left_context + segment + # 3. right_context_block + # so for each segment and its correspoinding right context block, + # the attention matrix is formed by 9 parts: + # [0, m, 0, 0, right_context, 0, 0, seg, 0] + # [before memory, memory, after memory, before right context, right_context, + # after right context, before seg, seg, after seg] + # + # Query is formed in the way as [right_context_blocks, utterance, summary] + # + # Note: put m and right_context before segment is convenient + # for padding_mask operation. + # Key lengths = m_length + right_context_block_length + lengths + utterance_length, batch_size, _ = input.shape + summary_length = math.ceil(utterance_length / self.segment_size) + num_segs = summary_length + rc_length = self.right_context * num_segs + rc = self.right_context + lc = self.left_context + + # using mini-batches, there is left context cache available for current + # sequence. + lcc = left_context_cache + + # max_memory_size is 0 then we don't have memory and summary + # past_length is the memory carry from previous sequence + if self.use_mem: + mem_length = num_segs - 1 + past_length + else: + mem_length = 0 + rc_mask = [] + query_mask = [] + summary_mask = [] + for j in range(0, num_segs): + ssize = min(self.segment_size, utterance_length - j * self.segment_size) + + rc_size = rc + rc_mat = [] + q_mat = [] + s_mat = [] + m_start = max(j + past_length - self.max_memory_size, 0) + + # max_memory_size is 0, then we don't use memory + if self.use_mem: + # part 0: before memory + rc_mat.append(input.new_zeros(rc_size, m_start)) + q_mat.append(input.new_zeros(ssize, m_start)) + s_mat.append(input.new_zeros(1, m_start)) + + # part 1: memory + col_1 = j + past_length - m_start + rc_mat.append(torch.ones(rc_size, col_1, device=input.device)) + q_mat.append(torch.ones(ssize, col_1, device=input.device)) + # based on D22875746, disable summary query attention + # on memeory is better for long form utterance + s_mat.append(input.new_zeros(1, col_1)) + + # part 2: after memory + col_2 = mem_length - (j + past_length) + rc_mat.append(input.new_zeros(rc_size, col_2)) + q_mat.append(input.new_zeros(ssize, col_2)) + s_mat.append(input.new_zeros(1, col_2)) + + # part 3: before right context + rc_start = j * rc + rc_mat.append(input.new_zeros(rc_size, rc_start)) + q_mat.append(input.new_zeros(ssize, rc_start)) + s_mat.append(input.new_zeros(1, rc_start)) + + # part 4: right context + rc_end = rc_start + rc + col_4 = rc + rc_mat.append(torch.ones(rc_size, col_4, device=input.device)) + q_mat.append(torch.ones(ssize, col_4, device=input.device)) + s_mat.append(torch.ones(1, col_4, device=input.device)) + + # part 5: after right context + col_5 = rc_length - rc_end + rc_mat.append(input.new_zeros(rc_size, col_5)) + q_mat.append(input.new_zeros(ssize, col_5)) + s_mat.append(input.new_zeros(1, col_5)) + + # part 6: before query segment + seg_start = max(j * self.segment_size + lcc - lc, 0) + rc_mat.append(input.new_zeros(rc_size, seg_start)) + q_mat.append(input.new_zeros(ssize, seg_start)) + s_mat.append(input.new_zeros(1, seg_start)) + + # part 7: query segment + # note: right context is put in right context block + # here we only need to consider about left context + seg_end = min((j + 1) * self.segment_size + lcc, utterance_length + lcc) + col_7 = seg_end - seg_start + rc_mat.append(torch.ones(rc_size, col_7, device=input.device)) + q_mat.append(torch.ones(ssize, col_7, device=input.device)) + s_mat.append(torch.ones(1, col_7, device=input.device)) + + # part 8: after query segment + col_8 = utterance_length + lcc - seg_end + rc_mat.append(input.new_zeros(rc_size, col_8)) + q_mat.append(input.new_zeros(ssize, col_8)) + s_mat.append(input.new_zeros(1, col_8)) + + rc_mask.append(torch.cat(rc_mat, dim=1)) + query_mask.append(torch.cat(q_mat, dim=1)) + summary_mask.append(torch.cat(s_mat, dim=1)) + + # no memory, then we don't need summary either + if self.use_mem: + attention_mask = ( + 1 + - torch.cat( + [ + torch.cat(rc_mask, dim=0), + torch.cat(query_mask, dim=0), + torch.cat(summary_mask, dim=0), + ], + dim=0, + ) + ).to(torch.bool) + else: + attention_mask = ( + 1 + - torch.cat( + [torch.cat(rc_mask, dim=0), torch.cat(query_mask, dim=0)], dim=0 + ) + ).to(torch.bool) + + return attention_mask + + @torch.jit.export + def init_state( + self, batch_size: int, device: Optional[Device] = None + ) -> List[Tensor]: + empty_memory = torch.zeros( + self.num_layers, + self.max_memory_size, + batch_size, + self.memory_dim, + device=device, + ) + left_context_key = torch.zeros( + self.num_layers, + self.left_context, + batch_size, + self.memory_dim, + device=device, + ) + left_context_val = torch.zeros( + self.num_layers, + self.left_context, + batch_size, + self.memory_dim, + device=device, + ) + past_length = torch.zeros(1, batch_size, dtype=torch.int32, device=device) + + return [empty_memory, left_context_key, left_context_val, past_length] + + @torch.jit.export + def batch_state(self, states: List[List[Tensor]]) -> List[Tensor]: + if len(states) == 0: + return [] + batched_m = [] + batched_lc_key = [] + batched_lc_val = [] + batched_past_length = [] + for state in states: + if len(state) == 0: + continue + m, lc_key, lc_val, past_length = state + batched_m.append(m) + batched_lc_key.append(lc_key) + batched_lc_val.append(lc_val) + batched_past_length.append(past_length) + + if ( + (len(batched_m) == 0) + or (len(batched_lc_key) == 0) + or (len(batched_lc_val) == 0) + or (len(batched_past_length) == 0) + ): + return [ + torch.tensor([]), + torch.tensor([]), + torch.tensor([]), + torch.tensor([]), + ] + + batched_m = torch.cat(batched_m, dim=2) + batched_lc_key = torch.cat(batched_lc_key, dim=2) + batched_lc_val = torch.cat(batched_lc_val, dim=2) + batched_past_length = torch.cat(batched_past_length, dim=1) + return [batched_m, batched_lc_key, batched_lc_val, batched_past_length] + + @torch.jit.export + def reorder_state(self, state: List[Tensor], indices: Tensor) -> List[Tensor]: + if len(state) == 0: + return [] + m, lc_key, lc_val, past_length = state + indices = indices.to(device=m.device) + reord_m = torch.index_select(m, 2, indices) + reord_lc_key = torch.index_select(lc_key, 2, indices) + reord_lc_val = torch.index_select(lc_val, 2, indices) + reord_past_length = torch.index_select(past_length, 1, indices) + return [reord_m, reord_lc_key, reord_lc_val, reord_past_length] + + @torch.jit.export + def reset_state(self, state: List[Tensor], indices: Tensor) -> List[Tensor]: + m, lc_key, lc_val, past_length = state + m = m.index_fill(dim=2, index=indices, value=0.0) + lc_key = lc_key.index_fill(dim=2, index=indices, value=0.0) + lc_val = lc_val.index_fill(dim=2, index=indices, value=0.0) + past_length = past_length.index_fill(dim=1, index=indices, value=0) + + return [m, lc_key, lc_val, past_length] + + @torch.jit.export + def state_size(self) -> int: + return 4 + + @torch.jit.export + def batch_size_in_state( + self, state: Optional[List[Tensor]], sloppy: bool = True + ) -> Optional[int]: + if state is None: + return None + return state[0].size(2) + + def gen_summary_queries(self, input): + sum_input = self.memory_op(input) + return sum_input + + def _gen_right_context_padded_input(self, input): + # This function deals with input that is already + # padded with right context (e.g. minibatch training) + right_context_blocks = [] + T, B, D = input.shape + num_segs = math.ceil((T - self.right_context) / self.segment_size) + for i in range(0, num_segs - 1): + st = (i + 1) * self.segment_size + ed = st + self.right_context + assert ed < T + temp = input[st:ed, :, :] + right_context_blocks.append(temp) + + # last segment right context is already available + right_context_blocks.append(input[T - self.right_context :, :, :]) + return torch.cat(right_context_blocks, dim=0) + + def _gen_segs_right_context(self, input, lengths): + segments = [] + T, B, D = input.size() + nT = T - self.right_context + + # assume input is right context padded + num_segs = math.ceil(nT / self.segment_size) + # pad zeros to the utterance to make sure each + # segment has the same right context. For the + for i in range(0, num_segs - 1): + st = i * self.segment_size + ed = min(T, st + self.segment_size + self.right_context) + temp = input[st:ed, :, :] + rest_lengths = torch.clamp( + lengths - self.segment_size, min=0, max=nT - (i + 1) * self.segment_size + ) + segments.append((temp, lengths - rest_lengths + self.right_context)) + lengths = rest_lengths + + last_seg = input[st + self.segment_size :, :, :] + segments.append((last_seg, rest_lengths + self.right_context)) + + return segments + + @torch.jit.unused + def forward( + self, input: Tensor, padding_masks: Tensor, state: Optional[List[Tensor]] = None + ) -> Tuple[Tensor, Tensor, List[Tensor], List[Tensor]]: + # Xutai: originally the second argument is lengths. + lengths = (~padding_masks).sum(dim=1).long() + # mini batch training. + if self.mini_batches: + return self.forward_mini_batches(input, lengths, state) + + # regular full sequence training. Note, assume the right context in provided + # in the input. + T, B, D = input.size() + right_context_blocks = self._gen_right_context_padded_input(input) + + # generate the relative positional embedding + if self.use_rpe: + rpe = self._get_relative_position( + input=input, + max_relative_position=self.max_relative_position, + left_context_length=0, + past_length=0, + is_decoding=False, + ) + else: + rpe = None + input = input[: T - self.right_context, :, :] + + attention_mask = self._get_attention_mask(input) + + # firt layer use each segment mean as memory + # ignore the last one seg average + if self.use_mem: + mems = self.gen_summary_queries(input)[:-1, :, :] + else: + mems = torch.zeros(0, input.size(1), input.size(2), device=input.device) + mems = mems.type_as(input) + + output = input + all_outputs = [] + + for layer in self.layers: + output, mems, right_context_blocks, _, _ = layer( + input=output, + lengths=lengths, + attention_mask=attention_mask, + mems=mems, + right_context_blocks=right_context_blocks, + pre_mems=None, + left_context_key=None, + left_context_val=None, + rpe=rpe, + ) + all_outputs.append(output) + return output, padding_masks, [], all_outputs + + def forward_jit_mini_batch_init( + self, + seg: Tensor, + state: Optional[List[Tensor]] = None, + is_decoding: bool = False, + ): + # Prepare state. In whole sequence training, state is ignored. + # For minibatch training, we need to prepare state + if state is None: + state = self.init_state(batch_size=seg.size(1), device=seg.device) + if seg.dtype == torch.half: + state = [state[0].half(), state[1].half(), state[2].half(), state[3]] + + if self.use_mem: + # note input average only on seg, not on right context + # first layer use each segmetn mean as memory. the last + # one segment average is used in state + full_mems = self.gen_summary_queries(seg) + if is_decoding: + mems = full_mems[0:1, :, :] + state_mems = torch.cat([state[0][0], mems], dim=0) + else: + mems = full_mems[:-1, :, :] + state_mems = torch.cat([state[0][0], full_mems], dim=0) + else: + mems = state[0][0] + state_mems = mems + + # track processed segment number or memory number + # the same batch as the same bumber of past length + past_length = state[3][0][0].item() + past_left_context = min(past_length * self.segment_size, self.left_context) + past_length = min(self.max_memory_size, past_length) + + return state, mems, state_mems, past_length, past_left_context + + def state_update_before( + self, layer: int, state: List[Tensor], past_length: int, past_left_context: int + ): + pre_mems = state[0][layer][self.max_memory_size - past_length :, :, :] + lc_key = state[1][layer][self.left_context - past_left_context :, :, :] + lc_val = state[2][layer][self.left_context - past_left_context :, :, :] + return pre_mems, lc_key, lc_val + + def state_update_after( + self, + layer: int, + state: List[Tensor], + mems: Tensor, + next_key: Tensor, + next_val: Tensor, + mems_list: List[Tensor], + lc_key_list: List[Tensor], + lc_val_list: List[Tensor], + ): + # mems is used for next layer + if layer < self.num_layers - 1: + state_mems = torch.cat([state[0][layer + 1], mems], dim=0) + mems_list.append(state_mems[-self.max_memory_size :, :, :]) + + # when mems pass to next sequence, we need the last memory. when mems + # use for the next layer, we can ignore the last memory + mems = mems[:-1, :, :] + + # note state[1][i] and state[2][i] original length equals to self.left_context + new_k = torch.cat([state[1][layer], next_key], dim=0) + new_v = torch.cat([state[2][layer], next_val], dim=0) + lc_key_list.append(new_k[-self.left_context :, :, :]) + lc_val_list.append(new_v[-self.left_context :, :, :]) + return mems_list, lc_key_list, lc_val_list, mems + + def state_update_after_loop( + self, + state: List[Tensor], + mems_list: List[Tensor], + lc_key_list: List[Tensor], + lc_val_list: List[Tensor], + update_length: int, + ): + state[0] = torch.stack(mems_list, dim=0) + state[1] = torch.stack(lc_key_list, dim=0) + state[2] = torch.stack(lc_val_list, dim=0) + state[3] = state[3] + update_length + return state + + @torch.jit.unused + def forward_mini_batches( + self, input: Tensor, lengths: Tensor, state: Optional[List[Tensor]] = None + ) -> Tuple[Tensor, Tensor, List[Tensor], List[Tensor]]: + T, B, D = input.size() + + # input without right context + seg = input[: T - self.right_context, :, :] + + # get right context blocks + right_context_blocks = self._gen_right_context_padded_input(input) + + mems_list = [] + lc_key_list = [] + lc_val_list = [] + results = self.forward_jit_mini_batch_init(seg, state, False) + state, mems, state_mems, past_length, past_left_context = results + + # relative position embedding + if self.use_rpe: + rpe = self._get_relative_position( + input=input, + max_relative_position=self.max_relative_position, + left_context_length=past_left_context, + past_length=past_length, + is_decoding=False, + ) + else: + rpe = None + + # get attention mask based on seg (not include right context) and available + # left context + attention_mask = self._get_attention_mask(seg, past_length, past_left_context) + mems_list.append(state_mems[-self.max_memory_size :, :, :]) + output = seg + i = 0 + all_outputs = [] + for layer in self.layers: + # In order to make cross stream batching work, mem, left context key + # and left context value in the state should always be the same shape. + # We use the past length to track the processed segment number. In this + # way, we take out the essential memory, left context key and left + # context val from the state. After finish the forward for current segment + # we add the new memory, left context key and left context value into the + # staate and trim out the oldest part to keep the shape consistent. + pre_mems, lc_key, lc_val = self.state_update_before( + i, state, past_length, past_left_context + ) + + output, mems, right_context_blocks, next_key, next_val = layer.forward( + input=output, + lengths=lengths, + attention_mask=attention_mask, + mems=mems, + right_context_blocks=right_context_blocks, + pre_mems=pre_mems, + left_context_key=lc_key, + left_context_val=lc_val, + rpe=rpe, + ) + all_outputs.append(output) + mems_list, lc_key_list, lc_val_list, mems = self.state_update_after( + layer=i, + state=state, + mems=mems, + next_key=next_key, + next_val=next_val, + mems_list=mems_list, + lc_key_list=lc_key_list, + lc_val_list=lc_val_list, + ) + + i += 1 + + # update state + update_length = math.ceil((T - self.right_context) / self.segment_size) + state = self.state_update_after_loop( + state=state, + mems_list=mems_list, + lc_key_list=lc_key_list, + lc_val_list=lc_val_list, + update_length=update_length, + ) + + return output, lengths, state, all_outputs + + def forward_jit_test( + self, input: Tensor, lengths: Tensor, state: Optional[List[Tensor]] = None + ) -> Tuple[Tensor, Tensor, List[Tensor]]: + """ + This one simulate sequence encoder forward jit. This is for unit test purpose. + It is not used in training or decoding. Note, extra_right_context is set in + the model. In unit test, input = [utterance, right_context], lengths = + [utterance_length]. + args: + input: input utterance + lengths: utterance input length + state: None here. input is whole utterance + """ + # [TODO] sequence_to_segment has bug in lengths. + seg_src_tokens_lengths = self._gen_segs_right_context(input, lengths) + + seg_enc_tokens_lengths: List[Tuple[Tensor, Tensor]] = [] + state: Optional[List[Tensor]] = None + for seg_src_tokens, seg_src_lengths in seg_src_tokens_lengths: + seg_enc_tokens, seg_enc_lengths, state = self.forward_jit( + input=seg_src_tokens, lengths=seg_src_lengths, state=state + ) + seg_enc_tokens_lengths.append((seg_enc_tokens, seg_enc_lengths)) + + enc_tokens, enc_lengths = segments_to_sequence( + segments=seg_enc_tokens_lengths, time_axis=0 + ) + + state = [] # returns trivial state + + return enc_tokens, enc_lengths, state + + @torch.jit.export + def forward_jit( + self, input: Tensor, lengths: Tensor, state: Optional[List[Tensor]] = None + ) -> Tuple[Tensor, Tensor, List[Tensor]]: + """ + Forward helper for online decoding. + + args: + input: [seg, right_context]. We assume in online we + always padding the right context to the preset right context size. + For the last segment, we may have short segment size, but right + context size is the same as other segments + lengths: utterance input length is the utterance segment length and + right context size + state: [memory, left_context_key, left_context_val]. To improve throughput, + in addition to memory, we also cache key and value for left_context in + multihead self-attention + """ + # In online decoding, input = [segment, right_context] + # Lengths = [segment_length, right_context_length] + # so we need strip right context in output + T, B, D = input.size() + rc_str = T - self.right_context + rc_end = T + right_context_blocks = input[rc_str:rc_end, :, :] + seg = input[:rc_str, :, :] + lengths = torch.clamp(lengths - self.right_context, min=0) + mems_list = [] + lc_key_list = [] + lc_val_list = [] + + results = self.forward_jit_mini_batch_init(seg, state, True) + state, mems, state_mems, past_length, past_left_context = results + + # relative position embedding + if self.use_rpe: + rpe = self._get_relative_position( + input=input, + max_relative_position=self.max_relative_position, + left_context_length=past_left_context, + past_length=past_length, + is_decoding=True, + ) + else: + rpe = None + + # memory for first layer. + mems_list.append(state_mems[-self.max_memory_size :, :, :]) + output = seg + i = 0 + for layer in self.layers: + # In order to make cross stream batching work, mem, left context key + # and left context value in the state should always be the same shape. + # We use the past length to track the processed segment number. In this + # way, we take out the essential memory, left context key and left + # context val from the state. After finish the forward for current segment + # we add the new memory, left context key and left context value into the + # staate and trim out the oldest part to keep the shape consistent. + true_mems, lc_key, lc_val = self.state_update_before( + layer=i, + state=state, + past_length=past_length, + past_left_context=past_left_context, + ) + + output, mems, right_context_blocks, next_key, next_val = layer.forward_jit( + input=output, + lengths=lengths, + mems=true_mems, + right_context_blocks=right_context_blocks, + left_context_key=lc_key, + left_context_val=lc_val, + rpe=rpe, + ) + # mems is used for next layer + mems_list, lc_key_list, lc_val_list, _ = self.state_update_after( + layer=i, + state=state, + mems_list=mems_list, + mems=mems, + next_key=next_key, + next_val=next_val, + lc_key_list=lc_key_list, + lc_val_list=lc_val_list, + ) + i += 1 + + # update state + state = self.state_update_after_loop( + state=state, + mems_list=mems_list, + lc_key_list=lc_key_list, + lc_val_list=lc_val_list, + update_length=1, + ) + + return output, lengths, state + + def quantize_(self, params=None): + if params and "per_channel" in params and params["per_channel"]: + qconfig = per_channel_dynamic_qconfig + else: + qconfig = default_dynamic_qconfig + torch.quantization.quantize_dynamic( + self, {torch.nn.Linear: qconfig}, dtype=torch.qint8, inplace=True + ) + return self + + +# ------------------------------------------------------------------------------ +# Emformer encoder for seq2seq model +# This is a wrapper over the original emformer +# ------------------------------------------------------------------------------ +def emformer_encoder(klass): + class SpeechEncoder(klass): + def __init__(self, args): + super().__init__(args) + stride = SpeechEncoder.conv_layer_stride(args) + trf_left_context = args.segment_left_context // stride + trf_right_context = args.segment_right_context // stride + context_config = [trf_left_context, trf_right_context] + self.transformer_layers = nn.ModuleList( + [ + NoSegAugmentedMemoryTransformerEncoderLayer( + input_dim=args.encoder_embed_dim, + num_heads=args.encoder_attention_heads, + ffn_dim=args.encoder_ffn_embed_dim, + num_layers=args.encoder_layers, + dropout_in_attn=args.dropout, + dropout_on_attn=args.dropout, + dropout_on_fc1=args.dropout, + dropout_on_fc2=args.dropout, + activation_fn=args.activation_fn, + context_config=context_config, + segment_size=args.segment_length, + max_memory_size=args.max_memory_size, + scaled_init=True, # TODO: use constant for now. + tanh_on_mem=args.amtrf_tanh_on_mem, + ) + ] + ) + + def forward(self, src_tokens, src_lengths): + encoder_out = super().forward(src_tokens, src_lengths) + output = encoder_out["encoder_out"][0] + encoder_padding_masks = encoder_out["encoder_padding_mask"][0] + + # This is because that in the original implementation + # the output didn't consider the last segment as right context. + encoder_padding_masks = encoder_padding_masks[:, : output.size(0)] + + return { + "encoder_out": [output], + "encoder_padding_mask": [encoder_padding_masks], + "encoder_embedding": [], + "encoder_states": [], + "src_tokens": [], + "src_lengths": [], + } + + @staticmethod + def conv_layer_stride(args): + # TODO: make it configurable from the args + return 4 + + SpeechEncoder.__name__ = klass.__name__ + return SpeechEncoder diff --git a/SpeechT5/fairseq/fairseq/models/speech_to_text/s2t_transformer.py b/SpeechT5/fairseq/fairseq/models/speech_to_text/s2t_transformer.py new file mode 100644 index 0000000..5c935ef --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/speech_to_text/s2t_transformer.py @@ -0,0 +1,496 @@ +#!/usr/bin/env python3 + +import logging +import math +from typing import Dict, List, Optional, Tuple +from pathlib import Path + +import torch +import torch.nn as nn +from fairseq import checkpoint_utils, utils +from fairseq.data.data_utils import lengths_to_padding_mask +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) +from fairseq.models.transformer import Embedding, TransformerDecoder +from fairseq.modules import ( + FairseqDropout, + LayerNorm, + PositionalEmbedding, + TransformerEncoderLayer, +) +from torch import Tensor + + +logger = logging.getLogger(__name__) + + +class Conv1dSubsampler(nn.Module): + """Convolutional subsampler: a stack of 1D convolution (along temporal + dimension) followed by non-linear activation via gated linear units + (https://arxiv.org/abs/1911.08460) + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__( + self, + in_channels: int, + mid_channels: int, + out_channels: int, + kernel_sizes: List[int] = (3, 3), + ): + super(Conv1dSubsampler, self).__init__() + self.n_layers = len(kernel_sizes) + self.conv_layers = nn.ModuleList( + nn.Conv1d( + in_channels if i == 0 else mid_channels // 2, + mid_channels if i < self.n_layers - 1 else out_channels * 2, + k, + stride=2, + padding=k // 2, + ) + for i, k in enumerate(kernel_sizes) + ) + + def get_out_seq_lens_tensor(self, in_seq_lens_tensor): + out = in_seq_lens_tensor.clone() + for _ in range(self.n_layers): + out = ((out.float() - 1) / 2 + 1).floor().long() + return out + + def forward(self, src_tokens, src_lengths): + bsz, in_seq_len, _ = src_tokens.size() # B x T x (C x D) + x = src_tokens.transpose(1, 2).contiguous() # -> B x (C x D) x T + for conv in self.conv_layers: + x = conv(x) + x = nn.functional.glu(x, dim=1) + _, _, out_seq_len = x.size() + x = x.transpose(1, 2).transpose(0, 1).contiguous() # -> T x B x (C x D) + return x, self.get_out_seq_lens_tensor(src_lengths) + + +@register_model("s2t_transformer") +class S2TTransformerModel(FairseqEncoderDecoderModel): + """Adapted Transformer model (https://arxiv.org/abs/1706.03762) for + speech-to-text tasks. The Transformer encoder/decoder remains the same. + A trainable input subsampler is prepended to the Transformer encoder to + project inputs into the encoder dimension as well as downsample input + sequence for computational efficiency.""" + + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # input + parser.add_argument( + "--conv-kernel-sizes", + type=str, + metavar="N", + help="kernel sizes of Conv1d subsampling layers", + ) + parser.add_argument( + "--conv-channels", + type=int, + metavar="N", + help="# of channels in Conv1d subsampling layers", + ) + # Transformer + parser.add_argument( + "--activation-fn", + type=str, + default="relu", + choices=utils.get_available_activation_fns(), + help="activation function to use", + ) + parser.add_argument( + "--dropout", type=float, metavar="D", help="dropout probability" + ) + parser.add_argument( + "--attention-dropout", + type=float, + metavar="D", + help="dropout probability for attention weights", + ) + parser.add_argument( + "--activation-dropout", + "--relu-dropout", + type=float, + metavar="D", + help="dropout probability after activation in FFN.", + ) + parser.add_argument( + "--encoder-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension", + ) + parser.add_argument( + "--encoder-ffn-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension for FFN", + ) + parser.add_argument( + "--encoder-layers", type=int, metavar="N", help="num encoder layers" + ) + parser.add_argument( + "--encoder-attention-heads", + type=int, + metavar="N", + help="num encoder attention heads", + ) + parser.add_argument( + "--encoder-normalize-before", + action="store_true", + help="apply layernorm before each encoder block", + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-ffn-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension for FFN", + ) + parser.add_argument( + "--decoder-layers", type=int, metavar="N", help="num decoder layers" + ) + parser.add_argument( + "--decoder-attention-heads", + type=int, + metavar="N", + help="num decoder attention heads", + ) + parser.add_argument( + "--decoder-normalize-before", + action="store_true", + help="apply layernorm before each decoder block", + ) + parser.add_argument( + "--share-decoder-input-output-embed", + action="store_true", + help="share decoder input and output embeddings", + ) + parser.add_argument( + "--layernorm-embedding", + action="store_true", + help="add layernorm to embedding", + ) + parser.add_argument( + "--no-scale-embedding", + action="store_true", + help="if True, dont scale embeddings", + ) + parser.add_argument( + "--load-pretrained-encoder-from", + type=str, + metavar="STR", + help="model to take encoder weights from (for initialization)", + ) + parser.add_argument( + '--encoder-freezing-updates', + type=int, + metavar='N', + help='freeze encoder for first N updates' + ) + + @classmethod + def build_encoder(cls, args): + encoder = S2TTransformerEncoder(args) + pretraining_path = getattr(args, "load_pretrained_encoder_from", None) + if pretraining_path is not None: + if not Path(pretraining_path).exists(): + logger.warning( + f"skipped pretraining because {pretraining_path} does not exist" + ) + else: + encoder = checkpoint_utils.load_pretrained_component_from_model( + component=encoder, checkpoint=pretraining_path + ) + logger.info(f"loaded pretrained encoder from: {pretraining_path}") + return encoder + + @classmethod + def build_decoder(cls, args, task, embed_tokens): + return TransformerDecoderScriptable(args, task.target_dictionary, embed_tokens) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + def build_embedding(dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + decoder_embed_tokens = build_embedding( + task.target_dictionary, args.decoder_embed_dim + ) + encoder = cls.build_encoder(args) + decoder = cls.build_decoder(args, task, decoder_embed_tokens) + return cls(encoder, decoder) + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + # net_output['encoder_out'] is a (B, T, D) tensor + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def forward(self, src_tokens, src_lengths, prev_output_tokens): + """ + The forward method inherited from the base class has a **kwargs + argument in its input, which is not supported in torchscript. This + method overwrites the forward method definition without **kwargs. + """ + encoder_out = self.encoder(src_tokens=src_tokens, src_lengths=src_lengths) + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, encoder_out=encoder_out + ) + return decoder_out + + +class S2TTransformerEncoder(FairseqEncoder): + """Speech-to-text Transformer encoder that consists of input subsampler and + Transformer encoder.""" + + def __init__(self, args): + super().__init__(None) + + self.encoder_freezing_updates = args.encoder_freezing_updates + self.num_updates = 0 + + self.dropout_module = FairseqDropout( + p=args.dropout, module_name=self.__class__.__name__ + ) + self.embed_scale = math.sqrt(args.encoder_embed_dim) + if args.no_scale_embedding: + self.embed_scale = 1.0 + self.padding_idx = 1 + + self.subsample = Conv1dSubsampler( + args.input_feat_per_channel * args.input_channels, + args.conv_channels, + args.encoder_embed_dim, + [int(k) for k in args.conv_kernel_sizes.split(",")], + ) + + self.embed_positions = PositionalEmbedding( + args.max_source_positions, args.encoder_embed_dim, self.padding_idx + ) + + self.transformer_layers = nn.ModuleList( + [TransformerEncoderLayer(args) for _ in range(args.encoder_layers)] + ) + if args.encoder_normalize_before: + self.layer_norm = LayerNorm(args.encoder_embed_dim) + else: + self.layer_norm = None + + def _forward(self, src_tokens, src_lengths): + x, input_lengths = self.subsample(src_tokens, src_lengths) + x = self.embed_scale * x + + encoder_padding_mask = lengths_to_padding_mask(input_lengths) + positions = self.embed_positions(encoder_padding_mask).transpose(0, 1) + x += positions + x = self.dropout_module(x) + + for layer in self.transformer_layers: + x = layer(x, encoder_padding_mask) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [encoder_padding_mask] if encoder_padding_mask.any() else [], # B x T + "encoder_embedding": [], # B x T x C + "encoder_states": [], # List[T x B x C] + "src_tokens": [], + "src_lengths": [], + } + + def forward(self, src_tokens, src_lengths): + if self.num_updates < self.encoder_freezing_updates: + with torch.no_grad(): + x = self._forward(src_tokens, src_lengths) + else: + x = self._forward(src_tokens, src_lengths) + return x + + def reorder_encoder_out(self, encoder_out, new_order): + new_encoder_out = ( + [] if len(encoder_out["encoder_out"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out"]] + ) + + new_encoder_padding_mask = ( + [] if len(encoder_out["encoder_padding_mask"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"]] + ) + + new_encoder_embedding = ( + [] if len(encoder_out["encoder_embedding"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_embedding"]] + ) + + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, # T x B x C + "encoder_padding_mask": new_encoder_padding_mask, # B x T + "encoder_embedding": new_encoder_embedding, # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": [], # B x T + "src_lengths": [], # B x 1 + } + + def set_num_updates(self, num_updates): + super().set_num_updates(num_updates) + self.num_updates = num_updates + + +class TransformerDecoderScriptable(TransformerDecoder): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None + + +@register_model_architecture(model_name="s2t_transformer", arch_name="s2t_transformer") +def base_architecture(args): + args.encoder_freezing_updates = getattr(args, "encoder_freezing_updates", 0) + # Convolutional subsampler + args.conv_kernel_sizes = getattr(args, "conv_kernel_sizes", "5,5") + args.conv_channels = getattr(args, "conv_channels", 1024) + # Transformer + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 12) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", True) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", True) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", args.dropout) + args.activation_dropout = getattr(args, "activation_dropout", args.dropout) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0.0) + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + args.quant_noise_pq = getattr(args, "quant_noise_pq", 0) + + +@register_model_architecture("s2t_transformer", "s2t_transformer_s") +def s2t_transformer_s(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 256) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 256 * 8) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4) + args.dropout = getattr(args, "dropout", 0.1) + base_architecture(args) + + +@register_model_architecture("s2t_transformer", "s2t_transformer_xs") +def s2t_transformer_xs(args): + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.decoder_layers = getattr(args, "decoder_layers", 3) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 256 * 4) + args.dropout = getattr(args, "dropout", 0.3) + s2t_transformer_s(args) + + +@register_model_architecture("s2t_transformer", "s2t_transformer_sp") +def s2t_transformer_sp(args): + args.encoder_layers = getattr(args, "encoder_layers", 16) + s2t_transformer_s(args) + + +@register_model_architecture("s2t_transformer", "s2t_transformer_m") +def s2t_transformer_m(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 512 * 4) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.dropout = getattr(args, "dropout", 0.15) + base_architecture(args) + + +@register_model_architecture("s2t_transformer", "s2t_transformer_mp") +def s2t_transformer_mp(args): + args.encoder_layers = getattr(args, "encoder_layers", 16) + s2t_transformer_m(args) + + +@register_model_architecture("s2t_transformer", "s2t_transformer_l") +def s2t_transformer_l(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 1024 * 4) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.2) + base_architecture(args) + + +@register_model_architecture("s2t_transformer", "s2t_transformer_lp") +def s2t_transformer_lp(args): + args.encoder_layers = getattr(args, "encoder_layers", 16) + s2t_transformer_l(args) diff --git a/SpeechT5/fairseq/fairseq/models/speech_to_text/utils.py b/SpeechT5/fairseq/fairseq/models/speech_to_text/utils.py new file mode 100644 index 0000000..573f853 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/speech_to_text/utils.py @@ -0,0 +1,564 @@ +#!/usr/bin/env python3 +# Copyright (c) 2017-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the LICENSE file in +# the root directory of this source tree. An additional grant of patent rights +# can be found in the PATENTS file in the same directory. + + +import logging +from collections.abc import Iterable +from itertools import repeat +from typing import List, Optional, Tuple + +import torch +from torch import Tensor + + +# ------------------------------------------------------------------------------ +# assert_equal() +# ------------------------------------------------------------------------------ + + +def assert_equal(value1, value2, name1=None, name2=None): + """Asserts two values are equal otherwise raise an error.""" + + str_name1 = "" if name1 is None else "{} ".format(name1) + str_name2 = "" if name2 is None else "{} ".format(name2) + if value1 != value2: + str_value1 = "{}" if name1 is None else "({})" + str_value1 = str_value1.format(value1) + str_value2 = "{}" if name2 is None else "({})" + str_value2 = str_value2.format(value2) + raise ValueError( + "Expected {}{} == {}{}".format(str_name1, str_value1, str_name2, str_value2) + ) + + +def fill_config(config, key, value): + if value is not None: + if key not in config or config[key] is None: + config[key] = value + assert_equal(value, config[key], "value", f'config["{key}"]') + + +# ------------------------------------------------------------------------------ +# check_and_return_expected() +# ------------------------------------------------------------------------------ + + +def check_and_return_expected(value, undefined_value, expected_value, name=None): + """ + Return the expected value while checking if the given value is undefined or + equal to the expected value. + """ + if (undefined_value is None and value is None) or (undefined_value == value): + return expected_value + if value != expected_value: + str_name = "" if name is None else "{} ".format(name) + str_value = "{}" if name is None else "({})" + str_value = str_value.format(value) + raise ValueError( + "Expected {}{} == {}".format(str_name, str_value, expected_value) + ) + return expected_value + + +# ------------------------------------------------------------------------------ +# get_time_axis() +# ------------------------------------------------------------------------------ + + +def get_time_axis(layout): + """ + Extract the time axis from the layout, for example for breaking sequence into + segments. + """ + if layout in ["TB", "TBD"]: + return 0 + if layout in ["BT", "BTD"]: + return 1 + if layout in ["BCTD"]: + return 2 + raise ValueError("Unsupported layout = {}".format(layout)) + + +# ------------------------------------------------------------------------------ +# get_batch_axis() +# ------------------------------------------------------------------------------ + + +def get_batch_axis(layout): + """ + Extract the batch axis from the layout + """ + if layout in ["TB", "TBD"]: + return 1 + if layout in ["BT", "BTD", "BCTD"]: + return 0 + raise ValueError("Unsupported layout = {}".format(layout)) + + +# ------------------------------------------------------------------------------ +# monotonically_increasing_and_bounded() +# ------------------------------------------------------------------------------ + + +def monotonically_increasing_and_bounded(iterable, min=None, max=None): + """ + Check if the elements in the given iterable are monotonically increasing and + bounded by upper/lower bounds. + """ + if not isinstance(iterable, Iterable): + raise TypeError( + "Expected iterable to be of type Iterable, got ({})".format( + iterable.__class__.__name__ + ) + ) + for i in range(len(iterable)): + if min is not None and iterable[i] < min: + return False + if max is not None and iterable[i] > max: + return False + if i > 0 and iterable[i] <= iterable[i - 1]: + return False + return True + + +# ------------------------------------------------------------------------------ +# to_pair() +# ------------------------------------------------------------------------------ + + +def to_pair(value, name): + """Make a pair (of type tuple) of given value.""" + if isinstance(value, Iterable): + if len(value) != 2: + raise ValueError( + "Expected `{}` to have exactly 2 elements, got: ({})".format( + name, value + ) + ) + return value + return tuple(repeat(value, 2)) + + +# ------------------------------------------------------------------------------ +# infer_conv_output_attrs() +# ------------------------------------------------------------------------------ + + +# TODO(cfyeh): figure out if we can get `output_dim` without calling the module. +def infer_conv_output_attrs( + module, input_channels, input_dim, batch_size=1, max_length=8 +): + """Get output attributes of a module with input.""" + input = torch.randn(batch_size, input_channels, max_length, input_dim) + output = module(input) + output_channels = output.shape[1] + output_dim = output.shape[-1] + return output_channels, output_dim + + +# ------------------------------------------------------------------------------ +# NoOp +# ------------------------------------------------------------------------------ + + +class NoOp(torch.nn.Module): + """ + NoOp simply passes the input as the output. + """ + + def __init__(self): + super().__init__() + + def forward(self, input: Tensor) -> Tensor: + return input + + +# ------------------------------------------------------------------------------ +# Permute: a torch.nn.Module applies permutation on the input tensor. +# ------------------------------------------------------------------------------ + + +class Permute(torch.nn.Module): + def __init__(self, dims): + super().__init__() + self.dims = dims + + def forward(self, input: Tensor) -> Tensor: + return input.permute(self.dims).contiguous() + + +# ------------------------------------------------------------------------------ +# lengths_to_padding_mask() +# ------------------------------------------------------------------------------ + + +def lengths_to_padding_mask(lengths: Tensor) -> Tensor: + """Convert lengths of shape (B, ) to padding mask.""" + batch_size = lengths.shape[0] + max_length = int(torch.max(lengths).item()) + padding_mask = torch.arange( # [0, ..., T-1] + max_length, device=lengths.device, dtype=lengths.dtype + ).expand(batch_size, max_length) >= lengths.unsqueeze(1) + + return padding_mask + + +# ------------------------------------------------------------------------------ +# lengths_to_attention_mask() +# ------------------------------------------------------------------------------ + + +def lengths_to_attention_mask( + lengths: Tensor, + left_context: Optional[int] = None, + right_context: Optional[int] = None, +) -> Optional[Tensor]: + """ + Generate attention mask based on (lengths, left_context, right_context). + left_context is None means unlimited left context. + right_context is None means unlimited right context. + """ + + if left_context is None and right_context is None: + return None + + max_length = int(torch.max(lengths).item()) + + # For example, with `max_length` == 5, + # indices = tensor([ + # [ 0, 1, 2, 3, 4, 5], + # [-1, 0, 1, 2, 3, 4], + # [-2, -1, 0, 1, 2, 3], + # [-3, -2, -1, 0, 1, 2], + # [-4, -3, -2, -1, 0, 1], + # [-5, -4, -3, -2, -1, 0], + # ]) + + # In some cases the second torch.arange is created on cpu which causes a + # failure. Adding the device option to guard against it. + indices = torch.arange( + max_length, device=lengths.device, dtype=lengths.dtype + ).expand(max_length, max_length) - torch.arange( + max_length, device=lengths.device + ).view( + max_length, -1 + ) + + # For example, with `max_length` == 5, + # bool_mask = tensor([ + # [True, True, True, True, True], + # [True, True, True, True, True], + # [True, True, True, True, True], + # [True, True, True, True, True], + # [True, True, True, True, True], + # ]) + bool_mask = ( + torch.tensor([True]).to(device=lengths.device).expand(max_length, max_length) + ) + + # For example, with `max_length` == 5, left_context == 2 + # left_mask = tensor([ + # [ True, True, True, True, True], + # [ True, True, True, True, True], + # [ True, True, True, True, True], + # [False, True, True, True, True], + # [False, False, True, True, True], + # ]) + if left_context is not None: + left_mask = indices >= -left_context + bool_mask = bool_mask & left_mask + + # For example, with `max_length` == 5, right_context == 1 + # right_mask = tensor([ + # [True, True, False, False, False], + # [True, True, True, False, False], + # [True, True, True, True, False], + # [True, True, True, True, True], + # [True, True, True, True, True], + # ]) + if right_context is not None: + right_mask = indices <= right_context + bool_mask = bool_mask & right_mask + + bool_mask = (~bool_mask).to(device=lengths.device) + return bool_mask + + +# ------------------------------------------------------------------------------ +# infer_output_norm() +# ------------------------------------------------------------------------------ + + +def infer_output_norm(module, output_norm=None): + """ + Infer the output norm (string and module) needed on the module gvien desired + output normalization. + """ + if output_norm == module.output_norm(): + # output_norm already matches module.output_norm(). + return (None, NoOp()) + + if output_norm is None and module.output_norm() is not None: + logger = logging.getLogger("infer_output_norm()") + logger.warning( + "trying to set output_norm ({}) ".format(output_norm) + + "but got module.output_norm() ({}), ".format(module.output_norm()) + + "the combined output_norm() will be ({})".format(module.output_norm()) + ) + return (None, NoOp()) + + if output_norm == "log_softmax": + if module.output_norm() is not None: + raise ValueError( + "incompatible output_norm ({}) ".format(output_norm) + + "and module.output_norm() ({})".format(module.output_norm()) + ) + else: + return ("log_softmax", torch.nn.LogSoftmax(dim=-1)) + + if output_norm == "softmax": + if module.output_norm() is not None: + raise ValueError( + "incompatible output_norm ({}) ".format(output_norm) + + "and module.output_norm() ({})".format(module.output_norm()) + ) + else: + return ("softmax", torch.nn.Softmax(dim=-1)) + + raise ValueError( + "output_norm ({}) not in ".format(output_norm) + + "supported list = [None, softmax, log_softmax]" + ) + + +# ------------------------------------------------------------------------------ +# infer_channels_from_layout() +# ------------------------------------------------------------------------------ + + +def infer_channels_from_layout(layout, channels): + """Extract the number of channels from the layout.""" + if layout in ("TBD", "BTD"): + if channels is not None and channels != 1: + raise ValueError( + "Expected channels ({}) to be 1 for layout = {}".format( + channels, layout + ) + ) + if channels is None: + return 1 + return channels + + +# ------------------------------------------------------------------------------ +# pad_sequence() +# ------------------------------------------------------------------------------ + + +@torch.jit.export +def pad_sequence( + sequence: Tensor, + time_axis: int, + extra_left_context: int = 0, + extra_right_context: int = 0, +) -> Tensor: + """Pad extra left/right contexts to the sequence.""" + + if extra_left_context == 0 and extra_right_context == 0: + return sequence + + tensors_to_concat = [] + + if extra_left_context: + size = (extra_left_context,) + fill_value = 0 + indices = torch.full( + size=size, + fill_value=fill_value, + dtype=torch.long, + device=sequence.device, + ) + left_padding = torch.index_select(sequence, time_axis, indices) + tensors_to_concat.append(left_padding) + + tensors_to_concat.append(sequence) + + # NOTE(cfyeh): for efficiency reason we pad 0 instead of the last frame for + # extra right contexts. + if extra_right_context: + size = list(sequence.shape) + size[time_axis] = extra_right_context + right_padding = torch.zeros(size, dtype=sequence.dtype, device=sequence.device) + tensors_to_concat.append(right_padding) + + padded_sequence = torch.cat(tensors_to_concat, dim=time_axis) + return padded_sequence + + +# ------------------------------------------------------------------------------ +# sequence_to_segments() +# ------------------------------------------------------------------------------ + + +@torch.jit.export +def sequence_to_segments( + sequence: Tensor, + time_axis: int, + lengths: Tensor, + segment_size: Optional[int] = None, + extra_left_context: int = 0, + extra_right_context: int = 0, +) -> List[Tuple[Tensor, Tensor]]: + """Breaks sequence into segments.""" + + sequence = pad_sequence( + sequence=sequence, + time_axis=time_axis, + extra_left_context=extra_left_context, + extra_right_context=extra_right_context, + ) + + lengths = lengths + extra_left_context + extra_right_context + + segments: List[Tuple[Tensor, Tensor]] = [] + + if segment_size is None: + segments.append((sequence, lengths)) + return segments + + offset = 0 + end = sequence.shape[time_axis] + step = segment_size + size = extra_left_context + segment_size + extra_right_context + + while offset + extra_left_context + extra_right_context < end: + clamped_size = min(size, end - offset) + segment_lengths = torch.clamp(lengths - offset, min=0, max=clamped_size) + indices = torch.arange( + start=offset, + end=(offset + clamped_size), + step=1, + dtype=torch.long, + device=sequence.device, + ) + segment_tensor = torch.index_select(sequence, time_axis, indices) + segments.append((segment_tensor, segment_lengths)) + offset = offset + step + + return segments + + +# ------------------------------------------------------------------------------ +# segments_to_sequence() +# ------------------------------------------------------------------------------ + + +@torch.jit.export +def segments_to_sequence( + segments: List[Tuple[Tensor, Tensor]], time_axis: int +) -> Tuple[Tensor, Tensor]: + """Concatenate segments into a full sequence.""" + if len(segments) == 1: + return segments[0] + + tensors_to_concat: List[Tensor] = [] + lengths_to_stack: List[Tensor] = [] + + for tensor, lengths in segments: + tensors_to_concat.append(tensor) + lengths_to_stack.append(lengths) + + sequence = torch.cat(tensors_to_concat, dim=time_axis) + lengths = torch.stack(lengths_to_stack, dim=0) + lengths = torch.sum(lengths, dim=0) + + return sequence, lengths + + +def lengths_to_encoder_padding_mask(lengths, batch_first: bool = False): + """ + convert lengths (a 1-D Long/Int tensor) to 2-D binary tensor + + Args: + lengths: a (B, )-shaped tensor + batch_first: whether to return a (B, T) tensor + + Return: + max_length: maximum length of B sequences + encoder_padding_mask: a (max_length, B) binary mask, where + [t, b] = False for t < lengths[b] and True otherwise + + TODO: + kernelize this function if benchmarking shows this function is slow + """ + max_lengths = torch.max(lengths).item() + bsz = lengths.size(0) + encoder_padding_mask = torch.arange( + max_lengths + ).to( # a (T, ) tensor with [0, ..., T-1] + lengths.device + ).view( # move to the right device + 1, max_lengths + ).expand( # reshape to (1, T)-shaped tensor + bsz, -1 + ) > lengths.view( # expand to (B, T)-shaped tensor + bsz, 1 + ).expand( + -1, max_lengths + ) + if not batch_first: + return encoder_padding_mask.t(), max_lengths + else: + return encoder_padding_mask, max_lengths + + +# ------------------------------------------------------------------------------ +# attention suppression +# ------------------------------------------------------------------------------ + + +def attention_suppression(attention_weights: Tensor, scale: float): + # B, H, qlen, klen -> B, H, qlen, 1 + attention_prob = torch.nn.functional.softmax(attention_weights.float(), dim=-1) + attention_nozeros = attention_prob.to(torch.bool) + nozeros_sum = torch.sum(attention_nozeros.to(torch.float), dim=-1, keepdim=True) + + # For very sparse situation, we need get round about 0s + key_sum = torch.sum(attention_prob, dim=-1, keepdim=True) + + # nozeros_sum should > 1 + key_mean = key_sum / (nozeros_sum + 1e-8) + + # std calculation + dis = (attention_prob - key_mean) * (attention_prob - key_mean) + + # if attention_prob[i] < threshold, then dis_masked[i] = 0; for all i + dis_masked = torch.where( + attention_nozeros, dis, attention_prob.new_zeros(attention_prob.size()) + ) + + key_var = torch.sum(dis_masked, dim=-1, keepdim=True) + key_var = key_var / (nozeros_sum - 1.0 + 1e-8) + key_std = torch.sqrt(key_var) + key_thread = key_mean - scale * key_std + + # if attention_prob[i] >= key_thread, then attention_prob[i] + # , otherwise "-inf" + inf_tensor = attention_prob.new_zeros(attention_prob.size()).detach() + inf_tensor[:] = float("-inf") + attention_weights_float = torch.where( + attention_prob < key_thread, + inf_tensor, + attention_weights.float(), + ) + + return attention_weights_float.type_as(attention_weights) + + +def layer_norm_backward_hook(module, grad_input, grad_output, clamp_value): + return tuple(torch.clamp(v, min=-clamp_value, max=clamp_value) for v in grad_input) diff --git a/SpeechT5/fairseq/fairseq/models/transformer.py b/SpeechT5/fairseq/fairseq/models/transformer.py new file mode 100644 index 0000000..f4f6bea --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/transformer.py @@ -0,0 +1,1187 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Any, Dict, List, Optional, Tuple + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, + register_model_architecture, +) +from fairseq.modules import ( + AdaptiveSoftmax, + BaseLayer, + FairseqDropout, + LayerDropModuleList, + LayerNorm, + PositionalEmbedding, + SinusoidalPositionalEmbedding, + TransformerDecoderLayer, + TransformerEncoderLayer, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor + + +DEFAULT_MAX_SOURCE_POSITIONS = 1024 +DEFAULT_MAX_TARGET_POSITIONS = 1024 + + +DEFAULT_MIN_PARAMS_TO_WRAP = int(1e8) + + +@register_model("transformer") +class TransformerModel(FairseqEncoderDecoderModel): + """ + Transformer model from `"Attention Is All You Need" (Vaswani, et al, 2017) + <https://arxiv.org/abs/1706.03762>`_. + + Args: + encoder (TransformerEncoder): the encoder + decoder (TransformerDecoder): the decoder + + The Transformer model provides the following named architectures and + command-line arguments: + + .. argparse:: + :ref: fairseq.models.transformer_parser + :prog: + """ + + @classmethod + def hub_models(cls): + # fmt: off + + def moses_subword(path): + return { + 'path': path, + 'tokenizer': 'moses', + 'bpe': 'subword_nmt', + } + + def moses_fastbpe(path): + return { + 'path': path, + 'tokenizer': 'moses', + 'bpe': 'fastbpe', + } + + def spm(path): + return { + 'path': path, + 'bpe': 'sentencepiece', + 'tokenizer': 'space', + } + + return { + 'transformer.wmt14.en-fr': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/wmt14.en-fr.joined-dict.transformer.tar.bz2'), + 'transformer.wmt16.en-de': 'https://dl.fbaipublicfiles.com/fairseq/models/wmt16.en-de.joined-dict.transformer.tar.bz2', + 'transformer.wmt18.en-de': moses_subword('https://dl.fbaipublicfiles.com/fairseq/models/wmt18.en-de.ensemble.tar.gz'), + 'transformer.wmt19.en-de': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-de.joined-dict.ensemble.tar.gz'), + 'transformer.wmt19.en-ru': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-ru.ensemble.tar.gz'), + 'transformer.wmt19.de-en': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.de-en.joined-dict.ensemble.tar.gz'), + 'transformer.wmt19.ru-en': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.ru-en.ensemble.tar.gz'), + 'transformer.wmt19.en-de.single_model': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-de.joined-dict.single_model.tar.gz'), + 'transformer.wmt19.en-ru.single_model': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.en-ru.single_model.tar.gz'), + 'transformer.wmt19.de-en.single_model': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.de-en.joined-dict.single_model.tar.gz'), + 'transformer.wmt19.ru-en.single_model': moses_fastbpe('https://dl.fbaipublicfiles.com/fairseq/models/wmt19.ru-en.single_model.tar.gz'), + 'transformer.wmt20.en-ta': spm('https://dl.fbaipublicfiles.com/fairseq/models/wmt20.en-ta.single.tar.gz'), + 'transformer.wmt20.en-iu.news': spm('https://dl.fbaipublicfiles.com/fairseq/models/wmt20.en-iu.news.single.tar.gz'), + 'transformer.wmt20.en-iu.nh': spm('https://dl.fbaipublicfiles.com/fairseq/models/wmt20.en-iu.nh.single.tar.gz'), + 'transformer.wmt20.ta-en': spm('https://dl.fbaipublicfiles.com/fairseq/models/wmt20.ta-en.single.tar.gz'), + 'transformer.wmt20.iu-en.news': spm('https://dl.fbaipublicfiles.com/fairseq/models/wmt20.iu-en.news.single.tar.gz'), + 'transformer.wmt20.iu-en.nh': spm('https://dl.fbaipublicfiles.com/fairseq/models/wmt20.iu-en.nh.single.tar.gz'), + 'transformer.flores101.mm100.615M': spm('https://dl.fbaipublicfiles.com/flores101/pretrained_models/flores101_mm100_615M.tar.gz'), + 'transformer.flores101.mm100.175M': spm('https://dl.fbaipublicfiles.com/flores101/pretrained_models/flores101_mm100_175M.tar.gz'), + } + # fmt: on + + def __init__(self, args, encoder, decoder): + super().__init__(encoder, decoder) + self.args = args + self.supports_align_args = True + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--activation-fn', + choices=utils.get_available_activation_fns(), + help='activation function to use') + parser.add_argument('--dropout', type=float, metavar='D', + help='dropout probability') + parser.add_argument('--attention-dropout', type=float, metavar='D', + help='dropout probability for attention weights') + parser.add_argument('--activation-dropout', '--relu-dropout', type=float, metavar='D', + help='dropout probability after activation in FFN.') + parser.add_argument('--encoder-embed-path', type=str, metavar='STR', + help='path to pre-trained encoder embedding') + parser.add_argument('--encoder-embed-dim', type=int, metavar='N', + help='encoder embedding dimension') + parser.add_argument('--encoder-ffn-embed-dim', type=int, metavar='N', + help='encoder embedding dimension for FFN') + parser.add_argument('--encoder-layers', type=int, metavar='N', + help='num encoder layers') + parser.add_argument('--encoder-attention-heads', type=int, metavar='N', + help='num encoder attention heads') + parser.add_argument('--encoder-normalize-before', action='store_true', + help='apply layernorm before each encoder block') + parser.add_argument('--encoder-learned-pos', action='store_true', + help='use learned positional embeddings in the encoder') + parser.add_argument('--decoder-embed-path', type=str, metavar='STR', + help='path to pre-trained decoder embedding') + parser.add_argument('--decoder-embed-dim', type=int, metavar='N', + help='decoder embedding dimension') + parser.add_argument('--decoder-ffn-embed-dim', type=int, metavar='N', + help='decoder embedding dimension for FFN') + parser.add_argument('--decoder-layers', type=int, metavar='N', + help='num decoder layers') + parser.add_argument('--decoder-attention-heads', type=int, metavar='N', + help='num decoder attention heads') + parser.add_argument('--decoder-learned-pos', action='store_true', + help='use learned positional embeddings in the decoder') + parser.add_argument('--decoder-normalize-before', action='store_true', + help='apply layernorm before each decoder block') + parser.add_argument('--decoder-output-dim', type=int, metavar='N', + help='decoder output dimension (extra linear layer ' + 'if different from decoder embed dim') + parser.add_argument('--share-decoder-input-output-embed', action='store_true', + help='share decoder input and output embeddings') + parser.add_argument('--share-all-embeddings', action='store_true', + help='share encoder, decoder and output embeddings' + ' (requires shared dictionary and embed dim)') + parser.add_argument('--no-token-positional-embeddings', default=False, action='store_true', + help='if set, disables positional embeddings (outside self attention)') + parser.add_argument('--adaptive-softmax-cutoff', metavar='EXPR', + help='comma separated list of adaptive softmax cutoff points. ' + 'Must be used with adaptive_loss criterion'), + parser.add_argument('--adaptive-softmax-dropout', type=float, metavar='D', + help='sets adaptive softmax dropout for the tail projections') + parser.add_argument('--layernorm-embedding', action='store_true', + help='add layernorm to embedding') + parser.add_argument('--no-scale-embedding', action='store_true', + help='if True, dont scale embeddings') + parser.add_argument('--checkpoint-activations', action='store_true', + help='checkpoint activations at each layer, which saves GPU ' + 'memory usage at the cost of some additional compute') + parser.add_argument('--offload-activations', action='store_true', + help='checkpoint activations at each layer, then save to gpu. Sets --checkpoint-activations.') + # args for "Cross+Self-Attention for Transformer Models" (Peitz et al., 2019) + parser.add_argument('--no-cross-attention', default=False, action='store_true', + help='do not perform cross-attention') + parser.add_argument('--cross-self-attention', default=False, action='store_true', + help='perform cross+self-attention') + # args for "Reducing Transformer Depth on Demand with Structured Dropout" (Fan et al., 2019) + parser.add_argument('--encoder-layerdrop', type=float, metavar='D', default=0, + help='LayerDrop probability for encoder') + parser.add_argument('--decoder-layerdrop', type=float, metavar='D', default=0, + help='LayerDrop probability for decoder') + parser.add_argument('--encoder-layers-to-keep', default=None, + help='which layers to *keep* when pruning as a comma-separated list') + parser.add_argument('--decoder-layers-to-keep', default=None, + help='which layers to *keep* when pruning as a comma-separated list') + # args for Training with Quantization Noise for Extreme Model Compression ({Fan*, Stock*} et al., 2020) + parser.add_argument('--quant-noise-pq', type=float, metavar='D', default=0, + help='iterative PQ quantization noise at training time') + parser.add_argument('--quant-noise-pq-block-size', type=int, metavar='D', default=8, + help='block size of quantization noise at training time') + parser.add_argument('--quant-noise-scalar', type=float, metavar='D', default=0, + help='scalar quantization noise and scalar quantization at training time') + # args for Fully Sharded Data Parallel (FSDP) training + parser.add_argument( + '--min-params-to-wrap', type=int, metavar='D', default=DEFAULT_MIN_PARAMS_TO_WRAP, + help=( + 'minimum number of params for a layer to be wrapped with FSDP() when ' + 'training with --ddp-backend=fully_sharded. Smaller values will ' + 'improve memory efficiency, but may make torch.distributed ' + 'communication less efficient due to smaller input sizes. This option ' + 'is set to 0 (i.e., always wrap) when --checkpoint-activations or ' + '--offload-activations are passed.' + ) + ) + # fmt: on + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + if args.encoder_layers_to_keep: + args.encoder_layers = len(args.encoder_layers_to_keep.split(",")) + if args.decoder_layers_to_keep: + args.decoder_layers = len(args.decoder_layers_to_keep.split(",")) + + if getattr(args, "max_source_positions", None) is None: + args.max_source_positions = DEFAULT_MAX_SOURCE_POSITIONS + if getattr(args, "max_target_positions", None) is None: + args.max_target_positions = DEFAULT_MAX_TARGET_POSITIONS + + src_dict, tgt_dict = task.source_dictionary, task.target_dictionary + + if args.share_all_embeddings: + if src_dict != tgt_dict: + raise ValueError("--share-all-embeddings requires a joined dictionary") + if args.encoder_embed_dim != args.decoder_embed_dim: + raise ValueError( + "--share-all-embeddings requires --encoder-embed-dim to match --decoder-embed-dim" + ) + if args.decoder_embed_path and ( + args.decoder_embed_path != args.encoder_embed_path + ): + raise ValueError( + "--share-all-embeddings not compatible with --decoder-embed-path" + ) + encoder_embed_tokens = cls.build_embedding( + args, src_dict, args.encoder_embed_dim, args.encoder_embed_path + ) + decoder_embed_tokens = encoder_embed_tokens + args.share_decoder_input_output_embed = True + else: + encoder_embed_tokens = cls.build_embedding( + args, src_dict, args.encoder_embed_dim, args.encoder_embed_path + ) + decoder_embed_tokens = cls.build_embedding( + args, tgt_dict, args.decoder_embed_dim, args.decoder_embed_path + ) + if getattr(args, "offload_activations", False): + args.checkpoint_activations = True # offloading implies checkpointing + encoder = cls.build_encoder(args, src_dict, encoder_embed_tokens) + decoder = cls.build_decoder(args, tgt_dict, decoder_embed_tokens) + if not args.share_all_embeddings: + min_params_to_wrap = getattr( + args, "min_params_to_wrap", DEFAULT_MIN_PARAMS_TO_WRAP + ) + # fsdp_wrap is a no-op when --ddp-backend != fully_sharded + encoder = fsdp_wrap(encoder, min_num_params=min_params_to_wrap) + decoder = fsdp_wrap(decoder, min_num_params=min_params_to_wrap) + return cls(args, encoder, decoder) + + @classmethod + def build_embedding(cls, args, dictionary, embed_dim, path=None): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + + emb = Embedding(num_embeddings, embed_dim, padding_idx) + # if provided, load from preloaded dictionaries + if path: + embed_dict = utils.parse_embedding(path) + utils.load_embedding(embed_dict, dictionary, emb) + return emb + + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return TransformerEncoder(args, src_dict, embed_tokens) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + return TransformerDecoder( + args, + tgt_dict, + embed_tokens, + no_encoder_attn=getattr(args, "no_cross_attention", False), + ) + + # TorchScript doesn't support optional arguments with variable length (**kwargs). + # Current workaround is to add union of all arguments in child classes. + def forward( + self, + src_tokens, + src_lengths, + prev_output_tokens, + return_all_hiddens: bool = True, + features_only: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Run the forward pass for an encoder-decoder model. + + Copied from the base class, but without ``**kwargs``, + which are not supported by TorchScript. + """ + encoder_out = self.encoder( + src_tokens, src_lengths=src_lengths, return_all_hiddens=return_all_hiddens + ) + decoder_out = self.decoder( + prev_output_tokens, + encoder_out=encoder_out, + features_only=features_only, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + src_lengths=src_lengths, + return_all_hiddens=return_all_hiddens, + ) + return decoder_out + + # Since get_normalized_probs is in the Fairseq Model which is not scriptable, + # I rewrite the get_normalized_probs from Base Class to call the + # helper function in the Base Class. + @torch.jit.export + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + """Get normalized probabilities (or log probs) from a net's output.""" + return self.get_normalized_probs_scriptable(net_output, log_probs, sample) + + +class TransformerEncoder(FairseqEncoder): + """ + Transformer encoder consisting of *args.encoder_layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, args, dictionary, embed_tokens): + self.args = args + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.encoder_layerdrop = args.encoder_layerdrop + + embed_dim = embed_tokens.embedding_dim + self.padding_idx = embed_tokens.padding_idx + self.max_source_positions = args.max_source_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if args.no_scale_embedding else math.sqrt(embed_dim) + + self.embed_positions = ( + PositionalEmbedding( + args.max_source_positions, + embed_dim, + self.padding_idx, + learned=args.encoder_learned_pos, + ) + if not args.no_token_positional_embeddings + else None + ) + export = getattr(args, "export", False) + if getattr(args, "layernorm_embedding", False): + self.layernorm_embedding = LayerNorm(embed_dim, export=export) + else: + self.layernorm_embedding = None + + if not args.adaptive_input and args.quant_noise_pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + args.quant_noise_pq, + args.quant_noise_pq_block_size, + ) + else: + self.quant_noise = None + + if self.encoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.encoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.layers.extend( + [self.build_encoder_layer(args) for i in range(args.encoder_layers)] + ) + self.num_layers = len(self.layers) + + if args.encoder_normalize_before: + self.layer_norm = LayerNorm(embed_dim, export=export) + else: + self.layer_norm = None + + def build_encoder_layer(self, args): + layer = TransformerEncoderLayer(args) + checkpoint = getattr(args, "checkpoint_activations", False) + if checkpoint: + offload_to_cpu = getattr(args, "offload_activations", False) + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = ( + getattr(args, "min_params_to_wrap", DEFAULT_MIN_PARAMS_TO_WRAP) + if not checkpoint + else 0 + ) + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward_embedding( + self, src_tokens, token_embedding: Optional[torch.Tensor] = None + ): + # embed tokens and positions + if token_embedding is None: + token_embedding = self.embed_tokens(src_tokens) + x = embed = self.embed_scale * token_embedding + if self.embed_positions is not None: + x = embed + self.embed_positions(src_tokens) + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + x = self.dropout_module(x) + if self.quant_noise is not None: + x = self.quant_noise(x) + return x, embed + + def forward( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + return self.forward_scriptable( + src_tokens, src_lengths, return_all_hiddens, token_embeddings + ) + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def forward_scriptable( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + # compute padding mask + encoder_padding_mask = src_tokens.eq(self.padding_idx) + has_pads = src_tokens.device.type == "xla" or encoder_padding_mask.any() + + x, encoder_embedding = self.forward_embedding(src_tokens, token_embeddings) + + # account for padding while computing the representation + if has_pads: + x = x * (1 - encoder_padding_mask.unsqueeze(-1).type_as(x)) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + encoder_states = [] + + if return_all_hiddens: + encoder_states.append(x) + + # encoder layers + for layer in self.layers: + x = layer( + x, encoder_padding_mask=encoder_padding_mask if has_pads else None + ) + if return_all_hiddens: + assert encoder_states is not None + encoder_states.append(x) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `forward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [encoder_padding_mask], # B x T + "encoder_embedding": [encoder_embedding], # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": [], + "src_lengths": [], + } + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if len(encoder_out["encoder_out"]) == 0: + new_encoder_out = [] + else: + new_encoder_out = [encoder_out["encoder_out"][0].index_select(1, new_order)] + if len(encoder_out["encoder_padding_mask"]) == 0: + new_encoder_padding_mask = [] + else: + new_encoder_padding_mask = [ + encoder_out["encoder_padding_mask"][0].index_select(0, new_order) + ] + if len(encoder_out["encoder_embedding"]) == 0: + new_encoder_embedding = [] + else: + new_encoder_embedding = [ + encoder_out["encoder_embedding"][0].index_select(0, new_order) + ] + + if len(encoder_out["src_tokens"]) == 0: + src_tokens = [] + else: + src_tokens = [(encoder_out["src_tokens"][0]).index_select(0, new_order)] + + if len(encoder_out["src_lengths"]) == 0: + src_lengths = [] + else: + src_lengths = [(encoder_out["src_lengths"][0]).index_select(0, new_order)] + + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, # T x B x C + "encoder_padding_mask": new_encoder_padding_mask, # B x T + "encoder_embedding": new_encoder_embedding, # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": src_tokens, # B x T + "src_lengths": src_lengths, # B x 1 + } + + def max_positions(self): + """Maximum input length supported by the encoder.""" + if self.embed_positions is None: + return self.max_source_positions + return min(self.max_source_positions, self.embed_positions.max_positions) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + print("deleting {0}".format(weights_key)) + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + for i in range(self.num_layers): + # update layer norms + self.layers[i].upgrade_state_dict_named( + state_dict, "{}.layers.{}".format(name, i) + ) + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) < 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + return state_dict + + +class TransformerDecoder(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + args, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + ): + self.args = args + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.decoder_layerdrop = args.decoder_layerdrop + self.share_input_output_embed = args.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = args.decoder_embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = args.decoder_output_dim + + self.padding_idx = embed_tokens.padding_idx + self.max_target_positions = args.max_target_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if args.no_scale_embedding else math.sqrt(embed_dim) + + if not args.adaptive_input and args.quant_noise_pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + args.quant_noise_pq, + args.quant_noise_pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + self.max_target_positions, + embed_dim, + self.padding_idx, + learned=args.decoder_learned_pos, + ) + if not args.no_token_positional_embeddings + else None + ) + export = getattr(args, "export", False) + if getattr(args, "layernorm_embedding", False): + self.layernorm_embedding = LayerNorm(embed_dim, export=export) + else: + self.layernorm_embedding = None + + self.cross_self_attention = getattr(args, "cross_self_attention", False) + + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + self.build_decoder_layer(args, no_encoder_attn) + for _ in range(args.decoder_layers) + ] + ) + self.num_layers = len(self.layers) + + if args.decoder_normalize_before and not getattr( + args, "no_decoder_final_norm", False + ): + self.layer_norm = LayerNorm(embed_dim, export=export) + else: + self.layer_norm = None + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not args.tie_adaptive_weights + else None + ) + + self.adaptive_softmax = None + self.output_projection = output_projection + if self.output_projection is None: + self.build_output_projection(args, dictionary, embed_tokens) + + def build_output_projection(self, args, dictionary, embed_tokens): + if args.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(args.adaptive_softmax_cutoff, type=int), + dropout=args.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if args.tie_adaptive_weights else None, + factor=args.adaptive_softmax_factor, + tie_proj=args.tie_adaptive_proj, + ) + elif self.share_input_output_embed: + self.output_projection = nn.Linear( + self.embed_tokens.weight.shape[1], + self.embed_tokens.weight.shape[0], + bias=False, + ) + self.output_projection.weight = self.embed_tokens.weight + else: + self.output_projection = nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + num_base_layers = getattr(args, "base_layers", 0) + for i in range(num_base_layers): + self.layers.insert( + ((i + 1) * args.decoder_layers) // (num_base_layers + 1), + BaseLayer(args), + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + layer = TransformerDecoderLayer(args, no_encoder_attn) + checkpoint = getattr(args, "checkpoint_activations", False) + if checkpoint: + offload_to_cpu = getattr(args, "offload_activations", False) + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = ( + getattr(args, "min_params_to_wrap", DEFAULT_MIN_PARAMS_TO_WRAP) + if not checkpoint + else 0 + ) + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + ) + + if not features_only: + x = self.output_layer(x) + return x, extra + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + return self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + + """ + A scriptable subclass of this class has an extract_features method and calls + super().extract_features, but super() is not supported in torchscript. A copy of + this function is made to be used in the subclass instead. + """ + + def extract_features_scriptable( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs, slen = prev_output_tokens.size() + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def output_layer(self, features): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection(features) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim])), 1 + ) + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + if f"{name}.output_projection.weight" not in state_dict: + if self.share_input_output_embed: + embed_out_key = f"{name}.embed_tokens.weight" + else: + embed_out_key = f"{name}.embed_out" + if embed_out_key in state_dict: + state_dict[f"{name}.output_projection.weight"] = state_dict[ + embed_out_key + ] + if not self.share_input_output_embed: + del state_dict[embed_out_key] + + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + + +@register_model_architecture("transformer", "transformer_tiny") +def tiny_architecture(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 64) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 64) + args.encoder_layers = getattr(args, "encoder_layers", 2) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 2) + args.decoder_layers = getattr(args, "decoder_layers", 2) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 2) + return base_architecture(args) + + +@register_model_architecture("transformer", "transformer") +def base_architecture(args): + args.encoder_embed_path = getattr(args, "encoder_embed_path", None) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 2048) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 8) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.encoder_learned_pos = getattr(args, "encoder_learned_pos", False) + args.decoder_embed_path = getattr(args, "decoder_embed_path", None) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "relu") + args.dropout = getattr(args, "dropout", 0.1) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.share_all_embeddings = getattr(args, "share_all_embeddings", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.no_cross_attention = getattr(args, "no_cross_attention", False) + args.cross_self_attention = getattr(args, "cross_self_attention", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + args.layernorm_embedding = getattr(args, "layernorm_embedding", False) + args.tie_adaptive_weights = getattr(args, "tie_adaptive_weights", False) + args.checkpoint_activations = getattr(args, "checkpoint_activations", False) + args.offload_activations = getattr(args, "offload_activations", False) + if args.offload_activations: + args.checkpoint_activations = True + args.encoder_layers_to_keep = getattr(args, "encoder_layers_to_keep", None) + args.decoder_layers_to_keep = getattr(args, "decoder_layers_to_keep", None) + args.encoder_layerdrop = getattr(args, "encoder_layerdrop", 0) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0) + args.quant_noise_pq = getattr(args, "quant_noise_pq", 0) + args.quant_noise_pq_block_size = getattr(args, "quant_noise_pq_block_size", 8) + args.quant_noise_scalar = getattr(args, "quant_noise_scalar", 0) + + +@register_model_architecture("transformer", "transformer_iwslt_de_en") +def transformer_iwslt_de_en(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 512) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 1024) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 4) + args.encoder_layers = getattr(args, "encoder_layers", 6) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 1024) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 4) + args.decoder_layers = getattr(args, "decoder_layers", 6) + base_architecture(args) + + +@register_model_architecture("transformer", "transformer_wmt_en_de") +def transformer_wmt_en_de(args): + base_architecture(args) + + +# parameters used in the "Attention Is All You Need" paper (Vaswani et al., 2017) +@register_model_architecture("transformer", "transformer_vaswani_wmt_en_de_big") +def transformer_vaswani_wmt_en_de_big(args): + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.3) + base_architecture(args) + + +@register_model_architecture("transformer", "transformer_vaswani_wmt_en_fr_big") +def transformer_vaswani_wmt_en_fr_big(args): + args.dropout = getattr(args, "dropout", 0.1) + transformer_vaswani_wmt_en_de_big(args) + + +@register_model_architecture("transformer", "transformer_wmt_en_de_big") +def transformer_wmt_en_de_big(args): + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + transformer_vaswani_wmt_en_de_big(args) + + +# default parameters used in tensor2tensor implementation +@register_model_architecture("transformer", "transformer_wmt_en_de_big_t2t") +def transformer_wmt_en_de_big_t2t(args): + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", True) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", True) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_dropout = getattr(args, "activation_dropout", 0.1) + transformer_vaswani_wmt_en_de_big(args) diff --git a/SpeechT5/fairseq/fairseq/models/transformer_align.py b/SpeechT5/fairseq/fairseq/models/transformer_align.py new file mode 100644 index 0000000..eaf585b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/transformer_align.py @@ -0,0 +1,93 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.models import register_model, register_model_architecture +from fairseq.models.transformer import ( + TransformerModel, + base_architecture, + transformer_wmt_en_de_big, +) + + +@register_model("transformer_align") +class TransformerAlignModel(TransformerModel): + """ + See "Jointly Learning to Align and Translate with Transformer + Models" (Garg et al., EMNLP 2019). + """ + + def __init__(self, encoder, decoder, args): + super().__init__(args, encoder, decoder) + self.alignment_heads = args.alignment_heads + self.alignment_layer = args.alignment_layer + self.full_context_alignment = args.full_context_alignment + + @staticmethod + def add_args(parser): + # fmt: off + super(TransformerAlignModel, TransformerAlignModel).add_args(parser) + parser.add_argument('--alignment-heads', type=int, metavar='D', + help='Number of cross attention heads per layer to supervised with alignments') + parser.add_argument('--alignment-layer', type=int, metavar='D', + help='Layer number which has to be supervised. 0 corresponding to the bottommost layer.') + parser.add_argument('--full-context-alignment', action='store_true', + help='Whether or not alignment is supervised conditioned on the full target context.') + # fmt: on + + @classmethod + def build_model(cls, args, task): + # set any default arguments + transformer_align(args) + + transformer_model = TransformerModel.build_model(args, task) + return TransformerAlignModel( + transformer_model.encoder, transformer_model.decoder, args + ) + + def forward(self, src_tokens, src_lengths, prev_output_tokens): + encoder_out = self.encoder(src_tokens, src_lengths) + return self.forward_decoder(prev_output_tokens, encoder_out) + + def forward_decoder( + self, + prev_output_tokens, + encoder_out=None, + incremental_state=None, + features_only=False, + **extra_args, + ): + attn_args = { + "alignment_layer": self.alignment_layer, + "alignment_heads": self.alignment_heads, + } + decoder_out = self.decoder(prev_output_tokens, encoder_out, **attn_args) + + if self.full_context_alignment: + attn_args["full_context_alignment"] = self.full_context_alignment + _, alignment_out = self.decoder( + prev_output_tokens, + encoder_out, + features_only=True, + **attn_args, + **extra_args, + ) + decoder_out[1]["attn"] = alignment_out["attn"] + + return decoder_out + + +@register_model_architecture("transformer_align", "transformer_align") +def transformer_align(args): + args.alignment_heads = getattr(args, "alignment_heads", 1) + args.alignment_layer = getattr(args, "alignment_layer", 4) + args.full_context_alignment = getattr(args, "full_context_alignment", False) + base_architecture(args) + + +@register_model_architecture("transformer_align", "transformer_wmt_en_de_big_align") +def transformer_wmt_en_de_big_align(args): + args.alignment_heads = getattr(args, "alignment_heads", 1) + args.alignment_layer = getattr(args, "alignment_layer", 4) + transformer_wmt_en_de_big(args) diff --git a/SpeechT5/fairseq/fairseq/models/transformer_from_pretrained_xlm.py b/SpeechT5/fairseq/fairseq/models/transformer_from_pretrained_xlm.py new file mode 100644 index 0000000..236d994 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/transformer_from_pretrained_xlm.py @@ -0,0 +1,152 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +from typing import Any, Dict + +from fairseq import checkpoint_utils +from fairseq.data.legacy.masked_lm_dictionary import MaskedLMDictionary +from fairseq.models import register_model, register_model_architecture +from fairseq.models.transformer import ( + TransformerDecoder, + TransformerEncoder, + TransformerModel, + base_architecture as transformer_base_architecture, +) + + +@register_model("transformer_from_pretrained_xlm") +class TransformerFromPretrainedXLMModel(TransformerModel): + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + TransformerModel.add_args(parser) + parser.add_argument( + "--pretrained-xlm-checkpoint", + type=str, + metavar="STR", + help="XLM model to use for initializing transformer encoder and/or decoder", + ) + parser.add_argument( + "--init-encoder-only", + action="store_true", + help="if set, don't load the XLM weights and embeddings into decoder", + ) + parser.add_argument( + "--init-decoder-only", + action="store_true", + help="if set, don't load the XLM weights and embeddings into encoder", + ) + + @classmethod + def build_model(self, args, task, cls_dictionary=MaskedLMDictionary): + assert hasattr(args, "pretrained_xlm_checkpoint"), ( + "You must specify a path for --pretrained-xlm-checkpoint to use " + "--arch transformer_from_pretrained_xlm" + ) + assert isinstance(task.source_dictionary, cls_dictionary) and isinstance( + task.target_dictionary, cls_dictionary + ), ( + "You should use a MaskedLMDictionary when using --arch " + "transformer_from_pretrained_xlm because the pretrained XLM model " + "was trained using data binarized with MaskedLMDictionary. " + "For translation, you may want to use --task " + "translation_from_pretrained_xlm" + ) + assert not ( + getattr(args, "init_encoder_only", False) + and getattr(args, "init_decoder_only", False) + ), "Only one of --init-encoder-only and --init-decoder-only can be set." + return super().build_model(args, task) + + @classmethod + def build_encoder(cls, args, src_dict, embed_tokens): + return TransformerEncoderFromPretrainedXLM(args, src_dict, embed_tokens) + + @classmethod + def build_decoder(cls, args, tgt_dict, embed_tokens): + return TransformerDecoderFromPretrainedXLM(args, tgt_dict, embed_tokens) + + +def upgrade_state_dict_with_xlm_weights( + state_dict: Dict[str, Any], pretrained_xlm_checkpoint: str +) -> Dict[str, Any]: + """ + Load XLM weights into a Transformer encoder or decoder model. + + Args: + state_dict: state dict for either TransformerEncoder or + TransformerDecoder + pretrained_xlm_checkpoint: checkpoint to load XLM weights from + + Raises: + AssertionError: If architecture (num layers, attention heads, etc.) + does not match between the current Transformer encoder or + decoder and the pretrained_xlm_checkpoint + """ + if not os.path.exists(pretrained_xlm_checkpoint): + raise IOError("Model file not found: {}".format(pretrained_xlm_checkpoint)) + + state = checkpoint_utils.load_checkpoint_to_cpu(pretrained_xlm_checkpoint) + xlm_state_dict = state["model"] + for key in xlm_state_dict.keys(): + + for search_key in ["embed_tokens", "embed_positions", "layers"]: + if search_key in key: + subkey = key[key.find(search_key) :] + assert subkey in state_dict, ( + "{} Transformer encoder / decoder " + "state_dict does not contain {}. Cannot " + "load {} from pretrained XLM checkpoint " + "{} into Transformer.".format( + str(state_dict.keys()), subkey, key, pretrained_xlm_checkpoint + ) + ) + + state_dict[subkey] = xlm_state_dict[key] + return state_dict + + +class TransformerEncoderFromPretrainedXLM(TransformerEncoder): + def __init__(self, args, dictionary, embed_tokens): + super().__init__(args, dictionary, embed_tokens) + if getattr(args, "init_decoder_only", False): + # Don't load XLM weights for encoder if --init-decoder-only + return + + assert hasattr(args, "pretrained_xlm_checkpoint"), ( + "--pretrained-xlm-checkpoint must be specified to load Transformer " + "encoder from pretrained XLM" + ) + xlm_loaded_state_dict = upgrade_state_dict_with_xlm_weights( + state_dict=self.state_dict(), + pretrained_xlm_checkpoint=args.pretrained_xlm_checkpoint, + ) + self.load_state_dict(xlm_loaded_state_dict, strict=True) + + +class TransformerDecoderFromPretrainedXLM(TransformerDecoder): + def __init__(self, args, dictionary, embed_tokens, no_encoder_attn=False): + super().__init__(args, dictionary, embed_tokens, no_encoder_attn) + if getattr(args, "init_encoder_only", False): + # Don't load XLM weights for decoder if --init-encoder-only + return + assert hasattr(args, "pretrained_xlm_checkpoint"), ( + "--pretrained-xlm-checkpoint must be specified to load Transformer " + "decoder from pretrained XLM" + ) + + xlm_loaded_state_dict = upgrade_state_dict_with_xlm_weights( + state_dict=self.state_dict(), + pretrained_xlm_checkpoint=args.pretrained_xlm_checkpoint, + ) + self.load_state_dict(xlm_loaded_state_dict, strict=True) + + +@register_model_architecture( + "transformer_from_pretrained_xlm", "transformer_from_pretrained_xlm" +) +def base_architecture(args): + transformer_base_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/transformer_lm.py b/SpeechT5/fairseq/fairseq/models/transformer_lm.py new file mode 100644 index 0000000..a546776 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/transformer_lm.py @@ -0,0 +1,544 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from dataclasses import dataclass, field +from typing import Optional + +from fairseq import options, utils +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.models import ( + FairseqLanguageModel, + register_model, + register_model_architecture, +) +from fairseq.models.transformer import ( + DEFAULT_MIN_PARAMS_TO_WRAP, Embedding, TransformerDecoder +) +from fairseq.modules import AdaptiveInput, CharacterTokenEmbedder +from omegaconf import II + + +DEFAULT_MAX_TARGET_POSITIONS = 1024 + + +@dataclass +class TransformerLanguageModelConfig(FairseqDataclass): + activation_fn: ChoiceEnum(utils.get_available_activation_fns()) = field( + default="relu", metadata={"help": "activation function to use"} + ) + dropout: float = field(default=0.1, metadata={"help": "dropout probability"}) + attention_dropout: float = field( + default=0.0, metadata={"help": "dropout probability for attention weights"} + ) + activation_dropout: float = field( + default=0.0, metadata={"help": "dropout probability after activation in FFN."} + ) + relu_dropout: float = field( + default=0.0, metadata={"help": "dropout probability after activation in FFN."} + ) + decoder_embed_dim: int = field( + default=512, metadata={"help": "decoder embedding dimension"} + ) + decoder_output_dim: int = field( + default=512, metadata={"help": "decoder output dimension"} + ) + decoder_input_dim: int = field( + default=512, metadata={"help": "decoder input dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=2048, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_layers: int = field(default=6, metadata={"help": "num decoder layers"}) + decoder_attention_heads: int = field( + default=8, metadata={"help": "num decoder attention heads"} + ) + decoder_normalize_before: bool = field( + default=False, metadata={"help": "apply layernorm before each decoder block"} + ) + no_decoder_final_norm: bool = field( + default=False, + metadata={"help": "don't add an extra layernorm after the last decoder block"}, + ) + adaptive_softmax_cutoff: Optional[str] = field( + default=None, + metadata={ + "help": "comma separated list of adaptive softmax cutoff points. " + "Must be used with adaptive_loss criterion" + }, + ) + adaptive_softmax_dropout: float = field( + default=0, + metadata={"help": "sets adaptive softmax dropout for the tail projections"}, + ) + adaptive_softmax_factor: float = field( + default=4, metadata={"help": "adaptive input factor"} + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={ + "help": "if set, disables positional embeddings (outside self attention)" + }, + ) + share_decoder_input_output_embed: bool = field( + default=False, metadata={"help": "share decoder input and output embeddings"} + ) + character_embeddings: bool = field( + default=False, + metadata={ + "help": "if set, uses character embedding convolutions to produce token embeddings" + }, + ) + character_filters: str = field( + default="[(1, 64), (2, 128), (3, 192), (4, 256), (5, 256), (6, 256), (7, 256)]", + metadata={"help": "size of character embeddings"}, + ) + character_embedding_dim: int = field( + default=4, metadata={"help": "size of character embeddings"} + ) + char_embedder_highway_layers: int = field( + default=2, + metadata={"help": "number of highway layers for character token embeddder"}, + ) + adaptive_input: bool = field( + default=False, metadata={"help": "if set, uses adaptive input"} + ) + adaptive_input_factor: float = field( + default=4, metadata={"help": "adaptive input factor"} + ) + adaptive_input_cutoff: Optional[str] = field( + default=None, + metadata={"help": "comma separated list of adaptive input cutoff points."}, + ) + tie_adaptive_weights: bool = field( + default=False, + metadata={ + "help": "if set, ties the weights of adaptive softmax and adaptive input" + }, + ) + tie_adaptive_proj: bool = field( + default=False, + metadata={ + "help": "if set, ties the projection weights of adaptive softmax and adaptive input" + }, + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "use learned positional embeddings in the decoder"}, + ) + layernorm_embedding: bool = field( + default=False, metadata={"help": "add layernorm to embedding"} + ) + no_scale_embedding: bool = field( + default=False, metadata={"help": "if True, dont scale embeddings"} + ) + checkpoint_activations: bool = field( + default=False, metadata={"help": "checkpoint activations at each layer"} + ) + offload_activations: bool = field( + default=False, + metadata={"help": "move checkpointed activations to CPU after they are used."}, + ) + # config for "Reducing Transformer Depth on Demand with Structured Dropout" (Fan et al., 2019) + decoder_layerdrop: float = field( + default=0.0, metadata={"help": "LayerDrop probability for decoder"} + ) + decoder_layers_to_keep: Optional[str] = field( + default=None, + metadata={ + "help": "which layers to *keep* when pruning as a comma-separated list" + }, + ) + # config for Training with Quantization Noise for Extreme Model Compression ({Fan*, Stock*} et al., 2020) + quant_noise_pq: float = field( + default=0.0, + metadata={"help": "iterative PQ quantization noise at training time"}, + ) + quant_noise_pq_block_size: int = field( + default=8, + metadata={"help": "block size of quantization noise at training time"}, + ) + quant_noise_scalar: float = field( + default=0.0, + metadata={ + "help": "scalar quantization noise and scalar quantization at training time" + }, + ) + # config for Fully Sharded Data Parallel (FSDP) training + min_params_to_wrap: int = field( + default=DEFAULT_MIN_PARAMS_TO_WRAP, + metadata={ + "help": ( + "minimum number of params for a layer to be wrapped with FSDP() when " + "training with --ddp-backend=fully_sharded. Smaller values will " + "improve memory efficiency, but may make torch.distributed " + "communication less efficient due to smaller input sizes. This option " + "is set to 0 (i.e., always wrap) when --checkpoint-activations or " + "--offload-activations are passed." + ) + } + ) + # config for "BASE Layers: Simplifying Training of Large, Sparse Models" + base_layers: Optional[int] = field( + default=0, metadata={"help": "number of BASE layers in total"} + ) + base_sublayers: Optional[int] = field( + default=1, metadata={"help": "number of sublayers in each BASE layer"} + ) + base_shuffle: Optional[int] = field( + default=1, metadata={"help": "shuffle tokens between workers before computing assignment"} + ) + # options from other parts of the config + add_bos_token: bool = II("task.add_bos_token") + tokens_per_sample: int = II("task.tokens_per_sample") + max_target_positions: Optional[int] = II("task.max_target_positions") + tpu: bool = II("common.tpu") + + +@register_model("transformer_lm", dataclass=TransformerLanguageModelConfig) +class TransformerLanguageModel(FairseqLanguageModel): + @classmethod + def hub_models(cls): + def moses_fastbpe(path): + return {"path": path, "tokenizer": "moses", "bpe": "fastbpe"} + + def spm(path): + return {"path": path, "tokenizer": "space", "bpe": "sentencepiece"} + + return { + "transformer_lm.gbw.adaptive_huge": "https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_gbw_huge.tar.bz2", + "transformer_lm.wiki103.adaptive": "https://dl.fbaipublicfiles.com/fairseq/models/lm/adaptive_lm_wiki103.v2.tar.bz2", + "transformer_lm.wmt19.en": moses_fastbpe( + "https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.en.tar.bz2" + ), + "transformer_lm.wmt19.de": moses_fastbpe( + "https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.de.tar.bz2" + ), + "transformer_lm.wmt19.ru": moses_fastbpe( + "https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt19.ru.tar.bz2" + ), + "transformer_lm.wmt20.en": spm( + "https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt20.en.tar.gz" + ), + "transformer_lm.wmt20.ta": spm( + "https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt20.ta.tar.gz" + ), + "transformer_lm.wmt20.iu.news": spm( + "https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt20.iu.news.tar.gz" + ), + "transformer_lm.wmt20.iu.nh": spm( + "https://dl.fbaipublicfiles.com/fairseq/models/lm/wmt20.iu.nh.tar.gz" + ), + } + + def __init__(self, decoder): + super().__init__(decoder) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + if args.decoder_layers_to_keep: + args.decoder_layers = len(args.decoder_layers_to_keep.split(",")) + + if getattr(args, "max_target_positions", None) is None: + args.max_target_positions = getattr( + args, "tokens_per_sample", DEFAULT_MAX_TARGET_POSITIONS + ) + + if args.character_embeddings: + embed_tokens = CharacterTokenEmbedder( + task.source_dictionary, + eval(args.character_filters), + args.character_embedding_dim, + args.decoder_embed_dim, + args.char_embedder_highway_layers, + ) + elif args.adaptive_input: + embed_tokens = AdaptiveInput( + len(task.source_dictionary), + task.source_dictionary.pad(), + args.decoder_input_dim, + args.adaptive_input_factor, + args.decoder_embed_dim, + options.eval_str_list(args.adaptive_input_cutoff, type=int), + args.quant_noise_pq, + args.quant_noise_pq_block_size, + ) + else: + embed_tokens = cls.build_embedding( + args, task.source_dictionary, args.decoder_input_dim + ) + + if args.tie_adaptive_weights: + assert args.adaptive_input + assert args.adaptive_input_factor == args.adaptive_softmax_factor + assert ( + args.adaptive_softmax_cutoff == args.adaptive_input_cutoff + ), "{} != {}".format( + args.adaptive_softmax_cutoff, args.adaptive_input_cutoff + ) + assert args.decoder_input_dim == args.decoder_output_dim + + decoder = TransformerDecoder( + args, task.target_dictionary, embed_tokens, no_encoder_attn=True + ) + return cls(decoder) + + @classmethod + def build_embedding(cls, args, dictionary, embed_dim, path=None): + embed_tokens = Embedding(len(dictionary), embed_dim, dictionary.pad()) + return embed_tokens + + +def base_lm_architecture(args): + # backward compatibility for older model checkpoints + if hasattr(args, "no_tie_adaptive_proj"): + # previous models defined --no-tie-adaptive-proj, so use the existence of + # that option to determine if this is an "old" model checkpoint + args.no_decoder_final_norm = True # old models always set this to True + if args.no_tie_adaptive_proj is False: + args.tie_adaptive_proj = True + if hasattr(args, "decoder_final_norm"): + args.no_decoder_final_norm = not args.decoder_final_norm + + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 2048) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.adaptive_softmax_factor = getattr(args, "adaptive_softmax_factor", 4) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.activation_fn = getattr(args, "activation_fn", "relu") + + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0) + args.decoder_layers_to_keep = getattr(args, "decoder_layers_to_keep", None) + args.quant_noise_pq = getattr(args, "quant_noise_pq", 0) + args.quant_noise_pq_block_size = getattr(args, "quant_noise_pq_block_size", 8) + args.quant_noise_scalar = getattr(args, "quant_noise_scalar", 0) + + args.base_layers = getattr(args, "base_layers", 0) + args.base_sublayers = getattr(args, "base_sublayers", 1) + args.base_shuffle = getattr(args, "base_shuffle", False) + + args.add_bos_token = getattr(args, "add_bos_token", False) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.share_decoder_input_output_embed = getattr( + args, "share_decoder_input_output_embed", False + ) + args.character_embeddings = getattr(args, "character_embeddings", False) + + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + + # Model training is not stable without this + args.decoder_normalize_before = True + args.no_decoder_final_norm = getattr(args, "no_decoder_final_norm", False) + + args.adaptive_input = getattr(args, "adaptive_input", False) + args.adaptive_input_factor = getattr(args, "adaptive_input_factor", 4) + args.adaptive_input_cutoff = getattr(args, "adaptive_input_cutoff", None) + + args.tie_adaptive_weights = getattr(args, "tie_adaptive_weights", False) + args.tie_adaptive_proj = getattr(args, "tie_adaptive_proj", False) + + args.no_scale_embedding = getattr(args, "no_scale_embedding", False) + args.layernorm_embedding = getattr(args, "layernorm_embedding", False) + args.checkpoint_activations = getattr(args, "checkpoint_activations", False) + args.offload_activations = getattr(args, "offload_activations", False) + if args.offload_activations: + args.checkpoint_activations = True + + +@register_model_architecture("transformer_lm", "transformer_lm_big") +def transformer_lm_big(args): + args.decoder_layers = getattr(args, "decoder_layers", 12) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + base_lm_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_wiki103") +@register_model_architecture("transformer_lm", "transformer_lm_baevski_wiki103") +def transformer_lm_baevski_wiki103(args): + args.decoder_layers = getattr(args, "decoder_layers", 16) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 8) + args.dropout = getattr(args, "dropout", 0.3) + args.adaptive_input = getattr(args, "adaptive_input", True) + args.tie_adaptive_weights = getattr(args, "tie_adaptive_weights", True) + args.adaptive_input_cutoff = getattr(args, "adaptive_input_cutoff", "20000,60000") + args.adaptive_softmax_cutoff = getattr( + args, "adaptive_softmax_cutoff", "20000,60000" + ) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0.2) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_dropout = getattr(args, "activation_dropout", 0.1) + args.no_decoder_final_norm = getattr(args, "no_decoder_final_norm", True) + args.tie_adaptive_proj = getattr(args, "tie_adaptive_proj", True) + transformer_lm_big(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gbw") +@register_model_architecture("transformer_lm", "transformer_lm_baevski_gbw") +def transformer_lm_baevski_gbw(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 512) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.no_decoder_final_norm = getattr(args, "no_decoder_final_norm", True) + transformer_lm_big(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt") +def transformer_lm_gpt(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 768) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 3072) + args.decoder_layers = getattr(args, "decoder_layers", 12) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 12) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt2_small") +def transformer_lm_gpt2_small(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 4096) + args.decoder_layers = getattr(args, "decoder_layers", 24) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt2_tiny") +def transformer_lm_gpt2_tiny(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 64) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 64) + args.decoder_layers = getattr(args, "decoder_layers", 2) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 1) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt2_medium") +def transformer_lm_gpt2_medium(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1280) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 5120) + args.decoder_layers = getattr(args, "decoder_layers", 36) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 20) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt2_big") +def transformer_lm_gpt2_big(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1600) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 6400) + args.decoder_layers = getattr(args, "decoder_layers", 48) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 25) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) + + +def base_gpt3_architecture(args): + args.decoder_input_dim = args.decoder_embed_dim + args.decoder_output_dim = args.decoder_embed_dim + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", args.decoder_embed_dim * 4) + # GPT-3 used learned positional embeddings, rather than sinusoidal + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", True) + args.dropout = getattr(args, "dropout", 0.0) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.activation_fn = getattr(args, "activation_fn", "gelu") + args.share_decoder_input_output_embed = True + base_lm_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_small") +def transformer_lm_gpt3_small(args): + # 125M params + args.decoder_layers = getattr(args, "decoder_layers", 12) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 768) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 12) + base_gpt3_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_medium") +def transformer_lm_gpt3_medium(args): + # 350M params + args.decoder_layers = getattr(args, "decoder_layers", 24) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1024) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + base_gpt3_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_large") +def transformer_lm_gpt3_large(args): + # 760M params + args.decoder_layers = getattr(args, "decoder_layers", 24) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1536) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + base_gpt3_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_xl") +def transformer_lm_gpt3_xl(args): + # 1.3B params + args.decoder_layers = getattr(args, "decoder_layers", 24) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 2048) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 32) + base_gpt3_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_2_7") +def transformer_lm_gpt3_2_7(args): + # 2.7B params + args.decoder_layers = getattr(args, "decoder_layers", 32) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 2560) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 32) + base_gpt3_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_6_7") +def transformer_lm_gpt3_6_7(args): + # 6.7B params + args.decoder_layers = getattr(args, "decoder_layers", 32) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 4096) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 32) + base_gpt3_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_13") +def transformer_lm_gpt3_13(args): + # 13B params + args.decoder_layers = getattr(args, "decoder_layers", 40) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 5120) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 40) + base_gpt3_architecture(args) + + +@register_model_architecture("transformer_lm", "transformer_lm_gpt3_175") +def transformer_lm_gpt3_175(args): + # 175B params + args.decoder_layers = getattr(args, "decoder_layers", 96) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 12288) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 96) + base_gpt3_architecture(args) diff --git a/SpeechT5/fairseq/fairseq/models/wav2vec/__init__.py b/SpeechT5/fairseq/fairseq/models/wav2vec/__init__.py new file mode 100644 index 0000000..06cec18 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/wav2vec/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .wav2vec import * # noqa +from .wav2vec2 import * # noqa +from .wav2vec2_asr import * # noqa diff --git a/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec.py b/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec.py new file mode 100644 index 0000000..af6604d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec.py @@ -0,0 +1,630 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +import logging +import math +from typing import Optional, Tuple +from omegaconf import II +import sys + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.models import BaseFairseqModel, register_model +from fairseq.modules import ( + Fp32GroupNorm, + Fp32LayerNorm, + GumbelVectorQuantizer, + KmeansVectorQuantizer, + TransposeLast, +) +from fairseq.tasks import FairseqTask +from fairseq.utils import buffered_arange + + +logger = logging.getLogger(__name__) + + +AGGREGATOR_CHOICES = ChoiceEnum(["cnn", "gru"]) +PROJECT_FEATURES_CHOICES = ChoiceEnum(["none", "same", "new"]) +ACTIVATION_CHOICES = ChoiceEnum(["relu", "gelu"]) +VQ_TYPE_CHOICES = ChoiceEnum(["none", "gumbel", "kmeans"]) + + +@dataclass +class Wav2VecConfig(FairseqDataclass): + prediction_steps: int = field( + default=12, metadata={"help": "number of steps ahead to predict"} + ) + sample_distance: Optional[int] = field( + default=None, + metadata={ + "help": "sample distance from target. does not work properly with cross-sampling" + }, + ) + cross_sample_negatives: int = field( + default=0, metadata={"help": "num of cross sampled negatives"} + ) + num_negatives: int = field( + default=10, metadata={"help": "num of sampled negatives"} + ) + conv_feature_layers: str = field( + default="[(512, 10, 5), (512, 8, 4), (512, 4, 2), (512, 4, 2), (512, 4, 2), (512, 1, 1), (512, 1, 1), (512, 1, 1)]", + metadata={ + "help": "convolutional feature extraction layers [(dim, kernel_size, stride), ...]" + }, + ) + conv_aggregator_layers: str = field( + default="[(512, 2, 1), (512, 3, 1), (512, 4, 1), (512, 5, 1), (512, 6, 1), (512, 7, 1), (512, 8, 1), (512, 9, 1), (512, 10, 1), (512, 11, 1), (512, 12, 1), (512, 13, 1)]", + metadata={ + "help": "convolutional aggregator layers [(dim, kernel_size, stride), ...]" + }, + ) + dropout: float = field( + default=0.0, metadata={"help": "dropout to apply within the model"} + ) + dropout_features: float = field( + default=0.0, metadata={"help": "dropout to apply to the features"} + ) + dropout_agg: float = field( + default=0.0, metadata={"help": "dropout to apply after aggregation step"} + ) + aggregator: AGGREGATOR_CHOICES = field( + default="cnn", metadata={"help": "type of aggregator to use"} + ) + gru_dim: int = field(default=512, metadata={"help": "GRU dimensionality"}) + no_conv_bias: bool = field( + default=False, metadata={"help": "if set, does not learn bias for conv layers"} + ) + agg_zero_pad: bool = field( + default=False, + metadata={"help": "if set, zero pads in aggregator instead of repl pad"}, + ) + skip_connections_feat: bool = field( + default=False, + metadata={"help": "if set, adds skip connections to the feature extractor"}, + ) + skip_connections_agg: bool = field( + default=True, + metadata={"help": "if set, adds skip connections to the aggregator"}, + ) + residual_scale: float = field( + default=0.5, metadata={"help": "scales residual by sqrt(value)"} + ) + log_compression: bool = field( + default=True, + metadata={"help": "if set, adds a log compression to feature extractor"}, + ) + balanced_classes: bool = field( + default=False, + metadata={"help": "if set, loss is scaled to balance for number of negatives"}, + ) + project_features: PROJECT_FEATURES_CHOICES = field( + default="none", + metadata={ + "help": "if not none, features are projected using the (same or new) aggregator" + }, + ) + non_affine_group_norm: bool = field( + default=False, metadata={"help": "if set, group norm is not affine"} + ) + offset: str = field( + default="auto", + metadata={ + "help": "if set to 'auto', it is computed automatically from the receptive field, else set to int value" + }, + ) + activation: ACTIVATION_CHOICES = field( + default="relu", + metadata={ + "help": "if set to 'auto', it is computed automatically from the receptive field, else set to int value" + }, + ) + vq_type: VQ_TYPE_CHOICES = field( + default="none", metadata={"help": "which type of quantizer to use"} + ) + vq_vars: int = field( + default=320, + metadata={"help": "project to this many vector quantized variables per group"}, + ) + vq_groups: int = field( + default=2, metadata={"help": "number of groups of latent variables"} + ) + vq_dim: int = field( + default=0, + metadata={ + "help": "uses this dimensionality for quantized vectors. 0 to use model dim // groups" + }, + ) + vq_depth: int = field( + default=1, metadata={"help": "number of layers for vq weight projection"} + ) + combine_groups: bool = field( + default=False, metadata={"help": "if set, variables are shared among groups"} + ) + vq_temp: Tuple[float, float, float] = field( + default=(2.0, 0.5, 0.999995), + metadata={ + "help": "temperature for latent variable sampling with gumbel softmax. should be a tuple of 3 values (start, end, decay)" + }, + ) + vq_gamma: float = field( + default=0.25, + metadata={"help": "gamma parameter for kmeans style vector quantization"}, + ) + infonce: bool = II("criterion.infonce") + + +@register_model("wav2vec", dataclass=Wav2VecConfig) +class Wav2VecModel(BaseFairseqModel): + @classmethod + def build_model(cls, cfg: Wav2VecConfig, task: FairseqTask): + """Build a new model instance.""" + + model = Wav2VecModel(cfg) + logger.info(model) + return model + + def __init__(self, cfg: Wav2VecConfig): + super().__init__() + + self.prediction_steps = cfg.prediction_steps + offset = cfg.offset + + if cfg.activation == "relu": + activation = nn.ReLU() + elif cfg.activation == "gelu": + activation = nn.GELU() + else: + raise Exception("unknown activation " + cfg.activation) + + feature_enc_layers = eval(cfg.conv_feature_layers) + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + log_compression=cfg.log_compression, + skip_connections=cfg.skip_connections_feat, + residual_scale=cfg.residual_scale, + non_affine_group_norm=cfg.non_affine_group_norm, + activation=activation, + ) + embed = feature_enc_layers[-1][0] + + self.vector_quantizer = None + if cfg.vq_type == "gumbel": + self.vector_quantizer = GumbelVectorQuantizer( + dim=embed, + num_vars=cfg.vq_vars, + temp=cfg.vq_temp, + groups=cfg.vq_groups, + combine_groups=cfg.combine_groups, + vq_dim=cfg.vq_dim if cfg.vq_dim > 0 else embed, + time_first=False, + activation=activation, + weight_proj_depth=cfg.vq_depth, + weight_proj_factor=2, + ) + elif cfg.vq_type == "kmeans": + self.vector_quantizer = KmeansVectorQuantizer( + dim=embed, + num_vars=cfg.vq_vars, + groups=cfg.vq_groups, + combine_groups=cfg.combine_groups, + vq_dim=cfg.vq_dim if cfg.vq_dim > 0 else embed, + time_first=False, + gamma=cfg.vq_gamma, + ) + else: + assert ( + cfg.vq_type == "none" or cfg.vq_type is None + ), "Unknown quantizer type" + + if cfg.offset == "auto": + jin = 0 + rin = 0 + for _, k, stride in feature_enc_layers: + if rin == 0: + rin = k + rin = rin + (k - 1) * jin + if jin == 0: + jin = stride + else: + jin *= stride + offset = math.ceil(rin / jin) + + offset = int(offset) + + def make_aggregator(): + if cfg.aggregator == "cnn": + agg_layers = eval(cfg.conv_aggregator_layers) + agg_dim = agg_layers[-1][0] + feature_aggregator = ConvAggegator( + conv_layers=agg_layers, + embed=embed, + dropout=cfg.dropout, + skip_connections=cfg.skip_connections_agg, + residual_scale=cfg.residual_scale, + non_affine_group_norm=cfg.non_affine_group_norm, + conv_bias=not cfg.no_conv_bias, + zero_pad=cfg.agg_zero_pad, + activation=activation, + ) + elif cfg.aggregator == "gru": + agg_dim = cfg.gru_dim + feature_aggregator = nn.Sequential( + TransposeLast(), + nn.GRU( + input_size=embed, + hidden_size=agg_dim, + num_layers=1, + dropout=cfg.dropout, + ), + TransposeLast(deconstruct_idx=0), + ) + else: + raise Exception("unknown aggregator type " + cfg.aggregator) + + return feature_aggregator, agg_dim + + self.feature_aggregator, agg_dim = make_aggregator() + + self.wav2vec_predictions = Wav2VecPredictionsModel( + in_dim=agg_dim, + out_dim=embed, + prediction_steps=cfg.prediction_steps, + n_negatives=cfg.num_negatives, + cross_sample_negatives=cfg.cross_sample_negatives, + sample_distance=cfg.sample_distance, + dropout=cfg.dropout, + offset=offset, + balanced_classes=cfg.balanced_classes, + infonce=cfg.infonce, + ) + + self.dropout_feats = nn.Dropout(p=cfg.dropout_features) + self.dropout_agg = nn.Dropout(p=cfg.dropout_agg) + + if cfg.project_features == "none": + self.project_features = None + elif cfg.project_features == "same": + self.project_features = self.feature_aggregator + elif cfg.project_features == "new": + self.project_features, _ = make_aggregator() + + def forward(self, source): + result = {} + + features = self.feature_extractor(source) + if self.vector_quantizer: + q_res = self.vector_quantizer(features) + features = q_res["x"] + for k in q_res.keys(): + if k != "x": + result[k] = q_res[k] + + x = self.dropout_feats(features) + x = self.feature_aggregator(x) + x = self.dropout_agg(x) + + if self.project_features is not None: + features = self.project_features(features) + x, targets = self.wav2vec_predictions(x, features) + result["cpc_logits"] = x + result["cpc_targets"] = targets + + return result + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + + def max_positions(self): + """Maximum length supported by the model.""" + return sys.maxsize + + def get_logits(self, net_output): + logits = net_output["cpc_logits"] + return logits + + def get_targets(self, sample, net_output): + t = net_output["cpc_targets"] + if isinstance(t, tuple): + t = t[0] + return t.contiguous() + + def get_target_weights(self, targets, net_output): + targets = net_output["cpc_targets"] + if isinstance(targets, tuple) and targets[-1] is not None: + return targets[-1] + return None + + def get_extra_losses(self, net_output): + loss = None + if "prob_perplexity" in net_output: + loss = net_output["num_vars"] - net_output["prob_perplexity"] + elif "kmeans_loss" in net_output: + loss = net_output["kmeans_loss"] + + return loss + + +def norm_block(is_layer_norm, dim, affine=True): + if is_layer_norm: + mod = nn.Sequential( + TransposeLast(), + Fp32LayerNorm(dim, elementwise_affine=affine), + TransposeLast(), + ) + else: + mod = Fp32GroupNorm(1, dim, affine=affine) + + return mod + + +class ConvFeatureExtractionModel(nn.Module): + def __init__( + self, + conv_layers, + dropout, + log_compression, + skip_connections, + residual_scale, + non_affine_group_norm, + activation, + ): + super().__init__() + + def block(n_in, n_out, k, stride): + return nn.Sequential( + nn.Conv1d(n_in, n_out, k, stride=stride, bias=False), + nn.Dropout(p=dropout), + norm_block( + is_layer_norm=False, dim=n_out, affine=not non_affine_group_norm + ), + activation, + ) + + in_d = 1 + self.conv_layers = nn.ModuleList() + for dim, k, stride in conv_layers: + self.conv_layers.append(block(in_d, dim, k, stride)) + in_d = dim + + self.log_compression = log_compression + self.skip_connections = skip_connections + self.residual_scale = math.sqrt(residual_scale) + + def forward(self, x): + # BxT -> BxCxT + x = x.unsqueeze(1) + + for conv in self.conv_layers: + residual = x + x = conv(x) + if self.skip_connections and x.size(1) == residual.size(1): + tsz = x.size(2) + r_tsz = residual.size(2) + residual = residual[..., :: r_tsz // tsz][..., :tsz] + x = (x + residual) * self.residual_scale + + if self.log_compression: + x = x.abs() + x = x + 1 + x = x.log() + + return x + + +class ZeroPad1d(nn.Module): + def __init__(self, pad_left, pad_right): + super().__init__() + self.pad_left = pad_left + self.pad_right = pad_right + + def forward(self, x): + return F.pad(x, (self.pad_left, self.pad_right)) + + +class ConvAggegator(nn.Module): + def __init__( + self, + conv_layers, + embed, + dropout, + skip_connections, + residual_scale, + non_affine_group_norm, + conv_bias, + zero_pad, + activation, + ): + super().__init__() + + def block(n_in, n_out, k, stride): + # padding dims only really make sense for stride = 1 + ka = k // 2 + kb = ka - 1 if k % 2 == 0 else ka + + pad = ( + ZeroPad1d(ka + kb, 0) if zero_pad else nn.ReplicationPad1d((ka + kb, 0)) + ) + + return nn.Sequential( + pad, + nn.Conv1d(n_in, n_out, k, stride=stride, bias=conv_bias), + nn.Dropout(p=dropout), + norm_block(False, n_out, affine=not non_affine_group_norm), + activation, + ) + + in_d = embed + self.conv_layers = nn.ModuleList() + self.residual_proj = nn.ModuleList() + for dim, k, stride in conv_layers: + if in_d != dim and skip_connections: + self.residual_proj.append(nn.Conv1d(in_d, dim, 1, bias=False)) + else: + self.residual_proj.append(None) + + self.conv_layers.append(block(in_d, dim, k, stride)) + in_d = dim + self.conv_layers = nn.Sequential(*self.conv_layers) + self.skip_connections = skip_connections + self.residual_scale = math.sqrt(residual_scale) + + def forward(self, x): + for rproj, conv in zip(self.residual_proj, self.conv_layers): + residual = x + x = conv(x) + if self.skip_connections: + if rproj is not None: + residual = rproj(residual) + x = (x + residual) * self.residual_scale + return x + + +class Wav2VecPredictionsModel(nn.Module): + def __init__( + self, + in_dim, + out_dim, + prediction_steps, + n_negatives, + cross_sample_negatives, + sample_distance, + dropout, + offset, + balanced_classes, + infonce, + ): + super().__init__() + + self.n_negatives = n_negatives + self.cross_sample_negatives = cross_sample_negatives + self.sample_distance = sample_distance + self.project_to_steps = nn.ConvTranspose2d( + in_dim, out_dim, (1, prediction_steps) + ) + self.dropout = nn.Dropout(p=dropout) + self.offset = offset + self.balanced_classes = balanced_classes + self.infonce = infonce + + def sample_negatives(self, y): + bsz, fsz, tsz = y.shape + + y = y.transpose(0, 1) # BCT -> CBT + y = y.contiguous().view(fsz, -1) # CBT => C(BxT) + + cross_high = tsz * bsz + high = tsz if self.sample_distance is None else min(tsz, self.sample_distance) + assert high > 1 + + neg_idxs = torch.randint(low=0, high=high, size=(bsz, self.n_negatives * tsz)) + + with torch.no_grad(): + if self.n_negatives > 0: + tszs = ( + buffered_arange(tsz) + .unsqueeze(-1) + .expand(-1, self.n_negatives) + .flatten() + ) + + neg_idxs = torch.randint( + low=0, high=high - 1, size=(bsz, self.n_negatives * tsz) + ) + neg_idxs[neg_idxs >= tszs] += 1 + + if self.cross_sample_negatives > 0: + tszs = ( + buffered_arange(tsz) + .unsqueeze(-1) + .expand(-1, self.cross_sample_negatives) + .flatten() + ) + + cross_neg_idxs = torch.randint( + low=0, + high=cross_high - 1, + size=(bsz, self.cross_sample_negatives * tsz), + ) + cross_neg_idxs[cross_neg_idxs >= tszs] += 1 + + if self.n_negatives > 0: + for i in range(1, bsz): + neg_idxs[i] += i * high + else: + neg_idxs = cross_neg_idxs + + if self.cross_sample_negatives > 0 and self.n_negatives > 0: + neg_idxs = torch.cat([neg_idxs, cross_neg_idxs], dim=1) + + negs = y[..., neg_idxs.view(-1)] + negs = negs.view( + fsz, bsz, self.n_negatives + self.cross_sample_negatives, tsz + ).permute( + 2, 1, 0, 3 + ) # to NxBxCxT + + return negs + + def forward(self, x, y): + + x = x.unsqueeze(-1) + x = self.project_to_steps(x) # BxCxTxS + x = self.dropout(x) + + negatives = self.sample_negatives(y) + y = y.unsqueeze(0) + targets = torch.cat([y, negatives], dim=0) # Copies x B x C x T + + copies = targets.size(0) + bsz, dim, tsz, steps = x.shape + steps = min(steps, tsz - self.offset) + + predictions = x.new( + bsz * copies * (tsz - self.offset + 1) * steps + - ((steps + 1) * steps // 2) * copies * bsz + ) + if self.infonce: + labels = predictions.new_full( + (predictions.shape[0] // copies,), 0, dtype=torch.long + ) + else: + labels = torch.zeros_like(predictions) + weights = ( + torch.full_like(labels, 1 / self.n_negatives) + if self.balanced_classes and not self.infonce + else None + ) + + start = end = 0 + for i in range(steps): + offset = i + self.offset + end = start + (tsz - offset) * bsz * copies + if self.infonce: + predictions[start:end] = torch.einsum( + "bct,nbct->tbn", x[..., :-offset, i], targets[..., offset:] + ).flatten() + else: + pos_num = (end - start) // copies + predictions[start:end] = torch.einsum( + "bct,nbct->nbt", x[..., :-offset, i], targets[..., offset:] + ).flatten() + labels[start : start + pos_num] = 1.0 + if weights is not None: + weights[start : start + pos_num] = 1.0 + start = end + assert end == predictions.numel(), "{} != {}".format(end, predictions.numel()) + + if self.infonce: + predictions = predictions.view(-1, copies) + else: + if weights is not None: + labels = (labels, weights) + + return predictions, labels diff --git a/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2.py b/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2.py new file mode 100644 index 0000000..714fd3a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2.py @@ -0,0 +1,1016 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass, field +from typing import List, Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.data.data_utils import compute_mask_indices +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.models import BaseFairseqModel, register_model +from fairseq.modules import ( + Fp32GroupNorm, + Fp32LayerNorm, + GradMultiply, + GumbelVectorQuantizer, + LayerNorm, + MultiheadAttention, + SamePad, + TransposeLast, +) +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.utils import buffered_arange, index_put, is_xla_tensor + + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +@dataclass +class Wav2Vec2Config(FairseqDataclass): + extractor_mode: EXTRACTOR_MODE_CHOICES = field( + default="default", + metadata={ + "help": "mode for feature extractor. default has a single group norm with d " + "groups in the first conv block, whereas layer_norm has layer norms in " + "every block (meant to use with normalize=True)" + }, + ) + encoder_layers: int = field( + default=12, metadata={"help": "num encoder layers in the transformer"} + ) + encoder_embed_dim: int = field( + default=768, metadata={"help": "encoder embedding dimension"} + ) + encoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "encoder embedding dimension for FFN"} + ) + encoder_attention_heads: int = field( + default=12, metadata={"help": "num encoder attention heads"} + ) + activation_fn: ChoiceEnum(utils.get_available_activation_fns()) = field( + default="gelu", metadata={"help": "activation function to use"} + ) + + # dropouts + dropout: float = field( + default=0.1, metadata={"help": "dropout probability for the transformer"} + ) + attention_dropout: float = field( + default=0.1, metadata={"help": "dropout probability for attention weights"} + ) + activation_dropout: float = field( + default=0.0, metadata={"help": "dropout probability after activation in FFN"} + ) + encoder_layerdrop: float = field( + default=0.0, metadata={"help": "probability of dropping a tarnsformer layer"} + ) + dropout_input: float = field( + default=0.0, + metadata={"help": "dropout to apply to the input (after feat extr)"}, + ) + dropout_features: float = field( + default=0.0, + metadata={"help": "dropout to apply to the features (after feat extr)"}, + ) + + final_dim: int = field( + default=0, + metadata={ + "help": "project final representations and targets to this many dimensions." + "set to encoder_embed_dim is <= 0" + }, + ) + layer_norm_first: bool = field( + default=False, metadata={"help": "apply layernorm first in the transformer"} + ) + conv_feature_layers: str = field( + default="[(512, 10, 5)] + [(512, 3, 2)] * 4 + [(512,2,2)] + [(512,2,2)]", + metadata={ + "help": "string describing convolutional feature extraction layers in form of a python list that contains " + "[(dim, kernel_size, stride), ...]" + }, + ) + conv_bias: bool = field( + default=False, metadata={"help": "include bias in conv encoder"} + ) + logit_temp: float = field( + default=0.1, metadata={"help": "temperature to divide logits by"} + ) + quantize_targets: bool = field( + default=False, metadata={"help": "use quantized targets"} + ) + quantize_input: bool = field( + default=False, metadata={"help": "use quantized inputs"} + ) + same_quantizer: bool = field( + default=False, metadata={"help": "use same quantizer for inputs and targets"} + ) + target_glu: bool = field( + default=False, metadata={"help": "adds projection + glu to targets"} + ) + feature_grad_mult: float = field( + default=1.0, metadata={"help": "multiply feature extractor var grads by this"} + ) + quantizer_depth: int = field( + default=1, + metadata={"help": "number of quantizer layers"}, + ) + quantizer_factor: int = field( + default=3, + metadata={ + "help": "dimensionality increase for inner quantizer layers (if depth > 1)" + }, + ) + latent_vars: int = field( + default=320, + metadata={"help": "number of latent variables V in each group of the codebook"}, + ) + latent_groups: int = field( + default=2, + metadata={"help": "number of groups G of latent variables in the codebook"}, + ) + latent_dim: int = field( + default=0, + metadata={ + "help": "if > 0, uses this dimensionality for latent variables. " + "otherwise uses final_dim / latent_groups" + }, + ) + + # masking + mask_length: int = field(default=10, metadata={"help": "mask length"}) + mask_prob: float = field( + default=0.65, metadata={"help": "probability of replacing a token with mask"} + ) + mask_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", metadata={"help": "how to choose mask length"} + ) + mask_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument (used for more complex distributions), " + "see help in compute_mask_indices" + }, + ) + no_mask_overlap: bool = field( + default=False, metadata={"help": "whether to allow masks to overlap"} + ) + mask_min_space: int = field( + default=1, + metadata={"help": "min space between spans (if no overlap is enabled)"}, + ) + + # channel masking + mask_channel_length: int = field( + default=10, metadata={"help": "length of the mask for features (channels)"} + ) + mask_channel_prob: float = field( + default=0.0, metadata={"help": "probability of replacing a feature with 0"} + ) + mask_channel_before: bool = False + mask_channel_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", + metadata={"help": "how to choose mask length for channel masking"}, + ) + mask_channel_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument (used for more complex distributions), " + "see help in compute_mask_indicesh" + }, + ) + no_mask_channel_overlap: bool = field( + default=False, metadata={"help": "whether to allow channel masks to overlap"} + ) + mask_channel_min_space: int = field( + default=1, + metadata={"help": "min space between spans (if no overlap is enabled)"}, + ) + + # negative selection + num_negatives: int = field( + default=100, + metadata={"help": "number of negative examples from the same sample"}, + ) + negatives_from_everywhere: bool = field( + default=False, + metadata={"help": "sample negatives from everywhere, not just masked states"}, + ) + cross_sample_negatives: int = field( + default=0, metadata={"help": "number of negative examples from the any sample"} + ) + codebook_negatives: int = field( + default=0, metadata={"help": "number of negative examples codebook"} + ) + + # positional embeddings + conv_pos: int = field( + default=128, + metadata={"help": "number of filters for convolutional positional embeddings"}, + ) + conv_pos_groups: int = field( + default=16, + metadata={"help": "number of groups for convolutional positional embedding"}, + ) + + latent_temp: Tuple[float, float, float] = field( + default=(2, 0.5, 0.999995), + metadata={ + "help": "temperature for latent variable sampling. " + "can be tuple of 3 values (start, end, decay)" + }, + ) + + +@register_model("wav2vec2", dataclass=Wav2Vec2Config) +class Wav2Vec2Model(BaseFairseqModel): + def __init__(self, cfg: Wav2Vec2Config): + super().__init__() + self.cfg = cfg + + feature_enc_layers = eval(cfg.conv_feature_layers) + self.embed = feature_enc_layers[-1][0] + + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + mode=cfg.extractor_mode, + conv_bias=cfg.conv_bias, + ) + + self.post_extract_proj = ( + nn.Linear(self.embed, cfg.encoder_embed_dim) + if self.embed != cfg.encoder_embed_dim and not cfg.quantize_input + else None + ) + + self.mask_prob = cfg.mask_prob + self.mask_selection = cfg.mask_selection + self.mask_other = cfg.mask_other + self.mask_length = cfg.mask_length + self.no_mask_overlap = cfg.no_mask_overlap + self.mask_min_space = cfg.mask_min_space + + self.mask_channel_prob = cfg.mask_channel_prob + self.mask_channel_before = cfg.mask_channel_before + self.mask_channel_selection = cfg.mask_channel_selection + self.mask_channel_other = cfg.mask_channel_other + self.mask_channel_length = cfg.mask_channel_length + self.no_mask_channel_overlap = cfg.no_mask_channel_overlap + self.mask_channel_min_space = cfg.mask_channel_min_space + + self.dropout_input = nn.Dropout(cfg.dropout_input) + self.dropout_features = nn.Dropout(cfg.dropout_features) + + self.feature_grad_mult = cfg.feature_grad_mult + + self.quantizer = None + self.input_quantizer = None + + self.n_negatives = cfg.num_negatives + self.cross_sample_negatives = cfg.cross_sample_negatives + self.codebook_negatives = cfg.codebook_negatives + self.negatives_from_everywhere = cfg.negatives_from_everywhere + + self.logit_temp = cfg.logit_temp + + final_dim = cfg.final_dim if cfg.final_dim > 0 else cfg.encoder_embed_dim + + if cfg.quantize_targets: + vq_dim = cfg.latent_dim if cfg.latent_dim > 0 else final_dim + self.quantizer = GumbelVectorQuantizer( + dim=self.embed, + num_vars=cfg.latent_vars, + temp=cfg.latent_temp, + groups=cfg.latent_groups, + combine_groups=False, + vq_dim=vq_dim, + time_first=True, + weight_proj_depth=cfg.quantizer_depth, + weight_proj_factor=cfg.quantizer_factor, + ) + self.project_q = nn.Linear(vq_dim, final_dim) + else: + self.project_q = nn.Linear(self.embed, final_dim) + + if cfg.quantize_input: + if cfg.same_quantizer and self.quantizer is not None: + vq_dim = final_dim + self.input_quantizer = self.quantizer + else: + vq_dim = cfg.latent_dim if cfg.latent_dim > 0 else cfg.encoder_embed_dim + self.input_quantizer = GumbelVectorQuantizer( + dim=self.embed, + num_vars=cfg.latent_vars, + temp=cfg.latent_temp, + groups=cfg.latent_groups, + combine_groups=False, + vq_dim=vq_dim, + time_first=True, + weight_proj_depth=cfg.quantizer_depth, + weight_proj_factor=cfg.quantizer_factor, + ) + self.project_inp = nn.Linear(vq_dim, cfg.encoder_embed_dim) + + self.mask_emb = nn.Parameter( + torch.FloatTensor(cfg.encoder_embed_dim).uniform_() + ) + + self.encoder = TransformerEncoder(cfg) + self.layer_norm = LayerNorm(self.embed) + + self.target_glu = None + if cfg.target_glu: + self.target_glu = nn.Sequential( + nn.Linear(final_dim, final_dim * 2), nn.GLU() + ) + + self.final_proj = nn.Linear(cfg.encoder_embed_dim, final_dim) + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + return state_dict + + @classmethod + def build_model(cls, cfg: Wav2Vec2Config, task=None): + """Build a new model instance.""" + + return cls(cfg) + + def apply_mask( + self, + x, + padding_mask, + mask_indices=None, + mask_channel_indices=None, + ): + B, T, C = x.shape + + if self.mask_channel_prob > 0 and self.mask_channel_before: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + if self.mask_prob > 0: + if mask_indices is None: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob, + self.mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x = index_put(x, mask_indices, self.mask_emb) + else: + mask_indices = None + + if self.mask_channel_prob > 0 and not self.mask_channel_before: + if mask_channel_indices is None: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x = index_put(x, mask_channel_indices, 0) + + return x, mask_indices + + def sample_negatives(self, y, num, padding_count=None): + + if self.n_negatives == 0 and self.cross_sample_negatives == 0: + return y.new(0) + + bsz, tsz, fsz = y.shape + y = y.view(-1, fsz) # BTC => (BxT)C + + # FIXME: what happens if padding_count is specified? + cross_high = tsz * bsz + high = tsz - (padding_count or 0) + with torch.no_grad(): + assert high > 1, f"{bsz,tsz,fsz}" + + if self.n_negatives > 0: + tszs = ( + buffered_arange(num) + .unsqueeze(-1) + .expand(-1, self.n_negatives) + .flatten() + ) + + neg_idxs = torch.randint( + low=0, high=high - 1, size=(bsz, self.n_negatives * num) + ) + neg_idxs[neg_idxs >= tszs] += 1 + + if self.cross_sample_negatives > 0: + tszs = ( + buffered_arange(num) + .unsqueeze(-1) + .expand(-1, self.cross_sample_negatives) + .flatten() + ) + + cross_neg_idxs = torch.randint( + low=0, + high=cross_high - 1, + size=(bsz, self.cross_sample_negatives * num), + ) + cross_neg_idxs[cross_neg_idxs >= tszs] += 1 + + if self.n_negatives > 0: + for i in range(1, bsz): + neg_idxs[i] += i * high + else: + neg_idxs = cross_neg_idxs + + if self.cross_sample_negatives > 0 and self.n_negatives > 0: + neg_idxs = torch.cat([neg_idxs, cross_neg_idxs], dim=1) + + negs = y[neg_idxs.view(-1)] + negs = negs.view( + bsz, num, self.n_negatives + self.cross_sample_negatives, fsz + ).permute( + 2, 0, 1, 3 + ) # to NxBxTxC + return negs, neg_idxs + + def compute_preds(self, x, y, negatives): + + neg_is_pos = (y == negatives).all(-1) + y = y.unsqueeze(0) + targets = torch.cat([y, negatives], dim=0) + + logits = torch.cosine_similarity(x.float(), targets.float(), dim=-1).type_as(x) + + logits = logits / self.logit_temp + + if is_xla_tensor(logits) or neg_is_pos.any(): + fillval = -float(2 ** 30) + if not hasattr(self, "_inftensor"): + self._inftensor = ( + torch.tensor(fillval).to(x.device) + if is_xla_tensor(logits) + else float("-inf") + ) + logits[1:] = index_put(logits[1:], neg_is_pos, self._inftensor) + + return logits + + def _get_feat_extract_output_lengths(self, input_lengths: torch.LongTensor): + """ + Computes the output length of the convolutional layers + """ + + def _conv_out_length(input_length, kernel_size, stride): + return torch.floor((input_length - kernel_size) / stride + 1) + + conv_cfg_list = eval(self.cfg.conv_feature_layers) + + for i in range(len(conv_cfg_list)): + input_lengths = _conv_out_length( + input_lengths, conv_cfg_list[i][1], conv_cfg_list[i][2] + ) + + return input_lengths.to(torch.long) + + def forward( + self, + source, + padding_mask=None, + mask=True, + features_only=False, + layer=None, + mask_indices=None, + mask_channel_indices=None, + padding_count=None, + ): + + if self.feature_grad_mult > 0: + features = self.feature_extractor(source) + if self.feature_grad_mult != 1.0: + features = GradMultiply.apply(features, self.feature_grad_mult) + else: + with torch.no_grad(): + features = self.feature_extractor(source) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None and padding_mask.any(): + input_lengths = (1 - padding_mask.long()).sum(-1) + # apply conv formula to get real output_lengths + output_lengths = self._get_feat_extract_output_lengths(input_lengths) + + padding_mask = torch.zeros( + features.shape[:2], dtype=features.dtype, device=features.device + ) + + # these two operations makes sure that all values + # before the output lengths indices are attended to + padding_mask[ + ( + torch.arange(padding_mask.shape[0], device=padding_mask.device), + output_lengths - 1, + ) + ] = 1 + padding_mask = (1 - padding_mask.flip([-1]).cumsum(-1).flip([-1])).bool() + else: + padding_mask = None + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + num_vars = None + code_ppl = None + prob_ppl = None + curr_temp = None + + if self.input_quantizer: + q = self.input_quantizer(features, produce_targets=False) + features = q["x"] + num_vars = q["num_vars"] + code_ppl = q["code_perplexity"] + prob_ppl = q["prob_perplexity"] + curr_temp = q["temp"] + features = self.project_inp(features) + + if mask: + x, mask_indices = self.apply_mask( + features, + padding_mask, + mask_indices=mask_indices, + mask_channel_indices=mask_channel_indices, + ) + if not is_xla_tensor(x) and mask_indices is not None: + # tpu-comment: reducing the size in a dynamic way causes + # too many recompilations on xla. + y = unmasked_features[mask_indices].view( + unmasked_features.size(0), -1, unmasked_features.size(-1) + ) + else: + y = unmasked_features + else: + x = features + y = unmasked_features + mask_indices = None + + x, layer_results = self.encoder(x, padding_mask=padding_mask, layer=layer) + + if features_only: + return { + "x": x, + "padding_mask": padding_mask, + "features": unmasked_features, + "layer_results": layer_results, + } + + if self.quantizer: + q = self.quantizer(y, produce_targets=False) + y = q["x"] + num_vars = q["num_vars"] + code_ppl = q["code_perplexity"] + prob_ppl = q["prob_perplexity"] + curr_temp = q["temp"] + + y = self.project_q(y) + + if self.negatives_from_everywhere: + neg_cands = self.quantizer(unmasked_features, produce_targets=False)[ + "x" + ] + negs, _ = self.sample_negatives( + neg_cands, + y.size(1), + padding_count=padding_count, + ) + negs = self.project_q(negs) + + else: + negs, _ = self.sample_negatives( + y, + y.size(1), + padding_count=padding_count, + ) + + if self.codebook_negatives > 0: + cb_negs = self.quantizer.sample_from_codebook( + y.size(0) * y.size(1), self.codebook_negatives + ) + cb_negs = cb_negs.view( + self.codebook_negatives, y.size(0), y.size(1), -1 + ) # order doesnt matter + cb_negs = self.project_q(cb_negs) + negs = torch.cat([negs, cb_negs], dim=0) + else: + y = self.project_q(y) + + if self.negatives_from_everywhere: + negs, _ = self.sample_negatives( + unmasked_features, + y.size(1), + padding_count=padding_count, + ) + negs = self.project_q(negs) + else: + negs, _ = self.sample_negatives( + y, + y.size(1), + padding_count=padding_count, + ) + + if not is_xla_tensor(x): + # tpu-comment: reducing the size in a dynamic way causes + # too many recompilations on xla. + x = x[mask_indices].view(x.size(0), -1, x.size(-1)) + + if self.target_glu: + y = self.target_glu(y) + negs = self.target_glu(negs) + + x = self.final_proj(x) + x = self.compute_preds(x, y, negs) + + result = { + "x": x, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + + if prob_ppl is not None: + result["prob_perplexity"] = prob_ppl + result["code_perplexity"] = code_ppl + result["num_vars"] = num_vars + result["temp"] = curr_temp + + return result + + def quantize(self, x): + assert self.quantizer is not None + x = self.feature_extractor(x) + x = x.transpose(1, 2) + x = self.layer_norm(x) + return self.quantizer.forward_idx(x) + + def extract_features(self, source, padding_mask, mask=False, layer=None): + res = self.forward( + source, padding_mask, mask=mask, features_only=True, layer=layer + ) + return res + + def get_logits(self, net_output): + logits = net_output["x"] + logits = logits.transpose(0, 2) + logits = logits.reshape(-1, logits.size(-1)) + return logits + + def get_targets(self, sample, net_output, expand_steps=True): + x = net_output["x"] + return x.new_zeros(x.size(1) * x.size(2), dtype=torch.long) + + def get_extra_losses(self, net_output): + pen = [] + + if "prob_perplexity" in net_output: + pen.append( + (net_output["num_vars"] - net_output["prob_perplexity"]) + / net_output["num_vars"] + ) + + if "features_pen" in net_output: + pen.append(net_output["features_pen"]) + + return pen + + def remove_pretraining_modules(self): + self.quantizer = None + self.project_q = None + self.target_glu = None + self.final_proj = None + + +class ConvFeatureExtractionModel(nn.Module): + def __init__( + self, + conv_layers: List[Tuple[int, int, int]], + dropout: float = 0.0, + mode: str = "default", + conv_bias: bool = False, + ): + super().__init__() + + assert mode in {"default", "layer_norm"} + + def block( + n_in, + n_out, + k, + stride, + is_layer_norm=False, + is_group_norm=False, + conv_bias=False, + ): + def make_conv(): + conv = nn.Conv1d(n_in, n_out, k, stride=stride, bias=conv_bias) + nn.init.kaiming_normal_(conv.weight) + return conv + + assert ( + is_layer_norm and is_group_norm + ) == False, "layer norm and group norm are exclusive" + + if is_layer_norm: + return nn.Sequential( + make_conv(), + nn.Dropout(p=dropout), + nn.Sequential( + TransposeLast(), + Fp32LayerNorm(dim, elementwise_affine=True), + TransposeLast(), + ), + nn.GELU(), + ) + elif is_group_norm: + return nn.Sequential( + make_conv(), + nn.Dropout(p=dropout), + Fp32GroupNorm(dim, dim, affine=True), + nn.GELU(), + ) + else: + return nn.Sequential(make_conv(), nn.Dropout(p=dropout), nn.GELU()) + + in_d = 1 + self.conv_layers = nn.ModuleList() + for i, cl in enumerate(conv_layers): + assert len(cl) == 3, "invalid conv definition: " + str(cl) + (dim, k, stride) = cl + + self.conv_layers.append( + block( + in_d, + dim, + k, + stride, + is_layer_norm=mode == "layer_norm", + is_group_norm=mode == "default" and i == 0, + conv_bias=conv_bias, + ) + ) + in_d = dim + + def forward(self, x): + + # BxT -> BxCxT + x = x.unsqueeze(1) + + for conv in self.conv_layers: + x = conv(x) + + return x + + +class TransformerEncoder(nn.Module): + def __init__(self, args): + super().__init__() + + self.dropout = args.dropout + self.embedding_dim = args.encoder_embed_dim + + self.pos_conv = nn.Conv1d( + self.embedding_dim, + self.embedding_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * self.embedding_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + self.layers = nn.ModuleList( + [ + TransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=self.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + ) + for _ in range(args.encoder_layers) + ] + ) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(self.embedding_dim) + self.layerdrop = args.encoder_layerdrop + + self.apply(init_bert_params) + + def forward(self, x, padding_mask=None, layer=None): + x, layer_results = self.extract_features(x, padding_mask, layer) + + if self.layer_norm_first and layer is None: + x = self.layer_norm(x) + + return x, layer_results + + def extract_features(self, x, padding_mask=None, tgt_layer=None): + + if padding_mask is not None: + x = index_put(x, padding_mask, 0) + + x_conv = self.pos_conv(x.transpose(1, 2)) + x_conv = x_conv.transpose(1, 2) + x = x + x_conv + + if not self.layer_norm_first: + x = self.layer_norm(x) + + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + layer_results = [] + r = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, z = layer(x, self_attn_padding_mask=padding_mask, need_weights=False) + if tgt_layer is not None: + layer_results.append((x, z)) + if i == tgt_layer: + r = x + break + + if r is not None: + x = r + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + return x, layer_results + + def max_positions(self): + """Maximum output length supported by the encoder.""" + return self.args.max_positions + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + return state_dict + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn diff --git a/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2_asr.py b/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2_asr.py new file mode 100644 index 0000000..405d1e6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/models/wav2vec/wav2vec2_asr.py @@ -0,0 +1,655 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from argparse import Namespace +import contextlib +import copy +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from dataclasses import dataclass, field +from omegaconf import MISSING, II, open_dict +from typing import Any, Optional + +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.tasks import FairseqTask +from fairseq.models import ( + BaseFairseqModel, + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, +) +from fairseq.models.wav2vec.wav2vec2 import MASKING_DISTRIBUTION_CHOICES +from fairseq.modules import ( + LayerNorm, + PositionalEmbedding, + TransformerDecoderLayer, +) + + +@dataclass +class Wav2Vec2AsrConfig(FairseqDataclass): + w2v_path: str = field( + default=MISSING, metadata={"help": "path to wav2vec 2.0 model"} + ) + no_pretrained_weights: bool = field( + default=False, metadata={"help": "if true, does not load pretrained weights"} + ) + dropout_input: float = field( + default=0.0, + metadata={"help": "dropout to apply to the input (after feat extr)"}, + ) + final_dropout: float = field( + default=0.0, + metadata={"help": "dropout after transformer and before final projection"}, + ) + dropout: float = field( + default=0.0, metadata={"help": "dropout probability inside wav2vec 2.0 model"} + ) + attention_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability for attention weights inside wav2vec 2.0 model" + }, + ) + activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN inside wav2vec 2.0 model" + }, + ) + + # masking + apply_mask: bool = field( + default=False, metadata={"help": "apply masking during fine-tuning"} + ) + mask_length: int = field( + default=10, metadata={"help": "repeat the mask indices multiple times"} + ) + mask_prob: float = field( + default=0.5, + metadata={ + "help": "probability of replacing a token with mask (normalized by length)" + }, + ) + mask_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", metadata={"help": "how to choose masks"} + ) + mask_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument (used for more complex distributions), " + "see help in compute_mask_indices" + }, + ) + no_mask_overlap: bool = field( + default=False, metadata={"help": "whether to allow masks to overlap"} + ) + + # channel masking + mask_channel_length: int = field( + default=10, metadata={"help": "length of the mask for features (channels)"} + ) + mask_channel_prob: float = field( + default=0.0, metadata={"help": "probability of replacing a feature with 0"} + ) + mask_channel_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", + metadata={"help": "how to choose mask length for channel masking"}, + ) + mask_channel_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument (used for more complex distributions), " + "see help in compute_mask_indicesh" + }, + ) + no_mask_channel_overlap: bool = field( + default=False, metadata={"help": "whether to allow channel masks to overlap"} + ) + freeze_finetune_updates: int = field( + default=0, metadata={"help": "dont finetune wav2vec for this many updates"} + ) + feature_grad_mult: float = field( + default=0.0, metadata={"help": "reset feature grad mult in wav2vec 2.0 to this"} + ) + layerdrop: float = field( + default=0.0, metadata={"help": "probability of dropping a layer in wav2vec 2.0"} + ) + mask_channel_before: bool = False + normalize: bool = II("task.normalize") + data: str = II("task.data") + # this holds the loaded wav2vec args + w2v_args: Any = None + + +@dataclass +class Wav2Vec2CtcConfig(Wav2Vec2AsrConfig): + blank_weight: float = 0 + blank_mode: str = "add" + mask_min_space: Optional[int] = field( + default=1, + metadata={"help": "min space between spans (if no overlap is enabled)"}, + ) + mask_channel_min_space: Optional[int] = field( + default=1, + metadata={"help": "min space between spans (if no overlap is enabled)"}, + ) + conv_feature_layers: Optional[str] = field( + default="[(512, 10, 5)] + [(512, 3, 2)] * 4 + [(512,2,2)] + [(512,2,2)]", + metadata={ + "help": ( + "string describing convolutional feature extraction " + "layers in form of a python list that contains " + "[(dim, kernel_size, stride), ...]" + ), + }, + ) + encoder_embed_dim: Optional[int] = field( + default=768, metadata={"help": "encoder embedding dimension"} + ) + + +@register_model("wav2vec_ctc", dataclass=Wav2Vec2CtcConfig) +class Wav2VecCtc(BaseFairseqModel): + def __init__(self, cfg: Wav2Vec2CtcConfig, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + self.blank_weight = cfg.blank_weight + self.blank_mode = cfg.blank_mode + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: Wav2Vec2CtcConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = Wav2VecEncoder(cfg, len(task.target_dictionary)) + return cls(cfg, w2v_encoder) + + def get_logits(self, net_output, normalize=False): + logits = net_output["encoder_out"] + if self.blank_weight != 0: + if self.blank_mode == "add": + logits[..., 0] += self.blank_weight + elif self.blank_mode == "set": + logits[..., 0] = self.blank_weight + else: + raise Exception(f"invalid blank mode {self.blank_mode}") + + if net_output["padding_mask"] is not None and net_output["padding_mask"].any(): + logits[net_output["padding_mask"].T][..., 0] = float("inf") + logits[net_output["padding_mask"].T][..., 1:] = float("-inf") + + if normalize: + logits = utils.log_softmax(logits.float(), dim=-1) + + return logits + + def get_normalized_probs(self, net_output, log_probs): + """Get normalized probabilities (or log probs) from a net's output.""" + + logits = self.get_logits(net_output) + + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + +@dataclass +class Wav2Vec2Seq2SeqConfig(Wav2Vec2AsrConfig): + decoder_embed_dim: int = field( + default=768, metadata={"help": "decoder embedding dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_layers: int = field(default=6, metadata={"help": "num of decoder layers"}) + decoder_layerdrop: float = field( + default=0.0, metadata={"help": "decoder layerdrop chance"} + ) + decoder_attention_heads: int = field( + default=4, metadata={"help": "num decoder attention heads"} + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "use learned positional embeddings in the decoder"}, + ) + decoder_normalize_before: bool = field( + default=False, metadata={"help": "apply layernorm before each decoder block"} + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={ + "help": "if set, disables positional embeddings (outside self attention)" + }, + ) + decoder_dropout: float = field( + default=0.0, metadata={"help": "dropout probability in the decoder"} + ) + decoder_attention_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability for attention weights inside the decoder" + }, + ) + decoder_activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN inside the decoder" + }, + ) + max_target_positions: int = field( + default=2048, metadata={"help": "max target positions"} + ) + share_decoder_input_output_embed: bool = field( + default=False, metadata={"help": "share decoder input and output embeddings"} + ) + autoregressive: bool = II("task.autoregressive") + + +@register_model("wav2vec_seq2seq", dataclass=Wav2Vec2Seq2SeqConfig) +class Wav2Vec2Seq2SeqModel(FairseqEncoderDecoderModel): + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @classmethod + def build_model(cls, cfg: Wav2Vec2Seq2SeqConfig, task: FairseqTask): + """Build a new model instance.""" + + assert ( + cfg.autoregressive + ), "Please set task.autoregressive=true for seq2seq asr models" + + src_dict, tgt_dict = task.source_dictionary, task.target_dictionary + + def build_embedding(dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + emb = Embedding(num_embeddings, embed_dim, padding_idx) + return emb + + decoder_embed_tokens = build_embedding(tgt_dict, cfg.decoder_embed_dim) + + encoder = cls.build_encoder(cfg) + decoder = cls.build_decoder(cfg, tgt_dict, decoder_embed_tokens) + + return Wav2Vec2Seq2SeqModel(encoder, decoder) + + @classmethod + def build_encoder(cls, cfg: Wav2Vec2AsrConfig): + return Wav2VecEncoder(cfg) + + @classmethod + def build_decoder(cls, cfg: Wav2Vec2Seq2SeqConfig, tgt_dict, embed_tokens): + return TransformerDecoder(cfg, tgt_dict, embed_tokens) + + def forward(self, **kwargs): + encoder_out = self.encoder(tbc=False, **kwargs) + decoder_out = self.decoder(encoder_out=encoder_out, **kwargs) + return decoder_out + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + +class Wav2VecEncoder(FairseqEncoder): + def __init__(self, cfg: Wav2Vec2AsrConfig, output_size=None): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_before": cfg.mask_channel_before, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + assert cfg.normalize == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for both pre-training and here" + ) + + w2v_args.task.data = cfg.data + task = tasks.setup_task(w2v_args.task) + model = task.build_model(w2v_args.model) + + if state is not None and not cfg.no_pretrained_weights: + model.load_state_dict(state["model"], strict=True) + + model.remove_pretraining_modules() + + super().__init__(task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.num_updates = 0 + + targ_d = None + self.proj = None + + if output_size is not None: + targ_d = output_size + elif getattr(cfg, "decoder_embed_dim", d) != d: + targ_d = cfg.decoder_embed_dim + + if targ_d is not None: + self.proj = Linear(d, targ_d) + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, source, padding_mask, tbc=True, **kwargs): + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + } + + ft = self.freeze_finetune_updates <= self.num_updates + + with torch.no_grad() if not ft else contextlib.ExitStack(): + res = self.w2v_model.extract_features(**w2v_args) + + x = res["x"] + padding_mask = res["padding_mask"] + + if tbc: + # BTC -> TBC + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + if self.proj: + x = self.proj(x) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": padding_mask.transpose(0, 1) + if padding_mask is not None + else None, # T x B + "padding_mask": padding_mask, + "layer_results": res["layer_results"], + } + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = encoder_out["encoder_out"].index_select( + 1, new_order + ) + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +class TransformerDecoder(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg: Wav2Vec2Seq2SeqConfig, + dictionary, + embed_tokens, + no_encoder_attn=False, + ): + super().__init__(dictionary) + + self.dropout = cfg.decoder_dropout + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = cfg.decoder_embed_dim + self.output_embed_dim = cfg.decoder_embed_dim + + self.layerdrop = cfg.decoder_layerdrop + + padding_idx = embed_tokens.padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens = embed_tokens + self.embed_scale = math.sqrt(embed_dim) # todo: try with input_embed_dim + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + + self.embed_positions = ( + PositionalEmbedding( + cfg.max_target_positions, + embed_dim, + padding_idx, + learned=cfg.decoder_learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + + # TODO: update this when transformer gets converted to dataclass configs + transformer_cfg = copy.deepcopy(cfg) + with open_dict(transformer_cfg): + transformer_cfg.dropout = transformer_cfg.decoder_dropout + transformer_cfg.attention_dropout = ( + transformer_cfg.decoder_attention_dropout + ) + transformer_cfg.activation_dropout = ( + transformer_cfg.decoder_activation_dropout + ) + + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + TransformerDecoderLayer(transformer_cfg, no_encoder_attn) + for _ in range(transformer_cfg.decoder_layers) + ] + ) + + if not self.share_input_output_embed: + self.embed_out = nn.Parameter( + torch.Tensor(len(dictionary), self.output_embed_dim) + ) + nn.init.normal_(self.embed_out, mean=0, std=self.output_embed_dim ** -0.5) + + if transformer_cfg.decoder_normalize_before: + self.layer_norm = LayerNorm(embed_dim) + else: + self.layer_norm = None + + def forward( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **unused + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (Tensor, optional): output from the encoder, used for + encoder-side attention + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + prev_output_tokens = prev_output_tokens.long() + x, extra = self.extract_features( + prev_output_tokens, encoder_out, incremental_state + ) + x = self.output_layer(x) + return x, extra + + def extract_features( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **unused + ): + """ + Similar to *forward* but only return features. + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + + # embed positions + positions = ( + self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + if self.embed_positions is not None + else None + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + attn = None + + inner_states = [x] + + # decoder layers + for layer in self.layers: + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, attn, _ = layer( + x, + encoder_out["encoder_out"] if encoder_out is not None else None, + encoder_out["padding_mask"] if encoder_out is not None else None, + incremental_state, + self_attn_mask=self.buffered_future_mask(x) + if incremental_state is None + else None, + ) + inner_states.append(x) + + if self.layer_norm: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + return x, {"attn": attn, "inner_states": inner_states} + + def output_layer(self, features, **kwargs): + """Project features to the vocabulary size.""" + # project back to size of vocabulary + if self.share_input_output_embed: + return F.linear(features, self.embed_tokens.weight) + else: + return F.linear(features, self.embed_out) + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + if ( + not hasattr(self, "_future_mask") + or self._future_mask is None + or self._future_mask.device != tensor.device + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(tensor.new(dim, dim)), 1 + ) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/SpeechT5/fairseq/fairseq/modules/__init__.py b/SpeechT5/fairseq/fairseq/modules/__init__.py new file mode 100644 index 0000000..81930aa --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/__init__.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +from .adaptive_input import AdaptiveInput +from .adaptive_softmax import AdaptiveSoftmax +from .base_layer import BaseLayer +from .beamable_mm import BeamableMM +from .character_token_embedder import CharacterTokenEmbedder +from .conv_tbc import ConvTBC +from .cross_entropy import cross_entropy +from .downsampled_multihead_attention import DownsampledMultiHeadAttention +from .dynamic_convolution import DynamicConv, DynamicConv1dTBC +from .dynamic_crf_layer import DynamicCRF +from .fairseq_dropout import FairseqDropout +from .fp32_group_norm import Fp32GroupNorm +from .gelu import gelu, gelu_accurate +from .grad_multiply import GradMultiply +from .gumbel_vector_quantizer import GumbelVectorQuantizer +from .kmeans_vector_quantizer import KmeansVectorQuantizer +from .layer_drop import LayerDropModuleList +from .layer_norm import Fp32LayerNorm, LayerNorm +from .learned_positional_embedding import LearnedPositionalEmbedding +from .lightweight_convolution import LightweightConv, LightweightConv1dTBC +from .linearized_convolution import LinearizedConvolution +from .multihead_attention import MultiheadAttention +from .positional_embedding import PositionalEmbedding +from .same_pad import SamePad +from .scalar_bias import ScalarBias +from .sinusoidal_positional_embedding import SinusoidalPositionalEmbedding +from .transformer_sentence_encoder_layer import TransformerSentenceEncoderLayer +from .transformer_sentence_encoder import TransformerSentenceEncoder +from .transpose_last import TransposeLast +from .unfold import unfold1d +from .transformer_layer import TransformerDecoderLayer, TransformerEncoderLayer +from .vggblock import VGGBlock + +__all__ = [ + "AdaptiveInput", + "AdaptiveSoftmax", + "BaseLayer", + "BeamableMM", + "CharacterTokenEmbedder", + "ConvTBC", + "cross_entropy", + "DownsampledMultiHeadAttention", + "DynamicConv1dTBC", + "DynamicConv", + "DynamicCRF", + "FairseqDropout", + "Fp32GroupNorm", + "Fp32LayerNorm", + "gelu", + "gelu_accurate", + "GradMultiply", + "GumbelVectorQuantizer", + "KmeansVectorQuantizer", + "LayerDropModuleList", + "LayerNorm", + "LearnedPositionalEmbedding", + "LightweightConv1dTBC", + "LightweightConv", + "LinearizedConvolution", + "MultiheadAttention", + "PositionalEmbedding", + "SamePad", + "ScalarBias", + "SinusoidalPositionalEmbedding", + "TransformerSentenceEncoderLayer", + "TransformerSentenceEncoder", + "TransformerDecoderLayer", + "TransformerEncoderLayer", + "TransposeLast", + "VGGBlock", + "unfold1d", +] diff --git a/SpeechT5/fairseq/fairseq/modules/adaptive_input.py b/SpeechT5/fairseq/fairseq/modules/adaptive_input.py new file mode 100644 index 0000000..446534a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/adaptive_input.py @@ -0,0 +1,80 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from typing import List + +import torch +from fairseq.modules.quant_noise import quant_noise +from torch import nn + + +class AdaptiveInput(nn.Module): + def __init__( + self, + vocab_size: int, + padding_idx: int, + initial_dim: int, + factor: float, + output_dim: int, + cutoff: List[int], + q_noise: float = 0, + qn_block_size: int = 8, + ): + super().__init__() + + if vocab_size > cutoff[-1]: + cutoff = cutoff + [vocab_size] + else: + assert ( + vocab_size == cutoff[-1] + ), "cannot specify cutoff larger than vocab size" + + self.cutoff = cutoff + self.embedding_dim = output_dim + self.padding_idx = padding_idx + + self.embeddings = nn.ModuleList() + for i in range(len(self.cutoff)): + prev = self.cutoff[i - 1] if i > 0 else 0 + size = self.cutoff[i] - prev + dim = int(initial_dim // (factor ** i)) + seq = nn.Sequential( + nn.Embedding(size, dim, self.padding_idx), + quant_noise( + nn.Linear(dim, output_dim, bias=False), q_noise, qn_block_size + ), + ) + + self.embeddings.append(seq) + self.padding_idx = None + self.padding_idx = padding_idx + + def init_weights(m): + if isinstance(m, nn.Embedding): + nn.init.normal_(m.weight, mean=0, std=m.weight.shape[1] ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + elif hasattr(m, "weight"): + nn.init.xavier_uniform_(m.weight) + + self.apply(init_weights) + + self.register_buffer("_float_tensor", torch.FloatTensor(1)) + + def weights_for_band(self, band: int): + return self.embeddings[band][0].weight, self.embeddings[band][1].weight + + def forward(self, input: torch.Tensor): + result = self._float_tensor.new(input.shape + (self.embedding_dim,)) + for i in range(len(self.cutoff)): + mask = input.lt(self.cutoff[i]) + if i > 0: + mask.mul_(input.ge(self.cutoff[i - 1])) + chunk_input = input[mask] - self.cutoff[i - 1] + else: + chunk_input = input[mask] + if mask.any(): + result[mask] = self.embeddings[i](chunk_input) + return result diff --git a/SpeechT5/fairseq/fairseq/modules/adaptive_softmax.py b/SpeechT5/fairseq/fairseq/modules/adaptive_softmax.py new file mode 100644 index 0000000..ae0c77b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/adaptive_softmax.py @@ -0,0 +1,268 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import functools +import operator + +import torch +import torch.nn.functional as F +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.quant_noise import quant_noise +from torch import nn + + +class TiedLinear(nn.Module): + def __init__(self, weight, transpose): + super().__init__() + self.weight = weight + self.transpose = transpose + + def forward(self, input): + return F.linear(input, self.weight.t() if self.transpose else self.weight) + + +class TiedHeadModule(nn.Module): + def __init__(self, weights, input_dim, num_classes, q_noise, qn_block_size): + super().__init__() + tied_emb, _ = weights + self.num_words, emb_dim = tied_emb.size() + + self.word_proj = quant_noise( + TiedLinear(tied_emb, transpose=False), q_noise, qn_block_size + ) + if input_dim != emb_dim: + self.word_proj = nn.Sequential( + quant_noise( + nn.Linear(input_dim, emb_dim, bias=False), q_noise, qn_block_size + ), + self.word_proj, + ) + + self.class_proj = quant_noise( + nn.Linear(input_dim, num_classes, bias=False), q_noise, qn_block_size + ) + self.out_dim = self.num_words + num_classes + + self.register_buffer("_float_tensor", torch.FloatTensor(1)) + + def forward(self, input): + inp_sz = functools.reduce(operator.mul, input.shape[:-1], 1) + out = self._float_tensor.new(inp_sz, self.out_dim) + out[:, : self.num_words] = self.word_proj(input.view(inp_sz, -1)) + out[:, self.num_words :] = self.class_proj(input.view(inp_sz, -1)) + return out + + +class AdaptiveSoftmax(nn.Module): + """ + This is an implementation of the efficient softmax approximation for + graphical processing units (GPU), described in the paper "Efficient softmax + approximation for GPUs" (http://arxiv.org/abs/1609.04309). + """ + + def __init__( + self, + vocab_size, + input_dim, + cutoff, + dropout, + factor=4.0, + adaptive_inputs=None, + tie_proj=False, + q_noise=0, + qn_block_size=8, + ): + super().__init__() + + if vocab_size > cutoff[-1]: + cutoff = cutoff + [vocab_size] + else: + assert ( + vocab_size == cutoff[-1] + ), "cannot specify cutoff larger than vocab size" + + output_dim = cutoff[0] + len(cutoff) - 1 + + self.vocab_size = vocab_size + self.cutoff = cutoff + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.input_dim = input_dim + self.factor = factor + self.q_noise = q_noise + self.qn_block_size = qn_block_size + + self.lsm = nn.LogSoftmax(dim=1) + + if adaptive_inputs is not None: + self.head = TiedHeadModule( + adaptive_inputs.weights_for_band(0), + input_dim, + len(cutoff) - 1, + self.q_noise, + self.qn_block_size, + ) + else: + self.head = quant_noise( + nn.Linear(input_dim, output_dim, bias=False), + self.q_noise, + self.qn_block_size, + ) + + self._make_tail(adaptive_inputs, tie_proj) + + def init_weights(m): + if ( + hasattr(m, "weight") + and not isinstance(m, TiedLinear) + and not isinstance(m, TiedHeadModule) + ): + nn.init.xavier_uniform_(m.weight) + + self.apply(init_weights) + + self.register_buffer("version", torch.LongTensor([1])) + + def _make_tail(self, adaptive_inputs=None, tie_proj=False): + self.tail = nn.ModuleList() + for i in range(len(self.cutoff) - 1): + dim = int(self.input_dim // self.factor ** (i + 1)) + + tied_emb, tied_proj = ( + adaptive_inputs.weights_for_band(i + 1) + if adaptive_inputs is not None + else (None, None) + ) + + if tied_proj is not None: + if tie_proj: + proj = quant_noise( + TiedLinear(tied_proj, transpose=True), + self.q_noise, + self.qn_block_size, + ) + else: + proj = quant_noise( + nn.Linear(tied_proj.size(0), tied_proj.size(1), bias=False), + self.q_noise, + self.qn_block_size, + ) + else: + proj = quant_noise( + nn.Linear(self.input_dim, dim, bias=False), + self.q_noise, + self.qn_block_size, + ) + + if tied_emb is None: + out_proj = nn.Linear( + dim, self.cutoff[i + 1] - self.cutoff[i], bias=False + ) + else: + out_proj = TiedLinear(tied_emb, transpose=False) + + m = nn.Sequential( + proj, + nn.Dropout(self.dropout_module.p), + quant_noise(out_proj, self.q_noise, self.qn_block_size), + ) + + self.tail.append(m) + + def upgrade_state_dict_named(self, state_dict, name): + version_name = name + ".version" + if version_name not in state_dict: + raise Exception("This version of the model is no longer supported") + + def adapt_target(self, target): + """ + In order to be efficient, the AdaptiveSoftMax does not compute the + scores for all the word of the vocabulary for all the examples. It is + thus necessary to call the method adapt_target of the AdaptiveSoftMax + layer inside each forward pass. + """ + + target = target.view(-1) + new_target = [target.clone()] + target_idxs = [] + + for i in range(len(self.cutoff) - 1): + mask = target.ge(self.cutoff[i]).mul(target.lt(self.cutoff[i + 1])) + new_target[0][mask] = self.cutoff[0] + i + + if mask.any(): + target_idxs.append(mask.nonzero(as_tuple=False).squeeze(1)) + new_target.append(target[mask].add(-self.cutoff[i])) + else: + target_idxs.append(None) + new_target.append(None) + + return new_target, target_idxs + + def forward(self, input, target): + """ + Args: + input: (b x t x d) + target: (b x t) + Returns: + 2 lists: output for each cutoff section and new targets by cut off + """ + + input = input.contiguous().view(-1, input.size(-1)) + input = self.dropout_module(input) + + new_target, target_idxs = self.adapt_target(target) + output = [self.head(input)] + + for i in range(len(target_idxs)): + if target_idxs[i] is not None: + output.append(self.tail[i](input.index_select(0, target_idxs[i]))) + else: + output.append(None) + + return output, new_target + + def get_log_prob(self, input, target): + """ + Computes the log probabilities for all the words of the vocabulary, + given a 2D tensor of hidden vectors. + """ + + bsz, length, dim = input.size() + input = input.contiguous().view(-1, dim) + + if target is not None: + _, target_idxs = self.adapt_target(target) + else: + target_idxs = None + + head_y = self.head(input) + log_probs = head_y.new_zeros(input.size(0), self.vocab_size) + + head_sz = self.cutoff[0] + len(self.tail) + log_probs[:, :head_sz] = self.lsm(head_y) + tail_priors = log_probs[:, self.cutoff[0] : head_sz].clone() + + for i in range(len(self.tail)): + start = self.cutoff[i] + end = self.cutoff[i + 1] + + if target_idxs is None: + tail_out = log_probs[:, start:end] + tail_out.copy_(self.tail[i](input)) + log_probs[:, start:end] = self.lsm(tail_out).add_( + tail_priors[:, i, None] + ) + elif target_idxs[i] is not None: + idxs = target_idxs[i] + tail_out = log_probs[idxs, start:end] + tail_out.copy_(self.tail[i](input[idxs])) + log_probs[idxs, start:end] = self.lsm(tail_out).add_( + tail_priors[idxs, i, None] + ) + + log_probs = log_probs.view(bsz, length, -1) + return log_probs diff --git a/SpeechT5/fairseq/fairseq/modules/base_layer.py b/SpeechT5/fairseq/fairseq/modules/base_layer.py new file mode 100644 index 0000000..e7ef155 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/base_layer.py @@ -0,0 +1,135 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.nn as nn +import torch +import sys +from fairseq import utils +from fairseq.distributed import utils as distributed_utils +from fairseq.modules.layer_norm import LayerNorm + + +class BaseLayer(nn.Module): + + def __init__(self, args): + super().__init__() + self.num_workers = distributed_utils.get_data_parallel_world_size() + expert_centroids = torch.empty(self.num_workers, args.decoder_embed_dim) + torch.nn.init.orthogonal_(expert_centroids, gain=0.1) + self.register_parameter("expert_centroids", torch.nn.Parameter(expert_centroids)) + self.expert_network = nn.Sequential(*([BaseSublayer(args) for _ in range(args.base_sublayers)])) + self.expert_id = distributed_utils.get_data_parallel_rank() + self.shuffle = args.base_shuffle + self.cpp = self.load_assignment() + + # Add a special attribute to the expert parameters, so we know not to sync their gradients + for param in self.expert_network.parameters(): + param.expert = True + + def forward(self, input_features, *args, **kwargs): + features = input_features.reshape(-1, input_features.size(-1)) + is_training = input_features.requires_grad + + if self.shuffle and is_training: + # Send each token to a random worker, to break correlations within the batch + shuffle_sort = torch.randperm(features.size(0), device=features.device) + features = All2All.apply(features[shuffle_sort]) + + with torch.no_grad(): + # Compute similarity of each token to each expert, for routing + token_expert_affinities = features.matmul(self.expert_centroids.transpose(0, 1)) + + # Compute which token goes to which expert + sort_by_expert, input_splits, output_splits = self.balanced_assignment(token_expert_affinities) \ + if is_training else self.greedy_assignment(token_expert_affinities) + # Swap these tokens for the right ones for our expert + routed_features = All2All.apply(features[sort_by_expert], output_splits, input_splits) + + if routed_features.size(0) > 0: + # Mix in the expert network based on how appropriate it is for these tokens + alpha = torch.sigmoid(routed_features.mv(self.expert_centroids[self.expert_id])).unsqueeze(1) + routed_features = alpha * self.expert_network(routed_features) + (1 - alpha) * routed_features + # Return to original worker and ordering + result = All2All.apply(routed_features, input_splits, output_splits)[self.inverse_sort(sort_by_expert)] + + if self.shuffle and is_training: + # Undo shuffling + result = All2All.apply(result)[self.inverse_sort(shuffle_sort)] + + # Return additional Nones for compatibility with TransformerDecoderLayer + return result.view(input_features.size()), None, None + + def inverse_sort(self, order): + # Creates an index that undoes a sort: xs==xs[order][inverse_sort(order)] + return torch.empty_like(order).scatter_(0, order, torch.arange(0, order.size(0), device=order.device)) + + def balanced_assignment(self, scores): + ok = scores.isfinite() + if not ok.all(): + # NaNs here can break the assignment algorithm + scores[~ok] = scores[ok].min() + return self.cpp.balanced_assignment(scores), None, None + + # Assigns each token to the top k experts + def greedy_assignment(self, scores, k=1): + token_to_workers = torch.topk(scores, dim=1, k=k, largest=True).indices.view(-1) + token_to_workers, sort_ordering = torch.sort(token_to_workers) + worker2token = sort_ordering // k + + # Find how many tokens we're sending to each other worker (being careful for sending 0 tokens to some workers) + output_splits = torch.zeros((self.num_workers,), dtype=torch.long, device=scores.device) + workers, counts = torch.unique_consecutive(token_to_workers, return_counts=True) + output_splits[workers] = counts + # Tell other workers how many tokens to expect from us + input_splits = All2All.apply(output_splits) + return worker2token, input_splits.tolist(), output_splits.tolist() + + def load_assignment(self): + try: + from fairseq import libbase + + return libbase + + except ImportError as e: + sys.stderr.write( + "ERROR: missing libbase. run `python setup.py build_ext --inplace`\n" + ) + raise e + + +class BaseSublayer(nn.Module): + def __init__(self, args): + super().__init__() + self.activation_fn = utils.get_activation_fn( + activation=getattr(args, 'activation_fn', 'relu') or "relu" + ) + self.norm = LayerNorm(args.decoder_embed_dim, export=False) + self.ff1 = torch.nn.Linear(args.decoder_embed_dim, args.decoder_ffn_embed_dim) + self.ff2 = torch.nn.Linear(args.decoder_ffn_embed_dim, args.decoder_embed_dim) + self.ff2.weight.data.zero_() + + def forward(self, xs): + return xs + self.ff2(self.activation_fn(self.ff1(self.norm(xs)))) + + +# Wraps torch.distributed.all_to_all_single as a function that supports autograd +class All2All(torch.autograd.Function): + @staticmethod + def forward(ctx, xs, input_splits=None, output_splits=None): + ctx.input_splits = input_splits + ctx.output_splits = output_splits + + ys = torch.empty_like(xs) if output_splits is None else \ + xs.new_empty(size=[sum(output_splits)] + list(xs.size()[1:])) + torch.distributed.all_to_all_single(ys, xs, output_split_sizes=output_splits, input_split_sizes=input_splits) + return ys + + @staticmethod + def backward(ctx, grad_output): + result = torch.empty_like(grad_output) if ctx.input_splits is None else \ + grad_output.new_empty(size=[sum(ctx.input_splits)] + list(grad_output.size()[1:])) + torch.distributed.all_to_all_single(result, grad_output, + output_split_sizes=ctx.input_splits, input_split_sizes=ctx.output_splits) + return result, None, None diff --git a/SpeechT5/fairseq/fairseq/modules/beamable_mm.py b/SpeechT5/fairseq/fairseq/modules/beamable_mm.py new file mode 100644 index 0000000..eff1a46 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/beamable_mm.py @@ -0,0 +1,49 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn + + +class BeamableMM(nn.Module): + """This module provides an optimized MM for beam decoding with attention. + + It leverage the fact that the source-side of the input is replicated beam + times and the target-side of the input is of width one. This layer speeds up + inference by replacing the inputs {(bsz x 1 x nhu), (bsz x sz2 x nhu)} + with smaller inputs {(bsz/beam x beam x nhu), (bsz/beam x sz2 x nhu)}. + """ + + def __init__(self, beam_size=None): + super(BeamableMM, self).__init__() + self.beam_size = beam_size + + def forward(self, input1, input2): + if ( + not self.training + and self.beam_size is not None # test mode + and input1.dim() == 3 # beam size is set + and input1.size(1) # only support batched input + == 1 # single time step update + ): + bsz, beam = input1.size(0), self.beam_size + + # bsz x 1 x nhu --> bsz/beam x beam x nhu + input1 = input1[:, 0, :].unfold(0, beam, beam).transpose(2, 1) + + # bsz x sz2 x nhu --> bsz/beam x sz2 x nhu + input2 = input2.unfold(0, beam, beam)[:, :, :, 0] + + # use non batched operation if bsz = beam + if input1.size(0) == 1: + output = torch.mm(input1[0, :, :], input2[0, :, :]) + else: + output = input1.bmm(input2) + return output.view(bsz, 1, -1) + else: + return input1.bmm(input2) + + def set_beam_size(self, beam_size): + self.beam_size = beam_size diff --git a/SpeechT5/fairseq/fairseq/modules/character_token_embedder.py b/SpeechT5/fairseq/fairseq/modules/character_token_embedder.py new file mode 100644 index 0000000..181221b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/character_token_embedder.py @@ -0,0 +1,214 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from typing import List, Tuple + +import torch +import torch.nn.functional as F +from fairseq.data import Dictionary +from torch import nn + + +CHAR_PAD_IDX = 0 +CHAR_EOS_IDX = 257 + + +logger = logging.getLogger(__name__) + + +class CharacterTokenEmbedder(torch.nn.Module): + def __init__( + self, + vocab: Dictionary, + filters: List[Tuple[int, int]], + char_embed_dim: int, + word_embed_dim: int, + highway_layers: int, + max_char_len: int = 50, + char_inputs: bool = False, + ): + super(CharacterTokenEmbedder, self).__init__() + + self.onnx_trace = False + self.embedding_dim = word_embed_dim + self.max_char_len = max_char_len + self.char_embeddings = nn.Embedding(257, char_embed_dim, padding_idx=0) + self.symbol_embeddings = nn.Parameter(torch.FloatTensor(2, word_embed_dim)) + self.eos_idx, self.unk_idx = 0, 1 + self.char_inputs = char_inputs + + self.convolutions = nn.ModuleList() + for width, out_c in filters: + self.convolutions.append( + nn.Conv1d(char_embed_dim, out_c, kernel_size=width) + ) + + last_dim = sum(f[1] for f in filters) + + self.highway = Highway(last_dim, highway_layers) if highway_layers > 0 else None + + self.projection = nn.Linear(last_dim, word_embed_dim) + + assert ( + vocab is not None or char_inputs + ), "vocab must be set if not using char inputs" + self.vocab = None + if vocab is not None: + self.set_vocab(vocab, max_char_len) + + self.reset_parameters() + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def set_vocab(self, vocab, max_char_len): + word_to_char = torch.LongTensor(len(vocab), max_char_len) + + truncated = 0 + for i in range(len(vocab)): + if i < vocab.nspecial: + char_idxs = [0] * max_char_len + else: + chars = vocab[i].encode() + # +1 for padding + char_idxs = [c + 1 for c in chars] + [0] * (max_char_len - len(chars)) + if len(char_idxs) > max_char_len: + truncated += 1 + char_idxs = char_idxs[:max_char_len] + word_to_char[i] = torch.LongTensor(char_idxs) + + if truncated > 0: + logger.info( + "truncated {} words longer than {} characters".format( + truncated, max_char_len + ) + ) + + self.vocab = vocab + self.word_to_char = word_to_char + + @property + def padding_idx(self): + return Dictionary().pad() if self.vocab is None else self.vocab.pad() + + def reset_parameters(self): + nn.init.xavier_normal_(self.char_embeddings.weight) + nn.init.xavier_normal_(self.symbol_embeddings) + nn.init.xavier_uniform_(self.projection.weight) + + nn.init.constant_( + self.char_embeddings.weight[self.char_embeddings.padding_idx], 0.0 + ) + nn.init.constant_(self.projection.bias, 0.0) + + def forward( + self, + input: torch.Tensor, + ): + if self.char_inputs: + chars = input.view(-1, self.max_char_len) + pads = chars[:, 0].eq(CHAR_PAD_IDX) + eos = chars[:, 0].eq(CHAR_EOS_IDX) + if eos.any(): + if self.onnx_trace: + chars = torch.where(eos.unsqueeze(1), chars.new_zeros(1), chars) + else: + chars[eos] = 0 + + unk = None + else: + flat_words = input.view(-1) + chars = self.word_to_char[flat_words.type_as(self.word_to_char)].type_as( + input + ) + pads = flat_words.eq(self.vocab.pad()) + eos = flat_words.eq(self.vocab.eos()) + unk = flat_words.eq(self.vocab.unk()) + + word_embs = self._convolve(chars) + if self.onnx_trace: + if pads.any(): + word_embs = torch.where( + pads.unsqueeze(1), word_embs.new_zeros(1), word_embs + ) + if eos.any(): + word_embs = torch.where( + eos.unsqueeze(1), self.symbol_embeddings[self.eos_idx], word_embs + ) + if unk is not None and unk.any(): + word_embs = torch.where( + unk.unsqueeze(1), self.symbol_embeddings[self.unk_idx], word_embs + ) + else: + if pads.any(): + word_embs[pads] = 0 + if eos.any(): + word_embs[eos] = self.symbol_embeddings[self.eos_idx] + if unk is not None and unk.any(): + word_embs[unk] = self.symbol_embeddings[self.unk_idx] + + return word_embs.view(input.size()[:2] + (-1,)) + + def _convolve( + self, + char_idxs: torch.Tensor, + ): + char_embs = self.char_embeddings(char_idxs) + char_embs = char_embs.transpose(1, 2) # BTC -> BCT + + conv_result = [] + + for conv in self.convolutions: + x = conv(char_embs) + x, _ = torch.max(x, -1) + x = F.relu(x) + conv_result.append(x) + + x = torch.cat(conv_result, dim=-1) + + if self.highway is not None: + x = self.highway(x) + x = self.projection(x) + + return x + + +class Highway(torch.nn.Module): + """ + A `Highway layer <https://arxiv.org/abs/1505.00387>`_. + Adopted from the AllenNLP implementation. + """ + + def __init__(self, input_dim: int, num_layers: int = 1): + super(Highway, self).__init__() + self.input_dim = input_dim + self.layers = nn.ModuleList( + [nn.Linear(input_dim, input_dim * 2) for _ in range(num_layers)] + ) + self.activation = nn.ReLU() + + self.reset_parameters() + + def reset_parameters(self): + for layer in self.layers: + # As per comment in AllenNLP: + # We should bias the highway layer to just carry its input forward. We do that by + # setting the bias on `B(x)` to be positive, because that means `g` will be biased to + # be high, so we will carry the input forward. The bias on `B(x)` is the second half + # of the bias vector in each Linear layer. + nn.init.constant_(layer.bias[self.input_dim :], 1) + + nn.init.constant_(layer.bias[: self.input_dim], 0) + nn.init.xavier_normal_(layer.weight) + + def forward(self, x: torch.Tensor): + for layer in self.layers: + projection = layer(x) + proj_x, gate = projection.chunk(2, dim=-1) + proj_x = self.activation(proj_x) + gate = torch.sigmoid(gate) + x = gate * x + (gate.new_tensor([1]) - gate) * proj_x + return x diff --git a/SpeechT5/fairseq/fairseq/modules/checkpoint_activations.py b/SpeechT5/fairseq/fairseq/modules/checkpoint_activations.py new file mode 100644 index 0000000..b44fc34 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/checkpoint_activations.py @@ -0,0 +1,236 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import functools +from typing import Any, Dict, List, Tuple, Union + +import torch +import torch.utils.checkpoint as checkpoint +from fairseq import utils + + +def checkpoint_wrapper(m, offload_to_cpu=False): + """ + A friendlier wrapper for performing activation checkpointing. + + Compared to the PyTorch version, this version: + - wraps an nn.Module, so that all subsequent calls will use checkpointing + - handles keyword arguments in the forward + - handles non-Tensor outputs from the forward + + Usage:: + + checkpointed_module = checkpoint_wrapper(my_module, offload_to_cpu=True) + a, b = checkpointed_module(x, y=3, z=torch.Tensor([1])) + """ + # should I check whether original_forward has already been set? + assert not hasattr( + m, "precheckpoint_forward" + ), "checkpoint function has already been applied?" + m.precheckpoint_forward = m.forward + m.forward = functools.partial( + _checkpointed_forward, + m.precheckpoint_forward, # original_forward + offload_to_cpu, + ) + return m + + +def unwrap_checkpoint(m: torch.nn.Module): + """ + unwrap a module and its children from checkpoint_wrapper + """ + for module in m.modules(): + if hasattr(module, "precheckpoint_forward"): + module.forward = module.precheckpoint_forward + del module.precheckpoint_forward + return m + + +def _checkpointed_forward(original_forward, offload_to_cpu, *args, **kwargs): + # Autograd Functions in PyTorch work best with positional args, since + # the backward must return gradients (or None) for every input argument. + # We can flatten keyword arguments to make this easier. + kwarg_keys, flat_args = pack_kwargs(*args, **kwargs) + parent_ctx_dict = {"offload": offload_to_cpu} + output = CheckpointFunction.apply( + original_forward, parent_ctx_dict, kwarg_keys, *flat_args + ) + if isinstance(output, torch.Tensor): + return output + else: + packed_non_tensor_outputs = parent_ctx_dict["packed_non_tensor_outputs"] + if packed_non_tensor_outputs: + output = unpack_non_tensors(output, packed_non_tensor_outputs) + return output + + +def pack_kwargs(*args, **kwargs) -> Tuple[List[str], List[Any]]: + """ + Usage:: + + kwarg_keys, flat_args = pack_kwargs(1, 2, a=3, b=4) + args, kwargs = unpack_kwargs(kwarg_keys, flat_args) + assert args == [1, 2] + assert kwargs == {"a": 3, "b": 4} + """ + kwarg_keys = [] + flat_args = list(args) + for k, v in kwargs.items(): + kwarg_keys.append(k) + flat_args.append(v) + return kwarg_keys, flat_args + + +def unpack_kwargs( + kwarg_keys: List[str], flat_args: List[Any] +) -> Tuple[List[Any], Dict[str, Any]]: + if len(kwarg_keys) == 0: + return flat_args, {} + args = flat_args[: -len(kwarg_keys)] + kwargs = {k: v for k, v in zip(kwarg_keys, flat_args[-len(kwarg_keys) :])} + return args, kwargs + + +def split_non_tensors( + mixed: Union[torch.Tensor, Tuple[Any]] +) -> Tuple[Tuple[torch.Tensor], Dict[str, List[Any]]]: + """ + Usage:: + + x = torch.Tensor([1]) + y = torch.Tensor([2]) + tensors, packed_non_tensors = split_non_tensors((x, y, None, 3)) + recon = unpack_non_tensors(tensors, packed_non_tensors) + assert recon == (x, y, None, 3) + """ + if isinstance(mixed, torch.Tensor): + return (mixed,), None + tensors = [] + packed_non_tensors = {"is_tensor": [], "objects": []} + for o in mixed: + if isinstance(o, torch.Tensor): + packed_non_tensors["is_tensor"].append(True) + tensors.append(o) + else: + packed_non_tensors["is_tensor"].append(False) + packed_non_tensors["objects"].append(o) + return tuple(tensors), packed_non_tensors + + +def unpack_non_tensors( + tensors: Tuple[torch.Tensor], + packed_non_tensors: Dict[str, List[Any]], +) -> Tuple[Any]: + if packed_non_tensors is None: + return tensors + assert isinstance(packed_non_tensors, dict) + mixed = [] + is_tensor_list = packed_non_tensors["is_tensor"] + objects = packed_non_tensors["objects"] + assert len(tensors) + len(objects) == len(is_tensor_list) + obj_i = tnsr_i = 0 + for is_tensor in is_tensor_list: + if is_tensor: + mixed.append(tensors[tnsr_i]) + tnsr_i += 1 + else: + mixed.append(objects[obj_i]) + obj_i += 1 + return tuple(mixed) + + +class CheckpointFunction(torch.autograd.Function): + """Similar to the torch version, but support non-Tensor outputs. + + The caller is expected to provide a dict (*parent_ctx_dict*) that will hold + the non-Tensor outputs. These should be combined with the Tensor *outputs* + by calling ``unpack_non_tensors``. + """ + + @staticmethod + def forward(ctx, run_function, parent_ctx_dict, kwarg_keys, *args): + if torch.is_grad_enabled(): # grad may be disabled, e.g., during validation + checkpoint.check_backward_validity(args) + + ctx.run_function = run_function + ctx.kwarg_keys = kwarg_keys + ctx.fwd_rng_state = utils.get_rng_state() + + tensor_inputs, packed_non_tensor_inputs = split_non_tensors(args) + if parent_ctx_dict["offload"]: + ctx.fwd_device = tuple(x.device for x in tensor_inputs) + ctx.grad_requirements = tuple(x.requires_grad for x in tensor_inputs) + tensor_inputs = tuple(x.cpu() for x in tensor_inputs) + + else: + ctx.fwd_device, ctx.grad_requirements = None, None + + ctx.save_for_backward(*tensor_inputs) + ctx.packed_non_tensor_inputs = packed_non_tensor_inputs + + with torch.no_grad(): + unpacked_args, unpacked_kwargs = unpack_kwargs(kwarg_keys, args) + outputs = run_function(*unpacked_args, **unpacked_kwargs) + + if isinstance(outputs, torch.Tensor): + return outputs + else: + # Autograd Functions don't like non-Tensor outputs. We can split the + # non-Tensor and Tensor outputs, returning the former by reference + # through *parent_ctx_dict* and returning the latter directly. + outputs, packed_non_tensor_outputs = split_non_tensors(outputs) + parent_ctx_dict["packed_non_tensor_outputs"] = packed_non_tensor_outputs + return outputs + + @staticmethod + def backward(ctx, *args): + if not torch.autograd._is_checkpoint_valid(): + raise RuntimeError( + "Checkpointing is not compatible with .grad(), please use .backward() if possible" + ) + + tensor_inputs: Tuple = ctx.saved_tensors + tensor_inputs = checkpoint.detach_variable(tensor_inputs) + if ctx.fwd_device is not None: + tensor_inputs = [ + t.to(ctx.fwd_device[i]) for i, t in enumerate(tensor_inputs) + ] + for i, need_grad in enumerate(ctx.grad_requirements): + tensor_inputs[i].requires_grad = need_grad + inputs = unpack_non_tensors(tensor_inputs, ctx.packed_non_tensor_inputs) + + # Store the current states. + bwd_rng_state = utils.get_rng_state() + + # Set the states to what it used to be before the forward pass. + utils.set_rng_state(ctx.fwd_rng_state) + + with torch.enable_grad(): + unpacked_args, unpacked_kwargs = unpack_kwargs(ctx.kwarg_keys, inputs) + outputs = ctx.run_function(*unpacked_args, **unpacked_kwargs) + tensor_outputs, _ = split_non_tensors(outputs) + # Set the states back to what it was at the start of this function. + utils.set_rng_state(bwd_rng_state) + + # Run backward() with only Tensors that require grad + outputs_with_grad = [] + args_with_grad = [] + for i in range(len(tensor_outputs)): + if tensor_outputs[i].requires_grad: + outputs_with_grad.append(tensor_outputs[i]) + args_with_grad.append(args[i]) + if len(outputs_with_grad) == 0: + raise RuntimeError( + "None of the outputs have requires_grad=True, " + "this checkpoint() is not necessary" + ) + + torch.autograd.backward(outputs_with_grad, args_with_grad) + + grads = tuple( + inp.grad if isinstance(inp, torch.Tensor) else None for inp in inputs + ) + return (None, None, None) + grads diff --git a/SpeechT5/fairseq/fairseq/modules/conv_tbc.py b/SpeechT5/fairseq/fairseq/modules/conv_tbc.py new file mode 100644 index 0000000..65e17ec --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/conv_tbc.py @@ -0,0 +1,53 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from torch import nn +from torch.nn.modules.utils import _single +from torch import Tensor + + +class ConvTBC(torch.nn.Module): + """1D convolution over an input of shape (time x batch x channel) + + The implementation uses gemm to perform the convolution. This implementation + is faster than cuDNN for small kernel sizes. + """ + + def __init__(self, in_channels, out_channels, kernel_size, padding=0): + super(ConvTBC, self).__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = _single(kernel_size) + self.padding = _single(padding) + + self.weight = torch.nn.Parameter( + torch.Tensor(self.kernel_size[0], in_channels, out_channels) + ) + self.bias = torch.nn.Parameter(torch.Tensor(out_channels)) + + self.reset_parameters() + + def reset_parameters(self): + nn.init.xavier_normal_(self.weight) + nn.init.zeros_(self.bias) + + def conv_tbc(self, input: Tensor): + return torch.conv_tbc( + input.contiguous(), self.weight, self.bias, self.padding[0] + ) + + def forward(self, input: Tensor): + return self.conv_tbc(input) + + def __repr__(self): + s = ( + "{name}({in_channels}, {out_channels}, kernel_size={kernel_size}" + ", padding={padding}" + ) + if self.bias is None: + s += ", bias=False" + s += ")" + return s.format(name=self.__class__.__name__, **self.__dict__) diff --git a/SpeechT5/fairseq/fairseq/modules/cross_entropy.py b/SpeechT5/fairseq/fairseq/modules/cross_entropy.py new file mode 100644 index 0000000..6f33c24 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/cross_entropy.py @@ -0,0 +1,61 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import torch +import torch.nn.functional as F + + +logger = logging.getLogger(__name__) + + +def _cross_entropy_pytorch(logits, target, ignore_index=None, reduction="mean"): + lprobs = F.log_softmax(logits, dim=-1, dtype=torch.float32) + return F.nll_loss( + lprobs, + target, + ignore_index=ignore_index, + reduction=reduction, + ) + + +try: + import xentropy_cuda + from apex.contrib import xentropy + + def cross_entropy(logits, target, ignore_index=-100, reduction="mean"): + if logits.device == torch.device("cpu"): + return _cross_entropy_pytorch(logits, target, ignore_index, reduction) + else: + if not getattr(cross_entropy, "_has_logged_once", False): + logger.info("using fused cross entropy") + cross_entropy._has_logged_once = True + + half_to_float = logits.dtype == torch.half + losses = xentropy.SoftmaxCrossEntropyLoss.apply( + logits, + target, + 0.0, + ignore_index, + half_to_float, + ) + if reduction == "sum": + return losses.sum() + elif reduction == "mean": + if ignore_index >= 0: + return losses.sum() / target.ne(ignore_index).sum() + else: + return losses.mean() + elif reduction == "none": + return losses + else: + raise NotImplementedError + + +except ImportError: + + def cross_entropy(logits, target, ignore_index=-100, reduction="mean"): + return _cross_entropy_pytorch(logits, target, ignore_index, reduction) diff --git a/SpeechT5/fairseq/fairseq/modules/cuda_utils.cu b/SpeechT5/fairseq/fairseq/modules/cuda_utils.cu new file mode 100644 index 0000000..516f1d9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/cuda_utils.cu @@ -0,0 +1,203 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +template <typename U, typename V> +constexpr __host__ __device__ auto divUp(U a, V b) -> decltype(a + b) { + return (a + b - 1) / b; +} + + +template<int FS, int SB, int padding_l, typename scalar_t> +__inline__ __device__ +void zeroSharedMem(scalar_t* data) { + /* + Given an array of length FS + SB, zero out the first padding_l and last + (FS - padding_l) values in the array + */ + + int tid = threadIdx.x; + + if (FS < SB) { + + // zero all if we have enough threads in a block to do all of them + if (tid < padding_l || tid > SB - FS + padding_l - 1) { + data[tid] = scalar_t(0.0); + } + } else { + + // otherwise zero out one block at a time + const int numIterations = divUp<int, int>(FS, SB); + for (int i = 0; i < numIterations; i++) { + int offset = i * SB; + if (tid + offset < padding_l) { + data[tid + offset] = scalar_t(0.0); + } else if (tid + offset < FS) { + data[SB + tid + offset] = scalar_t(0.0); + } + } + } +} + +template<typename scalar_t> +__inline__ __device__ +scalar_t warpReduce(scalar_t data) { + /* + Reduce an array within each warp. After processing all values in warp will + caontain the sum of all original values in that warp. + + data - pointer to data to reduce + */ + data += __shfl_xor_sync(SHFL_MASK, data, 16); + data += __shfl_xor_sync(SHFL_MASK, data, 8); + data += __shfl_xor_sync(SHFL_MASK, data, 4); + data += __shfl_xor_sync(SHFL_MASK, data, 2); + data += __shfl_xor_sync(SHFL_MASK, data, 1); + return data; +} + +template<typename scalar_t> +__inline__ __device__ +scalar_t blockReduce(scalar_t data) { + /* + Reduce an entire array on the block level. After processing, the + first value in the array will contain the reduced sum. + + data - pointer to data to reduce + */ + + static __shared__ scalar_t warpSum[32]; + const int tid = threadIdx.x; + int wid = tid / 32; + int lane = tid % 32; + + __syncthreads(); + + // reduce each warp then write to shared memory + scalar_t sum = warpReduce(data); + if (lane == 0) { + warpSum[wid] = sum; + } + + __syncthreads(); + + scalar_t v; + // perform final sum of partial warp sums + if (tid < blockDim.x / 32) { + v = warpSum[lane]; + } else { + v = scalar_t(0.0); + } + + if (wid == 0) { + v = warpReduce(v); + } + __syncthreads(); + + return v; +} + +void checkCudaStatus(cudaError_t status, int lineNumber = -1) { + + if (status != cudaSuccess) { + std::cout << cudaGetErrorString(status) + << " at line " << lineNumber << std::endl; + std::cout << "Exiting" << std::endl; + exit(1); + } +} + +template<int FS, int SB, int padding_l, typename scalar_t> +__device__ +void load_input_to_shared(const scalar_t* input, // global memory + int inputOffset, int sequenceLength, + int iteration, int numIterations, + bool no_prev, scalar_t* output /* shared memory */) { + /* + Load a block size of input into shared memory with + right and left overhang of total size FS. If previously + loaded memory, overlap will be shifted over to reduce + global memory access + + input - pointer to start of channel sequence + inputOffset - how far in the sequence to start loading + sequenceLength - total length of sequence + iteration - which block of sequence we are loading + numIterations - total number of blocks to load + no_prev - whether to load the whole block if the previous block + wasn't loaded + output - shared memory to write input to + */ + + const int tid = threadIdx.x; + + // Load the left "overhang" of input + if (iteration > 0) { + if (padding_l < SB) { + + // load all at once + if (tid < padding_l) { + output[tid] = (no_prev) ? input[inputOffset - padding_l + tid] : output[tid + SB]; + } + } else { + + // load in chunks of size SB + int numIterations = divUp<int, int>(padding_l, SB); + for (int i = 0; i < numIterations; i++) { + int offset = i * SB; + if ((tid + offset) < padding_l) { + output[tid + offset] = (no_prev) ? input[inputOffset - padding_l + tid + offset] : output[tid + offset + SB]; + } + } + } + } + + // Load the right "overhang" of input + if (iteration < (numIterations - 1)) { + const int elementsLeft = sequenceLength - (iteration+1) * SB; + + if ((FS - padding_l) < SB) { + + // load all at once + if (tid < (FS - padding_l)) { + output[padding_l + SB + tid] = (tid < elementsLeft) ? input[inputOffset + SB + tid] : scalar_t(0.0); + } + } else { + + // load in chunks of size SB + int numIterations = divUp<int, int>(FS - padding_l, SB); + for (int i = 0; i < numIterations; i++) { + int offset = i * SB; + if ((tid + offset) < (FS - padding_l)) { + output[padding_l + SB + tid + offset] = ((tid + offset) < elementsLeft) ? input[inputOffset + SB + tid + offset] : scalar_t(0.0); + } + } + } + } + + // We should also clear out the right "overhang" + if (iteration == (numIterations - 1)) { + if ((FS - padding_l) < SB) { + + // clear out all at once + if (tid < (FS - padding_l)) { + output[padding_l + SB + tid] = scalar_t(0.0); + } + } else { + + // clear in chunks of size SB + int numIterations = divUp<int, int>(FS - padding_l, SB); + for (int i = 0; i < numIterations; i++) { + int offset = i * SB; + if ((tid + offset) < (FS - padding_l)) { + output[padding_l + SB + tid + offset] = scalar_t(0.0); + } + } + } + } + output[tid + padding_l] = ((inputOffset + tid) < sequenceLength) ? input[inputOffset + tid] : scalar_t(0.0); +} diff --git a/SpeechT5/fairseq/fairseq/modules/downsampled_multihead_attention.py b/SpeechT5/fairseq/fairseq/modules/downsampled_multihead_attention.py new file mode 100644 index 0000000..2cdece3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/downsampled_multihead_attention.py @@ -0,0 +1,316 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +# + +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.scalar_bias import scalar_bias + + +class SingleHeadAttention(nn.Module): + """ + Single-head attention that supports Gating and Downsampling + """ + + def __init__( + self, + out_channels, + embed_dim, + head_dim, + head_index, + dropout=0.0, + bias=True, + project_input=True, + gated=False, + downsample=False, + num_heads=1, + ): + super().__init__() + self.embed_dim = embed_dim + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.head_index = head_index + self.head_dim = head_dim + self.project_input = project_input + self.gated = gated + self.downsample = downsample + self.num_heads = num_heads + self.projection = None + + k_layers = [] + v_layers = [] + if self.downsample: + k_layers.append(Downsample(self.head_index)) + v_layers.append(Downsample(self.head_index)) + out_proj_size = self.head_dim + else: + out_proj_size = self.head_dim * self.num_heads + if self.gated: + k_layers.append(GatedLinear(self.embed_dim, out_proj_size, bias=bias)) + self.in_proj_q = GatedLinear(self.embed_dim, out_proj_size, bias=bias) + v_layers.append(GatedLinear(self.embed_dim, out_proj_size, bias=bias)) + else: + k_layers.append(Linear(self.embed_dim, out_proj_size, bias=bias)) + self.in_proj_q = Linear(self.embed_dim, out_proj_size, bias=bias) + v_layers.append(Linear(self.embed_dim, out_proj_size, bias=bias)) + + self.in_proj_k = nn.Sequential(*k_layers) + self.in_proj_v = nn.Sequential(*v_layers) + + if self.downsample: + self.out_proj = Linear(out_proj_size, self.head_dim, bias=bias) + else: + self.out_proj = Linear(out_proj_size, out_channels, bias=bias) + + self.scaling = self.head_dim ** -0.5 + + def forward( + self, + query, + key, + value, + mask_future_timesteps=False, + key_padding_mask=None, + use_scalar_bias=False, + ): + """Input shape: Time x Batch x Channel + Self-attention can be implemented by passing in the same arguments for + query, key and value. Future timesteps can be masked with the + `mask_future_timesteps` argument. Padding elements can be excluded from + the key by passing a binary ByteTensor (`key_padding_mask`) with shape: + batch x src_len, where padding elements are indicated by 1s. + """ + src_len, bsz, out_channels = key.size() + tgt_len = query.size(0) + assert list(query.size()) == [tgt_len, bsz, out_channels] + assert key.size() == value.size() + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.downsample: + size = bsz + else: + size = bsz * self.num_heads + + k = key + v = value + q = query + if self.project_input: + q = self.in_proj_q(q) + k = self.in_proj_k(k) + v = self.in_proj_v(v) + src_len = k.size()[0] + q *= self.scaling + + if not self.downsample: + q = q.view(tgt_len, size, self.head_dim) + k = k.view(src_len, size, self.head_dim) + v = v.view(src_len, size, self.head_dim) + + q = q.transpose(0, 1) + k = k.transpose(0, 1) + v = v.transpose(0, 1) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + if mask_future_timesteps: + assert ( + query.size() == key.size() + ), "mask_future_timesteps only applies to self-attention" + attn_weights *= torch.tril( + attn_weights.data.new([1]).expand(tgt_len, tgt_len).clone(), + diagonal=-1, + )[:, :: self.head_index + 1 if self.downsample else 1].unsqueeze(0) + attn_weights += torch.triu( + attn_weights.data.new([-math.inf]).expand(tgt_len, tgt_len).clone(), + diagonal=0, + )[:, :: self.head_index + 1 if self.downsample else 1].unsqueeze(0) + tgt_size = tgt_len + if use_scalar_bias: + attn_weights = scalar_bias(attn_weights, 2) + v = scalar_bias(v, 1) + tgt_size += 1 + + if key_padding_mask is not None: + # don't attend to padding symbols + if key_padding_mask.max() > 0: + if self.downsample: + attn_weights = attn_weights.view(bsz, 1, tgt_len, src_len) + else: + attn_weights = attn_weights.view( + size, self.num_heads, tgt_len, src_len + ) + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2), + -math.inf, + ) + attn_weights = attn_weights.view(size, tgt_len, src_len) + attn_weights = F.softmax(attn_weights, dim=-1) + attn_weights = self.dropout_module(attn_weights) + + attn = torch.bmm(attn_weights, v) + if self.downsample: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, self.head_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, self.embed_dim) + + attn = self.out_proj(attn) + + return attn, attn_weights + + +class DownsampledMultiHeadAttention(nn.ModuleList): + """ + Multi-headed attention with Gating and Downsampling + """ + + def __init__( + self, + out_channels, + embed_dim, + num_heads, + dropout=0.0, + bias=True, + project_input=True, + gated=False, + downsample=False, + ): + self.embed_dim = embed_dim + self.num_heads = num_heads + self.head_dim = embed_dim // num_heads + self.downsample = downsample + self.gated = gated + self.project_input = project_input + assert self.head_dim * num_heads == embed_dim + + if self.downsample: + attention_heads = [] + for index in range(self.num_heads): + attention_heads.append( + SingleHeadAttention( + out_channels, + self.embed_dim, + self.head_dim, + index, + dropout, + bias, + self.project_input, + self.gated, + self.downsample, + self.num_heads, + ) + ) + super().__init__(modules=attention_heads) + self.out_proj = Linear(embed_dim, out_channels, bias=bias) + else: + # either we have a list of attention heads, or just one attention head + # if not being downsampled, we can do the heads with one linear layer instead of separate ones + super().__init__() + self.attention_module = SingleHeadAttention( + out_channels, + self.embed_dim, + self.head_dim, + 1, + dropout, + bias, + self.project_input, + self.gated, + self.downsample, + self.num_heads, + ) + + def forward( + self, + query, + key, + value, + mask_future_timesteps=False, + key_padding_mask=None, + use_scalar_bias=False, + ): + src_len, bsz, embed_dim = key.size() + tgt_len = query.size(0) + assert embed_dim == self.embed_dim + assert list(query.size()) == [tgt_len, bsz, embed_dim] + assert key.size() == value.size() + + tgt_size = tgt_len + if use_scalar_bias: + tgt_size += 1 + + attn = [] + attn_weights = [] + if self.downsample: + for attention_head_number in range(self.num_heads): + # call the forward of each attention head + _attn, _attn_weight = self[attention_head_number]( + query, + key, + value, + mask_future_timesteps, + key_padding_mask, + use_scalar_bias, + ) + attn.append(_attn) + attn_weights.append(_attn_weight) + full_attn = torch.cat(attn, dim=2) + full_attn = self.out_proj(full_attn) + return full_attn, attn_weights[0].clone() + else: + _attn, _attn_weight = self.attention_module( + query, + key, + value, + mask_future_timesteps, + key_padding_mask, + use_scalar_bias, + ) + attn.append(_attn) + attn_weights.append(_attn_weight) + full_attn = torch.cat(attn, dim=2) + full_attn_weights = torch.cat(attn_weights) + full_attn_weights = full_attn_weights.view( + bsz, self.num_heads, tgt_size, src_len + ) + full_attn_weights = full_attn_weights.sum(dim=1) / self.num_heads + return full_attn, full_attn_weights + + +class Downsample(nn.Module): + """ + Selects every nth element, where n is the index + """ + + def __init__(self, index): + super().__init__() + self.index = index + + def forward(self, x): + return x[:: self.index + 1] + + +def Linear(in_features, out_features, dropout=0.0, bias=True): + """Weight-normalized Linear layer (input: B x T x C)""" + m = nn.Linear(in_features, out_features, bias=bias) + m.weight.data.normal_(mean=0, std=math.sqrt((1 - dropout) / in_features)) + m.bias.data.zero_() + return nn.utils.weight_norm(m) + + +def GatedLinear(in_features, out_features, dropout=0.0, bias=True): + """Weight-normalized Linear layer (input: B x T x C) with interspersed GLU units""" + return nn.Sequential( + Linear(in_features, out_features * 4, dropout, bias), + nn.GLU(), + Linear(out_features * 2, out_features * 2, dropout, bias), + nn.GLU(), + Linear(out_features, out_features, dropout, bias), + ) diff --git a/SpeechT5/fairseq/fairseq/modules/dynamic_convolution.py b/SpeechT5/fairseq/fairseq/modules/dynamic_convolution.py new file mode 100644 index 0000000..0121d45 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamic_convolution.py @@ -0,0 +1,310 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.fairseq_dropout import FairseqDropout + +from .unfold import unfold1d + + +def DynamicConv( + input_size, + kernel_size=1, + padding_l=None, + num_heads=1, + weight_dropout=0.0, + weight_softmax=False, + renorm_padding=False, + bias=False, + conv_bias=False, + query_size=None, + in_proj=False, +): + if torch.cuda.is_available(): + try: + from fairseq.modules.dynamicconv_layer import DynamicconvLayer + + return DynamicconvLayer( + input_size, + kernel_size=kernel_size, + padding_l=padding_l, + num_heads=num_heads, + weight_dropout=weight_dropout, + weight_softmax=weight_softmax, + renorm_padding=renorm_padding, + bias=bias, + conv_bias=conv_bias, + query_size=query_size, + ) + except ImportError as e: + print(e) + return DynamicConv1dTBC( + input_size, + kernel_size=kernel_size, + padding_l=padding_l, + num_heads=num_heads, + weight_dropout=weight_dropout, + weight_softmax=weight_softmax, + renorm_padding=renorm_padding, + bias=bias, + conv_bias=conv_bias, + query_size=query_size, + ) + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + + +@with_incremental_state +class DynamicConv1dTBC(nn.Module): + """Dynamic lightweight convolution taking T x B x C inputs + Args: + input_size: # of channels of the input + kernel_size: convolution channels + padding_l: padding to the left when using "same" padding + num_heads: number of heads used. The weight is of shape (num_heads, 1, kernel_size) + weight_dropout: the drop rate of the DropConnect to drop the weight + weight_softmax: normalize the weight with softmax before the convolution + renorm_padding: re-normalize the filters to ignore the padded part (only the non-padding parts sum up to 1) + bias: use bias + conv_bias: bias of the convolution + query_size: specified when feeding a different input as the query + in_proj: project the input and generate the filter together + + Shape: + Input: TxBxC, i.e. (timesteps, batch_size, input_size) + Output: TxBxC, i.e. (timesteps, batch_size, input_size) + + Attributes: + weight: the learnable weights of the module of shape + `(num_heads, 1, kernel_size)` + bias: the learnable bias of the module of shape `(input_size)` + """ + + def __init__( + self, + input_size, + kernel_size=1, + padding_l=None, + num_heads=1, + weight_dropout=0.0, + weight_softmax=False, + renorm_padding=False, + bias=False, + conv_bias=False, + query_size=None, + in_proj=False, + ): + super().__init__() + self.input_size = input_size + self.query_size = input_size if query_size is None else query_size + self.kernel_size = kernel_size + self.padding_l = padding_l + self.num_heads = num_heads + self.weight_dropout_module = FairseqDropout( + weight_dropout, module_name=self.__class__.__name__ + ) + self.weight_softmax = weight_softmax + self.renorm_padding = renorm_padding + + if in_proj: + self.weight_linear = Linear( + self.input_size, self.input_size + num_heads * kernel_size * 1 + ) + else: + self.weight_linear = Linear( + self.query_size, num_heads * kernel_size * 1, bias=bias + ) + if conv_bias: + self.conv_bias = nn.Parameter(torch.Tensor(input_size)) + else: + self.conv_bias = None + self.reset_parameters() + + @property + def in_proj(self): + return ( + self.weight_linear.out_features + == self.input_size + self.num_heads * self.kernel_size + ) + + def reset_parameters(self): + self.weight_linear.reset_parameters() + if self.conv_bias is not None: + nn.init.constant_(self.conv_bias, 0.0) + + def forward(self, x, incremental_state=None, query=None, unfold=None): + """Assuming the input, x, of the shape T x B x C and producing an output in the shape T x B x C + args: + x: Input of shape T x B x C, i.e. (timesteps, batch_size, input_size) + incremental_state: A dict to keep the state + unfold: unfold the input or not. If not, we use the matrix trick instead + query: use the specified query to predict the conv filters + """ + unfold = ( + x.size(0) > 512 if unfold is None else unfold + ) # use unfold mode as default for long sequence to save memory + unfold = unfold or (incremental_state is not None) + assert query is None or not self.in_proj + + if query is None: + query = x + if unfold: + output = self._forward_unfolded(x, incremental_state, query) + else: + output = self._forward_expanded(x, incremental_state, query) + + if self.conv_bias is not None: + output = output + self.conv_bias.view(1, 1, -1) + return output + + def _forward_unfolded(self, x, incremental_state, query): + """The conventional implementation of convolutions. + Unfolding the input by having a window shifting to the right.""" + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + R = C // H + assert R * H == C == self.input_size + + if self.in_proj: + proj = self.weight_linear(x) + x = proj.narrow(2, 0, self.input_size).contiguous() + weight = ( + proj.narrow(2, self.input_size, H * K).contiguous().view(T * B * H, -1) + ) + else: + weight = self.weight_linear(query).view(T * B * H, -1) + + # renorm_padding is only implemented in _forward_expanded + assert not self.renorm_padding or incremental_state is not None + + if incremental_state is not None: + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is None: + input_buffer = x.new() + x_unfold = torch.cat([input_buffer, x.unsqueeze(3)], dim=3) + if self.kernel_size > 1: + self._set_input_buffer( + incremental_state, x_unfold[:, :, :, -self.kernel_size + 1 :] + ) + x_unfold = x_unfold.view(T * B * H, R, -1) + else: + padding_l = self.padding_l + if K > T and padding_l == K - 1: + weight = weight.narrow(1, K - T, T) + K, padding_l = T, T - 1 + # unfold the input: T x B x C --> T' x B x C x K + x_unfold = unfold1d(x, K, padding_l, 0) + x_unfold = x_unfold.view(T * B * H, R, K) + + if self.weight_softmax and not self.renorm_padding: + weight = F.softmax(weight, dim=1) + weight = weight.narrow(1, 0, K) + + if incremental_state is not None: + weight = weight[:, -x_unfold.size(2) :] + K = weight.size(1) + + if self.weight_softmax and self.renorm_padding: + weight = F.softmax(weight, dim=1) + + weight = self.weight_dropout_module(weight, inplace=False) + + output = torch.bmm(x_unfold, weight.unsqueeze(2)) # T*B*H x R x 1 + output = output.view(T, B, C) + return output + + def _forward_expanded(self, x, incremental_stat, query): + """Turn the convolution filters into band matrices and do matrix multiplication. + This is faster when the sequence is short, but less memory efficient. + This is not used in the decoder during inference. + """ + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + R = C // H + assert R * H == C == self.input_size + if self.in_proj: + proj = self.weight_linear(x) + x = proj.narrow(2, 0, self.input_size).contiguous() + weight = ( + proj.narrow(2, self.input_size, H * K).contiguous().view(T * B * H, -1) + ) + else: + weight = self.weight_linear(query).view(T * B * H, -1) + + if not self.renorm_padding: + if self.weight_softmax: + weight = F.softmax(weight, dim=1) + weight = self.weight_dropout_module(weight, inplace=False) + weight = weight.narrow(1, 0, K).contiguous() + weight = weight.view(T, B * H, K).transpose(0, 1) + + x = x.view(T, B * H, R).transpose(0, 1) + if self.weight_softmax and self.renorm_padding: + # turn the convolution filters into band matrices + weight_expanded = weight.new(B * H, T, T + K - 1).fill_(float("-inf")) + weight_expanded.as_strided( + (B * H, T, K), (T * (T + K - 1), T + K, 1) + ).copy_(weight) + weight_expanded = weight_expanded.narrow(2, self.padding_l, T) + # normalize the weight over valid positions like self-attention + weight_expanded = F.softmax(weight_expanded, dim=2) + weight_expanded = self.weight_dropout_module(weight_expanded, inplace=False) + else: + P = self.padding_l + # For efficiency, we cut the kernel size and reduce the padding when the kernel is larger than the length + if K > T and P == K - 1: + weight = weight.narrow(2, K - T, T) + K, P = T, T - 1 + # turn the convolution filters into band matrices + weight_expanded = weight.new_zeros(B * H, T, T + K - 1, requires_grad=False) + weight_expanded.as_strided( + (B * H, T, K), (T * (T + K - 1), T + K, 1) + ).copy_(weight) + weight_expanded = weight_expanded.narrow(2, P, T) # B*H x T x T + output = torch.bmm(weight_expanded, x) + output = output.transpose(0, 1).contiguous().view(T, B, C) + return output + + def reorder_incremental_state(self, incremental_state, new_order): + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + input_buffer = input_buffer.index_select(1, new_order) + self._set_input_buffer(incremental_state, input_buffer) + + def _get_input_buffer(self, incremental_state): + return utils.get_incremental_state(self, incremental_state, "input_buffer") + + def _set_input_buffer(self, incremental_state, new_buffer): + return utils.set_incremental_state( + self, incremental_state, "input_buffer", new_buffer + ) + + def extra_repr(self): + s = "{}, kernel_size={}, padding_l={}, num_heads={}, weight_softmax={}, conv_bias={}, renorm_padding={}, in_proj={}".format( + self.input_size, + self.kernel_size, + self.padding_l, + self.num_heads, + self.weight_softmax, + self.conv_bias is not None, + self.renorm_padding, + self.in_proj, + ) + + if self.query_size != self.input_size: + s += ", query_size={}".format(self.query_size) + if self.weight_dropout_module.p > 0.0: + s += ", weight_dropout={}".format(self.weight_dropout_module.p) + return s diff --git a/SpeechT5/fairseq/fairseq/modules/dynamic_crf_layer.py b/SpeechT5/fairseq/fairseq/modules/dynamic_crf_layer.py new file mode 100644 index 0000000..8fcc6b8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamic_crf_layer.py @@ -0,0 +1,189 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +This file is to re-implemented the low-rank and beam approximation of CRF layer +Proposed by: + +Sun, Zhiqing, et al. +Fast Structured Decoding for Sequence Models +https://arxiv.org/abs/1910.11555 + +The CRF implementation is mainly borrowed from +https://github.com/kmkurn/pytorch-crf/blob/master/torchcrf/__init__.py + +""" + +import numpy as np +import torch +import torch.nn as nn + + +def logsumexp(x, dim=1): + return torch.logsumexp(x.float(), dim=dim).type_as(x) + + +class DynamicCRF(nn.Module): + """Dynamic CRF layer is used to approximate the traditional + Conditional Random Fields (CRF) + $P(y | x) = 1/Z(x) exp(sum_i s(y_i, x) + sum_i t(y_{i-1}, y_i, x))$ + + where in this function, we assume the emition scores (s) are given, + and the transition score is a |V| x |V| matrix $M$ + + in the following two aspects: + (1) it used a low-rank approximation for the transition matrix: + $M = E_1 E_2^T$ + (2) it used a beam to estimate the normalizing factor Z(x) + """ + + def __init__(self, num_embedding, low_rank=32, beam_size=64): + super().__init__() + + self.E1 = nn.Embedding(num_embedding, low_rank) + self.E2 = nn.Embedding(num_embedding, low_rank) + + self.vocb = num_embedding + self.rank = low_rank + self.beam = beam_size + + def extra_repr(self): + return "vocab_size={}, low_rank={}, beam_size={}".format( + self.vocb, self.rank, self.beam + ) + + def forward(self, emissions, targets, masks, beam=None): + """ + Compute the conditional log-likelihood of a sequence of target tokens given emission scores + + Args: + emissions (`~torch.Tensor`): Emission score are usually the unnormalized decoder output + ``(batch_size, seq_len, vocab_size)``. We assume batch-first + targets (`~torch.LongTensor`): Sequence of target token indices + ``(batch_size, seq_len) + masks (`~torch.ByteTensor`): Mask tensor with the same size as targets + + Returns: + `~torch.Tensor`: approximated log-likelihood + """ + numerator = self._compute_score(emissions, targets, masks) + denominator = self._compute_normalizer(emissions, targets, masks, beam) + return numerator - denominator + + def forward_decoder(self, emissions, masks=None, beam=None): + """ + Find the most likely output sequence using Viterbi algorithm. + + Args: + emissions (`~torch.Tensor`): Emission score are usually the unnormalized decoder output + ``(batch_size, seq_len, vocab_size)``. We assume batch-first + masks (`~torch.ByteTensor`): Mask tensor with the same size as targets + + Returns: + `~torch.LongTensor`: decoded sequence from the CRF model + """ + return self._viterbi_decode(emissions, masks, beam) + + def _compute_score(self, emissions, targets, masks=None): + batch_size, seq_len = targets.size() + emission_scores = emissions.gather(2, targets[:, :, None])[:, :, 0] # B x T + transition_scores = (self.E1(targets[:, :-1]) * self.E2(targets[:, 1:])).sum(2) + + scores = emission_scores + scores[:, 1:] += transition_scores + + if masks is not None: + scores = scores * masks.type_as(scores) + return scores.sum(-1) + + def _compute_normalizer(self, emissions, targets=None, masks=None, beam=None): + # HACK: we include "target" which is a hueristic for training + # HACK: we use a beam of tokens to approximate the normalizing factor (which is bad?) + + beam = beam if beam is not None else self.beam + batch_size, seq_len = emissions.size()[:2] + if targets is not None: + _emissions = emissions.scatter(2, targets[:, :, None], np.float("inf")) + beam_targets = _emissions.topk(beam, 2)[1] + beam_emission_scores = emissions.gather(2, beam_targets) + else: + beam_emission_scores, beam_targets = emissions.topk(beam, 2) + beam_transition_score1 = self.E1(beam_targets[:, :-1]) # B x (T-1) x K x D + beam_transition_score2 = self.E2(beam_targets[:, 1:]) # B x (T-1) x K x D + beam_transition_matrix = torch.bmm( + beam_transition_score1.view(-1, beam, self.rank), + beam_transition_score2.view(-1, beam, self.rank).transpose(1, 2), + ) + beam_transition_matrix = beam_transition_matrix.view(batch_size, -1, beam, beam) + + # compute the normalizer in the log-space + score = beam_emission_scores[:, 0] # B x K + for i in range(1, seq_len): + next_score = score[:, :, None] + beam_transition_matrix[:, i - 1] + next_score = logsumexp(next_score, dim=1) + beam_emission_scores[:, i] + + if masks is not None: + score = torch.where(masks[:, i : i + 1], next_score, score) + else: + score = next_score + + # Sum (log-sum-exp) over all possible tags + return logsumexp(score, dim=1) + + def _viterbi_decode(self, emissions, masks=None, beam=None): + # HACK: we use a beam of tokens to approximate the normalizing factor (which is bad?) + + beam = beam if beam is not None else self.beam + batch_size, seq_len = emissions.size()[:2] + beam_emission_scores, beam_targets = emissions.topk(beam, 2) + beam_transition_score1 = self.E1(beam_targets[:, :-1]) # B x (T-1) x K x D + beam_transition_score2 = self.E2(beam_targets[:, 1:]) # B x (T-1) x K x D + beam_transition_matrix = torch.bmm( + beam_transition_score1.view(-1, beam, self.rank), + beam_transition_score2.view(-1, beam, self.rank).transpose(1, 2), + ) + beam_transition_matrix = beam_transition_matrix.view(batch_size, -1, beam, beam) + + traj_tokens, traj_scores = [], [] + finalized_tokens, finalized_scores = [], [] + + # compute the normalizer in the log-space + score = beam_emission_scores[:, 0] # B x K + dummy = ( + torch.arange(beam, device=score.device).expand(*score.size()).contiguous() + ) + + for i in range(1, seq_len): + traj_scores.append(score) + _score = score[:, :, None] + beam_transition_matrix[:, i - 1] + _score, _index = _score.max(dim=1) + _score = _score + beam_emission_scores[:, i] + + if masks is not None: + score = torch.where(masks[:, i : i + 1], _score, score) + index = torch.where(masks[:, i : i + 1], _index, dummy) + else: + score, index = _score, _index + traj_tokens.append(index) + + # now running the back-tracing and find the best + best_score, best_index = score.max(dim=1) + finalized_tokens.append(best_index[:, None]) + finalized_scores.append(best_score[:, None]) + + for idx, scs in zip(reversed(traj_tokens), reversed(traj_scores)): + previous_index = finalized_tokens[-1] + finalized_tokens.append(idx.gather(1, previous_index)) + finalized_scores.append(scs.gather(1, previous_index)) + + finalized_tokens.reverse() + finalized_tokens = torch.cat(finalized_tokens, 1) + finalized_tokens = beam_targets.gather(2, finalized_tokens[:, :, None])[:, :, 0] + + finalized_scores.reverse() + finalized_scores = torch.cat(finalized_scores, 1) + finalized_scores[:, 1:] = finalized_scores[:, 1:] - finalized_scores[:, :-1] + + return finalized_scores, finalized_tokens diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/__init__.py b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/__init__.py new file mode 100644 index 0000000..22dc6f4 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .dynamicconv_layer import DynamicconvLayer # noqa diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/cuda_function_gen.py b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/cuda_function_gen.py new file mode 100644 index 0000000..9304f99 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/cuda_function_gen.py @@ -0,0 +1,223 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +def gen_forward(): + + kernels = [3, 5, 7, 15, 31, 63, 127, 255] + blocks = [32, 64, 128, 256] + + head = """ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "dynamicconv_cuda.cuh" + +std::vector<at::Tensor> dynamicconv_cuda_forward(at::Tensor input, at::Tensor weight, int padding_l) { + + at::DeviceGuard g(input.device()); + const auto minibatch = input.size(0); + const auto numFeatures = input.size(1); + const auto sequenceLength = input.size(2); + + const auto numHeads = weight.size(1); + const auto filterSize = weight.size(2); + + const auto numFiltersInBlock = numFeatures / numHeads; + const dim3 blocks(minibatch, numFeatures); + + auto output = at::zeros_like(input); + auto stream = at::cuda::getCurrentCUDAStream(); +""" + + switch = """ + switch(filterSize) { +""" + + case_k = """ + case {k}: +""" + + main_block = """ + if (padding_l == {pad}) {{ + AT_DISPATCH_FLOATING_TYPES_AND_HALF(input.scalar_type(), "dynamicconv_forward", ([&] {{ + dynamicconv_forward_kernel<{k}, {b_size}, {pad}, scalar_t> + <<<blocks, {b_size}, 0, stream>>>( + input.data<scalar_t>(), + weight.data<scalar_t>(), + minibatch, + sequenceLength, + numFeatures, + numFiltersInBlock, + numHeads, + output.data<scalar_t>()); + }})); + }} else +""" + + bad_padding = """ + { + std::cout << "WARNING: Unsupported padding size - skipping forward pass" << std::endl; + } + break;\n +""" + + end = """ + default: + std::cout << "WARNING: Unsupported filter length passed - skipping forward pass" << std::endl; + } + + return {output}; +} +""" + + with open("dynamicconv_cuda_forward.cu", "w") as forward: + forward.write(head) + forward.write(switch) + for k in kernels: + b_size = 32 + for b in blocks: + if b > k: + b_size = b + break + forward.write(case_k.format(k=k)) + for pad in [k // 2, k - 1]: + forward.write(main_block.format(k=k, b_size=b_size, pad=pad)) + forward.write(bad_padding) + forward.write(end) + + +def gen_backward(): + + kernels = [3, 5, 7, 15, 31, 63, 127, 255] + thresh = [512, 512, 512, 512, 512, 380, 256, 256] + min_block = [64, 64, 64, 64, 64, 64, 128, 256] + seqs = [32 * x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + + head = """ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "dynamicconv_cuda.cuh" + +std::vector<at::Tensor> dynamicconv_cuda_backward(at::Tensor gradOutput, int padding_l, at::Tensor input, at::Tensor weight) { + + at::DeviceGuard g(input.device()); + const auto minibatch = input.size(0); + const auto numFeatures = input.size(1); + const auto sequenceLength = input.size(2); + + const auto numHeads = weight.size(1); + const auto filterSize = weight.size(2); + + const auto numFiltersInBlock = numFeatures / numHeads; + auto numChunks = 1; + + auto gradInput = at::zeros_like(input); + auto gradWeight = at::zeros_like(weight); + auto stream = at::cuda::getCurrentCUDAStream(); + + dim3 blocks(minibatch, numHeads, numChunks); +""" + + sequence_if = """ + if (sequenceLength < {seq}) {{ + switch(filterSize) {{ +""" + + case_k = """ + case {k}: +""" + + chunks_reset = """ + numChunks = int(ceilf(sequenceLength/float({b_size}))); + blocks = dim3(minibatch, numHeads, numChunks); +""" + + main_block = """ + if (padding_l == {p}) {{ + AT_DISPATCH_FLOATING_TYPES_AND_HALF(gradOutput.scalar_type(), "dynamicconv_backward", ([&] {{ + dynamicconv_backward_kernel<{k}, {b_size}, {p}, scalar_t> + <<<blocks, {b_size}, 0, stream>>>( + gradOutput.data<scalar_t>(), + input.data<scalar_t>(), + weight.data<scalar_t>(), + minibatch, + sequenceLength, + numFeatures, + numFiltersInBlock, + numHeads, + gradWeight.data<scalar_t>(), + gradInput.data<scalar_t>()); + }})); + }} else +""" + + bad_padding = """ + { + std::cout << "WARNING: Unsupported padding size - skipping backward pass" << std::endl; + } + break;\n +""" + + bad_filter = """ + default: + std::cout << "WARNING: Unsupported filter length passed - skipping backward pass" << std::endl; + } +""" + + con_else = """ + } else +""" + + final_else = """ + { + switch(filterSize) { +""" + + last_return = """ + } + return {gradInput, gradWeight}; +} +""" + + with open("dynamicconv_cuda_backward.cu", "w") as backward: + backward.write(head) + for seq in seqs: + backward.write(sequence_if.format(seq=seq)) + for k, t, m in zip(kernels, thresh, min_block): + backward.write(case_k.format(k=k)) + if seq <= t: + b_size = seq + else: + b_size = m + backward.write(chunks_reset.format(b_size=b_size)) + for p in [k // 2, k - 1]: + backward.write(main_block.format(k=k, b_size=b_size, p=p)) + backward.write(bad_padding) + backward.write(bad_filter) + backward.write(con_else) + backward.write(final_else) + for k, m in zip(kernels, min_block): + backward.write(case_k.format(k=k)) + backward.write(chunks_reset.format(b_size=m)) + for p in [k // 2, k - 1]: + backward.write(main_block.format(k=k, b_size=m, p=p)) + backward.write(bad_padding) + backward.write(bad_filter) + backward.write(last_return) + + +if __name__ == "__main__": + gen_forward() + gen_backward() diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cpp b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cpp new file mode 100644 index 0000000..ebd4df0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cpp @@ -0,0 +1,56 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include <torch/extension.h> +#include <vector> + +std::vector<at::Tensor> dynamicconv_cuda_forward( + at::Tensor input, + at::Tensor filters, + int padding_l); + +std::vector<at::Tensor> dynamicconv_cuda_backward( + at::Tensor gradOutput, + int padding_l, + at::Tensor input, + at::Tensor filters); + + +#define CHECK_CUDA(x) AT_ASSERTM(x.type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CONTIGUOUS(x) AT_ASSERTM(x.is_contiguous(), #x " must be contiguous") +#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) + +std::vector<at::Tensor> dynamicconv_forward( + at::Tensor input, + at::Tensor filters, + int padding_l) { + + CHECK_INPUT(input); + CHECK_INPUT(filters); + + return dynamicconv_cuda_forward(input, filters, + padding_l); +} + +std::vector<at::Tensor> dynamicconv_backward( + at::Tensor gradOutput, + int padding_l, + at::Tensor input, + at::Tensor filters) { + + CHECK_INPUT(gradOutput); + CHECK_INPUT(input); + CHECK_INPUT(filters); + + return dynamicconv_cuda_backward(gradOutput, padding_l, + input, filters); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &dynamicconv_forward, "dynamicconv forward (CUDA)"); + m.def("backward", &dynamicconv_backward, "dynamicconv backward (CUDA)"); +} diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cuh b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cuh new file mode 100644 index 0000000..2196259 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda.cuh @@ -0,0 +1,51 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include <ATen/ATen.h> +#include <c10/cuda/CUDAStream.h> + +#include <cuda.h> +#include <cuda_fp16.h> +#include <cuda_runtime.h> + +#include <algorithm> +#include <functional> +#include <iostream> +#include <stdexcept> +#include <utility> +#include <vector> + +#include <stdlib.h> +#include <assert.h> +#include <math.h> + +#define SHFL_MASK 0xffffffff + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void dynamicconv_forward_kernel(const scalar_t* input, + const scalar_t* weight, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + int numHeads, + scalar_t* output); + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void dynamicconv_backward_kernel( + const scalar_t* gradOutput, // B * C * T + const scalar_t* input, // B * C * T + const scalar_t* weight, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + int numHeads, + scalar_t* gradWeight, + scalar_t* gradInput); // B * H * k * T diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda_kernel.cu b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda_kernel.cu new file mode 100644 index 0000000..300d35b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_cuda_kernel.cu @@ -0,0 +1,168 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "dynamicconv_cuda.cuh" +#include "dynamicconv_cuda_forward.cu" +#include "dynamicconv_cuda_backward.cu" +#include "../cuda_utils.cu" + +// FS is filter size and kernels are specialized for filter sizes +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void dynamicconv_forward_kernel(const scalar_t* input, + const scalar_t* weight, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + int numHeads, + scalar_t* output) { + assert(blockDim.x == SB); + + const int tid = threadIdx.x; + const int batchIdx = blockIdx.x; + const int featureIdx = blockIdx.y; + const int head = featureIdx / numFiltersInBlock; + + const int IOOffset = batchIdx * numFeatures * sequenceLength + + featureIdx * sequenceLength; + const scalar_t* inputFeature = &input[IOOffset]; + scalar_t* outputFeature = &output[IOOffset]; + + scalar_t filter[FS]; + + __shared__ scalar_t tempInput[SB + FS]; + zeroSharedMem<FS, SB, padding_l>(tempInput); + + const int numIterations = divUp<int, int>(sequenceLength, SB); + + for (int i = 0; i < numIterations; ++i) { + __syncthreads(); + const int inputOffset = i * SB; + load_input_to_shared<FS, SB, padding_l>(inputFeature, inputOffset, + sequenceLength, i, + numIterations, false, tempInput); + __syncthreads(); + if (inputOffset + tid < sequenceLength) { + + #pragma unroll + for (int k = 0; k < FS; ++k) { + const int filterOffset = batchIdx * numHeads * FS * sequenceLength + + head * FS * sequenceLength + + k * sequenceLength + + i * SB + tid; + filter[k] = weight[filterOffset]; + } + + scalar_t out = scalar_t(0.0); + #pragma unroll + for (int k = 0; k < FS; ++k) { + out += filter[k] * tempInput[tid + k]; + } + + outputFeature[inputOffset + tid] = out; + + } + } +} + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void dynamicconv_backward_kernel( + const scalar_t* gradOutput, // B * C * T + const scalar_t* input, // B * C * T + const scalar_t* weight, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + int numHeads, + scalar_t* gradWeight, + scalar_t* gradInput) { // B * H * k * T + + assert(blockDim.x == SB); + + // each block operates on a single batch and filter head + const int tid = threadIdx.x; + const int batchIdx = blockIdx.x; + const int headIdx = blockIdx.y; + const int chunkIdx = blockIdx.z; + + const int numChunks = divUp<int, int>(sequenceLength, SB); + const int inputOffset = chunkIdx * SB; + + // initialize shared memory for output gradient and input + __shared__ scalar_t tempGradOutput[SB + FS]; + __shared__ scalar_t tempInput[SB + FS]; + const int padding = FS - padding_l - 1; + + zeroSharedMem<FS, SB, padding>(tempGradOutput); + zeroSharedMem<FS, SB, padding_l>(tempInput); + + // initialize local filter and weight gradient sum arrays + scalar_t tempGradSum[FS]; + scalar_t bfilter[FS]; + for (int k = 0; k < FS; ++k) { + tempGradSum[k] = scalar_t(0.0); + + int idxOffset = inputOffset + tid + k - padding; + if (idxOffset >= 0 && idxOffset < sequenceLength) { + int bfilterOffset = batchIdx * numHeads * FS * sequenceLength + + headIdx * FS * sequenceLength + + (FS - k - 1) * sequenceLength + + idxOffset; + bfilter[k] = weight[bfilterOffset]; + } else { + bfilter[k] = scalar_t(0.0); + } + } + + + // iterate over filter block + for (int featureIdx = 0; featureIdx < numFiltersInBlock; ++featureIdx) { + __syncthreads(); + + // load input and output gradient for this channel and chunk + const int IOOffset = batchIdx * numFeatures * sequenceLength + + (headIdx * numFiltersInBlock + featureIdx) * sequenceLength; + const scalar_t* inputFeature = &input[IOOffset]; + const scalar_t* gradOutputFeature = &gradOutput[IOOffset]; + scalar_t* gradInputFeature = &gradInput[IOOffset]; + + load_input_to_shared<FS, SB, padding>(gradOutputFeature, inputOffset, + sequenceLength, chunkIdx, + numChunks, true, tempGradOutput); + load_input_to_shared<FS, SB, padding_l>(inputFeature, inputOffset, + sequenceLength, chunkIdx, + numChunks, true, tempInput); + __syncthreads(); + + // sum input and weight gradients + scalar_t out = scalar_t(0.0); + #pragma unroll + for (int k = 0; k < FS; ++k) { + tempGradSum[k] += tempInput[tid + k] * tempGradOutput[tid + padding]; + out += bfilter[k] * tempGradOutput[tid + k]; + } + + if (inputOffset + tid < sequenceLength) { + gradInputFeature[inputOffset + tid] = out; + } + } + + const int gradOffset = batchIdx * numHeads * FS * sequenceLength + + headIdx * FS * sequenceLength; + scalar_t *gradWeightFeature = &gradWeight[gradOffset]; + + // write weight gradient + if (inputOffset + tid < sequenceLength) { + for (int k = 0; k < FS; ++k) { + const int outputOffset = k * sequenceLength + inputOffset + tid; + gradWeightFeature[outputOffset] = tempGradSum[k]; + } + } +} diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_layer.py b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_layer.py new file mode 100644 index 0000000..711ed03 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamicconv_layer.py @@ -0,0 +1,227 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import dynamicconv_cuda +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.unfold import unfold1d +from torch import nn +from torch.autograd import Function + + +class dynamicconvFunction(Function): + @staticmethod + def forward(ctx, x, weights, padding_l): + ctx.padding_l = padding_l + outputs = dynamicconv_cuda.forward(x, weights, padding_l) + variables = [x, weights] + ctx.save_for_backward(*variables) + return outputs[0] + + @staticmethod + def backward(ctx, grad_output): + outputs = dynamicconv_cuda.backward( + grad_output.contiguous(), ctx.padding_l, *ctx.saved_tensors + ) + grad_input, grad_weights = outputs + return grad_input, grad_weights, None + + +@with_incremental_state +class DynamicconvLayer(nn.Module): + def __init__( + self, + input_size, + kernel_size=1, + padding_l=None, + weight_softmax=False, + num_heads=1, + weight_dropout=0.0, + bias=False, + renorm_padding=False, + conv_bias=False, + query_size=None, + ): + + super(DynamicconvLayer, self).__init__() + self.input_size = input_size + self.query_size = input_size if query_size is None else query_size + self.kernel_size = kernel_size + self.padding_l = padding_l + self.num_heads = num_heads + self.weight_softmax = weight_softmax + self.weight_dropout_module = FairseqDropout( + weight_dropout, module_name=self.__class__.__name__ + ) + self.renorm_padding = renorm_padding + self.bias = bias + + self.weight_linear = nn.Linear(input_size, num_heads * kernel_size, bias) + if conv_bias: + self.conv_bias = nn.Parameter(torch.Tensor(input_size)) + else: + self.conv_bias = None + self.reset_parameters() + + def reset_parameters(self): + nn.init.xavier_uniform_(self.weight_linear.weight) + if self.conv_bias is not None: + nn.init.constant_(self.conv_bias, 0.0) + nn.init.constant_(self.weight_linaer.bias, 0.0) + + def forward(self, x, incremental_state=None, query=None, unfold=None): + + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + # R = C // H + + # during inference time, incremental BMM is faster + if incremental_state is not None: + unfold = ( + x.size(0) > 512 if unfold is None else unfold + ) # use unfold mode as default for long sequence to save memory + unfold = unfold or (incremental_state is not None) + assert query is None + + if query is None: + query = x + if unfold: + output = self._forward_unfolded(x, incremental_state, query) + else: + output = self._forward_expanded(x, incremental_state, query) + + if self.conv_bias is not None: + output = output + self.conv_bias.view(1, 1, -1) + + return output + + # during training time, use CUDA kernel + else: + weight = self.weight_linear(x).view(T, B, H, K) + if self.weight_softmax: + weight = F.softmax(weight, dim=-1) + if self.weight_dropout_module.p: + weight = self.weight_dropout_module(weight) + + weight = weight.permute(1, 2, 3, 0).contiguous() + self.filters = weight + x = x.permute(1, 2, 0).contiguous() + output = dynamicconvFunction.apply(x, weight, self.padding_l).permute( + 2, 0, 1 + ) + if self.conv_bias is not None: + output = output + self.conv_bias.view(1, 1, -1) + return output + + def reorder_incremental_state(self, incremental_state, new_order): + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + input_buffer = input_buffer.index_select(1, new_order) + self._set_input_buffer(incremental_state, input_buffer) + + def _get_input_buffer(self, incremental_state): + return utils.get_incremental_state(self, incremental_state, "input_buffer") + + def _set_input_buffer(self, incremental_state, new_buffer): + return utils.set_incremental_state( + self, incremental_state, "input_buffer", new_buffer + ) + + def _forward_unfolded(self, x, incremental_state, query): + """The conventional implementation of convolutions. + Unfolding the input by having a window shifting to the right.""" + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + R = C // H + assert R * H == C == self.input_size + + weight = self.weight_linear(query).view(T * B * H, -1) + + # renorm_padding is only implemented in _forward_expanded + assert not self.renorm_padding or incremental_state is not None + + if incremental_state is not None: + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is None: + input_buffer = x.new() + x_unfold = torch.cat([input_buffer, x.unsqueeze(3)], dim=3) + if self.kernel_size > 1: + self._set_input_buffer( + incremental_state, x_unfold[:, :, :, -self.kernel_size + 1 :] + ) + x_unfold = x_unfold.view(T * B * H, R, -1) + else: + padding_l = self.padding_l + if K > T and padding_l == K - 1: + weight = weight.narrow(1, K - T, T) + K, padding_l = T, T - 1 + # unfold the input: T x B x C --> T' x B x C x K + x_unfold = unfold1d(x, K, padding_l, 0) + x_unfold = x_unfold.view(T * B * H, R, K) + + if self.weight_softmax and not self.renorm_padding: + weight = F.softmax(weight, dim=1) + weight = weight.narrow(1, 0, K) + + if incremental_state is not None: + weight = weight[:, -x_unfold.size(2) :] + K = weight.size(1) + + if self.weight_softmax and self.renorm_padding: + weight = F.softmax(weight, dim=1) + + weight = self.weight_dropout_module(weight, inplace=False) + + output = torch.bmm(x_unfold, weight.unsqueeze(2)) # T*B*H x R x 1 + output = output.view(T, B, C) + return output + + def _forward_expanded(self, x, incremental_stat, query): + """Turn the convolution filters into band matrices and do matrix multiplication. + This is faster when the sequence is short, but less memory efficient. + This is not used in the decoder during inference. + """ + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + R = C // H + assert R * H == C == self.input_size + weight = self.weight_linear(query).view(T * B * H, -1) + + if not self.renorm_padding: + if self.weight_softmax: + weight = F.softmax(weight, dim=1) + weight = self.weight_dropout_module(weight, inplace=False) + weight = weight.narrow(1, 0, K).contiguous() + weight = weight.view(T, B * H, K).transpose(0, 1) + + x = x.view(T, B * H, R).transpose(0, 1) + if self.weight_softmax and self.renorm_padding: + # turn the convolution filters into band matrices + weight_expanded = weight.new(B * H, T, T + K - 1).fill_(float("-inf")) + weight_expanded.as_strided( + (B * H, T, K), (T * (T + K - 1), T + K, 1) + ).copy_(weight) + weight_expanded = weight_expanded.narrow(2, self.padding_l, T) + # normalize the weight over valid positions like self-attention + weight_expanded = F.softmax(weight_expanded, dim=2) + weight_expanded = self.weight_dropout_module(weight_expanded, inplace=False) + else: + P = self.padding_l + # For efficiency, we cut the kernel size and reduce the padding when the kernel is larger than the length + if K > T and P == K - 1: + weight = weight.narrow(2, K - T, T) + K, P = T, T - 1 + # turn the convolution filters into band matrices + weight_expanded = weight.new_zeros(B * H, T, T + K - 1, requires_grad=False) + weight_expanded.as_strided( + (B * H, T, K), (T * (T + K - 1), T + K, 1) + ).copy_(weight) + weight_expanded = weight_expanded.narrow(2, P, T) # B*H x T x T + output = torch.bmm(weight_expanded, x) + output = output.transpose(0, 1).contiguous().view(T, B, C) + return output diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamiconv_cpu.cpp b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamiconv_cpu.cpp new file mode 100644 index 0000000..8a6af42 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/dynamiconv_cpu.cpp @@ -0,0 +1,35 @@ +#include <torch/torch.h> +#include <vector> + +std::vector<float*> dynamicconv_cpu_forward( + float* input, + float* filters, + int padding_l); + +std::vector<float*> dynamicconv_cpu_backward( + float* gradOutput, + int padding_l, + float* input, + float* filters); + +std::vector<float*> dynamicconv_forward( + float* input, + float* filters, + int padding_l) { + + return dynamicconv_cpu_forward(input, filters, padding_l); +} + +std::vector<float*> dynamicconv_backward( + float* gradOutput, + int padding_l, + float* input, + float* filters) { + + return dynamicconv_cpu_backward(gradOutput, padding_l, input, filters); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &dynamicconv_forward, "dynamicconv forward (CPU)"); + m.def("backward", &dynamicconv_backward, "dynamicconv backward (CPU)"); +} diff --git a/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/setup.py b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/setup.py new file mode 100644 index 0000000..6a21f7e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/dynamicconv_layer/setup.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + + +setup( + name="dynamicconv_layer", + ext_modules=[ + CUDAExtension( + name="dynamicconv_cuda", + sources=[ + "dynamicconv_cuda.cpp", + "dynamicconv_cuda_kernel.cu", + ], + ), + ], + cmdclass={"build_ext": BuildExtension}, +) diff --git a/SpeechT5/fairseq/fairseq/modules/fairseq_dropout.py b/SpeechT5/fairseq/fairseq/modules/fairseq_dropout.py new file mode 100644 index 0000000..3cddca7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/fairseq_dropout.py @@ -0,0 +1,51 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from typing import List, Optional + +import torch.nn as nn +import torch.nn.functional as F + + +logger = logging.getLogger(__name__) + + +class FairseqDropout(nn.Module): + def __init__(self, p, module_name=None): + super().__init__() + self.p = p + self.module_name = module_name + self.apply_during_inference = False + + def forward(self, x, inplace: bool = False): + if self.p > 0 and (self.training or self.apply_during_inference): + return F.dropout(x, p=self.p, training=True, inplace=inplace) + else: + return x + + def make_generation_fast_( + self, + name: str, + retain_dropout: bool = False, + retain_dropout_modules: Optional[List[str]] = None, + **kwargs + ): + if retain_dropout: + if retain_dropout_modules is not None and self.module_name is None: + logger.warning( + "Cannot enable dropout during inference for module {} " + "because module_name was not set".format(name) + ) + elif ( + retain_dropout_modules is None # if None, apply to all modules + or self.module_name in retain_dropout_modules + ): + logger.info( + "Enabling dropout during inference for module: {}".format(name) + ) + self.apply_during_inference = True + else: + logger.info("Disabling dropout for module: {}".format(name)) diff --git a/SpeechT5/fairseq/fairseq/modules/fp32_group_norm.py b/SpeechT5/fairseq/fairseq/modules/fp32_group_norm.py new file mode 100644 index 0000000..d03aac0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/fp32_group_norm.py @@ -0,0 +1,25 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Layer norm done in fp32 (for fp16 training) +""" + +import torch.nn as nn +import torch.nn.functional as F + + +class Fp32GroupNorm(nn.GroupNorm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def forward(self, input): + output = F.group_norm( + input.float(), + self.num_groups, + self.weight.float() if self.weight is not None else None, + self.bias.float() if self.bias is not None else None, + self.eps, + ) + return output.type_as(input) diff --git a/SpeechT5/fairseq/fairseq/modules/gelu.py b/SpeechT5/fairseq/fairseq/modules/gelu.py new file mode 100644 index 0000000..a2f1ecf --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/gelu.py @@ -0,0 +1,25 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +See "Gaussian Error Linear Units (GELUs)" by Dan Hendrycks and Kevin Gimpel with +the corresponding GitHub repo: https://github.com/hendrycks/GELUs +""" + +import math + +import torch +import torch.nn as nn + + +def gelu_accurate(x): + if not hasattr(gelu_accurate, "_a"): + gelu_accurate._a = math.sqrt(2 / math.pi) + return ( + 0.5 * x * (1 + torch.tanh(gelu_accurate._a * (x + 0.044715 * torch.pow(x, 3)))) + ) + + +def gelu(x: torch.Tensor) -> torch.Tensor: + return torch.nn.functional.gelu(x.float()).type_as(x) diff --git a/SpeechT5/fairseq/fairseq/modules/grad_multiply.py b/SpeechT5/fairseq/fairseq/modules/grad_multiply.py new file mode 100644 index 0000000..08d15f5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/grad_multiply.py @@ -0,0 +1,18 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + + +class GradMultiply(torch.autograd.Function): + @staticmethod + def forward(ctx, x, scale): + ctx.scale = scale + res = x.new(x) + return res + + @staticmethod + def backward(ctx, grad): + return grad * ctx.scale, None diff --git a/SpeechT5/fairseq/fairseq/modules/gumbel_vector_quantizer.py b/SpeechT5/fairseq/fairseq/modules/gumbel_vector_quantizer.py new file mode 100644 index 0000000..7113438 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/gumbel_vector_quantizer.py @@ -0,0 +1,202 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class GumbelVectorQuantizer(nn.Module): + def __init__( + self, + dim, + num_vars, + temp, + groups, + combine_groups, + vq_dim, + time_first, + activation=nn.GELU(), + weight_proj_depth=1, + weight_proj_factor=1, + ): + """Vector quantization using gumbel softmax + + Args: + dim: input dimension (channels) + num_vars: number of quantized vectors per group + temp: temperature for training. this should be a tuple of 3 elements: (start, stop, decay factor) + groups: number of groups for vector quantization + combine_groups: whether to use the vectors for all groups + vq_dim: dimensionality of the resulting quantized vector + time_first: if true, expect input in BxTxC format, otherwise in BxCxT + activation: what activation to use (should be a module). this is only used if weight_proj_depth is > 1 + weight_proj_depth: number of layers (with activation in between) to project input before computing logits + weight_proj_factor: this is used only if weight_proj_depth is > 1. scales the inner dimensionality of + projections by this factor + """ + super().__init__() + + self.groups = groups + self.combine_groups = combine_groups + self.input_dim = dim + self.num_vars = num_vars + self.time_first = time_first + + assert ( + vq_dim % groups == 0 + ), f"dim {vq_dim} must be divisible by groups {groups} for concatenation" + + var_dim = vq_dim // groups + num_groups = groups if not combine_groups else 1 + + self.vars = nn.Parameter(torch.FloatTensor(1, num_groups * num_vars, var_dim)) + nn.init.uniform_(self.vars) + + if weight_proj_depth > 1: + + def block(input_dim, output_dim): + return nn.Sequential(nn.Linear(input_dim, output_dim), activation) + + inner_dim = self.input_dim * weight_proj_factor + self.weight_proj = nn.Sequential( + *[ + block(self.input_dim if i == 0 else inner_dim, inner_dim) + for i in range(weight_proj_depth - 1) + ], + nn.Linear(inner_dim, groups * num_vars), + ) + else: + self.weight_proj = nn.Linear(self.input_dim, groups * num_vars) + nn.init.normal_(self.weight_proj.weight, mean=0, std=1) + nn.init.zeros_(self.weight_proj.bias) + + if isinstance(temp, str): + import ast + temp = ast.literal_eval(temp) + assert len(temp) == 3, f"{temp}, {len(temp)}" + + self.max_temp, self.min_temp, self.temp_decay = temp + self.curr_temp = self.max_temp + self.codebook_indices = None + + def set_num_updates(self, num_updates): + self.curr_temp = max( + self.max_temp * self.temp_decay ** num_updates, self.min_temp + ) + + def get_codebook_indices(self): + if self.codebook_indices is None: + from itertools import product + + p = [range(self.num_vars)] * self.groups + inds = list(product(*p)) + self.codebook_indices = torch.tensor( + inds, dtype=torch.long, device=self.vars.device + ).flatten() + + if not self.combine_groups: + self.codebook_indices = self.codebook_indices.view( + self.num_vars ** self.groups, -1 + ) + for b in range(1, self.groups): + self.codebook_indices[:, b] += self.num_vars * b + self.codebook_indices = self.codebook_indices.flatten() + return self.codebook_indices + + def codebook(self): + indices = self.get_codebook_indices() + return ( + self.vars.squeeze(0) + .index_select(0, indices) + .view(self.num_vars ** self.groups, -1) + ) + + def sample_from_codebook(self, b, n): + indices = self.get_codebook_indices() + indices = indices.view(-1, self.groups) + cb_size = indices.size(0) + assert ( + n < cb_size + ), f"sample size {n} is greater than size of codebook {cb_size}" + sample_idx = torch.randint(low=0, high=cb_size, size=(b * n,)) + indices = indices[sample_idx] + + z = self.vars.squeeze(0).index_select(0, indices.flatten()).view(b, n, -1) + return z + + def to_codebook_index(self, indices): + res = indices.new_full(indices.shape[:-1], 0) + for i in range(self.groups): + exponent = self.groups - i - 1 + res += indices[..., i] * (self.num_vars ** exponent) + return res + + def forward_idx(self, x): + res = self.forward(x, produce_targets=True) + return res["x"], res["targets"] + + def forward(self, x, produce_targets=False): + + result = {"num_vars": self.num_vars * self.groups} + + if not self.time_first: + x = x.transpose(1, 2) + + bsz, tsz, fsz = x.shape + x = x.reshape(-1, fsz) + x = self.weight_proj(x) + x = x.view(bsz * tsz * self.groups, -1) + + _, k = x.max(-1) + hard_x = ( + x.new_zeros(*x.shape) + .scatter_(-1, k.view(-1, 1), 1.0) + .view(bsz * tsz, self.groups, -1) + ) + hard_probs = torch.mean(hard_x.float(), dim=0) + result["code_perplexity"] = torch.exp( + -torch.sum(hard_probs * torch.log(hard_probs + 1e-7), dim=-1) + ).sum() + + avg_probs = torch.softmax( + x.view(bsz * tsz, self.groups, -1).float(), dim=-1 + ).mean(dim=0) + result["prob_perplexity"] = torch.exp( + -torch.sum(avg_probs * torch.log(avg_probs + 1e-7), dim=-1) + ).sum() + + result["temp"] = self.curr_temp + + if self.training: + x = F.gumbel_softmax(x.float(), tau=self.curr_temp, hard=True).type_as(x) + else: + x = hard_x + + x = x.view(bsz * tsz, -1) + + vars = self.vars + if self.combine_groups: + vars = vars.repeat(1, self.groups, 1) + + if produce_targets: + result["targets"] = ( + x.view(bsz * tsz * self.groups, -1) + .argmax(dim=-1) + .view(bsz, tsz, self.groups) + .detach() + ) + + x = x.unsqueeze(-1) * vars + x = x.view(bsz * tsz, self.groups, self.num_vars, -1) + x = x.sum(-2) + x = x.view(bsz, tsz, -1) + + if not self.time_first: + x = x.transpose(1, 2) # BTC -> BCT + + result["x"] = x + + return result diff --git a/SpeechT5/fairseq/fairseq/modules/kmeans_attention.py b/SpeechT5/fairseq/fairseq/modules/kmeans_attention.py new file mode 100644 index 0000000..11a7deb --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/kmeans_attention.py @@ -0,0 +1,609 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +import math +from inspect import isfunction +from operator import mul +from functools import reduce, wraps + +from aml.multimodal_video.utils.einops.lib import rearrange, repeat +from aml.multimodal_video.utils.einops.lib.layers.torch import Rearrange + +from fairseq.modules.local_attention import LocalAttention + +# constants + +TOKEN_SELF_ATTN_VALUE = -5e4 +KMEAN_INIT_ITERS = 10 + +# helper functions + + +def exists(val): + return val is not None + + +def identity(x, *args, **kwargs): + return x + + +def default(x, d): + if not exists(x): + return d if not isfunction(d) else d() + return x + + +def cast_tuple(x): + return x if isinstance(x, tuple) else (x,) + + +def cache_fn(f): + cache = None + + @wraps(f) + def cached_fn(*args, **kwargs): + nonlocal cache + if exists(cache): + return cache + cache = f(*args, **kwargs) + return cache + return cached_fn + + +def to(t): + return {'device': t.device, 'dtype': t.dtype} + + +def find_modules(nn_module, type): + return [module for module in nn_module.modules() if isinstance(module, type)] + + +def is_empty(t): + return t.nelement() == 0 + + +def max_neg_value(tensor): + return -torch.finfo(tensor.dtype).max + + +def batched_index_select(values, indices): + last_dim = values.shape[-1] + return values.gather(2, expand_dim(indices, -1, last_dim)) + + +def merge_dims(ind_from, ind_to, tensor): + shape = list(tensor.shape) + arr_slice = slice(ind_from, ind_to + 1) + shape[arr_slice] = [reduce(mul, shape[arr_slice])] + return tensor.reshape(*shape) + + +def expand_dim(t, dim, k): + t = t.unsqueeze(dim) + expand_shape = [-1] * len(t.shape) + expand_shape[dim] = k + return t.expand(*expand_shape) + + +def scatter_mean(src, t, index, dim, eps=1e-5): + numer = src.scatter_add(dim, index, t) + denom = src.scatter_add(dim, index, torch.ones_like(t)) + return numer / (denom + eps) + + +def split_at_index(dim, index, t): + pre_slices = (slice(None),) * dim + l = (*pre_slices, slice(None, index)) + r = (*pre_slices, slice(index, None)) + return t[l], t[r] + + +def reshape_dim(t, dim, split_dims): + shape = list(t.shape) + num_dims = len(shape) + dim = (dim + num_dims) % num_dims + shape[dim:dim+1] = split_dims + return t.reshape(shape) + + +def ema(old, new, decay): + if not exists(old): + return new + return old * decay + new * (1 - decay) + + +def ema_inplace(moving_avg, new, decay): + if is_empty(moving_avg): + moving_avg.data.copy_(new) + return + moving_avg.data.mul_(decay).add_(new, alpha=(1 - decay)) + +# helper classes + + +def map_first_tuple_or_el(x, fn): + if isinstance(x, tuple): + return (fn(x[0]),) + x[1:] + return fn(x) + + +class Chunk(nn.Module): + def __init__(self, chunks, fn, along_dim=-1): + super().__init__() + self.dim = along_dim + self.chunks = chunks + self.fn = fn + + def forward(self, x, **kwargs): + if self.chunks <= 1: + return self.fn(x, **kwargs) + chunks = x.chunk(self.chunks, dim=self.dim) + return torch.cat([self.fn(c, **kwargs) for c in chunks], dim=self.dim) + + +class PreNorm(nn.ModuleList): + def __init__(self, norm_class, dim, fn): + super().__init__() + self.norm = norm_class(dim) + self.fn = fn + + def forward(self, x, **kwargs): + x = self.norm(x) + return self.fn(x, **kwargs) + + +class ReZero(nn.Module): + def __init__(self, fn): + super().__init__() + self.residual_weight = nn.Parameter(torch.zeros(1)) + self.fn = fn + + def forward(self, x, **kwargs): + x = self.fn(x, **kwargs) + return map_first_tuple_or_el(x, lambda t: t * self.residual_weight) + + +class ScaleNorm(nn.Module): + def __init__(self, dim, eps=1e-5): + super().__init__() + self.g = nn.Parameter(torch.ones(1)) + self.eps = eps + + def forward(self, x): + def norm(t): + n = torch.norm(t, dim=-1, keepdim=True).clamp(min=self.eps) + return t / n * self.g + return map_first_tuple_or_el(x, norm) + + +class ProjectInOut(nn.Module): + def __init__(self, fn, dim_in, dim_out, project_out=True): + super().__init__() + self.fn = fn + self.project_in = nn.Linear(dim_in, dim_out) + self.project_out = nn.Linear(dim_out, dim_in) if project_out else identity + + def forward(self, x, **kwargs): + x = self.project_in(x) + x, loss = self.fn(x, **kwargs) + x = self.project_out(x) + return x, loss + + +class MatrixMultiply(nn.Module): + def __init__(self, tensor, transpose=False): + super().__init__() + self.tensor = tensor + self.transpose = transpose + + def forward(self, x): + tensor = self.tensor + if self.transpose: + tensor = tensor.t() + return x @ tensor + +# positional embeddings + + +class DepthWiseConv1d(nn.Module): + def __init__(self, dim_in, dim_out, kernel_size, stride=1, bias=True, causal=False): + super().__init__() + self.padding = ((kernel_size - 1), 0) if causal else (kernel_size // 2, kernel_size // 2) + + self.net = nn.Sequential( + nn.Conv1d(dim_in, dim_in, kernel_size=kernel_size, groups=dim_in, stride=stride, bias=bias), + nn.Conv1d(dim_in, dim_out, 1, bias=bias) + ) + + def forward(self, x): + x = F.pad(x, self.padding, value=0.) + return self.net(x) + + +class FixedPositionalEmbedding(nn.Module): + def __init__(self, dim, max_seq_len): + super().__init__() + inv_freq = 1. / (10000 ** (torch.arange(0, dim, 2).float() / dim)) + position = torch.arange(0, max_seq_len, dtype=torch.float) + sinusoid_inp = torch.einsum("i,j->ij", position, inv_freq) + emb = torch.cat((sinusoid_inp.sin(), sinusoid_inp.cos()), dim=-1) + self.register_buffer('emb', emb) + + def forward(self, x): + return self.emb[None, :x.shape[1], :].to(x) + + +def rotate_every_two(x): + x = rearrange(x, '... (d j) -> ... d j', j=2) + x1, x2 = x.unbind(dim=-1) + x = torch.stack((-x2, x1), dim=-1) + return rearrange(x, '... d j -> ... (d j)') + + +def apply_rotary_pos_emb(q, k, sinu_pos): + sinu_pos = rearrange(sinu_pos, '() n (j d) -> n j d', j=2) + sin, cos = sinu_pos.unbind(dim=-2) + sin, cos = map(lambda t: repeat(t, 'b n -> b (n j)', j=2), (sin, cos)) + q, k = map(lambda t: (t * cos) + (rotate_every_two(t) * sin), (q, k)) + return q, k + +# kmeans related function and class + + +def update_kmeans_on_backwards(module): + module.kmean_modules = find_modules(module, Kmeans) + + def hook(_, grad_in, grad_out): + for m in module.kmean_modules: + m.update() + + return module.register_backward_hook(hook) + + +def similarity(x, means): + return torch.einsum('bhld,hcd->bhlc', x, means) + + +def dists_and_buckets(x, means): + dists = similarity(x, means) + _, buckets = torch.max(dists, dim=-1) + return dists, buckets + + +def batched_bincount(index, num_classes, dim=-1): + shape = list(index.shape) + shape[dim] = num_classes + out = index.new_zeros(shape) + out.scatter_add_(dim, index, torch.ones_like(index, dtype=index.dtype)) + return out + + +def kmeans_iter(x, means, buckets=None): + b, h, _, d, dtype, num_clusters = *x.shape, x.dtype, means.shape[1] + + if not exists(buckets): + _, buckets = dists_and_buckets(x, means) + + bins = batched_bincount(buckets, num_clusters).sum(0, keepdim=True) + zero_mask = bins.long() == 0 + + means_ = buckets.new_zeros(b, h, num_clusters, d, dtype=dtype) + means_.scatter_add_(-2, expand_dim(buckets, -1, d), x) + means_ = F.normalize(means_.sum(0, keepdim=True), dim=-1).type(dtype) + + means = torch.where(zero_mask.unsqueeze(-1), means, means_) + means = means.squeeze(0) + return means + + +def distribution(dists, window_size): + _, topk_indices = dists.topk(k=window_size, dim=-2) + indices = topk_indices.transpose(-2, -1) + return indices.reshape(*indices.size()[:2], -1) + + +class Kmeans(nn.Module): + def __init__(self, num_heads, head_dim, num_clusters, ema_decay=0.999, commitment=1e-4): + super().__init__() + self.commitment = commitment + self.ema_decay = ema_decay + + self.register_buffer('means', torch.randn(num_heads, num_clusters, head_dim)) + self.register_buffer('initted', torch.tensor(False)) + self.num_new_means = 0 + self.new_means = None + + @torch.no_grad() + def init(self, x): + if self.initted: + return + _, h, _, d, device, _ = *x.shape, x.device, x.dtype + + num_clusters = self.means.shape[1] + + means = x.transpose(0, 1).contiguous().view(h, -1, d) + num_samples = means.shape[1] + + if num_samples >= num_clusters: + indices = torch.randperm(num_samples, device=device)[:num_clusters] + else: + indices = torch.randint(0, num_samples, (num_clusters,), device=device) + + means = means[:, indices] + + for _ in range(KMEAN_INIT_ITERS): + means = kmeans_iter(x, means) + + self.num_new_means = 0 + self.means.data.copy_(means) + self.initted.data.copy_(torch.tensor(True)) + + @torch.no_grad() + def update(self, new_means=None): + new_means = default(new_means, self.new_means) + assert exists(new_means), 'new kmeans has not been supplied' + ema_inplace(self.means, new_means, self.ema_decay) + + del self.new_means + self.new_means = None + self.num_new_means = 0 + + def forward(self, x, update_means=False): + self.init(x) + + b, dtype = x.shape[0], x.dtype + means = self.means.type(dtype) + x = F.normalize(x, 2, dim=-1).type(dtype) + + with torch.no_grad(): + dists, buckets = dists_and_buckets(x, means) + + routed_means = batched_index_select(expand_dim(means, 0, b), buckets) + loss = F.mse_loss(x, routed_means) * self.commitment + + if update_means: + with torch.no_grad(): + means = kmeans_iter(x, means, buckets) + self.new_means = ema(self.new_means, means, self.num_new_means / (self.num_new_means + 1)) + self.num_new_means += 1 + + return dists, loss + +# kmeans attention class + + +class KmeansAttention(nn.Module): + def __init__(self, num_clusters, window_size, num_heads, head_dim, causal=False, dropout=0., ema_decay=0.999, commitment=1e-4, context_window_size=None, receives_context=False, num_mem_kv=0, shared_qk=False): + super().__init__() + self.num_heads = num_heads + self.num_clusters = num_clusters + self.head_dim = head_dim + + self.window_size = window_size + self.context_window_size = default(context_window_size, window_size) + self.causal = causal + + self.shared_qk = shared_qk + self.receives_context = receives_context + self.kmeans = Kmeans(num_heads, head_dim, num_clusters, ema_decay, commitment) + self.dropout = nn.Dropout(dropout) + + self.num_mem_kv = max(num_mem_kv, 1 if causal and not shared_qk else 0) + self.mem_key = nn.Parameter(torch.randn(num_heads, num_clusters, self.num_mem_kv, head_dim)) + self.mem_value = nn.Parameter(torch.randn(num_heads, num_clusters, self.num_mem_kv, head_dim)) + + def forward(self, q, k, v, query_mask=None, key_mask=None, **kwargs): + b, h, t, d, kv_t, wsz, c_wsz, nc, device, dtype = *q.shape, k.shape[2], self.window_size, self.context_window_size, self.num_clusters, q.device, q.dtype + is_reverse = kwargs.pop('_reverse', False) + + out = torch.zeros_like(q, dtype=dtype) + + update_kmeans = self.training and not is_reverse + + key_mask = default(key_mask, query_mask) if not self.receives_context else key_mask + kv_wsz = wsz if not self.receives_context else c_wsz + + wsz = min(wsz, t) + kv_wsz = min(kv_wsz, kv_t) + + if not self.shared_qk or self.receives_context: + dists, aux_loss = self.kmeans(torch.cat((q, k), dim=2), update_kmeans) + q_dists, k_dists = split_at_index(2, t, dists) + indices = distribution(q_dists, wsz) + kv_indices = distribution(k_dists, kv_wsz) + else: + dists, aux_loss = self.kmeans(q, update_kmeans) + k = F.normalize(k, dim=-1).to(q) + indices = distribution(dists, wsz) + kv_indices = indices + + q = batched_index_select(q, indices) + k = batched_index_select(k, kv_indices) + v = batched_index_select(v, kv_indices) + + reshape_with_window = lambda x: x.reshape(b, h, nc, -1, d) + q, k, v = map(reshape_with_window, (q, k, v)) + + m_k, m_v = map(lambda x: expand_dim(x, 0, b).to(q), (self.mem_key, self.mem_value)) + k, v = map(lambda x: torch.cat(x, dim=3), ((m_k, k), (m_v, v))) + + dots = torch.einsum('bhnid,bhnjd->bhnij', q, k) * (d ** -0.5) + + mask_value = max_neg_value(dots) + + if exists(query_mask) or exists(key_mask): + query_mask = default(query_mask, lambda: torch.ones((b, t), device=device).bool()) + key_mask = default(key_mask, lambda: torch.ones((b, kv_t), device=device).bool()) + + q_mask = expand_dim(query_mask, 1, h).gather(2, indices) + kv_mask = expand_dim(key_mask, 1, h).gather(2, kv_indices) + q_mask, kv_mask = map(lambda t: t.reshape(b, h, nc, -1), (q_mask, kv_mask)) + mask = q_mask[:, :, :, :, None] * kv_mask[:, :, :, None, :] + mask = F.pad(mask, (self.num_mem_kv, 0), value=1) + dots.masked_fill_(~mask, mask_value) + del mask + + if self.causal: + q_mask, kv_mask = map(lambda t: t.reshape(b, h, nc, -1), (indices, kv_indices)) + mask = q_mask[:, :, :, :, None] >= kv_mask[:, :, :, None, :] + mask = F.pad(mask, (self.num_mem_kv, 0), value=1) + dots.masked_fill_(~mask, mask_value) + del mask + + if self.shared_qk: + q_mask, kv_mask = map(lambda t: t.reshape(b, h, nc, -1), (indices, kv_indices)) + mask = q_mask[:, :, :, :, None] == kv_mask[:, :, :, None, :] + mask = F.pad(mask, (self.num_mem_kv, 0), value=0) + dots.masked_fill_(mask, TOKEN_SELF_ATTN_VALUE) + del mask + + dots = dots.softmax(dim=-1) + dots = self.dropout(dots) + + bo = torch.einsum('bhcij,bhcjd->bhcid', dots, v) + so = torch.reshape(bo, (b, h, -1, bo.shape[-1])).type(dtype) + out = scatter_mean(out, so, indices.unsqueeze(-1).expand_as(so), -2) + return out, aux_loss + +# feedforward + + +class GELU_(nn.Module): + def forward(self, x): + return 0.5 * x * (1 + torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3)))) + + +GELU = nn.GELU if hasattr(nn, 'GELU') else GELU_ + + +class FeedForward(nn.Module): + def __init__(self, dim, mult=4, dropout=0., activation=None, glu=False): + super().__init__() + activation = default(activation, GELU) + + self.glu = glu + self.w1 = nn.Linear(dim, dim * mult * (2 if glu else 1)) + self.act = activation() + self.dropout = nn.Dropout(dropout) + self.w2 = nn.Linear(dim * mult, dim) + + def forward(self, x, **kwargs): + if not self.glu: + x = self.w1(x) + x = self.act(x) + else: + x, v = self.w1(x).chunk(2, dim=-1) + x = self.act(x) * v + + x = self.dropout(x) + x = self.w2(x) + return x + +# self attention + + +class SelfAttention(nn.Module): + def __init__(self, dim, max_seq_len, heads, local_attn_heads, window_size, dim_head=None, local_attn_window_size=None, local_attn_radius_blocks=1, causal=False, attn_dropout=0., dropout=0., kmeans_ema_decay=0.999, commitment_factor=1e-4, receives_context=False, context_window_size=None, rel_pos_emb=True, num_mem_kv=0, shared_qk=False, conv_query_kernel=9): + super().__init__() + assert dim_head or (dim % heads) == 0, 'hidden dimension must be divisible by number of heads' + assert (max_seq_len % window_size) == 0, 'maximum sequence length must be divisible by the target window size' + assert local_attn_heads <= heads, 'number of local attention heads must be less than total heads' + assert not (receives_context and local_attn_heads > 0), 'local attention cannot be used for self attention with context' + assert not (receives_context and causal), 'contextual attention layer cannot be causal' + + local_attn_window_size = default(local_attn_window_size, window_size) + context_window_size = default(context_window_size, window_size) + + self.shared_qk = shared_qk + self.receives_context = receives_context + self.heads = heads + self.local_attn_heads = local_attn_heads + self.global_attn_heads = heads - local_attn_heads + + self.causal = causal + self.window_size = window_size + + dim_head = default(dim_head, dim // heads) + dim_heads = dim_head * heads + self.dim_head = dim_head + + num_clusters = max_seq_len // window_size + + # local + + local_dim_heads = dim_head * self.local_attn_heads + + if self.local_attn_heads > 0: + rel_pos_emb_config = (dim_head, local_attn_heads) if rel_pos_emb else None + self.local_attn = LocalAttention(dim=dim_head, window_size=local_attn_window_size, causal=causal, dropout=attn_dropout, rel_pos_emb_config=rel_pos_emb_config, look_backward=local_attn_radius_blocks, look_forward=0 if causal else local_attn_radius_blocks) + self.local_to_qkv = nn.Linear(dim, 3 * local_dim_heads) + + # global + + global_dim_heads = dim_head * self.global_attn_heads + + if self.global_attn_heads > 0: + self.global_attn = KmeansAttention(num_clusters, window_size, self.global_attn_heads, dim_head, causal=causal, dropout=attn_dropout, ema_decay=kmeans_ema_decay, commitment=commitment_factor, receives_context=receives_context, num_mem_kv=num_mem_kv, shared_qk=shared_qk) + + self.to_q = nn.Sequential( + Rearrange('b n c -> b c n'), + DepthWiseConv1d(dim, global_dim_heads, conv_query_kernel, causal=causal), + Rearrange('b c n -> b n c') + ) + + self.to_v = nn.Linear(dim, global_dim_heads, bias=False) + + if not self.shared_qk: + self.to_k = nn.Linear(dim, global_dim_heads, bias=False) + + # out + + self.to_out = nn.Linear(dim_heads, dim, bias=False) + self.dropout = nn.Dropout(dropout) + + def forward(self, query, key, value, context=None, key_padding_mask=None, context_mask=None, pos_emb=None, **kwargs): + assert not (self.receives_context and not exists(context)), 'context must be passed if self attention is set to receive context' + input_mask = key_padding_mask + x = query.transpose(0, 1) + b, t, _, h, dh = *x.shape, self.heads, self.dim_head + has_local, has_global = map(lambda x: x > 0, (self.local_attn_heads, self.global_attn_heads)) + + split_heads = lambda v: reshape_dim(v, -1, (-1, dh)).transpose(1, 2).contiguous() + + if has_local: + local_qkv = self.local_to_qkv(x).chunk(3, dim=-1) + lq, lk, lv = map(split_heads, local_qkv) + + if has_global: + kv_input = x if not self.receives_context else context + + q, v = self.to_q(x), self.to_v(kv_input) + + if not self.shared_qk: + k = self.to_k(kv_input) + else: + k = self.to_q(kv_input) if self.receives_context else q + + q, k, v = map(split_heads, (q, k, v)) + + out = [] + total_loss = torch.tensor(0., requires_grad=True, **to(x)) + + if has_local: + local_out = self.local_attn(lq, lk, lv, input_mask=input_mask) + out.append(local_out) + + if has_global: + if not self.receives_context and exists(pos_emb): + q, k = apply_rotary_pos_emb(q, k, pos_emb) + + global_out, loss = self.global_attn(q, k, v, query_mask=input_mask, key_mask=context_mask) + total_loss = total_loss + loss + + out.append(global_out) + + out = torch.cat(out, dim=1) + out = out.reshape(b, h, t, -1).transpose(1, 2).reshape(b, t, -1) + out = self.dropout(out.transpose(0, 1)) + # out = self.to_out(out) + return out, total_loss diff --git a/SpeechT5/fairseq/fairseq/modules/kmeans_vector_quantizer.py b/SpeechT5/fairseq/fairseq/modules/kmeans_vector_quantizer.py new file mode 100644 index 0000000..040db1e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/kmeans_vector_quantizer.py @@ -0,0 +1,127 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +from fairseq.modules import Fp32GroupNorm + + +class KmeansVectorQuantizer(nn.Module): + def __init__( + self, dim, num_vars, groups, combine_groups, vq_dim, time_first, gamma=0.25 + ): + """Vector quantization using straight pass-through estimator (i.e. kmeans) + + Args: + dim: input dimension (channels) + num_vars: number of quantized vectors per group + groups: number of groups for vector quantization + combine_groups: whether to use the vectors for all groups + vq_dim: dimensionality of the resulting quantized vector + time_first: if true, expect input in BxTxC format, otherwise in BxCxT + gamma: commitment loss coefficient + """ + super().__init__() + + self.groups = groups + self.combine_groups = combine_groups + self.input_dim = dim + self.num_vars = num_vars + self.vq_dim = vq_dim + self.time_first = time_first + + assert ( + vq_dim % groups == 0 + ), f"dim {vq_dim} must be divisible by groups {groups} for concatenation" + + self.var_dim = vq_dim // groups + num_groups = groups if not combine_groups else 1 + + self.embedding = nn.Parameter( + 0.01 * torch.randn(num_vars, num_groups, self.var_dim) + ) + self.projection = nn.Sequential( + nn.Conv1d(dim, dim, kernel_size=1, groups=groups, bias=False), + Fp32GroupNorm(groups, dim), + ) + self.gamma = gamma + self.mse_mean = nn.MSELoss(reduction="mean") + + def _pass_grad(self, x, y): + """Manually set gradient for backward pass. + for y = f(x), ensure that during the backward pass, + dL/dy = dL/dx regardless of f(x). + Returns: + y, with the gradient forced to be dL/dy = dL/dx. + """ + + return y.detach() + (x - x.detach()) + + @property + def expand_embedding(self): + if self.combine_groups: + return self.embedding.expand(self.num_vars, self.groups, self.var_dim) + return self.embedding + + def forward_idx(self, x): + res = self.forward(x, produce_targets=True) + return res["x"], res["targets"] + + def forward(self, x, produce_targets=False): + + result = {"num_vars": self.num_vars} + + if self.time_first: + x = x.transpose(1, 2) + + bsz, fsz, tsz = x.shape + + ze = self.projection(x) + ze_ = ze.view(bsz, self.groups, self.var_dim, tsz).permute(0, 3, 1, 2) + d = ( + (ze_.unsqueeze(0) - self.expand_embedding.unsqueeze(1).unsqueeze(1)) + .view(self.num_vars, bsz, tsz, self.groups, -1) + .norm(dim=-1, p=2) + ) + idx = d.argmin(dim=0) + zq = ( + torch.stack( + [ + self.expand_embedding[idx[..., group], group] + for group in range(self.groups) + ], + dim=-2, + ) + .view(bsz, tsz, self.groups * self.var_dim) + .permute(0, 2, 1) + ) + assert ze.shape == zq.shape, (ze.shape, zq.shape) + x = self._pass_grad(ze, zq) + + hard_x = ( + idx.new_zeros(bsz * tsz * self.groups, self.num_vars) + .scatter_(-1, idx.view(-1, 1), 1.0) + .view(bsz * tsz, self.groups, -1) + ) + hard_probs = torch.mean(hard_x.float(), dim=0) + result["code_perplexity"] = torch.exp( + -torch.sum(hard_probs * torch.log(hard_probs + 1e-7), dim=-1) + ).sum() + + if produce_targets: + result["targets"] = idx + + if self.time_first: + x = x.transpose(1, 2) # BCT -> BTC + result["x"] = x + + ze = ze.float() + zq = zq.float() + latent_loss = self.mse_mean(zq, ze.detach()) + commitment_loss = self.mse_mean(ze, zq.detach()) + + result["kmeans_loss"] = latent_loss + self.gamma * commitment_loss + + return result diff --git a/SpeechT5/fairseq/fairseq/modules/layer_drop.py b/SpeechT5/fairseq/fairseq/modules/layer_drop.py new file mode 100644 index 0000000..8961d8b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/layer_drop.py @@ -0,0 +1,44 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +LayerDrop as described in https://arxiv.org/abs/1909.11556. +""" + +import torch +import torch.nn as nn + + +class LayerDropModuleList(nn.ModuleList): + """ + A LayerDrop implementation based on :class:`torch.nn.ModuleList`. + + We refresh the choice of which layers to drop every time we iterate + over the LayerDropModuleList instance. During evaluation we always + iterate over all layers. + + Usage:: + + layers = LayerDropList(p=0.5, modules=[layer1, layer2, layer3]) + for layer in layers: # this might iterate over layers 1 and 3 + x = layer(x) + for layer in layers: # this might iterate over all layers + x = layer(x) + for layer in layers: # this might not iterate over any layers + x = layer(x) + + Args: + p (float): probability of dropping out each layer + modules (iterable, optional): an iterable of modules to add + """ + + def __init__(self, p, modules=None): + super().__init__(modules) + self.p = p + + def __iter__(self): + dropout_probs = torch.empty(len(self)).uniform_() + for i, m in enumerate(super().__iter__()): + if not self.training or (dropout_probs[i] > self.p): + yield m diff --git a/SpeechT5/fairseq/fairseq/modules/layer_norm.py b/SpeechT5/fairseq/fairseq/modules/layer_norm.py new file mode 100644 index 0000000..234609d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/layer_norm.py @@ -0,0 +1,50 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +try: + from apex.normalization import FusedLayerNorm as _FusedLayerNorm + + has_fused_layernorm = True + + class FusedLayerNorm(_FusedLayerNorm): + @torch.jit.unused + def forward(self, x): + if not x.is_cuda: + return super().forward(x) + else: + with torch.cuda.device(x.device): + return super().forward(x) + + +except ImportError: + has_fused_layernorm = False + + +def LayerNorm(normalized_shape, eps=1e-5, elementwise_affine=True, export=False): + if torch.jit.is_scripting(): + export = True + if not export and torch.cuda.is_available() and has_fused_layernorm: + return FusedLayerNorm(normalized_shape, eps, elementwise_affine) + return torch.nn.LayerNorm(normalized_shape, eps, elementwise_affine) + + +class Fp32LayerNorm(nn.LayerNorm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def forward(self, input): + output = F.layer_norm( + input.float(), + self.normalized_shape, + self.weight.float() if self.weight is not None else None, + self.bias.float() if self.bias is not None else None, + self.eps, + ) + return output.type_as(input) diff --git a/SpeechT5/fairseq/fairseq/modules/learned_positional_embedding.py b/SpeechT5/fairseq/fairseq/modules/learned_positional_embedding.py new file mode 100644 index 0000000..378d0f7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/learned_positional_embedding.py @@ -0,0 +1,61 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + + +class LearnedPositionalEmbedding(nn.Embedding): + """ + This module learns positional embeddings up to a fixed maximum size. + Padding ids are ignored by either offsetting based on padding_idx + or by setting padding_idx to None and ensuring that the appropriate + position ids are passed to the forward function. + """ + + def __init__(self, num_embeddings: int, embedding_dim: int, padding_idx: int): + super().__init__(num_embeddings, embedding_dim, padding_idx) + self.onnx_trace = False + if self.padding_idx is not None: + self.max_positions = self.num_embeddings - self.padding_idx - 1 + else: + self.max_positions = self.num_embeddings + + def forward( + self, + input: Tensor, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + positions: Optional[Tensor] = None, + ): + """Input is expected to be of size [bsz x seqlen].""" + assert (positions is None) or ( + self.padding_idx is None + ), "If positions is pre-computed then padding_idx should not be set." + + if positions is None: + if incremental_state is not None: + # positions is the same for every token when decoding a single step + # Without the int() cast, it doesn't work in some cases when exporting to ONNX + positions = torch.zeros( + (1, 1), device=input.device, dtype=input.dtype + ).fill_(int(self.padding_idx + input.size(1))) + else: + positions = utils.make_positions( + input, self.padding_idx, onnx_trace=self.onnx_trace + ) + return F.embedding( + positions, + self.weight, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) diff --git a/SpeechT5/fairseq/fairseq/modules/lightconv_layer/__init__.py b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/__init__.py new file mode 100644 index 0000000..3b2a99c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .lightconv_layer import LightconvLayer # noqa diff --git a/SpeechT5/fairseq/fairseq/modules/lightconv_layer/cuda_function_gen.py b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/cuda_function_gen.py new file mode 100644 index 0000000..a25433d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/cuda_function_gen.py @@ -0,0 +1,289 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +def gen_forward(): + + kernels = [3, 5, 7, 15, 31, 63, 127, 255] + seqs = [32 * x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + + head = """ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "lightconv_cuda.cuh" + +std::vector<at::Tensor> lightconv_cuda_forward(at::Tensor input, at::Tensor filters, int padding_l) { + + at::DeviceGuard g(input.device()); + const auto minibatch = input.size(0); + const auto numFeatures = input.size(1); + const auto sequenceLength = input.size(2); + + const auto numHeads = filters.size(0); + const auto filterSize = filters.size(1); + + const auto numFiltersInBlock = numFeatures / numHeads; + + const dim3 blocks(minibatch, numFeatures); + + auto output = at::zeros_like(input); + auto stream = at::cuda::getCurrentCUDAStream(); +""" + + sequence_if = """ + if (sequenceLength <= {seq}) {{ + switch(filterSize) {{ +""" + + case_k = """ + case {k}: +""" + + main_block = """ + if (padding_l == {pad}) {{ + AT_DISPATCH_FLOATING_TYPES_AND_HALF(input.scalar_type(), "lightconv_forward", ([&] {{ + lightconv_forward_kernel<{k}, {b_size}, {pad}, scalar_t> + <<<blocks, {b_size}, 0, stream>>>( + input.data<scalar_t>(), + filters.data<scalar_t>(), + minibatch, + sequenceLength, + numFeatures, + numFiltersInBlock, + output.data<scalar_t>()); + }})); + }} else +""" + + bad_padding = """ + { + std::cout << "WARNING: Unsupported padding size - skipping forward pass" << std::endl; + } + break; +""" + + bad_filter = """ + default: + std::cout << "WARNING: Unsupported filter length passed - skipping forward pass" << std::endl; + } +""" + + con_else = """ + } else +""" + + final_else = """ + { + switch(filterSize) { +""" + + final_return = """ + } + + return {output}; +} +""" + + with open("lightconv_cuda_forward.cu", "w") as forward: + forward.write(head) + for seq in seqs: + forward.write(sequence_if.format(seq=seq)) + for k in kernels: + forward.write(case_k.format(k=k)) + for pad in [k // 2, k - 1]: + forward.write(main_block.format(k=k, b_size=seq, pad=pad)) + forward.write(bad_padding) + forward.write(bad_filter) + forward.write(con_else) + + forward.write(final_else) + for k in kernels: + forward.write(case_k.format(k=k)) + for pad in [k // 2, k - 1]: + forward.write(main_block.format(k=k, b_size=seq, pad=pad)) + forward.write(bad_padding) + forward.write(bad_filter) + forward.write(final_return) + + +def gen_backward(): + + head = """ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "lightconv_cuda.cuh" + +std::vector<at::Tensor> lightconv_cuda_backward( + at::Tensor gradOutput, + int padding_l, + at::Tensor input, + at::Tensor filters) { + + // gradWrtInput + const int minibatch = input.size(0); + const int numFeatures = input.size(1); + const int sequenceLength = input.size(2); + + const int numHeads = filters.size(0); + const int filterSize = filters.size(1); + + const dim3 gradBlocks(minibatch, numFeatures); + const dim3 weightGradFirstpassShortBlocks(minibatch, numHeads); + const dim3 weightGradSecondpassBlocks(numHeads, filterSize); + + const int numFiltersInBlock = numFeatures / numHeads; + + auto gradInput = at::zeros_like(input); + auto gradFilters = at::zeros_like(filters); + + at::DeviceGuard g(input.device()); + auto stream = at::cuda::getCurrentCUDAStream(); + + switch(filterSize) { +""" + + sequence_if = """ + if (sequenceLength <= {seq}) {{ +""" + + case_k = """ + case {k}: +""" + + main_block = """ + if (padding_l == {p}) {{ + AT_DISPATCH_FLOATING_TYPES_AND_HALF(input.scalar_type(), "lightconv_backward", ([&] {{ + lightconv_grad_wrt_input_kernel<{k}, {b_size}, {p}, scalar_t> + <<<gradBlocks, {b_size}, 0, stream>>>( + gradOutput.data<scalar_t>(), + filters.data<scalar_t>(), + minibatch, + sequenceLength, + numFeatures, + numFiltersInBlock, + gradInput.data<scalar_t>()); + +""" + + weight_grad_short = """ + at::Tensor tempSumGradFilters = at::zeros({{minibatch, numHeads, filterSize}}, input.options().dtype(at::kFloat)); + lightconv_grad_wrt_weights_firstpass_short_kernel<{k}, {b_size}, {p}, scalar_t> + <<<weightGradFirstpassShortBlocks, {b_size}, 0, stream>>>( + input.data<scalar_t>(), + gradOutput.data<scalar_t>(), + minibatch, + sequenceLength, + numFeatures, + numFiltersInBlock, + numHeads, + tempSumGradFilters.data<float>() + ); + + lightconv_grad_wrt_weights_secondpass_short_kernel<{k}, {b_size}, scalar_t> + <<<weightGradSecondpassBlocks, {b_size}, 0, stream>>>( + tempSumGradFilters.data<float>(), + minibatch, + numFiltersInBlock, + gradFilters.data<scalar_t>() + ); + }})); + }} else +""" + + weight_grad = """ + at::Tensor tempSumGradFilters = at::zeros({{minibatch, numFeatures, filterSize}}, input.options().dtype(at::kFloat)); + lightconv_grad_wrt_weights_firstpass_kernel<{k}, {b_size}, {p}, scalar_t> + <<<gradBlocks, {b_size}, 0, stream>>>( + input.data<scalar_t>(), + gradOutput.data<scalar_t>(), + minibatch, + sequenceLength, + numFeatures, + numFiltersInBlock, + tempSumGradFilters.data<float>() + ); + + lightconv_grad_wrt_weights_secondpass_kernel<{k}, {b_size}, scalar_t> + <<<weightGradSecondpassBlocks, {b_size}, 0, stream>>>( + tempSumGradFilters.data<float>(), + minibatch, + numFiltersInBlock, + gradFilters.data<scalar_t>() + ); + }})); + }} else +""" + + bad_padding = """ + { + std::cout << "WARNING: Unsupported padding size - skipping backward pass" << std::endl; + } +""" + + breakout = """ + break; +""" + + bad_filter = """ + default: + std::cout << "WARNING: Unsupported filter length passed - skipping backward pass" << std::endl; +""" + + con_else = """ + } else +""" + + final_else = """ + { + switch(filterSize) { +""" + + last_return = """ + } + return {gradInput, gradFilters}; +} +""" + + kernels = [3, 5, 7, 15, 31, 63, 127, 255] + seqs = [32 * x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + thresh = [32, 32, 64, 128, 256, -1, -1, -1] + max_mem = [-1, -1, -1, -1, -1, 192, 96, 64] + + with open("lightconv_cuda_backward.cu", "w") as backward: + backward.write(head) + for (k, t, mem) in zip(kernels, thresh, max_mem): + backward.write(case_k.format(k=k)) + for seq in seqs: + if (t == -1 or seq <= t) and (mem == -1 or seq < mem): + backward.write(sequence_if.format(seq=seq)) + for p in [k // 2, k - 1]: + backward.write(main_block.format(k=k, b_size=seq, p=p)) + backward.write(weight_grad_short.format(k=k, b_size=seq, p=p)) + backward.write(bad_padding) + else: + for p in [k // 2, k - 1]: + backward.write(main_block.format(k=k, b_size=32, p=p)) + backward.write(weight_grad.format(k=k, b_size=32, p=p)) + backward.write(bad_padding) + backward.write(breakout) + break + backward.write(con_else) + backward.write(bad_filter) + backward.write(last_return) + + +if __name__ == "__main__": + gen_forward() + gen_backward() diff --git a/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cpp b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cpp new file mode 100644 index 0000000..4bf6b5a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cpp @@ -0,0 +1,54 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include <torch/extension.h> +#include <vector> + +std::vector<at::Tensor> lightconv_cuda_forward( + at::Tensor input, + at::Tensor filters, + int padding_l); + +std::vector<at::Tensor> lightconv_cuda_backward( + at::Tensor gradOutput, + int padding_l, + at::Tensor input, + at::Tensor filters); + + +#define CHECK_CUDA(x) AT_ASSERTM(x.type().is_cuda(), #x " must be a CUDA tensor") +#define CHECK_CONTIGUOUS(x) AT_ASSERTM(x.is_contiguous(), #x " must be contiguous") +#define CHECK_INPUT(x) CHECK_CUDA(x); CHECK_CONTIGUOUS(x) + +std::vector<at::Tensor> lightconv_forward( + at::Tensor input, + at::Tensor filters, + int padding_l) { + + CHECK_INPUT(input); + CHECK_INPUT(filters); + + return lightconv_cuda_forward(input, filters, padding_l); +} + +std::vector<at::Tensor> lightconv_backward( + at::Tensor gradOutput, + int padding_l, + at::Tensor input, + at::Tensor filters) { + + CHECK_INPUT(gradOutput); + CHECK_INPUT(input); + CHECK_INPUT(filters); + + return lightconv_cuda_backward(gradOutput, padding_l, input, filters); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("forward", &lightconv_forward, "lighconv forward (CUDA)"); + m.def("backward", &lightconv_backward, "lighconv backward (CUDA)"); +} diff --git a/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cuh b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cuh new file mode 100644 index 0000000..3cae57b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda.cuh @@ -0,0 +1,83 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include <ATen/ATen.h> +#include <c10/cuda/CUDAStream.h> + +#include <cuda.h> +#include <cuda_runtime.h> + +#include <algorithm> +#include <functional> +#include <iostream> +#include <stdexcept> +#include <utility> +#include <vector> + +#include <stdlib.h> +#include <assert.h> + +#define SHFL_MASK 0xffffffff + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_forward_kernel(const scalar_t* input, + const scalar_t* filters, + int minibatch, int sequenceLength, + int numFeatures, int numFiltersInBlock, + scalar_t* output); + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_grad_wrt_input_kernel( + const scalar_t* input, + const scalar_t* filters, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + scalar_t* output); + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_firstpass_short_kernel( + const scalar_t* input, + const scalar_t* gradInput, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + int numHeads, + float* output); + +template<int FS, int SB, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_secondpass_short_kernel( + const float* input, + const int minibatch, + const int numFiltersInBlock, + scalar_t* output); + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_firstpass_kernel( + const scalar_t* input, + const scalar_t* gradInput, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + float* output); + +template<int FS, int SB, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_secondpass_kernel( + const float* input, + const int minibatch, + const int numFiltersInBlock, + scalar_t* output); + diff --git a/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda_kernel.cu b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda_kernel.cu new file mode 100644 index 0000000..8ee83a5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_cuda_kernel.cu @@ -0,0 +1,375 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "lightconv_cuda.cuh" +#include "lightconv_cuda_forward.cu" +#include "lightconv_cuda_backward.cu" +#include "../cuda_utils.cu" + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_forward_kernel(const scalar_t* input, + const scalar_t* filters, + int minibatch, int sequenceLength, + int numFeatures, int numFiltersInBlock, + scalar_t* output) { + + const int tid = threadIdx.x; + const int batchIdx = blockIdx.x; + const int featureIdx = blockIdx.y; + const int filterIdx = featureIdx / numFiltersInBlock; + + const int IOOffset = numFeatures * sequenceLength * batchIdx + featureIdx * sequenceLength; + const scalar_t* inputFeature = &input[IOOffset]; + scalar_t* outputFeature = &output[IOOffset]; + const scalar_t* inputFilter = &filters[filterIdx * FS]; + + assert(blockDim.x == SB); + + scalar_t filter[FS]; + #pragma unroll + for (int i = 0; i < FS; ++i) { + filter[i] = inputFilter[i]; + } + + __shared__ scalar_t temp[SB + FS]; + zeroSharedMem<FS, SB, padding_l>(temp); + + const int numIterations = divUp<int, int>(sequenceLength, SB); + + for (int i = 0; i < numIterations; ++i) { + // Read input into shared memory + const int inputOffset = i * SB; + + load_input_to_shared<FS, SB, padding_l>(inputFeature, inputOffset, sequenceLength, + i, numIterations, (numIterations == 1), temp); + + __syncthreads(); + + scalar_t out = 0; + #pragma unroll + for (int j = 0; j < FS; ++j) { + out += filter[j] * temp[tid + j]; + } + + // Write output + const int outputOffset = inputOffset; + if ((outputOffset + tid) < sequenceLength) { + outputFeature[outputOffset + tid] = out; + } + + __syncthreads(); + } +} + +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_grad_wrt_input_kernel( + const scalar_t* input, + const scalar_t* filters, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + scalar_t* output) { + + // input grad kernel is similar to forward kernel + const int tid = threadIdx.x; + const int batchIdx = blockIdx.x; + const int featureIdx = blockIdx.y; + const int filterIdx = featureIdx / numFiltersInBlock; + + const int IOOffset = numFeatures * sequenceLength * batchIdx + featureIdx * sequenceLength; + const scalar_t* inputFeature = &input[IOOffset]; + scalar_t* outputFeature = &output[IOOffset]; + const scalar_t* inputFilter = &filters[filterIdx * FS]; + + assert(blockDim.x == SB); + + scalar_t filter[FS]; + + // The only change is loading the filter in reverse + #pragma unroll + for (int i = 0; i < FS; ++i) { + filter[i] = inputFilter[FS - i - 1]; + } + + __shared__ scalar_t temp[SB + FS]; + const int padding = FS - padding_l - 1; + zeroSharedMem<FS, SB, padding>(temp); + + __syncthreads(); + + const int numIterations = divUp<int, int>(sequenceLength, SB); + + for (int i = 0; i < numIterations; ++i) { + // Read input into shared memory + const int inputOffset = i * SB; + + load_input_to_shared<FS, SB, padding>(inputFeature, inputOffset, sequenceLength, + i, numIterations, false, temp); + + __syncthreads(); + + scalar_t out = 0; + #pragma unroll + for (int j = 0; j < FS; ++j) { + out += filter[j] * temp[tid + j]; + } + + // Write output + const int outputOffset = inputOffset; + if ((outputOffset + tid) < sequenceLength) { + outputFeature[outputOffset + tid] = out; + } + + __syncthreads(); + } +} + +// This is by far the most expensive kernel in terms of time taken. +// Can be 16x slower than the forward or grad_wrt_input when filter size is 31 +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_firstpass_short_kernel( + const scalar_t* input, + const scalar_t* gradInput, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + int numHeads, + float* output) { + + const int tid = threadIdx.x; + const int batchIdx = blockIdx.x; + const int filterIdx = blockIdx.y; + + const int numIterations = divUp<int, int>(sequenceLength, SB); + + float* tempOutputGradWeight = &output[filterIdx * FS * minibatch]; + + assert(blockDim.x == SB); + + __shared__ scalar_t tempInput[SB + FS]; + __shared__ scalar_t tempGradInput[SB + FS]; + + // local weight accumulation + float accumWeights[FS]; + + // Initialize memory + for (int i = 0; i < FS; ++i) { + accumWeights[i] = float(0.0); + } + + + // loop over each sequence within filterblock + for (int idxInFilterBlock = 0; idxInFilterBlock < numFiltersInBlock; ++idxInFilterBlock) { + + const int featureOffset = batchIdx * numFeatures * sequenceLength + (filterIdx * numFiltersInBlock + idxInFilterBlock) * sequenceLength; + const scalar_t* inputFeature = &input[featureOffset]; + const scalar_t* gradInputFeature = &gradInput[featureOffset]; + + zeroSharedMem<FS, SB, padding_l>(tempInput); + zeroSharedMem<FS, SB, (FS/2)>(tempGradInput); + __syncthreads(); + + for (int i = 0; i < numIterations; ++i) { + + const int inputOffset = i * SB; + + load_input_to_shared<FS, SB, padding_l>(inputFeature, inputOffset, sequenceLength, + i, numIterations, false, tempInput); + load_input_to_shared<FS, SB, (FS/2)>(gradInputFeature, inputOffset, sequenceLength, + i, numIterations, false, tempGradInput); + + __syncthreads(); + + const int gradIndex = (FS/2) + tid; + scalar_t tempGrad = tempGradInput[gradIndex]; + + #pragma unroll + for (int j = 0; j < FS; j++) { + const int inputIndex = tid + j; + accumWeights[j] += tempInput[inputIndex] * tempGrad; + } + + __syncthreads(); + + } + + } + + // Row-major sum + for (int filterWeightIdx = 0; filterWeightIdx < FS; ++filterWeightIdx) { + + float temp; + if (tid < sequenceLength) { + temp = accumWeights[filterWeightIdx]; + } else { + temp = float(0.0); + } + + const int outputOffset = filterWeightIdx * minibatch + batchIdx; + + temp = blockReduce(temp); + + if (tid == 0) { + tempOutputGradWeight[outputOffset] = temp; + } + } +} + +template<int FS, int SB, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_secondpass_short_kernel( + const float* input, + const int minibatch, + const int numFiltersInBlock, + scalar_t* output) { + + assert(blockDim.x == SB); + + const int tid = threadIdx.x; + + const int filterIdx = blockIdx.x; + const int filterWeightIdx = blockIdx.y; + + const int inputOffset = filterIdx * FS * minibatch + + filterWeightIdx * minibatch; + const float* tempInput = &input[inputOffset]; + + // read into shared memory for reduction + int readIndex = tid; + + float sum = 0.0; + while (readIndex < minibatch) { + sum += tempInput[readIndex]; + readIndex += SB; + } + + float temp = blockReduce(sum); + + if (tid == 0) { + output[blockIdx.x * FS + blockIdx.y] = temp; + } +} + +// This is by far the most expensive kernel in terms of time taken. +// Can be 16x slower than the forward or grad_wrt_input when filter size is 31 +template<int FS, int SB, int padding_l, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_firstpass_kernel( + const scalar_t* input, + const scalar_t* gradInput, + int minibatch, + int sequenceLength, + int numFeatures, + int numFiltersInBlock, + float* output) { + + assert(blockDim.x == SB); + + const int tid = threadIdx.x; + const int batchIdx = blockIdx.x; + const int featureIdx = blockIdx.y; + const int filterIdx = featureIdx / numFiltersInBlock; + const int idxInFilterBlock = featureIdx % numFiltersInBlock; + + const int numIterations = divUp<int, int>(sequenceLength, SB); + + float temp; + + __shared__ scalar_t tempInput[SB + FS]; + __shared__ scalar_t tempGradInput[SB + FS]; + zeroSharedMem<FS, SB, padding_l>(tempInput); + zeroSharedMem<FS, SB, (FS/2)>(tempGradInput); + __syncthreads(); + + float accumWeights[FS]; + + for (int i = 0; i < FS; ++i) { + accumWeights[i] = float(0.0); + } + + const int IOOffset = batchIdx * numFeatures * sequenceLength + featureIdx * sequenceLength; + const scalar_t* inputFeature = &input[IOOffset]; + const scalar_t* gradInputFeature = &gradInput[IOOffset]; + float* tempOutputGradWeight = &output[filterIdx * FS * minibatch * numFiltersInBlock]; + + for (int i = 0; i < numIterations; ++i) { + const int inputOffset = i * SB; + + load_input_to_shared<FS, SB, padding_l>(inputFeature, inputOffset, sequenceLength, + i, numIterations, false, tempInput); + load_input_to_shared<FS, SB, (FS/2)>(gradInputFeature, inputOffset, sequenceLength, + i, numIterations, false, tempGradInput); + __syncthreads(); + + #pragma unroll + for (int j = 0; j < FS; ++j) { + accumWeights[j] += tempInput[tid + j] * tempGradInput[tid + (FS/2)]; + } + + __syncthreads(); + } + + // Row-major sum + for (int filterWeightIdx = 0; filterWeightIdx < FS; ++filterWeightIdx) { + + // Write to shared memory before reduction + if (tid < sequenceLength) { + temp = accumWeights[filterWeightIdx]; + } else { + temp = float(0.0); + } + + temp = blockReduce(temp); + + const int outputOffset = filterWeightIdx * minibatch * numFiltersInBlock + + batchIdx * numFiltersInBlock + + idxInFilterBlock; + + if (tid == 0) { + tempOutputGradWeight[outputOffset] = temp; + } + } +} + +template<int FS, int SB, typename scalar_t> +__global__ +void lightconv_grad_wrt_weights_secondpass_kernel( + const float* input, + const int minibatch, + const int numFiltersInBlock, + scalar_t* output) { + + assert(blockDim.x == SB); + const int tid = threadIdx.x; + + // What is the id within a minibatch + const int filterIdx = blockIdx.x; + const int filterWeightIdx = blockIdx.y; + + const int inputOffset = filterIdx * FS * minibatch * numFiltersInBlock + + filterWeightIdx * minibatch * numFiltersInBlock; + const float* tempInput = &input[inputOffset]; + + int readIndex = tid; + + float sum = float(0.0); + while (readIndex < (minibatch * numFiltersInBlock)) { + sum += tempInput[readIndex]; + readIndex += SB; + } + + float temp = blockReduce(sum); + + if (tid == 0) { + output[blockIdx.x * FS + blockIdx.y] = temp; + } +} diff --git a/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_layer.py b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_layer.py new file mode 100644 index 0000000..e7e597f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/lightconv_layer.py @@ -0,0 +1,137 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import lightconv_cuda +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.fairseq_dropout import FairseqDropout +from torch import nn +from torch.autograd import Function + + +class lightconvFunction(Function): + @staticmethod + def forward(ctx, x, weights, padding_l): + ctx.padding_l = padding_l + outputs = lightconv_cuda.forward(x, weights, padding_l) + variables = [x, weights] + ctx.save_for_backward(*variables) + return outputs[0] + + @staticmethod + def backward(ctx, grad_output): + outputs = lightconv_cuda.backward( + grad_output.contiguous(), ctx.padding_l, *ctx.saved_tensors + ) + grad_input, grad_weights = outputs + return grad_input, grad_weights, None + + +@with_incremental_state +class LightconvLayer(nn.Module): + def __init__( + self, + input_size, + kernel_size=1, + padding_l=None, + weight_softmax=False, + num_heads=1, + weight_dropout=0.0, + bias=False, + ): + super(LightconvLayer, self).__init__() + self.input_size = input_size + self.kernel_size = kernel_size + self.padding_l = padding_l + self.num_heads = num_heads + self.weight_softmax = weight_softmax + self.weight_dropout_module = FairseqDropout( + weight_dropout, module_name=self.__class__.__name__ + ) + + self.weight = nn.Parameter(torch.Tensor(num_heads, kernel_size)) + if bias: + self.bias = nn.Parameter(torch.Tensor(input_size)) + else: + self.bias = None + self.reset_parameters() + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + for k, v in state_dict.items(): + if k.endswith(prefix + "weight"): + if v.dim() == 3 and v.size(1) == 1: + state_dict[k] = v.squeeze(1) + + def reset_parameters(self): + nn.init.xavier_uniform_(self.weight) + if self.bias is not None: + nn.init.constant_(self.bias, 0.0) + + def forward(self, x, incremental_state=None): + + # during inference time, incremental BMM is faster + if incremental_state is not None: + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + R = C // H + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is None: + input_buffer = x.new() + x_unfold = torch.cat([input_buffer, x.unsqueeze(3)], dim=3) + if self.kernel_size > 1: + self._set_input_buffer( + incremental_state, x_unfold[:, :, :, -self.kernel_size + 1 :] + ) + x_unfold = x_unfold.view(T * B * H, R, -1) + + weight = self.weight + if self.weight_softmax: + weight = F.softmax(weight.float(), dim=1).type_as(weight) + + weight = weight[:, -x_unfold.size(2) :] + + K = weight.size(1) + + weight = ( + weight.view(1, H, K) + .expand(T * B, H, K) + .contiguous() + .view(T * B * H, K, 1) + ) + + weight = self.weight_dropout_module(weight) + output = torch.bmm(x_unfold, weight) # T*B*H x R x 1 + output = output.view(T, B, C) + return output + + # during training time, use CUDA kernel + else: + x = x.permute(1, 2, 0).contiguous() + weight = self.weight + if self.weight_softmax: + weight = F.softmax(self.weight, -1) + if self.weight_dropout_module.p: + weight = self.weight_dropout_module(weight) + return lightconvFunction.apply(x, weight, self.padding_l).permute(2, 0, 1) + + def reorder_incremental_state(self, incremental_state, new_order): + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + input_buffer = input_buffer.index_select(1, new_order) + self._set_input_buffer(incremental_state, input_buffer) + + def _get_input_buffer(self, incremental_state): + return utils.get_incremental_state(self, incremental_state, "input_buffer") + + def _set_input_buffer(self, incremental_state, new_buffer): + return utils.set_incremental_state( + self, incremental_state, "input_buffer", new_buffer + ) + + def half(self): + return self._apply(lambda t: t.half() if t.is_floating_point() else t) diff --git a/SpeechT5/fairseq/fairseq/modules/lightconv_layer/setup.py b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/setup.py new file mode 100644 index 0000000..052635b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightconv_layer/setup.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from setuptools import setup +from torch.utils.cpp_extension import BuildExtension, CUDAExtension + + +setup( + name="lightconv_layer", + ext_modules=[ + CUDAExtension( + "lightconv_cuda", + [ + "lightconv_cuda.cpp", + "lightconv_cuda_kernel.cu", + ], + ), + ], + cmdclass={"build_ext": BuildExtension}, +) diff --git a/SpeechT5/fairseq/fairseq/modules/lightweight_convolution.py b/SpeechT5/fairseq/fairseq/modules/lightweight_convolution.py new file mode 100644 index 0000000..ec11a95 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/lightweight_convolution.py @@ -0,0 +1,310 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.unfold import unfold1d + + +def LightweightConv( + input_size, + kernel_size=1, + padding_l=None, + num_heads=1, + weight_dropout=0.0, + weight_softmax=False, + bias=False, +): + if torch.cuda.is_available(): + try: + from fairseq.modules.lightconv_layer import LightconvLayer + + return LightconvLayer( + input_size, + kernel_size=kernel_size, + padding_l=padding_l, + num_heads=num_heads, + weight_dropout=weight_dropout, + weight_softmax=weight_softmax, + bias=bias, + ) + except ImportError as e: + print(e) + return LightweightConv1dTBC( + input_size, + kernel_size=kernel_size, + padding_l=padding_l, + num_heads=num_heads, + weight_dropout=weight_dropout, + weight_softmax=weight_softmax, + bias=bias, + ) + + +class LightweightConv1d(nn.Module): + """Lightweight Convolution assuming the input is BxCxT + This is just an example that explains LightConv clearer than the TBC version. + We don't use this module in the model. + + Args: + input_size: # of channels of the input and output + kernel_size: convolution channels + padding: padding + num_heads: number of heads used. The weight is of shape + `(num_heads, 1, kernel_size)` + weight_softmax: normalize the weight with softmax before the convolution + + Shape: + Input: BxCxT, i.e. (batch_size, input_size, timesteps) + Output: BxCxT, i.e. (batch_size, input_size, timesteps) + + Attributes: + weight: the learnable weights of the module of shape + `(num_heads, 1, kernel_size)` + bias: the learnable bias of the module of shape `(input_size)` + """ + + def __init__( + self, + input_size, + kernel_size=1, + padding=0, + num_heads=1, + weight_softmax=False, + bias=False, + weight_dropout=0.0, + ): + super().__init__() + self.input_size = input_size + self.kernel_size = kernel_size + self.num_heads = num_heads + self.padding = padding + self.weight_softmax = weight_softmax + self.weight = nn.Parameter(torch.Tensor(num_heads, 1, kernel_size)) + + if bias: + self.bias = nn.Parameter(torch.Tensor(input_size)) + else: + self.bias = None + self.weight_dropout_module = FairseqDropout( + weight_dropout, module_name=self.__class__.__name__ + ) + self.reset_parameters() + + def reset_parameters(self): + nn.init.xavier_uniform_(self.weight) + if self.bias is not None: + nn.init.constant_(self.bias, 0.0) + + def forward(self, input): + """ + input size: B x C x T + output size: B x C x T + """ + B, C, T = input.size() + H = self.num_heads + + weight = self.weight + if self.weight_softmax: + weight = F.softmax(weight, dim=-1) + + weight = self.weight_dropout_module(weight) + # Merge every C/H entries into the batch dimension (C = self.input_size) + # B x C x T -> (B * C/H) x H x T + # One can also expand the weight to C x 1 x K by a factor of C/H + # and do not reshape the input instead, which is slow though + input = input.view(-1, H, T) + output = F.conv1d(input, weight, padding=self.padding, groups=self.num_heads) + output = output.view(B, C, T) + if self.bias is not None: + output = output + self.bias.view(1, -1, 1) + + return output + + +@with_incremental_state +class LightweightConv1dTBC(nn.Module): + """Lightweight Convolution assuming the input is TxBxC + Args: + input_size: # of channels of the input + kernel_size: convolution channels + padding_l: padding to the left when using "same" padding + num_heads: number of heads used. The weight is of shape (num_heads, 1, kernel_size) + weight_dropout: the drop rate of the DropConnect to drop the weight + weight_softmax: normalize the weight with softmax before the convolution + bias: use bias + + Shape: + Input: TxBxC, i.e. (timesteps, batch_size, input_size) + Output: TxBxC, i.e. (timesteps, batch_size, input_size) + + Attributes: + weight: the learnable weights of the module of shape + `(num_heads, 1, kernel_size)` + bias: the learnable bias of the module of shape `(input_size)` + """ + + def __init__( + self, + input_size, + kernel_size=1, + padding_l=None, + num_heads=1, + weight_dropout=0.0, + weight_softmax=False, + bias=False, + ): + super().__init__() + self.input_size = input_size + self.kernel_size = kernel_size + self.padding_l = padding_l + self.num_heads = num_heads + self.weight_dropout_module = FairseqDropout( + weight_dropout, module_name=self.__class__.__name__ + ) + self.weight_softmax = weight_softmax + + self.weight = nn.Parameter(torch.Tensor(num_heads, 1, kernel_size)) + if bias: + self.bias = nn.Parameter(torch.Tensor(input_size)) + else: + self.bias = None + + self.reset_parameters() + self.onnx_trace = False + + def reset_parameters(self): + nn.init.xavier_uniform_(self.weight) + if self.bias is not None: + nn.init.constant_(self.bias, 0.0) + + def forward(self, x, incremental_state=None, unfold=False): + """Assuming the input, x, of the shape T x B x C and producing an output in the shape T x B x C + args: + x: Input of shape T x B x C, i.e. (timesteps, batch_size, input_size) + incremental_state: A dict to keep the state + unfold: unfold the input or not. If not, we use the matrix trick instead + """ + unfold = unfold or (incremental_state is not None) + + if unfold: + output = self._forward_unfolded(x, incremental_state) + else: + output = self._forward_expanded(x, incremental_state) + + if self.bias is not None: + output = output + self.bias.view(1, 1, -1) + return output + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def _forward_unfolded(self, x, incremental_state): + """The conventional implementation of convolutions. + Unfolding the input by having a window shifting to the right.""" + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + R = C // H + assert R * H == C == self.input_size + + weight = self.weight.view(H, K) + if incremental_state is not None: + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is None: + input_buffer = x.new() + x_unfold = torch.cat([input_buffer, x.unsqueeze(3)], dim=3) + if self.kernel_size > 1: + self._set_input_buffer( + incremental_state, x_unfold[:, :, :, -self.kernel_size + 1 :] + ) + x_unfold = x_unfold.view(T * B * H, R, -1) + else: + # unfold the input: T x B x C --> T' x B x C x K + x_unfold = unfold1d(x, self.kernel_size, self.padding_l, 0) + x_unfold = x_unfold.view(T * B * H, R, K) + + if self.weight_softmax: + weight = utils.softmax(weight, dim=1, onnx_trace=self.onnx_trace).type_as( + weight + ) + + if incremental_state is not None: + weight = weight[:, -x_unfold.size(2) :] + K = weight.size(1) + + weight = ( + weight.view(1, H, K).expand(T * B, H, K).contiguous().view(T * B * H, K, 1) + ) + + weight = self.weight_dropout_module(weight) + output = torch.bmm(x_unfold, weight) # T*B*H x R x 1 + output = output.view(T, B, C) + return output + + def _forward_expanded(self, x, incremental_state): + """Turn the convolution filters into band matrices and do matrix multiplication. + This is faster when the sequence is short, but less memory efficient. + This is not used in the decoder during inference. + """ + T, B, C = x.size() + K, H = self.kernel_size, self.num_heads + R = C // H + assert R * H == C == self.input_size + + weight = self.weight.view(H, K) + if self.weight_softmax: + weight = utils.softmax(weight, dim=1, onnx_trace=self.onnx_trace).type_as( + weight + ) + weight = weight.view(1, H, K).expand(T * B, H, K).contiguous() + weight = weight.view(T, B * H, K).transpose(0, 1) + + x = x.view(T, B * H, R).transpose(0, 1) + P = self.padding_l + if K > T and P == K - 1: + weight = weight.narrow(2, K - T, T) + K, P = T, T - 1 + # turn the convolution filters into band matrices + weight_expanded = weight.new_zeros(B * H, T, T + K - 1, requires_grad=False) + weight_expanded.as_strided((B * H, T, K), (T * (T + K - 1), T + K, 1)).copy_( + weight + ) + weight_expanded = weight_expanded.narrow(2, P, T) + weight_expanded = self.weight_dropout_module(weight_expanded) + + output = torch.bmm(weight_expanded, x) + output = output.transpose(0, 1).contiguous().view(T, B, C) + return output + + def reorder_incremental_state(self, incremental_state, new_order): + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + input_buffer = input_buffer.index_select(1, new_order) + self._set_input_buffer(incremental_state, input_buffer) + + def _get_input_buffer(self, incremental_state): + return utils.get_incremental_state(self, incremental_state, "input_buffer") + + def _set_input_buffer(self, incremental_state, new_buffer): + return utils.set_incremental_state( + self, incremental_state, "input_buffer", new_buffer + ) + + def extra_repr(self): + s = "{}, kernel_size={}, padding_l={}, num_heads={}, weight_softmax={}, bias={}".format( + self.input_size, + self.kernel_size, + self.padding_l, + self.num_heads, + self.weight_softmax, + self.bias is not None, + ) + if self.weight_dropout_module.p > 0.0: + s += ", weight_dropout={}".format(self.weight_dropout_module.p) + return s diff --git a/SpeechT5/fairseq/fairseq/modules/linearized_convolution.py b/SpeechT5/fairseq/fairseq/modules/linearized_convolution.py new file mode 100644 index 0000000..f7e156c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/linearized_convolution.py @@ -0,0 +1,110 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state + +from .conv_tbc import ConvTBC + +from typing import Dict, Optional +from torch import Tensor + +@with_incremental_state +class LinearizedConvolution(ConvTBC): + """An optimized version of nn.Conv1d. + + At training time, this module uses ConvTBC, which is an optimized version + of Conv1d. At inference time, it optimizes incremental generation (i.e., + one time step at a time) by replacing the convolutions with linear layers. + Note that the input order changes from training to inference. + """ + + def __init__(self, in_channels, out_channels, kernel_size, **kwargs): + super().__init__(in_channels, out_channels, kernel_size, **kwargs) + self._linearized_weight = None + self.register_backward_hook(self._clear_linearized_weight) + + def state_dict(self, destination=None, prefix="", keep_vars=False): + state = ConvTBC.state_dict(self, destination, prefix, keep_vars=keep_vars) + # don't store redundant _linearized_weight in checkpoints + if prefix + "_linearized_weight" in state: + del state[prefix + "_linearized_weight"] + return state + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + if prefix + "_linearized_weight" in state_dict: + del state_dict[prefix + "_linearized_weight"] + + @torch.jit.export + def forward(self, input, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None): + """ + Args: + incremental_state: Used to buffer signal; if not None, then input is + expected to contain a single frame. If the input order changes + between time steps, call reorder_incremental_state. + Input: + Time x Batch x Channel during training + Batch x Time x Channel during inference + """ + if incremental_state is None: + output = self.conv_tbc(input) + if self.kernel_size[0] > 1 and self.padding[0] > 0: + # remove future timesteps added by padding + output = output[: -self.padding[0], :, :] + return output + + # reshape weight + weight = self._get_linearized_weight() + kw = self.kernel_size[0] + + bsz = input.size(0) # input: bsz x len x dim + if kw > 1: + input = input.data + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is None: + input_buffer = input.new(bsz, kw, input.size(2)).zero_() + self._set_input_buffer(incremental_state, input_buffer) + else: + # shift buffer + input_buffer[:, :-1, :] = input_buffer[:, 1:, :].clone() + # append next input + input_buffer[:, -1, :] = input[:, -1, :] + input = input_buffer + with torch.no_grad(): + output = F.linear(input.view(bsz, -1), weight, self.bias) + return output.view(bsz, 1, -1) + + @torch.jit.unused + def reorder_incremental_state(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], new_order): + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + input_buffer = input_buffer.index_select(0, new_order) + self._set_input_buffer(incremental_state, input_buffer) + + @torch.jit.unused + def _get_input_buffer(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]]): + return utils.get_incremental_state(self, incremental_state, "input_buffer") + + @torch.jit.unused + def _set_input_buffer(self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], new_buffer): + return utils.set_incremental_state( + self, incremental_state, "input_buffer", new_buffer + ) + + @torch.jit.unused + def _get_linearized_weight(self): + if self._linearized_weight is None: + kw = self.kernel_size[0] + weight = self.weight.transpose(2, 1).transpose(1, 0).contiguous() + assert weight.size() == (self.out_channels, kw, self.in_channels) + return weight.view(self.out_channels, -1) + return self._linearized_weight + + @torch.jit.unused + def _clear_linearized_weight(self, *args): + self._linearized_weight = None diff --git a/SpeechT5/fairseq/fairseq/modules/multihead_attention.py b/SpeechT5/fairseq/fairseq/modules/multihead_attention.py new file mode 100644 index 0000000..9bdca0f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/multihead_attention.py @@ -0,0 +1,500 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.quant_noise import quant_noise +from torch import Tensor, nn +from torch.nn import Parameter + + +@with_incremental_state +class MultiheadAttention(nn.Module): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + ): + super().__init__() + self.embed_dim = embed_dim + self.kdim = kdim if kdim is not None else embed_dim + self.vdim = vdim if vdim is not None else embed_dim + self.qkv_same_dim = self.kdim == embed_dim and self.vdim == embed_dim + + self.num_heads = num_heads + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + + self.head_dim = embed_dim // num_heads + assert ( + self.head_dim * num_heads == self.embed_dim + ), "embed_dim must be divisible by num_heads" + self.scaling = self.head_dim ** -0.5 + + self.self_attention = self_attention + self.encoder_decoder_attention = encoder_decoder_attention + + assert not self.self_attention or self.qkv_same_dim, ( + "Self-attention requires query, key and " "value to be of the same size" + ) + + self.k_proj = quant_noise( + nn.Linear(self.kdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.v_proj = quant_noise( + nn.Linear(self.vdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.q_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + self.out_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + if add_bias_kv: + self.bias_k = Parameter(torch.Tensor(1, 1, embed_dim)) + self.bias_v = Parameter(torch.Tensor(1, 1, embed_dim)) + else: + self.bias_k = self.bias_v = None + + self.add_zero_attn = add_zero_attn + + self.reset_parameters() + + self.onnx_trace = False + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def reset_parameters(self): + if self.qkv_same_dim: + # Empirically observed the convergence to be much better with + # the scaled initialization + nn.init.xavier_uniform_(self.k_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.v_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.q_proj.weight, gain=1 / math.sqrt(2)) + else: + nn.init.xavier_uniform_(self.k_proj.weight) + nn.init.xavier_uniform_(self.v_proj.weight) + nn.init.xavier_uniform_(self.q_proj.weight) + + nn.init.xavier_uniform_(self.out_proj.weight) + if self.out_proj.bias is not None: + nn.init.constant_(self.out_proj.bias, 0.0) + if self.bias_k is not None: + nn.init.xavier_normal_(self.bias_k) + if self.bias_v is not None: + nn.init.xavier_normal_(self.bias_v) + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights + + @staticmethod + def _append_prev_key_padding_mask( + key_padding_mask: Optional[Tensor], + prev_key_padding_mask: Optional[Tensor], + batch_size: int, + src_len: int, + static_kv: bool, + ) -> Optional[Tensor]: + # saved key padding masks have shape (bsz, seq_len) + if prev_key_padding_mask is not None and static_kv: + new_key_padding_mask = prev_key_padding_mask + elif prev_key_padding_mask is not None and key_padding_mask is not None: + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), key_padding_mask.float()], dim=1 + ) + # During incremental decoding, as the padding token enters and + # leaves the frame, there will be a time when prev or current + # is None + elif prev_key_padding_mask is not None: + if src_len > prev_key_padding_mask.size(1): + filler = torch.zeros( + (batch_size, src_len - prev_key_padding_mask.size(1)), + device=prev_key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), filler.float()], dim=1 + ) + else: + new_key_padding_mask = prev_key_padding_mask.float() + elif key_padding_mask is not None: + if src_len > key_padding_mask.size(1): + filler = torch.zeros( + (batch_size, src_len - key_padding_mask.size(1)), + device=key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [filler.float(), key_padding_mask.float()], dim=1 + ) + else: + new_key_padding_mask = key_padding_mask.float() + else: + new_key_padding_mask = prev_key_padding_mask + return new_key_padding_mask + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + """Reorder buffered internal state (for incremental generation).""" + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + for k in input_buffer.keys(): + input_buffer_k = input_buffer[k] + if input_buffer_k is not None: + if self.encoder_decoder_attention and input_buffer_k.size( + 0 + ) == new_order.size(0): + break + input_buffer[k] = input_buffer_k.index_select(0, new_order) + incremental_state = self._set_input_buffer(incremental_state, input_buffer) + return incremental_state + + def _get_input_buffer( + self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ) -> Dict[str, Optional[Tensor]]: + result = self.get_incremental_state(incremental_state, "attn_state") + if result is not None: + return result + else: + empty_result: Dict[str, Optional[Tensor]] = {} + return empty_result + + def _set_input_buffer( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + buffer: Dict[str, Optional[Tensor]], + ): + return self.set_incremental_state(incremental_state, "attn_state", buffer) + + def apply_sparse_mask(self, attn_weights, tgt_len: int, src_len: int, bsz: int): + return attn_weights + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + items_to_add = {} + keys_to_remove = [] + for k in state_dict.keys(): + if k.endswith(prefix + "in_proj_weight"): + # in_proj_weight used to be q + k + v with same dimensions + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.weight"] = state_dict[k][:dim] + items_to_add[prefix + "k_proj.weight"] = state_dict[k][dim : 2 * dim] + items_to_add[prefix + "v_proj.weight"] = state_dict[k][2 * dim :] + + keys_to_remove.append(k) + + k_bias = prefix + "in_proj_bias" + if k_bias in state_dict.keys(): + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.bias"] = state_dict[k_bias][:dim] + items_to_add[prefix + "k_proj.bias"] = state_dict[k_bias][ + dim : 2 * dim + ] + items_to_add[prefix + "v_proj.bias"] = state_dict[k_bias][2 * dim :] + + keys_to_remove.append(prefix + "in_proj_bias") + + for k in keys_to_remove: + del state_dict[k] + + for key, value in items_to_add.items(): + state_dict[key] = value diff --git a/SpeechT5/fairseq/fairseq/modules/positional_embedding.py b/SpeechT5/fairseq/fairseq/modules/positional_embedding.py new file mode 100644 index 0000000..8e94e35 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/positional_embedding.py @@ -0,0 +1,35 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.nn as nn + +from .learned_positional_embedding import LearnedPositionalEmbedding +from .sinusoidal_positional_embedding import SinusoidalPositionalEmbedding + + +def PositionalEmbedding( + num_embeddings: int, + embedding_dim: int, + padding_idx: int, + learned: bool = False, +): + if learned: + # if padding_idx is specified then offset the embedding ids by + # this index and adjust num_embeddings appropriately + # TODO: The right place for this offset would be inside + # LearnedPositionalEmbedding. Move this there for a cleaner implementation. + if padding_idx is not None: + num_embeddings = num_embeddings + padding_idx + 1 + m = LearnedPositionalEmbedding(num_embeddings, embedding_dim, padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + if padding_idx is not None: + nn.init.constant_(m.weight[padding_idx], 0) + else: + m = SinusoidalPositionalEmbedding( + embedding_dim, + padding_idx, + init_size=num_embeddings + padding_idx + 1, + ) + return m diff --git a/SpeechT5/fairseq/fairseq/modules/quant_noise.py b/SpeechT5/fairseq/fairseq/modules/quant_noise.py new file mode 100644 index 0000000..d777dfb --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quant_noise.py @@ -0,0 +1,107 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn + + +def quant_noise(module, p, block_size): + """ + Wraps modules and applies quantization noise to the weights for + subsequent quantization with Iterative Product Quantization as + described in "Training with Quantization Noise for Extreme Model Compression" + + Args: + - module: nn.Module + - p: amount of Quantization Noise + - block_size: size of the blocks for subsequent quantization with iPQ + + Remarks: + - Module weights must have the right sizes wrt the block size + - Only Linear, Embedding and Conv2d modules are supported for the moment + - For more detail on how to quantize by blocks with convolutional weights, + see "And the Bit Goes Down: Revisiting the Quantization of Neural Networks" + - We implement the simplest form of noise here as stated in the paper + which consists in randomly dropping blocks + """ + + # if no quantization noise, don't register hook + if p <= 0: + return module + + # supported modules + assert isinstance(module, (nn.Linear, nn.Embedding, nn.Conv2d)) + + # test whether module.weight has the right sizes wrt block_size + is_conv = module.weight.ndim == 4 + + # 2D matrix + if not is_conv: + assert ( + module.weight.size(1) % block_size == 0 + ), "Input features must be a multiple of block sizes" + + # 4D matrix + else: + # 1x1 convolutions + if module.kernel_size == (1, 1): + assert ( + module.in_channels % block_size == 0 + ), "Input channels must be a multiple of block sizes" + # regular convolutions + else: + k = module.kernel_size[0] * module.kernel_size[1] + assert k % block_size == 0, "Kernel size must be a multiple of block size" + + def _forward_pre_hook(mod, input): + # no noise for evaluation + if mod.training: + if not is_conv: + # gather weight and sizes + weight = mod.weight + in_features = weight.size(1) + out_features = weight.size(0) + + # split weight matrix into blocks and randomly drop selected blocks + mask = torch.zeros( + in_features // block_size * out_features, device=weight.device + ) + mask.bernoulli_(p) + mask = mask.repeat_interleave(block_size, -1).view(-1, in_features) + + else: + # gather weight and sizes + weight = mod.weight + in_channels = mod.in_channels + out_channels = mod.out_channels + + # split weight matrix into blocks and randomly drop selected blocks + if mod.kernel_size == (1, 1): + mask = torch.zeros( + int(in_channels // block_size * out_channels), + device=weight.device, + ) + mask.bernoulli_(p) + mask = mask.repeat_interleave(block_size, -1).view(-1, in_channels) + else: + mask = torch.zeros( + weight.size(0), weight.size(1), device=weight.device + ) + mask.bernoulli_(p) + mask = ( + mask.unsqueeze(2) + .unsqueeze(3) + .repeat(1, 1, mod.kernel_size[0], mod.kernel_size[1]) + ) + + # scale weights and apply mask + mask = mask.to( + torch.bool + ) # x.bool() is not currently supported in TorchScript + s = 1 / (1 - p) + mod.weight.data = s * weight.masked_fill(mask, 0) + + module.register_forward_pre_hook(_forward_pre_hook) + return module diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/__init__.py b/SpeechT5/fairseq/fairseq/modules/quantization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/__init__.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/__init__.py new file mode 100644 index 0000000..5b10b51 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .utils import SizeTracker, quantize_model_ # NOQA diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/em.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/em.py new file mode 100644 index 0000000..6f15c3e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/em.py @@ -0,0 +1,211 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import random +from collections import Counter + +import torch + + +class EM: + """ + EM algorithm used to quantize the columns of W to minimize + + ||W - W_hat||^2 + + Args: + - W: weight matrix of size (in_features x out_features) + - n_iter: number of k-means iterations + - n_centroids: number of centroids (size of codebook) + - eps: for cluster reassignment when an empty cluster is found + - max_tentatives for cluster reassignment when an empty cluster is found + - verbose: print error after each iteration + + Remarks: + - If one cluster is empty, the most populated cluster is split into + two clusters + - All the relevant dimensions are specified in the code + """ + + def __init__( + self, W, n_centroids=256, n_iter=20, eps=1e-6, max_tentatives=30, verbose=True + ): + self.W = W + self.n_centroids = n_centroids + self.n_iter = n_iter + self.eps = eps + self.max_tentatives = max_tentatives + self.verbose = verbose + self.centroids = torch.Tensor() + self.assignments = torch.Tensor() + self.objective = [] + + def initialize_centroids(self): + """ + Initializes the centroids by sampling random columns from W. + """ + + in_features, out_features = self.W.size() + indices = torch.randint( + low=0, high=out_features, size=(self.n_centroids,) + ).long() + self.centroids = self.W[:, indices].t() # (n_centroids x in_features) + + def step(self, i): + """ + There are two standard steps for each iteration: expectation (E) and + minimization (M). The E-step (assignment) is performed with an exhaustive + search and the M-step (centroid computation) is performed with + the exact solution. + + Args: + - i: step number + + Remarks: + - The E-step heavily uses PyTorch broadcasting to speed up computations + and reduce the memory overhead + """ + + # assignments (E-step) + distances = self.compute_distances() # (n_centroids x out_features) + self.assignments = torch.argmin(distances, dim=0) # (out_features) + n_empty_clusters = self.resolve_empty_clusters() + + # centroids (M-step) + for k in range(self.n_centroids): + W_k = self.W[:, self.assignments == k] # (in_features x size_of_cluster_k) + self.centroids[k] = W_k.mean(dim=1) # (in_features) + + # book-keeping + obj = (self.centroids[self.assignments].t() - self.W).norm(p=2).item() + self.objective.append(obj) + if self.verbose: + logging.info( + f"Iteration: {i},\t" + f"objective: {obj:.6f},\t" + f"resolved empty clusters: {n_empty_clusters}" + ) + + def resolve_empty_clusters(self): + """ + If one cluster is empty, the most populated cluster is split into + two clusters by shifting the respective centroids. This is done + iteratively for a fixed number of tentatives. + """ + + # empty clusters + counts = Counter(map(lambda x: x.item(), self.assignments)) + empty_clusters = set(range(self.n_centroids)) - set(counts.keys()) + n_empty_clusters = len(empty_clusters) + + tentatives = 0 + while len(empty_clusters) > 0: + # given an empty cluster, find most populated cluster and split it into two + k = random.choice(list(empty_clusters)) + m = counts.most_common(1)[0][0] + e = torch.randn_like(self.centroids[m]) * self.eps + self.centroids[k] = self.centroids[m].clone() + self.centroids[k] += e + self.centroids[m] -= e + + # recompute assignments + distances = self.compute_distances() # (n_centroids x out_features) + self.assignments = torch.argmin(distances, dim=0) # (out_features) + + # check for empty clusters + counts = Counter(map(lambda x: x.item(), self.assignments)) + empty_clusters = set(range(self.n_centroids)) - set(counts.keys()) + + # increment tentatives + if tentatives == self.max_tentatives: + logging.info( + f"Could not resolve all empty clusters, {len(empty_clusters)} remaining" + ) + raise EmptyClusterResolveError + tentatives += 1 + + return n_empty_clusters + + def compute_distances(self): + """ + For every centroid m, computes + + ||M - m[None, :]||_2 + + Remarks: + - We rely on PyTorch's broadcasting to speed up computations + and reduce the memory overhead + - Without chunking, the sizes in the broadcasting are modified as: + (n_centroids x n_samples x out_features) -> (n_centroids x out_features) + - The broadcasting computation is automatically chunked so that + the tensors fit into the memory of the GPU + """ + + nb_centroids_chunks = 1 + + while True: + try: + return torch.cat( + [ + (self.W[None, :, :] - centroids_c[:, :, None]).norm(p=2, dim=1) + for centroids_c in self.centroids.chunk( + nb_centroids_chunks, dim=0 + ) + ], + dim=0, + ) + except RuntimeError: + nb_centroids_chunks *= 2 + + def assign(self): + """ + Assigns each column of W to its closest centroid, thus essentially + performing the E-step in train(). + + Remarks: + - The function must be called after train() or after loading + centroids using self.load(), otherwise it will return empty tensors + """ + + distances = self.compute_distances() # (n_centroids x out_features) + self.assignments = torch.argmin(distances, dim=0) # (out_features) + + def save(self, path, layer): + """ + Saves centroids and assignments. + + Args: + - path: folder used to save centroids and assignments + """ + + torch.save(self.centroids, os.path.join(path, "{}_centroids.pth".format(layer))) + torch.save( + self.assignments, os.path.join(path, "{}_assignments.pth".format(layer)) + ) + torch.save(self.objective, os.path.join(path, "{}_objective.pth".format(layer))) + + def load(self, path, layer): + """ + Loads centroids and assignments from a given path + + Args: + - path: folder use to load centroids and assignments + """ + + self.centroids = torch.load( + os.path.join(path, "{}_centroids.pth".format(layer)) + ) + self.assignments = torch.load( + os.path.join(path, "{}_assignments.pth".format(layer)) + ) + self.objective = torch.load( + os.path.join(path, "{}_objective.pth".format(layer)) + ) + + +class EmptyClusterResolveError(Exception): + pass diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/__init__.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/__init__.py new file mode 100644 index 0000000..b67c8e8 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .qconv import PQConv2d # NOQA +from .qemb import PQEmbedding # NOQA +from .qlinear import PQLinear # NOQA diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qconv.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qconv.py new file mode 100644 index 0000000..d15ec19 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qconv.py @@ -0,0 +1,115 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn.modules.utils import _pair + + +class PQConv2d(nn.Module): + """ + Quantized counterpart of nn.Conv2d module. Stores the centroid, the assignments + and the non-quantized biases. The full weight is re-instantiated at each forward + pass and autograd automatically computes the gradients with respect to the + centroids. + + Args: + - centroids: centroids of size n_centroids x block_size + - assignments: assignments of the centroids to the subvectors + of size self.out_channels x n_blocks + - bias: the non-quantized bias, must be either torch.Tensor or None + + Remarks: + - We refer the reader to the official documentation of the nn.Conv2d module + for the other arguments and the behavior of the module. + - Performance tests on GPU show that this implementation is 10% slower than + the non-quantized nn.Conv2d module for a standard training loop. + - During the backward, the gradients are averaged by cluster and not summed. + This explains the hook registered to the centroids. + """ + + def __init__( + self, + centroids, + assignments, + bias, + in_channels, + out_channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + padding_mode="zeros", + ): + super(PQConv2d, self).__init__() + self.block_size = centroids.size(1) + self.n_centroids = centroids.size(0) + self.in_channels = in_channels + self.out_channels = out_channels + self.kernel_size = _pair(kernel_size) + self.stride = _pair(stride) + self.padding = _pair(padding) + self.dilation = _pair(dilation) + self.groups = groups + self.padding_mode = padding_mode + # check compatibility + if in_channels // groups * np.prod(self.kernel_size) % self.block_size != 0: + raise ValueError("Wrong PQ sizes") + if len(assignments) % out_channels != 0: + raise ValueError("Wrong PQ sizes") + if in_channels % groups != 0: + raise ValueError("in_channels must be divisible by groups") + if out_channels % groups != 0: + raise ValueError("out_channels must be divisible by groups") + # define parameters + self.centroids = nn.Parameter(centroids, requires_grad=True) + self.register_buffer("assignments", assignments) + self.register_buffer("counts", torch.bincount(assignments).type_as(centroids)) + if bias is not None: + self.bias = nn.Parameter(bias) + else: + self.register_parameter("bias", None) + # register hook for averaging gradients per centroids instead of summing + self.centroids.register_hook(lambda x: x / self.counts[:, None]) + + @property + def weight(self): + return ( + self.centroids[self.assignments] + .reshape(-1, self.out_channels, self.block_size) + .permute(1, 0, 2) + .reshape( + self.out_channels, self.in_channels // self.groups, *self.kernel_size + ) + ) + + def forward(self, x): + return F.conv2d( + x, + self.weight, + self.bias, + self.stride, + self.padding, + self.dilation, + self.groups, + ) + + def extra_repr(self): + s = "{in_channels}, {out_channels}, kernel_size={kernel_size}, stride={stride}" + if self.padding != (0,) * len(self.padding): + s += ", padding={padding}" + if self.dilation != (1,) * len(self.dilation): + s += ", dilation={dilation}" + if self.groups != 1: + s += ", groups={groups}" + if self.bias is None: + s += ", bias=False" + if self.padding_mode != "zeros": + s += ", padding_mode={padding_mode}" + s += ", n_centroids={n_centroids}, block_size={block_size}" + return s.format(**self.__dict__) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qemb.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qemb.py new file mode 100644 index 0000000..3a74ad3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qemb.py @@ -0,0 +1,107 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class PQEmbedding(nn.Module): + """ + Quantized counterpart of nn.Embedding module. Stores the centroids and + the assignments. The full weight is re-instantiated at each forward + pass. + + Args: + - centroids: centroids of size n_centroids x block_size + - assignments: assignments of the centroids to the subvectors + of size self.out_features x n_blocks + - bias: the non-quantized bias + + Remarks: + - We refer the reader to the official documentation of the nn.Embedding module + for the other arguments and the behavior of the module + - Performance tests on GPU show that this implementation is 10% slower than + the non-quantized nn.Embedding module for a standard training loop. + """ + + def __init__( + self, + centroids, + assignments, + num_embeddings, + embedding_dim, + padding_idx=None, + max_norm=None, + norm_type=2.0, + scale_grad_by_freq=False, + sparse=False, + _weight=None, + ): + super(PQEmbedding, self).__init__() + self.block_size = centroids.size(1) + self.n_centroids = centroids.size(0) + self.num_embeddings = num_embeddings + self.embedding_dim = embedding_dim + if padding_idx is not None: + if padding_idx > 0: + assert ( + padding_idx < self.num_embeddings + ), "Padding_idx must be within num_embeddings" + elif padding_idx < 0: + assert ( + padding_idx >= -self.num_embeddings + ), "Padding_idx must be within num_embeddings" + padding_idx = self.num_embeddings + padding_idx + self.padding_idx = padding_idx + self.max_norm = max_norm + self.norm_type = norm_type + self.scale_grad_by_freq = scale_grad_by_freq + self.sparse = sparse + # check compatibility + if self.embedding_dim % self.block_size != 0: + raise ValueError("Wrong PQ sizes") + if len(assignments) % self.num_embeddings != 0: + raise ValueError("Wrong PQ sizes") + # define parameters + self.centroids = nn.Parameter(centroids, requires_grad=True) + self.register_buffer("assignments", assignments) + self.register_buffer("counts", torch.bincount(assignments).type_as(centroids)) + + @property + def weight(self): + return ( + self.centroids[self.assignments] + .reshape(-1, self.num_embeddings, self.block_size) + .permute(1, 0, 2) + .flatten(1, 2) + ) + + def forward(self, input): + return F.embedding( + input, + self.weight, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) + + def extra_repr(self): + s = "{num_embeddings}, {embedding_dim}" + if self.padding_idx is not None: + s += ", padding_idx={padding_idx}" + if self.max_norm is not None: + s += ", max_norm={max_norm}" + if self.norm_type != 2: + s += ", norm_type={norm_type}" + if self.scale_grad_by_freq is not False: + s += ", scale_grad_by_freq={scale_grad_by_freq}" + if self.sparse is not False: + s += ", sparse=True" + s += ", n_centroids={n_centroids}, block_size={block_size}" + + return s.format(**self.__dict__) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qlinear.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qlinear.py new file mode 100644 index 0000000..9bdd25a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/modules/qlinear.py @@ -0,0 +1,71 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class PQLinear(nn.Module): + """ + Quantized counterpart of nn.Linear module. Stores the centroid, the assignments + and the non-quantized biases. The full weight is re-instantiated at each forward + pass. + + Args: + - centroids: centroids of size n_centroids x block_size + - assignments: assignments of the centroids to the subvectors + of size self.out_features x n_blocks + - bias: the non-quantized bias + + Remarks: + - We refer the reader to the official documentation of the nn.Linear module + for the other arguments and the behavior of the module + - Performance tests on GPU show that this implementation is 15% slower than + the non-quantized nn.Linear module for a standard training loop. + """ + + def __init__(self, centroids, assignments, bias, in_features, out_features): + super(PQLinear, self).__init__() + self.block_size = centroids.size(1) + self.n_centroids = centroids.size(0) + self.in_features = in_features + self.out_features = out_features + # check compatibility + if self.in_features % self.block_size != 0: + raise ValueError("Wrong PQ sizes") + if len(assignments) % self.out_features != 0: + raise ValueError("Wrong PQ sizes") + # define parameters + self.centroids = nn.Parameter(centroids, requires_grad=True) + self.register_buffer("assignments", assignments) + self.register_buffer("counts", torch.bincount(assignments).type_as(centroids)) + if bias is not None: + self.bias = nn.Parameter(bias) + else: + self.register_parameter("bias", None) + + @property + def weight(self): + return ( + self.centroids[self.assignments] + .reshape(-1, self.out_features, self.block_size) + .permute(1, 0, 2) + .flatten(1, 2) + ) + + def forward(self, x): + return F.linear( + x, + self.weight, + self.bias, + ) + + def extra_repr(self): + return f"in_features={self.in_features},\ + out_features={self.out_features},\ + n_centroids={self.n_centroids},\ + block_size={self.block_size},\ + bias={self.bias is not None}" diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/pq.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/pq.py new file mode 100644 index 0000000..eddc2eb --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/pq.py @@ -0,0 +1,128 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .em import EM, EmptyClusterResolveError + + +class PQ(EM): + """ + Quantizes the layer weights W with the standard Product Quantization + technique. This learns a codebook of codewords or centroids of size + block_size from W. For further reference on using PQ to quantize + neural networks, see "And the Bit Goes Down: Revisiting the Quantization + of Neural Networks", Stock et al., ICLR 2020. + + PQ is performed in two steps: + (1) The matrix W (weights or fully-connected or convolutional layer) + is reshaped to (block_size, -1). + - If W is fully-connected (2D), its columns are split into + blocks of size block_size. + - If W is convolutional (4D), its filters are split along the + spatial dimension. + (2) We apply the standard EM/k-means algorithm to the resulting reshaped matrix. + + Args: + - W: weight matrix to quantize of size (in_features x out_features) + - block_size: size of the blocks (subvectors) + - n_centroids: number of centroids + - n_iter: number of k-means iterations + - eps: for cluster reassignment when an empty cluster is found + - max_tentatives for cluster reassignment when an empty cluster is found + - verbose: print information after each iteration + + Remarks: + - block_size be compatible with the shape of W + """ + + def __init__( + self, + W, + block_size, + n_centroids=256, + n_iter=20, + eps=1e-6, + max_tentatives=30, + verbose=True, + ): + self.block_size = block_size + W_reshaped = self._reshape(W) + super(PQ, self).__init__( + W_reshaped, + n_centroids=n_centroids, + n_iter=n_iter, + eps=eps, + max_tentatives=max_tentatives, + verbose=verbose, + ) + + def _reshape(self, W): + """ + Reshapes the matrix W as expained in step (1). + """ + + # fully connected: by convention the weight has size out_features x in_features + if len(W.size()) == 2: + self.out_features, self.in_features = W.size() + assert ( + self.in_features % self.block_size == 0 + ), "Linear: n_blocks must be a multiple of in_features" + return ( + W.reshape(self.out_features, -1, self.block_size) + .permute(2, 1, 0) + .flatten(1, 2) + ) + + # convolutional: we reshape along the spatial dimension + elif len(W.size()) == 4: + self.out_channels, self.in_channels, self.k_h, self.k_w = W.size() + assert ( + self.in_channels * self.k_h * self.k_w + ) % self.block_size == 0, ( + "Conv2d: n_blocks must be a multiple of in_channels * k_h * k_w" + ) + return ( + W.reshape(self.out_channels, -1, self.block_size) + .permute(2, 1, 0) + .flatten(1, 2) + ) + # not implemented + else: + raise NotImplementedError(W.size()) + + def encode(self): + """ + Performs self.n_iter EM steps. + """ + + self.initialize_centroids() + for i in range(self.n_iter): + try: + self.step(i) + except EmptyClusterResolveError: + break + + def decode(self): + """ + Returns the encoded full weight matrix. Must be called after + the encode function. + """ + + # fully connected case + if "k_h" not in self.__dict__: + return ( + self.centroids[self.assignments] + .reshape(-1, self.out_features, self.block_size) + .permute(1, 0, 2) + .flatten(1, 2) + ) + + # convolutional case + else: + return ( + self.centroids[self.assignments] + .reshape(-1, self.out_channels, self.block_size) + .permute(1, 0, 2) + .reshape(self.out_channels, self.in_channels, self.k_h, self.k_w) + ) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/pq/utils.py b/SpeechT5/fairseq/fairseq/modules/quantization/pq/utils.py new file mode 100644 index 0000000..03b15e4 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/pq/utils.py @@ -0,0 +1,337 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import re +from operator import attrgetter, itemgetter + +import numpy as np +import torch.distributed as dist +import torch.nn as nn + +from .modules import PQConv2d, PQEmbedding, PQLinear +from .pq import PQ + + +def quantize_model_( + model, + size_tracker, + layers_to_quantize, + block_sizes_config, + n_centroids_config, + step=0, + n_iter=15, + eps=1e-6, + max_tentatives=100, + verbose=True, +): + """ + Quantize a model in-place by stages. All the targeted + layers are replaced by their quantized counterpart, + and the model is ready for the finetuning of the + centroids in a standard training loop (no modifications + required). Note that we do not quantize biases. + + Args: + - model: a nn.Module + - size_tracker: useful for tracking quatization statistics + - layers_to_quantize: a list containing regexps for + filtering the layers to quantize at each stage according + to their name (as in model.named_parameters()) + - block_sizes_config: dict like + { + 'Conv2d': ('kernel_size', {'(3, 3)': 9, '(1, 1)': 4}), + 'Linear': ('in_features', {'*': 8}) + } + For instance, all conv2d layers with kernel size 3x3 have + a block size of 9 and all Linear layers are quantized with + a block size of 8, irrespective of their size. + - n_centroids_config: dict like + { + 'Conv2d': ('kernel_size', {'*': 256}), + 'Linear': ('in_features', {'*': 256}) + } + For instance, all conv2d layers are quantized with 256 centroids + - step: the layers to quantize inplace corresponding + to layers_to_quantize[step] + """ + + quantized_layers = get_layers(model, layers_to_quantize[step]) + + for layer in quantized_layers: + + # book-keeping + is_master_process = (not dist.is_initialized()) or ( + dist.is_initialized() and dist.get_rank() == 0 + ) + verbose = verbose and is_master_process + + # get block size and centroids + module = attrgetter(layer)(model) + block_size = get_param(module, layer, block_sizes_config) + n_centroids = get_param(module, layer, n_centroids_config) + if verbose: + logging.info( + f"Quantizing layer {layer} with block size {block_size} and {n_centroids} centroids" + ) + + # quantize layer + weight = module.weight.data.clone() + is_bias = "bias" in [x[0] for x in module.named_parameters()] + bias = module.bias.data.clone() if is_bias else None + quantizer = PQ( + weight, + block_size, + n_centroids=n_centroids, + n_iter=n_iter, + eps=eps, + max_tentatives=max_tentatives, + verbose=verbose, + ) + + # quantization performed on all GPUs with same seed + quantizer.encode() + centroids = quantizer.centroids.contiguous() + assignments = quantizer.assignments.contiguous() + + # broadcast results to make sure weights are up-to-date + if dist.is_initialized(): + dist.broadcast(centroids, 0) + dist.broadcast(assignments, 0) + + # instantiate the quantized counterpart + if isinstance(module, nn.Linear): + out_features, in_features = map( + lambda k: module.__dict__[k], ["out_features", "in_features"] + ) + quantized_module = PQLinear( + centroids, assignments, bias, in_features, out_features + ) + elif isinstance(module, nn.Embedding): + num_embeddings, embedding_dim = map( + lambda k: module.__dict__[k], ["num_embeddings", "embedding_dim"] + ) + quantized_module = PQEmbedding( + centroids, assignments, num_embeddings, embedding_dim + ) + elif isinstance(module, nn.Conv2d): + out_channels, in_channels, kernel_size = map( + lambda k: module.__dict__[k], + ["out_channels", "in_channels", "kernel_size"], + ) + stride, padding, dilation, groups, padding_mode = map( + lambda k: module.__dict__[k], + ["stride", "padding", "dilation", "groups", "padding_mode"], + ) + + quantized_module = PQConv2d( + centroids, + assignments, + bias, + in_channels, + out_channels, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups, + padding_mode=padding_mode, + ) + else: + raise ValueError(f"Module {module} not yet supported for quantization") + + # replace layer by its quantized counterpart + attrsetter(layer)(model, quantized_module) + + # update statistics + size_tracker.update(weight, block_size, n_centroids) + + # return name of quantized layers + return quantized_layers + + +def get_layers(model, filter_regexp): + """ + Filters out the layers according to a regexp. Note that + we omit biases. + + Args: + - model: a nn.Module + - filter_regexp: a regexp to filter the layers to keep + according to their name in model.named_parameters(). + For instance, the regexp: + + down_layers\\.[123456]\\.(conv[12]|identity\\.conv)) + + is keeping blocks down_layers from 1 to 6, and inside + each block is keeping conv1, conv2 and identity.conv. + + Remarks: + - We add (module\\.)? at the beginning of the regexp to + account for the possible use of nn.parallel.DataParallel + """ + + # get all parameter names + all_layers = map(itemgetter(0), model.named_parameters()) + + # remove biases + all_layers = filter(lambda x: "bias" not in x, all_layers) + + # remove .weight in all other names (or .weight_orig is spectral norm) + all_layers = map(lambda x: x.replace(".weight_orig", ""), all_layers) + all_layers = map(lambda x: x.replace(".weight", ""), all_layers) + + # return filtered layers + filter_regexp = "(module\\.)?" + "(" + filter_regexp + ")" + r = re.compile(filter_regexp) + + return list(filter(r.match, all_layers)) + + +def get_param(module, layer_name, param_config): + """ + Given a quantization configuration, get the right parameter + for the module to be quantized. + + Args: + - module: a nn.Module + - layer_name: the name of the layer + - param_config: a dict like + { + 'Conv2d': ('kernel_size', {'(3, 3)': 9, '(1, 1)': 4}), + 'Linear': ('in_features', {'*': 8}) + } + For instance, all conv2d layers with kernel size 3x3 have + a block size of 9 and all Linear layers are quantized with + a block size of 8, irrespective of their size. + + Remarks: + - if 'fuzzy_name' is passed as a parameter, layers whose layer_name + include 'fuzzy_name' will be assigned the given parameter. + In the following example, conv.expand layers will have a block + size of 9 while conv.reduce will have a block size of 4 and all + other layers will have a block size of 2. + { + 'Conv2d': ('fuzzy_name', {'expand': 9, 'reduce': 4, '*': 2}), + 'Linear': ('fuzzy_name', {'classifier': 8, 'projection': 4}) + } + + """ + + layer_type = module.__class__.__name__ + + if layer_type not in param_config: + raise KeyError(f"Layer type {layer_type} not in config for layer {module}") + + feature, params = param_config[module.__class__.__name__] + + if feature != "fuzzy_name": + feature_value = str(getattr(module, feature)) + if feature_value not in params: + if "*" in params: + feature_value = "*" + else: + raise KeyError( + f"{feature}={feature_value} not in config for layer {module}" + ) + else: + feature_values = [name for name in params if name in layer_name] + if len(feature_values) == 0: + if "*" in params: + feature_value = "*" + else: + raise KeyError(f"name={layer_name} not in config for {module}") + else: + feature_value = feature_values[0] + + return params[feature_value] + + +class SizeTracker(object): + """ + Class to keep track of the compressed network size with iPQ. + + Args: + - model: a nn.Module + + Remarks: + - The compressed size is the sum of three components + for each layer in the network: + (1) Storing the centroids given by iPQ in fp16 + (2) Storing the assignments of the blocks in int8 + (3) Storing all non-compressed elements such as biases + - This cost in only valid if we use 256 centroids (then + indexing can indeed by done with int8). + """ + + def __init__(self, model): + self.model = model + self.size_non_compressed_model = self.compute_size() + self.size_non_quantized = self.size_non_compressed_model + self.size_index = 0 + self.size_centroids = 0 + self.n_quantized_layers = 0 + + def compute_size(self): + """ + Computes the size of the model (in MB). + """ + + res = 0 + for _, p in self.model.named_parameters(): + res += p.numel() + return res * 4 / 1024 / 1024 + + def update(self, W, block_size, n_centroids): + """ + Updates the running statistics when quantizing a new layer. + """ + + # bits per weights + bits_per_weight = np.log2(n_centroids) / block_size + self.n_quantized_layers += 1 + + # size of indexing the subvectors of size block_size (in MB) + size_index_layer = bits_per_weight * W.numel() / 8 / 1024 / 1024 + self.size_index += size_index_layer + + # size of the centroids stored in float16 (in MB) + size_centroids_layer = n_centroids * block_size * 2 / 1024 / 1024 + self.size_centroids += size_centroids_layer + + # size of non-compressed layers, e.g. LayerNorms or biases (in MB) + size_uncompressed_layer = W.numel() * 4 / 1024 / 1024 + self.size_non_quantized -= size_uncompressed_layer + + def __repr__(self): + size_compressed = ( + self.size_index + self.size_centroids + self.size_non_quantized + ) + compression_ratio = self.size_non_compressed_model / size_compressed # NOQA + return ( + f"Non-compressed model size: {self.size_non_compressed_model:.2f} MB. " + f"After quantizing {self.n_quantized_layers} layers, size " + f"(indexing + centroids + other): {self.size_index:.2f} MB + " + f"{self.size_centroids:.2f} MB + {self.size_non_quantized:.2f} MB = " + f"{size_compressed:.2f} MB, compression ratio: {compression_ratio:.2f}x" + ) + + +def attrsetter(*items): + def resolve_attr(obj, attr): + attrs = attr.split(".") + head = attrs[:-1] + tail = attrs[-1] + + for name in head: + obj = getattr(obj, name) + return obj, tail + + def g(obj, val): + for attr in items: + resolved_obj, resolved_attr = resolve_attr(obj, attr) + setattr(resolved_obj, resolved_attr, val) + + return g diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/quantization_options.py b/SpeechT5/fairseq/fairseq/modules/quantization/quantization_options.py new file mode 100644 index 0000000..b46d682 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/quantization_options.py @@ -0,0 +1,44 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +def parse_config_yaml(yaml_data): + # Initialize to default options. + quantization_options = { + "n_centroids": { + "Linear": ["in_features", {"*": 256}], + "Embedding": ["embedding_dim", {"*": 256}], + }, + "block_sizes": { + "Linear": ["fuzzy_name", {"fc": 8, "attn": 4, "emb": 4}], + "Embedding": ["fuzzy_name", {"emb": 8}], + }, + "layers_to_quantize": [ + "decoder\\.layers\\.\\d+\\.fc[12]", + "decoder\\.embed_tokens\\.embeddings\\.[012]\\.[01]", + "decoder\\.layers\\.\\d+\\.self_attn\\.(k_proj|v_proj|q_proj|out_proj)", + ], + } + + if "n_centroids" in yaml_data: + quantization_options["n_centroids"] = { + layer: convert_yaml_to_tuple(layer_data) + for layer, layer_data in yaml_data["n_centroids"].items() + } + if "block_sizes" in yaml_data: + quantization_options["block_sizes"] = { + layer: convert_yaml_to_tuple(layer_data) + for layer, layer_data in yaml_data["block_sizes"].items() + } + if "layers_to_quantize" in yaml_data: + quantization_options["layers_to_quantize"] = yaml_data["layers_to_quantize"] + + return quantization_options + + +def convert_yaml_to_tuple(yaml_dictionary): + """Converts a yaml dictionary with two keys: `key` and `value` into a two + argument tuple of those values.""" + return (yaml_dictionary["key"], yaml_dictionary["value"]) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/__init__.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/__init__.py new file mode 100644 index 0000000..143834f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .utils import quantize_model_ # NOQA diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/__init__.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/__init__.py new file mode 100644 index 0000000..8031d9c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from .qact import ActivationQuantizer # NOQA +from .qconv import IntConv2d # NOQA +from .qemb import IntEmbedding # NOQA +from .qlinear import IntLinear # NOQA diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qact.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qact.py new file mode 100644 index 0000000..c5dd1d6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qact.py @@ -0,0 +1,88 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + +from ..ops import emulate_int + + +class ActivationQuantizer: + """ + Fake scalar quantization of the activations using a forward hook. + + Args: + - module. a nn.Module for which we quantize the *post-activations* + - p: proportion of activations to quantize, set by default to 1 + - update_step: to recompute quantization parameters + - bits: number of bits for quantization + - method: choose among {"tensor", "histogram", "channel"} + - clamp_threshold: to prevent gradients overflow + + Remarks: + - Parameters scale and zero_point are recomputed every update_step + forward pass to reduce the overhead + - For the list of quantization methods and number of bits, see ops.py + - To remove the hook from the module, simply call self.handle.remove() + - At test time, the activations are fully quantized + - We use the straight-through estimator so that the gradients + back-propagate nicely in the network, this is implemented with + the detach() trick + - The activations are hard-clamped in [-clamp_threshold, clamp_threshold] + to prevent overflow during the backward pass + """ + + def __init__( + self, + module, + p=1, + update_step=1000, + bits=8, + method="histogram", + clamp_threshold=5, + ): + self.module = module + self.p = p + self.update_step = update_step + self.counter = 0 + self.bits = bits + self.method = method + self.clamp_threshold = clamp_threshold + self.handle = None + self.register_hook() + + def register_hook(self): + # forward hook + def quantize_hook(module, x, y): + + # update parameters every 1000 iterations + if self.counter % self.update_step == 0: + self.scale = None + self.zero_point = None + self.counter += 1 + + # train with QuantNoise and evaluate the fully quantized network + p = self.p if self.module.training else 1 + + # quantize activations + y_q, self.scale, self.zero_point = emulate_int( + y.detach(), + bits=self.bits, + method=self.method, + scale=self.scale, + zero_point=self.zero_point, + ) + + # mask to apply noise + mask = torch.zeros_like(y) + mask.bernoulli_(1 - p) + noise = (y_q - y).masked_fill(mask.bool(), 0) + + # using straight-through estimator (STE) + clamp_low = -self.scale * self.zero_point + clamp_high = self.scale * (2 ** self.bits - 1 - self.zero_point) + return torch.clamp(y, clamp_low.item(), clamp_high.item()) + noise.detach() + + # register hook + self.handle = self.module.register_forward_hook(quantize_hook) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qconv.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qconv.py new file mode 100644 index 0000000..83788c6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qconv.py @@ -0,0 +1,149 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn.functional as F +from torch.nn.modules.conv import _ConvNd +from torch.nn.modules.utils import _pair + +from ..ops import emulate_int + + +class IntConv2d(_ConvNd): + """ + Quantized counterpart of the nn.Conv2d module that applies QuantNoise during training. + + Args: + - standard nn.Conv2d parameters + - p: amount of noise to inject (0 = no quantization, 1 = quantize all the weights) + - bits: number of bits + - method: choose among {"tensor", "histogram", "channel"} + - update_step: recompute scale and zero_point every update_steps iterations + + Remarks: + - We use the straight-thgourh estimator so that the gradients + back-propagate nicely in the network, this is implemented with + the detach() trick + - Parameters scale and zero_point are recomputed every update_step + forward pass to reduce the overhead + - At test time, the weights are fully quantized + """ + + def __init__( + self, + in_channels, + out_channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + bias=True, + padding_mode="zeros", + p=0, + bits=8, + method="histogram", + update_step=1000, + ): + kernel_size = _pair(kernel_size) + stride = _pair(stride) + padding = _pair(padding) + dilation = _pair(dilation) + super(IntConv2d, self).__init__( + in_channels, + out_channels, + kernel_size, + stride, + padding, + dilation, + False, + _pair(0), + groups, + bias, + padding_mode, + ) + + # quantization parameters + self.p = p + self.bits = bits + self.method = method + self.update_step = update_step + self.counter = 0 + + def _conv_forward(self, input, weight): + if self.padding_mode != "zeros": + return F.conv2d( + F.pad(input, self._padding_repeated_twice, mode=self.padding_mode), + weight, + self.bias, + self.stride, + _pair(0), + self.dilation, + self.groups, + ) + return F.conv2d( + input, + weight, + self.bias, + self.stride, + self.padding, + self.dilation, + self.groups, + ) + + def forward(self, input): + # train with QuantNoise and evaluate the fully quantized network + p = self.p if self.training else 1 + + # update parameters every 100 iterations + if self.counter % self.update_step == 0: + self.scale = None + self.zero_point = None + self.counter += 1 + + # quantize weight + weight_quantized, self.scale, self.zero_point = emulate_int( + self.weight.detach(), + bits=self.bits, + method=self.method, + scale=self.scale, + zero_point=self.zero_point, + ) + + # mask to apply noise + mask = torch.zeros_like(self.weight) + mask.bernoulli_(1 - p) + noise = (weight_quantized - self.weight).masked_fill(mask.bool(), 0) + + # using straight-through estimator (STE) + clamp_low = -self.scale * self.zero_point + clamp_high = self.scale * (2 ** self.bits - 1 - self.zero_point) + weight = ( + torch.clamp(self.weight, clamp_low.item(), clamp_high.item()) + + noise.detach() + ) + + # return output + output = self._conv_forward(input, weight) + return output + + def extra_repr(self): + return ( + "in_channels={}, out_channels={}, kernel_size={}, stride={}, " + "padding={}, dilation={}, groups={}, bias={}, quant_noise={}, " + "bits={}, method={}".format( + self.in_channels, + self.out_channels, + self.kernel_size, + self.stride, + self.padding, + self.dilation, + self.groups, + self.bias is not None, + self.p, + self.bits, + self.method, + ) + ) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qemb.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qemb.py new file mode 100644 index 0000000..d6cf06e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qemb.py @@ -0,0 +1,147 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..ops import emulate_int + + +class IntEmbedding(nn.Module): + """ + Quantized counterpart of the nn.Embedding module that applies QuantNoise during training. + + Args: + - num_embeddings: number of tokens + - embedding_dim: embedding dimension + - p: amount of noise to inject (0 = no quantization, 1 = quantize all the weights) + - bits: number of bits + - method: choose among {"tensor", "histogram", "channel"} + - update_step: recompute scale and zero_point every update_steps iterations + + Remarks: + - We use the straight-through estimator so that the gradients + back-propagate nicely in the network, this is implemented with + the detach() trick + - Parameters scale and zero_point are recomputed every update_step + forward pass to reduce the overhead + - At test time, the weights are fully quantized + """ + + def __init__( + self, + num_embeddings, + embedding_dim, + padding_idx=None, + max_norm=None, + norm_type=2.0, + scale_grad_by_freq=False, + sparse=False, + _weight=None, + p=0, + update_step=1000, + bits=8, + method="histogram", + ): + super(IntEmbedding, self).__init__() + self.num_embeddings = num_embeddings + self.embedding_dim = embedding_dim + if padding_idx is not None: + if padding_idx > 0: + assert ( + padding_idx < self.num_embeddings + ), "Padding_idx must be within num_embeddings" + elif padding_idx < 0: + assert ( + padding_idx >= -self.num_embeddings + ), "Padding_idx must be within num_embeddings" + padding_idx = self.num_embeddings + padding_idx + self.padding_idx = padding_idx + self.max_norm = max_norm + self.norm_type = norm_type + self.scale_grad_by_freq = scale_grad_by_freq + if _weight is None: + self.weight = nn.Parameter(torch.Tensor(num_embeddings, embedding_dim)) + self.reset_parameters() + else: + assert list(_weight.shape) == [ + num_embeddings, + embedding_dim, + ], "Shape of weight does not match num_embeddings and embedding_dim" + self.weight = nn.Parameter(_weight) + self.sparse = sparse + + # quantization parameters + self.p = p + self.bits = bits + self.method = method + self.update_step = update_step + self.counter = 0 + + def reset_parameters(self): + nn.init.normal_(self.weight) + if self.padding_idx is not None: + with torch.no_grad(): + self.weight[self.padding_idx].fill_(0) + + def forward(self, input): + # train with QuantNoise and evaluate the fully quantized network + p = self.p if self.training else 1 + + # update parameters every 1000 iterations + if self.counter % self.update_step == 0: + self.scale = None + self.zero_point = None + self.counter += 1 + + # quantize weight + weight_quantized, self.scale, self.zero_point = emulate_int( + self.weight.detach(), + bits=self.bits, + method=self.method, + scale=self.scale, + zero_point=self.zero_point, + ) + + # mask to apply noise + mask = torch.zeros_like(self.weight) + mask.bernoulli_(1 - p) + noise = (weight_quantized - self.weight).masked_fill(mask.bool(), 0) + + # using straight-through estimator (STE) + clamp_low = -self.scale * self.zero_point + clamp_high = self.scale * (2 ** self.bits - 1 - self.zero_point) + weight = ( + torch.clamp(self.weight, clamp_low.item(), clamp_high.item()) + + noise.detach() + ) + + # return output + output = F.embedding( + input, + weight, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) + return output + + def extra_repr(self): + s = "{num_embeddings}, {embedding_dim}" + if self.padding_idx is not None: + s += ", padding_idx={padding_idx}" + if self.max_norm is not None: + s += ", max_norm={max_norm}" + if self.norm_type != 2: + s += ", norm_type={norm_type}" + if self.scale_grad_by_freq is not False: + s += ", scale_grad_by_freq={scale_grad_by_freq}" + if self.sparse is not False: + s += ", sparse=True" + s += "quant_noise={p}, bits={bits}, method={method}" + return s.format(**self.__dict__) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qlinear.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qlinear.py new file mode 100644 index 0000000..9db1559 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/modules/qlinear.py @@ -0,0 +1,113 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..ops import emulate_int + + +class IntLinear(nn.Module): + """ + Quantized counterpart of the nn.Linear module that applies QuantNoise during training. + + Args: + - in_features: input features + - out_features: output features + - bias: bias or not + - p: amount of noise to inject (0 = no quantization, 1 = quantize all the weights) + - bits: number of bits + - method: choose among {"tensor", "histogram", "channel"} + - update_step: recompute scale and zero_point every update_steps iterations + + Remarks: + - We use the straight-through estimator so that the gradients + back-propagate nicely in the network, this is implemented with + the detach() trick. + - Parameters scale and zero_point are recomputed every update_step + forward pass to reduce the overhead + - At test time, the weights are fully quantized + """ + + def __init__( + self, + in_features, + out_features, + bias=True, + p=0, + update_step=3000, + bits=8, + method="histogram", + ): + super(IntLinear, self).__init__() + self.in_features = int(in_features) + self.out_features = int(out_features) + self.weight = torch.nn.Parameter(torch.Tensor(out_features, in_features)) + self.chosen_bias = bias + if self.chosen_bias: + self.bias = torch.nn.Parameter(torch.Tensor(out_features)) + else: + self.register_parameter("bias", None) + self.reset_parameters() + + # quantization parameters + self.p = p + self.bits = bits + self.method = method + self.update_step = update_step + self.counter = 0 + + def reset_parameters(self): + nn.init.xavier_uniform_(self.weight) + if self.chosen_bias: + nn.init.constant_(self.bias, 0.0) + return + + def forward(self, input): + # train with QuantNoise and evaluate the fully quantized network + p = self.p if self.training else 1 + + # update parameters every 100 iterations + if self.counter % self.update_step == 0: + self.scale = None + self.zero_point = None + self.counter += 1 + + # quantize weight + weight_quantized, self.scale, self.zero_point = emulate_int( + self.weight.detach(), + bits=self.bits, + method=self.method, + scale=self.scale, + zero_point=self.zero_point, + ) + + # mask to apply noise + mask = torch.zeros_like(self.weight) + mask.bernoulli_(1 - p) + noise = (weight_quantized - self.weight).masked_fill(mask.bool(), 0) + + # using straight-through estimator (STE) + clamp_low = -self.scale * self.zero_point + clamp_high = self.scale * (2 ** self.bits - 1 - self.zero_point) + weight = ( + torch.clamp(self.weight, clamp_low.item(), clamp_high.item()) + + noise.detach() + ) + + # return output + output = F.linear(input, weight, self.bias) + return output + + def extra_repr(self): + return "in_features={}, out_features={}, bias={}, quant_noise={}, bits={}, method={}".format( + self.in_features, + self.out_features, + self.bias is not None, + self.p, + self.bits, + self.method, + ) diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/ops.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/ops.py new file mode 100644 index 0000000..2a85515 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/ops.py @@ -0,0 +1,49 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch + + +def emulate_int(w, bits, method, scale=None, zero_point=None): + q = globals()[f"emulate_int{bits}_{method}"] + return q(w, scale=scale, zero_point=zero_point) + + +def quantize(w, scale, zero_point): + return ( + torch.clamp(torch.round(w / scale + zero_point), 0, 255) - zero_point + ) * scale + + +def emulate_int8_histogram(w, scale=None, zero_point=None): + if scale is None: + obs = torch.quantization.observer.HistogramObserver() + _ = obs(w.float()) + scale, zero_point = obs.calculate_qparams() + scale = scale.cuda().type_as(w) + zero_point = zero_point.cuda().type_as(w) + return quantize(w, scale, zero_point), scale, zero_point + + +def emulate_int8_channel(w, scale=None, zero_point=None): + if scale is None: + obs = torch.quantization.observer.PerChannelMinMaxObserver( + ch_axis=-1, qscheme=torch.per_channel_symmetric + ) + _ = obs(w) + scale, zero_point, ch_axis = obs.get_qparams() + scale = scale.cuda().type_as(w) + zero_point = zero_point.cuda().type_as(w) + return quantize(w, scale, zero_point), scale, zero_point + + +def emulate_int8_tensor(w, scale=None, zero_point=None): + if scale is None: + obs = torch.quantization.observer.MinMaxObserver() + _ = obs(w) + scale, zero_point = obs.calculate_qparams() + scale = scale.cuda().type_as(w) + zero_point = zero_point.cuda().type_as(w) + return quantize(w, scale, zero_point), scale, zero_point diff --git a/SpeechT5/fairseq/fairseq/modules/quantization/scalar/utils.py b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/utils.py new file mode 100644 index 0000000..32cf616 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/quantization/scalar/utils.py @@ -0,0 +1,77 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from operator import attrgetter + +import torch.distributed as dist +import torch.nn as nn + +from ..pq.utils import attrsetter, get_layers +from .modules import ActivationQuantizer, IntConv2d, IntEmbedding, IntLinear + + +MAPPING = {nn.Linear: IntLinear, nn.Embedding: IntEmbedding, nn.Conv2d: IntConv2d} + + +def quantize_model_(model, p=0.2, bits=8, update_step=3000): + """ + Replaces all modules with their scalar quantized counterpart and + registers hooks to quantize the post-ativations of those modules. + + Args: + - model: a nn.Module + - p: amount of noise (0 for no noise, 1 to quantize all the weights/activations) + - bits: number of bits + - update_step: update quantization parameters every update_step steps + """ + + # quantize all layers + quantized_layers = get_layers(model, "(.*?)") + + for layer in quantized_layers: + + # book-keeping + is_master_process = (not dist.is_initialized()) or ( + dist.is_initialized() and dist.get_rank() == 0 + ) + + # recover module + module = attrgetter(layer)(model) + if is_master_process: + logging.info( + f"Quantizing layer {layer} with bits={bits} and QuantNoise={p}" + ) + + # quantization params + q_params = { + "p": p, + "update_step": update_step, + "bits": bits, + "method": "histogram", + "counter": 0, + } + + # instantiate the quantized counterpart + if isinstance(module, tuple(MAPPING.keys())): + QuantizedModule = MAPPING[module.__class__] + quantized_module = QuantizedModule.__new__(QuantizedModule) + params = module.__dict__ + params.update(q_params) + quantized_module.__dict__.update(params) + + else: + if is_master_process: + logging.info(f"Module {module} not yet supported for quantization") + continue + + # activation quantization + a_q = ActivationQuantizer(quantized_module, p=0, bits=bits, method="histogram") + + # replace layer by its quantized counterpart + attrsetter(layer)(model, quantized_module) + + # return name of quantized layers + return quantized_layers diff --git a/SpeechT5/fairseq/fairseq/modules/same_pad.py b/SpeechT5/fairseq/fairseq/modules/same_pad.py new file mode 100644 index 0000000..4c04990 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/same_pad.py @@ -0,0 +1,21 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from torch import nn + + +class SamePad(nn.Module): + def __init__(self, kernel_size, causal=False): + super().__init__() + if causal: + self.remove = kernel_size - 1 + else: + self.remove = 1 if kernel_size % 2 == 0 else 0 + + def forward(self, x): + if self.remove > 0: + x = x[:, :, : -self.remove] + return x diff --git a/SpeechT5/fairseq/fairseq/modules/scalar_bias.py b/SpeechT5/fairseq/fairseq/modules/scalar_bias.py new file mode 100644 index 0000000..c96247c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/scalar_bias.py @@ -0,0 +1,31 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +# + +import torch + + +class ScalarBias(torch.autograd.Function): + """ + Adds a vector of scalars, used in self-attention mechanism to allow + the model to optionally attend to this vector instead of the past + """ + + @staticmethod + def forward(ctx, input, dim, bias_init): + size = list(input.size()) + size[dim] += 1 + output = input.new(*size).fill_(bias_init) + output.narrow(dim, 1, size[dim] - 1).copy_(input) + ctx.dim = dim + return output + + @staticmethod + def backward(ctx, grad): + return grad.narrow(ctx.dim, 1, grad.size(ctx.dim) - 1), None, None + + +def scalar_bias(input, dim, bias_init=0): + return ScalarBias.apply(input, dim, bias_init) diff --git a/SpeechT5/fairseq/fairseq/modules/sinusoidal_positional_embedding.py b/SpeechT5/fairseq/fairseq/modules/sinusoidal_positional_embedding.py new file mode 100644 index 0000000..4793ecf --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/sinusoidal_positional_embedding.py @@ -0,0 +1,105 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Any, Optional + +import torch +import torch.onnx.operators +from fairseq import utils +from torch import Tensor, nn + + +class SinusoidalPositionalEmbedding(nn.Module): + """This module produces sinusoidal positional embeddings of any length. + + Padding symbols are ignored. + """ + + def __init__(self, embedding_dim, padding_idx, init_size=1024): + super().__init__() + self.embedding_dim = embedding_dim + self.padding_idx = padding_idx if padding_idx is not None else 0 + self.weights = SinusoidalPositionalEmbedding.get_embedding( + init_size, embedding_dim, padding_idx + ) + self.onnx_trace = False + self.register_buffer("_float_tensor", torch.FloatTensor(1)) + self.max_positions = int(1e5) + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + @staticmethod + def get_embedding( + num_embeddings: int, embedding_dim: int, padding_idx: Optional[int] = None + ): + """Build sinusoidal embeddings. + + This matches the implementation in tensor2tensor, but differs slightly + from the description in Section 3.5 of "Attention Is All You Need". + """ + half_dim = embedding_dim // 2 + emb = math.log(10000) / (half_dim - 1) + emb = torch.exp(torch.arange(half_dim, dtype=torch.float) * -emb) + emb = torch.arange(num_embeddings, dtype=torch.float).unsqueeze( + 1 + ) * emb.unsqueeze(0) + emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=1).view( + num_embeddings, -1 + ) + if embedding_dim % 2 == 1: + # zero pad + emb = torch.cat([emb, torch.zeros(num_embeddings, 1)], dim=1) + if padding_idx is not None: + emb[padding_idx, :] = 0 + return emb + + def forward( + self, + input, + incremental_state: Optional[Any] = None, + timestep: Optional[Tensor] = None, + positions: Optional[Any] = None, + ): + """Input is expected to be of size [bsz x seqlen].""" + bspair = torch.onnx.operators.shape_as_tensor(input) + bsz, seq_len = bspair[0], bspair[1] + max_pos = self.padding_idx + 1 + seq_len + if self.weights is None or max_pos > self.weights.size(0): + # recompute/expand embeddings if needed + self.weights = SinusoidalPositionalEmbedding.get_embedding( + max_pos, self.embedding_dim, self.padding_idx + ) + self.weights = self.weights.to(self._float_tensor) + + if incremental_state is not None: + # positions is the same for every token when decoding a single step + pos = timestep.view(-1)[0] + 1 if timestep is not None else seq_len + if self.onnx_trace: + return ( + self.weights.index_select(index=self.padding_idx + pos, dim=0) + .unsqueeze(1) + .repeat(bsz, 1, 1) + ) + return self.weights[self.padding_idx + pos, :].expand(bsz, 1, -1) + + positions = utils.make_positions( + input, self.padding_idx, onnx_trace=self.onnx_trace + ) + if self.onnx_trace: + flat_embeddings = self.weights.detach().index_select(0, positions.view(-1)) + embedding_shape = torch.cat( + (bsz.view(1), seq_len.view(1), torch.tensor([-1], dtype=torch.long)) + ) + embeddings = torch.onnx.operators.reshape_from_tensor_shape( + flat_embeddings, embedding_shape + ) + return embeddings + return ( + self.weights.index_select(0, positions.view(-1)) + .view(bsz, seq_len, -1) + .detach() + ) diff --git a/SpeechT5/fairseq/fairseq/modules/sparse_multihead_attention.py b/SpeechT5/fairseq/fairseq/modules/sparse_multihead_attention.py new file mode 100644 index 0000000..3cbd9d6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/sparse_multihead_attention.py @@ -0,0 +1,140 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch + +from .multihead_attention import MultiheadAttention + + +class SparseMultiheadAttention(MultiheadAttention): + """Sparse Multi-Headed Attention. + + "Generating Long Sequences with Sparse Transformers". Implements + fixed factorized self attention, where l=stride and c=expressivity. + A(1) includes all words in the stride window and A(2) takes a summary of c + words from the end of each stride window. + If is_bidirectional=False, we do not include any words past the current word, + as in the paper. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + stride=32, + expressivity=8, + is_bidirectional=True, + ): + + super().__init__( + embed_dim, + num_heads, + kdim, + vdim, + dropout, + bias, + add_bias_kv, + add_zero_attn, + self_attention, + encoder_decoder_attention, + ) + + self.is_bidirectional = is_bidirectional + self.stride = stride + self.expressivity = expressivity + assert self.stride > 0 and self.stride >= self.expressivity + + # Used for Ai(2) calculations - beginning of [l-c, l] range + def compute_checkpoint(self, word_index): + if word_index % self.stride == 0 and word_index != 0: + checkpoint_index = word_index - self.expressivity + else: + checkpoint_index = ( + math.floor(word_index / self.stride) * self.stride + + self.stride + - self.expressivity + ) + return checkpoint_index + + # Computes Ai(2) + def compute_subset_summaries(self, absolute_max): + checkpoint_index = self.compute_checkpoint(0) + subset_two = set() + while checkpoint_index <= absolute_max - 1: + summary = set( + range( + checkpoint_index, + min(checkpoint_index + self.expressivity + 1, absolute_max), + ) + ) + subset_two = subset_two.union(summary) + checkpoint_index = self.compute_checkpoint(checkpoint_index + self.stride) + return subset_two + + # Sparse Transformer Fixed Attention Pattern: https://arxiv.org/pdf/1904.10509.pdf + def compute_fixed_attention_subset(self, word_index, tgt_len): + # +1s account for range function; [min, max) -> [min, max] + if not self.is_bidirectional: + absolute_max = word_index + 1 + else: + absolute_max = tgt_len + + # Subset 1 - whole window + rounded_index = ( + math.floor((word_index + self.stride) / self.stride) * self.stride + ) + if word_index % self.stride == 0 and word_index != 0: + subset_one = set( + range(word_index - self.stride, min(absolute_max, word_index + 1)) + ) + else: + subset_one = set( + range( + max(0, rounded_index - self.stride), + min(absolute_max, rounded_index + 1), + ) + ) + + # Subset 2 - summary per window + # If bidirectional, subset 2 is the same for every index + subset_two = set() + if not self.is_bidirectional: + subset_two = self.compute_subset_summaries(absolute_max) + + return subset_one.union(subset_two) + + # Compute sparse mask - if bidirectional, can pre-compute and store + def buffered_sparse_mask(self, tensor, tgt_len, src_len): + assert tgt_len > self.stride + sparse_mask = torch.empty((tgt_len, src_len)).float().fill_(float("-inf")) + + # If bidirectional, subset 2 is the same for every index + subset_summaries = set() + if self.is_bidirectional: + subset_summaries = self.compute_subset_summaries(tgt_len) + + for i in range(tgt_len): + fixed_attention_subset = self.compute_fixed_attention_subset(i, tgt_len) + fixed_attention_subset = fixed_attention_subset.union(subset_summaries) + included_word_indices = torch.LongTensor(list(fixed_attention_subset)) + sparse_mask[i].index_fill_(0, included_word_indices, 0) + return sparse_mask.type_as(tensor) + + def apply_sparse_mask(self, attn_weights, tgt_len, src_len, bsz): + sparse_mask = self.buffered_sparse_mask(attn_weights, tgt_len, src_len) + sparse_mask = sparse_mask.unsqueeze(0).expand( + bsz * self.num_heads, tgt_len, src_len + ) + attn_weights += sparse_mask diff --git a/SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder.py b/SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder.py new file mode 100644 index 0000000..f41ec09 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder.py @@ -0,0 +1,96 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.nn as nn +from fairseq.modules import TransformerSentenceEncoder +from fairseq.modules.sparse_transformer_sentence_encoder_layer import ( + SparseTransformerSentenceEncoderLayer, +) + + +class SparseTransformerSentenceEncoder(TransformerSentenceEncoder): + """ + Sparse implementation of the TransformerSentenceEncoder + - see SparseMultiheadAttention + """ + + def __init__( + self, + padding_idx: int, + vocab_size: int, + num_encoder_layers: int = 6, + embedding_dim: int = 768, + ffn_embedding_dim: int = 3072, + num_attention_heads: int = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + max_seq_len: int = 256, + num_segments: int = 2, + use_position_embeddings: bool = True, + offset_positions_by_padding: bool = True, + encoder_normalize_before: bool = False, + apply_bert_init: bool = False, + activation_fn: str = "relu", + learned_pos_embedding: bool = True, + embed_scale: float = None, + freeze_embeddings: bool = False, + n_trans_layers_to_freeze: int = 0, + export: bool = False, + is_bidirectional: bool = True, + stride: int = 32, + expressivity: int = 8, + ) -> None: + + super().__init__( + padding_idx, + vocab_size, + num_encoder_layers, + embedding_dim, + ffn_embedding_dim, + num_attention_heads, + dropout, + attention_dropout, + activation_dropout, + max_seq_len, + num_segments, + use_position_embeddings, + offset_positions_by_padding, + encoder_normalize_before, + apply_bert_init, + activation_fn, + learned_pos_embedding, + embed_scale, + freeze_embeddings, + n_trans_layers_to_freeze, + export, + ) + + self.layers = nn.ModuleList( + [ + SparseTransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=ffn_embedding_dim, + num_attention_heads=num_attention_heads, + dropout=dropout, + attention_dropout=attention_dropout, + activation_dropout=activation_dropout, + activation_fn=activation_fn, + export=export, + is_bidirectional=is_bidirectional, + stride=stride, + expressivity=expressivity, + ) + for _ in range(num_encoder_layers) + ] + ) + + def freeze_module_params(m): + if m is not None: + for p in m.parameters(): + p.requires_grad = False + + for layer in range(n_trans_layers_to_freeze): + freeze_module_params(self.layers[layer]) diff --git a/SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder_layer.py b/SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder_layer.py new file mode 100644 index 0000000..d95da59 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/sparse_transformer_sentence_encoder_layer.py @@ -0,0 +1,51 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.modules import TransformerSentenceEncoderLayer +from fairseq.modules.sparse_multihead_attention import SparseMultiheadAttention + + +class SparseTransformerSentenceEncoderLayer(TransformerSentenceEncoderLayer): + """ + Implements a Sprase Transformer Encoder Layer (see SparseMultiheadAttention) + """ + + def __init__( + self, + embedding_dim: int = 768, + ffn_embedding_dim: int = 3072, + num_attention_heads: int = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + export: bool = False, + is_bidirectional: bool = True, + stride: int = 32, + expressivity: int = 8, + ) -> None: + + super().__init__( + embedding_dim, + ffn_embedding_dim, + num_attention_heads, + dropout, + attention_dropout, + activation_dropout, + activation_fn, + export, + ) + + self.self_attn = SparseMultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + add_bias_kv=False, + add_zero_attn=False, + self_attention=True, + is_bidirectional=is_bidirectional, + stride=stride, + expressivity=expressivity, + ) diff --git a/SpeechT5/fairseq/fairseq/modules/transformer_layer.py b/SpeechT5/fairseq/fairseq/modules/transformer_layer.py new file mode 100644 index 0000000..aa06a42 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/transformer_layer.py @@ -0,0 +1,419 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.modules import LayerNorm, MultiheadAttention +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.quant_noise import quant_noise +from torch import Tensor + + +class TransformerEncoderLayer(nn.Module): + """Encoder layer block. + + In the original paper each operation (multi-head attention or FFN) is + postprocessed with: `dropout -> add residual -> layernorm`. In the + tensor2tensor code they suggest that learning is more robust when + preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *args.encoder_normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + + def __init__(self, args): + super().__init__() + self.args = args + self.embed_dim = args.encoder_embed_dim + self.quant_noise = getattr(args, "quant_noise_pq", 0) + self.quant_noise_block_size = getattr(args, "quant_noise_pq_block_size", 8) or 8 + self.self_attn = self.build_self_attention(self.embed_dim, args) + export = getattr(args, "export", False) + self.self_attn_layer_norm = LayerNorm(self.embed_dim, export=export) + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.activation_fn = utils.get_activation_fn( + activation=getattr(args, "activation_fn", "relu") or "relu" + ) + activation_dropout_p = getattr(args, "activation_dropout", 0) or 0 + if activation_dropout_p == 0: + # for backwards compatibility with models that use args.relu_dropout + activation_dropout_p = getattr(args, "relu_dropout", 0) or 0 + self.activation_dropout_module = FairseqDropout( + float(activation_dropout_p), module_name=self.__class__.__name__ + ) + self.normalize_before = args.encoder_normalize_before + self.fc1 = self.build_fc1( + self.embed_dim, + args.encoder_ffn_embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + self.fc2 = self.build_fc2( + args.encoder_ffn_embed_dim, + self.embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + + self.final_layer_norm = LayerNorm(self.embed_dim, export=export) + + def build_fc1(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise( + nn.Linear(input_dim, output_dim), p=q_noise, block_size=qn_block_size + ) + + def build_fc2(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise( + nn.Linear(input_dim, output_dim), p=q_noise, block_size=qn_block_size + ) + + def build_self_attention(self, embed_dim, args): + return MultiheadAttention( + embed_dim, + args.encoder_attention_heads, + dropout=args.attention_dropout, + self_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + ) + + def residual_connection(self, x, residual): + return residual + x + + def upgrade_state_dict_named(self, state_dict, name): + """ + Rename layer norm states from `...layer_norms.0.weight` to + `...self_attn_layer_norm.weight` and `...layer_norms.1.weight` to + `...final_layer_norm.weight` + """ + layer_norm_map = {"0": "self_attn_layer_norm", "1": "final_layer_norm"} + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layer_norms.{}.{}".format(name, old, m) + if k in state_dict: + state_dict["{}.{}.{}".format(name, new, m)] = state_dict[k] + del state_dict[k] + + def forward( + self, + x, + encoder_padding_mask: Optional[Tensor], + attn_mask: Optional[Tensor] = None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor): binary ByteTensor of shape + `(batch, seq_len)` where padding elements are indicated by ``1``. + attn_mask (ByteTensor): binary tensor of shape `(tgt_len, src_len)`, + where `tgt_len` is the length of output and `src_len` is the + length of input, though here both are equal to `seq_len`. + `attn_mask[tgt_i, src_j] = 1` means that when calculating the + embedding for `tgt_i`, we exclude (mask out) `src_j`. This is + useful for strided self-attention. + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + # anything in original attn_mask = 1, becomes -1e8 + # anything in original attn_mask = 0, becomes 0 + # Note that we cannot use -inf here, because at some edge cases, + # the attention weight (before softmax) for some padded element in query + # will become -inf, which results in NaN in model parameters + if attn_mask is not None: + attn_mask = attn_mask.masked_fill(attn_mask.to(torch.bool), -1e8) + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + x, _ = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=encoder_padding_mask, + need_weights=False, + attn_mask=attn_mask, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + return x + + +class TransformerDecoderLayer(nn.Module): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *args.decoder_normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, args, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False + ): + super().__init__() + self.embed_dim = args.decoder_embed_dim + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.quant_noise = getattr(args, "quant_noise_pq", 0) + self.quant_noise_block_size = getattr(args, "quant_noise_pq_block_size", 8) + + self.cross_self_attention = getattr(args, "cross_self_attention", False) + + self.self_attn = self.build_self_attention( + self.embed_dim, + args, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + ) + + self.activation_fn = utils.get_activation_fn( + activation=str(args.activation_fn) + if getattr(args, "activation_fn", None) is not None + else "relu" + ) + activation_dropout_p = getattr(args, "activation_dropout", 0) or 0 + if activation_dropout_p == 0: + # for backwards compatibility with models that use args.relu_dropout + activation_dropout_p = getattr(args, "relu_dropout", 0) or 0 + self.activation_dropout_module = FairseqDropout( + float(activation_dropout_p), module_name=self.__class__.__name__ + ) + self.normalize_before = args.decoder_normalize_before + + export = getattr(args, "export", False) + self.self_attn_layer_norm = LayerNorm(self.embed_dim, export=export) + + if no_encoder_attn: + self.encoder_attn = None + self.encoder_attn_layer_norm = None + else: + self.encoder_attn = self.build_encoder_attention(self.embed_dim, args) + self.encoder_attn_layer_norm = LayerNorm(self.embed_dim, export=export) + + self.fc1 = self.build_fc1( + self.embed_dim, + args.decoder_ffn_embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + self.fc2 = self.build_fc2( + args.decoder_ffn_embed_dim, + self.embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + + self.final_layer_norm = LayerNorm(self.embed_dim, export=export) + self.need_attn = True + + self.onnx_trace = False + + def build_fc1(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise(nn.Linear(input_dim, output_dim), q_noise, qn_block_size) + + def build_fc2(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise(nn.Linear(input_dim, output_dim), q_noise, qn_block_size) + + def build_self_attention( + self, embed_dim, args, add_bias_kv=False, add_zero_attn=False + ): + return MultiheadAttention( + embed_dim, + args.decoder_attention_heads, + dropout=args.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=not getattr(args, "cross_self_attention", False), + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + ) + + def build_encoder_attention(self, embed_dim, args): + return MultiheadAttention( + embed_dim, + args.decoder_attention_heads, + kdim=getattr(args, "encoder_embed_dim", None), + vdim=getattr(args, "encoder_embed_dim", None), + dropout=args.attention_dropout, + encoder_decoder_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + ) + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def residual_connection(self, x, residual): + return residual + x + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + if self.encoder_attn is not None and encoder_out is not None: + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None + + def make_generation_fast_(self, need_attn: bool = False, **kwargs): + self.need_attn = need_attn diff --git a/SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder.py b/SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder.py new file mode 100644 index 0000000..d0540d6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder.py @@ -0,0 +1,291 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Optional, Tuple + +import torch +import torch.nn as nn +from fairseq.modules import ( + FairseqDropout, + LayerDropModuleList, + LayerNorm, + MultiheadAttention, + PositionalEmbedding, + TransformerSentenceEncoderLayer, +) +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ + + +def init_bert_params(module): + """ + Initialize the weights specific to the BERT Model. + This overrides the default initializations depending on the specified arguments. + 1. If normal_init_linear_weights is set then weights of linear + layer will be initialized using the normal distribution and + bais will be set to the specified value. + 2. If normal_init_embed_weights is set then weights of embedding + layer will be initialized using the normal distribution. + 3. If normal_init_proj_weights is set then weights of + in_project_weight for MultiHeadAttention initialized using + the normal distribution (to be validated). + """ + + def normal_(data): + # with FSDP, module params will be on CUDA, so we cast them back to CPU + # so that the RNG is consistent with and without FSDP + data.copy_( + data.cpu().normal_(mean=0.0, std=0.02).to(data.device) + ) + + if isinstance(module, nn.Linear): + normal_(module.weight.data) + if module.bias is not None: + module.bias.data.zero_() + if isinstance(module, nn.Embedding): + normal_(module.weight.data) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + if isinstance(module, MultiheadAttention): + normal_(module.q_proj.weight.data) + normal_(module.k_proj.weight.data) + normal_(module.v_proj.weight.data) + + +class TransformerSentenceEncoder(nn.Module): + """ + Implementation for a Bi-directional Transformer based Sentence Encoder used + in BERT/XLM style pre-trained models. + + This first computes the token embedding using the token embedding matrix, + position embeddings (if specified) and segment embeddings + (if specified). After applying the specified number of + TransformerEncoderLayers, it outputs all the internal states of the + encoder as well as the final representation associated with the first + token (usually CLS token). + + Input: + - tokens: B x T matrix representing sentences + - segment_labels: B x T matrix representing segment label for tokens + + Output: + - a tuple of the following: + - a list of internal model states used to compute the + predictions where each tensor has shape T x B x C + - sentence representation associated with first input token + in format B x C. + """ + + def __init__( + self, + padding_idx: int, + vocab_size: int, + num_encoder_layers: int = 6, + embedding_dim: int = 768, + ffn_embedding_dim: int = 3072, + num_attention_heads: int = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + layerdrop: float = 0.0, + max_seq_len: int = 256, + num_segments: int = 2, + use_position_embeddings: bool = True, + offset_positions_by_padding: bool = True, + encoder_normalize_before: bool = False, + apply_bert_init: bool = False, + activation_fn: str = "relu", + learned_pos_embedding: bool = True, + embed_scale: float = None, + freeze_embeddings: bool = False, + n_trans_layers_to_freeze: int = 0, + export: bool = False, + traceable: bool = False, + q_noise: float = 0.0, + qn_block_size: int = 8, + ) -> None: + + super().__init__() + self.padding_idx = padding_idx + self.vocab_size = vocab_size + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.layerdrop = layerdrop + self.max_seq_len = max_seq_len + self.embedding_dim = embedding_dim + self.num_segments = num_segments + self.use_position_embeddings = use_position_embeddings + self.apply_bert_init = apply_bert_init + self.learned_pos_embedding = learned_pos_embedding + self.traceable = traceable + + self.embed_tokens = self.build_embedding( + self.vocab_size, self.embedding_dim, self.padding_idx + ) + self.embed_scale = embed_scale + + if q_noise > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(self.embedding_dim, self.embedding_dim, bias=False), + q_noise, + qn_block_size, + ) + else: + self.quant_noise = None + + self.segment_embeddings = ( + nn.Embedding(self.num_segments, self.embedding_dim, padding_idx=None) + if self.num_segments > 0 + else None + ) + + self.embed_positions = ( + PositionalEmbedding( + self.max_seq_len, + self.embedding_dim, + padding_idx=(self.padding_idx if offset_positions_by_padding else None), + learned=self.learned_pos_embedding, + ) + if self.use_position_embeddings + else None + ) + + if encoder_normalize_before: + self.emb_layer_norm = LayerNorm(self.embedding_dim, export=export) + else: + self.emb_layer_norm = None + + if self.layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.layerdrop) + else: + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + self.build_transformer_sentence_encoder_layer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=ffn_embedding_dim, + num_attention_heads=num_attention_heads, + dropout=self.dropout_module.p, + attention_dropout=attention_dropout, + activation_dropout=activation_dropout, + activation_fn=activation_fn, + export=export, + q_noise=q_noise, + qn_block_size=qn_block_size, + ) + for _ in range(num_encoder_layers) + ] + ) + + # Apply initialization of model params after building the model + if self.apply_bert_init: + self.apply(init_bert_params) + + def freeze_module_params(m): + if m is not None: + for p in m.parameters(): + p.requires_grad = False + + if freeze_embeddings: + freeze_module_params(self.embed_tokens) + freeze_module_params(self.segment_embeddings) + freeze_module_params(self.embed_positions) + freeze_module_params(self.emb_layer_norm) + + for layer in range(n_trans_layers_to_freeze): + freeze_module_params(self.layers[layer]) + + def build_embedding(self, vocab_size, embedding_dim, padding_idx): + return nn.Embedding(vocab_size, embedding_dim, padding_idx) + + def build_transformer_sentence_encoder_layer( + self, + embedding_dim, + ffn_embedding_dim, + num_attention_heads, + dropout, + attention_dropout, + activation_dropout, + activation_fn, + export, + q_noise, + qn_block_size, + ): + return TransformerSentenceEncoderLayer( + embedding_dim=embedding_dim, + ffn_embedding_dim=ffn_embedding_dim, + num_attention_heads=num_attention_heads, + dropout=dropout, + attention_dropout=attention_dropout, + activation_dropout=activation_dropout, + activation_fn=activation_fn, + export=export, + q_noise=q_noise, + qn_block_size=qn_block_size, + ) + + def forward( + self, + tokens: torch.Tensor, + segment_labels: torch.Tensor = None, + last_state_only: bool = False, + positions: Optional[torch.Tensor] = None, + token_embeddings: Optional[torch.Tensor] = None, + attn_mask: Optional[torch.Tensor] = None, + ) -> Tuple[torch.Tensor, torch.Tensor]: + is_tpu = tokens.device.type == "xla" + + # compute padding mask. This is needed for multi-head attention + padding_mask = tokens.eq(self.padding_idx) + if not self.traceable and not is_tpu and not padding_mask.any(): + padding_mask = None + + if token_embeddings is not None: + x = token_embeddings + else: + x = self.embed_tokens(tokens) + + if self.embed_scale is not None: + x = x * self.embed_scale + + if self.embed_positions is not None: + x = x + self.embed_positions(tokens, positions=positions) + + if self.segment_embeddings is not None and segment_labels is not None: + x = x + self.segment_embeddings(segment_labels) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.emb_layer_norm is not None: + x = self.emb_layer_norm(x) + + x = self.dropout_module(x) + + # account for padding while computing the representation + if padding_mask is not None: + x = x * (1 - padding_mask.unsqueeze(-1).type_as(x)) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + inner_states = [] + if not last_state_only: + inner_states.append(x) + + for layer in self.layers: + x, _ = layer(x, self_attn_padding_mask=padding_mask, self_attn_mask=attn_mask) + if not last_state_only: + inner_states.append(x) + + sentence_rep = x[0, :, :] + + if last_state_only: + inner_states = [x] + + if self.traceable: + return torch.stack(inner_states), sentence_rep + else: + return inner_states, sentence_rep diff --git a/SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder_layer.py b/SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder_layer.py new file mode 100644 index 0000000..f869c4b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/transformer_sentence_encoder_layer.py @@ -0,0 +1,139 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Callable, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.modules import LayerNorm, MultiheadAttention +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.quant_noise import quant_noise + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: int = 768, + ffn_embedding_dim: int = 3072, + num_attention_heads: int = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + export: bool = False, + q_noise: float = 0.0, + qn_block_size: int = 8, + init_fn: Callable = None, + ) -> None: + super().__init__() + + if init_fn is not None: + init_fn() + + # Initialize parameters + self.embedding_dim = embedding_dim + self.num_attention_heads = num_attention_heads + self.attention_dropout = attention_dropout + self.q_noise = q_noise + self.qn_block_size = qn_block_size + + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + self.activation_dropout_module = FairseqDropout( + activation_dropout, module_name=self.__class__.__name__ + ) + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = self.build_self_attention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + q_noise=q_noise, + qn_block_size=qn_block_size, + ) + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim, export=export) + + self.fc1 = self.build_fc1( + self.embedding_dim, + ffn_embedding_dim, + q_noise=q_noise, + qn_block_size=qn_block_size, + ) + self.fc2 = self.build_fc2( + ffn_embedding_dim, + self.embedding_dim, + q_noise=q_noise, + qn_block_size=qn_block_size, + ) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim, export=export) + + def build_fc1(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise(nn.Linear(input_dim, output_dim), q_noise, qn_block_size) + + def build_fc2(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise(nn.Linear(input_dim, output_dim), q_noise, qn_block_size) + + def build_self_attention( + self, + embed_dim, + num_attention_heads, + dropout, + self_attention, + q_noise, + qn_block_size, + ): + return MultiheadAttention( + embed_dim, + num_attention_heads, + dropout=dropout, + self_attention=True, + q_noise=q_noise, + qn_block_size=qn_block_size, + ) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer implementation. + """ + residual = x + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + need_weights=False, + attn_mask=self_attn_mask, + ) + x = self.dropout_module(x) + x = residual + x + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = residual + x + x = self.final_layer_norm(x) + return x, attn diff --git a/SpeechT5/fairseq/fairseq/modules/transpose_last.py b/SpeechT5/fairseq/fairseq/modules/transpose_last.py new file mode 100644 index 0000000..e578b3e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/transpose_last.py @@ -0,0 +1,20 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +transpose last 2 dimensions of the input +""" + +import torch.nn as nn + + +class TransposeLast(nn.Module): + def __init__(self, deconstruct_idx=None): + super().__init__() + self.deconstruct_idx = deconstruct_idx + + def forward(self, x): + if self.deconstruct_idx is not None: + x = x[self.deconstruct_idx] + return x.transpose(-2, -1) diff --git a/SpeechT5/fairseq/fairseq/modules/unfold.py b/SpeechT5/fairseq/fairseq/modules/unfold.py new file mode 100644 index 0000000..138272f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/unfold.py @@ -0,0 +1,19 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.nn.functional as F + + +def unfold1d(x, kernel_size, padding_l, pad_value=0): + """unfold T x B x C to T x B x C x K""" + if kernel_size > 1: + T, B, C = x.size() + x = F.pad( + x, (0, 0, 0, 0, padding_l, kernel_size - 1 - padding_l), value=pad_value + ) + x = x.as_strided((T, B, C, kernel_size), (B * C, C, 1, B * C)) + else: + x = x.unsqueeze(3) + return x diff --git a/SpeechT5/fairseq/fairseq/modules/vggblock.py b/SpeechT5/fairseq/fairseq/modules/vggblock.py new file mode 100644 index 0000000..ee5ee19 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/modules/vggblock.py @@ -0,0 +1,116 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +from collections.abc import Iterable +from itertools import repeat + +import torch +import torch.nn as nn + + +def _pair(v): + if isinstance(v, Iterable): + assert len(v) == 2, "len(v) != 2" + return v + return tuple(repeat(v, 2)) + + +def infer_conv_output_dim(conv_op, input_dim, sample_inchannel): + sample_seq_len = 200 + sample_bsz = 10 + x = torch.randn(sample_bsz, sample_inchannel, sample_seq_len, input_dim) + # N x C x H x W + # N: sample_bsz, C: sample_inchannel, H: sample_seq_len, W: input_dim + x = conv_op(x) + # N x C x H x W + x = x.transpose(1, 2) + # N x H x C x W + bsz, seq = x.size()[:2] + per_channel_dim = x.size()[3] + # bsz: N, seq: H, CxW the rest + return x.contiguous().view(bsz, seq, -1).size(-1), per_channel_dim + + +class VGGBlock(torch.nn.Module): + """ + VGG motibated cnn module https://arxiv.org/pdf/1409.1556.pdf + + Args: + in_channels: (int) number of input channels (typically 1) + out_channels: (int) number of output channels + conv_kernel_size: convolution channels + pooling_kernel_size: the size of the pooling window to take a max over + num_conv_layers: (int) number of convolution layers + input_dim: (int) input dimension + conv_stride: the stride of the convolving kernel. + Can be a single number or a tuple (sH, sW) Default: 1 + padding: implicit paddings on both sides of the input. + Can be a single number or a tuple (padH, padW). Default: None + layer_norm: (bool) if layer norm is going to be applied. Default: False + + Shape: + Input: BxCxTxfeat, i.e. (batch_size, input_size, timesteps, features) + Output: BxCxTxfeat, i.e. (batch_size, input_size, timesteps, features) + """ + + def __init__( + self, + in_channels, + out_channels, + conv_kernel_size, + pooling_kernel_size, + num_conv_layers, + input_dim, + conv_stride=1, + padding=None, + layer_norm=False, + ): + assert ( + input_dim is not None + ), "Need input_dim for LayerNorm and infer_conv_output_dim" + super(VGGBlock, self).__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.conv_kernel_size = _pair(conv_kernel_size) + self.pooling_kernel_size = _pair(pooling_kernel_size) + self.num_conv_layers = num_conv_layers + self.padding = ( + tuple(e // 2 for e in self.conv_kernel_size) + if padding is None + else _pair(padding) + ) + self.conv_stride = _pair(conv_stride) + + self.layers = nn.ModuleList() + for layer in range(num_conv_layers): + conv_op = nn.Conv2d( + in_channels if layer == 0 else out_channels, + out_channels, + self.conv_kernel_size, + stride=self.conv_stride, + padding=self.padding, + ) + self.layers.append(conv_op) + if layer_norm: + conv_output_dim, per_channel_dim = infer_conv_output_dim( + conv_op, input_dim, in_channels if layer == 0 else out_channels + ) + self.layers.append(nn.LayerNorm(per_channel_dim)) + input_dim = per_channel_dim + self.layers.append(nn.ReLU()) + + if self.pooling_kernel_size is not None: + pool_op = nn.MaxPool2d(kernel_size=self.pooling_kernel_size, ceil_mode=True) + self.layers.append(pool_op) + self.total_output_dim, self.output_dim = infer_conv_output_dim( + pool_op, input_dim, out_channels + ) + + def forward(self, x): + for i, _ in enumerate(self.layers): + x = self.layers[i](x) + return x diff --git a/SpeechT5/fairseq/fairseq/nan_detector.py b/SpeechT5/fairseq/fairseq/nan_detector.py new file mode 100644 index 0000000..faa8031 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/nan_detector.py @@ -0,0 +1,108 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import torch + + +logger = logging.getLogger(__name__) + + +class NanDetector: + """ + Detects the first NaN or Inf in forward and/or backward pass and logs, together with the module name + """ + + def __init__(self, model, forward=True, backward=True): + self.bhooks = [] + self.fhooks = [] + self.forward = forward + self.backward = backward + self.named_parameters = list(model.named_parameters()) + self.reset() + + for name, mod in model.named_modules(): + mod.__module_name = name + self.add_hooks(mod) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_traceback): + # Dump out all model gnorms to enable better debugging + norm = {} + gradients = {} + for name, param in self.named_parameters: + if param.grad is not None: + grad_norm = torch.norm(param.grad.data, p=2, dtype=torch.float32) + norm[name] = grad_norm.item() + if torch.isnan(grad_norm).any() or torch.isinf(grad_norm).any(): + gradients[name] = param.grad.data + if len(gradients) > 0: + logger.info("Detected nan/inf grad norm, dumping norms...") + logger.info(f"norms: {norm}") + logger.info(f"gradients: {gradients}") + + self.close() + + def add_hooks(self, module): + if self.forward: + self.fhooks.append(module.register_forward_hook(self.fhook_fn)) + if self.backward: + self.bhooks.append(module.register_backward_hook(self.bhook_fn)) + + def reset(self): + self.has_printed_f = False + self.has_printed_b = False + + def _detect(self, tensor, name, backward): + err = None + if ( + torch.is_floating_point(tensor) + # single value tensors (like the loss) will not provide much info + and tensor.numel() >= 2 + ): + with torch.no_grad(): + if torch.isnan(tensor).any(): + err = "NaN" + elif torch.isinf(tensor).any(): + err = "Inf" + if err is not None: + err = f"{err} detected in output of {name}, shape: {tensor.shape}, {'backward' if backward else 'forward'}" + return err + + def _apply(self, module, inp, x, backward): + if torch.is_tensor(x): + if isinstance(inp, tuple) and len(inp) > 0: + inp = inp[0] + err = self._detect(x, module.__module_name, backward) + if err is not None: + if torch.is_tensor(inp) and not backward: + err += ( + f" input max: {inp.max().item()}, input min: {inp.min().item()}" + ) + + has_printed_attr = "has_printed_b" if backward else "has_printed_f" + logger.warning(err) + setattr(self, has_printed_attr, True) + elif isinstance(x, dict): + for v in x.values(): + self._apply(module, inp, v, backward) + elif isinstance(x, list) or isinstance(x, tuple): + for v in x: + self._apply(module, inp, v, backward) + + def fhook_fn(self, module, inp, output): + if not self.has_printed_f: + self._apply(module, inp, output, backward=False) + + def bhook_fn(self, module, inp, output): + if not self.has_printed_b: + self._apply(module, inp, output, backward=True) + + def close(self): + for hook in self.fhooks + self.bhooks: + hook.remove() diff --git a/SpeechT5/fairseq/fairseq/ngram_repeat_block.py b/SpeechT5/fairseq/fairseq/ngram_repeat_block.py new file mode 100644 index 0000000..8541251 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/ngram_repeat_block.py @@ -0,0 +1,150 @@ +# Originally from Microsoft Corporation. +# Licensed under the MIT License. + +""" Wrapper for ngram_repeat_block cuda extension """ +import torch +from torch import nn + +import math +from typing import Dict, List, Optional +import warnings + +try: + from fairseq import ngram_repeat_block_cuda + + EXTENSION_BUILT = True +except ImportError: + EXTENSION_BUILT = False + + +def is_cuda_extension_usable() -> bool: + """Check whether ngram_repeat_block_cuda is built properly""" + if not EXTENSION_BUILT or not torch.cuda.is_available(): + return False + bsz = 2 + tokens = torch.tensor([[4, 4, 3, 2], [1, 2, 3, 4]], dtype=torch.long, device="cuda") + lprobs = torch.rand((8, 12), device="cuda") + try: + outputs = ngram_repeat_block_cuda.forward(tokens, lprobs, bsz, 3, 4, 3) + outputs = outputs + 4 # This line breaks if the extension is built incorrectly. + return True + except RuntimeError: + warnings.warn( + "NGramRepeatBlock extension must be rebuilt." + 'Run TORCH_CUDA_ARCH_LIST="6.0;6.1;7.0" python setup.py build_ext --inplace' + ) + return False + + +class NGramRepeatBlock(nn.Module): + """ Wrapper class for calling ngram_repeat_block cuda extension """ + + def __init__(self, no_repeat_ngram_size: int, use_extension: bool = True): + super().__init__() + self.use_extension = is_cuda_extension_usable() if use_extension else False + self.no_repeat_ngram_size = no_repeat_ngram_size + + def reset_parameters(self): + pass + + @torch.jit.unused + def call_cuda_extension( + self, + tokens, + lprobs, + bsz: int, + beam_size: int, + step: int, + ): + return ngram_repeat_block_cuda.forward( + tokens, lprobs, bsz, step, beam_size, self.no_repeat_ngram_size + ) + + def forward( + self, + tokens, + lprobs, + bsz: int, + beam_size: int, + step: int, + ): + """ + Args: + tokens(Tensor): Input tokens(Bsz*beam, seq_len) + lprobs(Tensor): likelihood probability, + Expected to be updated in place.(Bsz*beam, vocab_size) + bsz(int): batch size + step(int): current step + beam_size(int): beam size + no_repeat_ngram_size(int): Ngram size + """ + msg = f"expected {bsz *beam_size} got" + assert tokens.size(0) == bsz * beam_size, f"{msg} {tokens.size(0)}" + assert lprobs.size(0) == bsz * beam_size, f"{msg} {lprobs.size(0)}" + if self.use_extension: + return self.call_cuda_extension(tokens, lprobs, bsz, beam_size, step) + + else: + return self._no_repeat_ngram( + tokens, + lprobs, + bsz, + beam_size, + step, + ) + + def _no_repeat_ngram(self, tokens, lprobs, bsz: int, beam_size: int, step: int): + """For each hypothesis generate a list of previous ngrams and set associated lprobs to -inf""" + gen_ngrams: List[Dict[str, List[int]]] = [ + torch.jit.annotate(Dict[str, List[int]], {}) + for bbsz_idx in range(bsz * beam_size) + ] + cpu_tokens = tokens.cpu() + for bbsz_idx in range(bsz * beam_size): + gen_tokens: List[int] = cpu_tokens[bbsz_idx].tolist() + for ngram in self.transpose_list( + [gen_tokens[i:] for i in range(self.no_repeat_ngram_size)] + ): + key = ",".join([str(x) for x in ngram[:-1]]) + gen_ngrams[bbsz_idx][key] = gen_ngrams[bbsz_idx].get( + key, torch.jit.annotate(List[int], []) + ) + [ngram[-1]] + if step + 2 - self.no_repeat_ngram_size >= 0: + # no banned tokens if we haven't generated no_repeat_ngram_size tokens yet + banned_tokens = [ + self.calculate_banned_tokens( + tokens, step, gen_ngrams, self.no_repeat_ngram_size, bbsz_idx + ) + for bbsz_idx in range(bsz * beam_size) + ] + else: + banned_tokens = [ + torch.jit.annotate(List[int], []) for bbsz_idx in range(bsz * beam_size) + ] + for bbsz_idx in range(bsz * beam_size): + lprobs[bbsz_idx][ + torch.tensor(banned_tokens[bbsz_idx], dtype=torch.int64) + ] = torch.tensor(-math.inf).to(lprobs) + return lprobs + + @staticmethod + def calculate_banned_tokens( + tokens, + step: int, + gen_ngrams: List[Dict[str, List[int]]], + no_repeat_ngram_size: int, + bbsz_idx: int, + ): + tokens_list: List[int] = tokens[ + bbsz_idx, step + 2 - no_repeat_ngram_size : step + 1 + ].tolist() + # before decoding the next token, prevent decoding of ngrams that have already appeared + ngram_index = ",".join([str(x) for x in tokens_list]) + return gen_ngrams[bbsz_idx].get(ngram_index, torch.jit.annotate(List[int], [])) + + @staticmethod + def transpose_list(l: List[List[int]]): + # GeneratorExp aren't supported in TS so ignoring the lint + min_len = min([len(x) for x in l]) # noqa + l2 = [[row[i] for row in l] for i in range(min_len)] + return l2 diff --git a/SpeechT5/fairseq/fairseq/optim/__init__.py b/SpeechT5/fairseq/fairseq/optim/__init__.py new file mode 100644 index 0000000..be783be --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/__init__.py @@ -0,0 +1,48 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import importlib +import os + +from fairseq import registry +from fairseq.optim.bmuf import FairseqBMUF # noqa +from fairseq.optim.fairseq_optimizer import ( # noqa + FairseqOptimizer, + LegacyFairseqOptimizer, +) +from fairseq.optim.amp_optimizer import AMPOptimizer +from fairseq.optim.fp16_optimizer import FP16Optimizer, MemoryEfficientFP16Optimizer +from fairseq.optim.shard import shard_ +from omegaconf import DictConfig + +__all__ = [ + "AMPOptimizer", + "FairseqOptimizer", + "FP16Optimizer", + "MemoryEfficientFP16Optimizer", + "shard_", +] + +( + _build_optimizer, + register_optimizer, + OPTIMIZER_REGISTRY, + OPTIMIZER_DATACLASS_REGISTRY, +) = registry.setup_registry("--optimizer", base_class=FairseqOptimizer, required=True) + + +def build_optimizer(cfg: DictConfig, params, *extra_args, **extra_kwargs): + if all(isinstance(p, dict) for p in params): + params = [t for p in params for t in p.values()] + params = list(filter(lambda p: p.requires_grad, params)) + return _build_optimizer(cfg, params, *extra_args, **extra_kwargs) + + +# automatically import any Python files in the optim/ directory +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + file_name = file[: file.find(".py")] + importlib.import_module("fairseq.optim." + file_name) diff --git a/SpeechT5/fairseq/fairseq/optim/adadelta.py b/SpeechT5/fairseq/fairseq/optim/adadelta.py new file mode 100644 index 0000000..f1a2154 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/adadelta.py @@ -0,0 +1,47 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.optim + +from . import LegacyFairseqOptimizer, register_optimizer + + +@register_optimizer("adadelta") +class Adadelta(LegacyFairseqOptimizer): + def __init__(self, args, params): + super().__init__(args) + self._optimizer = torch.optim.Adadelta(params, **self.optimizer_config) + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--adadelta-rho', type=float, default=0.9, metavar='RHO', + help='coefficient used for computing a running average of squared gradients') + parser.add_argument('--adadelta-eps', type=float, default=1e-6, metavar='EPS', + help='term added to the denominator to improve numerical stability') + parser.add_argument('--weight-decay', '--wd', default=0.0, type=float, metavar='WD', + help='weight decay') + parser.add_argument('--anneal-eps', action='store_true', help='flag to anneal eps') + # fmt: on + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.args.lr[0], + "rho": self.args.adadelta_rho, + "eps": self.args.adadelta_eps, + "weight_decay": self.args.weight_decay, + } + + @property + def supports_flat_params(self): + return True diff --git a/SpeechT5/fairseq/fairseq/optim/adafactor.py b/SpeechT5/fairseq/fairseq/optim/adafactor.py new file mode 100644 index 0000000..c969b9f --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/adafactor.py @@ -0,0 +1,268 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math + +import torch +import torch.optim + +from . import LegacyFairseqOptimizer, register_optimizer + + +@register_optimizer("adafactor") +class FairseqAdafactor(LegacyFairseqOptimizer): + def __init__(self, args, params): + super().__init__(args) + self._optimizer = Adafactor(params, **self.optimizer_config) + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--adafactor-eps', default='(1e-30, 1e-3)', metavar="E", + help='epsilons for Adafactor optimizer') + parser.add_argument('--clip-threshold', type=float, default=1.0, metavar="C", + help='threshold for clipping update root mean square') + parser.add_argument('--decay-rate', type=float, default=-0.8, metavar="D", + help='decay rate of the second moment estimator') + parser.add_argument('--beta1', type=float, default=None, metavar="B", + help='beta for first moment estimator. Optional') + parser.add_argument('--weight-decay', '--wd', default=0.0, type=float, metavar='WD', + help='weight decay') + parser.add_argument('--scale-parameter', action='store_true', + help='scale learning rate by root mean square of parameter') + parser.add_argument('--relative-step', action='store_true', + help='set learning rate to inverse square root of timestep,' + 'otherwise use external learning rate') + parser.add_argument('--warmup-init', action='store_true', + help='use relative step for warm-up learning rate schedule') + # fmt: on + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + Note : Convergence issues empirically observed with fp16 on. + Might require search for appropriate configuration. + """ + return { + "lr": self.args.lr[0], + "eps": eval(self.args.adafactor_eps), + "clip_threshold": self.args.clip_threshold, + "decay_rate": self.args.decay_rate, + "beta1": self.args.beta1, + "weight_decay": self.args.weight_decay, + "scale_parameter": self.args.scale_parameter, # defaults to False + "relative_step": self.args.relative_step, # defaults to False + "warmup_init": self.args.warmup_init, + } + + +class Adafactor(torch.optim.Optimizer): + """Implements Adafactor algorithm. + + This implementation is based on: + `Adafactor: Adaptive Learning Rates with Sublinear Memory Cost` + (see https://arxiv.org/abs/1804.04235) + + Note that this optimizer internally adjusts the learning rate + depending on the *scale_parameter*, *relative_step* and + *warmup_init* options. To use a manual (external) learning rate + schedule you should set `scale_parameter=False` and + `relative_step=False`. + + Args: + params (iterable): iterable of parameters to optimize or dicts defining + parameter groups + lr (float, optional): external learning rate (default: None) + eps (tuple[float, float]): regularization constans for square gradient + and parameter scale respectively (default: (1e-30, 1e-3)) + clip_threshold (float): threshold of root mean square of + final gradient update (default: 1.0) + decay_rate (float): coefficient used to compute running averages of square + gradient (default: -0.8) + beta1 (float): coefficient used for computing running averages of gradient + (default: None) + weight_decay (float, optional): weight decay (L2 penalty) (default: 0) + scale_parameter (bool): if True, learning rate is scaled by root mean square of + parameter (default: True) + relative_step (bool): if True, time-dependent learning rate is computed + instead of external learning rate (default: True) + warmup_init (bool): time-dependent learning rate computation depends on + whether warm-up initialization is being used (default: False) + """ + + def __init__( + self, + params, + lr=None, + eps=(1e-30, 1e-3), + clip_threshold=1.0, + decay_rate=-0.8, + beta1=None, + weight_decay=0.0, + scale_parameter=True, + relative_step=True, + warmup_init=False, + ): + if lr is not None and relative_step: + raise ValueError("Cannot combine manual lr and relative_step options") + if warmup_init and not relative_step: + raise ValueError("warmup_init requires relative_step=True") + + defaults = dict( + lr=lr, + eps=eps, + clip_threshold=clip_threshold, + decay_rate=decay_rate, + beta1=beta1, + weight_decay=weight_decay, + scale_parameter=scale_parameter, + relative_step=relative_step, + warmup_init=warmup_init, + ) + super(Adafactor, self).__init__(params, defaults) + + @property + def supports_memory_efficient_fp16(self): + return True + + @property + def supports_flat_params(self): + return False + + def _get_lr(self, param_group, param_state): + rel_step_sz = param_group["lr"] + if param_group["relative_step"]: + min_step = ( + 1e-6 * param_state["step"] if param_group["warmup_init"] else 1e-2 + ) + rel_step_sz = min(min_step, 1.0 / math.sqrt(param_state["step"])) + param_scale = 1.0 + if param_group["scale_parameter"]: + param_scale = max(param_group["eps"][1], param_state["RMS"]) + return param_scale * rel_step_sz + + def _get_options(self, param_group, param_shape): + factored = len(param_shape) >= 2 + use_first_moment = param_group["beta1"] is not None + return factored, use_first_moment + + def _rms(self, tensor): + return tensor.norm(2) / (tensor.numel() ** 0.5) + + def _approx_sq_grad(self, exp_avg_sq_row, exp_avg_sq_col): + r_factor = ( + (exp_avg_sq_row / exp_avg_sq_row.mean(dim=-1, keepdim=True)) + .rsqrt_() + .unsqueeze(-1) + ) + c_factor = exp_avg_sq_col.unsqueeze(-2).rsqrt() + return torch.mul(r_factor, c_factor) + + def step(self, closure=None): + """Performs a single optimization step. + + Args: + closure (callable, optional): A closure that reevaluates the model + and returns the loss. + """ + loss = None + if closure is not None: + loss = closure() + + for group in self.param_groups: + for p in group["params"]: + if p.grad is None: + continue + grad = p.grad.data + if grad.dtype in {torch.float16, torch.bfloat16}: + grad = grad.float() + if grad.is_sparse: + raise RuntimeError("Adafactor does not support sparse gradients.") + + state = self.state[p] + grad_shape = grad.shape + + factored, use_first_moment = self._get_options(group, grad_shape) + # State Initialization + if len(state) == 0: + state["step"] = 0 + + if use_first_moment: + # Exponential moving average of gradient values + state["exp_avg"] = torch.zeros_like(grad) + if factored: + state["exp_avg_sq_row"] = torch.zeros(grad_shape[:-1]).to(grad) + state["exp_avg_sq_col"] = torch.zeros( + grad_shape[:-2] + grad_shape[-1:] + ).to(grad) + else: + state["exp_avg_sq"] = torch.zeros_like(grad) + + state["RMS"] = 0 + else: + if use_first_moment: + state["exp_avg"] = state["exp_avg"].to(grad) + if factored: + state["exp_avg_sq_row"] = state["exp_avg_sq_row"].to(grad) + state["exp_avg_sq_col"] = state["exp_avg_sq_col"].to(grad) + else: + state["exp_avg_sq"] = state["exp_avg_sq"].to(grad) + + p_data_fp32 = p.data + if p.data.dtype in {torch.float16, torch.bfloat16}: + p_data_fp32 = p_data_fp32.float() + + state["step"] += 1 + state["RMS"] = self._rms(p_data_fp32) + group["lr"] = self._get_lr(group, state) + + beta2t = 1.0 - math.pow(state["step"], group["decay_rate"]) + update = (grad ** 2) + group["eps"][0] + if factored: + exp_avg_sq_row = state["exp_avg_sq_row"] + exp_avg_sq_col = state["exp_avg_sq_col"] + + exp_avg_sq_row.mul_(beta2t).add_( + update.mean(dim=-1), alpha=1.0 - beta2t + ) + exp_avg_sq_col.mul_(beta2t).add_( + update.mean(dim=-2), alpha=1.0 - beta2t + ) + + # Approximation of exponential moving average of square of gradient + update = self._approx_sq_grad(exp_avg_sq_row, exp_avg_sq_col) + update.mul_(grad) + else: + exp_avg_sq = state["exp_avg_sq"] + + exp_avg_sq.mul_(beta2t).add_(update, alpha=1.0 - beta2t) + update = exp_avg_sq.rsqrt().mul_(grad) + + update.div_( + (self._rms(update) / group["clip_threshold"]).clamp_(min=1.0) + ) + update.mul_(group["lr"]) + + if use_first_moment: + exp_avg = state["exp_avg"] + exp_avg.mul_(group["beta1"]).add_(update, alpha=1 - group["beta1"]) + update = exp_avg + + if group["weight_decay"] != 0: + p_data_fp32.add_( + p_data_fp32, alpha=-group["weight_decay"] * group["lr"] + ) + + p_data_fp32.add_(-update) + + if p.data.dtype in {torch.float16, torch.bfloat16}: + p.data.copy_(p_data_fp32) + + return loss diff --git a/SpeechT5/fairseq/fairseq/optim/adagrad.py b/SpeechT5/fairseq/fairseq/optim/adagrad.py new file mode 100644 index 0000000..4f53954 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/adagrad.py @@ -0,0 +1,40 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.optim + +from . import LegacyFairseqOptimizer, register_optimizer + + +@register_optimizer("adagrad") +class Adagrad(LegacyFairseqOptimizer): + def __init__(self, args, params): + super().__init__(args) + self._optimizer = torch.optim.Adagrad(params, **self.optimizer_config) + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--weight-decay', '--wd', default=0.0, type=float, metavar='WD', + help='weight decay') + # fmt: on + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.args.lr[0], + "weight_decay": self.args.weight_decay, + } + + @property + def supports_flat_params(self): + return False diff --git a/SpeechT5/fairseq/fairseq/optim/adam.py b/SpeechT5/fairseq/fairseq/optim/adam.py new file mode 100644 index 0000000..6a31e53 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/adam.py @@ -0,0 +1,228 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import math +from collections.abc import Collection +from dataclasses import dataclass, field +from typing import Any, List + +import torch +import torch.distributed as dist +import torch.optim +from fairseq.dataclass import FairseqDataclass +from fairseq.optim import FairseqOptimizer, register_optimizer +from fairseq.optim.fused_adam import get_fused_adam_class +from omegaconf import II, OmegaConf + + +logger = logging.getLogger(__name__) + + +@dataclass +class FairseqAdamConfig(FairseqDataclass): + adam_betas: Any = field( + default=(0.9, 0.999), metadata={"help": "betas for Adam optimizer"} + ) + adam_eps: float = field( + default=1e-8, metadata={"help": "epsilon for Adam optimizer"} + ) + weight_decay: float = field(default=0.0, metadata={"help": "weight decay"}) + use_old_adam: bool = field( + default=False, metadata={"help": "Use fairseq.optim.adam.Adam"} + ) + # TODO common vars below in parent + tpu: bool = II("common.tpu") + lr: List[float] = II("optimization.lr") + + +@register_optimizer("adam", dataclass=FairseqAdamConfig) +class FairseqAdam(FairseqOptimizer): + """Adam optimizer for fairseq. + + Important note: this optimizer corresponds to the "AdamW" variant of + Adam in its weight decay behavior. As such, it is most closely + analogous to torch.optim.AdamW from PyTorch. + """ + + def __init__(self, cfg: FairseqAdamConfig, params): + super().__init__(cfg) + fused_adam_cls = get_fused_adam_class() + use_fused_adam = ( + not getattr(cfg, "use_old_adam", False) + and fused_adam_cls is not None + and torch.cuda.is_available() + ) + if getattr(cfg, "tpu", False): + # on TPUs we use the Adam defined here, since it + # automatically casts gradients to FP32 + self._optimizer = Adam(params, **self.optimizer_config) + elif use_fused_adam: + logger.info("using FusedAdam") + self._optimizer = fused_adam_cls(params, **self.optimizer_config) + else: + self._optimizer = Adam(params, **self.optimizer_config) + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.cfg.lr[0] + if isinstance(self.cfg.lr, Collection) + else self.cfg.lr, + "betas": eval(self.cfg.adam_betas) + if isinstance(self.cfg.adam_betas, str) + else OmegaConf.to_container(self.cfg.adam_betas), + "eps": self.cfg.adam_eps, + "weight_decay": self.cfg.weight_decay, + } + + def average_params(self): + """Reduce Params is only used during BMUF distributed training.""" + state_dict = self.optimizer.state_dict() + total_gpus = float(dist.get_world_size()) + + for _, value in state_dict["state"].items(): + value["exp_avg"] /= total_gpus + value["exp_avg_sq"] /= total_gpus + dist.all_reduce(value["exp_avg"], op=dist.ReduceOp.SUM) + dist.all_reduce(value["exp_avg_sq"], op=dist.ReduceOp.SUM) + + +class Adam(torch.optim.Optimizer): + r"""Implements Adam algorithm. + + This implementation is modified from torch.optim.Adam based on: + `Fixed Weight Decay Regularization in Adam` + (see https://arxiv.org/abs/1711.05101) + + It has been proposed in `Adam: A Method for Stochastic Optimization`_. + + Args: + params (iterable): iterable of parameters to optimize or dicts defining + parameter groups + lr (float, optional): learning rate (default: 1e-3) + betas (Tuple[float, float], optional): coefficients used for computing + running averages of gradient and its square (default: (0.9, 0.999)) + eps (float, optional): term added to the denominator to improve + numerical stability (default: 1e-8) + weight_decay (float, optional): weight decay (L2 penalty) (default: 0) + amsgrad (boolean, optional): whether to use the AMSGrad variant of this + algorithm from the paper `On the Convergence of Adam and Beyond`_ + + .. _Adam\: A Method for Stochastic Optimization: + https://arxiv.org/abs/1412.6980 + .. _On the Convergence of Adam and Beyond: + https://openreview.net/forum?id=ryQu7f-RZ + """ + + def __init__( + self, + params, + lr=1e-3, + betas=(0.9, 0.999), + eps=1e-8, + weight_decay=0, + amsgrad=False, + ): + defaults = dict( + lr=lr, betas=betas, eps=eps, weight_decay=weight_decay, amsgrad=amsgrad + ) + super(Adam, self).__init__(params, defaults) + + @property + def supports_memory_efficient_fp16(self): + return True + + @property + def supports_flat_params(self): + return True + + def step(self, closure=None): + """Performs a single optimization step. + + Args: + closure (callable, optional): A closure that reevaluates the model + and returns the loss. + """ + loss = None + if closure is not None: + loss = closure() + + for group in self.param_groups: + for p in group["params"]: + if p.grad is None: + continue + grad = p.grad.data + if grad.dtype in {torch.float16, torch.bfloat16}: + grad = grad.float() + if grad.is_sparse: + raise RuntimeError( + "Adam does not support sparse gradients, please consider SparseAdam instead" + ) + amsgrad = group.get("amsgrad", False) + + p_data_fp32 = p.data + if p.data.dtype in {torch.float16, torch.bfloat16}: + p_data_fp32 = p_data_fp32.float() + + state = self.state[p] + + # State initialization + if len(state) == 0: + state["step"] = 0 + # Exponential moving average of gradient values + state["exp_avg"] = torch.zeros_like(p_data_fp32) + # Exponential moving average of squared gradient values + state["exp_avg_sq"] = torch.zeros_like(p_data_fp32) + if amsgrad: + # Maintains max of all exp. moving avg. of sq. grad. values + state["max_exp_avg_sq"] = torch.zeros_like(p_data_fp32) + else: + state["exp_avg"] = state["exp_avg"].to(p_data_fp32) + state["exp_avg_sq"] = state["exp_avg_sq"].to(p_data_fp32) + if amsgrad: + state["max_exp_avg_sq"] = state["max_exp_avg_sq"].to( + p_data_fp32 + ) + + exp_avg, exp_avg_sq = state["exp_avg"], state["exp_avg_sq"] + if amsgrad: + max_exp_avg_sq = state["max_exp_avg_sq"] + beta1, beta2 = group["betas"] + + state["step"] += 1 + + # Decay the first and second moment running average coefficient + exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1) + exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2) + if amsgrad: + # Maintains the maximum of all 2nd moment running avg. till now + torch.max(max_exp_avg_sq, exp_avg_sq, out=max_exp_avg_sq) + # Use the max. for normalizing running avg. of gradient + denom = max_exp_avg_sq.sqrt().add_(group["eps"]) + else: + denom = exp_avg_sq.sqrt().add_(group["eps"]) + + bias_correction1 = 1 - beta1 ** state["step"] + bias_correction2 = 1 - beta2 ** state["step"] + step_size = group["lr"] * math.sqrt(bias_correction2) / bias_correction1 + + if group["weight_decay"] != 0: + p_data_fp32.add_( + p_data_fp32, alpha=-group["weight_decay"] * group["lr"] + ) + + p_data_fp32.addcdiv_(exp_avg, denom, value=-step_size) + + if p.data.dtype in {torch.float16, torch.bfloat16}: + p.data.copy_(p_data_fp32) + + return loss diff --git a/SpeechT5/fairseq/fairseq/optim/adamax.py b/SpeechT5/fairseq/fairseq/optim/adamax.py new file mode 100644 index 0000000..98ff8ad --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/adamax.py @@ -0,0 +1,172 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +import torch.optim + +from . import LegacyFairseqOptimizer, register_optimizer + + +@register_optimizer("adamax") +class FairseqAdamax(LegacyFairseqOptimizer): + def __init__(self, args, params): + super().__init__(args) + self._optimizer = Adamax(params, **self.optimizer_config) + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--adamax-betas', default='(0.9, 0.999)', metavar='B', + help='betas for Adam optimizer') + parser.add_argument('--adamax-eps', type=float, default=1e-8, metavar='D', + help='epsilon for Adam optimizer') + parser.add_argument('--weight-decay', '--wd', default=0.0, type=float, metavar='WD', + help='weight decay') + parser.add_argument('--no-bias-correction', default=False, action='store_true', + help='disable bias correction') + # fmt: on + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.args.lr[0], + "betas": eval(self.args.adamax_betas), + "eps": self.args.adamax_eps, + "weight_decay": self.args.weight_decay, + "bias_correction": not self.args.no_bias_correction, + } + + +class Adamax(torch.optim.Optimizer): + """Implements Adamax algorithm (a variant of Adam based on infinity norm). + + It has been proposed in `Adam: A Method for Stochastic Optimization`__. + + Compared to the version in PyTorch, this version implements a fix for weight decay. + + Args: + params (iterable): iterable of parameters to optimize or dicts defining + parameter groups + lr (float, optional): learning rate (default: 2e-3) + betas (Tuple[float, float], optional): coefficients used for computing + running averages of gradient and its square + eps (float, optional): term added to the denominator to improve + numerical stability (default: 1e-8) + weight_decay (float, optional): weight decay (L2 penalty) (default: 0) + bias_correction (bool, optional): enable bias correction (default: True) + + __ https://arxiv.org/abs/1412.6980 + """ + + def __init__( + self, + params, + lr=2e-3, + betas=(0.9, 0.999), + eps=1e-8, + weight_decay=0, + bias_correction=True, + ): + if not 0.0 <= lr: + raise ValueError("Invalid learning rate: {}".format(lr)) + if not 0.0 <= eps: + raise ValueError("Invalid epsilon value: {}".format(eps)) + if not 0.0 <= betas[0] < 1.0: + raise ValueError("Invalid beta parameter at index 0: {}".format(betas[0])) + if not 0.0 <= betas[1] < 1.0: + raise ValueError("Invalid beta parameter at index 1: {}".format(betas[1])) + if not 0.0 <= weight_decay: + raise ValueError("Invalid weight_decay value: {}".format(weight_decay)) + + defaults = dict( + lr=lr, + betas=betas, + eps=eps, + weight_decay=weight_decay, + bias_correction=bias_correction, + ) + super(Adamax, self).__init__(params, defaults) + + @property + def supports_memory_efficient_fp16(self): + return True + + @property + def supports_flat_params(self): + return True + + def step(self, closure=None): + """Performs a single optimization step. + + Args: + closure (callable, optional): A closure that reevaluates the model + and returns the loss. + """ + loss = None + if closure is not None: + loss = closure() + + for group in self.param_groups: + for p in group["params"]: + if p.grad is None: + continue + grad = p.grad.data.float() + if grad.is_sparse: + raise RuntimeError("Adamax does not support sparse gradients") + + p_data_fp32 = p.data + if p.data.dtype in {torch.float16, torch.bfloat16}: + p_data_fp32 = p_data_fp32.float() + + state = self.state[p] + + # State initialization + if len(state) == 0: + state["step"] = 0 + state["exp_avg"] = torch.zeros_like(p_data_fp32) + state["exp_inf"] = torch.zeros_like(p_data_fp32) + else: + state["exp_avg"] = state["exp_avg"].to(p_data_fp32) + state["exp_inf"] = state["exp_inf"].to(p_data_fp32) + + exp_avg, exp_inf = state["exp_avg"], state["exp_inf"] + beta1, beta2 = group["betas"] + eps = group["eps"] + + state["step"] += 1 + + # Update biased first moment estimate. + exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1) + + # Update the exponentially weighted infinity norm. + torch.max( + exp_inf.mul_(beta2), + grad.abs_(), + out=exp_inf, + ) + + step_size = group["lr"] + if group["bias_correction"]: + bias_correction = 1 - beta1 ** state["step"] + step_size /= bias_correction + + if group["weight_decay"] != 0: + p_data_fp32.add_( + p_data_fp32, alpha=-group["weight_decay"] * group["lr"] + ) + + p_data_fp32.addcdiv_(exp_avg, exp_inf.add(eps), value=-step_size) + + if p.data.dtype in {torch.float16, torch.bfloat16}: + p.data.copy_(p_data_fp32) + + return loss diff --git a/SpeechT5/fairseq/fairseq/optim/amp_optimizer.py b/SpeechT5/fairseq/fairseq/optim/amp_optimizer.py new file mode 100644 index 0000000..3b7958e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/amp_optimizer.py @@ -0,0 +1,105 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +import torch +from fairseq import optim +from omegaconf import DictConfig + +logger = logging.getLogger(__name__) + + +class AMPOptimizer(optim.FairseqOptimizer): + """ + Wrap an *optimizer* to support AMP (automatic mixed precision) training. + """ + + def __init__(self, cfg: DictConfig, params, fp32_optimizer, **kwargs): + super().__init__(cfg.optimizer) + self.fp32_optimizer = fp32_optimizer + amp_kwargs = {"init_scale": cfg.common.fp16_init_scale} + if getattr(cfg.common, "amp_scale_window", None) is not None: + amp_kwargs["growth_interval"] = cfg.common.amp_init_scale + self._grad_scaler = torch.cuda.amp.GradScaler(**amp_kwargs) + self.min_loss_scale = cfg.common.min_loss_scale + + @classmethod + def build_optimizer(cls, cfg: DictConfig, params, **kwargs): + """ + Args: + cfg (omegaconf.DictConfig): fairseq args + params (iterable): iterable of parameters to optimize + """ + fp32_optimizer = optim.build_optimizer(cfg.optimizer, params) + return cls(cfg, params, fp32_optimizer, **kwargs) + + def backward(self, loss): + """Computes the sum of gradients of the given tensor w.r.t. graph leaves. + + Compared to :func:`fairseq.optim.FairseqOptimizer.backward`, this + function additionally dynamically scales the loss to avoid gradient + underflow. + """ + self._grad_scaler.scale(loss).backward() + + def step(self): + self.scaler.step(self.fp32_optimizer) + self.scaler.update() + + def clip_grad_norm(self, max_norm, aggregate_norm_fn=None): + """Clips gradient norm.""" + self.scaler.unscale_(self.optimizer) + grad_norm = self.fp32_optimizer.clip_grad_norm(max_norm, aggregate_norm_fn) + if not torch.isfinite(grad_norm).all(): + new_loss_scale = self.next_loss_scale + if new_loss_scale <= self.min_loss_scale: + raise FloatingPointError( + ( + "AMP: Minimum loss scale reached ({}). Your loss is probably exploding. " + "Try restarting training or use fp32. {}" + ).format(self.min_loss_scale, new_loss_scale) + ) + else: + logger.info("AMP: overflow detected, setting scale to " + f"to {new_loss_scale}") + return grad_norm + + @property + def scaler(self): + return self._grad_scaler + + @property + def next_loss_scale(self): + return self.scaler.get_scale() * self.scaler.get_backoff_factor() + + @property + def optimizer(self): + return self.fp32_optimizer.optimizer + + @optimizer.setter + def optimizer(self, optimizer): + self.fp32_optimizer.optimizer = optimizer + + @property + def lr_scheduler(self): + return getattr(self.fp32_optimizer, "lr_scheduler", None) + + @property + def optimizer_config(self): + return self.fp32_optimizer.optimizer_config + + def get_lr(self): + return self.fp32_optimizer.get_lr() + + def set_lr(self, lr): + self.fp32_optimizer.set_lr(lr) + + def all_reduce_grads(self, module): + self.fp32_optimizer.all_reduce_grads(module) + + @property + def supports_flat_params(self): + return self.fp32_optimizer.supports_flat_params diff --git a/SpeechT5/fairseq/fairseq/optim/bmuf.py b/SpeechT5/fairseq/fairseq/optim/bmuf.py new file mode 100644 index 0000000..d6d0e04 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/bmuf.py @@ -0,0 +1,200 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +import torch +import torch.distributed as dist +from fairseq.dataclass.configs import FairseqBMUFConfig +from fairseq.dataclass.utils import gen_parser_from_dataclass +from fairseq.optim.fairseq_optimizer import FairseqOptimizer + + +class FairseqBMUF(FairseqOptimizer): + """ + Implements incremental block distributed data parallelism similar to + https://ieeexplore.ieee.org/document/7472805 + + Paper title: Scalable training of deep learning machines by incremental + block training with intra-block parallel optimization and blockwise + model-update filtering + """ + + def __init__(self, cfg: FairseqBMUFConfig, optimizer): + super().__init__(cfg) + self._optimizer = optimizer + self._num_updates = 0 + self.sync_iter = cfg.global_sync_iter + self.block_momentum = cfg.block_momentum + self.block_lr = cfg.block_lr + self._reset_local_data() + self.warmup_iteration = cfg.warmup_iterations + self.use_nbm = cfg.use_nbm + self.initial_state = self._optimizer.state_dict() + self.average_sync = self.cfg.average_sync + self.world_size = self.cfg.distributed_world_size + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + gen_parser_from_dataclass(parser, FairseqBMUFConfig()) + + @property + def optimizer(self): + return self._optimizer.optimizer + + @property + def optimizer_config(self): + return self._optimizer.optimizer_config + + def get_lr(self): + return self._optimizer.get_lr() + + def set_lr(self, lr): + self._optimizer.set_lr(lr) + + def state_dict(self): + return self._optimizer.state_dict() + + def load_state_dict(self, state_dict, optimizer_overrides=None): + self._optimizer.load_state_dict(state_dict, optimizer_overrides) + self.initial_state = self._optimizer.state_dict() + + def multiply_grads(self, c): + """Multiplies grads by a constant *c*.""" + self._optimizer.multiply_grads(c) + + def clip_grad_norm(self, max_norm, aggregate_norm_fn=None): + """Clips gradient norm.""" + return self._optimizer.clip_grad_norm(max_norm, aggregate_norm_fn) + + def average_params(self): + self._optimizer.average_params() + + def _block_sync(self): + if self.world_size <= 1: + return + # Update the global model using local models from all GPUs + # (Step-1) Calculate grad between previously synced model and + # currrent local model + if self.block_momentum != 0: + self._calc_grad() + + # (Step-2) Average gradient from all GPUs + self._avg_grad_from_all_gpus() + + # (Step-3) Calculate global momentum and update the global model + if self.block_momentum != 0: + self._update_global_model() + + # (Step-4) Average local optimizer params + if self.average_sync: + self.average_params() + + def _is_warmup_end(self): + # Check whether train iterations is equal to warmup iter + if self.get_num_updates() == self.warmup_iteration: + return True + return False + + def _is_bmuf_iter(self): + # Check whether train iterations is equal to bmuf sync iter + if (self.get_num_updates() > self.warmup_iteration) and ( + self.get_num_updates() % self.sync_iter == 0 + ): + return True + return False + + def _warmup_sync(self, root_rank=0): + if self.world_size <= 1: + return + # Broadcast the local model to all gpus + for param in self.params: + dist.broadcast(param.data, src=root_rank) + + # Update local optimizer state + if self.average_sync: + self._optimizer.average_params() + else: + self._optimizer.load_state_dict(self.initial_state) + + self._reset_local_data() + + def step(self, closure=None): + """Performs a single optimization step.""" + self._optimizer.step(closure) + self.set_num_updates(self.get_num_updates() + 1) + if self._is_warmup_end(): + self._warmup_sync() + elif self._is_bmuf_iter(): + self._block_sync() + + def zero_grad(self): + """Clears the gradients of all optimized parameters.""" + self._optimizer.zero_grad() + + def get_num_updates(self): + """Get the number of parameters updates.""" + return self._num_updates + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self._num_updates = num_updates + + @torch.no_grad() + def _reset_local_data(self): + # (Step-0) Initialize global momentum parameters and store global copy on each gpu + self.global_params = [torch.zeros_like(p.data) for p in self.params] + self.smoothed_grads = [p.data.new_zeros(p.data.size()) for p in self.params] + self.grads = [p.data.new_zeros(p.data.size()) for p in self.params] + + # saving the global model locally for calculating gradient during bmuf sync + for param, global_param in zip(self.params, self.global_params): + global_param.copy_(param.data) + + @torch.no_grad() + def _calc_grad(self): + # global_params is basically the global copy from the previously finished + # synchronisation. param.data is local parameter after block_sync_freq + # for the local gpu. so grad is difference between previously synced + # model and currrent local model. + for index, (param, global_param) in enumerate( + zip(self.params, self.global_params) + ): + self.grads[index] = global_param - param.data + + def _avg_grad_from_all_gpus(self): + for index, param in enumerate(self.params): + sync_para = param.data if self.block_momentum == 0 else self.grads[index] + sync_para /= float(dist.get_world_size()) + dist.all_reduce(sync_para, op=dist.ReduceOp.SUM) + + @torch.no_grad() + def _update_global_model(self): + for index, (param, global_param, smoothed_grad, grad) in enumerate( + zip( + self.params, + self.global_params, + self.smoothed_grads, + # all gpus would share the same value of smoothed_grad, since it is + # always computed on synchronized gradients. + self.grads, + ) + ): + # global_param is basically last syncrhornized parameter. though + # smoothed_grad is local, all processes will have same value of + # smoothed_grad and hence param is globally synchronized copy. + # smoothed_grad(t) = BM * smoothed_grad(t-1) + BM_lr * grad(t) + smoothed_grad = self.block_momentum * smoothed_grad + self.block_lr * grad + param.data.copy_(global_param - smoothed_grad) + + # A Nesterov momentum here is to do a partial weight update before + # calculating the gradient + if self.use_nbm: + param.data.copy_(param.data - self.block_momentum * smoothed_grad) + + # backup for the next synchronization. + self.smoothed_grads[index] = smoothed_grad + global_param.copy_(param.data) diff --git a/SpeechT5/fairseq/fairseq/optim/composite.py b/SpeechT5/fairseq/fairseq/optim/composite.py new file mode 100644 index 0000000..a5366d6 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/composite.py @@ -0,0 +1,188 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from collections import defaultdict +from dataclasses import dataclass, field +from typing import Dict, Any, List, Optional + +import torch.optim +from fairseq.dataclass import FairseqDataclass +from fairseq.optim import FairseqOptimizer, register_optimizer, _build_optimizer +from fairseq.optim.lr_scheduler import FairseqLRScheduler, build_lr_scheduler +from omegaconf import II, open_dict + + +logger = logging.getLogger(__name__) + + +@dataclass +class OptimizerAndSchedulerConfig(FairseqDataclass): + optimizer: Any = None + lr_scheduler: Optional[Any] = None + lr: List = II("optimization.lr") + lr_float: Optional[float] = None # this makes it easier to sweep on learning rate with auto sweepers + + +@dataclass +class CompositeOptimizerConfig(FairseqDataclass): + groups: Dict[str, Any] = field( + default_factory=lambda: {}, + metadata={ + "help": "optimizer name -> optimizer OptimizerAndSchedulerConfig. " + "Configures a different optimizer and (optionally) lr scheduler for each parameter group" + }, + ) + + +@register_optimizer("composite", dataclass=CompositeOptimizerConfig) +class FairseqCompositeOptimizer(FairseqOptimizer): + + optimizers: Dict[str, FairseqOptimizer] = {} + lr_schedulers: Dict[str, FairseqLRScheduler] = {} + lr_scheduler: FairseqLRScheduler = None + _optimizer: torch.optim.Optimizer + + def __init__(self, cfg: CompositeOptimizerConfig, params): + super().__init__(cfg) + + assert ( + len(params) > 1 + ), "Composite optimizer only works when there are multiple parameter groups (try fp16_no_flatten_grads: true)" + + groupped_params = defaultdict(list) + for p in params: + group = getattr(p, "param_group", "default") + groupped_params[group].append(p) + + assert groupped_params.keys() == cfg.groups.keys(), ( + f"Parameter groups {groupped_params.keys()} and optimizer groups {cfg.groups.keys()} are not the same! " + "Try setting 'param_group' on your parameters in the model." + ) + + for group, group_params in groupped_params.items(): + group_cfg = cfg.groups[group] + with open_dict(group_cfg): + if group_cfg.lr_float is not None: + group_cfg.optimizer.lr = [group_cfg.lr_float] + group_cfg.lr_scheduler.lr = [group_cfg.lr_float] + else: + group_cfg.optimizer.lr = group_cfg.lr + group_cfg.lr_scheduler.lr = group_cfg.lr + self.optimizers[group] = _build_optimizer(group_cfg.optimizer, group_params) + if group_cfg.lr_scheduler is not None: + self.lr_schedulers[group] = build_lr_scheduler( + group_cfg.lr_scheduler, self.optimizers[group] + ) + + if len(self.lr_schedulers) > 0: + assert len(self.lr_schedulers) == len(self.optimizers), ( + f"Please provide an lr scheduler for each optimizer to use pass_through scheduler. " + f"Optimizers: {self.optimizers}; Lr scheds: {self.lr_schedulers}" + ) + self.lr_scheduler = CompositeLRScheduler(self.lr_schedulers) + + self._optimizer = CompositeOptimizer(self.optimizers) + + @property + def supports_groups(self): + return True + + @property + def param_groups(self): + for opt in self.optimizers.values(): + for group in opt.param_groups: + yield group + + def get_lr(self): + """Return the current learning rate.""" + k = ( + "default" + if "default" in self.optimizers + else next(iter(self.optimizers.keys())) + ) + return self.optimizers[k].param_groups[0]["lr"] + + def state_dict(self): + """Return the LR scheduler state dict.""" + return {k: s.state_dict() for k, s in self.optimizers.items()} + + def load_state_dict(self, state_dict, optimizer_overrides=None): + """Load an LR scheduler state dict.""" + for k, state in state_dict.items(): + if k not in self.optimizers: + # skip extra keys like "loss_scale" added by fp16 optimizer + continue + + overrides = ( + optimizer_overrides[k] + if isinstance(optimizer_overrides, dict) and k in optimizer_overrides + else None + ) + self.optimizers[k].load_state_dict(state, optimizer_overrides=overrides) + + +class CompositeOptimizer(torch.optim.Optimizer): + def __init__(self, optimizers: Dict[str, FairseqOptimizer]): + self.optimizers = optimizers + + @property + def supports_memory_efficient_fp16(self): + return all(o.supports_memory_efficient_fp16 for o in self.optimizers.values()) + + @property + def supports_flat_params(self): + return all(o.supports_flat_params for o in self.optimizers.values()) + + def step(self, closure=None, groups=None): + """Performs a single optimization step. + + Args: + closure (callable, optional): A closure that reevaluates the model + and returns the loss. + """ + loss = None + if closure is not None: + loss = closure() + + for k, opt in self.optimizers.items(): + if groups is None or k in groups: + opt.step() + + return loss + + def zero_grad(self): + for opt in self.optimizers.values(): + opt.zero_grad() + + +class CompositeLRScheduler(FairseqLRScheduler): + def __init__(self, lr_schedulers): + super().__init__(None, None) + + self.lr_schedulers = lr_schedulers + + def state_dict(self): + """Return the LR scheduler state dict.""" + return {k: s.state_dict() for k, s in self.lr_schedulers.items()} + + def load_state_dict(self, state_dict): + """Load an LR scheduler state dict.""" + for k, state in state_dict.items(): + self.lr_schedulers[k].load_state_dict(state) + + def step_begin_epoch(self, epoch): + """Update the learning rate at the beginning of the given epoch.""" + for s in self.lr_schedulers.values(): + s.step_begin_epoch(epoch) + + def step(self, epoch, val_loss=None): + """Update the learning rate at the end of the given epoch.""" + for s in self.lr_schedulers.values(): + s.step(epoch) + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + return {k: s.step_update(num_updates) for k, s in self.lr_schedulers.items()} diff --git a/SpeechT5/fairseq/fairseq/optim/cpu_adam.py b/SpeechT5/fairseq/fairseq/optim/cpu_adam.py new file mode 100644 index 0000000..e36bccf --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/cpu_adam.py @@ -0,0 +1,200 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +from collections.abc import Collection +from dataclasses import dataclass, field +from typing import List + +import torch +from fairseq.dataclass import FairseqDataclass +from fairseq.optim import FairseqOptimizer, register_optimizer +from omegaconf import II, DictConfig + + +try: + import deepspeed + has_deepspeed = True +except ImportError as e: + has_deepspeed = False + + +def _get_cpu_adam(): + try: + from deepspeed.ops.op_builder import CPUAdamBuilder + return CPUAdamBuilder().load() + except ImportError: + # fbcode + from deepspeed.ops.adam import DeepSpeedCPUAdam as ds_opt_adam + return ds_opt_adam + +@dataclass +class FairseqCPUAdamConfig(FairseqDataclass): + adam_betas: str = field( + default="(0.9, 0.999)", metadata={"help": "betas for Adam optimizer"} + ) + adam_eps: float = field( + default=1e-8, metadata={"help": "epsilon for Adam optimizer"} + ) + weight_decay: float = field(default=0.0, metadata={"help": "weight decay"}) + fp16_adam_stats: bool = field( + default=False, metadata={"help": "use FP16 stats (with automatic scaling)"} + ) + # TODO common vars below in parent + lr: List[float] = II("optimization.lr") + + +@register_optimizer("cpu_adam", dataclass=FairseqCPUAdamConfig) +class FairseqCPUAdam(FairseqOptimizer): + """Adam optimizer for fairseq, optimized for CPU tensors. + + Important note: this optimizer corresponds to the "AdamW" variant of + Adam in its weight decay behavior. As such, it is most closely + analogous to torch.optim.AdamW from PyTorch. + """ + + def __init__(self, cfg: DictConfig, params): + super().__init__(cfg) + self._optimizer = CPUAdam(params, **self.optimizer_config) + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.cfg.lr[0] + if isinstance(self.cfg.lr, Collection) + else self.cfg.lr, + "betas": eval(self.cfg.adam_betas), + "eps": self.cfg.adam_eps, + "weight_decay": self.cfg.weight_decay, + "use_fp16_stats": self.cfg.fp16_adam_stats, + } + + +class CPUAdam(torch.optim.Optimizer): + + optimizer_id = 0 + + def __init__( + self, + params, + lr=1e-3, + bias_correction=True, + betas=(0.9, 0.999), + eps=1e-8, + weight_decay=0, + use_fp16_stats=False, + ): + defaults = { + "lr": lr, + "bias_correction": bias_correction, + "betas": betas, + "eps": eps, + "weight_decay": weight_decay, + } + super().__init__(params, defaults) + + self.use_fp16_stats = use_fp16_stats + self.FLOAT16_MAX = 65504.0 + + if not has_deepspeed: + raise ImportError("Please install DeepSpeed: pip install deepspeed") + + self.opt_id = CPUAdam.optimizer_id + CPUAdam.optimizer_id = CPUAdam.optimizer_id + 1 + + self.ds_opt_adam = _get_cpu_adam() + adamw_mode = True + self.ds_opt_adam.create_adam( + self.opt_id, lr, betas[0], betas[1], eps, weight_decay, adamw_mode + ) + + @property + def supports_flat_params(self): + return True + + @torch.no_grad() + def step(self, closure=None): + loss = None + if closure is not None: + with torch.enable_grad(): + loss = closure() + + for group_id, group in enumerate(self.param_groups): + for param_id, p in enumerate(group["params"]): + if p.grad is None: + continue + + state = self.state[p] + if len(state) == 0: + state["step"] = 0 + dtype = torch.float16 if self.use_fp16_stats else p.data.dtype + # gradient momentums + state["exp_avg"] = torch.zeros_like( + p.data, dtype=dtype, device="cpu" + ) + # gradient variances + state["exp_avg_sq"] = torch.zeros_like( + p.data, dtype=dtype, device="cpu" + ) + if self.use_fp16_stats: + assert torch.is_floating_point(p.data) + state["exp_avg_scale"] = 1.0 + state["exp_avg_sq_scale"] = 1.0 + + exp_avg, exp_avg_sq = state["exp_avg"], state["exp_avg_sq"] + + p_data_bak = p.data # backup of the original data pointer + + p.data = p.data.to(dtype=torch.float32, device="cpu") + p.grad.data = p.grad.data.to(dtype=torch.float32, device="cpu") + + if self.use_fp16_stats: + exp_avg = exp_avg.float() * state["exp_avg_scale"] + exp_avg_sq = exp_avg_sq.float() * state["exp_avg_sq_scale"] + + state["step"] += 1 + beta1, beta2 = group["betas"] + + self.ds_opt_adam.adam_update( + self.opt_id, + state["step"], + group["lr"], + beta1, + beta2, + group["eps"], + group["weight_decay"], + group["bias_correction"], + p.data, + p.grad.data, + exp_avg, + exp_avg_sq, + ) + + if p_data_bak.data_ptr() != p.data.data_ptr(): + p_data_bak.copy_(p.data) + p.data = p_data_bak + + if self.use_fp16_stats: + + def inf_norm(t): + return torch.norm(t, float("inf")) + + # from github.com/openai/jukebox/blob/master/jukebox/utils/fp16.py + state["exp_avg_scale"], state["exp_avg_sq_scale"] = ( + 1e-8 + inf_norm(exp_avg) / self.FLOAT16_MAX, + 1e-8 + inf_norm(exp_avg_sq) / self.FLOAT16_MAX, + ) + state["exp_avg"], state["exp_avg_sq"] = ( + (exp_avg / state["exp_avg_scale"]).half(), + (exp_avg_sq / state["exp_avg_sq_scale"]).half(), + ) + + return loss diff --git a/SpeechT5/fairseq/fairseq/optim/dynamic_loss_scaler.py b/SpeechT5/fairseq/fairseq/optim/dynamic_loss_scaler.py new file mode 100644 index 0000000..43f9be3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/dynamic_loss_scaler.py @@ -0,0 +1,70 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +class DynamicLossScaler(object): + def __init__( + self, + init_scale=2.0 ** 15, + scale_factor=2.0, + scale_window=2000, + tolerance=0.0, + threshold=None, + min_loss_scale=1e-4, + ): + self.loss_scale = init_scale + self.scale_factor = scale_factor + self.scale_window = scale_window + self.tolerance = tolerance + self.threshold = threshold + self._iter = 0 + self._last_overflow_iter = -1 + self._last_rescale_iter = -1 + self._overflows_since_rescale = 0 + self.min_loss_scale = min_loss_scale + + def scale(self, outputs): + return self.loss_scale * outputs + + def update(self): + if (self._iter - self._last_overflow_iter) % self.scale_window == 0: + self.loss_scale *= self.scale_factor + self._last_rescale_iter = self._iter + self._iter += 1 + + def _decrease_loss_scale(self): + self.loss_scale /= self.scale_factor + if self.threshold is not None: + self.loss_scale = max(self.loss_scale, self.threshold) + + def check_overflow(self, grad_norm): + # detect inf and nan + if grad_norm == float("inf") or grad_norm != grad_norm: + # overflow has occured + prev_scale = self.loss_scale + iter_since_rescale = self._iter - self._last_rescale_iter + + self._last_overflow_iter = self._iter + self._overflows_since_rescale += 1 + pct_overflow = self._overflows_since_rescale / float(iter_since_rescale) + if pct_overflow >= self.tolerance: + self._decrease_loss_scale() + self._last_rescale_iter = self._iter + self._overflows_since_rescale = 0 + + if self.loss_scale <= self.min_loss_scale: + # Use FloatingPointError as an uncommon error that parent + # functions can safely catch to stop training. + self.loss_scale = prev_scale + raise FloatingPointError( + ( + "Minimum loss scale reached ({}). Your loss is probably exploding. " + "Try lowering the learning rate, using gradient clipping or " + "increasing the batch size." + ).format(self.min_loss_scale) + ) + + self._iter += 1 + raise OverflowError("setting loss scale to: " + str(self.loss_scale)) diff --git a/SpeechT5/fairseq/fairseq/optim/fairseq_optimizer.py b/SpeechT5/fairseq/fairseq/optim/fairseq_optimizer.py new file mode 100644 index 0000000..7e54117 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/fairseq_optimizer.py @@ -0,0 +1,179 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq import utils +from fairseq.dataclass.utils import gen_parser_from_dataclass + + +class FairseqOptimizer(object): + def __init__(self, cfg): + super().__init__() + self.cfg = cfg + + @classmethod + def add_args(cls, parser): + """Add optimizer-specific arguments to the parser.""" + dc = getattr(cls, "__dataclass", None) + if dc is not None: + gen_parser_from_dataclass(parser, dc()) + + @property + def optimizer(self): + """Return a torch.optim.optimizer.Optimizer instance.""" + if not hasattr(self, "_optimizer"): + raise NotImplementedError + if not isinstance(self._optimizer, torch.optim.Optimizer): + raise ValueError("_optimizer must be an instance of torch.optim.Optimizer") + return self._optimizer + + @optimizer.setter + def optimizer(self, optimizer): + """Reset optimizer instance.""" + if not hasattr(self, "_optimizer"): + raise NotImplementedError + if not isinstance(self._optimizer, torch.optim.Optimizer): + raise ValueError("_optimizer must be an instance of torch.optim.Optimizer") + self._optimizer = optimizer + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + raise NotImplementedError + + @property + def params(self): + """Return an iterable of the parameters held by the optimizer.""" + for param_group in self.param_groups: + for p in param_group["params"]: + yield p + + @property + def param_groups(self): + return self.optimizer.param_groups + + def __getstate__(self): + return self._optimizer.__getstate__() + + def get_lr(self): + """Return the current learning rate.""" + return self.param_groups[0]["lr"] + + def set_lr(self, lr): + """Set the learning rate.""" + for param_group in self.param_groups: + param_group["lr"] = lr + + def state_dict(self): + """Return the optimizer's state dict.""" + return self.optimizer.state_dict() + + def load_state_dict(self, state_dict, optimizer_overrides=None): + """Load an optimizer state dict. + + In general we should prefer the configuration of the existing optimizer + instance (e.g., learning rate) over that found in the state_dict. This + allows us to resume training from a checkpoint using a new set of + optimizer args. + """ + self.optimizer.load_state_dict(state_dict) + + if optimizer_overrides is not None and len(optimizer_overrides) > 0: + # override learning rate, momentum, etc. with latest values + for group in self.param_groups: + group.update(optimizer_overrides) + + def backward(self, loss): + """Computes the sum of gradients of the given tensor w.r.t. graph leaves.""" + loss.backward() + + def all_reduce_grads(self, module): + """Manually all-reduce gradients (if required).""" + if hasattr(module, "all_reduce_grads"): + module.all_reduce_grads() + + def multiply_grads(self, c): + """Multiplies grads by a constant *c*.""" + for p in self.params: + if p.grad is not None: + if torch.is_tensor(c): + c = c.to(p.grad.device) + p.grad.data.mul_(c) + + def clip_grad_norm(self, max_norm, aggregate_norm_fn=None): + """Clips gradient norm.""" + return utils.clip_grad_norm_(self.params, max_norm, aggregate_norm_fn) + + def step(self, closure=None, scale=1.0, groups=None): + """Performs a single optimization step.""" + if self.supports_step_with_scale: + if self.supports_groups: + self.optimizer.step(closure, scale=scale, groups=groups) + else: + self.optimizer.step(closure, scale=scale) + else: + if scale != 1.0: + self.multiply_grads(1.0 / scale) + if self.supports_groups: + self.optimizer.step(closure, groups=groups) + else: + self.optimizer.step(closure) + + def zero_grad(self): + """Clears the gradients of all optimized parameters.""" + for p in self.params: + p.grad = None + self.optimizer.zero_grad() + + @property + def supports_memory_efficient_fp16(self): + if hasattr(self.optimizer, "supports_memory_efficient_fp16"): + return self.optimizer.supports_memory_efficient_fp16 + return False + + @property + def supports_step_with_scale(self): + if hasattr(self.optimizer, "supports_step_with_scale"): + return self.optimizer.supports_step_with_scale + return False + + @property + def supports_groups(self): + if hasattr(self.optimizer, "supports_groups"): + return self.optimizer.supports_groups + return False + + @property + def supports_flat_params(self): + """ + Whether the optimizer supports collapsing of the model + parameters/gradients into a single contiguous Tensor. + """ + if hasattr(self.optimizer, "supports_flat_params"): + return self.optimizer.supports_flat_params + return False + + def average_params(self): + pass + + def broadcast_global_state_dict(self, state_dict): + """ + Broadcasts a global state dict to all ranks. + Useful for optimizers that shard state between ranks. + """ + if hasattr(self.optimizer, "broadcast_global_state_dict"): + return self.optimizer.broadcast_global_state_dict(state_dict) + else: + return state_dict + + +class LegacyFairseqOptimizer(FairseqOptimizer): + def __init__(self, args): + self.args = args diff --git a/SpeechT5/fairseq/fairseq/optim/fp16_optimizer.py b/SpeechT5/fairseq/fairseq/optim/fp16_optimizer.py new file mode 100644 index 0000000..370a910 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/fp16_optimizer.py @@ -0,0 +1,546 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections import defaultdict +from itertools import chain + +import torch +from fairseq import optim +from omegaconf import DictConfig + +from .dynamic_loss_scaler import DynamicLossScaler + + +class _FP16OptimizerMixin(object): + def __init__(self, *args, **kwargs): + # forward __init__ call to the next class in mro(method resolution order) + super().__init__(*args, **kwargs) + self._multiply_factor = 1.0 + + @property + def has_flat_params(self): + return torch.is_tensor(self.fp32_params) or ( + isinstance(self.fp32_params, dict) + and all(torch.is_tensor(t) for t in self.fp32_params.values()) + ) + + @classmethod + def build_fp32_params(cls, args, params, flatten=True): + # create FP32 copy of parameters and grads + if flatten: + is_pipeline_parallel = getattr( + args, "pipeline_model_parallel", False + ) and getattr(args, "distributed_no_spawn", False) + total_param_size = sum(p.data.numel() for p in params) + devices = [torch.cuda.current_device()] + if is_pipeline_parallel: + devices = list(set(args.pipeline_devices)) + fp32_params = {} + for device in devices: + if is_pipeline_parallel: + device_param_size = sum( + p.data.numel() for p in params if p.device.index == device + ) + device_params = [p for p in params if p.device.index == device] + else: + device_param_size = total_param_size + device_params = params + fp32_params[device] = ( + device_params[0].new(0).float().new(device_param_size) + ) + offset = 0 + for p in device_params: + numel = p.data.numel() + fp32_params[device][offset : offset + numel].copy_(p.data.view(-1)) + offset += numel + fp32_params[device] = torch.nn.Parameter(fp32_params[device]) + fp32_params[device].grad = fp32_params[device].data.new( + device_param_size + ) + return fp32_params + else: + fp32_params = [] + for p in params: + p32 = torch.nn.Parameter(p.data.float()) + if hasattr(p, 'expert'): + p32.expert = True + p32.grad = torch.zeros_like(p32.data) + if hasattr(p, "param_group"): + p32.param_group = p.param_group + fp32_params.append(p32) + return fp32_params + + def state_dict(self): + """Return the optimizer's state dict.""" + state_dict = self.fp32_optimizer.state_dict() + if self.scaler is not None: + state_dict["loss_scale"] = self.scaler.loss_scale + return state_dict + + def load_state_dict(self, state_dict, optimizer_overrides=None): + """Load an optimizer state dict. + + In general we should prefer the configuration of the existing optimizer + instance (e.g., learning rate) over that found in the state_dict. This + allows us to resume training from a checkpoint using a new set of + optimizer args. + """ + if "loss_scale" in state_dict and self.scaler is not None: + self.scaler.loss_scale = state_dict["loss_scale"] + self.fp32_optimizer.load_state_dict(state_dict, optimizer_overrides) + + def backward(self, loss): + """Computes the sum of gradients of the given tensor w.r.t. graph leaves. + + Compared to :func:`fairseq.optim.FairseqOptimizer.backward`, this + function additionally dynamically scales the loss to avoid gradient + underflow. + """ + if self.scaler is not None: + loss = self.scaler.scale(loss) + loss.backward() + self._needs_sync = True + + def _sync_fp16_grads_to_fp32(self): + if self._needs_sync: + # copy FP16 grads to FP32 + if self.has_flat_params: + devices = list(self.fp32_params.keys()) + device_params_dict = defaultdict(list) + for p in self.fp16_params: + if p.requires_grad: + device_params_dict[p.device.index].append(p) + for device in devices: + device_params = device_params_dict[device] + offset = 0 + for p in device_params: + grad_data = ( + p.grad.data + if p.grad is not None + else p.data.new_zeros(p.data.shape) + ) + numel = grad_data.numel() + self.fp32_params[device].grad.data[ + offset : offset + numel + ].copy_(grad_data.view(-1)) + offset += numel + else: + for p, p32 in zip(self.fp16_params, self.fp32_params): + if not p.requires_grad: + continue + if p.grad is not None: + if p32.grad is None: + p32.grad = p.grad.data.float() + else: + p32.grad.data.copy_(p.grad.data) + else: + p32.grad = torch.zeros_like(p.data, dtype=torch.float) + + self._needs_sync = False + + def _sync_fp32_params_to_fp16(self): + # copy FP32 params back into FP16 model + if self.has_flat_params: + devices = list(self.fp32_params.keys()) + device_params_dict = defaultdict(list) + for p in self.fp16_params: + device_params_dict[p.device.index].append(p) + for device in devices: + device_params = device_params_dict[device] + offset = 0 + for p in device_params: + numel = p.data.numel() + p.data.copy_( + self.fp32_params[device] + .data[offset : offset + numel] + .view_as(p.data) + ) + offset += numel + else: + for p, p32 in zip(self.fp16_params, self.fp32_params): + if not p.requires_grad: + continue + p.data.copy_(p32.data) + + def _unscale_grads(self): + self._sync_fp16_grads_to_fp32() + if ( + # Skip the multiplication if it's a no-op (i.e., if _multiply_factor + # is 1.0). At the same time, we want to avoid the device-to-host + # transfer by comparing it to 1.0. Since _multiply_factor starts as + # a Python float, we roughly assume that if it's a tensor then it's + # probably not =1.0 anymore and we do the multiplication. Otherwise + # we can safely check the value without a D2H transfer. + torch.is_tensor(self._multiply_factor) + or self._multiply_factor != 1.0 + ): + self.fp32_optimizer.multiply_grads(self._multiply_factor) + self._multiply_factor = 1.0 + + def multiply_grads(self, c): + """Multiplies grads by a constant ``c``.""" + self._multiply_factor *= c + + def clip_grad_norm(self, max_norm, aggregate_norm_fn=None): + """Clips gradient norm and updates dynamic loss scaler.""" + self._sync_fp16_grads_to_fp32() + + grad_norm = self._multiply_factor * self.fp32_optimizer.clip_grad_norm( + 0, aggregate_norm_fn + ) + + if self.scaler is not None: + if grad_norm > max_norm > 0.0: + self._multiply_factor *= max_norm / grad_norm + + self.scaler.check_overflow(grad_norm) + elif max_norm > 0.0: + clip_coef = (max_norm / (grad_norm + 1e-6)).clamp_(max=1) + self._multiply_factor *= clip_coef + + return grad_norm + + def step(self, closure=None, groups=None): + """Performs a single optimization step.""" + self._sync_fp16_grads_to_fp32() + + if getattr(self, "supports_step_with_scale", False): + self.fp32_optimizer.step(closure, scale=(1.0 / self._multiply_factor), groups=groups) + else: + self._unscale_grads() + self.fp32_optimizer.step(closure, groups=groups) + + if self.scaler is not None: + self.scaler.update() + + self._sync_fp32_params_to_fp16() + + def zero_grad(self): + """Clears the gradients of all optimized parameters.""" + for p in self.fp16_params: + p.grad = None + if self.has_flat_params: + if torch.is_tensor(self.fp32_params): + self.fp32_params.grad.zero_() + elif isinstance(self.fp32_params, dict): + for fp32_params in self.fp32_params.values(): + fp32_params.grad.zero_() + else: + raise RuntimeError("self.fp32_params must be a tensor or dict") + else: + for p32 in self.fp32_params: + if p32.grad is not None: + p32.grad.zero_() + self._needs_sync = False + + if self.scaler is not None: + self._multiply_factor = 1.0 / float(self.scaler.loss_scale) + + +class FP16Optimizer(_FP16OptimizerMixin, optim.FairseqOptimizer): + """ + Wrap an *optimizer* to support FP16 (mixed precision) training. + """ + + def __init__(self, cfg: DictConfig, params, fp32_optimizer, fp32_params, **kwargs): + super().__init__(cfg.optimizer) + self.fp16_params = params + self.fp32_optimizer = fp32_optimizer + self.fp32_params = fp32_params + + if getattr(cfg.common, "fp16_scale_window", None) is None: + if len(cfg.optimization.update_freq) > 1: + raise ValueError( + "--fp16-scale-window must be given explicitly when using a " + "custom --update-freq schedule" + ) + data_parallel_size = int( + cfg.distributed_training.distributed_world_size + / cfg.common.model_parallel_size + ) + scale_window = int( + 2 ** 14 / data_parallel_size / cfg.optimization.update_freq[0] + ) + else: + scale_window = cfg.common.fp16_scale_window + + if not getattr(cfg.common, "bf16", False): + self.scaler = DynamicLossScaler( + init_scale=cfg.common.fp16_init_scale, + scale_window=scale_window, + tolerance=cfg.common.fp16_scale_tolerance, + threshold=cfg.common.threshold_loss_scale, + min_loss_scale=cfg.common.min_loss_scale, + ) + else: + # disable loss scaling for bfloat16 + self.scaler = None + + @classmethod + def build_optimizer(cls, cfg: DictConfig, params, **kwargs): + """ + Args: + cfg (omegaconf.DictConfig): fairseq args + params (iterable): iterable of parameters to optimize + """ + flatten = not getattr(cfg.common, "fp16_no_flatten_grads", False) + if getattr(cfg.common, "bf16", False): + flatten = False # mixed precision is faster on TPUs without flat grads + fp32_params = cls.build_fp32_params(cfg.optimizer, params, flatten=flatten) + if flatten: + fp32_optimizer = optim.build_optimizer(cfg.optimizer, [fp32_params]) + else: + fp32_optimizer = optim.build_optimizer(cfg.optimizer, fp32_params) + if flatten and not fp32_optimizer.supports_flat_params: + raise RuntimeError( + f"chosen optimizer {fp32_optimizer.__class__.__name__} does not support flat params, please set --fp16-no-flatten-grads" + ) + return cls(cfg, params, fp32_optimizer, fp32_params, **kwargs) + + @property + def optimizer(self): + return self.fp32_optimizer.optimizer + + @optimizer.setter + def optimizer(self, optimizer): + self.fp32_optimizer.optimizer = optimizer + + @property + def lr_scheduler(self): + return getattr(self.fp32_optimizer, "lr_scheduler", None) + + @property + def optimizer_config(self): + return self.fp32_optimizer.optimizer_config + + def get_lr(self): + return self.fp32_optimizer.get_lr() + + def set_lr(self, lr): + self.fp32_optimizer.set_lr(lr) + + def all_reduce_grads(self, module): + self.fp32_optimizer.all_reduce_grads(module) + + @property + def supports_flat_params(self): + return self.fp32_optimizer.supports_flat_params + + +class _MemoryEfficientFP16OptimizerMixin(object): + def __init__(self, *args, **kwargs): + # forward __init__ call to the next class in MRO (method resolution order) + super().__init__(*args, **kwargs) + self._multiply_factor = 1.0 + + @property + def has_flat_params(self): + return False + + def state_dict(self): + """Return the optimizer's state dict.""" + state_dict = self.wrapped_optimizer.state_dict() + if self.scaler is not None: + state_dict["loss_scale"] = self.scaler.loss_scale + return state_dict + + def load_state_dict(self, state_dict, optimizer_overrides=None): + """Load an optimizer state dict. + + In general we should prefer the configuration of the existing optimizer + instance (e.g., learning rate) over that found in the state_dict. This + allows us to resume training from a checkpoint using a new set of + optimizer args. + """ + if "loss_scale" in state_dict and self.scaler is not None: + self.scaler.loss_scale = state_dict["loss_scale"] + + self.wrapped_optimizer.load_state_dict(state_dict, optimizer_overrides) + + # Hack: PyTorch automatically casts the optimizer state to match the + # type of the current parameters. But with --memory-efficient-fp16 the + # params are FP16 while the optimizer state is FP32 and we don't want + # to cast. A workaround is to manually copy back the original state + # after the optimizer has been loaded. + if not getattr(self.optimizer, "disable_mem_eff_fp16_loading_hack", False): + groups = self.optimizer.param_groups + saved_groups = state_dict["param_groups"] + id_map = { + old_id: p + for old_id, p in zip( + chain(*(g["params"] for g in saved_groups)), + chain(*(g["params"] for g in groups)), + ) + } + for k, v in state_dict["state"].items(): + if k in id_map: + param = id_map[k] + self.optimizer.state[param] = v + + def backward(self, loss): + """Computes the sum of gradients of the given tensor w.r.t. graph leaves. + + Compared to :func:`fairseq.optim.FairseqOptimizer.backward`, this + function additionally dynamically scales the loss to avoid gradient + underflow. + """ + if self.scaler is not None: + loss = self.scaler.scale(loss) + loss.backward() + + def _unscale_grads(self): + if ( + # Skip the multiplication if it's a no-op (i.e., if _multiply_factor + # is 1.0). At the same time, we want to avoid the device-to-host + # transfer by comparing it to 1.0. Since _multiply_factor starts as + # a Python float, we roughly assume that if it's a tensor then it's + # probably not =1.0 anymore and we do the multiplication. Otherwise + # we can safely check the value without a D2H transfer. + torch.is_tensor(self._multiply_factor) + or self._multiply_factor != 1.0 + ): + self.wrapped_optimizer.multiply_grads(self._multiply_factor) + self._multiply_factor = 1.0 + + def multiply_grads(self, c): + """Multiplies grads by a constant *c*.""" + self._multiply_factor *= c + + def clip_grad_norm(self, max_norm, aggregate_norm_fn=None): + """Clips gradient norm and updates dynamic loss scaler.""" + max_norm = float(max_norm) + grad_norm = self._multiply_factor * self.wrapped_optimizer.clip_grad_norm( + 0, aggregate_norm_fn + ) + + if self.scaler is not None: + grad_norm_cpu = float(grad_norm) + if grad_norm_cpu > max_norm > 0.0: + self._multiply_factor *= max_norm / grad_norm_cpu + + # detect overflow and adjust loss scale + self.scaler.check_overflow(grad_norm_cpu) + elif max_norm > 0.0: + clip_coef = (max_norm / (grad_norm + 1e-6)).clamp_(max=1) + self._multiply_factor *= clip_coef + + return grad_norm + + def step(self, closure=None, groups=None): + """Performs a single optimization step.""" + if getattr(self, "supports_step_with_scale", False): + # NOTE(msb) optimizer divides by scale factor + self.wrapped_optimizer.step(closure, scale=(1.0 / self._multiply_factor), groups=groups) + else: + self._unscale_grads() + self.wrapped_optimizer.step(closure, groups=groups) + + if self.scaler is not None: + self.scaler.update() + + def zero_grad(self): + """Clears the gradients of all optimized parameters.""" + self.wrapped_optimizer.zero_grad() + if self.scaler is not None: + self._multiply_factor = 1.0 / float(self.scaler.loss_scale) + else: + self._multiply_factor = 1.0 + + @property + def supports_flat_params(self): + return self.wrapped_optimizer.supports_flat_params + + +class MemoryEfficientFP16Optimizer( + _MemoryEfficientFP16OptimizerMixin, optim.FairseqOptimizer +): + """ + Wrap an *optimizer* to support FP16 (mixed precision) training. + + Compared to :class:`fairseq.optim.FP16Optimizer`, this version does not + maintain an FP32 copy of the model. We instead expect the optimizer to + convert the gradients to FP32 internally and sync the results back to the + FP16 model params. This significantly reduces memory usage but slightly + increases the time spent in the optimizer. + + Since this wrapper depends on specific functionality in the wrapped + optimizer (i.e., on-the-fly conversion of grads to FP32), only certain + optimizers can be wrapped. This is determined by the + *supports_memory_efficient_fp16* property. + """ + + def __init__( + self, cfg: DictConfig, params, optimizer, allow_unsupported=False, **kwargs + ): + if not allow_unsupported and not optimizer.supports_memory_efficient_fp16: + raise ValueError( + "Unsupported optimizer: {}".format(optimizer.__class__.__name__) + ) + + super().__init__(cfg.optimizer) + self.wrapped_optimizer = optimizer + + if getattr(cfg.common, "fp16_scale_window", None) is None: + if len(cfg.optimization.update_freq) > 1: + raise ValueError( + "--fp16-scale-window must be given explicitly when using a " + "custom --update-freq schedule" + ) + data_parallel_size = int( + cfg.distributed_training.distributed_world_size + / cfg.common.model_parallel_size + ) + scale_window = int( + 2 ** 14 / data_parallel_size / cfg.optimization.update_freq[0] + ) + else: + scale_window = cfg.common.fp16_scale_window + + if not getattr(cfg.common, "bf16", False): + self.scaler = DynamicLossScaler( + init_scale=cfg.common.fp16_init_scale, + scale_window=scale_window, + tolerance=cfg.common.fp16_scale_tolerance, + threshold=cfg.common.threshold_loss_scale, + min_loss_scale=cfg.common.min_loss_scale, + ) + else: + # disable loss scaling for bfloat16 + self.scaler = None + + @classmethod + def build_optimizer(cls, cfg: DictConfig, params, **kwargs): + """ + Args: + args (argparse.Namespace): fairseq args + params (iterable): iterable of parameters to optimize + """ + fp16_optimizer = optim.build_optimizer(cfg.optimizer, params) + return cls(cfg, params, fp16_optimizer, **kwargs) + + @property + def optimizer(self): + return self.wrapped_optimizer.optimizer + + @optimizer.setter + def optimizer(self, optimizer): + self.wrapped_optimizer.optimizer = optimizer + + @property + def optimizer_config(self): + return self.wrapped_optimizer.optimizer_config + + @property + def lr_scheduler(self): + return getattr(self.wrapped_optimizer, "lr_scheduler", None) + + def get_lr(self): + return self.wrapped_optimizer.get_lr() + + def set_lr(self, lr): + self.wrapped_optimizer.set_lr(lr) + + def all_reduce_grads(self, module): + self.wrapped_optimizer.all_reduce_grads(module) diff --git a/SpeechT5/fairseq/fairseq/optim/fused_adam.py b/SpeechT5/fairseq/fairseq/optim/fused_adam.py new file mode 100644 index 0000000..e2b8e1b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/fused_adam.py @@ -0,0 +1,348 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import types + +import torch + + +def get_fused_adam_class(): + """ + Look for the FusedAdam optimizer from apex. We first try to load the + "contrib" interface, which is a bit faster than the main interface, + but is technically deprecated. + """ + try: + # The "deprecated" interface in recent versions of apex is a bit + # faster than the main interface, since we don't use the apex + # optimizer. This can be installed by passing the + # `--deprecated_fused_adam` option when building apex. + global fused_adam_cuda + import importlib + + fused_adam_cuda = importlib.import_module("fused_adam_cuda") + return FusedAdamV1 + except ImportError: + try: + # fallback to the newer interface + from apex.optimizers import FusedAdam as _FusedAdam # noqa + from apex.multi_tensor_apply import multi_tensor_applier + + if multi_tensor_applier.available: + return FusedAdamV2 + except ImportError: + pass + return None + + +class FusedAdamV1(torch.optim.Optimizer): + """ + Implements Adam algorithm. Currently GPU-only. Requires Apex to be installed via + ``python setup.py install --cuda_ext --cpp_ext``. + + It has been proposed in `Adam: A Method for Stochastic Optimization`_. + + Compared to the original version in Apex, the fairseq version casts grads + and params to FP32 internally to support ``--memory-efficient-fp16``. + + Args: + params (iterable): iterable of parameters to optimize or dicts defining + parameter groups. + lr (float, optional): learning rate. (default: 1e-3) + betas (Tuple[float, float], optional): coefficients used for computing + running averages of gradient and its square. (default: (0.9, 0.999)) + eps (float, optional): term added to the denominator to improve + numerical stability. (default: 1e-8) + weight_decay (float, optional): weight decay (L2 penalty) (default: 0) + amsgrad (boolean, optional): whether to use the AMSGrad variant of this + algorithm from the paper `On the Convergence of Adam and Beyond`_ + (default: False) NOT SUPPORTED in FusedAdam! + eps_inside_sqrt (boolean, optional): in the 'update parameters' step, + adds eps to the bias-corrected second moment estimate before + evaluating square root instead of adding it to the square root of + second moment estimate as in the original paper. (default: False) + .. _Adam: A Method for Stochastic Optimization: + https://arxiv.org/abs/1412.6980 + .. _On the Convergence of Adam and Beyond: + https://openreview.net/forum?id=ryQu7f-RZ + """ + + def __init__( + self, + params, + lr=1e-3, + bias_correction=True, + betas=(0.9, 0.999), + eps=1e-8, + eps_inside_sqrt=False, + weight_decay=0.0, + max_grad_norm=0.0, + amsgrad=False, + ): + global fused_adam_cuda + import importlib + + fused_adam_cuda = importlib.import_module("fused_adam_cuda") + + if amsgrad: + raise RuntimeError("FusedAdam does not support the AMSGrad variant.") + defaults = { + "lr": lr, + "bias_correction": bias_correction, + "betas": betas, + "eps": eps, + "weight_decay": weight_decay, + "max_grad_norm": max_grad_norm, + } + super().__init__(params, defaults) + self.eps_mode = 0 if eps_inside_sqrt else 1 + + @property + def supports_memory_efficient_fp16(self): + return True + + @property + def supports_flat_params(self): + return True + + @property + def supports_step_with_scale(self): + return True + + def step(self, closure=None, grads=None, scale=1.0, grad_norms=None): + """Performs a single optimization step. + Args: + closure (callable, optional): A closure that reevaluates the model + and returns the loss. + grads (list of tensors, optional): weight gradient to use for the + optimizer update. If gradients have type torch.half, parameters + are expected to be in type torch.float. (default: None) + output params (list of tensors, optional): A reduced precision copy + of the updated weights written out in addition to the regular + updated weights. Have to be of same type as gradients. (default: None) + scale (float, optional): factor to divide gradient tensor values + by before applying to weights. (default: 1) + """ + loss = None + if closure is not None: + loss = closure() + + if grads is None: + grads_group = [None] * len(self.param_groups) + # backward compatibility + # assuming a list/generator of parameter means single group + elif isinstance(grads, types.GeneratorType): + grads_group = [grads] + elif type(grads[0]) != list: + grads_group = [grads] + else: + grads_group = grads + + if grad_norms is None: + grad_norms = [None] * len(self.param_groups) + + for group, grads_this_group, grad_norm in zip( + self.param_groups, grads_group, grad_norms + ): + if grads_this_group is None: + grads_this_group = [None] * len(group["params"]) + + # compute combined scale factor for this group + combined_scale = scale + if group.get("max_grad_norm", 0) > 0: + # norm is in fact norm*scale + clip = ((grad_norm / scale) + 1e-6) / group["max_grad_norm"] + if clip > 1: + combined_scale = clip * scale + + bias_correction = 1 if group.get("bias_correction", 1) else 0 + + for p, grad in zip(group["params"], grads_this_group): + # note: p.grad should not ever be set for correct + # operation of mixed precision optimizer that sometimes + # sends None gradients + if p.grad is None and grad is None: + continue + if grad is None: + grad = p.grad.data + if grad.is_sparse: + raise RuntimeError( + "FusedAdam does not support sparse gradients, " + "please consider SparseAdam instead" + ) + + p_data_fp32 = p.data.float() + + state = self.state[p] + + # State initialization + if len(state) == 0: + state["step"] = 0 + # Exponential moving average of gradient values + state["exp_avg"] = torch.zeros_like(p_data_fp32) + # Exponential moving average of squared gradient values + state["exp_avg_sq"] = torch.zeros_like(p_data_fp32) + else: + state["exp_avg"] = state["exp_avg"].to(p_data_fp32) + state["exp_avg_sq"] = state["exp_avg_sq"].to(p_data_fp32) + + exp_avg = state["exp_avg"] + exp_avg_sq = state["exp_avg_sq"] + beta1, beta2 = group["betas"] + + state["step"] += 1 + + out_p = p.data + with torch.cuda.device(p.device): + fused_adam_cuda.adam( + p_data_fp32, + out_p, + exp_avg, + exp_avg_sq, + grad, + group["lr"], + beta1, + beta2, + group["eps"], + combined_scale, + state["step"], + self.eps_mode, + bias_correction, + group["weight_decay"], + ) + + return loss + + +try: + from apex.optimizers import FusedAdam + from apex.multi_tensor_apply import multi_tensor_applier + + class FusedAdamV2(FusedAdam): + """ + Compared to the original version in Apex, the fairseq version casts grads + and params to FP32 internally to support ``--memory-efficient-fp16``. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if not hasattr(self, "multi_tensor_adam"): + raise Exception( + "Apex installation is outdated. Please install an updated version of apex." + ) + + @property + def supports_memory_efficient_fp16(self): + return True + + @property + def supports_flat_params(self): + return True + + def step( + self, + closure=None, + grads=None, + output_params=None, + scale=None, + grad_norms=None, + ): + """Performs a single optimization step.""" + loss = None + if closure is not None: + loss = closure() + + for group in self.param_groups: + bias_correction = 1 if group["bias_correction"] else 0 + beta1, beta2 = group["betas"] + + # assume same step across group now to simplify things + # per parameter step can be easily support by making it tensor, or pass list into kernel + if "step" in group: + group["step"] += 1 + else: + group["step"] = 1 + + # create lists for multi-tensor apply + g_16, p_16, orig_p_16, m_16, v_16 = [], [], [], [], [] + g_32, p_32, m_32, v_32 = [], [], [], [] + + for p in group["params"]: + if p.grad is None: + continue + if p.grad.data.is_sparse: + raise RuntimeError( + "FusedAdam does not support sparse gradients, " + "please consider SparseAdam instead" + ) + + state = self.state[p] + # State initialization + if len(state) == 0: + # Exponential moving average of gradient values + state["exp_avg"] = torch.zeros_like(p.data, dtype=torch.float) + # Exponential moving average of squared gradient values + state["exp_avg_sq"] = torch.zeros_like( + p.data, dtype=torch.float + ) + else: + state["exp_avg"] = state["exp_avg"].to( + device=p.data.device, dtype=torch.float + ) + state["exp_avg_sq"] = state["exp_avg_sq"].to( + device=p.data.device, dtype=torch.float + ) + + if p.dtype == torch.float16: + g_16.append(p.grad.data.float()) + p_16.append(p.data.float()) + orig_p_16.append(p.data) + m_16.append(state["exp_avg"]) + v_16.append(state["exp_avg_sq"]) + elif p.dtype == torch.float32: + g_32.append(p.grad.data) + p_32.append(p.data) + m_32.append(state["exp_avg"]) + v_32.append(state["exp_avg_sq"]) + else: + raise RuntimeError("FusedAdam only support fp16 and fp32.") + + with torch.cuda.device(p.device): + if len(g_16) > 0: + multi_tensor_applier( + self.multi_tensor_adam, + self._dummy_overflow_buf, + [g_16, p_16, m_16, v_16], + group["lr"], + beta1, + beta2, + group["eps"], + group["step"], + self.adam_w_mode, + bias_correction, + group["weight_decay"], + ) + for orig_p, p in zip(orig_p_16, p_16): + orig_p.copy_(p.data) + if len(g_32) > 0: + multi_tensor_applier( + self.multi_tensor_adam, + self._dummy_overflow_buf, + [g_32, p_32, m_32, v_32], + group["lr"], + beta1, + beta2, + group["eps"], + group["step"], + self.adam_w_mode, + bias_correction, + group["weight_decay"], + ) + + return loss + + +except ImportError: + pass diff --git a/SpeechT5/fairseq/fairseq/optim/fused_lamb.py b/SpeechT5/fairseq/fairseq/optim/fused_lamb.py new file mode 100644 index 0000000..f4f2bdb --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/fused_lamb.py @@ -0,0 +1,51 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.optim import LegacyFairseqOptimizer, register_optimizer + + +@register_optimizer("lamb") +class FairseqLAMB(LegacyFairseqOptimizer): + """LAMB optimizer.""" + + def __init__(self, args, params): + super().__init__(args) + try: + from apex.optimizers import FusedLAMB + + self._optimizer = FusedLAMB(params, **self.optimizer_config) + except ImportError: + raise ImportError("Please install apex to use LAMB optimizer") + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--lamb-betas', default='(0.9, 0.999)', metavar='B', + help='betas for LAMB optimizer') + parser.add_argument('--lamb-eps', type=float, default=1e-8, metavar='D', + help='epsilon for LAMB optimizer') + parser.add_argument('--weight-decay', '--wd', default=0.0, type=float, metavar='WD', + help='weight decay') + # fmt: on + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.args.lr[0], + "betas": eval(self.args.lamb_betas), + "eps": self.args.lamb_eps, + "weight_decay": self.args.weight_decay, + } + + @property + def supports_flat_params(self): + return False diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/__init__.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/__init__.py new file mode 100644 index 0000000..5b3dbc0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import importlib +import os + +from fairseq import registry +from fairseq.optim.lr_scheduler.fairseq_lr_scheduler import ( # noqa + FairseqLRScheduler, + LegacyFairseqLRScheduler, +) +from omegaconf import DictConfig + + +( + build_lr_scheduler_, + register_lr_scheduler, + LR_SCHEDULER_REGISTRY, + LR_SCHEDULER_DATACLASS_REGISTRY, +) = registry.setup_registry( + "--lr-scheduler", base_class=FairseqLRScheduler, default="fixed" +) + + +def build_lr_scheduler(cfg: DictConfig, optimizer): + return build_lr_scheduler_(cfg, optimizer) + + +# automatically import any Python files in the optim/lr_scheduler/ directory +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + file_name = file[: file.find(".py")] + importlib.import_module("fairseq.optim.lr_scheduler." + file_name) diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/cosine_lr_scheduler.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/cosine_lr_scheduler.py new file mode 100644 index 0000000..51f5835 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/cosine_lr_scheduler.py @@ -0,0 +1,147 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from collections.abc import Collection +from dataclasses import dataclass, field +from typing import List + +from omegaconf import II + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class CosineLRScheduleConfig(FairseqDataclass): + warmup_updates: int = field( + default=0, + metadata={"help": "warmup the learning rate linearly for the first N updates"}, + ) + warmup_init_lr: float = field( + default=-1, + metadata={ + "help": "initial learning rate during warmup phase; default is cfg.lr" + }, + ) + lr: List[float] = field( + default=II("optimization.lr"), + metadata={"help": "max learning rate, must be more than cfg.min_lr"}, + ) + min_lr: float = field(default=0.0, metadata={"help": "min learning rate"}) + t_mult: float = field( + default=1.0, metadata={"help": "factor to grow the length of each period"} + ) + lr_period_updates: float = field( + default=-1, metadata={"help": "initial number of updates per period"} + ) + lr_shrink: float = field( + default=0.1, metadata={"help": "shrink factor for annealing"} + ) + # This is not required, but is for convenience in inferring lr_period_updates + max_update: int = II("optimization.max_update") + + +@register_lr_scheduler("cosine", dataclass=CosineLRScheduleConfig) +class CosineLRSchedule(FairseqLRScheduler): + """Assign LR based on a cyclical schedule that follows the cosine function. + + See https://arxiv.org/pdf/1608.03983.pdf for details. + + We also support a warmup phase where we linearly increase the learning rate + from some initial learning rate (``--warmup-init-lr``) until the configured + max learning rate (``--lr``). + + During warmup:: + + lrs = torch.linspace(cfg.warmup_init_lr, cfg.lr, cfg.warmup_updates) + lr = lrs[update_num] + + After warmup:: + + lr = cfg.min_lr + 0.5*(cfg.lr - cfg.min_lr)*(1 + cos(t_curr / t_i)) + + where ``t_curr`` is current percentage of updates within the current period + range and ``t_i`` is the current period range, which is scaled by ``t_mul`` + after every iteration. + """ + + def __init__(self, cfg: CosineLRScheduleConfig, fairseq_optimizer): + super().__init__(cfg, fairseq_optimizer) + if isinstance(cfg.lr, Collection) and len(cfg.lr) > 1: + raise ValueError( + "Cannot use a fixed learning rate schedule with cosine." + f" Consider --lr-scheduler=fixed instead. ({cfg.lr})" + ) + + self.max_lr = cfg.lr[0] if isinstance(cfg.lr, Collection) else cfg.lr + assert ( + self.max_lr > cfg.min_lr + ), f"max_lr (={cfg.lr}) must be more than min_lr (={cfg.min_lr})" + + warmup_end_lr = self.max_lr + if cfg.warmup_init_lr < 0: + cfg.warmup_init_lr = cfg.min_lr + + self.t_mult = cfg.t_mult + self.period = cfg.lr_period_updates + + if self.period <= 0: + assert ( + cfg.max_update > 0 + ), "Either --max_update or --lr-period-updates must be set" + self.period = cfg.max_update - cfg.warmup_updates + + if cfg.warmup_updates > 0: + # linearly warmup for the first cfg.warmup_updates + self.lr_step = (warmup_end_lr - cfg.warmup_init_lr) / cfg.warmup_updates + else: + self.lr_step = 1 + + self.warmup_updates = cfg.warmup_updates + self.lr_shrink = cfg.lr_shrink + + # initial learning rate + self.lr = cfg.warmup_init_lr + self.optimizer.set_lr(self.lr) + + def step(self, epoch, val_loss=None): + """Update the learning rate at the end of the given epoch.""" + super().step(epoch, val_loss) + # we don't change the learning rate at epoch boundaries + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + if num_updates < self.cfg.warmup_updates: + self.lr = self.cfg.warmup_init_lr + num_updates * self.lr_step + else: + curr_updates = num_updates - self.cfg.warmup_updates + if self.t_mult != 1: + i = math.floor( + math.log( + 1 - curr_updates / self.period * (1 - self.t_mult), self.t_mult + ) + ) + t_i = self.t_mult ** i * self.period + t_curr = ( + curr_updates + - (1 - self.t_mult ** i) / (1 - self.t_mult) * self.period + ) + else: + i = math.floor(curr_updates / self.period) + t_i = self.period + t_curr = curr_updates - (self.period * i) + + lr_shrink = self.lr_shrink ** i + min_lr = self.cfg.min_lr * lr_shrink + max_lr = self.max_lr * lr_shrink + + self.lr = min_lr + 0.5 * (max_lr - min_lr) * ( + 1 + math.cos(math.pi * t_curr / t_i) + ) + + self.optimizer.set_lr(self.lr) + return self.lr diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/fairseq_lr_scheduler.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/fairseq_lr_scheduler.py new file mode 100644 index 0000000..6c12fa5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/fairseq_lr_scheduler.py @@ -0,0 +1,59 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from argparse import Namespace + +from fairseq.dataclass.utils import gen_parser_from_dataclass +from fairseq.optim import FairseqOptimizer + + +class FairseqLRScheduler(object): + def __init__(self, cfg, optimizer): + super().__init__() + if optimizer is not None and not isinstance(optimizer, FairseqOptimizer): + raise ValueError("optimizer must be an instance of FairseqOptimizer") + self.cfg = cfg + self.optimizer = optimizer + self.best = None + + @classmethod + def add_args(cls, parser): + """Add arguments to the parser for this LR scheduler.""" + dc = getattr(cls, "__dataclass", None) + if dc is not None: + gen_parser_from_dataclass(parser, dc()) + + def state_dict(self): + """Return the LR scheduler state dict.""" + return {"best": self.best} + + def load_state_dict(self, state_dict): + """Load an LR scheduler state dict.""" + self.best = state_dict["best"] + + def step_begin_epoch(self, epoch): + """Update the learning rate at the beginning of the given epoch.""" + pass + + def step(self, epoch, val_loss=None): + """Update the learning rate at the end of the given epoch.""" + if val_loss is not None: + if self.best is None: + self.best = val_loss + else: + self.best = min(self.best, val_loss) + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + return self.optimizer.get_lr() + + +class LegacyFairseqLRScheduler(FairseqLRScheduler): + def __init__(self, args: Namespace, optimizer): + if not isinstance(optimizer, FairseqOptimizer): + raise ValueError("optimizer must be an instance of FairseqOptimizer") + self.args = args + self.optimizer = optimizer + self.best = None diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/fixed_schedule.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/fixed_schedule.py new file mode 100644 index 0000000..d0e7e14 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/fixed_schedule.py @@ -0,0 +1,76 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +from typing import Optional, List +from omegaconf import II + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class FixedLRScheduleConfig(FairseqDataclass): + force_anneal: Optional[int] = field( + default=None, + metadata={"help": "force annealing at specified epoch"}, + ) + lr_shrink: float = field( + default=0.1, + metadata={"help": "shrink factor for annealing, lr_new = (lr * lr_shrink)"}, + ) + warmup_updates: int = field( + default=0, + metadata={"help": "warmup the learning rate linearly for the first N updates"}, + ) + lr: List[float] = II("optimization.lr") + + +@register_lr_scheduler("fixed", dataclass=FixedLRScheduleConfig) +class FixedLRSchedule(FairseqLRScheduler): + """Decay the LR on a fixed schedule.""" + + def __init__(self, cfg: FixedLRScheduleConfig, optimizer): + super().__init__(cfg, optimizer) + + self.lr = cfg.lr[0] + if cfg.warmup_updates > 0: + self.warmup_factor = 1.0 / cfg.warmup_updates + else: + self.warmup_factor = 1 + + def state_dict(self): + return {"lr": self.lr} + + def load_state_dict(self, state_dict): + if "lr" in state_dict: + self.lr = state_dict["lr"] + + def get_next_lr(self, epoch): + lrs = self.cfg.lr + if self.cfg.force_anneal is None or epoch < self.cfg.force_anneal: + # use fixed LR schedule + next_lr = lrs[min(epoch - 1, len(lrs) - 1)] + else: + # annneal based on lr_shrink + next_lr = lrs[-1] * self.cfg.lr_shrink ** ( + epoch + 1 - self.cfg.force_anneal + ) + return next_lr + + def step_begin_epoch(self, epoch): + """Update the learning rate at the beginning of the given epoch.""" + self.lr = self.get_next_lr(epoch) + self.optimizer.set_lr(self.warmup_factor * self.lr) + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + if self.cfg.warmup_updates > 0 and num_updates < self.cfg.warmup_updates: + self.warmup_factor = (num_updates + 1) / float(self.cfg.warmup_updates) + self.optimizer.set_lr(self.warmup_factor * self.lr) + else: + self.optimizer.set_lr(self.lr) + return self.optimizer.get_lr() diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/inverse_square_root_schedule.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/inverse_square_root_schedule.py new file mode 100644 index 0000000..0f87bb5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/inverse_square_root_schedule.py @@ -0,0 +1,85 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections.abc import Collection +from dataclasses import dataclass, field +from typing import List + +from omegaconf import II + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class InverseSquareRootLRScheduleConfig(FairseqDataclass): + warmup_updates: int = field( + default=4000, + metadata={"help": "warmup the learning rate linearly for the first N updates"}, + ) + warmup_init_lr: float = field( + default=-1, + metadata={ + "help": "initial learning rate during warmup phase; default is cfg.lr" + }, + ) + lr: List[float] = II("optimization.lr") + + +@register_lr_scheduler("inverse_sqrt", dataclass=InverseSquareRootLRScheduleConfig) +class InverseSquareRootSchedule(FairseqLRScheduler): + """Decay the LR based on the inverse square root of the update number. + + We also support a warmup phase where we linearly increase the learning rate + from some initial learning rate (``--warmup-init-lr``) until the configured + learning rate (``--lr``). Thereafter we decay proportional to the number of + updates, with a decay factor set to align with the configured learning rate. + + During warmup:: + + lrs = torch.linspace(cfg.warmup_init_lr, cfg.lr, cfg.warmup_updates) + lr = lrs[update_num] + + After warmup:: + + decay_factor = cfg.lr * sqrt(cfg.warmup_updates) + lr = decay_factor / sqrt(update_num) + """ + + def __init__(self, cfg: InverseSquareRootLRScheduleConfig, optimizer): + super().__init__(cfg, optimizer) + if isinstance(cfg.lr, Collection) and len(cfg.lr) > 1: + raise ValueError( + "Cannot use a fixed learning rate schedule with inverse_sqrt." + " Consider --lr-scheduler=fixed instead." + ) + warmup_end_lr = cfg.lr[0] if isinstance(cfg.lr, Collection) else cfg.lr + if cfg.warmup_init_lr < 0: + cfg.warmup_init_lr = 0 if cfg.warmup_updates > 0 else warmup_end_lr + + # linearly warmup for the first cfg.warmup_updates + self.lr_step = (warmup_end_lr - cfg.warmup_init_lr) / cfg.warmup_updates + + # then, decay prop. to the inverse square root of the update number + self.decay_factor = warmup_end_lr * cfg.warmup_updates ** 0.5 + + # initial learning rate + self.lr = cfg.warmup_init_lr + self.optimizer.set_lr(self.lr) + + def step(self, epoch, val_loss=None): + """Update the learning rate at the end of the given epoch.""" + super().step(epoch, val_loss) + # we don't change the learning rate at epoch boundaries + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + if num_updates < self.cfg.warmup_updates: + self.lr = self.cfg.warmup_init_lr + num_updates * self.lr_step + else: + self.lr = self.decay_factor * num_updates ** -0.5 + self.optimizer.set_lr(self.lr) + return self.lr diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/manual_lr_scheduler.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/manual_lr_scheduler.py new file mode 100644 index 0000000..0269a1e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/manual_lr_scheduler.py @@ -0,0 +1,110 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from . import LegacyFairseqLRScheduler, register_lr_scheduler +import logging +import ast + +logger = logging.getLogger(__name__) +logger.setLevel(logging.WARNING) + + +@register_lr_scheduler("manual") +class ManualSchedule(LegacyFairseqLRScheduler): + """Decay the LR on a manual schedule.""" + + def __init__(self, args, optimizer): + super().__init__(args, optimizer) + + self.epoch2lr = self.parse_manuallr_args(args.epoch2lr) + self.update2lr = self.parse_manuallr_args(args.update2lr) + logger.info("@@@ ManualSchedule epoch2lr={}".format(self.epoch2lr)) + logger.info("@@@ ManualSchedule update2lr={}".format(self.update2lr)) + + if 1 in self.epoch2lr: + self.lr = self.epoch2lr[1] + elif 1 in self.update2lr: + self.lr = self.update2lr[1] + else: + self.lr = args.lr[0] + self.optimizer.set_lr(self.lr) # Set the beginning of the epoch. + + def parse_manuallr_args(self, lr_args_str): + lr_dict = ast.literal_eval(lr_args_str.replace(' ', '')) + if not isinstance(lr_dict, dict): + raise ValueError("epoch2lr/update2lr must be abel to evaluated to a dict") + + lr_args = {} + logger.info("@@@ after parsing input dictionary lr_dict = {}".format(lr_dict)) + for key, val in lr_dict.items(): + if "," in key: + for k in key.split(","): + lr_args[int(k)] = float(val) + elif "-" in key: + s = int(key.split("-")[0]) + e = int(key.split("-")[1]) + for k in range(s, e + 1, 1): + lr_args[k] = float(val) + else: + lr_args[int(key)] = float(val) + + return lr_args + + @staticmethod + def add_args(parser): + """Add arguments to the parser for this LR scheduler.""" + # fmt: off + parser.add_argument( + "--epoch2lr", + type=str, + metavar="DICT", + default="{}", + help="a dictionary used to set lr for each epoch manually", + ) + parser.add_argument( + "--update2lr", + type=str, + metavar="DICT", + default="{}", + help="a dictionary used to set lr for each update manually", + ) + # fmt: on + + def state_dict(self): + return {"lr": self.lr} + + def load_state_dict(self, state_dict): + if "lr" in state_dict: + self.lr = state_dict["lr"] + + def get_next_lr(self, epoch): + manual_keys = [k for k in self.epoch2lr if k <= epoch] + if manual_keys: + manual_lr = self.epoch2lr[max(manual_keys)] + else: + logger.warning("@@@ epoch={} does not exist in manual lr input. epoch2lr={}...".format( + epoch, list(self.epoch2lr.items())[:min(10, len(self.epoch2lr.keys())-1)] + )) + manual_lr = self.optimizer.get_lr() + return manual_lr + + def step_begin_epoch(self, epoch): + """Update the learning rate at the beginning of the given epoch.""" + self.lr = self.get_next_lr(epoch) + self.optimizer.set_lr(self.lr) + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + manual_keys = [k for k in self.update2lr if k <= num_updates] + if manual_keys: + manual_lr = self.update2lr[max(manual_keys)] + else: + logger.warning("epoch={} does not exist in manual lr input update2lr={}...".format( + num_updates, list(self.update2lr.items())[:min(10, len(self.update2lr.keys())-1)])) + manual_lr = self.optimizer.get_lr() + + self.optimizer.set_lr(manual_lr) + return self.optimizer.get_lr() diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/pass_through.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/pass_through.py new file mode 100644 index 0000000..2f93db3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/pass_through.py @@ -0,0 +1,39 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class PassThroughScheduleConfig(FairseqDataclass): + pass + + +@register_lr_scheduler("pass_through", dataclass=PassThroughScheduleConfig) +class PassThroughScheduleSchedule(FairseqLRScheduler): + """Delegate lr scheduling to the optimizer.""" + + def __init__(self, cfg: PassThroughScheduleConfig, optimizer): + super().__init__(cfg, optimizer) + assert ( + hasattr(optimizer, "lr_scheduler") and optimizer.lr_scheduler is not None + ), "Pass-through schedule can only be used with optimizers with their own schedulers" + + def state_dict(self): + return self.optimizer.lr_scheduler.state_dict() + + def load_state_dict(self, state_dict): + self.optimizer.lr_scheduler.load_state_dict(state_dict) + + def step_begin_epoch(self, epoch): + """Update the learning rate at the beginning of the given epoch.""" + return self.optimizer.lr_scheduler.step_begin_epoch(epoch) + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + return self.optimizer.lr_scheduler.step_update(num_updates) diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/polynomial_decay_schedule.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/polynomial_decay_schedule.py new file mode 100644 index 0000000..b8109a7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/polynomial_decay_schedule.py @@ -0,0 +1,89 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +from typing import Optional, List +from omegaconf import II + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class PolynomialDecayLRScheduleConfig(FairseqDataclass): + warmup_updates: int = field( + default=0, + metadata={"help": "warmup the learning rate linearly for the first N updates"}, + ) + force_anneal: Optional[int] = field( + default=None, + metadata={"help": "force annealing at specified epoch"}, + ) + end_learning_rate: float = field( + default=0.0, + metadata={"help": "learning rate to decay to"}, + ) + power: float = field( + default=1.0, + metadata={"help": "decay exponent"}, + ) + total_num_update: float = field( + default=II("optimization.max_update"), + metadata={"help": "total number of updates over which to decay learning rate"}, + ) + lr: List[float] = II("optimization.lr") + + +@register_lr_scheduler("polynomial_decay", dataclass=PolynomialDecayLRScheduleConfig) +class PolynomialDecayLRSchedule(FairseqLRScheduler): + """Decay the LR on a fixed schedule.""" + + def __init__(self, cfg: PolynomialDecayLRScheduleConfig, optimizer): + super().__init__(cfg, optimizer) + + assert cfg.total_num_update > 0 + + self.lr = cfg.lr[0] + if cfg.warmup_updates > 0: + self.warmup_factor = 1.0 / cfg.warmup_updates + else: + self.warmup_factor = 1 + self.end_learning_rate = cfg.end_learning_rate + self.total_num_update = cfg.total_num_update + self.power = cfg.power + self.optimizer.set_lr(self.warmup_factor * self.lr) + + def get_next_lr(self, epoch): + lrs = self.cfg.lr + if self.cfg.force_anneal is None or epoch < self.cfg.force_anneal: + # use fixed LR schedule + next_lr = lrs[min(epoch, len(lrs) - 1)] + else: + # annneal based on lr_shrink + next_lr = self.optimizer.get_lr() + return next_lr + + def step_begin_epoch(self, epoch): + """Update the learning rate at the beginning of the given epoch.""" + self.lr = self.get_next_lr(epoch) + self.optimizer.set_lr(self.warmup_factor * self.lr) + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + if self.cfg.warmup_updates > 0 and num_updates <= self.cfg.warmup_updates: + self.warmup_factor = num_updates / float(self.cfg.warmup_updates) + lr = self.warmup_factor * self.lr + elif num_updates >= self.total_num_update: + lr = self.end_learning_rate + else: + warmup = self.cfg.warmup_updates + lr_range = self.lr - self.end_learning_rate + pct_remaining = 1 - (num_updates - warmup) / ( + self.total_num_update - warmup + ) + lr = lr_range * pct_remaining ** (self.power) + self.end_learning_rate + self.optimizer.set_lr(lr) + return self.optimizer.get_lr() diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/reduce_lr_on_plateau.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/reduce_lr_on_plateau.py new file mode 100644 index 0000000..5ee9c1b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/reduce_lr_on_plateau.py @@ -0,0 +1,143 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +from typing import List + +import torch.optim.lr_scheduler +from omegaconf import II + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class ReduceLROnPlateauLRScheduleConfig(FairseqDataclass): + lr_shrink: float = field( + default=0.1, metadata={"help": "shrink factor for annealing"} + ) + lr_threshold: float = field( + default=1e-4, + metadata={ + "help": ( + "threshold for measuring the new optimum, to only focus on " + "significant changes" + ) + }, + ) + lr_patience: int = field( + default=0, + metadata={ + "help": ( + "number of epochs with no improvement after which learning rate will " + "be reduced" + ) + }, + ) + warmup_updates: int = field( + default=0, + metadata={"help": "warmup the learning rate linearly for the first N updates"}, + ) + warmup_init_lr: float = field( + default=-1, + metadata={ + "help": "initial learning rate during warmup phase; default is cfg.lr" + }, + ) + lr: List[float] = II("optimization.lr") + maximize_best_checkpoint_metric: bool = II( + "checkpoint.maximize_best_checkpoint_metric" + ) + + +@register_lr_scheduler( + "reduce_lr_on_plateau", dataclass=ReduceLROnPlateauLRScheduleConfig +) +class ReduceLROnPlateauLRSchedule(FairseqLRScheduler): + """ + Decay the LR by a factor every time the validation loss plateaus. + Also comes with optional warmup phase, where we linearly increase + the learning rate from some initial learning rate + (``--warmup-init-lr``) until the configured learning rate + (``--lr``). Thereafter the lr is adjusted according to original + reduce_on_plateau scheme. + + During warmup:: + + lrs = torch.linspace( + cfg.warmup_init_lr, cfg.lr, cfg.warmup_updates + ) + lr = lrs[update_num] + """ + + def __init__(self, cfg: ReduceLROnPlateauLRScheduleConfig, optimizer): + super().__init__(cfg, optimizer) + if len(cfg.lr) > 1: + raise ValueError( + "Cannot use a fixed learning rate schedule with reduce_lr_on_plateau." + " Consider --lr-scheduler=fixed instead." + ) + self.lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + self.optimizer.optimizer, + patience=cfg.lr_patience, + factor=cfg.lr_shrink, + mode="max" if cfg.maximize_best_checkpoint_metric else "min", + threshold=cfg.lr_threshold, + ) + warmup_end_lr = cfg.lr[0] + # if no warm up, sets initial lr to be cfg.lr[0] + if cfg.warmup_init_lr < 0: + cfg.warmup_init_lr = 0 if cfg.warmup_updates > 0 else warmup_end_lr + + # linearly warmup for the first cfg.warmup_updates + if cfg.warmup_updates > 0: + self.lr_step = (warmup_end_lr - cfg.warmup_init_lr) / cfg.warmup_updates + + # this flag is either set from arg when no warm up, or set by + # step_update() when warmup finishes + self.warmup_end = True if cfg.warmup_updates <= 0 else False + + # initial learning rate + # this self.lr is used only during init and/or warm up period + self.lr = warmup_end_lr if self.warmup_end else cfg.warmup_init_lr + self.optimizer.set_lr(self.lr) + + def state_dict(self): + """Return the LR scheduler state dict.""" + return { + "best": self.lr_scheduler.best, + "last_epoch": self.lr_scheduler.last_epoch, + } + + def load_state_dict(self, state_dict): + """Load an LR scheduler state dict.""" + self.lr_scheduler.best = state_dict["best"] + if "last_epoch" in state_dict: + self.lr_scheduler.last_epoch = state_dict["last_epoch"] + + def step(self, epoch, val_loss=None): + """ + Update the learning rate at the end of the given epoch if warmup + finishes otherwise no update of lr on epoch boundaries + """ + if val_loss is not None and self.warmup_end is True: + self.lr_scheduler.step(val_loss) + else: + self.lr_scheduler.last_epoch = epoch + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """ + Update the learning rate after each update.""" + # if there is warmup + if self.cfg.warmup_updates > 0: + if num_updates <= self.cfg.warmup_updates: + self.lr = self.cfg.warmup_init_lr + num_updates * self.lr_step + self.optimizer.set_lr(self.lr) + else: + if self.warmup_end is False: + self.warmup_end = True + # else do nothing + return self.optimizer.get_lr() diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/tri_stage_lr_scheduler.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/tri_stage_lr_scheduler.py new file mode 100644 index 0000000..4d5547c --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/tri_stage_lr_scheduler.py @@ -0,0 +1,175 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass, field +from typing import Optional, List, Tuple +from omegaconf import II + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class TriStageLRScheduleConfig(FairseqDataclass): + warmup_steps: int = field( + default=0, + metadata={"help": "warmup the learning rate linearly for the first N updates"}, + ) + hold_steps: int = field( + default=0, + metadata={"help": "steps in hold stage"}, + ) + decay_steps: int = field( + default=0, + metadata={"help": "steps in decay stages"}, + ) + phase_ratio: Optional[Tuple[float, float, float]] = field( + default=None, + metadata={ + "help": ( + "if set, automatically sets warmup/hold/decay steps to the ratio " + "specified here from max_updates. the ratios must add up to 1.0" + ) + }, + ) + init_lr_scale: float = field( + default=0.01, + metadata={"help": "initial learning rate scale during warmup phase"}, + ) + final_lr_scale: float = field( + default=0.01, + metadata={"help": "final learning rate scale"}, + ) + max_update: float = II("optimization.max_update") + lr: List[float] = II("optimization.lr") + + +@register_lr_scheduler("tri_stage", dataclass=TriStageLRScheduleConfig) +class TriStageLRSchedule(FairseqLRScheduler): + """Tristage learning rate schedulr + + Implement the learning rate scheduler in https://arxiv.org/pdf/1904.08779.pdf + + Similar to inverse_squre_root scheduler, but tri_stage learning rate employs + three stages LR scheduling: + + - warmup stage, starting from `lr` * `init_lr_scale`, linearly + increased to `lr` in `warmup_steps` iterations + + - hold stage, after `warmup_steps`, keep the LR as `lr` for `hold_steps` + iterations + + - decay stage, after hold stage, decay LR exponetially to + `lr` * `final_lr_scale` in `decay_steps`; + after that LR is keep as `final_lr_scale` * `lr` + + During warmup:: + + init_lr = cfg.init_lr_scale * cfg.lr + lrs = torch.linspace(init_lr, cfg.lr, cfg.warmup_steps) + lr = lrs[update_num] + + During hold:: + + lr = cfg.lr + + During decay:: + + decay_factor = - math.log(cfg.final_lr_scale) / cfg.decay_steps + lr = cfg.lr * exp(- (update_num - warmup_steps - decay_steps) * decay_factor) + + After that:: + + lr = cfg.lr * cfg.final_lr_scale + """ + + def __init__(self, cfg: TriStageLRScheduleConfig, optimizer): + super().__init__(cfg, optimizer) + if len(cfg.lr) > 1: + raise ValueError( + "Cannot use a fixed learning rate schedule with tri-stage lr." + " Consider --lr-scheduler=fixed instead." + ) + + # calculate LR at each point + self.peak_lr = cfg.lr[0] + self.init_lr = cfg.init_lr_scale * cfg.lr[0] + self.final_lr = cfg.final_lr_scale * cfg.lr[0] + + if cfg.phase_ratio is not None: + assert cfg.max_update > 0 + assert sum(cfg.phase_ratio) == 1, "phase ratios must add up to 1" + self.warmup_steps = int(cfg.max_update * cfg.phase_ratio[0]) + self.hold_steps = int(cfg.max_update * cfg.phase_ratio[1]) + self.decay_steps = int(cfg.max_update * cfg.phase_ratio[2]) + else: + self.warmup_steps = cfg.warmup_steps + self.hold_steps = cfg.hold_steps + self.decay_steps = cfg.decay_steps + + assert ( + self.warmup_steps + self.hold_steps + self.decay_steps > 0 + ), "please specify steps or phase_ratio" + + self.warmup_rate = ( + (self.peak_lr - self.init_lr) / self.warmup_steps + if self.warmup_steps != 0 + else 0 + ) + self.decay_factor = -math.log(cfg.final_lr_scale) / self.decay_steps + + # initial learning rate + self.lr = self.init_lr + self.optimizer.set_lr(self.lr) + + def _decide_stage(self, update_step): + """ + return stage, and the corresponding steps within the current stage + """ + if update_step < self.warmup_steps: + # warmup state + return 0, update_step + + offset = self.warmup_steps + + if update_step < offset + self.hold_steps: + # hold stage + return 1, update_step - offset + + offset += self.hold_steps + + if update_step <= offset + self.decay_steps: + # decay stage + return 2, update_step - offset + + offset += self.decay_steps + + # still here ? constant lr stage + return 3, update_step - offset + + def step(self, epoch, val_loss=None): + """Update the learning rate at the end of the given epoch.""" + super().step(epoch, val_loss) + # we don't change the learning rate at epoch boundaries + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + stage, steps_in_stage = self._decide_stage(num_updates) + if stage == 0: + self.lr = self.init_lr + self.warmup_rate * steps_in_stage + elif stage == 1: + self.lr = self.peak_lr + elif stage == 2: + self.lr = self.peak_lr * math.exp(-self.decay_factor * steps_in_stage) + elif stage == 3: + self.lr = self.final_lr + else: + raise ValueError("Undefined stage") + + self.optimizer.set_lr(self.lr) + + return self.lr diff --git a/SpeechT5/fairseq/fairseq/optim/lr_scheduler/triangular_lr_scheduler.py b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/triangular_lr_scheduler.py new file mode 100644 index 0000000..bfe2a0d --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/lr_scheduler/triangular_lr_scheduler.py @@ -0,0 +1,83 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass, field +from typing import List + +from omegaconf import II + +from fairseq.dataclass import FairseqDataclass +from fairseq.optim.lr_scheduler import FairseqLRScheduler, register_lr_scheduler + + +@dataclass +class TriangularLRScheduleConfig(FairseqDataclass): + max_lr: float = field( + default="???", metadata={"help": "max learning rate, must be more than cfg.lr"} + ) + lr_period_updates: float = field( + default=5000, + metadata={"help": "initial number of updates per period (cycle length)"}, + ) + lr_shrink: float = field( + default=0.1, metadata={"help": "shrink factor for annealing"} + ) + shrink_min: bool = field( + default=False, metadata={"help": "if set, also shrinks min lr"} + ) + lr: List[float] = II("optimization.lr") + + +@register_lr_scheduler("triangular", dataclass=TriangularLRScheduleConfig) +class TriangularLRSchedule(FairseqLRScheduler): + """Assign LR based on a triangular cyclical schedule. + + See https://arxiv.org/pdf/1506.01186.pdf for details. + """ + + def __init__(self, cfg: TriangularLRScheduleConfig, optimizer): + super().__init__(cfg, optimizer) + if len(cfg.lr) > 1: + raise ValueError( + "Cannot use a fixed learning rate schedule with triangular." + " Consider --lr-scheduler=fixed instead." + ) + + lr = cfg.lr[0] + + assert cfg.max_lr > lr, "max_lr must be more than lr" + self.min_lr = lr + self.max_lr = cfg.max_lr + self.stepsize = cfg.lr_period_updates // 2 + self.lr_shrink = cfg.lr_shrink + self.shrink_min = cfg.shrink_min + + # initial learning rate + self.lr = self.min_lr + self.optimizer.set_lr(self.lr) + + def step(self, epoch, val_loss=None): + """Update the learning rate at the end of the given epoch.""" + super().step(epoch, val_loss) + # we don't change the learning rate at epoch boundaries + return self.optimizer.get_lr() + + def step_update(self, num_updates): + """Update the learning rate after each update.""" + cycle = math.floor(num_updates / (2 * self.stepsize)) + + lr_shrink = self.lr_shrink ** cycle + max_lr = self.max_lr * lr_shrink + if self.shrink_min: + min_lr = self.min_lr * lr_shrink + else: + min_lr = self.min_lr + + x = abs(num_updates / self.stepsize - 2 * (cycle + 1) + 1) + self.lr = min_lr + (max_lr - min_lr) * max(0, (1 - x)) + + self.optimizer.set_lr(self.lr) + return self.lr diff --git a/SpeechT5/fairseq/fairseq/optim/nag.py b/SpeechT5/fairseq/fairseq/optim/nag.py new file mode 100644 index 0000000..c30a6c0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/nag.py @@ -0,0 +1,111 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from collections.abc import Collection +from dataclasses import dataclass, field +from typing import List + +import torch +from fairseq.dataclass import FairseqDataclass +from omegaconf import II, DictConfig +from torch.optim.optimizer import Optimizer, required + +from . import FairseqOptimizer, register_optimizer + + +@dataclass +class FairseqNAGConfig(FairseqDataclass): + momentum: float = field(default=0.99, metadata={"help": "momentum factor"}) + weight_decay: float = field(default=0.0, metadata={"help": "weight decay"}) + # TODO common vars in parent class + lr: List[float] = II("optimization.lr") + + +@register_optimizer("nag", dataclass=FairseqNAGConfig) +class FairseqNAG(FairseqOptimizer): + def __init__(self, cfg: DictConfig, params): + super().__init__(cfg) + self._optimizer = NAG(params, **self.optimizer_config) + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.cfg.lr[0] + if isinstance(self.cfg.lr, Collection) + else self.cfg.lr, + "momentum": self.cfg.momentum, + "weight_decay": self.cfg.weight_decay, + } + + +class NAG(Optimizer): + def __init__(self, params, lr=required, momentum=0, weight_decay=0): + defaults = dict(lr=lr, lr_old=lr, momentum=momentum, weight_decay=weight_decay) + super(NAG, self).__init__(params, defaults) + + @property + def supports_memory_efficient_fp16(self): + return True + + @property + def supports_flat_params(self): + return True + + def step(self, closure=None): + """Performs a single optimization step. + + Args: + closure (callable, optional): A closure that reevaluates the model + and returns the loss. + """ + loss = None + if closure is not None: + loss = closure() + + for group in self.param_groups: + weight_decay = group["weight_decay"] + momentum = group["momentum"] + lr = group["lr"] + lr_old = group.get("lr_old", lr) + lr_correct = lr / lr_old if lr_old > 0 else lr + + for p in group["params"]: + if p.grad is None: + continue + + p_data_fp32 = p.data + if p_data_fp32.dtype in {torch.float16, torch.bfloat16}: + p_data_fp32 = p_data_fp32.float() + + d_p = p.grad.data.float() + param_state = self.state[p] + if "momentum_buffer" not in param_state: + param_state["momentum_buffer"] = torch.zeros_like(d_p) + else: + param_state["momentum_buffer"] = param_state["momentum_buffer"].to( + d_p + ) + + buf = param_state["momentum_buffer"] + + if weight_decay != 0: + p_data_fp32.mul_(1 - lr * weight_decay) + p_data_fp32.add_(buf, alpha=momentum * momentum * lr_correct) + p_data_fp32.add_(d_p, alpha=-(1 + momentum) * lr) + + buf.mul_(momentum * lr_correct).add_(d_p, alpha=-lr) + + if p.data.dtype in {torch.float16, torch.bfloat16}: + p.data.copy_(p_data_fp32) + + group["lr_old"] = lr + + return loss diff --git a/SpeechT5/fairseq/fairseq/optim/sgd.py b/SpeechT5/fairseq/fairseq/optim/sgd.py new file mode 100644 index 0000000..8e34fb9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/sgd.py @@ -0,0 +1,43 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch.optim + +from . import LegacyFairseqOptimizer, register_optimizer + + +@register_optimizer("sgd") +class SGD(LegacyFairseqOptimizer): + def __init__(self, args, params): + super().__init__(args) + self._optimizer = torch.optim.SGD(params, **self.optimizer_config) + + @staticmethod + def add_args(parser): + """Add optimizer-specific arguments to the parser.""" + # fmt: off + parser.add_argument('--momentum', default=0.0, type=float, metavar='M', + help='momentum factor') + parser.add_argument('--weight-decay', '--wd', default=0.0, type=float, metavar='WD', + help='weight decay') + # fmt: on + + @property + def optimizer_config(self): + """ + Return a kwarg dictionary that will be used to override optimizer + args stored in checkpoints. This allows us to load a checkpoint and + resume training using a different set of optimizer args, e.g., with a + different learning rate. + """ + return { + "lr": self.args.lr[0], + "momentum": self.args.momentum, + "weight_decay": self.args.weight_decay, + } + + @property + def supports_flat_params(self): + return True diff --git a/SpeechT5/fairseq/fairseq/optim/shard.py b/SpeechT5/fairseq/fairseq/optim/shard.py new file mode 100644 index 0000000..9d7f2eb --- /dev/null +++ b/SpeechT5/fairseq/fairseq/optim/shard.py @@ -0,0 +1,58 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from typing import Any, Dict + +from fairseq.distributed import utils + + +try: + from fairscale.optim import OSS + + _has_fairscale = True +except ImportError: + _has_fairscale = False + + +def shard_(optimizer, group): + if not _has_fairscale: + raise ImportError( + "\n\nPlease install the fairscale package:" "\n\n pip install fairscale" + ) + + class FairseqOSS(OSS): + @property + def disable_mem_eff_fp16_loading_hack(self): + return True + + def __getattr__(self, name): + if name.startswith("supports") and hasattr(self.optim, name): + return getattr(self.optim, name) + raise AttributeError( + "'FairseqOSS' object has no attribute {0!r}".format(name) + ) + + def broadcast_global_state_dict( + self, state_dict: Dict[str, Any] + ) -> Dict[str, Any]: + """ + Broadcasts the entire state_dict to all other ranks + each rank is responsible to load their own partition of data + """ + return utils.broadcast_object( + state_dict, + src_rank=0, + group=self.group, + ) + + torch_optimizer = optimizer.optimizer + optim_cls = type(torch_optimizer) + + optimizer.optimizer = FairseqOSS( + torch_optimizer.param_groups, + optim_cls, + group=group, + **optimizer.optimizer_config + ) diff --git a/SpeechT5/fairseq/fairseq/options.py b/SpeechT5/fairseq/fairseq/options.py new file mode 100644 index 0000000..2d9f838 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/options.py @@ -0,0 +1,381 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +from pathlib import Path +from typing import Callable, List, Optional, Union + +import torch +from fairseq import utils +from fairseq.data.indexed_dataset import get_available_dataset_impl +from fairseq.dataclass.configs import ( + CheckpointConfig, + CommonConfig, + CommonEvalConfig, + DatasetConfig, + DistributedTrainingConfig, + EvalLMConfig, + GenerationConfig, + InteractiveConfig, + OptimizationConfig, +) +from fairseq.dataclass.utils import gen_parser_from_dataclass + +# this import is for backward compatibility +from fairseq.utils import csv_str_list, eval_bool, eval_str_dict, eval_str_list # noqa + + +def get_preprocessing_parser(default_task="translation"): + parser = get_parser("Preprocessing", default_task) + add_preprocess_args(parser) + return parser + + +def get_training_parser(default_task="translation"): + parser = get_parser("Trainer", default_task) + add_dataset_args(parser, train=True) + add_distributed_training_args(parser) + add_model_args(parser) + add_optimization_args(parser) + add_checkpoint_args(parser) + return parser + + +def get_generation_parser(interactive=False, default_task="translation"): + parser = get_parser("Generation", default_task) + add_dataset_args(parser, gen=True) + add_distributed_training_args(parser, default_world_size=1) + add_generation_args(parser) + add_checkpoint_args(parser) + if interactive: + add_interactive_args(parser) + return parser + + +def get_interactive_generation_parser(default_task="translation"): + return get_generation_parser(interactive=True, default_task=default_task) + + +def get_eval_lm_parser(default_task="language_modeling"): + parser = get_parser("Evaluate Language Model", default_task) + add_dataset_args(parser, gen=True) + add_distributed_training_args(parser, default_world_size=1) + add_eval_lm_args(parser) + return parser + + +def get_validation_parser(default_task=None): + parser = get_parser("Validation", default_task) + add_dataset_args(parser, train=True) + add_distributed_training_args(parser, default_world_size=1) + group = parser.add_argument_group("Evaluation") + gen_parser_from_dataclass(group, CommonEvalConfig()) + return parser + + +def parse_args_and_arch( + parser: argparse.ArgumentParser, + input_args: List[str] = None, + parse_known: bool = False, + suppress_defaults: bool = False, + modify_parser: Optional[Callable[[argparse.ArgumentParser], None]] = None, +): + """ + Args: + parser (ArgumentParser): the parser + input_args (List[str]): strings to parse, defaults to sys.argv + parse_known (bool): only parse known arguments, similar to + `ArgumentParser.parse_known_args` + suppress_defaults (bool): parse while ignoring all default values + modify_parser (Optional[Callable[[ArgumentParser], None]]): + function to modify the parser, e.g., to set default values + """ + if suppress_defaults: + # Parse args without any default values. This requires us to parse + # twice, once to identify all the necessary task/model args, and a second + # time with all defaults set to None. + args = parse_args_and_arch( + parser, + input_args=input_args, + parse_known=parse_known, + suppress_defaults=False, + ) + suppressed_parser = argparse.ArgumentParser(add_help=False, parents=[parser]) + suppressed_parser.set_defaults(**{k: None for k, v in vars(args).items()}) + args = suppressed_parser.parse_args(input_args) + return argparse.Namespace( + **{k: v for k, v in vars(args).items() if v is not None} + ) + + from fairseq.models import ARCH_MODEL_REGISTRY, ARCH_CONFIG_REGISTRY, MODEL_REGISTRY + + # Before creating the true parser, we need to import optional user module + # in order to eagerly import custom tasks, optimizers, architectures, etc. + usr_parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) + usr_parser.add_argument("--user-dir", default=None) + usr_args, _ = usr_parser.parse_known_args(input_args) + utils.import_user_module(usr_args) + + if modify_parser is not None: + modify_parser(parser) + + # The parser doesn't know about model/criterion/optimizer-specific args, so + # we parse twice. First we parse the model/criterion/optimizer, then we + # parse a second time after adding the *-specific arguments. + # If input_args is given, we will parse those args instead of sys.argv. + args, _ = parser.parse_known_args(input_args) + + # Add model-specific args to parser. + if hasattr(args, "arch"): + model_specific_group = parser.add_argument_group( + "Model-specific configuration", + # Only include attributes which are explicitly given as command-line + # arguments or which have default values. + argument_default=argparse.SUPPRESS, + ) + if args.arch in ARCH_MODEL_REGISTRY: + ARCH_MODEL_REGISTRY[args.arch].add_args(model_specific_group) + elif args.arch in MODEL_REGISTRY: + MODEL_REGISTRY[args.arch].add_args(model_specific_group) + else: + raise RuntimeError() + + if hasattr(args, "task"): + from fairseq.tasks import TASK_REGISTRY + + TASK_REGISTRY[args.task].add_args(parser) + if getattr(args, "use_bmuf", False): + # hack to support extra args for block distributed data parallelism + from fairseq.optim.bmuf import FairseqBMUF + + FairseqBMUF.add_args(parser) + + # Add *-specific args to parser. + from fairseq.registry import REGISTRIES + + for registry_name, REGISTRY in REGISTRIES.items(): + choice = getattr(args, registry_name, None) + if choice is not None: + cls = REGISTRY["registry"][choice] + if hasattr(cls, "add_args"): + cls.add_args(parser) + elif hasattr(cls, "__dataclass"): + gen_parser_from_dataclass(parser, cls.__dataclass()) + + # Modify the parser a second time, since defaults may have been reset + if modify_parser is not None: + modify_parser(parser) + + # Parse a second time. + if parse_known: + args, extra = parser.parse_known_args(input_args) + else: + args = parser.parse_args(input_args) + extra = None + # Post-process args. + if ( + hasattr(args, "batch_size_valid") and args.batch_size_valid is None + ) or not hasattr(args, "batch_size_valid"): + args.batch_size_valid = args.batch_size + if hasattr(args, "max_tokens_valid") and args.max_tokens_valid is None: + args.max_tokens_valid = args.max_tokens + if getattr(args, "memory_efficient_fp16", False): + args.fp16 = True + if getattr(args, "memory_efficient_bf16", False): + args.bf16 = True + args.tpu = getattr(args, "tpu", False) + args.bf16 = getattr(args, "bf16", False) + if args.bf16: + args.tpu = True + if args.tpu and args.fp16: + raise ValueError("Cannot combine --fp16 and --tpu, use --bf16 on TPUs") + + if getattr(args, "seed", None) is None: + args.seed = 1 # default seed for training + args.no_seed_provided = True + else: + args.no_seed_provided = False + + # Apply architecture configuration. + if hasattr(args, "arch") and args.arch in ARCH_CONFIG_REGISTRY: + ARCH_CONFIG_REGISTRY[args.arch](args) + + if parse_known: + return args, extra + else: + return args + + +def get_parser(desc, default_task="translation"): + # Before creating the true parser, we need to import optional user module + # in order to eagerly import custom tasks, optimizers, architectures, etc. + usr_parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) + usr_parser.add_argument("--user-dir", default=None) + usr_args, _ = usr_parser.parse_known_args() + utils.import_user_module(usr_args) + + parser = argparse.ArgumentParser(allow_abbrev=False) + gen_parser_from_dataclass(parser, CommonConfig()) + + from fairseq.registry import REGISTRIES + + for registry_name, REGISTRY in REGISTRIES.items(): + parser.add_argument( + "--" + registry_name.replace("_", "-"), + default=REGISTRY["default"], + choices=REGISTRY["registry"].keys(), + ) + + # Task definitions can be found under fairseq/tasks/ + from fairseq.tasks import TASK_REGISTRY + + parser.add_argument( + "--task", + metavar="TASK", + default=default_task, + choices=TASK_REGISTRY.keys(), + help="task", + ) + # fmt: on + return parser + + +def add_preprocess_args(parser): + group = parser.add_argument_group("Preprocessing") + # fmt: off + group.add_argument("-s", "--source-lang", default=None, metavar="SRC", + help="source language") + group.add_argument("-t", "--target-lang", default=None, metavar="TARGET", + help="target language") + group.add_argument("--trainpref", metavar="FP", default=None, + help="train file prefix (also used to build dictionaries)") + group.add_argument("--validpref", metavar="FP", default=None, + help="comma separated, valid file prefixes " + "(words missing from train set are replaced with <unk>)") + group.add_argument("--testpref", metavar="FP", default=None, + help="comma separated, test file prefixes " + "(words missing from train set are replaced with <unk>)") + group.add_argument("--align-suffix", metavar="FP", default=None, + help="alignment file suffix") + group.add_argument("--destdir", metavar="DIR", default="data-bin", + help="destination dir") + group.add_argument("--thresholdtgt", metavar="N", default=0, type=int, + help="map words appearing less than threshold times to unknown") + group.add_argument("--thresholdsrc", metavar="N", default=0, type=int, + help="map words appearing less than threshold times to unknown") + group.add_argument("--tgtdict", metavar="FP", + help="reuse given target dictionary") + group.add_argument("--srcdict", metavar="FP", + help="reuse given source dictionary") + group.add_argument("--nwordstgt", metavar="N", default=-1, type=int, + help="number of target words to retain") + group.add_argument("--nwordssrc", metavar="N", default=-1, type=int, + help="number of source words to retain") + group.add_argument("--alignfile", metavar="ALIGN", default=None, + help="an alignment file (optional)") + parser.add_argument('--dataset-impl', metavar='FORMAT', default='mmap', + choices=get_available_dataset_impl(), + help='output dataset implementation') + group.add_argument("--joined-dictionary", action="store_true", + help="Generate joined dictionary") + group.add_argument("--only-source", action="store_true", + help="Only process the source language") + group.add_argument("--padding-factor", metavar="N", default=8, type=int, + help="Pad dictionary size to be multiple of N") + group.add_argument("--workers", metavar="N", default=1, type=int, + help="number of parallel workers") + group.add_argument("--dict-only", action='store_true', + help="if true, only builds a dictionary and then exits") + # fmt: on + return parser + + +def add_dataset_args(parser, train=False, gen=False): + group = parser.add_argument_group("dataset_data_loading") + gen_parser_from_dataclass(group, DatasetConfig()) + # fmt: on + return group + + +def add_distributed_training_args(parser, default_world_size=None): + group = parser.add_argument_group("distributed_training") + if default_world_size is None: + default_world_size = max(1, torch.cuda.device_count()) + gen_parser_from_dataclass( + group, DistributedTrainingConfig(distributed_world_size=default_world_size) + ) + return group + + +def add_optimization_args(parser): + group = parser.add_argument_group("optimization") + # fmt: off + gen_parser_from_dataclass(group, OptimizationConfig()) + # fmt: on + return group + + +def add_checkpoint_args(parser): + group = parser.add_argument_group("checkpoint") + # fmt: off + gen_parser_from_dataclass(group, CheckpointConfig()) + # fmt: on + return group + + +def add_common_eval_args(group): + gen_parser_from_dataclass(group, CommonEvalConfig()) + + +def add_eval_lm_args(parser): + group = parser.add_argument_group("LM Evaluation") + add_common_eval_args(group) + gen_parser_from_dataclass(group, EvalLMConfig()) + + +def add_generation_args(parser): + group = parser.add_argument_group("Generation") + add_common_eval_args(group) + gen_parser_from_dataclass(group, GenerationConfig()) + return group + + +def add_interactive_args(parser): + group = parser.add_argument_group("Interactive") + gen_parser_from_dataclass(group, InteractiveConfig()) + + +def add_model_args(parser): + group = parser.add_argument_group("Model configuration") + # fmt: off + + # Model definitions can be found under fairseq/models/ + # + # The model architecture can be specified in several ways. + # In increasing order of priority: + # 1) model defaults (lowest priority) + # 2) --arch argument + # 3) --encoder/decoder-* arguments (highest priority) + from fairseq.models import ARCH_MODEL_REGISTRY + group.add_argument('--arch', '-a', metavar='ARCH', + choices=ARCH_MODEL_REGISTRY.keys(), + help='model architecture') + # fmt: on + return group + + +def get_args( + data: Union[str, Path], + task: str = "translation", + arch: str = "transformer", + **overrides +): + parser = get_training_parser(task) + args = parse_args_and_arch(parser, [str(data), "--task", task, "--arch", arch]) + + for k, v in overrides.items(): + setattr(args, k, v) + + return args diff --git a/SpeechT5/fairseq/fairseq/pdb.py b/SpeechT5/fairseq/fairseq/pdb.py new file mode 100644 index 0000000..1ba6ef0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/pdb.py @@ -0,0 +1,47 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import multiprocessing +import os +import pdb +import sys + + +__all__ = ["set_trace"] + + +_stdin = [None] +_stdin_lock = multiprocessing.Lock() +try: + _stdin_fd = sys.stdin.fileno() +except Exception: + _stdin_fd = None + + +class MultiprocessingPdb(pdb.Pdb): + """A Pdb wrapper that works in a multiprocessing environment. + + Usage: `from fairseq import pdb; pdb.set_trace()` + """ + + def __init__(self): + pdb.Pdb.__init__(self, nosigint=True) + + def _cmdloop(self): + stdin_bak = sys.stdin + with _stdin_lock: + try: + if _stdin_fd is not None: + if not _stdin[0]: + _stdin[0] = os.fdopen(_stdin_fd) + sys.stdin = _stdin[0] + self.cmdloop() + finally: + sys.stdin = stdin_bak + + +def set_trace(): + pdb = MultiprocessingPdb() + pdb.set_trace(sys._getframe().f_back) diff --git a/SpeechT5/fairseq/fairseq/quantization_utils.py b/SpeechT5/fairseq/fairseq/quantization_utils.py new file mode 100644 index 0000000..11fc414 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/quantization_utils.py @@ -0,0 +1,143 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging + +from fairseq.modules.quantization import pq, quantization_options, scalar +from omegaconf import DictConfig + + +logger = logging.getLogger(__name__) + + +def quantize_model_scalar(model, model_cfg: DictConfig): + quant_noise_scalar = getattr(model_cfg, "quant_noise_scalar", 0) or 0 + if quant_noise_scalar > 0: + # quantize_model edits the model in place + scalar.quantize_model_(model, p=quant_noise_scalar, bits=8, update_step=1000) + return model + + +class Quantizer(object): + def __init__(self, config_path, max_epoch, max_update): + try: + import yaml + except ImportError: + raise ImportError("Please install yaml with: pip install yaml") + + # parse config + if config_path: + with open(config_path) as config_file: + config = quantization_options.parse_config_yaml( + yaml.safe_load(config_file) + ) + else: + config = quantization_options.parse_config_yaml({}) + + self.n_centroids_config = config["n_centroids"] + self.block_sizes_config = config["block_sizes"] + self.layers_to_quantize = config["layers_to_quantize"] + + # We assume that training will run for a fixed number of epochs + # (or updates) and that we should train for equal durations + # between iterations of PQ. + num_iterations = len(self.layers_to_quantize) + if max_epoch > 0: + assert max_epoch % num_iterations == 0, ( + "for iterative PQ, --max-epoch (={}) must be evenly divisible by " + "len(layers_to_quantize) (={})".format(max_epoch, num_iterations) + ) + self.epoch_schedule = max_epoch // num_iterations + else: + self.epoch_schedule = None + if max_update > 0: + assert max_update % num_iterations == 0, ( + "for iterative PQ, --max-update (={}) must be evenly divisible by " + "len(layers_to_quantize) (={})".format(max_update, num_iterations) + ) + self.update_schedule = max_update // num_iterations + else: + self.update_schedule = None + assert (self.epoch_schedule is not None) ^ ( + self.update_schedule is not None + ), "for iterative PQ, cannot specify both --max-update and --max-epoch" + + # 0 is a special value for quantization step, which will force + # the first call to begin_epoch() to call step() + self.quantization_step = 0 + + def set_trainer(self, trainer): + self.trainer = trainer + self.size_tracker = pq.SizeTracker(self.trainer.get_model()) + + def step(self): + """Move to the next stage of quantization.""" + if self.quantization_step >= len(self.layers_to_quantize): + # Maybe we just finished the last training step or we loaded + # a checkpoint for an iterative PQ model which previously + # finished training. Either way, don't quantize again. + return + + logger.info( + "quantizing model (step={}; layers_to_quantize[step]={})".format( + self.quantization_step, self.layers_to_quantize[self.quantization_step] + ) + ) + quantized_layers = pq.quantize_model_( + self.trainer.get_model(), + self.size_tracker, + self.layers_to_quantize, + self.block_sizes_config, + self.n_centroids_config, + step=self.quantization_step, + ) + logger.info("quantized layers: {}".format(quantized_layers)) + logger.info(self.size_tracker) + + self.quantization_step += 1 + + # reintialize the Trainer since model parameters have changed + self.trainer.reinitialize() + + def begin_epoch(self, epoch): + """Called at the beginning of each epoch (epochs start at 1).""" + if ( + ( + self.epoch_schedule is not None + and epoch > 0 + and (epoch - 1) % self.epoch_schedule == 0 + ) + # we always step once in the beginning, even if using + # update-based quantization + or self.quantization_step == 0 + ): + self.step() + + def step_update(self, num_updates): + """Called at the end of each step.""" + if ( + self.update_schedule is not None + and num_updates > 0 + and num_updates % self.update_schedule == 0 + ): + self.step() + + def state_dict(self): + return { + "n_centroids_config": self.n_centroids_config, + "block_sizes_config": self.block_sizes_config, + "layers_to_quantize": self.layers_to_quantize, + "epoch_schedule": self.epoch_schedule, + "update_schedule": self.update_schedule, + "quantization_step": self.quantization_step, + } + + def load_state_dict(self, state_dict): + self.n_centroids_config = state_dict["n_centroids_config"] + self.block_sizes_config = state_dict["block_sizes_config"] + self.layers_to_quantize = state_dict["layers_to_quantize"] + self.epoch_schedule = state_dict["epoch_schedule"] + self.update_schedule = state_dict["update_schedule"] + self.quantization_step = state_dict["quantization_step"] diff --git a/SpeechT5/fairseq/fairseq/registry.py b/SpeechT5/fairseq/fairseq/registry.py new file mode 100644 index 0000000..3fbaeac --- /dev/null +++ b/SpeechT5/fairseq/fairseq/registry.py @@ -0,0 +1,100 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from argparse import Namespace + +from typing import Union +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import populate_dataclass, merge_with_parent +from hydra.core.config_store import ConfigStore +from omegaconf import DictConfig + +REGISTRIES = {} + + +def setup_registry(registry_name: str, base_class=None, default=None, required=False): + assert registry_name.startswith("--") + registry_name = registry_name[2:].replace("-", "_") + + REGISTRY = {} + REGISTRY_CLASS_NAMES = set() + DATACLASS_REGISTRY = {} + + # maintain a registry of all registries + if registry_name in REGISTRIES: + return # registry already exists + REGISTRIES[registry_name] = { + "registry": REGISTRY, + "default": default, + "dataclass_registry": DATACLASS_REGISTRY, + } + + def build_x(cfg: Union[DictConfig, str, Namespace], *extra_args, **extra_kwargs): + if isinstance(cfg, DictConfig): + choice = cfg._name + + if choice and choice in DATACLASS_REGISTRY: + dc = DATACLASS_REGISTRY[choice] + cfg = merge_with_parent(dc(), cfg) + elif isinstance(cfg, str): + choice = cfg + if choice in DATACLASS_REGISTRY: + cfg = DATACLASS_REGISTRY[choice]() + else: + choice = getattr(cfg, registry_name, None) + if choice in DATACLASS_REGISTRY: + cfg = populate_dataclass(DATACLASS_REGISTRY[choice](), cfg) + + if choice is None: + if required: + raise ValueError("{} is required!".format(registry_name)) + return None + + cls = REGISTRY[choice] + if hasattr(cls, "build_" + registry_name): + builder = getattr(cls, "build_" + registry_name) + else: + builder = cls + + return builder(cfg, *extra_args, **extra_kwargs) + + def register_x(name, dataclass=None): + def register_x_cls(cls): + if name in REGISTRY: + raise ValueError( + "Cannot register duplicate {} ({})".format(registry_name, name) + ) + if cls.__name__ in REGISTRY_CLASS_NAMES: + raise ValueError( + "Cannot register {} with duplicate class name ({})".format( + registry_name, cls.__name__ + ) + ) + if base_class is not None and not issubclass(cls, base_class): + raise ValueError( + "{} must extend {}".format(cls.__name__, base_class.__name__) + ) + + if dataclass is not None and not issubclass(dataclass, FairseqDataclass): + raise ValueError( + "Dataclass {} must extend FairseqDataclass".format(dataclass) + ) + + cls.__dataclass = dataclass + if cls.__dataclass is not None: + DATACLASS_REGISTRY[name] = cls.__dataclass + + cs = ConfigStore.instance() + node = dataclass() + node._name = name + cs.store(name=name, group=registry_name, node=node, provider="fairseq") + + REGISTRY[name] = cls + + return cls + + return register_x_cls + + return build_x, register_x, REGISTRY, DATACLASS_REGISTRY diff --git a/SpeechT5/fairseq/fairseq/scoring/__init__.py b/SpeechT5/fairseq/fairseq/scoring/__init__.py new file mode 100644 index 0000000..58f2f56 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/scoring/__init__.py @@ -0,0 +1,55 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +import importlib +import os +from abc import ABC, abstractmethod + +from fairseq import registry +from omegaconf import DictConfig + + +class BaseScorer(ABC): + def __init__(self, cfg): + self.cfg = cfg + self.ref = [] + self.pred = [] + + def add_string(self, ref, pred): + self.ref.append(ref) + self.pred.append(pred) + + @abstractmethod + def score(self) -> float: + pass + + @abstractmethod + def result_string(self) -> str: + pass + + +_build_scorer, register_scorer, SCORER_REGISTRY, _ = registry.setup_registry( + "--scoring", default="bleu" +) + + +def build_scorer(choice, tgt_dict): + _choice = choice._name if isinstance(choice, DictConfig) else choice + + if _choice == "bleu": + from fairseq.scoring import bleu + + return bleu.Scorer( + bleu.BleuConfig(pad=tgt_dict.pad(), eos=tgt_dict.eos(), unk=tgt_dict.unk()) + ) + return _build_scorer(choice) + + +# automatically import any Python files in the current directory +for file in sorted(os.listdir(os.path.dirname(__file__))): + if file.endswith(".py") and not file.startswith("_"): + module = file[: file.find(".py")] + importlib.import_module("fairseq.scoring." + module) diff --git a/SpeechT5/fairseq/fairseq/scoring/bleu.py b/SpeechT5/fairseq/fairseq/scoring/bleu.py new file mode 100644 index 0000000..97de5f9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/scoring/bleu.py @@ -0,0 +1,167 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import ctypes +import math +import sys +from dataclasses import dataclass, field + +import torch +from fairseq.dataclass import FairseqDataclass +from fairseq.scoring import BaseScorer, register_scorer +from fairseq.scoring.tokenizer import EvaluationTokenizer + + +class BleuStat(ctypes.Structure): + _fields_ = [ + ("reflen", ctypes.c_size_t), + ("predlen", ctypes.c_size_t), + ("match1", ctypes.c_size_t), + ("count1", ctypes.c_size_t), + ("match2", ctypes.c_size_t), + ("count2", ctypes.c_size_t), + ("match3", ctypes.c_size_t), + ("count3", ctypes.c_size_t), + ("match4", ctypes.c_size_t), + ("count4", ctypes.c_size_t), + ] + + +@dataclass +class SacrebleuConfig(FairseqDataclass): + sacrebleu_tokenizer: EvaluationTokenizer.ALL_TOKENIZER_TYPES = field( + default="13a", metadata={"help": "tokenizer"} + ) + sacrebleu_lowercase: bool = field( + default=False, metadata={"help": "apply lowercasing"} + ) + sacrebleu_char_level: bool = field( + default=False, metadata={"help": "evaluate at character level"} + ) + + +@register_scorer("sacrebleu", dataclass=SacrebleuConfig) +class SacrebleuScorer(BaseScorer): + def __init__(self, cfg): + super(SacrebleuScorer, self).__init__(cfg) + import sacrebleu + + self.sacrebleu = sacrebleu + self.tokenizer = EvaluationTokenizer( + tokenizer_type=cfg.sacrebleu_tokenizer, + lowercase=cfg.sacrebleu_lowercase, + character_tokenization=cfg.sacrebleu_char_level, + ) + + def add_string(self, ref, pred): + self.ref.append(self.tokenizer.tokenize(ref)) + self.pred.append(self.tokenizer.tokenize(pred)) + + def score(self, order=4): + return self.result_string(order).score + + def result_string(self, order=4): + if order != 4: + raise NotImplementedError + # tokenization and lowercasing are performed by self.tokenizer instead. + return self.sacrebleu.corpus_bleu( + self.pred, [self.ref], tokenize="none" + ).format() + + +@dataclass +class BleuConfig(FairseqDataclass): + pad: int = field(default=1, metadata={"help": "padding index"}) + eos: int = field(default=2, metadata={"help": "eos index"}) + unk: int = field(default=3, metadata={"help": "unk index"}) + + +@register_scorer("bleu", dataclass=BleuConfig) +class Scorer(object): + def __init__(self, cfg): + self.stat = BleuStat() + self.pad = cfg.pad + self.eos = cfg.eos + self.unk = cfg.unk + + try: + from fairseq import libbleu + except ImportError as e: + sys.stderr.write( + "ERROR: missing libbleu.so. run `pip install --editable .`\n" + ) + raise e + + self.C = ctypes.cdll.LoadLibrary(libbleu.__file__) + + self.reset() + + def reset(self, one_init=False): + if one_init: + self.C.bleu_one_init(ctypes.byref(self.stat)) + else: + self.C.bleu_zero_init(ctypes.byref(self.stat)) + + def add(self, ref, pred): + if not isinstance(ref, torch.IntTensor): + raise TypeError("ref must be a torch.IntTensor (got {})".format(type(ref))) + if not isinstance(pred, torch.IntTensor): + raise TypeError("pred must be a torch.IntTensor(got {})".format(type(pred))) + + # don't match unknown words + rref = ref.clone() + assert not rref.lt(0).any() + rref[rref.eq(self.unk)] = -999 + + rref = rref.contiguous().view(-1) + pred = pred.contiguous().view(-1) + + self.C.bleu_add( + ctypes.byref(self.stat), + ctypes.c_size_t(rref.size(0)), + ctypes.c_void_p(rref.data_ptr()), + ctypes.c_size_t(pred.size(0)), + ctypes.c_void_p(pred.data_ptr()), + ctypes.c_int(self.pad), + ctypes.c_int(self.eos), + ) + + def score(self, order=4): + psum = sum( + math.log(p) if p > 0 else float("-Inf") for p in self.precision()[:order] + ) + return self.brevity() * math.exp(psum / order) * 100 + + def precision(self): + def ratio(a, b): + return a / b if b > 0 else 0 + + return [ + ratio(self.stat.match1, self.stat.count1), + ratio(self.stat.match2, self.stat.count2), + ratio(self.stat.match3, self.stat.count3), + ratio(self.stat.match4, self.stat.count4), + ] + + def brevity(self): + r = self.stat.reflen / self.stat.predlen + return min(1, math.exp(1 - r)) + + def result_string(self, order=4): + assert order <= 4, "BLEU scores for order > 4 aren't supported" + fmt = "BLEU{} = {:2.2f}, {:2.1f}" + for _ in range(1, order): + fmt += "/{:2.1f}" + fmt += " (BP={:.3f}, ratio={:.3f}, syslen={}, reflen={})" + bleup = [p * 100 for p in self.precision()[:order]] + return fmt.format( + order, + self.score(order=order), + *bleup, + self.brevity(), + self.stat.predlen / self.stat.reflen, + self.stat.predlen, + self.stat.reflen + ) diff --git a/SpeechT5/fairseq/fairseq/scoring/chrf.py b/SpeechT5/fairseq/fairseq/scoring/chrf.py new file mode 100644 index 0000000..0d6cb77 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/scoring/chrf.py @@ -0,0 +1,27 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from fairseq.scoring import BaseScorer, register_scorer + + +@register_scorer("chrf") +class ChrFScorer(BaseScorer): + def __init__(self, args): + super(ChrFScorer, self).__init__(args) + import sacrebleu + + self.sacrebleu = sacrebleu + + def add_string(self, ref, pred): + self.ref.append(ref) + self.pred.append(pred) + + def score(self, order=4): + return self.result_string(order).score + + def result_string(self, order=4): + if order != 4: + raise NotImplementedError + return self.sacrebleu.corpus_chrf(self.pred, [self.ref]).format() diff --git a/SpeechT5/fairseq/fairseq/scoring/tokenizer.py b/SpeechT5/fairseq/fairseq/scoring/tokenizer.py new file mode 100644 index 0000000..61cf6d4 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/scoring/tokenizer.py @@ -0,0 +1,67 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unicodedata + +from fairseq.dataclass import ChoiceEnum + + +class EvaluationTokenizer(object): + """A generic evaluation-time tokenizer, which leverages built-in tokenizers + in sacreBLEU (https://github.com/mjpost/sacrebleu). It additionally provides + lowercasing, punctuation removal and character tokenization, which are + applied after sacreBLEU tokenization. + + Args: + tokenizer_type (str): the type of sacreBLEU tokenizer to apply. + lowercase (bool): lowercase the text. + punctuation_removal (bool): remove punctuation (based on unicode + category) from text. + character_tokenization (bool): tokenize the text to characters. + """ + + SPACE = chr(32) + SPACE_ESCAPE = chr(9601) + ALL_TOKENIZER_TYPES = ChoiceEnum(["none", "13a", "intl", "zh", "ja-mecab"]) + + def __init__( + self, + tokenizer_type: str = "13a", + lowercase: bool = False, + punctuation_removal: bool = False, + character_tokenization: bool = False, + ): + from sacrebleu.tokenizers import TOKENIZERS + + assert tokenizer_type in TOKENIZERS, f"{tokenizer_type}, {TOKENIZERS}" + self.lowercase = lowercase + self.punctuation_removal = punctuation_removal + self.character_tokenization = character_tokenization + self.tokenizer = TOKENIZERS[tokenizer_type] + + @classmethod + def remove_punctuation(cls, sent: str): + """Remove punctuation based on Unicode category.""" + return cls.SPACE.join( + t + for t in sent.split(cls.SPACE) + if not all(unicodedata.category(c)[0] == "P" for c in t) + ) + + def tokenize(self, sent: str): + tokenized = self.tokenizer()(sent) + + if self.punctuation_removal: + tokenized = self.remove_punctuation(tokenized) + + if self.character_tokenization: + tokenized = self.SPACE.join( + list(tokenized.replace(self.SPACE, self.SPACE_ESCAPE)) + ) + + if self.lowercase: + tokenized = tokenized.lower() + + return tokenized diff --git a/SpeechT5/fairseq/fairseq/scoring/wer.py b/SpeechT5/fairseq/fairseq/scoring/wer.py new file mode 100644 index 0000000..633dc47 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/scoring/wer.py @@ -0,0 +1,58 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field + +from fairseq.dataclass import FairseqDataclass +from fairseq.scoring import BaseScorer, register_scorer +from fairseq.scoring.tokenizer import EvaluationTokenizer + + +@dataclass +class WerScorerConfig(FairseqDataclass): + wer_tokenizer: EvaluationTokenizer.ALL_TOKENIZER_TYPES = field( + default="none", metadata={"help": "sacreBLEU tokenizer to use for evaluation"} + ) + wer_remove_punct: bool = field( + default=False, metadata={"help": "remove punctuation"} + ) + wer_char_level: bool = field( + default=False, metadata={"help": "evaluate at character level"} + ) + wer_lowercase: bool = field(default=False, metadata={"help": "lowercasing"}) + + +@register_scorer("wer", dataclass=WerScorerConfig) +class WerScorer(BaseScorer): + def __init__(self, cfg): + super().__init__(cfg) + self.reset() + try: + import editdistance as ed + except ImportError: + raise ImportError("Please install editdistance to use WER scorer") + self.ed = ed + self.tokenizer = EvaluationTokenizer( + tokenizer_type=self.cfg.wer_tokenizer, + lowercase=self.cfg.wer_lowercase, + punctuation_removal=self.cfg.wer_remove_punct, + character_tokenization=self.cfg.wer_char_level, + ) + + def reset(self): + self.distance = 0 + self.ref_length = 0 + + def add_string(self, ref, pred): + ref_items = self.tokenizer.tokenize(ref).split() + pred_items = self.tokenizer.tokenize(pred).split() + self.distance += self.ed.eval(ref_items, pred_items) + self.ref_length += len(ref_items) + + def result_string(self): + return f"WER: {self.score():.2f}" + + def score(self): + return 100.0 * self.distance / self.ref_length if self.ref_length > 0 else 0 diff --git a/SpeechT5/fairseq/fairseq/search.py b/SpeechT5/fairseq/fairseq/search.py new file mode 100644 index 0000000..d5ea68b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/search.py @@ -0,0 +1,814 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import List, Optional + +import torch +import torch.nn as nn +from fairseq.token_generation_constraints import ( + ConstraintState, + OrderedConstraintState, + UnorderedConstraintState, +) +from torch import Tensor + + +class Search(nn.Module): + def __init__(self, tgt_dict): + super().__init__() + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() + self.vocab_size = len(tgt_dict) + self.src_lengths = torch.tensor(-1) + self.supports_constraints = False + self.stop_on_max_len = False + + def step( + self, step, lprobs, scores, prev_output_tokens=None, original_batch_idxs=None + ): + """Take a single search step. + + Args: + step: the current search step, starting at 0 + lprobs: (bsz x input_beam_size x vocab_size) + the model's log-probabilities over the vocabulary at the current step + scores: (bsz x input_beam_size x step) + the historical model scores of each hypothesis up to this point + prev_output_tokens: (bsz x step) + the previously generated oputput tokens + original_batch_idxs: (bsz) + the tensor with the batch indices, in the range [0, bsz) + this is useful in case there has been applied a re-ordering + and we need to know the orignal indices + + Return: A tuple of (scores, indices, beams) where: + scores: (bsz x output_beam_size) + the scores of the chosen elements; output_beam_size can be + larger than input_beam_size, e.g., we may return + 2*input_beam_size to account for EOS + indices: (bsz x output_beam_size) + the indices of the chosen elements + beams: (bsz x output_beam_size) + the hypothesis ids of the chosen elements, in the range [0, input_beam_size) + """ + raise NotImplementedError + + @torch.jit.export + def set_src_lengths(self, src_lengths): + self.src_lengths = src_lengths + + @torch.jit.export + def init_constraints(self, batch_constraints: Optional[Tensor], beam_size: int): + """Initialize constraint states for constrained decoding (if supported). + + Args: + batch_constraints: (torch.Tensor, optional) + the list of constraints, in packed form + beam_size: (int) + the beam size + Returns: + *encoder_out* rearranged according to *new_order* + """ + pass + + def prune_sentences(self, batch_idxs: Tensor): + """ + Removes constraint states for completed sentences (if supported). + This is called from sequence_generator._generate() when sentences are + deleted from the batch. + + Args: + batch_idxs: Indices of *sentences* whose constraint state should be *kept*. + """ + pass + + def update_constraints(self, active_hypos: Tensor): + """ + Updates the constraint states by selecting the beam items that are retained. + This is called at each time step of sequence_generator._generate() when + the set of 2 * {beam_size} candidate hypotheses are reduced to the beam size. + + Args: + active_hypos: (batch size, beam size) + list of integers denoting, for each sentence, which beam candidate items + should be kept. + """ + pass + + +class BeamSearch(Search): + def __init__(self, tgt_dict): + super().__init__(tgt_dict) + self.constraint_states = None + + @torch.jit.export + def step( + self, + step: int, + lprobs, + scores: Optional[Tensor], + prev_output_tokens: Optional[Tensor] = None, + original_batch_idxs: Optional[Tensor] = None, + ): + bsz, beam_size, vocab_size = lprobs.size() + + if step == 0: + # at the first step all hypotheses are equally likely, so use + # only the first beam + lprobs = lprobs[:, ::beam_size, :].contiguous() + else: + # make probs contain cumulative scores for each hypothesis + assert scores is not None + lprobs = lprobs + scores[:, :, step - 1].unsqueeze(-1) + + top_prediction = torch.topk( + lprobs.view(bsz, -1), + k=min( + # Take the best 2 x beam_size predictions. We'll choose the first + # beam_size of these which don't predict eos to continue with. + beam_size * 2, + lprobs.view(bsz, -1).size(1) - 1, # -1 so we never select pad + ), + ) + scores_buf = top_prediction[0] + indices_buf = top_prediction[1] + # Project back into relative indices and beams + beams_buf = indices_buf // vocab_size + indices_buf = indices_buf.fmod(vocab_size) + + # At this point, beams_buf and indices_buf are single-dim and contain relative indices + return scores_buf, indices_buf, beams_buf + + +class PrefixConstrainedBeamSearch(Search): + def __init__(self, tgt_dict, prefix_allowed_tokens_fn): + super().__init__(tgt_dict) + self.prefix_allowed_tokens_fn = prefix_allowed_tokens_fn + self.stop_on_max_len = True + + @torch.jit.export + def apply_mask(self, x, prev_output_tokens, original_batch_idxs): + beam_size = x.shape[0] // original_batch_idxs.shape[0] + original_batch_idxs = ( + original_batch_idxs.unsqueeze(-1).repeat((1, beam_size)).flatten().tolist() + ) + + mask = torch.full_like(x, -math.inf) + for sent_i, (sent, batch_i) in enumerate( + zip(prev_output_tokens, original_batch_idxs) + ): + mask[sent_i, :, self.prefix_allowed_tokens_fn(batch_i, sent)] = 0 + + return mask + + @torch.jit.export + def step( + self, + step: int, + lprobs: Tensor, + scores: Tensor, + prev_output_tokens: Tensor, + original_batch_idxs: Tensor, + ): + bsz, beam_size, vocab_size = lprobs.size() + + lprobs += self.apply_mask( + lprobs.view(bsz * beam_size, 1, vocab_size), + prev_output_tokens, + original_batch_idxs, + ).view(bsz, beam_size, vocab_size) + + if step == 0: + # at the first step all hypotheses are equally likely, so use + # only the first beam + lprobs = lprobs[:, ::beam_size, :].contiguous() + else: + # make probs contain cumulative scores for each hypothesis + assert scores is not None + lprobs = lprobs + scores[:, :, step - 1].unsqueeze(-1) + + top_prediction = torch.topk( + lprobs.view(bsz, -1), + k=min( + # Take the best beam_size predictions. We'll choose the first + # beam_size of these which don't predict eos to continue with. + beam_size, + lprobs.view(bsz, -1).size(1) - 1, # -1 so we never select pad + ), + ) + scores_buf = top_prediction[0] + indices_buf = top_prediction[1] + beams_buf = indices_buf // vocab_size + indices_buf = indices_buf.fmod(vocab_size) + return scores_buf, indices_buf, beams_buf + + +class LexicallyConstrainedBeamSearch(Search): + """Implements lexically constrained beam search as described in + + Fast Lexically Constrained Decoding with Dynamic Beam + Allocation for Neural Machine Translation. Post & Vilar, + NAACL 2018. https://www.aclweb.org/anthology/N18-1119/ + + and + + Improved Lexically Constrained Decoding for Translation and + Monolingual Rewriting. Hu et al, NAACL + 2019. https://www.aclweb.org/anthology/N19-1090/ + + This is accomplished by maintaining, for each beam hypothesis, a + ConstraintState object (see constraints.py) that tracks which + constraints have been generated and using this information to + shape the beam for each input sentence. + """ + + def __init__(self, tgt_dict, representation): + super().__init__(tgt_dict) + self.representation = representation + self.vocab_size = len(tgt_dict) + self.num_cands = 0 + self.supports_constraints = True + + @torch.jit.export + def init_constraints(self, batch_constraints: Optional[Tensor], beam_size: int): + self.constraint_states = [] + for constraint_tensor in batch_constraints: + if self.representation == "ordered": + constraint_state = OrderedConstraintState.create(constraint_tensor) + elif self.representation == "unordered": + constraint_state = UnorderedConstraintState.create(constraint_tensor) + + self.constraint_states.append([constraint_state for i in range(beam_size)]) + + @torch.jit.export + def prune_sentences(self, batch_idxs: Tensor): + self.constraint_states = [ + self.constraint_states[i] for i in batch_idxs.tolist() + ] + + @torch.jit.export + def update_constraints(self, active_hypos: Tensor): + if self.constraint_states: + batch_size = active_hypos.size(0) + for sentid in range(batch_size): + self.constraint_states[sentid] = [ + self.constraint_states[sentid][i] for i in active_hypos[sentid] + ] + + @torch.jit.export + def step( + self, + step: int, + lprobs: Tensor, + scores: Optional[Tensor], + prev_output_tokens: Optional[Tensor] = None, + original_batch_idxs: Optional[Tensor] = None, + ): + """ + A constrained step builds a large candidates list from the following: + - the top 2 * {beam_size} items over the whole beam + - for each item in the beam + - the top {each_k} (default 1) + - all next constraints + We then compute the constrained state of each beam item, and assign + stripe codes: 0 to the best in each bank, 1 to the 2nd-best, and so + on. We then sort by (stripe, score), and truncate the list at + 2 * beam size. + + Args: + step: the decoder step + lprobs: (batch size, beam size, target vocab) + the target-vocab distributions for each item in the beam. + Retrun: A tuple of (scores, indices, beams, constraints) where: + scores: (batch, output beam size) + the scores of the chosen elements + indices: (batch, output beam size) + the target vocab indices of the chosen elements + beams: (batch, output beam size) + the 0-indexed hypothesis ids of the chosen elements + constraints: (batch, output beam size) + the new constraint states + """ + each_k = 1 + device = lprobs.device + + batch_size, beam_size, vocab_size = lprobs.size() + + self.num_cands = min( + # Just take the k-best. We'll get another k from the 1-best from each + # row, plus more from the constraints + beam_size * 2, + lprobs.view(batch_size, -1).size(1) - 1, # -1 so we never select pad + ) + + # STEP 0: Preliminary. Prevent EOS for unfinished hyps across all batch items + constraint_states = self.constraint_states + if constraint_states and step > 0: + not_finished_indices = [] + for sentno, sent_constraints in enumerate(constraint_states): + for beamno, state in enumerate(sent_constraints): + index = sentno * beam_size + beamno + if not state.finished: + not_finished_indices.append(index) + not_finished_indices = torch.tensor(not_finished_indices) + if not_finished_indices.numel() > 0: + lprobs.view(batch_size * beam_size, -1)[ + not_finished_indices, self.eos + ] = -math.inf + + if step == 0: + # at the first step all hypotheses are equally likely, so use + # only the first beam entry for each batch item + lprobs = lprobs[:, ::beam_size, :].contiguous() + else: + # make probs contain cumulative scores for each hypothesis + assert scores is not None + lprobs = lprobs + scores[:, :, step - 1].unsqueeze(-1) + + top_prediction = torch.topk( + lprobs.view(batch_size, -1), + self.num_cands, + ) + scores_buf, indices_buf = top_prediction + # Project back into relative indices and beams + beams_buf = indices_buf // vocab_size + indices_buf = indices_buf.fmod(vocab_size) + + # Short circuit if there are no constraints in this batch + if not constraint_states: + return scores_buf, indices_buf, beams_buf + + # STEP 1: get top-1 from each hypothesis across all sentences in the batch + if step > 0: + top_scores, top_indices = torch.topk( + lprobs.view(batch_size * beam_size, -1), + k=each_k, + dim=1, + ) + top_scores = top_scores.view(batch_size, -1) + top_indices = top_indices.view(batch_size, -1) + scores_buf = torch.cat((scores_buf, top_scores), dim=1) + indices_buf = torch.cat((indices_buf, top_indices), dim=1) + new_beams = torch.arange(0, beam_size, device=device).repeat(batch_size, 1) + beams_buf = torch.cat((beams_buf, new_beams), dim=1) + + # Now, process sentences in the batch one by one. + new_scores_buf = torch.zeros((batch_size, 2 * beam_size), device=device) + new_indices_buf = torch.zeros((batch_size, 2 * beam_size), device=device).long() + new_beams_buf = torch.zeros((batch_size, 2 * beam_size), device=device).long() + for sentno, states in enumerate(constraint_states): + scores, indices, beams, new_states = self.step_sentence( + step, + sentno, + lprobs[sentno], + constraint_states[sentno], + beams_buf[sentno].clone(), + indices_buf[sentno].clone(), + scores_buf[sentno].clone(), + ) + new_scores_buf[sentno] = scores + new_indices_buf[sentno] = indices + new_beams_buf[sentno] = beams + self.constraint_states[sentno] = new_states + + return new_scores_buf, new_indices_buf, new_beams_buf + + @torch.jit.export + def step_sentence( + self, + step: int, + sentno: int, + lprobs: Tensor, + constraint_states: List[List[ConstraintState]], + beams_buf: Tensor, + indices_buf: Tensor, + scores_buf: Tensor, + ): + """Does per-sentence processing. Adds all constraints for each + hypothesis to the list of candidates; then removes duplicates, + sorts, and dynamically stripes across the banks. All tensor inputs + are collapsed to those pertaining to a single input sentence. + """ + device = lprobs.device + + # STEP 2: Add all constraints for each beam item + for beamno, state in enumerate(constraint_states): + next_tokens = torch.tensor(list(state.next_tokens()), device=device).long() + if next_tokens.numel() != 0: + indices_buf = torch.cat((indices_buf, next_tokens)) + next_beams = ( + torch.tensor(beamno, device=device) + .repeat(next_tokens.size(0)) + .long() + ) + beams_buf = torch.cat((beams_buf, next_beams)) + next_values = lprobs[beamno].take(next_tokens.view(-1)) + scores_buf = torch.cat((scores_buf, next_values)) + + # At the 0th time step, there is just one beam item + if step == 0: + break + + # STEP 3: Compute the "bank" for each candidate. This is the + # number of constraints it's generated. We need this so that + # we can do round-robin allocation of the beam across these + # banks. If C is the number of constraints, we select the best + # item in bank C, then the best in bank C-1, etc, followed by + # the 2nd-best in bank C, the 2nd-best in bank C-1, etc, and so + # on, until the maximum beam size. We accomplish this by + # creating a sort key and striping across the banks. + + # Compute the new states for all candidates + cands_size = indices_buf.size(0) + constraint_states = [ + constraint_states[beams_buf[i]].advance(indices_buf[i]) + for i in range(cands_size) + ] + + banks = torch.tensor([state.bank for state in constraint_states], device=device) + + # STEP 4: Sort + num_constraint_tokens = len(state.tokens) + + # Sort by keys (bank, score) (i.e., sort banks together, and scores + # within banks). AFAIK pytorch doesn't support either stable sort or + # multi-key sorting, so we have to hack this. + MAX_SCORE = -100 + sort_key = (num_constraint_tokens - banks) * MAX_SCORE + scores_buf + sort_values, sort_indices = sort_key.sort(dim=0, descending=True) + scores_buf = scores_buf[sort_indices] + indices_buf = indices_buf[sort_indices] + beams_buf = beams_buf[sort_indices] + banks = banks[sort_indices] + + # Sort the constraints to follow suit + constraint_states = [constraint_states[i] for i in sort_indices] + + # STEP 5: Remove duplicates. The topk calls (overall and + # per-row) plus the per-row generation of constraints will + # produce duplicates. Here we remove them. + + def roll(t): + """Rolls a 1d tensor left by 1. + + [0, 1, 2, 3, 4] becomes [4, 0, 1, 2, 3] + """ + return torch.cat((t[-1].unsqueeze(0), t[0:-1]), dim=0) + + # We map candidates (beam, token_id) to a single dimension. + # This is then shifted by 1. We can then easily identify + # duplicates and create a mask that identifies unique + # extensions. + uniques_mask = beams_buf * (self.vocab_size + 1) + indices_buf + uniques_mask = roll(uniques_mask) != uniques_mask + + # Use the mask to pare down the data structures + scores_buf = torch.masked_select(scores_buf, uniques_mask) + indices_buf = torch.masked_select(indices_buf, uniques_mask) + beams_buf = torch.masked_select(beams_buf, uniques_mask) + banks = torch.masked_select(banks, uniques_mask) + i = 1 + for mask in uniques_mask[1:]: + if not mask: + constraint_states.pop(i) + i += mask + + # STEP 6: Assign IDs round-robin across banks, sort, and + # truncate. Now that the candidates are sorted by (bank, + # score) and uniqed, we dynamically allocate the {beam_size} + # beam by striping across the candidates. These stripes will + # be used as sort keys to do round-robin selection. This is + # accomplished in a single pass with offsets. Sorting by + # highest-banks (furthest-along hypotheses) first ensures + # progress through the constraints. + # + # e.g., BANKS: 3 3 3 2 2 2 2 1 1 1 0 0 + # OLD STRIPES: 0 1 2 0 1 2 3 0 1 2 0 1 + # NEW STRIPES: 0 1+4 2+8 0+1 1+5 2+9 3+11 0+2 1+6 2+10 0+3 1+7 + # = 0 5 10 1 6 11 13 2 7 12 3 8 + # + # Sorting by this then gives the following banks: + # + # 3 2 1 0 3 2 1 0 3 2 1 2 + # + # We'll take the top {beam_size} of these. + stripe_offsets = [offset * (len(banks) + 1) for offset in range(len(banks) + 1)] + stripes = torch.zeros_like(banks) + cur_bank_count = -1 + cur_bank = banks[0] + for i, bank in enumerate(banks): + if bank != cur_bank: + cur_bank_count = 0 + cur_bank = bank + else: + cur_bank_count += 1 + stripes[i] = num_constraint_tokens - bank + stripe_offsets[cur_bank_count] + + # STEP 7: Sort by the stripes values + sort_values, sort_indices = stripes.sort(dim=0) + scores_buf = scores_buf[sort_indices] + indices_buf = indices_buf[sort_indices] + beams_buf = beams_buf[sort_indices] + constraint_states = [constraint_states[i] for i in sort_indices] + + # STEP 8: Truncate to the candidates size! + scores_buf = scores_buf[: self.num_cands] + indices_buf = indices_buf[: self.num_cands] + beams_buf = beams_buf[: self.num_cands] + + return scores_buf, indices_buf, beams_buf, constraint_states + + +class LengthConstrainedBeamSearch(Search): + def __init__(self, tgt_dict, min_len_a, min_len_b, max_len_a, max_len_b): + super().__init__(tgt_dict) + self.min_len_a = min_len_a + self.min_len_b = min_len_b + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.beam = BeamSearch(tgt_dict) + self.needs_src_lengths = True + + def step( + self, + step: int, + lprobs, + scores, + prev_output_tokens: Optional[Tensor] = None, + original_batch_idxs: Optional[Tensor] = None, + ): + min_lens = self.min_len_a * self.src_lengths + self.min_len_b + max_lens = self.max_len_a * self.src_lengths + self.max_len_b + lprobs[step < min_lens, :, self.eos] = -math.inf + lprobs[step >= max_lens, :, self.eos] = 0 + return self.beam.step(step, lprobs, scores) + + +class DiverseBeamSearch(Search): + """Diverse Beam Search. + + See "Diverse Beam Search: Decoding Diverse Solutions from Neural Sequence + Models" for details. + + We only implement the Hamming Diversity penalty here, which performed best + in the original paper. + """ + + def __init__(self, tgt_dict, num_groups, diversity_strength): + super().__init__(tgt_dict) + self.num_groups = num_groups + self.diversity_strength = -diversity_strength + self.beam = BeamSearch(tgt_dict) + + @torch.jit.export + def step( + self, + step: int, + lprobs, + scores, + prev_output_tokens: Optional[Tensor] = None, + original_batch_idxs: Optional[Tensor] = None, + ): + bsz, beam_size, vocab_size = lprobs.size() + if beam_size % self.num_groups != 0: + raise ValueError( + "DiverseBeamSearch requires --beam to be divisible by the number of groups" + ) + + # initialize diversity penalty + diversity_buf = torch.zeros(lprobs[:, 0, :].size()).to(lprobs) + + scores_G, indices_G, beams_G = [], [], [] + for g in range(self.num_groups): + lprobs_g = lprobs[:, g :: self.num_groups, :] + scores_g = scores[:, g :: self.num_groups, :] if step > 0 else None + + # apply diversity penalty + if g > 0: + lprobs_g = torch.add( + lprobs_g, + other=diversity_buf.unsqueeze(1), + alpha=self.diversity_strength, + ) + else: + lprobs_g = lprobs_g.contiguous() + + scores_buf, indices_buf, beams_buf = self.beam.step( + step, lprobs_g, scores_g + ) + beams_buf.mul_(self.num_groups).add_(g) + + scores_G.append(scores_buf.clone()) + indices_G.append(indices_buf.clone()) + beams_G.append(beams_buf.clone()) + + # update diversity penalty + diversity_buf.scatter_add_( + 1, indices_buf, torch.ones(indices_buf.size()).to(diversity_buf) + ) + + # interleave results from different groups + scores_buf = torch.stack(scores_G, dim=2).view(bsz, -1) + indices_buf = torch.stack(indices_G, dim=2).view(bsz, -1) + beams_buf = torch.stack(beams_G, dim=2).view(bsz, -1) + return scores_buf, indices_buf, beams_buf + + +class Sampling(Search): + sampling_topk: int + sampling_topp: float + + def __init__(self, tgt_dict, sampling_topk=-1, sampling_topp=-1.0): + super().__init__(tgt_dict) + self.sampling_topk = sampling_topk + self.sampling_topp = sampling_topp + + def _sample_topp(self, lprobs): + """Sample among the smallest set of elements whose cumulative probability mass exceeds p. + + See `"The Curious Case of Neural Text Degeneration" + (Holtzman et al., 2019) <https://arxiv.org/abs/1904.09751>`_. + + Args: + lprobs: (bsz x input_beam_size x vocab_size) + the model's log-probabilities over the vocabulary at the current step + + Return: A tuple of (trimed_probs, truncated_indices) where: + trimed_probs: (bsz x input_beam_size x ?) + the model's probabilities over the elements selected to sample from. The + width of the third dimension is determined by top-P. + truncated_indices: (bsz x input_beam_size x ?) + the indices of the chosen elements. + """ + probs = lprobs.exp_() + + # sort the last dimension (vocab dimension) in descending order + sorted_probs, sorted_indices = probs.sort(descending=True) + + # compute a mask to indicate the words to be included in the top-P set. + cumsum_probs = sorted_probs.cumsum(dim=2) + mask = cumsum_probs.lt(self.sampling_topp) + + # note that mask was computed by 'lt'. One more word needs to be included + # so that the cumulative probability mass can exceed p. + cumsum_mask = mask.cumsum(dim=2) + last_included = cumsum_mask[:, :, -1:] + last_included.clamp_(0, mask.size()[2] - 1) + mask = mask.scatter_(2, last_included, 1) + + # truncate unnecessary dims. + max_dim = last_included.max() + truncated_mask = mask[:, :, : max_dim + 1] + truncated_probs = sorted_probs[:, :, : max_dim + 1] + truncated_indices = sorted_indices[:, :, : max_dim + 1] + + # trim the words that are not in top-P by setting their probabilities + # to 0, so that they would not be sampled later. + trim_mask = ~truncated_mask + trimed_probs = truncated_probs.masked_fill_(trim_mask, 0) + return trimed_probs, truncated_indices + + @torch.jit.export + def step( + self, + step: int, + lprobs, + scores, + prev_output_tokens: Optional[Tensor] = None, + original_batch_idxs: Optional[Tensor] = None, + ): + bsz, beam_size, vocab_size = lprobs.size() + + if step == 0: + # at the first step all hypotheses are equally likely, so use + # only the first beam + lprobs = lprobs[:, ::beam_size, :].contiguous() + + if self.sampling_topp > 0: + # only sample from the smallest set of words whose cumulative probability mass exceeds p + probs, top_indices = self._sample_topp(lprobs) + elif self.sampling_topk > 0: + # only sample from top-k candidates + lprobs, top_indices = lprobs.topk(self.sampling_topk) + probs = lprobs.exp_() + else: + probs = lprobs.exp_() + + # dummy data to be consistent with true branch for type check + top_indices = torch.empty(0).to(probs) + # sample + if step == 0: + indices_buf = torch.multinomial( + probs.view(bsz, -1), + beam_size, + replacement=True, + ).view(bsz, beam_size) + else: + indices_buf = torch.multinomial( + probs.view(bsz * beam_size, -1), + 1, + replacement=True, + ).view(bsz, beam_size) + + if step == 0: + # expand to beam size + probs = probs.expand(bsz, beam_size, -1) + + # gather scores + scores_buf = torch.gather(probs, dim=2, index=indices_buf.unsqueeze(-1)) + scores_buf = scores_buf.log_().view(bsz, -1) + + # remap indices if using top-k or top-P sampling + if self.sampling_topk > 0 or self.sampling_topp > 0: + indices_buf = torch.gather( + top_indices.expand(bsz, beam_size, -1), + dim=2, + index=indices_buf.unsqueeze(-1), + ).squeeze(2) + + if step == 0: + beams_buf = indices_buf.new_zeros(bsz, beam_size) + else: + beams_buf = torch.arange(0, beam_size).to(indices_buf).repeat(bsz, 1) + # make scores cumulative + scores_buf.add_( + torch.gather(scores[:, :, step - 1], dim=1, index=beams_buf) + ) + + return scores_buf, indices_buf, beams_buf + + +class DiverseSiblingsSearch(Search): + """ + Beam search with diverse siblings. + + See "A Simple, Fast Diverse Decoding Algorithm for Neural Generation" for details. + https://arxiv.org/abs/1611.08562 + + 1/ Calculate hypotheses for each beam + 2/ Intra-sibling ordering + 3/ Rewrite scores + 4/ Choose top K hypotheses + + if diversity_rate == 0 is equivalent to BeamSearch + """ + + def __init__(self, tgt_dict, diversity_rate): + super().__init__(tgt_dict) + self.diversity_rate = diversity_rate + self.beam = BeamSearch(tgt_dict) + + def step( + self, + step: int, + lprobs, + scores, + prev_output_tokens: Optional[Tensor] = None, + original_batch_idxs: Optional[Tensor] = None, + ): + bsz, beam_size, vocab_size = lprobs.size() + k = min( + # Take the best 2 x beam_size predictions. We'll choose the first + # beam_size of these which don't predict eos to continue with. + beam_size * 2, + lprobs.view(bsz, -1).size(1) - 1, # -1 so we never select pad + ) + s_list: List[Tensor] + i_list: List[Tensor] + s_list = [torch.empty(0).to(lprobs) for i in range(beam_size)] + i_list = [torch.LongTensor().to(device=lprobs.device) for i in range(beam_size)] + sibling_score = torch.arange(1, k + 1).to(lprobs) * self.diversity_rate + + if step == 0: + return self.beam.step(step, lprobs, scores) + lprobs.add_(scores[:, :, step - 1].unsqueeze(-1)) + + # 1/ Calculate hypotheses for each beam + for i in range(beam_size): + torch.topk(lprobs[:, i, :].view(bsz, -1), k, out=(s_list[i], i_list[i])) + i_list[i].fmod_(vocab_size) + + # 2/ Intra-sibling ordering by default from topk + 3/ Rewrite scores + s_list[i].sub_(sibling_score) + + # 4/ Choose top K hypotheses + indices = torch.stack(i_list, dim=1).view(bsz, -1) + + final_scores = torch.empty(0).to(lprobs) + final_indices = torch.LongTensor().to(device=lprobs.device) + final_beams = torch.LongTensor().to(device=lprobs.device) + (final_scores, final_indices) = torch.topk( + torch.stack(s_list, dim=1).view(bsz, -1), + k, + ) + + final_beams = final_indices // k + + for i in range(bsz): + final_indices[i] = indices[i][final_indices[i]] + + return final_scores, final_indices, final_beams diff --git a/SpeechT5/fairseq/fairseq/sequence_generator.py b/SpeechT5/fairseq/fairseq/sequence_generator.py new file mode 100644 index 0000000..8a38585 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/sequence_generator.py @@ -0,0 +1,980 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from typing import Dict, List, Optional +import sys + +import torch +import torch.nn as nn +from fairseq import search, utils +from fairseq.data import data_utils +from fairseq.models import FairseqIncrementalDecoder +from torch import Tensor +from fairseq.ngram_repeat_block import NGramRepeatBlock + + +class SequenceGenerator(nn.Module): + def __init__( + self, + models, + tgt_dict, + beam_size=1, + max_len_a=0, + max_len_b=200, + max_len=0, + min_len=1, + normalize_scores=True, + len_penalty=1.0, + unk_penalty=0.0, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + search_strategy=None, + eos=None, + symbols_to_strip_from_output=None, + lm_model=None, + lm_weight=1.0, + ): + """Generates translations of a given source sentence. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models, + currently support fairseq.models.TransformerModel for scripting + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + max_len (int, optional): the maximum length of the generated output + (not including end-of-sentence) + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + """ + super().__init__() + if isinstance(models, EnsembleModel): + self.model = models + else: + self.model = EnsembleModel(models) + self.tgt_dict = tgt_dict + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() if eos is None else eos + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos}) + if symbols_to_strip_from_output is not None + else {self.eos} + ) + self.vocab_size = len(tgt_dict) + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.max_len = max_len or self.model.max_decoder_positions() + + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.temperature = temperature + self.match_source_len = match_source_len + + if no_repeat_ngram_size > 0: + self.repeat_ngram_blocker = NGramRepeatBlock(no_repeat_ngram_size) + else: + self.repeat_ngram_blocker = None + + assert temperature > 0, "--temperature must be greater than 0" + + self.search = ( + search.BeamSearch(tgt_dict) if search_strategy is None else search_strategy + ) + # We only need to set src_lengths in LengthConstrainedBeamSearch. + # As a module attribute, setting it would break in multithread + # settings when the model is shared. + self.should_set_src_lengths = ( + hasattr(self.search, "needs_src_lengths") and self.search.needs_src_lengths + ) + + self.model.eval() + + self.lm_model = lm_model + self.lm_weight = lm_weight + if self.lm_model is not None: + self.lm_model.eval() + + def cuda(self): + self.model.cuda() + return self + + @torch.no_grad() + def forward( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + """Generate a batch of translations. + + Args: + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, prefix_tokens, bos_token=bos_token) + + # TODO(myleott): unused, deprecate after pytorch-translate migration + def generate_batched_itr(self, data_itr, beam_size=None, cuda=False, timer=None): + """Iterate over a batched dataset and yield individual translations. + Args: + cuda (bool, optional): use GPU for generation + timer (StopwatchMeter, optional): time generations + """ + for sample in data_itr: + s = utils.move_to_cuda(sample) if cuda else sample + if "net_input" not in s: + continue + input = s["net_input"] + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in input.items() if k != "prev_output_tokens" + } + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate(encoder_input) + if timer is not None: + timer.stop(sum(len(h[0]["tokens"]) for h in hypos)) + for i, id in enumerate(s["id"].data): + # remove padding + src = utils.strip_pad(input["src_tokens"].data[i, :], self.pad) + ref = ( + utils.strip_pad(s["target"].data[i, :], self.pad) + if s["target"] is not None + else None + ) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate(self, models, sample: Dict[str, Dict[str, Tensor]], **kwargs) -> List[List[Dict[str, Tensor]]]: + """Generate translations. Match the api of other fairseq generators. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + constraints (torch.LongTensor, optional): force decoder to include + the list of constraints + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, **kwargs) + + def _generate( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + constraints: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(self.model.models_size) + ], + ) + net_input = sample["net_input"] + + if "src_tokens" in net_input: + src_tokens = net_input["src_tokens"] + # length of the source text being the character length except EndOfSentence and pad + src_lengths = ( + (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)).long().sum(dim=1) + ) + elif "source" in net_input: + src_tokens = net_input["source"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + elif "features" in net_input: + src_tokens = net_input["features"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + else: + raise Exception("expected src_tokens or source in net input. input keys: " + str(net_input.keys())) + + # bsz: total number of sentences in beam + # Note that src_tokens may have more than 2 dimensions (i.e. audio features) + bsz, src_len = src_tokens.size()[:2] + beam_size = self.beam_size + + if constraints is not None and not self.search.supports_constraints: + raise NotImplementedError( + "Target-side constraints were provided, but search method doesn't support them" + ) + + # Initialize constraints, when active + self.search.init_constraints(constraints, beam_size) + + max_len: int = -1 + if self.match_source_len: + max_len = src_lengths.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + self.max_len - 1, + ) + assert ( + self.min_len <= max_len + ), "min_len cannot be larger than max_len, please adjust these!" + # compute the encoder output for each beam + encoder_outs = self.model.forward_encoder(net_input) + + # placeholder of indices for bsz * beam_size to hold tokens and accumulative scores + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(src_tokens.device).long() + encoder_outs = self.model.reorder_encoder_out(encoder_outs, new_order) + # ensure encoder_outs is a List. + assert encoder_outs is not None + + # initialize buffers + scores = ( + torch.zeros(bsz * beam_size, max_len + 1).to(src_tokens).float() + ) # +1 for eos; pad is never chosen for scoring + tokens = ( + torch.zeros(bsz * beam_size, max_len + 2) + .to(src_tokens) + .long() + .fill_(self.pad) + ) # +2 for eos and pad + tokens[:, 0] = self.eos if bos_token is None else bos_token + attn: Optional[Tensor] = None + + # A list that indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = ( + torch.zeros(bsz, beam_size).to(src_tokens).eq(-1) + ) # forward and backward-compatible False mask + + # list of completed sentences + finalized = torch.jit.annotate( + List[List[Dict[str, Tensor]]], + [torch.jit.annotate(List[Dict[str, Tensor]], []) for i in range(bsz)], + ) # contains lists of dictionaries of infomation about the hypothesis being finalized at each step + + # a boolean array indicating if the sentence at the index is finished or not + finished = [False for i in range(bsz)] + num_remaining_sent = bsz # number of sentences remaining + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = ( + (torch.arange(0, bsz) * beam_size) + .unsqueeze(1) + .type_as(tokens) + .to(src_tokens.device) + ) + cand_offsets = torch.arange(0, cand_size).type_as(tokens).to(src_tokens.device) + + reorder_state: Optional[Tensor] = None + batch_idxs: Optional[Tensor] = None + + original_batch_idxs: Optional[Tensor] = None + if "id" in sample and isinstance(sample["id"], Tensor): + original_batch_idxs = sample["id"] + else: + original_batch_idxs = torch.arange(0, bsz).type_as(tokens) + + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as( + batch_idxs + ) + reorder_state.view(-1, beam_size).add_( + corr.unsqueeze(-1) * beam_size + ) + original_batch_idxs = original_batch_idxs[batch_idxs] + self.model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = self.model.reorder_encoder_out( + encoder_outs, reorder_state + ) + + lprobs, avg_attn_scores = self.model.forward_decoder( + tokens[:, : step + 1], + encoder_outs, + incremental_states, + self.temperature, + ) + + if self.lm_model is not None: + lm_out = self.lm_model(tokens[:, : step + 1]) + probs = self.lm_model.get_normalized_probs( + lm_out, log_probs=True, sample=None + ) + probs = probs[:, -1, :] * self.lm_weight + lprobs += probs + + lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs) + + lprobs[:, self.pad] = -math.inf # never select pad + lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + + # handle max length constraint + if step >= max_len: + lprobs[:, : self.eos] = -math.inf + lprobs[:, self.eos + 1 :] = -math.inf + + # handle prefix tokens (possibly with different lengths) + if ( + prefix_tokens is not None + and step < prefix_tokens.size(1) + and step < max_len + ): + lprobs, tokens, scores = self._prefix_tokens( + step, lprobs, scores, tokens, prefix_tokens, beam_size + ) + elif step < self.min_len: + # minimum length constraint (does not apply if using prefix_tokens) + lprobs[:, self.eos] = -math.inf + + # Record attention scores, only support avg_attn_scores is a Tensor + if avg_attn_scores is not None: + if attn is None: + attn = torch.empty( + bsz * beam_size, avg_attn_scores.size(1), max_len + 2 + ).to(scores) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(lprobs) + eos_bbsz_idx = torch.empty(0).to( + tokens + ) # indices of hypothesis ending with eos (finished sentences) + eos_scores = torch.empty(0).to( + scores + ) # scores of hypothesis ending with eos (finished sentences) + + if self.should_set_src_lengths: + self.search.set_src_lengths(src_lengths) + + if self.repeat_ngram_blocker is not None: + lprobs = self.repeat_ngram_blocker(tokens, lprobs, bsz, beam_size, step) + + # Shape: (batch, cand_size) + cand_scores, cand_indices, cand_beams = self.search.step( + step, + lprobs.view(bsz, -1, self.vocab_size), + scores.view(bsz, beam_size, -1)[:, :, :step], + tokens[:, : step + 1], + original_batch_idxs, + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos + # Shape of eos_mask: (batch size, beam size) + eos_mask = cand_indices.eq(self.eos) & cand_scores.ne(-math.inf) + eos_mask[:, :beam_size][cands_to_ignore] = torch.tensor(0).to(eos_mask) + + # only consider eos when it's among the top beam_size indices + # Now we know what beam item(s) to finish + # Shape: 1d list of absolute-numbered + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents: List[int] = [] + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + cand_scores[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = self.finalize_hypos( + step, + eos_bbsz_idx, + eos_scores, + tokens, + scores, + finalized, + finished, + beam_size, + attn, + src_lengths, + max_len, + ) + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + if self.search.stop_on_max_len and step >= max_len: + break + assert step < max_len, f"{step} < {max_len}" + + # Remove finalized sentences (ones for which {beam_size} + # finished hypotheses have been generated) from the batch. + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = torch.ones( + bsz, dtype=torch.bool, device=cand_indices.device + ) + batch_mask[finalized_sents] = False + # TODO replace `nonzero(as_tuple=False)` after TorchScript supports it + batch_idxs = torch.arange( + bsz, device=cand_indices.device + ).masked_select(batch_mask) + + # Choose the subset of the hypothesized constraints that will continue + self.search.prune_sentences(batch_idxs) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + cand_scores = cand_scores[batch_idxs] + cand_indices = cand_indices[batch_idxs] + + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths = src_lengths[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view( + new_bsz * beam_size, attn.size(1), -1 + ) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos hypos + # and values < cand_size indicate candidate active hypos. + # After, the min values per row are the top candidate active hypos + + # Rewrite the operator since the element wise or is not supported in torchscript. + + eos_mask[:, :beam_size] = ~((~cands_to_ignore) & (~eos_mask[:, :beam_size])) + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just + # the hypos with the smallest values in active_mask. + # {active_hypos} indicates which {beam_size} hypotheses + # from the list of {2 * beam_size} candidates were + # selected. Shapes: (batch size, beam size) + new_cands_to_ignore, active_hypos = torch.topk( + active_mask, k=beam_size, dim=1, largest=False + ) + + # update cands_to_ignore to ignore any finalized hypos. + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + # Make sure there is at least one active item for each sentence in the batch. + assert (~cands_to_ignore).any(dim=1).all() + + # update cands_to_ignore to ignore any finalized hypos + + # {active_bbsz_idx} denotes which beam number is continued for each new hypothesis (a beam + # can be selected more than once). + active_bbsz_idx = torch.gather(cand_bbsz_idx, dim=1, index=active_hypos) + active_scores = torch.gather(cand_scores, dim=1, index=active_hypos) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + + # Set the tokens for each beam (can select the same row more than once) + tokens[:, : step + 1] = torch.index_select( + tokens[:, : step + 1], dim=0, index=active_bbsz_idx + ) + # Select the next token for each of them + tokens.view(bsz, beam_size, -1)[:, :, step + 1] = torch.gather( + cand_indices, dim=1, index=active_hypos + ) + if step > 0: + scores[:, :step] = torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx + ) + scores.view(bsz, beam_size, -1)[:, :, step] = torch.gather( + cand_scores, dim=1, index=active_hypos + ) + + # Update constraints based on which candidates were selected for the next beam + self.search.update_constraints(active_hypos) + + # copy attention for active hypotheses + if attn is not None: + attn[:, :, : step + 2] = torch.index_select( + attn[:, :, : step + 2], dim=0, index=active_bbsz_idx + ) + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # sort by score descending + for sent in range(len(finalized)): + scores = torch.tensor( + [float(elem["score"].item()) for elem in finalized[sent]] + ) + _, sorted_scores_indices = torch.sort(scores, descending=True) + finalized[sent] = [finalized[sent][ssi] for ssi in sorted_scores_indices] + finalized[sent] = torch.jit.annotate( + List[Dict[str, Tensor]], finalized[sent] + ) + return finalized + + def _prefix_tokens( + self, step: int, lprobs, scores, tokens, prefix_tokens, beam_size: int + ): + """Handle prefix tokens""" + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_lprobs = lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + prefix_mask = prefix_toks.ne(self.pad) + lprobs[prefix_mask] = torch.tensor(-math.inf).to(lprobs) + lprobs[prefix_mask] = lprobs[prefix_mask].scatter( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lprobs[prefix_mask] + ) + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[ + :, 0, 1 : step + 1 + ] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = self.replicate_first_beam(tokens, eos_mask_batch_dim, beam_size) + scores = self.replicate_first_beam(scores, eos_mask_batch_dim, beam_size) + lprobs = self.replicate_first_beam(lprobs, eos_mask_batch_dim, beam_size) + return lprobs, tokens, scores + + def replicate_first_beam(self, tensor, mask, beam_size: int): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + def finalize_hypos( + self, + step: int, + bbsz_idx, + eos_scores, + tokens, + scores, + finalized: List[List[Dict[str, Tensor]]], + finished: List[bool], + beam_size: int, + attn: Optional[Tensor], + src_lengths, + max_len: int, + ): + """Finalize hypothesis, store finalized information in `finalized`, and change `finished` accordingly. + A sentence is finalized when {beam_size} finished items have been collected for it. + + Returns number of sentences (not beam items) being finalized. + These will be removed from the batch and not processed further. + Args: + bbsz_idx (Tensor): + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors. + # tokens is (batch * beam, max_len). So the index_select + # gets the newly EOS rows, then selects cols 1..{step + 2} + tokens_clone = tokens.index_select(0, bbsz_idx)[ + :, 1 : step + 2 + ] # skip the first index, which is EOS + + tokens_clone[:, step] = self.eos + attn_clone = ( + attn.index_select(0, bbsz_idx)[:, :, 1 : step + 2] + if attn is not None + else None + ) + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, : step + 1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + eos_scores /= (step + 1) ** self.len_penalty + + # cum_unfin records which sentences in the batch are finished. + # It helps match indexing between (a) the original sentences + # in the batch and (b) the current, possibly-reduced set of + # sentences. + cum_unfin: List[int] = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + + # The keys here are of the form "{sent}_{unfin_idx}", where + # "unfin_idx" is the index in the current (possibly reduced) + # list of sentences, and "sent" is the index in the original, + # unreduced batch + # set() is not supported in script export + sents_seen: Dict[str, Optional[Tensor]] = {} + + # For every finished beam item + for i in range(bbsz_idx.size()[0]): + idx = bbsz_idx[i] + score = eos_scores[i] + # sentence index in the current (possibly reduced) batch + unfin_idx = idx // beam_size + # sentence index in the original (unreduced) batch + sent = unfin_idx + cum_unfin[unfin_idx] + # Cannot create dict for key type '(int, int)' in torchscript. + # The workaround is to cast int to string + seen = str(sent.item()) + "_" + str(unfin_idx.item()) + if seen not in sents_seen: + sents_seen[seen] = None + + if self.match_source_len and step > src_lengths[unfin_idx]: + score = torch.tensor(-math.inf).to(score) + + # An input sentence (among those in a batch) is finished when + # beam_size hypotheses have been collected for it + if len(finalized[sent]) < beam_size: + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i] + else: + hypo_attn = torch.empty(0) + + finalized[sent].append( + { + "tokens": tokens_clone[i], + "score": score, + "attention": hypo_attn, # src_len x tgt_len + "alignment": torch.empty(0), + "positional_scores": pos_scores[i], + } + ) + + newly_finished: List[int] = [] + + for seen in sents_seen.keys(): + # check termination conditions for this sentence + sent: int = int(float(seen.split("_")[0])) + unfin_idx: int = int(float(seen.split("_")[1])) + + if not finished[sent] and self.is_finished( + step, unfin_idx, max_len, len(finalized[sent]), beam_size + ): + finished[sent] = True + newly_finished.append(unfin_idx) + + return newly_finished + + def is_finished( + self, + step: int, + unfin_idx: int, + max_len: int, + finalized_sent_len: int, + beam_size: int, + ): + """ + Check whether decoding for a sentence is finished, which + occurs when the list of finalized sentences has reached the + beam size, or when we reach the maximum length. + """ + assert finalized_sent_len <= beam_size + if finalized_sent_len == beam_size or step == max_len: + return True + return False + + +class EnsembleModel(nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models_size = len(models) + # method '__len__' is not supported in ModuleList for torch script + self.single_model = models[0] + self.models = nn.ModuleList(models) + + self.has_incremental: bool = False + if all( + hasattr(m, "decoder") and isinstance(m.decoder, FairseqIncrementalDecoder) + for m in models + ): + self.has_incremental = True + + def forward(self): + pass + + def has_encoder(self): + return hasattr(self.single_model, "encoder") + + def has_incremental_states(self): + return self.has_incremental + + def max_decoder_positions(self): + return min([m.max_decoder_positions() for m in self.models if hasattr(m, "max_decoder_positions")] + [sys.maxsize]) + + @torch.jit.export + def forward_encoder(self, net_input: Dict[str, Tensor]): + if not self.has_encoder(): + return None + return [model.encoder.forward_torchscript(net_input) for model in self.models] + + @torch.jit.export + def forward_decoder( + self, + tokens, + encoder_outs: List[Dict[str, List[Tensor]]], + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + temperature: float = 1.0, + ): + log_probs = [] + avg_attn: Optional[Tensor] = None + encoder_out: Optional[Dict[str, List[Tensor]]] = None + for i, model in enumerate(self.models): + if self.has_encoder(): + encoder_out = encoder_outs[i] + # decode each model + if self.has_incremental_states(): + decoder_out = model.decoder.forward( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i], + ) + else: + if hasattr(model, "decoder"): + decoder_out = model.decoder.forward(tokens, encoder_out=encoder_out) + else: + decoder_out = model.forward(tokens) + + attn: Optional[Tensor] = None + decoder_len = len(decoder_out) + if decoder_len > 1 and decoder_out[1] is not None: + if isinstance(decoder_out[1], Tensor): + attn = decoder_out[1] + else: + attn_holder = decoder_out[1]["attn"] + if isinstance(attn_holder, Tensor): + attn = attn_holder + elif attn_holder is not None: + attn = attn_holder[0] + if attn is not None: + attn = attn[:, -1, :] + + decoder_out_tuple = ( + decoder_out[0][:, -1:, :].div_(temperature), + None if decoder_len <= 1 else decoder_out[1], + ) + probs = model.get_normalized_probs( + decoder_out_tuple, log_probs=True, sample=None + ) + probs = probs[:, -1, :] + if self.models_size == 1: + return probs, attn + + log_probs.append(probs) + if attn is not None: + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + + avg_probs = torch.logsumexp(torch.stack(log_probs, dim=0), dim=0) - math.log( + self.models_size + ) + + if avg_attn is not None: + avg_attn.div_(self.models_size) + return avg_probs, avg_attn + + @torch.jit.export + def reorder_encoder_out( + self, encoder_outs: Optional[List[Dict[str, List[Tensor]]]], new_order + ): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_outs: List[Dict[str, List[Tensor]]] = [] + if not self.has_encoder(): + return new_outs + for i, model in enumerate(self.models): + assert encoder_outs is not None + new_outs.append( + model.encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + return new_outs + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + new_order, + ): + if not self.has_incremental_states(): + return + for i, model in enumerate(self.models): + model.decoder.reorder_incremental_state_scripting( + incremental_states[i], new_order + ) + + +class SequenceGeneratorWithAlignment(SequenceGenerator): + def __init__( + self, models, tgt_dict, left_pad_target=False, print_alignment="hard", **kwargs + ): + """Generates translations of a given source sentence. + + Produces alignments following "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + left_pad_target (bool, optional): Whether or not the + hypothesis should be left padded or not when they are + teacher forced for generating alignments. + """ + super().__init__(EnsembleModelWithAlignment(models), tgt_dict, **kwargs) + self.left_pad_target = left_pad_target + + if print_alignment == "hard": + self.extract_alignment = utils.extract_hard_alignment + elif print_alignment == "soft": + self.extract_alignment = utils.extract_soft_alignment + + @torch.no_grad() + def generate(self, models, sample, **kwargs): + finalized = super()._generate(sample, **kwargs) + + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + beam_size = self.beam_size + ( + src_tokens, + src_lengths, + prev_output_tokens, + tgt_tokens, + ) = self._prepare_batch_for_alignment(sample, finalized) + if any(getattr(m, "full_context_alignment", False) for m in self.model.models): + attn = self.model.forward_align(src_tokens, src_lengths, prev_output_tokens) + else: + attn = [ + finalized[i // beam_size][i % beam_size]["attention"].transpose(1, 0) + for i in range(bsz * beam_size) + ] + + if src_tokens.device != "cpu": + src_tokens = src_tokens.to("cpu") + tgt_tokens = tgt_tokens.to("cpu") + attn = [i.to("cpu") for i in attn] + + # Process the attn matrix to extract hard alignments. + for i in range(bsz * beam_size): + alignment = self.extract_alignment( + attn[i], src_tokens[i], tgt_tokens[i], self.pad, self.eos + ) + finalized[i // beam_size][i % beam_size]["alignment"] = alignment + return finalized + + def _prepare_batch_for_alignment(self, sample, hypothesis): + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + src_tokens = ( + src_tokens[:, None, :] + .expand(-1, self.beam_size, -1) + .contiguous() + .view(bsz * self.beam_size, -1) + ) + src_lengths = sample["net_input"]["src_lengths"] + src_lengths = ( + src_lengths[:, None] + .expand(-1, self.beam_size) + .contiguous() + .view(bsz * self.beam_size) + ) + prev_output_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=True, + ) + tgt_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=False, + ) + return src_tokens, src_lengths, prev_output_tokens, tgt_tokens + + +class EnsembleModelWithAlignment(EnsembleModel): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__(models) + + def forward_align(self, src_tokens, src_lengths, prev_output_tokens): + avg_attn = None + for model in self.models: + decoder_out = model(src_tokens, src_lengths, prev_output_tokens) + attn = decoder_out[1]["attn"][0] + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + if len(self.models) > 1: + avg_attn.div_(len(self.models)) + return avg_attn diff --git a/SpeechT5/fairseq/fairseq/sequence_scorer.py b/SpeechT5/fairseq/fairseq/sequence_scorer.py new file mode 100644 index 0000000..411d4df --- /dev/null +++ b/SpeechT5/fairseq/fairseq/sequence_scorer.py @@ -0,0 +1,153 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + +import torch +from fairseq import utils + + +class SequenceScorer(object): + """Scores the target for a given source sentence.""" + + def __init__( + self, + tgt_dict, + softmax_batch=None, + compute_alignment=False, + eos=None, + symbols_to_strip_from_output=None, + ): + self.pad = tgt_dict.pad() + self.eos = tgt_dict.eos() if eos is None else eos + self.softmax_batch = softmax_batch or sys.maxsize + assert self.softmax_batch > 0 + self.compute_alignment = compute_alignment + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos}) + if symbols_to_strip_from_output is not None + else {self.eos} + ) + + @torch.no_grad() + def generate(self, models, sample, **kwargs): + """Score a batch of translations.""" + net_input = sample["net_input"] + + def batch_for_softmax(dec_out, target): + # assumes decoder_out[0] is the only thing needed (may not be correct for future models!) + first, rest = dec_out[0], dec_out[1:] + bsz, tsz, dim = first.shape + if bsz * tsz < self.softmax_batch: + yield dec_out, target, True + else: + flat = first.contiguous().view(1, -1, dim) + flat_tgt = target.contiguous().view(flat.shape[:-1]) + s = 0 + while s < flat.size(1): + e = s + self.softmax_batch + yield (flat[:, s:e],) + rest, flat_tgt[:, s:e], False + s = e + + def gather_target_probs(probs, target): + probs = probs.gather( + dim=2, + index=target.unsqueeze(-1), + ) + return probs + + orig_target = sample["target"] + + # compute scores for each model in the ensemble + avg_probs = None + avg_attn = None + for model in models: + model.eval() + decoder_out = model(**net_input) + attn = decoder_out[1] if len(decoder_out) > 1 else None + if type(attn) is dict: + attn = attn.get("attn", None) + + batched = batch_for_softmax(decoder_out, orig_target) + probs, idx = None, 0 + for bd, tgt, is_single in batched: + sample["target"] = tgt + curr_prob = model.get_normalized_probs( + bd, log_probs=len(models) == 1, sample=sample + ).data + if is_single: + probs = gather_target_probs(curr_prob, orig_target) + else: + if probs is None: + probs = curr_prob.new(orig_target.numel()) + step = curr_prob.size(0) * curr_prob.size(1) + end = step + idx + tgt_probs = gather_target_probs( + curr_prob.view(tgt.shape + (curr_prob.size(-1),)), tgt + ) + probs[idx:end] = tgt_probs.view(-1) + idx = end + sample["target"] = orig_target + + probs = probs.view(sample["target"].shape) + + if avg_probs is None: + avg_probs = probs + else: + avg_probs.add_(probs) + if attn is not None: + if torch.is_tensor(attn): + attn = attn.data + else: + attn = attn[0] + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + if len(models) > 1: + avg_probs.div_(len(models)) + avg_probs.log_() + if avg_attn is not None: + avg_attn.div_(len(models)) + + bsz = avg_probs.size(0) + hypos = [] + start_idxs = sample["start_indices"] if "start_indices" in sample else [0] * bsz + for i in range(bsz): + # remove padding from ref + ref = ( + utils.strip_pad(sample["target"][i, start_idxs[i] :], self.pad) + if sample["target"] is not None + else None + ) + tgt_len = ref.numel() + avg_probs_i = avg_probs[i][start_idxs[i] : start_idxs[i] + tgt_len] + score_i = avg_probs_i.sum() / tgt_len + if avg_attn is not None: + avg_attn_i = avg_attn[i] + if self.compute_alignment: + alignment = utils.extract_hard_alignment( + avg_attn_i, + sample["net_input"]["src_tokens"][i], + sample["target"][i], + self.pad, + self.eos, + ) + else: + alignment = None + else: + avg_attn_i = alignment = None + hypos.append( + [ + { + "tokens": ref, + "score": score_i, + "attention": avg_attn_i, + "alignment": alignment, + "positional_scores": avg_probs_i, + } + ] + ) + return hypos diff --git a/SpeechT5/fairseq/fairseq/tasks/__init__.py b/SpeechT5/fairseq/fairseq/tasks/__init__.py new file mode 100644 index 0000000..79dde74 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/__init__.py @@ -0,0 +1,136 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import argparse +import importlib +import os + +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import merge_with_parent, populate_dataclass +from hydra.core.config_store import ConfigStore + +from .fairseq_task import FairseqTask, LegacyFairseqTask # noqa + + +# register dataclass +TASK_DATACLASS_REGISTRY = {} +TASK_REGISTRY = {} +TASK_CLASS_NAMES = set() + + +def setup_task(cfg: FairseqDataclass, **kwargs): + task = None + task_name = getattr(cfg, "task", None) + + if isinstance(task_name, str): + # legacy tasks + task = TASK_REGISTRY[task_name] + if task_name in TASK_DATACLASS_REGISTRY: + dc = TASK_DATACLASS_REGISTRY[task_name] + cfg = populate_dataclass(dc(), cfg) + else: + task_name = getattr(cfg, "_name", None) + + if task_name and task_name in TASK_DATACLASS_REGISTRY: + dc = TASK_DATACLASS_REGISTRY[task_name] + cfg = merge_with_parent(dc(), cfg) + task = TASK_REGISTRY[task_name] + + assert ( + task is not None + ), f"Could not infer task type from {cfg}. Available tasks: {TASK_REGISTRY.keys()}" + + return task.setup_task(cfg, **kwargs) + + +def register_task(name, dataclass=None): + """ + New tasks can be added to fairseq with the + :func:`~fairseq.tasks.register_task` function decorator. + + For example:: + + @register_task('classification') + class ClassificationTask(FairseqTask): + (...) + + .. note:: + + All Tasks must implement the :class:`~fairseq.tasks.FairseqTask` + interface. + + Args: + name (str): the name of the task + """ + + def register_task_cls(cls): + if name in TASK_REGISTRY: + raise ValueError("Cannot register duplicate task ({})".format(name)) + if not issubclass(cls, FairseqTask): + raise ValueError( + "Task ({}: {}) must extend FairseqTask".format(name, cls.__name__) + ) + if cls.__name__ in TASK_CLASS_NAMES: + raise ValueError( + "Cannot register task with duplicate class name ({})".format( + cls.__name__ + ) + ) + TASK_REGISTRY[name] = cls + TASK_CLASS_NAMES.add(cls.__name__) + + if dataclass is not None and not issubclass(dataclass, FairseqDataclass): + raise ValueError( + "Dataclass {} must extend FairseqDataclass".format(dataclass) + ) + + cls.__dataclass = dataclass + if dataclass is not None: + TASK_DATACLASS_REGISTRY[name] = dataclass + + cs = ConfigStore.instance() + node = dataclass() + node._name = name + cs.store(name=name, group="task", node=node, provider="fairseq") + + return cls + + return register_task_cls + + +def get_task(name): + return TASK_REGISTRY[name] + + +def import_tasks(tasks_dir, namespace): + for file in os.listdir(tasks_dir): + path = os.path.join(tasks_dir, file) + if ( + not file.startswith("_") + and not file.startswith(".") + and (file.endswith(".py") or os.path.isdir(path)) + ): + task_name = file[: file.find(".py")] if file.endswith(".py") else file + importlib.import_module(namespace + "." + task_name) + + # expose `task_parser` for sphinx + if task_name in TASK_REGISTRY: + parser = argparse.ArgumentParser(add_help=False) + group_task = parser.add_argument_group("Task name") + # fmt: off + group_task.add_argument('--task', metavar=task_name, + help='Enable this task with: ``--task=' + task_name + '``') + # fmt: on + group_args = parser.add_argument_group( + "Additional command-line arguments" + ) + TASK_REGISTRY[task_name].add_args(group_args) + globals()[task_name + "_parser"] = parser + + +# automatically import any Python files in the tasks/ directory +tasks_dir = os.path.dirname(__file__) +import_tasks(tasks_dir, "fairseq.tasks") diff --git a/SpeechT5/fairseq/fairseq/tasks/audio_pretraining.py b/SpeechT5/fairseq/fairseq/tasks/audio_pretraining.py new file mode 100644 index 0000000..c642ff5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/audio_pretraining.py @@ -0,0 +1,381 @@ +# Copyright (c) 2017-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the LICENSE file in +# the root directory of this source tree. An additional grant of patent rights +# can be found in the PATENTS file in the same directory. + +import logging +import os +import sys +import torch + +from argparse import Namespace +from dataclasses import dataclass, field +from typing import Optional, Any +from omegaconf import MISSING, II, OmegaConf + +from fairseq.data import ( + AddTargetDataset, + BinarizedAudioDataset, + Dictionary, + FileAudioDataset, + encoders, +) +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.configs import GenerationConfig + +from . import FairseqTask, register_task +from .. import utils +from ..logging import metrics + + +logger = logging.getLogger(__name__) + + +class LabelEncoder(object): + def __init__(self, dictionary): + self.dictionary = dictionary + + def __call__(self, label): + return self.dictionary.encode_line( + label, append_eos=False, add_if_not_exist=False + ) + + +@dataclass +class InferredW2vConfig: + # The following are needed to precompute mask and mask channel indices + # before model's forward. + mask_length: Optional[int] = II("model.mask_length") + mask_prob: Optional[float] = II("model.mask_prob") + mask_selection: Optional[str] = II("model.mask_selection") + mask_other: Optional[float] = II("model.mask_other") + no_mask_overlap: Optional[bool] = II("model.no_mask_overlap") + mask_min_space: Optional[int] = II("model.mask_min_space") + mask_channel_length: Optional[int] = II("model.mask_channel_length") + mask_channel_prob: Optional[float] = II("model.mask_channel_prob") + mask_channel_selection: Optional[str] = II("model.mask_channel_selection") + mask_channel_other: Optional[float] = II("model.mask_channel_other") + no_mask_channel_overlap: Optional[bool] = II("model.no_mask_channel_overlap") + mask_channel_min_space: Optional[int] = II("model.mask_channel_min_space") + + conv_feature_layers: Optional[str] = II("model.conv_feature_layers") + encoder_embed_dim: Optional[int] = II("model.encoder_embed_dim") + + +@dataclass +class AudioPretrainingConfig(FairseqDataclass): + data: str = field(default=MISSING, metadata={"help": "path to data directory"}) + labels: Optional[str] = field( + default=None, + metadata={"help": "extension of the label file to load, used for fine-tuning"}, + ) + binarized_dataset: bool = field( + default=False, + metadata={ + "help": "if true, loads binarized dataset (useful for very large datasets). " + "See examples/wav2vec/scripts/binarize_manifest.sh" + }, + ) + sample_rate: int = field( + default=16_000, + metadata={ + "help": "target sample rate. audio files will be up/down sampled to this rate" + }, + ) + normalize: bool = field( + default=False, + metadata={"help": "if set, normalizes input to have 0 mean and unit variance"}, + ) + enable_padding: bool = field( + default=False, metadata={"help": "pad shorter samples instead of cropping"} + ) + max_sample_size: Optional[int] = field( + default=None, metadata={"help": "max sample size to crop to for batching"} + ) + min_sample_size: Optional[int] = field( + default=None, metadata={"help": "min sample size to skip small examples"} + ) + + # Options for reporting WER metrics during validation. Only applicable to + # Seq2Seq models during fine-tuning + eval_wer: bool = field( + default=False, metadata={"help": "compute WER for Seq2Seq models"} + ) + eval_wer_config: GenerationConfig = field( + default_factory=lambda: GenerationConfig(), + metadata={"help": "beam search config for evaluating wer during training"}, + ) + eval_wer_tokenizer: Any = field( + default=None, + metadata={"help": "tokenizer config for evaluating wer during training"}, + ) + eval_wer_post_process: str = field( + default="letter", + metadata={ + "help": "remove BPE tokens before scoring (can be sentencepiece, letter, and more)" + }, + ) + autoregressive: bool = field( + default=False, + metadata={ + "help": "required for autoregressive decoders (like seq2seq models); " + "adds 'prev_output_tokens' to input and appends eos to target" + }, + ) + num_batch_buckets: int = field( + default=0, + metadata={"help": "number of buckets"}, + ) + precompute_mask_indices: bool = field( + default=False, + metadata={ + "help": "flag to compute mask indices in data preparation.", + }, + ) + + inferred_w2v_config: Optional[InferredW2vConfig] = field( + default=None, + metadata={ + "help": "wav2vec 2.0 masking arguments used to pre-compute masks (required for TPU)", + }, + ) + + tpu: bool = II("common.tpu") + + +@register_task("audio_pretraining", dataclass=AudioPretrainingConfig) +class AudioPretrainingTask(FairseqTask): + """ """ + + cfg: AudioPretrainingConfig + + def __init__( + self, + cfg: AudioPretrainingConfig, + ): + super().__init__(cfg) + if cfg.eval_wer: + assert cfg.labels is not None, "eval_wer can only be set during fine-tuning" + self.blank_symbol = "<s>" + + self.state.add_factory("target_dictionary", self.load_target_dictionary) + + @classmethod + def setup_task(cls, cfg: AudioPretrainingConfig, **kwargs): + """Setup the task (e.g., load dictionaries). + + Args: + cfg (AudioPretrainingConfig): configuration of this task + """ + + return cls(cfg) + + def load_target_dictionary(self): + if self.cfg.labels: + dict_path = os.path.join(self.cfg.data, f"dict.{self.cfg.labels}.txt") + return Dictionary.load(dict_path) + return None + + def _get_mask_precompute_kwargs(self, cfg): + if self.cfg.precompute_mask_indices or self.cfg.tpu: + assert ( + cfg.inferred_w2v_config is not None + ), "inferred_w2v_config must be set" + return OmegaConf.to_container( + cfg.inferred_w2v_config, resolve=True, enum_to_str=True + ) + else: + return {} + + def load_dataset(self, split: str, task_cfg: FairseqDataclass = None, **kwargs): + data_path = self.cfg.data + task_cfg = task_cfg or self.cfg + + # upgrade old task + if isinstance(task_cfg, Namespace): + if not hasattr(task_cfg, "autoregressive"): + task_cfg.autoregressive = not task_cfg.criterion == "ctc" + + if getattr(task_cfg, "binarized_dataset", False): + self.datasets[split] = BinarizedAudioDataset( + data_path, + split=split, + sample_rate=task_cfg.get("sample_rate", self.cfg.sample_rate), + max_sample_size=self.cfg.max_sample_size, + min_sample_size=self.cfg.min_sample_size, + pad=task_cfg.labels is not None or task_cfg.enable_padding, + normalize=task_cfg.normalize, + num_buckets=self.cfg.num_batch_buckets or int(self.cfg.tpu), + compute_mask_indices=(self.cfg.precompute_mask_indices or self.cfg.tpu), + **self._get_mask_precompute_kwargs(task_cfg), + ) + else: + manifest_path = os.path.join(data_path, "{}.tsv".format(split)) + + self.datasets[split] = FileAudioDataset( + manifest_path=manifest_path, + sample_rate=task_cfg.get("sample_rate", self.cfg.sample_rate), + max_sample_size=self.cfg.max_sample_size, + min_sample_size=self.cfg.min_sample_size, + pad=task_cfg.labels is not None or task_cfg.enable_padding, + normalize=task_cfg.normalize, + num_buckets=self.cfg.num_batch_buckets or int(self.cfg.tpu), + compute_mask_indices=(self.cfg.precompute_mask_indices or self.cfg.tpu), + **self._get_mask_precompute_kwargs(task_cfg), + ) + + if self.cfg.tpu and task_cfg["mask_channel_prob"] == 0.0: + logger.info( + "Pretraining on TPUs may suffer convergence " + "issues when training with `mask_channel_prob` value of " + "0. You may want to set this to a low value close to 0." + ) + + if task_cfg.labels: + label_path = os.path.join(data_path, f"{split}.{task_cfg.labels}") + skipped_indices = getattr(self.datasets[split], "skipped_indices", set()) + with open(label_path, "r") as f: + labels = [line for i, line in enumerate(f) if i not in skipped_indices] + + assert len(labels) == len(self.datasets[split]), ( + f"labels length ({len(labels)}) and dataset length " + f"({len(self.datasets[split])}) do not match" + ) + + process_label = LabelEncoder(self.target_dictionary) + + self.datasets[split] = AddTargetDataset( + self.datasets[split], + labels, + pad=self.target_dictionary.pad(), + eos=self.target_dictionary.eos(), + batch_targets=True, + process_label=process_label, + add_to_input=task_cfg.get("autoregressive", False), + ) + + @property + def source_dictionary(self): + return None + + @property + def target_dictionary(self): + """Return the :class:`~fairseq.data.Dictionary` for the language + model.""" + return self.state.target_dictionary + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return (sys.maxsize, sys.maxsize) + + def filter_indices_by_size( + self, + indices, + dataset, + max_positions=None, + ignore_invalid_inputs=False, + ): + # we do not need to filter by size in this task as dataloaders take care of this + return indices + + def valid_step(self, sample, model, criterion): + loss, sample_size, logging_output = super().valid_step(sample, model, criterion) + if self.cfg.eval_wer and self.cfg.autoregressive: + metrics = self._inference_with_wer(self.sequence_generator, sample, model) + logging_output["_num_char_errors"] = metrics["num_char_errors"] + logging_output["_num_chars"] = metrics["num_chars"] + logging_output["_num_word_errors"] = metrics["num_word_errors"] + logging_output["_num_words"] = metrics["num_words"] + return loss, sample_size, logging_output + + def build_model(self, model_cfg: FairseqDataclass): + model = super().build_model(model_cfg) + + if self.cfg.eval_wer and self.cfg.autoregressive: + self.sequence_generator = self.build_generator( + [model], + self.cfg.eval_wer_config, + ) + if self.cfg.eval_wer_tokenizer: + self.tokenizer = encoders.build_tokenizer(self.cfg.eval_wer_tokenizer) + else: + self.tokenizer = None + + actualized_cfg = getattr(model, "cfg", None) + if actualized_cfg is not None: + if "w2v_args" in actualized_cfg: + model_cfg.w2v_args = actualized_cfg.w2v_args + + return model + + def _inference_with_wer(self, generator, sample, model): + import editdistance + + def decode(toks): + s = self.target_dictionary.string( + toks.int().cpu(), + self.cfg.eval_wer_post_process, + escape_unk=True, + ) + if self.tokenizer: + s = self.tokenizer.decode(s) + return s + + num_word_errors, num_char_errors = 0, 0 + num_chars, num_words = 0, 0 + gen_out = self.inference_step(generator, [model], sample, None) + for i in range(len(gen_out)): + hyp = decode(gen_out[i][0]["tokens"]) + ref = decode( + utils.strip_pad(sample["target"][i], self.target_dictionary.pad()), + ) + num_char_errors += editdistance.eval(hyp, ref) + num_chars += len(ref) + hyp_words = hyp.split() + ref_words = ref.split() + num_word_errors += editdistance.eval(hyp_words, ref_words) + num_words += len(ref_words) + + return { + "num_char_errors": num_char_errors, + "num_chars": num_chars, + "num_word_errors": num_word_errors, + "num_words": num_words, + } + + def reduce_metrics(self, logging_outputs, criterion): + super().reduce_metrics(logging_outputs, criterion) + + zero = torch.scalar_tensor(0.0) + num_char_errors = sum( + log.get("_num_char_errors", zero) for log in logging_outputs + ) + num_chars = sum(log.get("_num_chars", zero) for log in logging_outputs) + num_word_errors = sum( + log.get("_num_word_errors", zero) for log in logging_outputs + ) + num_words = sum(log.get("_num_words", zero) for log in logging_outputs) + metrics.log_scalar("_num_char_errors", num_char_errors) + metrics.log_scalar("_num_chars", num_chars) + metrics.log_scalar("_num_word_errors", num_word_errors) + metrics.log_scalar("_num_words", num_words) + if num_chars > 0: + metrics.log_derived( + "uer", + lambda meters: meters["_num_char_errors"].sum + * 100.0 + / meters["_num_chars"].sum + if meters["_num_chars"].sum > 0 + else float("nan"), + ) + if num_words > 0: + metrics.log_derived( + "wer", + lambda meters: meters["_num_word_errors"].sum + * 100.0 + / meters["_num_words"].sum + if meters["_num_words"].sum > 0 + else float("nan"), + ) diff --git a/SpeechT5/fairseq/fairseq/tasks/cross_lingual_lm.py b/SpeechT5/fairseq/fairseq/tasks/cross_lingual_lm.py new file mode 100644 index 0000000..8f8fe7e --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/cross_lingual_lm.py @@ -0,0 +1,191 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import itertools +import logging +import os +from collections import OrderedDict + +import numpy as np +from fairseq import tokenizer, utils +from fairseq.data import ConcatDataset, Dictionary, TokenBlockDataset, data_utils +from fairseq.data.legacy.masked_lm_dataset import MaskedLMDataset +from fairseq.data.legacy.masked_lm_dictionary import MaskedLMDictionary +from fairseq.data.multi_corpus_sampled_dataset import MultiCorpusSampledDataset +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("cross_lingual_lm") +class CrossLingualLMTask(LegacyFairseqTask): + """ + Task for training cross-lingual language models. + + For more details look at: https://arxiv.org/pdf/1901.07291.pdf + + Args: + dictionary (Dictionary): the dictionary for the input of the task + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument( + "data", + help="colon separated path to data directories list, \ + will be iterated upon during epochs in round-robin manner", + ) + parser.add_argument( + "--tokens-per-sample", + default=512, + type=int, + help="max number of total tokens over all segments" " per sample", + ) + parser.add_argument( + "--monolingual-langs", + default="en", + type=str, + help="comma separated list of languages for which we" + " want to train XLM on", + ) + parser.add_argument( + "--shuffle", + action="store_true", + help="shuffle each monolingual dataset while" " training", + ) + + def __init__(self, args, dictionary): + super().__init__(args) + self.dictionary = dictionary + self.seed = args.seed + self.distributed_world_size = args.distributed_world_size + self.langs2id = self._lang_to_id(args.monolingual_langs) + + def _lang_to_id(self, languages: str): + """ + Build a map from languages to ids. These ids are used as segment labels + for cross-lingual LM training. + """ + lang2id = {} + langs = [l.strip() for l in languages.split(",")] + for id, lang in enumerate(langs): + lang2id[lang] = id + return lang2id + + @classmethod + def load_dictionary(cls, filename): + return MaskedLMDictionary.load(filename) + + @classmethod + def build_dictionary( + cls, filenames, workers=1, threshold=-1, nwords=-1, padding_factor=8 + ): + d = MaskedLMDictionary() + for filename in filenames: + Dictionary.add_file_to_dictionary( + filename, d, tokenizer.tokenize_line, workers + ) + d.finalize(threshold=threshold, nwords=nwords, padding_factor=padding_factor) + return d + + @property + def target_dictionary(self): + return self.dictionary + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task.""" + dictionary = MaskedLMDictionary.load(os.path.join(args.data, "dict.txt")) + logger.info("dictionary: {} types".format(len(dictionary))) + return cls(args, dictionary) + + def _load_single_lang_dataset(self, split, epoch): + loaded_datasets = [] + + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + path = os.path.join(data_path, split_k) + + ds = data_utils.load_indexed_dataset( + path, self.dictionary, self.args.dataset_impl + ) + if ds is None: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + # Since we append each block with the classification_token, + # we need to effectively create blocks of length + # tokens_per_sample-1 + loaded_datasets.append( + TokenBlockDataset( + ds, + ds.sizes, + self.args.tokens_per_sample - 1, + pad=self.dictionary.pad(), + eos=self.dictionary.eos(), + ) + ) + + logger.info( + "{} {} {} examples".format(data_path, split_k, len(loaded_datasets[-1])) + ) + + if len(loaded_datasets) == 1: + dataset = loaded_datasets[0] + sizes = dataset.sizes + else: + dataset = ConcatDataset(loaded_datasets) + sizes = np.concatenate([ds.sizes for ds in loaded_datasets]) + + return dataset, sizes + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + dataset_map = OrderedDict() + + for lang in self.langs2id.keys(): + # Datasets are expected to be in "split.lang" format (Eg: train.en) + language_split = "{}.{}".format(split, lang) + + block_dataset, sizes = self._load_single_lang_dataset( + split=language_split, epoch=epoch + ) + + dataset_map[lang] = MaskedLMDataset( + dataset=block_dataset, + sizes=sizes, + vocab=self.dictionary, + pad_idx=self.dictionary.pad(), + mask_idx=self.dictionary.mask(), + classif_token_idx=self.dictionary.eos(), + sep_token_idx=self.dictionary.eos(), + shuffle=getattr(self.args, "shuffle", False), + has_pairs=False, + segment_id=self.langs2id[lang], + seed=self.seed, + ) + + self.datasets[split] = MultiCorpusSampledDataset(dataset_map) + logger.info( + "{} {} {} examples".format( + utils.split_paths(self.args.data)[epoch - 1], + split, + len(self.datasets[split]), + ) + ) diff --git a/SpeechT5/fairseq/fairseq/tasks/denoising.py b/SpeechT5/fairseq/fairseq/tasks/denoising.py new file mode 100644 index 0000000..cbf01e1 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/denoising.py @@ -0,0 +1,274 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os + +from fairseq import utils +from fairseq.data import ( + AppendTokenDataset, + DenoisingDataset, + Dictionary, + IdDataset, + NestedDictionaryDataset, + NumelDataset, + PadDataset, + PrependTokenDataset, + StripTokenDataset, + TokenBlockDataset, + data_utils, +) +from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq.data.shorten_dataset import maybe_shorten_dataset +from fairseq.tasks import LegacyFairseqTask, register_task +import numpy as np + + +logger = logging.getLogger(__name__) + + +@register_task("denoising") +class DenoisingTask(LegacyFairseqTask): + """ + Denoising task for applying sequence to sequence denoising. (ie. BART) + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument("data", help="path to data directory") + parser.add_argument( + "--tokens-per-sample", + default=512, + type=int, + help="max number of total tokens over all segments" + " per sample for dataset", + ) + parser.add_argument( + "--sample-break-mode", + default="complete_doc", + type=str, + help="mode for breaking sentence", + ) + parser.add_argument( + "--mask", + default=0.0, + type=float, + help="fraction of words/subwords that will be masked", + ) + parser.add_argument( + "--mask-random", + default=0.0, + type=float, + help="instead of using [MASK], use random token this often", + ) + parser.add_argument( + "--insert", + default=0.0, + type=float, + help="insert this percentage of additional random tokens", + ) + parser.add_argument( + "--permute", + default=0.0, + type=float, + help="take this proportion of subwords and permute them", + ) + parser.add_argument( + "--rotate", + default=0.5, + type=float, + help="rotate this proportion of inputs", + ) + parser.add_argument( + "--poisson-lambda", + default=3.0, + type=float, + help="randomly shuffle sentences for this proportion of inputs", + ) + parser.add_argument( + "--permute-sentences", + default=0.0, + type=float, + help="shuffle this proportion of sentences in all inputs", + ) + parser.add_argument( + "--mask-length", + default="subword", + type=str, + choices=["subword", "word", "span-poisson"], + help="mask length to choose", + ) + parser.add_argument( + "--replace-length", + default=-1, + type=int, + help="when masking N tokens, replace with 0, 1, or N tokens (use -1 for N)", + ) + parser.add_argument( + "--max-source-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the source sequence", + ) + parser.add_argument( + "--max-target-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the target sequence", + ) + + parser.add_argument( + "--shorten-method", + default="none", + choices=["none", "truncate", "random_crop"], + help="if not none, shorten sequences that exceed --tokens-per-sample", + ) + parser.add_argument( + "--shorten-data-split-list", + default="", + help="comma-separated list of dataset splits to apply shortening to, " + 'e.g., "train,valid" (default: all dataset splits)', + ) + + + def __init__(self, args, dictionary): + super().__init__(args) + self.dictionary = dictionary + self.seed = args.seed + + # add mask token + self.mask_idx = self.dictionary.add_symbol("<mask>") + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task.""" + dictionary = Dictionary.load(os.path.join(args.data, "dict.txt")) + logger.info("dictionary: {} types".format(len(dictionary))) + if not hasattr(args, "shuffle_instance"): + args.shuffle_instance = False + return cls(args, dictionary) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + split_path = os.path.join(data_path, split) + + dataset = data_utils.load_indexed_dataset( + split_path, + self.dictionary, + self.args.dataset_impl, + combine=combine, + ) + if dataset is None: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, split_path) + ) + + dataset = StripTokenDataset(dataset, self.dictionary.eos()) + + dataset = maybe_shorten_dataset( + dataset, + split, + self.args.shorten_data_split_list, + self.args.shorten_method, + self.args.tokens_per_sample, + self.args.seed, + ) + + # create continuous blocks of tokens + dataset = TokenBlockDataset( + dataset, + dataset.sizes, + self.args.tokens_per_sample - 2, # one less for <s> and one for </s> + pad=self.dictionary.pad(), + eos=self.dictionary.eos(), + break_mode=self.args.sample_break_mode, + document_sep_len=0, + ) + + # prepend beginning-of-sentence token (<s>, equiv. to [CLS] in BERT) + dataset = PrependTokenDataset(dataset, self.source_dictionary.bos()) + dataset = AppendTokenDataset(dataset, self.source_dictionary.eos()) + + mask_whole_words = ( + get_whole_word_mask(self.args, self.source_dictionary) + if self.args.mask_length != "subword" + else None + ) + + self.datasets[split] = DenoisingDataset( + dataset, + dataset.sizes, + self.dictionary, + self.mask_idx, + mask_whole_words, + shuffle=self.args.shuffle_instance, + seed=self.seed, + args=self.args, + ) + logger.info( + "Split: {0}, Loaded {1} samples of denoising_dataset".format( + split, + len(self.datasets[split]), + ) + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, **kwargs): + """ + Generate batches for inference. We assume that the input begins with a + bos symbol (`<s>`) and ends with an eos symbol (`</s>`). + """ + pad = self.source_dictionary.pad() + eos = self.source_dictionary.eos() + src_dataset = TokenBlockDataset( + src_tokens, + src_lengths, + block_size=self.args.tokens_per_sample - 2, # for <s> and </s> + pad=pad, + eos=eos, + break_mode=self.args.sample_break_mode, + document_sep_len=0, + ) + prev_output_tokens = PrependTokenDataset( + StripTokenDataset(src_dataset, eos), eos + ) + src_dataset = PadDataset(src_dataset, pad_idx=pad, left_pad=False) + return NestedDictionaryDataset( + { + "id": IdDataset(), + "net_input": { + "src_tokens": src_dataset, + "src_lengths": NumelDataset(src_dataset, reduce=False), + "prev_output_tokens": PadDataset( + prev_output_tokens, pad_idx=pad, left_pad=False + ), + }, + "target": src_dataset, + }, + sizes=[np.array(src_lengths)], + ) + + def max_positions(self): + """Return the max sentence length allowed by the task.""" + return (self.args.max_source_positions, self.args.max_target_positions) + + @property + def source_dictionary(self): + """Return the source :class:`~fairseq.data.Dictionary`.""" + return self.dictionary + + @property + def target_dictionary(self): + """Return the target :class:`~fairseq.data.Dictionary`.""" + return self.dictionary diff --git a/SpeechT5/fairseq/fairseq/tasks/fairseq_task.py b/SpeechT5/fairseq/fairseq/tasks/fairseq_task.py new file mode 100644 index 0000000..fbec9bb --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/fairseq_task.py @@ -0,0 +1,677 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import warnings +from argparse import Namespace +from typing import Any, Callable, Dict, List + +import torch +from fairseq import metrics, search, tokenizer, utils +from fairseq.data import Dictionary, FairseqDataset, data_utils, encoders, iterators +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import gen_parser_from_dataclass +from fairseq.optim.amp_optimizer import AMPOptimizer +from omegaconf import DictConfig + + +logger = logging.getLogger(__name__) + + +class StatefulContainer(object): + + _state: Dict[str, Any] = dict() + _factories: Dict[str, Callable[[], Any]] = dict() + + def add_factory(self, name, factory: Callable[[], Any]): + self._factories[name] = factory + + def merge_state_dict(self, state_dict: Dict[str, Any]): + self._state.update(state_dict) + + @property + def state_dict(self) -> Dict[str, Any]: + return self._state + + def __getattr__(self, name): + if name not in self._state and name in self._factories: + self._state[name] = self._factories[name]() + + if name in self._state: + return self._state[name] + + raise AttributeError(f"Task state has no factory for attribute {name}") + + +class FairseqTask(object): + """ + Tasks store dictionaries and provide helpers for loading/iterating over + Datasets, initializing the Model/Criterion and calculating the loss. + + Tasks have limited statefulness. In particular, state that needs to be + saved to/loaded from checkpoints needs to be stored in the `self.state` + :class:`StatefulContainer` object. For example:: + + self.state.add_factory("dictionary", self.load_dictionary) + print(self.state.dictionary) # calls self.load_dictionary() + + This is necessary so that when loading checkpoints, we can properly + recreate the task state after initializing the task instance. + """ + + @classmethod + def add_args(cls, parser): + """Add task-specific arguments to the parser.""" + dc = getattr(cls, "__dataclass", None) + if dc is not None: + gen_parser_from_dataclass(parser, dc()) + + @staticmethod + def logging_outputs_can_be_summed(criterion) -> bool: + """ + Whether the logging outputs returned by `train_step` and `valid_step` can + be summed across workers prior to calling `aggregate_logging_outputs`. + Setting this to True will improves distributed training speed. + """ + return criterion.logging_outputs_can_be_summed() + + cfg: FairseqDataclass + datasets: Dict[str, FairseqDataset] + dataset_to_epoch_iter: Dict[FairseqDataset, Any] + state: StatefulContainer = None + + def __init__(self, cfg: FairseqDataclass, **kwargs): + self.cfg = cfg + self.datasets = dict() + self.dataset_to_epoch_iter = dict() + self.state = StatefulContainer() + + @classmethod + def load_dictionary(cls, filename): + """Load the dictionary from the filename + + Args: + filename (str): the filename + """ + return Dictionary.load(filename) + + @classmethod + def build_dictionary( + cls, filenames, workers=1, threshold=-1, nwords=-1, padding_factor=8 + ): + """Build the dictionary + + Args: + filenames (list): list of filenames + workers (int): number of concurrent workers + threshold (int): defines the minimum word count + nwords (int): defines the total number of words in the final dictionary, + including special symbols + padding_factor (int): can be used to pad the dictionary size to be a + multiple of 8, which is important on some hardware (e.g., Nvidia + Tensor Cores). + """ + d = Dictionary() + for filename in filenames: + Dictionary.add_file_to_dictionary( + filename, d, tokenizer.tokenize_line, workers + ) + d.finalize(threshold=threshold, nwords=nwords, padding_factor=padding_factor) + return d + + @classmethod + def setup_task(cls, cfg: DictConfig, **kwargs): + """Setup the task (e.g., load dictionaries). + + Args: + cfg (omegaconf.DictConfig): parsed command-line arguments + """ + return cls(cfg, **kwargs) + + def has_sharded_data(self, split): + return os.pathsep in getattr(self.cfg, "data", "") + + def load_dataset( + self, + split: str, + combine: bool = False, + task_cfg: FairseqDataclass = None, + **kwargs + ): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + combine (bool): combines a split segmented into pieces into one dataset + task_cfg (FairseqDataclass): optional task configuration stored in the checkpoint that can be used + to load datasets + """ + raise NotImplementedError + + def dataset(self, split): + """ + Return a loaded dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + + Returns: + a :class:`~fairseq.data.FairseqDataset` corresponding to *split* + """ + from fairseq.data import FairseqDataset + + if split not in self.datasets: + raise KeyError("Dataset not loaded: " + split) + if not isinstance(self.datasets[split], FairseqDataset): + raise TypeError("Datasets are expected to be of type FairseqDataset") + return self.datasets[split] + + def filter_indices_by_size( + self, indices, dataset, max_positions=None, ignore_invalid_inputs=False + ): + """ + Filter examples that are too large + + Args: + indices (np.array): original array of sample indices + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + Returns: + np.array: array of filtered sample indices + """ + indices, ignored = dataset.filter_indices_by_size(indices, max_positions) + if len(ignored) > 0: + if not ignore_invalid_inputs: + raise Exception( + ( + "Size of sample #{} is invalid (={}) since max_positions={}, " + "skip this example with --skip-invalid-size-inputs-valid-test" + ).format(ignored[0], dataset.size(ignored[0]), max_positions) + ) + logger.warning( + ( + "{:,} samples have invalid sizes and will be skipped, " + "max_positions={}, first few sample ids={}" + ).format(len(ignored), max_positions, ignored[:10]) + ) + return indices + + def can_reuse_epoch_itr(self, dataset): + # We can reuse the epoch iterator across epochs as long as the dataset + # hasn't disabled it. We default to ``False`` here, although in practice + # this will be ``True`` for most datasets that inherit from + # ``FairseqDataset`` due to the base implementation there. + return getattr(dataset, "can_reuse_epoch_itr_across_epochs", False) + + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + ): + """ + Get an iterator that yields batches of data from the given dataset. + + Args: + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_tokens (int, optional): max number of tokens in each batch + (default: None). + max_sentences (int, optional): max number of sentences in each + batch (default: None). + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + required_batch_size_multiple (int, optional): require batch size to + be a multiple of N (default: 1). + seed (int, optional): seed for random number generator for + reproducibility (default: 1). + num_shards (int, optional): shard the data iterator into N + shards (default: 1). + shard_id (int, optional): which shard of the data iterator to + return (default: 0). + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 1). + data_buffer_size (int, optional): number of batches to + preload (default: 0). + disable_iterator_cache (bool, optional): don't cache the + EpochBatchIterator (ignores `FairseqTask::can_reuse_epoch_itr`) + (default: False). + Returns: + ~fairseq.iterators.EpochBatchIterator: a batched iterator over the + given dataset split + """ + can_reuse_epoch_itr = not disable_iterator_cache and self.can_reuse_epoch_itr( + dataset + ) + if can_reuse_epoch_itr and dataset in self.dataset_to_epoch_iter: + logger.debug("reusing EpochBatchIterator for epoch {}".format(epoch)) + return self.dataset_to_epoch_iter[dataset] + + assert isinstance(dataset, FairseqDataset) + + # initialize the dataset with the correct starting epoch + dataset.set_epoch(epoch) + + # get indices ordered by example size + with data_utils.numpy_seed(seed): + indices = dataset.ordered_indices() + + # filter examples that are too large + if max_positions is not None: + indices = self.filter_indices_by_size( + indices, dataset, max_positions, ignore_invalid_inputs + ) + + # create mini-batches with given size constraints + batch_sampler = dataset.batch_by_size( + indices, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + + # return a reusable, sharded iterator + epoch_iter = iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + ) + + if can_reuse_epoch_itr: + self.dataset_to_epoch_iter[dataset] = epoch_iter + + return epoch_iter + + def build_model(self, cfg: FairseqDataclass): + """ + Build the :class:`~fairseq.models.BaseFairseqModel` instance for this + task. + + Args: + cfg (FairseqDataclass): configuration object + + Returns: + a :class:`~fairseq.models.BaseFairseqModel` instance + """ + from fairseq import models, quantization_utils + + model = models.build_model(cfg, self) + model = quantization_utils.quantize_model_scalar(model, cfg) + return model + + def build_criterion(self, cfg: DictConfig): + """ + Build the :class:`~fairseq.criterions.FairseqCriterion` instance for + this task. + + Args: + cfg (omegaconf.DictConfig): configration object + + Returns: + a :class:`~fairseq.criterions.FairseqCriterion` instance + """ + from fairseq import criterions + + return criterions.build_criterion(cfg, self) + + def build_generator( + self, models, args, seq_gen_cls=None, extra_gen_cls_kwargs=None, prefix_allowed_tokens_fn=None, + ): + """ + Build a :class:`~fairseq.SequenceGenerator` instance for this + task. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + args (fairseq.dataclass.configs.GenerationConfig): + configuration object (dataclass) for generation + extra_gen_cls_kwargs (Dict[str, Any]): extra options to pass + through to SequenceGenerator + prefix_allowed_tokens_fn (Callable[[int, torch.Tensor], List[int]]): + If provided, this function constrains the beam search to + allowed tokens only at each step. The provided function + should take 2 arguments: the batch ID (`batch_id: int`) + and a unidimensional tensor of token ids (`inputs_ids: + torch.Tensor`). It has to return a `List[int]` with the + allowed tokens for the next generation step conditioned + on the previously generated tokens (`inputs_ids`) and + the batch ID (`batch_id`). This argument is useful for + constrained generation conditioned on the prefix, as + described in "Autoregressive Entity Retrieval" + (https://arxiv.org/abs/2010.00904) and + https://github.com/facebookresearch/GENRE. + """ + if getattr(args, "score_reference", False): + from fairseq.sequence_scorer import SequenceScorer + + return SequenceScorer( + self.target_dictionary, + compute_alignment=getattr(args, "print_alignment", False), + ) + + from fairseq.sequence_generator import ( + SequenceGenerator, + SequenceGeneratorWithAlignment, + ) + try: + from fairseq.fb_sequence_generator import FBSequenceGenerator + except ModuleNotFoundError: + pass + + # Choose search strategy. Defaults to Beam Search. + sampling = getattr(args, "sampling", False) + sampling_topk = getattr(args, "sampling_topk", -1) + sampling_topp = getattr(args, "sampling_topp", -1.0) + diverse_beam_groups = getattr(args, "diverse_beam_groups", -1) + diverse_beam_strength = getattr(args, "diverse_beam_strength", 0.5) + match_source_len = getattr(args, "match_source_len", False) + diversity_rate = getattr(args, "diversity_rate", -1) + constrained = getattr(args, "constraints", False) + if prefix_allowed_tokens_fn is None: + prefix_allowed_tokens_fn = getattr(args, "prefix_allowed_tokens_fn", None) + if ( + sum( + int(cond) + for cond in [ + sampling, + diverse_beam_groups > 0, + match_source_len, + diversity_rate > 0, + ] + ) + > 1 + ): + raise ValueError("Provided Search parameters are mutually exclusive.") + assert sampling_topk < 0 or sampling, "--sampling-topk requires --sampling" + assert sampling_topp < 0 or sampling, "--sampling-topp requires --sampling" + + if sampling: + search_strategy = search.Sampling( + self.target_dictionary, sampling_topk, sampling_topp + ) + elif diverse_beam_groups > 0: + search_strategy = search.DiverseBeamSearch( + self.target_dictionary, diverse_beam_groups, diverse_beam_strength + ) + elif match_source_len: + # this is useful for tagging applications where the output + # length should match the input length, so we hardcode the + # length constraints for simplicity + search_strategy = search.LengthConstrainedBeamSearch( + self.target_dictionary, + min_len_a=1, + min_len_b=0, + max_len_a=1, + max_len_b=0, + ) + elif diversity_rate > -1: + search_strategy = search.DiverseSiblingsSearch( + self.target_dictionary, diversity_rate + ) + elif constrained: + search_strategy = search.LexicallyConstrainedBeamSearch( + self.target_dictionary, args.constraints + ) + elif prefix_allowed_tokens_fn: + search_strategy = search.PrefixConstrainedBeamSearch( + self.target_dictionary, prefix_allowed_tokens_fn + ) + else: + search_strategy = search.BeamSearch(self.target_dictionary) + + extra_gen_cls_kwargs = extra_gen_cls_kwargs or {} + if seq_gen_cls is None: + if getattr(args, "print_alignment", False): + seq_gen_cls = SequenceGeneratorWithAlignment + extra_gen_cls_kwargs["print_alignment"] = args.print_alignment + elif getattr(args, "fb_seq_gen", False): + seq_gen_cls = FBSequenceGenerator + else: + seq_gen_cls = SequenceGenerator + + return seq_gen_cls( + models, + self.target_dictionary, + beam_size=getattr(args, "beam", 5), + max_len_a=getattr(args, "max_len_a", 0), + max_len_b=getattr(args, "max_len_b", 200), + min_len=getattr(args, "min_len", 1), + normalize_scores=(not getattr(args, "unnormalized", False)), + len_penalty=getattr(args, "lenpen", 1), + unk_penalty=getattr(args, "unkpen", 0), + temperature=getattr(args, "temperature", 1.0), + match_source_len=getattr(args, "match_source_len", False), + no_repeat_ngram_size=getattr(args, "no_repeat_ngram_size", 0), + search_strategy=search_strategy, + **extra_gen_cls_kwargs, + ) + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + """ + Do forward and backward, and return the loss as computed by *criterion* + for the given *model* and *sample*. + + Args: + sample (dict): the mini-batch. The format is defined by the + :class:`~fairseq.data.FairseqDataset`. + model (~fairseq.models.BaseFairseqModel): the model + criterion (~fairseq.criterions.FairseqCriterion): the criterion + optimizer (~fairseq.optim.FairseqOptimizer): the optimizer + update_num (int): the current update + ignore_grad (bool): multiply loss by 0 if this is set to True + + Returns: + tuple: + - the loss + - the sample size, which is used as the denominator for the + gradient + - logging outputs to display while training + """ + model.train() + model.set_num_updates(update_num) + with torch.autograd.profiler.record_function("forward"): + with torch.cuda.amp.autocast(enabled=(isinstance(optimizer, AMPOptimizer))): + loss, sample_size, logging_output = criterion(model, sample) + if ignore_grad: + loss *= 0 + with torch.autograd.profiler.record_function("backward"): + optimizer.backward(loss) + return loss, sample_size, logging_output + + def valid_step(self, sample, model, criterion): + model.eval() + with torch.no_grad(): + loss, sample_size, logging_output = criterion(model, sample) + return loss, sample_size, logging_output + + def optimizer_step(self, optimizer, model, update_num): + optimizer.step() + + def build_dataset_for_inference( + self, src_tokens: List[torch.Tensor], src_lengths: List[int], **kwargs + ) -> torch.utils.data.Dataset: + raise NotImplementedError + + def inference_step( + self, generator, models, sample, prefix_tokens=None, constraints=None + ): + with torch.no_grad(): + return generator.generate( + models, sample, prefix_tokens=prefix_tokens, constraints=constraints + ) + + def begin_epoch(self, epoch, model): + """Hook function called before the start of each epoch.""" + pass + + def begin_valid_epoch(self, epoch, model): + """Hook function called before the start of each validation epoch.""" + pass + + def aggregate_logging_outputs(self, logging_outputs, criterion): + """[deprecated] Aggregate logging outputs from data parallel training.""" + utils.deprecation_warning( + "The aggregate_logging_outputs API is deprecated. " + "Please use the reduce_metrics API instead." + ) + with metrics.aggregate() as agg: + self.reduce_metrics(logging_outputs, criterion) + return agg.get_smoothed_values() + + def reduce_metrics(self, logging_outputs, criterion): + """Aggregate logging outputs from data parallel training.""" + # backward compatibility for tasks that override aggregate_logging_outputs + base_func = FairseqTask.aggregate_logging_outputs + self_func = getattr(self, "aggregate_logging_outputs").__func__ + if self_func is not base_func: + utils.deprecation_warning( + "Tasks should implement the reduce_metrics API. " + "Falling back to deprecated aggregate_logging_outputs API." + ) + agg_logging_outputs = self.aggregate_logging_outputs( + logging_outputs, criterion + ) + for k, v in agg_logging_outputs.items(): + metrics.log_scalar(k, v) + return + + if not any("ntokens" in log for log in logging_outputs): + warnings.warn( + "ntokens not found in Criterion logging outputs, cannot log wpb or wps" + ) + else: + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + metrics.log_scalar("wpb", ntokens, priority=180, round=1) + metrics.log_speed("wps", ntokens, priority=90, round=1) + + if not any("nsentences" in log for log in logging_outputs): + warnings.warn( + "nsentences not found in Criterion logging outputs, cannot log bsz" + ) + else: + nsentences = sum(log.get("nsentences", 0) for log in logging_outputs) + metrics.log_scalar("bsz", nsentences, priority=190, round=1) + + criterion.__class__.reduce_metrics(logging_outputs) + + def state_dict(self): + if self.state is not None: + return self.state.state_dict + return {} + + def load_state_dict(self, state_dict: Dict[str, Any]): + if self.state is not None: + self.state.merge_state_dict(state_dict) + + def max_positions(self): + """Return the max input length allowed by the task.""" + return None + + @property + def source_dictionary(self): + """Return the source :class:`~fairseq.data.Dictionary` (if applicable + for this task).""" + raise NotImplementedError + + @property + def target_dictionary(self): + """Return the target :class:`~fairseq.data.Dictionary` (if applicable + for this task).""" + raise NotImplementedError + + def build_tokenizer(self, args): + """Build the pre-tokenizer for this task.""" + return encoders.build_tokenizer(args) + + def build_bpe(self, args): + """Build the tokenizer for this task.""" + return encoders.build_bpe(args) + + def get_interactive_tokens_and_lengths(self, lines, encode_fn): + tokens = [ + self.source_dictionary.encode_line( + encode_fn(src_str), add_if_not_exist=False + ).long() + for src_str in lines + ] + lengths = [t.numel() for t in tokens] + return tokens, lengths + + +class LegacyFairseqTask(FairseqTask): + def __init__(self, args: Namespace): + self.args = args + self.datasets = {} + self.dataset_to_epoch_iter = {} + + @classmethod + def setup_task(cls, args: Namespace, **kwargs): + """Setup the task (e.g., load dictionaries). + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + return cls(args, **kwargs) + + def has_sharded_data(self, split): + return os.pathsep in getattr(self.args, "data", "") + + def build_model(self, args: Namespace): + """ + Build the :class:`~fairseq.models.BaseFairseqModel` instance for this + task. + + Args: + args (argparse.Namespace): parsed command-line arguments + + Returns: + a :class:`~fairseq.models.BaseFairseqModel` instance + """ + from fairseq import models, quantization_utils + + model = models.build_model(args, self) + model = quantization_utils.quantize_model_scalar(model, args) + return model + + def build_criterion(self, args: Namespace): + """ + Build the :class:`~fairseq.criterions.FairseqCriterion` instance for + this task. + + Args: + args (argparse.Namespace): parsed command-line arguments + + Returns: + a :class:`~fairseq.criterions.FairseqCriterion` instance + """ + from fairseq import criterions + + return criterions.build_criterion(args, self) diff --git a/SpeechT5/fairseq/fairseq/tasks/hubert_pretraining.py b/SpeechT5/fairseq/fairseq/tasks/hubert_pretraining.py new file mode 100644 index 0000000..ee3fedc --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/hubert_pretraining.py @@ -0,0 +1,193 @@ +# Copyright (c) 2017-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the license found in the LICENSE file in +# the root directory of this source tree. An additional grant of patent rights +# can be found in the PATENTS file in the same directory. + +import logging +import os +import sys +from typing import Dict, List, Optional, Tuple + +import numpy as np + +from dataclasses import dataclass, field +from fairseq.data import Dictionary, HubertDataset +from fairseq.dataclass.configs import FairseqDataclass +from fairseq.tasks import register_task +from fairseq.tasks.fairseq_task import FairseqTask +from omegaconf import MISSING + +logger = logging.getLogger(__name__) + + +class LabelEncoder(object): + def __init__(self, dictionary: Dictionary) -> None: + self.dictionary = dictionary + + def __call__(self, label: str) -> List[str]: + return self.dictionary.encode_line( + label, append_eos=False, add_if_not_exist=False, + ) + + +@dataclass +class HubertPretrainingConfig(FairseqDataclass): + data: str = field( + default=MISSING, metadata={"help": "path to data directory"} + ) + fine_tuning: bool = field( + default=False, metadata={"help": "set to true if fine-tuning Hubert"} + ) + labels: List[str] = field( + default_factory=lambda: ["ltr"], + metadata={ + "help": ( + "extension of the label files to load, frame-level labels for" + " pre-training, and sequence-level label for fine-tuning" + ) + }, + ) + label_dir: Optional[str] = field( + default=None, + metadata={ + "help": "if set, looks for labels in this directory instead", + }, + ) + label_rate: int = field( + default=-1, + metadata={"help": "label frame rate. -1 for sequence label"}, + ) + sample_rate: int = field( + default=16_000, + metadata={ + "help": "target sample rate. audio files will be up/down " + "sampled to this rate" + }, + ) + normalize: bool = field( + default=False, + metadata={ + "help": "if set, normalizes input to have 0 mean and unit variance" + }, + ) + enable_padding: bool = field( + default=False, + metadata={"help": "pad shorter samples instead of cropping"}, + ) + max_sample_size: Optional[int] = field( + default=None, + metadata={"help": "max sample size to crop to for batching"}, + ) + min_sample_size: Optional[int] = field( + default=None, + metadata={"help": "min sample size to crop to for batching"}, + ) + single_target: Optional[bool] = field( + default=False, + metadata={ + "help": "if set, AddTargetDatasets outputs same keys " + "as AddTargetDataset" + }, + ) + random_crop: Optional[bool] = field( + default=True, + metadata={"help": "always crop from the beginning if false"}, + ) + pad_audio: Optional[bool] = field( + default=False, + metadata={"help": "pad audio to the longest one in the batch if true"}, + ) + + +@register_task("hubert_pretraining", dataclass=HubertPretrainingConfig) +class HubertPretrainingTask(FairseqTask): + + cfg: HubertPretrainingConfig + + def __init__( + self, + cfg: HubertPretrainingConfig, + ) -> None: + super().__init__(cfg) + + logger.info(f"current directory is {os.getcwd()}") + logger.info(f"HubertPretrainingTask Config {cfg}") + + self.cfg = cfg + self.fine_tuning = cfg.fine_tuning + + if cfg.fine_tuning: + self.state.add_factory("target_dictionary", self.load_dictionaries) + else: + self.state.add_factory("dictionaries", self.load_dictionaries) + + self._source_dictionary = None + + self.blank_symbol = "<s>" + + @property + def source_dictionary(self) -> Optional[Dictionary]: + return self._source_dictionary + + @property + def target_dictionary(self) -> Optional[Dictionary]: + return self.state.target_dictionary + + @property + def dictionaries(self) -> List[Dictionary]: + return self.state.dictionaries + + @classmethod + def setup_task( + cls, cfg: HubertPretrainingConfig, **kwargs + ) -> "HubertPretrainingTask": + return cls(cfg) + + def load_dictionaries(self): + label_dir = self.cfg.data if self.cfg.label_dir is None else self.cfg.label_dir + dictionaries = [Dictionary.load(f"{label_dir}/dict.{label}.txt") for label in self.cfg.labels] + return dictionaries[0] if self.cfg.fine_tuning else dictionaries + + def get_label_dir(self) -> str: + if self.cfg.label_dir is None: + return self.cfg.data + return self.cfg.label_dir + + def load_dataset(self, split: str, **kwargs) -> None: + manifest = f"{self.cfg.data}/{split}.tsv" + dicts = [self.target_dictionary] if self.cfg.fine_tuning else self.dictionaries + pad_list = [dict.pad() for dict in dicts] + eos_list = [dict.eos() for dict in dicts] + procs = [LabelEncoder(dict) for dict in dicts] + paths = [ + f"{self.get_label_dir()}/{split}.{l}" for l in self.cfg.labels + ] + + # hubert v1: pad_audio=True, random_crop=False; + self.datasets[split] = HubertDataset( + manifest, + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=None, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=False, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + ) + + def max_positions(self) -> Tuple[int, int]: + return (sys.maxsize, sys.maxsize) + + def filter_indices_by_size( + self, indices: np.array, *args, **kwargs + ) -> np.array: + return indices diff --git a/SpeechT5/fairseq/fairseq/tasks/language_modeling.py b/SpeechT5/fairseq/fairseq/tasks/language_modeling.py new file mode 100644 index 0000000..4b76a51 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/language_modeling.py @@ -0,0 +1,379 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import torch +from fairseq import utils +from fairseq.data import ( + AppendTokenDataset, + Dictionary, + IdDataset, + LMContextWindowDataset, + MonolingualDataset, + NestedDictionaryDataset, + NumelDataset, + PadDataset, + PrependTokenDataset, + StripTokenDataset, + TokenBlockDataset, + TruncatedDictionary, + data_utils, +) +from fairseq.data.indexed_dataset import get_available_dataset_impl +from fairseq.data.shorten_dataset import maybe_shorten_dataset +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.tasks import LegacyFairseqTask, register_task +from omegaconf import II + + +SAMPLE_BREAK_MODE_CHOICES = ChoiceEnum(["none", "complete", "complete_doc", "eos"]) +SHORTEN_METHOD_CHOICES = ChoiceEnum(["none", "truncate", "random_crop"]) +logger = logging.getLogger(__name__) + + +@dataclass +class LanguageModelingConfig(FairseqDataclass): + data: Optional[str] = field( + default=None, metadata={"help": "path to data directory"} + ) + sample_break_mode: SAMPLE_BREAK_MODE_CHOICES = field( + default="none", + metadata={ + "help": 'If omitted or "none", fills each sample with tokens-per-sample ' + 'tokens. If set to "complete", splits samples only at the end ' + "of sentence, but may include multiple sentences per sample. " + '"complete_doc" is similar but respects doc boundaries. ' + 'If set to "eos", includes only one sentence per sample.' + }, + ) + tokens_per_sample: int = field( + default=1024, + metadata={"help": "max number of tokens per sample for LM dataset"}, + ) + output_dictionary_size: int = field( + default=-1, metadata={"help": "limit the size of output dictionary"} + ) + self_target: bool = field(default=False, metadata={"help": "include self target"}) + future_target: bool = field( + default=False, metadata={"help": "include future target"} + ) + past_target: bool = field(default=False, metadata={"help": "include past target"}) + add_bos_token: bool = field( + default=False, metadata={"help": "prepend beginning of sentence token (<s>)"} + ) + max_target_positions: Optional[int] = field( + default=None, metadata={"help": "max number of tokens in the target sequence"} + ) + shorten_method: SHORTEN_METHOD_CHOICES = field( + default="none", + metadata={ + "help": "if not none, shorten sequences that exceed --tokens-per-sample" + }, + ) + shorten_data_split_list: str = field( + default="", + metadata={ + "help": "comma-separated list of dataset splits to apply shortening to, " + 'e.g., "train,valid" (default: all dataset splits)' + }, + ) + pad_to_fixed_length: Optional[bool] = field( + default=False, metadata={"help": "pad to fixed length"}, + ) + pad_to_fixed_bsz: Optional[bool] = field( + default=False, metadata={"help": "boolean to pad to fixed batch size"}, + ) + + # TODO common vars below add to parent + seed: int = II("common.seed") + batch_size: Optional[int] = II("dataset.batch_size") + batch_size_valid: Optional[int] = II("dataset.batch_size_valid") + dataset_impl: Optional[ChoiceEnum(get_available_dataset_impl())] = II( + "dataset.dataset_impl" + ) + data_buffer_size: int = II("dataset.data_buffer_size") + tpu: bool = II("common.tpu") + use_plasma_view: bool = II("common.use_plasma_view") + plasma_path: str = II("common.plasma_path") + + +@register_task("language_modeling", dataclass=LanguageModelingConfig) +class LanguageModelingTask(LegacyFairseqTask): + """ + Train a language model. + + Args: + dictionary (~fairseq.data.Dictionary): the dictionary for the input of + the language model + output_dictionary (~fairseq.data.Dictionary): the dictionary for the + output of the language model. In most cases it will be the same as + *dictionary*, but could possibly be a more limited version of the + dictionary (if ``--output-dictionary-size`` is used). + targets (List[str]): list of the target types that the language model + should predict. Can be one of "self", "future", and "past". + Defaults to "future". + + .. note:: + + The language modeling task is compatible with :mod:`fairseq-train`, + :mod:`fairseq-generate`, :mod:`fairseq-interactive` and + :mod:`fairseq-eval-lm`. + + The language modeling task provides the following additional command-line + arguments: + + .. argparse:: + :ref: fairseq.tasks.language_modeling_parser + :prog: + """ + + def __init__(self, args, dictionary, output_dictionary=None, targets=None): + super().__init__(args) + self.dictionary = dictionary + self.output_dictionary = output_dictionary or dictionary + + if targets is None: + targets = ["future"] + self.targets = targets + + @classmethod + def setup_dictionary(cls, args, **kwargs): + dictionary = None + output_dictionary = None + if args.data: + paths = utils.split_paths(args.data) + assert len(paths) > 0 + dictionary = Dictionary.load(os.path.join(paths[0], "dict.txt")) + logger.info("dictionary: {} types".format(len(dictionary))) + output_dictionary = dictionary + if args.output_dictionary_size >= 0: + output_dictionary = TruncatedDictionary( + dictionary, args.output_dictionary_size + ) + return (dictionary, output_dictionary) + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task (e.g., load dictionaries). + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + dictionary, output_dictionary = cls.setup_dictionary(args, **kwargs) + + # upgrade old checkpoints + if getattr(args, "exclude_self_target", False): + args.self_target = False + + targets = [] + if getattr(args, "self_target", False): + targets.append("self") + if getattr(args, "future_target", False): + targets.append("future") + if getattr(args, "past_target", False): + targets.append("past") + if len(targets) == 0: + # standard language modeling + targets = ["future"] + + return cls(args, dictionary, output_dictionary, targets=targets) + + def build_model(self, args): + model = super().build_model(args) + for target in self.targets: + if target not in model.supported_targets: + raise ValueError( + "Unsupported language modeling target: {}".format(target) + ) + + return model + + def load_dataset( + self, split: str, epoch=1, combine=False, **kwargs + ) -> MonolingualDataset: + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, valid1, test) + """ + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + + data_path = paths[(epoch - 1) % len(paths)] + split_path = os.path.join(data_path, split) + + # each process has its own copy of the raw data (likely to be an np.memmap) + dataset = data_utils.load_indexed_dataset( + split_path, self.dictionary, self.args.dataset_impl, combine=combine + ) + if dataset is None: + raise FileNotFoundError(f"Dataset not found: {split} ({split_path})") + + dataset = maybe_shorten_dataset( + dataset, + split, + self.args.shorten_data_split_list, + self.args.shorten_method, + self.args.tokens_per_sample, + self.args.seed, + ) + dataset = TokenBlockDataset( + dataset, + dataset.sizes, + self.args.tokens_per_sample, + pad=self.dictionary.pad(), + eos=self.dictionary.eos(), + break_mode=self.args.sample_break_mode, + include_targets=True, + use_plasma_view=self.args.use_plasma_view, + split_path=split_path, + plasma_path=self.args.plasma_path, + ) + + add_eos_for_other_targets = ( + self.args.sample_break_mode is not None + and self.args.sample_break_mode != "none" + ) + fixed_pad_length = None + if self.args.pad_to_fixed_length: + fixed_pad_length = self.args.tokens_per_sample + + pad_to_bsz = None + if self.args.pad_to_fixed_bsz: + pad_to_bsz = self.args.batch_size_valid if 'valid' in split else self.args.batch_size + + self.datasets[split] = MonolingualDataset( + dataset=dataset, + sizes=dataset.sizes, + src_vocab=self.dictionary, + tgt_vocab=self.output_dictionary, + add_eos_for_other_targets=add_eos_for_other_targets, + shuffle=True, + targets=self.targets, + add_bos_token=self.args.add_bos_token, + fixed_pad_length=fixed_pad_length, + pad_to_bsz=pad_to_bsz, + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, **kwargs): + """ + Generate batches for inference. We prepend an eos token to src_tokens + (or bos if `--add-bos-token` is set) and we append a <pad> to target. + This is convenient both for generation with a prefix and LM scoring. + """ + dataset = StripTokenDataset( + TokenBlockDataset( + src_tokens, + src_lengths, + block_size=None, # ignored for "eos" break mode + pad=self.source_dictionary.pad(), + eos=self.source_dictionary.eos(), + break_mode="eos", + ), + # remove eos from (end of) target sequence + self.source_dictionary.eos(), + ) + src_dataset = PrependTokenDataset( + dataset, + token=( + self.source_dictionary.bos() + if getattr(self.args, "add_bos_token", False) + else self.source_dictionary.eos() + ), + ) + tgt_dataset = AppendTokenDataset(dataset, token=self.source_dictionary.pad()) + return NestedDictionaryDataset( + { + "id": IdDataset(), + "net_input": { + "src_tokens": PadDataset( + src_dataset, + pad_idx=self.source_dictionary.pad(), + left_pad=False, + ), + "src_lengths": NumelDataset(src_dataset, reduce=False), + }, + "target": PadDataset( + tgt_dataset, pad_idx=self.source_dictionary.pad(), left_pad=False + ), + }, + sizes=[np.array(src_lengths)], + ) + + def inference_step( + self, generator, models, sample, prefix_tokens=None, constraints=None + ): + with torch.no_grad(): + # Generation will always be conditioned on bos_token + if getattr(self.args, "add_bos_token", False): + bos_token = self.source_dictionary.bos() + else: + bos_token = self.source_dictionary.eos() + + if constraints is not None: + raise NotImplementedError( + "Constrained decoding with the language_modeling task is not supported" + ) + + # SequenceGenerator doesn't use src_tokens directly, we need to + # pass the `prefix_tokens` argument instead + if prefix_tokens is None and sample["net_input"]["src_tokens"].nelement(): + prefix_tokens = sample["net_input"]["src_tokens"] + if prefix_tokens[:, 0].eq(bos_token).all(): + prefix_tokens = prefix_tokens[:, 1:] + + return generator.generate( + models, sample, prefix_tokens=prefix_tokens, bos_token=bos_token + ) + + def eval_lm_dataloader( + self, + dataset, + max_tokens: Optional[int] = 36000, + batch_size: Optional[int] = None, + max_positions: Optional[int] = None, + num_shards: int = 1, + shard_id: int = 0, + num_workers: int = 1, + data_buffer_size: int = 10, + # ensures that every evaluated token has access to a context of at least + # this size, if possible + context_window: int = 0, + ): + if context_window > 0: + dataset = LMContextWindowDataset( + dataset=dataset, + tokens_per_sample=self.args.tokens_per_sample, + context_window=context_window, + pad_idx=self.source_dictionary.pad(), + ) + return self.get_batch_iterator( + dataset=dataset, + max_tokens=max_tokens, + max_sentences=batch_size, + max_positions=max_positions, + ignore_invalid_inputs=True, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + data_buffer_size=data_buffer_size, + ).next_epoch_itr(shuffle=False) + + @property + def source_dictionary(self): + """Return the :class:`~fairseq.data.Dictionary` for the language + model.""" + return self.dictionary + + @property + def target_dictionary(self): + """Return the :class:`~fairseq.data.Dictionary` for the language + model.""" + return self.output_dictionary diff --git a/SpeechT5/fairseq/fairseq/tasks/legacy_masked_lm.py b/SpeechT5/fairseq/fairseq/tasks/legacy_masked_lm.py new file mode 100644 index 0000000..9754976 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/legacy_masked_lm.py @@ -0,0 +1,152 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import itertools +import logging +import os + +import numpy as np +from fairseq import tokenizer, utils +from fairseq.data import ConcatDataset, Dictionary, data_utils, indexed_dataset +from fairseq.data.legacy.block_pair_dataset import BlockPairDataset +from fairseq.data.legacy.masked_lm_dataset import MaskedLMDataset +from fairseq.data.legacy.masked_lm_dictionary import BertDictionary +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("legacy_masked_lm") +class LegacyMaskedLMTask(LegacyFairseqTask): + """ + Task for training Masked LM (BERT) model. + Args: + dictionary (Dictionary): the dictionary for the input of the task + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument( + "data", + help="colon separated path to data directories list, \ + will be iterated upon during epochs in round-robin manner", + ) + parser.add_argument( + "--tokens-per-sample", + default=512, + type=int, + help="max number of total tokens over all segments" + " per sample for BERT dataset", + ) + parser.add_argument( + "--break-mode", default="doc", type=str, help="mode for breaking sentence" + ) + parser.add_argument("--shuffle-dataset", action="store_true", default=False) + + def __init__(self, args, dictionary): + super().__init__(args) + self.dictionary = dictionary + self.seed = args.seed + + @classmethod + def load_dictionary(cls, filename): + return BertDictionary.load(filename) + + @classmethod + def build_dictionary( + cls, filenames, workers=1, threshold=-1, nwords=-1, padding_factor=8 + ): + d = BertDictionary() + for filename in filenames: + Dictionary.add_file_to_dictionary( + filename, d, tokenizer.tokenize_line, workers + ) + d.finalize(threshold=threshold, nwords=nwords, padding_factor=padding_factor) + return d + + @property + def target_dictionary(self): + return self.dictionary + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task.""" + paths = utils.split_paths(args.data) + assert len(paths) > 0 + dictionary = BertDictionary.load(os.path.join(paths[0], "dict.txt")) + logger.info("dictionary: {} types".format(len(dictionary))) + + return cls(args, dictionary) + + def load_dataset(self, split, epoch=1, combine=False): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + loaded_datasets = [] + + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + logger.info("data_path", data_path) + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + path = os.path.join(data_path, split_k) + ds = indexed_dataset.make_dataset( + path, + impl=self.args.dataset_impl, + fix_lua_indexing=True, + dictionary=self.dictionary, + ) + + if ds is None: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + with data_utils.numpy_seed(self.seed + k): + loaded_datasets.append( + BlockPairDataset( + ds, + self.dictionary, + ds.sizes, + self.args.tokens_per_sample, + break_mode=self.args.break_mode, + doc_break_size=1, + ) + ) + + logger.info( + "{} {} {} examples".format(data_path, split_k, len(loaded_datasets[-1])) + ) + + if not combine: + break + + if len(loaded_datasets) == 1: + dataset = loaded_datasets[0] + sizes = dataset.sizes + else: + dataset = ConcatDataset(loaded_datasets) + sizes = np.concatenate([ds.sizes for ds in loaded_datasets]) + + self.datasets[split] = MaskedLMDataset( + dataset=dataset, + sizes=sizes, + vocab=self.dictionary, + pad_idx=self.dictionary.pad(), + mask_idx=self.dictionary.mask(), + classif_token_idx=self.dictionary.cls(), + sep_token_idx=self.dictionary.sep(), + shuffle=self.args.shuffle_dataset, + seed=self.seed, + ) diff --git a/SpeechT5/fairseq/fairseq/tasks/masked_lm.py b/SpeechT5/fairseq/fairseq/tasks/masked_lm.py new file mode 100644 index 0000000..fd2ea6a --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/masked_lm.py @@ -0,0 +1,258 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os + +import numpy as np +from fairseq import utils +from fairseq.data import ( + Dictionary, + IdDataset, + MaskTokensDataset, + NestedDictionaryDataset, + NumelDataset, + NumSamplesDataset, + PrependTokenDataset, + RightPadDataset, + SortDataset, + TokenBlockDataset, + data_utils, +) +from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq.data.shorten_dataset import maybe_shorten_dataset +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("masked_lm") +class MaskedLMTask(LegacyFairseqTask): + """Task for training masked language models (e.g., BERT, RoBERTa).""" + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument( + "data", + help="colon separated path to data directories list, \ + will be iterated upon during epochs in round-robin manner", + ) + parser.add_argument( + "--sample-break-mode", + default="complete", + choices=["none", "complete", "complete_doc", "eos"], + help='If omitted or "none", fills each sample with tokens-per-sample ' + 'tokens. If set to "complete", splits samples only at the end ' + "of sentence, but may include multiple sentences per sample. " + '"complete_doc" is similar but respects doc boundaries. ' + 'If set to "eos", includes only one sentence per sample.', + ) + parser.add_argument( + "--tokens-per-sample", + default=512, + type=int, + help="max number of total tokens over all segments " + "per sample for BERT dataset", + ) + parser.add_argument( + "--mask-prob", + default=0.15, + type=float, + help="probability of replacing a token with mask", + ) + parser.add_argument( + "--leave-unmasked-prob", + default=0.1, + type=float, + help="probability that a masked token is unmasked", + ) + parser.add_argument( + "--random-token-prob", + default=0.1, + type=float, + help="probability of replacing a token with a random token", + ) + parser.add_argument( + "--freq-weighted-replacement", + default=False, + action="store_true", + help="sample random replacement words based on word frequencies", + ) + parser.add_argument( + "--mask-whole-words", + default=False, + action="store_true", + help="mask whole words; you may also want to set --bpe", + ) + parser.add_argument( + "--mask-multiple-length", + default=1, + type=int, + help="repeat the mask indices multiple times", + ) + parser.add_argument( + "--mask-stdev", default=0.0, type=float, help="stdev of the mask length" + ) + parser.add_argument( + "--shorten-method", + default="none", + choices=["none", "truncate", "random_crop"], + help="if not none, shorten sequences that exceed --tokens-per-sample", + ) + parser.add_argument( + "--shorten-data-split-list", + default="", + help="comma-separated list of dataset splits to apply shortening to, " + 'e.g., "train,valid" (default: all dataset splits)', + ) + + def __init__(self, args, dictionary): + super().__init__(args) + self.dictionary = dictionary + self.seed = args.seed + + # add mask token + self.mask_idx = dictionary.add_symbol("<mask>") + + @classmethod + def setup_task(cls, args, **kwargs): + paths = utils.split_paths(args.data) + assert len(paths) > 0 + dictionary = Dictionary.load(os.path.join(paths[0], "dict.txt")) + logger.info("dictionary: {} types".format(len(dictionary))) + return cls(args, dictionary) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + split_path = os.path.join(data_path, split) + + dataset = data_utils.load_indexed_dataset( + split_path, + self.source_dictionary, + self.args.dataset_impl, + combine=combine, + ) + if dataset is None: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, split_path) + ) + + dataset = maybe_shorten_dataset( + dataset, + split, + self.args.shorten_data_split_list, + self.args.shorten_method, + self.args.tokens_per_sample, + self.args.seed, + ) + + # create continuous blocks of tokens + dataset = TokenBlockDataset( + dataset, + dataset.sizes, + self.args.tokens_per_sample - 1, # one less for <s> + pad=self.source_dictionary.pad(), + eos=self.source_dictionary.eos(), + break_mode=self.args.sample_break_mode, + ) + logger.info("loaded {} blocks from: {}".format(len(dataset), split_path)) + + # prepend beginning-of-sentence token (<s>, equiv. to [CLS] in BERT) + dataset = PrependTokenDataset(dataset, self.source_dictionary.bos()) + + # create masked input and targets + mask_whole_words = ( + get_whole_word_mask(self.args, self.source_dictionary) + if self.args.mask_whole_words + else None + ) + + src_dataset, tgt_dataset = MaskTokensDataset.apply_mask( + dataset, + self.source_dictionary, + pad_idx=self.source_dictionary.pad(), + mask_idx=self.mask_idx, + seed=self.args.seed, + mask_prob=self.args.mask_prob, + leave_unmasked_prob=self.args.leave_unmasked_prob, + random_token_prob=self.args.random_token_prob, + freq_weighted_replacement=self.args.freq_weighted_replacement, + mask_whole_words=mask_whole_words, + mask_multiple_length=self.args.mask_multiple_length, + mask_stdev=self.args.mask_stdev, + ) + + with data_utils.numpy_seed(self.args.seed): + shuffle = np.random.permutation(len(src_dataset)) + + self.datasets[split] = SortDataset( + NestedDictionaryDataset( + { + "id": IdDataset(), + "net_input": { + "src_tokens": RightPadDataset( + src_dataset, + pad_idx=self.source_dictionary.pad(), + ), + "src_lengths": NumelDataset(src_dataset, reduce=False), + }, + "target": RightPadDataset( + tgt_dataset, + pad_idx=self.source_dictionary.pad(), + ), + "nsentences": NumSamplesDataset(), + "ntokens": NumelDataset(src_dataset, reduce=True), + }, + sizes=[src_dataset.sizes], + ), + sort_order=[ + shuffle, + src_dataset.sizes, + ], + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, sort=True): + src_dataset = RightPadDataset( + TokenBlockDataset( + src_tokens, + src_lengths, + self.args.tokens_per_sample - 1, # one less for <s> + pad=self.source_dictionary.pad(), + eos=self.source_dictionary.eos(), + break_mode="eos", + ), + pad_idx=self.source_dictionary.pad(), + ) + src_dataset = PrependTokenDataset(src_dataset, self.source_dictionary.bos()) + src_dataset = NestedDictionaryDataset( + { + "id": IdDataset(), + "net_input": { + "src_tokens": src_dataset, + "src_lengths": NumelDataset(src_dataset, reduce=False), + }, + }, + sizes=src_lengths, + ) + if sort: + src_dataset = SortDataset(src_dataset, sort_order=[src_lengths]) + return src_dataset + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary diff --git a/SpeechT5/fairseq/fairseq/tasks/multilingual_denoising.py b/SpeechT5/fairseq/fairseq/tasks/multilingual_denoising.py new file mode 100644 index 0000000..d1c9149 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/multilingual_denoising.py @@ -0,0 +1,254 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os + +import numpy as np +from fairseq.data import ( + AppendTokenDataset, + ConcatDataset, + DenoisingDataset, + Dictionary, + PrependTokenDataset, + ResamplingDataset, + SortDataset, + TokenBlockDataset, + data_utils, +) +from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq.tasks import register_task + +from .denoising import DenoisingTask + + +logger = logging.getLogger(__name__) + + +@register_task("multilingual_denoising") +class MultilingualDenoisingTask(DenoisingTask): + @staticmethod + def add_args(parser): + DenoisingTask.add_args(parser) + parser.add_argument( + "--multilang-sampling-alpha", + type=float, + default=1.0, + help="smoothing alpha for sample ratios across multiple datasets", + ) + parser.add_argument("--add-lang-token", default=False, action="store_true") + parser.add_argument( + "--langs", type=str, help="language ids we are considering", default=None + ) + parser.add_argument( + "--no-whole-word-mask-langs", + type=str, + default="", + metavar="N", + help="languages without spacing between words dont support whole word masking", + ) + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task.""" + paths = args.data.split(":") + assert len(paths) > 0 + dictionary = Dictionary.load(os.path.join(paths[0], "dict.txt")) + + data_path = paths[0] + if args.langs is None: + languages = sorted( + [ + name + for name in os.listdir(data_path) + if os.path.isdir(os.path.join(data_path, name)) + ] + ) + else: + languages = args.langs.split(",") + + if args.add_lang_token: + for lang in languages: + dictionary.add_symbol("[{}]".format(lang)) + + logger.info("dictionary: {} types".format(len(dictionary))) + if not hasattr(args, "shuffle_instance"): + args.shuffle_instance = False + return cls(args, dictionary) + + def __init__(self, args, dictionary): + super().__init__(args, dictionary) + self.dictionary = dictionary + self.seed = args.seed + + # add mask token + self.mask_idx = self.dictionary.add_symbol("<mask>") + self.langs = args.langs + self.args = args + + def _get_sample_prob(self, dataset_lens): + """ + Get smoothed sampling porbability by languages. This helps low resource + languages by upsampling them. + """ + prob = dataset_lens / dataset_lens.sum() + smoothed_prob = prob ** self.args.multilang_sampling_alpha + smoothed_prob = smoothed_prob / smoothed_prob.sum() + return smoothed_prob + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = self.args.data.split(":") + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + split_path = os.path.join(data_path, split) + + if self.langs is None: + languages = sorted( + [ + name + for name in os.listdir(data_path) + if os.path.isdir(os.path.join(data_path, name)) + ] + ) + else: + languages = self.langs.split(",") + for name in languages: + p = os.path.join(data_path, name) + assert os.path.exists(p), "data not found: {}".format(p) + + logger.info("Training on {0} languages: {1}".format(len(languages), languages)) + logger.info( + "Language to id mapping: ", {lang: id for id, lang in enumerate(languages)} + ) + + mask_whole_words = get_whole_word_mask(self.args, self.dictionary) + language_without_segmentations = self.args.no_whole_word_mask_langs.split(",") + lang_datasets = [] + for language in languages: + split_path = os.path.join(data_path, language, split) + + dataset = data_utils.load_indexed_dataset( + split_path, + self.source_dictionary, + self.args.dataset_impl, + combine=combine, + ) + if dataset is None: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, split_path) + ) + + end_token = ( + self.source_dictionary.index("[{}]".format(language)) + if self.args.add_lang_token + else self.source_dictionary.eos() + ) + + # create continuous blocks of tokens + dataset = TokenBlockDataset( + dataset, + dataset.sizes, + self.args.tokens_per_sample - 2, # one less for <s> + pad=self.source_dictionary.pad(), + eos=end_token, + break_mode=self.args.sample_break_mode, + ) + logger.info("loaded {} blocks from: {}".format(len(dataset), split_path)) + + # prepend beginning-of-sentence token (<s>, equiv. to [CLS] in BERT) + dataset = PrependTokenDataset(dataset, self.source_dictionary.bos()) + dataset = AppendTokenDataset(dataset, end_token) + + lang_mask_whole_words = ( + mask_whole_words + if language not in language_without_segmentations + else None + ) + lang_dataset = DenoisingDataset( + dataset, + dataset.sizes, + self.dictionary, + self.mask_idx, + lang_mask_whole_words, + shuffle=self.args.shuffle_instance, + seed=self.seed, + args=self.args, + eos=None + if not self.args.add_lang_token + else self.source_dictionary.index("[{}]".format(language)), + ) + lang_datasets.append(lang_dataset) + + dataset_lengths = np.array( + [len(d) for d in lang_datasets], + dtype=float, + ) + logger.info( + "loaded total {} blocks for all languages".format( + int(dataset_lengths.sum()), + ) + ) + if split == self.args.train_subset: + # For train subset, additionally up or down sample languages. + sample_probs = self._get_sample_prob(dataset_lengths) + logger.info( + "Sample probability by language: {}".format( + { + lang: "{0:.4f}".format(sample_probs[id]) + for id, lang in enumerate(languages) + } + ) + ) + size_ratio = (sample_probs * dataset_lengths.sum()) / dataset_lengths + logger.info( + "Up/Down Sampling ratio by language: {}".format( + { + lang: "{0:.2f}".format(size_ratio[id]) + for id, lang in enumerate(languages) + } + ) + ) + + resampled_lang_datasets = [ + ResamplingDataset( + lang_datasets[i], + size_ratio=size_ratio[i], + seed=self.args.seed, + epoch=epoch, + replace=size_ratio[i] >= 1.0, + ) + for i, d in enumerate(lang_datasets) + ] + dataset = ConcatDataset( + resampled_lang_datasets, + ) + else: + dataset = ConcatDataset(lang_datasets) + lang_splits = [split] + for lang_id, lang_dataset in enumerate(lang_datasets): + split_name = split + "_" + languages[lang_id] + lang_splits.append(split_name) + self.datasets[split_name] = lang_dataset + + if split in self.args.valid_subset: + self.args.valid_subset = self.args.valid_subset.replace( + split, ",".join(lang_splits) + ) + + with data_utils.numpy_seed(self.args.seed + epoch): + shuffle = np.random.permutation(len(dataset)) + + self.datasets[split] = SortDataset( + dataset, + sort_order=[ + shuffle, + dataset.sizes, + ], + ) diff --git a/SpeechT5/fairseq/fairseq/tasks/multilingual_masked_lm.py b/SpeechT5/fairseq/fairseq/tasks/multilingual_masked_lm.py new file mode 100644 index 0000000..9e6ce4b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/multilingual_masked_lm.py @@ -0,0 +1,338 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os + +import numpy as np +import torch +from fairseq import utils +from fairseq.data import ( + ConcatDataset, + Dictionary, + IdDataset, + MaskTokensDataset, + NestedDictionaryDataset, + NumelDataset, + NumSamplesDataset, + PadDataset, + PrependTokenDataset, + RawLabelDataset, + ResamplingDataset, + SortDataset, + TokenBlockDataset, + data_utils, + encoders, +) +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("multilingual_masked_lm") +class MultiLingualMaskedLMTask(LegacyFairseqTask): + """Task for training masked language models (e.g., BERT, RoBERTa).""" + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument( + "data", + help="colon separated path to data directories list, \ + will be iterated upon during epochs in round-robin manner", + ) + parser.add_argument( + "--sample-break-mode", + default="complete", + choices=["none", "complete", "complete_doc", "eos"], + help='If omitted or "none", fills each sample with tokens-per-sample ' + 'tokens. If set to "complete", splits samples only at the end ' + "of sentence, but may include multiple sentences per sample. " + '"complete_doc" is similar but respects doc boundaries. ' + 'If set to "eos", includes only one sentence per sample.', + ) + parser.add_argument( + "--tokens-per-sample", + default=512, + type=int, + help="max number of total tokens over all segments " + "per sample for BERT dataset", + ) + parser.add_argument( + "--mask-prob", + default=0.15, + type=float, + help="probability of replacing a token with mask", + ) + parser.add_argument( + "--leave-unmasked-prob", + default=0.1, + type=float, + help="probability that a masked token is unmasked", + ) + parser.add_argument( + "--random-token-prob", + default=0.1, + type=float, + help="probability of replacing a token with a random token", + ) + parser.add_argument( + "--freq-weighted-replacement", + action="store_true", + help="sample random replacement words based on word frequencies", + ) + parser.add_argument( + "--mask-whole-words", + default=False, + action="store_true", + help="mask whole words; you may also want to set --bpe", + ) + parser.add_argument( + "--multilang-sampling-alpha", + type=float, + default=1.0, + help="smoothing alpha for sample rations across multiple datasets", + ) + + def __init__(self, args, dictionary): + super().__init__(args) + self.dictionary = dictionary + self.seed = args.seed + + # add mask token + self.mask_idx = dictionary.add_symbol("<mask>") + + @classmethod + def setup_task(cls, args, **kwargs): + paths = utils.split_paths(args.data) + assert len(paths) > 0 + dictionary = Dictionary.load(os.path.join(paths[0], "dict.txt")) + logger.info("dictionary: {} types".format(len(dictionary))) + return cls(args, dictionary) + + def _get_whole_word_mask(self): + # create masked input and targets + if self.args.mask_whole_words: + bpe = encoders.build_bpe(self.args) + if bpe is not None: + + def is_beginning_of_word(i): + if i < self.source_dictionary.nspecial: + # special elements are always considered beginnings + return True + tok = self.source_dictionary[i] + if tok.startswith("madeupword"): + return True + try: + return bpe.is_beginning_of_word(tok) + except ValueError: + return True + + mask_whole_words = torch.ByteTensor( + list(map(is_beginning_of_word, range(len(self.source_dictionary)))) + ) + else: + mask_whole_words = None + return mask_whole_words + + def _get_sample_prob(self, dataset_lens): + """ + Get smoothed sampling porbability by languages. This helps low resource + languages by upsampling them. + """ + prob = dataset_lens / dataset_lens.sum() + smoothed_prob = prob ** self.args.multilang_sampling_alpha + smoothed_prob = smoothed_prob / smoothed_prob.sum() + return smoothed_prob + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + + languages = sorted( + name + for name in os.listdir(data_path) + if os.path.isdir(os.path.join(data_path, name)) + ) + + logger.info("Training on {0} languages: {1}".format(len(languages), languages)) + logger.info( + "Language to id mapping: ", {lang: id for id, lang in enumerate(languages)} + ) + + mask_whole_words = self._get_whole_word_mask() + lang_datasets = [] + for lang_id, language in enumerate(languages): + split_path = os.path.join(data_path, language, split) + + dataset = data_utils.load_indexed_dataset( + split_path, + self.source_dictionary, + self.args.dataset_impl, + combine=combine, + ) + if dataset is None: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, split_path) + ) + + # create continuous blocks of tokens + dataset = TokenBlockDataset( + dataset, + dataset.sizes, + self.args.tokens_per_sample - 1, # one less for <s> + pad=self.source_dictionary.pad(), + eos=self.source_dictionary.eos(), + break_mode=self.args.sample_break_mode, + ) + logger.info("loaded {} blocks from: {}".format(len(dataset), split_path)) + + # prepend beginning-of-sentence token (<s>, equiv. to [CLS] in BERT) + dataset = PrependTokenDataset(dataset, self.source_dictionary.bos()) + + src_dataset, tgt_dataset = MaskTokensDataset.apply_mask( + dataset, + self.source_dictionary, + pad_idx=self.source_dictionary.pad(), + mask_idx=self.mask_idx, + seed=self.args.seed, + mask_prob=self.args.mask_prob, + leave_unmasked_prob=self.args.leave_unmasked_prob, + random_token_prob=self.args.random_token_prob, + freq_weighted_replacement=self.args.freq_weighted_replacement, + mask_whole_words=mask_whole_words, + ) + + lang_dataset = NestedDictionaryDataset( + { + "net_input": { + "src_tokens": PadDataset( + src_dataset, + pad_idx=self.source_dictionary.pad(), + left_pad=False, + ), + "src_lengths": NumelDataset(src_dataset, reduce=False), + }, + "target": PadDataset( + tgt_dataset, + pad_idx=self.source_dictionary.pad(), + left_pad=False, + ), + "nsentences": NumSamplesDataset(), + "ntokens": NumelDataset(src_dataset, reduce=True), + "lang_id": RawLabelDataset([lang_id] * src_dataset.sizes.shape[0]), + }, + sizes=[src_dataset.sizes], + ) + lang_datasets.append(lang_dataset) + + dataset_lengths = np.array( + [len(d) for d in lang_datasets], + dtype=float, + ) + logger.info( + "loaded total {} blocks for all languages".format( + dataset_lengths.sum(), + ) + ) + if split == self.args.train_subset: + # For train subset, additionally up or down sample languages. + sample_probs = self._get_sample_prob(dataset_lengths) + logger.info( + "Sample probability by language: ", + { + lang: "{0:.4f}".format(sample_probs[id]) + for id, lang in enumerate(languages) + }, + ) + size_ratio = (sample_probs * dataset_lengths.sum()) / dataset_lengths + logger.info( + "Up/Down Sampling ratio by language: ", + { + lang: "{0:.2f}".format(size_ratio[id]) + for id, lang in enumerate(languages) + }, + ) + + resampled_lang_datasets = [ + ResamplingDataset( + lang_datasets[i], + size_ratio=size_ratio[i], + seed=self.args.seed, + epoch=epoch, + replace=size_ratio[i] >= 1.0, + ) + for i, d in enumerate(lang_datasets) + ] + dataset = ConcatDataset(resampled_lang_datasets) + else: + dataset = ConcatDataset(lang_datasets) + lang_splits = [split] + for lang_id, lang_dataset in enumerate(lang_datasets): + split_name = split + "_" + languages[lang_id] + lang_splits.append(split_name) + self.datasets[split_name] = lang_dataset + + # [TODO]: This is hacky for now to print validation ppl for each + # language individually. Maybe need task API changes to allow it + # in more generic ways. + if split in self.args.valid_subset: + self.args.valid_subset = self.args.valid_subset.replace( + split, ",".join(lang_splits) + ) + + with data_utils.numpy_seed(self.args.seed + epoch): + shuffle = np.random.permutation(len(dataset)) + + self.datasets[split] = SortDataset( + dataset, + sort_order=[ + shuffle, + dataset.sizes, + ], + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, sort=True): + src_dataset = PadDataset( + TokenBlockDataset( + src_tokens, + src_lengths, + self.args.tokens_per_sample - 1, # one less for <s> + pad=self.source_dictionary.pad(), + eos=self.source_dictionary.eos(), + break_mode="eos", + ), + pad_idx=self.source_dictionary.pad(), + left_pad=False, + ) + src_dataset = PrependTokenDataset(src_dataset, self.source_dictionary.bos()) + src_dataset = NestedDictionaryDataset( + { + "id": IdDataset(), + "net_input": { + "src_tokens": src_dataset, + "src_lengths": NumelDataset(src_dataset, reduce=False), + }, + }, + sizes=src_lengths, + ) + if sort: + src_dataset = SortDataset(src_dataset, sort_order=[src_lengths]) + return src_dataset + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary diff --git a/SpeechT5/fairseq/fairseq/tasks/multilingual_translation.py b/SpeechT5/fairseq/fairseq/tasks/multilingual_translation.py new file mode 100644 index 0000000..26e0b52 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/multilingual_translation.py @@ -0,0 +1,457 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +import logging +import os +from collections import OrderedDict + +import torch +from fairseq import metrics, options, utils +from fairseq.data import ( + Dictionary, + LanguagePairDataset, + RoundRobinZipDatasets, + TransformEosLangPairDataset, +) +from fairseq.models import FairseqMultiModel +from fairseq.tasks.translation import load_langpair_dataset + +from . import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +def _lang_token(lang: str): + return "__{}__".format(lang) + + +def _lang_token_index(dic: Dictionary, lang: str): + """Return language token index.""" + idx = dic.index(_lang_token(lang)) + assert idx != dic.unk_index, "cannot find language token for lang {}".format(lang) + return idx + + +@register_task("multilingual_translation") +class MultilingualTranslationTask(LegacyFairseqTask): + """A task for training multiple translation models simultaneously. + + We iterate round-robin over batches from multiple language pairs, ordered + according to the `--lang-pairs` argument. + + The training loop is roughly: + + for i in range(len(epoch)): + for lang_pair in args.lang_pairs: + batch = next_batch_for_lang_pair(lang_pair) + loss = criterion(model_for_lang_pair(lang_pair), batch) + loss.backward() + optimizer.step() + + In practice, `next_batch_for_lang_pair` is abstracted in a FairseqDataset + (e.g., `RoundRobinZipDatasets`) and `model_for_lang_pair` is a model that + implements the `FairseqMultiModel` interface. + + During inference it is required to specify a single `--source-lang` and + `--target-lang`, which indicates the inference langauge direction. + `--lang-pairs`, `--encoder-langtok`, `--decoder-langtok` have to be set to + the same value as training. + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + # fmt: off + parser.add_argument('data', metavar='DIR', help='path to data directory') + parser.add_argument('--lang-pairs', default=None, metavar='PAIRS', + help='comma-separated list of language pairs (in training order): en-de,en-fr,de-fr') + parser.add_argument('-s', '--source-lang', default=None, metavar='SRC', + help='source language (only needed for inference)') + parser.add_argument('-t', '--target-lang', default=None, metavar='TARGET', + help='target language (only needed for inference)') + parser.add_argument('--left-pad-source', default='True', type=str, metavar='BOOL', + help='pad the source on the left (default: True)') + parser.add_argument('--left-pad-target', default='False', type=str, metavar='BOOL', + help='pad the target on the left (default: False)') + parser.add_argument('--max-source-positions', default=1024, type=int, metavar='N', + help='max number of tokens in the source sequence') + parser.add_argument('--max-target-positions', default=1024, type=int, metavar='N', + help='max number of tokens in the target sequence') + parser.add_argument('--upsample-primary', default=1, type=int, + help='amount to upsample primary dataset') + parser.add_argument('--encoder-langtok', default=None, type=str, choices=['src', 'tgt'], + metavar='SRCTGT', + help='replace beginning-of-sentence in source sentence with source or target ' + 'language token. (src/tgt)') + parser.add_argument('--decoder-langtok', action='store_true', + help='replace beginning-of-sentence in target sentence with target language token') + # fmt: on + + def __init__(self, args, dicts, training): + super().__init__(args) + self.dicts = dicts + self.training = training + if training: + self.lang_pairs = args.lang_pairs + else: + self.lang_pairs = ["{}-{}".format(args.source_lang, args.target_lang)] + # eval_lang_pairs for multilingual translation is usually all of the + # lang_pairs. However for other multitask settings or when we want to + # optimize for certain languages we want to use a different subset. Thus + # the eval_lang_pairs class variable is provided for classes that extend + # this class. + self.eval_lang_pairs = self.lang_pairs + # model_lang_pairs will be used to build encoder-decoder model pairs in + # models.build_model(). This allows multitask type of sub-class can + # build models other than the input lang_pairs + self.model_lang_pairs = self.lang_pairs + self.langs = list(dicts.keys()) + + @classmethod + def setup_task(cls, args, **kwargs): + dicts, training = cls.prepare(args, **kwargs) + return cls(args, dicts, training) + + @classmethod + def update_args(cls, args): + args.left_pad_source = utils.eval_bool(args.left_pad_source) + args.left_pad_target = utils.eval_bool(args.left_pad_target) + + if args.lang_pairs is None: + raise ValueError( + "--lang-pairs is required. List all the language pairs in the training objective." + ) + if isinstance(args.lang_pairs, str): + args.lang_pairs = args.lang_pairs.split(",") + + @classmethod + def prepare(cls, args, **kargs): + cls.update_args(args) + sorted_langs = sorted( + list({x for lang_pair in args.lang_pairs for x in lang_pair.split("-")}) + ) + if args.source_lang is not None or args.target_lang is not None: + training = False + else: + training = True + + # load dictionaries + dicts = OrderedDict() + for lang in sorted_langs: + paths = utils.split_paths(args.data) + assert len(paths) > 0 + dicts[lang] = cls.load_dictionary( + os.path.join(paths[0], "dict.{}.txt".format(lang)) + ) + if len(dicts) > 0: + assert dicts[lang].pad() == dicts[sorted_langs[0]].pad() + assert dicts[lang].eos() == dicts[sorted_langs[0]].eos() + assert dicts[lang].unk() == dicts[sorted_langs[0]].unk() + if args.encoder_langtok is not None or args.decoder_langtok: + for lang_to_add in sorted_langs: + dicts[lang].add_symbol(_lang_token(lang_to_add)) + logger.info("[{}] dictionary: {} types".format(lang, len(dicts[lang]))) + return dicts, training + + def get_encoder_langtok(self, src_lang, tgt_lang): + if self.args.encoder_langtok is None: + return self.dicts[src_lang].eos() + if self.args.encoder_langtok == "src": + return _lang_token_index(self.dicts[src_lang], src_lang) + else: + return _lang_token_index(self.dicts[src_lang], tgt_lang) + + def get_decoder_langtok(self, tgt_lang): + if not self.args.decoder_langtok: + return self.dicts[tgt_lang].eos() + return _lang_token_index(self.dicts[tgt_lang], tgt_lang) + + def alter_dataset_langtok( + self, + lang_pair_dataset, + src_eos=None, + src_lang=None, + tgt_eos=None, + tgt_lang=None, + ): + if self.args.encoder_langtok is None and not self.args.decoder_langtok: + return lang_pair_dataset + + new_src_eos = None + if ( + self.args.encoder_langtok is not None + and src_eos is not None + and src_lang is not None + and tgt_lang is not None + ): + new_src_eos = self.get_encoder_langtok(src_lang, tgt_lang) + else: + src_eos = None + + new_tgt_bos = None + if self.args.decoder_langtok and tgt_eos is not None and tgt_lang is not None: + new_tgt_bos = self.get_decoder_langtok(tgt_lang) + else: + tgt_eos = None + + return TransformEosLangPairDataset( + lang_pair_dataset, + src_eos=src_eos, + new_src_eos=new_src_eos, + tgt_bos=tgt_eos, + new_tgt_bos=new_tgt_bos, + ) + + def load_dataset(self, split, epoch=1, **kwargs): + """Load a dataset split.""" + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + + def language_pair_dataset(lang_pair): + src, tgt = lang_pair.split("-") + langpair_dataset = load_langpair_dataset( + data_path, + split, + src, + self.dicts[src], + tgt, + self.dicts[tgt], + combine=True, + dataset_impl=self.args.dataset_impl, + upsample_primary=self.args.upsample_primary, + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + max_source_positions=self.args.max_source_positions, + max_target_positions=self.args.max_target_positions, + ) + return self.alter_dataset_langtok( + langpair_dataset, + src_eos=self.dicts[src].eos(), + src_lang=src, + tgt_eos=self.dicts[tgt].eos(), + tgt_lang=tgt, + ) + + self.datasets[split] = RoundRobinZipDatasets( + OrderedDict( + [ + (lang_pair, language_pair_dataset(lang_pair)) + for lang_pair in self.lang_pairs + ] + ), + eval_key=None + if self.training + else "%s-%s" % (self.args.source_lang, self.args.target_lang), + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, constraints=None): + if constraints is not None: + raise NotImplementedError( + "Constrained decoding with the multilingual_translation task is not supported" + ) + + lang_pair = "%s-%s" % (self.args.source_lang, self.args.target_lang) + return RoundRobinZipDatasets( + OrderedDict( + [ + ( + lang_pair, + self.alter_dataset_langtok( + LanguagePairDataset( + src_tokens, src_lengths, self.source_dictionary + ), + src_eos=self.source_dictionary.eos(), + src_lang=self.args.source_lang, + tgt_eos=self.target_dictionary.eos(), + tgt_lang=self.args.target_lang, + ), + ) + ] + ), + eval_key=lang_pair, + ) + + def build_model(self, args): + def check_args(): + messages = [] + if ( + len(set(self.args.lang_pairs).symmetric_difference(args.lang_pairs)) + != 0 + ): + messages.append( + "--lang-pairs should include all the language pairs {}.".format( + args.lang_pairs + ) + ) + if self.args.encoder_langtok != args.encoder_langtok: + messages.append( + "--encoder-langtok should be {}.".format(args.encoder_langtok) + ) + if self.args.decoder_langtok != args.decoder_langtok: + messages.append( + "--decoder-langtok should {} be set.".format( + "" if args.decoder_langtok else "not" + ) + ) + + if len(messages) > 0: + raise ValueError(" ".join(messages)) + + # Update args -> the fact that the constructor here + # changes the args object doesn't mean you get the same one here + self.update_args(args) + + # Check if task args are consistant with model args + check_args() + + from fairseq import models + + model = models.build_model(args, self) + if not isinstance(model, FairseqMultiModel): + raise ValueError( + "MultilingualTranslationTask requires a FairseqMultiModel architecture" + ) + return model + + def _per_lang_pair_train_loss( + self, lang_pair, model, update_num, criterion, sample, optimizer, ignore_grad + ): + loss, sample_size, logging_output = criterion( + model.models[lang_pair], sample[lang_pair] + ) + if ignore_grad: + loss *= 0 + optimizer.backward(loss) + return loss, sample_size, logging_output + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + model.train() + from collections import defaultdict + + agg_loss, agg_sample_size, agg_logging_output = 0.0, 0.0, defaultdict(float) + curr_lang_pairs = [ + lang_pair + for lang_pair in self.model_lang_pairs + if sample[lang_pair] is not None and len(sample[lang_pair]) != 0 + ] + + for idx, lang_pair in enumerate(curr_lang_pairs): + + def maybe_no_sync(): + if ( + self.args.distributed_world_size > 1 + and hasattr(model, "no_sync") + and idx < len(curr_lang_pairs) - 1 + ): + return model.no_sync() + else: + return contextlib.ExitStack() # dummy contextmanager + + with maybe_no_sync(): + loss, sample_size, logging_output = self._per_lang_pair_train_loss( + lang_pair, + model, + update_num, + criterion, + sample, + optimizer, + ignore_grad, + ) + agg_loss += loss.detach().item() + # TODO make summing of the sample sizes configurable + agg_sample_size += sample_size + for k in logging_output: + agg_logging_output[k] += logging_output[k] + agg_logging_output[f"{lang_pair}:{k}"] += logging_output[k] + return agg_loss, agg_sample_size, agg_logging_output + + def _per_lang_pair_valid_loss(self, lang_pair, model, criterion, sample): + return criterion(model.models[lang_pair], sample[lang_pair]) + + def valid_step(self, sample, model, criterion): + model.eval() + with torch.no_grad(): + from collections import defaultdict + + agg_loss, agg_sample_size, agg_logging_output = 0.0, 0.0, defaultdict(float) + for lang_pair in self.eval_lang_pairs: + if ( + lang_pair not in sample + or sample[lang_pair] is None + or len(sample[lang_pair]) == 0 + ): + continue + loss, sample_size, logging_output = self._per_lang_pair_valid_loss( + lang_pair, model, criterion, sample + ) + agg_loss += loss.data.item() + # TODO make summing of the sample sizes configurable + agg_sample_size += sample_size + for k in logging_output: + agg_logging_output[k] += logging_output[k] + agg_logging_output[f"{lang_pair}:{k}"] += logging_output[k] + return agg_loss, agg_sample_size, agg_logging_output + + def inference_step( + self, generator, models, sample, prefix_tokens=None, constraints=None + ): + with torch.no_grad(): + if self.args.decoder_langtok: + bos_token = _lang_token_index( + self.target_dictionary, self.args.target_lang + ) + else: + bos_token = self.target_dictionary.eos() + return generator.generate( + models, + sample, + prefix_tokens=prefix_tokens, + constraints=constraints, + bos_token=bos_token, + ) + + def reduce_metrics(self, logging_outputs, criterion): + with metrics.aggregate(): + # pass 'sample_size', 'nsentences', 'ntokens' stats to fairseq_task + super().reduce_metrics(logging_outputs, criterion) + for k in ["sample_size", "nsentences", "ntokens"]: + metrics.log_scalar(k, sum(l[k] for l in logging_outputs)) + + @property + def source_dictionary(self): + if self.training: + return next(iter(self.dicts.values())) + else: + return self.dicts[self.args.source_lang] + + @property + def target_dictionary(self): + if self.training: + return next(iter(self.dicts.values())) + else: + return self.dicts[self.args.target_lang] + + def max_positions(self): + """Return the max sentence length allowed by the task.""" + if len(self.datasets.values()) == 0: + return { + "%s-%s" + % (self.args.source_lang, self.args.target_lang): ( + self.args.max_source_positions, + self.args.max_target_positions, + ) + } + return OrderedDict( + [ + (key, (self.args.max_source_positions, self.args.max_target_positions)) + for split in self.datasets.keys() + for key in self.datasets[split].datasets.keys() + ] + ) diff --git a/SpeechT5/fairseq/fairseq/tasks/online_backtranslation.py b/SpeechT5/fairseq/fairseq/tasks/online_backtranslation.py new file mode 100644 index 0000000..2545624 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/online_backtranslation.py @@ -0,0 +1,677 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +import json +import logging +import math +import os +from argparse import Namespace +from collections import OrderedDict, defaultdict +from pathlib import Path +from typing import Dict, Sequence, Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +import fairseq +from fairseq import metrics, options, utils +from fairseq.data import ( + FairseqDataset, + LanguagePairDataset, + NoisingDataset, + PrependTokenDataset, + RoundRobinZipDatasets, + TransformEosLangPairDataset, + data_utils, + encoders, +) +from fairseq.sequence_generator import SequenceGenerator +from fairseq.tasks import register_task +from fairseq.tasks.translation import TranslationTask, load_langpair_dataset + +logger = logging.getLogger(__name__) + + +class PiecewiseLinearFn: + """Piecewise linear function. Can be configured with a string.""" + + def __init__(self, pieces: Sequence[Tuple[int, float]]): + assert pieces == sorted( + pieces + ), f"PiecewiseLinearFn configuration should be sorted, received: {pieces}" + + self.pieces = pieces + + def __call__(self, x: int) -> float: + for i, (x_a, y_a) in enumerate(self.pieces[:-1]): + x_b, y_b = self.pieces[i + 1] + if x_a <= x <= x_b: + return y_a + (x - x_a) * (y_b - y_a) / (x_b - x_a) + + return self.pieces[-1][1] + + @staticmethod + def from_string(configuration: str) -> "PiecewiseLinearFn": + """ + Parse the configuration of lambda coefficient (for scheduling). + x = "3" # lambda will be a constant equal to x + x = "0:1,1000:0" # lambda will start from 1 and linearly decrease + # to 0 during the first 1000 iterations + x = "0:0,1000:0,2000:1" # lambda will be equal to 0 for the first 1000 + # iterations, then will linearly increase to 1 until iteration 2000 + """ + if isinstance(configuration, float): + return PiecewiseLinearFn([(0, configuration)]) + + try: + parts = configuration.split(",") + if len(parts) == 1: + v = float(configuration) + return PiecewiseLinearFn([(0, v)]) + + split = [s.split(":") for s in parts] + pieces = [(int(t), float(v)) for t, v in split] + return PiecewiseLinearFn(pieces) + except Exception: + raise ValueError( + f"Invalid PiecewiseLinearFn configuration: {configuration!r}" + ) + + @staticmethod + def one() -> "PiecewiseLinearFn": + return PiecewiseLinearFn([(0, 1.0)]) + + +@register_task("online_backtranslation") +class OnlineBackTranslationTask(TranslationTask): + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + # fmt: off + # Generic translation args + parser.add_argument('data', help='colon separated path to data directories list, \ + will be iterated upon during epochs in round-robin manner; \ + however, valid and test data are always in the first directory to \ + avoid the need for repeating them in all directories') + parser.add_argument('--mono-langs', metavar='MONO_LANGS', + help='monolingual languages for training') + parser.add_argument('--valid-lang-pairs', default=None, metavar='VALID_LANG_PAIRS', + help='language pairs for validation') + parser.add_argument('--load-alignments', action='store_true', + help='load the binarized alignments') + parser.add_argument('--left-pad-source', default='False', type=str, metavar='BOOL', + help='pad the source on the left') + parser.add_argument('--left-pad-target', default='False', type=str, metavar='BOOL', + help='pad the target on the left') + parser.add_argument('--upsample-primary', default=1, type=int, + help='amount to upsample primary dataset') + parser.add_argument('--max-source-positions', default=1024, type=int, metavar='N', + help='max number of tokens in the source sequence') + parser.add_argument('--max-target-positions', default=1024, type=int, metavar='N', + help='max number of tokens in the target sequence') + parser.add_argument('--truncate-source', action='store_true', default=False, + help='truncate source to max-source-positions') + parser.add_argument('--num-batch-buckets', default=0, type=int, metavar='N', + help='if >0, then bucket source and target lengths into N ' + 'buckets and pad accordingly; this is useful on TPUs ' + 'to minimize the number of compilations') + + # Denoising args + parser.add_argument('--max-word-shuffle-distance', default=3.0, type=float, metavar='N', + help='maximum word shuffle distance for denoising autoencoding data generation') + parser.add_argument('--word-dropout-prob', default=0.1, type=float, metavar='N', + help='word dropout probability for denoising autoencoding data generation') + parser.add_argument('--word-blanking-prob', default=0.2, type=float, metavar='N', + help='word blanking probability for denoising autoencoding data generation') + + # Backtranslation args + parser.add_argument('--lambda-bt', default="1.0", type=str, metavar='N', + help='back-translation weight') + parser.add_argument('--lambda-dae', default="1.0", type=str, metavar='N', + help='denoising auto-encoder weight') + + # Evaluation args + parser.add_argument('--generate-one-by-one', action='store_true', + help='generate one sentence at a time for backtranslation') + + parser.add_argument('--eval-bleu', action='store_true', + help='evaluation with BLEU scores') + parser.add_argument('--eval-bleu-detok', type=str, default="space", + help='detokenize before computing BLEU (e.g., "moses"); ' + 'required if using --eval-bleu; use "space" to ' + 'disable detokenization; see fairseq.data.encoders ' + 'for other options') + parser.add_argument('--eval-bleu-detok-args', type=str, metavar='JSON', + help='args for building the tokenizer, if needed') + parser.add_argument('--eval-tokenized-bleu', action='store_true', default=False, + help='compute tokenized BLEU instead of sacrebleu') + parser.add_argument('--eval-bleu-remove-bpe', nargs='?', const='@@ ', default=None, + help='remove BPE before computing BLEU') + parser.add_argument('--eval-bleu-args', type=str, metavar='JSON', + help='generation args for BLUE scoring, ' + 'e.g., \'{"beam": 4, "lenpen": 0.6}\'') + parser.add_argument('--eval-bleu-print-samples', action='store_true', + help='print sample generations during validation') + # fmt: on + + def __init__(self, args, common_dict, mono_langs, valid_lang_pairs): + super().__init__(args, common_dict, common_dict) + self.common_dict = common_dict + self.mono_langs = mono_langs + self.valid_lang_pairs = valid_lang_pairs + + self.SHOW_SAMPLES_INTERVAL = 1000 + # Start by showing samples + self._show_samples_ctr = self.SHOW_SAMPLES_INTERVAL + self.SHOW_SAMPLES_NUMBER = 5 + self.lambda_bt = PiecewiseLinearFn.from_string(args.lambda_bt) + self.lambda_dae = PiecewiseLinearFn.from_string(args.lambda_dae) + + self.args = args + self.data = utils.split_paths(self.args.data) + if len(self.data) == 1: + shards = list(Path(self.data[0]).glob("shard*")) + if len(shards) > 0: + # keep this as strings, since it can also be a manifold path + old_data = self.data + self.data = [str(shard) for shard in shards] + logging.warning(f"Expanded data directory {old_data} to {self.data}") + + @classmethod + def setup_task(cls, args, **kwargs): + """Setup the task (e.g., load dictionaries). + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + args.left_pad_source = options.eval_bool(args.left_pad_source) + args.left_pad_target = options.eval_bool(args.left_pad_target) + + paths = utils.split_paths(args.data) + assert len(paths) > 0 + assert args.mono_langs is not None + + mono_langs = args.mono_langs.split(",") + valid_lang_pairs = args.valid_lang_pairs.split(",") + + # load dictionary + dict_path = os.path.join(paths[0], "dict.txt") + common_dict = cls.load_dictionary(dict_path) + + return cls(args, common_dict, mono_langs, valid_lang_pairs) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs) -> FairseqDataset: + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + if split == "train": + data_path = self.data[(epoch - 1) % len(self.data)] + dataset = self.load_train_dataset(data_path) + else: + # valid/test should always be the same. + dataset = self.load_translation_dataset(split, self.data[0]) + + self.datasets[split] = dataset + return dataset + + def load_train_dataset(self, data_path: str) -> FairseqDataset: + """The training dataset is made of backtranslation dataset and denoising dataset.""" + data = [] + for lang in self.mono_langs: + train_path = os.path.join(data_path, lang, "train") + # TODO: could we do the BT using denoise sample ? + # this would half the data loading work + data.append((f"{lang}-BT", self.load_bt_dataset(train_path, lang))) + data.append( + (f"{lang}-DENOISE", self.load_denoise_dataset(train_path, lang)) + ) + + return RoundRobinZipDatasets(OrderedDict(data)) + + def _langpair_dataset( + self, src: FairseqDataset, tgt: FairseqDataset + ) -> LanguagePairDataset: + return LanguagePairDataset( + src, + src.sizes, + self.dictionary, + tgt=tgt, + tgt_sizes=tgt.sizes, + tgt_dict=self.dictionary, + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + # TODO: should we shuffle ? we are already sorting batch by sizes so ? + # shuffle=True, + ) + + def _prepend_lang_bos_to_target( + self, dataset: LanguagePairDataset, lang: str + ) -> LanguagePairDataset: + bos = _lang_token_index(self.dictionary, lang) + return TransformEosLangPairDataset( + dataset, + src_eos=self.dictionary.eos(), + new_src_eos=self.dictionary.eos(), + tgt_bos=self.dictionary.eos(), + new_tgt_bos=bos, + ) + + def load_bt_dataset(self, data_path: str, lang: str) -> FairseqDataset: + """The BT dataset is generated with (tgt, tgt) pairs. + The actual translation to a (generated_src, tgt) pair + is done on the fly during training. + """ + mono_dataset = data_utils.load_indexed_dataset( + data_path, self.common_dict, self.args.dataset_impl + ) + assert mono_dataset is not None, f"No dataset found for {lang}" + + mono_dataset_src = PrependTokenDataset( + mono_dataset, _lang_token_index(self.dictionary, lang) + ) + + mono_dataset_bt = self._langpair_dataset(mono_dataset_src, mono_dataset) + logger.info( + f"mono_lang = {lang} " + f"lang token index = {_lang_token_index(self.dictionary, lang)} " + f"lang token = {_lang_token(lang)}" + ) + + mono_dataset_bt = self._prepend_lang_bos_to_target(mono_dataset_bt, lang) + return mono_dataset_bt + + def load_denoise_dataset(self, data_path: str, lang: str) -> FairseqDataset: + """Classic denoising dataset""" + dataset = data_utils.load_indexed_dataset( + data_path, self.common_dict, self.args.dataset_impl + ) + noisy_dataset = NoisingDataset( + dataset, + self.dictionary, + seed=1, + max_word_shuffle_distance=self.args.max_word_shuffle_distance, + word_dropout_prob=self.args.word_dropout_prob, + word_blanking_prob=self.args.word_blanking_prob, + ) + noisy_dataset = PrependTokenDataset( + noisy_dataset, _lang_token_index(self.dictionary, lang) + ) + + clean_dataset = data_utils.load_indexed_dataset( + data_path, self.common_dict, self.args.dataset_impl + ) + denoising_dataset = self._langpair_dataset(noisy_dataset, clean_dataset) + denoising_dataset = self._prepend_lang_bos_to_target(denoising_dataset, lang) + return denoising_dataset + + def load_translation_dataset( + self, split: str, data_path: str, combine: bool = False + ): + # only judging with one language pair for the moment, + # since ConcatDataset doesn't work as expected + assert len(self.valid_lang_pairs) == 1, "For now..." + valid_lang_pair = self.valid_lang_pairs[0] + src, tgt = valid_lang_pair.split("-") + + # use the same function than TranslationTask + src_tgt_dt = load_langpair_dataset( + data_path, + split, + src, + self.common_dict, + tgt, + self.common_dict, + combine=combine, + dataset_impl=self.args.dataset_impl, + upsample_primary=self.args.upsample_primary, + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + max_source_positions=self.args.max_source_positions, + max_target_positions=self.args.max_target_positions, + load_alignments=self.args.load_alignments, + truncate_source=self.args.truncate_source, + num_buckets=self.args.num_batch_buckets, + shuffle=(split != "test"), + prepend_bos_src=_lang_token_index(self.dictionary, src), + ) + + src_tgt_eos_dt = self._prepend_lang_bos_to_target(src_tgt_dt, tgt) + src_tgt_eos_dt.args = self.args + return src_tgt_eos_dt + + def build_dataset_for_inference(self, src_tokens, src_lengths, constraints=None): + raise NotImplementedError + + def build_model(self, args): + # torch.autograd.set_detect_anomaly(True) + model = super().build_model(args) + + add_secial_tokens_to_dict_and_model(self.common_dict, model, self.mono_langs) + + self.sequence_generators = {} + for mono_lang in self.mono_langs: + self.sequence_generators[mono_lang] = SequenceGenerator( + [model], + tgt_dict=self.dictionary, + beam_size=1, + max_len_a=1.3, + max_len_b=5, + min_len=5, + # keep 1 to be able to prepend bos + max_len=model.max_decoder_positions() - 1, + ) + + if getattr(args, "eval_bleu", False): + assert getattr(args, "eval_bleu_detok", None) is not None, ( + "--eval-bleu-detok is required if using --eval-bleu; " + "try --eval-bleu-detok=moses (or --eval-bleu-detok=space " + "to disable detokenization, e.g., when using sentencepiece)" + ) + detok_args = json.loads(getattr(args, "eval_bleu_detok_args", "{}") or "{}") + self.tokenizer = encoders.build_tokenizer( + Namespace( + tokenizer=getattr(args, "eval_bleu_detok", None), **detok_args + ) + ) + + gen_args = json.loads(getattr(args, "eval_bleu_args", "{}") or "{}") + self.bleu_sequence_generator = self.build_generator( + [model], Namespace(**gen_args) + ) + + return model + + def max_positions(self): + """Return the max sentence length allowed by the task.""" + return (self.args.max_source_positions, self.args.max_target_positions) + + @property + def dictionary(self): + """Return the source :class:`~fairseq.data.Dictionary`.""" + return self.common_dict + + def display_samples_once_in_a_while(self, smp, mono_lang, other_lang): + self._show_samples_ctr += 1 + if self._show_samples_ctr < self.SHOW_SAMPLES_INTERVAL: + return + self._show_samples_ctr = 0 + + ln = smp["net_input"]["src_tokens"].shape[0] + + logger.info( + f"(r:{self.args.distributed_rank}) : " + f"{other_lang} ---> {mono_lang} " + f"({other_lang} was generated by back-translation.) {ln} samples" + ) + + for i in range(min(ln, self.SHOW_SAMPLES_NUMBER)): + src_tokens = smp["net_input"]["src_tokens"][i] + tgt_tokens = smp["target"][i] + + src_str = self.dictionary.string(src_tokens, "sentencepiece") + tgt_str = self.dictionary.string(tgt_tokens, "sentencepiece") + logger.info( + f"\n{i}\t\t[{other_lang} generated] {src_str}\n" + f"\t\t[{mono_lang} original ] {tgt_str}\n" + f"\t\t[ src tokens] {src_tokens}\n" + ) + + def backtranslate_sample(self, smp, orig_lang, other_lang) -> None: + """ + * WARNING: smp is modified in place. + * At the start of this function, `smp` has the same input and target: + |--------------------------------------------------------| + | smp['net_input']['src_tokens'] | smp['target'] | + | (from data) __en__ hello world | __en__ hello world | + |--------------------------------------------------------| + + * We call generator.generate(smp, bos_token = token("ro")), + and copy the result as input + * At the end, `smp` has the translation to other language. + |--------------------------------------------------------| + | smp['net_input']['src_tokens'] | smp['target'] | + | (generated) __ro__ salut lume | __en__ hello world | + |--------------------------------------------------------| + + """ + bos_token = _lang_token_index(self.dictionary, other_lang) + generated = self.sequence_generators[orig_lang].generate( + models=[], sample=smp, bos_token=bos_token + ) + + max_lngth = max([gn[0]["tokens"].size(0) for gn in generated]) + net_input = smp["net_input"] + n_src_tokens = torch.empty( + size=(len(generated), max_lngth + 1), dtype=net_input["src_tokens"].dtype + ) + n_src_lengths = torch.empty( + len(generated), dtype=net_input["src_lengths"].dtype + ) + + for i, gn in enumerate(generated): + tokens = gn[0]["tokens"] + tokens_size = tokens.size(0) + padding_needed = max_lngth - tokens_size + tokens = torch.cat([tokens.new([bos_token]), tokens]) + tokens = F.pad(tokens, (0, padding_needed), value=self.dictionary.pad()) + n_src_tokens[i] = tokens + n_src_lengths[i] = tokens_size + 1 + + device = net_input["src_tokens"].device + # This seems to be important + del net_input["src_tokens"] + del net_input["src_lengths"] + net_input["src_tokens"] = n_src_tokens.to(device) + net_input["src_lengths"] = n_src_lengths.to(device) + + def generate(self, smp, model): + model.eval() + orig_lang = ( + self.dictionary[smp["net_input"]["src_tokens"][0][0]] + .replace(" ", "") + .replace("_", "") + ) + bos_token = smp["net_input"]["prev_output_tokens"][0][0] + with torch.no_grad(): + generated = self.sequence_generators[orig_lang].generate( + models=[model], sample=smp, bos_token=bos_token + ) + return generated + + def get_other_lang(self, lang): + # TODO: allow more complex mapping + if lang != self.mono_langs[0]: + return self.mono_langs[0] + if len(self.mono_langs) == 2: + return self.mono_langs[1] + return self.mono_langs[np.random.randint(1, len(self.mono_langs))] + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + + model.train() + model.set_num_updates(update_num) + + agg_loss, agg_sample_size = 0.0, 0.0 + agg_logging_output: Dict[str, float] = defaultdict(float) + + dataset_keys = self.datasets["train"].datasets.keys() + + weights = { + "BT": self.lambda_bt(update_num), + "DENOISE": self.lambda_dae(update_num), + } + log_keys = {"BT": "bt_", "DENOISE": "dae_"} + + for dataset_key in dataset_keys: + smp = sample[dataset_key] + mono_lang, task_subtype = dataset_key.split("-") + if weights[task_subtype] == 0: + continue + + if task_subtype == "BT": + with torch.autograd.profiler.record_function("backtranslation"): + model.eval() + # TODO: Could we translate to several language at once ? + # this would allow to share encoder_out and maximize GPU usage. + other_lang = self.get_other_lang(mono_lang) + self.backtranslate_sample(smp, mono_lang, other_lang) + self.display_samples_once_in_a_while(smp, mono_lang, other_lang) + model.train() + + # Like in FairseqTask.train_step + with torch.autograd.profiler.record_function("forward"): + loss, sample_size, logging_output = criterion(model, smp) + loss *= weights[task_subtype] + if ignore_grad: + loss *= 0 + with torch.autograd.profiler.record_function("backward"): + optimizer.backward(loss) + + agg_loss += loss.item() + agg_sample_size += sample_size + for k in logging_output: + agg_logging_output[log_keys[task_subtype] + k] += logging_output[k] + agg_logging_output[k] += logging_output[k] + + return agg_loss, agg_sample_size, agg_logging_output + + def get_bos_token_from_sample(self, sample): + net_input = sample["net_input"] + source_lang_token_id = torch.unique(net_input["src_tokens"][:, 0]).item() + source_lang_token = self.dictionary[source_lang_token_id].replace("_", "") + target_lang_token_id = _lang_token_index( + self.dictionary, self.get_other_lang(source_lang_token) + ) + + return target_lang_token_id + + def reduce_metrics(self, logging_outputs, criterion): + super().reduce_metrics(logging_outputs, criterion) + bt_sample_size = sum(x.get("bt_sample_size", 0) for x in logging_outputs) + if bt_sample_size: + bt_loss_sum = sum(x.get("bt_loss", 0) for x in logging_outputs) + bt_loss_sum *= 1 / bt_sample_size / math.log(2) + metrics.log_scalar("bt_loss", bt_loss_sum, bt_sample_size, round=3) + + bt_nll_loss_sum = sum(x.get("bt_nll_loss", 0) for x in logging_outputs) + bt_ntokens = sum(x.get("bt_ntokens", 0) for x in logging_outputs) + bt_nll_loss_sum *= 1 / bt_ntokens / math.log(2) + metrics.log_scalar("bt_nll_loss", bt_nll_loss_sum, bt_ntokens, round=3) + metrics.log_derived( + "bt_ppl", lambda meters: utils.get_perplexity(meters["bt_nll_loss"].avg) + ) + + dae_sample_size = sum(x.get("dae_sample_size", 0) for x in logging_outputs) + if dae_sample_size: + dae_loss_sum = sum(x.get("dae_loss", 0) for x in logging_outputs) + dae_loss_sum *= 1 / dae_sample_size / math.log(2) + metrics.log_scalar("dae_loss", dae_loss_sum, dae_sample_size, round=3) + + dae_nll_loss_sum = sum(x.get("dae_nll_loss", 0) for x in logging_outputs) + dae_ntokens = sum(x.get("dae_ntokens", 0) for x in logging_outputs) + dae_nll_loss_sum *= 1 / dae_ntokens / math.log(2) + metrics.log_scalar("dae_nll_loss", dae_nll_loss_sum, dae_ntokens, round=3) + metrics.log_derived( + "dae_ppl", + lambda meters: utils.get_perplexity(meters["dae_nll_loss"].avg), + ) + + +@torch.no_grad() +def extend_embedding( + emb: nn.Module, new_vocab_size: int, copy_from_token_id: int +) -> None: + old_emb_data = emb.weight.data + (old_vocab_size, dim) = old_emb_data.shape + assert new_vocab_size >= old_vocab_size + + if new_vocab_size > old_vocab_size: + emb.weight.data = torch.zeros((new_vocab_size, dim)) + emb.weight.data[:old_vocab_size, :] = old_emb_data + # initialize new embeddings + emb.weight.data[old_vocab_size:, :] = old_emb_data[copy_from_token_id] + if hasattr(emb, "num_embeddings"): + emb.num_embeddings = new_vocab_size + if hasattr(emb, "out_features"): + emb.out_features = new_vocab_size + + if getattr(emb, "bias", None) is None: + return + + # Fix the bias. + # Bias shape can be different from the previous vocab size + # if the weight matrix was shared and alread extended but not the bias. + (old_vocab_size,) = emb.bias.shape + assert new_vocab_size >= old_vocab_size + if new_vocab_size > old_vocab_size: + old_bias = emb.bias.data + new_bias = torch.zeros( + (new_vocab_size,), dtype=old_bias.dtype, device=old_bias.device + ) + new_bias[:old_vocab_size] = old_bias + emb.bias.data = new_bias + + +def add_secial_tokens_to_dict_and_model( + dictionary: "fairseq.data.Dictionary", + model: nn.Module, + mono_langs: Sequence[str], +) -> None: + embs = model.encoder.embed_tokens + vocab_size, embedding_dim = embs.weight.shape + + # The model may or may not have a '<mask>' embedding yet + assert ( + len(dictionary) <= vocab_size <= len(dictionary) + 1 + ), f"Dictionary len ({len(dictionary)}) doesn't match embs shape ({embs.weight.shape})" + # TODO: we should reuse the pretrained model dict which already has <mask> + dictionary.add_symbol("<mask>") + + for lang in mono_langs: + lang_token = _lang_token(lang) + dictionary.add_symbol(lang_token) + logger.info( + f"dictionary: {len(dictionary)} -> {vocab_size} tokens " + f"after adding {len(mono_langs)} lang tokens." + ) + + if len(dictionary) <= vocab_size: + return + + extend_embedding(embs, len(dictionary), dictionary.bos()) + dec_embs = model.decoder.embed_tokens + extend_embedding(dec_embs, len(dictionary), dictionary.bos()) + lm_head = model.decoder.output_projection + extend_embedding(lm_head, len(dictionary), dictionary.bos()) + assert lm_head.weight.shape == (len(dictionary), embedding_dim) + + +def _lang_token(lang: str) -> str: + return f"__{lang}__" + + +def _lang_token_index(dictionary, lang: str) -> int: + return dictionary.index(_lang_token(lang)) + + +@contextlib.contextmanager +def assert_weights_have_changed(model: nn.Module): + def checksum(model: nn.Module) -> float: + return sum(p.sum().item() for p in model.parameters()) + + initial_checksum = checksum(model) + yield model + final_checksum = checksum(model) + logger.info( + f"initial_checksum={initial_checksum} -> final_checksum={final_checksum}" + ) + assert initial_checksum != final_checksum, "Model hasn't changed !" diff --git a/SpeechT5/fairseq/fairseq/tasks/semisupervised_translation.py b/SpeechT5/fairseq/fairseq/tasks/semisupervised_translation.py new file mode 100644 index 0000000..b2f9bf9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/semisupervised_translation.py @@ -0,0 +1,485 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +from collections import OrderedDict + +from fairseq import utils +from fairseq.data import ( + BacktranslationDataset, + IndexedCachedDataset, + IndexedDataset, + IndexedRawTextDataset, + LanguagePairDataset, + NoisingDataset, + RoundRobinZipDatasets, + data_utils, + indexed_dataset, +) +from fairseq.models import FairseqMultiModel +from fairseq.sequence_generator import SequenceGenerator + +from . import register_task +from .multilingual_translation import MultilingualTranslationTask + + +logger = logging.getLogger(__name__) + + +def _get_bt_dataset_key(lang_pair): + return "bt:" + lang_pair + + +def _get_denoising_dataset_key(lang_pair): + return "denoising:" + lang_pair + + +# ported from UnsupervisedMT +def parse_lambda_config(x): + """ + Parse the configuration of lambda coefficient (for scheduling). + x = "3" # lambda will be a constant equal to x + x = "0:1,1000:0" # lambda will start from 1 and linearly decrease + # to 0 during the first 1000 iterations + x = "0:0,1000:0,2000:1" # lambda will be equal to 0 for the first 1000 + # iterations, then will linearly increase to 1 until iteration 2000 + """ + split = x.split(",") + if len(split) == 1: + return float(x), None + else: + split = [s.split(os.pathsep) for s in split] + assert all(len(s) == 2 for s in split) + assert all(k.isdigit() for k, _ in split) + assert all( + int(split[i][0]) < int(split[i + 1][0]) for i in range(len(split) - 1) + ) + return float(split[0][1]), [(int(k), float(v)) for k, v in split] + + +@register_task("semisupervised_translation") +class SemisupervisedTranslationTask(MultilingualTranslationTask): + """A task for training multiple translation models simultaneously. + + We iterate round-robin over batches from multiple language pairs, ordered + according to the `--lang-pairs` argument. + + The training loop is roughly: + + for i in range(len(epoch)): + for lang_pair in args.lang_pairs: + batch = next_batch_for_lang_pair(lang_pair) + loss = criterion(model_for_lang_pair(lang_pair), batch) + loss.backward() + optimizer.step() + + In practice, `next_batch_for_lang_pair` is abstracted in a FairseqDataset + (e.g., `RoundRobinZipDatasets`) and `model_for_lang_pair` is a model that + implements the `FairseqMultiModel` interface. + + During inference it is required to specify a single `--source-lang` and + `--target-lang`, instead of `--lang-pairs`. + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + # fmt: off + MultilingualTranslationTask.add_args(parser) + parser.add_argument('--lambda-parallel-config', default="1.0", type=str, metavar='CONFIG', + help='cross-entropy reconstruction coefficient (parallel data). ' + 'use fixed weight during training if set to floating point number. ' + 'use piecewise linear function over number of updates to schedule the ' + 'weight with the format: w0:step0,w1:step1,...') + parser.add_argument('--lambda-denoising-config', default="0.0", type=str, metavar='CONFIG', + help='Cross-entropy reconstruction coefficient (denoising autoencoding)' + 'use fixed weight during training if set to floating point number. ' + 'use piecewise linear function over number of updates to schedule the ' + 'weight with the format: w0:step0,w1:step1,...') + parser.add_argument('--lambda-otf-bt-config', default="0.0", type=str, metavar='CONFIG', + help='cross-entropy reconstruction coefficient (on-the-fly back-translation parallel data)' + 'use fixed weight during training if set to floating point number. ' + 'use piecewise linear function over number of updates to schedule the ' + 'weight with the format: w0:step0,w1:step1,...') + parser.add_argument('--bt-max-len-a', default=1.1, type=float, metavar='N', + help='generate back-translated sequences of maximum length ax + b, where x is the ' + 'source length') + parser.add_argument('--bt-max-len-b', default=10.0, type=float, metavar='N', + help='generate back-translated sequences of maximum length ax + b, where x is the ' + 'source length') + parser.add_argument('--bt-beam-size', default=1, type=int, metavar='N', + help='beam size used in beam search of online back-translation') + parser.add_argument('--max-word-shuffle-distance', default=3.0, type=float, metavar='N', + help='maximum word shuffle distance for denoising autoencoding data generation') + parser.add_argument('--word-dropout-prob', default=0.1, type=float, metavar='N', + help='word dropout probability for denoising autoencoding data generation') + parser.add_argument('--word-blanking-prob', default=0.2, type=float, metavar='N', + help='word blanking probability for denoising autoencoding data generation') + # fmt: on + + def __init__(self, args, dicts, training): + super().__init__(args, dicts, training) + self.lambda_parallel, self.lambda_parallel_steps = parse_lambda_config( + args.lambda_parallel_config + ) + self.lambda_otf_bt, self.lambda_otf_bt_steps = parse_lambda_config( + args.lambda_otf_bt_config + ) + self.lambda_denoising, self.lambda_denoising_steps = parse_lambda_config( + args.lambda_denoising_config + ) + if self.lambda_denoising > 0.0 or self.lambda_denoising_steps is not None: + denoising_lang_pairs = [ + "%s-%s" % (tgt, tgt) + for tgt in {lang_pair.split("-")[1] for lang_pair in args.lang_pairs} + ] + self.model_lang_pairs = self.model_lang_pairs + denoising_lang_pairs + self.backtranslate_datasets = {} + self.backtranslators = {} + + @classmethod + def setup_task(cls, args, **kwargs): + dicts, training = MultilingualTranslationTask.prepare(args, **kwargs) + return cls(args, dicts, training) + + def load_dataset(self, split, epoch=1, **kwargs): + """Load a dataset split.""" + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + + def split_exists(split, src, tgt, lang): + if src is not None: + filename = os.path.join( + data_path, "{}.{}-{}.{}".format(split, src, tgt, lang) + ) + else: + filename = os.path.join( + data_path, "{}.{}-None.{}".format(split, src, tgt) + ) + return indexed_dataset.dataset_exists(filename, impl=self.args.dataset_impl) + + def load_indexed_dataset(path, dictionary): + return data_utils.load_indexed_dataset( + path, dictionary, self.args.dataset_impl + ) + + # load parallel datasets + src_datasets, tgt_datasets = {}, {} + if ( + self.lambda_parallel > 0.0 + or self.lambda_parallel_steps is not None + or not split.startswith("train") + ): + for lang_pair in self.lang_pairs: + src, tgt = lang_pair.split("-") + if split_exists(split, src, tgt, src): + prefix = os.path.join( + data_path, "{}.{}-{}.".format(split, src, tgt) + ) + elif split_exists(split, tgt, src, src): + prefix = os.path.join( + data_path, "{}.{}-{}.".format(split, tgt, src) + ) + else: + continue + src_datasets[lang_pair] = load_indexed_dataset( + prefix + src, self.dicts[src] + ) + tgt_datasets[lang_pair] = load_indexed_dataset( + prefix + tgt, self.dicts[tgt] + ) + logger.info( + "parallel-{} {} {} examples".format( + data_path, split, len(src_datasets[lang_pair]) + ) + ) + if len(src_datasets) == 0: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + # back translation datasets + backtranslate_datasets = {} + if ( + self.lambda_otf_bt > 0.0 or self.lambda_otf_bt_steps is not None + ) and split.startswith("train"): + for lang_pair in self.lang_pairs: + src, tgt = lang_pair.split("-") + if not split_exists(split, tgt, None, tgt): + raise FileNotFoundError( + "Dataset not found: backtranslation {} ({})".format( + split, data_path + ) + ) + filename = os.path.join( + data_path, "{}.{}-None.{}".format(split, tgt, tgt) + ) + dataset = load_indexed_dataset(filename, self.dicts[tgt]) + lang_pair_dataset_tgt = LanguagePairDataset( + dataset, + dataset.sizes, + self.dicts[tgt], + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + ) + lang_pair_dataset = LanguagePairDataset( + dataset, + dataset.sizes, + src_dict=self.dicts[src], + tgt=dataset, + tgt_sizes=dataset.sizes, + tgt_dict=self.dicts[tgt], + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + ) + backtranslate_datasets[lang_pair] = BacktranslationDataset( + tgt_dataset=self.alter_dataset_langtok( + lang_pair_dataset_tgt, + src_eos=self.dicts[tgt].eos(), + src_lang=tgt, + tgt_lang=src, + ), + backtranslation_fn=self.backtranslators[lang_pair], + src_dict=self.dicts[src], + tgt_dict=self.dicts[tgt], + output_collater=self.alter_dataset_langtok( + lang_pair_dataset=lang_pair_dataset, + src_eos=self.dicts[src].eos(), + src_lang=src, + tgt_eos=self.dicts[tgt].eos(), + tgt_lang=tgt, + ).collater, + ) + logger.info( + "backtranslate-{}: {} {} {} examples".format( + tgt, + data_path, + split, + len(backtranslate_datasets[lang_pair]), + ) + ) + self.backtranslate_datasets[lang_pair] = backtranslate_datasets[ + lang_pair + ] + + # denoising autoencoder + noising_datasets = {} + if ( + self.lambda_denoising > 0.0 or self.lambda_denoising_steps is not None + ) and split.startswith("train"): + for lang_pair in self.lang_pairs: + _, tgt = lang_pair.split("-") + if not split_exists(split, tgt, None, tgt): + continue + filename = os.path.join( + data_path, "{}.{}-None.{}".format(split, tgt, tgt) + ) + tgt_dataset1 = load_indexed_dataset(filename, self.dicts[tgt]) + tgt_dataset2 = load_indexed_dataset(filename, self.dicts[tgt]) + noising_dataset = NoisingDataset( + tgt_dataset1, + self.dicts[tgt], + seed=1, + max_word_shuffle_distance=self.args.max_word_shuffle_distance, + word_dropout_prob=self.args.word_dropout_prob, + word_blanking_prob=self.args.word_blanking_prob, + ) + noising_datasets[lang_pair] = self.alter_dataset_langtok( + LanguagePairDataset( + noising_dataset, + tgt_dataset1.sizes, + self.dicts[tgt], + tgt_dataset2, + tgt_dataset2.sizes, + self.dicts[tgt], + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + ), + src_eos=self.dicts[tgt].eos(), + src_lang=tgt, + tgt_eos=self.dicts[tgt].eos(), + tgt_lang=tgt, + ) + logger.info( + "denoising-{}: {} {} {} examples".format( + tgt, + data_path, + split, + len(noising_datasets[lang_pair]), + ) + ) + + def language_pair_dataset(lang_pair): + src, tgt = lang_pair.split("-") + src_dataset, tgt_dataset = src_datasets[lang_pair], tgt_datasets[lang_pair] + return self.alter_dataset_langtok( + LanguagePairDataset( + src_dataset, + src_dataset.sizes, + self.dicts[src], + tgt_dataset, + tgt_dataset.sizes, + self.dicts[tgt], + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + ), + self.dicts[src].eos(), + src, + self.dicts[tgt].eos(), + tgt, + ) + + self.datasets[split] = RoundRobinZipDatasets( + OrderedDict( + [ + (lang_pair, language_pair_dataset(lang_pair)) + for lang_pair in src_datasets.keys() + ] + + [ + (_get_bt_dataset_key(lang_pair), dataset) + for lang_pair, dataset in backtranslate_datasets.items() + ] + + [ + (_get_denoising_dataset_key(lang_pair), dataset) + for lang_pair, dataset in noising_datasets.items() + ] + ), + eval_key=None + if self.training + else "%s-%s" % (self.args.source_lang, self.args.target_lang), + ) + + def build_model(self, args): + from fairseq import models + + model = models.build_model(args, self) + if not isinstance(model, FairseqMultiModel): + raise ValueError( + "SemisupervisedTranslationTask requires a FairseqMultiModel architecture" + ) + + # create SequenceGenerator for each model that has backtranslation dependency on it + self.sequence_generators = {} + if ( + self.lambda_otf_bt > 0.0 or self.lambda_otf_bt_steps is not None + ) and self.training: + for lang_pair in self.lang_pairs: + src, tgt = lang_pair.split("-") + key = "{}-{}".format(tgt, src) + self.sequence_generators[key] = SequenceGenerator( + [model.models[key]], + tgt_dict=self.dicts[src], + beam_size=args.bt_beam_size, + max_len_a=args.bt_max_len_a, + max_len_b=args.bt_max_len_b, + ) + decoder_lang_tok_idx = self.get_decoder_langtok(src) + + def backtranslate_fn( + sample, + model=model.models[key], + bos_token=decoder_lang_tok_idx, + sequence_generator=self.sequence_generators[key], + ): + return sequence_generator.generate( + [model], + sample, + bos_token=bos_token, + ) + + self.backtranslators[lang_pair] = backtranslate_fn + + return model + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + model.train() + + if update_num > 0: + self.update_step(update_num) + + agg_loss, agg_sample_size, agg_logging_output = 0.0, 0.0, {} + + def forward_backward(model, samples, logging_output_key, weight): + nonlocal agg_loss, agg_sample_size, agg_logging_output + if samples is None or len(samples) == 0: + return + loss, sample_size, logging_output = criterion(model, samples) + if ignore_grad: + loss *= 0 + else: + loss *= weight + optimizer.backward(loss) + agg_loss += loss.detach().item() + # TODO make summing of the sample sizes configurable + agg_sample_size += sample_size + for k in logging_output: + agg_logging_output[k] += logging_output[k] + agg_logging_output[logging_output_key] += logging_output[k] + + if self.lambda_parallel > 0.0: + for lang_pair in self.lang_pairs: + forward_backward( + model.models[lang_pair], + sample[lang_pair], + lang_pair, + self.lambda_parallel, + ) + + if self.lambda_otf_bt > 0.0: + for lang_pair in self.lang_pairs: + sample_key = _get_bt_dataset_key(lang_pair) + forward_backward( + model.models[lang_pair], + sample[sample_key], + sample_key, + self.lambda_otf_bt, + ) + + if self.lambda_denoising > 0.0: + for lang_pair in self.lang_pairs: + _, tgt = lang_pair.split("-") + sample_key = _get_denoising_dataset_key(lang_pair) + forward_backward( + model.models["{0}-{0}".format(tgt)], + sample[sample_key], + sample_key, + self.lambda_denoising, + ) + + return agg_loss, agg_sample_size, agg_logging_output + + def update_step(self, num_updates): + def lambda_step_func(config, n_iter): + """ + Update a lambda value according to its schedule configuration. + """ + ranges = [ + i + for i in range(len(config) - 1) + if config[i][0] <= n_iter < config[i + 1][0] + ] + if len(ranges) == 0: + assert n_iter >= config[-1][0] + return config[-1][1] + assert len(ranges) == 1 + i = ranges[0] + x_a, y_a = config[i] + x_b, y_b = config[i + 1] + return y_a + (n_iter - x_a) * float(y_b - y_a) / float(x_b - x_a) + + if self.lambda_parallel_steps is not None: + self.lambda_parallel = lambda_step_func( + self.lambda_parallel_steps, num_updates + ) + if self.lambda_denoising_steps is not None: + self.lambda_denoising = lambda_step_func( + self.lambda_denoising_steps, num_updates + ) + if self.lambda_otf_bt_steps is not None: + self.lambda_otf_bt = lambda_step_func(self.lambda_otf_bt_steps, num_updates) diff --git a/SpeechT5/fairseq/fairseq/tasks/sentence_prediction.py b/SpeechT5/fairseq/fairseq/tasks/sentence_prediction.py new file mode 100644 index 0000000..6732728 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/sentence_prediction.py @@ -0,0 +1,286 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os + +import numpy as np +from fairseq import utils +from fairseq.data import ( + ConcatSentencesDataset, + Dictionary, + IdDataset, + NestedDictionaryDataset, + NumelDataset, + NumSamplesDataset, + OffsetTokensDataset, + PrependTokenDataset, + RawLabelDataset, + RightPadDataset, + RollDataset, + SortDataset, + StripTokenDataset, + data_utils, +) +from fairseq.data.shorten_dataset import maybe_shorten_dataset +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("sentence_prediction") +class SentencePredictionTask(LegacyFairseqTask): + """ + Sentence (or sentence pair) prediction (classification or regression) task. + + Args: + dictionary (Dictionary): the dictionary for the input of the task + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument("data", metavar="FILE", help="file prefix for data") + parser.add_argument( + "--num-classes", + type=int, + default=-1, + help="number of classes or regression targets", + ) + parser.add_argument( + "--init-token", + type=int, + default=None, + help="add token at the beginning of each batch item", + ) + parser.add_argument( + "--separator-token", + type=int, + default=None, + help="add separator token between inputs", + ) + parser.add_argument("--regression-target", action="store_true", default=False) + parser.add_argument("--no-shuffle", action="store_true", default=False) + parser.add_argument( + "--shorten-method", + default="none", + choices=["none", "truncate", "random_crop"], + help="if not none, shorten sequences that exceed --tokens-per-sample", + ) + parser.add_argument( + "--shorten-data-split-list", + default="", + help="comma-separated list of dataset splits to apply shortening to, " + 'e.g., "train,valid" (default: all dataset splits)', + ) + parser.add_argument( + "--add-prev-output-tokens", + action="store_true", + default=False, + help="add prev_output_tokens to sample, used for encoder-decoder arch", + ) + + def __init__(self, args, data_dictionary, label_dictionary): + super().__init__(args) + self.dictionary = data_dictionary + self._label_dictionary = label_dictionary + if not hasattr(args, "max_positions"): + self._max_positions = ( + args.max_source_positions, + args.max_target_positions, + ) + else: + self._max_positions = args.max_positions + args.tokens_per_sample = self._max_positions + + @classmethod + def load_dictionary(cls, args, filename, source=True): + """Load the dictionary from the filename + + Args: + filename (str): the filename + """ + dictionary = Dictionary.load(filename) + dictionary.add_symbol("<mask>") + return dictionary + + @classmethod + def setup_task(cls, args, **kwargs): + assert args.num_classes > 0, "Must set --num-classes" + + # load data dictionary + data_dict = cls.load_dictionary( + args, + os.path.join(args.data, "input0", "dict.txt"), + source=True, + ) + logger.info("[input] dictionary: {} types".format(len(data_dict))) + + # load label dictionary + if not args.regression_target: + label_dict = cls.load_dictionary( + args, + os.path.join(args.data, "label", "dict.txt"), + source=False, + ) + logger.info("[label] dictionary: {} types".format(len(label_dict))) + else: + label_dict = data_dict + return cls(args, data_dict, label_dict) + + def load_dataset(self, split, combine=False, **kwargs): + """Load a given dataset split (e.g., train, valid, test).""" + + def get_path(key, split): + return os.path.join(self.args.data, key, split) + + def make_dataset(key, dictionary): + split_path = get_path(key, split) + + try: + dataset = data_utils.load_indexed_dataset( + split_path, + dictionary, + self.args.dataset_impl, + combine=combine, + ) + except Exception as e: + if "StorageException: [404] Path not found" in str(e): + logger.warning(f"dataset {e} not found") + dataset = None + else: + raise e + return dataset + + input0 = make_dataset("input0", self.source_dictionary) + assert input0 is not None, "could not find dataset: {}".format( + get_path("input0", split) + ) + input1 = make_dataset("input1", self.source_dictionary) + + if self.args.init_token is not None: + input0 = PrependTokenDataset(input0, self.args.init_token) + + if input1 is None: + src_tokens = input0 + else: + if self.args.separator_token is not None: + input1 = PrependTokenDataset(input1, self.args.separator_token) + + src_tokens = ConcatSentencesDataset(input0, input1) + + with data_utils.numpy_seed(self.args.seed): + shuffle = np.random.permutation(len(src_tokens)) + + src_tokens = maybe_shorten_dataset( + src_tokens, + split, + self.args.shorten_data_split_list, + self.args.shorten_method, + self.max_positions(), + self.args.seed, + ) + + dataset = { + "id": IdDataset(), + "net_input": { + "src_tokens": RightPadDataset( + src_tokens, + pad_idx=self.source_dictionary.pad(), + ), + "src_lengths": NumelDataset(src_tokens, reduce=False), + }, + "nsentences": NumSamplesDataset(), + "ntokens": NumelDataset(src_tokens, reduce=True), + } + + if self.args.add_prev_output_tokens: + prev_tokens_dataset = RightPadDataset( + RollDataset(src_tokens, 1), + pad_idx=self.dictionary.pad(), + ) + dataset["net_input"].update( + prev_output_tokens=prev_tokens_dataset, + ) + + if not self.args.regression_target: + label_dataset = make_dataset("label", self.label_dictionary) + if label_dataset is not None: + dataset.update( + target=OffsetTokensDataset( + StripTokenDataset( + label_dataset, + id_to_strip=self.label_dictionary.eos(), + ), + offset=-self.label_dictionary.nspecial, + ) + ) + else: + label_path = "{0}.label".format(get_path("label", split)) + if os.path.exists(label_path): + + def parse_regression_target(i, line): + values = line.split() + assert ( + len(values) == self.args.num_classes + ), f'expected num_classes={self.args.num_classes} regression target values on line {i}, found: "{line}"' + return [float(x) for x in values] + + with open(label_path) as h: + dataset.update( + target=RawLabelDataset( + [ + parse_regression_target(i, line.strip()) + for i, line in enumerate(h.readlines()) + ] + ) + ) + + nested_dataset = NestedDictionaryDataset( + dataset, + sizes=[src_tokens.sizes], + ) + + if self.args.no_shuffle: + dataset = nested_dataset + else: + dataset = SortDataset( + nested_dataset, + # shuffle + sort_order=[shuffle], + ) + + logger.info("Loaded {0} with #samples: {1}".format(split, len(dataset))) + + self.datasets[split] = dataset + return self.datasets[split] + + def build_model(self, args): + from fairseq import models + + model = models.build_model(args, self) + + model.register_classification_head( + getattr(args, "classification_head_name", "sentence_classification_head"), + num_classes=self.args.num_classes, + ) + + return model + + def max_positions(self): + return self._max_positions + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary + + @property + def label_dictionary(self): + return self._label_dictionary diff --git a/SpeechT5/fairseq/fairseq/tasks/sentence_ranking.py b/SpeechT5/fairseq/fairseq/tasks/sentence_ranking.py new file mode 100644 index 0000000..bed44f3 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/sentence_ranking.py @@ -0,0 +1,219 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os + +import numpy as np +from fairseq import utils +from fairseq.data import ( + ConcatSentencesDataset, + Dictionary, + IdDataset, + NestedDictionaryDataset, + NumelDataset, + NumSamplesDataset, + PrependTokenDataset, + RawLabelDataset, + RightPadDataset, + SortDataset, + TruncateDataset, + data_utils, +) +from fairseq.data.shorten_dataset import maybe_shorten_dataset +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("sentence_ranking") +class SentenceRankingTask(LegacyFairseqTask): + """ + Ranking task on multiple sentences. + + Args: + dictionary (Dictionary): the dictionary for the input of the task + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + parser.add_argument("data", metavar="FILE", help="file prefix for data") + parser.add_argument( + "--num-classes", type=int, help="number of sentences to be ranked" + ) + parser.add_argument( + "--init-token", + type=int, + help="add token at the beginning of each batch item", + ) + parser.add_argument( + "--separator-token", type=int, help="add separator token between inputs" + ) + parser.add_argument("--no-shuffle", action="store_true") + parser.add_argument( + "--shorten-method", + default="none", + choices=["none", "truncate", "random_crop"], + help="if not none, shorten sequences that exceed --tokens-per-sample", + ) + parser.add_argument( + "--shorten-data-split-list", + default="", + help="comma-separated list of dataset splits to apply shortening to, " + 'e.g., "train,valid" (default: all dataset splits)', + ) + parser.add_argument( + "--max-option-length", type=int, help="max length for each option" + ) + + def __init__(self, args, dictionary): + super().__init__(args) + self.dictionary = dictionary + + @classmethod + def load_dictionary(cls, args, filename, source=True): + """Load the dictionary from the filename + + Args: + filename (str): the filename + """ + dictionary = Dictionary.load(filename) + dictionary.add_symbol("<mask>") + return dictionary + + @classmethod + def setup_task(cls, args, **kwargs): + assert ( + args.criterion == "sentence_ranking" + ), "Must set --criterion=sentence_ranking" + + # load data dictionary + data_dict = cls.load_dictionary( + args, + os.path.join(args.data, "input0", "dict.txt"), + source=True, + ) + logger.info("[input] dictionary: {} types".format(len(data_dict))) + return SentenceRankingTask(args, data_dict) + + def load_dataset(self, split, combine=False, **kwargs): + """Load a given dataset split (e.g., train, valid, test).""" + + def get_path(type, split): + return os.path.join(self.args.data, type, split) + + def make_dataset(type, dictionary): + split_path = get_path(type, split) + + dataset = data_utils.load_indexed_dataset( + split_path, + self.source_dictionary, + self.args.dataset_impl, + combine=combine, + ) + return dataset + + input0 = make_dataset("input0", self.source_dictionary) + input_options = [ + make_dataset("input{idx}".format(idx=idx + 1), self.source_dictionary) + for idx in range(self.args.num_classes) + ] + + if self.args.separator_token is not None: + input0 = PrependTokenDataset(input0, self.args.separator_token) + + src_tokens = [] + for input_option in input_options: + if self.args.init_token is not None: + input_option = PrependTokenDataset(input_option, self.args.init_token) + if self.args.max_option_length is not None: + input_option = TruncateDataset( + input_option, self.args.max_option_length + ) + src_token = ConcatSentencesDataset(input_option, input0) + src_token = maybe_shorten_dataset( + src_token, + split, + self.args.shorten_data_split_list, + self.args.shorten_method, + self.args.max_positions, + self.args.seed, + ) + src_tokens.append(src_token) + + with data_utils.numpy_seed(self.args.seed): + shuffle = np.random.permutation(len(src_tokens[0])) + + dataset = { + "id": IdDataset(), + "nsentences": NumSamplesDataset(), + "ntokens": NumelDataset(src_tokens[0], reduce=True), + } + + for src_token_idx in range(len(src_tokens)): + dataset.update( + { + "net_input{idx}".format(idx=src_token_idx + 1): { + "src_tokens": RightPadDataset( + src_tokens[src_token_idx], + pad_idx=self.source_dictionary.pad(), + ), + "src_lengths": NumelDataset( + src_tokens[src_token_idx], reduce=False + ), + } + } + ) + + label_path = "{}.label".format(get_path("label", split)) + if os.path.exists(label_path): + with open(label_path) as h: + dataset.update( + target=RawLabelDataset([int(x.strip()) for x in h.readlines()]) + ) + + nested_dataset = NestedDictionaryDataset( + dataset, + sizes=[np.maximum.reduce([src_token.sizes for src_token in src_tokens])], + ) + + if self.args.no_shuffle: + dataset = nested_dataset + else: + dataset = SortDataset( + nested_dataset, + # shuffle + sort_order=[shuffle], + ) + + logger.info("Loaded {0} with #samples: {1}".format(split, len(dataset))) + + self.datasets[split] = dataset + return self.datasets[split] + + def build_model(self, args): + from fairseq import models + + model = models.build_model(args, self) + + model.register_classification_head( + getattr(args, "ranking_head_name", "sentence_classification_head"), + num_classes=1, + ) + + return model + + def max_positions(self): + return self.args.max_positions + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary diff --git a/SpeechT5/fairseq/fairseq/tasks/simultaneous_translation.py b/SpeechT5/fairseq/fairseq/tasks/simultaneous_translation.py new file mode 100644 index 0000000..11c7dc1 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/simultaneous_translation.py @@ -0,0 +1,42 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from fairseq.tasks import register_task +from fairseq.tasks.speech_to_text import SpeechToTextTask +from fairseq.tasks.translation import ( + TranslationTask, TranslationConfig +) + +try: + import examples.simultaneous_translation # noqa + import_successful = True +except BaseException: + import_successful = False + + +logger = logging.getLogger(__name__) + + +def check_import(flag): + if not flag: + raise ImportError( + "'examples.simultaneous_translation' is not correctly imported. " + "Please considering `pip install -e $FAIRSEQ_DIR`." + ) + + +@register_task("simul_speech_to_text") +class SimulSpeechToTextTask(SpeechToTextTask): + def __init__(self, args, tgt_dict): + check_import(import_successful) + super().__init__(args, tgt_dict) + + +@register_task("simul_text_to_text", dataclass=TranslationConfig) +class SimulTextToTextTask(TranslationTask): + def __init__(self, cfg, src_dict, tgt_dict): + check_import(import_successful) + super().__init__(cfg, src_dict, tgt_dict) diff --git a/SpeechT5/fairseq/fairseq/tasks/speech_to_text.py b/SpeechT5/fairseq/fairseq/tasks/speech_to_text.py new file mode 100644 index 0000000..8bdf215 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/speech_to_text.py @@ -0,0 +1,149 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os.path as op +from argparse import Namespace + +from fairseq.data import Dictionary, encoders +from fairseq.data.audio.speech_to_text_dataset import ( + S2TDataConfig, + SpeechToTextDataset, + SpeechToTextDatasetCreator, + get_features_or_waveform +) +from fairseq.tasks import LegacyFairseqTask, register_task + + +logger = logging.getLogger(__name__) + + +@register_task("speech_to_text") +class SpeechToTextTask(LegacyFairseqTask): + @staticmethod + def add_args(parser): + parser.add_argument("data", help="manifest root path") + parser.add_argument( + "--config-yaml", + type=str, + default="config.yaml", + help="Configuration YAML filename (under manifest root)", + ) + parser.add_argument( + "--max-source-positions", + default=6000, + type=int, + metavar="N", + help="max number of tokens in the source sequence", + ) + parser.add_argument( + "--max-target-positions", + default=1024, + type=int, + metavar="N", + help="max number of tokens in the target sequence", + ) + + def __init__(self, args, tgt_dict): + super().__init__(args) + self.tgt_dict = tgt_dict + self.data_cfg = S2TDataConfig(op.join(args.data, args.config_yaml)) + + @classmethod + def setup_task(cls, args, **kwargs): + data_cfg = S2TDataConfig(op.join(args.data, args.config_yaml)) + dict_path = op.join(args.data, data_cfg.vocab_filename) + if not op.isfile(dict_path): + raise FileNotFoundError(f"Dict not found: {dict_path}") + tgt_dict = Dictionary.load(dict_path) + logger.info( + f"dictionary size ({data_cfg.vocab_filename}): " f"{len(tgt_dict):,}" + ) + + if getattr(args, "train_subset", None) is not None: + if not all(s.startswith("train") for s in args.train_subset.split(",")): + raise ValueError('Train splits should be named like "train*".') + return cls(args, tgt_dict) + + def build_criterion(self, args): + from fairseq import criterions + + if self.data_cfg.prepend_tgt_lang_tag and args.ignore_prefix_size != 1: + raise ValueError( + 'Please set "--ignore-prefix-size 1" since ' + "target language ID token is prepended as BOS." + ) + return criterions.build_criterion(args, self) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + is_train_split = split.startswith("train") + pre_tokenizer = self.build_tokenizer(self.args) + bpe_tokenizer = self.build_bpe(self.args) + self.datasets[split] = SpeechToTextDatasetCreator.from_tsv( + self.args.data, + self.data_cfg, + split, + self.tgt_dict, + pre_tokenizer, + bpe_tokenizer, + is_train_split=is_train_split, + epoch=epoch, + seed=self.args.seed, + ) + + @property + def target_dictionary(self): + return self.tgt_dict + + @property + def source_dictionary(self): + return None + + def max_positions(self): + return self.args.max_source_positions, self.args.max_target_positions + + def build_model(self, args): + args.input_feat_per_channel = self.data_cfg.input_feat_per_channel + args.input_channels = self.data_cfg.input_channels + return super(SpeechToTextTask, self).build_model(args) + + def build_generator( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + ): + if self.data_cfg.prepend_tgt_lang_tag and args.prefix_size != 1: + raise ValueError( + 'Please set "--prefix-size 1" since ' + "target language ID token is prepended as BOS." + ) + lang_token_ids = { + i + for s, i in self.tgt_dict.indices.items() + if SpeechToTextDataset.is_lang_tag(s) + } + extra_gen_cls_kwargs = {"symbols_to_strip_from_output": lang_token_ids} + return super().build_generator( + models, args, seq_gen_cls=None, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + def build_tokenizer(self, args): + logger.info(f"pre-tokenizer: {self.data_cfg.pre_tokenizer}") + return encoders.build_tokenizer(Namespace(**self.data_cfg.pre_tokenizer)) + + def build_bpe(self, args): + logger.info(f"tokenizer: {self.data_cfg.bpe_tokenizer}") + return encoders.build_bpe(Namespace(**self.data_cfg.bpe_tokenizer)) + + def get_interactive_tokens_and_lengths(self, lines, encode_fn): + n_frames = [get_features_or_waveform(p).shape[0] for p in lines] + return lines, n_frames + + def build_dataset_for_inference(self, src_tokens, src_lengths, **kwargs): + return SpeechToTextDataset( + "interactive", False, self.data_cfg, src_tokens, src_lengths + ) diff --git a/SpeechT5/fairseq/fairseq/tasks/translation.py b/SpeechT5/fairseq/fairseq/tasks/translation.py new file mode 100644 index 0000000..ea80fa2 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/translation.py @@ -0,0 +1,487 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +import itertools +import json +import logging +import os +from typing import Optional +from argparse import Namespace +from omegaconf import II + +import numpy as np +from fairseq import metrics, utils +from fairseq.data import ( + AppendTokenDataset, + ConcatDataset, + LanguagePairDataset, + PrependTokenDataset, + StripTokenDataset, + TruncateDataset, + data_utils, + encoders, + indexed_dataset, +) +from fairseq.data.indexed_dataset import get_available_dataset_impl +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.tasks import FairseqTask, register_task + + +EVAL_BLEU_ORDER = 4 + + +logger = logging.getLogger(__name__) + + +def load_langpair_dataset( + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, +): + def split_exists(split, src, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}.{}".format(split, src, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, src, tgt)) + elif split_exists(split_k, tgt, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, tgt, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + if truncate_source: + src_dataset = AppendTokenDataset( + TruncateDataset( + StripTokenDataset(src_dataset, src_dict.eos()), + max_source_positions - 1, + ), + src_dict.eos(), + ) + src_datasets.append(src_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{} {} examples".format( + data_path, split_k, src, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index("[{}]".format(src)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index("[{}]".format(tgt)) + ) + eos = tgt_dict.index("[{}]".format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguagePairDataset( + src_dataset, + src_dataset.sizes, + src_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + ) + + +@dataclass +class TranslationConfig(FairseqDataclass): + data: Optional[str] = field( + default=None, + metadata={ + "help": "colon separated path to data directories list, will be iterated upon during epochs " + "in round-robin manner; however, valid and test data are always in the first directory " + "to avoid the need for repeating them in all directories" + }, + ) + source_lang: Optional[str] = field( + default=None, + metadata={ + "help": "source language", + "argparse_alias": "-s", + }, + ) + target_lang: Optional[str] = field( + default=None, + metadata={ + "help": "target language", + "argparse_alias": "-t", + }, + ) + load_alignments: bool = field( + default=False, metadata={"help": "load the binarized alignments"} + ) + left_pad_source: bool = field( + default=True, metadata={"help": "pad the source on the left"} + ) + left_pad_target: bool = field( + default=False, metadata={"help": "pad the target on the left"} + ) + max_source_positions: int = field( + default=1024, metadata={"help": "max number of tokens in the source sequence"} + ) + max_target_positions: int = field( + default=1024, metadata={"help": "max number of tokens in the target sequence"} + ) + upsample_primary: int = field( + default=-1, metadata={"help": "the amount of upsample primary dataset"} + ) + truncate_source: bool = field( + default=False, metadata={"help": "truncate source to max-source-positions"} + ) + num_batch_buckets: int = field( + default=0, + metadata={ + "help": "if >0, then bucket source and target lengths into " + "N buckets and pad accordingly; this is useful on TPUs to minimize the number of compilations" + }, + ) + train_subset: str = II("dataset.train_subset") + dataset_impl: Optional[ChoiceEnum(get_available_dataset_impl())] = II( + "dataset.dataset_impl" + ) + required_seq_len_multiple: int = II("dataset.required_seq_len_multiple") + + # options for reporting BLEU during validation + eval_bleu: bool = field( + default=False, metadata={"help": "evaluation with BLEU scores"} + ) + eval_bleu_args: Optional[str] = field( + default="{}", + metadata={ + "help": 'generation args for BLUE scoring, e.g., \'{"beam": 4, "lenpen": 0.6}\', as JSON string' + }, + ) + eval_bleu_detok: str = field( + default="space", + metadata={ + "help": "detokenize before computing BLEU (e.g., 'moses'); required if using --eval-bleu; " + "use 'space' to disable detokenization; see fairseq.data.encoders for other options" + }, + ) + eval_bleu_detok_args: Optional[str] = field( + default="{}", + metadata={"help": "args for building the tokenizer, if needed, as JSON string"}, + ) + eval_tokenized_bleu: bool = field( + default=False, metadata={"help": "compute tokenized BLEU instead of sacrebleu"} + ) + eval_bleu_remove_bpe: Optional[str] = field( + default=None, + metadata={ + "help": "remove BPE before computing BLEU", + "argparse_const": "@@ ", + }, + ) + eval_bleu_print_samples: bool = field( + default=False, metadata={"help": "print sample generations during validation"} + ) + + +@register_task("translation", dataclass=TranslationConfig) +class TranslationTask(FairseqTask): + """ + Translate from one (source) language to another (target) language. + + Args: + src_dict (~fairseq.data.Dictionary): dictionary for the source language + tgt_dict (~fairseq.data.Dictionary): dictionary for the target language + + .. note:: + + The translation task is compatible with :mod:`fairseq-train`, + :mod:`fairseq-generate` and :mod:`fairseq-interactive`. + """ + + cfg: TranslationConfig + + def __init__(self, cfg: TranslationConfig, src_dict, tgt_dict): + super().__init__(cfg) + self.src_dict = src_dict + self.tgt_dict = tgt_dict + + @classmethod + def setup_task(cls, cfg: TranslationConfig, **kwargs): + """Setup the task (e.g., load dictionaries). + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + + paths = utils.split_paths(cfg.data) + assert len(paths) > 0 + # find language pair automatically + if cfg.source_lang is None or cfg.target_lang is None: + cfg.source_lang, cfg.target_lang = data_utils.infer_language_pair(paths[0]) + if cfg.source_lang is None or cfg.target_lang is None: + raise Exception( + "Could not infer language pair, please provide it explicitly" + ) + + # load dictionaries + src_dict = cls.load_dictionary( + os.path.join(paths[0], "dict.{}.txt".format(cfg.source_lang)) + ) + tgt_dict = cls.load_dictionary( + os.path.join(paths[0], "dict.{}.txt".format(cfg.target_lang)) + ) + assert src_dict.pad() == tgt_dict.pad() + assert src_dict.eos() == tgt_dict.eos() + assert src_dict.unk() == tgt_dict.unk() + logger.info("[{}] dictionary: {} types".format(cfg.source_lang, len(src_dict))) + logger.info("[{}] dictionary: {} types".format(cfg.target_lang, len(tgt_dict))) + + return cls(cfg, src_dict, tgt_dict) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = utils.split_paths(self.cfg.data) + assert len(paths) > 0 + if split != self.cfg.train_subset: + # if not training data set, use the first shard for valid and test + paths = paths[:1] + data_path = paths[(epoch - 1) % len(paths)] + + # infer langcode + src, tgt = self.cfg.source_lang, self.cfg.target_lang + + self.datasets[split] = load_langpair_dataset( + data_path, + split, + src, + self.src_dict, + tgt, + self.tgt_dict, + combine=combine, + dataset_impl=self.cfg.dataset_impl, + upsample_primary=self.cfg.upsample_primary, + left_pad_source=self.cfg.left_pad_source, + left_pad_target=self.cfg.left_pad_target, + max_source_positions=self.cfg.max_source_positions, + max_target_positions=self.cfg.max_target_positions, + load_alignments=self.cfg.load_alignments, + truncate_source=self.cfg.truncate_source, + num_buckets=self.cfg.num_batch_buckets, + shuffle=(split != "test"), + pad_to_multiple=self.cfg.required_seq_len_multiple, + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, constraints=None): + return LanguagePairDataset( + src_tokens, + src_lengths, + self.source_dictionary, + tgt_dict=self.target_dictionary, + constraints=constraints, + ) + + def build_model(self, cfg): + model = super().build_model(cfg) + if self.cfg.eval_bleu: + detok_args = json.loads(self.cfg.eval_bleu_detok_args) + self.tokenizer = encoders.build_tokenizer( + Namespace(tokenizer=self.cfg.eval_bleu_detok, **detok_args) + ) + + gen_args = json.loads(self.cfg.eval_bleu_args) + self.sequence_generator = self.build_generator( + [model], Namespace(**gen_args) + ) + return model + + def valid_step(self, sample, model, criterion): + loss, sample_size, logging_output = super().valid_step(sample, model, criterion) + if self.cfg.eval_bleu: + bleu = self._inference_with_bleu(self.sequence_generator, sample, model) + logging_output["_bleu_sys_len"] = bleu.sys_len + logging_output["_bleu_ref_len"] = bleu.ref_len + # we split counts into separate entries so that they can be + # summed efficiently across workers using fast-stat-sync + assert len(bleu.counts) == EVAL_BLEU_ORDER + for i in range(EVAL_BLEU_ORDER): + logging_output["_bleu_counts_" + str(i)] = bleu.counts[i] + logging_output["_bleu_totals_" + str(i)] = bleu.totals[i] + return loss, sample_size, logging_output + + def reduce_metrics(self, logging_outputs, criterion): + super().reduce_metrics(logging_outputs, criterion) + if self.cfg.eval_bleu: + + def sum_logs(key): + import torch + result = sum(log.get(key, 0) for log in logging_outputs) + if torch.is_tensor(result): + result = result.cpu() + return result + + counts, totals = [], [] + for i in range(EVAL_BLEU_ORDER): + counts.append(sum_logs("_bleu_counts_" + str(i))) + totals.append(sum_logs("_bleu_totals_" + str(i))) + + if max(totals) > 0: + # log counts as numpy arrays -- log_scalar will sum them correctly + metrics.log_scalar("_bleu_counts", np.array(counts)) + metrics.log_scalar("_bleu_totals", np.array(totals)) + metrics.log_scalar("_bleu_sys_len", sum_logs("_bleu_sys_len")) + metrics.log_scalar("_bleu_ref_len", sum_logs("_bleu_ref_len")) + + def compute_bleu(meters): + import inspect + import sacrebleu + + fn_sig = inspect.getfullargspec(sacrebleu.compute_bleu)[0] + if "smooth_method" in fn_sig: + smooth = {"smooth_method": "exp"} + else: + smooth = {"smooth": "exp"} + bleu = sacrebleu.compute_bleu( + correct=meters["_bleu_counts"].sum, + total=meters["_bleu_totals"].sum, + sys_len=meters["_bleu_sys_len"].sum, + ref_len=meters["_bleu_ref_len"].sum, + **smooth + ) + return round(bleu.score, 2) + + metrics.log_derived("bleu", compute_bleu) + + def max_positions(self): + """Return the max sentence length allowed by the task.""" + return (self.cfg.max_source_positions, self.cfg.max_target_positions) + + @property + def source_dictionary(self): + """Return the source :class:`~fairseq.data.Dictionary`.""" + return self.src_dict + + @property + def target_dictionary(self): + """Return the target :class:`~fairseq.data.Dictionary`.""" + return self.tgt_dict + + def _inference_with_bleu(self, generator, sample, model): + import sacrebleu + + def decode(toks, escape_unk=False): + s = self.tgt_dict.string( + toks.int().cpu(), + self.cfg.eval_bleu_remove_bpe, + # The default unknown string in fairseq is `<unk>`, but + # this is tokenized by sacrebleu as `< unk >`, inflating + # BLEU scores. Instead, we use a somewhat more verbose + # alternative that is unlikely to appear in the real + # reference, but doesn't get split into multiple tokens. + unk_string=("UNKNOWNTOKENINREF" if escape_unk else "UNKNOWNTOKENINHYP"), + ) + if self.tokenizer: + s = self.tokenizer.decode(s) + return s + + gen_out = self.inference_step(generator, [model], sample, prefix_tokens=None) + hyps, refs = [], [] + for i in range(len(gen_out)): + hyps.append(decode(gen_out[i][0]["tokens"])) + refs.append( + decode( + utils.strip_pad(sample["target"][i], self.tgt_dict.pad()), + escape_unk=True, # don't count <unk> as matches to the hypo + ) + ) + if self.cfg.eval_bleu_print_samples: + logger.info("example hypothesis: " + hyps[0]) + logger.info("example reference: " + refs[0]) + if self.cfg.eval_tokenized_bleu: + return sacrebleu.corpus_bleu(hyps, [refs], tokenize="none") + else: + return sacrebleu.corpus_bleu(hyps, [refs]) diff --git a/SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_bart.py b/SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_bart.py new file mode 100644 index 0000000..0fd7a5b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_bart.py @@ -0,0 +1,132 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import torch +from fairseq import utils +from fairseq.data import LanguagePairDataset + +from . import register_task +from .translation import TranslationTask, load_langpair_dataset + + +@register_task("translation_from_pretrained_bart") +class TranslationFromPretrainedBARTTask(TranslationTask): + """ + Translate from source language to target language with a model initialized with a multilingual pretrain. + + Args: + src_dict (~fairseq.data.Dictionary): dictionary for the source language + tgt_dict (~fairseq.data.Dictionary): dictionary for the target language + + .. note:: + + The translation task is compatible with :mod:`fairseq-train`, + :mod:`fairseq-generate` and :mod:`fairseq-interactive`. + + The translation task provides the following additional command-line + arguments: + + .. argparse:: + :ref: fairseq.tasks.translation_parser + :prog: + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + # fmt: off + TranslationTask.add_args(parser) + parser.add_argument('--langs', type=str, metavar='LANG', + help='comma-separated list of monolingual language, ' + 'for example, "en,de,fr". These should match the ' + 'langs from pretraining (and be in the same order). ' + 'You should always add all pretraining language idx ' + 'during finetuning.') + parser.add_argument('--prepend-bos', action='store_true', + help='prepend bos token to each sentence, which matches ' + 'mBART pretraining') + # fmt: on + + def __init__(self, args, src_dict, tgt_dict): + super().__init__(args, src_dict, tgt_dict) + self.langs = args.langs.split(",") + for d in [src_dict, tgt_dict]: + for l in self.langs: + d.add_symbol("[{}]".format(l)) + d.add_symbol("<mask>") + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + + # infer langcode + src, tgt = self.args.source_lang, self.args.target_lang + + self.datasets[split] = load_langpair_dataset( + data_path, + split, + src, + self.src_dict, + tgt, + self.tgt_dict, + combine=combine, + dataset_impl=self.args.dataset_impl, + upsample_primary=self.args.upsample_primary, + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + max_source_positions=getattr(self.args, "max_source_positions", 1024), + max_target_positions=getattr(self.args, "max_target_positions", 1024), + load_alignments=self.args.load_alignments, + prepend_bos=getattr(self.args, "prepend_bos", False), + append_source_id=True, + ) + + def build_generator(self, models, args, **unused): + if getattr(args, "score_reference", False): + from fairseq.sequence_scorer import SequenceScorer + + return SequenceScorer( + self.target_dictionary, + eos=self.tgt_dict.index("[{}]".format(self.args.target_lang)), + ) + else: + from fairseq.sequence_generator import SequenceGenerator + + return SequenceGenerator( + models, + self.target_dictionary, + beam_size=getattr(args, "beam", 5), + max_len_a=getattr(args, "max_len_a", 0), + max_len_b=getattr(args, "max_len_b", 200), + min_len=getattr(args, "min_len", 1), + normalize_scores=(not getattr(args, "unnormalized", False)), + len_penalty=getattr(args, "lenpen", 1), + unk_penalty=getattr(args, "unkpen", 0), + temperature=getattr(args, "temperature", 1.0), + match_source_len=getattr(args, "match_source_len", False), + no_repeat_ngram_size=getattr(args, "no_repeat_ngram_size", 0), + eos=self.tgt_dict.index("[{}]".format(self.args.target_lang)), + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, constraints=None): + src_lang_id = self.source_dictionary.index("[{}]".format(self.args.source_lang)) + source_tokens = [] + for s_t in src_tokens: + s_t = torch.cat([s_t, s_t.new(1).fill_(src_lang_id)]) + source_tokens.append(s_t) + dataset = LanguagePairDataset( + source_tokens, + src_lengths, + self.source_dictionary, + tgt_dict=self.target_dictionary, + constraints=constraints, + ) + return dataset diff --git a/SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_xlm.py b/SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_xlm.py new file mode 100644 index 0000000..a05f289 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/translation_from_pretrained_xlm.py @@ -0,0 +1,39 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass +from fairseq.data.legacy.masked_lm_dictionary import MaskedLMDictionary +from fairseq.tasks.translation import TranslationConfig, TranslationTask + +from . import register_task + + +@dataclass +class TranslationFromPretrainedXLMConfig(TranslationConfig): + pass + + +@register_task( + "translation_from_pretrained_xlm", dataclass=TranslationFromPretrainedXLMConfig +) +class TranslationFromPretrainedXLMTask(TranslationTask): + """ + Same as TranslationTask except use the MaskedLMDictionary class so that + we can load data that was binarized with the MaskedLMDictionary class. + + This task should be used for the entire training pipeline when we want to + train an NMT model from a pretrained XLM checkpoint: binarizing NMT data, + training NMT with the pretrained XLM checkpoint, and subsequent evaluation + of that trained model. + """ + + @classmethod + def load_dictionary(cls, filename): + """Load the masked LM dictionary from the filename + + Args: + filename (str): the filename + """ + return MaskedLMDictionary.load(filename) diff --git a/SpeechT5/fairseq/fairseq/tasks/translation_lev.py b/SpeechT5/fairseq/fairseq/tasks/translation_lev.py new file mode 100644 index 0000000..0412793 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/translation_lev.py @@ -0,0 +1,191 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from dataclasses import dataclass, field +import torch +from fairseq import utils +from fairseq.data import LanguagePairDataset +from fairseq.dataclass import ChoiceEnum +from fairseq.tasks import register_task +from fairseq.tasks.translation import TranslationConfig, TranslationTask, load_langpair_dataset +from fairseq.utils import new_arange + + +NOISE_CHOICES = ChoiceEnum(["random_delete", "random_mask", "no_noise", "full_mask"]) + +@dataclass +class TranslationLevenshteinConfig(TranslationConfig): + noise: NOISE_CHOICES = field( + default="random_delete", + metadata={ + "help": "type of noise" + }, + ) + +@register_task("translation_lev", dataclass=TranslationLevenshteinConfig) +class TranslationLevenshteinTask(TranslationTask): + """ + Translation (Sequence Generation) task for Levenshtein Transformer + See `"Levenshtein Transformer" <https://arxiv.org/abs/1905.11006>`_. + """ + + cfg: TranslationLevenshteinConfig + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = utils.split_paths(self.cfg.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + + # infer langcode + src, tgt = self.cfg.source_lang, self.cfg.target_lang + + self.datasets[split] = load_langpair_dataset( + data_path, + split, + src, + self.src_dict, + tgt, + self.tgt_dict, + combine=combine, + dataset_impl=self.cfg.dataset_impl, + upsample_primary=self.cfg.upsample_primary, + left_pad_source=self.cfg.left_pad_source, + left_pad_target=self.cfg.left_pad_target, + max_source_positions=self.cfg.max_source_positions, + max_target_positions=self.cfg.max_target_positions, + prepend_bos=True, + ) + + def inject_noise(self, target_tokens): + def _random_delete(target_tokens): + pad = self.tgt_dict.pad() + bos = self.tgt_dict.bos() + eos = self.tgt_dict.eos() + + max_len = target_tokens.size(1) + target_mask = target_tokens.eq(pad) + target_score = target_tokens.clone().float().uniform_() + target_score.masked_fill_( + target_tokens.eq(bos) | target_tokens.eq(eos), 0.0 + ) + target_score.masked_fill_(target_mask, 1) + target_score, target_rank = target_score.sort(1) + target_length = target_mask.size(1) - target_mask.float().sum( + 1, keepdim=True + ) + + # do not delete <bos> and <eos> (we assign 0 score for them) + target_cutoff = ( + 2 + + ( + (target_length - 2) + * target_score.new_zeros(target_score.size(0), 1).uniform_() + ).long() + ) + target_cutoff = target_score.sort(1)[1] >= target_cutoff + + prev_target_tokens = ( + target_tokens.gather(1, target_rank) + .masked_fill_(target_cutoff, pad) + .gather(1, target_rank.masked_fill_(target_cutoff, max_len).sort(1)[1]) + ) + prev_target_tokens = prev_target_tokens[ + :, : prev_target_tokens.ne(pad).sum(1).max() + ] + + return prev_target_tokens + + def _random_mask(target_tokens): + pad = self.tgt_dict.pad() + bos = self.tgt_dict.bos() + eos = self.tgt_dict.eos() + unk = self.tgt_dict.unk() + + target_masks = ( + target_tokens.ne(pad) & target_tokens.ne(bos) & target_tokens.ne(eos) + ) + target_score = target_tokens.clone().float().uniform_() + target_score.masked_fill_(~target_masks, 2.0) + target_length = target_masks.sum(1).float() + target_length = target_length * target_length.clone().uniform_() + target_length = target_length + 1 # make sure to mask at least one token. + + _, target_rank = target_score.sort(1) + target_cutoff = new_arange(target_rank) < target_length[:, None].long() + prev_target_tokens = target_tokens.masked_fill( + target_cutoff.scatter(1, target_rank, target_cutoff), unk + ) + return prev_target_tokens + + def _full_mask(target_tokens): + pad = self.tgt_dict.pad() + bos = self.tgt_dict.bos() + eos = self.tgt_dict.eos() + unk = self.tgt_dict.unk() + + target_mask = ( + target_tokens.eq(bos) | target_tokens.eq(eos) | target_tokens.eq(pad) + ) + return target_tokens.masked_fill(~target_mask, unk) + + if self.cfg.noise == "random_delete": + return _random_delete(target_tokens) + elif self.cfg.noise == "random_mask": + return _random_mask(target_tokens) + elif self.cfg.noise == "full_mask": + return _full_mask(target_tokens) + elif self.cfg.noise == "no_noise": + return target_tokens + else: + raise NotImplementedError + + def build_generator(self, models, args, **unused): + # add models input to match the API for SequenceGenerator + from fairseq.iterative_refinement_generator import IterativeRefinementGenerator + + return IterativeRefinementGenerator( + self.target_dictionary, + eos_penalty=getattr(args, "iter_decode_eos_penalty", 0.0), + max_iter=getattr(args, "iter_decode_max_iter", 10), + beam_size=getattr(args, "iter_decode_with_beam", 1), + reranking=getattr(args, "iter_decode_with_external_reranker", False), + decoding_format=getattr(args, "decoding_format", None), + adaptive=not getattr(args, "iter_decode_force_max_iter", False), + retain_history=getattr(args, "retain_iter_history", False), + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, constraints=None): + if constraints is not None: + # Though see Susanto et al. (ACL 2020): https://www.aclweb.org/anthology/2020.acl-main.325/ + raise NotImplementedError( + "Constrained decoding with the translation_lev task is not supported" + ) + + return LanguagePairDataset( + src_tokens, src_lengths, self.source_dictionary, append_bos=True + ) + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + model.train() + sample["prev_target"] = self.inject_noise(sample["target"]) + loss, sample_size, logging_output = criterion(model, sample) + if ignore_grad: + loss *= 0 + optimizer.backward(loss) + return loss, sample_size, logging_output + + def valid_step(self, sample, model, criterion): + model.eval() + with torch.no_grad(): + sample["prev_target"] = self.inject_noise(sample["target"]) + loss, sample_size, logging_output = criterion(model, sample) + return loss, sample_size, logging_output diff --git a/SpeechT5/fairseq/fairseq/tasks/translation_multi_simple_epoch.py b/SpeechT5/fairseq/fairseq/tasks/translation_multi_simple_epoch.py new file mode 100644 index 0000000..6f36e5b --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tasks/translation_multi_simple_epoch.py @@ -0,0 +1,430 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import datetime +import logging +import time + +import torch +from fairseq.data import ( + FairseqDataset, + LanguagePairDataset, + ListDataset, + data_utils, + iterators, +) +from fairseq.data.multilingual.multilingual_data_manager import ( + MultilingualDatasetManager, +) +from fairseq.data.multilingual.sampling_method import SamplingMethod +from fairseq.tasks import LegacyFairseqTask, register_task +from fairseq.utils import FileContentsAction + + +### +def get_time_gap(s, e): + return ( + datetime.datetime.fromtimestamp(e) - datetime.datetime.fromtimestamp(s) + ).__str__() + + +### + + +logger = logging.getLogger(__name__) + + +@register_task("translation_multi_simple_epoch") +class TranslationMultiSimpleEpochTask(LegacyFairseqTask): + """ + Translate from one (source) language to another (target) language. + + Args: + langs (List[str]): a list of languages that are being supported + dicts (Dict[str, fairseq.data.Dictionary]): mapping from supported languages to their dictionaries + training (bool): whether the task should be configured for training or not + + .. note:: + + The translation task is compatible with :mod:`fairseq-train`, + :mod:`fairseq-generate` and :mod:`fairseq-interactive`. + + The translation task provides the following additional command-line + arguments: + + .. argparse:: + :ref: fairseq.tasks.translation_parser + :prog: + """ + + @staticmethod + def add_args(parser): + """Add task-specific arguments to the parser.""" + # fmt: off + parser.add_argument('-s', '--source-lang', default=None, metavar='SRC', + help='inference source language') + parser.add_argument('-t', '--target-lang', default=None, metavar='TARGET', + help='inference target language') + parser.add_argument('--lang-pairs', default=None, metavar='PAIRS', + help='comma-separated list of language pairs (in training order): en-de,en-fr,de-fr', + action=FileContentsAction) + parser.add_argument('--keep-inference-langtok', action='store_true', + help='keep language tokens in inference output (e.g. for analysis or debugging)') + + SamplingMethod.add_arguments(parser) + MultilingualDatasetManager.add_args(parser) + # fmt: on + + def __init__(self, args, langs, dicts, training): + super().__init__(args) + self.langs = langs + self.dicts = dicts + self.training = training + if training: + self.lang_pairs = args.lang_pairs + else: + self.lang_pairs = ["{}-{}".format(args.source_lang, args.target_lang)] + # eval_lang_pairs for multilingual translation is usually all of the + # lang_pairs. However for other multitask settings or when we want to + # optimize for certain languages we want to use a different subset. Thus + # the eval_lang_pairs class variable is provided for classes that extend + # this class. + self.eval_lang_pairs = self.lang_pairs + # model_lang_pairs will be used to build encoder-decoder model pairs in + # models.build_model(). This allows multitask type of sub-class can + # build models other than the input lang_pairs + self.model_lang_pairs = self.lang_pairs + self.source_langs = [d.split("-")[0] for d in self.lang_pairs] + self.target_langs = [d.split("-")[1] for d in self.lang_pairs] + self.check_dicts(self.dicts, self.source_langs, self.target_langs) + + self.sampling_method = SamplingMethod.build_sampler(args, self) + self.data_manager = MultilingualDatasetManager.setup_data_manager( + args, self.lang_pairs, langs, dicts, self.sampling_method + ) + + def check_dicts(self, dicts, source_langs, target_langs): + if self.args.source_dict is not None or self.args.target_dict is not None: + # no need to check whether the source side and target side are sharing dictionaries + return + src_dict = dicts[source_langs[0]] + tgt_dict = dicts[target_langs[0]] + for src_lang in source_langs: + assert ( + src_dict == dicts[src_lang] + ), "Diffrent dictionary are specified for different source languages; " + "TranslationMultiSimpleEpochTask only supports one shared dictionary across all source languages" + for tgt_lang in target_langs: + assert ( + tgt_dict == dicts[tgt_lang] + ), "Diffrent dictionary are specified for different target languages; " + "TranslationMultiSimpleEpochTask only supports one shared dictionary across all target languages" + + @classmethod + def setup_task(cls, args, **kwargs): + langs, dicts, training = MultilingualDatasetManager.prepare( + cls.load_dictionary, args, **kwargs + ) + return cls(args, langs, dicts, training) + + def has_sharded_data(self, split): + return self.data_manager.has_sharded_data(split) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + if split in self.datasets: + dataset = self.datasets[split] + if self.has_sharded_data(split): + if self.args.virtual_epoch_size is not None: + if dataset.load_next_shard: + shard_epoch = dataset.shard_epoch + else: + # no need to load next shard so skip loading + # also this avoid always loading from beginning of the data + return + else: + shard_epoch = epoch + else: + # estimate the shard epoch from virtual data size and virtual epoch size + shard_epoch = self.data_manager.estimate_global_pass_epoch(epoch) + logger.info(f"loading data for {split} epoch={epoch}/{shard_epoch}") + logger.info(f"mem usage: {data_utils.get_mem_usage()}") + if split in self.datasets: + del self.datasets[split] + logger.info("old dataset deleted manually") + logger.info(f"mem usage: {data_utils.get_mem_usage()}") + self.datasets[split] = self.data_manager.load_dataset( + split, + self.training, + epoch=epoch, + combine=combine, + shard_epoch=shard_epoch, + **kwargs, + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, constraints=None): + if constraints is not None: + raise NotImplementedError( + "Constrained decoding with the multilingual_translation task is not supported" + ) + + src_data = ListDataset(src_tokens, src_lengths) + dataset = LanguagePairDataset(src_data, src_lengths, self.source_dictionary) + src_langtok_spec, tgt_langtok_spec = self.args.langtoks["main"] + if self.args.lang_tok_replacing_bos_eos: + dataset = self.data_manager.alter_dataset_langtok( + dataset, + src_eos=self.source_dictionary.eos(), + src_lang=self.args.source_lang, + tgt_eos=self.target_dictionary.eos(), + tgt_lang=self.args.target_lang, + src_langtok_spec=src_langtok_spec, + tgt_langtok_spec=tgt_langtok_spec, + ) + else: + dataset.src = self.data_manager.src_dataset_tranform_func( + self.args.source_lang, + self.args.target_lang, + dataset=dataset.src, + spec=src_langtok_spec, + ) + return dataset + + def build_generator( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + ): + if not getattr(args, "keep_inference_langtok", False): + _, tgt_langtok_spec = self.args.langtoks["main"] + if tgt_langtok_spec: + tgt_lang_tok = self.data_manager.get_decoder_langtok( + self.args.target_lang, tgt_langtok_spec + ) + extra_gen_cls_kwargs = extra_gen_cls_kwargs or {} + extra_gen_cls_kwargs["symbols_to_strip_from_output"] = {tgt_lang_tok} + + return super().build_generator( + models, args, seq_gen_cls=None, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + def build_model(self, args): + return super().build_model(args) + + def valid_step(self, sample, model, criterion): + loss, sample_size, logging_output = super().valid_step(sample, model, criterion) + return loss, sample_size, logging_output + + def inference_step( + self, generator, models, sample, prefix_tokens=None, constraints=None + ): + with torch.no_grad(): + _, tgt_langtok_spec = self.args.langtoks["main"] + if not self.args.lang_tok_replacing_bos_eos: + if prefix_tokens is None and tgt_langtok_spec: + tgt_lang_tok = self.data_manager.get_decoder_langtok( + self.args.target_lang, tgt_langtok_spec + ) + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.size(0) + prefix_tokens = ( + torch.LongTensor([[tgt_lang_tok]]).expand(bsz, 1).to(src_tokens) + ) + return generator.generate( + models, + sample, + prefix_tokens=prefix_tokens, + constraints=constraints, + ) + else: + return generator.generate( + models, + sample, + prefix_tokens=prefix_tokens, + bos_token=self.data_manager.get_decoder_langtok( + self.args.target_lang, tgt_langtok_spec + ) + if tgt_langtok_spec + else self.target_dictionary.eos(), + ) + + def reduce_metrics(self, logging_outputs, criterion): + super().reduce_metrics(logging_outputs, criterion) + + def max_positions(self): + """Return the max sentence length allowed by the task.""" + return (self.args.max_source_positions, self.args.max_target_positions) + + @property + def source_dictionary(self): + return self.data_manager.get_source_dictionary(self.source_langs[0]) + + @property + def target_dictionary(self): + return self.data_manager.get_target_dictionary(self.target_langs[0]) + + def create_batch_sampler_func( + self, + max_positions, + ignore_invalid_inputs, + max_tokens, + max_sentences, + required_batch_size_multiple=1, + seed=1, + ): + def construct_batch_sampler(dataset, epoch): + splits = [ + s for s, _ in self.datasets.items() if self.datasets[s] == dataset + ] + split = splits[0] if len(splits) > 0 else None + # NEW implementation + if epoch is not None: + # initialize the dataset with the correct starting epoch + dataset.set_epoch(epoch) + + # get indices ordered by example size + start_time = time.time() + logger.info(f"start batch sampler: mem usage: {data_utils.get_mem_usage()}") + + with data_utils.numpy_seed(seed): + indices = dataset.ordered_indices() + logger.info( + f"[{split}] @batch_sampler order indices time: {get_time_gap(start_time, time.time())}" + ) + logger.info(f"mem usage: {data_utils.get_mem_usage()}") + + # filter examples that are too large + if max_positions is not None: + my_time = time.time() + indices = self.filter_indices_by_size( + indices, dataset, max_positions, ignore_invalid_inputs + ) + logger.info( + f"[{split}] @batch_sampler filter_by_size time: {get_time_gap(my_time, time.time())}" + ) + logger.info(f"mem usage: {data_utils.get_mem_usage()}") + + # create mini-batches with given size constraints + my_time = time.time() + batch_sampler = dataset.batch_by_size( + indices, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + + logger.info( + f"[{split}] @batch_sampler batch_by_size time: {get_time_gap(my_time, time.time())}" + ) + logger.info( + f"[{split}] per epoch batch_sampler set-up time: {get_time_gap(start_time, time.time())}" + ) + logger.info(f"mem usage: {data_utils.get_mem_usage()}") + + return batch_sampler + + return construct_batch_sampler + + # we need to override get_batch_iterator because we want to reset the epoch iterator each time + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + ): + """ + Get an iterator that yields batches of data from the given dataset. + + Args: + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_tokens (int, optional): max number of tokens in each batch + (default: None). + max_sentences (int, optional): max number of sentences in each + batch (default: None). + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + required_batch_size_multiple (int, optional): require batch size to + be a multiple of N (default: 1). + seed (int, optional): seed for random number generator for + reproducibility (default: 1). + num_shards (int, optional): shard the data iterator into N + shards (default: 1). + shard_id (int, optional): which shard of the data iterator to + return (default: 0). + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 0). + data_buffer_size (int, optional): number of batches to + preload (default: 0). + disable_iterator_cache (bool, optional): don't cache the + EpochBatchIterator (ignores `FairseqTask::can_reuse_epoch_itr`) + (default: False). + Returns: + ~fairseq.iterators.EpochBatchIterator: a batched iterator over the + given dataset split + """ + # initialize the dataset with the correct starting epoch + assert isinstance(dataset, FairseqDataset) + if dataset in self.dataset_to_epoch_iter: + return self.dataset_to_epoch_iter[dataset] + if self.args.sampling_method == "RoundRobin": + batch_iter = super().get_batch_iterator( + dataset, + max_tokens=max_tokens, + max_sentences=max_sentences, + max_positions=max_positions, + ignore_invalid_inputs=ignore_invalid_inputs, + required_batch_size_multiple=required_batch_size_multiple, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + data_buffer_size=data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + ) + self.dataset_to_epoch_iter[dataset] = batch_iter + return batch_iter + + construct_batch_sampler = self.create_batch_sampler_func( + max_positions, + ignore_invalid_inputs, + max_tokens, + max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + seed=seed, + ) + + epoch_iter = iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=construct_batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + ) + return epoch_iter diff --git a/SpeechT5/fairseq/fairseq/token_generation_constraints.py b/SpeechT5/fairseq/fairseq/token_generation_constraints.py new file mode 100644 index 0000000..e708dc5 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/token_generation_constraints.py @@ -0,0 +1,506 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +"""Implements tracking of constraints for a beam item. + +A list of constraints is given as a list of one or more token +sequences, each of length at least one token. For example, for an input sentence + +> Die maschinelle Übersetzung ist schwer zu kontrollieren. + +We could have the constraints: +* to influence +* hard + +There are two implementations: +* OrderedConstraintState: Tracks progress through an ordered list of multitoken constraints. +* UnorderedConstraintState: Tracks progress through an unordered list of multitoken constraints. + +The difference is that in the first, the constraints are assumed to be +in order; the algorithm will permit zero or more tokens between them. +In the second, the constraints are not ordered, so many orderings will +be explored. + +The same sequence can be present any number of times, and will appear +that many times in the output. +""" + +from collections import Counter +from typing import List, Optional, Set, Tuple + +import torch + + +class ConstraintState: + def __init__(self): + pass + + +def pack_constraints(batch_constraints: List[List[torch.Tensor]]) -> torch.Tensor: + """Takes a list of list of constraints in tensor form (a list of + tensor constraints for each sentence) and transforms it into a + packed Tensor. For example, here is a batch of size 3 with 3, 0, + and 1 constraints: + + [ [ [3 1 2], [3], [4 5 6 7], ] + [], + [ [1 8 9 10 1 4 11 12], ] + ] + + Its corresponding packed structure is: + + [ [ 3 3 1 2 0 3 0 4 5 6 7 0], + [ 0 0 0 0 0 0 0 0 0 0 0 0], + [ 1 1 8 9 10 1 4 11 12 0 0 0] ] + + The packed tensor has shape (batch size, maxlen), where + maxlen is defined below. Each row contains concatenated + constraint tokens for that sentence, with 0 appended after + each constraint. The first item in each row is the number + of constraints for that sentence. So maxlen is the maximum + of + + (number of constraints) + (sum length of constraints) + 1. + + across all sentences in the batch. + """ + # The maximum word length of concatenated constraints for any sentence + max_constraints_len = 1 + for sentence_constraints in batch_constraints: + if len(sentence_constraints): + # number of constraints, plus sum of constrain lens, plus a zero after each + constraints_len = ( + 1 + + sum([c.size(0) for c in sentence_constraints]) + + len(sentence_constraints) + ) + max_constraints_len = max(max_constraints_len, constraints_len) + + batch_size = len(batch_constraints) + constraints_tensor = torch.zeros((batch_size, max_constraints_len)).long() + for i, sentence_constraints in enumerate(batch_constraints): + constraints_tensor[i, 0] = len(sentence_constraints) + offset = 1 + for j, constraint in enumerate(sentence_constraints): + this_len = constraint.size(0) + constraints_tensor[i, offset : offset + this_len] = constraint + offset += this_len + 1 + + return constraints_tensor.long() + + +def unpack_constraints(constraint_tensor: torch.Tensor) -> List[torch.Tensor]: + """ + Transforms *one row* of a packed constraint tensor (e.g., for one + sentence in the batch) into a list of constraint tensors. + """ + constraint_list = [] + num_constraints = constraint_tensor[0] + constraints = constraint_tensor.tolist() + offset = 1 + for i in range(num_constraints): + where = constraints.index(0, offset) + constraint_list.append(constraint_tensor[offset:where]) + offset = where + 1 + + return constraint_list + + +class ConstraintNode: + """ + Represents a node in a trie managing unordered constraints. + """ + + def __init__(self, token: int = None, parent=None): + # The token associate with this node (None for the root) + self.token = int(token) if token is not None else None + # The parent (None at the root) + self.parent = parent + # Whether this node is a completed constraint + self.terminal = 0 + # List of child nodes + self.children = {} + + # The cumulative number of constraints from this point in the + # trie forward + self.num_constraints = 0 + + @property + def id(self): + return self.token + + def __str__(self): + term = self.terminal != 0 + return f"[{self.token}].{term}#{self.num_constraints}" + + def __getitem__(self, key: int): + return self.children.get(key, None) + + def next_tokens(self) -> Set[int]: + """The set of child labels.""" + return set(self.children.keys()) + + @staticmethod + def create(constraints: List[List[int]]): + root = ConstraintNode() + for sequence in constraints: + root.add_sequence(sequence) + + return root + + @staticmethod + def print_graph(node: "ConstraintNode"): + if len(node.children) == 0: + return str(node) + else: + s = f"({node}" + for child in node.children.values(): + s += " " + ConstraintNode.print_graph(child) + s += ")" + return s + + def token_counts(self) -> Counter: + """Returns a counter of the number of times each token is used + in a constraint. + """ + token_counts = Counter() + kids = list(self.children.values()) + while len(kids) > 0: + kid = kids.pop() + token_counts[kid.id] += kid.num_constraints + kids += list(kid.children.values()) + + return token_counts + + def tokens(self) -> Set[int]: + """Returns the set of tokens in constraints.""" + return set(self.token_counts().keys()) + + def add_sequence(self, sequence: List[int]): + """Adds a constraint, represented as a list of integers, to + the trie.""" + assert len(sequence) > 0 + + token = int(sequence[0]) + if token not in self.children: + self.children[token] = ConstraintNode(token, parent=self) + + node = self.children[token] + if len(sequence) == 1: + node.terminal += 1 + node.num_constraints += 1 + parent = node.parent + while parent is not None: + parent.num_constraints += 1 + parent = parent.parent + else: + node.add_sequence(sequence[1:]) + + +class UnorderedConstraintState(ConstraintState): + """ + Records progress through the set of constraints for each item in the beam + using a trie. + """ + + def __init__(self, node: ConstraintNode, copy_from: "ConstraintState" = None): + self.node = node + + if copy_from is None: + # The root node + self.root = node + # The set of states in the graph that have been completed + self.completed = Counter() + # The... + self.generated = Counter() + # The list of tokens we need to generate + self.needed_tokens = self.root.tokens() + else: + self.completed = Counter(copy_from.completed) + self.generated = Counter(copy_from.generated) + self.root = copy_from.root + + # Mark the node as generated + if self.node != self.root: + self.generated[node] += 1 + + @staticmethod + def create(constraint_tensor: torch.Tensor): + constraint_list = unpack_constraints(constraint_tensor) + constraint_trie_root = ConstraintNode.create(constraint_list) + return UnorderedConstraintState(constraint_trie_root) + + def __str__(self): + gen_str = ",".join([str(node) for node in self.generated]) + return f"{self.name}/{self.bank}({gen_str})x{self.num_completed}" + + def __copy__(self): + copied_state = UnorderedConstraintState(self.node, copy_from=self) + return copied_state + + def copy(self): + return self.__copy__() + + @property + def name(self): + if self.node.id is None: + return "ROOT" + else: + return str(self.node.id) + + @property + def is_root(self): + return self.node == self.root + + @property + def bank(self): + return sum(self.generated.values()) + + @property + def num_completed(self): + """The number of constraints (not constraint tokens) that are completed. + In addition to the already-completed states, we need to account for the + current state, which might get marked as completed when another token + is generated. + """ + in_final = self.node.terminal and self.completed[self.node] < self.node.terminal + return sum(self.completed.values()) + in_final + + @property + def finished(self): + return self.root.num_constraints - self.num_completed == 0 + + @property + def token_counts(self): + return self.root.token_counts() + + @property + def tokens(self): + return self.root.tokens() + + @property + def num_constraint_tokens(self): + return sum(self.token_counts.values()) + + def next_tokens(self) -> Set[int]: + """Returns the list of tokens that could come next. + These are (a) all tokens extending the root state and, for + non-root states, additionally all tokens extending the current + state.""" + + if self.node != self.root: + return self.root.next_tokens().union(self.node.next_tokens()) + else: + return self.root.next_tokens() + + def advance(self, token: int): + """Reads in a token and advances the state. Here's how it works. + + We can advance to the next state if: + - there is a matching child + - its path isn't blocked + + A path is blocked when all constraints that are descendants of + that node have already been generated, in the current state. + + If we are not able to advance from the current state, we "fall + off the graph" and return to the root state. There, we again + try to advance, checking the same criteria. + + In any case, when falling off the graph, we need to do some + bookkeeping. We: + - check whether any constraints were met (all prefixes of + current state) + - if one is found, mark it as completed + - adjust visited nodes accordingly + """ + token = int(token) + + next_state = None + child = self.node[token] + if child is not None and self.generated[child] < child.num_constraints: + next_state = UnorderedConstraintState(child, copy_from=self) + + def rewind(): + """If we're mid-trie and an "illegal" token is chosen next, we need + to reset our state to the root state. However, along the way, we need + to check whether a prefix of the current trie state represents a state + we could mark as completed. + """ + node = self.node + while node != self.root: + if node.terminal and self.completed[node] < node.terminal: + next_state.completed[node] += 1 + return + + next_state.generated[node] -= 1 + node = node.parent + + # Fall off the graph, check the root + if next_state is None and token in self.root.next_tokens(): + child = self.root[token] + # We can only traverse this edge if it's not saturated + if self.generated[child] < child.num_constraints: + next_state = UnorderedConstraintState(child, copy_from=self) + else: + next_state = UnorderedConstraintState(self.root, copy_from=self) + + # Rewind + rewind() + + elif next_state is None: + next_state = UnorderedConstraintState(self.root, copy_from=self) + # Rewind + rewind() + + return next_state + + +class ConstraintSequence: + def __init__(self, sequences: List[List[int]]): + """Represents a set of possibly multitoken constraints by + concatenating them and internally recording the end points. + """ + self.sequences = [] + self.endpoints = [] + self.num_tokens = 0 + self.tokens = set() + for sequence in sequences: + for token in sequence: + self.tokens.add(token) + self.num_tokens += len(sequence) + self.endpoints += [False for x in range(len(sequence) - 1)] + [True] + self.sequences += sequence + + def __getitem__(self, key: int): + return self.sequences[key] + + def __len__(self): + return len(self.sequences) + + def __str__(self): + return str(self.sequences) + + +class OrderedConstraintState(ConstraintState): + """ + Records progress through the set of linear nonbranching constraints with gaps. + """ + + def __init__(self, sequence: ConstraintSequence, state: int = -1): + self.sequence = sequence + self.state = state + + @staticmethod + def create(constraint_tensor: torch.Tensor): + constraint_list = unpack_constraints(constraint_tensor) + return OrderedConstraintState(ConstraintSequence(constraint_list), -1) + + def __str__(self): + return f"{self.state}/{self.bank}x{self.num_completed}" + + def __copy__(self): + return OrderedConstraintState(self.sequence, self.state) + + def copy(self): + return self.__copy__() + + @property + def num_completed(self): + if self.state == -1: + return 0 + count = len( + list(filter(lambda x: x, self.sequence.endpoints[0 : self.state + 1])) + ) + return count + + @property + def is_root(self): + return self.state == -1 + + @property + def name(self): + if self.state == -1: + return "ROOT" + else: + return str(self.sequence[self.state]) + + @property + def bank(self) -> int: + return self.state + 1 + + @property + def finished(self): + return self.state + 1 == len(self.sequence) + + @property + def token_counts(self): + return self.sequence.token_counts() + + @property + def tokens(self): + return self.sequence.tokens + + @property + def num_constraint_tokens(self): + return sum(self.token_counts.values()) + + def next_tokens(self) -> Set[int]: + """Returns the list of tokens that could come next. + These are (a) all tokens extending the root state and, for + non-root states, additionally all tokens extending the current + state.""" + + tokens = set() + if self.state > 0: + tokens.add(self.sequence[0]) + if not self.finished: + tokens.add(self.sequence[self.state + 1]) + return tokens + + def advance(self, token: int): + """Reads in a token and advances the state. Here's how it works. + + We can advance to the next state if: + - there is a matching child + - its path isn't blocked + + A path is blocked when all constraints that are descendants of + that node have already been generated, in the current state. + + If we are not able to advance from the current state, we "fall + off the graph" and return to the root state. There, we again + try to advance, checking the same criteria. + + In any case, when falling off the graph, we need to do some + bookkeeping. We: + - check whether any constraints were met (all prefixes of + current state) + - if one is found, mark it as completed + - adjust visited nodes accordingly + """ + token = int(token) + # print(f"{self} ADVANCE({token}) {self.sequence} -> ", end="") + + if self.finished: + # Accept anything + next_state = self.copy() + + elif self.sequence[self.state + 1] == token: + # Advance to the next token + next_state = OrderedConstraintState(self.sequence, self.state + 1) + + elif self.sequence.endpoints[self.state]: + # Accept anything between constraints (*) + next_state = self.copy() + + elif token == self.sequence[0]: + # Start over having generated the first token + next_state = OrderedConstraintState(self.sequence, 0) + else: + # Start over from the root + next_state = OrderedConstraintState(self.sequence, -1) + + return next_state diff --git a/SpeechT5/fairseq/fairseq/tokenizer.py b/SpeechT5/fairseq/fairseq/tokenizer.py new file mode 100644 index 0000000..42131f7 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/tokenizer.py @@ -0,0 +1,15 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import re + + +SPACE_NORMALIZER = re.compile(r"\s+") + + +def tokenize_line(line): + line = SPACE_NORMALIZER.sub(" ", line) + line = line.strip() + return line.split() diff --git a/SpeechT5/fairseq/fairseq/trainer.py b/SpeechT5/fairseq/fairseq/trainer.py new file mode 100644 index 0000000..1deb143 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/trainer.py @@ -0,0 +1,1439 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Train a network across multiple GPUs. +""" + +import contextlib +import logging +import sys +import time +from argparse import Namespace +from itertools import chain +from typing import Any, Dict, List + +import torch +from fairseq import checkpoint_utils, models, optim, utils +from fairseq.dataclass.configs import FairseqConfig +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.distributed import utils as distributed_utils +from fairseq.file_io import PathManager +from fairseq.logging import meters, metrics +from fairseq.nan_detector import NanDetector +from fairseq.optim import lr_scheduler +from omegaconf import OmegaConf + +logger = logging.getLogger(__name__) + + +class Trainer(object): + """Main class for data parallel training. + + This class supports synchronous distributed data parallel training, + where multiple workers each have a full model replica and gradients + are accumulated across workers before each update. We use + :class:`~torch.nn.parallel.DistributedDataParallel` to handle + communication of the gradients across workers. + """ + + def __init__(self, cfg: FairseqConfig, task, model, criterion, quantizer=None): + + if isinstance(cfg, Namespace): + logger.warning( + "argparse.Namespace configuration is deprecated! Automatically converting to OmegaConf" + ) + cfg = convert_namespace_to_omegaconf(cfg) + + self.cfg = cfg + self.task = task + + # catalog shared parameters + shared_params = _catalog_shared_params(model) + self.tpu = cfg.common.tpu + self.cuda = torch.cuda.is_available() and not cfg.common.cpu and not self.tpu + if self.cuda: + self.device = torch.device("cuda") + elif self.tpu: + self.device = utils.get_tpu_device() + else: + self.device = torch.device("cpu") + + if self.cfg.distributed_training.ddp_backend == "fully_sharded": + if self.cfg.common.bf16: + raise ValueError( + "FullyShardedDataParallel is not compatible with --bf16 or " + "--memory-efficient-bf16" + ) + if self.cfg.distributed_training.zero_sharding != "none": + raise ValueError( + "FullyShardedDataParallel is not compatible with --zero-sharding " + "option (it's already built in)" + ) + else: + if ( + hasattr(self.cfg.distributed_training, "cpu_offload") + and self.cfg.distributed_training.cpu_offload + ): + raise ValueError("--cpu-offload requires --ddp-backend=fully_sharded") + + # copy model and criterion to current device/dtype + self._criterion = criterion + self._model = model + if cfg.distributed_training.ddp_backend != "fully_sharded": + if cfg.common.fp16: + assert not cfg.common.amp, "Cannot use fp16 and AMP together" + self._criterion = self._criterion.half() + self._model = self._model.half() + elif cfg.common.bf16: + self._criterion = self._criterion.to(dtype=torch.bfloat16) + self._model = self._model.to(dtype=torch.bfloat16) + elif cfg.common.amp: + self._amp_retries = 0 + if ( + not cfg.distributed_training.pipeline_model_parallel + # the DistributedFairseqModel wrapper will handle moving to device, + # so only handle cases which don't use the wrapper + and not self.use_distributed_wrapper + ): + self._criterion = self._criterion.to(device=self.device) + self._model = self._model.to(device=self.device) + self.pipeline_model_parallel = cfg.distributed_training.pipeline_model_parallel + self.last_device = None + if self.cuda and self.pipeline_model_parallel: + self.last_device = torch.device( + cfg.distributed_training.pipeline_devices[-1] + ) + + # check that shared parameters are preserved after device transfer + for shared_param in shared_params: + ref = _get_module_by_path(self._model, shared_param[0]) + for path in shared_param[1:]: + logger.info( + "detected shared parameter: {} <- {}".format(shared_param[0], path) + ) + _set_module_by_path(self._model, path, ref) + + self._dummy_batch = None # indicates we don't have a dummy batch at first + self._lr_scheduler = None + self._num_updates = 0 + self._num_xla_compiles = 0 # for TPUs + self._optim_history = None + self._optimizer = None + self._warn_once = set() + self._wrapped_criterion = None + self._wrapped_model = None + + # TODO(myleott): support tpu + if self.cuda and self.data_parallel_world_size > 1: + self._grad_norm_buf = torch.cuda.DoubleTensor(self.data_parallel_world_size) + else: + self._grad_norm_buf = None + + self.quantizer = quantizer + if self.quantizer is not None: + self.quantizer.set_trainer(self) + + # get detailed cuda environment + if self.cuda: + self.cuda_env = utils.CudaEnvironment() + if self.data_parallel_world_size > 1: + self.cuda_env_arr = distributed_utils.all_gather_list( + self.cuda_env, group=distributed_utils.get_global_group() + ) + else: + self.cuda_env_arr = [self.cuda_env] + if self.data_parallel_rank == 0: + utils.CudaEnvironment.pretty_print_cuda_env_list(self.cuda_env_arr) + else: + self.cuda_env = None + self.cuda_env_arr = None + + metrics.log_start_time("wall", priority=790, round=0) + + self._start_time = time.time() + self._previous_training_time = 0 + self._cumulative_training_time = None + + def reinitialize(self): + """Reinitialize the Trainer, typically after model params change.""" + self._lr_scheduler = None + self._optimizer = None + self._wrapped_criterion = None + self._wrapped_model = None + + @property + def data_parallel_world_size(self): + if self.cfg.distributed_training.distributed_world_size == 1: + return 1 + return distributed_utils.get_data_parallel_world_size() + + @property + def data_parallel_process_group(self): + return distributed_utils.get_data_parallel_group() + + @property + def data_parallel_rank(self): + if self.cfg.distributed_training.distributed_world_size == 1: + return 0 + return distributed_utils.get_data_parallel_rank() + + @property + def is_data_parallel_master(self): + # NOTE: this returns true for all model parallel replicas with data + # parallel rank 0 + return self.data_parallel_rank == 0 + + @property + def use_distributed_wrapper(self) -> bool: + return ( + self.data_parallel_world_size > 1 and not self.cfg.optimization.use_bmuf + ) or ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and self.cfg.distributed_training.cpu_offload + ) + + @property + def should_save_checkpoint_on_current_rank(self) -> bool: + """Indicates whether to save checkpoints on the current DDP rank.""" + if ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and self.cfg.distributed_training.use_sharded_state + ) or getattr(self.cfg.model, "base_layers", 0) > 0: + return True + else: + return self.is_data_parallel_master + + @property + def always_call_state_dict_during_save_checkpoint(self) -> bool: + if ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and not self.cfg.distributed_training.use_sharded_state + ): + # FSDP calls communication collective when consolidating checkpoints + return True + else: + return False + + @property + def checkpoint_suffix(self) -> str: + """Suffix to add to the checkpoint file name.""" + if ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and self.cfg.distributed_training.use_sharded_state + ): + return self.cfg.checkpoint.checkpoint_suffix + "-shard{0}".format( + self.data_parallel_rank + ) + else: + return self.cfg.checkpoint.checkpoint_suffix or "" + + @property + def criterion(self): + if self._wrapped_criterion is None: + if utils.has_parameters(self._criterion) and self.use_distributed_wrapper: + self._wrapped_criterion = models.DistributedFairseqModel( + self.cfg.distributed_training, + self._criterion, + process_group=self.data_parallel_process_group, + device=self.device, + ) + else: + self._wrapped_criterion = self._criterion + return self._wrapped_criterion + + @property + def model(self): + if self._wrapped_model is None: + if self.use_distributed_wrapper: + self._wrapped_model = models.DistributedFairseqModel( + self.cfg.distributed_training, + self._model, + process_group=self.data_parallel_process_group, + device=self.device, + ) + else: + self._wrapped_model = self._model + return self._wrapped_model + + @property + def optimizer(self): + if self._optimizer is None: + self._build_optimizer() + return self._optimizer + + @property + def lr_scheduler(self): + if self._lr_scheduler is None: + self._build_optimizer() # this will initialize self._lr_scheduler + return self._lr_scheduler + + def _build_optimizer(self): + params = list( + filter( + lambda p: p.requires_grad, + chain(self.model.parameters(), self.criterion.parameters()), + ) + ) + + if ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and self.cfg.common.fp16 + ): + # FullyShardedDataParallel always uses MemoryEfficientFP16 wrapper, + # mostly for the grad scaling. But if we don't have the + # --memory-efficient-fp16 flag set, then we're effectively doing + # regular --fp16 and can allow the use of optimizers that would + # otherwise be unsupported by MemoryEfficientFP16Optimizer. + allow_unsupported = not self.cfg.common.memory_efficient_fp16 + self._optimizer = optim.MemoryEfficientFP16Optimizer.build_optimizer( + self.cfg, params, allow_unsupported=allow_unsupported + ) + elif self.cfg.common.fp16 or self.cfg.common.bf16 or self.cfg.common.amp: + if self.cuda and torch.cuda.get_device_capability(0)[0] < 7: + logger.info( + "NOTE: your device does NOT support faster training with --fp16 or --amp, " + "please switch to FP32 which is likely to be faster" + ) + if ( + self.cfg.common.memory_efficient_fp16 + or self.cfg.common.memory_efficient_bf16 + ): + self._optimizer = optim.MemoryEfficientFP16Optimizer.build_optimizer( + self.cfg, params + ) + elif self.cfg.common.amp: + self._optimizer = optim.AMPOptimizer.build_optimizer(self.cfg, params) + else: + self._optimizer = optim.FP16Optimizer.build_optimizer(self.cfg, params) + else: + if self.cuda and torch.cuda.get_device_capability(0)[0] >= 7: + logger.info("NOTE: your device may support faster training with --fp16 or --amp") + self._optimizer = optim.build_optimizer(self.cfg.optimizer, params) + + if self.cfg.distributed_training.ddp_backend == "fully_sharded": + assert ( + not self.cfg.optimization.use_bmuf + ), "--ddp-backend=fully_sharded is not compatible with BMUF" + assert self._optimizer.supports_flat_params, ( + "--ddp-backend=fully_sharded is only compatible with pointwise " + "optimizers (e.g., Adam, AdamW, Adadelta, Adamax, SGD, etc.). " + "However, the sharding will result in slightly different results when " + "using non-pointwise optimizers (e.g., Adagrad, Adafactor, LAMB)" + ) + + if self.cfg.optimization.use_bmuf: + self._optimizer = optim.FairseqBMUF( + self.cfg.bmuf, + self._optimizer, + ) + + if self.cfg.distributed_training.zero_sharding == "os": + if ( + self.cfg.common.fp16 + and not self.cfg.common.memory_efficient_fp16 + and not self.cfg.common.memory_efficient_bf16 + ) and not self.cfg.common.fp16_no_flatten_grads: + raise ValueError( + "ZeRO is incomptabile with fp16 and flattened grads. " + "Please use --fp16-no-flatten-grads" + ) + else: + optim.shard_(self._optimizer, self.data_parallel_process_group) + + # We should initialize the learning rate scheduler immediately after + # building the optimizer, so that the initial learning rate is set. + self._lr_scheduler = lr_scheduler.build_lr_scheduler( + self.cfg.lr_scheduler, + self.optimizer, + ) + self._lr_scheduler.step_update(0) + + def consolidate_optimizer(self): + """For OSS, we need to consolidate the state dict.""" + if self.cfg.checkpoint.no_save_optimizer_state: + return + self._gathered_optim_state = None + if hasattr(self.optimizer.optimizer, "consolidate_state_dict"): + self.optimizer.optimizer.consolidate_state_dict() + + elif ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and not self.model.use_sharded_state + ): + st = self.model.gather_full_optim_state_dict( + self.optimizer + ) # only returns on rank 0 + self._gathered_optim_state = st + + def state_dict(self): + state_dict = { + "args": None, # legacy + "cfg": ( + OmegaConf.to_container(self.cfg, resolve=True, enum_to_str=True) + if OmegaConf.is_config(self.cfg) + else self.cfg + ), + "model": self.model.state_dict(), + "criterion": ( + self.criterion.state_dict() + if utils.has_parameters(self.criterion) + else None + ), + "optimizer_history": (self._optim_history or []) + + [ + { + "criterion_name": self.get_criterion().__class__.__name__, + "optimizer_name": self.optimizer.__class__.__name__, + "lr_scheduler_state": self.lr_scheduler.state_dict(), + "num_updates": self.get_num_updates(), + } + ], + "task_state": self.task.state_dict() if self.task is not None else {}, + "extra_state": { + "metrics": metrics.state_dict(), + "previous_training_time": self.cumulative_training_time(), + }, + } + if not self.cfg.checkpoint.no_save_optimizer_state: + if self._gathered_optim_state is not None: + state_dict["last_optimizer_state"] = self._gathered_optim_state + self._gathered_optim_state = None + else: + state_dict["last_optimizer_state"] = self.optimizer.state_dict() + if self.cfg.distributed_training.ddp_backend == "fully_sharded": + # save meta data for recombining checkpoint upon loading + state_dict["fsdp_metadata"] = self.model.local_metadata_dict() + return state_dict + + def save_checkpoint(self, filename, extra_state): + """Save all training state in a checkpoint file.""" + logger.info(f"Saving checkpoint to {filename}") + # call state_dict on all ranks in case it needs internal communication + state_dict = utils.move_to_cpu(self.state_dict()) + state_dict["extra_state"].update(extra_state) + if self.should_save_checkpoint_on_current_rank: + checkpoint_utils.torch_persistent_save( + state_dict, + filename, + async_write=self.cfg.checkpoint.write_checkpoints_asynchronously, + ) + logger.info(f"Finished saving checkpoint to {filename}") + + def load_checkpoint( + self, + filename, + reset_optimizer=False, + reset_lr_scheduler=False, + optimizer_overrides=None, + reset_meters=False, + ): + """ + Load all training state from a checkpoint file. + rank = 0 will load the checkpoint, and then broadcast it to all + other ranks. + """ + extra_state, self._optim_history, last_optim_state = None, [], None + + logger.info(f"Preparing to load checkpoint {filename}") + is_distributed = self.data_parallel_world_size > 1 + bexists = PathManager.isfile(filename) + if bexists: + load_on_all_ranks = ( + self.cfg.checkpoint.load_checkpoint_on_all_dp_ranks + # TPUs don't support broadcast yet, so load checkpoints + # on every worker for now + or self.tpu + # FSDP requires loading checkpoint shards on all ranks + or ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and self.cfg.distributed_training.use_sharded_state + ) + or getattr(self.cfg.model, "base_layers", 0) > 0 + ) + + if load_on_all_ranks or self.data_parallel_rank == 0: + state = checkpoint_utils.load_checkpoint_to_cpu( + filename, load_on_all_ranks=load_on_all_ranks + ) + last_optim_state = state.get("last_optimizer_state", None) + + # If doing zero_sharding, do not broadcast global optimizer + # state. Later we will broadcast sharded states to each rank + # to avoid memory from exploding. + if ( + not load_on_all_ranks + and self.cfg.distributed_training.zero_sharding == "os" + and "last_optimizer_state" in state + and is_distributed + ): + state["last_optimizer_state"] = "SHARDED" + else: + last_optim_state = None + state = None + + if is_distributed and not load_on_all_ranks: + state = distributed_utils.broadcast_object( + state, + src_rank=0, + group=self.data_parallel_process_group, + dist_device=self.device, + ) + if self.data_parallel_rank > 0: + last_optim_state = state.get("last_optimizer_state", None) + + # load model parameters + try: + self.model.load_state_dict( + state["model"], strict=True, model_cfg=self.cfg.model + ) + # save memory for later steps + del state["model"] + if utils.has_parameters(self.get_criterion()): + self.get_criterion().load_state_dict( + state["criterion"], strict=True + ) + del state["criterion"] + + except Exception: + raise Exception( + "Cannot load model parameters from checkpoint {}; " + "please ensure that the architectures match.".format(filename) + ) + extra_state = state["extra_state"] + self._optim_history = state["optimizer_history"] + + if last_optim_state is not None and not reset_optimizer: + # rebuild optimizer after loading model, since params may have changed + self._build_optimizer() + + # only reload optimizer and lr_scheduler if they match + last_optim = self._optim_history[-1] + assert ( + last_optim["criterion_name"] == self.get_criterion().__class__.__name__ + ), f"Criterion does not match; please reset the optimizer (--reset-optimizer). {last_optim['criterion_name']} vs {self.get_criterion().__class__.__name__}" + assert ( + last_optim["optimizer_name"] == self.optimizer.__class__.__name__ + ), f"Optimizer does not match; please reset the optimizer (--reset-optimizer). {last_optim['optimizer_name']} vs {self.optimizer.__class__.__name__}" + + if not reset_lr_scheduler: + self.lr_scheduler.load_state_dict(last_optim["lr_scheduler_state"]) + + if ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and not self.model.use_sharded_state + ): + # if use_sharded_state, the last_optim_state is already sharded, skip this + last_optim_state = self.model.get_shard_from_optim_state_dict( + last_optim_state + ) + elif not load_on_all_ranks and is_distributed: + last_optim_state = self.optimizer.broadcast_global_state_dict( + last_optim_state + ) + + self.optimizer.load_state_dict(last_optim_state, optimizer_overrides) + + self.set_num_updates(last_optim["num_updates"]) + + if extra_state is not None: + itr_state = extra_state["train_iterator"] + epoch = itr_state["epoch"] + + if "previous_training_time" in extra_state: + self._previous_training_time = extra_state["previous_training_time"] + self._start_time = time.time() + + self.lr_step(epoch) + + if ( + itr_state.get("version", 1) >= 2 + and itr_state["iterations_in_epoch"] == 0 + ): + # reset meters at start of epoch + reset_meters = True + + if "metrics" in extra_state and not reset_meters: + metrics.load_state_dict(extra_state["metrics"]) + + # reset TimeMeters, since their start times don't make sense anymore + for meter in metrics.get_meters("default"): + if isinstance(meter, meters.TimeMeter): + meter.reset() + + logger.info( + "Loaded checkpoint {} (epoch {} @ {} updates)".format( + filename, epoch, self.get_num_updates() + ) + ) + + else: + logger.info("No existing checkpoint found {}".format(filename)) + + return extra_state + + def get_train_iterator( + self, + epoch, + combine=True, + load_dataset=True, + data_selector=None, + shard_batch_itr=True, + disable_iterator_cache=False, + ): + """Return an EpochBatchIterator over the training set for a given epoch.""" + if load_dataset: + logger.info("loading train data for epoch {}".format(epoch)) + self.task.load_dataset( + self.cfg.dataset.train_subset, + epoch=epoch, + combine=combine, + data_selector=data_selector, + tpu=self.tpu, + ) + batch_iterator = self.task.get_batch_iterator( + dataset=self.task.dataset(self.cfg.dataset.train_subset), + max_tokens=self.cfg.dataset.max_tokens, + max_sentences=self.cfg.dataset.batch_size, + max_positions=utils.resolve_max_positions( + self.task.max_positions(), + self.model.max_positions(), + self.cfg.dataset.max_tokens, + ), + ignore_invalid_inputs=True, + required_batch_size_multiple=self.cfg.dataset.required_batch_size_multiple, + seed=self.cfg.common.seed, + num_shards=self.data_parallel_world_size if shard_batch_itr else 1, + shard_id=self.data_parallel_rank if shard_batch_itr else 0, + num_workers=self.cfg.dataset.num_workers, + epoch=epoch, + data_buffer_size=self.cfg.dataset.data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + ) + self.reset_dummy_batch(batch_iterator.first_batch) + return batch_iterator + + def get_valid_iterator( + self, + subset, + disable_iterator_cache=False, + ): + """Return an EpochBatchIterator over given validation subset for a given epoch.""" + batch_iterator = self.task.get_batch_iterator( + dataset=self.task.dataset(subset), + max_tokens=self.cfg.dataset.max_tokens_valid, + max_sentences=self.cfg.dataset.batch_size_valid, + max_positions=utils.resolve_max_positions( + self.task.max_positions(), + self.model.max_positions(), + ), + ignore_invalid_inputs=self.cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=self.cfg.dataset.required_batch_size_multiple, + seed=self.cfg.common.seed, + num_shards=self.data_parallel_world_size, + shard_id=self.data_parallel_rank, + num_workers=self.cfg.dataset.num_workers, + # always pass a fixed "epoch" to keep validation data consistent + # across training epochs + epoch=1, + data_buffer_size=self.cfg.dataset.data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + ) + self.reset_dummy_batch(batch_iterator.first_batch) + return batch_iterator + + def begin_epoch(self, epoch): + """Called at the beginning of each epoch.""" + logger.info("begin training epoch {}".format(epoch)) + + self.lr_step_begin_epoch(epoch) + + if self.quantizer is not None: + self.quantizer.begin_epoch(epoch) + + # task specific setup per epoch + self.task.begin_epoch(epoch, self.get_model()) + + if self.tpu: + import torch_xla.core.xla_model as xm + + xm.rendezvous("begin_epoch") # wait for all workers + xm.mark_step() + + def begin_valid_epoch(self, epoch): + """Called at the beginning of each validation epoch.""" + + # task specific setup per validation epoch + self.task.begin_valid_epoch(epoch, self.get_model()) + + def reset_dummy_batch(self, batch): + self._dummy_batch = batch + + @metrics.aggregate("train") + def train_step(self, samples, raise_oom=False): + """Do forward, backward and parameter update.""" + self._set_seed() + self.model.train() + self.criterion.train() + self.zero_grad() + + metrics.log_start_time("train_wall", priority=800, round=0) + + # forward and backward pass + logging_outputs, sample_size, ooms = [], 0, 0 + for i, sample in enumerate(samples): # delayed update loop + sample, is_dummy_batch = self._prepare_sample(sample) + + def maybe_no_sync(): + """ + Whenever *samples* contains more than one mini-batch, we + want to accumulate gradients locally and only call + all-reduce in the last backwards pass. + """ + if ( + self.data_parallel_world_size > 1 + and hasattr(self.model, "no_sync") + and i < len(samples) - 1 + ): + return self.model.no_sync() + else: + return contextlib.ExitStack() # dummy contextmanager + + try: + with maybe_no_sync(): + # forward and backward + loss, sample_size_i, logging_output = self.task.train_step( + sample=sample, + model=self.model, + criterion=self.criterion, + optimizer=self.optimizer, + update_num=self.get_num_updates(), + ignore_grad=is_dummy_batch, + ) + del loss + + logging_outputs.append(logging_output) + sample_size += sample_size_i + + # emptying the CUDA cache after the first step can + # reduce the chance of OOM + if self.cuda and self.get_num_updates() == 0: + torch.cuda.empty_cache() + except RuntimeError as e: + if "out of memory" in str(e): + self._log_oom(e) + if raise_oom: + raise e + logger.warning( + "attempting to recover from OOM in forward/backward pass" + ) + ooms += 1 + self.zero_grad() + if self.cuda: + torch.cuda.empty_cache() + if self.cfg.distributed_training.distributed_world_size == 1: + return None + else: + raise e + + if self.tpu and i < len(samples) - 1: + # tpu-comment: every XLA operation before marking step is + # appended to the IR graph, and processing too many batches + # before marking step can lead to OOM errors. + # To handle gradient accumulation use case, we explicitly + # mark step here for every forward pass without a backward pass + self._xla_markstep_and_send_to_cpu() + + if is_dummy_batch: + if torch.is_tensor(sample_size): + sample_size.zero_() + else: + sample_size *= 0.0 + + if torch.is_tensor(sample_size): + sample_size = sample_size.float() + else: + sample_size = float(sample_size) + + # gather logging outputs from all replicas + if self._sync_stats(): + train_time = self._local_cumulative_training_time() + logging_outputs, ( + sample_size, + ooms, + total_train_time, + ) = self._aggregate_logging_outputs( + logging_outputs, sample_size, ooms, train_time, ignore=is_dummy_batch + ) + self._cumulative_training_time = ( + total_train_time / self.data_parallel_world_size + ) + + overflow = False + try: + with torch.autograd.profiler.record_function("reduce-grads"): + # reduce gradients across workers + self.optimizer.all_reduce_grads(self.model) + if utils.has_parameters(self.criterion): + self.optimizer.all_reduce_grads(self.criterion) + + with torch.autograd.profiler.record_function("multiply-grads"): + # multiply gradients by (data_parallel_size / sample_size) since + # DDP normalizes by the number of data parallel workers for + # improved fp16 precision. + # Thus we get (sum_of_gradients / sample_size) at the end. + # In case of fp16, this step also undoes loss scaling. + # (Debugging note: Some optimizers perform this scaling on the + # fly, so inspecting model.parameters() or optimizer.params may + # still show the original, unscaled gradients.) + numer = ( + self.data_parallel_world_size + if not self.cfg.optimization.use_bmuf or self._sync_stats() + else 1 + ) + self.optimizer.multiply_grads(numer / (sample_size or 1.0)) + # Note: (sample_size or 1.0) handles the case of a zero gradient, in a + # way that avoids CPU/device transfers in case sample_size is a GPU or + # TPU object. The assumption is that the gradient itself is also 0. + + with torch.autograd.profiler.record_function("clip-grads"): + # clip grads + grad_norm = self.clip_grad_norm(self.cfg.optimization.clip_norm) + + # check that grad norms are consistent across workers + # on tpu check tensor is slow + if not self.tpu: + if ( + not self.cfg.optimization.use_bmuf + and self.cfg.distributed_training.ddp_backend != "slow_mo" + ): + self._check_grad_norms(grad_norm) + if not torch.isfinite(grad_norm).all(): + # in case of AMP, if gradients are Nan/Inf then + # optimizer step is still required + if self.cfg.common.amp: + overflow = True + else: + # check local gradnorm single GPU case, trigger NanDetector + raise FloatingPointError("gradients are Nan/Inf") + + with torch.autograd.profiler.record_function("optimizer"): + # take an optimization step + self.task.optimizer_step( + self.optimizer, model=self.model, update_num=self.get_num_updates() + ) + if self.cfg.common.amp and overflow: + if self._amp_retries == self.cfg.common.amp_batch_retries: + logger.info("AMP: skipping this batch.") + self._amp_retries = 0 + else: + self._amp_retries += 1 + return self.train_step(samples, raise_oom) # recursion to feed in same batch + + except FloatingPointError: + # re-run the forward and backward pass with hooks attached to print + # out where it fails + self.zero_grad() + with NanDetector(self.get_model()): + for _, sample in enumerate(samples): + sample, _ = self._prepare_sample(sample) + self.task.train_step( + sample, + self.model, + self.criterion, + self.optimizer, + self.get_num_updates(), + ignore_grad=False, + ) + raise + except OverflowError as e: + overflow = True + logger.info( + f"NOTE: gradient overflow detected, ignoring gradient, {str(e)}" + ) + grad_norm = torch.tensor(0.0).cuda() + self.zero_grad() + except RuntimeError as e: + if "out of memory" in str(e): + self._log_oom(e) + logger.error("OOM during optimization, irrecoverable") + raise e + + # Some distributed wrappers (e.g., SlowMo) need access to the optimizer + # after the step + if hasattr(self.model, "perform_additional_optimizer_actions"): + if hasattr(self.optimizer, "fp32_params"): + self.model.perform_additional_optimizer_actions( + self.optimizer.optimizer, self.optimizer.fp32_params + ) + else: + self.model.perform_additional_optimizer_actions( + self.optimizer.optimizer + ) + + logging_output = None + if not overflow or self.cfg.distributed_training.ddp_backend == "slow_mo": + self.set_num_updates(self.get_num_updates() + 1) + + if self.tpu: + import torch_xla.core.xla_model as xm + + # mark step on TPUs + self._xla_markstep_and_send_to_cpu() + + # only log stats every log_interval steps + # this causes wps to be misreported when log_interval > 1 + logging_output = {} + if self.get_num_updates() % self.cfg.common.log_interval == 0: + # log memory usage + mem_info = xm.get_memory_info(self.device) + gb_free = mem_info["kb_free"] / 1024 / 1024 + gb_total = mem_info["kb_total"] / 1024 / 1024 + metrics.log_scalar( + "gb_free", gb_free, priority=1500, round=1, weight=0 + ) + metrics.log_scalar( + "gb_total", gb_total, priority=1600, round=1, weight=0 + ) + logging_outputs = self._xla_markstep_and_send_to_cpu( + logging_outputs + ) + logging_output = self._reduce_and_log_stats( + logging_outputs, sample_size, grad_norm + ) + + # log whenever there's an XLA compilation, since these + # slow down training and may indicate opportunities for + # optimization + self._check_xla_compilation() + else: + if self.cuda and self.cuda_env is not None: + # log minimum free memory over the iteration + gb_used = torch.cuda.max_memory_allocated() / 1024 / 1024 / 1024 + torch.cuda.reset_peak_memory_stats() + gb_free = self.cuda_env.total_memory_in_GB - gb_used + metrics.log_scalar( + "gb_free", gb_free, priority=1500, round=1, weight=0 + ) + + # log stats + logging_output = self._reduce_and_log_stats( + logging_outputs, sample_size, grad_norm + ) + + # clear CUDA cache to reduce memory fragmentation + if ( + self.cuda + and self.cfg.common.empty_cache_freq > 0 + and ( + (self.get_num_updates() + self.cfg.common.empty_cache_freq - 1) + % self.cfg.common.empty_cache_freq + ) + == 0 + ): + torch.cuda.empty_cache() + + if self.cfg.common.fp16 or self.cfg.common.amp: + metrics.log_scalar( + "loss_scale", + ( + self.optimizer.scaler.loss_scale + if self.cfg.common.fp16 + else self.optimizer.scaler.get_scale() + ), + priority=700, + round=4, + weight=0, + ) + + metrics.log_stop_time("train_wall") + return logging_output + + @metrics.aggregate("valid") + def valid_step(self, sample, raise_oom=False): + """Do forward pass in evaluation mode.""" + if self.tpu: + import torch_xla.core.xla_model as xm + + xm.rendezvous("valid_step") # wait for all workers + + with torch.no_grad(): + self.model.eval() + self.criterion.eval() + + sample, is_dummy_batch = self._prepare_sample(sample) + + try: + _loss, sample_size, logging_output = self.task.valid_step( + sample, self.model, self.criterion + ) + except RuntimeError as e: + if "out of memory" in str(e): + self._log_oom(e) + if not raise_oom: + logger.warning( + "ran out of memory in validation step, retrying batch" + ) + for p in self.model.parameters(): + if p.grad is not None: + p.grad = None # free some memory + if self.cuda: + torch.cuda.empty_cache() + return self.valid_step(sample, raise_oom=True) + raise e + + logging_outputs = [logging_output] + if is_dummy_batch: + if torch.is_tensor(sample_size): + sample_size.zero_() + else: + sample_size *= 0.0 + + # gather logging outputs from all replicas + if self.data_parallel_world_size > 1: + logging_outputs, (sample_size,) = self._aggregate_logging_outputs( + logging_outputs, + sample_size, + ignore=is_dummy_batch, + ) + + # log validation stats + if self.tpu: + logging_outputs = self._xla_markstep_and_send_to_cpu(logging_outputs) + logging_output = self._reduce_and_log_stats(logging_outputs, sample_size) + + return logging_output + + def zero_grad(self): + self.optimizer.zero_grad() + + def lr_step_begin_epoch(self, epoch): + """Adjust the learning rate at the beginning of the epoch.""" + self.lr_scheduler.step_begin_epoch(epoch) + # prefer updating the LR based on the number of steps + return self.lr_step_update() + + def lr_step(self, epoch, val_loss=None): + """Adjust the learning rate at the end of the epoch.""" + self.lr_scheduler.step(epoch, val_loss) + # prefer updating the LR based on the number of steps + return self.lr_step_update() + + def lr_step_update(self): + """Update the learning rate after each update.""" + new_lr = self.lr_scheduler.step_update(self.get_num_updates()) + if isinstance(new_lr, dict): + for k, v in new_lr.items(): + metrics.log_scalar(f"lr_{k}", v, weight=0, priority=300) + new_lr = new_lr.get("default", next(iter(new_lr.values()))) + else: + metrics.log_scalar("lr", new_lr, weight=0, priority=300) + return new_lr + + def get_lr(self): + """Get the current learning rate.""" + return self.optimizer.get_lr() + + def get_model(self): + """Get the (non-wrapped) model instance.""" + return self._model + + def get_criterion(self): + """Get the (non-wrapped) criterion instance.""" + return self._criterion + + def get_meter(self, name): + """[deprecated] Get a specific meter by name.""" + from fairseq import meters + + if "get_meter" not in self._warn_once: + self._warn_once.add("get_meter") + utils.deprecation_warning( + "Trainer.get_meter is deprecated. Please use fairseq.metrics instead." + ) + + train_meters = metrics.get_meters("train") + if train_meters is None: + train_meters = {} + + if name == "train_loss" and "loss" in train_meters: + return train_meters["loss"] + elif name == "train_nll_loss": + # support for legacy train.py, which assumed this meter is + # always initialized + m = train_meters.get("nll_loss", None) + return m or meters.AverageMeter() + elif name == "wall": + # support for legacy train.py, which assumed this meter is + # always initialized + m = metrics.get_meter("default", "wall") + return m or meters.TimeMeter() + elif name == "wps": + m = metrics.get_meter("train", "wps") + return m or meters.TimeMeter() + elif name in {"valid_loss", "valid_nll_loss"}: + # support for legacy train.py, which assumed these meters + # are always initialized + k = name[len("valid_") :] + m = metrics.get_meter("valid", k) + return m or meters.AverageMeter() + elif name == "oom": + return meters.AverageMeter() + elif name in train_meters: + return train_meters[name] + return None + + def get_num_updates(self): + """Get the number of parameters updates.""" + return self._num_updates + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self._num_updates = num_updates + self.lr_step_update() + if self.quantizer: + self.quantizer.step_update(self._num_updates) + metrics.log_scalar("num_updates", self._num_updates, weight=0, priority=200) + + def clip_grad_norm(self, clip_norm): + def agg_norm_fn(total_norm): + total_norm = total_norm.cuda().float() ** 2 + total_norm = distributed_utils.all_reduce( + total_norm, group=self.data_parallel_process_group + ) + return total_norm ** 0.5 + + should_agg_norm = ( + self.cfg.distributed_training.ddp_backend == "fully_sharded" + and ( + self.data_parallel_process_group is not None + or torch.distributed.is_initialized() + ) + ) + return self.optimizer.clip_grad_norm( + clip_norm, aggregate_norm_fn=agg_norm_fn if should_agg_norm else None + ) + + def cumulative_training_time(self): + if self._cumulative_training_time is None: + # single GPU + return self._local_cumulative_training_time() + else: + return self._cumulative_training_time + + def _local_cumulative_training_time(self): + """Aggregate training time in seconds.""" + return time.time() - self._start_time + self._previous_training_time + + def _fp_convert_sample(self, sample): + def apply_half(t): + if t.dtype is torch.float32: + return t.to(dtype=torch.half) + return t + + def apply_bfloat16(t): + if t.dtype is torch.float32: + return t.to(dtype=torch.bfloat16) + return t + + if self.cfg.common.fp16: + sample = utils.apply_to_sample(apply_half, sample) + + if self.cfg.common.bf16: + sample = utils.apply_to_sample(apply_bfloat16, sample) + + return sample + + def _prepare_sample(self, sample, is_dummy=False): + if sample == "DUMMY": + raise Exception( + "Trying to use an uninitialized 'dummy' batch. This usually indicates " + "that the total number of batches is smaller than the number of " + "participating GPUs. Try reducing the batch size or using fewer GPUs." + ) + + if sample is None or len(sample) == 0: + assert ( + self._dummy_batch is not None and len(self._dummy_batch) > 0 + ), "Invalid dummy batch: {}".format(self._dummy_batch) + sample, _ = self._prepare_sample(self._dummy_batch, is_dummy=True) + return sample, True + + # Given that PCIe/NVLink bandwidth is significantly smaller than DRAM bandwidth + # it makes sense to do the format conversion on the CPU and then transfer + # a smaller buffer to the device. This also saves GPU memory capacity. + + if self.cfg.common.on_cpu_convert_precision: + sample = self._fp_convert_sample(sample) + + if self.cuda: + if self.pipeline_model_parallel: + if 'target' in sample: + sample['target'] = utils.move_to_cuda(sample['target'], device=self.last_device) + else: + sample = utils.move_to_cuda(sample) + elif self.tpu and is_dummy: + # the dummy batch may not be on the appropriate device + sample = utils.move_to_cuda(sample, device=self.device) + + if not self.cfg.common.on_cpu_convert_precision: + sample = self._fp_convert_sample(sample) + + if self._dummy_batch == "DUMMY": + self._dummy_batch = sample + + return sample, False + + def _set_seed(self): + # Set seed based on args.seed and the update number so that we get + # reproducible results when resuming from checkpoints + seed = self.cfg.common.seed + self.get_num_updates() + utils.set_torch_seed(seed) + + def _sync_stats(self): + # Return True if it's using multiple GPUs and DDP or multiple GPUs with + # BMUF and it's a bmuf sync with warmup iterations completed before. + if self.data_parallel_world_size == 1: + return False + elif self.cfg.optimization.use_bmuf: + return ( + self.get_num_updates() + 1 + ) % self.cfg.bmuf.global_sync_iter == 0 and ( + self.get_num_updates() + 1 + ) > self.cfg.bmuf.warmup_iterations + else: + return True + + def _log_oom(self, exc): + msg = "OOM: Ran out of memory with exception: {}".format(exc) + logger.warning(msg) + if torch.cuda.is_available() and hasattr(torch.cuda, "memory_summary"): + for device_idx in range(torch.cuda.device_count()): + logger.warning(torch.cuda.memory_summary(device=device_idx)) + sys.stderr.flush() + + def _aggregate_logging_outputs( + self, + logging_outputs: List[Dict[str, Any]], + *extra_stats_to_sum, + ignore=False, + ): + if self.task.__class__.logging_outputs_can_be_summed(self.get_criterion()): + return self._fast_stat_sync_sum( + logging_outputs, *extra_stats_to_sum, ignore=ignore + ) + else: + return self._all_gather_list_sync( + logging_outputs, *extra_stats_to_sum, ignore=ignore + ) + + def _all_gather_list_sync( + self, + logging_outputs: List[Dict[str, Any]], + *extra_stats_to_sum, + ignore=False, + ): + """ + Sync logging outputs across workers. all_gather_list_sync is + suitable when logging outputs are complex types. + """ + if self.tpu: + raise NotImplementedError + if ignore: + logging_outputs = [] + results = list( + zip( + *distributed_utils.all_gather_list( + [logging_outputs] + list(extra_stats_to_sum), + max_size=getattr(self.cfg.common, "all_gather_list_size", 16384), + group=self.data_parallel_process_group, + ) + ) + ) + logging_outputs, extra_stats_to_sum = results[0], results[1:] + logging_outputs = list(chain.from_iterable(logging_outputs)) + extra_stats_to_sum = [sum(s) for s in extra_stats_to_sum] + return logging_outputs, extra_stats_to_sum + + def _fast_stat_sync_sum( + self, + logging_outputs: List[Dict[str, Any]], + *extra_stats_to_sum, + ignore=False, + ): + """ + Sync logging outputs across workers. fast_stat_sync_sum is + faster than all_gather_list_sync, but is only suitable when + logging outputs are scalars and can be summed. Note that + *logging_outputs* cannot contain any nested dicts/lists. + """ + data = {} + for i, stat in enumerate(extra_stats_to_sum): + data["extra_stats_" + str(i)] = stat + if len(logging_outputs) > 0: + log_keys = list(logging_outputs[0].keys()) + for k in log_keys: + if not ignore: + v = sum(log[k] for log in logging_outputs if k in log) + else: + v = logging_outputs[0][k] + v = torch.zeros_like(v) if torch.is_tensor(v) else 0 + data["logging_outputs_" + k] = v + else: + log_keys = None + + data = distributed_utils.all_reduce_dict( + data, device=self.device, group=self.data_parallel_process_group + ) + + extra_stats_to_sum = [ + data["extra_stats_" + str(i)] for i in range(len(extra_stats_to_sum)) + ] + if log_keys is not None: + logging_outputs = [{k: data["logging_outputs_" + k] for k in log_keys}] + else: + logging_outputs = [] + return logging_outputs, extra_stats_to_sum + + def _check_grad_norms(self, grad_norm): + """Check that grad norms are consistent across workers.""" + if self._grad_norm_buf is not None: + self._grad_norm_buf.zero_() + self._grad_norm_buf[self.data_parallel_rank] = grad_norm + distributed_utils.all_reduce( + self._grad_norm_buf, group=self.data_parallel_process_group + ) + + def is_consistent(tensor): + max_abs_diff = torch.max(torch.abs(tensor - tensor[0])) + return ( + (torch.isfinite(tensor).all() + and (max_abs_diff / (tensor[0] + 1e-6) < 1e-6).all()) + or + (self.cfg.common.amp and not torch.isfinite(tensor).all()) + # in case of amp non-finite grads are fine + ) + + if not is_consistent(self._grad_norm_buf): + pretty_detail = "\n".join( + "rank {:3d} = {:.8f}".format(r, n) + for r, n in enumerate(self._grad_norm_buf.tolist()) + ) + error_detail = "grad_norm across the workers:\n{}\n".format( + pretty_detail + ) + # use FloatingPointError to trigger NanDetector + raise FloatingPointError( + "Fatal error: gradients are inconsistent between workers. " + "Try --ddp-backend=legacy_ddp. " + "Or are you mixing up different generation of GPUs in training?" + + "\n" + + "-" * 80 + + "\n{}\n".format(error_detail) + + "-" * 80 + ) + + def _reduce_and_log_stats(self, logging_outputs, sample_size, grad_norm=None): + if grad_norm is not None and ( + not torch.is_tensor(grad_norm) or torch.isfinite(grad_norm) + ): + metrics.log_speed("ups", 1.0, priority=100, round=2) + metrics.log_scalar("gnorm", grad_norm, priority=400, round=3) + if self.cfg.optimization.clip_norm > 0: + metrics.log_scalar( + "clip", + torch.where( + grad_norm > self.cfg.optimization.clip_norm, + grad_norm.new_tensor(100), + grad_norm.new_tensor(0), + ), + priority=500, + round=1, + ) + + with metrics.aggregate() as agg: + if logging_outputs is not None: + self.task.reduce_metrics(logging_outputs, self.get_criterion()) + del logging_outputs + + # extra warning for criterions that don't properly log a loss value + if "loss" not in agg: + if "loss" not in self._warn_once: + self._warn_once.add("loss") + logger.warning( + "Criterion.reduce_metrics did not log a 'loss' value, " + "which may break some functionality" + ) + metrics.log_scalar("loss", -1) + + # support legacy interface + if self.tpu: + logging_output = {} + else: + logging_output = agg.get_smoothed_values() + logging_output["sample_size"] = sample_size + for key_to_delete in ["ppl", "wps", "wpb", "bsz"]: + if key_to_delete in logging_output: + del logging_output[key_to_delete] + return logging_output + + def _check_xla_compilation(self): + import torch_xla.debug.metrics as met + + compile_stats = met.metric_data("CompileTime") + if compile_stats is None: + return + num_xla_compiles = compile_stats[0] + if num_xla_compiles > self._num_xla_compiles: + logger.warning( + "XLA compilation detected on device #{}; too many of these can lead " + "to slow training, but we expect a few in the beginning".format( + self.cfg.distributed_training.distributed_rank + ) + ) + self._num_xla_compiles = num_xla_compiles + + def _xla_markstep_and_send_to_cpu(self, data=None): + import torch_xla.core.xla_model as xm + + xm.mark_step() + if data is not None: + from fairseq.utils import xla_device_to_cpu + + return xla_device_to_cpu(data) + + +def _catalog_shared_params(module, memo=None, prefix=""): + if memo is None: + first_call = True + memo = {} + else: + first_call = False + for name, param in module._parameters.items(): + param_prefix = prefix + ("." if prefix else "") + name + if param not in memo: + memo[param] = [] + memo[param].append(param_prefix) + for name, m in module._modules.items(): + if m is None: + continue + submodule_prefix = prefix + ("." if prefix else "") + name + _catalog_shared_params(m, memo, submodule_prefix) + if first_call: + return [x for x in memo.values() if len(x) > 1] + + +def _get_module_by_path(module, path): + path = path.split(".") + for name in path: + module = getattr(module, name) + return module + + +def _set_module_by_path(module, path, value): + path = path.split(".") + for name in path[:-1]: + module = getattr(module, name) + setattr(module, path[-1], value) diff --git a/SpeechT5/fairseq/fairseq/utils.py b/SpeechT5/fairseq/fairseq/utils.py new file mode 100644 index 0000000..4fe95b9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/utils.py @@ -0,0 +1,807 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import contextlib +import copy +import importlib +import logging +import os +import sys +import warnings +from itertools import accumulate +from typing import Callable, Dict, List, Optional + +import torch +import torch.nn.functional as F +from fairseq.modules.multihead_attention import MultiheadAttention +from torch import Tensor + + +try: + from amp_C import multi_tensor_l2norm + + multi_tensor_l2norm_available = True +except ImportError: + multi_tensor_l2norm_available = False + +try: + import torch_xla.core.xla_model as xm +except ImportError: + xm = None + + +logger = logging.getLogger(__name__) + + +MANIFOLD_PATH_SEP = "|" + + +class FileContentsAction(argparse.Action): + def __init__(self, option_strings, dest, nargs=None, **kwargs): + if nargs is not None: + raise ValueError("nargs not allowed") + super(FileContentsAction, self).__init__(option_strings, dest, **kwargs) + + def __call__(self, parser, namespace, values, option_string=None): + from fairseq.file_io import PathManager + + if PathManager.isfile(values): + with PathManager.open(values) as f: + argument = f.read().strip() + else: + argument = values + setattr(namespace, self.dest, argument) + + +def split_paths(paths: str, separator=os.pathsep) -> List[str]: + return ( + paths.split(separator) if "://" not in paths else paths.split(MANIFOLD_PATH_SEP) + ) + + +def load_ensemble_for_inference(filenames, task, model_arg_overrides=None): + from fairseq import checkpoint_utils + + deprecation_warning( + "utils.load_ensemble_for_inference is deprecated. " + "Please use checkpoint_utils.load_model_ensemble instead." + ) + return checkpoint_utils.load_model_ensemble( + filenames, arg_overrides=model_arg_overrides, task=task + ) + + +def apply_to_sample(f, sample): + if hasattr(sample, "__len__") and len(sample) == 0: + return {} + + def _apply(x): + if torch.is_tensor(x): + return f(x) + elif isinstance(x, dict): + return {key: _apply(value) for key, value in x.items()} + elif isinstance(x, list): + return [_apply(x) for x in x] + elif isinstance(x, tuple): + return tuple(_apply(x) for x in x) + elif isinstance(x, set): + return {_apply(x) for x in x} + else: + return x + + return _apply(sample) + + +def move_to_cuda(sample, device=None): + device = device or torch.cuda.current_device() + + def _move_to_cuda(tensor): + # non_blocking is ignored if tensor is not pinned, so we can always set + # to True (see github.com/PyTorchLightning/pytorch-lightning/issues/620) + return tensor.to(device=device, non_blocking=True) + + return apply_to_sample(_move_to_cuda, sample) + + +def move_to_cpu(sample): + def _move_to_cpu(tensor): + # PyTorch has poor support for half tensors (float16) on CPU. + # Move any such tensors to float32. + if tensor.dtype in {torch.bfloat16, torch.float16}: + tensor = tensor.to(dtype=torch.float32) + return tensor.cpu() + + return apply_to_sample(_move_to_cpu, sample) + + +def move_to_tpu(sample): + + import torch_xla.core.xla_model as xm + + device = xm.xla_device() + + def _move_to_tpu(tensor): + return tensor.to(device) + + return apply_to_sample(_move_to_tpu, sample) + + +def get_incremental_state( + module: MultiheadAttention, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], + key: str, +) -> Optional[Dict[str, Optional[Tensor]]]: + """Helper for getting incremental state for an nn.Module.""" + return module.get_incremental_state(incremental_state, key) + + +def set_incremental_state( + module: MultiheadAttention, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]], + key: str, + value: Dict[str, Optional[Tensor]], +) -> Optional[Dict[str, Dict[str, Optional[Tensor]]]]: + """Helper for setting incremental state for an nn.Module.""" + if incremental_state is not None: + result = module.set_incremental_state(incremental_state, key, value) + if result is not None: + incremental_state = result + return incremental_state + + +def load_align_dict(replace_unk): + if replace_unk is None: + align_dict = None + elif isinstance(replace_unk, str) and len(replace_unk) > 0: + # Load alignment dictionary for unknown word replacement if it was passed as an argument. + align_dict = {} + with open(replace_unk, "r") as f: + for line in f: + cols = line.split() + align_dict[cols[0]] = cols[1] + else: + # No alignment dictionary provided but we still want to perform unknown word replacement by copying the + # original source word. + align_dict = {} + return align_dict + + +def print_embed_overlap(embed_dict, vocab_dict): + embed_keys = set(embed_dict.keys()) + vocab_keys = set(vocab_dict.symbols) + overlap = len(embed_keys & vocab_keys) + logger.info("found {}/{} types in embedding file".format(overlap, len(vocab_dict))) + + +def parse_embedding(embed_path): + """Parse embedding text file into a dictionary of word and embedding tensors. + + The first line can have vocabulary size and dimension. The following lines + should contain word and embedding separated by spaces. + + Example: + 2 5 + the -0.0230 -0.0264 0.0287 0.0171 0.1403 + at -0.0395 -0.1286 0.0275 0.0254 -0.0932 + """ + embed_dict = {} + with open(embed_path) as f_embed: + next(f_embed) # skip header + for line in f_embed: + pieces = line.rstrip().split(" ") + embed_dict[pieces[0]] = torch.Tensor( + [float(weight) for weight in pieces[1:]] + ) + return embed_dict + + +def load_embedding(embed_dict, vocab, embedding): + for idx in range(len(vocab)): + token = vocab[idx] + if token in embed_dict: + embedding.weight.data[idx] = embed_dict[token] + return embedding + + +def replace_unk(hypo_str, src_str, alignment, align_dict, unk): + from fairseq import tokenizer + + # Tokens are strings here + hypo_tokens = tokenizer.tokenize_line(hypo_str) + # TODO: Very rare cases where the replacement is '<eos>' should be handled gracefully + src_tokens = tokenizer.tokenize_line(src_str) + ["<eos>"] + for i, ht in enumerate(hypo_tokens): + if ht == unk: + src_token = src_tokens[alignment[i]] + # Either take the corresponding value in the aligned dictionary or just copy the original value. + hypo_tokens[i] = align_dict.get(src_token, src_token) + return " ".join(hypo_tokens) + + +def post_process_prediction( + hypo_tokens, + src_str, + alignment, + align_dict, + tgt_dict, + remove_bpe=None, + extra_symbols_to_ignore=None, +): + hypo_str = tgt_dict.string( + hypo_tokens, remove_bpe, extra_symbols_to_ignore=extra_symbols_to_ignore + ) + if align_dict is not None: + hypo_str = replace_unk( + hypo_str, src_str, alignment, align_dict, tgt_dict.unk_string() + ) + if align_dict is not None or remove_bpe is not None: + # Convert back to tokens for evaluating with unk replacement or without BPE + # Note that the dictionary can be modified inside the method. + hypo_tokens = tgt_dict.encode_line(hypo_str, add_if_not_exist=True) + return hypo_tokens, hypo_str, alignment + + +def make_positions(tensor, padding_idx: int, onnx_trace: bool = False): + """Replace non-padding symbols with their position numbers. + + Position numbers begin at padding_idx+1. Padding symbols are ignored. + """ + # The series of casts and type-conversions here are carefully + # balanced to both work with ONNX export and XLA. In particular XLA + # prefers ints, cumsum defaults to output longs, and ONNX doesn't know + # how to handle the dtype kwarg in cumsum. + mask = tensor.ne(padding_idx).int() + return (torch.cumsum(mask, dim=1).type_as(mask) * mask).long() + padding_idx + + +def strip_pad(tensor, pad): + return tensor[tensor.ne(pad)] + + +def buffered_arange(max): + if not hasattr(buffered_arange, "buf"): + buffered_arange.buf = torch.LongTensor() + if max > buffered_arange.buf.numel(): + buffered_arange.buf.resize_(max) + torch.arange(max, out=buffered_arange.buf) + return buffered_arange.buf[:max] + + +def convert_padding_direction( + src_tokens, padding_idx, right_to_left: bool = False, left_to_right: bool = False +): + assert right_to_left ^ left_to_right + pad_mask = src_tokens.eq(padding_idx) + if not pad_mask.any(): + # no padding, return early + return src_tokens + if left_to_right and not pad_mask[:, 0].any(): + # already right padded + return src_tokens + if right_to_left and not pad_mask[:, -1].any(): + # already left padded + return src_tokens + max_len = src_tokens.size(1) + buffered = torch.empty(0).long() + if max_len > 0: + torch.arange(max_len, out=buffered) + range = buffered.type_as(src_tokens).expand_as(src_tokens) + num_pads = pad_mask.long().sum(dim=1, keepdim=True) + if right_to_left: + index = torch.remainder(range - num_pads, max_len) + else: + index = torch.remainder(range + num_pads, max_len) + return src_tokens.gather(1, index) + + +def item(tensor): + # tpu-comment: making this a no-op for xla devices. + if torch.is_tensor(tensor) and tensor.device.type == "xla": + return tensor.detach() + if hasattr(tensor, "item"): + return tensor.item() + if hasattr(tensor, "__getitem__"): + return tensor[0] + return tensor + + +def multi_tensor_total_norm(grads, chunk_size=2048 * 32) -> torch.Tensor: + per_device_grads = {} + norms = [] + for grad in grads: + device = grad.device + cur_device_grads = per_device_grads.get(device) + if cur_device_grads is None: + cur_device_grads = [] + per_device_grads[device] = cur_device_grads + cur_device_grads.append(grad) + for device in per_device_grads.keys(): + cur_device_grads = per_device_grads[device] + if device.type == "cuda": + # TODO(msb) return has_inf + has_inf = torch.zeros((1, 1), dtype=torch.int, device=device) + with torch.cuda.device(device): + norm = multi_tensor_l2norm( + chunk_size, has_inf, [cur_device_grads], False + ) + norms.append(norm[0].to(torch.cuda.current_device())) + else: + norms += [torch.norm(g, p=2, dtype=torch.float32) for g in cur_device_grads] + total_norm = torch.norm(torch.stack(norms)) + return total_norm + + +@torch.no_grad() +def clip_grad_norm_(params, max_norm, aggregate_norm_fn=None) -> torch.Tensor: + def grad_exists(p): + return p is not None and getattr(p, "grad", None) is not None + + if isinstance(params, torch.Tensor): + params = [params] + params = list(params) + grads = [ + p.grad.detach() for p in params if grad_exists(p) and not hasattr(p, "expert") + ] + expert_grads = [ + p.grad.detach() for p in params if grad_exists(p) and hasattr(p, "expert") + ] + + if len(grads) == 0: + if len(params) > 0: + return params[0].new_tensor(0.0) + else: + return torch.tensor(0.0) + + if len(grads) == 1: + total_norm = torch.norm(grads[0], p=2, dtype=torch.float32) + else: + if multi_tensor_l2norm_available: + total_norm = multi_tensor_total_norm(grads) + else: + if torch.cuda.is_available(): + warnings.warn( + "amp_C fused kernels unavailable, disabling multi_tensor_l2norm; " + "you may get better performance by installing NVIDIA's apex library" + ) + device = torch.cuda.current_device() + elif grads[0].device.type == "xla": + device = grads[0].device + else: + device = torch.device("cpu") + total_norm = torch.norm( + torch.stack( + [torch.norm(g, p=2, dtype=torch.float32).to(device) for g in grads] + ) + ) + + if aggregate_norm_fn is not None: + total_norm = aggregate_norm_fn(total_norm) + + if max_norm > 0: + max_norm = float(max_norm) + clip_coef = (max_norm / (total_norm + 1e-6)).clamp_(max=1) + for g in grads + expert_grads: + g.mul_(clip_coef) + return total_norm + + +def fill_with_neg_inf(t): + """FP16-compatible function that fills a tensor with -inf.""" + return t.float().fill_(float("-inf")).type_as(t) + + +def _match_types(arg1, arg2): + """Convert the numerical argument to the same type as the other argument""" + + def upgrade(arg_number, arg_structure): + if isinstance(arg_structure, tuple): + return tuple([arg_number] * len(arg_structure)) + elif isinstance(arg_structure, dict): + arg = copy.deepcopy(arg_structure) + for k in arg: + arg[k] = upgrade(arg_number, arg_structure[k]) + return arg + else: + return arg_number + + if isinstance(arg1, float) or isinstance(arg1, int): + return upgrade(arg1, arg2), arg2 + elif isinstance(arg2, float) or isinstance(arg2, int): + return arg1, upgrade(arg2, arg1) + + return arg1, arg2 + + +def resolve_max_positions(*args): + """Resolve max position constraints from multiple sources.""" + + def map_value_update(d1, d2): + updated_value = copy.deepcopy(d1) + for key in d2: + if key not in updated_value: + updated_value[key] = d2[key] + else: + updated_value[key] = min(d1[key], d2[key]) + return updated_value + + def nullsafe_min(l): + minim = None + for item in l: + if minim is None: + minim = item + elif item is not None and item < minim: + minim = item + return minim + + max_positions = None + for arg in args: + if max_positions is None: + max_positions = arg + elif arg is not None: + max_positions, arg = _match_types(max_positions, arg) + if isinstance(arg, float) or isinstance(arg, int): + max_positions = min(max_positions, arg) + elif isinstance(arg, dict): + max_positions = map_value_update(max_positions, arg) + else: + max_positions = tuple(map(nullsafe_min, zip(max_positions, arg))) + + return max_positions + + +def import_user_module(args): + module_path = getattr(args, "user_dir", None) + if module_path is not None: + module_path = os.path.abspath(args.user_dir) + if not os.path.exists(module_path) and not os.path.isfile( + os.path.dirname(module_path) + ): + fairseq_rel_path = os.path.join(os.path.dirname(__file__), args.user_dir) + if os.path.exists(fairseq_rel_path): + module_path = fairseq_rel_path + else: + fairseq_rel_path = os.path.join( + os.path.dirname(__file__), "..", args.user_dir + ) + if os.path.exists(fairseq_rel_path): + module_path = fairseq_rel_path + else: + raise FileNotFoundError(module_path) + + # ensure that user modules are only imported once + import_user_module.memo = getattr(import_user_module, "memo", set()) + if module_path not in import_user_module.memo: + import_user_module.memo.add(module_path) + + module_parent, module_name = os.path.split(module_path) + if module_name not in sys.modules: + sys.path.insert(0, module_parent) + importlib.import_module(module_name) + + tasks_path = os.path.join(module_path, "tasks") + if os.path.exists(tasks_path): + from fairseq.tasks import import_tasks + + import_tasks(tasks_path, f"{module_name}.tasks") + + models_path = os.path.join(module_path, "models") + if os.path.exists(models_path): + from fairseq.models import import_models + + import_models(models_path, f"{module_name}.models") + else: + raise ImportError( + "Failed to import --user-dir={} because the corresponding module name " + "({}) is not globally unique. Please rename the directory to " + "something unique and try again.".format(module_path, module_name) + ) + + +def softmax(x, dim: int, onnx_trace: bool = False): + if onnx_trace: + return F.softmax(x.float(), dim=dim) + else: + return F.softmax(x, dim=dim, dtype=torch.float32) + + +def log_softmax(x, dim: int, onnx_trace: bool = False): + if onnx_trace: + return F.log_softmax(x.float(), dim=dim) + else: + return F.log_softmax(x, dim=dim, dtype=torch.float32) + + +def get_perplexity(loss, round=2, base=2): + from fairseq.logging.meters import safe_round + + if loss is None: + return 0.0 + try: + return safe_round(base ** loss, round) + except OverflowError: + return float("inf") + + +def deprecation_warning(message, stacklevel=3): + # don't use DeprecationWarning, since it's ignored by default + warnings.warn(message, stacklevel=stacklevel) + + +def get_activation_fn(activation: str) -> Callable: + """Returns the activation function corresponding to `activation`""" + from fairseq.modules import gelu, gelu_accurate + + if activation == "relu": + return F.relu + elif activation == "gelu": + return gelu + elif activation == "gelu_fast": + deprecation_warning( + "--activation-fn=gelu_fast has been renamed to gelu_accurate" + ) + return gelu_accurate + elif activation == "gelu_accurate": + return gelu_accurate + elif activation == "tanh": + return torch.tanh + elif activation == "linear": + return lambda x: x + else: + raise RuntimeError("--activation-fn {} not supported".format(activation)) + + +def get_available_activation_fns() -> List: + return [ + "relu", + "gelu", + "gelu_fast", # deprecated + "gelu_accurate", + "tanh", + "linear", + ] + + +@contextlib.contextmanager +def model_eval(model): + is_training = model.training + model.eval() + yield + model.train(is_training) + + +def has_parameters(module): + try: + next(module.parameters()) + return True + except StopIteration: + return False + + +def get_rng_state(): + state = {"torch_rng_state": torch.get_rng_state()} + if xm is not None: + state["xla_rng_state"] = xm.get_rng_state() + if torch.cuda.is_available(): + state["cuda_rng_state"] = torch.cuda.get_rng_state() + return state + + +def set_rng_state(state): + torch.set_rng_state(state["torch_rng_state"]) + if xm is not None: + xm.set_rng_state(state["xla_rng_state"]) + if torch.cuda.is_available(): + torch.cuda.set_rng_state(state["cuda_rng_state"]) + + +class set_torch_seed(object): + def __init__(self, seed): + assert isinstance(seed, int) + self.rng_state = get_rng_state() + + torch.manual_seed(seed) + if xm is not None: + xm.set_rng_state(seed) + if torch.cuda.is_available(): + torch.cuda.manual_seed(seed) + + def __enter__(self): + return self + + def __exit__(self, *exc): + set_rng_state(self.rng_state) + + +def parse_alignment(line): + """ + Parses a single line from the alingment file. + + Args: + line (str): String containing the alignment of the format: + <src_idx_1>-<tgt_idx_1> <src_idx_2>-<tgt_idx_2> .. + <src_idx_m>-<tgt_idx_m>. All indices are 0 indexed. + + Returns: + torch.IntTensor: packed alignments of shape (2 * m). + """ + alignments = line.strip().split() + parsed_alignment = torch.IntTensor(2 * len(alignments)) + for idx, alignment in enumerate(alignments): + src_idx, tgt_idx = alignment.split("-") + parsed_alignment[2 * idx] = int(src_idx) + parsed_alignment[2 * idx + 1] = int(tgt_idx) + return parsed_alignment + + +def get_token_to_word_mapping(tokens, exclude_list): + n = len(tokens) + word_start = [int(token not in exclude_list) for token in tokens] + word_idx = list(accumulate(word_start)) + token_to_word = {i: word_idx[i] for i in range(n)} + return token_to_word + + +def extract_hard_alignment(attn, src_sent, tgt_sent, pad, eos): + tgt_valid = ( + ((tgt_sent != pad) & (tgt_sent != eos)).nonzero(as_tuple=False).squeeze(dim=-1) + ) + src_invalid = ( + ((src_sent == pad) | (src_sent == eos)).nonzero(as_tuple=False).squeeze(dim=-1) + ) + src_token_to_word = get_token_to_word_mapping(src_sent, [eos, pad]) + tgt_token_to_word = get_token_to_word_mapping(tgt_sent, [eos, pad]) + alignment = [] + if len(tgt_valid) != 0 and len(src_invalid) < len(src_sent): + attn_valid = attn[tgt_valid] + attn_valid[:, src_invalid] = float("-inf") + _, src_indices = attn_valid.max(dim=1) + for tgt_idx, src_idx in zip(tgt_valid, src_indices): + alignment.append( + ( + src_token_to_word[src_idx.item()] - 1, + tgt_token_to_word[tgt_idx.item()] - 1, + ) + ) + return alignment + + +def extract_soft_alignment(attn, src_sent, tgt_sent, pad, eos): + tgt_valid = ((tgt_sent != pad)).nonzero(as_tuple=False) + src_valid = ((src_sent != pad)).nonzero(as_tuple=False).squeeze(dim=-1) + alignment = [] + if len(tgt_valid) != 0 and len(src_valid) != 0: + attn_valid = attn[tgt_valid, src_valid] + alignment = [ + ["{:.6f}".format(p) for p in src_probs.tolist()] for src_probs in attn_valid + ] + return alignment + + +def new_arange(x, *size): + """ + Return a Tensor of `size` filled with a range function on the device of x. + If size is empty, using the size of the variable x. + """ + if len(size) == 0: + size = x.size() + return torch.arange(size[-1], device=x.device).expand(*size).contiguous() + + +def get_tpu_device(): + return xm.xla_device() + + +def tpu_data_loader(itr): + import torch_xla.core.xla_model as xm + import torch_xla.distributed.parallel_loader as pl + from fairseq.data import iterators + + xm.rendezvous("tpu_data_loader") # wait for all workers + xm.mark_step() + device = xm.xla_device() + return iterators.CountingIterator( + pl.ParallelLoader(itr, [device]).per_device_loader(device), + start=getattr(itr, "n", 0), + total=len(itr), + ) + + +def is_xla_tensor(tensor): + return torch.is_tensor(tensor) and tensor.device.type == "xla" + + +def index_put(tensor, indices, value): + if is_xla_tensor(tensor): + for _ in range(indices.dim(), tensor.dim()): + indices = indices.unsqueeze(-1) + if indices.size(-1) < tensor.size(-1): + indices = indices.expand_as(tensor) + tensor = torch.mul(tensor, ~indices) + torch.mul(value, indices) + else: + tensor[indices] = value + return tensor + + +def xla_device_to_cpu(dat): + import torch_xla.core.xla_model as xm + + return xm._maybe_convert_to_cpu(dat) + + +class CudaEnvironment(object): + def __init__(self): + cur_device = torch.cuda.current_device() + prop = torch.cuda.get_device_properties("cuda:{}".format(cur_device)) + self.name = prop.name + self.major = prop.major + self.minor = prop.minor + self.total_memory_in_GB = prop.total_memory / 1024 / 1024 / 1024 + + @staticmethod + def pretty_print_cuda_env_list(cuda_env_list): + """ + Given a list of CudaEnviorments, pretty print them + """ + num_workers = len(cuda_env_list) + center = "CUDA enviroments for all {} workers".format(num_workers) + banner_len = 40 - len(center) // 2 + first_line = "*" * banner_len + center + "*" * banner_len + logger.info(first_line) + for r, env in enumerate(cuda_env_list): + logger.info( + "rank {:3d}: ".format(r) + + "capabilities = {:2d}.{:<2d} ; ".format(env.major, env.minor) + + "total memory = {:.3f} GB ; ".format(env.total_memory_in_GB) + + "name = {:40s}".format(env.name) + ) + logger.info(first_line) + + +def csv_str_list(x): + return x.split(",") + + +def eval_str_list(x, type=float): + if x is None: + return None + if isinstance(x, str): + x = eval(x) + try: + return list(map(type, x)) + except TypeError: + return [type(x)] + + +def eval_str_dict(x, type=dict): + if x is None: + return None + if isinstance(x, str): + x = eval(x) + return x + + +def eval_bool(x, default=False): + if x is None: + return default + try: + return bool(eval(x)) + except TypeError: + return default + + +def reset_logging(): + root = logging.getLogger() + for handler in root.handlers: + root.removeHandler(handler) + root.setLevel(os.environ.get("LOGLEVEL", "INFO").upper()) + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter( + logging.Formatter( + fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + ) + root.addHandler(handler) diff --git a/SpeechT5/fairseq/fairseq/version.txt b/SpeechT5/fairseq/fairseq/version.txt new file mode 100644 index 0000000..41432f0 --- /dev/null +++ b/SpeechT5/fairseq/fairseq/version.txt @@ -0,0 +1 @@ +1.0.0a0 diff --git a/SpeechT5/fairseq/fairseq_cli/__init__.py b/SpeechT5/fairseq/fairseq_cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/fairseq_cli/eval_lm.py b/SpeechT5/fairseq/fairseq_cli/eval_lm.py new file mode 100644 index 0000000..ab6e770 --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/eval_lm.py @@ -0,0 +1,347 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Evaluate the perplexity of a trained language model. +""" + +import logging +import math +import os +import sys +from argparse import Namespace +from typing import Iterable, List, Optional + +import torch +import fairseq +from fairseq import checkpoint_utils, distributed_utils, options, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.logging import progress_bar +from fairseq.logging.meters import StopwatchMeter +from fairseq.sequence_scorer import SequenceScorer +from omegaconf import DictConfig + + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("fairseq_cli.eval_lm") + + +def eval_lm( + models: List[fairseq.models.FairseqModel], + source_dictionary: fairseq.data.Dictionary, + batch_iterator: Iterable, + post_process: Optional[str] = None, + output_word_probs: bool = False, + output_word_stats: bool = False, + target_dictionary: Optional[fairseq.data.Dictionary] = None, + softmax_batch: int = 0, + remove_bos_token: bool = False, + device: Optional[torch.device] = None, +): + """ + Args: + models (List[~fairseq.models.FairseqModel]): list of models to + evaluate. Models are essentially `nn.Module` instances, but + must be compatible with fairseq's `SequenceScorer`. + source_dictionary (~fairseq.data.Dictionary): dictionary for + applying any relevant post processing or outputing word + probs/stats. + batch_iterator (Iterable): yield batches of data + post_process (Optional[str]): post-process text by removing BPE, + letter segmentation, etc. Valid options can be found in + fairseq.data.utils.post_process, although not all options + are implemented here. + output_word_probs (Optional[bool]): output words and their + predicted log probabilities + output_word_stats (Optional[bool]): output word statistics such + as word count and average probability + target_dictionary (Optional[~fairseq.data.Dictionary]): output + dictionary (defaults to *source_dictionary*) + softmax_batch (Optional[bool]): if BxT is more than this, will + batch the softmax over vocab to this amount of tokens, in + order to fit into GPU memory + remove_bos_token (Optional[bool]): if True, confirm that the + first token is the beginning-of-sentence symbol (according + to the relevant dictionary) and remove it from the output + device (Optional[torch.device]): device to use for evaluation + (defaults to device of first model parameter) + """ + if target_dictionary is None: + target_dictionary = source_dictionary + if device is None: + device = next(models[0].parameters()).device + + gen_timer = StopwatchMeter() + scorer = SequenceScorer(target_dictionary, softmax_batch) + + score_sum = 0.0 + count = 0 + + if post_process is not None: + if post_process in {"subword_nmt", "@@ "}: + bpe_cont = post_process.rstrip() + bpe_toks = { + i + for i in range(len(source_dictionary)) + if source_dictionary[i].endswith(bpe_cont) + } + else: + raise NotImplementedError( + "--post-process={post_process} is not implemented" + ) + bpe_len = len(bpe_cont) + else: + bpe_toks = None + bpe_len = 0 + + word_stats = dict() + + for sample in batch_iterator: + if "net_input" not in sample: + continue + + sample = utils.move_to_cuda(sample, device=device) + + gen_timer.start() + hypos = scorer.generate(models, sample) + gen_timer.stop(sample["ntokens"]) + + for i, hypos_i in enumerate(hypos): + hypo = hypos_i[0] + sample_id = sample["id"][i] + + tokens = hypo["tokens"] + tgt_len = tokens.numel() + pos_scores = hypo["positional_scores"].float() + + if remove_bos_token: + assert hypo["tokens"][0].item() == target_dictionary.bos() + tokens = tokens[1:] + pos_scores = pos_scores[1:] + + skipped_toks = 0 + if bpe_toks is not None: + for i in range(tgt_len - 1): + if tokens[i].item() in bpe_toks: + skipped_toks += 1 + pos_scores[i + 1] += pos_scores[i] + pos_scores[i] = 0 + + inf_scores = pos_scores.eq(float("inf")) | pos_scores.eq(float("-inf")) + if inf_scores.any(): + logger.info( + "skipping tokens with inf scores:", + target_dictionary.string(tokens[inf_scores.nonzero()]), + ) + pos_scores = pos_scores[(~inf_scores).nonzero()] + score_sum += pos_scores.sum().cpu() + count += pos_scores.numel() - skipped_toks + + if output_word_probs or output_word_stats: + w = "" + word_prob = [] + is_bpe = False + for i in range(len(tokens)): + w_ind = tokens[i].item() + w += source_dictionary[w_ind] + if bpe_toks is not None and w_ind in bpe_toks: + w = w[:-bpe_len] + is_bpe = True + else: + word_prob.append((w, pos_scores[i].item())) + + next_prob = None + ind = i + 1 + while ind < len(tokens): + if pos_scores[ind].item() != 0: + next_prob = pos_scores[ind] + break + ind += 1 + + word_stats.setdefault(w, WordStat(w, is_bpe)).add( + pos_scores[i].item(), next_prob + ) + is_bpe = False + w = "" + if output_word_probs: + logger.info( + str(int(sample_id)) + + " " + + ( + "\t".join( + "{} [{:2f}]".format(x[0], x[1]) for x in word_prob + ) + ) + ) + + avg_nll_loss = ( + -score_sum / count / math.log(2) if count > 0 else 0 + ) # convert to base 2 + logger.info( + "Evaluated {:,} tokens in {:.1f}s ({:.2f} tokens/s)".format( + gen_timer.n, gen_timer.sum, 1.0 / gen_timer.avg if gen_timer.avg > 0 else 0 + ) + ) + + if output_word_stats: + for ws in sorted(word_stats.values(), key=lambda x: x.count, reverse=True): + logger.info(ws) + + return { + "loss": avg_nll_loss, + "perplexity": 2 ** avg_nll_loss, + } + + +class WordStat(object): + def __init__(self, word, is_bpe): + self.word = word + self.is_bpe = is_bpe + self.log_prob = 0 + self.next_word_prob = 0 + self.count = 0 + self.missing_next_words = 0 + + def add(self, log_prob, next_word_prob): + """increments counters for the sum of log probs of current word and next + word (given context ending at current word). Since the next word might be at the end of the example, + or it might be not counted because it is not an ending subword unit, + also keeps track of how many of those we have seen""" + if next_word_prob is not None: + self.next_word_prob += next_word_prob + else: + self.missing_next_words += 1 + self.log_prob += log_prob + self.count += 1 + + def __str__(self): + return "{}\t{}\t{}\t{}\t{}\t{}".format( + self.word, + self.count, + self.log_prob, + self.is_bpe, + self.next_word_prob, + self.count - self.missing_next_words, + ) + + +def main(cfg: DictConfig, **unused_kwargs): + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + utils.import_user_module(cfg.common) + + logger.info(cfg) + + if cfg.eval_lm.context_window > 0: + # reduce tokens per sample by the required context window size + cfg.task.tokens_per_sample -= cfg.eval_lm.context_window + + # Initialize the task using the current *cfg* + task = tasks.setup_task(cfg.task) + + # Load ensemble + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + models, model_args, task = checkpoint_utils.load_model_ensemble_and_task( + [cfg.common_eval.path], + arg_overrides=eval(cfg.common_eval.model_overrides), + suffix=cfg.checkpoint.checkpoint_suffix, + strict=(cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.checkpoint.checkpoint_shard_count, + task=task, + ) + + use_fp16 = cfg.common.fp16 + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + if use_cuda: + torch.cuda.set_device(cfg.distributed_training.device_id) + + # Optimize ensemble for generation and set the source and dest dicts on the model + # (required by scorer) + for model in models: + if use_fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + assert len(models) > 0 + + logger.info( + "num. model params: {:,}".format(sum(p.numel() for p in models[0].parameters())) + ) + + # Load dataset splits + task.load_dataset(cfg.dataset.gen_subset) + dataset = task.dataset(cfg.dataset.gen_subset) + logger.info( + "{} {} {:,} examples".format( + cfg.task.data, cfg.dataset.gen_subset, len(dataset) + ) + ) + + itr = task.eval_lm_dataloader( + dataset=dataset, + max_tokens=cfg.dataset.max_tokens or 36000, + batch_size=cfg.dataset.batch_size, + max_positions=utils.resolve_max_positions( + *[model.max_positions() for model in models] + ), + num_shards=max( + cfg.dataset.num_shards, + cfg.distributed_training.distributed_world_size, + ), + shard_id=max( + cfg.dataset.shard_id, + cfg.distributed_training.distributed_rank, + ), + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + context_window=cfg.eval_lm.context_window, + ) + + itr = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + results = eval_lm( + models=models, + source_dictionary=task.source_dictionary, + batch_iterator=itr, + post_process=cfg.common_eval.post_process, + output_word_probs=cfg.eval_lm.output_word_probs, + output_word_stats=cfg.eval_lm.output_word_stats, + target_dictionary=task.target_dictionary, + softmax_batch=cfg.eval_lm.softmax_batch, + remove_bos_token=getattr(cfg.task, "add_bos_token", False), + ) + + logger.info( + "Loss (base 2): {:.4f}, Perplexity: {:.2f}".format( + results["loss"], results["perplexity"] + ) + ) + + return results + + +def cli_main(): + parser = options.get_eval_lm_parser() + args = options.parse_args_and_arch(parser) + + distributed_utils.call_main(convert_namespace_to_omegaconf(args), main) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/fairseq_cli/generate.py b/SpeechT5/fairseq/fairseq_cli/generate.py new file mode 100644 index 0000000..7bd582b --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/generate.py @@ -0,0 +1,408 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Translate pre-processed data with a trained model. +""" + +import ast +import logging +import math +import os +import sys +from argparse import Namespace +from itertools import chain + +import numpy as np +import torch +from fairseq import checkpoint_utils, options, scoring, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.logging import progress_bar +from fairseq.logging.meters import StopwatchMeter, TimeMeter +from omegaconf import DictConfig + + +def main(cfg: DictConfig): + + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + assert cfg.common_eval.path is not None, "--path required for generation!" + assert ( + not cfg.generation.sampling or cfg.generation.nbest == cfg.generation.beam + ), "--sampling requires --nbest to be equal to --beam" + assert ( + cfg.generation.replace_unk is None or cfg.dataset.dataset_impl == "raw" + ), "--replace-unk requires a raw text dataset (--dataset-impl=raw)" + + if cfg.common_eval.results_path is not None: + os.makedirs(cfg.common_eval.results_path, exist_ok=True) + output_path = os.path.join( + cfg.common_eval.results_path, + "generate-{}.txt".format(cfg.dataset.gen_subset), + ) + with open(output_path, "w", buffering=1, encoding="utf-8") as h: + return _main(cfg, h) + else: + return _main(cfg, sys.stdout) + + +def get_symbols_to_strip_from_output(generator): + if hasattr(generator, "symbols_to_strip_from_output"): + return generator.symbols_to_strip_from_output + else: + return {generator.eos} + + +def _main(cfg: DictConfig, output_file): + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=output_file, + ) + logger = logging.getLogger("fairseq_cli.generate") + + utils.import_user_module(cfg.common) + + if cfg.dataset.max_tokens is None and cfg.dataset.batch_size is None: + cfg.dataset.max_tokens = 12000 + logger.info(cfg) + + # Fix seed for stochastic decoding + if cfg.common.seed is not None and not cfg.generation.no_seed_provided: + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + + # Load dataset splits + task = tasks.setup_task(cfg.task) + + + # Set dictionaries + try: + src_dict = getattr(task, "source_dictionary", None) + except NotImplementedError: + src_dict = None + tgt_dict = task.target_dictionary + + overrides = ast.literal_eval(cfg.common_eval.model_overrides) + + # Load ensemble + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + utils.split_paths(cfg.common_eval.path), + arg_overrides=overrides, + task=task, + suffix=cfg.checkpoint.checkpoint_suffix, + strict=(cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.checkpoint.checkpoint_shard_count, + ) + + # loading the dataset should happen after the checkpoint has been loaded so we can give it the saved task config + task.load_dataset(cfg.dataset.gen_subset, task_cfg=saved_cfg.task) + + if cfg.generation.lm_path is not None: + overrides["data"] = cfg.task.data + + try: + lms, _ = checkpoint_utils.load_model_ensemble( + [cfg.generation.lm_path], arg_overrides=overrides, task=None + ) + except: + logger.warning( + f"Failed to load language model! Please make sure that the language model dict is the same " + f"as target dict and is located in the data dir ({cfg.task.data})" + ) + raise + + assert len(lms) == 1 + else: + lms = [None] + + # Optimize ensemble for generation + for model in chain(models, lms): + if model is None: + continue + if cfg.common.fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + # Load alignment dictionary for unknown word replacement + # (None if no unknown word replacement, empty if no path to align dictionary) + align_dict = utils.load_align_dict(cfg.generation.replace_unk) + + # Load dataset (possibly sharded) + itr = task.get_batch_iterator( + dataset=task.dataset(cfg.dataset.gen_subset), + max_tokens=cfg.dataset.max_tokens, + max_sentences=cfg.dataset.batch_size, + max_positions=utils.resolve_max_positions( + task.max_positions(), *[m.max_positions() for m in models] + ), + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.dataset.required_batch_size_multiple, + seed=cfg.common.seed, + num_shards=cfg.distributed_training.distributed_world_size, + shard_id=cfg.distributed_training.distributed_rank, + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + # Initialize generator + gen_timer = StopwatchMeter() + + extra_gen_cls_kwargs = {"lm_model": lms[0], "lm_weight": cfg.generation.lm_weight} + generator = task.build_generator( + models, cfg.generation, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + # Handle tokenization and BPE + tokenizer = task.build_tokenizer(cfg.tokenizer) + bpe = task.build_bpe(cfg.bpe) + + def decode_fn(x): + if bpe is not None: + x = bpe.decode(x) + if tokenizer is not None: + x = tokenizer.decode(x) + return x + + scorer = scoring.build_scorer(cfg.scoring, tgt_dict) + + num_sentences = 0 + has_target = True + wps_meter = TimeMeter() + for sample in progress: + sample = utils.move_to_cuda(sample) if use_cuda else sample + if "net_input" not in sample: + continue + + prefix_tokens = None + if cfg.generation.prefix_size > 0: + prefix_tokens = sample["target"][:, : cfg.generation.prefix_size] + + constraints = None + if "constraints" in sample: + constraints = sample["constraints"] + + gen_timer.start() + hypos = task.inference_step( + generator, + models, + sample, + prefix_tokens=prefix_tokens, + constraints=constraints, + ) + num_generated_tokens = sum(len(h[0]["tokens"]) for h in hypos) + gen_timer.stop(num_generated_tokens) + + for i, sample_id in enumerate(sample["id"].tolist()): + has_target = sample["target"] is not None + + # Remove padding + if "src_tokens" in sample["net_input"]: + src_tokens = utils.strip_pad( + sample["net_input"]["src_tokens"][i, :], tgt_dict.pad() + ) + else: + src_tokens = None + + target_tokens = None + if has_target: + target_tokens = ( + utils.strip_pad(sample["target"][i, :], tgt_dict.pad()).int().cpu() + ) + + # Either retrieve the original sentences or regenerate them from tokens. + if align_dict is not None: + src_str = task.dataset(cfg.dataset.gen_subset).src.get_original_text( + sample_id + ) + target_str = task.dataset(cfg.dataset.gen_subset).tgt.get_original_text( + sample_id + ) + else: + if src_dict is not None: + src_str = src_dict.string(src_tokens, cfg.common_eval.post_process) + else: + src_str = "" + if has_target: + target_str = tgt_dict.string( + target_tokens, + cfg.common_eval.post_process, + escape_unk=True, + extra_symbols_to_ignore=get_symbols_to_strip_from_output( + generator + ), + ) + + src_str = decode_fn(src_str) + if has_target: + target_str = decode_fn(target_str) + + if not cfg.common_eval.quiet: + if src_dict is not None: + print("S-{}\t{}".format(sample_id, src_str), file=output_file) + if has_target: + print("T-{}\t{}".format(sample_id, target_str), file=output_file) + + # Process top predictions + for j, hypo in enumerate(hypos[i][: cfg.generation.nbest]): + hypo_tokens, hypo_str, alignment = utils.post_process_prediction( + hypo_tokens=hypo["tokens"].int().cpu(), + src_str=src_str, + alignment=hypo["alignment"], + align_dict=align_dict, + tgt_dict=tgt_dict, + remove_bpe=cfg.common_eval.post_process, + extra_symbols_to_ignore=get_symbols_to_strip_from_output(generator), + ) + detok_hypo_str = decode_fn(hypo_str) + if not cfg.common_eval.quiet: + score = hypo["score"] / math.log(2) # convert to base 2 + # original hypothesis (after tokenization and BPE) + print( + "H-{}\t{}\t{}".format(sample_id, score, hypo_str), + file=output_file, + ) + # detokenized hypothesis + print( + "D-{}\t{}\t{}".format(sample_id, score, detok_hypo_str), + file=output_file, + ) + print( + "P-{}\t{}".format( + sample_id, + " ".join( + map( + lambda x: "{:.4f}".format(x), + # convert from base e to base 2 + hypo["positional_scores"] + .div_(math.log(2)) + .tolist(), + ) + ), + ), + file=output_file, + ) + + if cfg.generation.print_alignment == "hard": + print( + "A-{}\t{}".format( + sample_id, + " ".join( + [ + "{}-{}".format(src_idx, tgt_idx) + for src_idx, tgt_idx in alignment + ] + ), + ), + file=output_file, + ) + if cfg.generation.print_alignment == "soft": + print( + "A-{}\t{}".format( + sample_id, + " ".join( + [ + ",".join(src_probs) + for src_probs in alignment + ] + ), + ), + file=output_file, + ) + + if cfg.generation.print_step: + print( + "I-{}\t{}".format(sample_id, hypo["steps"]), + file=output_file, + ) + + if cfg.generation.retain_iter_history: + for step, h in enumerate(hypo["history"]): + _, h_str, _ = utils.post_process_prediction( + hypo_tokens=h["tokens"].int().cpu(), + src_str=src_str, + alignment=None, + align_dict=None, + tgt_dict=tgt_dict, + remove_bpe=None, + ) + print( + "E-{}_{}\t{}".format(sample_id, step, h_str), + file=output_file, + ) + + # Score only the top hypothesis + if has_target and j == 0: + if align_dict is not None or cfg.common_eval.post_process is not None: + # Convert back to tokens for evaluation with unk replacement and/or without BPE + target_tokens = tgt_dict.encode_line( + target_str, add_if_not_exist=True + ) + hypo_tokens = tgt_dict.encode_line( + detok_hypo_str, add_if_not_exist=True + ) + if hasattr(scorer, "add_string"): + scorer.add_string(target_str, detok_hypo_str) + else: + scorer.add(target_tokens, hypo_tokens) + + wps_meter.update(num_generated_tokens) + progress.log({"wps": round(wps_meter.avg)}) + num_sentences += ( + sample["nsentences"] if "nsentences" in sample else sample["id"].numel() + ) + + logger.info("NOTE: hypothesis and token scores are output in base 2") + logger.info( + "Translated {:,} sentences ({:,} tokens) in {:.1f}s ({:.2f} sentences/s, {:.2f} tokens/s)".format( + num_sentences, + gen_timer.n, + gen_timer.sum, + num_sentences / gen_timer.sum, + 1.0 / gen_timer.avg, + ) + ) + if has_target: + if cfg.bpe and not cfg.generation.sacrebleu: + if cfg.common_eval.post_process: + logger.warning( + "BLEU score is being computed by splitting detokenized string on spaces, this is probably not what you want. Use --sacrebleu for standard 13a BLEU tokenization" + ) + else: + logger.warning( + "If you are using BPE on the target side, the BLEU score is computed on BPE tokens, not on proper words. Use --sacrebleu for standard 13a BLEU tokenization" + ) + # use print to be consistent with other main outputs: S-, H-, T-, D- and so on + print( + "Generate {} with beam={}: {}".format( + cfg.dataset.gen_subset, cfg.generation.beam, scorer.result_string() + ), + file=output_file, + ) + + return scorer + + +def cli_main(): + parser = options.get_generation_parser() + args = options.parse_args_and_arch(parser) + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/fairseq_cli/hydra_train.py b/SpeechT5/fairseq/fairseq_cli/hydra_train.py new file mode 100644 index 0000000..9de0108 --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/hydra_train.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os + +from fairseq.dataclass.initialize import add_defaults, hydra_init +from fairseq_cli.train import main as pre_main +from fairseq import distributed_utils, metrics +from fairseq.dataclass.configs import FairseqConfig +from fairseq.utils import reset_logging + +import hydra +from hydra.core.hydra_config import HydraConfig +import torch +from omegaconf import OmegaConf, open_dict + + +logger = logging.getLogger("fairseq_cli.hydra_train") + + +@hydra.main(config_path=os.path.join("..", "fairseq", "config"), config_name="config") +def hydra_main(cfg: FairseqConfig) -> float: + add_defaults(cfg) + + if cfg.common.reset_logging: + reset_logging() # Hydra hijacks logging, fix that + else: + with open_dict(cfg): + # make hydra logging work with ddp (see # see https://github.com/facebookresearch/hydra/issues/1126) + cfg.job_logging_cfg = OmegaConf.to_container(HydraConfig.get().job_logging, resolve=True) + + cfg = OmegaConf.create(OmegaConf.to_container(cfg, resolve=True, enum_to_str=True)) + OmegaConf.set_struct(cfg, True) + + try: + if cfg.common.profile: + with torch.cuda.profiler.profile(): + with torch.autograd.profiler.emit_nvtx(): + distributed_utils.call_main(cfg, pre_main) + else: + distributed_utils.call_main(cfg, pre_main) + except BaseException as e: + if not cfg.common.suppress_crashes: + raise + else: + logger.error("Crashed! " + str(e)) + + # get best val and return - useful for sweepers + try: + best_val = metrics.get_smoothed_value( + "valid", cfg.checkpoint.best_checkpoint_metric + ) + except: + best_val = None + + if best_val is None: + best_val = float("inf") + + return best_val + + +def cli_main(): + try: + from hydra._internal.utils import get_args + + cfg_name = get_args().config_name or "config" + except: + logger.warning("Failed to get config name from hydra args") + cfg_name = "config" + + hydra_init(cfg_name) + hydra_main() + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/fairseq_cli/interactive.py b/SpeechT5/fairseq/fairseq_cli/interactive.py new file mode 100644 index 0000000..cadef28 --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/interactive.py @@ -0,0 +1,316 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Translate raw text with a trained model. Batches data on-the-fly. +""" + +import ast +import fileinput +import logging +import math +import os +import sys +import time +from argparse import Namespace +from collections import namedtuple + +import numpy as np +import torch +from fairseq import checkpoint_utils, distributed_utils, options, tasks, utils +from fairseq.dataclass.configs import FairseqConfig +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.token_generation_constraints import pack_constraints, unpack_constraints +from fairseq_cli.generate import get_symbols_to_strip_from_output + + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("fairseq_cli.interactive") + + +Batch = namedtuple("Batch", "ids src_tokens src_lengths constraints") +Translation = namedtuple("Translation", "src_str hypos pos_scores alignments") + + +def buffered_read(input, buffer_size): + buffer = [] + with fileinput.input(files=[input], openhook=fileinput.hook_encoded("utf-8")) as h: + for src_str in h: + buffer.append(src_str.strip()) + if len(buffer) >= buffer_size: + yield buffer + buffer = [] + + if len(buffer) > 0: + yield buffer + + +def make_batches(lines, cfg, task, max_positions, encode_fn): + def encode_fn_target(x): + return encode_fn(x) + + if cfg.generation.constraints: + # Strip (tab-delimited) contraints, if present, from input lines, + # store them in batch_constraints + batch_constraints = [list() for _ in lines] + for i, line in enumerate(lines): + if "\t" in line: + lines[i], *batch_constraints[i] = line.split("\t") + + # Convert each List[str] to List[Tensor] + for i, constraint_list in enumerate(batch_constraints): + batch_constraints[i] = [ + task.target_dictionary.encode_line( + encode_fn_target(constraint), + append_eos=False, + add_if_not_exist=False, + ) + for constraint in constraint_list + ] + + if cfg.generation.constraints: + constraints_tensor = pack_constraints(batch_constraints) + else: + constraints_tensor = None + + tokens, lengths = task.get_interactive_tokens_and_lengths(lines, encode_fn) + + itr = task.get_batch_iterator( + dataset=task.build_dataset_for_inference( + tokens, lengths, constraints=constraints_tensor + ), + max_tokens=cfg.dataset.max_tokens, + max_sentences=cfg.dataset.batch_size, + max_positions=max_positions, + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + ).next_epoch_itr(shuffle=False) + for batch in itr: + ids = batch["id"] + src_tokens = batch["net_input"]["src_tokens"] + src_lengths = batch["net_input"]["src_lengths"] + constraints = batch.get("constraints", None) + + yield Batch( + ids=ids, + src_tokens=src_tokens, + src_lengths=src_lengths, + constraints=constraints, + ) + + +def main(cfg: FairseqConfig): + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + start_time = time.time() + total_translate_time = 0 + + utils.import_user_module(cfg.common) + + if cfg.interactive.buffer_size < 1: + cfg.interactive.buffer_size = 1 + if cfg.dataset.max_tokens is None and cfg.dataset.batch_size is None: + cfg.dataset.batch_size = 1 + + assert ( + not cfg.generation.sampling or cfg.generation.nbest == cfg.generation.beam + ), "--sampling requires --nbest to be equal to --beam" + assert ( + not cfg.dataset.batch_size + or cfg.dataset.batch_size <= cfg.interactive.buffer_size + ), "--batch-size cannot be larger than --buffer-size" + + logger.info(cfg) + + # Fix seed for stochastic decoding + if cfg.common.seed is not None and not cfg.generation.no_seed_provided: + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + + # Setup task, e.g., translation + task = tasks.setup_task(cfg.task) + + # Load ensemble + overrides = ast.literal_eval(cfg.common_eval.model_overrides) + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + models, _model_args = checkpoint_utils.load_model_ensemble( + utils.split_paths(cfg.common_eval.path), + arg_overrides=overrides, + task=task, + suffix=cfg.checkpoint.checkpoint_suffix, + strict=(cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.checkpoint.checkpoint_shard_count, + ) + + # Set dictionaries + src_dict = task.source_dictionary + tgt_dict = task.target_dictionary + + # Optimize ensemble for generation + for model in models: + if model is None: + continue + if cfg.common.fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + # Initialize generator + generator = task.build_generator(models, cfg.generation) + + # Handle tokenization and BPE + tokenizer = task.build_tokenizer(cfg.tokenizer) + bpe = task.build_bpe(cfg.bpe) + + def encode_fn(x): + if tokenizer is not None: + x = tokenizer.encode(x) + if bpe is not None: + x = bpe.encode(x) + return x + + def decode_fn(x): + if bpe is not None: + x = bpe.decode(x) + if tokenizer is not None: + x = tokenizer.decode(x) + return x + + # Load alignment dictionary for unknown word replacement + # (None if no unknown word replacement, empty if no path to align dictionary) + align_dict = utils.load_align_dict(cfg.generation.replace_unk) + + max_positions = utils.resolve_max_positions( + task.max_positions(), *[model.max_positions() for model in models] + ) + + if cfg.generation.constraints: + logger.warning( + "NOTE: Constrained decoding currently assumes a shared subword vocabulary." + ) + + if cfg.interactive.buffer_size > 1: + logger.info("Sentence buffer size: %s", cfg.interactive.buffer_size) + logger.info("NOTE: hypothesis and token scores are output in base 2") + logger.info("Type the input sentence and press return:") + start_id = 0 + for inputs in buffered_read(cfg.interactive.input, cfg.interactive.buffer_size): + results = [] + for batch in make_batches(inputs, cfg, task, max_positions, encode_fn): + bsz = batch.src_tokens.size(0) + src_tokens = batch.src_tokens + src_lengths = batch.src_lengths + constraints = batch.constraints + if use_cuda: + src_tokens = src_tokens.cuda() + src_lengths = src_lengths.cuda() + if constraints is not None: + constraints = constraints.cuda() + + sample = { + "net_input": { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + }, + } + translate_start_time = time.time() + translations = task.inference_step( + generator, models, sample, constraints=constraints + ) + translate_time = time.time() - translate_start_time + total_translate_time += translate_time + list_constraints = [[] for _ in range(bsz)] + if cfg.generation.constraints: + list_constraints = [unpack_constraints(c) for c in constraints] + for i, (id, hypos) in enumerate(zip(batch.ids.tolist(), translations)): + src_tokens_i = utils.strip_pad(src_tokens[i], tgt_dict.pad()) + constraints = list_constraints[i] + results.append( + ( + start_id + id, + src_tokens_i, + hypos, + { + "constraints": constraints, + "time": translate_time / len(translations), + }, + ) + ) + + # sort output to match input order + for id_, src_tokens, hypos, info in sorted(results, key=lambda x: x[0]): + src_str = '' + if src_dict is not None: + src_str = src_dict.string(src_tokens, cfg.common_eval.post_process) + print("S-{}\t{}".format(id_, src_str)) + print("W-{}\t{:.3f}\tseconds".format(id_, info["time"])) + for constraint in info["constraints"]: + print( + "C-{}\t{}".format( + id_, tgt_dict.string(constraint, cfg.common_eval.post_process) + ) + ) + + # Process top predictions + for hypo in hypos[: min(len(hypos), cfg.generation.nbest)]: + hypo_tokens, hypo_str, alignment = utils.post_process_prediction( + hypo_tokens=hypo["tokens"].int().cpu(), + src_str=src_str, + alignment=hypo["alignment"], + align_dict=align_dict, + tgt_dict=tgt_dict, + remove_bpe=cfg.common_eval.post_process, + extra_symbols_to_ignore=get_symbols_to_strip_from_output(generator), + ) + detok_hypo_str = decode_fn(hypo_str) + score = hypo["score"] / math.log(2) # convert to base 2 + # original hypothesis (after tokenization and BPE) + print("H-{}\t{}\t{}".format(id_, score, hypo_str)) + # detokenized hypothesis + print("D-{}\t{}\t{}".format(id_, score, detok_hypo_str)) + print( + "P-{}\t{}".format( + id_, + " ".join( + map( + lambda x: "{:.4f}".format(x), + # convert from base e to base 2 + hypo["positional_scores"].div_(math.log(2)).tolist(), + ) + ), + ) + ) + if cfg.generation.print_alignment: + alignment_str = " ".join( + ["{}-{}".format(src, tgt) for src, tgt in alignment] + ) + print("A-{}\t{}".format(id_, alignment_str)) + + # update running id_ counter + start_id += len(inputs) + + logger.info( + "Total time: {:.3f} seconds; translation time: {:.3f}".format( + time.time() - start_time, total_translate_time + ) + ) + + +def cli_main(): + parser = options.get_interactive_generation_parser() + args = options.parse_args_and_arch(parser) + distributed_utils.call_main(convert_namespace_to_omegaconf(args), main) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/fairseq_cli/preprocess.py b/SpeechT5/fairseq/fairseq_cli/preprocess.py new file mode 100644 index 0000000..b788900 --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/preprocess.py @@ -0,0 +1,401 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Data pre-processing: build vocabularies and binarize training data. +""" + +import logging +import os +import shutil +import sys +from collections import Counter +from itertools import zip_longest +from multiprocessing import Pool + +from fairseq import options, tasks, utils +from fairseq.binarizer import Binarizer +from fairseq.data import indexed_dataset + + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("fairseq_cli.preprocess") + + +def main(args): + utils.import_user_module(args) + + os.makedirs(args.destdir, exist_ok=True) + + logger.addHandler( + logging.FileHandler( + filename=os.path.join(args.destdir, "preprocess.log"), + ) + ) + logger.info(args) + + task = tasks.get_task(args.task) + + def train_path(lang): + return "{}{}".format(args.trainpref, ("." + lang) if lang else "") + + def file_name(prefix, lang): + fname = prefix + if lang is not None: + fname += ".{lang}".format(lang=lang) + return fname + + def dest_path(prefix, lang): + return os.path.join(args.destdir, file_name(prefix, lang)) + + def dict_path(lang): + return dest_path("dict", lang) + ".txt" + + def build_dictionary(filenames, src=False, tgt=False): + assert src ^ tgt + return task.build_dictionary( + filenames, + workers=args.workers, + threshold=args.thresholdsrc if src else args.thresholdtgt, + nwords=args.nwordssrc if src else args.nwordstgt, + padding_factor=args.padding_factor, + ) + + target = not args.only_source + + if not args.srcdict and os.path.exists(dict_path(args.source_lang)): + raise FileExistsError(dict_path(args.source_lang)) + if target and not args.tgtdict and os.path.exists(dict_path(args.target_lang)): + raise FileExistsError(dict_path(args.target_lang)) + + if args.joined_dictionary: + assert ( + not args.srcdict or not args.tgtdict + ), "cannot use both --srcdict and --tgtdict with --joined-dictionary" + + if args.srcdict: + src_dict = task.load_dictionary(args.srcdict) + elif args.tgtdict: + src_dict = task.load_dictionary(args.tgtdict) + else: + assert ( + args.trainpref + ), "--trainpref must be set if --srcdict is not specified" + src_dict = build_dictionary( + {train_path(lang) for lang in [args.source_lang, args.target_lang]}, + src=True, + ) + tgt_dict = src_dict + else: + if args.srcdict: + src_dict = task.load_dictionary(args.srcdict) + else: + assert ( + args.trainpref + ), "--trainpref must be set if --srcdict is not specified" + src_dict = build_dictionary([train_path(args.source_lang)], src=True) + + if target: + if args.tgtdict: + tgt_dict = task.load_dictionary(args.tgtdict) + else: + assert ( + args.trainpref + ), "--trainpref must be set if --tgtdict is not specified" + tgt_dict = build_dictionary([train_path(args.target_lang)], tgt=True) + else: + tgt_dict = None + + src_dict.save(dict_path(args.source_lang)) + if target and tgt_dict is not None: + tgt_dict.save(dict_path(args.target_lang)) + + if args.dict_only: + return + + def make_binary_dataset(vocab, input_prefix, output_prefix, lang, num_workers): + logger.info("[{}] Dictionary: {} types".format(lang, len(vocab))) + n_seq_tok = [0, 0] + replaced = Counter() + + def merge_result(worker_result): + replaced.update(worker_result["replaced"]) + n_seq_tok[0] += worker_result["nseq"] + n_seq_tok[1] += worker_result["ntok"] + + input_file = "{}{}".format( + input_prefix, ("." + lang) if lang is not None else "" + ) + offsets = Binarizer.find_offsets(input_file, num_workers) + pool = None + if num_workers > 1: + pool = Pool(processes=num_workers - 1) + for worker_id in range(1, num_workers): + prefix = "{}{}".format(output_prefix, worker_id) + pool.apply_async( + binarize, + ( + args, + input_file, + vocab, + prefix, + lang, + offsets[worker_id], + offsets[worker_id + 1], + ), + callback=merge_result, + ) + pool.close() + + ds = indexed_dataset.make_builder( + dataset_dest_file(args, output_prefix, lang, "bin"), + impl=args.dataset_impl, + vocab_size=len(vocab), + ) + merge_result( + Binarizer.binarize( + input_file, vocab, lambda t: ds.add_item(t), offset=0, end=offsets[1] + ) + ) + if num_workers > 1: + pool.join() + for worker_id in range(1, num_workers): + prefix = "{}{}".format(output_prefix, worker_id) + temp_file_path = dataset_dest_prefix(args, prefix, lang) + ds.merge_file_(temp_file_path) + os.remove(indexed_dataset.data_file_path(temp_file_path)) + os.remove(indexed_dataset.index_file_path(temp_file_path)) + + ds.finalize(dataset_dest_file(args, output_prefix, lang, "idx")) + + logger.info( + "[{}] {}: {} sents, {} tokens, {:.3}% replaced by {}".format( + lang, + input_file, + n_seq_tok[0], + n_seq_tok[1], + 100 * sum(replaced.values()) / n_seq_tok[1], + vocab.unk_word, + ) + ) + + def make_binary_alignment_dataset(input_prefix, output_prefix, num_workers): + nseq = [0] + + def merge_result(worker_result): + nseq[0] += worker_result["nseq"] + + input_file = input_prefix + offsets = Binarizer.find_offsets(input_file, num_workers) + pool = None + if num_workers > 1: + pool = Pool(processes=num_workers - 1) + for worker_id in range(1, num_workers): + prefix = "{}{}".format(output_prefix, worker_id) + pool.apply_async( + binarize_alignments, + ( + args, + input_file, + utils.parse_alignment, + prefix, + offsets[worker_id], + offsets[worker_id + 1], + ), + callback=merge_result, + ) + pool.close() + + ds = indexed_dataset.make_builder( + dataset_dest_file(args, output_prefix, None, "bin"), impl=args.dataset_impl + ) + + merge_result( + Binarizer.binarize_alignments( + input_file, + utils.parse_alignment, + lambda t: ds.add_item(t), + offset=0, + end=offsets[1], + ) + ) + if num_workers > 1: + pool.join() + for worker_id in range(1, num_workers): + prefix = "{}{}".format(output_prefix, worker_id) + temp_file_path = dataset_dest_prefix(args, prefix, None) + ds.merge_file_(temp_file_path) + os.remove(indexed_dataset.data_file_path(temp_file_path)) + os.remove(indexed_dataset.index_file_path(temp_file_path)) + + ds.finalize(dataset_dest_file(args, output_prefix, None, "idx")) + + logger.info("[alignments] {}: parsed {} alignments".format(input_file, nseq[0])) + + def make_dataset(vocab, input_prefix, output_prefix, lang, num_workers=1): + if args.dataset_impl == "raw": + # Copy original text file to destination folder + output_text_file = dest_path( + output_prefix + ".{}-{}".format(args.source_lang, args.target_lang), + lang, + ) + shutil.copyfile(file_name(input_prefix, lang), output_text_file) + else: + make_binary_dataset(vocab, input_prefix, output_prefix, lang, num_workers) + + def make_all(lang, vocab): + if args.trainpref: + make_dataset(vocab, args.trainpref, "train", lang, num_workers=args.workers) + if args.validpref: + for k, validpref in enumerate(args.validpref.split(",")): + outprefix = "valid{}".format(k) if k > 0 else "valid" + make_dataset( + vocab, validpref, outprefix, lang, num_workers=args.workers + ) + if args.testpref: + for k, testpref in enumerate(args.testpref.split(",")): + outprefix = "test{}".format(k) if k > 0 else "test" + make_dataset(vocab, testpref, outprefix, lang, num_workers=args.workers) + + def make_all_alignments(): + if args.trainpref and os.path.exists(args.trainpref + "." + args.align_suffix): + make_binary_alignment_dataset( + args.trainpref + "." + args.align_suffix, + "train.align", + num_workers=args.workers, + ) + if args.validpref and os.path.exists(args.validpref + "." + args.align_suffix): + make_binary_alignment_dataset( + args.validpref + "." + args.align_suffix, + "valid.align", + num_workers=args.workers, + ) + if args.testpref and os.path.exists(args.testpref + "." + args.align_suffix): + make_binary_alignment_dataset( + args.testpref + "." + args.align_suffix, + "test.align", + num_workers=args.workers, + ) + + make_all(args.source_lang, src_dict) + if target: + make_all(args.target_lang, tgt_dict) + if args.align_suffix: + make_all_alignments() + + logger.info("Wrote preprocessed data to {}".format(args.destdir)) + + if args.alignfile: + assert args.trainpref, "--trainpref must be set if --alignfile is specified" + src_file_name = train_path(args.source_lang) + tgt_file_name = train_path(args.target_lang) + freq_map = {} + with open(args.alignfile, "r", encoding="utf-8") as align_file: + with open(src_file_name, "r", encoding="utf-8") as src_file: + with open(tgt_file_name, "r", encoding="utf-8") as tgt_file: + for a, s, t in zip_longest(align_file, src_file, tgt_file): + si = src_dict.encode_line(s, add_if_not_exist=False) + ti = tgt_dict.encode_line(t, add_if_not_exist=False) + ai = list(map(lambda x: tuple(x.split("-")), a.split())) + for sai, tai in ai: + srcidx = si[int(sai)] + tgtidx = ti[int(tai)] + if srcidx != src_dict.unk() and tgtidx != tgt_dict.unk(): + assert srcidx != src_dict.pad() + assert srcidx != src_dict.eos() + assert tgtidx != tgt_dict.pad() + assert tgtidx != tgt_dict.eos() + + if srcidx not in freq_map: + freq_map[srcidx] = {} + if tgtidx not in freq_map[srcidx]: + freq_map[srcidx][tgtidx] = 1 + else: + freq_map[srcidx][tgtidx] += 1 + + align_dict = {} + for srcidx in freq_map.keys(): + align_dict[srcidx] = max(freq_map[srcidx], key=freq_map[srcidx].get) + + with open( + os.path.join( + args.destdir, + "alignment.{}-{}.txt".format(args.source_lang, args.target_lang), + ), + "w", + encoding="utf-8", + ) as f: + for k, v in align_dict.items(): + print("{} {}".format(src_dict[k], tgt_dict[v]), file=f) + + +def binarize(args, filename, vocab, output_prefix, lang, offset, end, append_eos=True): + ds = indexed_dataset.make_builder( + dataset_dest_file(args, output_prefix, lang, "bin"), + impl=args.dataset_impl, + vocab_size=len(vocab), + ) + + def consumer(tensor): + ds.add_item(tensor) + + res = Binarizer.binarize( + filename, vocab, consumer, append_eos=append_eos, offset=offset, end=end + ) + ds.finalize(dataset_dest_file(args, output_prefix, lang, "idx")) + return res + + +def binarize_alignments(args, filename, parse_alignment, output_prefix, offset, end): + ds = indexed_dataset.make_builder( + dataset_dest_file(args, output_prefix, None, "bin"), + impl=args.dataset_impl, + vocab_size=None, + ) + + def consumer(tensor): + ds.add_item(tensor) + + res = Binarizer.binarize_alignments( + filename, parse_alignment, consumer, offset=offset, end=end + ) + ds.finalize(dataset_dest_file(args, output_prefix, None, "idx")) + return res + + +def dataset_dest_prefix(args, output_prefix, lang): + base = "{}/{}".format(args.destdir, output_prefix) + if lang is not None: + lang_part = ".{}-{}.{}".format(args.source_lang, args.target_lang, lang) + elif args.only_source: + lang_part = "" + else: + lang_part = ".{}-{}".format(args.source_lang, args.target_lang) + + return "{}{}".format(base, lang_part) + + +def dataset_dest_file(args, output_prefix, lang, extension): + base = dataset_dest_prefix(args, output_prefix, lang) + return "{}.{}".format(base, extension) + + +def get_offsets(input_file, num_workers): + return Binarizer.find_offsets(input_file, num_workers) + + +def cli_main(): + parser = options.get_preprocessing_parser() + args = parser.parse_args() + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/fairseq_cli/score.py b/SpeechT5/fairseq/fairseq_cli/score.py new file mode 100644 index 0000000..0b207be --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/score.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +BLEU scoring of generated translations against reference translations. +""" + +import argparse +import os +import sys + +from fairseq.data import dictionary +from fairseq.scoring import bleu + + +def get_parser(): + parser = argparse.ArgumentParser( + description="Command-line script for BLEU scoring." + ) + # fmt: off + parser.add_argument('-s', '--sys', default='-', help='system output') + parser.add_argument('-r', '--ref', required=True, help='references') + parser.add_argument('-o', '--order', default=4, metavar='N', + type=int, help='consider ngrams up to this order') + parser.add_argument('--ignore-case', action='store_true', + help='case-insensitive scoring') + parser.add_argument('--sacrebleu', action='store_true', + help='score with sacrebleu') + parser.add_argument('--sentence-bleu', action='store_true', + help='report sentence-level BLEUs (i.e., with +1 smoothing)') + # fmt: on + return parser + + +def cli_main(): + parser = get_parser() + args = parser.parse_args() + print(args) + + assert args.sys == "-" or os.path.exists( + args.sys + ), "System output file {} does not exist".format(args.sys) + assert os.path.exists(args.ref), "Reference file {} does not exist".format(args.ref) + + dict = dictionary.Dictionary() + + def readlines(fd): + for line in fd.readlines(): + if args.ignore_case: + yield line.lower() + else: + yield line + + if args.sacrebleu: + import sacrebleu + + def score(fdsys): + with open(args.ref) as fdref: + print(sacrebleu.corpus_bleu(fdsys, [fdref]).format()) + + elif args.sentence_bleu: + + def score(fdsys): + with open(args.ref) as fdref: + scorer = bleu.Scorer(dict.pad(), dict.eos(), dict.unk()) + for i, (sys_tok, ref_tok) in enumerate( + zip(readlines(fdsys), readlines(fdref)) + ): + scorer.reset(one_init=True) + sys_tok = dict.encode_line(sys_tok) + ref_tok = dict.encode_line(ref_tok) + scorer.add(ref_tok, sys_tok) + print(i, scorer.result_string(args.order)) + + else: + + def score(fdsys): + with open(args.ref) as fdref: + scorer = bleu.Scorer( + bleu.BleuConfig( + pad=dict.pad(), + eos=dict.eos(), + unk=dict.unk(), + ) + ) + for sys_tok, ref_tok in zip(readlines(fdsys), readlines(fdref)): + sys_tok = dict.encode_line(sys_tok) + ref_tok = dict.encode_line(ref_tok) + scorer.add(ref_tok, sys_tok) + print(scorer.result_string(args.order)) + + if args.sys == "-": + score(sys.stdin) + else: + with open(args.sys, "r") as f: + score(f) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/fairseq_cli/train.py b/SpeechT5/fairseq/fairseq_cli/train.py new file mode 100644 index 0000000..8347587 --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/train.py @@ -0,0 +1,514 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Train a new model on one or across multiple GPUs. +""" + +import argparse +import logging +import math +import os +import sys +from typing import Dict, Optional, Any, List, Tuple, Callable + +# We need to setup root logger before importing any fairseq libraries. +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("fairseq_cli.train") + +import numpy as np +import torch +from fairseq import ( + checkpoint_utils, + options, + quantization_utils, + tasks, + utils, +) +from fairseq.data import iterators, data_utils +from fairseq.data.plasma_utils import PlasmaStore +from fairseq.dataclass.configs import FairseqConfig +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.distributed import fsdp_enable_wrap, fsdp_wrap, utils as distributed_utils +from fairseq.file_io import PathManager +from fairseq.logging import meters, metrics, progress_bar +from fairseq.model_parallel.megatron_trainer import MegatronTrainer +from fairseq.trainer import Trainer +from omegaconf import DictConfig, OmegaConf + + + + +def main(cfg: FairseqConfig) -> None: + if isinstance(cfg, argparse.Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + utils.import_user_module(cfg.common) + + if distributed_utils.is_master(cfg.distributed_training) and "job_logging_cfg" in cfg: + # make hydra logging work with ddp (see # see https://github.com/facebookresearch/hydra/issues/1126) + logging.config.dictConfig(OmegaConf.to_container(cfg.job_logging_cfg)) + + assert ( + cfg.dataset.max_tokens is not None or cfg.dataset.batch_size is not None + ), "Must specify batch size either with --max-tokens or --batch-size" + metrics.reset() + + if cfg.common.log_file is not None: + handler = logging.FileHandler(filename=cfg.common.log_file) + logger.addHandler(handler) + + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + if distributed_utils.is_master(cfg.distributed_training): + checkpoint_utils.verify_checkpoint_directory(cfg.checkpoint.save_dir) + + # Print args + logger.info(cfg) + + if cfg.checkpoint.write_checkpoints_asynchronously: + try: + import iopath # noqa: F401 + except ImportError: + logging.exception( + "Asynchronous checkpoint writing is specified but iopath is " + "not installed: `pip install iopath`" + ) + return + + # Setup task, e.g., translation, language modeling, etc. + task = tasks.setup_task(cfg.task) + + assert cfg.criterion, "Please specify criterion to train a model" + + # Build model and criterion + if cfg.distributed_training.ddp_backend == "fully_sharded": + with fsdp_enable_wrap(cfg.distributed_training): + model = fsdp_wrap(task.build_model(cfg.model)) + else: + model = task.build_model(cfg.model) + criterion = task.build_criterion(cfg.criterion) + logger.info(model) + logger.info("task: {}".format(task.__class__.__name__)) + logger.info("model: {}".format(model.__class__.__name__)) + logger.info("criterion: {}".format(criterion.__class__.__name__)) + logger.info( + "num. shared model params: {:,} (num. trained: {:,})".format( + sum(p.numel() for p in model.parameters() if not getattr(p, "expert", False)), + sum(p.numel() for p in model.parameters() if not getattr(p, "expert", False) and p.requires_grad) + ) + ) + + logger.info( + "num. expert model params: {} (num. trained: {})".format( + sum(p.numel() for p in model.parameters() if getattr(p, "expert", False)), + sum(p.numel() for p in model.parameters() if getattr(p, "expert", False) and p.requires_grad), + ) + ) + + # Load valid dataset (we load training data below, based on the latest checkpoint) + # We load the valid dataset AFTER building the model + data_utils.raise_if_valid_subsets_unintentionally_ignored(cfg) + if cfg.dataset.combine_valid_subsets: + task.load_dataset("valid", combine=True, epoch=1) + else: + for valid_sub_split in cfg.dataset.valid_subset.split(","): + task.load_dataset(valid_sub_split, combine=False, epoch=1) + + # (optionally) Configure quantization + if cfg.common.quantization_config_path is not None: + quantizer = quantization_utils.Quantizer( + config_path=cfg.common.quantization_config_path, + max_epoch=cfg.optimization.max_epoch, + max_update=cfg.optimization.max_update, + ) + else: + quantizer = None + + # Build trainer + if cfg.common.model_parallel_size == 1: + trainer = Trainer(cfg, task, model, criterion, quantizer) + else: + trainer = MegatronTrainer(cfg, task, model, criterion) + logger.info( + "training on {} devices (GPUs/TPUs)".format( + cfg.distributed_training.distributed_world_size + ) + ) + logger.info( + "max tokens per device = {} and max sentences per device = {}".format( + cfg.dataset.max_tokens, + cfg.dataset.batch_size, + ) + ) + + # Load the latest checkpoint if one is available and restore the + # corresponding train iterator + extra_state, epoch_itr = checkpoint_utils.load_checkpoint( + cfg.checkpoint, + trainer, + # don't cache epoch iterators for sharded datasets + disable_iterator_cache=task.has_sharded_data("train"), + ) + if cfg.common.tpu: + import torch_xla.core.xla_model as xm + xm.rendezvous("load_checkpoint") # wait for all workers + + max_epoch = cfg.optimization.max_epoch or math.inf + lr = trainer.get_lr() + + train_meter = meters.StopwatchMeter() + train_meter.start() + while epoch_itr.next_epoch_idx <= max_epoch: + if lr <= cfg.optimization.stop_min_lr: + logger.info( + f"stopping training because current learning rate ({lr}) is smaller " + "than or equal to minimum learning rate " + f"(--stop-min-lr={cfg.optimization.stop_min_lr})" + ) + break + + # train for one epoch + valid_losses, should_stop = train(cfg, trainer, task, epoch_itr) + if should_stop: + break + + # only use first validation loss to update the learning rate + lr = trainer.lr_step(epoch_itr.epoch, valid_losses[0]) + + epoch_itr = trainer.get_train_iterator( + epoch_itr.next_epoch_idx, + # sharded data: get train iterator for next epoch + load_dataset=task.has_sharded_data("train"), + # don't cache epoch iterators for sharded datasets + disable_iterator_cache=task.has_sharded_data("train"), + ) + train_meter.stop() + logger.info("done training in {:.1f} seconds".format(train_meter.sum)) + + # ioPath implementation to wait for all asynchronous file writes to complete. + if cfg.checkpoint.write_checkpoints_asynchronously: + logger.info( + "ioPath PathManager waiting for all asynchronous checkpoint " + "writes to finish." + ) + PathManager.async_close() + logger.info("ioPath PathManager finished waiting.") + + +def should_stop_early(cfg: DictConfig, valid_loss: float) -> bool: + # skip check if no validation was done in the current epoch + if valid_loss is None: + return False + if cfg.checkpoint.patience <= 0: + return False + + def is_better(a, b): + return a > b if cfg.checkpoint.maximize_best_checkpoint_metric else a < b + + prev_best = getattr(should_stop_early, "best", None) + if prev_best is None or is_better(valid_loss, prev_best): + should_stop_early.best = valid_loss + should_stop_early.num_runs = 0 + return False + else: + should_stop_early.num_runs += 1 + if should_stop_early.num_runs >= cfg.checkpoint.patience: + logger.info( + "early stop since valid performance hasn't improved for last {} runs".format( + cfg.checkpoint.patience + ) + ) + return True + else: + return False + + +@metrics.aggregate("train") +def train( + cfg: DictConfig, trainer: Trainer, task: tasks.FairseqTask, epoch_itr +) -> Tuple[List[Optional[float]], bool]: + """Train the model for one epoch and return validation losses.""" + # Initialize data iterator + itr = epoch_itr.next_epoch_itr( + fix_batches_to_gpus=cfg.distributed_training.fix_batches_to_gpus, + shuffle=(epoch_itr.next_epoch_idx > cfg.dataset.curriculum), + ) + update_freq = ( + cfg.optimization.update_freq[epoch_itr.epoch - 1] + if epoch_itr.epoch <= len(cfg.optimization.update_freq) + else cfg.optimization.update_freq[-1] + ) + itr = iterators.GroupedIterator(itr, update_freq) + if cfg.common.tpu: + itr = utils.tpu_data_loader(itr) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_file=cfg.common.log_file, + log_interval=cfg.common.log_interval, + epoch=epoch_itr.epoch, + tensorboard_logdir=( + cfg.common.tensorboard_logdir + if distributed_utils.is_master(cfg.distributed_training) + else None + ), + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + wandb_project=( + cfg.common.wandb_project + if distributed_utils.is_master(cfg.distributed_training) + else None + ), + wandb_run_name=os.environ.get( + "WANDB_NAME", os.path.basename(cfg.checkpoint.save_dir) + ), + azureml_logging=( + cfg.common.azureml_logging + if distributed_utils.is_master(cfg.distributed_training) + else False + ), + ) + progress.update_config(_flatten_config(cfg)) + + trainer.begin_epoch(epoch_itr.epoch) + + valid_subsets = cfg.dataset.valid_subset.split(",") + should_stop = False + num_updates = trainer.get_num_updates() + logger.info("Start iterating over samples") + for i, samples in enumerate(progress): + with metrics.aggregate("train_inner"), torch.autograd.profiler.record_function( + "train_step-%d" % i + ): + log_output = trainer.train_step(samples) + + if log_output is not None: # not OOM, overflow, ... + # log mid-epoch stats + num_updates = trainer.get_num_updates() + if num_updates % cfg.common.log_interval == 0: + stats = get_training_stats(metrics.get_smoothed_values("train_inner")) + progress.log(stats, tag="train_inner", step=num_updates) + + # reset mid-epoch stats after each log interval + # the end-of-epoch stats will still be preserved + metrics.reset_meters("train_inner") + + end_of_epoch = not itr.has_next() + valid_losses, should_stop = validate_and_save( + cfg, trainer, task, epoch_itr, valid_subsets, end_of_epoch + ) + + if should_stop: + break + + # log end-of-epoch stats + logger.info("end of epoch {} (average epoch stats below)".format(epoch_itr.epoch)) + stats = get_training_stats(metrics.get_smoothed_values("train")) + progress.print(stats, tag="train", step=num_updates) + + # reset epoch-level meters + metrics.reset_meters("train") + return valid_losses, should_stop + + +def _flatten_config(cfg: DictConfig): + config = OmegaConf.to_container(cfg) + # remove any legacy Namespaces and replace with a single "args" + namespace = None + for k, v in list(config.items()): + if isinstance(v, argparse.Namespace): + namespace = v + del config[k] + if namespace is not None: + config["args"] = vars(namespace) + return config + + +def validate_and_save( + cfg: DictConfig, + trainer: Trainer, + task: tasks.FairseqTask, + epoch_itr, + valid_subsets: List[str], + end_of_epoch: bool, +) -> Tuple[List[Optional[float]], bool]: + num_updates = trainer.get_num_updates() + max_update = cfg.optimization.max_update or math.inf + + # Stopping conditions (and an additional one based on validation loss later + # on) + should_stop = False + if num_updates >= max_update: + should_stop = True + logger.info( + f"Stopping training due to " + f"num_updates: {num_updates} >= max_update: {max_update}" + ) + + training_time_hours = trainer.cumulative_training_time() / (60 * 60) + if ( + cfg.optimization.stop_time_hours > 0 + and training_time_hours > cfg.optimization.stop_time_hours + ): + should_stop = True + logger.info( + f"Stopping training due to " + f"cumulative_training_time: {training_time_hours} > " + f"stop_time_hours: {cfg.optimization.stop_time_hours} hour(s)" + ) + + do_save = ( + (end_of_epoch and epoch_itr.epoch % cfg.checkpoint.save_interval == 0) + or should_stop + or ( + cfg.checkpoint.save_interval_updates > 0 + and num_updates > 0 + and num_updates % cfg.checkpoint.save_interval_updates == 0 + and num_updates >= cfg.dataset.validate_after_updates + ) + ) + do_validate = ( + (not end_of_epoch and do_save) # validate during mid-epoch saves + or (end_of_epoch and epoch_itr.epoch % cfg.dataset.validate_interval == 0) + or should_stop + or ( + cfg.dataset.validate_interval_updates > 0 + and num_updates > 0 + and num_updates % cfg.dataset.validate_interval_updates == 0 + ) + ) and not cfg.dataset.disable_validation and num_updates >= cfg.dataset.validate_after_updates + + # Validate + valid_losses = [None] + if do_validate: + valid_losses = validate(cfg, trainer, task, epoch_itr, valid_subsets) + + should_stop |= should_stop_early(cfg, valid_losses[0]) + + # Save checkpoint + if do_save or should_stop: + checkpoint_utils.save_checkpoint( + cfg.checkpoint, trainer, epoch_itr, valid_losses[0] + ) + + return valid_losses, should_stop + + +def get_training_stats(stats: Dict[str, Any]) -> Dict[str, Any]: + stats["wall"] = round(metrics.get_meter("default", "wall").elapsed_time, 0) + return stats + + +def validate( + cfg: DictConfig, + trainer: Trainer, + task: tasks.FairseqTask, + epoch_itr, + subsets: List[str], +) -> List[Optional[float]]: + """Evaluate the model on the validation set(s) and return the losses.""" + + if cfg.dataset.fixed_validation_seed is not None: + # set fixed seed for every validation + utils.set_torch_seed(cfg.dataset.fixed_validation_seed) + + trainer.begin_valid_epoch(epoch_itr.epoch) + valid_losses = [] + for subset in subsets: + logger.info('begin validation on "{}" subset'.format(subset)) + + # Initialize data iterator + itr = trainer.get_valid_iterator(subset).next_epoch_itr( + shuffle=False, set_dataset_epoch=False # use a fixed valid set + ) + if cfg.common.tpu: + itr = utils.tpu_data_loader(itr) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + epoch=epoch_itr.epoch, + prefix=f"valid on '{subset}' subset", + tensorboard_logdir=( + cfg.common.tensorboard_logdir + if distributed_utils.is_master(cfg.distributed_training) + else None + ), + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + wandb_project=( + cfg.common.wandb_project + if distributed_utils.is_master(cfg.distributed_training) + else None + ), + wandb_run_name=os.environ.get( + "WANDB_NAME", os.path.basename(cfg.checkpoint.save_dir) + ), + ) + + # create a new root metrics aggregator so validation metrics + # don't pollute other aggregators (e.g., train meters) + with metrics.aggregate(new_root=True) as agg: + for i, sample in enumerate(progress): + if cfg.dataset.max_valid_steps is not None and i > cfg.dataset.max_valid_steps: + break + trainer.valid_step(sample) + + # log validation stats + stats = get_valid_stats(cfg, trainer, agg.get_smoothed_values()) + + if hasattr(task, "post_validate"): + task.post_validate(trainer.get_model(), stats, agg) + + progress.print(stats, tag=subset, step=trainer.get_num_updates()) + + valid_losses.append(stats[cfg.checkpoint.best_checkpoint_metric]) + return valid_losses + + +def get_valid_stats( + cfg: DictConfig, trainer: Trainer, stats: Dict[str, Any] +) -> Dict[str, Any]: + stats["num_updates"] = trainer.get_num_updates() + if hasattr(checkpoint_utils.save_checkpoint, "best"): + key = "best_{0}".format(cfg.checkpoint.best_checkpoint_metric) + best_function = max if cfg.checkpoint.maximize_best_checkpoint_metric else min + stats[key] = best_function( + checkpoint_utils.save_checkpoint.best, + stats[cfg.checkpoint.best_checkpoint_metric], + ) + return stats + + +def cli_main( + modify_parser: Optional[Callable[[argparse.ArgumentParser], None]] = None +) -> None: + parser = options.get_training_parser() + args = options.parse_args_and_arch(parser, modify_parser=modify_parser) + + cfg = convert_namespace_to_omegaconf(args) + + if cfg.common.use_plasma_view: + server = PlasmaStore(path=cfg.common.plasma_path) + logger.info(f"Started plasma server pid {server.server.pid} {cfg.common.plasma_path}") + + if args.profile: + with torch.cuda.profiler.profile(): + with torch.autograd.profiler.emit_nvtx(): + distributed_utils.call_main(cfg, main) + else: + distributed_utils.call_main(cfg, main) + + # if cfg.common.use_plasma_view: + # server.server.kill() + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/fairseq_cli/validate.py b/SpeechT5/fairseq/fairseq_cli/validate.py new file mode 100644 index 0000000..22b93e9 --- /dev/null +++ b/SpeechT5/fairseq/fairseq_cli/validate.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import os +import sys +from argparse import Namespace +from itertools import chain + +import torch +from fairseq import checkpoint_utils, distributed_utils, options, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.logging import metrics, progress_bar +from fairseq.utils import reset_logging +from omegaconf import DictConfig + + +logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, +) +logger = logging.getLogger("fairseq_cli.validate") + + +def main(cfg: DictConfig, override_args=None): + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + utils.import_user_module(cfg.common) + + reset_logging() + + assert ( + cfg.dataset.max_tokens is not None or cfg.dataset.batch_size is not None + ), "Must specify batch size either with --max-tokens or --batch-size" + + use_fp16 = cfg.common.fp16 + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + + if use_cuda: + torch.cuda.set_device(cfg.distributed_training.device_id) + + if cfg.distributed_training.distributed_world_size > 1: + data_parallel_world_size = distributed_utils.get_data_parallel_world_size() + data_parallel_rank = distributed_utils.get_data_parallel_rank() + else: + data_parallel_world_size = 1 + data_parallel_rank = 0 + + if override_args is not None: + overrides = vars(override_args) + overrides.update(eval(getattr(override_args, "model_overrides", "{}"))) + else: + overrides = None + + # Load ensemble + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task( + [cfg.common_eval.path], + arg_overrides=overrides, + suffix=cfg.checkpoint.checkpoint_suffix, + ) + model = models[0] + + # Move models to GPU + for model in models: + model.eval() + if use_fp16: + model.half() + if use_cuda: + model.cuda() + + # Print args + logger.info(saved_cfg) + + # Build criterion + criterion = task.build_criterion(saved_cfg.criterion) + criterion.eval() + + for subset in cfg.dataset.valid_subset.split(","): + try: + task.load_dataset(subset, combine=False, epoch=1, task_cfg=saved_cfg.task) + dataset = task.dataset(subset) + except KeyError: + raise Exception("Cannot find dataset: " + subset) + + # Initialize data iterator + itr = task.get_batch_iterator( + dataset=dataset, + max_tokens=cfg.dataset.max_tokens, + max_sentences=cfg.dataset.batch_size, + max_positions=utils.resolve_max_positions( + task.max_positions(), + *[m.max_positions() for m in models], + ), + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.dataset.required_batch_size_multiple, + seed=cfg.common.seed, + num_shards=data_parallel_world_size, + shard_id=data_parallel_rank, + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + prefix=f"valid on '{subset}' subset", + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + log_outputs = [] + for i, sample in enumerate(progress): + sample = utils.move_to_cuda(sample) if use_cuda else sample + _loss, _sample_size, log_output = task.valid_step(sample, model, criterion) + progress.log(log_output, step=i) + log_outputs.append(log_output) + + if data_parallel_world_size > 1: + log_outputs = distributed_utils.all_gather_list( + log_outputs, + max_size=cfg.common.all_gather_list_size, + group=distributed_utils.get_data_parallel_group(), + ) + log_outputs = list(chain.from_iterable(log_outputs)) + + with metrics.aggregate() as agg: + task.reduce_metrics(log_outputs, criterion) + log_output = agg.get_smoothed_values() + + progress.print(log_output, tag=subset, step=i) + + +def cli_main(): + parser = options.get_validation_parser() + args = options.parse_args_and_arch(parser) + + # only override args that are explicitly given on the command line + override_parser = options.get_validation_parser() + override_args = options.parse_args_and_arch( + override_parser, suppress_defaults=True + ) + + distributed_utils.call_main( + convert_namespace_to_omegaconf(args), main, override_args=override_args + ) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/fairseq/hubconf.py b/SpeechT5/fairseq/hubconf.py new file mode 100644 index 0000000..5949e27 --- /dev/null +++ b/SpeechT5/fairseq/hubconf.py @@ -0,0 +1,73 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +"""isort:skip_file""" + +import functools +import importlib + + +dependencies = [ + "dataclasses", + "hydra", + "numpy", + "omegaconf", + "regex", + "requests", + "torch", +] + + +# Check for required dependencies and raise a RuntimeError if any are missing. +missing_deps = [] +for dep in dependencies: + try: + importlib.import_module(dep) + except ImportError: + # Hack: the hydra package is provided under the "hydra-core" name in + # pypi. We don't want the user mistakenly calling `pip install hydra` + # since that will install an unrelated package. + if dep == "hydra": + dep = "hydra-core" + missing_deps.append(dep) +if len(missing_deps) > 0: + raise RuntimeError("Missing dependencies: {}".format(", ".join(missing_deps))) + + +# only do fairseq imports after checking for dependencies +from fairseq.hub_utils import ( # noqa; noqa + BPEHubInterface as bpe, + TokenizerHubInterface as tokenizer, +) +from fairseq.models import MODEL_REGISTRY # noqa + + +# torch.hub doesn't build Cython components, so if they are not found then try +# to build them here +try: + import fairseq.data.token_block_utils_fast # noqa +except ImportError: + try: + import cython # noqa + import os + from setuptools import sandbox + + sandbox.run_setup( + os.path.join(os.path.dirname(__file__), "setup.py"), + ["build_ext", "--inplace"], + ) + except ImportError: + print( + "Unable to build Cython components. Please make sure Cython is " + "installed if the torch.hub model you are loading depends on it." + ) + + +# automatically expose models defined in FairseqModel::hub_models +for _model_type, _cls in MODEL_REGISTRY.items(): + for model_name in _cls.hub_models().keys(): + globals()[model_name] = functools.partial( + _cls.from_pretrained, + model_name, + ) diff --git a/SpeechT5/fairseq/pyproject.toml b/SpeechT5/fairseq/pyproject.toml new file mode 100644 index 0000000..6d1b4c5 --- /dev/null +++ b/SpeechT5/fairseq/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel", "cython"] +build-backend = "setuptools.build_meta" diff --git a/SpeechT5/fairseq/scripts/__init__.py b/SpeechT5/fairseq/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/scripts/average_checkpoints.py b/SpeechT5/fairseq/scripts/average_checkpoints.py new file mode 100644 index 0000000..c512f80 --- /dev/null +++ b/SpeechT5/fairseq/scripts/average_checkpoints.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import collections +import os +import re + +import torch +from fairseq.file_io import PathManager + + +def average_checkpoints(inputs): + """Loads checkpoints from inputs and returns a model with averaged weights. + + Args: + inputs: An iterable of string paths of checkpoints to load from. + + Returns: + A dict of string keys mapping to various values. The 'model' key + from the returned dict should correspond to an OrderedDict mapping + string parameter names to torch Tensors. + """ + params_dict = collections.OrderedDict() + params_keys = None + new_state = None + num_models = len(inputs) + + for fpath in inputs: + with PathManager.open(fpath, "rb") as f: + state = torch.load( + f, + map_location=( + lambda s, _: torch.serialization.default_restore_location(s, "cpu") + ), + ) + # Copies over the settings from the first checkpoint + if new_state is None: + new_state = state + + model_params = state["model"] + + model_params_keys = list(model_params.keys()) + if params_keys is None: + params_keys = model_params_keys + elif params_keys != model_params_keys: + raise KeyError( + "For checkpoint {}, expected list of params: {}, " + "but found: {}".format(f, params_keys, model_params_keys) + ) + + for k in params_keys: + p = model_params[k] + if isinstance(p, torch.HalfTensor): + p = p.float() + if k not in params_dict: + params_dict[k] = p.clone() + # NOTE: clone() is needed in case of p is a shared parameter + else: + params_dict[k] += p + + averaged_params = collections.OrderedDict() + for k, v in params_dict.items(): + averaged_params[k] = v + if averaged_params[k].is_floating_point(): + averaged_params[k].div_(num_models) + else: + averaged_params[k] //= num_models + new_state["model"] = averaged_params + return new_state + + +def last_n_checkpoints(paths, n, update_based, upper_bound=None): + assert len(paths) == 1 + path = paths[0] + if update_based: + pt_regexp = re.compile(r"checkpoint_\d+_(\d+)\.pt") + else: + pt_regexp = re.compile(r"checkpoint(\d+)\.pt") + files = PathManager.ls(path) + + entries = [] + for f in files: + m = pt_regexp.fullmatch(f) + if m is not None: + sort_key = int(m.group(1)) + if upper_bound is None or sort_key <= upper_bound: + entries.append((sort_key, m.group(0))) + if len(entries) < n: + raise Exception( + "Found {} checkpoint files but need at least {}", len(entries), n + ) + return [os.path.join(path, x[1]) for x in sorted(entries, reverse=True)[:n]] + + +def main(): + parser = argparse.ArgumentParser( + description="Tool to average the params of input checkpoints to " + "produce a new checkpoint", + ) + # fmt: off + parser.add_argument('--inputs', required=True, nargs='+', + help='Input checkpoint file paths.') + parser.add_argument('--output', required=True, metavar='FILE', + help='Write the new checkpoint containing the averaged weights to this path.') + num_group = parser.add_mutually_exclusive_group() + num_group.add_argument('--num-epoch-checkpoints', type=int, + help='if set, will try to find checkpoints with names checkpoint_xx.pt in the path specified by input, ' + 'and average last this many of them.') + num_group.add_argument('--num-update-checkpoints', type=int, + help='if set, will try to find checkpoints with names checkpoint_ee_xx.pt in the path specified by input, ' + 'and average last this many of them.') + parser.add_argument('--checkpoint-upper-bound', type=int, + help='when using --num-epoch-checkpoints, this will set an upper bound on which epoch to use, ' + 'when using --num-update-checkpoints, this will set an upper bound on which update to use' + 'e.g., with --num-epoch-checkpoints=10 --checkpoint-upper-bound=50, checkpoints 41-50 would be averaged.' + 'e.g., with --num-update-checkpoints=10 --checkpoint-upper-bound=50000, checkpoints 40500-50000 would be averaged assuming --save-interval-updates 500' + ) + # fmt: on + args = parser.parse_args() + print(args) + + num = None + is_update_based = False + if args.num_update_checkpoints is not None: + num = args.num_update_checkpoints + is_update_based = True + elif args.num_epoch_checkpoints is not None: + num = args.num_epoch_checkpoints + + assert args.checkpoint_upper_bound is None or ( + args.num_epoch_checkpoints is not None + or args.num_update_checkpoints is not None + ), "--checkpoint-upper-bound requires --num-epoch-checkpoints or --num-update-checkpoints" + assert ( + args.num_epoch_checkpoints is None or args.num_update_checkpoints is None + ), "Cannot combine --num-epoch-checkpoints and --num-update-checkpoints" + + if num is not None: + args.inputs = last_n_checkpoints( + args.inputs, + num, + is_update_based, + upper_bound=args.checkpoint_upper_bound, + ) + print("averaging checkpoints: ", args.inputs) + + new_state = average_checkpoints(args.inputs) + with PathManager.open(args.output, "wb") as f: + torch.save(new_state, f) + print("Finished writing averaged checkpoint to {}".format(args.output)) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/build_sym_alignment.py b/SpeechT5/fairseq/scripts/build_sym_alignment.py new file mode 100644 index 0000000..0ca5c18 --- /dev/null +++ b/SpeechT5/fairseq/scripts/build_sym_alignment.py @@ -0,0 +1,97 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Use this script in order to build symmetric alignments for your translation +dataset. +This script depends on fast_align and mosesdecoder tools. You will need to +build those before running the script. +fast_align: + github: http://github.com/clab/fast_align + instructions: follow the instructions in README.md +mosesdecoder: + github: http://github.com/moses-smt/mosesdecoder + instructions: http://www.statmt.org/moses/?n=Development.GetStarted +The script produces the following files under --output_dir: + text.joined - concatenation of lines from the source_file and the + target_file. + align.forward - forward pass of fast_align. + align.backward - backward pass of fast_align. + aligned.sym_heuristic - symmetrized alignment. +""" + +import argparse +import os +from itertools import zip_longest + + +def main(): + parser = argparse.ArgumentParser(description="symmetric alignment builer") + # fmt: off + parser.add_argument('--fast_align_dir', + help='path to fast_align build directory') + parser.add_argument('--mosesdecoder_dir', + help='path to mosesdecoder root directory') + parser.add_argument('--sym_heuristic', + help='heuristic to use for symmetrization', + default='grow-diag-final-and') + parser.add_argument('--source_file', + help='path to a file with sentences ' + 'in the source language') + parser.add_argument('--target_file', + help='path to a file with sentences ' + 'in the target language') + parser.add_argument('--output_dir', + help='output directory') + # fmt: on + args = parser.parse_args() + + fast_align_bin = os.path.join(args.fast_align_dir, "fast_align") + symal_bin = os.path.join(args.mosesdecoder_dir, "bin", "symal") + sym_fast_align_bin = os.path.join( + args.mosesdecoder_dir, "scripts", "ems", "support", "symmetrize-fast-align.perl" + ) + + # create joined file + joined_file = os.path.join(args.output_dir, "text.joined") + with open(args.source_file, "r", encoding="utf-8") as src, open( + args.target_file, "r", encoding="utf-8" + ) as tgt: + with open(joined_file, "w", encoding="utf-8") as joined: + for s, t in zip_longest(src, tgt): + print("{} ||| {}".format(s.strip(), t.strip()), file=joined) + + bwd_align_file = os.path.join(args.output_dir, "align.backward") + + # run forward alignment + fwd_align_file = os.path.join(args.output_dir, "align.forward") + fwd_fast_align_cmd = "{FASTALIGN} -i {JOINED} -d -o -v > {FWD}".format( + FASTALIGN=fast_align_bin, JOINED=joined_file, FWD=fwd_align_file + ) + assert os.system(fwd_fast_align_cmd) == 0 + + # run backward alignment + bwd_align_file = os.path.join(args.output_dir, "align.backward") + bwd_fast_align_cmd = "{FASTALIGN} -i {JOINED} -d -o -v -r > {BWD}".format( + FASTALIGN=fast_align_bin, JOINED=joined_file, BWD=bwd_align_file + ) + assert os.system(bwd_fast_align_cmd) == 0 + + # run symmetrization + sym_out_file = os.path.join(args.output_dir, "aligned") + sym_cmd = "{SYMFASTALIGN} {FWD} {BWD} {SRC} {TGT} {OUT} {HEURISTIC} {SYMAL}".format( + SYMFASTALIGN=sym_fast_align_bin, + FWD=fwd_align_file, + BWD=bwd_align_file, + SRC=args.source_file, + TGT=args.target_file, + OUT=sym_out_file, + HEURISTIC=args.sym_heuristic, + SYMAL=symal_bin, + ) + assert os.system(sym_cmd) == 0 + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/compare_namespaces.py b/SpeechT5/fairseq/scripts/compare_namespaces.py new file mode 100644 index 0000000..bc24db6 --- /dev/null +++ b/SpeechT5/fairseq/scripts/compare_namespaces.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +"""Helper script to compare two argparse.Namespace objects.""" + +from argparse import Namespace # noqa + + +def main(): + + ns1 = eval(input("Namespace 1: ")) + ns2 = eval(input("Namespace 2: ")) + + def keys(ns): + ks = set() + for k in dir(ns): + if not k.startswith("_"): + ks.add(k) + return ks + + k1 = keys(ns1) + k2 = keys(ns2) + + def print_keys(ks, ns1, ns2=None): + for k in ks: + if ns2 is None: + print("{}\t{}".format(k, getattr(ns1, k, None))) + else: + print( + "{}\t{}\t{}".format(k, getattr(ns1, k, None), getattr(ns2, k, None)) + ) + + print("Keys unique to namespace 1:") + print_keys(k1 - k2, ns1) + print() + + print("Keys unique to namespace 2:") + print_keys(k2 - k1, ns2) + print() + + print("Overlapping keys with different values:") + ks = [k for k in k1 & k2 if getattr(ns1, k, "None") != getattr(ns2, k, "None")] + print_keys(ks, ns1, ns2) + print() + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/compound_split_bleu.sh b/SpeechT5/fairseq/scripts/compound_split_bleu.sh new file mode 100644 index 0000000..1972fdd --- /dev/null +++ b/SpeechT5/fairseq/scripts/compound_split_bleu.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +if [ $# -ne 1 ]; then + echo "usage: $0 GENERATE_PY_OUTPUT" + exit 1 +fi + +GEN=$1 + +SYS=$GEN.sys +REF=$GEN.ref + +if [ $(tail -n 1 $GEN | grep BLEU | wc -l) -ne 1 ]; then + echo "not done generating" + exit +fi + +grep ^H $GEN | awk -F '\t' '{print $NF}' | perl -ple 's{(\S)-(\S)}{$1 ##AT##-##AT## $2}g' > $SYS +grep ^T $GEN | cut -f2- | perl -ple 's{(\S)-(\S)}{$1 ##AT##-##AT## $2}g' > $REF +fairseq-score --sys $SYS --ref $REF diff --git a/SpeechT5/fairseq/scripts/constraints/extract.py b/SpeechT5/fairseq/scripts/constraints/extract.py new file mode 100644 index 0000000..f6155d0 --- /dev/null +++ b/SpeechT5/fairseq/scripts/constraints/extract.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +"""Extracts random constraints from reference files.""" + +import argparse +import random +import sys + +from sacrebleu import extract_ngrams + + +def get_phrase(words, index, length): + assert index < len(words) - length + 1 + phr = " ".join(words[index : index + length]) + for i in range(index, index + length): + words.pop(index) + return phr + + +def main(args): + + if args.seed: + random.seed(args.seed) + + for line in sys.stdin: + constraints = [] + + def add_constraint(constraint): + constraints.append(constraint) + + source = line.rstrip() + if "\t" in line: + source, target = line.split("\t") + if args.add_sos: + target = f"<s> {target}" + if args.add_eos: + target = f"{target} </s>" + + if len(target.split()) >= args.len: + words = [target] + + num = args.number + + choices = {} + for i in range(num): + if len(words) == 0: + break + segmentno = random.choice(range(len(words))) + segment = words.pop(segmentno) + tokens = segment.split() + phrase_index = random.choice(range(len(tokens))) + choice = " ".join( + tokens[phrase_index : min(len(tokens), phrase_index + args.len)] + ) + for j in range( + phrase_index, min(len(tokens), phrase_index + args.len) + ): + tokens.pop(phrase_index) + if phrase_index > 0: + words.append(" ".join(tokens[0:phrase_index])) + if phrase_index + 1 < len(tokens): + words.append(" ".join(tokens[phrase_index:])) + choices[target.find(choice)] = choice + + # mask out with spaces + target = target.replace(choice, " " * len(choice), 1) + + for key in sorted(choices.keys()): + add_constraint(choices[key]) + + print(source, *constraints, sep="\t") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--number", "-n", type=int, default=1, help="number of phrases") + parser.add_argument("--len", "-l", type=int, default=1, help="phrase length") + parser.add_argument( + "--add-sos", default=False, action="store_true", help="add <s> token" + ) + parser.add_argument( + "--add-eos", default=False, action="store_true", help="add </s> token" + ) + parser.add_argument("--seed", "-s", default=0, type=int) + args = parser.parse_args() + + main(args) diff --git a/SpeechT5/fairseq/scripts/constraints/validate.py b/SpeechT5/fairseq/scripts/constraints/validate.py new file mode 100644 index 0000000..d531ad9 --- /dev/null +++ b/SpeechT5/fairseq/scripts/constraints/validate.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys + + +"""Reads in a fairseq output file, and verifies that the constraints +(C- lines) are present in the output (the first H- line). Assumes that +constraints are listed prior to the first hypothesis. +""" + +constraints = [] +found = 0 +total = 0 +for line in sys.stdin: + if line.startswith("C-"): + constraints.append(line.rstrip().split("\t")[1]) + elif line.startswith("H-"): + text = line.split("\t")[2] + + for constraint in constraints: + total += 1 + if constraint in text: + found += 1 + else: + print(f"No {constraint} in {text}", file=sys.stderr) + + constraints = [] + +print(f"Found {found} / {total} = {100 * found / total:.1f}%") diff --git a/SpeechT5/fairseq/scripts/convert_dictionary.lua b/SpeechT5/fairseq/scripts/convert_dictionary.lua new file mode 100644 index 0000000..14ee8c9 --- /dev/null +++ b/SpeechT5/fairseq/scripts/convert_dictionary.lua @@ -0,0 +1,34 @@ +-- Copyright (c) Facebook, Inc. and its affiliates. +-- +-- This source code is licensed under the MIT license found in the +-- LICENSE file in the root directory of this source tree. +-- +-- Usage: convert_dictionary.lua <dict.th7> +require 'fairseq' +require 'torch' +require 'paths' + +if #arg < 1 then + print('usage: convert_dictionary.lua <dict.th7>') + os.exit(1) +end +if not paths.filep(arg[1]) then + print('error: file does not exit: ' .. arg[1]) + os.exit(1) +end + +dict = torch.load(arg[1]) +dst = paths.basename(arg[1]):gsub('.th7', '.txt') +assert(dst:match('.txt$')) + +f = io.open(dst, 'w') +for idx, symbol in ipairs(dict.index_to_symbol) do + if idx > dict.cutoff then + break + end + f:write(symbol) + f:write(' ') + f:write(dict.index_to_freq[idx]) + f:write('\n') +end +f:close() diff --git a/SpeechT5/fairseq/scripts/convert_model.lua b/SpeechT5/fairseq/scripts/convert_model.lua new file mode 100644 index 0000000..61b9213 --- /dev/null +++ b/SpeechT5/fairseq/scripts/convert_model.lua @@ -0,0 +1,108 @@ +-- Copyright (c) Facebook, Inc. and its affiliates. +-- +-- This source code is licensed under the MIT license found in the +-- LICENSE file in the root directory of this source tree. +-- +-- Usage: convert_model.lua <model_epoch1.th7> +require 'torch' +local fairseq = require 'fairseq' + +model = torch.load(arg[1]) + +function find_weight_norm(container, module) + for _, wn in ipairs(container:listModules()) do + if torch.type(wn) == 'nn.WeightNorm' and wn.modules[1] == module then + return wn + end + end +end + +function push_state(dict, key, module) + if torch.type(module) == 'nn.Linear' then + local wn = find_weight_norm(model.module, module) + assert(wn) + dict[key .. '.weight_v'] = wn.v:float() + dict[key .. '.weight_g'] = wn.g:float() + elseif torch.type(module) == 'nn.TemporalConvolutionTBC' then + local wn = find_weight_norm(model.module, module) + assert(wn) + local v = wn.v:float():view(wn.viewOut):transpose(2, 3) + dict[key .. '.weight_v'] = v + dict[key .. '.weight_g'] = wn.g:float():view(module.weight:size(3), 1, 1) + else + dict[key .. '.weight'] = module.weight:float() + end + if module.bias then + dict[key .. '.bias'] = module.bias:float() + end +end + +encoder_dict = {} +decoder_dict = {} +combined_dict = {} + +function encoder_state(encoder) + luts = encoder:findModules('nn.LookupTable') + push_state(encoder_dict, 'embed_tokens', luts[1]) + push_state(encoder_dict, 'embed_positions', luts[2]) + + fcs = encoder:findModules('nn.Linear') + assert(#fcs >= 2) + local nInputPlane = fcs[1].weight:size(1) + push_state(encoder_dict, 'fc1', table.remove(fcs, 1)) + push_state(encoder_dict, 'fc2', table.remove(fcs, #fcs)) + + for i, module in ipairs(encoder:findModules('nn.TemporalConvolutionTBC')) do + push_state(encoder_dict, 'convolutions.' .. tostring(i - 1), module) + if nInputPlane ~= module.weight:size(3) / 2 then + push_state(encoder_dict, 'projections.' .. tostring(i - 1), table.remove(fcs, 1)) + end + nInputPlane = module.weight:size(3) / 2 + end + assert(#fcs == 0) +end + +function decoder_state(decoder) + luts = decoder:findModules('nn.LookupTable') + push_state(decoder_dict, 'embed_tokens', luts[1]) + push_state(decoder_dict, 'embed_positions', luts[2]) + + fcs = decoder:findModules('nn.Linear') + local nInputPlane = fcs[1].weight:size(1) + push_state(decoder_dict, 'fc1', table.remove(fcs, 1)) + push_state(decoder_dict, 'fc2', fcs[#fcs - 1]) + push_state(decoder_dict, 'fc3', fcs[#fcs]) + + table.remove(fcs, #fcs) + table.remove(fcs, #fcs) + + for i, module in ipairs(decoder:findModules('nn.TemporalConvolutionTBC')) do + if nInputPlane ~= module.weight:size(3) / 2 then + push_state(decoder_dict, 'projections.' .. tostring(i - 1), table.remove(fcs, 1)) + end + nInputPlane = module.weight:size(3) / 2 + + local prefix = 'attention.' .. tostring(i - 1) + push_state(decoder_dict, prefix .. '.in_projection', table.remove(fcs, 1)) + push_state(decoder_dict, prefix .. '.out_projection', table.remove(fcs, 1)) + push_state(decoder_dict, 'convolutions.' .. tostring(i - 1), module) + end + assert(#fcs == 0) +end + + +_encoder = model.module.modules[2] +_decoder = model.module.modules[3] + +encoder_state(_encoder) +decoder_state(_decoder) + +for k, v in pairs(encoder_dict) do + combined_dict['encoder.' .. k] = v +end +for k, v in pairs(decoder_dict) do + combined_dict['decoder.' .. k] = v +end + + +torch.save('state_dict.t7', combined_dict) diff --git a/SpeechT5/fairseq/scripts/count_docs.py b/SpeechT5/fairseq/scripts/count_docs.py new file mode 100644 index 0000000..58d85af --- /dev/null +++ b/SpeechT5/fairseq/scripts/count_docs.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Count the number of documents and average number of lines and tokens per +document in a large file. Documents should be separated by a single empty line. +""" + +import argparse +import gzip +import sys + +import numpy as np + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input") + parser.add_argument("--gzip", action="store_true") + args = parser.parse_args() + + def gopen(): + if args.gzip: + return gzip.open(args.input, "r") + else: + return open(args.input, "r", encoding="utf-8") + + num_lines = [] + num_toks = [] + with gopen() as h: + num_docs = 1 + num_lines_in_doc = 0 + num_toks_in_doc = 0 + for i, line in enumerate(h): + if len(line.strip()) == 0: # empty line indicates new document + num_docs += 1 + num_lines.append(num_lines_in_doc) + num_toks.append(num_toks_in_doc) + num_lines_in_doc = 0 + num_toks_in_doc = 0 + else: + num_lines_in_doc += 1 + num_toks_in_doc += len(line.rstrip().split()) + if i % 1000000 == 0: + print(i, file=sys.stderr, end="", flush=True) + elif i % 100000 == 0: + print(".", file=sys.stderr, end="", flush=True) + print(file=sys.stderr, flush=True) + + print("found {} docs".format(num_docs)) + print("average num lines per doc: {}".format(np.mean(num_lines))) + print("average num toks per doc: {}".format(np.mean(num_toks))) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/read_binarized.py b/SpeechT5/fairseq/scripts/read_binarized.py new file mode 100644 index 0000000..a414095 --- /dev/null +++ b/SpeechT5/fairseq/scripts/read_binarized.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse + +from fairseq.data import Dictionary, data_utils, indexed_dataset + + +def get_parser(): + parser = argparse.ArgumentParser( + description="writes text from binarized file to stdout" + ) + # fmt: off + parser.add_argument('--dataset-impl', help='dataset implementation', + choices=indexed_dataset.get_available_dataset_impl()) + parser.add_argument('--dict', metavar='FP', help='dictionary containing known words', default=None) + parser.add_argument('--input', metavar='FP', required=True, help='binarized file to read') + # fmt: on + + return parser + + +def main(): + parser = get_parser() + args = parser.parse_args() + + dictionary = Dictionary.load(args.dict) if args.dict is not None else None + dataset = data_utils.load_indexed_dataset( + args.input, + dictionary, + dataset_impl=args.dataset_impl, + default="lazy", + ) + + for tensor_line in dataset: + if dictionary is None: + line = " ".join([str(int(x)) for x in tensor_line]) + else: + line = dictionary.string(tensor_line) + + print(line) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/rm_pt.py b/SpeechT5/fairseq/scripts/rm_pt.py new file mode 100644 index 0000000..6cd063d --- /dev/null +++ b/SpeechT5/fairseq/scripts/rm_pt.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import os +import re +import shutil +import sys + + +pt_regexp = re.compile(r"checkpoint(\d+|_\d+_\d+|_[a-z]+)\.pt") +pt_regexp_epoch_based = re.compile(r"checkpoint(\d+)\.pt") +pt_regexp_update_based = re.compile(r"checkpoint_\d+_(\d+)\.pt") + + +def parse_checkpoints(files): + entries = [] + for f in files: + m = pt_regexp_epoch_based.fullmatch(f) + if m is not None: + entries.append((int(m.group(1)), m.group(0))) + else: + m = pt_regexp_update_based.fullmatch(f) + if m is not None: + entries.append((int(m.group(1)), m.group(0))) + return entries + + +def last_n_checkpoints(files, n): + entries = parse_checkpoints(files) + return [x[1] for x in sorted(entries, reverse=True)[:n]] + + +def every_n_checkpoints(files, n): + entries = parse_checkpoints(files) + return [x[1] for x in sorted(sorted(entries)[::-n])] + + +def main(): + parser = argparse.ArgumentParser( + description=( + "Recursively delete checkpoint files from `root_dir`, " + "but preserve checkpoint_best.pt and checkpoint_last.pt" + ) + ) + parser.add_argument("root_dirs", nargs="*") + parser.add_argument( + "--save-last", type=int, default=0, help="number of last checkpoints to save" + ) + parser.add_argument( + "--save-every", type=int, default=0, help="interval of checkpoints to save" + ) + parser.add_argument( + "--preserve-test", + action="store_true", + help="preserve checkpoints in dirs that start with test_ prefix (default: delete them)", + ) + parser.add_argument( + "--delete-best", action="store_true", help="delete checkpoint_best.pt" + ) + parser.add_argument( + "--delete-last", action="store_true", help="delete checkpoint_last.pt" + ) + parser.add_argument( + "--no-dereference", action="store_true", help="don't dereference symlinks" + ) + args = parser.parse_args() + + files_to_desymlink = [] + files_to_preserve = [] + files_to_delete = [] + for root_dir in args.root_dirs: + for root, _subdirs, files in os.walk(root_dir): + if args.save_last > 0: + to_save = last_n_checkpoints(files, args.save_last) + else: + to_save = [] + if args.save_every > 0: + to_save += every_n_checkpoints(files, args.save_every) + for file in files: + if not pt_regexp.fullmatch(file): + continue + full_path = os.path.join(root, file) + if ( + not os.path.basename(root).startswith("test_") or args.preserve_test + ) and ( + (file == "checkpoint_last.pt" and not args.delete_last) + or (file == "checkpoint_best.pt" and not args.delete_best) + or file in to_save + ): + if os.path.islink(full_path) and not args.no_dereference: + files_to_desymlink.append(full_path) + else: + files_to_preserve.append(full_path) + else: + files_to_delete.append(full_path) + + if len(files_to_desymlink) == 0 and len(files_to_delete) == 0: + print("Nothing to do.") + sys.exit(0) + + files_to_desymlink = sorted(files_to_desymlink) + files_to_preserve = sorted(files_to_preserve) + files_to_delete = sorted(files_to_delete) + + print("Operations to perform (in order):") + if len(files_to_desymlink) > 0: + for file in files_to_desymlink: + print(" - preserve (and dereference symlink): " + file) + if len(files_to_preserve) > 0: + for file in files_to_preserve: + print(" - preserve: " + file) + if len(files_to_delete) > 0: + for file in files_to_delete: + print(" - delete: " + file) + while True: + resp = input("Continue? (Y/N): ") + if resp.strip().lower() == "y": + break + elif resp.strip().lower() == "n": + sys.exit(0) + + print("Executing...") + if len(files_to_desymlink) > 0: + for file in files_to_desymlink: + realpath = os.path.realpath(file) + print("rm " + file) + os.remove(file) + print("cp {} {}".format(realpath, file)) + shutil.copyfile(realpath, file) + if len(files_to_delete) > 0: + for file in files_to_delete: + print("rm " + file) + os.remove(file) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/sacrebleu.sh b/SpeechT5/fairseq/scripts/sacrebleu.sh new file mode 100644 index 0000000..c10bf2b --- /dev/null +++ b/SpeechT5/fairseq/scripts/sacrebleu.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +if [ $# -ne 4 ]; then + echo "usage: $0 TESTSET SRCLANG TGTLANG GEN" + exit 1 +fi + +TESTSET=$1 +SRCLANG=$2 +TGTLANG=$3 + +GEN=$4 + +if ! command -v sacremoses &> /dev/null +then + echo "sacremoses could not be found, please install with: pip install sacremoses" + exit +fi + +grep ^H $GEN \ +| sed 's/^H\-//' \ +| sort -n -k 1 \ +| cut -f 3 \ +| sacremoses detokenize \ +> $GEN.sorted.detok + +sacrebleu --test-set $TESTSET --language-pair "${SRCLANG}-${TGTLANG}" < $GEN.sorted.detok diff --git a/SpeechT5/fairseq/scripts/shard_docs.py b/SpeechT5/fairseq/scripts/shard_docs.py new file mode 100644 index 0000000..97232c3 --- /dev/null +++ b/SpeechT5/fairseq/scripts/shard_docs.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Split a large file into shards while respecting document boundaries. Documents +should be separated by a single empty line. +""" + +import argparse +import contextlib + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input") + parser.add_argument("--num-shards", type=int) + args = parser.parse_args() + + assert args.num_shards is not None and args.num_shards > 1 + + with open(args.input, "r", encoding="utf-8") as h: + with contextlib.ExitStack() as stack: + outputs = [ + stack.enter_context( + open(args.input + ".shard" + str(i), "w", encoding="utf-8") + ) + for i in range(args.num_shards) + ] + + doc = [] + first_doc = [True] * args.num_shards + + def output_doc(i): + if not first_doc[i]: + outputs[i].write("\n") + first_doc[i] = False + for line in doc: + outputs[i].write(line) + doc.clear() + + num_docs = 0 + for line in h: + if line.strip() == "": # empty line indicates new document + output_doc(num_docs % args.num_shards) + num_docs += 1 + else: + doc.append(line) + output_doc(num_docs % args.num_shards) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/split_train_valid_docs.py b/SpeechT5/fairseq/scripts/split_train_valid_docs.py new file mode 100644 index 0000000..ff15978 --- /dev/null +++ b/SpeechT5/fairseq/scripts/split_train_valid_docs.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Split a large file into a train and valid set while respecting document +boundaries. Documents should be separated by a single empty line. +""" + +import argparse +import random +import sys + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input") + parser.add_argument("sample_output", help="train output file") + parser.add_argument("remainder_output", help="valid output file") + parser.add_argument("-k", type=int, help="remainder size") + parser.add_argument( + "--lines", action="store_true", help="split lines instead of docs" + ) + args = parser.parse_args() + + assert args.k is not None + + sample = [] + remainder = [] + num_docs = [0] + + def update_sample(doc): + if len(sample) < args.k: + sample.append(doc.copy()) + else: + i = num_docs[0] + j = random.randrange(i + 1) + if j < args.k: + remainder.append(sample[j]) + sample[j] = doc.copy() + else: + remainder.append(doc.copy()) + num_docs[0] += 1 + doc.clear() + + with open(args.input, "r", encoding="utf-8") as h: + doc = [] + for i, line in enumerate(h): + if line.strip() == "": # empty line indicates new document + update_sample(doc) + else: + doc.append(line) + if args.lines: + update_sample(doc) + if i % 1000000 == 0: + print(i, file=sys.stderr, end="", flush=True) + elif i % 100000 == 0: + print(".", file=sys.stderr, end="", flush=True) + if len(doc) > 0: + update_sample(doc) + print(file=sys.stderr, flush=True) + + assert len(sample) == args.k + + with open(args.sample_output, "w", encoding="utf-8") as out: + first = True + for doc in sample: + if not first and not args.lines: + out.write("\n") + first = False + for line in doc: + out.write(line) + + with open(args.remainder_output, "w", encoding="utf-8") as out: + first = True + for doc in remainder: + if not first and not args.lines: + out.write("\n") + first = False + for line in doc: + out.write(line) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/spm_decode.py b/SpeechT5/fairseq/scripts/spm_decode.py new file mode 100644 index 0000000..1c18b1d --- /dev/null +++ b/SpeechT5/fairseq/scripts/spm_decode.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import argparse + +import sentencepiece as spm + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--model", required=True, help="sentencepiece model to use for decoding" + ) + parser.add_argument("--input", required=True, help="input file to decode") + parser.add_argument("--input_format", choices=["piece", "id"], default="piece") + args = parser.parse_args() + + sp = spm.SentencePieceProcessor() + sp.Load(args.model) + + if args.input_format == "piece": + + def decode(l): + return "".join(sp.DecodePieces(l)) + + elif args.input_format == "id": + + def decode(l): + return "".join(sp.DecodeIds(l)) + + else: + raise NotImplementedError + + def tok2int(tok): + # remap reference-side <unk> (represented as <<unk>>) to 0 + return int(tok) if tok != "<<unk>>" else 0 + + with open(args.input, "r", encoding="utf-8") as h: + for line in h: + if args.input_format == "id": + print(decode(list(map(tok2int, line.rstrip().split())))) + elif args.input_format == "piece": + print(decode(line.rstrip().split())) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/spm_encode.py b/SpeechT5/fairseq/scripts/spm_encode.py new file mode 100644 index 0000000..83facfb --- /dev/null +++ b/SpeechT5/fairseq/scripts/spm_encode.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import argparse +import contextlib +import sys + +import sentencepiece as spm + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--model", required=True, help="sentencepiece model to use for encoding" + ) + parser.add_argument( + "--inputs", nargs="+", default=["-"], help="input files to filter/encode" + ) + parser.add_argument( + "--outputs", nargs="+", default=["-"], help="path to save encoded outputs" + ) + parser.add_argument("--output_format", choices=["piece", "id"], default="piece") + parser.add_argument( + "--min-len", + type=int, + metavar="N", + help="filter sentence pairs with fewer than N tokens", + ) + parser.add_argument( + "--max-len", + type=int, + metavar="N", + help="filter sentence pairs with more than N tokens", + ) + args = parser.parse_args() + + assert len(args.inputs) == len( + args.outputs + ), "number of input and output paths should match" + + sp = spm.SentencePieceProcessor() + sp.Load(args.model) + + if args.output_format == "piece": + + def encode(l): + return sp.EncodeAsPieces(l) + + elif args.output_format == "id": + + def encode(l): + return list(map(str, sp.EncodeAsIds(l))) + + else: + raise NotImplementedError + + if args.min_len is not None or args.max_len is not None: + + def valid(line): + return (args.min_len is None or len(line) >= args.min_len) and ( + args.max_len is None or len(line) <= args.max_len + ) + + else: + + def valid(lines): + return True + + with contextlib.ExitStack() as stack: + inputs = [ + stack.enter_context(open(input, "r", encoding="utf-8")) + if input != "-" + else sys.stdin + for input in args.inputs + ] + outputs = [ + stack.enter_context(open(output, "w", encoding="utf-8")) + if output != "-" + else sys.stdout + for output in args.outputs + ] + + stats = { + "num_empty": 0, + "num_filtered": 0, + } + + def encode_line(line): + line = line.strip() + if len(line) > 0: + line = encode(line) + if valid(line): + return line + else: + stats["num_filtered"] += 1 + else: + stats["num_empty"] += 1 + return None + + for i, lines in enumerate(zip(*inputs), start=1): + enc_lines = list(map(encode_line, lines)) + if not any(enc_line is None for enc_line in enc_lines): + for enc_line, output_h in zip(enc_lines, outputs): + print(" ".join(enc_line), file=output_h) + if i % 10000 == 0: + print("processed {} lines".format(i), file=sys.stderr) + + print("skipped {} empty lines".format(stats["num_empty"]), file=sys.stderr) + print("filtered {} lines".format(stats["num_filtered"]), file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/SpeechT5/fairseq/scripts/spm_train.py b/SpeechT5/fairseq/scripts/spm_train.py new file mode 100644 index 0000000..9db668f --- /dev/null +++ b/SpeechT5/fairseq/scripts/spm_train.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +from __future__ import absolute_import, division, print_function, unicode_literals + +import sys + +import sentencepiece as spm + + +if __name__ == "__main__": + spm.SentencePieceTrainer.Train(" ".join(sys.argv[1:])) diff --git a/SpeechT5/fairseq/scripts/test_fsdp.sh b/SpeechT5/fairseq/scripts/test_fsdp.sh new file mode 100644 index 0000000..1f428a0 --- /dev/null +++ b/SpeechT5/fairseq/scripts/test_fsdp.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +rm -rf fsdp_dummy +mkdir -p fsdp_dummy +CUDA_VISIBLE_DEVICES=0,1,2,3 fairseq-train /private/home/sshleifer/data-bin/stories_mmap \ + --ddp-backend fully_sharded --fp16 --fp16-init-scale 4 \ + --cpu-offload --checkpoint-activations \ + --task language_modeling --tokens-per-sample 256 --batch-size 8 \ + --arch transformer_lm_gpt2_tiny \ + --optimizer cpu_adam --adam-betas "(0.9,0.98)" \ + --lr 0.0001 --lr-scheduler polynomial_decay --warmup-updates 5 --total-num-update 10 \ + --max-update 5 --log-format json --log-interval 1 \ + --save-interval-updates 5 --save-dir fsdp_dummy --disable-validation \ + --restore-file x.pt "$@" + +# Now we try to load the checkpoint +CUDA_VISIBLE_DEVICES=0,1 fairseq-train /private/home/sshleifer/data-bin/stories_mmap \ + --ddp-backend fully_sharded --fp16 --fp16-init-scale 4 \ + --cpu-offload --checkpoint-activations \ + --task language_modeling --tokens-per-sample 256 --batch-size 8 \ + --arch transformer_lm_gpt2_tiny \ + --optimizer cpu_adam --adam-betas "(0.9,0.98)" \ + --lr 0.0001 --lr-scheduler polynomial_decay --warmup-updates 5 --total-num-update 10 \ + --max-update 2 --log-format json --log-interval 1 \ + --save-interval-updates 2 --save-dir fsdp_dummy diff --git a/SpeechT5/fairseq/setup.py b/SpeechT5/fairseq/setup.py new file mode 100644 index 0000000..51e5552 --- /dev/null +++ b/SpeechT5/fairseq/setup.py @@ -0,0 +1,271 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +import subprocess +import sys +from setuptools import setup, find_packages, Extension + +from setuptools import Extension, find_packages, setup + + +if sys.version_info < (3, 6): + sys.exit("Sorry, Python >= 3.6 is required for fairseq.") + + +def write_version_py(): + with open(os.path.join("fairseq", "version.txt")) as f: + version = f.read().strip() + + # append latest commit hash to version string + try: + sha = ( + subprocess.check_output(["git", "rev-parse", "HEAD"]) + .decode("ascii") + .strip() + ) + version += "+" + sha[:7] + except Exception: + pass + + # write version info to fairseq/version.py + with open(os.path.join("fairseq", "version.py"), "w") as f: + f.write('__version__ = "{}"\n'.format(version)) + return version + + +version = write_version_py() + + +with open("README.md") as f: + readme = f.read() + + +if sys.platform == "darwin": + extra_compile_args = ["-stdlib=libc++", "-O3"] +else: + extra_compile_args = ["-std=c++11", "-O3"] + + +class NumpyExtension(Extension): + """Source: https://stackoverflow.com/a/54128391""" + + def __init__(self, *args, **kwargs): + self.__include_dirs = [] + super().__init__(*args, **kwargs) + + @property + def include_dirs(self): + import numpy + + return self.__include_dirs + [numpy.get_include()] + + @include_dirs.setter + def include_dirs(self, dirs): + self.__include_dirs = dirs + + +extensions = [ + Extension( + "fairseq.libbleu", + sources=[ + "fairseq/clib/libbleu/libbleu.cpp", + "fairseq/clib/libbleu/module.cpp", + ], + extra_compile_args=extra_compile_args, + ), + NumpyExtension( + "fairseq.data.data_utils_fast", + sources=["fairseq/data/data_utils_fast.pyx"], + language="c++", + extra_compile_args=extra_compile_args, + ), + NumpyExtension( + "fairseq.data.token_block_utils_fast", + sources=["fairseq/data/token_block_utils_fast.pyx"], + language="c++", + extra_compile_args=extra_compile_args, + ), +] + + +cmdclass = {} + + +try: + # torch is not available when generating docs + from torch.utils import cpp_extension + + extensions.extend( + [ + cpp_extension.CppExtension( + "fairseq.libbase", + sources=[ + "fairseq/clib/libbase/balanced_assignment.cpp", + ], + ) + ] + ) + + extensions.extend( + [ + cpp_extension.CppExtension( + "fairseq.libnat", + sources=[ + "fairseq/clib/libnat/edit_dist.cpp", + ], + ) + ] + ) + if "CUDA_HOME" in os.environ: + extensions.extend( + [ + cpp_extension.CppExtension( + "fairseq.libnat_cuda", + sources=[ + "fairseq/clib/libnat_cuda/edit_dist.cu", + "fairseq/clib/libnat_cuda/binding.cpp", + ], + ), + cpp_extension.CppExtension( + "fairseq.ngram_repeat_block_cuda", + sources=[ + "fairseq/clib/cuda/ngram_repeat_block_cuda.cpp", + "fairseq/clib/cuda/ngram_repeat_block_cuda_kernel.cu", + ], + ), + ] + ) + cmdclass["build_ext"] = cpp_extension.BuildExtension + +except ImportError: + pass + + +if "READTHEDOCS" in os.environ: + # don't build extensions when generating docs + extensions = [] + if "build_ext" in cmdclass: + del cmdclass["build_ext"] + + # use CPU build of PyTorch + dependency_links = [ + "https://download.pytorch.org/whl/cpu/torch-1.7.0%2Bcpu-cp36-cp36m-linux_x86_64.whl" + ] +else: + dependency_links = [] + + +if "clean" in sys.argv[1:]: + # Source: https://bit.ly/2NLVsgE + print("deleting Cython files...") + import subprocess + + subprocess.run( + ["rm -f fairseq/*.so fairseq/**/*.so fairseq/*.pyd fairseq/**/*.pyd"], + shell=True, + ) + + +extra_packages = [] +if os.path.exists(os.path.join("fairseq", "model_parallel", "megatron", "mpu")): + extra_packages.append("fairseq.model_parallel.megatron.mpu") + + +def do_setup(package_data): + setup( + name="fairseq", + version=version, + description="Facebook AI Research Sequence-to-Sequence Toolkit", + url="https://github.com/pytorch/fairseq", + classifiers=[ + "Intended Audience :: Science/Research", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + ], + long_description=readme, + long_description_content_type="text/markdown", + setup_requires=[ + "cython", + 'numpy<1.20.0; python_version<"3.7"', + 'numpy; python_version>="3.7"', + "setuptools>=18.0", + ], + install_requires=[ + "cffi", + "cython", + 'dataclasses; python_version<"3.7"', + "hydra-core<1.1", + "omegaconf<2.1", + 'numpy<1.20.0; python_version<"3.7"', + 'numpy; python_version>="3.7"', + "regex", + "sacrebleu>=1.4.12", + "torch", + "tqdm", + ], + dependency_links=dependency_links, + packages=find_packages( + exclude=[ + "examples", + "examples.*", + "scripts", + "scripts.*", + "tests", + "tests.*", + ] + ) + + extra_packages, + package_data=package_data, + ext_modules=extensions, + test_suite="tests", + entry_points={ + "console_scripts": [ + "fairseq-eval-lm = fairseq_cli.eval_lm:cli_main", + "fairseq-generate = fairseq_cli.generate:cli_main", + "fairseq-hydra-train = fairseq_cli.hydra_train:cli_main", + "fairseq-interactive = fairseq_cli.interactive:cli_main", + "fairseq-preprocess = fairseq_cli.preprocess:cli_main", + "fairseq-score = fairseq_cli.score:cli_main", + "fairseq-train = fairseq_cli.train:cli_main", + "fairseq-validate = fairseq_cli.validate:cli_main", + ], + }, + cmdclass=cmdclass, + zip_safe=False, + ) + + +def get_files(path, relative_to="fairseq"): + all_files = [] + for root, _dirs, files in os.walk(path, followlinks=True): + root = os.path.relpath(root, relative_to) + for file in files: + if file.endswith(".pyc"): + continue + all_files.append(os.path.join(root, file)) + return all_files + + +if __name__ == "__main__": + try: + # symlink examples into fairseq package so package_data accepts them + fairseq_examples = os.path.join("fairseq", "examples") + if "build_ext" not in sys.argv[1:] and not os.path.exists(fairseq_examples): + os.symlink(os.path.join("..", "examples"), fairseq_examples) + + package_data = { + "fairseq": ( + get_files(fairseq_examples) + get_files(os.path.join("fairseq", "config")) + ) + } + do_setup(package_data) + finally: + if "build_ext" not in sys.argv[1:] and os.path.islink(fairseq_examples): + os.unlink(fairseq_examples) diff --git a/SpeechT5/fairseq/tests/__init__.py b/SpeechT5/fairseq/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/tests/distributed/__init__.py b/SpeechT5/fairseq/tests/distributed/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/tests/distributed/test_bmuf.py b/SpeechT5/fairseq/tests/distributed/test_bmuf.py new file mode 100644 index 0000000..8b7cadb --- /dev/null +++ b/SpeechT5/fairseq/tests/distributed/test_bmuf.py @@ -0,0 +1,207 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import functools +import random +import unittest +from multiprocessing import Manager + +import torch +import torch.nn as nn +from fairseq import optim +from fairseq.distributed import utils as distributed_utils +from omegaconf import OmegaConf + + +class Model(nn.Module): + def __init__(self, input_size, output_size): + super(Model, self).__init__() + self.fc = nn.Linear(input_size, output_size) + + def forward(self, input): + output = self.fc(input) + return output + + +def setup_model_loss_criterion(cfg, args, rank, is_cuda): + """ + setup model, criterion and optimizer based on input args + """ + args.distributed_rank = rank + cfg.distributed_training.distributed_rank = args.distributed_rank + if cfg.distributed_training.distributed_world_size > 1: + distributed_utils.distributed_init(cfg) + torch.manual_seed(1) + model = Model(args.input_size, args.nb_classes) + loss_fn = nn.CrossEntropyLoss() + if is_cuda: + model = model.cuda() + loss_fn = loss_fn.cuda() + + optimizer = optim.sgd.SGD(args, model.parameters()) + optimizer = optim.FairseqBMUF( + cfg=cfg.bmuf, + optimizer=optimizer + ) + + return model, loss_fn, optimizer + + +def train_step(input, target, model, loss_fn, optimizer, **unused): + """Do forward, backward and parameter update.""" + model.train() + output = model(input) + loss = loss_fn(output, target) + optimizer.backward(loss) + optimizer.step() + + +def single_gpu_training(cfg, args, rank, iterations, shared_results): + + is_cuda = torch.cuda.is_available() + if is_cuda: + torch.cuda.set_device(rank) + + model, loss_fn, optimizer = setup_model_loss_criterion(cfg, args, rank, is_cuda) + + for _ in range(iterations): + input = torch.randn(1, args.input_size) + target = torch.empty(args.batch_size, dtype=torch.long).random_(args.nb_classes) + + if is_cuda: + input = input.cuda() + target = target.cuda() + train_step(input, target, model, loss_fn, optimizer) + + results = [] + for param in model.parameters(): + if len(results) == 0: + results = param.flatten().cpu().data + else: + results = torch.cat((results, param.flatten().cpu().data), 0) + + shared_results[rank] = results + + +def setup_args(): + args = argparse.Namespace() + args.global_sync_iter = 20 + args.block_momentum = 0.875 + args.block_lr = 0.5 + args.input_size = 5 + args.nb_classes = 2 + args.batch_size = 1 + args.lr = [1e-3] + args.momentum = 0 + args.weight_decay = 0 + args.warmup_iterations = 0 + args.use_nbm = True + args.average_sync = True + args.global_sync_iter = 1 + args.model_parallel_size = 1 + args.distributed_backend = "gloo" + + args.distributed_world_size = 2 + port = random.randint(10000, 20000) + args.distributed_init_method = "tcp://localhost:{port}".format(port=port) + args.distributed_init_host = "localhost" + args.distributed_port = port + 1 + args.local_world_size = args.distributed_world_size + + cfg = OmegaConf.create() + cfg.optimization = OmegaConf.create() + cfg.common = OmegaConf.create() + cfg.distributed_training = OmegaConf.create() + cfg.dataset = OmegaConf.create() + cfg.bmuf = OmegaConf.create() + cfg.optimizer = OmegaConf.create() + + cfg.bmuf.global_sync_iter = args.global_sync_iter + cfg.bmuf.block_momentum = args.block_momentum + cfg.bmuf.block_lr = args.block_lr + cfg.dataset.batch_size = args.batch_size + cfg.optimization.lr = args.lr + cfg.optimizer.momentum = args.momentum + cfg.optimizer.weight_decay = args.weight_decay + cfg.bmuf.warmup_iterations = args.warmup_iterations + cfg.bmuf.use_nbm = args.use_nbm + cfg.bmuf.average_sync = args.average_sync + cfg.common.model_parallel_size = args.model_parallel_size + cfg.distributed_training.distributed_backend = args.distributed_backend + cfg.distributed_training.distributed_world_size = args.distributed_world_size + cfg.bmuf.distributed_world_size = args.distributed_world_size + cfg.distributed_training.distributed_init_method = args.distributed_init_method + cfg.distributed_training.distributed_port = args.distributed_port + + return cfg, args + + +@unittest.skipIf(torch.cuda.device_count() < 2, "test requires 2 GPUs") +class TestBMUF(unittest.TestCase): + def bmuf_process(self, cfg, args, iterations): + processes = [] + results = Manager().dict() + torch.multiprocessing.spawn( + fn=functools.partial(single_gpu_training, cfg, args), + args=(iterations, results), + nprocs=args.distributed_world_size, + join=True, + ) + return results + + def test_bmuf_sync(self): + # Train model for 1 iteration and do bmuf sync without doing warmup + cfg, args = setup_args() + iterations = 1 + results = self.bmuf_process(cfg, args, iterations) + # Make sure params in both machines are same + assert len(results) == 2 + self.assertAlmostEqual(results[0], results[1]) + + def test_warmup_sync(self): + # Train model for 20 iteration and do warmup sync without doing bmuf sync + cfg, args = setup_args() + args.warmup_iterations = 20 + cfg.bmuf.warmup_iterations = args.warmup_iterations + iterations = 20 + results = self.bmuf_process(cfg, args, iterations) + # Make sure params in both machines are same + assert len(results) == 2 + self.assertAlmostEqual(results[0], results[1]) + + def test_warmup_sync_bmuf_sync(self): + # Train model for 25 iteration and do warmup sync after 20 iteration + # and bmuf sync after 25 iteration + cfg, args = setup_args() + args.warmup_iterations = 20 + args.global_sync_iter = 5 + cfg.bmuf.warmup_iterations = args.warmup_iterations + cfg.bmuf.global_sync_iter = args.global_sync_iter + iterations = 25 + results = self.bmuf_process(cfg, args, iterations) + # Make sure params in both machines are same + assert len(results) == 2 + self.assertAlmostEqual(results[0], results[1]) + + def test_single_gpu_bmuf(self): + # Train model for 5 iterations and use GPU 1 + cfg, args = setup_args() + args.distributed_world_size = 1 + args.warmup_iterations = 5 + cfg.distributed_training.distributed_world_size = args.distributed_world_size + cfg.bmuf.distributed_world_size = args.distributed_world_size + cfg.bmuf.warmup_iterations = args.warmup_iterations + iterations = 20 + results = self.bmuf_process(cfg, args, iterations) + assert len(results) == 1 + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess((t1 - t2).abs().max(), 1e-4) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/distributed/test_distributed_timeout_wrapper.py b/SpeechT5/fairseq/tests/distributed/test_distributed_timeout_wrapper.py new file mode 100644 index 0000000..27908b9 --- /dev/null +++ b/SpeechT5/fairseq/tests/distributed/test_distributed_timeout_wrapper.py @@ -0,0 +1,54 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import signal +import time +import unittest + +import torch +from torch import nn + +from fairseq.distributed import DistributedTimeoutWrapper + + +class ModuleWithDelay(nn.Module): + + def __init__(self, delay): + super().__init__() + self.delay = delay + + def forward(self, x): + time.sleep(self.delay) + return x + + +class TestDistributedTimeoutWrapper(unittest.TestCase): + + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_no_timeout(self): + module = DistributedTimeoutWrapper(ModuleWithDelay(1), 0, signal.SIGINT) + module(torch.rand(5)) + module.stop_timeout() + + def test_timeout_safe(self): + module = DistributedTimeoutWrapper(ModuleWithDelay(1), 10, signal.SIGINT) + module(torch.rand(5)) + module.stop_timeout() + + def test_timeout_killed(self): + with self.assertRaises(KeyboardInterrupt): + module = DistributedTimeoutWrapper(ModuleWithDelay(5), 1, signal.SIGINT) + module(torch.rand(5)) + module.stop_timeout() + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/distributed/test_module_proxy_wrapper.py b/SpeechT5/fairseq/tests/distributed/test_module_proxy_wrapper.py new file mode 100644 index 0000000..2803a04 --- /dev/null +++ b/SpeechT5/fairseq/tests/distributed/test_module_proxy_wrapper.py @@ -0,0 +1,75 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +from torch import nn + +from fairseq.distributed import ModuleProxyWrapper + +from .utils import objects_are_equal + + +class MockDDPWrapper(nn.Module): + """A simple wrapper with an interface similar to DistributedDataParallel.""" + + def __init__(self, module): + super().__init__() + self.module = module + + def forward(self, x): + return self.module(x) + + +class Model(nn.Module): + def __init__(self): + super().__init__() + self.linear = nn.Linear(5, 10) + self.xyz = "hello" + + def forward(self, x): + return self.linear(x) + + def get_xyz(self): + return self.xyz + + +class TestModuleProxyWrapper(unittest.TestCase): + + def _get_module(self): + module = Model() + wrapped_module = MockDDPWrapper(module) + wrapped_module = ModuleProxyWrapper(wrapped_module) + return wrapped_module, module + + def test_getattr_forwarding(self): + wrapped_module, module = self._get_module() + assert module.xyz == "hello" + assert module.get_xyz() == "hello" + assert wrapped_module.xyz == "hello" + + wrapped_module.xyz = "world" + assert wrapped_module.xyz == "world" + assert module.get_xyz() == "hello" + + def test_state_dict(self): + wrapped_module, module = self._get_module() + assert objects_are_equal(wrapped_module.state_dict(), module.state_dict()) + + def test_load_state_dict(self): + wrapped_module, module = self._get_module() + wrapped_module.load_state_dict(module.state_dict()) + input = torch.rand(4, 5) + torch.testing.assert_allclose(wrapped_module(input), module(input)) + + def test_forward(self): + wrapped_module, module = self._get_module() + input = torch.rand(4, 5) + torch.testing.assert_allclose(wrapped_module(input), module(input)) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/distributed/test_utils.py b/SpeechT5/fairseq/tests/distributed/test_utils.py new file mode 100644 index 0000000..30f995b --- /dev/null +++ b/SpeechT5/fairseq/tests/distributed/test_utils.py @@ -0,0 +1,124 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import functools +import sys +import unittest + +import torch + +from fairseq.distributed import utils as dist_utils + +from .utils import objects_are_equal, spawn_and_init + + +class DistributedTest(unittest.TestCase): + def setUp(self): + if not torch.cuda.is_available(): + raise unittest.SkipTest("CUDA not available, skipping test") + if sys.platform == "win32": + raise unittest.SkipTest("NCCL doesn't support Windows, skipping test") + if torch.cuda.device_count() < 2: + raise unittest.SkipTest("distributed tests require 2+ GPUs, skipping") + + +class TestBroadcastObject(DistributedTest): + def test_str(self): + spawn_and_init( + functools.partial( + TestBroadcastObject._test_broadcast_object, "hello world" + ), + world_size=2, + ) + + def test_tensor(self): + spawn_and_init( + functools.partial( + TestBroadcastObject._test_broadcast_object, + torch.rand(5), + ), + world_size=2, + ) + + def test_complex(self): + spawn_and_init( + functools.partial( + TestBroadcastObject._test_broadcast_object, + { + "a": "1", + "b": [2, torch.rand(2, 3), 3], + "c": (torch.rand(2, 3), 4), + "d": {5, torch.rand(5)}, + "e": torch.rand(5), + "f": torch.rand(5).int().cuda(), + }, + ), + world_size=2, + ) + + @staticmethod + def _test_broadcast_object(ref_obj, rank, group): + obj = dist_utils.broadcast_object( + ref_obj if rank == 0 else None, src_rank=0, group=group + ) + assert objects_are_equal(ref_obj, obj) + + +class TestAllGatherList(DistributedTest): + def test_str_equality(self): + spawn_and_init( + functools.partial( + TestAllGatherList._test_all_gather_list_equality, + "hello world", + ), + world_size=2, + ) + + def test_tensor_equality(self): + spawn_and_init( + functools.partial( + TestAllGatherList._test_all_gather_list_equality, + torch.rand(5), + ), + world_size=2, + ) + + def test_complex_equality(self): + spawn_and_init( + functools.partial( + TestAllGatherList._test_all_gather_list_equality, + { + "a": "1", + "b": [2, torch.rand(2, 3), 3], + "c": (torch.rand(2, 3), 4), + "d": {5, torch.rand(5)}, + "e": torch.rand(5), + "f": torch.rand(5).int(), + }, + ), + world_size=2, + ) + + @staticmethod + def _test_all_gather_list_equality(ref_obj, rank, group): + objs = dist_utils.all_gather_list(ref_obj, group) + for obj in objs: + assert objects_are_equal(ref_obj, obj) + + def test_rank_tensor(self): + spawn_and_init( + TestAllGatherList._test_all_gather_list_rank_tensor, world_size=2 + ) + + @staticmethod + def _test_all_gather_list_rank_tensor(rank, group): + obj = torch.tensor([rank]) + objs = dist_utils.all_gather_list(obj, group) + for i, obj in enumerate(objs): + assert obj.item() == i + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/distributed/utils.py b/SpeechT5/fairseq/tests/distributed/utils.py new file mode 100644 index 0000000..c804039 --- /dev/null +++ b/SpeechT5/fairseq/tests/distributed/utils.py @@ -0,0 +1,62 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import functools +import tempfile + +import torch + + +def spawn_and_init(fn, world_size, args=None): + if args is None: + args = () + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + torch.multiprocessing.spawn( + fn=functools.partial(init_and_run, fn, args), + args=(world_size, tmp_file.name,), + nprocs=world_size, + join=True, + ) + + +def distributed_init(rank, world_size, tmp_file): + torch.distributed.init_process_group( + backend="nccl", + init_method="file://{}".format(tmp_file), + world_size=world_size, + rank=rank, + ) + torch.cuda.set_device(rank) + + +def init_and_run(fn, args, rank, world_size, tmp_file): + distributed_init(rank, world_size, tmp_file) + group = torch.distributed.new_group() + fn(rank, group, *args) + + +def objects_are_equal(a, b) -> bool: + if type(a) is not type(b): + return False + if isinstance(a, dict): + if set(a.keys()) != set(b.keys()): + return False + for k in a.keys(): + if not objects_are_equal(a[k], b[k]): + return False + return True + elif isinstance(a, (list, tuple, set)): + if len(a) != len(b): + return False + return all(objects_are_equal(x, y) for x, y in zip(a, b)) + elif torch.is_tensor(a): + return ( + a.size() == b.size() + and a.dtype == b.dtype + and a.device == b.device + and torch.all(a == b) + ) + else: + return a == b diff --git a/SpeechT5/fairseq/tests/gpu/__init__.py b/SpeechT5/fairseq/tests/gpu/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/tests/gpu/test_binaries_gpu.py b/SpeechT5/fairseq/tests/gpu/test_binaries_gpu.py new file mode 100644 index 0000000..de8c242 --- /dev/null +++ b/SpeechT5/fairseq/tests/gpu/test_binaries_gpu.py @@ -0,0 +1,449 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +import logging +import json +import os +import tempfile +import unittest +from io import StringIO + +import torch +from fairseq import options +from fairseq_cli import train +from tests.utils import ( + create_dummy_data, + generate_main, + preprocess_lm_data, + preprocess_translation_data, + train_translation_model, +) + + +@unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") +class TestTranslationGPU(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_fp16_multigpu(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fp16") as data_dir: + log = os.path.join(data_dir, "train.log") + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "fconv_iwslt_de_en", + ["--fp16", "--log-file", log], + world_size=min(torch.cuda.device_count(), 2), + ) + generate_main(data_dir) + assert os.path.exists(log) + + @staticmethod + def parse_logs(logfile): + logs = [] + for ln in open(logfile, "r").readlines(): + try: + logs.append(json.loads(ln)) + except json.JSONDecodeError: + continue + return logs + + def test_resume_training_fsdp(self): + self._test_resume_training(["--ddp-backend", "fully_sharded"]) + + def test_resume_training_fsdp_sharded_state(self): + self._test_resume_training(["--ddp-backend", "fully_sharded", "--use-sharded-state"]) + + def test_resume_training_noc10d(self): + self._test_resume_training([]) + + def _test_resume_training(self, extra_clargs, arch="fconv_iwslt_de_en"): + flags = [ + "--fp16", + "--log-format", + "json", + "--max-update", + "10", + "--save-interval-updates", + "2", + "--log-interval", + "1", + ] + extra_clargs + world_size = min(torch.cuda.device_count(), 2) + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fp16") as data_dir: + log = os.path.join(data_dir, "train.log") + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, arch, flags + ["--log-file", log], world_size=world_size, + ) + log2 = os.path.join(data_dir, "resume.log") + restore_file = os.path.join(data_dir, "checkpoint_1_2.pt") + train_translation_model( + data_dir, + arch, + flags + ["--log-file", log2, "--restore-file", restore_file], + world_size=world_size, + ) + + l1 = self.parse_logs(log) + l2 = self.parse_logs(log2) + assert int(l2[0]["num_updates"]) == 3, f"{l1}\n\n {l2}" + for k in [ + "train_loss", + "train_num_updates", + "train_ppl", + "train_gnorm", + ]: + from_scratch, resumed = l1[-1][k], l2[-1][k] + assert ( + from_scratch == resumed + ), f"difference at {k} {from_scratch} != {resumed}" + + def test_memory_efficient_fp16(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_memory_efficient_fp16") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, "fconv_iwslt_de_en", ["--memory-efficient-fp16"] + ) + generate_main(data_dir) + + def test_transformer_fp16(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_transformer") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "64", + "--decoder-embed-dim", + "64", + "--fp16", + ], + run_validation=True, + ) + generate_main(data_dir) + + @unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") + def test_amp(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_amp") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model(data_dir, "fconv_iwslt_de_en", ["--amp"]) + generate_main(data_dir) + + @unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") + def test_transformer_amp(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_transformer") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "64", + "--decoder-embed-dim", + "64", + "--amp", + ], + run_validation=True, + ) + generate_main(data_dir) + + @unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") + def test_levenshtein_transformer(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_levenshtein_transformer" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, ["--joined-dictionary"]) + train_translation_model( + data_dir, + "levenshtein_transformer", + [ + "--apply-bert-init", + "--early-exit", + "6,6,6", + "--criterion", + "nat_loss", + ], + task="translation_lev", + ) + gen_config = [ + "--task", + "translation_lev", + "--iter-decode-max-iter", + "9", + "--iter-decode-eos-penalty", + "0", + "--print-step", + ] + # non-ensemble generation + generate_main(data_dir, gen_config) + # ensemble generation + generate_main( + data_dir, + gen_config, + path=os.pathsep.join( + [ + os.path.join(data_dir, "checkpoint_last.pt"), + os.path.join(data_dir, "checkpoint_last.pt"), + ] + ), + ) + + def test_fsdp_checkpoint_generate(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fsdp_sharded") as data_dir: + log = os.path.join(data_dir, "train.log") + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + world_size = min(torch.cuda.device_count(), 2) + train_translation_model( + data_dir, + "fconv_iwslt_de_en", + ["--log-file", log, "--ddp-backend", "fully_sharded"], + world_size=world_size, + ) + generate_main(data_dir) + assert os.path.exists(log) + + def test_fsdp_sharded_checkpoint_generate(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fsdp_sharded") as data_dir: + log = os.path.join(data_dir, "train.log") + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + world_size = min(torch.cuda.device_count(), 2) + train_translation_model( + data_dir, + "fconv_iwslt_de_en", + ["--log-file", log, "--ddp-backend", "fully_sharded", "--use-sharded-state"], + world_size=world_size, + ) + generate_main(data_dir, ["--checkpoint-shard-count", str(world_size)]) + assert os.path.exists(log) + + +def _quantize_language_model(data_dir, arch, extra_flags=None, run_validation=False): + train_parser = options.get_training_parser() + train_args = options.parse_args_and_arch( + train_parser, + [ + "--task", + "language_modeling", + data_dir, + "--arch", + arch, + "--optimizer", + "adam", + "--lr", + "0.0001", + "--criterion", + "adaptive_loss", + "--adaptive-softmax-cutoff", + "5,10,15", + "--max-tokens", + "500", + "--tokens-per-sample", + "500", + "--save-dir", + data_dir, + "--max-epoch", + "1", + "--no-progress-bar", + "--distributed-world-size", + "1", + "--ddp-backend", + "no_c10d", + "--num-workers", + "0", + ] + + (extra_flags or []), + ) + train.main(train_args) + + # try scalar quantization + scalar_quant_train_parser = options.get_training_parser() + scalar_quant_train_args = options.parse_args_and_arch( + scalar_quant_train_parser, + [ + "--task", + "language_modeling", + data_dir, + "--arch", + arch, + "--optimizer", + "adam", + "--lr", + "0.0001", + "--criterion", + "adaptive_loss", + "--adaptive-softmax-cutoff", + "5,10,15", + "--max-tokens", + "500", + "--tokens-per-sample", + "500", + "--save-dir", + data_dir, + "--max-update", + "3", + "--no-progress-bar", + "--distributed-world-size", + "1", + "--ddp-backend", + "no_c10d", + "--num-workers", + "0", + "--quant-noise-scalar", + "0.5", + ] + + (extra_flags or []), + ) + train.main(scalar_quant_train_args) + + # try iterative PQ quantization + quantize_parser = options.get_training_parser() + quantize_args = options.parse_args_and_arch( + quantize_parser, + [ + "--task", + "language_modeling", + data_dir, + "--arch", + arch, + "--optimizer", + "adam", + "--lr", + "0.0001", + "--criterion", + "adaptive_loss", + "--adaptive-softmax-cutoff", + "5,10,15", + "--max-tokens", + "50", + "--tokens-per-sample", + "50", + "--max-update", + "6", + "--no-progress-bar", + "--distributed-world-size", + "1", + "--ddp-backend", + "no_c10d", + "--num-workers", + "0", + "--restore-file", + os.path.join(data_dir, "checkpoint_last.pt"), + "--reset-optimizer", + "--quantization-config-path", + os.path.join( + os.path.dirname(__file__), "transformer_quantization_config.yaml" + ), + ] + + (extra_flags or []), + ) + train.main(quantize_args) + + +@unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") +class TestQuantization(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_quantization(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_quantization") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + # tests both scalar and iterative PQ quantization + _quantize_language_model(data_dir, "transformer_lm") + + +@unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") +class TestOptimizersGPU(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_flat_grads(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_flat_grads") as data_dir: + # Use just a bit of data and tiny model to keep this test runtime reasonable + create_dummy_data(data_dir, num_examples=10, maxlen=5) + preprocess_translation_data(data_dir) + with self.assertRaises(RuntimeError): + # adafactor isn't compatible with flat grads, which + # are used by default with --fp16 + train_translation_model( + data_dir, + "lstm", + [ + "--required-batch-size-multiple", + "1", + "--encoder-layers", + "1", + "--encoder-hidden-size", + "32", + "--decoder-layers", + "1", + "--optimizer", + "adafactor", + "--fp16", + ], + ) + # but it should pass once we set --fp16-no-flatten-grads + train_translation_model( + data_dir, + "lstm", + [ + "--required-batch-size-multiple", + "1", + "--encoder-layers", + "1", + "--encoder-hidden-size", + "32", + "--decoder-layers", + "1", + "--optimizer", + "adafactor", + "--fp16", + "--fp16-no-flatten-grads", + ], + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/gpu/transformer_quantization_config.yaml b/SpeechT5/fairseq/tests/gpu/transformer_quantization_config.yaml new file mode 100644 index 0000000..de31d81 --- /dev/null +++ b/SpeechT5/fairseq/tests/gpu/transformer_quantization_config.yaml @@ -0,0 +1,28 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +# This file defines example configuration arguments for quantizing +# a transformer model with product quantization + +n_centroids: + Linear: + key: in_features + value: {"*": 8} + Embedding: + key: embedding_dim + value: {"*": 8} + +block_sizes: + Linear: + key: fuzzy_name + value: {fc: 8, attn: 4, emb: 4} + Embedding: + key: fuzzy_name + value: {emb: 8} + +layers_to_quantize: + - decoder\\.layers\\.\d+\\.fc[12] + - decoder\\.embed_tokens\\.embeddings\\.[012]\\.[01] + - decoder\\.layers\\.\d+\\.self_attn\\.(k_proj|v_proj|q_proj|out_proj) diff --git a/SpeechT5/fairseq/tests/speech_recognition/__init__.py b/SpeechT5/fairseq/tests/speech_recognition/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/fairseq/tests/speech_recognition/asr_test_base.py b/SpeechT5/fairseq/tests/speech_recognition/asr_test_base.py new file mode 100644 index 0000000..8c5d414 --- /dev/null +++ b/SpeechT5/fairseq/tests/speech_recognition/asr_test_base.py @@ -0,0 +1,557 @@ +#!/usr/bin/env python3 + +import argparse +import os +import unittest +from inspect import currentframe, getframeinfo + +import numpy as np +import torch +from examples.speech_recognition.data.data_utils import lengths_to_encoder_padding_mask +from fairseq.data import data_utils as fairseq_data_utils +from fairseq.data.dictionary import Dictionary +from fairseq.models import ( + BaseFairseqModel, + FairseqDecoder, + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqEncoderModel, + FairseqModel, +) +from fairseq.tasks.fairseq_task import LegacyFairseqTask + + +DEFAULT_TEST_VOCAB_SIZE = 100 + + +# /////////////////////////////////////////////////////////////////////////// +# utility function to setup dummy dict/task/input +# /////////////////////////////////////////////////////////////////////////// + + +def get_dummy_dictionary(vocab_size=DEFAULT_TEST_VOCAB_SIZE): + dummy_dict = Dictionary() + # add dummy symbol to satisfy vocab size + for id, _ in enumerate(range(vocab_size)): + dummy_dict.add_symbol("{}".format(id), 1000) + return dummy_dict + + +class DummyTask(LegacyFairseqTask): + def __init__(self, args): + super().__init__(args) + self.dictionary = get_dummy_dictionary() + if getattr(self.args, "ctc", False): + self.dictionary.add_symbol("<ctc_blank>") + self.tgt_dict = self.dictionary + + @property + def target_dictionary(self): + return self.dictionary + + +def get_dummy_task_and_parser(): + """ + to build a fariseq model, we need some dummy parse and task. This function + is used to create dummy task and parser to faciliate model/criterion test + + Note: we use FbSpeechRecognitionTask as the dummy task. You may want + to use other task by providing another function + """ + parser = argparse.ArgumentParser( + description="test_dummy_s2s_task", argument_default=argparse.SUPPRESS + ) + DummyTask.add_args(parser) + args = parser.parse_args([]) + task = DummyTask.setup_task(args) + return task, parser + + +def get_dummy_input(T=100, D=80, B=5, K=100): + forward_input = {} + # T max sequence length + # D feature vector dimension + # B batch size + # K target dimension size + feature = torch.randn(B, T, D) + # this (B, T, D) layout is just a convention, you can override it by + # write your own _prepare_forward_input function + src_lengths = torch.from_numpy( + np.random.randint(low=1, high=T, size=B, dtype=np.int64) + ) + src_lengths[0] = T # make sure the maximum length matches + prev_output_tokens = [] + for b in range(B): + token_length = np.random.randint(low=1, high=src_lengths[b].item() + 1) + tokens = np.random.randint(low=0, high=K, size=token_length, dtype=np.int64) + prev_output_tokens.append(torch.from_numpy(tokens)) + + prev_output_tokens = fairseq_data_utils.collate_tokens( + prev_output_tokens, + pad_idx=1, + eos_idx=2, + left_pad=False, + move_eos_to_beginning=False, + ) + src_lengths, sorted_order = src_lengths.sort(descending=True) + forward_input["src_tokens"] = feature.index_select(0, sorted_order) + forward_input["src_lengths"] = src_lengths + forward_input["prev_output_tokens"] = prev_output_tokens + + return forward_input + + +def get_dummy_encoder_output(encoder_out_shape=(100, 80, 5)): + """ + This only provides an example to generate dummy encoder output + """ + (T, B, D) = encoder_out_shape + encoder_out = {} + + encoder_out["encoder_out"] = torch.from_numpy( + np.random.randn(*encoder_out_shape).astype(np.float32) + ) + seq_lengths = torch.from_numpy(np.random.randint(low=1, high=T, size=B)) + # some dummy mask + encoder_out["encoder_padding_mask"] = torch.arange(T).view(1, T).expand( + B, -1 + ) >= seq_lengths.view(B, 1).expand(-1, T) + encoder_out["encoder_padding_mask"].t_() + + # encoer_padding_mask is (T, B) tensor, with (t, b)-th element indicate + # whether encoder_out[t, b] is valid (=0) or not (=1) + return encoder_out + + +def _current_postion_info(): + cf = currentframe() + frameinfo = " (at {}:{})".format( + os.path.basename(getframeinfo(cf).filename), cf.f_back.f_lineno + ) + return frameinfo + + +def check_encoder_output(encoder_output, batch_size=None): + """we expect encoder_output to be a dict with the following + key/value pairs: + - encoder_out: a Torch.Tensor + - encoder_padding_mask: a binary Torch.Tensor + """ + if not isinstance(encoder_output, dict): + msg = ( + "FairseqEncoderModel.forward(...) must be a dict" + _current_postion_info() + ) + return False, msg + + if "encoder_out" not in encoder_output: + msg = ( + "FairseqEncoderModel.forward(...) must contain encoder_out" + + _current_postion_info() + ) + return False, msg + + if "encoder_padding_mask" not in encoder_output: + msg = ( + "FairseqEncoderModel.forward(...) must contain encoder_padding_mask" + + _current_postion_info() + ) + return False, msg + + if not isinstance(encoder_output["encoder_out"], torch.Tensor): + msg = "encoder_out must be a torch.Tensor" + _current_postion_info() + return False, msg + + if encoder_output["encoder_out"].dtype != torch.float32: + msg = "encoder_out must have float32 dtype" + _current_postion_info() + return False, msg + + mask = encoder_output["encoder_padding_mask"] + if mask is not None: + if not isinstance(mask, torch.Tensor): + msg = ( + "encoder_padding_mask must be a torch.Tensor" + _current_postion_info() + ) + return False, msg + if mask.dtype != torch.uint8 and ( + not hasattr(torch, "bool") or mask.dtype != torch.bool + ): + msg = ( + "encoder_padding_mask must have dtype of uint8" + + _current_postion_info() + ) + return False, msg + + if mask.dim() != 2: + msg = ( + "we expect encoder_padding_mask to be a 2-d tensor, in shape (T, B)" + + _current_postion_info() + ) + return False, msg + + if batch_size is not None and mask.size(1) != batch_size: + msg = ( + "we expect encoder_padding_mask to be a 2-d tensor, with size(1)" + + " being the batch size" + + _current_postion_info() + ) + return False, msg + return True, None + + +def check_decoder_output(decoder_output): + """we expect output from a decoder is a tuple with the following constraint: + - the first element is a torch.Tensor + - the second element can be anything (reserved for future use) + """ + if not isinstance(decoder_output, tuple): + msg = "FariseqDecoder output must be a tuple" + _current_postion_info() + return False, msg + + if len(decoder_output) != 2: + msg = "FairseqDecoder output must be 2-elem tuple" + _current_postion_info() + return False, msg + + if not isinstance(decoder_output[0], torch.Tensor): + msg = ( + "FariseqDecoder output[0] must be a torch.Tensor" + _current_postion_info() + ) + return False, msg + + return True, None + + +# /////////////////////////////////////////////////////////////////////////// +# Base Test class +# /////////////////////////////////////////////////////////////////////////// + + +class TestBaseFairseqModelBase(unittest.TestCase): + """ + This class is used to facilitate writing unittest for any class derived from + `BaseFairseqModel`. + """ + + @classmethod + def setUpClass(cls): + if cls is TestBaseFairseqModelBase: + raise unittest.SkipTest("Skipping test case in base") + super().setUpClass() + + def setUpModel(self, model): + self.assertTrue(isinstance(model, BaseFairseqModel)) + self.model = model + + def setupInput(self): + pass + + def setUp(self): + self.model = None + self.forward_input = None + pass + + +class TestFairseqEncoderDecoderModelBase(TestBaseFairseqModelBase): + """ + base code to test FairseqEncoderDecoderModel (formally known as + `FairseqModel`) must be derived from this base class + """ + + @classmethod + def setUpClass(cls): + if cls is TestFairseqEncoderDecoderModelBase: + raise unittest.SkipTest("Skipping test case in base") + super().setUpClass() + + def setUpModel(self, model_cls, extra_args_setters=None): + self.assertTrue( + issubclass(model_cls, (FairseqEncoderDecoderModel, FairseqModel)), + msg="This class only tests for FairseqModel subclasses", + ) + + task, parser = get_dummy_task_and_parser() + model_cls.add_args(parser) + + args = parser.parse_args([]) + + if extra_args_setters is not None: + for args_setter in extra_args_setters: + args_setter(args) + model = model_cls.build_model(args, task) + self.model = model + + def setUpInput(self, input=None): + self.forward_input = get_dummy_input() if input is None else input + + def setUp(self): + super().setUp() + + def test_forward(self): + if self.model and self.forward_input: + forward_output = self.model.forward(**self.forward_input) + # for FairseqEncoderDecoderModel, forward returns a tuple of two + # elements, the first one is a Torch.Tensor + succ, msg = check_decoder_output(forward_output) + if not succ: + self.assertTrue(succ, msg=msg) + self.forward_output = forward_output + + def test_get_normalized_probs(self): + if self.model and self.forward_input: + forward_output = self.model.forward(**self.forward_input) + logprob = self.model.get_normalized_probs(forward_output, log_probs=True) + prob = self.model.get_normalized_probs(forward_output, log_probs=False) + + # in order for different models/criterion to play with each other + # we need to know whether the logprob or prob output is batch_first + # or not. We assume an additional attribute will be attached to logprob + # or prob. If you find your code failed here, simply override + # FairseqModel.get_normalized_probs, see example at + # https://fburl.com/batch_first_example + self.assertTrue(hasattr(logprob, "batch_first")) + self.assertTrue(hasattr(prob, "batch_first")) + + self.assertTrue(torch.is_tensor(logprob)) + self.assertTrue(torch.is_tensor(prob)) + + +class TestFairseqEncoderModelBase(TestBaseFairseqModelBase): + """ + base class to test FairseqEncoderModel + """ + + @classmethod + def setUpClass(cls): + if cls is TestFairseqEncoderModelBase: + raise unittest.SkipTest("Skipping test case in base") + super().setUpClass() + + def setUpModel(self, model_cls, extra_args_setters=None): + self.assertTrue( + issubclass(model_cls, FairseqEncoderModel), + msg="This class is only used for testing FairseqEncoderModel", + ) + task, parser = get_dummy_task_and_parser() + model_cls.add_args(parser) + args = parser.parse_args([]) + if extra_args_setters is not None: + for args_setter in extra_args_setters: + args_setter(args) + + model = model_cls.build_model(args, task) + self.model = model + + def setUpInput(self, input=None): + self.forward_input = get_dummy_input() if input is None else input + # get_dummy_input() is originally for s2s, here we delete extra dict + # items, so it can be used for EncoderModel / Encoder as well + self.forward_input.pop("prev_output_tokens", None) + + def setUp(self): + super().setUp() + + def test_forward(self): + if self.forward_input and self.model: + bsz = self.forward_input["src_tokens"].size(0) + forward_output = self.model.forward(**self.forward_input) + + # we expect forward_output to be a dict with the following + # key/value pairs: + # - encoder_out: a Torch.Tensor + # - encoder_padding_mask: a binary Torch.Tensor + succ, msg = check_encoder_output(forward_output, batch_size=bsz) + if not succ: + self.assertTrue(succ, msg=msg) + self.forward_output = forward_output + + def test_get_normalized_probs(self): + if self.model and self.forward_input: + forward_output = self.model.forward(**self.forward_input) + logprob = self.model.get_normalized_probs(forward_output, log_probs=True) + prob = self.model.get_normalized_probs(forward_output, log_probs=False) + + # in order for different models/criterion to play with each other + # we need to know whether the logprob or prob output is batch_first + # or not. We assume an additional attribute will be attached to logprob + # or prob. If you find your code failed here, simply override + # FairseqModel.get_normalized_probs, see example at + # https://fburl.com/batch_first_example + self.assertTrue(hasattr(logprob, "batch_first")) + self.assertTrue(hasattr(prob, "batch_first")) + + self.assertTrue(torch.is_tensor(logprob)) + self.assertTrue(torch.is_tensor(prob)) + + +class TestFairseqEncoderBase(unittest.TestCase): + """ + base class to test FairseqEncoder + """ + + @classmethod + def setUpClass(cls): + if cls is TestFairseqEncoderBase: + raise unittest.SkipTest("Skipping test case in base") + super().setUpClass() + + def setUpEncoder(self, encoder): + self.assertTrue( + isinstance(encoder, FairseqEncoder), + msg="This class is only used for test FairseqEncoder", + ) + self.encoder = encoder + + def setUpInput(self, input=None): + self.forward_input = get_dummy_input() if input is None else input + # get_dummy_input() is originally for s2s, here we delete extra dict + # items, so it can be used for EncoderModel / Encoder as well + self.forward_input.pop("prev_output_tokens", None) + + def setUp(self): + self.encoder = None + self.forward_input = None + + def test_forward(self): + if self.encoder and self.forward_input: + bsz = self.forward_input["src_tokens"].size(0) + + forward_output = self.encoder.forward(**self.forward_input) + succ, msg = check_encoder_output(forward_output, batch_size=bsz) + if not succ: + self.assertTrue(succ, msg=msg) + self.forward_output = forward_output + + +class TestFairseqDecoderBase(unittest.TestCase): + """ + base class to test FairseqDecoder + """ + + @classmethod + def setUpClass(cls): + if cls is TestFairseqDecoderBase: + raise unittest.SkipTest("Skipping test case in base") + super().setUpClass() + + def setUpDecoder(self, decoder): + self.assertTrue( + isinstance(decoder, FairseqDecoder), + msg="This class is only used for test FairseqDecoder", + ) + self.decoder = decoder + + def setUpInput(self, input=None): + self.forward_input = get_dummy_encoder_output() if input is None else input + + def setUpPrevOutputTokens(self, tokens=None): + if tokens is None: + self.encoder_input = get_dummy_input() + self.prev_output_tokens = self.encoder_input["prev_output_tokens"] + else: + self.prev_output_tokens = tokens + + def setUp(self): + self.decoder = None + self.forward_input = None + self.prev_output_tokens = None + + def test_forward(self): + if ( + self.decoder is not None + and self.forward_input is not None + and self.prev_output_tokens is not None + ): + forward_output = self.decoder.forward( + prev_output_tokens=self.prev_output_tokens, + encoder_out=self.forward_input, + ) + succ, msg = check_decoder_output(forward_output) + if not succ: + self.assertTrue(succ, msg=msg) + self.forward_input = forward_output + + +class DummyEncoderModel(FairseqEncoderModel): + def __init__(self, encoder): + super().__init__(encoder) + + @classmethod + def build_model(cls, args, task): + return cls(DummyEncoder()) + + def get_logits(self, net_output): + # Inverse of sigmoid to use with BinaryCrossEntropyWithLogitsCriterion as + # F.binary_cross_entropy_with_logits combines sigmoid and CE + return torch.log( + torch.div(net_output["encoder_out"], 1 - net_output["encoder_out"]) + ) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + lprobs = super().get_normalized_probs(net_output, log_probs, sample=sample) + lprobs.batch_first = True + return lprobs + + +class DummyEncoder(FairseqEncoder): + def __init__(self): + super().__init__(None) + + def forward(self, src_tokens, src_lengths): + mask, max_len = lengths_to_encoder_padding_mask(src_lengths) + return {"encoder_out": src_tokens, "encoder_padding_mask": mask} + + +class CrossEntropyCriterionTestBase(unittest.TestCase): + @classmethod + def setUpClass(cls): + if cls is CrossEntropyCriterionTestBase: + raise unittest.SkipTest("Skipping base class test case") + super().setUpClass() + + def setUpArgs(self): + args = argparse.Namespace() + args.sentence_avg = False + args.threshold = 0.1 # to use with BinaryCrossEntropyWithLogitsCriterion + return args + + def setUp(self): + args = self.setUpArgs() + self.model = DummyEncoderModel(encoder=DummyEncoder()) + self.criterion = self.criterion_cls.build_criterion(args, task=DummyTask(args)) + + def get_src_tokens(self, correct_prediction, aggregate): + """ + correct_prediction: True if the net_output (src_tokens) should + predict the correct target + aggregate: True if the criterion expects net_output (src_tokens) + aggregated across time axis + """ + predicted_idx = 0 if correct_prediction else 1 + if aggregate: + src_tokens = torch.zeros((2, 2), dtype=torch.float) + for b in range(2): + src_tokens[b][predicted_idx] = 1.0 + else: + src_tokens = torch.zeros((2, 10, 2), dtype=torch.float) + for b in range(2): + for t in range(10): + src_tokens[b][t][predicted_idx] = 1.0 + return src_tokens + + def get_target(self, soft_target): + if soft_target: + target = torch.zeros((2, 2), dtype=torch.float) + for b in range(2): + target[b][0] = 1.0 + else: + target = torch.zeros((2, 10), dtype=torch.long) + return target + + def get_test_sample(self, correct, soft_target, aggregate): + src_tokens = self.get_src_tokens(correct, aggregate) + target = self.get_target(soft_target) + L = src_tokens.size(1) + return { + "net_input": {"src_tokens": src_tokens, "src_lengths": torch.tensor([L])}, + "target": target, + "ntokens": src_tokens.size(0) * src_tokens.size(1), + } diff --git a/SpeechT5/fairseq/tests/speech_recognition/test_collaters.py b/SpeechT5/fairseq/tests/speech_recognition/test_collaters.py new file mode 100644 index 0000000..6a5029a --- /dev/null +++ b/SpeechT5/fairseq/tests/speech_recognition/test_collaters.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import numpy as np +import torch +from examples.speech_recognition.data.collaters import Seq2SeqCollater + + +class TestSeq2SeqCollator(unittest.TestCase): + def test_collate(self): + + eos_idx = 1 + pad_idx = 0 + collater = Seq2SeqCollater( + feature_index=0, label_index=1, pad_index=pad_idx, eos_index=eos_idx + ) + + # 2 frames in the first sample and 3 frames in the second one + frames1 = np.array([[7, 8], [9, 10]]) + frames2 = np.array([[1, 2], [3, 4], [5, 6]]) + target1 = np.array([4, 2, 3, eos_idx]) + target2 = np.array([3, 2, eos_idx]) + sample1 = {"id": 0, "data": [frames1, target1]} + sample2 = {"id": 1, "data": [frames2, target2]} + batch = collater.collate([sample1, sample2]) + + # collate sort inputs by frame's length before creating the batch + self.assertTensorEqual(batch["id"], torch.tensor([1, 0])) + self.assertEqual(batch["ntokens"], 7) + self.assertTensorEqual( + batch["net_input"]["src_tokens"], + torch.tensor( + [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [pad_idx, pad_idx]]] + ), + ) + self.assertTensorEqual( + batch["net_input"]["prev_output_tokens"], + torch.tensor([[eos_idx, 3, 2, pad_idx], [eos_idx, 4, 2, 3]]), + ) + self.assertTensorEqual(batch["net_input"]["src_lengths"], torch.tensor([3, 2])) + self.assertTensorEqual( + batch["target"], + torch.tensor([[3, 2, eos_idx, pad_idx], [4, 2, 3, eos_idx]]), + ) + self.assertEqual(batch["nsentences"], 2) + + def assertTensorEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertEqual(t1.ne(t2).long().sum(), 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/speech_recognition/test_cross_entropy.py b/SpeechT5/fairseq/tests/speech_recognition/test_cross_entropy.py new file mode 100644 index 0000000..b05400e --- /dev/null +++ b/SpeechT5/fairseq/tests/speech_recognition/test_cross_entropy.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +from examples.speech_recognition.criterions.cross_entropy_acc import ( + CrossEntropyWithAccCriterion, +) + +from .asr_test_base import CrossEntropyCriterionTestBase + + +class CrossEntropyWithAccCriterionTest(CrossEntropyCriterionTestBase): + def setUp(self): + self.criterion_cls = CrossEntropyWithAccCriterion + super().setUp() + + def test_cross_entropy_all_correct(self): + sample = self.get_test_sample(correct=True, soft_target=False, aggregate=False) + loss, sample_size, logging_output = self.criterion( + self.model, sample, "sum", log_probs=True + ) + assert logging_output["correct"] == 20 + assert logging_output["total"] == 20 + assert logging_output["sample_size"] == 20 + assert logging_output["ntokens"] == 20 + + def test_cross_entropy_all_wrong(self): + sample = self.get_test_sample(correct=False, soft_target=False, aggregate=False) + loss, sample_size, logging_output = self.criterion( + self.model, sample, "sum", log_probs=True + ) + assert logging_output["correct"] == 0 + assert logging_output["total"] == 20 + assert logging_output["sample_size"] == 20 + assert logging_output["ntokens"] == 20 diff --git a/SpeechT5/fairseq/tests/speech_recognition/test_data_utils.py b/SpeechT5/fairseq/tests/speech_recognition/test_data_utils.py new file mode 100644 index 0000000..a72e0b6 --- /dev/null +++ b/SpeechT5/fairseq/tests/speech_recognition/test_data_utils.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +import unittest + +import torch +from examples.speech_recognition.data import data_utils + + +class DataUtilsTest(unittest.TestCase): + def test_normalization(self): + sample_len1 = torch.tensor( + [ + [ + -0.7661, + -1.3889, + -2.0972, + -0.9134, + -0.7071, + -0.9765, + -0.8700, + -0.8283, + 0.7512, + 1.3211, + 2.1532, + 2.1174, + 1.2800, + 1.2633, + 1.6147, + 1.6322, + 2.0723, + 3.1522, + 3.2852, + 2.2309, + 2.5569, + 2.2183, + 2.2862, + 1.5886, + 0.8773, + 0.8725, + 1.2662, + 0.9899, + 1.1069, + 1.3926, + 1.2795, + 1.1199, + 1.1477, + 1.2687, + 1.3843, + 1.1903, + 0.8355, + 1.1367, + 1.2639, + 1.4707, + ] + ] + ) + out = data_utils.apply_mv_norm(sample_len1) + assert not torch.isnan(out).any() + assert (out == sample_len1).all() diff --git a/SpeechT5/fairseq/tests/speech_recognition/test_vggtransformer.py b/SpeechT5/fairseq/tests/speech_recognition/test_vggtransformer.py new file mode 100644 index 0000000..4dc73b8 --- /dev/null +++ b/SpeechT5/fairseq/tests/speech_recognition/test_vggtransformer.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 + +# import models/encoder/decoder to be tested +from examples.speech_recognition.models.vggtransformer import ( + TransformerDecoder, + VGGTransformerEncoder, + VGGTransformerModel, + vggtransformer_1, + vggtransformer_2, + vggtransformer_base, +) + +# import base test class +from .asr_test_base import ( + DEFAULT_TEST_VOCAB_SIZE, + TestFairseqDecoderBase, + TestFairseqEncoderBase, + TestFairseqEncoderDecoderModelBase, + get_dummy_dictionary, + get_dummy_encoder_output, + get_dummy_input, +) + + +class VGGTransformerModelTest_mid(TestFairseqEncoderDecoderModelBase): + def setUp(self): + def override_config(args): + """ + vggtrasformer_1 use 14 layers of transformer, + for testing purpose, it is too expensive. For fast turn-around + test, reduce the number of layers to 3. + """ + args.transformer_enc_config = ( + "((1024, 16, 4096, True, 0.15, 0.15, 0.15),) * 3" + ) + + super().setUp() + extra_args_setter = [vggtransformer_1, override_config] + + self.setUpModel(VGGTransformerModel, extra_args_setter) + self.setUpInput(get_dummy_input(T=50, D=80, B=5, K=DEFAULT_TEST_VOCAB_SIZE)) + + +class VGGTransformerModelTest_big(TestFairseqEncoderDecoderModelBase): + def setUp(self): + def override_config(args): + """ + vggtrasformer_2 use 16 layers of transformer, + for testing purpose, it is too expensive. For fast turn-around + test, reduce the number of layers to 3. + """ + args.transformer_enc_config = ( + "((1024, 16, 4096, True, 0.15, 0.15, 0.15),) * 3" + ) + + super().setUp() + extra_args_setter = [vggtransformer_2, override_config] + + self.setUpModel(VGGTransformerModel, extra_args_setter) + self.setUpInput(get_dummy_input(T=50, D=80, B=5, K=DEFAULT_TEST_VOCAB_SIZE)) + + +class VGGTransformerModelTest_base(TestFairseqEncoderDecoderModelBase): + def setUp(self): + def override_config(args): + """ + vggtrasformer_base use 12 layers of transformer, + for testing purpose, it is too expensive. For fast turn-around + test, reduce the number of layers to 3. + """ + args.transformer_enc_config = ( + "((512, 8, 2048, True, 0.15, 0.15, 0.15),) * 3" + ) + + super().setUp() + extra_args_setter = [vggtransformer_base, override_config] + + self.setUpModel(VGGTransformerModel, extra_args_setter) + self.setUpInput(get_dummy_input(T=50, D=80, B=5, K=DEFAULT_TEST_VOCAB_SIZE)) + + +class VGGTransformerEncoderTest(TestFairseqEncoderBase): + def setUp(self): + super().setUp() + + self.setUpInput(get_dummy_input(T=50, D=80, B=5)) + + def test_forward(self): + print("1. test standard vggtransformer") + self.setUpEncoder(VGGTransformerEncoder(input_feat_per_channel=80)) + super().test_forward() + print("2. test vggtransformer with limited right context") + self.setUpEncoder( + VGGTransformerEncoder( + input_feat_per_channel=80, transformer_context=(-1, 5) + ) + ) + super().test_forward() + print("3. test vggtransformer with limited left context") + self.setUpEncoder( + VGGTransformerEncoder( + input_feat_per_channel=80, transformer_context=(5, -1) + ) + ) + super().test_forward() + print("4. test vggtransformer with limited right context and sampling") + self.setUpEncoder( + VGGTransformerEncoder( + input_feat_per_channel=80, + transformer_context=(-1, 12), + transformer_sampling=(2, 2), + ) + ) + super().test_forward() + print("5. test vggtransformer with windowed context and sampling") + self.setUpEncoder( + VGGTransformerEncoder( + input_feat_per_channel=80, + transformer_context=(12, 12), + transformer_sampling=(2, 2), + ) + ) + + +class TransformerDecoderTest(TestFairseqDecoderBase): + def setUp(self): + super().setUp() + + dict = get_dummy_dictionary(vocab_size=DEFAULT_TEST_VOCAB_SIZE) + decoder = TransformerDecoder(dict) + dummy_encoder_output = get_dummy_encoder_output(encoder_out_shape=(50, 5, 256)) + + self.setUpDecoder(decoder) + self.setUpInput(dummy_encoder_output) + self.setUpPrevOutputTokens() diff --git a/SpeechT5/fairseq/tests/test_activation_checkpointing.py b/SpeechT5/fairseq/tests/test_activation_checkpointing.py new file mode 100644 index 0000000..647a957 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_activation_checkpointing.py @@ -0,0 +1,79 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +import torch.nn as nn +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from torch.utils.checkpoint import checkpoint + + +class Model(nn.Module): + def __init__( + self, use_pytorch_checkpoint=False, use_fairseq_checkpoint=False, **kwargs + ): + super().__init__() + torch.manual_seed(0) + self.use_pytorch_checkpoint = use_pytorch_checkpoint + self.ffn = nn.Sequential( + nn.Linear(32, 128), + # add a Dropout layer to test RNG save/restore + nn.Dropout(p=0.5), + nn.Linear(128, 32), + ) + if use_fairseq_checkpoint: + self.ffn = checkpoint_wrapper(self.ffn, **kwargs) + self.out = nn.Linear(32, 1) + + def forward(self, x): + if self.use_pytorch_checkpoint: + x = checkpoint(self.ffn, x) + else: + x = self.ffn(x) + return self.out(x) + + +class TestActivationCheckpointing(unittest.TestCase): + def _test_checkpoint_wrapper(self, device, log_memory_usage=False): + def get_loss_and_gnorm(model): + torch.manual_seed(1) + input = torch.rand(2, 16, 32).requires_grad_(True).to(device) + model.zero_grad() + loss = model(input).sum() + loss.backward() + gnorm = torch.norm( + torch.stack([torch.norm(p.grad.detach()) for p in model.parameters()]) + ) + return {"loss": loss, "gnorm": gnorm} + + model = Model().to(device) + no_cpt = get_loss_and_gnorm(model) + + model = Model(use_pytorch_checkpoint=True).to(device) + pyt_cpt = get_loss_and_gnorm(model) + torch.testing.assert_allclose(no_cpt["loss"], pyt_cpt["loss"]) + torch.testing.assert_allclose(no_cpt["gnorm"], pyt_cpt["gnorm"]) + + model = Model(use_fairseq_checkpoint=True).to(device) + fairseq_cpt = get_loss_and_gnorm(model) + torch.testing.assert_allclose(no_cpt["loss"], fairseq_cpt["loss"]) + torch.testing.assert_allclose(no_cpt["gnorm"], fairseq_cpt["gnorm"]) + + model = Model(use_fairseq_checkpoint=True, offload_to_cpu=True).to(device) + fairseq_cpt_offload = get_loss_and_gnorm(model) + torch.testing.assert_allclose(no_cpt["loss"], fairseq_cpt_offload["loss"]) + torch.testing.assert_allclose(no_cpt["gnorm"], fairseq_cpt_offload["gnorm"]) + + def test_checkpoint_wrapper_cpu(self): + self._test_checkpoint_wrapper(device=torch.device("cpu")) + + @unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") + def test_checkpoint_wrapper_cuda(self): + self._test_checkpoint_wrapper(device=torch.device("cuda")) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_amp_optimizer.py b/SpeechT5/fairseq/tests/test_amp_optimizer.py new file mode 100644 index 0000000..3a785e1 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_amp_optimizer.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import copy +import unittest + +import torch +from torch.cuda.amp import autocast, GradScaler +from fairseq.optim import build_optimizer + + +@unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") +class TestGradientScalingAMP(unittest.TestCase): + def setUp(self): + self.x = torch.tensor([2.0]).cuda().half() + weight = 3.0 + bias = 5.0 + self.error = 1.0 + self.target = torch.tensor([self.x * weight + bias + self.error]).cuda() + self.loss_fn = torch.nn.L1Loss() + + self.model = torch.nn.Linear(1, 1) + self.model.weight.data = torch.tensor([[weight]]) + self.model.bias.data = torch.tensor([bias]) + self.model.cuda() + self.params = list(self.model.parameters()) + + self.namespace_dls = argparse.Namespace( + optimizer="adam", + lr=[0.1], + adam_betas="(0.9, 0.999)", + adam_eps=1e-8, + weight_decay=0.0, + threshold_loss_scale=1, + min_loss_scale=1e-4, + ) + self.scaler = GradScaler( + init_scale=1, + growth_interval=1, + ) + + def run_iter(self, model, params, optimizer): + optimizer.zero_grad() + with autocast(): + y = model(self.x) + loss = self.loss_fn(y, self.target) + self.scaler.scale(loss).backward() + self.assertEqual(loss, torch.tensor(1.0, device="cuda:0", dtype=torch.float16)) + + self.scaler.unscale_(optimizer) + grad_norm = optimizer.clip_grad_norm(0) + self.assertAlmostEqual(grad_norm.item(), 2.2361, 4) + + self.scaler.step(optimizer) + self.scaler.update() + self.assertEqual( + model.weight, + torch.tensor( + [[3.1]], device="cuda:0", requires_grad=True + ), + ) + self.assertEqual( + model.bias, + torch.tensor( + [5.1], device="cuda:0", requires_grad=True + ), + ) + self.assertEqual(self.scaler.get_scale(), 2.0) + + def test_automatic_mixed_precision(self): + model = copy.deepcopy(self.model) + params = list(model.parameters()) + optimizer = build_optimizer(self.namespace_dls, params) + + self.run_iter(model, params, optimizer) diff --git a/SpeechT5/fairseq/tests/test_average_checkpoints.py b/SpeechT5/fairseq/tests/test_average_checkpoints.py new file mode 100644 index 0000000..f348b56 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_average_checkpoints.py @@ -0,0 +1,134 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import collections +import os +import shutil +import tempfile +import unittest + +import numpy as np +import torch +from scripts.average_checkpoints import average_checkpoints +from torch import nn + + +class ModelWithSharedParameter(nn.Module): + def __init__(self): + super(ModelWithSharedParameter, self).__init__() + self.embedding = nn.Embedding(1000, 200) + self.FC1 = nn.Linear(200, 200) + self.FC2 = nn.Linear(200, 200) + # tie weight in FC2 to FC1 + self.FC2.weight = nn.Parameter(self.FC1.weight) + self.FC2.bias = nn.Parameter(self.FC1.bias) + + self.relu = nn.ReLU() + + def forward(self, input): + return self.FC2(self.ReLU(self.FC1(input))) + self.FC1(input) + + +class TestAverageCheckpoints(unittest.TestCase): + def test_average_checkpoints(self): + params_0 = collections.OrderedDict( + [ + ("a", torch.DoubleTensor([100.0])), + ("b", torch.FloatTensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])), + ("c", torch.IntTensor([7, 8, 9])), + ] + ) + params_1 = collections.OrderedDict( + [ + ("a", torch.DoubleTensor([1.0])), + ("b", torch.FloatTensor([[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]])), + ("c", torch.IntTensor([2, 2, 2])), + ] + ) + params_avg = collections.OrderedDict( + [ + ("a", torch.DoubleTensor([50.5])), + ("b", torch.FloatTensor([[1.0, 1.5, 2.0], [2.5, 3.0, 3.5]])), + # We expect truncation for integer division + ("c", torch.IntTensor([4, 5, 5])), + ] + ) + + fd_0, path_0 = tempfile.mkstemp() + fd_1, path_1 = tempfile.mkstemp() + torch.save(collections.OrderedDict([("model", params_0)]), path_0) + torch.save(collections.OrderedDict([("model", params_1)]), path_1) + + output = average_checkpoints([path_0, path_1])["model"] + + os.close(fd_0) + os.remove(path_0) + os.close(fd_1) + os.remove(path_1) + + for (k_expected, v_expected), (k_out, v_out) in zip( + params_avg.items(), output.items() + ): + self.assertEqual( + k_expected, + k_out, + "Key mismatch - expected {} but found {}. " + "(Expected list of keys: {} vs actual list of keys: {})".format( + k_expected, k_out, params_avg.keys(), output.keys() + ), + ) + np.testing.assert_allclose( + v_expected.numpy(), + v_out.numpy(), + err_msg="Tensor value mismatch for key {}".format(k_expected), + ) + + def test_average_checkpoints_with_shared_parameters(self): + def _construct_model_with_shared_parameters(path, value): + m = ModelWithSharedParameter() + nn.init.constant_(m.FC1.weight, value) + torch.save({"model": m.state_dict()}, path) + return m + + tmpdir = tempfile.mkdtemp() + paths = [] + path = os.path.join(tmpdir, "m1.pt") + m1 = _construct_model_with_shared_parameters(path, 1.0) + paths.append(path) + + path = os.path.join(tmpdir, "m2.pt") + m2 = _construct_model_with_shared_parameters(path, 2.0) + paths.append(path) + + path = os.path.join(tmpdir, "m3.pt") + m3 = _construct_model_with_shared_parameters(path, 3.0) + paths.append(path) + + new_model = average_checkpoints(paths) + self.assertTrue( + torch.equal( + new_model["model"]["embedding.weight"], + (m1.embedding.weight + m2.embedding.weight + m3.embedding.weight) / 3.0, + ) + ) + + self.assertTrue( + torch.equal( + new_model["model"]["FC1.weight"], + (m1.FC1.weight + m2.FC1.weight + m3.FC1.weight) / 3.0, + ) + ) + + self.assertTrue( + torch.equal( + new_model["model"]["FC2.weight"], + (m1.FC2.weight + m2.FC2.weight + m3.FC2.weight) / 3.0, + ) + ) + shutil.rmtree(tmpdir) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_backtranslation_dataset.py b/SpeechT5/fairseq/tests/test_backtranslation_dataset.py new file mode 100644 index 0000000..dffc3b4 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_backtranslation_dataset.py @@ -0,0 +1,123 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import tests.utils as test_utils +import torch +from fairseq.data import ( + BacktranslationDataset, + LanguagePairDataset, + TransformEosDataset, +) +from fairseq.sequence_generator import SequenceGenerator + + +class TestBacktranslationDataset(unittest.TestCase): + def setUp(self): + ( + self.tgt_dict, + self.w1, + self.w2, + self.src_tokens, + self.src_lengths, + self.model, + ) = test_utils.sequence_generator_setup() + + dummy_src_samples = self.src_tokens + + self.tgt_dataset = test_utils.TestDataset(data=dummy_src_samples) + self.cuda = torch.cuda.is_available() + + def _backtranslation_dataset_helper( + self, + remove_eos_from_input_src, + remove_eos_from_output_src, + ): + tgt_dataset = LanguagePairDataset( + src=self.tgt_dataset, + src_sizes=self.tgt_dataset.sizes, + src_dict=self.tgt_dict, + tgt=None, + tgt_sizes=None, + tgt_dict=None, + ) + + generator = SequenceGenerator( + [self.model], + tgt_dict=self.tgt_dict, + max_len_a=0, + max_len_b=200, + beam_size=2, + unk_penalty=0, + ) + + backtranslation_dataset = BacktranslationDataset( + tgt_dataset=TransformEosDataset( + dataset=tgt_dataset, + eos=self.tgt_dict.eos(), + # remove eos from the input src + remove_eos_from_src=remove_eos_from_input_src, + ), + src_dict=self.tgt_dict, + backtranslation_fn=( + lambda sample: generator.generate([self.model], sample) + ), + output_collater=TransformEosDataset( + dataset=tgt_dataset, + eos=self.tgt_dict.eos(), + # if we remove eos from the input src, then we need to add it + # back to the output tgt + append_eos_to_tgt=remove_eos_from_input_src, + remove_eos_from_src=remove_eos_from_output_src, + ).collater, + cuda=self.cuda, + ) + dataloader = torch.utils.data.DataLoader( + backtranslation_dataset, + batch_size=2, + collate_fn=backtranslation_dataset.collater, + ) + backtranslation_batch_result = next(iter(dataloader)) + + eos, pad, w1, w2 = self.tgt_dict.eos(), self.tgt_dict.pad(), self.w1, self.w2 + + # Note that we sort by src_lengths and add left padding, so actually + # ids will look like: [1, 0] + expected_src = torch.LongTensor([[w1, w2, w1, eos], [pad, pad, w1, eos]]) + if remove_eos_from_output_src: + expected_src = expected_src[:, :-1] + expected_tgt = torch.LongTensor([[w1, w2, eos], [w1, w2, eos]]) + generated_src = backtranslation_batch_result["net_input"]["src_tokens"] + tgt_tokens = backtranslation_batch_result["target"] + + self.assertTensorEqual(expected_src, generated_src) + self.assertTensorEqual(expected_tgt, tgt_tokens) + + def test_backtranslation_dataset_no_eos_in_output_src(self): + self._backtranslation_dataset_helper( + remove_eos_from_input_src=False, + remove_eos_from_output_src=True, + ) + + def test_backtranslation_dataset_with_eos_in_output_src(self): + self._backtranslation_dataset_helper( + remove_eos_from_input_src=False, + remove_eos_from_output_src=False, + ) + + def test_backtranslation_dataset_no_eos_in_input_src(self): + self._backtranslation_dataset_helper( + remove_eos_from_input_src=True, + remove_eos_from_output_src=False, + ) + + def assertTensorEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertEqual(t1.ne(t2).long().sum(), 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_binaries.py b/SpeechT5/fairseq/tests/test_binaries.py new file mode 100644 index 0000000..4e20774 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_binaries.py @@ -0,0 +1,1874 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +import logging +import json +import os +import random +import sys +import tempfile +import unittest +from io import StringIO +from typing import List, Dict +import torch +from fairseq import options +from fairseq_cli import eval_lm, train +from tests.utils import ( + create_dummy_data, + generate_main, + preprocess_lm_data, + preprocess_summarization_data, + preprocess_translation_data, + create_laser_data_and_config_json, + train_translation_model, + train_language_model, +) + + +try: + import transformers # noqa + + has_hf_transformers = True +except ImportError: + has_hf_transformers = False + + +class TestTranslation(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_fconv(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fconv") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model(data_dir, "fconv_iwslt_de_en") + generate_main(data_dir) + + def test_raw(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fconv_raw") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, ["--dataset-impl", "raw"]) + train_translation_model( + data_dir, "fconv_iwslt_de_en", ["--dataset-impl", "raw"] + ) + generate_main(data_dir, ["--dataset-impl", "raw"]) + + def test_update_freq(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_update_freq") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, "fconv_iwslt_de_en", ["--update-freq", "3"] + ) + generate_main(data_dir) + + def test_max_positions(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_max_positions") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + with self.assertRaises(Exception) as context: + train_translation_model( + data_dir, + "fconv_iwslt_de_en", + ["--max-target-positions", "5"], + ) + self.assertTrue( + "skip this example with --skip-invalid-size-inputs-valid-test" + in str(context.exception) + ) + train_translation_model( + data_dir, + "fconv_iwslt_de_en", + [ + "--max-target-positions", + "5", + "--skip-invalid-size-inputs-valid-test", + ], + ) + with self.assertRaises(Exception) as context: + generate_main(data_dir) + generate_main(data_dir, ["--skip-invalid-size-inputs-valid-test"]) + + def test_generation(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_sampling") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model(data_dir, "fconv_iwslt_de_en") + generate_main( + data_dir, + [ + "--sampling", + "--temperature", + "2", + "--beam", + "2", + "--nbest", + "2", + ], + ) + generate_main( + data_dir, + [ + "--sampling", + "--sampling-topk", + "3", + "--beam", + "2", + "--nbest", + "2", + ], + ) + generate_main( + data_dir, + [ + "--sampling", + "--sampling-topp", + "0.2", + "--beam", + "2", + "--nbest", + "2", + ], + ) + generate_main( + data_dir, + [ + "--diversity-rate", + "0.5", + "--beam", + "6", + ], + ) + with self.assertRaises(ValueError): + generate_main( + data_dir, + [ + "--diverse-beam-groups", + "4", + "--match-source-len", + ], + ) + generate_main(data_dir, ["--prefix-size", "2"]) + generate_main(data_dir, ["--retain-dropout"]) + + def test_eval_bleu(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_eval_bleu") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "fconv_iwslt_de_en", + [ + "--eval-bleu", + "--eval-bleu-print-samples", + "--eval-bleu-remove-bpe", + "--eval-bleu-detok", + "space", + "--eval-bleu-args", + '{"beam": 4, "min_len": 10}', + ], + ) + + def test_lstm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_lstm") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "lstm_wiseman_iwslt_de_en", + [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--decoder-out-embed-dim", + "8", + ], + ) + generate_main(data_dir) + + def test_lstm_bidirectional(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_lstm_bidirectional") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "lstm", + [ + "--encoder-layers", + "2", + "--encoder-bidirectional", + "--encoder-hidden-size", + "16", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--decoder-out-embed-dim", + "8", + "--decoder-layers", + "2", + ], + ) + generate_main(data_dir) + + def test_transformer(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_transformer") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + ], + run_validation=True, + ) + generate_main(data_dir) + + def test_multilingual_transformer(self): + # test with all combinations of encoder/decoder lang tokens + encoder_langtok_flags = [ + [], + ["--encoder-langtok", "src"], + ["--encoder-langtok", "tgt"], + ] + decoder_langtok_flags = [[], ["--decoder-langtok"]] + with contextlib.redirect_stdout(StringIO()): + for i in range(len(encoder_langtok_flags)): + for j in range(len(decoder_langtok_flags)): + enc_ltok_flag = encoder_langtok_flags[i] + dec_ltok_flag = decoder_langtok_flags[j] + with tempfile.TemporaryDirectory( + f"test_multilingual_transformer_{i}_{j}" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + arch="multilingual_transformer", + task="multilingual_translation", + extra_flags=[ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + ] + + enc_ltok_flag + + dec_ltok_flag, + lang_flags=["--lang-pairs", "in-out,out-in"], + run_validation=True, + extra_valid_flags=enc_ltok_flag + dec_ltok_flag, + ) + generate_main( + data_dir, + extra_flags=[ + "--task", + "multilingual_translation", + "--lang-pairs", + "in-out,out-in", + "--source-lang", + "in", + "--target-lang", + "out", + ] + + enc_ltok_flag + + dec_ltok_flag, + ) + + @unittest.skipIf( + sys.platform.lower() == "darwin", "skip latent depth test on MacOS" + ) + def test_multilingual_translation_latent_depth(self): + # test with latent depth in encoder, decoder, or both + encoder_latent_layer = [[], ["--encoder-latent-layer"]] + decoder_latent_layer = [[], ["--decoder-latent-layer"]] + with contextlib.redirect_stdout(StringIO()): + for i in range(len(encoder_latent_layer)): + for j in range(len(decoder_latent_layer)): + if i == 0 and j == 0: + continue + enc_ll_flag = encoder_latent_layer[i] + dec_ll_flag = decoder_latent_layer[j] + with tempfile.TemporaryDirectory( + f"test_multilingual_translation_latent_depth_{i}_{j}" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data( + data_dir, extra_flags=["--joined-dictionary"] + ) + train_translation_model( + data_dir, + arch="latent_multilingual_transformer", + task="multilingual_translation_latent_depth", + extra_flags=[ + "--user-dir", + "examples/latent_depth/latent_depth_src", + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--share-encoders", + "--share-decoders", + "--sparsity-weight", + "0.1", + ] + + enc_ll_flag + + dec_ll_flag, + lang_flags=["--lang-pairs", "in-out,out-in"], + run_validation=True, + extra_valid_flags=[ + "--user-dir", + "examples/latent_depth/latent_depth_src", + ] + + enc_ll_flag + + dec_ll_flag, + ) + generate_main( + data_dir, + extra_flags=[ + "--user-dir", + "examples/latent_depth/latent_depth_src", + "--task", + "multilingual_translation_latent_depth", + "--lang-pairs", + "in-out,out-in", + "--source-lang", + "in", + "--target-lang", + "out", + ] + + enc_ll_flag + + dec_ll_flag, + ) + + def test_translation_multi_simple_epoch(self): + # test with all combinations of encoder/decoder lang tokens + encoder_langtok_flags = [ + [], + ["--encoder-langtok", "src"], + ["--encoder-langtok", "tgt"], + ] + decoder_langtok_flags = [[], ["--decoder-langtok"]] + with contextlib.redirect_stdout(StringIO()): + for i in range(len(encoder_langtok_flags)): + for j in range(len(decoder_langtok_flags)): + enc_ltok_flag = encoder_langtok_flags[i] + dec_ltok_flag = decoder_langtok_flags[j] + with tempfile.TemporaryDirectory( + f"test_translation_multi_simple_epoch_{i}_{j}" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data( + data_dir, extra_flags=["--joined-dictionary"] + ) + train_translation_model( + data_dir, + arch="transformer", + task="translation_multi_simple_epoch", + extra_flags=[ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--sampling-method", + "temperature", + "--sampling-temperature", + "1.5", + "--virtual-epoch-size", + "1000", + ] + + enc_ltok_flag + + dec_ltok_flag, + lang_flags=["--lang-pairs", "in-out,out-in"], + run_validation=True, + extra_valid_flags=enc_ltok_flag + dec_ltok_flag, + ) + generate_main( + data_dir, + extra_flags=[ + "--task", + "translation_multi_simple_epoch", + "--lang-pairs", + "in-out,out-in", + "--source-lang", + "in", + "--target-lang", + "out", + ] + + enc_ltok_flag + + dec_ltok_flag, + ) + + def test_translation_multi_simple_epoch_no_vepoch(self): + # test with all combinations of encoder/decoder lang tokens + with contextlib.redirect_stdout(StringIO()): + enc_ltok_flag = ["--encoder-langtok", "src"] + dec_ltok_flag = ["--decoder-langtok"] + with tempfile.TemporaryDirectory( + "test_translation_multi_simple_epoch_dict" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, extra_flags=[]) + train_translation_model( + data_dir, + arch="transformer", + task="translation_multi_simple_epoch", + extra_flags=[ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--sampling-method", + "temperature", + "--sampling-temperature", + "1.5", + ] + + enc_ltok_flag + + dec_ltok_flag, + lang_flags=["--lang-pairs", "in-out"], + run_validation=True, + extra_valid_flags=enc_ltok_flag + dec_ltok_flag, + ) + generate_main( + data_dir, + extra_flags=[ + "--task", + "translation_multi_simple_epoch", + "--lang-pairs", + "in-out", + "--source-lang", + "in", + "--target-lang", + "out", + ] + + enc_ltok_flag + + dec_ltok_flag, + ) + + def test_translation_multi_simple_epoch_dicts(self): + # test with all combinations of encoder/decoder lang tokens + with contextlib.redirect_stdout(StringIO()): + enc_ltok_flag = ["--encoder-langtok", "src"] + dec_ltok_flag = ["--decoder-langtok"] + with tempfile.TemporaryDirectory( + "test_translation_multi_simple_epoch_dict" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, extra_flags=[]) + train_translation_model( + data_dir, + arch="transformer", + task="translation_multi_simple_epoch", + extra_flags=[ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--sampling-method", + "temperature", + "--sampling-temperature", + "1.5", + "--virtual-epoch-size", + "1000", + ] + + enc_ltok_flag + + dec_ltok_flag, + lang_flags=["--lang-pairs", "in-out"], + run_validation=True, + extra_valid_flags=enc_ltok_flag + dec_ltok_flag, + ) + generate_main( + data_dir, + extra_flags=[ + "--task", + "translation_multi_simple_epoch", + "--lang-pairs", + "in-out", + "--source-lang", + "in", + "--target-lang", + "out", + ] + + enc_ltok_flag + + dec_ltok_flag, + ) + + def test_translation_multi_simple_epoch_src_tgt_dict_spec(self): + # test the specification of explicit --src-dict and --tgt-dict + with contextlib.redirect_stdout(StringIO()): + enc_ltok_flag = ["--encoder-langtok", "src"] + dec_ltok_flag = ["--decoder-langtok"] + with tempfile.TemporaryDirectory( + "test_translation_multi_simple_epoch_dict" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, extra_flags=[]) + train_translation_model( + data_dir, + arch="transformer", + task="translation_multi_simple_epoch", + extra_flags=[ + "--source-dict", + f"{data_dir}/dict.in.txt", + "--target-dict", + f"{data_dir}/dict.out.txt", + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--sampling-method", + "temperature", + "--sampling-temperature", + "1.5", + "--virtual-epoch-size", + "1000", + ] + + enc_ltok_flag + + dec_ltok_flag, + lang_flags=["--lang-pairs", "in-out"], + run_validation=True, + extra_valid_flags=enc_ltok_flag + dec_ltok_flag, + ) + generate_main( + data_dir, + extra_flags=[ + "--task", + "translation_multi_simple_epoch", + "--lang-pairs", + "in-out", + "--source-lang", + "in", + "--target-lang", + "out", + ] + + enc_ltok_flag + + dec_ltok_flag, + ) + + def test_transformer_cross_self_attention(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_transformer_cross_self_attention" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--no-cross-attention", + "--cross-self-attention", + ], + run_validation=True, + ) + generate_main(data_dir, extra_flags=[]) + + def test_transformer_pointer_generator(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_transformer_pointer_generator" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_summarization_data(data_dir) + train_translation_model( + data_dir, + "transformer_pointer_generator", + extra_flags=[ + "--user-dir", + "examples/pointer_generator/pointer_generator_src", + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--alignment-layer", + "-1", + "--alignment-heads", + "1", + "--source-position-markers", + "0", + ], + run_validation=True, + extra_valid_flags=[ + "--user-dir", + "examples/pointer_generator/pointer_generator_src", + ], + ) + generate_main( + data_dir, + extra_flags=[ + "--user-dir", + "examples/pointer_generator/pointer_generator_src", + ], + ) + + def test_lightconv(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_lightconv") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "lightconv_iwslt_de_en", + [ + "--encoder-conv-type", + "lightweight", + "--decoder-conv-type", + "lightweight", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + ], + ) + generate_main(data_dir) + + def test_dynamicconv(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_dynamicconv") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "lightconv_iwslt_de_en", + [ + "--encoder-conv-type", + "dynamic", + "--decoder-conv-type", + "dynamic", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + ], + ) + generate_main(data_dir) + + def test_cmlm_transformer(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_cmlm_transformer") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, ["--joined-dictionary"]) + train_translation_model( + data_dir, + "cmlm_transformer", + [ + "--apply-bert-init", + "--criterion", + "nat_loss", + "--noise", + "full_mask", + "--pred-length-offset", + "--length-loss-factor", + "0.1", + ], + task="translation_lev", + ) + generate_main( + data_dir, + [ + "--task", + "translation_lev", + "--iter-decode-max-iter", + "9", + "--iter-decode-eos-penalty", + "0", + "--print-step", + ], + ) + + def test_nonautoregressive_transformer(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_nonautoregressive_transformer" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, ["--joined-dictionary"]) + train_translation_model( + data_dir, + "nonautoregressive_transformer", + [ + "--apply-bert-init", + "--src-embedding-copy", + "--criterion", + "nat_loss", + "--noise", + "full_mask", + "--pred-length-offset", + "--length-loss-factor", + "0.1", + ], + task="translation_lev", + ) + generate_main( + data_dir, + [ + "--task", + "translation_lev", + "--iter-decode-max-iter", + "0", + "--iter-decode-eos-penalty", + "0", + "--print-step", + ], + ) + + # def test_nat_crf_transformer(self): + # with contextlib.redirect_stdout(StringIO()): + # with tempfile.TemporaryDirectory('test_nat_crf_transformer') as data_dir: + # create_dummy_data(data_dir) + # preprocess_translation_data(data_dir, ['--joined-dictionary']) + # train_translation_model(data_dir, 'nacrf_transformer', [ + # '--apply-bert-init', '--criterion', + # 'nat_loss', '--noise', 'full_mask', '--pred-length-offset', + # '--length-loss-factor', '0.1', + # '--word-ins-loss-factor', '0.5', + # '--crf-lowrank-approx', '1', + # '--crf-beam-approx', '1' + # ], task='translation_lev') + # generate_main(data_dir, [ + # '--task', 'translation_lev', + # '--iter-decode-max-iter', '0', + # '--iter-decode-eos-penalty', '0', + # '--print-step', + # ]) + + def test_iterative_nonautoregressive_transformer(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_iterative_nonautoregressive_transformer" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, ["--joined-dictionary"]) + train_translation_model( + data_dir, + "iterative_nonautoregressive_transformer", + [ + "--apply-bert-init", + "--src-embedding-copy", + "--criterion", + "nat_loss", + "--noise", + "full_mask", + "--stochastic-approx", + "--dae-ratio", + "0.5", + "--train-step", + "3", + ], + task="translation_lev", + ) + generate_main( + data_dir, + [ + "--task", + "translation_lev", + "--iter-decode-max-iter", + "9", + "--iter-decode-eos-penalty", + "0", + "--print-step", + ], + ) + + def test_insertion_transformer(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_insertion_transformer") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir, ["--joined-dictionary"]) + train_translation_model( + data_dir, + "insertion_transformer", + [ + "--apply-bert-init", + "--criterion", + "nat_loss", + "--noise", + "random_mask", + ], + task="translation_lev", + ) + generate_main( + data_dir, + [ + "--task", + "translation_lev", + "--iter-decode-max-iter", + "9", + "--iter-decode-eos-penalty", + "0", + "--print-step", + ], + ) + + def test_mixture_of_experts(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_moe") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + [ + "--task", + "translation_moe", + "--user-dir", + "examples/translation_moe/translation_moe_src", + "--method", + "hMoElp", + "--mean-pool-gating-network", + "--num-experts", + "3", + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + ], + ) + generate_main( + data_dir, + [ + "--task", + "translation_moe", + "--user-dir", + "examples/translation_moe/translation_moe_src", + "--method", + "hMoElp", + "--mean-pool-gating-network", + "--num-experts", + "3", + "--gen-expert", + "0", + ], + ) + + def test_alignment(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_alignment") as data_dir: + create_dummy_data(data_dir, alignment=True) + preprocess_translation_data(data_dir, ["--align-suffix", "align"]) + train_translation_model( + data_dir, + "transformer_align", + [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--load-alignments", + "--alignment-layer", + "1", + "--criterion", + "label_smoothed_cross_entropy_with_alignment", + ], + run_validation=True, + ) + generate_main(data_dir) + + def test_laser_lstm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_laser_lstm") as data_dir: + laser_config_file = create_laser_data_and_config_json(data_dir) + train_translation_model( + laser_config_file.name, + "laser_lstm", + [ + "--user-dir", + "examples/laser/laser_src", + "--weighting-alpha", + "0.3", + "--encoder-bidirectional", + "--encoder-hidden-size", + "512", + "--encoder-layers", + "5", + "--decoder-layers", + "1", + "--encoder-embed-dim", + "320", + "--decoder-embed-dim", + "320", + "--decoder-lang-embed-dim", + "32", + "--save-dir", + data_dir, + "--disable-validation", + ], + task="laser", + lang_flags=[], + ) + + def test_laser_transformer(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_laser_transformer") as data_dir: + laser_config_file = create_laser_data_and_config_json(data_dir) + train_translation_model( + laser_config_file.name, + "laser_transformer", + [ + "--user-dir", + "examples/laser/laser_src", + "--weighting-alpha", + "0.3", + "--encoder-embed-dim", + "320", + "--decoder-embed-dim", + "320", + "--decoder-lang-embed-dim", + "32", + "--save-dir", + data_dir, + "--disable-validation", + ], + task="laser", + lang_flags=[], + ) + + def test_alignment_full_context(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_alignment") as data_dir: + create_dummy_data(data_dir, alignment=True) + preprocess_translation_data(data_dir, ["--align-suffix", "align"]) + train_translation_model( + data_dir, + "transformer_align", + [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--load-alignments", + "--alignment-layer", + "1", + "--criterion", + "label_smoothed_cross_entropy_with_alignment", + "--full-context-alignment", + ], + run_validation=True, + ) + generate_main(data_dir) + + def test_transformer_layerdrop(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_transformer_layerdrop") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + [ + "--encoder-layers", + "3", + "--decoder-layers", + "3", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--encoder-layerdrop", + "0.01", + "--decoder-layerdrop", + "0.01", + ], + ) + generate_main(data_dir) + generate_main( + data_dir, + [ + "--model-overrides", + "{'encoder_layers_to_keep':'0,2','decoder_layers_to_keep':'1'}", + ], + ) + + +class TestStories(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_fconv_self_att_wp(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fconv_self_att_wp") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + config = [ + "--encoder-layers", + "[(128, 3)] * 2", + "--decoder-layers", + "[(128, 3)] * 2", + "--decoder-attention", + "True", + "--encoder-attention", + "False", + "--gated-attention", + "True", + "--self-attention", + "True", + "--project-input", + "True", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--decoder-out-embed-dim", + "8", + "--multihead-self-attention-nheads", + "2", + ] + train_translation_model(data_dir, "fconv_self_att_wp", config) + generate_main(data_dir) + + # fusion model + os.rename( + os.path.join(data_dir, "checkpoint_last.pt"), + os.path.join(data_dir, "pretrained.pt"), + ) + config.extend( + [ + "--pretrained", + "True", + "--pretrained-checkpoint", + os.path.join(data_dir, "pretrained.pt"), + "--save-dir", + os.path.join(data_dir, "fusion_model"), + ] + ) + train_translation_model(data_dir, "fconv_self_att_wp", config) + + +class TestLanguageModeling(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_fconv_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_fconv_lm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_language_model( + data_dir, + "fconv_lm", + [ + "--decoder-layers", + "[(850, 3)] * 2 + [(1024,4)]", + "--decoder-embed-dim", + "280", + "--optimizer", + "nag", + "--lr", + "0.1", + ], + ) + eval_lm_main(data_dir) + generate_main( + data_dir, + [ + "--task", + "language_modeling", + "--sample-break-mode", + "eos", + "--tokens-per-sample", + "500", + ], + ) + + def test_transformer_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_transformer_lm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_language_model( + data_dir, + "transformer_lm", + ["--add-bos-token", '--nval', '1'], + run_validation=True, + ) + eval_lm_main(data_dir) + eval_lm_main(data_dir, extra_flags=["--context-window", "25"]) + generate_main( + data_dir, + [ + "--task", + "language_modeling", + "--sample-break-mode", + "eos", + "--tokens-per-sample", + "500", + ], + ) + + def test_transformer_lm_with_adaptive_softmax(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_transformer_lm_with_adaptive_softmax" + ) as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_language_model( + data_dir, + "transformer_lm", + [ + "--add-bos-token", + "--criterion", + "adaptive_loss", + "--adaptive-softmax-cutoff", + "5,10,15", + ], + run_validation=True, + ) + eval_lm_main(data_dir) + generate_main( + data_dir, + [ + "--task", + "language_modeling", + "--sample-break-mode", + "eos", + "--tokens-per-sample", + "500", + ], + ) + + def test_lightconv_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_lightconv_lm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_language_model( + data_dir, + "lightconv_lm", + ["--add-bos-token"], + run_validation=True, + ) + eval_lm_main(data_dir) + generate_main( + data_dir, + [ + "--task", + "language_modeling", + "--sample-break-mode", + "eos", + "--tokens-per-sample", + "500", + ], + ) + + def test_lstm_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_lstm_lm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_language_model( + data_dir, + "lstm_lm", + ["--add-bos-token"], + run_validation=True, + ) + eval_lm_main(data_dir) + generate_main( + data_dir, + [ + "--task", + "language_modeling", + "--sample-break-mode", + "eos", + "--tokens-per-sample", + "500", + ], + ) + + def test_lstm_lm_residuals(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_lstm_lm_residuals") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_language_model( + data_dir, + "lstm_lm", + ["--add-bos-token", "--residuals"], + run_validation=True, + ) + eval_lm_main(data_dir) + generate_main( + data_dir, + [ + "--task", + "language_modeling", + "--sample-break-mode", + "eos", + "--tokens-per-sample", + "500", + ], + ) + + @unittest.skipIf(not has_hf_transformers, "skip test if transformers is missing") + def test_transformer_xl_bptt_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_transformer_xl_bptt_lm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + task_flags = [ + "--user-dir", + "examples/truncated_bptt", + "--task", + "truncated_bptt_lm", + "--batch-size", + "2", + "--tokens-per-sample", + "50", + ] + train_language_model( + data_dir=data_dir, + arch="transformer_xl", + extra_flags=task_flags + + [ + "--n-layer", + "2", + ], + task="truncated_bptt_lm", + run_validation=True, + extra_valid_flags=task_flags, + ) + eval_lm_main(data_dir, extra_flags=task_flags) + # Train with activation offloading + train_language_model( + data_dir=data_dir, + arch="transformer_xl", + extra_flags=task_flags + + [ + "--n-layer", + "2", + "--offload-activations", + ], + task="truncated_bptt_lm", + run_validation=True, + extra_valid_flags=task_flags, + ) + + +class TestMaskedLanguageModel(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_legacy_masked_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_legacy_mlm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_legacy_masked_language_model(data_dir, "masked_lm") + + def test_roberta_masked_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_roberta_mlm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_masked_lm( + data_dir, "roberta_base", extra_flags=["--encoder-layers", "2"] + ) + + def test_roberta_sentence_prediction(self): + num_classes = 3 + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_roberta_head") as data_dir: + create_dummy_roberta_head_data(data_dir, num_classes=num_classes) + preprocess_lm_data(os.path.join(data_dir, "input0")) + preprocess_lm_data(os.path.join(data_dir, "label")) + train_roberta_head(data_dir, "roberta_base", num_classes=num_classes) + + def test_roberta_regression_single(self): + num_classes = 1 + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_roberta_regression_single" + ) as data_dir: + create_dummy_roberta_head_data( + data_dir, num_classes=num_classes, regression=True + ) + preprocess_lm_data(os.path.join(data_dir, "input0")) + train_roberta_head( + data_dir, + "roberta_base", + num_classes=num_classes, + extra_flags=["--regression-target"], + ) + + def test_roberta_regression_multiple(self): + num_classes = 3 + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_roberta_regression_multiple" + ) as data_dir: + create_dummy_roberta_head_data( + data_dir, num_classes=num_classes, regression=True + ) + preprocess_lm_data(os.path.join(data_dir, "input0")) + train_roberta_head( + data_dir, + "roberta_base", + num_classes=num_classes, + extra_flags=["--regression-target"], + ) + + def test_linformer_roberta_masked_lm(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_linformer_roberta_mlm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_masked_lm( + data_dir, + "linformer_roberta_base", + extra_flags=[ + "--user-dir", + "examples/linformer/linformer_src", + "--encoder-layers", + "2", + ], + ) + + def test_linformer_roberta_sentence_prediction(self): + num_classes = 3 + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_linformer_roberta_head") as data_dir: + create_dummy_roberta_head_data(data_dir, num_classes=num_classes) + preprocess_lm_data(os.path.join(data_dir, "input0")) + preprocess_lm_data(os.path.join(data_dir, "label")) + train_roberta_head( + data_dir, + "linformer_roberta_base", + num_classes=num_classes, + extra_flags=["--user-dir", "examples/linformer/linformer_src"], + ) + + def test_linformer_roberta_regression_single(self): + num_classes = 1 + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_linformer_roberta_regression_single" + ) as data_dir: + create_dummy_roberta_head_data( + data_dir, num_classes=num_classes, regression=True + ) + preprocess_lm_data(os.path.join(data_dir, "input0")) + train_roberta_head( + data_dir, + "linformer_roberta_base", + num_classes=num_classes, + extra_flags=[ + "--regression-target", + "--user-dir", + "examples/linformer/linformer_src", + ], + ) + + def test_linformer_roberta_regression_multiple(self): + num_classes = 3 + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory( + "test_linformer_roberta_regression_multiple" + ) as data_dir: + create_dummy_roberta_head_data( + data_dir, num_classes=num_classes, regression=True + ) + preprocess_lm_data(os.path.join(data_dir, "input0")) + train_roberta_head( + data_dir, + "linformer_roberta_base", + num_classes=num_classes, + extra_flags=[ + "--regression-target", + "--user-dir", + "examples/linformer/linformer_src", + ], + ) + + def _test_pretrained_masked_lm_for_translation(self, learned_pos_emb, encoder_only): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_mlm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_legacy_masked_language_model( + data_dir, + arch="masked_lm", + extra_args=("--encoder-learned-pos",) if learned_pos_emb else (), + ) + with tempfile.TemporaryDirectory( + "test_mlm_translation" + ) as translation_dir: + create_dummy_data(translation_dir) + preprocess_translation_data( + translation_dir, extra_flags=["--joined-dictionary"] + ) + # Train transformer with data_dir/checkpoint_last.pt + train_translation_model( + translation_dir, + arch="transformer_from_pretrained_xlm", + extra_flags=[ + "--decoder-layers", + "1", + "--decoder-embed-dim", + "32", + "--decoder-attention-heads", + "1", + "--decoder-ffn-embed-dim", + "32", + "--encoder-layers", + "1", + "--encoder-embed-dim", + "32", + "--encoder-attention-heads", + "1", + "--encoder-ffn-embed-dim", + "32", + "--pretrained-xlm-checkpoint", + "{}/checkpoint_last.pt".format(data_dir), + "--activation-fn", + "gelu", + "--max-source-positions", + "500", + "--max-target-positions", + "500", + ] + + ( + ["--encoder-learned-pos", "--decoder-learned-pos"] + if learned_pos_emb + else [] + ) + + (["--init-encoder-only"] if encoder_only else []), + task="translation_from_pretrained_xlm", + ) + + def test_pretrained_masked_lm_for_translation_learned_pos_emb(self): + self._test_pretrained_masked_lm_for_translation(True, False) + + def test_pretrained_masked_lm_for_translation_sinusoidal_pos_emb(self): + self._test_pretrained_masked_lm_for_translation(False, False) + + def test_pretrained_masked_lm_for_translation_encoder_only(self): + self._test_pretrained_masked_lm_for_translation(True, True) + + def test_r4f_roberta(self): + num_classes = 3 + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_r4f_roberta_head") as data_dir: + create_dummy_roberta_head_data(data_dir, num_classes=num_classes) + preprocess_lm_data(os.path.join(data_dir, "input0")) + preprocess_lm_data(os.path.join(data_dir, "label")) + train_roberta_head( + data_dir, + "roberta_base", + num_classes=num_classes, + extra_flags=[ + "--user-dir", + "examples/rxf/rxf_src", + "--criterion", + "sentence_prediction_r3f", + "--spectral-norm-classification-head", + ], + ) + + +def train_legacy_masked_language_model(data_dir, arch, extra_args=()): + train_parser = options.get_training_parser() + # TODO: langs should be in and out right? + train_args = options.parse_args_and_arch( + train_parser, + [ + "--task", + "cross_lingual_lm", + data_dir, + "--arch", + arch, + # Optimizer args + "--optimizer", + "adam", + "--lr-scheduler", + "reduce_lr_on_plateau", + "--lr-shrink", + "0.5", + "--lr", + "0.0001", + "--stop-min-lr", + "1e-09", + # dropout, attention args + "--dropout", + "0.1", + "--attention-dropout", + "0.1", + # MLM args + "--criterion", + "legacy_masked_lm_loss", + "--masked-lm-only", + "--monolingual-langs", + "in,out", + "--num-segment", + "5", + # Transformer args: use a small transformer model for fast training + "--encoder-layers", + "1", + "--encoder-embed-dim", + "32", + "--encoder-attention-heads", + "1", + "--encoder-ffn-embed-dim", + "32", + # Other training args + "--max-tokens", + "500", + "--tokens-per-sample", + "500", + "--save-dir", + data_dir, + "--max-epoch", + "1", + "--no-progress-bar", + "--distributed-world-size", + "1", + "--dataset-impl", + "raw", + "--num-workers", + "0", + ] + + list(extra_args), + ) + train.main(train_args) + + +class TestOptimizers(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_optimizers(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_optimizers") as data_dir: + # Use just a bit of data and tiny model to keep this test runtime reasonable + create_dummy_data(data_dir, num_examples=10, maxlen=5) + preprocess_translation_data(data_dir) + optimizers = ["adafactor", "adam", "nag", "adagrad", "sgd", "adadelta"] + last_checkpoint = os.path.join(data_dir, "checkpoint_last.pt") + for optimizer in optimizers: + if os.path.exists(last_checkpoint): + os.remove(last_checkpoint) + train_translation_model( + data_dir, + "lstm", + [ + "--required-batch-size-multiple", + "1", + "--encoder-layers", + "1", + "--encoder-hidden-size", + "32", + "--decoder-layers", + "1", + "--optimizer", + optimizer, + ], + ) + generate_main(data_dir) + + +def read_last_log_entry( + logs: List[logging.LogRecord], logger_name: str +) -> Dict[str, float]: + for x in reversed(logs): + if x.name == logger_name: + return json.loads(x.message) + raise ValueError(f"No entries from {logger_name} found in captured logs") + + +class TestActivationCheckpointing(unittest.TestCase): + base_flags = [ + "--encoder-layers", + "2", + "--decoder-layers", + "2", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--restore-file", + "x.pt", + "--log-format", + "json", + "--log-interval", + "1", + "--max-update", + "2", + ] + + def _train(self, data_dir, extra_flags): + with self.assertLogs() as logs: + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + self.base_flags + extra_flags, + run_validation=True, + extra_valid_flags=["--log-format", "json"], + ) + return logs.records + + def test_activation_offloading_does_not_change_metrics(self): + """Neither ----checkpoint-activations nor --offload-activations should change loss""" + with tempfile.TemporaryDirectory("test_transformer_with_act_cpt") as data_dir: + + with self.assertLogs(): + create_dummy_data(data_dir, num_examples=20) + preprocess_translation_data(data_dir) + offload_logs = self._train(data_dir, ["--offload-activations"]) + baseline_logs = self._train(data_dir, []) + + assert len(baseline_logs) == len(offload_logs) + + baseline_valid_stats = read_last_log_entry(baseline_logs, "valid") + offload_valid_stats = read_last_log_entry(offload_logs, "valid") + baseline_train_stats = read_last_log_entry(baseline_logs, "train") + offload_train_stats = read_last_log_entry(offload_logs, "train") + + assert ( + baseline_train_stats["train_loss"] == offload_train_stats["train_loss"] + ) + assert ( + baseline_valid_stats["valid_loss"] == offload_valid_stats["valid_loss"] + ) + + def test_activation_checkpointing_does_not_change_metrics(self): + """--checkpoint-activations should not change loss""" + + with tempfile.TemporaryDirectory("test_transformer_with_act_cpt") as data_dir: + with self.assertLogs(): + create_dummy_data(data_dir, num_examples=20) + preprocess_translation_data(data_dir) + ckpt_logs = self._train(data_dir, ["--checkpoint-activations"]) + baseline_logs = self._train(data_dir, []) + assert len(baseline_logs) == len(ckpt_logs) + + baseline_train_stats = read_last_log_entry(baseline_logs, "train") + ckpt_train_stats = read_last_log_entry(ckpt_logs, "train") + assert baseline_train_stats["train_loss"] == ckpt_train_stats["train_loss"] + + baseline_valid_stats = read_last_log_entry(baseline_logs, "valid") + ckpt_valid_stats = read_last_log_entry(ckpt_logs, "valid") + assert baseline_valid_stats["valid_loss"] == ckpt_valid_stats["valid_loss"] + + +def create_dummy_roberta_head_data( + data_dir, num_examples=100, maxlen=10, num_classes=2, regression=False +): + input_dir = "input0" + + def _create_dummy_data(filename): + random_data = torch.rand(num_examples * maxlen) + input_data = 97 + torch.floor(26 * random_data).int() + if regression: + output_data = torch.rand((num_examples, num_classes)) + else: + output_data = 1 + torch.floor(num_classes * torch.rand(num_examples)).int() + with open(os.path.join(data_dir, input_dir, filename + ".out"), "w") as f_in: + label_filename = filename + ".label" if regression else filename + ".out" + with open(os.path.join(data_dir, "label", label_filename), "w") as f_out: + offset = 0 + for i in range(num_examples): + # write example input + ex_len = random.randint(1, maxlen) + ex_str = " ".join(map(chr, input_data[offset : offset + ex_len])) + print(ex_str, file=f_in) + # write example label + if regression: + class_str = " ".join(map(str, output_data[i].numpy())) + print(class_str, file=f_out) + else: + class_str = "class{}".format(output_data[i]) + print(class_str, file=f_out) + offset += ex_len + + os.mkdir(os.path.join(data_dir, input_dir)) + os.mkdir(os.path.join(data_dir, "label")) + _create_dummy_data("train") + _create_dummy_data("valid") + _create_dummy_data("test") + + +def train_masked_lm(data_dir, arch, extra_flags=None): + train_parser = options.get_training_parser() + train_args = options.parse_args_and_arch( + train_parser, + [ + "--task", + "masked_lm", + data_dir, + "--arch", + arch, + "--optimizer", + "adam", + "--lr", + "0.0001", + "--criterion", + "masked_lm", + "--batch-size", + "500", + "--save-dir", + data_dir, + "--max-epoch", + "1", + "--no-progress-bar", + "--distributed-world-size", + "1", + "--ddp-backend", + "no_c10d", + "--num-workers", + "0", + ] + + (extra_flags or []), + ) + train.main(train_args) + + +def train_roberta_head(data_dir, arch, num_classes=2, extra_flags=None): + train_parser = options.get_training_parser() + train_args = options.parse_args_and_arch( + train_parser, + [ + "--task", + "sentence_prediction", + data_dir, + "--arch", + arch, + "--encoder-layers", + "2", + "--num-classes", + str(num_classes), + "--optimizer", + "adam", + "--lr", + "0.0001", + "--criterion", + "sentence_prediction", + "--max-tokens", + "500", + "--max-positions", + "500", + "--batch-size", + "500", + "--save-dir", + data_dir, + "--max-epoch", + "1", + "--no-progress-bar", + "--distributed-world-size", + "1", + "--ddp-backend", + "no_c10d", + "--num-workers", + "0", + ] + + (extra_flags or []), + ) + train.main(train_args) + + +def eval_lm_main(data_dir, extra_flags=None): + eval_lm_parser = options.get_eval_lm_parser() + eval_lm_args = options.parse_args_and_arch( + eval_lm_parser, + [ + data_dir, + "--path", + os.path.join(data_dir, "checkpoint_last.pt"), + "--no-progress-bar", + "--num-workers", + "0", + ] + + (extra_flags or []), + ) + eval_lm.main(eval_lm_args) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_character_token_embedder.py b/SpeechT5/fairseq/tests/test_character_token_embedder.py new file mode 100644 index 0000000..24940eb --- /dev/null +++ b/SpeechT5/fairseq/tests/test_character_token_embedder.py @@ -0,0 +1,48 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +from fairseq.data import Dictionary +from fairseq.modules import CharacterTokenEmbedder + + +class TestCharacterTokenEmbedder(unittest.TestCase): + def test_character_token_embedder(self): + vocab = Dictionary() + vocab.add_symbol("hello") + vocab.add_symbol("there") + + embedder = CharacterTokenEmbedder( + vocab, [(2, 16), (4, 32), (8, 64), (16, 2)], 64, 5, 2 + ) + + test_sents = [["hello", "unk", "there"], ["there"], ["hello", "there"]] + max_len = max(len(s) for s in test_sents) + input = torch.LongTensor(len(test_sents), max_len + 2).fill_(vocab.pad()) + for i in range(len(test_sents)): + input[i][0] = vocab.eos() + for j in range(len(test_sents[i])): + input[i][j + 1] = vocab.index(test_sents[i][j]) + input[i][j + 2] = vocab.eos() + embs = embedder(input) + + assert embs.size() == (len(test_sents), max_len + 2, 5) + self.assertAlmostEqual(embs[0][0], embs[1][0]) + self.assertAlmostEqual(embs[0][0], embs[0][-1]) + self.assertAlmostEqual(embs[0][1], embs[2][1]) + self.assertAlmostEqual(embs[0][3], embs[1][1]) + + embs.sum().backward() + assert embedder.char_embeddings.weight.grad is not None + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess((t1 - t2).abs().max(), 1e-6) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_checkpoint_utils.py b/SpeechT5/fairseq/tests/test_checkpoint_utils.py new file mode 100644 index 0000000..0f28222 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_checkpoint_utils.py @@ -0,0 +1,106 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +import logging +import os +import tempfile +import unittest +from io import StringIO +from unittest.mock import patch + +from fairseq import checkpoint_utils +from omegaconf import OmegaConf + +from tests.utils import ( + create_dummy_data, + preprocess_translation_data, + train_translation_model, +) + + +class TestCheckpointUtils(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + @contextlib.contextmanager + def _train_transformer(self, seed, extra_args=None): + if extra_args is None: + extra_args = [] + with tempfile.TemporaryDirectory(f"_train_transformer_seed{seed}") as data_dir: + create_dummy_data(data_dir) + preprocess_translation_data(data_dir) + train_translation_model( + data_dir, + "transformer_iwslt_de_en", + [ + "--encoder-layers", + "3", + "--decoder-layers", + "3", + "--encoder-embed-dim", + "8", + "--decoder-embed-dim", + "8", + "--seed", + str(seed), + ] + + extra_args, + ) + yield os.path.join(data_dir, "checkpoint_last.pt") + + def test_load_model_ensemble_and_task(self): + # with contextlib.redirect_stdout(StringIO()): + with self._train_transformer(seed=123) as model1: + with self._train_transformer(seed=456) as model2: + ensemble, cfg, task = checkpoint_utils.load_model_ensemble_and_task( + filenames=[model1, model2] + ) + self.assertEqual(len(ensemble), 2) + + # after Transformer has been migrated to Hydra, this will probably + # become cfg.common.seed + self.assertEqual(ensemble[0].args.seed, 123) + self.assertEqual(ensemble[1].args.seed, 456) + + # the task from the first model should be returned + self.assertTrue("seed123" in task.cfg.data) + + # last cfg is saved + self.assertEqual(cfg.common.seed, 456) + + def test_prune_state_dict(self): + with contextlib.redirect_stdout(StringIO()): + extra_args = ["--encoder-layerdrop", "0.01", "--decoder-layerdrop", "0.01"] + with self._train_transformer(seed=1, extra_args=extra_args) as model: + ensemble, cfg, task = checkpoint_utils.load_model_ensemble_and_task( + filenames=[model], + arg_overrides={ + "encoder_layers_to_keep": "0,2", + "decoder_layers_to_keep": "1", + }, + ) + self.assertEqual(len(ensemble), 1) + self.assertEqual(len(ensemble[0].encoder.layers), 2) + self.assertEqual(len(ensemble[0].decoder.layers), 1) + + def test_torch_persistent_save_async(self): + state_dict = {} + filename = "async_checkpoint.pt" + + with patch(f"{checkpoint_utils.__name__}.PathManager.opena") as mock_opena: + with patch(f"{checkpoint_utils.__name__}._torch_persistent_save") as mock_save: + checkpoint_utils.torch_persistent_save( + state_dict, filename, async_write=True + ) + mock_opena.assert_called_with(filename, "wb") + mock_save.assert_called() + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_concat_dataset.py b/SpeechT5/fairseq/tests/test_concat_dataset.py new file mode 100644 index 0000000..d94aeff --- /dev/null +++ b/SpeechT5/fairseq/tests/test_concat_dataset.py @@ -0,0 +1,58 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +from fairseq.data import LanguagePairDataset, TokenBlockDataset +from fairseq.data.concat_dataset import ConcatDataset +from tests.test_train import mock_dict + + +class TestConcatDataset(unittest.TestCase): + def setUp(self): + d = mock_dict() + tokens_1 = torch.LongTensor([1]).view(1, -1) + tokens_ds1 = TokenBlockDataset( + tokens_1, + sizes=[tokens_1.size(-1)], + block_size=1, + pad=0, + eos=1, + include_targets=False, + ) + self.dataset_1 = LanguagePairDataset( + tokens_ds1, tokens_ds1.sizes, d, shuffle=False + ) + tokens_2 = torch.LongTensor([2]).view(1, -1) + tokens_ds2 = TokenBlockDataset( + tokens_2, + sizes=[tokens_2.size(-1)], + block_size=1, + pad=0, + eos=1, + include_targets=False, + ) + self.dataset_2 = LanguagePairDataset( + tokens_ds2, tokens_ds2.sizes, d, shuffle=False + ) + + def test_concat_dataset_basics(self): + d = ConcatDataset([self.dataset_1, self.dataset_2]) + assert len(d) == 2 + assert d[0]["source"][0] == 1 + assert d[1]["source"][0] == 2 + + d = ConcatDataset([self.dataset_1, self.dataset_2], sample_ratios=[1, 2]) + assert len(d) == 3 + assert d[0]["source"][0] == 1 + assert d[1]["source"][0] == 2 + assert d[2]["source"][0] == 2 + + d = ConcatDataset([self.dataset_1, self.dataset_2], sample_ratios=[2, 1]) + assert len(d) == 3 + assert d[0]["source"][0] == 1 + assert d[1]["source"][0] == 1 + assert d[2]["source"][0] == 2 diff --git a/SpeechT5/fairseq/tests/test_constraints.py b/SpeechT5/fairseq/tests/test_constraints.py new file mode 100644 index 0000000..1c37f7e --- /dev/null +++ b/SpeechT5/fairseq/tests/test_constraints.py @@ -0,0 +1,269 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import sys +import unittest + +import torch +from fairseq.token_generation_constraints import * + + +def tensorize(constraints: List[List[int]]) -> torch.Tensor: + return [torch.tensor(x) for x in constraints] + + +class TestHelperRoutines(unittest.TestCase): + def setUp(self): + self.examples = [ + ([[]], torch.tensor([[0]])), + ([[], []], torch.tensor([[0], [0]])), + ([[torch.tensor([1, 2])], []], torch.tensor([[1, 1, 2, 0], [0, 0, 0, 0]])), + ( + [ + [ + torch.tensor([3, 1, 2]), + torch.tensor([3]), + torch.tensor([4, 5, 6, 7]), + ], + [], + [torch.tensor([1, 8, 9, 10, 1, 4, 11, 12])], + ], + torch.tensor( + [ + [3, 3, 1, 2, 0, 3, 0, 4, 5, 6, 7, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 1, 8, 9, 10, 1, 4, 11, 12, 0, 0, 0], + ] + ), + ), + ] + + def test_packing(self): + """Ensures the list of lists of tensors gets packed correctly.""" + for batch_constraints, expected_tensor in self.examples: + packed = pack_constraints(batch_constraints) + assert torch.equal(packed, expected_tensor) + + +class TestUnorderedConstraintState(unittest.TestCase): + def setUp(self): + # Tuples of (contraint set, expected printed graph, token counts per node) + self.examples = [ + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + "([None].False#6 ([1].True#4 ([2].False#1 [3].True#1) [3].True#1 [4].True#1) ([4].False#2 ([5].True#2 ([6].False#1 [7].True#1))))", + {1: 4, 2: 1, 3: 2, 4: 3, 5: 2, 6: 1, 7: 1}, + ), + ([], "[None].False#0", {}), + (tensorize([[0]]), "([None].False#1 [0].True#1)", {0: 1}), + ( + tensorize([[100000, 1, 2, 3, 4, 5]]), + "([None].False#1 ([100000].False#1 ([1].False#1 ([2].False#1 ([3].False#1 ([4].False#1 [5].True#1))))))", + {100000: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1}, + ), + ( + tensorize([[1, 2], [1, 2]]), + "([None].False#2 ([1].False#2 [2].True#2))", + {1: 2, 2: 2}, + ), + ( + tensorize([[1, 2], [3, 4]]), + "([None].False#2 ([1].False#1 [2].True#1) ([3].False#1 [4].True#1))", + {1: 1, 2: 1, 3: 1, 4: 1}, + ), + ] + + self.sequences = [ + ( + self.examples[0][0], + [], + {"bank": 0, "num_completed": 0, "finished": False, "is_root": True}, + ), + ( + self.examples[0][0], + [1, 2], + {"bank": 2, "num_completed": 0, "finished": False, "is_root": False}, + ), + ( + self.examples[0][0], + [1, 2, 94], + {"bank": 1, "num_completed": 1, "finished": False, "is_root": True}, + ), + ( + self.examples[0][0], + [1, 3, 999, 1, 4], + {"bank": 4, "num_completed": 2, "finished": False, "is_root": False}, + ), + ( + self.examples[0][0], + [1, 3, 999, 1, 4, 999], + {"bank": 4, "num_completed": 2, "finished": False, "is_root": True}, + ), + ( + self.examples[0][0], + [4, 5, 6, 8], + {"bank": 2, "num_completed": 1, "finished": False, "is_root": True}, + ), + ( + self.examples[0][0], + # Tricky, because in last three, goes down [1->4] branch, could miss [1] and [4->5] + # [[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]], + [1, 2, 3, 1, 3, 1, 4, 4, 5, 6, 7, 1, 4, 5], + {"bank": 14, "num_completed": 6, "finished": True, "is_root": False}, + ), + ( + self.examples[0][0], + [1, 2, 3, 999, 1, 3, 1, 4, 4, 5, 6, 7, 1, 4, 5, 117], + {"bank": 14, "num_completed": 6, "finished": True, "is_root": True}, + ), + ( + tensorize([[1], [2, 3]]), + # Should not be able to get credit for entering 1 a second time + [1, 1], + {"bank": 1, "num_completed": 1, "finished": False, "is_root": True}, + ), + ( + self.examples[4][0], + [1, 2, 1, 2], + {"bank": 4, "num_completed": 2, "finished": True, "is_root": False}, + ), + ( + self.examples[4][0], + [1, 2, 1, 2, 1], + {"bank": 4, "num_completed": 2, "finished": True, "is_root": True}, + ), + ( + self.examples[5][0], + [1, 2, 3, 4, 5], + {"bank": 4, "num_completed": 2, "finished": True, "is_root": True}, + ), + ] + + def test_graphs(self): + """ + Test whether unordered graph systems are created correctly. + """ + for example in self.examples: + constraints, expected, gold_counts = example + c = ConstraintNode.create(constraints) + assert ( + ConstraintNode.print_graph(c) == expected + ), f"got {ConstraintNode.print_graph(c)}, expected {expected}" + assert ( + c.token_counts() == gold_counts + ), f"{c} got {c.token_counts()} wanted {gold_counts}" + + def test_next_tokens(self): + """ + Tests that the set of next tokens is correct. + """ + for example in self.examples: + constraints, expected, gold_counts = example + root = ConstraintNode.create(constraints) + + root_tokens = set(root.children.keys()) + for sequence in constraints: + state = UnorderedConstraintState(root) + for token in sequence: + all_tokens = root_tokens.union(state.node.children.keys()) + assert ( + all_tokens == state.next_tokens() + ), f"ALL {all_tokens} NEXT {state.next_tokens()}" + state = state.advance(token) + + def test_sequences(self): + for constraints, tokens, expected in self.sequences: + state = UnorderedConstraintState.create(pack_constraints([constraints])[0]) + for token in tokens: + state = state.advance(token) + result = {} + for attr in expected.keys(): + result[attr] = getattr(state, attr) + + assert ( + result == expected + ), f"TEST({tokens}) GOT: {result} WANTED: {expected}" + + +class TestOrderedConstraintState(unittest.TestCase): + def setUp(self): + self.sequences = [ + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [], + {"bank": 0, "num_completed": 0, "finished": False, "is_root": True}, + ), + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [1, 2], + {"bank": 2, "num_completed": 0, "finished": False, "is_root": False}, + ), + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [1, 2, 94], + {"bank": 0, "num_completed": 0, "finished": False, "is_root": True}, + ), + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [1, 3, 999, 1, 4], + {"bank": 0, "num_completed": 0, "finished": False, "is_root": True}, + ), + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [1, 2, 3, 999, 999], + {"bank": 3, "num_completed": 1, "finished": False, "is_root": False}, + ), + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [1, 2, 3, 77, 1, 3, 1], + {"bank": 6, "num_completed": 2, "finished": False, "is_root": False}, + ), + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [1, 2, 3, 1, 3, 1, 4, 4, 5, 6, 7, 1, 4, 5], + {"bank": 14, "num_completed": 6, "finished": True, "is_root": False}, + ), + ( + tensorize([[1, 2, 3], [1, 3], [1, 4], [4, 5, 6, 7], [1], [4, 5]]), + [1, 2, 999, 1, 2, 3, 999, 1, 3, 1, 4, 4, 5, 6, 7, 1, 4, 5, 117], + {"bank": 14, "num_completed": 6, "finished": True, "is_root": False}, + ), + ( + tensorize([[1], [2, 3]]), + [1, 1], + {"bank": 1, "num_completed": 1, "finished": False, "is_root": False}, + ), + ( + tensorize([[1, 2], [1, 2]]), + [1, 2, 1, 2], + {"bank": 4, "num_completed": 2, "finished": True, "is_root": False}, + ), + ( + tensorize([[1, 2], [1, 2]]), + [1, 2, 1, 2, 1], + {"bank": 4, "num_completed": 2, "finished": True, "is_root": False}, + ), + ( + tensorize([[1, 2], [3, 4]]), + [1, 2, 3, 4, 5], + {"bank": 4, "num_completed": 2, "finished": True, "is_root": False}, + ), + ] + + def test_sequences(self): + for i, (constraints, tokens, expected) in enumerate(self.sequences): + state = OrderedConstraintState.create(pack_constraints([constraints])[0]) + for token in tokens: + state = state.advance(token) + result = {} + for attr in expected.keys(): + result[attr] = getattr(state, attr) + assert ( + result == expected + ), f"TEST({tokens}) GOT: {result} WANTED: {expected}" + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_convtbc.py b/SpeechT5/fairseq/tests/test_convtbc.py new file mode 100644 index 0000000..3a3c9b9 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_convtbc.py @@ -0,0 +1,54 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +import torch.nn as nn +from fairseq.modules import ConvTBC + + +class TestConvTBC(unittest.TestCase): + def test_convtbc(self): + # ksz, in_channels, out_channels + conv_tbc = ConvTBC(4, 5, kernel_size=3, padding=1) + # out_channels, in_channels, ksz + conv1d = nn.Conv1d(4, 5, kernel_size=3, padding=1) + + conv_tbc.weight.data.copy_(conv1d.weight.data.transpose(0, 2)) + conv_tbc.bias.data.copy_(conv1d.bias.data) + + input_tbc = torch.randn(7, 2, 4, requires_grad=True) + input1d = input_tbc.data.transpose(0, 1).transpose(1, 2) + input1d.requires_grad = True + + output_tbc = conv_tbc(input_tbc) + output1d = conv1d(input1d) + + self.assertAlmostEqual( + output_tbc.data.transpose(0, 1).transpose(1, 2), output1d.data + ) + + grad_tbc = torch.randn(output_tbc.size()) + grad1d = grad_tbc.transpose(0, 1).transpose(1, 2).contiguous() + + output_tbc.backward(grad_tbc) + output1d.backward(grad1d) + + self.assertAlmostEqual( + conv_tbc.weight.grad.data.transpose(0, 2), conv1d.weight.grad.data + ) + self.assertAlmostEqual(conv_tbc.bias.grad.data, conv1d.bias.grad.data) + self.assertAlmostEqual( + input_tbc.grad.data.transpose(0, 1).transpose(1, 2), input1d.grad.data + ) + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess((t1 - t2).abs().max(), 1e-4) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_data_utils.py b/SpeechT5/fairseq/tests/test_data_utils.py new file mode 100644 index 0000000..2acfc8d --- /dev/null +++ b/SpeechT5/fairseq/tests/test_data_utils.py @@ -0,0 +1,136 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import numpy as np +from fairseq.data.data_utils_fast import batch_by_size_fn +from fairseq.data.data_utils_fast import batch_by_size_vec + + +class TestBatchBySize(unittest.TestCase): + @classmethod + def batch_by_size_baseline( + cls, + indices, + num_tokens_vec, + max_tokens, + max_sentences, + bsz_mult, + ): + """Simple, reliable and slow implementation of batch by size """ + batches = [] + start = 0 + while start < len(indices): + for end in range(start + 1, len(indices) + 1): + max_val = max(num_tokens_vec[pos] for pos in range(start, end)) + sent_count = end - start + num_tokens = max_val * sent_count + overflow = num_tokens > max_tokens > 0 or sent_count > max_sentences > 0 + terminate = overflow or end == len(indices) + if overflow: + sent_count -= 1 + if terminate: + if sent_count > bsz_mult: + sent_count = sent_count - sent_count % bsz_mult + batches.append(indices[start : start + sent_count]) + start = start + sent_count + break + return batches + + @classmethod + def _get_error_message( + cls, max_sentences, max_tokens, bsz_mult, num_tokens_vec, validation, results + ): + return f"""Reference batch_by_size implementation should produce + same output as the baseline method. + Params: + max_sentences={max_sentences}, + max_tokens={max_tokens}, + bsz_mult={bsz_mult}, + num_tokens_vec={num_tokens_vec}, + expected_batches={validation}, + returned_batches={results}""" + + def _compare_results( + self, + indices_len, + batch_by_size_impl, + max_sentences, + max_tokens, + bsz_mult, + num_tokens_vec, + ): + indices = np.array(list(range(indices_len))) + validation = self.batch_by_size_baseline( + indices, + num_tokens_vec, + max_tokens=max_tokens, + max_sentences=max_sentences, + bsz_mult=bsz_mult, + ) + results = batch_by_size_impl( + indices, + num_tokens_vec, + max_tokens=max_tokens, + max_sentences=max_sentences, + bsz_mult=bsz_mult, + ) + error_msg = self._get_error_message( + max_sentences, max_tokens, bsz_mult, num_tokens_vec, validation, results + ) + self.assertEqual(len(validation), len(results), error_msg) + for first, second in zip(validation, results): + self.assertTrue(np.array_equal(first, second), error_msg) + + def _run_compare_with_baseline_sweep(self, batch_by_size_impl): + """Compare reference batch_by_size implementation with batch_by_size_baseline + across a dense grid of hyperparam values""" + MAX_MAX_TOKENS = 10 + NUM_TOKENS_VECS_COUNT = 5 + for indices_len in [10, 11]: # try odd and even len of indices + for max_sentences in range(0, indices_len + 2): + for max_tokens in range(0, MAX_MAX_TOKENS): + for bsz_mult in range(1, max(MAX_MAX_TOKENS, indices_len) + 2): + for _ in range(NUM_TOKENS_VECS_COUNT): + num_tokens_vec = np.random.randint( + 0, max_tokens + 1, size=indices_len + ) + self._compare_results( + indices_len, + batch_by_size_impl, + max_sentences, + max_tokens, + bsz_mult, + num_tokens_vec, + ) + + +class TestBatchBySizeVec(TestBatchBySize): + def test_compare_with_baseline(self): + self._run_compare_with_baseline_sweep(batch_by_size_vec) + + +class TestBatchBySizeFn(TestBatchBySize): + def test_compare_with_baseline(self): + def batch_by_size_fn_wrapper( + indices, + num_tokens_vec, + max_tokens, + max_sentences, + bsz_mult, + ): + def num_tokens_fn(idx): + return num_tokens_vec[idx] + + return batch_by_size_fn( + indices, num_tokens_fn, max_tokens, max_sentences, bsz_mult + ) + + self._run_compare_with_baseline_sweep(batch_by_size_fn_wrapper) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_dataset.py b/SpeechT5/fairseq/tests/test_dataset.py new file mode 100644 index 0000000..a3e3970 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_dataset.py @@ -0,0 +1,66 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import unittest +from typing import Sequence + +from fairseq.data import LanguagePairDataset, ListDataset, RoundRobinZipDatasets +from tests.test_train import mock_dict + + +def lang_pair_dataset(lengths: Sequence[int]) -> LanguagePairDataset: + tokens = [[i] * l for i, l in enumerate(lengths)] + return LanguagePairDataset(ListDataset(tokens), lengths, mock_dict()) + + +def sample(id: int, length: int): + return {"id": id, "source": [id] * length, "target": None} + + +class TestDataset(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_round_robin_zip_datasets(self): + long_dataset = lang_pair_dataset([10, 9, 8, 11]) + short_dataset = lang_pair_dataset([11, 9]) + + dataset = RoundRobinZipDatasets({"a": long_dataset, "b": short_dataset}) + # Dataset is now sorted by sentence length + dataset.ordered_indices() + assert dataset.longest_dataset is long_dataset + self.assertEqual(dict(dataset[0]), {"a": sample(2, 8), "b": sample(1, 9)}) + # The item 2 of dataset 'a' is with item (2 % 2 = 0) of dataset 'b' + self.assertEqual(dict(dataset[2]), {"a": sample(0, 10), "b": sample(1, 9)}) + + def test_round_robin_zip_datasets_filtered(self): + long_dataset = lang_pair_dataset([10, 20, 8, 11, 1000, 7, 12]) + short_dataset = lang_pair_dataset([11, 20, 9, 1000]) + + dataset = RoundRobinZipDatasets({"a": long_dataset, "b": short_dataset}) + # Dataset is now sorted by sentence length + idx = dataset.ordered_indices() + idx, _ = dataset.filter_indices_by_size(idx, {"a": 19, "b": 900}) + self.assertEqual(list(idx), [0, 1, 2, 3, 4]) + self.assertEqual(dict(dataset[0]), {"a": sample(5, 7), "b": sample(2, 9)}) + self.assertEqual(dict(dataset[2]), {"a": sample(0, 10), "b": sample(1, 20)}) + self.assertEqual(dict(dataset[4]), {"a": sample(6, 12), "b": sample(0, 11)}) + + def test_round_robin_zip_datasets_filtered_with_tuple(self): + long_dataset = lang_pair_dataset([10, 20, 8, 11, 1000, 7, 12]) + short_dataset = lang_pair_dataset([11, 20, 9, 1000]) + + dataset = RoundRobinZipDatasets({"a": long_dataset, "b": short_dataset}) + # Dataset is now sorted by sentence length + idx = dataset.ordered_indices() + idx, _ = dataset.filter_indices_by_size(idx, 19) + self.assertEqual(list(idx), [0, 1, 2, 3, 4]) + self.assertEqual(dict(dataset[0]), {"a": sample(5, 7), "b": sample(2, 9)}) + self.assertEqual(dict(dataset[2]), {"a": sample(0, 10), "b": sample(2, 9)}) + self.assertEqual(dict(dataset[4]), {"a": sample(6, 12), "b": sample(2, 9)}) diff --git a/SpeechT5/fairseq/tests/test_dictionary.py b/SpeechT5/fairseq/tests/test_dictionary.py new file mode 100644 index 0000000..81ce102 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_dictionary.py @@ -0,0 +1,116 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import io +import tempfile +import unittest + +import torch +from fairseq.data import Dictionary + + +class TestDictionary(unittest.TestCase): + def test_finalize(self): + txt = [ + "A B C D", + "B C D", + "C D", + "D", + ] + ref_ids1 = list( + map( + torch.IntTensor, + [ + [4, 5, 6, 7, 2], + [5, 6, 7, 2], + [6, 7, 2], + [7, 2], + ], + ) + ) + ref_ids2 = list( + map( + torch.IntTensor, + [ + [7, 6, 5, 4, 2], + [6, 5, 4, 2], + [5, 4, 2], + [4, 2], + ], + ) + ) + + # build dictionary + d = Dictionary() + for line in txt: + d.encode_line(line, add_if_not_exist=True) + + def get_ids(dictionary): + ids = [] + for line in txt: + ids.append(dictionary.encode_line(line, add_if_not_exist=False)) + return ids + + def assertMatch(ids, ref_ids): + for toks, ref_toks in zip(ids, ref_ids): + self.assertEqual(toks.size(), ref_toks.size()) + self.assertEqual(0, (toks != ref_toks).sum().item()) + + ids = get_ids(d) + assertMatch(ids, ref_ids1) + + # check finalized dictionary + d.finalize() + finalized_ids = get_ids(d) + assertMatch(finalized_ids, ref_ids2) + + # write to disk and reload + with tempfile.NamedTemporaryFile(mode="w") as tmp_dict: + d.save(tmp_dict.name) + d = Dictionary.load(tmp_dict.name) + reload_ids = get_ids(d) + assertMatch(reload_ids, ref_ids2) + assertMatch(finalized_ids, reload_ids) + + def test_overwrite(self): + # for example, Camembert overwrites <unk>, <s> and </s> + dict_file = io.StringIO( + "<unk> 999 #fairseq:overwrite\n" + "<s> 999 #fairseq:overwrite\n" + "</s> 999 #fairseq:overwrite\n" + ", 999\n" + "▁de 999\n" + ) + d = Dictionary() + d.add_from_file(dict_file) + self.assertEqual(d.index("<pad>"), 1) + self.assertEqual(d.index("foo"), 3) + self.assertEqual(d.index("<unk>"), 4) + self.assertEqual(d.index("<s>"), 5) + self.assertEqual(d.index("</s>"), 6) + self.assertEqual(d.index(","), 7) + self.assertEqual(d.index("▁de"), 8) + + def test_no_overwrite(self): + # for example, Camembert overwrites <unk>, <s> and </s> + dict_file = io.StringIO( + "<unk> 999\n" "<s> 999\n" "</s> 999\n" ", 999\n" "▁de 999\n" + ) + d = Dictionary() + with self.assertRaisesRegex(RuntimeError, "Duplicate"): + d.add_from_file(dict_file) + + def test_space(self): + # for example, character models treat space as a symbol + dict_file = io.StringIO(" 999\n" "a 999\n" "b 999\n") + d = Dictionary() + d.add_from_file(dict_file) + self.assertEqual(d.index(" "), 4) + self.assertEqual(d.index("a"), 5) + self.assertEqual(d.index("b"), 6) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_export.py b/SpeechT5/fairseq/tests/test_export.py new file mode 100644 index 0000000..b380697 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_export.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import tempfile +import unittest + +import torch +from fairseq.data.dictionary import Dictionary +from fairseq.models.transformer import TransformerModel +from fairseq.modules import multihead_attention, sinusoidal_positional_embedding +from fairseq.tasks.fairseq_task import LegacyFairseqTask + + +DEFAULT_TEST_VOCAB_SIZE = 100 + + +class DummyTask(LegacyFairseqTask): + def __init__(self, args): + super().__init__(args) + self.dictionary = get_dummy_dictionary() + if getattr(self.args, "ctc", False): + self.dictionary.add_symbol("<ctc_blank>") + self.src_dict = self.dictionary + self.tgt_dict = self.dictionary + + @property + def source_dictionary(self): + return self.src_dict + + @property + def target_dictionary(self): + return self.dictionary + + +def get_dummy_dictionary(vocab_size=DEFAULT_TEST_VOCAB_SIZE): + dummy_dict = Dictionary() + # add dummy symbol to satisfy vocab size + for id, _ in enumerate(range(vocab_size)): + dummy_dict.add_symbol("{}".format(id), 1000) + return dummy_dict + + +def get_dummy_task_and_parser(): + """ + Return a dummy task and argument parser, which can be used to + create a model/criterion. + """ + parser = argparse.ArgumentParser( + description="test_dummy_s2s_task", argument_default=argparse.SUPPRESS + ) + DummyTask.add_args(parser) + args = parser.parse_args([]) + task = DummyTask.setup_task(args) + return task, parser + + +def _test_save_and_load(scripted_module): + with tempfile.NamedTemporaryFile() as f: + scripted_module.save(f.name) + torch.jit.load(f.name) + + +class TestExportModels(unittest.TestCase): + def test_export_multihead_attention(self): + module = multihead_attention.MultiheadAttention(embed_dim=8, num_heads=2) + scripted = torch.jit.script(module) + _test_save_and_load(scripted) + + def test_incremental_state_multihead_attention(self): + module1 = multihead_attention.MultiheadAttention(embed_dim=8, num_heads=2) + module1 = torch.jit.script(module1) + module2 = multihead_attention.MultiheadAttention(embed_dim=8, num_heads=2) + module2 = torch.jit.script(module2) + + state = {} + state = module1.set_incremental_state(state, "key", {"a": torch.tensor([1])}) + state = module2.set_incremental_state(state, "key", {"a": torch.tensor([2])}) + v1 = module1.get_incremental_state(state, "key")["a"] + v2 = module2.get_incremental_state(state, "key")["a"] + + self.assertEqual(v1, 1) + self.assertEqual(v2, 2) + + def test_positional_embedding(self): + module = sinusoidal_positional_embedding.SinusoidalPositionalEmbedding( + embedding_dim=8, padding_idx=1 + ) + scripted = torch.jit.script(module) + _test_save_and_load(scripted) + + @unittest.skipIf( + torch.__version__ < "1.6.0", "Targeting OSS scriptability for the 1.6 release" + ) + def test_export_transformer(self): + task, parser = get_dummy_task_and_parser() + TransformerModel.add_args(parser) + args = parser.parse_args([]) + model = TransformerModel.build_model(args, task) + scripted = torch.jit.script(model) + _test_save_and_load(scripted) + + @unittest.skipIf( + torch.__version__ < "1.6.0", "Targeting OSS scriptability for the 1.6 release" + ) + def test_export_transformer_no_token_pos_emb(self): + task, parser = get_dummy_task_and_parser() + TransformerModel.add_args(parser) + args = parser.parse_args([]) + args.no_token_positional_embeddings = True + model = TransformerModel.build_model(args, task) + scripted = torch.jit.script(model) + _test_save_and_load(scripted) + + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_file_io.py b/SpeechT5/fairseq/tests/test_file_io.py new file mode 100644 index 0000000..425812b --- /dev/null +++ b/SpeechT5/fairseq/tests/test_file_io.py @@ -0,0 +1,58 @@ +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import os +import shutil +import sys +import tempfile +import unittest +from typing import Optional +from unittest.mock import MagicMock + + +class TestFileIO(unittest.TestCase): + + _tmpdir: Optional[str] = None + _tmpfile: Optional[str] = None + _tmpfile_contents = "Hello, World" + + @classmethod + def setUpClass(cls) -> None: + cls._tmpdir = tempfile.mkdtemp() + with open(os.path.join(cls._tmpdir, "test.txt"), "w") as f: + cls._tmpfile = f.name + f.write(cls._tmpfile_contents) + f.flush() + + @classmethod + def tearDownClass(cls) -> None: + # Cleanup temp working dir. + if cls._tmpdir is not None: + shutil.rmtree(cls._tmpdir) # type: ignore + + def test_file_io(self): + from fairseq.file_io import PathManager + + with PathManager.open(os.path.join(self._tmpdir, "test.txt"), "r") as f: + s = f.read() + self.assertEqual(s, self._tmpfile_contents) + + def test_file_io_oss(self): + # Mock iopath to simulate oss environment. + sys.modules["iopath"] = MagicMock() + from fairseq.file_io import PathManager + + with PathManager.open(os.path.join(self._tmpdir, "test.txt"), "r") as f: + s = f.read() + self.assertEqual(s, self._tmpfile_contents) + + def test_file_io_async(self): + # ioPath `PathManager` is initialized after the first `opena` call. + try: + from fairseq.file_io import IOPathManager, PathManager + _asyncfile = os.path.join(self._tmpdir, "async.txt") + f = PathManager.opena(_asyncfile, "wb") + f.close() + + finally: + self.assertTrue(PathManager.async_close()) diff --git a/SpeechT5/fairseq/tests/test_fp16_optimizer.py b/SpeechT5/fairseq/tests/test_fp16_optimizer.py new file mode 100644 index 0000000..ce4f1c0 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_fp16_optimizer.py @@ -0,0 +1,112 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import copy +import logging +import unittest + +import torch +from fairseq.optim.fp16_optimizer import FP16Optimizer, MemoryEfficientFP16Optimizer +from omegaconf import OmegaConf + + +@unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") +class TestGradientScaling(unittest.TestCase): + def setUp(self): + self.x = torch.tensor([2.0]).cuda().half() + weight = 3.0 + bias = 5.0 + self.error = 1.0 + self.target = torch.tensor([self.x * weight + bias + self.error]).cuda().half() + self.loss_fn = torch.nn.L1Loss() + + self.model = torch.nn.Linear(1, 1) + self.model.weight.data = torch.tensor([[weight]]) + self.model.bias.data = torch.tensor([bias]) + self.model.cuda().half() + self.params = list(self.model.parameters()) + + self.cfg_dls = OmegaConf.create( + { + "optimization": { + "lr": [0.1], + }, + "optimizer": { + "_name": "adam", + "lr": [0.1], + "adam_betas": "(0.9, 0.999)", + "adam_eps": 1e-8, + "weight_decay": 0.0, + }, + "common": { + "fp16_init_scale": 1, + "fp16_scale_window": 1, + "fp16_scale_tolerance": 1, + "threshold_loss_scale": 1, + "min_loss_scale": 1e-4, + "tpu": False, + }, + } + ) + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def run_iter(self, model, params, optimizer): + optimizer.zero_grad() + y = model(self.x) + loss = self.loss_fn(y, self.target) + optimizer.backward(loss) + self.assertEqual(loss, torch.tensor(1.0, device="cuda:0", dtype=torch.float16)) + + grad_norm = optimizer.clip_grad_norm(0) + self.assertAlmostEqual(grad_norm.item(), 2.2361, 4) + + optimizer.step() + self.assertEqual( + model.weight, + torch.tensor( + [[3.0996]], device="cuda:0", dtype=torch.float16, requires_grad=True + ), + ) + self.assertEqual( + model.bias, + torch.tensor( + [5.1016], device="cuda:0", dtype=torch.float16, requires_grad=True + ), + ) + self.assertEqual(optimizer.scaler.loss_scale, 2.0) + + def test_mixed_precision(self): + model = copy.deepcopy(self.model) + params = list(model.parameters()) + optimizer = FP16Optimizer.build_optimizer(self.cfg_dls, params) + + self.run_iter(model, params, optimizer) + self.assertTrue( + all( + torch.all( + fp32_params.eq( + torch.tensor( + [3.1000, 5.1000], device="cuda:0", requires_grad=True + ) + ) + ) + for fp32_params in optimizer.fp32_params.values() + ) + ) + + def test_memory_efficient(self): + model = copy.deepcopy(self.model) + params = list(model.parameters()) + optimizer = MemoryEfficientFP16Optimizer.build_optimizer(self.cfg_dls, params) + + self.run_iter(model, params, optimizer) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_inference_dropout.py b/SpeechT5/fairseq/tests/test_inference_dropout.py new file mode 100644 index 0000000..353ac67 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_inference_dropout.py @@ -0,0 +1,70 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import unittest + +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models.transformer import TransformerModel +from tests.test_sequence_generator import get_dummy_task_and_parser + + +class TestInferenceDropout(unittest.TestCase): + def setUp(self): + self.task, self.parser = get_dummy_task_and_parser() + TransformerModel.add_args(self.parser) + self.args = self.parser.parse_args([]) + self.args.encoder_layers = 2 + self.args.decoder_layers = 1 + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_sets_inference_dropout_to_true(self): + self.args.retain_dropout = True + self.transformer_model = TransformerModel.build_model(self.args, self.task) + cfg = convert_namespace_to_omegaconf(self.args) + self.transformer_model.prepare_for_inference_(cfg) + assert self.transformer_model.encoder.dropout_module.apply_during_inference + assert self.transformer_model.decoder.dropout_module.apply_during_inference + for layer in self.transformer_model.encoder.layers: + assert layer.dropout_module.apply_during_inference + + def test_inference_dropout_false_by_default(self): + self.transformer_model = TransformerModel.build_model(self.args, self.task) + cfg = convert_namespace_to_omegaconf(self.args) + self.transformer_model.prepare_for_inference_(cfg) + assert not self.transformer_model.encoder.dropout_module.apply_during_inference + assert not self.transformer_model.decoder.dropout_module.apply_during_inference + for layer in self.transformer_model.encoder.layers: + assert not layer.dropout_module.apply_during_inference + for layer in self.transformer_model.decoder.layers: + assert not layer.dropout_module.apply_during_inference + + def test_applies_training_mode(self): + self.transformer_model = TransformerModel.build_model(self.args, self.task) + assert self.transformer_model.encoder.dropout_module.training + for layer in self.transformer_model.encoder.layers: + assert layer.dropout_module.training + + self.transformer_model.eval() + assert not self.transformer_model.decoder.dropout_module.training + for layer in self.transformer_model.encoder.layers: + assert not layer.dropout_module.training + + def test_retain_modules(self): + self.args.retain_dropout = True + self.args.retain_dropout_modules = [ + "TransformerEncoder", + "TransformerEncoderLayer", + ] + self.transformer_model = TransformerModel.build_model(self.args, self.task) + cfg = convert_namespace_to_omegaconf(self.args) + self.transformer_model.prepare_for_inference_(cfg) + assert self.transformer_model.encoder.dropout_module.apply_during_inference + assert not self.transformer_model.decoder.dropout_module.apply_during_inference + for layer in self.transformer_model.decoder.layers: + assert not layer.dropout_module.apply_during_inference diff --git a/SpeechT5/fairseq/tests/test_iopath.py b/SpeechT5/fairseq/tests/test_iopath.py new file mode 100644 index 0000000..908261a --- /dev/null +++ b/SpeechT5/fairseq/tests/test_iopath.py @@ -0,0 +1,29 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest +from unittest import mock + + +class TestIOPath(unittest.TestCase): + + def test_no_iopath(self): + from .test_reproducibility import TestReproducibility + + with mock.patch.dict("sys.modules", {"iopath": None}): + # reuse reproducibility tests, which are e2e tests that should cover + # most checkpoint related functionality + TestReproducibility._test_reproducibility(self, "test_reproducibility") + + def test_no_supports_rename(self): + from .test_reproducibility import TestReproducibility + + with mock.patch("fairseq.file_io.PathManager.supports_rename") as mock_fn: + mock_fn.return_value = False + TestReproducibility._test_reproducibility(self, "test_reproducibility") + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_iterators.py b/SpeechT5/fairseq/tests/test_iterators.py new file mode 100644 index 0000000..7b3dd48 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_iterators.py @@ -0,0 +1,137 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +from fairseq.data import iterators + + +class TestIterators(unittest.TestCase): + def test_counting_iterator_index(self, ref=None, itr=None): + # Test the indexing functionality of CountingIterator + if ref is None: + assert itr is None + ref = list(range(10)) + itr = iterators.CountingIterator(ref) + else: + assert len(ref) == 10 + assert itr is not None + + self.assertTrue(itr.has_next()) + self.assertEqual(itr.n, 0) + self.assertEqual(next(itr), ref[0]) + self.assertEqual(itr.n, 1) + self.assertEqual(next(itr), ref[1]) + self.assertEqual(itr.n, 2) + itr.skip(3) + self.assertEqual(itr.n, 5) + self.assertEqual(next(itr), ref[5]) + itr.skip(2) + self.assertEqual(itr.n, 8) + self.assertEqual(list(itr), [ref[8], ref[9]]) + self.assertFalse(itr.has_next()) + + def test_counting_iterator_length_mismatch(self): + ref = list(range(10)) + # When the underlying iterable is longer than the CountingIterator, + # the remaining items in the iterable should be ignored + itr = iterators.CountingIterator(ref, total=8) + self.assertEqual(list(itr), ref[:8]) + # When the underlying iterable is shorter than the CountingIterator, + # raise an IndexError when the underlying iterable is exhausted + itr = iterators.CountingIterator(ref, total=12) + self.assertRaises(IndexError, list, itr) + + def test_counting_iterator_take(self): + # Test the "take" method of CountingIterator + ref = list(range(10)) + itr = iterators.CountingIterator(ref) + itr.take(5) + self.assertEqual(len(itr), len(list(iter(itr)))) + self.assertEqual(len(itr), 5) + + itr = iterators.CountingIterator(ref) + itr.take(5) + self.assertEqual(next(itr), ref[0]) + self.assertEqual(next(itr), ref[1]) + itr.skip(2) + self.assertEqual(next(itr), ref[4]) + self.assertFalse(itr.has_next()) + + def test_grouped_iterator(self): + # test correctness + x = list(range(10)) + itr = iterators.GroupedIterator(x, 1) + self.assertEqual(list(itr), [[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]) + itr = iterators.GroupedIterator(x, 4) + self.assertEqual(list(itr), [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9]]) + itr = iterators.GroupedIterator(x, 5) + self.assertEqual(list(itr), [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) + + # test the GroupIterator also works correctly as a CountingIterator + x = list(range(30)) + ref = list(iterators.GroupedIterator(x, 3)) + itr = iterators.GroupedIterator(x, 3) + self.test_counting_iterator_index(ref, itr) + + def test_sharded_iterator(self): + # test correctness + x = list(range(10)) + itr = iterators.ShardedIterator(x, num_shards=1, shard_id=0) + self.assertEqual(list(itr), x) + itr = iterators.ShardedIterator(x, num_shards=2, shard_id=0) + self.assertEqual(list(itr), [0, 2, 4, 6, 8]) + itr = iterators.ShardedIterator(x, num_shards=2, shard_id=1) + self.assertEqual(list(itr), [1, 3, 5, 7, 9]) + itr = iterators.ShardedIterator(x, num_shards=3, shard_id=0) + self.assertEqual(list(itr), [0, 3, 6, 9]) + itr = iterators.ShardedIterator(x, num_shards=3, shard_id=1) + self.assertEqual(list(itr), [1, 4, 7, None]) + itr = iterators.ShardedIterator(x, num_shards=3, shard_id=2) + self.assertEqual(list(itr), [2, 5, 8, None]) + + # test CountingIterator functionality + x = list(range(30)) + ref = list(iterators.ShardedIterator(x, num_shards=3, shard_id=0)) + itr = iterators.ShardedIterator(x, num_shards=3, shard_id=0) + self.test_counting_iterator_index(ref, itr) + + def test_counting_iterator_buffered_iterator_take(self): + ref = list(range(10)) + buffered_itr = iterators.BufferedIterator(2, ref) + itr = iterators.CountingIterator(buffered_itr) + itr.take(5) + self.assertEqual(len(itr), len(list(iter(itr)))) + self.assertEqual(len(itr), 5) + + buffered_itr = iterators.BufferedIterator(2, ref) + itr = iterators.CountingIterator(buffered_itr) + itr.take(5) + self.assertEqual(len(buffered_itr), 5) + self.assertEqual(len(list(iter(buffered_itr))), 5) + + buffered_itr = iterators.BufferedIterator(2, ref) + itr = iterators.CountingIterator(buffered_itr) + itr.take(5) + self.assertEqual(next(itr), ref[0]) + self.assertEqual(next(itr), ref[1]) + itr.skip(2) + self.assertEqual(next(itr), ref[4]) + self.assertFalse(itr.has_next()) + self.assertRaises(StopIteration, next, buffered_itr) + + ref = list(range(4, 10)) + buffered_itr = iterators.BufferedIterator(2, ref) + itr = iterators.CountingIterator(buffered_itr, start=4) + itr.take(5) + self.assertEqual(len(itr), 5) + self.assertEqual(len(buffered_itr), 1) + self.assertEqual(next(itr), ref[0]) + self.assertFalse(itr.has_next()) + self.assertRaises(StopIteration, next, buffered_itr) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_label_smoothing.py b/SpeechT5/fairseq/tests/test_label_smoothing.py new file mode 100644 index 0000000..04c0f97 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_label_smoothing.py @@ -0,0 +1,123 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import copy +import unittest + +import tests.utils as test_utils +import torch +from fairseq.criterions.cross_entropy import CrossEntropyCriterion +from fairseq.criterions.label_smoothed_cross_entropy import ( + LabelSmoothedCrossEntropyCriterion, +) + + +class TestLabelSmoothing(unittest.TestCase): + def setUp(self): + # build dictionary + self.d = test_utils.dummy_dictionary(3) + vocab = len(self.d) + self.assertEqual(vocab, 4 + 3) # 4 special + 3 tokens + self.assertEqual(self.d.pad(), 1) + self.assertEqual(self.d.eos(), 2) + self.assertEqual(self.d.unk(), 3) + pad, eos, unk, w1, w2, w3 = 1, 2, 3, 4, 5, 6 # noqa: F841 + + # build dataset + self.data = [ + # the first batch item has padding + { + "source": torch.LongTensor([w1, eos]), + "target": torch.LongTensor([w1, eos]), + }, + { + "source": torch.LongTensor([w1, eos]), + "target": torch.LongTensor([w1, w1, eos]), + }, + ] + self.sample = next(test_utils.dummy_dataloader(self.data)) + + # build model + self.args = argparse.Namespace() + self.args.sentence_avg = False + self.args.report_accuracy = False + self.args.probs = ( + torch.FloatTensor( + [ + # pad eos unk w1 w2 w3 + [0.05, 0.05, 0.1, 0.05, 0.3, 0.4, 0.05], + [0.05, 0.10, 0.2, 0.05, 0.2, 0.3, 0.10], + [0.05, 0.15, 0.3, 0.05, 0.1, 0.2, 0.15], + ] + ) + .unsqueeze(0) + .expand(2, 3, 7) + ) # add batch dimension + self.task = test_utils.TestTranslationTask.setup_task(self.args, self.d, self.d) + self.model = self.task.build_model(self.args) + + def test_nll_loss(self): + self.args.label_smoothing = 0.1 + nll_crit = CrossEntropyCriterion.build_criterion(self.args, self.task) + smooth_crit = LabelSmoothedCrossEntropyCriterion.build_criterion( + self.args, self.task + ) + nll_loss, nll_sample_size, nll_logging_output = nll_crit( + self.model, self.sample + ) + smooth_loss, smooth_sample_size, smooth_logging_output = smooth_crit( + self.model, self.sample + ) + self.assertLess(abs(nll_loss - nll_logging_output["loss"]), 1e-6) + self.assertLess(abs(nll_loss - smooth_logging_output["nll_loss"]), 1e-6) + + def test_padding(self): + self.args.label_smoothing = 0.1 + crit = LabelSmoothedCrossEntropyCriterion.build_criterion(self.args, self.task) + loss, _, logging_output = crit(self.model, self.sample) + + def get_one_no_padding(idx): + # create a new sample with just a single batch item so that there's + # no padding + sample1 = next(test_utils.dummy_dataloader([self.data[idx]])) + args1 = copy.copy(self.args) + args1.probs = args1.probs[idx, :, :].unsqueeze(0) + model1 = self.task.build_model(args1) + loss1, _, _ = crit(model1, sample1) + return loss1 + + loss1 = get_one_no_padding(0) + loss2 = get_one_no_padding(1) + self.assertAlmostEqual(loss, loss1 + loss2) + + def test_reduction(self): + self.args.label_smoothing = 0.1 + crit = LabelSmoothedCrossEntropyCriterion.build_criterion(self.args, self.task) + loss, _, logging_output = crit(self.model, self.sample, reduce=True) + unreduced_loss, _, _ = crit(self.model, self.sample, reduce=False) + self.assertAlmostEqual(loss, unreduced_loss.sum()) + + def test_zero_eps(self): + self.args.label_smoothing = 0.0 + nll_crit = CrossEntropyCriterion.build_criterion(self.args, self.task) + smooth_crit = LabelSmoothedCrossEntropyCriterion.build_criterion( + self.args, self.task + ) + nll_loss, nll_sample_size, nll_logging_output = nll_crit( + self.model, self.sample + ) + smooth_loss, smooth_sample_size, smooth_logging_output = smooth_crit( + self.model, self.sample + ) + self.assertAlmostEqual(nll_loss, smooth_loss) + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess((t1 - t2).abs().max(), 1e-6) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_lm_context_window.py b/SpeechT5/fairseq/tests/test_lm_context_window.py new file mode 100644 index 0000000..7415e86 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_lm_context_window.py @@ -0,0 +1,51 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +from fairseq.data import MonolingualDataset +from fairseq.tasks.language_modeling import LanguageModelingTask, LanguageModelingConfig +from tests import utils as test_utils + + +class TestLMContextWindow(unittest.TestCase): + + def test_eval_dataloader(self): + dictionary = test_utils.dummy_dictionary(10) + assert len(dictionary) == 14 # 4 extra special symbols + assert dictionary.pad() == 1 + + dataset = test_utils.TestDataset([ + torch.tensor([4, 5, 6, 7], dtype=torch.long), + torch.tensor([8, 9, 10, 11], dtype=torch.long), + torch.tensor([12, 13], dtype=torch.long), + ]) + dataset = MonolingualDataset(dataset, sizes=[4, 4, 2], src_vocab=dictionary) + + config = LanguageModelingConfig(tokens_per_sample=4) + task = LanguageModelingTask(config, dictionary) + + eval_dataloader = task.eval_lm_dataloader( + dataset=dataset, + batch_size=1, + context_window=2, + ) + + batch = next(eval_dataloader) + assert batch["net_input"]["src_tokens"][0].tolist() == [4, 5, 6, 7, 1, 1] + assert batch["target"][0].tolist() == [4, 5, 6, 7, 1, 1] + + batch = next(eval_dataloader) + assert batch["net_input"]["src_tokens"][0].tolist() == [6, 7, 8, 9, 10, 11] + assert batch["target"][0].tolist() == [1, 1, 8, 9, 10, 11] + + batch = next(eval_dataloader) + assert batch["net_input"]["src_tokens"][0].tolist() == [10, 11, 12, 13] + assert batch["target"][0].tolist() == [1, 1, 12, 13] + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_lstm_jitable.py b/SpeechT5/fairseq/tests/test_lstm_jitable.py new file mode 100644 index 0000000..38f79d1 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_lstm_jitable.py @@ -0,0 +1,115 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import tempfile +import unittest + +import torch +from fairseq.data.dictionary import Dictionary +from fairseq.models.lstm import LSTMModel +from fairseq.tasks.fairseq_task import LegacyFairseqTask + + +DEFAULT_TEST_VOCAB_SIZE = 100 + + +class DummyTask(LegacyFairseqTask): + def __init__(self, args): + super().__init__(args) + self.dictionary = get_dummy_dictionary() + if getattr(self.args, "ctc", False): + self.dictionary.add_symbol("<ctc_blank>") + self.src_dict = self.dictionary + self.tgt_dict = self.dictionary + + @property + def source_dictionary(self): + return self.src_dict + + @property + def target_dictionary(self): + return self.dictionary + + +def get_dummy_dictionary(vocab_size=DEFAULT_TEST_VOCAB_SIZE): + dummy_dict = Dictionary() + # add dummy symbol to satisfy vocab size + for id, _ in enumerate(range(vocab_size)): + dummy_dict.add_symbol("{}".format(id), 1000) + return dummy_dict + + +def get_dummy_task_and_parser(): + """ + to build a fariseq model, we need some dummy parse and task. This function + is used to create dummy task and parser to faciliate model/criterion test + + Note: we use FbSpeechRecognitionTask as the dummy task. You may want + to use other task by providing another function + """ + parser = argparse.ArgumentParser( + description="test_dummy_s2s_task", argument_default=argparse.SUPPRESS + ) + DummyTask.add_args(parser) + args = parser.parse_args([]) + task = DummyTask.setup_task(args) + return task, parser + + +class TestJitLSTMModel(unittest.TestCase): + def _test_save_and_load(self, scripted_module): + with tempfile.NamedTemporaryFile() as f: + scripted_module.save(f.name) + torch.jit.load(f.name) + + def assertTensorEqual(self, t1, t2): + t1 = t1[~torch.isnan(t1)] # can cause size mismatch errors if there are NaNs + t2 = t2[~torch.isnan(t2)] + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertEqual(t1.ne(t2).long().sum(), 0) + + def test_jit_and_export_lstm(self): + task, parser = get_dummy_task_and_parser() + LSTMModel.add_args(parser) + args = parser.parse_args([]) + args.criterion = "" + model = LSTMModel.build_model(args, task) + scripted_model = torch.jit.script(model) + self._test_save_and_load(scripted_model) + + def test_assert_jit_vs_nonjit_(self): + task, parser = get_dummy_task_and_parser() + LSTMModel.add_args(parser) + args = parser.parse_args([]) + args.criterion = "" + model = LSTMModel.build_model(args, task) + model.eval() + scripted_model = torch.jit.script(model) + scripted_model.eval() + idx = len(task.source_dictionary) + iter = 100 + # Inject random input and check output + seq_len_tensor = torch.randint(1, 10, (iter,)) + num_samples_tensor = torch.randint(1, 10, (iter,)) + for i in range(iter): + seq_len = seq_len_tensor[i] + num_samples = num_samples_tensor[i] + src_token = (torch.randint(0, idx, (num_samples, seq_len)),) + src_lengths = torch.randint(1, seq_len + 1, (num_samples,)) + src_lengths, _ = torch.sort(src_lengths, descending=True) + # Force the first sample to have seq_len + src_lengths[0] = seq_len + prev_output_token = (torch.randint(0, idx, (num_samples, 1)),) + result = model(src_token[0], src_lengths, prev_output_token[0], None) + scripted_result = scripted_model( + src_token[0], src_lengths, prev_output_token[0], None + ) + self.assertTensorEqual(result[0], scripted_result[0]) + self.assertTensorEqual(result[1], scripted_result[1]) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_memory_efficient_fp16.py b/SpeechT5/fairseq/tests/test_memory_efficient_fp16.py new file mode 100644 index 0000000..2bf2f29 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_memory_efficient_fp16.py @@ -0,0 +1,78 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import logging +import unittest + +import torch +from fairseq.optim.adam import FairseqAdam +from fairseq.optim.fp16_optimizer import MemoryEfficientFP16Optimizer +from omegaconf import OmegaConf + + +@unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") +class TestMemoryEfficientFP16(unittest.TestCase): + def setUp(self): + logging.disable(logging.CRITICAL) + + def tearDown(self): + logging.disable(logging.NOTSET) + + def test_load_state_dict(self): + # define simple FP16 model + model = torch.nn.Linear(5, 5).cuda().half() + params = list(model.parameters()) + + # initialize memory efficient FP16 optimizer + # with pseudo DictConfigs + optimizer = FairseqAdam( + cfg=OmegaConf.create( + vars( + argparse.Namespace( + adam_betas="(0.9, 0.999)", + adam_eps=1e-8, + weight_decay=0.0, + lr=[0.00001], + ) + ) + ), + params=params, + ) + me_optimizer = MemoryEfficientFP16Optimizer( + cfg=OmegaConf.create( + { + "common": vars( + argparse.Namespace( + fp16_init_scale=1, + fp16_scale_window=1, + fp16_scale_tolerance=1, + threshold_loss_scale=1, + min_loss_scale=1e-4, + ) + ) + } + ), + params=params, + optimizer=optimizer, + ) + + # optimizer state is created in the first step + loss = model(torch.rand(5).cuda().half()).sum() + me_optimizer.backward(loss) + me_optimizer.step() + + # reload state + state = me_optimizer.state_dict() + me_optimizer.load_state_dict(state) + for k, v in me_optimizer.optimizer.state.items(): + self.assertTrue(k.dtype == torch.float16) + for v_i in v.values(): + if torch.is_tensor(v_i): + self.assertTrue(v_i.dtype == torch.float32) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_metrics.py b/SpeechT5/fairseq/tests/test_metrics.py new file mode 100644 index 0000000..2de6969 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_metrics.py @@ -0,0 +1,77 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest +import uuid + +from fairseq import metrics + + +class TestMetrics(unittest.TestCase): + def test_nesting(self): + with metrics.aggregate() as a: + metrics.log_scalar("loss", 1) + with metrics.aggregate() as b: + metrics.log_scalar("loss", 2) + + self.assertEqual(a.get_smoothed_values()["loss"], 1.5) + self.assertEqual(b.get_smoothed_values()["loss"], 2) + + def test_new_root(self): + with metrics.aggregate() as a: + metrics.log_scalar("loss", 1) + with metrics.aggregate(new_root=True) as b: + metrics.log_scalar("loss", 2) + + self.assertEqual(a.get_smoothed_values()["loss"], 1) + self.assertEqual(b.get_smoothed_values()["loss"], 2) + + def test_nested_new_root(self): + with metrics.aggregate() as layer1: + metrics.log_scalar("loss", 1) + with metrics.aggregate(new_root=True) as layer2: + metrics.log_scalar("loss", 2) + with metrics.aggregate() as layer3: + metrics.log_scalar("loss", 3) + with metrics.aggregate(new_root=True) as layer4: + metrics.log_scalar("loss", 4) + metrics.log_scalar("loss", 1.5) + + self.assertEqual(layer4.get_smoothed_values()["loss"], 4) + self.assertEqual(layer3.get_smoothed_values()["loss"], 3) + self.assertEqual(layer2.get_smoothed_values()["loss"], 2.5) + self.assertEqual(layer1.get_smoothed_values()["loss"], 1.25) + + def test_named(self): + name = str(uuid.uuid4()) + metrics.reset_meters(name) + + with metrics.aggregate(name): + metrics.log_scalar("loss", 1) + + metrics.log_scalar("loss", 3) + + with metrics.aggregate(name): + metrics.log_scalar("loss", 2) + + self.assertEqual(metrics.get_smoothed_values(name)["loss"], 1.5) + + def test_nested_duplicate_names(self): + name = str(uuid.uuid4()) + metrics.reset_meters(name) + + with metrics.aggregate(name): + metrics.log_scalar("loss", 1) + with metrics.aggregate() as other: + with metrics.aggregate(name): + metrics.log_scalar("loss", 2) + metrics.log_scalar("loss", 6) + + self.assertEqual(metrics.get_smoothed_values(name)["loss"], 3) + self.assertEqual(other.get_smoothed_values()["loss"], 2) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_multi_corpus_dataset.py b/SpeechT5/fairseq/tests/test_multi_corpus_dataset.py new file mode 100644 index 0000000..5a79f4b --- /dev/null +++ b/SpeechT5/fairseq/tests/test_multi_corpus_dataset.py @@ -0,0 +1,79 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest +from collections import OrderedDict + +import torch +from fairseq.data import LanguagePairDataset, TokenBlockDataset +from fairseq.data.multi_corpus_dataset import MultiCorpusDataset +from tests.test_train import mock_dict + + +class TestMultiCorpusDataset(unittest.TestCase): + def setUp(self): + d = mock_dict() + tokens_1 = torch.LongTensor([i for i in range(1, 5000, 2)]).view(1, -1) + tokens_ds1 = TokenBlockDataset( + tokens_1, + sizes=[tokens_1.size(-1)], + block_size=1, + pad=0, + eos=1, + include_targets=False, + ) + self.dataset_1 = LanguagePairDataset( + tokens_ds1, tokens_ds1.sizes, d, shuffle=False + ) + tokens_2 = torch.LongTensor([i for i in range(0, 5000, 2)]).view(1, -1) + tokens_ds2 = TokenBlockDataset( + tokens_2, + sizes=[tokens_2.size(-1)], + block_size=1, + pad=0, + eos=1, + include_targets=False, + ) + self.dataset_2 = LanguagePairDataset( + tokens_ds2, tokens_ds2.sizes, d, shuffle=False + ) + + def _test_sample_helper( + self, + distribution, + ): + m = MultiCorpusDataset( + OrderedDict({0: self.dataset_1, 1: self.dataset_2}), + distribution=distribution, + seed=0, + sort_indices=True, + ) + m.set_epoch(1) + indices = m.ordered_indices() + count_sample_from_first_dataset = 0 + items = set() + for i in indices: + item = m[i]["source"].item() + if item % 2 == 1: + count_sample_from_first_dataset += 1 + + items.add(item) + sample_from_first_ds_percentage = ( + 1.0 * count_sample_from_first_dataset / len(indices) + ) + self.assertLess( + abs(sample_from_first_ds_percentage - distribution[0]), + 0.01, + ) + self.assertEqual( + len(items), + int(min(len(self.dataset_1), len(indices) * distribution[0]) + + min(len(self.dataset_1), len(indices) * distribution[1])) + ) + print(distribution) + + def test_multi_corpus_dataset(self): + for distribution in [[0.5, 0.5], [0.1, 0.9], [0.9, 0.1]]: + self._test_sample_helper(distribution=distribution) diff --git a/SpeechT5/fairseq/tests/test_multi_corpus_sampled_dataset.py b/SpeechT5/fairseq/tests/test_multi_corpus_sampled_dataset.py new file mode 100644 index 0000000..05b2032 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_multi_corpus_sampled_dataset.py @@ -0,0 +1,95 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest +from collections import OrderedDict + +import numpy as np +import torch +from fairseq.data import LanguagePairDataset, TokenBlockDataset +from fairseq.data.multi_corpus_sampled_dataset import MultiCorpusSampledDataset +from tests.test_train import mock_dict + + +class TestMultiCorpusSampledDataset(unittest.TestCase): + def setUp(self): + d = mock_dict() + tokens_1 = torch.LongTensor([1]).view(1, -1) + tokens_ds1 = TokenBlockDataset( + tokens_1, + sizes=[tokens_1.size(-1)], + block_size=1, + pad=0, + eos=1, + include_targets=False, + ) + self.dataset_1 = LanguagePairDataset( + tokens_ds1, tokens_ds1.sizes, d, shuffle=False + ) + tokens_2 = torch.LongTensor([2]).view(1, -1) + tokens_ds2 = TokenBlockDataset( + tokens_2, + sizes=[tokens_2.size(-1)], + block_size=1, + pad=0, + eos=1, + include_targets=False, + ) + self.dataset_2 = LanguagePairDataset( + tokens_ds2, tokens_ds2.sizes, d, shuffle=False + ) + + def _test_sample_helper( + self, + expected_sample_from_first_ds_percentage, + num_samples=1000, + sampling_func=None, + ): + # To make sure test is not flaky + np.random.seed(0) + if sampling_func is None: + m = MultiCorpusSampledDataset( + OrderedDict({0: self.dataset_1, 1: self.dataset_2}), + ) + else: + m = MultiCorpusSampledDataset( + OrderedDict({0: self.dataset_1, 1: self.dataset_2}), + sampling_func=sampling_func, + ) + m.ordered_indices() + count_sample_from_first_dataset = 0 + for _ in range(num_samples): + if m.collater([m[0], m[1]])["net_input"]["src_tokens"][0] == 1: + count_sample_from_first_dataset += 1 + sample_from_first_ds_percentage = ( + 1.0 * count_sample_from_first_dataset / num_samples + ) + self.assertLess( + abs( + sample_from_first_ds_percentage + - expected_sample_from_first_ds_percentage + ), + 0.01, + ) + + def test_multi_corpus_sampled_dataset_uniform_sample(self): + self._test_sample_helper(expected_sample_from_first_ds_percentage=0.5) + + def test_multi_corpus_sampled_dataset_weighted_sample(self): + def naive_weighted_sample(weights): + def f(l): + v = np.random.random() + agg = 0 + for i, weight in enumerate(weights): + agg += weight + if agg > v: + return i + + return f + + self._test_sample_helper( + expected_sample_from_first_ds_percentage=0.9, + sampling_func=naive_weighted_sample(weights=[0.9, 0.1]), + ) diff --git a/SpeechT5/fairseq/tests/test_multihead_attention.py b/SpeechT5/fairseq/tests/test_multihead_attention.py new file mode 100644 index 0000000..620a2d6 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_multihead_attention.py @@ -0,0 +1,73 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +from fairseq.modules.multihead_attention import MultiheadAttention + + +class TestMultiheadAttention(unittest.TestCase): + def test_append_prev_key_padding_mask(self): + bsz = 1 + src_len = 4 + + cases = [ + # no padding mask + (None, None, None), + # current padding mask only + ( + torch.tensor([[1]]).bool(), + None, + torch.tensor([[0, 0, 0, 1]]).bool(), + ), + # previous padding mask only + ( + None, + torch.tensor([[0, 1, 0]]).bool(), + torch.tensor([[0, 1, 0, 0]]).bool(), + ), + # both padding masks + ( + torch.tensor([[1]]).bool(), + torch.tensor([[0, 1, 0]]).bool(), + torch.tensor([[0, 1, 0, 1]]).bool(), + ), + # prev_key_padding_mask already full + ( + torch.tensor([[0, 1, 0, 1]]).bool(), + None, + torch.tensor([[0, 1, 0, 1]]).bool(), + ), + # key_padding_mask already full + ( + None, + torch.tensor([[0, 1, 0, 1]]).bool(), + torch.tensor([[0, 1, 0, 1]]).bool(), + ), + ] + for c in cases: + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + c[0], + c[1], + batch_size=bsz, + src_len=src_len, + static_kv=False, + ) + + if key_padding_mask is not None: + self.assertTrue( + torch.all(torch.eq(key_padding_mask, c[2])), + f"Unexpected resultant key padding mask: {key_padding_mask}" + f" given current: {c[0]} and previous: {c[1]}", + ) + self.assertEqual(key_padding_mask.size(0), bsz) + self.assertEqual(key_padding_mask.size(1), src_len) + else: + self.assertIsNone(c[2]) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_noising.py b/SpeechT5/fairseq/tests/test_noising.py new file mode 100644 index 0000000..b3d0d12 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_noising.py @@ -0,0 +1,530 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest +from typing import Dict, List + +import tests.utils as test_utils +import torch +from fairseq import utils +from fairseq.data import ( + Dictionary, + LanguagePairDataset, + TransformEosDataset, + data_utils, + noising, +) + + +class TestDataNoising(unittest.TestCase): + def _get_test_data_with_bpe_cont_marker(self, append_eos=True): + """ + Args: + append_eos: if True, each input sentence in the source tokens tensor + will have an EOS appended to the end. + + Returns: + vocabs: BPE vocab with continuation markers as suffixes to denote + non-end of word tokens. This is the standard BPE format used in + fairseq's preprocessing. + x: input tensor containing numberized source tokens, with EOS at the + end if append_eos is true + src_lengths: and source lengths. + """ + vocab = Dictionary() + vocab.add_symbol("he@@") + vocab.add_symbol("llo") + vocab.add_symbol("how") + vocab.add_symbol("are") + vocab.add_symbol("y@@") + vocab.add_symbol("ou") + vocab.add_symbol("n@@") + vocab.add_symbol("ew") + vocab.add_symbol("or@@") + vocab.add_symbol("k") + + src_tokens = [ + ["he@@", "llo", "n@@", "ew", "y@@", "or@@", "k"], + ["how", "are", "y@@", "ou"], + ] + x, src_lengths = x, src_lengths = self._convert_src_tokens_to_tensor( + vocab=vocab, src_tokens=src_tokens, append_eos=append_eos + ) + return vocab, x, src_lengths + + def _get_test_data_with_bpe_end_marker(self, append_eos=True): + """ + Args: + append_eos: if True, each input sentence in the source tokens tensor + will have an EOS appended to the end. + + Returns: + vocabs: BPE vocab with end-of-word markers as suffixes to denote + tokens at the end of a word. This is an alternative to fairseq's + standard preprocessing framework and is not generally supported + within fairseq. + x: input tensor containing numberized source tokens, with EOS at the + end if append_eos is true + src_lengths: and source lengths. + """ + vocab = Dictionary() + vocab.add_symbol("he") + vocab.add_symbol("llo_EOW") + vocab.add_symbol("how_EOW") + vocab.add_symbol("are_EOW") + vocab.add_symbol("y") + vocab.add_symbol("ou_EOW") + vocab.add_symbol("n") + vocab.add_symbol("ew_EOW") + vocab.add_symbol("or") + vocab.add_symbol("k_EOW") + + src_tokens = [ + ["he", "llo_EOW", "n", "ew_EOW", "y", "or", "k_EOW"], + ["how_EOW", "are_EOW", "y", "ou_EOW"], + ] + x, src_lengths = x, src_lengths = self._convert_src_tokens_to_tensor( + vocab=vocab, src_tokens=src_tokens, append_eos=append_eos + ) + return vocab, x, src_lengths + + def _get_test_data_with_word_vocab(self, append_eos=True): + """ + Args: + append_eos: if True, each input sentence in the source tokens tensor + will have an EOS appended to the end. + + Returns: + vocabs: word vocab + x: input tensor containing numberized source tokens, with EOS at the + end if append_eos is true + src_lengths: and source lengths. + """ + vocab = Dictionary() + + vocab.add_symbol("hello") + vocab.add_symbol("how") + vocab.add_symbol("are") + vocab.add_symbol("you") + vocab.add_symbol("new") + vocab.add_symbol("york") + src_tokens = [ + ["hello", "new", "york", "you"], + ["how", "are", "you", "new", "york"], + ] + x, src_lengths = self._convert_src_tokens_to_tensor( + vocab=vocab, src_tokens=src_tokens, append_eos=append_eos + ) + return vocab, x, src_lengths + + def _convert_src_tokens_to_tensor( + self, vocab: Dictionary, src_tokens: List[List[str]], append_eos: bool + ): + src_len = [len(x) for x in src_tokens] + # If we have to append EOS, we include EOS in counting src length + if append_eos: + src_len = [length + 1 for length in src_len] + + x = torch.LongTensor(len(src_tokens), max(src_len)).fill_(vocab.pad()) + for i in range(len(src_tokens)): + for j in range(len(src_tokens[i])): + x[i][j] = vocab.index(src_tokens[i][j]) + if append_eos: + x[i][j + 1] = vocab.eos() + + x = x.transpose(1, 0) + return x, torch.LongTensor(src_len) + + def assert_eos_at_end(self, x, x_len, eos): + """Asserts last token of every sentence in x is EOS """ + for i in range(len(x_len)): + self.assertEqual( + x[x_len[i] - 1][i], + eos, + ( + "Expected eos (token id {eos}) at the end of sentence {i} " + "but got {other} instead" + ).format(i=i, eos=eos, other=x[i][-1]), + ) + + def assert_word_dropout_correct(self, x, x_noised, x_len, l_noised): + # Expect only the first word (2 bpe tokens) of the first example + # was dropped out + self.assertEqual(x_len[0] - 2, l_noised[0]) + for i in range(l_noised[0]): + self.assertEqual(x_noised[i][0], x[i + 2][0]) + + def test_word_dropout_with_eos(self): + vocab, x, x_len = self._get_test_data_with_bpe_cont_marker(append_eos=True) + + with data_utils.numpy_seed(1234): + noising_gen = noising.WordDropout(vocab) + x_noised, l_noised = noising_gen.noising(x, x_len, 0.2) + self.assert_word_dropout_correct( + x=x, x_noised=x_noised, x_len=x_len, l_noised=l_noised + ) + self.assert_eos_at_end(x=x_noised, x_len=l_noised, eos=vocab.eos()) + + def assert_word_blanking_correct(self, x, x_noised, x_len, l_noised, unk): + # Expect only the first word (2 bpe tokens) of the first example + # was blanked out + self.assertEqual(x_len[0], l_noised[0]) + for i in range(l_noised[0]): + if i < 2: + self.assertEqual(x_noised[i][0], unk) + else: + self.assertEqual(x_noised[i][0], x[i][0]) + + def test_word_blank_with_eos(self): + vocab, x, x_len = self._get_test_data_with_bpe_cont_marker(append_eos=True) + + with data_utils.numpy_seed(1234): + noising_gen = noising.WordDropout(vocab) + x_noised, l_noised = noising_gen.noising(x, x_len, 0.2, vocab.unk()) + self.assert_word_blanking_correct( + x=x, x_noised=x_noised, x_len=x_len, l_noised=l_noised, unk=vocab.unk() + ) + self.assert_eos_at_end(x=x_noised, x_len=l_noised, eos=vocab.eos()) + + def generate_unchanged_shuffle_map(self, length): + return {i: i for i in range(length)} + + def assert_word_shuffle_matches_expected( + self, + x, + x_len, + max_shuffle_distance: int, + vocab: Dictionary, + expected_shufle_maps: List[Dict[int, int]], + expect_eos_at_end: bool, + bpe_end_marker=None, + ): + """ + This verifies that with a given x, x_len, max_shuffle_distance, and + vocab, we get the expected shuffle result. + + Args: + x: Tensor of shape (T x B) = (sequence_length, batch_size) + x_len: Tensor of length B = batch_size + max_shuffle_distance: arg to pass to noising + expected_shuffle_maps: List[mapping] where mapping is a + Dict[old_index, new_index], mapping x's elements from their + old positions in x to their new positions in x. + expect_eos_at_end: if True, check the output to make sure there is + an EOS at the end. + bpe_end_marker: str denoting the BPE end token. If this is not None, we + set the BPE cont token to None in the noising classes. + """ + bpe_cont_marker = None + if bpe_end_marker is None: + bpe_cont_marker = "@@" + + with data_utils.numpy_seed(1234): + word_shuffle = noising.WordShuffle( + vocab, bpe_cont_marker=bpe_cont_marker, bpe_end_marker=bpe_end_marker + ) + x_noised, l_noised = word_shuffle.noising( + x, x_len, max_shuffle_distance=max_shuffle_distance + ) + + # For every example, we have a different expected shuffle map. We check + # that each example is shuffled as expected according to each + # corresponding shuffle map. + for i in range(len(expected_shufle_maps)): + shuffle_map = expected_shufle_maps[i] + for k, v in shuffle_map.items(): + self.assertEqual(x[k][i], x_noised[v][i]) + + # Shuffling should not affect the length of each example + for pre_shuffle_length, post_shuffle_length in zip(x_len, l_noised): + self.assertEqual(pre_shuffle_length, post_shuffle_length) + if expect_eos_at_end: + self.assert_eos_at_end(x=x_noised, x_len=l_noised, eos=vocab.eos()) + + def test_word_shuffle_with_eos(self): + vocab, x, x_len = self._get_test_data_with_bpe_cont_marker(append_eos=True) + + # Assert word shuffle with max shuffle distance 0 causes input to be + # unchanged + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + max_shuffle_distance=0, + vocab=vocab, + expected_shufle_maps=[ + self.generate_unchanged_shuffle_map(example_len) + for example_len in x_len + ], + expect_eos_at_end=True, + ) + + # Assert word shuffle with max shuffle distance 3 matches our expected + # shuffle order + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + vocab=vocab, + max_shuffle_distance=3, + expected_shufle_maps=[ + self.generate_unchanged_shuffle_map(x_len[0]), + {0: 0, 1: 3, 2: 1, 3: 2}, + ], + expect_eos_at_end=True, + ) + + def test_word_shuffle_with_eos_nonbpe(self): + """The purpose of this is to test shuffling logic with word vocabs""" + vocab, x, x_len = self._get_test_data_with_word_vocab(append_eos=True) + + # Assert word shuffle with max shuffle distance 0 causes input to be + # unchanged + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + max_shuffle_distance=0, + vocab=vocab, + expected_shufle_maps=[ + self.generate_unchanged_shuffle_map(example_len) + for example_len in x_len + ], + expect_eos_at_end=True, + ) + + # Assert word shuffle with max shuffle distance 3 matches our expected + # shuffle order + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + vocab=vocab, + max_shuffle_distance=3, + expected_shufle_maps=[ + {0: 0, 1: 1, 2: 3, 3: 2}, + {0: 0, 1: 2, 2: 1, 3: 3, 4: 4}, + ], + expect_eos_at_end=True, + ) + + def test_word_shuffle_without_eos(self): + """Same result as word shuffle with eos except no EOS at end""" + vocab, x, x_len = self._get_test_data_with_bpe_cont_marker(append_eos=False) + + # Assert word shuffle with max shuffle distance 0 causes input to be + # unchanged + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + max_shuffle_distance=0, + vocab=vocab, + expected_shufle_maps=[ + self.generate_unchanged_shuffle_map(example_len) + for example_len in x_len + ], + expect_eos_at_end=False, + ) + + # Assert word shuffle with max shuffle distance 3 matches our expected + # shuffle order + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + vocab=vocab, + max_shuffle_distance=3, + expected_shufle_maps=[ + self.generate_unchanged_shuffle_map(x_len[0]), + {0: 0, 1: 3, 2: 1, 3: 2}, + ], + expect_eos_at_end=False, + ) + + def test_word_shuffle_without_eos_with_bpe_end_marker(self): + """Same result as word shuffle without eos except using BPE end token""" + vocab, x, x_len = self._get_test_data_with_bpe_end_marker(append_eos=False) + + # Assert word shuffle with max shuffle distance 0 causes input to be + # unchanged + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + max_shuffle_distance=0, + vocab=vocab, + expected_shufle_maps=[ + self.generate_unchanged_shuffle_map(example_len) + for example_len in x_len + ], + expect_eos_at_end=False, + bpe_end_marker="_EOW", + ) + + # Assert word shuffle with max shuffle distance 3 matches our expected + # shuffle order + self.assert_word_shuffle_matches_expected( + x=x, + x_len=x_len, + vocab=vocab, + max_shuffle_distance=3, + expected_shufle_maps=[ + self.generate_unchanged_shuffle_map(x_len[0]), + {0: 0, 1: 3, 2: 1, 3: 2}, + ], + expect_eos_at_end=False, + bpe_end_marker="_EOW", + ) + + def assert_no_eos_at_end(self, x, x_len, eos): + """Asserts that the last token of each sentence in x is not EOS """ + for i in range(len(x_len)): + self.assertNotEqual( + x[x_len[i] - 1][i], + eos, + "Expected no eos (token id {eos}) at the end of sentence {i}.".format( + eos=eos, i=i + ), + ) + + def test_word_dropout_without_eos(self): + """Same result as word dropout with eos except no EOS at end""" + vocab, x, x_len = self._get_test_data_with_bpe_cont_marker(append_eos=False) + + with data_utils.numpy_seed(1234): + noising_gen = noising.WordDropout(vocab) + x_noised, l_noised = noising_gen.noising(x, x_len, 0.2) + self.assert_word_dropout_correct( + x=x, x_noised=x_noised, x_len=x_len, l_noised=l_noised + ) + self.assert_no_eos_at_end(x=x_noised, x_len=l_noised, eos=vocab.eos()) + + def test_word_blank_without_eos(self): + """Same result as word blank with eos except no EOS at end""" + vocab, x, x_len = self._get_test_data_with_bpe_cont_marker(append_eos=False) + + with data_utils.numpy_seed(1234): + noising_gen = noising.WordDropout(vocab) + x_noised, l_noised = noising_gen.noising(x, x_len, 0.2, vocab.unk()) + self.assert_word_blanking_correct( + x=x, x_noised=x_noised, x_len=x_len, l_noised=l_noised, unk=vocab.unk() + ) + self.assert_no_eos_at_end(x=x_noised, x_len=l_noised, eos=vocab.eos()) + + def _get_noising_dataset_batch( + self, + src_tokens_no_pad, + src_dict, + append_eos_to_tgt=False, + ): + """ + Constructs a NoisingDataset and the corresponding + ``LanguagePairDataset(NoisingDataset(src), src)``. If + *append_eos_to_tgt* is True, wrap the source dataset in + :class:`TransformEosDataset` to append EOS to the clean source when + using it as the target. + """ + src_dataset = test_utils.TestDataset(data=src_tokens_no_pad) + + noising_dataset = noising.NoisingDataset( + src_dataset=src_dataset, + src_dict=src_dict, + seed=1234, + max_word_shuffle_distance=3, + word_dropout_prob=0.2, + word_blanking_prob=0.2, + noising_class=noising.UnsupervisedMTNoising, + ) + tgt = src_dataset + language_pair_dataset = LanguagePairDataset( + src=noising_dataset, tgt=tgt, src_sizes=None, src_dict=src_dict + ) + language_pair_dataset = TransformEosDataset( + language_pair_dataset, + src_dict.eos(), + append_eos_to_tgt=append_eos_to_tgt, + ) + + dataloader = torch.utils.data.DataLoader( + dataset=language_pair_dataset, + batch_size=2, + collate_fn=language_pair_dataset.collater, + ) + denoising_batch_result = next(iter(dataloader)) + return denoising_batch_result + + def test_noising_dataset_with_eos(self): + src_dict, src_tokens, _ = self._get_test_data_with_bpe_cont_marker( + append_eos=True + ) + + # Format data for src_dataset + src_tokens = torch.t(src_tokens) + src_tokens_no_pad = [] + for src_sentence in src_tokens: + src_tokens_no_pad.append( + utils.strip_pad(tensor=src_sentence, pad=src_dict.pad()) + ) + denoising_batch_result = self._get_noising_dataset_batch( + src_tokens_no_pad=src_tokens_no_pad, src_dict=src_dict + ) + + eos, pad = src_dict.eos(), src_dict.pad() + + # Generated noisy source as source + expected_src = torch.LongTensor( + [[4, 5, 10, 11, 8, 12, 13, eos], [pad, pad, pad, 6, 8, 9, 7, eos]] + ) + # Original clean source as target (right-padded) + expected_tgt = torch.LongTensor( + [[4, 5, 10, 11, 8, 12, 13, eos], [6, 7, 8, 9, eos, pad, pad, pad]] + ) + generated_src = denoising_batch_result["net_input"]["src_tokens"] + tgt_tokens = denoising_batch_result["target"] + + self.assertTensorEqual(expected_src, generated_src) + self.assertTensorEqual(expected_tgt, tgt_tokens) + + def test_noising_dataset_without_eos(self): + """ + Similar to test noising dataset with eos except that we have to set + *append_eos_to_tgt* to ``True``. + """ + + src_dict, src_tokens, _ = self._get_test_data_with_bpe_cont_marker( + append_eos=False + ) + + # Format data for src_dataset + src_tokens = torch.t(src_tokens) + src_tokens_no_pad = [] + for src_sentence in src_tokens: + src_tokens_no_pad.append( + utils.strip_pad(tensor=src_sentence, pad=src_dict.pad()) + ) + denoising_batch_result = self._get_noising_dataset_batch( + src_tokens_no_pad=src_tokens_no_pad, + src_dict=src_dict, + append_eos_to_tgt=True, + ) + + eos, pad = src_dict.eos(), src_dict.pad() + + # Generated noisy source as source + expected_src = torch.LongTensor( + [[4, 5, 10, 11, 8, 12, 13], [pad, pad, pad, 6, 8, 9, 7]] + ) + # Original clean source as target (right-padded) + expected_tgt = torch.LongTensor( + [[4, 5, 10, 11, 8, 12, 13, eos], [6, 7, 8, 9, eos, pad, pad, pad]] + ) + + generated_src = denoising_batch_result["net_input"]["src_tokens"] + tgt_tokens = denoising_batch_result["target"] + + self.assertTensorEqual(expected_src, generated_src) + self.assertTensorEqual(expected_tgt, tgt_tokens) + + def assertTensorEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertEqual(t1.ne(t2).long().sum(), 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_online_backtranslation.py b/SpeechT5/fairseq/tests/test_online_backtranslation.py new file mode 100644 index 0000000..0ae7e77 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_online_backtranslation.py @@ -0,0 +1,206 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import tempfile +import unittest +from pathlib import Path +from typing import Any, Dict, Sequence + +import fairseq.data.indexed_dataset as indexed_dataset +import fairseq.options +import fairseq.tasks.online_backtranslation as obt +import torch +from tests import utils + + +def mk_sample(tokens: Sequence[int], batch_size: int = 2) -> Dict[str, Any]: + batch = torch.stack([torch.tensor(tokens, dtype=torch.long)] * batch_size) + sample = { + "net_input": { + "src_tokens": batch, + "prev_output_tokens": batch, + "src_lengths": torch.tensor([len(tokens)] * batch_size, dtype=torch.long), + }, + "target": batch[:, 1:], + } + return sample + + +def mk_dataset(num_samples: int, max_len: int, output: Path): + output.parent.mkdir(exist_ok=True) + idx = indexed_dataset.IndexedDatasetBuilder(str(output)) + data = torch.randint(5, 100, (num_samples, max_len)) + lengths = torch.randint(3, max_len, (num_samples,)) + for d, l in zip(data, lengths): + d[0] = 0 + idx.add_item(d[:l]) + idx.finalize(output.with_suffix(".idx")) + assert output.exists() + assert output.with_suffix(".idx").exists() + + +class OnlineBacktranslationTest(unittest.TestCase): + + tmp_dir = Path(tempfile.mkdtemp(suffix="OnlineBacktranslationTest")) + + @classmethod + def obt_task( + cls, languages: Sequence[str], data: Path = None, language_mapping: str = None + ): + dict_path = cls.tmp_dir / "dict.txt" + if not dict_path.exists(): + dictionary = utils.dummy_dictionary(100) + dictionary.save(str(dict_path)) + + if data is not None: + (data / "dict.txt").write_text(dict_path.read_text()) + else: + data = cls.tmp_dir + assert len(languages) >= 2 + + kwargs = { + "arch": "transformer", + # --max-sentences=1 for better predictability of batches + "max_sentences": 1, + # Use characteristics dimensions + "encoder_layers": 3, + "encoder_embed_dim": 12, + "encoder_ffn_embed_dim": 14, + "encoder_attention_heads": 4, + "decoder_layers": 3, + "decoder_embed_dim": 12, + "decoder_output_dim": 12, + "decoder_ffn_embed_dim": 14, + "decoder_attention_heads": 4, + # Disable dropout so we have comparable tests. + "dropout": 0, + "attention_dropout": 0, + "activation_dropout": 0, + "encoder_layerdrop": 0, + } + + args = fairseq.options.get_args( + data, + task="online_backtranslation", + mono_langs=",".join(languages), + valid_lang_pairs=f"{languages[0]}-{languages[1]}", + tokens_per_sample=256, + language_mapping=language_mapping, + **kwargs, + ) + task = obt.OnlineBackTranslationTask.setup_task(args) + # we need to build the model to have the correct dictionary + model = task.build_model(task.args) + return task, model + + def tmp_path(self, test_case: str) -> Path: + return Path(tempfile.mkdtemp(test_case, dir=self.tmp_dir)) + + def test_lang_tokens(self): + task, model = self.obt_task(["en", "ro", "zh"]) + assert obt._lang_token("en") in task.dictionary + assert obt._lang_token("ro") in task.dictionary + assert obt._lang_token("zh") in task.dictionary + + en_bos = obt._lang_token_index(task.common_dict, "en") + assert "en" == task.common_dict[en_bos].strip("_") + zh_bos = obt._lang_token_index(task.common_dict, "zh") + assert "zh" == task.common_dict[zh_bos].strip("_") + zh_sample = mk_sample([zh_bos, 16, 14, 12, 10]) + + # we expect to receive the bos token for translation + assert task.get_bos_token_from_sample(zh_sample) == en_bos + + def test_backtranslate_sample(self): + task, model = self.obt_task(["en", "ro", "zh"]) + + en_bos = obt._lang_token_index(task.common_dict, "en") + zh_bos = obt._lang_token_index(task.common_dict, "zh") + sample = mk_sample([zh_bos, 16, 14, 12, 10]) + + task.backtranslate_sample(sample, "zh", "en") + target_zh = list(sample["target"][0]) + assert target_zh == [16, 14, 12, 10] # original zh sentence + generated_en = sample["net_input"]["src_tokens"][0] + assert generated_en[0] == en_bos + + def test_train_dataset(self): + data = self.tmp_path("test_train_dataset") + mk_dataset(20, 10, data / "en" / "train.bin") + mk_dataset(10, 10, data / "zh" / "train.bin") + task, model = self.obt_task(["en", "zh"], data) + task.load_dataset("train") + + en_bos = obt._lang_token_index(task.common_dict, "en") + zh_bos = obt._lang_token_index(task.common_dict, "zh") + + train = task.datasets["train"] + train.ordered_indices() + train.prefetch([0, 19]) + sample_0 = train[0] + sample_19 = train[19] + self.assertEqual( + set(sample_0.keys()), {"en-BT", "en-DENOISE", "zh-BT", "zh-DENOISE"} + ) + for sample in (sample_0, sample_19): + self.assertEqual(sample["en-BT"]["source"][0], en_bos) + # bt target isn't ready to look at. + self.assertEqual(sample["en-DENOISE"]["source"][0], en_bos) + # TODO What could we check on the target side ? + + for i in range(10): + # Zh dataset is shorter, and is wrapped around En dataset. + train.prefetch([i, i + 10]) + self.assertEqual( + list(train[i]["zh-DENOISE"]["source"]), + list(train[i + 10]["zh-DENOISE"]["source"]), + ) + self.assertEqual(train[i]["zh-DENOISE"]["source"][0].item(), zh_bos) + + # Sorted by increasing len + self.assertLess( + len(sample_0["en-BT"]["source"]), len(sample_19["en-BT"]["source"]) + ) + + def test_valid_dataset(self): + data = self.tmp_path("test_valid_dataset") + mk_dataset(10, 21, data / "valid.en-zh.en.bin") + mk_dataset(10, 21, data / "valid.en-zh.zh.bin") + + task, model = self.obt_task(["en", "zh"], data) + valid = task.load_dataset("valid") + en_bos = obt._lang_token_index(task.common_dict, "en") + + assert valid is not None + valid.prefetch(range(10)) + sample_0 = valid[0] + sample_9 = valid[9] + self.assertEqual(sample_0["id"], 0) + self.assertEqual(sample_9["id"], 9) + self.assertEqual(sample_0["source"][0], en_bos) + self.assertEqual(sample_9["source"][0], en_bos) + # TODO: could we test the target side ? + + def assertFnMatch(self, fn, values): + for x, y in values.items(): + fn_x = fn(x) + self.assertEqual(fn_x, y, f"Fn has wrong value: fn({x}) = {fn_x} != {y}") + + def test_piecewise_linear_fn(self): + self.assertFnMatch( + obt.PiecewiseLinearFn.from_string("1.0"), {0: 1, 100: 1, 500: 1, 1000: 1} + ) + self.assertFnMatch( + obt.PiecewiseLinearFn.from_string("0:1,1000:0"), + {0: 1, 500: 0.5, 1000: 0, 2000: 0}, + ) + self.assertFnMatch( + obt.PiecewiseLinearFn.from_string("0:0,1000:1"), + {0: 0, 500: 0.5, 1000: 1, 2000: 1}, + ) + self.assertFnMatch( + obt.PiecewiseLinearFn.from_string("0:0,1000:1,2000:0"), + {0: 0, 500: 0.5, 1000: 1, 1500: 0.5, 2000: 0, 3000: 0}, + ) diff --git a/SpeechT5/fairseq/tests/test_plasma_utils.py b/SpeechT5/fairseq/tests/test_plasma_utils.py new file mode 100644 index 0000000..e6344c2 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_plasma_utils.py @@ -0,0 +1,126 @@ +import contextlib +import unittest +import tempfile +from io import StringIO + +import numpy as np + +from tests.utils import create_dummy_data, preprocess_lm_data, train_language_model + +try: + from pyarrow import plasma + from fairseq.data.plasma_utils import PlasmaView, PlasmaStore + + PYARROW_AVAILABLE = True +except ImportError: + PYARROW_AVAILABLE = False + +dummy_path = "dummy" + + +@unittest.skipUnless(PYARROW_AVAILABLE, "") +class TestPlasmaView(unittest.TestCase): + def setUp(self) -> None: + self.tmp_file = tempfile.NamedTemporaryFile() # noqa: P201 + self.path = self.tmp_file.name + self.server = PlasmaStore.start(path=self.path, nbytes=10000) + self.client = plasma.connect(self.path, num_retries=10) + + def tearDown(self) -> None: + self.client.disconnect() + self.tmp_file.close() + self.server.kill() + + def test_two_servers_do_not_share_object_id_space(self): + data_server_1 = np.array([0, 1]) + data_server_2 = np.array([2, 3]) + server_2_path = self.path + with tempfile.NamedTemporaryFile() as server_1_path: + server = PlasmaStore.start(path=server_1_path.name, nbytes=10000) + arr1 = PlasmaView( + data_server_1, dummy_path, 1, plasma_path=server_1_path.name + ) + assert len(arr1.client.list()) == 1 + assert (arr1.array == data_server_1).all() + arr2 = PlasmaView(data_server_2, dummy_path, 1, plasma_path=server_2_path) + assert (arr2.array == data_server_2).all() + assert (arr1.array == data_server_1).all() + server.kill() + + def test_hash_collision(self): + data_server_1 = np.array([0, 1]) + data_server_2 = np.array([2, 3]) + arr1 = PlasmaView(data_server_1, dummy_path, 1, plasma_path=self.path) + assert len(arr1.client.list()) == 1 + arr2 = PlasmaView(data_server_2, dummy_path, 1, plasma_path=self.path) + assert len(arr1.client.list()) == 1 + assert len(arr2.client.list()) == 1 + assert (arr2.array == data_server_1).all() + # New hash key based on tuples + arr3 = PlasmaView( + data_server_2, dummy_path, (1, 12312312312, None), plasma_path=self.path + ) + assert ( + len(arr2.client.list()) == 2 + ), "No new object was created by using a novel hash key" + assert ( + arr3.object_id in arr2.client.list() + ), "No new object was created by using a novel hash key" + assert ( + arr3.object_id in arr3.client.list() + ), "No new object was created by using a novel hash key" + del arr3, arr2, arr1 + + @staticmethod + def _assert_view_equal(pv1, pv2): + np.testing.assert_array_equal(pv1.array, pv2.array) + + def test_putting_same_array_twice(self): + data = np.array([4, 4, 4]) + arr1 = PlasmaView(data, dummy_path, 1, plasma_path=self.path) + assert len(self.client.list()) == 1 + arr1b = PlasmaView( + data, dummy_path, 1, plasma_path=self.path + ) # should not change contents of store + arr1c = PlasmaView( + None, dummy_path, 1, plasma_path=self.path + ) # should not change contents of store + + assert len(self.client.list()) == 1 + self._assert_view_equal(arr1, arr1b) + self._assert_view_equal(arr1, arr1c) + PlasmaView( + data, dummy_path, 2, plasma_path=self.path + ) # new object id, adds new entry + assert len(self.client.list()) == 2 + + new_client = plasma.connect(self.path) + assert len(new_client.list()) == 2 # new client can access same objects + assert isinstance(arr1.object_id, plasma.ObjectID) + del arr1b + del arr1c + + def test_plasma_store_full_raises(self): + with tempfile.NamedTemporaryFile() as new_path: + server = PlasmaStore.start(path=new_path.name, nbytes=10000) + with self.assertRaises(plasma.PlasmaStoreFull): + # 2000 floats is more than 2000 bytes + PlasmaView( + np.random.rand(10000, 1), dummy_path, 1, plasma_path=new_path.name + ) + server.kill() + + def test_object_id_overflow(self): + PlasmaView.get_object_id("", 2 ** 21) + + def test_training_lm_plasma(self): + with contextlib.redirect_stdout(StringIO()): + with tempfile.TemporaryDirectory("test_transformer_lm") as data_dir: + create_dummy_data(data_dir) + preprocess_lm_data(data_dir) + train_language_model( + data_dir, + "transformer_lm", + ["--use-plasma-view", "--plasma-path", self.path], + run_validation=True, + ) diff --git a/SpeechT5/fairseq/tests/test_reproducibility.py b/SpeechT5/fairseq/tests/test_reproducibility.py new file mode 100644 index 0000000..94931b2 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_reproducibility.py @@ -0,0 +1,150 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +import json +import os +import tempfile +import unittest +from io import StringIO + +import torch + +from . import test_binaries + + +class TestReproducibility(unittest.TestCase): + def _test_reproducibility( + self, + name, + extra_flags=None, + delta=0.0001, + resume_checkpoint="checkpoint1.pt", + max_epoch=3, + ): + def get_last_log_stats_containing_string(log_records, search_string): + for log_record in logs.records[::-1]: + if isinstance(log_record.msg, str) and search_string in log_record.msg: + return json.loads(log_record.msg) + + if extra_flags is None: + extra_flags = [] + + with tempfile.TemporaryDirectory(name) as data_dir: + with self.assertLogs() as logs: + test_binaries.create_dummy_data(data_dir) + test_binaries.preprocess_translation_data(data_dir) + + # train epochs 1 and 2 together + with self.assertLogs() as logs: + test_binaries.train_translation_model( + data_dir, + "fconv_iwslt_de_en", + [ + "--dropout", + "0.0", + "--log-format", + "json", + "--log-interval", + "1", + "--max-epoch", + str(max_epoch), + ] + + extra_flags, + ) + train_log = get_last_log_stats_containing_string(logs.records, "train_loss") + valid_log = get_last_log_stats_containing_string(logs.records, "valid_loss") + + # train epoch 2, resuming from previous checkpoint 1 + os.rename( + os.path.join(data_dir, resume_checkpoint), + os.path.join(data_dir, "checkpoint_last.pt"), + ) + with self.assertLogs() as logs: + test_binaries.train_translation_model( + data_dir, + "fconv_iwslt_de_en", + [ + "--dropout", + "0.0", + "--log-format", + "json", + "--log-interval", + "1", + "--max-epoch", + str(max_epoch), + ] + + extra_flags, + ) + train_res_log = get_last_log_stats_containing_string( + logs.records, "train_loss" + ) + valid_res_log = get_last_log_stats_containing_string( + logs.records, "valid_loss" + ) + + for k in ["train_loss", "train_ppl", "train_num_updates", "train_gnorm"]: + self.assertAlmostEqual( + float(train_log[k]), float(train_res_log[k]), delta=delta + ) + for k in [ + "valid_loss", + "valid_ppl", + "valid_num_updates", + "valid_best_loss", + ]: + self.assertAlmostEqual( + float(valid_log[k]), float(valid_res_log[k]), delta=delta + ) + + def test_reproducibility(self): + self._test_reproducibility("test_reproducibility") + + @unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") + def test_reproducibility_fp16(self): + self._test_reproducibility( + "test_reproducibility_fp16", + [ + "--fp16", + "--fp16-init-scale", + "4096", + ], + delta=0.011, + ) + + @unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") + def test_reproducibility_memory_efficient_fp16(self): + self._test_reproducibility( + "test_reproducibility_memory_efficient_fp16", + [ + "--memory-efficient-fp16", + "--fp16-init-scale", + "4096", + ], + ) + + @unittest.skipIf(not torch.cuda.is_available(), "test requires a GPU") + def test_reproducibility_amp(self): + self._test_reproducibility( + "test_reproducibility_amp", + [ + "--amp", + "--fp16-init-scale", + "4096", + ], + delta=0.011, + ) + + def test_mid_epoch_reproducibility(self): + self._test_reproducibility( + "test_mid_epoch_reproducibility", + ["--save-interval-updates", "3"], + resume_checkpoint="checkpoint_1_3.pt", + max_epoch=1, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_resampling_dataset.py b/SpeechT5/fairseq/tests/test_resampling_dataset.py new file mode 100644 index 0000000..ccb53a2 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_resampling_dataset.py @@ -0,0 +1,103 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import collections +import unittest + +import numpy as np +from fairseq.data import ListDataset, ResamplingDataset + + +class TestResamplingDataset(unittest.TestCase): + def setUp(self): + self.strings = ["ab", "c", "def", "ghij"] + self.weights = [4.0, 2.0, 7.0, 1.5] + self.size_ratio = 2 + self.dataset = ListDataset( + self.strings, np.array([len(s) for s in self.strings]) + ) + + def _test_common(self, resampling_dataset, iters): + assert len(self.dataset) == len(self.strings) == len(self.weights) + assert len(resampling_dataset) == self.size_ratio * len(self.strings) + + results = {"ordered_by_size": True, "max_distribution_diff": 0.0} + + totalfreqs = 0 + freqs = collections.defaultdict(int) + + for epoch_num in range(iters): + resampling_dataset.set_epoch(epoch_num) + + indices = resampling_dataset.ordered_indices() + assert len(indices) == len(resampling_dataset) + + prev_size = -1 + + for i in indices: + cur_size = resampling_dataset.size(i) + # Make sure indices map to same sequences within an epoch + assert resampling_dataset[i] == resampling_dataset[i] + + # Make sure length of sequence is correct + assert cur_size == len(resampling_dataset[i]) + + freqs[resampling_dataset[i]] += 1 + totalfreqs += 1 + + if prev_size > cur_size: + results["ordered_by_size"] = False + + prev_size = cur_size + + assert set(freqs.keys()) == set(self.strings) + for s, weight in zip(self.strings, self.weights): + freq = freqs[s] / totalfreqs + expected_freq = weight / sum(self.weights) + results["max_distribution_diff"] = max( + results["max_distribution_diff"], abs(expected_freq - freq) + ) + + return results + + def test_resampling_dataset_batch_by_size_false(self): + resampling_dataset = ResamplingDataset( + self.dataset, + self.weights, + size_ratio=self.size_ratio, + batch_by_size=False, + seed=0, + ) + + results = self._test_common(resampling_dataset, iters=1000) + + # For batch_by_size = False, the batches should be returned in + # arbitrary order of size. + assert not results["ordered_by_size"] + + # Allow tolerance in distribution error of 2%. + assert results["max_distribution_diff"] < 0.02 + + def test_resampling_dataset_batch_by_size_true(self): + resampling_dataset = ResamplingDataset( + self.dataset, + self.weights, + size_ratio=self.size_ratio, + batch_by_size=True, + seed=0, + ) + + results = self._test_common(resampling_dataset, iters=1000) + + # For batch_by_size = True, the batches should be returned in + # increasing order of size. + assert results["ordered_by_size"] + + # Allow tolerance in distribution error of 2%. + assert results["max_distribution_diff"] < 0.02 + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_roberta.py b/SpeechT5/fairseq/tests/test_roberta.py new file mode 100644 index 0000000..b0b9cfd --- /dev/null +++ b/SpeechT5/fairseq/tests/test_roberta.py @@ -0,0 +1,314 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import functools +import unittest +from typing import Any, Dict, Sequence + +import fairseq +import fairseq.options +import fairseq.tasks +import torch +from tests.utils import dummy_dictionary + +VOCAB_SIZE = 100 + + +@fairseq.tasks.register_task("fake_task") +class FakeTask(fairseq.tasks.LegacyFairseqTask): + def __init__(self, args): + super().__init__(args) + self.dictionary = dummy_dictionary(VOCAB_SIZE - 4) + assert len(self.dictionary) == VOCAB_SIZE + + @property + def source_dictionary(self): + return self.dictionary + + @property + def target_dictionary(self): + return self.dictionary + + +@functools.lru_cache() +def get_toy_model( + device: str, + architecture: str = "roberta_enc_dec", + **extra_args: Any, +): + assert device in ("gpu", "cpu") + kwargs = { + "arch": architecture, + # Use characteristics dimensions + "encoder_layers": 3, + "encoder_embed_dim": 12, + "encoder_ffn_embed_dim": 14, + "encoder_attention_heads": 4, + "decoder_layers": 3, + "decoder_embed_dim": 12, + "decoder_ffn_embed_dim": 14, + "decoder_attention_heads": 4, + # Disable dropout so we have comparable tests. + "dropout": 0, + "attention_dropout": 0, + "activation_dropout": 0, + "encoder_layerdrop": 0, + # required args + "tokens_per_sample": 256, + "data": "/tmp/test_roberta", + } + kwargs.update(extra_args) + fake_task = FakeTask(kwargs) + args = fairseq.options.get_args( + task="online_backtranslation", + mono_langs="en,ro", + valid_lang_pairs="en-ro", + **kwargs, + ) + torch.manual_seed(0) + model = fake_task.build_model(args) + if device == "gpu": + model.cuda() + return fake_task, model + + +def mk_sample( + lang: str, device: str, tok: Sequence[int] = None, batch_size: int = 2 +) -> Dict[str, Any]: + assert device in ("gpu", "cpu") + if not tok: + if lang == "en": + tok = [10, 11, 12, 13, 14, 15, 2] + else: + tok = [20, 21, 22, 23, 24, 25, 26, 27, 2] + + batch = torch.stack([torch.tensor(tok, dtype=torch.long)] * batch_size) + if device == "gpu": + batch = batch.cuda() + sample = { + "net_input": { + "src_tokens": batch, + "prev_output_tokens": batch, + "src_lengths": torch.tensor( + [len(tok)] * batch_size, dtype=torch.long, device=batch.device + ), + }, + "target": batch[:, 1:], + } + return sample + + +def cpu_gpu(fn): + def helper(self): + fn(self, "cpu") + if torch.cuda.is_available(): + fn(self, "gpu") + + return helper + + +def architectures(fn): + def helper(self): + for arch in ["roberta_enc_dec", "transformer"]: + fn(self, arch) + + return helper + + +class RobertaTest(unittest.TestCase): + def assertTensorEqual(self, t1, t2, delta: float = 1e-6): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + if delta == 0.0: + self.assertEqual(t1.ne(t2).long().sum(), 0) + else: + self.assertEqual(((t2 - t1).abs() > delta).long().sum(), 0) + + def assertSharing(self, model, link_groups: Sequence[Sequence[str]]): + ids = {} + for group in link_groups: + group_ids = {name: id(params(model, name)) for name in group} + shared_id = group_ids[group[0]] + self.assertEqual(group_ids, {name: shared_id for name in group}) + self.assertNotIn(shared_id, ids) + ids[shared_id] = group + + def test_roberta_shared_params(self): + _, roberta = get_toy_model("cpu", architecture="roberta") + self.assertSharing( + roberta, + [ + [ + "encoder.sentence_encoder.embed_tokens.weight", + "encoder.lm_head.weight", + ] + ], + ) + + _, roberta = get_toy_model( + "cpu", architecture="roberta", untie_weights_roberta=True + ) + self.assertSharing( + roberta, + [ + ["encoder.sentence_encoder.embed_tokens.weight"], + ["encoder.lm_head.weight"], + ], + ) + + def test_roberta_enc_dec_shared_params(self): + # 3 distinct embeddings + _, enc_dec = get_toy_model("cpu", architecture="roberta_enc_dec") + self.assertSharing( + enc_dec, + [ + ["encoder.embed_tokens.weight"], + ["decoder.embed_tokens.weight"], + ["decoder.output_projection.weight"], + ], + ) + + # 2 distinct embeddings, one for encoder, one for decoder + _, enc_dec = get_toy_model( + "cpu", architecture="roberta_enc_dec", share_decoder_input_output_embed=True + ) + self.assertSharing( + enc_dec, + [ + ["encoder.embed_tokens.weight"], + [ + "decoder.embed_tokens.weight", + "decoder.output_projection.weight", + ], + ], + ) + + # shared embeddings + _, enc_dec = get_toy_model( + "cpu", architecture="roberta_enc_dec", share_all_embeddings=True + ) + self.assertSharing( + enc_dec, + [ + [ + "encoder.embed_tokens.weight", + "decoder.embed_tokens.weight", + "decoder.output_projection.weight", + ] + ], + ) + + def test_roberta_max_positions_is_correctly_set(self): + device = "cpu" + task, model = get_toy_model(device) + max_pos = model.max_decoder_positions() + self.assertEqual(max_pos, 256) + self.assertEqual(max_pos, model.decoder.max_positions()) + self.assertEqual(max_pos, model.encoder.max_positions()) + self.assertEqual(max_pos, model.encoder.embed_positions.max_positions) + + sentence = [31 for _ in range(max_pos)] + sample = mk_sample("en", device, sentence, batch_size=1) + self.assertEqual(list(sample["net_input"]["src_lengths"]), [max_pos]) + self.assertEqual(len(sample["net_input"]["src_tokens"][0]), max_pos) + x, _ = model.forward(**sample["net_input"]) + self.assertEqual(x.shape, (1, max_pos, VOCAB_SIZE)) + + @cpu_gpu + def test_roberta_forward_backward(self, device: str): + _, model = get_toy_model(device) + sample = mk_sample("en", device) + en_tokens = sample["net_input"]["src_tokens"] + (bs, l) = en_tokens.shape + # Forward + logits, _ = model(**sample["net_input"]) + self.assertEqual(logits.shape, (bs, l, VOCAB_SIZE)) + + # Backward + loss = logits.sum() + loss.backward() + + @cpu_gpu + def test_roberta_forward_backward_bs1(self, device: str): + _, model = get_toy_model(device) + sample = mk_sample("en", device, batch_size=1) + o, _ = model.forward(**sample["net_input"]) + loss = o.sum() + sample2 = mk_sample("ro", device, batch_size=1) + o, _ = model.forward(**sample2["net_input"]) + loss += o.sum() + loss.backward() + + @cpu_gpu + def test_roberta_batching(self, device: str): + """ + Checks that the batch of size 2 give twice the same results than the batch of size 1. + """ + _, model = get_toy_model(device) + sample = mk_sample("en", device, batch_size=1) + slen = sample["net_input"]["src_lengths"][0] + sample2 = mk_sample("en", device, batch_size=2) + with torch.no_grad(): + z = model.encoder.forward( + sample["net_input"]["src_tokens"], sample["net_input"]["src_lengths"] + ) + z = z["encoder_out"][-1] + logits, _ = model.forward(**sample["net_input"]) + + z2 = model.encoder.forward( + sample2["net_input"]["src_tokens"], sample["net_input"]["src_lengths"] + ) + z2 = z2["encoder_out"][-1] + logits2, _ = model.forward(**sample2["net_input"]) + + self.assertEqual(z.shape, (slen, 1, 12)) + self.assertEqual(z2.shape, (slen, 2, 12)) + self.assertTensorEqual(logits2[0], logits2[1]) + self.assertTensorEqual(logits[0], logits2[0]) + + @cpu_gpu + def test_roberta_incremental_decoder(self, device: str): + """ + Checks that incremental decoding yields the same result than non incremental one. + """ + task, model = get_toy_model(device) + + en_sample = mk_sample("en", device) + en_tokens = en_sample["net_input"]["src_tokens"] + ro_sample = mk_sample("ro", device) + ro_tokens = ro_sample["net_input"]["src_tokens"] + + en_enc = model.encoder.forward( + en_tokens, src_lengths=en_sample["net_input"]["src_lengths"] + ) + (bs, tgt_len) = ro_tokens.shape + + # Decode without incremental state + ro_dec, _ = model.decoder.forward(ro_tokens, encoder_out=en_enc) + self.assertEqual(ro_dec.shape, (bs, tgt_len, VOCAB_SIZE)) + self.assertTensorEqual(ro_dec[0], ro_dec[1]) + + # Decode with incremental state + inc_state = {} + ro_dec_inc = [] + for l in range(tgt_len): + ro, _ = model.decoder.forward( + ro_tokens[:, : l + 1], encoder_out=en_enc, incremental_state=inc_state + ) + self.assertEqual(ro.shape, (bs, 1, VOCAB_SIZE)) + ro_dec_inc.append(ro) + + for l in range(tgt_len): + # Intra-batch + self.assertTensorEqual(ro_dec_inc[l][0], ro_dec_inc[l][1]) + # Incremental vs non-incremental + self.assertTensorEqual(ro_dec_inc[l][:, 0], ro_dec[:, l]) + + +def params(model, name): + if "." not in name: + return getattr(model, name) + + prefix, name = name.split(".", 1) + return params(getattr(model, prefix), name) diff --git a/SpeechT5/fairseq/tests/test_sequence_generator.py b/SpeechT5/fairseq/tests/test_sequence_generator.py new file mode 100644 index 0000000..afbdfb6 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_sequence_generator.py @@ -0,0 +1,745 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import tempfile +import unittest +import math +import numpy as np + + +import tests.utils as test_utils +import torch +from fairseq import search +from fairseq.data.dictionary import Dictionary +from fairseq.models.transformer import TransformerModel +from fairseq.sequence_generator import EnsembleModel, SequenceGenerator +from fairseq.ngram_repeat_block import NGramRepeatBlock +from fairseq.tasks.fairseq_task import LegacyFairseqTask + + +DEFAULT_TEST_VOCAB_SIZE = 100 + + +class DummyTask(LegacyFairseqTask): + def __init__(self, args): + super().__init__(args) + self.dictionary = get_dummy_dictionary() + if getattr(self.args, "ctc", False): + self.dictionary.add_symbol("<ctc_blank>") + self.src_dict = self.dictionary + self.tgt_dict = self.dictionary + + @property + def source_dictionary(self): + return self.src_dict + + @property + def target_dictionary(self): + return self.dictionary + + +def get_dummy_dictionary(vocab_size=DEFAULT_TEST_VOCAB_SIZE): + dummy_dict = Dictionary() + # add dummy symbol to satisfy vocab size + for id, _ in enumerate(range(vocab_size)): + dummy_dict.add_symbol("{}".format(id), n=1000) + return dummy_dict + + +def get_dummy_task_and_parser(): + """ + to build a fariseq model, we need some dummy parse and task. This function + is used to create dummy task and parser to faciliate model/criterion test + + Note: we use FbSpeechRecognitionTask as the dummy task. You may want + to use other task by providing another function + """ + parser = argparse.ArgumentParser( + description="test_dummy_s2s_task", argument_default=argparse.SUPPRESS + ) + DummyTask.add_args(parser) + args = parser.parse_args([]) + task = DummyTask.setup_task(args) + return task, parser + + +class TestJitSequenceGeneratorBase(unittest.TestCase): + def setUp(self): + self.task, self.parser = get_dummy_task_and_parser() + eos = self.task.tgt_dict.eos() + src_tokens = torch.randint(3, 50, (2, 10)).long() + src_tokens = torch.cat((src_tokens, torch.LongTensor([[eos], [eos]])), -1) + src_lengths = torch.LongTensor([2, 10]) + self.sample = { + "net_input": {"src_tokens": src_tokens, "src_lengths": src_lengths} + } + TransformerModel.add_args(self.parser) + args = self.parser.parse_args([]) + args.encoder_layers = 2 + args.decoder_layers = 1 + self.transformer_model = TransformerModel.build_model(args, self.task) + + def assertOutputEqual(self, hypo, pos_probs): + pos_scores = torch.FloatTensor(pos_probs).log() + self.assertTensorSizeEqual(hypo["positional_scores"], pos_scores) + self.assertTensorSizeEqual(pos_scores.numel(), hypo["tokens"].numel()) + + def assertTensorSizeEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess((t1 - t2).abs().max(), 1e-4) + + def assertTensorEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertEqual(t1.ne(t2).long().sum(), 0) + + def assertHypoEqual(self, h1, h2): + "Check two hypos are equal" + self.assertTensorEqual(h1["tokens"], h2["tokens"]) + self.assertAlmostEqual(h1["positional_scores"], h2["positional_scores"]) + self.assertLess(abs(h1["score"] - h2["score"]), 1e-6) + self.assertAlmostEqual(h1["attention"], h2["attention"]) + + def _test_save_and_load(self, scripted_module): + with tempfile.NamedTemporaryFile() as f: + scripted_module.save(f.name) + torch.jit.load(f.name) + + +JIT_MSG = "Targeting OSS scriptability for the 1.6 release" + + +@unittest.skipIf(torch.__version__ < "1.6.0", JIT_MSG) +class TestJitSequenceGenerator(TestJitSequenceGeneratorBase): + def test_export_transformer(self): + model = self.transformer_model + torch.jit.script(model) + + def test_ensemble_sequence_generator(self): + model = self.transformer_model + generator = SequenceGenerator( + [model], + self.task.tgt_dict, + beam_size=2, + no_repeat_ngram_size=2, + max_len_b=10, + ) + scripted_model = torch.jit.script(generator) + self._test_save_and_load(scripted_model) + + def test_export_ensemble_model(self): + model = self.transformer_model + ensemble_models = EnsembleModel([model]) + torch.jit.script(ensemble_models) + + +class TestExportSearch(unittest.TestCase): + def setUp(self): + task, _ = get_dummy_task_and_parser() + self.tgt_dict = task.tgt_dict + self.min_top1_prob = 0.4 + + def test_export_diverse_bs(self): + search_strategy = search.DiverseBeamSearch( + self.tgt_dict, num_groups=2, diversity_strength=0.0 + ) + torch.jit.script(search_strategy) + + def test_export_sampling(self): + low_sampling_topp = self.min_top1_prob / 2.0 + search_strategy = search.Sampling( + self.tgt_dict, sampling_topp=low_sampling_topp + ) + torch.jit.script(search_strategy) + + def test_export_diverse_siblings_search(self): + search_strategy = search.DiverseSiblingsSearch( + self.tgt_dict, diversity_rate=0.5 + ) + torch.jit.script(search_strategy) + + +class TestSequenceGeneratorBase(unittest.TestCase): + def assertHypoTokens(self, hypo, tokens): + self.assertTensorEqual(hypo["tokens"], torch.LongTensor(tokens)) + + def assertHypoScore(self, hypo, pos_probs, normalized=True, lenpen=1.0): + pos_scores = torch.FloatTensor(pos_probs).log() + self.assertAlmostEqual(hypo["positional_scores"], pos_scores) + self.assertEqual(pos_scores.numel(), hypo["tokens"].numel()) + score = pos_scores.sum() + if normalized: + score /= pos_scores.numel() ** lenpen + self.assertLess(abs(score - hypo["score"]), 1e-6) + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess((t1 - t2).abs().max(), 1e-4) + + def assertTensorEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertEqual(t1.ne(t2).long().sum(), 0) + + +class TestSequenceGenerator(TestSequenceGeneratorBase): + def setUp(self): + ( + self.tgt_dict, + self.w1, + self.w2, + src_tokens, + src_lengths, + self.model, + ) = test_utils.sequence_generator_setup() + self.sample = { + "net_input": {"src_tokens": src_tokens, "src_lengths": src_lengths} + } + + def test_with_normalization(self): + generator = SequenceGenerator([self.model], self.tgt_dict, beam_size=2) + hypos = generator.forward(self.sample) + eos, w1, w2 = self.tgt_dict.eos(), self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, eos]) + self.assertHypoScore(hypos[0][0], [0.9, 1.0]) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w2, w1, w2, eos]) + self.assertHypoScore(hypos[0][1], [0.1, 0.9, 0.9, 1.0]) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w2, w1, eos]) + self.assertHypoScore(hypos[1][0], [0.7, 0.4, 0.4, 1.0]) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w1, w2, eos]) + self.assertHypoScore(hypos[1][1], [0.7, 0.4, 0.6]) + + def test_without_normalization(self): + # Sentence 1: unchanged from the normalized case + # Sentence 2: beams swap order + generator = SequenceGenerator( + [self.model], self.tgt_dict, beam_size=2, normalize_scores=False + ) + hypos = generator.forward(self.sample) + eos, w1, w2 = self.tgt_dict.eos(), self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, eos]) + self.assertHypoScore(hypos[0][0], [0.9, 1.0], normalized=False) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w2, w1, w2, eos]) + self.assertHypoScore(hypos[0][1], [0.1, 0.9, 0.9, 1.0], normalized=False) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w2, eos]) + self.assertHypoScore(hypos[1][0], [0.7, 0.4, 0.6], normalized=False) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w1, w2, w1, eos]) + self.assertHypoScore(hypos[1][1], [0.7, 0.4, 0.4, 1.0], normalized=False) + + def test_with_lenpen_favoring_short_hypos(self): + lenpen = 0.6 + generator = SequenceGenerator( + [self.model], self.tgt_dict, beam_size=2, len_penalty=lenpen + ) + hypos = generator.forward(self.sample) + eos, w1, w2 = self.tgt_dict.eos(), self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, eos]) + self.assertHypoScore(hypos[0][0], [0.9, 1.0], lenpen=lenpen) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w2, w1, w2, eos]) + self.assertHypoScore(hypos[0][1], [0.1, 0.9, 0.9, 1.0], lenpen=lenpen) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w2, eos]) + self.assertHypoScore(hypos[1][0], [0.7, 0.4, 0.6], lenpen=lenpen) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w1, w2, w1, eos]) + self.assertHypoScore(hypos[1][1], [0.7, 0.4, 0.4, 1.0], lenpen=lenpen) + + def test_with_lenpen_favoring_long_hypos(self): + lenpen = 5.0 + generator = SequenceGenerator( + [self.model], self.tgt_dict, beam_size=2, len_penalty=lenpen + ) + hypos = generator.forward(self.sample) + eos, w1, w2 = self.tgt_dict.eos(), self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w2, w1, w2, eos]) + self.assertHypoScore(hypos[0][0], [0.1, 0.9, 0.9, 1.0], lenpen=lenpen) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w1, eos]) + self.assertHypoScore(hypos[0][1], [0.9, 1.0], lenpen=lenpen) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w2, w1, eos]) + self.assertHypoScore(hypos[1][0], [0.7, 0.4, 0.4, 1.0], lenpen=lenpen) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w1, w2, eos]) + self.assertHypoScore(hypos[1][1], [0.7, 0.4, 0.6], lenpen=lenpen) + + def test_maxlen(self): + generator = SequenceGenerator( + [self.model], self.tgt_dict, beam_size=2, max_len_b=2 + ) + hypos = generator.forward(self.sample) + eos, w1, w2 = self.tgt_dict.eos(), self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, eos]) + self.assertHypoScore(hypos[0][0], [0.9, 1.0]) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w2, w2, eos]) + self.assertHypoScore(hypos[0][1], [0.1, 0.1, 0.6]) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w2, eos]) + self.assertHypoScore(hypos[1][0], [0.7, 0.4, 0.6]) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w2, w2, eos]) + self.assertHypoScore(hypos[1][1], [0.3, 0.9, 0.01]) + + def test_encoder_with_different_output_len(self): + args = self.model.encoder.args + task = test_utils.TestTranslationTask.setup_task( + args, self.tgt_dict, self.tgt_dict + ) + reshaping_model = test_utils.TestReshapingModel.build_model(args, task) + generator = SequenceGenerator( + [reshaping_model], self.tgt_dict, beam_size=2, max_len_b=2 + ) + hypos = generator.forward(self.sample) + for sent in [0, 1]: + for beam in [0, 1]: + assert hypos[sent][beam]["attention"] is not None + + def test_generation_with_additional_input(self): + args = self.model.encoder.args + task = test_utils.TestTranslationTask.setup_task( + args, self.tgt_dict, self.tgt_dict + ) + add_input_model = test_utils.TestAdditionalInputModel.build_model(args, task) + generator = SequenceGenerator([add_input_model], self.tgt_dict, beam_size=2) + sample = self.sample.copy() + sample["net_input"]["fancy_other_input"] = sample["net_input"]["src_tokens"] + hypos = generator.forward(self.sample) + eos, w1, w2 = self.tgt_dict.eos(), self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, eos]) + self.assertHypoScore(hypos[0][0], [0.9, 1.0]) + + +@unittest.skipUnless(torch.cuda.is_available(), "") +class TestRepeatNgramBlocking(TestSequenceGeneratorBase): + @classmethod + def setUpClass(cls): + ( + cls.tgt_dict, + cls.w1, + cls.w2, + src_tokens, + src_lengths, + cls.model, + ) = test_utils.sequence_generator_setup() + return cls + + def test_finds_repetitive_tokens(self): + bsz, vocab_size, beam_size, step = 2, 4, 1, 3 + generated_tok = torch.tensor( + [[2, 2, 2, 2], [3, 3, 3, 3]], dtype=torch.long, device="cuda" + ) + lprobs = torch.zeros((beam_size * bsz, vocab_size), device="cuda") + desired_result = lprobs.new_tensor( + [[0.0, 0.0, -math.inf, 0.0], [0.0, 0.0, 0.0, -math.inf]] + ) + + cuda_ext_result, baseline_result = self._compare_cuda_ext_to_default_implem( + bsz, beam_size, generated_tok, lprobs, step, 2 + ) + self.assertTensorEqual(cuda_ext_result, desired_result) + self.assertTensorEqual(baseline_result, desired_result) + + @unittest.skipIf(torch.__version__ < "1.6.0", JIT_MSG) + def test_jit_no_extension(self): + bsz, vocab_size, beam_size, step = 2, 4, 1, 3 + generated_tok = torch.tensor( + [[2, 2, 2, 2], [3, 3, 3, 3]], dtype=torch.long, device="cuda" + ) + lprobs = torch.zeros((beam_size * bsz, vocab_size), device="cuda") + blocker = NGramRepeatBlock(2, use_extension=False) + base_result = blocker(generated_tok, lprobs.clone(), bsz, beam_size, step) + scripted_blocker = torch.jit.script(blocker) + jit_result = scripted_blocker( + generated_tok, lprobs.clone(), bsz, beam_size, step + ) + self.assertTensorEqual(base_result, jit_result) + + def test_ngram_blocking_same_as_default_implem(self): + """Test that cuda extension returns same things as default impl in many settings.""" + vocab_size = 4 + step = 6 + for _ in range(2): + block_param = np.random.choice([1, 2, 3, 4]) + batch_size = np.random.randint(1, 8) + beam_size = np.random.choice([1, 2, 4, 8]) + lprobs = torch.zeros((beam_size * batch_size, vocab_size), device="cuda") + + generated_tok = torch.tensor( + np.random.randint( + 0, vocab_size, size=(batch_size * beam_size, step + 1) + ), + device="cuda", + dtype=torch.long, + ) + self._compare_cuda_ext_to_default_implem( + batch_size, + beam_size, + generated_tok, + lprobs, + step, + block_param, + ) + + def _compare_cuda_ext_to_default_implem( + self, bsz, beam_size, generated_tok, lprobs, step, block_param + ): + """Assert that cuda extension and default implem return the same thing.""" + blocker = NGramRepeatBlock(block_param) + assert blocker.use_extension, "Extension not compiled" + cuda_ext_result = blocker( + generated_tok, + lprobs.clone(), + bsz, + beam_size, + step, + ) + blocker.use_extension = False + baseline_result = blocker( + generated_tok, + lprobs.clone(), + bsz, + beam_size, + step, + ) + self.assertTensorEqual(cuda_ext_result, baseline_result) + blocker.use_extension = True + return cuda_ext_result, baseline_result + + +class TestDiverseBeamSearch(TestSequenceGeneratorBase): + def setUp(self): + # construct dummy dictionary + d = test_utils.dummy_dictionary(vocab_size=2) + self.assertEqual(d.pad(), 1) + self.assertEqual(d.eos(), 2) + self.assertEqual(d.unk(), 3) + self.eos = d.eos() + self.w1 = 4 + self.w2 = 5 + + # construct source data + self.src_tokens = torch.LongTensor( + [ + [self.w1, self.w2, self.eos], + [self.w1, self.w2, self.eos], + ] + ) + self.src_lengths = torch.LongTensor([2, 2]) + + args = argparse.Namespace() + unk = 0.0 + args.beam_probs = [ + # step 0: + torch.FloatTensor( + [ + # eos w1 w2 + # sentence 1: + [0.0, unk, 0.9, 0.1], # beam 1 + [0.0, unk, 0.9, 0.1], # beam 2 + # sentence 2: + [0.0, unk, 0.7, 0.3], + [0.0, unk, 0.7, 0.3], + ] + ), + # step 1: + torch.FloatTensor( + [ + # eos w1 w2 + # sentence 1: + [0.0, unk, 0.6, 0.4], + [0.0, unk, 0.6, 0.4], + # sentence 2: + [0.25, unk, 0.35, 0.4], + [0.25, unk, 0.35, 0.4], + ] + ), + # step 2: + torch.FloatTensor( + [ + # eos w1 w2 + # sentence 1: + [1.0, unk, 0.0, 0.0], + [1.0, unk, 0.0, 0.0], + # sentence 2: + [0.9, unk, 0.1, 0.0], + [0.9, unk, 0.1, 0.0], + ] + ), + ] + + task = test_utils.TestTranslationTask.setup_task(args, d, d) + self.model = task.build_model(args) + self.tgt_dict = task.target_dictionary + + def test_diverse_beam_search(self): + search_strategy = search.DiverseBeamSearch( + self.tgt_dict, num_groups=2, diversity_strength=0.0 + ) + generator = SequenceGenerator( + [self.model], + self.tgt_dict, + beam_size=2, + search_strategy=search_strategy, + ) + sample = { + "net_input": { + "src_tokens": self.src_tokens, + "src_lengths": self.src_lengths, + } + } + hypos = generator.forward(sample) + eos, w1, w2 = self.eos, self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, w1, eos]) + self.assertHypoScore(hypos[0][0], [0.9, 0.6, 1.0]) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w1, w1, eos]) + self.assertHypoScore(hypos[0][1], [0.9, 0.6, 1.0]) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w2, eos]) + self.assertHypoScore(hypos[1][0], [0.7, 0.4, 0.9]) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w1, w2, eos]) + self.assertHypoScore(hypos[1][1], [0.7, 0.4, 0.9]) + + +class TestDiverseSiblingsSearch(TestDiverseBeamSearch): + def assertHypoScore( + self, hypo, pos_probs, sibling_rank, diversity_rate, normalized=True, lenpen=1.0 + ): + pos_scores = torch.FloatTensor(pos_probs).log() + pos_scores.sub_(torch.Tensor(sibling_rank) * diversity_rate) + self.assertAlmostEqual(hypo["positional_scores"], pos_scores) + self.assertEqual(pos_scores.numel(), hypo["tokens"].numel()) + score = pos_scores.sum() + if normalized: + score /= pos_scores.numel() ** lenpen + self.assertLess(abs(score - hypo["score"]), 1e-6) + + def test_diverse_beam_search(self): + search_strategy = search.DiverseSiblingsSearch( + self.tgt_dict, diversity_rate=0.5 + ) + generator = SequenceGenerator( + [self.model], self.tgt_dict, beam_size=2, search_strategy=search_strategy + ) + sample = { + "net_input": { + "src_tokens": self.src_tokens, + "src_lengths": self.src_lengths, + } + } + hypos = generator.forward(sample) + eos, w1, w2 = self.eos, self.w1, self.w2 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, w1, eos]) + self.assertHypoScore(hypos[0][0], [0.9, 0.6, 1.0], [0, 1, 1], 0.5) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w1, w2, eos]) + self.assertHypoScore(hypos[0][1], [0.9, 0.4, 1.0], [0, 2, 1], 0.5) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w2, eos]) + self.assertHypoScore(hypos[1][0], [0.7, 0.4, 0.9], [0, 1, 1], 0.5) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w1, w1, eos]) + self.assertHypoScore(hypos[1][1], [0.7, 0.35, 0.9], [0, 2, 1], 0.5) + + +class TestTopPSamplingSearch(TestSequenceGeneratorBase): + def setUp(self): + # construct dummy dictionary + d = test_utils.dummy_dictionary(vocab_size=2) + self.assertEqual(d.pad(), 1) + self.assertEqual(d.eos(), 2) + self.assertEqual(d.unk(), 3) + self.eos = d.eos() + self.w1 = 4 + self.w2 = 5 + + # construct source data + self.src_tokens = torch.LongTensor( + [ + [self.w1, self.w2, self.eos], + [self.w1, self.w2, self.eos], + ] + ) + self.src_lengths = torch.LongTensor([2, 2]) + + args = argparse.Namespace() + unk = 0.0 + # The minimal probability of top 2 tokens. + self.min_top2_prob = 0.75 + # The minimal probability of the top 1 token. + self.min_top1_prob = 0.4 + + w1_prob = self.min_top1_prob + w2_prob = self.min_top2_prob - self.min_top1_prob + eos_prob = 1 - self.min_top2_prob + + args.beam_probs = [ + # step 0: + torch.FloatTensor( + [ + # eos w1 w2 + [0.0, unk, 1.0, 0.0], + [0.0, unk, 1.0, 0.0], + [0.0, unk, 1.0, 0.0], + [0.0, unk, 1.0, 0.0], + ] + ), + # step 1: + torch.FloatTensor( + [ + # eos w1 w2 + [eos_prob, unk, w1_prob, w2_prob], + [eos_prob, unk, w1_prob, w2_prob], + [eos_prob, unk, w1_prob, w2_prob], + [eos_prob, unk, w1_prob, w2_prob], + ] + ), + # step 2: + torch.FloatTensor( + [ + # eos w1 w2 + [1.0, unk, 0.0, 0.0], + [1.0, unk, 0.0, 0.0], + [1.0, unk, 0.0, 0.0], + [1.0, unk, 0.0, 0.0], + ] + ), + ] + + task = test_utils.TestTranslationTask.setup_task(args, d, d) + self.model = task.build_model(args) + self.tgt_dict = task.target_dictionary + + def test_topp_sampling_search_low_prob(self): + # Given a prob low enough to top-P sampling, we expect only the top + # 1 token to be sampled, which always results in the same output. + low_sampling_topp = self.min_top1_prob / 2.0 + search_strategy = search.Sampling( + self.tgt_dict, sampling_topp=low_sampling_topp + ) + generator = SequenceGenerator( + [self.model], self.tgt_dict, beam_size=2, search_strategy=search_strategy + ) + sample = { + "net_input": { + "src_tokens": self.src_tokens, + "src_lengths": self.src_lengths, + } + } + hypos = generator.forward(sample) + eos, w1 = self.eos, self.w1 + # sentence 1, beam 1 + self.assertHypoTokens(hypos[0][0], [w1, w1, eos]) + self.assertHypoScore(hypos[0][0], [1.0, 0.4, 1.0]) + # sentence 1, beam 2 + self.assertHypoTokens(hypos[0][1], [w1, w1, eos]) + self.assertHypoScore(hypos[0][1], [1.0, 0.4, 1.0]) + # sentence 2, beam 1 + self.assertHypoTokens(hypos[1][0], [w1, w1, eos]) + self.assertHypoScore(hypos[1][0], [1.0, 0.4, 1.0]) + # sentence 2, beam 2 + self.assertHypoTokens(hypos[1][1], [w1, w1, eos]) + self.assertHypoScore(hypos[1][1], [1.0, 0.4, 1.0]) + + def test_topp_sampling_search_high_prob(self): + # Given a prob high enough to top-P sampling, any of the top 2 + # tokens could be sampled. This can cause different outputs. + high_sampling_topp = (self.min_top1_prob + self.min_top2_prob) / 2.0 + search_strategy = search.Sampling( + self.tgt_dict, sampling_topp=high_sampling_topp + ) + generator = SequenceGenerator( + [self.model], self.tgt_dict, beam_size=2, search_strategy=search_strategy + ) + sample = { + "net_input": { + "src_tokens": self.src_tokens, + "src_lengths": self.src_lengths, + } + } + hypos = generator.forward(sample) + eos, w1, w2 = self.eos, self.w1, self.w2 + # sentence 1, beam 1 + self.assertTrue( + self.hypoTokens(hypos[0][0], [w1, w1, eos]) + or self.hypoTokens(hypos[0][0], [w1, w2, eos]) + ) + self.assertTrue( + self.hypoScore(hypos[0][0], [1.0, 0.4, 1.0]) + or self.hypoScore(hypos[0][0], [1.0, 0.35, 1.0]) + ) + + # sentence 1, beam 2 + self.assertTrue( + self.hypoTokens(hypos[0][1], [w1, w1, eos]) + or self.hypoTokens(hypos[0][1], [w1, w2, eos]) + ) + self.assertTrue( + self.hypoScore(hypos[0][1], [1.0, 0.4, 1.0]) + or self.hypoScore(hypos[0][1], [1.0, 0.35, 1.0]) + ) + + # sentence 2, beam 1 + self.assertTrue( + self.hypoTokens(hypos[1][0], [w1, w1, eos]) + or self.hypoTokens(hypos[1][0], [w1, w2, eos]) + ) + self.assertTrue( + self.hypoScore(hypos[1][0], [1.0, 0.4, 1.0]) + or self.hypoScore(hypos[1][0], [1.0, 0.35, 1.0]) + ) + + # sentence 2, beam 2 + self.assertTrue( + self.hypoTokens(hypos[1][1], [w1, w1, eos]) + or self.hypoTokens(hypos[1][1], [w1, w2, eos]) + ) + self.assertTrue( + self.hypoScore(hypos[1][1], [1.0, 0.4, 1.0]) + or self.hypoScore(hypos[1][1], [1.0, 0.35, 1.0]) + ) + + def hypoTokens(self, hypo, tokens): + return self.tensorEqual(hypo["tokens"], torch.LongTensor(tokens)) + + def hypoScore(self, hypo, pos_probs, normalized=True, lenpen=1.0): + pos_scores = torch.FloatTensor(pos_probs).log() + if not self.almostEqual(hypo["positional_scores"], pos_scores): + return False + if pos_scores.numel() != hypo["tokens"].numel(): + return False + score = pos_scores.sum() + if normalized: + score /= pos_scores.numel() ** lenpen + return abs(score - hypo["score"]) < 1e-6 + + def almostEqual(self, t1, t2): + return t1.size() == t2.size() and (t1 - t2).abs().max() < 1e-4 + + def tensorEqual(self, t1, t2): + return t1.size() == t2.size() and t1.ne(t2).long().sum() == 0 + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_sequence_scorer.py b/SpeechT5/fairseq/tests/test_sequence_scorer.py new file mode 100644 index 0000000..42f9447 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_sequence_scorer.py @@ -0,0 +1,120 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import unittest + +import tests.utils as test_utils +import torch +from fairseq.sequence_scorer import SequenceScorer + + +class TestSequenceScorer(unittest.TestCase): + def test_sequence_scorer(self): + # construct dummy dictionary + d = test_utils.dummy_dictionary(vocab_size=2) + self.assertEqual(d.pad(), 1) + self.assertEqual(d.eos(), 2) + self.assertEqual(d.unk(), 3) + eos = d.eos() + w1 = 4 + w2 = 5 + + # construct dataloader + data = [ + { + "source": torch.LongTensor([w1, w2, eos]), + "target": torch.LongTensor([w1, w2, w1, eos]), + }, + { + "source": torch.LongTensor([w2, eos]), + "target": torch.LongTensor([w2, w1, eos]), + }, + { + "source": torch.LongTensor([w2, eos]), + "target": torch.LongTensor([w2, eos]), + }, + ] + data_itr = test_utils.dummy_dataloader(data) + + # specify expected output probabilities + args = argparse.Namespace() + unk = 0.0 + args.beam_probs = [ + # step 0: + torch.FloatTensor( + [ + # eos w1 w2 + [0.0, unk, 0.6, 0.4], # sentence 1 + [0.0, unk, 0.4, 0.6], # sentence 2 + [0.0, unk, 0.7, 0.3], # sentence 3 + ] + ), + # step 1: + torch.FloatTensor( + [ + # eos w1 w2 + [0.0, unk, 0.2, 0.7], # sentence 1 + [0.0, unk, 0.8, 0.2], # sentence 2 + [0.7, unk, 0.1, 0.2], # sentence 3 + ] + ), + # step 2: + torch.FloatTensor( + [ + # eos w1 w2 + [0.10, unk, 0.50, 0.4], # sentence 1 + [0.15, unk, 0.15, 0.7], # sentence 2 + [0.00, unk, 0.00, 0.0], # sentence 3 + ] + ), + # step 3: + torch.FloatTensor( + [ + # eos w1 w2 + [0.9, unk, 0.05, 0.05], # sentence 1 + [0.0, unk, 0.00, 0.0], # sentence 2 + [0.0, unk, 0.00, 0.0], # sentence 3 + ] + ), + ] + expected_scores = [ + [0.6, 0.7, 0.5, 0.9], # sentence 1 + [0.6, 0.8, 0.15], # sentence 2 + [0.3, 0.7], # sentence 3 + ] + + task = test_utils.TestTranslationTask.setup_task(args, d, d) + model = task.build_model(args) + scorer = SequenceScorer(task.target_dictionary) + for sample in data_itr: + hypos = task.inference_step(scorer, [model], sample) + for id, hypos_id in zip(sample["id"].tolist(), hypos): + self.assertHypoTokens(hypos_id[0], data[id]["target"]) + self.assertHypoScore(hypos_id[0], expected_scores[id]) + + def assertHypoTokens(self, hypo, tokens): + self.assertTensorEqual(hypo["tokens"], torch.LongTensor(tokens)) + + def assertHypoScore(self, hypo, pos_probs, normalized=True, lenpen=1.0): + pos_scores = torch.FloatTensor(pos_probs).log() + self.assertAlmostEqual(hypo["positional_scores"], pos_scores) + self.assertEqual(pos_scores.numel(), hypo["tokens"].numel()) + score = pos_scores.sum() + if normalized: + score /= pos_scores.numel() ** lenpen + self.assertLess(abs(score - hypo["score"]), 1e-6) + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess((t1 - t2).abs().max(), 1e-4) + + def assertTensorEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertEqual(t1.ne(t2).long().sum(), 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_sparse_multihead_attention.py b/SpeechT5/fairseq/tests/test_sparse_multihead_attention.py new file mode 100644 index 0000000..3e32b25 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_sparse_multihead_attention.py @@ -0,0 +1,114 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +from fairseq.modules.sparse_multihead_attention import SparseMultiheadAttention + + +class TestSparseMultiheadAttention(unittest.TestCase): + def test_sparse_multihead_attention(self): + attn_weights = torch.randn(1, 8, 8) + bidirectional_sparse_mask = torch.tensor( + [ + [0, 0, 0, 0, 0, float("-inf"), float("-inf"), 0], + [0, 0, 0, 0, 0, float("-inf"), float("-inf"), 0], + [0, 0, 0, 0, 0, float("-inf"), float("-inf"), 0], + [0, 0, 0, 0, 0, float("-inf"), float("-inf"), 0], + [float("-inf"), float("-inf"), float("-inf"), 0, 0, 0, 0, 0], + [float("-inf"), float("-inf"), float("-inf"), 0, 0, 0, 0, 0], + [float("-inf"), float("-inf"), float("-inf"), 0, 0, 0, 0, 0], + [float("-inf"), float("-inf"), float("-inf"), 0, 0, 0, 0, 0], + ] + ) + + bidirectional_attention = SparseMultiheadAttention( + 16, 1, stride=4, expressivity=1, is_bidirectional=True + ) + bidirectional_attention_sparse_mask = ( + bidirectional_attention.buffered_sparse_mask(attn_weights, 8, 8) + ) + torch.all( + torch.eq(bidirectional_attention_sparse_mask, bidirectional_sparse_mask) + ) + + sparse_mask = torch.tensor( + [ + [ + 0, + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + ], + [ + 0, + 0, + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + ], + [ + 0, + 0, + 0, + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + ], + [ + 0, + 0, + 0, + 0, + float("-inf"), + float("-inf"), + float("-inf"), + float("-inf"), + ], + [0, 0, 0, 0, 0, float("-inf"), float("-inf"), float("-inf")], + [ + float("-inf"), + float("-inf"), + float("-inf"), + 0, + 0, + 0, + float("-inf"), + float("-inf"), + ], + [ + float("-inf"), + float("-inf"), + float("-inf"), + 0, + 0, + 0, + 0, + float("-inf"), + ], + [float("-inf"), float("-inf"), float("-inf"), 0, 0, 0, 0, 0], + ] + ) + + attention = SparseMultiheadAttention( + 16, 1, stride=4, expressivity=1, is_bidirectional=False + ) + attention_sparse_mask = attention.buffered_sparse_mask(attn_weights, 8, 8) + + torch.all(torch.eq(attention_sparse_mask, sparse_mask)) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_token_block_dataset.py b/SpeechT5/fairseq/tests/test_token_block_dataset.py new file mode 100644 index 0000000..c4d7b76 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_token_block_dataset.py @@ -0,0 +1,92 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import tests.utils as test_utils +import torch +from fairseq.data import TokenBlockDataset + + +class TestTokenBlockDataset(unittest.TestCase): + def _build_dataset(self, data, **kwargs): + sizes = [len(x) for x in data] + underlying_ds = test_utils.TestDataset(data) + return TokenBlockDataset(underlying_ds, sizes, **kwargs) + + def test_eos_break_mode(self): + data = [ + torch.tensor([5, 4, 3, 2, 1], dtype=torch.long), + torch.tensor([1], dtype=torch.long), + torch.tensor([8, 7, 6, 1], dtype=torch.long), + ] + ds = self._build_dataset(data, block_size=None, pad=0, eos=1, break_mode="eos") + self.assertEqual(ds[0].tolist(), [5, 4, 3, 2, 1]) + self.assertEqual(ds[1].tolist(), [1]) + self.assertEqual(ds[2].tolist(), [8, 7, 6, 1]) + + data = [ + torch.tensor([5, 4, 3, 2, 1], dtype=torch.long), + torch.tensor([8, 7, 6, 1], dtype=torch.long), + torch.tensor([1], dtype=torch.long), + ] + ds = self._build_dataset(data, block_size=None, pad=0, eos=1, break_mode="eos") + self.assertEqual(ds[0].tolist(), [5, 4, 3, 2, 1]) + self.assertEqual(ds[1].tolist(), [8, 7, 6, 1]) + self.assertEqual(ds[2].tolist(), [1]) + + def test_block_break_mode(self): + data = [ + torch.tensor([5, 4, 3, 2, 1], dtype=torch.long), + torch.tensor([8, 7, 6, 1], dtype=torch.long), + torch.tensor([9, 1], dtype=torch.long), + ] + ds = self._build_dataset(data, block_size=3, pad=0, eos=1, break_mode="none") + self.assertEqual(ds[0].tolist(), [5, 4, 3]) + self.assertEqual(ds[1].tolist(), [2, 1, 8]) + self.assertEqual(ds[2].tolist(), [7, 6, 1]) + self.assertEqual(ds[3].tolist(), [9, 1]) + + def test_complete_break_mode(self): + data = [ + torch.tensor([5, 4, 3, 2, 1], dtype=torch.long), + torch.tensor([8, 7, 6, 1], dtype=torch.long), + torch.tensor([9, 1], dtype=torch.long), + ] + ds = self._build_dataset( + data, block_size=6, pad=0, eos=1, break_mode="complete" + ) + self.assertEqual(ds[0].tolist(), [5, 4, 3, 2, 1]) + self.assertEqual(ds[1].tolist(), [8, 7, 6, 1, 9, 1]) + + data = [ + torch.tensor([4, 3, 2, 1], dtype=torch.long), + torch.tensor([5, 1], dtype=torch.long), + torch.tensor([1], dtype=torch.long), + torch.tensor([6, 1], dtype=torch.long), + ] + ds = self._build_dataset( + data, block_size=3, pad=0, eos=1, break_mode="complete" + ) + self.assertEqual(ds[0].tolist(), [4, 3, 2, 1]) + self.assertEqual(ds[1].tolist(), [5, 1, 1]) + self.assertEqual(ds[2].tolist(), [6, 1]) + + def test_4billion_tokens(self): + """Regression test for numpy type promotion issue https://github.com/numpy/numpy/issues/5745""" + data = [torch.tensor(list(range(10000)), dtype=torch.long)] * 430000 + ds = self._build_dataset( + data, block_size=6, pad=0, eos=1, break_mode="complete" + ) + ds[-1] # __getitem__ works + start, end = ds.slice_indices[-1] + assert end > 4294967295 # data must be sufficiently large to overflow uint32 + assert not isinstance( + end + 1, float + ) # this would also raise, since np.uint64(1) + 1 => 2.0 + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_train.py b/SpeechT5/fairseq/tests/test_train.py new file mode 100644 index 0000000..65f4683 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_train.py @@ -0,0 +1,246 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import contextlib +import logging +import unittest +from io import StringIO +from unittest.mock import MagicMock, patch + +import torch +from fairseq import checkpoint_utils, data +from omegaconf import OmegaConf + + +def mock_trainer(epoch, num_updates, iterations_in_epoch): + trainer = MagicMock() + trainer.load_checkpoint.return_value = { + "train_iterator": { + "epoch": epoch, + "iterations_in_epoch": iterations_in_epoch, + "shuffle": False, + }, + } + trainer.get_num_updates.return_value = num_updates + return trainer + + +def mock_dict(): + d = MagicMock() + d.pad.return_value = 1 + d.eos.return_value = 2 + d.unk.return_value = 3 + return d + + +def get_trainer_and_epoch_itr(epoch, epoch_size, num_updates, iterations_in_epoch): + tokens = torch.LongTensor(list(range(epoch_size))).view(1, -1) + tokens_ds = data.TokenBlockDataset( + tokens, + sizes=[tokens.size(-1)], + block_size=1, + pad=0, + eos=1, + include_targets=False, + ) + trainer = mock_trainer(epoch, num_updates, iterations_in_epoch) + dataset = data.LanguagePairDataset( + tokens_ds, tokens_ds.sizes, mock_dict(), shuffle=False + ) + epoch_itr = data.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=[[i] for i in range(epoch_size)], + ) + return trainer, epoch_itr + + +def get_mock_cfg(finetune_from_model): + cfg_mock = OmegaConf.create( + { + "checkpoint": { + "optimizer_overrides": "{}", + "reset_dataloader": False, + "reset_meters": False, + "reset_optimizer": False, + "reset_lr_scheduler": False, + "finetune_from_model": finetune_from_model, + "model_parallel_size": 1, + "restore_file": "checkpoint_last.pt", + }, + "common": { + "model_parallel_size": 1, + }, + } + ) + return cfg_mock + + +class TestLoadCheckpoint(unittest.TestCase): + def setUp(self): + self.cfg_mock = get_mock_cfg(None) + self.patches = { + "os.makedirs": MagicMock(), + "os.path.join": MagicMock(), + "os.path.isfile": MagicMock(return_value=True), + "os.path.isabs": MagicMock(return_value=False), + "fairseq.file_io.PathManager.exists": MagicMock(return_value=False), + } + self.applied_patches = [patch(p, d) for p, d in self.patches.items()] + [p.start() for p in self.applied_patches] + logging.disable(logging.CRITICAL) + + def tearDown(self): + patch.stopall() + logging.disable(logging.NOTSET) + + def test_load_partial_checkpoint(self): + with contextlib.redirect_stdout(StringIO()): + trainer, epoch_itr = get_trainer_and_epoch_itr(2, 150, 200, 50) + trainer.get_train_iterator = MagicMock(return_value=epoch_itr) + + _, epoch_itr = checkpoint_utils.load_checkpoint( + self.cfg_mock.checkpoint, trainer + ) + + self.assertEqual(epoch_itr.epoch, 2) + self.assertEqual(epoch_itr.iterations_in_epoch, 50) + + itr = epoch_itr.next_epoch_itr(shuffle=False) + self.assertEqual(epoch_itr.epoch, 2) + self.assertEqual(epoch_itr.iterations_in_epoch, 50) + + self.assertEqual(next(itr)["net_input"]["src_tokens"][0].item(), 50) + self.assertEqual(epoch_itr.iterations_in_epoch, 51) + + for _ in range(150 - 52): + next(itr) + self.assertEqual(epoch_itr.iterations_in_epoch, 149) + self.assertTrue(itr.has_next()) + next(itr) + self.assertFalse(itr.has_next()) + + itr = epoch_itr.next_epoch_itr(shuffle=False) + self.assertTrue(itr.has_next()) + self.assertEqual(epoch_itr.epoch, 3) + self.assertEqual(epoch_itr.iterations_in_epoch, 0) + + def test_load_full_checkpoint(self): + with contextlib.redirect_stdout(StringIO()): + trainer, epoch_itr = get_trainer_and_epoch_itr(2, 150, 300, 150) + trainer.get_train_iterator = MagicMock(return_value=epoch_itr) + + _, epoch_itr = checkpoint_utils.load_checkpoint( + self.cfg_mock.checkpoint, trainer + ) + itr = epoch_itr.next_epoch_itr(shuffle=False) + + self.assertEqual(epoch_itr.epoch, 3) + self.assertEqual(epoch_itr.iterations_in_epoch, 0) + self.assertEqual(next(itr)["net_input"]["src_tokens"][0].item(), 0) + + def test_load_no_checkpoint(self): + with contextlib.redirect_stdout(StringIO()): + trainer, epoch_itr = get_trainer_and_epoch_itr(1, 150, 0, 0) + trainer.get_train_iterator = MagicMock(return_value=epoch_itr) + self.patches["os.path.isfile"].return_value = False + + _, epoch_itr = checkpoint_utils.load_checkpoint( + self.cfg_mock.checkpoint, trainer + ) + itr = epoch_itr.next_epoch_itr(shuffle=False) + + self.assertEqual(epoch_itr.epoch, 1) + self.assertEqual(epoch_itr.iterations_in_epoch, 0) + self.assertEqual(next(itr)["net_input"]["src_tokens"][0].item(), 0) + + def test_finetune_from_model_args_conflict(self): + with contextlib.redirect_stdout(StringIO()): + trainer, epoch_itr = get_trainer_and_epoch_itr(1, 150, 0, 0) + trainer.get_train_iterator = MagicMock(return_value=epoch_itr) + + for arg in [ + "reset_optimizer", + "reset_lr_scheduler", + "reset_meters", + "reset_dataloader", + ]: + with self.subTest(arg=arg): + cfg_mock = get_mock_cfg("/temp/checkpoint_pretrained.pt") + cfg_mock["checkpoint"][arg] = True + with self.assertRaises(Exception) as context: + _, _ = checkpoint_utils.load_checkpoint( + cfg_mock.checkpoint, trainer + ) + + self.assertTrue( + "--finetune-from-model can not be set together with either --reset-optimizer" + " or reset_lr_scheduler or reset_meters or reset_dataloader" + in str(context.exception) + ) + + def test_finetune_from_model(self): + with contextlib.redirect_stdout(StringIO()): + trainer, epoch_itr = get_trainer_and_epoch_itr(1, 150, 0, 0) + trainer.get_train_iterator = MagicMock(return_value=epoch_itr) + from_model_path = "/temp/checkpoint_pretrained.pt" + + def mock_finetune_exist(path): + if path == from_model_path: + return True + else: + return False + + self.patches[ + "fairseq.file_io.PathManager.exists" + ].side_effect = mock_finetune_exist + cfg_mock = get_mock_cfg(from_model_path) + cfg_mock.checkpoint.restore_file = "checkpoint_last.pt" + _, _ = checkpoint_utils.load_checkpoint(cfg_mock.checkpoint, trainer) + ( + checkpoint_path, + reset_optimizer, + reset_lr_scheduler, + optimizer_overrides, + ) = trainer.load_checkpoint.call_args[0] + reset_meters = trainer.load_checkpoint.call_args[1]["reset_meters"] + self.assertTrue(reset_optimizer) + self.assertTrue(reset_lr_scheduler) + self.assertTrue(reset_meters) + + def test_finetune_from_model_resume(self): + with contextlib.redirect_stdout(StringIO()): + trainer, epoch_itr = get_trainer_and_epoch_itr(1, 150, 0, 0) + trainer.get_train_iterator = MagicMock(return_value=epoch_itr) + from_model_path = "/temp/checkpoint_pretrained.pt" + + # launch second time + # both restore_file=checkpoint_last.pt and finetune_from_model are set + def mock_finetune_exist(path): + if path == from_model_path or path.endsWith("checkpoint_last.pt"): + return True + else: + return False + + self.patches[ + "fairseq.file_io.PathManager.exists" + ].side_effect = mock_finetune_exist + cfg_mock = get_mock_cfg(from_model_path) + cfg_mock.checkpoint.restore_file = "checkpoint_last.pt" + _, _ = checkpoint_utils.load_checkpoint(cfg_mock.checkpoint, trainer) + ( + checkpoint_path, + reset_optimizer, + reset_lr_scheduler, + optimizer_overrides, + ) = trainer.load_checkpoint.call_args[0] + reset_meters = trainer.load_checkpoint.call_args[1]["reset_meters"] + self.assertFalse(reset_optimizer) + self.assertFalse(reset_lr_scheduler) + self.assertFalse(reset_meters) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_transformer.py b/SpeechT5/fairseq/tests/test_transformer.py new file mode 100644 index 0000000..de5c5bd --- /dev/null +++ b/SpeechT5/fairseq/tests/test_transformer.py @@ -0,0 +1,65 @@ +import argparse +import unittest +from typing import Any, Dict, Sequence + +import torch +from fairseq.models import transformer + +from tests.test_roberta import FakeTask + + +def mk_sample(tok: Sequence[int] = None, batch_size: int = 2) -> Dict[str, Any]: + if not tok: + tok = [10, 11, 12, 13, 14, 15, 2] + + batch = torch.stack([torch.tensor(tok, dtype=torch.long)] * batch_size) + sample = { + "net_input": { + "src_tokens": batch, + "prev_output_tokens": batch, + "src_lengths": torch.tensor( + [len(tok)] * batch_size, dtype=torch.long, device=batch.device + ), + }, + "target": batch[:, 1:], + } + return sample + + +def mk_transformer(**extra_args: Any): + overrides = { + # Use characteristics dimensions + "encoder_embed_dim": 12, + "encoder_ffn_embed_dim": 14, + "decoder_embed_dim": 12, + "decoder_ffn_embed_dim": 14, + # Disable dropout so we have comparable tests. + "dropout": 0, + "attention_dropout": 0, + "activation_dropout": 0, + "encoder_layerdrop": 0, + } + overrides.update(extra_args) + # Overrides the defaults from the parser + args = argparse.Namespace(**overrides) + transformer.tiny_architecture(args) + + torch.manual_seed(0) + task = FakeTask(args) + return transformer.TransformerModel.build_model(args, task) + + +class TransformerTestCase(unittest.TestCase): + def test_forward_backward(self): + model = mk_transformer(encoder_embed_dim=12, decoder_embed_dim=12) + sample = mk_sample() + o, _ = model.forward(**sample["net_input"]) + loss = o.sum() + loss.backward() + + def test_different_encoder_decoder_embed_dim(self): + model = mk_transformer(encoder_embed_dim=12, decoder_embed_dim=16) + sample = mk_sample() + o, _ = model.forward(**sample["net_input"]) + loss = o.sum() + loss.backward() diff --git a/SpeechT5/fairseq/tests/test_utils.py b/SpeechT5/fairseq/tests/test_utils.py new file mode 100644 index 0000000..7919590 --- /dev/null +++ b/SpeechT5/fairseq/tests/test_utils.py @@ -0,0 +1,114 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import unittest + +import torch +from fairseq import utils + + +class TestUtils(unittest.TestCase): + def test_convert_padding_direction(self): + pad = 1 + left_pad = torch.LongTensor( + [ + [2, 3, 4, 5, 6], + [1, 7, 8, 9, 10], + [1, 1, 1, 11, 12], + ] + ) + right_pad = torch.LongTensor( + [ + [2, 3, 4, 5, 6], + [7, 8, 9, 10, 1], + [11, 12, 1, 1, 1], + ] + ) + + self.assertAlmostEqual( + right_pad, + utils.convert_padding_direction( + left_pad, + pad, + left_to_right=True, + ), + ) + self.assertAlmostEqual( + left_pad, + utils.convert_padding_direction( + right_pad, + pad, + right_to_left=True, + ), + ) + + def test_make_positions(self): + pad = 1 + left_pad_input = torch.LongTensor( + [ + [9, 9, 9, 9, 9], + [1, 9, 9, 9, 9], + [1, 1, 1, 9, 9], + ] + ) + left_pad_output = torch.LongTensor( + [ + [2, 3, 4, 5, 6], + [1, 2, 3, 4, 5], + [1, 1, 1, 2, 3], + ] + ) + right_pad_input = torch.LongTensor( + [ + [9, 9, 9, 9, 9], + [9, 9, 9, 9, 1], + [9, 9, 1, 1, 1], + ] + ) + right_pad_output = torch.LongTensor( + [ + [2, 3, 4, 5, 6], + [2, 3, 4, 5, 1], + [2, 3, 1, 1, 1], + ] + ) + + self.assertAlmostEqual( + left_pad_output, + utils.make_positions(left_pad_input, pad), + ) + self.assertAlmostEqual( + right_pad_output, + utils.make_positions(right_pad_input, pad), + ) + + def test_clip_grad_norm_(self): + params = torch.nn.Parameter(torch.zeros(5)).requires_grad_(False) + grad_norm = utils.clip_grad_norm_(params, 1.0) + self.assertTrue(torch.is_tensor(grad_norm)) + self.assertEqual(grad_norm, 0.0) + + params = [torch.nn.Parameter(torch.zeros(5)) for i in range(3)] + for p in params: + p.grad = torch.full((5,), fill_value=2.0) + grad_norm = utils.clip_grad_norm_(params, 1.0) + exp_grad_norm = torch.full((15,), fill_value=2.0).norm() + self.assertTrue(torch.is_tensor(grad_norm)) + self.assertEqual(grad_norm, exp_grad_norm) + + grad_norm = utils.clip_grad_norm_(params, 1.0) + self.assertAlmostEqual(grad_norm, torch.tensor(1.0)) + + def test_resolve_max_positions_with_tuple(self): + resolved = utils.resolve_max_positions(None, (2000, 100, 2000), 12000) + self.assertEqual(resolved, (2000, 100, 2000)) + + def assertAlmostEqual(self, t1, t2): + self.assertEqual(t1.size(), t2.size(), "size mismatch") + self.assertLess(utils.item((t1 - t2).abs().max()), 1e-4) + + +if __name__ == "__main__": + unittest.main() diff --git a/SpeechT5/fairseq/tests/test_valid_subset_checks.py b/SpeechT5/fairseq/tests/test_valid_subset_checks.py new file mode 100644 index 0000000..3e9191b --- /dev/null +++ b/SpeechT5/fairseq/tests/test_valid_subset_checks.py @@ -0,0 +1,138 @@ +import os +import shutil +import tempfile +import unittest + +from fairseq import options +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.data.data_utils import raise_if_valid_subsets_unintentionally_ignored +from .utils import create_dummy_data, preprocess_lm_data, train_language_model + + +def make_lm_config( + data_dir=None, + extra_flags=None, + task="language_modeling", + arch="transformer_lm_gpt2_tiny", +): + task_args = [task] + if data_dir is not None: + task_args += [data_dir] + train_parser = options.get_training_parser() + train_args = options.parse_args_and_arch( + train_parser, + [ + "--task", + *task_args, + "--arch", + arch, + "--optimizer", + "adam", + "--lr", + "0.0001", + "--max-tokens", + "500", + "--tokens-per-sample", + "500", + "--save-dir", + data_dir, + "--max-epoch", + "1", + ] + + (extra_flags or []), + ) + cfg = convert_namespace_to_omegaconf(train_args) + return cfg + + +def write_empty_file(path): + with open(path, "w"): + pass + assert os.path.exists(path) + + +class TestValidSubsetsErrors(unittest.TestCase): + """Test various filesystem, clarg combinations and ensure that error raising happens as expected""" + + def _test_case(self, paths, extra_flags): + with tempfile.TemporaryDirectory() as data_dir: + [ + write_empty_file(os.path.join(data_dir, f"{p}.bin")) + for p in paths + ["train"] + ] + cfg = make_lm_config(data_dir, extra_flags=extra_flags) + raise_if_valid_subsets_unintentionally_ignored(cfg) + + def test_default_raises(self): + with self.assertRaises(ValueError): + self._test_case(["valid", "valid1"], []) + with self.assertRaises(ValueError): + self._test_case( + ["valid", "valid1", "valid2"], ["--valid-subset", "valid,valid1"] + ) + + def partially_specified_valid_subsets(self): + with self.assertRaises(ValueError): + self._test_case( + ["valid", "valid1", "valid2"], ["--valid-subset", "valid,valid1"] + ) + # Fix with ignore unused + self._test_case( + ["valid", "valid1", "valid2"], + ["--valid-subset", "valid,valid1", "--ignore-unused-valid-subsets"], + ) + + def test_legal_configs(self): + self._test_case(["valid"], []) + self._test_case(["valid", "valid1"], ["--ignore-unused-valid-subsets"]) + self._test_case(["valid", "valid1"], ["--combine-val"]) + self._test_case(["valid", "valid1"], ["--valid-subset", "valid,valid1"]) + self._test_case(["valid", "valid1"], ["--valid-subset", "valid1"]) + self._test_case( + ["valid", "valid1"], ["--combine-val", "--ignore-unused-valid-subsets"] + ) + self._test_case( + ["valid1"], ["--valid-subset", "valid1"] + ) # valid.bin doesn't need to be ignored. + + def test_disable_validation(self): + self._test_case([], ["--disable-validation"]) + self._test_case(["valid", "valid1"], ["--disable-validation"]) + + def test_dummy_task(self): + cfg = make_lm_config(task="dummy_lm") + raise_if_valid_subsets_unintentionally_ignored(cfg) + + def test_masked_dummy_task(self): + cfg = make_lm_config(task="dummy_masked_lm") + raise_if_valid_subsets_unintentionally_ignored(cfg) + + +class TestCombineValidSubsets(unittest.TestCase): + def _train(self, extra_flags): + with self.assertLogs() as logs: + with tempfile.TemporaryDirectory("test_transformer_lm") as data_dir: + create_dummy_data(data_dir, num_examples=20) + preprocess_lm_data(data_dir) + + shutil.copyfile(f"{data_dir}/valid.bin", f"{data_dir}/valid1.bin") + shutil.copyfile(f"{data_dir}/valid.idx", f"{data_dir}/valid1.idx") + train_language_model( + data_dir, + "transformer_lm", + ["--max-update", "0", "--log-format", "json"] + extra_flags, + run_validation=False, + ) + return [x.message for x in logs.records] + + def test_combined(self): + flags = ["--combine-valid-subsets"] + logs = self._train(flags) + assert any(["valid1" in x for x in logs]) # loaded 100 examples from valid1 + assert not any(["valid1_ppl" in x for x in logs]) # metrics are combined + + def test_subsets(self): + flags = ["--valid-subset", "valid,valid1"] + logs = self._train(flags) + assert any(["valid_ppl" in x for x in logs]) # loaded 100 examples from valid1 + assert any(["valid1_ppl" in x for x in logs]) # metrics are combined diff --git a/SpeechT5/fairseq/tests/utils.py b/SpeechT5/fairseq/tests/utils.py new file mode 100644 index 0000000..6e0c709 --- /dev/null +++ b/SpeechT5/fairseq/tests/utils.py @@ -0,0 +1,717 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import argparse +import json +import os +import random +import sys +from io import StringIO + +import torch +import torch.nn.functional as F +from fairseq import options, utils +from fairseq.data import Dictionary +from fairseq.data.language_pair_dataset import collate +from fairseq.models import ( + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, +) +from fairseq.models.fairseq_encoder import EncoderOut +from fairseq.tasks import LegacyFairseqTask +from fairseq_cli import generate, interactive, preprocess, train, validate +import fairseq.distributed.utils as distributed_utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf + + +def dummy_dictionary(vocab_size, prefix="token_"): + d = Dictionary() + for i in range(vocab_size): + token = prefix + str(i) + d.add_symbol(token) + d.finalize(padding_factor=1) # don't add extra padding symbols + return d + + +def dummy_dataloader( + samples, padding_idx=1, eos_idx=2, batch_size=None, +): + if batch_size is None: + batch_size = len(samples) + + # add any missing data to samples + for i, sample in enumerate(samples): + if "id" not in sample: + sample["id"] = i + + # create dataloader + dataset = TestDataset(samples) + dataloader = torch.utils.data.DataLoader( + dataset, + batch_size=batch_size, + collate_fn=(lambda samples: collate(samples, padding_idx, eos_idx)), + ) + return iter(dataloader) + + +def sequence_generator_setup(): + # construct dummy dictionary + d = dummy_dictionary(vocab_size=2) + + eos = d.eos() + w1 = 4 + w2 = 5 + + # construct source data + src_tokens = torch.LongTensor([[w1, w2, eos], [w1, w2, eos]]) + src_lengths = torch.LongTensor([2, 2]) + + args = argparse.Namespace() + unk = 0.0 + args.beam_probs = [ + # step 0: + torch.FloatTensor( + [ + # eos w1 w2 + # sentence 1: + [0.0, unk, 0.9, 0.1], # beam 1 + [0.0, unk, 0.9, 0.1], # beam 2 + # sentence 2: + [0.0, unk, 0.7, 0.3], + [0.0, unk, 0.7, 0.3], + ] + ), + # step 1: + torch.FloatTensor( + [ + # eos w1 w2 prefix + # sentence 1: + [1.0, unk, 0.0, 0.0], # w1: 0.9 (emit: w1 <eos>: 0.9*1.0) + [0.0, unk, 0.9, 0.1], # w2: 0.1 + # sentence 2: + [0.25, unk, 0.35, 0.4], # w1: 0.7 (don't emit: w1 <eos>: 0.7*0.25) + [0.00, unk, 0.10, 0.9], # w2: 0.3 + ] + ), + # step 2: + torch.FloatTensor( + [ + # eos w1 w2 prefix + # sentence 1: + [0.0, unk, 0.1, 0.9], # w2 w1: 0.1*0.9 + [ + 0.6, + unk, + 0.2, + 0.2, + ], # w2 w2: 0.1*0.1 (emit: w2 w2 <eos>: 0.1*0.1*0.6) + # sentence 2: + [ + 0.60, + unk, + 0.4, + 0.00, + ], # w1 w2: 0.7*0.4 (emit: w1 w2 <eos>: 0.7*0.4*0.6) + [0.01, unk, 0.0, 0.99], # w2 w2: 0.3*0.9 + ] + ), + # step 3: + torch.FloatTensor( + [ + # eos w1 w2 prefix + # sentence 1: + [ + 1.0, + unk, + 0.0, + 0.0, + ], # w2 w1 w2: 0.1*0.9*0.9 (emit: w2 w1 w2 <eos>: 0.1*0.9*0.9*1.0) + [ + 1.0, + unk, + 0.0, + 0.0, + ], # w2 w1 w1: 0.1*0.9*0.1 (emit: w2 w1 w1 <eos>: 0.1*0.9*0.1*1.0) + # sentence 2: + [ + 0.1, + unk, + 0.5, + 0.4, + ], # w2 w2 w2: 0.3*0.9*0.99 (emit: w2 w2 w2 <eos>: 0.3*0.9*0.99*0.1) + [ + 1.0, + unk, + 0.0, + 0.0, + ], # w1 w2 w1: 0.7*0.4*0.4 (emit: w1 w2 w1 <eos>: 0.7*0.4*0.4*1.0) + ] + ), + ] + + task = TestTranslationTask.setup_task(args, d, d) + model = task.build_model(args) + tgt_dict = task.target_dictionary + + return tgt_dict, w1, w2, src_tokens, src_lengths, model + + +def create_dummy_data(data_dir, num_examples=100, maxlen=20, alignment=False): + def _create_dummy_data(filename): + data = torch.rand(num_examples * maxlen) + data = 97 + torch.floor(26 * data).int() + with open(os.path.join(data_dir, filename), "w") as h: + offset = 0 + for _ in range(num_examples): + ex_len = random.randint(1, maxlen) + ex_str = " ".join(map(chr, data[offset : offset + ex_len])) + print(ex_str, file=h) + offset += ex_len + + def _create_dummy_alignment_data(filename_src, filename_tgt, filename): + with open(os.path.join(data_dir, filename_src), "r") as src_f, open( + os.path.join(data_dir, filename_tgt), "r" + ) as tgt_f, open(os.path.join(data_dir, filename), "w") as h: + for src, tgt in zip(src_f, tgt_f): + src_len = len(src.split()) + tgt_len = len(tgt.split()) + avg_len = (src_len + tgt_len) // 2 + num_alignments = random.randint(avg_len // 2, 2 * avg_len) + src_indices = torch.floor(torch.rand(num_alignments) * src_len).int() + tgt_indices = torch.floor(torch.rand(num_alignments) * tgt_len).int() + ex_str = " ".join( + [ + "{}-{}".format(src, tgt) + for src, tgt in zip(src_indices, tgt_indices) + ] + ) + print(ex_str, file=h) + + _create_dummy_data("train.in") + _create_dummy_data("train.out") + _create_dummy_data("valid.in") + _create_dummy_data("valid.out") + _create_dummy_data("test.in") + _create_dummy_data("test.out") + + if alignment: + _create_dummy_alignment_data("train.in", "train.out", "train.align") + _create_dummy_alignment_data("valid.in", "valid.out", "valid.align") + _create_dummy_alignment_data("test.in", "test.out", "test.align") + + +def preprocess_lm_data(data_dir): + preprocess_parser = options.get_preprocessing_parser() + preprocess_args = preprocess_parser.parse_args( + [ + "--only-source", + "--trainpref", + os.path.join(data_dir, "train.out"), + "--validpref", + os.path.join(data_dir, "valid.out"), + "--testpref", + os.path.join(data_dir, "test.out"), + "--destdir", + data_dir, + ] + ) + preprocess.main(preprocess_args) + + +def preprocess_translation_data(data_dir, extra_flags=None): + preprocess_parser = options.get_preprocessing_parser() + preprocess_args = preprocess_parser.parse_args( + [ + "--source-lang", + "in", + "--target-lang", + "out", + "--trainpref", + os.path.join(data_dir, "train"), + "--validpref", + os.path.join(data_dir, "valid"), + "--testpref", + os.path.join(data_dir, "test"), + "--thresholdtgt", + "0", + "--thresholdsrc", + "0", + "--destdir", + data_dir, + ] + + (extra_flags or []), + ) + preprocess.main(preprocess_args) + + +def preprocess_summarization_data(data_dir, extra_flags=None): + preprocess_parser = options.get_preprocessing_parser() + preprocess_args = preprocess_parser.parse_args( + [ + "--source-lang", + "in", + "--target-lang", + "out", + "--trainpref", + os.path.join(data_dir, "train"), + "--validpref", + os.path.join(data_dir, "valid"), + "--testpref", + os.path.join(data_dir, "test"), + "--thresholdtgt", + "0", + "--thresholdsrc", + "0", + "--joined-dictionary", + "--destdir", + data_dir, + ] + + (extra_flags or []), + ) + preprocess.main(preprocess_args) + + +def create_laser_data_and_config_json(data_dir): + src_langs = ["de", "fr", "ru", "tr", "zh"] + tgt_langs = ["en", "es"] + config_json = {} + config_train_json = [] + src_vocab = None + tgt_vocab = None + + for src_lang in src_langs: + for tgt_lang in tgt_langs: + langpair_folder = f"{src_lang}-{tgt_lang}" + + langpair_path = os.path.join(data_dir, langpair_folder) + os.mkdir(langpair_path) + create_dummy_data(langpair_path) + preprocess_translation_data(langpair_path, ["--dataset-impl", "cached"]) + + src_vocab = os.path.join(langpair_path, "dict.in.txt") + tgt_vocab = os.path.join(langpair_path, "dict.out.txt") + config_train_json.append( + { + "id": 0 if tgt_lang == "en" else 1, + "src": os.path.join(langpair_path, "train.in-out.in"), + "tgt": os.path.join(langpair_path, "train.in-out.out"), + } + ) + + config_json["src_vocab"] = src_vocab + config_json["tgt_vocab"] = tgt_vocab + config_json["train"] = config_train_json + + with open(os.path.join(data_dir, "laserconfig.json"), "w") as config_file: + json.dump(config_json, config_file) + + return config_file + + +def train_translation_model( + data_dir, + arch, + extra_flags=None, + task="translation", + run_validation=False, + lang_flags=None, + extra_valid_flags=None, + world_size=1, +): + if lang_flags is None: + lang_flags = [ + "--source-lang", + "in", + "--target-lang", + "out", + ] + train_parser = options.get_training_parser() + train_args = options.parse_args_and_arch( + train_parser, + [ + "--task", + task, + data_dir, + "--save-dir", + data_dir, + "--arch", + arch, + "--optimizer", + "nag", + "--lr", + "0.05", + "--max-tokens", + "500", + "--max-epoch", + "1", + "--no-progress-bar", + "--distributed-world-size", + str(world_size), + "--num-workers", + "0", + ] + + lang_flags + + (extra_flags or []), + ) + + cfg = convert_namespace_to_omegaconf(train_args) + distributed_utils.call_main(cfg, train.main) + + if run_validation: + # test validation + validate_parser = options.get_validation_parser() + validate_args = options.parse_args_and_arch( + validate_parser, + [ + "--task", + task, + data_dir, + "--path", + os.path.join(data_dir, "checkpoint_last.pt"), + "--valid-subset", + "valid", + "--max-tokens", + "500", + "--no-progress-bar", + "--num-workers", + "0", + ] + + lang_flags + + (extra_valid_flags or []), + ) + validate.main(validate_args) + + +def generate_main(data_dir, extra_flags=None, path=None): + if extra_flags is None: + extra_flags = [ + "--print-alignment", + ] + if path is None: + path = os.path.join(data_dir, "checkpoint_last.pt") + generate_parser = options.get_generation_parser() + generate_args = options.parse_args_and_arch( + generate_parser, + [ + data_dir, + "--path", + path, + "--beam", + "3", + "--batch-size", + "64", + "--max-len-b", + "5", + "--gen-subset", + "valid", + "--no-progress-bar", + "--num-workers", + "0", + ] + + (extra_flags or []), + ) + + # evaluate model in batch mode + generate.main(generate_args) + + # evaluate model interactively + generate_args.buffer_size = 0 + generate_args.input = "-" + generate_args.batch_size = None + orig_stdin = sys.stdin + sys.stdin = StringIO("h e l l o\n") + interactive.main(generate_args) + sys.stdin = orig_stdin + + +class TestDataset(torch.utils.data.Dataset): + def __init__(self, data): + super().__init__() + self.data = data + self.sizes = None + + def __getitem__(self, index): + return self.data[index] + + def __len__(self): + return len(self.data) + + +class TestTranslationTask(LegacyFairseqTask): + def __init__(self, args, src_dict, tgt_dict, model): + super().__init__(args) + self.src_dict = src_dict + self.tgt_dict = tgt_dict + self.model = model + + @classmethod + def setup_task(cls, args, src_dict=None, tgt_dict=None, model=None): + return cls(args, src_dict, tgt_dict, model) + + def build_model(self, args): + return TestModel.build_model(args, self) + + @property + def source_dictionary(self): + return self.src_dict + + @property + def target_dictionary(self): + return self.tgt_dict + + +class TestModel(FairseqEncoderDecoderModel): + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @classmethod + def build_model(cls, args, task): + encoder = TestEncoder(args, task.source_dictionary) + decoder = TestIncrementalDecoder(args, task.target_dictionary) + return cls(encoder, decoder) + + +class TestEncoder(FairseqEncoder): + def __init__(self, args, dictionary): + super().__init__(dictionary) + self.args = args + + def forward(self, src_tokens, src_lengths=None, **kwargs): + return EncoderOut( + encoder_out=src_tokens, + encoder_padding_mask=None, + encoder_embedding=None, + encoder_states=None, + src_tokens=None, + src_lengths=None, + ) + + def reorder_encoder_out(self, encoder_out, new_order): + return EncoderOut( + encoder_out=encoder_out.encoder_out.index_select(0, new_order), + encoder_padding_mask=None, + encoder_embedding=None, + encoder_states=None, + src_tokens=None, + src_lengths=None, + ) + + +class TestIncrementalDecoder(FairseqIncrementalDecoder): + def __init__(self, args, dictionary): + super().__init__(dictionary) + assert hasattr(args, "beam_probs") or hasattr(args, "probs") + args.max_decoder_positions = getattr(args, "max_decoder_positions", 100) + self.args = args + + def forward(self, prev_output_tokens, encoder_out=None, incremental_state=None): + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + bbsz = prev_output_tokens.size(0) + vocab = len(self.dictionary) + src_len = encoder_out.encoder_out.size(1) + tgt_len = prev_output_tokens.size(1) + + # determine number of steps + if incremental_state is not None: + # cache step number + step = utils.get_incremental_state(self, incremental_state, "step") + if step is None: + step = 0 + utils.set_incremental_state(self, incremental_state, "step", step + 1) + steps = [step] + else: + steps = list(range(tgt_len)) + + # define output in terms of raw probs + if hasattr(self.args, "probs"): + assert ( + self.args.probs.dim() == 3 + ), "expected probs to have size bsz*steps*vocab" + probs = self.args.probs.index_select(1, torch.LongTensor(steps)) + else: + probs = torch.FloatTensor(bbsz, len(steps), vocab).zero_() + for i, step in enumerate(steps): + # args.beam_probs gives the probability for every vocab element, + # starting with eos, then unknown, and then the rest of the vocab + if step < len(self.args.beam_probs): + probs[:, i, self.dictionary.eos() :] = self.args.beam_probs[step] + else: + probs[:, i, self.dictionary.eos()] = 1.0 + + # random attention + attn = torch.rand(bbsz, tgt_len, src_len) + + dev = prev_output_tokens.device + return probs.to(dev), {"attn": [attn.to(dev)]} + + def get_normalized_probs(self, net_output, log_probs, _): + # the decoder returns probabilities directly + probs = net_output[0] + if log_probs: + return probs.log() + else: + return probs + + def max_positions(self): + return self.args.max_decoder_positions + + +class TestReshapingEncoder(FairseqEncoder): + def __init__(self, args, dictionary): + super().__init__(dictionary) + self.args = args + + def forward(self, src_tokens, src_lengths=None, **kwargs): + b_sz, t_sz = src_tokens.shape + padding_needed = t_sz % 2 + x = src_tokens + if padding_needed > 0: + padding_needed = 2 - padding_needed + x = F.pad(x, (0, padding_needed)) + + return EncoderOut( + encoder_out=x.view(b_sz, -1, 2), + encoder_padding_mask=None, + encoder_embedding=None, + encoder_states=None, + src_tokens=None, + src_lengths=None, + ) + + def reorder_encoder_out(self, encoder_out, new_order): + return EncoderOut( + encoder_out=encoder_out.encoder_out.index_select(0, new_order), + encoder_padding_mask=None, + encoder_embedding=None, + encoder_states=None, + src_tokens=None, + src_lengths=None, + ) + + +class TestReshapingModel(FairseqEncoderDecoderModel): + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @classmethod + def build_model(cls, args, task): + encoder = TestReshapingEncoder(args, task.source_dictionary) + decoder = TestIncrementalDecoder(args, task.target_dictionary) + return cls(encoder, decoder) + + +class TestAdditionalInputEncoder(FairseqEncoder): + def __init__(self, args, dictionary): + super().__init__(dictionary) + self.args = args + + def forward(self, src_tokens, src_lengths=None, **kwargs): + assert "fancy_other_input" in kwargs + assert kwargs["fancy_other_input"] is not None + return EncoderOut( + encoder_out=src_tokens, + encoder_padding_mask=None, + encoder_embedding=None, + encoder_states=None, + src_tokens=None, + src_lengths=None, + ) + + def reorder_encoder_out(self, encoder_out, new_order): + return EncoderOut( + encoder_out=encoder_out.encoder_out.index_select(0, new_order), + encoder_padding_mask=None, + encoder_embedding=None, + encoder_states=None, + src_tokens=None, + src_lengths=None, + ) + + +class TestAdditionalInputModel(FairseqEncoderDecoderModel): + def __init__(self, encoder, decoder): + super().__init__(encoder, decoder) + + @classmethod + def build_model(cls, args, task): + encoder = TestAdditionalInputEncoder(args, task.source_dictionary) + decoder = TestIncrementalDecoder(args, task.target_dictionary) + return cls(encoder, decoder) + + def forward(self, src_tokens, src_lengths, prev_output_tokens, **kwargs): + encoder_out = self.encoder(src_tokens, src_lengths=src_lengths, **kwargs) + decoder_out = self.decoder( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) + return decoder_out + + +def train_language_model( + data_dir, + arch, + extra_flags=None, + run_validation=False, + extra_valid_flags=None, + task="language_modeling", + world_size=1, +): + train_parser = options.get_training_parser() + train_args = options.parse_args_and_arch( + train_parser, + [ + "--task", + task, + data_dir, + "--arch", + arch, + "--optimizer", + "adam", + "--lr", + "0.0001", + "--max-tokens", + "500", + "--tokens-per-sample", + "500", + "--save-dir", + data_dir, + "--max-epoch", + "1", + "--no-progress-bar", + "--distributed-world-size", + str(world_size), + "--ddp-backend", + "no_c10d", + "--num-workers", + "0", + ] + + (extra_flags or []), + ) + cfg = convert_namespace_to_omegaconf(train_args) + distributed_utils.call_main(cfg, train.main) + + if run_validation: + # test validation + validate_parser = options.get_validation_parser() + validate_args = options.parse_args_and_arch( + validate_parser, + [ + "--task", + task, + data_dir, + "--path", + os.path.join(data_dir, "checkpoint_last.pt"), + "--valid-subset", + "valid", + "--max-tokens", + "500", + "--no-progress-bar", + "--num-workers", + "0", + ] + + (extra_valid_flags or []), + ) + validate.main(validate_args) diff --git a/SpeechT5/fairseq/train.py b/SpeechT5/fairseq/train.py new file mode 100644 index 0000000..321de3d --- /dev/null +++ b/SpeechT5/fairseq/train.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Legacy entry point. Use fairseq_cli/train.py or fairseq-train instead. +""" + +from fairseq_cli.train import cli_main + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/results/ablation_study.png b/SpeechT5/results/ablation_study.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3fb62a4a0639e97960ab6d68d48a4ee18c734a GIT binary patch literal 51343 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 literal 0 HcmV?d00001 diff --git a/SpeechT5/results/asr.png b/SpeechT5/results/asr.png new file mode 100644 index 0000000000000000000000000000000000000000..b0250a4dea3415e2bd1cb15a21177c689bb56c48 GIT binary patch literal 70998 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 OTeQ@4RjXB=p#BF4U<<1N literal 0 HcmV?d00001 diff --git a/SpeechT5/results/se.png b/SpeechT5/results/se.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0f55baa190534e8c72fabee1f6911475758a3f GIT binary patch literal 21237 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 literal 0 HcmV?d00001 diff --git a/SpeechT5/results/sid.png b/SpeechT5/results/sid.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e464af982f9ccd4affa58f8db37ba4dec4cf83 GIT binary patch literal 48583 zcmaI6byOTd(>FTH;%*5L+)084x3D+_NPyt(uEBjFxVw9B5AN>n!QFyeaM;W9-1pw| ze*b)Z&P<=K?yBkPsjlk!&4kE*mBc`OhYA1yhP0HJA^?D)uNN{h_?1$D;xYN!0OVzr z#9=VlD+LJ%g2C?YVKCX2e*lOU2LNEOi&xe;7)%rZ0elHBwQ4ZfBy2e#gZs7X5EQ!t z0=~Gdy}<6O4kFno|05OO5e@{Hw{OE>$UqzbM+$q{Jcvj=hQUCwX9bV2m6erC7_83( z?q#_XK(&HBbi(eYnZY0sz$OkCNCX4{AAio>!2nW6*sx>J&U5Vptos?JKXeCsSp?9u z6HZ~U+XI`Kdw8dwvM*rH;-m2w7zkSm4(>DTIIl$=0ghg)?c`aq{uJOHLV?STWd`Yh zLI3ikVq>C~e==|1!Qg{tU}uf6)wrB<*n%gSHJm?b>MEdHD~bt*-7Jn?JOid{$l%{E z^`&)<_1pq{?lb@sT#z>(+RMpUASqaqkr0H>%0YtqG*CZa8g2esOsh&SU{9?^uo++A z>n}bqT!$+!5+(oh(b{9TtwrAj?D#jJQlcrs41$hWqrqLI31#qx?&qn2DVwOX{`Q%Z z=rI!+Qi7M86B5@S;33dIKB@b)E{NW{V)?7E{gkid2(i;QKYNbPhO!ZPttvDrR#%UM zD1u2oiF+w=PC5{^-@_i3Ysxns7=F}f&_$am^6B6p1F}<(lZnJ4nzZm_FNZzP%LQrQ zD7Y1>RGs6z3YV^Oez}CjpZ0~gP2Sdon#HAeZj4n0S;>DiNqJnJkunb8R<;-l`<^p? zd^|Bk`?FukytCakb2u+>Hp{|LBEINr)Hi+mU=d<KB=s{*NV=;Argpw(PV08cmy*Tn z0{_ZLn<6xdTpI4|-TDrhpaxzkU4y(o3ZGMPl*8jA98BwX_!8DyG$S+2xa@)_T|&#k zU5w=-CTdckKeeSkxnzI%?q2FDjloxIrTevQ?XqHMBS1Ng$#yQ3Cvv5IF&*+n2!WY~ z!V(7_Z#nn3DQRHn<Uv~NRL9JYU(>olcvWM0iUqrBO8X`qbv*)JQbXe(<CH!L%xqB< znWpqsJJ}p!^+DhImR5^qVz5-NnMt29&orj^>jr4{lNJ+Ja$P!}5yk)jWO#}b-6d2$ zAMOJP=+(0Scj*)d3&C|~LZihX3wYSE`2SyDXO)9Z2b-8ZNtUij3xAl(KtBKAaIaIH z^!r1VKUBq<<~4m_zxogc>(%984|rj`oS4rH(|Nc_*fcc3BgDC4D_^c-#6<4ETHdA; z$HyskrT$+ry|aRxuU5^c<I*QG**n%#Xp#LWVj-qXC|moKAe1d#KX{tptRVO&>Y^6n zVbI@CQz`pOaEe~uyHT)*>8n6|TFQ}%R#oKOZG_o|K)kVzeU>kv;Zx2GouV?BT0BP* zl+p=c<^983<eN<7<`7SA|FriRu!RE+WSTD?T)BMz4`=!(Y7Zk%6&MfDg*H}WlCg@^ z)wjFqK{IAdL5~M~k=@T`J^ZY7Pigp=wU{a2`Jm2p<qJ=<f-PT;aOP;5XI<g1cf|2o zy7CkZnZn(RMP8_5Z;&HVsv^;|>u^?u`T9YrG}ut28maU&K%Ie~4RR-Ly7Gd^`V7{b z@tO3Qqo8x2&uuSzW97Rl;yP%vQ-$GhE0EQ2fI_LmJ;0S5rN(Uy-BU=PIRaWP0|cV{ zOPuW&1WQA5NsX}OC$gGJpWOUZJxqI<LM#HgY0a6z+Wamf0Bik%@cNVf$JcR!M%Z>b z`*w(5=cw$z_9x*N&gRh!<>N$q@fk&hBLwiFNYw_x!<E!XMs*EY`u9EPdw!RLrN+`E zNkBN>tH?};wqUs+7m+nKv0)3$I!^ss7+O?><rLH>Lzf~6cI8(cW8i7D@L6kH8;bYC zN(W?hChV$AzD{c)%0rBmX*(?}f3~(4^x`9Esod7r$q`+D&`Z}G#A_@0T{p&lpzLI> z)Y(LjwWf1T(t;a>7!CEege&mw*WO){)&JKSLY$r*9NZMo3X+UKN*0K$)M2mr@kY2) zzWH~EdcOXf;t?F32``UDBk8~iTvnwjcQd2!80zn7C^loEJk~9;j?Prm(;&N-(ErLv zm<1rVaj;UJqGafU{vetDoJrM+QLgrzltsxh41hp>eHg7-gKgO~4(cxhS5dOk?Q!8u zpKHqUqT#<keZ7i@M)(0B6qFGD@s6G$5&ERP!Y3INR!TE7uFLRNe}S`z)X*BJqyV9~ zz|Uf0F>eJB%!k~yAQ)v)Ni+m2^{Ak}uCo0RiDrLF_#59cEd_}4SosUiSEqhw#8>;E z-groD1$mNHf9+joqQFGdTR@(#WV}X(i+mRqxk%0faPw_`)A}F|x_C!i!0^gInXSR^ zmi~MmiBtcrps%j~SSz;O0~b_hph73&bgopyl<kyeibY6z!u^4C-5z<NCaHt?9|)xZ zK~^SfR^X$^$deg;uI*=`?^IMfihgjHx@CU28af83aJgC{|G4IYDCsWX<{_Cuudnwl z_A(aS+TZz6@PQx%2giZvH~j3CdJb0|n`($A=sCa-x=5`6*?)`gQobNc^SS^CJ9DTP zK#}tM9b*p=WfBhl<O{?NDu^5e^%|&&>4RrvQ|N4@3eTp=off3n^n)^xvUHu#QEM1V z%j}2c1V@h`qng3OJUia22wR@O;aT*p^?N|58Bqsq>@YMN+I0itpkf1PMJ7hOq03XR zYEWIZh-NLN(=-W4PL&xt9v9OnK-wEU3YWR7@3_wD!{DlouD@E!y11v&P)uFG-DpuA z#;bG^pz7G51oox&`jyCK<~70ZD7}>kf`1YDmJVIA8sXl{b%Cp#-?06xf*(!K`j3=+ zCXK2YiH1)H;<Tq}AGqjc<z3JlW=i{OR(G9~$($KvQ67~b-^dk125$=!*TpKXA)}dZ zc$XyS%@ZNCRB3H;)ILP>Pk3j<W_&!WHZqje9}O-rk$>5pH|6HWT0H~n2}vkLt41|K zGU&t54<er5@YOf2WwaH&J0DIf;8`zaZS<5oJsRXluN#k3-fTd^4ab-;SSrEojb{qi zC4g9RbCzxlru?)dWiTc#wknAF*dEnvLhWQ$5nyPkH|RT3gmv8>SBo{FKYlwolqiUV zO==f}y>KQ4m~+c`QFybM33`y7FCckz&7a#tbpHk1YRuiwpq(JW=NxyR@WzZ}*?>*< z@ZPJqZk=tY!YjGhg6sF2&qBU#2Lco?#aQJVvNEE)&CZqgxkV|-BiZD_Qa!Nyu?2Wa z6dDTQCxQRmWTK(#3r!xX;ki7}?S1#)C-9Ci;$r3#j>IC<r|fXTGP<8hyXs=Aic-HR z-j`BU8h1*lq;+-oJG~EEY0W>nN*O=<!@KPw7@Yx7euGC|M8UokgZ>|l|2JM`VS{w3 zA%kC`(e(c-z;)zyt^b!Ql*1~BM}Y_OPP<R|efV%WwK0C8Ha9~!fgu)BaH-EGV7_)B z)BkX3E}%-#b|9poW&JIclw8immP09!XSLvLKB-bu^h5h$m=4CjvU2C3Tl}pngJscT zs;Ndh70<O*for;}U86hep4;!6q5)%Vi_@#!iht5vTIlmbpKDHU&+?XkmM>i^)p)Jo zzU07&_4JLX4%LoZU5(Dl46}lBc-Br4Nye)vdshGdLMdhE;^Knxmd1<%TT28v_Pp6; z+5HI9S>NpJ5oyKU_Rr(<G}c*Ldp){A6*`4%9bLE6UXBjlzp6M)ei2B*jpDl(t>=e7 zm60IiZ%qTrxBZjORi6(ZmTJ)<R{1@Le|(f}O5y^uSjSJ@RD>WklctTnQG;Uel>d%G zdvuv**k4fZmNdDl|B+kLcPP7&k*y|lCGHG3FS9SKGz-o=HrL2#OO<_=_VLU&>)CGO z7ac-|S1z4tUK0B}gr@hHYHz}ZI*Vgyc6YFlNXvw=9!9*!dqqD<!9W}th_Ov3&Cd^~ zhmM<%)yJi@`-v0xh;gX9FTQ|SoFm`ni+LXMU6hyHyLL$k+>ES1@X5dA5#mm;+J}$# zV;UU~X70;TAV;lg()D>00&tm+=85%8OZUb%1&e%N3}m2gaRtbgqra>BLT?TlC5kW^ zEy!U{-V;5{l@NO?s95@TJWMsFP3`^3w4w&}=k>t)8ElpcPABs(4!d+k3{%*U6CC?o zq#YJTXFs|g_D;32J>s1TT$-I>ha^I@bt+^asfk%duW=3BEJ5eOUo%wC7lI<yW^^PZ zn2ljJ(#BQe21s}Nl77Njq+x>o8mWrLNys;h*a3l*3<iRW!Pu)*`IDn{In9}q;NUgZ zuTCIH>v*#EHLbGY&cDe1cB`^#ZZTCw`p+nJvztQxAE%-~vOMY@BLXef_07r~BGN`+ zqyzgMX))sCXMKe8BLQfh)S2h>uJ1J5!nic0kr=NcKqL$bj$ky$2Wd6({T|27lJvC( zLFzuRrYn0E)@nVa;cnF^c2YOTzbH#d1vvV{btc*tKCUe!^hBhUSM1%UDH+;m)n0gQ zy-vCCqcBZeEdWQ)$R}pJm?fwNT)Z<-@gn{LkDW6E4o2^Z<JC_b6fLG120$9Zt^W7P z(I0oeYa#<mfduEg*4LgJfA-9UiomHqkhvrPKeW-6#6enfkkxvOqU|t_@#8nJ+L0Ro zwD7$@!4axLlHEO<iLc(g`TgjLefSQ#twcOYxyM2Se7+vnE-8m{$&wr`w8>#hqP+^E zV?-_ftrh#Wb2eXHzl)pR1`aZM`~-~RPB5#L%w$J}`u^yghWL1HM%Z2d{W)1?g^2hf zRxadzbNqt0T>D3boUFxGwSL8NN5k)p2*)B8d!!6Ig5K_qpflRx2ekvet>>5p5FBAV zHuGC|KIfh!9>4uQ0;_PqU$@+fSzZH3s4g?oIgtG^1Mn%zYw%Q(L%)#YK=Li+^xw{E z>dMl?SE^4Jh^}X&i5&HsHl?n9mu<;H8NQ78;$&D8Jn*i|y1Y}xA|I*xIxDoMe%o}d z!>7`)Rc3uzX5Gir!a-YhJd@L$pQlhdj?O;8z8zcx7_<%vIE@c!fsBd9cMq-Mfu=^9 zG9&fuS^!t_-VUE+wrb2d4v1v_X`heTd5VDm5UhO}IfOd<015F8>9xG|M_<UgTV>0U z%HHW({unyeXbxZxKBP?~rV_bu_Te))t6uI8<m9V=v1Ypj&&ic|EVRn<Fm0hychfrS zy@R;cmO?9$l-khGrMmjDJJsyXF`DQ^b`hd^xOm?)bVV!`0A;g;D;g^0OykWzY|6`} zd4ZgNo|d<{wFWH5{$N%susoVsJ5^$OPIF8sxSyE*Mkr7^Zn;j6F%|jcM)tjq(Ke?X z=i3GSHJ<56>}(W*$Ar*gVMIq1yAaZ3Bs=xMmzj%lN5G&XJpu<xm?r8bK_`t)q0kSO z36HhE(F0_Gu9#-yIl>!+Z^ZPN5T(2K#F@gL1K<U>Z%4f7ojhomD7+eFjav&~4T#$8 zUcv3}@%{*1sg~&JL^T&Md4J_EVa-lVx$I`j&R2y|A^zkYG;j<HgmB61@6f<Tv7<n> zlQ9&pKST&|^4B<vC7Ql@QU<9LS=CFq9fzlYY?nW_BVum>GFv5;@q)EZV*z~1<a}TR zEgbY<En6IE^iz6>n7+N|8coA|9uk*$;~nNGIJj&s#1@^x)(}0L8bPMgICcdPIiDXI zLT1DXM`{KA-aCAVi$yBAE1tRL)k}TCUQuZX1DZK~Sn~r^P}!^CppeARaXk@;j~z%G zQezYLKyK6y$FvPPfwLYN#I__=Vh|)wYzQo}e4`t}q)?EY&Erue(!vbJU0(VNq7f%F zTtx?zsQ5QUg<tLKz5a6AW+1?9So7i<MvYXwAw=90@VfN!)^i=9+;NU?CMWzZx!ywG zLfz|FdP<xm022({&H!6SU@O&{(E<h7nh$p5l?4Smj=pfru)_BxDyrA5;<^0;{3JQx z<qtYJpu^P-q9|Y5Xl6mY#ApySNWs0S9?y?c<UggohbKsS_e#<~!SYth>M6fO3pxS5 z&@FdGxrGKw=*mq~ObCVpq_uMuaoCQ5;!p-2*^dqCiL?i@x~F7GvT;|9`FQO0WK~8o z35UJ1wp}l_Qan(>8h>pU%hrMdT*+=}s=p&NwfuntAu;2d{cW4KiVYdCVWc303(j}^ z^So3wgNb_BS|z`kkPN<jRho4-$mVHH+&?2N^Nm%wiSU(XP4<r>sgwi0_1@u*K?I5c z;TRUTbAS)=(u0N-LsnG;9vdmOr7TAiDI}$c4f@Z{qnQn=*2FWlcN{yCcJjgrhe`WS zMg_!N0loqX(n$ji`8SP5AEO^%7QqXI^PpeqP7vPs=J#)BE|yv>S*qi{jl~b@Zi-F< zCT{VnE6pR#I3UL9w1@42Yu|$rYzX?kH+uHNjt0W7@;av=cY|KO5QN66SJ_mW2m(^P z?M6TMe=Tnx#`;BEd`Wg43XzR{1F;ic17k1ow$;!oT>eD!cb-tWe|PZ{sY-Esbn&`8 zvIIXnjTvsx#{YKRQ-jyQ4=xbc;*<z>dw91G?djSK7SZHUM*KC~pxmfP*&}iQ0kBm= z{7ke~Yi6-xn6VJ6g7je2Cr^=gDhFr?#Fk7&$3O|T6=qtoe*YZW1~>zHp;<0R8l#|9 zP?^PnGw!cHVzEU#pi*i44vKknp;4eN&+o%PBL4DhAdl=CP=@Zn9YMJKyg&3ga}|M| zIE4J|4$#^g+%+^|dA2Uv)K-50$KDvFuIa@nSXL{cxrg_?+HeS+Zv!YpS|{5G$w0fi z*k78Ln6WBrZjjaeP`PhQP3(za&n?D9m0*MrZ5@(7#$8qcJA`Pgmc)xkEK*eqmg_T_ zraS3KD1xO&Ie&CtP0%q`PFx>)PS~-s+7~k*{W)lgw=fm@=Kxp9-C4h~^p-Vvb8*WV znb2#?Kwht_g%J^p-rpW=?W14IpbEl1PhE&)<Mz~rr8}~+1jTn)!iskfo*EJB0iZ=W zTHwAw0)>U2zmfGsFLb-86C@fKpbbjxzpw#W-!&#<^^(qeL(K8r)Si#ZJ-E;$`E6$_ zN0frJjE{==v)X_3ewEL35bnwB-wNnz%4Rb_O=QIIH_doAk%5LvA9&jIBPjR_k9>#Z zd*ifcqUe0uyISUfcTEdJsfRZb^y5luK4my94b}yQk5-L#XDI$`wpS%a&afH&+vU4B z-aqS>dB2p7_3G0GM*7&`jSGf@O;FN{V-Nj|zE-e4I0%O!)eB24<^&xhsR_=w$bXX< zBFSzAULp?Hut#DF`p6wM?WTKf&r~aQysWq?BvIO^U?m}6>PnpG!t;d~@{fLz2;D;I z^Q(Wfhm8I9*Ri+{-T71GHKy}J&Q}9?F;;x+dH~pQ75igI9R4+8<@6f)XkN-FncHF= zY01m@C`HO~hrxOq9+zUz7u5-I-QR!IiK6WglcOVxj}k)b?2xtSm=O(eyPwaf{Ws>m z7WGY}a=67LRyX&{_sStB!T^Mg^<r_=QHP!rQCF7}H-uYQ>8HmTq1|sJ{E^s1#-KZ) z;;_m!XODEpD<W7PBLMsO9xF=t`Gl0QzyAD@+X!Sfq<CHp)EfQuiAC7pz8M#25BU(h zEzO<(UXfGhB#2Bxvot+FAh$f8s#XQ3>O*<atRFN~OXLFX1Kb+~F?g9iJgjp_A0EP# zd-j$u>KaleLvZdEN^nulqesglS5K;(tWa<2{ZIdsk!3mOcK)liR&KnwWS%5KC|iiM zL+pR55Qh*DVO%l?{eLQkH)nxLs#i(pAd=P{*!iQsw)56sN)%CYt=Wd+$9JAs)+Fsj zLzlEo(n~(B-g97?^IPPwA2Z9vi~R4l9q--7s>NgYrWQ`Jl#%k_Z|9X^I^-$srU>S~ zt8r+2!K-oef{|d7h6`q&IhZXV`=$Pvi&HTTVg}<TIMeRgO<ljrqWhQZ5tN=g!f&ke z<H3nnf-E6)FZiO^u=g9cwQ}4|{tD->I}D$$-Gs7fc;^j*v%Il~v(fA}7>lI0wno3` zQiZoMn{_FZrq~?v+;fZhnZ%aZ@Sh%H^{+1h3>Ft>d3s=LuyeE-sxg7|JU5}H+}rrJ z%|ibumbH^2jMLR;a5p?Q?-!b>8rpD6OESIc^D%!Fru=5K2G8@5LcQUgYsu&S-=%ma zKK#bfQc@f~^7am+aMB$lbHdH6!g7Z8I^S;+G#8o49#6-<;0Y`jySU}^vu*KvE$Lms zq5dFS#$Cat=9btKTRfo!)W<@qjQ_^&FY^yx?`cZ%{|mw^vG2dUsaf7WHdRVmJ!u_F zHmB7GtF^0!Ax*sbBsxJbTem#<Vem~$F{e_9M@1>7GJThX?Fq(dYNC1{f6QQ>qOK^H z_KrO#zk++i<PY$8huoM~;+&&bhHF9QL~UUUbt`)&Dmk?I`%M^!PkHk}S~ftz5oPYO z@R~@0@?tx~o`jkH6bk!H@gXHO@>pBzGMP(~e2N%JS)1>ZD{+}cG?$Rr^+(B`Hr4p4 z&aLnbRyU!VUoV<)t2!PHlAU%4Vo0JP@s5?!K01x5q=hX!*elNsXBeg$i=R_R9_`!z zZTfvNmX^n|OYv*+U$7C-4{)sU%efwnIbQdkXSDj{gn^TV&*+^(IH2Qwngsq#rcGbj zD^gBD6W@Asn&bSGink~of@`=20gqZC0U+w`)3+~witrqh2ZQ_i8gf{6|Hal+TAp28 zINvwJLfO`R`DcX^)+g8J&}kcfuQ4|I*^*tf1N5<vxs7@Q<6J=QlM`h4_L6fIEO~Yn zn6Ik5dg1<SDN2OeNySSk5yzV4k`>U`8NR$hhsr+%1FkpU{uR)tC$h{ji=#G6XOPx) zeXrIwcLkWA6g~y+90qfEv~ufgN{)Yu>|xrnM@EbWw5AmQDQI#IaO|vo7RQCZ+mo9n z5IoJaFjq=M$RL53flQ|I_}@hbEdMc`skLQ4^I~5tZ()i@shjCZDG~UART8CvnB2?$ z8g8|nJITPT9u8VGfYM=TUS62docvjC{)<-#x1_Z{ihmk`4IvzvnR|?D>~whNvSu|2 zz;Gm{2xp^uYNl=YqjDtIr`;lvx2lx|gEj1#m6>XeV03AUY&$B1RhsK9_DiXN=**HW zkp*4DVWdR}F!zHcLB?*GA{$S#5y79o9tnW=i2>R50PK}WG5%)(_^P>Z2?Nr^8zEYS zl%T;T+=}tLFa@ROKk0hFR)Gs+S1*P#tUD(DWh?Tu&|(llf!L4dLYlK_AB<7ag4i?{ zd)g6OzsASnOGhQ{xZADoaHh7K`?I7pvFLfV!Lyoww+_*=j_C)k^*gu1R-sX^7g8+Z zh<zc!-VAScnE7sd+2TJ1J!x+HUy3IK&;e<merlYI6t9qq_>dOV`?l5}awEXLD#IIc z@E13iq|Y5Da@&W-7>Xwo5~(~|`D0p+@`Yz}tSPsap*l}%P{O6d{<(%T9thlI!!tWm zjtkh&%4+Z18J<J*{7&A}Cy|d$h_M_E)3@-YZU<!;)m~WypP`)r0Ise7c_SXnCv}|= z{HfvI9i8tNjFZpVZ5@nxg$ET374VXH;isXDS{#2X<P8-yI2#?%`q<hgXbJx4=}14S zBy*D)fB4V}Bzw*Wf3;gaHbrW8NoncR;6rnN)|1(bA6aS3OP6eADSabT%xM!tM6d-+ z*BLbT@06p~aG5B?_j+#`HuPP2{9TTIv+-0vVhT{vA^+npk!H|UO`1Dc{`ZIF!T52n zk>jC1ul8J-EpS?(p)1XY-rCK`Aq9mZcB@jCHg_!%AUmtk8#gp^VPFx0+dlpzf`F|X zx$?zd!$N&dm)=_bjLH+RKl+#bxFA_ea!k|5*#(F(xZZHDh5RbyJoo^jRfx@$rhOyC z7aDgSEiv;Q$(!Aa{$fQ)LpkH~&Y170$|@Ty=c7wS`aE7r=EcZwiP=9zBudiV7hI}_ zWnZaTMy_IS5rne{@w@X-$m768Mn3V!WbOfy?cbK2GegvgYd$E@UtFx!9qU}eH*@6o zfRqwHOFSjG`?I6!&bEA=B@y_C#w5Z+I3>_}7{Gs37ijFZ<?{);n5KYl!l=$C5xGKd z7^W+604V-37e7QR^*F1-@LopsSpc?DtW$(XUV;rS96S6#48xR4Z(vKRcl4{hx&yXM zG=g*vxP2mras<e?a-PqZ)&Z%TU9g0o2XB^wFYw#q3WI&|x*f`5&J;fd^L!;NRSKhA zN%*AP%5oHCjespU3`|FT`xH)+*dSB(o&QZSeanT`ylsTSWNx<YM%(pENG2^fwD=uf zXYHKj;DqQqk6(%cP(H%SHHX1!Ut|&C@Z={R5t!;fg0~a5Vy*CcH-2^A>^#hIJr71! zzekY4oqeQqbCwcIs08Cj*%<gmhDlW*e>P;opDe9o7+%$2dAdnKkCG{z%x3z}ixZ-h z!O#B68F&eQWjupIK&8_`9|pHEa;WHFAd2e_PZkmij=x|PM7?=6>W3Wo((Tyd57`es zkgrD7lEg<NywKXfJ$JZh#NQKpY9!-|549X0df^In*4-A`dZ8denXI5MDZq<>=UpV{ z++mds&R3)HA!;6p!(uAGrtWHy6Mz$P*ZelpOym9aB7F2{PSJ<KA$_mvx3AWQ#A*ol zxo`8w0-_<(%8DIm^uUCOxl`ZZA1x774Jo^+)Ydip_oEYUEysz15U<_4FzZty5ewV| z6iP{&83&~7m}c{XPTn-1?jB|$i0(Jv!{7)>1m*&9^H1}^+1_;D<63TVebX(Fowoma ziAe_BzWD^T6W;fko#(Uomb;!=mP{1V$r@u4q;j&SgXwMd2Q<nr59`&Q+z%1<D&Co< zWzRRr!q02BkEFXbkf!GiaCOQM_V4`pvGk&dZo&37DA?{yE`bIgcdRx)b%U`<a(M8A zM(l}a+pq{AuHsKu+Y>vPxJXrF$y@w$>b=enfDvV1%Cu0rIBcXXUrJLZ{ch>QZpF|P zVHCa0A29Pi-6)J+{cgD3H1GxwQ0@*Q{8`E(w?i>LL>zOICNfT+5f;#_-O6GTL=pj# zw#h9CQe#5Js?L&p^lz;l^SDQEXf|u9bYoc*@x1y*0%6C78b|k^LM0SsWN}hIt^S;& zGU`MY`;|;@B09#}JANZ?O$?}Kl_9i*V*~#7Z{HLwRb6D%Z~@W3w@4u9pQRks+yn(C ztwH`7j1^r5-ZLH_2Cqf=i@q6a<!h#e5;ipFe?0VWH^?n0YSFQkDfz;s$+L<~DR6F0 z{#1cjGOz-LrP6K(un!SW<!yVvO=R8!F5B-cj;^V$=oZKP4CX(ommG5cNJE|VHAUoM zLlaW`Nn4qad|SQ!wt5ObV|^DJ!a$~P+>f02tR`tuY`#xv)kbh1QL-EM2hFQrpF1FD ze2ydE5RKv}u3;l-lLR7wN0(uQPCFC2fNomFwFw#&ly^ez4U>*VT?8Y)Og~cB%P4I8 zf`e-kyi_*EAHWjWl~=u%<~7$do!*}32rWn%x~#m!Fl0;d<ZR3~u#)lrkfav0G~63u za6UqeV<)LOpc(8o*!{5eNK<CtiFUjNh0Y;wdsLDpl(bcuGQ6SBpKy#hqkT)u2al~0 z%t@h9E;5%*S_YO9wg?<CSFh;nUz+;;%@Oh}zY2$$m!q9Ys#ErD%}-mx4EPYH(1!o= zDeMBl7LN?N0-if1x$^N-gZRnn`e}QEtwN6FmGcZz!5P+({ng=l8~9X&4W;tp<w|LO zzWI&rco+tt?9X&muu98@=d%3%dg+*VO*ngeC~)^K+jz#UEH=5mY-Zht(}=Iz1b@8W zB2<!Hxv7<j|NY!}f9ShMb$LQ7%<Q}X`#QM7zusQw;?9xyv2qu2X?tmU)7eFAZfb(z zprh~)ztTzO>2151dw8M9!T4W#<nG33LYs&C6w(I6L2<arHfF%5l0`)hfw)aTy;aRN zYfC^5O?=RD=R~22CQw59jkd>h5(7QhsaO5+FExWF5l{r{{VPu0u&W;GIy5>Maeg#( znzfY!LyD}idW>zue(G*yc&y9j;T@%IRi>1n5lPv`IjInbth=)`U4^m2BVkiFiLyd| zezZ`7G!fPzSr3_xyf97Ra#c#qSpcqw1ny;iaXpVlObf>TuYS~)6E}PgN~&G3%Ww75 z1Mh~BAv433=2J`XS8KpOwvNk0Xp9&!PD(qLiY64v^~}4%4BsjKx<~awBi;)3$7T2L zOw6PaV8$FqX1KVl`?+a$CybM-a6Vmq{Ej_JkB$2=!Uyfl>LE5L0Uiwt-40+oiqrWZ z*VQRL1sb2UA{nJNM?;FfN4$R807R~`|C;J8hF07Y;nCFHzQhz-9{-N|d&MY2uxZS$ zPz){_V@zBE{>Qn%v3dx%_HtpUu@#77lrWDk>#2&k0tRf{_xf5AlUu8LfPvP}ecM9O z-N!$FX~rybGjU8q$2raMNu)^TOZcre3s5^wkL>|vXkem7GMh@KQP~m6B=W^Ab>Sfh zI`4frqV|4fPi8UxqP^@9bmi1|atq#KerNwni%=i54BB#!ygACsbtdVo(A`rXs1Zcv zh1#L%cMT%NagvwT79O_0Q|H8n*T@;oDm+vo%LPlx@#_%|4sE{r`Nr@`5WJ=Y{PeA) z=^;6toL2S~SCyE$K3J-mAlU;>D&`iq7vTi)9F#4vGt`zZgc)jTJ<YE0*SDnfZczGX zi6530m)0cL0$H9dZvhIi8<UIA_V~4LR}8U!WXB(FLT76M>9nXH1eQdedqODR&DK?k zt(i*Hs+N|b!bB#Vfd}L}G1kN>JPE=m(4~!?xuAvPS!`~Wr+`rI?=UBC)T>H#h^;nB zy2KBb&Br&gli&-Ej!$?td*A3!Og`hZ7kweCBLKQ{4gRYRbH6uyk6bj%PjIktF3r`t zdJ_W>^ILb;JzTDRM)1<+*1>KJbIHHvZG0Tvd0)VxOzICwYDRSH4Ip&DsNGxj`@=}; z)Nir|a__%)<t{C`-^~bRl2B`q5C*JFhLJSM+|Ihuqzln>4w=J41jZb<vU5JZ=6^&I zblEWt-{9{3vDVzWy%O+Crrwsd{I;WQN^q8FY1fNn%gXJycgNpyHfuXiXI+hGdQ-+x za|-IYB;ny`D+t|mkMi_p8DU|kw-#nI2sZheeA@hF<`K6`Wo2LUQ$wY?@C?oi#%e+{ z=2CqiElce{wOMDNIoc$LAX+7SI*5X4ims^Y4HPu^K+_{i$L5jZz54V?7Qp#bJokK+ z3%pDxVh~gVIR9#vlinOwMlJ`hVrTS#v9~EUN`;<0S`YugwG3Vunt|c@w=gg${xSK+ zB}|rtrSIk`LCVxSyL5GM>fH3*Z4WDj>>h?5X{1ah@>pb=A~jG4l=ji<r|=iN=Lfmz z7ON|J`EiCS!g<oYblb+Vw3<96D$lAJ0>|%rL{_j6F-cszy?Ug&PFZkLn4o2LksK|^ zOYWYq5X<AsVX{VI15q1Y<*8FI_u8s|(-DD+f7Pd^KNpsn$><cRtS1EDao`4y(J&zA zBpT5~i=x{j2K)7;H}if!nOZ=JD-a2)%ctqwxdm0#f@(5-y}ApvBRT<pZNx<pYz!XD zi=x=vyj*f=JH_4n8<z3m-0c1^PRwP9=jItw?=PI+@Zr3;QlbS+_nUv423;5|!I?*d z=E*V=rf0{c%>6+se^JY#o>-i|J#sh<2TYA*9R;&oUo7KI|8ZyMeKr|JNMYMcZ0fj~ zvxa@@Fn%UYGm9st3>fzkT@fYstgmb(t?CO}@2Xn3K`88zb#B0R6PB^M@{7$I)xN)> z-@2o4Fn0cPyGJ`oE|gxJ+xTzXg}E&EOdP*i?F;IP@{totl0e!eQfl?XO~Yrl@IkaW zbBkfwGsC%3-IK6qu?TyUw{o5<S^<sM<@?0ua<_*rNJXJ#w8W2Yi;TPZ1m~wo1cQP4 zbq$oQ6Zu)n9a5wR-7JQG(a^-W?SzrcqJC5U9n>}AtBB3(({%7o<guYH__!$$0HO%j z3DEsOEnu6>?{x}Z-+D}4f_emId}%x7$>~yK{jnbHAK!%a#K7YADULGz0lRnujMZXr zxgK|6Dsg6WXh#zwrzBxTSE+5z$mu0Z#Wc*LK{)H#yIfdIrBD5lWjOQ|)(Q@D+3Gim zSNvgQi04T(s;?W3_i-FIjt+ZWlsvI9HHg8*I^(YeE|Kit9>cj916+Gw3{T^dQgx~O zP(;<Z!H}!9e*?pDeR;(@^9^ZpVzRw`w|6CKUY*IkG^w<Rda?#vS_VKr4c(aZf2;BT z(x%gC{%>6yHoFB!aeXR$P7S#(_tEfHgC5wHh$r0Z8M^;EV?hr#i)d3Jb+cD;JfUmk ztyeQ;odUCrlyzggR4l`CwuL5@MQ=SGE6&YA;C}CNp4_BV&?Wv}Hbt=XBZa;~ZKTk7 zL07PA8WcWf;eF-WgzB#X!fqi@uwwksdxtaE1w$tK&nutf>drJAZfk$c&4}U#em1+O zY^|MRe{LqB-V_m!uP}MHBDWgEHv?=SI*B&t-FQB_U5xvJeOyfgQ`fa&?%U=t%Pn>= z<=N_=L;zoMb*AV7rS^!^{)Q0?P-0g~Kj)*3Im>UK#sh$*Eb8gli|BgmcF5SB_k(QH zvDHch4nn3(SKz*C)uE48^tDLbKMV=3P6T7yyEfehNd?q-i7(jhRx;GE_tpjxn7@&* zTdalddPV1yrr+b0*HR1QBnU#cmkt4{k8K}jRHXkN{tqhG&FO<piyWayloa0DAhEX$ z9ZeGe$;b$3e|)bX9vK6X7!TF*_6#65hquFbDp=Ca$-g<^oJsxicb<KUZjhIX-ugP> z(NvYXr!12TuBjqTDUsQ&y)DkjxZOz!)8!78>F14`U&qZtq_>0<5zgQ;1X(^Wa+=*w zHY~QB1ej!gHgxyFsuwD?r9g1JTD<`>gG-q18dHs>R%xS##~X(<G6~Pb;Fcc;1z)i` z{JMLFK|1Nh+k~HG%sF1DpNz#c+5ej2%Cj>_5R<%V5{x;cEEYG{lay}gMdFq8zn{Uo zHPTe)A*{24W#D_h8?7sIfZN!rt@ElI#S<g=!9$5h^yA03l6~v*Cdtpl?EvtOm$T@D zG{>M2C^?UQSe|*RX7r<KTgMMXB>4xOG>%n~%Y2u|5|vXf?&|T}2hvy@?WTX*B_#>` z1CF6<avAz?!MCI>c7Q@azdOFP(*rfF-z*NJj%Tz3Pc3sK$C%6IOF#u3cv908O_d>k znY}`RiG9ULiCi)I4393FPtV%!0mEyk0t})4ZsCY;h6v@l*9(6X{84My;dw0={Sc0l zIZC|FVTl+*;%RNhA^sHlDVp$#wDDJdA|?O3quA$<K#VO8(KlWwTGHL_FP;dM@Xy6g zDteOb9b2RsV8!<SSOy~XOx%e|4Y&P&_e(Id9R?J#^4M@QkC;Mp0G<Q~bbg$5IA$q3 zl7wnUMbApRy<;5?13|U}6)O@MuswhnMa@6B46;?}yW8|h@9uLQh>ymwusaSEj4}l5 z#AW6rX$$EsXsv*$crfxNV39@ggmPx~7m(cV1no5Y1*hk<WsbGpW`0RWeWSnBmRdZt z9cK*a+jKeL0l^{ZQb5t{8|e`6&}9zU&rGjm%-tF;bjS?6M8G2ga56oO%PnGfaAOBF zftUD{ktUZ5rKU+pMo7yGwa43-!(Q$`e8?1zX@FMUp?7|7U<KIzI0%0@8@%U*hs>vL z##<6I?>-4%GxhF|*~&Ak#tOfcUr8B!O>?Ng8-XCjJxDG_!k%D1Wh%dc^)WCif8})Q z_8S44yU7rxdQ?=>4=B1`bImjW?xum6B-+?1{VzUjMJwNwgNw$kOp!K}uVU+5GhKMa zQ3n&Yw`;beg_A(ZGFjCmea9bA!*~&*vqT-u_fC6R$_i84E(5(^4~B|ELg55b#6N-H z;N}0p)H3D|vj4VU{==-xp2}%uFrk){sOT0jhFr=HPVfIIGuLV>^93E0IT!4?KV<50 z-m4KKX0ts+BI23B4d%DvqKqYkNNJIwcN)?q<r<+7%Zl)Rau)&1M~eS#`^aZm{lpHH z5<-vvvHS^8uqIWvq@C@AM~Ws9ANAuyjLrf_4VD;@Qr7Z>_hW4hYkCkuLzP0v*7LNz z?Eoa(mp1>&<+5jjek6S~#Ek`%BZBAZ3{=u`+HZyb0mRaZ;#=^sB=ixx8=A}LNB}Rq z!GB^JPZ}x-DmFc!cndBuUnDx97K>%#rJvvax)xE@4k!+E_y8ESGrDC?0yG?|MI>kl zjJbyIK5zhCSfJq9Q*;O?R-?zk8!}7^1P4MWnvg{p>O&-GXTP)0X4#EySTz|qJapPk zRYIh2alV;AL(O*4RwoNp+@m%X0Pu}TjClWr5j(Il!IchdP<gV6{?!g@#-)Ul(k^^c z%u>e8Z}~d0;n$B*7)HS51DtZ7R3{lcWEZ#k038zkG7~0$tl??*G%r$3eZ3K7f<n~! zR+*+}boMOQeE6B(?1wJxXJZntXDw?5jmk5-SsdsSNjHOPUMBihUhYM%p1%ub4Rm{c zYmOuPj_L*w$>~Zt3vu-THXo;uAVlX|b}@h9#*nr-l>h>lWThyX1W+E@t~C!dka*pG z;v3v2fY<kQ@w+xAz*zYH4JL(Sj-eoSpXfs`{i7QLJY}uNaXO<a$Cr)6Q3@cpJ_c2C zcx+-%3P_~_BTI{=`XIf=5io(`mp@?&IZC1h0kt}Ei1L381=L-=z5xtjs1%Wfpo_j6 zAQTgse=|Mt&5y>NbI_J+4qP%DC~FI-=Bfvr^Vbb0DtoFC<e4!Qp91L_pxP~@C;Pxw zf5S)4z=uD(lf(6r&pVYCjP*^X$mVk`9&30Df>7=(%R!?c<^#{U(qqoBmTbeMsCu<d zUvdROXM8sYObQ_+zC7}{vSeD^-xKI#ttR#WTEWI9{hvz72|DOe5OH;PE!5taldKNh zAqYi|T<4LD^C&LVz$AE^HRc$AL@^!#CrJXC4+JyJ*{omHU;~rhY-Sf3KUelx`^X?? z!g*j42xF0NYED%&|8tKzS)G(=Olpj)#Fk}gd<&hVp}^->wrrJ_2r_jScEG%Q<`d%V zTL!%lT?XLNA^Wg)zBIpnzx*&m#;siVMF3tmT=4tP#%u=UYyO8CB<$~T1+upbodM=^ z{qmsR2X=+p8Vq9aCD#qGwdT(v*FpGrxb=>)*hcjod}oYO=}$1St`ueifzd+_dU><u zcj&Jly{P3yap!<oj7;4M36^Mh6(Hp-nO{T)58U%oP&bf5V{hj5ow_cGOh6)xKV7N6 zC+sHVfP-V>Em${KNjw0AH`4>gjjlxoi&0Mcz=5FYv~<7xr}E%2zjxLz+dzF2pEjr5 z+Q`TEYfkY@&?4%PAQq%am-lb{_i=j2?k&pH96dJP2Q}w@ef@eTY>(>s10Z-|00+~~ z+4Sa;zzt4-X81lRdk81bZFSM~C~jSuNZ;83y@_N>J?L;0&%U6+3r)y82MK|ax>fwf zb%milq<GAS1d`v-4&U;Gi2ByU3h;M-E5wieqmKW1_w@+G<{cbDTzG0TAtwIe8EEb% zX>6+bcu3<3cnJ>uE5&HX#|S8q+~q-f^*{NQ<YP*^m-W6g?yj!RWl4ZPlMXQ}io<Ve zpbn$C1c$K>0oza<s)t3PmU)Whg&xc*mBYK@A60smmP$6cCnSh?+{`lH(Yfi{(F1U_ zhbjB(#3nVBo4Cv^gkH@a_`lqdyLsR<hoBHZp5EOtAXVu_y5S$qekU9I@gKXS!Ym`R z_0{bF{nCHW1YDkkf9=Mmf>tnl@_q<L$U_XQVx#B}L6-Li{cl+0itDB(do|bdZTxK5 zwXCe}7GePUhEzW}<Dod2vMp|3;GeZ;ttonaaBwaxA05K8Q#Y-E4qi?OgnNBrf!;<n zp$uZ&D>^SkO$a3tG`}On@5~Ql^=Ts7X4VAQ>7=q=fsTQV?jU;_BcO($SH{Xz>!&?A zv!P<rYVGd`@G0@GJ;W&=l4wuB&jzHNv+3O%i8kR!Ikxa;<YA~U^@RnPzwS$9oX$|j z(KUA9_qYxt%Qmp*t;|5)$9g{4iVf`S56-<+=^@~(U~}1a>klX-U;|L*U*;2j38Mal zOMZ4Mv2nu00Zh7f<3VCi&)3DxQLd?3T?j60jzE`6Ooep25Z`wgt4F`_#cQ}8>O8*3 z<^aocO}UByoeIS{Amo?ubMgM>@q)K&)8t;LSQLL#7_K4KKrfX@1K01Jqd3SpD~~6A zDSz~{FF=LxwQzh|furEtJpXG*qW)znUec7y7~_dn_F2T(sO%FOJa$+N&HME*1`N~< zTet4nyuM#4TvG?-N6<OOL`=Fd|DK1qB_p=P2=^VQX**#wI#%GfEWQV!DswD$mzY)g zz`_pyD)m{g5K?_~-Tg!bf--s7{R5%z3Lz%NbiY<o4+wwP4QF@S@r?~G{;SjF0Ph(- z&9`VPFf>``j0M^lGSW^<$^IwpY{f#<S4bZGGp%jZE#3LfIT25y$pTx@!JZ?3K3T{) z?ZVYjEc(-Lek3lZ6p|Qq{3w^u)ovv!QePAbx<-54A*46uu3wY+IO)-qT;1R5M4kBc zG1?!IXVz@iNOoj%+a?UsRsBqrJSl$#7+6Y$qe`Sl=WAj?LyZ#+MmD-Ne&f6AldAxB z0cVAZOHCNuos1@z)*zg~+i@FRm7<QNx-QQ1Rcr;;TYAvo84vFet(s?+UjJnkwT{lQ z+6bt3+xy^)A!*3*Q!vuEQ?rvPfxD59xoj+>>&F>h@k)jy1E$Ue&RkpJ4JQjJb;s#d z!%J$%)gniZwc<tAycWwfX@6SFkYnoH)@k0p;o|-9d(It2n(?beaUTBr_wh-Qt^9){ zn=WU!O}C%fg&O!xTAJsto=uMyO;1P1y*}UGwtD-B+MMH|ZjZK6^#sRt-J5j8;Crd8 zlW?`oE^xF&()o_;g=eoHoEike7X1gt=dQ;>r~aCKEByZcyvv@l8wZPx#NpgUXQ%_a z<u==m#E}fa*<B0XdUekx^vxXBKwY2j$}*h=j>*~*U(;<snnitouJV%N&-)}*^9nQ5 zed<87m||!2XGK>?G}T9k{=BInYBUJEIIap~ZxQP>9Sger#&m6tZ)5g|OOCvhP_-=2 zz*Yz~lXK{iRQIvWMg*Bm|A3i-;SfU_pGt?C4jqQai$M12BIjlUXld`U;Y<E|*?T}v zh#0sqYw#yyOr+=)6TZQ4Cm}i!e@XqE$MrSzt9HSoA1celyE{L`)OYOsGl7|c^`31^ zbZ*YwM-H2*5zg(|_<ph@Q{ys!r|HI%I#R@2+jW`hgPCO=H+Rk`hjIMbOw^W>zjkP? zXFsaT`Xo6=Oq<M{8GJU8?xI3lMQ5WpYj1lKbnDMjRE6^F>nW_M(y{i=TyyP4Cjcw8 zq0Mw>>Z0pBtdzSy*~8Q_b!T+(QehXjbyWUjYdHAkaq=p`dIYhSv0xXYSHV&E<26ea zAF3u*>Gp^B)9=>^YG>;)g-e>qETTg8q~~#bdjzq83@*bz6UAT83f9FK<SPXS{$_q- zNi%X3-dAA-e3NKO8%V2L@d5?3Pb%FmiLzpm9Cum2kwpcnC!nEb{B`?Am=BACQ=K#s znRq|DUjC*eW>@v>;k`UUb}UE#(<m4dBP6-D`8<VH*frtSOE}?06;-HhjoM}^5U!@( z={>dhoOY%APodZ0_~4|-D>rE{f$U{d?hLV@1H3Y*$mnkjr%rnC;$PGW-JPpYeCU@i zLo%SEyxEvMKuPh74l0B;Ka%E^Tk%p6`0(C|=Kbq`ys=4e^3uiB(y!y<Tk)Z=&{0v3 z)zc<9AuP3w$nVNLSdBkx+>@}ps++n8#=&0}DO2S`ONIU|6eOpI`0eKgcf7@9csWAl zC?7if`ikR+{Pg>7x5p)dgrKc*!m^!FvVpu6pSg!4cAu?>P#L!&ANuQIDMBZ)`z<H; z1b9taQjBH59+Fc+FJbDO_TYq2Nz&->m6KGxPj}!;8FgSp%GA((f%LFml#O=@UuNnf z8wQ;bmPKLcN9Xw7f?He1V{QH$ji2cZTVkI5rTZe5`#U($+*uzyW#(U6SwwjKNFcrI z;(_5|m1sE)@{@gV$|vYvDc!xZZ*|su)H;EA;?+LKpquRsS;=`*N$!|q{QOioN}=nF zqcv+s?p49H7eD>Acoc2a@*iK(;!|Z%C04qPQ~V=fFyT6u_9kbM#mVDM)|ZLB$;XrQ zT+Ly9*Kw_6X(HQ%OWYxAey{GNe?3Fop!+zFGj~%7x{od#R(PAAtzEkp9_t*tL~B>F ze19>=(xY>nE79Z~A$_NF#f<*uZ*wwLNV(?rH%7k*obvTk3nXak0ALT}B{yNKD9OKf zQWN84Xbp{Q(QSlqpSDY#|Dm2n87J}zf#@JnL1t)blFyCLQKcnLHD}1lN&U0DdvFV~ zpQ^rADL^-ytd73d*nB@d#`?7RrCX-A?V7y8qo{0|5Pi%e_u;Bk@IZ1ZljNc*`JkR) zBoaPU0V%(G0|k*>dy|Mlx9F%R7qca?W$S5b)rHbcK&f`9*wW466EGfLMv|?mi>+N1 z>8Jhf_$Y=x`p?uSYh4}$Aa#wT>Vu2!IPcbDoKTWk*iIR3?D!@T*=M4_{U6?U_POi@ z+zdK!x*Gbm&W{b`n550;4I{15`5uLE!9G0`F`_>iIT#XToe;a+g`2T+OXvagtR|P= z6P$o3H-G1@6=A63PYojpZld?GaI7S6_7spV`CK2zz(y?`3xm9-HqPXbg>gTwyiY4g z<&%T5-oN8xN%orCWVsbA=vv`1SSO;`*4vj`4loyWMrG!iflWQ+k6$szYWGN*lv*Q9 zu9lr(YFh!_J}+PZi8*Ptr=U%dzST95*|VJLbM~lrz@CFe;#b&@PN%q^E9KH$!rd9; zEqn)<P^e)c;JS8;j5J87#$XHt*t7BmUh=K5;=3#@GWL4`Y<m!}*wHU+sb|{WPm@HZ zA2@%cTvWf9y-o_H8g(<PAv<hda@FgP=Fc-vKw*yT9VSIvwFPyDyo~rXfXG<-@t38H zFX!7-ZlA^uiO-%7Qikqh*DMYWN9#jk{W_bfjf|>)p7@9$z4`*OS^zd4?+F6->MZV1 zQ#2KMtOOx*zmn46AuCXheXzpfKn}scTCwfrKa4nx%w}<6V{bU;Md1(vE9xlP6<<8~ z4Y7?W&f~Q!*@!{DeC*31s*cF<Zz8*k`Hi-yXUUFI>w`Jb769_x#~pDi77#T$MjvgC zX{AarJcHb=jJ&TtNNj?mxLf80Y$~G5&_cMnF-%q%ruQP%Ncn-93=Gj#B<u<Kdp0iv zwmQa9v@OIQ?o<a4fnhh4w#>|7s^-)DRhMt?HhDp=rql+K2M8MP^_nQ7pL8vkNK*Y8 z;WOrsE&9#dZ-C(SP09hlKk5>tpB^Hi)I)%7i;uK1rFkQ5hA{h%6zC1r)U;gwwR}5O z!0CQyEp*=J%oH^(Eb!6vqnrfuD-7Y+LqB`@aJgG<Jt1cR@S)iK)t)#HW3;CzeLZdm z?P5|+dI6i&;hMpi^v`LC4rZ}t(PqZ7)GjR_vXX)&(QG)Tf5SgKZ}z1#eg(Qy2pQh& zu)U%`a@59{avK_$6ah4&eg&8mfs3N%vg4p$uijvM2eX0e*cTd13MS=!dL9#Ul>>CW zxp`d~l(zB*9~{prt1h67v_`)_s>6y_=p;F@^u#SxE?$NVtxwSexx1nItVjt!kD6-9 zlw8MfvHs}9T)7>Rhr<ttJ@WOAn^WR&KO4Rrg%`bXmH6$VI*JX44sNz1<LtZ0t5CM_ zud?3?7K0xxZP0$04gNojeRWVBLHFf6c(}X6!wK&0?oNUv!3i2%gFM__1Hs)P!QI{6 z-Q5!)kmdVr?bhzr*4EyCrfO!YyQh1mr_bqg?|n)E@t+3@(`?z(L%+TLU1hg<YvS7A zUy{9;69tqV(4M3<!QtL@`O|~s`!UJYvCOGBHS&?cI>bEkz{sn9RC7zbpN)T|fa95X z>~jPq^2yVsVwIk={K_>1%tp9OWgPK7iE;s>99X?$IZirnygk}Hwz5W+f&--cVua4r z`&iJKa1u9+>b28JRI_=@LDH^{#c>46-MP8X)p-Fj#N=kHf@@oJ0!ZrRhQ}*{!3hip zKG$+`)CrnjNC(1y*(MNLh7IeWXa|x&Z0H2RtW(~=i!!L|yGV5>289khCWUsDDFUQ} z9zpEuZ%`jg-&Qv`F1-L1^34{1Uh69i%f1ado5Wl}aUD618p;fIkmY(kj>xw9SfAS$ zL6FB|4+{AdaK?LI?|p3WlLi)1<0OP_`bCjQ+&f0=XxBu(i_Z8+!0SizW|GL=4hZ#b zlj(ZIG7=y9lN-<=2mR%82Ox~tZh6itjcL8+%oGJFf&@4}Jn#_W=4(Ni<zJ09RUCmw zw81=(Q<$6*DX8t2ZE)5sjbK<RA@$Snqs+Z)pXtM}U}UJMh6>9f7hQBXpxWN0{VCzo z)N}o3^XzNV^c4cu=t$_HZ(K~9**QWDlTRvcxhk^-urN_AMMd`!;9iE&)s8LBYs3GM zChXfAT!gQS#a?+?0>L(2g$e7w4y8LuSNT9Zy4`c|D`Zad5P2caWSCrh?ppcA1F+;n zi(s)#`@rA=#zgwS`67Gb{+ToSeRf{bdwHc9y}V22aSs~}qxYEvi@RE?8tc-}rQgIR za*@_a#NZ3yV7xftRxuz>+OySI$76aYqwmOVJX3F?#Uxtp>gZXgxZ80r-<iGi3lkLh z5a1Gp`}S89ia^uS>s)N6;8~T+8;W4I;#%LiQf{P2gY?M00c4G&%@`2P=4Y<2Ppq;p zL%AzoIj!wgO~q}43oNY+G?SQS7Bwz;9fC!fV#xHfv_=5<77Oc4cl7aoM}SJg`%>c^ z!C`Om*^<J7P%sT2swFmdOYy)fF%0T^MAt9ldys3(EI$suNdgLfq=B{f+P(jam>4y0 z`lH$Jyt)1Z2AX?YE!In_D66={T%vc_3Cd}(>rp%5+7%Re78?(Mp<zy`(NjNN$UacV zJ}P$os^&H2cU9{pC3*_UK1`y5>f#ln!-iU{xN|~1ICJgeIH6$`sb<Gwh$VkyaaY*Z z|J@+XJf-}&;Ea-?{Dl&sFsTjn#giB8x&U#$+lY|;l>*CjMFMX2*)b5Ye*XffQ1Blf zV5M`E@$<m0_AJr$=16W$FlSuQ3l!77oNOdv?STK1DI2-$UQVD%dqE0J*VTUBt;1uH zRydeOu*86V_<U<yRb+6(-p56Z_5N$CaV<i|*C{IwYj)tBywa~6!oT!zIlkf_Py&jV zV8Uvt#A^^RnK#oDX9(j`BqA!e>7JSfnoA9EPW}=MK%EQ<5bBq(iMh#JHMN!6taLkS z*pTio*OfK{7|8!oQ`~Q*q~U`4&~VxIr*Pk<Gb=)Qt-e}Z(AjGgqAfE9BOuL2U=Ue5 ztO2(820Y^P6`Lbkf!eVZa@=u28WLgAAP&_&7#U>1?VnW=*p$|2kd`{QE#`&!=z1d! zF4<nk1(S*>k6g6Ck?XO*qpq(59H_JtPplf!)x2pXdil;3h^4E@D`vNJAh)T|E`x=U zOaS5xZQ^*~0_`%IMChPL`zE(2BUjP%7)B4n+%+!X8guvqwnmdRa}=Wo!sGkg&2Jn{ zS0;=Ka9tN#f(o`@HlrOWL<jEWUR227b38GGYta$6F|nd)*x4c+v+KnBWa7~pe<bU= z--mJC5qjy;*K&+Uew%Sa+}a|fI~IV3aa%UL{mRrL3pD}BpaQT__hkQ{>Cv-DeF#YW z&S^X`19tTKvl{@jD{(DnqRQ+Bu6Z8RlbsV#2MDE7wcs&NFAt-*p2EHyvNuhAQbrOt zDen_!{QDg5;u9otYI-gBAY|;oKc;s98&>R+?U;vmVvNx}<u>ZEILUEV!}89<BhC_N zzdHROvIJWX!u$sJvVzk`aFMNwmhOlnI*Wk;ppPH-9)m2B^ElgYI%t5s#hGmAGCjt` z&xdG@582rvUDnhSvZfkS_~K`p3EU2imf>7bv3u-Xx*4STyYPXjago{#+6$OPzMS5t z_V?y=4bkxXJ~KxF_|e;dNk)lph~qXY5|(mb3|e}qw>{bj{m!Huvze=K2f<v+wC;S* z9+Dkh-+I0Z%axC(hf{~>r(Y}<%oHYOZy14BHrA}NS^ZBJi{ILz1m0e*Kt?nP21Tv7 z*KE<+(|~Jl?X|K;&ku;V&rI#ZxUjLM0lA32xjVs`b}eFeFrp@18>3f*3k&n}@Rt^N zlk!L~<oE%hb_EgU_Aeg`=VltL{435(>#6syT^c>=j$Q$#%AbX_r6VU?-d_cF9u_+X zu~{!cueB}O=>8%+6!r6OBYQ^{%w$bj+q$g?PctjJk@7rx19$gXAVZBEByFieVsm$` zg#9N{*gba&_l?asoo-zEWAy<c+dn%*-b?dsjgb-ZOdpjvk(eu|>0ouKu~Qq>;NnPk z)_#PZC&*O$#DC}A&2xvSTffiC_SA#g+^xotM)9}6xNmsN``4y?glM_Fc*bYOkJEzH z)Th6G3Q!;MIV;i9|3Zp=o76J!@@Gqzx8mWY;UGczub90l2rW~Jufbs-RCHkj>)lV; zcO^mSeA0KBm|h^K0V|1XtGCYhN-~@8oYA;H@mWYXe=>^nR{X*aryh~Z-j2-6@Wy$_ zHd>~<t`Po~sdVP!^u&Z5>NJ(sIpI^`6%-=#{vb*rKT!@JiWostp&O=QT%huqFsG}~ zN($CdBK1--H_q4WyF*MrMd%?}(EpWt*vKV#81fXajizN2Y?jPBOc8qW#zR?m3UyR^ z28k2XYjWvtdS9$e+vf?gapWKA==HqH#!~0E4;jveQqz!3Ori87|AOzx@h=(}o2bkE z63b#}AF0rhbM^GG$s#|KjX{QZ)~W7x#vC5<<eSXAbN^ypE8}7uuuRv9AM#x#tUK*l zZ#AvTXCEzuR_5*<6>9t1(UW5lZGQxU>`}Jn^U+#@WDIkYl1aga&o?IYOC&>eW1J`0 z$AE?k-*%pvhPHE&UD?Ui4X&G`KSqE0=SfV*+JEt=I33tNmN+4OwkUCPG?#w%IeHvv zFo)I0pS^+KVQ9(0dur4m8<+k)eAc8G;S%v1j-|d*D$cqpbj38!Gl9p{e<Cw+4S}8e zIr%2t6=~VKxSL?^C%Lz-yC&+mHR*QjhH2Bx4fZd>1Eidck5bv*1I2shp9IDd4~w=< z_5&opc=h27xDTbEEZE-c@LCo6Y56mWvfO#9=DvPq`4r9EDVXAIXRcDc*C4s*b0Bg% z6ko~eP4|PMbA+iQM^Uk*N3ELe-c!+EZ?h#SJ`b67ODF+Gec1e(u*v1eq!MvcS0O1; zF&~{H?;A03XMg&?FcTmD!!^tq|Nn6k1^-t|3izw2sCb_EMqRw~{11yEnBe_(;(wT5 ztvj8A2A(6S->=p#N$W~7rH>l67F5`b#OdE9H0VqSG^}*Z^z;~0Qmj0Z_I(P>%&pT4 zQ?%2+9K`1pe*ga6BD84T{I}1)&F6L-B65r;NTvPZ?_=sVW4DKM-p$|HkN>{BQq%lD z?PnemQg9X+Dk;g63S2o1iBu_LW0%E)p{_-GD2n+e^!CT?uNgC8ErQz~k4gNoj>n%k z*dsU=sN|R|@4j+S(~35<zsCq88hA{5@mud4*ncvfn7KqQwDD`zefM~-7^`jABNA2F zt-@BCmi5s4gZ^fWZS9YKy3Or`<f$TqkGWOU^=GC~#ki;BuPP~|1y^uWpE%RaC)+JQ zyaQng)v4;YsSTh3#O82OGKS>#xN9>}=8G55+k!&^D{$(Ef@bW4vyV+RCecjB&Kehv z7a!giHGjNEG+OA6zKfw>T{K8J(7emyXlXL`x_B_V{4&lr-dF}ccwd-_0kmhUxHmJl zFXQ<T;3-aM{DE02hCJlDJRP^&b4Pw<o(~pY+<*nf!Mt~g{jFmRw$93D=9+dcPeHE7 z)&|);?zG;Bgza~&OuzYuXa5a&!PR(g4;-+51AK%&W~6M?X&%@NjT8Hg<0Qoo%*!<2 zvM_B2mI8`dH{EL)k54gU@uc}Ra5du`6*5eJSL_IF4CO?cjBx?(<D+~+(?eAD0rk`Z z3;o=NYQ<OLy7z{j_UTOStsCBnlStytV#V|CpnA_|s4wk2fWzk=5>L*mXQV0(P+FBj z6;opJWNj~xS(yy2)$nUZ5v=$T&Fgr=MKjMQr-&Z>E(BI?_2H)To33rRxJ<{|4L>#h z2Y!_D=|V@m;8fC8RiEuPst=L~b?7h|iyY9LHFVZ2q|XY8vYyae#?({B{a>wWPQ&n+ zbaBL6jN9iJ2MT<+dN7EtEx+1L5B!Z$wpe`KJbx|>tJz^X6N1`4yY;oXG>}2Lg(_gW z4ARjwNq)GNj^10gfpeAUrRUy3q4}&p+xBzmlU7f191`8951FMcWvs4fRys1YyCcNn z-od4Z3g{Y3F!CjJg|C2lg_RE>h?HC6;T9En30OLhw<PZ>S|nT5<Wb>X9OdzPC+M^e z6Xs|~1{`%X27X0B=)D?tJJ-NtqDVHsNv;6xscaGPDNU#^!7Lr}4&0SW=bMM(bPcGm zL13<@8URc#4RUe!!;(}J?iEYxg6|s9!-8;_f9H{)2q@9tXqMQW`|R?@ct(14$^@Va zhXcHCZv8cI>LFBK26_&mzFy}jSrz*j&(zsMxKkq`m&g52<DZzX7pLm#`*9ba-+e-e z(<eMqTl+SY56du4E(>n3vjT=1lR47gMMNQXD76=lCyL-Di;s@X0(ZU*oGiu@y0PR6 ztDPajQ6x03COX%-gY9O18a<?}K;DPo>={~=gCX_DfyK`TzdWso27{uz@MW_)bUg6% zyNuGy%|MWKV4Z4%;)HY`7l*I`Xc2lQG9_z-M@_&_;>71`rBB2wZ+X3?py=#)zA$FK zi3Z%GOXkMhI~0jTmBY_LU4Q4Jx_6F&7A538kH6Yv;vJP0NeFr_&q+y1IcYAkT;t{^ z9q~;^5Jwp33kE=XFY=7xdl^pQ_p+7@X>2RV3yX>+c9H^sopKA6kFrT>KlnM=`15`n z3kHivI3dhoi=*;!+}Lsr?-Mf;VI)#kHYuh6nnp0$6Q)syRAihes0P6BA;Yt5o*e7K zfXpO;R<~(kWQQ`5Dq_FeJp=yHf{Xb?w<a~sYq|+|tHK#qXx9R0vb)d22peTs$g4-s z*=t{o^=LzeY~m;1N~vGcDu0K`i=AN~hv{m9#U)F^5;F9hWI`8CkC9;d&Z&;qc=8)9 z>$UvjLCl2C{#K7SI=SK{dKA<K0a70|2)`lGX>OfZZU(p2lAY@NxI1ug@b2oG{^w}s zHX@oKK)ZSCE34>TtbTg&X@~}0y=5O<)MV-X8<QFE=i$$2E&3phaRVulFqH$+ygDT> zT$y>a5HOpl$uWTDhB9!?xZYWv)||suq0`zrjJPy?RT@~joljFHhnfqPewSp}vX6Ui zx9rBD+hxB2jQmGW2skW6`;J@|0P1^AXVin0Pa&AqGDTlIf_Z#A00(nG>)=Ux$8F6| zz}|Dvt#kLEO9Pz3K_L~`VnW5AbQaBW#Br#6yihg}^h^-Y#Nl#&Va9#{?XBzpeSzdJ zW9VH>u!M!!;fe?;LX4!b&F5nxD~-ruk{@-*S)Km?j&1rdY20a_&0ryndZ4iHY+teX zV$E^y#)TxdQ6bS2?-{Bv2w8eVk$$<@w6&rbq~;x!=I`C-C0Cc?O9T-xEATY}KTrXM zM-i-81n5Tt9hjwK$q>XsGAKC?5$?6GOI}`ahUrEyIog-d((+rKX>j8o+o-#2pl|#W zkv$58aoJPCCoo(_#ED6)?nllQeB6_(p%^J0owrfS(8Cns6eb!klObO_a8F4Byqg%@ z8wy1>+Hc?ouJwU1bt11C7O2^QOSiW!Xy`+INcq13o_d5h+5STt{52=^FvSLdDlY!b z2|~)3o?#7?)K>Qigd<8up?qTb;QBYbTi#*OeSuKC!bM}}niJ}6;07dMfO$vI#ZOM& zii8=`+27`r#8c{QZFB>6UP3-rsL^tW9<=3@m?1z!8In-|vSLw!1f&z|9)yZvV1uYl zkz~<AlzsOX9Og|2DJ_Ws5Y}Lgo|EB4b>Q`;Ygi!{*WL&At}|Z0E&CA#v>f_~Ne<eE z%8+6vp8?X%z!XP%?L1DM@llKidKWy08N7X=)2AlhTM&gpG!RrC^0z_@QM`(UTpSYv zn0_(hJp*X6MZFqXpx$qTX*)@h{5Sgm%J+9|;*ZBw(GkbEhBxgu;5aZsAct%2Ffl{r zl!fR?;A(n}!V#2*X{zNyqK3B!)*1%|G2vF1uHhp<E>MjTO|dOeAOtowS+F-c0!{2{ zLB(|o0PmwG^!or+SCx?IqvD&muww8_5W(Hh`(l*niH#$|keVu_t|*K6!{KQ<({baO zO_t_UQ_E{b@qn+JL^ZH+jGyvhhU&*bVLY)pxH))^krL~kq)><sLf`WjB_-go%ran? zgti{8X7~<~YegZ^sH^)WZb3);XC~}H!|cD*aQ?0M%A&=3JFA~uO9fwnqYFtUgCryA zRjd^-D{J!&4@aO5bHS|GNZl{!Qs{ra!*cMHPpVbH{;C9>LkYcQ{1StjIk3&rW*x+P z)ylbyE#AS1KoAmH507bi{EfiJuc61cOL?3y4^)+qNq|d-yBpdB-2(?RLAgVSzUSMc z(X5~X-88||wcmN4Q7Rt)?wP!{;K<+$GAaZVReq(|0tK<06So~>08VyTwh;y)uUvEI z3@sR@%V{V~`r649{9>WM-U78bq9VRz={LZ~RSRN#!=EDmoVT)G(M<}~rBzICIPIrr zyq@|8eXY3K5E{X$qkffLlB`PLf!1U+4~Ez0sK)=+9*|8beTF8%S#}|GK9cvfs8s)i zo;B06c@;rly9`_RX|pOeBikt+_|nR%3;mJifiqH9xv8FiIC+4Px&cIoH=OHh1QK~5 zqmh)J&<um$^pe?DV=ZF)rY=(8gkn)Z*>GtFW4b9`DrgIx3;I!qke)MKB`#TcGx&P@ z!@JIoh6G{yVT8$rv@W66kR7WKS22rM?39fHYeE0Oc6>s~onjf<HP}w<5O@HIY^;@1 zUm-@l35Fq-eEEKo_3U+g#i9;h#Xa}#+2f)ksd)46U9JlcC@y<g67O~8n>&~EOyj;0 zC_TkH@0bJi^ThIE&D?nwr073y{TQ;IS*#jrwr~meZ|)KQg9K-6&CpL$G+uQaR4`Tw zfq0jq34;v8oD`_J@DI3oLQ)@fn!I>V{XvARdY93ZtV6;BaqkK!u8A|GI6?-!-Xo5u zN%IA_+ILvlLIa31;B`OrG%Y!xCC{$@>#*PH3q;@@&L+4Ce}T%i5yzZ$wEpfgk-TWW zKc=HNI1}+*xLoch_h~=k>OXrrTsXX59B}IzY7d1`MD7XAH_JLWsMAwt)OuW6z=M6c zVM{dRA?hxo0Et&sE^GZwG-Rpx0cGG>GGke8(i}!<afZFpn!%p2XeQmvX2Mesb1Rdv zLaBGj*vFGmjON_r6c{#~$`W_hDe?B3E^0&xjM9_Q2>9!M`7>|a;C6(mh{^sJ7lPE3 z<bEIl{nK{U{9t8>k;}NJgflbK^x<-eZ%(kewL!J^ROAu*?D%yKJ~{_<8ztx7_hD-0 zd~pi#0a3lz>rT;&4NJh7v{W5D_36g32>0p6?U->s;|UklDFj6uAbbL5xNj4wA<vT8 zJooO2kL8zdN`JD_IB*;<`X$=E^3+9f2O0HzYE@><guq`UK#D^Ar@w)$JZ0rqrqO~Y z&DW&H%=jotKo<^5nQmqFU?3MnT_n0^&>`WJ0ESwmipgA0Bn1VP#RFID!;Ri*7&9r& zD5f-&luSrKaL^BGP)?lsI4yvS{h!<a3+kxL4=G>+$Vl@aVY>cFT{xO+4l$hOAdU#h z!-(6A>#Gyv33)1A-ft$!T8?slVNKW1FpnI?P<Su-9$9s%(q?@t>vP?;>JUd6x%lt8 zdf1oR#6#8x?F+=sGcUids{1`~+K;u>C@e}24Ewl#c|SKv5$HaWmrXjm4_mGne4DP) z%%gHEX~4qmT#(jN>l9^YY^g<qI;loPex?}EZTNd@>{kzXeP|O)=K$p-YO_F#XO9yp zJbs3x(sjhyGCrVPJ|6!OyJ^C^&KLTsHqlZI`Bou=ggzHZ{BQp%>wJ2nE{jZxx79Q| zKzCnY`wh>`v~Eom5Yxk^yG@_Mc^LE9sQntW^u&sXx<By5WAW14y#0@8--OHULFje8 zRknX&DlG2ImP27ao<{}DAr`!x@Mp74Kbo>Q?cKkC8{CHjcGM7pw=Q7MfeQS}yV=#% zZ*#+2RrCoqwT`Rk;!_ncVR_#d04j=XU`nG5y(>gN3*+}Ejp9!g-#b%ZrcaR{M;;eT zgpj-scbF}zz|G5(!`cH*n;o0^gOPrBXzPg`R&}NJDkDv3r4!cl1$1>PyGB5mcNk1p zO#&QrsI&SG8P!{p>pn0ue|M++%(fIuKYe^@Kqom)F`Z-VG3FnOtU%2v=R0lJNQzht z?>9F?bQGwg{|NB(iUowcfdJ_z`*DLDWtF(G1XbR{`8yaIjlo)E7X52lODuSGL0|JI z;XXUemg9aB+3g2on8i9#QsDEmKQ1bywC#<~R5ht+(NniBS|EwFE8TbfI@+odr}I#l zma}+G%bheE!AXuhB}NhI@RjMtjW9M{cJ!_KI1q#eK&9t+pNS#ykOsNECc92s7!GaL zpR=<kC6h`1gWaroW`0uevv%!VQec~$$U(7j6mBb{?VDHtYHzk@_bxeKKSi^9)b*RF zCW-Ewk01s_#_-|J<mG_10S>b^+rOP|a^0xU$qQF)<L2Cv4p=?=Tv;%Wo(l&f>3R`# z{J!f5fTIO{dq8yPWk!WiMs$Su$|>YNViP-AYgEZn)F-ZG{zKl!*;vbbQ5O9}X~atM zyU6fSoh$3OU-u)nrh)s9>g@Vf*29Pn4d&;{i*>&!3>fx**Vm`5m*fLfn}|yw51GyH zxUW|oXCH3&-H97mLqAUT#_#}rIc5dFoVbEY%V4LNvc1_~Q7+dTqnT$bV7~XzwSN2U z>tvWSV=NV>Zj+WZ9l@6CEBkLpe$4gSOl39H>=jSOfscbTfI3<R@$p*(QQS%POlqwi zPJ`XmnAeZv-V>Oc;~h*@=}{1*gWsHc^;q>rX&E>=@4=1b5~(EqQTey;NNjgknG3qE zNa3VzUBiwKvXnA1i;WT6KgMZ4lCggxdgs-~aTAaM_mx=qM=8cNt>%oLHDBw?s@vT3 zN{Gi3-sbHHy^4476fTiYTn{eC&AD0M!Eqoo?}6MKPh1uuE{Ene*k7>ZCx98t=_T-4 zS#1Bn=z2w%+!&DmE5OL3OBe~%QO8A7<i^q*@5D-mFAT8%pf+PJL+*(VN%uw~lH`}V z{osDDjwnf%d7n*KrWdom>s1z7?9rr`>FXsVqNB-m?V@QVL{MZ{89l=2M(g|I_ZKwC zk3kPdGcf6tgU-4gAiw<c5@Q|?Rnip^f*p)yvnsL@|Jiy^xRYMWp`91dJj|Q_Bz=i8 zY^H>ZuV$z|rrR0klm4ZWa9qCh=z<jLz`pHF>~}&6rxiv;s?)$KGp!{DQe^^agY0Sx zK!|}6)nZI~2sL{I-Pu}Tppqca&HE?47li!bNS`p8&aH$6I>SudNq3QqrZ_N$K4LO` zWJj{5mK^d`_|>I<I>GC6G;mht!{Z1Ky;468AXpYfoi^*XZ2mO%&XmWVIVQ!g9b)#O z24()-<P3=nA@0LOEV=wkpMz~fck_vCXNmCcu9A_KX2SHorTPKuJMofAGv^}<7@AEw zQ*OpOxGUCWiD0o@bZaI<bmX&LsO;FzGFvOdxk*iTl^@Tie|b3HI1WkCaUV=71Yfb) zW?QzbzQBXRAjUSo2yo%COxbVTZfGS$U!6IVVY5p0X0B61oNONrAFB9@Mi`?ue?@LY zy7V%)qPnerT1T~HDwLt5!K=fIFhjZqk%rh>Xqyc<RiUOaG25yyTSuf+ak7l+>*?wH zGBB0Yk5nWZJbp<ovg27ypLgEae7<zr+n4>_0xQyq;pD#6ae3`Cc`58SdCP6c1X&YC z42xGnfq;w;1;A}25mGQ<@P6w3`A=>2o|R&lqaCZ#oR=iD+;d87SxrR56bPKbf$a>k zGS|*A4ykH9M_vm;?S(vk3AN+*)p-FI0VY<lYq|3kma5kwfmbYK)29uv@Ge&TXVOGR zu(ka;CZ^|l;{lCwS3MI(d^9SIepDNVb&Waf%t5guHU+g+sim%)Zh)rw4<wSQ8OCBL zRM+MY-V-;@r}_9M3#URjr%(E<nFq!7zpT<RSY5*1uX;0}njd0?KO59l!ea?GA|vDB zUwvDGvJ)O_2!Z<w4JSg0QDG8_xj$V(7^#uK1@4)d7S98PO|7(1m89T0Es<RJWzH(h z7*BIBR602;EJD0xcq&3qblqXU9%tu|2H8Cw<RO`7Q`73X(oq71+s|D;UG1s7D-lY$ zx3UEO*w`JK*fMp5g<xA{%;k{Ol>wdS5c;0jM+TRf>m~_T|Kgd$P$BFcTOsAzS6Hq3 zouxld8AZY*-B-Y>nXh}S=gZLuIaqqj*S#=3%5G&ewIPGXhfU~2M%;_>8ax){24&Az z5N}b0j(1Ii*zoGWb={2A({kmoctkZNL$TO?<X6~AgfqU?G5l#OLI{i8T(Xiv^|Rvp zejWL10>p@)mRI3_gclcLV)mzw_y(kVIXrCfLRb;-xb52%x_03X=;#`mFx6FK|EqlZ zG3-FoIFKf|E0Z1F=75;Aa-2&u)KQ&ED1tV~o4~wJ?<;{QGP2YUR?&waYC=N=fiXH3 zGRS5xkb)|+o{uup-L;QQ3yUwZ(+{C|Fe6$?vX6!1JWUByU*YQDq`7`Rko%ge*)T18 z%1|gzjxod#{Thl3f(1q6+Qm;ycWD5W!gDp({4q2<<hG42tN~@cMqo)wT=B1=s3)H| z&`_`<m5FLI%V}gdY~{N=pIwzt*=H^e>^(a!j$*utU;tIN_(4JS0;xFiXt2!<W-l^t z{Dz9_7Nid>?*u=g0!hn(s)`~C(#KmQKg1pBQ&y+?E;fy!j*utRhW&IC=Kekdbn4<K z!y89AcwohCwB($8c^%#idZxkBpkkK1PdaG-VNdr(8wv&gyHPEhm-aLIr9#$?+{!el z=zO~5{?(v7=5KyxVgA?2fQ135rRT8V)^9>Z+^WYm@AU)k;iCI;<afq0>Q0ktvVT;U za$ZIrZKx|<ob%KE&9o+q!bNskb6Y(xAXEGdrn2GHexh67SXI%xI?Y<1#x1R;R~<!o z3ZiiueWHGCn1mUi7scf7;gIHZTRo61Q)%5_Oe>!|#8EjuK-8Whux9DVLuP0yi&~;Y zlw$5_-jJ8HD7Sa%>ioOA;><TsmdO!l9iA|l(7iRXRE*wTNWaC>{g`jd(l00_#12XX z2)|so{EBP1S0(cDM@p*@>`+Z1k3iuhRPNG(4MHedLXTHq6Pv(-fycSh25pOLJdJKE z3T}5=?f%UCSRLFA7A`FD8bOD3Bb%-tg8#1~gN;@RDvhUawz;0ud{OBjfgIRfU^8}X z1e~~TLKPzzPQvg&q#>gyI(86IR9`pvZ)e^Sf?cA`UySQq209~6353h^Aa$YADMww& z(Ujo8`Zk}Ju$k?`-*8D+u}sueU1zJjN3NaLiY08tzuO&4$@dFF1}lUQTHJOy1<M|` z1KeX-cgGf!Ffrd`$9n5-xz*}RrsH6Wy!=8I{&$up<P)$91O4USdazpS-|GZcx#Hct zN5(RIfQK`Xe($(HEHhX1x&YOL$%ybUThC{8)yp=K{pTZ@G@Pv#B!Wb^_Fz|x8ICpe zyz#nU38KV>@fx$9YJMVcoeAF~;&=6qjg5DK*{Ne8^DF+!82=&veNR5DHizR-gVXE9 z%2v_2YA)FNMg2*k&eBt5`K@-cqo?M|?h5NiU8&NB`t~SnocU>x$`Y7Sp){w6@r6f{ za%-oxG$wh*x5GAAD-uZtVK9a$&)6*weAnT=()JAx#%toO0lbUqrKofAasO;&6Oa%) za)BuO>yO?|tfps5D9SDoJG!KLN>t8Qv#g6e^#=hQmdu7vKgPxK$CMr3VF~>i85ody z%E}lWBOK!Wmmr^*N`w6QlDWUlC&lNkKjf&Z5M4hll31$UG+~+eb2A?uIO`qwE`8p} znT0e~(ttr<r{dgTj{GwiHTbyDbe~A(<b_Lv9#v<0=l9u`vJ_PwA5w`PPbwHu@PMdt zZ0ZC-e;szPqq5rXbaJ)yXJXaRm?cses9sGdOB1mqg;F|N5+fH=@<q}{BcD|t84<Bh z4H2yD{hpp8`GkcPcC;yd)-X{;TvzxeUJ5pWR@C{o6uD6l15tIRznznPP`pFKdhFwy z`h>tmqXRn5cOB~}8*J<IoPY)TJyHKmnQrj!<&aif9MOjj#$qtZDaWrk37QtC*p>Um z^+w}S@w%f{U3IpxHTeRwr`$Yj?X`xmu+8AP{8sXd;3Nenw#}q94%RP&_JGWS>aB<( z1JfOn-GYd6XS?OGD5NjFom;qfpVJ6IR$s0;BM*Fv-xv7R@+O1(g0x}KMasJmh>^F> zCBYr}*WczyH^%h})_M(`iKM2)cTatDg)6n>pG=PX#BUJ~6${FBrL-twr^OIlF6_m@ zG$JV9;sn@FqrixW<?@tUai4}YWyO`{DRX{T2+M8bae4{uq*il)64k`(0A{&Nw>v$@ zYSlBp7*8<Fj{6+qCts2Vfh0Z7BFmwR+8VO}?_zf=;(!`N`P&c*tk~T#m{2IjeGr<v ziNh+6ag+e~$I3g@t#IYngI92hprmM}%KE9hz?;+gzy(HZ=026tcGkIUxE=k~r}|GD zmZOZDztCjyW;XNpiqDY3PzVHnyS)t>vsXJ0>Eo093OiC50qe{&Kaj0SKjz94Kukk; zU!#$-T<91OuNeA~;m6%~d6G?vs|8Z*#2WPJn0`Y?$<8e1YjB@vwyD5<c|Ig(-!*`N zQbP<1l{p-F@2_3Zkw6-s9c;x6g4tlO`8!IrTw<bJf9Rg_{I~p4XqFNJ)<qyh&Pi}{ zMO6&@!E}eSLVo_Ol^zVExRAHIRfBX?9Y?u66T9@BAPEDXIwN)Q^secS*F$W5<sG*= z0mztTo2ydlCfOM5ovb1Ch`s&pUP}mHU%;!ei5h0)leD691^-OmCvXshV<Id#>RFw( z{4<7%_|@az<(z4&+30Nbr(*J^KA+gr6f7k&{>s|it=V}<R)p!rH&e-ny61+@D>5um z;NFW69Av-)IeH>95P*s2gbDCBJyr6nCS@Suf?o;R-L7p!l6O)+#u6(H+MryiRnEtg zYpt7rz);=OuU=UHvqwUdL{kv|^YHE<ta>E-?vKNGPw@c%Z^)|;k&X~if)LmV!>~|H zNOZipQLzi<Lamp~cn2d8D(`}VB5B6PS0YaY>K31#uX<2%N_TE)wH5#u+>^+OYl<G* zIE1{n%TAW{6>yeWyRONyM#aJ`LQnZUw=wF|3xSBDzf~KxZU^F0-gPdO691P6YfXXX z^3<TuH{OHLhP-A#Yvek1CQaDv-2|5Y(b;Xw-z&+^1D1xxlRT!ky3VK7!%32+6LNIg zS-%-C11FV7y~V-#bw1B<J^@c~%bSojcT*VCQbGf1307fGc}xm^M-AazZdmaVpj^C~ zi_Civ!6*Ch2ceqFF7yv$(#TrI#kD6U=Ip?d0}>*x-6^-Ng2?J=6siXf`{l#T7vdy2 zWh+efsGap3d5J_{aOr9ZSo)B{npRqf4vb72S@iq-MyyqN&_fst^D)V+Y2@EcMO_j$ zW?EZqA~}guh;+)nxpc<kD>08FS!~vscA$G`j&=z8XE#Q~FgR@dfK~HiW}<KA$C+l8 zp$MWo5x_COVo56VjiITGoyfiMOp)a<122TsDMm&H4UDCvf7cQ69ambs&qO|J)|&SA zL=4NpDKmUUg21)ryqraBlAFRHdF{`^WycVmQGtTq(FDuh1*YJ1w%R+)f{$i$YDl2z z>Z*`~(q@5buAr+OL$jFssL9T;O8=e(2iR$P$>oqjkkhCF2?ZTIA<Dnv-M*BklVr8@ z)J%_F0nu}Da36-%`oV@a8JQ^P8V6{flVN#Ac{mS1w&wkUnv-AbijkMPLO{;S@w4*S zdU-E|Qsz;RUsX#@Jm*oL(oRiQ6A3Y82-jAg@2s`~-b?fM_kYRxTv=kI)SDS*<S!0` zpzuV;?(!2-4~&{N-?pV<G8$04f@;L4lHb^d)<{im`;?r~65^5Zza`p#T{yNE?w6Zi zzdLoC4!61){m=`SXaZC9ia6SRHqTV2S~^9XRch%`<uTw<ejr3+uxYwI!^^zM#%a9e z;QSyDZdXL1iLKN=JSgVz_Jaq-i?coz44f$yqUq`e(4)evkSX8hZfujAofR_GYK{KV z^T2CoP6(cF=G*ptM{9K39qdSUAwVKD4DRdcDG$hu<$?b$PAOK+g&Qv*j|uXtZL$51 z6wb(|jwR1Wq@SA)4+~>*ERmr~3zCx8uSIJ53VZj|+{AM+{n6Qp%VFoE<MA}CX@MhT z;!I2<P9KKq4?pF_hk3!LS~+kVk}laVJ)VBLtz`Ga9xeuXqc#z;g5dQ~CJBp`L1YUO zllZE@K5jDS8F6vK8q9fQP`RmY)W3M>6xI$>nt~#zfy0y(jM_oKJ}!Pw<1lMA%TX!? zkvc&{EIk~PIuJfS8XzaS(v(mVCt(&YAlktT&_#~xVHjDdOl9pSe;-fAC$0Pqy~>L2 zYml3DiNB`BBC}FQ7mOPY<{_wPOjZ?NcbjSpyJXWU9D7Q^Y>31j`^v+=*?pRIpT;z` z!~$|al{kRKliT?L(Nc{;4_pxLk|g9PA3dpaiq7_iD5x7^R8%h<d5M0RUi{>6bEEok z$ROs=y?w^e;g3rA{OR)_h6cNe{r<tM+hc?>7^n!svhhPp?-#C{<=V@&hOBlp$t0i8 zU)iimHd7m(-){=X{M3Y}hD6bynIrzW6!|-nwebGuZG>oA)^`okz)&r0ba3BmN|iLM z24qJ=UUM;jpnaDf+->)7!SsDrzQhW<;Cnr}Oa|S4c?m))ci|Xng?WT$Rxk{&ff8xU zWJT3ihnoenw95#qINA%oz3QAx(<R-}+XtKP@)8TF%3{#P#krHeqxOk9(|HS&&Jtm5 zjKNZ)Pfk)^NHu{wpd_hpHJPHxTTuZpX3Sx=*+qJ-$<m9+c@grRHXkkEY0-vtrS*ie zlE=)TLZ~{`I~tCbG1QHq!;K3hEGY$t-SeHsz_Af$T-EhQgRE+y7HY!~MZ!`Dq}_M= z{!5|X4c~T$(}#n^Rzev#L`#8ls@TPr$Sv0tvT%)M=Br8ksJ#q{^bAS~eV#o-2Ll^j zOsp37LqZ-xRu25@m;tE6JluWt1yXEbUDoXHe@^_e&1NN2jUi^as1YHp?u#vh@Fumw z6-H~jm3X2wNHPnyC3h+<?Tr};n~Ng9^51D1ZoVj0Y7}xa(+tP{SrtVg%zlry#?;xl zM6;fOxHK?6n1%Ui7?HJ#jctv=FQelikvmq;Gb%*z<bm0;5MkzKrgaUS-*tG&E`y}> z52Llu3Ngc;e`P?2kppX!mE8E>_EvayLRX2=T}jLkU9d5U6~X$6Df?@q{Co4WwHFl8 z&A|>!_&}vuE<$Q}WpQ|F$N!*(Y497Ii04m(q7GQXyuk^1(zi>d-2QKHf(HFRNF)9K zKpLp<f!#*zg#Y6(Fw`%0w!-nB^lg3OSN6mx*)^C>hq(qMOIVOSFk<%q%+v+|T_P4= zhLGZnH<<&|-~$+bD8b^oM`-0Vwf^t+yu}`f3j57dVZ{lv2VxBU4LfqrI{xXQb$u1> z-#y<k1suDXIvs;8zd~8<S2MHz>MuulTB%Vf$~?`Lkya7>CXZ`2<ii0!PFLacKnl*M zXq2q;CIyySF$xR&gl$du<?Y^XSi^?7a&V|u`)^A-xoNRR4`-ip=FT6@2cDj#1FP89 zqpQdfX07^dL}tb(<quJ6H%>*Da|UOkKcqL@%i0P>JrG0J652TtrZ_AN3_kQ>{d&(B zvW_Zh7|CP!utptTRtptW^VHm^ka2pG_D1lseh1@~f2NBt3q<U)96iKmbg2_EZT_=~ z^AT)BG12!0cwp<Ia*OZCU6@D8{G7}r#=<?*4}(Eepc_!ErZ)g%`f6#J6t_>z;1i0? z4g2ID3pJHu!SN;PI$}yW5=p&Kppwh<wBGI!G1xD8F55>rT<W9@XI@1!3NdIs<~8wc z-CUvhSvG2VU(~XDOXe(eNxvbq>6Gm>o|2Smi)UIi>3$Mit{6hTo>%E+BaK$+lhfur zeGs-9{OmSH5_g^^B$fTM89tn4LkS&?dru?w<hw&V$NaCtq%-v^@tQl#TtXClX)2X! zVs@xzemP)t`oL^Ner&)<7-oepW(RK?{-oz@*o~BJS=ip0%B$TsGvm(SHL*fa)&JQg zJZCWAgz<ec5@2%QNI&cQ>}w)$g4T6ZFzM9ckT8>%^#ZVdY7(mbYX?YW$NjFds_}<i zXwDsYzf*GZgGpzUZ__K=qTNZ!ErR3MVY!~%Y1v9B_<Mfxz$UY<^|0Z)5jte3o$#u6 zZGR2GbL8YkRg+ncKi9H2k#$H$s%{13Sy=<<bif_j&BU0S0kBf@=g%XNQtE~m<VSll zpCH3`hVc)4y*5-`aF-9-p{`Dk|4i<xeme-k_&sSkKd4e23R#SCU%<k|t(qqoVi<+k zBs7z@vjF_`C)ZS@i>J~b3}a8mLPqh{PS#Y1GUW_T0_&|4lz*xm0PyZ_j^?z-m<*qh zd{=|@ZnV>n!4rG&qN^^WCC(_BiL_)a4Mv^EBR|XO7XB?KGwSfR+o!bUnnecCtGoz6 zuWgV4eFA{Hjgs_xf1>3LcF3_zj`L9}UW)@^E=%8eQu^W8*<eQg^m^hP<a55+Qj~tI z!2Di`9=ir++8=iS@val;LzF!%p^t|l9KU_ieuOuOjKl0=ZEM4_tzNW%^c+iMiP9O6 z8uYhIAm-C)JRpVR*F;PqwC%SMVvgr+l&uOg?!!N~>~T0i`j=wZ{HJdwK?Iq6`Bng$ zEB1;D`0EhG@&Gos(qkzV2LM$BCdk%X{$E24g?(k~e)ttFKtemW8*No+=BbIhc{&Ig z{ksqJ-1xymT@9mn8_)%;iShWF^YG#37--#9%}X)xMKs8V(Z9nY?(X@*q)1LCl2W3O z4s1mev10lY<Ux$mxs#Uyn0i2p+kD_{N>(Z=67AixJq(DI)nhgsq{<4e%T3Djq%L!i zRJ=pScwfetG({gnoLUYGw8tu1alnyze>8T8=4Kq%2@(gliXlSs=9mX;g?h^8E9ul` z@I|<J3TtQN-2ET=j1PdGQO8b%=e#d+U0bz1rIf_;$yAi9*nRFlmLyeF?u&4Dh3^K* zNE*pO;xm(=n!?ChUX2P6VMsP1QG*c<5b6HK0+5{~CG1cUBI0!k12n%uT(4_iMm=2{ z%efv;L0~^IxGsbJc0N^_?X56_!Pl7&Z*?oVLPUQ_8~}n!H=KAAgk~CR#gBHk%Un;t z#|sE^nU({WBr_fOcRILH`FvYSL^u)Hds`Z+ED0!>TBbjqgyu`f_Lt)gZpBwY2@ukO zBT^Z2|GbT|(MQ3G$BN{Q7Ug7pYIISQVps;1OI2`@(lKlfKYKq=ge*o`<~YT>AuSp6 z)sqHG{Phl1D1*B9$vZhW3_a)eHH1dvOIcx(&Z0(|!<wH#^n^z397${aVaSfIYrFp3 z_YHI1mTyevq+jTtv6-K%Z!g^_k={9XQ%Df{{JC22u^ET}(otwijm?ju34>4|T@5n` zp>C@mb3Cz&_~%PK5*DV1lgsI2NvOALsmi!TVKr>0y*yTEB9?kY7>EdG5QwbgUV#9+ zxOdQgUM`C!+QF?vR#);wg2h~H85i7*sER7YoP2Y=Y-Y<^A}Kd*(Zx(S;R}rqmCp}r z+9;Rg3jpRze8CKWi(nBZ5`m0XYdUxk7sl8?<f>yQ7E3AvU~)u|Px7B&!RXOQ05$z8 z>;cEURuJ!9plU@cTE7m4L~TE?w(rvEwxK=rbGz4mXL-Yshv!2%AI4tEiF8OM?OiAu z$@{*}Ja=j$j?XNH<(F?8fHW9Pv*@YjNjA0JE~@607@VX-;j0iXAb!I_id;~L=bYy~ z475aHm+Q~WB*7o#i)alG#<$=Lv)K$#yI4sD&DNi42LSnU+a4pHC2T3emdV`;h;D_- zjcXtVRph5qu3|R1LL{KtniRJP!dpM(Rw&BiWS}VQ@z>Ig5VArAYDY>2VZ|LGKG*k{ za~w@xTa>YQrlnSV2vAAk{8#=n4KW}bknK>Imq6Frm=jDW5l`L$U~-2@HqSNnZIhby zdTU+3hLyxfw|i?}92A%#dJUf<IruvkFl5qW;`>oRUCcXDw-DN9yJ#!#{8>_KhjBqU z0{)<Kvu~fI8{hxnkp{Lg+ZPC{gO()a@Wz)6#75<5(VTD^l)#vGQ!xRiOcK5H5zz^7 z!l$x!<i9WYSa%X6<xb1l3io&Tb545vC86ZZOop^`t}_#eM!*mgs=xZ1Fl|R12YAOy zu8^-M{h|`S<5GnWl8(xI<=2&5zElG81U0_$W8wkQiq}mBHVUz%2yk`mSKjZ$Ffflp z-vSI_Z&P&!X>eTqc8B4oS2&z*Vlr%E7mM_f+>>jVMhA&I!z{;T4QRxSNxX%S*b5~I zPB%e0pO6p1U;U_^+m^-K*3TYmmLUyz!hz_UE%j)6AB|#;6iJY}-vNkl<h5rSSeIo} zPLym?^cJu7EDOhGK-ePje{VJyfIuMVRfxU|*rb^|MFKni@yU8XO#p%hWBeZ-;C6<y zM2=BhKXq|#s~2-e;%Kb)O@2=#)8uUf%P`}E0EJQnN;g$JNT{G4twL~s_?h>y!h^Wu zW9qVyV0#SM7jnRp+~^~x*Dt&J4ARIElK?o}9Ul5llR)KPIqaTT;<nP>)_DjO-tRC` zl<C=Z7$)svE3H4PM-0yMgOt8^+W}#GCK_)Y-1FAKSO=93(^ny+{)lyDRM0Suql-$Q zgb*_gK)ihL)D@7E{eqZ$snDy<qByoKZMePv%Rj*!=ohNO>?ak!74^uHXIP;c7&Ckr z=S_`*H745lDS156JPXHm^$Ad%Rc+C&ixlooF|o$KH=pj3a}zjleU9<^OMwF6iD!~x zwvzS<@wifrr-h4@i#y{2q`${{aVx+B{r*Kjo^tGY4F`HE6?CIjZU|B7uP5*@zxIO- z>X0CMQl8c|Z}NNL5+P1<zpd1`wC8cci$Yi}!|avwVam3Wfnr-y5i<n4Y0(*jOt@_8 zUdkSN`xvff+x?xkfh0tY178g&YYs_y4v<f|M}U>rQys7zj*@wdB5rC~K}dLnMGWu| zAqOI0+xf5>e-_=mvaysV$AWV?Jv)#fk}}PsldulxlSjKu6i)1jXhl4tNsJ4^moGlR z4!&UOlv+aA_h9A{t86jSF0j;mVsPTW#_t|Ec7kM&3e6Vo$U!E*_)sFka9#06+#*<f zWsJ#34$?|K@p_l)Cg{9O1HLAg%BH3fdHkYdrtr062ukYT`=m|2Fo)B6vr|ggNerZ5 zw}$1UV4^V+uR!Xxk;0ee@e2!Rq%8~Or4{?J4f<2`B~4@bf4^=z74r?;-po;7dUH5G zUt}y!ysSH4EIY(uY6pCek!JwcV~ai<j$(p>WVTIPNr5E#2sP?pFqUb~;RElH&*y$; zyX2s}TGP>tA)tqy#(={N14?*I5CXq<D2yeZ&H`fCO?{yqjX*kCzh#}zw`0_dn(X75 zfS+2Wc(<hP9f*rc?#BfwW|r=dfMuKh5GEt(Fhb4oeU&<W>awzb|FjdxEb1Eu66_ZT zZ57&+;_|X<cMO|RIb^ZK3rZ7jK4JhI)68%A#+Y@ystEm8wK`$cFidJ*R$(DO6(!f^ z!+TS<{tYt5qHO(`wVMq{nSg4Ey6~xH$bR)t6^Sji`QZb9rjId~<AC;6z*r3L7eX9K znPn*?s9cz;s>i>**Y>;B@3iJyK1~x+G>8~HuOODDiu$zjZ^rb|0z9gFDrj0*nYX9O zUoMEnlrJHM_)m?i1%B`f7$SMBLLpOH5eIV;5*Cjf<_+H`5HDQ#9<aTp)Pr&$RoGnU zB`$6aoh!33umlcxi7)?or~z;P#<zof8gva#{Y;Fd6-mH2##)(+y+YxVj`Iapeo&l& zzb`e4xz}Q|H;b%Qq~s;|@lAM>r-Uc&Y2pp!a>b9s$4@|OGyon&>;f}&`#e`b;rFL> zU)L{=Ra9_D;FQ0cJx$eMk!W3@M#hZ?)-J+AymVJ1)rHp+4d0(@7s@OFDS%y+0KZ9N z@<U|h>ZIr?cW7e6Y;t?mi}2(3{rk9QcU*u+4ovPpq0{Bs=W&btN2N;X<gIvLkpQ0W z0@%O^jvt!Q`4^FZYtS7l_E|-jtET@uMP*UlbSe;oEIfT5XzE`Z&2@2oeZCeCtb?|C z07^p+9uUsbp2KlfiL*}5s1mJ|-U**R5TaZ6LT9OF6i8c4p;$BeTOpazBrT!$W@oig z7{-_~Y`dwr?2n#Fx|O3KRQo|c_@Wt$YiRohyIn2|z3?|h?+IT_WwB|wL~S=1U{Im) zGMZ$<Tft5at~<vVXana!q^u>*%ZN;L;wSS);s<@Gf5L;mj)jL|KfNU`wYJSwHtV+H zA`9vyu?|AU<Io@;X<9Ww5;qG^ux;_QaEFsV5I!J56ctm!Dqk;_oc!K2u-u$uJ9(Bz z2H9er&O9EHm0cwq0n5I8+l8di-+U^-GM#Q*4YMP+IB#og(knz!m7SV3p+hy<CWgY& z0vajih`=<Lp#k<BGdV^os{N~rrP-yKZzwrs4b;-w&oIhnWU~taC=3r`)CylMGOeCc z>Y4f%zBZp!flDAR%p*!>^DJ1XwK<AdHjk*Fdn8MT8VGnYy69cB%!JaD&qnTqA#S<K zqW;LH-QUNxiyg5EYuc~OMqas78mL#MZ5YZILM$YT9ZC0VNmu(CZ)C*=>f+!QfGY!J zTi;yZ+K$W2sPjY%(Y$N^Ebj6AA+7;eM7{tft_gOe8ku{N$7c=K@~X31;+k`eKpH>U z7vphx>K5nZ2NG0gH2!U*yuZn8L-aWTurhv~{$C2V+(T!oXK~mNIVoOH@qUcGWA6Wb zcOhEdfF0v)fSltI07njGNBgA<UdG@@X?V-r%?|VS=q`+A3e9S!92uhlq3%ut8~W<F z_k9SMn31PZUO77EB1l$_S+v-A^Q1IBp}iz+cl@kQb_&$No^M;Pi#cWNDj@B2+>}0H zByRdt+Gn(XlZEc3Cd_2fqce|ovh!wTao@DMEh1V}kUxvB$zpnG&Y9s_1Thq8q}kpO z%XgLDL)&^6)2qWb@ZCxB&NEN?l$J<&+%V7~EoYS%w~Tv+&HBYE<o+gRtD-Y&?}aTp zyt@r|?a7k`A%3^Yf?4h;u`}lpE+REa(e|AU$8_JOEuW)@Vx%hnO#W;kH=6fEa{o*$ zG=o2-`ErBz-#UBisJ5Qq4>SqEr2&dVaVzc=4ess~ch?q|P~6?!ixwypcX!ufrMO#h zd3=BGoF~7(-g!Cq?8&{^?Ci|!+{~TKenvtVK{H){PW<e*rx50PYWp4yZ4^=JJ>SUV zH}36ReX0<(TtL@SI8qn)SY=qc|Hi|x1{Qnlu93h8*qwLpITzzn<b4~9)djqSM1qlV z5`4#wE6v@h(-X%J474of4pNhGw8T3uoq)t;w6W|1I|^@P5lo4(Qsv)b`CNPPp)xph z*=lifNzbeP><2T+eU$KDII8W8ze(QXaj*fO!_ivjA^XPpdzO7;Tm^8bH|gjm{_HoG zV%WaX?Ekp)UIO<d6<d7Cf4Tno^L>D!1!mKkDF8Z(sF0|Uw>`G19!wsI_gs3g!->mW zwAHuv^u+jwKQ37vzV?k<_ZO;wf#L}=C9?h0tb@Saql8bjHrSk5RpO-M<jT)jglBnU z7WDY5J^$nMecMzE>YTm8S%i$p*JZU#Z<eln@?VYkh3&Nji9fjon^zT$I!qtGwOn?} zY%XPoo!si7<rYt`4*Ol4dS{;AQ?diwd;I0}0Q$Ana4e-OUSiuxW2{*@u`hjWuF`%f zd$B{C|1@n>^xrx#@;fZaBH5s=rzTNfzG_iF%6U%;Qw6BuF^;(azx2zn4~8|ajUsvK zIRn2GtM-4^b!uRWq}^?~YX-Dj2Kw^RfdE0q0E8C>)BHh$BkB)5G$2t$s1?Oq%q)lo z1p1$H(LPOGQLs2{NCq)rv)0{$jrr|~RoKv>A-nbmldAPGCxI>74OgvWt>E`ODz^r7 zihW2eHn!Z5HbS?yi2{V5MVb+_brX1D<d20J?)|W~?v})_m8{3{x*_-Dw=2y`)`rhs zj_dB@|Iqs14OEl!tv(?b+$8{kzzW3K@M=y2$4$dUrA~#g0ck)`NesHX-szxw=sW+o zopa(9IshFpQd*1Gf!g;`+0WZ9j%j?%4afi#cu>iRFrK+Qgz&j{J20RN3}L0F!zNOd z>YTD>5B6CD1A>7-HPKE?@xXS`QXi6n0XQ&V0NRz5r%ryE3~`osl(zO|Lx%sam&o(9 zcy#9THU=Q%t;19i`E=zWMGRqfxQ}1$$3Y48ahj}B?h3qrHkWS3FB8{<rQh-&4ag;T zEaAT$Rr^;`0bsD<N$BhYZrl9lb`23EOGkP#IYLaQxnV}cWLZNoah%Ku#Xphy!3jjw zNI)Q19>c)Jc@htP|G?-<mY);Ipp^{zxJ){M#U%8wFOsJFt9)7~S$X7sgyp}HrwfSR z@^QnYBBb_au)*8PycUUCcK+uR3uTBKHt|}b001ztaEt}a_)iTuno{Hi7qltIe}+2| z2m^phSV4rSbQ^JB4n;^DhTS>ZK>(z*Cyu<*>@cZxIjV6E+?pp4#VtDVDgxv@R!f8- z%p(iV(|ArBI_*e>8Qr`f{Wkim8EKqS!NHsr!!0lxZ1!vKQ`nm>fB>-kxD5V6^cg<V z5N~QwxRVRfoAh$vv-h`t=7oUR#bUXszA7pIH$Agm;sTp+e{_{J7{A-qC{l9>+}pRY z%yT07ektC0Lvfv)?AKkS-`5;Z9IkK_wfxV=xO?V!=3j6K`Fpkr%&-$=)Og>goSo#Q zDEPlWcU3zHpAOCT007kzu_ePNk<~i+r?>VR>RdlWQyscAGN3LAd0~|(Q1RWc=#)1D z0H7CZ&3ZW-&3a-khLz+yGn|h(*q3d(R$5wIntb0)j=sZA6{5Ed#8V~ylhC)eJnMYQ z)SPg9S%;X>7mwnqvC&&cTU2wI6tUCx+~t#GwRu6j0WVO%*RxP$02vwJl?ws^TtT6L z2(15~Z_Z1%h0s-#lsC^`j47-ovwa42a$_9$>kR<sL?AvbK{VC<^U@Xgvs02>hw|FG zL(wU=-Jw&Vi>f+Ty&Q$;Yk}Fo3RJnRtUZdu^RIX3?`~6Qvr+i3y2cqpQ`)U{-swQl z0au_HU5?!q*1dqAr;!(!Mvo*?WnVa=LlwWO1odl)Cn4ApS8SNY+Wp<hf>82v;^0b@ zobF5>2yg|>SWug8h8Xb7SK}0TLQbT2QT@ca5bOm5?~+Xj!q}D2{{&dCrr8RGPDDj+ zyAGx0JxUSin|pX(kL?QNkopMzreTy#cX|5Mz{qxrG7LWxpaM+RxOFQmz+z>|`{~Z< z>Ajp_ZEs^+xc?`8hYc7_$RK!f`#3}wCq;E;)ey}0KzUUgs{|LoVOYwYLsp4`ir+e6 zm1BnBKm~yxMxwi#!MKsEIMAr<LulWpJj&Py5pq^<=+k)ZrQugOerhMb;4s`_xum_` zV3*d$#Z`_qRj;K7gU5t1mD5MXLZvXB(Pn4oaMzoL@Bh_e2nokpW5CMavh8<>=SP~k zbh?%-%e9d~pj}cVx_@Ewac@f;*+RZcl!)KEF%sSUo~G1acu+9YE+L|$?y^9<8;LHE z_kTvO@pE60bgec$0t3;B_<vwTR(Nk+U9q~on*mwCf9kQ+`GQJuK~Td#y}j?Rx$H#F zV0+x6uLb7#D9ixSbAL81-WM9}t$n}pl~JXuMJeTyPxGc5o7+5DUZ_Qswbmfd<HGjs z?qObfhaCIE6qI3GiMmvW6Dni>L2K9CHvjr*L020eSDA(K4@16VwcYPI>Gea_Kw*bF z6RrI1kcQX=7RP_Zf8O<&b?UdmU?b)H)k7Mm-L>NLHs`nsp}rLPcyx;RDEm1-46j%t zkga~z{$g}x&JN{NGE1JptBCZYT+#N@Fu+qTd+d`iO<B3#S@(jwYm_OwiPtj7w!R#h zR0|l6E=qP?($??tdl%TJHEW|l-BP<dfb;uCV2g#O8c(+4Jx3TCg3*dyW&o^&@QMJU z#Lo<>`kHlL+rSscWbj87#p>Pns2wb(+Go#sUTfS=x5IAgG2QLtu;ZUjWM43-Zq%^j zqLa1s{D%EDM!m0?K2zU-`oj!SwL36k5ln&6L>z)71V;_UGf@`ogjpxHYK>&|+_MY1 zt_#H|bnme2Qa~+@1~x^)Cv}{%I5}3SOl8@Q>4UE`9l-~BzRGyYoim-#m+0-Q*QL>! zE0?Y(UtqJcxm4%w9Pwqn9Arw|^uut6!*q8=3hv05fk#ipKwwxT`emSa{-b7A<UmOt zQ4S~7VV$b5ft$QI{5I`6Mx)vB<aIfZ_iVo|=1t1>r{;Xv&e2e=N*>-sBrZo-P&YeW z?#I6pNd5(|f#|P1`t#*SgVOrjo{YAaT+0iJDLbEY-2O(?x##2D{{5>Z;@aD0fK}-5 z;!<~2lsM#TT6k0cJLQXqqJw1DxAsbJ-go;?*uZ%miejc0b$$+h+RZIbt#7b5s6szV zZF!n2es4=sH4TEni>qV3=3A4ZMafjNRJNwz%@Eln4t7c-IVwZhDd9Qe&4Gv{y6?MK zaa@Ke-12tp)FYZAgx{HLv~8YMMwcr}re^%*Qyu3>s~Q$Yud>dXZ&zI>cfPPq500K) zNjaSgzVkfGnY@3)x1trqX~^VhnOk8mK^L0y!~G#0YE2>39ZBQnG?Dixikyl_#FzH# zGpNdu*8&m@YkRMN6Qg?!R_FW0OHjHQJ+G*lYKO%-k|`0CW|Q5m87bk-)fsJWRYD__ zP$G>8<_t0TX1w-Kw0Bx*8Z4phKRzsujZ<|dFvtooPLJYU`2I5x=j-ccR(0e{65><^ z2QvQJ_~GGCTO91Lh~nXbhl8ujaN&(I=};NyBpl-uzxUUxPwSz<Fd!un!R=4!s9Tc` zKVDEl(wH0;66&HXRIIryHXT0d(xTz!wv^)JXIe7lq5kH;;UaaVe+W!jVn5K~!!8~f znRY!-WVoCAmi<;IaBlwr_NSN*KZeE*p3{c(<{=#%b+~JDXL-O95g%ew`q|MFXHsLk z7Xn#fGsFx@%2R=M#qdl43~9Dr#@~e;6UpE6(|!c@%E`1!qyrW;p>`Ax`$Cbh=~aQw ze7fWA7<%hzrZ4S`DZWO=8Bwl=Au#R2Z*={y^A^CtgK2MFTz~zsA|=C${i8*i5=m+! z4|;+<Go(OUW+OjJ2JH%QS~3Ujr_Xyx(znsm<CzN`kOrj<lT;_^9^CIT(05vW*{Osr zTV$?n%$sMQ9xeliP3zA>aIyvyrhlRq9Kq?zViqEK1KGx6=xc^R7H?8r$aHo#GVT&q z8rBO{`T4WaWKBbo5VxegN_wbBifcYEII(tD)R*g>++k<atGKVAmdn82Z8TA2cEZ(Q z#4@fHa_8*g)o#|BxpoB!g;BT!)NTufMIwskMXifu$1c&Dc(#pFs5^YRyC##|)Z8#x zF|b1mQ1&t6++EWK)9F6_D?0|imCp3mLn@;VyOf>b`3XH5+9rE<N%WJg(P_(_v+4ce z2R6KbuCs1tM0q(f<wF^OLkHgHjHX`2f!~`}OD%hRJ#Sp0@B`V}_PouVmmoAPVtM!= zT?ff|jxJt)8z&M!C7s?3rBa^x(S6d(Z--P3*ChNn3GXM4eh+gnl~md|-k*>c{~Zrx z@R3XXrDs4a-QU#uP2+}mL6z;-2S><``v(S2zoVsWYWd#{Ck`EHA(?_s>*^8s`b)_B zUVBD5=C7r1j|JFDU&`ilKm7(NObJFZ@reC^K(04`{948Dxs+X0@Kz32iCWX0;?NjW zl=?&!nrZzMLq^9XD6+~L2LodYQjv-DVZAlt?~tV-wcxjAS`36G&M5NMT>sZY?tgdl z5L7l?Ezy%oaUV`&gOLHH(zN)AvSgSH)k!|s;k(Y89j>uY8!NIHkvoO__CWCXMN6Ss zivxKS|J%`|XH_K~IN0c)g<Cdc!@@oGPGxnzzW)f-qBc#-;N#J(e$^V;FF_N^lPj$~ zr4BM~wGdP~7nQO5y7*eqg=?!8HsqkHOC9-V2^J+2nadO(t^bZAlV$SmUp3r+3;YbN zEaIyjg8tlru=vO~;7o^>DfOICJl#=CnarRcE%MtL5NmfHy#}=slF`K=<g`u3B`ZbX zd@Z8`8aufrGyKte3X587CoBvL+}N$6TQoR9Qad9VZ<J6vj+}fNoycC{6n#3Z>g!yW zrW<$7ti&6-gx0~oj9e2>0~LvUA9{k3!}NeHFpn~QY^SU_+I?(Fmb^Xl0rBzPZlvxN z)-x_Y9JW~036yUz%!t4C#3sL9Qb|*pPaa)yl%kpFk1TuN7sY=37n=lIZngmS-*QRH z=}1d`jX}WwIm{OO<(OB9!P}OM80qyrBp(h5NQooWh~V4NC%n~ww#=R*hw$OHPL;_{ zEaWa8%c($E4>~C<+V#)=JwOUh4E1{oD}LV*>C8v?CpoVH;q3qmK?d@?23{KiP+r2F zahr7Hu$uJ<3QzygGxy2gRZJ|WdwN^KO?Nz79W~pB82zNHb0d>&c=63|B8OE`g@Wa| z1_SsHlJP^tuPU?JNcgpP^~uMD9&`IzeZ^z#S%=B;{B01gHveS!dZnP)zklK3I~7#I zv_sf3$EIik>s%$q>WC6=1q1{wiNR6YtN)xf1=#;JBNt4}zd>r`zawvsb@)kT<1@)t z=-$dxy_c}TTjdI0vD~0kYY?~)h%?rRO(W7p(EiV0ql<b_8AJi(DLy1YM`JSDvbP9i z$32fx!SxFdd*BtmBBy&}a}iHXk2gkw=|ygULnjKnUck?P6t>|}-0(9%>N3W~>`0JP zf;4gEi^p)dB<^j)hD&t)&B-&~Y$l;j_W%rbg~8grO_7OoxBVhwW@MgJDO6G$4Z|M@ z5?LkTWMJbq7U5Jn+Cm3b^-ECqX4QR+F->n|R5}zW$iY&1T^oNSMsYf++Wc{Bx8zFR z9?p=&xtI?xTa}&h${6ESr)TL9V%e|ghfe_(c#9L#pEQLZuad)q-Jjy9cmEtTrQi?z zdN))ihYJT{l|I5_yX{KBIZZh=e16+-z0v16+XBOkEL|Pl=yqnjrK`pg8X)J&X*U?S z_{V}VJ`xM7x8k_G@?Ib-Y5g!D!@O&&((@c8mOCFt1P8n)#>jC@JgdWj3>tC_?041S z4_Lgv{=^vA!%D+LhnW9{@l-DI^j3mu!OS+d3?C#(H(}UwH{J#(;4$WynaA_XAmQtG zCEr@Tvye|w<VmXjMsZZu-|m_o?DVTr*Zh@=Y>B%E#>J_64ZB1FJJN4J6yMls9up(* zF@eq)%6jo(_8D^4cj?)Y3j`B?&=NMd*_I)!s?O6we=AxoIJw$VM-1om#*QnEDtEng zNG~|<3P>?bG>7nML|3tgZIJnssxKC_*?4i>m`=Au3%XwDOFCh$qsQ>#y#_&wZ#NxG z<@pdjlnMSI*@Bjf!lYn#lOXeS&-jiSv`AevAXC3{9pnl<492d|C-<)k{j@N*+>vXD zpES35B=Q0)5r*Wv+-zlebUt8l_pb=iSs1?q*2E&S{v#Cs6EK)Gnta}x8G+mLS)}3( zl?i={qMzz*p_#~feLN(JMYFLdC|R))j?^;i|0hZy#=t60`sI*)2Fo!}9LTsh`Qiw4 zzTv{GV72%Swtc9x(ON__Kr6rp5n^L^bIe_-j)Qa~;nuWjDQN!lV{rH{;yEP@$}Rui z8}Gv{2EisXQmr$qFYJ>Zekeo5Y$9N6XyAJIKh>NB9H`%g`xT{eRDYnIrxZ7pc@O`% zC-Rz?ebQ+mapaEyOQ>SE;ZLAr$D#i8<IY$BI@x2f^56QSO8a)<htyi#z_W5QAabC# zz>rl?t={uEC7;_~gme%TJbXP!=~K`39rMxk@kxW-`!ojSe#U1PFXO9RyrZdBhx+(8 zO1D}j;ClkuqW3=UPx;TTs6&`3$2Fm@&Q}>Hmc$ehE&pzGFZ3k1FD;c=hgC8NX*TN_ zg?dIqixa-x7C&X1Hh-90_4I=mc+P&61^cYZJtmmodjo3;VvNO@5~%VrsCe0GhNW0_ zx~W5>VF6pan6vOJ;!E3X4?Uds3q=ZEU%X;2_*X{qLFLpGK9QxP*9}dh|AzbK&TSnC zgs5n*#`JrmVOHIPGHqtrZzUjWU%Ln4MVYz<$iUa*_4O<l2sR1DP5ECQMX%8vheguG zW*VRpuC2|i_<=!oA+Wfa(65LlCGfUFlgu>+dyV1$injhXei*uvVlg_pFbxhsToS+U zAlb@5rc3!S`GAs)K_2%xP$VtWg^e&G!VGgtb@jXL^5<#pap~Tk`bL}sr?m;~D{fy@ zs)gJ?vwyTEM^9(Ws(6mfbTy0D%%9MYxZLO#uQlv%*X!r&QzV&?{Tv~LqajfN6^~qw z?wkwLAw}8)23<+*4CyRsFYy0Hd9X=Zzcpw(T2LBkJLlmJ;v7u6jqmJOF36<eNqX0- zySXzF2&4rwi9D26+*>amT)TG&meRUiRbCSQ4x!L%)wE;_N%q!;h4jx$=LBM^)oXdy zHvJ&!er;8&ggYY?SaK0x&=BpDMjc9|u{YvMRZ2Jb+^)*#usl7$?fhz&kry9nic-K# z;8krrUOJn3Xnq~*AGb?QTYkvU<SZCk8WdyfmUUg1aq1g0H5Q#L7)l!96MX`6hD&|Y z)$KV^{Igr#)5=d&Z{A=<EZ|!QO8IqdKPP5%mVz_3NWngd$re5C5H@ajd|0<DuDz}^ z$zZfW^qt@^=Hvu!4=3{N7oRfhQewntdL8A1*$q7phA5Pt6t6ED#e9GU82$$e!hpky zizCL015<^-A@ib1Lq%PryNpq^WoJQPWDk<AKIBZ<dvYYKbFa+<!RDl1OReoSA^BCS z|Ly<$Kinj+2;~1dUh9+wIROANw63mBYas`$j^cmHu=%c7m=i4-6(-~q97F~GzXPBD zpU%<v7jcO+a3s7rC^-VZ;gWKspjoGZeks5%XLJKhxKymH=T~mvq#3HpK*ba+reFqg zocCx(T=*X-5EzS5q(KM}oM*s$w21HE3n`htz0hf;$qrZTgD=k2?z=HXHn;D34?f*i zK5IV;oSh^a9Q?ly&XFmO&X}#4&EM|SuXG!kwE+ZzP{2#XP?PYZ#S>AH!$$KU$IIi4 z*j(F<&5=vOj#AWIOs^c%(F0Knm)})tHo9-MY;|u>$}DQ;#!5UD5Y@sBxaebd6hruq z58LCcuG!a^x6a~7?kV+GF9%#a*C3(rtMlz`;QVW@{!-q2Sfyu`WA_*gzAV?z==XhH z=h^YRqm<>7*p{uWA%0Dgju#B<PC7X;HG@4Tj<!HLJEk##CMR-zG@XNlukV^yd!d(X z9?bprs&+I2#qhhDz+*byc!?xs;WnRW<ZB2Qn=Iyk7N1YBS1ZXfAXHA{7eq4vuNQ)I zpH8hRix=u7*B4J%(p!5qbM=2IBtJ{`w|72U=WmQsvWu7Rp}^Bd80>*npFev)O=O?E z`k4<1Q+K4$H)y^iH<DaCRAT<rEcN~1vjKI?@66faO0R~?2e}-{uA$KztC?3mqIe7l z1j7EQi_+-4WP3*1=^mwGyEJP~P2%F@;$qiMyT39N860?fFW7W7d>;6*RK3k)C-!8Z z^J~DAx5;|XGXuE2+CTB~Z&l*~U!y?L%&<qc`ATvmWiIb0PIrf44uaRB_uI|q^qHgH z<_@e@r|gqx+m?wLr@w{B%U(}|>ihz>YS&BhQ0MF*;JM9=G}v<xY?Y6I$wdoMv}~`Q z$nh79>`p|RI!8)Pi)fQA#8diVa-E3KNC{o3bKTx9H`!93Lu8W3wwPyWriG@1Ea*@7 z57;&?B2h`E|L{Z7cyjf~s?k(JJv(GFB;yo*c;@4X3~?HUr|!z+2<fOZ>pq6xcXv?A zqHaDsC3_nd#EKGb2G9Cur(8CyLzO{Xxt@gW*D!#-a~v!l^nEoUH_jY8WX=cV6^uNz zEBo2pLD_FIYmQ>z$&Lklt$^`G?kU~<rujE^o*$)@EAd@U6U{TYP2#K5cpBOnxR23c zqU(#q$`iqd6v4lz03dSRHDE6ov572?aBbeuk;FXX821A7FoG2~p4>6Anzup2*xZJi zgU+Q!0HRd-N}pE0^jExcbLV)pPo$snfRfAt8;KznERGgSoK+${+8#J3JwSg8gRP1c zVZ9#tPf~Pp07a}u6M}(q{p|?Y1~Q<!<~FTegqoOA>bL4k<{*lT(Q**`C-rS5MD`fC zGjP$4vRS!s6__}M2DDp^J1+>}z^oBHAwu`ZoM0Gtk$?g%^xaB6?JLT;c}rK*0hjd- zzK@~ToB>h2a0G~KO6t}dTO1mqTNTeLi*sS!DYGuHhJVr^;7(h`3#>hUSXcc_?f1#} zl4NOZCc@DrQzoCSYUa0;LwU3PmD{I@1KF7DM|HQ@#SjUed+I%Iz8j!l?`%q#K>KGo z-22u#Ijix{ojWi&-EHH_FLbtK6K6uBZeq|s>E;~KJao02MtQ+ZhQB`ksIvbqeB(tx zG@!R-%U_x0b$sR6@=))z@!<63@7aS0gdLBdPdnZF%-<u}xAK>*`Rh*&myBNtgwlOd z3~L^u+qEey!pVt?2zWy}3LuY9!^9LF0dkf+G7xrr&2cVZcQmS@Zz9{ZdR|8ZDlpfs zPMqQ_+6eUUi$%Y|eq=(xx2GSD4t=5fQNu^^Uug?+V9Dy&^I?TUEhkS6A1jm;(MFlb za9C`A3Xjh8f;MA{0+URVKHuaZpJH&8#xDg_)7rf=jq?7ar1-|u`e=zy15oIYnPA)1 z-{W3XRh6a2pCZw{JD(Xpr>ymduqDrBugrO>D6$=O4u$B9ywjz~hp&Gx!}`WzE&FW_ z!_O0nPWyy}<khYZrj>sR*E|YN$5v|CMRs2VwBFc57@|l@WEBTXePlrm(Qs9O9;b~F zSp9J9+vBr}P};U%bu;nRCQl)blZI}zl^3uBwW-w<*54)RXk-%#e@%gM56h;&mcBz- zT^8XzxxF?j+samKP)adOD9HR&<WeF^3%y;h4T_0zd6h)q;}bN5?-D7Ef`u-(4`R1J zgUXq#gFDKZmbt5ZgV8Qo>WrBURShyXJ__&d=uD5u4cy&t)<xFF1oGx_%BwDuO(Zwp z-gB5yP@)()M<NW(;NOr4vVB?6k?4|em0OSfYUeEJpqvOG{I#mi;&<{ufE9%H#*-3s z+sHWNJ84-TL~|pf@C*)VOFWpS9V@p2anU;Ge6G2++_OdRrptJ<QlLvA0w$(WQX8Q( zqI9~F(;JMif1SRAs2H~{4RsiPWO9KPB5JTzasd0uWeW_~c2Z!<T(T;Nr4VJA)7D-W znL<Xt)xzFTv|j4wMHvl2{SQJk4pCDj?aM7;+<`{Sg(72MGl332<4nUVZjFaBVEyg^ zuY2W%fyWQYv!+RB(Fq$uK;3mOX8jYc6<Ub8TnY?HZTTN2qTH0#57`+ULlJVcfhLo# zs}UVzWHBA{`fL=Vi0z|0<%m@*Wof)jZYCiF(;hMXNEw!$@53^fak`fu@avrK(N4H2 z$T*aNuLWZyK$X5&Gz<}Ppavc8=n8mQQ8Wlmj9Rv^YiOEvtft%RNOOX(i2IDQSC1wz zjluQI3rg@}avvpz-2^;D5y#7c{3IdFe`Oru4KU^+$h(pWGV6Y-Kr@o&S_JoHXI9!( zg~xsVCTStz;qtQdCg-(^*K!JxeVLn{rtD_LXXX(ZYdm$iFMk)VJOJ)Y8vm-sEQRGl zV5{sZyDX>dXH3b~1(ZPN3pFq@B|NA=eGm}{k3zD4Db9_SN*7(j{=-9e%_WGf=G2{d zZi#GnWVKaDr<NizMcyZnX!8}^GgX_$G<t^eslpm$B@`Z4+;cvSz*>~?8Dzq;e?_>K z8HC~{62Qxeqq`s8QzhJIccA<U;K3@5%vc0Ln;pignOvY}hl$dPEf$Q{r8-?raskVz z?Q^VtkjY>Hb;{j&`VqS|{jtE{#XIfX01$khOp9r+a=0i~zi!!iaGx1`Zf0*9x=Hm| z`(N2=UEhah;3dP$*)}pw9znCno3Rz#UR)2+78XsTD3AAkGWyd|ED!xnvk*9x;^k!~ zLWg~Lj~=3BK+$Rlw=y`_ODe(UUX`dWXyIFpEX_n8E&X{j{wo4@ocT{io#fdrC?beL z!uc)YCQX$G4cHhFw!{C3TurIfOr1AOHZZcvuj$G@xQ*b!C=r=&ss!c)nyE-8E_aZn zTD*xw7X@6YMr4DR26HJDlg$raTdAdmK=_*_Ufv^HoiXb)k%v_utPolFIv@`*-4pAr z6d0x#vjWGjrnYLCk?D|QER~_d&;Zcq+r#@ex+?HaHVI%(f<EPCV#>PL6-xmgqy8+x zKglo)*wg!PaiHJ#AIm6}y1$d;>ITt)Jh|hMZaI7ObS*)+zmlP>Vl!PE@l>i*dB>Q4 ziy6O+<8>yB8&*3jy%`-%!mlKCUQz9Bm}1KIDUx=aC7O9*1QbZU%&K01qWT}N7IRUE zkGOR?U*(``gCCHs{!{%BF&2p<LT~w>8H8(R3ZvbZa_K#}HUx26R0JBVDPHq|>h~~! zvn)7C4BEzGbj;`Oup|^Ow3Pu{O;9MZkED$@17$dh43Bi<0DX&p1&*sJBaDE3SToVZ zsLRRxEAc>eBJ#=8{GFRBq?)ZR%NXD&^_GhucMv<YG%-vjlDY`pNV<UvIZcN!jye(! zXpVu*w3PS-jl60)ITTa*UDs0BpK9mQ?jD<I9AGo`hIscFM2Q_6qBZHnOq6jb4`l>4 zl<X?tBcQxLe@7G|OVyMs8xOMxbTX%v8vi}lf-&pL$y#B5xWo@6AVXbniyxr{NqnMt z(`$llmytD8wFVAY_!rytk6`#G{=vBRX^nDQ=yMAG)<pi1NNeV`FIOYDD5dRMO3;j) z1Nh_FR9)0GC^Q}BaUhR-521_jL!wjO6#UQXq&H9zN+h8_MVjgY3r8%+4r~nx3B=GL zeEp5B=RuZl3=i`Bl}kbS{KoLxpnZxJbZ^d*K9}aK3o)wp{0j-OkjZCg4;(VslgApg z6_IM!hu_k%QyB1ICAXj|1Bug};jI<`Q||xOq9KDEjTq_26M;0_3Q9Ol3}heiMUlTt z29T?(vJ-{Kg-}H`5Gl6MzN!2_%O`1H++hA8JL1-UK&<?2Jeal(bLvyrJw8@wz<&!| z6`WOS8AV1$B4%bThU!~CwR59)nsSlEaSZ31<x+kp9S!qf!y#guYbbx{GCH<EBRbB3 z&DB+Gw&2!Jt($;MhEzZ7i$d*6`LSxMa5svKh*m;{(caUsT7Ab%Lhq$U4m^1>bd*bg z*+In2O{3m(mSHU~bWO7ob~%I*(<*sT=K;x3OE}_z7XN7l+}D6-c(C(si#A4fPW1F0 zrCoXIc^<#vfV$nK^~=LbLR$m^I9-m>u1|Tf{A2aU2=n78%nTG$oZM?{k8yMx8AGa} zP81nlUF(&SUW?kifJrmb5qYRjqpY>-%()kN0y7*u3NqEbGUQEANuR0W&5vT^m@Zo> z$j15+oXf}BQ6KIqFmN=a!B((me&=jdB?xfb2+alyx|bNHV!>LO5on~Yma#=YBTZ^V z|N8I*wI&r=4*V#@1TQ&9N<!`^NwWQ$2kU*^%2Z%n5%@N>*4Yc`2pQqO`F_NQZxciq zF6Oz{GR#|RD+c~JUEb`r*O<IL*PmloaWQ}VepcMRFNS^XA?BU3ne~8#!Avo#9@H5@ zlP&h+Fr@*=5QMJ1{vyc$`UqycJffoHcQnIio~}rj-ox~lbn>nON2S3#(I8sgCtESI zhnboWU^8mWa<#E?cYKB;VG8?VsT4*Jg+7Fk29R@+1g5z%Xqy9i%Rk9AT-zr<Z6Xp; zX3tJk>VMUaf81v|M8&ycO(o&H{Wg*gcrqezyH}@D$X(C-;d4$)Pc^^d-i&ipZ@+dr zfb_LyFD5y`=WkpqF8|&}6?Sq~kMz)J`TetXsO2fsJQ(cpTsPPExAvJdHb2FugHCs8 z!~AmzWsy2ez%-2`B;{n9RHFB@We57j*|&u+kIehw1Hs0g?$|7831hve&6NdxDOM~I z!MpOTcR{iPRlmeDGy)VYkIX!y8~<Ggn@bloFOgv+m$^5W3!!mX6Zl{e?b}hrpN?Sv z{E<@ii7fZf9nfpThseev+K=;}2CsO+ED_G<H!PWbZ<KhoDGTe?1YF&7aPGYZV{3gI zu$2a~@6E+lJrOkzA(3*!u7rHPh1{3J{Y$@3JgF!Dc&wkGHp2s!o-%@J$4wtQtL7TO zg>5^PGul;$D1%NWEA7iX!;Oyab5!3_Es-O?Q_HNC!K|j8WjjYZMLJ3tlGYpksR*%r z6k2~n_*03uwb$-Ei(oO0%-tDXGDgMH|7rWXA9I4XOD7{6tS;HbrGTP4D)P)uPY@#O zlo2M!)%`5@*J7Ek<W+~r>U+>`FDo7qxaZB~LqF0`-S|4QKCX}X+VkZb$CsIIvg2c9 z&kXQ+K=OlieDvTm4J!iIvcN75(LyWQ!1oMqWCugi6h}@58Xi5H&y9|IJv9+ax9DuD zO^)_~6s#}u?DcC7uU<NfsTuA5xACo~uYWNA8Gm!-;CYEE)vD-_Am2bVG-NdWn#$6U z5xbx)hl_I=dZP68*g2lJ+SmOXd!|)Y$6XwTgr(LndxCnOY`wju7}C@bs~#vg!@Zk< zk;XM%B<sz2VkR`h$S($XQ&4ZyBd{&_Mm{01wqI`GY+&Od@cI!R3ezr*5DB->FbIkx zFcG-@ehr8HJym9yHMoz==C2naLn;8YfPZ2I3q-%g@l=4#+)y%=_af-hR3Ahp$PPdv zqR3Rl!_BrvKOYU=`O|Quqb+NX-IV1320S}$zD3nHij`BtF7A9Y%7)~;J4*RL_^pfl zP>YNs(=UZ=S#a;?nN1ddT$A(9&eB<3yrQ_)z1WG0XiCguqb%tC3S49Vzk@?hORaTF zX$7nTJRJ3uNTMav@*HfYM94M-eH{Wu?~zBuhLI8?d}%+>VbUZm{mthL>r<4L{LYla zSqs*X+mEDnW5J4jd0n4nA$e^d<Kp3%x%O@m+*@^hdA)u;ZFW5!e&xzXR=87&_qL8Q zUnyQW^VOR$b=#Vc@Sn6f{~26?9F5^6Z$@$|HzDzKT}LRpv7;|rb`e3B`90^4`qpYA z$5oLB1Lf`YIJ)ROBL0^hvC__w4;lG?4-zX}ISFSz+#Jc2m&@h)blk-ty8Vzc>D^^{ zAY3LX_xU*cXQAg4dLo>Gx9T37!!#8y4_C&KyA~-w7u*51<x7f14f7_*ETu{8iqn6W z!&+m2SHgskS2TT{4t@!!l~O~>7OzmxRFNJSrj+SN8%b~SQC7}y{0~)Xg{wSr(>Y{b z*W*K3J89^rg4?DAE_jgYc_O@7cq$`(@p;i)v-xxyzAAK=jGFcuLmkDrsEedsaBj0q zxzh7&?P6~4`JY3Kr0pGz<9%wJBBn;Ua!Ww+rgDC?kjM#74TRTROMI)<B-x6`i)O+; zrb0UvB_#B$<K~NJQXp{+foL~filHKdTHo*1?mGN>S`G}JLGc@8{ChY5LTqplMR%-0 zh*2*khPnt8X)@D0CTJ6PTQLBZ#Ykv^EW46^48^#gyKm$f^tKI|sNqE<s^f;Lz>TyQ zEdpLDQUbAv%Cd8A140L$C3{TV;Kq}aYLq7R(R@FSeJJ)`jLSBlbGxxBsf+xnC{E~9 zDsNa68iJ7{2qm!8g{dW$PRp%K;D-EEf{Od_b$!d1V*If64JK+N*`<nQIvB20YFY+y z(&$iTpx2XkGa6E_B}2nW9Kk=87?dFxz}t~K!PE4g_>66%jp9~I^c}#Id<{+_9kRKm zaw%e1FN-fVtn`aB*rjL<(8izSPea&gjOIv~R9`T1o`h^NN{#x9K*iexhcuY(Kb;sD zpvio{MheS&;s@eg@3VNSvIZU3a4k=j28Dq2M`Qj(7ogx5d;EBT(pUPV%0s_I72|+| z41f&f(q#mts&q^~w)_y+$QhkL8Z*jA>@52zu-=D-a{wasXNwG2mDg>ufb$Pq>rj~L zTpAA6@8vfvj_8C4EbuC~1XkQy;667JlFsL-1H1QP4}84=_yh^)pq^z(X=ut=@5g|; zDD0YZqpl#@#J%6-Wb$S@{>nztgBU>auBMNq#h~x7zskFaz>CN!Dg)H4h^<pGc9O8Q z0gC{b(=SXc<y0yuke@(4hcpy=-gjdrhE%sFgr|346$vB59EXvB+!`pzau8Cy&Q7O< zL$?*1ws~LpF;QH8v0=sas#+xJd5EdFczwIsNv%^>P1vi$+9ft7FR(Qf#lUt_-ilL7 z-Np*cWI9-nfh1S>5Z}>)m=hR`ikUsAGnHT_yhuoveJPZQ>;$YfI?F#ppU_>`b4lQ( zt>d~&?3Vv>@VPkZoT$aVo2D%CnW(&*h3Sb>8Z-%tA?VdjH~aW^CpWzwvs#zY{aFT_ z`%14$?2c2ZcY0avRF0>`eO-71E#4?PuksU}8D}lEP>gZE_1xzs^iwk&JcYpu{MmT0 z!bC7Bd~U1bF363<?!))fYf3oxpimWLP_<ztrU&VU3P`bh21&V@vlh*YUzXHRJT_Wu zYT`i*xfntVs_mme3&IeA+U*%}4P1mL^zp8^F&ocqMJ^ocZpAg~|7Q3zN4$fN;-FJ` z-}r_P0LadUxl=A4f|CTxVJnGZ=n56JRo*{hIHF^e<B`!&5ZvPq0t166BIbG5e%P`+ zgv!cEAS=wBlja7Zv8R~(m=moZ2*_*I<HQDQ^4hY{m}NJd{gn9=%ZY2+l10gReJFiD zIfxR0@>ucYwHziE0V{ajZoVHaMf>T?XBUdWJoELSCLIG5AuFc);@7m*=er<#tvKo) z2Q#eTPJA)OX~PVJlO)f7DjXC7)`nba2_=17{sxn5GeOz0M3P?q+&=gxQZqFnRjA-O zVY)H!{S!TJgg+u@+rdmtBC^%GDf6_FLSSWx@Y9&ljyAe&8K>ZFgrAwoR#1eNkk@!h z%1FY3eTZny=aa{9Zcg&ZOLX{!aEpnRSY#c`gU2HL><HEy>g2h{?dX?La<R)4;hS=H z8*_p0yeMX`CJtl3blqqkGHQ>UJK^qVh(j7!XBd1vu|~MHm}kPfg9L1Ut4{x(O>-v` z1LONJ#a(V}tpb!aVnBqx1w9k9W|We2`d`3X%G+8o_k@(A-ohJ9*0<X;$8qJi@=%P# z4KXs18jjh4w!vhTEQ<K~j~x+LCFORvx}Ka~AB{}-7Tg{CrwzWu6#69AtEbfaaVVEn zity;y)8iMn#MXD)p<3Dx2300@{9NMyDW!39Y-#sN-w{}K3-r~K^loSp4@qnNxH~}X zp&L<%zl2sv>u9XqZfcBWMvV=b?0`4E>7oaHM0X@qJK>J#riLS+%)wozB*UPn5wH9B z&ybE9KlGXq5+{SlNYAF}{r3di0rC`$UHk@PJ@;afPfIVnL89|EW4tX3sncB>uMjre z^rw>_<PtKHku#S$s(3#C6DdRa+v#}mOggHOBJcUlHfG#AhVqN0n<pgn;F<1ZelA%t zt6c>qvex;JDSZ6npwJcn_fYDvM)R446}j#W=WUjP_iTHP2F=g>hK-b1Idmz{Cx;K% ztaRH9?kr4p6t#w<!dC7!bgpFHmZjOW;v433{h-ysYhV@#!|xtZ$$VS$1^E(O9I!xH zHjQWp8E6D|q*3j!Y$@f)aJydLa*mSUA2P9~{N#uDTsO3;|6$zBb(-($V>rtMZs20` ziZ-ETo8qZo$2Q9Z!p6>kq=9^j*pJIt9?T5J81lV$6IeCv%bTEC7G`eT?y8(5WF*Gt zX}ONHmV?bNSinru$je$CtEPwz*iUS>=etIGkS>1)2C)AJQiV;6s&V8*@WGa@wv7e9 z!S0iqAg+6@Lg$+&6PH;)CvU+%*nZ!NHF6G<CwM^5NAiRUkg-$su$T@%iIcmEmr$sM zm<<UCrpd7nRIm%v{aA3H6f%rCbFi0^qJIo{JZm^xx2<aL_&Kp|d-he!@o%#dCU>#| zor3w`Yp{z0kA2ws0rArQYQ)z<^vq6Tenvept$wC2xTo-Sfajz(&iLb|VYu97fHESB z%8kH8K-fPQ2q575fo8~udq4*~Y=5(q%c!UwgF_YsDZVEr`(mIAD9_V*D-RVI2>hP) z;4w%zyL5DTuUXVdug4!&LvJT)U7XxbkhGmyp+>dmqnZ9s;=bK96b_Oo;e>?s#XTf} z;eTkJ5dh-?ZKrRi{MLFFVL2ZB{c#Fu_t+4&<9#@?)0ZJtGBC_fq!A-}^uP|VWXAU4 zI%c)Wl?;%qwy;l`>snx6GuYkmRx$<7PSncJ+_n0XH>b(eg`4#&3ZVFv6)<D)-Qqx0 zS!_61+HJ^N6Oh#1ZVs+KdE2D=0T$&bpa7Z*7O2rv2C(yz1>`vaRF$KH3j^f=VUA*N zd3468tVpntvW0V}>R`a<$KPabro}bBb^w6b8!>}7V#^_tW7z~FjHaa^GR>8G$VpG< zzB0u!c_Zpb9f%C!onX5<0p3{~;FtshO5GF(FXoE^#b;aZp9LtxkAHyCd22OMuZ$5d zG#Ufc6&nV!u{IfizlZd9h{1Zk9K^7h<T@+>^pvPB`se5J25dl>y)Fqq6CiVw8byhU zz6U~$XJQTLY5EDub4d~K8o0U&3uWKxiP_K1E1Uyt%h8}G1CkV~IRWY-KMmk6v39a+ zx!zT2-&U*Q1A^bgXKtMtBr+ozQ>C8L-+)A9gDrZ+z~8BE^5yg-&c=LIWe@`~PjV}< zz=Z&@@@IX?c5xU8dN(f**#8qX-uYFLu`u7#uS8ML-*MC*59aN7D}yD8R#N2w2t$^G zhvHm20wBPHh>PY!_aE++@6n(;>b6_NZ~~M&sXsn(zonvJ8>=k^%?Q{+C*D_umPqH$ zv;*H&-wk4b$;|(JRn_@sLZ|g$xGy#=he^WEDd4da1^6CF%Sbf?-w9M2Q*$5JrG3Bp zLyHbj_Wlz^pg9?j2@>=aVHUm=kcW~%4@f8fgT_NH_O>={6fVrdQGr`mRk+kE_3iq* z6wX+;?~TPYiaC=>Y~<u`s---TY3t6>?;KzW%&Yuv_yB^Gd{yn0Y<+Xf*mNZz*W-wP zoL)F#h}8lGCE##VW^k=Z3j_;xxlB6$$BL-vj1O?`vrGabrEafE%45OWj^UF^;ofHP z2~g`)5{ZJ4=Tgqad@pMJ-Vvsm%)PKTl!DgUZ6Ut&o|~N0aOxl8nZT>uyALv^QESQ; zd1mkXh2N%d-xGjy)+LT+pZgpg`4!D1S|>z=z8Q-evXPpG3%JqqG`q`vvsNWO2hB~- z{x&(*F{=m9!!*Y{V?duPffYpnvOx`IAwXOb%^(^D-l!(e0T*S*r!B2wN9R&XLk$Rd zx7}D@Yy|jNsv9UNhW~}TLSJ2DC2!KE?H=_vp7HFPYSi7boVx=#U5FAFh}=E=T;5H_ zA^rs#x}iBVwUVRN-6*Yj9P8iu>Td?i%%J&C)Re3qgfTFt)=YNwKFSu6IkT2F#SeTf zfg>Z|8vRtrVvnET#p4SA@OfPJlMpy~9Dj&9{~@i^_SLm{@*Q33xY2L~_wJJ&2TC|| zTK#GmaHKZL>0~jDF|{!)3XJL{DmCHGpSejchNJ!mMpFNA7Gdl6`I(28;#a(zqQM}c zWO;QRuOT>GYvS7m)9@^L9|n%xuF0OVIaW%F+d)EWA~fNaF}6XgV5G-Z?)*2^#|9CG zRQ=_tpvct^Wv+G2(BO|T?9q$6LT&!I@$Rho66?MGTjW3e`i;$#H#SiRHyWJ~zrXFt zy@f=x`aP)=)8$hYhB8b`aAq~|<X$ZZ%IqU<lHUnjT9ov`f!8o<TE$m+{$imj5odMJ zckARy?(fzAeyeKG?m^#=cGXYh(>*8E7>k%==hJGJKXu-nPbaMxB|(L}kOlg-7hCnW zE$=?nsuS*n;q*JER#|3mhr+faUADQCC=+}zsj3LqpwWhR)x^eGL}A}R?>}cP+FSx$ zIA!l3p-;iGA?7PmxcC|~NueS$8W-46xxs2>&L)PgQonMl=+I`kq3J)99=@izs|P&` zW<oNQZcZ)W)7Wjz>0Bm|71^*B(j(DNWixxZV40aS!e1$Gs)JKGBT4c?pWxOHx!@$b z0|pAX1Q5546Ks>i`n|n5+9^qOvon`&F}Z4N`Os?9Zf?~GeDw~N{KwVgjRbd2%l8+S zFRg~)^pDy<#u(UkQ4$EK9Nx6LU!NbZg=8pvGN_D#XaAJ{=Yl)NzF{zi`9p(d@F;k5 zJW8L=()CMyr&}8*<IAVDxlmC8j3IlZu=n&uTYXWxr74R}Ga4&6^NP()zwXPp?vgfq zf0Uz?)8m_plkFp8Ox9c3tYz`C|5A@_HBgEvt=Wd{@8QgPx7ubiUNlzZ3K+F1ea&U7 z;-l7`Z4aOV#c?A*SCx4pvxda#DUQ!pf~EvULTI<h{S2n7;{A<oF-}Sx?3mH@D>|+Y z7XVN7uR#ud>%N^w=c~sbJ1@5W@l=YXtSG3B$9xgf4UfMS_{D0OIQr4>!)6DBM*{gz z<x8^AKsfaP>t*87Af~1iDaGyA?rq}F2f1|b=L$!6cFibN2FM7)cErECz%}NnzM<Ep zH%krra+AI|J@gQNSS$Nvu5j0QxYlCrNnxP0{%oD6v;?abwLT0#=0X3cIH0AiogC{Y z0@K(Hm!D0x0Qt>y4z9nZzET&->rTd@==Dz&C%>egovhU&gH#~kDbyc<KjBf&p==Pw z{txo<>Z}cL*l?7#wLmpC*4p65RK_O+T#WT2<3xg`0LH5$3zdF63<#FEvrdEKv*kQM z=HV;OQbTB~r^FCM<@E+naO~0B0fvV8Z_*+5vhMnI#eL@!IIgsvxDbwbQ6fNnbk=n- k`t#1tGSUAT%E9IUgjT-&-PggP^xp*;2}SX0QKN7F2XZaDp8x;= literal 0 HcmV?d00001 diff --git a/SpeechT5/results/st.png b/SpeechT5/results/st.png new file mode 100644 index 0000000000000000000000000000000000000000..711add5776a52b7691db5ac14fabb4453660c07e GIT binary patch literal 32396 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 E0Mdq#i2wiq literal 0 HcmV?d00001 diff --git a/SpeechT5/results/tts.png b/SpeechT5/results/tts.png new file mode 100644 index 0000000000000000000000000000000000000000..6d06326844de2c57437ad5a27467f68fb5d28c12 GIT binary patch literal 17954 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 WV0E33g=+=?0000<MNUMnLSTaFJ@%IX literal 0 HcmV?d00001 diff --git a/SpeechT5/results/vc.png b/SpeechT5/results/vc.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9753efe328ef00c7239533f39865680d2d2f34 GIT binary patch literal 37419 zcma&Nbx>SU6E8TpTX1)GcXtc!5Oi>YyM`da0}Sr&E`gxI8QdL$y9bw9zHi^w?!Nb` zcKeSzRp<0QEx+!*-F4?isehJ7LncB7003x;3No4i06Z7~fI32i`B+&ZRZ<54U;yeW z+OiM`<YNT^5D5UFLm-a;0JZY(e~|TvIS2$QX&nOqkOTl8KX`;wA&?8m`y4bt0Rs7V z6vv*;4}di5`EI`VTfzaL2p~@luMo)2+sAoFM-YfR0167gat(nXKqW!m#-R190e0OV z`vBI6k{1Xu6aaFR)BbV8`7bC$BZ};;qqt0H61VmB4aizA0L2mVwx-{Aw-QJ$4+l6& z6P1RF04No_w42cYph~VFcZISO&e$zl0GqJ~C`?7jbtUAv2O3HcD(TV}8<5Nbb^Z>C zKY8bd0wBQ`GJk@D3Lanm(CcABg&L(?2GI8gVFo}0ght;d{2(K);nXnU+i!-ja8`s+ zkf#He#TRHC4iPexx8o6b-$BsIqYVszz2wN=&UX3V8$DDc424<s=7SV8x;ZQE*v-3S z!NyCU^HGWZ)(>_O5yAKCr7tqfZ|l{`lV`Fmr*%&dK=>?V@w<SUb-Rbq_!|U3<&Q`u zn0fvlC5!~HXhno=IBfPJg`tR7B?Gwj+1l1!4y6cIpF?gApv1mI*3%Lb6BR7JMcI9J zM+zmEGR6f&bX>f{3x3^di+dgZwLeiu!z;z&*;K1b!1A^Dr<cX!bk=Zjq>*eYDw6_2 z+yWAHTd!$cfS&l2AG;ziP5ZC5=k4YBOiRD@mzCZ;eOeGAr)fz4`R#J2Clk!T;d95z z1$F3<w-}Dyz(qcgi%c`{t+i^@Gb39l3ShgL)wAlBJJ1<pvGgs=D=O7Vi%%tK_&mQP zDaNhChQ9vnEs8$MEw-jO%z9(vY`3+i$V<I3Ex@{E3p#LrJX{V71{+a(hSfTmgsZ$% zJwX7L#ok!8bzqZEy}o?nP&2R{RUs+#_unL!iobnJv5jLQ)RD~ItL=9XP1DZ4>b!`O z_NBE2758+<s2Q`oC4Ze<O-rEH%)NifUsNMdvq!m^Q?P+IC^_~|Zewfx&t@}(2onkY z5*1b=z|RaZWf?@309Jj&+$zj~)XuTsUKdxGgx~M|=Y#-2{DGp3q_)rM*#ajTfC2zh zzrDqS?&Zo-%scau9shf}DuL;>EYKwE?NqNoHTzPo4bQ=@%><K<|G#JdSpD1ReMreQ z<VrH!vz2ReM#OD7%w-u{)N-2YaArLu<kcJjAG7R9UbSbvF>Kv5lJnE3m4x!)8eg^m zF|kmAF|k<Y9p_p^e2VwrT76ag%J+>jC_+3p{Xyhbm@K46Y4h#6`X_of*@3uM4H|Q( z(Gof}m9I|t^O!5QXcbe^>vv-eR;(UYg^tuOfwQ3$an&Zm&U7UNoIi0>vYeBw`!=L^ zGlp5;u3X_;AoH2FkQN$;VsOc&Y0fPs0PrgFk}|$tgv7XaByn(nqR3yEtIez5Sqd`n z^ZwV-VU(l<{wLnPy*rbZh2COr_rln@vRcs-nelQ*$!yBrqK=*QvvjP4kHpx|bFP$? zmSjC;++HU7D}TE03G;sFWt9u_(t|HHGyveQd~(cK<RYPH5atn=<$12i)E=^;6X`)L z-=gxfaJnX;)wJgIk0)iQ2X!R3yG|&}>SyZ%beJPy$eG{Ss(-4sWqb-p3@FNozoK^W zx3D6ubuuCV;1~|G<Fw%OkbOj{x~Ab^_;XraW~{T~%KDvy=#u^YlR}zCLPisKga#ir zdECS(8B^@+p!-3jctyalSmjlc7nu20l=1R~1^}qXjdQK1MiN{Z&+$ttHTMiV)0AtP z)szeWddCjc0n+(xK(t3G{TYH*6$ct^vOLQ?rW_NkQw7WHv^kT1*e86gc|i7Ek+y1! zkd5c-l3`1e+Dh1=>V(GaW)ZToxTBTIi!qBB1wr8gH;f#3HQwUuN|=fpj2@{2csxV- zK$rbL);xA_+r-fp*mAj#l|D})gr8~BEtiaEDVilWX2Lsm0Vhs3j!P38T_~J16lSc} zKu^D$ZXCwtp#jTS+*UEt#rDRIlczY*-6ds?o9*h)N7d=J6wAfcwSI>S_UVH4%k-M1 zb%1L&`l>6mHBi*cFWmG0NZtEqv)HZdxIFZDl()3jvCapib{9?6aQAK3{%!>S0*Xp0 z@Qm%Ks^;PbhM$NS{?M#;w#aJi+_VT}1OS$=re?ONZ~gS*mo7hX-JC{z=!{=nrjnbI zfEz2Wmf_hCgNv(2`wtYA0I2n}8qVahR1VXY1^}*_YJlxX*QARBf~)Is#y@rBycivV z=~#i-7c?mZlLKVOc_r0r>Xt&9Y-jkC)WEx@!F?~K493+6L415dK(Fpw!MKTkbU@t1 zh>h;A<bA6L0!LMYt8F^-EuYCdefc^yEP4H$fC&DTywcc0&h!3IH<PXmYw*Cj74<O4 z0AWB=>jQO4d=7-Mg<{_{W&>>I;WQOydIzw|A}ElabUoHGg+wdW(vgz<sXUv7(cxa0 zv7bo;5Mnwuq9=aI{8ULi+nV}x=s{rCaTc`M@Qu+MNS@Yi03KYGJp_%yt-58p<ZDfd zD;i(~Sba#MKX3!TZY&%(v|2bAbT$LE)<B7MdMCy!nEO+|g?83thd~;Nzg7Jbg^1e) ztV&hZYj_g`N?GoBhI!kj0f75~%&SbF3L$K4^l}4Y1C!79j77Hg;BwY@?PpJLz{a4a zY`df`VFn{M%Gr0)U~V9qs{jEY1g0VCLD^IOTt)8Kp$;7;D76tOO`5UD%_Bek3rr*^ z>e8hv<9fC-j2GwzV?F7#{j;%I%K!lAO>Gl)A;o(7RCR)$T1>LB9pIAU9G}&Wut+UX zs*<ga8>K5hqL9&zVIkYGrDX6qxMBaJr#OqU6w}{R4tT~#AtKdmeQyP7tE9nA?Q)ox zfo7_=$1ipLxV5xWlbr++2LypL1RY=`0AM!b5U~R<GvV}-qn8o5O-!mKw-%3=kOv<L zs+gHIvibn8f9|5?6{!O>_!9G-WV?r|u2P|~FDt|AYh|I^t?Hq8;PXWb;!39XUqYx? z|30V&<<&>JDxg*wC@z4952zhqdB;p$ua=>Hv{;5y!#IY*fuMyK;$_4)lAPP<!hX;_ zjPx#i_fWsDKyW**l}g7)NsoO2s^1s@)QG!Q^|3C{h6Jng47DR!4tvyRlV~n>d&qXo zYiyZYZ-$iFt%!N|2AqV@1lbp>{HU|~8r02rd{DPuA2+MXXO%&$miVq#k;T!*BnjVO zd9W0j`z(}4;FQ()lvR7ktqBh)9U7dVKJb%!dzCG6N`-v7c}K}!lZwrZ>5sJH_EK6) zMA=wvwQh$xO>0?GA0wXmN&Gdn)%5evlYcpTn<~4cDwQ)mXql6pflz-S3L8Z1@5cmt zp=O#d9D5`9^~xFP81mr1<ol-!c8Tq|oOk6t_a);2Hz&hI(P>M}>m)2o^8AiXBK6{J z#PqQ5w(o?y`TMO!m7i8&6-2G=3dw>X@hIaW7v~_x1m)uMDG|equN=4YdMCKzAgkj& z-0a)yJaD;Qg&6XPrOEhj^E>hqm9HV7KRxz~PngGrq;vGSHH}0wK~D26|Kj93RZMz% zcXM~pmimHKNLpA(anfizS)`(~h2__?h3qc3e5))(Zre)q@_ZDQgIPy^ySi`n2t{g% zy&DnEiQ$)BtjFq3p;7=pYRA$@y6zmszIuA+X3kft|ExTyFZM>y`9x&E!~`mQJo;Zn zL7;G$)SQ1}`^%Rg(5UbOsU7zE-FDQlab`=2jL_qAb_Um0y!3AS%^h|zDga;~<qo!u z+J_RC9n?W`07tBsZ~CXwvBbbVOj1w=^!Qy0s-*!_X#K#eb(`-eM;piM0oEx0y)n`q zJYbnVWWOf-EIX3aNVzgg(W3Ug!s+B-^LPc*pfMvZzx70D$~dXON;EM+{U7b-(GNiy zJVUF5@PaFwD$3x#u79`Xx6mv#ia!PiYPu5!lv6-aOID;y33_+d|FKV9I9n@q&U8yh z{6<62Kr=Ow9Su3LzBsqdJtj?wm(qPD(kISq{IHtffj9;P1&}y*`J7?gs}v|Dvn^4U zn+ke5tal&{)DzEIsFt;Sd;Xchb)A`-6HfX>a`xkY@Dt)ztQF%|*bK3t8)z;%m6xZu zj<_WJ0Vj~c>ub_|u~fH={NM~}T2;)b6K-<I`BYHN)mY5(#j#X{P2E8+xcre+8BD~V zd}3j`!hb)>Emz7Az58Hg4dS#`1!?I0Bg#4Ab#Ma7dQ^>_<SgqHJ^aA%lPZKYXZ?c@ zE2)4<g~cnT0E_i05wrWp!=%HlkHxq@*d5Y?aldyiY%?WF2jS*^==O*DfR?u{<vJ|w zw{_8Jeo2Nd^G79}{acOA0*cw^KC6kvpf)CyWd0b4{vtor#3taJEp|@a9Q55+IAW5M zTD3MBzJU%F%^GS_7D%OPm<v<BZ2`V*Vc4IGLbvtqZ`WwOV0W2lHl}~<pN$;uW!6;t zSwEpZTdzc}tf!m7)}ZF6JR#0!BG#OV_u2v%l(02ytKY5`&6sx|y}znoH&E5E4-&5$ z8nj$=K57&lr2Vn|fDiD_untbYHy1mlZAiKP6<N?e6#oRSi#yD((H+urlSiRjtdyfO zBz%O4?G&skaG}$8xwUZL)!(M?LmQQIC0`fI4`#NT7m8~8>|oQKMs_vhB)UKejc z7~i{Pn#d_o!PXJ3<`-dt0`~soHe}{i?wmspK1etPUA2(BYe;T$gf7UuR@5y}cX=O$ zGlSvcd$4$ZFvEY3obKpRs}D@acXEN*NqJn|wHlhUv=e6Fq3v7K8dTFg$dk!&mYp{t zY+|U_Y{$tVql-Q?S+2K}In>g>hYAw^qc3^<A)+uY0Tt+*)3xoU{EL0Ss;~{?{Vn9Z zpjhKHZ#aDO4Q5>I^RX7y^KflR#`DYt?GNZ8CWkJTp3l$seP(}-vz4F2naz<MyIr1k zGH{Ctelh(}`gMxw{x7{7j*}e^s@FeTZ&Zl97~f&rMJw-x%6FVW(Z7snU5w%~$=b$r z(a<%uZjpl5BGS4-m7)GnL-y`gH^}`9#C2C9T^rA-lSv!7miaKnsax09uV&MOqLblL z@!$Q>;p*Vu6V(+^viDaJ{$Z13g>%=XRz!gDU(GK$&e0d_7dvVVzYcd@Mi!ciS5^{Q zbaVErcmWbjn#p=%%YVW(8y@mNdJl?CO&AUnlQ#=Q01Dg+@ac2GxA~OlE=YOjZ?(*v zKz#?V59I)W3I*9O1`Z=Bnlt2IffvcvHjo8F_y2Qedar0S&e8CnMX0aqL+M#>E<Sw_ zLmf<G)J$-fXBrnu=lMqekH?6_C5&-_de%#61Lo+BH8i-TCdTdz`qY}glQ3?1&HHCn zhV%ksIu3vk?ed!jZ$l)_(V4Wry1%;u4x<#3Uu9Rsla^ZI9<<CrZp~k0JsVb1_JvUf zM_ya6bCSd3eoJrRMgKi1C~;H*-hR%oR!VvxCKvqN?mqs19zU_7*YepVwdy~XsP9u> zZpJ(y)Fn^^>P;)XTwWz7G#s1T__mlHYY9zPRr<X&w>Dp7DCAqWYkqIRUJy1AOWlud zCOvk)>+-~#<dzab9r<wSm1zyHbhjZ4pjb)+?Ib`cFF!wN(C1FS#!sr`G@oX#MH9hL zUk#rQxq2K2&t%BfXoKfPf8bOX&k5@Ym(weZ*&@t?=%=1y({_)cLqtFeJU}75lBkQR zUXV9t%fOoyXW8MbBQ>lO&&lpF=83j^-o;#_S?1Z8uhe%9{8*Pt<cL_(GMY6P(y5e* z_5la?-hbi!q)lDJ?o75?%Ict*bVHQ&m6Rz<H#3EGTlH5fZ<c=6u`6>-OMVi{KbpLF zerX}}k)r>nDWN+3^DLFQgy#}yel+ZL6VErIu{%mN{wOe;);w2U&}&~>xx_Fl<OV1y z%b<KgJjCx+E!HD?|ACFBQZ7pf93XFKYHuj)>wBJAuvL@?Ub4-tFYgKa;YJqs(3#>% zxXVx%4|Bs{$M>q|F!A%hp=GwfQO1VD%anJmd}G)hefO5gfNgCWlUUZ@Dct(2CYIa8 zaN&Oy7f>X}OBMZ(NB<Qi4+s95B&tHY<vB{GaEuO1<JtJqDB~`&`se>Fs=g}GB6TX? z)F4{DiJDx-iUD^jZ8_anEJnY+%MqxA!Qd%C=nI@n{-0celd0LiP-1%>p*Y5@7R=*h z^CdO`7teF+NdD;>h+#y?9!{*YkUs8fpo4MDLs6Gx-5=bti27uY2Kb5mLe+eNyAbR< zORea;e`tM(Txu;JbTLwV^d0=_ZicsYYQVe;n6GI!dk#3U`d=bKHq_o@^e7;m+^%GL z89DRjRsV|-R!uB}xGZR2AD=b%FF)gRd*nN=j-NYs^oFp`2|De`s}gSC3bULJZ>TWF zNZ>4=P4L31+y52&mfA9Fx(tD;aBt@1K`y*}tTE8c%)&j&WXpMO@-Z7#elg9YIGLZ! zhaX45d?lIX4CE+YH9@*K9p2HfWi7OYqIJV2)lC-}6_x+Z+l>{|me%Z&%8$arHXjw; zVMEL>)=2fBA68dvf}~}38$O0VRZTJ2rX%@}(Mff~2xC&yR_?;$?)_Ehcn#${T$wxD z$|a*ARd-+~=A9lxW3icRL#I}Fiz)4uPfR_+FN~3@Vpf~Hg;kH#>W}1YC-9OHREc)G zdE{WCYxSG^c2(F(KeI-hhtK5K;_#_L$lobOHTB_c{nob8H8aJHWZ}Reyzlb{3cuXI zuZiWMUn_+Kn_trdsk5Yf)hdyVTq2=-lbVmuIt))IXFp2d|CW07?$1A_7|am!<wuAe zi5oI!qKJmh|CSXH!j2Be3s(XI4*q+A`+sryu*?E(rD%cw<MJ_i|KDWnHOVy+MS$Ep z>eT=pKG@aP|My~YJF=sLo1?9xLm0L8dq@A@uisDqqQgM`IyH8FvqsWg*1UNO`I4E6 ze^Ij4oz|trfP)+^RiOU=^#gO1jDZ<0b<M8zt^-}D{)+VPopb}oB`(msg6jO}_m$^a z973OLF|<Y+oB3^I0zIB$yl(!%Ys2s;#vHH3OsLF2vUnGVuCu)SF9)Sx_z%`CsAFGN zIdNM;woTHywv3m@|6FrTe68f1Y>kJd_D@TgQ~6|SF998D9;2IdS!CMN8eqJmthS3~ zwM?wPvVu@!<qmio$#DxaXYqaP35X!TMo3FW8_na2U}3=a_w(sfTq|>irW%B3SZ<cN z#fi>?tq(Al^Sk7nZs8^7sbVfC+paX*j#NJ7xb>mlnV3pY$gxh*%1T%?qrtJxC&>J~ znXxOl3kv~Tc(3ug?R95@__!gPCJ}ORNH=5Xw=YBe$9@;H%_~zQe{AKoiYcioh)c`& zZW%XAp>uBC_F_{@S>}Q_%S)9^*?$YWNiv;e)+fQSsh{o<&b9VWe*67w?vk<DmsSR2 z0YU9}x4svsA$VeI;WHAeUC-86F(h;AEOw=_8ByvG9NBT-Ws0QFX4xo17-)nD*zvbf zN2Z~U=0!JdiJGr9dVX(17P@29&Uy765ctQ0i%iOHP!)V{%^d#Q+Av47CUz9YWXe#G ztcCrWzE+rbTMnCQnhxZ~<%P9)DA1}g=B|j9J}`x0&qSO?A;+g@fGLB@kFO0n0^K;9 zmMxg)^UPZAaSnzeQ))1US_g&F(2fUxmY9;n4yQHMpzUz57i{`+YWnRr73OC#{%{Wc zFKER)Gt+G{G~ni9k!`v^Hm^vi3(Kgy2D+aRS%U7E%I;y9ZpW9TE>Pi5?N&QsQb*lx zcpdGDZe+5*vv;CgCNNQ7<4e(!{+l<{Orxz5pvjA~>wiX*TRV23Cam(B7lnI~2!#|4 zb+Tusn9|_+?PM*R&kpm(=_bn6?m5m|kXw<OxGpHmG~$%c<<1G!wu#aIl>dOXq_LOQ z6YW_i1Jo%oUjnN=G#JVR<A%WzsejmT^vph=hIn_y{3gpoQljYF5E)-ATGJ*sU;Moq zjR;0ZF1lBFHl>k!<uEY!*um6ly7_1NUY+_WRbtWQD^|*R;Fb_sRXvXj*P1ISy1kLI zA$(TakQaLW$xP0EIal)Di#yy4*}M&#k1<rT4nflRP>fJ+M#Ywi?N-oy*9GBil6V4v z{HlGkvm%~4OWu1p{n}w4ow1i*V4b^0%z$aqaLRo54Tg8_x!&kAiNvQCmNXC;nounW zd`hWpGz(kGMKKnjty@e~8M_lf>DOG&`8I7jo--^GbL;BZs1T+_YhhZK0QL#D*240` zldDlB(amVkDr7`G=x}c&X|@L&{;dc)2yV}XLK#z4ZLx426r>xv^HERCWRgZ+swUq% z1d{1{ET}8!j{ZEW;45LY62m;y5PWo(L1PGc7qB4l<3V1ESj=^i{qdrMkxR#FXL9hz z+Lgl|wkqfsb4I$Uv3?uh%bj2di@h%!V+tJCc4LztB5|O(5I2zK_PLVfJ*c)(=&Q?0 z3Ylig=u3<jl6V=dc$2hSS!f*d8G?2OaH0E)WOM<LTCkdHI@VO159x%>SaBy*<*Q-O zW|+o1EAv>G;3KXcVNlj5PdZ5qD_ELn0h*jRetP}$(7q;f4qq0L-*>_{0!q^!T}T+k zl$XkX7sJGapF_}Zgm7AZl;vbuEU<e7K6<58PeIXWD7!0Gu>2g=3|Wv)x9g15aAv*M zAslUne@9%}+2yg%t@DLTdGia#+T;~In;h>fm#{N``KjHNF{BHWvX?w3Xc2N%0s4H8 z64x%hB#B1rV>PtU=c{S~8~8;QRQHh>rCd+N<(eqe-x4!bX=WZU4U?<hN%ff<sYFAH zYKf3t&0=zJIhLOz=Z8;4>O;6SVvgFS?S7vO;87Ew-#tznvL{wgA#vE3G*UqO`Kx1W z#}5^b$^#j45M`g$ZI!%ID^)g4aU$pLKAZI0;}`y87>p@pm|~7%a!8Jp@*bp@ylpox z6DZ;0$q3f=B7J!r3b?`(H(w({ifqPq4HparUwxlGJAf7JspX<3w#w6amEou&wbg#b z9T2!OUdA5#O^tGz!Ctphxah@Uzct71Rh3Q}9;1~kxR#}`c!((Sp_mzTE8?Pb?rXht zcNtgGZ@Ll}+1)Cx&W4{6f^*rZ2E#!X=TL2>b3**2K@zj3ESjtaiUM$@y8f{JZYJh+ zQtChv-E<EA+UedfQC7W`VtLgJtbbhx--8&DEU#Nunw)dH=CbvNRhPcX&L)W1M~g=e zm9B?%z~%8ZxLzm9A81WHiAE5?DAR1e!KEllsNONdr7R2HGX+G>U55!4g0HNw&;`C{ zn`#iIis+KjKdBS5{cs^xxDK8-U}|KeYQ=IN?6-6MBz0mLhn7GZM+6nKbFSAq<*Hi^ z`UsHf@)U3=5`z_kaf6W&tOHRL_#fX2qt78<<@lj}WS$w2v6m|a1-?;k)-={Uz7^^1 z<Q==qiAl+>VE2oEN(04!RW%W^C`voHzHNJTo2jbh>8*xtV0n#aAeJ3lKzZ$CTf83k zW&rs}VRFtP!ilUbT%^<IdPmQwzCX1|jlJ8Tmi8;!3{fP%beG5Dm3cN*Cq%7^<sENP zf1FEBc^%Q&dH!#`N;-8VYSlW2WU%2qGgH6F;US+NYPsVq9=UeXE8KuUG>(lYUeIb| zzB=#<M+}}?0I$X8)-_aTn25jisRXY7VryeK7(=??F6r(~XW%~;hpC<Ac#hynVh)}6 z$uu-*pq};i4qROHUVPBN#n&^oGxRgvk2R@3!#Q^|?vpLa&hOW67xx=kw;Nqs6KCU& zwVkoUQ(pQ*8N|R5i&3hKSu&7oh(+v=rcb6VyQSX7k-?l!NX=T;kBA(8HcK`3xQiIT zg?rqHv?dMx{metnjQ&4uer>V_VFjU$3RzcmVQpy_Kad{d<&YA{EAa6+FYqvXH=Frv zzj0&EWzwwq(##8|05Uzq(ly_Lg~64gaZ74aqPC~obkk*Di!_GH$V2lX&QFw8Dq@Fz zDKHwBKC;hug?IVwgMV`AuI05fUR`BY@)j~f?a2P!foV$Nr$%(U$-KvPqWrwp^NfNT z7NHnk#9^m`m!%sq$3{@-!LZzaw8Ch?ot*t#WxaG`DL>iW+jj8R7St$F{|)U93&EQ0 zaP1QNspFj=<)62xAXSAQ_AxP7xCJ19F$wj{Lz)@2zjPyGGv5oV6v#qFRZ9GBp^V`9 z#_^CjM0QocS@I0=0yz<ju~yjbOA^*rt=fXFd2#BnAio0m!5ohR5(<l+_WEJXM)ZT( zqTTFgJyH%q_hKjFnZ}nQSKC5<>i3b&i(&)baNN%c_JB2IVUxDApBz1>@9Q^JE$9*} z5K2n!AIzBK9P8b&T#Q_p1g^aw2!a1ZQt+i$1Giy*=LgTwx1a%V;r({6zngcR=ggag z6_LDANtU5@m%p9O+^!z-Y8+tUgK0)gZdw(f8NAoY2;)T9Mpa9b6Vkqw0JCr^tN&w$ zE(ofKBApoM_yL0tXQ%n=)(s3+Y<q_su^#bM%YFma?AL(9K|U(l)>~b9p-pEgLWs)E z*P$7o(+8X8#U?#eHfinO-X0sF-c?Y+7+}zUkYI<sYJk#UV7vu_ToqBje`B}}lgack z%1)9%m+>ri8DQ`GgY;0OBb_f-!GnZ-+eMwIyRwU}zcDu&$2BNxRCuOO4&Iw8LM<sa zL^4NZR)CH|LESc=;(OwPvm2AYCm>8#WGLe(d0BE=_q9K@5LO@JV*^osVNu(c_%8qy z3xA!WtvgqMYV$lP(BC)f@T;9+<R`B$r3uH@6ezQ<2*d4zKRc+!OPKjWg`>m4$bZKR zN^(S^x`dE{7;9kE?}HJ8RMH{!b`rVlMX?LTo3dlfpeW0RM#^RL43~^#Z`Vis??7ql z)1JkB;b>2VzUkoF6kKM?3)SJr7diy$Z?}6%C_n_uk<1KyAR=?I0x`Kt1LRWD;5Mh^ zy5q<1ZU>;_t{ma};k)w_8%X2149q?{D-fMer3hyiaIYucS&q<;b7%Oe%y=5=bXPZX z%fayz4H1O0<_;UW`?KMDwS$Cto5eKF<;CTtKJ%O*LjG9~CJtK26NY<qg*+Rmfv$TL zL<bfrYGoCQ{^aV<h(p^;jLD%0DV!Q~|4L?MB}|foT$<?jxBPMF2Uju7^q)6u^`VgG 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 UFF4%b&sC+4rlCeD$nMQQ0P-6l!T<mO literal 0 HcmV?d00001 diff --git a/SpeechT5/scripts/generate_class.py b/SpeechT5/scripts/generate_class.py new file mode 100644 index 0000000..b9656d2 --- /dev/null +++ b/SpeechT5/scripts/generate_class.py @@ -0,0 +1,153 @@ +import ast +import logging +import os +import sys +from argparse import Namespace + +import numpy as np +import torch +from fairseq import checkpoint_utils, options, tasks, utils +from fairseq.fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.fairseq.logging import progress_bar +from omegaconf import DictConfig + + +def main(cfg: DictConfig): + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + assert cfg.common_eval.path is not None, "--path required for generation!" + assert ( + cfg.generation.replace_unk is None or cfg.dataset.dataset_impl == "raw" + ), "--replace-unk requires a raw text dataset (--dataset-impl=raw)" + + if cfg.common_eval.results_path is not None: + os.makedirs(cfg.common_eval.results_path, exist_ok=True) + + return _main(cfg, sys.stdout) + + +def _main(cfg: DictConfig, output_file): + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=output_file, + ) + logger = logging.getLogger("speecht5.generate_class") + + utils.import_user_module(cfg.common) + + assert cfg.dataset.batch_size == 1, "only support batch size 1" + logger.info(cfg) + + # Fix seed for stochastic decoding + if cfg.common.seed is not None and not cfg.generation.no_seed_provided: + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + if not use_cuda: + logger.info("generate speech on cpu") + + # build task + task = tasks.setup_task(cfg.task) + + # Load ensemble + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + overrides = ast.literal_eval(cfg.common_eval.model_overrides) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + utils.split_paths(cfg.common_eval.path), + arg_overrides=overrides, + task=task, + suffix=cfg.checkpoint.checkpoint_suffix, + strict=(cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.checkpoint.checkpoint_shard_count, + ) + logger.info(saved_cfg) + + # loading the dataset should happen after the checkpoint has been loaded so we can give it the saved task config + task.load_dataset(cfg.dataset.gen_subset, task_cfg=saved_cfg.task) + + # optimize ensemble for generation + for model in models: + if model is None: + continue + if cfg.common.fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + # load dataset (possibly sharded) + itr = task.get_batch_iterator( + dataset=task.dataset(cfg.dataset.gen_subset), + max_tokens=cfg.dataset.max_tokens, + max_sentences=cfg.dataset.batch_size, + max_positions=None, + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.dataset.required_batch_size_multiple, + seed=cfg.common.seed, + num_shards=cfg.distributed_training.distributed_world_size, + shard_id=cfg.distributed_training.distributed_rank, + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + n_correct = 0 + n_total = 0 + assert hasattr(task.dataset(cfg.dataset.gen_subset), "tgt_dict") + dict_class = task.dataset(cfg.dataset.gen_subset).tgt_dict + for i, sample in enumerate(progress): + if "net_input" not in sample or "source" not in sample["net_input"]: + continue + sample = utils.move_to_cuda(sample) if use_cuda else sample + prefix_tokens = utils.move_to_cuda( + torch.LongTensor([[dict_class.eos()] for _ in range(len(sample["net_input"]["source"]))]) + ) + + outs = task.generate_class( + models, + sample["net_input"], + prefix_tokens, + ) + prediction = outs.detach().cpu().tolist() + categories = [dict_class[predi] for predi in prediction] + + if "target" in sample: + target = sample["target"].squeeze(1).detach().cpu().tolist() + labels = [dict_class[tgti] for tgti in target] + + n_total += len(categories) + if "target" in sample: + r_correct = [] + for ci, li in zip(categories, labels): + if ci == li: + n_correct += 1 + r_correct.append(True) + else: + r_correct.append(False) + + logger.info( + f"{i} (size: {sample['net_input']['source'].shape}) -> {prediction} ({categories}) " + + f"<- target: {target} ({labels})\t{r_correct}" if "target" in sample else "" + ) + logger.info( + f"Accuracy on {cfg.dataset.gen_subset}: {n_correct*100.0/n_total:.3f} ({n_correct}/{n_total})" + ) + + +def cli_main(): + parser = options.get_generation_parser() + args = options.parse_args_and_arch(parser) + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/scripts/generate_speech.py b/SpeechT5/scripts/generate_speech.py new file mode 100644 index 0000000..deed3e4 --- /dev/null +++ b/SpeechT5/scripts/generate_speech.py @@ -0,0 +1,199 @@ +import ast +import logging +import os +import os.path as op +import sys +from argparse import Namespace + +import numpy as np +import torch +from fairseq import checkpoint_utils, options, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.logging import progress_bar +from omegaconf import DictConfig + + +# define function for plot prob and att_ws +def _plot_and_save(array, figname, figsize=(6, 4), dpi=150): + import matplotlib.pyplot as plt + + shape = array.shape + if len(shape) == 1: + # for eos probability + plt.figure(figsize=figsize, dpi=dpi) + plt.plot(array) + plt.xlabel("Frame") + plt.ylabel("Probability") + plt.ylim([0, 1]) + elif len(shape) == 2: + # for tacotron 2 attention weights, whose shape is (out_length, in_length) + plt.figure(figsize=figsize, dpi=dpi) + plt.imshow(array, aspect="auto") + elif len(shape) == 4: + # for transformer attention weights, + # whose shape is (#leyers, #heads, out_length, in_length) + plt.figure(figsize=(figsize[0] * shape[0], figsize[1] * shape[1]), dpi=dpi) + for idx1, xs in enumerate(array): + for idx2, x in enumerate(xs, 1): + plt.subplot(shape[0], shape[1], idx1 * shape[1] + idx2) + plt.imshow(x, aspect="auto") + plt.xlabel("Input") + plt.ylabel("Output") + else: + raise NotImplementedError("Support only from 1D to 4D array.") + plt.tight_layout() + if not op.exists(op.dirname(figname)): + # NOTE: exist_ok = True is needed for parallel process decoding + os.makedirs(op.dirname(figname), exist_ok=True) + plt.savefig(figname) + plt.close() + + +# define function to calculate focus rate +# (see section 3.3 in https://arxiv.org/abs/1905.09263) +def _calculate_focus_rete(att_ws): + if att_ws is None: + # fastspeech case -> None + return 1.0 + elif len(att_ws.shape) == 2: + # tacotron 2 case -> (L, T) + return float(att_ws.max(dim=-1)[0].mean()) + elif len(att_ws.shape) == 4: + # transformer case -> (#layers, #heads, L, T) + return float(att_ws.max(dim=-1)[0].mean(dim=-1).max()) + else: + raise ValueError("att_ws should be 2 or 4 dimensional tensor.") + + +def main(cfg: DictConfig): + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + assert cfg.common_eval.path is not None, "--path required for generation!" + assert ( + cfg.generation.replace_unk is None or cfg.dataset.dataset_impl == "raw" + ), "--replace-unk requires a raw text dataset (--dataset-impl=raw)" + + if cfg.common_eval.results_path is not None: + os.makedirs(cfg.common_eval.results_path, exist_ok=True) + + return _main(cfg, sys.stdout) + + +def _main(cfg: DictConfig, output_file): + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=output_file, + ) + logger = logging.getLogger("speecht5.generate_speech") + + utils.import_user_module(cfg.common) + + assert cfg.dataset.batch_size == 1, "only support batch size 1" + logger.info(cfg) + + # Fix seed for stochastic decoding + if cfg.common.seed is not None and not cfg.generation.no_seed_provided: + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + if not use_cuda: + logger.info("generate speech on cpu") + + # build task + task = tasks.setup_task(cfg.task) + + # Load ensemble + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + overrides = ast.literal_eval(cfg.common_eval.model_overrides) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + utils.split_paths(cfg.common_eval.path), + arg_overrides=overrides, + task=task, + suffix=cfg.checkpoint.checkpoint_suffix, + strict=(cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.checkpoint.checkpoint_shard_count, + ) + logger.info(saved_cfg) + + # loading the dataset should happen after the checkpoint has been loaded so we can give it the saved task config + task.load_dataset(cfg.dataset.gen_subset, task_cfg=saved_cfg.task) + + # optimize ensemble for generation + for model in models: + if model is None: + continue + if cfg.common.fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + # load dataset (possibly sharded) + itr = task.get_batch_iterator( + dataset=task.dataset(cfg.dataset.gen_subset), + max_tokens=cfg.dataset.max_tokens, + max_sentences=cfg.dataset.batch_size, + max_positions=None, + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.dataset.required_batch_size_multiple, + seed=cfg.common.seed, + num_shards=cfg.distributed_training.distributed_world_size, + shard_id=cfg.distributed_training.distributed_rank, + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + for i, sample in enumerate(progress): + if "net_input" not in sample: + continue + sample = utils.move_to_cuda(sample) if use_cuda else sample + outs, _, attn = task.generate_speech( + models, + sample["net_input"], + ) + focus_rate = _calculate_focus_rete(attn) + outs = outs.cpu().numpy() + audio_name = op.basename(sample['name'][0]) + np.save(op.join(cfg.common_eval.results_path, audio_name.replace(".wav", "-feats.npy")), outs) + + logging.info( + "{} (size: {}->{} ({}), focus rate: {:.3f})".format( + sample['name'][0], + sample['src_lengths'][0].item(), + outs.shape[0], + sample['dec_target_lengths'][0].item(), + focus_rate + ) + ) + + if i < 6 and attn is not None: + import shutil + demo_dir = op.join(op.dirname(cfg.common_eval.results_path), "demo") + audio_dir = op.join(demo_dir, "audio") + os.makedirs(audio_dir, exist_ok=True) + shutil.copy(op.join(task.dataset(cfg.dataset.gen_subset).audio_root, sample['tgt_name'][0] if "tgt_name" in sample else sample['name'][0]), op.join(audio_dir, audio_name)) + att_dir = op.join(demo_dir, "att_ws") + _plot_and_save(attn.cpu().numpy(), op.join(att_dir, f"{audio_name}_att_ws.png")) + spec_dir = op.join(demo_dir, "spec") + _plot_and_save(outs.T, op.join(spec_dir, f"{audio_name}_gen.png")) + _plot_and_save(sample["target"][0].cpu().numpy().T, op.join(spec_dir, f"{audio_name}_ori.png")) + + +def cli_main(): + parser = options.get_generation_parser() + args = options.parse_args_and_arch(parser) + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/SpeechT5/speecht5/__init__.py b/SpeechT5/speecht5/__init__.py new file mode 100644 index 0000000..8994f9a --- /dev/null +++ b/SpeechT5/speecht5/__init__.py @@ -0,0 +1 @@ +from . import data, tasks, criterions, models # noqa \ No newline at end of file diff --git a/SpeechT5/speecht5/criterions/__init__.py b/SpeechT5/speecht5/criterions/__init__.py new file mode 100644 index 0000000..f4aa07c --- /dev/null +++ b/SpeechT5/speecht5/criterions/__init__.py @@ -0,0 +1,10 @@ +import importlib +import os + + +for file in os.listdir(os.path.dirname(__file__)): + if file.endswith(".py") and not file.startswith("_"): + criterion_name = file[: file.find(".py")] + importlib.import_module( + "speecht5.criterions." + criterion_name + ) \ No newline at end of file diff --git a/SpeechT5/speecht5/criterions/speech_pretrain_criterion.py b/SpeechT5/speecht5/criterions/speech_pretrain_criterion.py new file mode 100644 index 0000000..7377d96 --- /dev/null +++ b/SpeechT5/speecht5/criterions/speech_pretrain_criterion.py @@ -0,0 +1,268 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.logging import metrics +from fairseq.criterions import FairseqCriterion +from speecht5.criterions.text_to_speech_loss import TexttoSpeechLoss, TexttoSpeechLossConfig + + +@dataclass +class SpeechPretrainCriterionConfig(TexttoSpeechLossConfig): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default_factory=lambda: [10,], + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + hubert_weight: float = field( + default=1.0, + metadata={"help": "weight of hubert loss"}, + ) + dec_weight: float = field( + default=1.0, + metadata={"help": "weight of decoder loss"}, + ) + + +class SpeechPretrainCriterion(FairseqCriterion): + def __init__( + self, + task, + sentence_avg, + pred_masked_weight, + pred_nomask_weight, + loss_weights=None, + log_keys=None, + use_masking=True, + use_weighted_masking=False, + loss_type="L1", + bce_pos_weight=5.0, + hubert_weight=1.0, + dec_weight=1.0, + ): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.hubert_weight = hubert_weight + self.dec_weight = dec_weight + + self.speech_criterion = TexttoSpeechLoss( + task, + sentence_avg, + use_masking, + use_weighted_masking, + loss_type, + bce_pos_weight, + ) + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + if self.dec_weight == 0: + sample["net_input"]["only_hubert"] = True + net_output, net_output_dec = model(target_list=sample["target_list"], **sample["net_input"]) + loss = 0. + sample_size = 0 + logging_output = {} + reduction = "sum" if reduce else "none" + + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(None, net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_{i}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(None, net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + if len(self.loss_weights) > len(extra_losses): + modified_loss_weight = self.loss_weights[:len(extra_losses)] + else: + modified_loss_weight = self.loss_weights + + # assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, modified_loss_weight): + # print(n + str(coef)) + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.detach().item() + + logging_output = { + "ntokens": sample_size, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + "ngpu": 1, + **logging_output, + } + + if 'loss_prob_perplexity' in logging_output: + logging_output['code_perplexity'] = net_output['code_perplexity'].detach().item() + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk].item())) + + def compute_correct(logits): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == 0 + min = logits.argmin(-1) == 0 + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + corr_m, count_m = compute_correct(logp_m) + logging_output[f"correct_m_{i}"] = corr_m + logging_output[f"count_m_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + corr_u, count_u = compute_correct(logp_u) + logging_output[f"correct_u_{i}"] = corr_u + logging_output[f"count_u_{i}"] = count_u + + if self.dec_weight == 0.0: + logging_output["loss"] = loss.item() if reduce else loss + return loss, sample_size, logging_output + +# ## dec loss + dec_loss, l1_loss, l2_loss, bce_loss, enc_dec_attn_loss = self.speech_criterion.compute_loss(model, net_output_dec, sample) + + # Log tts loss + logging_output['dec_loss'] = dec_loss.item() + logging_output['l1_loss'] = l1_loss.item() + logging_output['l2_loss'] = l2_loss.item() + logging_output['bce_loss'] = bce_loss.item() + if enc_dec_attn_loss is not None: + logging_output['enc_dec_attn_loss'] = enc_dec_attn_loss.item() + + loss = self.hubert_weight * loss + self.dec_weight * sample_size * dec_loss + logging_output["loss"] = loss.item() if reduce else loss + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + l1_loss_sum = sum(log.get("l1_loss", 0) for log in logging_outputs) + l2_loss_sum = sum(log.get("l2_loss", 0) for log in logging_outputs) + bce_loss_sum = sum(log.get("bce_loss", 0) for log in logging_outputs) + ngpu = sum(log.get("ngpu", 0) for log in logging_outputs) + + metrics.log_scalar("loss", loss_sum / sample_size / math.log(2), sample_size, round=3) + if sample_size != ntokens: + metrics.log_scalar("nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3) + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg)) + else: + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["loss"].avg)) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + elif lk == 'code_perplexity': + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / len(logging_outputs), round=3) + + metrics.log_scalar( + "dec_loss", dec_loss_sum / ngpu, sample_size, 2, round=5 + ) + metrics.log_scalar( + "l1_loss", l1_loss_sum / ngpu, sample_size, 2, round=5 + ) + metrics.log_scalar( + "l2_loss", l2_loss_sum / ngpu, sample_size, 2, round=5 + ) + metrics.log_scalar( + "bce_loss", bce_loss_sum / ngpu, sample_size, 2, round=5 + ) + if "enc_dec_attn_loss" in logging_outputs[0]: + enc_dec_attn_loss_sum = sum(log.get("enc_dec_attn_loss", 0) for log in logging_outputs) + metrics.log_scalar( + "enc_dec_attn_loss", enc_dec_attn_loss_sum / ngpu, sample_size, round=8 + ) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/SpeechT5/speecht5/criterions/speech_to_text_loss.py b/SpeechT5/speecht5/criterions/speech_to_text_loss.py new file mode 100644 index 0000000..bff149b --- /dev/null +++ b/SpeechT5/speecht5/criterions/speech_to_text_loss.py @@ -0,0 +1,476 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import math +from argparse import Namespace +from dataclasses import dataclass, field +from omegaconf import II +from typing import Optional + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.logging import metrics +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from fairseq.data.data_utils import post_process +from fairseq.tasks import FairseqTask +from fairseq.logging.meters import safe_round + +import logging +logger = logging.getLogger(__name__) + +@dataclass +class SpeechtoTextLossConfig(FairseqDataclass): + zero_infinity: bool = field( + default=False, + metadata={"help": "zero inf loss when source length <= target length"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + post_process: Optional[str] = field( + default="sentencepiece", + metadata={ + "help": "how to post process predictions into words. can be letter, " + "wordpiece, BPE symbols, etc. " + "See fairseq.data.data_utils.post_process() for full list of options" + }, + ) + wer_kenlm_model: Optional[str] = field( + default=None, + metadata={ + "help": "if this is provided, use kenlm to compute wer (along with other wer_* args)" + }, + ) + wer_lexicon: Optional[str] = field( + default=None, + metadata={"help": "lexicon to use with wer_kenlm_model"}, + ) + wer_lm_weight: float = field( + default=2.0, + metadata={"help": "lm weight to use with wer_kenlm_model"}, + ) + wer_word_score: float = field( + default=-1.0, + metadata={"help": "lm word score to use with wer_kenlm_model"}, + ) + + wer_args: Optional[str] = field( + default=None, + metadata={ + "help": "DEPRECATED: tuple of (wer_kenlm_model, wer_lexicon, wer_lm_weight, wer_word_score)" + }, + ) + + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + report_accuracy: bool = field( + default=False, + metadata={"help": "report accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + #: bool = II("optimization.sentence_avg") + + ce_weight: float = field( + default=1.0, + metadata={"help": "loss weight for cross entropy"}, + ) + ctc_weight: float = field( + default=0.0, + metadata={"help": "loss weiehgt for ctc in ASR"}, + ) + + +def label_smoothed_nll_loss(lprobs, target, epsilon, ignore_index=None, reduce=True): + if target.dim() == lprobs.dim() - 1: + target = target.unsqueeze(-1) + nll_loss = -lprobs.gather(dim=-1, index=target) + smooth_loss = -lprobs.sum(dim=-1, keepdim=True) + if ignore_index is not None: + pad_mask = target.eq(ignore_index) + nll_loss.masked_fill_(pad_mask, 0.0) + smooth_loss.masked_fill_(pad_mask, 0.0) + else: + nll_loss = nll_loss.squeeze(-1) + smooth_loss = smooth_loss.squeeze(-1) + if reduce: + nll_loss = nll_loss.sum() + smooth_loss = smooth_loss.sum() + eps_i = epsilon / (lprobs.size(-1) - 1) + loss = (1.0 - epsilon - eps_i) * nll_loss + eps_i * smooth_loss + return loss, nll_loss + + +class SpeechtoTextLoss(FairseqCriterion): + def __init__( + self, + cfg: SpeechtoTextLossConfig, + task: FairseqTask, + sentence_avg=True, + label_smoothing=0.1, + ignore_prefix_size=0, + report_accuracy=False, + ce_weight=1.0, + ctc_weight=0.0, + ): + + super().__init__(task) + self.blank_idx = ( + task.target_dictionary.index(task.blank_symbol) + if hasattr(task, "blank_symbol") + else 0 + ) + #print ("self.blank_idx: ", self.blank_idx) + + self.pad_idx = task.target_dictionary.pad() + self.eos_idx = task.target_dictionary.eos() + self.post_process = cfg.post_process + self.ce_weight = ce_weight + self.ctc_weight = ctc_weight + + ## for ce + self.sentence_avg = sentence_avg + self.eps = label_smoothing + self.ignore_prefix_size = ignore_prefix_size + self.report_accuracy = report_accuracy + + if cfg.wer_args is not None: + ( + cfg.wer_kenlm_model, + cfg.wer_lexicon, + cfg.wer_lm_weight, + cfg.wer_word_score, + ) = eval(cfg.wer_args) + + if cfg.wer_kenlm_model is not None: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + dec_args = Namespace() + dec_args.nbest = 1 + dec_args.criterion = "ctc" + dec_args.kenlm_model = cfg.wer_kenlm_model + dec_args.lexicon = cfg.wer_lexicon + dec_args.beam = 50 + dec_args.beam_size_token = min(50, len(task.target_dictionary)) + dec_args.beam_threshold = min(50, len(task.target_dictionary)) + dec_args.lm_weight = cfg.wer_lm_weight + dec_args.word_score = cfg.wer_word_score + dec_args.unk_weight = -math.inf + dec_args.sil_weight = 0 + + self.w2l_decoder = W2lKenLMDecoder(dec_args, task.target_dictionary) + else: + self.w2l_decoder = None + + self.zero_infinity = cfg.zero_infinity + #self.sentence_avg = cfg.sentence_avg + + if self.ce_weight > 0 and self.ctc_weight > 0: + logger.info("Using cross entropy loss and CTC loss for ASR") + elif self.ce_weight > 0: + logger.info("Only using CE loss") + elif self.ctc_weight > 0: + logger.info("Only using CTC loss for ASR") + else: + logger.info("ERROR") + + def forward(self, model, sample, reduce=True): + + if self.ce_weight == 0 and self.ctc_weight > 0: + sample["only_ctc"] = True + + net_output_decoder, net_output = model(**sample["net_input"]) + + if self.ce_weight > 0: + loss_ce, nll_loss_ce = self.compute_loss(model, net_output_decoder, sample, reduce=reduce) + #print ("loss_ce: ", loss_ce) + else: + nll_loss_ce = None + + if self.ctc_weight > 0: + loss_ctc, lprobs, input_lengths = self.compute_loss_ctc(model, net_output, sample) + + if self.ce_weight > 0 and self.ctc_weight > 0: + loss = self.ce_weight * loss_ce + self.ctc_weight * loss_ctc + elif self.ce_weight > 0: + loss = loss_ce + elif self.ctc_weight > 0: + loss = loss_ctc + else: + logger.info("ERROR: must ce_weight > 0 or ctc_weight > 0") + + ntokens = ( + sample["ntokens"] if "ntokens" in sample else sample["target_lengths"].sum().item() + ) + + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + + logging_output = { + "loss": loss.item(), + "ce_loss": loss_ce.item() if self.ce_weight > 0 else 0, + "ctc_loss": loss_ctc.item() if self.ctc_weight > 0 else 0, + "nll_loss": nll_loss_ce.item() if nll_loss_ce is not None else 0, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + + if self.ce_weight > 0 and self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output_decoder, sample) + logging_output["n_correct"] = utils.item(n_correct.item()) + logging_output["total"] = utils.item(total.data) + + if self.ctc_weight > 0 and not model.training: + import editdistance + + with torch.no_grad(): + lprobs_t = lprobs.transpose(0, 1).float().contiguous().cpu() + + c_err = 0 + c_len = 0 + w_errs = 0 + w_len = 0 + wv_errs = 0 + for lp, t, inp_l in zip( + lprobs_t, + sample["target_label"] + if "target_label" in sample + else sample["target"], + input_lengths, + ): + lp = lp[:inp_l].unsqueeze(0) + + decoded = None + if self.w2l_decoder is not None: + decoded = self.w2l_decoder.decode(lp) + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + + p = (t != self.task.target_dictionary.pad()) & ( + t != self.task.target_dictionary.eos() + ) + targ = t[p] + targ_units = self.task.target_dictionary.string(targ) + targ_units_arr = targ.tolist() + + toks = lp.argmax(dim=-1).unique_consecutive() + pred_units_arr = toks[toks != self.blank_idx].tolist() + + c_err += editdistance.eval(pred_units_arr, targ_units_arr) + c_len += len(targ_units_arr) + + targ_words = post_process(targ_units, self.post_process).split() + + pred_units = self.task.target_dictionary.string(pred_units_arr) + pred_words_raw = post_process(pred_units, self.post_process).split() + + if decoded is not None and "words" in decoded: + pred_words = decoded["words"] + w_errs += editdistance.eval(pred_words, targ_words) + wv_errs += editdistance.eval(pred_words_raw, targ_words) + else: + dist = editdistance.eval(pred_words_raw, targ_words) + w_errs += dist + wv_errs += dist + + w_len += len(targ_words) + + logging_output["wv_errors"] = wv_errs + logging_output["w_errors"] = w_errs + logging_output["w_total"] = w_len + logging_output["c_errors"] = c_err + logging_output["c_total"] = c_len + + return loss, sample_size, logging_output + + def compute_loss_ctc(self, model, net_output, sample): + lprobs = model.get_normalized_probs_for_ctc( + net_output, log_probs=True + ).contiguous() # (T, B, C) from the encoder + + if net_output["encoder_padding_mask"] is not None: + non_padding_mask = ~net_output["encoder_padding_mask"][0] + input_lengths = non_padding_mask.long().sum(-1) + else: + input_lengths = lprobs.new_full( + (lprobs.size(1),), lprobs.size(0), dtype=torch.long + ) + + pad_mask = (sample["target"] != self.pad_idx) & ( + sample["target"] != self.eos_idx + ) + targets_flat = sample["target"].masked_select(pad_mask) + if "target_lengths" in sample: + target_lengths = sample["target_lengths"] + else: + target_lengths = pad_mask.sum(-1) + + ##processing + target_lengths = target_lengths - 1 + + with torch.backends.cudnn.flags(enabled=False): + loss_ctc = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction="sum", + zero_infinity=self.zero_infinity, + ) + + return loss_ctc, lprobs, input_lengths + + ## for ce + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = model.get_targets(sample, net_output) + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + def compute_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + nll_loss_sum = sum(log.get("nll_loss", 0) for log in logging_outputs) + ce_loss_sum = sum(log.get("ce_loss", 0) for log in logging_outputs) + ctc_loss_sum = sum(log.get("ctc_loss", 0) for log in logging_outputs) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + + metrics.log_scalar( + "ctc_loss", ctc_loss_sum / sample_size / math.log(2), ntokens, 2, round=3 + ) + metrics.log_scalar( + "ce_loss", ce_loss_sum / ntokens, ntokens, 2, round=3 + ) + metrics.log_scalar( + "nll_loss", nll_loss_sum / ntokens / math.log(2), ntokens, 2, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg, 2) + ) + + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("n_correct", n_correct) + metrics.log_derived( + "accuracy", + lambda meters: round( + meters["n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + 2 + ) + + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + c_errors = sum(log.get("c_errors", 0) for log in logging_outputs) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in logging_outputs) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in logging_outputs) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in logging_outputs) + metrics.log_scalar("_w_total", w_total) + + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/speecht5/criterions/speecht5_criterion.py b/SpeechT5/speecht5/criterions/speecht5_criterion.py new file mode 100644 index 0000000..089405e --- /dev/null +++ b/SpeechT5/speecht5/criterions/speecht5_criterion.py @@ -0,0 +1,446 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import re +from dataclasses import dataclass + +import math +from fairseq import utils +from fairseq.logging import metrics +from fairseq.criterions import FairseqCriterion, register_criterion +from speecht5.criterions.text_to_speech_loss import TexttoSpeechLoss +from speecht5.criterions.text_pretrain_criterion import TextPretrainCriterion, TextPretrainCriterionConfig +from fairseq.criterions.label_smoothed_cross_entropy import LabelSmoothedCrossEntropyCriterionConfig +from speecht5.criterions.speech_pretrain_criterion import SpeechPretrainCriterion, SpeechPretrainCriterionConfig +from speecht5.criterions.speech_to_text_loss import SpeechtoTextLoss, SpeechtoTextLossConfig +from fairseq.logging.meters import safe_round + +@dataclass +class SpeechT5CriterionConfig( + LabelSmoothedCrossEntropyCriterionConfig, + TextPretrainCriterionConfig, + SpeechPretrainCriterionConfig, + SpeechtoTextLossConfig + ): + pass + +@register_criterion( + "speecht5", dataclass=SpeechT5CriterionConfig +) +class SpeechT5Criterion(FairseqCriterion): + def __init__( + self, + task, + sentence_avg, + label_smoothing, + pred_masked_weight, + pred_nomask_weight, + loss_weights=None, + log_keys=None, + ignore_prefix_size=0, + report_accuracy=False, + use_masking=True, + use_weighted_masking=False, + loss_type="L1", + bce_pos_weight=5.0, + bce_loss_lambda=1.0, + use_guided_attn_loss=False, + num_heads_applied_guided_attn=2, + ce_weight=1.0, + ctc_weight=0.0, + hubert_weight=1.0, + dec_weight=1.0, + bart_weight=1.0, + ): + super().__init__(task) + self.speech_criterion = TexttoSpeechLoss( + task, + sentence_avg, + use_masking, + use_weighted_masking, + loss_type, + bce_pos_weight, + bce_loss_lambda, + use_guided_attn_loss, + num_heads_applied_guided_attn=num_heads_applied_guided_attn, + ) + self.text_criterion = SpeechtoTextLoss( + SpeechtoTextLossConfig, + task, + sentence_avg, + label_smoothing, + ignore_prefix_size, + report_accuracy, + ce_weight, + ctc_weight + ) + self.text_pretrain_criterion = TextPretrainCriterion( + task, + sentence_avg, + bart_weight, + loss_weights, + ) + self.speech_pretrain_criterion = SpeechPretrainCriterion( + task, + sentence_avg, + pred_masked_weight, + pred_nomask_weight, + loss_weights, + log_keys, + use_masking, + use_weighted_masking, + loss_type, + bce_pos_weight, + hubert_weight, + dec_weight + ) + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + + task_name = sample['task_name'] + if task_name == 's2t' or task_name == 's2c': + return self.text_criterion(model, sample, reduce) + elif task_name == 't2s' or task_name == 's2s': + return self.speech_criterion(model, sample) + elif task_name == 'text_pretrain': + return self.text_pretrain_criterion(model, sample, reduce) + elif task_name == 'speech_pretrain': + return self.speech_pretrain_criterion(model, sample, reduce) + + @classmethod + def reduce_metrics(cls, logging_outputs): + """Aggregate logging outputs from data parallel training.""" + logging_outputs_dict = {} + for logging_output in logging_outputs: + for task_name in logging_output: + if task_name not in ['s2t', 't2s', 's2c', 's2s', 'text_pretrain', 'speech_pretrain']: + continue + + if task_name not in logging_outputs_dict: + logging_outputs_dict[task_name] = [] + logging_outputs_dict[task_name].append(logging_output[task_name]) + + for task_name in logging_outputs_dict: + if task_name == 's2t': + # LabelSmoothedCrossEntropyCriterion.reduce_metrics([logging_output['s2t'] for logging_output in logging_outputs]) + s2t_logging_output = logging_outputs_dict[task_name] + # s2t_sum = sum(log.get("ce_loss", 0) for log in logging_outputs) + loss_sum = sum(log.get("loss", 0) for log in s2t_logging_output) + nll_loss_sum = sum(log.get("nll_loss", 0) for log in s2t_logging_output) + ntokens = sum(log.get("ntokens", 0) for log in s2t_logging_output) + ce_loss_sum = sum(log.get("ce_loss", 0) for log in s2t_logging_output) + ctc_loss_sum = sum(log.get("ctc_loss", 0) for log in s2t_logging_output) + + sample_size = max(1, sum(log.get("sample_size", 0) for log in s2t_logging_output)) + metrics.log_scalar( + "s2t_loss", loss_sum / sample_size / math.log(2), sample_size, 1, round=3 + ) + + metrics.log_scalar( + "s2t_nll_loss", nll_loss_sum / ntokens / math.log(2), ntokens, 2, round=3 + ) + metrics.log_derived( + "s2t_ppl", lambda meters: utils.get_perplexity(meters["s2t_nll_loss"].avg, 2) + ) + metrics.log_scalar( + "ctc_loss", ctc_loss_sum / sample_size / math.log(2), ntokens, 2, round=3 + ) + metrics.log_scalar( + "ce_loss", ce_loss_sum / ntokens, ntokens, 2, round=3 + ) + + total = utils.item(sum(log.get("total", 0) for log in s2t_logging_output)) + if total > 0: + metrics.log_scalar("s2t_total", total) + n_correct = utils.item( + sum(log.get("n_correct", 0) for log in s2t_logging_output) + ) + metrics.log_scalar("s2t_n_correct", n_correct) + metrics.log_derived( + "s2t_accuracy", + lambda meters: round( + meters["s2t_n_correct"].sum * 100.0 / meters["s2t_total"].sum, 3 + ) + if meters["s2t_total"].sum > 0 + else float("nan"), + 2 + ) + c_errors = sum(log.get("c_errors", 0) for log in s2t_logging_output) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in s2t_logging_output) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in s2t_logging_output) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in s2t_logging_output) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in s2t_logging_output) + metrics.log_scalar("_w_total", w_total) + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + if task_name == 't2s': + # TTSLossCriterion.reduce_metrics([logging_output['t2s'] for logging_output in logging_outputs]) + # t2s_sum = sum(log.get("speech_loss", 0) for log in logging_outputs) + t2s_logging_output = logging_outputs_dict[task_name] + loss_sum = sum(log.get("loss", 0) for log in t2s_logging_output) + l1_loss_sum = sum(log.get("l1_loss", 0) for log in t2s_logging_output) + l2_loss_sum = sum(log.get("l2_loss", 0) for log in t2s_logging_output) + bce_loss_sum = sum(log.get("bce_loss", 0) for log in t2s_logging_output) + sample_size = max(1, sum(log.get("sample_size", 0) for log in t2s_logging_output)) + metrics.log_scalar( + "t2s_loss", loss_sum / sample_size, sample_size, 1, round=5 + ) + encoder_alpha_sum = sum(log.get("encoder_alpha", 0) for log in t2s_logging_output) + decoder_alpha_sum = sum(log.get("decoder_alpha", 0) for log in t2s_logging_output) + ngpu = sum(log.get("ngpu", 0) for log in t2s_logging_output) + + metrics.log_scalar( + "t2s_l1_loss", l1_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "t2s_l2_loss", l2_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "t2s_bce_loss", bce_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "t2s_encoder_alpha", encoder_alpha_sum / sample_size, sample_size, round=5 + ) + metrics.log_scalar( + "t2s_decoder_alpha", decoder_alpha_sum / sample_size, sample_size, round=5 + ) + + if "enc_dec_attn_loss" in t2s_logging_output[0]: + enc_dec_attn_loss_sum = sum(log.get("enc_dec_attn_loss", 0) for log in t2s_logging_output) + metrics.log_scalar( + "t2s_enc_dec_attn_loss", enc_dec_attn_loss_sum / sample_size, sample_size, round=8 + ) + + if task_name == 's2c': + s2c_logging_output = logging_outputs_dict[task_name] + loss_sum = sum(log.get("loss", 0) for log in s2c_logging_output) + nll_loss_sum = sum(log.get("nll_loss", 0) for log in s2c_logging_output) + ntokens = sum(log.get("ntokens", 0) for log in s2c_logging_output) + + sample_size = max(1, sum(log.get("sample_size", 0) for log in s2c_logging_output)) + metrics.log_scalar( + "s2c_loss", loss_sum / sample_size / math.log(2), sample_size, 1, round=3 + ) + + metrics.log_scalar( + "s2c_nll_loss", nll_loss_sum / ntokens / math.log(2), ntokens, 2, round=3 + ) + + total = utils.item(sum(log.get("total", 0) for log in s2c_logging_output)) + if total > 0: + metrics.log_scalar("s2c_total", total) + n_correct = utils.item(sum(log.get("n_correct", 0) for log in s2c_logging_output)) + metrics.log_scalar("s2c_n_correct", n_correct) + metrics.log_derived( + "s2c_accuracy", + lambda meters: round( + meters["s2c_n_correct"].sum * 100.0 / meters["s2c_total"].sum, 3 + ) + if meters["s2c_total"].sum > 0 + else float("nan"), + 2 + ) + + if task_name == 's2s': + s2s_logging_output = logging_outputs_dict[task_name] + loss_sum = sum(log.get("loss", 0) for log in s2s_logging_output) + l1_loss_sum = sum(log.get("l1_loss", 0) for log in s2s_logging_output) + l2_loss_sum = sum(log.get("l2_loss", 0) for log in s2s_logging_output) + bce_loss_sum = sum(log.get("bce_loss", 0) for log in s2s_logging_output) + sample_size = max(1, sum(log.get("sample_size", 0) for log in s2s_logging_output)) + metrics.log_scalar( + "s2s_loss", loss_sum / sample_size, sample_size, 1, round=5 + ) + encoder_alpha_sum = sum(log.get("encoder_alpha", 0) for log in s2s_logging_output) + decoder_alpha_sum = sum(log.get("decoder_alpha", 0) for log in s2s_logging_output) + ngpu = sum(log.get("ngpu", 0) for log in s2s_logging_output) + + metrics.log_scalar( + "s2s_l1_loss", l1_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "s2s_l2_loss", l2_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "s2s_bce_loss", bce_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "s2s_decoder_alpha", decoder_alpha_sum / sample_size, sample_size, round=5 + ) + + if "enc_dec_attn_loss" in s2s_logging_output[0]: + enc_dec_attn_loss_sum = sum(log.get("enc_dec_attn_loss", 0) for log in s2s_logging_output) + metrics.log_scalar( + "s2s_enc_dec_attn_loss", enc_dec_attn_loss_sum / sample_size, sample_size, round=8 + ) + + if task_name == 'text_pretrain': + bart_logging_output = logging_outputs_dict[task_name] + loss_sum = sum(log.get("loss", 0) for log in bart_logging_output) + ntokens = sum(log.get("ntokens", 0) for log in bart_logging_output) + sample_size = max(1, sum(log.get("sample_size", 0) for log in bart_logging_output)) + bart_loss_sum = sum(log.get("bart_loss", 0) for log in bart_logging_output) + + # we divide by log(2) to convert the loss from base e to base 2 + metrics.log_scalar( + "text_loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "bart_loss", bart_loss_sum / sample_size / math.log(2), ntokens, 2, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "bart_nll_loss", bart_loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "bart_ppl", lambda meters: utils.get_perplexity(meters["bart_nll_loss"].avg) + ) + else: + metrics.log_derived( + "bart_ppl", lambda meters: utils.get_perplexity(meters["bart_loss"].avg) + ) + metrics.log_scalar("bart_wpb", ntokens, priority=180, round=1) + + val_prob_perplexity = 0 + val_code_perplexity = 0 + sample_size_pp = 0 + count_log_cp = 0 + for log in bart_logging_output: + if "loss_prob_perplexity" in log: + val_prob_perplexity = val_prob_perplexity + log["loss_prob_perplexity"] + sample_size_pp = sample_size_pp + log["sample_size"] + if "code_perplexity" in log: + val_code_perplexity = val_code_perplexity + log["code_perplexity"] + count_log_cp = count_log_cp + 1 + if val_prob_perplexity > 0: + metrics.log_scalar("text_loss_prob_perplexity", val_prob_perplexity / sample_size_pp / math.log(2), round=3) + if val_code_perplexity > 0: + metrics.log_scalar("text_code_perplexity", val_code_perplexity / count_log_cp, round=3) + + if task_name == 'speech_pretrain': + hubert_logging_output = logging_outputs_dict[task_name] + loss_sum = sum(log.get("loss", 0) for log in hubert_logging_output) + ntokens = sum(log.get("ntokens", 0) for log in hubert_logging_output) + sample_size = max(1, sum(log.get("sample_size", 0) for log in hubert_logging_output)) + dec_loss_sum = sum(log.get("dec_loss", 0) for log in hubert_logging_output) + l1_loss_sum = sum(log.get("l1_loss", 0) for log in hubert_logging_output) + l2_loss_sum = sum(log.get("l2_loss", 0) for log in hubert_logging_output) + bce_loss_sum = sum(log.get("bce_loss", 0) for log in hubert_logging_output) + ngpu = sum(log.get("ngpu", 0) for log in hubert_logging_output) + + metrics.log_scalar("hubert_loss", loss_sum / sample_size / math.log(2), sample_size, round=3) + if sample_size != ntokens: + metrics.log_scalar("hubert_nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3) + metrics.log_derived("hubert_ppl", lambda meters: utils.get_perplexity(meters["hubert_nll_loss"].avg)) + else: + metrics.log_derived("hubert_ppl", lambda meters: utils.get_perplexity(meters["hubert_loss"].avg)) + + counts = {} + for lk in hubert_logging_output[0].keys(): + if lk.startswith("count_"): + val = sum(log[lk] for log in hubert_logging_output) + metrics.log_scalar("hubert_" + lk, val) + counts[lk] = val + + for lk in hubert_logging_output[0].keys(): + if lk.startswith("loss_") and lk != 'loss_prob_perplexity': + val = sum(log[lk] for log in hubert_logging_output) + metrics.log_scalar("hubert_" + lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log[lk] for log in hubert_logging_output) + metrics.log_scalar("hubert_" + lk, val / counts[re.sub("correct", "count", lk)]) + # elif lk == 'code_perplexity': + # val = sum(log[lk] for log in hubert_logging_output) + # metrics.log_scalar("hubert_" + lk, val / len(hubert_logging_output), round=3) + + val_prob_perplexity = 0 + val_code_perplexity = 0 + sample_size_pp = 0 + count_log_cp = 0 + for log in hubert_logging_output: + if "loss_prob_perplexity" in log: + val_prob_perplexity = val_prob_perplexity + log["loss_prob_perplexity"] + sample_size_pp = sample_size_pp + log["sample_size"] + if "code_perplexity" in log: + val_code_perplexity = val_code_perplexity + log["code_perplexity"] + count_log_cp = count_log_cp + 1 + if val_prob_perplexity > 0: + metrics.log_scalar("hubert_loss_prob_perplexity", val_prob_perplexity / sample_size_pp / math.log(2), round=3) + if val_code_perplexity > 0: + metrics.log_scalar("hubert_code_perplexity", val_code_perplexity / count_log_cp, round=3) + + metrics.log_scalar( + "hubert_dec_loss", dec_loss_sum / ngpu, sample_size, 2, round=5 + ) + metrics.log_scalar( + "hubert_l1_loss", l1_loss_sum / ngpu, sample_size, 2, round=5 + ) + metrics.log_scalar( + "hubert_l2_loss", l2_loss_sum / ngpu, sample_size, 2, round=5 + ) + metrics.log_scalar( + "hubert_bce_loss", bce_loss_sum / ngpu, sample_size, 2, round=5 + ) + if "enc_dec_attn_loss" in hubert_logging_output[0]: + enc_dec_attn_loss_sum = sum(log.get("enc_dec_attn_loss", 0) for log in hubert_logging_output) + metrics.log_scalar( + "hubert_enc_dec_attn_loss", enc_dec_attn_loss_sum / ngpu, sample_size, round=8 + ) + metrics.log_scalar("hubert_wpb", ntokens, priority=180, round=1) + + loss = sum(log.get("loss", 0) for log in logging_outputs) + sample_size = max(1, sum(log.get("sample_size", 0) for log in logging_outputs)) + metrics.log_scalar( + "loss", loss / sample_size, sample_size, 1, round=5 + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/SpeechT5/speecht5/criterions/text_pretrain_criterion.py b/SpeechT5/speecht5/criterions/text_pretrain_criterion.py new file mode 100644 index 0000000..be459bf --- /dev/null +++ b/SpeechT5/speecht5/criterions/text_pretrain_criterion.py @@ -0,0 +1,145 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import math +from dataclasses import dataclass, field +from typing import List, Optional + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.logging import metrics +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from omegaconf import II + + +@dataclass +class TextPretrainCriterionConfig(FairseqDataclass): + sentence_avg: bool = II("optimization.sentence_avg") + loss_weights: Optional[List[float]] = field( + default_factory=lambda: [0.1,], + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + bart_weight: float = field( + default=1.0, + metadata={"help": "loss weight for cross entropy"}, + ) + + +class TextPretrainCriterion(FairseqCriterion): + def __init__(self, task, sentence_avg, bart_weight, loss_weights=None): + super().__init__(task) + self.sentence_avg = sentence_avg + self.loss_weights = loss_weights + self.bart_weight = bart_weight + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output, codebook_out, encoder_output = model(**sample["net_input"]) + bart_loss, _ = self.compute_loss(model, net_output, sample, reduce=reduce) + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + + loss = self.bart_weight * bart_loss + logging_output = { + "loss": loss.item(), + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "bart_loss": bart_loss.item(), + "sample_size": sample_size, + } + + if "prob_perplexity" in codebook_out: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(codebook_out) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + if len(self.loss_weights) > len(extra_losses): + modified_loss_weight = self.loss_weights[len(extra_losses):] + else: + modified_loss_weight = self.loss_weights + + # assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, modified_loss_weight): + # print(n + str(coef)) + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() + + if 'loss_prob_perplexity' in logging_output: + logging_output['code_perplexity'] = codebook_out['code_perplexity'].item() + + return loss, sample_size, logging_output + + def compute_loss(self, model, net_output, sample, reduce=True): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + lprobs = lprobs.view(-1, lprobs.size(-1)) + target = model.get_targets(sample, net_output).view(-1) + loss = F.nll_loss( + lprobs, + target, + ignore_index=self.padding_idx, + reduction="sum" if reduce else "none", + ) + return loss, loss + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + bart_loss_sum = sum(log.get("bart_loss", 0) for log in logging_outputs) + + # we divide by log(2) to convert the loss from base e to base 2 + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "bart_loss", bart_loss_sum / sample_size / math.log(2), ntokens, 2, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", bart_loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["bart_loss"].avg) + ) + + if "loss_prob_perplexity" in logging_outputs[0].keys(): + val = sum(log["loss_prob_perplexity"] for log in logging_outputs) + metrics.log_scalar("loss_prob_perplexity", val / sample_size / math.log(2), round=3) + if "code_perplexity" in logging_outputs[0].keys(): + val = sum(log["code_perplexity"] for log in logging_outputs) + metrics.log_scalar("code_perplexity", val / len(logging_outputs), round=3) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechT5/speecht5/criterions/text_to_speech_loss.py b/SpeechT5/speecht5/criterions/text_to_speech_loss.py new file mode 100644 index 0000000..aa17bd1 --- /dev/null +++ b/SpeechT5/speecht5/criterions/text_to_speech_loss.py @@ -0,0 +1,428 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +from dataclasses import dataclass, field + +import torch +from fairseq import utils +from fairseq.logging import metrics +from espnet.nets.pytorch_backend.nets_utils import make_non_pad_mask +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from speecht5.models.modules.speech_encoder_prenet import SpeechEncoderPrenet +from espnet.nets.pytorch_backend.e2e_tts_tacotron2 import GuidedAttentionLoss +from omegaconf import II +from typing import Any + + +@dataclass +class TexttoSpeechLossConfig(FairseqDataclass): + use_masking: bool = field( + default=True, + metadata={"help": "Whether to use masking in calculation of loss"}, + ) + use_weighted_masking: bool = field( + default=False, + metadata={"help": "Whether to use weighted masking in calculation of loss"}, + ) + loss_type: str = field( + default="L1", + metadata={"help": "How to calc loss"}, + ) + bce_pos_weight: float = field( + default=5.0, + metadata={"help": "Positive sample weight in BCE calculation (only for use-masking=True)"}, + ) + bce_loss_lambda: float = field( + default=1.0, + metadata={"help": "Lambda in bce loss"}, + ) + use_guided_attn_loss: bool = field( + default=False, + metadata={"help": "Whether to use guided attention loss"}, + ) + guided_attn_loss_sigma: float = field( + default=0.4, + metadata={"help": "Sigma in guided attention loss"}, + ) + guided_attn_loss_lambda: float = field( + default=10.0, + metadata={"help": "Lambda in guided attention loss"}, + ) + num_layers_applied_guided_attn: int = field( + default=2, + metadata={"help": "Number of layers to be applied guided attention loss, if set -1, all of the layers will be applied."}, + ) + num_heads_applied_guided_attn: int = field( + default=2, + metadata={"help": "Number of heads in each layer to be applied guided attention loss, if set -1, all of the heads will be applied."}, + ) + modules_applied_guided_attn: Any = field( + default=("encoder-decoder",), + metadata={"help": "Module name list to be applied guided attention loss"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + + +class TexttoSpeechLoss(FairseqCriterion): + def __init__( + self, + task, + sentence_avg, + use_masking=True, + use_weighted_masking=False, + loss_type="L1", + bce_pos_weight=5.0, + bce_loss_lambda=1.0, + use_guided_attn_loss=False, + guided_attn_loss_sigma=0.4, + guided_attn_loss_lambda=1.0, + num_layers_applied_guided_attn=2, + num_heads_applied_guided_attn=2, + modules_applied_guided_attn=["encoder-decoder"], + ): + super().__init__(task) + self.sentence_avg = sentence_avg + self.use_masking = use_masking + self.use_weighted_masking = use_weighted_masking + self.loss_type = loss_type + self.bce_pos_weight = bce_pos_weight + self.bce_loss_lambda = bce_loss_lambda + self.use_guided_attn_loss = use_guided_attn_loss + self.guided_attn_loss_sigma = guided_attn_loss_sigma + self.guided_attn_loss_lambda = guided_attn_loss_lambda + # define loss function + self.criterion = Tacotron2Loss( + use_masking=use_masking, + use_weighted_masking=use_weighted_masking, + bce_pos_weight=bce_pos_weight, + ) + if self.use_guided_attn_loss: + self.num_layers_applied_guided_attn = num_layers_applied_guided_attn + self.num_heads_applied_guided_attn = num_heads_applied_guided_attn + self.modules_applied_guided_attn = modules_applied_guided_attn + if self.use_guided_attn_loss: + self.attn_criterion = GuidedMultiHeadAttentionLoss( + sigma=guided_attn_loss_sigma, + alpha=guided_attn_loss_lambda, + ) + + def forward(self, model, sample): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + net_output = model(**sample["net_input"]) + loss, l1_loss, l2_loss, bce_loss, enc_dec_attn_loss = self.compute_loss(model, net_output, sample) + # sample_size = ( + # sample["target"].size(0) if self.sentence_avg else sample["nframes"] + # ) + sample_size = 1 + logging_output = { + "loss": loss.item(), + "l1_loss": l1_loss.item(), + "l2_loss": l2_loss.item(), + "bce_loss": bce_loss.item(), + "sample_size": 1, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + } + + if enc_dec_attn_loss is not None: + logging_output['enc_dec_attn_loss'] = enc_dec_attn_loss.item() + + if hasattr(model, 'text_encoder_prenet'): + logging_output["encoder_alpha"] = model.text_encoder_prenet.encoder_prenet[-1].alpha.item() + logging_output["decoder_alpha"] = model.speech_decoder_prenet.decoder_prenet[-1].alpha.item() + elif hasattr(model, "speech_encoder_prenet"): + logging_output["decoder_alpha"] = model.speech_decoder_prenet.decoder_prenet[-1].alpha.item() + else: + if 'task' not in sample: + logging_output["encoder_alpha"] = model.encoder_prenet.encoder_prenet[-1].alpha.item() + logging_output["decoder_alpha"] = model.decoder_prenet.decoder_prenet[-1].alpha.item() + + return loss, sample_size, logging_output + + def compute_loss(self, model, net_output, sample): + before_outs, after_outs, logits, attn = net_output + labels = sample["labels"] + ys = sample["dec_target"] + olens = sample["dec_target_lengths"] + ilens = sample["src_lengths"] + + # modifiy mod part of groundtruth + if model.reduction_factor > 1: + olens_in = olens.new([torch.div(olen, model.reduction_factor, rounding_mode='floor') for olen in olens]) + olens = olens.new([olen - olen % model.reduction_factor for olen in olens]) + max_olen = max(olens) + ys = ys[:, :max_olen] + labels = labels[:, :max_olen] + labels = torch.scatter(labels, 1, (olens - 1).unsqueeze(1), 1.0) # make sure at least one frame has 1 + # labels[:, -1] = 1.0 + else: + olens_in = olens + + # caluculate loss values + l1_loss, l2_loss, bce_loss = self.criterion( + after_outs, before_outs, logits, ys, labels, olens + ) + + # l1_loss = l1_loss / ys.size(2) + # l2_loss = l2_loss / ys.size(2) + + if self.loss_type == "L1": + loss = l1_loss + self.bce_loss_lambda * bce_loss if self.bce_loss_lambda > 0.0 else l1_loss + elif self.loss_type == "L2": + loss = l2_loss + self.bce_loss_lambda * bce_loss if self.bce_loss_lambda > 0.0 else l2_loss + elif self.loss_type == "L1+L2": + loss = l1_loss + l2_loss + self.bce_loss_lambda * bce_loss if self.bce_loss_lambda > 0.0 else l1_loss + l2_loss + else: + raise ValueError("unknown --loss-type " + self.loss_type) + + # calculate guided attention loss + enc_dec_attn_loss = None + if self.use_guided_attn_loss: + # calculate the input lengths of encoder, which is determined by encoder prenet + if hasattr(model, 'encoder_reduction_factor') and model.encoder_reduction_factor > 1: + ilens_in = ilens.new([ilen // model.encoder_reduction_factor for ilen in ilens]) + else: + ilens_in = ilens + # work for speech to speech model's input + if "task_name" in sample and sample["task_name"] == "s2s": + m = None + if hasattr(model, 'encoder_prenet'): + m = model.encoder_prenet + elif hasattr(model, 'speech_encoder_prenet'): + m = model.speech_encoder_prenet + if m is not None and isinstance(m, SpeechEncoderPrenet): + ilens_in = m.get_src_lengths(ilens_in) + # calculate for encoder-decoder + if "encoder-decoder" in self.modules_applied_guided_attn: + attn = [att_l[:, : self.num_heads_applied_guided_attn] for att_l in attn] + att_ws = torch.cat(attn, dim=1) # (B, H*L, T_out, T_in) + enc_dec_attn_loss = self.attn_criterion(att_ws, ilens_in, olens_in) + loss = loss + enc_dec_attn_loss + + return loss, l1_loss, l2_loss, bce_loss, enc_dec_attn_loss + + @classmethod + def reduce_metrics(cls, logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + l1_loss_sum = sum(log.get("l1_loss", 0) for log in logging_outputs) + l2_loss_sum = sum(log.get("l2_loss", 0) for log in logging_outputs) + bce_loss_sum = sum(log.get("bce_loss", 0) for log in logging_outputs) + sample_size = max(1, sum(log.get("sample_size", 0) for log in logging_outputs)) + metrics.log_scalar( + "loss", loss_sum / sample_size, sample_size, 1, round=5 + ) + encoder_alpha_sum = sum(log.get("encoder_alpha", 0) for log in logging_outputs) + decoder_alpha_sum = sum(log.get("decoder_alpha", 0) for log in logging_outputs) + ngpu = sum(log.get("ngpu", 0) for log in logging_outputs) + + metrics.log_scalar( + "l1_loss", l1_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "l2_loss", l2_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "bce_loss", bce_loss_sum / sample_size, sample_size, 2, round=5 + ) + metrics.log_scalar( + "encoder_alpha", encoder_alpha_sum / sample_size, sample_size, round=5 + ) + metrics.log_scalar( + "decoder_alpha", decoder_alpha_sum / sample_size, sample_size, round=5 + ) + + if "enc_dec_attn_loss" in logging_outputs[0]: + enc_dec_attn_loss_sum = sum(log.get("enc_dec_attn_loss", 0) for log in logging_outputs) + metrics.log_scalar( + "enc_dec_attn_loss", enc_dec_attn_loss_sum / sample_size, sample_size, round=8 + ) + + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True + +class Tacotron2Loss(torch.nn.Module): + """Loss function module for Tacotron2.""" + + def __init__( + self, use_masking=True, use_weighted_masking=False, bce_pos_weight=20.0 + ): + """Initialize Tactoron2 loss module. + + Args: + use_masking (bool): Whether to apply masking + for padded part in loss calculation. + use_weighted_masking (bool): + Whether to apply weighted masking in loss calculation. + bce_pos_weight (float): Weight of positive sample of stop token. + + """ + super(Tacotron2Loss, self).__init__() + assert (use_masking != use_weighted_masking) or not use_masking + self.use_masking = use_masking + self.use_weighted_masking = use_weighted_masking + + # define criterions + # reduction = "none" if self.use_weighted_masking else "sum" + reduction = "none" if self.use_weighted_masking else "mean" + self.l1_criterion = torch.nn.L1Loss(reduction=reduction) + self.mse_criterion = torch.nn.MSELoss(reduction=reduction) + self.bce_criterion = torch.nn.BCEWithLogitsLoss( + reduction=reduction, pos_weight=torch.tensor(bce_pos_weight) + ) + + # NOTE(kan-bayashi): register pre hook function for the compatibility + self._register_load_state_dict_pre_hook(self._load_state_dict_pre_hook) + + def forward(self, after_outs, before_outs, logits, ys, labels, olens): + """Calculate forward propagation. + + Args: + after_outs (Tensor): Batch of outputs after postnets (B, Lmax, odim). + before_outs (Tensor): Batch of outputs before postnets (B, Lmax, odim). + logits (Tensor): Batch of stop logits (B, Lmax). + ys (Tensor): Batch of padded target features (B, Lmax, odim). + labels (LongTensor): Batch of the sequences of stop token labels (B, Lmax). + olens (LongTensor): Batch of the lengths of each target (B,). + + Returns: + Tensor: L1 loss value. + Tensor: Mean square error loss value. + Tensor: Binary cross entropy loss value. + + """ + # make mask and apply it + if self.use_masking: + masks = make_non_pad_mask(olens).unsqueeze(-1).to(ys.device) + ys = ys.masked_select(masks) + after_outs = after_outs.masked_select(masks) + before_outs = before_outs.masked_select(masks) + labels = labels.masked_select(masks[:, :, 0]) + logits = logits.masked_select(masks[:, :, 0]) + + # calculate loss + l1_loss = self.l1_criterion(after_outs, ys) + self.l1_criterion(before_outs, ys) + mse_loss = self.mse_criterion(after_outs, ys) + self.mse_criterion( + before_outs, ys + ) + bce_loss = self.bce_criterion(logits, labels) + + # make weighted mask and apply it + if self.use_weighted_masking: + masks = make_non_pad_mask(olens).unsqueeze(-1).to(ys.device) + weights = masks.float() / masks.sum(dim=1, keepdim=True).float() + out_weights = weights.div(ys.size(0) * ys.size(2)) + logit_weights = weights.div(ys.size(0)) + + # apply weight + l1_loss = l1_loss.mul(out_weights).masked_select(masks).sum() + mse_loss = mse_loss.mul(out_weights).masked_select(masks).sum() + bce_loss = ( + bce_loss.mul(logit_weights.squeeze(-1)) + .masked_select(masks.squeeze(-1)) + .sum() + ) + + return l1_loss, mse_loss, bce_loss + + def _load_state_dict_pre_hook( + self, + state_dict, + prefix, + local_metadata, + strict, + missing_keys, + unexpected_keys, + error_msgs, + ): + """Apply pre hook fucntion before loading state dict. + + From v.0.6.1 `bce_criterion.pos_weight` param is registered as a parameter but + old models do not include it and as a result, it causes missing key error when + loading old model parameter. This function solve the issue by adding param in + state dict before loading as a pre hook function + of the `load_state_dict` method. + + """ + key = prefix + "bce_criterion.pos_weight" + if key not in state_dict: + state_dict[key] = self.bce_criterion.pos_weight + +class GuidedMultiHeadAttentionLoss(GuidedAttentionLoss): + """Guided attention loss function module for multi head attention. + Args: + sigma (float, optional): Standard deviation to control + how close attention to a diagonal. + alpha (float, optional): Scaling coefficient (lambda). + reset_always (bool, optional): Whether to always reset masks. + """ + + def forward(self, att_ws, ilens, olens): + """Calculate forward propagation. + Args: + att_ws (Tensor): + Batch of multi head attention weights (B, H, T_max_out, T_max_in). + ilens (LongTensor): Batch of input lenghts (B,). + olens (LongTensor): Batch of output lenghts (B,). + Returns: + Tensor: Guided attention loss value. + """ + if self.guided_attn_masks is None: + self.guided_attn_masks = ( + self._make_guided_attention_masks(ilens, olens) + .to(att_ws.device) + .unsqueeze(1) + ) + if self.masks is None: + self.masks = self._make_masks(ilens, olens).to(att_ws.device).unsqueeze(1) + losses = self.guided_attn_masks * att_ws + loss = torch.mean(losses.masked_select(self.masks)) + if self.reset_always: + self._reset_masks() + + return self.alpha * loss + + def _make_guided_attention_masks(self, ilens, olens): + n_batches = len(ilens) + max_ilen = max(ilens) + max_olen = max(olens) + guided_attn_masks = torch.zeros((n_batches, max_olen, max_ilen), device=olens.device) + for idx, (ilen, olen) in enumerate(zip(ilens, olens)): + guided_attn_masks[idx, :olen, :ilen] = self._make_guided_attention_mask( + ilen, olen, self.sigma + ) + return guided_attn_masks + + @staticmethod + def _make_guided_attention_mask(ilen, olen, sigma): + grid_x, grid_y = torch.meshgrid(torch.arange(olen, device=olen.device), torch.arange(ilen, device=olen.device)) + grid_x, grid_y = grid_x.float(), grid_y.float() + return 1.0 - torch.exp( + -((grid_y / ilen - grid_x / olen) ** 2) / (2 * (sigma**2)) + ) + + @staticmethod + def _make_masks(ilens, olens): + in_masks = make_non_pad_mask(ilens).to(ilens.device) # (B, T_in) + out_masks = make_non_pad_mask(olens).to(olens.device) # (B, T_out) + return out_masks.unsqueeze(-1) & in_masks.unsqueeze(-2) # (B, T_out, T_in) diff --git a/SpeechT5/speecht5/data/__init__.py b/SpeechT5/speecht5/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/speecht5/data/multitask_dataset.py b/SpeechT5/speecht5/data/multitask_dataset.py new file mode 100644 index 0000000..65e13cf --- /dev/null +++ b/SpeechT5/speecht5/data/multitask_dataset.py @@ -0,0 +1,265 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import bisect + +import logging +import numpy as np +from torch.utils.data.dataloader import default_collate +from fairseq.data import data_utils + +from fairseq.data.fairseq_dataset import FairseqDataset + +logger = logging.getLogger(__name__) + +class MultitaskDataset(FairseqDataset): + @staticmethod + def cumsum(sequence): + r, s = [], 0 + for e in sequence: + curr_len = len(e) + r.append(curr_len + s) + s += curr_len + return r + + def __init__(self, datasets, sample_ratios=1, batch_ratio=None): + super(MultitaskDataset, self).__init__() + assert len(datasets) > 0, "datasets should not be an empty iterable" + self.datasets = list(datasets) + if isinstance(sample_ratios, int): + sample_ratios = [sample_ratios] * len(self.datasets) + if batch_ratio is not None: + logger.info('batch ratio is ' + str(batch_ratio)) + self.batch_ratio = batch_ratio + else: + self.batch_ratio = None + else: + logger.info('set sample ratio to ' + str(sample_ratios)) + if batch_ratio is not None: + logger.info('batch ratio is ' + str(batch_ratio)) + self.batch_ratio = batch_ratio + else: + self.batch_ratio = None + self.sample_ratios = sample_ratios + self._ordered_indices = None + self._update_size() + + def __len__(self): + return self.cumulative_sizes[-1] + + def __getitem__(self, idx): + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + sample = self.datasets[dataset_idx][sample_idx] + if isinstance(sample, dict): + sample["dataset_idx"] = dataset_idx + else: + sample = sample + (dataset_idx,) + return sample + + def _update_size(self): + self.cumulative_sizes = self.cumsum(self.datasets) + self.real_sizes = [len(d) for d in self.datasets] + + def _get_dataset_and_sample_index(self, idx: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + sample_idx = sample_idx % self.real_sizes[dataset_idx] + return dataset_idx, sample_idx + + def collater(self, samples, **extra_args): + # For now only supports datasets with same underlying collater implementations + if samples is not None and len(samples) > 0: + if isinstance(samples[0], dict): + dataset_idx = samples[0]["dataset_idx"] + else: + dataset_idx = samples[0][-1] + samples = [sample[:-1] for sample in samples] + else: + dataset_idx = 0 + + if hasattr(self.datasets[dataset_idx], "collater"): + return self.datasets[dataset_idx].collater(samples, **extra_args) + else: + return default_collate(samples, **extra_args) + + def size(self, idx: int): + """ + Return an example's size as a float or tuple. + """ + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx].size(sample_idx) + + def num_tokens(self, index: int): + return np.max(self.size(index)) + + def attr(self, attr: str, index: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, index) + return getattr(self.datasets[dataset_idx], attr, None) + + @property + def sizes(self): + _dataset_sizes = [] + for ds in self.datasets: + if isinstance(ds.sizes, np.ndarray): + _dataset_sizes.append(ds.sizes) + else: + # Only support underlying dataset with single size array. + assert isinstance(ds.sizes, list) + _dataset_sizes.append(ds.sizes[0]) + return np.concatenate(_dataset_sizes) + + @property + def supports_prefetch(self): + return all(d.supports_prefetch for d in self.datasets) + + def ordered_indices(self): + # ordered_indices = [] + # for i, dataset in enumerate(self.datasets): + # indice = dataset.ordered_indices() + # ordered_indices.append(indice) + if self._ordered_indices is None: + # Call the underlying dataset's ordered_indices() here, so that we + # get the same random ordering as we would have from using the + # underlying sub-datasets directly. + self._ordered_indices = [ + dataset.ordered_indices() + for dataset in self.datasets + ] + return np.arange(len(self)) + + def prefetch(self, indices): + frm = 0 + for to, ds in zip(self.cumulative_sizes, self.datasets): + real_size = len(ds) + if getattr(ds, "supports_prefetch", False): + ds.prefetch([(i - frm) % real_size for i in indices if frm <= i < to]) + frm = to + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + if not hasattr(self, "max_tokens"): + self.max_tokens = max_tokens + if not hasattr(self, "max_sentences"): + self.max_sentences = max_sentences + if not hasattr(self, "required_batch_size_multiple"): + self.required_batch_size_multiple = required_batch_size_multiple + batch_samplers = [] + for i, dataset in enumerate(self.datasets): + batch_sampler = dataset.batch_by_size( + self._ordered_indices[i], + max_tokens=max_tokens if self.batch_ratio is None else max_tokens * self.batch_ratio[i], + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + if i > 0: + for batch in batch_sampler: + batch += self.cumulative_sizes[i - 1] + if self.sample_ratios[i] != 1.0: + batch_sampler = np.array(batch_sampler) + batch_sampler = np.random.choice(batch_sampler, int(len(batch_sampler) * self.sample_ratios[i])) + batch_sampler = list(batch_sampler) + logger.info('Adjust batch by ratio ' + str(self.sample_ratios[i]) + ' and the number of batch is ' + str(int(len(batch_sampler))) + ' for dataset ' + str(i)) + batch_samplers.extend(batch_sampler) + return batch_samplers + + def filter_indices_by_size(self, indices, max_positions): + """ + Filter each sub-dataset independently, then update the round robin to work + on the filtered sub-datasets. + """ + if not hasattr(self, "max_positions"): + self.max_positions = max_positions + ignored_some = False + for i in range(len(self.datasets)): + # ignored = [] + self._ordered_indices[i], ignored = self.datasets[i].filter_indices_by_size( + self._ordered_indices[i], self.max_positions[i] + ) + if len(ignored) > 0: + ignored_some = True + logger.warning( + f"{len(ignored)} samples from {i} have invalid sizes and will be skipped, " + f"max_positions={self.max_positions[i]}, first few sample ids={ignored[:10]}" + ) + + logger.info('update dataset size') + self._update_size() + + # Since we are modifying in place the _ordered_indices, + # it's not possible anymore to return valid ignored indices. + # Hopefully the extra debug information print above should be enough to debug. + # Ideally we would receive ignore_invalid_inputs so that we could have + # a proper error message. + return (np.arange(len(self)), [0] if ignored_some else []) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return all(d.can_reuse_epoch_itr_across_epochs for d in self.datasets) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.datasets: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) + + def shuffle_batches(self, batches, seed): + logger.info("shuffle batches") + new_batches_fromlist = [] + new_batches_notlist = [] + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for batch in batches: + if isinstance(batch, list): + # np.random.shuffle(batch) + new_batches_fromlist.append(batch) + else: + new_batches_notlist.append(batch) + logger.info("Get " + str(len(new_batches_fromlist)) + " chunk from speech sides") + logger.info("Get " + str(sum([len(batch_list) for batch_list in new_batches_fromlist])) + " batches from speech sides") + logger.info("Get " + str(len(new_batches_notlist)) + " batches from text sides") + if len(new_batches_fromlist) == 0: + return new_batches_notlist + st_ratio = int(len(new_batches_notlist) / len(new_batches_fromlist)) + logger.info("Get st_ratio " + str(st_ratio)) + last_idx = 0 + for i in range(len(new_batches_fromlist)): + if i == len(new_batches_fromlist) - 1: + new_batches_fromlist[i].extend(new_batches_notlist[last_idx:]) + else: + new_batches_fromlist[i].extend(new_batches_notlist[last_idx : last_idx + st_ratio]) + np.random.shuffle(new_batches_fromlist[i]) + new_batches.extend(new_batches_fromlist[i]) + last_idx = last_idx + st_ratio + logger.info("Finish shuffle") + return new_batches + + def reset_batch_sampler(self): + logger.info("reset batch sampler") + self._ordered_indices = [ + self.datasets[i].ordered_indices() + for i in range(len(self.datasets)) + ] + self.filter_indices_by_size(None, None) + + batch_samplers = self.batch_by_size( + None, + self.max_tokens, + self.max_sentences, + self.required_batch_size_multiple + ) + return batch_samplers diff --git a/SpeechT5/speecht5/data/speech_dataset.py b/SpeechT5/speecht5/data/speech_dataset.py new file mode 100644 index 0000000..c339ee1 --- /dev/null +++ b/SpeechT5/speecht5/data/speech_dataset.py @@ -0,0 +1,476 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import itertools +import logging +import os +import sys +from typing import Any, List, Optional, Union + +import numpy as np + +import torch +import torch.nn.functional as F +import librosa +from fairseq.data.audio.speech_to_text_dataset import get_features_or_waveform +from fairseq.data import data_utils +from fairseq.data.fairseq_dataset import FairseqDataset + +logger = logging.getLogger(__name__) + +def _collate_frames( + frames: List[torch.Tensor], is_audio_input: bool = False +): + """ + Convert a list of 2D frames into a padded 3D tensor + Args: + frames (list): list of 2D frames of size L[i]*f_dim. Where L[i] is + length of i-th frame and f_dim is static dimension of features + Returns: + 3D tensor of size len(frames)*len_max*f_dim where len_max is max of L[i] + """ + max_len = max(frame.size(0) for frame in frames) + if is_audio_input: + out = frames[0].new_zeros((len(frames), max_len)) + else: + out = frames[0].new_zeros((len(frames), max_len, frames[0].size(1))) + for i, v in enumerate(frames): + out[i, : v.size(0)] = v + return out + +def add_first_frame_and_remove_last_frame(ys): + ys_in = torch.cat( + [ys.new_zeros((ys.shape[0], 1, ys.shape[2])), ys[:, :-1]], dim=1 + ) + return ys_in + +def load_audio(manifest_path, max_keep, min_keep): + n_long, n_short = 0, 0 + names, inds, sizes, spk_embeds = [], [], [], [] + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) == 3, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + names.append(items[0]) + spk_embeds.append(items[2]) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes, spk_embeds + + +def load_label(label_path, inds, tot): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +def logmelfilterbank( + audio, + sampling_rate, + fft_size=1024, + hop_size=256, + win_length=None, + window="hann", + num_mels=80, + fmin=80, + fmax=7600, + eps=1e-10, +): + """Compute log-Mel filterbank feature. + (https://github.com/kan-bayashi/ParallelWaveGAN/blob/master/parallel_wavegan/bin/preprocess.py) + + Args: + audio (ndarray): Audio signal (T,). + sampling_rate (int): Sampling rate. + fft_size (int): FFT size. + hop_size (int): Hop size. + win_length (int): Window length. If set to None, it will be the same as fft_size. + window (str): Window function type. + num_mels (int): Number of mel basis. + fmin (int): Minimum frequency in mel basis calculation. + fmax (int): Maximum frequency in mel basis calculation. + eps (float): Epsilon value to avoid inf in log calculation. + + Returns: + ndarray: Log Mel filterbank feature (#frames, num_mels). + + """ + # get amplitude spectrogram + x_stft = librosa.stft(audio, n_fft=fft_size, hop_length=hop_size, + win_length=win_length, window=window, pad_mode="reflect") + spc = np.abs(x_stft).T # (#frames, #bins) + + # get mel basis + fmin = 0 if fmin is None else fmin + fmax = sampling_rate / 2 if fmax is None else fmax + mel_basis = librosa.filters.mel(sr=sampling_rate, n_fft=fft_size, n_mels=num_mels, fmin=fmin, fmax=fmax) + + return np.log10(np.maximum(eps, np.dot(spc, mel_basis.T))) + + +class SpeechPretrainDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + reduction_factor: int = 1, + ): + self.audio_root, self.audio_names, inds, tot, self.sizes, self.spk_embeds = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + self.random_crop = random_crop + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.single_target = single_target + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, float) + else label_rates + ) + self.store_labels = store_labels + if store_labels: + self.label_list = [load_label(p, inds, tot) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot) for p in label_paths + ] + assert label_processors is None or len(label_processors) == self.num_labels + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths( + self.sizes, sample_rate, label_path, label_rate, inds, tot + ) + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + self.reduction_factor = reduction_factor + logger.info( + f"pad_audio={pad_audio}, random_crop={random_crop}, reduction_factor={reduction_factor}, " + f"normalize={normalize}, max_sample_size={self.max_sample_size}" + ) + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + wav, cur_sample_rate = sf.read(wav_path) + wav = torch.from_numpy(wav).float() + fbank = logmelfilterbank( + wav.view(-1).cpu().numpy(), 16000 + ) + fbank = torch.from_numpy(fbank).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav, fbank + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def __getitem__(self, index): + wav, fbank = self.get_audio(index) + labels = self.get_labels(index) + spkembs = get_features_or_waveform( + os.path.join(self.audio_root, self.spk_embeds[index]) + ) + spkembs = torch.from_numpy(spkembs).float() + return {"id": index, "source": wav, "target": fbank, "label_list": labels, 'spkembs': spkembs} + + def __len__(self): + return len(self.sizes) + + def crop_to_max_size(self, wav, target_size): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + + start, end = 0, target_size + if self.random_crop: + start = np.random.randint(0, diff + 1) + end = size - diff + start + return wav[start:end], start + + def collater(self, samples): + # target = max(sizes) -> random_crop not used + # target = max_sample_size -> random_crop used for long + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + + fbanks = [s["target"] for s in samples] + fbank_sizes = [len(s) for s in fbanks] + + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + collated_audios, padding_mask, audio_starts = self.collater_audio( + audios, audio_size + ) + + collated_fbanks = [] + collated_audios_size = [] + for i in range(len(fbanks)): + fbank_start = int(audio_starts[i] / (audio_sizes[i] / fbank_sizes[i])) + fbank_size = int(audio_size / (audio_sizes[i] / fbank_sizes[i])) + fbank_end = min(fbank_start + fbank_size, fbank_sizes[i]) + collated_fbanks.append(fbanks[i][fbank_start : fbank_end]) + collated_audios_size.append(audio_size) + collated_fbanks_size = [len(s) for s in collated_fbanks] + collated_fbanks = _collate_frames(collated_fbanks) + collated_fbanks_size = torch.tensor(collated_fbanks_size, dtype=torch.long) + + # thin out frames for reduction factor (B, Lmax, odim) -> (B, Lmax//r, odim) + if self.reduction_factor > 1: + collated_fbanks_in = collated_fbanks[:, self.reduction_factor - 1 :: self.reduction_factor] + collated_fbanks_size_in = collated_fbanks_size.new([torch.div(olen, self.reduction_factor, rounding_mode='floor') for olen in collated_fbanks_size]) + else: + collated_fbanks_in, collated_fbanks_size_in = collated_fbanks, collated_fbanks_size + + prev_output_tokens = torch.cat( + [collated_fbanks_in.new_zeros((collated_fbanks_in.shape[0], 1, collated_fbanks_in.shape[2])), collated_fbanks_in[:, :-1]], dim=1 + ) + + # make labels for stop prediction + labels = collated_fbanks.new_zeros(collated_fbanks.size(0), collated_fbanks.size(1)) + for i, l in enumerate(fbank_sizes): + labels[i, l - 1 :] = 1.0 + + spkembs = _collate_frames([s["spkembs"] for s in samples], is_audio_input=True) + + targets_by_label = [ + [s["label_list"][i] for s in samples] for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + "spkembs": spkembs, + "tgt_lengths": collated_fbanks_size_in, + } + + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "labels": labels, + "dec_target": collated_fbanks, + "dec_target_lengths": collated_fbanks_size, + "src_lengths": collated_audios_size, + "task_name": 'speech_pretrain', + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch + + def collater_audio(self, audios, audio_size): + collated_audios = audios[0].new_zeros(len(audios), audio_size) + padding_mask = ( + torch.BoolTensor(collated_audios.shape).fill_(False) + # if self.pad_audio else None + ) + audio_starts = [0 for _ in audios] + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat([audio, audio.new_full((-diff,), 0.0)]) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size + ) + return collated_audios, padding_mask, audio_starts + + def collater_frm_label(self, targets, audio_size, audio_starts, label_rate, pad): + assert label_rate > 0 + s2f = label_rate / self.sample_rate + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s : s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1.0: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.sizes[index] + return min(self.sizes[index], self.max_sample_size) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.sizes) + return np.lexsort(order)[::-1] + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechT5/speecht5/data/speech_to_class_dataset.py b/SpeechT5/speecht5/data/speech_to_class_dataset.py new file mode 100644 index 0000000..dda301f --- /dev/null +++ b/SpeechT5/speecht5/data/speech_to_class_dataset.py @@ -0,0 +1,262 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import logging +import os +from typing import Any, List, Optional + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils, Dictionary +from fairseq.data.fairseq_dataset import FairseqDataset + +logger = logging.getLogger(__name__) + + +def load_audio(manifest_path, max_keep, min_keep): + """manifest tsv: wav_path, wav_nframe, wav_class + + Args + manifest_path: str + max_keep: int + min_keep: int + + Return + root, names, inds, tot, sizes, classes + """ + n_long, n_short = 0, 0 + names, inds, sizes, classes = [], [], [], [] + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) >= 2, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + names.append(items[0]) + if len(items) > 2: + classes.append(items[2]) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + if len(classes) == 0: + logger.warn("no classes loaded only if inference") + return root, names, inds, tot, sizes, classes + + +def sample_from_feature(x: np.ndarray, max_segment_length: int = 300): + """Load a segment within 300-400/51200-76800 frames or the corresponding samples from a utterance. + + Args: + x (np.ndarray): feature or waveform (frames[, features]), e.g., log mel filter bank or waveform + max_segment_length (int, optional): maximum segment length. Defaults to 400. + + Returns: + np.ndarray: segmented features + """ + if len(x) <= max_segment_length: + return x + start = np.random.randint(0, x.shape[0] - max_segment_length) + return x[start: start + max_segment_length] + + +class SpeechToClassDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + shuffle: bool = True, + normalize: bool = False, + tgt_dict: Optional[Dictionary] = None, + max_length: Optional[int] = None + ): + self.audio_root, self.audio_names, inds, tot, self.wav_sizes, self.wav_classes = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + + self.label_processors = label_processors + + self.normalize = normalize + self.tgt_dict = tgt_dict + self.max_length = max_length + logger.info( + f"max_length={max_length}, normalize={normalize}" + ) + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + wav, cur_sample_rate = sf.read(wav_path) + if self.max_length is not None: + wav = sample_from_feature(wav, self.max_length) + wav = torch.from_numpy(wav).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav + + def get_label(self, index): + label = self.wav_classes[index] + + if self.label_processors is not None: + label = self.label_processors(label) + return label + + def __getitem__(self, index): + wav = self.get_audio(index) + label = None + if len(self.wav_classes) == len(self.audio_names): + label = self.get_label(index) + return {"id": index, "source": wav, "label": label} + + def __len__(self): + return len(self.wav_sizes) + + def collater(self, samples): + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + + audio_size = max(audio_sizes) + collated_audios, padding_mask = self.collater_audio( + audios, audio_size + ) + + decoder_label = None + decoder_target = None + decoder_target_lengths = None + if samples[0]["label"] is not None: + targets_by_label = [ + [s["label"] for s in samples] + ] + targets_list, lengths_list, ntokens_list = self.collater_label(targets_by_label) + + decoder_label = [ + (targets_list[0][i, :lengths_list[0][i]]).long() + for i in range(targets_list[0].size(0)) + ] + + decoder_target = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=False, + ) + decoder_target_lengths = torch.tensor( + [x.size(0) for x in decoder_label], dtype=torch.long + ) + prev_output_tokens = data_utils.collate_tokens( + [torch.LongTensor([-1]) for _ in samples], + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=True, + ) + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + "task_name": "s2c", + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "target": decoder_target, + "target_lengths": decoder_target_lengths, + "task_name": "s2c", + "ntokens": len(samples), + } + + return batch + + def collater_audio(self, audios, audio_size): + collated_audios = audios[0].new_zeros(len(audios), audio_size) + padding_mask = ( + torch.BoolTensor(collated_audios.shape).fill_(False) + ) + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + collated_audios[i] = torch.cat([audio, audio.new_full((-diff,), 0.0)]) + padding_mask[i, diff:] = True + else: + raise Exception("Diff should not be larger than 0") + return collated_audios, padding_mask + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, [self.tgt_dict.pad()]) + for targets, pad in itr: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + return self.wav_sizes[index] + + @property + def sizes(self): + return np.array(self.wav_sizes) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.wav_sizes) + return np.lexsort(order)[::-1] + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechT5/speecht5/data/speech_to_speech_dataset.py b/SpeechT5/speecht5/data/speech_to_speech_dataset.py new file mode 100644 index 0000000..c9c195d --- /dev/null +++ b/SpeechT5/speecht5/data/speech_to_speech_dataset.py @@ -0,0 +1,282 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import logging +import os +from typing import Any, List, Optional + +import librosa +import numpy as np +import torch +import torch.nn.functional as F +from fairseq.data.fairseq_dataset import FairseqDataset + +logger = logging.getLogger(__name__) + +def _collate_frames( + frames: List[torch.Tensor], is_audio_input: bool = False +): + """ + Convert a list of 2D frames into a padded 3D tensor + Args: + frames (list): list of 2D frames of size L[i]*f_dim. Where L[i] is + length of i-th frame and f_dim is static dimension of features + Returns: + 3D tensor of size len(frames)*len_max*f_dim where len_max is max of L[i] + """ + max_len = max(frame.size(0) for frame in frames) + if is_audio_input: + out = frames[0].new_zeros((len(frames), max_len)) + else: + out = frames[0].new_zeros((len(frames), max_len, frames[0].size(1))) + for i, v in enumerate(frames): + out[i, : v.size(0)] = v + return out + +def load_audio(manifest_path, max_keep, min_keep): + """manifest tsv: src_wav, src_nframe, tgt_wav, tgt_nframe, tgt_spkemb""" + n_long, n_short = 0, 0 + src_names, tgt_names, inds, sizes, tgt_sizes, spk_embeds = [], [], [], [], [], [] + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) >= 2, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + src_names.append(items[0]) + tgt_names.append(items[2]) + tgt_sizes.append(items[3]) + spk_embeds.append(items[4]) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(src_names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, src_names, inds, tot, sizes, tgt_names, tgt_sizes, spk_embeds + + +def logmelfilterbank( + audio, + sampling_rate, + fft_size=1024, + hop_size=256, + win_length=None, + window="hann", + num_mels=80, + fmin=80, + fmax=7600, + eps=1e-10, +): + """Compute log-Mel filterbank feature. + (https://github.com/kan-bayashi/ParallelWaveGAN/blob/master/parallel_wavegan/bin/preprocess.py) + + Args: + audio (ndarray): Audio signal (T,). + sampling_rate (int): Sampling rate. + fft_size (int): FFT size. + hop_size (int): Hop size. + win_length (int): Window length. If set to None, it will be the same as fft_size. + window (str): Window function type. + num_mels (int): Number of mel basis. + fmin (int): Minimum frequency in mel basis calculation. + fmax (int): Maximum frequency in mel basis calculation. + eps (float): Epsilon value to avoid inf in log calculation. + + Returns: + ndarray: Log Mel filterbank feature (#frames, num_mels). + + """ + # get amplitude spectrogram + x_stft = librosa.stft(audio, n_fft=fft_size, hop_length=hop_size, + win_length=win_length, window=window, pad_mode="reflect") + spc = np.abs(x_stft).T # (#frames, #bins) + + # get mel basis + fmin = 0 if fmin is None else fmin + fmax = sampling_rate / 2 if fmax is None else fmax + mel_basis = librosa.filters.mel(sr=sampling_rate, n_fft=fft_size, n_mels=num_mels, fmin=fmin, fmax=fmax) + + return np.log10(np.maximum(eps, np.dot(spc, mel_basis.T))) + + +class SpeechToSpeechDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + shuffle: bool = True, + normalize: bool = False, + reduction_factor: int = 1, + ): + self.audio_root, self.audio_names, inds, tot, self.wav_sizes, self.tgt_audios, self.tgt_sizes, self.tgt_spkembs = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + + self.normalize = normalize + self.reduction_factor = reduction_factor + logger.info( + f"reduction_factor={reduction_factor}, normalize={normalize}" + ) + + def get_audio(self, index): + import soundfile as sf + + wav_fbank = [] + for name in [self.audio_names[index], self.tgt_audios[index]]: + wav_path = os.path.join(self.audio_root, name) + wav, cur_sample_rate = sf.read(wav_path) + wav = torch.from_numpy(wav).float() + fbank = logmelfilterbank( + wav.view(-1).cpu().numpy(), 16000 + ) + fbank = torch.from_numpy(fbank).float() + wav = self.postprocess(wav, cur_sample_rate) + wav_fbank.append(wav) + wav_fbank.append(fbank) + src_wav, src_fbank, tgt_wav, tgt_fbank = wav_fbank + return src_wav, src_fbank, tgt_wav, tgt_fbank + + def __getitem__(self, index): + src_wav, src_fbank, tgt_wav, tgt_fbank = self.get_audio(index) + spkembs = np.load(os.path.join(self.audio_root, self.tgt_spkembs[index])) + spkembs = torch.from_numpy(spkembs).float() + name = self.audio_names[index].replace("/", ".").replace(".wav", "") + "-" + self.tgt_audios[index].replace("/", ".").replace(".wav", "") + ".wav" + return {"id": index, "source": src_wav, "target": tgt_fbank, "spkembs": spkembs, "audio_name": name, "tgt_name": self.tgt_audios[index]} + + def __len__(self): + return len(self.wav_sizes) + + def collater(self, samples): + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + + audio_size = max(audio_sizes) + collated_audios, padding_mask = self.collater_audio( + audios, audio_size + ) + + fbanks = [s["target"] for s in samples] + fbank_sizes = [len(s) for s in fbanks] + + collated_fbanks = _collate_frames(fbanks) + collated_fbanks_size = torch.tensor(fbank_sizes, dtype=torch.long) + + # thin out frames for reduction factor (B, Lmax, odim) -> (B, Lmax//r, odim) + if self.reduction_factor > 1: + collated_fbanks_in = collated_fbanks[:, self.reduction_factor - 1 :: self.reduction_factor] + collated_fbanks_size_in = collated_fbanks_size.new([torch.div(olen, self.reduction_factor, rounding_mode='floor') for olen in collated_fbanks_size]) + else: + collated_fbanks_in, collated_fbanks_size_in = collated_fbanks, collated_fbanks_size + + prev_output_tokens = torch.cat( + [collated_fbanks_in.new_zeros((collated_fbanks_in.shape[0], 1, collated_fbanks_in.shape[2])), collated_fbanks_in[:, :-1]], dim=1 + ) + + # make labels for stop prediction + labels = collated_fbanks.new_zeros(collated_fbanks.size(0), collated_fbanks.size(1)) + for i, l in enumerate(fbank_sizes): + labels[i, l - 1 :] = 1.0 + + spkembs = _collate_frames([s["spkembs"] for s in samples], is_audio_input=True) + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + "tgt_lengths": collated_fbanks_size_in, + "spkembs": spkembs, + "task_name": "s2s", + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "name": [s["audio_name"] for s in samples], + "tgt_name": [s["tgt_name"] for s in samples], + "net_input": net_input, + "labels": labels, + "dec_target": collated_fbanks, + "dec_target_lengths": collated_fbanks_size, + "src_lengths": torch.LongTensor(audio_sizes), + "task_name": "s2s", + "ntokens": sum(audio_sizes), + "target": collated_fbanks, + } + + return batch + + def collater_audio(self, audios, audio_size): + collated_audios = audios[0].new_zeros(len(audios), audio_size) + padding_mask = ( + torch.BoolTensor(collated_audios.shape).fill_(False) + ) + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + collated_audios[i] = torch.cat([audio, audio.new_full((-diff,), 0.0)]) + padding_mask[i, diff:] = True + else: + raise Exception("Diff should not be larger than 0") + return collated_audios, padding_mask + + + def num_tokens(self, index): + return self.wav_sizes[index] + + def size(self, index): + return self.wav_sizes[index], self.tgt_sizes[index] + + @property + def sizes(self): + return np.array(self.wav_sizes) + + @property + def can_reuse_epoch_itr_across_epochs(self): + """No cache dataset if dataset is large-scale. Cache dataset for small dataset.""" + return True + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.wav_sizes) + return np.lexsort(order)[::-1] + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechT5/speecht5/data/speech_to_text_dataset.py b/SpeechT5/speecht5/data/speech_to_text_dataset.py new file mode 100644 index 0000000..e0be666 --- /dev/null +++ b/SpeechT5/speecht5/data/speech_to_text_dataset.py @@ -0,0 +1,270 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import itertools +import logging +import os +from typing import Any, List, Optional + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils, Dictionary +from fairseq.data.fairseq_dataset import FairseqDataset + +logger = logging.getLogger(__name__) + + +def load_audio(manifest_path, max_keep, min_keep): + n_long, n_short = 0, 0 + names, inds, sizes = [], [], [] + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) >= 2, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + names.append(items[0]) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes + + +def load_label(label_path, inds, tot): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +class SpeechToTextDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + shuffle: bool = True, + normalize: bool = False, + store_labels: bool = True, + tgt_dict: Optional[Dictionary] = None, + tokenizer = None, + ): + self.audio_root, self.audio_names, inds, tot, self.wav_sizes = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + self.tgt_dict = tgt_dict + self.tokenizer = tokenizer + + self.num_labels = len(label_paths) + self.label_processors = label_processors + self.store_labels = store_labels + if store_labels: + self.label_list = [load_label(p, inds, tot) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot) for p in label_paths + ] + assert label_processors is None or len(label_processors) == self.num_labels + + self.normalize = normalize + logger.info( + f"normalize={normalize}" + ) + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + wav, cur_sample_rate = sf.read(wav_path) + wav = torch.from_numpy(wav).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.tokenizer is not None: + label = self.tokenizer.encode(label) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def __getitem__(self, index): + wav = self.get_audio(index) + labels = self.get_labels(index) + return {"id": index, "source": wav, "label_list": labels} + + def __len__(self): + return len(self.wav_sizes) + + def collater(self, samples): + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + + audio_size = max(audio_sizes) + collated_audios, padding_mask = self.collater_audio( + audios, audio_size + ) + + targets_by_label = [ + [s["label_list"][i] for s in samples] for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label(targets_by_label) + + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + decoder_target = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=False, + ) + decoder_target_lengths = torch.tensor( + [x.size(0) for x in decoder_label], dtype=torch.long + ) + prev_output_tokens = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos(), + left_pad=False, + move_eos_to_beginning=True, + ) + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + "task_name": "s2t", + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "target": decoder_target, + "target_lengths": decoder_target_lengths, + "task_name": "s2t", + "ntokens": ntokens_list[0] + } + + return batch + + def collater_audio(self, audios, audio_size): + collated_audios = audios[0].new_zeros(len(audios), audio_size) + padding_mask = ( + torch.BoolTensor(collated_audios.shape).fill_(False) + ) + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + collated_audios[i] = torch.cat([audio, audio.new_full((-diff,), 0.0)]) + padding_mask[i, diff:] = True + else: + raise Exception("Diff should not be larger than 0") + return collated_audios, padding_mask + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, [self.tgt_dict.pad()]) + for targets, pad in itr: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + return self.wav_sizes[index] + + @property + def sizes(self): + return np.array(self.wav_sizes) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.wav_sizes) + return np.lexsort(order)[::-1] + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechT5/speecht5/data/text_dataset.py b/SpeechT5/speecht5/data/text_dataset.py new file mode 100644 index 0000000..faa0120 --- /dev/null +++ b/SpeechT5/speecht5/data/text_dataset.py @@ -0,0 +1,476 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import math + +import numpy as np +import torch + +from fairseq.data import FairseqDataset, data_utils + + +def collate( + samples, + pad_idx, + eos_idx, + vocab, + left_pad_source=False, + left_pad_target=False, + input_feeding=True, + pad_to_length=None, +): + assert input_feeding + if len(samples) == 0: + return {} + + def merge(key, left_pad, move_eos_to_beginning=False, pad_to_length=None): + return data_utils.collate_tokens( + [s[key] for s in samples], + pad_idx, + eos_idx=None, # use eos_idx of each sample instead of vocab.eos() + left_pad=left_pad, + move_eos_to_beginning=move_eos_to_beginning, + pad_to_length=pad_to_length, + ) + + id = torch.LongTensor([s["id"] for s in samples]) + src_tokens = merge( + "source", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + # sort by descending source length + src_lengths = torch.LongTensor([s["source"].numel() for s in samples]) + src_lengths, sort_order = src_lengths.sort(descending=True) + id = id.index_select(0, sort_order) + src_tokens = src_tokens.index_select(0, sort_order) + + prev_output_tokens = None + target = None + if samples[0].get("target", None) is not None: + target = merge( + "target", + left_pad=left_pad_target, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + target = target.index_select(0, sort_order) + ntokens = sum(len(s["target"]) for s in samples) + + if input_feeding: + # we create a shifted version of targets for feeding the + # previous output token(s) into the next decoder step + prev_output_tokens = merge( + "target", + left_pad=left_pad_target, + move_eos_to_beginning=True, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + prev_output_tokens = prev_output_tokens.index_select(0, sort_order) + else: + ntokens = sum(len(s["source"]) for s in samples) + + batch = { + "id": id, + "ntokens": ntokens, + "net_input": { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + }, + "target": target, + "nsentences": samples[0]["source"].size(0), + "sort_order": sort_order, + "task_name": 'text_pretrain', + } + if prev_output_tokens is not None: + batch["net_input"]["prev_output_tokens"] = prev_output_tokens + + return batch + + +class TextPretrainDataset(FairseqDataset): + """ + A wrapper around TokenBlockDataset for BART dataset. + + Args: + dataset (TokenBlockDataset): dataset to wrap + sizes (List[int]): sentence lengths + vocab (~fairseq.data.Dictionary): vocabulary + mask_idx (int): dictionary index used for masked token + mask_whole_words: only mask whole words. This should be a byte mask + over vocab indices, indicating whether it is the beginning of a + word. We will extend any mask to encompass the whole word. + shuffle (bool, optional): shuffle the elements before batching. + Default: ``True`` + seed: Seed for random number generator for reproducibility. + args: argparse arguments. + """ + + def __init__( + self, + dataset, + sizes, + vocab, + mask_idx, + mask_whole_words, + shuffle, + seed, + args, + eos=None, + item_transform_func=None, + iid_noise_target=False, + uni_mask_idxs=None, + ): + self.dataset = dataset + + self.sizes = sizes + + self.vocab = vocab + self.shuffle = shuffle + self.seed = seed + if iid_noise_target: + assert isinstance(uni_mask_idxs, torch.Tensor), "if use iid_noise_target, the uni_mask_idxs must be a tensor which contain the mask indexs" + self.iid_noise_target = iid_noise_target + self.uni_mask_idxs = uni_mask_idxs + self.mask_idx = mask_idx + self.mask_whole_word = mask_whole_words + self.mask_ratio = args.mask + self.random_ratio = args.mask_random + self.insert_ratio = args.insert + self.rotate_ratio = args.rotate + self.permute_sentence_ratio = args.permute_sentences + self.eos = eos if eos is not None else vocab.eos() + self.item_transform_func = item_transform_func + + if args.bpe != "gpt2": + self.full_stop_index = self.vocab.eos() + else: + assert args.bpe == "gpt2" + self.full_stop_index = self.vocab.index("13") + + self.replace_length = args.replace_length + if self.replace_length not in [-1, 0, 1]: + raise ValueError(f"invalid arg: replace_length={self.replace_length}") + if args.mask_length not in ["subword", "word", "span-poisson"]: + raise ValueError(f"invalid arg: mask-length={args.mask_length}") + if args.mask_length == "subword" and args.replace_length not in [0, 1]: + raise ValueError(f"if using subwords, use replace-length=1 or 0") + + self.mask_span_distribution = None + if args.mask_length == "span-poisson": + _lambda = args.poisson_lambda + + lambda_to_the_k = 1 + e_to_the_minus_lambda = math.exp(-_lambda) + k_factorial = 1 + ps = [] + for k in range(0, 128): + ps.append(e_to_the_minus_lambda * lambda_to_the_k / k_factorial) + lambda_to_the_k *= _lambda + k_factorial *= k + 1 + if ps[-1] < 0.0000001: + break + ps = torch.FloatTensor(ps) + self.mask_span_distribution = torch.distributions.Categorical(ps) + + self.epoch = 0 + + @property + def can_reuse_epoch_itr_across_epochs(self): + return True # only the noise changes, not item sizes + + def set_epoch(self, epoch, **unused): + self.epoch = epoch + + def __getitem__(self, index): + with data_utils.numpy_seed(self.seed, self.epoch, index): + tokens = self.dataset[index] + assert tokens[-1] == self.eos + source, target = tokens, tokens.clone() + + if self.permute_sentence_ratio > 0.0: + source = self.permute_sentences(source, self.permute_sentence_ratio) + + if self.mask_ratio > 0: + source, new_target = self.add_whole_word_mask(source, self.mask_ratio) + if new_target is not None: + target = new_target + + if self.insert_ratio > 0: + source = self.add_insertion_noise(source, self.insert_ratio) + + if self.rotate_ratio > 0.0 and np.random.random() < self.rotate_ratio: + source = self.add_rolling_noise(source) + # there can additional changes to make: + if self.item_transform_func is not None: + source, target = self.item_transform_func(source, target) + + assert (source >= 0).all() + assert (source[1:-1] >= 1).all() + assert (source <= len(self.vocab)).all() + assert source[0] == self.vocab.bos() + assert source[-1] == self.eos + return { + "id": index, + "source": source, + "target": target, + } + + def __len__(self): + return len(self.dataset) + + def permute_sentences(self, source, p=1.0): + full_stops = source == self.full_stop_index + # Pretend it ends with a full stop so last span is a sentence + full_stops[-2] = 1 + + # Tokens that are full stops, where the previous token is not + sentence_ends = (full_stops[1:] * ~full_stops[:-1]).nonzero(as_tuple=False) + 2 + result = source.clone() + + num_sentences = sentence_ends.size(0) + num_to_permute = math.ceil((num_sentences * 2 * p) / 2.0) + substitutions = torch.randperm(num_sentences)[:num_to_permute] + ordering = torch.arange(0, num_sentences) + ordering[substitutions] = substitutions[torch.randperm(num_to_permute)] + + # Ignore <bos> at start + index = 1 + for i in ordering: + sentence = source[(sentence_ends[i - 1] if i > 0 else 1) : sentence_ends[i]] + result[index : index + sentence.size(0)] = sentence + index += sentence.size(0) + return result + + def word_starts(self, source): + if self.mask_whole_word is not None: + is_word_start = self.mask_whole_word.gather(0, source) + else: + is_word_start = torch.ones(source.size()) + is_word_start[0] = 0 + is_word_start[-1] = 0 + return is_word_start + + def add_whole_word_mask(self, source, p): + source_ori = source.clone() + is_word_start = self.word_starts(source) + num_to_mask = int(math.ceil(is_word_start.float().sum() * p)) + num_inserts = 0 + if num_to_mask == 0: + return source + + if self.mask_span_distribution is not None: + lengths = self.mask_span_distribution.sample(sample_shape=(num_to_mask,)) + + # Make sure we have enough to mask + cum_length = torch.cumsum(lengths, 0) + while cum_length[-1] < num_to_mask: + lengths = torch.cat( + [ + lengths, + self.mask_span_distribution.sample(sample_shape=(num_to_mask,)), + ], + dim=0, + ) + cum_length = torch.cumsum(lengths, 0) + + # Trim to masking budget + i = 0 + while cum_length[i] < num_to_mask: + i += 1 + lengths[i] = num_to_mask - (0 if i == 0 else cum_length[i - 1]) + num_to_mask = i + 1 + lengths = lengths[:num_to_mask] + + # Handle 0-length mask (inserts) separately + lengths = lengths[lengths > 0] + num_inserts = num_to_mask - lengths.size(0) + num_to_mask -= num_inserts + if num_to_mask == 0: + return self.add_insertion_noise(source, num_inserts / source.size(0)) + + assert (lengths > 0).all() + else: + lengths = torch.ones((num_to_mask,)).long() + assert is_word_start[-1] == 0 + word_starts = is_word_start.nonzero(as_tuple=False) + indices = word_starts[ + torch.randperm(word_starts.size(0))[:num_to_mask] + ].squeeze(1) + mask_random = torch.FloatTensor(num_to_mask).uniform_() < self.random_ratio + + source_length = source.size(0) + assert source_length - 1 not in indices + to_keep = torch.ones(source_length, dtype=torch.bool) + is_word_start[ + -1 + ] = 255 # acts as a long length, so spans don't go over the end of doc + if self.replace_length == 0: + to_keep[indices] = 0 + else: + # keep index, but replace it with [MASK] + source[indices] = self.mask_idx + source[indices[mask_random]] = torch.randint( + 1, len(self.vocab), size=(mask_random.sum(),) + ) + + if self.mask_span_distribution is not None: + assert len(lengths.size()) == 1 + assert lengths.size() == indices.size() + lengths -= 1 + while indices.size(0) > 0: + assert lengths.size() == indices.size() + lengths -= is_word_start[indices + 1].long() + uncompleted = lengths >= 0 + indices = indices[uncompleted] + 1 + mask_random = mask_random[uncompleted] + lengths = lengths[uncompleted] + if self.replace_length != -1: + # delete token + to_keep[indices] = 0 + else: + # keep index, but replace it with [MASK] + source[indices] = self.mask_idx + source[indices[mask_random]] = torch.randint( + 1, len(self.vocab), size=(mask_random.sum(),) + ) + else: + # A bit faster when all lengths are 1 + while indices.size(0) > 0: + uncompleted = is_word_start[indices + 1] == 0 + indices = indices[uncompleted] + 1 + mask_random = mask_random[uncompleted] + if self.replace_length != -1: + # delete token + to_keep[indices] = 0 + else: + # keep index, but replace it with [MASK] + source[indices] = self.mask_idx + source[indices[mask_random]] = torch.randint( + 1, len(self.vocab), size=(mask_random.sum(),) + ) + + assert source_length - 1 not in indices + + if not self.iid_noise_target: + source = source[to_keep] + target = None + else: + ## Prepare source + source_mask_idx = (source == self.mask_idx).nonzero().view(-1) + source[source_mask_idx] = self.uni_mask_idxs[:source_mask_idx.size(0)] + source = source[to_keep] + + ## Prepare target + to_keep[source_mask_idx] = 0 + + # source_mask_idx: from [a, b, c, ...] to [a, b + 1, c + 2, ...] + source_mask_idx = source_mask_idx + torch.arange(source_mask_idx.size(0)) + # target: source_length + mask_length + target = source_ori.new_zeros(source_mask_idx.size(0) + source_ori.size(0)) + # target: [0, 0, 0, X, 0, 0, Y, ....] + target[source_mask_idx] = self.uni_mask_idxs[:source_mask_idx.size(0)] + + target_to_keep = to_keep.new_zeros(source_mask_idx.size(0) + source_ori.size(0)) + + # Copy original value to target and target_to_keep + target_to_keep[target == 0] = to_keep + target_to_keep[-1] = 0 + target[target == 0] = source_ori + + target = target[~target_to_keep] + + if num_inserts > 0: + source = self.add_insertion_noise(source, num_inserts / source.size(0)) + + return source, target + + def add_permuted_noise(self, tokens, p): + num_words = len(tokens) + num_to_permute = math.ceil(((num_words * 2) * p) / 2.0) + substitutions = torch.randperm(num_words - 2)[:num_to_permute] + 1 + tokens[substitutions] = tokens[substitutions[torch.randperm(num_to_permute)]] + return tokens + + def add_rolling_noise(self, tokens): + offset = np.random.randint(1, max(1, tokens.size(-1) - 1) + 1) + tokens = torch.cat( + (tokens[0:1], tokens[offset:-1], tokens[1:offset], tokens[-1:]), + dim=0, + ) + return tokens + + def add_insertion_noise(self, tokens, p): + if p == 0.0: + return tokens + + num_tokens = len(tokens) + n = int(math.ceil(num_tokens * p)) + + noise_indices = torch.randperm(num_tokens + n - 2)[:n] + 1 + noise_mask = torch.zeros(size=(num_tokens + n,), dtype=torch.bool) + noise_mask[noise_indices] = 1 + result = torch.LongTensor(n + len(tokens)).fill_(-1) + + num_random = int(math.ceil(n * self.random_ratio)) + result[noise_indices[num_random:]] = self.mask_idx + result[noise_indices[:num_random]] = torch.randint( + low=1, high=len(self.vocab), size=(num_random,) + ) + + result[~noise_mask] = tokens + + assert (result >= 0).all() + return result + + def collater(self, samples, pad_to_length=None): + """Merge a list of samples to form a mini-batch. + Args: + samples (List[dict]): samples to collate + Returns: + dict: a mini-batch of data + """ + return collate( + samples, self.vocab.pad(), self.eos, self.vocab, pad_to_length=pad_to_length + ) + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return self.sizes[index] + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return self.sizes[index] + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + indices = np.random.permutation(len(self)) + else: + indices = np.arange(len(self)) + return indices[np.argsort(self.sizes[indices], kind="mergesort")] + + def prefetch(self, indices): + self.src.prefetch(indices) + self.tgt.prefetch(indices) + + @property + def supports_prefetch(self): + return ( + hasattr(self.src, "supports_prefetch") + and self.src.supports_prefetch + and hasattr(self.tgt, "supports_prefetch") + and self.tgt.supports_prefetch + ) diff --git a/SpeechT5/speecht5/data/text_to_speech_dataset.py b/SpeechT5/speecht5/data/text_to_speech_dataset.py new file mode 100644 index 0000000..e0e0d75 --- /dev/null +++ b/SpeechT5/speecht5/data/text_to_speech_dataset.py @@ -0,0 +1,331 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import itertools +import logging +import os +from typing import Any, List, Optional + +import numpy as np + +import torch +import torch.nn.functional as F +import librosa +from fairseq.data.audio.speech_to_text_dataset import get_features_or_waveform +from fairseq.data import data_utils, Dictionary +from fairseq.data.fairseq_dataset import FairseqDataset + + +logger = logging.getLogger(__name__) + +def _collate_frames( + frames: List[torch.Tensor], is_audio_input: bool = False +): + """ + Convert a list of 2D frames into a padded 3D tensor + Args: + frames (list): list of 2D frames of size L[i]*f_dim. Where L[i] is + length of i-th frame and f_dim is static dimension of features + Returns: + 3D tensor of size len(frames)*len_max*f_dim where len_max is max of L[i] + """ + max_len = max(frame.size(0) for frame in frames) + if is_audio_input: + out = frames[0].new_zeros((len(frames), max_len)) + else: + out = frames[0].new_zeros((len(frames), max_len, frames[0].size(1))) + for i, v in enumerate(frames): + out[i, : v.size(0)] = v + return out + +def load_audio(manifest_path, max_keep, min_keep): + n_long, n_short = 0, 0 + names, inds, sizes, spk_embeds = [], [], [], [] + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) == 3, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + names.append(items[0]) + spk_embeds.append(items[2]) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes, spk_embeds + + +def load_label(label_path, inds, tot): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def logmelfilterbank( + audio, + sampling_rate, + fft_size=1024, + hop_size=256, + win_length=None, + window="hann", + num_mels=80, + fmin=80, + fmax=7600, + eps=1e-10, +): + """Compute log-Mel filterbank feature. + (https://github.com/kan-bayashi/ParallelWaveGAN/blob/master/parallel_wavegan/bin/preprocess.py) + + Args: + audio (ndarray): Audio signal (T,). + sampling_rate (int): Sampling rate. + fft_size (int): FFT size. + hop_size (int): Hop size. + win_length (int): Window length. If set to None, it will be the same as fft_size. + window (str): Window function type. + num_mels (int): Number of mel basis. + fmin (int): Minimum frequency in mel basis calculation. + fmax (int): Maximum frequency in mel basis calculation. + eps (float): Epsilon value to avoid inf in log calculation. + + Returns: + ndarray: Log Mel filterbank feature (#frames, num_mels). + + """ + # get amplitude spectrogram + x_stft = librosa.stft(audio, n_fft=fft_size, hop_length=hop_size, + win_length=win_length, window=window, pad_mode="reflect") + spc = np.abs(x_stft).T # (#frames, #bins) + + # get mel basis + fmin = 0 if fmin is None else fmin + fmax = sampling_rate / 2 if fmax is None else fmax + mel_basis = librosa.filters.mel(sr=sampling_rate, n_fft=fft_size, n_mels=num_mels, fmin=fmin, fmax=fmax) + + return np.log10(np.maximum(eps, np.dot(spc, mel_basis.T))) + + + +class TextToSpeechDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + shuffle: bool = True, + normalize: bool = False, + store_labels: bool = True, + src_dict: Optional[Dictionary] = None, + tokenizer = None, + reduction_factor: int = 1, + ): + self.audio_root, self.audio_names, inds, tot, self.wav_sizes, self.spk_embeds = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + self.src_dict = src_dict + self.tokenizer = tokenizer + + self.num_labels = len(label_paths) + self.label_processors = label_processors + self.store_labels = store_labels + if store_labels: + self.label_list = [load_label(p, inds, tot) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot) for p in label_paths + ] + assert label_processors is None or len(label_processors) == self.num_labels + + self.normalize = normalize + self.reduction_factor = reduction_factor + logger.info( + f"reduction_factor={reduction_factor}, normalize={normalize}" + ) + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + wav, cur_sample_rate = sf.read(wav_path) + wav = torch.from_numpy(wav).float() + fbank = logmelfilterbank( + wav.view(-1).cpu().numpy(), 16000 + ) + fbank = torch.from_numpy(fbank).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav, fbank + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.tokenizer is not None: + label = self.tokenizer.encode(label) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def __getitem__(self, index): + wav, fbank = self.get_audio(index) + labels = self.get_labels(index) + spkembs = get_features_or_waveform( + os.path.join(self.audio_root, self.spk_embeds[index]) + ) + spkembs = torch.from_numpy(spkembs).float() + return {"id": index, "source": labels, "target": fbank, "spkembs": spkembs, "audio_name": self.audio_names[index]} + + def __len__(self): + return len(self.wav_sizes) + + def collater(self, samples): + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + fbanks = [s["target"] for s in samples] + fbank_sizes = [len(s) for s in fbanks] + + collated_fbanks = _collate_frames(fbanks) + collated_fbanks_size = torch.tensor(fbank_sizes, dtype=torch.long) + + # thin out frames for reduction factor (B, Lmax, odim) -> (B, Lmax//r, odim) + if self.reduction_factor > 1: + collated_fbanks_in = collated_fbanks[:, self.reduction_factor - 1 :: self.reduction_factor] + collated_fbanks_size_in = collated_fbanks_size.new([torch.div(olen, self.reduction_factor, rounding_mode='floor') for olen in collated_fbanks_size]) + else: + collated_fbanks_in, collated_fbanks_size_in = collated_fbanks, collated_fbanks_size + + prev_output_tokens = torch.cat( + [collated_fbanks_in.new_zeros((collated_fbanks_in.shape[0], 1, collated_fbanks_in.shape[2])), collated_fbanks_in[:, :-1]], dim=1 + ) + + # make labels for stop prediction + labels = collated_fbanks.new_zeros(collated_fbanks.size(0), collated_fbanks.size(1)) + for i, l in enumerate(fbank_sizes): + labels[i, l - 1 :] = 1.0 + + spkembs = _collate_frames([s["spkembs"] for s in samples], is_audio_input=True) + + sources_by_label = [ + [s["source"][i] for s in samples] for i in range(self.num_labels) + ] + sources_list, lengths_list, ntokens_list = self.collater_label(sources_by_label) + + net_input = { + "src_tokens": sources_list[0], + "src_lengths": lengths_list[0], + "prev_output_tokens": prev_output_tokens, + "tgt_lengths": collated_fbanks_size_in, + "spkembs": spkembs, + "task_name": "t2s", + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "name": [s["audio_name"] for s in samples], + "net_input": net_input, + "labels": labels, + "dec_target": collated_fbanks, + "dec_target_lengths": collated_fbanks_size, + "src_lengths": lengths_list[0], + "task_name": "t2s", + "ntokens": ntokens_list[0], + "target": collated_fbanks, + } + + return batch + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, [self.src_dict.pad()]) + for targets, pad in itr: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + return self.wav_sizes[index] + + @property + def sizes(self): + return np.array(self.wav_sizes) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.wav_sizes) + return np.lexsort(order)[::-1] + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechT5/speecht5/models/__init__.py b/SpeechT5/speecht5/models/__init__.py new file mode 100644 index 0000000..d8db7a7 --- /dev/null +++ b/SpeechT5/speecht5/models/__init__.py @@ -0,0 +1,2 @@ +from .speecht5 import * # noqa +from .t5_transformer_lm import * # noqa diff --git a/SpeechT5/speecht5/models/modules/__init__.py b/SpeechT5/speecht5/models/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/speecht5/models/modules/decoder.py b/SpeechT5/speecht5/models/modules/decoder.py new file mode 100644 index 0000000..a066d1d --- /dev/null +++ b/SpeechT5/speecht5/models/modules/decoder.py @@ -0,0 +1,324 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +from typing import Any, Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import ( + FairseqIncrementalDecoder, +) +from fairseq.modules import ( + FairseqDropout, + LayerDropModuleList, + LayerNorm, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from torch import Tensor + +from .encoder import RelativePositionalEncoding +from .transformer_layer import TransformerDecoderLayer + +DEFAULT_MIN_PARAMS_TO_WRAP = int(1e8) + + +class TransformerDecoder(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + args, + no_encoder_attn=False, + ): + self.args = args + super().__init__(None) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.decoder_layerdrop = args.decoder_layerdrop + # self.max_s_positions = args.max_target_positions + export = getattr(args, "export", False) + self.cross_self_attention = getattr(args, "cross_self_attention", False) + + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + self.build_decoder_layer(args, no_encoder_attn) + for _ in range(args.decoder_layers) + ] + ) + self.num_layers = len(self.layers) + + if args.decoder_normalize_before and not getattr( + args, "no_decoder_final_norm", False + ): + self.layer_norm = LayerNorm(args.decoder_embed_dim, eps=args.layer_norm_eps, export=export) + else: + self.layer_norm = None + + if args.relative_position_embedding: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim//args.encoder_attention_heads, args.decoder_max_relative_position) + + def build_decoder_layer(self, args, no_encoder_attn=False): + layer = TransformerDecoderLayer(args, no_encoder_attn=no_encoder_attn, has_relative_attention_bias=args.relative_position_embedding) + checkpoint = getattr(args, "checkpoint_activations", False) + if checkpoint: + offload_to_cpu = getattr(args, "offload_activations", False) + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = ( + getattr(args, "min_params_to_wrap", DEFAULT_MIN_PARAMS_TO_WRAP) + if not checkpoint + else 0 + ) + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + tgt_mask, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + tgt_mask, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + ) + + return x, extra + + def extract_features( + self, + prev_output_tokens, + tgt_mask, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + return self.extract_features_scriptable( + prev_output_tokens, + tgt_mask, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + + """ + A scriptable subclass of this class has an extract_features method and calls + super().extract_features, but super() is not supported in torchscript. A copy of + this function is made to be used in the subclass instead. + """ + + def extract_features_scriptable( + self, + prev_output_tokens, + tgt_mask, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs = prev_output_tokens.size(0) + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # B x T x C -> T x B x C + x = prev_output_tokens.transpose(0, 1) + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or tgt_mask is not None: + self_attn_padding_mask = tgt_mask + + ## relative position embedding + if self.args.relative_position_embedding: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + # decoder layers + attn_list = [] + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer or alignment_layer == -1)), + need_head_weights=bool((idx == alignment_layer or alignment_layer == -1)), + pos_bias=pos_k, + ) + inner_states.append(x) + if layer_attn is not None and (idx == alignment_layer or alignment_layer == -1): + attn = layer_attn.float().to(x) + attn_list.append(attn.transpose(0, 1)) + + if attn is not None and len(attn_list) == 1: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + return x, {"attn": [attn if len(attn_list) <= 1 else attn_list], "inner_states": inner_states} + + # def max_positions(self): + # """Maximum output length supported by the decoder.""" + # return self.max_target_positions + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim], device=tensor.device)), 1, + ) + else: + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + def set_num_updates(self, num_updates): + """State from trainer to pass along to model at every update.""" + + def _apply(m): + if hasattr(m, "set_num_updates") and m != self: + m.set_num_updates(num_updates) + + self.apply(_apply) diff --git a/SpeechT5/speecht5/models/modules/encoder.py b/SpeechT5/speecht5/models/modules/encoder.py new file mode 100644 index 0000000..0deb193 --- /dev/null +++ b/SpeechT5/speecht5/models/modules/encoder.py @@ -0,0 +1,381 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +from typing import Dict, List + +import numpy as np +import torch +import torch.nn as nn +import contextlib +from fairseq import utils +from fairseq.models import ( + FairseqEncoder, +) +from fairseq.modules import ( + FairseqDropout, + LayerNorm, + TransformerEncoderLayer, +) +from torch import Tensor +from .transformer_layer import TransformerSentenceEncoderLayer + + + +DEFAULT_MIN_PARAMS_TO_WRAP = int(1e8) + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + + +class RelativePositionalEncoding(torch.nn.Module): + def __init__(self, d_model, maxlen=1000, embed_v=False): + super(RelativePositionalEncoding, self).__init__() + + self.d_model = d_model + self.maxlen = maxlen + self.pe_k = torch.nn.Embedding(2*maxlen, d_model) + if embed_v: + self.pe_v = torch.nn.Embedding(2*maxlen, d_model) + self.embed_v = embed_v + + + def forward(self, pos_seq): + pos_seq[pos_seq < -self.maxlen] = -self.maxlen + pos_seq[pos_seq >= self.maxlen] = self.maxlen - 1 + pos_seq = pos_seq + self.maxlen + if self.embed_v: + return self.pe_k(pos_seq), self.pe_v(pos_seq) + else: + return self.pe_k(pos_seq), None + +class TransformerEncoder(FairseqEncoder): + """ + Transformer encoder consisting of *args.encoder_layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, args, tgt_dict=None, embed_tokens=None): + self.args = args + super().__init__(None) + self.register_buffer("version", torch.Tensor([3])) + + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.encoder_layerdrop = args.encoder_layerdrop + self.freeze_encoder_updates = args.freeze_encoder_updates + if args.no_freeze_encoder_layer is not None: + self.no_freeze_encoder_layer = eval(args.no_freeze_encoder_layer) + else: + self.no_freeze_encoder_layer = None + self.num_updates = 0 + export = getattr(args, "export", False) + + self.layers = nn.ModuleList([]) + self.layers.extend( + [self.build_encoder_layer(args) for i in range(args.encoder_layers)] + ) + self.num_layers = len(self.layers) + + self.use_sent_enc_layer = args.use_sent_enc_layer + self.unb_enc_layer = getattr(args, "unb_enc_layer", -1) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(args.encoder_embed_dim, eps=args.layer_norm_eps, export=export) + + if args.share_ctc_embed and embed_tokens is not None: + self.proj = nn.Linear( + embed_tokens.weight.shape[1], + embed_tokens.weight.shape[0], + bias=False, + ) + self.proj.weight = embed_tokens.weight + elif tgt_dict is not None: + self.proj = Linear(args.encoder_embed_dim, len(tgt_dict)) + else: + self.proj = None + + if args.relative_position_embedding: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim//args.encoder_attention_heads, args.encoder_max_relative_position) + + + def build_encoder_layer(self, args): + if args.use_sent_enc_layer: + layer = TransformerSentenceEncoderLayer( + embedding_dim=args.encoder_embed_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=args.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + has_relative_attention_bias=args.relative_position_embedding, + ) + else: + layer = TransformerEncoderLayer(args) + return layer + + def forward( + self, + encoder_in, + encoder_padding_mask, + return_all_hiddens: bool = False, + tgt_layer=None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + if self.no_freeze_encoder_layer is None: + ft = self.freeze_encoder_updates <= self.num_updates + else: + ft = True + with torch.no_grad() if not ft else contextlib.ExitStack(): + encoder_out = self.forward_scriptable( + encoder_in, encoder_padding_mask, return_all_hiddens, tgt_layer=tgt_layer, + ) + + # CTC and bert + if self.proj: + x_for_ctc = self.proj(self.dropout_module(encoder_out["encoder_out"][0])) + else: + x_for_ctc = None + + encoder_out["encoder_out_for_ctc"] = [x_for_ctc] # T x B x C + + return encoder_out + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def forward_scriptable( + self, + encoder_in, + encoder_padding_mask, + return_all_hiddens: bool = False, + tgt_layer=None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + if self.no_freeze_encoder_layer is not None: + ft = self.freeze_encoder_updates <= self.num_updates + else: + ft = True + with torch.no_grad() if not ft else contextlib.ExitStack(): + # compute padding mask + if not self.use_sent_enc_layer: + has_pads = encoder_in.device.type == "xla" or encoder_padding_mask.any() + + if not self.layer_norm_first: + encoder_in = self.layer_norm(encoder_in) + + encoder_in = self.dropout_module(encoder_in) + + # B x T x C -> T x B x C + x = encoder_in.transpose(0, 1) + + encoder_states = [] + + if return_all_hiddens: + encoder_states.append(x) + + ## relative position embedding + if self.args.relative_position_embedding: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + # encoder layers + r = None + d = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + + with torch.no_grad() if (not ft) and i not in self.no_freeze_encoder_layer else contextlib.ExitStack(): + if not self.training or (dropout_probability > self.encoder_layerdrop) or i == self.unb_enc_layer: + if self.use_sent_enc_layer: + x, _ = layer(x, self_attn_padding_mask=encoder_padding_mask, self_attn_mask=None, need_weights=False, pos_bias=pos_k) + # x, _ = layer(x, self_attn_padding_mask=encoder_padding_mask, need_weights=False, pos_bias=pos_k) + else: + x = layer(x, encoder_padding_mask=encoder_padding_mask if has_pads else None, attn_mask=None) + # x = layer(x, encoder_padding_mask=encoder_padding_mask if has_pads else None) + if i == self.unb_enc_layer: + d = x + + if i == tgt_layer: + r = x + break + + if return_all_hiddens: + assert encoder_states is not None + encoder_states.append(x) + + with torch.no_grad() if not ft else contextlib.ExitStack(): + # Finally T x B x C + if self.layer_norm_first: + x = self.layer_norm(x.transpose(0, 1)).transpose(0, 1) + + if r is not None: + x = r + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `forward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [encoder_padding_mask], # B x T + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": [], + "decoder_input": [d], + } + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if len(encoder_out["encoder_out"]) == 0: + new_encoder_out = [] + else: + new_encoder_out = [encoder_out["encoder_out"][0].index_select(1, new_order)] + + if len(encoder_out["encoder_out_for_ctc"]) == 0: + new_x_for_ctc = [] + else: + new_x_for_ctc = [encoder_out["encoder_out_for_ctc"][0].index_select(1, new_order)] + + if len(encoder_out["encoder_padding_mask"]) == 0: + new_encoder_padding_mask = [] + else: + new_encoder_padding_mask = [ + encoder_out["encoder_padding_mask"][0].index_select(0, new_order) + ] + + if len(encoder_out["src_tokens"]) == 0: + src_tokens = [] + else: + src_tokens = [(encoder_out["src_tokens"][0]).index_select(0, new_order)] + + if len(encoder_out["decoder_input"]) == 0 or encoder_out["decoder_input"][0] is None: + new_decoder_input = [] + else: + new_decoder_input = [ + encoder_out["decoder_input"][0].index_select(0, new_order) + ] + + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, # T x B x C + "encoder_padding_mask": new_encoder_padding_mask, # B x T + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": src_tokens, # B x T + "encoder_out_for_ctc": new_x_for_ctc, # T x B x C + "decoder_input": new_decoder_input, + } + + # def max_positions(self): + # """Maximum input length supported by the encoder.""" + # return self.max_source_positions + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + # if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + # weights_key = "{}.embed_positions.weights".format(name) + # if weights_key in state_dict: + # print("deleting {0}".format(weights_key)) + # del state_dict[weights_key] + # state_dict[ + # "{}.embed_positions._float_tensor".format(name) + # ] = torch.FloatTensor(1) + for i in range(self.num_layers): + # update layer norms + if not isinstance(self.layers[i], TransformerSentenceEncoderLayer): + self.layers[i].upgrade_state_dict_named( + state_dict, "{}.layers.{}".format(name, i) + ) + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) < 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + return state_dict + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + \ No newline at end of file diff --git a/SpeechT5/speecht5/models/modules/multihead_attention.py b/SpeechT5/speecht5/models/modules/multihead_attention.py new file mode 100644 index 0000000..fb126ef --- /dev/null +++ b/SpeechT5/speecht5/models/modules/multihead_attention.py @@ -0,0 +1,522 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import math +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.incremental_decoding_utils import with_incremental_state +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.quant_noise import quant_noise +from torch import Tensor, nn +from torch.nn import Parameter + + +@with_incremental_state +class MultiheadAttention(nn.Module): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + has_relative_attention_bias=False, + ): + super().__init__() + self.embed_dim = embed_dim + self.kdim = kdim if kdim is not None else embed_dim + self.vdim = vdim if vdim is not None else embed_dim + self.qkv_same_dim = self.kdim == embed_dim and self.vdim == embed_dim + + self.num_heads = num_heads + self.dropout_module = FairseqDropout( + dropout, module_name=self.__class__.__name__ + ) + + self.has_relative_attention_bias = has_relative_attention_bias + self.head_dim = embed_dim // num_heads + assert ( + self.head_dim * num_heads == self.embed_dim + ), "embed_dim must be divisible by num_heads" + self.scaling = self.head_dim ** -0.5 + + self.self_attention = self_attention + self.encoder_decoder_attention = encoder_decoder_attention + + assert not self.self_attention or self.qkv_same_dim, ( + "Self-attention requires query, key and " "value to be of the same size" + ) + + self.k_proj = quant_noise( + nn.Linear(self.kdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.v_proj = quant_noise( + nn.Linear(self.vdim, embed_dim, bias=bias), q_noise, qn_block_size + ) + self.q_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + self.out_proj = quant_noise( + nn.Linear(embed_dim, embed_dim, bias=bias), q_noise, qn_block_size + ) + + if add_bias_kv: + self.bias_k = Parameter(torch.Tensor(1, 1, embed_dim)) + self.bias_v = Parameter(torch.Tensor(1, 1, embed_dim)) + else: + self.bias_k = self.bias_v = None + + self.add_zero_attn = add_zero_attn + + self.reset_parameters() + + self.onnx_trace = False + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def reset_parameters(self): + if self.qkv_same_dim: + # Empirically observed the convergence to be much better with + # the scaled initialization + nn.init.xavier_uniform_(self.k_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.v_proj.weight, gain=1 / math.sqrt(2)) + nn.init.xavier_uniform_(self.q_proj.weight, gain=1 / math.sqrt(2)) + else: + nn.init.xavier_uniform_(self.k_proj.weight) + nn.init.xavier_uniform_(self.v_proj.weight) + nn.init.xavier_uniform_(self.q_proj.weight) + + nn.init.xavier_uniform_(self.out_proj.weight) + if self.out_proj.bias is not None: + nn.init.constant_(self.out_proj.bias, 0.0) + if self.bias_k is not None: + nn.init.xavier_normal_(self.bias_k) + if self.bias_v is not None: + nn.init.xavier_normal_(self.bias_v) + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + position_bias: Optional[Tensor] = None + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + and not self.has_relative_attention_bias + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + if position_bias is not None and self.has_relative_attention_bias: ## first order + ## position_bias: [241, 241, 64] + #print ("attn_weights: ", attn_weights.size()) # [492, 241, 241] + reshape_q = q.contiguous().view(bsz * self.num_heads, -1, self.head_dim).transpose(0,1) #[241, 492, 64] + #print ("reshape_q: ", reshape_q.size()) + B = torch.matmul(reshape_q, position_bias.transpose(-2, -1)) + #print ("B: ", B.size()) ## [241, 492, 241] + #B = B.transpose(0, 1).view(bsz, self.num_heads, position_bias.size(0), position_bias.size(1)) + B = B.transpose(0, 1).view(bsz*self.num_heads, position_bias.size(0), position_bias.size(1)) + #print ("B 2: ", B.size()) + attn_weights += B + else: + position_bias = None + + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights + + @staticmethod + def _append_prev_key_padding_mask( + key_padding_mask: Optional[Tensor], + prev_key_padding_mask: Optional[Tensor], + batch_size: int, + src_len: int, + static_kv: bool, + ) -> Optional[Tensor]: + # saved key padding masks have shape (bsz, seq_len) + if prev_key_padding_mask is not None and static_kv: + new_key_padding_mask = prev_key_padding_mask + elif prev_key_padding_mask is not None and key_padding_mask is not None: + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), key_padding_mask.float()], dim=1 + ) + # During incremental decoding, as the padding token enters and + # leaves the frame, there will be a time when prev or current + # is None + elif prev_key_padding_mask is not None: + if src_len > prev_key_padding_mask.size(1): + filler = torch.zeros( + (batch_size, src_len - prev_key_padding_mask.size(1)), + device=prev_key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [prev_key_padding_mask.float(), filler.float()], dim=1 + ) + else: + new_key_padding_mask = prev_key_padding_mask.float() + elif key_padding_mask is not None: + if src_len > key_padding_mask.size(1): + filler = torch.zeros( + (batch_size, src_len - key_padding_mask.size(1)), + device=key_padding_mask.device, + ) + new_key_padding_mask = torch.cat( + [filler.float(), key_padding_mask.float()], dim=1 + ) + else: + new_key_padding_mask = key_padding_mask.float() + else: + new_key_padding_mask = prev_key_padding_mask + return new_key_padding_mask + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + """Reorder buffered internal state (for incremental generation).""" + input_buffer = self._get_input_buffer(incremental_state) + if input_buffer is not None: + for k in input_buffer.keys(): + input_buffer_k = input_buffer[k] + if input_buffer_k is not None: + if self.encoder_decoder_attention and input_buffer_k.size( + 0 + ) == new_order.size(0): + break + input_buffer[k] = input_buffer_k.index_select(0, new_order) + incremental_state = self._set_input_buffer(incremental_state, input_buffer) + return incremental_state + + def _get_input_buffer( + self, incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] + ) -> Dict[str, Optional[Tensor]]: + result = self.get_incremental_state(incremental_state, "attn_state") + if result is not None: + return result + else: + empty_result: Dict[str, Optional[Tensor]] = {} + return empty_result + + def _set_input_buffer( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + buffer: Dict[str, Optional[Tensor]], + ): + return self.set_incremental_state(incremental_state, "attn_state", buffer) + + def apply_sparse_mask(self, attn_weights, tgt_len: int, src_len: int, bsz: int): + return attn_weights + + def upgrade_state_dict_named(self, state_dict, name): + prefix = name + "." if name != "" else "" + items_to_add = {} + keys_to_remove = [] + for k in state_dict.keys(): + if k.endswith(prefix + "in_proj_weight"): + # in_proj_weight used to be q + k + v with same dimensions + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.weight"] = state_dict[k][:dim] + items_to_add[prefix + "k_proj.weight"] = state_dict[k][dim : 2 * dim] + items_to_add[prefix + "v_proj.weight"] = state_dict[k][2 * dim :] + + keys_to_remove.append(k) + + k_bias = prefix + "in_proj_bias" + if k_bias in state_dict.keys(): + dim = int(state_dict[k].shape[0] / 3) + items_to_add[prefix + "q_proj.bias"] = state_dict[k_bias][:dim] + items_to_add[prefix + "k_proj.bias"] = state_dict[k_bias][ + dim : 2 * dim + ] + items_to_add[prefix + "v_proj.bias"] = state_dict[k_bias][2 * dim :] + + keys_to_remove.append(prefix + "in_proj_bias") + + for k in keys_to_remove: + del state_dict[k] + + for key, value in items_to_add.items(): + state_dict[key] = value diff --git a/SpeechT5/speecht5/models/modules/speaker_decoder_postnet.py b/SpeechT5/speecht5/models/modules/speaker_decoder_postnet.py new file mode 100644 index 0000000..555ddef --- /dev/null +++ b/SpeechT5/speecht5/models/modules/speaker_decoder_postnet.py @@ -0,0 +1,197 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import torch.nn as nn +import math +import torch +import torch.nn.functional as F + + +class AngularMargin(nn.Module): + """ + An implementation of Angular Margin (AM) proposed in the following + paper: '''Margin Matters: Towards More Discriminative Deep Neural Network + Embeddings for Speaker Recognition''' (https://arxiv.org/abs/1906.07317) + + Arguments + --------- + margin : float + The margin for cosine similiarity + scale : float + The scale for cosine similiarity + + Return + --------- + predictions : torch.Tensor + + Example + ------- + >>> pred = AngularMargin() + >>> outputs = torch.tensor([ [1., -1.], [-1., 1.], [0.9, 0.1], [0.1, 0.9] ]) + >>> targets = torch.tensor([ [1., 0.], [0., 1.], [ 1., 0.], [0., 1.] ]) + >>> predictions = pred(outputs, targets) + >>> predictions[:,0] > predictions[:,1] + tensor([ True, False, True, False]) + """ + + def __init__(self, margin=0.0, scale=1.0): + super(AngularMargin, self).__init__() + self.margin = margin + self.scale = scale + + def forward(self, outputs, targets): + """Compute AM between two tensors + + Arguments + --------- + outputs : torch.Tensor + The outputs of shape [N, C], cosine similarity is required. + targets : torch.Tensor + The targets of shape [N, C], where the margin is applied for. + + Return + --------- + predictions : torch.Tensor + """ + outputs = outputs - self.margin * targets + return self.scale * outputs + + +class AdditiveAngularMargin(AngularMargin): + """ + An implementation of Additive Angular Margin (AAM) proposed + in the following paper: '''Margin Matters: Towards More Discriminative Deep + Neural Network Embeddings for Speaker Recognition''' + (https://arxiv.org/abs/1906.07317) + + Arguments + --------- + margin : float + The margin for cosine similiarity, usually 0.2. + scale: float + The scale for cosine similiarity, usually 30. + + Returns + ------- + predictions : torch.Tensor + Tensor. + Example + ------- + >>> outputs = torch.tensor([ [1., -1.], [-1., 1.], [0.9, 0.1], [0.1, 0.9] ]) + >>> targets = torch.tensor([ [1., 0.], [0., 1.], [ 1., 0.], [0., 1.] ]) + >>> pred = AdditiveAngularMargin() + >>> predictions = pred(outputs, targets) + >>> predictions[:,0] > predictions[:,1] + tensor([ True, False, True, False]) + """ + + def __init__(self, margin=0.0, scale=1.0, easy_margin=False): + super(AdditiveAngularMargin, self).__init__(margin, scale) + self.easy_margin = easy_margin + + self.cos_m = math.cos(self.margin) + self.sin_m = math.sin(self.margin) + self.th = math.cos(math.pi - self.margin) + self.mm = math.sin(math.pi - self.margin) * self.margin + + def forward(self, outputs, targets): + """ + Compute AAM between two tensors + + Arguments + --------- + outputs : torch.Tensor + The outputs of shape [N, C], cosine similarity is required. + targets : torch.Tensor + The targets of shape [N, C], where the margin is applied for. + + Return + --------- + predictions : torch.Tensor + """ + cosine = outputs.float() + sine = torch.sqrt((1.0 - torch.pow(cosine, 2)).clamp(0, 1)) + phi = cosine * self.cos_m - sine * self.sin_m # cos(theta + m) + if self.easy_margin: + phi = torch.where(cosine > 0, phi, cosine) + else: + phi = torch.where(cosine > self.th, phi, cosine - self.mm) + outputs = (targets * phi) + ((1.0 - targets) * cosine) + return self.scale * outputs + + +class SpeakerDecoderPostnet(nn.Module): + """Speaker Identification Postnet. + + Arguments + --------- + embed_dim : int + The size of embedding. + class_num: int + The number of classes. + args : Namespace + + Return + --------- + embed : torch.Tensor + output : torch.Tensor + """ + + def __init__(self, embed_dim, class_num, args): + super(SpeakerDecoderPostnet, self).__init__() + self.embed_dim = embed_dim + self.class_num = class_num + self.no_pooling_bn = getattr(args, "sid_no_pooling_bn", False) + self.no_embed_postnet = getattr(args, "sid_no_embed_postnet", False) + self.normalize_postnet = getattr(args, "sid_normalize_postnet", False) + self.softmax_head = getattr(args, "sid_softmax_type", "softmax") + if not self.no_pooling_bn: + self.bn_pooling = nn.BatchNorm1d(args.decoder_output_dim) + else: + self.bn_pooling = None + if not self.no_embed_postnet: + self.output_embedding = nn.Linear(args.decoder_output_dim, embed_dim, bias=False) + self.bn_embedding = nn.BatchNorm1d(embed_dim) + else: + self.output_embedding = None + self.bn_embedding = None + self.embed_dim = args.decoder_output_dim + self.output_projection = nn.Linear(self.embed_dim, class_num, bias=False) + if self.softmax_head == "amsoftmax": + self.output_layer = AngularMargin(args.softmax_margin, args.softmax_scale) + elif self.softmax_head == "aamsoftmax": + self.output_layer = AdditiveAngularMargin(args.softmax_margin, args.softmax_scale, args.softmax_easy_margin) + else: + self.output_layer = None + if self.output_embedding is not None: + nn.init.normal_(self.output_embedding.weight, mean=0, std=embed_dim ** -0.5) + nn.init.normal_(self.output_projection.weight, mean=0, std=class_num ** -0.5) + + def forward(self, x, target=None): + """ + Parameters + ---------- + x : torch.Tensor of shape [batch, channel] or [batch, time, channel] + target : torch.Tensor of shape [batch, channel] + """ + if self.bn_pooling is not None: + x = self.bn_pooling(x) + if self.output_embedding is not None and self.bn_embedding is not None: + embed = self.bn_embedding(self.output_embedding(x)) + else: + embed = x + if self.output_layer is not None or self.normalize_postnet: + x_norm = F.normalize(embed, p=2, dim=1) + w_norm = F.normalize(self.output_projection.weight, p=2, dim=1) # [out_dim, in_dim] + output = F.linear(x_norm, w_norm) + if self.training and target is not None and self.output_layer is not None: + output = self.output_layer(output, target) + else: + output = self.output_projection(embed) + return output, embed diff --git a/SpeechT5/speecht5/models/modules/speech_decoder_postnet.py b/SpeechT5/speecht5/models/modules/speech_decoder_postnet.py new file mode 100644 index 0000000..6e357be --- /dev/null +++ b/SpeechT5/speecht5/models/modules/speech_decoder_postnet.py @@ -0,0 +1,76 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import contextlib +import torch +import torch.nn as nn + +from espnet.nets.pytorch_backend.tacotron2.decoder import Postnet + + +class SpeechDecoderPostnet(nn.Module): + """ + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__( + self, + odim, + args, + ): + super(SpeechDecoderPostnet, self).__init__() + # define decoder postnet + # define final projection + self.feat_out = torch.nn.Linear(args.decoder_embed_dim, odim * args.reduction_factor) + self.prob_out = torch.nn.Linear(args.decoder_embed_dim, args.reduction_factor) + + # define postnet + self.postnet = ( + None + if args.postnet_layers == 0 + else Postnet( + idim=0, + odim=odim, + n_layers=args.postnet_layers, + n_chans=args.postnet_chans, + n_filts=args.postnet_filts, + use_batch_norm=args.use_batch_norm, + dropout_rate=args.postnet_dropout_rate, + ) + ) + + self.odim = odim + self.num_updates = 0 + self.freeze_decoder_updates = args.freeze_decoder_updates + + def forward(self, zs): + ft = self.freeze_decoder_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + # (B, Lmax//r, odim * r) -> (B, Lmax//r * r, odim) + before_outs = self.feat_out(zs).view(zs.size(0), -1, self.odim) + # (B, Lmax//r, r) -> (B, Lmax//r * r) + logits = self.prob_out(zs).view(zs.size(0), -1) + # postnet -> (B, Lmax//r * r, odim) + if self.postnet is None: + after_outs = before_outs + else: + after_outs = before_outs + self.postnet( + before_outs.transpose(1, 2) + ).transpose(1, 2) + + return before_outs, after_outs, logits + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self.num_updates = num_updates diff --git a/SpeechT5/speecht5/models/modules/speech_decoder_prenet.py b/SpeechT5/speecht5/models/modules/speech_decoder_prenet.py new file mode 100644 index 0000000..bd89584 --- /dev/null +++ b/SpeechT5/speecht5/models/modules/speech_decoder_prenet.py @@ -0,0 +1,110 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import contextlib +import torch +import torch.nn as nn + +import torch.nn.functional as F +from espnet.nets.pytorch_backend.tacotron2.decoder import Prenet as TacotronDecoderPrenet +from espnet.nets.pytorch_backend.transformer.embedding import PositionalEncoding +from espnet.nets.pytorch_backend.transformer.embedding import ScaledPositionalEncoding +from espnet.nets.pytorch_backend.nets_utils import make_non_pad_mask + + +class SpeechDecoderPrenet(nn.Module): + """ + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__( + self, + odim, + args, + ): + super(SpeechDecoderPrenet, self).__init__() + # define decoder prenet + if args.dprenet_layers != 0: + # decoder prenet + decoder_input_layer = torch.nn.Sequential( + TacotronDecoderPrenet( + idim=odim, + n_layers=args.dprenet_layers, + n_units=args.dprenet_units, + dropout_rate=args.dprenet_dropout_rate, + ), + torch.nn.Linear(args.dprenet_units, args.decoder_embed_dim), + ) + else: + decoder_input_layer = "linear" + + pos_enc_class = ( + ScaledPositionalEncoding if args.dec_use_scaled_pos_enc else PositionalEncoding + ) + + if decoder_input_layer == "linear": + self.decoder_prenet = torch.nn.Sequential( + torch.nn.Linear(odim, args.decoder_embed_dim), + torch.nn.LayerNorm(args.decoder_embed_dim), + torch.nn.Dropout(args.transformer_dec_dropout_rate), + torch.nn.ReLU(), + pos_enc_class(args.decoder_embed_dim, args.transformer_dec_positional_dropout_rate), + ) + elif isinstance(decoder_input_layer, torch.nn.Module): + self.decoder_prenet = torch.nn.Sequential( + decoder_input_layer, pos_enc_class(args.decoder_embed_dim, args.transformer_dec_positional_dropout_rate, max_len=args.max_speech_positions) + ) + + if args.spk_embed_integration_type == 'pre': + self.spkembs_layer = torch.nn.Sequential( + torch.nn.Linear(args.spk_embed_dim + args.decoder_embed_dim, args.decoder_embed_dim), torch.nn.ReLU() + ) + self.num_updates = 0 + self.freeze_decoder_updates = args.freeze_decoder_updates + + def forward(self, prev_output_tokens, tgt_lengths_in=None, spkembs=None): + ft = self.freeze_decoder_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + prev_output_tokens = self.decoder_prenet(prev_output_tokens) + + if spkembs is not None: + spkembs = F.normalize(spkembs).unsqueeze(1).expand(-1, prev_output_tokens.size(1), -1) + prev_output_tokens = self.spkembs_layer(torch.cat([prev_output_tokens, spkembs], dim=-1)) + + if tgt_lengths_in is not None: + tgt_frames_mask = ~(self._source_mask(tgt_lengths_in).squeeze(1)) + else: + tgt_frames_mask = None + return prev_output_tokens, tgt_frames_mask + + def _source_mask(self, ilens): + """Make masks for self-attention. + Args: + ilens (LongTensor or List): Batch of lengths (B,). + Returns: + Tensor: Mask tensor for self-attention. + dtype=torch.uint8 in PyTorch 1.2- + dtype=torch.bool in PyTorch 1.2+ (including 1.2) + Examples: + >>> ilens = [5, 3] + >>> self._source_mask(ilens) + tensor([[[1, 1, 1, 1, 1], + [[1, 1, 1, 0, 0]]], dtype=torch.uint8) + """ + x_masks = make_non_pad_mask(ilens).to(next(self.parameters()).device) + return x_masks.unsqueeze(-2) + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self.num_updates = num_updates diff --git a/SpeechT5/speecht5/models/modules/speech_encoder_postnet.py b/SpeechT5/speecht5/models/modules/speech_encoder_postnet.py new file mode 100644 index 0000000..ae8371b --- /dev/null +++ b/SpeechT5/speecht5/models/modules/speech_encoder_postnet.py @@ -0,0 +1,124 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import logging +import torch.nn as nn +import torch + + +logger = logging.getLogger(__name__) + +class SpeechEncoderPostnet(nn.Module): + """ + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__(self, dictionaries, args): + super(SpeechEncoderPostnet, self).__init__() + # modules below are not needed during fine-tuning + self.target_glu = args.target_glu + self.skip_masked = args.skip_masked + self.skip_nomask = args.skip_nomask + self.logit_temp = args.logit_temp + + final_dim = ( + args.final_dim if args.final_dim > 0 else args.encoder_embed_dim + ) + if any([d is None for d in dictionaries]): + logger.info( + "cannot find dictionary. assume will be used for fine-tuning" + ) + else: + self.num_classes = [len(d) for d in dictionaries] + self.label_embs_concat = nn.Parameter( + torch.FloatTensor(sum(self.num_classes), final_dim) + ) + nn.init.uniform_(self.label_embs_concat) + self.untie_final_proj = args.untie_final_proj + if self.untie_final_proj: + self.final_proj = nn.Linear( + args.encoder_embed_dim, final_dim * len(dictionaries) + ) + else: + self.final_proj = nn.Linear(args.encoder_embed_dim, final_dim) + + def compute_nce(self, x, pos, negs): + neg_is_pos = (pos == negs).all(-1) + pos = pos.unsqueeze(0) + targets = torch.cat([pos, negs], dim=0) + + logits = torch.cosine_similarity( + x.float(), targets.float(), dim=-1 + ).type_as(x) + logits /= self.logit_temp + if neg_is_pos.any(): + logits[1:][neg_is_pos] = float("-inf") + logits = logits.transpose(0, 1) # (num_x, num_cls+1) + return logits + + def forward(self, x, padding_mask, mask_indices, target_list): + def compute_pred(proj_x, target, label_embs): + # compute logits for the i-th label set + y = torch.index_select(label_embs, 0, target.long()) + negs = label_embs.unsqueeze(1).expand(-1, proj_x.size(0), -1) + if self.target_glu: + y = self.target_glu(y) + negs = self.target_glu(negs) + # proj_x: (S, D) + # y: (S, D) + # negs: (Neg, S, D) + return self.compute_nce(proj_x, y, negs) + + label_embs_list = self.label_embs_concat.split(self.num_classes, 0) + + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = self.final_proj(x[masked_indices]) + if self.untie_final_proj: + proj_x_m_list = proj_x_m.chunk(len(target_list), dim=-1) + else: + proj_x_m_list = [proj_x_m for _ in range(len(target_list))] + logit_m_list = [ + compute_pred(proj_x_m, t[masked_indices], label_embs_list[i]) + for i, (proj_x_m, t) in enumerate( + zip(proj_x_m_list, target_list) + ) + ] + else: + logit_m_list = [None for _ in target_list] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = self.final_proj(x[nomask_indices]) + if self.untie_final_proj: + proj_x_u_list = proj_x_u.chunk(len(target_list), dim=-1) + else: + proj_x_u_list = [proj_x_u for _ in range(len(target_list))] + + logit_u_list = [ + compute_pred(proj_x_u, t[nomask_indices], label_embs_list[i]) + for i, (proj_x_u, t) in enumerate( + zip(proj_x_u_list, target_list) + ) + ] + else: + logit_u_list = [None for _ in target_list] + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + } + + return result diff --git a/SpeechT5/speecht5/models/modules/speech_encoder_prenet.py b/SpeechT5/speecht5/models/modules/speech_encoder_prenet.py new file mode 100644 index 0000000..89e4a7d --- /dev/null +++ b/SpeechT5/speecht5/models/modules/speech_encoder_prenet.py @@ -0,0 +1,374 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import logging +import math +import torch +import contextlib +from typing import List, Tuple +import torch.nn as nn + +from fairseq.data.data_utils import lengths_to_padding_mask +from fairseq.data.data_utils import compute_mask_indices +from fairseq.modules import ( + PositionalEmbedding, + Fp32GroupNorm, + FairseqDropout, + SamePad, + GradMultiply, + LayerNorm, + Fp32LayerNorm, + TransposeLast, +) +import numpy as np + +logger = logging.getLogger(__name__) + + +class LinearLayer(nn.Module): + def __init__(self, idim, odom, dropout=0): + super(LinearLayer, self).__init__() + self.linear = nn.Sequential( + nn.Linear(idim, odom), + nn.LayerNorm(odom), + nn.Dropout(dropout), + nn.ReLU(), + ) + + def get_out_seq_lens_tensor(self, in_seq_lens_tensor): + out = in_seq_lens_tensor.clone() + return out + + def forward(self, src_tokens, src_lengths): + """ + src_tokens: [B, T, C] + src_lengths: [B] + """ + x = self.linear(src_tokens) + x = x.transpose(0, 1).contiguous() # -> T x B x C + return x, src_lengths + + +class SpeechEncoderPrenet(nn.Module): + """ + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__(self, args): + super(SpeechEncoderPrenet, self).__init__() + self.dropout_module = FairseqDropout( + p=args.dropout, module_name=self.__class__.__name__ + ) + self.embed_scale = math.sqrt(args.encoder_embed_dim) + if args.no_scale_embedding: + self.embed_scale = 1.0 + self.padding_idx = 1 + self.freeze_encoder_updates = args.freeze_encoder_updates + self.num_updates = 0 + assert args.encoder_speech_prenet in ["conv", "linear"], args.encoder_speech_prenet + feature_enc_layers = eval(args.conv_feature_layers) # noqa + self.embed = feature_enc_layers[-1][0] + + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + mode=args.extractor_mode, + conv_bias=args.conv_bias, + ) + feature_ds_rate = np.prod([s for _, _, s in feature_enc_layers]) + self.feat2tar_ratio = ( + args.label_rates * feature_ds_rate / args.sample_rate + ) + + self.post_extract_proj = ( + nn.Linear(self.embed, args.encoder_embed_dim) + if self.embed != args.encoder_embed_dim + else None + ) + + self.use_conv_pos = args.use_conv_pos + self.use_sinc_pos = args.use_sinc_pos + self.use_abs_pos = getattr(args, "use_abs_pos", False) + + self.feature_grad_mult = args.feature_grad_mult + if self.use_conv_pos: + self.layer_norm = LayerNorm(self.embed) + self.pos_conv = nn.Conv1d( + args.encoder_embed_dim, + args.encoder_embed_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * args.encoder_embed_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + assert not (self.use_sinc_pos and self.use_abs_pos), f"sinc pos: {self.use_sinc_pos} abs pos: {self.use_abs_pos}" + if self.use_sinc_pos: + self.embed_positions = PositionalEmbedding( + args.max_speech_positions, args.encoder_embed_dim, self.padding_idx + ) + if self.use_abs_pos: + self.embed_positions = PositionalEmbedding( + args.max_speech_positions, args.encoder_embed_dim, self.padding_idx, learned=True + ) + + # Hubert + self.mask_prob = args.mask_prob + self.mask_selection = args.mask_selection + self.mask_other = args.mask_other + self.hubert_mask_length = args.hubert_mask_length + self.no_mask_overlap = args.no_mask_overlap + self.mask_min_space = args.mask_min_space + + self.mask_channel_prob = args.mask_channel_prob + self.mask_channel_selection = args.mask_channel_selection + self.mask_channel_other = args.mask_channel_other + self.mask_channel_length = args.mask_channel_length + self.no_mask_channel_overlap = args.no_mask_channel_overlap + self.mask_channel_min_space = args.mask_channel_min_space + + self.mask_emb = nn.Parameter( + torch.FloatTensor(args.encoder_embed_dim).uniform_() + ) + + def forward(self, src_tokens, require_feat_pen=False, target_list=None, padding_mask=None, mask=True): + ft = self.freeze_encoder_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + return self._forward(src_tokens, require_feat_pen, target_list, padding_mask, mask) + + def _forward(self, src_tokens, require_feat_pen=False, target_list=None, padding_mask=None, mask=True): + if self.feature_grad_mult > 0: + x = self.feature_extractor(src_tokens) + x = x.transpose(1, 2).transpose(0, 1) # [length, batch, hidden_size] + if self.feature_grad_mult != 1.0: + x = GradMultiply.apply(x, self.feature_grad_mult) + else: + with torch.no_grad(): + x = self.feature_extractor(src_tokens) + x = x.transpose(1, 2).transpose(0, 1) # [length, batch, hidden_size] + x = x.transpose(0, 1) # [batch, length, hidden_size] + + encoder_padding_mask = padding_mask + + x = x.transpose(1, 2) # [batch, hidden_size, length] + if target_list is not None: + x, target_list = self.forward_targets(x, target_list) + features_pen = x.float().pow(2).mean() + x = x.transpose(1, 2) # [batch, length, hidden_size] + x = self.layer_norm(x) + encoder_padding_mask = self.forward_padding_mask(x, encoder_padding_mask) + if self.post_extract_proj is not None: + x = self.post_extract_proj(x) + x = self.dropout_module(x) + if mask: + x, mask_indices = self.apply_hubert_mask( + x, encoder_padding_mask + ) + else: + x = x + mask_indices = None + + if self.use_conv_pos: + positions = self.pos_conv(x.transpose(1, 2)) + positions = positions.transpose(1, 2) + #else: + # positions = self.embed_positions(encoder_padding_mask) + x = x + positions + + if self.use_sinc_pos: + positions = self.embed_positions(encoder_padding_mask) + x = x + positions + + # x = self.dropout_module(x) + + if require_feat_pen: + return (x, features_pen, mask_indices, target_list), encoder_padding_mask + else: + # For consistence with encoder + return x, encoder_padding_mask + + def forward_targets( + self, features: torch.Tensor, target_list: List[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + # Trim features to ensure labels exist and then get aligned labels + feat_tsz = features.size(2) + targ_tsz = min([t.size(1) for t in target_list]) + if self.feat2tar_ratio * feat_tsz > targ_tsz: + feat_tsz = int(targ_tsz / self.feat2tar_ratio) + features = features[..., :feat_tsz] + target_inds = torch.arange(feat_tsz).float() * self.feat2tar_ratio + target_list = [t[:, target_inds.long()] for t in target_list] + return features, target_list + + def forward_padding_mask( + self, features: torch.Tensor, padding_mask: torch.Tensor, + ) -> torch.Tensor: + extra = padding_mask.size(1) % features.size(1) + if extra > 0: + padding_mask = padding_mask[:, :-extra] + padding_mask = padding_mask.view( + padding_mask.size(0), features.size(1), -1 + ) + padding_mask = padding_mask.all(-1) + return padding_mask + + def get_src_lengths(self, src_lengths): + return self.feature_extractor.get_out_seq_lens_tensor(src_lengths) + + def apply_hubert_mask(self, x, padding_mask): + B, T, C = x.shape + if self.mask_prob > 0: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob, + self.hubert_mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x[mask_indices] = self.mask_emb + else: + mask_indices = None + + if self.mask_channel_prob > 0: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + return x, mask_indices + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self.num_updates = num_updates + +class ConvFeatureExtractionModel(nn.Module): + def __init__( + self, + conv_layers: List[Tuple[int, int, int]], + dropout: float = 0.0, + mode: str = "default", + conv_bias: bool = False, + ): + super().__init__() + + assert mode in {"default", "layer_norm"} + + def block( + n_in, + n_out, + k, + stride, + is_layer_norm=False, + is_group_norm=False, + conv_bias=False, + ): + def make_conv(): + conv = nn.Conv1d(n_in, n_out, k, stride=stride, bias=conv_bias) + nn.init.kaiming_normal_(conv.weight) + return conv + + assert ( + is_layer_norm and is_group_norm + ) == False, "layer norm and group norm are exclusive" + + if is_layer_norm: + return nn.Sequential( + make_conv(), + nn.Dropout(p=dropout), + nn.Sequential( + TransposeLast(), + Fp32LayerNorm(dim, elementwise_affine=True), + TransposeLast(), + ), + nn.GELU(), + ) + elif is_group_norm: + return nn.Sequential( + make_conv(), + nn.Dropout(p=dropout), + Fp32GroupNorm(dim, dim, affine=True), + nn.GELU(), + ) + else: + return nn.Sequential(make_conv(), nn.Dropout(p=dropout), nn.GELU()) + + in_d = 1 + self.conv_layers = nn.ModuleList() + self.conv_layers_infos = conv_layers + for i, cl in enumerate(conv_layers): + assert len(cl) == 3, "invalid conv definition: " + str(cl) + (dim, k, stride) = cl + + self.conv_layers.append( + block( + in_d, + dim, + k, + stride, + is_layer_norm=mode == "layer_norm", + is_group_norm=mode == "default" and i == 0, + conv_bias=conv_bias, + ) + ) + in_d = dim + + def forward(self, x): + # BxT -> BxCxT + x = x.unsqueeze(1) + for conv in self.conv_layers: + x = conv(x) + return x + + def get_out_seq_lens_nonmask_after_a_layer(self, in_seq_lens_tensor, i): + """Returns the out_seq_lens_nonmask 0/1 tensor after a layer. + + Args: + in_seq_lens_tensor (LongTensor): length + + Returns: + LongTensor: length + """ + out_lengths = in_seq_lens_tensor.clone() + out_lengths = ((out_lengths.float() - (self.conv_layers_infos[i][1] - 1) - 1) / self.conv_layers_infos[i][-1] + 1).floor().long() + out_nonmask = (~lengths_to_padding_mask(out_lengths)).float() + return out_nonmask, out_lengths + + def get_out_seq_lens_tensor(self, in_seq_lens_tensor): + out = in_seq_lens_tensor.clone() + for i in range(len(self.conv_layers)): + out = ((out.float() - (self.conv_layers_infos[i][1] - 1) - 1) / self.conv_layers_infos[i][-1] + 1).floor().long() + return out diff --git a/SpeechT5/speecht5/models/modules/text_decoder_postnet.py b/SpeechT5/speecht5/models/modules/text_decoder_postnet.py new file mode 100644 index 0000000..f923035 --- /dev/null +++ b/SpeechT5/speecht5/models/modules/text_decoder_postnet.py @@ -0,0 +1,93 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import torch.nn as nn +import torch +import contextlib + +from fairseq import utils +from fairseq.modules import ( + AdaptiveSoftmax, +) + +class TextDecoderPostnet(nn.Module): + """ + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__(self, embed_tokens, dictionary, args, output_projection=None,): + super(TextDecoderPostnet, self).__init__() + self.output_embed_dim = args.decoder_output_dim + self.output_projection = output_projection + self.adaptive_softmax = None + self.share_input_output_embed = args.share_input_output_embed + if self.output_projection is None: + self.build_output_projection(args, dictionary, embed_tokens) + self.freeze_decoder_updates = args.freeze_decoder_updates + self.num_updates = 0 + + def output_layer(self, features): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection(features) + else: + return features + + def build_output_projection(self, args, dictionary, embed_tokens): + if args.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(args.adaptive_softmax_cutoff, type=int), + dropout=args.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if args.tie_adaptive_weights else None, + factor=args.adaptive_softmax_factor, + tie_proj=args.tie_adaptive_proj, + ) + elif self.share_input_output_embed: + self.output_projection = nn.Linear( + embed_tokens.weight.shape[1], + embed_tokens.weight.shape[0], + bias=False, + ) + self.output_projection.weight = embed_tokens.weight + else: + self.output_projection = nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + # num_base_layers = getattr(args, "base_layers", 0) + # for i in range(num_base_layers): + # self.layers.insert( + # ((i + 1) * args.decoder_layers) // (num_base_layers + 1), + # BaseLayer(args), + # ) + + def forward(self, x): + ft = self.freeze_decoder_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + return self._forward(x) + + def _forward(self, x): + # embed positions + x = self.output_layer(x) + + return x + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self.num_updates = num_updates diff --git a/SpeechT5/speecht5/models/modules/text_decoder_prenet.py b/SpeechT5/speecht5/models/modules/text_decoder_prenet.py new file mode 100644 index 0000000..8921b8e --- /dev/null +++ b/SpeechT5/speecht5/models/modules/text_decoder_prenet.py @@ -0,0 +1,128 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import math +import torch.nn as nn +import torch +import contextlib + +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from fairseq.models.transformer import Linear, LayerNorm +from fairseq.modules import ( + PositionalEmbedding, + FairseqDropout, +) + + +class TextDecoderPrenet(nn.Module): + """ + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__(self, embed_tokens, args): + super(TextDecoderPrenet, self).__init__() + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.decoder_layerdrop = args.decoder_layerdrop + self.num_updates = 0 + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = args.decoder_embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = args.decoder_output_dim + + self.padding_idx = embed_tokens.padding_idx + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if args.no_scale_embedding else math.sqrt(embed_dim) + + if not args.adaptive_input and args.quant_noise_pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + args.quant_noise_pq, + args.quant_noise_pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + args.max_text_positions, + embed_dim, + self.padding_idx, + learned=args.decoder_learned_pos, + ) + if not args.no_token_positional_embeddings + else None + ) + export = getattr(args, "export", False) + if getattr(args, "layernorm_embedding", False): + self.layernorm_embedding = LayerNorm(embed_dim, export=export) + else: + self.layernorm_embedding = None + + self.freeze_decoder_updates = args.freeze_decoder_updates + + def forward(self, prev_output_tokens, incremental_state=None): + ft = self.freeze_decoder_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + return self._forward(prev_output_tokens, incremental_state) + + def _forward(self, prev_output_tokens, incremental_state=None): + if prev_output_tokens.eq(self.padding_idx).any(): + x_mask = prev_output_tokens.eq(self.padding_idx) + else: + x_mask = None + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + return x, x_mask, incremental_state + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self.num_updates = num_updates diff --git a/SpeechT5/speecht5/models/modules/text_encoder_prenet.py b/SpeechT5/speecht5/models/modules/text_encoder_prenet.py new file mode 100644 index 0000000..466e649 --- /dev/null +++ b/SpeechT5/speecht5/models/modules/text_encoder_prenet.py @@ -0,0 +1,45 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import torch.nn as nn + +from espnet.nets.pytorch_backend.transformer.embedding import PositionalEncoding +from espnet.nets.pytorch_backend.transformer.embedding import ScaledPositionalEncoding + + +class TextEncoderPrenet(nn.Module): + """ + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__( + self, + embed_tokens, + args, + ): + super(TextEncoderPrenet, self).__init__() + self.padding_idx = embed_tokens.padding_idx + # define encoder prenet + # get positional encoding class + pos_enc_class = ( + ScaledPositionalEncoding if args.enc_use_scaled_pos_enc else PositionalEncoding + ) + + self.encoder_prenet = nn.Sequential( + embed_tokens, + pos_enc_class(args.encoder_embed_dim, args.transformer_enc_positional_dropout_rate, max_len=args.max_text_positions), + ) + + def forward(self, src_tokens): + return self.encoder_prenet(src_tokens), src_tokens.eq(self.padding_idx) diff --git a/SpeechT5/speecht5/models/modules/transformer_layer.py b/SpeechT5/speecht5/models/modules/transformer_layer.py new file mode 100644 index 0000000..3bdc0ba --- /dev/null +++ b/SpeechT5/speecht5/models/modules/transformer_layer.py @@ -0,0 +1,411 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +from typing import Dict, List, Optional + +import torch +import torch.nn as nn +import contextlib +from fairseq import utils +from fairseq.modules import LayerNorm +from .multihead_attention import MultiheadAttention +from fairseq.modules.fairseq_dropout import FairseqDropout +from fairseq.modules.quant_noise import quant_noise +from torch import Tensor + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + has_relative_attention_bias: bool = False, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + has_relative_attention_bias=has_relative_attention_bias, + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embedding_dim//num_attention_heads) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + pos_bias=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + position_bias=pos_bias, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn + + +class TransformerDecoderLayer(nn.Module): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *args.decoder_normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, args, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False, has_relative_attention_bias=False + ): + super().__init__() + self.embed_dim = args.decoder_embed_dim + self.num_updates = 0 + self.dropout_module = FairseqDropout( + args.dropout, module_name=self.__class__.__name__ + ) + self.quant_noise = getattr(args, "quant_noise_pq", 0) + self.quant_noise_block_size = getattr(args, "quant_noise_pq_block_size", 8) + + self.cross_self_attention = getattr(args, "cross_self_attention", False) + + self.freeze_decoder_updates = getattr(args, "freeze_decoder_updates", 0) + + self.self_attn = self.build_self_attention( + self.embed_dim, + args, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + ) + + self.activation_fn = utils.get_activation_fn( + activation=str(args.activation_fn) + if getattr(args, "activation_fn", None) is not None + else "relu" + ) + activation_dropout_p = getattr(args, "activation_dropout", 0) or 0 + if activation_dropout_p == 0: + # for backwards compatibility with models that use args.relu_dropout + activation_dropout_p = getattr(args, "relu_dropout", 0) or 0 + self.activation_dropout_module = FairseqDropout( + float(activation_dropout_p), module_name=self.__class__.__name__ + ) + self.normalize_before = args.decoder_normalize_before + + export = getattr(args, "export", False) + self.self_attn_layer_norm = LayerNorm(self.embed_dim, export=export) + + if no_encoder_attn: + self.encoder_attn = None + self.encoder_attn_layer_norm = None + else: + self.encoder_attn = self.build_encoder_attention(self.embed_dim, args) + self.encoder_attn_layer_norm = LayerNorm(self.embed_dim, export=export) + + self.fc1 = self.build_fc1( + self.embed_dim, + args.decoder_ffn_embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + self.fc2 = self.build_fc2( + args.decoder_ffn_embed_dim, + self.embed_dim, + self.quant_noise, + self.quant_noise_block_size, + ) + + self.final_layer_norm = LayerNorm(self.embed_dim, export=export) + self.need_attn = True + + self.onnx_trace = False + + self.has_relative_attention_bias = has_relative_attention_bias + if self.has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim//args.decoder_attention_heads) + + def build_fc1(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise(nn.Linear(input_dim, output_dim), q_noise, qn_block_size) + + def build_fc2(self, input_dim, output_dim, q_noise, qn_block_size): + return quant_noise(nn.Linear(input_dim, output_dim), q_noise, qn_block_size) + + def build_self_attention( + self, embed_dim, args, add_bias_kv=False, add_zero_attn=False + ): + return MultiheadAttention( + embed_dim, + args.decoder_attention_heads, + dropout=args.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=not getattr(args, "cross_self_attention", False), + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + #has_relative_attention_bias=args.has_relative_attention_bias, + ) + + def build_encoder_attention(self, embed_dim, args): + return MultiheadAttention( + embed_dim, + args.decoder_attention_heads, + kdim=getattr(args, "encoder_embed_dim", None), + vdim=getattr(args, "encoder_embed_dim", None), + dropout=args.attention_dropout, + encoder_decoder_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + ) + + def prepare_for_onnx_export_(self): + self.onnx_trace = True + + def residual_connection(self, x, residual): + return residual + x + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + ft = self.freeze_decoder_updates <= self.num_updates + + with torch.no_grad() if not ft else contextlib.ExitStack(): + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + if self.encoder_attn is not None and encoder_out is not None: + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + with torch.no_grad() if not ft else contextlib.ExitStack(): + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None + + def make_generation_fast_(self, need_attn: bool = False, **kwargs): + self.need_attn = need_attn + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + self.num_updates = num_updates diff --git a/SpeechT5/speecht5/models/speecht5.py b/SpeechT5/speecht5/models/speecht5.py new file mode 100644 index 0000000..cb17131 --- /dev/null +++ b/SpeechT5/speecht5/models/speecht5.py @@ -0,0 +1,1447 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import logging +from ast import literal_eval +from typing import Dict, List, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from fairseq.models import ( + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, + register_model_architecture, +) +from .modules.text_encoder_prenet import TextEncoderPrenet +from .modules.text_decoder_prenet import TextDecoderPrenet +from .modules.text_decoder_postnet import TextDecoderPostnet +from .modules.speech_encoder_prenet import SpeechEncoderPrenet +from .modules.speech_encoder_postnet import SpeechEncoderPostnet +from .modules.speech_decoder_prenet import SpeechDecoderPrenet +from .modules.speech_decoder_postnet import SpeechDecoderPostnet +from .modules.speaker_decoder_postnet import SpeakerDecoderPostnet +from .modules.encoder import TransformerEncoder +from .modules.decoder import TransformerDecoder +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.models.transformer import Embedding +from fairseq.modules import ( + GumbelVectorQuantizer, +) +from torch import Tensor + + +logger = logging.getLogger(__name__) + +DEFAULT_MAX_TEXT_POSITIONS = 450 +DEFAULT_MAX_SPEECH_POSITIONS = 4000 + + +@register_model("t5_transformer") +class T5TransformerModel(FairseqEncoderDecoderModel): + """Adapted Transformer model (https://arxiv.org/abs/1706.03762) for + speech-to-text tasks. The Transformer encoder/decoder remains the same. + A trainable input subsampler is prepended to the Transformer encoder to + project inputs into the encoder dimension as well as downsample input + sequence for computational efficiency.""" + + def __init__( + self, + args, + encoder, decoder, + text_encoder_prenet, speech_encoder_prenet, + text_decoder_prenet, speech_decoder_prenet, + text_decoder_postnet, speech_decoder_postnet, + speaker_decoder_postnet, speech_encoder_postnet, + ): + super().__init__(encoder, decoder) + + self.encoder = encoder + self.decoder = decoder + + self.text_encoder_prenet = text_encoder_prenet + self.speech_encoder_prenet = speech_encoder_prenet + + self.text_decoder_prenet = text_decoder_prenet + self.speech_decoder_prenet = speech_decoder_prenet + + self.text_decoder_postnet = text_decoder_postnet + self.speech_decoder_postnet = speech_decoder_postnet + self.speaker_decoder_postnet = speaker_decoder_postnet + + self.hubert_layer = speech_encoder_postnet + + self.reduction_factor = args.reduction_factor + self.spk_embed_dim = args.spk_embed_dim + # define projection layer + self.spk_embed_integration_type = args.spk_embed_integration_type + if self.spk_embed_dim is not None and self.spk_embed_integration_type != 'pre': + if self.spk_embed_integration_type == "add": + self.projection = torch.nn.Linear(self.spk_embed_dim, args.decoder_embed_dim) + else: + self.projection = torch.nn.Linear( + args.decoder_embed_dim + self.spk_embed_dim, args.decoder_embed_dim + ) + + self.use_codebook = args.use_codebook + self.codebook_prob = getattr(args, "codebook_prob", 0.5) # args.codebook_prob + if self.use_codebook: + vq_dim = args.latent_dim if args.latent_dim > 0 else args.encoder_embed_dim + self.quantizer = GumbelVectorQuantizer( + dim=args.encoder_embed_dim, + num_vars=args.latent_vars, + temp=args.latent_temp, + groups=args.latent_groups, + combine_groups=False, + vq_dim=vq_dim, + time_first=True, + weight_proj_depth=args.quantizer_depth, + weight_proj_factor=args.quantizer_factor, + ) + + self.num_updates = 0 + + # # Follow BERT's random weight initialization (for BART) + if args.bert_init: + self.apply(init_bert_params) + self.args = args + self.prune_modules(args.modules_filter) + + @staticmethod + def add_args(parser): + """Add model-specific arguments to the parser.""" + # Transformer + parser.add_argument( + "--activation-fn", + type=str, + choices=utils.get_available_activation_fns(), + help="activation function to use", + ) + parser.add_argument( + "--dropout", type=float, metavar="D", help="dropout probability" + ) + parser.add_argument( + "--attention-dropout", + type=float, + metavar="D", + help="dropout probability for attention weights", + ) + parser.add_argument( + "--activation-dropout", + "--relu-dropout", + type=float, + metavar="D", + help="dropout probability after activation in FFN.", + ) + parser.add_argument( + "--encoder-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension", + ) + parser.add_argument( + "--encoder-ffn-embed-dim", + type=int, + metavar="N", + help="encoder embedding dimension for FFN", + ) + parser.add_argument( + "--encoder-layers", type=int, metavar="N", help="num encoder layers" + ) + parser.add_argument( + "--encoder-attention-heads", + type=int, + metavar="N", + help="num encoder attention heads", + ) + parser.add_argument( + "--encoder-normalize-before", + action="store_true", + help="apply layernorm before each encoder block", + ) + parser.add_argument( + "--decoder-normalize-before", + action="store_true", + help="apply layernorm before each decoder block", + ) + parser.add_argument( + "--decoder-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension", + ) + parser.add_argument( + "--decoder-ffn-embed-dim", + type=int, + metavar="N", + help="decoder embedding dimension for FFN", + ) + parser.add_argument( + "--decoder-layers", type=int, metavar="N", help="num decoder layers" + ) + parser.add_argument( + "--decoder-attention-heads", + type=int, + metavar="N", + help="num decoder attention heads", + ) + parser.add_argument( + "--reduction-factor", + type=int, + help="reduction factor for decoder", + ) + parser.add_argument( + "--spk-embed-dim", + type=int, + help="speaker embedding dimension", + ) + parser.add_argument( + "--layernorm-embedding", + action="store_true", + help="add layernorm to embedding", + ) + parser.add_argument( + "--load-pretrained-encoder-from", + type=str, + metavar="STR", + help="model to take encoder weights from (for initialization)", + ) + parser.add_argument( + '--freeze-encoder-updates', + type=int, + help='number of steps to freeze encoder before finetune' + ) + parser.add_argument( + '--freeze-decoder-updates', + type=int, + help='number of steps to freeze decoder before finetune' + ) + parser.add_argument( + '--no-freeze-encoder-layer', + type=str, + help='which encoder layer not freeze during finetune' + ) + parser.add_argument( + "--share-input-output-embed", + action="store_true", + help="share decoder input and output embeddings", + ) + parser.add_argument( + "--share-ctc-embed", + action="store_true", + help="share ctc embed and decoder embed", + ) + parser.add_argument( + "--encoder-sliding-window-attn", + default=None, + type=int, + help="If not None but a even number, set sliding window attention to encoder's attn_mask, e.g., 4, 10, and 20", + ) + + # Convolutional subsampler + parser.add_argument( + "--encoder-speech-prenet", + default="conv", + type=str, + choices=["conv", "linear"], + help="The type of encoder speech prenet, e.g., conv or linear." + ) + parser.add_argument( + "--conv-kernel-sizes", + default="5,5", + type=str, + help="The layer of convolution of encoder speech prenet." + ) + parser.add_argument( + "--conv-channels", + default=1024, + type=int, + help="The channels of encoder speech prenet." + ) + parser.add_argument( + "--subsample-stride", + default="2,2", + type=str, + help="The subsample stride for conv1dsubsample." + ) + parser.add_argument( + "--spk-embed-integration-type", + type=str, + choices=["pre", "add"], + help="speaker embedding integration type" + ) + parser.add_argument( + "--dprenet-dropout-rate", + default=0.5, + type=float, + help="The dropout rate of decoder speech prenet." + ) + + ## SE + parser.add_argument( + "--se-predict", + default=None, + choices=["masking", "target", "delta"], + help="If set, source speech inputs decoder to predict the masking/target/delta of corresponding inputs." + + "masking is [0, 1], target is predicted output, delta is difference between inputs and outputs", + ) + parser.add_argument( + "--se-decoder-input", + type=str, + default="previous_target", + choices=["previous_target", "source"], + ) + + ## SID + parser.add_argument( + "--modules-filter", + default=None, + type=str, + help="Remove unused modules for, e.g., SID.", + ) + parser.add_argument( + "--sid-pad-prenet", + action="store_true", + help="If set, the size of text dictionary is as small as for <pad> token.", + ) + parser.add_argument( + "--encoder-attn-branch", + type=str, + default="identity,full", + help="encoder attention branch sliding window, e.g., 'identity,0,2,4,full'", + ) + parser.add_argument( + "--encoder-block-branch", + type=str, + help="average the output of encoder, e.g., '4,5,6'", + ) + parser.add_argument( + "--sid-encoder-cls", + default=None, + choices=["encoder"], + help="If set, add cls vector to the encoder input, e.g., constant vector.", + ) + parser.add_argument( + "--sid-shuffle-encoder-input", + action="store_true", + help="If set, shuffle encoder input in time.", + ) + parser.add_argument( + "--sid-decoder-speaker", + action="store_true", + help="If set, apply speaker decoder as transformer decoder.", + ) + parser.add_argument( + "--sid-decoder-attn-dim", + default=128, + type=int, + help="Attention dimension in attensive statistics pooling of speaker decoder.", + ) + parser.add_argument( + "--sid-t5-postnet", + action="store_true", + help="If set, apply TextDecoderPostnet as speaker classification.", + ) + parser.add_argument( + "--sid-embed-dim", + default=128, + type=int, + help="Embedding dimension in speaker postnet for speaker identification if embed postnet.", + ) + parser.add_argument( + "--sid-pooling-layer", + default="decoder", + type=str, + choices=["decoder-las", "decoder", "encoder", "encoder-cls", "encoder-speaker"], + help="The output of decoder or encoder uses as SID pooling layer over temporal dimension.", + ) + parser.add_argument( + "--sid-no-pooling-bn", + action="store_true", + help="If set, not attention batchnorm.", + ) + parser.add_argument( + "--sid-no-embed-postnet", + action="store_true", + help="If set, no layer between decoder output and classification layer.", + ) + parser.add_argument( + "--sid-normalize-postnet", + action="store_true", + help="If set, normalize input and weight in postnet/classifier.", + ) + parser.add_argument( + "--sid-softmax-type", + default="softmax", + choices=["softmax", "amsoftmax", "aamsoftmax"], + help="If using amsoftmax or aamsoftmax, the target should be given.", + ) + parser.add_argument( + "--softmax-scale", + default=1.0, + type=float, + help="Scale for AMSoftmax or AAMSoftmax.", + ) + parser.add_argument( + "--softmax-margin", + default=0.0, + type=float, + help="Margin for AMSoftmax or AAMSoftmax.", + ) + parser.add_argument( + "--softmax-easy-margin", + action="store_true", + help="Enable easy margin for AAMSoftmax.", + ) + parser.add_argument( + "--encoder-layerdrop", + type=float, + metavar="D", + help="LayerDrop probability for encoder", + ) + parser.add_argument( + "--decoder-layerdrop", + type=float, + metavar="D", + help="LayerDrop probability for decoder", + ) + + ## Hubert + parser.add_argument( + '--feature-grad-mult', + type=float, + help='multiply feature extractor var grads by this' + ) + parser.add_argument( + '--logit-temp', + type=float, + help='temperature to divide logits by' + ) + parser.add_argument( + '--final-dim', + type=int, + help="project final representations and targets to this many " + "dimensions. set to encoder_embed_dim is <= 0" + ) + + # mask + parser.add_argument( + '--hubert-mask-length', + type=int, + help='mask length' + ) + parser.add_argument( + '--mask-prob', + type=float, + help='probability of replacing a token with mask' + ) + parser.add_argument( + "--mask-selection", + choices=["static", "uniform", "normal", "poisson"], + help="how to choose mask length", + ) + parser.add_argument( + '--mask-other', + type=float, + help="secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indices" + ) + parser.add_argument( + '--mask-min-space', + type=int, + help='min space between spans (if no overlap is enabled)' + ) + + # channel masking + parser.add_argument( + '--mask-channel-length', + type=int, + help='length of the mask for features (channels)' + ) + parser.add_argument( + '--mask-channel-prob', + type=float, + help="probability of replacing a feature with 0" + ) + parser.add_argument( + "--mask-channel-selection", + choices=["static", "uniform", "normal", "poisson"], + help="how to choose mask length for channel masking", + ) + parser.add_argument( + '--mask-channel-other', + type=float, + help="secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indices" + ) + parser.add_argument( + '--mask-channel-min-space', + type=int, + help='min space between spans (if no overlap is enabled)' + ) + + # abs positional embeddings + parser.add_argument( + '--conv-pos', + type=int, + help='number of filters for convolutional positional embeddings' + ) + parser.add_argument( + '--conv-pos-groups', + type=int, + help='number of groups for convolutional positional embedding' + ) + + # codebook related + parser.add_argument( + "--use-codebook", + action="store_true", + help="whether to use codebook", + ) + parser.add_argument( + "--codebook-prob", + type=float, + help="probability to use codebook", + ) + parser.add_argument( + "--latent-vars", + type=int, + help="number of latent variables V in each group of the codebook", + ) + parser.add_argument( + "--latent-groups", + type=int, + help="number of groups G of latent variables in the codebook", + ) + parser.add_argument( + "--latent-dim", + type=int, + help="if > 0, uses this dimensionality for latent variables. " + "otherwise uses final_dim / latent_groups", + ) + parser.add_argument( + "--latent-temp", + type=literal_eval, + help="temperature for latent variable sampling. " + "can be tuple of 3 values (start, end, decay)", + ) + parser.add_argument( + "--quantizer-depth", + type=int, + help="number of quantizer layers", + ) + parser.add_argument( + "--quantizer-factor", + type=int, + help="number of quantizer layers", + ) + parser.add_argument( + "--get-code-distribution", + action='store_true', + help="whether to get the code distribution (for test)", + ) + + # relative pos enc + parser.add_argument( + "--relative-position-embedding", + action='store_true', + help="whether to use relative position embedding", + ) + parser.add_argument( + "--num-buckets", + type=int, + default=320, + help="num of buckets for relative position embedding", + ) + parser.add_argument( + "--max-distance", + type=int, + default=1280, + help="max distance for relative position embedding", + ) + parser.add_argument( + "--encoder-max-relative-position", + type=int, + help="max distance for relative position embedding in encoder", + ) + parser.add_argument( + "--decoder-max-relative-position", + type=int, + help="max distance for relative position embedding in decoder", + ) + + # hubert feature extractor + parser.add_argument( + "--conv-feature-layers", + type=str, + help= "string describing convolutional feature extraction " + "layers in form of a python list that contains " + "[(dim, kernel_size, stride), ...]", + ) + parser.add_argument( + "--conv-bias", + action='store_true', + help="include bias in conv encoder", + ) + parser.add_argument( + "--extractor-mode", + choices=["default", "layer_norm"], + help="mode for feature extractor. default has a single group " + "norm with d groups in the first conv block, whereas layer_norm " + "has layer norms in every block (meant to use with normalize=True)" + ) + + # others + parser.add_argument( + "--bert-init", + action='store_true', + help="initilize as bert", + ) + parser.add_argument( + "--unb-enc-layer", + type=int, + default=-1, + help="which layer's output is used as the input of decoder", + ) + + # Encoder, Decoder + @classmethod + def build_encoder(cls, args, dictionary=None, embed_tokens=None): + return TransformerEncoder(args, dictionary, embed_tokens) + + @classmethod + def build_decoder(cls, args): + return TransformerDecoder(args) + + # Encoder Prenet + @classmethod + def build_text_encoder_prenet(cls, embed_tokens, args): + return TextEncoderPrenet(embed_tokens, args) + + @classmethod + def build_speech_encoder_prenet(cls, args): + return SpeechEncoderPrenet(args) + + # Decoder Prenet + @classmethod + def build_text_decoder_prenet(cls, embed_tokens, args): + return TextDecoderPrenet(embed_tokens, args) + + @classmethod + def build_speech_decoder_prenet(cls, odim, args): + return SpeechDecoderPrenet(odim, args) + + # Decoder Postnet + @classmethod + def build_text_decoder_postnet(cls, embed_tokens, dictionary, args): + return TextDecoderPostnet(embed_tokens, dictionary, args) + + @classmethod + def build_speaker_decoder_postnet(cls, embed_dim, class_num, args): + return SpeakerDecoderPostnet(embed_dim, class_num, args) + + @classmethod + def build_speech_decoder_postnet(cls, odim, args): + return SpeechDecoderPostnet(odim, args) + + @classmethod + def build_speech_encoder_postnet(cls, dictionaries, args): + return SpeechEncoderPostnet(dictionaries, args) + + @classmethod + def build_model(cls, args, task): + """Build a new model instance.""" + + # make sure all arguments are present in older models + base_architecture(args) + + def build_embedding(dictionary, embed_dim, max_num_embeddings=None): + num_embeddings = len(dictionary) + if max_num_embeddings is not None and isinstance(max_num_embeddings, int): + num_embeddings = min(num_embeddings, max_num_embeddings) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + if hasattr(args, "sid_pad_prenet") and args.sid_pad_prenet: + max_num_embeddings = 3 # <pad> at index 2 + else: + max_num_embeddings = None + + text_decoder_embed_tokens = build_embedding( + task.dicts["text"], args.decoder_embed_dim, max_num_embeddings + ) + + if args.share_input_output_embed: + text_encoder_embed_tokens = text_decoder_embed_tokens + else: + text_encoder_embed_tokens = build_embedding( + task.dicts["text"], args.encoder_embed_dim + ) + + speech_odim = args.speech_odim + if "text" in task.dicts: + encoder = cls.build_encoder(args, task.dicts["text"], text_encoder_embed_tokens) + else: + encoder = cls.build_encoder(args) + decoder = cls.build_decoder(args) + + text_encoder_prenet = cls.build_text_encoder_prenet(text_encoder_embed_tokens, args) + speech_encoder_prenet = cls.build_speech_encoder_prenet(args) + + text_decoder_prenet = cls.build_text_decoder_prenet(text_decoder_embed_tokens, args) + if getattr(args, "sid_pooling_layer", None) == "decoder-las": + speech_decoder_prenet = cls.build_speech_encoder_prenet(args) + else: + speech_decoder_prenet = cls.build_speech_decoder_prenet(speech_odim, args) + + text_decoder_postnet = cls.build_text_decoder_postnet(text_decoder_embed_tokens, task.dicts['text'], args) + speech_decoder_postnet = cls.build_speech_decoder_postnet(speech_odim, args) + + if getattr(args, "sid_t5_postnet", False): + speaker_decoder_postnet = None + else: + if task.t5_task == "s2c": + speaker_decoder_postnet = cls.build_speaker_decoder_postnet(args.sid_embed_dim, len(task.dicts['text']), args) + else: + speaker_decoder_postnet = None + + if "hubert" in task.dicts: + speech_encoder_postnet = cls.build_speech_encoder_postnet(task.dicts['hubert'], args) + else: + speech_encoder_postnet = None + + return cls( + args, + encoder, decoder, + text_encoder_prenet, speech_encoder_prenet, + text_decoder_prenet, speech_decoder_prenet, + text_decoder_postnet, speech_decoder_postnet, + speaker_decoder_postnet, speech_encoder_postnet, + ) + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + # net_output['encoder_out'] is a (B, T, D) tensor + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def get_normalized_probs_for_ctc(self, net_output, log_probs): + """Get normalized probabilities (or log probs) from a net's output.""" + + logits = net_output["encoder_out_for_ctc"][0] + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + def get_logits(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + logits_list = [x.float() for x in logits_list if x is not None] + return logits_list + + def get_targets(self, sample, net_output, is_masked=True): + if "logit_m_list" in net_output: + logits_list = self.get_logits(net_output, is_masked) + targets_list = [ + x.new_zeros(x.size(0), dtype=torch.long) for x in logits_list + ] + return targets_list + else: + return sample["target"] + + def get_extra_losses(self, net_output): + extra_losses = [] + names = [] + + if "features_pen" in net_output: + extra_losses.append(net_output["features_pen"]) + names.append("features_pen") + + if "prob_perplexity" in net_output: + extra_losses.append( + (net_output["num_vars"] - net_output["prob_perplexity"]) + / net_output["num_vars"] + ) + names.append("prob_perplexity") + + return extra_losses, names + + def forward(self, source=None, src_tokens=None, src_lengths=None, prev_output_tokens=None, tgt_lengths=None, spkembs=None, target_list=None, task_name=None, padding_mask=None, only_hubert=False, only_ctc=False, feature_only=False, tgt_enc_layer=None, mask=True): + """ + The forward method inherited from the base class has a **kwargs + argument in its input, which is not supported in torchscript. This + method overwrites the forward method definition without **kwargs. + """ + assert source is not None or src_tokens is not None + # padding_mask is not none only when input is waveform + if source is None and padding_mask is None and not feature_only: + input_type = 'text' + else: + input_type = 'speech' + + if prev_output_tokens is not None and len(prev_output_tokens.size()) == 2: + output_type = 'text' + codebook_out = {} + else: + output_type = 'speech' + + if task_name is not None and task_name == "s2c": + if target_list is not None and target_list.size(1) == 1 and not getattr(self.args, "sid_t5_postnet", False): + sid_target = F.one_hot(target_list.squeeze(1), num_classes=self.speaker_decoder_postnet.class_num) + else: + sid_target = None + target_list = None + + # Encoder Prenet + if input_type == 'text': + encoder_input, encoder_padding_mask = self.text_encoder_prenet(src_tokens) + else: + if target_list is not None: + encoder_input, encoder_padding_mask = self.speech_encoder_prenet(source, require_feat_pen=True, target_list=target_list, padding_mask=padding_mask, mask=mask) + encoder_input, features_pen, mask_indices, target_list = encoder_input + else: + encoder_input, encoder_padding_mask = self.speech_encoder_prenet(source, padding_mask=padding_mask, mask=self.training) + # shuffle a batch of inputs of encoder + if self.training and hasattr(self.args, "sid_shuffle_encoder_input") and getattr(self.args, "sid_shuffle_encoder_input", False): + shuffle_index = torch.randperm(encoder_padding_mask.size(1), device=encoder_padding_mask.device) + encoder_input = torch.index_select(encoder_input, 1, shuffle_index) + encoder_padding_mask = torch.index_select(encoder_padding_mask, 1, shuffle_index) + if getattr(self.args, "sid_encoder_cls", None) == "encoder": + prev_output_tokens = torch.zeros_like(prev_output_tokens) + encoder_input, encoder_padding_mask = self._integrate_with_speaker_cls(prev_output_tokens, encoder_input, encoder_padding_mask) + + # Encoder: T x B x C + encoder_output = self.encoder(encoder_input, encoder_padding_mask, tgt_layer=tgt_enc_layer) + + if task_name is not None and task_name == 'speech_pretrain' and feature_only: + return encoder_output["encoder_out"][0].transpose(0, 1) + + if task_name is not None and task_name == 's2c': + if self.args.sid_pooling_layer == "encoder": + return self.speaker_decoder_postnet(encoder_output["encoder_out"][0].transpose(0, 1).mean(1), sid_target), None + elif self.args.sid_pooling_layer == "encoder-cls": + return self.speaker_decoder_postnet(encoder_output["encoder_out"][0].transpose(0, 1)[:,0], sid_target), None + elif self.args.sid_pooling_layer == "encoder-speaker" or getattr(self.args, "sid_decoder_speaker", False): + return self.speaker_decoder_postnet(encoder_output["encoder_out"][0].transpose(0, 1), sid_target), None + + if target_list is not None: + hubert_results = self.hubert_layer( + encoder_output["encoder_out"][0].transpose(0, 1), + encoder_padding_mask, + mask_indices, + target_list + ) + + hubert_results['features_pen'] = features_pen + + if "decoder_input" in encoder_output and encoder_output["decoder_input"][0] is not None: + # Change the encoder output to decoder input once set unb-enc-layer + encoder_output["encoder_out"] = encoder_output["decoder_input"] + + if self.use_codebook: + q = self.quantizer(encoder_output["encoder_out"][0].transpose(0, 1)) + + # q["x"]: B x T x C + # Sample indexs according to the codebook prob + random_idx = torch.randperm(q["x"].size(1))[:int(q["x"].size(1) * self.codebook_prob)] + # Make weight for q + q_w = q["x"].new_zeros(q["x"].size(1)) + q_w[random_idx] = 1.0 + # Combine quantized codes and encoder output + encoder_output["encoder_out"][0] = ( + q_w.view(-1, 1) * q["x"] + (- q_w + 1).view(-1, 1) * encoder_output["encoder_out"][0].transpose(0, 1) + ).transpose(0, 1) + + # encoder_output["encoder_out"][0] = q["x"].transpose(0, 1) + if output_type == 'speech': + hubert_results["prob_perplexity"] = q["prob_perplexity"] + hubert_results["code_perplexity"] = q["code_perplexity"] + hubert_results["num_vars"] = q["num_vars"] + hubert_results["temp"] = q["temp"] + elif output_type == 'text': + codebook_out["prob_perplexity"] = q["prob_perplexity"] + codebook_out["code_perplexity"] = q["code_perplexity"] + codebook_out["num_vars"] = q["num_vars"] + codebook_out["temp"] = q["temp"] + + if only_hubert and target_list is not None: + return hubert_results, None + + if only_ctc and task_name is not None and task_name == "s2t": + return None, encoder_output + elif not self.training and prev_output_tokens is None and task_name == "s2t" and task_name is not None: + return encoder_output + + # Decoder Prenet + if output_type == 'text': + # _ is the incremental state + prev_output_tokens, tgt_mask, _ = self.text_decoder_prenet(prev_output_tokens) + if task_name is not None and task_name == 's2c': + prev_output_tokens = torch.zeros_like(prev_output_tokens) + else: + # integrate speaker embedding + if self.spk_embed_integration_type == "pre" and self.spk_embed_dim is not None: + # Decoder Prenet + prev_output_tokens, tgt_mask = self.speech_decoder_prenet(prev_output_tokens, tgt_lengths, spkembs) + else: + if self.spk_embed_dim is not None: + encoder_output["encoder_out"] = [self._integrate_with_spk_embed( + encoder_output["encoder_out"][0].transpose(0, 1), spkembs + ).transpose(0, 1)] + + prev_output_tokens, tgt_mask = self.speech_decoder_prenet(prev_output_tokens, tgt_lengths) + + # BART Sequence Classification: cat <pad> + feature before decoder + if task_name is not None and task_name == 's2c' and self.args.sid_pooling_layer == "decoder-las": + decoder_feat_input, decoder_feat_mask = self.speech_decoder_prenet(src_tokens, src_lengths) + prev_output_tokens, tgt_mask = self._integrate_with_speaker_cls((prev_output_tokens, tgt_mask), decoder_feat_input, decoder_feat_mask, cls_first=False) + + # SE predict masking to corresponding inputs and source speech replaces the prev_output_tokens as the input of decoder + if task_name is not None and task_name == "s2s" and getattr(self.args, "se_decoder_input", "previous_target") == "source": + prev_output_tokens, tgt_mask = self.speech_decoder_prenet(src_tokens, src_lengths) + + # Decoder + decoder_output, extra = self.decoder(prev_output_tokens, tgt_mask, encoder_output, + full_context_alignment=getattr(self.args, "decoder_full_context_alignment", False), + alignment_layer=(-1 if target_list is None and output_type == 'speech' else None)) + # Decoder Postnet + if task_name is not None and task_name == 's2c': + if not getattr(self.args, "sid_t5_postnet", False): + if self.args.sid_pooling_layer == "decoder": + return self.speaker_decoder_postnet(decoder_output.mean(1), sid_target), None + elif self.args.sid_pooling_layer == "decoder-las": + indices = (tgt_mask.eq(False).float().sum(1) - 1.0).type(torch.int64) + indices = indices.unsqueeze(1).unsqueeze(2).expand(-1, -1, decoder_output.size(2)) + return self.speaker_decoder_postnet(decoder_output.gather(1, indices), sid_target), None + else: + return (self.text_decoder_postnet(decoder_output), None), encoder_output + + # SE predict: masking, target, delta. Ensure reduction factor 1 + if task_name is not None and task_name == 's2s' and getattr(self.args, "se_predict", None) is not None: + assert self.reduction_factor == 1, f"{self.reduction_factor} != 1" + before_outs, after_outs, logits = self.speech_decoder_postnet(decoder_output) + se_predict = getattr(self.args, "se_predict") + if se_predict == "masking": + before_outs = torch.sigmoid(before_outs) * src_tokens + after_outs = torch.sigmoid(after_outs) * src_tokens + return before_outs, after_outs, logits, extra['attn'][0] + elif se_predict == "target": + return before_outs, after_outs, logits, extra['attn'][0] + elif se_predict == "delta": + before_outs = before_outs - src_tokens + after_outs = after_outs - src_tokens + return before_outs, after_outs, logits, extra['attn'][0] + else: + raise ValueError(f"{se_predict} not in [masking, target, delta]") + + if task_name is not None and task_name == 's2t': + #return self.text_decoder_postnet(decoder_output), None + return (self.text_decoder_postnet(decoder_output), None), encoder_output + if output_type == 'text': + return (self.text_decoder_postnet(decoder_output), None), codebook_out, encoder_output + else: + if target_list is not None: + return hubert_results, (self.speech_decoder_postnet(decoder_output) + (extra['attn'][0],)) + else: + return self.speech_decoder_postnet(decoder_output) + (extra['attn'][0],) + + def _integrate_with_speaker_cls(self, pad_input, encoder_input, encoder_padding_mask=None, cls_first=True): + """ + encoder_input: [B, T, C] + encoder_padding_mask: [B, T] + """ + if hasattr(self, "text_decoder_prenet"): + if isinstance(pad_input, tuple): + repeat_cls_vector, repeat_cls_mask = pad_input + else: + repeat_cls_vector, repeat_cls_mask, _ = self.text_decoder_prenet(pad_input) + + if encoder_padding_mask is not None: + bsz = encoder_input.size(0) + tsz = encoder_input.size(1) + encoder_padding_mask = encoder_input.new_zeros((bsz, tsz)) == 1.0 + if repeat_cls_mask is None: + mask_size = (encoder_padding_mask.size(0), 1) + mask_type = encoder_padding_mask.dtype + repeat_cls_mask = encoder_padding_mask.new_zeros(mask_size) == 1.0 + ret_encoder_padding_mask = torch.cat([repeat_cls_mask, encoder_padding_mask], dim=1) + + if cls_first: + ret_encoder_input = torch.cat([repeat_cls_vector, encoder_input], dim=1) + else: + ret_encoder_input = torch.cat([encoder_input, encoder_input[:,-1:,:]], dim=1) + mask_size = (encoder_padding_mask.size(0), 1) + mask_type = encoder_padding_mask.dtype + repeat_cls_mask_ = encoder_padding_mask.new_ones(mask_size) == 1.0 + encoder_padding_mask_ = torch.cat([encoder_padding_mask, repeat_cls_mask_], dim=1) + indices = encoder_padding_mask.eq(False).float().sum(1).type(torch.int64).unsqueeze(1) + indices_mask = torch.zeros_like(ret_encoder_padding_mask).scatter(1, indices, 1.0) + ret_encoder_input = ret_encoder_input * (1.0 - encoder_padding_mask_.type(ret_encoder_input.dtype).unsqueeze(2)) \ + + repeat_cls_vector * indices_mask.type(repeat_cls_vector.dtype).unsqueeze(2) + + return ret_encoder_input, ret_encoder_padding_mask + + def _integrate_with_spk_embed(self, hs, spembs): + """Integrate speaker embedding with hidden states. + Args: + hs (Tensor): Batch of hidden state sequences (B, Tmax, adim). + spembs (Tensor): Batch of speaker embeddings (B, spk_embed_dim). + Returns: + Tensor: Batch of integrated hidden state sequences (B, Tmax, adim) + """ + if self.spk_embed_integration_type == "add": + # apply projection and then add to hidden states + spembs = self.projection(F.normalize(spembs)) + hs = hs + spembs.unsqueeze(1) + elif self.spk_embed_integration_type == "concat": + # concat hidden states with spk embeds and then apply projection + spembs = F.normalize(spembs).unsqueeze(1).expand(-1, hs.size(1), -1) + hs = self.projection(torch.cat([hs, spembs], dim=-1)) + else: + raise NotImplementedError("support only add or concat.") + + return hs + + def load_state_dict( + self, + state_dict, + strict=True, + model_cfg=None, + args=None, + ): + """NOT STRICT Copies parameters and buffers from *state_dict* into this module and + its descendants. + + Overrides the method in :class:`nn.Module`. Compared with that method + this additionally "upgrades" *state_dicts* from old checkpoints. + """ + # self.prune_modules(model_cfg.modules_filter) + model_dict_size = self.text_decoder_postnet.output_projection.out_features + ckpt_dict_size = state_dict["text_decoder_postnet.output_projection.weight"].size(0) + if model_dict_size != ckpt_dict_size: + # reset dictionary-related modules, such as embedding table and encoder ctc embed + logger.warn(f"not equal dictionary between model and checkpoint: {model_dict_size} vs {ckpt_dict_size}") + logger.info(f"reset model dictionary with size of {model_dict_size}") + removed_keys = [ + key for key in state_dict.keys() if any( + key.startswith(previ) for previ in [ + "encoder.proj", "text_encoder_prenet", "text_decoder_prenet", "text_decoder_postnet" + ] + ) + ] + for key in removed_keys: + state_dict.pop(key, None) + logger.info(f"removed loaded checkpoint: {key}") + for m in self._modules.keys(): + m_state_dict = { + key.replace(f"{m}.", ""): value for key, value in state_dict.items() if key.startswith(f"{m}.") + } + if hasattr(self, m): + self._modules[m].load_state_dict(m_state_dict, False) + return self + + def prune_modules(self, modules_filter=None): + """Prune unused modules for specific tasks.""" + if modules_filter is None: + return + elif modules_filter == "s2c": + if hasattr(self, "text_encoder_prenet"): del self.text_encoder_prenet + if hasattr(self, "speech_decoder_prenet") and getattr(self.args, "sid_pooling_layer", None) != "decoder-las": + del self.speech_decoder_prenet + if hasattr(self, "speech_decoder_postnet"): del self.speech_decoder_postnet + if hasattr(self, "text_decoder_postnet"): del self.text_decoder_postnet + if hasattr(self, "speech_encoder_postnet"): del self.speech_encoder_postnet + if hasattr(self.encoder, "proj"): self.encoder.proj = None + if hasattr(self, "projection"): del self.projection + if hasattr(self, "quantizer"): del self.quantizer + if getattr(self.args, "sid_pooling_layer", "decoder").startswith("encoder") or getattr(self.args, "sid_decoder_speaker", False): + if hasattr(self.decoder, "dropout_module"): del self.decoder.dropout_module + if hasattr(self.decoder, "layers"): del self.decoder.layers + if hasattr(self.decoder, "layer_norm"): del self.decoder.layer_norm + if hasattr(self, "text_decoder_prenet"): del self.text_decoder_prenet + elif modules_filter == "s2s": + if hasattr(self, "speaker_decoder_postnet"): del self.speaker_decoder_postnet + if hasattr(self, "text_encoder_prenet"): del self.text_encoder_prenet + if hasattr(self, "text_decoder_prenet"): del self.text_decoder_prenet + if hasattr(self, "text_decoder_postnet"): del self.text_decoder_postnet + if hasattr(self, "speech_encoder_postnet"): del self.speech_encoder_postnet + if hasattr(self.encoder, "proj"): self.encoder.proj = None + if hasattr(self, "projection"): del self.projection + if hasattr(self, "quantizer"): del self.quantizer + elif modules_filter == "t2s": + if hasattr(self, "speaker_decoder_postnet"): del self.speaker_decoder_postnet + if hasattr(self, "speech_encoder_prenet"): del self.speech_encoder_prenet + if hasattr(self, "text_decoder_prenet"): del self.text_decoder_prenet + if hasattr(self, "text_decoder_postnet"): del self.text_decoder_postnet + if hasattr(self, "speech_encoder_postnet"): del self.speech_encoder_postnet + if hasattr(self.encoder, "proj"): self.encoder.proj = None + if hasattr(self, "projection"): del self.projection + if hasattr(self, "quantizer"): del self.quantizer + elif modules_filter == "s3prl": + # remain the encoder and the pre/post net + if hasattr(self.decoder, "dropout_module"): del self.decoder.dropout_module + if hasattr(self.decoder, "layers"): del self.decoder.layers + if hasattr(self.decoder, "layer_norm"): del self.decoder.layer_norm + if hasattr(self, "speaker_decoder_postnet"): del self.speaker_decoder_postnet + if hasattr(self, "text_decoder_prenet"): del self.text_decoder_prenet + if hasattr(self, "text_decoder_postnet"): del self.text_decoder_postnet + if hasattr(self, "speech_decoder_prenet"): del self.speech_decoder_prenet + if hasattr(self, "speech_decoder_postnet"): del self.speech_decoder_postnet + if hasattr(self, "speech_encoder_postnet"): del self.speech_encoder_postnet + if hasattr(self.encoder, "proj"): self.encoder.proj = None + if hasattr(self, "projection"): del self.projection + if hasattr(self, "quantizer"): del self.quantizer + + def forward_encoder_torchscript(self, net_input: Dict[str, Tensor]): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + if torch.jit.is_scripting(): + return self.forward_encoder( + source=net_input["source"], + padding_mask=net_input["padding_mask"] + ) + else: + return self.forward_encoder_non_torchscript(net_input) + + @torch.jit.unused + def forward_encoder_non_torchscript(self, net_input: Dict[str, Tensor]): + encoder_input = { + k: v for k, v in net_input.items() if k != "prev_output_tokens" and k != "task_name" + } + return self.forward_encoder(**encoder_input) + + def forward_encoder(self, source, padding_mask=None): + # Encoder Prenet + encoder_input, encoder_padding_mask = self.speech_encoder_prenet(source, padding_mask=padding_mask, mask=False) + + # Encoder + encoder_output = self.encoder(encoder_input, encoder_padding_mask) + + return encoder_output + + def forward_text_encoder(self, src_tokens): + # Text Encoder Prenet + encoder_input, encoder_padding_mask = self.text_encoder_prenet(src_tokens) + + # Encoder + encoder_output = self.encoder(encoder_input, encoder_padding_mask) + + return encoder_output + + def forward_decoder(self, tokens, encoder_out, incremental_state): + # Decoder Prenet + prev_output_tokens, tgt_mask, incremental_state = self.text_decoder_prenet(tokens, incremental_state) + + # Decoder + decoder_output, extra = self.decoder( + prev_output_tokens, + tgt_mask, + encoder_out=encoder_out, + incremental_state=incremental_state, + ) + + # Decoder Postnet + return self.text_decoder_postnet(decoder_output), extra + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def generate_class(self, source, prev_output_tokens, **kwargs): + encoder_out = self.forward_encoder(source, padding_mask=kwargs["padding_mask"]) + + prev_output_tokens, tgt_mask, _ = self.text_decoder_prenet(prev_output_tokens, {}) + prev_output_tokens = torch.zeros_like(prev_output_tokens) # s2c use zero vector as [CLS] + + decoder_output, extra = self.decoder( + prev_output_tokens, + tgt_mask, + encoder_out=encoder_out, + ) + + decoder_out, embed = self.speaker_decoder_postnet(decoder_output.mean(1)) + + pred_class = decoder_out.argmax(1) + return pred_class + + def generate_speech(self, source=None, src_tokens=None, spkembs=None, **kwargs): + assert source is not None or src_tokens is not None + + threshold = kwargs.get("threshold", 0.5) + minlenratio = kwargs.get("threshold", 0.0) + + if source is None: + assert src_tokens.size(0) == 1 + encoder_out = self.forward_text_encoder(src_tokens) + maxlenratio = kwargs.get("threshold", 20.0) + else: + assert source.size(0) == 1 + encoder_out = self.forward_encoder(source, padding_mask=kwargs["padding_mask"]) + maxlenratio = kwargs.get("threshold", 10.0) + + if spkembs is not None and self.spk_embed_integration_type != "pre": + encoder_out["encoder_out"] = [self._integrate_with_spk_embed( + encoder_out["encoder_out"][0].transpose(0, 1), spkembs + ).transpose(0, 1)] + spkembs = None + + maxlen = int(encoder_out["encoder_out"][0].size(0) * maxlenratio / self.reduction_factor) + minlen = int(encoder_out["encoder_out"][0].size(0) * minlenratio / self.reduction_factor) + + idx = 0 + ys = encoder_out["encoder_out"][0].new_zeros(1, 1, self.speech_decoder_postnet.odim) + outs, probs = [], [] + + # forward decoder step-by-step + if isinstance(self.decoder, FairseqIncrementalDecoder): + incremental_states = {} + else: + incremental_states = None + attns = [] + while True: + # update index + idx += 1 + # calculate output and stop prob at idx-th step + decoder_in, _ = self.speech_decoder_prenet(ys, spkembs=spkembs) + z, extra = self.decoder(decoder_in[:,-1:], None, encoder_out, incremental_states, alignment_layer=-1) + outs += [self.speech_decoder_postnet.feat_out(z[0, -1]).view(self.reduction_factor, self.speech_decoder_postnet.odim)] # [(r, odim), ...] + probs += [torch.sigmoid(self.speech_decoder_postnet.prob_out(z[0, -1]))] # [(r), ...] + + # update next inputs + ys = torch.cat((ys, outs[-1][-1].view(1, 1, self.speech_decoder_postnet.odim)), dim=1) # (1, idx + 1, odim) + attns.append(torch.stack([att_l[0] for att_l in extra['attn'][0]], dim=0)) + # check whether to finish generation + if int(sum(probs[-1] >= threshold)) > 0 or idx >= maxlen: + # check mininum length + if idx < minlen: + continue + outs = (torch.cat(outs, dim=0).unsqueeze(0).transpose(1, 2)) # (L, odim) -> (1, L, odim) -> (1, odim, L) + if self.speech_decoder_postnet.postnet is not None: + outs = outs + self.speech_decoder_postnet.postnet(outs) # (1, odim, L) + outs = outs.transpose(2, 1).squeeze(0) # (L, odim) + probs = torch.cat(probs, dim=0) + attn = torch.cat(attns, dim=2) + break + + if outs.size(0) == maxlen: + logging.warning("output length reaches maximum length") + return outs, probs, attn + + +@register_model_architecture(model_name="t5_transformer", arch_name="t5_transformer") +def base_architecture(args): + # Transformer + args.bert_init = getattr(args, "bert_init", False) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 768) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 768 * 4) + args.encoder_layers = getattr(args, "encoder_layers", 12) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 12) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", args.encoder_embed_dim) + args.decoder_ffn_embed_dim = getattr( + args, "decoder_ffn_embed_dim", args.encoder_ffn_embed_dim + ) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 12) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", args.dropout) + args.activation_dropout = getattr(args, "activation_dropout", args.dropout) + args.activation_fn = getattr(args, "activation_fn", "gelu") + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0.0) + args.decoder_output_dim = getattr( + args, "decoder_output_dim", args.decoder_embed_dim + ) + args.decoder_input_dim = getattr(args, "decoder_input_dim", args.decoder_embed_dim) + args.encoder_layerdrop = getattr(args, "encoder_layerdrop", 0) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0) + args.max_text_positions = getattr(args, "max_text_positions", DEFAULT_MAX_TEXT_POSITIONS) + args.max_speech_positions = getattr(args, "max_speech_positions", DEFAULT_MAX_SPEECH_POSITIONS) + + # Espnet related, including prenet, postnet + args.eprenet_conv_layers = getattr(args, "eprenet_conv_layers", 0) + args.eprenet_conv_filts = getattr(args, "eprenet_conv_filts", 0) + args.eprenet_conv_chans = getattr(args, "eprenet_conv_chans", 0) + args.use_batch_norm = getattr(args, "use_batch_norm", True) + args.eprenet_dropout_rate = getattr(args, "eprenet_dropout_rate", 0.0) + args.enc_use_scaled_pos_enc = getattr(args, "enc_use_scaled_pos_enc", True) + args.dec_use_scaled_pos_enc = getattr(args, "dec_use_scaled_pos_enc", True) + args.postnet_layers = getattr(args, "postnet_layers", 5) + args.postnet_chans = getattr(args, "postnet_chans", 256) + args.postnet_filts = getattr(args, "postnet_filts", 5) + args.postnet_dropout_rate = getattr(args, "postnet_dropout_rate", 0.5) + args.dprenet_dropout_rate = getattr(args, "dprenet_dropout_rate", 0.5) + args.dprenet_layers = getattr(args, "dprenet_layers", 2) + args.dprenet_units = getattr(args, "dprenet_units", 256) + args.initial_encoder_alpha = getattr(args, "initial_encoder_alpha", 1.0) + args.initial_decoder_alpha = getattr(args, "initial_decoder_alpha", 1.0) + args.spk_embed_integration_type = getattr(args, "spk_embed_integration_type", "pre") + args.spk_embed_dim = getattr(args, "spk_embed_dim", 512) + args.encoder_reduction_factor = getattr(args, "encoder_reduction_factor", 1) + args.reduction_factor = getattr(args, "reduction_factor", 2) + args.transformer_enc_positional_dropout_rate = getattr(args, "transformer_enc_positional_dropout_rate", 0.1) + args.transformer_dec_positional_dropout_rate = getattr(args, "transformer_dec_positional_dropout_rate", 0.1) + args.layer_norm_eps = getattr(args, "layer_norm_eps", 1e-5) + args.no_scale_embedding = getattr(args, "no_scale_embedding", True) + # Convolutional subsampler + args.encoder_speech_prenet = getattr(args, "encoder_speech_prenet", "conv") + args.conv_kernel_sizes = getattr(args, "conv_kernel_sizes", "5,5") + args.conv_channels = getattr(args, "conv_channels", 1024) + args.quant_noise_pq = getattr(args, "quant_noise_pq", 0) + + args.adaptive_softmax_cutoff = getattr(args, "adaptive_softmax_cutoff", None) + args.adaptive_softmax_dropout = getattr(args, "adaptive_softmax_dropout", 0) + args.no_token_positional_embeddings = getattr( + args, "no_token_positional_embeddings", False + ) + args.adaptive_input = getattr(args, "adaptive_input", False) + args.decoder_learned_pos = getattr(args, "decoder_learned_pos", False) + args.share_input_output_embed = getattr(args, "share_input_output_embed", False) + args.share_ctc_embed = getattr(args, "share_ctc_embed", False) + args.freeze_encoder_updates = getattr(args, "freeze_encoder_updates", 0) + args.freeze_decoder_updates = getattr(args, "freeze_decoder_updates", 0) + args.no_freeze_encoder_layer = getattr(args, "no_freeze_encoder_layer", None) + + ## sid + args.sid_embed_dim = getattr(args, "sid_embed_dim", 128) + args.sid_pooling_layer = getattr(args, "sid_pooling_layer", "decoder") + args.softmax_scale = getattr(args, "softmax_scale", 1) + args.softmax_margin = getattr(args, "softmax_margin", 0) + args.softmax_easy_margin = getattr(args, "softmax_easy_margin", False) + args.modules_filter = getattr(args, "modules_filter", None) + + ## Hubert + args.conv_pos = getattr(args, "conv_pos", 128) + args.conv_pos_groups = getattr(args, "conv_pos_groups", 16) + args.target_glu = getattr(args, "target_glu", False) + args.logit_temp = getattr(args, "logit_temp", 0.1) + args.final_dim = getattr(args, "final_dim", 256) + args.untie_final_proj = getattr(args, "untie_final_proj", True) + args.feature_grad_mult = getattr(args, "feature_grad_mult", 0.1) + args.use_sent_enc_layer = getattr(args, "use_sent_enc_layer", True) + # hubert feature extractor + args.extractor_mode = getattr(args, "extractor_mode", "default") + args.conv_feature_layers = getattr(args, "conv_feature_layers", "[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2") + args.conv_bias = getattr(args, "conv_bias", False) + # mask + args.hubert_mask_length = getattr(args, "hubert_mask_length", 10) + args.mask_prob = getattr(args, "mask_prob", 0.0) + args.mask_selection = getattr(args, "mask_selection", "static") + args.mask_other = getattr(args, "mask_other", 0) + args.no_mask_overlap = getattr(args, "no_mask_overlap", False) + args.mask_min_space = getattr(args, "mask_min_space", 1) + # channel mask + args.mask_channel_length = getattr(args, "mask_channel_length", 10) + args.mask_channel_prob = getattr(args, "mask_channel_prob", 0.0) + args.mask_channel_selection = getattr(args, "mask_channel_selection", "static") + args.mask_channel_other = getattr(args, "mask_channel_other", 0) + args.no_mask_channel_overlap = getattr(args, "no_mask_channel_overlap", False) + args.mask_channel_min_space = getattr(args, "mask_channel_min_space", 1) + # loss computation + args.skip_masked = getattr(args, "skip_masked", False) + args.skip_nomask = getattr(args, "skip_nomask", False) + # conv Pos + args.use_conv_pos = getattr(args, "use_conv_pos", False) + args.use_sinc_pos = getattr(args, "use_sinc_pos", False) + + # codebook + args.use_codebook = getattr(args, "use_codebook", False) + args.latent_vars = getattr(args, "latent_vars", 100) + args.latent_groups = getattr(args, "latent_groups", 2) + args.latent_dim = getattr(args, "latent_dim", 0) + args.latent_temp = getattr(args, "latent_temp", (2, 0.5, 0.999995)) + args.quantizer_depth = getattr(args, "quantizer_depth", 1) + args.quantizer_factor = getattr(args, "quantizer_factor", 3) + args.codebook_prob = getattr(args, "codebook_prob", 0.5) + + # Relative pos embed + args.relative_position_embedding = getattr(args, "relative_position_embedding", False) + args.num_buckets = getattr(args, "num_buckets", 320) + args.max_distance = getattr(args, "max_distance", 1280) + args.encoder_max_relative_position = getattr(args, "encoder_max_relative_position", 160) + args.decoder_max_relative_position = getattr(args, "decoder_max_relative_position", 160) + +@register_model_architecture("t5_transformer", "t5_transformer_base") +def t5_transformer_base(args): + args.use_conv_pos = getattr(args, "use_conv_pos", True) + args.use_sinc_pos = getattr(args, "use_sinc_pos", True) + args.layernorm_embedding = getattr(args, "layernorm_embedding", False) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.layer_norm_first = getattr(args, "layer_norm_first", False) + args.relative_position_embedding = getattr(args, "relative_position_embedding", True) + args.dropout = getattr(args, "dropout", 0.1) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.encoder_layerdrop = getattr(args, "encoder_layerdrop", 0.05) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0.05) + args.mask_prob = getattr(args, "mask_prob", 0.80) + base_architecture(args) + +@register_model_architecture("t5_transformer", "t5_transformer_large") +def t5_transformer_large(args): + args.use_conv_pos = getattr(args, "use_conv_pos", True) + args.use_sinc_pos = getattr(args, "use_sinc_pos", True) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", True) + args.layer_norm_first = getattr(args, "layer_norm_first", True) + args.relative_position_embedding = getattr(args, "relative_position_embedding", True) + args.dropout = getattr(args, "dropout", 0.0) + args.activation_dropout = getattr(args, "activation_dropout", 0.0) + args.attention_dropout = getattr(args, "attention_dropout", 0.0) + args.encoder_layerdrop = getattr(args, "encoder_layerdrop", 0.0) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0.0) + args.encoder_embed_dim = getattr(args, "encoder_embed_dim", 1024) + args.encoder_layers = getattr(args, "encoder_layers", 24) + args.decoder_layers = getattr(args, "decoder_layers", 6) + args.encoder_ffn_embed_dim = getattr(args, "encoder_ffn_embed_dim", 4096) + args.encoder_attention_heads = getattr(args, "encoder_attention_heads", 16) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.feature_grad_mult = getattr(args, "feature_grad_mult", 1.0) + args.extractor_mode = getattr(args, "extractor_mode", "layer_norm") + args.final_dim = getattr(args, "final_dim", 768) + args.mask_prob = getattr(args, "mask_prob", 0.80) + base_architecture(args) + +@register_model_architecture("t5_transformer", "t5_transformer_base_asr") +def t5_transformer_base_asr(args): + args.use_conv_pos = getattr(args, "use_conv_pos", True) + args.use_sinc_pos = getattr(args, "use_sinc_pos", True) + args.encoder_normalize_before = getattr(args, "encoder_normalize_before", False) + args.decoder_normalize_before = getattr(args, "decoder_normalize_before", False) + args.layer_norm_first = getattr(args, "layer_norm_first", False) + args.relative_position_embedding = getattr(args, "relative_position_embedding", True) + args.dropout = getattr(args, "dropout", 0.1) + args.activation_dropout = getattr(args, "activation_dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.feature_grad_mult = getattr(args, "feature_grad_mult", 0.0) + args.encoder_layerdrop = getattr(args, "encoder_layerdrop", 0.1) + args.decoder_layerdrop = getattr(args, "decoder_layerdrop", 0.1) + args.mask_prob = getattr(args, "mask_prob", 0.75) + args.mask_selection = getattr(args, "mask_selection", "static") + args.mask_channel_length = getattr(args, "mask_channel_length", 64) + args.mask_channel_prob = getattr(args, "mask_channel_prob", 0.5) + args.mask_channel_selection = getattr(args, "mask_channel_selection", "static") + args.max_text_positions = getattr(args, "max_text_positions", 600) + base_architecture(args) diff --git a/SpeechT5/speecht5/models/t5_transformer_lm.py b/SpeechT5/speecht5/models/t5_transformer_lm.py new file mode 100644 index 0000000..7b20b7f --- /dev/null +++ b/SpeechT5/speecht5/models/t5_transformer_lm.py @@ -0,0 +1,25 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +from fairseq.models import ( + register_model_architecture, +) +from fairseq.models.transformer_lm import base_lm_architecture + + +@register_model_architecture(model_name="transformer_lm", arch_name="transformer_lm_t5") +def transformer_lm_t5(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1280) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 6144) + args.decoder_layers = getattr(args, "decoder_layers", 20) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) diff --git a/SpeechT5/speecht5/sequence_generator.py b/SpeechT5/speecht5/sequence_generator.py new file mode 100644 index 0000000..46fc676 --- /dev/null +++ b/SpeechT5/speecht5/sequence_generator.py @@ -0,0 +1,1080 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import math +from typing import Dict, List, Optional +import sys + +import torch +import torch.nn as nn +from fairseq import search, utils +from fairseq.data import data_utils +from fairseq.models import FairseqIncrementalDecoder +from torch import Tensor +from fairseq.ngram_repeat_block import NGramRepeatBlock +from espnet.nets.ctc_prefix_score import CTCPrefixScore +import numpy + +CTC_SCORING_RATIO = 7.0 + +class SequenceGenerator(nn.Module): + def __init__( + self, + models, + tgt_dict, + beam_size=1, + max_len_a=0, + max_len_b=200, + max_len=0, + min_len=1, + normalize_scores=True, + len_penalty=1.0, + unk_penalty=0.0, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + search_strategy=None, + eos=None, + symbols_to_strip_from_output=None, + lm_model=None, + lm_weight=1.0, + ctc_weight=0.0, + ): + """Generates translations of a given source sentence. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models, + currently support fairseq.models.TransformerModel for scripting + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + max_len (int, optional): the maximum length of the generated output + (not including end-of-sentence) + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + """ + super().__init__() + if isinstance(models, EnsembleModel): + self.model = models + else: + self.model = EnsembleModel(models) + self.tgt_dict = tgt_dict + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() if eos is None else eos + self.blank = self.tgt_dict.index("<ctc_blank>") + self.mask = self.tgt_dict.index("<mask>") + self.mask_idxs = [] + if self.tgt_dict.index("<mask>0") != self.unk: + count = 0 + while self.tgt_dict.index("<mask>" + str(count)) != self.unk: + self.mask_idxs.append(self.tgt_dict.index("<mask>" + str(count))) + count += 1 + self.mask_idxs = torch.tensor(self.mask_idxs) + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos}) + if symbols_to_strip_from_output is not None + else {self.eos} + ) + self.vocab_size = len(tgt_dict) + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.max_len = max_len or self.model.max_decoder_positions() + + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.temperature = temperature + self.match_source_len = match_source_len + + if no_repeat_ngram_size > 0: + self.repeat_ngram_blocker = NGramRepeatBlock(no_repeat_ngram_size) + else: + self.repeat_ngram_blocker = None + + assert temperature > 0, "--temperature must be greater than 0" + + self.search = ( + search.BeamSearch(tgt_dict) if search_strategy is None else search_strategy + ) + # We only need to set src_lengths in LengthConstrainedBeamSearch. + # As a module attribute, setting it would break in multithread + # settings when the model is shared. + self.should_set_src_lengths = ( + hasattr(self.search, "needs_src_lengths") and self.search.needs_src_lengths + ) + + self.model.eval() + + self.lm_model = lm_model + self.lm_weight = lm_weight + self.ctc_weight = ctc_weight + if self.lm_model is not None: + self.lm_model.eval() + + def cuda(self): + self.model.cuda() + return self + + @torch.no_grad() + def forward( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + """Generate a batch of translations. + + Args: + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, prefix_tokens, bos_token=bos_token) + + # TODO(myleott): unused, deprecate after pytorch-translate migration + def generate_batched_itr(self, data_itr, beam_size=None, cuda=False, timer=None): + """Iterate over a batched dataset and yield individual translations. + Args: + cuda (bool, optional): use GPU for generation + timer (StopwatchMeter, optional): time generations + """ + for sample in data_itr: + s = utils.move_to_cuda(sample) if cuda else sample + if "net_input" not in s: + continue + input = s["net_input"] + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in input.items() if k != "prev_output_tokens" + } + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate(encoder_input) + if timer is not None: + timer.stop(sum(len(h[0]["tokens"]) for h in hypos)) + for i, id in enumerate(s["id"].data): + # remove padding + src = utils.strip_pad(input["src_tokens"].data[i, :], self.pad) + ref = ( + utils.strip_pad(s["target"].data[i, :], self.pad) + if s["target"] is not None + else None + ) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate(self, models, sample: Dict[str, Dict[str, Tensor]], **kwargs): + """Generate translations. Match the api of other fairseq generators. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + constraints (torch.LongTensor, optional): force decoder to include + the list of constraints + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, **kwargs) + + def _generate( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + constraints: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(self.model.models_size) + ], + ) + net_input = sample["net_input"] + + if "src_tokens" in net_input: + src_tokens = net_input["src_tokens"] + # length of the source text being the character length except EndOfSentence and pad + src_lengths = ( + (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)).long().sum(dim=1) + ) + elif "source" in net_input: + src_tokens = net_input["source"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + elif "features" in net_input: + src_tokens = net_input["features"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + else: + raise Exception("expected src_tokens or source in net input. input keys: " + str(net_input.keys())) + + # bsz: total number of sentences in beam + # Note that src_tokens may have more than 2 dimensions (i.e. audio features) + bsz, src_len = src_tokens.size()[:2] + beam_size = self.beam_size + + if constraints is not None and not self.search.supports_constraints: + raise NotImplementedError( + "Target-side constraints were provided, but search method doesn't support them" + ) + + # Initialize constraints, when active + self.search.init_constraints(constraints, beam_size) + + max_len: int = -1 + if self.match_source_len: + max_len = src_lengths.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + self.max_len - 1, + ) + assert ( + self.min_len <= max_len + ), "min_len cannot be larger than max_len, please adjust these!" + # compute the encoder output for each beam + encoder_outs = self.model.forward_encoder(net_input) + + # Get CTC lprobs and prep ctc_scorer + if self.ctc_weight > 0: + ctc_lprobs = self.model.models[0].get_normalized_probs_for_ctc( + encoder_outs[0], log_probs=True + ).contiguous().transpose(0, 1) # (B, T, C) from the encoder + + hyp = {} + ctc_prefix_score = CTCPrefixScore(ctc_lprobs[0].detach().cpu().numpy(), self.blank, self.eos, numpy) + hyp["ctc_state_prev"] = ctc_prefix_score.initial_state() + hyp["ctc_score_prev"] = 0.0 + ctc_beam = min(ctc_lprobs.shape[-1] - self.mask_idxs.size(-1), int(beam_size * CTC_SCORING_RATIO)) + ctc_hyps = {str(self.eos): hyp} + + # placeholder of indices for bsz * beam_size to hold tokens and accumulative scores + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(src_tokens.device).long() + encoder_outs = self.model.reorder_encoder_out(encoder_outs, new_order) + # ensure encoder_outs is a List. + assert encoder_outs is not None + + # initialize buffers + scores = ( + torch.zeros(bsz * beam_size, max_len + 1).to(src_tokens).float() + ) # +1 for eos; pad is never chosen for scoring + tokens = ( + torch.zeros(bsz * beam_size, max_len + 2) + .to(src_tokens) + .long() + .fill_(self.pad) + ) # +2 for eos and pad + tokens[:, 0] = self.eos if bos_token is None else bos_token + attn: Optional[Tensor] = None + + # A list that indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = ( + torch.zeros(bsz, beam_size).to(src_tokens).eq(-1) + ) # forward and backward-compatible False mask + + # list of completed sentences + finalized = torch.jit.annotate( + List[List[Dict[str, Tensor]]], + [torch.jit.annotate(List[Dict[str, Tensor]], []) for i in range(bsz)], + ) # contains lists of dictionaries of infomation about the hypothesis being finalized at each step + + # a boolean array indicating if the sentence at the index is finished or not + finished = [False for i in range(bsz)] + num_remaining_sent = bsz # number of sentences remaining + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = ( + (torch.arange(0, bsz) * beam_size) + .unsqueeze(1) + .type_as(tokens) + .to(src_tokens.device) + ) + cand_offsets = torch.arange(0, cand_size).type_as(tokens).to(src_tokens.device) + + reorder_state: Optional[Tensor] = None + ctc_state = None + batch_idxs: Optional[Tensor] = None + + original_batch_idxs: Optional[Tensor] = None + if "id" in sample and isinstance(sample["id"], Tensor): + original_batch_idxs = sample["id"] + else: + original_batch_idxs = torch.arange(0, bsz).type_as(tokens) + + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as( + batch_idxs + ) + reorder_state.view(-1, beam_size).add_( + corr.unsqueeze(-1) * beam_size + ) + original_batch_idxs = original_batch_idxs[batch_idxs] + self.model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = self.model.reorder_encoder_out( + encoder_outs, reorder_state + ) + + lprobs, avg_attn_scores = self.model.forward_decoder( + tokens[:, : step + 1], + encoder_outs, + incremental_states, + self.temperature, + ) + + if self.ctc_weight > 0 and step != 0: + # lprobs[:, self.blank] = -math.inf # never select blank + ctc_lprobs = lprobs.clone() + ctc_lprobs[:, self.blank] = -math.inf # never select blank + if self.mask != self.unk: + ctc_lprobs[:, self.mask] = -math.inf # never select mask + if self.mask_idxs.size(0) != 0: + ctc_lprobs[:, self.mask_idxs] = -math.inf # never select mask + local_best_scores, local_best_ids = torch.topk(ctc_lprobs, ctc_beam, dim=-1) + for b in range(tokens.size(0)): + hyp_key = " ".join(str(x) for x in tokens[b, : step + 1].tolist()) + ctc_scores, ctc_states = ctc_prefix_score( + tokens[b, : step + 1].cpu(), local_best_ids[b].cpu(), ctc_hyps[hyp_key]["ctc_state_prev"] + ) + lprobs[b] = lprobs[b] + lprobs[b, local_best_ids[b]] = (1 - self.ctc_weight) * (lprobs[b, local_best_ids[b]]) + self.ctc_weight * torch.from_numpy( + ctc_scores - ctc_hyps[hyp_key]["ctc_score_prev"] + ).to(device="cuda") + for j in range(len(local_best_ids[b])): + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())] = {} + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_score_prev"] = ctc_scores[j] + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_state_prev"] = ctc_states[j] + + # local_ctc_scores, ctc_state = ctc_scorer( + # tokens[:, : step + 1], ctc_state, part_ids + # ) + # lprobs += local_ctc_scores * self.ctc_weight + elif self.ctc_weight > 0 and step == 0: + ctc_lprobs = lprobs.clone() + ctc_lprobs[:, self.blank] = -math.inf # never select blank + if self.mask != self.unk: + ctc_lprobs[:, self.mask] = -math.inf # never select mask + if self.mask_idxs.size(0) != 0: + ctc_lprobs[:, self.mask_idxs] = -math.inf # never select mask + local_best_scores, local_best_ids = torch.topk(ctc_lprobs, ctc_beam, dim=-1) + for b in range(tokens.size(0)): + hyp_key = " ".join(str(x) for x in tokens[b, : step + 1].tolist()) + ctc_scores, ctc_states = ctc_prefix_score( + tokens[b, : step + 1].cpu(), local_best_ids[b].cpu(), ctc_hyps[hyp_key]["ctc_state_prev"] + ) + lprobs[b] = lprobs[b] + lprobs[b, local_best_ids[b]] = (1 - self.ctc_weight) * (lprobs[b, local_best_ids[b]]) + self.ctc_weight * torch.from_numpy( + ctc_scores - ctc_hyps[hyp_key]["ctc_score_prev"] + ).to(device="cuda") + for j in range(len(local_best_ids[b])): + if b == 0: + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())] = {} + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_score_prev"] = ctc_scores[j] + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_state_prev"] = ctc_states[j] + + if self.lm_model is not None: + lm_out = self.lm_model(tokens[:, : step + 1]) + probs = self.lm_model.get_normalized_probs( + lm_out, log_probs=True, sample=None + ) + probs = probs[:, -1, :] * self.lm_weight + lprobs[:, :probs.size(1)] += probs + + # handle prefix tokens (possibly with different lengths) + if ( + prefix_tokens is not None + and step < prefix_tokens.size(1) + and step < max_len + ): + lprobs, tokens, scores = self._prefix_tokens( + step, lprobs, scores, tokens, prefix_tokens, beam_size + ) + elif step < self.min_len: + # minimum length constraint (does not apply if using prefix_tokens) + lprobs[:, self.eos] = -math.inf + + lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs) + + lprobs[:, self.pad] = -math.inf # never select pad + lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + lprobs[:, self.blank] = -math.inf # never select blank + if self.mask != self.unk: + lprobs[:, self.mask] = -math.inf # never select mask + if self.mask_idxs.size(0) != 0: + lprobs[:, self.mask_idxs] = -math.inf # never select mask + + # handle max length constraint + if step >= max_len: + lprobs[:, : self.eos] = -math.inf + lprobs[:, self.eos + 1 :] = -math.inf + + # Record attention scores, only support avg_attn_scores is a Tensor + if avg_attn_scores is not None: + if attn is None: + attn = torch.empty( + bsz * beam_size, avg_attn_scores.size(1), max_len + 2 + ).to(scores) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(lprobs) + eos_bbsz_idx = torch.empty(0).to( + tokens + ) # indices of hypothesis ending with eos (finished sentences) + eos_scores = torch.empty(0).to( + scores + ) # scores of hypothesis ending with eos (finished sentences) + + if self.should_set_src_lengths: + self.search.set_src_lengths(src_lengths) + + if self.repeat_ngram_blocker is not None: + lprobs = self.repeat_ngram_blocker(tokens, lprobs, bsz, beam_size, step) + + # Shape: (batch, cand_size) + cand_scores, cand_indices, cand_beams = self.search.step( + step, + lprobs.view(bsz, -1, self.vocab_size), + scores.view(bsz, beam_size, -1)[:, :, :step], + tokens[:, : step + 1], + original_batch_idxs, + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos + # Shape of eos_mask: (batch size, beam size) + eos_mask = cand_indices.eq(self.eos) & cand_scores.ne(-math.inf) + eos_mask[:, :beam_size][cands_to_ignore] = torch.tensor(0).to(eos_mask) + + # only consider eos when it's among the top beam_size indices + # Now we know what beam item(s) to finish + # Shape: 1d list of absolute-numbered + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents: List[int] = [] + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + cand_scores[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = self.finalize_hypos( + step, + eos_bbsz_idx, + eos_scores, + tokens, + scores, + finalized, + finished, + beam_size, + attn, + src_lengths, + max_len, + ) + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + if self.search.stop_on_max_len and step >= max_len: + break + assert step < max_len, f"{step} < {max_len}" + + # Remove finalized sentences (ones for which {beam_size} + # finished hypotheses have been generated) from the batch. + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = torch.ones( + bsz, dtype=torch.bool, device=cand_indices.device + ) + batch_mask[finalized_sents] = False + # TODO replace `nonzero(as_tuple=False)` after TorchScript supports it + batch_idxs = torch.arange( + bsz, device=cand_indices.device + ).masked_select(batch_mask) + + # Choose the subset of the hypothesized constraints that will continue + self.search.prune_sentences(batch_idxs) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + cand_scores = cand_scores[batch_idxs] + cand_indices = cand_indices[batch_idxs] + + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths = src_lengths[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view( + new_bsz * beam_size, attn.size(1), -1 + ) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos hypos + # and values < cand_size indicate candidate active hypos. + # After, the min values per row are the top candidate active hypos + + # Rewrite the operator since the element wise or is not supported in torchscript. + + eos_mask[:, :beam_size] = ~((~cands_to_ignore) & (~eos_mask[:, :beam_size])) + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just + # the hypos with the smallest values in active_mask. + # {active_hypos} indicates which {beam_size} hypotheses + # from the list of {2 * beam_size} candidates were + # selected. Shapes: (batch size, beam size) + new_cands_to_ignore, active_hypos = torch.topk( + active_mask, k=beam_size, dim=1, largest=False + ) + + # update cands_to_ignore to ignore any finalized hypos. + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + # Make sure there is at least one active item for each sentence in the batch. + assert (~cands_to_ignore).any(dim=1).all() + + # update cands_to_ignore to ignore any finalized hypos + + # {active_bbsz_idx} denotes which beam number is continued for each new hypothesis (a beam + # can be selected more than once). + active_bbsz_idx = torch.gather(cand_bbsz_idx, dim=1, index=active_hypos) + active_scores = torch.gather(cand_scores, dim=1, index=active_hypos) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + + # Set the tokens for each beam (can select the same row more than once) + tokens[:, : step + 1] = torch.index_select( + tokens[:, : step + 1], dim=0, index=active_bbsz_idx + ) + # Select the next token for each of them + tokens.view(bsz, beam_size, -1)[:, :, step + 1] = torch.gather( + cand_indices, dim=1, index=active_hypos + ) + if step > 0: + scores[:, :step] = torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx + ) + scores.view(bsz, beam_size, -1)[:, :, step] = torch.gather( + cand_scores, dim=1, index=active_hypos + ) + + # Update constraints based on which candidates were selected for the next beam + self.search.update_constraints(active_hypos) + + # copy attention for active hypotheses + if attn is not None: + attn[:, :, : step + 2] = torch.index_select( + attn[:, :, : step + 2], dim=0, index=active_bbsz_idx + ) + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # if self.ctc_weight > 0: + # accum_best_id = torch.gather(cand_indices, dim=1, index=active_hypos) + # ctc_state = ctc_scorer.index_select_state( + # ctc_state, accum_best_id + # ) + + # sort by score descending + for sent in range(len(finalized)): + scores = torch.tensor( + [float(elem["score"].item()) for elem in finalized[sent]] + ) + _, sorted_scores_indices = torch.sort(scores, descending=True) + finalized[sent] = [finalized[sent][ssi] for ssi in sorted_scores_indices] + finalized[sent] = torch.jit.annotate( + List[Dict[str, Tensor]], finalized[sent] + ) + return finalized + + def _prefix_tokens( + self, step: int, lprobs, scores, tokens, prefix_tokens, beam_size: int + ): + """Handle prefix tokens""" + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_lprobs = lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + prefix_mask = prefix_toks.ne(self.pad) + lprobs[prefix_mask] = torch.min(prefix_lprobs) - 1 + lprobs[prefix_mask] = lprobs[prefix_mask].scatter( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lprobs[prefix_mask] + ) + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[ + :, 0, 1 : step + 1 + ] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = self.replicate_first_beam(tokens, eos_mask_batch_dim, beam_size) + scores = self.replicate_first_beam(scores, eos_mask_batch_dim, beam_size) + lprobs = self.replicate_first_beam(lprobs, eos_mask_batch_dim, beam_size) + return lprobs, tokens, scores + + def replicate_first_beam(self, tensor, mask, beam_size: int): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + def finalize_hypos( + self, + step: int, + bbsz_idx, + eos_scores, + tokens, + scores, + finalized: List[List[Dict[str, Tensor]]], + finished: List[bool], + beam_size: int, + attn: Optional[Tensor], + src_lengths, + max_len: int, + ): + """Finalize hypothesis, store finalized information in `finalized`, and change `finished` accordingly. + A sentence is finalized when {beam_size} finished items have been collected for it. + Returns number of sentences (not beam items) being finalized. + These will be removed from the batch and not processed further. + Args: + bbsz_idx (Tensor): + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors. + # tokens is (batch * beam, max_len). So the index_select + # gets the newly EOS rows, then selects cols 1..{step + 2} + tokens_clone = tokens.index_select(0, bbsz_idx)[ + :, 1 : step + 2 + ] # skip the first index, which is EOS + + tokens_clone[:, step] = self.eos + attn_clone = ( + attn.index_select(0, bbsz_idx)[:, :, 1 : step + 2] + if attn is not None + else None + ) + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, : step + 1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + eos_scores /= (step + 1) ** self.len_penalty + + # cum_unfin records which sentences in the batch are finished. + # It helps match indexing between (a) the original sentences + # in the batch and (b) the current, possibly-reduced set of + # sentences. + cum_unfin: List[int] = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + cum_fin_tensor = torch.tensor(cum_unfin, dtype=torch.int).to(bbsz_idx) + + unfin_idx = bbsz_idx // beam_size + sent = unfin_idx + torch.index_select(cum_fin_tensor, 0, unfin_idx) + + # Create a set of "{sent}{unfin_idx}", where + # "unfin_idx" is the index in the current (possibly reduced) + # list of sentences, and "sent" is the index in the original, + # unreduced batch + # For every finished beam item + # sentence index in the current (possibly reduced) batch + seen = (sent << 32) + unfin_idx + unique_seen: List[int] = torch.unique(seen).tolist() + + if self.match_source_len: + condition = step > torch.index_select(src_lengths, 0, unfin_idx) + eos_scores = torch.where(condition, torch.tensor(-math.inf), eos_scores) + sent_list: List[int] = sent.tolist() + for i in range(bbsz_idx.size()[0]): + # An input sentence (among those in a batch) is finished when + # beam_size hypotheses have been collected for it + if len(finalized[sent_list[i]]) < beam_size: + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i] + else: + hypo_attn = torch.empty(0) + + finalized[sent_list[i]].append( + { + "tokens": tokens_clone[i], + "score": eos_scores[i], + "attention": hypo_attn, # src_len x tgt_len + "alignment": torch.empty(0), + "positional_scores": pos_scores[i], + } + ) + + newly_finished: List[int] = [] + for unique_s in unique_seen: + # check termination conditions for this sentence + unique_sent: int = unique_s >> 32 + unique_unfin_idx: int = unique_s - (unique_sent << 32) + + if not finished[unique_sent] and self.is_finished( + step, unique_unfin_idx, max_len, len(finalized[unique_sent]), beam_size + ): + finished[unique_sent] = True + newly_finished.append(unique_unfin_idx) + + return newly_finished + + def is_finished( + self, + step: int, + unfin_idx: int, + max_len: int, + finalized_sent_len: int, + beam_size: int, + ): + """ + Check whether decoding for a sentence is finished, which + occurs when the list of finalized sentences has reached the + beam size, or when we reach the maximum length. + """ + assert finalized_sent_len <= beam_size + if finalized_sent_len == beam_size or step == max_len: + return True + return False + + +class EnsembleModel(nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models_size = len(models) + # method '__len__' is not supported in ModuleList for torch script + self.single_model = models[0] + self.models = nn.ModuleList(models) + + self.has_incremental: bool = False + if all( + hasattr(m, "decoder") and isinstance(m.decoder, FairseqIncrementalDecoder) + for m in models + ): + self.has_incremental = True + + def forward(self): + pass + + def has_encoder(self): + return hasattr(self.single_model, "encoder") + + def is_t5_structure(self): + t5_structure = hasattr(self.single_model, "text_encoder_prenet") and hasattr(self.single_model, "speech_encoder_prenet") or \ + hasattr(self.single_model, "encoder_prenet") and hasattr(self.single_model, "encoder_prenet") + return t5_structure + + def has_incremental_states(self): + return self.has_incremental + + def max_decoder_positions(self): + return min([m.max_decoder_positions() for m in self.models if hasattr(m, "max_decoder_positions")] + [sys.maxsize]) + + @torch.jit.export + def forward_encoder(self, net_input: Dict[str, Tensor]): + if not self.has_encoder(): + return None + elif self.is_t5_structure(): + return [model.forward_encoder_torchscript(net_input) for model in self.models] + else: + return [model.encoder.forward_torchscript(net_input) for model in self.models] + + @torch.jit.export + def forward_decoder( + self, + tokens, + encoder_outs: List[Dict[str, List[Tensor]]], + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + temperature: float = 1.0, + ): + log_probs = [] + avg_attn: Optional[Tensor] = None + encoder_out: Optional[Dict[str, List[Tensor]]] = None + for i, model in enumerate(self.models): + if self.has_encoder(): + encoder_out = encoder_outs[i] + # decode each model + if self.has_incremental_states(): + if self.is_t5_structure: + decoder_out = model.forward_decoder( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i] + ) + else: + decoder_out = model.decoder.forward( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i], + ) + else: + if hasattr(model, "decoder"): + decoder_out = model.decoder.forward(tokens, encoder_out=encoder_out) + else: + decoder_out = model.forward(tokens) + + attn: Optional[Tensor] = None + decoder_len = len(decoder_out) + if decoder_len > 1 and decoder_out[1] is not None: + if isinstance(decoder_out[1], Tensor): + attn = decoder_out[1] + else: + attn_holder = decoder_out[1]["attn"] + if isinstance(attn_holder, Tensor): + attn = attn_holder + elif attn_holder is not None: + attn = attn_holder[0] + if attn is not None: + attn = attn[:, -1, :] + + decoder_out_tuple = ( + decoder_out[0][:, -1:, :].div_(temperature), + None if decoder_len <= 1 else decoder_out[1], + ) + probs = model.get_normalized_probs( + decoder_out_tuple, log_probs=True, sample=None + ) + probs = probs[:, -1, :] + if self.models_size == 1: + return probs, attn + + log_probs.append(probs) + if attn is not None: + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + + avg_probs = torch.logsumexp(torch.stack(log_probs, dim=0), dim=0) - math.log( + self.models_size + ) + + if avg_attn is not None: + avg_attn.div_(self.models_size) + return avg_probs, avg_attn + + @torch.jit.export + def reorder_encoder_out( + self, encoder_outs: Optional[List[Dict[str, List[Tensor]]]], new_order + ): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_outs: List[Dict[str, List[Tensor]]] = [] + if not self.has_encoder(): + return new_outs + for i, model in enumerate(self.models): + assert encoder_outs is not None + new_outs.append( + model.encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + return new_outs + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + new_order, + ): + if not self.has_incremental_states(): + return + for i, model in enumerate(self.models): + model.decoder.reorder_incremental_state_scripting( + incremental_states[i], new_order + ) + + +class SequenceGeneratorWithAlignment(SequenceGenerator): + def __init__( + self, models, tgt_dict, left_pad_target=False, print_alignment="hard", **kwargs + ): + """Generates translations of a given source sentence. + + Produces alignments following "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + left_pad_target (bool, optional): Whether or not the + hypothesis should be left padded or not when they are + teacher forced for generating alignments. + """ + super().__init__(EnsembleModelWithAlignment(models), tgt_dict, **kwargs) + self.left_pad_target = left_pad_target + + if print_alignment == "hard": + self.extract_alignment = utils.extract_hard_alignment + elif print_alignment == "soft": + self.extract_alignment = utils.extract_soft_alignment + + @torch.no_grad() + def generate(self, models, sample, **kwargs): + finalized = super()._generate(sample, **kwargs) + + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + beam_size = self.beam_size + ( + src_tokens, + src_lengths, + prev_output_tokens, + tgt_tokens, + ) = self._prepare_batch_for_alignment(sample, finalized) + if any(getattr(m, "full_context_alignment", False) for m in self.model.models): + attn = self.model.forward_align(src_tokens, src_lengths, prev_output_tokens) + else: + attn = [ + finalized[i // beam_size][i % beam_size]["attention"].transpose(1, 0) + for i in range(bsz * beam_size) + ] + + if src_tokens.device != "cpu": + src_tokens = src_tokens.to("cpu") + tgt_tokens = tgt_tokens.to("cpu") + attn = [i.to("cpu") for i in attn] + + # Process the attn matrix to extract hard alignments. + for i in range(bsz * beam_size): + alignment = self.extract_alignment( + attn[i], src_tokens[i], tgt_tokens[i], self.pad, self.eos + ) + finalized[i // beam_size][i % beam_size]["alignment"] = alignment + return finalized + + def _prepare_batch_for_alignment(self, sample, hypothesis): + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + src_tokens = ( + src_tokens[:, None, :] + .expand(-1, self.beam_size, -1) + .contiguous() + .view(bsz * self.beam_size, -1) + ) + src_lengths = sample["net_input"]["src_lengths"] + src_lengths = ( + src_lengths[:, None] + .expand(-1, self.beam_size) + .contiguous() + .view(bsz * self.beam_size) + ) + prev_output_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=True, + ) + tgt_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=False, + ) + return src_tokens, src_lengths, prev_output_tokens, tgt_tokens + + +class EnsembleModelWithAlignment(EnsembleModel): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__(models) + + def forward_align(self, src_tokens, src_lengths, prev_output_tokens): + avg_attn = None + for model in self.models: + decoder_out = model(src_tokens, src_lengths, prev_output_tokens) + attn = decoder_out[1]["attn"][0] + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + if len(self.models) > 1: + avg_attn.div_(len(self.models)) + return avg_attn diff --git a/SpeechT5/speecht5/tasks/__init__.py b/SpeechT5/speecht5/tasks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechT5/speecht5/tasks/speecht5.py b/SpeechT5/speecht5/tasks/speecht5.py new file mode 100644 index 0000000..ff3c88e --- /dev/null +++ b/SpeechT5/speecht5/tasks/speecht5.py @@ -0,0 +1,700 @@ +# -------------------------------------------------------- +# SpeechT5: Unified-Modal Encoder-Decoder Pre-Training for Spoken Language Processing (https://arxiv.org/abs/2110.07205) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechT5 +# Copyright (c) 2021 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq and espnet code bases +# https://github.com/pytorch/fairseq; https://github.com/espnet/espnet +# -------------------------------------------------------- + +import logging +import os.path as op +from argparse import Namespace +from collections import OrderedDict + +import torch +from fairseq.data import ( + Dictionary, + encoders, + PrependTokenDataset, + AppendTokenDataset, + data_utils, + StripTokenDataset, + TokenBlockDataset, +) +from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq import utils +from speecht5.data.multitask_dataset import MultitaskDataset +from speecht5.data.speech_to_text_dataset import SpeechToTextDataset +from speecht5.data.text_to_speech_dataset import TextToSpeechDataset +from speecht5.data.speech_to_speech_dataset import SpeechToSpeechDataset +from speecht5.data.speech_to_class_dataset import SpeechToClassDataset +from speecht5.data.speech_dataset import SpeechPretrainDataset +from speecht5.data.text_dataset import TextPretrainDataset +from fairseq.data.shorten_dataset import maybe_shorten_dataset +from fairseq.tasks import LegacyFairseqTask, register_task +from fairseq.tasks.hubert_pretraining import LabelEncoder + +logger = logging.getLogger(__name__) + +TASK_NAME = ["s2t", "t2s", "s2s", "s2c", "pretrain"] + +@register_task("speecht5") +class SpeechT5Task(LegacyFairseqTask): + @staticmethod + def add_args(parser): + parser.add_argument("data", help="manifest root path") + parser.add_argument( + "--config-yaml", + type=str, + default="config.yaml", + help="Configuration YAML filename (under manifest root)", + ) + parser.add_argument( + "--max-speech-sample-size", + default=None, + type=int, + metavar="N", + help="max speech sample size", + ) + parser.add_argument( + "--min-speech-sample-size", + default=None, + type=int, + metavar="N", + help="min speech sample size", + ) + parser.add_argument( + "--max-speech-positions", + default=4000, + type=int, + metavar="N", + help="max number of tokens in the source sequence", + ) + parser.add_argument( + "--max-text-positions", + default=450, + type=int, + metavar="N", + help="max number of tokens in the target sequence", + ) + parser.add_argument( + '--t5-task', + choices=TASK_NAME, + help='task for training' + ) + parser.add_argument( + "--bpe-tokenizer", + type=str, + default=None, + help="bpe tokenizer for s2t", + ) + # Speaker Identification (SID) + parser.add_argument( + "--finetune-from-modules", + default=None, + # choices=[ + # "encoder-decoder", "encoder", "decoder", + # "speech_encoder_prenet-encoder-decoder-text_decoder_prenet-text_decoder_postnet", # ASR, T5 SID + # "speech_encoder_prenet-encoder-decoder-text_decoder_prenet-speaker_decoder_postnet", # SID + # "speech_encoder_prenet-encoder-decoder-speech_decoder_prenet-speech_decoder_postnet", # VC, SE + # "text_encoder_prenet-encoder-decoder-speech_decoder_prenet-speech_decoder_postnet", # TTS + # ], + help="If set, using part modules of finetune model.", + ) + parser.add_argument( + "--finetune-out-of-modules", + default=None, + # choices=[ + # "speaker_decoder_postnet", # SID + # "speech_decoder_postnet", # SE with reduction factor 1 + # ], + help="If set, remove part modules of finetune model.", + ) + # BART + parser.add_argument( + "--shorten-method", + default="none", + choices=["none", "truncate", "random_crop"], + help="if not none, shorten sequences that exceed --tokens-per-sample", + ) + parser.add_argument( + "--shorten-data-split-list", + default="", + help="comma-separated list of dataset splits to apply shortening to, " + 'e.g., "train,valid" (default: all dataset splits)', + ) + + parser.add_argument( + "--tokens-per-sample", + default=512, + type=int, + help="max number of total tokens over all segments" + " per sample for dataset", + ) + parser.add_argument( + "--sample-break-mode", + default="eos", + type=str, + help="mode for breaking sentence", + ) + parser.add_argument( + "--mask", + default=0.3, + type=float, + help="fraction of words/subwords that will be masked", + ) + parser.add_argument( + "--mask-random", + default=0.1, + type=float, + help="instead of using [MASK], use random token this often", + ) + parser.add_argument( + "--insert", + default=0.0, + type=float, + help="insert this percentage of additional random tokens", + ) + parser.add_argument( + "--permute", + default=0.0, + type=float, + help="take this proportion of subwords and permute them", + ) + parser.add_argument( + "--rotate", + default=0.0, + type=float, + help="rotate this proportion of inputs", + ) + parser.add_argument( + "--poisson-lambda", + default=3.5, + type=float, + help="randomly shuffle sentences for this proportion of inputs", + ) + parser.add_argument( + "--permute-sentences", + default=0.0, + type=float, + help="shuffle this proportion of sentences in all inputs", + ) + parser.add_argument( + "--mask-length", + default="span-poisson", + type=str, + choices=["subword", "word", "span-poisson"], + help="mask length to choose", + ) + parser.add_argument( + "--replace-length", + default=1, + type=int, + help="when masking N tokens, replace with 0, 1, or N tokens (use -1 for N)", + ) + parser.add_argument( + "--iid-noise-target", + action="store_true", + help="whether to use t5 form target", + ) + # Hubert + parser.add_argument( + "--hubert-labels", + nargs="*", + type=str, + default=['km'], + help="extension of the label files to load, frame-level labels for pre-training, and sequence-level label for fine-tuning", + ) + parser.add_argument( + "--hubert-label-dir", + type=str, + default=None, + help="if set, looks for labels in this directory instead", + ) + parser.add_argument( + "--sample-rate", + default=100, + type=float, + help="target sample rate. audio files will be up/down sampled to this rate", + ) + parser.add_argument( + "--label-rates", + default=-1, + type=float, + help="if set, looks for labels in this directory instead", + ) + parser.add_argument( + "--normalize", + action="store_true", + help="if set, normalizes input to have 0 mean and unit variance", + ) + parser.add_argument( + "--enable-padding", + action="store_true", + help="pad shorter samples instead of cropping", + ) + parser.add_argument( + "--pad-audio", + action="store_true", + help="pad audio to the longest one in the batch if true", + ) + parser.add_argument( + "--random-crop", + action="store_true", + help="always crop from the beginning if false", + ) + parser.add_argument( + "--single-target", + action="store_true", + help="if set, AddTargetDatasets outputs same keys " + "as AddTargetDataset", + ) + parser.add_argument( + "--batch-ratio", + default=None, + type=str, + help="ratio of bach size for each dataset", + ) + parser.add_argument( + "--sample-ratios", + default=None, + type=str, + help="ratio of sample for each dataset", + ) + parser.add_argument( + "--ctc-weight", + type=float, + default=0.0, + help="ctc weight for inference", + ) + + def __init__(self, args, dicts, config): + super().__init__(args) + self.dicts = dicts + self.config = config + self.t5_task = args.t5_task + # Used for filter size + if self.t5_task in ['s2t', 't2s', 's2s', 's2c']: + self.max_pos = [self.args.max_speech_positions * 256] + elif self.t5_task == 'pretrain': + self.max_pos = [self.args.max_speech_positions * 256, self.args.max_text_positions] + + self.mask_idx = self.dicts["text"].add_symbol("<mask>") + # add blank token for ctc + # if args.ctc_weight > 0: + self.blank_symbol_idx = self.dicts["text"].add_symbol("<ctc_blank>") + self.blank_symbol = "<ctc_blank>" + + # add mask token + if hasattr(args, "iid_noise_target") and args.iid_noise_target: + self.uni_mask_idxs = [] + for i in range(600): + self.uni_mask_idxs.append(self.dicts["text"].add_symbol("<mask>" + str(i))) + self.uni_mask_idxs = torch.tensor(self.uni_mask_idxs) + + self.seed = args.seed + + @classmethod + def setup_task(cls, args, **kwargs): + # load dictionaries and config + dicts = OrderedDict() + if args.t5_task == 'pretrain' and not hasattr(args, "shuffle_instance"): + args.shuffle_instance = False + + # Prepare config + config = None + logger.info('No config file for ' + args.t5_task) + + if args.t5_task == "pretrain": + dicts["hubert"] = [Dictionary.load(f"{args.hubert_label_dir}/dict.{label}.txt") for label in args.hubert_labels] + dicts["text"] = Dictionary.load(op.join(args.data, "dict.txt")) + else: + if config is None: + dicts["text"] = Dictionary.load(op.join(args.data, "dict.txt")) + else: + dicts["text"] = Dictionary.load(op.join(args.data, config.vocab_filename)) + + return cls(args, dicts, config) + + def build_criterion(self, args): + from fairseq import criterions + return criterions.build_criterion(args, self) + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + sample_ratios = [] + if self.t5_task == "s2t": + ## For speech to text task + bpe_tokenizer = self.build_bpe(self.args) + manifest = f"{self.args.data}/{split}.tsv" + procs = [LabelEncoder(self.dicts["text"])] + paths = [f"{self.args.hubert_label_dir}/{split}.txt"] + self.datasets[split] = SpeechToTextDataset( + manifest, + sample_rate=self.args.sample_rate, + label_paths=paths, + label_processors=procs, + max_keep_sample_size=self.max_pos[0] if self.args.max_speech_sample_size is None else self.args.max_speech_sample_size, + min_keep_sample_size=self.args.min_speech_sample_size, + normalize=self.args.normalize, + store_labels=False, + tgt_dict=self.dicts["text"], + tokenizer=bpe_tokenizer, + ) + elif self.t5_task == "t2s": + ## For text to speech task + from fairseq.data import ConcatDataset + bpe_tokenizer = self.build_bpe(self.args) + procs = [LabelEncoder(self.dicts["text"])] + t2s_datasets = [ + TextToSpeechDataset( + manifest_path=f"{self.args.data}/{name}.tsv", + sample_rate=self.args.sample_rate, + label_paths=[f"{self.args.hubert_label_dir}/{name}.txt"], + label_processors=procs, + max_keep_sample_size=self.max_pos[0], + normalize=self.args.normalize, + store_labels=False, + src_dict=self.dicts["text"], + tokenizer=bpe_tokenizer, + reduction_factor=self.args.reduction_factor, + ) + for name in split.split(",") + ] + self.datasets[split] = ConcatDataset(t2s_datasets) if len(t2s_datasets) > 1 else t2s_datasets[0] + elif self.t5_task == "s2s": + manifest = f"{self.args.data}/{split}.tsv" + self.datasets[split] = SpeechToSpeechDataset( + manifest_path=manifest, + sample_rate=self.args.sample_rate, + max_keep_sample_size=self.max_pos[0] if self.args.max_speech_sample_size is None else self.args.max_speech_sample_size, + min_keep_sample_size=self.args.min_speech_sample_size, + normalize=self.args.normalize, + reduction_factor=self.args.reduction_factor, + ) + elif self.t5_task == "s2c": + is_train_split = ("train" in split) + is_valid_split = ("valid" in split) + if is_train_split: + max_length = 51200 + elif is_valid_split: + max_length = 76800 + else: + max_length = 2560000 + manifest = op.join(f"{self.args.data}", f"{split}.tsv") + procs = LabelEncoder(self.dicts["text"]) # map speaker to id + self.datasets[split] = SpeechToClassDataset( + manifest_path=manifest, + sample_rate=self.args.sample_rate, + label_processors=procs, + max_keep_sample_size=self.max_pos[0] if self.args.max_speech_sample_size is None else self.args.max_speech_sample_size, + min_keep_sample_size=self.args.min_speech_sample_size, + normalize=self.args.normalize, + tgt_dict=self.dicts["text"], + max_length=max_length + ) + elif self.t5_task == "pretrain": + is_train_split = ("train" in split) + pretrain_datasets = [] + speech_split, text_split = split.split('|') + + ## Speech pre-train + manifest = f"{self.args.data}/{speech_split}.tsv" + dicts = self.dicts["hubert"] + pad_list = [dict.pad() for dict in dicts] + eos_list = [dict.eos() for dict in dicts] + procs = [LabelEncoder(dict) for dict in dicts] + paths = [ + f"{self.args.hubert_label_dir}/{speech_split}.{l}" for l in self.args.hubert_labels + ] + # hubert v1: pad_audio=True, random_crop=False; + self.args.dec_weight = getattr(self.args, "dec_weight", 1.0) + pretrain_datasets.append( + SpeechPretrainDataset( + manifest, + sample_rate=self.args.sample_rate, + label_paths=paths, + label_rates=self.args.label_rates, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=None, + min_keep_sample_size=32000, + max_sample_size=self.args.max_speech_sample_size, + pad_audio=self.args.pad_audio, + normalize=self.args.normalize, + store_labels=False, + random_crop=self.args.random_crop, + single_target=self.args.single_target, + reduction_factor=self.args.reduction_factor, + ) + ) + sample_ratios.append(sum([pretrain_datasets[0].size(i) for i in range(len(pretrain_datasets[0]))])) + + ## Text pre-train + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + split_path = op.join(data_path, text_split) + bart_dataset = data_utils.load_indexed_dataset( + split_path, + self.dicts["text"], + self.args.dataset_impl, + combine=combine, + ) + if bart_dataset is None: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(text_split, split_path) + ) + bart_dataset = StripTokenDataset(bart_dataset, self.dicts["text"].eos()) + bart_dataset = maybe_shorten_dataset( + bart_dataset, + text_split, + self.args.shorten_data_split_list, + self.args.shorten_method, + self.args.tokens_per_sample, + self.args.seed, + ) + # create continuous blocks of tokens + bart_dataset = TokenBlockDataset( + bart_dataset, + bart_dataset.sizes, + self.args.tokens_per_sample - 2, # one less for <s> and one for </s> + pad=self.dicts["text"].pad(), + eos=self.dicts["text"].eos(), + break_mode=self.args.sample_break_mode, + document_sep_len=0, + ) + # prepend beginning-of-sentence token (<s>, equiv. to [CLS] in BERT) + bart_dataset = PrependTokenDataset(bart_dataset, self.dicts["text"].bos()) + bart_dataset = AppendTokenDataset(bart_dataset, self.dicts["text"].eos()) + mask_whole_words = ( + get_whole_word_mask(self.args, self.dicts["text"]) + if self.args.mask_length != "subword" + else None + ) + self.args.bert_weight = getattr(self.args, "bert_weight", 0.0) + pretrain_datasets.append( + TextPretrainDataset( + bart_dataset, + bart_dataset.sizes, + self.dicts["text"], + self.mask_idx, + mask_whole_words, + shuffle=self.args.shuffle_instance, + seed=self.seed, + args=self.args, + iid_noise_target=self.args.iid_noise_target, + uni_mask_idxs=self.uni_mask_idxs if self.args.iid_noise_target else None, + ) + ) + sample_ratios.append(sum(pretrain_datasets[1].sizes)) + logger.info( + "Task: {0}, Loaded {1} samples of denoising_dataset".format( + 'bart', + len(pretrain_datasets[1]), + ) + ) + + logger.info('token ratio is ' + str(sample_ratios)) + if self.args.batch_ratio is not None: + batch_ratio = eval(self.args.batch_ratio) + assert len(batch_ratio) == len(sample_ratios) + sample_ratios = [sample_ratios[i] / batch_ratio[i] for i in range(len(sample_ratios))] + else: + batch_ratio = None + max_size = max(sample_ratios) + sample_ratios = [max_size / r for r in sample_ratios] + if hasattr(self.args, "sample_ratios") and self.args.sample_ratios is not None: + sample_ratios = eval(self.args.sample_ratios) + if is_train_split: + self.datasets[split] = MultitaskDataset( + pretrain_datasets, sample_ratios, batch_ratio + ) + else: + self.datasets[split] = MultitaskDataset( + pretrain_datasets, batch_ratio=batch_ratio + ) + + def train_step( + self, sample, model, criterion, optimizer, update_num, ignore_grad=False + ): + model.train() + model.set_num_updates(update_num) + + # Junyi: not use sample_size, but normalize the loss locally + agg_loss, agg_sample_size, agg_logging_output = 0.0, 1.0, {} + agg_logging_output['sample_size'] = 1 + + def forward_backward(model, samples, weight=1.0): + nonlocal agg_loss, agg_logging_output + if samples is None or len(samples) == 0: + return + loss, sample_size, logging_output = criterion(model, samples) + if ignore_grad: + loss *= 0 + else: + loss *= weight + loss = loss / sample_size + optimizer.backward(loss) + agg_loss += loss.detach().item() + # # TODO make summing of the sample sizes configurable + for k in logging_output: + if k == 'ntokens' or k == 'nsentences': + if k not in agg_logging_output: + agg_logging_output[k] = 0 + agg_logging_output[k] += logging_output[k] + # continue + # agg_logging_output[k] += logging_output[k] + # agg_logging_output[task_name] += logging_output[k] + agg_logging_output[samples['task_name']] = logging_output + + forward_backward(model, sample) + + agg_logging_output["loss"] = agg_loss + + return agg_loss, agg_sample_size, agg_logging_output + + def valid_step(self, sample, model, criterion): + model.eval() + with torch.no_grad(): + from collections import defaultdict + + agg_loss, agg_sample_size, agg_logging_output = 0.0, 1.0, defaultdict(float) + agg_logging_output['sample_size'] = 1 + loss, sample_size, logging_output = criterion(model, sample) + loss = loss / sample_size + # agg_loss += loss.data.item() if isinstance(loss, torch.Tensor) else loss + agg_loss += loss.item() if isinstance(loss, torch.Tensor) else loss + agg_logging_output[sample['task_name']] = logging_output + agg_logging_output["loss"] = agg_loss + return agg_loss, agg_sample_size, agg_logging_output + + @property + def target_dictionary(self): + return self.dicts["text"] + + @property + def source_dictionary(self): + return None + + def build_model(self, args): + try: + args.input_feat_per_channel = self.config.input_feat_per_channel + args.input_channels = self.config.input_channels + except Exception as e: + args.input_feat_per_channel = 80 + args.input_channels = 1 + logger.info(f"Cannot set input_feat_per_channel, input_channels, since: ") + logger.warn(e) + logger.info(f"Set to: {args.input_feat_per_channel} and {args.input_channels}") + + args.speech_odim = args.input_feat_per_channel * args.input_channels + + args.label_rates = self.args.label_rates + args.sample_rate = self.args.sample_rate + self.args.reduction_factor = args.reduction_factor + return super(SpeechT5Task, self).build_model(args) + + def build_generator( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + ): + from speecht5.sequence_generator import SequenceGenerator + extra_gen_cls_kwargs = { + "ctc_weight": self.args.ctc_weight, + **extra_gen_cls_kwargs + } + return super().build_generator( + models, args, seq_gen_cls=SequenceGenerator, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + def build_tokenizer(self, args): + if self.config is None: + logger.info(f"pre-tokenizer: None") + return encoders.build_tokenizer(Namespace(**{"tokenizer": None})) + else: + logger.info(f"pre-tokenizer: {self.config.pre_tokenizer}") + return encoders.build_tokenizer(Namespace(**self.config.pre_tokenizer)) + + def build_bpe(self, args): + if self.config is not None: + logger.info(f"tokenizer: {self.config.bpe_tokenizer}") + return encoders.build_bpe(Namespace(**self.config.bpe_tokenizer)) + else: + logger.info(f"tokenizer: {self.args.bpe_tokenizer}") + return encoders.build_bpe(Namespace(**{"bpe": "sentencepiece", "sentencepiece_model": self.args.bpe_tokenizer})) + + def generate_class(self, models, net_input, prefix_tokens, **kwargs): + with torch.no_grad(): + encoder_input = { + k: v for k, v in net_input.items() if k != "prev_output_tokens" and k != "task_name" + } + encoder_input.update(kwargs) + encoder_input.update({"prev_output_tokens": prefix_tokens}) + return models[0].generate_class(**encoder_input) + + def generate_speech(self, models, net_input, **kwargs): + with torch.no_grad(): + encoder_input = { + k: v for k, v in net_input.items() if k != "prev_output_tokens" and k != "task_name" + } + encoder_input.update(kwargs) + return models[0].generate_speech(**encoder_input) + + def inference_t2s( + self, models, sample + ): + with torch.no_grad(): + xs = sample['net_input']['src_tokens'] + spkemb = sample['net_input']['spkembs'] + return models[0].inference(xs, spkemb) + + def inference_s2s( + self, models, sample, force_equal_length=False + ): + with torch.no_grad(): + x = sample['net_input']['src_tokens'] + xlen = sample['net_input']['src_lengths'] + spkemb = sample['net_input']['spkembs'] + prev_output_tokens = sample['net_input']['prev_output_tokens'] + padding_mask = sample['net_input']['padding_mask'] + tgt_lengths = sample['net_input']['tgt_lengths'] + return models[0].inference_s2s(x, xlen, spkemb, prev_output_tokens, tgt_lengths, force_equal_length=force_equal_length, padding_mask=padding_mask) + + def inference_s2c( + self, models, sample + ): + with torch.no_grad(): + x = sample['net_input']['src_tokens'] + xlen = sample['net_input']['src_lengths'] + prev_output_tokens = sample['net_input']['prev_output_tokens'] + padding_mask = sample['net_input']['padding_mask'] + assert prev_output_tokens.size(1) == 1, prev_output_tokens.size() + return models[0].inference_s2c(x, xlen, prev_output_tokens, padding_mask=padding_mask) + + def filter_indices_by_size( + self, indices, dataset, max_positions=None, ignore_invalid_inputs=False + ): + """ + Filter examples that are too large + + Args: + indices (np.array): original array of sample indices + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + Returns: + np.array: array of filtered sample indices + """ + + indices, ignored = dataset.filter_indices_by_size( + indices, + self.max_pos + ) + return indices diff --git a/SpeechT5/speecht5_framework.png b/SpeechT5/speecht5_framework.png new file mode 100644 index 0000000000000000000000000000000000000000..1f86964fcb2a51c24b0a778365cc3733484ed470 GIT binary patch literal 637340 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 sznCoT@-|hB-wLDC*G#2Lyk1U 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�d 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 yF3RMSx7nD8+p42fbk#;5TgPD=aT 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≪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 literal 0 HcmV?d00001 diff --git a/SpeechT5/spm.py b/SpeechT5/spm.py new file mode 100644 index 0000000..e3b82aa --- /dev/null +++ b/SpeechT5/spm.py @@ -0,0 +1,13 @@ +import sentencepiece as spm + +# 加载模型 +sp = spm.SentencePieceProcessor() +sp.Load('/public/home/changhl/dataset/spm_char.model') # 加载之前训练好的模型 + +# 编码文本 +encoded_text = sp.EncodeAsPieces("Hello, world!") +print(encoded_text) # 输出编码后的结果 + +# 解码文本 +decoded_text = sp.DecodePieces(encoded_text) +print(decoded_text) # 输出解码后的原始文本 \ No newline at end of file diff --git a/SpeechUT/README.md b/SpeechUT/README.md new file mode 100644 index 0000000..e74967a --- /dev/null +++ b/SpeechUT/README.md @@ -0,0 +1,203 @@ +# SpeechUT +<!--**Pre-trained models for speech related tasks**--> + + [**SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training**](https://arxiv.org/abs/2210.03730) + + +- (Done) Oct 2022: release the code and models +- Oct 2022: release preprint in [arXiv](https://arxiv.org/abs/2210.03730) + +## Pre-Trained and Fine-tuned Models +| Model | Pre-training Dataset (unlabeled) | Fine-tuning Dataset (labeled) | Model | +| :------: | :----------------------------------------------: | :-----------------: | :-----: | +| SpeechUT Base (ASR) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Azure Storage]| +| SpeechUT Base (ASR) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [100 hrs LibriSpeech](http://www.openslr.org/12) | [Azure Storage]| +| SpeechUT Large (ASR) | [60k hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | - | [Azure Storage]| +| SpeechUT Large (ASR) | [60k hrs LibriSpeech](http://www.openslr.org/12) + [40M Text](http://www.openslr.org/11) | [960 hrs LibriSpeech](http://www.openslr.org/12) | [Azure Storage]| +| SpeechUT Base (En-De) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [408 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [4.6M Text](https://www.statmt.org/wmt16/) | - | [Azure Storage]| +| SpeechUT Base (En-De) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [408 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [4.6M Text](https://www.statmt.org/wmt16/) | [En-De MuST-C v1](https://ict.fbk.eu/must-c/) | [Azure Storage]| +| SpeechUT Base (En-Es) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [504 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [15M Text](https://www.statmt.org/wmt13/) | - | [Azure Storage]| +| SpeechUT Base (En-Es) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [504 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [15M Text](https://www.statmt.org/wmt13/) | [En-Es MuST-C v1](https://ict.fbk.eu/must-c/) | [Azure Storage]| +| SpeechUT Base (En-Fr) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [492 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [40M Text](https://www.statmt.org/wmt14/) | - | [Azure Storage]| +| SpeechUT Base (En-Fr) | [960 hrs LibriSpeech](http://www.openslr.org/12) + [492 hrs MuST-C v1](https://ict.fbk.eu/must-c/) + [40M Text](https://www.statmt.org/wmt14/) | [En-Fr MuST-C v1](https://ict.fbk.eu/must-c/) | [Azure Storage]| + + +## Language Model +See [here](https://github.com/microsoft/SpeechT5/tree/main/Speech2C#language-model-and-vocabulary). + + +## Setup + +```bash +git submodule update --init SpeechUT/fairseq +cd SpeechUT/ +pip install --editable fairseq/ +pip install sacrebleu==1.5.1 +``` + + +## ASR on LibriSpeech +### Data preparation +Please follow the steps of wav2vec 2.0 manifest [here](https://github.com/pytorch/fairseq/tree/main/examples/wav2vec#prepare-training-data-manifest) to prepare `train.tsv` and `train.ltr`. You should make sure the vocabulary [`dict.ltr.txt`](dataset/LibriSpeech/dict.ltr.txt) is the same as that used for the pre-trained model. Put yout prepared data into `$data_dir`. + +### Fine-tune a hybrid CTC-ED model +- Fine-tune the base model on 100h subset + ```bash + # Usage: speechut/scripts/tune_speechut_asr/finetune_base_edctc.sh <model_path> <data_dir> <cpt_tag> [mount=$PWD] [world_size=8] [update_freq=2] + model_path=path/to/your/pre-trained/model + data_dir=dataset/LibriSpeech/asr + bash speechut/scripts/tune_speechut_asr/finetune_base_edctc.sh $model_path $data_dir 'tag400k' + ``` + +- Fine-tune the large model on 960h subset + ```bash + # Usage: speechut/scripts/tune_speechut_asr/finetune960h_large_edctc.sh <model_path> <data_dir> <cpt_tag> [mount=$PWD] [world_size=8] [update_freq=3] + model_path=path/to/your/pre-trained/model + data_dir=dataset/LibriSpeech/asr + bash speechut/scripts/tune_speechut_asr/finetune960h_large_edctc.sh $model_path $data_dir 'tag400k' + ``` + +### Decode +- CTC-ED joint decoding + ```bash + # Usage: speechut/scripts/tune_speechut_asr/inference_edctc.sh <model_path> <data_dir> [gen-set=dev_other] [beam_size=10] [ctc_weight=0.2] [--normalize] + model_path=path/to/your/fine-tuned/model + data_dir=dataset/LibriSpeech/asr + # for base model + bash speechut/scripts/tune_speechut_asr/inference_edctc.sh $model_path $data_dir test_clean 10 0.2 + # for large model, you should set --normalize at the end + bash speechut/scripts/tune_speechut_asr/inference_edctc.sh $model_path $data_dir test_clean 10 0.2 --normalize + ``` + > We use the [espnet](https://github.com/espnet/espnet)-style joint decoding algorithm, currently only supporting batch_size=1. If you find it too slow, please check [`inference_nj.sh`](speechut/scripts/tune_speechut_asr/inference_nj.sh) for a multi-thread version. + +- CTC-ED joint decoding with LM + ```bash + # Usage: speechut/scripts/tune_speechut_asr/inference_edctclm.sh <model_path> <data_dir> [gen-set=dev_other] [beam_size=30] [ctc_weight=0.3] [lm_weight=0.7] [lm_path] [--normalize] + model_path=path/to/your/fine-tuned/model + data_dir=dataset/LibriSpeech/asr + lm_path=path/to/char_lm/model + # for base model + bash speechut/scripts/tune_speechut_asr/inference_edctclm.sh $model_path $data_dir test_clean 30 0.3 0.7 $lm_path + # for large model, you should set --normalize at the end + bash speechut/scripts/tune_speechut_asr/inference_edctclm.sh $model_path $data_dir test_clean 30 0.3 0.7 $lm_path --normalize + ``` + + > We currently only support batch_size=1. If you find it too slow, please check [`inference_lm_nj.sh`](speechut/scripts/tune_speechut_asr/inference_lm_nj.sh) for a multi-thread version. + + > The released language model uses a different vocaburary [`dict.txt`](dataset/LibriSpeech/dict.txt), put it into `$data_dir` and the script will access it. + + +## ST on MuST-C +### Data preparation + +ST models are fine-tuned with [fairseq speech-to-text](https://github.com/facebookresearch/fairseq/tree/main/examples/speech_to_text) task, so just follow the data preparation instructions [here](https://github.com/facebookresearch/fairseq/tree/main/examples/speech_to_text#data-preparation). +To fine-tune our released models, you should use the same sentecepiece models and dictionaries as ours: + +- En-De: [sentencepiece_model](dataset/MuSTC/en_de/spm_unigram10000.model), [dict](dataset/MuSTC/en_de/dict.spm.txt) +- En-Es: [sentencepiece_model](dataset/MuSTC/en_es/spm_unigram10000.model), [dict](dataset/MuSTC/en_es/dict.spm.txt) +- En-Fr: [sentencepiece_model](dataset/MuSTC/en_fr/spm_unigram10000.model), [dict](dataset/MuSTC/en_fr/dict.spm.txt) + +We provided examples in [`dataset`](dataset/MuSTC). + +### Fine-tune an encoder-decoder model + +```bash +# Usage: speechut/scripts/tune_speechut_st/finetune_base_mustc_enxx.sh <model_path> <data_dir> <lang> <cpt-tag> [mount=$PWD] [world_size=8] [update_freq=4/6] +model_path=path/to/your/pre-trained/model +data_dir=dataset/MuSTC/en-${lang} +bash speechut/scripts/tune_speechut_st/finetune_base_mustc_enxx.sh $model_path $data_dir ${lang} tag400k +``` +Please check the script [`finetune_base_mustc_enxx.sh`](speechut/scripts/tune_speechut_st/finetune_base_mustc_enxx.sh) for detailed configuration. + +### Decode +You might average several model checkpoints with the best dev accuracy to stablize the performance, +```bash +python fairseq/scripts/average_checkpoints.py --inputs $model_dir/checkpoint.best_acc*.pt --output $model_dir/checkpoint.avgnbest.pt +``` +Then decode the model with beam search, +```bash +# Usage: speechut/scripts/tune_speechut_st/inference_st.sh <model_path> <data_dir> <lang> [gen-set=dev] [beam_size=10] [lenpen=1.0] +model_path=path/to/your/fine-tuned/model +data_dir=dataset/MuSTC/en-${lang} +bash speechut/scripts/tune_speechut_st/inference_st.sh $model_path $data_dir ${lang} tst-COMMON +``` + + + + +## Pre-train for ASR + +### Data preparation +The model is pre-trained by speech-to-unit, unit-to-text and mask-unit-lm tasks. +1. For speech-to-unit task, please follow the steps of data preparation for HuBERT [here](https://github.com/facebookresearch/fairseq/tree/main/examples/hubert#data-preparation). +2. For unit-to-text task, follow the steps below: + - Generate units from unpaired text by [T2U Generator](#T2U-Generator). + - Pair the generated units and text data, convert them to binary files. +3. For mask-unit-lm task, combine the units generated from step1 and step2 together. + +You should use [`dict.ltr.txt`](dataset/LibriSpeech/dict.ltr.txt) when preparing the text data, make sure the dictionary is the same as that used for fine-tuning. + +### Pre-train base model + +```bash +# Usage: speechut/scripts/pretrain_speechut/base_speechut_for_asr.sh <data_dir> <text_data_dir> [mount=$PWD] [world_size=32] [update_freq=1] +data_dir= +text_data_dir= +bash speechut/scripts/pretrain_speechut/base_speechut_for_asr.sh $data_dir $text_data_dir +``` + +## Pre-train for ST + +### Data preparation +The model is pre-trained by speech-to-unit, unit-to-text and mask-unit-lm tasks. +1. For speech-to-unit task, please follow the steps of data preparation for HuBERT [here](https://github.com/facebookresearch/fairseq/tree/main/examples/hubert#data-preparation). +2. For unit-to-text task, we use bilingual text where the source side (i.e. English) is used to generate unit and the target side serves as the output. Follow the steps below: + - Normalize the source (English) text by removing punctuation, converting capital letters. + - Generate units from the source (English) text by [T2U Generator](#T2U-Generator). + - Pair the generated units and text data, convert them to binary files. +3. For mask-unit-lm task, combine the units generated from step1 and step2 together. +You should use the same sentencepiece models and dictionaries as that used for [fine-tuning](#ST-on-MuST-C). + + +### Pre-train base model + +```bash +# Usage: speechut/scripts/pretrain_speechut/base_speechut_for_st.sh <data_dir> <text_data_dir> <lang> [mount=$PWD] [world_size=32] [update_freq=1] +data_dir= +text_data_dir= +bash speechut/scripts/pretrain_speechut/base_speechut_for_st.sh $data_dir $text_data_dir ${lang} +``` + + +## T2U Generator +The original paper trains an encoder-decoder model to generate reduced units from text, which is time consuming due to the autoregressive generation. +We recently update the T2U generator to a non-autoregressive model, which generates non-reduced units (can be easily post-processed to reduced units). Please follow the usage provided by [Hidden-unit Tokenizer for Text](https://github.com/microsoft/SpeechT5/tree/main/SpeechLM#hidden-unit-tokenizer-for-text) (they used the same HuBERT units as this work). + + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq). + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +## Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{zhang2022speechut, + title = {SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training}, + author = {Zhang, Ziqiang and Zhou, Long and Ao, Junyi and Liu, Shujie and Dai, Lirong and Li, Jinyu and Wei, Furu}, + eprint={2210.03730}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + year={2022} +} +``` + +### Contact Information + +For help or issues using SpeechUT models, please submit a GitHub issue. + +For other communications related to SpeechUT, please contact Long Zhou (`lozhou@microsoft.com`). \ No newline at end of file diff --git a/SpeechUT/dataset/LibriSpeech/dict.km.txt b/SpeechUT/dataset/LibriSpeech/dict.km.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechUT/dataset/LibriSpeech/dict.km.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechUT/dataset/LibriSpeech/dict.kmu.txt b/SpeechUT/dataset/LibriSpeech/dict.kmu.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechUT/dataset/LibriSpeech/dict.kmu.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechUT/dataset/LibriSpeech/dict.ltr.txt b/SpeechUT/dataset/LibriSpeech/dict.ltr.txt new file mode 100644 index 0000000..26a7e6b --- /dev/null +++ b/SpeechUT/dataset/LibriSpeech/dict.ltr.txt @@ -0,0 +1,29 @@ +| 803288730 +E 439294199 +T 319071758 +A 277306732 +O 263784364 +N 239361162 +I 237353011 +H 223346762 +S 220175453 +R 203352500 +D 152198685 +L 141597450 +U 98913389 +M 87138757 +C 84680142 +W 81375101 +F 80240665 +G 70642902 +Y 68388038 +P 58436929 +B 52538531 +V 33250231 +K 26906609 +' 9162896 +X 5075632 +J 4746771 +Q 3401794 +Z 2186971 +<mask> 1 diff --git a/SpeechUT/dataset/LibriSpeech/dict.txt b/SpeechUT/dataset/LibriSpeech/dict.txt new file mode 100644 index 0000000..69929e1 --- /dev/null +++ b/SpeechUT/dataset/LibriSpeech/dict.txt @@ -0,0 +1,28 @@ +| 94802 +E 51860 +T 38431 +A 33152 +O 31495 +N 28855 +I 28794 +H 27187 +S 26071 +R 23546 +D 18289 +L 16308 +U 12400 +M 10685 +W 10317 +C 9844 +F 9062 +G 8924 +Y 8226 +P 6890 +B 6339 +V 3936 +K 3456 +' 1023 +X 636 +J 598 +Q 437 +Z 213 diff --git a/SpeechUT/dataset/MuSTC/dict.km.txt b/SpeechUT/dataset/MuSTC/dict.km.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechUT/dataset/MuSTC/dict.km.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechUT/dataset/MuSTC/dict.kmu.txt b/SpeechUT/dataset/MuSTC/dict.kmu.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechUT/dataset/MuSTC/dict.kmu.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechUT/dataset/MuSTC/en_de/config.yaml b/SpeechUT/dataset/MuSTC/en_de/config.yaml new file mode 100644 index 0000000..dce5f63 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_de/config.yaml @@ -0,0 +1,3 @@ +vocab_filename: dict.spm.txt +src_vocab_filename: dict.kmu.txt + diff --git a/SpeechUT/dataset/MuSTC/en_de/config_ende.yaml b/SpeechUT/dataset/MuSTC/en_de/config_ende.yaml new file mode 100644 index 0000000..dd080a0 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_de/config_ende.yaml @@ -0,0 +1,14 @@ +bpe_tokenizer: + bpe: sentencepiece + sentencepiece_model: spm_unigram10000.model + +sampling_alpha: 1.0 +shuffle: false +use_audio_input: true +use_sample_rate: 16000 + +vocab_filename: dict.spm.txt + +# required by speech_to_text task but never used +input_channels: 1 +input_feat_per_channel: 1 diff --git a/SpeechUT/dataset/MuSTC/en_de/dict.kmu.txt b/SpeechUT/dataset/MuSTC/en_de/dict.kmu.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_de/dict.kmu.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechUT/dataset/MuSTC/en_de/dict.spm.txt b/SpeechUT/dataset/MuSTC/en_de/dict.spm.txt new file mode 100644 index 0000000..6f45c56 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_de/dict.spm.txt @@ -0,0 +1,9997 @@ +, 1 +. 1 +▁die 1 +▁der 1 +en 1 +▁und 1 +s 1 +e 1 +▁ 1 +n 1 +▁in 1 +▁zu 1 +▁den 1 +▁von 1 +▁ist 1 +- 1 +▁das 1 +▁für 1 +er 1 +▁auf 1 +▁mit 1 +▁ein 1 +▁eine 1 +▁des 1 +▁nicht 1 +▁Sie 1 +▁wir 1 +▁dass 1 +▁es 1 +t 1 +▁im 1 +▁werden 1 +▁sich 1 +r 1 +▁dem 1 +▁ich 1 +▁an 1 +▁Die 1 +▁sind 1 +▁auch 1 +▁sie 1 +▁über 1 +▁um 1 +▁wird 1 +▁als 1 +: 1 +▁haben 1 +▁( 1 +▁aus 1 +▁wie 1 +es 1 +▁oder 1 +▁Ich 1 +) 1 +▁hat 1 +▁einer 1 +▁Das 1 +▁- 1 +d 1 +▁bei 1 +▁einen 1 +▁können 1 +m 1 +▁zur 1 +▁diese 1 +▁vor 1 +▁Wir 1 +▁er 1 +▁uns 1 +▁so 1 +▁nach 1 +▁einem 1 +ung 1 +▁Es 1 +▁durch 1 +▁" 1 +▁nur 1 +▁kann 1 +▁ver 1 +▁be 1 +? 1 +▁zum 1 +▁wenn 1 +▁In 1 +▁dieser 1 +y 1 +▁man 1 +▁aber 1 +▁war 1 +▁noch 1 +▁sein 1 +▁Der 1 +▁Kommission 1 +▁was 1 +st 1 +te 1 +▁wurde 1 +▁sehr 1 +k 1 +▁daß 1 +! 1 +▁müssen 1 +▁ge 1 +▁Herr 1 +▁S 1 +▁Und 1 +▁– 1 +▁mehr 1 +ten 1 +a 1 +in 1 +▁alle 1 +o 1 +▁diesem 1 +▁unter 1 +▁am 1 +be 1 +▁Ein 1 +" 1 +z 1 +de 1 +▁hier 1 +▁Union 1 +▁B 1 +▁möchte 1 +ge 1 +den 1 +▁ihre 1 +▁gibt 1 +▁Er 1 +▁E 1 +▁Europäischen 1 +f 1 +▁A 1 +al 1 +▁bis 1 +b 1 +▁Ver 1 +S 1 +l 1 +g 1 +▁dieses 1 +B 1 +an 1 +/ 1 +▁An 1 +▁Menschen 1 +▁unsere 1 +▁Be 1 +▁Bericht 1 +▁keine 1 +▁dann 1 +w 1 +▁muss 1 +▁eines 1 +▁Wenn 1 +▁K 1 +▁vom 1 +▁Präsident 1 +▁Zeit 1 +▁ab 1 +h 1 +▁Ihnen 1 +ver 1 +▁Welt 1 +▁zwischen 1 +▁EU 1 +▁mich 1 +▁habe 1 +▁immer 1 +▁Parlament 1 +le 1 +ing 1 +▁anderen 1 +T 1 +ch 1 +▁sowie 1 +▁da 1 +▁C 1 +C 1 +▁F 1 +i 1 +re 1 +der 1 +u 1 +c 1 +▁Europa 1 +; 1 +et 1 +▁Im 1 +▁damit 1 +D 1 +▁diesen 1 +ur 1 +▁Aus 1 +▁Hotel 1 +▁G 1 +P 1 +ieren 1 +sch 1 +▁zwei 1 +▁Mitgliedstaaten 1 +A 1 +M 1 +▁Diese 1 +F 1 +▁„ 1 +▁W 1 +▁de 1 +▁gegen 1 +ar 1 +▁Ab 1 +em 1 +ter 1 +▁Frau 1 +▁wurden 1 +▁M 1 +▁sondern 1 +▁Vor 1 +K 1 +lich 1 +sten 1 +▁andere 1 +▁neue 1 +▁unserer 1 +ä 1 +▁Jahr 1 +ern 1 +▁Entwicklung 1 +▁Aber 1 +la 1 +▁weil 1 +▁T 1 +▁heute 1 +▁Auf 1 +▁mir 1 +it 1 +▁seine 1 +▁wo 1 +▁machen 1 +▁Ihre 1 +ischen 1 +▁selbst 1 +▁viele 1 +▁Re 1 +▁Europäische 1 +▁un 1 +▁Jahren 1 +▁P 1 +▁etwas 1 +▁meine 1 +▁D 1 +▁ganz 1 +▁Mit 1 +▁viel 1 +▁Rat 1 +▁also 1 +▁Ge 1 +▁sollte 1 +▁Frage 1 +▁wieder 1 +“ 1 +▁jedoch 1 +zu 1 +ein 1 +iert 1 +us 1 +▁ohne 1 +li 1 +▁ihrer 1 +ig 1 +▁jetzt 1 +W 1 +E 1 +▁bereits 1 +▁sollten 1 +▁bin 1 +ö 1 +▁Sch 1 +▁würde 1 +▁L 1 +▁ihr 1 +el 1 +at 1 +ungen 1 +▁Land 1 +▁ob 1 +▁Arbeit 1 +▁geht 1 +G 1 +▁So 1 +is 1 +ut 1 +▁dazu 1 +▁neuen 1 +▁europäischen 1 +or 1 +▁sehen 1 +▁O 1 +▁3 1 +▁einige 1 +um 1 +me 1 +ab 1 +N 1 +▁H 1 +2 1 +▁a 1 +▁Da 1 +▁sagen 1 +▁re 1 +▁finden 1 +p 1 +se 1 +▁I 1 +▁einfach 1 +▁wirklich 1 +▁Wie 1 +▁schon 1 +▁weiter 1 +▁Jahre 1 +igen 1 +▁darauf 1 +ra 1 +▁19 1 +▁tun 1 +il 1 +ta 1 +on 1 +▁Art 1 +' 1 +▁Recht 1 +H 1 +▁dafür 1 +ische 1 +▁1 1 +▁Unternehmen 1 +gen 1 +O 1 +I 1 +▁Teil 1 +▁the 1 +ma 1 +▁wollen 1 +▁Ziel 1 +ne 1 +▁Problem 1 +▁gut 1 +▁2 1 +▁allen 1 +ste 1 +▁Was 1 +▁R 1 +ri 1 +▁Um 1 +▁waren 1 +ed 1 +▁seiner 1 +é 1 +▁liegt 1 +▁Eine 1 +▁denn 1 +▁Maßnahmen 1 +▁pro 1 +ie 1 +R 1 +ir 1 +▁Bürger 1 +▁ihren 1 +ation 1 +▁nun 1 +▁möglich 1 +▁Bereich 1 +▁Nach 1 +▁La 1 +▁Le 1 +▁drei 1 +▁du 1 +▁Daten 1 +▁hatte 1 +▁k 1 +ü 1 +▁Zu 1 +▁zusammen 1 +▁während 1 +▁f 1 +▁Lage 1 +bar 1 +aus 1 +▁wissen 1 +▁bietet 1 +▁Informationen 1 +▁zurück 1 +liche 1 +to 1 +▁Grund 1 +U 1 +ag 1 +▁allem 1 +L 1 +▁Herrn 1 +ft 1 +schaft 1 +ro 1 +▁seit 1 +▁Dies 1 +▁doch 1 +▁N 1 +ierung 1 +▁— 1 +ia 1 +00 1 +▁Länder 1 +▁wäre 1 +▁unseren 1 +▁wichtig 1 +▁natürlich 1 +▁Z 1 +▁geben 1 +ol 1 +▁Leben 1 +▁Man 1 +▁St 1 +1 1 +▁ersten 1 +lichen 1 +isch 1 +▁d 1 +▁Bei 1 +chen 1 +▁könnte 1 +▁Rahmen 1 +▁Stadt 1 +ik 1 +un 1 +v 1 +). 1 +▁Fall 1 +▁einmal 1 +▁Euro 1 +▁ent 1 +▁Ma 1 +und 1 +▁denen 1 +x 1 +▁Für 1 +▁welche 1 +▁Un 1 +▁davon 1 +▁lassen 1 +▁Kinder 1 +▁Vorschlag 1 +▁Se 1 +3 1 +mal 1 +▁Zimmer 1 +kt 1 +... 1 +▁darüber 1 +▁Energie 1 +▁4 1 +▁Weg 1 +▁V 1 +▁ihnen 1 +▁Beispiel 1 +▁alles 1 +▁letzten 1 +▁hin 1 +▁soll 1 +ner 1 +▁of 1 +▁10 1 +ka 1 +▁b 1 +▁Parlaments 1 +▁Regierung 1 +▁insbesondere 1 +▁Unterstützung 1 +▁meiner 1 +▁dabei 1 +▁and 1 +▁erhalten 1 +▁kein 1 +ck 1 +▁kommen 1 +ige 1 +▁große 1 +▁dort 1 +▁Sicherheit 1 +ul 1 +zeit 1 +▁Zusammenarbeit 1 +▁genau 1 +▁Hier 1 +▁Ländern 1 +▁stehen 1 +▁Als 1 +th 1 +▁beim 1 +im 1 +▁Namen 1 +V 1 +▁Frauen 1 +as 1 +▁Fragen 1 +stand 1 +▁besteht 1 +▁Politik 1 +id 1 +heit 1 +▁Mittel 1 +land 1 +▁5 1 +os 1 +am 1 +▁System 1 +▁sch 1 +▁Zukunft 1 +▁% 1 +▁großen 1 +▁steht 1 +ad 1 +ze 1 +▁m 1 +▁Weise 1 +her 1 +▁Bedeutung 1 +▁direkt 1 +▁Ende 1 +▁Markt 1 +▁Ihr 1 +▁Seite 1 +▁unser 1 +▁Probleme 1 +au 1 +▁Kollegen 1 +▁worden 1 +▁stellen 1 +▁... 1 +▁De 1 +▁Möglichkeit 1 +▁Kunden 1 +lo 1 +▁Thema 1 +▁aller 1 +▁erste 1 +▁all 1 +▁Kommissar 1 +▁Tag 1 +da 1 +▁Ha 1 +ungs 1 +ha 1 +▁Geld 1 +▁Sp 1 +▁sicher 1 +▁Mal 1 +▁eigenen 1 +▁Ro 1 +ic 1 +▁Unter 1 +na 1 +auf 1 +▁muß 1 +▁Pro 1 +▁to 1 +▁Meinung 1 +▁klar 1 +▁Rolle 1 +▁Wasser 1 +▁Schutz 1 +▁Umwelt 1 +ien 1 +▁USA 1 +ent 1 +ler 1 +ben 1 +▁gegenüber 1 +▁politischen 1 +▁Programm 1 +▁seinen 1 +j 1 +▁sogar 1 +▁Staaten 1 +▁z 1 +▁ihn 1 +▁daher 1 +▁daran 1 +politik 1 +go 1 +do 1 +ster 1 +ach 1 +▁Über 1 +▁la 1 +▁erreichen 1 +ti 1 +bau 1 +enden 1 +▁Vi 1 +men 1 +▁ja 1 +ber 1 +gehen 1 +▁will 1 +end 1 +▁gerade 1 +he 1 +▁Verfügung 1 +▁besonders 1 +▁Ort 1 +▁gemacht 1 +▁jeder 1 +▁20 1 +gel 1 +▁unterstützen 1 +▁gehen 1 +▁etwa 1 +▁kommt 1 +▁weitere 1 +▁fest 1 +▁Millionen 1 +▁Al 1 +▁Situation 1 +▁Internet 1 +▁bekannt 1 +cht 1 +ca 1 +▁zwar 1 +▁Haus 1 +▁Dinge 1 +▁vielleicht 1 +▁macht 1 +▁Finanz 1 +▁weit 1 +mp 1 +▁glaube 1 +ce 1 +▁weniger 1 +▁europäische 1 +▁Auch 1 +▁verschiedenen 1 +▁sowohl 1 +hn 1 +ke 1 +är 1 +▁innerhalb 1 +▁Punkt 1 +▁Bo 1 +▁bringen 1 +▁Gesellschaft 1 +▁Am 1 +▁führen 1 +▁sagte 1 +ende 1 +min 1 +ger 1 +▁Lösung 1 +▁Alle 1 +halt 1 +ion 1 +co 1 +▁Spiel 1 +▁vielen 1 +ist 1 +▁Hilfe 1 +di 1 +▁meisten 1 +▁entfernt 1 +hin 1 +), 1 +▁hinaus 1 +vor 1 +▁gesagt 1 +▁Gemeinschaft 1 +ff 1 +▁Seiten 1 +▁werde 1 +sa 1 +▁Form 1 +▁mein 1 +che 1 +▁Ihrer 1 +ß 1 +▁politische 1 +▁besser 1 +ment 1 +igkeit 1 +▁voll 1 +▁Geschichte 1 +▁Richtlinie 1 +▁schnell 1 +▁bieten 1 +▁Li 1 +▁indem 1 +▁stellt 1 +▁c 1 +▁Wirtschaft 1 +▁nehmen 1 +▁würden 1 +▁internationalen 1 +▁weiß 1 +▁U 1 +▁Haupt 1 +▁Projekt 1 +so 1 +▁Artikel 1 +ll 1 +▁unserem 1 +▁beiden 1 +io 1 +▁wirtschaftliche 1 +EN 1 +ell 1 +▁Leute 1 +teil 1 +▁Kon 1 +▁Zusammenhang 1 +ex 1 +▁hatten 1 +▁deutlich 1 +▁bedeutet 1 +▁6 1 +ko 1 +▁befindet 1 +iz 1 +▁vier 1 +▁Preis 1 +ür 1 +▁18 1 +▁brauchen 1 +▁tatsächlich 1 +▁möchten 1 +▁15 1 +werk 1 +spiel 1 +▁Bild 1 +vi 1 +recht 1 +▁schaffen 1 +▁J 1 +sp 1 +fe 1 +ph 1 +zi 1 +op 1 +om 1 +▁nämlich 1 +▁solche 1 +▁sei 1 +ität 1 +Z 1 +▁Natur 1 +raum 1 +▁ihm 1 +▁China 1 +ier 1 +▁Kultur 1 +▁Fa 1 +ho 1 +ub 1 +▁gute 1 +▁Co 1 +▁Mar 1 +▁Mo 1 +▁wenig 1 +▁Rechts 1 +pro 1 +ine 1 +▁denke 1 +▁Deshalb 1 +6 1 +▁bereit 1 +▁darin 1 +com 1 +ken 1 +▁Neu 1 +art 1 +▁Bar 1 +▁Dank 1 +gang 1 +▁Ja 1 +iv 1 +form 1 +▁Uhr 1 +▁Do 1 +▁gab 1 +▁bitte 1 +▁Durch 1 +▁' 1 +▁Entschließung 1 +▁Ka 1 +▁le 1 +▁könnten 1 +▁wichtige 1 +▁Ebene 1 +isten 1 +▁Du 1 +▁w 1 +▁Ihren 1 +ve 1 +▁Personen 1 +▁He 1 +ale 1 +wand 1 +▁Wahl 1 +▁Hand 1 +▁Kosten 1 +▁zeigt 1 +▁Wirtschafts 1 +gabe 1 +▁leben 1 +▁jeden 1 +and 1 +▁Ar 1 +▁Industrie 1 +▁unterstützt 1 +▁Verbraucher 1 +▁Entscheidung 1 +▁sprechen 1 +ton 1 +▁Ca 1 +▁kleine 1 +ga 1 +▁Dieses 1 +▁gleich 1 +halten 1 +wa 1 +▁Präsidentin 1 +ismus 1 +▁notwendig 1 +▁lange 1 +weise 1 +▁Haushalts 1 +▁erst 1 +los 1 +man 1 +▁Zugang 1 +▁Ansicht 1 +▁Lebens 1 +▁Bezug 1 +▁Pa 1 +▁arbeiten 1 +hi 1 +▁Region 1 +bereich 1 +▁keinen 1 +000 1 +▁7 1 +▁neu 1 +▁Fraktion 1 +▁Raum 1 +▁Jahres 1 +haus 1 +▁Dienstleistung 1 +tel 1 +▁ihrem 1 +▁dessen 1 +▁Prozess 1 +▁Rück 1 +tag 1 +mm 1 +sicht 1 +▁Also 1 +age 1 +ren 1 +▁nutzen 1 +▁Rates 1 +▁seinem 1 +geben 1 +gt 1 +kommen 1 +▁The 1 +▁heraus 1 +▁Arbeits 1 +stellen 1 +▁hoch 1 +▁Produkte 1 +▁st 1 +▁ausge 1 +% 1 +keit 1 +▁Abstimmung 1 +▁nächsten 1 +mo 1 +▁unterschiedlich 1 +▁Unsere 1 +▁Demokratie 1 +▁Erfolg 1 +▁30 1 +▁einigen 1 +▁gehört 1 +▁Dieser 1 +pa 1 +▁handelt 1 +lä 1 +va 1 +▁gilt 1 +▁entwickelt 1 +ly 1 +0 1 +▁konnte 1 +▁schwer 1 +▁Ent 1 +Berichterstatter 1 +tt 1 +tritt 1 +nt 1 +▁Lo 1 +▁darf 1 +▁Sa 1 +▁Anwendung 1 +son 1 +▁öffentlichen 1 +▁Verfahren 1 +▁12 1 +▁Aussprache 1 +lu 1 +▁besten 1 +ick 1 +▁sollen 1 +▁erreicht 1 +▁Rechte 1 +▁fünf 1 +▁verwendet 1 +ert 1 +▁Service 1 +pi 1 +log 1 +▁Geschäfts 1 +▁Ho 1 +▁Menschenrechte 1 +bo 1 +▁t 1 +▁Grundlage 1 +▁Richtung 1 +▁weltweit 1 +▁Software 1 +mittel 1 +▁Website 1 +▁Europas 1 +▁Bi 1 +▁Verbindung 1 +▁weiterhin 1 +▁ebenfalls 1 +▁Verantwortung 1 +pe 1 +uch 1 +▁hätte 1 +▁nationalen 1 +än 1 +▁Doch 1 +▁Deutschland 1 +ug 1 +no 1 +▁Debatte 1 +lei 1 +ry 1 +akt 1 +5 1 +▁Ra 1 +▁kleinen 1 +▁Me 1 +ak 1 +▁deshalb 1 +▁Wettbewerb 1 +▁dürfen 1 +▁betrifft 1 +tra 1 +▁Bau 1 +▁zeigen 1 +▁bzw 1 +lichkeit 1 +▁Qualität 1 +bel 1 +schutz 1 +▁Tatsache 1 +▁gemeinsame 1 +▁Bevölkerung 1 +▁Gebiet 1 +hr 1 +▁ca 1 +▁Na 1 +bi 1 +system 1 +▁wahr 1 +▁ange 1 +▁Sozial 1 +elt 1 +▁2009 1 +▁Krieg 1 +per 1 +▁hoffe 1 +4 1 +▁Vereinigte 1 +ok 1 +ja 1 +▁eigentlich 1 +▁meinen 1 +ive 1 +▁Reihe 1 +weg 1 +▁aufgrund 1 +ling 1 +▁Antwort 1 +▁Umsetzung 1 +▁Pi 1 +▁halten 1 +all 1 +zen 1 +▁bekommen 1 +▁abge 1 +▁fast 1 +▁Reise 1 +ierte 1 +▁oft 1 +▁8 1 +▁verstehen 1 +▁h 1 +gi 1 +ard 1 +▁ganze 1 +▁sozialen 1 +▁auszu 1 +ium 1 +reg 1 +▁Vertrag 1 +▁Interesse 1 +▁& 1 +pl 1 +rat 1 +fa 1 +ant 1 +▁meinem 1 +▁g 1 +▁kurz 1 +▁darum 1 +▁Abkommen 1 +▁Ziele 1 +Änderungsanträge 1 +▁Daher 1 +▁Wert 1 +ün 1 +▁recht 1 +▁helfen 1 +▁Produkt 1 +▁Wort 1 +nehmen 1 +▁statt 1 +▁führt 1 +tal 1 +▁Schritt 1 +▁nie 1 +▁Partner 1 +▁50 1 +▁Selbst 1 +rü 1 +▁bleiben 1 +ou 1 +ER 1 +▁dar 1 +if 1 +rie 1 +▁paar 1 +▁Bedingungen 1 +▁se 1 +▁US 1 +▁p 1 +ord 1 +ci 1 +mon 1 +igung 1 +▁später 1 +▁wohl 1 +▁Musik 1 +▁heißt 1 +ör 1 +fi 1 +▁Nicht 1 +mit 1 +lassen 1 +▁Auswirkungen 1 +ow 1 +sta 1 +sk 1 +acht 1 +kon 1 +▁Herausforderung 1 +port 1 +▁richtig 1 +tro 1 +einander 1 +sche 1 +▁Gr 1 +anz 1 +▁erforderlich 1 +St 1 +▁frei 1 +▁jede 1 +▁Ta 1 +eln 1 +▁Nun 1 +▁Druck 1 +▁Ergebnis 1 +▁Ihrem 1 +up 1 +cken 1 +haft 1 +▁di 1 +▁Text 1 +fen 1 +▁Kontrolle 1 +▁Möglichkeiten 1 +▁Mai 1 +stellung 1 +▁Ch 1 +▁Institutionen 1 +▁gemeinsam 1 +▁verschiedene 1 +▁findet 1 +ot 1 +▁per 1 +weisen 1 +gleich 1 +▁internationale 1 +▁beispielsweise 1 +lle 1 +▁Vorschläge 1 +▁allerdings 1 +▁Macht 1 +▁verbunden 1 +▁jedes 1 +nd 1 +▁jedem 1 +▁hinter 1 +▁gestellt 1 +▁je 1 +▁gemeinsamen 1 +▁Von 1 +▁Ri 1 +▁eigene 1 +lass 1 +▁for 1 +ill 1 +▁Ne 1 +▁Design 1 +▁Ko 1 +▁Strategie 1 +du 1 +In 1 +▁gleichzeitig 1 +▁ermöglicht 1 +▁Person 1 +20 1 +schw 1 +▁Dr 1 +▁Hinblick 1 +pf 1 +▁Handels 1 +fer 1 +▁Forschung 1 +▁her 1 +mi 1 +▁Damen 1 +gu 1 +reich 1 +ng 1 +gr 1 +X 1 +verständlich 1 +▁einzige 1 +mäßig 1 +▁Version 1 +ei 1 +▁Verordnung 1 +▁Minuten 1 +sh 1 +▁Blick 1 +▁Prozent 1 +ld 1 +á 1 +▁ebenso 1 +▁gesamten 1 +isierung 1 +▁ging 1 +sion 1 +▁Buch 1 +▁Sicherheits 1 +▁Einsatz 1 +▁leicht 1 +▁Ausdruck 1 +▁Ergebnisse 1 +▁sieht 1 +arbeit 1 +▁enthalten 1 +ich 1 +▁sp 1 +▁Landes 1 +▁Funktion 1 +▁Computer 1 +weit 1 +▁9 1 +▁Familien 1 +( 1 +▁Nähe 1 +▁einzelnen 1 +▁Kunst 1 +▁warum 1 +handel 1 +tri 1 +▁Auto 1 +▁Aufgabe 1 +lage 1 +▁Meine 1 +spolitik 1 +▁Beziehungen 1 +▁gegeben 1 +▁Video 1 +▁völlig 1 +▁Freiheit 1 +Lachen 1 +▁100 1 +ellen 1 +unter 1 +▁einzu 1 +wei 1 +▁14 1 +▁Liste 1 +▁soziale 1 +gestellt 1 +▁Russland 1 +arbeiten 1 +▁Hotels 1 +” 1 +elle 1 +▁schwierig 1 +▁nichts 1 +bild 1 +▁Interessen 1 +▁liegen 1 +▁angenommen 1 +▁/ 1 +▁Erweiterung 1 +trag 1 +markt 1 +▁bevor 1 +▁Regionen 1 +▁zweite 1 +sektor 1 +nder 1 +träge 1 +▁1. 1 +▁Platz 1 +▁setzen 1 +Mail 1 +zug 1 +▁Film 1 +ate 1 +del 1 +▁Berg 1 +innen 1 +iger 1 +▁Änderungsantrag 1 +▁ganzen 1 +▁Kampf 1 +▁Po 1 +▁Gewalt 1 +▁Zum 1 +▁versuchen 1 +ip 1 +sel 1 +▁spielen 1 +▁danken 1 +▁Gruppe 1 +ere 1 +▁Verhandlungen 1 +▁schriftlich 1 +ierten 1 +▁ma 1 +▁Groß 1 +▁versucht 1 +ud 1 +ah 1 +über 1 +▁Abgeordneten 1 +▁Gelegenheit 1 +berg 1 +▁Mitarbeiter 1 +▁lang 1 +▁Technologie 1 +hm 1 +▁Herren 1 +hilfe 1 +▁16 1 +tlich 1 +▁To 1 +tu 1 +▁Gefahr 1 +Re 1 +▁2008 1 +▁Zahl 1 +▁Seit 1 +platz 1 +ktion 1 +▁Tat 1 +▁Position 1 +rit 1 +▁Kolleginnen 1 +greifen 1 +lang 1 +tik 1 +▁Kraft 1 +▁2010 1 +▁17 1 +▁Fehler 1 +▁Nutzung 1 +▁San 1 +▁Gesundheit 1 +▁Sache 1 +po 1 +▁25 1 +▁allein 1 +▁Ba 1 +▁verfügt 1 +▁Ex 1 +▁Türkei 1 +▁Mitglieder 1 +_ 1 +▁Informations 1 +igt 1 +ziel 1 +▁besondere 1 +▁Erfahrung 1 +länder 1 +tre 1 +▁Krise 1 +ang 1 +▁ex 1 +▁Außerdem 1 +▁wegen 1 +fall 1 +▁Wa 1 +▁Staats 1 +▁Kontakt 1 +▁Sport 1 +rt 1 +kel 1 +▁Förderung 1 +▁geführt 1 +setzung 1 +▁Beitrag 1 +▁Idee 1 +▁Dialog 1 +Ver 1 +▁Sta 1 +▁gerne 1 +▁entwickeln 1 +▁X 1 +▁kam 1 +Gelächter 1 +▁rund 1 +leben 1 +▁bleibt 1 +." 1 +ac 1 +kraft 1 +icht 1 +▁Bilder 1 +▁Gra 1 +▁erfolgreich 1 +▁Wer 1 +fang 1 +▁Anfang 1 +▁mehrere 1 +▁Themen 1 +ni 1 +legen 1 +▁äußerst 1 +ru 1 +▁verbessern 1 +▁befinden 1 +pt 1 +▁neben 1 +▁Verbesserung 1 +cher 1 +▁Bereichen 1 +▁Sektor 1 +rk 1 +ator 1 +ki 1 +▁Ausschuss 1 +kosten 1 +pp 1 +▁Ausschusses 1 +▁Luft 1 +▁abzu 1 +▁mal 1 +▁denken 1 +ort 1 +▁Meer 1 +▁Modell 1 +sehen 1 +▁jemand 1 +mmer 1 +est 1 +wert 1 +▁Gebäude 1 +▁gar 1 +isieren 1 +za 1 +▁Unser 1 +▁verwenden 1 +bt 1 +▁Steuer 1 +▁Zentrum 1 +▁gestimmt 1 +▁13 1 +voll 1 +▁is 1 +dem 1 +7 1 +▁stark 1 +▁“ 1 +▁Kl 1 +nis 1 +▁u 1 +▁Jahrhundert 1 +ssen 1 +▁konnten 1 +führung 1 +▁lässt 1 +▁unabhängig 1 +tes 1 +ron 1 +▁ermöglichen 1 +▁stärker 1 +schlag 1 +satz 1 +▁Körper 1 +tet 1 +▁Regierungen 1 +die 1 +net 1 +ähr 1 +serv 1 +ina 1 +erung 1 +org 1 +▁Woche 1 +’ 1 +▁Web 1 +steuer 1 +▁Fl 1 +▁Behörden 1 +▁New 1 +▁Damit 1 +▁gleichen 1 +▁zweiten 1 +mel 1 +▁Familie 1 +▁unseres 1 +▁Konferenz 1 +▁km 1 +▁Augen 1 +sam 1 +▁Wissen 1 +▁Menge 1 +▁con 1 +ap 1 +▁obwohl 1 +setzen 1 +▁Flug 1 +▁ändern 1 +fr 1 +▁Wachstum 1 +▁Benutzer 1 +▁Tage 1 +▁Licht 1 +▁erklärt 1 +one 1 +alen 1 +▁See 1 +▁Wo 1 +stelle 1 +▁bestimmte 1 +] 1 +▁kon 1 +▁Konflikt 1 +fahrt 1 +▁Arbeitnehmer 1 +our 1 +▁deine 1 +▁Landwirtschaft 1 +folge 1 +▁Lissabon 1 +tr 1 +▁wichtigen 1 +▁wichtigsten 1 +gegeben 1 +▁Anzahl 1 +▁bestehen 1 +wo 1 +▁Lu 1 +▁El 1 +des 1 +▁Zeitpunkt 1 +▁National 1 +▁Team 1 +ika 1 +▁großer 1 +▁Fischerei 1 +▁fördern 1 +▁gesamte 1 +▁2007 1 +▁Schaffung 1 +▁Dann 1 +▁scheint 1 +▁Sicht 1 +▁hinsichtlich 1 +▁Reform 1 +nde 1 +▁wollte 1 +hal 1 +▁24 1 +▁Linie 1 +▁Wein 1 +▁Einzel 1 +▁hohe 1 +▁Standpunkt 1 +▁Je 1 +▁Frankreich 1 +▁größte 1 +ue 1 +rin 1 +arm 1 +▁Entwicklungs 1 +▁häufig 1 +▁weiteren 1 +▁öffentliche 1 +llen 1 +▁Sprache 1 +▁bisher 1 +▁Gemeinschafts 1 +ide 1 +▁Notwendigkeit 1 +▁ständig 1 +äu 1 +mb 1 +mer 1 +bl 1 +▁Ki 1 +▁Werk 1 +▁wobei 1 +last 1 +rufen 1 +▁passiert 1 +▁gesehen 1 +▁gebracht 1 +▁Binnenmarkt 1 +heim 1 +ts 1 +qui 1 +▁Gesamt 1 +▁Verwendung 1 +▁sagt 1 +zahl 1 +wirtschaft 1 +▁Angebot 1 +▁anderer 1 +si 1 +ana 1 +J 1 +▁Moment 1 +istischen 1 +vo 1 +▁Produktion 1 +eur 1 +▁nächste 1 +▁Con 1 +ran 1 +▁anzu 1 +▁Kind 1 +Be 1 +the 1 +▁Behandlung 1 +▁Ad 1 +▁[ 1 +stein 1 +zer 1 +▁Di 1 +bu 1 +▁Bildung 1 +▁Denn 1 +eu 1 +▁kennen 1 +▁Ni 1 +ign 1 +▁Dollar 1 +bei 1 +str 1 +▁Während 1 +▁sechs 1 +ischer 1 +zeug 1 +setzt 1 +feld 1 +▁Währung 1 +wer 1 +▁tragen 1 +▁Medien 1 +▁2000 1 +▁genug 1 +▁Juni 1 +▁Pla 1 +▁Mitglied 1 +▁Mann 1 +▁derzeit 1 +▁größere 1 +▁wer 1 +▁Restaurant 1 +▁Handel 1 +programm 1 +▁Tra 1 +kl 1 +]] 1 +▁hätten 1 +An 1 +fahren 1 +res 1 +▁Umgebung 1 +▁Mehrheit 1 +lau 1 +▁durchgeführt 1 +▁Vertrags 1 +Applaus 1 +▁Tri 1 +▁Frei 1 +▁Zweck 1 +▁Afrika 1 +üt 1 +30 1 +▁letzte 1 +▁Y 1 +▁Verfassung 1 +industrie 1 +▁Vertreter 1 +▁No 1 +welt 1 +jahr 1 +hl 1 +▁40 1 +▁meines 1 +▁Finanzierung 1 +ob 1 +▁Lösungen 1 +▁Bitte 1 +seite 1 +ay 1 +▁Einführung 1 +frage 1 +▁Fortschritte 1 +▁falsch 1 +je 1 +▁enthält 1 +". 1 +▁ausgestattet 1 +▁Beschäftigung 1 +▁tief 1 +▁li 1 +▁Stunden 1 +▁anders 1 +ös 1 +▁treffen 1 +▁Her 1 +▁wirtschaftlich 1 +▁braucht 1 +▁genannt 1 +▁Ju 1 +▁Lebensmittel 1 +▁gehören 1 +▁sorgen 1 +schau 1 +blick 1 +schen 1 +▁Jo 1 +▁v 1 +stre 1 +▁geeignet 1 +▁Gu 1 +▁Darüber 1 +treib 1 +о 1 +▁eindeutig 1 +fass 1 +▁wahrscheinlich 1 +Y 1 +▁komplett 1 +▁schließlich 1 +wi 1 +wissenschaftlich 1 +mann 1 +istische 1 +▁Integration 1 +▁he 1 +▁Te 1 +netz 1 +▁geschlossen 1 +zimmer 1 +▁sa 1 +▁Innovation 1 +▁Folgen 1 +▁Fahr 1 +▁guten 1 +▁lediglich 1 +nahme 1 +▁neuer 1 +▁Entscheidungen 1 +▁praktisch 1 +▁0 1 +▁Tier 1 +▁Instrument 1 +8 1 +50 1 +▁nahe 1 +▁Milliarden 1 +▁[[ 1 +iti 1 +▁All 1 +▁getan 1 +▁glauben 1 +▁Konzept 1 +▁verfügen 1 +ven 1 +▁Änderung 1 +▁zunächst 1 +itz 1 +▁Diskussion 1 +▁erwähnt 1 +▁Zwei 1 +▁Gruppen 1 +▁we 1 +▁Stelle 1 +har 1 +schließen 1 +▁Gesundheits 1 +▁Aufmerksamkeit 1 +met 1 +hör 1 +▁Mi 1 +▁Schl 1 +▁Herzen 1 +lt 1 +▁Vertrauen 1 +führen 1 +▁absolut 1 +▁Gericht 1 +sätze 1 +▁Inhalt 1 +genommen 1 +▁eingesetzt 1 +▁Punkte 1 +▁leisten 1 +able 1 +▁Park 1 +fo 1 +ix 1 +▁Höhe 1 +sprech 1 +▁Not 1 +▁unbe 1 +▁liebe 1 +▁Grenzen 1 +▁Fach 1 +▁Projekte 1 +bringen 1 +", 1 +▁bessere 1 +▁funktioniert 1 +▁Wi 1 +▁beste 1 +▁Wochen 1 +▁Test 1 +▁Klima 1 +▁Inter 1 +schä 1 +▁Ansatz 1 +▁bestimmten 1 +▁Änderungen 1 +tisch 1 +▁Schiff 1 +od 1 +punkt 1 +preis 1 +▁Bekämpfung 1 +sicherheit 1 +▁Beitritt 1 +▁Erklärung 1 +▁Auswahl 1 +▁Präsidentschaft 1 +▁Online 1 +stra 1 +▁solchen 1 +▁Gen 1 +▁Vereinbarung 1 +▁Bank 1 +fähig 1 +▁Versuch 1 +▁bringt 1 +▁größten 1 +▁Urlaub 1 +pass 1 +▁Fisch 1 +uell 1 +▁Italien 1 +▁lo 1 +▁Schw 1 +ku 1 +wie 1 +tern 1 +▁geworden 1 +▁on 1 +ity 1 +▁zehn 1 +▁früher 1 +▁Privat 1 +tor 1 +▁effektiv 1 +▁wichtiger 1 +▁gewährleisten 1 +▁dadurch 1 +plan 1 +▁vorhanden 1 +▁Haushalt 1 +änge 1 +▁Ru 1 +▁erneut 1 +ange 1 +▁Rede 1 +uß 1 +AN 1 +▁morgen 1 +▁eher 1 +ance 1 +▁jene 1 +▁hohen 1 +▁Strand 1 +zig 1 +▁verfügbar 1 +ank 1 +▁Gäste 1 +hä 1 +▁Insel 1 +▁l 1 +▁bi 1 +▁vorgeschlagen 1 +glich 1 +ba 1 +▁Kommissarin 1 +▁Natürlich 1 +laden 1 +▁automatisch 1 +▁Investitionen 1 +▁Zusammen 1 +IT 1 +buch 1 +▁Erachtens 1 +▁offen 1 +dig 1 +▁außerdem 1 +▁somit 1 +▁Außen 1 +Sch 1 +▁Kern 1 +▁Nur 1 +legt 1 +▁Heute 1 +out 1 +▁überhaupt 1 +▁Ga 1 +▁Ratspräsident 1 +▁2006 1 +ön 1 +▁Öl 1 +bare 1 +▁Pe 1 +▁Opfer 1 +ziehen 1 +▁erkennen 1 +▁Preise 1 +sverfahren 1 +▁vergangenen 1 +isiert 1 +▁Initiative 1 +▁vollständig 1 +▁genommen 1 +▁Ti 1 +ette 1 +press 1 +▁setzt 1 +▁Werte 1 +▁Viele 1 +▁Auffassung 1 +systeme 1 +sfähigkeit 1 +▁gefunden 1 +▁Car 1 +▁zahlreiche 1 +▁begann 1 +▁Armut 1 +barkeit 1 +ite 1 +▁vorgesehen 1 +▁Aufenthalt 1 +▁Sommer 1 +bot 1 +▁Nationen 1 +det 1 +stehen 1 +▁Sinne 1 +▁Dabei 1 +▁Aktivitäten 1 +cu 1 +IS 1 +alität 1 +▁erster 1 +ind 1 +▁Regeln 1 +▁Dis 1 +▁halte 1 +▁Führung 1 +▁suchen 1 +▁lernen 1 +▁behandelt 1 +▁Ressourcen 1 +ade 1 +eb 1 +▁beginnen 1 +stieg 1 +▁hervor 1 +amm 1 +® 1 +▁folgt 1 +▁ziehen 1 +▁vorgelegt 1 +▁aufge 1 +les 1 +▁do 1 +utz 1 +▁erwarten 1 +▁Frieden 1 +ult 1 +ock 1 +▁Verkehrs 1 +▁Gefühl 1 +tischen 1 +▁Lassen 1 +kom 1 +▁beide 1 +schi 1 +▁fand 1 +cke 1 +▁Warum 1 +▁festgelegt 1 +▁vergessen 1 +unternehmen 1 +▁Öffentlichkeit 1 +▁Bio 1 +▁länger 1 +ht 1 +▁Berlin 1 +lagen 1 +fach 1 +▁Basis 1 +ect 1 +▁Nord 1 +druck 1 +AR 1 +frei 1 +tan 1 +▁aufgenommen 1 +▁erfahren 1 +ice 1 +▁Folge 1 +merk 1 +fl 1 +ino 1 +▁verbessert 1 +▁Sitzung 1 +▁Beginn 1 +▁Besuch 1 +▁Neben 1 +tin 1 +▁alten 1 +wachsen 1 +ES 1 +Ge 1 +▁Organisation 1 +▁gelegen 1 +▁Ob 1 +▁Kapital 1 +▁arbeitet 1 +▁Dienst 1 +▁diejenigen 1 +▁September 1 +▁insgesamt 1 +▁gewesen 1 +Ma 1 +mor 1 +ruf 1 +▁Vielen 1 +ker 1 +mun 1 +▁Jetzt 1 +▁Stellen 1 +richten 1 +▁co 1 +▁geschaffen 1 +stoff 1 +stände 1 +▁Tätigkeit 1 +ris 1 +ordnung 1 +▁fort 1 +10 1 +▁Mehr 1 +▁Port 1 +▁Bad 1 +▁ziemlich 1 +eil 1 +ya 1 +▁verantwortlich 1 +ssystem 1 +▁Standard 1 +service 1 +▁ruhig 1 +▁voran 1 +▁et 1 +trä 1 +▁angesicht 1 +▁Bu 1 +▁benötigen 1 +▁einschließlich 1 +▁Vorschriften 1 +▁tra 1 +▁weder 1 +tische 1 +▁Juli 1 +▁Transparenz 1 +▁moderne 1 +▁Dezember 1 +▁Ste 1 +▁Israel 1 +▁Küche 1 +▁nimmt 1 +▁benutzt 1 +▁kannst 1 +▁Ausbildung 1 +ließ 1 +▁eng 1 +▁kleiner 1 +▁Monaten 1 +▁richtige 1 +rate 1 +partner 1 +▁Hinsicht 1 +▁Staat 1 +▁erinnern 1 +▁Programme 1 +lose 1 +▁UN 1 +enz 1 +▁Cha 1 +▁sofort 1 +▁Tagesordnung 1 +▁aktiv 1 +▁schützen 1 +▁erfolgt 1 +▁dringend 1 +▁Pri 1 +rechte 1 +gebiet 1 +▁mag 1 +▁Bestimmungen 1 +tat 1 +▁erzielt 1 +tim 1 +▁ko 1 +▁11 1 +▁Republik 1 +▁Ä 1 +▁vertreten 1 +ett 1 +▁Hause 1 +schrift 1 +ender 1 +▁verändert 1 +▁Kom 1 +▁inter 1 +▁War 1 +▁Netzwerk 1 +hof 1 +tum 1 +▁Nacht 1 +▁Forschungs 1 +▁aufzu 1 +▁Dritt 1 +▁Vergangenheit 1 +▁po 1 +▁o 1 +▁leider 1 +▁Bereiche 1 +problem 1 +CH 1 +teile 1 +▁Einige 1 +▁bewusst 1 +▁Stabilität 1 +▁beitragen 1 +▁unge 1 +cker 1 +laufen 1 +▁Bemühungen 1 +mar 1 +▁zumindest 1 +RO 1 +wirken 1 +kop 1 +▁Klein 1 +▁000 1 +▁Firma 1 +▁täglich 1 +▁Or 1 +▁Gründen 1 +Die 1 +que 1 +nnen 1 +▁Gehirn 1 +▁Unternehmens 1 +▁wenige 1 +lin 1 +SE 1 +▁Kr 1 +▁2. 1 +▁Weiter 1 +erweise 1 +hält 1 +▁bezüglich 1 +▁Untersuchung 1 +▁europäischer 1 +▁kostenlos 1 +▁fragen 1 +▁gemäß 1 +daten 1 +▁Information 1 +trieb 1 +▁zunehmend 1 +gegangen 1 +▁Kompromiss 1 +▁erwartet 1 +▁Fällen 1 +RE 1 +▁Risiko 1 +▁Kar 1 +kal 1 +▁Vorsitz 1 +lauf 1 +▁Erst 1 +▁erlaubt 1 +▁Fu 1 +▁euch 1 +Fraktion 1 +lü 1 +▁Anforderungen 1 +verkehr 1 +▁Dokument 1 +richt 1 +▁Organ 1 +▁verhindern 1 +DE 1 +ände 1 +а 1 +▁Paket 1 +▁Post 1 +▁begrüße 1 +▁folgen 1 +▁Generation 1 +dienst 1 +▁si 1 +▁wesentlich 1 +▁Aufnahme 1 +▁Wieder 1 +▁unten 1 +▁Struktur 1 +▁Aspekte 1 +pol 1 +ring 1 +licher 1 +▁Bewegung 1 +schein 1 +▁Amerika 1 +ition 1 +werte 1 +▁Solidarität 1 +▁Alter 1 +▁versch 1 +alter 1 +▁gerecht 1 +fonds 1 +kehr 1 +е 1 +▁Fi 1 +▁Indien 1 +schluss 1 +kla 1 +lan 1 +▁Januar 1 +▁gr 1 +bahn 1 +▁West 1 +wasser 1 +▁Th 1 +▁Protokoll 1 +mä 1 +Schlusselwortern 1 +▁gezeigt 1 +▁spielt 1 +ationen 1 +▁Erde 1 +reichen 1 +▁Betrieb 1 +▁Ideen 1 +▁Spanien 1 +treten 1 +▁Zur 1 +▁veröffentlicht 1 +ica 1 +▁getroffen 1 +▁März 1 +▁Bro 1 +▁Anfrage 1 +▁Zweitens 1 +▁groß 1 +we 1 +▁Terrorismus 1 +▁60 1 +äre 1 +▁Fe 1 +tar 1 +AL 1 +▁me 1 +▁Einfluss 1 +▁gleiche 1 +▁benutzen 1 +▁Gi 1 +▁Ku 1 +▁Mutter 1 +ologische 1 +con 1 +▁sah 1 +▁Annahme 1 +▁Personal 1 +app 1 +wende 1 +▁Sy 1 +▁Gewinn 1 +▁entscheiden 1 +▁Q 1 +▁nennen 1 +▁perfekt 1 +▁einge 1 +▁Auftrag 1 +fragen 1 +bildung 1 +dien 1 +▁Wissenschaft 1 +▁Straf 1 +▁Gesetz 1 +▁Partei 1 +▁wider 1 +▁Herz 1 +▁Ist 1 +▁Technik 1 +▁entsprechend 1 +▁Plan 1 +▁Erfahrungen 1 +▁2005 1 +▁bald 1 +▁benötigt 1 +ost 1 +▁unmittelbar 1 +▁schlecht 1 +oren 1 +anten 1 +▁ernst 1 +ori 1 +▁Erstens 1 +▁unver 1 +▁Schi 1 +▁begrüßen 1 +01 1 +▁Schlüssel 1 +▁Flughafen 1 +zog 1 +▁Größe 1 +aktion 1 +stellt 1 +▁normal 1 +▁Straßen 1 +▁außerhalb 1 +▁Wunsch 1 +▁Webseite 1 +▁ne 1 +▁Vergleich 1 +stück 1 +fällig 1 +▁erfüllen 1 +9 1 +misch 1 +▁Boden 1 +▁Süd 1 +IN 1 +ges 1 +isse 1 +▁Japan 1 +sie 1 +ian 1 +19 1 +▁Transport 1 +▁lösen 1 +▁endlich 1 +▁Firmen 1 +sbereich 1 +bericht 1 +▁ausreichend 1 +jo 1 +▁heutigen 1 +for 1 +wesen 1 +nom 1 +▁Oktober 1 +▁aktuellen 1 +▁Hi 1 +▁globalen 1 +▁genießen 1 +atur 1 +▁EUR 1 +▁Bru 1 +▁Fest 1 +staat 1 +▁2004 1 +ure 1 +▁fordern 1 +▁Kindern 1 +ys 1 +▁rein 1 +▁darstellt 1 +▁Aufgaben 1 +▁Monate 1 +▁Com 1 +▁Geist 1 +▁integriert 1 +▁Hoch 1 +▁eben 1 +üsse 1 +и 1 +▁Bürgerinnen 1 +park 1 +▁Bis 1 +▁Telefon 1 +▁Irak 1 +dauer 1 +▁Fernseh 1 +▁Wohn 1 +▁Märkte 1 +ano 1 +▁Wei 1 +entwicklung 1 +▁ha 1 +lö 1 +▁gewählt 1 +▁Patienten 1 +bank 1 +amp 1 +▁Su 1 +▁genutzt 1 +▁Kopf 1 +▁Meter 1 +▁überzeugt 1 +▁Objekt 1 +▁Osten 1 +è 1 +tten 1 +▁außer 1 +▁Verhalten 1 +▁stimmen 1 +▁del 1 +▁Nr 1 +▁Reaktion 1 +▁Botschaft 1 +▁Bas 1 +▁wählen 1 +nach 1 +▁Fortschritt 1 +▁Tagen 1 +▁dachte 1 +▁Sinn 1 +▁nachdem 1 +▁breite 1 +▁Tre 1 +▁Spieler 1 +▁ihres 1 +▁kaum 1 +▁Obwohl 1 +▁Vorstellung 1 +▁r 1 +▁gering 1 +uf 1 +▁weg 1 +gra 1 +leg 1 +ari 1 +▁niemand 1 +funktion 1 +ständig 1 +▁Verwaltung 1 +▁Hoffnung 1 +projekt 1 +í 1 +▁Schwierigkeiten 1 +▁trotz 1 +▁anderes 1 +▁geändert 1 +EL 1 +▁anderem 1 +reu 1 +burg 1 +▁ausschließlich 1 +betrieb 1 +▁genannten 1 +▁Option 1 +▁neues 1 +▁hören 1 +▁no 1 +▁Männer 1 +▁oben 1 +▁überall 1 +lieb 1 +▁Ski 1 +wechsel 1 +sprozess 1 +gar 1 +▁Universität 1 +fin 1 +▁Go 1 +▁Rechnung 1 +▁Künstler 1 +ations 1 +zustellen 1 +tru 1 +▁verpflichtet 1 +▁fa 1 +▁Angelegenheit 1 +▁nationale 1 +▁i 1 +▁Gar 1 +▁zusätzliche 1 +legung 1 +▁Karte 1 +▁Frühstück 1 +▁Tradition 1 +▁Präsidenten 1 +AS 1 +▁welches 1 +sitz 1 +▁Berichts 1 +leiten 1 +▁Pal 1 +leb 1 +schläge 1 +▁umfassende 1 +▁Anti 1 +▁globale 1 +▁International 1 +▁Aktion 1 +▁Bedürfnisse 1 +▁Gegen 1 +nden 1 +▁vorher 1 +▁Parteien 1 +▁berücksichtigt 1 +mü 1 +▁Gleich 1 +▁Stimme 1 +gesetzt 1 +essen 1 +▁Arbeitsplätze 1 +fern 1 +▁entsprechenden 1 +▁fr 1 +linie 1 +▁teil 1 +▁ju 1 +▁extrem 1 +▁wären 1 +kor 1 +▁Minister 1 +lit 1 +▁Verteidigung 1 +▁verstärkt 1 +▁Schritte 1 +▁offensichtlich 1 +▁Partnerschaft 1 +▁Deutsch 1 +▁Zeichen 1 +▁Mer 1 +gend 1 +ckt 1 +▁Durchführung 1 +▁Mitgliedstaat 1 +▁echte 1 +▁Bürgern 1 +▁zentrale 1 +zel 1 +▁beschlossen 1 +ai 1 +Q 1 +ionen 1 +ace 1 +▁junge 1 +▁gesetzt 1 +▁Fahrzeug 1 +üb 1 +zeichen 1 +▁Chance 1 +▁Monat 1 +▁Praxis 1 +▁Per 1 +▁offiziell 1 +▁80 1 +seitig 1 +▁gegenwärtig 1 +▁Pu 1 +▁eingehen 1 +▁entschieden 1 +▁Pol 1 +technik 1 +▁Stil 1 +▁En 1 +▁Golf 1 +ib 1 +arch 1 +zugehen 1 +▁gelten 1 +▁organisiert 1 +▁with 1 +▁erklären 1 +ON 1 +part 1 +▁Menschenrechts 1 +▁Si 1 +> 1 +ast 1 +ären 1 +▁Server 1 +▁22 1 +ial 1 +▁Klimawandel 1 +ction 1 +kan 1 +OR 1 +▁unbedingt 1 +ppe 1 +sicherung 1 +fallen 1 +ement 1 +führer 1 +▁vi 1 +▁bilden 1 +mark 1 +▁Abgeordnete 1 +▁AG 1 +ras 1 +▁Angelegenheiten 1 +▁nötig 1 +▁klare 1 +▁Datei 1 +▁Arten 1 +▁Freund 1 +messen 1 +liste 1 +▁danke 1 +ühl 1 +▁komme 1 +▁November 1 +▁Windows 1 +▁Bewertung 1 +▁Organisationen 1 +▁früh 1 +▁eingerichtet 1 +▁bedeuten 1 +▁übernehmen 1 +lung 1 +▁lesen 1 +▁Den 1 +▁Technologien 1 +▁erhöht 1 +reisen 1 +▁Amt 1 +▁Arm 1 +▁bestimmt 1 +macht 1 +fel 1 +fuhr 1 +▁Begriff 1 +▁Atmosphäre 1 +▁usw 1 +äl 1 +▁Fuß 1 +▁End 1 +▁gefährlich 1 +▁gesprochen 1 +EG 1 +wunder 1 +▁technische 1 +▁Pf 1 +▁alte 1 +▁jährlich 1 +▁Mitteilung 1 +standard 1 +▁näher 1 +ete 1 +▁Spa 1 +▁Liebe 1 +erei 1 +▁menschliche 1 +▁Einrichtung 1 +▁Volk 1 +▁pa 1 +statt 1 +▁Wann 1 +▁Mor 1 +▁dich 1 +▁Infrastruktur 1 +ek 1 +anischen 1 +line 1 +▁Vo 1 +technologie 1 +▁Schul 1 +sicher 1 +▁Bus 1 +▁Gipfel 1 +▁na 1 +▁Allerdings 1 +bereit 1 +pri 1 +▁verloren 1 +dition 1 +kü 1 +▁Völker 1 +▁Abend 1 +▁Tro 1 +▁möglicherweise 1 +▁2003 1 +▁streng 1 +▁sämtliche 1 +▁Kirche 1 +▁einzelne 1 +geht 1 +▁positive 1 +▁Bre 1 +▁Chi 1 +▁Aspekt 1 +н 1 +san 1 +▁Tages 1 +▁konkrete 1 +▁Regel 1 +tzt 1 +▁funktionieren 1 +par 1 +▁Material 1 +▁Dem 1 +vel 1 +▁Hinweis 1 +▁Feld 1 +bri 1 +▁bitten 1 +hören 1 +▁erstellt 1 +▁Großbritannien 1 +▁Gründe 1 +▁Off 1 +▁technischen 1 +▁Analyse 1 +zz 1 +ight 1 +▁gesch 1 +▁finanzielle 1 +sprogramm 1 +mut 1 +▁Har 1 +hren 1 +▁Gott 1 +og 1 +▁Worte 1 +vers 1 +▁Jahrzehnt 1 +▁stets 1 +struktur 1 +wahl 1 +find 1 +sprache 1 +System 1 +▁23 1 +▁tätig 1 +gruppen 1 +▁Stück 1 +schaff 1 +▁entsprechende 1 +mitteln 1 +els 1 +▁Abschluss 1 +denken 1 +erstatterin 1 +▁Paris 1 +▁folgenden 1 +reise 1 +▁beteiligt 1 +▁Anstrengungen 1 +▁you 1 +▁persönlichen 1 +tage 1 +▁Dienste 1 +lement 1 +▁privaten 1 +▁Zustimmung 1 +▁aktuelle 1 +fehl 1 +▁entgegen 1 +▁Realität 1 +zentrum 1 +▁entstehen 1 +▁sage 1 +▁Griechenland 1 +▁modernen 1 +▁GmbH 1 +svorschriften 1 +▁Vorteile 1 +tiert 1 +sort 1 +▁jeweiligen 1 +zahlung 1 +▁rasch 1 +gl 1 +▁Haltung 1 +geb 1 +▁alt 1 +ative 1 +▁Angst 1 +▁negativ 1 +▁verändern 1 +▁April 1 +▁manchmal 1 +▁Überwachung 1 +ov 1 +▁Antrag 1 +▁Mein 1 +▁Waren 1 +▁Dazu 1 +▁geleistet 1 +pel 1 +getragen 1 +ili 1 +gg 1 +ile 1 +▁Wege 1 +val 1 +äh 1 +▁Schließlich 1 +▁Gast 1 +▁Stand 1 +etz 1 +hnt 1 +▁betrachtet 1 +▁folgende 1 +▁Geb 1 +▁berücksichtigen 1 +▁bewegen 1 +echt 1 +gesellschaft 1 +▁allgemeinen 1 +gesetz 1 +fälle 1 +behörde 1 +rück 1 +▁akzeptieren 1 +vent 1 +▁90 1 +▁Iran 1 +▁Hu 1 +gänge 1 +ational 1 +ros 1 +▁Garten 1 +artig 1 +losen 1 +▁Eltern 1 +▁acht 1 +▁Einstellung 1 +▁Start 1 +▁York 1 +ym 1 +▁200 1 +▁Au 1 +stoß 1 +▁qu 1 +aktiv 1 +▁App 1 +asi 1 +geber 1 +▁historischen 1 +▁Suche 1 +▁gefordert 1 +▁Verpflichtungen 1 +öl 1 +▁As 1 +▁stand 1 +eck 1 +▁Charakter 1 +▁Voll 1 +▁Ve 1 +▁Reformen 1 +▁Vielleicht 1 +▁Can 1 +▁nachhaltige 1 +▁starke 1 +dy 1 +▁derartige 1 +▁Mitte 1 +▁ausdrücklich 1 +▁Fran 1 +▁at 1 +▁ba 1 +▁Bri 1 +▁CO 1 +teilung 1 +gesch 1 +▁Wahlen 1 +▁entspricht 1 +▁Foto 1 +▁Tiere 1 +▁Sh 1 +▁Werkzeug 1 +▁zahlreichen 1 +▁Motor 1 +▁Tür 1 +red 1 +modell 1 +sser 1 +▁intensiv 1 +▁regelmäßig 1 +▁Banken 1 +▁Zweifel 1 +▁Schule 1 +▁Angriff 1 +▁Beweis 1 +▁künftig 1 +▁Ausgaben 1 +hu 1 +▁schön 1 +▁gewisse 1 +handlung 1 +ieß 1 +▁demokratischen 1 +▁Produktions 1 +hafte 1 +bre 1 +rich 1 +▁Anerkennung 1 +▁Mess 1 +Ich 1 +▁Kritik 1 +ting 1 +deck 1 +▁Sitz 1 +▁Zi 1 +griff 1 +▁dir 1 +▁Straße 1 +▁Tu 1 +gericht 1 +IC 1 +lon 1 +▁Kurs 1 +AT 1 +▁el 1 +▁Gas 1 +ott 1 +santrag 1 +region 1 +fassung 1 +oni 1 +kultur 1 +▁Zeitraum 1 +▁mindestens 1 +▁günstig 1 +▁Cor 1 +▁gekommen 1 +▁mi 1 +chi 1 +▁handeln 1 +▁Nutzen 1 +▁Zunächst 1 +▁zuvor 1 +▁speziell 1 +▁Anteil 1 +▁Komm 1 +▁militärische 1 +▁angesprochen 1 +▁Ausschuß 1 +▁Vielfalt 1 +oder 1 +▁Besucher 1 +▁gern 1 +▁hoffen 1 +▁Zug 1 +▁zudem 1 +▁Engagement 1 +▁Sonder 1 +▁musste 1 +▁Waffen 1 +maßnahmen 1 +▁Installation 1 +▁umgesetzt 1 +gruppe 1 +verfahren 1 +▁al 1 +ologie 1 +▁vermeiden 1 +▁Hintergrund 1 +zeichnen 1 +▁sicherzustellen 1 +swert 1 +▁Lehr 1 +▁Agentur 1 +▁For 1 +▁Stellungnahme 1 +▁betrachten 1 +kräfte 1 +5- 1 +lösung 1 +ekt 1 +▁seines 1 +▁nahm 1 +▁legen 1 +▁Ze 1 +tur 1 +ins 1 +leitung 1 +▁allgemeine 1 +wissen 1 +wick 1 +tung 1 +▁Kriterien 1 +▁Beratung 1 +▁Politiker 1 +?" 1 +steigen 1 +mitglied 1 +ox 1 +▁Site 1 +▁Lang 1 +▁Glück 1 +schicht 1 +Aus 1 +versorgung 1 +▁konzentrieren 1 +▁ungefähr 1 +▁Tor 1 +schalt 1 +ding 1 +räu 1 +baren 1 +zent 1 +gebracht 1 +▁by 1 +würdig 1 +▁erweitert 1 +▁Ereignisse 1 +▁demokratische 1 +▁halb 1 +▁Holz 1 +▁persönlich 1 +▁Des 1 +▁Schaden 1 +▁erfüllt 1 +▁beziehen 1 +▁hinweisen 1 +ST 1 +zeichnung 1 +▁Jung 1 +▁Mag 1 +ration 1 +▁Militär 1 +▁etc 1 +▁ar 1 +▁Freunde 1 +▁voraus 1 +gal 1 +▁Netz 1 +▁Anpassung 1 +▁Falle 1 +▁Ausnahme 1 +▁Super 1 +▁schneller 1 +▁Eigen 1 +▁Unterkategorien 1 +prä 1 +▁deutschen 1 +▁Grunde 1 +▁sprach 1 +▁Falls 1 +▁Fähigkeit 1 +▁Mus 1 +van 1 +▁Link 1 +▁reden 1 +▁hart 1 +OS 1 +▁Gedanken 1 +▁Instrumente 1 +▁Eis 1 +are 1 +▁Mio 1 +▁miteinander 1 +▁verfolgt 1 +ßt 1 +▁Wind 1 +▁bestehenden 1 +schl 1 +▁Veränderungen 1 +▁laufen 1 +rum 1 +iss 1 +rad 1 +▁Meeres 1 +▁sicherlich 1 +▁Büro 1 +ath 1 +▁Kan 1 +▁Forderung 1 +▁Hersteller 1 +▁verlassen 1 +▁Autor 1 +krank 1 +▁Management 1 +▁Verkauf 1 +▁Kauf 1 +▁Wahrheit 1 +▁op 1 +▁finde 1 +win 1 +▁Teile 1 +▁Atom 1 +▁Mensch 1 +sol 1 +▁ergreifen 1 +träger 1 +▁Sonnen 1 +bring 1 +▁Sol 1 +▁Unterschied 1 +ther 1 +ps 1 +▁fahren 1 +rei 1 +position 1 +▁Kor 1 +Programm 1 +▁los 1 +▁niedrig 1 +▁Gold 1 +▁interessiert 1 +▁prüfen 1 +ore 1 +▁Chris 1 +▁einfache 1 +▁verursacht 1 +ffe 1 +▁zuletzt 1 +▁Rand 1 +▁London 1 +▁reich 1 +▁Leistung 1 +bus 1 +ink 1 +sinn 1 +stall 1 +tier 1 +▁Kredit 1 +▁Jeder 1 +eten 1 +▁jegliche 1 +▁gelangen 1 +rahmen 1 +▁komplexe 1 +angebot 1 +▁mehreren 1 +▁Vater 1 +▁Zwischen 1 +qua 1 +▁Einkommen 1 +▁Hel 1 +▁Roma 1 +▁27 1 +▁Stein 1 +▁Strom 1 +▁Sprachen 1 +▁Grundsatz 1 +▁Ihres 1 +▁Anspruch 1 +▁Prinzip 1 +station 1 +▁Texte 1 +▁mo 1 +▁typisch 1 +see 1 +▁Winter 1 +▁Aufbau 1 +▁Mon 1 +▁amerikanischen 1 +ski 1 +sucht 1 +bett 1 +▁geschützt 1 +fläche 1 +▁ernsthaft 1 +▁entweder 1 +▁Österreich 1 +▁finanziellen 1 +▁bedeutende 1 +▁schöne 1 +▁online 1 +▁Vereinte 1 +rau 1 +ual 1 +▁Tod 1 +kunden 1 +▁Mont 1 +Ein 1 +▁Gemeinde 1 +grenzen 1 +▁interessante 1 +wiesen 1 +▁Rad 1 +▁Absicht 1 +▁manche 1 +▁erzielen 1 +▁Titel 1 +krieg 1 +▁Ober 1 +▁anerkannt 1 +▁Signal 1 +gelassen 1 +▁Ost 1 +▁Inhalte 1 +▁Europäer 1 +▁Städte 1 +▁Kenntnis 1 +rang 1 +▁Trans 1 +US 1 +▁hält 1 +ini 1 +ffer 1 +▁erhöhen 1 +▁darunter 1 +▁darstellen 1 +▁Typ 1 +▁gewinnen 1 +Das 1 +▁Str 1 +▁interessant 1 +▁gegenseitig 1 +▁Prüfung 1 +▁stimmt 1 +▁daraus 1 +▁älter 1 +▁positiv 1 +stadt 1 +▁tut 1 +▁geschehen 1 +▁Polizei 1 +▁danach 1 +▁Aussicht 1 +mie 1 +▁dagegen 1 +▁Kooperation 1 +▁Pflicht 1 +▁Drogen 1 +▁Restaurants 1 +▁ch 1 +▁Globalisierung 1 +▁grenz 1 +▁Wirkung 1 +▁persönliche 1 +▁relativ 1 +▁Welche 1 +▁Nutzer 1 +▁2001 1 +▁ideal 1 +▁Systeme 1 +kur 1 +ndung 1 +▁Richtlinien 1 +▁Rest 1 +schul 1 +▁betonen 1 +pflicht 1 +inter 1 +▁Kommunikation 1 +▁optimal 1 +▁Landschaft 1 +▁Gesetzgebung 1 +▁70 1 +lern 1 +▁Regelung 1 +▁genauso 1 +ali 1 +freiheit 1 +▁regionale 1 +bin 1 +▁Vorbereitung 1 +ante 1 +▁wünschen 1 +▁2002 1 +volle 1 +weck 1 +stab 1 +▁großartig 1 +▁stattfinden 1 +preise 1 +geteilt 1 +▁bezeichnet 1 +vertrag 1 +▁Systems 1 +stehende 1 +▁♫ 1 +▁Wettbewerbs 1 +▁rechts 1 +▁innovative 1 +▁Sollte 1 +▁verfolgen 1 +act 1 +▁eingeführt 1 +machen 1 +▁stabil 1 +▁Angesicht 1 +▁damals 1 +geführt 1 +test 1 +▁freien 1 +mat 1 +lager 1 +tsch 1 +bürger 1 +▁angeboten 1 +▁su 1 +band 1 +▁Kategorie 1 +unk 1 +▁At 1 +▁Abschließend 1 +▁Akt 1 +haltung 1 +▁Band 1 +▁laut 1 +▁bestätigt 1 +▁Herstellung 1 +zo 1 +raten 1 +▁Kurz 1 +▁kommenden 1 +▁stärken 1 +ät 1 +▁welcher 1 +▁Gut 1 +▁erleben 1 +▁Zudem 1 +▁Kal 1 +▁Phase 1 +▁Teilnehmer 1 +▁sieben 1 +▁ho 1 +▁teilen 1 +▁angemessen 1 +sländern 1 +▁Weil 1 +▁stimme 1 +▁Mu 1 +fest 1 +▁klein 1 +schuldig 1 +▁Zell 1 +▁Fonds 1 +kul 1 +▁angegeben 1 +▁Argument 1 +▁falls 1 +roh 1 ++ 1 +▁Bundes 1 +nes 1 +wahr 1 +flug 1 +▁Irland 1 +▁Entwurf 1 +▁Termin 1 +wir 1 +& 1 +▁Formen 1 +▁herum 1 +▁Sorge 1 +▁teilweise 1 +▁Homepage 1 +▁Kontroll 1 +60 1 +▁spezielle 1 +▁500 1 +stell 1 +wirkung 1 +hängen 1 +▁Tatsächlich 1 +▁Einigung 1 +▁Flugzeug 1 +▁Königreich 1 +wertung 1 +▁com 1 +▁Übersetzung 1 +fordern 1 +▁Friedens 1 +räume 1 +RA 1 +räumen 1 +wohn 1 +▁kaufen 1 +▁grundlegende 1 +▁Mädchen 1 +▁unglaublich 1 +richtung 1 +▁elektronische 1 +energie 1 +▁gegründet 1 +▁Mikro 1 +liegen 1 +▁dank 1 +▁angenehm 1 +bad 1 +▁Sam 1 +▁Blut 1 +▁ähnlich 1 +fu 1 +▁hinzu 1 +▁Dennoch 1 +hel 1 +sabkommen 1 +material 1 +▁Status 1 +▁garantiert 1 +▁übernachten 1 +Kon 1 +15 1 +▁Garantie 1 +iere 1 +▁Hälfte 1 +▁menschlichen 1 +alisierung 1 +▁1999 1 +sagen 1 +politischen 1 +▁Leider 1 +▁einsetzen 1 +▁Presse 1 +▁langsam 1 +▁Übergang 1 +▁Polen 1 +▁Ordnung 1 +▁angezeigt 1 +ille 1 +▁Studie 1 +▁besonderen 1 +orientiert 1 +oo 1 +▁Ratsvorsitz 1 +▁grosse 1 +▁zentral 1 +▁beginnt 1 +▁Kur 1 +Er 1 +▁Qua 1 +▁geschieht 1 +▁freuen 1 +▁dennoch 1 +vention 1 +▁Verständnis 1 +▁Bestandteil 1 +paket 1 +leistung 1 +ssig 1 +arten 1 +▁freue 1 +▁Ausland 1 +▁Kamera 1 +▁Gesicht 1 +ativ 1 +nie 1 +▁richtigen 1 +▁Tisch 1 +brechen 1 +▁Hände 1 +▁bauen 1 +▁wirksam 1 +falls 1 +▁Verpflichtung 1 +zähl 1 +▁Maschinen 1 +▁Hy 1 +▁Elemente 1 +dacht 1 +▁dritte 1 +▁Grundsätze 1 +▁dienen 1 +▁Multi 1 +▁Zahlen 1 +▁dritten 1 +prinzip 1 +Le 1 +spar 1 +▁trägt 1 +werfen 1 +99 1 +▁fallen 1 +▁Danke 1 +dro 1 +▁Ur 1 +ban 1 +▁August 1 +▁hotel 1 +▁Planeten 1 +▁Prioritäten 1 +pu 1 +▁Studien 1 +▁Einheit 1 +▁fühlen 1 +anlagen 1 +▁erscheint 1 +▁Oder 1 +kreis 1 +kurs 1 +▁zahlen 1 +▁übertragen 1 +▁lebt 1 +▁Initiativen 1 +▁Absatz 1 +eller 1 +▁größer 1 +▁Willen 1 +▁aufmerksam 1 +▁Schau 1 +han 1 +▁Einrichtungen 1 +▁Ausstellung 1 +by 1 +hotel 1 +produktion 1 +▁notwendigen 1 +▁links 1 +▁hochwertige 1 +dienste 1 +nimmt 1 +▁Red 1 +▁Papier 1 +rechts 1 +▁: 1 +▁feststellen 1 +▁Tour 1 +▁erstellen 1 +ehr 1 +viel 1 +▁humanitäre 1 +schuld 1 +wagen 1 +▁schlimm 1 +rus 1 +▁betroffen 1 +▁warten 1 +▁Februar 1 +typ 1 +hy 1 +ty 1 +▁profitieren 1 +hor 1 +▁Brüssel 1 +▁wollten 1 +▁einzigartige 1 +Beifall 1 +ehrt 1 +▁fordert 1 +rom 1 +king 1 +zieht 1 +▁Genau 1 +instrument 1 +systems 1 +wart 1 +bald 1 +▁Jede 1 +▁Miss 1 +▁Jahrhunderts 1 +upp 1 +▁Westen 1 +▁herzlich 1 +öpf 1 +▁Heil 1 +stoffe 1 +▁durchaus 1 +▁Air 1 +▁Museum 1 +▁nützlich 1 +▁zufrieden 1 +zugeben 1 +▁Verlust 1 +▁Grün 1 +chten 1 +bra 1 +▁Stärkung 1 +management 1 +digen 1 +war 1 +▁hingewiesen 1 +▁Ukraine 1 +▁beschäftigt 1 +▁Verwaltungs 1 +person 1 +▁sinnvoll 1 +▁interne 1 +▁sonst 1 +▁gewährleistet 1 +▁hervorragende 1 +bü 1 +▁Gebieten 1 +tral 1 +▁lokalen 1 +▁Innen 1 +▁entscheidend 1 +Sterne 1 +▁€ 1 +▁Dimension 1 +▁diskutieren 1 +▁meist 1 +weich 1 +▁vo 1 +▁Mindest 1 +gegen 1 +▁Grenz 1 +▁Sal 1 +▁umfasst 1 +ux 1 +geladen 1 +▁besuchen 1 +▁befürworte 1 +▁Agrar 1 +▁Pan 1 +▁vernünftig 1 +▁Ton 1 +q 1 +▁que 1 +▁Funktionen 1 +▁Spezial 1 +licht 1 +▁Beschreibung 1 +▁Besitz 1 +▁abgeschlossen 1 +▁erheblich 1 +politische 1 +Que 1 +pekt 1 +▁höhere 1 +von 1 +▁begrenzt 1 +ó 1 +nahm 1 +▁vorstellen 1 +▁Achtung 1 +▁erfolgen 1 +bindung 1 +▁Vorteil 1 +▁institutionelle 1 +▁größeren 1 +▁schreiben 1 +▁Sil 1 +Arbeitslosigkeit 1 +▁beinhaltet 1 +▁Villa 1 +how 1 +▁Ferien 1 +▁Tagung 1 +▁Club 1 +▁Wald 1 +roll 1 +▁jederzeit 1 +р 1 +laub 1 +▁Worten 1 +▁Risiken 1 +▁politischer 1 +▁vollkommen 1 +▁» 1 +“, 1 +▁fertig 1 +▁gewünscht 1 +▁Umfang 1 +issen 1 +sto 1 +▁überzeugen 1 +willig 1 +▁gestalten 1 +izi 1 +dia 1 +▁Bal 1 +hlen 1 +▁Such 1 +▁verlieren 1 +▁à 1 +gung 1 +▁ließ 1 +▁Mini 1 +▁Beteiligung 1 +PS 1 +▁Einhaltung 1 +ächtig 1 +organisation 1 +ID 1 +▁wichtigste 1 +▁Essen 1 +12 1 +▁Zustand 1 +▁ad 1 +▁Lauf 1 +▁diskutiert 1 +▁Justiz 1 +▁Klasse 1 +fä 1 +▁Lesung 1 +▁umfangreiche 1 +▁Komfort 1 +LE 1 +▁zer 1 +▁Volks 1 +▁Nachrichten 1 +▁erhält 1 +häuser 1 +▁erfordert 1 +anische 1 +▁unternehmen 1 +▁Haut 1 +richtlinie 1 +▁Qualitäts 1 +▁Maße 1 +liefer 1 +▁Kein 1 +▁machte 1 +schnitt 1 +änderung 1 +▁kulturelle 1 +▁Eindruck 1 +▁CD 1 +mission 1 +aut 1 +▁deutsche 1 +tieren 1 +▁Wohnung 1 +▁PC 1 +▁Religion 1 +▁Dorf 1 +▁beliebt 1 +▁Sc 1 +▁höchste 1 +▁wenigen 1 +brauch 1 +▁Wissenschaftler 1 +geordnet 1 +tho 1 +▁ökologisch 1 +▁Regime 1 +AP 1 +▁unterstütze 1 +tion 1 +rö 1 +▁300 1 +▁hergestellt 1 +schrei 1 +▁Fotos 1 +▁Gegenteil 1 +zin 1 +kommt 1 +dit 1 +tragen 1 +▁Camp 1 +▁Wachstums 1 +▁Verkehr 1 +▁Priorität 1 +ani 1 +ood 1 +minister 1 +▁or 1 +▁Standort 1 +▁Handlung 1 +punkte 1 +▁Hafen 1 +▁fair 1 +zeiten 1 +low 1 +nov 1 +▁Bedarf 1 +▁ursprünglich 1 +text 1 +drücke 1 +▁Verträge 1 +▁Terrasse 1 +▁informieren 1 +▁Para 1 +karte 1 +▁König 1 +▁legt 1 +▁freundlich 1 +▁wachsende 1 +▁jungen 1 +ausschuss 1 +▁Betracht 1 +star 1 +pack 1 +▁Schluss 1 +▁Kontinent 1 +gli 1 +zusetzen 1 +▁Kräfte 1 +TE 1 +meister 1 +▁Rot 1 +west 1 +▁Krankheit 1 +gründe 1 +▁sehe 1 +▁historische 1 +ida 1 +bruch 1 +▁Business 1 +▁Barcelona 1 +▁Gerichtshof 1 +▁möglichst 1 +gebildet 1 +▁Patent 1 +▁Leistungen 1 +heiten 1 +▁zusätzlich 1 +grad 1 +▁einiger 1 +▁Produkten 1 +Ab 1 +04 1 +▁kürzlich 1 +▁wusste 1 +▁entdeckt 1 +▁Schwerpunkt 1 +▁Angaben 1 +▁Kosovo 1 +▁bequem 1 +▁Tur 1 +▁wunderbar 1 +▁Gemeinsamen 1 +▁wunderschöne 1 +02 1 +produkt 1 +▁Val 1 +▁kom 1 +▁großes 1 +▁überprüfen 1 +mil 1 +▁11. 1 +▁Treffen 1 +▁betont 1 +▁Dateien 1 +▁Zuständigkeit 1 +uk 1 +kenntnis 1 +staaten 1 +▁Pre 1 +▁kompliziert 1 +▁21 1 +RI 1 +ara 1 +▁Diskriminierung 1 +▁Niveau 1 +▁Eigentum 1 +bie 1 +▁Hauses 1 +organ 1 +information 1 +▁Pat 1 +ep 1 +▁weiterer 1 +▁Fin 1 +▁Pflanzen 1 +▁Flexibilität 1 +▁II 1 +▁schlechte 1 +▁Hin 1 +cha 1 +▁Boot 1 +klär 1 +▁Ruhe 1 +▁Meiner 1 +▁uner 1 +05 1 +▁Forderungen 1 +sagt 1 +▁hundert 1 +▁jeweils 1 +▁Export 1 +▁selten 1 +straße 1 +▁Gesetze 1 +▁Kompetenz 1 +zone 1 +zeichnet 1 +▁niemals 1 +▁Unterschiede 1 +▁Ursache 1 +▁Part 1 +▁Wander 1 +▁Morgen 1 +▁private 1 +▁Verbrechen 1 +▁übrigen 1 +▁Methode 1 +▁Landwirte 1 +▁Experten 1 +weil 1 +▁Datenbank 1 +▁Gleichzeitig 1 +▁Rund 1 +▁pr 1 +züge 1 +▁geplant 1 +ama 1 +▁Halb 1 +▁Einwanderung 1 +air 1 +▁Geschäft 1 +▁Studenten 1 +av 1 +▁sogenannte 1 +▁allgemein 1 +Hotel 1 +▁medizinische 1 +▁Zahlung 1 +Sp 1 +▁Lizenz 1 +pä 1 +ons 1 +wendung 1 +▁freie 1 +ausschusses 1 +▁Laufe 1 +▁gemeinschaft 1 +füge 1 +▁lokale 1 +▁Zugriff 1 +▁Liberalisierung 1 +▁bildet 1 +▁Lehrer 1 +tätigkeit 1 +▁endgültig 1 +▁geöffnet 1 +▁Schreib 1 +▁grundsätzlich 1 +▁verabschiedet 1 +▁schw 1 +т 1 +▁hauptsächlich 1 +dra 1 +lat 1 +bor 1 +märkte 1 +jährige 1 +▁reagieren 1 +tür 1 +▁einzigen 1 +stor 1 +▁Schweiz 1 +not 1 +▁höher 1 +▁Speicher 1 +Wir 1 +à 1 +gie 1 +stellungen 1 +nummer 1 +▁y 1 +▁Amsterdam 1 +AC 1 +▁gebaut 1 +▁Freude 1 +spe 1 +▁kulturellen 1 +tzen 1 +eucht 1 +▁Download 1 +▁Überzeugung 1 +2- 1 +MA 1 +▁3. 1 +rand 1 +ull 1 +▁Streit 1 +▁zugänglich 1 +schloss 1 +▁jüngsten 1 +▁festgestellt 1 +weisung 1 +▁ausgewählt 1 +▁professionelle 1 +einheit 1 +▁Nahrungsmittel 1 +▁Standards 1 +▁Gegensatz 1 +▁Name 1 +▁WTO 1 +produkte 1 +lli 1 +gewalt 1 +▁Gebiete 1 +sbedingungen 1 +▁Koordinierung 1 +leih 1 +▁Beziehung 1 +▁regionalen 1 +▁High 1 +▁informiert 1 +▁wesentliche 1 +ata 1 +ehen 1 +▁fe 1 +▁Messe 1 +▁Marken 1 +vorschlag 1 +▁sauber 1 +▁gehalten 1 +▁Vielzahl 1 +▁solcher 1 +▁Fenster 1 +▁ideale 1 +▁Maß 1 +DA 1 +▁schafft 1 +gab 1 +way 1 +▁Überprüfung 1 +rät 1 +▁irgendeine 1 +▁externe 1 +▁Fo 1 +▁Debian 1 +▁behandeln 1 +▁definiert 1 +link 1 +▁Grundrechte 1 +▁Schulden 1 +lig 1 +ona 1 +▁Drei 1 +▁spricht 1 +▁Seine 1 +▁Letzt 1 +bedingungen 1 +▁britischen 1 +▁erforderlichen 1 +▁Architektur 1 +Li 1 +▁Krankheiten 1 +▁Bett 1 +▁gegenwärtigen 1 +yp 1 +▁Bedrohung 1 +prozess 1 +▁Pass 1 +▁Dia 1 +▁Wirklichkeit 1 +Al 1 +Geschäftsordnung 1 +suche 1 +▁anstatt 1 +oc 1 +möglichkeiten 1 +▁Adresse 1 +▁klicken 1 +ust 1 +qu 1 +▁Jugend 1 +▁akzeptiert 1 +▁ähnliche 1 +▁+ 1 +programme 1 +▁vorliegenden 1 +cc 1 +▁fällt 1 +▁schwarz 1 +▁Rom 1 +▁üblich 1 +▁schönen 1 +▁Arbeiten 1 +▁führte 1 +▁Best 1 +▁Ganz 1 +▁brachte 1 +▁Erklärungen 1 +▁Ei 1 +▁Reg 1 +▁20. 1 +▁Gewicht 1 +▁au 1 +▁Oberfläche 1 +ware 1 +cy 1 +▁« 1 +▁Verletzung 1 +▁Alternative 1 +▁abhängig 1 +pfen 1 +▁unternommen 1 +▁dient 1 +▁trotzdem 1 +gelegt 1 +ise 1 +mobil 1 +▁möglichen 1 +kapital 1 +▁as 1 +▁mussten 1 +▁not 1 +▁kamen 1 +TM 1 +heben 1 +forschung 1 +drückt 1 +mod 1 +FR 1 +CO 1 +▁Sand 1 +▁transparent 1 +▁Krebs 1 +▁Suite 1 +▁ergeben 1 +▁französischen 1 +▁amerikanische 1 +▁Perspektive 1 +▁Zentralbank 1 +▁Weitere 1 +teri 1 +▁empfehlen 1 +▁besitzt 1 +holen 1 +ces 1 +mus 1 +▁Mil 1 +▁Definition 1 +▁Google 1 +▁Berichte 1 +zellen 1 +▁Karten 1 +07 1 +geschäft 1 +▁eröffnet 1 +▁außerordentlich 1 +75 1 +Ö 1 +▁Kombination 1 +▁Beschäftigungs 1 +* 1 +▁Booking 1 +▁billig 1 +▁keinerlei 1 +treffen 1 +sport 1 +tour 1 +▁Unabhängigkeit 1 +▁Doppel 1 +schneid 1 +▁lautet 1 +▁room 1 +▁voller 1 +▁Erhöhung 1 +▁korrekt 1 +▁26 1 +AM 1 +▁Fälle 1 +tät 1 +▁öffentlich 1 +yl 1 +70 1 +wal 1 +▁teilnehmen 1 +grund 1 +▁Berufs 1 +▁Leuten 1 +durch 1 +▁Massen 1 +▁individuell 1 +▁Afghanistan 1 +gebühr 1 +▁Element 1 +▁schließen 1 +lor 1 +bas 1 +nah 1 +zy 1 +sorge 1 +▁eingereicht 1 +▁toll 1 +ular 1 +SA 1 +iziert 1 +▁gutes 1 +▁dieselbe 1 +11 1 +▁28 1 +▁Übereinkommen 1 +ziehung 1 +▁basiert 1 +hand 1 +▁begonnen 1 +spann 1 +▁internationaler 1 +▁reichen 1 +▁läuft 1 +▁erscheinen 1 +▁geschrieben 1 +▁wertvoll 1 +reif 1 +▁21. 1 +fund 1 +▁Glas 1 +▁entsprechen 1 +qualität 1 +в 1 +▁Branche 1 +▁verehrte 1 +▁individuelle 1 +▁Lager 1 +▁langfristig 1 +▁Gegend 1 +pon 1 +▁ausländische 1 +▁Identität 1 +figur 1 +tätig 1 +▁verbundenen 1 +▁Min 1 +▁enorme 1 +▁Zeiten 1 +▁pre 1 +fort 1 +▁Regelungen 1 +ED 1 +maß 1 +▁Beihilfen 1 +▁Arbeitsmarkt 1 +▁ausgewogen 1 +▁zählen 1 +▁Farben 1 +▁Bill 1 +präsent 1 +scheid 1 +frist 1 +▁reicht 1 +▁Gebrauch 1 +gebunden 1 +..." 1 +▁guter 1 +▁vorschlagen 1 +▁erzählen 1 +▁angemessene 1 +IM 1 +jährigen 1 +▁gesetzlich 1 +▁speziellen 1 +▁entstanden 1 +ju 1 +wür 1 +▁glücklich 1 +▁Nein 1 +gut 1 +▁Erinnerung 1 +▁Flüchtlinge 1 +▁zuerst 1 +namen 1 +▁produziert 1 +fähigkeit 1 +mos 1 +▁politisch 1 +▁Tourismus 1 +▁Fähigkeiten 1 +{ 1 +▁erinnert 1 +▁Erwachsene 1 +▁from 1 +getreten 1 +rot 1 +ley 1 +Gästebewertungen 1 +isches 1 +ET 1 +▁Last 1 +▁bisschen 1 +▁Empfehlungen 1 +▁Prä 1 +▁wodurch 1 +▁grüne 1 +ball 1 +▁Feuer 1 +IP 1 +▁Geräte 1 +well 1 +gezogen 1 +▁verb 1 +▁Gemeinsam 1 +▁1998 1 +cial 1 +▁gesellschaft 1 +strahl 1 +'' 1 +▁Gerät 1 +▁seien 1 +▁Englisch 1 +▁Pl 1 +haben 1 +kauf 1 +IA 1 +▁Nachfrage 1 +▁Agenda 1 +kette 1 +▁Col 1 +▁Verhältnis 1 +▁Minderheiten 1 +tain 1 +MS 1 +▁Antworten 1 +▁Zentral 1 +▁geboren 1 +fahrzeug 1 +▁rück 1 +wirkt 1 +▁Code 1 +stanz 1 +vid 1 +▁Nachdem 1 +▁gelungen 1 +▁Aktionen 1 +▁TV 1 +▁Buchung 1 +▁Ebenso 1 +▁garantieren 1 +▁Sprach 1 +▁Ger 1 +wort 1 +▁langfristige 1 +▁Teilen 1 +▁sorgfältig 1 +▁Wohlstand 1 +▁General 1 +▁Anwendungen 1 +▁Asyl 1 +unt 1 +▁Betriebs 1 +▁langen 1 +▁treten 1 +ua 1 +▁wiederholt 1 +abel 1 +▁angeht 1 +▁Anlagen 1 +ita 1 +▁Schrift 1 +▁betroffenen 1 +leistungen 1 +▁unmöglich 1 +▁sagten 1 +kra 1 +plätze 1 +▁Problemen 1 +▁nationaler 1 +ax 1 +▁Dokumente 1 +ätz 1 +▁Regierungs 1 +▁gestern 1 +ringen 1 +smaßnahmen 1 +▁Veranstaltung 1 +▁Unterkunft 1 +▁Eigenschaften 1 +▁umgehen 1 +▁IT 1 +ij 1 +tic 1 +ré 1 +▁sodass 1 +▁Klicken 1 +▁Serie 1 +▁Gleichgewicht 1 +40 1 +▁herunter 1 +▁verbreitet 1 += 1 +uck 1 +▁sozial 1 +ence 1 +▁Stimm 1 +ebene 1 +▁Schüler 1 +▁Methoden 1 +istisch 1 +ül 1 +▁Bestellung 1 +▁dürfte 1 +▁Par 1 +▁Delegation 1 +▁vereinbart 1 +PL 1 +▁Fluss 1 +▁My 1 +▁Baby 1 +flu 1 +organisationen 1 +▁Symbol 1 +üß 1 +▁Asien 1 +▁Portugal 1 +top 1 +üchte 1 +▁einverstanden 1 +▁Teilnahme 1 +▁Sehr 1 +▁Stunde 1 +▁Fort 1 +aria 1 +reform 1 +▁Hall 1 +ada 1 +NE 1 +film 1 +▁Vision 1 +lution 1 +▁Hilfs 1 +Innen 1 +ture 1 +▁Austausch 1 +▁rot 1 +gas 1 +▁außergewöhnlich 1 +transport 1 +▁Stern 1 +▁Cu 1 +wehr 1 +▁digitale 1 +gesellschaften 1 +▁Amerikaner 1 +▁Sachen 1 +CE 1 +▁sicherstellen 1 +▁ro 1 +itter 1 +▁Glauben 1 +▁erzeugt 1 +▁Anlage 1 +▁Bildungs 1 +▁Mitteln 1 +SP 1 +▁Jugendliche 1 +▁erhebliche 1 +▁Denken 1 +▁dauerhaft 1 +▁Abschnitt 1 +▁erneuerbare 1 +▁vielmehr 1 +vis 1 +▁Mut 1 +▁geringer 1 +▁tat 1 +▁Ph 1 +▁wiederum 1 +▁ländlichen 1 +▁kurze 1 +▁Mir 1 +▁Wünsche 1 +▁höchst 1 +▁Zoll 1 +▁Entwicklungen 1 +verkehrs 1 +▁* 1 +▁kontextuell 1 +▁Voraussetzungen 1 +maschine 1 +suchen 1 +führt 1 +gerät 1 +direkt 1 +kontrolle 1 +▁Montag 1 +quelle 1 +▁Bücher 1 +▁klassische 1 +▁verstanden 1 +▁Niederlande 1 +▁entscheidende 1 +chel 1 +▁hilft 1 +pen 1 +Pla 1 +henswürdigkeiten 1 +Ch 1 +▁entdecken 1 +▁zugleich 1 +usch 1 +▁Krisen 1 +ish 1 +▁are 1 +▁Veränderung 1 +▁Beim 1 +neu 1 +▁Geschlecht 1 +▁Kilometer 1 +zung 1 +▁Zins 1 +zubringen 1 +▁andererseits 1 +▁Grad 1 +▁Effizienz 1 +▁Einklang 1 +gres 1 +▁ru 1 +cal 1 +▁vieler 1 +▁wesentlichen 1 +Pa 1 +▁CA 1 +▁Umständen 1 +▁vorbei 1 +▁traditionellen 1 +▁keiner 1 +▁Süden 1 +▁besseren 1 +schritt 1 +▁frisch 1 +▁verkauft 1 +EC 1 +03 1 +▁mittels 1 +▁Revolution 1 +▁positiven 1 +stä 1 +dri 1 +gelöst 1 +gelt 1 +▁abgestimmt 1 +▁öffnen 1 +▁35 1 +dreh 1 +▁Regulierung 1 +gro 1 +▁it 1 +entwurf 1 +▁spät 1 +partei 1 +▁Orte 1 +▁hört 1 +schiff 1 +post 1 +▁Einkaufs 1 +▁Grenze 1 +▁diesbezüglich 1 +▁Wohl 1 +▁Aussage 1 +▁Immobilien 1 +▁weiteres 1 +▁Muster 1 +gebiete 1 +▁Mitgliedern 1 +▁beachten 1 +▁religiöse 1 +illa 1 +vari 1 +▁Bedenken 1 +▁besucht 1 +isierte 1 +▁maximal 1 +ira 1 +▁Nieder 1 +▁trans 1 +Datei 1 +▁gefördert 1 +LA 1 +▁www 1 +▁Versorgung 1 +▁namens 1 +▁mon 1 +TA 1 +▁Farb 1 +▁beschränkt 1 +ham 1 +▁Gal 1 +▁betreffen 1 +} 1 +▁seitens 1 +▁Gang 1 +▁gestaltet 1 +▁erlebt 1 +bro 1 +bauen 1 +ächte 1 +▁befassen 1 +▁Bel 1 +anda 1 +▁BIP 1 +Г 1 +ati 1 +▁illegale 1 +▁Anliegen 1 +▁Nahen 1 +▁Ter 1 +▁landwirtschaft 1 +▁Verbot 1 +▁Geschichten 1 +▁Planung 1 +▁Blog 1 +▁Internationalen 1 +▁Programms 1 +och 1 +▁weltweiten 1 +▁übernommen 1 +▁Schwarz 1 +▁Schweden 1 +Shop 1 +fol 1 +▁zuständig 1 +gezahlt 1 +▁Ausmaß 1 +▁wirksame 1 +▁schauen 1 +▁deiner 1 +▁Dort 1 +▁Beispiele 1 +▁Sanktionen 1 +▁beliebig 1 +14 1 +▁Job 1 +▁wann 1 +▁Neue 1 +tle 1 +▁Trotz 1 +▁erlauben 1 +▁Liefer 1 +▁herrliche 1 +cre 1 +car 1 +▁trifft 1 +▁les 1 +fisch 1 +65 1 +kar 1 +▁riesigen 1 +▁dynamisch 1 +▁Diskussionen 1 +▁gesunde 1 +▁derzeitigen 1 +LI 1 +▁ausgezeichnete 1 +▁leiden 1 +▁installiert 1 +▁Formular 1 +▁pu 1 +▁Gründung 1 +▁Mittelmeer 1 +▁Kollege 1 +▁gewonnen 1 +▁anbieten 1 +▁Tausende 1 +▁bedarf 1 +▁Redner 1 +▁entschlossen 1 +▁Institution 1 +tief 1 +▁Handeln 1 +▁vollständige 1 +▁Open 1 +▁Noch 1 +▁vorgeschlagenen 1 +▁Anreiz 1 +▁Datenschutz 1 +▁bereitgestellt 1 +krise 1 +rank 1 +▁Tief 1 +durchschnittlich 1 +▁erkannt 1 +▁Mangel 1 +▁grundlegenden 1 +▁dis 1 +▁Star 1 +pflanz 1 +▁griechische 1 +▁erhielt 1 +OL 1 +▁Gespräche 1 +▁Unternehmer 1 +▁höchsten 1 +cia 1 +▁nochmals 1 +▁Leistungs 1 +Veröffentlichung 1 +▁pri 1 +▁modern 1 +25 1 +▁Statistik 1 +▁World 1 +▁Modul 1 +▁kämpfen 1 +▁Fischer 1 +▁Vertrieb 1 +▁außen 1 +▁Linux 1 +▁Erwartungen 1 +▁Rumänien 1 +▁gelöst 1 +▁Wal 1 +▁Kol 1 +niveau 1 +vest 1 +▁konstruktiv 1 +▁Sonne 1 +▁erzählt 1 +▁sichtbar 1 +▁Ziffer 1 +▁Andere 1 +▁Erholung 1 +▁Einwohner 1 +pul 1 +48 1 +▁Links 1 +▁Effekt 1 +▁bekämpfen 1 +▁Medi 1 +▁Strategien 1 +oli 1 +▁Hol 1 +▁Kommunikations 1 +▁attraktiv 1 +▁Spiele 1 +dre 1 +▁Fraktionen 1 +pan 1 +atoren 1 +▁Ehe 1 +aufnahme 1 +nor 1 +▁Materialien 1 +▁Za 1 +▁Bra 1 +▁Leitlinien 1 +▁verlangt 1 +▁liefern 1 +▁siehe 1 +▁Direkt 1 +▁John 1 +▁bestimmen 1 +▁Char 1 +▁Sach 1 +▁Kaffee 1 +▁eigenes 1 +▁führenden 1 +tom 1 +▁Haushaltsplan 1 +körper 1 +▁Kann 1 +▁ausführlich 1 +▁verdient 1 +luft 1 +anlage 1 +▁Kandidat 1 +einrichtungen 1 +▁Temperatur 1 +ura 1 +▁Himmel 1 +▁ergriffen 1 +▁Regen 1 +▁Gesch 1 +austausch 1 +pre 1 +bit 1 +of 1 +▁gew 1 +▁schnelle 1 +gebung 1 +▁stellte 1 +▁Häuser 1 +▁erfolgreiche 1 +▁Reich 1 +geräte 1 +▁Mac 1 +▁Dingen 1 +mini 1 +▁Bauern 1 +▁komfortable 1 +▁Stärke 1 +▁besitzen 1 +▁konzentriert 1 +▁Voraussetzung 1 +▁verbinden 1 +▁Aufgrund 1 +▁Elektro 1 +▁Fläche 1 +lehr 1 +▁technologische 1 +▁Empfehlung 1 +▁zustimmen 1 +tech 1 +La 1 +▁konkreten 1 +▁sorgt 1 +98 1 +▁Wandel 1 +▁29 1 +▁Nummer 1 +08 1 +änder 1 +▁Fehl 1 +▁flexible 1 +überschreitende 1 +begriff 1 +▁kurzem 1 +▁Format 1 +forderung 1 +fra 1 +▁Jedes 1 +▁verlangen 1 +▁umzusetzen 1 +▁gemütliche 1 +▁anti 1 +▁gearbeitet 1 +▁annehmen 1 +▁Dadurch 1 +▁Strukturen 1 +▁Hinter 1 +▁Erzeugnisse 1 +▁Norden 1 +▁hast 1 +ella 1 +▁Güter 1 +▁bestehende 1 +ique 1 +▁Regional 1 +spezifisch 1 +▁türkische 1 +▁Praktik 1 +Emissionen 1 +geschlossen 1 +▁Autos 1 +bli 1 +л 1 +▁finanziert 1 +streit 1 +ping 1 +fällen 1 +isierten 1 +▁hoher 1 +Fi 1 +▁fühlt 1 +▁bezieht 1 +ico 1 +▁senden 1 +▁fragte 1 +▁chemische 1 +fried 1 +pat 1 +▁Wähler 1 +▁bezahlen 1 +PA 1 +tausend 1 +Ü 1 +▁Beruf 1 +Berücksichtigung 1 +▁zweifellos 1 +▁zeit 1 +▁umgeben 1 +▁Schatten 1 +▁Nachricht 1 +▁Fri 1 +▁Strukturfonds 1 +▁hängt 1 +code 1 +▁beobachten 1 +▁bekommt 1 +▁Publikum 1 +▁beschrieben 1 +▁Alles 1 +gemeinschaft 1 +▁Kreis 1 +ong 1 +geschrieben 1 +Pro 1 +▁welchen 1 +maschinen 1 +80 1 +▁Maßnahme 1 +▁berechtigt 1 +fällt 1 +smöglichkeiten 1 +cho 1 +▁Wellness 1 +leit 1 +▁Medizin 1 +karten 1 +▁Institut 1 +▁gewährt 1 +miet 1 +▁angesehen 1 +▁lag 1 +bat 1 +▁Zeitung 1 +por 1 +▁Kontext 1 +▁Verhandlungs 1 +▁Del 1 +▁international 1 +▁Farbe 1 +▁wenden 1 +▁Führer 1 +▁Ohne 1 +▁Dafür 1 +▁Labor 1 +09 1 +verhalten 1 +▁Umfeld 1 +▁betreffend 1 +▁Werbe 1 +▁schwierigen 1 +▁pla 1 +plant 1 +▁fehlt 1 +▁willkommen 1 +▁eigen 1 +▁Schulen 1 +▁Vom 1 +erfolg 1 +breite 1 +IL 1 +▁City 1 +▁Beschluss 1 +▁Wesen 1 +▁weshalb 1 +▁zuverlässig 1 +effekt 1 +gno 1 +▁Studio 1 +▁Gestaltung 1 +wind 1 +▁ehemaligen 1 +▁Klimaanlage 1 +▁Mittelpunkt 1 +▁irische 1 +▁Zeug 1 +▁1997 1 +▁Milch 1 +▁kostenfrei 1 +▁kostet 1 +▁übrigens 1 +▁friedlich 1 +▁Allgemeinen 1 +old 1 +▁Korruption 1 +▁Auge 1 +▁existieren 1 +▁Küste 1 +▁britische 1 +▁bewegt 1 +ierbar 1 +Adresse 1 +▁ausgesetzt 1 +▁Tal 1 +▁Universum 1 +▁Theater 1 +▁Früh 1 +zuhalten 1 +für 1 +fü 1 +▁exklusiv 1 +▁Schuld 1 +▁einig 1 +Der 1 +▁Schönheit 1 +▁gezwungen 1 +immt 1 +schreiben 1 +▁Mode 1 +▁Cre 1 +▁traditionelle 1 +▁Denk 1 +▁offenen 1 +▁stolz 1 +itu 1 +▁Alt 1 +▁Geschwindigkeit 1 +▁Hund 1 +▁starken 1 +▁staatliche 1 +▁Verfügbarkeit 1 +▁eventuell 1 +▁Ferner 1 +▁Konzert 1 +▁Vermittlung 1 +▁Bucht 1 +▁bemüht 1 +▁massiv 1 +▁Würde 1 +▁Kommentar 1 +▁essen 1 +▁neun 1 +▁Comp 1 +▁Umweltschutz 1 +lief 1 +▁Sorgen 1 +▁vorgenommen 1 +▁sub 1 +▁plötzlich 1 +▁Normen 1 +▁ausgerichtet 1 +▁Beiträge 1 +▁Trend 1 +▁(1 1 +▁präsentiert 1 +situation 1 +geschichte 1 +▁Kapitel 1 +lock 1 +18 1 +▁Männern 1 +▁Umgang 1 +ält 1 +▁Harmonisierung 1 +▁existiert 1 +▁entlang 1 +▁Uni 1 +hang 1 +▁erhältlich 1 +▁Kongress 1 +▁Sub 1 +▁aufzunehmen 1 +▁innere 1 +▁verurteilt 1 +▁Prinzipien 1 +▁Mobilität 1 +▁Traum 1 +▁einfacher 1 +▁Ag 1 +▁Microsoft 1 +▁ehrlich 1 +pläne 1 +▁richten 1 +▁Kapazität 1 +gerecht 1 +▁Stadtzentrum 1 +EM 1 +▁heutige 1 +bert 1 +▁gezogen 1 +▁achten 1 +▁150 1 +▁hab 1 +▁Heimat 1 +rseits 1 +poli 1 +▁Stellung 1 +▁Konsens 1 +▁Handy 1 +Rezeption 1 +▁abgelehnt 1 +▁reduziert 1 +▁Anbieter 1 +▁investieren 1 +▁Fleisch 1 +▁zählt 1 +▁Dach 1 +leute 1 +regelung 1 +▁vielfältig 1 +amerikanische 1 +▁entwickelten 1 +▁breit 1 +▁Wichtig 1 +sländer 1 +decken 1 +MO 1 +schreiten 1 +urteil 1 +rechnen 1 +▁Brasilien 1 +▁gespeichert 1 +▁This 1 +▁verkaufen 1 +Kom 1 +▁inzwischen 1 +▁egal 1 +▁afrikanische 1 +▁aktive 1 +▁verringern 1 +▁spezifische 1 +▁Radio 1 +gekommen 1 +▁glaubt 1 +34 1 +stimme 1 +▁Tim 1 +▁echten 1 +bewegung 1 +▁Plattform 1 +▁Grand 1 +с 1 +▁Eisenbahn 1 +▁kreativ 1 +▁Herkunft 1 +zukommen 1 +anti 1 +zehn 1 +▁Dauer 1 +▁Vorgehen 1 +▁beraten 1 +▁Übereinstimmung 1 +Ro 1 +stimmung 1 +▁Verbesserungen 1 +▁Mark 1 +▁beträchtlich 1 +▁Viertel 1 +▁Altstadt 1 +verbrauch 1 +▁umfassenden 1 +lett 1 +▁Operation 1 +▁Real 1 +stätte 1 +▁Drittens 1 +▁Maschine 1 +▁emp 1 +▁wert 1 +geld 1 +tschaftswachstum 1 +▁Geschäfte 1 +▁französische 1 +dank 1 +▁sterben 1 +▁Festlegung 1 +▁Ausführung 1 +▁hinein 1 +▁Widerstand 1 +Mobil 1 +▁durchzuführen 1 +PT 1 +▁$ 1 +▁mod 1 +raub 1 +▁Besorgnis 1 +▁Leid 1 +▁mögen 1 +uc 1 +▁begrüßt 1 +TV 1 +finden 1 +▁Veranstaltungen 1 +@ 1 +freundliche 1 +The 1 +▁letzter 1 +verwaltung 1 +▁sichern 1 +▁offene 1 +▁NATO 1 +▁vorbereitet 1 +▁fordere 1 +▁Zahlungs 1 +▁Original 1 +▁Gebühr 1 +▁Top 1 +▁verbringen 1 +▁Agrarpolitik 1 +▁aufnehmen 1 +flo 1 +▁Gefängnis 1 +▁1996 1 +▁Schäden 1 +▁berühmten 1 +▁bestand 1 +Tech 1 +▁Update 1 +▁bekam 1 +▁unterzeichnet 1 +▁UNO 1 +▁Ol 1 +° 1 +▁sofern 1 +▁nieder 1 +▁italienischen 1 +datei 1 +▁eure 1 +▁einerseits 1 +So 1 +▁betreffenden 1 +▁Aktien 1 +sprach 1 +kunft 1 +▁gerichtet 1 +version 1 +▁Urteil 1 +▁verleihen 1 +▁chinesischen 1 +▁dahin 1 +24 1 +fahrer 1 +▁starten 1 +64 1 +▁Inseln 1 +▁Arbeitsplatz 1 +▁Opposition 1 +▁entsteht 1 +▁Experiment 1 +▁Spannung 1 +▁westlichen 1 +▁anwesend 1 +38 1 +▁hinweg 1 +▁Fern 1 +nehmer 1 +▁verhindert 1 +▁Frist 1 +▁Kreditkarte 1 +▁Angebote 1 +▁Hauptstadt 1 +uliert 1 +menge 1 +▁Details 1 +▁Front 1 +▁Freizeit 1 +▁beträgt 1 +95 1 +▁detailliert 1 +▁kontrolliert 1 +▁südlich 1 +▁IN 1 +▁Emp 1 +zieren 1 +▁riesige 1 +▁Verbreitung 1 +▁Verringerung 1 +▁Übernachtung 1 +▁durchführen 1 +▁Deck 1 +wächst 1 +▁Tool 1 +fragt 1 +▁Stimmen 1 +bestimmung 1 +▁Genehmigung 1 +▁geprüft 1 +▁irgendwie 1 +▁tausend 1 +▁Zivil 1 +▁industrielle 1 +▁künftigen 1 +alismus 1 +▁einheitliche 1 +ih 1 +web 1 +к 1 +▁gelegt 1 +▁Mari 1 +▁Städten 1 +▁behalten 1 +xi 1 +▁amtierende 1 +▁Center 1 +▁enorm 1 +pot 1 +▁Roboter 1 +▁staatlichen 1 +▁gewissen 1 +▁Verein 1 +ctor 1 +fremd 1 +▁Grafik 1 +▁Werbung 1 +▁Marketing 1 +lösen 1 +▁strategische 1 +ami 1 +▁Verantwortlich 1 +▁gefragt 1 +▁Chancen 1 +▁geehrte 1 +cro 1 +▁Speise 1 +ME 1 +▁ehrgeizig 1 +▁sonstige 1 +▁Faktoren 1 +▁Touristen 1 +▁Stamm 1 +hung 1 +▁Haftung 1 +▁passieren 1 +▁schicken 1 +ato 1 +abkommen 1 +▁Satz 1 +▁Stahl 1 +wald 1 +▁hervorragend 1 +ont 1 +▁Bewusstsein 1 +basierte 1 +ola 1 +ativen 1 +▁Mc 1 +avi 1 +phase 1 +quote 1 +▁Kat 1 +füll 1 +▁ursprünglichen 1 +▁nachhaltigen 1 +▁uneingeschränkt 1 +wohl 1 +▁Ursprung 1 +▁Ehre 1 +▁beruht 1 +▁reduzieren 1 +▁Brief 1 +greif 1 +▁Menü 1 +schlüssel 1 +▁hielt 1 +Projekt 1 +▁Ernährung 1 +▁produzieren 1 +▁hinzufügen 1 +▁Drittländern 1 +▁zusätzlichen 1 +▁Intervention 1 +hebung 1 +play 1 +▁Solar 1 +▁auftreten 1 +ierende 1 +▁Journalist 1 +▁doppelt 1 +▁letztendlich 1 +verbindung 1 +▁schwach 1 +▁besch 1 +▁= 1 +▁Paul 1 +▁Zusatz 1 +ulation 1 +▁para 1 +cio 1 +kontroll 1 +▁letztlich 1 +▁schrieb 1 +östlich 1 +▁effiziente 1 +▁erzeugen 1 +IE 1 +▁ausgesprochen 1 +▁Ausführungen 1 +▁heran 1 +phi 1 +▁zugun 1 +tausch 1 +kunde 1 +37 1 +▁aufgefordert 1 +format 1 +▁niedriger 1 +▁untersucht 1 +▁verteilt 1 +kleid 1 +ierenden 1 +lip 1 +▁überein 1 +▁DVD 1 +▁Sein 1 +Mo 1 +▁Terror 1 +falt 1 +abend 1 +▁gelernt 1 +▁nutzt 1 +▁solange 1 +▁zurückzu 1 +vol 1 +▁Sicherung 1 +auto 1 +ñ 1 +▁Plenum 1 +ström 1 +▁sur 1 +▁bemühen 1 +▁Bahnhof 1 +▁bezug 1 +▁ausgeführt 1 +din 1 +ging 1 +▁hervorheben 1 +▁Lernen 1 +▁Spaß 1 +▁Ganze 1 +lesen 1 +▁Inflation 1 +fluss 1 +▁bezahlt 1 +▁Fitness 1 +▁Spar 1 +▁Gespräch 1 +▁Browser 1 +▁angepasst 1 +▁Respekt 1 +▁Beste 1 +▁Stock 1 +▁Volkswirtschaft 1 +ical 1 +96 1 +▁effizient 1 +äumt 1 +verletzung 1 +DER 1 +▁Marke 1 +▁2020 1 +▁Anstieg 1 +▁beschäftigen 1 +▁spanischen 1 +▁Steuern 1 +▁Kranken 1 +▁Tochter 1 +▁gratulieren 1 +▁dauert 1 +ifiziert 1 +schluß 1 +▁erleichtern 1 +Bahn 1 +▁Menschheit 1 +▁Kunde 1 +▁beglückwünschen 1 +▁Zucker 1 +pal 1 +▁palästinensisch 1 +▁bestätigen 1 +▁jemals 1 +▁führende 1 +▁Strecke 1 +GE 1 +▁renoviert 1 +▁freiwillig 1 +stil 1 +antwort 1 +▁Digital 1 +▁Schlafzimmer 1 +gin 1 +▁geprägt 1 +97 1 +center 1 +▁wiederholen 1 +▁zerstört 1 +▁untersuchen 1 +▁Hor 1 +kret 1 +š 1 +läufe 1 +▁Todes 1 +▁geistige 1 +team 1 +▁zivil 1 +▁Stoffe 1 +schütt 1 +ç 1 +▁Zusammenhalt 1 +▁Tele 1 +gramm 1 +zü 1 +UR 1 +Lo 1 +▁neuesten 1 +▁Will 1 +▁herrscht 1 +komp 1 +17 1 +▁Forum 1 +▁Fünf 1 +▁berufliche 1 +▁soweit 1 +▁Kohle 1 +Bo 1 +▁Appartement 1 +▁Deswegen 1 +▁entspannen 1 +rühr 1 +▁zuständigen 1 +▁Bulgarien 1 +▁Räume 1 +▁Küsten 1 +▁aussehen 1 +Strategie 1 +▁hand 1 +▁zufolge 1 +▁Detail 1 +bal 1 +▁KMU 1 +▁knapp 1 +▁enger 1 +▁Sohn 1 +м 1 +▁unverzüglich 1 +anstalt 1 +▁Sind 1 +▁Beschlüsse 1 +▁Freunden 1 +16 1 +lohn 1 +▁Mission 1 +▁illegal 1 +▁Apartments 1 +▁Vorschlägen 1 +▁Mandat 1 +▁Bibliothek 1 +▁miss 1 +▁Gästen 1 +▁400 1 +▁Geschmack 1 +▁parlamentarisch 1 +▁kontrollieren 1 +▁Pläne 1 +49 1 +ado 1 +liegenden 1 +▁Hohen 1 +▁englische 1 +▁liefert 1 +beauftragte 1 +▁jener 1 +▁Cap 1 +▁Pakistan 1 +▁Audio 1 +▁Anfragen 1 +▁Metall 1 +▁Schlag 1 +▁Sehen 1 +▁scheinen 1 +amt 1 +ivität 1 +lenk 1 +▁israelisch 1 +fährt 1 +▁Beamte 1 +▁Nachbarn 1 +konferenz 1 +▁Event 1 +füllt 1 +▁Sicher 1 +Tra 1 +85 1 +▁Arbeitsplätzen 1 +▁Renn 1 +wärts 1 +reicht 1 +▁Pop 1 +▁Gerechtigkeit 1 +▁fein 1 +europa 1 +assi 1 +▁Gesetzes 1 +▁beteiligen 1 +dor 1 +▁Ferienwohnung 1 +▁Rechtsgrundlage 1 +▁nahezu 1 +grün 1 +gibt 1 +skonferenz 1 +▁verschiedener 1 +NS 1 +▁Defizit 1 +▁Aktionsplan 1 +▁ersetzt 1 +▁Sä 1 +▁offenbar 1 +▁gefährdet 1 +▁getrennt 1 +Di 1 +branche 1 +▁par 1 +▁Kabel 1 +▁qualifizierte 1 +auch 1 +▁höheren 1 +▁kurzfristig 1 +▁bilaterale 1 +▁Akteure 1 +ermaßen 1 +▁Ausgabe 1 +cor 1 +▁Aktiv 1 +▁32 1 +Ar 1 +▁ferner 1 +▁anschließend 1 +▁Potenzial 1 +▁weitgehend 1 +▁Martin 1 +▁Live 1 +▁Abfall 1 +▁Bemerkungen 1 +▁sucht 1 +06 1 +▁umfassend 1 +azi 1 +▁Angel 1 +▁Verarbeitung 1 +▁spreche 1 +ruhe 1 +▁ausgeschlossen 1 +▁gedacht 1 +▁erstaunlich 1 +▁schwedische 1 +▁Wien 1 +▁verdienen 1 +▁Costa 1 +▁Lieferung 1 +▁Nahrung 1 +▁elegante 1 +▁Sha 1 +▁Training 1 +olo 1 +▁moralische 1 +▁zwingen 1 +meldung 1 +ward 1 +▁konkret 1 +ident 1 +39 1 +▁Zypern 1 +▁Ausstattung 1 +▁Automobil 1 +option 1 +iff 1 +steck 1 +TO 1 +gewinn 1 +▁konsequent 1 +▁Haar 1 +▁ändert 1 +günstig 1 +▁spezialisiert 1 +▁Konsequenzen 1 +▁Mrd 1 +SL 1 +▁Renten 1 +IR 1 +▁Rohstoff 1 +▁Anzeige 1 +table 1 +freund 1 +trifft 1 +▁Drittel 1 +▁Ozean 1 +Vi 1 +▁Einschränkung 1 +▁Kroatien 1 +schieben 1 +▁Eingang 1 +▁blieb 1 +förder 1 +▁beendet 1 +▁Großteil 1 +mail 1 +▁sexuelle 1 +konzept 1 +▁jenen 1 +68 1 +▁Existenz 1 +▁Gepäck 1 +▁Einbeziehung 1 +▁verstärken 1 +zunehmen 1 +▁van 1 +▁spezifischen 1 +▁Konvent 1 +▁Tru 1 +zusammenarbeiten 1 +▁Sammlung 1 +▁Entlastung 1 +▁Armee 1 +▁Unterhaltung 1 +läuft 1 +▁geäußert 1 +▁zugrunde 1 +▁Sex 1 +▁Außenpolitik 1 +▁ansehen 1 +▁Bur 1 +▁Darum 1 +▁Konzern 1 +▁unterscheiden 1 +▁Mach 1 +55 1 +▁qualitativ 1 +fertig 1 +▁Tauch 1 +tüm 1 +zusehen 1 +▁schlägt 1 +▁Obama 1 +▁Augenblick 1 +spräsident 1 +▁Bereitstellung 1 +▁Erlebnis 1 +dar 1 +▁kontinuierlich 1 +▁generell 1 +▁gültig 1 +institut 1 +▁schlagen 1 +fahr 1 +personal 1 +▁Plat 1 +lot 1 +▁Weiß 1 +▁Pra 1 +44 1 +▁Kampagne 1 +▁Brücke 1 +put 1 +▁Bush 1 +▁Bahn 1 +▁schrecklich 1 +▁Gleichstellung 1 +▁dargestellt 1 +à 1 +▁1990 1 +▁Power 1 +▁ausgezeichneten 1 +▁alternative 1 +Euro 1 +HO 1 +hilf 1 +steig 1 +▁Beach 1 +▁Geburt 1 +▁beigetragen 1 +▁Va 1 +▁Kreuz 1 +waffen 1 +▁beantworten 1 +▁Öko 1 +▁Dich 1 +▁TED 1 +schätze 1 +bedingt 1 +▁Balkan 1 +▁Medikamente 1 +▁Wild 1 +▁multi 1 +▁Kanada 1 +Vor 1 +Ja 1 +▁Erfüllung 1 +▁sitzen 1 +▁Bord 1 +strategie 1 +▁Maus 1 +bla 1 +▁Reduzierung 1 +▁Bühne 1 +▁Zusätzlich 1 +check 1 +▁Nachbarschaft 1 +▁Theorie 1 +▁sozialer 1 +▁Weltkrieg 1 +bio 1 +▁Ausgangspunkt 1 +▁Kopenhagen 1 +▁Widerspruch 1 +▁Gewährleistung 1 +wandel 1 +ografische 1 +▁Phänomen 1 +▁Casino 1 +▁zukünftige 1 +▁Ruf 1 +▁mächtig 1 +▁Wett 1 +▁Ersatz 1 +▁realistisch 1 +CD 1 +mul 1 +▁geltenden 1 +▁verbindlich 1 +▁Islam 1 +▁arabische 1 +▁behaupten 1 +▁nachdenken 1 +▁Bildschirm 1 +▁normalerweise 1 +Länder 1 +sache 1 +turm 1 +¤ 1 +▁verteidigen 1 +▁1995 1 +Was 1 +▁Verlauf 1 +flüge 1 +mensch 1 +▁relevant 1 +losigkeit 1 +▁Hochschul 1 +▁Summe 1 +▁Staates 1 +heil 1 +▁Provinz 1 +▁systematisch 1 +ji 1 +▁Kenn 1 +▁Insbesondere 1 +▁Schengen 1 +▁Gute 1 +▁russischen 1 +▁Können 1 +▁dramatisch 1 +büro 1 +▁Wand 1 +▁berühmte 1 +▁Wechsel 1 +▁potenziell 1 +▁global 1 +▁page 1 +▁Charta 1 +▁Übrigen 1 +▁leichter 1 +▁genügend 1 +▁Besonders 1 +▁ordnungsgemäß 1 +▁schönsten 1 +▁that 1 +▁Autobahn 1 +▁Katastrophe 1 +kampf 1 +▁chinesische 1 +▁traf 1 +▁ergänzen 1 +▁Ungarn 1 +▁gespielt 1 +▁Lä 1 +▁lieber 1 +▁Glaubwürdigkeit 1 +▁übernimmt 1 +▁Kap 1 +IF 1 +▁Free 1 +▁Badezimmer 1 +▁eingegangen 1 +▁geboten 1 +▁genetisch 1 +leiter 1 +▁Schalt 1 +▁beeinflussen 1 +cur 1 +▁my 1 +beziehungen 1 +▁45 1 +geschickt 1 +▁comp 1 +▁entscheidender 1 +▁bloß 1 +▁organisieren 1 +▁vermitteln 1 +▁äußern 1 +▁hoffentlich 1 +▁Marktes 1 +design 1 +▁Laut 1 +▁Ärzte 1 +▁betreiben 1 +heiß 1 +graben 1 +▁rechtlichen 1 +▁beeindruckend 1 +▁präzise 1 +▁angewandt 1 +media 1 +▁Finanzkrise 1 +▁Klar 1 +lieferung 1 +block 1 +▁Hostels 1 +eisen 1 +gängig 1 +läufig 1 +▁Verteilung 1 +▁Anlass 1 +▁Steuerung 1 +▁Öffnung 1 +▁Pension 1 +▁gewiss 1 +▁eingebracht 1 +▁2011 1 +trauen 1 +▁Netze 1 +▁Treib 1 +▁Darstellung 1 +▁Schwimm 1 +▁Tabelle 1 +▁Schlacht 1 +86 1 +▁Abhängigkeit 1 +▁München 1 +ón 1 +▁Gegenstand 1 +▁ersetzen 1 +größe 1 +▁Frankfurt 1 +▁Subsidiarität 1 +▁hell 1 +▁Bemerkung 1 +NA 1 +▁bislang 1 +prüfung 1 +13 1 +▁froh 1 +▁vorlegen 1 +▁mittleren 1 +▁Leitung 1 +▁installieren 1 +▁Schloss 1 +▁vorherige 1 +name 1 +▁Eurozone 1 +▁Stufe 1 +▁Betrag 1 +▁Beschränkung 1 +▁selben 1 +▁Fla 1 +pool 1 +▁überprüft 1 +▁rechtliche 1 +▁Flüge 1 +Distribution 1 +▁verbindet 1 +▁ethnische 1 +erklärung 1 +▁Versammlung 1 +▁gehe 1 +ausschuß 1 +▁Haben 1 +graph 1 +▁Pflege 1 +oma 1 +▁Kra 1 +klasse 1 +▁Rechnungshof 1 +▁gebeten 1 +▁Komponenten 1 +▁IP 1 +▁Vorhaben 1 +▁Satelliten 1 +▁sammeln 1 +möglich 1 +lässlich 1 +» 1 +For 1 +▁einheitlichen 1 +arbeiter 1 +abhängig 1 +▁deswegen 1 +Ä 1 +▁Faktor 1 +д 1 +▁Wörter 1 +▁Bearbeitung 1 +88 1 +▁ansprechen 1 +▁konfrontiert 1 +▁Wälder 1 +▁Trotzdem 1 +▁ergibt 1 +▁Oper 1 +▁Schlaf 1 +▁Migration 1 +regen 1 +elf 1 +▁dankbar 1 +▁allzu 1 +▁Befugnisse 1 +▁ehemalige 1 +▁serviert 1 +wähl 1 +▁Van 1 +▁berichtet 1 +geist 1 +▁Seele 1 +▁ländliche 1 +ible 1 +zentren 1 +43 1 +▁Import 1 +viertel 1 +# 1 +▁kümmern 1 +▁Tabak 1 +▁Pool 1 +offen 1 +▁Kopie 1 +▁Übertragung 1 +rechnet 1 +▁Wahrscheinlich 1 +▁vorrangig 1 +einkommen 1 +bund 1 +▁Investitions 1 +europäischen 1 +ruhig 1 +▁momentan 1 +▁Belastung 1 +▁versichern 1 +Par 1 +Zu 1 +samt 1 +▁erreichbar 1 +verhältnis 1 +SI 1 +▁Dusche 1 +▁Sto 1 +DI 1 +▁Registrierung 1 +▁Wiederaufbau 1 +grenze 1 +char 1 +▁reagiert 1 +4-0 1 +▁aktuell 1 +▁Av 1 +▁Luxus 1 +▁Regierungschefs 1 +geworfen 1 +▁Photo 1 +▁überwinden 1 +ava 1 +▁aufbauen 1 +▁Ägypten 1 +versicherung 1 +speicher 1 +▁Wetter 1 +prüf 1 +anta 1 +▁könnt 1 +▁Kollegin 1 +▁mobile 1 +▁Quellen 1 +▁aussprechen 1 +geschlagen 1 +ektor 1 +▁besorgt 1 +▁nett 1 +▁betrieben 1 +▁gewöhnlich 1 +▁hilfreich 1 +▁Fußball 1 +▁Sekunden 1 +ated 1 +▁Fremd 1 +▁EZB 1 +▁AKP 1 +▁this 1 +▁zukünftigen 1 +▁Bereitschaft 1 +▁fantastisch 1 +leib 1 +▁Produktivität 1 +▁Ana 1 +▁Ambiente 1 +▁stehenden 1 +sstrategie 1 +▁Brand 1 +▁nunmehr 1 +▁Anmerkung 1 +▁Nah 1 +▁einzusetzen 1 +opp 1 +gegriffen 1 +▁Hindernisse 1 +▁Peter 1 +wettbewerbsfähig 1 +▁bestimmter 1 +▁Überlegungen 1 +▁verboten 1 +▁müsste 1 +▁Russ 1 +▁buchen 1 +▁Block 1 +▁effizienter 1 +landschaft 1 +col 1 +▁hol 1 +▁österreichische 1 +▁Prag 1 +▁Spitzen 1 +▁bedroht 1 +▁Durchschnitt 1 +45 1 +▁strategischen 1 +▁Überleben 1 +▁medi 1 +▁Kriminalität 1 +▁erschien 1 +▁Balkon 1 +23 1 +č 1 +▁stammt 1 +▁lernt 1 +▁steigende 1 +gesehen 1 +view 1 +▁erwähnen 1 +▁Textil 1 +kapazität 1 +▁Ansprüche 1 +▁Erwägung 1 +▁radikal 1 +▁fördert 1 +▁Poker 1 +stufe 1 +▁Arzneimittel 1 +▁Tonnen 1 +▁Nachhaltigkeit 1 +▁einzigartig 1 +▁fehlende 1 +binden 1 +▁retten 1 +▁Nehmen 1 +▁total 1 +▁Katastrophen 1 +pra 1 +quer 1 +lagerung 1 +▁nachdrücklich 1 +▁Reservierung 1 +▁Wunder 1 +shop 1 +▁eingehalten 1 +schreibung 1 +gearbeitet 1 +▁bemerkt 1 +▁solide 1 +▁großem 1 +▁Mexiko 1 +familie 1 +▁Mel 1 +▁aktivieren 1 +▁Sound 1 +▁Festival 1 +Ha 1 +ielle 1 +urlaub 1 +▁stammen 1 +▁Spitze 1 +▁Gottes 1 +▁aufgebaut 1 +▁Premierminister 1 +klick 1 +Mitglied 1 +IG 1 +▁geraten 1 +▁EADS 1 +▁Pack 1 +47 1 +▁Ball 1 +▁Ungleichheit 1 +▁verletzt 1 +▁Meister 1 +▁weist 1 +▁Mitgliedschaft 1 +▁Ablehnung 1 +▁intelligente 1 +▁Anwender 1 +▁Burg 1 +▁empfangen 1 +gehoben 1 +greift 1 +schlüsse 1 +rack 1 +▁Bestimmung 1 +▁müssten 1 +▁inklusive 1 +▁heißen 1 +▁Vari 1 +▁gekennzeichnet 1 +▁Wesentlichen 1 +▁erweitern 1 +qual 1 +67 1 +66 1 +▁Pferd 1 +22 1 +▁Feind 1 +▁Vorlage 1 +geschnitten 1 +п 1 +▁Miet 1 +▁anbelangt 1 +▁rechtzeitig 1 +▁still 1 +▁Stiftung 1 +▁Verpackung 1 +▁Dreh 1 +UNG 1 +▁anschließen 1 +▁Konto 1 +▁engagiert 1 +▁gewaltige 1 +▁Finger 1 +▁Schwer 1 +boot 1 +▁einbezogen 1 +▁Viel 1 +▁Budget 1 +▁Profil 1 +▁wonach 1 +nütz 1 +▁Vermögen 1 +▁heutzutage 1 +▁anfangen 1 +▁Ankunft 1 +▁Fahrt 1 +90 1 +▁beabsichtigt 1 +▁Ausschüsse 1 +▁Rückkehr 1 +▁Förder 1 +gefühl 1 +▁selber 1 +▁Schuh 1 +▁Station 1 +▁Leit 1 +Enterprise 1 +▁großzügig 1 +methode 1 +▁angelegt 1 +▁verringert 1 +▁WLAN 1 +dorf 1 +▁Investoren 1 +▁virtuelle 1 +▁Parameter 1 +▁Passwort 1 +▁Beide 1 +ographische 1 +▁Manche 1 +▁Bern 1 +▁baut 1 +▁Bay 1 +schütz 1 +schreck 1 +▁herzustellen 1 +▁Fax 1 +– 1 +wuchs 1 +▁aufgeführt 1 +▁passende 1 +agentur 1 +Daten 1 +motor 1 +▁Konsultation 1 +hersteller 1 +▁unzureichend 1 +▁fiel 1 +▁Trag 1 +▁Persönlichkeit 1 +▁vorgestellt 1 +ppel 1 +▁erfreut 1 +▁Entfernung 1 +▁Börse 1 +▁Luxemburg 1 +▁Verzögerung 1 +▁Diplom 1 +▁Gerade 1 +▁Million 1 +▁Alltag 1 +▁Wochenende 1 +brenn 1 +▁mache 1 +▁Group 1 +▁Ya 1 +▁gezielt 1 +AU 1 +weiß 1 +▁mündliche 1 +▁Strände 1 +beruf 1 +▁mitteilen 1 +beschreibung 1 +▁Sozialdemokrat 1 +▁angewendet 1 +▁abstimmen 1 +▁beenden 1 +▁Unterricht 1 +▁italienische 1 +gewicht 1 +▁Beschwerde 1 +▁behauptet 1 +▁Minute 1 +Bericht 1 +▁Allianz 1 +▁Arzt 1 +▁vertrauen 1 +messe 1 +▁anhand 1 +▁vorliegende 1 +kräftig 1 +▁Support 1 +▁Belgien 1 +▁richtet 1 +rechnung 1 +5% 1 +▁formuliert 1 +▁Wall 1 +▁Resultat 1 +ivilgesellschaft 1 +schuss 1 +AV 1 +▁Freitag 1 +▁Ingenieur 1 +▁gründlich 1 +gehört 1 +▁Anders 1 +▁davor 1 +artikel 1 +▁England 1 +othek 1 +▁derzeitige 1 +▁Außenminister 1 +▁vermutlich 1 +▁Müll 1 +▁Ausflüge 1 +▁überrascht 1 +▁Schmerz 1 +▁nennt 1 +▁geliefert 1 +▁befasst 1 +▁Schon 1 +▁eingeleitet 1 +▁empfohlen 1 +▁Dir 1 +planung 1 +LO 1 +▁Donnerstag 1 +▁Entdeckung 1 +▁antworten 1 +▁Fang 1 +21 1 +▁errichtet 1 +▁Hunger 1 +Über 1 +bedarf 1 +▁Impuls 1 +▁erstmals 1 +▁Plätze 1 +▁Geschenk 1 +▁Erstellung 1 +▁Schweizer 1 +▁Abschaffung 1 +▁Tarif 1 +zieh 1 +reit 1 +afrika 1 +▁Motiv 1 +2000 1 +▁legal 1 +Control 1 +▁Leiter 1 +▁Back 1 +▁zurückzuführen 1 +pflege 1 +▁Anschluss 1 +▁bewältigen 1 +▁jetzigen 1 +▁unterstreichen 1 +▁Schnell 1 +▁gefallen 1 +dokument 1 +▁Alkohol 1 +▁physisch 1 +dienstleistungen 1 +▁Schicksal 1 +▁Wärme 1 +▁vertraut 1 +bezogene 1 +▁Normal 1 +▁Sauna 1 +faktor 1 +▁Erzeuger 1 +▁vorzulegen 1 +▁überlassen 1 +Energieeffizienz 1 +Produkt 1 +▁abschließend 1 +glichkeit 1 +ova 1 +sstaatlichkeit 1 +▁Hardware 1 +▁japanische 1 +▁Vorausschau 1 +▁Acht 1 +▁ökonomische 1 +▁mittlere 1 +Com 1 +ergebnisse 1 +▁kombiniert 1 +▁Archiv 1 +▁Email 1 +▁Richter 1 +▁beruhen 1 +Seite 1 +sprozesses 1 +gäste 1 +getriebe 1 +▁Schaf 1 +▁Richtig 1 +▁Barroso 1 +▁hervorgehoben 1 +ponent 1 +brach 1 +▁Präsentation 1 +▁geregelt 1 +DR 1 +▁Hohe 1 +▁dasselbe 1 +PE 1 +▁fliegen 1 +▁Erwerb 1 +▁eingeschränkt 1 +▁legitim 1 +▁Katalog 1 +▁behoben 1 +▁Syrien 1 +▁bisherigen 1 +vision 1 +▁Immer 1 +staatliche 1 +load 1 +▁Freizügigkeit 1 +▁separat 1 +▁Festplatte 1 +Service 1 +minute 1 +▁Länge 1 +sendung 1 +▁digital 1 +ici 1 +▁kalt 1 +dringlich 1 +deutsch 1 +ausgaben 1 +EU 1 +▁Lateinamerika 1 +ifizieren 1 +holz 1 +count 1 +▁verwende 1 +▁Lohn 1 +▁technisch 1 +verständnis 1 +▁draußen 1 +▁polnische 1 +▁senken 1 +▁verbracht 1 +▁definieren 1 +Mark 1 +▁anwenden 1 +▁Prüf 1 +41 1 +▁Know 1 +▁Phil 1 +▁Lobby 1 +▁Vereinfachung 1 +▁begleitet 1 +▁Serbien 1 +▁Reinigung 1 +▁Gegner 1 +▁ausgezeichnet 1 +▁Nu 1 +▁erfordern 1 +spiegel 1 +▁beeinflusst 1 +▁Hamburg 1 +krebs 1 +▁erhoben 1 +▁gelingt 1 +source 1 +▁Ideal 1 +automat 1 +▁hohem 1 +▁Vizepräsident 1 +▁Putin 1 +gestaltung 1 +▁Ratifizierung 1 +anzeige 1 +▁Forscher 1 +▁Konsum 1 +▁Vortrag 1 +▁gestärkt 1 +▁Transaktion 1 +72 1 +regierung 1 +▁Madrid 1 +▁erschaffen 1 +▁schätzen 1 +▁Verbrauch 1 +▁Beteiligten 1 +▁angebracht 1 +56 1 +▁hierbei 1 +▁Hof 1 +▁Extrem 1 +▁Kohäsion 1 +▁erteilt 1 +▁Mauer 1 +▁Zone 1 +▁einzuführen 1 +▁bemerkenswert 1 +▁Versand 1 +▁Umsatz 1 +Staaten 1 +steht 1 +▁Baum 1 +▁registriert 1 +▁gelesen 1 +▁Volkes 1 +bewußt 1 +▁Finnland 1 +schliess 1 +▁Oh 1 +▁vereint 1 +▁Miß 1 +2001 1 +behandlung 1 +SCH 1 +▁Show 1 +▁geräumig 1 +▁Mängel 1 +▁PHP 1 +gemäß 1 +SV 1 +▁solch 1 +Vertrag 1 +charakter 1 +▁festzulegen 1 +ländische 1 +▁Erhaltung 1 +▁Protest 1 +▁Geh 1 +▁gestattet 1 +erstattung 1 +▁wünsche 1 +rüstung 1 +▁bedanken 1 +▁Card 1 +EX 1 +FA 1 +katastrophe 1 +▁Palästinenser 1 +▁kennt 1 +▁festzustellen 1 +heilig 1 +light 1 +▁Apartment 1 +▁teilt 1 +vorschriften 1 +gelegen 1 +▁Il 1 +▁Herbst 1 +▁gebraucht 1 +▁angeblich 1 +▁Verfasser 1 +TER 1 +▁Santa 1 +▁Behinderung 1 +ifizierung 1 +▁Tom 1 +front 1 +▁Michael 1 +▁unentgeltlich 1 +▁beschränken 1 +▁Rauch 1 +▁speichern 1 +abilität 1 +▁Cast 1 +sieg 1 +card 1 +▁Bevor 1 +flex 1 +▁Einwanderer 1 +:// 1 +OP 1 +▁inmitten 1 +▁Lied 1 +78 1 +▁ermutigen 1 +▁Volksgesundheit 1 +züglich 1 +▁ISO 1 +küste 1 +▁Ausrüstung 1 +▁Feier 1 +Version 1 +▁nachzudenken 1 +▁Seminar 1 +▁David 1 +46 1 +▁Dynamik 1 +▁Beseitigung 1 +▁präsentieren 1 +förderung 1 +wässer 1 +ía 1 +▁dauern 1 +▁bewährt 1 +▁gewähren 1 +▁verstehe 1 +Mitgliedstaaten 1 +▁Arbeitgeber 1 +▁Mechanismen 1 +▁erinnere 1 +▁angekündigt 1 +termin 1 +▁Schulung 1 +▁Sobald 1 +schwäche 1 +umpf 1 +ifikation 1 +▁nördlich 1 +▁Formulierung 1 +▁nehme 1 +▁Nachteil 1 +▁Unterkünfte 1 +imp 1 +▁Filter 1 +Sie 1 +▁Befehl 1 +kühl 1 +▁jüngste 1 +у 1 +▁Modernisierung 1 +runde 1 +▁schaut 1 +▁Südafrika 1 +▁Panorama 1 +▁geschätzt 1 +▁Soldaten 1 +stitution 1 +▁elektrische 1 +▁Fertigung 1 +box 1 +▁gründet 1 +▁Belarus 1 +▁Wählen 1 +\ 1 +▁bezeichnen 1 +anspruch 1 +▁erarbeitet 1 +▁herunterladen 1 +▁Fahrrad 1 +boden 1 +▁Bekannt 1 +schlaf 1 +▁Maria 1 +▁stattfindet 1 +▁Vorgehensweise 1 +▁nu 1 +▁begründet 1 +ippen 1 +HA 1 +▁wohnen 1 +RS 1 +▁Media 1 +book 1 +schirm 1 +verlust 1 +35 1 +▁unterliegen 1 +▁Mond 1 +finanzierung 1 +▁Australien 1 +▁Zerstörung 1 +▁gelangt 1 +länge 1 +▁Pilot 1 +▁Willkommen 1 +▁Weltwirtschaft 1 +▁Unsicherheit 1 +▁hierfür 1 +▁koordiniert 1 +▁entfernen 1 +▁Nichtraucher 1 +lässt 1 +▁grundlegend 1 +▁Verzeichnis 1 +▁Konfiguration 1 +▁versteht 1 +haupt 1 +▁bereitet 1 +▁Voraus 1 +â 1 +initiative 1 +▁vergleichbar 1 +▁nord 1 +▁Dol 1 +Server 1 +▁Global 1 +▁Schnee 1 +geschwindigkeit 1 +▁Hügel 1 +2010 1 +strom 1 +▁aktualisiert 1 +▁begeistert 1 +▁aufzubauen 1 +▁Opti 1 +▁Game 1 +Software 1 +gefügt 1 +▁Sonntag 1 +zulegen 1 +▁Resort 1 +▁Höchst 1 +▁Heizung 1 +▁Zauber 1 +ographie 1 +▁läßt 1 +operation 1 +▁Begleit 1 +▁Käufer 1 +Kohäsionspolitik 1 +▁Somit 1 +▁modified 1 +▁Profit 1 +▁übrig 1 +▁Ausbau 1 +▁Nation 1 +▁Vorrang 1 +▁unnötig 1 +▁Passagier 1 +▁anzuwenden 1 +51 1 +terra 1 +▁sichergestellt 1 +▁enthalt 1 +zuführen 1 +83 1 +schön 1 +übergreifende 1 +▁Entwickler 1 +▁öffnet 1 +▁steigern 1 +▁anzunehmen 1 +71 1 +flüssig 1 +▁Fremdenverkehr 1 +82 1 +▁Flor 1 +▁bewerten 1 +76 1 +▁Freihandel 1 +motiv 1 +79 1 +▁Straßburg 1 +▁Rechner 1 +74 1 +▁Zeile 1 +▁laufenden 1 +▁Währungsunion 1 +▁Gewerkschaft 1 +verarbeitung 1 +spricht 1 +stärke 1 +Wirtschaftskrise 1 +▁Emissions 1 +500 1 +back 1 +▁linken 1 +▁Berechnung 1 +▁Demokraten 1 +▁Karriere 1 +▁Abendessen 1 +schrieb 1 +▁Metro 1 +Strahl 1 +wachstum 1 +▁Konzentration 1 +II 1 +technische 1 +▁gesammelt 1 +▁Sat 1 +atik 1 +▁Poly 1 +trans 1 +87 1 +▁wechseln 1 +59 1 +▁Reserve 1 +garten 1 +phrase 1 +NO 1 +kamera 1 +essel 1 +▁raus 1 +▁Händler 1 +« 1 +▁passt 1 +Ex 1 +restaurant 1 +▁anspruchsvolle 1 +▁personenbezogen 1 +▁örtliche 1 +▁Betreiber 1 +wel 1 +fordert 1 +ständigkeit 1 +▁Alpen 1 +liberal 1 +73 1 +▁Washington 1 +▁veröffentlichen 1 +▁Senkung 1 +fenster 1 +▁Kuba 1 +▁vermittelt 1 +▁USB 1 +▁hingegen 1 +▁Koch 1 +▁http 1 +▁diplomatische 1 +▁Möbel 1 +▁250 1 +▁Gefangene 1 +▁russische 1 +▁Tau 1 +▁mehrfach 1 +▁Dokumentation 1 +▁Professor 1 +▁Beachtung 1 +▁mangelnde 1 +▁Meilen 1 +kunst 1 +zutreten 1 +litz 1 +▁Petition 1 +▁Gibt 1 +wünsch 1 +Auf 1 +▁have 1 +▁Datum 1 +▁herauszufinden 1 +▁Truppen 1 +vertreter 1 +54 1 +▁vereinbar 1 +▁Einfach 1 +77 1 +▁Todesstrafe 1 +▁ergänzt 1 +▁Strasse 1 +▁Fakten 1 +▁Stoff 1 +tauchen 1 +▁gehabt 1 +▁IWF 1 +▁Beurteilung 1 +▁Bestell 1 +▁Andererseits 1 +▁Human 1 +▁Ausarbeitung 1 +nehmbar 1 +Stunden 1 +Finde 1 +histori 1 +▁HIV 1 +▁befürchte 1 +▁passen 1 +▁1994 1 +bewusst 1 +Bomb 1 +▁finanzieren 1 +▁irgendwelche 1 +▁mittlerweile 1 +gebrochen 1 +▁Rettung 1 +▁armen 1 +▁schien 1 +▁Äußerung 1 +kredit 1 +serie 1 +▁beweisen 1 +ú 1 +▁Souveränität 1 +▁Schlusselwort 1 +rechtliche 1 +▁Säule 1 +▁geheim 1 +führ 1 +▁Lesen 1 +software 1 +▁gleichermaßen 1 +▁Tanz 1 +▁erheben 1 +▁Ereignis 1 +58 1 +▁beseitigen 1 +▁Aufsicht 1 +▁Betrug 1 +▁freut 1 +▁Auseinandersetz 1 +▁Übernahme 1 +▁schädlich 1 +▁teuer 1 +▁geschafft 1 +▁Street 1 +▁lebendig 1 +▁Entspannung 1 +▁Newsletter 1 +anforderungen 1 +▁Steigerung 1 +▁Saison 1 +▁strikt 1 +dämm 1 +▁Java 1 +zip 1 +höhe 1 +▁Verwirklichung 1 +zweig 1 +▁Revision 1 +heirat 1 +▁portugiesische 1 +▁Etwa 1 +▁bevorzugt 1 +▁schrittweise 1 +▁berechnet 1 +▁Modern 1 +▁erwiesen 1 +▁Nachmittag 1 +▁Bäume 1 +▁Nov 1 +Spiel 1 +▁gemein 1 +schränke 1 +▁Leidenschaft 1 +▁Null 1 +▁Ausgleich 1 +▁fürchte 1 +strecken 1 +Work 1 +▁objektiv 1 +gefertigt 1 +▁diverse 1 +logie 1 +▁Auflösung 1 +▁grammatisch 1 +inisterpräsident 1 +▁Gehminuten 1 +▁Referenz 1 +▁gewidmet 1 +▁Manchmal 1 +▁überwachen 1 +▁realer 1 +▁Empfang 1 +▁Parkplatz 1 +▁basierend 1 +▁erkennt 1 +max 1 +zeile 1 +▁Kreativität 1 +▁angefangen 1 +▁versteckt 1 +down 1 +▁Finanzielle 1 +raff 1 +▁demokratisch 1 +vil 1 +▁denjenigen 1 +▁kontaktieren 1 +gebäude 1 +zauber 1 +▁Jean 1 +▁Referendum 1 +▁erworben 1 +▁ausüben 1 +▁Anmeldung 1 +▁extra 1 +kannt 1 +▁Klang 1 +▁soeben 1 +▁Allgemein 1 +▁Überblick 1 +▁Genf 1 +▁Spektrum 1 +ING 1 +▁Spiegel 1 +▁Osteuropa 1 +▁plus 1 +▁Minderheit 1 +▁Parkplätze 1 +Rechtsvorschrift 1 +▁herstellen 1 +verhältnisse 1 +Schnittstelle 1 +gast 1 +• 1 +▁einstimmig 1 +▁luxuriöse 1 +vermögen 1 +▁Okay 1 +▁Kennzeichnung 1 +▁Umweltfragen 1 +▁indische 1 +▁verursachen 1 +▁Paar 1 +Prozess 1 +▁festlegen 1 +я 1 +▁faszinierend 1 +▁seltsam 1 +▁Luftverkehr 1 +▁vous 1 +gesundheit 1 +▁getötet 1 +▁fassen 1 +▁Wartung 1 +▁vergleichen 1 +▁Robert 1 +▁bedauerlich 1 +▁langjährige 1 +▁Zeitplan 1 +▁künstlich 1 +städte 1 +▁jedenfalls 1 +fotograf 1 +▁beinhalten 1 +komplex 1 +▁aktiviert 1 +▁Lieblings 1 +▁Pub 1 +▁Logik 1 +▁Errichtung 1 +versammlung 1 +präg 1 +▁nachhaltig 1 +Gesundheitswesen 1 +▁Wahrnehmung 1 +▁Wirksamkeit 1 +▁investiert 1 +▁Massage 1 +„ 1 +platte 1 +69 1 +▁Ausrichtung 1 +▁Oliven 1 +▁Bewohner 1 +▁niederländische 1 +▁ungarische 1 +▁starb 1 +▁Schlussel 1 +▁Zivilisation 1 +▁Philosophie 1 +▁Chef 1 +▁Ecke 1 +▁600 1 +▁besagt 1 +▁Konstruktion 1 +▁Szene 1 +▁leistet 1 +▁berichten 1 +▁Arbeitskräfte 1 +▁Qui 1 +▁sparen 1 +▁abgegeben 1 +▁Betreuung 1 +▁Tendenz 1 +güter 1 +muster 1 +▁übermittelt 1 +▁älteste 1 +▁Schwäche 1 +▁Betriebssystem 1 +▁beobachtet 1 +▁beantwortet 1 +▁Lücke 1 +▁Acc 1 +▁beschreiben 1 +▁Ratschlag 1 +▁Ergänzung 1 +▁islamische 1 +▁Geheimnis 1 +▁Steuerzahler 1 +▁Erkenntnisse 1 +▁vorsichtig 1 +▁Versprechen 1 +Sicherheitsrat 1 +▁körperlich 1 +▁Umstände 1 +Entschlossenheit 1 +▁beinahe 1 +▁Mitgefühl 1 +taucht 1 +▁geltend 1 +wichtig 1 +▁endet 1 +nbetracht 1 +▁Flash 1 +▁Mitentscheidung 1 +84 1 +▁entstand 1 +Gruppe 1 +händler 1 +▁Abteilung 1 +▁Rock 1 +▁Jack 1 +Und 1 +▁verschiedenste 1 +▁eignet 1 +▁einzelstaatlich 1 +▁Island 1 +▁nein 1 +LAN 1 +▁DIE 1 +▁bedeutsam 1 +analyse 1 +▁müßte 1 +▁dunkle 1 +▁oftmals 1 +stellbar 1 +▁Mechanismus 1 +▁Substanz 1 +▁Psycho 1 +TEN 1 +▁wünscht 1 +fertigung 1 +musik 1 +▁Niemand 1 +▁startet 1 +▁bewahren 1 +▁fuer 1 +▁Benutzung 1 +▁Flüchtlings 1 +▁Tschechische 1 +▁anzubieten 1 +▁geblieben 1 +▁Bilanz 1 +▁Johann 1 +fekt 1 +opfer 1 +▁Internetseite 1 +▁Ausweitung 1 +werbung 1 +▁Konvention 1 +▁dargelegt 1 +53 1 +▁super 1 +▁begegnen 1 +bücher 1 +▁Luftfahrt 1 +▁PPE 1 +GO 1 +▁Rückgang 1 +▁Saal 1 +▁derselben 1 +▁Mehrwertsteuer 1 +▁steckt 1 +EIN 1 +verteilung 1 +▁Bezeichnung 1 +▁German 1 +▁Logo 1 +▁vorzunehmen 1 +▁Bestätigung 1 +▁Tragödie 1 +▁ungewöhnlich 1 +▁use 1 +▁Durchsetzung 1 +▁Architekt 1 +▁Visa 1 +ION 1 +▁House 1 +konsum 1 +mitte 1 +▁oberste 1 +▁Zulassung 1 +▁gesichert 1 +▁Tasche 1 +währung 1 +ffel 1 +Up 1 +▁Aktivität 1 +▁Dänemark 1 +▁Transfer 1 +nack 1 +▁mutig 1 +63 1 +▁GAP 1 +▁Anhörung 1 +Benutzer 1 +▁spanische 1 +▁anerkennen 1 +erzeugnisse 1 +▁steigt 1 +bevölkerung 1 +▁PDF 1 +nutzung 1 +▁könne 1 +institutionelle 1 +▁Präsenz 1 +▁Futter 1 +▁Frühjahr 1 +▁Hör 1 +î 1 +▁planen 1 +schärfe 1 +▁Log 1 +▁George 1 +▁Route 1 +▁Vogel 1 +▁irgendwo 1 +▁Terroristen 1 +verkauf 1 +transfer 1 +leiste 1 +▁Beschluß 1 +▁zeitlich 1 +▁Flughäfen 1 +▁Interview 1 +pend 1 +28 1 +▁Qual 1 +▁Aufzug 1 +▁sensible 1 +▁Besondere 1 +▁künstlerische 1 +29 1 +▁Nutz 1 +terrasse 1 +bekämpfung 1 +▁schließt 1 +▁Volkspartei 1 +Umstrukturierung 1 +▁lenken 1 +▁süd 1 +▁stattgefunden 1 +▁Konkurrenz 1 +ressourcen 1 +suite 1 +▁Gewässer 1 +▁exakt 1 +▁erfasst 1 +▁Tempo 1 +▁fortgesetzt 1 +▁anschauen 1 +57 1 +▁Zwar 1 +▁Listings 1 +▁Genießen 1 +81 1 +▁Fett 1 +▁pour 1 +▁logisch 1 +▁Französisch 1 +dimension 1 +▁Café 1 +▁Segel 1 +▁Eröffnung 1 +▁entdeckst 1 +▁Krankenhaus 1 +▁hinzufugen 1 +▁Dörfer 1 +▁multilaterale 1 +ê 1 +▁städtische 1 +▁Vorbehalt 1 +Technologie 1 +▁spannend 1 +wettbewerb 1 +▁Ablauf 1 +▁einmalige 1 +▁Bürokratie 1 +▁Jedoch 1 +▁Danach 1 +hundert 1 +▁Differenz 1 +▁Fassung 1 +signal 1 +▁verrückt 1 +▁Ufer 1 +▁verpflichten 1 +▁anhaltende 1 +käufe 1 +..."... 1 +▁Empfänger 1 +▁Rezession 1 +▁ablehnen 1 +▁Schwester 1 +▁800 1 +masse 1 +▁teure 1 +▁stattdessen 1 +▁hinzugefügt 1 +▁Ostsee 1 +ject 1 +▁Christen 1 +▁geleitet 1 +▁realisiert 1 +▁2012 1 +▁traurig 1 +matische 1 +Source 1 +▁Kunststoff 1 +einhalb 1 +▁Prodi 1 +Richtlinie 1 +Agent 1 +mauer 1 +▁abgesehen 1 +▁gestartet 1 +▁JavaScript 1 +▁User 1 +▁umfassen 1 +Bereich 1 +▁Beobachter 1 +▁aussieht 1 +read 1 +▁anpassen 1 +ough 1 +▁Investition 1 +▁Zunahme 1 +▁Quoten 1 +kampagne 1 +verschmutzung 1 +▁ECU 1 +▁gestatten 1 +▁Missbrauch 1 +flieg 1 +anwendung 1 +▁Konjunktur 1 +▁Zuverlässigkeit 1 +▁Dringlichkeit 1 +▁Vordergrund 1 +▁Störung 1 +www 1 +▁views 1 +▁DNA 1 +▁Arbeitszeit 1 +▁Skype 1 +▁stärksten 1 +▁belgische 1 +▁Erfindung 1 +▁Mischung 1 +▁geschah 1 +▁Salz 1 +▁Beschäftigte 1 +▁interessieren 1 +▁Erreichung 1 +▁Klarheit 1 +▁erbaut 1 +ific 1 +▁Samstag 1 +KOM 1 +äuschen 1 +▁irgend 1 +▁wild 1 +▁iranische 1 +▁Key 1 +▁keineswegs 1 +▁drastisch 1 +▁gäbe 1 +▁verarbeitet 1 +zwecke 1 +▁Feststellung 1 +▁Hunderte 1 +▁Urheberrecht 1 +Schlussfolgerung 1 +▁Brau 1 +telefon 1 +revolution 1 +▁widmen 1 +▁zulässig 1 +▁Wichtigkeit 1 +▁schlicht 1 +▁Kenntnisse 1 +▁Vertretung 1 +▁genehmigt 1 +▁Verfolgung 1 +▁Unfall 1 +spalt 1 +ologen 1 +▁kompetent 1 +▁Nizza 1 +▁1980 1 +▁privat 1 +▁verabschieden 1 +▁beibehalten 1 +▁Figur 1 +▁unterbreitet 1 +▁Privatsphäre 1 +basis 1 +Dollar 1 +samkeit 1 +▁Stich 1 +▁Song 1 +▁erleichtert 1 +oberfläche 1 +▁Variante 1 +ministerium 1 +▁Gemüse 1 +▁kollektive 1 +Musik 1 +▁zustande 1 +▁Brennstoff 1 +▁bestmöglich 1 +▁Einnahmen 1 +▁Zahn 1 +▁elegant 1 +▁Schicht 1 +wirtschaftliche 1 +▁Erkrankung 1 +▁dreht 1 +▁Museen 1 +▁testen 1 +▁tragisch 1 +▁Besonderheit 1 +▁Kyoto 1 +▁nannte 1 +▁strukturelle 1 +▁Behörde 1 +besitz 1 +normen 1 +unterschied 1 +▁vereinfacht 1 +▁Offenheit 1 +▁unerlässlich 1 +avec 1 +▁Rahmenprogramm 1 +▁Welthandels 1 +▁Bruder 1 +▁Beobachtung 1 +92 1 +▁parallel 1 +▁Gaza 1 +▁Einschätzung 1 +▁Life 1 +gesteuert 1 +▁NICHT 1 +▁benachteiligt 1 +▁verankert 1 +▁Visum 1 +▁Schlussfolger 1 +▁integrieren 1 +▁Qualifikation 1 +▁bewertet 1 +▁Bereits 1 +▁Fundament 1 +▁statistisch 1 +▁Stress 1 +▁Übersicht 1 +santräge 1 +▁Evolution 1 +stöße 1 +▁sozusagen 1 +risiko 1 +▁Lieferanten 1 +▁Masse 1 +▁Palette 1 +modul 1 +▁Aktualisierung 1 +▁Begründung 1 +▁respektieren 1 +♪ 1 +▁Direktor 1 +frau 1 +▁Zurück 1 +disziplin 1 +mechanismus 1 +▁Prozeß 1 +▁Gentoo 1 +▁Album 1 +▁Fabrik 1 +Jahr 1 +lux 1 +mechanismen 1 +▁Mathematik 1 +▁gerechtfertigt 1 +▁stilvoll 1 +▁Lärm 1 +reiz 1 +glas 1 +bleiben 1 +▁exzellente 1 +bilanz 1 +oire 1 +▁Stattdessen 1 +▁verurteilen 1 +▁Fertig 1 +▁territoriale 1 +▁überraschend 1 +▁Airbus 1 +▁beschleunigen 1 +▁entworfen 1 +▁längst 1 +▁Nachdruck 1 +▁Kürze 1 +▁Slowakei 1 +▁Saint 1 +cord 1 +▁Gegenstände 1 +Video 1 +▁Blumen 1 +▁Siedlung 1 +therapie 1 +▁Flotte 1 +▁Mittelmeerraum 1 +▁drücken 1 +▁aufregend 1 +▁Aufhebung 1 +▁Bosnien 1 +▁Tennis 1 +schmerz 1 +▁Hochzeit 1 +▁Arbeitsgruppe 1 +▁Etikett 1 +▁Hostelsclub 1 +▁Kaiser 1 +▁bedienen 1 +▁Fotografie 1 +metall 1 +▁Ausbeutung 1 +▁Wiederherstell 1 +2009 1 +Frühstücksbuffet 1 +▁erstklassige 1 +▁anzupassen 1 +▁modernste 1 +▁Alternativ 1 +▁auswählen 1 +▁Kürzung 1 +klima 1 +board 1 +kriterien 1 +▁Innenstadt 1 +▁Finanzmärkte 1 +umweltfreundlich 1 +▁Kernel 1 +▁Demonstration 1 +▁eröffnen 1 +▁gegebenenfalls 1 +▁1993 1 +▁Laser 1 +▁Rassismus 1 +▁ärmsten 1 +▁emotional 1 +▁studiert 1 +saison 1 +formular 1 +Sowohl 1 +▁Beförderung 1 +▁unbekannt 1 +gestalt 1 +Abkommen 1 +▁Liberalen 1 +▁ignoriert 1 +möglichkeit 1 +▁beschreibt 1 +▁Kreatur 1 +hancengleichheit 1 +▁Galerie 1 +▁Fuss 1 +▁Treibhausgas 1 +▁umgekehrt 1 +▁verschaffen 1 +▁Wolf 1 +▁1992 1 +ibili 1 +▁Entdecke 1 +▁Mobiltelefon 1 +▁respektiert 1 +▁zwölf 1 +▁America 1 +▁Hans 1 +ador 1 +stunden 1 +irurg 1 +▁Brenn 1 +ž 1 +plikation 1 +▁Gegenwart 1 +93 1 +▁Füße 1 +dichte 1 +▁legislative 1 +▁Häfen 1 +▁Schnitt 1 +museum 1 +schätzung 1 +nachfolgend 1 +▁Halt 1 +▁inspiriert 1 +▁Erzeugung 1 +▁Reparatur 1 +▁Fortsetzung 1 +▁erörtert 1 +▁nukleare 1 +▁Prävention 1 +▁Florenz 1 +▁Mehrwert 1 +ь 1 +▁Innerhalb 1 +▁anzuzeigen 1 +▁staff 1 +▁Check 1 +▁Ferr 1 +▁Schwelle 1 +▁Applikation 1 +▁unzählige 1 +▁Sprech 1 +▁fortsetzen 1 +vereinbarung 1 +▁Verkehrsmittel 1 +stift 1 +▁Marokko 1 +▁Anwesenheit 1 +▁Fokus 1 +▁Anregung 1 +▁Komplexität 1 +▁Verhältnisse 1 +leuchten 1 +reihe 1 +papier 1 +▁Lokal 1 +▁100% 1 +▁Grünbuch 1 +▁Elite 1 +▁vergangen 1 +▁Pfad 1 +ô 1 +▁begleiten 1 +▁Wechselkurs 1 +▁Bonus 1 +▁Berater 1 +versuch 1 +wid 1 +▁Thomas 1 +▁Reichtum 1 +▁begangen 1 +aufgaben 1 +▁Physik 1 +▁zugute 1 +5.000 1 +Lösung 1 +Гј 1 +▁kommunizieren 1 +▁verwandelt 1 +▁Problematik 1 +studie 1 +▁NRO 1 +Regierung 1 +Gipfel 1 +▁tschechische 1 +▁Vereinigung 1 +▁Folgendes 1 +▁Angestellte 1 +▁wofür 1 +▁Dublin 1 +▁Abfälle 1 +▁Solche 1 +größte 1 +з 1 +▁Anhänger 1 +▁Ausgrenzung 1 +▁herausragende 1 +▁Erarbeitung 1 +Paket 1 +▁Weiterbildung 1 +regulierung 1 +profil 1 +▁Abenteuer 1 +▁Konvergenz 1 +▁flexibel 1 +▁vorsieht 1 +▁Venedig 1 +▁unterbrochen 1 +▁Echtzeit 1 +▁Behauptung 1 +hai 1 +▁verantwortungs 1 +eiße 1 +▁spüren 1 +▁problemlos 1 +▁damalige 1 +▁2013 1 +2003 1 +▁Inkrafttreten 1 +▁Magazin 1 +▁minimal 1 +▁Statut 1 +▁bekräftigt 1 +▁gekauft 1 +2008 1 +▁Nigeria 1 +gipfel 1 +▁bearbeitet 1 +entscheidung 1 +▁Therapie 1 +▁Verabschiedung 1 +▁erwerben 1 +▁Black 1 +▁Erscheinung 1 +gezeichnet 1 +geschaltet 1 +▁Insgesamt 1 +▁unterscheidet 1 +▁weibliche 1 +berichterstatter 1 +kämpfe 1 +▁Orientierung 1 +▁Gipfeltreffen 1 +Expert 1 +▁eingeräumt 1 +▁natur 1 +▁Wüste 1 +flüsse 1 +▁Virus 1 +klagt 1 +▁basieren 1 +▁etabliert 1 +▁maßgeblich 1 +emissionen 1 +messung 1 +▁Zusage 1 +▁stecken 1 +sprachige 1 +▁III 1 +nähe 1 +▁gewinnt 1 +▁fließen 1 +▁erlangen 1 +▁Korrektur 1 +▁bürgerliche 1 +▁Gewähr 1 +sequenz 1 +▁Mütter 1 +▁Geltung 1 +▁verwandeln 1 +▁ethische 1 +blatt 1 +▁Extra 1 +groß 1 +▁sofortige 1 +ergebnis 1 +94 1 +Annehmlichkeiten 1 +▁Hauptbahnhof 1 +▁kritisiert 1 +▁Talent 1 +▁Eigenschaft 1 +89 1 +▁Gedanke 1 +▁jünger 1 +▁permanent 1 +veranstaltung 1 +tempo 1 +Team 1 +Modus 1 +▁glaubwürdig 1 +▁verwirklichen 1 +▁Griff 1 +▁Ähnlich 1 +Politik 1 +▁Disziplin 1 +stürzt 1 +▁vermieden 1 +▁Höhle 1 +▁Zusammensetzung 1 +▁arbeits 1 +▁finanziell 1 +reinigung 1 +С 1 +▁Rubrik 1 +▁rechtfertigen 1 +▁vermute 1 +▁Indikator 1 +▁schwerwiegende 1 +▁reichhaltig 1 +▁Einzelheiten 1 +ichtraucherzonen 1 +1⁄4 1 +▁Scheitern 1 +▁Zuerst 1 +▁liberale 1 +▁Michel 1 +▁Verlängerung 1 +▁atemberaubend 1 +▁verbreiten 1 +▁produktiv 1 +▁Wohnzimmer 1 +Ebene 1 +teilnehmer 1 +Point 1 +▁gefährden 1 +▁Hektar 1 +missbrauch 1 +▁Lebensqualität 1 +▁füllen 1 +å 1 +▁Entschädigung 1 +▁Wahrung 1 +▁gepflegt 1 +gespräch 1 +▁kenne 1 +▁Ministerrat 1 +▁University 1 +▁reibungslos 1 +▁Batterie 1 +▁Knochen 1 +▁überwiegend 1 +lapp 1 +mütig 1 +▁Eigentümer 1 +▁ordentlich 1 +erzeugung 1 +▁Studium 1 +Generalsekretär 1 +▁Mittwoch 1 +▁Spaziergang 1 +▁Rußland 1 +▁Depression 1 +▁Weiterhin 1 +▁ignorieren 1 +▁zugestimmt 1 +▁Bananen 1 +anbieter 1 +▁Möchte 1 +▁Rasse 1 +▁Kraftstoff 1 +▁Performance 1 +▁1991 1 +▁beizutragen 1 +▁Energiequellen 1 +räder 1 +▁klug 1 +▁Unterdrückung 1 +▁gravierend 1 +▁zerstören 1 +▁erstreckt 1 +▁romantische 1 +periode 1 +Bürger 1 +▁malerische 1 +objekt 1 +́ 1 +▁Bewältigung 1 +▁gebilligt 1 +▁verliehen 1 +▁europaweit 1 +▁universell 1 +▁zeige 1 +störung 1 +▁Rezept 1 +▁Literatur 1 +▁Zürich 1 +▁appelliere 1 +▁fundamental 1 +▁zurückkehren 1 +▁gelingen 1 +▁angewiesen 1 +schuh 1 +` 1 +zuziehen 1 +effizient 1 +▁Zufriedenheit 1 +▁bemerken 1 +reinigt 1 +▁herrschen 1 +ão 1 +[ 1 +2002 1 +▁Libanon 1 +▁allmählich 1 +▁verknüpft 1 +▁Kleidung 1 +▁Mittler 1 +▁teilzunehmen 1 +▁markiert 1 +▁Geräusch 1 +▁Airport 1 +house 1 +▁zwanzig 1 +temperatur 1 +brecher 1 +▁Heimatland 1 +▁Mitgliedsländer 1 +▁Kämpfe 1 +▁Logistik 1 +▁lädt 1 +▁Gesichtspunkt 1 +benutzer 1 +▁Tibet 1 +▁spiegelt 1 +▁1989 1 +▁good 1 +Funktion 1 +▁Gedächtnis 1 +▁verwaltet 1 +▁verschwinden 1 +Dienst 1 +▁Entstehung 1 +▁beschleunigt 1 +▁Ordner 1 +▁Dampf 1 +▁unterwegs 1 +▁Gewebe 1 +schmutz 1 +▁inhaltlich 1 +▁Ermittlung 1 +▁löschen 1 +▁agieren 1 +▁Gelände 1 +Format 1 +plattform 1 +▁auswärtige 1 +▁obligatorisch 1 +▁terroristische 1 +klausel 1 +▁überarbeitet 1 +▁zielt 1 +▁Angehörige 1 +▁vorliegt 1 +▁Doppelzimmer 1 +¶ 1 +▁Stabilisierung 1 +medizin 1 +▁Spanisch 1 +▁Koordination 1 +stuhl 1 +▁dänische 1 +feuer 1 +steigerung 1 +verbindlich 1 +▁Legislativ 1 +▁Bewerber 1 +▁touristische 1 +▁Zusammenbruch 1 +sammlung 1 +▁verzichten 1 +▁GNU 1 +▁asiatische 1 +motion 1 +‘ 1 +▁Spezialitäten 1 +empfindlich 1 +▁12.00 1 +Demokratisierung 1 +▁Erdbeben 1 +▁Vergnügen 1 +▁schreibt 1 +▁löst 1 +▁Inhaber 1 +sphäre 1 +▁Act 1 +▁Übung 1 +▁Moskau 1 +▁Rechenschaft 1 +▁heftig 1 +▁berührt 1 +demokratische 1 +▁stützen 1 +▁Mühe 1 +▁Genuss 1 +▁Köln 1 +▁1,5 1 +▁Funktionalität 1 +▁Territorium 1 +▁angestrebt 1 +▁vereinfachen 1 +▁Domain 1 +▁Taxi 1 +▁benannt 1 +▁konzipiert 1 +▁Zuschauer 1 +▁scheinbar 1 +filter 1 +▁Ernst 1 +ł 1 +▁Maastricht 1 +▁Palästina 1 +status 1 +smethoden 1 +▁aufgerufen 1 +▁Straßenverkehr 1 +▁Diagnose 1 +▁Monopol 1 +▁location 1 +▁Chemie 1 +▁Royal 1 +▁Maßstab 1 +▁MySQL 1 +▁theoretisch 1 +▁entspannt 1 +▁Maxim 1 +Fotograf 1 +Institut 1 +▁brutal 1 +▁Vorredner 1 +▁winzig 1 +▁Höhepunkt 1 +▁analysieren 1 +▁kohärent 1 +▁Salzburg 1 +sozial 1 +kompetenz 1 +▁Desktop 1 +▁Getreide 1 +▁leitet 1 +▁administrative 1 +▁spektakulär 1 +▁vorübergehend 1 +▁folglich 1 +▁Register 1 +▁Medikament 1 +förmig 1 +▁erläutern 1 +▁genießt 1 +beginn 1 +szusammenarbeit 1 +▁nutzbar 1 +▁psychisch 1 +▁Universal 1 +▁Nerven 1 +▁Plastik 1 +präsidenten 1 +arquis 1 +▁trug 1 +▁Produzenten 1 +▁Ausübung 1 +▁Folter 1 +2006 1 +ы 1 +▁Betroffenen 1 +▁Zustellbett 1 +▁geholfen 1 +▁beiträgt 1 +▁Brüder 1 +▁Schätzung 1 +▁Drittstaaten 1 +defizit 1 +▁zahlt 1 +▁unverzichtbar 1 +▁Workshop 1 +▁herkömmliche 1 +▁Gross 1 +▁herausfinden 1 +▁vorbereiten 1 +▁parti 1 +▁Präsidium 1 +▁ausgedehnt 1 +▁erörtern 1 +▁Bedienung 1 +▁gehandelt 1 +▁verschieden 1 +▁Fülle 1 +▁grob 1 +▁kauft 1 +▁erläutert 1 +▁Devisen 1 +▁unterbreiten 1 +▁gewann 1 +▁Adria 1 +▁Ökosystem 1 +▁erachte 1 +▁Bakterien 1 +▁visuelle 1 +▁vorbehalten 1 +experiment 1 +▁Einladung 1 +▁empfängt 1 +▁befand 1 +▁beurteilen 1 +▁Riesen 1 +▁iPhone 1 +▁resultieren 1 +▁Verkäufer 1 +▁getestet 1 +▁denselben 1 +▁Mögliche 1 +▁schließe 1 +▁traditionell 1 +▁Gestalt 1 +▁Interpretation 1 +▁ratifiziert 1 +firmen 1 +▁scharf 1 +nbsp 1 +▁zitiere 1 +wolle 1 +gültig 1 +▁Elektrizität 1 +▁Atlantik 1 +▁droht 1 +▁Kalender 1 +betrug 1 +▁Lounge 1 +▁empfinde 1 +▁Chemikalien 1 +▁enttäuscht 1 +▁transatlantisch 1 +▁Anfänge 1 +▁verliert 1 +▁schützt 1 +▁befreien 1 +▁bezogen 1 +▁sportlich 1 +‚ 1 +г 1 +▁Ankündigung 1 +▁irgendwann 1 +▁mittelalterlich 1 +▁verhandeln 1 +▁aufrichtig 1 +▁Flasche 1 +▁Jugoslawien 1 +▁Taiwan 1 +▁Trennung 1 +▁zutiefst 1 +▁Centre 1 +▁Milliarde 1 +▁Außer 1 +▁Galaxie 1 +▁Rotary 1 +▁bedauere 1 +▁Wertpapier 1 +Artikel 1 +▁bürokratische 1 +▁Konsumenten 1 +ст 1 +senkung 1 +Administration 1 +▁Intelligenz 1 +▁beeinträchtigt 1 +▁Infektion 1 +ausstattung 1 +▁nenne 1 +▁Argentinien 1 +▁Subventionen 1 +▁Spuren 1 +▁Überraschung 1 +▁regeln 1 +▁Züge 1 +▁Pharma 1 +schöpfung 1 +▁Geburtstag 1 +▁Elektronik 1 +▁schenken 1 +▁gründen 1 +kirche 1 +besuch 1 +▁Motto 1 +▁stetig 1 +▁Vorgaben 1 +▁Diktatur 1 +▁Verstärkung 1 +▁inakzeptabel 1 +▁stoppen 1 +▁School 1 +▁insofern 1 +höfe 1 +▁verheerend 1 +▁Vögel 1 +▁sanft 1 +Design 1 +lücke 1 +▁weiss 1 +▁Rahmenbedingung 1 +  1 +▁Potential 1 +▁fügt 1 +▁Nordkorea 1 +▁Spezies 1 +▁ungeachtet 1 +▁Quadrat 1 +▁Rhein 1 +▁Sechs 1 +▁Navigation 1 +▁definitiv 1 +▁musikalische 1 +▁absurd 1 +▁Weißbuch 1 +▁entschied 1 +▁Blue 1 +▁Publikation 1 +▁erkennbar 1 +▁kostengünstig 1 +▁kommunistische 1 +▁trennen 1 +▁Libyen 1 +▁Sowjetunion 1 +▁bedauern 1 +club 1 +lateral 1 +▁jahrelang 1 +▁worauf 1 +▁sinken 1 +Temp 1 +▁Weihnachts 1 +▁Wohlbefinden 1 +▁römische 1 +▁Anweisungen 1 +flotte 1 +fleisch 1 +kreuz 1 +ansprüche 1 +▁irakische 1 +▁Charles 1 +▁einheimische 1 +video 1 +spruch 1 +▁Foundation 1 +▁Investment 1 +▁kompakt 1 +▁Meldung 1 +▁offenkundig 1 +▁interaktive 1 +▁geniessen 1 +▁bevorstehenden 1 +▁Mineral 1 +Fischereipolitik 1 +▁Alexander 1 +▁Ungleichgewicht 1 +▁schlug 1 +▁Besatzung 1 +▁Dutzend 1 +▁melden 1 +▁Warnung 1 +і 1 +▁Frequenz 1 +▁Kompromiß 1 +▁Norwegen 1 +▁Früchte 1 +▁wünschenswert 1 +▁Rindfleisch 1 +▁multinationale 1 +▁Monitor 1 +▁vorteilhaft 1 +▁Index 1 +Modell 1 +potenzial 1 +▁entscheidet 1 +▁horizontal 1 +▁Toilette 1 +sammenzuarbeiten 1 +lizenz 1 +▁informelle 1 +▁zukünftig 1 +ökonom 1 +▁verlängert 1 +▁Gärten 1 +summe 1 +▁Bedingung 1 +▁analysiert 1 +▁Vietnam 1 +leuchtet 1 +brücke 1 +town 1 +▁Nuklear 1 +▁Litauen 1 +▁fossile 1 +▁eingebaut 1 +▁problematisch 1 +▁klingt 1 +härte 1 +Plug 1 +protokoll 1 +▁Aluminium 1 +▁Mazedonien 1 +▁Slowenien 1 +▁Richard 1 +▁Ultra 1 +▁isoliert 1 +Internet 1 +▁Stabilitätspakt 1 +▁Vermarktung 1 +übertragung 1 +feindliche 1 +▁renommierte 1 +▁verschärft 1 +▁Überarbeitung 1 +▁Aufklärung 1 +▁ansonsten 1 +▁fühle 1 +▁operative 1 +▁beseitigt 1 +▁motiviert 1 +▁bescheiden 1 +▁blind 1 +▁Turnier 1 +kündigt 1 +▁Integrität 1 +▁verwalten 1 +§ 1 +▁Erdöl 1 +▁trocken 1 +▁wählt 1 +erfahrung 1 +▁Illusion 1 +▁optimiert 1 +▁AIDS 1 +▁Flagge 1 +▁jeweilige 1 +▁abzielen 1 +▁Frucht 1 +▁ernannt 1 +▁muslimische 1 +▁Governance 1 +▁Protein 1 +й 1 +▁identifizieren 1 +▁ewig 1 +konflikt 1 +▁Zeichnung 1 +▁Anleger 1 +▁Kanäle 1 +▁gesundheitliche 1 +wärme 1 +€ 1 +ografie 1 +▁Korea 1 +▁which 1 +▁Freuen 1 +▁gefolgt 1 +▁Kohlenstoff 1 +▁Swiss 1 +infrastruktur 1 +▁finnische 1 +▁Netto 1 +Gestatten 1 +▁korrigieren 1 +▁zeitgenössische 1 +▁Klinik 1 +Commerce 1 +streifen 1 +angehörige 1 +▁Köpfe 1 +▁Hotelsafe 1 +bearbeitung 1 +▁erfunden 1 +▁liebt 1 +▁Schwellenländer 1 +▁Adobe 1 +verantwortlich 1 +vorsitzende 1 +▁Indonesien 1 +▁Schokolade 1 +▁jüdische 1 +▁Ökonomie 1 +erlebnis 1 +▁abzielt 1 +▁Facebook 1 +▁Sorgfalt 1 +▁versprochen 1 +▁Optimierung 1 +szeitraum 1 +▁Schlußfolgerung 1 +▁bewaffnete 1 +▁lustig 1 +▁töten 1 +▁auszuüben 1 +wörter 1 +Bild 1 +▁Laptop 1 +▁Mallorca 1 +▁akzeptabel 1 +▁Erfordernisse 1 +· 1 +▁potentiell 1 +▁Chinesen 1 +▁Materie 1 +Engine 1 +▁Folie 1 +schöpfen 1 +▁Budapest 1 +▁profitiert 1 +▁Periode 1 +▁Gemäß 1 +▁Ernennung 1 +▁Kloster 1 +▁klinische 1 +▁aktualisieren 1 +▁tödlich 1 +▁vertraulich 1 +▁Münz 1 +▁Kohärenz 1 +▁empfiehlt 1 +▁äußert 1 +▁Reihenfolge 1 +▁durfte 1 +▁Tempel 1 +▁Zuhause 1 +▁flach 1 +Karte 1 +▁breakfast 1 +▁erfreulich 1 +▁Ideologie 1 +praxis 1 +▁blockiert 1 +▁Schauspieler 1 +Preis 1 +erkennung 1 +▁Einfluß 1 +▁Millennium 1 +▁Privileg 1 +▁zwangsläufig 1 +▁Gummi 1 +flücht 1 +Partner 1 +▁eindrucksvoll 1 +aufrechterhalten 1 +▁Kabine 1 +▁familiär 1 +▁Muslime 1 +▁keinesfalls 1 +▁dünn 1 +▁LateRooms 1 +▁Albanien 1 +▁Annäherung 1 +▁Behinderte 1 +▁Evaluierung 1 +▁Molekül 1 +▁Tunesien 1 +▁Quartal 1 +Christdemokraten 1 +▁Liege 1 +ý 1 +▁verschwunden 1 +ć 1 +▁Teufel 1 +▁einzubeziehen 1 +▁äußere 1 +▁College 1 +▁Effektivität 1 +▁Alpha 1 +▁Komplettpreis 1 +▁Assoziierung 1 +▁Sauerstoff 1 +▁Thailand 1 +▁gescheitert 1 +▁Bezirk 1 +▁Könnte 1 +▁hübsch 1 +▁Befreiung 1 +schmelz 1 +Automat 1 +▁Befürchtung 1 +▁aggressiv 1 +▁erforschen 1 +▁berühmt 1 +ière 1 +▁Legitimität 1 +▁Nichtregierungs 1 +belastung 1 +computer 1 +Haushalt 1 +▁Kalifornien 1 +▁Träger 1 +▁strafrechtlich 1 +▁unberührt 1 +▁größtenteils 1 +▁Animation 1 +▁Content 1 +▁verstoßen 1 +gesteckt 1 +zusammen 1 +▁Vielmehr 1 +▁zügig 1 +▁spätestens 1 +▁Neuigkeiten 1 +▁verfasst 1 +▁rief 1 +Ausnahmeregelung 1 +völker 1 +▁Föderation 1 +▁Erdgas 1 +style 1 +▁kriminelle 1 +▁Parallel 1 +▁feiern 1 +▁Surf 1 +▁Wikitravel 1 +б 1 +▁Toleranz 1 +▁beantragt 1 +▁Ängste 1 +geholt 1 +▁ideologisch 1 +dauerlicherweise 1 +▁Cocktail 1 +▁Errungenschaft 1 +▁koordinieren 1 +▁eigenständige 1 +▁Spalte 1 +▁gelb 1 +▁Simbabwe 1 +▁fortgeschritten 1 +theorie 1 +▁Autonomie 1 +▁steuerliche 1 +ð 1 +ч 1 +▁Stockholm 1 +▁Vulkan 1 +▁Instabilität 1 +▁verschoben 1 +siedlung 1 +▁ausgebaut 1 +▁Saudi 1 +widrig 1 +▁Boutique 1 +▁Organismen 1 +▁kümmert 1 +▁Security 1 +script 1 +▁Puerto 1 +▁Emotionen 1 +clus 1 +▁Piazza 1 +▁Löhne 1 +▁primär 1 +Gleichbehandlung 1 +Protokoll 1 +ı 1 +▁vorzubereiten 1 +▁ausgeübt 1 +brüche 1 +Taste 1 +▁gesondert 1 +▁Prognose 1 +▁umstritten 1 +▁befreit 1 +schlepp 1 +▁Patient 1 +ysikalisch 1 +philosoph 1 +▁Implementierung 1 +▁komfortabel 1 +▁original 1 +▁männliche 1 +▁konventionelle 1 +▁bekräftigen 1 +hydr 1 +▁Verweis 1 +unwahrscheinlich 1 +fabrik 1 +volumen 1 +▁centre 1 +EWG 1 +▁Migranten 1 +▁verteidigt 1 +▁stehe 1 +▁Erneuerung 1 +▁Immunität 1 +blätter 1 +▁beweist 1 +▁Grundfreiheiten 1 +▁Central 1 +▁schickt 1 +wissenschaftler 1 +verbände 1 +▁spürbar 1 +▁gewohnt 1 +▁abzulehnen 1 +▁Twitter 1 +▁dahingehend 1 +▁Copyright 1 +▁stützt 1 +▁Übersetzer 1 +▁HTML 1 +▁optimistisch 1 +▁anstreben 1 +▁Louis 1 +Präsident 1 +reißen 1 +überwachung 1 +▁Network 1 +▁fortschrittlich 1 +▁Mahlzeit 1 +▁verbieten 1 +© 1 +▁konservativ 1 +▁stattfand 1 +▁geklärt 1 +▁verleiht 1 +point 1 +▁Schweine 1 +▁Hongkong 1 +▁Schottland 1 +▁makroökonomisch 1 +▁Joseph 1 +▁Schriftsteller 1 +▁Etappe 1 +läßlich 1 +▁unendlich 1 +▁verhandelt 1 +▁Nachweis 1 +▁Darlehen 1 +▁Kriterium 1 +▁beeinträchtigen 1 +▁unterliegt 1 +▁verkündet 1 +▁Niederlassung 1 +▁veranstaltet 1 +adresse 1 +▁Attraktionen 1 +▁Zertifizierung 1 +▁harmonisiert 1 +▁veranlasst 1 +▁Dunkel 1 +▁Rekord 1 +▁Hindernis 1 +antwortungsvolle 1 +▁Komplex 1 +▁Demokratische 1 +▁Gültigkeit 1 +▁Prototyp 1 +▁größtmögliche 1 +▁inspirieren 1 +▁Käse 1 +konzern 1 +machung 1 +▁Diejenigen 1 +▁Beendigung 1 +bäume 1 +▁katastrophal 1 +▁leistungsfähige 1 +▁verwirklicht 1 +▁Zubehör 1 +▁widmet 1 +▁bewahrt 1 +▁Herberge 1 +mikro 1 +ähnlich 1 +▁wöchentlich 1 +▁engagieren 1 +▁energisch 1 +▁studieren 1 +α 1 +▁Begrenzung 1 +▁Kernkraftwerk 1 +▁Saddam 1 +▁einschlägige 1 +▁versorgen 1 +beratung 1 +▁leistungsstarke 1 +▁unbegrenzt 1 +ufrechterhaltung 1 +farbig 1 +▁Koalition 1 +▁beachtet 1 +▁ausgeglichen 1 +▁streben 1 +▁Release 1 +▁namentlich 1 +▁Reichweite 1 +▁trinken 1 +▁selbständig 1 +▁Korallen 1 +▁gedruckt 1 +▁wiederhole 1 +ě 1 +▁populär 1 +▁vorzuschlagen 1 +▁Buffet 1 +▁belastet 1 +▁Parlamentarier 1 +▁strukturiert 1 +▁erlangt 1 +firma 1 +▁milde 1 +▁Verschmutzung 1 +▁gratis 1 +▁Entspannen 1 +▁grösste 1 +garantie 1 +▁beunruhigend 1 +▁öfter 1 +▁bestraft 1 +▁unterstreicht 1 +ación 1 +▁weitreichende 1 +▁Komponente 1 +ń 1 +▁Vermeidung 1 +▁unabdingbar 1 +▁befriedigen 1 +▁Folglich 1 +▁Schließung 1 +▁identisch 1 +glücklicherweise 1 +▁anzuerkennen 1 +▁beschädigt 1 +▁hinzuzufügen 1 +▁Wohlergehen 1 +▁Fracht 1 +erhöhung 1 +gesandt 1 +wurf 1 +▁vorangegangenen 1 +▁monatlich 1 +▁Streben 1 +▁Ahnung 1 +▁Blatt 1 +konstruktion 1 +▁Stuttgart 1 +▁registrieren 1 +▁gemeldet 1 +▁anscheinend 1 +▁Verurteilung 1 +chancen 1 +▁Bündnis 1 +▁erholsame 1 +▁klimatisiert 1 +▁Fußgänger 1 +▁Science 1 +▁importiert 1 +▁beunruhigt 1 +▁Tunnel 1 +▁widerspiegelt 1 +▁konstant 1 +▁zugewiesen 1 +▁beauftragt 1 +▁Fragestunde 1 +▁Clinton 1 +▁übereinstimmen 1 +▁Beschaffung 1 +bedürftig 1 +▁Francisco 1 +▁robust 1 +▁unsichtbar 1 +Energieverbrauch 1 +Standard 1 +Konferenz 1 +Website 1 +▁beherrscht 1 +▁harmonisch 1 +▁sonnig 1 +▁clean 1 +▁Vergessen 1 +▁betreibt 1 +kolleg 1 +▁Begegnung 1 +▁Inanspruchnahme 1 +▁Südtirol 1 +▁Rentner 1 +▁symbolisch 1 +▁Daniel 1 +intensiv 1 +lekommunikations 1 +▁Corporate 1 +▁Stornierung 1 +▁voranzutreiben 1 +▁autonom 1 +▁Bewirtschaftung 1 +▁Jagd 1 +▁köstliche 1 +wirksam 1 +Meinungsäußerung 1 +▁Tschetschenien 1 +▁verweigert 1 +▁schweigen 1 +▁human 1 +manager 1 +Mitgliedsstaaten 1 +▁geschäftliche 1 +▁behindern 1 +▁gewerbliche 1 +▁versorgt 1 +▁Sudan 1 +inhaber 1 +▁Interessant 1 +х 1 +▁Feedback 1 +▁Gletscher 1 +▁Wachstumspakt 1 +▁Algerien 1 +▁geachtet 1 +▁heikle 1 +▁BMW 1 +▁Abweichung 1 +▁lebhaft 1 +public 1 +bewusstsein 1 +▁gemischt 1 +▁Positiv 1 +▁kämpft 1 +▁Segment 1 +▁Student 1 +▁Schwierigkeit 1 +▁North 1 +β 1 +— 1 +$ 1 +ř 1 +Š 1 +ę 1 +ò 1 +ø 1 +ë 1 +ο 1 +τ 1 +ň 1 +ц 1 +ε 1 +ι 1 +ж 1 +Č 1 +æ 1 +ï 1 +ş 1 +μ 1 +ā 1 +ą 1 +ν 1 +ĺ 1 +ŕ 1 +ù 1 +ğ 1 +† 1 +ю 1 +ś 1 +ш 1 +É 1 +ا 1 +ì 1 +κ 1 +ρ 1 +⁄ 1 +π 1 +σ 1 +ل 1 +λ 1 +ő 1 +ż 1 +~ 1 +ă 1 +œ 1 +Á 1 + 1 +û 1 +đ 1 +› 1 +В 1 +Å 1 +Р 1 +¿ 1 +υ 1 +^ 1 +£ 1 +‹ 1 +Ž 1 +ű 1 +ί 1 +ф 1 +ī 1 +→ 1 +щ 1 +η 1 +ن 1 +ς 1 +ό 1 +ů 1 +ر 1 +õ 1 +ي 1 +Ÿ 1 +± 1 +э 1 +ã 1 +¬ 1 +П 1 +− 1 +ά 1 +َ 1 +δ 1 +Ó 1 +ē 1 +م 1 +İ 1 +ď 1 +ή 1 +Ø 1 +و 1 +ت 1 +ї 1 +น 1 +ō 1 +ū 1 +К 1 +‟ 1 +γ 1 +А 1 +έ 1 +Ç 1 +ė 1 +ك 1 +‐ 1 +× 1 +า 1 +Í 1 +อ 1 +Н 1 +¡ 1 +¢ 1 +М 1 +่ 1 +ร 1 +ľ 1 +Ѓ 1 +ب 1 +θ 1 +س 1 +ع 1 +О 1 +د 1 +ω 1 +י 1 +÷ 1 +І 1 +Б 1 +ƒ 1 +Ś 1 +Т 1 +Ł 1 +є 1 +Л 1 +ţ 1 +أ 1 +ง 1 +À 1 +′ 1 +Д 1 +Ú 1 +ו 1 +ก 1 +Ż 1 +ِ 1 +เ 1 +ม 1 +ύ 1 +ר 1 +← 1 +χ 1 +้ 1 +ี 1 +¦ 1 +א 1 +ه 1 +Ё 1 +ť 1 +ź 1 +Ñ 1 +φ 1 +И 1 +ة 1 +ว 1 +Ґ 1 +ส 1 +ל 1 +ה 1 +Ý 1 +ÿ 1 +Љ 1 +خ 1 +ิ 1 +Е 1 +ّ 1 +ศ 1 +Ќ 1 +พ 1 +Ő 1 +ค 1 +ั 1 +ะ 1 +њ 1 +‡ 1 +ف 1 +Њ 1 +ด 1 +У 1 +̈ 1 +ב 1 +Ð 1 +З 1 +¥ 1 +‒ 1 +年 1 +ў 1 +ע 1 +ห 1 +년 1 +ท 1 +Ş 1 +̧ 1 +ج 1 +► 1 +Æ 1 +ح 1 +È 1 +Î 1 +※ 1 +Α 1 +ล 1 +Ф 1 +Ω 1 +ώ 1 +Я 1 +ъ 1 +ش 1 +ص 1 +Э 1 +ื 1 +Ê 1 +ņ 1 +ё 1 +ת 1 +ย 1 +ุ 1 +ข 1 +إ 1 +● 1 +ϋ 1 +ξ 1 +ט 1 +þ 1 +ק 1 +ζ 1 +ق 1 +บ 1 +Ń 1 +Ą 1 +، 1 +ْ 1 +Ε 1 +ป 1 +ณ 1 +‰ 1 +ļ 1 +ד 1 +ى 1 +Η 1 +日 1 +ใ 1 +צ 1 +Đ 1 +Π 1 +פ 1 +ต 1 +‛ 1 +Х 1 +מ 1 +­ 1 +Μ 1 +ש 1 +ُ 1 +』 1 +Ш 1 +ѓ 1 +ķ 1 +ם 1 +⇒ 1 +ض 1 +Ι 1 +上 1 +本 1 +็ 1 +ј 1 +Ў 1 +Ď 1 +Τ 1 +Ô 1 +Ě 1 +↑ 1 +√ 1 +和 1 +Ч 1 +Þ 1 +Ї 1 +食 1 +で 1 +ู 1 +แ 1 +ํ 1 +จ 1 +Є 1 +ช 1 +Κ 1 +Œ 1 +Ο 1 +ѕ 1 +ן 1 +ط 1 +ა 1 +Ľ 1 +Ř 1 +Δ 1 +Ц 1 +غ 1 +ー 1 +す 1 +♫ 1 +ไ 1 +Џ 1 +Σ 1 +נ 1 +Ć 1 +ز 1 +ی 1 +、 1 +【 1 +̋ 1 +Ν 1 +い 1 +。 1 +ґ 1 +Ę 1 +Ĺ 1 +Ō 1 +自 1 +̃ 1 +् 1 +Ė 1 +ʿ 1 +Γ 1 +Θ 1 +Ж 1 +ז 1 +ი 1 +ლ 1 +ረ 1 +】 1 +克 1 +顶 1 +ų 1 +三 1 +< 1 +ג 1 +ス 1 +文 1 +የ 1 +て 1 +ผ 1 +寺 1 +በ 1 +来 1 +手 1 +球 1 +Š 1 +– 1 +š 1 +Ë 1 +ŏ 1 +ŭ 1 +Ų 1 +̊ 1 +Ј 1 +љ 1 +ء 1 +آ 1 +ث 1 +र 1 +ዓ 1 +ይ 1 +★ 1 +治 1 +Ă 1 +≥ 1 +Ò 1 +『 1 +新 1 +は 1 +Õ 1 +免 1 +疫 1 +博 1 +场 1 +的 1 +网 1 +ン 1 +し 1 +も 1 +ึ 1 +ธ 1 +გ 1 +ე 1 +რ 1 +ħ 1 +ǎ 1 +प 1 +出 1 +武 1 +Ï 1 +Ň 1 +Ů 1 +ː 1 +̤ 1 +ќ 1 +ң 1 +۱ 1 +० 1 +დ 1 +ო 1 +ს 1 +ገ 1 +ệ 1 +≪ 1 +≫ 1 +◎ 1 +♥ 1 +县 1 +天 1 +市 1 +東 1 +江 1 +白 1 +空 1 +蛋 1 +語 1 +语 1 +込 1 +青 1 +ǐ 1 +כ 1 +द 1 +ा 1 +コ 1 +ナ 1 +一 1 +中 1 +山 1 +鋝 1 +ቀ 1 +̄ 1 +む 1 +有 1 +不 1 +乐 1 +在 1 +娱 1 +正 1 +赌 1 +ま 1 +か 1 +た 1 +っ 1 +く 1 +് 1 +Φ 1 +を 1 +チ 1 +マ 1 +・ 1 +Ī 1 +Ğ 1 +̍ 1 +ח 1 +ئ 1 +े 1 +鋍 1 +Ì 1 +ĕ 1 +Ū 1 +ơ 1 +ǔ 1 +̨ 1 +ً 1 +म 1 +ह 1 +ถ 1 +์ 1 +ຸ 1 +ህ 1 +ም 1 +ሻ 1 +ተ 1 +አ 1 +ኣ 1 +ው 1 +ጽ 1 +፣ 1 +ṭ 1 +ạ 1 +ế 1 +ễ 1 +↓ 1 +⇢ 1 +≈ 1 +■ 1 +◆ 1 +ち 1 +る 1 +イ 1 +オ 1 +テ 1 +ル 1 +了 1 +修 1 +分 1 +匿 1 +名 1 +吗 1 +敏 1 +木 1 +机 1 +站 1 +鋓 1 +问 1 +舁 1 +Ű 1 +ψ 1 +Ю 1 +ֳ 1 +仁 1 +水 1 +清 1 +石 1 +简 1 +谷 1 +እ 1 +ኦ 1 +宣 1 +መ 1 +ጨ 1 +人 1 +生 1 +さ 1 +ん 1 +お 1 +に 1 +ワ 1 +是 1 +キ 1 +や 1 +が 1 +つ 1 +と 1 +大 1 +屋 1 +โ 1 +ซ 1 +タ 1 +ә 1 +ภ 1 +ვ 1 +╚ 1 +ウ 1 +ユ 1 +体 1 +北 1 +龙 1 +Λ 1 +ћ 1 +ס 1 +ذ 1 +پ 1 +अ 1 +Ḥ 1 +振 1 +ḍ 1 +书 1 +小 1 +毛 1 +谢 1 +鰃 1 +Û 1 +Ĉ 1 +ĩ 1 +Į 1 +į 1 +ǵ 1 +ɑ 1 +ə 1 +ʒ 1 +ΐ 1 +Й 1 +Ъ 1 +ғ 1 +ָ 1 +ک 1 +ھ 1 +ۇ 1 +च 1 +ञ 1 +त 1 +ल 1 +श 1 +२ 1 +ন 1 +য 1 +় 1 +া 1 +૦ 1 +೦ 1 +೧ 1 +ษ 1 +ๆ 1 +ბ 1 +ნ 1 +პ 1 +ღ 1 +ხ 1 +ሕ 1 +ር 1 +ቶ 1 +ክ 1 +ዲ 1 +ả 1 +ổ 1 +ớ 1 +ῆ 1 +▪ 1 +▼ 1 +◊ 1 +○ 1 +♣ 1 +➲ 1 +あ 1 +う 1 +じ 1 +だ 1 +ね 1 +へ 1 +み 1 +め 1 +よ 1 +サ 1 +ジ 1 +ダ 1 +ツ 1 +ド 1 +ニ 1 +ヌ 1 +ハ 1 +ビ 1 +ベ 1 +ペ 1 +ボ 1 +ミ 1 +メ 1 +ヨ 1 +二 1 +从 1 +你 1 +内 1 +刘 1 +剥 1 +危 1 +受 1 +后 1 +幹 1 +张 1 +微 1 +応 1 +思 1 +戸 1 +欢 1 +歌 1 +气 1 +测 1 +海 1 +港 1 +溥 1 +牌 1 +章 1 +線 1 +舖 1 +花 1 +见 1 +言 1 +过 1 +送 1 +遝 1 +都 1 +里 1 +际 1 +题 1 +黚 1 +이 1 +ッ 1 +ĉ 1 +ģ 1 +Ť 1 +⋅ 1 +け 1 +举 1 +德 1 +管 1 +箱 1 +舫 1 +鋜 1 +陵 1 +ɛ 1 +ḥ 1 +ṣ 1 +╩ 1 +こ 1 +伸 1 +原 1 +国 1 +深 1 +鋖 1 +Ρ 1 +─ 1 +东 1 +五 1 +应 1 +方 1 +西 1 +の 1 +デ 1 +フ 1 +ホ 1 +ラ 1 +リ 1 +所 1 +グ 1 +え 1 +き 1 +げ 1 +ら 1 +ろ 1 +見 1 +部 1 +Ţ 1 +Ћ 1 +ェ 1 +Χ 1 +ђ 1 +ү 1 +һ 1 +ব 1 +ക 1 +ദ 1 +ല 1 +വ 1 +ഷ 1 +ീ 1 +于 1 +依 1 +头 1 +庆 1 +挂 1 +火 1 +用 1 +至 1 +车 1 +重 1 +除 1 +Ġ 1 +ŷ 1 +೨ 1 +余 1 +其 1 +叫 1 +吴 1 +咬 1 +引 1 +扈 1 +才 1 +晏 1 +牙 1 +紧 1 +跋 1 +ġ 1 +≤ 1 +゚ 1 +呀 1 +如 1 +届 1 +岩 1 +损 1 +澤 1 +続 1 +臺 1 +舩 1 +ở 1 +Ù 1 +Ā 1 +ĝ 1 +ĥ 1 +ĵ 1 +ĸ 1 +Ņ 1 +Ŝ 1 +ŝ 1 +Ź 1 +ǒ 1 +Ǻ 1 +ț 1 +ɔ 1 +ɡ 1 +ʐ 1 +ˆ 1 +Ά 1 +Ί 1 +Ό 1 +Ώ 1 +Β 1 +Υ 1 +ϊ 1 +Ѕ 1 +ұ 1 +Ӓ 1 +ө 1 +؛ 1 +ؤ 1 +ـ 1 +ٌ 1 +ځ 1 +ڭ 1 +ण 1 +न 1 +ब 1 +ि 1 +ु 1 +१ 1 +३ 1 +ই 1 +র 1 +হ 1 +ি 1 +ু 1 +ো 1 +্ 1 +૧ 1 +૨ 1 +೫ 1 +೬ 1 +೯ 1 +പ 1 +ญ 1 +ฎ 1 +ฝ 1 +ฟ 1 +฿ 1 +ຄ 1 +ງ 1 +ດ 1 +ຖ 1 +ນ 1 +ມ 1 +ວ 1 +ັ 1 +ስ 1 +ቐ 1 +ት 1 +Ṭ 1 +ẋ 1 +ẩ 1 +ậ 1 +ề 1 +ồ 1 +ộ 1 +ụ 1 +ủ 1 +ỹ 1 +ἰ 1 +₤ 1 +∞ 1 +█ 1 +◇ 1 +◈ 1 +☆ 1 +☑ 1 +☼ 1 +♀ 1 +♂ 1 +♦ 1 +」 1 +〜 1 +ぃ 1 +ぎ 1 +ぐ 1 +ご 1 +ざ 1 +ず 1 +せ 1 +ぜ 1 +そ 1 +ぞ 1 +ど 1 +な 1 +ぬ 1 +ば 1 +ひ 1 +び 1 +ふ 1 +ぶ 1 +べ 1 +ほ 1 +ぼ 1 +ゆ 1 +り 1 +れ 1 +わ 1 +ア 1 +ィ 1 +エ 1 +カ 1 +ガ 1 +ギ 1 +ク 1 +ケ 1 +ゲ 1 +ゴ 1 +ザ 1 +シ 1 +セ 1 +ゼ 1 +ソ 1 +ゾ 1 +ト 1 +ネ 1 +ノ 1 +バ 1 +パ 1 +ヒ 1 +ピ 1 +ブ 1 +プ 1 +ヘ 1 +ポ 1 +ム 1 +モ 1 +ヤ 1 +レ 1 +ロ 1 +ヴ 1 +ㄤ 1 +七 1 +万 1 +丈 1 +下 1 +义 1 +习 1 +事 1 +京 1 +仪 1 +仲 1 +价 1 +会 1 +但 1 +何 1 +倍 1 +儀 1 +儉 1 +光 1 +公 1 +刨 1 +則 1 +剣 1 +务 1 +动 1 +勧 1 +区 1 +去 1 +参 1 +及 1 +取 1 +只 1 +可 1 +台 1 +吃 1 +向 1 +君 1 +吧 1 +吹 1 +吾 1 +告 1 +喜 1 +嘛 1 +四 1 +回 1 +囧 1 +固 1 +國 1 +堂 1 +墩 1 +央 1 +好 1 +娃 1 +子 1 +孴 1 +宝 1 +客 1 +家 1 +寨 1 +寶 1 +寸 1 +尔 1 +局 1 +岭 1 +崩 1 +川 1 +希 1 +広 1 +庚 1 +弁 1 +彭 1 +役 1 +必 1 +怒 1 +怡 1 +性 1 +意 1 +慢 1 +成 1 +戴 1 +抜 1 +探 1 +接 1 +掻 1 +握 1 +搞 1 +摂 1 +撮 1 +放 1 +施 1 +昇 1 +星 1 +春 1 +显 1 +普 1 +曌 1 +曝 1 +書 1 +最 1 +板 1 +查 1 +柱 1 +桂 1 +检 1 +楽 1 +檀 1 +次 1 +止 1 +步 1 +気 1 +汉 1 +没 1 +泥 1 +注 1 +泽 1 +洛 1 +活 1 +浦 1 +済 1 +満 1 +漢 1 +焼 1 +煮 1 +爱 1 +父 1 +片 1 +率 1 +玉 1 +王 1 +班 1 +琢 1 +畢 1 +畿 1 +疆 1 +疑 1 +百 1 +皇 1 +直 1 +相 1 +眼 1 +瞎 1 +知 1 +确 1 +示 1 +礼 1 +神 1 +祿 1 +福 1 +秀 1 +竞 1 +端 1 +竹 1 +第 1 +答 1 +紅 1 +終 1 +統 1 +纹 1 +细 1 +统 1 +维 1 +罗 1 +群 1 +義 1 +羽 1 +耀 1 +胞 1 +能 1 +臘 1 +臨 1 +致 1 +舐 1 +航 1 +葉 1 +葱 1 +蒸 1 +蔚 1 +藤 1 +街 1 +视 1 +觉 1 +訓 1 +記 1 +請 1 +许 1 +诘 1 +请 1 +调 1 +貌 1 +貮 1 +货 1 +质 1 +赤 1 +赵 1 +超 1 +足 1 +軍 1 +辱 1 +迎 1 +返 1 +连 1 +迷 1 +道 1 +遭 1 +郑 1 +鄭 1 +酉 1 +鋘 1 +鋟 1 +镜 1 +閩 1 +闽 1 +阳 1 +陀 1 +降 1 +陶 1 +電 1 +静 1 +音 1 +预 1 +飞 1 +飼 1 +馬 1 +鲁 1 +鵜 1 +黄 1 +黨 1 +검 1 +고 1 +군 1 +나 1 +누 1 +님 1 +단 1 +당 1 +드 1 +맨 1 +반 1 +번 1 +법 1 +베 1 +별 1 +빛 1 +성 1 +스 1 +신 1 +에 1 +왕 1 +요 1 +유 1 +자 1 +작 1 +조 1 +짝 1 +천 1 +추 1 +터 1 +̇ 1 +入 1 +凄 1 +千 1 +吳 1 +实 1 +康 1 +彰 1 +旨 1 +森 1 +睦 1 +苑 1 +蔓 1 +関 1 +鰈 1 +鰊 1 +鲞 1 +鹿 1 +ˈ 1 +Ẳ 1 +丘 1 +井 1 +今 1 +圆 1 +安 1 +明 1 +李 1 +甜 1 +田 1 +羅 1 +茶 1 +覺 1 +雄 1 +鴻 1 +대 1 +르 1 +체 1 +층 1 +ʀ 1 +愛 1 +无 1 +产 1 +住 1 +反 1 +場 1 +景 1 +济 1 +益 1 +种 1 +经 1 +而 1 +行 1 +非 1 +力 1 +学 1 +常 1 +朝 1 +留 1 +Ђ 1 +џ 1 +湖 1 +綺 1 +麗 1 +<mask> 1 diff --git a/SpeechUT/dataset/MuSTC/en_de/spm_unigram10000.model b/SpeechUT/dataset/MuSTC/en_de/spm_unigram10000.model new file mode 100644 index 0000000000000000000000000000000000000000..ac88f59caee81b4fafce7e961b37863310f9ad95 GIT binary patch literal 406948 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%0DvU4Cw?AV{!EDJB+DHDw`7iv1 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 zPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;- zKmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T z|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V z|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd z|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT- z|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U z{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va z`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz z>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs< zr~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24a zpZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>Hkmv zfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w z|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>! z|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^ z|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv z|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y z{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ< z^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b z)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~Cz zPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;- zKmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T z|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V z|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd z|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT- z|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U z{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va z`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz z>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs< zr~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24a zpZ@>!|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#A=E z`}P0n|I`1c|4;wlzp-EcpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;wlzqMcgpZ-7nfBOIQ|NUG0_5bPr)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*J=p(X|AYMx_CMJFVE=>t5B5LU|6u=v{SWp(*#BVvgZ&To zKiL0Z|AYMx_CMJFVE=>t5B5LU|6u=v{SWp(*#BVvgZ&To>;KdLr~gm?pZ-7nfBOIQ z|2^3MVE=>t5BBT-)BpEi|AYMx_CMJFVE=>t5B5LU|6u=v{SWp(*#BVvgZ&ToKiL0Z z|AYPd|MdUq|I`1c|4;v){y+VHzwG~I|1bN0*{}ak|KBhB_5b~{|Cjy0?Ehu|FZ+Ml z|I7Yg_W!c~m;Jx&|7HI#`+wR0%l=>X|FZv={lD!0W&bbxf7$=b{$KY0vj3O;zwG~I z|1bN0+5gM_U-tj9|Cjy0?Ehu|FZ+Ml|I7Yg_W!c~m;Jx&|7HI#`+wR0%l=>XKidCj z|D*kn_CMPHX#b=AkM=*>um4Z~pZ>o``ycIpwExk5{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){=X;tpX`6K z|H=L*`=9K8vj55cC;Ol5*Z-&g@5%lr`=9K8vS0t7{y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ 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 z4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1 zAR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ( z8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?W^v}PaG=OLT z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G z0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLaw zq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V z0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?W zL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz z1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$ zhz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c z1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh z5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC? z4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1 zAR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ( z8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2 zKs1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4Immo zG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4 zfM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCF 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 zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn2JrJ=xlriv@BexDba0)=;g5r}FAk3mUdKE9@Bcjf9}d2>JN)zK zG@n2J!+-hTd3*lnJOBOv?;Q_3*Z=dge)OFG--G|@KY#E)|K|_>g9rcafAyjNe9Hg( z9S{EbO#knLe?HT{```Z4hy2HP{?mv2rw2adA1-nI{KM;C2ha5nuO@%~;mgv`KNR>s z|Bwg&{6pmS^A9!1&%gLS;OAd_^85K0|MGwSMUD9LFOr&{e{mD;&%d}!(Bb93`1x1Y zY#jba2WP>4{?(_SpMO=fJ3Kguc7Fa<CGhi?>-Rr@IT`x%m$Obke>qj-;P>*ElO7KL zt%GkXfBy10_~$Pf_Rn8pub;ovLqC802Y=LmxncL`FLyfq{N>h_pTFGy@$<J6)<1tc z6Z!MEQ!_t*d#&*Ew|{&;e=`Ao{&pw+&)@C~|M}Yu9u9u-XP4K1o?WYS_+K1c8FcvP zd(N@{JUcP)^Xx1C&$BNVKhHi7|2*qff1U+lKhMAY8qe-m|9N)P_0O|ARDNDuR{42x zjo|0S$@-rcXIg(=oZ9<&@%`4%i*G1?Uc7?*c>zl}_^rKsdA^r_{?=aHrv3Bcp4y)m zHx>Q7xQpcH)n(kDSLb?uUVZWXdDWc%yee{kUfqZO^Xdk#pI3Js{k(a(=im?Q%_pLt zH<889o7-)F-d#KVd3Ryw=iL>LpLeHCe%^gA{PXSw>CgL@zh@sV9shi|#`^Q&BFfK) Qv*$k_PM`gJcrEsS0d(yY#{d8T literal 0 HcmV?d00001 diff --git a/SpeechUT/dataset/MuSTC/en_es/config.yaml b/SpeechUT/dataset/MuSTC/en_es/config.yaml new file mode 100644 index 0000000..dce5f63 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_es/config.yaml @@ -0,0 +1,3 @@ +vocab_filename: dict.spm.txt +src_vocab_filename: dict.kmu.txt + diff --git a/SpeechUT/dataset/MuSTC/en_es/config_enes.yaml b/SpeechUT/dataset/MuSTC/en_es/config_enes.yaml new file mode 100644 index 0000000..dd080a0 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_es/config_enes.yaml @@ -0,0 +1,14 @@ +bpe_tokenizer: + bpe: sentencepiece + sentencepiece_model: spm_unigram10000.model + +sampling_alpha: 1.0 +shuffle: false +use_audio_input: true +use_sample_rate: 16000 + +vocab_filename: dict.spm.txt + +# required by speech_to_text task but never used +input_channels: 1 +input_feat_per_channel: 1 diff --git a/SpeechUT/dataset/MuSTC/en_es/dict.kmu.txt b/SpeechUT/dataset/MuSTC/en_es/dict.kmu.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_es/dict.kmu.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechUT/dataset/MuSTC/en_es/dict.spm.txt b/SpeechUT/dataset/MuSTC/en_es/dict.spm.txt new file mode 100644 index 0000000..194ae6f --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_es/dict.spm.txt @@ -0,0 +1,9997 @@ +▁de 1 +, 1 +▁la 1 +. 1 +▁y 1 +▁en 1 +▁que 1 +▁el 1 +s 1 +▁a 1 +▁los 1 +▁las 1 +▁del 1 +▁se 1 +▁para 1 +▁con 1 +▁un 1 +▁por 1 +n 1 +▁una 1 +▁no 1 +▁su 1 +▁al 1 +▁es 1 +▁( 1 +r 1 +▁sobre 1 +) 1 +▁El 1 +▁como 1 +▁o 1 +▁ 1 +▁lo 1 +▁La 1 +▁más 1 +▁En 1 +es 1 +▁ha 1 +: 1 +do 1 +a 1 +; 1 +▁sus 1 +▁A 1 +o 1 +▁Naciones 1 +▁Unidas 1 +da 1 +▁entre 1 +▁Estados 1 +▁este 1 +/ 1 +se 1 +mente 1 +▁Comisión 1 +▁también 1 +▁e 1 +▁países 1 +▁desarrollo 1 +▁General 1 +mos 1 +▁Consejo 1 +▁si 1 +▁esta 1 +▁han 1 +▁Y 1 +▁contra 1 +▁son 1 +ndo 1 +▁derechos 1 +▁todos 1 +e 1 +- 1 +▁in 1 +ción 1 +▁informe 1 +▁Comité 1 +▁" 1 +▁está 1 +▁Se 1 +▁No 1 +á 1 +▁ser 1 +l 1 +▁re 1 +▁parte 1 +▁internacional 1 +▁Los 1 +? 1 +la 1 +▁período 1 +▁personas 1 +▁me 1 +▁información 1 +dos 1 +▁¿ 1 +▁todo 1 +▁medidas 1 +ba 1 +▁años 1 +▁resolución 1 +das 1 +t 1 +▁así 1 +▁mi 1 +▁pero 1 +▁Estado 1 +▁derecho 1 +A 1 +▁humanos 1 +▁puede 1 +▁programa 1 +▁Por 1 +ó 1 +▁sin 1 +▁le 1 +▁muy 1 +▁otros 1 +▁hacer 1 +▁sesiones 1 +C 1 +▁actividades 1 +▁artículo 1 +ta 1 +ra 1 +lo 1 +en 1 +▁Asamblea 1 +▁cuando 1 +▁ese 1 +▁niños 1 +▁1 1 +y 1 +▁proyecto 1 +▁trabajo 1 +▁Presidente 1 +▁Gobierno 1 +▁respecto 1 +▁aplicación 1 +▁miembros 1 +▁fin 1 +▁sistema 1 +▁“ 1 +▁dos 1 +d 1 +▁forma 1 +▁- 1 +le 1 +▁vez 1 +▁todas 1 +▁tiene 1 +▁Secretario 1 +▁seguridad 1 +▁país 1 +), 1 +ía 1 +▁otras 1 +to 1 +). 1 +▁Las 1 +ca 1 +te 1 +▁mundo 1 +ron 1 +▁mujeres 1 +ar 1 +▁apoyo 1 +▁De 1 +i 1 +an 1 +on 1 +S 1 +ciones 1 +▁Grupo 1 +▁están 1 +▁recursos 1 +▁hay 1 +▁hecho 1 +▁cada 1 +▁servicios 1 +▁Es 1 +c 1 +p 1 +de 1 +▁lugar 1 +u 1 +▁debe 1 +▁Convención 1 +▁esa 1 +▁situación 1 +▁cuenta 1 +▁fue 1 +▁ya 1 +▁2 1 +▁particular 1 +ma 1 +▁durante 1 +▁tiempo 1 +▁había 1 +▁desde 1 +é 1 +▁programas 1 +▁internacionales 1 +▁organizaciones 1 +▁importante 1 +▁proceso 1 +▁tanto 1 +▁cooperación 1 +▁era 1 +▁esto 1 +▁pueden 1 +no 1 +▁c 1 +co 1 +▁Si 1 +▁Internacional 1 +▁República 1 +di 1 +▁política 1 +▁porque 1 +▁S 1 +▁Seguridad 1 +▁manera 1 +▁3 1 +▁asistencia 1 +er 1 +▁paz 1 +▁nacional 1 +▁párrafo 1 +▁relación 1 +▁Unión 1 +nte 1 +re 1 +" 1 +▁b 1 +▁Pero 1 +▁gran 1 +▁cuestiones 1 +▁Con 1 +▁año 1 +▁nos 1 +sa 1 +▁bien 1 +▁sido 1 +▁general 1 +▁nivel 1 +▁C 1 +▁I 1 +▁cuestión 1 +les 1 +▁pro 1 +▁mayor 1 +▁Al 1 +▁uno 1 +▁vida 1 +ti 1 +▁protección 1 +▁hasta 1 +▁Sr 1 +▁personal 1 +▁caso 1 +▁sólo 1 +▁E 1 +▁tienen 1 +án 1 +▁estos 1 +▁Derechos 1 +▁mismo 1 +▁nacionales 1 +P 1 +me 1 +rá 1 +▁presente 1 +▁P 1 +▁Europea 1 +g 1 +▁19 1 +rse 1 +▁menos 1 +m 1 +▁hace 1 +ría 1 +▁esos 1 +ce 1 +▁Conferencia 1 +ci 1 +cu 1 +▁eso 1 +L 1 +▁O 1 +▁millones 1 +▁marco 1 +ro 1 +▁acuerdo 1 +▁ver 1 +▁dólares 1 +▁conformidad 1 +í 1 +▁número 1 +▁posible 1 +▁salud 1 +na 1 +▁social 1 +ban 1 +▁haya 1 +ación 1 +▁ejemplo 1 +▁armas 1 +▁qué 1 +▁sea 1 +▁mediante 1 +▁10 1 +▁di 1 +▁políticas 1 +b 1 +▁4 1 +▁tema 1 +▁datos 1 +▁atención 1 +▁antes 1 +▁capacidad 1 +▁ni 1 +▁ante 1 +” 1 +▁les 1 +▁Así 1 +que 1 +▁decisión 1 +E 1 +▁partes 1 +▁cosas 1 +▁labor 1 +▁esas 1 +▁embargo 1 +ga 1 +▁5 1 +▁algo 1 +▁materia 1 +ten 1 +▁estas 1 +li 1 +▁tener 1 +▁ahora 1 +▁algunos 1 +▁tres 1 +▁Especial 1 +▁ex 1 +▁deben 1 +▁otra 1 +idad 1 +▁esfuerzos 1 +so 1 +▁mejor 1 +▁examen 1 +▁trata 1 +▁otro 1 +▁decir 1 +z 1 +▁nuestra 1 +▁También 1 +▁mujer 1 +▁nuevo 1 +▁comunidad 1 +▁medio 1 +▁pre 1 +▁acceso 1 +▁condiciones 1 +go 1 +▁donde 1 +al 1 +▁base 1 +▁diciembre 1 +▁tipo 1 +▁nuestro 1 +je 1 +vi 1 +B 1 +▁Además 1 +▁mucho 1 +▁Oficina 1 +▁casos 1 +▁Re 1 +▁objetivos 1 +▁problemas 1 +▁Programa 1 +▁después 1 +▁Sin 1 +▁6 1 +▁educación 1 +▁Desarrollo 1 +nos 1 +mi 1 +▁toda 1 +▁15 1 +▁Para 1 +▁Parte 1 +▁te 1 +in 1 +ja 1 +▁instituciones 1 +mo 1 +▁día 1 +▁co 1 +ri 1 +▁Unidos 1 +▁informes 1 +▁Humanos 1 +▁momento 1 +▁importancia 1 +▁B 1 +pa 1 +▁sino 1 +▁primera 1 +▁12 1 +D 1 +▁Europa 1 +▁responsabilidad 1 +▁cualquier 1 +▁tan 1 +▁Me 1 +▁especial 1 +▁ellos 1 +▁participación 1 +▁cual 1 +▁grupos 1 +▁7 1 +▁África 1 +▁normas 1 +▁Esta 1 +el 1 +▁población 1 +▁necesidad 1 +ve 1 +▁reunión 1 +▁va 1 +T 1 +tra 1 +". 1 +▁problema 1 +▁disposiciones 1 +▁sector 1 +▁ley 1 +tu 1 +▁— 1 +▁8 1 +ne 1 +▁grupo 1 +▁violencia 1 +▁Mundial 1 +▁documento 1 +▁primer 1 +▁Organización 1 +▁persona 1 +▁sesión 1 +▁sociedad 1 +▁uso 1 +▁muchos 1 +▁ca 1 +▁solo 1 +▁d 1 +▁Parlamento 1 +▁Ley 1 +▁resultados 1 +h 1 +▁ayuda 1 +▁recomendaciones 1 +un 1 +os 1 +▁dar 1 +▁mejorar 1 +▁Este 1 +ado 1 +▁gente 1 +▁lograr 1 +▁he 1 +O 1 +▁aquí 1 +▁In 1 +▁tal 1 +k 1 +▁nota 1 +▁20 1 +▁mundial 1 +▁necesario 1 +▁F 1 +▁necesidades 1 +▁9 1 +▁cómo 1 +▁debería 1 +▁horas 1 +▁gestión 1 +▁nombre 1 +▁Lo 1 +▁fecha 1 +bi 1 +▁Partes 1 +▁objetivo 1 +M 1 +si 1 +tar 1 +G 1 +▁región 1 +▁Miembros 1 +▁plan 1 +▁14 1 +▁proyectos 1 +▁18 1 +▁presupuesto 1 +▁Como 1 +▁inter 1 +▁11 1 +los 1 +▁Trabajo 1 +va 1 +▁lucha 1 +▁ello 1 +f 1 +▁control 1 +las 1 +▁promover 1 +00 1 +▁poder 1 +▁Tribunal 1 +2 1 +as 1 +▁hemos 1 +tas 1 +▁Mi 1 +▁podría 1 +▁tenemos 1 +▁especialmente 1 +▁G 1 +▁incluso 1 +▁civil 1 +Risas 1 +qui 1 +▁nuestros 1 +▁garantizar 1 +▁Ma 1 +▁discriminación 1 +▁regionales 1 +▁cambio 1 +F 1 +▁medida 1 +res 1 +▁dentro 1 +▁crear 1 +▁13 1 +▁acerca 1 +v 1 +tos 1 +▁debate 1 +▁sentido 1 +ter 1 +▁hoy 1 +▁estaba 1 +▁junio 1 +▁pobreza 1 +▁mayoría 1 +ir 1 +.1 1 +▁hacia 1 +▁virtud 1 +▁total 1 +▁plazo 1 +▁algunas 1 +▁propuesta 1 +x 1 +▁estado 1 +▁aún 1 +▁papel 1 +▁sociales 1 +▁medios 1 +▁favor 1 +▁respuesta 1 +▁haber 1 +▁dice 1 +▁modo 1 +▁[ 1 +▁decisiones 1 +▁p 1 +▁sí 1 +... 1 +▁per 1 +bo 1 +▁30 1 +▁principios 1 +▁organización 1 +U 1 +▁autoridades 1 +▁terrorismo 1 +▁práctica 1 +▁futuro 1 +▁adoptar 1 +▁Su 1 +▁podemos 1 +I 1 +▁evaluación 1 +▁empleo 1 +is 1 +▁anexo 1 +▁objeto 1 +▁habían 1 +▁nuevas 1 +▁acción 1 +▁organismos 1 +▁calidad 1 +▁pertinentes 1 +tó 1 +] 1 +▁delegación 1 +▁mo 1 +▁investigación 1 +▁punto 1 +▁cuanto 1 +pi 1 +▁cabo 1 +▁examinar 1 +▁productos 1 +ria 1 +gra 1 +▁mandato 1 +▁nosotros 1 +dor 1 +ble 1 +▁16 1 +▁Esto 1 +▁establecer 1 +▁Una 1 +▁poco 1 +▁siempre 1 +▁zonas 1 +▁Un 1 +▁empresas 1 +▁bajo 1 +ven 1 +▁según 1 +▁órganos 1 +▁creación 1 +▁nueva 1 +ida 1 +▁legislación 1 +▁tu 1 +▁orden 1 +▁ma 1 +▁julio 1 +▁relativas 1 +▁público 1 +▁realidad 1 +▁será 1 +▁Social 1 +ada 1 +▁Nacional 1 +▁seguir 1 +▁M 1 +▁aumento 1 +▁libertad 1 +▁tecnología 1 +▁estamos 1 +▁vi 1 +▁Señor 1 +▁Ha 1 +▁importantes 1 +▁septiembre 1 +gi 1 +▁principales 1 +▁yo 1 +▁ejecución 1 +▁fondos 1 +▁sostenible 1 +ú 1 +▁segundo 1 +▁falta 1 +▁17 1 +▁días 1 +▁misma 1 +▁además 1 +▁realmente 1 +▁diferentes 1 +▁mercado 1 +▁principio 1 +▁pública 1 +▁siguientes 1 +▁Declaración 1 +ntes 1 +▁agua 1 +▁gobiernos 1 +▁representantes 1 +▁financiación 1 +▁Protocolo 1 +▁económica 1 +fi 1 +▁declaración 1 +▁contexto 1 +▁función 1 +▁través 1 +▁u 1 +▁igualdad 1 +ur 1 +▁frente 1 +pe 1 +▁arreglo 1 +▁pa 1 +▁efectos 1 +▁D 1 +▁noviembre 1 +▁unos 1 +▁actual 1 +▁económico 1 +▁él 1 +▁sigue 1 +▁largo 1 +▁final 1 +▁comercio 1 +encia 1 +▁gubernamentales 1 +▁prácticas 1 +▁aplicar 1 +za 1 +▁nuevos 1 +iendo 1 +▁octubre 1 +dores 1 +▁Junta 1 +N 1 +ido 1 +▁gastos 1 +▁estar 1 +ch 1 +▁siendo 1 +▁muchas 1 +▁Nueva 1 +▁Fondo 1 +▁to 1 +▁tra 1 +▁establecimiento 1 +▁niño 1 +ncia 1 +▁funcionarios 1 +▁ciudadanos 1 +▁formas 1 +▁siguiente 1 +▁víctimas 1 +or 1 +▁justicia 1 +▁valor 1 +▁conflictos 1 +ían 1 +▁último 1 +▁fuera 1 +▁po 1 +rán 1 +▁posibilidad 1 +▁tras 1 +▁causa 1 +▁operaciones 1 +tro 1 +▁Asuntos 1 +▁figura 1 +▁espacio 1 +▁grandes 1 +▁equipo 1 +▁pregunta 1 +▁coordinación 1 +▁Secretaría 1 +▁cumplimiento 1 +▁sistemas 1 +▁interés 1 +▁ayudar 1 +▁Ministerio 1 +miento 1 +▁reuniones 1 +ru 1 +▁pasado 1 +fa 1 +tiva 1 +▁energía 1 +▁regional 1 +' 1 +▁nucleares 1 +▁representa 1 +▁ámbito 1 +▁promoción 1 +▁opinión 1 +ge 1 +jo 1 +▁pueblo 1 +▁fundamental 1 +▁poner 1 +▁Departamento 1 +ización 1 +fe 1 +▁edad 1 +▁realizar 1 +▁representante 1 +▁autor 1 +▁comunicación 1 +▁técnica 1 +▁crisis 1 +▁ra 1 +▁historia 1 +▁reforma 1 +▁Europeo 1 +▁procedimientos 1 +▁mantenimiento 1 +▁sean 1 +▁creo 1 +5 1 +▁resultado 1 +R 1 +▁pueda 1 +fer 1 +▁obligaciones 1 +vo 1 +▁marzo 1 +▁resoluciones 1 +▁compromiso 1 +6 1 +▁reducir 1 +▁carácter 1 +▁texto 1 +▁T 1 +▁tomar 1 +▁2005 1 +▁idea 1 +▁Informe 1 +▁veces 1 +emos 1 +▁fueron 1 +▁aumentar 1 +▁correspondiente 1 +▁puedan 1 +▁dicho 1 +▁propuestas 1 +▁mecanismos 1 +▁Israel 1 +▁Ca 1 +▁común 1 +ismo 1 +▁Ahora 1 +▁cuatro 1 +▁gracias 1 +▁policía 1 +▁lista 1 +▁actos 1 +▁locales 1 +rio 1 +▁abril 1 +▁considera 1 +▁ambiente 1 +▁meses 1 +▁serie 1 +▁familia 1 +▁instrumentos 1 +▁da 1 +▁género 1 +▁mayo 1 +lla 1 +▁Cuando 1 +▁2000 1 +▁solución 1 +▁conflicto 1 +▁toma 1 +▁jóvenes 1 +▁L 1 +ando 1 +▁amplia 1 +▁of 1 +man 1 +▁guerra 1 +H 1 +po 1 +3 1 +▁prevención 1 +▁mientras 1 +▁varios 1 +▁aspectos 1 +▁diálogo 1 +▁Carta 1 +▁Misión 1 +▁preocupación 1 +▁aunque 1 +▁ven 1 +▁zona 1 +1 1 +▁estrategia 1 +▁cinco 1 +▁obstante 1 +▁expertos 1 +▁vista 1 +il 1 +por 1 +con 1 +▁Pa 1 +▁i 1 +▁asegurar 1 +▁iniciativas 1 +▁China 1 +▁efecto 1 +ya 1 +▁conjunto 1 +▁Pacto 1 +▁ve 1 +sión 1 +▁puesto 1 +ados 1 +▁f 1 +▁capacitación 1 +▁demás 1 +▁fundamentales 1 +be 1 +▁the 1 +▁entonces 1 +); 1 +▁experiencia 1 +▁sería 1 +▁servicio 1 +▁dijo 1 +▁facilitar 1 +▁24 1 +▁documentos 1 +▁alto 1 +▁América 1 +us 1 +▁2004 1 +cha 1 +▁transporte 1 +▁procedimiento 1 +sta 1 +▁cumplir 1 +▁UE 1 +▁pueblos 1 +▁encontrar 1 +▁enero 1 +▁2002 1 +▁Tratado 1 +▁Convenio 1 +▁25 1 +▁nuestras 1 +▁2001 1 +▁resulta 1 +▁hombres 1 +▁li 1 +ran 1 +4 1 +▁local 1 +▁Representante 1 +era 1 +▁debido 1 +▁relativa 1 +▁crecimiento 1 +▁21 1 +▁relaciones 1 +▁especiales 1 +▁territorio 1 +! 1 +ni 1 +▁últimos 1 +▁puestos 1 +▁producción 1 +nd 1 +▁libre 1 +▁estudio 1 +▁formación 1 +▁22 1 +▁2003 1 +V 1 +▁todavía 1 +▁oportunidad 1 +”. 1 +▁centro 1 +▁imp 1 +▁Acción 1 +per 1 +▁tenía 1 +▁funciones 1 +▁acuerdos 1 +▁celebrada 1 +▁colaboración 1 +▁Iraq 1 +▁luego 1 +▁establecido 1 +▁economía 1 +▁señor 1 +ista 1 +▁consecuencias 1 +▁Le 1 +▁consultas 1 +▁VIH 1 +ré 1 +▁proteger 1 +um 1 +▁relacionadas 1 +▁principal 1 +▁Ba 1 +▁leyes 1 +▁sa 1 +▁llevar 1 +▁saber 1 +▁llegar 1 +▁Hay 1 +▁eran 1 +▁Co 1 +▁mantener 1 +▁casi 1 +▁éxito 1 +.2 1 +▁dis 1 +▁reducción 1 +▁utilización 1 +▁indica 1 +▁quiero 1 +▁podrá 1 +▁ro 1 +▁referencia 1 +tal 1 +▁refugiados 1 +▁ninguna 1 +▁eficaz 1 +▁ciudad 1 +▁ella 1 +w 1 +▁Di 1 +▁2006 1 +▁adopción 1 +tado 1 +▁prestar 1 +▁R 1 +▁financieros 1 +▁enfoque 1 +▁gobierno 1 +▁presentar 1 +▁ejercicio 1 +gu 1 +▁aprobación 1 +▁bienes 1 +▁presentación 1 +▁suma 1 +▁consecuencia 1 +▁31 1 +▁hotel 1 +ha 1 +▁Te 1 +it 1 +▁deberían 1 +▁hizo 1 +/1 1 +▁plenamente 1 +▁Penal 1 +ente 1 +▁políticos 1 +▁comunidades 1 +▁comp 1 +▁23 1 +▁indígenas 1 +▁razón 1 +▁régimen 1 +▁ellas 1 +▁riesgo 1 +▁Artículo 1 +▁Sra 1 +▁espera 1 +adas 1 +▁difícil 1 +ros 1 +▁Pro 1 +▁buena 1 +", 1 +▁varias 1 +du 1 +cri 1 +▁fuerzas 1 +▁menores 1 +▁presentado 1 +▁administración 1 +▁determinar 1 +▁nada 1 +cia 1 +▁obtener 1 +▁cuales 1 +▁and 1 +▁generales 1 +▁temas 1 +▁participar 1 +lu 1 +ber 1 +ing 1 +▁cu 1 +▁ingresos 1 +▁2007 1 +”, 1 +▁alguna 1 +cen 1 +▁sub 1 +cción 1 +▁proporcionar 1 +▁Código 1 +st 1 +men 1 +ll 1 +▁utilizar 1 +▁inglés 1 +tion 1 +▁Mo 1 +▁pe 1 +▁igual 1 +ct 1 +▁parece 1 +▁significa 1 +▁Vi 1 +▁dado 1 +ita 1 +▁esfera 1 +): 1 +den 1 +▁ningún 1 +tor 1 +▁debemos 1 +▁ne 1 +▁delito 1 +▁niveles 1 +▁observa 1 +▁incluidos 1 +▁curso 1 +▁concepto 1 +com 1 +▁mar 1 +▁seguimiento 1 +▁He 1 +▁político 1 +▁par 1 +▁agosto 1 +CN 1 +Qué 1 +▁observaciones 1 +ck 1 +▁existe 1 +▁apoyar 1 +▁mis 1 +▁casa 1 +cer 1 +▁peligro 1 +▁teniendo 1 +▁competencia 1 +▁análisis 1 +▁Permanente 1 +▁alcanzar 1 +▁centros 1 +▁so 1 +ho 1 +▁auto 1 +amos 1 +▁trabajadores 1 +bra 1 +▁segunda 1 +▁U 1 +▁ir 1 +▁bo 1 +▁II 1 +▁negociaciones 1 +▁real 1 +▁sexual 1 +ieron 1 +▁nunca 1 +▁fa 1 +▁secretaría 1 +ren 1 +▁N 1 +▁asuntos 1 +istas 1 +▁g 1 +▁progresos 1 +▁regiones 1 +▁relacionados 1 +7 1 +▁provisional 1 +Aplausos 1 +▁hacerlo 1 +ec 1 +car 1 +cio 1 +▁cargo 1 +cho 1 +▁desea 1 +rra 1 +▁evitar 1 +▁Económico 1 +▁pi 1 +pre 1 +▁violaciones 1 +ón 1 +/2 1 +8 1 +▁dinero 1 +▁K 1 +▁pesar 1 +▁insta 1 +hi 1 +▁Sa 1 +ul 1 +▁haciendo 1 +▁artículos 1 +▁febrero 1 +▁respeto 1 +▁sal 1 +▁esferas 1 +▁necesita 1 +▁usted 1 +ver 1 +▁financiera 1 +enta 1 +▁iniciativa 1 +▁escala 1 +▁civiles 1 +▁Relator 1 +▁Reino 1 +▁Rusia 1 +▁disposición 1 +▁independiente 1 +▁Centro 1 +▁penal 1 +tes 1 +▁fines 1 +▁terreno 1 +▁• 1 +▁trabajar 1 +▁dispuesto 1 +▁Medio 1 +▁podrían 1 +▁red 1 +▁judicial 1 +véase 1 +▁26 1 +▁oportunidades 1 +▁tales 1 +▁ad 1 +▁amenaza 1 +▁Constitución 1 +▁fuerza 1 +▁relativo 1 +▁ofrece 1 +▁necesarias 1 +gue 1 +izar 1 +▁desarme 1 +ras 1 +tivas 1 +▁párr 1 +▁cerca 1 +tivo 1 +▁Milenio 1 +▁Corte 1 +▁Democrática 1 +▁consiguiente 1 +tación 1 +▁miembro 1 +▁muerte 1 +▁estructura 1 +▁fondo 1 +▁delitos 1 +▁privado 1 +▁28 1 +▁Acuerdo 1 +▁claro 1 +▁pues 1 +▁aprobado 1 +▁hablar 1 +▁27 1 +▁EE 1 +▁Desde 1 +▁votación 1 +▁anterior 1 +▁seis 1 +▁adoptadas 1 +▁fortalecer 1 +▁2008 1 +▁Unido 1 +che 1 +▁lugares 1 +▁Plan 1 +▁mecanismo 1 +▁for 1 +▁misión 1 +▁tratamiento 1 +gre 1 +▁abordar 1 +Add 1 +▁enseñanza 1 +su 1 +nes 1 +▁incluida 1 +▁Mar 1 +▁Asia 1 +▁amplio 1 +SIDA 1 +▁Po 1 +▁estoy 1 +▁Esa 1 +▁palabras 1 +▁resolver 1 +▁sitio 1 +imos 1 +▁elecciones 1 +▁incluye 1 +▁Ro 1 +▁reconocimiento 1 +▁contribuciones 1 +▁Durante 1 +▁aprobó 1 +ró 1 +he 1 +UU 1 +ic 1 +▁niñas 1 +▁tratados 1 +idas 1 +rios 1 +▁cuyo 1 +▁señala 1 +▁recomienda 1 +▁planes 1 +sti 1 +▁propia 1 +▁partir 1 +▁actividad 1 +▁Cumbre 1 +cto 1 +▁Da 1 +th 1 +▁ba 1 +▁diversos 1 +mina 1 +▁elementos 1 +▁intereses 1 +▁Ministro 1 +tre 1 +▁junto 1 +.5 1 +▁York 1 +▁tenido 1 +siones 1 +▁elaboración 1 +▁sectores 1 +▁demanda 1 +ió 1 +j 1 +▁1999 1 +▁contenido 1 +▁presenta 1 +▁diversas 1 +▁único 1 +▁declaraciones 1 +▁eficacia 1 +▁militares 1 +▁quienes 1 +▁vigor 1 +entes 1 +▁Aunque 1 +▁miras 1 +▁completa 1 +ng 1 +ue 1 +▁instrumento 1 +▁incluir 1 +▁propio 1 +▁reserva 1 +▁tratar 1 +ac 1 +▁Tema 1 +▁necesarios 1 +▁empresa 1 +▁origen 1 +▁mí 1 +▁preparación 1 +nas 1 +▁escrito 1 +▁cuadro 1 +▁delegaciones 1 +▁recibir 1 +▁Paz 1 +▁constituye 1 +▁estudios 1 +▁estrategias 1 +▁bienio 1 +▁conocimientos 1 +▁central 1 +▁vol 1 +sas 1 +▁interna 1 +▁nuclear 1 +▁integración 1 +▁hijos 1 +▁Alto 1 +0.000 1 +▁militar 1 +▁supervisión 1 +▁Internet 1 +▁podía 1 +▁Ra 1 +▁estaban 1 +▁hacen 1 +▁car 1 +ana 1 +▁obligación 1 +▁situaciones 1 +▁pasa 1 +▁Asimismo 1 +9 1 +▁tortura 1 +▁permite 1 +▁familias 1 +▁H 1 +pu 1 +▁satisfacción 1 +▁supuesto 1 +min 1 +▁50 1 +ales 1 +▁entidades 1 +▁na 1 +▁afirma 1 +▁infraestructura 1 +▁escuelas 1 +▁pequeñas 1 +▁San 1 +▁posición 1 +mp 1 +▁fi 1 +▁funciona 1 +▁Congo 1 +▁misiones 1 +zo 1 +.4 1 +▁cierto 1 +10 1 +▁material 1 +▁superior 1 +▁sección 1 +▁económicos 1 +▁humana 1 +▁luz 1 +▁apoya 1 +gen 1 +▁línea 1 +▁Ho 1 +▁pide 1 +am 1 +ña 1 +▁apartado 1 +▁India 1 +▁cambios 1 +mar 1 +ces 1 +▁democracia 1 +▁ho 1 +▁global 1 +▁anual 1 +▁adoptado 1 +K 1 +ina 1 +▁usar 1 +ero 1 +nda 1 +▁capital 1 +io 1 +cos 1 +ed 1 +▁participantes 1 +▁juicio 1 +fo 1 +▁dirección 1 +▁palabra 1 +▁violación 1 +▁contribuir 1 +▁pena 1 +▁figuran 1 +▁intercambio 1 +▁solicitud 1 +▁mejores 1 +▁incluidas 1 +▁Sala 1 +▁alta 1 +▁comunicaciones 1 +▁cantidad 1 +▁última 1 +▁financieras 1 +▁suficiente 1 +▁titulado 1 +▁oficiales 1 +▁cultura 1 +▁actualmente 1 +▁graves 1 +▁trans 1 +▁oficial 1 +▁tenga 1 +▁allí 1 +▁firma 1 +▁universal 1 +ment 1 +▁marcha 1 +▁padres 1 +▁29 1 +▁industria 1 +▁asociados 1 +▁preocupa 1 +▁alcance 1 +▁invita 1 +gar 1 +▁respecta 1 +▁V 1 +ex 1 +▁diferencia 1 +▁tráfico 1 +cion 1 +▁siguen 1 +▁2000, 1 +▁pidió 1 +▁públicos 1 +▁mal 1 +▁carta 1 +▁Entonces 1 +▁condición 1 +▁relativos 1 +ye 1 +▁camino 1 +▁compromisos 1 +▁PNUD 1 +▁recomendación 1 +▁com 1 +▁semana 1 +▁alrededor 1 +0 1 +.3 1 +rre 1 +▁armados 1 +▁detención 1 +▁continuación 1 +wa 1 +▁Presidencia 1 +▁tribunales 1 +bilidad 1 +bles 1 +▁tengan 1 +llo 1 +▁tierra 1 +sen 1 +ka 1 +▁finales 1 +▁Federación 1 +▁expresa 1 +▁acciones 1 +▁Entre 1 +▁carga 1 +▁eliminar 1 +▁distintos 1 +▁funcionamiento 1 +▁circunstancias 1 +▁elaborar 1 +▁Justicia 1 +▁ri 1 +▁donantes 1 +▁man 1 +▁pensar 1 +▁entorno 1 +▁desarrollar 1 +habla 1 +▁tercer 1 +▁contar 1 +▁Li 1 +▁procesos 1 +▁Derecho 1 +▁refiere 1 +▁directrices 1 +▁van 1 +▁reglamento 1 +▁Afganistán 1 +▁Segú 1 +▁modelo 1 +▁hi 1 +dad 1 +▁Creo 1 +art 1 +▁jurídico 1 +▁Bo 1 +▁seguro 1 +▁pobres 1 +▁dejar 1 +▁cosa 1 +tivos 1 +▁be 1 +▁esté 1 +▁existentes 1 +▁ce 1 +▁incluido 1 +▁dificultades 1 +▁comerciales 1 +aciones 1 +▁propiedad 1 +▁DE 1 +lle 1 +50 1 +ut 1 +▁drogas 1 +▁previsto 1 +▁considerar 1 +▁dispone 1 +▁razones 1 +▁res 1 +▁reconoce 1 +▁hu 1 +▁Todos 1 +▁adicionales 1 +▁naturales 1 +▁plena 1 +▁fe 1 +▁2005, 1 +▁establece 1 +rían 1 +▁deseo 1 +remos 1 +▁Administración 1 +tribu 1 +▁tecnologías 1 +▁única 1 +▁perspectiva 1 +▁paso 1 +▁mu 1 +▁ob 1 +▁cambiar 1 +▁interesados 1 +qué 1 +▁can 1 +ad 1 +▁estabilidad 1 +▁construcción 1 +▁humano 1 +▁eliminación 1 +▁W 1 +▁financiero 1 +ia 1 +▁confianza 1 +▁anti 1 +▁humanitaria 1 +▁materiales 1 +▁J 1 +tri 1 +▁quisiera 1 +▁efectiva 1 +▁anteriores 1 +dio 1 +▁cuya 1 +ton 1 +▁pruebas 1 +▁Canadá 1 +can 1 +▁– 1 +▁hombre 1 +▁oficinas 1 +té 1 +▁Japón 1 +tura 1 +▁Francia 1 +▁pequeños 1 +▁tasa 1 +▁prevenir 1 +▁económicas 1 +▁decidió 1 +▁tendrá 1 +▁opiniones 1 +▁contribución 1 +▁éste 1 +pen 1 +▁criterios 1 +▁determinación 1 +tera 1 +▁conseguir 1 +▁UNICEF 1 +▁hora 1 +▁queda 1 +▁producto 1 +▁dicha 1 +▁Banco 1 +▁conocimiento 1 +▁prevé 1 +▁verdad 1 +bu 1 +▁tribunal 1 +▁básicos 1 +▁culturales 1 +ol 1 +▁conclusiones 1 +cre 1 +▁entender 1 +▁Gracias 1 +▁Yo 1 +▁acoge 1 +▁encuentra 1 +▁Gran 1 +▁2001, 1 +AC 1 +▁climático 1 +▁quien 1 +▁profesional 1 +▁aplica 1 +▁2003, 1 +▁planificación 1 +▁conferencias 1 +▁40 1 +▁necesaria 1 +▁prioridades 1 +▁web 1 +▁tuvo 1 +ig 1 +▁dirigida 1 +Y 1 +▁60 1 +▁trabajos 1 +▁naturaleza 1 +▁recibido 1 +▁Eso 1 +▁presentó 1 +▁extra 1 +ario 1 +et 1 +▁siglo 1 +▁Comisionado 1 +▁escuela 1 +▁esencial 1 +▁tengo 1 +▁formular 1 +▁física 1 +▁presencia 1 +gan 1 +spe 1 +▁UN 1 +▁valores 1 +▁beneficios 1 +mento 1 +rias 1 +nu 1 +▁Países 1 +▁estima 1 +▁Presidenta 1 +▁proliferación 1 +mas 1 +▁señaló 1 +▁directamente 1 +▁transición 1 +▁posibles 1 +▁Mujer 1 +tan 1 +▁2004, 1 +▁comercial 1 +▁diseño 1 +▁mercados 1 +sto 1 +tica 1 +▁informar 1 +cur 1 +▁duda 1 +▁Norte 1 +▁reforzar 1 +▁2006, 1 +▁gra 1 +▁explotación 1 +▁Información 1 +▁entrada 1 +▁distribución 1 +▁2002, 1 +▁motivos 1 +▁permitir 1 +▁existen 1 +▁Ex 1 +▁Pe 1 +▁jurídica 1 +▁evaluar 1 +▁agentes 1 +▁transferencia 1 +nta 1 +15 1 +▁algún 1 +▁División 1 +▁combatir 1 +▁existencia 1 +▁independencia 1 +cas 1 +▁lleva 1 +izado 1 +▁europea 1 +▁fortalecimiento 1 +der 1 +▁cuerpo 1 +rro 1 +▁tipos 1 +▁asunto 1 +▁do 1 +▁exp 1 +▁Instituto 1 +▁Director 1 +▁fuerte 1 +ándose 1 +dica 1 +▁preparar 1 +▁puntos 1 +▁realizado 1 +▁serán 1 +▁clave 1 +▁fuentes 1 +▁fomentar 1 +nia 1 +▁Recordando 1 +at 1 +▁internos 1 +▁métodos 1 +▁mismos 1 +ctor 1 +▁infantil 1 +▁grado 1 +▁instalaciones 1 +▁bastante 1 +▁gustaría 1 +▁términos 1 +▁oficina 1 +▁Kosovo 1 +▁autoridad 1 +▁Na 1 +▁Pide 1 +▁preguntas 1 +▁cultural 1 +▁territorios 1 +▁alguien 1 +▁Ta 1 +▁Foro 1 +▁menudo 1 +▁pasar 1 +▁pesca 1 +▁señalar 1 +lí 1 +sos 1 +▁terroristas 1 +▁visto 1 +có 1 +La 1 +▁corre 1 +ste 1 +▁Véase 1 +fu 1 +W 1 +▁Ginebra 1 +▁habría 1 +▁Ka 1 +▁Sudán 1 +▁órgano 1 +▁Consultiva 1 +▁Niño 1 +▁fomento 1 +▁completo 1 +▁prioridad 1 +iera 1 +org 1 +▁motivo 1 +▁¡ 1 +▁distintas 1 +▁celebrar 1 +▁cuentas 1 +▁deberá 1 +lar 1 +▁refleja 1 +▁Ar 1 +xi 1 +▁defensa 1 +ke 1 +▁propone 1 +iza 1 +▁1997 1 +▁asimismo 1 +par 1 +▁extraordinario 1 +▁muestra 1 +▁claramente 1 +▁basa 1 +▁pu 1 +▁abierta 1 +▁próximo 1 +▁vigilancia 1 +▁llega 1 +▁permanente 1 +para 1 +▁venta 1 +ine 1 +▁discapacidad 1 +▁menor 1 +pare 1 +▁abarca 1 +▁baja 1 +nal 1 +▁tratado 1 +▁m 1 +stru 1 +ie 1 +▁solicita 1 +▁Bueno 1 +▁consulta 1 +▁México 1 +▁voluntad 1 +▁Alemania 1 +▁palestino 1 +▁saben 1 +▁prestación 1 +▁responsables 1 +▁Ja 1 +▁Com 1 +▁deuda 1 +▁demasiado 1 +▁diferente 1 +▁conforme 1 +▁(19 1 +▁categoría 1 +sh 1 +▁cor 1 +rnos 1 +pon 1 +▁Ju 1 +nt 1 +▁tareas 1 +Cómo 1 +▁buen 1 +_ 1 +▁concretas 1 +▁depende 1 +▁miles 1 +▁inversión 1 +▁totalmente 1 +▁exige 1 +▁ocupa 1 +▁ciencia 1 +idades 1 +▁preciso 1 +▁humanitario 1 +▁enfermedades 1 +▁grave 1 +nto 1 +▁cerebro 1 +▁cuarto 1 +▁ustedes 1 +▁1996 1 +▁puedo 1 +▁progreso 1 +▁Comunidad 1 +▁visita 1 +son 1 +▁Irlanda 1 +▁costos 1 +▁integrado 1 +▁condena 1 +▁Oriente 1 +▁creado 1 +OS 1 +▁ésta 1 +▁enmiendas 1 +▁bu 1 +▁Mu 1 +▁precios 1 +▁costo 1 +able 1 +▁s 1 +▁prueba 1 +▁sanciones 1 +▁fácil 1 +cal 1 +▁pago 1 +▁primero 1 +▁2007, 1 +mb 1 +pro 1 +▁públicas 1 +▁fu 1 +ced 1 +▁Hotel 1 +▁riesgos 1 +▁Ya 1 +▁ideas 1 +▁adecuada 1 +▁debía 1 +▁alimentos 1 +tin 1 +▁du 1 +ki 1 +▁mayores 1 +▁Cooperación 1 +▁Sur 1 +▁Estos 1 +▁marca 1 +ou 1 +ud 1 +▁causas 1 +▁responder 1 +▁Proyecto 1 +▁máximo 1 +No 1 +▁directa 1 +cía 1 +▁simplemente 1 +▁pleno 1 +▁destrucción 1 +▁2009 1 +▁informa 1 +▁ahí 1 +oc 1 +5% 1 +ifica 1 +▁ofrecer 1 +land 1 +om 1 +▁mínimo 1 +▁1998 1 +dió 1 +▁Corea 1 +▁estén 1 +▁reciente 1 +▁Brasil 1 +▁Toma 1 +cida 1 +mba 1 +▁aprobar 1 +▁principalmente 1 +▁asesoramiento 1 +20 1 +rica 1 +▁mucha 1 +▁Cuba 1 +▁mejora 1 +▁tarea 1 +▁particularmente 1 +▁mano 1 +▁soluciones 1 +▁eficaces 1 +▁Turquía 1 +▁ti 1 +▁llamamiento 1 +▁Servicio 1 +puesta 1 +bor 1 +▁urgente 1 +▁redes 1 +▁esperanza 1 +ER 1 +▁Comisario 1 +▁posibilidades 1 +▁importa 1 +▁palestinos 1 +▁profesionales 1 +▁investigaciones 1 +▁registro 1 +11 1 +▁Reunión 1 +▁asociación 1 +▁actuales 1 +▁mitad 1 +▁« 1 +▁propuesto 1 +des 1 +▁crea 1 +▁quincuagésimo 1 +▁párrafos 1 +▁sexo 1 +▁viven 1 +° 1 +▁Lu 1 +▁electrónico 1 +▁ordinario 1 +▁mil 1 +▁comunes 1 +▁inversiones 1 +▁100 1 +ció 1 +▁consenso 1 +▁volver 1 +▁Reglamento 1 +▁continua 1 +▁examina 1 +▁mundiales 1 +▁emp 1 +▁hechos 1 +▁vincula 1 +ante 1 +▁emergencia 1 +▁realización 1 +clu 1 +▁libertades 1 +▁celebrado 1 +CI 1 +▁rápido 1 +▁cabe 1 +▁recientemente 1 +til 1 +▁An 1 +▁Que 1 +▁Salud 1 +im 1 +▁indicadores 1 +▁Servicios 1 +▁estudiantes 1 +mu 1 +▁garantiza 1 +▁interesante 1 +Por 1 +▁resto 1 +▁activa 1 +▁conclusión 1 +torio 1 +▁pequeño 1 +▁rurales 1 +▁transparencia 1 +iva 1 +▁revisión 1 +▁logro 1 +▁Fa 1 +▁adicional 1 +▁ci 1 +és 1 +▁ponente 1 +▁Estas 1 +12 1 +▁mañana 1 +mit 1 +▁enmienda 1 +▁necesitan 1 +.9 1 +▁clara 1 +lan 1 +▁celebra 1 +▁legal 1 +▁ta 1 +▁realizados 1 +▁contratación 1 +▁Ga 1 +▁institucional 1 +▁períodos 1 +▁haga 1 +▁beneplácito 1 +▁grande 1 +▁responsable 1 +▁racial 1 +▁propios 1 +▁1995 1 +gos 1 +▁minutos 1 +▁Palestina 1 +via 1 +▁europeos 1 +qu 1 +▁implica 1 +▁preparado 1 +▁enviar 1 +sis 1 +▁hincapié 1 +AR 1 +ice 1 +▁comenzar 1 +▁extranjeros 1 +▁familiar 1 +▁especializados 1 +dia 1 +▁sol 1 +▁requisitos 1 +▁España 1 +▁normal 1 +▁mes 1 +▁orientación 1 +▁firme 1 +▁Africana 1 +▁Irán 1 +ju 1 +ieran 1 +▁2008, 1 +▁ciudades 1 +▁To 1 +40 1 +bri 1 +▁inicial 1 +▁Ejecutivo 1 +▁media 1 +▁ru 1 +met 1 +▁ambos 1 +▁definición 1 +▁llama 1 +▁presta 1 +▁multi 1 +▁disponibles 1 +X 1 +25 1 +amiento 1 +gui 1 +▁Organismo 1 +▁celebró 1 +▁bi 1 +▁Pre 1 +▁sur 1 +▁vulnerables 1 +▁etc 1 +toria 1 +▁factores 1 +▁Mesa 1 +▁constituyen 1 +ry 1 +▁consumo 1 +% 1 +ko 1 +▁queremos 1 +▁viaje 1 +▁simple 1 +idos 1 +▁respuestas 1 +▁contiene 1 +▁versión 1 +▁encuentran 1 +▁imagen 1 +yo 1 +ito 1 +eo 1 +▁minorías 1 +▁qui 1 +▁Porque 1 +▁capítulo 1 +ES 1 +▁contrario 1 +El 1 +▁Hace 1 +▁petición 1 +▁afectados 1 +▁aquellos 1 +▁conocer 1 +▁interior 1 +▁actuar 1 +?" 1 +aba 1 +▁voy 1 +▁fase 1 +▁adelante 1 +▁asociaciones 1 +▁allá 1 +▁Caribe 1 +▁Dis 1 +▁llamado 1 +▁desempeñar 1 +cul 1 +▁conjunta 1 +▁Leona 1 +gado 1 +nce 1 +▁UNCTAD 1 +▁construir 1 +▁Bu 1 +▁empezar 1 +▁tarde 1 +▁siga 1 +▁difusión 1 +▁planeta 1 +▁Líbano 1 +▁comisión 1 +▁únicamente 1 +▁v 1 +▁contrato 1 +30 1 +▁Facultativo 1 +▁campo 1 +▁podrán 1 +▁etapa 1 +▁Comercio 1 +▁diversidad 1 +▁noche 1 +▁página 1 +▁solamente 1 +▁prohibición 1 +J 1 +ger 1 +▁Examen 1 +▁constante 1 +▁potencial 1 +▁intención 1 +▁garantías 1 +vis 1 +▁cal 1 +▁encargado 1 +▁efectivo 1 +▁pedir 1 +▁Tenemos 1 +▁plano 1 +tina 1 +▁quiere 1 +amente 1 +▁tri 1 +una 1 +▁europeo 1 +▁deberán 1 +▁reservas 1 +▁arte 1 +▁Sierra 1 +▁calle 1 +▁breve 1 +▁masa 1 +▁informó 1 +▁competentes 1 +▁celebrará 1 +ivo 1 +▁madre 1 +▁título 1 +▁propósito 1 +▁Educación 1 +▁Ejecutiva 1 +▁expresión 1 +▁sabemos 1 +AN 1 +UN 1 +▁enorme 1 +▁tenían 1 +▁1° 1 +▁conferencia 1 +▁recordar 1 +▁entrega 1 +▁supone 1 +▁Exteriores 1 +▁interno 1 +▁estudiar 1 +▁abierto 1 +▁ONG 1 +▁Pacífico 1 +▁trabajando 1 +▁Fi 1 +▁Australia 1 +▁denuncia 1 +13 1 +▁destaca 1 +▁velar 1 +dora 1 +▁Relaciones 1 +▁cuotas 1 +▁familiares 1 +▁garantía 1 +▁1990 1 +▁Árabe 1 +ere 1 +▁Go 1 +▁pie 1 +▁celebración 1 +▁Quiero 1 +rme 1 +▁estratégico 1 +▁técnicas 1 +mer 1 +▁conciencia 1 +op 1 +▁próxima 1 +▁III 1 +▁licencia 1 +▁ámbitos 1 +▁Italia 1 +▁aprobada 1 +▁minas 1 +▁bueno 1 +▁ampliar 1 +▁basada 1 +▁afecta 1 +▁pequeña 1 +▁confirma 1 +rí 1 +▁vamos 1 +▁... 1 +▁isla 1 +▁debates 1 +▁actualidad 1 +ura 1 +▁religión 1 +▁Ne 1 +anza 1 +▁corresponde 1 +val 1 +▁Ese 1 +▁matrimonio 1 +▁solicitudes 1 +▁Hi 1 +▁h 1 +cta 1 +▁Después 1 +▁requiere 1 +tada 1 +▁jurídicos 1 +rea 1 +.7 1 +▁Occidental 1 +▁proporciona 1 +▁continuar 1 +▁recuperación 1 +▁daños 1 +▁cita 1 +▁formulación 1 +▁juego 1 +▁expresar 1 +-20 1 +▁hubiera 1 +▁bienestar 1 +▁precio 1 +▁semanas 1 +▁contacto 1 +ez 1 +▁luchar 1 +nza 1 +▁Ni 1 +▁aprovechar 1 +▁llegado 1 +▁sala 1 +▁necesitamos 1 +▁conducto 1 +▁trato 1 +▁Do 1 +▁Política 1 +▁busca 1 +▁Subcomisión 1 +duc 1 +▁nadie 1 +▁dio 1 +▁pérdida 1 +▁Timor 1 +id 1 +tí 1 +▁poblaciones 1 +▁Guinea 1 +▁natural 1 +▁somos 1 +▁esfuerzo 1 +▁clientes 1 +▁Anexo 1 +▁impacto 1 +▁habitaciones 1 +▁vivienda 1 +▁prisión 1 +▁aproximadamente 1 +▁plantea 1 +▁Asociación 1 +▁creciente 1 +▁examinado 1 +▁estrecha 1 +em 1 +ist 1 +▁evolución 1 +▁justo 1 +▁Algunos 1 +▁código 1 +▁clase 1 +▁ocupación 1 +▁intervención 1 +▁humanidad 1 +▁habrá 1 +▁Bosnia 1 +▁Todo 1 +▁habla 1 +▁ampliación 1 +14 1 +▁Inter 1 +▁avances 1 +▁impedir 1 +▁sexagésimo 1 +▁pone 1 +nar 1 +▁Ve 1 +▁cap 1 +MI 1 +▁Uno 1 +mor 1 +flu 1 +▁mental 1 +▁evidente 1 +▁diferencias 1 +▁educa 1 +▁adhesión 1 +▁tercera 1 +tel 1 +▁"¿ 1 +▁Dependencia 1 +▁fuente 1 +antes 1 +▁Pakistán 1 +ula 1 +» 1 +▁honor 1 +▁sabe 1 +▁frecuencia 1 +▁economías 1 +▁útil 1 +ld 1 +▁Son 1 +cina 1 +▁0 1 +▁movimiento 1 +gó 1 +▁suficientes 1 +▁recurso 1 +▁rec 1 +▁fra 1 +▁examinó 1 +▁visión 1 +lin 1 +▁Pública 1 +▁utiliza 1 +▁fronteras 1 +▁aspecto 1 +▁identidad 1 +▁logrado 1 +▁tierras 1 +▁acto 1 +▁hicieron 1 +.6 1 +▁nacionalidad 1 +▁idiomas 1 +▁Nos 1 +▁aire 1 +▁interesadas 1 +▁ref 1 +rma 1 +▁acaba 1 +▁Cada 1 +dic 1 +▁rápidamente 1 +▁Universidad 1 +▁facilita 1 +▁mesa 1 +▁Je 1 +▁incluyen 1 +▁estadísticas 1 +▁Está 1 +dida 1 +▁aceptar 1 +▁corrupción 1 +▁judiciales 1 +▁partida 1 +▁oficiosas 1 +rico 1 +ea 1 +▁exterior 1 +▁Sudáfrica 1 +tico 1 +▁orador 1 +▁2010 1 +▁Tiene 1 +▁come 1 +▁compra 1 +▁médico 1 +▁Hemos 1 +izada 1 +▁elección 1 +▁destino 1 +▁enfermedad 1 +▁probablemente 1 +▁autores 1 +▁periódico 1 +▁1994 1 +▁opciones 1 +rgi 1 +▁comportamiento 1 +▁acontecimientos 1 +▁Man 1 +▁excelente 1 +cl 1 +▁Pi 1 +▁agricultura 1 +▁inf 1 +▁siete 1 +▁cambia 1 +18 1 +▁inclusión 1 +▁representación 1 +▁soy 1 +tt 1 +▁duración 1 +▁ju 1 +▁obstáculos 1 +▁Aquí 1 +▁Tras 1 +▁l 1 +▁opera 1 +▁mensaje 1 +tarios 1 +▁cursos 1 +▁ilícito 1 +stra 1 +▁elemento 1 +▁Estamos 1 +▁eficiencia 1 +bre 1 +aje 1 +* 1 +▁indemnización 1 +— 1 +▁animales 1 +▁adecuado 1 +▁recientes 1 +▁Herzegovina 1 +▁bar 1 +▁sé 1 +▁Desarme 1 +▁Bajos 1 +▁op 1 +▁Sociales 1 +▁vidas 1 +▁dije 1 +▁Wa 1 +▁plenaria 1 +▁adelantados 1 +▁consolidación 1 +▁directo 1 +▁reformas 1 +▁Ki 1 +▁israelíes 1 +ica 1 +ly 1 +port 1 +▁extranjero 1 +▁acompaña 1 +▁ajuste 1 +▁ataques 1 +▁trabaja 1 +▁privada 1 +▁pronto 1 +60 1 +rlo 1 +▁dirigentes 1 +ible 1 +▁mostrar 1 +ino 1 +endo 1 +▁gusta 1 +▁reitera 1 +ab 1 +IT 1 +▁hogar 1 +▁crédito 1 +▁seguirá 1 +▁Sede 1 +▁búsqueda 1 +▁decenio 1 +▁campaña 1 +▁basado 1 +▁Comp 1 +▁categorías 1 +▁llamada 1 +▁Popular 1 +iente 1 +▁dan 1 +siona 1 +▁activamente 1 +▁comprendido 1 +▁ONU 1 +ite 1 +16 1 +▁observó 1 +▁Fue 1 +▁considerable 1 +▁Egipto 1 +▁equipos 1 +▁constitucional 1 +▁occidental 1 +▁increíble 1 +ificación 1 +liza 1 +▁Viena 1 +▁tradicionales 1 +▁Protección 1 +▁termina 1 +▁jurisdicción 1 +▁específicas 1 +▁Car 1 +AD 1 +▁super 1 +▁Suiza 1 +día 1 +van 1 +▁regular 1 +▁rep 1 +▁eficiente 1 +▁Uds 1 +▁Latina 1 +▁Cu 1 +▁candidatos 1 +▁directiva 1 +jan 1 +oso 1 +▁Islámica 1 +▁organizar 1 +▁primeros 1 +pla 1 +▁reconocer 1 +▁pagar 1 +▁explica 1 +( 1 +▁Colombia 1 +▁conducta 1 +▁vivir 1 +▁teléfono 1 +vert 1 +▁participa 1 +▁completamente 1 +▁denuncias 1 +De 1 +ento 1 +cial 1 +▁supra 1 +▁oferta 1 +▁profunda 1 +sion 1 +▁rehabilitación 1 +▁centra 1 +▁emisiones 1 +▁suministro 1 +▁The 1 +▁Insta 1 +▁primaria 1 +▁sucede 1 +▁infancia 1 +tiendo 1 +▁doble 1 +▁Nota 1 +▁chi 1 +▁k 1 +▁ilegal 1 +▁Somalia 1 +▁Yugoslavia 1 +▁otorga 1 +▁Kuwait 1 +17 1 +▁laboral 1 +▁1999, 1 +▁producir 1 +▁experiencias 1 +▁Gestión 1 +▁formuladas 1 +cimiento 1 +▁asilo 1 +▁san 1 +▁Gu 1 +▁ciclo 1 +▁señora 1 +▁atender 1 +MA 1 +▁oriental 1 +fund 1 +▁dichos 1 +CE 1 +▁hacemos 1 +▁establecidos 1 +▁realiza 1 +▁migrantes 1 +▁razonable 1 +▁español 1 +ide 1 +▁So 1 +▁reglas 1 +ión 1 +ñ 1 +▁hablando 1 +én 1 +01 1 +▁amigos 1 +▁cuidado 1 +▁tomó 1 +▁composición 1 +▁expresó 1 +▁asigna 1 +▁compartir 1 +▁trabajan 1 +gel 1 +▁tendría 1 +▁hijo 1 +▁enfrenta 1 +/19 1 +▁estructuras 1 +▁deliberaciones 1 +▁combina 1 +▁acta 1 +▁positiva 1 +cip 1 +▁rápida 1 +mbre 1 +▁Presupuesto 1 +▁porcentaje 1 +we 1 +▁comienzo 1 +▁Expertos 1 +▁concluir 1 +▁usuarios 1 +▁consigna 1 +▁levanta 1 +pri 1 +▁disponible 1 +▁entra 1 +▁tomado 1 +▁Noruega 1 +▁sistemática 1 +▁Sección 1 +▁médicos 1 +cor 1 +▁Señorías 1 +ev 1 +▁demostrado 1 +nder 1 +▁imágenes 1 +▁X 1 +▁Indonesia 1 +▁Hoy 1 +▁propias 1 +▁comunitario 1 +▁Tierra 1 +▁multilaterales 1 +▁desplazados 1 +ificado 1 +▁integrada 1 +▁fiscal 1 +DE 1 +▁iniciar 1 +▁técnico 1 +▁hagan 1 +▁Estatuto 1 +jas 1 +▁alimentaria 1 +▁Ucrania 1 +table 1 +▁jurídicas 1 +gubernamentales 1 +▁costa 1 +▁desafíos 1 +▁desastres 1 +ones 1 +▁Central 1 +▁previstos 1 +▁ACNUR 1 +▁pertinente 1 +ion 1 +▁lado 1 +▁pocos 1 +▁ambas 1 +ua 1 +▁radio 1 +▁Señora 1 +▁incorporar 1 +▁Ri 1 +▁término 1 +▁fenómeno 1 +▁Rwanda 1 +▁Argentina 1 +▁mandatos 1 +▁estratégica 1 +▁integridad 1 +aria 1 +▁especie 1 +▁decidir 1 +bar 1 +▁temporal 1 +▁sentencia 1 +▁favorable 1 +chi 1 +▁escolar 1 +▁w 1 +▁ocho 1 +▁35 1 +vie 1 +▁clima 1 +▁euros 1 +▁im 1 +IS 1 +▁distrito 1 +▁libro 1 +▁Bien 1 +▁instancia 1 +▁Económica 1 +▁recomendó 1 +▁Estrategia 1 +lia 1 +▁compara 1 +▁servir 1 +▁presentes 1 +▁intento 1 +▁Ello 1 +EN 1 +▁publicación 1 +ano 1 +▁industrial 1 +▁Aplicación 1 +▁Oriental 1 +▁médica 1 +dera 1 +▁científicos 1 +▁adolescentes 1 +▁Suecia 1 +▁estatuto 1 +▁técnicos 1 +▁dirigido 1 +icio 1 +▁tamaño 1 +▁alienta 1 +▁estipula 1 +▁petróleo 1 +▁cifras 1 +▁reafirma 1 +▁empleados 1 +▁contribuye 1 +▁africanos 1 +Se 1 +▁desarrollados 1 +▁logros 1 +▁remo 1 +▁presidente 1 +▁Económicos 1 +▁Embajador 1 +▁pedido 1 +▁científica 1 +▁♫ 1 +vers 1 +▁% 1 +▁norte 1 +▁legislativo 1 +▁Tal 1 +▁amenazas 1 +▁dependencia 1 +▁moral 1 +▁viola 1 +▁residencia 1 +▁tasas 1 +ner 1 +▁electrónica 1 +▁repercusiones 1 +mbra 1 +▁fuego 1 +/20 1 +▁opción 1 +▁tratos 1 +▁consideración 1 +▁buscar 1 +▁características 1 +▁racismo 1 +▁prensa 1 +▁padre 1 +▁Marco 1 +▁sociedades 1 +▁Z 1 +99 1 +IC 1 +▁restricciones 1 +▁consiste 1 +▁interpretación 1 +▁Documentos 1 +resolución 1 +▁000 1 +▁sola 1 +ts 1 +▁respetar 1 +▁espíritu 1 +▁sustantivo 1 +▁45 1 +En 1 +▁voto 1 +▁dónde 1 +▁entrar 1 +▁Delito 1 +ores 1 +sal 1 +▁Va 1 +▁normativa 1 +▁participan 1 +mé 1 +▁obra 1 +▁organizada 1 +▁Pu 1 +▁Nuestro 1 +▁institución 1 +▁ejercer 1 +▁crímenes 1 +tima 1 +▁entendimiento 1 +▁terceros 1 +▁capacidades 1 +▁aplicable 1 +▁organizado 1 +▁norma 1 +▁superar 1 +CP 1 +eros 1 +▁(1 1 +▁Hu 1 +AS 1 +▁Nigeria 1 +▁Serbia 1 +▁exposición 1 +ral 1 +▁reclamaciones 1 +tergubernamental 1 +zar 1 +▁demuestra 1 +▁francés 1 +gua 1 +▁comisiones 1 +hu 1 +97 1 +▁ambientales 1 +▁rechaza 1 +▁inferior 1 +▁intenta 1 +lega 1 +▁Liberia 1 +▁Ge 1 +▁Islas 1 +Es 1 +est 1 +▁cree 1 +▁transmit 1 +▁individual 1 +ay 1 +▁democrático 1 +▁limitado 1 +▁Muchas 1 +▁idioma 1 +tero 1 +▁Burundi 1 +▁destinados 1 +▁ciertas 1 +▁Jo 1 +▁dichas 1 +▁carrera 1 +▁pudiera 1 +▁subraya 1 +▁elegir 1 +RI 1 +pul 1 +▁áreas 1 +▁manos 1 +▁Estoy 1 +▁larga 1 +▁contratos 1 +▁comunitaria 1 +▁Ambiente 1 +▁operacionales 1 +▁llevado 1 +▁Puede 1 +ico 1 +▁desarrolla 1 +mica 1 +ff 1 +▁delincuencia 1 +▁ambiental 1 +▁podían 1 +▁foto 1 +ología 1 +▁habitantes 1 +▁Siria 1 +OM 1 +▁debidamente 1 +▁Decide 1 +▁Primer 1 +illo 1 +▁área 1 +▁democrática 1 +▁hacía 1 +▁em 1 +▁Coordinación 1 +ena 1 +bla 1 +▁equilibrio 1 +▁Bi 1 +▁aborda 1 +▁preocupaciones 1 +▁iba 1 +stro 1 +▁ratificación 1 +03 1 +ent 1 +▁colegas 1 +▁colectiva 1 +.1) 1 +▁similares 1 +▁Cámara 1 +▁solidaridad 1 +▁elaborado 1 +udi 1 +▁éstos 1 +▁inmediatamente 1 +zi 1 +▁fo 1 +▁Otros 1 +▁Pen 1 +▁mismas 1 +▁Ad 1 +▁árabe 1 +▁complejo 1 +▁Chile 1 +▁recuerda 1 +▁provoca 1 +▁48 1 +▁comida 1 +▁vemos 1 +▁activos 1 +▁quería 1 +▁aprender 1 +▁fija 1 +au 1 +/4 1 +/58/ 1 +▁consentimiento 1 +▁digital 1 +▁oradores 1 +▁puesta 1 +▁Cuadro 1 +▁quizá 1 +▁esenciales 1 +▁detallada 1 +▁ocasión 1 +fri 1 +▁índole 1 +▁alentar 1 +▁determinados 1 +AL 1 +▁quién 1 +▁comparación 1 +▁Chipre 1 +▁indicado 1 +▁generación 1 +▁Prevención 1 +▁reales 1 +▁sede 1 +▁aéreo 1 +cita 1 +▁continúa 1 +▁1993 1 +▁regula 1 +▁quieren 1 +45 1 +▁podido 1 +▁Be 1 +▁estados 1 +▁color 1 +ial 1 +▁bilaterales 1 +96 1 +▁CA 1 +▁col 1 +izados 1 +lé 1 +/55/ 1 +bro 1 +ín 1 +▁concretos 1 +▁producido 1 +▁proceda 1 +▁original 1 +form 1 +▁componente 1 +▁federal 1 +▁música 1 +tores 1 +▁mira 1 +▁t 1 +▁seres 1 +▁procesa 1 +▁sustancias 1 +▁diez 1 +▁beneficio 1 +▁viene 1 +▁cri 1 +serv 1 +▁32 1 +▁meta 1 +cional 1 +▁intelectual 1 +▁inmediato 1 +▁ocasiones 1 +cien 1 +▁presión 1 +▁posterior 1 +▁2005. 1 +ler 1 +scripción 1 +mbi 1 +ord 1 +▁Debe 1 +▁For 1 +▁buenas 1 +▁exhorta 1 +▁solicitar 1 +▁externa 1 +▁componentes 1 +cciones 1 +ien 1 +duzca 1 +ation 1 +▁seguido 1 +▁34 1 +ndido 1 +mática 1 +▁Marruecos 1 +▁operación 1 +▁37 1 +▁tendencia 1 +▁vecinos 1 +▁Federal 1 +illa 1 +▁computadora 1 +▁definitiva 1 +fre 1 +▁protocolo 1 +▁54 1 +▁Personal 1 +▁demora 1 +uda 1 +▁Apoyo 1 +▁tampoco 1 +eg 1 +▁Per 1 +▁separado 1 +▁cáncer 1 +▁ilícita 1 +▁consumidores 1 +UR 1 +▁Ru 1 +▁esperar 1 +▁et 1 +▁anteriormente 1 +▁cara 1 +/3 1 +▁vía 1 +▁Costa 1 +▁acordado 1 +▁Ministros 1 +▁encaminadas 1 +ego 1 +▁partidos 1 +▁explicar 1 +ow 1 +▁prestando 1 +▁numerosas 1 +▁tuviera 1 +▁segura 1 +▁hogares 1 +▁unidad 1 +▁permita 1 +▁numerosos 1 +▁básica 1 +▁pas 1 +▁crítica 1 +/59/ 1 +iéndose 1 +pos 1 +▁Regional 1 +▁significativa 1 +▁administrativas 1 +dí 1 +▁Más 1 +ual 1 +▁halla 1 +liber 1 +mite 1 +▁Era 1 +▁edificio 1 +▁Darfur 1 +▁Cuestiones 1 +▁nombramiento 1 +▁sentir 1 +▁corto 1 +▁debían 1 +▁Les 1 +ndi 1 +▁salir 1 +NU 1 +▁bosques 1 +▁realizada 1 +▁despliegue 1 +▁Web 1 +35 1 +▁puerta 1 +▁empresarial 1 +▁encargada 1 +▁brinda 1 +▁Gaza 1 +▁ten 1 +▁reconstrucción 1 +▁Haití 1 +▁quinto 1 +▁Sistema 1 +▁estableció 1 +ji 1 +▁observadores 1 +▁Ko 1 +▁calcula 1 +▁terminar 1 +▁rural 1 +▁mortalidad 1 +▁límites 1 +▁Des 1 +▁Bretaña 1 +▁incluya 1 +▁película 1 +▁excepción 1 +▁Human 1 +▁secundaria 1 +▁próximos 1 +▁cámara 1 +▁dignidad 1 +/5 1 +ier 1 +rlos 1 +cido 1 +rd 1 +cept 1 +▁gas 1 +rte 1 +▁genera 1 +▁multilateral 1 +▁presentada 1 +▁Austria 1 +▁fund 1 +▁cabeza 1 +▁detenidos 1 +▁ordenación 1 +▁33 1 +▁recon 1 +arse 1 +▁auditoría 1 +▁representan 1 +▁avanzar 1 +Ivoire 1 +▁Discriminación 1 +▁hará 1 +▁entidad 1 +▁analizar 1 +▁destacar 1 +▁adecuadas 1 +▁Autoridad 1 +▁arma 1 +▁conexas 1 +▁identificar 1 +▁ii 1 +▁video 1 +▁afectan 1 +▁abs 1 +orient 1 +mó 1 +▁1992 1 +▁distancia 1 +lec 1 +▁LA 1 +▁justa 1 +▁paga 1 +▁entraña 1 +gna 1 +▁Operaciones 1 +▁determinado 1 +len 1 +▁guarda 1 +▁abuso 1 +▁Tenien 1 +▁Fu 1 +▁especifica 1 +▁televisión 1 +26 1 +▁tendrán 1 +▁comunicar 1 +▁ponga 1 +▁Dios 1 +▁documentación 1 +icia 1 +▁decidido 1 +▁elevado 1 +▁publica 1 +▁positivo 1 +▁utilizando 1 +▁alcanzado 1 +▁Asesor 1 +▁or 1 +▁36 1 +78 1 +▁circulación 1 +▁gu 1 +Re 1 +▁Ac 1 +eron 1 +tario 1 +▁habido 1 +▁provincia 1 +▁conjuntamente 1 +▁hacerse 1 +▁combustible 1 +▁superficie 1 +▁vehículos 1 +▁Políticos 1 +▁financiar 1 +23 1 +▁soberanía 1 +/60/ 1 +▁demostrar 1 +▁copia 1 +▁colabora 1 +▁específicos 1 +▁organiza 1 +esta 1 +▁mínima 1 +95 1 +▁Zelandia 1 +▁potencia 1 +▁aparece 1 +▁volumen 1 +▁continente 1 +▁registrado 1 +▁indicar 1 +▁Croacia 1 +▁privadas 1 +▁Ti 1 +▁reto 1 +▁capa 1 +lex 1 +▁IV 1 +/63/ 1 +▁estable 1 +▁escuchar 1 +▁situado 1 +▁Primera 1 +▁ejemplos 1 +▁modificar 1 +▁integrar 1 +▁usa 1 +▁Hasta 1 +84 1 +aron 1 +▁correo 1 +▁Côte 1 +▁Wi 1 +▁Oficiales 1 +▁Quinta 1 +▁comprende 1 +▁controlar 1 +▁39 1 +▁cualquiera 1 +▁calendario 1 +▁método 1 +▁destinadas 1 +66 1 +▁cultivo 1 +▁ocurre 1 +▁dura 1 +▁apertura 1 +▁Tengo 1 +▁promulga 1 +▁étnico 1 +/57/ 1 +sol 1 +rie 1 +▁exactamente 1 +21 1 +▁gobernanza 1 +▁juntos 1 +▁víctima 1 +▁similar 1 +▁aumentado 1 +▁salva 1 +▁territorial 1 +▁ocupado 1 +vin 1 +67 1 +nio 1 +lica 1 +gio 1 +jó 1 +▁Polonia 1 +▁naciones 1 +wi 1 +▁gana 1 +▁gen 1 +ON 1 +cra 1 +▁respeta 1 +▁exportación 1 +▁aprendizaje 1 +▁Sólo 1 +▁procede 1 +▁darle 1 +doras 1 +▁1991 1 +▁concreto 1 +▁indispensable 1 +▁precisa 1 +▁siquiera 1 +rup 1 +▁observar 1 +fra 1 +▁estatales 1 +▁Georgia 1 +▁cumbre 1 +▁Sí 1 +ticos 1 +▁pacientes 1 +▁conocido 1 +▁conversaciones 1 +▁legislativas 1 +/56/ 1 +▁Pres 1 +▁encarga 1 +▁diputados 1 +▁Adjunto 1 +▁integral 1 +▁duradera 1 +▁créditos 1 +ID 1 +Con 1 +200 1 +▁células 1 +▁cometido 1 +▁probable 1 +▁Uganda 1 +tras 1 +▁sometido 1 +▁agrícola 1 +▁tradicional 1 +▁Segunda 1 +▁futuras 1 +▁ejecutar 1 +▁comprometido 1 +▁transparente 1 +▁Todas 1 +▁2004. 1 +▁corazón 1 +▁proporción 1 +▁encuesta 1 +▁prestado 1 +▁2006. 1 +▁institucionales 1 +▁limitar 1 +▁introducción 1 +▁permiso 1 +▁beneficia 1 +▁racional 1 +▁celebradas 1 +rri 1 +▁sexuales 1 +▁ciertos 1 +ot 1 +▁International 1 +dero 1 +▁posee 1 +▁foro 1 +▁penales 1 +lina 1 +76 1 +▁Grecia 1 +▁Nuestra 1 +▁desechos 1 +▁comité 1 +▁paquete 1 +▁Pri 1 +Z 1 +▁ga 1 +▁Perú 1 +▁mencionado 1 +▁factor 1 +▁adopten 1 +▁mas 1 +▁1, 1 +▁Policía 1 +▁Directiva 1 +▁selecciona 1 +▁comprensión 1 +▁Jefe 1 +int 1 +▁Congreso 1 +▁Corr 1 +▁presentadas 1 +▁introducir 1 +taria 1 +▁anuales 1 +69 1 +presión 1 +▁Quisiera 1 +▁pendientes 1 +▁permanentes 1 +▁detalles 1 +▁conservación 1 +▁líderes 1 +▁Fiscal 1 +▁adopte 1 +▁limita 1 +IN 1 +▁formula 1 +gas 1 +▁físico 1 +▁amor 1 +▁Cre 1 +▁oportuna 1 +▁prestaciones 1 +▁tratando 1 +▁realizadas 1 +▁bio 1 +▁presidencia 1 +▁popular 1 +▁cabal 1 +▁mejoras 1 +▁Debemos 1 +▁Etiopía 1 +▁lu 1 +▁Guatemala 1 +▁evaluaciones 1 +74 1 +▁igualmente 1 +▁desempeño 1 +▁deberíamos 1 +od 1 +▁observación 1 +▁educativo 1 +▁coherente 1 +▁pronuncia 1 +▁ofrecen 1 +▁negociación 1 +ático 1 +este 1 +▁previstas 1 +▁sabía 1 +▁Add 1 +TE 1 +▁junta 1 +/62/ 1 +▁Eliminación 1 +▁perspectivas 1 +24 1 +▁goza 1 +▁finalmente 1 +▁migración 1 +osa 1 +▁legales 1 +▁Algunas 1 +▁restaurante 1 +▁comentarios 1 +▁aquel 1 +▁permitirá 1 +▁daño 1 +▁mala 1 +▁pérdidas 1 +▁asumir 1 +▁Tu 1 +▁coordinar 1 +cua 1 +▁agradecimiento 1 +arios 1 +▁libros 1 +29 1 +19 1 +continuación 1 +▁toca 1 +▁múltiples 1 +▁obtenido 1 +▁utilizado 1 +▁' 1 +lidad 1 +media 1 +mini 1 +▁pacífica 1 +▁organismo 1 +gente 1 +▁Asistencia 1 +▁preventiva 1 +▁estará 1 +▁publicado 1 +▁proceder 1 +▁adecuados 1 +▁encargados 1 +/61/ 1 +▁determinadas 1 +▁arriba 1 +▁alguno 1 +▁prima 1 +▁disminución 1 +voc 1 +dro 1 +33 1 +▁hubo 1 +tiza 1 +51 1 +▁determina 1 +▁Portugal 1 +▁Muchos 1 +▁42 1 +▁mata 1 +7% 1 +▁publicar 1 +enda 1 +ris 1 +▁abogado 1 +▁retos 1 +▁muerto 1 +▁Del 1 +▁tendencias 1 +▁someter 1 +▁metros 1 +▁Can 1 +22 1 +iga 1 +ag 1 +▁49 1 +▁2009, 1 +▁resumen 1 +▁efectivos 1 +ire 1 +▁ejército 1 +▁erradicación 1 +▁voz 1 +mpli 1 +▁post 1 +▁mencionar 1 +▁limitaciones 1 +▁vital 1 +▁geográfica 1 +▁diseñado 1 +▁2003. 1 +▁capaz 1 +▁modalidades 1 +▁buenos 1 +▁Suplemento 1 +▁on 1 +▁herramientas 1 +▁abusos 1 +83 1 +▁procedentes 1 +▁2007. 1 +▁aprobadas 1 +▁Territorio 1 +.8 1 +▁Roma 1 +▁encanta 1 +▁Sus 1 +▁asignación 1 +▁vivo 1 +mon 1 +▁afectadas 1 +▁Sostenible 1 +▁inmediata 1 +▁constituir 1 +▁Bar 1 +▁/ 1 +▁ge 1 +ust 1 +▁cargos 1 +▁comprender 1 +▁exportaciones 1 +▁israelí 1 +▁selección 1 +▁58 1 +▁eje 1 +07 1 +▁44 1 +▁estilo 1 +▁77 1 +▁pág 1 +▁influencia 1 +▁innovación 1 +tención 1 +▁desempleo 1 +lá 1 +mpa 1 +▁perjuicio 1 +▁Medidas 1 +▁adultos 1 +▁aplicaciones 1 +▁57 1 +▁* 1 +▁Argelia 1 +▁laboratorio 1 +rado 1 +▁relieve 1 +▁parecer 1 +▁Finlandia 1 +▁máxima 1 +artículo 1 +▁negocios 1 +▁Fo 1 +curri 1 +▁reglamenta 1 +▁é 1 +▁siente 1 +80 1 +▁evento 1 +▁particulares 1 +▁contingentes 1 +▁dé 1 +▁aumenta 1 +▁indican 1 +▁justifica 1 +del 1 +▁euro 1 +eña 1 +▁espero 1 +▁difíciles 1 +▁mente 1 +mbo 1 +▁criterio 1 +▁alumnos 1 +▁disponibilidad 1 +▁llegó 1 +nica 1 +▁Val 1 +▁reclamación 1 +▁metas 1 +fica 1 +▁Sta 1 +bia 1 +▁efectivamente 1 +▁bases 1 +▁promedio 1 +▁cadena 1 +79 1 +▁bancos 1 +▁Dirección 1 +▁inmigración 1 +▁disciplina 1 +iz 1 +▁visitas 1 +▁Resolución 1 +▁suministra 1 +▁anuncia 1 +▁investigar 1 +▁Checa 1 +▁periódicos 1 +▁fre 1 +▁debida 1 +▁Fuerza 1 +▁considerarse 1 +▁declara 1 +▁55 1 +▁disfrutar 1 +▁SIDA 1 +fin 1 +cómo 1 +▁coste 1 +▁salario 1 +▁administrativos 1 +▁géneros 1 +▁suficientemente 1 +rig 1 +▁desempeña 1 +▁merece 1 +.30 1 +▁verdadera 1 +▁informado 1 +▁individuales 1 +▁carretera 1 +▁incremento 1 +▁Mientras 1 +▁revela 1 +▁41 1 +▁reconciliación 1 +▁70 1 +▁vínculos 1 +▁salida 1 +6% 1 +tá 1 +▁n 1 +▁80 1 +▁Bélgica 1 +▁examinando 1 +▁puso 1 +▁plataforma 1 +▁respectivamente 1 +uta 1 +plo 1 +mático 1 +▁Belarús 1 +como 1 +▁Relatora 1 +▁aplicables 1 +▁época 1 +pec 1 +TA 1 +▁Ibíd 1 +▁trate 1 +▁Vicepresidente 1 +▁mapa 1 +▁fiscales 1 +bol 1 +▁contempla 1 +plica 1 +▁cam 1 +▁pudieran 1 +produc 1 +▁firmado 1 +▁testigos 1 +República 1 +▁Interior 1 +ibilidad 1 +▁satisfacer 1 +cord 1 +▁cometidos 1 +▁letra 1 +70 1 +▁concesión 1 +▁permitan 1 +75 1 +▁aporta 1 +side 1 +▁adquisición 1 +hor 1 +▁ideal 1 +ster 1 +▁señalado 1 +▁miedo 1 +▁alimentación 1 +▁incorporación 1 +ibles 1 +▁variedad 1 +▁mantiene 1 +▁transmitir 1 +▁tránsito 1 +▁Tra 1 +▁revisar 1 +▁vistas 1 +▁medicamentos 1 +zó 1 +▁suelo 1 +▁mercancías 1 +▁ojos 1 +▁magistrados 1 +▁finalidad 1 +▁rea 1 +▁extrema 1 +▁funcionario 1 +rm 1 +2% 1 +▁imposible 1 +▁intervenciones 1 +▁dirigidas 1 +▁seguros 1 +▁permiten 1 +▁lengua 1 +▁insuficiente 1 +▁90 1 +▁inicio 1 +br 1 +▁2001. 1 +▁independientes 1 +▁PNUMA 1 +▁vulnerabilidad 1 +▁joven 1 +icos 1 +ora 1 +-1 1 +ant 1 +▁Cha 1 +▁lejos 1 +▁2002. 1 +▁asignado 1 +▁especies 1 +▁disfrute 1 +▁llevó 1 +▁Tercera 1 +▁proporcione 1 +▁aguas 1 +▁2000. 1 +1, 1 +▁rein 1 +▁Ab 1 +▁básico 1 +▁presentados 1 +44 1 +▁pagos 1 +▁argumento 1 +▁complace 1 +▁fui 1 +▁inspira 1 +▁señal 1 +▁existente 1 +▁blanco 1 +▁agrícolas 1 +▁sigan 1 +edi 1 +tando 1 +▁sumamente 1 +▁Esos 1 +Rev 1 +RE 1 +vel 1 +filia 1 +27 1 +▁satélite 1 +▁lectura 1 +▁tomando 1 +▁adapta 1 +▁2008. 1 +▁correcciones 1 +▁frecuente 1 +▁51 1 +73 1 +▁votar 1 +▁www 1 +▁Antes 1 +▁proveedores 1 +▁viajes 1 +▁53 1 +▁acceder 1 +02 1 +▁establezca 1 +▁CE 1 +▁definir 1 +▁prevista 1 +▁puedes 1 +▁dirigir 1 +▁malos 1 +gro 1 +▁ejecuta 1 +tamos 1 +▁46 1 +▁crucial 1 +▁histórico 1 +▁atrás 1 +▁dicen 1 +68 1 +▁experimenta 1 +38 1 +stre 1 +▁Tailandia 1 +▁cocina 1 +▁penas 1 +ting 1 +▁sirve 1 +▁Sol 1 +▁Rica 1 +▁historias 1 +lización 1 +eño 1 +▁limitada 1 +▁dedicado 1 +integr 1 +▁momentos 1 +▁vaya 1 +▁cierta 1 +▁pretende 1 +▁Árabes 1 +SP 1 +▁Malasia 1 +▁habitual 1 +▁aplicado 1 +▁cientos 1 +▁avance 1 +▁Recursos 1 +▁respectivos 1 +▁moneda 1 +▁biológica 1 +31 1 +▁nacimiento 1 +▁químicos 1 +▁(2001) 1 +▁sexto 1 +▁respond 1 +▁entiende 1 +▁soldados 1 +▁Alta 1 +▁espacial 1 +▁apropiado 1 +▁Filipinas 1 +ED 1 +▁espaciales 1 +▁intentar 1 +▁47 1 +▁Ke 1 +▁unidades 1 +3% 1 +▁ulterior 1 +▁consejo 1 +▁cha 1 +▁modelos 1 +▁adoptada 1 +▁consta 1 +▁humanitarias 1 +▁tarjeta 1 +▁pienso 1 +▁Real 1 +▁escucha 1 +81 1 +vu 1 +▁Túnez 1 +▁salvo 1 +▁Dinamarca 1 +▁reintegración 1 +▁software 1 +▁ejecutivo 1 +▁audiencia 1 +▁solicitado 1 +▁guía 1 +▁asegura 1 +▁frontera 1 +▁examine 1 +▁raíz 1 +▁mediano 1 +▁reunir 1 +▁marino 1 +▁verdadero 1 +▁formulada 1 +▁establecidas 1 +▁CO 1 +▁Miembro 1 +▁quizás 1 +▁Ciencia 1 +▁38 1 +leta 1 +▁Refugiados 1 +▁permitido 1 +▁Red 1 +▁imponer 1 +▁tus 1 +cel 1 +▁aprecia 1 +▁convenios 1 +vol 1 +34 1 +▁aeropuerto 1 +▁antigua 1 +▁Acoge 1 +▁pat 1 +▁seminarios 1 +▁seminario 1 +▁presupuestario 1 +▁enlace 1 +▁supervisar 1 +▁ataque 1 +ería 1 +▁involucra 1 +▁párrs 1 +▁200 1 +▁reciben 1 +▁objetos 1 +▁Santa 1 +4% 1 +05 1 +▁puerto 1 +▁Myanmar 1 +parte 1 +▁pasó 1 +▁56 1 +▁considerado 1 +▁entrevista 1 +▁gratuita 1 +▁raza 1 +cé 1 +bili 1 +puesto 1 +▁incorpora 1 +▁izquierda 1 +DI 1 +▁apropiadas 1 +▁acumula 1 +▁hospital 1 +▁52 1 +▁utilizan 1 +▁comenzó 1 +▁equitativa 1 +▁referente 1 +▁capaces 1 +▁notable 1 +rías 1 +▁Bangladesh 1 +▁compleja 1 +▁desafío 1 +▁compañía 1 +posición 1 +▁torno 1 +Á 1 +8% 1 +▁impuestos 1 +▁altos 1 +▁cooperar 1 +▁cifra 1 +▁presentan 1 +▁Potencia 1 +▁éstas 1 +3) 1 +28 1 +48 1 +▁leer 1 +▁1998, 1 +▁desarrollado 1 +▁deriva 1 +▁efectuar 1 +ografía 1 +▁electoral 1 +37 1 +▁indicó 1 +▁convertido 1 +▁generar 1 +damente 1 +▁positivos 1 +▁prostitución 1 +nico 1 +▁Supervisión 1 +forma 1 +▁nueve 1 +ológica 1 +▁manifiesto 1 +▁practica 1 +▁emplea 1 +▁43 1 +fir 1 +▁gama 1 +▁Observa 1 +▁Actualmente 1 +▁impulso 1 +▁superiores 1 +▁Ob 1 +SA 1 +▁requisito 1 +61 1 +87 1 +▁revisado 1 +▁árabes 1 +▁Du 1 +▁km 1 +▁62 1 +ñe 1 +▁estrechamente 1 +▁coherencia 1 +▁ONUDI 1 +▁posteriormente 1 +▁camina 1 +SE 1 +▁voluntarias 1 +▁personales 1 +▁medicina 1 +▁juez 1 +71 1 +▁go 1 +▁activo 1 +▁incluyendo 1 +▁Mantenimiento 1 +▁Rumania 1 +▁Civil 1 +jar 1 +▁micro 1 +▁voluntaria 1 +▁convertir 1 +▁2, 1 +▁encontramos 1 +dé 1 +ima 1 +iste 1 +▁iniciado 1 +▁Ecuador 1 +▁Cabe 1 +4) 1 +guard 1 +▁negocia 1 +▁índice 1 +▁profundo 1 +▁cumplido 1 +▁moderna 1 +▁Aprobación 1 +90 1 +tales 1 +▁ruta 1 +▁contribuyen 1 +▁europeas 1 +▁desplazamiento 1 +▁concentra 1 +▁recibió 1 +▁Azerbaiyán 1 +▁departamentos 1 +▁alimenta 1 +▁Sha 1 +Ha 1 +▁creó 1 +RA 1 +▁autorización 1 +▁condenado 1 +▁concreta 1 +▁mejoramiento 1 +▁noticias 1 +▁rendimiento 1 +ard 1 +▁abrir 1 +▁Bulgaria 1 +▁prolonga 1 +▁decide 1 +▁Promoción 1 +CA 1 +▁promesa 1 +▁distribuir 1 +gia 1 +▁Droga 1 +▁OMC 1 +tener 1 +▁habitación 1 +▁Exhorta 1 +▁meridional 1 +▁Angola 1 +1) 1 +▁estudia 1 +▁liderazgo 1 +▁sensibilización 1 +▁Iniciativa 1 +▁Sobre 1 +▁básicas 1 +Hábitat 1 +lig 1 +▁Venezuela 1 +▁líneas 1 +▁asesinato 1 +▁sueño 1 +▁vio 1 +94 1 +▁votado 1 +▁compromete 1 +▁Ver 1 +▁significativo 1 +ños 1 +▁cer 1 +▁acepta 1 +▁ingreso 1 +77 1 +▁dolor 1 +PE 1 +▁ligeras 1 +▁Alianza 1 +▁París 1 +▁realice 1 +ador 1 +▁pl 1 +ph 1 +▁sitios 1 +▁metodología 1 +▁urgencia 1 +▁Kenya 1 +pli 1 +▁ocupan 1 +▁Introducción 1 +▁estuvo 1 +ah 1 +▁ratificado 1 +▁administra 1 +▁expone 1 +▁usando 1 +OR 1 +▁Cultura 1 +▁totalidad 1 +▁financia 1 +▁controles 1 +▁reducido 1 +▁suerte 1 +▁residentes 1 +▁sonido 1 +▁explota 1 +▁decía 1 +▁agricultores 1 +▁campañas 1 +sia 1 +▁Civiles 1 +32 1 +▁juzga 1 +▁aun 1 +mov 1 +▁redacción 1 +▁Supremo 1 +▁podríamos 1 +▁Sal 1 +▁planos 1 +▁adaptación 1 +stitución 1 +/2000/ 1 +▁coloca 1 +▁playa 1 +▁aldea 1 +▁Reconociendo 1 +▁edificios 1 +:// 1 +▁ultraterrestre 1 +▁negro 1 +ular 1 +▁tienda 1 +04 1 +▁jueces 1 +▁Expresa 1 +▁globalización 1 +AM 1 +▁Lanka 1 +1% 1 +▁vuelo 1 +▁confi 1 +▁reglamentos 1 +terinstitucional 1 +▁verificación 1 +▁competencias 1 +▁hambre 1 +CO 1 +▁podamos 1 +▁Financiación 1 +misión 1 +visión 1 +▁armadas 1 +▁denomina 1 +▁administrativo 1 +89 1 +▁llena 1 +▁incrementar 1 +▁aprobados 1 +▁hice 1 +▁realizan 1 +▁Lisboa 1 +▁garantice 1 +▁pertenece 1 +▁partido 1 +ity 1 +▁prioritaria 1 +▁Media 1 +chos 1 +fí 1 +ábamos 1 +▁fundamento 1 +09 1 +public 1 +▁fabricación 1 +▁destinado 1 +▁armado 1 +▁moderno 1 +▁terrestre 1 +▁j 1 +dura 1 +▁logra 1 +▁Hungría 1 +▁Pueblo 1 +reg 1 +eti 1 +▁baño 1 +▁Montenegro 1 +▁continúe 1 +▁excepcional 1 +▁CP 1 +▁jefes 1 +▁Saudita 1 +▁Arabia 1 +▁peso 1 +▁robot 1 +▁administrativa 1 +illas 1 +cionales 1 +▁planta 1 +parti 1 +▁velocidad 1 +▁represión 1 +tino 1 +▁define 1 +ug 1 +▁hermano 1 +cado 1 +▁respalda 1 +▁sanitaria 1 +▁Nepal 1 +▁obligatoria 1 +▁registrada 1 +▁religiosas 1 +▁desastre 1 +▁inteligente 1 +ted 1 +▁estimaciones 1 +▁(2004) 1 +▁impunidad 1 +▁Estudi 1 +igu 1 +▁Fe 1 +bur 1 +part 1 +▁conexión 1 +▁abajo 1 +▁aceptación 1 +▁gasto 1 +▁regla 1 +▁firmemente 1 +▁flexibilidad 1 +Sur 1 +▁contaminación 1 +ty 1 +▁ajusta 1 +▁requieren 1 +americano 1 +▁ocurrido 1 +▁individuos 1 +▁corta 1 +▁Podemos 1 +▁oposición 1 +▁obras 1 +eta 1 +▁inicia 1 +▁estándar 1 +▁Sri 1 +▁notificación 1 +▁llevan 1 +▁fallo 1 +▁vive 1 +▁previa 1 +▁asentamientos 1 +▁derecha 1 +▁corrientes 1 +▁límite 1 +▁coopera 1 +▁revisada 1 +▁coche 1 +▁infra 1 +▁IN 1 +▁plantas 1 +▁Movimiento 1 +▁Luego 1 +Leste 1 +▁reforz 1 +▁nación 1 +▁carbono 1 +▁subprograma 1 +▁VI 1 +▁contribuido 1 +/2001/ 1 +Ma 1 +▁consolidar 1 +▁insulares 1 +▁Cor 1 +▁desee 1 +▁conecta 1 +▁negativa 1 +▁ausencia 1 +▁perder 1 +▁nuevamente 1 +93 1 +▁nombres 1 +▁disponer 1 +▁conexos 1 +up 1 +▁Or 1 +▁formato 1 +▁Ber 1 +▁Ci 1 +ique 1 +53 1 +▁pudo 1 +gada 1 +▁artista 1 +▁profundamente 1 +ético 1 +▁poli 1 +▁comités 1 +55 1 +▁adopta 1 +▁is 1 +▁correcta 1 +▁exclusión 1 +▁inteligencia 1 +▁convencido 1 +▁interpreta 1 +íamos 1 +▁llamar 1 +VI 1 +▁primordial 1 +▁felicitar 1 +▁consecución 1 +▁diciendo 1 +▁usuario 1 +▁Eritrea 1 +▁comprar 1 +▁caja 1 +▁intolerancia 1 +▁ilegales 1 +▁recoge 1 +PA 1 +7) 1 +▁procura 1 +▁ciento 1 +Г 1 +▁manual 1 +▁privados 1 +rez 1 +▁Defensa 1 +▁viviendas 1 +▁cumplan 1 +AT 1 +▁equivalente 1 +end 1 +36 1 +▁Destaca 1 +▁futura 1 +▁pese 1 +▁votos 1 +ze 1 +ño 1 +▁específica 1 +vas 1 +▁pensamos 1 +▁movimientos 1 +▁menciona 1 +▁transmisión 1 +▁estrellas 1 +▁suya 1 +▁ventajas 1 +▁& 1 +cap 1 +▁pensamiento 1 +▁15.00 1 +▁tuvieron 1 +▁cláusula 1 +▁convención 1 +▁record 1 +▁PMA 1 +▁textos 1 +▁Decenio 1 +▁inmigrantes 1 +her 1 +▁consciente 1 +tic 1 +▁funcionar 1 +▁chino 1 +▁compañías 1 +▁instrucciones 1 +▁mantenga 1 +▁vuelve 1 +www 1 +▁recurrir 1 +85 1 +▁10.00 1 +caso 1 +ub 1 +92 1 +▁ritmo 1 +▁anima 1 +▁Otra 1 +▁duplica 1 +▁error 1 +▁expresado 1 +▁Año 1 +▁serio 1 +ang 1 +▁asistir 1 +▁experimento 1 +▁palestina 1 +gh 1 +▁normativo 1 +▁Jordania 1 +▁retraso 1 +bli 1 +▁seguía 1 +q 1 +▁aplicando 1 +47 1 +▁identificación 1 +zos 1 +▁turismo 1 +▁orgánico 1 +▁sufrimiento 1 +▁integrante 1 +▁visual 1 +▁aportar 1 +▁analiza 1 +▁Común 1 +nacional 1 +▁creen 1 +▁Jefes 1 +▁Eslovenia 1 +▁61 1 +▁competente 1 +▁reconocido 1 +▁relativamente 1 +▁acelerar 1 +▁habida 1 +▁abogados 1 +/2004/ 1 +▁realizando 1 +▁consultar 1 +▁59 1 +▁colectivo 1 +▁Estadística 1 +▁transacciones 1 +65 1 +▁relacionada 1 +▁produce 1 +▁causado 1 +▁dando 1 +▁mirar 1 +AP 1 +SR 1 +▁vinculante 1 +▁vino 1 +▁garantizado 1 +▁formulado 1 +88 1 +▁diario 1 +ví 1 +▁utilizados 1 +activa 1 +▁sacar 1 +▁presentara 1 +▁exista 1 +▁UNFPA 1 +▁pantalla 1 +▁añadir 1 +▁val 1 +▁consideran 1 +▁oficio 1 +▁castigo 1 +▁defender 1 +▁digo 1 +▁esperamos 1 +▁Otro 1 +▁Actividades 1 +▁Procedimiento 1 +americana 1 +▁eficazmente 1 +▁fabrica 1 +43 1 +▁consideró 1 +▁patrocinadores 1 +▁Gar 1 +▁parcial 1 +▁temprana 1 +▁nacido 1 +▁sujeta 1 +▁estadounidenses 1 +▁detenido 1 +▁OIT 1 +▁autorizado 1 +▁Han 1 +72 1 +▁discu 1 +▁cuestionario 1 +imi 1 +▁simplifica 1 +imo 1 +▁actuación 1 +▁acusado 1 +▁Jerusalén 1 +▁Población 1 +▁Espero 1 +▁vacuna 1 +izó 1 +▁fotos 1 +▁mencionados 1 +▁impone 1 +▁carece 1 +In 1 +▁exigir 1 +▁específicamente 1 +/2002/ 1 +▁cuál 1 +ring 1 +▁pase 1 +63 1 +▁reconocida 1 +mentar 1 +ü 1 +▁sostenibilidad 1 +▁previo 1 +▁imparti 1 +39 1 +und 1 +ciente 1 +▁manifesta 1 +▁conveniente 1 +-2 1 +iano 1 +▁hoja 1 +▁preocupado 1 +▁exclusivamente 1 +▁certificado 1 +▁absoluto 1 +tización 1 +▁New 1 +▁Dado 1 +ológico 1 +▁toneladas 1 +98 1 +▁utilice 1 +▁dijeron 1 +IP 1 +▁Macedonia 1 +▁Párrafo 1 +▁Equipo 1 +▁vuelta 1 +▁declaró 1 +pp 1 +tec 1 +▁nu 1 +▁verde 1 +ST 1 +▁describe 1 +▁formuló 1 +▁priva 1 +muni 1 +▁extradición 1 +▁(2 1 +clar 1 +▁cliente 1 +▁lleve 1 +▁bal 1 +ker 1 +▁insolvencia 1 +▁pasando 1 +▁aplican 1 +▁Infancia 1 +▁cobertura 1 +▁St 1 +▁deporte 1 +Q 1 +▁precisamente 1 +ley 1 +▁regreso 1 +mm 1 +-3 1 +▁quedan 1 +ben 1 +▁prohíbe 1 +▁reparación 1 +▁castiga 1 +▁río 1 +▁elevada 1 +▁terminado 1 +▁debajo 1 +/2003/ 1 +siderablemente 1 +▁aceptable 1 +▁comunicado 1 +human 1 +▁motor 1 +▁memoria 1 +line 1 +▁Libia 1 +▁encima 1 +54 1 +▁fueran 1 +▁adelanto 1 +▁creemos 1 +▁Pueden 1 +▁básicamente 1 +▁cantidades 1 +▁convenido 1 +▁subregionales 1 +fina 1 +▁criminal 1 +▁sustancial 1 +▁saldo 1 +9% 1 +▁séptimo 1 +▁teoría 1 +▁domina 1 +▁Universal 1 +▁incumplimiento 1 +▁medioambiental 1 +▁redonda 1 +41 1 +▁pul 1 +imiento 1 +▁ocupados 1 +▁Terrorismo 1 +ética 1 +Pro 1 +▁intensificar 1 +▁pocas 1 +▁complementaria 1 +▁formar 1 +86 1 +▁piensa 1 +▁Camboya 1 +▁Senegal 1 +▁genocidio 1 +▁sufrido 1 +▁montaña 1 +▁convertirse 1 +cil 1 +▁peor 1 +▁parecen 1 +59 1 +▁aportan 1 +▁aprend 1 +▁cama 1 +▁energética 1 +▁Reafirmando 1 +▁ganar 1 +▁diplomática 1 +▁participado 1 +cid 1 +▁publicaciones 1 +▁Investigación 1 +▁dimensión 1 +▁vale 1 +▁herramienta 1 +▁establecida 1 +dec 1 +▁estuviera 1 +aña 1 +▁Administrativos 1 +MIN 1 +▁encuentre 1 +▁fotografía 1 +▁autora 1 +▁periódicamente 1 +▁lenguaje 1 +celera 1 +▁enfoques 1 +▁empieza 1 +▁Tortura 1 +▁rendición 1 +▁separación 1 +▁TED 1 +▁vías 1 +▁500 1 +▁actitud 1 +ult 1 +▁Racial 1 +▁rodea 1 +▁2) 1 +▁visitar 1 +46 1 +▁máquina 1 +▁etapas 1 +▁asesor 1 +▁apruebe 1 +▁estaría 1 +▁modificación 1 +▁operacional 1 +Firmado 1 +▁gubernamental 1 +▁reclamante 1 +mico 1 +▁formal 1 +▁agrega 1 +▁reproductiva 1 +▁contactos 1 +▁alternativas 1 +▁perdido 1 +cieron 1 +pondrá 1 +8) 1 +▁impuesto 1 +tividad 1 +▁programación 1 +tiende 1 +▁defensores 1 +ell 1 +▁desempeñan 1 +▁proporcionado 1 +▁Fundación 1 +▁gradual 1 +▁Beijing 1 +▁Lituania 1 +64 1 +▁Otras 1 +cent 1 +▁conseguido 1 +ef 1 +▁iii 1 +▁Queda 1 +▁actuaciones 1 +▁campos 1 +2/ 1 +tema 1 +bel 1 +▁jefe 1 +▁interesa 1 +▁captura 1 +▁brindar 1 +▁XXI 1 +▁cuentan 1 +▁We 1 +oro 1 +▁década 1 +▁elegido 1 +▁futuros 1 +▁cartas 1 +▁presentará 1 +▁documenta 1 +▁presupuestarias 1 +▁estatal 1 +▁extraordinaria 1 +▁inquietud 1 +▁Invita 1 +▁considere 1 +▁barrio 1 +▁clases 1 +▁movilización 1 +▁hiciera 1 +/2005/ 1 +▁ignora 1 +▁enuncia 1 +▁viable 1 +▁bebé 1 += 1 +▁correcto 1 +▁vigésimo 1 +▁renovable 1 +▁participen 1 +42 1 +▁deficiencias 1 +▁convenciones 1 +▁compatible 1 +▁páginas 1 +▁Familia 1 +Cuál 1 +▁Viet 1 +▁ampliamente 1 +▁esforz 1 +– 1 +▁corresponda 1 +▁erradicar 1 +▁exámenes 1 +▁legítima 1 +▁obliga 1 +tur 1 +▁renta 1 +vid 1 +▁histórica 1 +IV 1 +▁preparativos 1 +▁negocio 1 +ece 1 +▁productores 1 +▁absolutamente 1 +▁Incluso 1 +▁quedar 1 +-19 1 +▁aclara 1 +bul 1 +▁haberse 1 +▁ruso 1 +gal 1 +▁: 1 +▁intensifica 1 +CT 1 +▁bajos 1 +56 1 +▁flexible 1 +▁muestran 1 +▁arbitraria 1 +▁Usted 1 +dra 1 +▁Sírvanse 1 +pusieron 1 +▁Acta 1 +▁caracteriza 1 +58 1 +▁agrava 1 +91 1 +▁300 1 +▁patrimonio 1 +▁enfrentar 1 +ear 1 +▁laborales 1 +▁Él 1 +COM 1 +/2006/ 1 +▁detalle 1 +▁adoptó 1 +▁agresión 1 +tuvieron 1 +▁somet 1 +▁manifestaciones 1 +▁Reafirma 1 +▁siguió 1 +▁Chi 1 +▁hubieran 1 +▁2009. 1 +▁director 1 +pan 1 +▁interacción 1 +ux 1 +▁amigo 1 +▁archivos 1 +▁frase 1 +▁creer 1 +▁Capítulo 1 +▁escribir 1 +▁subsidio 1 +▁excesiva 1 +▁detener 1 +▁Armenia 1 +▁Ghana 1 +▁acogida 1 +▁regímenes 1 +▁1) 1 +▁errores 1 +▁monto 1 +II 1 +▁prioritario 1 +▁juegos 1 +▁preguntar 1 +▁sustantiva 1 +ifi 1 +▁tú 1 +tán 1 +▁kilómetros 1 +▁convierte 1 +▁conceder 1 +▁diga 1 +▁Sch 1 +▁designado 1 +mal 1 +▁comparte 1 +▁modificaciones 1 +▁preferencia 1 +▁cuarta 1 +▁ataca 1 +▁basadas 1 +gráfica 1 +▁Bolivia 1 +▁impide 1 +▁Documento 1 +▁Comisionada 1 +▁alternativo 1 +cepción 1 +▁discursos 1 +▁Energía 1 +▁adquirida 1 +▁apliquen 1 +ístico 1 +han 1 +▁urbano 1 +▁empleado 1 +-4 1 +▁saneamiento 1 +▁OIEA 1 +▁armonización 1 +▁ido 1 +▁adquirir 1 +▁sencilla 1 +▁llegue 1 +▁recibe 1 +▁Verde 1 +▁posteriores 1 +▁acredita 1 +▁competitividad 1 +lio 1 +▁sólida 1 +▁Agricultura 1 +▁alerta 1 +▁hicimos 1 +▁Chad 1 +osas 1 +▁inscripción 1 +bio 1 +rimi 1 +▁Superior 1 +▁últimas 1 +▁pensé 1 +▁Salvador 1 +▁altura 1 +▁humanitarios 1 +▁realizó 1 +▁materna 1 +▁plantear 1 +▁ll 1 +▁aumentando 1 +▁reciba 1 +▁tienes 1 +▁difundir 1 +▁pasos 1 +▁existía 1 +reci 1 +▁margen 1 +▁convencionales 1 +▁invitación 1 +▁tolerancia 1 +ólogo 1 +▁pan 1 +▁Caja 1 +▁comienza 1 +▁facilite 1 +▁tecnológica 1 +▁municiones 1 +▁libres 1 +▁ACNUDH 1 +▁continuo 1 +▁periódica 1 +▁anuncio 1 +▁America 1 +▁octavo 1 +ak 1 +06 1 +▁ganado 1 +▁Qui 1 +▁Reconoce 1 +▁Solo 1 +▁Esperamos 1 +▁peces 1 +▁opone 1 +▁Interna 1 +▁enjuiciamiento 1 +▁colaborar 1 +▁flor 1 +5.000 1 +▁Uruguay 1 +▁sanitario 1 +▁concretamente 1 +▁tecnológico 1 +▁corriente 1 +▁descarga 1 +▁avanzado 1 +▁tardar 1 +▁avión 1 +▁expuesto 1 +▁posiciones 1 +▁reside 1 +▁Alienta 1 +▁concluido 1 +▁informativa 1 +▁vigente 1 +▁dinámica 1 +▁riqueza 1 +▁instalación 1 +▁préstamos 1 +▁mencionadas 1 +▁adecuadamente 1 +▁transnacional 1 +▁prácticamente 1 +▁déficit 1 +▁enormes 1 +versión 1 +▁aclarar 1 +▁ciudadano 1 +shi 1 +▁antiguo 1 +log 1 +contra 1 +▁azul 1 +▁mon 1 +▁observador 1 +ponga 1 +▁doméstica 1 +▁pertenecientes 1 +▁secreto 1 +▁liberalización 1 +▁Orden 1 +▁culturas 1 +▁Dr 1 +▁Objetivos 1 +net 1 +▁descubrir 1 +▁Exp 1 +▁tro 1 +mil 1 +▁temático 1 +▁Pas 1 +lico 1 +▁atentado 1 +uro 1 +49 1 +▁manifiesta 1 +▁revista 1 +▁millón 1 +volución 1 +arias 1 +▁culpable 1 +glo 1 +tem 1 +▁conserva 1 +▁Doha 1 +▁dia 1 +▁tele 1 +▁fácilmente 1 +▁autonomía 1 +▁movilidad 1 +▁aplicarse 1 +▁enumera 1 +▁ministerios 1 +▁Moldova 1 +▁solucionar 1 +▁Día 1 +▁sorprend 1 +▁quedado 1 +mple 1 +licit 1 +▁buques 1 +▁plazos 1 +▁tome 1 +fort 1 +▁http 1 +’ 1 +▁propuso 1 +▁arreglos 1 +▁solicitantes 1 +▁Q 1 +▁finalizar 1 +▁alojamiento 1 +▁electricidad 1 +▁apenas 1 +▁jugar 1 +▁prestan 1 +▁asignar 1 +▁basados 1 +▁subrayar 1 +▁uniforme 1 +IM 1 +▁comunica 1 +▁presentaron 1 +nova 1 +▁patente 1 +▁imaginar 1 +▁planteamiento 1 +▁quiera 1 +▁normalmente 1 +▁estadounidense 1 +RO 1 +▁lamentable 1 +▁che 1 +▁enviado 1 +ani 1 +▁ponen 1 +▁art 1 +▁dispuesta 1 +▁maestros 1 +▁FAO 1 +▁prácticos 1 +▁controversias 1 +▁UNESCO 1 +▁responde 1 +▁resta 1 +▁suelen 1 +▁50% 1 +▁científico 1 +▁creados 1 +▁legisla 1 +▁complejidad 1 +▁expulsión 1 +▁gasta 1 +▁apropiada 1 +comp 1 +▁avanza 1 +▁Londres 1 +▁casas 1 +82 1 +▁hija 1 +▁alega 1 +▁Eslovaquia 1 +▁recomendar 1 +▁Debería 1 +▁cálculo 1 +▁movilizar 1 +▁charla 1 +▁corte 1 +▁vigilar 1 +62 1 +▁don 1 +▁Tom 1 +▁niña 1 +▁ministerial 1 +▁pensando 1 +▁envío 1 +stitui 1 +▁retirada 1 +▁regresar 1 +▁amplias 1 +▁2006-2007 1 +▁(1999) 1 +▁Constitucional 1 +dina 1 +▁Euro 1 +▁Tecnología 1 +▁adaptar 1 +▁rige 1 +▁recuperar 1 +NA 1 +▁vigentes 1 +▁Tanzanía 1 +▁encontrado 1 +▁Ban 1 +▁madres 1 +▁Coordinador 1 +▁pareja 1 +▁sorprendente 1 +▁imparcial 1 +▁específico 1 +▁Kazajstán 1 +▁xenofobia 1 +▁pensiones 1 +dy 1 +▁declarado 1 +▁bilateral 1 +▁distinción 1 +▁utilidad 1 +US 1 +cí 1 +mun 1 +▁dirige 1 +08 1 +▁Integra 1 +▁creencias 1 +▁agrado 1 +col 1 +▁enfrentan 1 +Puedo 1 +▁verano 1 +▁urbanas 1 +▁oído 1 +▁dispuestos 1 +▁Culturales 1 +▁Nam 1 +▁registra 1 +▁solar 1 +▁cumple 1 +▁Observando 1 +▁defini 1 +ction 1 +▁obstaculiza 1 +▁socorro 1 +▁Principios 1 +▁ilícitos 1 +▁práctico 1 +▁aniversario 1 +▁receptor 1 +▁escenario 1 +gri 1 +vesti 1 +adores 1 +▁listas 1 +mia 1 +▁abandona 1 +▁Comisaria 1 +▁biblioteca 1 +▁diaria 1 +▁Segundo 1 +▁mezcla 1 +▁cuadr 1 +▁invitó 1 +▁mantenido 1 +▁extranjera 1 +▁Malta 1 +ight 1 +▁foros 1 +▁combinación 1 +▁municipio 1 +▁Resulta 1 +▁armamentos 1 +▁virus 1 +▁expresaron 1 +▁explicación 1 +▁alternativa 1 +▁etiqueta 1 +▁ocupar 1 +▁adquisiciones 1 +▁discurso 1 +▁almacenamiento 1 +▁venido 1 +▁Letonia 1 +▁Albania 1 +▁quieres 1 +▁recepción 1 +▁Partido 1 +▁legítimo 1 +▁aviones 1 +▁fijado 1 +▁concluye 1 +▁John 1 +▁exigencias 1 +▁considerables 1 +ham 1 +▁registros 1 +▁verdaderamente 1 +▁inició 1 +▁odio 1 +tual 1 +▁étnicas 1 +▁apartamento 1 +▁universo 1 +▁libremente 1 +ET 1 +▁barrera 1 +▁rela 1 +▁consonancia 1 +▁crítico 1 +▁financiado 1 +▁(2000) 1 +▁Camerún 1 +▁Nairobi 1 +▁propietario 1 +▁tuve 1 +▁salvaguardias 1 +▁postura 1 +▁disco 1 +▁ubicación 1 +52 1 +lip 1 +▁preliminar 1 +▁imagina 1 +▁construye 1 +▁esposa 1 +▁concede 1 +▁Mont 1 +▁RE 1 +▁aprovecha 1 +▁serían 1 +▁63 1 +▁religiosa 1 +▁Ben 1 +▁satisfactoria 1 +▁fraude 1 +mita 1 +▁dada 1 +▁oral 1 +▁blanqueo 1 +▁ja 1 +▁transforma 1 +▁agradecer 1 +▁traslado 1 +▁retirar 1 +▁participaron 1 +▁preste 1 +▁cubrir 1 +▁expresamente 1 +▁envía 1 +▁constantemente 1 +▁mundialización 1 +▁parque 1 +▁aumentó 1 +▁aceptado 1 +▁Bri 1 +▁Col 1 +MO 1 +▁temor 1 +▁colega 1 +terna 1 +▁hubiese 1 +▁sentimiento 1 +▁rom 1 +▁dedicada 1 +▁Trans 1 +▁ensayos 1 +▁beneficiarios 1 +▁siento 1 +▁agenda 1 +▁equivoca 1 +▁piensan 1 +osos 1 +è 1 +ánico 1 +▁medir 1 +if 1 +▁investigadores 1 +▁invertir 1 +▁madera 1 +57 1 +▁Mauricio 1 +▁evidencia 1 +▁instrucción 1 +▁impulsar 1 +▁acusados 1 +▁gravedad 1 +▁comentario 1 +virt 1 +▁mensajes 1 +▁reconoció 1 +▁corporal 1 +▁dieron 1 +▁ciudadanía 1 +▁sangre 1 +▁Necesitamos 1 +▁profesores 1 +▁Singapur 1 +▁voluntarios 1 +Original 1 +▁Camp 1 +▁terrible 1 +▁disponga 1 +tz 1 +ulación 1 +▁vea 1 +▁definido 1 +▁É 1 +▁2004-2005 1 +▁Luxemburgo 1 +▁tipifica 1 +▁Vol 1 +eccion 1 +▁desplazadas 1 +▁generaciones 1 +▁desmovilización 1 +▁aparato 1 +▁interino 1 +▁lamenta 1 +▁jugador 1 +▁logrados 1 +▁centrales 1 +greso 1 +▁exporta 1 +ek 1 +▁Recomendación 1 +▁concertado 1 +7/ 1 +▁titulada 1 +tenta 1 +▁Cuenta 1 +▁centrar 1 +▁geo 1 +▁Bruselas 1 +▁Islandia 1 +▁Subraya 1 +▁dimensiones 1 +▁abre 1 +▁limpia 1 +▁hecha 1 +▁presunta 1 +▁periodo 1 +▁expectativas 1 +LA 1 +▁Fuerzas 1 +UE 1 +PI 1 +▁desean 1 +▁arquitectura 1 +▁productividad 1 +▁invoca 1 +ciencia 1 +▁banda 1 +▁credibilidad 1 +▁ninguno 1 +▁organizó 1 +▁actúa 1 +▁externos 1 +▁noveno 1 +rc 1 +▁pilar 1 +▁Kyoto 1 +▁constructivo 1 +▁Decreto 1 +ándole 1 +▁cambiado 1 +▁ejemplar 1 +▁Habid 1 +▁verbal 1 +▁Za 1 +▁inaceptable 1 +▁detallado 1 +▁necesariamente 1 +▁proponer 1 +▁» 1 +▁facilitado 1 +WG 1 +▁maneja 1 +▁derivados 1 +▁crimen 1 +▁comer 1 +▁dudas 1 +▁Qatar 1 +▁sanciona 1 +▁extremadamente 1 +▁entró 1 +▁tercero 1 +▁cuáles 1 +▁enseña 1 +▁Liga 1 +tieron 1 +▁cohesión 1 +▁empezó 1 +▁parecía 1 +▁protesta 1 +▁incidentes 1 +▁deposit 1 +▁Uzbekistán 1 +▁promueve 1 +▁preservar 1 +▁suministros 1 +▁promueva 1 +▁investiga 1 +iese 1 +lógico 1 +▁significado 1 +ducido 1 +▁encomia 1 +lli 1 +▁detectar 1 +▁Estonia 1 +▁salvar 1 +for 1 +Bissau 1 +▁sufragar 1 +lares 1 +▁piezas 1 +▁especializada 1 +iones 1 +▁imperio 1 +▁contraído 1 +zu 1 +▁cuán 1 +by 1 +▁Espacio 1 +ónica 1 +▁autónomos 1 +▁interesado 1 +▁socios 1 +tive 1 +SI 1 +▁ratificar 1 +▁tercio 1 +▁radical 1 +▁genética 1 +▁obtiene 1 +▁destacó 1 +▁consideraciones 1 +▁creando 1 +párr 1 +▁Nicaragua 1 +▁PIB 1 +▁subvenciones 1 +▁mutuo 1 +▁aérea 1 +▁complementa 1 +▁círculo 1 +▁remuneración 1 +▁contribuya 1 +▁transporta 1 +▁utilizada 1 +▁existir 1 +▁Modelo 1 +▁13.00 1 +pol 1 +▁clasifica 1 +▁2008-2009 1 +▁expansión 1 +▁poderes 1 +▁alcanza 1 +▁Varios 1 +▁plat 1 +▁renuncia 1 +▁actualizada 1 +▁planteado 1 +véanse 1 +▁religiones 1 +▁vacantes 1 +▁apoye 1 +▁gal 1 +▁Jurídicos 1 +▁trabajado 1 +▁estación 1 +quí 1 +▁sometida 1 +▁págs 1 +▁químicas 1 +▁alcanzados 1 +▁Ministerial 1 +▁verse 1 +▁sujetos 1 +▁coordinada 1 +3/ 1 +Qu 1 +▁subsidiarios 1 +▁cerrado 1 +▁clic 1 +▁Podría 1 +▁sólido 1 +▁piloto 1 +▁CON 1 +▁actores 1 +mpi 1 +ö 1 +▁comprobar 1 +▁importación 1 +▁Río 1 +▁reúne 1 +▁mejorado 1 +▁barco 1 +▁peticiones 1 +▁buscando 1 +▁Roja 1 +▁Sociedad 1 +▁embarazo 1 +▁recuerdo 1 +▁vídeo 1 +▁reclutamiento 1 +▁profesor 1 +struct 1 +▁titular 1 +▁británico 1 +▁silencio 1 +▁apelación 1 +▁debatir 1 +tric 1 +▁pacíficos 1 +▁Quizá 1 +▁cruza 1 +▁estructurales 1 +▁plantean 1 +▁aleja 1 +▁golpe 1 +▁cuánto 1 +ándolo 1 +ndar 1 +▁Reco 1 +▁monta 1 +▁Ciudad 1 +▁piedra 1 +▁extremo 1 +tch 1 +ENT 1 +▁elimina 1 +▁producen 1 +ung 1 +▁atmósfera 1 +▁femenina 1 +▁respectivas 1 +▁recauda 1 +▁sostiene 1 +▁secciones 1 +▁dedicar 1 +▁nombrado 1 +gina 1 +har 1 +▁universidades 1 +▁útiles 1 +▁Faso 1 +▁Consulta 1 +▁impulsa 1 +▁aprueba 1 +▁Dos 1 +bal 1 +▁destinada 1 +▁temperatura 1 +▁Ante 1 +▁precedentes 1 +▁romaníes 1 +▁libera 1 +▁Salón 1 +iti 1 +▁OSSI 1 +▁sugiere 1 +cula 1 +▁Toda 1 +▁relacionado 1 +▁apoyado 1 +rina 1 +▁recibidas 1 +▁convenio 1 +▁impuestas 1 +▁Cruz 1 +▁negativas 1 +▁Soy 1 +▁constructiva 1 +▁periodistas 1 +▁conoce 1 +peri 1 +▁Plataforma 1 +▁conducir 1 +▁legislativa 1 +▁Mujeres 1 +▁claridad 1 +▁asumido 1 +▁ocasiona 1 +▁conocida 1 +cultural 1 +▁eres 1 +▁ocurrió 1 +▁fracaso 1 +▁masiva 1 +▁deseen 1 +uar 1 +▁ordenamiento 1 +▁Unidad 1 +▁religiosos 1 +SO 1 +▁flujo 1 +▁muro 1 +▁75 1 +▁aquellas 1 +TO 1 +Me 1 +▁CD 1 +IG 1 +▁Tre 1 +ificó 1 +▁propósitos 1 +▁orgánica 1 +▁sugirió 1 +▁cometidas 1 +▁afrontar 1 +▁premio 1 +▁consagra 1 +▁hago 1 +CH 1 +▁bienvenida 1 +▁opina 1 +▁división 1 +▁socio 1 +cy 1 +▁Defensor 1 +▁impresión 1 +▁limitación 1 +2005 1 +▁positivas 1 +▁supera 1 +▁Yugoslava 1 +▁Habie 1 +▁detrás 1 +▁nave 1 +venga 1 +pet 1 +▁elegidos 1 +ik 1 +▁fomenta 1 +CRC 1 +▁Dicha 1 +** 1 +▁encuentro 1 +vivi 1 +ich 1 +▁Primero 1 +▁conscientes 1 +▁Gal 1 +▁Unida 1 +ft 1 +▁Sé 1 +▁Th 1 +▁Finalmente 1 +▁epidemia 1 +▁ayude 1 +▁comparti 1 +▁Imp 1 +▁viendo 1 +▁repatriación 1 +▁cierre 1 +▁combate 1 +▁aumente 1 +▁Panamá 1 +▁terrorista 1 +▁ADN 1 +▁décadas 1 +▁suspensión 1 +▁oradora 1 +▁depósito 1 +Los 1 +▁explosivos 1 +▁subregional 1 +▁1989 1 +sistir 1 +▁probar 1 +▁antecedentes 1 +▁oportuno 1 +▁probabilidad 1 +▁consideramos 1 +▁experto 1 +▁persistente 1 +▁informaciones 1 +▁Zambia 1 +▁océanos 1 +▁paciente 1 +▁hospitales 1 +▁Google 1 +▁objeciones 1 +▁Sexta 1 +▁Había 1 +▁sufren 1 +▁centrado 1 +%) 1 +▁socava 1 +▁reconocidos 1 +▁proporcionada 1 +▁resistencia 1 +▁publicó 1 +▁vacaciones 1 +▁ahorro 1 +▁industriales 1 +▁establecen 1 +cogiendo 1 +▁retorno 1 +▁Estaba 1 +▁culpa 1 +▁Posteriormente 1 +▁parlamentario 1 +▁reemplaza 1 +▁transfronterizo 1 +▁acreedores 1 +iana 1 +▁consultiva 1 +▁convino 1 +▁ocuparse 1 +▁extranjeras 1 +▁inspección 1 +▁Yemen 1 +▁carne 1 +▁obligatorio 1 +TI 1 +▁adoptando 1 +▁inventario 1 +▁Cri 1 +▁finanzas 1 +ige 1 +▁Emp 1 +plaza 1 +▁alquiler 1 +▁diseñar 1 +iéramos 1 +▁véase 1 +▁tren 1 +▁bruto 1 +▁universidad 1 +▁obligados 1 +▁transformación 1 +▁Investigaciones 1 +▁Jamaica 1 +▁escuchado 1 +▁complica 1 +lecomunicaciones 1 +▁Igualdad 1 +▁inmunidad 1 +pone 1 +▁académico 1 +▁perfil 1 +▁costes 1 +▁utilizarse 1 +▁gases 1 +▁cura 1 +▁(2003) 1 +▁Debido 1 +▁débil 1 +▁usan 1 +2006 1 +▁corresponden 1 +▁dará 1 +▁provincias 1 +6/ 1 +▁recomendado 1 +▁Guía 1 +▁Gra 1 +▁fiable 1 +▁Reitera 1 +▁publicidad 1 +▁gráfico 1 +▁prepara 1 +▁feliz 1 +▁migratorios 1 +▁cumplen 1 +▁Pese 1 +▁policial 1 +▁Lista 1 +▁generalmente 1 +▁campamentos 1 +▁estricta 1 +▁litoral 1 +ACIÓN 1 +▁requerir 1 +▁asisten 1 +▁presos 1 +▁voluntario 1 +▁estancia 1 +▁DEL 1 +▁emprender 1 +▁agrupa 1 +MP 1 +▁compensa 1 +▁obligado 1 +▁previas 1 +▁apropiados 1 +▁extraño 1 +▁rapidez 1 +▁Bra 1 +▁veo 1 +▁traducción 1 +▁cero 1 +▁Madrid 1 +▁asiento 1 +▁disponen 1 +▁revolución 1 +▁Consolidación 1 +▁accesible 1 +▁ventaja 1 +▁Malí 1 +▁compañero 1 +▁vuelva 1 +▁orientado 1 +▁cumpli 1 +▁Burkina 1 +▁intervenir 1 +▁encarcela 1 +▁Che 1 +▁Observación 1 +▁10% 1 +▁Gi 1 +burg 1 +fico 1 +▁delante 1 +▁65 1 +▁Centroafricana 1 +▁aportaciones 1 +▁adquirido 1 +▁refieren 1 +▁afectar 1 +▁relaciona 1 +▁intercambiar 1 +▁ayer 1 +▁piel 1 +▁traslad 1 +▁supervivencia 1 +▁Participa 1 +▁20% 1 +zona 1 +▁irre 1 +▁exteriores 1 +▁2015 1 +ificar 1 +▁Chris 1 +▁Evaluación 1 +▁máquinas 1 +▁animal 1 +▁Law 1 +▁trataba 1 +▁Nosotros 1 +▁Zimbabwe 1 +▁viejo 1 +▁tradición 1 +▁55/2 1 +▁reglamentación 1 +▁Dicho 1 +▁negativos 1 +▁situada 1 +▁mensual 1 +▁permitiría 1 +▁examinará 1 +▁felicita 1 +▁abandonar 1 +▁compuesto 1 +▁escasa 1 +▁Oficial 1 +uri 1 +▁1373 1 +▁indirecta 1 +▁inciso 1 +PL 1 +▁vínculo 1 +▁indebido 1 +▁Transición 1 +▁imposición 1 +▁reacción 1 +▁mover 1 +▁ecosistemas 1 +▁océano 1 +▁brecha 1 +and 1 +▁inclusive 1 +▁incumbe 1 +▁cesación 1 +▁Fra 1 +▁llevando 1 +▁marina 1 +▁Puerto 1 +/2007/ 1 +▁asocia 1 +▁And 1 +OL 1 +▁pared 1 +▁Independiente 1 +▁peligrosos 1 +▁operativo 1 +▁Washington 1 +▁gratuito 1 +▁viernes 1 +▁recién 1 +@ 1 +▁provisionales 1 +▁iniciales 1 +▁ejerce 1 +ku 1 +pto 1 +▁permitió 1 +▁equidad 1 +▁siguiera 1 +▁Hoteles 1 +▁cercano 1 +▁constitución 1 +▁escolares 1 +▁viva 1 +▁llegada 1 +▁2002-2003 1 +▁Agencia 1 +▁Control 1 +▁declarar 1 +▁Benin 1 +▁Lucha 1 +▁identifica 1 +▁cielo 1 +RES 1 +▁Ven 1 +▁fuese 1 +▁liberación 1 +▁desigualdad 1 +▁estarán 1 +ther 1 +▁Nivel 1 +▁marítimo 1 +▁tropas 1 +▁sensible 1 +▁(2006) 1 +▁parlamentaria 1 +▁Registro 1 +▁apunta 1 +▁Haya 1 +▁encontraba 1 +▁(2005) 1 +▁escrita 1 +mí 1 +▁Liechtenstein 1 +ure 1 +ática 1 +▁incentivos 1 +▁150 1 +▁aplique 1 +▁Celebra 1 +▁discriminatoria 1 +LE 1 +▁regulación 1 +▁embarazada 1 +▁proseguir 1 +▁gira 1 +▁pasada 1 +▁ética 1 +▁servidor 1 +▁residuos 1 +▁cancela 1 +▁privación 1 +▁duro 1 +▁participó 1 +▁formulario 1 +▁contribuirá 1 +▁1.000 1 +venta 1 +▁presentarse 1 +▁Directora 1 +poli 1 +▁18.00 1 +ONU 1 +▁alianzas 1 +IL 1 +▁aporte 1 +▁juvenil 1 +▁Cambio 1 +figura 1 +▁coordinado 1 +▁considerando 1 +▁desertificación 1 +▁ilustra 1 +▁protegido 1 +▁propicia 1 +▁describir 1 +▁enseñar 1 +▁ricos 1 +▁Fuente 1 +▁degradantes 1 +▁jurisprudencia 1 +▁matemática 1 +▁Durban 1 +▁1980 1 +▁viajar 1 +cito 1 +▁juventud 1 +▁contenidas 1 +▁Formas 1 +▁determinada 1 +▁procesamiento 1 +▁actualización 1 +sent 1 +▁Indígenas 1 +▁avanzada 1 +▁destacado 1 +▁antiguos 1 +▁diplomático 1 +▁sostenido 1 +▁sensación 1 +▁elabora 1 +▁cumpla 1 +▁núcleo 1 +▁sequía 1 +Si 1 +▁creada 1 +▁empecé 1 +▁tomen 1 +éis 1 +▁facultades 1 +CONF 1 +▁desarrollando 1 +▁apoyando 1 +▁evoluciona 1 +▁denominado 1 +▁contienen 1 +IF 1 +▁asegurarse 1 +▁ponerse 1 +▁Dominicana 1 +▁estadísticos 1 +▁comenzado 1 +▁secuestro 1 +dujeron 1 +▁divulgación 1 +▁encaminados 1 +▁perjudicial 1 +▁recibieron 1 +▁subrayó 1 +▁presten 1 +▁gar 1 +▁permanecer 1 +▁hechas 1 +▁obstáculo 1 +▁facultad 1 +▁Mc 1 +▁memorando 1 +▁expediente 1 +ducción 1 +▁dispositivo 1 +▁magnitud 1 +▁perjudica 1 +▁distribuido 1 +▁olvidar 1 +▁capitales 1 +▁reclama 1 +▁vehículo 1 +▁Casa 1 +▁respaldo 1 +▁décimo 1 +▁with 1 +▁64 1 +▁Siempre 1 +▁delincuentes 1 +▁africana 1 +DP 1 +▁Están 1 +▁observado 1 +▁Monterrey 1 +▁asesina 1 +king 1 +cara 1 +▁presunto 1 +▁lunes 1 +▁cárcel 1 +▁goce 1 +▁módulo 1 +▁escasez 1 +▁asciende 1 +▁regresa 1 +▁Tenía 1 +▁neuro 1 +▁iraquíes 1 +▁dispositivos 1 +▁ubica 1 +▁consideren 1 +▁Barcelona 1 +▁incidencia 1 +pel 1 +▁piso 1 +▁poseedores 1 +dez 1 +▁potable 1 +▁subtema 1 +▁departamento 1 +▁Ku 1 +▁ajustar 1 +▁sencillo 1 +▁considero 1 +cuerda 1 +▁banco 1 +▁Estupefacientes 1 +▁energético 1 +▁lógica 1 +▁tira 1 +▁necesitaba 1 +▁perfectamente 1 +▁ministros 1 +▁testimonio 1 +▁asegure 1 +▁Provisional 1 +▁cónyuge 1 +▁solicite 1 +▁Final 1 +▁líder 1 +▁retira 1 +2.000 1 +▁perfeccion 1 +Estados 1 +▁mejorando 1 +▁resumida 1 +cabeza 1 +▁iguales 1 +marca 1 +CD 1 +▁sugerencias 1 +▁Namibia 1 +▁promoviendo 1 +▁disfruta 1 +cierto 1 +▁generado 1 +▁accidentes 1 +ate 1 +▁socioeconómico 1 +▁resultantes 1 +ducto 1 +▁realista 1 +▁mutuamente 1 +▁iglesia 1 +▁posesión 1 +FOR 1 +▁habita 1 +▁TV 1 +▁Vo 1 +▁brillante 1 +▁prosperidad 1 +▁pornografía 1 +▁crece 1 +▁secreta 1 +▁pens 1 +▁maternidad 1 +▁afirmó 1 +moni 1 +▁acabar 1 +▁admisibilidad 1 +ture 1 +▁VII 1 +▁docente 1 +▁cuidados 1 +▁Jamahiriya 1 +▁estábamos 1 +▁interesada 1 +▁gestionar 1 +poner 1 +▁chica 1 +▁Documentación 1 +▁inhumanos 1 +▁progresiva 1 +▁vuelto 1 +▁decisivo 1 +▁valioso 1 +▁plaza 1 +▁controversia 1 +▁Delincuencia 1 +▁orgullo 1 +▁Paul 1 +▁suscita 1 +▁autorizada 1 +▁funcione 1 +▁contabilidad 1 +▁Marte 1 +▁consumidor 1 +▁proporcionan 1 +lau 1 +▁almacena 1 +▁señales 1 +▁llamamos 1 +EM 1 +▁deudor 1 +.4/ 1 +▁reunió 1 +▁desearía 1 +▁penitenciario 1 +▁árboles 1 +▁informático 1 +▁sospechoso 1 +▁valiosa 1 +▁report 1 +▁decreto 1 +▁agencias 1 +▁EL 1 +▁oficialmente 1 +▁OMS 1 +▁forzada 1 +▁vota 1 +▁propiedades 1 +▁prohibido 1 +▁Honduras 1 +▁equitativo 1 +▁Public 1 +▁Considera 1 +▁celebre 1 +▁empeño 1 +gun 1 +▁mini 1 +▁definitivo 1 +▁sentado 1 +▁crueles 1 +spir 1 +tiene 1 +▁Normas 1 +lón 1 +▁acreedor 1 +▁mutua 1 +▁MONUC 1 +▁diamantes 1 +▁fábrica 1 +▁parlamento 1 +▁órdenes 1 +▁sindicatos 1 +▁vender 1 +▁belleza 1 +▁orientaciones 1 +▁lanzamiento 1 +▁condiciona 1 +▁fiscalización 1 +▁directivo 1 +▁óptima 1 +▁corregir 1 +▁incluía 1 +ling 1 +▁Observaciones 1 +NI 1 +▁hablamos 1 +▁estudiando 1 +DH 1 +▁extensión 1 +▁prohibir 1 +▁EN 1 +▁aspira 1 +▁sueldos 1 +CR 1 +/10 1 +▁especialistas 1 +▁esclavitud 1 +▁café 1 +▁modificado 1 +▁experimental 1 +Di 1 +▁productivo 1 +▁estadística 1 +▁justificar 1 +▁(2002) 1 +▁consultivo 1 +▁ingeniería 1 +▁estrictamente 1 +▁cerrar 1 +▁inspeccion 1 +▁negociar 1 +cular 1 +▁agradecería 1 +▁estricto 1 +▁curs 1 +“ 1 +▁cometer 1 +mero 1 +▁talleres 1 +▁SE 1 +▁siguiendo 1 +▁legitimidad 1 +▁oculta 1 +▁Deseo 1 +▁unilateral 1 +▁situ 1 +▁pesquera 1 +▁reclusos 1 +▁tejido 1 +▁pensaba 1 +▁exclusiva 1 +▁compro 1 +▁Tayikistán 1 +ité 1 +stituye 1 +▁1988 1 +▁preparando 1 +▁World 1 +▁paisaje 1 +▁absoluta 1 +iller 1 +▁enunciados 1 +▁fiduciario 1 +▁restablecer 1 +▁genial 1 +▁inevitable 1 +▁tarifa 1 +▁Kar 1 +▁manifestar 1 +▁indemniza 1 +/64/ 1 +▁complementario 1 +▁recordó 1 +▁deterioro 1 +FR 1 +▁visado 1 +▁Fer 1 +▁fórmula 1 +▁psicológica 1 +▁cultiva 1 +izo 1 +▁actitudes 1 +▁pelo 1 +▁Federativa 1 +▁invasión 1 +▁mostrado 1 +▁teníamos 1 +▁Consultivo 1 +▁mono 1 +▁Regla 1 +▁diagnóstico 1 +▁proyecta 1 +▁septentrional 1 +▁decisiva 1 +▁Respect 1 +▁municipales 1 +ish 1 +▁Libertad 1 +▁reiterar 1 +▁convocar 1 +▁ventana 1 +goberna 1 +▁Fiscalía 1 +▁Mozambique 1 +▁constituía 1 +▁lujo 1 +izaciones 1 +-5 1 +▁Índice 1 +▁transformar 1 +/2008/ 1 +▁Sáhara 1 +▁bancaria 1 +▁Nunca 1 +▁80% 1 +▁mediados 1 +▁sustituir 1 +▁usado 1 +à 1 +▁UNMIK 1 +▁respaldar 1 +▁autoriza 1 +rey 1 +▁directores 1 +▁personalidad 1 +▁bloque 1 +▁incorporado 1 +▁Preparatorio 1 +▁ecológica 1 +ende 1 +▁altamente 1 +▁Tur 1 +▁accidente 1 +▁formularon 1 +▁maravilloso 1 +▁virtual 1 +▁productiva 1 +▁basta 1 +▁estimula 1 +Í 1 +▁Inspección 1 +▁francesa 1 +▁incompatible 1 +▁privilegio 1 +▁vivía 1 +▁procurar 1 +▁iraquí 1 +▁400 1 +▁Cualquier 1 +▁excepciones 1 +ambi 1 +▁catástrofe 1 +▁Guerra 1 +▁disparidad 1 +▁suele 1 +▁continuará 1 +▁presupuestaria 1 +IDA 1 +▁plantilla 1 +▁acordó 1 +ME 1 +▁tradiciones 1 +▁instó 1 +WP 1 +▁poca 1 +▁afectado 1 +▁importaciones 1 +▁acusa 1 +▁Existe 1 +▁distribuye 1 +▁cuantía 1 +▁multa 1 +▁preparatorio 1 +▁Planificación 1 +▁concienciación 1 +▁automóvil 1 +▁construido 1 +Mi 1 +▁centrarse 1 +▁Sub 1 +▁respeten 1 +Com 1 +▁protegida 1 +▁respira 1 +centr 1 +vía 1 +ib 1 +С 1 +▁Habitaciones 1 +▁Mejor 1 +▁diría 1 +▁introducido 1 +▁podremos 1 +▁mitigar 1 +▁morir 1 +gráfico 1 +▁PRO 1 +▁Tri 1 +▁añadido 1 +▁exhaustiva 1 +▁pasajeros 1 +▁irregular 1 +▁reduce 1 +▁policiales 1 +▁inestabilidad 1 +▁inseguridad 1 +▁propicio 1 +▁conservar 1 +▁vienen 1 +▁reviste 1 +▁funcional 1 +▁hablado 1 +▁cuestiona 1 +▁Cal 1 +▁generalizada 1 +▁Montreal 1 +▁jueves 1 +▁hermoso 1 +▁porteador 1 +▁Auditores 1 +ence 1 +▁recopilación 1 +▁protege 1 +▁viaja 1 +▁acordar 1 +▁Natural 1 +▁fundamenta 1 +▁puente 1 +▁anfitrión 1 +▁dictamen 1 +▁ejecuciones 1 +▁estupefacientes 1 +о 1 +▁brazo 1 +ive 1 +▁placer 1 +▁contamina 1 +▁automáticamente 1 +▁otorgar 1 +▁separada 1 +▁perfecto 1 +▁remitir 1 +▁implanta 1 +▁dificultad 1 +▁decidida 1 +OC 1 +DO 1 +▁quedó 1 +▁detección 1 +▁Mediterráneo 1 +▁emprendido 1 +▁invernadero 1 +▁produjo 1 +▁Existen 1 +▁étnica 1 +▁armonizar 1 +▁señalaron 1 +▁urbana 1 +▁degradación 1 +▁museo 1 +▁asesores 1 +activ 1 +▁literalmente 1 +▁incertidumbre 1 +tendiendo 1 +212) 1 +▁dispara 1 +▁30% 1 +▁manipula 1 +▁Paraguay 1 +▁poderoso 1 +▁efectuado 1 +▁mantienen 1 +▁imagin 1 +▁nombrar 1 +▁CNUDMI 1 +▁cotidiana 1 +▁refugio 1 +▁963- 1 +▁Armas 1 +▁preserva 1 +▁sentar 1 +▁titulares 1 +zz 1 +▁resulte 1 +▁Creemos 1 +▁preocupante 1 +.400 1 +▁profundidad 1 +▁bloqueo 1 +& 1 +▁verificar 1 +EL 1 +▁crecer 1 +▁PYME 1 +▁socioeconómica 1 +▁administradora 1 +▁celebraron 1 +To 1 ++ 1 +▁Jurídica 1 +▁hermosa 1 +▁famoso 1 +▁actualizado 1 +▁inadmisible 1 +▁marítima 1 +▁resuelto 1 +▁semejante 1 +TRA 1 +ducir 1 +▁debilita 1 +berg 1 +ä 1 +▁intensa 1 +htm 1 +▁incrementa 1 +▁Alimentación 1 +▁desayuno 1 +▁eléctrica 1 +▁puntual 1 +▁forzoso 1 +▁pensión 1 +▁archivo 1 +▁globales 1 +▁arbitraje 1 +▁tendremos 1 +▁excepto 1 +▁club 1 +▁habilidades 1 +▁Auditor 1 +▁Emiratos 1 +▁afuera 1 +▁montón 1 +▁complementar 1 +▁conocí 1 +ísima 1 +0/ 1 +▁esperaba 1 +▁reembolso 1 +▁convirtió 1 +▁emplear 1 +COP 1 +▁Mongolia 1 +▁discapacidades 1 +▁Global 1 +▁Sabemos 1 +▁seriamente 1 +▁contratista 1 +▁Nu 1 +▁conduce 1 +▁excede 1 +▁prever 1 +▁llevará 1 +▁solía 1 +▁Lamentablemente 1 +▁aeronave 1 +▁navegación 1 +▁” 1 +▁Voy 1 +▁gravemente 1 +▁Bahrein 1 +▁Escuela 1 +▁sucedió 1 +▁soporta 1 +pie 1 +PR 1 +▁ayudará 1 +▁auxiliar 1 +▁entablar 1 +▁piscina 1 +▁misiles 1 +icidad 1 +▁envió 1 +▁poniendo 1 +▁móvil 1 +▁explorar 1 +▁Seguimiento 1 +▁damos 1 +▁Vamos 1 +▁negar 1 +▁artificial 1 +▁Monetario 1 +▁LOS 1 +▁editor 1 +▁asociado 1 +▁clínica 1 +▁continuidad 1 +▁actúe 1 +2009 1 +.300 1 +▁dotación 1 +▁Djibouti 1 +▁FMAM 1 +▁saludable 1 +▁flota 1 +PT 1 +▁cable 1 +▁frustra 1 +reestructuración 1 +▁minera 1 +▁ropa 1 +▁73 1 +▁unilaterales 1 +▁nutri 1 +▁mencionada 1 +▁suprimir 1 +▁aprendido 1 +▁ubicado 1 +▁agradable 1 +▁enemigo 1 +▁repercusión 1 +mbe 1 +tienda 1 +▁naturalmente 1 +anti 1 +▁fijar 1 +uelta 1 +▁desplegado 1 +▁recogida 1 +▁lleno 1 +▁discrimina 1 +▁nutrición 1 +▁afirmación 1 +▁contractual 1 +▁pintura 1 +▁hielo 1 +▁taller 1 +▁cine 1 +▁maestro 1 +▁tuvimos 1 +▁eventual 1 +▁lecciones 1 +▁evita 1 +▁presupuest 1 +▁coincide 1 +▁Fiduciario 1 +▁Mecanismo 1 +▁Ribera 1 +▁conmigo 1 +▁mueve 1 +▁electo 1 +[ 1 +▁recibida 1 +▁costumbre 1 +▁dominio 1 +▁empeora 1 +▁monetaria 1 +▁objetiva 1 +▁conversación 1 +▁origina 1 +▁disminuye 1 +▁supervisa 1 +▁Fiscalización 1 +▁bosque 1 +▁dólar 1 +▁conocen 1 +▁musulmanes 1 +▁Nuevo 1 +▁Somos 1 +▁obligada 1 +▁implementa 1 +▁circula 1 +▁pobre 1 +▁bacteria 1 +▁discapacitados 1 +▁Decisión 1 +▁edición 1 +dal 1 +▁distinto 1 +▁alentador 1 +▁encontrará 1 +▁talibanes 1 +▁vacío 1 +▁evalu 1 +▁doy 1 +▁ronda 1 +▁patrocinado 1 +▁bienal 1 +▁dieta 1 +▁colores 1 +▁vela 1 +▁doctor 1 +.600 1 +▁doce 1 +mail 1 +▁vigila 1 +▁forestal 1 +▁Proceso 1 +▁Consciente 1 +▁Ésta 1 +▁móviles 1 +▁mantenerse 1 +▁rendir 1 +▁canales 1 +▁registrar 1 +▁actualizar 1 +▁transfronteriza 1 +▁oralmente 1 +▁noticia 1 +güe 1 +vision 1 +▁Madagascar 1 +▁panorama 1 +▁importe 1 +▁infracciones 1 +▁censo 1 +▁empleadores 1 +▁coordinadores 1 +▁Financiero 1 +▁listo 1 +▁concentración 1 +▁atraer 1 +▁secc 1 +ney 1 +▁precisión 1 +▁Transporte 1 +▁Muy 1 +▁exploración 1 +▁Cuarta 1 +▁reflejar 1 +▁rojo 1 +▁enjuicia 1 +▁facilitación 1 +▁Ejército 1 +▁auténtica 1 +▁patrones 1 +▁llevada 1 +▁beneficiarse 1 +▁relaja 1 +NEPAD 1 +▁lesiones 1 +▁calor 1 +▁pronta 1 +▁Organizada 1 +▁pagado 1 +▁municipal 1 +▁electorales 1 +front 1 +▁adjunto 1 +▁umbral 1 +▁Abu 1 +▁cuándo 1 +▁Plaza 1 +▁Ze 1 +posiciones 1 +▁estructural 1 +▁planteadas 1 +▁reducida 1 +▁compartido 1 +2010 1 +▁Cabo 1 +▁aportación 1 +▁imputa 1 +▁sujeto 1 +▁transmite 1 +▁internet 1 +▁ordenador 1 +president 1 +▁minuto 1 +▁Copenhague 1 +▁alivio 1 +▁infecta 1 +kh 1 +uela 1 +▁preguntó 1 +▁sinergia 1 +▁wi 1 +▁alegaciones 1 +pusiera 1 +▁adjunta 1 +▁resultó 1 +▁basándose 1 +▁orientar 1 +▁aplicará 1 +▁correctamente 1 +/9 1 +▁pendiente 1 +▁reacciona 1 +▁validez 1 +▁ganancias 1 +▁confidencial 1 +▁usamos 1 +▁originales 1 +▁perpetrado 1 +▁recicla 1 +▁visible 1 +▁basarse 1 +patria 1 +▁comprador 1 +IR 1 +▁neutral 1 +▁habiendo 1 +▁ocupante 1 +▁acusaciones 1 +▁intentando 1 +▁obviamente 1 +▁preámbulo 1 +▁rechazo 1 +▁facilidad 1 +▁respondió 1 +▁emisión 1 +▁distinta 1 +▁disminuir 1 +▁hermana 1 +▁jurídicamente 1 +▁agradece 1 +▁falla 1 +▁deseamos 1 +▁Personas 1 +▁tragedia 1 +▁símbolo 1 +▁Aún 1 +▁aborto 1 +▁Casi 1 +▁Spa 1 +▁instalar 1 +▁antipersonal 1 +▁heridos 1 +rito 1 +▁triste 1 +▁consideraba 1 +▁liberal 1 +decisión 1 +▁permanece 1 +▁desgracia 1 +▁Atómica 1 +▁háb 1 +▁complicado 1 +.800 1 +▁malo 1 +▁desplaza 1 +▁impresionante 1 +▁alianza 1 +▁mío 1 +tente 1 +▁lanzar 1 +▁Situación 1 +▁droga 1 +▁parti 1 +▁United 1 +▁prórroga 1 +▁ofrecido 1 +▁emitido 1 +▁USD 1 +ding 1 +▁1967 1 +▁pista 1 +ç 1 +▁Johannesburgo 1 +▁macroeconómica 1 +▁transcurrido 1 +HRC 1 +▁neto 1 +▁40% 1 +▁observancia 1 +mental 1 +▁enfrentamiento 1 +CIA 1 +▁desigualdades 1 +▁secundario 1 +▁TNP 1 +▁Kong 1 +▁venir 1 +▁ruido 1 +▁sustenta 1 +▁abastecimiento 1 +▁circun 1 +▁maravillosa 1 +▁matricul 1 +▁Hong 1 +▁cubierta 1 +lement 1 +▁miércoles 1 +▁insiste 1 +cualesquiera 1 +▁indígena 1 +▁saca 1 +▁administrar 1 +▁olvida 1 +▁empezamos 1 +▁Parece 1 +▁restantes 1 +▁daña 1 +▁descubrimiento 1 +▁forzado 1 +Quién 1 +III 1 +▁Público 1 +▁clausura 1 +▁simultánea 1 +▁reunido 1 +▁caída 1 +▁minoría 1 +▁emocional 1 +CRP 1 +▁conciliación 1 +▁mediación 1 +▁vele 1 +▁Resumen 1 +▁derivadas 1 +Esta 1 +▁US 1 +▁amparo 1 +prime 1 +▁ocurrir 1 +▁preparada 1 +▁Preocupa 1 +▁refiero 1 +▁Trata 1 +/15 1 +▁custodia 1 +▁relevante 1 +▁incluirá 1 +▁constata 1 +▁escena 1 +▁necesite 1 +▁jamás 1 +▁Puesto 1 +▁elegante 1 +▁exposiciones 1 +▁negativo 1 +▁enfoca 1 +▁mostrarles 1 +▁negra 1 +▁asequible 1 +FCCC 1 +▁rango 1 +▁sujeción 1 +▁forestales 1 +▁aspiraciones 1 +▁obtención 1 +▁tenor 1 +▁africano 1 +▁propaga 1 +▁$ 1 +▁experimentado 1 +CEDAW 1 +▁equilibrada 1 +▁proclama 1 +▁hostilidades 1 +▁certificación 1 +▁iv 1 +▁acogió 1 +▁Militar 1 +▁ultra 1 +▁mitigación 1 +▁afgano 1 +▁volvió 1 +▁interpretar 1 +▁Financiera 1 +▁Meridional 1 +▁concluyó 1 +▁estudiante 1 +▁Vigilancia 1 +▁auspicios 1 +▁obtenida 1 +▁secuencia 1 +▁UNOPS 1 +▁David 1 +▁consultores 1 +▁innovadoras 1 +▁viento 1 +▁compartida 1 +▁vieron 1 +scentralización 1 +▁estimular 1 +▁sustancia 1 +▁Bel 1 +▁identificado 1 +EX 1 +▁profundiza 1 +▁Kha 1 +▁previamente 1 +▁preparatoria 1 +▁estimación 1 +logía 1 +▁académica 1 +▁directriz 1 +▁conviene 1 +▁retiro 1 +▁obligar 1 +▁Togo 1 +▁aproxima 1 +▁acuífero 1 +.100 1 +▁XX 1 +▁repente 1 +▁nace 1 +▁defensor 1 +▁Nadie 1 +▁inflación 1 +▁TIC 1 +▁admitir 1 +▁afecte 1 +▁desempeñado 1 +▁120 1 +▁tomadas 1 +▁coordinador 1 +▁reconozca 1 +▁Principales 1 +▁tensiones 1 +▁Marino 1 +▁aviso 1 +▁st 1 +▁Elección 1 +▁Queremos 1 +▁elevar 1 +▁clasificación 1 +▁peligroso 1 +lah 1 +▁quinta 1 +▁esencialmente 1 +XV 1 +▁sirio 1 +▁ciertamente 1 +▁requerido 1 +▁surge 1 +3.000 1 +▁Comunicación 1 +▁Tampoco 1 +▁reflexión 1 +▁Operación 1 +▁viabilidad 1 +igi 1 +▁provocado 1 +pondría 1 +▁prorrogar 1 +▁pierde 1 +▁recopila 1 +▁prestará 1 +▁candidato 1 +▁cuente 1 +▁averiguar 1 +2008 1 +▁+ 1 +▁alcohol 1 +▁destruir 1 +▁seguida 1 +▁cobra 1 +▁cola 1 +ICEF 1 +▁excesivo 1 +▁vivimos 1 +▁incaut 1 +▁creatividad 1 +sobre 1 +▁equivale 1 +▁elaborando 1 +▁batalla 1 +▁anunció 1 +▁logística 1 +▁ofrezca 1 +▁Todavía 1 +▁constituido 1 +chu 1 +▁enérgicamente 1 +▁llevaron 1 +▁perro 1 +▁Consideramos 1 +▁Mundo 1 +ándola 1 +▁Park 1 +▁oír 1 +tif 1 +▁pidieron 1 +▁seguimos 1 +Cuándo 1 +▁vendedor 1 +▁compila 1 +▁actualiza 1 +▁individuo 1 +▁Sírva 1 +▁Estocolmo 1 +▁patrón 1 +▁despert 1 +propia 1 +▁contenida 1 +▁sistemático 1 +▁transferir 1 +▁objeción 1 +▁pasaporte 1 +▁biológico 1 +▁delegados 1 +▁"¡ 1 +▁especializado 1 +▁ozono 1 +▁impreso 1 +▁comodidad 1 +▁inicialmente 1 +▁genes 1 +▁propagación 1 +▁She 1 +▁manifestado 1 +▁referirse 1 +cier 1 +▁percepción 1 +▁trabajadoras 1 +▁dificulta 1 +▁inventa 1 +▁Pregunta 1 +▁desapariciones 1 +▁solicitó 1 +▁sospecha 1 +▁Transnacional 1 +▁innovadores 1 +▁2011 1 +▁reunirse 1 +▁incidente 1 +▁cautela 1 +▁domicilio 1 +▁asociadas 1 +▁modifica 1 +▁recluta 1 +▁candidatura 1 +▁equipada 1 +▁imprescindible 1 +▁universitario 1 +▁renovación 1 +▁conlleva 1 +▁votantes 1 +▁72 1 +▁implementación 1 +▁proporcionando 1 +▁subregión 1 +▁Productos 1 +▁ascenso 1 +▁parto 1 +▁extraña 1 +▁Windows 1 +▁empezando 1 +▁Comisiones 1 +▁previsible 1 +▁estrecho 1 +▁prorrog 1 +▁1986 1 +view 1 +▁poderosa 1 +▁localidad 1 +▁interroga 1 +▁pedimos 1 +ić 1 +▁electro 1 +▁90% 1 +▁discusión 1 +▁codifica 1 +▁planea 1 +clav 1 +▁envejecimiento 1 +▁informática 1 +▁ejecutiva 1 +sistió 1 +presupuestarios 1 +▁Industrial 1 +▁cárceles 1 +▁convierta 1 +▁transacción 1 +▁alemán 1 +▁circunstancia 1 +▁civilizaciones 1 +▁dedicación 1 +▁100% 1 +▁medianas 1 +▁veía 1 +▁peores 1 +▁acusación 1 +▁Principal 1 +▁preliminares 1 +▁unanimidad 1 +▁Alineados 1 +▁gigante 1 +▁favorecer 1 +▁responda 1 +▁borra 1 +▁Report 1 +▁oración 1 +▁manteniendo 1 +▁desaparece 1 +▁rectores 1 +▁colocar 1 +▁gusto 1 +▁acoso 1 +▁falsa 1 +▁acondicionado 1 +▁oficioso 1 +▁sufrir 1 +▁desaparecido 1 +▁estableciendo 1 +▁singular 1 +▁Organizaciones 1 +▁becas 1 +Sub 1 +▁parcialmente 1 +ortalecimiento 1 +▁bancario 1 +▁limpieza 1 +▁Barbados 1 +▁fruto 1 +▁querido 1 +▁padece 1 +▁econom 1 +▁Botswana 1 +▁Género 1 +▁adherirse 1 +▁disminuido 1 +▁Conforme 1 +▁guardia 1 +▁techo 1 +▁cobrar 1 +▁verifica 1 +▁alfabetización 1 +▁plástico 1 +▁repetir 1 +▁escond 1 +poniendo 1 +▁boca 1 +▁interlocutores 1 +,000 1 +estructura 1 +▁factura 1 +▁proviene 1 +▁Fiji 1 +▁pacífico 1 +▁corrección 1 +▁Ud 1 +dista 1 +▁aptitudes 1 +▁jardín 1 +е 1 +▁entrenamiento 1 +▁prestó 1 +▁mirando 1 +▁conocemos 1 +scripciones 1 +▁defecto 1 +▁colaboradores 1 +▁blog 1 +más 1 +▁Comunicaciones 1 +▁soporte 1 +▁California 1 +▁Climático 1 +▁Empleo 1 +▁calificado 1 +▁consistente 1 +▁salón 1 +▁consultor 1 +▁desequilibrio 1 +▁Malawi 1 +▁teatro 1 +▁horario 1 +▁espiritual 1 +▁inaugura 1 +▁pandemia 1 +▁reinserción 1 +▁OSCE 1 +▁extender 1 +▁balance 1 +▁activista 1 +▁aboga 1 +▁desaparición 1 +▁prisiones 1 +▁interactivo 1 +▁Trabaja 1 +▁notificar 1 +▁atrapa 1 +estabiliza 1 +▁OOPS 1 +ffe 1 +▁intimida 1 +militar 1 +▁proveedor 1 +▁felicidad 1 +▁fiesta 1 +ibíd 1 +▁Científico 1 +▁aliviar 1 +▁conmemora 1 +▁FMI 1 +▁Administrativo 1 +▁lento 1 +▁cena 1 +▁Anti 1 +▁Ultraterrestre 1 +▁encontré 1 +▁reducciones 1 +▁amable 1 +▁formule 1 +▁configuración 1 +▁trasladar 1 +▁traducir 1 +▁doméstico 1 +▁prejuicio 1 +▁Iglesia 1 +▁proporcionó 1 +▁influir 1 +▁inscrito 1 +scendencia 1 +▁Éste 1 +▁traer 1 +▁confía 1 +▁tramita 1 +▁traza 1 +▁pieza 1 +▁encarar 1 +▁Capacitación 1 +▁Finanzas 1 +▁estabilización 1 +▁Frente 1 +▁contaminantes 1 +▁cuesta 1 +▁perfecta 1 +▁tramitación 1 +▁encaminada 1 +▁célula 1 +▁insistir 1 +Saben 1 +▁Mauritania 1 +▁molécula 1 +▁genital 1 +▁considerará 1 +Puede 1 +▁Directrices 1 +▁Recomendaciones 1 +▁musical 1 +▁tabaco 1 +▁UNITA 1 +▁conectar 1 +▁imparcialidad 1 +▁competitiva 1 +▁cometa 1 +▁56/2 1 +▁pedía 1 +▁Doy 1 +▁innovador 1 +▁Atlántico 1 +▁cerebral 1 +▁viviendo 1 +▁Empresa 1 +▁marido 1 +▁reanudar 1 +▁autorizar 1 +▁Balcanes 1 +▁cambió 1 +▁Tanto 1 +▁sentía 1 +▁controlado 1 +Música 1 +▁fronterizo 1 +▁terraza 1 +▁infección 1 +▁sectoriales 1 +▁cruce 1 +▁turco 1 +▁decidí 1 +▁Grandes 1 +▁procedente 1 +▁modern 1 +trop 1 +▁equilibrado 1 +▁aceite 1 +▁Dentro 1 +ística 1 +ão 1 +▁multiplica 1 +▁prohibida 1 +▁confisca 1 +▁explora 1 +▁hídricos 1 +▁inalienable 1 +▁trámite 1 +и 1 +▁conexiones 1 +▁estrés 1 +▁José 1 +▁franco 1 +▁actuando 1 +▁armonía 1 +▁Consenso 1 +▁compasión 1 +▁albergue 1 +▁discriminatorio 1 +▁simula 1 +▁à 1 +▁declarada 1 +▁Asentamientos 1 +▁arbitral 1 +▁designar 1 +▁bolsa 1 +CIÓN 1 +▁redacta 1 +▁auténtico 1 +▁descubierto 1 +▁desplegar 1 +▁válida 1 +▁ejecutado 1 +stitucion 1 +▁coloniales 1 +▁concilia 1 +▁testigo 1 +▁química 1 +▁violenta 1 +▁Pienso 1 +▁blanca 1 +▁inherente 1 +▁parecido 1 +▁elabore 1 +▁criatura 1 +▁obedece 1 +▁golpea 1 +▁fundada 1 +▁martes 1 +▁empezado 1 +▁estereotipos 1 +▁intersectorial 1 +▁lluvia 1 +▁violentos 1 +▁sobrevivir 1 +▁caliente 1 +▁redactar 1 +▁fila 1 +▁pura 1 +▁gestiones 1 +eciendo 1 +▁infracción 1 +▁ambicioso 1 +▁manejo 1 +▁acorde 1 +▁` 1 +▁literal 1 +▁versiones 1 +▁árbol 1 +▁hidro 1 +▁comprendida 1 +▁pudieron 1 +▁expres 1 +credit 1 +▁dinámico 1 +▁excluir 1 +▁Espacial 1 +▁Auto 1 +▁pierna 1 +▁decenas 1 +▁tensión 1 +▁manifestó 1 +▁proveniente 1 +▁reiteró 1 +▁subsistencia 1 +▁telefónica 1 +▁variable 1 +▁70% 1 +ident 1 +▁tutor 1 +▁Tercer 1 +▁Níger 1 +▁instituto 1 +▁lingüística 1 +▁satisfecho 1 +▁soberano 1 +▁referido 1 +▁colonial 1 +▁detecta 1 +▁logístico 1 +▁Libro 1 +▁digna 1 +.900 1 +Observador 1 +▁contenía 1 +▁homenaje 1 +▁rebeldes 1 +а 1 +▁perturba 1 +▁carbón 1 +▁niega 1 +▁1982 1 +▁concentrar 1 +▁gestiona 1 +▁italiano 1 +▁Electoral 1 +▁preparó 1 +▁was 1 +▁jornada 1 +# 1 +▁judío 1 +▁Club 1 +▁desglosados 1 +▁Poli 1 +▁trabajador 1 +gura 1 +▁reconociendo 1 +▁restricción 1 +▁refería 1 +▁ocupe 1 +▁pensado 1 +▁ratifica 1 +▁satisfactorio 1 +▁compensación 1 +▁Franja 1 +▁vieja 1 +▁paralela 1 +▁critica 1 +▁beneficiar 1 +▁Africano 1 +▁2020 1 +▁Basilea 1 +▁recíproca 1 +▁precedente 1 +▁campamento 1 +▁bloquea 1 +▁malaria 1 +▁lucro 1 +▁Rights 1 +▁1949 1 +▁explícitamente 1 +▁consagrados 1 +▁aceptada 1 +párrafo 1 +▁doctrina 1 +▁refuerza 1 +▁milenio 1 +▁emigr 1 +▁combatientes 1 +▁elaboró 1 +▁cosecha 1 +▁consigue 1 +▁refugiado 1 +▁creía 1 +▁Utilización 1 +▁informal 1 +▁armoniza 1 +▁legalidad 1 +▁apéndice 1 +▁privacidad 1 +▁Nations 1 +▁tangible 1 +▁liberar 1 +▁constituida 1 +▁habilita 1 +▁fal 1 +▁guarde 1 +▁aprende 1 +▁recae 1 +à 1 +▁cercana 1 +▁excluye 1 +▁intensifique 1 +▁George 1 +▁obvio 1 +▁autónoma 1 +▁explicó 1 +restablecimiento 1 +▁religioso 1 +▁1987 1 +▁talento 1 +▁Bush 1 +▁Trinidad 1 +▁convicción 1 +▁Permítanme 1 +▁espectacular 1 +▁incapacidad 1 +▁Formación 1 +▁racista 1 +▁signo 1 +▁auditor 1 +▁sirva 1 +▁visitantes 1 +▁helicóptero 1 +▁novedades 1 +▁recomendada 1 +▁empresarios 1 +▁caza 1 +▁adelanta 1 +Bueno 1 +▁afronta 1 +▁temporada 1 +LO 1 +/1999/ 1 +▁fax 1 +▁Presentación 1 +▁mutilación 1 +▁tuberculosis 1 +▁nervio 1 +▁plural 1 +▁borde 1 +▁subir 1 +▁lanzado 1 +É 1 +▁Bolivarian 1 +▁Secretaria 1 +▁ecológico 1 +▁Seminario 1 +▁arresto 1 +▁61/2 1 +▁rostro 1 +▁justificación 1 +1998 1 +▁DERECHO 1 +▁Mónaco 1 +▁trimestre 1 +▁Tareas 1 +óxido 1 +▁presiones 1 +▁definiciones 1 +▁creativa 1 +▁Kirguistán 1 +▁exhaustivo 1 +▁Reserva 1 +▁monitor 1 +▁atractivo 1 +▁Cuarto 1 +▁arroja 1 +▁reorganiza 1 +▁dispositiva 1 +▁huérfanos 1 +▁sudoriental 1 +▁pesquero 1 +▁from 1 +▁modificada 1 +▁Junto 1 +▁creativo 1 +disciplina 1 +▁Premio 1 +▁cuidadosamente 1 +script 1 +▁característica 1 +▁tolera 1 +▁biodiversidad 1 +▁frágil 1 +▁islámico 1 +▁terminó 1 +▁benefici 1 +▁admisión 1 +▁coral 1 +tendrá 1 +4.000 1 +▁Conclusiones 1 +▁aislamiento 1 +▁bombarde 1 +▁continental 1 +▁psicológico 1 +▁Racismo 1 +▁sindical 1 +▁1985 1 +▁vulnerable 1 +▁OTAN 1 +▁logró 1 +▁(2008) 1 +▁extrajudiciales 1 +▁OCDE 1 +▁ilumina 1 +▁convencer 1 +▁aviación 1 +ándonos 1 +▁escribió 1 +▁60% 1 +▁1970 1 +▁59/2 1 +▁sucedido 1 +▁exceso 1 +▁brutal 1 +▁lagunas 1 +▁contenga 1 +▁válido 1 +▁direcciones 1 +▁heridas 1 +▁25% 1 +▁descolonización 1 +▁siguieron 1 +▁desprende 1 +▁suspender 1 +▁kilo 1 +▁biología 1 +cora 1 +▁coordina 1 +Video 1 +▁Diálogo 1 +▁conveniencia 1 +▁XVII 1 +▁Libre 1 +▁arregl 1 +▁compone 1 +▁extraer 1 +▁bicicleta 1 +▁determinó 1 +▁columna 1 +▁culmina 1 +▁dulce 1 +▁Condición 1 +▁modernización 1 +▁pretend 1 +▁robo 1 +▁azúcar 1 +▁hipótesis 1 +▁Excmo 1 +▁Mixto 1 +▁serbios 1 +▁rueda 1 +▁nube 1 +▁confirmó 1 +▁emociones 1 +▁deficiente 1 +▁concedido 1 +▁alentó 1 +▁ancianos 1 +ICA 1 +▁inversores 1 +▁divisiones 1 +▁imperativo 1 +INF 1 +▁Martin 1 +▁mantuvo 1 +▁refleje 1 +▁creciendo 1 +▁extensa 1 +▁fijo 1 +dependientes 1 +▁Guyana 1 +▁Técnico 1 +▁cerrada 1 +▁menoscaba 1 +▁Tabago 1 +▁determine 1 +▁discutir 1 +▁cuidar 1 +▁prohib 1 +▁incluyó 1 +▁enmendada 1 +▁emitir 1 +▁intenciones 1 +▁relatores 1 +▁Enviado 1 +▁regalo 1 +▁caracter 1 +▁Gabón 1 +▁redunda 1 +▁agotado 1 +▁aplazar 1 +dministraciones 1 +▁carencia 1 +▁Bhután 1 +▁algoritmo 1 +▁higiene 1 +▁folleto 1 +▁concierne 1 +▁resolv 1 +CEDEAO 1 +▁Corrupción 1 +▁proteína 1 +▁migratoria 1 +▁capacitado 1 +▁atribuciones 1 +▁genético 1 +work 1 +▁Liberación 1 +▁concerniente 1 +▁secuestra 1 +▁impugna 1 +▁Trato 1 +▁panel 1 +▁National 1 +▁prisioneros 1 +▁referéndum 1 +▁transcurso 1 +▁amistad 1 +▁firmó 1 +▁abandono 1 +▁piensen 1 +▁recibí 1 +▁devolver 1 +verdad 1 +▁reprimir 1 +▁sentimos 1 +▁digno 1 +▁surgido 1 +▁confiar 1 +tendida 1 +▁cubre 1 +▁falsifica 1 +▁adición 1 +▁2012 1 +▁ministerio 1 +▁recompensa 1 +▁ingeni 1 +▁jubilación 1 +6.000 1 +▁Adelanto 1 +▁OSACT 1 +▁Turkmenistán 1 +▁idéntica 1 +▁famosa 1 +▁57/2 1 +▁paralelo 1 +Ó 1 +▁apoyó 1 +▁cápita 1 +▁inspectores 1 +▁indique 1 +▁cubano 1 +▁haciéndo 1 +® 1 +▁estudie 1 +▁fruta 1 +▁proteja 1 +▁Reforma 1 +▁agujero 1 +▁constituya 1 +▁diligencia 1 +▁Golán 1 +▁severa 1 +eira 1 +▁prepare 1 +▁Votos 1 +▁llamo 1 +▁Zona 1 +▁recurre 1 +▁prosiga 1 +▁Villa 1 +▁botón 1 +▁XI 1 +▁detenciones 1 +▁comporta 1 +н 1 +▁fronteriza 1 +▁pregunto 1 +▁profesión 1 +▁fichero 1 +▁primavera 1 +▁reanudación 1 +▁ONUDD 1 +▁demasiada 1 +▁entendido 1 +▁perpetua 1 +place 1 +▁indebida 1 +▁Armadas 1 +▁planificar 1 +▁Maldivas 1 +▁consuetudinario 1 +▁conozca 1 +▁ensayo 1 +▁acepte 1 +▁celular 1 +▁sueldo 1 +▁articula 1 +ñi 1 +▁UNIFEM 1 +▁Woods 1 +▁exclusivo 1 +Qaida 1 +▁intenso 1 +▁Robert 1 +▁necesitará 1 +т 1 +▁encontró 1 +▁espectro 1 +▁Ayuda 1 +▁gratis 1 +▁sugerencia 1 +▁celda 1 +▁alberga 1 +▁partículas 1 +▁reasentamiento 1 +▁subyacente 1 +▁varones 1 +▁fracasa 1 +ward 1 +▁Reducción 1 +▁operadores 1 +▁mostró 1 +▁convencida 1 +▁Andorra 1 +▁cumpliendo 1 +▁divide 1 +▁sincero 1 +▁dictado 1 +▁romper 1 +▁Habla 1 +▁divulga 1 +▁Afirma 1 +▁CEPA 1 +▁exhib 1 +▁punta 1 +▁acced 1 +▁Bahamas 1 +▁desventaja 1 +▁exitosa 1 +▁permitiera 1 +▁recinto 1 +▁ingenieros 1 +▁emergentes 1 +▁ministro 1 +▁paludismo 1 +▁refirió 1 +▁ingres 1 +▁Señala 1 +▁Varias 1 +ógeno 1 +stituyó 1 +▁Número 1 +▁circuito 1 +▁terapia 1 +▁prelación 1 +proyecto 1 +▁(2007) 1 +▁Apelaciones 1 +▁Gobernador 1 +▁divertido 1 +▁insuficiencia 1 +▁prevalencia 1 +♪ 1 +pendiendo 1 +▁Samoa 1 +▁Administrador 1 +▁Facebook 1 +▁continuó 1 +▁fabricantes 1 +▁persiste 1 +▁favorito 1 +/2009/ 1 +▁efectividad 1 +▁maltrato 1 +▁barato 1 +▁donaciones 1 +▁dictar 1 +▁gradua 1 +▁OSE 1 +▁intimidación 1 +▁argumenta 1 +▁Antigua 1 +▁menú 1 +▁Islam 1 +▁autónomo 1 +▁comunicó 1 +▁temporario 1 +▁disponía 1 +▁semillas 1 +▁golf 1 +▁demográfica 1 +▁VIII 1 +▁salió 1 +áramos 1 +▁colabor 1 +▁Alimentos 1 +▁cirugía 1 +▁denegación 1 +▁turístico 1 +▁semestre 1 +▁tabla 1 +▁quedará 1 +▁Industria 1 +▁Juventud 1 +▁Occidente 1 +▁Técnica 1 +▁fortaleciendo 1 +▁obtuvo 1 +▁referirme 1 +▁milicias 1 +▁Verificación 1 +▁Objetivo 1 +▁Igualmente 1 +▁optimiza 1 +▁reproducción 1 +▁basura 1 +▁hostil 1 +▁contratante 1 +▁aborde 1 +▁adjudic 1 +▁emplazamiento 1 +▁sensibilizar 1 +▁sostener 1 +▁Museo 1 +▁Mayor 1 +▁agencia 1 +▁dibujo 1 +▁injerencia 1 +▁fumadores 1 +▁interfaz 1 +▁persistencia 1 +▁respete 1 +▁terror 1 +▁faculta 1 +▁Inglaterra 1 +▁Promover 1 +▁designación 1 +▁empoderamiento 1 +▁frío 1 +▁Recuerda 1 +▁55/1 1 +▁Ombudsman 1 +▁atribuye 1 +▁amiga 1 +▁exacta 1 +▁contribuyó 1 +▁femenino 1 +▁reafirmó 1 +▁rigurosa 1 +▁descanso 1 +▁destinatario 1 +▁permitía 1 +▁aventura 1 +▁Belice 1 +▁Africa 1 +▁Bretton 1 +▁Cuestión 1 +▁Suprema 1 +▁confortable 1 +▁interviene 1 +▁excluido 1 +Cuánto 1 +▁Instancia 1 +▁asume 1 +▁Diversidad 1 +▁colegio 1 +▁inundaciones 1 +▁Apelación 1 +▁raíces 1 +▁ultima 1 +▁demográfico 1 +▁Fecha 1 +▁reanuda 1 +▁felices 1 +▁mencionó 1 +▁Recientemente 1 +▁sucediendo 1 +▁Academia 1 +▁intermedio 1 +▁reseña 1 +▁aprendí 1 +▁pesado 1 +▁injusticia 1 +▁órbita 1 +▁alojado 1 +▁descenso 1 +▁informativo 1 +▁emocionante 1 +ísimo 1 +▁calentamiento 1 +▁Instituciones 1 +▁estigma 1 +▁Encargado 1 +▁Observadores 1 +▁contaba 1 +▁Socorro 1 +▁intérprete 1 +▁malnutrición 1 +▁geográfico 1 +convocadas 1 +▁falso 1 +▁desigual 1 +▁ferrocarril 1 +▁terremoto 1 +▁abstenciones 1 +▁Papua 1 +▁Omán 1 +▁atañe 1 +▁mantendrá 1 +▁convergencia 1 +▁reconstruir 1 +▁innovaciones 1 +▁limpio 1 +▁iraní 1 +▁alemana 1 +▁concertar 1 +▁antelación 1 +▁administradores 1 +document 1 +▁enmendar 1 +▁conexo 1 +Ú 1 +▁pertinencia 1 +▁misterio 1 +▁destruye 1 +▁comparable 1 +▁acontecimiento 1 +▁surgir 1 +▁dirigió 1 +▁conceptual 1 +▁France 1 +▁hueso 1 +▁china 1 +Está 1 +▁persecución 1 +▁ingresar 1 +▁mercurio 1 +▁recibiendo 1 +▁ofreciendo 1 +▁reduciendo 1 +▁voces 1 +▁variante 1 +▁tutela 1 +▁linea 1 +▁enviada 1 +/54/ 1 +▁facultativo 1 +▁2010-2011 1 +▁Ejecución 1 +▁problemática 1 +▁recogido 1 +▁visitó 1 +▁concertada 1 +▁turno 1 +comercialización 1 +▁2000-2001 1 +▁ayudó 1 +▁pregunté 1 +▁requerida 1 +▁calificación 1 +▁adherido 1 +▁Microsoft 1 +▁billones 1 +▁coincidi 1 +▁incorpore 1 +▁Región 1 +▁gesto 1 +▁preescolar 1 +▁tropical 1 +Гі 1 +▁reproduce 1 +▁cuota 1 +▁admisible 1 +▁unánime 1 +▁intensidad 1 +▁invierno 1 +▁Decisiones 1 +Sudáfrica 1 +▁recrea 1 +iéndole 1 +▁Turismo 1 +▁vulnera 1 +€ 1 +▁agradezco 1 +▁ceremonia 1 +▁estancamiento 1 +▁penetra 1 +▁prefiere 1 +▁subsahariana 1 +▁ordinaria 1 +▁renovado 1 +▁aprovechamiento 1 +▁estableciera 1 +▁incitación 1 +▁masivo 1 +▁financiamiento 1 +interdependencia 1 +▁Descolonización 1 +▁sorpresa 1 +▁sostenida 1 +▁reputación 1 +wood 1 +▁vertical 1 +▁afro 1 +▁acero 1 +▁añade 1 +▁estrella 1 +▁Francisco 1 +▁inscribir 1 +▁potente 1 +▁jubila 1 +▁Análisis 1 +▁Gubernamentales 1 +▁murieron 1 +▁murió 1 +▁supuestamente 1 +▁expira 1 +▁instalado 1 +Quiere 1 +▁Amsterdam 1 +▁flagrante 1 +▁fútbol 1 +▁galaxia 1 +▁competitivo 1 +▁concertación 1 +▁expresiones 1 +▁efectuada 1 +▁Negocios 1 +▁coalición 1 +▁subsiguiente 1 +▁reclusión 1 +▁genoma 1 +▁obtenga 1 +▁tienden 1 +PNUD 1 +lógica 1 +XXI 1 +▁analítico 1 +▁mercenarios 1 +▁pertenencia 1 +▁ejerza 1 +▁Gui 1 +▁habló 1 +▁típico 1 +▁pasivo 1 +▁58/2 1 +▁Democracia 1 +▁Inversiones 1 +▁flagelo 1 +▁prestigio 1 +▁prorrateo 1 +▁Órgano 1 +▁abruma 1 +▁motivación 1 +▁victoria 1 +▁hábitat 1 +▁refuerce 1 +▁diseñada 1 +▁curva 1 +▁interrogatorio 1 +▁aplaud 1 +▁revoca 1 +▁préstamo 1 +▁Amnistía 1 +▁canadiense 1 +▁contemporánea 1 +▁desfavorecidos 1 +▁estímulo 1 +▁reúna 1 +▁exacto 1 +▁devastador 1 +▁gravado 1 +▁Biológica 1 +▁externo 1 +▁Development 1 +▁horrible 1 +▁progenitor 1 +▁Berlín 1 +▁comencé 1 +▁inmensa 1 +▁bordo 1 +▁desarrolle 1 +▁sucesivo 1 +▁batería 1 +▁oscura 1 +▁atribuir 1 +▁(1998) 1 +▁renovar 1 +▁recupera 1 +▁análoga 1 +▁espectáculo 1 +▁Linux 1 +▁infecciones 1 +▁disputa 1 +▁XIX 1 +Ley 1 +▁Biblioteca 1 +▁Lesotho 1 +▁democratización 1 +▁medición 1 +▁esposo 1 +▁revisa 1 +5-0 1 +> 1 +▁pabellón 1 +▁mantuvier 1 +▁luces 1 +▁Swazilandia 1 +▁Taiwán 1 +▁diversificación 1 +▁kuwaití 1 +▁alojarte 1 +▁matrícula 1 +▁refuerzo 1 +▁tranquila 1 +▁consolidado 1 +▁asistieron 1 +▁aislado 1 +▁recabar 1 +▁modalidad 1 +▁Aspectos 1 +▁embarca 1 +▁colección 1 +▁admira 1 +▁consigo 1 +▁Recomienda 1 +▁autobús 1 +▁complemento 1 +© 1 +▁énfasis 1 +▁llamó 1 +▁sensibilidad 1 +▁bandera 1 +▁valiente 1 +▁suave 1 +OPS 1 +▁Bangkok 1 +▁Distrito 1 +▁Prohibición 1 +▁contrarrestar 1 +▁fantástico 1 +▁produciendo 1 +gún 1 +▁investigador 1 +▁numer 1 +▁asegur 1 +▁Booking 1 +▁arquitecto 1 +▁británica 1 +▁liquidación 1 +▁sabiduría 1 +▁ánimo 1 +▁neuronas 1 +▁cristal 1 +cogemos 1 +▁Degradantes 1 +▁remesas 1 +▁Bienestar 1 +▁crónica 1 +▁deportivo 1 +Dónde 1 +▁Manual 1 +▁Estratégico 1 +▁síntomas 1 +▁típica 1 +▁plasma 1 +▁Adición 1 +▁destruido 1 +8.000 1 +▁Subcomité 1 +▁Suriname 1 +▁Simplemente 1 +▁juguete 1 +▁polvo 1 +▁comprobado 1 +▁juega 1 +▁hablo 1 +▁desempeñe 1 +▁billete 1 +▁estimó 1 +▁desierto 1 +▁Series 1 +pdf 1 +▁emprende 1 +▁Contratante 1 +▁abolición 1 +▁desconocido 1 +▁filosofía 1 +▁muchísimo 1 +▁prevalece 1 +▁recorrido 1 +▁alarmante 1 +▁revolucion 1 +▁dibuja 1 +▁preveía 1 +▁establecieron 1 +▁automática 1 +▁Océano 1 +▁credenciales 1 +▁litigio 1 +▁Respuesta 1 +▁requería 1 +▁diputado 1 +▁sentí 1 +▁Tokelau 1 +▁inquieta 1 +▁that 1 +▁selectiva 1 +/2002 1 +icultura 1 +▁diapositiva 1 +SIÓN 1 +▁Bosques 1 +▁ocurriendo 1 +▁permítanme 1 +▁centenar 1 +▁receta 1 +▁requiera 1 +▁delicado 1 +▁depositario 1 +▁film 1 +▁incondicional 1 +▁mercantil 1 +▁Bagdad 1 +▁decidieron 1 +▁colonia 1 +▁Comercial 1 +▁Judicial 1 +▁Profesional 1 +▁redujo 1 +▁trauma 1 +▁regulador 1 +▁cooperativas 1 +persona 1 +▁enérgica 1 +▁expedición 1 +▁revitalización 1 +с 1 +▁moratoria 1 +▁especula 1 +▁mamá 1 +▁Príncipe 1 +▁ascendía 1 +▁designada 1 +▁sexta 1 +▁vecino 1 +▁Reglamentación 1 +▁aparición 1 +▁atentamente 1 +▁reacciones 1 +▁Pesca 1 +▁adolescente 1 +▁magistrado 1 +▁fundador 1 +▁Barbuda 1 +▁distinguir 1 +▁drástica 1 +▁Página 1 +▁reivindica 1 +▁oscuro 1 +-2004 1 +▁Probablemente 1 +▁Véanse 1 +▁Ofrece 1 +PRST 1 +▁suscrito 1 +▁invite 1 +▁salarial 1 +Informe 1 +▁trágico 1 +▁sitúa 1 +▁muestre 1 +▁revisiones 1 +▁Irak 1 +▁esquema 1 +▁agotan 1 +▁Resoluciones 1 +▁pretexto 1 +▁residual 1 +▁Palacio 1 +▁segmento 1 +▁adversa 1 +▁guiar 1 +▁reparar 1 +▁Móvil 1 +▁Treaty 1 +▁aconseja 1 +▁cuartel 1 +▁fortalezca 1 +▁jurisdicciones 1 +▁penitenciaria 1 +▁precursores 1 +▁abuelo 1 +▁romaní 1 +▁Crueles 1 +▁errónea 1 +▁longitud 1 +▁monumento 1 +▁griego 1 +▁portátil 1 +▁botella 1 +▁artística 1 +▁optimista 1 +▁Cairo 1 +▁Subprograma 1 +▁estuve 1 +▁esquina 1 +¡ 1 +▁ingrediente 1 +▁cuantifica 1 +▁elegida 1 +▁densidad 1 +▁periodista 1 +emisor 1 +▁participe 1 +▁gratitud 1 +▁pudiéramos 1 +▁temprano 1 +▁tsunami 1 +▁apasiona 1 +▁contrabando 1 +sgraciadamente 1 +▁vote 1 +ô 1 +▁Ambiental 1 +▁divisas 1 +▁intermediario 1 +▁competir 1 +▁elogia 1 +ómetro 1 +▁XII 1 +▁Logística 1 +▁reembolsa 1 +▁Mercado 1 +▁preventivo 1 +▁exención 1 +▁describ 1 +▁imparte 1 +▁delicada 1 +▁satisface 1 +▁Moscú 1 +▁decepciona 1 +▁sabido 1 +▁dictada 1 +▁norteamericano 1 +▁patrocina 1 +▁advertencia 1 +▁certeza 1 +▁restringir 1 +▁remedio 1 +▁Voluntarios 1 +▁fósiles 1 +▁oxígeno 1 +▁predecir 1 +▁somalí 1 +▁ideología 1 +▁espalda 1 +▁alcalde 1 +▁contraseña 1 +XXVI 1 +Demócrata 1 +▁vigencia 1 +▁alegría 1 +▁Frank 1 +▁camiones 1 +▁leído 1 +▁Haciend 1 +▁horizontal 1 +▁introducida 1 +▁líquido 1 +▁concebido 1 +▁absorbe 1 +▁decidimos 1 +Nueva 1 +▁acostumbra 1 +▁homicidio 1 +▁textil 1 +▁Siguiendo 1 +▁huelga 1 +▁Obama 1 +▁cruel 1 +▁audio 1 +.105/ 1 +▁Economía 1 +▁FNUAP 1 +▁MANUD 1 +▁diplomacia 1 +▁jardines 1 +▁Considero 1 +▁equipado 1 +▁centró 1 +▁contraídas 1 +▁alegra 1 +incluido 1 +▁envíe 1 +▁recuerde 1 +▁comience 1 +▁radiación 1 +▁aterriza 1 +▁Ambos 1 +▁FPNUL 1 +▁Subsecretario 1 +▁protagonista 1 +▁registró 1 +▁restrictiva 1 +▁Conjunto 1 +▁Estructura 1 +▁comprometida 1 +▁correspondía 1 +▁termine 1 +▁invisible 1 +▁otoño 1 +▁motivado 1 +▁explícita 1 +▁dormitorio 1 +▁entusiasmo 1 +▁ratifique 1 +▁pudiese 1 +▁filtra 1 +▁variaciones 1 +▁parezca 1 +Italia 1 +China 1 +▁tranquilo 1 +▁disparo 1 +▁vivido 1 +sexual 1 +▁Subdivisión 1 +▁artefactos 1 +▁libanés 1 +▁Contribuciones 1 +▁arriesga 1 +▁existiendo 1 +▁demostró 1 +▁enfermera 1 +▁Provincia 1 +▁tendiente 1 +▁multitud 1 +▁trienal 1 +▁Debian 1 +▁recorte 1 +scribió 1 +safortunadamente 1 +▁Magistrado 1 +sproporcionada 1 +▁concluya 1 +7.000 1 +▁pautas 1 +Canadá 1 +▁Senado 1 +métrica 1 +▁equipamiento 1 +▁ratificó 1 +▁abuela 1 +▁Ahí 1 +▁confiere 1 +gregación 1 +▁introduce 1 +▁marginados 1 +▁patrulla 1 +▁Apertura 1 +▁ocurra 1 +México 1 +▁Emergencia 1 +▁analfabetismo 1 +▁italiana 1 +confidencialidad 1 +▁intercambia 1 +▁Adelantados 1 +▁asombroso 1 +▁multianual 1 +▁aceptó 1 +▁alinea 1 +▁Coalición 1 +▁adquiere 1 +▁comprenda 1 +▁autopista 1 +▁contenedor 1 +CCPR 1 +▁Vivienda 1 +▁calificaciones 1 +▁creíble 1 +▁facilitó 1 +▁evacua 1 +▁pelea 1 +▁Cuarteto 1 +▁Tráfico 1 +▁excelencia 1 +▁ofreció 1 +▁fiabilidad 1 +▁dispensa 1 +▁excusa 1 +▁computador 1 +▁explosión 1 +▁demostración 1 +▁exitoso 1 +▁sugerir 1 +▁percibe 1 +▁ESPAÑOL 1 +▁arrecife 1 +▁fármaco 1 +▁redoblar 1 +▁asigne 1 +▁escritura 1 +▁aislada 1 +▁rescate 1 +demócrata 1 +▁desviación 1 +▁Annan 1 +▁Adicional 1 +▁desglosa 1 +▁Reconciliación 1 +▁demuestre 1 +▁exagera 1 +▁islámica 1 +▁mecánica 1 +▁eligió 1 +▁reloj 1 +▁suicida 1 +▁comenzando 1 +▁plurianual 1 +▁prerrogativa 1 +▁muebles 1 +▁rechazó 1 +▁turística 1 +▁Podrá 1 +▁cambie 1 +▁permitiendo 1 +▁diagnostic 1 +cogieron 1 +в 1 +▁Abstenciones 1 +▁Marshall 1 +▁clásico 1 +▁mérito 1 +▁acogido 1 +▁brote 1 +evolucion 1 +▁convencional 1 +▁INGLÉS 1 +▁Solidaridad 1 +▁exhortó 1 +▁perseguir 1 +▁abrió 1 +▁inicie 1 +▁efectu 1 +▁innecesaria 1 +▁vectores 1 +▁nocivas 1 +▁cuenca 1 +▁marginal 1 +▁elemental 1 +▁susceptible 1 +▁Seguro 1 +▁arroz 1 +Alguien 1 +▁Recuerdo 1 +▁Richard 1 +▁Violencia 1 +▁piratería 1 +▁reproducir 1 +▁Michael 1 +▁gripe 1 +▁veinte 1 +▁esboza 1 +▁mortal 1 +privada 1 +▁ecosistema 1 +▁desempleados 1 +▁endeudados 1 +▁monopolio 1 +▁niñez 1 +▁percibir 1 +▁séptima 1 +▁alcanzó 1 +▁agresiones 1 +▁defiende 1 +▁inadecuada 1 +▁inmueble 1 +▁maniobra 1 +▁Gambia 1 +▁transferido 1 +▁Pleno 1 +Cuarta 1 +▁regir 1 +▁suplementaria 1 +▁vergüenza 1 +▁Piensen 1 +▁entendemos 1 +▁injusta 1 +▁planteó 1 +▁abejas 1 +▁servido 1 +▁certifica 1 +▁Schengen 1 +▁agotamiento 1 +▁comisaría 1 +▁signatura 1 +prendió 1 +▁Adquisiciones 1 +▁audiovisual 1 +▁Street 1 +▁ofrecía 1 +▁molesta 1 +Podría 1 +▁tarda 1 +Direct 1 +▁núm 1 +▁Inmigración 1 +▁Nuclear 1 +▁héroe 1 +▁idónea 1 +▁preferible 1 +▁intencional 1 +▁engaño 1 +control 1 +▁musulmana 1 +▁pidiendo 1 +▁curiosidad 1 +▁inminente 1 +▁AOD 1 +▁vegetal 1 +▁emitida 1 +▁Seguir 1 +▁abundante 1 +▁contemporáneo 1 +▁Women 1 +▁indirecto 1 +iéndolo 1 +▁Association 1 +▁Sumario 1 +▁inclina 1 +▁detrimento 1 +▁Debate 1 +▁moderado 1 +▁Arbitraje 1 +▁Desastres 1 +▁Ecuatorial 1 +▁Gibraltar 1 +▁censura 1 +▁clínico 1 +▁posibilita 1 +▁domingo 1 +▁repatriados 1 +▁Encomia 1 +▁angular 1 +▁introdujo 1 +▁represalia 1 +▁climática 1 +▁convincente 1 +▁pesada 1 +▁alimento 1 +▁aproveche 1 +▁cumplía 1 +▁prohibiciones 1 +▁riguroso 1 +▁vanguardia 1 +▁Abdul 1 +Corr 1 +grupo 1 +text 1 +▁consume 1 +▁Incluye 1 +▁desacuerdo 1 +▁exacerba 1 +▁introductoria 1 +▁utilizó 1 +▁reasign 1 +▁inútil 1 +▁resistente 1 +▁Vicente 1 +▁ballena 1 +▁honra 1 +▁químico 1 +▁Brunei 1 +▁discrepancia 1 +▁extremismo 1 +▁franceses 1 +▁dividir 1 +▁síntesis 1 +▁DVD 1 +▁huevo 1 +▁empuja 1 +▁compatibilidad 1 +▁descubrió 1 +▁disminuyó 1 +▁urbanización 1 +▁reunificación 1 +▁Charles 1 +▁remitido 1 +▁confusión 1 +▁Parque 1 +evaluación 1 +▁Fundamentales 1 +▁Ministra 1 +▁comandante 1 +▁comunique 1 +▁reunieron 1 +▁apelaciones 1 +▁Condena 1 +▁Organiza 1 +resoluciones 1 +▁encaminado 1 +▁Erradicación 1 +▁Excelencia 1 +▁PRESIDENTE 1 +▁exactitud 1 +▁insectos 1 +▁matemático 1 +▁microcrédito 1 +▁predecesor 1 +▁dormir 1 +▁extinción 1 +struyó 1 +▁marginación 1 +▁presidido 1 +▁Viernes 1 +▁humilla 1 +▁rehenes 1 +▁pudimos 1 +▁Multi 1 +▁1.0 1 +▁sucesor 1 +▁Jurídico 1 +▁Básicamente 1 +▁Permítaseme 1 +▁Pobreza 1 +▁Soviética 1 +▁Belgrado 1 +▁Enmienda 1 +▁supervisor 1 +▁Solicita 1 +▁Times 1 +▁emoción 1 +▁turca 1 +▁catalizador 1 +▁descubrimos 1 +▁sospechosas 1 +▁subasta 1 +▁Steve 1 +CERD 1 +▁rehabilit 1 +▁Profesor 1 +▁literatura 1 +▁remunerado 1 +▁alemanes 1 +▁escalera 1 +▁rectifica 1 +▁probado 1 +$ 1 +▁Apoyamos 1 +▁Ninguna 1 +▁pájaro 1 +▁University 1 +▁propongo 1 +▁filtro 1 +▁suplente 1 +▁quisiéramos 1 +▁deteriora 1 +▁lentamente 1 +▁turistas 1 +▁punible 1 +▁Claro 1 +▁Twitter 1 +▁reconocieron 1 +▁Jueves 1 +▁generosa 1 +▁contradicción 1 +▁Abeba 1 +▁belga 1 +▁concesiones 1 +▁estabilizar 1 +institucionales 1 +Alemania 1 +́ 1 +▁UNAMSIL 1 +▁asamblea 1 +▁encarecidamente 1 +▁progresivo 1 +▁refrigera 1 +р 1 +▁afgana 1 +Federación 1 +▁atrocidades 1 +▁placa 1 +▁accesibilidad 1 +▁apátrida 1 +▁multisectorial 1 +▁quinquenal 1 +▁reflejo 1 +▁descarta 1 +http 1 +europe 1 +atlántica 1 +▁Cercano 1 +▁Gabinete 1 +▁interactuar 1 +▁llegué 1 +▁prototipo 1 +▁referendo 1 +▁Situado 1 +▁espejo 1 +▁insumos 1 +▁Prensa 1 +▁imprevistos 1 +▁tóxicos 1 +▁comenzamos 1 +▁recesión 1 +▁construida 1 +▁Espera 1 +▁Detallada 1 +▁aborígenes 1 +▁excombatientes 1 +▁inmunización 1 +▁arrastra 1 +▁Edición 1 +▁tecla 1 +▁Obviamente 1 +▁Service 1 +▁progresar 1 +▁prudente 1 +▁tormenta 1 +▁Tokio 1 +▁descuento 1 +▁invertido 1 +▁Court 1 +tuvimos 1 +torgamiento 1 +▁Darussalam 1 +▁introduzca 1 +▁suplementario 1 +▁Minorías 1 +▁escoger 1 +▁hereda 1 +▁mixta 1 +▁HUMANOS 1 +▁Salomón 1 +▁abstenerse 1 +▁atraviesa 1 +▁soberana 1 +▁sábado 1 +▁colonos 1 +▁tentativa 1 +▁Funciona 1 +▁vestido 1 +comunicación 1 +▁Harvard 1 +▁Tuvalu 1 +▁biotecnología 1 +▁inglesa 1 +▁restauración 1 +▁subterránea 1 +▁encomendado 1 +▁exigía 1 +▁corona 1 +▁conozco 1 +▁embajador 1 +▁táctica 1 +▁convicciones 1 +▁Amazon 1 +▁barata 1 +▁emerge 1 +ò 1 +▁relevancia 1 +▁Rumanía 1 +▁tardía 1 +▁asentamiento 1 +▁indiscriminado 1 +▁metilbromuro 1 +▁vecindad 1 +▁persigue 1 +▁Continua 1 +¿ 1 +Francia 1 +▁adulto 1 +▁sostuvo 1 +▁imperante 1 +▁giro 1 +▁salvaguardia 1 +▁hormiga 1 +▁perdieron 1 +▁restaurar 1 +▁CFC 1 +▁muerta 1 +‘ 1 +▁Agrícola 1 +▁apariencia 1 +▁escuchó 1 +▁Barroso 1 +▁adulta 1 +▁culto 1 +▁grita 1 +▁emociona 1 +▁Instrumento 1 +▁Palestino 1 +{ 1 +▁promovido 1 +▁esclavos 1 +▁impedido 1 +▁vidrio 1 +▁prospera 1 +▁medicamento 1 +oficina 1 +▁Preparatoria 1 +▁Xenofobia 1 +▁autobuses 1 +▁fortaleza 1 +▁hostigamiento 1 +▁innecesario 1 +▁insostenible 1 +▁necesito 1 +▁tranquilidad 1 +▁subvención 1 +▁jugando 1 +▁octava 1 +▁Juegos 1 +▁ligero 1 +▁esclarec 1 +▁plaga 1 +▁Deporte 1 +▁inmobiliario 1 +▁sufriendo 1 +▁truco 1 +▁recibo 1 +▁Center 1 +parlamentaria 1 +Relator 1 +} 1 +± 1 +ê 1 +č 1 +š 1 +у 1 +л 1 +Ñ 1 +к 1 +м 1 +ø 1 +â 1 +п 1 +д 1 +· 1 +ï 1 +ì 1 +î 1 +å 1 +ë 1 +Р 1 +ل 1 +я 1 +ы 1 +б 1 +َ 1 +― 1 +з 1 +ي 1 +` 1 +є 1 +г 1 +„ 1 +∗ 1 +й 1 +ь 1 +В 1 +ß 1 +ž 1 +μ 1 +Ѓ 1 +§ 1 +ù 1 +‰ 1 +< 1 +ş 1 +« 1 +ł 1 +\ 1 +õ 1 +ð 1 +ا 1 +Ö 1 +Č 1 +х 1 +û 1 +Ο 1 +ć 1 +£ 1 +ă 1 +æ 1 +α 1 +ю 1 +‹ 1 +ā 1 +‚ 1 +ė 1 +ã 1 +ę 1 +Û 1 +Ü 1 +ı 1 +~ 1 +ш 1 +Å 1 +ر 1 + 1 +• 1 +Ç 1 +ŷ 1 +ι 1 +Ž 1 +œ 1 +─ 1 +ý 1 +Ä 1 +ו 1 +Ⴗ 1 +ت 1 +ф 1 +σ 1 +ن 1 +→ 1 +ą 1 +− 1 +‡ 1 +ο 1 +τ 1 +щ 1 +э 1 +ε 1 +ب 1 +^ 1 +ğ 1 +ś 1 +ż 1 +م 1 +ה 1 +ň 1 +È 1 +ъ 1 +¦ 1 +Ş 1 +Т 1 +ő 1 +● 1 +ѓ 1 +κ 1 +د 1 +ة 1 +ÿ 1 +і 1 +Џ 1 +ν 1 +К 1 +ש 1 +▪ 1 +À 1 +و 1 +ī 1 +ĝ 1 +ō 1 +ْ 1 +ū 1 +† 1 +υ 1 +О 1 +λ 1 +И 1 +ό 1 +י 1 +ל 1 +π 1 +η 1 +Н 1 +İ 1 +І 1 +س 1 +خ 1 +ع 1 +מ 1 +ك 1 +β 1 +ח 1 +语 1 +Ì 1 +ί 1 +П 1 +ા 1 +ר 1 +А 1 +ב 1 +נ 1 +ρ 1 +ά 1 +М 1 +ŝ 1 +ŭ 1 +Ò 1 +× 1 +ת 1 +■ 1 +Ê 1 +ź 1 +ٌ 1 +¥ 1 +̊ 1 +ї 1 +Е 1 +δ 1 +ĉ 1 +ע 1 +þ 1 +Ł 1 +Ε 1 +ّ 1 +ન 1 +χ 1 +Đ 1 +ه 1 +“ 1 +ς 1 +Х 1 +פ 1 +، 1 +ح 1 +ढ 1 +ी 1 +ो 1 +′ 1 +¢ 1 +Ι 1 +ف 1 +У 1 +θ 1 +γ 1 +¬ 1 +א 1 +ط 1 +ો 1 +÷ 1 +Κ 1 +З 1 +ى 1 +ی 1 +ा 1 +ર 1 +อ 1 +ķ 1 +¤ 1 +ય 1 +ق 1 +ȣ 1 +Ф 1 +ק 1 +ص 1 +े 1 +‐ 1 +≈ 1 +○ 1 +★ 1 +北 1 +Ï 1 +ή 1 +ד 1 +ش 1 +म 1 +ી 1 +غ 1 +我 1 +个 1 +你 1 +Ч 1 +Ш 1 +Ë 1 +Α 1 +Б 1 +જ 1 +¶ 1 +Ô 1 +ų 1 +ё 1 +ם 1 +ث 1 +ं 1 +ई 1 +ड 1 +त 1 +य 1 +र 1 +ि 1 +ં 1 +ે 1 +્ 1 +ဪ 1 +◆ 1 +♲ 1 +ē 1 +आ 1 +ક 1 +ુ 1 +神 1 +ز 1 +่ 1 +牙 1 +以 1 +的 1 +妈 1 +在 1 +Л 1 +一 1 +ύ 1 +中 1 +भ 1 +海 1 +ṛ 1 +Ý 1 +ģ 1 +Ń 1 +ť 1 +ů 1 +ǎ 1 +ǵ 1 +Ν 1 +Ρ 1 +έ 1 +ξ 1 +ω 1 +ћ 1 +ג 1 +ך 1 +ן 1 +ض 1 +ڤ 1 +ग 1 +ज 1 +थ 1 +न 1 +ગ 1 +ચ 1 +દ 1 +ย 1 +ร 1 +ၝ 1 +√ 1 +≤ 1 +♦ 1 +❑ 1 +。 1 +』 1 +不 1 +与 1 +出 1 +台 1 +啊 1 +正 1 +洋 1 +ј 1 +ु 1 +સ 1 +ṣ 1 +大 1 +法 1 +西 1 +香 1 +面 1 +行 1 +游 1 +港 1 +来 1 +执 1 +地 1 +历 1 +决 1 +内 1 +仲 1 +了 1 +► 1 +∑ 1 +ၛ 1 +ષ 1 +વ 1 +લ 1 +પ 1 +ધ 1 +ડ 1 +। 1 +् 1 +ह 1 +צ 1 +כ 1 +Ц 1 +Ř 1 +Œ 1 +ĵ 1 +Ĉ 1 +有 1 +‛ 1 +क 1 +ז 1 +Є 1 +Μ 1 +ʾ 1 +ľ 1 +裁 1 +ج 1 +إ 1 +Э 1 +Д 1 +Σ 1 +़ 1 +ќ 1 +Î 1 +أ 1 +њ 1 +※ 1 +љ 1 +Ő 1 +” 1 +Ţ 1 +Ј 1 +̧ 1 +Ś 1 +♫ 1 +ţ 1 +Ć 1 +प 1 +— 1 +đ 1 +› 1 +Ŷ 1 +Ø 1 +ě 1 +؟ 1 +ř 1 +Љ 1 +Њ 1 +⁄ 1 +ц 1 +ж 1 +Ќ 1 +̈ 1 +Ћ 1 +之 1 +制 1 +发 1 +展 1 +度 1 +ч 1 +Ђ 1 +ń 1 +互 1 +相 1 +下 1 +可 1 +唱 1 +教 1 +曲 1 +歌 1 +给 1 +φ 1 +Й 1 +京 1 +公 1 +名 1 +声 1 +多 1 +居 1 +工 1 +很 1 +心 1 +方 1 +晟 1 +結 1 +网 1 +苑 1 +બ 1 +ṭ 1 +山 1 +政 1 +果 1 +白 1 +社 1 +铭 1 +ű 1 +Ÿ 1 +ǻ 1 +₤ 1 +持 1 +­ 1 +Æ 1 +Ā 1 +Ă 1 +ċ 1 +ď 1 +į 1 +Ľ 1 +ņ 1 +ŕ 1 +Ū 1 +ƒ 1 +ǒ 1 +Β 1 +Υ 1 +Φ 1 +Ω 1 +ζ 1 +Ѕ 1 +Ж 1 +Ы 1 +Я 1 +ט 1 +ף 1 +ؤ 1 +ً 1 +ख 1 +स 1 +એ 1 +ખ 1 +ણ 1 +થ 1 +મ 1 +શ 1 +િ 1 +ธ 1 +ศ 1 +ะ 1 +ใ 1 +ၡ 1 +ၢ 1 +ṇ 1 +ẹ 1 +ọ 1 +ờ 1 +‒ 1 +⇒ 1 +⇢ 1 +∙ 1 +≥ 1 +□ 1 +◙ 1 +◦ 1 +◯ 1 +♣ 1 +『 1 +い 1 +お 1 +し 1 +も 1 +ろ 1 +世 1 +並 1 +为 1 +伯 1 +作 1 +修 1 +做 1 +农 1 +几 1 +分 1 +剥 1 +参 1 +合 1 +和 1 +咬 1 +喜 1 +嘛 1 +外 1 +太 1 +妨 1 +姐 1 +完 1 +寓 1 +局 1 +帝 1 +年 1 +建 1 +後 1 +徳 1 +情 1 +慧 1 +成 1 +所 1 +拉 1 +探 1 +星 1 +木 1 +松 1 +比 1 +燰 1 +特 1 +王 1 +甜 1 +生 1 +界 1 +眼 1 +租 1 +等 1 +紧 1 +美 1 +翻 1 +臺 1 +色 1 +茶 1 +葱 1 +藤 1 +要 1 +见 1 +视 1 +角 1 +言 1 +請 1 +设 1 +译 1 +课 1 +赠 1 +路 1 +载 1 +農 1 +连 1 +送 1 +這 1 +鏮 1 +鑚 1 +镜 1 +问 1 +阳 1 +陈 1 +院 1 +Š 1 +Ė 1 +Ķ 1 +ț 1 +ذ 1 +આ 1 +พ 1 +↕ 1 +⇕ 1 +炎 1 +Ę 1 +ļ 1 +હ 1 +三 1 +取 1 +寄 1 +甸 1 +返 1 +イ 1 +オ 1 +セ 1 +ッ 1 +デ 1 +Ў 1 +俄 1 +利 1 +德 1 +意 1 +日 1 +汉 1 +班 1 +英 1 +萄 1 +葡 1 +阿 1 +<mask> 1 diff --git a/SpeechUT/dataset/MuSTC/en_es/spm_unigram10000.model b/SpeechUT/dataset/MuSTC/en_es/spm_unigram10000.model new file mode 100644 index 0000000000000000000000000000000000000000..ac4cc9ef1c4677908cf91e8cc7dda71997e6dbf2 GIT binary patch literal 417070 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%0APIRFg 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 z|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y z{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ< z^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b z)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~Cz zPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;- zKmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T z|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V z|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd z|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT- z|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U z{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va z`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz z>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs< zr~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24a zpZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>Hkmv zfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w z|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>! z|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^ 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 z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH 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 z0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?W zL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaM~O`)L5t0HOgz1BeC?4ImmoG=OLT z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G z0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLaw zq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V z0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0jb{QF4*hz1Z1AR0h4fM@{G0HOgz1BeC? z4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1 zAR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ( z8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2 zKs1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4Immo zG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4 zfM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCF zXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks118 z0MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G z0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLaw zq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V z0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?W zL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz z1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$ zhz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c z1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh z5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC? z4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1 zAR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ( z8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2 zKs1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4Immo zG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4 zfM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCF zXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks118 z0MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G z0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLaw zq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V z0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?W zL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz z1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$ zhz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c z1`rJ(8bCCFXaLawMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR z7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|n zMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y z(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR*uSx#1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0Q<N0 z(*Q;T7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR z7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|n zMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y z(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR z7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|n zMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y z(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IaJu%8An8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R#bX+I5MG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp5B5LU|6u=v z{WO5l07e5C4PX!UKiL0Z|AYMx_CMJFVE=>t5B5LU|6u=v{SWp(*#BVvgZ&ToKiL0Z z|AYMx_CMJFVE=>t5B5LU|6u=v{SWp(*#BVvgZ&ToKiL0Z|AYMx_CMJFVE=>t5B5LU z|6u=v{SWp(*#BVvgZ+>8KidCj|D*kn_CMPHX#b=AkM=*>|7icC{g3uP+W%<(qy3Ne zKidCj|D*kn_CMPHX#b=AkM=*>|7icC{g3uP+W%<(qy031(EvsR7!6=FfYAU(0~ifp zG=R|n_Gtg3{WO5l07e5C4PcM<KidCj|D*kn_CMPHX#b=AkM=*>|7icC{g3uP+W%<( zqy031(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR z7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|n zMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y z(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PgJZ{WO5l07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMg!P?V?PaGG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR z7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|n zMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y z(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR z7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|n zMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y z(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR z7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|n zMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y z(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifp zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C z4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU( z0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy z07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=F zfYAU(0~ifpG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nzW*y1 z3LXCaKMx-cuJbtjb#V5@;laV{c!&S}pNId$!IyT2fBu~2^ZS4JFaJAlPyc-9zyJTe z<ALY;e}2}Fp7Z~E@IU?M5B}%>{K0?l;NShPKJ=eY`G3FT!9Snr|9$Y!XZm;l+kg6y z|M<>-`jG$hz=!<9C9dy(c>U|(x&GnR<o7>(S^EBm0{{CT^5E}(h}^#ap$7T>7vBeb z|BFw4-~ZxY{`bGA5x@UMQuF;UZo>Wk7k3FdJpUKp|LU5J!~f{uEZFzI`t<YtuZnhu z9}c3O?|)SZeE)L&{`;4cq2Irpb^8A0RE>k*%P%KA9R6De-&TJA@;UhXmkj&+m)Pt3 zmwM>?*MIOw{mTuz-@n}H^!>}NE8oA||MC6X3G46Q&P0Cyc53GPx7P~azy0I;{>=pV z{_Rfu@89kV|NiX;4+p>algsPhPp(xu{4Wl!3_AStJ?GfJpPU%@e)5(7`^lG!?<b#! zzn^rg-%o<D@25Y0jVJf3e?PhD`uoWpD&Nm8t9(DZM)3XYWc~NEGp*mxPVId^`+n>D z**6s5&t5@(KZ7M4{MMd7J>T;`e{0Wf)Bb*TPwn@!n~J`l-9_^K;xg{{i*r5SFTVJG zzi7_CUlh6DFYZJCesP1>_lvuZzF)oEbMOcD>J!oTtH|Q})$O+5Z>}AFzqzpU{pO0t w_nXru-*3Jb{(kd<^!x48-?Mj@j=$esWBq=25#{^c+4Jvrr_a9My%zhw0Oq#jH~;_u literal 0 HcmV?d00001 diff --git a/SpeechUT/dataset/MuSTC/en_fr/config.yaml b/SpeechUT/dataset/MuSTC/en_fr/config.yaml new file mode 100644 index 0000000..dce5f63 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_fr/config.yaml @@ -0,0 +1,3 @@ +vocab_filename: dict.spm.txt +src_vocab_filename: dict.kmu.txt + diff --git a/SpeechUT/dataset/MuSTC/en_fr/config_enfr.yaml b/SpeechUT/dataset/MuSTC/en_fr/config_enfr.yaml new file mode 100644 index 0000000..dd080a0 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_fr/config_enfr.yaml @@ -0,0 +1,14 @@ +bpe_tokenizer: + bpe: sentencepiece + sentencepiece_model: spm_unigram10000.model + +sampling_alpha: 1.0 +shuffle: false +use_audio_input: true +use_sample_rate: 16000 + +vocab_filename: dict.spm.txt + +# required by speech_to_text task but never used +input_channels: 1 +input_feat_per_channel: 1 diff --git a/SpeechUT/dataset/MuSTC/en_fr/dict.kmu.txt b/SpeechUT/dataset/MuSTC/en_fr/dict.kmu.txt new file mode 100644 index 0000000..bbfe59e --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_fr/dict.kmu.txt @@ -0,0 +1,500 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +16 16 +17 17 +18 18 +19 19 +20 20 +21 21 +22 22 +23 23 +24 24 +25 25 +26 26 +27 27 +28 28 +29 29 +30 30 +31 31 +32 32 +33 33 +34 34 +35 35 +36 36 +37 37 +38 38 +39 39 +40 40 +41 41 +42 42 +43 43 +44 44 +45 45 +46 46 +47 47 +48 48 +49 49 +50 50 +51 51 +52 52 +53 53 +54 54 +55 55 +56 56 +57 57 +58 58 +59 59 +60 60 +61 61 +62 62 +63 63 +64 64 +65 65 +66 66 +67 67 +68 68 +69 69 +70 70 +71 71 +72 72 +73 73 +74 74 +75 75 +76 76 +77 77 +78 78 +79 79 +80 80 +81 81 +82 82 +83 83 +84 84 +85 85 +86 86 +87 87 +88 88 +89 89 +90 90 +91 91 +92 92 +93 93 +94 94 +95 95 +96 96 +97 97 +98 98 +99 99 +100 100 +101 101 +102 102 +103 103 +104 104 +105 105 +106 106 +107 107 +108 108 +109 109 +110 110 +111 111 +112 112 +113 113 +114 114 +115 115 +116 116 +117 117 +118 118 +119 119 +120 120 +121 121 +122 122 +123 123 +124 124 +125 125 +126 126 +127 127 +128 128 +129 129 +130 130 +131 131 +132 132 +133 133 +134 134 +135 135 +136 136 +137 137 +138 138 +139 139 +140 140 +141 141 +142 142 +143 143 +144 144 +145 145 +146 146 +147 147 +148 148 +149 149 +150 150 +151 151 +152 152 +153 153 +154 154 +155 155 +156 156 +157 157 +158 158 +159 159 +160 160 +161 161 +162 162 +163 163 +164 164 +165 165 +166 166 +167 167 +168 168 +169 169 +170 170 +171 171 +172 172 +173 173 +174 174 +175 175 +176 176 +177 177 +178 178 +179 179 +180 180 +181 181 +182 182 +183 183 +184 184 +185 185 +186 186 +187 187 +188 188 +189 189 +190 190 +191 191 +192 192 +193 193 +194 194 +195 195 +196 196 +197 197 +198 198 +199 199 +200 200 +201 201 +202 202 +203 203 +204 204 +205 205 +206 206 +207 207 +208 208 +209 209 +210 210 +211 211 +212 212 +213 213 +214 214 +215 215 +216 216 +217 217 +218 218 +219 219 +220 220 +221 221 +222 222 +223 223 +224 224 +225 225 +226 226 +227 227 +228 228 +229 229 +230 230 +231 231 +232 232 +233 233 +234 234 +235 235 +236 236 +237 237 +238 238 +239 239 +240 240 +241 241 +242 242 +243 243 +244 244 +245 245 +246 246 +247 247 +248 248 +249 249 +250 250 +251 251 +252 252 +253 253 +254 254 +255 255 +256 256 +257 257 +258 258 +259 259 +260 260 +261 261 +262 262 +263 263 +264 264 +265 265 +266 266 +267 267 +268 268 +269 269 +270 270 +271 271 +272 272 +273 273 +274 274 +275 275 +276 276 +277 277 +278 278 +279 279 +280 280 +281 281 +282 282 +283 283 +284 284 +285 285 +286 286 +287 287 +288 288 +289 289 +290 290 +291 291 +292 292 +293 293 +294 294 +295 295 +296 296 +297 297 +298 298 +299 299 +300 300 +301 301 +302 302 +303 303 +304 304 +305 305 +306 306 +307 307 +308 308 +309 309 +310 310 +311 311 +312 312 +313 313 +314 314 +315 315 +316 316 +317 317 +318 318 +319 319 +320 320 +321 321 +322 322 +323 323 +324 324 +325 325 +326 326 +327 327 +328 328 +329 329 +330 330 +331 331 +332 332 +333 333 +334 334 +335 335 +336 336 +337 337 +338 338 +339 339 +340 340 +341 341 +342 342 +343 343 +344 344 +345 345 +346 346 +347 347 +348 348 +349 349 +350 350 +351 351 +352 352 +353 353 +354 354 +355 355 +356 356 +357 357 +358 358 +359 359 +360 360 +361 361 +362 362 +363 363 +364 364 +365 365 +366 366 +367 367 +368 368 +369 369 +370 370 +371 371 +372 372 +373 373 +374 374 +375 375 +376 376 +377 377 +378 378 +379 379 +380 380 +381 381 +382 382 +383 383 +384 384 +385 385 +386 386 +387 387 +388 388 +389 389 +390 390 +391 391 +392 392 +393 393 +394 394 +395 395 +396 396 +397 397 +398 398 +399 399 +400 400 +401 401 +402 402 +403 403 +404 404 +405 405 +406 406 +407 407 +408 408 +409 409 +410 410 +411 411 +412 412 +413 413 +414 414 +415 415 +416 416 +417 417 +418 418 +419 419 +420 420 +421 421 +422 422 +423 423 +424 424 +425 425 +426 426 +427 427 +428 428 +429 429 +430 430 +431 431 +432 432 +433 433 +434 434 +435 435 +436 436 +437 437 +438 438 +439 439 +440 440 +441 441 +442 442 +443 443 +444 444 +445 445 +446 446 +447 447 +448 448 +449 449 +450 450 +451 451 +452 452 +453 453 +454 454 +455 455 +456 456 +457 457 +458 458 +459 459 +460 460 +461 461 +462 462 +463 463 +464 464 +465 465 +466 466 +467 467 +468 468 +469 469 +470 470 +471 471 +472 472 +473 473 +474 474 +475 475 +476 476 +477 477 +478 478 +479 479 +480 480 +481 481 +482 482 +483 483 +484 484 +485 485 +486 486 +487 487 +488 488 +489 489 +490 490 +491 491 +492 492 +493 493 +494 494 +495 495 +496 496 +497 497 +498 498 +499 499 diff --git a/SpeechUT/dataset/MuSTC/en_fr/dict.spm.txt b/SpeechUT/dataset/MuSTC/en_fr/dict.spm.txt new file mode 100644 index 0000000..db33a05 --- /dev/null +++ b/SpeechUT/dataset/MuSTC/en_fr/dict.spm.txt @@ -0,0 +1,9997 @@ +▁de 1 +, 1 +' 1 +s 1 +. 1 +▁la 1 +▁et 1 +▁l 1 +▁des 1 +▁les 1 +▁à 1 +▁d 1 +▁le 1 +▁ 1 +▁du 1 +▁en 1 +’ 1 +▁que 1 +e 1 +- 1 +▁pour 1 +▁dans 1 +▁a 1 +▁un 1 +▁sur 1 +▁au 1 +▁qui 1 +▁une 1 +▁par 1 +▁( 1 +▁est 1 +) 1 +es 1 +▁aux 1 +▁ou 1 +▁qu 1 +▁pas 1 +▁ce 1 +r 1 +▁plus 1 +▁Le 1 +▁s 1 +▁sont 1 +a 1 +est 1 +er 1 +▁n 1 +▁ne 1 +un 1 +▁nous 1 +▁: 1 +▁avec 1 +▁ont 1 +il 1 +▁Les 1 +▁La 1 +▁L 1 +▁se 1 +▁été 1 +/ 1 +▁vous 1 +une 1 +▁il 1 +▁C 1 +ment 1 +▁c 1 +; 1 +▁être 1 +nt 1 +▁Il 1 +▁ces 1 +▁cette 1 +é 1 +▁leur 1 +t 1 +on 1 +▁comme 1 +▁fait 1 +▁Canada 1 +ant 1 +▁« 1 +▁pays 1 +▁M 1 +▁son 1 +en 1 +▁je 1 +y 1 +▁sa 1 +▁- 1 +▁y 1 +▁En 1 +▁si 1 +▁S 1 +▁A 1 +▁peut 1 +S 1 +▁entre 1 +▁faire 1 +▁• 1 +▁1 1 +▁mais 1 +A 1 +ent 1 +▁tout 1 +▁développement 1 +c 1 +▁D 1 +▁tous 1 +ai 1 +▁Et 1 +▁ses 1 +ait 1 +: 1 +d 1 +▁rapport 1 +▁Conseil 1 +▁j 1 +o 1 +▁travail 1 +▁non 1 +▁États 1 +▁même 1 +ci 1 +▁B 1 +▁droits 1 +▁leurs 1 +▁deux 1 +▁on 1 +re 1 +▁ainsi 1 +). 1 +▁aussi 1 +▁Je 1 +ons 1 +▁services 1 +▁Commission 1 +in 1 +▁Nous 1 +▁bien 1 +C 1 +ation 1 +▁également 1 +▁cas 1 +z 1 +autres 1 +▁F 1 +▁in 1 +▁» 1 +u 1 +n 1 +▁dont 1 +i 1 +▁p 1 +▁? 1 +), 1 +▁personnes 1 +▁Comité 1 +▁sous 1 +▁sécurité 1 +▁membres 1 +▁T 1 +▁J 1 +l 1 +▁P 1 +le 1 +▁projet 1 +▁où 1 +▁droit 1 +▁santé 1 +▁autres 1 +P 1 +▁2 1 +f 1 +al 1 +▁était 1 +▁doit 1 +▁très 1 +▁contre 1 +▁partie 1 +m 1 +ur 1 +▁Nations 1 +D 1 +ra 1 +▁% 1 +▁" 1 +▁3 1 +▁R 1 +M 1 +an 1 +▁Dans 1 +h 1 +▁programme 1 +▁cadre 1 +▁cours 1 +▁soit 1 +▁dé 1 +▁Unies 1 +▁sans 1 +B 1 +article 1 +elle 1 +▁notre 1 +▁elle 1 +▁re 1 +▁m 1 +▁général 1 +▁mesures 1 +▁G 1 +▁compte 1 +▁avons 1 +p 1 +© 1 +ils 1 +▁activités 1 +▁ré 1 +▁demande 1 +▁ans 1 +és 1 +▁afin 1 +▁question 1 +▁système 1 +▁nombre 1 +▁données 1 +E 1 +à 1 +or 1 +▁5 1 +ée 1 +b 1 +L 1 +▁mise 1 +▁toutes 1 +▁peuvent 1 +▁Ce 1 +it 1 +ont 1 +▁b 1 +▁monde 1 +▁femmes 1 +ez 1 +▁4 1 +aient 1 +▁Pour 1 +▁— 1 +▁matière 1 +▁politique 1 +▁point 1 +▁moins 1 +information 1 +ou 1 +être 1 +▁vie 1 +▁recherche 1 +▁10 1 +▁E 1 +▁ils 1 +▁enfants 1 +▁jour 1 +▁votre 1 +▁On 1 +▁temps 1 +O 1 +▁gestion 1 +▁avait 1 +▁De 1 +▁19 1 +▁concernant 1 +▁questions 1 +T 1 +N 1 +▁À 1 +▁gouvernement 1 +▁façon 1 +us 1 +▁Si 1 +v 1 +▁ressources 1 +▁Mais 1 +▁nos 1 +▁générale 1 +▁niveau 1 +F 1 +H 1 +à 1 +▁autre 1 +R 1 +▁produits 1 +▁vue 1 +▁doivent 1 +▁donc 1 +▁6 1 +▁programmes 1 +G 1 +▁lui 1 +▁processus 1 +au 1 +▁internationale 1 +ne 1 +▁protection 1 +▁N 1 +▁avoir 1 +▁politiques 1 +▁toute 1 +▁notamment 1 +ce 1 +▁plan 1 +▁ça 1 +▁fois 1 +▁cet 1 +▁dit 1 +2 1 +] 1 +▁Un 1 +▁me 1 +homme 1 +▁encore 1 +▁cela 1 +is 1 +▁– 1 +▁international 1 +▁chaque 1 +▁mon 1 +▁paragraphe 1 +aux 1 +▁ma 1 +▁session 1 +▁économique 1 +g 1 +▁[ 1 +▁K 1 +▁sera 1 +▁européenne 1 +▁avant 1 +▁H 1 +▁résolution 1 +▁après 1 +ité 1 +1 1 +▁7 1 +at 1 +▁Par 1 +▁trois 1 +ar 1 +▁années 1 +age 1 +ir 1 +eau 1 +te 1 +▁fin 1 +ement 1 +▁base 1 +▁situation 1 +▁personne 1 +▁lieu 1 +État 1 +ées 1 +▁Convention 1 +▁Une 1 +▁pro 1 +▁résultats 1 +k 1 +▁Cette 1 +▁20 1 +▁période 1 +▁groupe 1 +▁gens 1 +▁loi 1 +▁place 1 +▁8 1 +▁décision 1 +▁9 1 +▁selon 1 +▁mesure 1 +▁I 1 +▁Au 1 +3 1 +id 1 +▁beaucoup 1 +▁formation 1 +▁15 1 +▁exemple 1 +▁peu 1 +ance 1 +▁présent 1 +té 1 +ca 1 +▁h 1 +▁titre 1 +▁V 1 +▁secteur 1 +▁manière 1 +▁œuvre 1 +▁tant 1 +ing 1 +▁renseignements 1 +ais 1 +▁particulier 1 +▁Elle 1 +? 1 +▁première 1 +action 1 +▁000 1 +ie 1 +▁pré 1 +" 1 +▁of 1 +▁part 1 +▁coopération 1 +▁prendre 1 +▁car 1 +▁pendant 1 +▁mettre 1 +▁public 1 +▁W 1 +▁devrait 1 +▁certains 1 +Assemblée 1 +▁compris 1 +▁Président 1 +ch 1 +▁g 1 +▁Vous 1 +Union 1 +▁étaient 1 +application 1 +▁contrôle 1 +▁inter 1 +▁suis 1 +▁Ces 1 +▁Loi 1 +▁société 1 +▁12 1 +▁rôle 1 +▁service 1 +▁depuis 1 +▁grande 1 +▁qualité 1 +▁ceux 1 +▁national 1 +( 1 +▁nouveau 1 +▁parce 1 +▁’ 1 +évaluation 1 +▁marché 1 +▁plusieurs 1 +ut 1 +▁voir 1 +▁Groupe 1 +▁personnel 1 +4 1 +▁faut 1 +▁dollars 1 +▁grand 1 +les 1 +▁domaine 1 +▁Des 1 +▁seulement 1 +▁dispositions 1 +▁f 1 +▁chose 1 +Unis 1 +V 1 +▁con 1 +▁quand 1 +▁jusqu 1 +▁parties 1 +▁$ 1 +la 1 +▁conditions 1 +aire 1 +▁besoin 1 +ad 1 +était 1 +▁projets 1 +▁savoir 1 +de 1 +▁publique 1 +▁18 1 +ro 1 +▁millions 1 +ex 1 +▁nom 1 +▁eu 1 +0 1 +um 1 +el 1 +aide 1 +▁entreprises 1 +▁important 1 +hui 1 +▁vers 1 +▁fonction 1 +▁premier 1 +▁possible 1 +▁laquelle 1 +▁11 1 +ter 1 +▁nationale 1 +▁population 1 +▁Secrétaire 1 +▁document 1 +▁30 1 +▁région 1 +ine 1 +▁nouvelle 1 +▁pourrait 1 +able 1 +et 1 +▁objectifs 1 +▁Re 1 +▁moment 1 +00 1 +im 1 +▁présente 1 +▁problèmes 1 +U 1 +▁ci 1 +6 1 +▁O 1 +ri 1 +elles 1 +environnement 1 +▁mois 1 +ac 1 +▁alors 1 +▁groupes 1 +▁travaux 1 +▁taux 1 +▁13 1 +emploi 1 +5 1 +di 1 +▁va 1 +▁Programme 1 +am 1 +▁lors 1 +▁conformément 1 +▁organisations 1 +oc 1 +Organisation 1 +▁nouvelles 1 +▁paix 1 +▁sujet 1 +▁déjà 1 +▁ex 1 +▁concerne 1 +▁seront 1 +x 1 +▁raison 1 +th 1 +▁organismes 1 +▁date 1 +7 1 +w 1 +que 1 +▁co 1 +▁soient 1 +▁Ils 1 +▁toujours 1 +▁> 1 +examen 1 +utilisation 1 +li 1 +▁vertu 1 +▁produit 1 +▁dire 1 +▁visant 1 +▁sommes 1 +▁problème 1 +▁site 1 +▁DE 1 +▁elles 1 +▁règlement 1 +▁mis 1 +▁moyen 1 +▁quelque 1 +eur 1 +▁14 1 +▁ayant 1 +op 1 +▁informations 1 +ul 1 +ions 1 +▁efforts 1 +▁and 1 +▁r 1 +▁décembre 1 +▁nouveaux 1 +▁suite 1 +autre 1 +ins 1 +me 1 +I 1 +▁the 1 +▁financement 1 +éducation 1 +É 1 +par 1 +▁besoins 1 +▁pouvoir 1 +▁donné 1 +▁é 1 +▁chez 1 +ton 1 +▁celui 1 +▁production 1 +▁comment 1 +▁certaines 1 +▁Bureau 1 +▁celle 1 +▁In 1 +▁terme 1 +▁année 1 +ale 1 +▁serait 1 +ta 1 +ol 1 +▁relatives 1 +▁documents 1 +ion 1 +▁vraiment 1 +▁mondiale 1 +Rires 1 +▁tenu 1 +ordre 1 +▁effet 1 +▁forme 1 +▁; 1 +▁transport 1 +▁pris 1 +ot 1 +▁participation 1 +che 1 +▁là 1 +▁maintenant 1 +▁canadienne 1 +▁choses 1 +▁juin 1 +▁risque 1 +ique 1 +▁durable 1 +▁quelques 1 +▁prix 1 +administration 1 +▁16 1 +ill 1 +.1 1 +art 1 +rait 1 +▁Gouvernement 1 +▁valeur 1 +ré 1 +▁canadien 1 +▁soutien 1 +▁ni 1 +▁nécessaire 1 +▁République 1 +▁lorsque 1 +▁2005 1 +▁outre 1 +om 1 +eux 1 +9 1 +▁font 1 +▁mieux 1 +▁type 1 +▁2006 1 +▁traitement 1 +▁respect 1 +▁donner 1 +» 1 +▁jeunes 1 +accès 1 +ensemble 1 +eurs 1 +▁long 1 +ér 1 +ront 1 +▁17 1 +ti 1 +▁rapports 1 +▁communauté 1 +▁2007 1 +▁cause 1 +après 1 +lo 1 +▁pouvez 1 +▁fonds 1 +▁social 1 +▁v 1 +▁dis 1 +▁ici 1 +ner 1 +▁devraient 1 +con 1 +agit 1 +▁institutions 1 +▁sein 1 +▁Parlement 1 +▁européen 1 +8 1 +▁commerce 1 +ig 1 +qu 1 +ence 1 +▁Con 1 +▁note 1 +▁heures 1 +▁avaient 1 +ic 1 +▁Mme 1 +▁no 1 +è 1 +▁aujourd 1 +▁moi 1 +ay 1 +▁capacité 1 +▁Cour 1 +ier 1 +▁0 1 +▁Conférence 1 +▁mars 1 +▁mandat 1 +▁dépenses 1 +▁septembre 1 +▁100 1 +▁liste 1 +▁2004 1 +os 1 +▁réunion 1 +▁ministre 1 +▁montant 1 +▁ch 1 +ES 1 +if 1 +▁Ministère 1 +▁but 1 +industrie 1 +▁demandé 1 +▁création 1 +▁créer 1 +ve 1 +▁affaires 1 +▁budget 1 +AC 1 +▁nécessaires 1 +▁mai 1 +Europe 1 +▁po 1 +▁spécial 1 +▁fournir 1 +année 1 +▁procédure 1 +ure 1 +▁quatre 1 +▁systèmes 1 +▁to 1 +▁avez 1 +.2 1 +▁sens 1 +min 1 +▁É 1 +accord 1 +▁internationales 1 +▁jours 1 +▁auprès 1 +▁souvent 1 +▁sociale 1 +▁sorte 1 +▁famille 1 +▁25 1 +▁recommandations 1 +▁étant 1 +vi 1 +▁normes 1 +▁éléments 1 +▁renforcer 1 +▁pratiques 1 +▁différents 1 +▁juste 1 +▁technique 1 +ag 1 +▁cinq 1 +▁lutte 1 +ants 1 +▁permis 1 +▁celles 1 +isation 1 +▁croissance 1 +dé 1 +▁déclaration 1 +exercice 1 +▁moyens 1 +▁Donc 1 +co 1 +▁ra 1 +▁trouver 1 +▁plupart 1 +▁juillet 1 +▁communication 1 +▁Cela 1 +▁bon 1 +▁soins 1 +voir 1 +K 1 +▁début 1 +aires 1 +ard 1 +ia 1 +lé 1 +ab 1 +▁fins 1 +ive 1 +▁pense 1 +▁pratique 1 +▁permet 1 +▁vos 1 +▁Rapport 1 +objet 1 +tant 1 +man 1 +▁jamais 1 +▁domaines 1 +▁suivi 1 +ed 1 +▁progrès 1 +pos 1 +to 1 +▁décisions 1 +com 1 +iv 1 +▁2008 1 +ici 1 +UE 1 +ONU 1 +J 1 +▁indiqué 1 +▁technologie 1 +▁deuxième 1 +▁2003 1 +▁21 1 +▁autorités 1 +▁partir 1 +▁24 1 +▁ligne 1 +▁Ma 1 +▁économiques 1 +▁Comme 1 +▁novembre 1 +▁proposition 1 +▁nombreux 1 +▁Centre 1 +▁haut 1 +end 1 +▁janvier 1 +▁appel 1 +élaboration 1 +▁bonne 1 +W 1 +▁2002 1 +▁eux 1 +sion 1 +entre 1 +▁». 1 +na 1 +ère 1 +sse 1 +▁régions 1 +ge 1 +▁responsabilité 1 +▁promotion 1 +appui 1 +▁aider 1 +▁accord 1 +▁opérations 1 +▁assurer 1 +▁règles 1 +▁membre 1 +_ 1 +▁aucune 1 +vous 1 +▁avril 1 +▁31 1 +▁effets 1 +▁Nord 1 +▁octobre 1 +▁adopté 1 +▁dernier 1 +Office 1 +▁reçu 1 +▁violence 1 +.3 1 +▁total 1 +▁vol 1 +CE 1 +▁référence 1 +▁stratégie 1 +▁charge 1 +▁représentants 1 +▁devant 1 +mo 1 +▁déterminer 1 +▁nature 1 +▁ministère 1 +▁réponse 1 +▁différentes 1 +énergie 1 +son 1 +▁justice 1 +% 1 +▁mes 1 +▁techniques 1 +ap 1 +▁grâce 1 +▁représentant 1 +▁an 1 +assurer 1 +▁fond 1 +as 1 +▁à 1 +▁termes 1 +▁permettre 1 +nes 1 +▁comp 1 +all 1 +▁relative 1 +▁prises 1 +ign 1 +▁», 1 +▁pu 1 +▁lorsqu 1 +▁autochtones 1 +▁environ 1 +▁2000 1 +▁Ch 1 +od 1 +▁nationales 1 +▁nationaux 1 +▁hommes 1 +▁points 1 +▁changement 1 +▁coût 1 +▁principes 1 +mi 1 +air 1 +égalité 1 +▁section 1 +▁vigueur 1 +▁relations 1 +▁reste 1 +... 1 +intérêt 1 +▁revenu 1 +▁50 1 +▁coûts 1 +▁changements 1 +AN 1 +▁mondial 1 +▁aide 1 +▁face 1 +▁frais 1 +origine 1 +tique 1 +▁devons 1 +▁législation 1 +▁risques 1 +exécution 1 +▁propre 1 +importance 1 +exploitation 1 +▁22 1 +▁poste 1 +▁2001 1 +▁certain 1 +tra 1 +ub 1 +▁améliorer 1 +avoir 1 +égard 1 +établissement 1 +▁tels 1 +▁passé 1 +▁civile 1 +tes 1 +int 1 +▁gouvernements 1 +IS 1 +iste 1 +▁Règlement 1 +▁Tribunal 1 +▁délégation 1 +va 1 +▁commun 1 +▁pourquoi 1 +▁séance 1 +▁aucun 1 +ue 1 +▁rendre 1 +▁t 1 +ables 1 +▁promouvoir 1 +▁efficace 1 +▁divers 1 +▁près 1 +▁internationaux 1 +▁débat 1 +gu 1 +ateurs 1 +▁pourraient 1 +▁propriété 1 +▁lequel 1 +du 1 +▁régime 1 +▁avis 1 +▁per 1 +per 1 +▁dernière 1 +urs 1 +état 1 +▁importante 1 +▁procédures 1 +▁ensemble 1 +▁puis 1 +▁réseau 1 +▁discrimination 1 +▁financière 1 +▁di 1 +▁position 1 +.4 1 +istes 1 +▁réduire 1 +lu 1 +▁plutôt 1 +▁travers 1 +▁tel 1 +ER 1 +▁traité 1 +ite 1 +▁Web 1 +); 1 +ations 1 +▁participants 1 +▁centre 1 +▁No 1 +organisation 1 +ver 1 +▁sûr 1 +dic 1 +▁employés 1 +▁direction 1 +pl 1 +▁donne 1 +Y 1 +pe 1 +▁actuellement 1 +▁égard 1 +▁for 1 +▁principe 1 +ma 1 +▁président 1 +▁niveaux 1 +▁23 1 +▁St 1 +ob 1 +▁́ 1 +▁prise 1 +▁comprendre 1 +▁Pro 1 +▁Se 1 +▁approche 1 +▁obtenir 1 +▁contexte 1 +res 1 +tre 1 +IC 1 +▁examiné 1 +▁Bien 1 +▁seule 1 +▁partenaires 1 +▁pouvons 1 +▁texte 1 +▁publié 1 +▁Alors 1 +ateur 1 +be 1 +iques 1 +ante 1 +and 1 +▁présenter 1 +▁coordination 1 +▁contenu 1 +▁réduction 1 +▁culture 1 +▁Sa 1 +▁trouve 1 +▁créé 1 +▁collaboration 1 +▁fa 1 +▁territoire 1 +▁utiliser 1 +▁nécessité 1 +▁études 1 +▁juridique 1 +tu 1 +▁décidé 1 +isme 1 +▁Br 1 +org 1 +our 1 +lement 1 +activité 1 +30 1 +▁porte 1 +▁Canadiens 1 +▁matériel 1 +▁disposition 1 +▁sociaux 1 +▁fédéral 1 +▁existe 1 +ction 1 +analyse 1 +▁examen 1 +▁vu 1 +▁prévention 1 +ph 1 +▁milieu 1 +▁surveillance 1 +▁Dé 1 +adoption 1 +ssent 1 +▁soumis 1 +▁répondre 1 +▁bureau 1 +né 1 +ification 1 +▁telle 1 +50 1 +▁trop 1 +▁modèle 1 +▁capacités 1 +gi 1 +▁preuve 1 +▁secteurs 1 +euse 1 +appel 1 +▁oeuvre 1 +▁moyenne 1 +▁réalisation 1 +ist 1 +▁structure 1 +▁demandes 1 +▁présenté 1 +▁seul 1 +▁Fonds 1 +▁dernières 1 +▁exigences 1 +▁marchés 1 +enseignement 1 +▁État 1 +Agence 1 +▁tenir 1 +▁possibilité 1 +▁maintien 1 +▁davantage 1 +efficacité 1 +▁proposé 1 +abord 1 +▁participer 1 +▁déc 1 +▁Toutefois 1 +▁faveur 1 +IN 1 +▁pêche 1 +ille 1 +ticulièrement 1 +▁recours 1 +él 1 +▁initiatives 1 +▁police 1 +▁tard 1 +▁février 1 +▁propos 1 +pa 1 +économie 1 +▁ad 1 +▁guerre 1 +▁conférence 1 +assurance 1 +ga 1 +▁zone 1 +▁1999 1 +▁technologies 1 +▁durant 1 +avis 1 +▁mer 1 +:// 1 +annexe 1 +▁page 1 +go 1 +▁Ro 1 +▁suivants 1 +nd 1 +ON 1 +▁ville 1 +▁établi 1 +ten 1 +▁ailleurs 1 +▁simple 1 +vis 1 +▁compétences 1 +20 1 +▁mission 1 +yn 1 +▁nombreuses 1 +▁voie 1 +mé 1 +ois 1 +▁réserve 1 +▁conseil 1 +▁zones 1 +qui 1 +▁déclaré 1 +▁tu 1 +▁sol 1 +▁e 1 +auteur 1 +ord 1 +▁accès 1 +▁al 1 +ang 1 +▁telles 1 +ho 1 +▁vérification 1 +▁difficile 1 +iers 1 +do 1 +▁Sud 1 +ette 1 +▁quant 1 +▁numéro 1 +▁pauvreté 1 +15 1 +▁28 1 +▁large 1 +▁publics 1 +/2 1 +▁femme 1 +▁petit 1 +▁commencé 1 +▁semble 1 +▁mort 1 +▁six 1 +▁constitue 1 +igne 1 +Afrique 1 +▁vais 1 +tion 1 +ible 1 +serv 1 +▁mal 1 +même 1 +° 1 +▁comité 1 +use 1 +▁Santé 1 +▁citoyens 1 +▁choix 1 +▁parler 1 +▁définition 1 +▁26 1 +▁genre 1 +www 1 +▁principaux 1 += 1 +Uni 1 +▁suivant 1 +▁armes 1 +13 1 +▁transfert 1 +▁! 1 +▁durée 1 +▁humaines 1 +ry 1 +▁privé 1 +▁condition 1 +▁II 1 +▁méthodes 1 +▁Monsieur 1 +▁Tout 1 +▁série 1 +▁tenue 1 +▁état 1 +▁directement 1 +▁gouvernementale 1 +hi 1 +▁Al 1 +-1 1 +▁40 1 +▁continuer 1 +▁application 1 +▁quoi 1 +▁27 1 +▁mé 1 +▁directive 1 +dire 1 +▁travailleurs 1 +▁valeurs 1 +▁fonctions 1 +tro 1 +étude 1 +ise 1 +ct 1 +▁i 1 +▁rien 1 +▁directeur 1 +▁marchandises 1 +▁diverses 1 +▁victimes 1 +11 1 +gc 1 +▁ensuite 1 +▁continue 1 +ienne 1 +▁rec 1 +da 1 +EN 1 +▁protéger 1 +▁op 1 +▁parmi 1 +▁sociétés 1 +▁langue 1 +▁passe 1 +Applaudissements 1 +form 1 +10 1 +▁aurait 1 +j 1 +▁Voici 1 +▁plans 1 +▁contribution 1 +▁Y 1 +▁o 1 +▁communautaire 1 +▁rendement 1 +▁financières 1 +▁demander 1 +▁trans 1 +port 1 +▁offre 1 +enfant 1 +Ontario 1 +▁travailler 1 +▁comprend 1 +▁Sel 1 +▁réglementation 1 +▁articles 1 +tation 1 +▁liberté 1 +▁défense 1 +▁construction 1 +▁faisant 1 +ég 1 +▁lois 1 +ib 1 +intégration 1 +▁br 1 +▁fédérale 1 +▁disponibles 1 +▁Secrétariat 1 +mar 1 +▁permanent 1 +▁statut 1 +▁Parties 1 +▁principal 1 +val 1 +rie 1 +▁aspects 1 +▁critères 1 +ec 1 +▁renforcement 1 +▁financiers 1 +▁utilisé 1 +av 1 +▁facteurs 1 +érer 1 +bi 1 +nel 1 +▁étude 1 +▁commission 1 +▁New 1 +intention 1 +▁classe 1 +entreprise 1 +▁connaissances 1 +▁réunions 1 +▁contact 1 +▁priorités 1 +▁planification 1 +ç 1 +lor 1 +▁biens 1 +▁solution 1 +▁rendu 1 +▁obligations 1 +▁main 1 +▁rend 1 +▁contribuer 1 +ales 1 +▁gaz 1 +investissement 1 +ven 1 +▁salle 1 +▁contrat 1 +▁imp 1 +urgence 1 +▁consultatif 1 +▁permettant 1 +▁anti 1 +▁Québec 1 +▁août 1 +▁élevé 1 +▁fer 1 +▁http 1 +X 1 +AT 1 +io 1 +▁centrale 1 +▁côté 1 +ide 1 +▁Z 1 +▁conséquent 1 +ate 1 +▁X 1 +▁crise 1 +ux 1 +▁cent 1 +▁langues 1 +▁propositions 1 +expérience 1 +dessus 1 +ger 1 +▁Mo 1 +AR 1 +▁canadiennes 1 +je 1 +▁Ré 1 +▁propres 1 +▁suivantes 1 +▁électronique 1 +▁responsable 1 +CI 1 +▁sélection 1 +▁Co 1 +▁version 1 +▁Inc 1 +▁faciliter 1 +▁relatifs 1 +▁stratégique 1 +ét 1 +▁succès 1 +objectif 1 +▁Déclaration 1 +▁assez 1 +▁60 1 +avais 1 +▁terrorisme 1 +▁Cependant 1 +▁peine 1 +▁rapidement 1 +▁démocratique 1 +▁annuel 1 +▁présentation 1 +▁Plan 1 +12 1 +▁postes 1 +ali 1 +ives 1 +▁tour 1 +▁portant 1 +▁écrit 1 +▁clients 1 +▁Mar 1 +▁Internet 1 +▁grandes 1 +▁force 1 +▁faible 1 +▁passer 1 +▁Membres 1 +▁Services 1 +▁Europe 1 +▁Qu 1 +ow 1 +▁surtout 1 +▁29 1 +▁mot 1 +cul 1 +▁régional 1 +▁Article 1 +spect 1 +▁chargé 1 +▁mécanismes 1 +▁financier 1 +no 1 +gé 1 +st 1 +EC 1 +▁veux 1 +cour 1 +▁fl 1 +ens 1 +assistance 1 +▁estime 1 +▁Code 1 +▁unique 1 +enquête 1 +rons 1 +▁trait 1 +▁communautés 1 +▁conclu 1 +▁supplémentaires 1 +▁manque 1 +essai 1 +▁Protocole 1 +lic 1 +▁maison 1 +▁vote 1 +▁chapitre 1 +▁sources 1 +▁chacun 1 +em 1 +▁rapide 1 +échelle 1 +▁caractère 1 +▁U 1 +▁provisoire 1 +▁entreprise 1 +▁meilleure 1 +▁médias 1 +14 1 +ha 1 +▁Car 1 +▁crois 1 +▁prend 1 +alité 1 +▁liés 1 +IT 1 +▁troisième 1 +tent 1 +éri 1 +▁dialogue 1 +▁/ 1 +▁humains 1 +▁chef 1 +▁aura 1 +▁relatif 1 +▁local 1 +▁fr 1 +uit 1 +land 1 +▁◦ 1 +▁importants 1 +▁voyage 1 +▁liées 1 +▁suit 1 +enregistrement 1 +oy 1 +▁Sur 1 +tr 1 +AL 1 +intérieur 1 +▁Service 1 +▁bas 1 +▁Chine 1 +tribu 1 +absence 1 +up 1 +▁terrain 1 +▁code 1 +Amérique 1 +pé 1 +isse 1 +avait 1 +▁coup 1 +▁possibilités 1 +▁fonctionnement 1 +▁dés 1 +▁instruments 1 +▁secrétariat 1 +ern 1 +▁contributions 1 +▁1, 1 +▁ait 1 +étais 1 +nelle 1 +▁VIH 1 +▁ET 1 +▁responsables 1 +▁conflit 1 +▁prévoit 1 +▁présence 1 +▁conflits 1 +▁LA 1 +ire 1 +▁milliards 1 +lant 1 +25 1 +▁méthode 1 +ly 1 +tri 1 +▁Quand 1 +▁Ministre 1 +▁ministères 1 +améliorer 1 +ris 1 +▁visite 1 +▁port 1 +▁juge 1 +▁DES 1 +iser 1 +▁organes 1 +▁avantages 1 +▁vise 1 +vers 1 +▁intérieur 1 +tiques 1 +▁êtes 1 +▁libre 1 +nous 1 +oul 1 +entrée 1 +▁espèces 1 +avenir 1 +histoire 1 +▁réforme 1 +ché 1 +ments 1 +▁particulière 1 +▁garantir 1 +.5 1 +ug 1 +▁maladie 1 +▁1998 1 +▁dès 1 +▁intérêts 1 +▁Ex 1 +OR 1 +ière 1 +▁anglais 1 +▁comportement 1 +▁forces 1 +br 1 +40 1 +cher 1 +innovation 1 +▁puisse 1 +▁tiers 1 +âge 1 +▁convient 1 +▁vente 1 +▁clairement 1 +▁évaluation 1 +▁actuelle 1 +▁modifications 1 +▁convention 1 +der 1 +▁délai 1 +▁source 1 +gue 1 +▁formes 1 +act 1 +▁Après 1 +▁nord 1 +18 1 +▁toutefois 1 +▁commune 1 +éd 1 +▁grands 1 +▁actions 1 +▁consultations 1 +▁réalité 1 +▁pi 1 +▁quelle 1 +▁canadiens 1 +▁raisons 1 +nant 1 +mer 1 +▁simplement 1 +▁Mon 1 +▁marque 1 +▁lesquelles 1 +▁types 1 +▁défini 1 +▁Me 1 +▁objectif 1 +▁réfugiés 1 +▁scientifiques 1 +▁Etats 1 +& 1 +▁Ainsi 1 +▁stratégies 1 +nal 1 +espace 1 +nement 1 +â 1 +▁ai 1 +▁représente 1 +▁met 1 +▁2009 1 +▁fonctionnaires 1 +qué 1 +▁physique 1 +▁1. 1 +alinéa 1 +▁servir 1 +ell 1 +▁regard 1 +▁enregistré 1 +▁parents 1 +occasion 1 +▁voudrais 1 +▁maladies 1 +RE 1 +experts 1 +▁relativement 1 +▁publiques 1 +▁prévu 1 +▁route 1 +▁obtenu 1 +▁The 1 +▁Merci 1 +▁train 1 +ative 1 +19 1 +prim 1 +▁Vi 1 +▁émissions 1 +ies 1 +▁plein 1 +ni 1 +des 1 +inter 1 +▁com 1 +▁choisi 1 +ient 1 +éc 1 +▁quantité 1 +dit 1 +▁quel 1 +ix 1 +▁lettre 1 +▁Haut 1 +▁lumière 1 +ev 1 +▁crédit 1 +08 1 +▁article 1 +ités 1 +▁faites 1 +▁professionnelle 1 +expression 1 +▁lesquels 1 +RC 1 +▁Comment 1 +Q 1 +▁spéciale 1 +▁tableau 1 +▁consultation 1 +▁négociations 1 +idée 1 +▁collectivités 1 +▁sub 1 +AP 1 +ler 1 +ade 1 +isé 1 +▁(19 1 +hé 1 +▁veut 1 +▁petits 1 +▁priorité 1 +ène 1 +▁interne 1 +16 1 +▁inc 1 +▁examiner 1 +ron 1 +▁majorité 1 +▁Depuis 1 +▁centres 1 +nu 1 +▁locaux 1 +▁militaire 1 +▁jouer 1 +▁phase 1 +▁corps 1 +amélioration 1 +▁utilisés 1 +▁établissements 1 +▁confiance 1 +▁consommation 1 +édi 1 +▁Direction 1 +▁populations 1 +ifié 1 +▁Amendement 1 +▁concurrence 1 +ous 1 +euses 1 +▁radio 1 +▁liens 1 +▁petite 1 +ast 1 +éré 1 +▁consiste 1 +▁Nouvelle 1 +▁Elles 1 +▁établir 1 +▁observations 1 +▁▪ 1 +ka 1 +▁atteint 1 +▁juridiques 1 +ak 1 +▁taille 1 +bo 1 +onne 1 +rais 1 +▁signifie 1 +▁statistiques 1 +▁tr 1 +▁accords 1 +60 1 +out 1 +ind 1 +-2 1 +▁champ 1 +▁suivre 1 +▁militaires 1 +▁Or 1 +sida 1 +▁pr 1 +SE 1 +applique 1 +▁conclusions 1 +▁aller 1 +@ 1 +IR 1 +lin 1 +▁multi 1 +▁Royaume 1 +argent 1 +▁savez 1 +▁candidats 1 +Ouest 1 +non 1 +▁haute 1 +fr 1 +▁province 1 +CN 1 +ort 1 +▁caractéristique 1 +▁lignes 1 +▁organisation 1 +▁petites 1 +équipe 1 +▁An 1 +▁k 1 +▁Afrique 1 +▁Lorsque 1 +▁approuvé 1 +évolution 1 +mp 1 +▁Colombie 1 +▁responsabilités 1 +▁agents 1 +éro 1 +▁déposé 1 +05 1 +ati 1 +▁Communauté 1 +▁pied 1 +tte 1 +uc 1 +/1 1 +▁partage 1 +▁final 1 +▁conçu 1 +▁terres 1 +▁scientifique 1 +teur 1 +▁direct 1 +pt 1 +▁communications 1 +▁campagne 1 +ich 1 +▁prévues 1 +▁www 1 +▁1995 1 +▁parti 1 +▁meilleur 1 +▁globale 1 +échange 1 +▁pla 1 +ép 1 +▁forte 1 +▁conséquences 1 +ème 1 +▁concept 1 +ke 1 +▁Sous 1 +▁col 1 +▁entendu 1 +ssant 1 +03 1 +▁figure 1 +▁suivante 1 +▁régionaux 1 +▁pouvait 1 +▁régionales 1 +▁solutions 1 +▁développer 1 +▁sites 1 +▁transports 1 +▁catégorie 1 +▁traite 1 +▁veiller 1 +▁cor 1 +▁peuple 1 +▁familles 1 +▁humaine 1 +▁Date 1 +aine 1 +▁généralement 1 +inc 1 +iez 1 +▁télé 1 +▁licence 1 +▁portée 1 +▁capital 1 +▁sociales 1 +▁France 1 +▁annexe 1 +▁or 1 +▁siècle 1 +▁mère 1 +AS 1 +▁etc 1 +mb 1 +ts 1 +▁terre 1 +ong 1 +▁photo 1 +▁longue 1 +▁modification 1 +apprentissage 1 +▁presque 1 +17 1 +▁action 1 +▁élément 1 +▁semaine 1 +▁conseils 1 +▁connaissance 1 +▁pénale 1 +▁Document 1 +CC 1 +Britannique 1 +eu 1 +yl 1 +29 1 +▁importantes 1 +▁reconnu 1 +▁actes 1 +▁complète 1 +▁Terre 1 +▁fil 1 +▁organisé 1 +▁activité 1 +▁réaliser 1 +▁mécanisme 1 +01 1 +AD 1 +▁profit 1 +▁trouvé 1 +▁poursuivre 1 +▁man 1 +▁cerveau 1 +▁pleinement 1 +▁partenariat 1 +▁locales 1 +▁̈ 1 +▁spécifiques 1 +▁2004, 1 +▁1997 1 +▁analyse 1 +▁résultat 1 +tal 1 +▁& 1 +ban 1 +erie 1 +élimination 1 +▁augmentation 1 +! 1 +▁composé 1 +▁fort 1 +▁mar 1 +▁idée 1 +▁expérience 1 +▁2, 1 +ces 1 +▁décrit 1 +▁uniquement 1 +▁cons 1 +amp 1 +▁2005, 1 +▁vrai 1 +abilité 1 +▁atteindre 1 +▁récemment 1 +▁micro 1 +app 1 +▁recommande 1 +▁tri 1 +▁médicaments 1 +▁provenant 1 +ien 1 +▁peuples 1 +▁parc 1 +don 1 +pp 1 +▁distribution 1 +ach 1 +▁dispose 1 +▁recherches 1 +▁consommateurs 1 +▁Ar 1 +▁Fa 1 +21 1 +TE 1 +▁York 1 +▁nucléaires 1 +▁Russie 1 +impôt 1 +▁2003, 1 +TION 1 +ttes 1 +▁élaboré 1 +▁ouvert 1 +gén 1 +▁dépend 1 +▁quelqu 1 +▁ren 1 +73 1 +▁vis 1 +96 1 +▁changer 1 +attention 1 +▁enfant 1 +\ 1 +▁logement 1 +▁chemin 1 +▁souhaite 1 +▁communiquer 1 +lect 1 +ana 1 +▁compétence 1 +lon 1 +▁dû 1 +ult 1 +▁prêt 1 +▁montre 1 +▁réseaux 1 +▁90 1 +he 1 +tim 1 +▁revenus 1 +▁Banque 1 +▁importe 1 +iz 1 +initiative 1 +▁intellectuelle 1 +vé 1 +▁nations 1 +▁retour 1 +▁Tous 1 +▁seraient 1 +▁doute 1 +▁bo 1 +▁raisonnable 1 +▁bio 1 +ques 1 +ération 1 +ologie 1 +rou 1 +▁défis 1 +▁environnement 1 +▁naturelles 1 +". 1 +▁publication 1 +▁Mission 1 +utiliser 1 +▁emploi 1 +po 1 +can 1 +▁gros 1 +▁relation 1 +67 1 +tur 1 +▁humanitaire 1 +▁Charte 1 +▁dépôt 1 +▁2002, 1 +établir 1 +AM 1 +▁-- 1 +▁DU 1 +ines 1 +▁prestations 1 +▁propose 1 +▁limite 1 +▁contraire 1 +cent 1 +24 1 +▁favoriser 1 +wa 1 +▁judiciaire 1 +▁diversité 1 +heure 1 +infrastructure 1 +iff 1 +▁gra 1 +agriculture 1 +▁précise 1 +▁* 1 +isant 1 +▁traités 1 +obtenir 1 +▁ro 1 +nc 1 +▁essentiel 1 +▁véhicules 1 +▁supérieur 1 +tin 1 +▁respecter 1 +▁2000, 1 +▁occasion 1 +cré 1 +▁gr 1 +▁vont 1 +école 1 +▁livre 1 +▁considérée 1 +gr 1 +examiner 1 +▁exp 1 +Accord 1 +uff 1 +▁fi 1 +ju 1 +▁engagements 1 +▁2001, 1 +▁rue 1 +RI 1 +▁situé 1 +▁utile 1 +▁voyez 1 +US 1 +▁trou 1 +men 1 +▁Pré 1 +▁prestation 1 +▁change 1 +▁alimentaire 1 +▁recommandé 1 +▁eaux 1 +▁Que 1 +▁étudiants 1 +mes 1 +▁conception 1 +▁étrangères 1 +▁sud 1 +▁disponible 1 +▁commercial 1 +offre 1 +▁Annexe 1 +ê 1 +▁Bo 1 +▁bureaux 1 +06 1 +dessous 1 +▁difficultés 1 +” 1 +▁lancé 1 +▁informé 1 +▁chercheurs 1 +nés 1 +▁lien 1 +existence 1 +▁recommandation 1 +▁constituent 1 +att 1 +▁Ba 1 +▁continu 1 +enne 1 +▁parle 1 +▁professionnels 1 +▁loin 1 +▁cycle 1 +mis 1 +TM 1 +issement 1 +▁humain 1 +▁calcul 1 +▁environnemental 1 +▁attention 1 +▁appelé 1 +▁exprimé 1 +venu 1 +▁animaux 1 +▁pression 1 +▁devenir 1 +▁règle 1 +▁produire 1 +▁engagé 1 +▁permettra 1 +ouverture 1 +▁outils 1 +▁matières 1 +▁connaître 1 +▁paiement 1 +▁probablement 1 +▁efficaces 1 +eff 1 +▁parfois 1 +oire 1 +ame 1 +▁35 1 +chant 1 +antes 1 +ose 1 +ration 1 +engagement 1 +▁ép 1 +▁appui 1 +rc 1 +▁démocratie 1 +▁aliments 1 +▁contient 1 +atif 1 +installation 1 +▁1994 1 +▁cependant 1 +▁autant 1 +▁Ça 1 +accent 1 +▁2006, 1 +raient 1 +▁mentionné 1 +adresse 1 +▁super 1 +▁histoire 1 +▁déclarations 1 +▁autour 1 +PE 1 +▁substances 1 +rain 1 +▁transition 1 +▁faite 1 +▁permettent 1 +▁français 1 +90 1 +▁réponses 1 +▁filles 1 +lan 1 +▁film 1 +▁“ 1 +étranger 1 +▁ta 1 +voy 1 +év 1 +▁principales 1 +▁commencer 1 +▁Ad 1 +▁totale 1 +▁prochaine 1 +▁court 1 +▁traiter 1 +▁joue 1 +▁80 1 +pro 1 +▁principalement 1 +▁Division 1 +▁venir 1 +▁investissements 1 +▁élections 1 +▁porter 1 +▁Ca 1 +▁peux 1 +4) 1 +▁préparation 1 +▁Ottawa 1 +▁post 1 +▁pouvoirs 1 +▁modèles 1 +▁devait 1 +▁all 1 +▁Li 1 +▁surface 1 +▁souligné 1 +▁installations 1 +▁diffusion 1 +▁considération 1 +ui 1 +ori 1 +▁Enfin 1 +▁formulaire 1 +▁annuelle 1 +▁ca 1 +▁Projet 1 +lig 1 +▁missions 1 +▁so 1 +▁téléphone 1 +▁directives 1 +▁dix 1 +▁carte 1 +▁cha 1 +log 1 +▁fourni 1 +▁indique 1 +ov 1 +▁vidéo 1 +09 1 +▁officielles 1 +alisation 1 +lit 1 +▁considère 1 +▁modifier 1 +▁provinces 1 +€ 1 +▁ba 1 +▁Département 1 +cl 1 +approbation 1 +ît 1 +▁mots 1 +▁étrangers 1 +ATION 1 +▁tra 1 +accueil 1 +▁comporte 1 +▁dossier 1 +agissant 1 +▁puissent 1 +▁Cet 1 +▁sou 1 +▁correspondant 1 +ures 1 +* 1 +▁science 1 +ical 1 +▁vision 1 +▁montrer 1 +ty 1 +23 1 +TA 1 +▁courant 1 +▁w 1 +uis 1 +▁danger 1 +▁ob 1 +naire 1 +▁siège 1 +mon 1 +là 1 +▁test 1 +▁App 1 +▁connu 1 +▁évaluer 1 +orientation 1 +tic 1 +78 1 +ô 1 +▁vivant 1 +▁comptes 1 +▁menace 1 +▁commerciales 1 +▁semaines 1 +22 1 +ages 1 +approche 1 +▁vaste 1 +uv 1 +– 1 +▁1996 1 +▁utilisation 1 +02 1 +effet 1 +OU 1 +▁Saint 1 +66 1 +▁urbain 1 +(1) 1 +▁minutes 1 +▁enquête 1 +▁Com 1 +▁communiqué 1 +▁mode 1 +▁exige 1 +▁communautaires 1 +vo 1 +vent 1 +▁compter 1 +▁penser 1 +cept 1 +▁proportion 1 +Institut 1 +mat 1 +ule 1 +▁CE 1 +▁Partie 1 +▁= 1 +impact 1 +ja 1 +PR 1 +▁mêmes 1 +▁maintenir 1 +arrêt 1 +▁sais 1 +▁cellules 1 +26 1 +ba 1 +itu 1 +chi 1 +issant 1 +▁compar 1 +▁500 1 +esprit 1 +so 1 +▁limites 1 +▁Est 1 +▁habit 1 +▁fais 1 +ari 1 +▁Accueil 1 +fi 1 +▁satisfaction 1 +▁préalable 1 +én 1 +▁soutenir 1 +ifs 1 +Add 1 +▁signé 1 +▁1990 1 +▁circonstances 1 +▁commis 1 +hy 1 +▁cré 1 +▁bou 1 +▁villes 1 +▁intervenants 1 +▁45 1 +▁fo 1 +rom 1 +▁désir 1 +▁presse 1 +▁règlements 1 +nov 1 +car 1 +▁rempli 1 +▁Ne 1 +si 1 +▁régionale 1 +imi 1 +ats 1 +obligation 1 +▁candidat 1 +cur 1 +Z 1 +uel 1 +▁Représentant 1 +▁jeu 1 +▁demeure 1 +▁permanente 1 +▁ét 1 +▁fondée 1 +ert 1 +▁considérable 1 +▁né 1 +▁sexuelle 1 +▁sept 1 +tage 1 +▁facile 1 +▁cancer 1 +▁convenu 1 +née 1 +▁volonté 1 +▁Gu 1 +▁Certains 1 +ième 1 +lle 1 +▁guide 1 +EM 1 +▁drogues 1 +▁John 1 +▁scolaire 1 +▁Plus 1 +avons 1 +▁réuni 1 +▁Traité 1 +▁partout 1 +." 1 +▁Na 1 +▁territoires 1 +▁départ 1 +▁patients 1 +▁cour 1 +27 1 +ah 1 +▁Notre 1 +▁conséquence 1 +▁complet 1 +▁prévue 1 +émission 1 +▁réel 1 +▁sport 1 +ity 1 +▁stabilité 1 +augmentation 1 +enfants 1 +▁fondamentaux 1 +pr 1 +▁précis 1 +RS 1 +ani 1 +DE 1 +▁Voir 1 +pi 1 +▁mener 1 +ition 1 +▁Point 1 +▁offert 1 +▁Ra 1 +31 1 +▁stratégiques 1 +ud 1 +tar 1 +iens 1 +▁précédent 1 +▁délégations 1 +équipement 1 +▁défi 1 +cr 1 +tor 1 +▁modifié 1 +▁réaction 1 +ran 1 +▁privée 1 +▁arrive 1 +▁voix 1 +▁III 1 +▁critique 1 +armes 1 +moi 1 +LE 1 +▁seconde 1 +▁vert 1 +resse 1 +▁réussi 1 +ice 1 +▁tribunal 1 +04 1 +▁Dr 1 +▁commentaires 1 +gouvernemental 1 +▁actuel 1 +▁adressée 1 +SC 1 +PC 1 +▁experts 1 +▁désarmement 1 +▁ceci 1 +▁déchets 1 +▁bal 1 +▁offrir 1 +▁devenu 1 +table 1 +▁garde 1 +ole 1 +▁révision 1 +▁ministres 1 +▁autorisé 1 +.6 1 +igné 1 +▁entier 1 +▁Directeur 1 +▁principale 1 +▁adoptée 1 +▁intégrée 1 +▁Ni 1 +07 1 +> 1 +▁poursuite 1 +». 1 +▁tendance 1 +aï 1 +ieux 1 +▁obligatoire 1 +▁%) 1 +▁volume 1 +▁Non 1 +tif 1 +ick 1 +-3 1 +▁chimiques 1 +impression 1 +▁clés 1 +▁fut 1 +affaires 1 +75 1 +informations 1 +▁fabrication 1 +72 1 +▁augmenté 1 +▁vient 1 +▁pan 1 +▁bois 1 +été 1 +arm 1 +appliquer 1 +téri 1 +▁administratives 1 +▁nucléaire 1 +▁pourcentage 1 +sc 1 +▁passage 1 +▁soutenu 1 +▁degré 1 +▁requérant 1 +mand 1 +rant 1 +SA 1 +▁secondaire 1 +▁intitulé 1 +teurs 1 +▁information 1 +▁Son 1 +▁bord 1 +▁Chaque 1 +duc 1 +ifi 1 +▁nommé 1 +▁devez 1 +▁tête 1 +sp 1 +TI 1 +élection 1 +▁prévenir 1 +ano 1 +▁observé 1 +▁active 1 +▁génération 1 +intervention 1 +▁partenariats 1 +uf 1 +▁Même 1 +▁ordinaire 1 +asse 1 +IM 1 +▁gouvernance 1 +▁2. 1 +▁participé 1 +ian 1 +▁précédente 1 +▁écoles 1 +▁conformité 1 +▁70 1 +▁utilisées 1 +▁Réunion 1 +▁intégré 1 +68 1 +▁premiers 1 +▁ouverte 1 +▁recevoir 1 +▁nomination 1 +▁200 1 +83 1 +▁derniers 1 +▁génétique 1 +▁idées 1 +▁potentiel 1 +ns 1 +autorité 1 +cri 1 +▁longtemps 1 +", 1 +▁commence 1 +▁auteurs 1 +ase 1 +▁appelle 1 +▁fourniture 1 +▁milliers 1 +▁st 1 +Université 1 +▁ordre 1 +▁catégories 1 +▁directrices 1 +avant 1 +▁chargée 1 +rit 1 +cadre 1 +▁organisée 1 +▁Avec 1 +▁trafic 1 +▁Pacte 1 +76 1 +bl 1 +▁CO 1 +▁particuliers 1 +▁sciences 1 +28 1 +▁résoudre 1 +▁Constitution 1 +▁Rapporteur 1 +▁pertinentes 1 +▁journal 1 +▁Maintenant 1 +▁apporter 1 +▁civils 1 +79 1 +▁organisme 1 +▁intérêt 1 +▁différence 1 +CR 1 +▁faits 1 +▁travaille 1 +▁donnée 1 +aider 1 +▁planète 1 +gn 1 +ente 1 +activités 1 +▁Japon 1 +▁détail 1 +ST 1 +▁présentée 1 +ip 1 +▁personnels 1 +▁favorable 1 +▁figurant 1 +▁moitié 1 +▁équipe 1 +ches 1 +▁suffisamment 1 +▁bande 1 +▁déterminé 1 +▁conservation 1 +▁International 1 +▁Do 1 +▁copie 1 +▁limitée 1 +habitat 1 +▁lieux 1 +▁sexe 1 +ject 1 +▁utilisant 1 +▁grave 1 +▁logiciel 1 +▁collecte 1 +OMPI 1 +▁financé 1 +▁véhicule 1 +ial 1 +80 1 +ête 1 +agent 1 +▁protocole 1 +▁commissaire 1 +▁accepté 1 +▁crime 1 +IP 1 +importe 1 +▁importance 1 +adhésion 1 +▁retard 1 +▁connexes 1 +▁pénal 1 +▁mi 1 +▁Ontario 1 +▁RE 1 +▁conduite 1 +▁is 1 +71 1 +▁− 1 +▁contra 1 +lar 1 +▁commerciaux 1 +▁rencontre 1 +imp 1 +NE 1 +▁clair 1 +92 1 +▁conclusion 1 +▁perte 1 +▁éco 1 +étaient 1 +cle 1 +33 1 +▁tient 1 +▁am 1 +ache 1 +▁extraordinaire 1 +▁supplémentaire 1 +▁numérique 1 +▁climat 1 +▁considéré 1 +vie 1 +trait 1 +▁(1 1 +▁équitable 1 +▁CN 1 +▁table 1 +▁estimé 1 +▁conforme 1 +ât 1 +▁sexes 1 +▁généraux 1 +▁exercice 1 +avocat 1 +DI 1 +vit 1 +35 1 +IE 1 +▁Ho 1 +inspection 1 +▁solide 1 +▁réalisé 1 +▁Ac 1 +▁message 1 +▁contenant 1 +dis 1 +▁collective 1 +▁Cl 1 +▁tâches 1 +▁laboratoire 1 +▁2007, 1 +74 1 +▁initiative 1 +▁tirer 1 +▁géographique 1 +clu 1 +ami 1 +▁annoncé 1 +▁mari 1 +97 1 +▁temporaire 1 +▁appliquer 1 +▁moteur 1 +▁température 1 +▁procédé 1 +▁résolutions 1 +▁périodique 1 +achat 1 +▁fournis 1 +▁inscrit 1 +In 1 +▁Be 1 +▁3, 1 +PS 1 +mêmes 1 +▁tandis 1 +sol 1 +▁élevée 1 +affectation 1 +▁He 1 +▁apporté 1 +▁bout 1 +ID 1 +atrice 1 +ko 1 +▁33 1 +▁représentent 1 +▁Jo 1 +ber 1 +▁ri 1 +▁applicables 1 +▁fournit 1 +▁maritime 1 +▁vivre 1 +▁agricole 1 +SP 1 +ères 1 +▁puisque 1 +▁couleur 1 +▁graves 1 +▁devra 1 +▁employé 1 +▁Du 1 +CP 1 +▁Toronto 1 +▁auxquels 1 +▁musique 1 +▁Premières 1 +▁primaire 1 +▁définir 1 +▁Conformément 1 +existe 1 +91 1 +▁Autres 1 +▁... 1 +▁mouvement 1 +▁parole 1 +▁utilise 1 +▁indicateurs 1 +70 1 +99 1 +▁Pas 1 +▁sé 1 +▁procéder 1 +▁parvenir 1 +logue 1 +▁commerciale 1 +espèce 1 +▁utilisateurs 1 +observation 1 +ium 1 +▁Note 1 +▁intéressant 1 +ore 1 +▁sauf 1 +▁Mc 1 +▁préoccupations 1 +part 1 +▁concours 1 +issue 1 +▁Per 1 +▁modalités 1 +▁So 1 +▁susceptibles 1 +▁énergétique 1 +▁pilote 1 +▁tiré 1 +ssé 1 +▁montré 1 +pprovisionnement 1 +viennent 1 +▁station 1 +▁ordinateur 1 +Est 1 +▁EN 1 +▁cherche 1 +▁inclus 1 +ox 1 +▁appris 1 +▁Mi 1 +études 1 +oir 1 +▁global 1 +PP 1 +▁chefs 1 +lier 1 +▁somme 1 +▁soi 1 +▁Air 1 +adi 1 +ik 1 +▁payé 1 +cra 1 +▁moderne 1 +▁circulation 1 +▁Pa 1 +▁rejet 1 +▁exposé 1 +ières 1 +era 1 +▁réalisés 1 +œ 1 +lation 1 +▁Sommet 1 +OP 1 +▁Fédération 1 +▁reconnaissance 1 +▁producteurs 1 +EUR 1 +94 1 +œuvre 1 +▁jugé 1 +▁fixé 1 +rage 1 +▁demandeur 1 +▁pourra 1 +93 1 +▁fournisseurs 1 +▁Section 1 +▁transparence 1 +▁voulu 1 +forme 1 +▁mou 1 +col 1 +delà 1 +000 1 +▁salaire 1 +▁prêts 1 +▁répond 1 +▁55 1 +▁pouvant 1 +▁situations 1 +▁Po 1 +ock 1 +▁nu 1 +ama 1 +▁Ou 1 +▁immédiatement 1 +q 1 +▁Montréal 1 +let 1 +▁description 1 +▁réelle 1 +▁Ju 1 +▁at 1 +▁su 1 +▁venu 1 +▁double 1 +▁1993 1 +isés 1 +▁familiale 1 +▁consacré 1 +▁conseiller 1 +exportation 1 +▁journée 1 +extérieur 1 +eaux 1 +▁supérieure 1 +su 1 +▁locale 1 +▁format 1 +cé 1 +▁ressort 1 +▁pauvres 1 +▁allé 1 +▁Col 1 +▁rémunération 1 +aille 1 +▁utilisée 1 +▁relève 1 +▁aérien 1 +▁gl 1 +▁envoyé 1 +▁central 1 +▁élèves 1 +▁32 1 +▁procès 1 +fo 1 +▁mené 1 +bon 1 +▁adapté 1 +EL 1 +▁souligne 1 +ôt 1 +▁can 1 +▁Genève 1 +▁sensibilisation 1 +▁désigné 1 +▁prochain 1 +tour 1 +▁Su 1 +▁feu 1 +▁affecté 1 +image 1 +▁futur 1 +ète 1 +▁Pourquoi 1 +érant 1 +▁LE 1 +gar 1 +▁structures 1 +oli 1 +tré 1 +atoire 1 +▁agricoles 1 +▁pièces 1 +▁fédéraux 1 +institution 1 +▁Bon 1 +▁placé 1 +▁comprennent 1 +▁commande 1 +▁auquel 1 +off 1 +▁impact 1 +▁participant 1 +tel 1 +affaire 1 +▁baisse 1 +▁européens 1 +▁Parce 1 +▁dossiers 1 +▁art 1 +▁conf 1 +▁événements 1 +emp 1 +-20 1 +▁poids 1 +▁vingt 1 +▁biais 1 +han 1 +▁assuré 1 +▁fondé 1 +▁plainte 1 +▁répartition 1 +▁retraite 1 +▁Quel 1 +ral 1 +▁invité 1 +▁paragraphes 1 +▁détention 1 +41 1 +association 1 +gre 1 +▁positive 1 +▁illicite 1 +▁torture 1 +▁not 1 +alimentation 1 +cer 1 +▁éviter 1 +▁vit 1 +▁appr 1 +▁collectivité 1 +▁essentiellement 1 +dition 1 +issent 1 +▁Avant 1 +▁proche 1 +isée 1 +▁discussions 1 +▁papier 1 +amb 1 +nis 1 +inscription 1 +▁instance 1 +▁consulter 1 +▁conférences 1 +environ 1 +▁nuit 1 +▁hors 1 +▁certificat 1 +▁certaine 1 +▁Afin 1 +amendement 1 +spir 1 +naires 1 +▁recettes 1 +▁Bar 1 +▁concert 1 +69 1 +▁Demande 1 +atifs 1 +▁effectué 1 +▁1992 1 +acte 1 +▁< 1 +ME 1 +vre 1 +▁CA 1 +▁gérer 1 +ley 1 +▁(1) 1 +▁élaborer 1 +▁exécutif 1 +▁savons 1 +ett 1 +bre 1 +▁2010 1 +fa 1 +▁endroit 1 +▁acte 1 +dia 1 +▁violation 1 +▁encourage 1 +tru 1 +▁complexe 1 +ym 1 +45 1 +▁marche 1 +Orient 1 +▁Pr 1 +▁dessin 1 +▁payer 1 +▁Tableau 1 +▁Compte 1 +▁sent 1 +▁support 1 +auto 1 +▁compréhension 1 +▁tâche 1 +▁reprise 1 +▁industrielle 1 +▁menées 1 +IF 1 +▁sujets 1 +▁vi 1 +86 1 +▁discussion 1 +87 1 +ath 1 +-4 1 +organisme 1 +▁Pays 1 +89 1 +▁congé 1 +ET 1 +▁instrument 1 +▁rester 1 +▁populaire 1 +▁différences 1 +▁faudrait 1 +autorisation 1 +▁historique 1 +nn 1 +appliquent 1 +77 1 +las 1 +▁tribunaux 1 +▁brut 1 +▁ferme 1 +▁maximum 1 +▁adjoint 1 +▁Description 1 +▁construire 1 +▁Nouveau 1 +Association 1 +▁voici 1 +ack 1 +employeur 1 +▁générales 1 +UR 1 +audience 1 +▁For 1 +▁minimum 1 +NA 1 +», 1 +appareil 1 +▁engagement 1 +jo 1 +az 1 +nent 1 +▁félicite 1 +▁arrêt 1 +▁signature 1 +interdiction 1 +ans 1 +▁cinquante 1 +▁propriétaire 1 +▁réduit 1 +▁présidence 1 +▁accrue 1 +▁correspond 1 +▁allons 1 +IA 1 +cal 1 +▁chacune 1 +van 1 +▁cap 1 +net 1 +▁inst 1 +▁chiffres 1 +▁Numéro 1 +▁cher 1 +▁bénéficier 1 +▁additionnel 1 +▁vitesse 1 +▁rencontré 1 +▁camp 1 +▁neuf 1 +▁communes 1 +▁lutter 1 +employé 1 +▁Institut 1 +opération 1 +ues 1 +▁destinés 1 +▁nouvel 1 +▁extrêmement 1 +▁posé 1 +▁taxe 1 +▁distance 1 +▁occupé 1 +▁Ha 1 +ndre 1 +▁présentés 1 +▁premières 1 +▁trouvent 1 +▁opérationnel 1 +▁palestinien 1 +exposition 1 +▁mises 1 +▁étape 1 +▁aient 1 +RA 1 +usage 1 +▁conjoint 1 +fect 1 +▁acc 1 +▁adoptées 1 +▁minorités 1 +▁désormais 1 +▁meilleurs 1 +▁bonnes 1 +▁véritable 1 +asp 1 +34 1 +▁père 1 +rique 1 +▁motifs 1 +▁Aux 1 +▁cible 1 +▁Ceci 1 +▁signalé 1 +▁enquêtes 1 +▁perdu 1 +▁largement 1 +main 1 +▁assistance 1 +▁noté 1 +▁spéciales 1 +ili 1 +▁obstacles 1 +Initiative 1 +avance 1 +▁représentation 1 +▁initiale 1 +▁concernés 1 +▁facteur 1 +▁chaîne 1 +▁adopter 1 +▁norme 1 +impose 1 +84 1 +▁préparer 1 +▁associés 1 +37 1 +▁constaté 1 +vision 1 +fic 1 +▁Am 1 +programme 1 +▁pre 1 +NU 1 +▁détaillée 1 +▁traitements 1 +▁rà 1 +▁Oui 1 +51 1 +acquisition 1 +▁rapporteur 1 +▁entend 1 +▁Société 1 +▁huit 1 +▁yeux 1 +▁violations 1 +▁stade 1 +▁crédits 1 +▁encourager 1 +▁Avis 1 +▁erreur 1 +▁accroître 1 +▁devient 1 +mul 1 +▁homme 1 +5) 1 +▁espace 1 +▁auront 1 +▁Cor 1 +44 1 +▁remboursement 1 +▁vaccin 1 +▁qualifié 1 +▁Th 1 +▁dirigeants 1 +▁culturels 1 +pens 1 +ifier 1 +▁bar 1 +▁objet 1 +▁Forum 1 +▁délais 1 +▁religion 1 +avion 1 +49 1 +▁chambres 1 +▁gouvernementaux 1 +▁Trésor 1 +▁sûreté 1 +▁3. 1 +▁collègues 1 +▁em 1 +▁auto 1 +▁thème 1 +▁subi 1 +▁To 1 +32 1 +▁rep 1 +▁climatique 1 +▁applicable 1 +▁forêts 1 +exécut 1 +IL 1 +▁assure 1 +▁frontières 1 +og 1 +▁Chambre 1 +▁34 1 +▁naissance 1 +OL 1 +▁composition 1 +ature 1 +rent 1 +▁envers 1 +43 1 +▁répercussions 1 +hôtel 1 +‐ 1 +▁échanges 1 +▁américaine 1 +gin 1 +engage 1 +els 1 +lis 1 +Bas 1 +▁Affaires 1 +fe 1 +gent 1 +39 1 +▁1991 1 +cy 1 +▁fixe 1 +▁faisons 1 +▁efficacement 1 +mique 1 +inte 1 +parle 1 +▁causé 1 +CO 1 +ric 1 +▁dynamique 1 +▁1999, 1 +▁Port 1 +▁avancé 1 +▁hausse 1 +tan 1 +2) 1 +▁voulons 1 +▁signe 1 +▁IN 1 +▁essais 1 +▁cro 1 +met 1 +gen 1 +évaluer 1 +▁évalué 1 +CA 1 +hér 1 +mètre 1 +▁exclu 1 +▁Toutes 1 +▁démarche 1 +▁amis 1 +▁acteurs 1 +38 1 +we 1 +attache 1 +▁Stratégie 1 +sur 1 +DC 1 +▁appuyer 1 +▁transformation 1 +▁spécifique 1 +▁construit 1 +oll 1 +actif 1 +▁masse 1 +▁chance 1 +éthique 1 +▁ver 1 +▁min 1 +SI 1 +▁carrière 1 +▁déplacement 1 +▁Ab 1 +▁Politique 1 +▁Sh 1 +▁antérieure 1 +PA 1 +▁village 1 +▁africaine 1 +èrent 1 +encontre 1 +▁quatrième 1 +UN 1 +indication 1 +avaient 1 +▁mod 1 +▁textes 1 +▁accordée 1 +ust 1 +▁COM 1 +▁36 1 +▁choisir 1 +phy 1 +▁puissance 1 +▁réserves 1 +intéresse 1 +▁cœur 1 +▁naturel 1 +▁feuille 1 +OC 1 +▁Puis 1 +▁Ri 1 +▁législatif 1 +▁écologique 1 +vin 1 +▁formule 1 +▁déb 1 +embl 1 +Iraq 1 +95 1 +▁entièrement 1 +▁incroyable 1 +▁finale 1 +▁extérieur 1 +CS 1 +ki 1 +ata 1 +▁datée 1 +assi 1 +36 1 +▁réf 1 +-19 1 +▁Amérique 1 +▁arrêté 1 +▁cultures 1 +ED 1 +▁contractant 1 +▁aff 1 +▁servi 1 +▁accordé 1 +▁mont 1 +▁contrats 1 +UL 1 +▁performance 1 +▁télévision 1 +ham 1 +▁internes 1 +▁2005. 1 +▁garantie 1 +▁détails 1 +▁refus 1 +▁garanti 1 +▁Pe 1 +▁interdit 1 +oi 1 +▁km 1 +unité 1 +▁échéant 1 +▁bi 1 +IV 1 +▁atteinte 1 +▁indispensable 1 +▁phénomène 1 +▁Moyen 1 +uré 1 +▁limité 1 +▁chambre 1 +▁formé 1 +élaborer 1 +▁prévus 1 +▁mérite 1 +▁perspective 1 +▁attend 1 +▁sait 1 +▁régulièrement 1 +▁opinion 1 +mm 1 +▁complètement 1 +▁médicaux 1 +▁pension 1 +▁régler 1 +▁invite 1 +▁PE 1 +▁représenté 1 +▁tenant 1 +lais 1 +▁terminé 1 +▁subventions 1 +▁extérieure 1 +ica 1 +▁voiture 1 +immigration 1 +▁étudié 1 +EMENT 1 +rer 1 +▁spéciaux 1 +▁avions 1 +▁vivent 1 +stat 1 +▁adultes 1 +▁séjour 1 +▁75 1 +▁registre 1 +▁ressemble 1 +TS 1 +taire 1 +▁patrimoine 1 +▁électroniques 1 +▁Pendant 1 +▁blanc 1 +ld 1 +▁compagnie 1 +▁augmenter 1 +interprétation 1 +▁brevets 1 +▁budgétaires 1 +▁usage 1 +▁directe 1 +CT 1 +▁pertinents 1 +▁provinciaux 1 +▁destruction 1 +▁fum 1 +▁réception 1 +▁préliminaire 1 +▁pourront 1 +▁travaillent 1 +gro 1 +▁Lorsqu 1 +▁coll 1 +▁Di 1 +duit 1 +▁image 1 +cial 1 +▁sommet 1 +tà 1 +▁développé 1 +.7 1 +64 1 +indépendance 1 +▁Communication 1 +▁Premier 1 +▁conscience 1 +▁établie 1 +▁veulent 1 +enfance 1 +▁Ressources 1 +▁Mexique 1 +éno 1 +▁Man 1 +▁constituer 1 +▁Q 1 +ros 1 +position 1 +ites 1 +▁Go 1 +Asie 1 +gan 1 +ino 1 +ements 1 +▁soumettre 1 +▁transmis 1 +cha 1 +▁37 1 +EP 1 +ides 1 +▁évident 1 +▁gamme 1 +▁paiements 1 +usine 1 +▁plaintes 1 +▁mauvaise 1 +espoir 1 +▁recrutement 1 +▁meilleures 1 +gie 1 +quant 1 +line 1 +▁détermination 1 +65 1 +aw 1 +▁♫ 1 +▁sanctions 1 +comp 1 +▁aérienne 1 +▁arabe 1 +▁culturelle 1 +just 1 +lli 1 +électricité 1 +ulaire 1 +▁Har 1 +▁contribué 1 +abri 1 +▁linguistique 1 +nique 1 +excellent 1 +▁+ 1 +▁rappelle 1 +▁partager 1 +berg 1 +▁mauvais 1 +6) 1 +▁ONG 1 +▁couvert 1 +embr 1 +bit 1 +grad 1 +▁brevet 1 +hor 1 +▁Grand 1 +▁Première 1 +▁appropriées 1 +82 1 +▁Israël 1 +54 1 +85 1 +▁Ga 1 +▁2004. 1 +nat 1 +roule 1 +▁décennie 1 +▁endroits 1 +▁All 1 +▁nation 1 +amine 1 +▁voulez 1 +Irlande 1 +á 1 +▁fera 1 +▁Comp 1 +identité 1 +▁élevés 1 +▁Corée 1 +voi 1 +88 1 +▁client 1 +nom 1 +▁malgré 1 +48 1 +▁vérifier 1 +47 1 +▁présentées 1 +▁officielle 1 +▁climatiques 1 +▁voit 1 +▁prison 1 +▁peur 1 +pol 1 +▁Bu 1 +▁jury 1 +▁biennal 1 +▁Nombre 1 +tée 1 +▁rang 1 +▁effectivement 1 +gel 1 +▁riche 1 +▁convaincu 1 +▁changé 1 +élément 1 +▁prennent 1 +▁consensus 1 +-10 1 +venant 1 +▁corruption 1 +▁lit 1 +▁th 1 +▁Pre 1 +▁découvert 1 +▁établis 1 +▁rural 1 +CH 1 +1, 1 +▁mentale 1 +dite 1 +▁Décision 1 +ave 1 +▁arrivé 1 +har 1 +▁souhait 1 +▁Forces 1 +rog 1 +engager 1 +▁donateurs 1 +▁Pacifique 1 +▁nourriture 1 +▁titulaire 1 +adaptation 1 +▁réalisée 1 +▁tôt 1 +▁individus 1 +▁alimentaires 1 +▁arriver 1 +▁crimes 1 +▁culturelles 1 +▁300 1 +▁Millénaire 1 +▁Parmi 1 +FC 1 +▁associations 1 +▁Manitoba 1 +▁images 1 +▁terroristes 1 +▁documentation 1 +zo 1 +appelle 1 +▁visés 1 +▁pétrole 1 +ost 1 +▁professionnel 1 +2006 1 +▁réellement 1 +opposition 1 +2007 1 +Administration 1 +▁reconnaître 1 +▁préparé 1 +▁facilement 1 +▁électrique 1 +ANT 1 +▁économie 1 +▁visées 1 +▁accident 1 +▁différent 1 +▁rivière 1 +▁Association 1 +nie 1 +toxi 1 +ajout 1 +▁poly 1 +▁ha 1 +▁indépendant 1 +ssez 1 +2005 1 +ster 1 +▁cou 1 +ville 1 +▁Gestion 1 +▁sentiment 1 +▁officiel 1 +▁conc 1 +fl 1 +▁(2) 1 +▁budgétaire 1 +▁souligner 1 +▁viol 1 +▁emplois 1 +▁bénéfice 1 +▁pollution 1 +▁auraient 1 +▁Commissaire 1 +▁partis 1 +igu 1 +▁manifeste 1 +▁requis 1 +2, 1 +▁liaison 1 +▁entrepris 1 +intégrité 1 +▁expériences 1 +▁quartier 1 ++ 1 +▁européennes 1 +her 1 +ze 1 +bas 1 +ook 1 +▁pouvaient 1 +▁séparé 1 +55 1 +▁fabricant 1 +▁rurales 1 +▁dispositif 1 +struct 1 +▁professeur 1 +▁million 1 +▁laisser 1 +▁préoccupé 1 +mor 1 +▁accompli 1 +▁semblable 1 +▁Recherche 1 +▁48 1 +▁Tu 1 +▁culturel 1 +uer 1 +▁dette 1 +▁autorisée 1 +▁séances 1 +ouch 1 +▁impossible 1 +▁rouge 1 +▁38 1 +▁pièce 1 +▁carbone 1 +46 1 +▁2003. 1 +ax 1 +▁conclure 1 +▁indiquer 1 +▁4, 1 +▁foi 1 +▁régi 1 +▁relever 1 +▁répondu 1 +▁outil 1 +▁continent 1 +IG 1 +univers 1 +amour 1 +nées 1 +▁géo 1 +▁Système 1 +▁médicale 1 +▁résumé 1 +ute 1 +▁Ka 1 +▁Exp 1 +sistant 1 +indemnité 1 +▁remplir 1 +▁allant 1 +▁considérer 1 +▁pal 1 +ailleurs 1 +▁vent 1 +▁élu 1 +original 1 +▁possibles 1 +▁tarif 1 +-01 1 +▁PNUD 1 +fin 1 +▁Congo 1 +▁exportations 1 +▁statistique 1 +▁Qui 1 +ott 1 +ble 1 +$ 1 +▁évaluations 1 +▁jeune 1 +▁saisi 1 +▁transmission 1 +▁concentration 1 +▁Information 1 +98 1 +▁Guide 1 +▁cibl 1 +▁gauche 1 +UT 1 +▁pleine 1 +▁porté 1 +▁El 1 +ight 1 +▁division 1 +▁nécessite 1 +ek 1 +▁plénière 1 +▁respectivement 1 +▁notion 1 +GR 1 +▁publications 1 +▁saison 1 +ary 1 +▁criminalité 1 +▁inférieur 1 +ancienne 1 +▁auxquelles 1 +ote 1 +ome 1 +▁juridiction 1 +ann 1 +▁monétaire 1 +▁informatique 1 +RO 1 +▁livres 1 +identification 1 +▁relevant 1 +▁prié 1 +▁Plusieurs 1 +▁Voilà 1 +▁déterminée 1 +▁noter 1 +▁Mont 1 +▁décès 1 +▁Pla 1 +▁tellement 1 +▁constitutionnel 1 +▁Mari 1 +▁exemples 1 +▁mention 1 +▁Aujourd 1 +ina 1 +▁préoccupation 1 +▁fiscale 1 +▁activement 1 +▁scène 1 +ENT 1 +58 1 +emplacement 1 +▁électorale 1 +mit 1 +▁Force 1 +▁axée 1 +▁Sp 1 +▁Turquie 1 +▁étapes 1 +opinion 1 +mie 1 +OMC 1 +MP 1 +▁identifié 1 +▁Sou 1 +▁déployés 1 +▁gestionnaires 1 +▁alinéa 1 +▁42 1 +euro 1 +vention 1 +individu 1 +▁liée 1 +▁augmente 1 +3) 1 +por 1 +céd 1 +▁significative 1 +expliqu 1 +▁libertés 1 +▁44 1 +▁41 1 +▁fondamentales 1 +▁appuie 1 +▁énorme 1 +▁intégral 1 +oud 1 +▁Saskatchewan 1 +za 1 +▁concerné 1 +▁autonome 1 +▁FC 1 +▁crée 1 +écri 1 +▁remise 1 +▁satisfait 1 +▁devront 1 +57 1 +▁affirme 1 +▁char 1 +▁modifiée 1 +▁Personne 1 +▁eau 1 +▁migration 1 +AF 1 +aud 1 +AI 1 +▁raciale 1 +duction 1 +▁capable 1 +▁Tel 1 +tit 1 +▁39 1 +▁hôtel 1 +▁effectuer 1 +▁euro 1 +▁infrastructures 1 +époque 1 +▁précision 1 +▁repose 1 +▁matériaux 1 +tive 1 +WP 1 +▁résidence 1 +59 1 +▁subvention 1 +échelon 1 +▁devaient 1 +Etat 1 +▁prévoir 1 +▁Brésil 1 +▁relevé 1 +▁Total 1 +acc 1 +▁marques 1 +▁financer 1 +▁décider 1 +intermédiaire 1 +▁interventions 1 +42 1 +▁1) 1 +▁forcé 1 +▁utiles 1 +MI 1 +▁différente 1 +63 1 +pre 1 +▁travaillé 1 +▁Ko 1 +ets 1 +▁armés 1 +▁réformes 1 +exception 1 +appelant 1 +ru 1 +▁débats 1 +▁provinciale 1 +aff 1 +▁élargi 1 +▁avantage 1 +▁CC 1 +▁handicapées 1 +arc 1 +prolifération 1 +introduction 1 +▁inf 1 +61 1 +▁appropriée 1 +▁systématique 1 +Allemagne 1 +▁fille 1 +▁étroite 1 +dy 1 +▁garanties 1 +▁naturelle 1 +entretien 1 +acteur 1 +▁observer 1 +▁indépendante 1 +AG 1 +▁2002. 1 +(2) 1 +▁unités 1 +▁heureux 1 +▁individuelle 1 +isées 1 +avez 1 +▁continuent 1 +▁protégé 1 +▁chances 1 +▁comités 1 +▁extra 1 +▁cartes 1 +ico 1 +▁accomplis 1 +uve 1 +occupant 1 +▁distinct 1 +armée 1 +html 1 +▁clé 1 +▁bâtiment 1 +▁obtenus 1 +▁SC 1 +DP 1 +▁assis 1 +attend 1 +gestion 1 +▁pertes 1 +▁constitué 1 +▁profil 1 +▁montrent 1 +▁figurent 1 +▁matin 1 +▁fréquence 1 +▁Droit 1 +rier 1 +▁régimes 1 +▁2006. 1 +▁reconnaît 1 +▁chinois 1 +Inde 1 +▁actuelles 1 +PI 1 +▁vulnérables 1 +▁civil 1 +▁pose 1 +▁fonctionne 1 +▁options 1 +MA 1 +81 1 +▁poser 1 +exprimer 1 +▁appliqué 1 +élé 1 +▁déclare 1 +instrument 1 +▁diminution 1 +Écosse 1 +▁Sch 1 +▁normale 1 +▁biologique 1 +IQUE 1 +▁bis 1 +▁séminaire 1 +▁net 1 +▁es 1 +▁entités 1 +▁investi 1 +▁cru 1 +▁essentiels 1 +contr 1 +▁aime 1 +▁transporteur 1 +▁médecine 1 +agir 1 +by 1 +humanité 1 +▁publicité 1 +incidence 1 +▁tendances 1 +▁enfin 1 +pul 1 +▁esprit 1 +62 1 +nier 1 +▁échange 1 +▁influence 1 +▁menée 1 +▁lire 1 +▁marqué 1 +▁récent 1 +▁faisait 1 +ographie 1 +▁56 1 +▁banques 1 +den 1 +TC 1 +▁apprendre 1 +iti 1 +▁côte 1 +▁95 1 +▁israélien 1 +▁approprié 1 +Atlantique 1 +Alberta 1 +animal 1 +▁Lors 1 +ther 1 +▁migrants 1 +importation 1 +________________ 1 +▁législatives 1 +mobil 1 +cor 1 +ira 1 +▁étudier 1 +▁fréquent 1 +▁CON 1 +éné 1 +Brunswick 1 +▁ajouté 1 +▁mariage 1 +strat 1 +UNICEF 1 +▁IRSC 1 +imposition 1 +▁machine 1 +▁amendements 1 +▁visée 1 +▁claire 1 +/3 1 +▁annonce 1 +lles 1 +▁2) 1 +▁Statistique 1 +RES 1 +▁versé 1 +1) 1 +▁sensible 1 +▁mines 1 +▁éliminer 1 +entente 1 +▁Paris 1 +▁établissement 1 +▁attribué 1 +▁concentrations 1 +▁mettant 1 +▁noir 1 +bor 1 +▁couche 1 +▁dirigé 1 +En 1 +▁spatiale 1 +▁multilatéral 1 +▁mur 1 +▁2008, 1 +▁réglement 1 +▁x 1 +▁LES 1 +ries 1 +▁manuel 1 +aller 1 +▁envisagé 1 +ling 1 +▁économies 1 +▁âgées 1 +université 1 +▁pages 1 +▁adresse 1 +▁donnent 1 +espère 1 +▁poisson 1 +▁Recommandation 1 +DA 1 +▁poissons 1 +▁Dis 1 +amm 1 +▁touchant 1 +atrices 1 +▁destiné 1 +▁Ver 1 +▁affaire 1 +▁tourisme 1 +▁Table 1 +adopter 1 +▁intéressés 1 +▁proactive 1 +▁suffisante 1 +▁existant 1 +▁partagé 1 +▁volet 1 +▁calendrier 1 +▁Grande 1 +▁restrictions 1 +▁examine 1 +MD 1 +▁combien 1 +avec 1 +ayant 1 +52 1 +▁multiples 1 +▁négociation 1 +▁administratif 1 +▁domin 1 +▁Kosovo 1 +▁Ph 1 +▁combat 1 +56 1 +▁fallait 1 +▁robot 1 +▁Deux 1 +▁lourd 1 +temp 1 +▁spécialistes 1 +bu 1 +▁PA 1 +▁Divulgation 1 +▁proposée 1 +▁située 1 +▁individuel 1 +▁conduit 1 +▁confirmé 1 +environnementaux 1 +▁âge 1 +Internet 1 +▁présentent 1 +▁adéquate 1 +-02 1 +▁puissant 1 +own 1 +▁Paragraphe 1 +▁limiter 1 +▁destinées 1 +gique 1 +▁virus 1 +accroître 1 +▁suffisant 1 +▁Quelle 1 +▁plaignant 1 +▁médecins 1 +▁pacifique 1 +édition 1 +▁concernées 1 +▁retrait 1 +▁Développement 1 +▁décide 1 +honorable 1 +▁complexes 1 +af 1 +▁existants 1 +▁varie 1 +lage 1 +▁revêt 1 +alcool 1 +▁majeure 1 +-03 1 +▁chercher 1 +instruction 1 +matique 1 +▁remercier 1 +▁PRO 1 +▁mène 1 +président 1 +île 1 +▁explique 1 +▁reflète 1 +▁Suisse 1 +▁croire 1 +▁dispens 1 +iennes 1 +▁Toute 1 +▁sert 1 +▁prochaines 1 +▁objets 1 +▁autorisation 1 +▁plu 1 +view 1 +intéressé 1 +▁communs 1 +▁2007. 1 +▁Vo 1 +▁valoir 1 +▁Autochtones 1 +▁personnelle 1 +MC 1 +▁réussite 1 +▁Act 1 +▁continuera 1 +alis 1 +bar 1 +▁utilisent 1 +▁ministérielle 1 +▁enseignants 1 +▁be 1 +▁Inde 1 +iel 1 +▁parlementaire 1 +ouest 1 +▁introduit 1 +▁incombe 1 +▁85 1 +▁satellite 1 +▁accompagné 1 +▁navires 1 +FI 1 +▁remplacé 1 +▁National 1 +entreprises 1 +▁second 1 +▁réparti 1 +ense 1 +▁mètres 1 +audit 1 +▁photos 1 +▁établies 1 +▁Inter 1 +▁médecin 1 +▁prestataire 1 +▁variation 1 +▁neuro 1 +▁renvoi 1 +▁exactement 1 +▁parlé 1 +▁télécommunicat 1 +bin 1 +▁évolution 1 +▁Dieu 1 +LA 1 +cou 1 +▁tiendra 1 +mission 1 +▁Mal 1 +.9 1 +▁effective 1 +▁classification 1 +▁destination 1 +▁sort 1 +ajustement 1 +▁émis 1 +inscrire 1 +▁récente 1 +venir 1 +í 1 +octroi 1 +▁Ann 1 +▁mini 1 +▁disent 1 +-11 1 +▁admissibles 1 +lie 1 +▁actifs 1 +ps 1 +▁prescrit 1 +pho 1 +▁intitulée 1 +uvre 1 +53 1 +TR 1 +▁Dépenses 1 +▁allez 1 +horizon 1 +▁institution 1 +▁Hu 1 +▁acquis 1 +▁2000. 1 +▁conventions 1 +▁Vancouver 1 +Neuve 1 +QU 1 +▁découlant 1 +▁Salle 1 +▁désigne 1 +▁mémoire 1 +▁conscient 1 +ménage 1 +▁oui 1 +pha 1 +lat 1 +▁plantes 1 +Euro 1 +▁importations 1 +▁1998, 1 +isent 1 +▁énergie 1 +▁centaines 1 +incident 1 +los 1 +▁soulevé 1 +▁Suède 1 +▁sortir 1 +▁intérieure 1 +▁mesurer 1 +gène 1 +▁britannique 1 +.1) 1 +adapter 1 +▁bénéficiaires 1 +▁San 1 +▁NO 1 +▁contrôler 1 +▁défaut 1 +▁bourse 1 +▁dehors 1 +▁pat 1 +euros 1 +▁perspectives 1 +aimerais 1 +▁actuels 1 +▁variable 1 +▁échelle 1 +▁offerts 1 +▁écrite 1 +▁drogue 1 +▁signal 1 +▁dimension 1 +▁contribue 1 +Iran 1 +▁frontière 1 +▁sang 1 +▁Ta 1 +▁(2 1 +▁mondialisation 1 +▁fortement 1 +▁requête 1 +▁incidences 1 +exclusion 1 +▁caractéris 1 +▁Entre 1 +▁dois 1 +▁design 1 +acquitter 1 +▁maximale 1 +▁regarder 1 +▁satisfaire 1 +▁soir 1 +▁Bi 1 +▁expliquer 1 +▁remplacer 1 +fer 1 +▁lac 1 +▁couverture 1 +DR 1 +▁juges 1 +▁jugement 1 +▁2001. 1 +▁chômage 1 +▁43 1 +▁mineurs 1 +▁Ltd 1 +apport 1 +▁rejeté 1 +▁intention 1 +▁résolu 1 +▁appareils 1 +▁Madame 1 +▁comparaison 1 +▁empêcher 1 +▁légale 1 +▁nourri 1 +LI 1 +cho 1 +▁entrée 1 +mettre 1 +▁états 1 +▁mus 1 +▁effectuée 1 +▁rappeler 1 +▁détaillé 1 +vari 1 +▁administrative 1 +▁soumission 1 +▁américain 1 +▁relié 1 +▁49 1 +nch 1 +▁sondage 1 +ordinateur 1 +▁fils 1 +▁consentement 1 +och 1 +▁terrestre 1 +▁existantes 1 +OS 1 +atives 1 +▁recueilli 1 +▁Gra 1 +▁portent 1 +▁65 1 +Prince 1 +▁quotidienne 1 +▁400 1 +▁banque 1 +▁Lo 1 +▁consacrée 1 +▁tradition 1 +▁substance 1 +ull 1 +▁commissions 1 +opportunité 1 +▁possède 1 +▁montants 1 +▁profonde 1 +océan 1 +▁rem 1 +▁tarifaire 1 +▁Tra 1 +▁patient 1 +lée 1 +aison 1 +▁religieuse 1 +▁joué 1 +fond 1 +▁mortalité 1 +▁devoir 1 +▁remercie 1 +ish 1 +▁notification 1 +▁IV 1 +Le 1 +▁détenus 1 +▁futures 1 +▁instamment 1 +eng 1 +▁précisément 1 +▁Certaines 1 +▁conserver 1 +▁universités 1 +honneur 1 +▁Val 1 +éviter 1 +▁majeur 1 +▁Téléphone 1 +VI 1 +▁dommages 1 +** 1 +index 1 +allocation 1 +équilibre 1 +Étant 1 +itude 1 +▁traditionnels 1 +▁Défense 1 +▁humanitaires 1 +▁similaires 1 +▁54 1 +▁fou 1 +termin 1 +▁préjudice 1 +▁souci 1 +▁flux 1 +hiver 1 +nez 1 +ting 1 +▁facultatif 1 +▁technologique 1 +▁recon 1 +▁compétentes 1 +BC 1 +II 1 +gard 1 +vel 1 +oxy 1 +▁doté 1 +▁ami 1 +équ 1 +arriv 1 +▁web 1 +▁confi 1 +▁58 1 +▁préciser 1 +▁Mesures 1 +▁équipes 1 +▁Nom 1 +occupation 1 +▁effectuées 1 +écran 1 +bert 1 +▁acceptable 1 +▁CEE 1 +▁PME 1 +▁esp 1 +▁57 1 +▁ten 1 +▁dépasse 1 +▁Jean 1 +▁MA 1 +ombre 1 +▁ministériel 1 +-12 1 +▁district 1 +▁lecture 1 +uk 1 +▁vite 1 +▁fondamentale 1 +ange 1 +▁territoriale 1 +utilisateur 1 +▁Pi 1 +éni 1 +▁susmentionné 1 +▁crucial 1 +▁RÉ 1 +▁stable 1 +▁lié 1 +hypothèse 1 +sixième 1 +7) 1 +▁Environnement 1 +▁(613) 1 +doc 1 +▁proposées 1 +▁Examen 1 +▁Im 1 +illage 1 +exemple 1 +▁menaces 1 +▁stocks 1 +▁seuls 1 +Al 1 +▁théorie 1 +▁CI 1 +▁volontaire 1 +américain 1 +▁conformes 1 +▁quelles 1 +▁municipalité 1 +▁classé 1 +arrière 1 +▁Allemagne 1 +élève 1 +▁tabac 1 +▁Ru 1 +bel 1 +▁totalement 1 +▁résulte 1 +▁directeurs 1 +▁Rappelant 1 +▁report 1 +▁légitime 1 +ADN 1 +▁indiquent 1 +▁parallèle 1 +▁confronté 1 +▁Télé 1 +▁visent 1 +▁veuillez 1 +▁essayer 1 +▁particulières 1 +voqu 1 +▁grain 1 +tain 1 +SR 1 +▁participent 1 +▁morale 1 +étique 1 +▁voies 1 +▁programmation 1 +▁collection 1 +▁causes 1 +▁nationalité 1 +-5 1 +▁cotisation 1 +équité 1 +▁répondants 1 +▁illégale 1 +▁fini 1 +▁renouvelable 1 +occuper 1 +▁succ 1 +▁Veuillez 1 +▁rédaction 1 +▁Cap 1 +active 1 +▁ventes 1 +▁gain 1 +office 1 +chet 1 +▁finances 1 +▁officiels 1 +▁énoncés 1 +▁revue 1 +3/ 1 +▁classique 1 +▁américains 1 +▁requises 1 +AIRE 1 +▁Présidente 1 +▁Sol 1 +▁vendu 1 +Ukraine 1 +▁axé 1 +▁entière 1 +tom 1 +▁Grâce 1 +atteindre 1 +▁lettres 1 +▁consolidation 1 +▁dispositifs 1 +▁Mise 1 +▁inclure 1 +▁Lettre 1 +▁lancer 1 +ii 1 +gh 1 +OI 1 +fait 1 +▁étrangère 1 +2004 1 +▁preuves 1 +poli 1 +▁rendue 1 +avantage 1 +▁anciens 1 +▁truc 1 +▁écart 1 +▁puisqu 1 +▁gratuit 1 +▁finalement 1 +▁équivalent 1 +abandon 1 +éral 1 +▁discuter 1 +▁initial 1 +▁précisé 1 +▁four 1 +▁présentes 1 +▁ultérieure 1 +expert 1 +▁connais 1 +▁livraison 1 +▁remplacement 1 +fact 1 +▁appelée 1 +lla 1 +▁habitants 1 +OM 1 +▁française 1 +mont 1 +▁bons 1 +iciens 1 +▁my 1 +▁Sal 1 +enregistr 1 +exigence 1 +nait 1 +▁appartenant 1 +▁radiodiffusion 1 +expansion 1 +▁questionnaire 1 +▁révisé 1 +▁préserver 1 +acier 1 +▁sanitaire 1 +.8 1 +class 1 +▁59 1 +▁placement 1 +▁courriel 1 +▁53 1 +▁semblent 1 +gramme 1 +▁te 1 +essaye 1 +▁Eh 1 +PT 1 +▁ratification 1 +mment 1 +lot 1 +▁formulées 1 +▁VI 1 +▁réparation 1 +▁répét 1 +extrême 1 +▁droite 1 +▁découvrir 1 +▁calculé 1 +▁incidence 1 +La 1 +▁Ge 1 +▁ii 1 +▁voilà 1 +▁essentielle 1 +▁combattre 1 +▁passant 1 +aménagement 1 +▁survie 1 +▁bases 1 +iller 1 +culaire 1 +ibilité 1 +ION 1 +FP 1 +▁viennent 1 +wi 1 +▁créée 1 +▁devenue 1 +▁continué 1 +▁bu 1 +▁catastrophes 1 +▁voulais 1 +▁pont 1 +ada 1 +▁reçues 1 +▁mobile 1 +flu 1 +▁mor 1 +▁dangereux 1 +▁espèce 1 +UM 1 +AUX 1 +▁révélé 1 +entend 1 +▁agir 1 +▁encouragé 1 +tien 1 +abilis 1 +▁allemand 1 +▁disposer 1 +▁chaud 1 +ampleur 1 +▁Liens 1 +septième 1 +▁députés 1 +immeuble 1 +▁négatif 1 +▁Région 1 +▁exercer 1 +▁disponibilité 1 +▁mélange 1 +[ 1 +aucune 1 +▁carburant 1 +▁discours 1 +▁47 1 +organisations 1 +lev 1 +▁seuil 1 +▁standard 1 +▁constitution 1 +▁bancaire 1 +angle 1 +▁définitive 1 +▁isolé 1 +▁montagne 1 +▁distinction 1 +▁médical 1 +batt 1 +pré 1 +▁ti 1 +▁entendre 1 +▁touche 1 +▁profiter 1 +▁progress 1 +hal 1 +▁Rec 1 +▁racisme 1 +asile 1 +pond 1 +▁Page 1 +occupe 1 +▁Nos 1 +▁Can 1 +▁garder 1 +▁préparatoire 1 +▁distribué 1 +▁inférieure 1 +tabli 1 +▁biologiques 1 +▁expériment 1 +▁privés 1 +▁productivité 1 +effort 1 +▁ref 1 +▁CD 1 +▁obligation 1 +ologiques 1 +illon 1 +▁résistance 1 +bat 1 +▁former 1 +▁bibliothèque 1 +▁exposition 1 +▁PIB 1 +▁Liste 1 +▁fondamental 1 +▁devrions 1 +▁bleu 1 +▁transparent 1 +perfectionnement 1 +EX 1 +▁avancés 1 +▁chiffre 1 +publi 1 +▁61 1 +▁thèmes 1 +bol 1 +▁US 1 +▁accessible 1 +▁entente 1 +attribution 1 +miné 1 +▁accorder 1 +▁approfondie 1 +ator 1 +▁Caraïbes 1 +▁insuffisant 1 +▁Organisation 1 +▁motif 1 +▁tests 1 +.10 1 +ITÉ 1 +▁restaurant 1 +TÉ 1 +▁jeunesse 1 +fu 1 +/4 1 +ié 1 +▁correct 1 +CEE 1 +viv 1 +▁découverte 1 +▁contrôlé 1 +▁dose 1 +▁poursuivi 1 +▁prenant 1 +▁pensé 1 +▁ronde 1 +▁emp 1 +▁Site 1 +▁mouvements 1 +▁spécialisées 1 +▁46 1 +▁ru 1 +▁considérés 1 +▁Budget 1 +vier 1 +▁ajouter 1 +▁implique 1 +................ 1 +▁Min 1 +▁Yukon 1 +▁Bosnie 1 +élargissement 1 +2008 1 +FR 1 +gal 1 +▁offrent 1 +▁milieux 1 +▁04 1 +▁constante 1 +▁pousse 1 +▁proposer 1 +▁Justice 1 +▁respecté 1 +▁mutuelle 1 +▁déposée 1 +▁exposés 1 +▁infractions 1 +▁domicile 1 +offrir 1 +▁tonnes 1 +▁soldats 1 +▁visé 1 +▁effectués 1 +▁retenue 1 +press 1 +▁moindre 1 +ini 1 +▁capitale 1 +▁exécuté 1 +-6 1 +▁exception 1 +▁époque 1 +indice 1 +): 1 +appuyer 1 +▁témoins 1 +aéroport 1 +▁tir 1 +bour 1 +▁Chapitre 1 +▁applications 1 +▁dà 1 +▁pensons 1 +▁envisage 1 +▁teneur 1 +▁irr 1 +▁1987 1 +▁saisie 1 +▁prioritaires 1 +▁Fi 1 +▁islamique 1 +hr 1 +▁profession 1 +▁contribuent 1 +▁prétend 1 +▁assujetti 1 +▁1989 1 +Île 1 +LO 1 +▁positif 1 +È 1 +▁Prie 1 +▁Afghanistan 1 +▁appuyé 1 +▁1997, 1 +harmonisation 1 +▁vérité 1 +▁auparavant 1 +jour 1 +nage 1 +ndra 1 +▁SO 1 +ung 1 +▁abouti 1 +VE 1 +aujourd 1 +▁universelle 1 +8) 1 +qua 1 +▁visible 1 +▁espagnol 1 +ado 1 +▁Transports 1 +électro 1 +▁informer 1 +▁gagner 1 +▁Réseau 1 +▁noms 1 +vol 1 +bout 1 +▁réflexion 1 +▁entraîne 1 +▁industries 1 +▁exigé 1 +▁faudra 1 +▁soixante 1 +▁pri 1 +▁99 1 +▁judiciaires 1 +huitième 1 +▁Alberta 1 +▁négative 1 +▁intéressées 1 +ivité 1 +▁organis 1 +éco 1 +▁résultant 1 +exploit 1 +▁constate 1 +▁versement 1 +neuvième 1 +▁réservé 1 +▁latine 1 +▁régulière 1 +▁Aide 1 +▁Wi 1 +cell 1 +▁tiens 1 +▁fournissent 1 +▁administrations 1 +▁GR 1 +▁77 1 +ancien 1 +▁russe 1 +▁bassin 1 +oux 1 +▁réclamation 1 +▁privées 1 +▁compose 1 +▁réglementaires 1 +IB 1 +▁CR 1 +▁institutionnels 1 +▁habituellement 1 +▁provenance 1 +▁froid 1 +▁Cuba 1 +▁Version 1 +où 1 +text 1 +▁restent 1 +▁traditionnelles 1 +2003 1 +mination 1 +▁prévisions 1 +▁fiable 1 +▁verre 1 +▁fichier 1 +connect 1 +▁essentielles 1 +OIT 1 +onde 1 +▁variété 1 +▁estimations 1 +▁minimale 1 +AV 1 +▁indi 1 +étendre 1 +▁regroupe 1 +▁apport 1 +▁Objectif 1 +▁fondement 1 +▁médicament 1 +▁physiques 1 +▁agent 1 +▁couvre 1 +anne 1 +▁coordonner 1 +▁invités 1 +▁52 1 +▁capitaux 1 +▁définis 1 +▁marge 1 +▁rassemble 1 +▁51 1 +▁énoncées 1 +▁perçu 1 +▁constater 1 +▁chasse 1 +▁volontaires 1 +▁marine 1 +▁enjeux 1 +rég 1 +vironnementale 1 +▁fournies 1 +▁sortie 1 +GE 1 +▁David 1 +▁vice 1 +▁favorise 1 +▁abus 1 +▁récentes 1 +▁1996, 1 +architecture 1 +▁suprême 1 +▁fusion 1 +gation 1 +▁Archives 1 +▁Norvège 1 +▁compétitivité 1 +Équipe 1 +▁mettent 1 +NC 1 +▁Asie 1 +▁histoires 1 +▁néanmoins 1 +▁glace 1 +▁inscrits 1 +▁impliqué 1 +▁rêve 1 +dor 1 +▁concrètes 1 +ministre 1 +▁sexuel 1 +▁formulé 1 +écart 1 +hu 1 +autonomie 1 +▁consomm 1 +rions 1 +▁Health 1 +explication 1 +▁soutient 1 +êt 1 +▁plaisir 1 +années 1 +▁franc 1 +▁chargés 1 +accompagne 1 +▁municipal 1 +indicateur 1 +▁PDF 1 +▁migr 1 +prend 1 +aliser 1 +▁nette 1 +▁Cadre 1 +clé 1 +axe 1 +▁orientations 1 +▁déterminant 1 +▁foyer 1 +▁Assemblée 1 +▁Mac 1 +▁1988 1 +▁déploiement 1 +cip 1 +▁condamné 1 +▁quels 1 +▁maîtrise 1 +ny 1 +▁indépendants 1 +actuel 1 +▁diminué 1 +▁Trans 1 +udi 1 +▁dangereuses 1 +▁suppose 1 +▁exercé 1 +▁fournisseur 1 +▁démontré 1 +▁département 1 +▁exact 1 +▁difficiles 1 +▁permettrait 1 +▁administratifs 1 +▁compromis 1 +▁futurs 1 +▁actif 1 +▁mentionne 1 +▁secret 1 +▁douanes 1 +Les 1 +▁donn 1 +▁envisager 1 +▁psycho 1 +▁évidence 1 +lique 1 +▁logique 1 +▁bénévole 1 +▁Paul 1 +▁développés 1 +▁capables 1 +▁traduit 1 +gg 1 +kin 1 +expertise 1 +agence 1 +▁Industrie 1 +« 1 +▁rat 1 +▁Courriel 1 +▁intermédiaire 1 +▁révolution 1 +-04 1 +▁autochtone 1 +-05 1 +▁transmettre 1 +▁mesuré 1 +▁150 1 +▁bébé 1 +▁reproduction 1 +▁clinique 1 +▁accru 1 +élev 1 +▁Journal 1 +pér 1 +▁absolument 1 +▁pur 1 +1/ 1 +▁surveiller 1 +▁célébr 1 +▁joint 1 +accroissement 1 +▁` 1 +arité 1 +▁derrière 1 +▁leadership 1 +joint 1 +▁voisins 1 +▁régissant 1 +▁transféré 1 +▁Fondation 1 +▁certainement 1 +Ar 1 +▁composant 1 +uy 1 +ALE 1 +▁intelligent 1 +▁reconstruction 1 +▁étroitement 1 +▁énoncé 1 +bul 1 +ker 1 +▁SUR 1 +▁coordonnée 1 +▁CH 1 +endroit 1 +Labrador 1 +disciplinaire 1 +▁régulier 1 +▁Soudan 1 +▁location 1 +▁visiteurs 1 +apporter 1 +▁accepter 1 +EI 1 +▁reçoivent 1 +▁solidarité 1 +▁identique 1 +▁88 1 +Environnement 1 +▁messages 1 +▁vir 1 +▁reçoit 1 +▁file 1 +▁chaleur 1 +▁Aucune 1 +▁égale 1 +▁Canadian 1 +▁importé 1 +▁800 1 +oï 1 +▁bâtiments 1 +▁dépense 1 +▁Environ 1 +▁délivré 1 +▁urgent 1 +▁Source 1 +mber 1 +▁adolescents 1 +▁couvrir 1 +▁combustible 1 +▁repos 1 +top 1 +aime 1 +▁Art 1 +attente 1 +▁consulté 1 +▁opportun 1 +▁intérimaire 1 +pin 1 +▁2004-2005 1 +▁décret 1 +▁Renseignements 1 +▁prête 1 +▁sauvage 1 +▁descend 1 +▁normalement 1 +Autriche 1 +▁effort 1 +affirm 1 +algré 1 +▁provincial 1 +▁cliniques 1 +atmosphère 1 +▁remarquable 1 +▁Évaluation 1 +homo 1 +▁criminel 1 +▁candidature 1 +asso 1 +▁opérationnelles 1 +TO 1 +▁forum 1 +▁machines 1 +▁voyages 1 +▁ethnique 1 +▁basé 1 +way 1 +▁Vienne 1 +vert 1 +▁normal 1 +lang 1 +▁uniforme 1 +iale 1 +▁employeurs 1 +ski 1 +▁Résolution 1 +▁libération 1 +▁regardez 1 +▁supérieurs 1 +▁géré 1 +▁associé 1 +/5 1 +▁industriel 1 +▁phrase 1 +▁installé 1 +labor 1 +▁Questions 1 +▁armées 1 +▁combinaison 1 +▁spécialisé 1 +▁02 1 +▁apportées 1 +▁conjointe 1 +▁indiquant 1 +▁intervention 1 +▁concevoir 1 +▁partenaire 1 +▁PAR 1 +-06 1 +▁quelconque 1 +▁lancement 1 +▁éventuelle 1 +▁statu 1 +▁sérieux 1 +hir 1 +▁proximité 1 +leur 1 +▁duquel 1 +▁belle 1 +arra 1 +NI 1 +▁probable 1 +gré 1 +important 1 +TRE 1 +▁mg 1 +5/ 1 +TER 1 +▁étranger 1 +▁pourtant 1 +▁expliqué 1 +▁difficulté 1 +agisse 1 +▁Troisième 1 +▁Jan 1 +▁concentrer 1 +▁africains 1 +▁admissible 1 +▁réglementaire 1 +▁solde 1 +EE 1 +▁blessure 1 +▁bilatéral 1 +▁mains 1 +▁tissus 1 +▁opération 1 +▁concernent 1 +▁faibles 1 +▁ter 1 +▁adopte 1 +▁mixte 1 +the 1 +gon 1 +▁îles 1 +▁ferroviaire 1 +▁Canadiennes 1 +▁tension 1 +▁bloc 1 +OD 1 +▁secours 1 +cre 1 +9) 1 +ède 1 +▁Pakistan 1 +▁rythme 1 +icule 1 +old 1 +Herzégovine 1 +▁délégué 1 +▁améliorations 1 +▁laissé 1 +mili 1 +▁institutionnel 1 +graph 1 +▁organe 1 +▁kilomètres 1 +échapp 1 +▁EX 1 +effectuer 1 +▁Pri 1 +▁formuler 1 +dans 1 +▁Ensuite 1 +▁trente 1 +▁imposé 1 +▁unité 1 +▁retrouve 1 +rise 1 +FA 1 +▁mondiaux 1 +▁graphique 1 +échec 1 +▁conjointement 1 +appliqu 1 +▁satisfaisant 1 +▁existent 1 +ART 1 +▁basée 1 +prouv 1 +▁diplomatique 1 +considérablement 1 +▁abordé 1 +habitude 1 +▁traduction 1 +aucun 1 +▁discipline 1 +▁secrétaire 1 +▁instructions 1 +écoute 1 +▁Roumanie 1 +▁analyses 1 +▁clause 1 +▁voyons 1 +ding 1 +▁artistes 1 +Ch 1 +riez 1 +ning 1 +▁parlementaires 1 +▁PC 1 +lam 1 +Québec 1 +▁complémentaires 1 +ö 1 +▁lacunes 1 +▁Parcs 1 +king 1 +▁équipé 1 +▁sollicit 1 +▁présentant 1 +ouvrage 1 +▁stress 1 +▁souhaitent 1 +▁prescriptions 1 +▁achevé 1 +▁voitures 1 +emballage 1 +▁lâ 1 +▁traditionnelle 1 +▁victime 1 +▁University 1 +▁navigation 1 +▁influ 1 +▁entraîner 1 +▁organique 1 +organismes 1 +OCDE 1 +▁forêt 1 +▁perd 1 +▁Chef 1 +▁jeux 1 +▁passion 1 +▁licences 1 +▁MIN 1 +èse 1 +▁accessibles 1 +charge 1 +▁pire 1 +▁indu 1 +▁connue 1 +ologique 1 +▁dessus 1 +infection 1 +nière 1 +▁appropriés 1 +estimation 1 +épreuve 1 +▁pensez 1 +▁complexité 1 +▁ordonnance 1 +▁historiques 1 +▁approuvée 1 +▁soin 1 +attaque 1 +▁potentielle 1 +▁Belgique 1 +▁contribuable 1 +▁issus 1 +▁mm 1 +▁logistique 1 +▁massive 1 +ità 1 +▁réfléchir 1 +▁fonctionner 1 +▁gouverneur 1 +▁rappelé 1 +▁accueilli 1 +▁Autre 1 +▁2006-2007 1 +▁rapportant 1 +▁infraction 1 +bus 1 +▁Proposition 1 +▁milliard 1 +logique 1 +▁croissante 1 +▁bilan 1 +gué 1 +▁compagnies 1 +▁fournie 1 +▁liquide 1 +▁cuisine 1 +▁ancien 1 +▁cinquième 1 +▁suivent 1 +▁attentes 1 +acquérir 1 +▁perception 1 +mir 1 +▁révisée 1 +▁autrement 1 +▁anniversaire 1 +uri 1 +▁bactérie 1 +NO 1 +▁Robert 1 +▁modes 1 +▁âgés 1 +▁recueillir 1 +▁approuve 1 +▁allégations 1 +TP 1 +▁dûment 1 +▁Pol 1 +▁identifier 1 +▁Grèce 1 +▁avenir 1 +▁Peut 1 +entreprendre 1 +firm 1 +▁Lu 1 +▁ajoutée 1 +▁socio 1 +hôpital 1 +▁particules 1 +éclair 1 +GI 1 +▁visage 1 +▁intégrer 1 +place 1 +▁arabes 1 +OMS 1 +▁Nor 1 +ARC 1 +SG 1 +▁ateliers 1 +ima 1 +▁musée 1 +▁éventuel 1 +▁paramètres 1 +▁TED 1 +▁maintenu 1 +▁idéal 1 +▁Commerce 1 +▁équipements 1 +▁Italie 1 +▁Congrès 1 +▁Em 1 +▁personnelles 1 +▁Pologne 1 +aptitude 1 +indique 1 +▁allait 1 +▁collaborer 1 +éch 1 +▁appliquée 1 +▁hauteur 1 +Australie 1 +étend 1 +▁Vice 1 +▁pensent 1 +▁apporte 1 +▁franchi 1 +▁fondées 1 +TRA 1 +▁Siège 1 +▁établit 1 +▁industriels 1 +loi 1 +▁pensions 1 +▁fonctionnaire 1 +-8 1 +arch 1 +▁tchèque 1 +▁aspect 1 +IST 1 +▁permettront 1 +▁transactions 1 +product 1 +▁taxes 1 +▁Justification 1 +▁passagers 1 +▁potentiels 1 +▁éventail 1 +▁protéine 1 +▁transit 1 +▁connaît 1 +▁totalité 1 +▁nécessairement 1 +atelier 1 +BI 1 +major 1 +▁plate 1 +▁revenir 1 +▁Directive 1 +▁appliquées 1 +▁heure 1 +▁250 1 +▁Aucun 1 +▁600 1 +avère 1 +▁Tri 1 +▁pensée 1 +▁serre 1 +métrique 1 +▁bras 1 +▁Patrimoine 1 +▁coopérer 1 +▁entraîné 1 +▁diffusé 1 +▁litige 1 +itt 1 +▁barre 1 +ût 1 +indemnisation 1 +▁ST 1 +▁admis 1 +▁remarquer 1 +▁jouent 1 +▁regarde 1 +▁ententes 1 +▁Sans 1 +▁bulletin 1 +rice 1 +▁manifestations 1 +Franc 1 +▁renseignement 1 +▁Finlande 1 +sident 1 +lt 1 +issi 1 +▁transformer 1 +▁mobilité 1 +nit 1 +▁susceptible 1 +▁handicapés 1 +▁travaillant 1 +▁Université 1 +▁orale 1 +hum 1 +▁dimensions 1 +▁solaire 1 +▁compens 1 +▁résidents 1 +▁aidé 1 +▁cote 1 +tout 1 +République 1 +▁North 1 +▁dommage 1 +▁Beaucoup 1 +▁amples 1 +▁Cha 1 +2002 1 +▁différends 1 +entrepreneur 1 +▁naturels 1 +pend 1 +▁démographique 1 +MENT 1 +▁formulation 1 +▁combiné 1 +point 1 +étudier 1 +▁fixée 1 +▁parfait 1 +mod 1 +▁viable 1 +▁contingent 1 +▁colonne 1 +▁64 1 +ouille 1 +▁titulaires 1 +▁Protection 1 +▁expressément 1 +▁Activités 1 +▁longueur 1 +inquiétude 1 +▁détenu 1 +▁branche 1 +▁imagin 1 +▁défend 1 +▁fruits 1 +oyez 1 +▁délinquant 1 +▁module 1 +ash 1 +logie 1 +omique 1 +▁Mor 1 +▁with 1 +égo 1 +▁francophone 1 +▁oiseaux 1 +▁échantillons 1 +▁suggère 1 +▁accusé 1 +automne 1 +▁associée 1 +▁déplacées 1 +organe 1 +étendue 1 +▁fichiers 1 +pharmaceutique 1 +▁paraît 1 +comme 1 +▁engagés 1 +▁reli 1 +▁servent 1 +▁cité 1 +▁rubrique 1 +attaquer 1 +inventaire 1 +ommercialisation 1 +▁équilibre 1 +▁situe 1 +▁62 1 +▁adéquat 1 +▁fier 1 +rio 1 +ü 1 +▁disposent 1 +▁imm 1 +▁courante 1 +Ex 1 +acide 1 +▁Char 1 +Con 1 +▁compétents 1 +▁tentative 1 +▁soleil 1 +présent 1 +▁remettre 1 +mère 1 +▁scrutin 1 +▁superficie 1 +▁artistique 1 +▁débit 1 +▁technologiques 1 +Bretagne 1 +▁cohérence 1 +▁composantes 1 +Italie 1 +▁Timor 1 +▁?" 1 +▁remédier 1 +midi 1 +▁revendication 1 +▁effectifs 1 +▁Lake 1 +▁complément 1 +ual 1 +▁Liban 1 +▁veille 1 +▁affirmé 1 +▁savent 1 +▁01 1 +▁témoigne 1 +▁Christ 1 +▁frein 1 +▁AU 1 +▁universel 1 +▁dépit 1 +▁rechange 1 +argument 1 +▁Fin 1 +▁positifs 1 +▁obstacle 1 +▁collectif 1 +▁exemplaires 1 +III 1 +▁from 1 +influence 1 +▁étendu 1 +▁fabriqué 1 +▁voulait 1 +▁tiennent 1 +▁PCT 1 +▁résident 1 +▁63 1 +▁affiche 1 +▁1980 1 +▁révèle 1 +▁océans 1 +▁opérationnelle 1 +graphe 1 +▁comprenant 1 +▁2002-2003 1 +pour 1 +▁donnant 1 +▁navire 1 +illant 1 +▁voisin 1 +▁stockage 1 +▁ethniques 1 +▁correctement 1 +▁exempt 1 +pdf 1 +érée 1 +▁universitaires 1 +2000 1 +▁offrant 1 +étape 1 +▁composante 1 +assembl 1 +▁réputé 1 +▁renforcé 1 +▁Ki 1 +▁Deuxième 1 +opéra 1 +Égypte 1 +tter 1 +▁langage 1 +▁valable 1 +time 1 +accélérer 1 +vir 1 +Votre 1 +invention 1 +▁associées 1 +▁similaire 1 +▁1985 1 +▁démontre 1 +▁entretien 1 +▁ton 1 +▁conduire 1 +▁représenter 1 +homologation 1 +▁Néanmoins 1 +▁boîte 1 +▁rétro 1 +▁externes 1 +▁peau 1 +▁fiscal 1 +▁diffuser 1 +acqu 1 +rand 1 +▁amélioré 1 +▁automobile 1 +cup 1 +fort 1 +encourager 1 +▁bénéficient 1 +▁produisent 1 +▁restreint 1 +▁billet 1 +▁coordonn 1 +▁critère 1 +▁essayé 1 +▁thématique 1 +tine 1 +▁autorité 1 +▁Outre 1 +▁coin 1 +anglais 1 +.2.1 1 +▁bénéficiaire 1 +stitution 1 +▁chronique 1 +▁amélioration 1 +▁attendu 1 +▁monnaie 1 +▁option 1 +▁exclusivement 1 +▁mut 1 +agissait 1 +▁Musée 1 +▁ratifié 1 +▁attitude 1 +▁qualification 1 +▁remarque 1 +▁Statut 1 +▁reconnue 1 +excellence 1 +▁Bruxelles 1 +▁aperçu 1 +▁scénario 1 +▁déficit 1 +▁rétablissement 1 +▁réduite 1 +▁spécialisés 1 +2001 1 +▁TPS 1 +▁° 1 +▁recensement 1 +▁by 1 +▁renouvellement 1 +▁préférence 1 +page 1 +▁violent 1 +▁0,0 1 +▁compétente 1 +▁tableaux 1 +▁désignée 1 +▁style 1 +▁Adoption 1 +▁progresser 1 +▁interprétation 1 +estime 1 +utilité 1 +arg 1 +prop 1 +▁retenu 1 +1998 1 +▁troubles 1 +▁participe 1 +▁officieuses 1 +plan 1 +▁garçons 1 +▁magasin 1 +▁concret 1 +▁tort 1 +▁efficacité 1 +observateur 1 +▁POUR 1 +vage 1 +Agriculture 1 +▁pierre 1 +çons 1 +▁intra 1 +Indonésie 1 +assemblée 1 +oeuvre 1 +articul 1 +issé 1 +▁Jeux 1 +ssons 1 +▁école 1 +▁printemps 1 +▁média 1 +▁GRC 1 +oxyde 1 +▁rappel 1 +▁CNUCED 1 +ffin 1 +▁égal 1 +▁Vol 1 +ji 1 +▁argent 1 +▁courte 1 +▁priv 1 +▁voyageurs 1 +résolution 1 +tect 1 +▁désignation 1 +Autorité 1 +▁fasse 1 +Pro 1 +▁passée 1 +▁front 1 +▁chute 1 +▁cohésion 1 +▁célèbre 1 +▁paysage 1 +▁dignité 1 +▁Ben 1 +▁suscite 1 +▁citoyen 1 +▁envoyer 1 +▁appar 1 +-07 1 +▁saine 1 +velopp 1 +▁verser 1 +▁quotidien 1 +▁répand 1 +▁définit 1 +/00 1 +▁externe 1 +▁touchés 1 +▁Portugal 1 +▁rédigé 1 +▁responsabilis 1 +ÉS 1 +▁vide 1 +▁Revenu 1 +tude 1 +▁quasi 1 +▁organisationnel 1 +▁intéressante 1 +▁Leur 1 +tech 1 +thérapie 1 +▁virtuel 1 +▁handicap 1 +LC 1 +▁vécu 1 +▁écosystèmes 1 +▁vendre 1 +tudi 1 +▁Quant 1 +dg 1 +▁réunir 1 +▁éducatif 1 +▁Accord 1 +▁richesse 1 +▁coeur 1 +▁supprimer 1 +▁plastique 1 +▁vin 1 +OTAN 1 +▁Op 1 +▁concurrentiel 1 +▁suivie 1 +AND 1 +acceptation 1 +▁Danemark 1 +incertitude 1 +▁réglé 1 +▁Tél 1 +▁étions 1 +▁suffit 1 +▁trouverez 1 +▁Washington 1 +▁suggéré 1 +▁voté 1 +▁Règle 1 +▁frère 1 +hydr 1 +▁contraintes 1 +▁(3) 1 +rence 1 +▁future 1 +infraction 1 +▁trimestre 1 +▁vouloir 1 +admissibilité 1 +exploration 1 +▁effectif 1 +rap 1 +▁accéder 1 +▁Chypre 1 +▁attribuable 1 +▁symbole 1 +▁téléphonique 1 +▁administré 1 +▁occidentale 1 +▁terminer 1 +▁agences 1 +▁plage 1 +▁Imp 1 +copie 1 +▁tend 1 +▁atelier 1 +▁limitation 1 +▁partiel 1 +▁Public 1 +▁conformer 1 +Zélande 1 +▁Corporation 1 +▁Résumé 1 +▁discriminatoire 1 +▁sensibiliser 1 +▁visa 1 +échantillon 1 +▁Durant 1 +▁bref 1 +▁développe 1 +▁refusé 1 +▁pouvais 1 +▁dotation 1 +▁acheté 1 +ney 1 +▁sentir 1 +UC 1 +▁requise 1 +▁diagnostic 1 +▁Science 1 +organiser 1 +oubli 1 +africain 1 +IX 1 +UV 1 +▁légères 1 +▁absolu 1 +▁race 1 +▁étudiant 1 +▁compatible 1 +▁illustre 1 +▁prà 1 +▁content 1 +thèse 1 +▁mensuel 1 +▁spécialement 1 +htm 1 +Afghanistan 1 +▁détermine 1 +▁observateurs 1 +avancement 1 +▁domestique 1 +tivité 1 +▁pourrions 1 +▁cal 1 +ctor 1 +▁Fl 1 +identifier 1 +▁subsidiaire 1 +▁George 1 +▁Publications 1 +envoi 1 +▁hôte 1 +▁Résultats 1 +OSCE 1 +appelante 1 +▁strict 1 +▁organiser 1 +▁rencontrer 1 +▁Pal 1 +▁coordonnateur 1 +▁clientèle 1 +▁acheter 1 +▁Chi 1 +ball 1 +▁Pren 1 +▁chimique 1 +▁profondeur 1 +▁arrière 1 +implication 1 +▁souhaiter 1 +ographique 1 +▁Sierra 1 +û 1 +▁malade 1 +▁aliment 1 +suite 1 +▁magnifique 1 +® 1 +▁promoteur 1 +intervenant 1 +▁Consul 1 +▁Londres 1 +▁Gal 1 +▁Wal 1 +▁déposer 1 +invitation 1 +▁UN 1 +▁diplôme 1 +Argentine 1 +▁quarante 1 +▁disparu 1 +▁prenantes 1 +événement 1 +▁fixer 1 +▁DG 1 +essence 1 +▁CANADA 1 +▁cultiv 1 +▁acquise 1 +▁citer 1 +occupent 1 +guer 1 +HA 1 +▁démontrer 1 +Espagne 1 +▁fermé 1 +▁potable 1 +▁révél 1 +▁gestionnaire 1 +▁méta 1 +intégrer 1 +▁resté 1 +▁remis 1 +▁prie 1 +▁disparition 1 +▁connaissent 1 +▁douce 1 +▁Travail 1 +Israël 1 +augmenter 1 +▁décrire 1 +▁néglige 1 +▁encourageant 1 +▁Espagne 1 +▁distincte 1 +▁imprimé 1 +▁Hotel 1 +▁maternelle 1 +▁détection 1 +▁agriculteurs 1 +▁touristique 1 +▁palestinienne 1 +▁stock 1 +ÉE 1 +▁viande 1 +expiration 1 +obtention 1 +▁chap 1 +▁disque 1 +▁· 1 +Canada 1 +▁entrepreneurs 1 +ASS 1 +▁HCR 1 +/10 1 +administrateur 1 +importateur 1 +envoyer 1 +▁vendredi 1 +▁concentr 1 +dd 1 +aurait 1 +▁Rome 1 +▁croissant 1 +▁conviction 1 +interaction 1 +▁tente 1 +▁Bulgarie 1 +▁faisaient 1 +mail 1 +▁TV 1 +▁atmosphérique 1 +▁ouvrir 1 +▁certification 1 +▁plat 1 +▁Ob 1 +▁transmet 1 +▁98 1 +▁circonscription 1 +▁recouvrement 1 +entremise 1 +▁disposé 1 +▁constamment 1 +▁Gar 1 +▁administrateurs 1 +▁témoignage 1 +▁justifié 1 +▁arbres 1 +▁Sécurité 1 +▁demeurent 1 +▁répression 1 +▁vieille 1 +régional 1 +▁intensif 1 +▁recul 1 +▁prime 1 +option 1 +▁conducteur 1 +▁menacé 1 +%) 1 +▁ajoute 1 +▁provoque 1 +▁Pat 1 +▁leçon 1 +▁mineur 1 +▁tué 1 +▁Européen 1 +▁répondant 1 +▁retirer 1 +▁via 1 +▁procureur 1 +-09 1 +exercer 1 +▁leader 1 +▁Pêches 1 +oïde 1 +▁universitaire 1 +huile 1 +▁étage 1 +▁vêtements 1 +▁jardin 1 +▁Jusqu 1 +▁voter 1 +▁civilisation 1 +▁Peter 1 +▁préfér 1 +▁espérons 1 +▁éloigné 1 +étiquette 1 +▁immédiate 1 +▁orientale 1 +▁explicite 1 +▁affiché 1 +▁arrangements 1 +▁conservé 1 +incendie 1 +ception 1 +▁profond 1 +▁perdre 1 +▁destinée 1 +▁consultant 1 +glo 1 +▁saisir 1 +▁tax 1 +▁défendre 1 +▁vois 1 +ège 1 +OMM 1 +/58/ 1 +▁échantillon 1 +culture 1 +▁compléter 1 +▁corporel 1 +artiste 1 +Ambassadeur 1 +▁réfléchi 1 +▁justifier 1 +ajouter 1 +▁identité 1 +▁utilis 1 +▁Bell 1 +▁télécopie 1 +pression 1 +▁connexion 1 +▁émerge 1 +▁Ali 1 +OUR 1 +▁ram 1 +▁achats 1 +▁morceau 1 +path 1 +▁conversation 1 +▁psychologique 1 +▁Deuxièmement 1 +▁Suite 1 +▁démo 1 +inspire 1 +▁consommateur 1 +▁évolue 1 +épidémie 1 +▁Géorgie 1 +▁Finances 1 +▁évoqué 1 +▁fondation 1 +▁hôpitaux 1 +▁personnalité 1 +▁enceinte 1 +▁empêche 1 +▁Mat 1 +accorder 1 +▁sanction 1 +▁attaché 1 +TVH 1 +Rev 1 +chev 1 +▁retiré 1 +▁alloué 1 +▁polluants 1 +▁repas 1 +▁amp 1 +expédition 1 +sseur 1 +▁Croatie 1 +▁Leone 1 +▁lundi 1 +▁anglaise 1 +▁facilité 1 +▁2.1 1 +▁Chili 1 +▁Serbie 1 +▁commandant 1 +▁associ 1 +tron 1 +▁Communiqué 1 +instaurer 1 +nouveau 1 +OT 1 +▁autorise 1 +▁Océans 1 +▁TPSGC 1 +initi 1 +▁Dès 1 +▁péri 1 +atteign 1 +▁événement 1 +▁Kenya 1 +▁signaler 1 +▁sauvegarde 1 +ä 1 +▁génie 1 +invent 1 +▁rendent 1 +ONT 1 +national 1 +▁Palestine 1 +UNI 1 +▁confié 1 +▁classement 1 +▁Procureur 1 +▁parfaitement 1 +gion 1 +▁Hongrie 1 +▁automatiquement 1 +▁dégage 1 +▁lucratif 1 +ingénieur 1 +▁tendant 1 +duire 1 +arbre 1 +▁gravité 1 +extension 1 +▁disait 1 +▁espère 1 +sectoriel 1 +tract 1 +▁Dia 1 +▁clôture 1 +▁récolte 1 +▁vend 1 +▁répondent 1 +▁(2001) 1 +▁Seul 1 +▁apparaît 1 +▁légèrement 1 +▁automatique 1 +▁mille 1 +▁Cabinet 1 +▁Malheureusement 1 +▁suiv 1 +▁noire 1 +▁vieux 1 +▁armé 1 +ok 1 +EU 1 +▁Trois 1 +▁comparable 1 +▁Lisbonne 1 +▁contiennent 1 +▁côtière 1 +ouvrir 1 +▁vague 1 +▁Research 1 +▁coopérative 1 +▁valide 1 +▁servant 1 +glement 1 +▁censé 1 +acheteur 1 +▁précédemment 1 +▁équilibré 1 +▁distingue 1 +▁3.1 1 +nor 1 +▁Bay 1 +ulf 1 +▁coupable 1 +▁2005-2006 1 +▁obligé 1 +▁déposant 1 +Alliance 1 +▁législative 1 +tag 1 +étal 1 +▁Général 1 +▁café 1 +▁investisseurs 1 +▁4.1 1 +onique 1 +▁rayon 1 +▁vulnérabilité 1 +Г 1 +▁séquence 1 +▁souffre 1 +2,5 1 +▁plafond 1 +/59/ 1 +adresser 1 +▁antérieur 1 +▁intégrante 1 +▁souveraineté 1 +▁thé 1 +▁Sub 1 +▁parvenu 1 +▁comm 1 +coup 1 +▁profondément 1 +▁métaux 1 +▁tombe 1 +ated 1 +abus 1 +▁aéronefs 1 +ordonnance 1 +▁stupéfiant 1 +▁synthèse 1 +▁Post 1 +ACDI 1 +▁Maroc 1 +▁Nunavut 1 +ssaient 1 +▁dépendance 1 +▁incluant 1 +▁éventuellement 1 +orateur 1 +▁bateau 1 +satisf 1 +▁bateaux 1 +▁catastrophe 1 +▁apparent 1 +▁souffrance 1 +▁poussé 1 +aura 1 +phi 1 +▁Fort 1 +▁péril 1 +▁carré 1 +▁salarié 1 +▁créancier 1 +▁journaux 1 +▁Sha 1 +▁hydro 1 +▁Att 1 +▁lecteur 1 +▁tolérance 1 +▁évidemment 1 +▁suspension 1 +▁faux 1 +▁significatif 1 +objection 1 +▁affecte 1 +exige 1 +▁routier 1 +▁accepte 1 +▁suppos 1 +▁beau 1 +▁exploité 1 +▁120 1 +▁Conseiller 1 +▁indirect 1 +▁Limited 1 +100 1 +▁dirige 1 +▁courrier 1 +identifi 1 +▁demeur 1 +1999 1 +▁imposées 1 +▁transformé 1 +admission 1 +▁1986 1 +▁combler 1 +▁colonie 1 +▁italien 1 +212) 1 +cription 1 +▁recens 1 +enseignant 1 +▁Rwanda 1 +échéance 1 +▁radical 1 +▁prioritaire 1 +▁Mark 1 +▁quitter 1 +▁emprunt 1 +▁gènes 1 +▁vraie 1 +ignant 1 +‰ 1 +▁minoritaire 1 +/60/ 1 +trans 1 +▁attendre 1 +▁pertinence 1 +▁concrète 1 +▁puni 1 +▁relèvent 1 +▁revient 1 +Enquête 1 +épi 1 +épargne 1 +▁exceptionnelle 1 +lib 1 +▁progressivement 1 +▁modernisation 1 +ambassade 1 +efforce 1 +▁accro 1 +▁pourriez 1 +▁diminuer 1 +▁Décide 1 +▁cumul 1 +▁requ 1 +Commission 1 +▁religieux 1 +▁fausse 1 +▁manger 1 +▁surpris 1 +▁ressource 1 +assainissement 1 +▁portable 1 +▁grossesse 1 +ATIONS 1 +liquer 1 +inclusion 1 +▁blessé 1 +▁constituée 1 +Ottawa 1 +▁iii 1 +▁Tim 1 +LES 1 +▁Australie 1 +▁commencent 1 +▁bruit 1 +▁attaques 1 +▁constat 1 +▁Contact 1 +▁assumer 1 +MIN 1 +arbitrage 1 +▁privilège 1 +▁meurt 1 +▁surmonter 1 +▁reconnaissant 1 +▁bientôt 1 +▁MPO 1 +/11 1 +▁assisté 1 +▁2.2 1 +▁basse 1 +▁divulgation 1 +char 1 +▁cellule 1 +▁dollar 1 +▁officiellement 1 +ARI 1 +▁renforcée 1 +Yougoslavie 1 +▁fiducie 1 +introduire 1 +arrivée 1 +▁poursuit 1 +▁arrivée 1 +▁criminelle 1 +▁décharge 1 +oppose 1 +▁probabilité 1 +▁décideurs 1 +▁Winnipeg 1 +▁détruit 1 +▁avancer 1 +annonce 1 +▁témoin 1 +▁territoriaux 1 +▁Côte 1 +ink 1 +▁Adresse 1 +▁Kar 1 +▁TRANS 1 +▁reproduit 1 +▁publier 1 +empêcher 1 +haus 1 +▁modifiant 1 +▁attirer 1 +Président 1 +▁confirme 1 +élargir 1 +▁Introduction 1 +▁ménages 1 +INS 1 +▁Indiens 1 +▁INC 1 +▁Membre 1 +▁analysé 1 +▁BCE 1 +▁féminine 1 +▁précoce 1 +▁fournissant 1 +▁mobilisation 1 +vironnementales 1 +icité 1 +ECT 1 +▁mécanique 1 +▁possession 1 +▁pertinente 1 +ÉT 1 +▁Michael 1 +▁Financement 1 +▁sommaire 1 +în 1 +▁Aussi 1 +tisme 1 +▁Commentaires 1 +▁Cinquième 1 +MR 1 +verbal 1 +▁Prix 1 +▁voudra 1 +▁fenêtre 1 +sphère 1 +▁Somalie 1 +▁décrites 1 +▁plaque 1 +▁Commissariat 1 +▁aborder 1 +▁informel 1 +▁respectifs 1 +▁confidentiel 1 +appréciation 1 +▁dépistage 1 +▁revanche 1 +▁schéma 1 +▁douleur 1 +▁amené 1 +▁honor 1 +▁spécifiquement 1 +aéronef 1 +équation 1 +▁2003-2004 1 +▁English 1 +▁accueille 1 +▁viabilité 1 +▁cohérente 1 +▁feront 1 +▁vieillissement 1 +ozone 1 +ship 1 +▁dépasser 1 +▁exploiter 1 +▁confirmer 1 +▁Martin 1 +▁(« 1 +▁aquatique 1 +0,00 1 +▁théâtre 1 +μ 1 +▁courage 1 +tendent 1 +Azerbaïdjan 1 +▁bilatéraux 1 +▁963- 1 +▁densité 1 +/57/ 1 +▁touché 1 +agé 1 +1997 1 +Ê 1 +▁Luxembourg 1 +▁déficience 1 +▁escompté 1 +▁inclut 1 +▁analogue 1 +▁communique 1 +▁repr 1 +▁entrave 1 +▁portefeuille 1 +COM 1 +▁couple 1 +▁intervenir 1 +▁faune 1 +ANCE 1 +▁améliorée 1 +▁Partenariat 1 +▁talent 1 +▁considér 1 +▁englobe 1 +allégation 1 +▁possèdent 1 +▁tissu 1 +▁dérivé 1 +▁consenti 1 +▁souris 1 +▁Retour 1 +▁Télécopieur 1 + 1 +▁comptabilité 1 +▁hu 1 +▁simultané 1 +▁jurisprudence 1 +▁ressortissants 1 +▁métier 1 +KO 1 +Pierre 1 +▁ouvre 1 +▁citoyenneté 1 +▁iraquien 1 +▁propice 1 +phone 1 +change 1 +▁Commun 1 +nçant 1 +importantes 1 +▁Application 1 +▁transnationale 1 +horaire 1 +insuffisance 1 +▁supprimé 1 +▁Coût 1 +▁étoiles 1 +▁TIC 1 +▁pourrez 1 +▁tenter 1 +intimé 1 +▁fraude 1 +▁tranche 1 +▁Régime 1 +▁spectre 1 +▁paye 1 +± 1 +▁Fonction 1 +▁revoir 1 +autoriser 1 +▁renforce 1 +▁mathématique 1 +étant 1 +ISS 1 +▁souvenir 1 +atch 1 +acé 1 +faire 1 +mou 1 +▁# 1 +Arctique 1 +▁extrait 1 +▁700 1 +▁Quoi 1 +▁comparé 1 +▁converti 1 +▁présumé 1 +/2001/ 1 +utilise 1 +▁particip 1 +▁soumet 1 +▁croit 1 +▁différ 1 +▁restructuration 1 +▁camion 1 +▁libellé 1 +▁spécifié 1 +▁vacances 1 +▁prévoient 1 +ERS 1 +éliminer 1 +▁opposé 1 +▁charbon 1 +▁déclin 1 +incapacité 1 +▁recruté 1 +AGE 1 +▁Premièrement 1 +▁refuser 1 +méthyl 1 +▁James 1 +▁restant 1 +▁retrouver 1 +▁march 1 +▁forestier 1 +▁déclarer 1 +DH 1 +/61/ 1 +▁grosse 1 +ford 1 +— 1 +ENCE 1 +▁Sommaire 1 +intensité 1 +▁Secteur 1 +agression 1 +lio 1 +ncée 1 +▁calculer 1 +▁délivrance 1 +inverse 1 +▁Bern 1 +▁bain 1 +appuyant 1 +▁vérifié 1 +▁brûl 1 +▁délit 1 +mettez 1 +installe 1 +Année 1 +▁prospérité 1 +▁déten 1 +▁bâti 1 +▁Koweït 1 +▁compliqué 1 +▁mentionnées 1 +▁passeport 1 +▁gratuitement 1 +▁varié 1 +▁marginal 1 +agne 1 +.1.1 1 +troisième 1 +▁diplômé 1 +▁zéro 1 +▁Territoires 1 +▁féliciter 1 +▁menu 1 +▁libéralisation 1 +▁légal 1 +(3) 1 +▁Hol 1 +▁OK 1 +▁Consultations 1 +▁guéri 1 +▁signer 1 +▁correspondance 1 +rifi 1 +région 1 +WG 1 +deuxième 1 +▁recourir 1 +▁photographie 1 +/12 1 +▁World 1 +▁félicité 1 +▁marcher 1 +▁administr 1 +source 1 +▁correction 1 +fusion 1 +▁retourner 1 +▁Calgary 1 +▁cérémonie 1 +▁originaire 1 +interprète 1 +▁indien 1 +▁ressenti 1 +ELLE 1 +▁insiste 1 +▁visiter 1 +▁correspondent 1 +.3.1 1 +▁météorologique 1 +Homme 1 +▁définitif 1 +▁préservation 1 +Ordre 1 +▁observe 1 +▁analytique 1 +▁royale 1 +▁descriptif 1 +▁député 1 +Commissariat 1 +▁manipul 1 +▁forestière 1 +TES 1 +▁voient 1 +QUE 1 +§ 1 +▁comportant 1 +▁stipule 1 +bal 1 +▁japonais 1 +▁prolongé 1 +▁réconciliation 1 +▁levée 1 +bré 1 +▁directrice 1 +▁fiche 1 +▁spectacle 1 +▁Journée 1 +▁biotechnologie 1 +▁préféré 1 +▁afférent 1 +atténuation 1 +▁réagir 1 +Qu 1 +graphie 1 +▁chien 1 +▁vaut 1 +▁compétition 1 +▁inconnu 1 +inflation 1 +alerte 1 +▁imparti 1 +▁sauver 1 +archi 1 +▁exemplaire 1 +envergure 1 +▁Quelques 1 +▁effectue 1 +POS 1 +▁paquet 1 +▁(1999) 1 +▁réussir 1 +▁orateurs 1 +▁analyser 1 +▁posent 1 +▁établissant 1 +investir 1 +▁vital 1 +▁Prend 1 +ignore 1 +▁Slovénie 1 +▁fardeau 1 +/2004/ 1 +▁exiger 1 +bio 1 +▁validité 1 +bec 1 +▁familial 1 +▁approfondi 1 +{ 1 +▁réaffirme 1 +▁versées 1 +▁enseignements 1 +▁écrire 1 +▁rive 1 +▁librement 1 +institutionnelle 1 +Com 1 +▁Google 1 +▁inutile 1 +UD 1 +▁concurrent 1 +▁tap 1 +▁cardiaque 1 +▁sensiblement 1 +artisan 1 +dium 1 +▁marketing 1 +▁mobiliser 1 +/01 1 +▁assorti 1 +▁circuit 1 +▁contemporain 1 +istique 1 +▁Mesdames 1 +▁décor 1 +▁SCT 1 +Laurent 1 +▁CRTC 1 +▁serveur 1 +▁supervision 1 +entraînement 1 +▁kilo 1 +incitation 1 +Comité 1 +▁consacrer 1 +chloro 1 +/62/ 1 +intervalle 1 +▁conclut 1 +▁bienfaisance 1 +ASFC 1 +▁femelle 1 +▁pot 1 +autant 1 +▁sucre 1 +▁Coopération 1 +quatrième 1 +INE 1 +~ 1 +/2000/ 1 +▁arguments 1 +▁roche 1 +▁immédiat 1 +▁raconter 1 +▁complété 1 +Algérie 1 +▁prononcée 1 +accomplir 1 +▁baie 1 +▁sélectionné 1 +▁dérogation 1 +▁Type 1 +étudiant 1 +ING 1 +▁artificiel 1 +Edmonton 1 +▁molécule 1 +▁reprendre 1 +} 1 +▁finir 1 +▁provoqué 1 +▁facture 1 +▁abandonné 1 +accusation 1 +atteinte 1 +▁mâle 1 +▁contraignant 1 +▁exportateurs 1 +▁recueil 1 +accident 1 +▁feux 1 +▁1984 1 +▁internet 1 +▁prononcer 1 +▁interprété 1 +Ayant 1 +pel 1 +▁touchées 1 +lip 1 +▁Messieurs 1 +▁procède 1 +▁réservoir 1 +▁tombé 1 +▁clef 1 +oxygène 1 +▁formelle 1 +▁multilatéraux 1 +▁Étude 1 +informer 1 +▁concentré 1 +inspecteur 1 +▁appartient 1 +▁symptômes 1 +équipage 1 +▁décisionnel 1 +▁procurer 1 +annulation 1 +▁bénéficie 1 +▁dotée 1 +▁compl 1 +▁minière 1 +▁Development 1 +Ouganda 1 +▁immigrants 1 +bourg 1 +▁métro 1 +▁pertinent 1 +▁William 1 +▁sécuritaire 1 +▁vérificateur 1 +▁wh 1 +▁harmonisé 1 +explorer 1 +pass 1 +▁VII 1 +▁vendeur 1 +▁prononcé 1 +▁stimuler 1 +utili 1 +▁salue 1 +▁électeurs 1 +.2.2 1 +▁Han 1 +▁commandement 1 +▁Durée 1 +rup 1 +cinquième 1 +▁Tour 1 +erreur 1 +▁véritablement 1 +embauche 1 +emprisonnement 1 +▁blanchiment 1 +métrie 1 +▁Richard 1 +étiquetage 1 +▁réinsertion 1 +apprendre 1 +▁fabriquer 1 +▁Company 1 +▁prouver 1 +Irak 1 +▁Corr 1 +▁discuté 1 +▁tire 1 +Éthiopie 1 +▁bilingue 1 +▁caméra 1 +▁Titre 1 +gov 1 +▁douane 1 +▁soupçon 1 +▁gagné 1 +▁arbitraire 1 +▁atlantique 1 +▁dégradation 1 +wood 1 +▁combattants 1 +▁heurt 1 +http 1 +▁restriction 1 +▁suffi 1 +▁prolonge 1 +▁MDN 1 +▁cercle 1 +▁Ville 1 +▁Gaza 1 +économique 1 +▁saurait 1 +accessibilité 1 +▁distribuer 1 +▁soulève 1 +attendre 1 +▁souple 1 +▁fermement 1 +▁Bibliothèque 1 +groupe 1 +▁calme 1 +apparition 1 +▁River 1 +▁cellulaire 1 +▁interrogé 1 +▁étudie 1 +▁habilité 1 +▁fur 1 +▁nulle 1 +▁souterrain 1 +outils 1 +attentat 1 +École 1 +▁protège 1 +▁signaux 1 +phosph 1 +agrément 1 +▁exceptionnel 1 +▁Pourtant 1 +UNESCO 1 +▁personnage 1 +▁quitté 1 +▁prendra 1 +bac 1 +Édouard 1 +▁avéré 1 +▁heureuse 1 +▁résume 1 +▁clos 1 +▁remonte 1 +▁proviennent 1 +officier 1 +▁Halifax 1 +▁traduire 1 +▁saumon 1 +▁condamnation 1 +▁piste 1 +▁consistant 1 +▁méthodologie 1 +inquiète 1 +▁canada 1 +▁réexamen 1 +▁furent 1 +/2006/ 1 +/2005/ 1 +achèvement 1 +▁alternative 1 +▁joindre 1 +▁textile 1 +▁indiennes 1 +/2003/ 1 +▁pêcheurs 1 +▁constituant 1 +▁créativité 1 +▁Réserve 1 +▁traditionnel 1 +▁Arrêt 1 +expulsion 1 +XV 1 +vide 1 +pyr 1 +▁regret 1 +▁câble 1 +▁souches 1 +▁toucher 1 +▁neige 1 +EST 1 +▁concession 1 +▁socioéconomique 1 +▁blanche 1 +▁souhaitable 1 +▁adressé 1 +▁détenteur 1 +ONG 1 +▁peinture 1 +immunité 1 +▁prévision 1 +▁Burundi 1 +▁Haïti 1 +▁Guerre 1 +▁inspiré 1 +▁faim 1 +Opération 1 +▁informelle 1 +▁comparativement 1 +▁récepteur 1 +immobilisation 1 +▁séparation 1 +▁Manuel 1 +eck 1 +▁chirurgie 1 +▁rémunéré 1 +▁structuré 1 +▁ciel 1 +Angleterre 1 +▁Lituanie 1 +▁[...] 1 +▁renferme 1 +invite 1 +▁apparu 1 +essentiel 1 +▁canal 1 +▁fréquemment 1 +▁suppression 1 +▁Aff 1 +▁nutrition 1 +▁faiblesse 1 +▁enseigne 1 +▁créant 1 +▁sauvetage 1 +▁Pérou 1 +▁réalise 1 +▁commentaire 1 +accise 1 +▁malheureusement 1 +inscriv 1 +existait 1 +war 1 +0.00 1 +▁exigent 1 +Annexe 1 +▁rétablir 1 +▁dumping 1 +Ivoire 1 +▁protégées 1 +ILL 1 +▁évolué 1 +▁diriger 1 +▁âgé 1 +▁discut 1 +▁Valeur 1 +< 1 +apprécie 1 +uck 1 +▁demandant 1 +▁subir 1 +▁beauté 1 +hol 1 +formation 1 +valent 1 +▁trace 1 +▁fonctionnent 1 +▁moral 1 +▁sonore 1 +▁dépassé 1 +territorial 1 +▁nettement 1 +intolérance 1 +▁déplacer 1 +▁chanson 1 +▁segment 1 +évolu 1 +▁garantit 1 +▁compétent 1 +clin 1 +▁complémentaire 1 +énoncé 1 +instauration 1 +▁Imaginez 1 +▁délibérations 1 +▁Chacun 1 +▁reporter 1 +PORT 1 +▁Tre 1 +cru 1 +▁collègue 1 +▁Philippines 1 +aviation 1 +▁Costa 1 +▁fonctionnelle 1 +▁typique 1 +▁2008-2009 1 +▁confidentialité 1 +▁fermeture 1 +interface 1 +▁bénéficié 1 +▁Celui 1 +▁vallée 1 +▁(2004) 1 +▁imaginer 1 +EPA 1 +▁fête 1 +▁Nigéria 1 +▁motivation 1 +▁prévoyant 1 +▁souten 1 +entendre 1 +▁Slovaquie 1 +▁condamn 1 +▁Registre 1 +▁transitoire 1 +ORD 1 +▁réside 1 +issons 1 +gri 1 +▁expose 1 +crit 1 +entrevue 1 +▁Macédoine 1 +▁humide 1 +▁Lacs 1 +▁magazine 1 +‘ 1 +▁touchent 1 +▁corriger 1 +▁Sénat 1 +▁bouge 1 +▁Darfour 1 +▁rayonnement 1 +clenche 1 +▁constant 1 +Sud 1 +▁pilier 1 +▁CFP 1 +▁boule 1 +▁circul 1 +▁minute 1 +▁assurant 1 +ë 1 +exemption 1 +imposent 1 +effectif 1 +▁distributeur 1 +▁offices 1 +améliore 1 +asi 1 +▁Compagnie 1 +▁olympique 1 +▁végétal 1 +▁cesser 1 +Article 1 +▁Analyse 1 +▁Contribution 1 +▁problématique 1 +▁troupes 1 +▁recommand 1 +▁cabinet 1 +▁croyance 1 +▁tourner 1 +▁fonctionnel 1 +▁Considérant 1 +▁renvoyé 1 +▁compensation 1 +▁Park 1 +▁agréé 1 +▁__________ 1 +▁Kyoto 1 +▁défavoris 1 +▁favorisant 1 +▁blé 1 +▁éclairé 1 +▁tube 1 +▁Méd 1 +▁convenable 1 +▁doigt 1 +▁routière 1 +▁résidant 1 +▁notable 1 +▁intérim 1 +/55/ 1 +▁afghan 1 +arbitre 1 +harmonie 1 +▁signale 1 +▁puits 1 +ôme 1 +trice 1 +▁réputation 1 +▁fallu 1 +▁fraction 1 +Estonie 1 +▁grec 1 +intelligence 1 +appartenance 1 +▁réaffirmé 1 +▁consacre 1 +▁muni 1 +habitation 1 +work 1 +▁1970 1 +informatique 1 +▁Réponse 1 +▁émanant 1 +▁énonce 1 +▁capture 1 +▁Très 1 +▁redevance 1 +▁assume 1 +▁tomber 1 +▁remarqué 1 +▁motivé 1 +▁Relations 1 +▁attendant 1 +▁Processus 1 +▁impôts 1 +▁excessive 1 +▁Formation 1 +▁courbe 1 +▁1982 1 +aurais 1 +▁démonstration 1 +▁incorporé 1 +▁travailleur 1 +droit 1 +▁jeudi 1 +▁consolider 1 +▁Marc 1 +▁Group 1 +▁haine 1 +▁insulaires 1 +▁signification 1 +Hôtel 1 +▁médiation 1 +▁jaune 1 +▁Question 1 +▁objective 1 +▁libéré 1 +entraîne 1 +▁observ 1 +excédent 1 +▁Victoria 1 +▁précède 1 +/2002/ 1 +▁gars 1 +imagine 1 +▁Américains 1 +▁rentable 1 +▁producteur 1 +▁transférer 1 +▁collège 1 +▁constatations 1 +▁Lettonie 1 +=" 1 +_______ 1 +▁progressive 1 +azote 1 +but 1 +type 1 +invalidité 1 +▁goût 1 +Arménie 1 +▁golf 1 +Rouge 1 +▁Peu 1 +morph 1 +▁doter 1 +Monténégro 1 +▁transfrontière 1 +▁étroit 1 +▁mange 1 +▁reconnaiss 1 +▁ratio 1 +audiovisuel 1 +▁incapable 1 +▁sincère 1 +employer 1 +envisager 1 +Direct 1 +accueillir 1 +▁interactions 1 +▁confort 1 +▁apparaître 1 +▁collabore 1 +▁Report 1 +▁Définition 1 +▁harcèlement 1 +▁munitions 1 +efforcer 1 +adolescent 1 +▁Bangladesh 1 +▁ralenti 1 +▁génial 1 +inclure 1 +▁officiers 1 +ressource 1 +/56/ 1 +▁étrange 1 +▁déduction 1 +▁cigarette 1 +▁Encourage 1 +▁considérant 1 +TRANS 1 +▁dirigeant 1 +hibit 1 +info 1 +▁Thaïlande 1 +▁fragment 1 +▁partiellement 1 +▁gagne 1 +exactitude 1 +▁fassent 1 +▁indésirable 1 +▁négocier 1 +▁sévère 1 +▁hasard 1 +▁sérieusement 1 +▁occidental 1 +▁Supplément 1 +▁appartement 1 +ough 1 +▁arbitral 1 +▁trompe 1 +▁arriva 1 +lette 1 +CHE 1 +▁précieux 1 +▁diffère 1 +▁réadaptation 1 +▁précieuse 1 +Colombie 1 +mond 1 +emporte 1 +mic 1 +▁Travaux 1 +▁commémor 1 +▁masculin 1 +▁pensais 1 +▁biologie 1 +▁vivement 1 +▁2000-2001 1 +▁émet 1 +insolvabilité 1 +▁documentaire 1 +▁tourne 1 +plus 1 +▁douanière 1 +▁récompense 1 +▁souplesse 1 +▁Transport 1 +▁transaction 1 +▁Louis 1 +▁libéral 1 +arrestation 1 +▁durabilité 1 +▁plomb 1 +▁sanguin 1 +Industrie 1 +▁pluie 1 +▁Promotion 1 +▁terrible 1 +▁infecté 1 +▁frappe 1 +▁dixième 1 +▁prépare 1 +/63/ 1 +▁Directrice 1 +▁pénétr 1 +▁dépression 1 +ó 1 +▁Palestiniens 1 +▁minorité 1 +1995 1 +▁justifie 1 +▁Bulletin 1 +▁restauration 1 +ward 1 +▁cessation 1 +▁Madrid 1 +▁antiterroriste 1 +▁hommage 1 +▁contenir 1 +▁grief 1 +▁Contactez 1 +hospital 1 +▁biodiversité 1 +▁retenir 1 +anthrop 1 +▁réaliste 1 +échantillonnage 1 +▁Off 1 +▁PMA 1 +▁suppl 1 +▁divisé 1 +▁PNUE 1 +▁prisonniers 1 +▁prenez 1 +▁privilégié 1 +exploitant 1 +▁matérielle 1 +église 1 +▁déplacé 1 +▁mardi 1 +▁Singapour 1 +/2008/ 1 +▁sorti 1 +affirmation 1 +▁paludisme 1 +▁recyclage 1 +▁amener 1 +hydro 1 +▁souhaité 1 +appendice 1 +▁Paiements 1 +▁annulé 1 +▁maître 1 +▁Radio 1 +▁remet 1 +▁coefficient 1 +▁rigoureuse 1 +lève 1 +accéder 1 +script 1 +▁substantielle 1 +▁utilisons 1 +▁0,1 1 +▁Society 1 +▁(2000) 1 +▁State 1 +uj 1 +▁mettra 1 +▁confusion 1 +▁Hong 1 +▁projection 1 +▁vivons 1 +▁viens 1 +▁caisse 1 +▁dispers 1 +▁spécialiste 1 +inscrit 1 +▁Crédit 1 +valuation 1 +élevage 1 +écosystème 1 +▁1,5 1 +▁pluriannuel 1 +▁prélèvement 1 +▁tenté 1 +▁léger 1 +▁préparatifs 1 +▁promesse 1 +▁roulant 1 +▁nuage 1 +benz 1 +▁suisse 1 +▁Libéria 1 +▁ultra 1 +adore 1 +▁roman 1 +abilit 1 +▁primordial 1 +▁sécheresse 1 +▁concertée 1 +▁électoral 1 +▁Rica 1 +▁fiscaux 1 +▁imprimable 1 +▁théorique 1 +▁invoqué 1 +▁assister 1 +2010 1 +hygiène 1 +▁fauteuil 1 +▁conduis 1 +▁that 1 +▁subséquent 1 +▁Principes 1 +▁jambe 1 +iya 1 +▁allié 1 +▁ressembl 1 +auraient 1 +ogène 1 +harmoniser 1 +▁compassion 1 +▁porc 1 +▁diabète 1 +▁imprimer 1 +Arabie 1 +▁guère 1 +▁croient 1 +éclairage 1 +▁filtre 1 +▁bonheur 1 +▁mercure 1 +▁sportif 1 +▁vive 1 +▁suspendu 1 +▁Figure 1 +▁CRDI 1 +▁inégalités 1 +▁prostitution 1 +▁débiteur 1 +▁correctionnel 1 +▁manifestation 1 +▁Mouvement 1 +▁retombées 1 +▁certifié 1 +▁détecter 1 +▁Médiateur 1 +défini 1 +▁parlons 1 +▁noyau 1 +▁prévisible 1 +▁débouché 1 +enveloppe 1 +version 1 +▁subsistance 1 +▁Island 1 +efficience 1 +▁pénitentiaire 1 +▁Malaisie 1 +ABLE 1 +hydrogène 1 +▁voulaient 1 +▁suspect 1 +▁program 1 +IER 1 +▁Canadien 1 +actualité 1 +▁FNUAP 1 +▁déclarant 1 +FORM 1 +▁découvr 1 +▁honnête 1 +▁inacceptable 1 +▁reconnaissent 1 +▁Lieu 1 +▁mercredi 1 +▁stabilisation 1 +▁justification 1 +Albanie 1 +▁mourir 1 +▁demandons 1 +▁déployé 1 +▁frappé 1 +▁maximal 1 +▁repris 1 +▁brochure 1 +AIEA 1 +▁précipit 1 +▁Royal 1 +stein 1 +▁convaincre 1 +▁disparaît 1 +▁négocié 1 +▁pesticides 1 +▁déroulé 1 +▁enrichi 1 +IÈRE 1 +▁Tarif 1 +extr 1 +▁Présentation 1 +▁configuration 1 +▁littoral 1 +▁contrepartie 1 +▁agréable 1 +▁filiale 1 +session 1 +▁Carte 1 +▁nommer 1 +algorithme 1 +innocuité 1 +▁Bélarus 1 +▁Technologie 1 +▁bénéfique 1 +▁crédibilité 1 +▁Smith 1 +▁payable 1 +▁laissez 1 +hop 1 +iversification 1 +▁chauffage 1 +▁référendum 1 +▁préventive 1 +▁trouvant 1 +troph 1 +impunité 1 +▁pédagogique 1 +▁retrouvé 1 +▁réservation 1 +▁URL 1 +▁progression 1 +enlèvement 1 +well 1 +▁Produits 1 +▁quiconque 1 +▁flotte 1 +Armée 1 +▁normalisation 1 +pac 1 +− 1 +âme 1 +▁chevauch 1 +▁différemment 1 +▁permanence 1 +▁bataille 1 +▁Water 1 +▁ratifier 1 +▁Sept 1 +▁pareil 1 +▁yougoslave 1 +▁fixation 1 +▁atténuer 1 +▁usées 1 +▁visuel 1 +essor 1 +▁Michel 1 +▁Tru 1 +▁grippe 1 +▁scolarité 1 +▁xénophobie 1 +▁métal 1 +▁Lanka 1 +▁oublier 1 +▁sensibilité 1 +▁planifier 1 +Organisme 1 +▁moléculaire 1 +▁Où 1 +▁club 1 +▁1981 1 +▁normalisé 1 +employ 1 +▁mutation 1 +▁modifie 1 +▁infantile 1 +▁récapitul 1 +▁souscrit 1 +UNE 1 +▁Participation 1 +▁bouche 1 +▁System 1 +▁Venezuela 1 +▁Chris 1 +▁faculté 1 +▁technicien 1 +▁livré 1 +/2007/ 1 +▁perfection 1 +▁paie 1 +▁confortable 1 +hébergement 1 +▁génome 1 +▁pomme 1 +▁conversion 1 +▁exclusive 1 +▁éliminé 1 +▁lendemain 1 +▁retourné 1 +Musique 1 +octobre 1 +▁fruit 1 +▁impliquant 1 +▁Séance 1 +oreille 1 +▁Garde 1 +▁flexibilité 1 +▁néerlandais 1 +▁imposable 1 +▁délicat 1 +▁Élection 1 +▁Invite 1 +▁loisirs 1 +pêche 1 +▁termine 1 +▁Tunisie 1 +color 1 +01-00 1 +EAU 1 +▁triste 1 +▁pénurie 1 +▁archives 1 +▁Appel 1 +▁réfugié 1 +accomplissement 1 +Nouvelle 1 +▁Référence 1 +▁confirmation 1 +▁millénaire 1 +▁répertoire 1 +▁Wood 1 +▁visuelle 1 +▁douze 1 +▁Actuellement 1 +▁Sénégal 1 +▁littéralement 1 +▁accéléré 1 +▁Ghana 1 +▁substitut 1 +▁gère 1 +méditerranéen 1 +▁constructeur 1 +▁précité 1 +▁infirmières 1 +addition 1 +▁évalue 1 +IDE 1 +utodétermination 1 +▁inévitable 1 +▁Contrôle 1 +▁inhérent 1 +▁oriental 1 +▁immobiliers 1 +▁fiabilité 1 +▁Guatemala 1 +▁corrélation 1 +▁maternité 1 +▁récupération 1 +ón 1 +hélicoptère 1 +▁commença 1 +▁SERVICES 1 +▁catalogue 1 +▁asiatique 1 +Éducation 1 +▁instituts 1 +▁ravi 1 +▁Malte 1 +▁actualisé 1 +▁libanais 1 +▁semblait 1 +▁DANS 1 +▁incompatible 1 +▁indépendamment 1 +▁Africa 1 +▁impératif 1 +▁Situation 1 +▁(2005) 1 +CONF 1 +burg 1 +▁généré 1 +Habitat 1 +▁élabore 1 +▁Beijing 1 +▁Combien 1 +▁silence 1 +▁Mots 1 +▁Doha 1 +▁créateur 1 +▁portion 1 +▁suscité 1 +▁Jordanie 1 +▁obtient 1 +▁écho 1 +▁discrétion 1 +▁prenons 1 +Entente 1 +▁Organ 1 +▁roue 1 +▁Index 1 +▁sérieuse 1 +▁vraisemblable 1 +unanimité 1 +▁aînés 1 +▁abordable 1 +▁Jérusalem 1 +▁génocide 1 +ONUDI 1 +▁Global 1 +▁Moldova 1 +▁foncier 1 +▁vétérinaire 1 +▁syrienne 1 +▁publie 1 +section 1 +▁Vérification 1 +▁2001-2002 1 +architecte 1 +▁Quatre 1 +▁rationnelle 1 +▁Puisque 1 +extradition 1 +Quatrième 1 +▁tuberculose 1 +▁cyber 1 +▁présidé 1 +▁prélevé 1 +discrimination 1 +▁prudent 1 +▁déroulement 1 +▁cinéma 1 +▁(2002) 1 +alliance 1 +▁modeste 1 +▁0,5 1 +▁ANNEXE 1 +▁Tanzanie 1 +▁synergie 1 +▁opérateurs 1 +▁conviendrait 1 +▁Super 1 +▁prière 1 +▁Cinquante 1 +▁Réaffirmant 1 +▁formidable 1 +▁réchauffement 1 +▁tabagisme 1 +Organe 1 +▁amène 1 +▁strictement 1 +▁légumes 1 +▁respiratoire 1 +▁vélo 1 +▁fuite 1 +▁écouter 1 +____ 1 +▁légère 1 +▁accessoires 1 +▁exerçant 1 +▁manifesté 1 +▁rejoindre 1 +▁constructive 1 +▁découlent 1 +▁desquelles 1 +▁construis 1 +▁aidant 1 +▁envoie 1 +▁conviennent 1 +▁Photo 1 +▁Aperçu 1 +autoroute 1 +▁bienvenue 1 +▁613- 1 +▁boissons 1 +extraction 1 +iii 1 +ingénierie 1 +▁Données 1 +▁soudain 1 +▁FAO 1 +▁exclusif 1 +▁South 1 +▁propagation 1 +▁surprenant 1 +▁sympa 1 +TURE 1 +▁Council 1 +héritage 1 +▁structurels 1 +▁Livre 1 +extrémité 1 +▁Excellence 1 +▁Laissez 1 +▁sœur 1 +▁aéroports 1 +communication 1 +▁pollu 1 +▁contamination 1 +▁anticipé 1 +▁inciter 1 +Angola 1 +service 1 +▁remplace 1 +▁accumulé 1 +▁suédois 1 +édifice 1 +humain 1 +▁indirectement 1 +atténu 1 +▁Californie 1 +▁Fabrication 1 +▁Gouverneur 1 +▁Népal 1 +▁attiré 1 +habilitation 1 +▁exécutive 1 +▁Bank 1 +▁patron 1 +consult 1 +▁apprécié 1 +▁mémorandum 1 +▁nettoyage 1 +▁athlètes 1 +▁tumeur 1 +▁armements 1 +▁sépare 1 +▁souverain 1 +▁United 1 +▁docteur 1 +▁confère 1 +Commissaire 1 +▁passif 1 +▁Thomas 1 +▁School 1 +allégement 1 +▁Haye 1 +▁gouvern 1 +▁supplément 1 +Uruguay 1 +▁conciliation 1 +▁Contexte 1 +▁exhort 1 +▁immense 1 +▁(2003) 1 +▁acides 1 +........... 1 +▁stipul 1 +▁Maurice 1 +▁Ajout 1 +▁préfère 1 +▁constituait 1 +▁toxicomanie 1 +▁faillite 1 +▁simulation 1 +▁entrevues 1 +accumulation 1 +▁Accès 1 +▁Gazette 1 +▁Regardez 1 +▁exhaustive 1 +▁ordonné 1 +projet 1 +▁renouvelé 1 +▁provient 1 +annuler 1 +Équateur 1 +▁bizarre 1 +▁saoudite 1 +▁Permettez 1 +▁(2006) 1 +▁connecté 1 +aventure 1 +▁constructif 1 +▁éducative 1 +▁fleuve 1 +▁Human 1 +▁Charles 1 +équivalent 1 +animaux 1 +▁Myanmar 1 +▁innovant 1 +entretenir 1 +▁réagi 1 +▁sectorielle 1 +▁minimal 1 +▁matériau 1 +▁adapt 1 +▁énumérés 1 +▁atomique 1 +▁brillant 1 +▁prouvé 1 +▁fabrique 1 +▁XXIe 1 +▁portuaire 1 +▁Établissement 1 +système 1 +occurrence 1 +▁suicide 1 +▁bouteille 1 +▁Street 1 +▁féminin 1 +▁transforme 1 +▁privilégi 1 +▁divergence 1 +▁personnalisé 1 +▁représentatif 1 +▁croyons 1 +▁Ibid 1 +▁Culture 1 +▁enlevé 1 +▁Niveau 1 +▁Nairobi 1 +▁destinataire 1 +▁refléter 1 +▁gare 1 +▁Steve 1 +▁thermique 1 +▁combine 1 +entraide 1 +ñ 1 +▁délibéré 1 +▁Parfois 1 +▁Fond 1 +▁survenus 1 +esclavage 1 +▁merveilleux 1 +▁clandestin 1 +▁bombe 1 +▁cerner 1 +▁caché 1 +▁DEMANDE 1 +▁Frank 1 +▁détruire 1 +▁prévalence 1 +▁générer 1 +▁mutuel 1 +▁Management 1 +▁envahi 1 +document 1 +▁subordonn 1 +avril 1 +▁attaqué 1 +▁convergence 1 +▁explosifs 1 +▁PRÉ 1 +▁accept 1 +affecter 1 +▁Concernant 1 +avertissement 1 +▁desquels 1 +▁certes 1 +▁émotionnel 1 +▁Divers 1 +▁College 1 +▁spirituel 1 +▁diamètre 1 +éprouve 1 +Ø 1 +▁Catégorie 1 +▁batterie 1 +▁muscle 1 +▁barème 1 +▁résidentiel 1 +intro 1 +▁0,2 1 +▁drapeau 1 +▁contractuelle 1 +▁requiert 1 +accréditation 1 +▁Salvador 1 +▁générique 1 +▁panneaux 1 +▁Texte 1 +▁intense 1 +entreposage 1 +▁récit 1 +▁garçon 1 +▁crédible 1 +▁bagage 1 +▁lentement 1 +▁terroriste 1 +▁arme 1 +▁Kazakhstan 1 +▁déployer 1 +▁résidus 1 +▁simplifier 1 +▁inhumains 1 +▁qualifi 1 +▁regrette 1 +▁différend 1 +▁efficient 1 +▁chrétien 1 +APECA 1 +▁infections 1 +▁médiateur 1 +▁circulaire 1 +▁réviser 1 +▁connexe 1 +▁Columbia 1 +▁excessif 1 +▁énormément 1 +▁ingrédients 1 +assure 1 +arrangement 1 +absorption 1 +▁British 1 +▁Finalement 1 +▁cadeau 1 +▁travaillons 1 +excuse 1 +▁évoque 1 +▁devais 1 +▁géant 1 +▁insisté 1 +▁posséder 1 +▁salariale 1 +▁toxicité 1 +▁plateforme 1 +▁consigné 1 +systématiquement 1 +▁orienté 1 +▁inventé 1 +somm 1 +1994 1 +▁Modification 1 +▁2007-2008 1 +▁chèque 1 +▁incluent 1 +▁pandémie 1 +▁ponctuel 1 +▁étonnant 1 +default 1 +▁Syrie 1 +accompagn 1 +exposé 1 +ontrairement 1 +▁clarifier 1 +▁postsecondaire 1 +▁souviens 1 +▁Exemple 1 +▁trouvait 1 +SCIAN 1 +interroge 1 +▁assistant 1 +field 1 +▁Suivant 1 +explosion 1 +▁Parallèlement 1 +▁doctorat 1 +▁fantastique 1 +viendront 1 +▁connaissez 1 +▁connaissons 1 +▁émotions 1 +▁montrant 1 +▁Décennie 1 +▁modélisation 1 +▁poursuivra 1 +affichage 1 +▁venait 1 +▁ISO 1 +▁cherché 1 +cyclo 1 +▁fragile 1 +▁validation 1 +interpréter 1 +▁survivre 1 +▁vapeur 1 +▁Encore 1 +▁devriez 1 +▁décédé 1 +▁Disposition 1 +▁rentabilité 1 +▁verbale 1 +▁apparemment 1 +▁réjouis 1 +▁apprécier 1 +▁prenne 1 +▁philosophie 1 +▁récupérer 1 +▁consolidé 1 +▁visibilité 1 +▁centraux 1 +▁créature 1 +▁guidé 1 +▁Fournir 1 +▁aveugle 1 +empreinte 1 +▁auxiliaire 1 +injection 1 +▁exploitants 1 +▁littérature 1 +▁pouvions 1 +▁simplifié 1 +▁quantitative 1 +▁neutre 1 +▁hebdomadaire 1 +▁octroyé 1 +accessible 1 +▁productive 1 +▁oublié 1 +Vidéo 1 +conseil 1 +dimension 1 +abondance 1 +▁Objet 1 +▁Zimbabwe 1 +▁relance 1 +▁Center 1 +▁modéré 1 +Église 1 +▁Coordonnateur 1 +▁piscine 1 +▁tactique 1 +altitude 1 +▁redressement 1 +▁linéaire 1 +▁vocation 1 +▁denrées 1 +▁estimons 1 +▁monument 1 +▁effectu 1 +▁Engagements 1 +▁Méthode 1 +▁Cliquez 1 +▁présidentielle 1 +▁Normes 1 +▁Petit 1 +▁calibre 1 +▁rédiger 1 +▁contesté 1 +▁fidèle 1 +▁minéraux 1 +▁aspirations 1 +▁publicitaire 1 +▁rentrer 1 +▁pauvre 1 +institut 1 +écriture 1 +▁corrigé 1 +▁détérioration 1 +▁magnétique 1 +▁Qatar 1 +▁Croix 1 +▁ultime 1 +▁geste 1 +▁chaussures 1 +▁Souligne 1 +▁comptait 1 +économiste 1 +Islande 1 +provincial 1 +▁Collège 1 +▁galaxie 1 +▁reproduire 1 +▁animé 1 +▁Mandat 1 +psych 1 +▁suspens 1 +▁essayons 1 +▁multinationale 1 +▁champignon 1 +▁Central 1 +▁survivant 1 +▁désertification 1 +▁facilitation 1 +▁instauré 1 +▁perturbation 1 +▁consultez 1 +▁Berlin 1 +▁Observations 1 +▁desservi 1 +▁brièvement 1 +▁brève 1 +▁libérer 1 +▁maïs 1 +▁démarrage 1 +aquaculture 1 +▁influencé 1 +▁macroéconomique 1 +▁déploie 1 +▁apparaissent 1 +ã 1 +▁cohérent 1 +▁nutritionnel 1 +▁Network 1 +▁précaution 1 +ï 1 +▁minéral 1 +gouvernement 1 +imagination 1 +▁Copenhague 1 +▁maintenance 1 +▁institué 1 +▁détient 1 +▁spatial 1 +▁souffrant 1 +▁précédant 1 +clamation 1 +▁Utilisation 1 +▁légitimité 1 +▁regroupé 1 +▁Business 1 +▁métallique 1 +▁diffuse 1 +enzyme 1 +ology 1 +▁Présidence 1 +▁réduisant 1 +▁affiliée 1 +▁Bolivie 1 +▁ramener 1 +impulsion 1 +▁compromettre 1 +développement 1 +Érythrée 1 +ˆ 1 +▁réclame 1 +apparence 1 +▁plonge 1 +▁spec 1 +▁couvrant 1 +▁renforçant 1 +▁unilatérale 1 +▁cheval 1 +▁dîner 1 +enjeu 1 +▁cancér 1 +▁usagers 1 +▁attire 1 +▁consécutive 1 +▁cérébral 1 +▁tunnel 1 +▁productif 1 +attrape 1 +# 1 +▁flexible 1 +▁puissions 1 +interruption 1 +▁jouissent 1 +▁convoqué 1 +▁demandait 1 +▁lycée 1 +▁contaminants 1 +▁pathogène 1 +▁Formulaire 1 +▁Conscient 1 +▁interculturel 1 +▁revendiqu 1 +▁refroidi 1 +▁pompe 1 +▁spectaculaire 1 +▁céréales 1 +▁imputable 1 +▁pensait 1 +eizième 1 +glyc 1 +▁dimanche 1 +▁festival 1 +▁baleine 1 +▁joie 1 +▁pâte 1 +▁CONSEIL 1 +▁PARTIE 1 +▁signataires 1 +▁transfrontalier 1 +▁Recueil 1 +▁Balkans 1 +▁recruter 1 +▁appartiennent 1 +▁biomasse 1 +▁contradiction 1 +▁soulignant 1 +▁Précédent 1 +ébauche 1 +▁chimie 1 +attestation 1 +▁Cameroun 1 +▁Noël 1 +▁Stephen 1 +▁attentivement 1 +▁superviseur 1 +obésité 1 +▁CANADIEN 1 +▁pharmacie 1 +▁terrasse 1 +▁coalition 1 +affection 1 +▁Liechtenstein 1 +▁engendre 1 +Instance 1 +▁quinze 1 +▁Amélioration 1 +▁congrès 1 +▁rembourser 1 +▁végétation 1 +▁Work 1 +amorce 1 +▁Windows 1 +▁douanier 1 +▁Pensez 1 +▁samedi 1 +▁entamé 1 +▁Stockholm 1 +▁félicitons 1 +▁musulmans 1 +▁rupture 1 +▁Black 1 +▁entourant 1 +▁Daniel 1 +▁pain 1 +▁ultérieur 1 +▁Facebook 1 +▁Women 1 +animation 1 +▁tuyau 1 +▁Engage 1 +▁poursuivent 1 +▁succession 1 +î 1 +▁entouré 1 +α 1 +▁merveilleuse 1 +▁Traitement 1 +▁novateur 1 +affiche 1 +▁bétail 1 +▁possédant 1 +▁victoire 1 +espérance 1 +ificateur 1 +étoile 1 +▁Enregistrement 1 +▁précurseur 1 +Occident 1 +▁acquitté 1 +▁navigable 1 +▁soufre 1 +▁Améliorer 1 +▁Cambodge 1 +▁onzième 1 +Histoire 1 +▁Strasbourg 1 +▁antidumping 1 +▁endommagé 1 +▁gagnant 1 +▁thérapeutiques 1 +▁semestre 1 +▁raciste 1 +instabilité 1 +▁honte 1 +▁RAPPORT 1 +▁frontaliers 1 +▁marquage 1 +▁préjudiciable 1 +▁stimulant 1 +▁trimestriel 1 +▁prévoyait 1 +▁clarté 1 +▁indigènes 1 +▁prospère 1 +▁achète 1 +émergence 1 +▁estimatif 1 +embryon 1 +▁Microsoft 1 +▁Méditerranée 1 +▁immigré 1 +▁excédentaire 1 +▁injuste 1 +▁rassemblé 1 +▁Province 1 +▁soigneusement 1 +▁Modifier 1 +▁musicale 1 +▁améliorant 1 +▁municipaux 1 +▁règne 1 +▁Joseph 1 +▁représentaient 1 +▁procure 1 +conférence 1 +▁Mécanisme 1 +▁australien 1 +▁félicitant 1 +▁mammifères 1 +▁policière 1 +invasion 1 +▁gardien 1 +immigrant 1 +▁accrédité 1 +▁dégagé 1 +▁traduis 1 +▁terminant 1 +entrepôt 1 +▁rénovation 1 +▁réparer 1 +vingt 1 +▁battre 1 +éthane 1 +▁prudence 1 +▁désastre 1 +▁éclat 1 +▁portail 1 +▁persiste 1 +Traduction 1 +▁poumon 1 +privé 1 +▁pharmaco 1 +alphabétisation 1 +▁Transfert 1 +▁comprenait 1 +▁pilotage 1 +▁Changement 1 +▁Français 1 +▁Procédure 1 +▁insectes 1 +▁rapatriement 1 +optimiser 1 +▁sénateur 1 +▁grève 1 +` 1 +émetteur 1 +▁illégal 1 +▁divise 1 +▁OTTAWA 1 +▁fascinant 1 +évènement 1 +▁rapprochement 1 +▁refuge 1 +▁radiation 1 +Atelier 1 +▁Renforcement 1 +▁ambitieux 1 +▁certitude 1 +Alzheimer 1 +▁collaborateurs 1 +▁flagrant 1 +▁ambiant 1 +investigation 1 +Ouzbékistan 1 +▁Burkina 1 +▁Festival 1 +▁combustion 1 +autrui 1 +attirer 1 +▁législateur 1 +▁General 1 +▁amusant 1 +▁deviendra 1 +inconvénient 1 +× 1 +▁percevoir 1 +IFICATION 1 +▁Department 1 +▁aléatoire 1 +▁marchande 1 +▁résiduel 1 +▁télécharger 1 +▁Scott 1 +▁infligé 1 +▁dramatique 1 +▁nominal 1 +aluminium 1 +transfrontalière 1 +▁COMMISSION 1 +▁immunitaire 1 +écrivain 1 +▁Power 1 +anomalie 1 +▁ordonne 1 +▁Prestation 1 +▁Profil 1 +enlever 1 +Islam 1 +Ç 1 +Administrateur 1 +▁dénommé 1 +▁hectare 1 +▁coïncid 1 +▁Priorité 1 +ouillé 1 +▁dégâts 1 +▁portugais 1 +▁suspendre 1 +▁énumérées 1 +▁Mettr 1 +entamer 1 +▁salubrité 1 +▁tangible 1 +▁cheveux 1 +▁commandé 1 +▁Rights 1 +▁Surveillance 1 +▁synthétique 1 +▁jouir 1 +▁Session 1 +▁Visite 1 +▁Structure 1 +▁composite 1 +▁précédé 1 +▁meurent 1 +nouvelle 1 +figure 1 +▁Prairies 1 +▁défaillance 1 +▁automatisé 1 +▁HTML 1 +▁croyez 1 +▁nôtre 1 +7,5 1 +▁affaibli 1 +Ancien 1 +▁béton 1 +▁entretenu 1 +viendrait 1 +amitié 1 +avortement 1 +aggrave 1 +▁Situé 1 +▁favori 1 +éthanol 1 +▁Responsabilité 1 +▁gratitude 1 +▁prototype 1 +▁remboursé 1 +extinction 1 +▁Food 1 +▁Soixante 1 +▁imprévu 1 +▁rattaché 1 +▁colloque 1 +▁dividende 1 +▁patrouille 1 +▁Réaffirme 1 +▁ruisseau 1 +▁retire 1 +effectue 1 +Infrastructure 1 +analyste 1 +▁pétrolière 1 +▁remboursable 1 +▁reddition 1 +▁épuisé 1 +▁Classification 1 +▁Nicaragua 1 +▁Dossier 1 +▁favorisé 1 +irrégularité 1 +évacuation 1 +▁réciproque 1 +▁simplification 1 +Entreprise 1 +▁Airlines 1 +▁caution 1 +accumule 1 +▁contracté 1 +▁phoque 1 +insertion 1 +▁authentique 1 +▁semences 1 +▁prescription 1 +Amsterdam 1 +enthousiasme 1 +▁invisible 1 +▁représentait 1 +▁1999-2000 1 +▁Museum 1 +phényl 1 +▁tierce 1 +▁Métis 1 +apprenant 1 +Indien 1 +▁qualitative 1 +▁représentative 1 +▁spécificité 1 +▁consistait 1 +▁Olympique 1 +▁démobilisation 1 +▁persistance 1 +▁plongé 1 +▁Fraser 1 +▁cartographie 1 +▁Tchad 1 +▁Création 1 +▁anglophone 1 +▁empêché 1 +▁irlandais 1 +▁jouissance 1 +embargo 1 +Effect 1 +▁terminal 1 +▁Philip 1 +▁trajet 1 +▁ventilation 1 +▁permettait 1 +▁détecté 1 +▁thermo 1 +automobile 1 +▁doctrine 1 +▁subdivision 1 +′ 1 +ć 1 +о 1 +Ô 1 +ú 1 +¢ 1 +š 1 +č 1 +е 1 +а 1 +Å 1 +и 1 +β 1 +Ö 1 +ο 1 +Î 1 +À 1 +ø 1 +н 1 +т 1 +■ 1 +й 1 +÷ 1 +å 1 +Ž 1 +⁄ 1 +Á 1 +с 1 +ι 1 +ς 1 +р 1 +ν 1 +π 1 +σ 1 +“ 1 +τ 1 +æ 1 +в 1 +ε 1 +Œ 1 +ρ 1 +Š 1 +≤ 1 +√ 1 +Õ 1 +ß 1 +κ 1 +∗ 1 +л 1 +ل 1 +ž 1 +Δ 1 +ا 1 +£ 1 +ł 1 +≥ 1 +¡ 1 +ì 1 +м 1 +^ 1 +γ 1 +к 1 +Û 1 +→ 1 +¶ 1 +λ 1 +† 1 +η 1 +¿ 1 +ı 1 +ί 1 +д 1 +Ä 1 +С 1 +ý 1 +Ï 1 +δ 1 +у 1 +ό 1 +ي 1 +Ο 1 +п 1 +Ü 1 +● 1 +ù 1 +ò 1 +¤ 1 +› 1 +Ó 1 +ę 1 +ė 1 +я 1 +ş 1 +ر 1 +õ 1 +Č 1 +ـ 1 +̄ 1 +ă 1 +‚ 1 +ÿ 1 +Π 1 +― 1 +ā 1 +、 1 +Ł 1 +б 1 +υ 1 +□ 1 +ы 1 +г 1 +ń 1 +ع 1 +θ 1 +ω 1 +ь 1 +م 1 +ت 1 +Τ 1 +Í 1 +► 1 +َ 1 +ą 1 +ī 1 +ة 1 +Σ 1 +ř 1 +Ñ 1 +ð 1 +ŕ 1 +ч 1 +„ 1 +Ë 1 +‡ 1 +ƒ 1 +ή 1 +ب 1 +ن 1 +ū 1 +د 1 +¥ 1 +ά 1 +─ 1 +ś 1 +ж 1 +ف 1 +و 1 +В 1 +¦ 1 +х 1 +⎯ 1 +ᑦ 1 +ق 1 +ż 1 +ц 1 +Ý 1 +Α 1 +ţ 1 +Ù 1 +Ú 1 +Ђ 1 +‹ 1 +χ 1 +ώ 1 +έ 1 +Þ 1 +ю 1 +Ş 1 +Р 1 +ň 1 +ύ 1 +ē 1 +ʼ 1 +Ÿ 1 +Æ 1 +ě 1 +ő 1 +ǫ 1 +ِ 1 +Ò 1 +ʹ 1 +Κ 1 +ᐅ 1 +Ε 1 +þ 1 +Ω 1 +ᐃ 1 +Ð 1 +ľ 1 +̊ 1 +أ 1 +⇒ 1 +ᒃ 1 +¬ 1 +٠ 1 +ų 1 +ш 1 +غ 1 +⌦ 1 +Μ 1 +ج 1 +ْ 1 +Φ 1 +ґ 1 +ك 1 +≠ 1 +◗ 1 +خ 1 +Ì 1 +ᖃ 1 +ᓄ 1 +١ 1 +٢ 1 +Т 1 +ض 1 +ᑐ 1 +∑ 1 +国 1 +Λ 1 +Ś 1 +➧ 1 +і 1 +ᑕ 1 +П 1 +· 1 +́ 1 +的 1 +ɔ 1 +ť 1 +Θ 1 +Ģ 1 +Ţ 1 +ź 1 +، 1 +س 1 +إ 1 +İ 1 +ّ 1 +ᓯ 1 +ᕐ 1 +ᑎ 1 +。 1 +法 1 +Γ 1 +ɛ 1 +Ă 1 +ɶ 1 +Ν 1 +⋅ 1 +М 1 +э 1 +ط 1 +亚 1 +会 1 +• 1 +尔 1 +利 1 +ъ 1 +ů 1 +Η 1 +ᓂ 1 +❒ 1 +Ő 1 +ʔ 1 +≡ 1 +ξ 1 +ф 1 +К 1 +ᓗ 1 +ᖅ 1 +大 1 +兰 1 +О 1 +Ċ 1 +ō 1 +ش 1 +ُ 1 +Ż 1 +ї 1 +ᓕ 1 +▲ 1 +✓ 1 +❏ 1 +〈 1 +글 1 +한 1 +А 1 +Н 1 +ᓇ 1 +ᓐ 1 +年 1 +和 1 +事 1 +٩ 1 +į 1 +ċ 1 +ζ 1 +Ќ 1 +ذ 1 +ħ 1 +Ľ 1 +ψ 1 +Ē 1 +Ğ 1 +ȇ 1 +̂ 1 +̱ 1 +Б 1 +ه 1 +٤ 1 +٥ 1 +ᒥ 1 +ᖓ 1 +※ 1 +← 1 +∞ 1 +❑ 1 +❚ 1 +อ 1 +ᕆ 1 +ز 1 +尼 1 +一 1 +提 1 +在 1 +不 1 +上 1 +各 1 +巴 1 +加 1 +ё 1 +ј 1 +٣ 1 +‟ 1 + 1 +Ġ 1 +ʺ 1 +ˇ 1 +̍ 1 +Ά 1 +٦ 1 +∼ 1 +❖ 1 +➟ 1 +Ń 1 +Д 1 +ᐊ 1 +ᖏ 1 +ᒪ 1 +ᓪ 1 +阿 1 +北 1 +拉 1 +了 1 +合 1 +关 1 +由 1 +编 1 +为 1 +机 1 +主 1 +并 1 +对 1 +布 1 +任 1 +制 1 +牙 1 +表 1 +塞 1 +斯 1 +ظ 1 +٨ 1 +ย 1 +ĕ 1 +ű 1 +ᓈ 1 +’ 1 +Ė 1 +Ρ 1 +ح 1 +ى 1 +พ 1 +ศ 1 +่ 1 +ᑭ 1 +ᒋ 1 +ᓚ 1 +ᔪ 1 +↓ 1 +└ 1 +ル 1 +ー 1 +比 1 +马 1 +년 1 +Ą 1 +И 1 +ص 1 +及 1 +联 1 +第 1 +日 1 +我 1 +介 1 +用 1 +于 1 +作 1 +出 1 +员 1 +要 1 +发 1 +式 1 +文 1 +致 1 +秘 1 +个 1 +书 1 +埃 1 +本 1 +俄 1 +伊 1 +罗 1 +鲁 1 +瓜 1 +Е 1 +ท 1 +∂ 1 +首 1 +ď 1 +­ 1 +ư 1 +̨ 1 +Й 1 +ث 1 +Ⴑ 1 +ᑲ 1 +ᒻ 1 +ᕗ 1 +ᖕ 1 +ờ 1 +↑ 1 +╚ 1 +╩ 1 +▬ 1 +➥ 1 +➾ 1 +サ 1 +下 1 +定 1 +报 1 +施 1 +民 1 +玩 1 +站 1 +章 1 +过 1 +通 1 +ћ 1 +ᕋ 1 +行 1 +乌 1 +西 1 +克 1 +以 1 +与 1 +所 1 +面 1 +高 1 +其 1 +力 1 +♫ 1 +诠 1 +译 1 +理 1 +犯 1 +爱 1 +权 1 +律 1 +弃 1 +号 1 +厅 1 +做 1 +伯 1 +众 1 +中 1 +☐ 1 +ệ 1 +ᒧ 1 +ᑯ 1 +ᐱ 1 +ร 1 +Э 1 +Џ 1 +ƴ 1 +Ř 1 +ļ 1 +Ě 1 +票 1 +死 1 +刑 1 +❍ 1 +ế 1 +З 1 +̇ 1 +ʾ 1 +Ů 1 +ķ 1 +Đ 1 +规 1 +务 1 +则 1 +决 1 +・ 1 +写 1 +官 1 +必 1 +持 1 +搁 1 +耽 1 +Љ 1 +Ѓ 1 +Ι 1 +◊ 1 +适 1 +ᕕ 1 +Β 1 +Ћ 1 +Υ 1 +套 1 +工 1 +料 1 +材 1 +现 1 +绍 1 +ȣ 1 +议 1 +✤ 1 +Њ 1 +他 1 +免 1 +避 1 +ƙ 1 +≈ 1 +ᓴ 1 +◆ 1 +们 1 +供 1 +保 1 +前 1 +口 1 +另 1 +外 1 +头 1 +府 1 +政 1 +正 1 +确 1 +简 1 +语 1 +щ 1 +̃ 1 +✔ 1 +ў 1 +公 1 +处 1 +有 1 +构 1 +组 1 +织 1 +间 1 +đ 1 +⌫ 1 +匈 1 +卡 1 +厄 1 +古 1 +坦 1 +基 1 +果 1 +萄 1 +葡 1 +◄ 1 +买 1 +印 1 +塔 1 +多 1 +安 1 +度 1 +廷 1 +德 1 +意 1 +朗 1 +根 1 +纳 1 +芬 1 +道 1 +∆ 1 +ѓ 1 +执 1 +昨 1 +被 1 +І 1 +Ф 1 +ต 1 +า 1 +ิ 1 +์ 1 +仁 1 +今 1 +席 1 +毛 1 +纪 1 +ϊ 1 +Л 1 +向 1 +念 1 +Į 1 +ǎ 1 +ǐ 1 +ữ 1 +赞 1 +| 1 + 1 +Ā 1 +Ę 1 +Ħ 1 +Ī 1 +ĺ 1 +Ļ 1 +Ņ 1 +ņ 1 +Ň 1 +Ō 1 +Ū 1 +Ų 1 +ŷ 1 +ơ 1 +Ƴ 1 +ɲ 1 +̀ 1 +̆ 1 +̐ 1 +̓ 1 +Ψ 1 +Ч 1 +Ш 1 +Ъ 1 +ғ 1 +ұ 1 +ט 1 +ء 1 +ً 1 +ٱ 1 +प 1 +म 1 +र 1 +े 1 +् 1 +ง 1 +ถ 1 +น 1 +ว 1 +ั 1 +ี 1 +ึ 1 +ᄅ 1 +ᐸ 1 +ᑖ 1 +ᒫ 1 +ᓅ 1 +ᓖ 1 +ᔨ 1 +ᔭ 1 +ᔾ 1 +ᕈ 1 +ᕌ 1 +ᕙ 1 +Ẕ 1 +ạ 1 +ầ 1 +ẹ 1 +ọ 1 +ớ 1 +ứ 1 +‛ 1 +↔ 1 +↵ 1 +∕ 1 +∫ 1 +⊂ 1 +⊕ 1 +⌃ 1 +⌘ 1 +⌠ 1 +⌧ 1 +★ 1 +☺ 1 +♀ 1 +♂ 1 +✕ 1 +✜ 1 +✢ 1 +➔ 1 +➢ 1 +➪ 1 +➯ 1 +『 1 +』 1 +【 1 +】 1 +の 1 +ア 1 +オ 1 +カ 1 +ス 1 +ド 1 +レ 1 +ン 1 +举 1 +予 1 +五 1 +付 1 +伏 1 +伝 1 +你 1 +例 1 +先 1 +八 1 +共 1 +典 1 +内 1 +况 1 +刘 1 +刚 1 +動 1 +午 1 +南 1 +去 1 +反 1 +台 1 +吉 1 +告 1 +商 1 +园 1 +圆 1 +坚 1 +堂 1 +如 1 +实 1 +希 1 +干 1 +开 1 +录 1 +形 1 +情 1 +成 1 +拜 1 +放 1 +晚 1 +智 1 +東 1 +架 1 +格 1 +案 1 +梶 1 +次 1 +气 1 +沙 1 +津 1 +浦 1 +添 1 +澳 1 +王 1 +球 1 +瑞 1 +産 1 +疆 1 +线 1 +美 1 +群 1 +耀 1 +肯 1 +腊 1 +葱 1 +见 1 +記 1 +记 1 +贝 1 +达 1 +运 1 +迪 1 +送 1 +達 1 +邦 1 +防 1 +院 1 +隆 1 +Ć 1 +明 1 +ᒐ 1 +パ 1 +リ 1 +山 1 +ϋ 1 +ᑑ 1 +ᖑ 1 +危 1 +地 1 +є 1 +ѕ 1 +љ 1 +京 1 +名 1 +复 1 +最 1 +核 1 +经 1 +丹 1 +列 1 +宁 1 +来 1 +桑 1 +泊 1 +特 1 +荷 1 +莫 1 +▼ 1 +━ 1 +φ 1 +方 1 +Є 1 +➤ 1 +ğ 1 +з 1 +参 1 +将 1 +按 1 +授 1 +新 1 +是 1 +更 1 +活 1 +照 1 +综 1 +○ 1 +∙ 1 +̧ 1 +♦ 1 +动 1 +努 1 +委 1 +尤 1 +效 1 +率 1 +Ё 1 +♪ 1 +̈ 1 +▪ 1 +◦ 1 +月 1 +<mask> 1 diff --git a/SpeechUT/dataset/MuSTC/en_fr/spm_unigram10000.model b/SpeechUT/dataset/MuSTC/en_fr/spm_unigram10000.model new file mode 100644 index 0000000000000000000000000000000000000000..43cfd14648388420a61c1d45f522667ea5318019 GIT binary patch literal 410452 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Ɍ*?xh^RW<%u@uV?`~P;9{jNEBz7g)Y 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 zKmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T z|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V z|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd z|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT- z|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U z{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va z`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz z>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs< zr~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24a zpZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>Hkmv zfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w z|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>! z|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^ z|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv z|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y z{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ< z^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs<r~g0w|LOlv|9|@b z)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~Cz 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 z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ 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 z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G z0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLaw zq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V z0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?W zL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz z1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$ zhz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c z1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh z5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC? z4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1 zAR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ( z8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2 zKs1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4Immo zG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4 zfM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCF zXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks118 z0MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G 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 zG=R|nMgtfPU^IZy07e5C4PZ2Y(EvsR7!6=FfYAW<f3=?mFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0RR5aUMO_@KmOx*cX*x0@z>$%i{ruJ`*_Fy^dHCn?C_=C@gF~? z`TY0){BQnm-oF3GJOB6pzjr+FT>tBj`mg8w-yi(H{*Mp--~Y!4|HXs<_J8o9|M8Un zzjr+Nk7xSd9{k5M{kQ+)fBlgE<(>cfA^-J(5BcULu7BTr|LgEv-+VXu@0%}6|Gp{k z|9z7O|NAC#`}a)^^6$yt1O7ev<oEB%pZtGMYQ%p}lA3={Zo>Wd<Ss$SkN?xZXRp~f z{(Fb3VE>+d`uX>)Xm@;Zh<5%xs|5bNc>Vt0i;JQEUR-th_u^8G!>{GVMGwb+=kV9c ze=j}<|9g>P|9cU8{d-Xl{d@T@eyd;Hu>0@DolgH=+`97b#r+@uUR|*M_v%XIzgL%L z{=NEM;oqx2eE(jV0RLXyiU04_ec}IJ-QeNylmCA!xPu#sVHgO4`3FMEG8X%}#5#nl z{SbQDf?$Z`^w0yZH&~_cCm@5uZ$)Eo2m_7G-$)mYd$=*T+879HzTPqX>J8I%!=ci` zDlJCP66;$^YfIW|^;@lmqE$h*ek>u_+I~E5e_LBN?UtvuWh!d9NIEcXht|`Pd^={& zJ0@~FeCQnpuMXEyk8)3NV2_Ka$B;!2yKNUc>;gMo#G^|#>FR~M3exV!clJWZy%=jR Ph|)_v?<Jr0s>S{R$ywol literal 0 HcmV?d00001 diff --git a/SpeechUT/speechut/__init__.py b/SpeechUT/speechut/__init__.py new file mode 100644 index 0000000..97327d2 --- /dev/null +++ b/SpeechUT/speechut/__init__.py @@ -0,0 +1 @@ +from . import data, tasks, criterions, models diff --git a/SpeechUT/speechut/config/finetune_asr/speechut_base_100h.yaml b/SpeechUT/speechut/config/finetune_asr/speechut_base_100h.yaml new file mode 100644 index 0000000..736c3c7 --- /dev/null +++ b/SpeechUT/speechut/config/finetune_asr/speechut_base_100h.yaml @@ -0,0 +1,101 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 100 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1 + keep_last_epochs: 1 + keep_best_checkpoints: 5 + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: false # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: true + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1300000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 40000 + lr: [0.00001] + sentence_avg: true + update_freq: [2] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechut_asr + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechUT/speechut/config/finetune_asr/speechut_large_100h.yaml b/SpeechUT/speechut/config/finetune_asr/speechut_large_100h.yaml new file mode 100644 index 0000000..7cbc59e --- /dev/null +++ b/SpeechUT/speechut/config/finetune_asr/speechut_large_100h.yaml @@ -0,0 +1,102 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 100 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1 + keep_last_epochs: 5 + keep_best_checkpoints: 5 + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 16 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: true # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: true + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1300000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 40000 + lr: [0.00001] + sentence_avg: true + update_freq: [2] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechut_asr + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechUT/speechut/config/finetune_asr/speechut_large_960h.yaml b/SpeechUT/speechut/config/finetune_asr/speechut_large_960h.yaml new file mode 100644 index 0000000..f10d600 --- /dev/null +++ b/SpeechUT/speechut/config/finetune_asr/speechut_large_960h.yaml @@ -0,0 +1,100 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 100 + tensorboard_logdir: tblog + +checkpoint: + save_interval: 1 + keep_last_epochs: 5 + keep_best_checkpoints: 5 + best_checkpoint_metric: dec_accuracy + maximize_best_checkpoint_metric: true + restore_file: checkpoint_last.pt + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 24 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: joint_sc2t_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: true # must be consistent with pre-training + labels: ["ltr"] + store_labels: true + single_target: true + add_decoder_target: true + pad_audio: false + random_crop: true + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 0 + max_tokens: 1300000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_960 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc_ce + zero_infinity: true + +optimization: + max_update: 40000 + lr: [0.00001] + sentence_avg: true + update_freq: [2] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: speechut_asr + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.25 + mask_channel_length: 64 + layerdrop: 0.0 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechUT/speechut/config/pretrain/speechut_base_librispeech.yaml b/SpeechUT/speechut/config/pretrain/speechut_base_librispeech.yaml new file mode 100644 index 0000000..6a3751f --- /dev/null +++ b/SpeechUT/speechut/config/pretrain/speechut_base_librispeech.yaml @@ -0,0 +1,153 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 4 + keep_last_epochs: 4 + save_interval_updates: 50000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 50000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_port: -1 + distributed_world_size: 32 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + store_labels: true + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: false # must be consistent with extractor + add_decoder_target: true + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.5 + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: speechut_criterion + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + u2t_ed_weight: 0.1 + u2t_ctc_weight: 0.1 + text_mum_weight: 0.5 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: speechut + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + activation_fn: "gelu" + encoder_layers: 6 + encoder_attention_heads: 8 + encoder_layerdrop: 0.0 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_unit_encoder: true + add_text_ctc: true + mask_u2t: false + mix_with_unit: true + add_decoder: true + reset_decoder_embedding_config: true + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + max_source_positions: 3000 + max_target_positions: 3000 + no_scale_embedding: true + layernorm_embedding: true + no_token_positional_embeddings: false + share_decoder_input_output_embed: false + encoder: + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 8 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + decoder: + layerdrop: 0.1 + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 12 + normalize_before: false + learned_pos: false + output_dim: 768 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechUT/speechut/config/pretrain/speechut_large_librilight.yaml b/SpeechUT/speechut/config/pretrain/speechut_large_librilight.yaml new file mode 100644 index 0000000..849c1d9 --- /dev/null +++ b/SpeechUT/speechut/config/pretrain/speechut_large_librilight.yaml @@ -0,0 +1,159 @@ +# @package _group_ + +common: + fp16: true + fp16_scale_tolerance: 0.1 # alleviate fp16 overflow issue + log_format: json + log_interval: 200 + seed: 1234 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 1 + keep_last_epochs: 4 + save_interval_updates: 10000 + keep_interval_updates: -1 + keep_interval_updates_pattern: 10000 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_port: -1 + distributed_world_size: 128 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: joint_sc2t_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + store_labels: true + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: true # must be consistent with extractor + add_decoder_target: true + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.4 + +dataset: + num_workers: 6 + max_tokens: 900000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 2 + +criterion: + _name: speechut_criterion + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + u2t_ed_weight: 0.1 + u2t_ctc_weight: 0.1 + text_mum_weight: 0.5 + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 1.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + end_learning_rate: 0.00015 # for future longger pre-training, e.g. 600K step + +model: + _name: speechut + label_rate: ??? + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: layer_norm + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 768 + activation_fn: "gelu" + encoder_layers: 12 + encoder_attention_heads: 16 + encoder_layerdrop: 0.0 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + layer_norm_first: true + feature_grad_mult: 1.0 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + add_unit_encoder: true + add_text_ctc: true + mask_u2t: false + mix_with_unit: true + add_decoder: true + reset_decoder_embedding_config: true + scaling_for_att: 32 # alleviate fp16 overflow issue + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + max_source_positions: 3000 + max_target_positions: 3000 + no_scale_embedding: true + layernorm_embedding: true + no_token_positional_embeddings: true + share_decoder_input_output_embed: false + encoder: + embed_dim: 1024 + ffn_embed_dim: 4096 + layers: 12 + attention_heads: 16 + normalize_before: false + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + decoder: + layerdrop: 0.1 + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 12 + normalize_before: false + learned_pos: false + output_dim: 768 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/SpeechUT/speechut/criterions/__init__.py b/SpeechUT/speechut/criterions/__init__.py new file mode 100644 index 0000000..2bf9fac --- /dev/null +++ b/SpeechUT/speechut/criterions/__init__.py @@ -0,0 +1,9 @@ +import importlib +import os + +for file in os.listdir(os.path.dirname(__file__)): + if file.endswith(".py") and not file.startswith("_"): + criterion_name = file[: file.find(".py")] + importlib.import_module( + "speechut.criterions." + criterion_name + ) diff --git a/SpeechUT/speechut/criterions/ctc_ce.py b/SpeechUT/speechut/criterions/ctc_ce.py new file mode 100644 index 0000000..aab6c9d --- /dev/null +++ b/SpeechUT/speechut/criterions/ctc_ce.py @@ -0,0 +1,414 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import math +from argparse import Namespace +from dataclasses import dataclass, field +from omegaconf import II +from typing import Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass +from fairseq.data.data_utils import post_process +from fairseq.tasks import FairseqTask +from fairseq.logging.meters import safe_round + + +@dataclass +class CtcCeCriterionConfig(FairseqDataclass): + zero_infinity: bool = field( + default=False, + metadata={"help": "zero inf loss when source length <= target length"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + post_process: str = field( + default="letter", + metadata={ + "help": "how to post process predictions into words. can be letter, " + "wordpiece, BPE symbols, etc. " + "See fairseq.data.data_utils.post_process() for full list of options" + }, + ) + wer_kenlm_model: Optional[str] = field( + default=None, + metadata={ + "help": "if this is provided, use kenlm to compute wer (along with other wer_* args)" + }, + ) + wer_lexicon: Optional[str] = field( + default=None, + metadata={"help": "lexicon to use with wer_kenlm_model"}, + ) + wer_lm_weight: float = field( + default=2.0, + metadata={"help": "lm weight to use with wer_kenlm_model"}, + ) + wer_word_score: float = field( + default=-1.0, + metadata={"help": "lm word score to use with wer_kenlm_model"}, + ) + + wer_args: Optional[str] = field( + default=None, + metadata={ + "help": "DEPRECATED: tuple of (wer_kenlm_model, wer_lexicon, wer_lm_weight, wer_word_score)" + }, + ) + + dec_weight: float = field( + default=0.5, + metadata={"help": "weights for decoder CE Loss, loss will be ((1 - dec_weight) * hubert_loss + dec_weight * CE_Loss)"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.1, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + + +@register_criterion("ctc_ce", dataclass=CtcCeCriterionConfig) +class CtcCeCriterion(FairseqCriterion): + def __init__(self, cfg: CtcCeCriterionConfig, task: FairseqTask): + super().__init__(task) + self.blank_idx = ( + task.target_dictionary.index(task.blank_symbol) + if hasattr(task, "blank_symbol") + else 0 + ) + self.pad_idx = task.target_dictionary.pad() + self.eos_idx = task.target_dictionary.eos() + self.post_process = cfg.post_process + + if cfg.wer_args is not None: + ( + cfg.wer_kenlm_model, + cfg.wer_lexicon, + cfg.wer_lm_weight, + cfg.wer_word_score, + ) = eval(cfg.wer_args) + + if cfg.wer_kenlm_model is not None: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + dec_args = Namespace() + dec_args.nbest = 1 + dec_args.criterion = "ctc" + dec_args.kenlm_model = cfg.wer_kenlm_model + dec_args.lexicon = cfg.wer_lexicon + dec_args.beam = 50 + dec_args.beam_size_token = min(50, len(task.target_dictionary)) + dec_args.beam_threshold = min(50, len(task.target_dictionary)) + dec_args.lm_weight = cfg.wer_lm_weight + dec_args.word_score = cfg.wer_word_score + dec_args.unk_weight = -math.inf + dec_args.sil_weight = 0 + + self.w2l_decoder = W2lKenLMDecoder(dec_args, task.target_dictionary) + else: + self.w2l_decoder = None + + self.zero_infinity = cfg.zero_infinity + self.sentence_avg = cfg.sentence_avg + + self.dec_weight = cfg.dec_weight + self.report_accuracy = cfg.report_accuracy + self.ignore_prefix_size = cfg.ignore_prefix_size + self.eps = cfg.label_smoothing + + def forward(self, model, sample, reduce=True): + net_output = model(**sample["net_input"]) + lprobs = model.get_normalized_probs( + net_output, log_probs=True + ).contiguous() # (T, B, C) from the encoder + + if "src_lengths" in sample["net_input"]: + input_lengths = sample["net_input"]["src_lengths"] + else: + if net_output["padding_mask"] is not None: + non_padding_mask = ~net_output["padding_mask"] + input_lengths = non_padding_mask.long().sum(-1) + else: + input_lengths = lprobs.new_full( + (lprobs.size(1),), lprobs.size(0), dtype=torch.long + ) + + pad_mask = (sample["target"] != self.pad_idx) & ( + sample["target"] != self.eos_idx + ) + targets_flat = sample["target"].masked_select(pad_mask) + if "target_lengths" in sample: + target_lengths = sample["target_lengths"] + else: + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction="sum", + zero_infinity=self.zero_infinity, + ) + + ntokens = ( + sample["ntokens"] if "ntokens" in sample else target_lengths.sum().item() + ) + + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + + logging_output = {} + if "decoder_target" in sample: + if net_output["decoder_out"] is not None: + dec_sample_size = sample["target"].size(0) if self.sentence_avg else sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + else: + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + logging_output["dec_loss"] = 0 + logging_output["dec_nll_loss"] = 0 + logging_output["dec_sample_size"] = 1 + if self.report_accuracy: + logging_output["dec_n_correct"] = 0 + logging_output["total"] = 1 + + logging_output = { + "loss": utils.item(loss.data), # * sample['ntokens'], + "ntokens": ntokens, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + **logging_output, + } + + if not model.training and self.dec_weight < 1.0: + import editdistance + + with torch.no_grad(): + lprobs_t = lprobs.transpose(0, 1).float().contiguous().cpu() + + c_err = 0 + c_len = 0 + w_errs = 0 + w_len = 0 + wv_errs = 0 + for lp, t, inp_l in zip( + lprobs_t, + sample["target_label"] + if "target_label" in sample + else sample["target"], + input_lengths, + ): + lp = lp[:inp_l].unsqueeze(0) + + decoded = None + if self.w2l_decoder is not None: + decoded = self.w2l_decoder.decode(lp) + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + + p = (t != self.task.target_dictionary.pad()) & ( + t != self.task.target_dictionary.eos() + ) + targ = t[p] + targ_units = self.task.target_dictionary.string(targ) + targ_units_arr = targ.tolist() + + toks = lp.argmax(dim=-1).unique_consecutive() + pred_units_arr = toks[toks != self.blank_idx].tolist() + + c_err += editdistance.eval(pred_units_arr, targ_units_arr) + c_len += len(targ_units_arr) + + targ_words = post_process(targ_units, self.post_process).split() + + pred_units = self.task.target_dictionary.string(pred_units_arr) + pred_words_raw = post_process(pred_units, self.post_process).split() + + if decoded is not None and "words" in decoded: + pred_words = decoded["words"] + w_errs += editdistance.eval(pred_words, targ_words) + wv_errs += editdistance.eval(pred_words_raw, targ_words) + else: + dist = editdistance.eval(pred_words_raw, targ_words) + w_errs += dist + wv_errs += dist + + w_len += len(targ_words) + + logging_output["wv_errors"] = wv_errs + logging_output["w_errors"] = w_errs + logging_output["w_total"] = w_len + logging_output["c_errors"] = c_err + logging_output["c_total"] = c_len + + return loss, sample_size, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.pad_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.pad_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + c_errors = sum(log.get("c_errors", 0) for log in logging_outputs) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in logging_outputs) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in logging_outputs) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in logging_outputs) + metrics.log_scalar("_w_total", w_total) + + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + if "dec_loss" in logging_outputs[0]: + ctc_loss_sum = sum(log.get("ctc_loss", 0) for log in logging_outputs) + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "ctc_loss", ctc_loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/SpeechUT/speechut/criterions/speechut_criterion.py b/SpeechUT/speechut/criterions/speechut_criterion.py new file mode 100644 index 0000000..0d735f1 --- /dev/null +++ b/SpeechUT/speechut/criterions/speechut_criterion.py @@ -0,0 +1,384 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import numpy as np +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass + +logger = logging.getLogger(__name__) + +@dataclass +class SpeechUTCriterionConfig(FairseqDataclass): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + u2t_ed_weight: float = field( + default=0.1, + metadata={"help": "weights for text ED Loss, loss will be (hubert_loss + text_mum_weight * MUM_Loss + u2t_ed_weight * CE_Loss + u2t_ctc_weight * CTC_loss)"}, + ) + u2t_ctc_weight: float = field( + default=0.0, + metadata={"help": "weights for text ED Loss, loss will be (hubert_loss + text_mum_weight * MUM_Loss + u2t_ed_weight * CE_Loss + u2t_ctc_weight * CTC_loss)"}, + ) + text_mum_weight: float = field( + default=0.0, + metadata={"help": "masked unit modeling weight from the text end"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + no_ctc_blank: bool = field( + default=False, + metadata={"help": "mask out the blank of ctc, only when dec_loss_type=ctc"}, + ) + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + +@register_criterion("speechut_criterion", dataclass=SpeechUTCriterionConfig) +class SpeechUTCriterion(FairseqCriterion): + def __init__( + self, + task, + pred_masked_weight, + pred_nomask_weight, + loss_weights=None, + log_keys=None, + u2t_ed_weight=0.1, + u2t_ctc_weight=0, + text_mum_weight=0, + report_accuracy=False, + ignore_prefix_size=0, + label_smoothing=0, + no_ctc_blank=False, + ): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.u2t_ed_weight = u2t_ed_weight + self.u2t_ctc_weight = u2t_ctc_weight + self.text_mum_weight = text_mum_weight + self.report_accuracy = report_accuracy + self.ignore_prefix_size = ignore_prefix_size + self.eps = label_smoothing + self.no_ctc_blank = no_ctc_blank + self.padding_idx = task.dictionaries[0].pad() + self.eos_idx = task.dictionaries[0].eos() + self.blank_idx = task.dictionaries[0].bos() + + def compute_hubert_loss(self, model, net_output, reduction, preffix='', suffix=''): + loss = 0 + sample_size = [] + logging_output = {} + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"{preffix}loss_m_{i}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size.append(targ_m_list[0].numel()) + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"{preffix}loss_u_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size.append(targ_u_list[0].numel()) + + sample_size = np.mean(sample_size) + + def compute_correct(logits, targets): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == targets + min = logits.argmin(-1) == targets + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + corr_m, count_m = compute_correct(logp_m, targ_m) + logging_output[f"correct_m_{i}{suffix}"] = corr_m + logging_output[f"count_m_{i}{suffix}"] = count_m + + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + corr_u, count_u = compute_correct(logp_u, targ_u) + logging_output[f"correct_u_{i}{suffix}"] = corr_u + logging_output[f"count_u_{i}{suffix}"] = count_u + + return loss, sample_size, logging_output + + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + reduction = "sum" if reduce else "none" + + if "net_input" in sample: + unit_sample = text_sample = None + else: + unit_sample = sample.get("text_mono", None) + text_sample = sample.get("text_paired", None) + assert unit_sample is not None or text_sample is not None + sample = sample.get("speech") + + ### 1. S2U: do hubert forward and loss computation + sample["modality"] = "speech" + net_output = model(target_list=sample["target_list"], **sample["net_input"]) + loss, sample_size, logging_output = self.compute_hubert_loss( + model, + net_output, + reduction, + ) + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len( + self.loss_weights + ), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + ### 2. do text U2T forward and loss computation + if text_sample is not None and (self.u2t_ctc_weight + self.u2t_ed_weight) > 0: + ## 2.1 re-loading "target_list", in default case, target_list = [src_tokens], + ## while in case of using "unit-phone-char" structure, target_list will be [ref_tokens] + text_sample["net_input"]["target_list"] = [ + text_sample.get("ref_tokens", text_sample["net_input"]["src_tokens"].clone()), + ] + text_net_output = model(**text_sample["net_input"]) + text_sample_size = text_sample["ntokens"] + + ### 2.1 U2T_UCTC + if self.u2t_ctc_weight > 0: + text_ctc_loss = self.compute_ctc_loss(model, text_net_output, text_sample["target"], reduction=reduction) + loss += self.u2t_ctc_weight * text_ctc_loss * sample_size / text_sample_size + logging_output["text_ctc_loss"] = utils.item(text_ctc_loss) + logging_output["text_sample_size"] = text_sample_size + + ### 2.2 U2T_ED + if self.u2t_ed_weight > 0: + text_dec_loss, text_dec_nll_loss = self.compute_ce_loss(model, text_net_output["decoder_out"], text_sample, reduce=reduce) + loss += self.u2t_ed_weight * text_dec_loss * sample_size / text_sample_size + logging_output["text_dec_loss"] = utils.item(text_dec_loss) + logging_output["text_dec_nll_loss"] = utils.item(text_dec_nll_loss) + logging_output["text_sample_size"] = text_sample_size + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, text_net_output["decoder_out"], text_sample) + logging_output["correct_text_dec"] = utils.item(n_correct.data) + logging_output["count_text_dec"] = utils.item(total.data) + + ### 3. do unit MUM forward and loss computation + if unit_sample is not None and self.text_mum_weight > 0: + src_tokens = unit_sample["net_input"]["src_tokens"] + target = unit_sample.get("target", None) + target = src_tokens.clone() if target is None else target + unit_net_output = model.forward_mum(src_tokens, target) + loss_num, sample_size_mum, logging_output_mum = self.compute_hubert_loss( + model, + unit_net_output, + reduction, + preffix="mum_", + suffix="_mum", + ) + loss += self.text_mum_weight * loss_num * sample_size / sample_size_mum + logging_output["unit_sample_size"] = sample_size_mum + logging_output.update(logging_output_mum) + + logging_output = { + "loss": utils.item(loss) if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["id"].numel() + (text_sample["id"].numel() if text_sample is not None else 0), + "sample_size": sample_size, + **logging_output, + } + + return loss, sample_size, logging_output + + def compute_ctc_loss(self, model, net_output, target, reduction): + logits = net_output["encoder_out_ctc"][0] # (T, B, C) from the code-encoder + if self.no_ctc_blank: + ## set prob of <blank> to -inf + logits = logits.float() + logits[:, :, self.blank_idx] = -1000000.0 + + lprobs = F.log_softmax(logits.float(), dim=-1) + + encoder_padding_mask = net_output["encoder_padding_mask"][0] + non_padding_mask = ~encoder_padding_mask + input_lengths = non_padding_mask.long().sum(-1) + pad_mask = (target != self.padding_idx) & (target != self.eos_idx) + targets_flat = target.masked_select(pad_mask) + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction=reduction, + zero_infinity=True, + ) + return loss + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = sample["target"] + + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + if "text_sample_size" in logging_outputs[0]: + text_sample_size = sum(log.get("text_sample_size", 0) for log in logging_outputs) + for lk in logging_outputs[0].keys(): + if lk.startswith("text_") and lk.endswith("_loss"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / text_sample_size / math.log(2), round=3) + + if "unit_sample_size" in logging_outputs[0]: + unit_sample_size = sum(log.get("unit_sample_size", 0) for log in logging_outputs) + for lk in logging_outputs[0].keys(): + if lk.startswith("mum_loss_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / unit_sample_size / math.log(2), round=3) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/SpeechUT/speechut/data/concat_dataset.py b/SpeechUT/speechut/data/concat_dataset.py new file mode 100644 index 0000000..5766921 --- /dev/null +++ b/SpeechUT/speechut/data/concat_dataset.py @@ -0,0 +1,129 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import bisect + +import numpy as np +from torch.utils.data.dataloader import default_collate + +from fairseq.data import FairseqDataset + + +class ConcatDataset(FairseqDataset): + @staticmethod + def cumsum(sequence, sample_ratios): + r, s = [], 0 + for e, ratio in zip(sequence, sample_ratios): + curr_len = int(ratio * len(e)) + r.append(curr_len + s) + s += curr_len + return r + + def __init__(self, datasets, sample_ratios=1): + super(ConcatDataset, self).__init__() + assert len(datasets) > 0, "datasets should not be an empty iterable" + self.datasets = list(datasets) + if isinstance(sample_ratios, int): + sample_ratios = [sample_ratios] * len(self.datasets) + self.sample_ratios = sample_ratios + self.cumulative_sizes = self.cumsum(self.datasets, sample_ratios) + self.real_sizes = [len(d) for d in self.datasets] + + def __len__(self): + return self.cumulative_sizes[-1] + + def __getitem__(self, idx): + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx][sample_idx] + + def _get_dataset_and_sample_index(self, idx: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + sample_idx = sample_idx % self.real_sizes[dataset_idx] + return dataset_idx, sample_idx + + def collater(self, samples, **extra_args): + # For now only supports datasets with same underlying collater implementations + if hasattr(self.datasets[0], "collater"): + return self.datasets[0].collater(samples, **extra_args) + else: + return default_collate(samples, **extra_args) + + def size(self, idx: int): + """ + Return an example's size as a float or tuple. + """ + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx].size(sample_idx) + + def num_tokens(self, index: int): + return np.max(self.size(index)) + + def attr(self, attr: str, index: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, index) + return getattr(self.datasets[dataset_idx], attr, None) + + @property + def sizes(self): + _dataset_sizes = [] + for ds, sr in zip(self.datasets, self.sample_ratios): + if isinstance(ds.sizes, np.ndarray): + _dataset_sizes.append(np.tile(ds.sizes, sr)) + else: + # Only support underlying dataset with single size array. + assert isinstance(ds.sizes, list) + _dataset_sizes.append(np.tile(ds.sizes[0], sr)) + return np.concatenate(_dataset_sizes) + + @property + def supports_prefetch(self): + return all(d.supports_prefetch for d in self.datasets) + + def ordered_indices(self): + """ + Returns indices sorted by length. So less padding is needed. + """ + if isinstance(self.sizes, np.ndarray) and len(self.sizes.shape) > 1: + # special handling for concatenating lang_pair_datasets + if getattr(self.datasets[0], "shuffle", False): + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + sizes = self.sizes + tgt_sizes = ( + sizes[:, 1] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else None + ) + src_sizes = ( + sizes[:, 0] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else sizes + ) + # sort by target length, then source length + if tgt_sizes is not None: + indices = indices[np.argsort(tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(src_sizes[indices], kind="mergesort")] + else: + return np.argsort(self.sizes) + + def prefetch(self, indices): + frm = 0 + for to, ds in zip(self.cumulative_sizes, self.datasets): + real_size = len(ds) + if getattr(ds, "supports_prefetch", False): + ds.prefetch([(i - frm) % real_size for i in indices if frm <= i < to]) + frm = to + + @property + def can_reuse_epoch_itr_across_epochs(self): + return all(d.can_reuse_epoch_itr_across_epochs for d in self.datasets) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.datasets: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) diff --git a/SpeechUT/speechut/data/hubert_dataset.py b/SpeechUT/speechut/data/hubert_dataset.py new file mode 100644 index 0000000..64965de --- /dev/null +++ b/SpeechUT/speechut/data/hubert_dataset.py @@ -0,0 +1,597 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import itertools +import logging +import io +import os +import sys +import time +from pathlib import Path +from typing import Any, List, Optional, Union, Tuple + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils, Dictionary +from fairseq.data.fairseq_dataset import FairseqDataset +from fairseq.data.audio.audio_utils import ( + read_from_stored_zip, + is_sf_audio_data, +) + +FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS = {".npy", ".wav", ".flac", ".ogg"} + +logger = logging.getLogger(__name__) + +def parse_path(path: str) -> Tuple[str, List[int]]: + """Parse data path which is either a path to + 1. a .npy/.wav/.flac/.ogg file + 2. a stored ZIP file with slicing info: "[zip_path]:[offset]:[length]" + + Args: + path (str): the data path to parse + + Returns: + file_path (str): the file path + slice_ptr (list of int): empty in case 1; + byte offset and length for the slice in case 2 + """ + + if Path(path).suffix in FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS: + _path, slice_ptr = path, [] + else: + _path, *slice_ptr = path.split(":") + if not Path(_path).is_file(): + raise FileNotFoundError(f"File not found: {_path}") + assert len(slice_ptr) in {0, 1, 2}, f"Invalid path: {path}" + slice_ptr = [int(i) for i in slice_ptr] + return _path, slice_ptr + +def load_audio(manifest_path, max_keep, min_keep, retry_times=5): + n_long, n_short = 0, 0 + names, inds, sizes, chunk_names, chunk_indices = [], [], [], [], [] + for i in range(retry_times): + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + assert len(items) == 2, line + sz = int(items[1]) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + fname = items[0].split(":") + if len(fname) > 2: + if len(chunk_names) == 0 or fname[0] != chunk_names[-1]: + chunk_names.append(fname[0]) + chunk_indices.append(len(names)) + names.append(items[0]) + inds.append(ind) + sizes.append(sz) + if len(names) == 0: + logger.warn(f"Fail to load manifest for the {i} time") + time.sleep(1) + continue + else: + break + tot = ind + 1 + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes, chunk_names, chunk_indices + + +def load_label(label_path, inds, tot, retry_times=5): + for i in range(retry_times): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + if len(labels) == 0: + logger.warn(f"Fail to load label for the {i} time") + time.sleep(1) + continue + else: + break + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot, retry_times=5): + for i in range(retry_times): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + if len(code_lengths) == 0: + logger.warn(f"Fail to load label for the {i} time") + time.sleep(1) + continue + else: + break + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +class HubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + tgt_dict: Optional[Dictionary] = None, + add_decoder_target: bool = False, + fine_tuning: bool = False, + tgt_lang_idx: int = None, + tokenizer = None, + mbart_style_lang_id: bool = False, + retry_times: int = 5, + reduce_label_for_dec: bool = True, + ): + self.audio_root, self.audio_names, inds, tot, self.wav_sizes, self.chunk_names, self.chunk_indices = load_audio( + manifest_path, max_keep_sample_size, min_keep_sample_size, retry_times + ) + self.sample_rate = sample_rate + self.shuffle = shuffle + self.random_crop = random_crop + self.tgt_dict = tgt_dict + self.add_decoder_target = add_decoder_target + self.fine_tuning = fine_tuning + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.single_target = single_target + self.epoch = 0 + + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + self.store_labels = store_labels + if store_labels: + self.label_list = [load_label(p, inds, tot, retry_times) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot, retry_times) for p in label_paths + ] + assert label_processors is None or len(label_processors) == self.num_labels + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths( + self.wav_sizes, sample_rate, label_path, label_rate, inds, tot + ) + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + self.tgt_lang_idx = tgt_lang_idx + self.tokenizer = tokenizer + self.mbart_style_lang_id = mbart_style_lang_id + self.retry_times = retry_times + self.reduce_label_for_dec = reduce_label_for_dec + logger.info( + f"pad_audio={pad_audio}, random_crop={random_crop}, tgt_lang_idx={self.tgt_lang_idx}, reduce_label_for_dec={reduce_label_for_dec}, " + f"mbart_style_lang_id={mbart_style_lang_id}, normalize={normalize}, max_sample_size={self.max_sample_size}" + ) + + def set_epoch(self, epoch): + self.epoch = epoch + + def batch_by_size(self, indices, max_tokens=None, max_sentences=None, required_batch_size_multiple=1): + self.max_tokens = max_tokens + self.max_sentences = max_sentences + self.required_batch_size_multiple = required_batch_size_multiple + if isinstance(indices[0], np.ndarray): + batch_list = [] + for indice in indices: + batch = super(HubertDataset, self).batch_by_size(indice, max_tokens, max_sentences, required_batch_size_multiple) + batch_list.append(batch) + return batch_list + else: + return super(HubertDataset, self).batch_by_size(indices, max_tokens, max_sentences, required_batch_size_multiple) + def shuffle_batches(self, batches, seed): + if isinstance(batches[0], list): + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for batch in batches: + np.random.shuffle(batch) + new_batches.extend(batch) + return new_batches + else: + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + return batches + + def get_audio(self, index): + import soundfile as sf + + wav_path = os.path.join(self.audio_root, self.audio_names[index]) + _path, slice_ptr = parse_path(wav_path) + if len(slice_ptr) == 1: + import kaldiio + feat = kaldiio.load_mat(wav_path) + feat = torch.from_numpy(feat).float() + if self.normalize: + with torch.no_grad(): + feat = F.layer_norm(feat, feat.shape[-1]) + return feat + else: + if len(slice_ptr) == 2: + byte_data = read_from_stored_zip(_path, slice_ptr[0], slice_ptr[1]) + assert is_sf_audio_data(byte_data) + wav_path = io.BytesIO(byte_data) + for i in range(self.retry_times): + if i < self.retry_times - 1: + try: + wav, cur_sample_rate = sf.read(wav_path) + break + except Exception as e: + logger.warn(f"Fail to load wav for the {i} time") + logger.warn(e) + time.sleep(1) + continue + else: + wav, cur_sample_rate = sf.read(wav_path) + + wav = torch.from_numpy(wav).float() + wav = self.postprocess(wav, cur_sample_rate) + return wav + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.tokenizer is not None and self.fine_tuning: + label = self.tokenizer.encode(label) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def __getitem__(self, index): + wav = self.get_audio(index) + labels = self.get_labels(index) + return {"id": index, "source": wav, "label_list": labels} + + def __len__(self): + return len(self.wav_sizes) + + def crop_to_max_size(self, wav, target_size): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + + start, end = 0, target_size + if self.random_crop: + start = np.random.randint(0, diff + 1) + end = size - diff + start + return wav[start:end], start + + def collater(self, samples): + # target = max(sizes) -> random_crop not used + # target = max_sample_size -> random_crop used for long + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + feat_dim = audios[0].size(-1) if audios[0].dim() > 1 else 1 + collated_audios, padding_mask, audio_starts = self.collater_audio( + audios, audio_size, feat_dim, + ) + + targets_by_label = [ + [s["label_list"][i] for s in samples] for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + if self.add_decoder_target: + if self.fine_tuning: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + else: + if self.tokenizer is not None: + decoder_label = [ + # Set 48 for translate int to char and avoid \n + torch.cat( + ( + torch.tensor( + self.tokenizer.sp.Encode( + "".join( + [chr(j + 48) for j in ( + targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]] + ).tolist()] + ), out_type=int + ) + ), + torch.tensor([self.tgt_dict.eos()]) + ), dim=0 + ).long() + for i in range(targets_list[0].size(0)) + ] + else: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + if self.mbart_style_lang_id: + decoder_label = [ + torch.cat((decoder_label[i], torch.tensor([self.tgt_lang_idx])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + dec_ntokens = sum(x.size(0) for x in decoder_label) + decoder_target = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=False, + ) + decoder_target_lengths = torch.tensor( + [x.size(0) for x in decoder_label], dtype=torch.long + ) + prev_output_tokens = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=True, + ) + + if self.tgt_lang_idx is not None and not self.mbart_style_lang_id: + assert (prev_output_tokens[:, 0] != self.tgt_dict.eos()).sum() == 0 + prev_output_tokens[:, 0] = self.tgt_lang_idx + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "decoder_target": decoder_target, + "decoder_target_lengths": decoder_target_lengths, + "dec_ntokens": dec_ntokens, + "lang_idx": self.tgt_lang_idx, + } + else: + net_input = {"source": collated_audios, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch + + def collater_audio(self, audios, audio_size, feat_dim=1): + collated_audios = audios[0].new_zeros(len(audios), audio_size, feat_dim) + padding_mask = ( + torch.BoolTensor(collated_audios.shape[0:2]).fill_(False) + # if self.pad_audio else None + ) + audio_starts = [0 for _ in audios] + for i, audio in enumerate(audios): + audio = audio.view(-1, feat_dim) + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat([audio, audio.new_full((-diff, feat_dim), 0.0)]) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size + ) + return collated_audios.squeeze(-1), padding_mask, audio_starts + + def collater_frm_label(self, targets, audio_size, audio_starts, label_rate, pad): + assert label_rate > 0 + s2f = label_rate / self.sample_rate + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s : s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens(targets, pad_idx=pad, left_pad=False) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.wav_sizes[index] + return min(self.wav_sizes[index], self.max_sample_size) + + @property + def sizes(self): + return np.array(self.wav_sizes) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + + if self.shuffle: + if len(self.chunk_names) > 0: + logger.info(f"ordered indices for epoch {self.epoch}") + with data_utils.numpy_seed(self.epoch): + self.chunk_order = np.random.permutation(len(self.chunk_names)) + chunk_count = 0 + tmp_sizes = [] + tmp_indices = [] + indice = [] + for i in self.chunk_order: + chunk_count += 1 + start = self.chunk_indices[i] + end = self.chunk_indices[i+1] if i < len(self.chunk_names) - 1 else len(self) + size = list(self.sizes[start:end]) + tmp_indices.extend(list(np.arange(start, end))) + tmp_sizes.extend(size) + if chunk_count % 10 == 0 or i == self.chunk_order[0]: + order = [np.random.permutation(len(tmp_indices))] + order.append( + np.minimum( + np.array(tmp_sizes), + self.max_sample_size, + ) + ) + sort_idx = np.lexsort(order)[::-1] + indice.append(np.array([tmp_indices[k] for k in sort_idx])) + tmp_indices = [] + tmp_sizes =[] + return indice + else: + order = [np.random.permutation(len(self))] + order.append( + np.minimum( + np.array(self.sizes), + self.max_sample_size, + ) + ) + return np.lexsort(order)[::-1] + else: + return np.arange(len(self)) + + def postprocess(self, wav, cur_sample_rate): + if wav.dim() == 2: + wav = wav.mean(-1) + assert wav.dim() == 1, wav.dim() + + if cur_sample_rate != self.sample_rate: + raise Exception(f"sr {cur_sample_rate} != {self.sample_rate}") + + if self.normalize: + with torch.no_grad(): + wav = F.layer_norm(wav, wav.shape) + return wav diff --git a/SpeechUT/speechut/data/language_trible_dataset.py b/SpeechUT/speechut/data/language_trible_dataset.py new file mode 100644 index 0000000..6494127 --- /dev/null +++ b/SpeechUT/speechut/data/language_trible_dataset.py @@ -0,0 +1,669 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import numpy as np +import torch +import os +import itertools + +from fairseq.data import FairseqDataset, data_utils +from fairseq.data import ( + AppendTokenDataset, + ConcatDataset, + PrependTokenDataset, + data_utils, + indexed_dataset, +) + +logger = logging.getLogger(__name__) + +def load_langtriple_dataset( + data_path, + split, + src, + src_dict, + ref, + ref_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, + lang_format="[{}]", +): + assert not truncate_source + def split_exists(split, src, ref, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}-{}.{}".format(split, src, ref, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + ref_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, ref, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}-{}.".format(split_k, src, ref, tgt)) + elif split_exists(split_k, tgt, ref, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}-{}.".format(split_k, tgt, ref, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + src_datasets.append(src_dataset) + + ref_dataset = data_utils.load_indexed_dataset( + prefix + ref, ref_dict, dataset_impl + ) + ref_datasets.append(ref_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{}-{} {} examples".format( + data_path, split_k, src, ref, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(ref_datasets) + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + ref_dataset = ref_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + ref_dataset = ConcatDataset(ref_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(ref_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + ref_dataset = PrependTokenDataset(ref_dataset, ref_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + ref_dataset = PrependTokenDataset(ref_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index(lang_format.format(src)) + ) + ref_dataset = AppendTokenDataset( + ref_dataset, ref_dict.index(lang_format.format(ref)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index(lang_format.format(tgt)) + ) + eos = tgt_dict.index(lang_format.format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguageTripleDataset( + src_dataset, + src_dataset.sizes, + src_dict, + ref_dataset, + ref_dataset.sizes, + ref_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + ) + + +def collate( + samples, + pad_idx, + eos_idx, + left_pad_source=True, + left_pad_target=False, + input_feeding=True, + pad_to_length=None, + pad_to_multiple=1, +): + if len(samples) == 0: + return {} + + def merge(key, left_pad, move_eos_to_beginning=False, pad_to_length=None): + return data_utils.collate_tokens( + [s[key] for s in samples], + pad_idx, + None, + left_pad, + move_eos_to_beginning, + pad_to_length=pad_to_length, + pad_to_multiple=pad_to_multiple, + ) + + def check_alignment(alignment, src_len, tgt_len): + if alignment is None or len(alignment) == 0: + return False + if ( + alignment[:, 0].max().item() >= src_len - 1 + or alignment[:, 1].max().item() >= tgt_len - 1 + ): + logger.warning("alignment size mismatch found, skipping alignment!") + return False + return True + + def compute_alignment_weights(alignments): + """ + Given a tensor of shape [:, 2] containing the source-target indices + corresponding to the alignments, a weight vector containing the + inverse frequency of each target index is computed. + For e.g. if alignments = [[5, 7], [2, 3], [1, 3], [4, 2]], then + a tensor containing [1., 0.5, 0.5, 1] should be returned (since target + index 3 is repeated twice) + """ + align_tgt = alignments[:, 1] + _, align_tgt_i, align_tgt_c = torch.unique( + align_tgt, return_inverse=True, return_counts=True + ) + align_weights = align_tgt_c[align_tgt_i[np.arange(len(align_tgt))]] + return 1.0 / align_weights.float() + + id = torch.LongTensor([s["id"] for s in samples]) + src_tokens = merge( + "source", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + ref_tokens = merge( + "reference", + left_pad=left_pad_source, + pad_to_length=pad_to_length["source"] if pad_to_length is not None else None, + ) + # sort by descending source length + src_lengths = torch.LongTensor( + [s["source"].ne(pad_idx).long().sum() for s in samples] + ) + ref_lengths = torch.LongTensor( + [s["reference"].ne(pad_idx).long().sum() for s in samples] + ) + src_lengths, sort_order = src_lengths.sort(descending=True) + id = id.index_select(0, sort_order) + src_tokens = src_tokens.index_select(0, sort_order) + ref_lengths = ref_lengths.index_select(0, sort_order) + ref_tokens = ref_tokens.index_select(0, sort_order) + + prev_output_tokens = None + target = None + if samples[0].get("target", None) is not None: + target = merge( + "target", + left_pad=left_pad_target, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + target = target.index_select(0, sort_order) + tgt_lengths = torch.LongTensor( + [s["target"].ne(pad_idx).long().sum() for s in samples] + ).index_select(0, sort_order) + ntokens = tgt_lengths.sum().item() + + if samples[0].get("prev_output_tokens", None) is not None: + prev_output_tokens = merge("prev_output_tokens", left_pad=left_pad_target) + elif input_feeding: + # we create a shifted version of targets for feeding the + # previous output token(s) into the next decoder step + prev_output_tokens = merge( + "target", + left_pad=left_pad_target, + move_eos_to_beginning=True, + pad_to_length=pad_to_length["target"] + if pad_to_length is not None + else None, + ) + else: + ntokens = src_lengths.sum().item() + + batch = { + "id": id, + "nsentences": len(samples), + "ntokens": ntokens, + "net_input": { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + }, + "target": target, + "ref_tokens": ref_tokens, + "ref_lengths": ref_lengths, + } + if prev_output_tokens is not None: + batch["net_input"]["prev_output_tokens"] = prev_output_tokens.index_select( + 0, sort_order + ) + + if samples[0].get("alignment", None) is not None: + bsz, tgt_sz = batch["target"].shape + src_sz = batch["net_input"]["src_tokens"].shape[1] + + offsets = torch.zeros((len(sort_order), 2), dtype=torch.long) + offsets[:, 1] += torch.arange(len(sort_order), dtype=torch.long) * tgt_sz + if left_pad_source: + offsets[:, 0] += src_sz - src_lengths + if left_pad_target: + offsets[:, 1] += tgt_sz - tgt_lengths + + alignments = [ + alignment + offset + for align_idx, offset, src_len, tgt_len in zip( + sort_order, offsets, src_lengths, tgt_lengths + ) + for alignment in [samples[align_idx]["alignment"].view(-1, 2)] + if check_alignment(alignment, src_len, tgt_len) + ] + + if len(alignments) > 0: + alignments = torch.cat(alignments, dim=0) + align_weights = compute_alignment_weights(alignments) + + batch["alignments"] = alignments + batch["align_weights"] = align_weights + + if samples[0].get("constraints", None) is not None: + # Collate the packed constraints across the samples, padding to + # the length of the longest sample. + lens = [sample.get("constraints").size(0) for sample in samples] + max_len = max(lens) + constraints = torch.zeros((len(samples), max(lens))).long() + for i, sample in enumerate(samples): + constraints[i, 0 : lens[i]] = samples[i].get("constraints") + batch["constraints"] = constraints.index_select(0, sort_order) + + return batch + + +class LanguageTripleDataset(FairseqDataset): + """ + A pair of torch.utils.data.Datasets. + + Args: + src (torch.utils.data.Dataset): source dataset to wrap + src_sizes (List[int]): source sentence lengths + src_dict (~fairseq.data.Dictionary): source vocabulary + tgt (torch.utils.data.Dataset, optional): target dataset to wrap + tgt_sizes (List[int], optional): target sentence lengths + tgt_dict (~fairseq.data.Dictionary, optional): target vocabulary + left_pad_source (bool, optional): pad source tensors on the left side + (default: True). + left_pad_target (bool, optional): pad target tensors on the left side + (default: False). + shuffle (bool, optional): shuffle dataset elements before batching + (default: True). + input_feeding (bool, optional): create a shifted version of the targets + to be passed into the model for teacher forcing (default: True). + remove_eos_from_source (bool, optional): if set, removes eos from end + of source if it's present (default: False). + append_eos_to_target (bool, optional): if set, appends eos to end of + target if it's absent (default: False). + align_dataset (torch.utils.data.Dataset, optional): dataset + containing alignments. + constraints (Tensor, optional): 2d tensor with a concatenated, zero- + delimited list of constraints for each sentence. + append_bos (bool, optional): if set, appends bos to the beginning of + source/target sentence. + num_buckets (int, optional): if set to a value greater than 0, then + batches will be bucketed into the given number of batch shapes. + src_lang_id (int, optional): source language ID, if set, the collated batch + will contain a field 'src_lang_id' in 'net_input' which indicates the + source language of the samples. + tgt_lang_id (int, optional): target language ID, if set, the collated batch + will contain a field 'tgt_lang_id' which indicates the target language + of the samples. + """ + + def __init__( + self, + src, + src_sizes, + src_dict, + ref, + ref_sizes, + ref_dict, + tgt=None, + tgt_sizes=None, + tgt_dict=None, + left_pad_source=True, + left_pad_target=False, + shuffle=True, + input_feeding=True, + remove_eos_from_source=False, + append_eos_to_target=False, + align_dataset=None, + constraints=None, + append_bos=False, + eos=None, + num_buckets=0, + src_lang_id=None, + tgt_lang_id=None, + pad_to_multiple=1, + ): + if tgt_dict is not None: + assert src_dict.pad() == tgt_dict.pad() + assert src_dict.eos() == tgt_dict.eos() + assert src_dict.unk() == tgt_dict.unk() + if tgt is not None: + assert len(src) == len( + tgt + ), "Source and target must contain the same number of examples" + assert len(src) == len( + ref + ), "Source and reference must contain the same number of examples" + self.src = src + self.ref = ref + self.tgt = tgt + self.src_sizes = np.array(src_sizes) + self.ref_sizes = np.array(ref_sizes) + self.tgt_sizes = np.array(tgt_sizes) if tgt_sizes is not None else None + self.sizes = ( + np.vstack((self.src_sizes, self.tgt_sizes)).T + if self.tgt_sizes is not None + else self.src_sizes + ) + self.src_dict = src_dict + self.ref_dict = ref_dict + self.tgt_dict = tgt_dict + self.left_pad_source = left_pad_source + self.left_pad_target = left_pad_target + self.shuffle = shuffle + self.input_feeding = input_feeding + self.remove_eos_from_source = remove_eos_from_source + self.append_eos_to_target = append_eos_to_target + self.align_dataset = align_dataset + if self.align_dataset is not None: + assert ( + self.tgt_sizes is not None + ), "Both source and target needed when alignments are provided" + self.constraints = constraints + self.append_bos = append_bos + self.eos = eos if eos is not None else src_dict.eos() + self.src_lang_id = src_lang_id + self.tgt_lang_id = tgt_lang_id + if num_buckets > 0: + from fairseq.data import BucketPadLengthDataset + + self.src = BucketPadLengthDataset( + self.src, + sizes=self.src_sizes, + num_buckets=num_buckets, + pad_idx=self.src_dict.pad(), + left_pad=self.left_pad_source, + ) + self.src_sizes = self.src.sizes + logger.info("bucketing source lengths: {}".format(list(self.src.buckets))) + self.ref = BucketPadLengthDataset( + self.ref, + sizes=self.ref_sizes, + num_buckets=num_buckets, + pad_idx=self.ref_dict.pad(), + left_pad=self.left_pad_source, + ) + self.ref_sizes = self.ref.sizes + logger.info("bucketing reference lengths: {}".format(list(self.src.buckets))) + if self.tgt is not None: + self.tgt = BucketPadLengthDataset( + self.tgt, + sizes=self.tgt_sizes, + num_buckets=num_buckets, + pad_idx=self.tgt_dict.pad(), + left_pad=self.left_pad_target, + ) + self.tgt_sizes = self.tgt.sizes + logger.info( + "bucketing target lengths: {}".format(list(self.tgt.buckets)) + ) + + # determine bucket sizes using self.num_tokens, which will return + # the padded lengths (thanks to BucketPadLengthDataset) + num_tokens = np.vectorize(self.num_tokens, otypes=[np.compat.long]) + self.bucketed_num_tokens = num_tokens(np.arange(len(self.src))) + self.buckets = [ + (None, num_tokens) for num_tokens in np.unique(self.bucketed_num_tokens) + ] + else: + self.buckets = None + self.pad_to_multiple = pad_to_multiple + + def get_batch_shapes(self): + return self.buckets + + def __getitem__(self, index): + tgt_item = self.tgt[index] if self.tgt is not None else None + src_item = self.src[index] + ref_item = self.ref[index] + # Append EOS to end of tgt sentence if it does not have an EOS and remove + # EOS from end of src sentence if it exists. This is useful when we use + # use existing datasets for opposite directions i.e., when we want to + # use tgt_dataset as src_dataset and vice versa + if self.append_eos_to_target: + eos = self.tgt_dict.eos() if self.tgt_dict else self.src_dict.eos() + if self.tgt and self.tgt[index][-1] != eos: + tgt_item = torch.cat([self.tgt[index], torch.LongTensor([eos])]) + + if self.append_bos: + bos = self.tgt_dict.bos() if self.tgt_dict else self.src_dict.bos() + if self.tgt and self.tgt[index][0] != bos: + tgt_item = torch.cat([torch.LongTensor([bos]), self.tgt[index]]) + + bos = self.src_dict.bos() + if self.src[index][0] != bos: + src_item = torch.cat([torch.LongTensor([bos]), self.src[index]]) + if self.ref[index][0] != bos: + ref_item = torch.cat([torch.LongTensor([bos]), self.ref[index]]) + + if self.remove_eos_from_source: + eos = self.src_dict.eos() + if self.src[index][-1] == eos: + src_item = self.src[index][:-1] + if self.ref[index][-1] == eos: + ref_item = self.ref[index][:-1] + + example = { + "id": index, + "source": src_item, + "reference": ref_item, + "target": tgt_item, + } + if self.align_dataset is not None: + example["alignment"] = self.align_dataset[index] + if self.constraints is not None: + example["constraints"] = self.constraints[index] + return example + + def __len__(self): + return len(self.src) + + def collater(self, samples, pad_to_length=None): + """Merge a list of samples to form a mini-batch. + + Args: + samples (List[dict]): samples to collate + pad_to_length (dict, optional): a dictionary of + {'source': source_pad_to_length, 'target': target_pad_to_length} + to indicate the max length to pad to in source and target respectively. + + Returns: + dict: a mini-batch with the following keys: + + - `id` (LongTensor): example IDs in the original input order + - `ntokens` (int): total number of tokens in the batch + - `net_input` (dict): the input to the Model, containing keys: + + - `src_tokens` (LongTensor): a padded 2D Tensor of tokens in + the source sentence of shape `(bsz, src_len)`. Padding will + appear on the left if *left_pad_source* is ``True``. + - `src_lengths` (LongTensor): 1D Tensor of the unpadded + lengths of each source sentence of shape `(bsz)` + - `prev_output_tokens` (LongTensor): a padded 2D Tensor of + tokens in the target sentence, shifted right by one + position for teacher forcing, of shape `(bsz, tgt_len)`. + This key will not be present if *input_feeding* is + ``False``. Padding will appear on the left if + *left_pad_target* is ``True``. + - `src_lang_id` (LongTensor): a long Tensor which contains source + language IDs of each sample in the batch + + - `target` (LongTensor): a padded 2D Tensor of tokens in the + target sentence of shape `(bsz, tgt_len)`. Padding will appear + on the left if *left_pad_target* is ``True``. + - `tgt_lang_id` (LongTensor): a long Tensor which contains target language + IDs of each sample in the batch + """ + res = collate( + samples, + pad_idx=self.src_dict.pad(), + eos_idx=self.eos, + left_pad_source=self.left_pad_source, + left_pad_target=self.left_pad_target, + input_feeding=self.input_feeding, + pad_to_length=pad_to_length, + pad_to_multiple=self.pad_to_multiple, + ) + if self.src_lang_id is not None or self.tgt_lang_id is not None: + src_tokens = res["net_input"]["src_tokens"] + bsz = src_tokens.size(0) + if self.src_lang_id is not None: + res["net_input"]["src_lang_id"] = ( + torch.LongTensor([[self.src_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + if self.tgt_lang_id is not None: + res["tgt_lang_id"] = ( + torch.LongTensor([[self.tgt_lang_id]]).expand(bsz, 1).to(src_tokens) + ) + return res + + def num_tokens(self, index): + """Return the number of tokens in a sample. This value is used to + enforce ``--max-tokens`` during batching.""" + return max( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def num_tokens_vec(self, indices): + """Return the number of tokens for a set of positions defined by indices. + This value is used to enforce ``--max-tokens`` during batching.""" + sizes = self.src_sizes[indices] + if self.tgt_sizes is not None: + sizes = np.maximum(sizes, self.tgt_sizes[indices]) + return sizes + + def size(self, index): + """Return an example's size as a float or tuple. This value is used when + filtering a dataset with ``--max-positions``.""" + return ( + self.src_sizes[index], + self.tgt_sizes[index] if self.tgt_sizes is not None else 0, + ) + + def ordered_indices(self): + """Return an ordered list of indices. Batches will be constructed based + on this order.""" + if self.shuffle: + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + if self.buckets is None: + # sort by target length, then source length + if self.tgt_sizes is not None: + indices = indices[np.argsort(self.tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(self.src_sizes[indices], kind="mergesort")] + else: + # sort by bucketed_num_tokens, which is: + # max(padded_src_len, padded_tgt_len) + return indices[ + np.argsort(self.bucketed_num_tokens[indices], kind="mergesort") + ] + + @property + def supports_prefetch(self): + return getattr(self.src, "supports_prefetch", False) and ( + getattr(self.tgt, "supports_prefetch", False) or self.tgt is None + ) + + def prefetch(self, indices): + self.src.prefetch(indices) + if self.tgt is not None: + self.tgt.prefetch(indices) + if self.align_dataset is not None: + self.align_dataset.prefetch(indices) + + def filter_indices_by_size(self, indices, max_sizes): + """Filter a list of sample indices. Remove those that are longer + than specified in max_sizes. + + Args: + indices (np.array): original array of sample indices + max_sizes (int or list[int] or tuple[int]): max sample size, + can be defined separately for src and tgt (then list or tuple) + + Returns: + np.array: filtered sample array + list: list of removed indices + """ + return data_utils.filter_paired_dataset_indices_by_size( + self.src_sizes, + self.tgt_sizes, + indices, + max_sizes, + ) diff --git a/SpeechUT/speechut/data/load_langpair_dataset.py b/SpeechUT/speechut/data/load_langpair_dataset.py new file mode 100644 index 0000000..bfd2045 --- /dev/null +++ b/SpeechUT/speechut/data/load_langpair_dataset.py @@ -0,0 +1,172 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/272c4c5197250997148fb12c0db6306035f166a4/fairseq/tasks/translation.py + 1. Add custom lang_format in function load_langpair_dataset + 2. If truncate_source (default no), use RandomCropDataset instead of TruncateDataset +""" + +import itertools +import logging +import os + +from fairseq.data import ( + AppendTokenDataset, + LanguagePairDataset, + PrependTokenDataset, + StripTokenDataset, + TruncateDataset, + RandomCropDataset, + data_utils, + indexed_dataset, +) + +from speechut.data.concat_dataset import ConcatDataset + + +EVAL_BLEU_ORDER = 4 + + +logger = logging.getLogger(__name__) + + +def load_langpair_dataset( + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, + lang_format="[{}]", + input_feeding=True, +): + def split_exists(split, src, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}.{}".format(split, src, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, src, tgt)) + elif split_exists(split_k, tgt, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, tgt, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + if truncate_source: + src_dataset = AppendTokenDataset( + RandomCropDataset( + StripTokenDataset(src_dataset, src_dict.eos()), + max_source_positions - 1, + ), + src_dict.eos(), + ) + src_datasets.append(src_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{} {} examples".format( + data_path, split_k, src, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index(lang_format.format(src)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index(lang_format.format(tgt)) + ) + eos = tgt_dict.index(lang_format.format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguagePairDataset( + src_dataset, + src_dataset.sizes, + src_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + input_feeding=input_feeding, + ) diff --git a/SpeechUT/speechut/data/multimodal_corpus_dataset.py b/SpeechUT/speechut/data/multimodal_corpus_dataset.py new file mode 100644 index 0000000..19a6f89 --- /dev/null +++ b/SpeechUT/speechut/data/multimodal_corpus_dataset.py @@ -0,0 +1,368 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +from os import replace +import time +from collections import OrderedDict +from typing import Any, Dict, List, Optional + +import numpy as np +from fairseq.data import data_utils + +from fairseq.data import FairseqDataset + +logger = logging.getLogger(__name__) + + +class MultiCorpusDataset(FairseqDataset): + """ + see fairseq/fairseq/data/multi_corpus_dataset.__doc__ + + Args: + datasets: a OrderedDict of FairseqDataset instances. + distribution: a List containing the probability of getting an utterance from + corresponding dataset + seed: random seed for sampling the datsets + sort_indices: if true, will sort the ordered indices by size + batch_sample: if true, will ensure each batch is from a single dataset + """ + + def __init__( + self, + datasets: Dict[str, FairseqDataset], + max_positions: Dict, + distribution: List[float], + max_tokens_ratio: List[float], + seed: int = 1234, + sort_indices: bool = False, + check_length: bool = False, + ): + super().__init__() + assert isinstance(datasets, OrderedDict) + assert len(datasets) == len(distribution) + # assert sum(distribution) == 1 + self.datasets = datasets + self.distribution = distribution + self.max_tokens_ratio = max_tokens_ratio + self.seed = seed + self.sort_indices = sort_indices + self.max_positions = max_positions + self.check_length = check_length + + # Avoid repeated conversions to list later + self.dataset_list = list(datasets.values()) + self.total_num_instances = 0 + + # first_dataset = self.dataset_list[0] + + self.num_instances_per_dataset = [] + self.dataset_offsets = [] + for i, dataset in enumerate(self.dataset_list): + assert isinstance(dataset, FairseqDataset) + # assert type(dataset) is type(first_dataset) + self.num_instances_per_dataset.append( + 0 if self.distribution[i] == 0 else len(dataset) + ) + self.dataset_offsets.append(self.total_num_instances) + self.total_num_instances += self.num_instances_per_dataset[i] + + def ordered_indices(self): + start = time.time() + with data_utils.numpy_seed(self.seed, self.epoch): + logger.info(f"sampling new dataset with seed {self.seed} epoch {self.epoch}") + sampled_indices = {} + + # For each dataset i, sample self.distribution[i] * self.total_num_instances + for i, key in enumerate(self.datasets): + tp = time.time() + if self.distribution[i] == 0: + # skip dataset if sampling probability is 0 + continue + + if i < len(self.datasets) - 1: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.dataset_offsets[i + 1] + else: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.total_num_instances + + logger.info(f"sampling {num_instances} from {key} dataset") + + # First, add k copies of the dataset where k = num_instances // len(dataset). + # This ensures an equal distribution of the data points as much as possible. + # For the remaining entries randomly sample them + dataset_size = len(self.datasets[key]) + num_copies = num_instances // dataset_size + dataset_indices = np.random.permutation(high - self.dataset_offsets[i])[: num_instances - num_copies * dataset_size] + if num_copies > 0: + dataset_indices = np.concatenate( + ( + np.repeat( + np.arange(high - self.dataset_offsets[i]), num_copies + ), + dataset_indices, + ) + ) + # filter by size, we should ignore it by setting check_length=False + # , as it is very time-consuming on large dadaset + if self.max_positions[key] is not None and self.check_length: + dataset_indices, ignored = self.datasets[key].filter_indices_by_size( + dataset_indices, + self.max_positions[key], + ) + if len(ignored) > 0: + logger.warning( + ( + "{:,} samples have invalid sizes and will be skipped, " + "max_positions={}, first few sample ids={}" + ).format(len(ignored), self.max_positions[key], ignored[:10]) + ) + + if self.sort_indices: + logger.info(" - sampled indices took {}s".format(time.time() - tp)) + tp = time.time() + dataset_indices = np.sort(dataset_indices) + ordered_indices = self.datasets[key].ordered_indices() + if isinstance(ordered_indices[0], np.ndarray): # chunked audio data + dataset_indices = [order_idx + self.dataset_offsets[i] for order_idx in ordered_indices] + assert self.dataset_offsets[i] == 0 + # TODO for chunked audio data, now assume len(dataset_indices) == len(dataset). Don't filter any data. + else: + dataset_indices = ordered_indices[dataset_indices] + self.dataset_offsets[i] + logger.info(" - ordered_indices took {}s".format(time.time() - tp)) + else: + np.random.shuffle(dataset_indices) + + sampled_indices[key] = dataset_indices + + logger.info( + "multi_corpus_dataset ordered_indices took {}s".format( + time.time() - start + ) + ) + return sampled_indices + + def _map_index(self, index: int): + """ + If dataset A has length N and dataset B has length M + then index 1 maps to index 1 of dataset A, and index N + 1 + maps to index 1 of B. + """ + counter = 0 + for num_instances, key in zip(self.num_instances_per_dataset, self.datasets): + if index < counter + num_instances: + return index - counter, key + counter += num_instances + raise ValueError( + "Invalid index: {}, max: {}".format(index, self.total_num_instances) + ) + + def __len__(self): + """ + Length of this dataset is the sum of individual datasets + """ + return self.total_num_instances + + def __getitem__(self, index): + new_index, key = self._map_index(index) + try: + item = self.datasets[key][new_index] + item["full_id"] = index + return item + except Exception as e: + e.args = (f"Error from {key} dataset", *e.args) + raise + + def collater(self, samples): + """ + If we are doing batch sampling, then pick the right collater to use. + + Otherwise we assume all collaters are the same. + """ + if len(samples) == 0: + return None + + samples_dict = {key: [] for key in self.datasets} + for s in samples: + _, key = self._map_index(s["full_id"]) + samples_dict[key].append(s) + + batch = {} + for key in samples_dict: + if len(samples_dict[key]) == 0: + continue + batch[key] = self.datasets[key].collater(samples_dict[key]) + + return batch + + + def num_tokens(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].num_tokens(index) + + def size(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].size(index) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return False + + def set_epoch(self, epoch, **unused): + super().set_epoch(epoch) + logger.info(f"setting epoch of multi_corpus_dataset to {epoch}") + for ds in self.dataset_list: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) + self.epoch = epoch + + @property + def supports_prefetch(self): + return False + + @property + def supports_fetch_outside_dataloader(self): + return all( + self.datasets[key].supports_fetch_outside_dataloader + for key in self.datasets + ) + + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + dataset_indices = indices + batches_dict = {} + for n, key in enumerate(dataset_indices): + max_tokens_ratio = self.max_tokens_ratio[n] + if isinstance(dataset_indices[key][0], np.ndarray): # chunked audio data + cur_batches = self.datasets[key].batch_by_size( + dataset_indices[key], + round(max_tokens * max_tokens_ratio), + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {sum([len(b) for b in cur_batches])} [{len(cur_batches)}] batches for dataset {key}") + else: + cur_batches = super().batch_by_size( + np.array(dataset_indices[key], dtype=np.int64), + round(max_tokens * max_tokens_ratio), + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {len(cur_batches)} batches for dataset {key}") + batches_dict[key] = cur_batches + + return batches_dict + + + def get_batch_sampler( + self, + indices, + num_shards, + seed, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + split_modality_batch=False, + ): + + def batch_sampler(dataset, epoch): + start = time.time() + batches_dict = dataset.batch_by_size( + indices, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + logger.info(f"multi_corpus_dataset, batch_by_size took {time.time() - start}s") + start = time.time() + new_batches = [] + + ### shuffle inner group size, split into speech/text batches + shuffled_batches_list = [] + speech_batches = [] + ### we should specify the speech_batches because: we need concatenate different speech datasets + # (e.g. ltr or km) instead of loading them parellelly. + for name, batches in batches_dict.items(): + if name.startswith("speech"): + if isinstance(batches[0], list): # chunked audio data + batches = self.datasets[name].shuffle_batches(list(batches), seed + epoch) + shuffled_batches_list.append(batches) + else: + batches = inner_bucket_shuffle(batches, seed+epoch, num_shards*10) + batches = batches[: (len(batches) // num_shards) * num_shards] + if len(batches) == 0: + logger.warning(f"Sample 0 batch for {name}, you should ensure that no {name} data provided.") + else: + speech_batches += batches + else: + batches = inner_bucket_shuffle(batches, seed+epoch, num_shards*10) + batches = batches[: (len(batches) // num_shards) * num_shards] + if len(batches) == 0: + logger.warning(f"Sample 0 batch for {name}, you should ensure that no {name} data provided.") + else: + batches = shuffle_buckets(batches, seed=seed+epoch, inner_shuf=False) + shuffled_batches_list.append(batches) + if len(speech_batches) > 0: + speech_batches = shuffle_buckets(speech_batches, seed=seed+epoch, inner_shuf=False) + shuffled_batches_list.append(speech_batches) + + ### create the final new_batches + num_batch = min(len(batches) for batches in shuffled_batches_list) + if split_modality_batch: + for i in range(0, num_batch, num_shards): + for batches in shuffled_batches_list: + new_batches += batches[i: i + num_shards] + else: + for i in range(num_batch): + new_batches.append(np.concatenate([batches[i] for batches in shuffled_batches_list])) + + logger.info(f"multi_corpus_dataset sample {len(new_batches)} batches, took {time.time() - start}s") + return new_batches + + def inner_bucket_shuffle(batches, seed, bucket_size=10, thr=0): + """we assert batches is sorted form long to short. + shuffle samples in a buctet(e.g. 10 batches). + batches: a list of numpy array""" + num_batch = len(batches) + new_batches = [] + num_buckets = len(batches) // bucket_size + i = 0 + while i < num_batch: + if (i < bucket_size * thr or + i >= bucket_size * (num_buckets - thr) + ): + new_batches.append(batches[i]) + i += 1 + else: + group = np.concatenate(batches[i: i+bucket_size]) + with data_utils.numpy_seed(seed): + np.random.shuffle(group) + new_batches += np.array_split(group, bucket_size) + i += bucket_size + assert all([len(batch) > 0 for batch in new_batches]) + return new_batches + + def shuffle_buckets(batches, seed, inner_shuf=True): + if inner_shuf: + batches = inner_bucket_shuffle(batches, seed, num_shards*10) + batches = [batches[i: i + num_shards] for i in range(0, len(batches)-num_shards+1, num_shards)] + assert len(batches[-1]) == num_shards + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for group in batches: + new_batches += group + return new_batches + + return batch_sampler diff --git a/SpeechUT/speechut/models/__init__.py b/SpeechUT/speechut/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SpeechUT/speechut/models/speechut.py b/SpeechUT/speechut/models/speechut.py new file mode 100644 index 0000000..cb66828 --- /dev/null +++ b/SpeechUT/speechut/models/speechut.py @@ -0,0 +1,785 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Tuple + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F + +from fairseq import utils, checkpoint_utils +from fairseq.data.data_utils import compute_mask_indices +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass import ChoiceEnum +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.transformer import Embedding +from fairseq.file_io import PathManager +from torch import Tensor +from fairseq.models.wav2vec.wav2vec2 import ConvFeatureExtractionModel +from fairseq.modules import GradMultiply, LayerNorm +from fairseq.tasks.hubert_pretraining import ( + HubertPretrainingConfig, + HubertPretrainingTask, +) +from fairseq.models.hubert import HubertConfig +from fairseq.models.transformer import TransformerConfig +from speechut.modules import TransformerEncoder +from speechut.modules import TransformerEncoderBase +from speechut.modules import TransformerDecoderBaseScriptable + +logger = logging.getLogger(__name__) + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +@dataclass + +class SpeechutConfig(HubertConfig): + use_rel_pos_enc: bool = field( + default=False, + metadata={"help": "whether to use relative positional encoding"}, + ) + scaling_for_att: float = field( + default=1.0, + metadata={"help": "scaling for attention weights to prevent overflow issue (for large model)"}, + ) + + # unit encoder-decoder + text_transformer: TransformerConfig = TransformerConfig() + reset_decoder_embedding_config: bool = field( + default=False, + metadata={"help": "reset the no_scale_embedding/layernorm_embedding to default for the decoder"}, + ) + add_unit_encoder: bool = field( + default=False, + metadata={"help": "add unit encoder"}, + ) + add_decoder: bool = field( + default=True, + metadata={"help": "add decoder"}, + ) + add_text_ctc: bool = field( + default=False, + metadata={"help": "add_text_ctc head"}, + ) + text_ctc_conv_kernel: int = field( + default=2, + metadata={"help": "text_ctc_conv kernel size"}, + ) + mask_u2t: bool = field( + default=True, + metadata={"help": "mask the unit input in unit-to-text task"}, + ) + + # embedding mixing + mix_with_unit: bool = field( + default=True, + metadata={"help": "mix with the unit embeddings"}, + ) + use_pred_unit: bool = field( + default=False, + metadata={"help": "use the embeddings of predicted units"}, + ) + l2_embedding: bool = field( + default=False, + metadata={"help": "compute l2 loss between unit embedding and unit hidden state"}, + ) + + # Finetune related + encoder_dict_size: int = field( + default=-1, + metadata={"help": "text encoder dictionary dimension"}, + ) + + decoder_dict_size: int = field( + default=-1, + metadata={"help": "decoder dictionary dimension"}, + ) + + +@register_model("speechut", dataclass=SpeechutConfig) +class SpeechutModel(BaseFairseqModel): + def __init__( + self, + cfg: SpeechutConfig, + task_cfg: HubertPretrainingConfig, + dictionaries: List[Dictionary], + unit_dictionary: Dictionary = None, + text_tgt_dictionary: Dictionary = None, + ) -> None: + super().__init__() + logger.info(f"SpeechutModel Config: {cfg}") + + feature_enc_layers = eval(cfg.conv_feature_layers) # noqa + self.embed = feature_enc_layers[-1][0] + + self.feature_extractor = ConvFeatureExtractionModel( + conv_layers=feature_enc_layers, + dropout=0.0, + mode=cfg.extractor_mode, + conv_bias=cfg.conv_bias, + ) + feature_ds_rate = np.prod([s for _, _, s in feature_enc_layers]) + self.feat2tar_ratio = cfg.label_rate * feature_ds_rate / task_cfg.sample_rate + + self.post_extract_proj = ( + nn.Linear(self.embed, cfg.encoder_embed_dim) + if self.embed != cfg.encoder_embed_dim + else None + ) + + self.mask_prob = cfg.mask_prob + self.mask_selection = cfg.mask_selection + self.mask_other = cfg.mask_other + self.mask_length = cfg.mask_length + self.no_mask_overlap = cfg.no_mask_overlap + self.mask_min_space = cfg.mask_min_space + + self.mask_channel_prob = cfg.mask_channel_prob + self.mask_channel_selection = cfg.mask_channel_selection + self.mask_channel_other = cfg.mask_channel_other + self.mask_channel_length = cfg.mask_channel_length + self.no_mask_channel_overlap = cfg.no_mask_channel_overlap + self.mask_channel_min_space = cfg.mask_channel_min_space + + self.dropout_input = nn.Dropout(cfg.dropout_input) + self.dropout_features = nn.Dropout(cfg.dropout_features) + + self.feature_grad_mult = cfg.feature_grad_mult + self.logit_temp = cfg.logit_temp + self.skip_masked = cfg.skip_masked + self.skip_nomask = cfg.skip_nomask + + final_dim = cfg.final_dim if cfg.final_dim > 0 else cfg.encoder_embed_dim + + self.mask_emb = nn.Parameter( + torch.FloatTensor(cfg.encoder_embed_dim).uniform_() + ) + + self.encoder = TransformerEncoder(cfg) + self.layer_norm = LayerNorm(self.embed) + + self.target_glu = None + if cfg.target_glu: + self.target_glu = nn.Sequential( + nn.Linear(final_dim, final_dim * 2), nn.GLU() + ) + + self.final_dim = final_dim + assert len(dictionaries) <= 2, f"Only support <=2 kinds of targets, get {len(dictionaries)} dictionaries" + if len(dictionaries) == 1: + dictionaries = [dictionaries[0], dictionaries[0]] + self.num_classes = [len(d) for d in dictionaries] + + self.final_proj = nn.Linear(cfg.encoder_embed_dim, final_dim) + self.code_encoder_proj = nn.Linear(cfg.text_transformer.encoder.embed_dim, self.num_classes[-1]) + self.final_proj_list = [self.final_proj, self.code_encoder_proj] + + self.label_embs_concat = nn.Parameter(torch.FloatTensor(self.num_classes[0], final_dim)) + self.label_embs_list = [self.label_embs_concat] + for p in self.label_embs_list: + nn.init.uniform_(p) + + ### build unit encoder: + self.mask_u2t = cfg.mask_u2t + self.add_text_ctc = cfg.add_text_ctc + self.text_ctc_conv_kernel = cfg.text_ctc_conv_kernel + self.padding_idx = unit_dictionary.pad() + self.unit_mask_idx = unit_dictionary.index("<mask>") + + self.add_unit_encoder = cfg.add_unit_encoder + self.mix_with_unit = cfg.mix_with_unit + self.use_pred_unit = cfg.use_pred_unit + self.l2_embedding = cfg.l2_embedding + if self.add_unit_encoder: + assert len(unit_dictionary) == self.num_classes[0], f"unit_dictionary: {len(unit_dictionary)}, self.num_classes[0]: {self.num_classes[0]}" + ### build unit pre-net, and shared with hubert label_embs if needed (default: False) + self.unit_embed_tokens = self.build_embedding( + unit_dictionary, + cfg.text_transformer.encoder.embed_dim, + ) + if self.final_dim == cfg.text_transformer.encoder.embed_dim: + logger.info("Share label_embs[0] with unit_embed_tokens ...") + nn.init.uniform_(self.unit_embed_tokens.weight) + self.label_embs_list[0] = self.unit_embed_tokens.weight + + ### build unit encoder + self.unit_encoder = TransformerEncoderBase( + cfg.text_transformer, + unit_dictionary, + self.unit_embed_tokens, + use_rel_pos_enc=cfg.use_rel_pos_enc, + scaling_for_att=cfg.scaling_for_att, + ) + + ### build text ctc head + if self.add_text_ctc: + conv = nn.Conv1d( + cfg.text_transformer.encoder.embed_dim, cfg.text_transformer.encoder.embed_dim, + self.text_ctc_conv_kernel, + stride=self.text_ctc_conv_kernel // 2, + bias=False, + padding=self.text_ctc_conv_kernel // 2, + ) + nn.init.kaiming_normal_(conv.weight) + self.unit_encoder_ctc_head = nn.Sequential( + Rotate3D(), + conv, + nn.Dropout(p=0.1), + nn.Sequential( + Rotate3D(), + Rotate3D(), + LayerNorm(cfg.text_transformer.encoder.embed_dim), + ), + nn.GELU(), + nn.Linear(cfg.text_transformer.encoder.embed_dim, len(text_tgt_dictionary)), + ) + + ### build unit2text decoder, not available for now + self.add_decoder = cfg.add_decoder + self.text_transformer_cfg = cfg.text_transformer + if self.add_decoder: + # To make sure that the decoder dict size is the same as the fine-tuning tgt_dict size or bpe code dict size + dec_dictionary = self.cutting_dictionary(text_tgt_dictionary, cfg.decoder_dict_size) + decoder_embed_tokens = self.build_embedding( + dec_dictionary, cfg.text_transformer.decoder.embed_dim + ) + if cfg.reset_decoder_embedding_config: + cfg.text_transformer.no_scale_embedding = False + cfg.text_transformer.layernorm_embedding = False + cfg.text_transformer.no_token_positional_embeddings = False + self.decoder = TransformerDecoderBaseScriptable(cfg.text_transformer, dec_dictionary, decoder_embed_tokens, use_rel_pos_enc=cfg.use_rel_pos_enc) + + + def cutting_dictionary(self, dictionary, dict_size): + if dictionary is None or dict_size <= 0: + return dictionary + else: + import copy + cut_dictionary = copy.deepcopy(dictionary) + if dict_size > len(cut_dictionary): + for i in range(dict_size - len(cut_dictionary)): + cut_dictionary.symbols.append(f'_{i}_') + else: + cut_dictionary.symbols = cut_dictionary.symbols[:dict_size] + return cut_dictionary + + def build_embedding(self, dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechutConfig, task: HubertPretrainingTask): + """Build a new model instance.""" + unit_dictionary = getattr(task, "text_src_dictionary", None) + text_tgt_dictionary = getattr(task, "text_dictionary", None) + model = SpeechutModel(cfg, task.cfg, task.dictionaries, unit_dictionary, text_tgt_dictionary) + return model + + def apply_mask(self, x, padding_mask, target_list): + B, T, C = x.shape + if self.mask_prob > 0: + mask_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob, + self.mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x[mask_indices] = self.mask_emb + else: + mask_indices = None + + if self.mask_channel_prob > 0: + mask_channel_indices = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + return x, mask_indices + + def forward_features(self, source: torch.Tensor) -> torch.Tensor: + if self.feature_grad_mult > 0: + features = self.feature_extractor(source) + if self.feature_grad_mult != 1.0: + features = GradMultiply.apply(features, self.feature_grad_mult) + else: + with torch.no_grad(): + features = self.feature_extractor(source) + return features + + def forward_targets( + self, + features: torch.Tensor, + target_list: List[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + # Trim features to ensure labels exist and then get aligned labels + feat_tsz = features.size(2) + targ_tsz = min([t.size(1) for t in target_list]) + if self.feat2tar_ratio * feat_tsz > targ_tsz: + feat_tsz = int(targ_tsz / self.feat2tar_ratio) + features = features[..., :feat_tsz] + target_inds = torch.arange(feat_tsz).float() * self.feat2tar_ratio + target_inds += np.random.choice(int(self.feat2tar_ratio)) + target_list = [t[:, target_inds.long()] for t in target_list] + return features, target_list + + def forward_padding_mask( + self, + features: torch.Tensor, + padding_mask: torch.Tensor, + ) -> torch.Tensor: + extra = padding_mask.size(1) % features.size(1) + if extra > 0: + padding_mask = padding_mask[:, :-extra] + padding_mask = padding_mask.view(padding_mask.size(0), features.size(1), -1) + padding_mask = padding_mask.all(-1) + return padding_mask + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def downsample_ctc_padding_mask(self, padding_mask): + """ + padding_mask: (B, T) + """ + stride = self.text_ctc_conv_kernel // 2 + return padding_mask[:, ::stride] + + def compute_pred(self, proj_x, label_embs): + if self.target_glu: + label_embs = self.target_glu(label_embs) + x = F.normalize(proj_x.float(), dim=-1) # (S, D) + label_embs = F.normalize(label_embs.float(), dim=-1) # (C, D) + logits = torch.matmul(x, label_embs.T).type_as(proj_x) # (S, C) + logits /= self.logit_temp + return logits + + def compute_hubert_logits(self, x, target, proj, label_embs, padding_mask, mask_indices): + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = proj(x[masked_indices]) + logit_m_list = [(self.compute_pred(proj_x_m, label_embs), target[masked_indices])] + else: + logit_m_list = [None] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = proj(x[nomask_indices]) + logit_u_list = [(self.compute_pred(proj_x_u, label_embs), target[nomask_indices])] + else: + logit_u_list = [None] + + return logit_m_list, logit_u_list + + def compute_ce_logits(self, x, target, proj, padding_mask, mask_indices): + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + logit_m_list = [(proj(x[masked_indices]), target[masked_indices])] + else: + logit_m_list = [None] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + logit_u_list = [(proj(x[nomask_indices]), target[nomask_indices])] + else: + logit_u_list = [None] + + return logit_m_list, logit_u_list + + def convert_embeddings(self, + x, + padding_mask, + target=None, + mask_indices=None, + mix_with_unit=False, + use_pred_unit=False, + l2_embedding=False, + remask=False + ): + """ + 1. Mix with units if needed (default: True) + 2. Prepare for unit_encoder inputs + Inputs: + x, (B, T, D) + Return: + src_tokens, (B, T) + soft_embeddings, (B, T, D) + l2_loss, a loss + """ + soft_embeddings = self.final_proj_list[0](x) if x.size(-1) == self.final_dim else x + if padding_mask is None: + padding_mask = soft_embeddings.new_zeros(soft_embeddings.size(0), soft_embeddings.size(1), dtype=torch.long) + if use_pred_unit: + src_tokens = self.compute_pred(self.final_proj_list[0](x), self.label_embs_list[0]).argmax(dim=-1) + src_tokens[padding_mask] = self.padding_idx + elif target is not None: + src_tokens = target + else: + src_tokens = padding_mask.long() + + if l2_embedding | mix_with_unit: + unit_embeddings = self.unit_embed_tokens(src_tokens) # (B, T, D) + + l2_loss = 0 + if l2_embedding: + if mask_indices is not None: + l2_loss = (soft_embeddings - unit_embeddings)[mask_indices].float().pow(2).mean(dim=-1) + scale = unit_embeddings[mask_indices].float().pow(2).sum(dim=-1) + else: + l2_loss = (soft_embeddings - unit_embeddings).float().pow(2).mean(dim=-1) + scale = unit_embeddings.float().pow(2).sum(dim=-1) + l2_loss = (l2_loss / scale).mean() + + if mix_with_unit: + B, T, D = x.shape + selected_indices = compute_mask_indices( + (B, T), + padding_mask, + self.mask_prob / 2, + self.mask_length // 2, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + selected_indices = torch.from_numpy(selected_indices).to(x.device) + if mask_indices is not None: + if remask: + remask_indices = torch.logical_and(selected_indices, mask_indices) + soft_embeddings[remask_indices] = self.mask_emb + swap_indices = torch.logical_and(selected_indices, ~mask_indices) + else: + swap_indices = selected_indices + soft_embeddings[swap_indices] = unit_embeddings[swap_indices] + + soft_embeddings = soft_embeddings * (1 - padding_mask.unsqueeze(-1).type_as(x)) + return src_tokens, soft_embeddings, l2_loss + + def forward( + self, + source: torch.Tensor = None, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + prev_output_tokens: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert source is not None or src_tokens is not None + if source is not None: + return self.forward_speech( + source=source, + target_list=target_list, + padding_mask=padding_mask, + mask=mask, + features_only=features_only, + output_layer=output_layer, + ) + else: + return self.forward_text( + src_tokens=src_tokens, + src_lengths=src_lengths, + prev_output_tokens=prev_output_tokens, + mask=self.mask_u2t, + features_only=features_only, + output_layer=output_layer, + ) + + def forward_speech( + self, + source: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + features = self.forward_features(source) + if target_list is not None: + features, target_list = self.forward_targets(features, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + if mask: + x, mask_indices = self.apply_mask(features, padding_mask, target_list) + else: + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1, + ) + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features} + + logit_m_list, logit_u_list = self.compute_hubert_logits( + x, + target_list[0], + self.final_proj_list[0], + self.label_embs_list[0], + padding_mask, + mask_indices, + ) + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + + if self.add_unit_encoder: + src_tokens, x_emb, l2_loss = self.convert_embeddings( + x, + padding_mask, target_list[0], + mask_indices=mask_indices, + mix_with_unit=self.mix_with_unit, + use_pred_unit=self.use_pred_unit, + l2_embedding=self.l2_embedding, + ) + encoder_out = self.unit_encoder(src_tokens, token_embeddings=x_emb) + + result['encoder_out'] = encoder_out['encoder_out'] # [(T, B, D)] + result['encoder_padding_mask'] = encoder_out['encoder_padding_mask'] # [(B, T)] + if self.l2_embedding: + result['embedding_l2_loss'] = l2_loss + + code_logit_m_list, code_logit_u_list = self.compute_ce_logits( + encoder_out['encoder_out'][0].transpose(0, 1), # -> (B, T, C) + target_list[-1], + self.final_proj_list[1], + padding_mask, + mask_indices, + ) + result['logit_m_list'] += code_logit_m_list + result['logit_u_list'] += code_logit_u_list + return result + + def forward_text( + self, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + prev_output_tokens: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + ) -> Dict[str, torch.Tensor]: + assert self.add_unit_encoder, f"Can not forward unit-text branch without unit_encoder!" + + padding_mask = src_tokens == self.padding_idx + unit_embeddings = self.unit_embed_tokens(src_tokens) + if mask: + unit_embeddings, mask_indices = self.apply_mask(unit_embeddings, padding_mask, [src_tokens]) + + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=unit_embeddings, + return_all_hiddens=output_layer is not None, + ) + + result = {} + result["encoder_out"] = encoder_out["encoder_out"] + result["encoder_states"] = encoder_out["encoder_states"] + result["padding_mask"] = padding_mask + + if self.add_text_ctc: + result["encoder_out_ctc"] = [self.unit_encoder_ctc_head(x) for x in encoder_out['encoder_out']] + result["encoder_padding_mask"] = [ + self.downsample_ctc_padding_mask(padding_mask) for padding_mask in encoder_out['encoder_padding_mask'] + ] + + if features_only: + return result + if self.add_decoder: + assert prev_output_tokens is not None + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, encoder_out=encoder_out, + ) + result['decoder_out'] = decoder_out + return result + + def forward_mum(self, src_tokens, target, mask=True): + target_list = [target] + padding_mask = src_tokens.eq(self.unit_encoder.padding_idx) + unit_embeddings = self.unit_embed_tokens(src_tokens) + if mask: + unit_embeddings, mask_indices = self.apply_mask(unit_embeddings, padding_mask, target_list) + else: + ### If already applied mask on src_tokens, then the target_list should contains many padding_idx + mask_indices = target_list[-1] != self.padding_idx + unit_embeddings[mask_indices] = self.mask_emb + + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=unit_embeddings, + ) + code_logit_m_list, code_logit_u_list = self.compute_ce_logits( + encoder_out["encoder_out"][0].transpose(0, 1), + target_list[-1], + self.final_proj_list[1], + padding_mask, + mask_indices, + ) + result = {} + result["logit_m_list"] = code_logit_m_list + result["logit_u_list"] = code_logit_u_list + result["padding_mask"] = padding_mask + return result + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + **kwargs, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """Extract encoder features for only speech input""" + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + x = res["x"] # B x T x D + padding_mask = res["padding_mask"] + + if self.add_unit_encoder: + src_tokens, x, _ = self.convert_embeddings( + x, + padding_mask, + mix_with_unit=False, + use_pred_unit=False, + ) + encoder_out = self.unit_encoder( + src_tokens, + token_embeddings=x, + return_all_hiddens=output_layer is not None + ) + res["x"] = encoder_out['encoder_out'][0].transpose(0, 1) # (B, T, D) + + feature = res["features"] if ret_conv else res["x"] + if output_layer is not None: + feature = encoder_out['encoder_states'] + + return feature, padding_mask + + def get_logits(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + logits_list = [x[0].float() for x in logits_list if x is not None] + return logits_list + + def get_targets(self, net_output, is_masked=True): + if is_masked: + logits_list = net_output["logit_m_list"] + else: + logits_list = net_output["logit_u_list"] + targets_list = [x[1].long() for x in logits_list if x is not None] + return targets_list + + def get_extra_losses(self, net_output): + extra_losses = [] + names = [] + + if "features_pen" in net_output: + extra_losses.append(net_output["features_pen"]) + names.append("features_pen") + + if "embedding_l2_loss" in net_output: + extra_losses.append(net_output["embedding_l2_loss"]) + names.append("embedding_l2_loss") + + return extra_losses, names + + def remove_pretraining_modules(self, step2=False): + self.target_glu = None + + def load_checkpoint(self, checkpoint: str): + if not PathManager.exists(checkpoint): + raise IOError("Model file not found: {}".format(checkpoint)) + state = checkpoint_utils.load_checkpoint_to_cpu(checkpoint) + return state + +class Rotate3D(nn.Module): + """ + (T, B, D) --> (B, D, T) --> (D, T, B) --> (T, B, D) + """ + def __init__(self): + super().__init__() + + def forward(self, x): + return x.permute(1, 2, 0) diff --git a/SpeechUT/speechut/models/speechut_asr.py b/SpeechUT/speechut/models/speechut_asr.py new file mode 100644 index 0000000..f9ec9d8 --- /dev/null +++ b/SpeechUT/speechut/models/speechut_asr.py @@ -0,0 +1,165 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import contextlib +import torch +from dataclasses import dataclass, field +from fairseq import utils +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.fairseq_encoder import FairseqEncoder +from fairseq.models.hubert import HubertAsrConfig, HubertEncoder +from fairseq.tasks import FairseqTask + +@dataclass +class SpeechUTASRConfig(HubertAsrConfig): + add_decoder: bool = field( + default=True, + metadata={"help": "add decoder for fine-tune"}, + ) + +@register_model("speechut_asr", dataclass=SpeechUTASRConfig) +class SpeechUTASR(BaseFairseqModel): + """ + A encoder-ctc-decoder model if cfg.add_decoder is True, or a encoder-ctc model + """ + def __init__(self, cfg: SpeechUTASRConfig, encoder: FairseqEncoder): + super().__init__() + self.cfg = cfg + self.encoder = encoder + if not cfg.add_decoder: + self.encoder.w2v_model.decoder = None + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechUTASRConfig, task: FairseqTask): + """Build a new model instance.""" + encoder = SpeechUTEncoder(cfg, task) + return cls(cfg, encoder) + + def forward(self, source, padding_mask, prev_output_tokens, **kwargs): + encoder_out = self.encoder(source, padding_mask, **kwargs) + + x = self.encoder.final_dropout(encoder_out['encoder_out'][0]) # (T, B, C) + if self.encoder.proj: + x = self.encoder.proj(x) + if self.encoder.conv_ctc_proj: + padding_mask = self.encoder.w2v_model.downsample_ctc_padding_mask(encoder_out["encoder_padding_mask"][0]) + else: + padding_mask = encoder_out["encoder_padding_mask"] + + decoder_out = self.decoder( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) if self.cfg.add_decoder else None + + return { + "encoder_out_ctc": x, # (T, B, C), for CTC loss + "padding_mask": padding_mask, # (B, T), for CTC loss + "decoder_out": decoder_out, # for ED loss + } + + def forward_decoder(self, prev_output_tokens, **kwargs): + return self.decoder(prev_output_tokens, **kwargs) + + def get_logits(self, net_output): + """For CTC decoding""" + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """For 1) computing CTC loss, 2) decoder decoding.""" + + if "encoder_out_ctc" in net_output: + logits = net_output["encoder_out_ctc"] + else: + return self.decoder.get_normalized_probs(net_output, log_probs, sample) + + if isinstance(logits, list): + logits = logits[0] + + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + @property + def decoder(self): + return self.encoder.w2v_model.decoder + + +class SpeechUTEncoder(HubertEncoder): + """ + Modified from fairseq.models.hubert.hubert_asr.HubertEncoder + 1. make it compatible with encoder-decoder model + """ + def __init__(self, cfg: HubertAsrConfig, task): + super().__init__(cfg, task) + + if (task.target_dictionary is not None) and ( + hasattr(self.w2v_model, "unit_encoder_ctc_head") + ): + self.proj = self.w2v_model.unit_encoder_ctc_head + self.conv_ctc_proj = True + else: + self.conv_ctc_proj = False + + def forward(self, source, padding_mask, tbc=True, **kwargs): + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + } + ft = self.freeze_finetune_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + x, padding_mask = self.w2v_model.extract_features(**w2v_args) + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [padding_mask], # B x T + } + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Forward the encoder out. + """ + x, padding_mask = self.w2v_model.extract_features(**net_input, mask=False) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + encoder_out = { + "encoder_out" : [x], + "encoder_padding_mask" : [padding_mask], + } + if self.proj: + x = self.proj(x) + encoder_out["encoder_out_ctc"] = x + + return encoder_out + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = [ + x.index_select(1, new_order) for x in encoder_out["encoder_out"] + ] + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = [ + x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"] + ] + return encoder_out diff --git a/SpeechUT/speechut/models/speechut_st.py b/SpeechUT/speechut/models/speechut_st.py new file mode 100644 index 0000000..6faaccf --- /dev/null +++ b/SpeechUT/speechut/models/speechut_st.py @@ -0,0 +1,221 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import contextlib +import torch +import torch.nn as nn +from argparse import Namespace +from dataclasses import dataclass +from typing import Any +from fairseq import checkpoint_utils, tasks +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.fairseq_encoder import FairseqEncoder +from fairseq.tasks import FairseqTask +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.data.data_utils import lengths_to_padding_mask + +from fairseq.models.hubert import HubertAsrConfig + +logger = logging.getLogger(__name__) + +@dataclass +class SpeechUTS2TConfig(HubertAsrConfig): + ### the following config is only for the compatibility to fairseq speech_to_text task + input_feat_per_channel: Any = None + input_channels: Any = None + speaker_to_id: Any = None + +@register_model("speechut_st_legacy", dataclass=SpeechUTS2TConfig) +class SpeechUTS2T(BaseFairseqModel): + """An encoder-decoder model.""" + def __init__(self, cfg: SpeechUTS2TConfig, encoder: FairseqEncoder): + super().__init__() + self.cfg = cfg + self.encoder = encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: SpeechUTS2TConfig, task: FairseqTask): + """Build a new model instance.""" + encoder = SpeechUTEncoder(cfg, task) + return cls(cfg, encoder) + + def forward(self, src_tokens, src_lengths, prev_output_tokens, **kwargs): + encoder_out = self.encoder(src_tokens, src_lengths, **kwargs) + decoder_out = self.encoder.w2v_model.decoder( + prev_output_tokens, encoder_out=encoder_out, **kwargs + ) + return decoder_out + + def forward_decoder(self, prev_output_tokens, **kwargs): + return self.encoder.w2v_model.decoder(prev_output_tokens, **kwargs) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """For decoder decoding.""" + return self.encoder.w2v_model.decoder.get_normalized_probs(net_output, log_probs, sample) + + @property + def decoder(self): + return self.encoder.w2v_model.decoder + + +class SpeechUTEncoder(FairseqEncoder): + """ + Modified from fairseq.models.hubert.hubert_asr.HubertEncoder + 1. make it compatible with fairseq speech_to_text task + 2. make it compatible with encoder-decoder model + """ + def __init__(self, cfg: SpeechUTS2TConfig, task): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + assert task.data_cfg.standardize_audio() == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + pretrain_task = tasks.setup_task(w2v_args.task, load_local_states=False) + assert state is not None and "task_state" in state, f"the stored dictionaries not found in checkpoint!" + # This will load the stored "dictionaries" object + pretrain_task.load_state_dict(state["task_state"]) + + model = pretrain_task.build_model(w2v_args.model, from_checkpoint=True) + if state is not None and not cfg.no_pretrained_weights: + try: + model.load_state_dict(state["model"], strict=True) + except Exception as e: + logger.warn(e) + model.load_state_dict(state["model"], strict=False) + + model.remove_pretraining_modules() + + super().__init__(pretrain_task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.num_updates = 0 + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, src_tokens=None, src_lengths=None, **kwargs): + + w2v_args = { + "source": src_tokens, + "padding_mask": lengths_to_padding_mask(src_lengths), + "mask": self.apply_mask and self.training, + } + + ft = self.freeze_finetune_updates <= self.num_updates + + with torch.no_grad() if not ft else contextlib.ExitStack(): + x, padding_mask = self.w2v_model.extract_features(**w2v_args) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [padding_mask], # B x T + "padding_mask": [padding_mask], + } + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Forward the encoder out. + """ + _net_input = { + "source": net_input["src_tokens"], + "padding_mask": lengths_to_padding_mask(net_input["src_lengths"]), + "mask": False, + } + + x, padding_mask = self.w2v_model.extract_features(**_net_input) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + encoder_out = { + "encoder_out" : [x], + "encoder_padding_mask" : [padding_mask], + } + return encoder_out + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = [ + x.index_select(1, new_order) for x in encoder_out["encoder_out"] + ] + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = [ + x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"] + ] + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim**-0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/SpeechUT/speechut/models/t5_transformer_lm.py b/SpeechUT/speechut/models/t5_transformer_lm.py new file mode 100644 index 0000000..3d16a2d --- /dev/null +++ b/SpeechUT/speechut/models/t5_transformer_lm.py @@ -0,0 +1,25 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from fairseq.models import ( + register_model_architecture, +) +from fairseq.models.transformer_lm import base_lm_architecture + + +@register_model_architecture(model_name="transformer_lm", arch_name="transformer_lm_t5") +def transformer_lm_t5(args): + args.decoder_embed_dim = getattr(args, "decoder_embed_dim", 1280) + args.decoder_ffn_embed_dim = getattr(args, "decoder_ffn_embed_dim", 6144) + args.decoder_layers = getattr(args, "decoder_layers", 20) + args.decoder_attention_heads = getattr(args, "decoder_attention_heads", 16) + args.dropout = getattr(args, "dropout", 0.1) + args.attention_dropout = getattr(args, "attention_dropout", 0.1) + args.activation_fn = getattr(args, "activation_fn", "gelu") + base_lm_architecture(args) diff --git a/SpeechUT/speechut/modules/__init__.py b/SpeechUT/speechut/modules/__init__.py new file mode 100644 index 0000000..dad9781 --- /dev/null +++ b/SpeechUT/speechut/modules/__init__.py @@ -0,0 +1,27 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +from .learned_positional_embedding import LearnedPositionalEmbedding +from .multihead_attention import MultiheadAttention +from .relative_pos_enc import RelativePositionalEncoding +from .transformer_layer import TransformerEncoderLayerBase, TransformerDecoderLayerBase +from .w2v_encoder import TransformerEncoder, TransformerSentenceEncoderLayer +from .transformer_encoder import TransformerEncoderBase +from .transformer_decoder import TransformerDecoderScriptable, TransformerDecoderBaseScriptable + +__all__ = [ + "MultiheadAttention", + "RelativePositionalEncoding", + "LearnedPositionalEmbedding", + "TransformerEncoderLayerBase", + "TransformerDecoderLayerBase", + "TransformerEncoder", + "TransformerSentenceEncoderLayer", + "TransformerEncoderBase", + "TransformerDecoderScriptable", + "TransformerDecoderBaseScriptable", +] diff --git a/SpeechUT/speechut/modules/ctc_prefix_score.py b/SpeechUT/speechut/modules/ctc_prefix_score.py new file mode 100644 index 0000000..b42cbd8 --- /dev/null +++ b/SpeechUT/speechut/modules/ctc_prefix_score.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +# Copyright 2018 Mitsubishi Electric Research Labs (Takaaki Hori) +# Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0) + +import numpy as np +import six + + +class CTCPrefixScore(object): + """Compute CTC label sequence scores + which is based on Algorithm 2 in WATANABE et al. + "HYBRID CTC/ATTENTION ARCHITECTURE FOR END-TO-END SPEECH RECOGNITION," + but extended to efficiently compute the probablities of multiple labels + simultaneously + """ + + def __init__(self, x, blank, eos, xp): + self.xp = xp + self.logzero = -10000000000.0 + self.blank = blank + self.eos = eos + self.input_length = len(x) + self.x = x + + def initial_state(self): + """Obtain an initial CTC state + :return: CTC state + """ + # initial CTC state is made of a frame x 2 tensor that corresponds to + # r_t^n(<sos>) and r_t^b(<sos>), where 0 and 1 of axis=1 represent + # superscripts n and b (non-blank and blank), respectively. + r = self.xp.full((self.input_length, 2), self.logzero, dtype=np.float32) + r[0, 1] = self.x[0, self.blank] + for i in six.moves.range(1, self.input_length): + r[i, 1] = r[i - 1, 1] + self.x[i, self.blank] + return r + + def __call__(self, y, cs, r_prev): + """Compute CTC prefix scores for next labels + :param y : prefix label sequence + :param cs : array of next labels + :param r_prev: previous CTC state + :return ctc_scores, ctc_states + """ + # initialize CTC states + output_length = len(y) - 1 # ignore sos + # new CTC states are prepared as a frame x (n or b) x n_labels tensor + # that corresponds to r_t^n(h) and r_t^b(h). + r = self.xp.ndarray((self.input_length, 2, len(cs)), dtype=np.float32) + xs = self.x[:, cs] + if output_length == 0: + r[0, 0] = xs[0] + r[0, 1] = self.logzero + else: + r[output_length - 1] = self.logzero + + # prepare forward probabilities for the last label + r_sum = self.xp.logaddexp( + r_prev[:, 0], r_prev[:, 1] + ) # log(r_t^n(g) + r_t^b(g)) + last = y[-1] + if output_length > 0 and last in cs: + log_phi = self.xp.ndarray((self.input_length, len(cs)), dtype=np.float32) + for i in six.moves.range(len(cs)): + log_phi[:, i] = r_sum if cs[i] != last else r_prev[:, 1] + else: + log_phi = r_sum + + # compute forward probabilities log(r_t^n(h)), log(r_t^b(h)), + # and log prefix probabilities log(psi) + start = max(output_length, 1) + log_psi = r[start - 1, 0] + for t in six.moves.range(start, self.input_length): + r[t, 0] = self.xp.logaddexp(r[t - 1, 0], log_phi[t - 1]) + xs[t] + r[t, 1] = ( + self.xp.logaddexp(r[t - 1, 0], r[t - 1, 1]) + self.x[t, self.blank] + ) + log_psi = self.xp.logaddexp(log_psi, log_phi[t - 1] + xs[t]) + + # get P(...eos|X) that ends with the prefix itself + eos_pos = self.xp.where(cs == self.eos)[0] + if len(eos_pos) > 0: + log_psi[eos_pos] = r_sum[-1] # log(r_T^n(g) + r_T^b(g)) + + # exclude blank probs + blank_pos = self.xp.where(cs == self.blank)[0] + if len(blank_pos) > 0: + log_psi[blank_pos] = self.logzero + + # return the log prefix probability and CTC states, where the label axis + # of the CTC states is moved to the first axis to slice it easily + return log_psi, self.xp.rollaxis(r, 2) diff --git a/SpeechUT/speechut/modules/learned_positional_embedding.py b/SpeechUT/speechut/modules/learned_positional_embedding.py new file mode 100644 index 0000000..20c8558 --- /dev/null +++ b/SpeechUT/speechut/modules/learned_positional_embedding.py @@ -0,0 +1,69 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/modules/learned_positional_embedding.py + 1. Add clamping if the input length exceeds the max-source-tokens +""" + +from typing import Dict, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + + +class LearnedPositionalEmbedding(nn.Embedding): + """ + This module learns positional embeddings up to a fixed maximum size. + Padding ids are ignored by either offsetting based on padding_idx + or by setting padding_idx to None and ensuring that the appropriate + position ids are passed to the forward function. + """ + + def __init__(self, num_embeddings: int, embedding_dim: int, padding_idx: int): + super().__init__(num_embeddings, embedding_dim, padding_idx) + self.onnx_trace = False + if self.padding_idx is not None: + self.max_positions = self.num_embeddings - self.padding_idx - 1 + else: + self.max_positions = self.num_embeddings + + def forward( + self, + input: Tensor, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + positions: Optional[Tensor] = None, + ): + """Input is expected to be of size [bsz x seqlen].""" + assert (positions is None) or ( + self.padding_idx is None + ), "If positions is pre-computed then padding_idx should not be set." + + if positions is None: + if incremental_state is not None: + # positions is the same for every token when decoding a single step + # Without the int() cast, it doesn't work in some cases when exporting to ONNX + positions = torch.zeros( + (1, 1), device=input.device, dtype=input.dtype + ).fill_(int(self.padding_idx + input.size(1))) + else: + positions = utils.make_positions( + input, self.padding_idx, onnx_trace=self.onnx_trace + ) + positions = torch.clamp(positions, max=self.padding_idx + self.max_positions) + return F.embedding( + positions, + self.weight, + self.padding_idx, + self.max_norm, + self.norm_type, + self.scale_grad_by_freq, + self.sparse, + ) diff --git a/SpeechUT/speechut/modules/multihead_attention.py b/SpeechUT/speechut/modules/multihead_attention.py new file mode 100644 index 0000000..89f46ab --- /dev/null +++ b/SpeechUT/speechut/modules/multihead_attention.py @@ -0,0 +1,346 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + +from fairseq.modules import MultiheadAttention as FairseqMultiheadAttention + + +class MultiheadAttention(FairseqMultiheadAttention): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + scaling_for_att=1.0 + ): + super().__init__( + embed_dim, + num_heads, + kdim, + vdim, + dropout, + bias, + add_bias_kv, + add_zero_attn, + self_attention, + encoder_decoder_attention, + q_noise, + qn_block_size, + ) + self.scaling_for_att = scaling_for_att + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + position_bias: Optional[Tensor] = None, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim, f"query dim {embed_dim} != {self.embed_dim}" + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + and position_bias is None + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + q *= (1 / self.scaling_for_att) + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + if position_bias is not None: ## first order + ## position_bias: [241, 241, 64] + #print ("attn_weights: ", attn_weights.size()) # [492, 241, 241] + reshape_q = q.contiguous().view(bsz * self.num_heads, -1, self.head_dim).transpose(0,1) #[241, 492, 64] + #print ("reshape_q: ", reshape_q.size()) + B = torch.matmul(reshape_q, position_bias.transpose(-2, -1)) + #print ("B: ", B.size()) ## [241, 492, 241] + #B = B.transpose(0, 1).view(bsz, self.num_heads, position_bias.size(0), position_bias.size(1)) + B = B.transpose(0, 1).view(bsz*self.num_heads, position_bias.size(0), position_bias.size(1)) + #print ("B 2: ", B.size()) + attn_weights += B + + attn_weights *= self.scaling_for_att + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if self.scaling_for_att > 1.0: + attn_weights = attn_weights - attn_weights.detach().max(dim=-1, keepdim=True)[0] + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights diff --git a/SpeechUT/speechut/modules/relative_pos_enc.py b/SpeechUT/speechut/modules/relative_pos_enc.py new file mode 100644 index 0000000..7021fc0 --- /dev/null +++ b/SpeechUT/speechut/modules/relative_pos_enc.py @@ -0,0 +1,33 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import torch + +class RelativePositionalEncoding(torch.nn.Module): + def __init__(self, d_model, maxlen=1000, embed_v=False): + super(RelativePositionalEncoding, self).__init__() + + self.d_model = d_model + self.maxlen = maxlen + self.pe_k = torch.nn.Embedding(2*maxlen, d_model) + if embed_v: + self.pe_v = torch.nn.Embedding(2*maxlen, d_model) + self.embed_v = embed_v + + + def forward(self, pos_seq, incremental_state=None): + pos_seq[pos_seq < -self.maxlen] = -self.maxlen + pos_seq[pos_seq >= self.maxlen] = self.maxlen - 1 + pos_seq = pos_seq + self.maxlen + + if incremental_state is not None: + pos_seq = pos_seq[-1:] + + if self.embed_v: + return self.pe_k(pos_seq), self.pe_v(pos_seq) + else: + return self.pe_k(pos_seq), None diff --git a/SpeechUT/speechut/modules/transformer_decoder.py b/SpeechUT/speechut/modules/transformer_decoder.py new file mode 100644 index 0000000..84417b4 --- /dev/null +++ b/SpeechUT/speechut/modules/transformer_decoder.py @@ -0,0 +1,543 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/transformer/transformer_decoder.py +""" + +import math +from typing import Any, Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqIncrementalDecoder +from fairseq.models.transformer import TransformerConfig +from fairseq.modules import ( + AdaptiveSoftmax, + BaseLayer, + FairseqDropout, + LayerDropModuleList, + LayerNorm, + PositionalEmbedding, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor + +from speechut.modules import transformer_layer +from speechut.modules import RelativePositionalEncoding + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerDecoderBase": + return "TransformerDecoder" + else: + return module_name + + +class TransformerDecoderBase(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *cfg.decoder.layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + use_rel_pos_enc=False, + ): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.decoder_layerdrop = cfg.decoder.layerdrop + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = cfg.decoder.embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = cfg.decoder.output_dim + + self.padding_idx = embed_tokens.padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + self.max_target_positions, + embed_dim, + self.padding_idx, + learned=cfg.decoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + self.cross_self_attention = cfg.cross_self_attention + + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.layers.extend( + [ + self.build_decoder_layer(cfg, no_encoder_attn) + for _ in range(cfg.decoder.layers) + ] + ) + self.num_layers = len(self.layers) + + if cfg.decoder.normalize_before and not cfg.no_decoder_final_norm: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not cfg.tie_adaptive_weights + else None + ) + + self.adaptive_softmax = None + self.output_projection = output_projection + if self.output_projection is None: + self.build_output_projection(cfg, dictionary, embed_tokens) + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.decoder.attention_heads, 24) + + def build_output_projection(self, cfg, dictionary, embed_tokens): + if cfg.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(cfg.adaptive_softmax_cutoff, type=int), + dropout=cfg.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if cfg.tie_adaptive_weights else None, + factor=cfg.adaptive_softmax_factor, + tie_proj=cfg.tie_adaptive_proj, + ) + elif self.share_input_output_embed: + self.output_projection = nn.Linear( + self.embed_tokens.weight.shape[1], + self.embed_tokens.weight.shape[0], + bias=False, + ) + self.output_projection.weight = self.embed_tokens.weight + else: + self.output_projection = nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + num_base_layers = cfg.base_layers + for i in range(num_base_layers): + self.layers.insert( + ((i + 1) * cfg.decoder.layers) // (num_base_layers + 1), + BaseLayer(cfg), + ) + + def build_decoder_layer(self, cfg, no_encoder_attn=False): + layer = transformer_layer.TransformerDecoderLayerBase(cfg, no_encoder_attn, has_relative_attention_bias=self.use_rel_pos_enc) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + ) + + if not features_only: + x = self.output_layer(x) + return x, extra + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + return self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + + """ + A scriptable subclass of this class has an extract_features method and calls + super().extract_features, but super() is not supported in torchscript. A copy of + this function is made to be used in the subclass instead. + """ + + def extract_features_scriptable( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs, slen = prev_output_tokens.size() + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + pos_seq = torch.arange(0, slen).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, _ = self.pos_emb(pos_seq, incremental_state) + else: + pos_k = None + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + pos_bias=pos_k, + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def output_layer(self, features): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection(features) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim])), 1 + ) + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + if f"{name}.output_projection.weight" not in state_dict: + if self.share_input_output_embed: + embed_out_key = f"{name}.embed_tokens.weight" + else: + embed_out_key = f"{name}.embed_out" + if embed_out_key in state_dict: + state_dict[f"{name}.output_projection.weight"] = state_dict[ + embed_out_key + ] + if not self.share_input_output_embed: + del state_dict[embed_out_key] + + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + +class TransformerDecoderBaseScriptable(TransformerDecoderBase): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None + + +class TransformerDecoder(TransformerDecoderBase): + def __init__( + self, + args, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + ): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + no_encoder_attn=no_encoder_attn, + output_projection=output_projection, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + ) + + def build_output_projection(self, args, dictionary, embed_tokens): + super().build_output_projection( + TransformerConfig.from_namespace(args), dictionary, embed_tokens + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + return super().build_decoder_layer( + TransformerConfig.from_namespace(args), no_encoder_attn=no_encoder_attn + ) + +class TransformerDecoderScriptable(TransformerDecoder): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None diff --git a/SpeechUT/speechut/modules/transformer_encoder.py b/SpeechUT/speechut/modules/transformer_encoder.py new file mode 100644 index 0000000..f94e1fe --- /dev/null +++ b/SpeechUT/speechut/modules/transformer_encoder.py @@ -0,0 +1,401 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import math +from typing import Dict, List, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqEncoder +from fairseq.modules import ( + FairseqDropout, + LayerDropModuleList, + LayerNorm, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor +from fairseq.models.transformer import ( + TransformerConfig, +) + + +from speechut.modules import transformer_layer, LearnedPositionalEmbedding +from speechut.modules import RelativePositionalEncoding + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerEncoderBase": + return "TransformerEncoder" + else: + return module_name + + +class TransformerEncoderBase(FairseqEncoder): + """ + Transformer encoder consisting of *cfg.encoder.layers* layers. Each layer + is a :class:`TransformerEncoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): encoding dictionary + embed_tokens (torch.nn.Embedding): input embedding + """ + + def __init__(self, cfg, dictionary, embed_tokens, use_rel_pos_enc=False, scaling_for_att=1.0): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.encoder_layerdrop = cfg.encoder.layerdrop + + embed_dim = embed_tokens.embedding_dim + self.padding_idx = embed_tokens.padding_idx + self.max_source_positions = cfg.max_source_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + self.embed_positions = ( + PositionalEmbedding( + cfg.max_source_positions, + embed_dim, + self.padding_idx, + learned=cfg.encoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + if self.encoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.encoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.scaling_for_att = scaling_for_att + self.layers.extend( + [self.build_encoder_layer(cfg) for i in range(cfg.encoder.layers)] + ) + self.num_layers = len(self.layers) + + if cfg.encoder.normalize_before: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.encoder.attention_heads, 160) + + def build_encoder_layer(self, cfg): + layer = transformer_layer.TransformerEncoderLayerBase(cfg, has_relative_attention_bias=self.use_rel_pos_enc, scaling_for_att=self.scaling_for_att) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward_embedding( + self, src_tokens, token_embedding: Optional[torch.Tensor] = None + ): + # embed tokens and positions + if token_embedding is None: + token_embedding = self.embed_tokens(src_tokens) + x = embed = self.embed_scale * token_embedding + if self.embed_positions is not None: + x = embed + self.embed_positions(src_tokens) + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + x = self.dropout_module(x) + if self.quant_noise is not None: + x = self.quant_noise(x) + return x, embed + + def forward( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + return self.forward_scriptable( + src_tokens, src_lengths, return_all_hiddens, token_embeddings, uniformity_layers + ) + + # TorchScript doesn't support super() method so that the scriptable Subclass + # can't access the base class model in Torchscript. + # Current workaround is to add a helper function with different name and + # call the helper function from scriptable Subclass. + def forward_scriptable( + self, + src_tokens, + src_lengths: Optional[torch.Tensor] = None, + return_all_hiddens: bool = False, + token_embeddings: Optional[torch.Tensor] = None, + uniformity_layers: Optional[List[int]] = None, + ): + """ + Args: + src_tokens (LongTensor): tokens in the source language of shape + `(batch, src_len)` + src_lengths (torch.LongTensor): lengths of each source sentence of + shape `(batch)` + return_all_hiddens (bool, optional): also return all of the + intermediate hidden states (default: False). + token_embeddings (torch.Tensor, optional): precomputed embeddings + default `None` will recompute embeddings + + Returns: + dict: + - **encoder_out** (Tensor): the last encoder layer's output of + shape `(src_len, batch, embed_dim)` + - **encoder_padding_mask** (ByteTensor): the positions of + padding elements of shape `(batch, src_len)` + - **encoder_embedding** (Tensor): the (scaled) embedding lookup + of shape `(batch, src_len, embed_dim)` + - **encoder_states** (List[Tensor]): all intermediate + hidden states of shape `(src_len, batch, embed_dim)`. + Only populated if *return_all_hiddens* is True. + """ + # compute padding mask + encoder_padding_mask = src_tokens.eq(self.padding_idx) + has_pads = src_tokens.device.type == "xla" or encoder_padding_mask.any() + + x, encoder_embedding = self.forward_embedding(src_tokens, token_embeddings) + + # account for padding while computing the representation + if has_pads: + x = x * (1 - encoder_padding_mask.unsqueeze(-1).type_as(x)) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + encoder_states = [] + uniformity_hiddens = [] + + if return_all_hiddens: + encoder_states.append(x) + + if uniformity_layers is not None and 0 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + + # encoder layers + for i, layer in enumerate(self.layers): + x = layer( + x, encoder_padding_mask=encoder_padding_mask if has_pads else None, + pos_bias=pos_k, + ) + if uniformity_layers is not None and i+1 in uniformity_layers: + x = F.normalize(x.float(), dim=-1).type_as(x) + uniformity_hiddens.append(x) + if return_all_hiddens: + assert encoder_states is not None + encoder_states.append(x) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # The Pytorch Mobile lite interpreter does not supports returning NamedTuple in + # `forward` so we use a dictionary instead. + # TorchScript does not support mixed values so the values are all lists. + # The empty list is equivalent to None. + src_lengths = ( + src_tokens.ne(self.padding_idx) + .sum(dim=1, dtype=torch.int32) + .reshape(-1, 1) + .contiguous() + ) + return { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [encoder_padding_mask], # B x T + "encoder_embedding": [encoder_embedding], # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "uniformity_hiddens": uniformity_hiddens, # List[T x B x C] + "src_tokens": [], + "src_lengths": [src_lengths], + } + + @torch.jit.export + def reorder_encoder_out(self, encoder_out: Dict[str, List[Tensor]], new_order): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + if len(encoder_out["encoder_out"]) == 0: + new_encoder_out = [] + else: + new_encoder_out = [encoder_out["encoder_out"][0].index_select(1, new_order)] + if len(encoder_out["encoder_padding_mask"]) == 0: + new_encoder_padding_mask = [] + else: + new_encoder_padding_mask = [ + encoder_out["encoder_padding_mask"][0].index_select(0, new_order) + ] + if len(encoder_out["encoder_embedding"]) == 0: + new_encoder_embedding = [] + else: + new_encoder_embedding = [ + encoder_out["encoder_embedding"][0].index_select(0, new_order) + ] + + if len(encoder_out["src_tokens"]) == 0: + src_tokens = [] + else: + src_tokens = [(encoder_out["src_tokens"][0]).index_select(0, new_order)] + + if len(encoder_out["src_lengths"]) == 0: + src_lengths = [] + else: + src_lengths = [(encoder_out["src_lengths"][0]).index_select(0, new_order)] + + encoder_states = encoder_out["encoder_states"] + if len(encoder_states) > 0: + for idx, state in enumerate(encoder_states): + encoder_states[idx] = state.index_select(1, new_order) + + return { + "encoder_out": new_encoder_out, # T x B x C + "encoder_padding_mask": new_encoder_padding_mask, # B x T + "encoder_embedding": new_encoder_embedding, # B x T x C + "encoder_states": encoder_states, # List[T x B x C] + "src_tokens": src_tokens, # B x T + "src_lengths": src_lengths, # B x 1 + } + + def max_positions(self): + """Maximum input length supported by the encoder.""" + if self.embed_positions is None: + return self.max_source_positions + return min(self.max_source_positions, self.embed_positions.max_positions) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + print("deleting {0}".format(weights_key)) + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + for i in range(self.num_layers): + # update layer norms + self.layers[i].upgrade_state_dict_named( + state_dict, "{}.layers.{}".format(name, i) + ) + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) < 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + return state_dict + + +class TransformerEncoder(TransformerEncoderBase): + def __init__(self, args, dictionary, embed_tokens): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + scaling_for_att=getattr(args, "scaling_for_att", 1.0), + ) + + def build_encoder_layer(self, args): + return super().build_encoder_layer( + TransformerConfig.from_namespace(args), + ) + + +def PositionalEmbedding( + num_embeddings: int, + embedding_dim: int, + padding_idx: int, + learned: bool = False, +): + if learned: + # if padding_idx is specified then offset the embedding ids by + # this index and adjust num_embeddings appropriately + # TODO: The right place for this offset would be inside + # LearnedPositionalEmbedding. Move this there for a cleaner implementation. + if padding_idx is not None: + num_embeddings = num_embeddings + padding_idx + 1 + m = LearnedPositionalEmbedding(num_embeddings, embedding_dim, padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim**-0.5) + if padding_idx is not None: + nn.init.constant_(m.weight[padding_idx], 0) + else: + m = SinusoidalPositionalEmbedding( + embedding_dim, + padding_idx, + init_size=num_embeddings + padding_idx + 1, + ) + return m diff --git a/SpeechUT/speechut/modules/transformer_layer.py b/SpeechUT/speechut/modules/transformer_layer.py new file mode 100644 index 0000000..a71a848 --- /dev/null +++ b/SpeechUT/speechut/modules/transformer_layer.py @@ -0,0 +1,330 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/modules/transformer_layer.py + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_decoder_layer.py +""" + +from typing import Dict, List, Optional + +import torch +from torch import Tensor +from fairseq.modules import LayerNorm +from fairseq.modules.transformer_layer import TransformerEncoderLayerBase as FairseqTransformerEncoderLayerBase +from fairseq.modules.transformer_layer import TransformerDecoderLayerBase as FairseqTransformerDecoderLayerBase + +from speechut.modules import MultiheadAttention + +class TransformerEncoderLayerBase(FairseqTransformerEncoderLayerBase): + """Encoder layer block. + + In the original paper each operation (multi-head attention or FFN) is + postprocessed with: `dropout -> add residual -> layernorm`. In the + tensor2tensor code they suggest that learning is more robust when + preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.encoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + """ + + def __init__(self, cfg, has_relative_attention_bias=False, scaling_for_att=1.0): + self.scaling_for_att = scaling_for_att + super().__init__(cfg) + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.encoder.attention_heads) + + def build_self_attention(self, embed_dim, cfg, scaling_for_att=1.0): + return MultiheadAttention( + embed_dim, + cfg.encoder.attention_heads, + dropout=cfg.attention_dropout, + self_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def forward( + self, + x, + encoder_padding_mask: Optional[Tensor], + attn_mask: Optional[Tensor] = None, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor): binary ByteTensor of shape + `(batch, seq_len)` where padding elements are indicated by ``1``. + attn_mask (ByteTensor): binary tensor of shape `(tgt_len, src_len)`, + where `tgt_len` is the length of output and `src_len` is the + length of input, though here both are equal to `seq_len`. + `attn_mask[tgt_i, src_j] = 1` means that when calculating the + embedding for `tgt_i`, we exclude (mask out) `src_j`. This is + useful for strided self-attention. + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + # anything in original attn_mask = 1, becomes -1e8 + # anything in original attn_mask = 0, becomes 0 + # Note that we cannot use -inf here, because at some edge cases, + # the attention weight (before softmax) for some padded element in query + # will become -inf, which results in NaN in model parameters + if attn_mask is not None: + attn_mask = attn_mask.masked_fill( + attn_mask.to(torch.bool), -1e8 if x.dtype == torch.float32 else -1e4 + ) + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, _ = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=encoder_padding_mask, + need_weights=False, + attn_mask=attn_mask, + position_bias=pos_bias, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + x = self.fc2(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + return x + + + +class TransformerDecoderLayerBase(FairseqTransformerDecoderLayerBase): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.decoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, cfg, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False, has_relative_attention_bias=False, scaling_for_att=1.0, + ): + self.scaling_for_att = scaling_for_att + super().__init__(cfg, + no_encoder_attn, + add_bias_kv, + add_zero_attn, + ) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.decoder.attention_heads) + + def build_self_attention( + self, embed_dim, cfg, add_bias_kv=False, add_zero_attn=False + ): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + dropout=cfg.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=not cfg.cross_self_attention, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def build_encoder_attention(self, embed_dim, cfg): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + kdim=cfg.encoder.embed_dim, + vdim=cfg.encoder.embed_dim, + dropout=cfg.attention_dropout, + encoder_decoder_attention=True, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + scaling_for_att=self.scaling_for_att, + ) + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + if self.c_attn is not None: + tgt_len, bsz = x.size(0), x.size(1) + x = x.view(tgt_len, bsz, self.nh, self.head_dim) + x = torch.einsum("tbhd,h->tbhd", x, self.c_attn) + x = x.reshape(tgt_len, bsz, self.embed_dim) + if self.attn_ln is not None: + x = self.attn_ln(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + if self.encoder_attn is not None and encoder_out is not None: + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + if self.ffn_layernorm is not None: + x = self.ffn_layernorm(x) + x = self.fc2(x) + x = self.dropout_module(x) + if self.w_resid is not None: + residual = torch.mul(self.w_resid, residual) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None + + def make_generation_fast_(self, need_attn: bool = False, **kwargs): + self.need_attn = need_attn diff --git a/SpeechUT/speechut/modules/w2v_encoder.py b/SpeechUT/speechut/modules/w2v_encoder.py new file mode 100644 index 0000000..386f1eb --- /dev/null +++ b/SpeechUT/speechut/modules/w2v_encoder.py @@ -0,0 +1,281 @@ +# -------------------------------------------------------- +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + wav2vec encoder adding relitive position bias, modified from + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_encoder.py + https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/wav2vec/wav2vec2.py +""" + +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.dataclass import ChoiceEnum +from fairseq.modules import ( + LayerNorm, + SamePad, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.utils import index_put +from fairseq.distributed import fsdp_wrap +from fairseq.models.wav2vec.utils import pad_to_multiple + +## reload multi-head attition with rel-pos-bias +from fairseq.models.wav2vec.wav2vec2 import TransformerEncoder as W2vTransformerEncoder +from speechut.modules import RelativePositionalEncoding +from speechut.modules import MultiheadAttention + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +class TransformerEncoder(W2vTransformerEncoder): + def __init__(self, args): + super().__init__(args) + + self.dropout = args.dropout + self.embedding_dim = args.encoder_embed_dim + self.required_seq_len_multiple = args.required_seq_len_multiple + self.use_rel_pos_enc = getattr(args, "use_rel_pos_enc", False) + + self.pos_conv = nn.Conv1d( + self.embedding_dim, + self.embedding_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * self.embedding_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + layers = [] + for _ in range(args.encoder_layers): + layer = TransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=self.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + has_relative_attention_bias=self.use_rel_pos_enc, + ) + if args.checkpoint_activations: + layer = fsdp_wrap(layer) + layer = checkpoint_wrapper(layer) + layers.append(layer) + self.layers = nn.ModuleList(layers) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(self.embedding_dim) + self.layerdrop = args.encoder_layerdrop + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim // args.encoder_attention_heads, 160) + + + self.apply(init_bert_params) + + def forward(self, x, padding_mask=None, layer=None): + x, layer_results = self.extract_features(x, padding_mask, layer) + + if self.layer_norm_first and layer is None: + x = self.layer_norm(x) + + return x, layer_results + + def extract_features(self, x, padding_mask=None, tgt_layer=None): + + if padding_mask is not None: + x = index_put(x, padding_mask, 0) + + x_conv = self.pos_conv(x.transpose(1, 2)) + x_conv = x_conv.transpose(1, 2) + x = x + x_conv + + if not self.layer_norm_first: + x = self.layer_norm(x) + + # pad to the sequence length dimension + x, pad_length = pad_to_multiple( + x, self.required_seq_len_multiple, dim=-2, value=0 + ) + if pad_length > 0 and padding_mask is None: + padding_mask = x.new_zeros((x.size(0), x.size(1)), dtype=torch.bool) + padding_mask[:, -pad_length:] = True + else: + padding_mask, _ = pad_to_multiple( + padding_mask, self.required_seq_len_multiple, dim=-1, value=True + ) + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + layer_results = [] + r = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, z = layer(x, self_attn_padding_mask=padding_mask, need_weights=False, pos_bias=pos_k) + if tgt_layer is not None: + # unpad if needed + if pad_length > 0: + layer_results.append( + ( + x[:-pad_length], + z[:, :-pad_length, :-pad_length] + if z is not None + else z, + ) + ) + else: + layer_results.append((x, z)) + if i == tgt_layer: + r = x + break + + if r is not None: + x = r + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + # undo paddding + if pad_length > 0: + x = x[:, :-pad_length] + + return x, layer_results + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + has_relative_attention_bias: bool = False, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embedding_dim//num_attention_heads) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + pos_bias=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + position_bias=pos_bias, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn diff --git a/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_asr.sh b/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_asr.sh new file mode 100644 index 0000000..d5bc731 --- /dev/null +++ b/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_asr.sh @@ -0,0 +1,40 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 2 ] && echo "Usage: $0 <data_dir> <text_data_dir> [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +mount=$3 +world_size=$4 +update_freq=$5 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechut4asr_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_base_librispeech \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + dataset.train_subset=\"train_960+pseudo_libritext.kmu-ltr+merge_960.kmu-none\" \ + dataset.valid_subset=\"dev_clean+dev.kmu-ltr+dev.kmu-none\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=base_speechut4asr_${world_size}gpu_${update_freq}accum diff --git a/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st.sh b/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st.sh new file mode 100644 index 0000000..438a43f --- /dev/null +++ b/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st.sh @@ -0,0 +1,47 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 <data_dir> <text_data_dir> <lang=de/es> [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +lang=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechut4en${lang}_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_base_librispeech \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + model.add_text_ctc=false \ + model.text_transformer.share_decoder_input_output_embed=true \ + criterion.u2t_ed_weight=1.0 \ + criterion.u2t_ctc_weight=0 \ + \ + dataset.train_subset=\"train_960,mustcuns_${lang}+pseudo_wmt_en${lang}.kmu-spm+train_960.kmu-none,mustcuns_${lang}.kmu-none\" \ + dataset.valid_subset=\"dev_clean+pseudo_valid.kmu-spm+dev.kmu-none\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=base_speechut4en${lang}_${world_size}gpu_${update_freq}accum + diff --git a/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st_enfr.sh b/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st_enfr.sh new file mode 100644 index 0000000..c0c7217 --- /dev/null +++ b/SpeechUT/speechut/scripts/pretrain_speechut/base_speechut_for_st_enfr.sh @@ -0,0 +1,48 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 <data_dir> <text_data_dir> [lang=fr] [mount=${PWD}] [world_size=32] [update_freq=1]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +lang=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $lang ] && lang=fr +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=1 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/base_speechut4en${lang}_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_base_librispeech \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + model.add_text_ctc=false \ + criterion.u2t_ed_weight=1.0 \ + criterion.u2t_ctc_weight=0 \ + \ + dataset.train_subset=\"train_960,pretrain_mustc+pseudo_wmt14_enfr.kmu-spm+train_960.kmu-none,pretrain_mustc.kmu-none\" \ + dataset.valid_subset=\"dev_clean+pseudo_valid.kmu-spm+dev.kmu-none\" \ + dataset.num_workers=0 \ + dataset.max_tokens=1400000 \ + optimization.max_update=600000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=base_speechut4en${lang}_${world_size}gpu_${update_freq}accum + diff --git a/SpeechUT/speechut/scripts/pretrain_speechut/large_speechut_for_asr.sh b/SpeechUT/speechut/scripts/pretrain_speechut/large_speechut_for_asr.sh new file mode 100644 index 0000000..e9d64d7 --- /dev/null +++ b/SpeechUT/speechut/scripts/pretrain_speechut/large_speechut_for_asr.sh @@ -0,0 +1,41 @@ +# #################################### +# SpeechUT Large model # +# #################################### +[ $# -lt 2 ] && echo "Usage: $0 <data_dir> <text_data_dir> [mount=${PWD}] [world_size=32] [update_freq=4]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 +DATA_DIR=$1 +TEXT_DATA_DIR=$2 +mount=$3 +world_size=$4 +update_freq=$5 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=32 +[ -z $update_freq ] && update_freq=4 + +CODE_ROOT=${PWD} +MODEL_DIR="${mount}/exp/pretrain/large_speechut4asr_${world_size}gpu_${update_freq}accum" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/pretrain \ + --config-name speechut_large_librilight \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.labels='["km"]' \ + model.label_rate=50 \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + \ + dataset.train_subset=\"train_small+pseudo_libritext.kmu-ltr\" \ + dataset.valid_subset=\"dev_clean+dev.kmu-ltr\" \ + dataset.num_workers=0 \ + dataset.max_tokens=900000 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[${update_freq}] \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=large_speechut4asr_${world_size}gpu_${update_freq}accum + \ No newline at end of file diff --git a/SpeechUT/speechut/scripts/tune_speechut_asr/finetune960h_large_edctc.sh b/SpeechUT/speechut/scripts/tune_speechut_asr/finetune960h_large_edctc.sh new file mode 100644 index 0000000..08a2581 --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_asr/finetune960h_large_edctc.sh @@ -0,0 +1,45 @@ +# #################################### +# SpeechUT Large model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 <model_path> <data_dir> <cpt_tag> [mount=${PWD}] [world_size=8] [update_freq=3]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +cpt=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=3 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="${mount}/exp/finetune_asr/$exp_name/960h_edctc80k_from_${cpt}_bz3.3m_lr1e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/finetune_asr \ + --config-name speechut_large_960h \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + model.w2v_path=${w2v_path} \ + \ + optimization.lr=[0.00001] \ + optimization.max_update=80000 \ + dataset.max_tokens=1100000 \ + optimization.update_freq=[${update_freq}] \ + distributed_training.distributed_world_size=${world_size} \ + \ + dataset.train_subset="train_960" \ + dataset.valid_subset="dev_other" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=960h_edctc80k_from_${cpt}_bz3.3m_lr1e-5 diff --git a/SpeechUT/speechut/scripts/tune_speechut_asr/finetune_base_edctc.sh b/SpeechUT/speechut/scripts/tune_speechut_asr/finetune_base_edctc.sh new file mode 100644 index 0000000..cad7bd0 --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_asr/finetune_base_edctc.sh @@ -0,0 +1,45 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 <model_path> <data_dir> <cpt_tag> [mount=${PWD}] [world_size=8] [update_freq=2]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +cpt=$3 +mount=$4 +world_size=$5 +update_freq=$6 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=2 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="${mount}/exp/finetune_asr/$exp_name/edctc40k_from_${cpt}_bz2.6m_lr1e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/speechut/config/finetune_asr \ + --config-name speechut_base_100h \ + common.user_dir=$CODE_ROOT/speechut \ + \ + task.data=$DATA_DIR \ + task.label_dir=$DATA_DIR \ + model.w2v_path=${w2v_path} \ + \ + optimization.lr=[0.00001] \ + optimization.max_update=40000 \ + dataset.max_tokens=1300000 \ + optimization.update_freq=[${update_freq}] \ + distributed_training.distributed_world_size=${world_size} \ + \ + dataset.train_subset="train_clean_100" \ + dataset.valid_subset="dev_other" \ + \ + common.tensorboard_logdir=$MODEL_DIR \ + checkpoint.save_dir=$MODEL_DIR \ + hydra.run.dir=$MODEL_DIR \ + hydra.job.name=edctc40k_from_${cpt}_bz2.6m_lr1e-5 diff --git a/SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctc.sh b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctc.sh new file mode 100644 index 0000000..9dce063 --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctc.sh @@ -0,0 +1,61 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 <model_path> <data_dir> [gen-set=dev_other] [beam_size=10] [ctc_weight=0.2] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +extra=$6 +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=10 +[ -z $ctc_weight ] && ctc_weight=0.2 +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 as no ctc-decoding used..." && beam_size=1 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 2000000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + & +done +wait + + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}/${subset}_${world_size}_${rank} + echo $results_path + tail -n 1 $results_path/generate-*.txt +done diff --git a/SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctclm.sh b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctclm.sh new file mode 100644 index 0000000..dadd1a4 --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_edctclm.sh @@ -0,0 +1,66 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 <model_path> <data_dir> [gen-set=dev_other] [beam_size=30] [ctc_weight=0.3] [lm_weight=0.7] [lm_path] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +lm_weight=$6 +lm_path=$7 +extra=$8 +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=30 +[ -z $ctc_weight ] && ctc_weight=0.3 +[ -z $lm_weight ] && lm_weight=0.7 +[ -z $lm_path ] && lm_path="/mnt/default/v-junyiao/librispeech/lm/lm_ctc_form/checkpoint_best.pt" +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 and lm_weight to 0 as no ctc-decoding used..." && beam_size=1 && lm_weight=0 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 800000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --lm-weight ${lm_weight} --lm-path ${lm_path} \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path ${results_path} \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + & +done +wait + + +for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight}/${subset}_${world_size}_${rank} + echo $results_path + tail -n 1 $results_path/generate-*.txt +done diff --git a/SpeechUT/speechut/scripts/tune_speechut_asr/inference_lm_nj.sh b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_lm_nj.sh new file mode 100644 index 0000000..a5627a5 --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_lm_nj.sh @@ -0,0 +1,74 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 <model_path> <data_dir> [gen-set=dev_other] [beam_size=30] [ctc_weight=0.3] [lm_weight=0.7] [lm_path] [nj=8] [ngpu=8] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +lm_weight=$6 +lm_path=$7 +nj=$8 +ngpu=$9 +extra=${10} +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=30 +[ -z $ctc_weight ] && ctc_weight=0.3 +[ -z $lm_weight ] && lm_weight=0.7 +[ -z $lm_path ] && lm_path="/mnt/default/v-junyiao/librispeech/lm/lm_ctc_form/checkpoint_best.pt" +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 and lm_weight to 0 as no ctc-decoding used..." && beam_size=1 && lm_weight=0 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" +[ -z $nj ] && nj=8 +[ -z $ngpu ] && ngpu=8 + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +world_size=$nj +for rank in $(seq 0 $((nj - 1))); do + export CUDA_VISIBLE_DEVICES=$((rank % $ngpu)) + for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 800000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --lm-weight ${lm_weight} --lm-path ${lm_path} \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + --distributed-world-size ${world_size} --distributed-rank ${rank} \ + & + done +done +wait + + +for subset in ${gen_set//,/ }; do + results_dir=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}_lm${lm_weight} + cat $results_dir/${subset}_${world_size}_*/generate-${subset}.txt | grep -v "^Generate" > $results_dir/generate-${subset}.all.txt +done diff --git a/SpeechUT/speechut/scripts/tune_speechut_asr/inference_nj.sh b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_nj.sh new file mode 100644 index 0000000..08e6df4 --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_asr/inference_nj.sh @@ -0,0 +1,69 @@ +##################################### +# SpeechUT ASR model # +##################################### +[ $# -lt 2 ] && echo "Usage: $0 <model_path> <data_dir> [gen-set=dev_other] [beam_size=10] [ctc_weight=0.2] [nj=32] [ngpu=8] [--normalize]" && exit 1 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +gen_set=$3 +beam_size=$4 +ctc_weight=$5 +nj=$6 +ngpu=$7 +extra=$8 +[ -z $extra ] && echo "Assert decoding base model! If you are decoding large model, please add '--normalize' at the end..." +[ -z $gen_set ] && gen_set="dev_other" +[ -z $beam_size ] && beam_size=10 +[ -z $ctc_weight ] && ctc_weight=0.2 +[ $ctc_weight == 0 ] && [ $beam_size != 1 ] && echo "Change beam size to 1 as no ctc-decoding used..." && beam_size=1 +[ $ctc_weight != 0 ] && extra="$extra --batch-size 1" +[ -z $nj ] && nj=32 +[ -z $ngpu ] && ngpu=8 + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} + +world_size=$nj +for rank in $(seq 0 $((nj - 1))); do + export CUDA_VISIBLE_DEVICES=$((rank % $ngpu)) + for subset in ${gen_set//,/ }; do + results_path=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight}/${subset}_${world_size}_${rank} + [ ! -d $results_path ] && mkdir -p $results_path + + python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --user-dir $CODE_ROOT/speechut \ + --label-dir ${DATA_DIR} \ + --labels '["ltr"]' \ + --single-target \ + --post-process letter \ + --gen-subset ${subset} \ + --max-tokens 2000000 \ + \ + --task joint_sc2t_pretraining \ + --add-decoder-target \ + --fine-tuning \ + --pad-audio \ + --random-crop \ + \ + --ctc-weight ${ctc_weight} $extra \ + --beam ${beam_size} \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring wer --max-len-a 0.00078125 --max-len-b 200 \ + --distributed-world-size ${world_size} --distributed-rank ${rank} \ + & + done +done +wait + + +for subset in ${gen_set//,/ }; do + results_dir=$src_dir/decode_${cpt}/beam${beam_size}_ctc${ctc_weight} + cat $results_dir/${subset}_${world_size}_*/generate-${subset}.txt | grep -v "^Generate" > $results_dir/generate-${subset}.all.txt +done diff --git a/SpeechUT/speechut/scripts/tune_speechut_st/finetune_base_mustc_enxx.sh b/SpeechUT/speechut/scripts/tune_speechut_st/finetune_base_mustc_enxx.sh new file mode 100644 index 0000000..59c8a2a --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_st/finetune_base_mustc_enxx.sh @@ -0,0 +1,77 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 4 ] && echo "Usage: $0 <model_path> <data_dir> <lang> <cpt-tag> [mount=${PWD}] [world_size=8] [update_freq=4/6]" && exit 0 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +w2v_path=$1 +DATA_DIR=$2 +lang=$3 +cpt=$4 +mount=$5 +world_size=$6 +update_freq=$7 +[ -z $mount ] && mount=${PWD} +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=4 + +CODE_ROOT=${PWD} + +exp_name=${w2v_path%/*} +exp_name=${exp_name##*/} +MODEL_DIR="$mount/exp/finetune_mustc/$exp_name/legacy_en${lang}_from_${cpt}_bz3.2m_lr3e-5" +[ -d $MODEL_DIR ] || mkdir -p $MODEL_DIR + +max_tokens=800000 +python $CODE_ROOT/fairseq/fairseq_cli/train.py ${DATA_DIR} \ + --save-dir ${MODEL_DIR} \ + --user-dir $CODE_ROOT/speechut \ + --task speech_to_text \ + --config-yaml config_en${lang}.yaml \ + --train-subset "train_st" \ + --valid-subset "dev_st" \ + --fp16 \ + --seed 1 \ + \ + --ddp-backend no_c10d \ + --distributed-world-size ${world_size} \ + --tensorboard-logdir ${MODEL_DIR} \ + \ + --criterion label_smoothed_cross_entropy --report-accuracy \ + --label-smoothing 0.3 \ + \ + --optimizer adam \ + --clip-norm 1.0 \ + --lr 3e-05 \ + --lr-scheduler polynomial_decay --warmup-updates 5000 \ + --max-update 50000 \ + --total-num-update 50000 \ + --update-freq ${update_freq} \ + \ + --max-tokens ${max_tokens} \ + --max-sentences 16 \ + --max-tokens-valid ${max_tokens} \ + --grouped-shuffling \ + --max-source-positions ${max_tokens} \ + --skip-invalid-size-inputs-valid-test \ + --num-workers 0 \ + --best-checkpoint-metric "accuracy" \ + --maximize-best-checkpoint-metric \ + \ + --arch "speechut_st_legacy" \ + --w2v-path ${w2v_path} \ + --layerdrop 0.1 \ + --activation-dropout 0.1 \ + --attention-dropout 0.1 \ + --feature-grad-mult 1.0 \ + \ + --apply-mask --mask-prob 0.5 \ + \ + --log-format json \ + --log-interval 100 \ + --save-interval 1 \ + --keep-last-epochs 5 \ + --keep-best-checkpoints 5 \ + \ + 2>&1 | tee ${MODEL_DIR}/train_en${lang}.log + diff --git a/SpeechUT/speechut/scripts/tune_speechut_st/inference_st.sh b/SpeechUT/speechut/scripts/tune_speechut_st/inference_st.sh new file mode 100644 index 0000000..3aefa10 --- /dev/null +++ b/SpeechUT/speechut/scripts/tune_speechut_st/inference_st.sh @@ -0,0 +1,44 @@ +# #################################### +# SpeechUT Base model # +# #################################### +[ $# -lt 3 ] && echo "Usage: $0 <model_path> <data_dir> <lang> [gen-set=dev] [beam_size=10] [lenpen=1.0]" && exit 0 +[ ${PWD##*/} != SpeechUT ] && echo "Error: dir not match! Switch to SpeechUT/ and run it again!" && exit 1 + +model_path=$1 +DATA_DIR=$2 +lang=$3 +gen_set=$4 +beam_size=$5 +lenpen=$6 +[ -z $gen_set ] && gen_set="dev" +[ -z $beam_size ] && beam_size=10 +[ -z $lenpen ] && lenpen=1 +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +CODE_ROOT=${PWD} +results_path=$src_dir/decode_${cpt}_beam${beam_size}/${gen_set} +[ ! -d $results_path ] && mkdir -p $results_path + +python $CODE_ROOT/fairseq/fairseq_cli/generate.py $DATA_DIR \ + --gen-subset ${gen_set}_st \ + --max-tokens 2000000 \ + --max-source-positions 2000000 \ + --num-workers 0 \ + \ + --user-dir $CODE_ROOT/speechut \ + --task speech_to_text \ + --config-yaml config_en${lang}.yaml \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring sacrebleu --max-len-a 0 --max-len-b 512 \ + --beam ${beam_size} \ + --lenpen $lenpen \ + # --model-overrides "{'model':{'w2v_path':'/path/to/your/pretrained/model.pt'}}" \ + + echo $results_path + tail -n 1 $results_path/generate-*.txt + sleep 1s diff --git a/SpeechUT/speechut/squence_generator.py b/SpeechUT/speechut/squence_generator.py new file mode 100644 index 0000000..730e927 --- /dev/null +++ b/SpeechUT/speechut/squence_generator.py @@ -0,0 +1,1118 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- +""" + Modified from fairseq/fairseq/sequence_generator.py + 1. add joint ctc decoding (merged from espnet) + 2. add lm dict conversion +""" +import math +from typing import Dict, List, Optional +import sys +import inspect + +import torch +import torch.nn as nn +from fairseq import search, utils +from fairseq.data import data_utils +from fairseq.models import FairseqIncrementalDecoder +from torch import Tensor +from fairseq.ngram_repeat_block import NGramRepeatBlock +import numpy + +from speechut.modules.ctc_prefix_score import CTCPrefixScore + +MAX_CTC_BEAM = 33 +CTC_SCORING_RATIO = 4 + +class SequenceGenerator(nn.Module): + def __init__( + self, + models, + tgt_dict, + beam_size=1, + max_len_a=0, + max_len_b=200, + max_len=0, + min_len=1, + normalize_scores=True, + len_penalty=1.0, + unk_penalty=0.0, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + search_strategy=None, + eos=None, + bos=None, + symbols_to_strip_from_output=None, + lm_model=None, + lm_weight=1.0, + ctc_weight=0.0, + lm_dict=None, + ): + """Generates translations of a given source sentence. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models, + currently support fairseq.models.TransformerModel for scripting + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + max_len (int, optional): the maximum length of the generated output + (not including end-of-sentence) + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + """ + super().__init__() + if isinstance(models, EnsembleModel): + self.model = models + else: + self.model = EnsembleModel(models) + self.tgt_dict = tgt_dict + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() if eos is None else eos + self.bos = self.eos if bos is None else bos + self.blank = self.tgt_dict.index("<s>") + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos, self.bos}) + if symbols_to_strip_from_output is not None + else {self.eos, self.bos} + ) + self.vocab_size = len(tgt_dict) + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.max_len = max_len or self.model.max_decoder_positions() + + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.temperature = temperature + self.match_source_len = match_source_len + + if no_repeat_ngram_size > 0: + self.repeat_ngram_blocker = NGramRepeatBlock(no_repeat_ngram_size) + else: + self.repeat_ngram_blocker = None + + assert temperature > 0, "--temperature must be greater than 0" + + self.search = ( + search.BeamSearch(tgt_dict) if search_strategy is None else search_strategy + ) + # We only need to set src_lengths in LengthConstrainedBeamSearch. + # As a module attribute, setting it would break in multithread + # settings when the model is shared. + self.should_set_src_lengths = ( + hasattr(self.search, "needs_src_lengths") and self.search.needs_src_lengths + ) + + self.model.eval() + + self.lm_model = lm_model + self.lm_weight = lm_weight + self.ctc_weight = ctc_weight + if self.lm_model is not None: + self.lm_model.eval() + + # assume lm and ed model use different dicts, but the same vovab, + # align the LM dict to the ED dict + self.lm_dict = lm_dict + if lm_dict is not None and not tgt_dict.symbols == lm_dict.symbols: + self.lm_vocab_size = len(lm_dict) + assert self.lm_vocab_size <= self.vocab_size + self.dict_transform_forward = {} + for sym in self.lm_dict.symbols: + if self.tgt_dict.index(sym) != self.lm_dict.index(sym): + self.dict_transform_forward[self.tgt_dict.index(sym)] = self.lm_dict.index(sym) + # [32, 33] + self.dict_transform_back = torch.zeros(self.lm_vocab_size, self.vocab_size).float() + for syb in self.lm_dict.symbols: + self.dict_transform_back[self.lm_dict.index(syb)][self.tgt_dict.index(syb)] = 1.0 + + + def dict_transform(self, tokens, forward=True): + if self.lm_dict is None: + return tokens + if forward: + assert tokens.dim() == 2 + t_tokens = tokens.clone() + offset = self.vocab_size + for idx in self.dict_transform_forward: + t_tokens[t_tokens == idx] = idx + offset + for idx in self.dict_transform_forward: + t_tokens[t_tokens == idx + offset] = self.dict_transform_forward[idx] + for idx in range(self.lm_vocab_size, self.vocab_size): + t_tokens[t_tokens == idx] = self.tgt_dict.pad() + return t_tokens + + dict_transform_back = self.dict_transform_back.type_as(tokens) + tokens = torch.matmul(tokens, dict_transform_back) + for i in range(self.lm_vocab_size, self.vocab_size): + tokens[:, i] = -10000000 + return tokens + + def cuda(self): + self.model.cuda() + return self + + @torch.no_grad() + def forward( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + """Generate a batch of translations. + + Args: + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, prefix_tokens, bos_token=bos_token) + + # TODO(myleott): unused, deprecate after pytorch-translate migration + def generate_batched_itr(self, data_itr, beam_size=None, cuda=False, timer=None): + """Iterate over a batched dataset and yield individual translations. + Args: + cuda (bool, optional): use GPU for generation + timer (StopwatchMeter, optional): time generations + """ + for sample in data_itr: + s = utils.move_to_cuda(sample) if cuda else sample + if "net_input" not in s: + continue + input = s["net_input"] + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in input.items() if k != "prev_output_tokens" + } + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate(encoder_input) + if timer is not None: + timer.stop(sum(len(h[0]["tokens"]) for h in hypos)) + for i, id in enumerate(s["id"].data): + # remove padding + src = utils.strip_pad(input["src_tokens"].data[i, :], self.pad) + ref = ( + utils.strip_pad(s["target"].data[i, :], self.pad) + if s["target"] is not None + else None + ) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate( + self, models, sample: Dict[str, Dict[str, Tensor]], **kwargs + ) -> List[List[Dict[str, Tensor]]]: + """Generate translations. Match the api of other fairseq generators. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + constraints (torch.LongTensor, optional): force decoder to include + the list of constraints + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, **kwargs) + + def _generate( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + constraints: Optional[Tensor] = None, + bos_token: Optional[int] = None, + min_len_a: Optional[float] = None, + modal_idx: Optional[int] = -1, + ): + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(self.model.models_size) + ], + ) + net_input = sample["net_input"] + + if "src_tokens" in net_input: + src_tokens = net_input["src_tokens"] + # length of the source text being the character length except EndOfSentence and pad + src_lengths = ( + (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)).long().sum(dim=1) + ) + elif "source" in net_input: + src_tokens = net_input["source"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + elif "features" in net_input: + src_tokens = net_input["features"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + else: + raise Exception( + "expected src_tokens or source in net input. input keys: " + + str(net_input.keys()) + ) + + # bsz: total number of sentences in beam + # Note that src_tokens may have more than 2 dimensions (i.e. audio features) + bsz, src_len = src_tokens.size()[:2] + beam_size = self.beam_size + + if constraints is not None and not self.search.supports_constraints: + raise NotImplementedError( + "Target-side constraints were provided, but search method doesn't support them" + ) + + # Initialize constraints, when active + self.search.init_constraints(constraints, beam_size) + + max_len: int = -1 + if self.match_source_len: + max_len = src_lengths.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + self.max_len - 1, + ) + + min_len = self.min_len if min_len_a is None else int(min_len_a * src_len + 1) + assert ( + min_len <= max_len + ), "min_len cannot be larger than max_len, please adjust these!" + # compute the encoder output for each beam + with torch.autograd.profiler.record_function("EnsembleModel: forward_encoder"): + encoder_outs = self.model.forward_encoder(net_input) + + dec_sos = sample["lang_idx"] if ("lang_idx" in sample and sample["lang_idx"] is not None) else (self.bos if bos_token is None else bos_token) + # Get CTC lprobs and prep ctc_scorer + if self.ctc_weight > 0: + ctc_lprobs = self.model.models[0].get_normalized_probs( + encoder_outs[0], log_probs=True + ).contiguous().transpose(0, 1) # (B, T, C) from the encoder + + hyp = {} + ctc_prefix_score = CTCPrefixScore(ctc_lprobs[0].detach().cpu().numpy(), self.blank, self.eos, numpy) + hyp["ctc_state_prev"] = ctc_prefix_score.initial_state() + hyp["ctc_score_prev"] = 0.0 + ctc_beam = min(ctc_lprobs.shape[-1], int(min(beam_size * CTC_SCORING_RATIO, MAX_CTC_BEAM))) + ctc_hyps = {str(dec_sos): hyp} + + # placeholder of indices for bsz * beam_size to hold tokens and accumulative scores + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(src_tokens.device).long() + encoder_outs = self.model.reorder_encoder_out(encoder_outs, new_order) + # ensure encoder_outs is a List. + assert encoder_outs is not None + + # initialize buffers + scores = ( + torch.zeros(bsz * beam_size, max_len + 1).to(src_tokens).float() + ) # +1 for eos; pad is never chosen for scoring + tokens = ( + torch.zeros(bsz * beam_size, max_len + 2) + .to(src_tokens) + .long() + .fill_(self.pad) + ) # +2 for eos and pad + tokens[:, 0] = dec_sos + attn: Optional[Tensor] = None + + # A list that indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = ( + torch.zeros(bsz, beam_size).to(src_tokens).eq(-1) + ) # forward and backward-compatible False mask + + # list of completed sentences + finalized = torch.jit.annotate( + List[List[Dict[str, Tensor]]], + [torch.jit.annotate(List[Dict[str, Tensor]], []) for i in range(bsz)], + ) # contains lists of dictionaries of infomation about the hypothesis being finalized at each step + + # a boolean array indicating if the sentence at the index is finished or not + finished = [False for i in range(bsz)] + num_remaining_sent = bsz # number of sentences remaining + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = ( + (torch.arange(0, bsz) * beam_size) + .unsqueeze(1) + .type_as(tokens) + .to(src_tokens.device) + ) + cand_offsets = torch.arange(0, cand_size).type_as(tokens).to(src_tokens.device) + + reorder_state: Optional[Tensor] = None + batch_idxs: Optional[Tensor] = None + + original_batch_idxs: Optional[Tensor] = None + if "id" in sample and isinstance(sample["id"], Tensor): + original_batch_idxs = sample["id"] + else: + original_batch_idxs = torch.arange(0, bsz).type_as(tokens) + + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as( + batch_idxs + ) + reorder_state.view(-1, beam_size).add_( + corr.unsqueeze(-1) * beam_size + ) + original_batch_idxs = original_batch_idxs[batch_idxs] + self.model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = self.model.reorder_encoder_out( + encoder_outs, reorder_state + ) + with torch.autograd.profiler.record_function( + "EnsembleModel: forward_decoder" + ): + lprobs, avg_attn_scores = self.model.forward_decoder( + tokens[:, : step + 1], + encoder_outs, + incremental_states, + self.temperature, + modal_idx, + ) + + if self.ctc_weight > 0 and step != 0 and step < ctc_prefix_score.input_length: + new_lprobs = lprobs.new_full(lprobs.size(), -math.inf) + ctc_lprobs = lprobs.clone() + ctc_lprobs[:, self.blank] = -math.inf # never select blank + _, local_best_ids = torch.topk(ctc_lprobs, ctc_beam, dim=-1) + for b in range(tokens.size(0)): + hyp_key = " ".join(str(x) for x in tokens[b, : step + 1].tolist()) + ctc_scores, ctc_states = ctc_prefix_score( + tokens[b, : step + 1].cpu(), local_best_ids[b].cpu(), ctc_hyps[hyp_key]["ctc_state_prev"] + ) + new_lprobs[b, local_best_ids[b]] = (1 - self.ctc_weight) * (lprobs[b, local_best_ids[b]]) + self.ctc_weight * torch.from_numpy( + ctc_scores - ctc_hyps[hyp_key]["ctc_score_prev"] + ).to(device="cuda") + for j in range(len(local_best_ids[b])): + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())] = {} + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_score_prev"] = ctc_scores[j] + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_state_prev"] = ctc_states[j] + lprobs = new_lprobs + elif self.ctc_weight > 0 and step == 0: + new_lprobs = lprobs.new_full(lprobs.size(), -math.inf) + ctc_lprobs = lprobs.clone() + ctc_lprobs[:, self.blank] = -math.inf # never select blank + _, local_best_ids = torch.topk(ctc_lprobs, ctc_beam, dim=-1) + for b in range(tokens.size(0)): + hyp_key = " ".join(str(x) for x in tokens[b, : step + 1].tolist()) + ctc_scores, ctc_states = ctc_prefix_score( + tokens[b, : step + 1].cpu(), local_best_ids[b].cpu(), ctc_hyps[hyp_key]["ctc_state_prev"] + ) + new_lprobs[b, local_best_ids[b]] = (1 - self.ctc_weight) * (lprobs[b, local_best_ids[b]]) + self.ctc_weight * torch.from_numpy( + ctc_scores - ctc_hyps[hyp_key]["ctc_score_prev"] + ).to(device="cuda") + for j in range(len(local_best_ids[b])): + if b == 0: + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())] = {} + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_score_prev"] = ctc_scores[j] + ctc_hyps[hyp_key + " " + str(local_best_ids[b][j].item())]["ctc_state_prev"] = ctc_states[j] + lprobs = new_lprobs + if self.lm_model is not None and self.lm_weight != 0: + if self.lm_dict is not None: + transformed_tokens = self.dict_transform(tokens[:, : step + 1]) + lm_out = self.lm_model(transformed_tokens) + else: + lm_out = self.lm_model(tokens[:, : step + 1]) + probs = self.lm_model.get_normalized_probs( + lm_out, log_probs=True, sample=None + ) + probs = probs[:, -1, :] * self.lm_weight + if self.lm_dict is not None: + probs = self.dict_transform(probs, forward=False) + lprobs += probs + # handle prefix tokens (possibly with different lengths) + if ( + prefix_tokens is not None + and step < prefix_tokens.size(1) + and step < max_len + ): + lprobs, tokens, scores = self._prefix_tokens( + step, lprobs, scores, tokens, prefix_tokens, beam_size + ) + elif step < min_len: + # minimum length constraint (does not apply if using prefix_tokens) + lprobs[:, self.eos] = -math.inf + + lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs) + + lprobs[:, self.pad] = -math.inf # never select pad + lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + lprobs[:, self.blank] = -math.inf # never select blank + if dec_sos != self.eos: + lprobs[:, dec_sos] = -math.inf # never select lang id + + # handle max length constraint + if step >= max_len: + lprobs[:, : self.eos] = -math.inf + lprobs[:, self.eos + 1 :] = -math.inf + + # Record attention scores, only support avg_attn_scores is a Tensor + if avg_attn_scores is not None: + if attn is None: + attn = torch.empty( + bsz * beam_size, avg_attn_scores.size(1), max_len + 2 + ).to(scores) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(lprobs) + eos_bbsz_idx = torch.empty(0).to( + tokens + ) # indices of hypothesis ending with eos (finished sentences) + eos_scores = torch.empty(0).to( + scores + ) # scores of hypothesis ending with eos (finished sentences) + + if self.should_set_src_lengths: + self.search.set_src_lengths(src_lengths) + + if self.repeat_ngram_blocker is not None: + lprobs = self.repeat_ngram_blocker(tokens, lprobs, bsz, beam_size, step) + + # Shape: (batch, cand_size) + cand_scores, cand_indices, cand_beams = self.search.step( + step, + lprobs.view(bsz, -1, self.vocab_size), + scores.view(bsz, beam_size, -1)[:, :, :step], + tokens[:, : step + 1], + original_batch_idxs, + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos + # Shape of eos_mask: (batch size, beam size) + eos_mask = cand_indices.eq(self.eos) & cand_scores.ne(-math.inf) + eos_mask[:, :beam_size][cands_to_ignore] = torch.tensor(0).to(eos_mask) + + # only consider eos when it's among the top beam_size indices + # Now we know what beam item(s) to finish + # Shape: 1d list of absolute-numbered + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents: List[int] = [] + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + cand_scores[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = self.finalize_hypos( + step, + eos_bbsz_idx, + eos_scores, + tokens, + scores, + finalized, + finished, + beam_size, + attn, + src_lengths, + max_len, + ) + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + if self.search.stop_on_max_len and step >= max_len: + break + assert step < max_len, f"{step} < {max_len}" + + # Remove finalized sentences (ones for which {beam_size} + # finished hypotheses have been generated) from the batch. + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = torch.ones( + bsz, dtype=torch.bool, device=cand_indices.device + ) + batch_mask[finalized_sents] = False + # TODO replace `nonzero(as_tuple=False)` after TorchScript supports it + batch_idxs = torch.arange( + bsz, device=cand_indices.device + ).masked_select(batch_mask) + + # Choose the subset of the hypothesized constraints that will continue + self.search.prune_sentences(batch_idxs) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + cand_scores = cand_scores[batch_idxs] + cand_indices = cand_indices[batch_idxs] + + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths = src_lengths[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view( + new_bsz * beam_size, attn.size(1), -1 + ) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos hypos + # and values < cand_size indicate candidate active hypos. + # After, the min values per row are the top candidate active hypos + + # Rewrite the operator since the element wise or is not supported in torchscript. + + eos_mask[:, :beam_size] = ~((~cands_to_ignore) & (~eos_mask[:, :beam_size])) + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just + # the hypos with the smallest values in active_mask. + # {active_hypos} indicates which {beam_size} hypotheses + # from the list of {2 * beam_size} candidates were + # selected. Shapes: (batch size, beam size) + new_cands_to_ignore, active_hypos = torch.topk( + active_mask, k=beam_size, dim=1, largest=False + ) + + # update cands_to_ignore to ignore any finalized hypos. + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + # Make sure there is at least one active item for each sentence in the batch. + assert (~cands_to_ignore).any(dim=1).all() + + # update cands_to_ignore to ignore any finalized hypos + + # {active_bbsz_idx} denotes which beam number is continued for each new hypothesis (a beam + # can be selected more than once). + active_bbsz_idx = torch.gather(cand_bbsz_idx, dim=1, index=active_hypos) + active_scores = torch.gather(cand_scores, dim=1, index=active_hypos) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + + # Set the tokens for each beam (can select the same row more than once) + tokens[:, : step + 1] = torch.index_select( + tokens[:, : step + 1], dim=0, index=active_bbsz_idx + ) + # Select the next token for each of them + tokens.view(bsz, beam_size, -1)[:, :, step + 1] = torch.gather( + cand_indices, dim=1, index=active_hypos + ) + if step > 0: + scores[:, :step] = torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx + ) + scores.view(bsz, beam_size, -1)[:, :, step] = torch.gather( + cand_scores, dim=1, index=active_hypos + ) + + # Update constraints based on which candidates were selected for the next beam + self.search.update_constraints(active_hypos) + + # copy attention for active hypotheses + if attn is not None: + attn[:, :, : step + 2] = torch.index_select( + attn[:, :, : step + 2], dim=0, index=active_bbsz_idx + ) + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # sort by score descending + for sent in range(len(finalized)): + scores = torch.tensor( + [float(elem["score"].item()) for elem in finalized[sent]] + ) + _, sorted_scores_indices = torch.sort(scores, descending=True) + finalized[sent] = [finalized[sent][ssi] for ssi in sorted_scores_indices] + finalized[sent] = torch.jit.annotate( + List[Dict[str, Tensor]], finalized[sent] + ) + return finalized + + def _prefix_tokens( + self, step: int, lprobs, scores, tokens, prefix_tokens, beam_size: int + ): + """Handle prefix tokens""" + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_lprobs = lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + prefix_mask = prefix_toks.ne(self.pad) + lprobs[prefix_mask] = torch.tensor(-math.inf).to(lprobs) + lprobs[prefix_mask] = lprobs[prefix_mask].scatter( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lprobs[prefix_mask] + ) + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[ + :, 0, 1 : step + 1 + ] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = self.replicate_first_beam(tokens, eos_mask_batch_dim, beam_size) + scores = self.replicate_first_beam(scores, eos_mask_batch_dim, beam_size) + lprobs = self.replicate_first_beam(lprobs, eos_mask_batch_dim, beam_size) + return lprobs, tokens, scores + + def replicate_first_beam(self, tensor, mask, beam_size: int): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + def finalize_hypos( + self, + step: int, + bbsz_idx, + eos_scores, + tokens, + scores, + finalized: List[List[Dict[str, Tensor]]], + finished: List[bool], + beam_size: int, + attn: Optional[Tensor], + src_lengths, + max_len: int, + ): + """Finalize hypothesis, store finalized information in `finalized`, and change `finished` accordingly. + A sentence is finalized when {beam_size} finished items have been collected for it. + + Returns number of sentences (not beam items) being finalized. + These will be removed from the batch and not processed further. + Args: + bbsz_idx (Tensor): + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors. + # tokens is (batch * beam, max_len). So the index_select + # gets the newly EOS rows, then selects cols 1..{step + 2} + tokens_clone = tokens.index_select(0, bbsz_idx)[ + :, 1 : step + 2 + ] # skip the first index, which is EOS + + tokens_clone[:, step] = self.eos + attn_clone = ( + attn.index_select(0, bbsz_idx)[:, :, 1 : step + 2] + if attn is not None + else None + ) + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, : step + 1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + eos_scores /= (step + 1) ** self.len_penalty + + # cum_unfin records which sentences in the batch are finished. + # It helps match indexing between (a) the original sentences + # in the batch and (b) the current, possibly-reduced set of + # sentences. + cum_unfin: List[int] = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + cum_fin_tensor = torch.tensor(cum_unfin, dtype=torch.int).to(bbsz_idx) + + unfin_idx = bbsz_idx // beam_size + sent = unfin_idx + torch.index_select(cum_fin_tensor, 0, unfin_idx) + + # Create a set of "{sent}{unfin_idx}", where + # "unfin_idx" is the index in the current (possibly reduced) + # list of sentences, and "sent" is the index in the original, + # unreduced batch + # For every finished beam item + # sentence index in the current (possibly reduced) batch + seen = (sent << 32) + unfin_idx + unique_seen: List[int] = torch.unique(seen).tolist() + + if self.match_source_len: + condition = step > torch.index_select(src_lengths, 0, unfin_idx) + eos_scores = torch.where(condition, torch.tensor(-math.inf), eos_scores) + sent_list: List[int] = sent.tolist() + for i in range(bbsz_idx.size()[0]): + # An input sentence (among those in a batch) is finished when + # beam_size hypotheses have been collected for it + if len(finalized[sent_list[i]]) < beam_size: + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i] + else: + hypo_attn = torch.empty(0) + + finalized[sent_list[i]].append( + { + "tokens": tokens_clone[i], + "score": eos_scores[i], + "attention": hypo_attn, # src_len x tgt_len + "alignment": torch.empty(0), + "positional_scores": pos_scores[i], + } + ) + + newly_finished: List[int] = [] + for unique_s in unique_seen: + # check termination conditions for this sentence + unique_sent: int = unique_s >> 32 + unique_unfin_idx: int = unique_s - (unique_sent << 32) + + if not finished[unique_sent] and self.is_finished( + step, unique_unfin_idx, max_len, len(finalized[unique_sent]), beam_size + ): + finished[unique_sent] = True + newly_finished.append(unique_unfin_idx) + + return newly_finished + + def is_finished( + self, + step: int, + unfin_idx: int, + max_len: int, + finalized_sent_len: int, + beam_size: int, + ): + """ + Check whether decoding for a sentence is finished, which + occurs when the list of finalized sentences has reached the + beam size, or when we reach the maximum length. + """ + assert finalized_sent_len <= beam_size + if finalized_sent_len == beam_size or step == max_len: + return True + return False + + +class EnsembleModel(nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models_size = len(models) + # method '__len__' is not supported in ModuleList for torch script + self.single_model = models[0] + self.models = nn.ModuleList(models) + + self.has_incremental: bool = False + if all( + hasattr(m, "decoder") and isinstance(m.decoder, FairseqIncrementalDecoder) + for m in models + ): + self.has_incremental = True + + def forward(self): + pass + + def has_encoder(self): + return hasattr(self.single_model, "encoder") + + def has_incremental_states(self): + return self.has_incremental + + def max_decoder_positions(self): + return min( + [ + m.max_decoder_positions() + for m in self.models + if hasattr(m, "max_decoder_positions") + ] + + [sys.maxsize] + ) + + @torch.jit.export + def forward_encoder(self, net_input: Dict[str, Tensor]): + if not self.has_encoder(): + return None + return [model.encoder.forward_torchscript(net_input) for model in self.models] + + @torch.jit.export + def forward_decoder( + self, + tokens, + encoder_outs: List[Dict[str, List[Tensor]]], + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + temperature: float = 1.0, + modal_idx: int = -1, + ): + log_probs = [] + avg_attn: Optional[Tensor] = None + encoder_out: Optional[Dict[str, List[Tensor]]] = None + for i, model in enumerate(self.models): + if self.has_encoder(): + encoder_out = encoder_outs[i] + # decode each model + if self.has_incremental_states(): + if "modal_idx" in inspect.getfullargspec(model.decoder.forward).args: + decoder_out = model.decoder.forward( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i], + modal_idx=modal_idx, + ) + else: + decoder_out = model.decoder.forward( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i], + ) + else: + if hasattr(model, "decoder"): + decoder_out = model.decoder.forward(tokens, encoder_out=encoder_out) + else: + decoder_out = model.forward(tokens) + + attn: Optional[Tensor] = None + decoder_len = len(decoder_out) + if decoder_len > 1 and decoder_out[1] is not None: + if isinstance(decoder_out[1], Tensor): + attn = decoder_out[1] + else: + attn_holder = decoder_out[1]["attn"] + if isinstance(attn_holder, Tensor): + attn = attn_holder + elif attn_holder is not None: + attn = attn_holder[0] + if attn is not None: + attn = attn[:, -1, :] + + decoder_out_tuple = ( + decoder_out[0][:, -1:, :].div_(temperature), + None if decoder_len <= 1 else decoder_out[1], + ) + probs = model.get_normalized_probs( + decoder_out_tuple, log_probs=True, sample=None + ) + probs = probs[:, -1, :] + if self.models_size == 1: + return probs, attn + + log_probs.append(probs) + if attn is not None: + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + + avg_probs = torch.logsumexp(torch.stack(log_probs, dim=0), dim=0) - math.log( + self.models_size + ) + + if avg_attn is not None: + avg_attn.div_(self.models_size) + return avg_probs, avg_attn + + @torch.jit.export + def reorder_encoder_out( + self, encoder_outs: Optional[List[Dict[str, List[Tensor]]]], new_order + ): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_outs: List[Dict[str, List[Tensor]]] = [] + if not self.has_encoder(): + return new_outs + for i, model in enumerate(self.models): + assert encoder_outs is not None + new_outs.append( + model.encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + return new_outs + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + new_order, + ): + if not self.has_incremental_states(): + return + for i, model in enumerate(self.models): + model.decoder.reorder_incremental_state_scripting( + incremental_states[i], new_order + ) + + +class SequenceGeneratorWithAlignment(SequenceGenerator): + def __init__( + self, models, tgt_dict, left_pad_target=False, print_alignment="hard", **kwargs + ): + """Generates translations of a given source sentence. + + Produces alignments following "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + left_pad_target (bool, optional): Whether or not the + hypothesis should be left padded or not when they are + teacher forced for generating alignments. + """ + super().__init__(EnsembleModelWithAlignment(models), tgt_dict, **kwargs) + self.left_pad_target = left_pad_target + + if print_alignment == "hard": + self.extract_alignment = utils.extract_hard_alignment + elif print_alignment == "soft": + self.extract_alignment = utils.extract_soft_alignment + + @torch.no_grad() + def generate(self, models, sample, **kwargs): + finalized = super()._generate(sample, **kwargs) + + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + beam_size = self.beam_size + ( + src_tokens, + src_lengths, + prev_output_tokens, + tgt_tokens, + ) = self._prepare_batch_for_alignment(sample, finalized) + if any(getattr(m, "full_context_alignment", False) for m in self.model.models): + attn = self.model.forward_align(src_tokens, src_lengths, prev_output_tokens) + else: + attn = [ + finalized[i // beam_size][i % beam_size]["attention"].transpose(1, 0) + for i in range(bsz * beam_size) + ] + + if src_tokens.device != "cpu": + src_tokens = src_tokens.to("cpu") + tgt_tokens = tgt_tokens.to("cpu") + attn = [i.to("cpu") for i in attn] + + # Process the attn matrix to extract hard alignments. + for i in range(bsz * beam_size): + alignment = self.extract_alignment( + attn[i], src_tokens[i], tgt_tokens[i], self.pad, self.eos + ) + finalized[i // beam_size][i % beam_size]["alignment"] = alignment + return finalized + + def _prepare_batch_for_alignment(self, sample, hypothesis): + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + src_tokens = ( + src_tokens[:, None, :] + .expand(-1, self.beam_size, -1) + .contiguous() + .view(bsz * self.beam_size, -1) + ) + src_lengths = sample["net_input"]["src_lengths"] + src_lengths = ( + src_lengths[:, None] + .expand(-1, self.beam_size) + .contiguous() + .view(bsz * self.beam_size) + ) + prev_output_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=True, + ) + tgt_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=False, + ) + return src_tokens, src_lengths, prev_output_tokens, tgt_tokens + + +class EnsembleModelWithAlignment(EnsembleModel): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__(models) + + def forward_align(self, src_tokens, src_lengths, prev_output_tokens): + avg_attn = None + for model in self.models: + decoder_out = model(src_tokens, src_lengths, prev_output_tokens) + attn = decoder_out[1]["attn"][0] + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + if len(self.models) > 1: + avg_attn.div_(len(self.models)) + return avg_attn diff --git a/SpeechUT/speechut/tasks/joint_sc2t_pretrain.py b/SpeechUT/speechut/tasks/joint_sc2t_pretrain.py new file mode 100644 index 0000000..db6e4e6 --- /dev/null +++ b/SpeechUT/speechut/tasks/joint_sc2t_pretrain.py @@ -0,0 +1,1004 @@ +# ---------------------------------------------------------------------------- +# SpeechUT: Bridging Speech and Text with Hidden-Unit for Encoder-Decoder Based Speech-Text Pre-training (https://arxiv.org/abs/2210.03730) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/SpeechUT +# Code based on fairseq: https://github.com/facebookresearch/fairseq/tree/272c4c5197250997148fb12c0db6306035f166a4 +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import os +import sys +from typing import Dict, List, Optional, Tuple +from pathlib import Path + +import numpy as np +from argparse import Namespace +from collections import OrderedDict + +import torch +from dataclasses import dataclass, field +from fairseq.data import ( + Dictionary, + encoders, + data_utils, + StripTokenDataset, + PrependTokenDataset, + AppendTokenDataset, + DenoisingDataset, + ConcatDataset, + FairseqDataset, + iterators, + ResamplingDataset, + MaskTokensDataset, + LanguagePairDataset, +) +from fairseq.data.audio.speech_to_text_joint_dataset import S2TJointDataConfig +from fairseq.data.shorten_dataset import maybe_shorten_dataset +# from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq.dataclass.configs import FairseqDataclass +from fairseq.tasks import register_task +from fairseq.tasks.fairseq_task import FairseqTask +from fairseq.dataclass.constants import ChoiceEnum +from omegaconf import MISSING + +from speechut.data.multimodal_corpus_dataset import MultiCorpusDataset +from speechut.data.load_langpair_dataset import load_langpair_dataset +from speechut.data.language_trible_dataset import LanguageTripleDataset, load_langtriple_dataset +from speechut.data.hubert_dataset import HubertDataset + +logger = logging.getLogger(__name__) + +TOKENIZER_CHOICES = ChoiceEnum(["sentencepiece", "hubert_letters", "none"]) + +def _lang_token(lang: str): + return "<lang:{}>".format(lang) + +def _lang_token_index(dic: Dictionary, lang: str): + """Return language token index.""" + idx = dic.index(_lang_token(lang)) + assert idx != dic.unk_index, "cannot find language token for lang {}".format(lang) + return idx + + +class LabelEncoder(object): + def __init__(self, dictionary: Dictionary) -> None: + self.dictionary = dictionary + + def __call__(self, label: str) -> List[str]: + return self.dictionary.encode_line( + label, append_eos=False, add_if_not_exist=False, + ) + + +### wrap the initial get_whole_word_mask which needs bpe_tokenizer, +### here we just assume words are splited by "|" or "<SIL>" +def get_whole_word_mask(args, dictionary): + def is_beginning_of_word(i): + if i < dictionary.nspecial: + # special elements are always considered beginnings + return True + tok = dictionary[i] + if tok.startswith("madeupword"): + return True + elif tok in ["<unk>", "<s>", "</s>", "<pad>", "|", "<eps>"]: + return True + else: + return False + + mask_whole_words = torch.ByteTensor( + list(map(is_beginning_of_word, range(len(dictionary)))) + ) + return mask_whole_words + +def get_repeative_start(tokens): + """ + tokens: torch.Tensor with repeative tokens + """ + length = len(tokens) + rep_start_id = tokens[:-1] != tokens[1:] + return torch.cat([torch.tensor([True]), rep_start_id]) + +@dataclass +class TextPretrainingConfig(FairseqDataclass): + ### added for joint pretraining + text_data: Optional[str] = field( + default=None, + metadata={ + "help": "if set, path to text data directory", + }, + ) + seed: Optional[int] = field( + default=1, + metadata={ + "help": "for ordered_indices in MulticorpusDataset", + }, + ) + tokens_per_sample: Optional[int] = field( + default=512, + metadata={ + "help": "max number of total tokens over all segments per sample for dataset", + }, + ) + tokens_per_sample_tgt: Optional[int] = field( + default=512, + metadata={ + "help": "max number of total tokens over all segments per target sample for dataset", + }, + ) + sample_break_mode: Optional[str] = field( + default="eos", + metadata={ + "help": "mode for breaking sentence", + }, + ) + mask: Optional[float] = field( + default=0.3, + metadata={ + "help": "fraction of words/subwords that will be masked", + }, + ) + leave_unmasked_prob: float = field( + default=0.1, + metadata={"help": "probability that a masked token is unmasked"}, + ) + mask_random: Optional[float] = field( + default=0.1, + metadata={ + "help": "instead of using [MASK], use random token this often", + }, + ) + freq_weighted_replacement: bool = field( + default=False, + metadata={"help": "sample random replacement words based on word frequencies"}, + ) + mask_whole_words: bool = field( + default=True, + metadata={"help": "mask whole words; you may also want to set --bpe"}, + ) + mask_repeative_tokens: bool = field( + default=True, + metadata={"help": "mask repeative_tokens; if mask_whole_words=False"}, + ) + mask_multiple_length: int = field( + default=1, + metadata={"help": "repeat the mask indices multiple times"}, + ) + mask_stdev: float = field( + default=0.0, + metadata={"help": "stdev of the mask length"}, + ) + shorten_method: Optional[str] = field( + default="none", + metadata={ + "help": "if not none, shorten sequences that exceed tokens_per_sample", + "choices": "none/truncate/random_crop" + }, + ) + shorten_data_split_list: Optional[str] = field( + default="", + metadata={ + "help": "comma_separated list of dataset splits to apply shortening to, e.g., train,valid (default: all dataset splits)", + }, + ) + + ### below hypra-parameters is used in bart + insert: Optional[float] = field( + default=0.0, + metadata={ + "help": "insert this percentage of additional random tokens", + }, + ) + permute: Optional[float] = field( + default=0.0, + metadata={ + "help": "take this proportion of subwords and permute them", + }, + ) + rotate: Optional[float] = field( + default=0.0, + metadata={ + "help": "rotate this proportion of inputs", + }, + ) + poisson_lambda: Optional[float] = field( + default=3.5, + metadata={ + "help": "randomly shuffle sentences for this proportion of inputs", + }, + ) + permute_sentences: Optional[float] = field( + default=0.0, + metadata={ + "help": "shuffle this proportion of sentences in all inputs", + }, + ) + mask_length: Optional[str] = field( + default="span-poisson", + metadata={ + "help": "mask length to choose", + "choice": "subword/word/span-poisson" + }, + ) + replace_length: Optional[int] = field( + default=1, + metadata={ + "help": "when masking N tokens, replace with 0, 1, or N tokens (use -1 for N)", + }, + ) + shuffle_instance: Optional[bool] = field( + default=False, + metadata={"help": "shuffle instance"}, + ) + max_source_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the source sequence"}, + ) + max_target_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the target sequence"}, + ) + bpe: Optional[str] = field( + default="", + metadata={ + "help": "will wrapped by the text_data_config yaml", + }, + ) + data_config: Optional[str] = field( + default=None, + metadata={ + "help": "a config yaml specify the bpe model of text data", + }, + ) + text_maxtokens_ratio: Optional[float] = field( + default=1.0, + metadata={ + "help": "for text, max_tokens = max_tokens * text_maxtokens_ratio / 320 ", + }, + ) + prepend_tgt_lang_tag: bool = field( + default=False, + metadata={"help": "prepend tgt_lang_tag to replace <eos>"}, + ) + mask_text_ratio: Optional[float] = field( + default=0.0, + metadata={ + "help": "mask_text_ratio, for paired data", + }, + ) + truncate_mono_source: bool = field( + default=True, + metadata={"help": "truncate mono source-side examples that exceed max-positions"}, + ) + + +@dataclass +class JointPretrainingConfig(FairseqDataclass): + data: str = field( + default=MISSING, metadata={"help": "path to speech data directory"} + ) + fine_tuning: bool = field( + default=False, metadata={"help": "set to true if fine-tuning Hubert"} + ) + labels: List[str] = field( + default_factory=lambda: ["ltr"], + metadata={ + "help": ( + "extension of the label files to load, frame-level labels for" + " pre-training, and sequence-level label for fine-tuning" + ) + }, + ) + label_dir: Optional[str] = field( + default=None, + metadata={ + "help": "if set, looks for labels in this directory instead", + }, + ) + label_rate: int = field( + default=-1, + metadata={"help": "label frame rate. -1 for sequence label"}, + ) + sample_rate: int = field( + default=16_000, + metadata={ + "help": "target sample rate. audio files will be up/down " + "sampled to this rate" + }, + ) + normalize: bool = field( + default=False, + metadata={ + "help": "if set, normalizes input to have 0 mean and unit variance" + }, + ) + enable_padding: bool = field( + default=False, + metadata={"help": "pad shorter samples instead of cropping"}, + ) + max_keep_size: Optional[int] = field( + default=None, + metadata={"help": "exclude sample longer than this"}, + ) + max_sample_size: Optional[int] = field( + default=None, + metadata={"help": "max sample size to crop to for batching"}, + ) + min_sample_size: Optional[int] = field( + default=None, + metadata={"help": "min sample size to crop to for batching"}, + ) + single_target: Optional[bool] = field( + default=False, + metadata={ + "help": "if set, AddTargetDatasets outputs same keys " + "as AddTargetDataset" + }, + ) + random_crop: Optional[bool] = field( + default=True, + metadata={"help": "always crop from the beginning if false"}, + ) + pad_audio: Optional[bool] = field( + default=False, + metadata={"help": "pad audio to the longest one in the batch if true"}, + ) + store_labels: Optional[bool] = field( + default=True, + metadata={"help": "store spm labels in memory, should be true when fine-tune with bpe"}, + ) + add_decoder_target: bool = field( + default=False, + metadata={"help": "contral the model architecture, if set True, load reduced unit as target"}, + ) + split_modality_batch: bool = field( + default=False, + metadata={"help": "whether create all samples of different modalities in a batch"}, + ) + speech_tgt_lang: str = field( + default="", + metadata={"help": "prepend <tgt-id> to prev_output_tokens to replace <eos>, only used for decoder"}, + ) + speech_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based speech resampling." + "(alpha = 1 for no resampling)" + }, + ) + text_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based text resampling." + "(alpha = 1 for no resampling)" + }, + ) + hubert_tokenizer: Optional[TOKENIZER_CHOICES] = field( + default="none", + metadata={"help": "which tokenizer for processing text"}, + ) + sp_path: Optional[str] = field( + default=None, + metadata={"help": "sentencepiece model path if using bpe tokenizer"}, + ) + text_cfg: TextPretrainingConfig = TextPretrainingConfig() + # For inference + ctc_weight: float = field( + default=0.0, + metadata={"help": "ctc weight during inference"}, + ) + lm_dict: Optional[str] = field( + default="dict.txt", + metadata={"help": "dict used for decoding with language model, should be in cfg.data/"}, + ) + +@register_task("joint_sc2t_pretraining", dataclass=JointPretrainingConfig) +class Jsc2tPretrainingTask(FairseqTask): + + cfg: JointPretrainingConfig + + def __init__( + self, + cfg: JointPretrainingConfig, + load_local_states: True, + ) -> None: + super().__init__(cfg) + + logger.info(f"current directory is {os.getcwd()}") + logger.info(f"JSTPretrainingTask Config {cfg}") + + self.cfg = cfg + self.fine_tuning = cfg.fine_tuning + self.blank_symbol = "<s>" + + if load_local_states: + self.state.add_factory("hubert_tokenizer", self.build_tokenizer) + if self.cfg.text_cfg.text_data is not None and os.path.exists(self.cfg.text_cfg.text_data): + self.state.add_factory("text_dictionary", self.load_text_dictionary) + self.state.add_factory("text_src_dictionary", self.load_text_src_dictionary) + if cfg.fine_tuning: + self.state.add_factory("target_dictionary", self.load_dictionaries) + else: + self.state.add_factory("dictionaries", self.load_dictionaries) + + if cfg.text_cfg.data_config is not None: + self.text_data_cfg = S2TJointDataConfig(Path(f"{cfg.text_cfg.text_data}/{cfg.text_cfg.data_config}")) + self.cfg.text_cfg.bpe = self.text_data_cfg.bpe_tokenizer["bpe"] + else: + self.text_data_cfg = None + + @property + def source_dictionary(self) -> Optional[Dictionary]: + return None + + @property + def target_dictionary(self) -> Optional[Dictionary]: + return self.state.target_dictionary + + @property + def dictionaries(self) -> List[Dictionary]: + return self.state.dictionaries + + @property + def text_dictionary(self) -> Optional[Dictionary]: + return self.state.text_dictionary + + @property + def text_src_dictionary(self) -> Optional[Dictionary]: + return self.state.text_src_dictionary + + @property + def hubert_tokenizer(self): + return self.state.hubert_tokenizer + + def load_dictionaries(self): + label_dir = self.cfg.data if self.cfg.label_dir is None else self.cfg.label_dir + dictionaries = [Dictionary.load(f"{label_dir}/dict.{label}.txt") for label in self.cfg.labels] + if not self.cfg.fine_tuning: + for dictionary in dictionaries: + dictionary.add_symbol("<mask>") + return dictionaries[0] if self.cfg.fine_tuning else dictionaries + + def load_text_dictionary(self): + tgt_dict_path = f"{self.cfg.text_cfg.text_data}/{self.text_data_cfg.vocab_filename if self.text_data_cfg is not None else 'dict.txt'}" + if not os.path.isfile(tgt_dict_path): + raise FileNotFoundError(f"Dict not found: {tgt_dict_path}") + text_dictionary = Dictionary.load(tgt_dict_path) + self.mask_idx = text_dictionary.add_symbol("<mask>") + return text_dictionary + + def load_text_src_dictionary(self): + src_dict_path = f"{self.cfg.text_cfg.text_data}/{self.text_data_cfg.src_vocab_filename if self.text_data_cfg is not None else 'dict.txt'}" + if not os.path.isfile(src_dict_path): + raise FileNotFoundError(f"Dict not found: {src_dict_path}") + src_text_dictionary = Dictionary.load(src_dict_path) + self.mask_idx = src_text_dictionary.add_symbol("<mask>") + return src_text_dictionary + + @classmethod + def setup_task( + cls, cfg: JointPretrainingConfig, **kwargs + ) -> "Jsc2tPretrainingTask": + load_local_states = kwargs.get("load_local_states", True) + return cls(cfg, load_local_states) + + def get_label_dir(self) -> str: + if self.cfg.label_dir is None: + return self.cfg.data + return self.cfg.label_dir + + def load_paired_dataset(self, text_split, truncate_source=False): + text_split, lp = text_split.rsplit('.', 1) # e.g. "libritext.ltr-ltr" + if len(lp.split("-")) == 2: + src, tgt = lp.split("-") + if src == tgt: + logger.warn(f"| trying to load monolingual dataset {text_split}.{lp}, please check your task is right.") + paired_dataset = self.load_char_bart_dataset(f"{text_split}.{lp}.{tgt}") + return paired_dataset + paired_dataset = load_langpair_dataset( + self.cfg.text_cfg.text_data, + text_split, + src, + self.text_src_dictionary, + tgt, + self.text_dictionary, + combine=True, + dataset_impl=None, + upsample_primary=1, + left_pad_source=False, + left_pad_target=False, + max_source_positions=self.cfg.text_cfg.tokens_per_sample, + max_target_positions=self.cfg.text_cfg.tokens_per_sample, + truncate_source=truncate_source, + prepend_bos=False, + load_alignments=False, + append_source_id=True if self.cfg.text_cfg.prepend_tgt_lang_tag else False, + lang_format="<lang:{}>" if self.cfg.text_cfg.prepend_tgt_lang_tag else "[{}]", + input_feeding=self.cfg.add_decoder_target, + ) + if self.cfg.text_cfg.mask_text_ratio > 0: + # add mask + self.mask_idx = self.text_src_dictionary.index("<mask>") + mask_whole_words = None + if self.cfg.text_cfg.mask_whole_words: + mask_whole_words = get_whole_word_mask(self.cfg.text_cfg, self.text_src_dictionary) + elif self.cfg.text_cfg.mask_repeative_tokens: + mask_whole_words = get_repeative_start + + src_dataset, src_unmasked_dataset = MaskTokensDataset.apply_mask( + paired_dataset.src, + self.text_src_dictionary, + pad_idx=self.text_src_dictionary.pad(), + mask_idx=self.mask_idx, + seed=self.cfg.text_cfg.seed, + mask_prob=self.cfg.text_cfg.mask_text_ratio, + leave_unmasked_prob=self.cfg.text_cfg.leave_unmasked_prob, + random_token_prob=self.cfg.text_cfg.mask_random, + freq_weighted_replacement=self.cfg.text_cfg.freq_weighted_replacement, + mask_whole_words=mask_whole_words, + mask_multiple_length=self.cfg.text_cfg.mask_multiple_length, + mask_stdev=self.cfg.text_cfg.mask_stdev, + ) + tgt_dataset = paired_dataset.tgt if paired_dataset.tgt is not None else src_unmasked_dataset + paired_dataset = LanguageTripleDataset( + src_dataset, + src_dataset.sizes, + self.text_src_dictionary, + src_unmasked_dataset, + src_unmasked_dataset.sizes, + self.text_src_dictionary, + tgt_dataset, + tgt_dataset.sizes, + self.text_dictionary, + left_pad_source=False, + left_pad_target=False, + align_dataset=None, + eos=None, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + ) + else: + src, ref, tgt = lp.split("-") + paired_dataset = load_langtriple_dataset( + self.cfg.text_cfg.text_data, + text_split, + src, + self.text_src_dictionary, + ref, + self.dictionaries[-1], + tgt, + self.text_dictionary, + combine=True, + dataset_impl=None, + upsample_primary=1, + left_pad_source=False, + left_pad_target=False, + max_source_positions=self.cfg.text_cfg.tokens_per_sample, + max_target_positions=self.cfg.text_cfg.tokens_per_sample, + truncate_source=truncate_source, + prepend_bos=False, + load_alignments=False, + append_source_id=True if self.cfg.text_cfg.prepend_tgt_lang_tag else False, + lang_format="<lang:{}>" if self.cfg.text_cfg.prepend_tgt_lang_tag else "[{}]", + ) + return paired_dataset + + def load_dataset(self, split: str, epoch=1, **kwargs) -> None: + """ + Create Wav dataset for audio, and Index dataset for phonemized text, + then concatenate them to by fairseq.data.multi_corpus_dataset.MultiCorpusDataset. + """ + speech_splits = split.split('+')[0].split(',') + ### 1st, create a speech dataset using STSpeechDataset (modified from HubertDataset) + dicts = [self.target_dictionary] if self.cfg.fine_tuning else self.dictionaries + pad_list = [dict.pad() for dict in dicts] + eos_list = [dict.eos() for dict in dicts] + procs = [LabelEncoder(dict) for dict in dicts] + if self.cfg.speech_tgt_lang != "": + tgt_lang_idx = _lang_token_index(dicts[0], self.cfg.speech_tgt_lang) + logger.info(f"Will prepend <{tgt_lang_idx}> at the beginning of prev_output_tokens to replace <eos>") + else: + tgt_lang_idx = None + + + # hubert v1: pad_audio=True, random_crop=False; + speech_datasets = [] + for speech_split in speech_splits: + paths = [ + f"{self.get_label_dir()}/{speech_split}.{l}" for l in self.cfg.labels + ] + speech_datasets.append( + HubertDataset( + f"{self.cfg.data}/{speech_split}.tsv", + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=self.cfg.store_labels, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + tgt_dict=dicts[0], + add_decoder_target=self.cfg.add_decoder_target, + fine_tuning=self.cfg.fine_tuning, + tgt_lang_idx=tgt_lang_idx, + tokenizer=self.hubert_tokenizer, + ) + ) + if len(speech_datasets) > 1: + speech_dataset = ConcatDataset(speech_datasets) + else: + speech_dataset = speech_datasets[0] + + has_text = len(split.split('+')) > 1 + if not has_text: + assert speech_dataset is not None + self.datasets[split] = speech_dataset + return + + ### 2nd, create paired/mono text datasets using Langpairdataset + if split.split('+')[1] != '': + paired_splits = [paired_split for paired_split in split.split('+')[1].split(',') if paired_split != ''] + paired_datasets = [self.load_paired_dataset(paired_split) for paired_split in paired_splits] + else: + paired_splits, paired_datasets = [], [] + + if len(split.split('+')) > 2 and split.split('+')[2] != '': + mono_splits = [mono_split for mono_split in split.split('+')[2].split(',') if mono_split != ''] + mono_datasets = [self.load_paired_dataset(mono_split, truncate_source=self.cfg.text_cfg.truncate_mono_source) for mono_split in mono_splits] + else: + mono_splits, mono_datasets = [], [] + + assert len(mono_datasets + paired_datasets) > 0, f"split {split} has no text! you should check out for that" + + ### 3rd, if provided, create a supervised dataset with labeled data + if len(split.split('+')) > 3 and split.split('+')[3] != '': + assert len(paired_splits) > 0, f"supervised dataset can not be loaded without text paired dataset!" + tgt = paired_splits[0].rsplit('.', 1)[1].split("-")[1] + sup_split = split.split('+')[3] + + sup_dataset = HubertDataset( + f"{self.cfg.data}/{sup_split}.tsv", + sample_rate=self.cfg.sample_rate, + label_paths=[f"{self.get_label_dir()}/{sup_split}.{tgt}"], + label_rates=[-1], + pad_list=[self.text_dictionary.pad()], + eos_list=[self.text_dictionary.eos()], + label_processors=[LabelEncoder(self.text_dictionary)], + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=None, + max_sample_size=None, + pad_audio=True, + normalize=self.cfg.normalize, + store_labels=self.cfg.store_labels, + random_crop=False, + single_target=True, + tgt_dict=self.text_dictionary, + add_decoder_target=self.cfg.add_decoder_target, + fine_tuning=True, + tgt_lang_idx=None, + tokenizer=None, + ) + else: + sup_dataset = None + + ### 4th, compose a MultiCorpusDataset + dataset_dict, max_positions_dict, distributions, max_tokens_ratios = self.resample_multi_modality_dataset( + speech_dataset, sup_dataset, mono_datasets, paired_datasets, mono_splits, paired_splits, epoch=epoch, + ) + self.datasets[split] = MultiCorpusDataset( + dataset_dict, + max_positions=max_positions_dict, + distribution=distributions, + max_tokens_ratio=max_tokens_ratios, + seed=self.cfg.text_cfg.seed, + sort_indices=True, + ) + + + def max_positions(self) -> Tuple[int, int]: + return (sys.maxsize, sys.maxsize) + + def filter_indices_by_size( + self, indices: np.array, *args, **kwargs + ) -> np.array: + return indices + + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + skip_remainder_batch=False, + grouped_shuffling=False, + update_epoch_batch_itr=False, + ): + """ + Get an iterator that yields batches of data from the given dataset. + Args: + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_tokens (int, optional): max number of tokens in each batch + (default: None). + max_sentences (int, optional): max number of sentences in each + batch (default: None). + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + required_batch_size_multiple (int, optional): require batch size to + be a multiple of N (default: 1). + seed (int, optional): seed for random number generator for + reproducibility (default: 1). + num_shards (int, optional): shard the data iterator into N + shards (default: 1). + shard_id (int, optional): which shard of the data iterator to + return (default: 0). + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 1). + data_buffer_size (int, optional): number of batches to + preload (default: 0). + disable_iterator_cache (bool, optional): don't cache the + EpochBatchIterator (ignores `FairseqTask::can_reuse_epoch_itr`) + (default: False). + skip_remainder_batch (bool, optional): if set, discard the last + batch in each training epoch, as the last batch is often smaller than + local_batch_size * distributed_word_size (default: ``True``). + grouped_shuffling (bool, optional): group batches with each groups + containing num_shards batches and shuffle groups. Reduces difference + between sequence lengths among workers for batches sorted by length. + update_epoch_batch_itr (bool optional): if true then donot use the cached + batch iterator for the epoch + + Returns: + ~fairseq.iterators.EpochBatchIterator: a batched iterator over the + given dataset split + """ + if self.fine_tuning or not isinstance(dataset, MultiCorpusDataset): + return super().get_batch_iterator( + dataset, + max_tokens=max_tokens, + max_sentences=max_sentences, + max_positions=max_positions, + ignore_invalid_inputs=ignore_invalid_inputs, + required_batch_size_multiple=required_batch_size_multiple, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + data_buffer_size=data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + skip_remainder_batch=skip_remainder_batch, + grouped_shuffling=grouped_shuffling, + update_epoch_batch_itr=update_epoch_batch_itr, + ) + + can_reuse_epoch_itr = ( + not disable_iterator_cache + and not update_epoch_batch_itr + and self.can_reuse_epoch_itr(dataset) + ) + if can_reuse_epoch_itr and dataset in self.dataset_to_epoch_iter: + logger.debug("reusing EpochBatchIterator for epoch {}".format(epoch)) + return self.dataset_to_epoch_iter[dataset] + + assert isinstance(dataset, FairseqDataset) + + # initialize the dataset with the correct starting epoch + dataset.set_epoch(epoch) + + # get indices ordered by example size + with data_utils.numpy_seed(seed): + indices = dataset.ordered_indices() + + # filter examples that are too large + if max_positions is not None: + indices = self.filter_indices_by_size( + indices, dataset, max_positions, ignore_invalid_inputs + ) + + # create mini-batches with given size constraints + batch_sampler = dataset.get_batch_sampler( + indices, + num_shards, + seed, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + split_modality_batch=self.cfg.split_modality_batch, + ) + + # return a reusable, sharded iterator + epoch_iter = iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + skip_remainder_batch=skip_remainder_batch, + disable_shuffling=True, + grouped_shuffling=grouped_shuffling, + ) + + if can_reuse_epoch_itr: + self.dataset_to_epoch_iter[dataset] = epoch_iter + + return epoch_iter + + def build_generator( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + ): + """Build ED-CTC generator for finet-tuned ASR model""" + from speechut.squence_generator import SequenceGenerator + extra_gen_cls_kwargs = { + "ctc_weight": self.cfg.ctc_weight, + "lm_dict": Dictionary.load(os.path.join(self.cfg.data, self.cfg.lm_dict)), + **extra_gen_cls_kwargs + } + return super().build_generator( + models, args, seq_gen_cls=SequenceGenerator, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + @classmethod + def _get_size_ratios(cls, ids: List[str], sizes: List[int], alpha: float = 1.0): + """Size ratios for temperature-based sampling + (https://arxiv.org/abs/1907.05019)""" + _sizes = np.array(sizes) + prob = _sizes / _sizes.sum() + smoothed_prob = prob ** alpha + smoothed_prob = smoothed_prob / smoothed_prob.sum() + size_ratio = (smoothed_prob * _sizes.sum()) / _sizes + + o_str = str({_i: f"{prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"original sampling probability: {o_str}") + p_str = str({_i: f"{smoothed_prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"balanced sampling probability: {p_str}") + sr_str = str({_id: f"{size_ratio[i]:.3f}" for i, _id in enumerate(ids)}) + logger.info(f"balanced sampling size ratio: {sr_str}") + return size_ratio.tolist() + + def resample_multi_modality_dataset(self, speech_dataset, sup_dataset, mono_datasets, paired_datasets, mono_splits, paired_splits, epoch=1, train=True): + assert len(mono_datasets+paired_datasets) > 0, f"No text data loaded!" + + if len(mono_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + mono_splits, [len(s) for s in mono_datasets], alpha=self.cfg.text_sampling_alpha + ) + mono_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) for d, r in zip(mono_datasets, size_ratios) + ] + + if len(paired_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + paired_splits, [len(s) for s in paired_datasets], alpha=self.cfg.text_sampling_alpha + ) + paired_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) for d, r in zip(paired_datasets, size_ratios) + ] + + dataset_list = [speech_dataset, sup_dataset] + for datasets in [mono_datasets, paired_datasets]: + if len(datasets) > 1: + dataset_list.append(ConcatDataset(datasets)) + elif len(datasets) == 1: + dataset_list.append(datasets[0]) + else: + dataset_list.append(None) + + ### match speech/text datasets according to modality + dataset_dict = OrderedDict((name, d) for name, d in zip(["speech", "speech_sup", "text_mono", "text_paired"], dataset_list) if d is not None) + max_positions_dict = { + "speech": None, + "speech_sup": None, + "text_mono": (self.cfg.text_cfg.tokens_per_sample, self.cfg.text_cfg.tokens_per_sample), + "text_paired": (self.cfg.text_cfg.tokens_per_sample, self.cfg.text_cfg.tokens_per_sample), + } + max_positions_dict = OrderedDict((name, max_positions_dict[name]) for name in dataset_dict.keys()) + max_tokens_ratios_dict = { + "speech": 1.0, + "speech_sup": 1.0, + "text_mono": 1.0 / 320 / self.cfg.text_cfg.text_maxtokens_ratio, + "text_paired": 1.0 / 320 / self.cfg.text_cfg.text_maxtokens_ratio, + } + max_tokens_ratios = [max_tokens_ratios_dict[name] for name in dataset_dict.keys()] + dataset_lens = np.array([len(dataset) for dataset in dataset_dict.values()]) + dataset_avg_sample_lens = np.array([ + sum([dataset.num_tokens(i) for i in np.random.randint(low=0, high=len(dataset), size=10000)]) / 10000.0 + for dataset in dataset_dict.values() + ]) + + if not "speech" in dataset_dict: + distributions = [l / sum(dataset_lens) for l in dataset_lens] + else: + ## we just keep the batches of speech and non-speech the same, expand_coef is to ensure speech batches is less than others + first_ratio = dataset_lens[0] / sum(dataset_lens) + expand_coef = 1.2 if sup_dataset is None else 1.1 * sum(dataset_lens[0:2]) / dataset_lens[0] + distributions = [expand_coef * max_tokens_ratios[i] * dataset_avg_sample_lens[0] / l for (i, l) in enumerate(dataset_avg_sample_lens)] + distributions[0] = 1.0 + if sup_dataset is not None: + distributions[1] = dataset_lens[1] / dataset_lens[0] + distributions = [first_ratio * d for d in distributions] + + logging.info(f"Number samples of datasets is {dataset_lens}") + logging.info(f"Avg sample length of datasets is {dataset_avg_sample_lens}") + logging.info(f"Sampling distributions is {distributions}") + logging.info(f"Maxtokens ratio is {max_tokens_ratios}") + return dataset_dict, max_positions_dict, distributions, max_tokens_ratios + + def build_tokenizer(self, cfg=None): + logger.info(f"tokenizer: {self.cfg.hubert_tokenizer}") + if self.cfg.hubert_tokenizer != "none": + return encoders.build_bpe(Namespace(**{"bpe": self.cfg.hubert_tokenizer, "sentencepiece_model": self.cfg.sp_path})) + else: + return None + + def load_char_bart_dataset(self, split): + mono_dataset = data_utils.load_indexed_dataset( + f"{self.cfg.text_cfg.text_data}/{split}", + self.text_dictionary, + ) + mono_dataset = StripTokenDataset(mono_dataset, self.text_dictionary.eos()) + mono_dataset = maybe_shorten_dataset( + mono_dataset, + split, + self.cfg.text_cfg.shorten_data_split_list, + self.cfg.text_cfg.shorten_method, + self.cfg.text_cfg.tokens_per_sample - 2, + self.cfg.text_cfg.seed, + ) + logger.info("loaded {} samples from: {}".format(len(mono_dataset), mono_dataset)) + ### prepend bos and eos to dataset + mono_dataset = PrependTokenDataset(mono_dataset, self.text_dictionary.bos()) + mono_dataset = AppendTokenDataset(mono_dataset, self.text_dictionary.eos()) + mask_whole_words = ( + get_whole_word_mask(None, self.text_dictionary) + if self.cfg.text_cfg.mask_whole_words + else None + ) + lang=self.cfg.speech_tgt_lang + mono_dataset = DenoisingDataset( + mono_dataset, + mono_dataset.sizes, + self.text_dictionary, + self.mask_idx, + mask_whole_words, + shuffle=self.cfg.text_cfg.shuffle_instance, + seed=self.cfg.text_cfg.seed, + args=self.cfg.text_cfg, + tgt_lang_idx=_lang_token_index(self.text_dictionary, lang) if self.cfg.text_cfg.prepend_tgt_lang_tag else None, + ) + + return mono_dataset diff --git a/VATLM/README.md b/VATLM/README.md new file mode 100644 index 0000000..0594e67 --- /dev/null +++ b/VATLM/README.md @@ -0,0 +1,135 @@ +# VATLM +<!--**Pre-trained models for speech related tasks**--> + + [**VATLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning**](https://arxiv.org/abs/2211.11275) + + +- (Done) Nov. 2022: release the code and models +- Nov. 2022: release preprint in [arXiv](https://arxiv.org/abs/2211.11275) + +## Pre-Trained and Fine-tuned Models + +| Model | Pre-training Dataset | Fine-tuning Dataset | Model | +| :---------: | :----------------------------------------: | :-------------------: | :----------------------------------------------------------: | +| VatLM Base | LRS3 + paired audio+text+audio | - | [Google drive](https://drive.google.com/file/d/121ITJc22prpbd4sCy9bPWpdkKgGikkgm/view?usp=share_link) | +| VatLM Base | LRS3 + paired audio+text+audio | LRS-30h audio-visual | [Google drive](https://drive.google.com/file/d/1Bfbq0G-tASw3YrI3rzdpYgTE-UV-YaN0/view?usp=share_link) | +| VatLM Base | LRS3 + paired audio+text+audio | LRS-30h visual | [Google drive](https://drive.google.com/file/d/1qALD9obym0zCDoszVn2CzW0U3EUl-4v7/view?usp=share_link) | +| VatLM Base | VoxCeleb2 + LRS3 + paired audio+text+audio | - | [Google drive](https://drive.google.com/file/d/1piae9Row25OEfAekVz5Bxb9YnIVyEP0A/view?usp=share_link) | +| VatLM Base | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-30h audio-visual | [Google drive](https://drive.google.com/file/d/13JVuUi9gIIoUM888XcAOzvN7ioazn-cv/view?usp=share_link) | +| VatLM Base | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-30h visual | [Google drive](https://drive.google.com/file/d/1pAQHf60HgqDORGzyqEjdGTIywLKO3Ko5/view?usp=share_link) | +| VatLM Base | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-433h audio-visual | [Google drive](https://drive.google.com/file/d/1u9oMnivBelxznQcMDoM_u5EOfJuxnSuL/view?usp=share_link) | +| VatLM Base | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-433h visual | [Google drive](https://drive.google.com/file/d/1g107k5tL3XyvevSe0BzMqYOQFyFQG7jf/view?usp=share_link) | +| VatLM Large | VoxCeleb2 + LRS3 + paired audio+text+audio | - | [Google drive](https://drive.google.com/file/d/1_vbVFpKcaaPcCx2FtI-GyzVvxAhppg_b/view?usp=share_link) | +| VatLM Large | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-30h audio-visual | [Google drive](https://drive.google.com/file/d/1LyTCxceTZIqjVdMY6hlJjWolaIAZ0Mhs/view?usp=share_link) | +| VatLM Large | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-30h visual | [Google drive](https://drive.google.com/file/d/1CuyGg5O14F9Y_WCwpCVoKYbDKVtjBRQU/view?usp=share_link) | +| VatLM Large | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-433h audio-visual | [Google drive](https://drive.google.com/file/d/12orvO3xBuzdUDrBOqjW0mdGhV2Kmsy0Q/view?usp=share_link) | +| VatLM Large | VoxCeleb2 + LRS3 + paired audio+text+audio | LRS-433h visual | [Google drive](https://drive.google.com/file/d/17DDTUPs0BkaJtSUTiJHLBbymt2LCGo6e/view?usp=share_link) | + + + +## Setup + +To fine-tune or pre-train more models, please follow the instructions below. + +```bash +git clone https://github.com/microsoft/SpeechT5.git +cd SpeechT5/VATLM +git submodule init && git submodule update + +cd VATLM/fairseq && pip install --editable +cd VATLM/vat_hubert && pip install -r requirements.txt +``` + +## Data preparation + +1. For audio or visual data, please follow the steps of AV-HuBERT's [script](https://github.com/facebookresearch/av_hubert/tree/main/avhubert/preparation) to pre-process the data and get the corresponding `train.tsv`,` train.km` files. + +2. For unimodal audio data, the visual modality is replaced with a zero vector, and the features are extracted according to this [script](https://github.com/facebookresearch/av_hubert/tree/main/avhubert/preparation) and then kmeans [clustering](https://github.com/facebookresearch/av_hubert/tree/main/avhubert/clustering) is performed to get the corresponding labels. + +3. For unimodal text data, we use a small amount of pair text-audio data to obtain paired phone-unit data, and get the corresponding phoneme sequences by looking up the [lexicon](https://drive.google.com/file/d/1dh9NEx_cCF9_Aa0UcKyl9j00GXs6LmLQ/view?usp=sharing), and the unit data are obtained by extracting features and performing kmeans [clustering](https://github.com/facebookresearch/av_hubert/tree/main/avhubert/clustering). Then follow this [script](https://github.com/microsoft/SpeechT5/tree/main/SpeechLM#hidden-unit-tokenizer-for-text) to train the phone2unit model. + +## Pre-train + +- VatLM Base model (LRS3 + paired audio+text+audio) + + ```shell + cd VATLM/vat_hubert/vathubert/scripts/pretrain + ngpu=32 + updatefreq=1 + save_path=/path/to/save_path + + bash base_lsr3_pretrain_iter5.sh ${ngpu} ${updatefreq} ${save_path} + ``` + +- VatLM Base model (VoxCeleb2 + paired audio+text+audio) + + ```shell + cd VATLM/vat_hubert/vathubert/scripts/pretrain + ngpu=32 + updatefreq=1 + save_path=/path/to/save_path + + bash base_vox_pretrain_iter5.sh ${ngpu} ${updatefreq} ${save_path} + ``` + +- VatLM Large model (VoxCeleb2 + paired audio+text+audio) + + ```shell + cd VATLM/vat_hubert/vathubert/scripts/pretrain + ngpu=32 + updatefreq=2 + save_path=/path/to/save_path + + bash large_vox_pretrain_iter5.sh ${ngpu} ${updatefreq} ${save_path} + ``` + +## Fine-tune AVSR/VSR + +For example, the AVSR model can be obtained by fine-tuning the VatLM model using 30 hours of labeled data. + +```shell +cd VATLM/vat_hubert/vathubert/scripts/finetune_avsr +ngpu=8 +updatefreq=1 +save_path=/path/to/save_path + +bash base_lrs3_finetune30_av.sh ${ngpu} ${updatefreq} ${save_path} +``` + +## Decode + +For example, decoding the fine-tuned AVSR model. + +```sh +cd VATLM/vat_hubert/vathubert/ +data="test" +bash decode_avhubert_lrs3.sh ${data} +``` + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq) and [av_hubert](https://github.com/facebookresearch/av_hubert) + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +## Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{zhu2022vatlm, + title={VATLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning}, + author={Qiushi Zhu and Long Zhou and Ziqiang Zhang and Shujie Liu and Binxing Jiao and Jie Zhang and Lirong Dai and Daxin Jiang and Jinyu Li and Furu Wei}, + year={2022}, + eprint={2211.11275}, + archivePrefix={arXiv}, +} +``` + +### Contact Information + +For help or issues using VatLM models, please submit a GitHub issue. + +For other communications related to VatLM, please contact Long Zhou (`lozhou@microsoft.com`). + diff --git a/VATLM/vat_hubert/requirements.txt b/VATLM/vat_hubert/requirements.txt new file mode 100644 index 0000000..a177256 --- /dev/null +++ b/VATLM/vat_hubert/requirements.txt @@ -0,0 +1,6 @@ +python-speech-features==0.6 +scipy==1.5.4 +opencv-python==4.5.4.60 +sentencepiece==0.1.96 +editdistance==0.6.0 +kaldiio==2.17.2 \ No newline at end of file diff --git a/VATLM/vat_hubert/vathubert/__init__.py b/VATLM/vat_hubert/vathubert/__init__.py new file mode 100644 index 0000000..1e16cee --- /dev/null +++ b/VATLM/vat_hubert/vathubert/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +# from .hubert import * # noqa +# from .hubert_asr import * # noqa +# from .hubert_dataset import * +# from .hubert_pretraining import * +# from .hubert_criterion import * +from . import data, tasks, criterions, models \ No newline at end of file diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_av.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_av.yaml new file mode 100644 index 0000000..fdae821 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_av.yaml @@ -0,0 +1,118 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video","audio"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 2000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 50000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 15000 + hold_steps: 0 + decay_steps: 20000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 6 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 30000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_v.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_v.yaml new file mode 100644 index 0000000..1672dbb --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/base_lrs3_30h_v.yaml @@ -0,0 +1,118 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 2000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 40000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 10000 + hold_steps: 0 + decay_steps: 20000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 6 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 24000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_av.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_av.yaml new file mode 100644 index 0000000..fdae821 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_av.yaml @@ -0,0 +1,118 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video","audio"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 2000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 50000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 15000 + hold_steps: 0 + decay_steps: 20000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 6 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 30000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_v.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_v.yaml new file mode 100644 index 0000000..fdae821 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_30h_v.yaml @@ -0,0 +1,118 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video","audio"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 2000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 50000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 15000 + hold_steps: 0 + decay_steps: 20000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 6 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 30000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_av.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_av.yaml new file mode 100644 index 0000000..f39bda2 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_av.yaml @@ -0,0 +1,118 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video","audio"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 2000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 60000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 20000 + hold_steps: 0 + decay_steps: 40000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 6 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 48000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_v.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_v.yaml new file mode 100644 index 0000000..773d638 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/base_vox_433h_v.yaml @@ -0,0 +1,118 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 2000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 30000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 10000 + hold_steps: 0 + decay_steps: 20000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 6 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 18000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_av.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_av.yaml new file mode 100644 index 0000000..f712945 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_av.yaml @@ -0,0 +1,124 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video","audio"] + image_aug: true + pad_audio: true + random_crop: false + # noise_prob: 0.25 + # noise_snr: 0 + # noise_wav: ??? + +dataset: + num_workers: 6 + max_tokens: 1000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 60000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 20000 + hold_steps: 0 + decay_steps: 40000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 9 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 48000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + decoder_embed_dim: 1024 + decoder_ffn_embed_dim: 4096 + decoder_attention_heads: 8 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_v.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_v.yaml new file mode 100644 index 0000000..f401668 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_30h_v.yaml @@ -0,0 +1,121 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 1000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 18000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 6000 + hold_steps: 0 + decay_steps: 12000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 9 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 14400 + share_decoder_input_output_embed: true + decoder_normalize_before: true + decoder_embed_dim: 1024 + decoder_ffn_embed_dim: 4096 + decoder_attention_heads: 8 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_av.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_av.yaml new file mode 100644 index 0000000..bd08081 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_av.yaml @@ -0,0 +1,122 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video","audio"] + image_aug: true + pad_audio: true + random_crop: false + + +dataset: + num_workers: 6 + max_tokens: 1000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 60000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 20000 + hold_steps: 0 + decay_steps: 40000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 9 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 48000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + decoder_embed_dim: 1024 + decoder_ffn_embed_dim: 4096 + decoder_attention_heads: 8 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_v.yaml b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_v.yaml new file mode 100644 index 0000000..e31c848 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/finetune/large_vox_433h_v.yaml @@ -0,0 +1,121 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + user_dir: ??? + +checkpoint: + save_interval: 2 + keep_interval_updates: 1 + no_epoch_checkpoints: true + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: c10d + find_unused_parameters: true + distributed_world_size: 8 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + is_s2s: true + data: ??? + label_dir: ??? + tokenizer_bpe_model: ??? + normalize: true # must be consistent with pre-training + labels: ["wrd"] + single_target: true + fine_tuning: true + stack_order_audio: 4 + tokenizer_bpe_name: sentencepiece + max_sample_size: 500 + modalities: ["video"] + image_aug: true + pad_audio: true + random_crop: false + +dataset: + num_workers: 6 + max_tokens: 1000 + validate_after_updates: 0 + validate_interval: 2 + train_subset: train + valid_subset: valid + +criterion: + _name: label_smoothed_cross_entropy + report_accuracy: true + label_smoothing: 0.1 + +optimization: + max_update: 30000 + lr: [0.001] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + +lr_scheduler: + _name: tri_stage + warmup_steps: 10000 + hold_steps: 0 + decay_steps: 20000 + final_lr_scale: 0.05 + +model: + _name: vat_hubert_seq2seq + w2v_path: ??? + apply_mask: false + mask_selection: static + mask_length: 10 + mask_other: 0 + mask_prob: 0.75 + mask_channel_selection: static + mask_channel_length: 64 + mask_channel_other: 0 + mask_channel_prob: 0.5 + layerdrop: 0.1 + dropout: 0.0 + activation_dropout: 0.1 + attention_dropout: 0.0 + feature_grad_mult: 1.0 + decoder_layers: 9 + decoder_dropout: 0.1 + decoder_attention_dropout: 0.0 + decoder_activation_dropout: 0.1 + freeze_finetune_updates: 18000 + share_decoder_input_output_embed: true + decoder_normalize_before: true + decoder_embed_dim: 1024 + decoder_ffn_embed_dim: 4096 + decoder_attention_heads: 8 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/pretrain/base_lrs3_iter5.yaml b/VATLM/vat_hubert/vathubert/conf/pretrain/base_lrs3_iter5.yaml new file mode 100644 index 0000000..b67c97d --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/pretrain/base_lrs3_iter5.yaml @@ -0,0 +1,113 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + user_dir: ??? + empty_cache_freq: 10000 + +checkpoint: + save_interval: 5 + save_interval_updates: 25000 + keep_interval_updates: 1 + no_epoch_checkpoints: false + + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 32 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + data: ??? + label_dir: ??? + labels: ["km"] + label_rate: ${model.label_rate} + sample_rate: 25 + max_sample_size: 500 + min_sample_size: 5 + pad_audio: true + random_crop: false + normalize: true + stack_order_audio: 4 + # stack_order: 1 + input_modality: image + image_aug: true + +dataset: + num_workers: 6 + max_tokens: 1000 + skip_invalid_size_inputs_valid_test: true + validate_interval: 5 + validate_interval_updates: 10000 + +criterion: + _name: vat_hubert + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + +optimization: + max_update: 400000 + lr: [0.0005] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: vat_hubert + label_rate: ??? + skip_masked: false + skip_nomask: false + modality_dropout: 0.5 + audio_dropout: 0.5 + modality_fuse: concat + selection_type: same_seq + masking_type: input + mask_prob_image: 0.3 + mask_length_image: 10 + mask_prob_audio: 0.8 + mask_length_audio: 10 + extractor_mode: default + # conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + wav_input: false + layer_norm_first: true + audio_feat_dim: 104 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/pretrain/base_vox_iter5.yaml b/VATLM/vat_hubert/vathubert/conf/pretrain/base_vox_iter5.yaml new file mode 100644 index 0000000..0f349a2 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/pretrain/base_vox_iter5.yaml @@ -0,0 +1,113 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + user_dir: ??? + empty_cache_freq: 10000 + +checkpoint: + save_interval: 1 + save_interval_updates: 10000 + keep_interval_updates: 1 + no_epoch_checkpoints: false + + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 32 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + data: ??? + label_dir: ??? + labels: ["km"] + label_rate: ${model.label_rate} + sample_rate: 25 + max_sample_size: 500 + min_sample_size: 5 + pad_audio: true + random_crop: false + normalize: true + stack_order_audio: 4 + # stack_order: 1 + input_modality: image + image_aug: true + +dataset: + num_workers: 6 + max_tokens: 1000 + skip_invalid_size_inputs_valid_test: true + validate_interval: 5 + validate_interval_updates: 10000 + +criterion: + _name: vat_hubert + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + +optimization: + max_update: 400000 + lr: [0.002] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 64000 + +model: + _name: vat_hubert + label_rate: ??? + skip_masked: false + skip_nomask: false + modality_dropout: 0.5 + audio_dropout: 0.5 + modality_fuse: concat + selection_type: same_seq + masking_type: input + mask_prob_image: 0.3 + mask_length_image: 10 + mask_prob_audio: 0.8 + mask_length_audio: 10 + extractor_mode: default + # conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + wav_input: false + layer_norm_first: true + audio_feat_dim: 104 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/pretrain/large_vox_iter5.yaml b/VATLM/vat_hubert/vathubert/conf/pretrain/large_vox_iter5.yaml new file mode 100644 index 0000000..e543801 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/pretrain/large_vox_iter5.yaml @@ -0,0 +1,118 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + user_dir: ??? + empty_cache_freq: 10000 + +checkpoint: + save_interval: 2 + save_interval_updates: 10000 + keep_interval_updates: 1 + no_epoch_checkpoints: false + + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 64 + # distributed_port: 29671 + nprocs_per_node: 8 + +task: + _name: vat_hubert_pretraining + data: ??? + label_dir: ??? + labels: ["km"] + label_rate: ${model.label_rate} + sample_rate: 25 + max_sample_size: 500 + min_sample_size: 5 + pad_audio: true + random_crop: false + normalize: true + stack_order_audio: 4 + # stack_order: 1 + input_modality: image + image_aug: true + # max_trim_sample_size: 400 + +dataset: + num_workers: 6 + max_tokens: 1000 + skip_invalid_size_inputs_valid_test: true + validate_interval: 5 + validate_interval_updates: 10000 + +criterion: + _name: vat_hubert + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + +optimization: + max_update: 600000 + lr: [0.002] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 48000 + +model: + _name: vat_hubert + label_rate: ??? + skip_masked: false + skip_nomask: false + modality_dropout: 0.5 + audio_dropout: 0.5 + modality_fuse: concat + selection_type: same_seq + masking_type: input + mask_prob_image: 0.3 + mask_length_image: 5 + mask_prob_audio: 0.8 + mask_length_audio: 10 + extractor_mode: default + # conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + wav_input: false + layer_norm_first: true + audio_feat_dim: 104 + encoder_layers: 24 + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + encoder_attention_heads: 16 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/VATLM/vat_hubert/vathubert/conf/s2s_decode.yaml b/VATLM/vat_hubert/vathubert/conf/s2s_decode.yaml new file mode 100644 index 0000000..ce9279f --- /dev/null +++ b/VATLM/vat_hubert/vathubert/conf/s2s_decode.yaml @@ -0,0 +1,23 @@ +common: + user_dir: ??? + +generation: + beam: 50 + max_len_a: 1.0 + max_len_b: 0 + lenpen: 1.0 + lm_weight: 0 + +common_eval: + results_path: ??? + path: ??? + +dataset: + max_tokens: 1000 + gen_subset: valid + num_workers: 0 + +override: + noise_prob: 0.0 + noise_snr: 0 + modalities: ??? diff --git a/VATLM/vat_hubert/vathubert/criterions/__init__.py b/VATLM/vat_hubert/vathubert/criterions/__init__.py new file mode 100644 index 0000000..b5266f3 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/criterions/__init__.py @@ -0,0 +1,9 @@ +import importlib +import os + +for file in os.listdir(os.path.dirname(__file__)): + if file.endswith(".py") and not file.startswith("_"): + criterion_name = file[: file.find(".py")] + importlib.import_module( + "vathubert.criterions." + criterion_name + ) diff --git a/VATLM/vat_hubert/vathubert/criterions/vathubert_criterion.py b/VATLM/vat_hubert/vathubert/criterions/vathubert_criterion.py new file mode 100644 index 0000000..ec6fc59 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/criterions/vathubert_criterion.py @@ -0,0 +1,408 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass + + +@dataclass +class VATHubertCriterionConfig(FairseqDataclass): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + banlance_loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + +@register_criterion("vat_hubert", dataclass=VATHubertCriterionConfig) +class VATHubertCriterion(FairseqCriterion): + def __init__(self, task, pred_masked_weight, pred_nomask_weight, banlance_loss_weights, loss_weights=None, log_keys=None): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.banlance_loss_weights = banlance_loss_weights + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + + videoaudio_sample = sample.get("videoaudio", None) + audiotext_sample = sample.get("audiotext", None) + onlytext_sample = sample.get("onlytext", None) + onlyaudio_sample = sample.get("onlyaudio", None) + + + loss = 0. + loss1 = 0. + loss2 = 0. + loss3 = 0. + loss4 = 0. + sample_size = 0 + logging_output = {} + reduction = "sum" if reduce else "none" + + if videoaudio_sample is not None: + # print("videoaudio_sample") + net_output = model(target_list=videoaudio_sample["target_list"], **videoaudio_sample["net_input"]) + + loss_m_list = [] + logp_m_list, targ_m_list = net_output['logit_m_list'], net_output['target_m_list'] + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_videoaudio_{i}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss1 += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list, targ_u_list = net_output['logit_u_list'], net_output['target_u_list'] + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_videoaudio_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss1 += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss1 += p + logging_output[f"loss_videoaudio_{n}"] = p.item() + + logging_output = { + "loss_video_audio": loss1.item() if reduce else loss1, + **logging_output, + } + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + # corr_m, count_m = compute_correct(logp_m) + if logp_m.numel() == 0: + corr_m, count_m = 0 + else: + corr_m, count_m = (logp_m.argmax(dim=-1)==targ_m_list[i]).sum().item(), len(targ_m_list[i]) + logging_output[f"correct_m_videoaudio_{i}"] = corr_m + logging_output[f"count_m_videoaudio_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + if logp_u.numel() == 0: + corr_u, count_u = 0, 0 + else: + corr_u, count_u = (logp_u.argmax(dim=-1)==targ_u_list[i]).sum().item(), len(targ_u_list[i]) + logging_output[f"correct_u_videoaudio_{i}"] = corr_u + logging_output[f"count_u_videoaudio_{i}"] = count_u + + + if audiotext_sample is not None: + # print("audiotext_sample") + net_output = model(target_list=audiotext_sample["target_list"], targets_phone_list=audiotext_sample["targets_phone_list"], **audiotext_sample["net_input"]) + + loss_m_list = [] + logp_m_list, targ_m_list = net_output['logit_m_list'], net_output['target_m_list'] + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_audiotext_{i}"] = loss_m.detach().item() + + + if self.pred_masked_weight > 0: + loss2 += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list, targ_u_list = net_output['logit_u_list'], net_output['target_u_list'] + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_audiotext_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss2 += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss2 += p + logging_output[f"loss_audiotext_{n}"] = p.item() + + + logging_output = { + "loss_audiotext": loss2.item() if reduce else loss2, + **logging_output, + } + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + # corr_m, count_m = compute_correct(logp_m) + if logp_m.numel() == 0: + corr_m, count_m = 0 + else: + corr_m, count_m = (logp_m.argmax(dim=-1)==targ_m_list[i]).sum().item(), len(targ_m_list[i]) + logging_output[f"correct_m_audiotext_{i}"] = corr_m + logging_output[f"count_m_audiotext_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + if logp_u.numel() == 0: + corr_u, count_u = 0, 0 + else: + corr_u, count_u = (logp_u.argmax(dim=-1)==targ_u_list[i]).sum().item(), len(targ_u_list[i]) + logging_output[f"correct_u_audiotext_{i}"] = corr_u + logging_output[f"count_u_audiotext_{i}"] = count_u + + + if onlytext_sample is not None: + # print("onlytext_sample") + net_output = model(target_list=onlytext_sample["target_list"], extra_text_phone_list=onlytext_sample["extra_text_phone_list"], **onlytext_sample["net_input"]) + + loss_m_list = [] + logp_m_list, targ_m_list = net_output['logit_m_list'], net_output['target_m_list'] + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_onlytext_{i}"] = loss_m.detach().item() + + + if self.pred_masked_weight > 0: + loss3 += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list, targ_u_list = net_output['logit_u_list'], net_output['target_u_list'] + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_onlytext_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss3 += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss3 += p + logging_output[f"loss_onlytext_{n}"] = p.item() + + + logging_output = { + "loss_onlytext": loss3.item() if reduce else loss3, + **logging_output, + } + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + # corr_m, count_m = compute_correct(logp_m) + if logp_m.numel() == 0: + corr_m, count_m = 0 + else: + corr_m, count_m = (logp_m.argmax(dim=-1)==targ_m_list[i]).sum().item(), len(targ_m_list[i]) + logging_output[f"correct_m_onlytext_{i}"] = corr_m + logging_output[f"count_m_onlytext_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + if logp_u.numel() == 0: + corr_u, count_u = 0, 0 + else: + corr_u, count_u = (logp_u.argmax(dim=-1)==targ_u_list[i]).sum().item(), len(targ_u_list[i]) + logging_output[f"correct_u_onlytext_{i}"] = corr_u + logging_output[f"count_u_onlytext_{i}"] = count_u + + + if onlyaudio_sample is not None: + # print("onlytext_sample") + net_output = model(target_list=onlyaudio_sample["target_list"], **onlyaudio_sample["net_input"]) + + loss_m_list = [] + logp_m_list, targ_m_list = net_output['logit_m_list'], net_output['target_m_list'] + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_onlyaudio_{i}"] = loss_m.detach().item() + + + if self.pred_masked_weight > 0: + loss4 += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list, targ_u_list = net_output['logit_u_list'], net_output['target_u_list'] + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_onlyaudio_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss4 += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss4 += p + logging_output[f"loss_onlyaudio_{n}"] = p.item() + + + logging_output = { + "loss_onlyaudio": loss4.item() if reduce else loss4, + **logging_output, + } + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + # corr_m, count_m = compute_correct(logp_m) + if logp_m.numel() == 0: + corr_m, count_m = 0 + else: + corr_m, count_m = (logp_m.argmax(dim=-1)==targ_m_list[i]).sum().item(), len(targ_m_list[i]) + logging_output[f"correct_m_onlyaudio_{i}"] = corr_m + logging_output[f"count_m_onlyaudio_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + if logp_u.numel() == 0: + corr_u, count_u = 0, 0 + else: + corr_u, count_u = (logp_u.argmax(dim=-1)==targ_u_list[i]).sum().item(), len(targ_u_list[i]) + logging_output[f"correct_u_onlyaudio_{i}"] = corr_u + logging_output[f"count_u_onlyaudio_{i}"] = count_u + + + + loss = loss1 + loss2 + self.banlance_loss_weights[0] * loss3 + self.banlance_loss_weights[1] * loss4 + + logging_output = { + "loss": loss.item() if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["videoaudio"]["id"].numel(), + "sample_size": sample_size, + **logging_output, + } + + return loss, sample_size, logging_output + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar("loss", loss_sum / sample_size / math.log(2), sample_size, round=3) + if sample_size != ntokens: + metrics.log_scalar("nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3) + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg)) + else: + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["loss"].avg)) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/VATLM/vat_hubert/vathubert/data/audiohubert_dataset.py b/VATLM/vat_hubert/vathubert/data/audiohubert_dataset.py new file mode 100644 index 0000000..90c2e07 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/data/audiohubert_dataset.py @@ -0,0 +1,509 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import itertools +import logging +import os +import sys +import time +from typing import Any, List, Optional, Union + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils +from fairseq.data.fairseq_dataset import FairseqDataset +# from python_speech_features import logfbank +from scipy.io import wavfile +import kaldiio + +DBG=True if len(sys.argv) == 1 else False + +if DBG: + import utils as custom_utils + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "DEBUG").upper(), + stream=sys.stdout, + ) +else: + from . import utils as custom_utils + +logger = logging.getLogger(__name__) + + +def load_audio(manifest_path, max_keep, min_keep, frame_rate, label_paths, label_rates, tol=0.1): + def is_audio_label_aligned(audio_dur, label_durs): + return all([abs(audio_dur - label_dur)<tol for label_dur in label_durs]) + + n_long, n_short, n_unaligned = 0, 0, 0 + names, inds, sizes = [], [], [] + dur_from_label_list = [] + is_seq_label = any([x==-1 for x in label_rates]) + for label_path, label_rate in zip(label_paths, label_rates): + label_lengths = [len(line.rstrip().split())/label_rate for line in open(label_path).readlines()] + dur_from_label_list.append(label_lengths) + dur_from_label_list = list(zip(*dur_from_label_list)) + + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + sz = int(items[1]) / 640 # + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + elif (not is_seq_label) and (not is_audio_label_aligned(sz/frame_rate, dur_from_label_list[ind])): + n_unaligned += 1 + else: + audio_path = items[0] + names.append(os.path.join(root, audio_path)) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"label_rates={label_rates}, " + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long and {n_unaligned} unaligned, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes + + + +def load_label(label_path, inds, tot): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + +def load_phone_label(tsv, inds, tot): + with open(tsv) as f: + labels = [line.rstrip().split("\t")[-1] for line in f.readlines()[1:]] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +class AudioHubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + phone_sequence_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + single_target: bool = False, + stack_order_audio: int=1, + skip_verify: bool=False, + is_s2s=False, + ): + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + self.audio_root, self.names, inds, tot, self.sizes = load_audio(manifest_path, max_keep_sample_size, min_keep_sample_size, frame_rate=sample_rate, label_paths=label_paths, label_rates=self.label_rates) + self.sample_rate = sample_rate + self.stack_order_audio = stack_order_audio + self.shuffle = shuffle + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.phone_processors = phone_sequence_processors + self.single_target = single_target + self.store_labels = store_labels + self.is_s2s = is_s2s + + assert self.single_target == (self.label_rates[0] == -1), f"single target should be equivalent to sequence label (label_rate==-1)" + if store_labels: + self.label_list = [load_label(p, inds, tot) for p in label_paths] + self.phone_list = [load_phone_label(p, inds, tot) for p in [manifest_path]] + + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot) for p in label_paths + ] + assert ( + label_processors is None + or len(label_processors) == self.num_labels + ) + if not skip_verify: + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths(self.sizes, self.sample_rate, label_path, label_rate, inds, tot) + else: + logger.info(f"Skip label alignment verifying") + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def get_phone(self, index, label_idx): + label = self.phone_list[label_idx][index] + if self.phone_processors is not None: + label = self.phone_processors[label_idx](label) + return label + + def get_phones(self, index): + return [self.get_phone(index, i) for i in range(1)] + + + def load_feature(self, mix_name): + """ + Load audio feature + Returns: + audio_feats: numpy.ndarray of shape [T, F] + """ + def stacker(feats, stack_order): + """ + Concatenating consecutive audio frames + Args: + feats - numpy.ndarray of shape [T, F] + stack_order - int (number of neighboring frames to concatenate + Returns: + feats - numpy.ndarray of shape [T', F'] + """ + feat_dim = feats.shape[1] + if len(feats) % stack_order != 0: + res = stack_order - len(feats) % stack_order + res = np.zeros([res, feat_dim]).astype(feats.dtype) + feats = np.concatenate([feats, res], axis=0) + feats = feats.reshape((-1, stack_order, feat_dim)).reshape(-1, stack_order*feat_dim) + return feats + audio_fn = mix_name + + # sample_rate, wav_data = wavfile.read(audio_fn) + # assert sample_rate == 16_000 and len(wav_data.shape) == 1 + # audio_feats = logfbank(wav_data, samplerate=sample_rate).astype(np.float32) # [T, F] + audio_feats = kaldiio.load_mat(audio_fn).astype(np.float32) + + audio_feats = stacker(audio_feats, self.stack_order_audio) # [T/stack_order_audio, F*stack_order_audio] + return audio_feats + + + def __getitem__(self, index): + audio_feats = self.load_feature(self.names[index]) + audio_feats = torch.from_numpy(audio_feats.astype(np.float32)) + if self.normalize: + with torch.no_grad(): + audio_feats = F.layer_norm(audio_feats, audio_feats.shape[1:]) + labels = self.get_labels(index) + phone_sequence_list = self.get_phones(index) + + + return {"id": index, 'audio_source': audio_feats, "label_list": labels, "phone_sequence_list": phone_sequence_list} + + + def __len__(self): + return len(self.sizes) + + def crop_to_max_size(self, wav, target_size, start=None): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + # longer utterances + if start is None: + start, end = 0, target_size + # if self.random_crop: + # start = np.random.randint(0, diff + 1) + # end = size - diff + start + else: + end = start + target_size + return wav[start:end], start + + def collater(self, samples): + samples = [s for s in samples if s["id"] is not None] + if len(samples) == 0: + return {} + + audio_source = [s["audio_source"] for s in samples] + if audio_source[0] is None: + audio_source = None + if audio_source is not None: + audio_sizes = [len(s) for s in audio_source] + + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + if audio_source is not None: + collated_audios, padding_mask, audio_starts = self.collater_audio(audio_source, audio_size) + else: + collated_audios, audio_starts = None, None + + # B1, D1, T1 = collated_audios.size() + # collated_videos = torch.from_numpy(np.zeros((B1, 1, T1, 88, 88)).astype(np.float32)) + + targets_by_label = [ + [s["label_list"][i] for s in samples] + for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + ############################################################################ + phone_sequence_list = [s["phone_sequence_list"] for s in samples] + if phone_sequence_list[0] is None: + phone_sequence_list = None + + targets_by_phone_label = [ + [s["phone_sequence_list"][i] for s in samples] + for i in range(self.num_labels) + ] + targets_phone_list, lengths_phone_list, ntokens_phone_list = self.collater_phone_label( + targets_by_phone_label, audio_size, audio_starts + ) + + # print("targets_phone_list", targets_phone_list) + ###################################################### + + # source = {"audio": collated_audios, "video": collated_videos} + source = {"audio": collated_audios, "video": None} + net_input = {"source": source, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + if self.is_s2s: + batch['target'], net_input['prev_output_tokens'] = targets_list[0][0], targets_list[0][1] + else: + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + + batch["targets_phone_list"] = targets_phone_list + + return batch + + def collater_audio(self, audios, audio_size, audio_starts=None): + audio_feat_shape = list(audios[0].shape[1:]) + collated_audios = audios[0].new_zeros([len(audios), audio_size]+audio_feat_shape) + padding_mask = ( + torch.BoolTensor(len(audios), audio_size).fill_(False) # + ) + start_known = audio_starts is not None + audio_starts = [0 for _ in audios] if not start_known else audio_starts + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat( + [audio, audio.new_full([-diff]+audio_feat_shape, 0.0)] + ) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size, audio_starts[i] if start_known else None + ) + if len(audios[0].shape) == 2: + collated_audios = collated_audios.transpose(1, 2) # [B, T, F] -> [B, F, T] + else: + collated_audios = collated_audios.permute((0, 4, 1, 2, 3)).contiguous() # [B, T, H, W, C] -> [B, C, T, H, W] + return collated_audios, padding_mask, audio_starts + + def collater_frm_label( + self, targets, audio_size, audio_starts, label_rate, pad + ): + assert label_rate > 0 + s2f = label_rate / self.sample_rate # num label per sample + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s: s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + def collater_frm_phone_label( + self, targets, pad + ): + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + + def collater_seq_label_s2s(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + pad, eos = self.label_processors[0].dictionary.pad(), self.label_processors[0].dictionary.eos() + targets_ = data_utils.collate_tokens(targets, pad_idx=pad, eos_idx=eos, left_pad=False) + prev_output_tokens = data_utils.collate_tokens(targets, pad_idx=pad, eos_idx=eos, left_pad=False, move_eos_to_beginning=True) + return (targets_, prev_output_tokens), lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1: + if self.is_s2s: + targets, lengths, ntokens = self.collater_seq_label_s2s(targets, pad) + else: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + + def collater_phone_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + targets, lengths, ntokens = self.collater_frm_phone_label( + targets, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.sizes[index] + return min(self.sizes[index], self.max_sample_size) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.sizes) + return np.lexsort(order)[::-1] diff --git a/VATLM/vat_hubert/vathubert/data/onlyaudiohubert_dataset.py b/VATLM/vat_hubert/vathubert/data/onlyaudiohubert_dataset.py new file mode 100644 index 0000000..d864f7d --- /dev/null +++ b/VATLM/vat_hubert/vathubert/data/onlyaudiohubert_dataset.py @@ -0,0 +1,436 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import itertools +import logging +import os +import sys +import time +from typing import Any, List, Optional, Union + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils +from fairseq.data.fairseq_dataset import FairseqDataset +from scipy.io import wavfile +import kaldiio + + +DBG=True if len(sys.argv) == 1 else False + +if DBG: + import utils as custom_utils + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "DEBUG").upper(), + stream=sys.stdout, + ) +else: + from . import utils as custom_utils + +logger = logging.getLogger(__name__) + + +def load_audio(manifest_path, max_keep, min_keep, frame_rate, label_paths, label_rates, tol=0.1): + def is_audio_label_aligned(audio_dur, label_durs): + return all([abs(audio_dur - label_dur)<tol for label_dur in label_durs]) + + n_long, n_short, n_unaligned = 0, 0, 0 + names, inds, sizes = [], [], [] + dur_from_label_list = [] + is_seq_label = any([x==-1 for x in label_rates]) + for label_path, label_rate in zip(label_paths, label_rates): + label_lengths = [len(line.rstrip().split())/label_rate for line in open(label_path).readlines()] + dur_from_label_list.append(label_lengths) + dur_from_label_list = list(zip(*dur_from_label_list)) + + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + sz = int(items[1]) / 640 # + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + audio_path = items[0] + names.append(os.path.join(root, audio_path)) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"label_rates={label_rates}, " + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes + + + +def load_label(label_path, inds, tot): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +class OnlyAudioHubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + single_target: bool = False, + stack_order_audio: int=1, + skip_verify: bool=False, + is_s2s=False, + ): + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + self.audio_root, self.names, inds, tot, self.sizes = load_audio(manifest_path, max_keep_sample_size, min_keep_sample_size, frame_rate=sample_rate, label_paths=label_paths, label_rates=self.label_rates) + self.sample_rate = sample_rate + self.stack_order_audio = stack_order_audio + self.shuffle = shuffle + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.single_target = single_target + self.store_labels = store_labels + self.is_s2s = is_s2s + + assert self.single_target == (self.label_rates[0] == -1), f"single target should be equivalent to sequence label (label_rate==-1)" + if store_labels: + self.label_list = [load_label(p, inds, tot) for p in label_paths] + + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot) for p in label_paths + ] + assert ( + label_processors is None + or len(label_processors) == self.num_labels + ) + if not skip_verify: + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths(self.sizes, self.sample_rate, label_path, label_rate, inds, tot) + else: + logger.info(f"Skip label alignment verifying") + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + + def load_feature(self, mix_name): + """ + Load audio feature + Returns: + audio_feats: numpy.ndarray of shape [T, F] + """ + def stacker(feats, stack_order): + """ + Concatenating consecutive audio frames + Args: + feats - numpy.ndarray of shape [T, F] + stack_order - int (number of neighboring frames to concatenate + Returns: + feats - numpy.ndarray of shape [T', F'] + """ + feat_dim = feats.shape[1] + if len(feats) % stack_order != 0: + res = stack_order - len(feats) % stack_order + res = np.zeros([res, feat_dim]).astype(feats.dtype) + feats = np.concatenate([feats, res], axis=0) + feats = feats.reshape((-1, stack_order, feat_dim)).reshape(-1, stack_order*feat_dim) + return feats + audio_fn = mix_name + + audio_feats = kaldiio.load_mat(audio_fn).astype(np.float32) + audio_feats = stacker(audio_feats, self.stack_order_audio) # [T/stack_order_audio, F*stack_order_audio] + return audio_feats + + + def __getitem__(self, index): + audio_feats = self.load_feature(self.names[index]) + audio_feats = torch.from_numpy(audio_feats.astype(np.float32)) + if self.normalize: + with torch.no_grad(): + audio_feats = F.layer_norm(audio_feats, audio_feats.shape[1:]) + labels = self.get_labels(index) + + + return {"id": index, 'audio_source': audio_feats, "label_list": labels} + + + def __len__(self): + return len(self.sizes) + + def crop_to_max_size(self, wav, target_size, start=None): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + # longer utterances + if start is None: + start, end = 0, target_size + # if self.random_crop: + # start = np.random.randint(0, diff + 1) + # end = size - diff + start + else: + end = start + target_size + return wav[start:end], start + + def collater(self, samples): + samples = [s for s in samples if s["id"] is not None] + if len(samples) == 0: + return {} + + audio_source = [s["audio_source"] for s in samples] + if audio_source[0] is None: + audio_source = None + if audio_source is not None: + audio_sizes = [len(s) for s in audio_source] + + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + if audio_source is not None: + collated_audios, padding_mask, audio_starts = self.collater_audio(audio_source, audio_size) + else: + collated_audios, audio_starts = None, None + + targets_by_label = [ + [s["label_list"][i] for s in samples] + for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + source = {"audio": collated_audios, "video": None} + net_input = {"source": source, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + if self.is_s2s: + batch['target'], net_input['prev_output_tokens'] = targets_list[0][0], targets_list[0][1] + else: + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + + return batch + + def collater_audio(self, audios, audio_size, audio_starts=None): + audio_feat_shape = list(audios[0].shape[1:]) + collated_audios = audios[0].new_zeros([len(audios), audio_size]+audio_feat_shape) + padding_mask = ( + torch.BoolTensor(len(audios), audio_size).fill_(False) # + ) + start_known = audio_starts is not None + audio_starts = [0 for _ in audios] if not start_known else audio_starts + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat( + [audio, audio.new_full([-diff]+audio_feat_shape, 0.0)] + ) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size, audio_starts[i] if start_known else None + ) + if len(audios[0].shape) == 2: + collated_audios = collated_audios.transpose(1, 2) # [B, T, F] -> [B, F, T] + else: + collated_audios = collated_audios.permute((0, 4, 1, 2, 3)).contiguous() # [B, T, H, W, C] -> [B, C, T, H, W] + return collated_audios, padding_mask, audio_starts + + def collater_frm_label( + self, targets, audio_size, audio_starts, label_rate, pad + ): + assert label_rate > 0 + s2f = label_rate / self.sample_rate # num label per sample + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s: s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + + def collater_seq_label_s2s(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + pad, eos = self.label_processors[0].dictionary.pad(), self.label_processors[0].dictionary.eos() + targets_ = data_utils.collate_tokens(targets, pad_idx=pad, eos_idx=eos, left_pad=False) + prev_output_tokens = data_utils.collate_tokens(targets, pad_idx=pad, eos_idx=eos, left_pad=False, move_eos_to_beginning=True) + return (targets_, prev_output_tokens), lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1: + if self.is_s2s: + targets, lengths, ntokens = self.collater_seq_label_s2s(targets, pad) + else: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.sizes[index] + return min(self.sizes[index], self.max_sample_size) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.sizes) + return np.lexsort(order)[::-1] diff --git a/VATLM/vat_hubert/vathubert/data/texthubert_dataset.py b/VATLM/vat_hubert/vathubert/data/texthubert_dataset.py new file mode 100644 index 0000000..d5701df --- /dev/null +++ b/VATLM/vat_hubert/vathubert/data/texthubert_dataset.py @@ -0,0 +1,300 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import itertools +import logging +import os +import sys +import time +from typing import Any, List, Optional, Union + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils +from fairseq.data.fairseq_dataset import FairseqDataset + +DBG=True if len(sys.argv) == 1 else False + +if DBG: + import utils as custom_utils + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "DEBUG").upper(), + stream=sys.stdout, + ) +else: + from . import utils as custom_utils + +logger = logging.getLogger(__name__) + + +def load_text(manifest_path, max_keep, min_keep, frame_rate, label_paths, label_rates, tol=0.1): + + n_long, n_short, n_unaligned = 0, 0, 0 + names, inds, sizes = [], [], [] + dur_from_label_list = [] + + with open(manifest_path) as f: + for ind, line in enumerate(f): + items = line.strip().split("\t") + frames = items[0] + sz = int(frames) + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + else: + inds.append(ind) + sizes.append(sz) + + logger.info( + ( + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(inds)}, skipped {n_short} short and {n_long} long" + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + + return inds, sizes + + +def load_label(label_path, inds): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + labels = [labels[i] for i in inds] + return labels + +def load_phone_label(tsv, inds): + with open(tsv) as f: + labels = [line.rstrip() for line in f.readlines()] + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + + +class TextHubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + phone_sequence_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + single_target: bool = False, + stack_order_audio: int=1, + skip_verify: bool=False, + is_s2s=False, + ): + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + inds, self.sizes = load_text(manifest_path, max_keep_sample_size, min_keep_sample_size, frame_rate=sample_rate, label_paths=label_paths, label_rates=self.label_rates) + self.sample_rate = sample_rate + self.stack_order_audio = stack_order_audio + self.shuffle = shuffle + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.phone_processors = phone_sequence_processors + self.single_target = single_target + self.store_labels = store_labels + self.is_s2s = is_s2s + + + if store_labels: + self.label_list = [load_label(p, inds) for p in label_paths] + self.phone_list = [load_phone_label(p, inds) for p in [manifest_path]] + + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds) for p in label_paths + ] + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def get_phone(self, index, label_idx): + label = self.phone_list[label_idx][index] + if self.phone_processors is not None: + label = self.phone_processors[label_idx](label) + return label + + def get_phones(self, index): + return [self.get_phone(index, i) for i in range(1)] + + + def __getitem__(self, index): + labels = self.get_labels(index) + phone_sequence_list = self.get_phones(index) + + + return {"id": index, "label_list": labels, "phone_sequence_list": phone_sequence_list} + + + def __len__(self): + return len(self.sizes) + + + def collater(self, samples): + samples = [s for s in samples if s["id"] is not None] + if len(samples) == 0: + return {} + + targets_by_label = [ + [s["label_list"][i] for s in samples] + for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, + ) + + phone_sequence_list = [s["phone_sequence_list"] for s in samples] + if phone_sequence_list[0] is None: + phone_sequence_list = None + + targets_by_phone_label = [ + [s["phone_sequence_list"][i] for s in samples] + for i in range(self.num_labels) + ] + targets_phone_list, lengths_phone_list, ntokens_phone_list = self.collater_phone_label( + targets_by_phone_label, + ) + + net_input = {"source": None} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + if self.is_s2s: + batch['target'], net_input['prev_output_tokens'] = targets_list[0][0], targets_list[0][1] + else: + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + + batch["extra_text_phone_list"] = targets_phone_list + + return batch + + def collater_frm_label( + self, targets, label_rate, pad + ): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + + def collater_frm_phone_label( + self, targets, pad + ): + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + def collater_label(self, targets_by_label,): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + targets, lengths, ntokens = self.collater_frm_label( + targets, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + + def collater_phone_label(self, targets_by_label): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + targets, lengths, ntokens = self.collater_frm_phone_label( + targets, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.sizes[index] + return min(self.sizes[index], self.max_sample_size) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.sizes) + return np.lexsort(order)[::-1] diff --git a/VATLM/vat_hubert/vathubert/data/utils.py b/VATLM/vat_hubert/vathubert/data/utils.py new file mode 100644 index 0000000..6665003 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/data/utils.py @@ -0,0 +1,300 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- +import cv2 +import torch +import random +import numpy as np +from typing import Dict, List, Optional, Tuple + +def load_video(path): + for i in range(3): + try: + cap = cv2.VideoCapture(path) + frames = [] + while True: + ret, frame = cap.read() + if ret: + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + frames.append(frame) + else: + break + frames = np.stack(frames) + return frames + except Exception: + print(f"failed loading {path} ({i} / 3)") + if i == 2: + raise ValueError(f"Unable to load {path}") + + +class Compose(object): + """Compose several preprocess together. + Args: + preprocess (list of ``Preprocess`` objects): list of preprocess to compose. + """ + + def __init__(self, preprocess): + self.preprocess = preprocess + + def __call__(self, sample): + for t in self.preprocess: + sample = t(sample) + return sample + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.preprocess: + format_string += '\n' + format_string += ' {0}'.format(t) + format_string += '\n)' + return format_string + + +class Normalize(object): + """Normalize a ndarray image with mean and standard deviation. + """ + + def __init__(self, mean, std): + self.mean = mean + self.std = std + + def __call__(self, frames): + """ + Args: + tensor (Tensor): Tensor image of size (C, H, W) to be normalized. + Returns: + Tensor: Normalized Tensor image. + """ + frames = (frames - self.mean) / self.std + return frames + + def __repr__(self): + return self.__class__.__name__+'(mean={0}, std={1})'.format(self.mean, self.std) + +class CenterCrop(object): + """Crop the given image at the center + """ + def __init__(self, size): + self.size = size + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be cropped. + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + th, tw = self.size + delta_w = int(round((w - tw))/2.) + delta_h = int(round((h - th))/2.) + frames = frames[:, delta_h:delta_h+th, delta_w:delta_w+tw] + return frames + + +class RandomCrop(object): + """Crop the given image at the center + """ + + def __init__(self, size): + self.size = size + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be cropped. + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + th, tw = self.size + delta_w = random.randint(0, w-tw) + delta_h = random.randint(0, h-th) + frames = frames[:, delta_h:delta_h+th, delta_w:delta_w+tw] + return frames + + def __repr__(self): + return self.__class__.__name__ + '(size={0})'.format(self.size) + +class HorizontalFlip(object): + """Flip image horizontally. + """ + + def __init__(self, flip_ratio): + self.flip_ratio = flip_ratio + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be flipped with a probability flip_ratio + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + if random.random() < self.flip_ratio: + for index in range(t): + frames[index] = cv2.flip(frames[index], 1) + return frames + +def compute_mask_indices( + shape: Tuple[int, int], + padding_mask: Optional[torch.Tensor], + mask_prob: float, + mask_length: int, + mask_type: str = "static", + mask_other: float = 0.0, + min_masks: int = 0, + no_overlap: bool = False, + min_space: int = 0, +) -> np.ndarray: + """ + Computes random mask spans for a given shape + Args: + shape: the the shape for which to compute masks. + should be of size 2 where first element is batch size and 2nd is timesteps + padding_mask: optional padding mask of the same size as shape, which will prevent masking padded elements + mask_prob: probability for each token to be chosen as start of the span to be masked. this will be multiplied by + number of timesteps divided by length of mask span to mask approximately this percentage of all elements. + however due to overlaps, the actual number will be smaller (unless no_overlap is True) + mask_type: how to compute mask lengths + static = fixed size + uniform = sample from uniform distribution [mask_other, mask_length*2] + normal = sample from normal distribution with mean mask_length and stdev mask_other. mask is min 1 element + poisson = sample from possion distribution with lambda = mask length + min_masks: minimum number of masked spans + no_overlap: if false, will switch to an alternative recursive algorithm that prevents spans from overlapping + min_space: only used if no_overlap is True, this is how many elements to keep unmasked between spans + """ + + bsz, all_sz = shape + mask = np.full((bsz, all_sz), False) + + all_num_mask = int( + # add a random number for probabilistic rounding + mask_prob * all_sz / float(mask_length) + + np.random.rand() + ) + + all_num_mask = max(min_masks, all_num_mask) + + mask_idcs = [] + for i in range(bsz): + if padding_mask is not None: + sz = all_sz - padding_mask[i].long().sum().item() + num_mask = int( + # add a random number for probabilistic rounding + mask_prob * sz / float(mask_length) + + np.random.rand() + ) + num_mask = max(min_masks, num_mask) + else: + sz = all_sz + num_mask = all_num_mask + + if mask_type == "static": + lengths = np.full(num_mask, mask_length) + elif mask_type == "uniform": + lengths = np.random.randint(mask_other, mask_length * 2 + 1, size=num_mask) + elif mask_type == "normal": + lengths = np.random.normal(mask_length, mask_other, size=num_mask) + lengths = [max(1, int(round(x))) for x in lengths] + elif mask_type == "poisson": + lengths = np.random.poisson(mask_length, size=num_mask) + lengths = [int(round(x)) for x in lengths] + else: + raise Exception("unknown mask selection " + mask_type) + + if sum(lengths) == 0: + lengths[0] = min(mask_length, sz - 1) + + if no_overlap: + mask_idc = [] + + def arrange(s, e, length, keep_length): + span_start = np.random.randint(s, e - length) + mask_idc.extend(span_start + i for i in range(length)) + + new_parts = [] + if span_start - s - min_space >= keep_length: + new_parts.append((s, span_start - min_space + 1)) + if e - span_start - keep_length - min_space > keep_length: + new_parts.append((span_start + length + min_space, e)) + return new_parts + + parts = [(0, sz)] + min_length = min(lengths) + for length in sorted(lengths, reverse=True): + lens = np.fromiter( + (e - s if e - s >= length + min_space else 0 for s, e in parts), + np.int, + ) + l_sum = np.sum(lens) + if l_sum == 0: + break + probs = lens / np.sum(lens) + c = np.random.choice(len(parts), p=probs) + s, e = parts.pop(c) + parts.extend(arrange(s, e, length, min_length)) + mask_idc = np.asarray(mask_idc) + else: + min_len = min(lengths) + if sz - min_len <= num_mask: + min_len = sz - num_mask - 1 + + mask_idc = np.random.choice(sz - min_len, num_mask, replace=False) + + mask_idc = np.asarray( + [ + mask_idc[j] + offset + for j in range(len(mask_idc)) + for offset in range(lengths[j]) + ] + ) + + mask_idcs.append(np.unique(mask_idc[mask_idc < sz])) + + min_len = min([len(m) for m in mask_idcs]) + batch_indexes, starts, ends = [], [], [] + for i, mask_idc in enumerate(mask_idcs): + if len(mask_idc) > min_len: + mask_idc = np.random.choice(mask_idc, min_len, replace=False) + mask[i, mask_idc] = True + vals, run_starts, run_lengths = find_runs(mask[i]) + start_indices, lengths = run_starts[vals == True], run_lengths[vals == True] + starts.append(start_indices) + ends.append(start_indices+lengths) + batch_indexes.append(np.zeros([len(start_indices)])+i) + return mask, np.concatenate(starts).astype(np.int64), np.concatenate(ends).astype(np.int64), np.concatenate(batch_indexes).astype(np.int64) + +def find_runs(x): + """Find runs of consecutive items in an array.""" + + # ensure array + x = np.asanyarray(x) + if x.ndim != 1: + raise ValueError('only 1D array supported') + n = x.shape[0] + + # handle empty array + if n == 0: + return np.array([]), np.array([]), np.array([]) + + else: + # find run starts + loc_run_start = np.empty(n, dtype=bool) + loc_run_start[0] = True + np.not_equal(x[:-1], x[1:], out=loc_run_start[1:]) + run_starts = np.nonzero(loc_run_start)[0] + + # find run values + run_values = x[loc_run_start] + + # find run lengths + run_lengths = np.diff(np.append(run_starts, n)) + + return run_values, run_starts, run_lengths diff --git a/VATLM/vat_hubert/vathubert/data/vathubert_dataset.py b/VATLM/vat_hubert/vathubert/data/vathubert_dataset.py new file mode 100644 index 0000000..f1cf093 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/data/vathubert_dataset.py @@ -0,0 +1,530 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import itertools +import logging +import os +import sys +import time +from typing import Any, List, Optional, Union + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils +from fairseq.data.fairseq_dataset import FairseqDataset +from scipy.io import wavfile +import kaldiio + +DBG=True if len(sys.argv) == 1 else False + +if DBG: + import utils as custom_utils + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "DEBUG").upper(), + stream=sys.stdout, + ) +else: + from . import utils as custom_utils + +logger = logging.getLogger(__name__) + + +def load_audio_visual(manifest_path, max_keep, min_keep, frame_rate, label_paths, label_rates, tol=0.1): + def is_audio_label_aligned(audio_dur, label_durs): + return all([abs(audio_dur - label_dur)<tol for label_dur in label_durs]) + + n_long, n_short, n_unaligned = 0, 0, 0 + names, inds, sizes = [], [], [] + dur_from_label_list = [] + is_seq_label = any([x==-1 for x in label_rates]) + for label_path, label_rate in zip(label_paths, label_rates): + label_lengths = [len(line.rstrip().split())/label_rate for line in open(label_path).readlines()] + dur_from_label_list.append(label_lengths) + dur_from_label_list = list(zip(*dur_from_label_list)) + + with open(manifest_path) as f: + root = f.readline().strip() + for ind, line in enumerate(f): + items = line.strip().split("\t") + sz = int(items[-2]) # + if min_keep is not None and sz < min_keep: + n_short += 1 + elif max_keep is not None and sz > max_keep: + n_long += 1 + elif (not is_seq_label) and (not is_audio_label_aligned(sz/frame_rate, dur_from_label_list[ind])): + n_unaligned += 1 + else: + video_path = items[1] + audio_path = items[2] + audio_id = items[0] + names.append((video_path, audio_path+','+audio_id)) + inds.append(ind) + sizes.append(sz) + tot = ind + 1 + logger.info( + ( + f"label_rates={label_rates}, " + f"max_keep={max_keep}, min_keep={min_keep}, " + f"loaded {len(names)}, skipped {n_short} short and {n_long} long and {n_unaligned} unaligned, " + f"longest-loaded={max(sizes)}, shortest-loaded={min(sizes)}" + ) + ) + return root, names, inds, tot, sizes + +def load_label(label_path, inds, tot): + with open(label_path) as f: + labels = [line.rstrip() for line in f] + assert ( + len(labels) == tot + ), f"number of labels does not match ({len(labels)} != {tot})" + labels = [labels[i] for i in inds] + return labels + + +def load_label_offset(label_path, inds, tot): + with open(label_path) as f: + code_lengths = [len(line.encode("utf-8")) for line in f] + assert ( + len(code_lengths) == tot + ), f"number of labels does not match ({len(code_lengths)} != {tot})" + offsets = list(itertools.accumulate([0] + code_lengths)) + offsets = [(offsets[i], offsets[i + 1]) for i in inds] + return offsets + + +def verify_label_lengths( + audio_sizes, + audio_rate, + label_path, + label_rate, + inds, + tot, + tol=0.1, # tolerance in seconds +): + if label_rate < 0: + logger.info(f"{label_path} is sequence label. skipped") + return + + with open(label_path) as f: + lengths = [len(line.rstrip().split()) for line in f] + assert len(lengths) == tot + lengths = [lengths[i] for i in inds] + num_invalid = 0 + for i, ind in enumerate(inds): + dur_from_audio = audio_sizes[i] / audio_rate + dur_from_label = lengths[i] / label_rate + if abs(dur_from_audio - dur_from_label) > tol: + logger.warning( + ( + f"audio and label duration differ too much " + f"(|{dur_from_audio} - {dur_from_label}| > {tol}) " + f"in line {ind+1} of {label_path}. Check if `label_rate` " + f"is correctly set (currently {label_rate}). " + f"num. of samples = {audio_sizes[i]}; " + f"label length = {lengths[i]}" + ) + ) + num_invalid += 1 + if num_invalid > 0: + logger.warning( + f"total {num_invalid} (audio, label) pairs with mismatched lengths" + ) + + +class VATHubertDataset(FairseqDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + stack_order_audio: int=1, + skip_verify: bool=False, + image_mean: float=0, + image_std: float=1, + image_crop_size: int=88, + image_aug: bool=False, + modalities: Optional[List[str]]=None, + is_s2s=False, + noise_fn=None, + noise_prob=0, + noise_snr=0, + noise_num=1 + ): + self.label_rates = ( + [label_rates for _ in range(len(label_paths))] + if isinstance(label_rates, int) + else label_rates + ) + self.modalities = set(modalities) + self.audio_root, self.names, inds, tot, self.sizes = load_audio_visual(manifest_path, max_keep_sample_size, min_keep_sample_size, frame_rate=sample_rate, label_paths=label_paths, label_rates=self.label_rates) + self.sample_rate = sample_rate + self.stack_order_audio = stack_order_audio + self.shuffle = shuffle + self.random_crop = random_crop + + self.num_labels = len(label_paths) + self.pad_list = pad_list + self.eos_list = eos_list + self.label_processors = label_processors + self.single_target = single_target + self.store_labels = store_labels + self.is_s2s = is_s2s + self.noise_wav, self.noise_prob, self.noise_snr, self.noise_num = [ln.strip() for ln in open(noise_fn).readlines()] if noise_fn is not None else [], noise_prob, noise_snr, noise_num + + assert self.single_target == (self.label_rates[0] == -1), f"single target should be equivalent to sequence label (label_rate==-1)" + if store_labels: + self.label_list = [load_label(p, inds, tot) for p in label_paths] + else: + self.label_paths = label_paths + self.label_offsets_list = [ + load_label_offset(p, inds, tot) for p in label_paths + ] + assert ( + label_processors is None + or len(label_processors) == self.num_labels + ) + if not skip_verify: + for label_path, label_rate in zip(label_paths, self.label_rates): + verify_label_lengths(self.sizes, self.sample_rate, label_path, label_rate, inds, tot) + else: + logger.info(f"Skip label alignment verifying") + + self.max_sample_size = ( + max_sample_size if max_sample_size is not None else sys.maxsize + ) + self.pad_audio = pad_audio + self.normalize = normalize + if image_aug: + self.transform = custom_utils.Compose([ + custom_utils.Normalize( 0.0,255.0 ), + custom_utils.RandomCrop((image_crop_size, image_crop_size)), + custom_utils.HorizontalFlip(0.5), + custom_utils.Normalize(image_mean, image_std) ]) + else: + self.transform = custom_utils.Compose([ + custom_utils.Normalize( 0.0,255.0 ), + custom_utils.CenterCrop((image_crop_size, image_crop_size)), + custom_utils.Normalize(image_mean, image_std) ]) + logger.info(f"image transform: {self.transform}") + + logger.info( + f"pad_audio={pad_audio}, random_crop={random_crop}, " + f"normalize={normalize}, max_sample_size={self.max_sample_size}, " + f"seqs2seq data={self.is_s2s},") + logger.info( + f"Noise wav: {noise_fn}->{len(self.noise_wav)} wav, Prob: {self.noise_prob}, SNR: {self.noise_snr}, Number of mixture: {self.noise_num}" + ) + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def get_labels(self, index): + return [self.get_label(index, i) for i in range(self.num_labels)] + + def load_feature(self, mix_name): + """ + Load image and audio feature + Returns: + video_feats: numpy.ndarray of shape [T, H, W, 1], audio_feats: numpy.ndarray of shape [T, F] + """ + def stacker(feats, stack_order): + """ + Concatenating consecutive audio frames + Args: + feats - numpy.ndarray of shape [T, F] + stack_order - int (number of neighboring frames to concatenate + Returns: + feats - numpy.ndarray of shape [T', F'] + """ + feat_dim = feats.shape[1] + if len(feats) % stack_order != 0: + res = stack_order - len(feats) % stack_order + res = np.zeros([res, feat_dim]).astype(feats.dtype) + feats = np.concatenate([feats, res], axis=0) + feats = feats.reshape((-1, stack_order, feat_dim)).reshape(-1, stack_order*feat_dim) + return feats + video_fn, audio_fn = mix_name + if 'video' in self.modalities: + video_feats = self.load_video(video_fn) # [T, H, W, 1] + else: + video_feats = None + if 'audio' in self.modalities: + audio_fn = audio_fn.split(',')[0] + audio_feats = kaldiio.load_mat(audio_fn).astype(np.float32) + + audio_feats = stacker(audio_feats, self.stack_order_audio) # [T/stack_order_audio, F*stack_order_audio] + else: + audio_feats = None + if audio_feats is not None and video_feats is not None: + diff = len(audio_feats) - len(video_feats) + if diff < 0: + audio_feats = np.concatenate([audio_feats, np.zeros([-diff, audio_feats.shape[-1]], dtype=audio_feats.dtype)]) + elif diff > 0: + audio_feats = audio_feats[:-diff] + return video_feats, audio_feats + + def load_video(self, audio_name): + feats = custom_utils.load_video(os.path.join(self.audio_root, audio_name)) + feats = self.transform(feats) + feats = np.expand_dims(feats, axis=-1) + return feats + + def select_noise(self): + rand_indexes = np.random.randint(0, len(self.noise_wav), size=self.noise_num) + noise_wav = [] + for x in rand_indexes: + noise_wav.append(wavfile.read(self.noise_wav[x])[1].astype(np.float32)) + if self.noise_num == 1: + return noise_wav[0] + else: + min_len = min([len(x) for x in noise_wav]) + noise_wav = [x[:min_len] for x in noise_wav] + noise_wav = np.floor(np.stack(noise_wav).mean(axis=0)) + return noise_wav + + def add_noise(self, clean_wav): + clean_wav = clean_wav.astype(np.float32) + noise_wav = self.select_noise() + if type(self.noise_snr) == int or type(self.noise_snr) == float: + snr = self.noise_snr + elif type(self.noise_snr) == tuple: + snr = np.random.randint(self.noise_snr[0], self.noise_snr[1]+1) + clean_rms = np.sqrt(np.mean(np.square(clean_wav), axis=-1)) + if len(clean_wav) > len(noise_wav): + ratio = int(np.ceil(len(clean_wav)/len(noise_wav))) + noise_wav = np.concatenate([noise_wav for _ in range(ratio)]) + if len(clean_wav) < len(noise_wav): + start = 0 + noise_wav = noise_wav[start: start + len(clean_wav)] + noise_rms = np.sqrt(np.mean(np.square(noise_wav), axis=-1)) + adjusted_noise_rms = clean_rms / (10**(snr/20)) + adjusted_noise_wav = noise_wav * (adjusted_noise_rms / noise_rms) + mixed = clean_wav + adjusted_noise_wav + + #Avoid clipping noise + max_int16 = np.iinfo(np.int16).max + min_int16 = np.iinfo(np.int16).min + if mixed.max(axis=0) > max_int16 or mixed.min(axis=0) < min_int16: + if mixed.max(axis=0) >= abs(mixed.min(axis=0)): + reduction_rate = max_int16 / mixed.max(axis=0) + else : + reduction_rate = min_int16 / mixed.min(axis=0) + mixed = mixed * (reduction_rate) + mixed = mixed.astype(np.int16) + return mixed + + def __getitem__(self, index): + video_feats, audio_feats = self.load_feature(self.names[index]) + audio_feats, video_feats = torch.from_numpy(audio_feats.astype(np.float32)) if audio_feats is not None else None, torch.from_numpy(video_feats.astype(np.float32)) if video_feats is not None else None + if self.normalize and 'audio' in self.modalities: + with torch.no_grad(): + audio_feats = F.layer_norm(audio_feats, audio_feats.shape[1:]) + labels = self.get_labels(index) + fid = self.names[index][1].split(':')[1] + return {"id": index, 'fid': fid, "video_source": video_feats, 'audio_source': audio_feats, "label_list": labels} + + def __len__(self): + return len(self.sizes) + + def crop_to_max_size(self, wav, target_size, start=None): + size = len(wav) + diff = size - target_size + if diff <= 0: + return wav, 0 + # longer utterances + if start is None: + start, end = 0, target_size + if self.random_crop: + start = np.random.randint(0, diff + 1) + end = size - diff + start + else: + end = start + target_size + return wav[start:end], start + + def collater(self, samples): + samples = [s for s in samples if s["id"] is not None] + if len(samples) == 0: + return {} + + audio_source, video_source = [s["audio_source"] for s in samples], [s["video_source"] for s in samples] + if audio_source[0] is None: + audio_source = None + if video_source[0] is None: + video_source = None + if audio_source is not None: + audio_sizes = [len(s) for s in audio_source] + else: + audio_sizes = [len(s) for s in video_source] + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + if audio_source is not None: + collated_audios, padding_mask, audio_starts = self.collater_audio(audio_source, audio_size) + else: + collated_audios, audio_starts = None, None + if video_source is not None: + collated_videos, padding_mask, audio_starts = self.collater_audio(video_source, audio_size, audio_starts) + else: + collated_videos = None + targets_by_label = [ + [s["label_list"][i] for s in samples] + for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + source = {"audio": collated_audios, "video": collated_videos} + net_input = {"source": source, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "utt_id": [s['fid'] for s in samples] + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + if self.is_s2s: + batch['target'], net_input['prev_output_tokens'] = targets_list[0][0], targets_list[0][1] + else: + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch + + def collater_audio(self, audios, audio_size, audio_starts=None): + audio_feat_shape = list(audios[0].shape[1:]) + collated_audios = audios[0].new_zeros([len(audios), audio_size]+audio_feat_shape) + padding_mask = ( + torch.BoolTensor(len(audios), audio_size).fill_(False) # + ) + start_known = audio_starts is not None + audio_starts = [0 for _ in audios] if not start_known else audio_starts + for i, audio in enumerate(audios): + diff = len(audio) - audio_size + if diff == 0: + collated_audios[i] = audio + elif diff < 0: + assert self.pad_audio + collated_audios[i] = torch.cat( + [audio, audio.new_full([-diff]+audio_feat_shape, 0.0)] + ) + padding_mask[i, diff:] = True + else: + collated_audios[i], audio_starts[i] = self.crop_to_max_size( + audio, audio_size, audio_starts[i] if start_known else None + ) + if len(audios[0].shape) == 2: + collated_audios = collated_audios.transpose(1, 2) # [B, T, F] -> [B, F, T] + else: + collated_audios = collated_audios.permute((0, 4, 1, 2, 3)).contiguous() # [B, T, H, W, C] -> [B, C, T, H, W] + return collated_audios, padding_mask, audio_starts + + def collater_frm_label( + self, targets, audio_size, audio_starts, label_rate, pad + ): + assert label_rate > 0 + s2f = label_rate / self.sample_rate # num label per sample + frm_starts = [int(round(s * s2f)) for s in audio_starts] + frm_size = int(round(audio_size * s2f)) + if not self.pad_audio: + rem_size = [len(t) - s for t, s in zip(targets, frm_starts)] + frm_size = min(frm_size, *rem_size) + targets = [t[s: s + frm_size] for t, s in zip(targets, frm_starts)] + logger.debug(f"audio_starts={audio_starts}") + logger.debug(f"frame_starts={frm_starts}") + logger.debug(f"frame_size={frm_size}") + + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + def collater_seq_label(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + targets = data_utils.collate_tokens( + targets, pad_idx=pad, left_pad=False + ) + return targets, lengths, ntokens + + def collater_seq_label_s2s(self, targets, pad): + lengths = torch.LongTensor([len(t) for t in targets]) + ntokens = lengths.sum().item() + pad, eos = self.label_processors[0].dictionary.pad(), self.label_processors[0].dictionary.eos() + targets_ = data_utils.collate_tokens(targets, pad_idx=pad, eos_idx=eos, left_pad=False) + prev_output_tokens = data_utils.collate_tokens(targets, pad_idx=pad, eos_idx=eos, left_pad=False, move_eos_to_beginning=True) + return (targets_, prev_output_tokens), lengths, ntokens + + def collater_label(self, targets_by_label, audio_size, audio_starts): + targets_list, lengths_list, ntokens_list = [], [], [] + itr = zip(targets_by_label, self.label_rates, self.pad_list) + for targets, label_rate, pad in itr: + if label_rate == -1: + if self.is_s2s: + targets, lengths, ntokens = self.collater_seq_label_s2s(targets, pad) + else: + targets, lengths, ntokens = self.collater_seq_label(targets, pad) + else: + targets, lengths, ntokens = self.collater_frm_label( + targets, audio_size, audio_starts, label_rate, pad + ) + targets_list.append(targets) + lengths_list.append(lengths) + ntokens_list.append(ntokens) + return targets_list, lengths_list, ntokens_list + + def num_tokens(self, index): + return self.size(index) + + def size(self, index): + if self.pad_audio: + return self.sizes[index] + return min(self.sizes[index], self.max_sample_size) + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + + order.append(self.sizes) + return np.lexsort(order)[::-1] diff --git a/VATLM/vat_hubert/vathubert/decode_avhubert_lrs3.sh b/VATLM/vat_hubert/vathubert/decode_avhubert_lrs3.sh new file mode 100644 index 0000000..867fb7a --- /dev/null +++ b/VATLM/vat_hubert/vathubert/decode_avhubert_lrs3.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +decode_path=/path/to/finetuned_model +finetuned_model=checkpoint_best.pt +beam=50 +data=$1 +[ -z $data ] && data="test" + +python -B infer_s2s.py --config-dir /path/to/vat_hubert/vathubert/conf/ --config-name s2s_decode.yaml \ + dataset.gen_subset=${data} common_eval.path=${decode_path}/checkpoints/${finetuned_model} \ + common_eval.results_path=${decode_path}/${finetuned_model}_${data}_video_beam${beam} \ + override.modalities=["video"] \ + common.user_dir=/path/to/vat_hubert/vathubert \ + override.data=/path/to/data \ + override.label_dir=/path/to/data \ + generation.beam=${beam} + diff --git a/VATLM/vat_hubert/vathubert/infer_s2s.py b/VATLM/vat_hubert/vathubert/infer_s2s.py new file mode 100644 index 0000000..d86d5ec --- /dev/null +++ b/VATLM/vat_hubert/vathubert/infer_s2s.py @@ -0,0 +1,321 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import ast +from itertools import chain +import logging +import math +import os +import sys +import json +import hashlib +import editdistance +from argparse import Namespace + +import numpy as np +import torch +from fairseq import checkpoint_utils, options, tasks, utils, distributed_utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.logging import progress_bar +from fairseq.logging.meters import StopwatchMeter, TimeMeter +from fairseq.models import FairseqLanguageModel +from omegaconf import DictConfig + +from pathlib import Path +import hydra +from hydra.core.config_store import ConfigStore +from fairseq.dataclass.configs import ( + CheckpointConfig, + CommonConfig, + CommonEvalConfig, + DatasetConfig, + DistributedTrainingConfig, + GenerationConfig, + FairseqDataclass, +) +from dataclasses import dataclass, field, is_dataclass +from typing import Any, Dict, List, Optional, Tuple, Union +from omegaconf import OmegaConf + +logging.root.setLevel(logging.INFO) +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +config_path = Path(__file__).resolve().parent / "conf" + +@dataclass +class OverrideConfig(FairseqDataclass): + noise_wav: Optional[str] = field(default=None, metadata={'help': 'noise wav file'}) + noise_prob: float = field(default=0, metadata={'help': 'noise probability'}) + noise_snr: float = field(default=0, metadata={'help': 'noise SNR in audio'}) + modalities: List[str] = field(default_factory=lambda: [""], metadata={'help': 'which modality to use'}) + data: Optional[str] = field(default=None, metadata={'help': 'path to test data directory'}) + label_dir: Optional[str] = field(default=None, metadata={'help': 'path to test label directory'}) + +@dataclass +class InferConfig(FairseqDataclass): + task: Any = None + generation: GenerationConfig = GenerationConfig() + common: CommonConfig = CommonConfig() + common_eval: CommonEvalConfig = CommonEvalConfig() + checkpoint: CheckpointConfig = CheckpointConfig() + distributed_training: DistributedTrainingConfig = DistributedTrainingConfig() + dataset: DatasetConfig = DatasetConfig() + override: OverrideConfig = OverrideConfig() + is_ax: bool = field( + default=False, + metadata={ + "help": "if true, assumes we are using ax for tuning and returns a tuple for ax to consume" + }, + ) + + +def main(cfg: DictConfig): + + if isinstance(cfg, Namespace): + cfg = convert_namespace_to_omegaconf(cfg) + + assert cfg.common_eval.path is not None, "--path required for recognition!" + assert ( + not cfg.generation.sampling or cfg.generation.nbest == cfg.generation.beam + ), "--sampling requires --nbest to be equal to --beam" + + if cfg.common_eval.results_path is not None: + os.makedirs(cfg.common_eval.results_path, exist_ok=True) + output_path = os.path.join(cfg.common_eval.results_path, "decode.log") + with open(output_path, "w", buffering=1, encoding="utf-8") as h: + return _main(cfg, h) + return _main(cfg, sys.stdout) + + +def get_symbols_to_strip_from_output(generator): + if hasattr(generator, "symbols_to_strip_from_output"): + return generator.symbols_to_strip_from_output + else: + return {generator.eos, generator.pad} + +def _main(cfg, output_file): + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=output_file, + ) + logger = logging.getLogger("hybrid.speech_recognize") + if output_file is not sys.stdout: # also print to stdout + logger.addHandler(logging.StreamHandler(sys.stdout)) + + utils.import_user_module(cfg.common) + models, saved_cfg, task = checkpoint_utils.load_model_ensemble_and_task([cfg.common_eval.path]) + models = [model.eval().cuda() for model in models] + saved_cfg.task.modalities = cfg.override.modalities + task = tasks.setup_task(saved_cfg.task) + + task.build_tokenizer(saved_cfg.tokenizer) + task.build_bpe(saved_cfg.bpe) + + logger.info(cfg) + + # Fix seed for stochastic decoding + if cfg.common.seed is not None and not cfg.generation.no_seed_provided: + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + use_cuda = torch.cuda.is_available() + + # Set dictionary + dictionary = task.target_dictionary + + # loading the dataset should happen after the checkpoint has been loaded so we can give it the saved task config + task.cfg.noise_prob = cfg.override.noise_prob + task.cfg.noise_snr = cfg.override.noise_snr + task.cfg.noise_wav = cfg.override.noise_wav + if cfg.override.data is not None: + task.cfg.data = cfg.override.data + if cfg.override.label_dir is not None: + task.cfg.label_dir = cfg.override.label_dir + task.load_dataset(cfg.dataset.gen_subset, task_cfg=saved_cfg.task) + + lms = [None] + + # Optimize ensemble for generation + for model in chain(models, lms): + if model is None: + continue + if cfg.common.fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + # Load dataset (possibly sharded) + itr = task.get_batch_iterator( + dataset=task.dataset(cfg.dataset.gen_subset), + max_tokens=cfg.dataset.max_tokens, + max_sentences=cfg.dataset.batch_size, + max_positions=utils.resolve_max_positions( + task.max_positions(), *[m.max_positions() for m in models] + ), + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.dataset.required_batch_size_multiple, + seed=cfg.common.seed, + num_shards=cfg.distributed_training.distributed_world_size, + shard_id=cfg.distributed_training.distributed_rank, + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + # Initialize generator + if cfg.generation.match_source_len: + logger.warning( + "The option match_source_len is not applicable to speech recognition. Ignoring it." + ) + gen_timer = StopwatchMeter() + extra_gen_cls_kwargs = { + "lm_model": lms[0], + "lm_weight": cfg.generation.lm_weight, + } + cfg.generation.score_reference = False # + save_attention_plot = cfg.generation.print_alignment is not None + cfg.generation.print_alignment = None # + generator = task.build_generator( + models, cfg.generation, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + def decode_fn(x): + symbols_ignore = get_symbols_to_strip_from_output(generator) + symbols_ignore.add(dictionary.pad()) + if hasattr(task.datasets[cfg.dataset.gen_subset].label_processors[0], 'decode'): + return task.datasets[cfg.dataset.gen_subset].label_processors[0].decode(x, symbols_ignore) + chars = dictionary.string(x, extra_symbols_to_ignore=symbols_ignore) + words = " ".join("".join(chars.split()).replace('|', ' ').split()) + return words + + num_sentences = 0 + has_target = True + wps_meter = TimeMeter() + result_dict = {'utt_id': [], 'ref': [], 'hypo': []} + for sample in progress: + sample = utils.move_to_cuda(sample) if use_cuda else sample + if "net_input" not in sample: + continue + + prefix_tokens = None + if cfg.generation.prefix_size > 0: + prefix_tokens = sample["target"][:, : cfg.generation.prefix_size] + + constraints = None + if "constraints" in sample: + constraints = sample["constraints"] + + gen_timer.start() + hypos = task.inference_step( + generator, + models, + sample, + prefix_tokens=prefix_tokens, + constraints=constraints, + ) + num_generated_tokens = sum(len(h[0]["tokens"]) for h in hypos) + gen_timer.stop(num_generated_tokens) + + for i in range(len(sample["id"])): + result_dict['utt_id'].append(sample['utt_id'][i]) + ref_sent = decode_fn(sample['target'][i].int().cpu()) + result_dict['ref'].append(ref_sent) + best_hypo = hypos[i][0]['tokens'].int().cpu() + hypo_str = decode_fn(best_hypo) + result_dict['hypo'].append(hypo_str) + logger.info(f"\nREF:{ref_sent}\nHYP:{hypo_str}\n") + wps_meter.update(num_generated_tokens) + progress.log({"wps": round(wps_meter.avg)}) + num_sentences += sample["nsentences"] if "nsentences" in sample else sample["id"].numel() + + logger.info("NOTE: hypothesis and token scores are output in base 2") + logger.info("Recognized {:,} utterances ({} tokens) in {:.1f}s ({:.2f} sentences/s, {:.2f} tokens/s)".format( + num_sentences, gen_timer.n, gen_timer.sum, num_sentences / gen_timer.sum, 1. / gen_timer.avg)) + + yaml_str = OmegaConf.to_yaml(cfg.generation) + fid = int(hashlib.md5(yaml_str.encode("utf-8")).hexdigest(), 16) + fid = fid % 1000000 + result_fn = f"{cfg.common_eval.results_path}/hypo-{fid}.json" + json.dump(result_dict, open(result_fn, 'w'), indent=4) + n_err, n_total = 0, 0 + assert len(result_dict['hypo']) == len(result_dict['ref']) + for hypo, ref in zip(result_dict['hypo'], result_dict['ref']): + hypo, ref = hypo.strip().split(), ref.strip().split() + n_err += editdistance.eval(hypo, ref) + n_total += len(ref) + wer = 100 * n_err / n_total + wer_fn = f"{cfg.common_eval.results_path}/wer.{fid}" + with open(wer_fn, "w") as fo: + fo.write(f"WER: {wer}\n") + fo.write(f"err / num_ref_words = {n_err} / {n_total}\n\n") + fo.write(f"{yaml_str}") + logger.info(f"WER: {wer}%") + return + + +@hydra.main(config_path=config_path, config_name="infer") +def hydra_main(cfg: InferConfig) -> Union[float, Tuple[float, Optional[float]]]: + container = OmegaConf.to_container(cfg, resolve=True, enum_to_str=True) + cfg = OmegaConf.create(container) + OmegaConf.set_struct(cfg, True) + + if cfg.common.reset_logging: + reset_logging() + + wer = float("inf") + + try: + if cfg.common.profile: + with torch.cuda.profiler.profile(): + with torch.autograd.profiler.emit_nvtx(): + distributed_utils.call_main(cfg, main) + else: + distributed_utils.call_main(cfg, main) + + except BaseException as e: # pylint: disable=broad-except + if not cfg.common.suppress_crashes: + raise + else: + logger.error("Crashed! %s", str(e)) + return + + +def cli_main() -> None: + try: + from hydra._internal.utils import ( + get_args, + ) # pylint: disable=import-outside-toplevel + + cfg_name = get_args().config_name or "infer" + except ImportError: + logger.warning("Failed to get config name from hydra args") + cfg_name = "infer" + + cs = ConfigStore.instance() + cs.store(name=cfg_name, node=InferConfig) + + for k in InferConfig.__dataclass_fields__: + if is_dataclass(InferConfig.__dataclass_fields__[k].type): + v = InferConfig.__dataclass_fields__[k].default + cs.store(name=k, node=v) + + hydra_main() # pylint: disable=no-value-for-parameter + + +if __name__ == "__main__": + cli_main() diff --git a/VATLM/vat_hubert/vathubert/models/decoder.py b/VATLM/vat_hubert/vathubert/models/decoder.py new file mode 100644 index 0000000..481842b --- /dev/null +++ b/VATLM/vat_hubert/vathubert/models/decoder.py @@ -0,0 +1,246 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +from argparse import Namespace +import contextlib +import copy +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from dataclasses import dataclass, field +from omegaconf import MISSING, II, open_dict +from typing import Any, Optional + +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.tasks import FairseqTask +from fairseq.models import ( + BaseFairseqModel, + FairseqEncoder, + FairseqEncoderDecoderModel, + FairseqIncrementalDecoder, + register_model, +) +# from fairseq.models.wav2vec.wav2vec2 import MASKING_DISTRIBUTION_CHOICES +from fairseq.modules import ( + LayerNorm, + PositionalEmbedding, + TransformerDecoderLayer, +) + + +class TransformerDecoder(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *args.decoder_layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg, + dictionary, + embed_tokens, + no_encoder_attn=False, + ): + super().__init__(dictionary) + + self.dropout = cfg.decoder_dropout + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = cfg.decoder_embed_dim + self.output_embed_dim = cfg.decoder_embed_dim + + self.layerdrop = cfg.decoder_layerdrop + + padding_idx = embed_tokens.padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens = embed_tokens + # self.embed_scale = math.sqrt(embed_dim) # todo: try with input_embed_dim + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + + self.embed_positions = ( + PositionalEmbedding( + cfg.max_target_positions, + embed_dim, + padding_idx, + learned=cfg.decoder_learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + + # TODO: update this when transformer gets converted to dataclass configs + transformer_cfg = copy.deepcopy(cfg) + # with open_dict(transformer_cfg): + transformer_cfg.dropout = transformer_cfg.decoder_dropout + transformer_cfg.attention_dropout = ( + transformer_cfg.decoder_attention_dropout + ) + transformer_cfg.activation_dropout = ( + transformer_cfg.decoder_activation_dropout + ) + + self.layers = nn.ModuleList([]) + self.layers.extend( + [ + TransformerDecoderLayer(transformer_cfg, no_encoder_attn) + for _ in range(transformer_cfg.decoder_layers) + ] + ) + + if not self.share_input_output_embed: + self.embed_out = nn.Parameter( + torch.Tensor(len(dictionary), self.output_embed_dim) + ) + nn.init.normal_(self.embed_out, mean=0, std=self.output_embed_dim ** -0.5) + + if transformer_cfg.decoder_normalize_before: + self.layer_norm = LayerNorm(embed_dim) + else: + self.layer_norm = None + + def forward( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **unused + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (Tensor, optional): output from the encoder, used for + encoder-side attention + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + prev_output_tokens = prev_output_tokens.long() + x, extra = self.extract_features( + prev_output_tokens, encoder_out, incremental_state + ) + x = self.output_layer(x) + return x, extra + + def extract_features( + self, prev_output_tokens, encoder_out=None, incremental_state=None, **unused + ): + """ + Similar to *forward* but only return features. + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + + # embed positions + positions = ( + self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + if self.embed_positions is not None + else None + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + attn = None + + inner_states = [x] + + # decoder layers + for layer in self.layers: + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, attn, _ = layer( + x, + encoder_out["encoder_out"] if encoder_out is not None else None, + encoder_out["padding_mask"] if encoder_out is not None else None, + incremental_state, + self_attn_mask=self.buffered_future_mask(x) + if incremental_state is None + else None, + ) + inner_states.append(x) + + if self.layer_norm: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + return x, {"attn": attn, "inner_states": inner_states} + + def output_layer(self, features, **kwargs): + """Project features to the vocabulary size.""" + # project back to size of vocabulary + emb_mat = self.embed_tokens.weight if self.share_input_output_embed else self.embed_out + return torch.matmul(features, emb_mat.transpose(0, 1)) + # if self.share_input_output_embed: + # return F.linear(features, self.embed_tokens.weight) + # else: + # return F.linear(features, self.embed_out) + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + if ( + not hasattr(self, "_future_mask") + or self._future_mask is None + or self._future_mask.device != tensor.device + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(tensor.new(dim, dim)), 1 + ) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + diff --git a/VATLM/vat_hubert/vathubert/models/resnet.py b/VATLM/vat_hubert/vathubert/models/resnet.py new file mode 100644 index 0000000..4e9436f --- /dev/null +++ b/VATLM/vat_hubert/vathubert/models/resnet.py @@ -0,0 +1,172 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import math +import torch.nn as nn +import pdb + + +logger = logging.getLogger(__name__) + +def conv3x3(in_planes, out_planes, stride=1): + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=1, bias=False) + + +def downsample_basic_block( inplanes, outplanes, stride ): + return nn.Sequential( + nn.Conv2d(inplanes, outplanes, kernel_size=1, stride=stride, bias=False), + nn.BatchNorm2d(outplanes), + ) + +def downsample_basic_block_v2( inplanes, outplanes, stride ): + return nn.Sequential( + nn.AvgPool2d(kernel_size=stride, stride=stride, ceil_mode=True, count_include_pad=False), + nn.Conv2d(inplanes, outplanes, kernel_size=1, stride=1, bias=False), + nn.BatchNorm2d(outplanes), + ) + + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None, relu_type = 'relu' ): + super(BasicBlock, self).__init__() + + assert relu_type in ['relu','prelu'] + + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = nn.BatchNorm2d(planes) + + if relu_type == 'relu': + self.relu1 = nn.ReLU(inplace=True) + self.relu2 = nn.ReLU(inplace=True) + elif relu_type == 'prelu': + self.relu1 = nn.PReLU(num_parameters=planes) + self.relu2 = nn.PReLU(num_parameters=planes) + else: + raise Exception('relu type not implemented') + + self.conv2 = conv3x3(planes, planes) + self.bn2 = nn.BatchNorm2d(planes) + + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + out = self.conv1(x) + out = self.bn1(out) + out = self.relu1(out) + out = self.conv2(out) + out = self.bn2(out) + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu2(out) + + return out + + +class ResNet(nn.Module): + + def __init__(self, block, layers, num_classes=1000, relu_type = 'relu', gamma_zero = False, avg_pool_downsample = False): + self.inplanes = 64 + self.relu_type = relu_type + self.gamma_zero = gamma_zero + self.downsample_block = downsample_basic_block_v2 if avg_pool_downsample else downsample_basic_block + + super(ResNet, self).__init__() + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4 = self._make_layer(block, 512, layers[3], stride=2) + self.avgpool = nn.AdaptiveAvgPool2d(1) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + m.weight.data.normal_(0, math.sqrt(2. / n)) + elif isinstance(m, nn.BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + + if self.gamma_zero: + for m in self.modules(): + if isinstance(m, BasicBlock ): + m.bn2.weight.data.zero_() + + def _make_layer(self, block, planes, blocks, stride=1): + + + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = self.downsample_block( inplanes = self.inplanes, + outplanes = planes * block.expansion, + stride = stride ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample, relu_type = self.relu_type)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes, relu_type = self.relu_type)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + x = self.avgpool(x) + x = x.view(x.size(0), -1) + return x + +class ResEncoder(nn.Module): + def __init__(self, relu_type, weights): + super(ResEncoder, self).__init__() + self.frontend_nout = 64 + self.backend_out = 512 + frontend_relu = nn.PReLU(num_parameters=self.frontend_nout) if relu_type == 'prelu' else nn.ReLU() + self.frontend3D = nn.Sequential( + nn.Conv3d(1, self.frontend_nout, kernel_size=(5, 7, 7), stride=(1, 2, 2), padding=(2, 3, 3), bias=False), + nn.BatchNorm3d(self.frontend_nout), + frontend_relu, + nn.MaxPool3d( kernel_size=(1, 3, 3), stride=(1, 2, 2), padding=(0, 1, 1))) + self.trunk = ResNet(BasicBlock, [2, 2, 2, 2], relu_type=relu_type) + if weights is not None: + logger.info(f"Load {weights} for resnet") + std = torch.load(weights, map_location=torch.device('cpu'))['model_state_dict'] + frontend_std, trunk_std = OrderedDict(), OrderedDict() + for key, val in std.items(): + new_key = '.'.join(key.split('.')[1:]) + if 'frontend3D' in key: + frontend_std[new_key] = val + if 'trunk' in key: + trunk_std[new_key] = val + self.frontend3D.load_state_dict(frontend_std) + self.trunk.load_state_dict(trunk_std) + + def forward(self, x): + B, C, T, H, W = x.size() + x = self.frontend3D(x) + Tnew = x.shape[2] + x = self.threeD_to_2D_tensor(x) + x = self.trunk(x) + x = x.view(B, Tnew, x.size(1)) + x = x.transpose(1, 2).contiguous() + return x + + def threeD_to_2D_tensor(self, x): + n_batch, n_channels, s_time, sx, sy = x.shape + x = x.transpose(1, 2).contiguous() + return x.reshape(n_batch*s_time, n_channels, sx, sy) diff --git a/VATLM/vat_hubert/vathubert/models/utils.py b/VATLM/vat_hubert/vathubert/models/utils.py new file mode 100644 index 0000000..b04a5e6 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/models/utils.py @@ -0,0 +1,301 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import cv2 +import torch +import random +import numpy as np +from typing import Dict, List, Optional, Tuple + +def load_video(path): + for i in range(3): + try: + cap = cv2.VideoCapture(path) + frames = [] + while True: + ret, frame = cap.read() + if ret: + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + frames.append(frame) + else: + break + frames = np.stack(frames) + return frames + except Exception: + print(f"failed loading {path} ({i} / 3)") + if i == 2: + raise ValueError(f"Unable to load {path}") + + +class Compose(object): + """Compose several preprocess together. + Args: + preprocess (list of ``Preprocess`` objects): list of preprocess to compose. + """ + + def __init__(self, preprocess): + self.preprocess = preprocess + + def __call__(self, sample): + for t in self.preprocess: + sample = t(sample) + return sample + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.preprocess: + format_string += '\n' + format_string += ' {0}'.format(t) + format_string += '\n)' + return format_string + + +class Normalize(object): + """Normalize a ndarray image with mean and standard deviation. + """ + + def __init__(self, mean, std): + self.mean = mean + self.std = std + + def __call__(self, frames): + """ + Args: + tensor (Tensor): Tensor image of size (C, H, W) to be normalized. + Returns: + Tensor: Normalized Tensor image. + """ + frames = (frames - self.mean) / self.std + return frames + + def __repr__(self): + return self.__class__.__name__+'(mean={0}, std={1})'.format(self.mean, self.std) + +class CenterCrop(object): + """Crop the given image at the center + """ + def __init__(self, size): + self.size = size + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be cropped. + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + th, tw = self.size + delta_w = int(round((w - tw))/2.) + delta_h = int(round((h - th))/2.) + frames = frames[:, delta_h:delta_h+th, delta_w:delta_w+tw] + return frames + + +class RandomCrop(object): + """Crop the given image at the center + """ + + def __init__(self, size): + self.size = size + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be cropped. + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + th, tw = self.size + delta_w = random.randint(0, w-tw) + delta_h = random.randint(0, h-th) + frames = frames[:, delta_h:delta_h+th, delta_w:delta_w+tw] + return frames + + def __repr__(self): + return self.__class__.__name__ + '(size={0})'.format(self.size) + +class HorizontalFlip(object): + """Flip image horizontally. + """ + + def __init__(self, flip_ratio): + self.flip_ratio = flip_ratio + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be flipped with a probability flip_ratio + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + if random.random() < self.flip_ratio: + for index in range(t): + frames[index] = cv2.flip(frames[index], 1) + return frames + +def compute_mask_indices( + shape: Tuple[int, int], + padding_mask: Optional[torch.Tensor], + mask_prob: float, + mask_length: int, + mask_type: str = "static", + mask_other: float = 0.0, + min_masks: int = 0, + no_overlap: bool = False, + min_space: int = 0, +) -> np.ndarray: + """ + Computes random mask spans for a given shape + Args: + shape: the the shape for which to compute masks. + should be of size 2 where first element is batch size and 2nd is timesteps + padding_mask: optional padding mask of the same size as shape, which will prevent masking padded elements + mask_prob: probability for each token to be chosen as start of the span to be masked. this will be multiplied by + number of timesteps divided by length of mask span to mask approximately this percentage of all elements. + however due to overlaps, the actual number will be smaller (unless no_overlap is True) + mask_type: how to compute mask lengths + static = fixed size + uniform = sample from uniform distribution [mask_other, mask_length*2] + normal = sample from normal distribution with mean mask_length and stdev mask_other. mask is min 1 element + poisson = sample from possion distribution with lambda = mask length + min_masks: minimum number of masked spans + no_overlap: if false, will switch to an alternative recursive algorithm that prevents spans from overlapping + min_space: only used if no_overlap is True, this is how many elements to keep unmasked between spans + """ + + bsz, all_sz = shape + mask = np.full((bsz, all_sz), False) + + all_num_mask = int( + # add a random number for probabilistic rounding + mask_prob * all_sz / float(mask_length) + + np.random.rand() + ) + + all_num_mask = max(min_masks, all_num_mask) + + mask_idcs = [] + for i in range(bsz): + if padding_mask is not None: + sz = all_sz - padding_mask[i].long().sum().item() + num_mask = int( + # add a random number for probabilistic rounding + mask_prob * sz / float(mask_length) + + np.random.rand() + ) + num_mask = max(min_masks, num_mask) + else: + sz = all_sz + num_mask = all_num_mask + + if mask_type == "static": + lengths = np.full(num_mask, mask_length) + elif mask_type == "uniform": + lengths = np.random.randint(mask_other, mask_length * 2 + 1, size=num_mask) + elif mask_type == "normal": + lengths = np.random.normal(mask_length, mask_other, size=num_mask) + lengths = [max(1, int(round(x))) for x in lengths] + elif mask_type == "poisson": + lengths = np.random.poisson(mask_length, size=num_mask) + lengths = [int(round(x)) for x in lengths] + else: + raise Exception("unknown mask selection " + mask_type) + + if sum(lengths) == 0: + lengths[0] = min(mask_length, sz - 1) + + if no_overlap: + mask_idc = [] + + def arrange(s, e, length, keep_length): + span_start = np.random.randint(s, e - length) + mask_idc.extend(span_start + i for i in range(length)) + + new_parts = [] + if span_start - s - min_space >= keep_length: + new_parts.append((s, span_start - min_space + 1)) + if e - span_start - keep_length - min_space > keep_length: + new_parts.append((span_start + length + min_space, e)) + return new_parts + + parts = [(0, sz)] + min_length = min(lengths) + for length in sorted(lengths, reverse=True): + lens = np.fromiter( + (e - s if e - s >= length + min_space else 0 for s, e in parts), + np.int, + ) + l_sum = np.sum(lens) + if l_sum == 0: + break + probs = lens / np.sum(lens) + c = np.random.choice(len(parts), p=probs) + s, e = parts.pop(c) + parts.extend(arrange(s, e, length, min_length)) + mask_idc = np.asarray(mask_idc) + else: + min_len = min(lengths) + if sz - min_len <= num_mask: + min_len = sz - num_mask - 1 + + mask_idc = np.random.choice(sz - min_len, num_mask, replace=False) + + mask_idc = np.asarray( + [ + mask_idc[j] + offset + for j in range(len(mask_idc)) + for offset in range(lengths[j]) + ] + ) + + mask_idcs.append(np.unique(mask_idc[mask_idc < sz])) + + min_len = min([len(m) for m in mask_idcs]) + batch_indexes, starts, ends = [], [], [] + for i, mask_idc in enumerate(mask_idcs): + if len(mask_idc) > min_len: + mask_idc = np.random.choice(mask_idc, min_len, replace=False) + mask[i, mask_idc] = True + vals, run_starts, run_lengths = find_runs(mask[i]) + start_indices, lengths = run_starts[vals == True], run_lengths[vals == True] + starts.append(start_indices) + ends.append(start_indices+lengths) + batch_indexes.append(np.zeros([len(start_indices)])+i) + return mask, np.concatenate(starts).astype(np.int64), np.concatenate(ends).astype(np.int64), np.concatenate(batch_indexes).astype(np.int64) + +def find_runs(x): + """Find runs of consecutive items in an array.""" + + # ensure array + x = np.asanyarray(x) + if x.ndim != 1: + raise ValueError('only 1D array supported') + n = x.shape[0] + + # handle empty array + if n == 0: + return np.array([]), np.array([]), np.array([]) + + else: + # find run starts + loc_run_start = np.empty(n, dtype=bool) + loc_run_start[0] = True + np.not_equal(x[:-1], x[1:], out=loc_run_start[1:]) + run_starts = np.nonzero(loc_run_start)[0] + + # find run values + run_values = x[loc_run_start] + + # find run lengths + run_lengths = np.diff(np.append(run_starts, n)) + + return run_values, run_starts, run_lengths diff --git a/VATLM/vat_hubert/vathubert/models/vathubert.py b/VATLM/vat_hubert/vathubert/models/vathubert.py new file mode 100644 index 0000000..a172b4a --- /dev/null +++ b/VATLM/vat_hubert/vathubert/models/vathubert.py @@ -0,0 +1,851 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import os,sys +import logging +from typing import Dict, List, Optional, Tuple + +import numpy as np + +import torch +import torch.nn as nn +from dataclasses import dataclass, field +from fairseq import utils +from fairseq.data.data_utils import compute_mask_indices +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.models import BaseFairseqModel, register_model +from fairseq.models.wav2vec.wav2vec2 import ( + ConvFeatureExtractionModel, + TransformerEncoder, +) +from fairseq.modules import GradMultiply, LayerNorm +from copy import deepcopy + +DBG=True if len(sys.argv) == 1 else False + +if DBG: + from vathubert.tasks.vathubert_pretraining import ( + VATHubertPretrainingConfig, + VATHubertPretrainingTask, + ) + from resnet import ResEncoder + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=sys.stdout, + ) + from utils import compute_mask_indices + from decoder import TransformerDecoder + +else: + from vathubert.tasks.vathubert_pretraining import ( + VATHubertPretrainingConfig, + VATHubertPretrainingTask, + ) + from vathubert.models.resnet import ResEncoder + from vathubert.models.utils import compute_mask_indices + from vathubert.models.decoder import TransformerDecoder + +from omegaconf import II + +logger = logging.getLogger(__name__) + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum( + ["static", "uniform", "normal", "poisson"] +) + + +@dataclass +class VATHubertConfig(FairseqDataclass): + label_rate: int = II("task.label_rate") + modalities: str = II("task.modalities") + extractor_mode: EXTRACTOR_MODE_CHOICES = field( + default="default", + metadata={ + "help": "mode for feature extractor. default has a single group " + "norm with d groups in the first conv block, whereas layer_norm " + "has layer norms in every block (meant to use with normalize=True)" + }, + ) + encoder_layers: int = field( + default=12, metadata={"help": "num encoder layers in the transformer"} + ) + encoder_embed_dim: int = field( + default=768, metadata={"help": "encoder embedding dimension"} + ) + encoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "encoder embedding dimension for FFN"} + ) + encoder_attention_heads: int = field( + default=12, metadata={"help": "num encoder attention heads"} + ) + activation_fn: ChoiceEnum(utils.get_available_activation_fns()) = field( + default="gelu", metadata={"help": "activation function to use"} + ) + + # dropouts + dropout: float = field( + default=0.1, + metadata={"help": "dropout probability for the transformer"}, + ) + attention_dropout: float = field( + default=0.1, + metadata={"help": "dropout probability for attention weights"}, + ) + activation_dropout: float = field( + default=0.0, + metadata={"help": "dropout probability after activation in FFN"}, + ) + encoder_layerdrop: float = field( + default=0.0, + metadata={"help": "probability of dropping a tarnsformer layer"}, + ) + dropout_input: float = field( + default=0.0, + metadata={"help": "dropout to apply to the input (after feat extr)"}, + ) + dropout_features: float = field( + default=0.0, + metadata={ + "help": "dropout to apply to the features (after feat extr)" + }, + ) + + final_dim: int = field( + default=0, + metadata={ + "help": "project final representations and targets to this many " + "dimensions. set to encoder_embed_dim is <= 0" + }, + ) + untie_final_proj: bool = field( + default=False, + metadata={"help": "use separate projection for each target"}, + ) + layer_norm_first: bool = field( + default=False, + metadata={"help": "apply layernorm first in the transformer"}, + ) + conv_feature_layers: str = field( + default="[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2", + metadata={ + "help": "string describing convolutional feature extraction " + "layers in form of a python list that contains " + "[(dim, kernel_size, stride), ...]" + }, + ) + conv_bias: bool = field( + default=False, metadata={"help": "include bias in conv encoder"} + ) + logit_temp: float = field( + default=0.1, metadata={"help": "temperature to divide logits by"} + ) + target_glu: bool = field( + default=False, metadata={"help": "adds projection + glu to targets"} + ) + feature_grad_mult: float = field( + default=1.0, + metadata={"help": "multiply feature extractor var grads by this"}, + ) + + # masking + mask_length_audio: int = field(default=10, metadata={"help": "mask length"}) + mask_prob_audio: float = field( + default=0.65, + metadata={"help": "probability of replacing a token with mask"}, + ) + mask_length_image: int = field(default=10, metadata={"help": "mask length"}) + mask_prob_image: float = field( + default=0.65, + metadata={"help": "probability of replacing a token with mask"}, + ) + mask_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", metadata={"help": "how to choose mask length"} + ) + mask_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indicesh" + }, + ) + no_mask_overlap: bool = field( + default=False, metadata={"help": "whether to allow masks to overlap"} + ) + mask_min_space: int = field( + default=1, + metadata={ + "help": "min space between spans (if no overlap is enabled)" + }, + ) + + # channel masking + mask_channel_length: int = field( + default=10, + metadata={"help": "length of the mask for features (channels)"}, + ) + mask_channel_prob: float = field( + default=0.0, + metadata={"help": "probability of replacing a feature with 0"}, + ) + mask_channel_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", + metadata={"help": "how to choose mask length for channel masking"}, + ) + mask_channel_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indicesh" + }, + ) + no_mask_channel_overlap: bool = field( + default=False, + metadata={"help": "whether to allow channel masks to overlap"}, + ) + mask_channel_min_space: int = field( + default=1, + metadata={ + "help": "min space between spans (if no overlap is enabled)" + }, + ) + + # positional embeddings + conv_pos: int = field( + default=128, + metadata={ + "help": "number of filters for convolutional positional embeddings" + }, + ) + conv_pos_groups: int = field( + default=16, + metadata={ + "help": "number of groups for convolutional positional embedding" + }, + ) + + latent_temp: Tuple[float, float, float] = field( + default=(2, 0.5, 0.999995), + metadata={"help": "legacy (to be removed)"}, + ) + + # loss computation + skip_masked: bool = field( + default=False, + metadata={"help": "skip computing losses over masked frames"}, + ) + skip_nomask: bool = field( + default=False, + metadata={"help": "skip computing losses over unmasked frames"}, + ) + resnet_relu_type: str = field(default='prelu', metadata={"help": 'relu type for resnet'}) + resnet_weights: Optional[str] = field(default=None, metadata={"help": 'resnet weights'}) + sim_type: str = field(default='cosine', metadata={"help": 'similarity type'}) + + sub_encoder_layers: int = field(default=0, metadata={'help': 'number of transformer layers for single modality'}) + audio_feat_dim: int = field(default=-1, metadata={'help': 'audio feature dimension'}) + modality_dropout: float = field(default=0, metadata={'help': 'drop one modality'}) + audio_dropout: float = field(default=0, metadata={'help': 'drop audio feature'}) + modality_fuse: str = field(default='concat', metadata={'help': 'fusing two modalities: add,concat'}) + selection_type : str = field(default='same_other_seq', metadata={'help': 'type of selectig images, same_other_seq: replace masked span with span from another sequence, same_seq: repace masked span with span of the same sequence'}) + masking_type : str = field(default='input', metadata={'help': 'input or feature masking'}) + + decoder_embed_dim: int = field( + default=768, metadata={"help": "decoder embedding dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_layers: int = field( + default=6, metadata={"help": "num of decoder layers"} + ) + decoder_layerdrop: float = field( + default=0.0, metadata={"help": "decoder layerdrop chance"} + ) + decoder_attention_heads: int = field( + default=4, metadata={"help": "num decoder attention heads"} + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "use learned positional embeddings in the decoder"}, + ) + decoder_normalize_before: bool = field( + default=False, + metadata={"help": "apply layernorm before each decoder block"}, + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={ + "help": "if set, disables positional embeddings " + "(outside self attention)" + }, + ) + decoder_dropout: float = field( + default=0.1, metadata={"help": "dropout probability in the decoder"} + ) + decoder_attention_dropout: float = field( + default=0.1, + metadata={ + "help": "dropout probability for attention weights " + "inside the decoder" + }, + ) + decoder_activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN " + "inside the decoder" + }, + ) + max_target_positions: int = field( + default=2048, metadata={"help": "max target positions"} + ) + share_decoder_input_output_embed: bool = field( + default=False, + metadata={"help": "share decoder input and output embeddings"}, + ) + no_scale_embedding: bool = field(default=True, metadata={'help': 'scale embedding'}) + +class SubModel(nn.Module): + def __init__(self, resnet=None, input_dim=None, cfg=None): + super().__init__() + self.resnet = resnet + self.proj = nn.Linear(input_dim, cfg.encoder_embed_dim) + self.encoder = TransformerEncoder(cfg) if cfg.encoder_layers > 0 else None + + def forward(self, x): + if self.resnet is not None: + x = self.resnet(x) + x = self.proj(x.transpose(1, 2)) + if self.encoder is not None: + x = self.encoder(x)[0].transpose(1, 2) + else: + x = x.transpose(1, 2) + return x + +@register_model("vat_hubert", dataclass=VATHubertConfig) +class VATHubertModel(BaseFairseqModel): + def __init__( + self, + cfg: VATHubertConfig, + task_cfg: VATHubertPretrainingConfig, + dictionaries: List[Dictionary], + **kwargs + ) -> None: + super().__init__() + logger.info(f"HubertModel Config: {cfg}") + + feature_ds_rate = 1 + self.feat2tar_ratio = cfg.label_rate * feature_ds_rate / task_cfg.sample_rate + sub_cfg = deepcopy(cfg) + sub_cfg.encoder_layers = sub_cfg.sub_encoder_layers + resnet = ResEncoder(relu_type=cfg.resnet_relu_type, weights=cfg.resnet_weights) + self.feature_extractor_audio = SubModel(resnet=None, input_dim=cfg.audio_feat_dim, cfg=sub_cfg) + self.feature_extractor_video = SubModel(resnet=resnet, input_dim=resnet.backend_out, cfg=sub_cfg) + self.modality_dropout, self.audio_dropout = cfg.modality_dropout, cfg.audio_dropout + self.modality_fuse = cfg.modality_fuse + self.encoder_embed_dim = cfg.encoder_embed_dim + if self.modality_fuse == 'concat': + self.embed = cfg.encoder_embed_dim * 3 + elif self.modality_fuse == 'add': + self.embed = cfg.encoder_embed_dim + self.post_extract_proj = ( + nn.Linear(self.embed, cfg.encoder_embed_dim) + if self.embed != cfg.encoder_embed_dim + else None + ) + + self.mask_prob_image, self.mask_prob_audio = cfg.mask_prob_image, cfg.mask_prob_audio + self.mask_selection = cfg.mask_selection + self.mask_other = cfg.mask_other + self.mask_length_image, self.mask_length_audio = cfg.mask_length_image, cfg.mask_length_audio + self.no_mask_overlap = cfg.no_mask_overlap + self.mask_min_space = cfg.mask_min_space + + self.mask_channel_prob = cfg.mask_channel_prob + self.mask_channel_selection = cfg.mask_channel_selection + self.mask_channel_other = cfg.mask_channel_other + self.mask_channel_length = cfg.mask_channel_length + self.no_mask_channel_overlap = cfg.no_mask_channel_overlap + self.mask_channel_min_space = cfg.mask_channel_min_space + + self.dropout_input = nn.Dropout(cfg.dropout_input) + self.dropout_features = nn.Dropout(cfg.dropout_features) + + self.feature_grad_mult = cfg.feature_grad_mult + self.logit_temp = cfg.logit_temp + self.skip_masked = cfg.skip_masked + self.skip_nomask = cfg.skip_nomask + self.sim_type = cfg.sim_type + self.selection_type = cfg.selection_type + self.masking_type = cfg.masking_type + + final_dim = ( + cfg.final_dim if cfg.final_dim > 0 else cfg.encoder_embed_dim + ) + + self.mask_emb = nn.Parameter( + torch.FloatTensor(cfg.audio_feat_dim).uniform_() if self.masking_type == 'input' else torch.FloatTensor(cfg.encoder_embed_dim).uniform_() + ) + + self.encoder = TransformerEncoder(cfg) + self.layer_norm = LayerNorm(self.embed) + + self.target_glu = None + if cfg.target_glu: + self.target_glu = nn.Sequential( + nn.Linear(final_dim, final_dim * 2), nn.GLU() + ) + + self.untie_final_proj = cfg.untie_final_proj + if self.untie_final_proj: + self.final_proj = nn.Linear( + cfg.encoder_embed_dim, final_dim * len(dictionaries) + ) + else: + self.final_proj = nn.Linear(cfg.encoder_embed_dim, final_dim) + + # modules below are not needed during fine-tuning + if any([d is None for d in dictionaries]): + logger.info( + "cannot find dictionary. assume will be used for fine-tuning" + ) + else: + self.num_classes = [len(d) for d in dictionaries] + self.label_embs_concat = nn.Parameter( + torch.FloatTensor(sum(self.num_classes), final_dim) + ) + nn.init.uniform_(self.label_embs_concat) + + self.phone_embed = nn.Embedding(46, cfg.encoder_embed_dim) + self.phone_conv = nn.Sequential( + nn.Conv1d(in_channels=cfg.encoder_embed_dim, out_channels=cfg.encoder_embed_dim, kernel_size=3, stride=2, padding=1), + nn.ReLU(), + nn.Conv1d(in_channels=cfg.encoder_embed_dim, out_channels=cfg.encoder_embed_dim, kernel_size=3, stride=2, padding=1), + ) + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: VATHubertConfig, task: VATHubertPretrainingTask): + """Build a new model instance.""" + + kwargs = {} + model = VATHubertModel(cfg, task.cfg, task.dictionaries, **kwargs) + return model + + def apply_input_mask(self, x, padding_mask, target_list): + B, C, T = x.shape[:3] + is_audio = True if len(x.shape) == 3 else False + if is_audio: + mask_prob, mask_length = self.mask_prob_audio, self.mask_length_audio + else: + mask_prob, mask_length = self.mask_prob_image, self.mask_length_image + if mask_prob > 0: + + mask_indices, starts, ends, batch_indexes = compute_mask_indices( + (B, T), + padding_mask, + mask_prob, + mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices_np = mask_indices + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x = x.transpose(1, 2).contiguous() # [B, T, C, H, W] + if B == 1: + x[mask_indices] = 0 + elif is_audio: + x[mask_indices] = self.mask_emb + elif self.selection_type == 'same_other_seq': + perm = (torch.arange(B) + torch.randint(low=1, high=B, size=(1,))) % B + x_perm = x[perm] + x[mask_indices] = x_perm[mask_indices] + elif self.selection_type == 'same_seq': + batch_indexes_, other_indexes = [], [] + for batch_index, start, end in zip(batch_indexes, starts, ends): + length = end-start + other_start = np.setdiff1d(np.arange(T), np.arange(max(0, start-length), end)) + if len(other_start) > 0: + other_start = np.random.choice(other_start, size=1) + else: + other_start = 0 + other_end = other_start + length + other_indexes.append(np.arange(other_start, other_end).clip(max=T-1)) + batch_indexes_.append(np.zeros([length], dtype=np.int64)+batch_index) + batch_indexes, other_indexes = np.concatenate(batch_indexes_), np.concatenate(other_indexes) + x[mask_indices] = x[batch_indexes, other_indexes] + + x = x.transpose(1, 2).contiguous() + else: + mask_indices = None + + if self.mask_channel_prob > 0: + logger.info(f"No mask channel prob for input masking") + return x, mask_indices + + def apply_feature_mask(self, x, padding_mask, target_list): + B, T, C = x.shape + assert self.mask_prob_audio == self.mask_prob_image and self.mask_length_audio == self.mask_length_image, f"masking prob/length for image/audio be same for feature masking" + mask_prob, mask_length = self.mask_prob_audio, self.mask_length_image + if mask_prob > 0: + mask_indices, _, _, _ = compute_mask_indices( + (B, T), + padding_mask, + mask_prob, + mask_length, + self.mask_selection, + self.mask_other, + min_masks=2, + no_overlap=self.no_mask_overlap, + min_space=self.mask_min_space, + ) + mask_indices = torch.from_numpy(mask_indices).to(x.device) + x[mask_indices] = self.mask_emb + else: + mask_indices = None + + if self.mask_channel_prob > 0: + mask_channel_indices, _, _, _ = compute_mask_indices( + (B, C), + None, + self.mask_channel_prob, + self.mask_channel_length, + self.mask_channel_selection, + self.mask_channel_other, + no_overlap=self.no_mask_channel_overlap, + min_space=self.mask_channel_min_space, + ) + mask_channel_indices = ( + torch.from_numpy(mask_channel_indices) + .to(x.device) + .unsqueeze(1) + .expand(-1, T, -1) + ) + x[mask_channel_indices] = 0 + + return x, mask_indices + + def forward_features(self, source: torch.Tensor, modality: str) -> torch.Tensor: + extractor = eval(f"self.feature_extractor_{modality}") + if self.feature_grad_mult > 0: + features = extractor(source) + if self.feature_grad_mult != 1.0: + features = GradMultiply.apply(features, self.feature_grad_mult) + else: + with torch.no_grad(): + features = extractor(source) + return features + + def forward_targets( + self, features: torch.Tensor, mask_indices: torch.Tensor, target_list: List[torch.Tensor], + ) -> Tuple[torch.Tensor, torch.Tensor]: + # Trim features to ensure labels exist and then get aligned labels + feat_tsz = features.size(2) + targ_tsz = min([t.size(1) for t in target_list]) + if self.feat2tar_ratio * feat_tsz > targ_tsz: + feat_tsz = int(targ_tsz / self.feat2tar_ratio) + features = features[..., :feat_tsz] + if mask_indices is not None: + mask_indices = mask_indices[..., :feat_tsz] + target_inds = torch.arange(feat_tsz).float() * self.feat2tar_ratio + target_list = [t[:, target_inds.long()] for t in target_list] + return features, mask_indices, target_list + + def forward_padding_mask( + self, features: torch.Tensor, padding_mask: torch.Tensor, + ) -> torch.Tensor: + extra = padding_mask.size(1) % features.size(1) + if extra > 0: + padding_mask = padding_mask[:, :-extra] + padding_mask = padding_mask.view( + padding_mask.size(0), features.size(1), -1 + ) + padding_mask = padding_mask.all(-1) + return padding_mask + + def compute_logits(self, feats, emb_mat): + # feats: [B, T, F], emb_mat: [V, F] + if self.sim_type == 'dot': + logits = torch.matmul(feats, emb_mat.transpose(0, 1)) + elif self.sim_type == 'cosine': + batch_size, timesteps, emb_dim = feats.size() + feats_ = feats.view(-1, emb_dim) + nom = (feats_.unsqueeze(dim=1) * emb_mat.unsqueeze(dim=0)).sum(dim=-1) # [B*T, V] + denom = (feats_**2).sum(dim=-1).sqrt().unsqueeze(dim=1) * (emb_mat**2).sum(dim=-1).sqrt().unsqueeze(dim=0) # [B*T, V] + logits = (nom/denom.clamp(min=1e-6)).view(batch_size, timesteps, -1) + else: + raise NotImplementedError + logits = logits / self.logit_temp + return logits + + def forward( + self, + source: torch.Tensor, + target_list: Optional[List[torch.Tensor]] = None, + targets_phone_list: Optional[List[torch.Tensor]] = None, + extra_text_phone_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + + if not extra_text_phone_list: + src_audio, src_video = source['audio'], source['video'] # src_audio:[B, D1, T], [B, 1, T, 88, 88] + + if mask and self.masking_type == 'input': + src_video, mask_indices_video = self.apply_input_mask(src_video, padding_mask, target_list) + src_audio, mask_indices_audio = self.apply_input_mask(src_audio, padding_mask, target_list) + mask_indices = torch.logical_or(mask_indices_audio, mask_indices_video) + else: + src_audio, src_video, mask_indices = src_audio, src_video, None + + + if src_audio is not None and src_video is None: + features_audio = self.forward_features(src_audio, modality='audio') # features: [B, F, T] + features_video = features_audio.new_zeros(features_audio.size(0), features_audio.size(1), features_audio.size(-1)) + elif src_audio is None and src_video is not None: + features_video = self.forward_features(src_video, modality='video') + features_audio = features_video.new_zeros(features_video.size(0), features_video.size(1), features_video.size(-1)) + elif src_audio is not None and src_video is not None: + features_video = self.forward_features(src_video, modality='video') + features_audio = self.forward_features(src_audio, modality='audio') # features: [B, F, T] + + + if targets_phone_list is not None: + phone_sequence = targets_phone_list[0] + phone_embedding = self.phone_embed(phone_sequence) + + feature_phone = self.phone_conv(phone_embedding.transpose(1,2)) + + if targets_phone_list is None and src_audio is not None: + feature_phone = features_audio.new_zeros(features_audio.size(0), features_audio.size(1), features_audio.size(-1)) + + if targets_phone_list is None and src_video is not None: + feature_phone = features_video.new_zeros(features_video.size(0), features_video.size(1), features_video.size(-1)) + + + + if features_audio.size(-1) != feature_phone.size(-1): + diff = features_audio.size(-1) - feature_phone.size(-1) + + if diff >=0: + phone_pad_zero = torch.zeros(features_audio.size(0), features_audio.size(1), diff).type_as(feature_phone) + feature_phone = torch.cat((feature_phone, phone_pad_zero), dim=-1) + else: + feature_phone = feature_phone[:,:,:features_audio.size(-1)] + + else: + + phone_sequence = extra_text_phone_list[0] + phone_embedding = self.phone_embed(phone_sequence) + feature_phone = self.phone_conv(phone_embedding.transpose(1,2)) + features_audio = feature_phone.new_zeros(feature_phone.size(0), feature_phone.size(1), feature_phone.size(-1)) + features_video = feature_phone.new_zeros(feature_phone.size(0), feature_phone.size(1), feature_phone.size(-1)) + + mask_indices=None + padding_mask = torch.zeros(feature_phone.size(0), feature_phone.size(-1)).to(torch.bool).cuda() + + + + + modality_drop_prob, audio_drop_prob = np.random.random(), np.random.random() + if self.training: + if modality_drop_prob < self.modality_dropout: + if audio_drop_prob < self.audio_dropout: + features_audio = 0 * features_audio + else: + features_video = 0 * features_video + + + if self.modality_fuse == 'concat': + features = torch.cat([features_audio, features_video, feature_phone], dim=1) + elif self.modality_fuse == 'add': + features = features_audio + features_video + feature_phone + + + if target_list is not None: + features, mask_indices, target_list = self.forward_targets(features, mask_indices, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) # [B, T, 1536] + features = self.layer_norm(features) + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + + if self.masking_type == 'feature' and mask: + x, mask_indices = self.apply_feature_mask(features, padding_mask, target_list) + else: + x = features + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1 + ) # [B, T, 768] + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features} + + label_embs_list = self.label_embs_concat.split(self.num_classes, 0) # list to tuple + proj_x = self.final_proj(x) + if self.untie_final_proj: # True + proj_x_list = proj_x.chunk(len(self.num_classes), dim=-1) + else: + proj_x_list = [proj_x for _ in self.num_classes] + logit_list = [self.compute_logits(proj, emb).view(-1, num_class) for proj, emb, num_class in zip(proj_x_list, label_embs_list, self.num_classes)] # [[B*T, V]] + mask, unmask = torch.logical_and(mask_indices, ~padding_mask).view(-1), torch.logical_and(~mask_indices, ~padding_mask).view(-1) # [B*T] + logit_m_list, logit_u_list = [logit[mask] for logit in logit_list], [logit[unmask] for logit in logit_list] + target_m_list, target_u_list = [target.view(-1)[mask].long() for target in target_list], [target.view(-1)[unmask].long() for target in target_list] + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "target_m_list": target_m_list, + "target_u_list": target_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + return result + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + ) -> Tuple[torch.Tensor, torch.Tensor]: + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + feature = res["features"] if ret_conv else res["x"] + return feature, res["padding_mask"] + + def extract_finetune(self, source, padding_mask=None, mask=False, ret_conv=False, output_layer=None): + src_audio, src_video = source['audio'], source['video'] + if mask and self.masking_type == 'input': + src_video, mask_indices_video = self.apply_input_mask(src_video, padding_mask, target_list=None) + src_audio, mask_indices_audio = self.apply_input_mask(src_audio, padding_mask, target_list=None) + mask_indices = torch.logical_or(mask_indices_audio, mask_indices_video) # mask_indices not used in fine-tuning + else: + src_audio, src_video, mask_indices = src_audio, src_video, None + + if src_audio is not None and src_video is None: + features_audio = self.forward_features(src_audio, modality='audio') # features: [B, F, T] + features_video = features_audio.new_zeros(features_audio.size(0), self.encoder_embed_dim, features_audio.size(-1)) + feature_phone = features_audio.new_zeros(features_audio.size(0), features_audio.size(1), features_audio.size(-1)) + elif src_audio is None and src_video is not None: + features_video = self.forward_features(src_video, modality='video') + features_audio = features_video.new_zeros(features_video.size(0), self.encoder_embed_dim, features_video.size(-1)) + feature_phone = features_video.new_zeros(features_video.size(0), features_video.size(1), features_video.size(-1)) + elif src_audio is not None and src_video is not None: + features_video = self.forward_features(src_video, modality='video') + features_audio = self.forward_features(src_audio, modality='audio') # features: [B, F, T] + feature_phone = features_video.new_zeros(features_video.size(0), features_video.size(1), features_video.size(-1)) + + if self.modality_fuse == 'concat': + features = torch.cat([features_audio, features_video, feature_phone], dim=1) + elif self.modality_fuse == 'add': + features = features_audio + features_video + feature_phone + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1 + ) + + return x, padding_mask + + + def get_extra_losses(self, net_output): + extra_losses = [] + names = [] + if "features_pen" in net_output: + extra_losses.append(net_output["features_pen"]) + names.append("features_pen") + + return extra_losses, names + + def remove_pretraining_modules(self): + self.target_glu = None + self.final_proj = None + self.label_embs_concat = None + self.mask_emb = None + + def get_logits(self, net_output, is_masked=True): + raise NotImplementedError + + def get_targets(self, net_output, is_masked=True): + raise NotImplementedError + + def compute_nce(self, x, pos, negs): + neg_is_pos = (pos == negs).all(-1) + pos = pos.unsqueeze(0) + targets = torch.cat([pos, negs], dim=0) + + logits = torch.cosine_similarity( + x.float(), targets.float(), dim=-1 + ).type_as(x) + logits /= self.logit_temp + if neg_is_pos.any(): + logits[1:][neg_is_pos] = float("-inf") + logits = logits.transpose(0, 1) # (num_x, num_cls+1) + return logits diff --git a/VATLM/vat_hubert/vathubert/models/vathubert_asr.py b/VATLM/vat_hubert/vathubert/models/vathubert_asr.py new file mode 100644 index 0000000..a9902a9 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/models/vathubert_asr.py @@ -0,0 +1,481 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + + +import sys,logging +import contextlib +import tempfile +from argparse import Namespace +from typing import Any, Optional + +import torch +import torch.nn as nn +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, FairseqEncoderDecoderModel, register_model +from fairseq.models.hubert.hubert import MASKING_DISTRIBUTION_CHOICES +from fairseq.tasks import FairseqTask +from omegaconf import II, MISSING + +DBG=True if len(sys.argv) == 1 else False + +if DBG: + from vathubert.models.vathubert import VATHubertModel + from vathubert.models.decoder import TransformerDecoder +else: + from vathubert.models.vathubert import VATHubertModel + from vathubert.models.decoder import TransformerDecoder + +logger = logging.getLogger(__name__) + + +@dataclass +class VATHubertAsrConfig(FairseqDataclass): + w2v_path: str = field( + default=MISSING, metadata={"help": "path to hubert model"} + ) + no_pretrained_weights: bool = field( + default=False, + metadata={"help": "if true, does not load pretrained weights"}, + ) + dropout_input: float = field( + default=0.0, + metadata={"help": "dropout to apply to the input (after feat extr)"}, + ) + final_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout after transformer and before final projection" + }, + ) + dropout: float = field( + default=0.0, + metadata={"help": "dropout probability inside hubert model"}, + ) + attention_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability for attention weights " + "inside hubert model" + }, + ) + activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN " + "inside hubert model" + }, + ) + + # masking + apply_mask: bool = field( + default=False, metadata={"help": "apply masking during fine-tuning"} + ) + mask_length: int = field( + default=10, metadata={"help": "repeat the mask indices multiple times"} + ) + mask_prob: float = field( + default=0.5, + metadata={ + "help": "probability of replacing a token with mask " + "(normalized by length)" + }, + ) + mask_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", metadata={"help": "how to choose masks"} + ) + mask_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indices" + }, + ) + no_mask_overlap: bool = field( + default=False, metadata={"help": "whether to allow masks to overlap"} + ) + + # channel masking + mask_channel_length: int = field( + default=10, + metadata={"help": "length of the mask for features (channels)"}, + ) + mask_channel_prob: float = field( + default=0.0, + metadata={"help": "probability of replacing a feature with 0"}, + ) + mask_channel_selection: MASKING_DISTRIBUTION_CHOICES = field( + default="static", + metadata={"help": "how to choose mask length for channel masking"}, + ) + mask_channel_other: float = field( + default=0, + metadata={ + "help": "secondary mask argument " + "(used for more complex distributions), " + "see help in compute_mask_indices" + }, + ) + no_mask_channel_overlap: bool = field( + default=False, + metadata={"help": "whether to allow channel masks to overlap"}, + ) + freeze_finetune_updates: int = field( + default=0, + metadata={"help": "dont finetune hubert for this many updates"}, + ) + feature_grad_mult: float = field( + default=0.0, + metadata={"help": "reset feature grad mult in hubert to this"}, + ) + layerdrop: float = field( + default=0.0, + metadata={"help": "probability of dropping a layer in hubert"}, + ) + normalize: bool = II("task.normalize") + data: str = II("task.data") + + # this holds the loaded hubert args + w2v_args: Any = None + + +@dataclass +class VATHubertSeq2SeqConfig(VATHubertAsrConfig): + decoder_embed_dim: int = field( + default=768, metadata={"help": "decoder embedding dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_layers: int = field( + default=6, metadata={"help": "num of decoder layers"} + ) + decoder_layerdrop: float = field( + default=0.0, metadata={"help": "decoder layerdrop chance"} + ) + decoder_attention_heads: int = field( + default=4, metadata={"help": "num decoder attention heads"} + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "use learned positional embeddings in the decoder"}, + ) + decoder_normalize_before: bool = field( + default=False, + metadata={"help": "apply layernorm before each decoder block"}, + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={ + "help": "if set, disables positional embeddings " + "(outside self attention)" + }, + ) + decoder_dropout: float = field( + default=0.0, metadata={"help": "dropout probability in the decoder"} + ) + decoder_attention_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability for attention weights " + "inside the decoder" + }, + ) + decoder_activation_dropout: float = field( + default=0.0, + metadata={ + "help": "dropout probability after activation in FFN " + "inside the decoder" + }, + ) + max_target_positions: int = field( + default=2048, metadata={"help": "max target positions"} + ) + share_decoder_input_output_embed: bool = field( + default=False, + metadata={"help": "share decoder input and output embeddings"}, + ) + no_scale_embedding: bool = field(default=True, metadata={'help': 'scale embedding'}) + +class HubertEncoder(FairseqEncoder): + def __init__(self, cfg: VATHubertAsrConfig, tgt_dict=None): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu( + cfg.w2v_path, arg_overrides + ) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf( + w2v_args + ) + + assert cfg.normalize == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + w2v_args.task.data = cfg.data + + task = tasks.setup_task(w2v_args.task) + model = task.build_model(w2v_args.model) + + if state is not None and not cfg.no_pretrained_weights: + # set strict=False because we omit some modules + model.load_state_dict(state["model"], strict=False) + + model.remove_pretraining_modules() + + super().__init__(task.source_dictionary) + + d = model.encoder.embedding_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.num_updates = 0 + + if tgt_dict is not None: + self.proj = Linear(d, len(tgt_dict)) + elif getattr(cfg, "decoder_embed_dim", d) != d: + self.proj = Linear(d, cfg.decoder_embed_dim) + else: + self.proj = None + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, source, padding_mask, tbc=True, **kwargs): + + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + } + ft = self.freeze_finetune_updates <= self.num_updates + + with torch.no_grad() if not ft else contextlib.ExitStack(): + x, padding_mask = self.w2v_model.extract_finetune(**w2v_args) + + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + if self.proj: + x = self.proj(x) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": padding_mask, # B x T + "padding_mask": padding_mask, + } + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +class HubertEncoderWrapper(FairseqEncoder): + def __init__(self, w2v_model): + super().__init__(None) + self.w2v_model = w2v_model + + def forward(self, source, padding_mask, **kwargs): + w2v_args = { + "source": source, + "padding_mask": padding_mask, + } + + x, padding_mask = self.w2v_model.extract_finetune(**w2v_args) + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": padding_mask, # B x T + "padding_mask": padding_mask + } + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + if encoder_out["padding_mask"] is not None: + encoder_out["padding_mask"] = encoder_out[ + "padding_mask" + ].index_select(0, new_order) + return encoder_out + +@register_model("vat_hubert_seq2seq", dataclass=VATHubertSeq2SeqConfig) +class VATHubertSeq2Seq(FairseqEncoderDecoderModel): + def __init__(self, encoder, decoder, tgt_dict, cfg): + super().__init__(encoder, decoder) + self.cfg = cfg + self.freeze_finetune_updates = cfg.freeze_finetune_updates + + @classmethod + def build_model(cls, cfg, task): + """Build a new model instance.""" + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu( + cfg.w2v_path, arg_overrides + ) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf( + w2v_args + ) + + assert cfg.normalize == w2v_args.task.normalize, ( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + w2v_args.task.data = cfg.data + + task_pretrain = tasks.setup_task(w2v_args.task) + if state is not None: + task_pretrain.load_state_dict(state['task_state']) + + encoder_ = task_pretrain.build_model(w2v_args.model) + + encoder = HubertEncoderWrapper(encoder_) + if state is not None and not cfg.no_pretrained_weights: + # set strict=False because we omit some modules + del state['model']['mask_emb'] + del state['model']['label_embs_concat'] + + encoder.w2v_model.load_state_dict(state["model"], strict=False) + + encoder.w2v_model.remove_pretraining_modules() + + src_dict, tgt_dict = task.source_dictionary, task.target_dictionary + + def build_embedding(dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + emb = Embedding(num_embeddings, embed_dim, padding_idx=padding_idx) + return emb + + decoder_embed_tokens = build_embedding(tgt_dict, cfg.decoder_embed_dim) + decoder = TransformerDecoder(cfg, tgt_dict, decoder_embed_tokens) + + return VATHubertSeq2Seq(encoder, decoder, tgt_dict, cfg) + + + def forward(self, **kwargs): + ft = self.freeze_finetune_updates <= self.num_updates + with torch.no_grad() if not ft else contextlib.ExitStack(): + output = self.encoder(**kwargs) + decoder_out = self.decoder(prev_output_tokens=kwargs['prev_output_tokens'], encoder_out=output) + return decoder_out + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_lrs3_finetune30_av.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_lrs3_finetune30_av.sh new file mode 100644 index 0000000..422939b --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_lrs3_finetune30_av.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name base_lrs3_30h_av.yaml \ + task.data=/path/to/30h_data_tsv \ + task.label_dir=/path/to/30h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["audio","video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune30_av.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune30_av.sh new file mode 100644 index 0000000..5e8a9e5 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune30_av.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name base_vox_30h_av.yaml \ + task.data=/path/to/30h_data_tsv \ + task.label_dir=/path/to/30h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["audio","video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune433_av.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune433_av.sh new file mode 100644 index 0000000..0a9ad41 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/base_vox_finetune433_av.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name base_vox_433h_av.yaml \ + task.data=/path/to/433h_data_tsv \ + task.label_dir=/path/to/433h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["audio","video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune30_av.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune30_av.sh new file mode 100644 index 0000000..fb849c3 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune30_av.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name large_vox_30h_av.yaml \ + task.data=/path/to/30h_data_tsv \ + task.label_dir=/path/to/30h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["audio","video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ \ No newline at end of file diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune433_av.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune433_av.sh new file mode 100644 index 0000000..47668d0 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_avsr/large_vox_finetune433_av.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name large_vox_433h_av.yaml \ + task.data=/path/to/433h_data_tsv \ + task.label_dir=/path/to/433h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["audio","video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_lrs3_finetune30_v.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_lrs3_finetune30_v.sh new file mode 100644 index 0000000..56ac237 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_lrs3_finetune30_v.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name base_lrs3_30h_v.yaml \ + task.data=/path/to/30h_data_tsv \ + task.label_dir=/path/to/30h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune30_v.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune30_v.sh new file mode 100644 index 0000000..d3f1b13 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune30_v.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name base_vox_30h_v.yaml \ + task.data=/path/to/30h_data_tsv \ + task.label_dir=/path/to/30h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune433_v.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune433_v.sh new file mode 100644 index 0000000..4943d8a --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/base_vox_finetune433_v.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name base_vox_433h_v.yaml \ + task.data=/path/to/433h_data_tsv \ + task.label_dir=/path/to/433h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune30_v.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune30_v.sh new file mode 100644 index 0000000..c36d017 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune30_v.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name large_vox_30h_v.yaml \ + task.data=/path/to/30h_data_tsv \ + task.label_dir=/path/to/30h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune433_v.sh b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune433_v.sh new file mode 100644 index 0000000..275222c --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/finetune_vsr/large_vox_finetune433_v.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +ngpu=$1 +updatefreq=$2 +max_tokens=$3 +pretrained_model_path=$4 +save_path=$5 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/finetune --config-name large_vox_433h_v.yaml \ + task.data=/path/to/433h_data_tsv \ + task.label_dir=/path/to/433h_data_tsv \ + task.tokenizer_bpe_model=/path/to/sentencepiece/model \ + task.modalities=["video"] \ + model.w2v_path=${pretrained_model_path} \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + distributed_training.ddp_backend="no_c10d" \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=${max_tokens} \ + +task.use_supervised_data=False \ + +task.use_extra_textdata=False \ + +task.use_extra_audiodata=False \ + + + + diff --git a/VATLM/vat_hubert/vathubert/scripts/pretrain/base_lsr3_pretrain_iter5.sh b/VATLM/vat_hubert/vathubert/scripts/pretrain/base_lsr3_pretrain_iter5.sh new file mode 100644 index 0000000..bb9d03c --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/pretrain/base_lsr3_pretrain_iter5.sh @@ -0,0 +1,31 @@ +#!/bin/bash +ngpu=$1 +updatefreq=$2 +datapath=/LocalData/vatlm_related/fbankdata +save_path=$3 + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/pretrain --config-name base_lrs3_iter5.yaml \ + task.data=${datapath}/433pre_lrs3_433h_tsv \ + task.label_dir=${datapath}/433pre_lrs3_433h_tsv \ + +task.sup_data_path=${datapath}/433pre_tedv3_phone_concat_tsv2 \ + +task.sup_manifest=${datapath}/433pre_tedv3_phone_concat_tsv2 \ + +task.onlytext_manifest=${datapath}/433pre_cantab_tsv \ + +task.onlyaudio_manifest=${datapath}/433pre_giga_tsv_km \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=3000 \ + model.label_rate=25 \ + common.log_interval=200 \ + checkpoint.save_interval=5 \ + +task.sample_distributions=\"0.08,0.1,0.15,0.15\" \ + +criterion.banlance_loss_weights=[1.0,1.0] \ + dataset.data_buffer_size=40 \ + +task.use_supervised_data=True \ + +task.use_extra_textdata=True \ + +task.use_extra_audiodata=True \ + + + \ No newline at end of file diff --git a/VATLM/vat_hubert/vathubert/scripts/pretrain/base_vox_pretrain_iter5.sh b/VATLM/vat_hubert/vathubert/scripts/pretrain/base_vox_pretrain_iter5.sh new file mode 100644 index 0000000..221588a --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/pretrain/base_vox_pretrain_iter5.sh @@ -0,0 +1,30 @@ +#!/bin/bash +ngpu=$1 +updatefreq=$2 +datapath=/LocalData/vatlm_related/fbankdata +save_path=$3 + + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/pretrain --config-name base_vox_iter5.yaml \ + task.data=${datapath}/fbank_lrs3_vox_tsv \ + task.label_dir=${datapath}/fbank_lrs3_vox_tsv \ + +task.sup_data_path=${datapath}/fbank_tedv3_phone_concat_vox_tsv \ + +task.sup_manifest=${datapath}/fbank_tedv3_phone_concat_vox_tsv \ + +task.onlytext_manifest=${datapath}/cantab2_vox_tsv \ + +task.onlyaudio_manifest=${datapath}/fbank_giga_vox_tsv_km \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=3000 \ + model.label_rate=25 \ + common.log_interval=200 \ + checkpoint.save_interval=5 \ + +task.sample_distributions=\"0.13,0.15,0.32,0.3\" \ + +criterion.banlance_loss_weights=[1.0,1.0] \ + dataset.data_buffer_size=40 \ + +task.use_supervised_data=True \ + +task.use_extra_textdata=True \ + +task.use_extra_audiodata=True \ + diff --git a/VATLM/vat_hubert/vathubert/scripts/pretrain/large_vox_pretrain_iter5.sh b/VATLM/vat_hubert/vathubert/scripts/pretrain/large_vox_pretrain_iter5.sh new file mode 100644 index 0000000..064f9ce --- /dev/null +++ b/VATLM/vat_hubert/vathubert/scripts/pretrain/large_vox_pretrain_iter5.sh @@ -0,0 +1,31 @@ +#!/bin/bash +unset WORLD_SIZE +ngpu=$1 +updatefreq=$2 +datapath=/LocalData/vatlm_related/fbankdata +save_path=$3 + + +python /path/to/fairseq/fairseq_cli/hydra_train.py \ + --config-dir /path/to/vat_hubert/vathubert/conf/pretrain --config-name large_vox_iter5.yaml \ + task.data=${datapath}/fbank_lrs3_vox_tsv \ + task.label_dir=${datapath}/fbank_lrs3_vox_tsv \ + +task.sup_data_path=${datapath}/fbank_tedv3_phone_concat_vox_tsv \ + +task.sup_manifest=${datapath}/fbank_tedv3_phone_concat_vox_tsv \ + +task.onlytext_manifest=${datapath}/cantab2_vox_tsv \ + +task.onlyaudio_manifest=${datapath}/fbank_giga_vox_tsv_km \ + hydra.run.dir=${save_path} \ + common.user_dir=/path/to/vat_hubert/vathubert \ + distributed_training.distributed_world_size=${ngpu} \ + optimization.update_freq=[${updatefreq}] \ + dataset.max_tokens=3000 \ + model.label_rate=25 \ + common.log_interval=200 \ + checkpoint.save_interval=5 \ + +task.sample_distributions=\"0.13,0.15,0.32,0.3\" \ + +criterion.banlance_loss_weights=[1.0,1.0] \ + dataset.data_buffer_size=40 \ + +task.use_supervised_data=True \ + +task.use_extra_textdata=True \ + +task.use_extra_audiodata=True \ + diff --git a/VATLM/vat_hubert/vathubert/sequence_generator.py b/VATLM/vat_hubert/vathubert/sequence_generator.py new file mode 100644 index 0000000..49cfa7a --- /dev/null +++ b/VATLM/vat_hubert/vathubert/sequence_generator.py @@ -0,0 +1,988 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import math +from typing import Dict, List, Optional +import sys + +import torch +import torch.nn as nn +from fairseq import search, utils +from fairseq.data import data_utils +from fairseq.models import FairseqIncrementalDecoder +from torch import Tensor +from fairseq.ngram_repeat_block import NGramRepeatBlock + + +class SequenceGenerator(nn.Module): + def __init__( + self, + models, + tgt_dict, + beam_size=1, + max_len_a=0, + max_len_b=200, + max_len=0, + min_len=1, + normalize_scores=True, + len_penalty=1.0, + unk_penalty=0.0, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + search_strategy=None, + eos=None, + symbols_to_strip_from_output=None, + lm_model=None, + lm_weight=1.0, + ): + """Generates translations of a given source sentence. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models, + currently support fairseq.models.TransformerModel for scripting + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + max_len (int, optional): the maximum length of the generated output + (not including end-of-sentence) + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + """ + super().__init__() + if isinstance(models, EnsembleModel): + self.model = models + else: + self.model = EnsembleModel(models) + self.tgt_dict = tgt_dict + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() if eos is None else eos + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos}) + if symbols_to_strip_from_output is not None + else {self.eos} + ) + self.vocab_size = len(tgt_dict) + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.max_len = max_len or self.model.max_decoder_positions() + + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.temperature = temperature + self.match_source_len = match_source_len + + if no_repeat_ngram_size > 0: + self.repeat_ngram_blocker = NGramRepeatBlock(no_repeat_ngram_size) + else: + self.repeat_ngram_blocker = None + + assert temperature > 0, "--temperature must be greater than 0" + + self.search = ( + search.BeamSearch(tgt_dict) if search_strategy is None else search_strategy + ) + # We only need to set src_lengths in LengthConstrainedBeamSearch. + # As a module attribute, setting it would break in multithread + # settings when the model is shared. + self.should_set_src_lengths = ( + hasattr(self.search, "needs_src_lengths") and self.search.needs_src_lengths + ) + + self.model.eval() + + self.lm_model = lm_model + self.lm_weight = lm_weight + if self.lm_model is not None: + self.lm_model.eval() + + def cuda(self): + self.model.cuda() + return self + + @torch.no_grad() + def forward( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + """Generate a batch of translations. + + Args: + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, prefix_tokens, bos_token=bos_token) + + # TODO(myleott): unused, deprecate after pytorch-translate migration + def generate_batched_itr(self, data_itr, beam_size=None, cuda=False, timer=None): + """Iterate over a batched dataset and yield individual translations. + Args: + cuda (bool, optional): use GPU for generation + timer (StopwatchMeter, optional): time generations + """ + for sample in data_itr: + s = utils.move_to_cuda(sample) if cuda else sample + if "net_input" not in s: + continue + input = s["net_input"] + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in input.items() if k != "prev_output_tokens" + } + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate(encoder_input) + if timer is not None: + timer.stop(sum(len(h[0]["tokens"]) for h in hypos)) + for i, id in enumerate(s["id"].data): + # remove padding + src = utils.strip_pad(input["src_tokens"].data[i, :], self.pad) + ref = ( + utils.strip_pad(s["target"].data[i, :], self.pad) + if s["target"] is not None + else None + ) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate(self, models, sample: Dict[str, Dict[str, Tensor]], **kwargs) -> List[List[Dict[str, Tensor]]]: + """Generate translations. Match the api of other fairseq generators. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + constraints (torch.LongTensor, optional): force decoder to include + the list of constraints + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, **kwargs) + + def _generate( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + constraints: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(self.model.models_size) + ], + ) + net_input = sample["net_input"] + + if "src_tokens" in net_input: + src_tokens = net_input["src_tokens"] + # length of the source text being the character length except EndOfSentence and pad + src_lengths = ( + (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)).long().sum(dim=1) + ) + elif "source" in net_input: + src_tokens = net_input["source"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + elif "features" in net_input: + src_tokens = net_input["features"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + else: + raise Exception("expected src_tokens or source in net input. input keys: " + str(net_input.keys())) + + # bsz: total number of sentences in beam + # Note that src_tokens may have more than 2 dimensions (i.e. audio features) + if src_tokens['audio'] is not None: + bsz, src_len = src_tokens['audio'].size()[:2] + src_device = src_tokens['audio'].device + else: + bsz, src_len = net_input['padding_mask'].size() + src_device = src_tokens['video'].device + beam_size = self.beam_size + if constraints is not None and not self.search.supports_constraints: + raise NotImplementedError( + "Target-side constraints were provided, but search method doesn't support them" + ) + + # Initialize constraints, when active + self.search.init_constraints(constraints, beam_size) + + max_len: int = -1 + if self.match_source_len: + max_len = src_lengths.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + self.max_len - 1, + ) + assert ( + self.min_len <= max_len + ), "min_len cannot be larger than max_len, please adjust these!" + # compute the encoder output for each beam + encoder_outs = self.model.forward_encoder(net_input) + + # placeholder of indices for bsz * beam_size to hold tokens and accumulative scores + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(src_device).long() + encoder_outs = self.model.reorder_encoder_out(encoder_outs, new_order) + # ensure encoder_outs is a List. + assert encoder_outs is not None + + # initialize buffers + scores = ( + torch.zeros(bsz * beam_size, max_len + 1).to(src_device).float() + ) # +1 for eos; pad is never chosen for scoring + tokens = ( + torch.zeros(bsz * beam_size, max_len + 2) + .to(src_device) + .long() + .fill_(self.pad) + ) # +2 for eos and pad + tokens[:, 0] = self.eos if bos_token is None else bos_token + attn: Optional[Tensor] = None + + # A list that indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = ( + torch.zeros(bsz, beam_size).to(src_device).eq(-1) + ) # forward and backward-compatible False mask + + # list of completed sentences + finalized = torch.jit.annotate( + List[List[Dict[str, Tensor]]], + [torch.jit.annotate(List[Dict[str, Tensor]], []) for i in range(bsz)], + ) # contains lists of dictionaries of infomation about the hypothesis being finalized at each step + + # a boolean array indicating if the sentence at the index is finished or not + finished = [False for i in range(bsz)] + num_remaining_sent = bsz # number of sentences remaining + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = ( + (torch.arange(0, bsz) * beam_size) + .unsqueeze(1) + .type_as(tokens) + .to(src_device) + ) + cand_offsets = torch.arange(0, cand_size).type_as(tokens).to(src_device) + + reorder_state: Optional[Tensor] = None + batch_idxs: Optional[Tensor] = None + + original_batch_idxs: Optional[Tensor] = None + if "id" in sample and isinstance(sample["id"], Tensor): + original_batch_idxs = sample["id"] + else: + original_batch_idxs = torch.arange(0, bsz).type_as(tokens) + + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as( + batch_idxs + ) + reorder_state.view(-1, beam_size).add_( + corr.unsqueeze(-1) * beam_size + ) + original_batch_idxs = original_batch_idxs[batch_idxs] + self.model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = self.model.reorder_encoder_out( + encoder_outs, reorder_state + ) + + lprobs, avg_attn_scores = self.model.forward_decoder( + tokens[:, : step + 1], + encoder_outs, + incremental_states, + self.temperature, + ) + + if self.lm_model is not None: + lm_out = self.lm_model(tokens[:, : step + 1]) + probs = self.lm_model.get_normalized_probs( + lm_out, log_probs=True, sample=None + ) + probs = probs[:, -1, :] * self.lm_weight + lprobs += probs + + lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs) + + lprobs[:, self.pad] = -math.inf # never select pad + lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + + # handle max length constraint + if step >= max_len: + lprobs[:, : self.eos] = -math.inf + lprobs[:, self.eos + 1 :] = -math.inf + + # handle prefix tokens (possibly with different lengths) + if ( + prefix_tokens is not None + and step < prefix_tokens.size(1) + and step < max_len + ): + lprobs, tokens, scores = self._prefix_tokens( + step, lprobs, scores, tokens, prefix_tokens, beam_size + ) + elif step < self.min_len: + # minimum length constraint (does not apply if using prefix_tokens) + lprobs[:, self.eos] = -math.inf + + # Record attention scores, only support avg_attn_scores is a Tensor + if avg_attn_scores is not None: + if attn is None: + attn = torch.empty( + bsz * beam_size, avg_attn_scores.size(1), max_len + 2 + ).to(scores) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(lprobs) + eos_bbsz_idx = torch.empty(0).to( + tokens + ) # indices of hypothesis ending with eos (finished sentences) + eos_scores = torch.empty(0).to( + scores + ) # scores of hypothesis ending with eos (finished sentences) + + if self.should_set_src_lengths: + self.search.set_src_lengths(src_lengths) + + if self.repeat_ngram_blocker is not None: + lprobs = self.repeat_ngram_blocker(tokens, lprobs, bsz, beam_size, step) + + # Shape: (batch, cand_size) + cand_scores, cand_indices, cand_beams = self.search.step( + step, + lprobs.view(bsz, -1, self.vocab_size), + scores.view(bsz, beam_size, -1)[:, :, :step], + tokens[:, : step + 1], + original_batch_idxs, + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos + # Shape of eos_mask: (batch size, beam size) + eos_mask = cand_indices.eq(self.eos) & cand_scores.ne(-math.inf) + eos_mask[:, :beam_size][cands_to_ignore] = torch.tensor(0).to(eos_mask) + + # only consider eos when it's among the top beam_size indices + # Now we know what beam item(s) to finish + # Shape: 1d list of absolute-numbered + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents: List[int] = [] + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + cand_scores[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = self.finalize_hypos( + step, + eos_bbsz_idx, + eos_scores, + tokens, + scores, + finalized, + finished, + beam_size, + attn, + src_lengths, + max_len, + ) + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + if self.search.stop_on_max_len and step >= max_len: + break + assert step < max_len, f"{step} < {max_len}" + + # Remove finalized sentences (ones for which {beam_size} + # finished hypotheses have been generated) from the batch. + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = torch.ones( + bsz, dtype=torch.bool, device=cand_indices.device + ) + batch_mask[finalized_sents] = False + # TODO replace `nonzero(as_tuple=False)` after TorchScript supports it + batch_idxs = torch.arange( + bsz, device=cand_indices.device + ).masked_select(batch_mask) + + # Choose the subset of the hypothesized constraints that will continue + self.search.prune_sentences(batch_idxs) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + cand_scores = cand_scores[batch_idxs] + cand_indices = cand_indices[batch_idxs] + + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths = src_lengths[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view( + new_bsz * beam_size, attn.size(1), -1 + ) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos hypos + # and values < cand_size indicate candidate active hypos. + # After, the min values per row are the top candidate active hypos + + # Rewrite the operator since the element wise or is not supported in torchscript. + + eos_mask[:, :beam_size] = ~((~cands_to_ignore) & (~eos_mask[:, :beam_size])) + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just + # the hypos with the smallest values in active_mask. + # {active_hypos} indicates which {beam_size} hypotheses + # from the list of {2 * beam_size} candidates were + # selected. Shapes: (batch size, beam size) + new_cands_to_ignore, active_hypos = torch.topk( + active_mask, k=beam_size, dim=1, largest=False + ) + + # update cands_to_ignore to ignore any finalized hypos. + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + # Make sure there is at least one active item for each sentence in the batch. + assert (~cands_to_ignore).any(dim=1).all() + + # update cands_to_ignore to ignore any finalized hypos + + # {active_bbsz_idx} denotes which beam number is continued for each new hypothesis (a beam + # can be selected more than once). + active_bbsz_idx = torch.gather(cand_bbsz_idx, dim=1, index=active_hypos) + active_scores = torch.gather(cand_scores, dim=1, index=active_hypos) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + + # Set the tokens for each beam (can select the same row more than once) + tokens[:, : step + 1] = torch.index_select( + tokens[:, : step + 1], dim=0, index=active_bbsz_idx + ) + # Select the next token for each of them + tokens.view(bsz, beam_size, -1)[:, :, step + 1] = torch.gather( + cand_indices, dim=1, index=active_hypos + ) + if step > 0: + scores[:, :step] = torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx + ) + scores.view(bsz, beam_size, -1)[:, :, step] = torch.gather( + cand_scores, dim=1, index=active_hypos + ) + + # Update constraints based on which candidates were selected for the next beam + self.search.update_constraints(active_hypos) + + # copy attention for active hypotheses + if attn is not None: + attn[:, :, : step + 2] = torch.index_select( + attn[:, :, : step + 2], dim=0, index=active_bbsz_idx + ) + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # sort by score descending + for sent in range(len(finalized)): + scores = torch.tensor( + [float(elem["score"].item()) for elem in finalized[sent]] + ) + _, sorted_scores_indices = torch.sort(scores, descending=True) + finalized[sent] = [finalized[sent][ssi] for ssi in sorted_scores_indices] + finalized[sent] = torch.jit.annotate( + List[Dict[str, Tensor]], finalized[sent] + ) + return finalized + + def _prefix_tokens( + self, step: int, lprobs, scores, tokens, prefix_tokens, beam_size: int + ): + """Handle prefix tokens""" + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_lprobs = lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + prefix_mask = prefix_toks.ne(self.pad) + lprobs[prefix_mask] = torch.tensor(-math.inf).to(lprobs) + lprobs[prefix_mask] = lprobs[prefix_mask].scatter( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lprobs[prefix_mask] + ) + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[ + :, 0, 1 : step + 1 + ] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = self.replicate_first_beam(tokens, eos_mask_batch_dim, beam_size) + scores = self.replicate_first_beam(scores, eos_mask_batch_dim, beam_size) + lprobs = self.replicate_first_beam(lprobs, eos_mask_batch_dim, beam_size) + return lprobs, tokens, scores + + def replicate_first_beam(self, tensor, mask, beam_size: int): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + def finalize_hypos( + self, + step: int, + bbsz_idx, + eos_scores, + tokens, + scores, + finalized: List[List[Dict[str, Tensor]]], + finished: List[bool], + beam_size: int, + attn: Optional[Tensor], + src_lengths, + max_len: int, + ): + """Finalize hypothesis, store finalized information in `finalized`, and change `finished` accordingly. + A sentence is finalized when {beam_size} finished items have been collected for it. + + Returns number of sentences (not beam items) being finalized. + These will be removed from the batch and not processed further. + Args: + bbsz_idx (Tensor): + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors. + # tokens is (batch * beam, max_len). So the index_select + # gets the newly EOS rows, then selects cols 1..{step + 2} + tokens_clone = tokens.index_select(0, bbsz_idx)[ + :, 1 : step + 2 + ] # skip the first index, which is EOS + + tokens_clone[:, step] = self.eos + attn_clone = ( + attn.index_select(0, bbsz_idx)[:, :, 1 : step + 2] + if attn is not None + else None + ) + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, : step + 1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + eos_scores /= (step + 1) ** self.len_penalty + + # cum_unfin records which sentences in the batch are finished. + # It helps match indexing between (a) the original sentences + # in the batch and (b) the current, possibly-reduced set of + # sentences. + cum_unfin: List[int] = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + + # The keys here are of the form "{sent}_{unfin_idx}", where + # "unfin_idx" is the index in the current (possibly reduced) + # list of sentences, and "sent" is the index in the original, + # unreduced batch + # set() is not supported in script export + sents_seen: Dict[str, Optional[Tensor]] = {} + + # For every finished beam item + for i in range(bbsz_idx.size()[0]): + idx = bbsz_idx[i] + score = eos_scores[i] + # sentence index in the current (possibly reduced) batch + unfin_idx = idx // beam_size + # sentence index in the original (unreduced) batch + sent = unfin_idx + cum_unfin[unfin_idx] + # Cannot create dict for key type '(int, int)' in torchscript. + # The workaround is to cast int to string + seen = str(sent.item()) + "_" + str(unfin_idx.item()) + if seen not in sents_seen: + sents_seen[seen] = None + + if self.match_source_len and step > src_lengths[unfin_idx]: + score = torch.tensor(-math.inf).to(score) + + # An input sentence (among those in a batch) is finished when + # beam_size hypotheses have been collected for it + if len(finalized[sent]) < beam_size: + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i] + else: + hypo_attn = torch.empty(0) + + finalized[sent].append( + { + "tokens": tokens_clone[i], + "score": score, + "attention": hypo_attn, # src_len x tgt_len + "alignment": torch.empty(0), + "positional_scores": pos_scores[i], + } + ) + + newly_finished: List[int] = [] + + for seen in sents_seen.keys(): + # check termination conditions for this sentence + sent: int = int(float(seen.split("_")[0])) + unfin_idx: int = int(float(seen.split("_")[1])) + + if not finished[sent] and self.is_finished( + step, unfin_idx, max_len, len(finalized[sent]), beam_size + ): + finished[sent] = True + newly_finished.append(unfin_idx) + + return newly_finished + + def is_finished( + self, + step: int, + unfin_idx: int, + max_len: int, + finalized_sent_len: int, + beam_size: int, + ): + """ + Check whether decoding for a sentence is finished, which + occurs when the list of finalized sentences has reached the + beam size, or when we reach the maximum length. + """ + assert finalized_sent_len <= beam_size + if finalized_sent_len == beam_size or step == max_len: + return True + return False + + +class EnsembleModel(nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models_size = len(models) + # method '__len__' is not supported in ModuleList for torch script + self.single_model = models[0] + self.models = nn.ModuleList(models) + + self.has_incremental: bool = False + if all( + hasattr(m, "decoder") and isinstance(m.decoder, FairseqIncrementalDecoder) + for m in models + ): + self.has_incremental = True + + def forward(self): + pass + + def has_encoder(self): + return hasattr(self.single_model, "encoder") + + def has_incremental_states(self): + return self.has_incremental + + def max_decoder_positions(self): + return min([m.max_decoder_positions() for m in self.models if hasattr(m, "max_decoder_positions")] + [sys.maxsize]) + + @torch.jit.export + def forward_encoder(self, net_input: Dict[str, Tensor]): + if not self.has_encoder(): + return None + return [model.encoder.forward_torchscript(net_input) for model in self.models] + + @torch.jit.export + def forward_decoder( + self, + tokens, + encoder_outs: List[Dict[str, List[Tensor]]], + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + temperature: float = 1.0, + ): + log_probs = [] + avg_attn: Optional[Tensor] = None + encoder_out: Optional[Dict[str, List[Tensor]]] = None + for i, model in enumerate(self.models): + if self.has_encoder(): + encoder_out = encoder_outs[i] + # decode each model + if self.has_incremental_states(): + decoder_out = model.decoder.forward( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i], + ) + else: + if hasattr(model, "decoder"): + decoder_out = model.decoder.forward(tokens, encoder_out=encoder_out) + else: + decoder_out = model.forward(tokens) + + attn: Optional[Tensor] = None + decoder_len = len(decoder_out) + if decoder_len > 1 and decoder_out[1] is not None: + if isinstance(decoder_out[1], Tensor): + attn = decoder_out[1] + else: + attn_holder = decoder_out[1]["attn"] + if isinstance(attn_holder, Tensor): + attn = attn_holder + elif attn_holder is not None: + attn = attn_holder[0] + if attn is not None: + attn = attn[:, -1, :] + + decoder_out_tuple = ( + decoder_out[0][:, -1:, :].div_(temperature), + None if decoder_len <= 1 else decoder_out[1], + ) + probs = model.get_normalized_probs( + decoder_out_tuple, log_probs=True, sample=None + ) + probs = probs[:, -1, :] + if self.models_size == 1: + return probs, attn + + log_probs.append(probs) + if attn is not None: + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + + avg_probs = torch.logsumexp(torch.stack(log_probs, dim=0), dim=0) - math.log( + self.models_size + ) + + if avg_attn is not None: + avg_attn.div_(self.models_size) + return avg_probs, avg_attn + + @torch.jit.export + def reorder_encoder_out( + self, encoder_outs: Optional[List[Dict[str, List[Tensor]]]], new_order + ): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_outs: List[Dict[str, List[Tensor]]] = [] + if not self.has_encoder(): + return new_outs + for i, model in enumerate(self.models): + assert encoder_outs is not None + new_outs.append( + model.encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + return new_outs + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + new_order, + ): + if not self.has_incremental_states(): + return + for i, model in enumerate(self.models): + model.decoder.reorder_incremental_state_scripting( + incremental_states[i], new_order + ) + + +class SequenceGeneratorWithAlignment(SequenceGenerator): + def __init__( + self, models, tgt_dict, left_pad_target=False, print_alignment="hard", **kwargs + ): + """Generates translations of a given source sentence. + + Produces alignments following "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + left_pad_target (bool, optional): Whether or not the + hypothesis should be left padded or not when they are + teacher forced for generating alignments. + """ + super().__init__(EnsembleModelWithAlignment(models), tgt_dict, **kwargs) + self.left_pad_target = left_pad_target + + if print_alignment == "hard": + self.extract_alignment = utils.extract_hard_alignment + elif print_alignment == "soft": + self.extract_alignment = utils.extract_soft_alignment + + @torch.no_grad() + def generate(self, models, sample, **kwargs): + finalized = super()._generate(sample, **kwargs) + + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + beam_size = self.beam_size + ( + src_tokens, + src_lengths, + prev_output_tokens, + tgt_tokens, + ) = self._prepare_batch_for_alignment(sample, finalized) + if any(getattr(m, "full_context_alignment", False) for m in self.model.models): + attn = self.model.forward_align(src_tokens, src_lengths, prev_output_tokens) + else: + attn = [ + finalized[i // beam_size][i % beam_size]["attention"].transpose(1, 0) + for i in range(bsz * beam_size) + ] + + if src_tokens.device != "cpu": + src_tokens = src_tokens.to("cpu") + tgt_tokens = tgt_tokens.to("cpu") + attn = [i.to("cpu") for i in attn] + + # Process the attn matrix to extract hard alignments. + for i in range(bsz * beam_size): + alignment = self.extract_alignment( + attn[i], src_tokens[i], tgt_tokens[i], self.pad, self.eos + ) + finalized[i // beam_size][i % beam_size]["alignment"] = alignment + return finalized + + def _prepare_batch_for_alignment(self, sample, hypothesis): + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + src_tokens = ( + src_tokens[:, None, :] + .expand(-1, self.beam_size, -1) + .contiguous() + .view(bsz * self.beam_size, -1) + ) + src_lengths = sample["net_input"]["src_lengths"] + src_lengths = ( + src_lengths[:, None] + .expand(-1, self.beam_size) + .contiguous() + .view(bsz * self.beam_size) + ) + prev_output_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=True, + ) + tgt_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=False, + ) + return src_tokens, src_lengths, prev_output_tokens, tgt_tokens + + +class EnsembleModelWithAlignment(EnsembleModel): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__(models) + + def forward_align(self, src_tokens, src_lengths, prev_output_tokens): + avg_attn = None + for model in self.models: + decoder_out = model(src_tokens, src_lengths, prev_output_tokens) + attn = decoder_out[1]["attn"][0] + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + if len(self.models) > 1: + avg_attn.div_(len(self.models)) + return avg_attn diff --git a/VATLM/vat_hubert/vathubert/tasks/vathubert_pretraining.py b/VATLM/vat_hubert/vathubert/tasks/vathubert_pretraining.py new file mode 100644 index 0000000..08b81d1 --- /dev/null +++ b/VATLM/vat_hubert/vathubert/tasks/vathubert_pretraining.py @@ -0,0 +1,863 @@ +# ---------------------------------------------------------------------------- +# VatLM: Visual-Audio-Text Pre-Training with Unified Masked Prediction for Speech Representation Learning +# Github source: https://github.com/microsoft/SpeechT5/tree/main/VATLM +# Code based on fairseq: https://github.com/facebookresearch/fairseq and av_hubert: https://github.com/facebookresearch/av_hubert +# +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# ---------------------------------------------------------------------------- + +import logging +import os, glob +import sys +from typing import Dict, List, Optional, Tuple + +import numpy as np + +from dataclasses import dataclass, field +from fairseq import metrics, search +from fairseq.data import Dictionary, encoders +from fairseq.dataclass.configs import FairseqDataclass +from fairseq.tasks import register_task +from fairseq.tasks.fairseq_task import FairseqTask +from omegaconf import MISSING, II +import numpy as np +from argparse import Namespace + +DBG=True if len(sys.argv) == 1 else False + +if DBG: + from vathubert.data.vathubert_dataset import VATHubertDataset + from vathubert.sequence_generator import SequenceGenerator +else: + + from vathubert.data.vathubert_dataset import VATHubertDataset + from vathubert.sequence_generator import SequenceGenerator + from vathubert.data.audiohubert_dataset import AudioHubertDataset + from vathubert.data.texthubert_dataset import TextHubertDataset + from vathubert.data.onlyaudiohubert_dataset import OnlyAudioHubertDataset + +from fairseq.data.audio.multi_corpus_dataset_audio import MultiCorpusDataset +from collections import OrderedDict +from fairseq.data import FairseqDataset +from fairseq.data import data_utils +from fairseq.data import iterators + + +logger = logging.getLogger(__name__) + + +class LabelEncoder(object): + def __init__(self, dictionary: Dictionary) -> None: + self.dictionary = dictionary + + def __call__(self, label: str) -> List[str]: + return self.dictionary.encode_line( + label, append_eos=False, add_if_not_exist=False, + ) + +class LabelEncoderS2SToken(object): + def __init__(self, dictionary: Dictionary, bpe_tokenizer) -> None: + self.bpe_tokenizer = bpe_tokenizer + self.dictionary = dictionary + + def __call__(self, label: str) -> List[str]: + label = self.bpe_tokenizer.encode(label.lower()) + return self.dictionary.encode_line( + label, append_eos=True, add_if_not_exist=False, + ).long() + + def decode(self, tok, symbols_ignore=None): + tok = self.dictionary.string(tok, extra_symbols_to_ignore=symbols_ignore) + if self.bpe_tokenizer: + tok = self.bpe_tokenizer.decode(tok) + return tok + +@dataclass +class VATHubertPretrainingConfig(FairseqDataclass): + data: str = field( + default=MISSING, metadata={"help": "path to data directory"} + ) + labels: List[str] = field( + default_factory=lambda: ["ltr"], + metadata={ + "help": ( + "extension of the label files to load, frame-level labels for" + " pre-training, and sequence-level label for fine-tuning" + ) + }, + ) + label_dir: Optional[str] = field( + default=None, + metadata={ + "help": "if set, looks for labels in this directory instead", + }, + ) + label_rate: int = field( + default=-1, + metadata={"help": "label frame rate. -1 for sequence label"}, + ) + + sample_rate: int = field( + default=16_000, + metadata={ + "help": "target sample rate. audio files will be up/down " + "sampled to this rate" + }, + ) + normalize: bool = field( + default=False, + metadata={ + "help": "if set, normalizes input to have 0 mean and unit variance" + }, + ) + enable_padding: bool = field( + default=False, + metadata={"help": "pad shorter samples instead of cropping"}, + ) + max_sample_size: Optional[int] = field( + default=None, + metadata={"help": "max sample size to keep in training"}, + ) + min_sample_size: Optional[int] = field( + default=None, + metadata={"help": "min sample size to keep in training"}, + ) + max_trim_sample_size: Optional[int] = field( + default=II("task.max_sample_size"), + metadata={"help": "max sample size to trim to for batching"}, + ) + single_target: Optional[bool] = field( + default=False, + metadata={ + "help": "if set, AddTargetDatasets outputs same keys " + "as AddTargetDataset" + }, + ) + random_crop: Optional[bool] = field( + default=True, + metadata={"help": "always crop from the beginning if false"}, + ) + pad_audio: Optional[bool] = field( + default=False, + metadata={"help": "pad audio to the longest one in the batch if true"}, + ) + pdb: Optional[bool] = field( + default=False, + metadata={"help": "pdb"}, + ) + stack_order_audio: int = field( + default=1, + metadata={"help": "concatenate n consecutive audio frames for one step"}, + ) + skip_verify: Optional[bool] = field( + default=False, + metadata={"help": "skip verifying label-audio alignment"}, + ) + + text_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based text resampling." + "(alpha = 1 for no resampling)" + }, + ) + split_modality_batch: bool = field( + default=False, + metadata={"help": "whether create all samples of different modalities in a batch"}, + ) + image_aug: bool = field(default=False, metadata={'help': 'image data augmentation'}) + image_crop_size: int = field( + default=88, metadata={"help": "image ROI size"}) + image_mean: float = field( + default=0.421, metadata={"help": "image mean"}) + image_std: float = field( + default=0.165, metadata={"help": "image std"}) + modalities: Optional[List[str]] = field(default_factory=lambda: ["audio", "video"], metadata={'help': 'modalities to load'}) + is_s2s: bool=field(default=False, metadata={'help': 'seq2seq fine-tuning only'}) + tokenizer_bpe_name: Optional[str] = field(default=None, metadata={'help': 'tokenizer model name'}) + tokenizer_bpe_model: Optional[str] = field(default=None, metadata={'help': 'tokenizer model path'}) + noise_wav: Optional[str] = field(default=None, metadata={'help': 'manifest of noise wav files (one wav file path per line)'}) + noise_prob: float = field(default=0, metadata={'help': 'noise probability'}) + noise_snr: Optional[str] = field(default='0', metadata={'help': 'noise SNR in audio'}) + noise_num: int = field(default=1, metadata={'help': 'number of noise wav files to mix'}) + fine_tuning: bool = field(default=False, metadata={"help": "set to true if fine-tuning AV-Hubert"}) + use_supervised_data: bool = field(default=True, metadata={"help": "use paired speech-text data"}) + sup_data_path: Optional[str] = field( + default=None, + metadata={ + "help": "supervised dataset path", + }, + ) + sup_manifest: Optional[str] = field( + default=None, + metadata={ + "help": "supervised dataset manifest", + }, + ) + sample_distributions: Optional[str] = field(default='0', metadata={'help': 'sample distribution'}) + ########### + use_extra_textdata: bool = field(default=True, metadata={"help": "use extra text data"}) + onlytext_manifest: Optional[str] = field( + default=None, + metadata={ + "help": "text-only dataset manifest", + }, + ) + use_extra_audiodata: bool = field(default=True, metadata={"help": "use extra audio data"}) + onlyaudio_manifest: Optional[str] = field( + default=None, + metadata={ + "help": "audio-only dataset manifest", + }, + ) + +@register_task("vat_hubert_pretraining", dataclass=VATHubertPretrainingConfig) +class VATHubertPretrainingTask(FairseqTask): + + cfg: VATHubertPretrainingConfig + + def __init__( + self, + cfg: VATHubertPretrainingConfig, + ) -> None: + super().__init__(cfg) + + logger.info(f"current directory is {os.getcwd()}") + logger.info(f"VATHubertPretrainingTask Config {cfg}") + + self.state.add_factory("phone_dictionary", self.load_phone_dictionaries) + # self.state.add_factory("s2s_tokenizer", self.load_tokenizer) + + self.fine_tuning = cfg.fine_tuning + if cfg.fine_tuning: + self.state.add_factory("target_dictionary", self.load_dictionaries) + if cfg.is_s2s: + self.state.add_factory("s2s_tokenizer", self.load_tokenizer) + else: + self.state.add_factory("dictionaries", self.load_dictionaries) + + + + self.blank_symbol = "<s>" + + @property + def source_dictionary(self) -> Optional[Dictionary]: + return None # self._source_dictionary + + @property + def target_dictionary(self) -> Optional[Dictionary]: + return self.state.target_dictionary # self._target_dictionary + + @property + def dictionaries(self) -> List[Dictionary]: + return self.state.dictionaries + + @property + def phone_dictionary(self) -> List[Dictionary]: + return self.state.phone_dictionary + + + def load_dictionaries(self): + label_dir = self.cfg.data if self.cfg.label_dir is None else self.cfg.label_dir + dictionaries = [ + Dictionary.load(f"{label_dir}/dict.{label}.txt") + for label in self.cfg.labels + ] + return dictionaries[0] if self.cfg.fine_tuning else dictionaries + + def load_tokenizer(self): + logger.info(f"Using tokenizer") + bpe_args = Namespace(**{'bpe': self.cfg.tokenizer_bpe_name, f"{self.cfg.tokenizer_bpe_name}_model": self.cfg.tokenizer_bpe_model}) + bpe_tokenizer = encoders.build_bpe(bpe_args) + return bpe_tokenizer + + def load_phone_dictionaries(self): + dictionaries = [ + Dictionary.load(f"{self.cfg.sup_manifest}/dict.phn.txt") + ] + return dictionaries + + + @property + def s2s_tokenizer(self): + return self.state.s2s_tokenizer + + @classmethod + def setup_task( + cls, cfg: VATHubertPretrainingConfig, **kwargs + ) -> "VATHubertPretrainingTask": + if cfg.pdb: + import pdb + pdb.set_trace() + return cls(cfg) + + def get_label_dir(self) -> str: + if self.cfg.label_dir is None: + return self.cfg.data + return self.cfg.label_dir + + def load_dataset(self, split: str, epoch=1, **kwargs) -> None: + manifest = f"{self.cfg.data}/{split}.tsv" + dictionaries = [self.target_dictionary] if self.fine_tuning else self.dictionaries + pad_list = [dictionary.pad() for dictionary in dictionaries] # [1], blank应该是[0] + eos_list = [dictionary.eos() for dictionary in dictionaries] # [2] + if not self.cfg.is_s2s: + procs = [LabelEncoder(dictionary) for dictionary in dictionaries] + else: + logger.info(f"Using tokenizer") + bpe_tokenizer = self.s2s_tokenizer + procs = [LabelEncoderS2SToken(dictionary, bpe_tokenizer) for dictionary in dictionaries] + paths = [ + f"{self.get_label_dir()}/{split}.{l}" for l in self.cfg.labels + ] + image_aug = self.cfg.image_aug if split == 'train' else False + noise_fn, noise_snr = f"{self.cfg.noise_wav}/{split}.tsv" if self.cfg.noise_wav is not None else None, eval(self.cfg.noise_snr) + noise_num = self.cfg.noise_num # + + all_datasets = [] + avdatasets = VATHubertDataset( + manifest, + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_sample_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_trim_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=False, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + stack_order_audio=self.cfg.stack_order_audio, + skip_verify=self.cfg.skip_verify, + image_mean=self.cfg.image_mean, + image_std=self.cfg.image_std, + image_crop_size=self.cfg.image_crop_size, + image_aug=image_aug, + modalities=self.cfg.modalities, + is_s2s=self.cfg.is_s2s, + noise_fn=noise_fn, + noise_prob=self.cfg.noise_prob, + noise_snr=noise_snr, + noise_num=noise_num + ) + all_datasets.append(avdatasets) + + # import pdb + # pdb.set_trace() + + if self.cfg.use_supervised_data: + sup_manifest = f"{self.cfg.sup_manifest}/{split}.tsv" + + sup_paths = [ + f"{self.cfg.sup_data_path}/{split}.{l}" for l in self.cfg.labels + ] + + phone_dictionaries = self.phone_dictionary + phone_procs = [LabelEncoder(dictionary) for dictionary in phone_dictionaries] + + atdatasets = AudioHubertDataset( + sup_manifest, + sample_rate=self.cfg.sample_rate, + label_paths=sup_paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + phone_sequence_processors=phone_procs, + max_keep_sample_size=self.cfg.max_sample_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_trim_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=True, + single_target=self.cfg.single_target, + stack_order_audio=self.cfg.stack_order_audio, + skip_verify=self.cfg.skip_verify, + is_s2s=self.cfg.is_s2s, + ) + all_datasets.append(atdatasets) + + if self.cfg.use_extra_textdata: + extra_text_manifest = f"{self.cfg.onlytext_manifest}/{split}.tsv" + extra_text_paths = [ + f"{self.cfg.onlytext_manifest}/{split}.{l}" for l in self.cfg.labels + ] + + # import pdb + # pdb.set_trace() + + textdatasets = TextHubertDataset( + extra_text_manifest, + sample_rate=self.cfg.sample_rate, + label_paths=extra_text_paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + phone_sequence_processors=phone_procs, + max_keep_sample_size=self.cfg.max_sample_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_trim_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=True, + single_target=self.cfg.single_target, + stack_order_audio=self.cfg.stack_order_audio, + skip_verify=self.cfg.skip_verify, + is_s2s=self.cfg.is_s2s, + ) + all_datasets.append(textdatasets) + + if self.cfg.use_extra_audiodata: + extra_audio_manifest = f"{self.cfg.onlyaudio_manifest}/{split}.tsv" + extra_audio_paths = [ + f"{self.cfg.onlyaudio_manifest}/{split}.{l}" for l in self.cfg.labels + ] + + audiodatasets = OnlyAudioHubertDataset( + extra_audio_manifest, + sample_rate=self.cfg.sample_rate, + label_paths=extra_audio_paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_sample_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_trim_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=False, + single_target=self.cfg.single_target, + stack_order_audio=self.cfg.stack_order_audio, + skip_verify=self.cfg.skip_verify, + is_s2s=self.cfg.is_s2s, + ) + all_datasets.append(audiodatasets) + + + + + dataset_list = all_datasets + dataset_dict = OrderedDict((name, d) for name, d in zip(["videoaudio", "audiotext", "onlytext", "onlyaudio"], dataset_list) if d is not None) + if not self.fine_tuning: + max_positions_dict = { + "videoaudio": 1024, + "audiotext": 1024, + "onlytext": 1024, + "onlyaudio": 1024, + } + max_positions_dict = OrderedDict((name, max_positions_dict[name]) for name in dataset_dict.keys()) + + max_tokens_ratios_dict = { + "videoaudio": 1.0, + "audiotext": 1.0, + "onlytext": 1.0, + "onlyaudio": 1.0, + } + max_tokens_ratios = [max_tokens_ratios_dict[name] for name in dataset_dict.keys()] + dataset_lens = np.array([len(dataset) for dataset in dataset_dict.values()]) + dataset_avg_sample_lens = np.array([ + sum([dataset.num_tokens(i) for i in np.random.randint(low=0, high=len(dataset), size=10000)]) / 10000.0 + for dataset in dataset_dict.values() + ]) + distributions = [eval(self.cfg.sample_distributions)[0], eval(self.cfg.sample_distributions)[1], eval(self.cfg.sample_distributions)[2], eval(self.cfg.sample_distributions)[3]] + + + + logging.info(f"Number samples of datasets is {dataset_lens}") + logging.info(f"Avg sample length of datasets is {dataset_avg_sample_lens}") + logging.info(f"Sampling distributions is {distributions}") + logging.info(f"Maxtokens ratio is {max_tokens_ratios}") + logging.info(f"split_modality_batch is {self.cfg.split_modality_batch}") + + + self.datasets[split] = MultiCorpusDataset( + dataset_dict, + max_positions=max_positions_dict, + distribution=distributions, + max_tokens_ratio=max_tokens_ratios, + seed=1234, + sort_indices=True, + ) + + if self.fine_tuning: + self.datasets[split] = VATHubertDataset( + manifest, + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_sample_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_trim_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=False, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + stack_order_audio=self.cfg.stack_order_audio, + skip_verify=self.cfg.skip_verify, + image_mean=self.cfg.image_mean, + image_std=self.cfg.image_std, + image_crop_size=self.cfg.image_crop_size, + image_aug=image_aug, + modalities=self.cfg.modalities, + is_s2s=self.cfg.is_s2s, + noise_fn=noise_fn, + noise_prob=self.cfg.noise_prob, + noise_snr=noise_snr, + noise_num=noise_num + ) + + # @classmethod + # def _get_size_ratios(cls, ids: List[str], sizes: List[int], alpha: float = 1.0): + # """Size ratios for temperature-based sampling + # (https://arxiv.org/abs/1907.05019)""" + # _sizes = np.array(sizes) + # prob = _sizes / _sizes.sum() + # smoothed_prob = prob ** alpha + # smoothed_prob = smoothed_prob / smoothed_prob.sum() + # size_ratio = (smoothed_prob * _sizes.sum()) / _sizes + + # o_str = str({_i: f"{prob[i]:.3f}" for i, _i in enumerate(ids)}) + # logger.info(f"original sampling probability: {o_str}") + # p_str = str({_i: f"{smoothed_prob[i]:.3f}" for i, _i in enumerate(ids)}) + # logger.info(f"balanced sampling probability: {p_str}") + # sr_str = str({_id: f"{size_ratio[i]:.3f}" for i, _id in enumerate(ids)}) + # logger.info(f"balanced sampling size ratio: {sr_str}") + # return size_ratio.tolist() + + + # def resample_multi_modality_dataset(self, speech_dataset, paired_datasets, epoch=1, train=True): + + # if len(paired_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + # size_ratios = self._get_size_ratios( + # paired_splits, [len(s) for s in paired_datasets], alpha=self.cfg.text_sampling_alpha + # ) + # paired_datasets = [ + # ResamplingDataset( + # d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + # ) for d, r in zip(paired_datasets, size_ratios) + # ] + + # dataset_list = [speech_dataset] + # for datasets in [paired_datasets]: + # if len(datasets) > 1: + # dataset_list.append(ConcatDataset(datasets)) + # elif len(datasets) == 1: + # dataset_list.append(datasets[0]) + # else: + # dataset_list.append(None) + + # ### match speech/text datasets according to modality + # dataset_dict = OrderedDict((name, d) for name, d in zip(["speech", "speech_sup", "text_mono", "text_paired"], dataset_list) if d is not None) + # max_positions_dict = { + # "speech": None, + # "speech_sup": None, + # "text_mono": (1024, 1024), + # "text_paired": (1024, 1024), + # } + # max_positions_dict = OrderedDict((name, max_positions_dict[name]) for name in dataset_dict.keys()) + # max_tokens_ratios_dict = { + # "speech": 1.0, + # "speech_sup": 1.0, + # "text_mono": 1.0 / 320 / 1.0, + # "text_paired": 1.0 / 320 / 1.0, + # } + # max_tokens_ratios = [max_tokens_ratios_dict[name] for name in dataset_dict.keys()] + # dataset_lens = np.array([len(dataset) for dataset in dataset_dict.values()]) + # dataset_avg_sample_lens = np.array([ + # sum([dataset.num_tokens(i) for i in np.random.randint(low=0, high=len(dataset), size=10000)]) / 10000.0 + # for dataset in dataset_dict.values() + # ]) + + # if not "speech" in dataset_dict: + # distributions = [l / sum(dataset_lens) for l in dataset_lens] + # else: + # ## we just keep the batches of speech and non-speech the same, expand_coef is to ensure speech batches is less than others + # first_ratio = dataset_lens[0] / sum(dataset_lens) + # expand_coef = 1.8 if sup_dataset is None else 1.1 * sum(dataset_lens[0:2]) / dataset_lens[0] + # distributions = [expand_coef * max_tokens_ratios[i] * dataset_avg_sample_lens[0] / l for (i, l) in enumerate(dataset_avg_sample_lens)] + # distributions[0] = 1.0 + # if sup_dataset is not None: + # distributions[1] = dataset_lens[1] / dataset_lens[0] + # distributions = [first_ratio * d for d in distributions] + + # logging.info(f"Number samples of datasets is {dataset_lens}") + # logging.info(f"Avg sample length of datasets is {dataset_avg_sample_lens}") + # logging.info(f"Sampling distributions is {distributions}") + # logging.info(f"Maxtokens ratio is {max_tokens_ratios}") + # return dataset_dict, max_positions_dict, distributions, max_tokens_ratios + + + def max_positions(self) -> Tuple[int, int]: + return (sys.maxsize, sys.maxsize) + + def filter_indices_by_size( + self, indices: np.array, *args, **kwargs + ) -> np.array: + return indices + + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + skip_remainder_batch=False, + grouped_shuffling=False, + update_epoch_batch_itr=False, + ): + """ + Get an iterator that yields batches of data from the given dataset. + Args: + dataset (~fairseq.data.FairseqDataset): dataset to batch + max_tokens (int, optional): max number of tokens in each batch + (default: None). + max_sentences (int, optional): max number of sentences in each + batch (default: None). + max_positions (optional): max sentence length supported by the + model (default: None). + ignore_invalid_inputs (bool, optional): don't raise Exception for + sentences that are too long (default: False). + required_batch_size_multiple (int, optional): require batch size to + be a multiple of N (default: 1). + seed (int, optional): seed for random number generator for + reproducibility (default: 1). + num_shards (int, optional): shard the data iterator into N + shards (default: 1). + shard_id (int, optional): which shard of the data iterator to + return (default: 0). + num_workers (int, optional): how many subprocesses to use for data + loading. 0 means the data will be loaded in the main process + (default: 0). + epoch (int, optional): the epoch to start the iterator from + (default: 1). + data_buffer_size (int, optional): number of batches to + preload (default: 0). + disable_iterator_cache (bool, optional): don't cache the + EpochBatchIterator (ignores `FairseqTask::can_reuse_epoch_itr`) + (default: False). + skip_remainder_batch (bool, optional): if set, discard the last + batch in each training epoch, as the last batch is often smaller than + local_batch_size * distributed_word_size (default: ``True``). + grouped_shuffling (bool, optional): group batches with each groups + containing num_shards batches and shuffle groups. Reduces difference + between sequence lengths among workers for batches sorted by length. + update_epoch_batch_itr (bool optional): if true then donot use the cached + batch iterator for the epoch + + Returns: + ~fairseq.iterators.EpochBatchIterator: a batched iterator over the + given dataset split + """ + + if self.fine_tuning or not isinstance(dataset, MultiCorpusDataset): + return super().get_batch_iterator( + dataset, + max_tokens=max_tokens, + max_sentences=max_sentences, + max_positions=max_positions, + ignore_invalid_inputs=ignore_invalid_inputs, + required_batch_size_multiple=required_batch_size_multiple, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + data_buffer_size=data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + ) + logging.info(f"num_workers is {num_workers}") + can_reuse_epoch_itr = ( + not disable_iterator_cache + and not update_epoch_batch_itr + and self.can_reuse_epoch_itr(dataset) + ) + if can_reuse_epoch_itr and dataset in self.dataset_to_epoch_iter: + logger.debug("reusing EpochBatchIterator for epoch {}".format(epoch)) + return self.dataset_to_epoch_iter[dataset] + + assert isinstance(dataset, FairseqDataset) + + # initialize the dataset with the correct starting epoch + dataset.set_epoch(epoch) + + # get indices ordered by example size + with data_utils.numpy_seed(seed): + indices = dataset.ordered_indices() + + # filter examples that are too large + if max_positions is not None: + indices = self.filter_indices_by_size( + indices, dataset, max_positions, ignore_invalid_inputs + ) + + # create mini-batches with given size constraints + batch_sampler = dataset.get_batch_sampler( + indices, + num_shards, + seed, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + split_modality_batch=self.cfg.split_modality_batch, + ) + + # return a reusable, sharded iterator + + epoch_iter = iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + disable_shuffling=True, + ) + + if can_reuse_epoch_itr: + self.dataset_to_epoch_iter[dataset] = epoch_iter + + return epoch_iter + + + def build_generator( + self, models, args, seq_gen_cls=None, extra_gen_cls_kwargs=None, prefix_allowed_tokens_fn=None, + ): + """ + Build a :class:`~fairseq.SequenceGenerator` instance for this + task. + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + args (fairseq.dataclass.configs.GenerationConfig): + configuration object (dataclass) for generation + extra_gen_cls_kwargs (Dict[str, Any]): extra options to pass + through to SequenceGenerator + prefix_allowed_tokens_fn (Callable[[int, torch.Tensor], List[int]]): + If provided, this function constrains the beam search to + allowed tokens only at each step. The provided function + should take 2 arguments: the batch ID (`batch_id: int`) + and a unidimensional tensor of token ids (`inputs_ids: + torch.Tensor`). It has to return a `List[int]` with the + allowed tokens for the next generation step conditioned + on the previously generated tokens (`inputs_ids`) and + the batch ID (`batch_id`). This argument is useful for + constrained generation conditioned on the prefix, as + described in "Autoregressive Entity Retrieval" + (https://arxiv.org/abs/2010.00904) and + https://github.com/facebookresearch/GENRE. + """ + if getattr(args, "score_reference", False): + from fairseq.sequence_scorer import SequenceScorer + + return SequenceScorer( + self.target_dictionary, + compute_alignment=getattr(args, "print_alignment", False), + ) + + # Choose search strategy. Defaults to Beam Search. + sampling = getattr(args, "sampling", False) + sampling_topk = getattr(args, "sampling_topk", -1) + sampling_topp = getattr(args, "sampling_topp", -1.0) + diverse_beam_groups = getattr(args, "diverse_beam_groups", -1) + diverse_beam_strength = getattr(args, "diverse_beam_strength", 0.5) + match_source_len = getattr(args, "match_source_len", False) + diversity_rate = getattr(args, "diversity_rate", -1) + constrained = getattr(args, "constraints", False) + if prefix_allowed_tokens_fn is None: + prefix_allowed_tokens_fn = getattr(args, "prefix_allowed_tokens_fn", None) + if ( + sum( + int(cond) + for cond in [ + sampling, + diverse_beam_groups > 0, + match_source_len, + diversity_rate > 0, + ] + ) + > 1 + ): + raise ValueError("Provided Search parameters are mutually exclusive.") + assert sampling_topk < 0 or sampling, "--sampling-topk requires --sampling" + assert sampling_topp < 0 or sampling, "--sampling-topp requires --sampling" + + if sampling: + search_strategy = search.Sampling( + self.target_dictionary, sampling_topk, sampling_topp + ) + elif diverse_beam_groups > 0: + search_strategy = search.DiverseBeamSearch( + self.target_dictionary, diverse_beam_groups, diverse_beam_strength + ) + elif match_source_len: + # this is useful for tagging applications where the output + # length should match the input length, so we hardcode the + # length constraints for simplicity + search_strategy = search.LengthConstrainedBeamSearch( + self.target_dictionary, + min_len_a=1, + min_len_b=0, + max_len_a=1, + max_len_b=0, + ) + elif diversity_rate > -1: + search_strategy = search.DiverseSiblingsSearch( + self.target_dictionary, diversity_rate + ) + elif constrained: + search_strategy = search.LexicallyConstrainedBeamSearch( + self.target_dictionary, args.constraints + ) + elif prefix_allowed_tokens_fn: + search_strategy = search.PrefixConstrainedBeamSearch( + self.target_dictionary, prefix_allowed_tokens_fn + ) + else: + search_strategy = search.BeamSearch(self.target_dictionary) + + extra_gen_cls_kwargs = extra_gen_cls_kwargs or {} + if seq_gen_cls is None: + if getattr(args, "print_alignment", False): + seq_gen_cls = SequenceGeneratorWithAlignment + extra_gen_cls_kwargs["print_alignment"] = args.print_alignment + else: + seq_gen_cls = SequenceGenerator + + return seq_gen_cls( + models, + self.target_dictionary, + beam_size=getattr(args, "beam", 5), + max_len_a=getattr(args, "max_len_a", 0), + max_len_b=getattr(args, "max_len_b", 200), + min_len=getattr(args, "min_len", 1), + normalize_scores=(not getattr(args, "unnormalized", False)), + len_penalty=getattr(args, "lenpen", 1), + unk_penalty=getattr(args, "unkpen", 0), + temperature=getattr(args, "temperature", 1.0), + match_source_len=getattr(args, "match_source_len", False), + no_repeat_ngram_size=getattr(args, "no_repeat_ngram_size", 0), + search_strategy=search_strategy, + **extra_gen_cls_kwargs, + ) diff --git a/VATLM/vat_hubert/vathubert/utils.py b/VATLM/vat_hubert/vathubert/utils.py new file mode 100644 index 0000000..60d57fa --- /dev/null +++ b/VATLM/vat_hubert/vathubert/utils.py @@ -0,0 +1,298 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# All rights reserved. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import cv2 +import torch +import random +import numpy as np +from typing import Dict, List, Optional, Tuple + +def load_video(path): + for i in range(3): + try: + cap = cv2.VideoCapture(path) + frames = [] + while True: + ret, frame = cap.read() + if ret: + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + frames.append(frame) + else: + break + frames = np.stack(frames) + return frames + except Exception: + print(f"failed loading {path} ({i} / 3)") + if i == 2: + raise ValueError(f"Unable to load {path}") + + +class Compose(object): + """Compose several preprocess together. + Args: + preprocess (list of ``Preprocess`` objects): list of preprocess to compose. + """ + + def __init__(self, preprocess): + self.preprocess = preprocess + + def __call__(self, sample): + for t in self.preprocess: + sample = t(sample) + return sample + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.preprocess: + format_string += '\n' + format_string += ' {0}'.format(t) + format_string += '\n)' + return format_string + + +class Normalize(object): + """Normalize a ndarray image with mean and standard deviation. + """ + + def __init__(self, mean, std): + self.mean = mean + self.std = std + + def __call__(self, frames): + """ + Args: + tensor (Tensor): Tensor image of size (C, H, W) to be normalized. + Returns: + Tensor: Normalized Tensor image. + """ + frames = (frames - self.mean) / self.std + return frames + + def __repr__(self): + return self.__class__.__name__+'(mean={0}, std={1})'.format(self.mean, self.std) + +class CenterCrop(object): + """Crop the given image at the center + """ + def __init__(self, size): + self.size = size + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be cropped. + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + th, tw = self.size + delta_w = int(round((w - tw))/2.) + delta_h = int(round((h - th))/2.) + frames = frames[:, delta_h:delta_h+th, delta_w:delta_w+tw] + return frames + + +class RandomCrop(object): + """Crop the given image at the center + """ + + def __init__(self, size): + self.size = size + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be cropped. + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + th, tw = self.size + delta_w = random.randint(0, w-tw) + delta_h = random.randint(0, h-th) + frames = frames[:, delta_h:delta_h+th, delta_w:delta_w+tw] + return frames + + def __repr__(self): + return self.__class__.__name__ + '(size={0})'.format(self.size) + +class HorizontalFlip(object): + """Flip image horizontally. + """ + + def __init__(self, flip_ratio): + self.flip_ratio = flip_ratio + + def __call__(self, frames): + """ + Args: + img (numpy.ndarray): Images to be flipped with a probability flip_ratio + Returns: + numpy.ndarray: Cropped image. + """ + t, h, w = frames.shape + if random.random() < self.flip_ratio: + for index in range(t): + frames[index] = cv2.flip(frames[index], 1) + return frames + +def compute_mask_indices( + shape: Tuple[int, int], + padding_mask: Optional[torch.Tensor], + mask_prob: float, + mask_length: int, + mask_type: str = "static", + mask_other: float = 0.0, + min_masks: int = 0, + no_overlap: bool = False, + min_space: int = 0, +) -> np.ndarray: + """ + Computes random mask spans for a given shape + Args: + shape: the the shape for which to compute masks. + should be of size 2 where first element is batch size and 2nd is timesteps + padding_mask: optional padding mask of the same size as shape, which will prevent masking padded elements + mask_prob: probability for each token to be chosen as start of the span to be masked. this will be multiplied by + number of timesteps divided by length of mask span to mask approximately this percentage of all elements. + however due to overlaps, the actual number will be smaller (unless no_overlap is True) + mask_type: how to compute mask lengths + static = fixed size + uniform = sample from uniform distribution [mask_other, mask_length*2] + normal = sample from normal distribution with mean mask_length and stdev mask_other. mask is min 1 element + poisson = sample from possion distribution with lambda = mask length + min_masks: minimum number of masked spans + no_overlap: if false, will switch to an alternative recursive algorithm that prevents spans from overlapping + min_space: only used if no_overlap is True, this is how many elements to keep unmasked between spans + """ + + bsz, all_sz = shape + mask = np.full((bsz, all_sz), False) + + all_num_mask = int( + # add a random number for probabilistic rounding + mask_prob * all_sz / float(mask_length) + + np.random.rand() + ) + + all_num_mask = max(min_masks, all_num_mask) + + mask_idcs = [] + for i in range(bsz): + if padding_mask is not None: + sz = all_sz - padding_mask[i].long().sum().item() + num_mask = int( + # add a random number for probabilistic rounding + mask_prob * sz / float(mask_length) + + np.random.rand() + ) + num_mask = max(min_masks, num_mask) + else: + sz = all_sz + num_mask = all_num_mask + + if mask_type == "static": + lengths = np.full(num_mask, mask_length) + elif mask_type == "uniform": + lengths = np.random.randint(mask_other, mask_length * 2 + 1, size=num_mask) + elif mask_type == "normal": + lengths = np.random.normal(mask_length, mask_other, size=num_mask) + lengths = [max(1, int(round(x))) for x in lengths] + elif mask_type == "poisson": + lengths = np.random.poisson(mask_length, size=num_mask) + lengths = [int(round(x)) for x in lengths] + else: + raise Exception("unknown mask selection " + mask_type) + + if sum(lengths) == 0: + lengths[0] = min(mask_length, sz - 1) + + if no_overlap: + mask_idc = [] + + def arrange(s, e, length, keep_length): + span_start = np.random.randint(s, e - length) + mask_idc.extend(span_start + i for i in range(length)) + + new_parts = [] + if span_start - s - min_space >= keep_length: + new_parts.append((s, span_start - min_space + 1)) + if e - span_start - keep_length - min_space > keep_length: + new_parts.append((span_start + length + min_space, e)) + return new_parts + + parts = [(0, sz)] + min_length = min(lengths) + for length in sorted(lengths, reverse=True): + lens = np.fromiter( + (e - s if e - s >= length + min_space else 0 for s, e in parts), + np.int, + ) + l_sum = np.sum(lens) + if l_sum == 0: + break + probs = lens / np.sum(lens) + c = np.random.choice(len(parts), p=probs) + s, e = parts.pop(c) + parts.extend(arrange(s, e, length, min_length)) + mask_idc = np.asarray(mask_idc) + else: + min_len = min(lengths) + if sz - min_len <= num_mask: + min_len = sz - num_mask - 1 + + mask_idc = np.random.choice(sz - min_len, num_mask, replace=False) + + mask_idc = np.asarray( + [ + mask_idc[j] + offset + for j in range(len(mask_idc)) + for offset in range(lengths[j]) + ] + ) + + mask_idcs.append(np.unique(mask_idc[mask_idc < sz])) + + min_len = min([len(m) for m in mask_idcs]) + batch_indexes, starts, ends = [], [], [] + for i, mask_idc in enumerate(mask_idcs): + if len(mask_idc) > min_len: + mask_idc = np.random.choice(mask_idc, min_len, replace=False) + mask[i, mask_idc] = True + vals, run_starts, run_lengths = find_runs(mask[i]) + start_indices, lengths = run_starts[vals == True], run_lengths[vals == True] + starts.append(start_indices) + ends.append(start_indices+lengths) + batch_indexes.append(np.zeros([len(start_indices)])+i) + return mask, np.concatenate(starts).astype(np.int64), np.concatenate(ends).astype(np.int64), np.concatenate(batch_indexes).astype(np.int64) + +def find_runs(x): + """Find runs of consecutive items in an array.""" + + # ensure array + x = np.asanyarray(x) + if x.ndim != 1: + raise ValueError('only 1D array supported') + n = x.shape[0] + + # handle empty array + if n == 0: + return np.array([]), np.array([]), np.array([]) + + else: + # find run starts + loc_run_start = np.empty(n, dtype=bool) + loc_run_start[0] = True + np.not_equal(x[:-1], x[1:], out=loc_run_start[1:]) + run_starts = np.nonzero(loc_run_start)[0] + + # find run values + run_values = x[loc_run_start] + + # find run lengths + run_lengths = np.diff(np.append(run_starts, n)) + + return run_values, run_starts, run_lengths diff --git a/WavLLM/README.md b/WavLLM/README.md new file mode 100644 index 0000000..23d5221 --- /dev/null +++ b/WavLLM/README.md @@ -0,0 +1,80 @@ +# WavLLM + +<!--**Pre-trained models for speech related tasks**--> + + [**WavLLM: Towards Robust and Adaptive Speech Large Language Model**](https://arxiv.org/abs/2404.00656) + + +- April 2024: release the code and models +- April 2024: release preprint in [arXiv](https://arxiv.org/abs/2404.00656) + +## Model +to get the WavLLM model, run +```bash +bash ./download/download.sh 0 +``` + +## Gaokao (SQA) +The audio samples and transcripts can be download using +```bash +bash ./download/download.sh 1 +``` + +The tsv file path of SQA task is [`tsv_path`](wavllm/test_data/gaokao.tsv). + +## Setup + +```bash +git submodule update --init WavLLM/fairseq +cd WavLLM/ +conda create -n wavllm python=3.10.0 +conda activate wavllm +pip install --editable fairseq/ +pip install sentencepiece +pip install transformers==4.32.1 +pip install numpy==1.23.5 +pip install editdistance +pip install soundfile +``` + +## Inference +```bash +cp -r wavllm fairseq/examples +cd fairseq +bash examples/wavllm/scripts/inference_sft.sh $model_path $data_name +``` +We provided examples of each task in [`test_data`](wavllm/test_data) + +## Examples +| Task | Audio | Prompt | Target | Output | +| :-----: | :-----: | :-----: | :-----: | :-----: | +| ASR | [`audio`](wavllm/test_data/audio/asr.flac) | Based on the attached audio, generate a comprehensive text transcription of the spoken content. | he hoped there would be stew for dinner turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick peppered flour fattened sauce | he hoped there would be stew for dinner turnips and carrots and browned potatoes and fat mutton pieces to be ladled out in thick peppered flour fattened sauce | +| SV | [`audio`](wavllm/test_data/audio/sv.wav) | Is there only one speaker in the audio clip? | Yes | Yes, there is only one speaker in the audio clip | +| ST | [`audio`](wavllm/test_data/audio/st.flac) | Translate the audio clip into German. | Sie wird schon in Ordnung sein. | Sie wird es wohl überleben. | +| ER | [`audio`](wavllm/test_data/audio/emo.wav) | Can you describe the emotional condition of the speaker in the provided audio clip? | sad | sad | +| SQA | [`audio`](wavllm/test_data/audio/sqa.wav) | What will the man do next? A. Start to take exercise; B. Do as he always does; C. Change his working time. | A | A | +| SQQA | [`audio`](wavllm/test_data/audio/sqqa.wav) | - | The fundamental theorem of calculus is a theorem that links the concept of the derivative of a function with the concept of the integral. | The fundamental theorem of calculus states that different rates of change of a function at a point in the domain of the function are equal. This theorem is used to determine the accumulation of a quantity over a given interval, and to establish relationships between different variables. It is also used to calculate derivatives, which are important in many areas such as optimization, physics, and economics. | +| II-task | [`audio`](wavllm/test_data/audio/II-task.wav) | To begin, Transcribe the audio recording into text, capturing every spoken word; Subsequently, How does the woman finally decide to go home? A. By bus; B. In the man’s car; C. In her father’s car.; Furthermore, ignore the audio clip, What is the capital of New Zealand?; Lastly, Continue the narrative of given audio clip in a coherent and engaging way | - | Here's the text from the audio recording: o no i missed the bus home it's already half past ten now i don't think there would be another bus to come don't worry i can take you home thanks but we go in different directions i'll just call my dad to pick me up\\nAddressing the prompt 'How does the woman finally decide to go home? A. By bus; B. In the man’s car; C. In her father’s car.', the answer is: C\\nThe response to 'What is the capital of New Zealand? is: The capital of New Zealand is Wellington.\\nContinuing the story, we have: The woman looked at the man with gratitude and relief. She had been worried about how she would get home after missing the bus. The man smiled and said, “It’s no problem, I can take you home.” The woman thanked him and they made their way out of the building. As they walked, the woman realized that they were going in different directions. She thanked the man again and promised to call her dad to pick her up. As they parted ways, the man wished her a good night and she walked towards her dad’s house, feeling grateful for the kindness of a stranger. | +| CoT-task | [`audio`](wavllm/test_data/audio/CoT-task.wav) | First of all, transcribe the audio recording into text, capturing every spoken word; Additionally given this audio clip and text, can you condense it into a clear, concise summary, no more than 20 words?; Lastly disregarding the sound, translate this English summary into German. | Drei Filme aus dem asiatisch-pazifischen Raum im Rennen in Cannes | The audio transcription is: three films from asia pacific are in the running for the coveted golden palms at this year's cannes film festival competing in a field dominated by european productions organizers announced monday; The audio clip have been summarized as follows: Three films from Asia-Pacific are competing for Golden Palms at this year's Cannes Film Festival, challenging European productions.; The translation of summary is: **Drei Filme aus Asien-Pazifik nehmen an diesem Jahr an den Filmfestspielen von Cannes teil und konkurrieren mit europäischen Produktionen um die Goldenen Palmen.** | +| CoT-task-story | [`audio`](wavllm/test_data/audio/CoT-task-story.wav) | First of all, transcribe the audio recording into text, capturing every spoken word; Additionally given this audio clip and text, can you condense it into a clear, concise summary, no more than 20 words?; Lastly disregarding the sound, translate this English summary into German. | Bis zum Jahr 2500 ist die Erde eine umweltfreundliche Utopie mit fortschrittlicher KI, neuronaler Vernetzung und einer perfekten Mischung aus Technologie und Natur. | The audio clip's transcription reads: in the year twenty five hundred earth gleamed like a sapphire a futuristic utopia where harmony reigned skyscrapers draped in lush greenery stretched towards the heavens their glass surfaces reflecting the tranquil azure of a pollution free sky humanity had transcended past conflicts embracing an era of shared consciousness through neural connectivity autonomous vehicles glided silently on solar paths while people mingled in serene communal spaces their basic needs met by advanced ai that predicted and catered to their every whim the great reconciliation had merged technology with nature and in this new world every individual thrived their potential limited only by the expanse of their own creativity the utopia wasn't just a place it was the pulse of civilization beating in perfect rhythm with the universe; The summary of the audio clip is: In 2500, Earth became a futuristic utopia with harmonious, pollution-free society, advanced technology, and limitless individual potential.; The summary translates to: **Im Jahr 2500 wurde die Erde zu einer futuristischen Utopie mit harmonischer Gesellschaft, reiner Umwelt, fortschrittlicher Technologie und unbegrenztem menschlichem Potenzial.** | + +## License + +This project is licensed under the license found in the LICENSE file in the root directory of this source tree. +Portions of the source code are based on the [FAIRSEQ](https://github.com/pytorch/fairseq) and [av_hubert](https://github.com/facebookresearch/av_hubert) + +[Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct) + +## Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{hu2024wavllm, + title={WavLLM: Towards Robust and Adaptive Speech Large Language Model}, + author={Shujie Hu, Long Zhou, Shujie Liu, Sanyuan Chen, Hongkun Hao, Jing Pan, Xunying Liu, Jinyu Li, Sunit Sivasankaran, Linquan Liu, Furu Wei}, + year={2024}, + eprint={2404.00656}, + archivePrefix={arXiv}, +} +``` diff --git a/WavLLM/download/download.sh b/WavLLM/download/download.sh new file mode 100644 index 0000000..a670932 --- /dev/null +++ b/WavLLM/download/download.sh @@ -0,0 +1,26 @@ +stage=$1 +# WavLLM model +if [ "$stage" -eq 0 ]; then + url_p1="https://valle.blob.core.windows.net/share/wavllm/fi" + url_p2="nal.pt?sv=2021-10-04&st=2024-04-24T04%3A50%3A" + url_p3="15Z&se=2025-04-25T04%3A50%3A00Z&sr=b&sp=r&si" + url_p4="g=M82edjKinydPiVd86oS78ZS9L" + url_p5="TVxg0%2F2om3IaEkodIo%3D" + curl -o final.pt ${url_p1}${url_p2}${url_p3}${url_p4}${url_p5} +else + # gaokao_audio + url_p1="https://valle.blob.core.windows.net/share/wavllm/ga" + url_p2="okao_audio.zip?sv=2021-10-04&st=2024-04-24T04%3A58%3A" + url_p3="56Z&se=2025-04-25T04%3A58%3A00Z&sr=b&sp=r&s" + url_p4="ig=0ql1dkz59%2FSxRHkz1ajtC" + url_p5="yfCR5Hva4UISlIfDrOO%2BRc%3D" + curl -o gaokao_audio.zip ${url_p1}${url_p2}${url_p3}${url_p4}${url_p5} + + # gaokao_transcript + url_p1="https://valle.blob.core.windows.net/share/wavllm/ga" + url_p2="okao_text.zip?sv=2021-10-04&st=2024-04-24T04%3A57%3A" + url_p3="37Z&se=2025-04-25T04%3A57%3A00Z&sr=b&sp=r&s" + url_p4="ig=n5QKXU3F9RiP6SxHl6uVEJ" + url_p5="8m7WZ3iEeOGns1BoIozvI%3D" + curl -o gaokao_text.zip ${url_p1}${url_p2}${url_p3}${url_p4}${url_p5} +fi \ No newline at end of file diff --git a/WavLLM/wavllm/__init__.py b/WavLLM/wavllm/__init__.py new file mode 100644 index 0000000..2ab47a2 --- /dev/null +++ b/WavLLM/wavllm/__init__.py @@ -0,0 +1 @@ +from . import criterions diff --git a/WavLLM/wavllm/criterions/cross_entropy_acc.py b/WavLLM/wavllm/criterions/cross_entropy_acc.py new file mode 100644 index 0000000..6a97fb6 --- /dev/null +++ b/WavLLM/wavllm/criterions/cross_entropy_acc.py @@ -0,0 +1,120 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +from dataclasses import dataclass + +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.dataclass import FairseqDataclass +from omegaconf import II +import torch + + +@dataclass +class CrossEntropyAccuracyCriterionConfig(FairseqDataclass): + sentence_avg: bool = II("optimization.sentence_avg") + + +@register_criterion("cross_entropy_acc", dataclass=CrossEntropyAccuracyCriterionConfig) +class CrossEntropyAccuracyCriterion(FairseqCriterion): + def __init__(self, task, sentence_avg): + super().__init__(task) + self.sentence_avg = sentence_avg + + def forward(self, model, sample, reduce=True): + """Compute the loss for the given sample. + + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + #print ("self.padding_idx: ", self.padding_idx) # pad_id is 0 (unk_id is 0 in LLaMA) + net_output = model(**sample["net_input"]) + + loss, lprobs, target = self.compute_loss(model, net_output, sample, reduce=reduce) + ## cal acoustic accuracy + mask = target != self.padding_idx + correct = torch.sum(lprobs.argmax(1).masked_select(mask) == target.masked_select(mask)) + total = torch.sum(mask) + + + sample_size = ( + sample["target"].size(0) if self.sentence_avg else sample["ntokens"] + ) + logging_output = { + "loss": loss.data, + "correct": correct, + "total": total, + "ntokens": sample["ntokens"], + "nsentences": sample["target"].size(0), + "sample_size": sample_size, + } + return loss, sample_size, logging_output + + def compute_loss(self, model, net_output, sample, reduce=True): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + lprobs = lprobs.view(-1, lprobs.size(-1)) + target = model.get_targets(sample, net_output).view(-1) + loss = F.nll_loss( + lprobs, + target, + ignore_index=self.padding_idx, + reduction="sum" if reduce else "none", + ) + # if net_output[0][1] is not None: + # cosine_loss = 1 - F.cosine_similarity(net_output[0][1], net_output[0][2], dim=-1).mean() + # loss = loss + cosine_loss + return loss, lprobs, target + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + correct_sum = utils.item(sum(log.get("correct", 0) for log in logging_outputs)) + total_sum = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + + # we divide by log(2) to convert the loss from base e to base 2 + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + if total_sum > 0: + metrics.log_scalar("total_sum", total_sum) + metrics.log_scalar("correct_sum", correct_sum) + metrics.log_derived( + "accuracy", + lambda meters: round( + meters["correct_sum"].sum * 100.0 / meters["total_sum"].sum, 3 + ) + if meters["total_sum"].sum > 0 + else float("nan"), + ) + + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True \ No newline at end of file diff --git a/WavLLM/wavllm/data/speechllm_dataset.py b/WavLLM/wavllm/data/speechllm_dataset.py new file mode 100644 index 0000000..42cb8f4 --- /dev/null +++ b/WavLLM/wavllm/data/speechllm_dataset.py @@ -0,0 +1,678 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import csv +import io +import logging +import re +import time +from collections import defaultdict +from pathlib import Path +from typing import Dict, List, Optional +from dataclasses import dataclass + +import numpy as np +import torch +from fairseq.data import ( + ConcatDataset, + Dictionary, + FairseqDataset, + ResamplingDataset, + data_utils as fairseq_data_utils, +) +from fairseq.data.audio.audio_utils import ( + get_fbank, + get_waveform, + read_from_stored_zip, + is_npy_data, + is_sf_audio_data, + parse_path, + FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS, +) +from fairseq.data.audio.feature_transforms import CompositeAudioFeatureTransform +#from fairseq.data.audio.data_cfg import S2TDataConfig as SpeechLLMDataConfig + +import os +from sentencepiece import SentencePieceProcessor +from copy import deepcopy + +import torchaudio + +logger = logging.getLogger(__name__) + + +def get_features_from_npy_or_audio(path): + ext = Path(path).suffix + if ext not in FEATURE_OR_SF_AUDIO_FILE_EXTENSIONS: + raise ValueError(f'Unsupported file format for "{path}"') + return np.load(path) if ext == ".npy" else get_fbank(path) + + +def get_features_or_waveform_from_stored_zip( + path, + byte_offset, + byte_size, + need_waveform=False, + use_sample_rate=None, +): + assert path.endswith(".zip") + data = read_from_stored_zip(path, byte_offset, byte_size) + f = io.BytesIO(data) + if is_npy_data(data): + features_or_waveform = np.load(f) + elif is_sf_audio_data(data): + features_or_waveform = ( + get_waveform(f, always_2d=False, output_sample_rate=use_sample_rate)[0] + if need_waveform + else get_fbank(f) + ) + else: + raise ValueError(f'Unknown file format for "{path}"') + return features_or_waveform + + +def get_features_or_waveform(path: str, need_waveform=False, use_sample_rate=None): + """Get speech features from .npy file or waveform from .wav/.flac file. + The file may be inside an uncompressed ZIP file and is accessed via byte + offset and length. + + Args: + path (str): File path in the format of "<.npy/.wav/.flac path>" or + "<zip path>:<byte offset>:<byte length>". + need_waveform (bool): return waveform instead of features. + use_sample_rate (int): change sample rate for the input wave file + + Returns: + features_or_waveform (numpy.ndarray): speech features or waveform. + """ + _path, slice_ptr = parse_path(path) + # print(_path) + if len(slice_ptr) == 0: + if need_waveform: + return get_waveform( + _path, always_2d=False, output_sample_rate=use_sample_rate + )[0] + return get_features_from_npy_or_audio(_path) + elif len(slice_ptr) == 2: + features_or_waveform = get_features_or_waveform_from_stored_zip( + _path, + slice_ptr[0], + slice_ptr[1], + need_waveform=need_waveform, + use_sample_rate=use_sample_rate, + ) + else: + raise ValueError(f"Invalid path: {path}") + + return features_or_waveform + + +def _collate_frames( + frames: List[torch.Tensor], is_audio_input: bool = False +) -> torch.Tensor: + """ + Convert a list of 2D frames into a padded 3D tensor + Args: + frames (list): list of 2D frames of size L[i]*f_dim. Where L[i] is + length of i-th frame and f_dim is static dimension of features + Returns: + 3D tensor of size len(frames)*len_max*f_dim where len_max is max of L[i] + """ + max_len = max(frame.size(0) for frame in frames) + if is_audio_input: + out = frames[0].new_zeros((len(frames), max_len)) + else: + out = frames[0].new_zeros((len(frames), max_len, frames[0].size(1))) + for i, v in enumerate(frames): + out[i, : v.size(0)] = v + return out + +def _collate_frames_pad_number( + frames: List[torch.Tensor], pad_number +) -> torch.Tensor: + max_len = max(frame.size(1) for frame in frames) + # max_len = 2250 # all pad to 30s + out = frames[0].new_ones((len(frames), frames[0].size(0), max_len)) * pad_number + + for i, v in enumerate(frames): + out[i, :, : v.size(1)] = v + return out + + +@dataclass +class SpeechLLMDatasetItem(object): + index: int + source: torch.Tensor + target: Optional[torch.Tensor] = None + left_prompt: Optional[torch.Tensor] = None + speaker_id: Optional[int] = None + target_mask: Optional[bool] = None + prompt_mask: Optional[bool] = None + left_prompt_mask: Optional[bool] = None + speech_flag: bool = None + speech_mask: Optional[bool] = None + audio_codec: Optional[torch.Tensor] = None + mid_prompt: Optional[torch.Tensor] = None + mid_prompt_mask: Optional[bool] = None + example_source: Optional[torch.Tensor] = None + example_speech_mask: Optional[bool] = None + example_audio_codec: Optional[torch.Tensor] = None + lora_scale: Optional[torch.Tensor] = None + orig_prompt: Optional[torch.Tensor] = None + wavlm_sources: Optional[torch.Tensor] = None + wavlm_speech_mask: Optional[bool] = None + example_wavlm_sources: Optional[torch.Tensor] = None + example_wavlm_speech_mask: Optional[bool] = None + +class SpeechLLMDataset(FairseqDataset): + LANG_TAG_TEMPLATE = "<lang:{}>" + + def __init__( + self, + cfg, + data_root: str, + split: str, + is_train_split: bool, + text_tokenizer=None, + audio_processor=None, + wavlm_processor=None, + n_frames_per_step=1, + append_eos=True, + ): + samples = self._load_samples_from_tsv(data_root, split) + KEY_ID, KEY_AUDIO, KEY_N_FRAMES = "id", "audio", "n_frames" + KEY_PROMPT_TEXT, KEY_TGT_TEXT = "prompt", "tgt_text" + + START_FRAME, END_FRAME = "start_frame", "end_frame" + + WITH_SPEECH = "with_speech" + + audio_root = Path(cfg.audio_root) + + ids = [s[KEY_ID] for s in samples] + audio_paths = [(audio_root / s[KEY_AUDIO]).as_posix() for s in samples] + n_frames = [int(s[KEY_N_FRAMES]) for s in samples] + prompt_texts = [s[KEY_PROMPT_TEXT] for s in samples] + tgt_texts = [s[KEY_TGT_TEXT] for s in samples] + + if START_FRAME in samples[0]: + start_frames = [s[START_FRAME] for s in samples] + self.start_frames = start_frames + else: + self.start_frames = None + + if END_FRAME in samples[0]: + end_frames = [s[END_FRAME] for s in samples] + self.end_frames = end_frames + else: + self.end_frames = None + + self.split, self.is_train_split = split, is_train_split + self.cfg = cfg + self.audio_paths, self.n_frames = audio_paths, n_frames + self.n_samples = len(audio_paths) + assert len(n_frames) == self.n_samples > 0 + assert prompt_texts is None or len(prompt_texts) == self.n_samples + assert tgt_texts is None or len(tgt_texts) == self.n_samples + assert ids is None or len(ids) == self.n_samples + + if cfg.alpaca_text: + speech_flag = [s[WITH_SPEECH] for s in samples] + assert speech_flag is None or len(speech_flag) == self.n_samples + self.speech_flag = speech_flag + + if cfg.prompt_bulid: + self.B_INST = "[INST]" + self.B_SYS = "<<SYS>>\n" + self.SYSTEM = "As a helpful language and speech assistant, you are able to understand the speech content provided by the user, and assist the user with a variety of tasks using natural language." + self.E_SYS = "\n<</SYS>>\n\n" + self.E_INST = "[/INST]" + self.B_SPEECH = "<SPEECH>" + self.E_SPEECH = "</SPEECH>" + self.B_EXAMPLE = "<EXAMPLE>" + self.E_EXAMPLE = "</EXAMPLE>" + self.B_TARGET = "<TARGET>" + self.E_TARGET = "</TARGET>" + + self.tgt_texts = tgt_texts + self.prompt_texts = prompt_texts + self.ids = ids + self.shuffle = cfg.shuffle if is_train_split else False + + self.feature_transforms = None + + self.tokenizer = text_tokenizer + self.audio_processor = audio_processor + self.wavlm_processor = wavlm_processor + self.n_frames_per_step = n_frames_per_step + self.speaker_to_id = None + + self.tgt_lens = self.get_tgt_lens_and_check_oov() + self.append_eos = append_eos + + logger.info(self.__repr__()) + + def get_tgt_lens_and_check_oov(self): + if self.tgt_texts is None: + return [0 for _ in range(self.n_samples)] + tgt_lens = [] + n_tokens, n_oov_tokens = 0, 0 + for i in range(self.n_samples): + tokenized = self.get_tokenized_tgt_text(i) + # oov_tokens = [ + # t + # for t in tokenized + # if self.tgt_dict.index(t) == self.tgt_dict.unk_index + # ] + # n_tokens += len(tokenized) + # n_oov_tokens += len(oov_tokens) + tgt_lens.append(len(tokenized)) + #logger.info(f"'{self.split}' has {n_oov_tokens / n_tokens * 100:.2f}% OOV") + return tgt_lens + + def __repr__(self): + return ( + self.__class__.__name__ + + f'(split="{self.split}", n_samples={self.n_samples:_}, ' + f"prepend_tgt_lang_tag={self.cfg.prepend_tgt_lang_tag}, " + f"shuffle={self.shuffle}, transforms={self.feature_transforms}, " + f"n_frames_per_step={self.n_frames_per_step}" + ) + + @classmethod + def is_lang_tag(cls, token): + pattern = cls.LANG_TAG_TEMPLATE.replace("{}", "(.*)") + return re.match(pattern, token) + + def check_tgt_lang_tag(self): + if self.cfg.prepend_tgt_lang_tag: + assert self.tgt_langs is not None and self.tgt_dict is not None + tgt_lang_tags = [ + self.LANG_TAG_TEMPLATE.format(t) for t in set(self.tgt_langs) + ] + assert all(t in self.tgt_dict for t in tgt_lang_tags) + + @classmethod + def tokenize(cls, tokenizer, text: str): + return text if tokenizer is None else tokenizer.encode(text) + + def get_tokenized_tgt_text(self, index: int): + text = self.tgt_texts[index] + text = torch.tensor(self.tokenizer.encode(text, bos=False, eos=True), dtype=torch.int64) + return text + + def get_tokenized_few_shot_tgt_text(self, text): + text = torch.tensor(self.tokenizer.encode(text, bos=False, eos=False), dtype=torch.int64) + return text + + def get_speech_flag(self, index: int): + speech_flag = self.speech_flag[index] + if speech_flag == "True": + return True + else: + return False + + def get_tokenized_prompt_text(self, index: int): + text = self.prompt_texts[index] + text = torch.tensor(self.tokenizer.encode('"' + text + '"', bos=False, eos=False), dtype=torch.int64) + return text + + def get_tokenized_left_and_right_prompts_text(self, index, left_str, right_str): + left_text = torch.tensor(self.tokenizer.encode(left_str, bos=True, eos=False), dtype=torch.int64) + right_text = torch.tensor(self.tokenizer.encode(" " + self.E_SPEECH + " " + self.prompt_texts[index] + " " + right_str, bos=False, eos=False), dtype=torch.int64) + return left_text, right_text + + def pack_frames(self, feature: torch.Tensor): + if self.n_frames_per_step == 1: + return feature + n_packed_frames = feature.shape[0] // self.n_frames_per_step + feature = feature[: self.n_frames_per_step * n_packed_frames] + return feature.reshape(n_packed_frames, -1) + + @classmethod + def get_lang_tag_idx(cls, lang: str, dictionary: Dictionary): + lang_tag_idx = dictionary.index(cls.LANG_TAG_TEMPLATE.format(lang)) + assert lang_tag_idx != dictionary.unk() + return lang_tag_idx + + def _get_source_audio(self, index: int) -> torch.Tensor: + source = get_features_or_waveform( + self.audio_paths[index], + need_waveform=self.cfg.use_audio_input, + use_sample_rate=self.cfg.use_sample_rate, + ) + if self.feature_transforms is not None: + assert not self.cfg.use_audio_input + source = self.feature_transforms(source) + source = torch.from_numpy(source).float() + return source + + def process_audio_source(self, source): + length_in_s = len(source) / self.cfg.use_sample_rate + dura_flag = False if length_in_s <= 30 else True + if dura_flag: + source_parts = [] + sample_count = 30 * self.cfg.use_sample_rate + # offset = 1 * self.cfg.use_sample_rate + offset = 0 + segments = int(np.ceil((len(source) - sample_count) / (sample_count - offset)) + 1) + for i in range(segments): + start = i * (sample_count - offset) + end = min(start + sample_count, len(source)) + part = source[start:end] + source_parts.append(part) + else: + source_parts = [source] + return source_parts + + def __getitem__(self, index: int) -> SpeechLLMDatasetItem: + if self.start_frames is not None: + source_num_frames = int(self.end_frames[index]) - int(self.start_frames[index]) + source, sr = torchaudio.load(self.audio_paths[index], + frame_offset=int(self.start_frames[index]), + num_frames=source_num_frames) + source = source[0] + else: + source = self._get_source_audio(index) + + source = self.pack_frames(source) + source_parts = self.process_audio_source(source) + if self.cfg.is_whisper: + sources = [] + speech_attention_masks = [] + + for part in source_parts: + audio_output = self.audio_processor(part, sampling_rate=16000, return_tensors="pt", return_attention_mask=True) + sources.append(audio_output.input_features[0]) + speech_attention_masks.append(audio_output.attention_mask[0].bool()) + + if self.cfg.use_wavlm: + wavlm_output = self.wavlm_processor(source, sampling_rate=16000, return_tensors="pt", return_attention_mask=True) + wavlm_sources = wavlm_output.input_values[0] + + else: + wavlm_sources = None + + + example_sources = None + example_speech_attention_masks = None + example_wavlm_sources = None + + audio_codec = None + example_audio_codec = None + + target = None + if self.tgt_texts is not None: + target = self.get_tokenized_tgt_text(index) ## end with eos + if self.cfg.prepend_tgt_lang_tag: + lang_tag_idx = self.get_lang_tag_idx( + self.tgt_langs[index], self.tgt_dict + ) + target = torch.cat((torch.LongTensor([lang_tag_idx]), target), 0) + + speaker_id = None + if self.speaker_to_id is not None: + speaker_id = self.speaker_to_id[self.speakers[index]] + + orig_prompt = self.get_tokenized_prompt_text(index) ## begin with bos + + if self.cfg.prompt_bulid: + left_prompt_text = self.B_INST + self.B_SYS + self.SYSTEM + self.E_SYS + self.B_SPEECH + right_prompt_text = self.E_INST + left_prompt, right_prompt = self.get_tokenized_left_and_right_prompts_text(index, left_prompt_text, right_prompt_text) + + prompt_target = torch.cat((right_prompt, target), dim=0) + left_prompt_mask = torch.ones(left_prompt.shape[0]).bool() + + mid_prompt = None + mid_prompt_mask = None + prompt_mask = torch.cat((torch.ones(right_prompt[1:].shape[0]), torch.zeros(target.shape[0])), dim=0).bool() + target_mask = torch.cat((torch.zeros(right_prompt[1:].shape[0]), torch.ones(target.shape[0])), dim=0).bool() + + + lora_scale = -1 + + if self.cfg.alpaca_text: + speech_flag = self.get_speech_flag(index) + return SpeechLLMDatasetItem( + index=index, source=sources, target=prompt_target, speaker_id=speaker_id, left_prompt=left_prompt, + target_mask=target_mask, prompt_mask=prompt_mask, speech_mask=speech_attention_masks, + audio_codec=audio_codec, speech_flag=speech_flag, left_prompt_mask=left_prompt_mask, + mid_prompt=mid_prompt, mid_prompt_mask=mid_prompt_mask, example_source=example_sources, + example_speech_mask=example_speech_attention_masks, example_audio_codec=example_audio_codec, + lora_scale=lora_scale, orig_prompt=orig_prompt, wavlm_sources=wavlm_sources, + example_wavlm_sources=example_wavlm_sources, + ) + + return SpeechLLMDatasetItem( + index=index, source=sources, target=prompt_target, speaker_id=speaker_id, left_prompt=left_prompt, + target_mask=target_mask, prompt_mask=prompt_mask, speech_mask=speech_attention_masks, + audio_codec=audio_codec, left_prompt_mask=left_prompt_mask + ) + + def __len__(self): + return self.n_samples + + def collater( + self, samples: List[SpeechLLMDatasetItem], return_order: bool = False + ) -> Dict: + if len(samples) == 0: + return {} + indices = torch.tensor([x.index for x in samples], dtype=torch.long) + lora_scales = torch.tensor([x.lora_scale for x in samples], dtype=torch.long) + if self.cfg.is_whisper: + frames = [x.source for x in samples] + n_frames = torch.tensor([x.source[0].size(1) * len(x.source) for x in samples], dtype=torch.long) + batch_size = len(frames) + audio_decoder_input_ids = torch.ones((batch_size, self.cfg.whisper_token_len)).to(torch.long) + # audio_decoder_input_ids = audio_decoder_input_ids.to(src_tokens.device).to(torch.long) + if self.cfg.use_wavlm: + wavlm_input_features = [{"input_values": x.wavlm_sources} for x in samples] + wavlm_frames = self.wavlm_processor.pad(wavlm_input_features, padding=True, return_tensors="pt")["input_values"] + wavlm_speech_masks = self.wavlm_processor.pad(wavlm_input_features, padding=True, return_tensors="pt")["attention_mask"] + + example_wavlm_frames = None + example_wavlm_speech_masks = None + n_frames, order = n_frames.sort(descending=True) + indices = indices.index_select(0, order) + lora_scales = lora_scales.index_select(0, order) + # frames = frames.index_select(0, order) + frames = [frames[i] for i in order] + if wavlm_frames is not None: + wavlm_frames = [wavlm_frames[i] for i in order] + wavlm_speech_masks = [wavlm_speech_masks[i] for i in order] + + speech_masks = [x.speech_mask for x in samples] + speech_masks = [speech_masks[i] for i in order] + + + audio_codecs = None + audio_codec_masks = None + + if self.cfg.alpaca_text: + speech_flags = [x.speech_flag for x in samples] + speech_flags = torch.tensor(speech_flags, dtype=torch.bool) + speech_flags = speech_flags.index_select(0, order) + else: + speech_flags = None + + target, target_lengths = None, None + prev_output_tokens = None + ntokens = None + + if self.tgt_texts is not None: + # if self.prompt_texts is not None: + # target_sequence = [x.prompt for x in samples] + [x.target for x in samples] + # print ("") + # else: + # target_sequence = [x.target for x in samples] + + target_masks = [x.target_mask for x in samples] + target_masks = fairseq_data_utils.collate_tokens(target_masks, False) + target_masks = target_masks.index_select(0, order) + + prompt_masks = [x.prompt_mask for x in samples] + prompt_masks = fairseq_data_utils.collate_tokens(prompt_masks, False) + prompt_masks = prompt_masks.index_select(0, order) + + if self.cfg.prompt_bulid: + left_prompt_masks = [x.left_prompt_mask for x in samples] + left_prompt_masks = fairseq_data_utils.collate_tokens(left_prompt_masks, False) + left_prompt_masks = left_prompt_masks.index_select(0, order) + + left_prompts = fairseq_data_utils.collate_tokens( + [x.left_prompt for x in samples], + 0, #self.tokenizer.pad_id, + ) + left_prompts = left_prompts.index_select(0, order) + + mid_prompt_masks = None + mid_prompts = None + + target = fairseq_data_utils.collate_tokens( + [x.target[1:] for x in samples], + 0, #self.tokenizer.pad_id, + ) + target = target.index_select(0, order) + target_lengths = torch.tensor( + [x.target.size(0) for x in samples], dtype=torch.long + ).index_select(0, order) + prev_output_tokens = fairseq_data_utils.collate_tokens( + [x.target[:-1] for x in samples], + 0, #self.tokenizer.pad_id, + ) + prev_output_tokens = prev_output_tokens.index_select(0, order) + ntokens = sum(x.target[1:].size(0) for x in samples) + + orig_prompts = fairseq_data_utils.collate_tokens( + [x.orig_prompt for x in samples], + 0, #self.tokenizer.pad_id, + ) + orig_prompts = orig_prompts.index_select(0, order) + + speaker = None + if self.speaker_to_id is not None: + speaker = ( + torch.tensor([s.speaker_id for s in samples], dtype=torch.long) + .index_select(0, order) + .view(-1, 1) + ) + + if self.cfg.is_whisper: + net_input = { + "index": indices, + "lora_index": lora_scales, + "speech_flag": speech_flags, + "audio_codec": audio_codecs, + "src_tokens": frames, + "src_lengths": n_frames, + "audio_decoder_input_ids": audio_decoder_input_ids, + "prev_output_tokens": prev_output_tokens, + "target_masks": target_masks, + "prompt_masks": prompt_masks, + "left_prompts": left_prompts, + "left_prompt_masks": left_prompt_masks, + "speech_masks": speech_masks, + "codec_masks": audio_codec_masks, + "orig_prompts": orig_prompts, + "wavlm_src_tokens": wavlm_frames, + "wavlm_speech_masks": wavlm_speech_masks, + } + out = { + "id": indices, + "net_input": net_input, + "speaker": speaker, + "target": target, + "target_lengths": target_lengths, + "ntokens": ntokens, + "nsentences": len(samples), + } + if return_order: + out["order"] = order + return out + + def num_tokens(self, index): + return self.n_frames[index] + + def size(self, index): + return self.n_frames[index], self.tgt_lens[index] + + @property + def sizes(self): + return np.array(self.n_frames) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return True + + def ordered_indices(self): + if self.shuffle: + order = [np.random.permutation(len(self))] + else: + order = [np.arange(len(self))] + # first by descending order of # of frames then by original/random order + order.append([-n for n in self.n_frames]) + return np.lexsort(order) + + def prefetch(self, indices): + raise False + + def get_transforms(self, transform_type, split, is_train): + """Split-specific feature transforms. Allowing train set + wildcard `_train`, evaluation set wildcard `_eval` and general + wildcard `*` for matching.""" + from copy import deepcopy + + cfg = deepcopy(self.config) + _cur = cfg.get(f"{transform_type}transforms", {}) + cur = _cur.get(split) + cur = _cur.get("_train") if cur is None and is_train else cur + cur = _cur.get("_eval") if cur is None and not is_train else cur + cur = _cur.get("*") if cur is None else cur + return cur + + def get_feature_transforms(self, split, is_train): + cfg = deepcopy(self.config) + # TODO: deprecate transforms + cur = self.get_transforms("", split, is_train) + if cur is not None: + logger.warning( + "Auto converting transforms into feature_transforms, " + "but transforms will be deprecated in the future. Please " + "update this in the config." + ) + ft_transforms = self.get_transforms("feature_", split, is_train) + if ft_transforms: + cur.extend(ft_transforms) + else: + cur = self.get_transforms("feature_", split, is_train) + cfg["feature_transforms"] = cur + return cfg + + def get_waveform_transforms(self, split, is_train): + cfg = deepcopy(self.config) + cfg["waveform_transforms"] = self.get_transforms("waveform_", split, is_train) + return cfg + + @classmethod + def _load_samples_from_tsv(self, root: str, split: str): + tsv_path = Path(root) / f"{split}.tsv" + if not tsv_path.is_file(): + raise FileNotFoundError(f"Dataset not found: {tsv_path}") + with open(tsv_path) as f: + reader = csv.DictReader( + f, + delimiter="\t", + quotechar=None, + doublequote=False, + lineterminator="\n", + quoting=csv.QUOTE_NONE, + ) + samples = [dict(e) for e in reader] + if len(samples) == 0: + raise ValueError(f"Empty manifest: {tsv_path}") + return samples + + diff --git a/WavLLM/wavllm/data/tokenizer.py b/WavLLM/wavllm/data/tokenizer.py new file mode 100644 index 0000000..a3c760b --- /dev/null +++ b/WavLLM/wavllm/data/tokenizer.py @@ -0,0 +1,49 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import csv +import io +import logging +import re +from collections import defaultdict +from pathlib import Path +from typing import Dict, List, Optional +from dataclasses import dataclass + +import os +from sentencepiece import SentencePieceProcessor +from copy import deepcopy + +logger = logging.getLogger(__name__) + + + +class Tokenizer: + def __init__(self, model_path: str): + # reload tokenizer + assert os.path.isfile(model_path), model_path + self.sp_model = SentencePieceProcessor(model_file=model_path) + logger.info(f"Reloaded SentencePiece model from {model_path}") + + # BOS / EOS token IDs + self.n_words: int = self.sp_model.vocab_size() + self.bos_id: int = self.sp_model.bos_id() + self.eos_id: int = self.sp_model.eos_id() + self.pad_id: int = self.sp_model.pad_id() + self.unk_id: int = self.sp_model.unk_id() + logger.info(f"#words: {self.n_words} - BOS ID: {self.bos_id} - EOS ID: {self.eos_id} - PAD ID: {self.pad_id} - UNK ID: {self.unk_id}") + assert self.sp_model.vocab_size() == self.sp_model.get_piece_size() + + def encode(self, s: str, bos: bool, eos: bool) -> List[int]: + assert type(s) is str + t = self.sp_model.encode(s) + if bos: + t = [self.bos_id] + t + if eos: + t = t + [self.eos_id] + return t + + def decode(self, t: List[int]) -> str: + return self.sp_model.decode(t) \ No newline at end of file diff --git a/WavLLM/wavllm/inference/generate.py b/WavLLM/wavllm/inference/generate.py new file mode 100644 index 0000000..2cfd29a --- /dev/null +++ b/WavLLM/wavllm/inference/generate.py @@ -0,0 +1,454 @@ +#!/usr/bin/env python3 -u +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +""" +Translate pre-processed data with a trained model. +""" + +import ast +import logging +import math +import os +import sys +import time +from argparse import Namespace +from itertools import chain + +import numpy as np +import torch +from omegaconf import DictConfig + +from fairseq import checkpoint_utils, options, scoring, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.logging import progress_bar +from fairseq.logging.meters import StopwatchMeter, TimeMeter + + +def main(cfg: DictConfig): + + if isinstance(cfg, Namespace): + print(cfg) + cfg = convert_namespace_to_omegaconf(cfg) + + assert cfg.common_eval.path is not None, "--path required for generation!" + assert ( + not cfg.generation.sampling or cfg.generation.nbest == cfg.generation.beam + ), "--sampling requires --nbest to be equal to --beam" + assert ( + cfg.generation.replace_unk is None or cfg.dataset.dataset_impl == "raw" + ), "--replace-unk requires a raw text dataset (--dataset-impl=raw)" + + if cfg.common_eval.results_path is not None: + os.makedirs(cfg.common_eval.results_path, exist_ok=True) + output_path = os.path.join( + cfg.common_eval.results_path, + "generate-{}.txt".format(cfg.dataset.gen_subset), + ) + with open(output_path, "w", buffering=1, encoding="utf-8") as h: + return _main(cfg, h) + else: + return _main(cfg, sys.stdout) + + +def get_symbols_to_strip_from_output(generator): + if hasattr(generator, "symbols_to_strip_from_output"): + return generator.symbols_to_strip_from_output + else: + return {generator.eos} + + +def _main(cfg: DictConfig, output_file): + logging.basicConfig( + format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + level=os.environ.get("LOGLEVEL", "INFO").upper(), + stream=output_file, + ) + logger = logging.getLogger("fairseq_cli.generate") + + utils.import_user_module(cfg.common) + + if cfg.dataset.max_tokens is None and cfg.dataset.batch_size is None: + cfg.dataset.max_tokens = 12000 + logger.info(cfg) + + # Fix seed for stochastic decoding + if cfg.common.seed is not None and not cfg.generation.no_seed_provided: + np.random.seed(cfg.common.seed) + utils.set_torch_seed(cfg.common.seed) + + use_cuda = torch.cuda.is_available() and not cfg.common.cpu + + task = tasks.setup_task(cfg.task) + task.cfg.is_whisper = True + task.cfg.processor_path = "openai/whisper-large-v2" + + + task.cfg.whisper_with_decoder = False + task.cfg.sft_stage = True + task.cfg.llama_2 = True + task.cfg.use_lora = True + task.cfg.lora_r = 32 + task.cfg.lora_alpha = 32 + + task.cfg.freeze_audio_encoder = False + task.cfg.use_wavlm = True + + task.cfg.wavlm_processor_path = "microsoft/wavlm-base" + task.cfg.wavlm_output_weight = True + + task.cfg.alpaca_text = True + task.cfg.prompt_bulid = True + + task.cfg.load_pretrained_model = False + + task.cfg.second_stage_update_scale = True + task.cfg.scale_with_audio = False + task.cfg.scale_0_1 = False + + # Set dictionaries + try: + src_dict = getattr(task, "source_dictionary", None) + except NotImplementedError: + src_dict = None + tgt_dict = task.target_dictionary + + overrides = ast.literal_eval(cfg.common_eval.model_overrides) + + # Load ensemble + logger.info("loading model(s) from {}".format(cfg.common_eval.path)) + models, saved_cfg = checkpoint_utils.load_model_ensemble( + utils.split_paths(cfg.common_eval.path), + arg_overrides=overrides, + task=task, + suffix=cfg.checkpoint.checkpoint_suffix, + strict=(cfg.checkpoint.checkpoint_shard_count == 1), + num_shards=cfg.checkpoint.checkpoint_shard_count, + ) + + # loading the dataset should happen after the checkpoint has been loaded so we can give it the saved task config + task.load_dataset(cfg.dataset.gen_subset, task_cfg=saved_cfg.task) + + if cfg.generation.lm_path is not None: + overrides["data"] = cfg.task.data + + try: + lms, _ = checkpoint_utils.load_model_ensemble( + [cfg.generation.lm_path], arg_overrides=overrides, task=None + ) + except: + logger.warning( + f"Failed to load language model! Please make sure that the language model dict is the same " + f"as target dict and is located in the data dir ({cfg.task.data})" + ) + raise + + assert len(lms) == 1 + else: + lms = [None] + + # Optimize ensemble for generation + for model in chain(models, lms): + if model is None: + continue + if cfg.common.fp16: + model.half() + if use_cuda and not cfg.distributed_training.pipeline_model_parallel: + model.cuda() + model.prepare_for_inference_(cfg) + + # Load alignment dictionary for unknown word replacement + # (None if no unknown word replacement, empty if no path to align dictionary) + align_dict = utils.load_align_dict(cfg.generation.replace_unk) + + # Load dataset (possibly sharded) + itr = task.get_batch_iterator( + dataset=task.dataset(cfg.dataset.gen_subset), + max_tokens=cfg.dataset.max_tokens, + # max_sentences=cfg.dataset.batch_size, + max_sentences=1, + max_positions=utils.resolve_max_positions( + task.max_positions(), *[m.max_positions() for m in models] + ), + ignore_invalid_inputs=cfg.dataset.skip_invalid_size_inputs_valid_test, + required_batch_size_multiple=cfg.dataset.required_batch_size_multiple, + seed=cfg.common.seed, + num_shards=cfg.distributed_training.distributed_world_size, + shard_id=cfg.distributed_training.distributed_rank, + num_workers=cfg.dataset.num_workers, + data_buffer_size=cfg.dataset.data_buffer_size, + ).next_epoch_itr(shuffle=False) + progress = progress_bar.progress_bar( + itr, + log_format=cfg.common.log_format, + log_interval=cfg.common.log_interval, + default_log_format=("tqdm" if not cfg.common.no_progress_bar else "simple"), + ) + + # Initialize generator + gen_timer = StopwatchMeter() + + extra_gen_cls_kwargs = {"lm_model": lms[0], "lm_weight": cfg.generation.lm_weight} + + generator = task.build_generator( + models, cfg.generation, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + # Handle tokenization and BPE + tokenizer = task.build_tokenizer(cfg.tokenizer) + bpe = task.build_bpe(cfg.bpe) + + def decode_fn(x): + if bpe is not None: + x = bpe.decode(x) + if tokenizer is not None: + x = tokenizer.decode(x) + return x + + scorer = scoring.build_scorer(cfg.scoring, tgt_dict) + + num_sentences = 0 + has_target = True + wps_meter = TimeMeter() + for sample in progress: + sample = utils.move_to_cuda(sample) if use_cuda else sample + if "net_input" not in sample: + continue + + prompt_masks = sample["net_input"]["prompt_masks"] + prefix_sizes = prompt_masks.sum(axis=-1) + + #print ("prefix_sizes: ", prefix_sizes.shape, prefix_sizes) + prefix_size = prefix_sizes.max() ## TODO: right prompt length + + prefix_tokens = None + #if cfg.generation.prefix_size > 0: + # prefix_tokens = sample["target"][:, : cfg.generation.prefix_size] + if prefix_size > 0: + prefix_tokens = sample["target"][:, : prefix_size] + + constraints = None + if "constraints" in sample: + constraints = sample["constraints"] + + gen_timer.start() + hypos = task.inference_step( + generator, + models, + sample, + prefix_tokens=prefix_tokens, + constraints=constraints, + ) + num_generated_tokens = sum(len(h[0]["tokens"]) for h in hypos) + gen_timer.stop(num_generated_tokens) + + target_masks = sample["net_input"]["target_masks"] + prompt_masks = sample["net_input"]["prompt_masks"] + + for i, sample_id in enumerate(sample["id"].tolist()): + has_target = sample["target"] is not None + target_mask = target_masks[i, :] + prompt_mask = prompt_masks[i, :] + #print ("sample[target]: ", sample["target"]) + + # Remove padding + if "src_tokens" in sample["net_input"]: + # src_tokens = utils.strip_pad( + # sample["net_input"]["src_tokens"][i, :], tgt_dict.pad() + # ) + src_tokens = None + else: + src_tokens = None + + target_tokens = None + if has_target: + target_tokens = ( + utils.strip_pad(sample["target"][i, :], tgt_dict.pad()).int().cpu() + ) + + # Either retrieve the original sentences or regenerate them from tokens. + if align_dict is not None: + src_str = task.dataset(cfg.dataset.gen_subset).src.get_original_text( + sample_id + ) + target_str = task.dataset(cfg.dataset.gen_subset).tgt.get_original_text( + sample_id + ) + else: + if src_dict is not None: + src_str = src_dict.string(src_tokens, cfg.common_eval.post_process) + else: + src_str = "" + if has_target: + target_str = tgt_dict.string( + target_tokens, + cfg.common_eval.post_process, + escape_unk=True, + extra_symbols_to_ignore=get_symbols_to_strip_from_output( + generator + ), + ) + + target_str = task.tokenizer.decode( + utils.strip_pad(sample["target"][i, :][target_mask], 0).tolist() + # sample["target"][i, :][target_mask].tolist() + ) + + if not cfg.common_eval.quiet: + if src_dict is not None: + print("S-{}\t{}".format(sample_id, src_str), file=output_file) + if has_target: + print("T-{}\t{}".format(sample_id, target_str), file=output_file) + #print("T-{}\t{}".format(sample_id, task.tokenizer.decode(sample["target"][i, :].tolist())), file=output_file) + print("T-{}\t{}".format(sample_id, target_str)) + #print("T-{}\t{}".format(sample_id, task.tokenizer.decode([16564, 373, 278, 10959, 10348, 29892, 5706, 263, 15171, 6270]))) + + # Process top predictions + for j, hypo in enumerate(hypos[i][: cfg.generation.nbest]): + hypo_tokens, hypo_str, alignment = utils.post_process_prediction( + hypo_tokens=hypo["tokens"].int().cpu(), + src_str=src_str, + alignment=hypo["alignment"], + align_dict=align_dict, + tgt_dict=tgt_dict, + remove_bpe=cfg.common_eval.post_process, + extra_symbols_to_ignore=get_symbols_to_strip_from_output(generator), + ) + #detok_hypo_str = decode_fn(hypo_str) + prompt_mask_len = prompt_mask.sum(axis=0) + hypo_ids = hypo_tokens.tolist()[prompt_mask_len:] + hypo_str = task.tokenizer.decode(hypo_tokens.tolist()[prompt_mask_len:]) + + detok_hypo_str = hypo_str + if not cfg.common_eval.quiet: + score = hypo["score"] / math.log(2) # convert to base 2 + print( + "D-{}\t{}".format(sample_id, hypo_str), + ) + print( + #"D-{}\t{}\t{}".format(sample_id, score, detok_hypo_str), + #"D-{}\t{}\t{}\t{}".format(sample_id, score, hypo_str, " ".join(str(i) for i in hypo_tokens.tolist()[prompt_mask_len:])), + "D-{}\t{}\t{}".format(sample_id, score, repr(hypo_str)), + file=output_file, + ) + + + if cfg.generation.print_alignment == "hard": + print( + "A-{}\t{}".format( + sample_id, + " ".join( + [ + "{}-{}".format(src_idx, tgt_idx) + for src_idx, tgt_idx in alignment + ] + ), + ), + file=output_file, + ) + if cfg.generation.print_alignment == "soft": + print( + "A-{}\t{}".format( + sample_id, + " ".join( + [",".join(src_probs) for src_probs in alignment] + ), + ), + file=output_file, + ) + + if cfg.generation.print_step: + print( + "I-{}\t{}".format(sample_id, hypo["steps"]), + file=output_file, + ) + + if cfg.generation.retain_iter_history: + for step, h in enumerate(hypo["history"]): + _, h_str, _ = utils.post_process_prediction( + hypo_tokens=h["tokens"].int().cpu(), + src_str=src_str, + alignment=None, + align_dict=None, + tgt_dict=tgt_dict, + remove_bpe=None, + ) + print( + "E-{}_{}\t{}".format(sample_id, step, h_str), + file=output_file, + ) + + # Score only the top hypothesis + if has_target and j == 0: + if ( + align_dict is not None + or cfg.common_eval.post_process is not None + ): + # Convert back to tokens for evaluation with unk replacement and/or without BPE + target_tokens = tgt_dict.encode_line( + target_str, add_if_not_exist=True + ) + hypo_tokens = tgt_dict.encode_line( + detok_hypo_str, add_if_not_exist=True + ) + if hasattr(scorer, "add_string"): + scorer.add_string(target_str, detok_hypo_str) + else: + scorer.add(target_tokens, hypo_tokens) + + wps_meter.update(num_generated_tokens) + progress.log({"wps": round(wps_meter.avg)}) + num_sentences += ( + sample["nsentences"] if "nsentences" in sample else sample["id"].numel() + ) + + logger.info("NOTE: hypothesis and token scores are output in base 2") + logger.info( + "Translated {:,} sentences ({:,} tokens) in {:.1f}s ({:.2f} sentences/s, {:.2f} tokens/s)".format( + num_sentences, + gen_timer.n, + gen_timer.sum, + num_sentences / gen_timer.sum, + 1.0 / gen_timer.avg, + ) + ) + if has_target: + if cfg.bpe and not cfg.generation.sacrebleu: + if cfg.common_eval.post_process: + logger.warning( + "BLEU score is being computed by splitting detokenized string on spaces, this is probably not what you want. Use --sacrebleu for standard 13a BLEU tokenization" + ) + else: + logger.warning( + "If you are using BPE on the target side, the BLEU score is computed on BPE tokens, not on proper words. Use --sacrebleu for standard 13a BLEU tokenization" + ) + # use print to be consistent with other main outputs: S-, H-, T-, D- and so on + print( + "Generate {} with beam={}: {}".format( + cfg.dataset.gen_subset, cfg.generation.beam, scorer.result_string() + ), + file=output_file, + ) + + return scorer + + +def cli_main(): + parser = options.get_generation_parser() + # TODO: replace this workaround with refactoring of `AudioPretraining` + parser.add_argument( + "--arch", + "-a", + metavar="ARCH", + default="wav2vec2", + help="Model architecture. For constructing tasks that rely on " + "model args (e.g. `AudioPretraining`)", + ) + args = options.parse_args_and_arch(parser) + main(args) + + +if __name__ == "__main__": + cli_main() diff --git a/WavLLM/wavllm/inference/sequence_generator.py b/WavLLM/wavllm/inference/sequence_generator.py new file mode 100644 index 0000000..14b500c --- /dev/null +++ b/WavLLM/wavllm/inference/sequence_generator.py @@ -0,0 +1,1017 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import math +import sys +from typing import Dict, List, Optional + +import torch +import time +import torch.nn as nn +import torch.nn.functional as F +from torch import Tensor + +from fairseq import search, utils +from fairseq.data import data_utils +from fairseq.models import FairseqIncrementalDecoder +from fairseq.ngram_repeat_block import NGramRepeatBlock + + +class SequenceGenerator(nn.Module): + def __init__( + self, + models, + tgt_dict, + beam_size=1, + max_len_a=0, + max_len_b=200, + max_len=0, + min_len=1, + normalize_scores=True, + len_penalty=1.0, + unk_penalty=0.0, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + search_strategy=None, + eos=None, + symbols_to_strip_from_output=None, + lm_model=None, + lm_weight=1.0, + tokens_to_suppress=(), + n_words=0, + ): + """Generates translations of a given source sentence. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models, + currently support fairseq.models.TransformerModel for scripting + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + max_len (int, optional): the maximum length of the generated output + (not including end-of-sentence) + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + """ + super().__init__() + if isinstance(models, EnsembleModel): + self.model = models + else: + self.model = EnsembleModel(models) + self.tgt_dict = tgt_dict + # self.pad = tgt_dict.pad() + # self.unk = tgt_dict.unk() + # self.eos = tgt_dict.eos() if eos is None else eos + self.pad = 0 ## original pad index is -1 + self.unk = 0 + self.bos = 1 + self.eos = 2 + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos}) + if symbols_to_strip_from_output is not None + else {self.eos} + ) + + self.token_indices_to_suppress: Optional[Tensor] = None + token_indices_to_suppress = [] + for token_string in tokens_to_suppress: + token_index = tgt_dict.index(token_string) + assert token_index != self.unk + token_indices_to_suppress.append(token_index) + if len(token_indices_to_suppress) > 0: + self.token_indices_to_suppress = torch.Tensor( + token_indices_to_suppress + ).long() + + self.vocab_size = len(tgt_dict) + self.n_words = n_words + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.model.set_decoder_beam_size(self.beam_size) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.max_len = max_len or self.model.max_decoder_positions() + + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.temperature = temperature + self.match_source_len = match_source_len + + if no_repeat_ngram_size > 0: + self.repeat_ngram_blocker = NGramRepeatBlock(no_repeat_ngram_size) + else: + self.repeat_ngram_blocker = None + + assert temperature > 0, "--temperature must be greater than 0" + + self.search = ( + search.BeamSearch(tgt_dict) if search_strategy is None else search_strategy + ) + # We only need to set src_lengths in LengthConstrainedBeamSearch. + # As a module attribute, setting it would break in multithread + # settings when the model is shared. + self.should_set_src_lengths = ( + hasattr(self.search, "needs_src_lengths") and self.search.needs_src_lengths + ) + + self.model.eval() + + self.lm_model = lm_model + self.lm_weight = lm_weight + if self.lm_model is not None: + self.lm_model.eval() + + def cuda(self): + self.model.cuda() + return self + + @torch.no_grad() + def forward( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + """Generate a batch of translations. + + Args: + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, prefix_tokens, bos_token=bos_token) + + # TODO(myleott): unused, deprecate after pytorch-translate migration + def generate_batched_itr(self, data_itr, beam_size=None, cuda=False, timer=None): + """Iterate over a batched dataset and yield individual translations. + Args: + cuda (bool, optional): use GPU for generation + timer (StopwatchMeter, optional): time generations + """ + for sample in data_itr: + s = utils.move_to_cuda(sample) if cuda else sample + if "net_input" not in s: + continue + input = s["net_input"] + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in input.items() if k != "prev_output_tokens" + } + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate(encoder_input) + if timer is not None: + timer.stop(sum(len(h[0]["tokens"]) for h in hypos)) + for i, id in enumerate(s["id"].data): + # remove padding + src = utils.strip_pad(input["src_tokens"].data[i, :], self.pad) + ref = ( + utils.strip_pad(s["target"].data[i, :], self.pad) + if s["target"] is not None + else None + ) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate( + self, models, sample: Dict[str, Dict[str, Tensor]], **kwargs + ) -> List[List[Dict[str, Tensor]]]: + """Generate translations. Match the api of other fairseq generators. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + constraints (torch.LongTensor, optional): force decoder to include + the list of constraints + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, **kwargs) + + def _generate( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + constraints: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(self.model.models_size) + ], + ) + net_input = sample["net_input"] + tid = sample["id"] + + if "src_tokens" in net_input: + src_tokens = net_input["src_tokens"] + # length of the source text being the character length except EndOfSentence and pad + # if src_lengths exists in net_input (speech_to_text dataset case), then use it + if "src_lengths" in net_input: + src_lengths = net_input["src_lengths"] + else: + src_lengths = ( + (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)) + .long() + .sum(dim=1) + ) + elif "source" in net_input: + src_tokens = net_input["source"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + elif "features" in net_input: + src_tokens = net_input["features"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + else: + raise Exception( + "expected src_tokens or source in net input. input keys: " + + str(net_input.keys()) + ) + + # bsz: total number of sentences in beam + # Note that src_tokens may have more than 2 dimensions (i.e. audio features) + # bsz, src_len = src_tokens.size()[:2] + bsz = len(src_tokens) + src_len = int(max(src_lengths)) + beam_size = self.beam_size + + if constraints is not None and not self.search.supports_constraints: + raise NotImplementedError( + "Target-side constraints were provided, but search method doesn't support them" + ) + + # Initialize constraints, when active + self.search.init_constraints(constraints, beam_size) + + max_len: int = -1 + if self.match_source_len: + max_len = src_lengths.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + self.max_len - 1, + ) + assert ( + self.min_len <= max_len + ), "min_len cannot be larger than max_len, please adjust these!" + # compute the encoder output for each beam + with torch.autograd.profiler.record_function("EnsembleModel: forward_encoder"): + #print ("net_input: ", net_input) + #print ("self.model.forward_encoder: ", self.model.forward_encoder) + all_encoder_outs = self.model.forward_encoder(net_input) + if "wavlm_src_tokens" in net_input and net_input["wavlm_src_tokens"] is not None: + orig_prompts = net_input["orig_prompts"] + prompt_embedding = None + all_wavlm_outs = [model.wavlm_encoder.forward_torchscript(net_input, prompt_embedding) for model in self.model.models] + wavlm_outs, few_shot_wavlm_outs = zip(*all_wavlm_outs) + else: + wavlm_outs, few_shot_wavlm_outs = None, None + encoder_outs, few_shot_encoder_outs = zip(*all_encoder_outs) + + # placeholder of indices for bsz * beam_size to hold tokens and accumulative scores + out_device = encoder_outs[0]['encoder_out'].device + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(out_device).long() + encoder_outs = self.model.reorder_encoder_out(encoder_outs, new_order) + if wavlm_outs is not None: + wavlm_outs = self.model.reorder_encoder_out(wavlm_outs, new_order, True) + + assert encoder_outs is not None + + # initialize buffers + scores = ( + torch.zeros(bsz * beam_size, max_len + 1).to(out_device).float() + ) # +1 for eos; pad is never chosen for scoring + tokens = ( + torch.zeros(bsz * beam_size, max_len + 2) + .to(out_device) + .long() + .fill_(self.pad) + ) # +2 for eos and pad + tokens[:, 0] = self.bos if bos_token is None else bos_token + attn: Optional[Tensor] = None + + # A list that indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = ( + torch.zeros(bsz, beam_size).to(out_device).eq(-1) + ) # forward and backward-compatible False mask + + # list of completed sentences + finalized = torch.jit.annotate( + List[List[Dict[str, Tensor]]], + [torch.jit.annotate(List[Dict[str, Tensor]], []) for i in range(bsz)], + ) # contains lists of dictionaries of infomation about the hypothesis being finalized at each step + + # a boolean array indicating if the sentence at the index is finished or not + finished = [False for i in range(bsz)] + num_remaining_sent = bsz # number of sentences remaining + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = ( + (torch.arange(0, bsz) * beam_size) + .unsqueeze(1) + .type_as(tokens) + .to(out_device) + ) + cand_offsets = torch.arange(0, cand_size).type_as(tokens).to(out_device) + + reorder_state: Optional[Tensor] = None + batch_idxs: Optional[Tensor] = None + + original_batch_idxs: Optional[Tensor] = None + if "id" in sample and isinstance(sample["id"], Tensor): + original_batch_idxs = sample["id"] + else: + original_batch_idxs = torch.arange(0, bsz).type_as(tokens) + + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as( + batch_idxs + ) + reorder_state.view(-1, beam_size).add_( + corr.unsqueeze(-1) * beam_size + ) + original_batch_idxs = original_batch_idxs[batch_idxs] + self.model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = self.model.reorder_encoder_out( + encoder_outs, reorder_state + ) + if wavlm_outs is not None: + wavlm_outs = self.model.reorder_encoder_out(wavlm_outs, reorder_state, True) + with torch.autograd.profiler.record_function( + "EnsembleModel: forward_decoder" + ): + lprobs, avg_attn_scores = self.model.forward_decoder( + tokens[:, : step + 1], + encoder_outs, + few_shot_encoder_outs, + incremental_states, + self.temperature, + net_input, + step, + wavlm_outs, + few_shot_wavlm_outs, + tid[0], + ) + #print ("step, lprobs: ", step, lprobs.shape, lprobs) + + if self.lm_model is not None: + lm_out = self.lm_model(tokens[:, : step + 1]) + probs = self.lm_model.get_normalized_probs( + lm_out, log_probs=True, sample=None + ) + probs = probs[:, -1, :] * self.lm_weight + lprobs += probs + + lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs) + + lprobs[:, self.pad] = -math.inf # never select pad + lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + + if prefix_tokens is not None: + if step == prefix_tokens.size(1): + lprobs[:, self.eos] = -math.inf + else: + if step == 0: + lprobs[:, self.eos] = -math.inf + + # handle max length constraint + if step >= max_len: + lprobs[:, : self.eos] = -math.inf + lprobs[:, self.eos + 1 :] = -math.inf + + # handle prefix tokens (possibly with different lengths) + if ( + prefix_tokens is not None + and step < prefix_tokens.size(1) + and step < max_len + ): + lprobs, tokens, scores = self._prefix_tokens( + step, lprobs, scores, tokens, prefix_tokens, beam_size + ) + else: + if step < self.min_len: + # minimum length constraint (does not apply if using prefix_tokens) + lprobs[:, self.eos] = -math.inf + + if self.token_indices_to_suppress is not None: + lprobs[:, self.token_indices_to_suppress] = -math.inf + + # Record attention scores, only support avg_attn_scores is a Tensor + if avg_attn_scores is not None: + if attn is None: + attn = torch.empty( + bsz * beam_size, avg_attn_scores.size(1), max_len + 2 + ).to(scores) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(lprobs) + eos_bbsz_idx = torch.empty(0).to( + tokens + ) # indices of hypothesis ending with eos (finished sentences) + eos_scores = torch.empty(0).to( + scores + ) # scores of hypothesis ending with eos (finished sentences) + + if self.should_set_src_lengths: + self.search.set_src_lengths(src_lengths) + + if self.repeat_ngram_blocker is not None: + lprobs = self.repeat_ngram_blocker(tokens, lprobs, bsz, beam_size, step) + + # Shape: (batch, cand_size) + cand_scores, cand_indices, cand_beams = self.search.step( + step, + lprobs.view(bsz, -1, self.n_words), + scores.view(bsz, beam_size, -1)[:, :, :step], + tokens[:, : step + 1], + original_batch_idxs, + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos + # Shape of eos_mask: (batch size, beam size) + eos_mask = cand_indices.eq(self.eos) & cand_scores.ne(-math.inf) + eos_mask[:, :beam_size][cands_to_ignore] = torch.tensor(0).to(eos_mask) + + # only consider eos when it's among the top beam_size indices + # Now we know what beam item(s) to finish + # Shape: 1d list of absolute-numbered + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents: List[int] = [] + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + cand_scores[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = self.finalize_hypos( + step, + eos_bbsz_idx, + eos_scores, + tokens, + scores, + finalized, + finished, + beam_size, + attn, + src_lengths, + max_len, + ) + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + if self.search.stop_on_max_len and step >= max_len: + break + assert step < max_len, f"{step} < {max_len}" + + # Remove finalized sentences (ones for which {beam_size} + # finished hypotheses have been generated) from the batch. + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = torch.ones( + bsz, dtype=torch.bool, device=cand_indices.device + ) + batch_mask[finalized_sents] = False + # TODO replace `nonzero(as_tuple=False)` after TorchScript supports it + batch_idxs = torch.arange( + bsz, device=cand_indices.device + ).masked_select(batch_mask) + + # Choose the subset of the hypothesized constraints that will continue + self.search.prune_sentences(batch_idxs) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + cand_scores = cand_scores[batch_idxs] + cand_indices = cand_indices[batch_idxs] + + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths = src_lengths[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view( + new_bsz * beam_size, attn.size(1), -1 + ) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos hypos + # and values < cand_size indicate candidate active hypos. + # After, the min values per row are the top candidate active hypos + + # Rewrite the operator since the element wise or is not supported in torchscript. + + eos_mask[:, :beam_size] = ~((~cands_to_ignore) & (~eos_mask[:, :beam_size])) + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just + # the hypos with the smallest values in active_mask. + # {active_hypos} indicates which {beam_size} hypotheses + # from the list of {2 * beam_size} candidates were + # selected. Shapes: (batch size, beam size) + new_cands_to_ignore, active_hypos = torch.topk( + active_mask, k=beam_size, dim=1, largest=False + ) + + # update cands_to_ignore to ignore any finalized hypos. + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + # Make sure there is at least one active item for each sentence in the batch. + assert (~cands_to_ignore).any(dim=1).all() + + # update cands_to_ignore to ignore any finalized hypos + + # {active_bbsz_idx} denotes which beam number is continued for each new hypothesis (a beam + # can be selected more than once). + active_bbsz_idx = torch.gather(cand_bbsz_idx, dim=1, index=active_hypos) + active_scores = torch.gather(cand_scores, dim=1, index=active_hypos) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + + # Set the tokens for each beam (can select the same row more than once) + tokens[:, : step + 1] = torch.index_select( + tokens[:, : step + 1], dim=0, index=active_bbsz_idx + ) + # Select the next token for each of them + tokens.view(bsz, beam_size, -1)[:, :, step + 1] = torch.gather( + cand_indices, dim=1, index=active_hypos + ) + if step > 0: + scores[:, :step] = torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx + ) + scores.view(bsz, beam_size, -1)[:, :, step] = torch.gather( + cand_scores, dim=1, index=active_hypos + ) + + # Update constraints based on which candidates were selected for the next beam + self.search.update_constraints(active_hypos) + + # copy attention for active hypotheses + if attn is not None: + attn[:, :, : step + 2] = torch.index_select( + attn[:, :, : step + 2], dim=0, index=active_bbsz_idx + ) + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # sort by score descending + for sent in range(len(finalized)): + scores = torch.tensor( + [float(elem["score"].item()) for elem in finalized[sent]] + ) + _, sorted_scores_indices = torch.sort(scores, descending=True) + finalized[sent] = [finalized[sent][ssi] for ssi in sorted_scores_indices] + finalized[sent] = torch.jit.annotate( + List[Dict[str, Tensor]], finalized[sent] + ) + return finalized + + def _prefix_tokens( + self, step: int, lprobs, scores, tokens, prefix_tokens, beam_size: int + ): + """Handle prefix tokens""" + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_lprobs = lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + prefix_mask = prefix_toks.ne(self.pad) + lprobs[prefix_mask] = torch.tensor(-math.inf).to(lprobs) + lprobs[prefix_mask] = lprobs[prefix_mask].scatter( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lprobs[prefix_mask] + ) + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[ + :, 0, 1 : step + 1 + ] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = self.replicate_first_beam(tokens, eos_mask_batch_dim, beam_size) + scores = self.replicate_first_beam(scores, eos_mask_batch_dim, beam_size) + lprobs = self.replicate_first_beam(lprobs, eos_mask_batch_dim, beam_size) + return lprobs, tokens, scores + + def replicate_first_beam(self, tensor, mask, beam_size: int): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + def finalize_hypos( + self, + step: int, + bbsz_idx, + eos_scores, + tokens, + scores, + finalized: List[List[Dict[str, Tensor]]], + finished: List[bool], + beam_size: int, + attn: Optional[Tensor], + src_lengths, + max_len: int, + ): + """Finalize hypothesis, store finalized information in `finalized`, and change `finished` accordingly. + A sentence is finalized when {beam_size} finished items have been collected for it. + + Returns number of sentences (not beam items) being finalized. + These will be removed from the batch and not processed further. + Args: + bbsz_idx (Tensor): + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors. + # tokens is (batch * beam, max_len). So the index_select + # gets the newly EOS rows, then selects cols 1..{step + 2} + tokens_clone = tokens.index_select(0, bbsz_idx)[ + :, 1 : step + 2 + ] # skip the first index, which is EOS + + tokens_clone[:, step] = self.eos + attn_clone = ( + attn.index_select(0, bbsz_idx)[:, :, 1 : step + 2] + if attn is not None + else None + ) + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, : step + 1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + eos_scores /= (step + 1) ** self.len_penalty + + # cum_unfin records which sentences in the batch are finished. + # It helps match indexing between (a) the original sentences + # in the batch and (b) the current, possibly-reduced set of + # sentences. + cum_unfin: List[int] = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + cum_fin_tensor = torch.tensor(cum_unfin, dtype=torch.int).to(bbsz_idx) + + unfin_idx = torch.div(bbsz_idx, beam_size, rounding_mode="trunc") + sent = unfin_idx + torch.index_select(cum_fin_tensor, 0, unfin_idx) + + # Create a set of "{sent}{unfin_idx}", where + # "unfin_idx" is the index in the current (possibly reduced) + # list of sentences, and "sent" is the index in the original, + # unreduced batch + # For every finished beam item + # sentence index in the current (possibly reduced) batch + seen = (sent << 32) + unfin_idx + unique_seen: List[int] = torch.unique(seen).tolist() + + if self.match_source_len: + condition = step > torch.index_select(src_lengths, 0, unfin_idx) + eos_scores = torch.where(condition, torch.tensor(-math.inf), eos_scores) + sent_list: List[int] = sent.tolist() + for i in range(bbsz_idx.size()[0]): + # An input sentence (among those in a batch) is finished when + # beam_size hypotheses have been collected for it + if len(finalized[sent_list[i]]) < beam_size: + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i] + else: + hypo_attn = torch.empty(0) + + finalized[sent_list[i]].append( + { + "tokens": tokens_clone[i], + "score": eos_scores[i], + "attention": hypo_attn, # src_len x tgt_len + "alignment": torch.empty(0), + "positional_scores": pos_scores[i], + } + ) + + newly_finished: List[int] = [] + for unique_s in unique_seen: + # check termination conditions for this sentence + unique_sent: int = unique_s >> 32 + unique_unfin_idx: int = unique_s - (unique_sent << 32) + + if not finished[unique_sent] and self.is_finished( + step, unique_unfin_idx, max_len, len(finalized[unique_sent]), beam_size + ): + finished[unique_sent] = True + newly_finished.append(unique_unfin_idx) + + return newly_finished + + def is_finished( + self, + step: int, + unfin_idx: int, + max_len: int, + finalized_sent_len: int, + beam_size: int, + ): + """ + Check whether decoding for a sentence is finished, which + occurs when the list of finalized sentences has reached the + beam size, or when we reach the maximum length. + """ + assert finalized_sent_len <= beam_size + if finalized_sent_len == beam_size or step == max_len: + return True + return False + + +class EnsembleModel(nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models_size = len(models) + # method '__len__' is not supported in ModuleList for torch script + self.single_model = models[0] + self.models = nn.ModuleList(models) + + self.has_incremental: bool = False + if all( + hasattr(m, "decoder") and isinstance(m.decoder, FairseqIncrementalDecoder) + for m in models + ): + self.has_incremental = True + + if all(hasattr(m, "gpt_model") for m in models): + self.has_incremental = True + + def forward(self): + pass + + def has_encoder(self): + #return hasattr(self.single_model, "encoder") + return hasattr(self.single_model, "audio_encoder") + + def has_incremental_states(self): + return self.has_incremental + + def max_decoder_positions(self): + return min( + [ + m.max_decoder_positions() + for m in self.models + if hasattr(m, "max_decoder_positions") + ] + + [sys.maxsize] + ) + + def set_decoder_beam_size(self, beam_size): + """Set beam size for efficient beamable enc-dec attention.""" + if beam_size > 1: + for model in self.models: + if hasattr(model, "set_beam_size"): + model.set_beam_size(beam_size) + + def concate_audio_wavlm(self, model, wavlm_audio_out, audio_out): + if audio_out['encoder_out'].size(1) != wavlm_audio_out['encoder_out'].size(1): + out_len = min(audio_out['encoder_out'].size(1), wavlm_audio_out['encoder_out'].size(1)) + audio_out['encoder_out'] = audio_out['encoder_out'][:, : out_len, :] + audio_out["encoder_padding_mask"] = audio_out["encoder_padding_mask"][:, : out_len] + wavlm_audio_out['encoder_out'] = wavlm_audio_out['encoder_out'][:, : out_len, :] + wavlm_audio_out["encoder_padding_mask"] = wavlm_audio_out["encoder_padding_mask"][:, : out_len] + + audio_out['encoder_out'] = torch.cat((audio_out['encoder_out'], wavlm_audio_out['encoder_out']), dim=2) + audio_out['encoder_out'] = model.wavlm_audio_proj(audio_out['encoder_out']) + return audio_out + + @torch.jit.export + def forward_encoder(self, net_input: Dict[str, Tensor]): + #print ("self.has_encoder(): ", self.has_encoder()) + if not self.has_encoder(): + return None + #return [model.encoder.forward_torchscript(net_input) for model in self.models] + return [model.audio_encoder.forward_torchscript(net_input) for model in self.models] + + @torch.jit.export + def forward_decoder( + self, + tokens, + encoder_outs: List[Dict[str, List[Tensor]]], + few_shot_encoder_outs: List[Dict[str, List[Tensor]]], + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + temperature: float = 1.0, + net_input: Dict[str, Optional[Tensor]] = None, + step: int = 0, + wavlm_outs: List[Dict[str, List[Tensor]]] = None, + few_shot_wavlm_outs: List[Dict[str, List[Tensor]]] = None, + tid: int = 0, + ): + log_probs = [] + avg_attn: Optional[Tensor] = None + encoder_out: Optional[Dict[str, List[Tensor]]] = None + few_shot_encoder_out: Optional[Dict[str, List[Tensor]]] = None + wavlm_out: Optional[Dict[str, List[Tensor]]] = None + for i, model in enumerate(self.models): + if self.has_encoder(): + encoder_out = encoder_outs[i] + if few_shot_encoder_outs[0] is not None: + few_shot_encoder_out = few_shot_encoder_outs[i] + if wavlm_outs is not None: + wavlm_out = wavlm_outs[i] + if few_shot_wavlm_outs is not None: + few_shot_wavlm_out = few_shot_wavlm_outs[i] + # decode each model + if self.has_incremental_states(): + # decoder_out = model.decoder.forward( + # tokens, + # encoder_out=encoder_out, + # incremental_state=incremental_states[i], + # ) + examples = net_input["prev_output_tokens"] + orig_prompts = net_input["orig_prompts"] + left_prompts = net_input["left_prompts"] + left_prompt_masks = net_input["left_prompt_masks"] + if few_shot_encoder_out is not None: + mid_prompts = net_input["mid_prompts"] + mid_prompt_masks = net_input["mid_prompt_masks"] + else: + mid_prompts = None + mid_prompt_masks = None + + prompt_masks = net_input["prompt_masks"] + target_masks = net_input["target_masks"] + index = net_input["index"] + + lora_index = net_input["lora_index"] + if lora_index[0] == -1: + lora_index = None + + # codec + if step == 0: + audio_codec = net_input["audio_codec"] + codec_masks = net_input["codec_masks"] + + encoder_out = self.concate_audio_wavlm(model, wavlm_out, encoder_out) + start_pos = step + # TODO + # encoder_out = None + decoder_out = model.gpt_model.forward_generate(tid, tokens, start_pos, examples, encoder_out, index, orig_prompts, lora_index, few_shot_encoder_out=few_shot_encoder_out, left_prompts=left_prompts, mid_prompts=mid_prompts, prompt_masks=prompt_masks, target_masks=target_masks, left_prompt_masks=left_prompt_masks, mid_prompt_masks=mid_prompt_masks, incremental_state=incremental_states[i]) + else: + if hasattr(model, "decoder"): + decoder_out = model.decoder.forward(tokens, encoder_out=encoder_out) + else: + decoder_out = model.forward(tokens) + + attn: Optional[Tensor] = None + decoder_len = len(decoder_out) + if decoder_len > 1 and decoder_out[1] is not None: + if isinstance(decoder_out[1], Tensor): + attn = decoder_out[1] + else: + attn_holder = decoder_out[1]["attn"] + if isinstance(attn_holder, Tensor): + attn = attn_holder + elif attn_holder is not None: + attn = attn_holder[0] + if attn is not None: + attn = attn[:, -1, :] + + decoder_out_tuple = ( + decoder_out[0][:, -1:, :].div_(temperature), + None if decoder_len <= 1 else decoder_out[1], + ) + probs = model.get_normalized_probs( + decoder_out_tuple, log_probs=True, sample=None + ) + probs = probs[:, -1, :] + + if self.models_size == 1: + return probs, attn + + log_probs.append(probs) + if attn is not None: + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + + avg_probs = torch.logsumexp(torch.stack(log_probs, dim=0), dim=0) - math.log( + self.models_size + ) + if avg_attn is not None: + avg_attn.div_(self.models_size) + return avg_probs, avg_attn + + @torch.jit.export + def reorder_encoder_out( + self, encoder_outs: Optional[List[Dict[str, List[Tensor]]]], new_order, wavlm=False + ): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_outs: List[Dict[str, List[Tensor]]] = [] + if not self.has_encoder(): + return new_outs + for i, model in enumerate(self.models): + assert encoder_outs is not None + if wavlm: + new_outs.append( + model.wavlm_encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + else: + new_outs.append( + model.audio_encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + return new_outs + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + new_order, + ): + if not self.has_incremental_states(): + return + for i, model in enumerate(self.models): + model.gpt_model.reorder_incremental_state_scripting( + incremental_states[i], new_order + ) \ No newline at end of file diff --git a/WavLLM/wavllm/models/llama.py b/WavLLM/wavllm/models/llama.py new file mode 100644 index 0000000..c85295a --- /dev/null +++ b/WavLLM/wavllm/models/llama.py @@ -0,0 +1,693 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Embedding, Linear + +from fairseq.data.data_utils import lengths_to_padding_mask, lengths_to_mask +from fairseq.models import ( + FairseqEncoder, + FairseqDecoder, + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) + +from torch.distributed.fsdp.wrap import _or_policy, lambda_auto_wrap_policy, transformer_auto_wrap_policy +import torch.utils.checkpoint as cp +from torch.distributed.fsdp.fully_sharded_data_parallel import CPUOffload +from torch.distributed.fsdp import ( + FullyShardedDataParallel as FSDP, + MixedPrecision +) + +from typing import Optional, Tuple, List, Dict +from dataclasses import dataclass +from sentencepiece import SentencePieceProcessor +from torch import Tensor + +import math +import json +import os +import numpy as np +import functools +import time + +try: + from xformers.ops import memory_efficient_attention, LowerTriangularMask, MemoryEfficientAttentionCutlassOp +except ModuleNotFoundError: + print ("xformers.ops ModuleNotFoundError") + memory_efficient_attention, LowerTriangularMask, MemoryEfficientAttentionCutlassOp = None, None, None + +from functools import partial + +from torch.distributed.algorithms._checkpoint.checkpoint_wrapper import ( + checkpoint_wrapper, + CheckpointImpl, + apply_activation_checkpointing, +) + +non_reentrant_wrapper = partial( + checkpoint_wrapper, + checkpoint_impl=CheckpointImpl.NO_REENTRANT, +) + +check_fn = lambda submodule: isinstance(submodule, TransformerBlock) + + +def apply_fsdp_checkpointing(model): + """apply activation checkpointing to model + returns None as model is updated directly + """ + print(f"--> applying fsdp activation checkpointing...") + + apply_activation_checkpointing( + model, checkpoint_wrapper_fn=non_reentrant_wrapper, check_fn=check_fn + ) + +def get_llama_wrapper(): + """we register our main layer class and use the fsdp transformer wrapping policy + ensures embedding layers are in the root fsdp unit for shared access and that fsdp units map to transformer layers + """ + + transformer_wrap_policy = functools.partial( + transformer_auto_wrap_policy, + transformer_layer_cls={ + FeedForward, + }, + ) + auto_wrap_policy = transformer_wrap_policy + # auto_wrap_policy = functools.partial(_or_policy, policies=[lambda_policy, transformer_wrap_policy]) + return auto_wrap_policy + +class LLaMADecoder(FairseqDecoder): + + # TODO: change it to incremental decoder!! + + def __init__( + self, dictionary, llama_checkpoint, n_xatt, d_att, d_ffn, use_lora, lora_r, lora_alpha, lora_scale_train, + lora_scale_index, lora_scale_random, lora_task_index, lora_moe, lora_moe_scaling, lora_moe_n_experts, + enable_fsdp, use_xformers, second_stage_update_scale, second_stage_fix_lora, lora_only_qv, scale_only_one, scale_with_audio, + scale_0_1, scale_predict_time, scale_predict_all_dim, scale_predict_all_dim_each_layer, prompt_loss, + use_llama_adapter, + ): + super().__init__(dictionary) + model_args = ModelArgs(n_xatt=n_xatt, d_att=d_att, d_ffn=d_ffn, use_lora=use_lora, lora_r=lora_r, lora_alpha=lora_alpha, lora_scale_train=lora_scale_train, + lora_scale_index=lora_scale_index, lora_scale_random=lora_scale_random, lora_task_index=lora_task_index, n_experts=lora_moe_n_experts, + lora_moe=lora_moe, lora_moe_scaling=lora_moe_scaling, use_xformers=use_xformers, second_stage_update_scale=second_stage_update_scale, second_stage_fix_lora=second_stage_fix_lora, + lora_only_qv=lora_only_qv, scale_only_one=scale_only_one, scale_with_audio=scale_with_audio, scale_0_1=scale_0_1, + scale_predict_time=scale_predict_time,scale_predict_all_dim=scale_predict_all_dim, + scale_predict_all_dim_each_layer=scale_predict_all_dim_each_layer, prompt_loss=prompt_loss, + use_llama_adapter=use_llama_adapter,enable_fsdp=enable_fsdp) + self.model_llama = LLAMA(model_args) + # checkpoint = torch.load(llama_checkpoint, map_location="cpu") + # self.model_llama.load_state_dict(checkpoint, strict=False) + apply_fsdp_checkpointing(self.model_llama) + + def forward(self, prev_output_tokens, audio_out, index, orig_prompts, left_prompts=None, target_masks=None, prompt_masks=None, left_prompt_masks=None, speech_middle=False, speech_flag=None, example_audio_out=None, mid_prompts=None, mid_prompt_masks=None,lora_index=None): + return self.model_llama(prev_output_tokens, audio_out, index, orig_prompts, left_prompts, target_masks, prompt_masks, left_prompt_masks, speech_middle=speech_middle, speech_flag=speech_flag, example_audio_out=example_audio_out, mid_prompts=mid_prompts, mid_prompt_masks=mid_prompt_masks,lora_index=lora_index), None + + def forward_generate(self, tid, prev_output_tokens, start_pos, examples, audio_out, index, orig_prompts, lora_index=None, few_shot_encoder_out=None, left_prompts=None, mid_prompts=None, target_masks=None, prompt_masks=None, left_prompt_masks=None, mid_prompt_masks=None, speech_flag=None, incremental_state=None): + return self.model_llama.forward_generate(tid, prev_output_tokens, start_pos, examples, audio_out, index, orig_prompts, lora_index=lora_index, few_shot_encoder_out=few_shot_encoder_out, left_prompts=left_prompts, mid_prompts=mid_prompts,target_masks=target_masks, prompt_masks=prompt_masks, left_prompt_masks=left_prompt_masks, mid_prompt_masks=mid_prompt_masks, speech_flag=speech_flag, incremental_state=incremental_state), None + + def reorder_incremental_state_scripting( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + return self.model_llama.reorder_incremental_state_scripting(incremental_state, new_order) + + +# LLAMA model +@dataclass +class ModelArgs: + dim: int = 4096 + n_layers: int = 32 + n_heads: int = 32 + vocab_size: int = 32000 # defined later by tokenizer + multiple_of: int = 256 # make SwiGLU hidden layer size multiple of large power of 2 + norm_eps: float = 1e-6 + # max_batch_size: int = 32 + max_seq_len: int = 1024 + + n_xatt: int = 16 + d_att: int = 256 + d_ffn: int = 256 + + gradient_checkpointing: bool = False + + use_lora: bool = True + lora_scale_train: bool = False + lora_only_qv: bool = False + lora_scale_index: bool = False + lora_scale_random: bool = False + lora_task_index: bool = False + lora_r: int = 8 + lora_alpha: int = 32 + lora_dropout: float = 0.1 + lora_moe: bool = False + lora_moe_scaling: bool = False + n_experts: int = 3 + + flash_attention: bool = False + use_xformers: bool = False + second_stage_update_scale: bool = False + second_stage_fix_lora: bool = False + scale_only_one: bool = False + scale_with_audio: bool = True + scale_0_1: bool = True + scale_predict_time: bool = False + scale_predict_all_dim: bool = False + scale_predict_all_dim_each_layer: bool = False + prompt_loss: bool = False + + use_llama_adapter: bool = False + add_bias: bool = False + add_scale: bool = False + + enable_fsdp: bool = False + +class RMSNorm(torch.nn.Module): + def __init__(self, dim: int, eps: float = 1e-6): + super().__init__() + self.eps = eps + self.weight = nn.Parameter(torch.ones(dim)) + + def _norm(self, x): + return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) + + def forward(self, x): + output = self._norm(x.float()).type_as(x) + return output * self.weight + + +def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0): + freqs = 1.0 / (theta ** (torch.arange(0, dim, 2)[: (dim // 2)].float() / dim)) + t = torch.arange(end, device=freqs.device) # type: ignore + freqs = torch.outer(t, freqs).float() # type: ignore + freqs_cis = torch.polar(torch.ones_like(freqs), freqs) # complex64 + return freqs_cis + + +def reshape_for_broadcast(freqs_cis: torch.Tensor, x: torch.Tensor): + ndim = x.ndim + assert 0 <= 1 < ndim + assert freqs_cis.shape == (x.shape[1], x.shape[-1]) + shape = [d if i == 1 or i == ndim - 1 else 1 for i, d in enumerate(x.shape)] + return freqs_cis.view(*shape) + + +def apply_rotary_emb( + xq: torch.Tensor, + xk: torch.Tensor, + freqs_cis: torch.Tensor, +) -> Tuple[torch.Tensor, torch.Tensor]: + xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2)) + xk_ = torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2)) + freqs_cis = reshape_for_broadcast(freqs_cis, xq_) + xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(3) + xk_out = torch.view_as_real(xk_ * freqs_cis).flatten(3) + return xq_out.type_as(xq), xk_out.type_as(xk) + +class Attention_LoRA(nn.Module): + def __init__(self, args): + super().__init__() + + self.n_local_heads = args.n_heads + self.head_dim = args.dim // args.n_heads + + self.wq = Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False + ) + self.wk = Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False + ) + self.wv = Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False + ) + self.wo = Linear( + args.n_heads * self.head_dim, + args.dim, + bias=False + ) + + self.wq_lora_A = nn.Parameter(self.wq.weight.new_zeros((args.dim, args.lora_r))) + self.wq_lora_B = nn.Parameter(self.wq.weight.new_zeros((args.lora_r, args.dim))) + self.wk_lora_A = nn.Parameter(self.wk.weight.new_zeros((args.dim, args.lora_r))) + self.wk_lora_B = nn.Parameter(self.wk.weight.new_zeros((args.lora_r, args.dim))) + self.wv_lora_A = nn.Parameter(self.wv.weight.new_zeros((args.dim, args.lora_r))) + self.wv_lora_B = nn.Parameter(self.wv.weight.new_zeros((args.lora_r, args.dim))) + self.wo_lora_A = nn.Parameter(self.wo.weight.new_zeros((args.dim, args.lora_r))) + self.wo_lora_B = nn.Parameter(self.wo.weight.new_zeros((args.lora_r, args.dim))) + self.scaling = args.lora_alpha / args.lora_r + + self.reset_parameters() + + if args.lora_dropout > 0.: + self.lora_dropout = nn.Dropout(p=args.lora_dropout) + else: + self.lora_dropout = lambda x: x + + # TODO use incremental states + # self.cache_k = torch.zeros( + # (args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim) + # ).cuda() + # self.cache_v = torch.zeros( + # (args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim) + # ).cuda() + + def reset_parameters(self): + nn.init.kaiming_uniform_(self.wq_lora_A, a=math.sqrt(5)) + nn.init.kaiming_uniform_(self.wk_lora_A, a=math.sqrt(5)) + nn.init.kaiming_uniform_(self.wv_lora_A, a=math.sqrt(5)) + nn.init.kaiming_uniform_(self.wo_lora_A, a=math.sqrt(5)) + nn.init.zeros_(self.wq_lora_B) + nn.init.zeros_(self.wk_lora_B) + nn.init.zeros_(self.wv_lora_B) + nn.init.zeros_(self.wo_lora_B) + + def _checkpointed_forward(self, x): + xq = self.wq(x) + (self.lora_dropout(x) @ self.wq_lora_A @ self.wq_lora_B) * self.scaling + xk = self.wk(x) + (self.lora_dropout(x) @ self.wk_lora_A @ self.wk_lora_B) * self.scaling + xv = self.wv(x) + (self.lora_dropout(x) @ self.wv_lora_A @ self.wv_lora_B) * self.scaling + return xq, xk, xv + + def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, + mask: Optional[torch.Tensor], index, lora_index, lora_weights, pooled_scale_output, is_prompt=False, + incremental_state=None, gradient_checkpointing=False, layer_id=None): + + bsz, seqlen, _ = x.shape + if is_prompt: + xq = self.wq(x) + xk = self.wk(x) + xv = self.wv(x) + else: + if pooled_scale_output is not None: + pooled_scale_output = pooled_scale_output.type_as(x) + xq = self.wq(x) + (self.lora_dropout(x) @ self.wq_lora_A @ self.wq_lora_B) * pooled_scale_output.unsqueeze(1) + xk = self.wk(x) + (self.lora_dropout(x) @ self.wk_lora_A @ self.wk_lora_B) * pooled_scale_output.unsqueeze(1) + xv = self.wv(x) + (self.lora_dropout(x) @ self.wv_lora_A @ self.wv_lora_B) * pooled_scale_output.unsqueeze(1) + + xq = xq.view(bsz, seqlen, self.n_local_heads, self.head_dim) + xk = xk.view(bsz, seqlen, self.n_local_heads, self.head_dim) + xv = xv.view(bsz, seqlen, self.n_local_heads, self.head_dim) + + xq, xk = apply_rotary_emb(xq, xk, freqs_cis=freqs_cis) + + if incremental_state is not None: + if "prev_key" in incremental_state: + prev_key = incremental_state["prev_key"].view( + bsz, -1, self.n_local_heads, self.head_dim + ) + prev_value = incremental_state["prev_value"].view( + bsz, -1, self.n_local_heads, self.head_dim + ) + + xk = torch.cat([prev_key, xk], dim=1) + xv = torch.cat([prev_value, xv], dim=1) + #print ("test1") + + incremental_state["prev_key"] = xk.view( + bsz, -1, self.n_local_heads, self.head_dim + ) + incremental_state["prev_value"] = xv.view( + bsz, -1, self.n_local_heads, self.head_dim + ) + #src_len = k.size(1) + + + keys = xk + values = xv + + xq = xq.transpose(1, 2) + keys = keys.transpose(1, 2) + values = values.transpose(1, 2) + + scores = torch.matmul(xq, keys.transpose(2, 3)) / math.sqrt(self.head_dim) + # print("scores: ", scores.shape) + if mask is not None: + scores = scores + mask # (bs, n_local_heads, slen, cache_len + slen) + + scores = F.softmax(scores.float(), dim=-1).type_as(xq) + output = torch.matmul(scores, values) # (bs, n_local_heads, slen, head_dim) + output = output.transpose( + 1, 2 + ).contiguous().view(bsz, seqlen, -1) + if is_prompt: + return self.wo(output) + else: + if pooled_scale_output is not None: + return self.wo(output) + (self.lora_dropout(output) @ self.wo_lora_A @ self.wo_lora_B) * pooled_scale_output.unsqueeze(1) + +class Attention(nn.Module): + def __init__(self, args: ModelArgs): + super().__init__() + + self.n_local_heads = args.n_heads + self.head_dim = args.dim // args.n_heads + + self.wq = Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False + ) + self.wk = Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False + ) + self.wv = Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False + ) + self.wo = Linear( + args.n_heads * self.head_dim, + args.dim, + bias=False + ) + + # TODO use incremental states + # self.cache_k = torch.zeros( + # (args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim) + # ).cuda() + # self.cache_v = torch.zeros( + # (args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim) + # ).cuda() + + self.flash_attention = args.flash_attention + + def _checkpointed_forward(self, x): + return self.wq(x), self.wk(x), self.wv(x) + + def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, + mask: Optional[torch.Tensor], index, lora_index, lora_weights, pooled_scale_output, is_prompt=False, incremental_state=None, gradient_checkpointing=False): + + bsz, seqlen, _ = x.shape + if gradient_checkpointing and self.training: + xq, xk, xv = cp.checkpoint(self._checkpointed_forward, x) + else: + xq, xk, xv = self.wq(x), self.wk(x), self.wv(x) + + xq = xq.view(bsz, seqlen, self.n_local_heads, self.head_dim) + xk = xk.view(bsz, seqlen, self.n_local_heads, self.head_dim) + xv = xv.view(bsz, seqlen, self.n_local_heads, self.head_dim) + + xq, xk = apply_rotary_emb(xq, xk, freqs_cis=freqs_cis) + + if incremental_state is not None: + if "prev_key" in incremental_state: + prev_key = incremental_state["prev_key"].view( + bsz, -1, self.n_local_heads, self.head_dim + ) + prev_value = incremental_state["prev_value"].view( + bsz, -1, self.n_local_heads, self.head_dim + ) + xk = torch.cat([prev_key, xk], dim=1) + xv = torch.cat([prev_value, xv], dim=1) + #print ("test1") + incremental_state["prev_key"] = xk.view( + bsz, -1, self.n_local_heads, self.head_dim + ) + incremental_state["prev_value"] = xv.view( + bsz, -1, self.n_local_heads, self.head_dim + ) + #src_len = k.size(1) + + if self.flash_attention: + # attn_bias = LowerTriangularMask() + attn_bias = mask + attn = memory_efficient_attention(xq, xk, xv, attn_bias, op=MemoryEfficientAttentionCutlassOp) # B M H K + attn = attn.contiguous().view(bsz, seqlen, -1) + return self.wo(attn) + else: + keys = xk + values = xv + + xq = xq.transpose(1, 2) + keys = keys.transpose(1, 2) + values = values.transpose(1, 2) + #print ("xq: ", xq.shape) + #print ("keys: ", keys.shape) + scores = torch.matmul(xq, keys.transpose(2, 3)) / math.sqrt(self.head_dim) + + if mask is not None: + scores = scores + mask # (bs, n_local_heads, slen, cache_len + slen) + + scores = F.softmax(scores.float(), dim=-1).type_as(xq) + output = torch.matmul(scores, values) # (bs, n_local_heads, slen, head_dim) + output = output.transpose( + 1, 2 + ).contiguous().view(bsz, seqlen, -1) + + return self.wo(output) + +class FeedForward(nn.Module): + def __init__( + self, + dim: int, + hidden_dim: int, + multiple_of: int, + ): + super().__init__() + hidden_dim = int(2 * hidden_dim / 3) + hidden_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of) + + self.w1 = Linear( + dim, hidden_dim, bias=False + ) + self.w2 = Linear( + hidden_dim, dim, bias=False + ) + self.w3 = Linear( + dim, hidden_dim, bias=False + ) + + def forward(self, x, gradient_checkpointing): + if gradient_checkpointing and self.training: + output = cp.checkpoint(self._checkpointed_forward, x) + else: + output = self.w2(F.silu(self.w1(x)) * self.w3(x)) + return output + + def _checkpointed_forward(self, x): + return self.w2(F.silu(self.w1(x)) * self.w3(x)) + + +class TransformerBlock(nn.Module): + def __init__(self, layer_id: int, args: ModelArgs): + super().__init__() + self.n_heads = args.n_heads + self.dim = args.dim + self.head_dim = args.dim // args.n_heads + self.ffn_gradient_checkpointing = args.gradient_checkpointing + if args.use_lora: + self.attention = Attention_LoRA(args) + else: + self.attention = Attention(args) + + self.feed_forward = FeedForward( + dim=args.dim, hidden_dim=4 * args.dim, multiple_of=args.multiple_of + ) + self.layer_id = layer_id + self.attention_norm = RMSNorm(args.dim, eps=args.norm_eps) + self.ffn_norm = RMSNorm(args.dim, eps=args.norm_eps) + + wrapping_policy = get_llama_wrapper() + fpSixteen = MixedPrecision( + param_dtype=torch.float16, + reduce_dtype=torch.float16, + buffer_dtype=torch.float16 + ) + if args.enable_fsdp: + self.feed_forward = FSDP( + self.feed_forward, + auto_wrap_policy = wrapping_policy, + device_id=torch.cuda.current_device(), + limit_all_gathers=True, + mixed_precision=fpSixteen, + # cpu_offload=CPUOffload(offload_params=True), + ) + + + def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, mask: Optional[torch.Tensor], index, lora_index, lora_weights, pooled_scale_output, is_prompt=False, incremental_state=None,): + h = x + self.attention.forward(self.attention_norm(x), start_pos, freqs_cis, mask, index, lora_index, lora_weights, pooled_scale_output, is_prompt, incremental_state, layer_id=self.layer_id) + ffn_output = self.feed_forward.forward(self.ffn_norm(h), self.ffn_gradient_checkpointing) + out = h + ffn_output + return out + +class LLAMA(nn.Module): + def __init__(self, params: ModelArgs): + super().__init__() + self.params = params + self.vocab_size = params.vocab_size + self.n_layers = params.n_layers + self.n_xatt = params.n_xatt + self.lora_moe = params.lora_moe + self.lora_moe_scaling = params.lora_moe_scaling + self.second_stage_update_scale = params.second_stage_update_scale + self.second_stage_fix_lora = params.second_stage_fix_lora + self.prompt_loss = params.prompt_loss + self.scale_only_one = params.scale_only_one + self.scale_with_audio = params.scale_with_audio + self.scale_0_1 = params.scale_0_1 + self.scale_predict_time = params.scale_predict_time + self.scale_predict_all_dim = params.scale_predict_all_dim + self.scale_predict_all_dim_each_layer = params.scale_predict_all_dim_each_layer + if self.second_stage_update_scale: + self.scale_fc_1 = nn.Linear(4096, 1024) + self.scale_fc_2 = nn.Linear(1024, 4096) + self.scale_weight_attention = nn.Linear(4096, 1) + self.scale_fc_nonliner = F.gelu + + self.scale_predictor = None + self.tok_embeddings = Embedding( + params.vocab_size, params.dim + ) + + self.layers = torch.nn.ModuleList() + for layer_id in range(params.n_layers): + self.layers.append(TransformerBlock(layer_id, params)) + + self.norm = RMSNorm(params.dim, eps=params.norm_eps) + self.output = Linear( + params.dim, params.vocab_size, bias=False + ) + self.infer_pooled_prompt_output = None + + self.freqs_cis = precompute_freqs_cis( + self.params.dim // self.params.n_heads, self.params.max_seq_len * 2 + ) + + def freeze_module(self, module): + for param in module.parameters(): + param.requires_grad = False + + def get_text_embedding(self, text): + return self.tok_embeddings(text) + + def forward_generate(self, tid, prev_output_tokens, start_pos, examples, audio_out, index, orig_prompts, lora_index=None, few_shot_encoder_out=None, left_prompts=None, mid_prompts=None, target_masks=None, prompt_masks=None, left_prompt_masks=None, mid_prompt_masks=None, speech_flag=None, incremental_state=None): + with torch.no_grad(): + if audio_out is not None: + moe_weights = None + + if self.second_stage_update_scale: + if start_pos == 0: + prompt_h = self.tok_embeddings(orig_prompts) + _, prompt_seqlen, _ = prompt_h.shape + prompt_freqs_cis = self.freqs_cis.to(prompt_h.device) + prompt_freqs_cis = prompt_freqs_cis[ : prompt_seqlen] + + mask = None + if prompt_seqlen > 1: + mask = torch.full((1, 1, prompt_seqlen, prompt_seqlen), float("-inf"), device=prompt_h.device) + mask = torch.triu(mask, diagonal= 0 + 1).type_as(prompt_h) + + for i in range(self.n_layers): + prompt_h = self.layers[i](prompt_h, 0, prompt_freqs_cis, mask, -1, None, None, None, is_prompt=True) + scale_output = self.scale_fc_2(self.scale_fc_nonliner(self.scale_fc_1(prompt_h))) + + scale_attn_weights = F.softmax(self.scale_weight_attention(scale_output), dim=1) + weighted_scale = scale_output * scale_attn_weights + weighted_sum_scale = weighted_scale.sum(dim=1) + + pooled_scale_output = torch.clamp(torch.relu(weighted_sum_scale), max=3) + self.infer_pooled_prompt_output = pooled_scale_output + else: + pooled_scale_output = self.infer_pooled_prompt_output + else: + pooled_scale_output = None + + is_prompt = False + if start_pos == 0: + if left_prompts is not None: + left_h = self.tok_embeddings(left_prompts) + h = self.tok_embeddings(prev_output_tokens) + if left_prompts is not None: + h = torch.cat((left_h, audio_out["encoder_out"], h), dim=1) + else: + h = torch.cat((audio_out["encoder_out"], h), dim=1) + else: + prev_output_tokens = prev_output_tokens[:, -1:] + if left_prompts is not None: + start_pos = start_pos + left_prompts.shape[1] + audio_out["encoder_out"].shape[1] + else: + start_pos = start_pos + audio_out["encoder_out"].shape[1] + h = self.tok_embeddings(prev_output_tokens) + else: + if start_pos == 0: + h = self.tok_embeddings(prev_output_tokens) + else: + prev_output_tokens = prev_output_tokens[:, -1:] + h = self.tok_embeddings(prev_output_tokens) + + _bsz, seqlen, _ = h.shape + freqs_cis = self.freqs_cis.to(h.device) + freqs_cis = freqs_cis[start_pos : start_pos + seqlen] + mask = None + if seqlen > 1: + mask = torch.full((1, 1, seqlen, seqlen), float("-inf"), device=h.device) + mask = torch.triu(mask, diagonal=start_pos + 1).type_as(h) + + #start_pos = 0 + for i in range(self.n_layers): + if i not in incremental_state: + incremental_state[i] = {} + h = self.layers[i](h, start_pos, freqs_cis, mask, index, lora_index, moe_weights, pooled_scale_output, is_prompt, incremental_state[i]) + + h = self.norm(h) + + out = self.output(h) + return out + + def reorder_incremental_state_scripting( + self, + incremental_state: Dict[str, Dict[str, Optional[Tensor]]], + new_order: Tensor, + ): + for key in incremental_state: + for param_name in incremental_state[key]: + if incremental_state[key][param_name] is not None: + incremental_state[key][param_name] = incremental_state[key][param_name].index_select(0, new_order) + +class Tokenizer: + def __init__(self, model_path: str): + # reload tokenizer + assert os.path.isfile(model_path), model_path + self.sp_model = SentencePieceProcessor(model_file=model_path) + + # BOS / EOS token IDs + self.n_words: int = self.sp_model.vocab_size() + self.bos_id: int = self.sp_model.bos_id() + self.eos_id: int = self.sp_model.eos_id() + self.pad_id: int = self.sp_model.pad_id() + + print(self.n_words) + print(self.bos_id) + print(self.eos_id) + print(self.pad_id) + print(self.sp_model.unk_id()) + + assert self.sp_model.vocab_size() == self.sp_model.get_piece_size() + + def encode(self, s: str, bos: bool, eos: bool) -> List[int]: + assert type(s) is str + t = self.sp_model.encode(s) + if bos: + t = [self.bos_id] + t + if eos: + t = t + [self.eos_id] + return t + + def decode(self, t: List[int]) -> str: + return self.sp_model.decode(t) + + + + + diff --git a/WavLLM/wavllm/models/speechllm_model.py b/WavLLM/wavllm/models/speechllm_model.py new file mode 100644 index 0000000..50905e2 --- /dev/null +++ b/WavLLM/wavllm/models/speechllm_model.py @@ -0,0 +1,299 @@ +#!/usr/bin/env python3 + +import logging +import math +import os +import time +from pathlib import Path +from typing import Dict, List, Optional, Tuple +from dataclasses import dataclass, field + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch import Tensor +from collections import OrderedDict + +from fairseq import checkpoint_utils, utils +from fairseq.data.data_utils import lengths_to_padding_mask +from fairseq.models import ( + FairseqEncoderModel, + FairseqDecoder, + FairseqEncoderDecoderModel, + BaseFairseqModel, + register_model, + register_model_architecture, +) +from fairseq.models.speech_to_text.hub_interface import S2THubInterface +from fairseq.models.transformer import Embedding, TransformerDecoder +from fairseq.modules import ( + FairseqDropout, + LayerNorm, + PositionalEmbedding, + TransformerEncoderLayer, +) +from .llama import LLaMADecoder +from .whisper_encoder import FairseqWhisperEncoder, WhisperAdapter +from .wavlm import FairseqWavLMEncoder +from omegaconf import II +from fairseq.dataclass import ChoiceEnum, FairseqDataclass + +logger = logging.getLogger(__name__) + +class Conv1dSubsampler(nn.Module): + """Convolutional subsampler: a stack of 1D convolution (along temporal + dimension) followed by non-linear activation via gated linear units + (https://arxiv.org/abs/1911.08460) + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__( + self, + in_channels: int, + mid_channels: int, + out_channels: int, + kernel_sizes: List[int] = (3, 3), + strides: List[int] = (2, 2), + ): + super(Conv1dSubsampler, self).__init__() + self.strides = strides + self.n_layers = len(kernel_sizes) + self.conv_layers = nn.ModuleList( + nn.Conv1d( + in_channels if i == 0 else mid_channels // 2, + mid_channels if i < self.n_layers - 1 else out_channels * 2, + k, + stride=s, + padding=k // 2, + ) + for i, (k, s) in enumerate(zip(kernel_sizes, strides)) + ) + + def get_out_seq_lens_tensor(self, in_seq_lens_tensor): + out = in_seq_lens_tensor.clone() + for i in range(self.n_layers): + out = ((out.float() - 1) / self.strides[i] + 1).floor().long() + return out + + def forward(self, src_tokens, src_lengths): + bsz, in_seq_len, _ = src_tokens.size() # B x T x (C x D) + x = src_tokens.transpose(1, 2).contiguous() # -> B x (C x D) x T + for conv in self.conv_layers: + x = conv(x) + x = nn.functional.glu(x, dim=1) + _, _, out_seq_len = x.size() + x = x.transpose(1, 2).transpose(0, 1).contiguous() # -> T x B x (C x D) + return x, self.get_out_seq_lens_tensor(src_lengths) + +@dataclass +class DecoderConfig(FairseqDataclass): + # Text + vocab_size: int = -1 + + # Fairscale + checkpoint_activations: bool = False + fsdp: bool = False + ddp_rank: int = 0 + flash_attention: bool = False + sope_rel_pos: bool = False + scale_length: int = 2048 + + + def override(self, args): + for hp in self.__dict__.keys(): + if getattr(args, hp, None) is not None: + self.__dict__[hp] = getattr(args, hp, None) + + +@dataclass +class SpeechLLMMOdelConfig(DecoderConfig): + llama_checkpoint: str = "" + speechllm_checkpoint: str = "" + vicuna_model_path: str = 'lmsys/vicuna-7b-v1.5' + # n_xatt: int = 16 + n_xatt: int = field( + default=16, + metadata={"help": "the number of xatt"}, + ) + d_att: int = field( + default=256, + metadata={"help": "the dimension of xatt"}, + ) + d_ffn: int = field( + default=256, + metadata={"help": "the dimension of ffn in xatt"}, + ) + freeze_gpt: bool = field( + default=True + ) + freeze_audio_encoder: bool = field( + default=True + ) + whisper_path: str = field( + default="openai/whisper-large-v2" + # default="openai/whisper-small.en" + ) + wavlm_path: str = field( + default="microsoft/wavlm-base" + # default="openai/whisper-small.en" + ) + wavlm_output_weight: bool = field( + default=False + ) + wavlm_output_weight_by_prompts: bool = field( + default=False + ) + wavlm_plus: bool = field( + default=False + ) + wavlm_plus_weight: bool = field( + default=False + ) + wavlm_plus_1layer: bool = field( + default=False + ) + wavlm_plus_1layer_5: bool = field( + default=False + ) + wavlm_plus_5layer: bool = field( + default=False + ) + wavlm_first_7_layers: bool = field( + default=False + ) + load_pretrained_encoder_from: str = field( + default="" + ) + use_lora: bool = field( + default=False + ) + +class TextEmbedding(nn.Embedding): + def reset_parameters(self): + nn.init.normal_(self.weight, mean=0, std=self.embedding_dim**-0.5) + self._fill_padding_idx_with_zero() + + +@register_model("speechllm_model", dataclass=SpeechLLMMOdelConfig) +class SpeechLLMModel(BaseFairseqModel): + """Adapted Transformer model (https://arxiv.org/abs/1706.03762) for + speech-to-text tasks. The Transformer encoder/decoder remains the same. + A trainable input subsampler is prepended to the Transformer encoder to + project inputs into the encoder dimension as well as downsample input + sequence for computational efficiency.""" + + def __init__(self, cfg: SpeechLLMMOdelConfig, task): + super().__init__() + logger.info(f"SpeechLLMModel Config: {cfg}") + self.cfg = cfg + self.task = task + cfg.freeze_audio_encoder = task.cfg.freeze_audio_encoder + if task.cfg.llama_2: + cfg.llama_checkpoint = task.cfg.llama_2_path + + + self.audio_encoder = self.build_audio_encoder(cfg, task) + if self.task.cfg.use_wavlm: + self.cfg.wavlm_output_weight = task.cfg.wavlm_output_weight + self.cfg.wavlm_output_weight_by_prompts = task.cfg.wavlm_output_weight_by_prompts + self.cfg.wavlm_plus = task.cfg.wavlm_plus + self.cfg.wavlm_plus_weight = task.cfg.wavlm_plus_weight + self.cfg.wavlm_plus_1layer = task.cfg.wavlm_plus_1layer + self.cfg.wavlm_plus_1layer_5 = task.cfg.wavlm_plus_1layer_5 + self.cfg.wavlm_plus_5layer = task.cfg.wavlm_plus_5layer + self.cfg.wavlm_first_7_layers = task.cfg.wavlm_first_7_layers + self.wavlm_encoder = self.build_wavlm_encoder(cfg, task) + self.wavlm_audio_proj = nn.Linear(4096, 4096) + self.gpt_model = self.build_gpt_model(cfg, task) + self.audio_proj = nn.Linear(2048, 4096) + + @classmethod + def build_audio_encoder(cls, cfg, task): + if task.cfg.is_whisper: + if not task.cfg.whisper_with_decoder: + cfg.whisper_path = "openai/whisper-large-v2" + encoder = FairseqWhisperEncoder(cfg) + + pretraining_path = getattr(cfg, "load_pretrained_encoder_from", None) + if pretraining_path is not None and len(pretraining_path) > 0: + if not Path(pretraining_path).exists(): + logger.warning( + f"skipped pretraining because {pretraining_path} does not exist" + ) + else: + state = torch.load(pretraining_path, map_location="cpu") + + component_state_dict = OrderedDict() + component_type = "audio_encoder" + for key in state["model"].keys(): + if key.startswith(component_type): + # encoder.input_layers.0.0.weight --> input_layers.0.0.weight + component_subkey = key[len(component_type) + 1 :] + component_state_dict[component_subkey] = state["model"][key] + encoder.load_state_dict(component_state_dict, strict=True) + + logger.info(f"loaded pretrained encoder from: {pretraining_path}") + return encoder + + @classmethod + def build_wavlm_encoder(cls, cfg, task): + cfg.wavlm_path = "microsoft/wavlm-base" + encoder = FairseqWavLMEncoder(cfg) + return encoder + + @classmethod + def build_gpt_model(cls, cfg, task): + gpt_model = LLaMADecoder(dictionary=task.tgt_dict, + llama_checkpoint=cfg.llama_checkpoint, + n_xatt=cfg.n_xatt, + d_att=cfg.d_att, + d_ffn=cfg.d_ffn, + use_lora=task.cfg.use_lora, + lora_only_qv=task.cfg.lora_only_qv, + lora_scale_train=task.cfg.lora_scale_train, + lora_scale_index=task.cfg.lora_scale_index, + lora_scale_random=task.cfg.lora_scale_random, + lora_task_index=task.cfg.lora_task_index, + lora_moe=task.cfg.lora_moe, + lora_moe_scaling=task.cfg.lora_moe_scaling, + lora_moe_n_experts=task.cfg.lora_moe_n_experts, + lora_r=task.cfg.lora_r, + lora_alpha=task.cfg.lora_alpha, + enable_fsdp=task.cfg.enable_fsdp, + use_xformers=task.cfg.use_xformers, + second_stage_update_scale=task.cfg.second_stage_update_scale, + second_stage_fix_lora=task.cfg.second_stage_fix_lora, + scale_only_one=task.cfg.scale_only_one, + scale_with_audio=task.cfg.scale_with_audio, + scale_0_1=task.cfg.scale_0_1, + scale_predict_time=task.cfg.scale_predict_time, + scale_predict_all_dim=task.cfg.scale_predict_all_dim, + scale_predict_all_dim_each_layer=task.cfg.scale_predict_all_dim_each_layer, + prompt_loss=task.cfg.prompt_loss, + use_llama_adapter=task.cfg.use_llama_adapter,) + return gpt_model + + @classmethod + def build_model(cls, cfg, task): + """Build a new model instance.""" + return cls(cfg, task) + + def get_targets(self, sample, net_output): + return sample['target'][sample['net_input']['target_masks']] + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + # net_output['encoder_out'] is a (B, T, D) tensor + #print ("net_output: ", net_output) + lprobs = self.get_normalized_probs_scriptable(net_output[0], log_probs, sample) + lprobs.batch_first = True + return lprobs \ No newline at end of file diff --git a/WavLLM/wavllm/models/wavlm.py b/WavLLM/wavllm/models/wavlm.py new file mode 100644 index 0000000..a03d19e --- /dev/null +++ b/WavLLM/wavllm/models/wavlm.py @@ -0,0 +1,159 @@ +from typing import Optional, Tuple +from dataclasses import dataclass +import os + +import torch +from transformers import WavLMConfig +from transformers.models.wavlm.modeling_wavlm import WavLMModel, WavLMEncoderLayerStableLayerNorm +from transformers.utils import ModelOutput + +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Embedding, Linear + +from fairseq.data.data_utils import lengths_to_padding_mask, lengths_to_mask +from fairseq.models import ( + FairseqEncoder, + FairseqDecoder, + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) +from ..modules.convolution import Conv1dSubsampler +from typing import Optional, Tuple, List +from dataclasses import dataclass +from sentencepiece import SentencePieceProcessor +import math +import json +import os +import numpy as np +from functools import partial +import time + +from torch.distributed.algorithms._checkpoint.checkpoint_wrapper import ( + checkpoint_wrapper, + CheckpointImpl, + apply_activation_checkpointing, +) + +non_reentrant_wrapper = partial( + checkpoint_wrapper, + checkpoint_impl=CheckpointImpl.NO_REENTRANT, +) + +check_fn_encoder = lambda submodule: isinstance(submodule, WavLMEncoderLayerStableLayerNorm) + +def apply_fsdp_checkpointing(model): + """apply activation checkpointing to model + returns None as model is updated directly + """ + print(f"--> applying fsdp activation checkpointing...") + + apply_activation_checkpointing( + model, checkpoint_wrapper_fn=non_reentrant_wrapper, check_fn=check_fn_encoder + ) + +class WavLMAdapter(nn.Module): + def __init__( + self, + input_size: int, + down_size: int, + activation: str + ): + super(WavLMAdapter, self).__init__() + self.down_layer = nn.Linear(input_size, down_size) + self.up_layer = nn.Linear(down_size, input_size) + self.non_linearity = F.relu if activation == 'relu' else F.gelu + self.layer_norm = nn.LayerNorm(input_size) + + def forward(self, src_tokens): + return self.layer_norm(self.up_layer(self.non_linearity(self.down_layer(src_tokens)))) + src_tokens + +class FairseqWavLMEncoder(FairseqEncoder): + + def __init__(self, args): + super().__init__(None) + + torch.set_printoptions(precision=10) + + self.model = WavLMModel.from_pretrained(args.wavlm_path) + self.config = self.model.config + self.wavlm_plus = args.wavlm_plus + self.wavlm_plus_weight = args.wavlm_plus_weight + self.wavlm_plus_1layer = args.wavlm_plus_1layer + self.wavlm_plus_1layer_5 = args.wavlm_plus_1layer_5 + self.wavlm_plus_5layer = args.wavlm_plus_5layer + + for param in self.model.parameters(): + param.requires_grad = False + + self.wavlm_output_weight = args.wavlm_output_weight + self.wavlm_output_weight_by_prompts = args.wavlm_output_weight_by_prompts + self.wavlm_first_7_layers = args.wavlm_first_7_layers + self.adapter = WavLMAdapter(1024, 512, "gelu") + self.projector = nn.Linear(1024, 2048) + self.subsample = Conv1dSubsampler(768, 512, 1024, [3, 3]) + if self.wavlm_output_weight: + initial_weights = torch.ones(13, requires_grad=True).float() + self.output_weights = nn.Parameter(initial_weights).to(self.projector.weight) + self.weights_predictor = None + + def forward( + self, src_tokens, attention_mask, prompt_embedding=None, + ): + extract_features = self.model.feature_extractor(src_tokens) + extract_features = extract_features.transpose(1, 2) + attention_mask = self.model._get_feature_vector_attention_mask(extract_features.shape[1], attention_mask) + hidden_states, extract_features = self.model.feature_projection(extract_features) + hidden_states = self.model._mask_hidden_states( + hidden_states, attention_mask=attention_mask + ) + + encoder_outputs = self.model.encoder( + hidden_states, + attention_mask=attention_mask, + output_attentions=False, + output_hidden_states=True, + return_dict=True, + ) + + src_lengths = attention_mask.sum(-1).to(torch.long) + if self.wavlm_output_weight: + norm_output_weights = F.softmax(self.output_weights, dim=0) + weighted_output = [output * weight for output, weight in zip(encoder_outputs.hidden_states, norm_output_weights)] + wavlm_output = torch.stack(weighted_output).sum(dim=0) + + outputs, src_lengths = self.subsample(wavlm_output, src_lengths) + outputs = outputs.transpose(0, 1).contiguous() + outputs = self.adapter(outputs) + outputs = self.projector(outputs) + + attention_mask = lengths_to_mask(src_lengths) + return { + "encoder_out": outputs, # B T C + "encoder_padding_mask": attention_mask # B T + } + + + def forward_torchscript(self, net_input, prompt_embedding=None): + + example_wavlm_src_tokens = net_input.get("example_wavlm_src_tokens") + example_wavlm_speech_masks = net_input.get("example_wavlm_speech_masks") + example_wavlm_audio_out = None + + wavlm_src_tokens = net_input["wavlm_src_tokens"] + wavlm_speech_masks = net_input["wavlm_speech_masks"] + + wavlm_input = torch.stack(wavlm_src_tokens, dim=0) + wavlm_speech_masks_input = torch.stack(wavlm_speech_masks, dim=0) + wavlm_audio_out = self.forward(src_tokens=wavlm_input, attention_mask=wavlm_speech_masks_input, prompt_embedding=prompt_embedding) + + return wavlm_audio_out, example_wavlm_audio_out + + def reorder_encoder_out(self, encoder_out, new_order): + new_encoder_hidden = encoder_out["encoder_out"].index_select(0, new_order) + new_encoder_padding_mask = encoder_out["encoder_padding_mask"].to(new_order.device).index_select(0, new_order) + return { + "encoder_out": new_encoder_hidden, # B T C + "encoder_padding_mask": new_encoder_padding_mask # B T + } diff --git a/WavLLM/wavllm/models/whisper_encoder.py b/WavLLM/wavllm/models/whisper_encoder.py new file mode 100644 index 0000000..065a7a7 --- /dev/null +++ b/WavLLM/wavllm/models/whisper_encoder.py @@ -0,0 +1,219 @@ +from typing import Optional, Tuple +from dataclasses import dataclass +import os + +import torch +from transformers import WhisperConfig +from transformers.models.whisper.modeling_whisper import WhisperEncoder as HFWhisperEncoder +from transformers.utils import ModelOutput +from transformers.models.whisper.modeling_whisper import WhisperEncoderLayer, WhisperDecoderLayer +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import Embedding, Linear + +from fairseq.data.data_utils import lengths_to_padding_mask, lengths_to_mask +from fairseq.models import ( + FairseqEncoder, + FairseqDecoder, + FairseqEncoderDecoderModel, + register_model, + register_model_architecture, +) +from ..modules.convolution import Conv1dSubsampler +from typing import Optional, Tuple, List +from dataclasses import dataclass +from sentencepiece import SentencePieceProcessor +import math +import json +import os +import numpy as np +from functools import partial +import time + +from torch.distributed.algorithms._checkpoint.checkpoint_wrapper import ( + checkpoint_wrapper, + CheckpointImpl, + apply_activation_checkpointing, +) + +non_reentrant_wrapper = partial( + checkpoint_wrapper, + checkpoint_impl=CheckpointImpl.NO_REENTRANT, +) + +check_fn_encoder = lambda submodule: isinstance(submodule, WhisperEncoderLayer) + +def apply_fsdp_checkpointing(model): + """apply activation checkpointing to model + returns None as model is updated directly + """ + print(f"--> applying fsdp activation checkpointing...") + + apply_activation_checkpointing( + model, checkpoint_wrapper_fn=non_reentrant_wrapper, check_fn=check_fn_encoder + ) + +def lengths_to_padding_mask(lens): + bsz, max_lens = lens.size(0), torch.max(lens).item() + mask = torch.arange(max_lens).to(lens.device).view(1, max_lens) + mask = mask.expand(bsz, -1) >= lens.view(bsz, 1).expand(-1, max_lens) + return mask + +@dataclass +class WhisperOutput(ModelOutput): + last_hidden_state: torch.FloatTensor = None + hidden_states: Optional[Tuple[torch.FloatTensor]] = None + attentions: Optional[Tuple[torch.FloatTensor]] = None + output_lengths: Optional[torch.LongTensor] = None + +class WhisperAdapter(nn.Module): + def __init__( + self, + input_size: int, + down_size: int, + activation: str + ): + super(WhisperAdapter, self).__init__() + self.down_layer = nn.Linear(input_size, down_size) + self.up_layer = nn.Linear(down_size, input_size) + self.non_linearity = F.relu if activation == 'relu' else F.gelu + self.layer_norm = nn.LayerNorm(input_size) + + def forward(self, src_tokens): + return self.layer_norm(self.up_layer(self.non_linearity(self.down_layer(src_tokens)))) + src_tokens + +class FairseqWhisperEncoder(FairseqEncoder): + + def __init__(self, args): + super().__init__(None) + self.model = WhisperEncoder.from_pretrained(args.whisper_path) + self.config = self.model.config + + for param in self.model.parameters(): + param.requires_grad = False + + + self.adapter = WhisperAdapter(1024, 512, "gelu") + self.projector = nn.Linear(1024, 2048) + self.subsample = Conv1dSubsampler(1280, 1280, 1024, [3, 3]) + apply_fsdp_checkpointing(self.model) + + def forward( + self, src_tokens, attention_mask, + ): + hidden_states = src_tokens + encoder_outputs = self.model( + hidden_states, + attention_mask=attention_mask, + output_attentions=False, + output_hidden_states=False, + return_dict=True, + ) + + speech_lengths = encoder_outputs.output_lengths + outputs, speech_lengths = self.subsample(encoder_outputs.last_hidden_state, speech_lengths) + outputs = outputs.transpose(0, 1).contiguous() + speech_padding_mask = lengths_to_padding_mask(speech_lengths) + speech_atts = ~speech_padding_mask + outputs = self.adapter(outputs) + outputs = self.projector(outputs) + return { + # "encoder_out": encoder_outputs[0], # B T C + "encoder_out": outputs, # B T C + "encoder_padding_mask": speech_atts + } + + def split_wav_codec(self, audio_out, wav_n): + ori_type = audio_out['encoder_out'].dtype + split_audio_out = torch.split(audio_out['encoder_out'], wav_n, dim=0) + split_padding_mask = torch.split(audio_out['encoder_padding_mask'], wav_n, dim=0) + padded_audio_out = [] + padded_padding_mask = [] + for a, p in zip(split_audio_out, split_padding_mask): + if a.shape[0] < max(wav_n): + a_size = list(a.shape) + a_size[0] = max(wav_n) - a.shape[0] + a_pad_tensor = torch.zeros(a_size).to(a.device) + a = torch.cat((a, a_pad_tensor), dim=0) + + p_size = list(p.shape) + p_size[0] = max(wav_n) - p.shape[0] + p_pad_tensor = torch.zeros(p_size).bool().to(p.device) + p = torch.cat((p, p_pad_tensor), dim=0) + padded_audio_out.append(a) + padded_padding_mask.append(p) + + audio_out['encoder_out'] = torch.stack([torch.cat(tuple(t[i] for i in range(max(wav_n))), dim=0) for t in padded_audio_out]).to(ori_type) + audio_out['encoder_padding_mask'] = torch.stack([torch.cat(tuple(t[i] for i in range(max(wav_n))), dim=0) for t in padded_padding_mask]) + return audio_out + + def forward_torchscript(self, net_input): + example_src_tokens = net_input.get("example_src_tokens") + example_speech_masks = net_input.get("example_speech_masks") + example_audio_out = None + + src_tokens = net_input["src_tokens"] + speech_masks = net_input["speech_masks"] + + wav_n = [len(src_token) for src_token in src_tokens] + + stacked_input = torch.stack([tensor for lst in src_tokens for tensor in lst]) + stacked_mask = torch.stack([tensor for lst in speech_masks for tensor in lst]) + + audio_out = self.forward(stacked_input, stacked_mask) + + audio_out = self.split_wav_codec(audio_out, wav_n) + example_audio_out = None + + return audio_out, example_audio_out + + def reorder_encoder_out(self, encoder_out, new_order): + new_encoder_hidden = encoder_out["encoder_out"].index_select(0, new_order) + new_encoder_padding_mask = encoder_out["encoder_padding_mask"].to(new_order.device).index_select(0, new_order) + return { + "encoder_out": new_encoder_hidden, # B T C + "encoder_padding_mask": new_encoder_padding_mask # B T + } + +class WhisperEncoder(HFWhisperEncoder): + """ + overwrite forward to support attention_mask + overwrite from_pretrained to support split encoder parameters from pretrained WhisperModel + """ + + def from_pretrained(model_path): + config = WhisperConfig.from_pretrained(model_path) + + model = WhisperEncoder(config) + return model + + def forward( + self, + input_features, + attention_mask=None, + head_mask=None, + output_attentions=None, + output_hidden_states=None, + return_dict=None, + ): + output = super().forward( + input_features, + attention_mask, + head_mask, + output_attentions, + output_hidden_states, + return_dict + ) + + last_hidden_state = output.last_hidden_state # B x T x C + input_lengths = attention_mask.sum(-1) + output_lengths = self._get_feat_extract_output_lengths(input_lengths) + max_length = output_lengths.max() + last_hidden_state = last_hidden_state[:,:max_length,:] + + return WhisperOutput( + last_hidden_state=last_hidden_state, + hidden_states=None, + attentions=None, + output_lengths=output_lengths + ) \ No newline at end of file diff --git a/WavLLM/wavllm/modules/convolution.py b/WavLLM/wavllm/modules/convolution.py new file mode 100644 index 0000000..65dd9bb --- /dev/null +++ b/WavLLM/wavllm/modules/convolution.py @@ -0,0 +1,126 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + + +from typing import List + +import torch +import torch.nn as nn + + +class Conv1dSubsampler(nn.Module): + """Convolutional subsampler: a stack of 1D convolution (along temporal + dimension) followed by non-linear activation via gated linear units + (https://arxiv.org/abs/1911.08460) + + Args: + in_channels (int): the number of input channels + mid_channels (int): the number of intermediate channels + out_channels (int): the number of output channels + kernel_sizes (List[int]): the kernel size for each convolutional layer + """ + + def __init__( + self, + in_channels: int, + mid_channels: int, + out_channels: int, + kernel_sizes: List[int] = (3, 3), + ): + super(Conv1dSubsampler, self).__init__() + self.n_layers = len(kernel_sizes) + self.conv_layers = nn.ModuleList( + nn.Conv1d( + in_channels if i == 0 else mid_channels // 2, + mid_channels if i < self.n_layers - 1 else out_channels * 2, + k, + stride=2, + padding=k // 2, + ) + for i, k in enumerate(kernel_sizes) + ) + + def get_out_seq_lens_tensor(self, in_seq_lens_tensor): + out = in_seq_lens_tensor.clone() + for _ in range(self.n_layers): + out = ((out.float() - 1) / 2 + 1).floor().long() + return out + + def forward(self, src_tokens, src_lengths): + bsz, in_seq_len, _ = src_tokens.size() # B x T x (C x D) + x = src_tokens.transpose(1, 2).contiguous() # -> B x (C x D) x T + for conv in self.conv_layers: + x = conv(x) + x = nn.functional.glu(x, dim=1) + _, _, out_seq_len = x.size() + x = x.transpose(1, 2).transpose(0, 1).contiguous() # -> T x B x (C x D) + return x, self.get_out_seq_lens_tensor(src_lengths) + + +def infer_conv_output_dim(in_channels, input_dim, out_channels): + sample_seq_len = 200 + sample_bsz = 10 + x = torch.randn(sample_bsz, in_channels, sample_seq_len, input_dim) + x = torch.nn.Conv2d(in_channels, out_channels, 3, stride=2, padding=3 // 2)(x) + x = torch.nn.Conv2d(out_channels, out_channels, 3, stride=2, padding=3 // 2)(x) + x = x.transpose(1, 2) + mb, seq = x.size()[:2] + return x.contiguous().view(mb, seq, -1).size(-1) + + +class Conv2dSubsampler(nn.Module): + """Convolutional subsampler: a stack of 2D convolution based on ESPnet implementation + (https://github.com/espnet/espnet) + + Args: + input_channels (int): the number of input channels + input_feat_per_channel (int): encoder input dimension per input channel + conv_out_channels (int): the number of output channels of conv layer + encoder_embed_dim (int): encoder dimentions + """ + + def __init__( + self, + input_channels: int, + input_feat_per_channel: int, + conv_out_channels: int, + encoder_embed_dim: int, + ): + super().__init__() + assert input_channels == 1, input_channels + self.conv = torch.nn.Sequential( + torch.nn.Conv2d( + input_channels, conv_out_channels, 3, stride=2, padding=3 // 2 + ), + torch.nn.ReLU(), + torch.nn.Conv2d( + conv_out_channels, + conv_out_channels, + 3, + stride=2, + padding=3 // 2, + ), + torch.nn.ReLU(), + ) + transformer_input_dim = infer_conv_output_dim( + input_channels, input_feat_per_channel, conv_out_channels + ) + self.out = torch.nn.Linear(transformer_input_dim, encoder_embed_dim) + + def forward(self, src_tokens, src_lengths): + B, T_i, C = src_tokens.size() + x = src_tokens.view(B, T_i, 1, C).transpose(1, 2).contiguous() + x = self.conv(x) + B, _, T_o, _ = x.size() + x = x.transpose(1, 2).transpose(0, 1).contiguous().view(T_o, B, -1) + x = self.out(x) + + subsampling_factor = int(T_i * 1.0 / T_o + 0.5) + input_len_0 = (src_lengths.float() / subsampling_factor).ceil().long() + input_len_1 = x.size(0) * torch.ones([src_lengths.size(0)]).long().to( + input_len_0.device + ) + input_lengths = torch.min(input_len_0, input_len_1) + return x, input_lengths \ No newline at end of file diff --git a/WavLLM/wavllm/requirements.txt b/WavLLM/wavllm/requirements.txt new file mode 100644 index 0000000..f7c634f --- /dev/null +++ b/WavLLM/wavllm/requirements.txt @@ -0,0 +1,7 @@ +fairscale==0.4.13 +fairseq==0.12.2 +numpy==1.24.3 +omegaconf==2.0.6 +sentencepiece==0.1.99 +torch==2.0.1 +transformers==4.32.1 diff --git a/WavLLM/wavllm/scripts/inference_sft.sh b/WavLLM/wavllm/scripts/inference_sft.sh new file mode 100644 index 0000000..d0381d2 --- /dev/null +++ b/WavLLM/wavllm/scripts/inference_sft.sh @@ -0,0 +1,39 @@ +export CUDA_VISIBLE_DEVICES=0 +export HYDRA_FULL_ERROR=1 +export PYTHONPATH=$$PYTHONPATH:${PWD} + +model_path=$1 +[ -z $model_path ] && model_path="?" + +src_dir=${model_path%/*} +cpt=${model_path##*/} +cpt=${cpt%.*} + +gen_set=$2 +[ -z $gen_set ] && gen_set="?" +[ -z $beam_size ] && beam_size=1 + + +FAIRSEQ_ROOT=${PWD} +DATA_DIR=$FAIRSEQ_ROOT/examples/wavllm/test_data + +for subset in $gen_set; do + results_path=$src_dir/decode_${cpt}_beam${beam_size}/${subset} + [ ! -d $results_path ] && mkdir -p $results_path + + python $FAIRSEQ_ROOT/examples/wavllm/inference/generate.py $DATA_DIR \ + --user-dir examples/wavllm \ + --tokenizer-path $FAIRSEQ_ROOT/examples/wavllm/tokenizer/tokenizer.model \ + --gen-subset ${subset} \ + \ + --task speechllm_task \ + \ + --path ${model_path} \ + --results-path $results_path \ + \ + --scoring wer \ + --skip-invalid-size-inputs-valid-test \ + --max-tokens 1600000 \ + --sampling --beam 1 --nbest 1 --temperature 0.5 \ + --max-len-a 0 --max-len-b 512 +done \ No newline at end of file diff --git a/WavLLM/wavllm/tasks/speechllm_task.py b/WavLLM/wavllm/tasks/speechllm_task.py new file mode 100644 index 0000000..dfeeecb --- /dev/null +++ b/WavLLM/wavllm/tasks/speechllm_task.py @@ -0,0 +1,533 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +from pathlib import Path +from argparse import Namespace + +from fairseq.data import Dictionary, encoders +from ..data.speechllm_dataset import ( + SpeechLLMDataset, + get_features_or_waveform, +) + +from transformers import WhisperProcessor + +from ..data.tokenizer import Tokenizer +from transformers import WhisperProcessor, AutoProcessor, AutoFeatureExtractor +from fairseq.tasks import FairseqTask, LegacyFairseqTask, register_task +from dataclasses import dataclass, field +from fairseq.dataclass import ChoiceEnum, FairseqDataclass +from fairseq.data import ResamplingDataset, ConcatDataset +from typing import Optional, Any, List +import os +from fairseq import search, utils + +logger = logging.getLogger(__name__) + + +class Dictionary_for_pad(Dictionary): + """A mapping from symbols to consecutive integers""" + + def __init__( + self, + *, # begin keyword-only arguments + pad="<pad>", ## pad_id = 0 + bos="<s>", + eos="</s>", + unk="<unk>", + extra_special_symbols=None, + ): + self.bos_word, self.unk_word, self.pad_word, self.eos_word = bos, unk, pad, eos + self.symbols = [] + self.count = [] + self.indices = {} + self.pad_index = self.add_symbol(pad) ## let pad_id = 0 + self.bos_index = self.add_symbol(bos) # 1 + self.eos_index = self.add_symbol(eos) # 2 + self.unk_index = self.add_symbol(unk) # 3 + if extra_special_symbols: + for s in extra_special_symbols: + self.add_symbol(s) + self.nspecial = len(self.symbols) + +@dataclass +class SpeechLLMTaskConfig(FairseqDataclass): + data: Optional[str] = field( + default=None, metadata={"help": "manifest root path"} + ) + max_source_positions: int = field( + default=640000, + metadata={"help": "max number of tokens in the source sequence"}, + ) + max_target_positions: int = field( + default=6000, + metadata={"help": "max number of tokens in the target sequence"}, + ) + tokenizer_path: Optional[str] = field( + default=None, metadata={"help": "LLM tokenizer model path"} + ) + processor_path: Optional[str] = field( + default=None, metadata={"help": "audio encoder's processor path"} + ) + wavlm_processor_path: Optional[str] = field( + default=None, metadata={"help": "wavlm encoder's processor path"} + ) + seed: int = field( + default=12345, + metadata={"help": "random seed"}, + ) + audio_root: Optional[str] = field( + default="", metadata={"help": "audio root path"} + ) + + prepend_tgt_lang_tag: bool = field( + default=False + ) + shuffle: bool = field( + default=True + ) + use_audio_input: bool = field( + default=True + ) + is_whisper: bool = field( + default=False + ) + whisper_with_decoder: bool = field( + default=True + ) + whisper_token_len: int = field( + default=64 + ) + freeze_audio_encoder: bool = field( + default=True + ) + use_sample_rate: int = field( + default=16000, + metadata={"help": "sample rate for speech input"}, + ) + reload_speechllm: bool = field( + default=False + ) + use_vicuna: bool = field( + default=False + ) + sft_stage: bool = field( + default=False + ) + use_lora: bool = field( + default=False + ) + lora_r: int = field( + default=8 + ) + lora_alpha: int = field( + default=32 + ) + lora_scale_train: bool = field( + default=False + ) + lora_scale_index: bool = field( + default=False + ) + lora_task_index: bool = field( + default=False + ) + lora_scale_random: bool = field( + default=False + ) + lora_moe: bool = field( + default=False + ) + lora_moe_n_experts: int = field( + default=3 + ) + lora_moe_scaling: bool = field( + default=False + ) + llama_2: bool = field( + default=False + ) + llama_2_path: str = field( + default="" + ) + parallel_mode: bool = field( + default=False + ) + enable_fsdp: bool = field( + default=False + ) + continue_write_task: bool = field( + default=False + ) + only_text: bool = field( + default=False + ) + alpaca_text: bool = field( + default=False + ) + with_codec: bool = field( + default=False + ) + after_adapter: bool = field( + default=False + ) + get_codec_online: bool = field( + default=False + ) + in_context_infer: bool = field( + default=False + ) + in_context_train: bool = field( + default=False + ) + pretrained_checkpoint: str = field( + default="" + ) + prompt_bulid: bool = field( + default=False + ) + prompt_before_speech: bool = field( + default=False + ) + use_xformers: bool = field( + default=False + ) + small_scale_training: bool = field( + default=False + ) + second_stage_update_scale: bool = field( + default=False + ) + second_stage_fix_lora: bool = field( + default=False + ) + scale_only_one: bool = field( + default=False + ) + scale_with_audio: bool = field( + default=True + ) + scale_0_1: bool = field( + default=True + ) + scale_predict_time: bool = field( + default=False + ) + scale_predict_all_dim: bool = field( + default=False + ) + scale_predict_all_dim_each_layer: bool = field( + default=False + ) + second_stage_update_lora: bool = field( + default=False + ) + second_stage_add_lora: bool = field( + default=False + ) + lora_only_qv: bool = field( + default=False + ) + load_pretrained_model: bool = field( + default=True + ) + prompt_loss: bool = field( + default=False + ) + use_llama_adapter: bool = field( + default=False + ) + codec_weights: bool = field( + default=False + ) + use_wavlm: bool = field( + default=False + ) + wavlm_weights: bool = field( + default=False + ) + wavlm_output_weight: bool = field( + default=False + ) + wavlm_output_weight_by_prompts: bool = field( + default=False + ) + wavlm_first_7_layers: bool = field( + default=False + ) + wavlm_plus: bool = field( + default=False + ) + wavlm_plus_weight: bool = field( + default=False + ) + wavlm_plus_1layer: bool = field( + default=False + ) + wavlm_plus_1layer_5: bool = field( + default=False + ) + wavlm_plus_5layer: bool = field( + default=False + ) + skip_whisper: bool = field( + default=False + ) + +@register_task("speechllm_task", dataclass=SpeechLLMTaskConfig) +class SpeechLLMTask(FairseqTask): + + + def __init__(self, cfg: SpeechLLMTaskConfig): + """""" + cfg: SpeechLLMTaskConfig + super().__init__(cfg) + logger.info(f"current directory is {os.getcwd()}") + logger.info(f"Task Config {cfg}") + self.cfg = cfg + + self.tgt_dict = Dictionary_for_pad.load(f"{self.cfg.data}/dict.txt") + #self.data_cfg = SpeechLLMDataConfig(Path(args.data) / args.config_yaml) + #self.speaker_to_id = self._get_speaker_to_id( + + @classmethod + def setup_task(cls, cfg, **kwargs): + # data_cfg = SpeechLLMDataConfig(Path(args.data) / args.config_yaml) + # dict_path = Path(args.data) / data_cfg.vocab_filename + # if not dict_path.is_file(): + # raise FileNotFoundError(f"Dict not found: {dict_path.as_posix()}") + # tgt_dict = Dictionary.load(dict_path.as_posix()) + # logger.info( + # f"dictionary size ({data_cfg.vocab_filename}): " f"{len(tgt_dict):,}" + # ) + + # if getattr(args, "train_subset", None) is not None: + # if not all(s.startswith("train") for s in args.train_subset.split(",")): + # raise ValueError('Train splits should be named like "train*".') + return cls(cfg) + + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + is_train_split = split.startswith("train") + # pre_tokenizer = self.build_tokenizer(self.args) + # bpe_tokenizer = self.build_bpe(self.args) + text_tokenizer = self.build_tokenizer(self.cfg.tokenizer_path) + if self.cfg.is_whisper: + audio_processor = self.bulid_processor(self.cfg.processor_path) + else: + audio_processor = None + + if self.cfg.use_wavlm: + wavlm_feature_extractor = AutoFeatureExtractor.from_pretrained(self.cfg.wavlm_processor_path) + else: + wavlm_feature_extractor = None + + self.n_words = text_tokenizer.n_words + self.tokenizer = text_tokenizer + + datasets = [ + SpeechLLMDataset( + self.cfg, + data_root=self.cfg.data, + split=subset, + text_tokenizer=text_tokenizer, + audio_processor=audio_processor, + wavlm_processor=wavlm_feature_extractor, + is_train_split=is_train_split, + #seed=self.cfg.seed, + ) for subset in split.split(",") + ] + + if is_train_split and len(datasets) > 1 and cfg.sampling_alpha != 1.0: + # temperature-based sampling + size_ratios = cls.get_size_ratios(datasets, alpha=cfg.sampling_alpha) + datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=self.cfg.seed, epoch=epoch, replace=(r >= 1.0) + ) + for r, d in zip(size_ratios, datasets) + ] + + self.datasets[split] = ConcatDataset(datasets) if len(datasets) > 1 else datasets[0] + + + @property + def target_dictionary(self): + return self.tgt_dict + + @property + def source_dictionary(self): + return None + + def max_positions(self): + return self.cfg.max_source_positions, self.cfg.max_target_positions + + def build_model(self, args): + model = super().build_model(args) + return model + + def build_generator( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + ): + + if extra_gen_cls_kwargs is None: + extra_gen_cls_kwargs = {} + return self.build_generator_base( + models, args, seq_gen_cls=None, extra_gen_cls_kwargs=extra_gen_cls_kwargs + ) + + def build_generator_base( + self, + models, + args, + seq_gen_cls=None, + extra_gen_cls_kwargs=None, + prefix_allowed_tokens_fn=None, + ): + """ + Build a :class:`~fairseq.SequenceGenerator` instance for this + task. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + args (fairseq.dataclass.configs.GenerationConfig): + configuration object (dataclass) for generation + extra_gen_cls_kwargs (Dict[str, Any]): extra options to pass + through to SequenceGenerator + prefix_allowed_tokens_fn (Callable[[int, torch.Tensor], List[int]]): + If provided, this function constrains the beam search to + allowed tokens only at each step. The provided function + should take 2 arguments: the batch ID (`batch_id: int`) + and a unidimensional tensor of token ids (`inputs_ids: + torch.Tensor`). It has to return a `List[int]` with the + allowed tokens for the next generation step conditioned + on the previously generated tokens (`inputs_ids`) and + the batch ID (`batch_id`). This argument is useful for + constrained generation conditioned on the prefix, as + described in "Autoregressive Entity Retrieval" + (https://arxiv.org/abs/2010.00904) and + https://github.com/facebookresearch/GENRE. + """ + if getattr(args, "score_reference", False): + from fairseq.sequence_scorer import SequenceScorer + + return SequenceScorer( + self.target_dictionary, + compute_alignment=getattr(args, "print_alignment", False), + ) + + from ..inference.sequence_generator import ( + SequenceGenerator, + ) + + # Choose search strategy. Defaults to Beam Search. + sampling = getattr(args, "sampling", False) + sampling_topk = getattr(args, "sampling_topk", -1) + sampling_topp = getattr(args, "sampling_topp", -1.0) + diverse_beam_groups = getattr(args, "diverse_beam_groups", -1) + diverse_beam_strength = getattr(args, "diverse_beam_strength", 0.5) + match_source_len = getattr(args, "match_source_len", False) + diversity_rate = getattr(args, "diversity_rate", -1) + constrained = getattr(args, "constraints", False) + if prefix_allowed_tokens_fn is None: + prefix_allowed_tokens_fn = getattr(args, "prefix_allowed_tokens_fn", None) + if ( + sum( + int(cond) + for cond in [ + sampling, + diverse_beam_groups > 0, + match_source_len, + diversity_rate > 0, + ] + ) + > 1 + ): + raise ValueError("Provided Search parameters are mutually exclusive.") + assert sampling_topk < 0 or sampling, "--sampling-topk requires --sampling" + assert sampling_topp < 0 or sampling, "--sampling-topp requires --sampling" + + if sampling: + search_strategy = search.Sampling( + self.target_dictionary, sampling_topk, sampling_topp + ) + elif diverse_beam_groups > 0: + search_strategy = search.DiverseBeamSearch( + self.target_dictionary, diverse_beam_groups, diverse_beam_strength + ) + elif match_source_len: + # this is useful for tagging applications where the output + # length should match the input length, so we hardcode the + # length constraints for simplicity + search_strategy = search.LengthConstrainedBeamSearch( + self.target_dictionary, + min_len_a=1, + min_len_b=0, + max_len_a=1, + max_len_b=0, + ) + elif diversity_rate > -1: + search_strategy = search.DiverseSiblingsSearch( + self.target_dictionary, diversity_rate + ) + elif constrained: + search_strategy = search.LexicallyConstrainedBeamSearch( + self.target_dictionary, args.constraints + ) + elif prefix_allowed_tokens_fn: + search_strategy = search.PrefixConstrainedBeamSearch( + self.target_dictionary, prefix_allowed_tokens_fn + ) + else: + search_strategy = search.BeamSearch(self.target_dictionary) + + extra_gen_cls_kwargs = extra_gen_cls_kwargs or {} + if seq_gen_cls is None: + seq_gen_cls = SequenceGenerator + + return seq_gen_cls( + models, + self.target_dictionary, + beam_size=getattr(args, "beam", 5), + max_len_a=getattr(args, "max_len_a", 0), + max_len_b=getattr(args, "max_len_b", 200), + min_len=getattr(args, "min_len", 1), + normalize_scores=(not getattr(args, "unnormalized", False)), + len_penalty=getattr(args, "lenpen", 1), + unk_penalty=getattr(args, "unkpen", 0), + temperature=getattr(args, "temperature", 1.0), + match_source_len=getattr(args, "match_source_len", False), + no_repeat_ngram_size=getattr(args, "no_repeat_ngram_size", 0), + search_strategy=search_strategy, + n_words=self.n_words, + **extra_gen_cls_kwargs, + ) + + def build_tokenizer(self, tokenizer_path): + logger.info(f"tokenizer: {self.cfg.tokenizer_path}") + text_tokenizer = Tokenizer(self.cfg.tokenizer_path) + return text_tokenizer + + def bulid_processor(self, processor_path): + if self.cfg.is_whisper: + logger.info(f"processor: {processor_path}") + audio_processor = AutoProcessor.from_pretrained(processor_path) + else: + audio_processor = None + return audio_processor + + def get_interactive_tokens_and_lengths(self, lines, encode_fn): + n_frames = [get_features_or_waveform(p).shape[0] for p in lines] + return lines, n_frames + + def build_dataset_for_inference(self, src_tokens, src_lengths, **kwargs): + return SpeechToTextDataset( + "interactive", False, self.data_cfg, src_tokens, src_lengths + ) diff --git a/WavLLM/wavllm/test_data/CoT-task-story.tsv b/WavLLM/wavllm/test_data/CoT-task-story.tsv new file mode 100644 index 0000000..2e25835 --- /dev/null +++ b/WavLLM/wavllm/test_data/CoT-task-story.tsv @@ -0,0 +1,2 @@ +id audio n_frames prompt tgt_text with_speech orig_story +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/CoT-task-story.wav 1079348 First of all, transcribe the audio recording into text, capturing every spoken word; Additionally given this audio clip and text, can you condense it into a clear, concise summary, no more than 20 words?; Lastly disregarding the sound, translate this English summary into German. Bis zum Jahr 2500 ist die Erde eine umweltfreundliche Utopie mit fortschrittlicher KI, neuronaler Vernetzung und einer perfekten Mischung aus Technologie und Natur. True In the year 2500, Earth gleamed like a sapphire, a futuristic utopia where harmony reigned. Skyscrapers, draped in lush greenery, stretched towards the heavens, their glass surfaces reflecting the tranquil azure of a pollution-free sky. Humanity had transcended past conflicts, embracing an era of shared consciousness through neural connectivity. Autonomous vehicles glided silently on solar pathways, while people mingled in serene communal spaces, their basic needs met by advanced AI that predicted and catered to their every whim. The Great Reconciliation had merged technology with nature, and in this new world, every individual thrived, their potential limited only by the expanses of their own creativity. The utopia wasn't just a place; it was the pulse of civilization, beating in perfect rhythm with the universe. \ No newline at end of file diff --git a/WavLLM/wavllm/test_data/CoT-task.tsv b/WavLLM/wavllm/test_data/CoT-task.tsv new file mode 100644 index 0000000..72500fe --- /dev/null +++ b/WavLLM/wavllm/test_data/CoT-task.tsv @@ -0,0 +1,2 @@ +id audio n_frames prompt with_speech tgt_text +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/CoT-task.wav 214437 First of all, transcribe the audio recording into text, capturing every spoken word; Additionally given this audio clip and text, can you condense it into a clear, concise summary, no more than 20 words?; Lastly disregarding the sound, translate this English summary into German. True Drei Filme aus dem asiatisch-pazifischen Raum im Rennen in Cannes \ No newline at end of file diff --git a/WavLLM/wavllm/test_data/II-task.tsv b/WavLLM/wavllm/test_data/II-task.tsv new file mode 100644 index 0000000..49d1f3c --- /dev/null +++ b/WavLLM/wavllm/test_data/II-task.tsv @@ -0,0 +1,2 @@ +id audio n_frames with_speech prompt tgt_text +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/II-task.wav 111111 True To begin, Transcribe the audio recording into text, capturing every spoken word; Subsequently, How does the woman finally decide to go home? A. By bus; B. In the man’s car; C. In her father’s car.; Furthermore, ignore the audio clip, What is the capital of New Zealand?; Lastly, Continue the narrative of given audio clip in a coherent and engaging way ASR+SQA+SFT+Continue \ No newline at end of file diff --git a/WavLLM/wavllm/test_data/SQA.tsv b/WavLLM/wavllm/test_data/SQA.tsv new file mode 100644 index 0000000..f497603 --- /dev/null +++ b/WavLLM/wavllm/test_data/SQA.tsv @@ -0,0 +1,2 @@ +id audio n_frames prompt tgt_text with_speech +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/sqa.wav 111111 What will the man do next? A. Start to take exercise; B. Do as he always does; C. Change his working time. A True diff --git a/WavLLM/wavllm/test_data/SQQA.tsv b/WavLLM/wavllm/test_data/SQQA.tsv new file mode 100644 index 0000000..4463e28 --- /dev/null +++ b/WavLLM/wavllm/test_data/SQQA.tsv @@ -0,0 +1,2 @@ +id audio n_frames prompt tgt_text with_speech +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/sqqa.wav 182574 The fundamental theorem of calculus is a theorem that links the concept of the derivative of a function with the concept of the integral . True \ No newline at end of file diff --git a/WavLLM/wavllm/test_data/asr.tsv b/WavLLM/wavllm/test_data/asr.tsv new file mode 100644 index 0000000..8a6dd42 --- /dev/null +++ b/WavLLM/wavllm/test_data/asr.tsv @@ -0,0 +1,2 @@ +id audio n_frames prompt tgt_text with_speech +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/asr.flac 166960 Based on the attached audio, generate a comprehensive text transcription of the spoken content. he hoped there would be stew for dinner turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick peppered flour fattened sauce True diff --git a/WavLLM/wavllm/test_data/audio/CoT-task-story.wav b/WavLLM/wavllm/test_data/audio/CoT-task-story.wav new file mode 100644 index 0000000000000000000000000000000000000000..a870cc54f635a5340a21c3f64a6f2c005ffd2320 GIT binary patch literal 1566446 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®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�t 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%0AHYQvkF*^ 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⁣P&f(5F&i9T{j-3#9=7EbAevq2c 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%0D<ElEEWW{h4 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®K9P^7LTb8*~lc>jMcRfSzp3~bdD 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°75 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�LY8%`1C@l(h{>67-TxSx7T1v4v^Q%WaI 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 L2qW<SCj$Qu5(_;O literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/CoT-task.wav b/WavLLM/wavllm/test_data/audio/CoT-task.wav new file mode 100644 index 0000000000000000000000000000000000000000..371aa5dbfec72d87db2d0a936dc18026af0fdf5d GIT binary patch literal 351646 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𝔫odVYnOez^?DU$_9=N-GRquTawY$4 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ɋ}uj;*L6?*y8(7q1`pT>##8 z4`=iaXhc4GN=4SF6}gXPF!vjwO*$isbRfpfbX2?-qEfyFGpz&@-h(-H5Xq}YFa}QH zs!tOqFux81Ej)ss?8JQA0L*bI+Hp3Js1e9-?L@RdTU0}f#{grq5Hu?I#rVuTjE?WP z*S*GBJot6y*O6O%8U1zvS8xVbb`sw&;O`gl`oCzmk`&n&`2F`7waK^xWa2%FFn)`F z<=MJ^CGfg1zU>$x|C>&mf!|8O6@Ewmm!#9a#lL=y-Ev71?OTkOXZU*g>pe?ee~Z@m zfN}I4^C%T(S2B)^ke2HKVn$(<TY-5+p@k|UskQ-n7&sSNsXs7+Q5Zjyfci|wF%w^t zfkcfZM&kA1*jIE%8?-|!G{C>BfV)-%MuiT^!xGN85LjReuID4p;}Q03*U<u3aK-0w z?Wd77eFCj;3awGn5|`1-x6x})@C5pRvrIt?6rk@!pc6FSu_UcI9A_AVwl0THs)|hJ zYREdS`s=8SyHQCWM8gw46zRuiTv5p!@&Q5fpv_A9Bm?i5inc9juaZpRPdKknzm9J> z$C6er$@|U5Sv&EmB?-_vWcd33`qX%QVs)fh*T;1>LF=?aesw!!`L@H+3Rm9}XmAtE zx<<fJs^KV)r%P$HMIhQ0i;G|R(kR}cO^R_<*}#l`0!jUWzW9Q(_<-Jf{eQjn98Ztu z=(QJUhc|fr|1*%kp+(ZsXZgQIgbR0xl9Xx&S82d!SkXE#y#*>=lCfR(R~uFQzm_V8 zvnh`})iUUvX#7S5t|$a&=7&}?{W>=d`s;uHQ}M0}4jG4p?<KFIgn_nT@ku&di|N;A z1*4Ti@jj8idL;JOyO+Tyl=Mwm93}rB_p3ij;}b*idHy&`dPR%(DoMT;e%(V$`Xw8! zo`Tj-Mr$OZA4*2^M_l(CjM)G0pG5pL_1E<mVbqrNryXMhr8AtPfImx;pFQ|LALhD@ zzd3&0M+IL=t~7-?3Hbxspc?wA5$*v2`20_JIzPq^@+j_ldl??;*FWVe!YiSz<n!gT z9_FmNM9uUKQrr7xgO^g89O!GSYLs4bgleYdGj-`Lz}V+2>*VojY1}OYf`jkJX>~L9 z@iB4})kEy3N>fJSG@gU|;jvr^&+ui0-Zx6wjXcE}L>8XQ0`k!x;$FfMv*C<#SP4fW z{d?bjViE4uwTX6kA|Cg>C-Sg@2?93VSN*8;hl7}g>`vAr-uZq*lFoJ?4Q>oc?WLL_ zUHAi@g(BexzuT?Y0Zk-~YA3mh<S#c;n-Kqz`^c8iT^&{5DO=TUK>tr*wPW#p2hIj> zQq03tpPSeXjI{^auD@?Tm=K$ZJwS2SVO1~}pH&K6nRdwF-AJ@2=ivS~7(G9lD8l%C zLCz$0`Z|z##0;R79dPG7?puI=6-o96_E?7+38ZonI1IBe`d^_vdXcNBM|5eX20MxF z&153)H=7&?r{r~TdP|iDsyel$5~B21Uc*!C8!~g}Bd2+iVpHDxyyPP4KVlz!f&7Ve z!fZSThXZ>Z;mZWldk(nx89W!ZBBz2Qwy5pp$I=72P`oJrslr(bOpWT4L?jcHz~9JL zA1K-Ccw!<rFdnKb(%sD5IJOe^in&H#XWBBqk%N(IU6MI}K@pYXs5#Tp9I2X|D~wZ2 zY7$Uu7fI4ZnE4{E^EKA^{lQ6is!k?PQ2pp=su#4$6{*KSH5U;dFoHC`O!=N<QGUpk z)k39)yja~L_kpAEK~yWd$W`&TTVP+^R_`klWIa|#4d{8K01i)>512W1fPPF>VrcS` zIvwd>D~MgF0q^mhR;#JQl{sLc(QF3o@uiX@m3*-S`IKG4JY*))TZo%bkZmFcLe06E zd!}um=|Kb{IZKlNq~37vxNvf%`Y&8wYN6hFp3Xv5aTzrc?kb1nIG=~SMuY)x_VGWY zC(;vNdAc+FoN~x8s;zQD!ZuhwPp;+C=)Jx}LT`5m>7laB*Nsl|acYFzMjS3;1W-p9 znnORUtTF(2@k8*sZZgk_H{u}Pi+WZAA;OnTb<|Aq&675Gn|T^5lUPOL&-5hwDR+e@ z-iNS7O{eQ(FaL=cC-s+7eXY2s+Vh%y^cSWT@k23^yNEz4mdnu8)_!G>V<&_uTagvA zgQ<op;9g>xa$guGJJh|5!p)~XtIw66V!X7UJWP&fCb7MV$>1*4gC}mbro48zhGJ#X z2jxwkdXUsG6_CdH%~x4DAZ7@0%2Aadj$oHkNCY7n;Re>}pVdapaqb#9Kv^l4<p(Rt zw8$*u8qxcZt^P>lrF@LPmTY&;3G#z@l#llY`~2w?b}ZM4c}kX2ZY!bU1hq4LlS`p9 zD67vb?N=(Phsm$hzsNY>piUE7N+x-mI1-NHJIG#m&R!S0@ab}*x{r>bKakBZo}MZ% z)R|-t-y^W*a;VQlff_G$k{bBx(XVJcS>&1Wb>ar)N5%WXfWZz0yY&jzVZ*?f>`H8; zYti+HlSqfl0B@?3&!<!YXKxtYgIda@P($SF3I`_IL!u^GlC7Ojwx^=#;q)4x3HPR1 zYIiu#)F%Sz?Tne;Pi$3_q($mXssj_rxT!lN^0P6sS`mH}Y{=LIZV)3X|0s&wi@1xu zSYZiQ3v9Grst(TYH{`3nx71qt59%kWC045QQD<GOjK%tEHTEx)$ztM*QY^1Q?V6Hp zYFVla*H9D3v?H!7@4a5{X?dbA5_iV3OcToDixqeABgB7wAE?$$J8C4jkWWPc*&OGP z$azNhURR4f?rSHE@az|_`{uE)wR_n;^f2|TbV4#n|0vzn&%X9ZlG_L@;izv2+IJvf z!d_{v8macDJJ14g5_^%Y%4hj4_;=w%x)P^qsoiv6I*jP8te0!a-<4a$bl)FD1G*QZ zWnVK(>8@lteEdEs?Z8(GB{%q{V{exxPgFZ&{oe}w%8ukjwXbqP=}YzpC!qzh>c`{B z+TT}JZ4Kwgd|6NKC2!F)ncZX^Vg!;4&&l1?X3A)lX5P}>sRDU{P!-zVjbbbL0J7>& zQYXQcpww$}CApI{MgBl&==Z3%FDB+GO_YPa>#FLTgr{Fm-)=S4SF+N7uGo=E9tK>& zty;knyGce-L+Ba6Ri@w?deFP*0=Riu*d+E6lfVQp`{_$e8>T;#P4%Td0&C#O1@wL9 zJ{3w<qt>D43$a4HhdtJ5tfwF0Oqye#+rf8_@TWRaEqxQfYYRc0`;aoww}L!Rogg|Y z^MyB_o1P6`uh0?s3k!gEv{Apy#mFKefZUZA7UT6}aR0u*pA%LC5n3*F6Rru+M9Cqz z#_i%nu!2oW88uAlfON8I@@U*YcYqI+iBAY&rodD4y!NAEtYxwFfpv_Z-8$ZapfB@q zKfk~ZL4^UHfRKPMsI+u84%6}4-}E7dJ9?*Xl5VGNmo|}YgPAZ7Pv?nv!nP$o<7qfp z=`RVwGQr?Yb$qmq1k3)tExkCnn6d>IWfoPoEh!#lt6&=g=MI0n*0$0<(LT&hI%wM! zq^tjQjB@3<zd}d8&ArcQa`2AH_S3eT_6Ei6ir(3$cn0`xX|oKk{qlmC;42}^L$tv) z0z(6-kdTNY5x<2@3pi>WZknj?ru(UFsUKye%pI*)t-H-5jXjJL4V4WajHgi@l+69j zwJn3K-%NV_Ud>X?FwHGE=u@Psu+nbfmJq;qbf-Dyz&r4OJro*+Yeh>@)7o2bt#C=< z%|d74k-~aKK}C}aEk&gY|IE+Nzn5RVpcqc)wxV6dned>iTiCa-M}aOsDEH5-+gaNS z28%n4SHp%yHHz*Kb1tS?bkoR?&^y5!Lbim?kC+_!AZ&2ZQ?o^<vMJ1GrWQLJnagYS zTTLrX_l-^9LG{pZ#CX`4Yw}rw{LlE;^?zVFZ*Xf4GFRz;=^2=D9U&STAPpDxA<rz< zxdcfbCmk)ExsDT#GWO2JXN$HK`U;!{Jqykjm<yX1UMo0Wa3TLno;j~t4%{xXUuTuh zo)2F&OIG>x)~Q>524sKpoM4`YG>I!J*QVO(il57liP;*Q5IDx~so&AyC&5iZq65>- zfriTrIB_KyDl{j1+1c9W`a$M_)_<(3CEFZhjr4Q)^$pw_csiiEUu|PKt&2&<T0}y{ zC{sBNzs^nKY41GO4aYsWGmdp!a@O<A=Le#yZ-GNdIfq!3R^ZC(fJpbbS^F}}W{%A4 zlDRvxPBxMA6d7vc^4jJu%Pf^vJ;n2*QA)40Y}a>lartE}o3tC%wr-0RHO5w`5;j)T zS~=uNkk2qj^}|em>Kd{`)$#l`?@9M`?;Pne+1UI%JSnbid0(0M($7MU`@J!C)#qzp zX@gCP=GDfA+92|UnC+@#TUFGwsI+Z~v#fAX-GseU1LZ&A23)r`dF}#hS}3iRc8EcI zg0pO4UFdZW{2ZG4U&gAOk9lYEFXT1M>6Ljt)s`$K1t%{}o0rusKgeeGuHd>ym8}ui z=x);?jjVO+SM43O!Mv6(5@dds6oRBH4;2gVJ<)s0waGcvb3%wy`{<aU%&2c=xUz5K zKSax++x)5<Ua%HMW<GOGbw4#%;B+<(-X}i9(eJYdIpaN(<aN|%W+&Z@OjCDYz88A_ za)mixJ0>|7xSY;<_6LPx?%}L8=^ay7{cQfTeCn6<ZdqM(+vl6|N9S$IPt0$d>&}ZR zTp@?Y^luo{adx++ZEv-@RQFlrEUt(BuZ+HFEplw`GQ?#1D_MklWCw33l0SAjwu{HO zLm@}X$5v}vbz#M*xDg>!w9BM^p0eHp(qy`mp{%)~eixfSnUny}kD`AHuG(688R8%9 zdecSY56u&LrSGiJ*V(D~sLju1;&&rexTp7={a}8dtRbnsA6LF#Pwe*derA4d--4aU zIckU$x~Z9m(#>g$Q!7eUN_DG0x#N{~jXSmJSgX;r*jV<Xb7^L?ltI~hTys>xSCw23 zgv+Azf{Q?e^R#QfvdfwnTce`4;=;<;Do%<%V_YFWaPxMn^S)3PJgH?GKiwsxU00;u zb$%`~7yoDP?|H6VqV-%^O}b_~o26FpZgJE{V$N;naZj4}yr-tiY_C!{H|s@8LgLWx zI}&qJ+!;-BcNg9&Dqm<Xe4N`feM(lxytanigp4L_I_~T=tJ9#4fi+eI$m-F&PRT>k ze74o7h?i0J(5tk!eDSsyxmWUaMLpg1HM=7`<?2@4Q`uF0Qu*Sbq0CVJDBLCg6|$&} zniZO6y7j<M`;a@Ff5YFGFS_qal1!ADd&S+;{-^Ch@xlOyU$GaQmT8VGXHVy2M@7ei z;*EK6=|hv&COQ)Dq})zDo;oVSo3SZpaBf8AnjF<TENoycQ^V7(I<)t8IMJqbr5!;_ zm{vvAvkLONxT<*$IgR{batA$27+Bm1E}IjJ|MUK)jSOB|>PuXFWoyl)6=#HPHQk{1 zE0X9I<|$e*9G}yob{Tg^`P0?Ywh@Y}I`(SrGonj<O!d(`*4(9E%K_enNc=0&&&??O zr|7P&v15k)L{Zb+)fvZA2PbbzeDP)3*X`f7CN@g-rG+>z1xHrt*|2h}i*2U$xZR;y zZ7D9+zZ-ea5n~(YncyB-{JnUOx4tsdJ+L4me+pQ7b&L8*5A?4CHiuO&H=<^7jTIHx zQYV85>sfY)ue5SbIwjPR%y6z6;>-1Xb8K_Wv-K=oP~a}^=xQT8^W9<xX_jGay-lqr zCAhX1R>|#vwtATNI{#C_yZpm>YjTEUUQD_9?a{|wZzq1N@Tp0jO}j33YCTKybzQgh znb6~DGkc{&;XO5j_{Hu+yvfTu`nd*6x0TMGY58-r{W3kN+tbSy9g&Z4!~G(ogQ^AB zI#K0ynMTo{!n*nO*AAqslI0Yq(v9BC-X#iouk$bam7?=G^D?JqAIW=Lyu~}hCjz5M zp!8&ny2bOP@b~NynF(-o?~`XQAdA-*=N3-Nua#LfsrKhO??!+0r1_+le%0e2)%?-y zL6=?~7d2a#u&Fd}8A5MHee9J2+}tNIGdK+acaGvea_*%rPC1fZEB}_WnR?Z9JMvkX zf6JQVXU4XR`V!)>o-`zA{$ZXnleBjXTeU~2RZ2f`hC8{iQg&+k><liuPQg@XFCkR^ zE(a?;r6A9sBLD3A>EF{vXH?3rlfSm;z0GN#Sgb7=lvzEc?vJM#LxdmN;Lug^+L{^7 zsg{)+j!EcMCL^e#ZW=WUsfFX@l|E8qLTbkjQm-8G3@Tik(JJ+4dPLTq+(xb+bdc2( zEQiNMpN#7nt%My2TJLvVKa6e3TD2cF7nwB5#LS^vs%N})9QwlBSr5{3(iUYVXLZYY zpTE+kb-hB4Q7zl+!ru8Id290e7xXClRP3-9xMm=2crE`x+0Ko$^a$P??u&jCKdH>k z*z!?x!;<|I4GlD*-0#d&uquwx3VR)X%~9+~`d{BRsi`oFKkmKfnc-b3#;9wE!_*XZ zv!;}G3{V(KW8xMt^XY^19(n<_g&=&%;CbAZY)~Lg6bPZCFb$4G?W9a3h?SRGNEYdm zxJ#TZ&V$k_RvIORgWqsKXbOCPE0UD^@L%{s;VxV}ugGgrwHS>m?rUNd_#Km|Pt+vv zFp%`lZQ_c!_L^Bx^u=pVauvBx>`HblygZw-BiIdWE?b`)!!6>V_2VAFbyx*USYl=} zpRfy>PMw2xsTT3d7vW1#J1O1dS<)%+PPz-v`6~PhIN0;>_W8@x-P7MQ-?Ig-zui6Y zp0Dn6?tAXm9vUt`2EG&2%{Szl>LKjZvnUB3=<T?Unk0>)X|LU@6}2^Vqjjrv3w1%d zL)sYaSxrmL4kYhQWgj!~OgjA)$4+_zy^hYLyI^(Q6?@O)^cU0*8h|5`L^5OoxI?Xd zvN}V(i`vL@DPL@llsJvh2R_`ByfwY$yq)1uyw7{q`!BG!3Vc<*G2flv$G_rB3Fn0i z;yU;Oy^t3wv(>gx&fF$umiV4g_2~fS7SkTBvxjT0Ig8$#uf3t&uAQ#!pbgO8(A3hr z<OXmKtlL7_On6n_WY#fbn08DsJX8;0eU?b|rru-sr6sqZB6=Qsk3*^(YO641F<gk^ zrSou}D%s_?7bqba!6`5JtNbzk4F3T9rVQ{+Y72dZ--R@!Cu^jM@PKM72PkL3`z}(~ z;4J?pdXjqTF!(Gtu?Km<G-q$Haoq3RQ6vOi<8E?ixj(qhoQ8YN?q$2dx3$hMuJ;e- z26F)#yRq=${Y+1z1!@y2a1VcFij4=BG7CKO&CnIi#agYZ{4Yk|Rk5si3TGnn=lMB& z0`K#F_GWrXwBlfXE_j1+*l%<e--`{UN75wOsJu`{mFRZBr2mM0Y#C_u{-8-_8578E zhTg9kw}3mu?ZLS%=9Y1zxmH{PSAh%Sc>Jt1#-+gigR$3*rPzze2@vSf^xsqf&hK~f zNlDENm7uMv0ESb9(pNqzMZgm}L3|{15N_~0!4A{&-*9$kz3041-YjoJek6a79|z^< z19<WelLF*q`A@~H9#Na1ioBTUM2h4QDgpesRg4i_cpF=To5&sD&Tt2TpPuB-;VkE2 zR!ri$;ygRU`!9fd&hEjCsm^}D-iZgVj)w|S3q70<b?pP-7p_4{cL(J*)S2U?@8TM< zQ20~u0PCH=m*qw8Eu7gEIDy}TlT$Uc=LBR5_5wS!lJs1fj<Xx6u<CT^_OAK%5%b7s z==>JaO)#>0u}@hGSB{J38l%k?acjAq+<oo?m%=4+Jg0Dp+!U@7_mrK%mS>+be=t>m z(Zg?(Y6=hH3gj&4U^@HGs0-Ae%3yH2Bx$Ks3ryQC@T2%sXd;vnT>M3_KwHDY=b`tR z_muad*W>NY*A+s=&!Rt4u!qW_%0?&zTL87Jj~a6Zp^{Ii8}tTdBU^{Nh4W~kv1le@ zKK$TV%>nL!HeK^v<F6^N>8P=B-#8ujhV28z=LKdh*hd3t75>jr)OvChxdc_vM0K?) zDuwdzO1QjO{HeTD%OdM%m}@%U1{}Z_-fNzU-tlO|t;hts^2=j>u-E1t!(ZT!%GGgJ zs*)kSminRUd{o)&J4Rf=o$n}9ncasB(ROTe+|N#PmEfkH!ue|kXwKt2XKOg^IPD~` z&N^x0G;1}3HT5-XIXiQO@nffBHovB4(ITCIdS5?+_GKx5DDm=bv9Y)m<Lp1MY7^k6 z)z)>&ImNloImo%%aooPp-p;<!R?FroHWmv-V{CKW_2kXO2e1OyXkO`!#=rF=bTf3{ zwTHBy^>0mI&9}`%&Hb%6{hnLW4EwYs_a7ZVmf*e=^jIWWi<!$k<u;<e-j&m87O;bG zPf2D@alzWXx-t4&T7PZ~(}!L~o>OKDd%YTP#SeSEo`2lsTrC_)w)w>)3Mc1X%pr4K zxgYZe<o}&N5-DTd3TEZ$a@uEi$tqXm6o+xQO(wq`A;(I8irp6F4C@oTC7`rlnjasu zJ+x|wCTKcb@1OZS(q2{v@hhFTY%hzli@lCDp3lMobt`>{xkvp@tfl(05n8>@Zg5(* z1eOnN8a^O=eDEFX5ZxAbEA?1)3RVy2830GDRj#G>&V~JR*JLK7ZTT6Vob+Q)QrXm} z=^L}wXZ6aioc%JVbatbx@tKd(3UgvzsTw7uu=Ir3M-}p_rc~Qh;auq#;o9I&fq|i8 zqgF?4h-el3UqA=HkJ_#B=HmUi$yrg^Lvvpi=pE18!v%{PN;f4<YP@VG4(rC7ANZdR z9us*7@5aT%miiVn*O<oEqDXS7k|1>Rj7Nr7BhOg--26{j(^6X`pZ!7o2>x+0@oN&1 zz7QFTe`ot=P0n7Lm7jGg<3r})w7`thh5st=!n?$@D_5`ln#$8_j<5PWc3XrabbP?< zh>EehDhw&RGrW0FkzbC!n)0IXZTiQwQyEKh%h^u58o()kruP$6xTif%=NWGp`_qyc zk`b8_Q!)O}*neUUL|TG#^y?Tib3kL#?PtCrX|bR1yL(BoF=td-VDj=L_s{AXwK6Yc z3{9Jtem0|GhBnQX5|(-)t2o=9|E{1x!G_#(*%4X)<;OGo{C7p?m0B9zvhuuYLo1k~ zI)*2Q+zQ(m(YnISDwkq^gsz1~;;c5Gzf>?i?{I$U;v=q~NQSH9o@RS#f8pNlnqr^l zXr}m?x`$i}e-)Wn>RI^Wun{5Uf+PLg8IyIa<#50UE2)iAx_K`-dla|Hdz*ba%bQh{ z`**>J!b!Q}&ka8s{}`8aF6l*b!p}EZtqLv_Zz@bKD4+d0?aI$7KNHgbwdsNeMjfaS z9ACc-QFBYh_);f=`$w(}`KR=U@=Iz}uQ{yLXn&j4p}oOxE~u0<tEjT0(0N|!B5Pe; z^XuiF&R=M2T{O1XUx_f1VY4E)M!pH%9_;YD<(C_j8@M>IUVwkdsxV*haea_l-Sge{ zZ&5_y)Iw*`-l951Rf~HS=4Af&W5$<FU#9$+p4>34a@N$mj|Fv$o%#E7;xl|{<x<+D z_s^V`Wh7>WL|52d_G<K&sQMMZ#(oHD5pE3+j2;nZtJ1U1xN7ks3yfR!O^A5!wxVL& zM)zKCOa8d>ou5-MGV@CM0PLd&+4SxzwAE5QWK`HCIP5<&JI(+2-3r?p{wTa*#M6kE z5hDZt&{kI-dFng+xazxEkKOf~y>!v?{D;|{e)j#A^r`E&w4}=EJ2DPsFVE?i`zVLa zxs&lK-JRAlqidEXXJ7u<q5{j*sId6rsMVq8<Mza7MJ9w?i1v#a6E~;A<XTm0{8eg% zd5!J`w@2>aF66r_Y0@Bml(<MR7j8%`my(dVx8Q)Stw$mb>e`z-SRY&O8ztRV-A!w~ z$cr&?G4G-bQ8D3VgQATU=|Rd3p_#l3h}B~0qw9E4ac*SR)YK74Jra-oaHMdV*D_~i z*nh74nUvy4Z=O+{xjTDIt}drc{`y=h{h}>b+#KFKCMzsG^khVnxb3Av!-??rF_&U0 zR(MtOU9I&ow6!0cLNd7pN(<i!dNM)E$K*}I&Vo%T`lNrd(u*qEcvqGjOdVq)G>bI9 zGcSCz=nK|ABbr8gO3y2OD^efYF0h>6DZ?hZ78S2aGBnrKBW`)?+Pf7r%)OAgKXq#I zFu=k)vo~c{OVuR>C$&p@{&RWyxU6-#H}h{4#n?h^t@AeI{*xog!z@)x4GHfZxF>8y zSnsI*L0v-{g*}KYjBQ)FSCyh@!GDJ#!93h>QZp0v@nIZ6@1VvKBly4qDXU*$ZTBsA zS@#!j6M2?TAi~H6z7gVb{*mvC{+8vCg*81f3^GnPMCcc5X4A5-1<h)A=uWUZ)Lrll zx$hq1r0u)GH9cMY%=y$k+cn4j#`dox%T?f>?jbz8JTrKNW+Mf8gwPs3Ios6gK)?2= zC!lQo3f%4n6w1}0S=>mK$6BT%^MDbU<7@!3sFrJT;pUN}S)tvhov*ph6>^ct7HI@M zMtx0V%^Z9^<@|u_A(My==kBpn*xu}2ral}PZqQ5VZ>YNWq}oth$OXi5-#4hvYpd6l z?#dmRlqXC7iRti36tKFk;(g+=cm}z5xMb%hX9C#JD;;m~RNQ7iXTOEqm0J$p+1{P( z-r`vW?a5Uk0<6w&$`aotq6u||R++loa7|NfRh?CzqJL*tYpiOzWU6hRW}aydGygC> zHElGFGbNa6nVOm6OskC-46pTxI<K~>c9o_W9**_crp#jcITB^-l0Bfn?Fy#{e`TS3 zSh^>UfV0DB;U3=^c{FbC??|_<>wW5J<S}|;Jd|e>97IxGpIz@<$6fQ_BvR-MaUFCG za3{Klc<y={W52MJUoWf?*GlJrX>awhaDkQRd}cq}mFtY%i@)x>?zFyzVTa+JK{D73 z!=UZjt^W&OQ}zAy-SwgRle%!-F>Mv?J<Wd2X3Zd+?^MpnZDo@fKc+8zkWzpd7K1I5 z3~pV7+6PJL{&E*-xtJqt7e)zX!5JKaG?^ftgWB?rceZzkcLo^v1HjaLh7^)~kH5FN zx0<&+oI$HXwa^_Y&!>duVzM|~5~PdrG^L~35-MyKD`*#R*B;2%>BHEV4e0BGTy@P{ z%|J~8&g!AYq4}oytf{H}OM6HA1WvUxusX`rn6$OD3=qY6nx>jWt_^pd<xuzEK{uy4 zdIU6G(}*PBFyBS>7Pyq7WixgRy`|UUP%#iG*N>o5m<xBzVc5m26{ZQDg&z2GwQyRv zBRmzZ2uJW6?}aDAKSGhv6bV>Y!~(G{QaEm5rM?)<%n{%X9#Lxmv#tgPR%`MynE-rr z3mwngMiSOp*2y;Hc5yk-b_!fA%?8bPjaF;MIiJ+b(DcK&cHyTpxY^uD&dkkczaj_r zGInJd@aMQg)+aN-Wm14MjZ|~s`#D!>h+Lh8&=`~hQbo%<r9Rj(?3XS`D}fn?Ky@I9 zB0NF%ii4pM=>=yvKk=!s0@rs+NQVo`cOgfpD6SMgh(XeHDO*}9_fTTMm8=MU%06Ts zOXMF^0R1;zi}}j@&VFT8HkKQLeb8APx454irwP>rYx1zNFUQ&O^NZ|6wlb?_?aX~< zDx+feYopFlo2jW-H=hBwfg{ht-QhU6u5Z=5@Jd(;9m+T5n6gkAf!WytO0mjHYp8bX zqhB6@iTY8#3pVOfXh~vaBj)aR_?nbMC844ejD5;JC~3xtQ^l)bqM9TJ_M4NXEU7x$ z!zb@RUe#xHExbuqfaf-yY)1X0x<gUi9{XJv6U~leH?eEkGc3jR!xhzq$}1kbxTi=t zyU5OD<5(4*LhqT049PqLUe=e^(Acw58_33Bn?A-h?8eT05w7FBQe8<^mZ*c&VQ`@d zQ?leBrJYg%d#ROBNIy{?K<%&}C}cnE@SXBD^(r~c=M*P;e|Vb<JH@e3B%kmu^^E4L zic<v%bNM)Lk*|s;Ar<)#UN#5CJxWJtq7#S<R2Q}byT1g#(}wHM>pJPL7)3)J?Fz1r z?i=pT)wC^iPxSM3TaZ|@kekDlqkFK`wHcg|UICOhlKKiJ+&8%Kyi_X^Hu4!UOg$_g zl2?G8`bOESyu|KrEm*$+atE=4FkD=SpDdARU~!Gb<Dypbmk6nnSS*!OYbqziIp6`8 z<~>O6{oT#GS2|1CqKYRMcXloj?Wh=Z@!WU750^X+-cc9sjDgb+(9iMv7<k_JJJ;Wm z7`{HdZ_w@Fv7z^o4Pvom`L{O?W$WqgS;CAj$nx@QDML8V|0PSl-qL;->CP0&NTs|Z z-81>C(j=u4*^+5Z1!Bx3QQNqcY%(*S%YYZ|X{J7X!Z!+j$I;*xeUhf~2l)|vJI_>i zNB1Px8s{_DBwplycc(bI!bPfs=aQ?u>#!@=;dMNBG`G16_vH7^=F$_hCMmg=4u)a& z5d|}RUAZCTSfbccD!fxbw*Q*=_GRKsKI(Qzl}e4vriKkJ#m4IWk8_vI5kV6*52e4@ z6V_<mXwLy#cUOY_t<5Ib)jr;LMS@)~ZWd$R>pWhCqqeYf^bhn|%p9MC@)*}5mFo}F zPqV=|PixWyG824<rBiBC`m3)OAK?0Ke^Fesc(J{XGs8a2cGU5=v(Wao@L2I*j#SqO zkH_1MFXOJ{s0FvsAX^-K&-`uw7S_stk;*4F%~`B}7dD^RoBgoZsDGz#O3dL7N9~VV zYz+(_Rk>+Q8@7r5Sh>A5LZbVIev0iLS&bXc_6^=0IKy{J9EfPe`Ld;GpUr1qQN%k} zkdFwH)13dp(MqZ!-WQsvJ*hHuil&<BjlMMy=xEIb>lOb*tHEkBdf5!h4Nd+a^_Vo> zH-Y>tk8)?0c%~H{veWz<f$&syHglR>OC782>s%Z(SiL2e_^-RCy+={C;@XZU_5ynz zG!I>}3R1TwZu&CqLu}RoU3S<iVoVy4HJQ?Pq%Rms#my^sA#_eDW95(WdmzaQt=P5k z=Y(%D_u`^URnilz>enuGs=kieow;mirHHx3neMz##h2XC80EJeo3aXWG;r%}C|4(k zv*8*K*AmZ-h4ca9xHdD;FI)<);OD1rLSG~nGZS?8IN;6j9hoJ*bAB#9Tm0FU<LoTx zrRJX1NUc9%Z{zg2UV4v;horYsOVRB4+kU!ezpb%zwJXRuz;-k5VHOl5$;-cg|J?O` z*w3#_df-PUIelG9Q*pcgF1y3HFkUUcHGF08nzC_~zlAg~JuJJtiCAYsnH$lUN}V;I zrtTW6M{EkHLA?X_Wx9Mj-<8%nH^aWjU7}y>>Rg_4BQv6KC*Of=!>Xu_mcb6!t;qsD zyw$Ke;9ThW-~_)yy@BaVL@^)q)AeiN<C-Kb;k!8p*~d6Xy7iuE{5E*7_jA4~{$XF^ zJp$H7V<J`^Ez<l8FXZ)nBfhp*^*CKuY_;;!vXe7Lq`pq3lFUi{znI^0pYQYiO@8Fp zoSGRK(g3YOchR?vXDjxMd=l2N!t<*CMiK#4%U5V(sC_El8#^R+Y`|f*J2If_26d;8 zDAj0E8BoBcZ_EjHFfOe#$lci0I{)v?u>AI(u4)tV6@4F>Y7U0rCPD?U#V{q{QOK0w zbiX^M&DtmQTKYOX1)4A|$u7iMInFZx{?C`4f-BftRU9e4^L%mMbglI66`#me;d|1S z-0HiI3a~706rE6?{v#Z77Zy#-@0)u*CnCFZMz!R;@9)1X`$)e#{IN}b4!u`5tw_$; zTQrbttDmbq6*{6^yZ8lRYhn;`8b3MoZgf<wZjHBAX%oLLer5PU(>3Fg&=H}#j0?!m z^dWMqqh02~oc^}A&Q&g}>yaZo?|s_htSGzF+Xrbw=c#|Fj^v-jcQO=}_m-AH!Bj|n z|CXl4dQx+T-KJTgAEBSBInDe<L`&7&9h_aDb15e(&<{`aQmz#HOXm&mN~x5OBgc@N zeeIMc(k}6!l%k9R%ejgY$Dee}E9zD-ykJ#9%Y0|HIsJLcl*GYbKY#A=wME)dZzbJc zvVLK6V0SIGhs-_AJ%jI;epu>G*z!`t;;NQ@7+N~+K`nP}w!*=f*`=f47kt?Nw}^FN z!;Dkd*4kip0Kc^8QSl_tZdC6l^9EP<+|KEBa~|0?xEp#t@LQq&@95s+t)Yxm4=H`9 z%ZBEDO-*LadS(ROf{E1*HxIEa(QCOhRJYvf3JFhlUrk~OIP?2uo9C0`y6c887%tyS zQN=wkJr-sm+oVwZAdOHAzBn~maJYKdmEzVY+FS-#U~KV*yvJG3Gk0cA&bpSN%YI?& zp)R8CieHOf<URHDChBS{7?+ycT9#PC{MrVr3;1EV<bOD#Tilx10a4GxJ_ft}3$1Gd zcZVGgP4RDOX$ckMQ0^}J<p}kI8PD064(c?I*WvGpl=9`3A~FKKo4n1vf!<utAy1@t znXp7@>FcR<67G9v2sP!iY7v}eO8cHGCzKv=Y%5l_K~MSxtK&d$Jxf^RH2DB5zcI`M zs9x;wgzHQnqn`ms=}e!1&suG0%FnA~)GuIDMad~}RGsAA?^)+r@5yxEab-9cJNr9T z#~Mc*Qsx>uoz7-1Kjahq?W*R^bXWHh!c>uwI!aZ*z){ua#Az~$-pM%GftqDnlkTd{ zt)FgOWU6YWEKbV+YjbOT>o#kF^}MyCwW)QyRcEbg8E1ZAYHC_*Tx%Gn*Xz<X^)$P= z)j;e|Qk%$y;EZ-umn#S5gU~j&MNR!XFL_6J!@bF#E1vD1#h%|ir#-T#sduB7;IH!| zgaTCl+e>Eo67XRyG)bv&P1_3gZV*_yGFZOrp#L}p*S@bxl+slG1Df^-@j8@7HH6iC znl}Ni|5i^q&nr)JZ$0eK_Ij)HYk)HB6i$i{B&R%BJq|8bU9c4^()F0%z&){Po@zVm zGNDRs2+gw2_`>*?$!o&m*{nCG!>4qo>2K3Qlg6~dD8rGpw!WEet@e$k5Y^opY#f7C z9qC831xL4mGE06h(Gm;4gJ*nw{(^Ux*XQlXH|1;dgOHhcif@h`icuOby^$869<~VU zzU@$MzxOqQOBjdU(7#a7h@ey_K}WL?O6~T(18TmKplp+y${t`6TJZ@y0%DLz=;!(A z-s`rw2fJP%FS)jJrn8Dmi&q%W9nS^t5nOGuI9-;MrM`0HXR0!)!Y#OsP^(AkI~n>z zhy1(gr)j+T1u8RTEORaYSWa1fv)Iim&Ae%%i7{O;)-cXB+|;{tq%KW^RXSIZZNv<~ zu75Y#o}hez;Fj*eN~?^tK}>~O{RZC)_{eu)O#P9Bd5HhSR}mHonP6shmLzGB?3QOJ z=}H^*CaUOXz`?E!ZNL;Lb*h7nZiFx0O!VkZH2~<#7hLHnDM(t1eN?nihi~g$35S9| z+-2NZuKljoE(d1sI_Fa78|QdeEw>S#jD_B}{1Ir=HS%GlsV|LKO$9JRkR<wD6Rc~k zpJq5|ykweY)>>9uiY)Qg&elJzcdbvY8?4pg*&v!bn9pHnz0&v{nGS2QD&DVMrdi4D zV6QMAXp)Yhtnl)BrzXM$$RDY*@5Dah3!y%)w;uc<|9~bu)mskNe27nnGQXSfTv#I3 zklsr(<UnP!@)^F6<JHITahnCsz6ku_U`e$Cimz2r+cC&p&?2qpwxo)!#5=-R!6^K} zzr{VGJGfv?-63wX+vjq-RF@U~9OQ24KI8rkJM*dhEg@07C!Lb-!xf_w@eVGuvFs}D zohDq@Mql3$ZuB=<%!2u`Wrh|0D1NF{vAV3!;HFdF`qI+gvI)KnpN$SfjA6X~md>fw zYK<BT=g&qn33NyJ;;n_po1jLkwUo~C4oN5d1*GXC_IqZe`%VFR*aAm?emnma8on+_ zeN7YUi#tRDxX)e5A`ir#;I-_MW0Zc%a`<^1P<APQf}h=52~fVv`{f~WDftt8Hlv_R zY%9JM#tR|BLw+c)0wEd$NAa7U*`C3;BV6+Eo>tzSUb}Y)oQS3gmBeUijQmvz^TmKU zUY_bhA7`St^O_pEb^7-Pukp2Mi1~xLuO;0w$!bGp*%ZGzelM)8t;a21Jf~imx|psT zB}1g4l->_HVS$>4-0$o?Br%Vq|DsNjSBbYkQ9G)Sp}qSLyZIi{NwJLhP*{#W^%vg5 z5n&SQDE0a3d^>&x|ADU{Ove8AC3N@QfK8W^)=LUJ2$ssb<umdvxx{gDtg=)28_7t6 zm1^i^C%hxR$p6S2<!15=+-VbmkaZVph_Rv;ZM#WmDP-|$vEP^jMZc5pES$jH@dHkE zSPYb|!MnAaQeW){r-J+BacUa<8>#?9xZ@hFuAROc(o+=UI@5PklzF20s@Y?%YZ+<j zVEJyYXI^P~Yb<BnjjP^)nOsZPL)%r;o*T;UXC!(YDqL-;<D?yGjIO?g@P%s$2J3t| zM!qRkm)43!!XLonD*+?(6BPa@Tp=z4D|^hlaS!`T$QF<gCteioVm%3C1bWB!a<noL zC~bz~2Oa4W%=8SnGA85u7I5HNsb=iB4x=^9%D?hB__aO&o^OyI!D(O=Fzc$KS+v2| z;SuU1iO_|%#f~RKY%U#@tn%+@xem$?WiDL7BB0~dQE#Yq^mt|jJDi)KnWvqr>#r|u z_+%IWf0i6$n5ngCv}vhnHU89@mKzHUT@07?k@}Uo3~f#A9L*Ij12|WAW*z;CilJ8H z`rE^`?=e&b{gj7tH@R3^C&dE$?FNMU6h=MLB7sx)5~d4VfS7+muM8D$BeNX-QBp@Z z&i<4Wl+{WKoF|s6_o3!9z%4Nz)s<N2GlC&E`2jbx^=dD8k$%8T7^=i6d3dfZkeka| z%!3n1H<|$cdK)PLxOfHRh>nn!Nr$96Ql1nhca)c-f)T0AQr;?M)%ox}s{tQ6E9y7p zz_DFJl?8%3nW?}QvRAlSno8Qo+IG5sbiw-m`t|y2*tLDqKhYo6kI@_TyL7R-GunFE z$C?hB`%uCzWq&Y@n4@$Ey@8^rspJo|!aq;~?^6BM9ZE&zB{<?C@FMArK6)o!7LVdM zA|4Y@i8sVgA}KYKR!Lv5URVWB)p+##1;wp2Q#ashqoCiL3GL<<_|EMFKXwcJ`=&zY zTHeP)_qjzK2KO2T{vjJM(@e@c+%0Cvt#D6}rDP;K9Y(t@mgY%Ipj*C%1RzB!B{!0X z$?N3*WC4oWCGepQQAevcR1+}6hv4)6MFhYrwK{d3s!QLa`=K(kl8pp{T~)JF!)v-} zH)^kHUuZvT--8>r8`x)@_7PA|FSi-hnyYLJ_7T&Zxedj{1FAccdnb?*l+87WPrhkB zJ=8EAfw^B*7U1q>R6fFyWR~0;GdKZ0#Bp*NxduFk2V?B-lpn)+xRNqV*{(cMJg9$l zL2sRc(wkQU!G5R*&1Y*o%iG}37QTk?n2dlEP@eh%%HO5xP&^AlRU7t}XEBmSDXqYX z(<lY<C;2w+Ci~=F$P_v(pO&x459CCAPOwr}83I)Lj^a?tsYBqOl#Es%2DOXb*BoQx zC-gMifbb87zjF}%J6t|$Fq`0))E*k?pKJv1{5jkXw9s|n{rgdOo65E4Lb)I8Hnt7R zGbfnd48@#*8?*?HMHlei50Wk6QndkfnLOwzyZBU8_ok>d;jQ~v*`f?W^-8DY%b(?E zINuw%$K91*0nvBLdL<t0@<HgcBg#D`8A_P|xRNx3<KYBU)7Pnc&_dUsX?lcqc!#n5 zR(+$shW_U+bSKwP**gZk`CoWa&d2>@lsZuDrnbY%xFuSvo>~h>J+;2tNNtYSx~cu~ z8&mPF>+!B<F%Q3?<wKxR8jTV764-Jh=%{WJB-sHilZI;QQrttL=<)P5+DA7)M)h83 zVsgOEk76sqi#e9HfCZGnJZ26tzcVcuBltjjp>l|))2ZFmZ<LXGK+Yqp!xwia^o>U1 zsc#wF4tb2qxoT6@png}*D=W~GZI!A@DU2LKfuW3ypbRA#^S`Fj9{o2PJ$PKX3l!gj zRYDDT+KyLOsE6<#AJr^X2J1csYUh@iO@rX-I1wt@*-*dE#`j6SanLpO$4}bh3aj}_ zLqo3jDbNvTswwdNeFbIpd$j0F{9lrq4+cMn_i6|g?QAHPUSk~{2kqt`#0_Y8%fVT4 zC;5hCsru9;Y7g}ozS4el4Z0gWhMq$&qgUc<2|XK6i@tOdI+|9f@6-*b?<XOlHIynO z@8e%jBAdZgyNGxRo!er(b1d|9@1PjlRN~o+^9w=C{KP8gJiK{kp~~4!t*geug)>2| z3N3xMQmCXsLvx-mK*QFETuAPQ8+WmKTOJ~`kk&&JzfI{tyr91OTFA@bR&-cABx;mX z>P9#ke^U3zo21#&H+h#D#YAe~aQm62<Z}77XNxn-<@OGfhEs*w7rHK*ZcH~~tJuf; zh8IPLQiJ+U(^2<Yo1uwj8pF+Dyv!&Kd{EeM<-x?t(A;1jQBUA#{LD9scueNeI_^8W zmFY)~S1(In1W9-!4wPT}GRPNn68oI{!Y-t55*c!g(2$Q7$E&xfAM8Z!I_-Y8KiORo z_zB*dz^#@lEyx6>5&al$Z#%FCD37(d10MS{8AEmei)%Z4tMiG^RA;&?`zN!UEaPh{ zHxL_1f5@$U6~OCoQa_2UzCYxeVn4o>H_>~B_ld_8KPVkH!u25>UQXxbhIkf*sI7g6 zh^=rtzD<54lGSmj@BgOsRW(FIvKhwkQM!<dr9MKNHxruf3Dh#ANKa#HvTwnQqOc~o zQsOjDPlubr4BQVkBGr66xMqi;|L8~^!JXs?y_s1{FUOvz7u=c}U{<A*_o!1;Ff*5( z&-A8uQys`S-xZvR72`R|_b>U3o<OZ2yO6cj0HKp-81m~cJ8kY=q72U_f7MUg#e4Z5 z-gTbko|WGB9)j0kMc4$4ldHmI<iHEwQdnnI#|pW;m?;dzv-z6vw{Q~JRD`4`nRI2% z4E74E)ppiC08c4K|Jm?NKi@RfFE(&g;OBref4eoqGRf>Vwlx{ekBkBktDT0Qx?pZH z1+Q47AtsB1r8BroMPgOvkPV7KN*3b5#GWIr6%!POxIx|_Ka*vc*Nl^TPM)Qj(3eRM z@qzlnq%l@{EL^j@5^gz3<WX(dEX?6o2{XlUQUE;jUkO{mFXFvlc$Z+s^Yb3C5tBSf znk#k_(!JX}Gu^+tuDX6WFFKO!YwQ(miG>{sYUS6<8=G4pH#28ec2v&N><QV=^UdzH zRClhcwuxbe^-!=7FePwpNZGKcu-#!JW1g1pS)p&aPGvb{c!WfK3ab?Ko29J&I(q^r z-6(E7?NQ4s>m)+p+`Ak`r_FxPR^QRhQ%@QKP1ze?ReCnNg^6LNGqZ5lJ5T?|7HALZ z3w7;u^$fiY3$+88p;RxjsZw5`_*TLip*t8!Gx?js27ZAj%9{elSr<66sUoS!N`&tV z5l(-nqDd>!*Vjz#EJX+{`G)Yp8Rpn(53zqO8eb5Xw>zgz_KS@8w1%k*ep*rzlNKj$ zObSmKkvu5rSnBEQo<g|hi+Q;Ju+Vp9{;bfpQswftGW*J#Vk^W}s<5f@uqu4{TIH`- zm{k5*?5$AMT1mT0oy+%hyt1t=jxP965LvvzxyT(3*EZ2pSy+z!Nw92CpOdSYJ=z>g zMqulZW+Bf)DujIwA>k^cHO$f0VQ#`@{fe(p5s`gZfHCOjyj(;>`7*U2q>wHSaE5wb z^WBt+)F<{G*9gqBRqz%$&ARE<bOw2jXyU7_&XR5XYS(|rB0rJWFzZ}eVanghZ<9tQ zZ2{K4Bq`;`^rQ+&N}@jT-uD6Dy@{0*$7RkVb{h{_w+Hu#UDLp?d0_4SHKbb2YdkGm zI%Z>8vRtFm-jF4wW|iF<;}?=>xvST+GX%0YHa{?{($AeKLo&h(COcNSv2UU$nf(14 z`f=7O)-nDGe)BC0t$qAY2AuN`46uY`g*^>QHfCy)*tX<7J`FPJe{+)3Bhvk|9_Oyl z8=W_(7~W9GqZ%zWQDvy_!kDRCDV;^X%&^GZ)z9jmYdK~5W|*$)$sY0L37Jkyu`z#Y z_JxdFsjX9nB^M<(N(o3wOBwKU;LjeZ4bw8yiqblyO-pN+{xU5o!=Ab-^`h+$ZnwYJ z_`&~T+0u=tHt$;Hd6oWkepU;J-w=@=eKjJ$uu^ltZ))Tdzf5{Jr#F@|boHHZhq>kz ze#*+qx|Tn)$gki~Q6g{Bwh!nVbUmn5XrEF<Y{%%9p=nm9Nj09;higS{Cp(h5=4(Tx zv+v0e;hdwVqowm&p((puM)S;i*==$)#kJf+pc{*zuNa2-{SQfJ0p7&cb>Ym!y-C`n z?p~-ti@UbK#ob*m&P9sD#ksh<ySux)LrW!T+<lUa{hRN9<|&1irjwa7=gjQA)_Tij zb;7D7oUn|rnc`dgO6XXOU^ReF^a_Ne9^rk1$ylCeneC@xXl;A-v+B{6ohp(lWR;uL zmuqj-?$Hf0D$Ka4zu}Hyfv!Z`w07i=kp6e*0MeS1%<LK0yWxw*%j$K>RX6+9xPR7z z)T{B|V)u)BA-Baxq$=(gdNMjsS|KqrDY#=AOSE)1u%|jkS;I{tV;2{nZp69D+b#a7 zI*@cRy>Hsygq5+2qH|Q$(n9W61ae{UoWT9Sx!^|sb#F_*KR6?(bE_P`?CH)_yVLy1 zGSOb+*7@%dlUQ8-R8jA+vWRDqS<1t*SZS7IyKoOXmQhXAggyjHeOKMHomXrNEIUlU z43Bh1&E=W}HODn0)x|XnG^X0#29v(Me!20rp|g>xlW0cOw9q!df1(*^5znWrY%sOi zkNg{X|1~zZnNYYoX;H$A=<U+KkYP-W--xEY2Z93r3DIimkbgYU0WBtCTyGtyE8E`F zW^$h)h9GCrFZ>&-$th3L+N9(ppG>Jq=@Z{H{1<N%vWR*YYUq1s|8DJI2UD4QvUh?v z)sx|Q<ZlXGmp#tsj&kp*zz@)5UMD}W`UoyaDrKVZx8W-lQx&<22GUY)0pk*B!Tb3W z?BS*z#t7pk-7n1rwLtSmO{z_`rCPpbp=N=uTF2IL^|xvbwGqa2ZH0Q4sR@?EN{71i z3dQ3*w2`FnM)sQeVXfCU7?Hj|VNPOM)GzKu<{0h*^qU`Zb|WWnjG<;u%G(Q)QjU2W zx|CS&&}V-u?@zo3GoRU=bz1aJwJX*VeLjYtSdpBX*d<D-_$<!l|6=td$3lYHBD>7i z->R^Fu->&^u|>Gz{Ex9AzG40@crL8OIdlo~if!W^;13pT7S)L70eg9*XrIu<IfW!s z2K*aV==y1CYAP|j&^FVIs5w#ns;0AgXHA^ugyw~&h4zbPNbNR#58W1hcGXzZBD4=M zwqB#nReu%P^X_MIvj1+<w$11|$J4K5YEnC?Zm@>|jb$>PW?$kCAY*B;l$u@#B&ag5 z-oDxYiOdQ0^iBuA&3Yt_SchB;8?5Rgn-caW>S2m0c~x{jRfov>s-M!6+;panVEG%m zY8@XOv6lDxFw+?a>Hf=k)-l`1C0YO_Et@V!=dr3;Qtk{smp_z?b4LpX39>oSXkT!J z)+bM4>pdHsGW$%+H-lLBzSf}Ws8MR#Xx^)zsHbUOY8q=M*J`z;>Z|I9MoZ9v48jAf zf0T9Wj3}_C{;VTz!ff%r-r9^~*{SKBBNs|;h#Z0d{?Ree_Y3@Ck(LB=e!xsU_aTmd zeLQkxXs&N<a0#Rg<PqDEpr{EX7dMnFh`gUj#g#@rjXW3AKH4hpEt<%y!+b^v0}=kd z?zPq|v&H(uX>q)@)^Q~Ip9jr>hQT+47VZr1AZ1K0`#OsUnxhV!tE{020x9cP=pww_ zALCPdl3YD)jm`B<X@+9m5N%_~g0t7ms6Jd1Qg^TEUDK=bxxtDNkQp$CF*ST*cAcya z8OO60Hrm_LkWXeYaz<v=iN7R0B>5utGp<7w&_lis)w8fnwca><w`Y-A=j@6<3{<#o zdDfD4dQNC0`H*{4GE7u0Xb|x|{zF_3)f`p*_(gFA5x>OM!b(9c^8mgai1%fl;r7<H zeNK~enr*hNjk_*(+<(p+1mgEm`YTlGe30?l8kHe6pmgpG4saQLhYI01cG?%`bGkp+ zvn*@PsJYY-t1YXoSNo}EUbR7OsQFfvSBV-^La(qzfoQZ^`92#-xt1u*z0&l0)A~6H z*@FwDImct&vYp{9SvhUNxKumzu)ndXzOyOuB(UEy+VsQMCA7`i(?Ym&aS~&CAK)E; zt5waqAy}n)ACs-*L|l$dOj1Xmk`I?r@;nK`mNClc2}HT?i(BgL;aTr!VH@k@c(1xk zofq7l;XY+C#tKy7Lm^pl1+j@rhV^<E=qQx*Nuoa79~=*)``@^FIgdLc>@G{Z@t~ou zv5xkMhM_6eY||X69BwY~pTIK7Fvi@7PZ=kYbCSces~Qbx>c}QCmezffQ=BkOc1u1w zERV^-ONd-#M_`TRva<w~`4jEKO&fhz@duukR;^<*RMCEWreoLWFU(0OkMk~UX~adj zL_R!fal*>zQiWG;i0Gqm@=;Lfd_$6mzW!2QJj@rz?B5+qx5#zY{>r)3HynEgROx>M zZHV7E8LSPBC1a^4P&?iRIkszqg;;%mGhei)(D~Co)*fxMnYS2nbl-Fjbc1RySDmjC z+s=AZy!Eg>bSve)#8EN%iQJrz4Q3XxvIp0#pSLsXc!E80N|aOj7ic4@z_&feH^@0Y zm`i^5^|m&4jtRc=`Roo`ktf2x(e>HgJh&5*&xF(!ZWqZg@eXl6g(Z4*^wWqr5d&2{ zlwH9gHB)edQ-Va23vjq=^!@<)R+Q%xj5ohs14-s3?j7!vzJ1_Jd4=@~YC(n51vt!O z2m}ugLdQ6`3VZME>rQZ2xZc~xT5~KbO@oZR^mp~uwasgajZSAWIBl8*4hv7m+=;ys zJtA>;p{hYrPScFaoHMyCQa`F%M}AWVMN!Nwa276LlzAzigPKgQc3-wC{5SAIZ#}cz zHrU_AR~P8H(ZLa93O<;kxf*dlQCrdR@YontWIx4$a8u+m<vxjBFhMwizZIp3(S!(h z`%bx@xs2{yXQpkpy@~s|d$@C_v(`HglR;AcGwf|BJM=rC4X(mvaIIBhL_m!__I7aB z@w{;Fa9pyMT6S8VnG*Hi^`!Q&?u7NdOBw>>IHe719{nu-XH3h)riGq@$(i?4vNLYf zd6BRtJR)LUcpJ$Rv@J80_lYqla1DC^PriFR$<B6ID#7(_FxT22`E5QNX5b}388wU; zNkxOk{k!O_Xs}{#<Y3hhdA?$-s(tua@icxT$oY&!Z-dV39DWIF?Y`@p>iOWBYVTve z=34FU=KKY@lk<Ehy!k+m4-Xs;<N)6wKiD$Z3`_L4#Msz14;x(8N;lhi-8$4_GxN-T z<0tKQT^~nZUvY3rumjyxF(OtGV~vVV-c`^ycWFv$>b}gCnYUt^hTn^1D04(Ptm(Y@ zVhQth@NaS@dk|XWedv<luZdFkNK<<U6I<=}TWoeoFn}upi*PMFPjrD_%CD6*jBFP% zC`>MoQFROdPxOm_M3^o3hBBdkM36W*1gCgg`|Ep}JC4E~gx%f4am0?g<Gp>{r=3ka zYyF%2bs*JwP#`}ThL!u={+n2H-%$5E*KyZf=PlcF^IOw3Q<(W*gT&yr@AoeT)znT# zjLZ|A64gSrA@OkCli7udI}=xD>`8Y;Z4K`cwN{lc{)<~E-Y(5$4<-dnp}>LKeQo?5 zsU^fMr_Vgn)ysF&F~zddiGXwHv>zv)ve$spY9+r&UJ>3TELt)_J}P2T*d&2dz!O*S z+b}bb>*zH`7TzkbJXjm(;hpIUxO;fNy9U}DIcB(rxIa0zJAS!YzGUwTAVa5Me5@LX zYgeID;`L7VbOPOJv8$n@rEQn>qV=db!Pvz3$ypju`8x+9k;PI()l0TH{9)p|j29_) zV^$=s%jlR$sko7EVtc6KMf1d4!^>qJxSO6Y>Mm)9vO`>Y1nW0`$@$dP9ed}UXKiW? zd0f6Lu4V3%cm*;5GMcw@UPHgPH*c%3y(}T@ncxh+r+B@H&#h#A1t-=>B!zO)D;diO z3~L!sh7MvqJx$%OJ>5K6&QXqGuD{%*^P{uBXSVOXSK$5IR|E>S6W*tuC~tqS%6-<^ z(J6N>wqLWJu$9=HrU8~EuD9S^JM3LdpAliQVsSUo#h93sO)<@smKY*+Wn3f0I@P&2 zBuXbjq|wn!lu!Aixi&dZIgh)QN@o8j^dW9fg)fq11xZ`Bt=vBzo9kHTs0e<dZwLEe zR~apMTUj@$L(FADiuV(p#@a2oDLBO%$a3@Lf*ve4@|#`5$zY6xio-iP74PD+`_hBa z*c<nL_fuf)1z;Xn?c3xZ=N;o&>0@F?eM>xvUberNZ?)$WFafeWneLV@+Rk!RI5mzr z_Fwk;UUSG27#(auZ{%wv1w12vOn7Yc;)ubLQ4t&CB#{SzH2yheXp}`VHEd$kwCDus zAwkRVrK<5_(C=|W;z^tbFmD`U(9}}z8uvh`i&S~<xjF{Zs1d=LzTKgT$PVg9;394X z9!g#4NA+jwnM%+RM6(}qo<JRA0DB{FxcRi3F%C6TpclYZWE*?{tcm{MPpD4hVgCgh z2j2nneMR6zfQe1>mHXcW41SyUyiW`x?>e}Da(t(ts*vMe<hkRqdBQyHu(QF<FnUjs zQz5D0BjZ1oMo?FLgjddulfr|PWRmDb*rAAYd6M*@{Jx4AQ7ys3#wb^YtHgf`;-&FY zFINg#MP*zYT-62icchZu2pzvYpdA<iZZZzpf}9a_VIxCJ@rIB}eKAy*km9#P^+_k_ zvhTq9UdrHso@E{R3$ipX5HIknP?zq4FCacpsdPJ{A*|!SX(ky#`tT-%ojikYf{t+v za05PtB#_~m1RcFZNSVHXm16QhCZ+;M=LP>6ALZ@hKMU%C!{Fxpgg2uosQ34xJ2T_J zg|vY=oI99z4DM1+3Aczg2}*?hr5nQ@h~J44!}8><rDGu7`j>RQ_!NIFe}J%)zyZ1M z54maFrqFc^vPQCoBTwnC3?(v)YDt_VhL9M}4Ap_^kvp_6$O<h0rK&8{I-~`v!9?hg z9f5ue26_B<@Y_THKLtrA1o*Qw!~?RHS^@c3=gA$^M(QbaR$OEzbq=%<yU7vcGU%>k z5YM2uv@_H+^cuQZZv)c6Y3v&$nfJsPpsGF^=oX9*<_FJ&HWG2r=Z>WMGKM2PKp)YU zb(6iH-Ja8r_Y;URGx$q{xTu?G0KC^MNf+@E;c=l_)Jrs0@Pa>I&{yz-7si{<8^m)! zMO4Va*)v$L(D~>TG!@da4g;|OfgCG0^mA(PAJ9er9;yyWL-T@6=yCEw1E6#M7+k+C z|4<3>ri2$)5}Bltya_y@&M+DRkVE^L+6c-IE%XRVAQw~%d8q$FrN1TB4f-WQP$L|N z+MpcX<!|Vw<_De7vCRuKfK3isQ(vG2I?bPhvCvm5f(}KHOa;zT0b?4}E~hgM%t&@` z@b3-hrt&)Q&+`vJ3U7@dM|f9oUXUjoBzz`lEf^tKB4EPmS(o2}e}(sxJC555bOHm} z8(DQ&3z#jT9(oGWGBW8%=;{w5Pk|0(JzfSH<E7wjUILj{2<X~dLsxS?Xr=l1Rv=g! z@HvDWdIY`5m*iOJhpeG4foggkB;a?4WVdptpO1w~|3t_I-2wfU_LK_pzJo+Hu@RIA zJ3znuBQzisg6x(J!Op=ja5K&gmO-a-Hz-W@h8~5oaTaKw+mIDN)c6c_Y(AvmE0|Y6 z@sh@tLHA3~S;%b$9^~shoL9!b&p*vS!ms5E1aJ7Oz>mC!U%)@g8_jDB>U}rx&VB3w za6XSS)0qDPv)~!%kzPZZYXXe2q2wDP3ewBY;A3%D=z8c=NF90*x*H0EOx*EscPfRh z_!&?H<Uu#Q7N`M@p{w&1NRmm=!&nO)!qbrS_z^TAK>2{owqMjDDwBE#XFZv`PV^%f z#6Gyc{Sw+4N(x;IE`WY~=b#iu>lCOCUk3Gj=a4?sAHN3kL^}9yCs0j+Po)L-?Qp20 z$FYvHI)byc1{~LWx#_%DJRU!d--dsV@8TbYv-}K51-<x8KFvGDE99*LALmENQtt}x z$)>Em&>e1r?f~82WFU~0(t2tcb%LA$dvymC4hkZi2;r|lvH1&E<2F1C`VwQ|V-B%{ zAc#Jso_q{lyw~(UjNx<*P*?ZT4B+~4sU%>1RRb|_3(O*2q1PM^wV*!4I=nh`_Kz=@ z>VwAx!vZh;6R|7c-Yo^v#ra@I&>tj#UhZe`WT;c9IP{9pl5?OVOpxCp(QZ9sEYrgp z4PCr(oC;n~!5zMe&lhwT?i9@Ce-r41IJhqt3dV{)3)%qfnBvtFtmaN)U0^lm#6pi_ z15yhd)JVohMnAL&c}<N1^5$Eng)Rl%b`&HH+lZ$`PjC%qkgupeijWxC-*wa`=;oh? zUe+V3lFX;%kc8GBeA&RLfqdRtatd`FloUhZNvkht=Rea2sf*yx&jh#3e}OH&5&rX@ z$KH*;NH6Z)>t?$rx^i6o97k>CHkNIrwa~`(8$zq#+UZI51&#V=_II?B)l`%Y6x{t` zhr&JKPNgHdZ~V{5j4(w0G~&1d6M+9$*jLh7)R%APpW$Q7C}bA89KBBV!(InhLSkVZ zl1ZGPrRZn62ow$r2ubK*@B#TRq>Q~Ke2n+(zu3R%`D6+7&w3Mlyeq+neo2suN3+nS zbRFsqT^AV-Iz2VHjL{U*4%VZKnSGeY&|_!>`i1^Y7K6g&6PZms5B3C)M-yx{=rzwe z)9gB{)lzNAwR|;fFg`Pt8}Av?bhCiKgV(mvRBQN}Y<-q%FrynkoLkACC~p~;8OxWY z$hJp*j6aijJY`r`bk5n#lFZZDi&DRY^M&sv*X3prla<TtD;OsHkA04jOy2gFIFcQd z=dw@WR=Bf?IJS;CjCw@epszCCfcJq-cSL$H&vG|_(rYqrD60|sHfI5PmDm|F1B>`I zq)1lL8>o@^qu}}Am_U+mly_6$G}RWJ4v7&LIR}7`aDz31xeU3=n2xN2Swn?RgLKXt z)S1vMAK`3kcUd2q*BW`omxft}r}~k)bG6gdHC0=FZ>(fh-K?lrdA6pa=8f80vqxQt z&EYxt)j~>~5_d6eN5TiynArPiU(>>}o7NjsJiXv(c21rB`Ee;<rJaSPa-(9s;5%y$ zXErw;`4+4U-tr}yQ?*^pw6_G?<1)DAWLxG~<Ob0Zx@DK4{sK|h60_)y@Sem8+?i@_ zS5N{xXU$+0Gk#LHp>wJr`-W6d^El;*wf}Op_x<O)<V_Fe(NiIDZUdt|a}T?UbB>1y zhl`>`hehYbIpRCK-e^AEo2pNw2ex=8df1*x&RN!>#%?;HrmQ-<nyQYhxmbOpdT-4; zb?cgyRSRqQHE*lA>Rh!#yHSJa?&*?=u<*933(AI4QQY0kMd@WxRZ;CS_tf1|__nA| z)9=O7?3bynGrOhE3Tw(;BfS-MLCNMvvs$y08GC)<&TG#3*0zQr<`irp<5Fm|=YXH4 zKGM%2DPbqskhPuDLV$rzPs=amjN(n^g_zOQRdPJDm@|(hV$3H-gmz<Xy%BD=^Nb_K z*~nWG+D+u)xuJ2S5>cUbAjR)DzeFqzyDL*D9?HrjyM=i`^B%>zjU0s(g!d%4mAs1` zt1W-hOh(k2HOZP-O^)W88mrz?HL0p~b(fl|8eDT*H`B1q_}!RdY-y@vnq$!D({$Zk zrNTb(jib|~5sJKIGCMBT8+IW!yAD79K*6?#iy9m2vJ<#TO*0D;F989iP3(k}*O6cO zA2}o0dAP>a!P6Ui<yvkn_iRI6Gmrc8Y*$>jAmuI7UxEEg9z-{>dT@i>{-`E&CzwmG zK%I>L$YwN?-G{rJ$t3p$vi$FT<NUSQs9<CO2}BY9GX9~zg)Rk}6GPD<kY;m|UnYu? zwwK+Ijh0>%Zst+Evx4J-@7yxh3G@wu(nUd`r=z{Ig=4;CG8kXz2WvOie%9X7I@G_a zc2t>bE@<cIGxW*&z4|Z4Q|4ioWb;(h4pXLiuX&YahGCrb6IBpilJHR0n?Fo`Fu5#w zGE@*2q*fOi3-0CX8%}Si%UTsbBK7YaZ}N=rF{<rp7t))k9`MKW;@KVWGu|G7eRvzM z#&*Yd19?nGxf&VlmT#Up;Dy}gX%Xy-zYGcBPPP&tSOeV(YzTD}c?M|}_ZZh9CANqp zp?ftt&?aP}G@#V@4qer8kmo9bZZV{#GQV>^@b3s;2vNaL-c)|BpqSr^OF>e>LjGG` z5vLecQF0)sY=x)PTOJeSztuP^?7c1d#?AU5&>hY|Rm^4RXMAPiS{9k>8}khuv&*v9 zirO03R@)lc|FSo>&$8*P-~1i93uX7k9oZ~iBZXg8D?c7q8hI`8S+Y4*lFh1nJN;Gs zlf-{A{!Jg7kQlc)$&fNLzP;*-Vo%s_{(4pi_CiiF8o&j_5=4WxB0fSDPv>dwE$~#j zb3C=c)!5=0??Zjlpz<;blD9nGknb}%Dmw>80Sl;oC@W~ingv#eXd;6eLd~ULL6XTX z<T#L<3(#ohBi1BNH}GjlxEr|NxKFslxV^yp_lom@6U}YOZN#xbwn{FfhmlAg;}BE} zr9?RH3>F2_{DZv<JudeY*I>t1+f=L4`URr9Nt52_fs*Go<2K_?qt6&^sxpl=hahtR zH#=-EJ<9_WJW0I4S2AXCb_q<vc=34Y0C_Xj%-D+wp2V+-naQ`)&SnkFIg!oGO3Qee z{vrKR+OU*G323Y(s!60$d0Kv1+EqLpyu7P{z0rXRhW3G1e>iw_`r90q`PO_JY58Hg zV0fz^0_?h-hHiR9w^tjZ_ZZ_W7cFNjtF1P>$F<k{7!upQg%*-K8D-4N>|E|cUSDAc z$+ob8@)HVsc&U=9GAlXCOW_+7I{5+leAxi0SyU<L!C%h(z-o>-Nfy37P~yMoIqsZj zJ7?Z&3^NSTO|AW*PF8=a8CBDvW<qsj_4Mjt)nBV;*63<_s())RjaXY^++yQG+uIZR zL}VdfIVIwY^7RqPDsR-i_|mjxIZx_7tc&Ds%>#r{k+Aq_y?OaF>L%8inlmV~af&I< z63JJ-Rm6s+ihgk2%n+j~^*S`sKi7TBJ{@}FI^%bJjrK?FbnQmnFWpD&n_5Bb$J$N0 zfAx>`Q}qY*GmXnFo9(xpZdW7EZC~?X8IewxGm6m3tdZRPf|lYmY2UB}`HJwi%0;T@ zs&T4zs&%SDRWIf1@YQlp7&q*+WSz*t7jmDnEa+Os9Ow#n^*8jqc8;=Bmgy$FzF1dB z+pIQ9BT(C`|Eiu@9aBwJwW{V+FRgxB^HzOcBiF9h8nr1vhbc5?x#WQ&LPg!D3FbcG zVOcQ3qxuk;A5)OHGUIApS$@4dcka9bq-b7)uf_6uqx1UJ31*MY4rHj4?XgE9X9N4A zRuU-?bE?reMv&MS)cHa#pZ&h|f;q#uLYJhS3iU&m&H_}LubRBtTy4D0q%G1m)9Q7x zrjFKG_7{$ST$$dJSam3#d_mP?Y(c-UU+|)Zgy_8_Ri;twj2N!OltR@SRmVt;YPYgD zVz*+SJWswdEJ{)?+{k~;oyLh{agn#=lF&=+x-Z|;z}dz2(41fjH$Kug)E%j9t68RQ zrDm%~*0`#dRNt(&*6dZMYZ7YfYFp_1dfebOB$*zXHd<pmmf%?G4dX0oVe`d0`FEu( zs%sP-ot&^Mttuxb?@ew(Zft&!dQXZhMLi2sb2n!zGdpD5OVcGyjE#<b8$LjO1?~(Y zx$Bs18R?`ec*39LiF6*Z9kCoUwKlxg{i~~^f3A1yrf9d<KCWG$U9P*NQ)?e<-|NO3 zUs^`nU5*8=Zyuk2W+;ZNf+O(+Nn}x+wfx7zlj7Y{Xm2QbMsSral=;eTN<)MbC@T}> z6J<}szDiRi5|Nsp1<DczdnLL6aw+x)mt%9`Sj=#i+rC)-F;6pP7%%GE!nha!314Lz zL~}{~LaoqT(mbhMr#%M=jw6hBOd?B|HP^P)p5*B5?CISR>`BM5P|#}^3Fk`x3%?tA zC%QUXA9FDNL(1E%zv`^4lToL8oh`ZUd{6%I-22&+(;uh2O}>!WJPwV@3XhP5OQ(xg z@<Z$lw3f;xh6H2$Vo$Z>oUIJ%euQzl;Xi#y|J<NAG=VJ1ce=Jfx$J4YXq;`_VoWu^ zupV%*-TOTXUwe!hdPX#%-$T~;aLA>a&V9t+E_8~<OM=pIvJdiAisOpCictzoK1n`L z)+Vf%be`n8c#G(#z|B)|hp-PY7b6d-AGjiT*8km$cpf=h+as*&%*RY0j2jFs^;x=2 z+RIv<_PO?k_Ka4f>!-hLcx9|-9&Xudy=On<Z0i2u`Q}~c```}?fa;eVi8kWI^BW5) zg>vaK`T2-*s>zY#B7;$^xLb+yQZ1<^sS8q%rfD;RnNKtRO>L62H2!C-7<^(Al^^6g zq!#gh(QrXCE|=v1UurMnR4^SY_ilBkgRaJEKW@7Ub9b?Ioi*Az!SV=_&cZE6EFU4o z^pRz#6|rYJW$ynxySx=X3~L@LBo>l`s0nlg(w<qwuH=Y#iTpi+!6JkBHmIx1B@*dO z>3V6pG+$CrJX&-@=o6IlJMd0&B#;`Mg^pyzQyN?slmw>wcY05|UEr%6Y#(mxZf$8P zGt(xM$!{{4NK+59&iur3#=6ip-9F24)*0bm=VAL6`+eXIl7X^#3OOE>T<Jh;`Gu4+ z_3SC|boWNMO!Q3rK<blKC=?M3B34B_Qr?L~V$R1NiDk#WjF}SKCvJIMr`Qisom8D7 zvcl^rhRe=MZU~3)aY!Q?&Q50DXUu^V;F&lQ`a5vMPk5hr7@iL9VXhm_zRtg$=bfjV z)1me{#Cgsc>zeAC?3(FvxVWBK-aEdV{`uJYfIRdHA5ZS0Mgd)2j`T+NGLNt(vPGPa zoJZVSyybjU5F=m<eEiG&F8pge4c7%ZTw=BtbV0{~xF-e=U0cW#Y8rfpEe1AJ!1D<R zYJTSkr`fT^G1$?-QQ|n_P&f}cySNC~Yxhgf4{yMij&%*p4?YcffH1n6IuH58k*E|> z>~)|x%jDeQ$hc)d`ys*2w-x#u_XHt9hVYPZsHjL>AtuBcag|shIV|ZY9VF#QFG>EB zT$W&xcM_?@Bl;?&pssV4zX-G>lh`GoYx9Gyu_w}jF$gk|v#Cvx1y%tZqjsU&kUIAQ zQniu;UhE^JMD4^jfuCzVwg4M|<p2RX8)(m8A=zq8fB`Q5m7%FXHL3vj(r@x_NYOtE zl=Zp5xy}RbP6PBB8qRD9WZ0R&F6z#V2c}eG^eU2#>;(?O0{S=TTGx>#P!=D?x%de1 z%hm%OT-$&jyNJz$Ou4SuXzVCv#@Yss1_Yom%L3>9X2_Jlh>PSbsxHteo-o!z>T)$G z`!ZS2AVKRVyB?%@-QXA?Q7IX!k0hj|O@UmmWDXDf>aW>l>@MskY&ly72?rNJ3)=|D znRl3*K?5pa+R-oQJMg_*Py%H$S&*7$MZcmK(GBPjG##jt)yOyG2PkT5fF<NYoJb{T zNpC>Sxhs$+ZvvM-9%`<;f$S1Ze}%fiUsM#-3=WVzNtC<=1f{m%$ghOz%}#tZz6!Rj z_z7S+-p0S<emojDN>hln#05|mGsuRZ&?^I%`E~LK=w;<p2Gtrg^@FLufl9Ryvd7kd z_IwM_5;wu$*TS|DKCc61^btsX{tEhN8<_E9Kzlt0Do%HRt3lJn;6FMFl@B%4i&#h@ z0x9^&N#q#p{V#+-a={zX3TTmO;CoL1GExMJ0B80c@)G$3@Ant-6F$EN9@T63+I!>$ z{M0GrPYV2P_}UMo9Qh5*0s;}EQLu4QD<}v*AWxB-z*d@ubVKSRX+RTlF}^X*f!cf` z@TRhXIPn@hZbLwWkAo8W5GaXDsCY;Rt0JF*y8aNkj2r_zC`chBdxNv)&!1yKS$&v% zLh69hRRl!!olqh5Qwc!MnF!>hD?l*u&|=_hG=kjiiJ;8gz}N@bdB=cPa{yR2>wxt$ z<9`&RjzEKN09=k}NErV^82Urc_zjhtS3qRB3m<oY%W~&`<dqM=-Y@`{0|8b?3M3<z z0t0CpP=EFV59~Rk0#qyrB17Vlx{yZF0%~V}0hg*H(jN4|jet@W12icb=s`8W6uJVu zpk<J0-UE0ke>huiAbh-reclc{r^ DuG&33RFG?P&vb(T4;qc=%8G%1%Ob-17}4d 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%0ABeuXVZYp1lcP@u#N? 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 literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/II-task.wav b/WavLLM/wavllm/test_data/audio/II-task.wav new file mode 100644 index 0000000000000000000000000000000000000000..9d658abeab92d79fa69b97e6fc931b1cc54c6c6a GIT binary patch literal 1757050 zcmeFZcU%<L_cuPf3%isBw!kjE2?_{^A}Wf#V~brAHTGy?ViHYkF)=2_7*jMcMPrRo zV~rZS*Z~ERqNwy<x9`%+?mX`^Bfor~@9X(K&%eJvKF(`)X6`-rw0rJ3=bjmyHh#>Q z53{_P*~4dzUjFXdKpDd@0vw~xFwEC;1dNc8F%!p6pRoe%<0p@qGJg298B*MTu=w5R z_3x~UUb6aKX8g!WGgN4+K6||O#O~T#yK8rRU31`znjKqe_V2)`;gcljjp-Zx?)$O8 z^4hdfc02}V{PZz1TyZ~f(Z|c<21LikME8z~VU{jhyQn178}0x3_a6=XM+5)Sz<)IG z9}WCR1OI=}0L%W*T>Rhq{^wED!{Q$gL3eb|U;k_C{|f_;=l=!8W9-8Fe}^V6{?8DU zA^qF??>*oC-^X;(<YoHrz5E#ZB|QJrKOP4`{GTBI>)0-y|E2n0$MB>7h5z@NzvE$v zi~pUQu3o;Ui;u3Se_{DM9{+#EO_2X;jK|K;G~ddPBc8iP@gsOl{5?VbPde;^_}@o$ zjqbWq?|;|Ne{K8k(i2x*@RSP+I1YF|_;LSL%m2c5LGa`M#Xw{JJ1;y8wRY*_ze9E5 z?ds?8*;pH=jIL{!PN|i@=kf5PdHr_DLsx?9x)Kb}felxZvkL=1g4(*MGmHp_jkR)X zgU3RB{P?bMT~rBI7nLqt0**FuN8{N4PY#|RzKsDzA%S4DjqL;s4^3L?lAGk@pNJc3 zrR%@rNydL+2@Cb|R}S?n-nw|^`RnTGn(Z!n)>kxM5rDib*Fsc?KYHS?T_fm9?Szq} zAvmH%T!=X7cwD5RfA!hPVWBadYzJ`C9S_Iz&X4V6+i-NEqn$Ogde+1?;n|AQ#OhcB zt7YqO8gZD}MzqzlHE7Y{&V*hat6^)=W@ekwYX+1S&sA&*TY$5YEoF1rZ1y=@%vRti zz+C}a%h{LgQ}!8tOWA51mFO#H%P>yEjjsn@EuM<l7dT3AR}HGQpj*$;uS82ZdW$fo zl+6Q;=WIS`6o6J1cc0G|;wcxSOM$xtPcPXV^gYG#gni7W<9veW4DOnZaoM;}W$&~1 z*km>h_Yc_zxMl+?9Zy*tbPj$~(US(4+w5KLJ_XO|I3D51;NVk$BNdR(z!TBU0*yx) zk-||;!&5f6Aj}Ve;~rXx_5=17n}qWY;0XQ!db8L}4mZIOwG{N;0j5XbAe|e13miY< zczeRpxX;l^#%Q9JhTmks5nseRjUwq&fb9-w-NH2)9Nb{9fHuJr2M=)EWUsN;(N6fO z{~FG#>_33J#$LwnU0`|)d=Jro6OcE#{%d$5-tS@@;lGXh9LSKuNkbaXz_>?{<UWp6 z9HbS}b|$9};_DvHyBz=bI33^RehEIAqj?t`Bw-}c&jiK?;N~($Jml~_=4Og?a}PWv zy~33IiXQ1L0|#l6v_lk9fP=I{mP04$nsiL_lm^I$xRTwFC6W$#PKh>e4XGHF3vBlQ z{S=U72M;;viQh*!vtbFj-0=)|G%5op+0a8^$;49*tmHZF$c{1rnTO|W+>@m|2i>Q* zCp|smY@N8w!k8C;B0D16e}PdiVe$FgSnA2c6Ri+_rM&=DE@zLqoV+hNtR&TQV50R| zhE-C8G1OD=>Y9%cx#%bUY2}u3_+FruAPR95aqElLb`_3FtWokA8r&75m$1^xF5)QD z3Mc+()mCupzKp|Bj#0JTDkTq4gC4@Ag+FNmu6jI|<21nE)Zwam<#F`zReH`Z=>SuQ zgS?c5ZGacjah`%8b$GIHUa1Z=>N)>r#4q_RqN4$oR?unWjs|$KHk>BTpS7|roL3{? z*9z}xgNJMZoCz3PxKS<eo1M5PziC7d`OyxHvEXRrU|PTrdCCSnH*iPut1)!7a`*_N z5q-_vLEf1BFGWi7+^rl|EBvz^W5={}*jf+`D0(_DQbx>0gHFg`25mb;0P^J&fkccm z<BHP}hZ7Dl7p3fRrPC2TE*S3!EY6G@Bgg5)VRS<q#Vm@>_JDBZU|dnZb7CZbr7@29 zb>ZM8z(oh)Bz_c(C*#d{V3Z4RDsZUK;*Mu2`t32s9WB)Efzt);#G@0i6Pzd4=f<@v z7%#>Lr#Iur_;OcoMvZ=NCV=V2bZ3Hb=Lrbv^=AUn>WAN8oc>G@6T*ZtJ(zI((%1kz z2jkZtFaaE_KX)bg?!ZR<QA{tu2Lr|%BM1j!3_@EZAUwgX42L`J)Ql2WZ(t@!I*E@! zKm}riKMpTI%ON2zj}lj3U<(F>AMU+4o;-lV1M<+59}ZvOpu>yPj2z>;Xply!pD6oq zvh`rXz%kKr=jM)dLcE4S8b830T)}`K4TRx01TBHk1@(8wFO3cYH$fa#p0iNyxf`GY zfPvR&Fb5mTLG!u@2UG}JLjghh4g?0`E`U2o@1#v$$NVqJM(qSiGO8d&*L)BU)J`(f z{Hr(}%P{|LXd%6Na6L5d?$C%Fnpbj=O4y(T_CwEZoGps6J|wUtXU?8@>n4k(bwllr zoSl-rN??n$a_l)A_MF`kJk70~!{7oOv@+~ptpq!)1qu3Su6)1|tpOL%bw;ZLhuZ;n zUD>P{kRIqKsxE+}oXs99iqFXSwM#3NvO3D+sGl;fcAPCZI=Fm~);x>*R-ANC`I`;* zU2x5SB+o_p8hIxE+5|5`SliJ<-jJZEkJ_8iV&?p_p7U8+_$~5<1`Z4PT58e4E0U)z z=OO~{!z<wD%ix=9&{_dcs^P|vha`VXnIPqYl%G+)SdCxufW)1NqhaKH9FLoFIP%3r zg?=gjs|Hp+pQFe?T#!#E?#PEzMA3p0?<p<7OJ1>!dp6^#Oa4~)RF)-AWaIi8I4@1O zNM7>4B)tyawh8y-b4lYCVCS<-1LuJ$KJb~X4zR=vQKs>{zMHwRBp=B}88S(r!4t&| zqCgR&9?_-xRm{;t7K)DLh=@hdD#cogj|KRpm`a&4#lm7hkbW!hRD`E84ze7*JQT%2 zqDA>K;h=n)@&k(eB^=IT{FdS<<{~#me2V`Ru_+@c0*x13G^Y^+TZq;?4hLlmg=itX z#2K|xRzz{1W~LYiwH5-Rg40(SH})m)QGP%)`1~Os7>Ire$1BBtqCwIX;raq6<rRdp z5ZC7zO(*4YlxI;dpPkSX<x9i`Wz2MafiXOG%J=ioMtRRm4kJlO_$eo%oP~1zXSmPe zxXZ;o9fX1BljoVn5EqpFQI_+R!$^9iY>LP7FFwLaoDeURA7;LK;yEQ8G@ddtl8t1g zYaV!|StKi?xg-fle$oKxnb#m?$~+Ie)TC9SL_E<B<T<Ao;)t~M7(JA4@){#;@R=5` zXVNg;Q9ef&Kp8fVi+YG7KBJ>7t{i-kZPGr8be{`&l7O<jJdPI8F68WrY>TXtw^QB@ z%h5(w(3K<7yzmlJ#z$ufH<s+J>$wsuq6{Nw56Igt<-B}W$=e}$9I{rLVWLeLCaoXh zn7167YqEXHY{_D1H(AQ@{TzBE%>2qA9g~HSCGx9<eu-8AFj5vsC-F(MLXr`uWFuwV zN+U1TwR+0{OTLS|6YYE{AEot9K2XcG*5XR}9QgvuO!-W+o`WJk$?v7LxRReG??(QN z_ap|4X~jV~qYkse@3SrNN|dA0XgbLkl4s)m40#;FU_lG{OUi_KuTB{$WrgIoh!^to zb&!bGZxv4Ry8KfGr&qE^eyw)-3bLVc!1DWV@;y};&Ce$3iB<^haA_WR8>SsfKI|ul zyOL)k-ILAmI|cGgybt8<f>s6f5hQs;@-w{U@%Bb@R0>KI704p~wLY?1iZ&)rN{VkJ zE#>7D1E_vNai1c*1L6T?tP&h_{r8??JfAO6c1szn6fkyxx8q_mU%wK*!sE(Cbv3dV zKjc=FxrE|MSrFwfYGgr_0rL3_Wu%lTP?kygm=B&jk*T-?j<Q_JYus@tfs^tG>Y;<4 zDC1TDPW=joFjFQ(*%9SVlnc>lJ|E?CQg2WS1W&{d!Sb0FWmS|d(J!Aj5hlXthm$xV z8ibQ_DB1(?*_0I8pj?ZnkY=ctekp6Gyq0os;-f3?rHq&I%|K*%5y&`uy!!0{ZTRD) ztTO~BWurZDM53S1HYr1-e3I{_aebHpOgz({iRF$+jEF{F9*yjrFoyv;l!;;D06|cF znciG~AB^jZqZi;J0Y#J|xSmL~^~Tu?5V3%uaS6;&W-v358HAIbhu}!S6JaFkbR^(D z3Ydu7DDI9prd<Y|G^>>TQU=Z6(@Y0(QqeAh&*i-_@1zr&6(4REN#|q>lrvLS-!*H& z96rKDdjZ-5&<xT3z=P8_?V#vTaKCcSTBY2K(H@KPP}<MYjM03Pz0nNGxjdR$d5e*8 zwk6|cljfJ^lAfd(OBpx6CzIhyJv3VOYL?Y#A)DZTdD~NR)I30mw>GjRS{p$)Nj6?a zvR2y1(V>1N1K}mE$?|DmNYAteXpcm@FS0w@=a4OT9fXheR%GRVXyw-f*)r*dDAVep zofh?xmGe^59+Or+?FuLdr%aqYg98rA;VILn-2nLkTKfbm<g$G}`zLQeIX>x^_Q&KK zC~qeZ!Eim4y$iVgHtpA0me2Mnqo+D;2cE@%pnJ+TJMc>xJ=JL`tLI^CsN)J4KDVc= znxa4lOIQh>_6@W%Xh$3Ml2_;Jv3#|FU}%p(UXQOPTM;v;veEVmQ&;VnVQ2)=?f`A_ zlT^{@;HXm@MH-?-BWdSA7>RFwXF_A>iKL=kMGK;i5pjsJV2W%SF7i+oP5TkrZ%`G4 z4w8VLNiM?8XVP6egf1LLL@0`))m#jtodo6Tv_qhnM>#J=3w|HMM{SB>R2$Y{6vbtV z$P{y_+Ea~~LQ#a`3m^X}Hc^zPjDw;OWh0bX^YttqhOcT-94f_8f|IJv{3yzO%g{nG zkgrPfIUPl6;+l_>#5L_7C`%w|D9TeG?VhNGWZ`!=28^TVN>wxBouYF&e))Y8VWIsG zFB`>ms*_R9MX``_a6W6{V<Nv-;4>qVjC4giG1{$B<mdNP#37%(&~FuFp$JU50AVER z{QiS<+Etk+`3VnI=V$~;&u5WDjdE0q_k4Crc_8JmRDGoEk<TaiT#F+6^H)8zr=WSD z%z+O6ndXG@JIcTKEP>ttP|i*{24x47>per(n}OW>A*!oXedlY+d<~gu{FylEpxSB{ zDyNTdrTQ!F3#i6Q^?Ry_(=+ApROL+p6xD61-plt96_SMC+fdd|5|TXpPKV#ek#6`b znD`~zAzLCT_#FUcQoMY$10X9R`{DQ0eAY>$DgWVfPJVY)!oikt^G#MmWB3`TjE!u7 z@>bfP)9lp&f@Y1ZnQVfriLy$nL(-0y-sw;_N^6x?8s(gnpHePK&y<OhWz}+YDElQm zWHr=F;|Y$efh>mXn5RH{YB~st=+G{jxTJjqStqRuvRP^+DJlD>JIX!DzG}F2Kx>y@ zwR|p0tBzlrlqr&=yk<$KMHoq1q<21KfiI!&7u-BiJ)Cw$l=nYHJJ|_Y9qp_smnU4b z(ksAG6;2&!(u$z0n6Dl4dZVnKuQHPtY2dU&dLg<M7(r{2>IEcM1+J9olZHs6)JM-$ zLniOtiaYYcR8OWF0<C761DX{cs-1g#N700j2vql__i+6CMT#%>uc8rob$X`g#lNd0 z7=om@!FzJ@@d89Bdqgj)E_Ky{$yZZ#sg3KW$`I9_$p=#_d3oLsHv%73Qfz3U)&}@% z3wWn!Ll!{3i>!rgiE7|f)uswPy%*&7A|xT{Ru8R{etB(@CGooE{Tx-@=`AA7J9!zZ zozSfC_CqcFj*EJ!mF(Bd;i7kfyakfCB>Uv|F=S8ViFNp;{YoXrtA^v7uXGUyU3ke7 z`L}{Zncfiab4T)#R8$8ePfcE*xFJiWniP3)qD$2;nt3yx$dA)APoI~XJU%~yB&dU( zkj2s(CvQOBlYBhYr06{fjV4KGlos%$DSq8h3;AR6^5lVO=Sfz`@8M`2@RE>kCh2Kc zM;arJ`28xcW3pO$JHp#8%@oN<b4vUXZ-kj-B1vie5@r6R-7CpJcxgotCekzS8Tef; z?;nV7vVVF*OgbV-$XY0}@j4_5G;3r%4bU`I&@8Zgvf~!C5r2f4tckY}(k^jM{(&@1 zGemYpeDGB|$`1H@l8Ne=RN>@pm7r*C(kRk*4J4)LMH=KIBkw=ym)1AQNH#*gicZo7 zX_WjC%>(Iy_kLv8Boo1srSOn6md^pmYDsQ_BHTPxzNSEL+^9CuRVASc4aFF~4n@9> z;t16qh!*)~-o{7=6w`?=X@{`$c0zpc@tH<aROMqR#RfiNQ<UfT)sz_!6mdn-h~}RB zIZ@&3D-^*BIXdJy$&(VlUG+Wkxm_`xq8%R%$*xH{s%257i1;U6^SJ``@SdBOjd<j% zV+2calp-Ks7o_SQX_|CKx}=%lHNoqVWFs0>rJ{-s@yFK%i7(1}XeRjz5$TZf2&$~o zxUQNH%_l+d^(K;xr0A-G@>wAL5)7>}T7Bd%s_{#4m+~`O1>{kPKWgLG9chx!hV`80 zNu&JCkc52Alb48QlWdBYmb?J@3F4h>hvtL43*jRxAiu-siWT6B-j~uEq^P1nf0th% ze?@an837+r`PvkDF2cjFDH=<7364h6s-;y$(V1Uov~FpglP4!TBP#qF;=LjHDT;#R z8@ej`d{iK>KyvUr@b5$$I2fK|`bvcM48%F{Kon@lLGgzC0eJ?Bo)pz+=R^Ap`n4kV z(awWnBkdt5uF|f8`shm-ig2x1`}F36qM#K|{0^iO`ynUn3Tc1ogqTP>DjTrT+f6Y} z+6CHSXGc3n+T+r0ly-m;L{WMJMem?Ia7V4qz(V_BdPhZd8hY;|<#yZrE}h<@(m~W{ zr|if@V2a2zmUgAIL#2Hv?K)}CN);o1XHD;5Y4=S#T-yE10O17w2)_qf_&0s@&Xp=L z{-~w!?-HppLtIc@fcCu9>kNu~)rMLKKfV2>y)OTrj%X4e^!ALnrOE~E)rlh|Mp7+G zg*K{dcmf|u!@r%Sx|cV{5!J%HuoLIsE>cy7-ZqA!;zAXf-e~s&oC@-F=UV%qf<iT) zAhZPFN>v$xjKsmqLY1Q!Zfs9rqW7eJ_zeZ7o;Z5|e=vT#<GvR+hUx_L)-i<ZrTP+8 z;;0fu?-PAE?x`ZvRbT4H)eq>cXCMyJGRdmIuQyl4p=tx^nra_Zub?^);iI{r$_rmv z@I@<O^#vqV&%8N~=xr*!@udoZ8W6-&2;kgd0rqH>0}oO5LO)dxT3Ipryf_M8pi0(7 zRR-dPD0|^fiE%Vi4vc&~hpIR94&H@pp;{5W`=yaoL7^%ORcEN$LF0V6Dp)9JPz8x< zJ6&&ieF00BPPXj}*#o(e^hTfFIFmJa<DmKpSr=84{J=dy(c4j~IuR6K`J%N!w&a4| zV9ZN2^x*>@X=S<Kj;e5BpyCLrDgRVJ3w=;s>xG$By;>QbT(ypBg({4sZx>{sPqXa@ zN>a2?Rw@QZ^iDny^z5<X8?f@70Y^5ahRh~-ILgRH;G671ft7B8hpPjmJz8k~m1v`k zzzmP#00<x8w?{>Uava(*b)u?6tCi{?jqq|Bw9z*e^jAi_m!Vw_`8@hQg|c6&W;A0g zABpnO$Ffe~(2;3@N2RZj9>VXpu`+Pw%oq`?uCr(HWl}!y`ar8HP|sm6u_y6uRURY{ zz#0e!t$e^;#OQL?1zPO`?yZP)Nq|ZN_iC;->W8sU@a@x8?0cG7PiVdy^j8Cj>)6j$ zfD@`UI)G{xzRtQ0I!4wJ5-Wi#4_`T518)`JUkctFnMOoK+V7UY2h+Q5G4yVMloWZW zT1DRjmUEG^6x76!#-7mu=Us4>0bg#9nduJPCeS{O<2H0E!`z3%4yy4j*b(+Gz_qc# zSoaaIz6xmJ6ng<Q8=)~JC~Cm@IcVo0=(M5D2|9cZs7sLW5n@UUW<ta?gVqZ`(vJNF z?&+%+s;*hUe>%9iiEq80W0r)lOedxlt;raF3GkJebtUZ7nX!QHYoK)zc<O<bR=o|l zGN7lMXd_7S&?0Cv2P2d5TMMlyAxj$~@NM9`jX7so@^J33sfX-Qb`N_DnwFq8Jp${X z6MEUne$0M@(GI9L&t!%{%Sr5J_C2&GV<v_&Gf;PSWHQ<P?APoeP;X~_VfEgyzan7D z!Ca7Z^vzExWG%+k5w=de7DLhtnEPi~Q(?fI0Ly6v=NCB(vA{ye8sw0lzM?F{Jkm~` z_7jwCHLwcIOBAf56;%HK=l{Sq`Y_9w^~_S>%Voc3-)FZ%Mg_Bw`G(odi~;t;><5tN z1V#^I)-oHJX~6%4J;?qFKI+*ZW;8PqHFGzn4px~Cj%}<LxCns0o4IJ;0ekGl^n*Wl zWvcMq-gRi97ONnUS;EXgPcvrjFZMia%pI8CX5M0k!^YB~)uWgLAu|r#ZDwYHY8tzj z{ek@(5)EcPU^X%HFso_oE_NGx9F+Pp?}58{kiQHT_B-g9*`CaFW;SRGnWy+(@Fp~( z#2bJ~sQJqPbszTm6gJl#G^RiXXQl|FE@2KBti3tV%M|z?4J_^!Dn=$Y5ODK=u@9`a z40E51^=xCiVK&ELv<mj{3>;^{8^|GTf57=+O>3a}diWUSD=*fD*?5Wh5y6KIVMf7j zWLOn<K{*GO70bL1y^MoxR<L)#%R}froSDkJ3B8kb<)Aek-c5<Ivp7o%1dTf2)WCY> z@FEefB4-d6#T}9J(3{03;C2BAanSA%_!c+D0NEd6&9q`|jsmWk@XwA6S@~sXrW&(0 z3cSn#v=Z}n54_xg{-n_6Yk(dNTuqRbz9CJ8d|qf-jM<wF`c2Rl`KM=?y#cVS^=MCk z^(Mn=_M+W@d0D`G#H_$tAf4X@=3LB{6MQxQ9T7!xFW5^5*5qSo|2}l6gqGi8R)UT_ zbBq0wUBmu_HQ5`sag_NUYp)n>GuSuTKe6ssFn=&dnB~BJo?XkXhOIZSLt!85phX3f z2VEz@QswYT@t6f0Y%dM##SVGMG#ug3=U?pS>{o!2LN8mGPhqWQSo{L^b*zzkb|NVL z2K-XyBs-5C!7hdUIzwAqu|fu7#t*X}V%6+}eW=0NWKbb{y8??ohuI_F<Bpbg=rau( zyn|UVAPP`~l`!?Nw^QtI>;d?y5_sGm(0Djx&IgU3K>aAR&cf<?VFnoHCH%obc-bq^ zpdP+bi&?!2m_Hz6DeTw@UcUf-c?&rD3VxyvE06HCVV=K(ZZ=_TK6np=Ug|Jw-?Q5> zn*56z9M-XC*p2Kv(8Wb)Fp3$8k$SAm<?I-CHv1ze1Yr&%5o`Wr--Yf!0UzybG}f3e zIQxd3&W>c40EYx?ZZT#~$ed>1V58Vx?0jgr6~1R8S_5HUf51P^0Q@`fN-2mm0ho&r z@Se{8!oH36`B>$*AzuLel$<HY=nd>L%<NClmJO}`SR2Xkuq!YZn;^k+*dArKHr$<p zOlxrLz+E;Xh7)9UWEvpldH9o$AkEv*&1L9D4*4i@l>q;Ga5@LGcnH?v3T_5~PcwYT zx8QLxdXGbI0%%DI50(ypvkvWB;GJrK#UJzd68?P|JBl3-EnmTm4S)^Bfa-DJ4QGSU zvmKZNnek{3NBlg885++H!uc-d{s~qr?L6#ZO}F9WRzcshAnyUpua%|mEOl5HyTSch zaP&9iqFTvg_~~!q!N0?5)wBMfNB-*&thOIJ1b8pP+eKqt$3j~d;p@k<quE8!_#;3I zK+A?zNVTB?NOTc0?O;Dcj5>w2;Q-GP0<FD-wXKF;7GrkrV+QG6rkL|ze}T>!V5&e& z(ZElg1KuAYZ5lkM40EA?>}jyJZ-Dh6=E{U9L#v(i_Z-%G9OI9J?^Nhj1L^7ARwLGb z2DEn!yc~q3X92eqUez19SrzD?1imx4mcqZ%d;E6Xr2y`4tf?2AOtkx}1y_Fq_XX&u z7M4x>ns!jR3A_h^;{kXk-${9>8FP{f&E5vD`LGD8a+<NKXy2-bUDB7i_3+<mpqc{M zR^$Q^SOID-13H0~e+j<W172V>v@c?^urhvtCrE?Uje^Hmj;L*gwBNH|pfwZH429pA z4R|-?OUcmsMbOR$WqbI*9<aN3`0QZFTMDjDLxv3KCKNtpF*6r2#-4e>`QUVLrvM+6 zWqDwB>mic{D?^E~-O$nop6>#Z;QU~5%MfLTV?ADHKV=uPE8&-`*?#cUzcAZ@o5jlb z2<!P{&}(Jm0s9X8VhAVWd1MU_fK3OTIf85YZkX(*6560QG*94(D)3Bu@J{$Os@fMK z-kG6!+AB*z)eIY>Z?Ce@R|iNpczYFOG2)s28X*Ol4rR)*@KphrE3%JM&}=^R6^{r! z72dA}`uGhigZ!Zc`kMnijzG-QVwP_sUXcz(u+CU`qj=0k5Y|j9W|8VjO~4Zj-S&mX zyum-!)<v+2AUuZwhY*rd^~DPNro3(_=&2zMeZ5o-FGTU3z9#688Bzk8s^?PphZyiN z7@i^mp1czps)M(&2M+__|K@=2p`dCH4@&i(W?0D}W<Il;S%toM;BUu_X@K1goJ~Q* zpO4>oV0FgqJEOlFs7BzKcJ{QZ?}JE85pgDGX@$_*6U?p;Xsu(uWxhtd8wc&#fU^ee z9ateDz?TSXTLkNwiTRHJ_rxdJwhgilf=#`Th`I?8dmPrR1@n=M(GJkmV&+R`H?Xb- z)jqIIsy)z7gZ}~|iW!SYzYb$p!=rg3yP&r)LTG6%vxoT^(LMoMrf=h#5wkyJerFCL zu8zk(B@e4WgA8~Y^9i#P8QfIP!_!=hL>%A5tN~APup6rJI%0liFdLYkm|vMMKyM_X zw-fRW`cmH&`O!2$?_hQz4lm(!P5ZG1_+B??tv~o)2#oLIoQ+i&&P7`>Fb6`qG0@s1 zW&&0%eH}6m8P4lC$79~*Sg-9^y*)8%3)aUT$T%166hT_x*?NPcHOyC7H)}DXAGAh$ z_ekjDP0Z|Sj@oEgKrFP@AKBC}aF&2$2(Z5nJ+FpOn2eba!!GK<YXtKK===Z~=0ZB! zPnN@m1_N#fs4NAf85&E+oCScwPG&FK-$cgUgw^pBtI!E^JP&if8nZkax>P|z+Rq0; z0{Wtc>MA|CJa9BDdk|Xa|K6al3?$IRFvu_)@<+l>%Yl#9VGq~}S?M&;?u12TU=~eS z1AU;iF_1VEwn()w`u@ldvO5Ec-Uu*gAAnH{Vc&yciT2Q#k=x_>0)HIF(^u<M&k2DR zhk%=b+^h&7OAELOM$0^CXerh~Uw8;H_;ki9NPrEG#t1dmMJM1w@Vo-re;f1Xhp|+B z6+o_e@Mjx1EAfLTCcobkx*vn_L5K?U_Ra<!CPG)AVg{#zL)tUb9>yM{Cqt`mqIDqT zQ^R-Aw=yK9D{Pi3ZGPZj1SpP&20Y<kE8(SbL0O0u5eLg0f^l~6M)`<^FJa;2EvW+N z0NPZ!q^~8&@0g+EEX0Q=xHiL5skY?<ek&1&{y`MI0lZDnHpO2r<P|1hOF{HWLwgPE zo-CMZZd5U$FaG$i3F+-3|F(}Rru3a0)kbMYPgPK|=qAWdm0%qroDhD1uLZiGw*m2v ze?!&|O;A0`6%qzxZs?mRs`1ebw?W6Q&}4sDI_-Z#frI`kQH6O;#Ej2{74<+1y)kV? zo;V3Q-icMR4El0`rfY%02lh7wurq;yJT&>={%DJbZvCLWW^gP6%?X%^*D-G%;Ek&N z&B$#=!cNJD`C&ag#fqqce&f)#7#2JLI-!cl18B7pGJ8O)<gp~s5xwnfg`TQm#q<|j z_mKxuEbD~KS<v@x<WD=1El`z23omvNInZ==F!Hq}$Y+u{U-|-B!w2k8HjwpUdm|hA z4Ef1%<RUwfr@e;#z$kVa`xbJ<&B)H)M6TQi8DAuD%tN%@iyZAFa>LE+Og5TTunw#T z+ZR3C5p&a!sa!zDH3Rvfh!wEzY=7jl-y(-N1^j!tSe*zw{gEdo0`po>JcKOfH)Nhm z*$Loi3|c=2{B6i}0sOv$)?w^aWXq=^3)QXi5Ha5Yj|te#9KbBlp3ooKI*gG6f#F?P zoeeR6GG>Bd?jl=z2U2|vY&4#}i6Wb&_hb3+1UEqaC-i;?sj|^eUvP=x(~ltEo{LQP z6G&AKeE8pefcJCga4{r5g|YOOITxIM$W8{=i;(B%A_jY4j*5_#En?%L+40EbZ@`mK z)w&)zz*gW)gmzXVx4ea{q87H0g}h)7vhQV(=S^htTOr9ctep(Z)oEyT1@h);$beUa z$G^~X6EnIW`g$9@yp1{932JA+<tbcuVGp?#x!E7sL(yLkUW8^pgGN>$SN;mTQeIL6 zx_6<uPq1%T3@i8!wW~~63jL*R1LV4nylxwMKLef<m`@!%GF5gv(02o~_y?%nhRsz& zi;eJyRnY4TWZ3nvOb6I4tv~~2=|1w_8}J>p7aD>!77xvKf;#_21ihoC+`{LT7n%SM z8;n?A1RKf%E+?#|?wD7q_C~<#O+fY;3EXDP8@(YjzFPD26>Bgo;5GQkg;;qutcahn z1}-CR#=?Ux!CLN)b?%DT&<oK-j2M0yx=I2b3D$Q4)*<CVQNZE~pPB-DIEr;gT=&3= zYk@za{faN_rUd%j1AQIF+(@zRH{qC!`27U<euY&`W5cjcJ_7GonZAPYf_h-z#){ce zn;3KW2Xv;v+Eu_KuVB7o_8}h`4O>~j8f{6oGTT&eG#UPWIr^z$+z+uV8vZ8(G|8HJ zz~Z+fzHVl6m;&S<2^_cAU=v$lfrBx_W$Y3rnJHy1!h>jG(?i%`SmrS{3>5|o<0R-{ zUNXl}x#)l`1hcI+AIz};UhN9=kh#m;X0jL!)4-&II}LWtec4dh>W`TJDa-|?g|QdZ z0OkyHiMfN?L=^KeTWq^yi^1ARVY~$8$dHC0V&B8Z9JgWZvsqVokqUM%C>Jp&5TO>p z2X2Sdn-O&?V7m%726~&0{^5eY0;RwWr<FMguQ`Uzu|2m9#d?az+{lr|DNwH%E65P! z3f>oF!XBPs1~Orr^zF=cw%m5fI->JThsydo<6<{YTy5Vel%rmu5!Q>xIBc|Y@2s=@ zq+f5?-S}lED|{%<b2#sGM>^Wo!*!GM1@Sk`t+uO{Ub<7Y%Gzz(WsSeFZ#WH7xT`)_ zHM_4-__-}|3KBhRJ+3pC4=pMz-cxg=AxyAU>f!O0&-nm-;4r`A%3tk|HNT_DthiEI zQM#bwaP3Re6KkOKpl5lYrrX@$@BIuO_noG6w&?uJp5`6On_r@<QJY@271<4!yZZkU zHa;pb;_blm@(s*Jqq%Ixi(WaUPZfns-O-j8l1-{lf>-qv#w?8fCv=zUoN$`nQV^CE z`}lfhW!}`fmi8mA*8(%6I{S3?GIsyndx}dQyV7hcpPxG|BQc{s_p>T%v(-WCwI<v- zZg2dwxauBXE9Y2;YGg&fKi%_0lM$2isIX19Sy<!g8Pzx_d&ED(zKW9u<=RzN*QKXj zpKzty-6c;2wNKk~T_S>N`c{l~nY?=3rM~T|^-arOEWa%~pM2)0%PZ3d);T#|>fUqk zs>J@2{~5n=aADXQX}xw^hTA3WiG)+8Yge;Z8uDBUBMyzopZau0=mhD2D*vOxnwoK$ z?l&6GoIZ8^Qfb=Z+KZ0;BgT&^p7HhE_on_e<b22$@dvfPJnnX7=t;X1GtS?A5Ky|4 z`6DEEwC{o?D=sY>KVfskHhbst$9Gr#HRShezyEk@L(1gZV@|f7e&ahAY+BjA)HvnW z$Xvnpyct)Mk6hV1=FqeAZ)6w^5z3LVITN0|zHY(Kv%*FR!)DrjQc|Au^3Ol^jX1pT zA6u5q^rIp_Ml?Qe&ad+q&zv~?OvuNglJfiq-<=6LG~m#|bK@RY8P9nn^xHTo<aO;E zZ%oS>ygabVx~cG^+h3mg?Z}lsJO4?{WKHYT?+&^)>-5sv#cxb2={Lk9-jeWi<F%L* zq9e^G2Hwngnbo$`w_@Oj(^f5PU+6i_9QT1dR{K}_7ni!7Y&<dKf-*U<q@lCeH*3J~ zN#D)6FeiHAvc5OmXPO^n6<u~cQTpfIzmKL=l$+V3zTd>@#|6%eojq%!t?yWmTFZuK z(wo1X{`UC8vls5oE_D+u4_q=}&RFr}%89*3E{{3yv9I|+Uj5ze7Z08rdijHtMa9e7 z*LkM(Sw1>rQgvd|;Bn!%WQEPkORCbg+|0S$abtOUX4#zfFO~0w&lq@XRNpbB3A%7U zd3p0|rM^!F+?$s4=uU7(O=(=~2Dv<JLj35Fy+`#Ov_0G^@6lRN+AAaa&ixx7-2FJ~ zQB`s0yY3lbYX;bju#5<Z|2$M8J!5VyxRL(by*+m}rPMr|QSTz$?G+hW*ne_@Ha<D# za$u#?70cnGIT-_z+mk0f=`8qOcb}Qy@p+FPan}bW#J?8(m0u6X&l`Rzy_B^erQ*IR z%|8FK&RsY|mD7DspTPL<2kh>3C}4*3<R)SH?wqJcS5kI7j?S;uItvD?J_z%UGYmX1 z;Qgq#eU^#Wnv+WAXO}%3lDa$NSwU~ZF5&AQ+e7X9%#1%4@6-EiK#7BoWpb(g(|hSR z(yW<375t_Bke#nc4Bj5?-|xr%w|mbH`9RjUt+JvrdvS{T{*8xhZfxz&jz8Q|gQ{be z4>~sFj{%Ru|8_6wJX5_t=fVAyo89m9eG*f-qSMQLSPw;9zrl-!%<sQGY?tzG$Gxie zb3S}<Fv;`Il*jW*!&~d++rmr(mJI)Nm{-3YA#>f{Y`asn>Y4Q6+IznwpUzIGEN^Xb z-Oz1*U)9iS!%p}ADs+eI?3O;2A3xjpDDJ_46lvDSr2&n-oje2TW8NJ6@$jDq<wcgL zE7)J_3Ufb7{o~HW``e$qU9!`nmF)GM*ehl5;gOcXiP2L%PqAa`M9&YT9=$EQJLs{X zc#vh5!xz49M7=)n@vs?#Lt+AbXWM<JJDN8sec=5b_v_Oi6bv#p+c)|Qi+(Wh_o4d+ zE$j8rS7U!s|JKXI)Wf%;?i^3+U+|e>q}>^>4N+AIyG9-#+TN!<K<#+MtS_9Gw&IpJ zsZUDB^S`uyB5$u*k=qBUMt(aiB+jv0u=GqrTG5oWQAr<OpLcInj&tn>c7xg+d2g`e zn3*G^`|k|ta9P*9yiD{&cIV2CW%oRDUe*j@3swL06ei3YB_6RW?oiNq$5OL>aa4xm zy{OwiBu{&Gu&#w!>iJ{j)<GjiY#sVe-)X@;oU1GW#n&HCxVP-?h)3_dxKzKM*{41h zS(b2T<clF!V|w{L5HB(PP-LHR|L)n_y40E%rP>Lii(a=Pg9eohA3S7d?>7HC4iC)V z6hC;9`C!}qi|H%!O<ILur|L-ff&ocGe@OVX*8^WqNs{UNqWp~b2M+glq<>P7VE9P% zj;AdmeE>UT#h@M0ANgFepJ6&wEYDh>>Ye&-=6l8KOh!8wPf^&}*!u(K#(fs?gSVTc zpJhPl@NA!l^HO(aJ}3$^EEZgI5AE*I_rM@i{M)^P1AcX`Y~E2B@+|&g#r=p!+n=lI z7Fri6_J;V!j!76f_}jSp?wN`S9iyuXv!C79B*ovGklCmFMau%WNg+r2rVsgb*!}o- zBNM!r+I^~Dn)k)S@wYeJNldRU+;5I^_{LWj6+U3Wpk@6=_Kfx!A(>{$DM`!}CMP`j z^6`m+nMS>MhF?mr;z0|CwD$`S|5ZInw9D|M@Z*dh9xPApmN~Jw&iH}dDbGPYg##xJ z8#%~1%FQcI_>1oK!gHDPA3k|loi(`lvcXN{u1*Y_6Sref?tmlF?f%D|8XIy;!ZKe= zKL0?Hv9jQO-4DzacT@L)aaR-m9CWcyTkuYo@TLvLC)2jyT9M?Mdi3QoLy6epyCQn{ zz@tMt2FiQC3<`4@-xOCOd|Z6HA*pXlb#7g~K)BvZ8MSNR`$Jm?9_!T_@Jw3N@=4{2 z9BJ~i+vfXzS&9m#eVH;lB7X2+V@`}R3@Gg0C{wf>s%Ab7d$9IK+l_%K-{xJlgt}S7 zvJ?Ius~!9GkUyjJD!El(c`MWZ?wT9JZr7w;DI989;(RdVkAcU>RVS_-o)R6T+R$;X zqT|W<J0q^g+|s7aF3xI<aES~F8c;F1TVnRe$+4YYl^r)qbg9R#uK8!ljmET-rQO@4 z${7)v3A@J59H$wY5aZz8Y^$nxk+$pVsPneVzofdA6t{k(v_v!~d@^?VxJ^U1MW0YF zv5u=O&$yQ)ygd1;?ZMgnjZLp9mqxb^FG|cGCm(Vna=2=A=aTYSX?w5zdC~ov*F%@$ zh?YXd@u;Gan_lyOZScsNNTFQNsL3Cml6`gOKc8Q(e)Lu8#P*{elcK*GzIkHv#C;>u zqVtsNny%z6yuah}cmE7e`uoZLDxEb}9TgouY*OM!iC)9LkKCwO*0dqN{C>%$trvD* zfAsjzs#NxSuTOei9{TIJd*gl`dOGTo`}LMVg^J`qE?>A%dd(%>yW%ZtzGvUwt|PN2 zj7a=@h_t7NVnK6bLFI$yOMjl1UhA1Yw-PzE_vJoGqh?O}Cvo!NnjTYKbq&J{52en% zR&{aVwc<z9%VVscdM3s=jaV|_hr}^M$M!rTPj1>!_<ri(>u+7YdUNpO%Cg~Yj*5}t zQxg2gi4z@$?~g9>h-*(Qt$Y-CBm8oYoBbZ=muI*8E33ky2W}sgF?#yo36TLF`u1Vv zn;w6bRB)wFQt{)=3T@{&Rdvs6gQ`a6j7S}j+e4z5*Va(xn=$g1<;pKNwdoJaXLZ`E z)zK%06pk4=+GC&~%t7Jb{zt{fnWydyy>|CT!NZoKxy`@HW`*q^7(060nCXMNMV|7= z>x`^6=A2LNdpqgQnY42SwWjV)!fxC8$BbGu=I-F^$Sl<`o1*6DoZtsPCtbSJD??n` z(D=al`=I`Py@t1q5)Jt}>XvGlRZ=}WC+Wf4x1@JV9%q$QHFdZ+hCGN<4F6^1nuM4r zlUm5CYpSx3-P?I1<5p$*zLGzi{9Wb-=f=7Y^B83}B(9gAcc>twuHvcT{>$s%+^|pW z$d7JdTvgp?4j4W%Ve}V+Em00$7a8w5_h+Xb47{nmxghmW-aylLPDS0;4p=_Ab?j?H ztD?fy)z+=mALUGb;Fh%Gmg>>f`~jwS9M!=s{d$bvHvY2_`rZPci%dn$_c=e`*WK_> znvr_&WxhU593F5lHhcK0G1G?4>>cRqEV^1Bn!7Q1WYW4@!bhv}UpMZQ)cV)=`E>Y( zv8P51?YrAQPc*kKAm{Mi=xa}}Z%dhz_lGgqadMDXT-u1@v13Nej(zU;P;|7ePfqMz z$yL!c>w~FzTg)4!TSKSBdyP>fW{sTLSK{AOG_kfa(~z|NALjD4d-9hbo8>OGp&!M+ zHfBg-^2n&ZzxWLo{!;U1)?c^NFUMRR`{3-$T=RRbtHOd40>`aObQsaS_f7A2nUmGS zv%a{q?&_P@kEYDaziNI%IzLn%zissTadU?C?{&;mz<y92lD+8OYd36357Vv|uW3qj z6@=RNuNkpw%<ZAwW0rV7X4+~d<T%{lc;jHw_D3@d11zsQT@Ad}r(sClh<gcxqgQ&r zBl<um${(K|dT-9%o@qDocN=d?^8IYliv}(p@?-qBQEPq2NvcgB6`#&ro3c20V8)?> zPxWO&v3f)gdF<%{4RM`4ulYW9sIcrUb;)UacqKJDGq~uIVYS^=FL_U8{|AF!>%XYy z6Ys0yVdfqstFuO?4oR8%#8mjcp+GoQmEHYl?A(FOfX>K0K2Pm886Ao%v*I5$J*>%! zD;a0*FJXPQMn3P4y+c1+_(0EG;c1<!;BH1l%Bd8`tZgNKnQx1?d9RI7^;<b;Ykzr9 z#%sE0gnn>gWv2h51CM6rM3psI>Le$8M)z!r3mkYM?rM0ZXQJH?h69B^K3SV`BBd?! zLW!#-M3U!yBBD6%(}9lt&V`@wJZV>Jd{(T@GNh)a#ATKg|7LCwf9K7H4~=UW7&ky1 zRpxV1yxz2@xH0R8hixgpWvB~I>;4c9^}HCqAueKIM88`R$G!U^j-4+3Hb<Nm`zSwa zU$Kv|0@4b4Xk#x8e0{)#s0F_FC0|;;E{lA&Dm~)S(<j~q>$C~XPwwuanwVSt*7bcH zQSEcb;dFyz`MhVV9xEPKKb=<=X?C+4r<xS{dCahWFJpfU7kF2S|FYPX-+0#R@uIZ5 zS+|SShJOU3+(&g=7X3@#Z(|*Lp7WJDu}z;;&3O4Vb9TnF?1hDL?N(cYqBVGEukmpk zVvP}Le)-ZXZ4+v@yzHB?`%&_fFY>3=&+f2y$@l#&qAJ!mt~zQ*U=Oz+I`vxD5|3w} zKlv@|QeIqb&$ck<@4cOSeAa7rZ)?v-fjP1W+iSXaiq}2;<VkJTnY>{&Z?t^lIMO>R zY<Ta=KDChvL0`+SvdazKO1+;w&zO>F_i}ahuPsqdGre7UgyPRoGb4|8JMEDrDlx4p z&B=*+Y{}UCyr?3jA=mzh$`W!n`t#n)qTUbrNIhEO)V!&B<jb3x<1))~e=LhNofq6v zbPv7|)!I8g`e;audWYme%k8?nf|J?rKFQ6=FVg6g>|EKlfbl&;dS~})>T%4w-m$** z?|Rqb{kbJM+T1<GUuaKtzUI2sKR;q`jAyTDJ)*o<IaarPU#rRgIcIQox93r%AL$FM z!(1==jft?uT#b=Nto3_KYHs_qt~TG0JvpoW*}KKHnyU7l&c}W1!at75i3#etAn;T9 zV5XbFrFebzn#W@^_r6T6{;oM+@{#AR?mK#U_1P9ZAXKT&weQ>TM)@Dlk}|@dyq|lk zT-D$#Uf|iS$F^Q=G5aEWcKg61-EM~^yKMBc+Znr_sGfgTk=Jlr+|4UIEIB5&&s$NA z!S|Idf^6fN(j&QxvyC~vd2Gda%Wb>Go^!(mu?J&+k1P+^;8tyYsXJW!?CH5omz?Un zpR4aQeI;4z<sIJKCpa#z*S&7<D>`hRx@(2YvOP0SW)6O-t{&H%;1KWiW{>GHKCzE` zX+z6A1_;aay9&=|9!ZPJSpNKjDsA(5$D7`fVJ<OIefszMtoseM-Y(6gEZLP^p8jpd zTe+f&OAYtLaxZz<?=dfXyF`@-i`?%C`<qM4R^@(_smglv{Bp(CMybO$-pcSVVg|+Z zi^vUlAipV?W6myr_Iy<KM>+51U9Yk<o)o)z3VRHVG56jTSr(WeOR>JIds<xlY;g9` zr?U&*s@>Ll#%Z!oM3^ahY_HEF9tGCP)7bg?mBk6q^x47Bzbjr-&$Mok>`|@m))rCF zGp@%|zd^E7%-817s<j1cUzEK}E?!b+ZO#-g^+*rQ=<e2IcDG5si{#ryHye-CoGM)Z z;*FQHiwD<rZ<#5HQC$lv>fsRfd$)N$@opQK#pWlKmHBs`|N8Q?5>L&9wl$7!o<q9D zhA#>~8?w<y=Tc{#V3<%|keB#En(tWFLwl}mqT@dGuHd*Z$FPWQ-rjA}eb&c@BNZ(L zPWhdMlPapT2U?$szi>YpkQSO6njbjD^Pco~_MAmr8&uM>ps?`G3WKg+`%THW$``&r z1s8O?8<^<zw#yA$A5(nQuA&VE{}h*2^)fbgY<Fz*_$44Y<lB&C0ew^t9Itf58x)l< z3QhUDiu0<I&DYuCF0r070|dc40xdqf-1|6Pvr5d4HRnne6zNJnuD)UvSmT|qt0Mw6 z!6O5wdhb&NIx1|RSzgxqmyIcYt8{2}Z-Z0&?~;1=zXBG9R)mZQ7_55aRB8<{2iN>q zA}gvWc~*VRnAMTykm2s&UlaU$@Oi&Dk21%bofnKvRf|i!ic8C8)kRr;wf^Z??|#$o z$KVUWZ}>;4GM(02eN1^(2Z|3D-YiM4{?j<2<12}aa*ywg;7>z-50ZHga!q63F~46u zt++FPOW`}^+qAvg1~}~WDD{u;))u@eV5`^rvKG<7rsmq?#SMA;3Ko_Bp&i(I-2S;d z#Ai$3@Sw+jaq5AtUy0VX&NGN=R+gog+$*0_Z*06NJmePSHOfCIV5M)eYNYEJ(YBVE z`b9OfD~*+tYkl-bnm%PL&PP3d^AY)d?>*GxEtiF&cUq?!G&T1ty{pseZ<{u^4HR9K z=D1Jx9_V|}JK5uH7iZz4CU0$d<^1x^mCx$lG`Y0<+TV5?=sD0&>OaKiZ;yd4m4dgM z)@Y(CwPl}FhSaY&Eoi$bddu~M`jX%40atyKR6<uz(Y%(Qbd#zIN^44oRlT8G)$&}l z%x!|_KEIg(4Sut{vSs(}=C-`2jj#N>bXM8istm2Md5c|={De<@;JSbWpAPq5r451+ z%^S4)D-+7zDVNl|rT?&HxJc?|^?V~h9kkkC=Gou%xu9Rue$B|r8>Jnkzf}INNo?9C zyyy0n_o$$cx_uMW;`6=YqW#jA1)4i$mkU=Ejw&swsWlH{tE5*vB|(Oe!6AkIm)xtw zg4P$B_sSm@-7U&0%c`5#m?=ngjrY1A;28W{;AWrhib3{qE%};$6>pSiN~$ViG@Xr% z@Ud&BXNv!cfQP=r)D~B($lQ{z+f+5K?EA9aRdw1gniE8YZr!{m1?~v?7@Qt+eJG4= zR%`oK?k}BRmRdDkcdGfcaDnSdb(?RUU!>1^4~ffX!Vg=X>ZjEvRb8y!R<AVmYpW40 zaXqT)^zP>~+f%9>?z}*7wb@NSx#nKwsA^mN3Ugk2wVi{jvxkFMwU?jgZskGem&}Hy zFkM!Swt7vSO24bYyHh5<>*k`K>%GJ)%;Tu*Xz|6)=?yj7>!{_vRUc^>(X`C=nZp73 zKJ^r@-s*J<y|Ya;tD}2En@(F_TwkY6GTv;ex4tHEmKAyIQCEA!Dr{0;afUUvslQ>b z=8z^-A8OvxJld+W3zSOb+Z8VI2A5jL6uZr~+?Ka3xyHpNX~VJRr1rIJww>JRsf(wZ z+VvM_t0Z1D(Q0j$SUQasQ%1u_Enjqq8LQnlj^0v@bA{tt$q@TW;c<3($EucXP2tT` zT8rD)S|>8sMdKtNI!YZ+h|@(21$ZB1m2|kY9ceYU6?eR8-E1pmorQ<&BE>)3uM&+H zcrf3y8rx&*%g#{iUE4yY5bq*huwOE<!lk17!n4c?TaxveRc?D?U1#;Tm9d8ebA&SC zF2QxdI^kwvIumH?*7<kGC!N1qqix^WQrQMUk?2c1p`BXvi|}`0fN&C{vCi(S>o9ek z?l84qZ(rG2#`YE6uzTBXxkxDbLG(hjPdJPD+?HZJV;yG|b^hG`P5XjQgH0lMOSoB7 zVmC{?RlLZqiYd2_>&)-?tD~%4-!`ay6#g{-Ex~9}mfd{u-;(zvXYIBz#?GR4@AmSx zRc#J!PVMEL?=T;Wj@Y+}?@HPvS>m&z-K=}(gSHv1D_g3Y=d~oYrCDnQWp-D@W{K8e zvSXuUhTRp`)Umrw+Ipw?Skt4XFI&H}<_donZ*dsnc;2zn@qmNDE{m0RY-tH?y4Ij- z&^Nr<5@H=E@^T1sJ|p#UIUrr(WVXjw10Ca9f*Whi4JMVPPxHP`oAA8kg43T;qf5MN zKWVUJ78BBbqUpXR#C*l1u*5ds?K~?Ab^Kep*L9Jbr(34<p`?@P)BaxL0F%lv*$`wt z-F(@qu)FFIEUj{FmF<)_x&GwvI^)(>(D1XV+OXBoXk6KNpkuOVw_}aVbeT#%SGLGy zujF+mx2>}A6Z2W)r^dnNlT9l-KNn4KeBVXuwqG{a?GNV<?bq0DwH7yyu>53VO!EQp zZs#7+JjeMix%i`oJ+k#K!z5eS&s*0u{9-z8j5lqu$Xdo&=ZIn)t~*Ozr@PH`dm-&D z!QYp)MmEea>h(h735!G96K1od-T8)VkZg>s$~D*NfGD=3Pvd4|lWxCmf+5z@)|xBm z=ae8jr99=nMmbUT)aiw=xowRlL~o~=P~QzJX+evd;4P;=<?pKYd+O97?gr^I;pA3# zlTov<uB~=Y{Z0LprtjGojz+n^dZgE3&s`qJ-ToG@>Kxy&NGGpLsu@zZN_U_^VcjX- z;JVj+g=d^sma0UyQzEzaYs}E^t=HDJ*X8MI8|GV&i!CnmlpU%;p1-Q*$j3OWx4Jhj z)koLwu1&3L*ZtmDV$(XjCmZUKu2y^6snTV)B^x^3EMqmlR<Er3yT(qpsc|&>*wJ2* zq^|Rh^4a3~mST&;xlW}8$$fQZrMPCX*12&A8|w6(Vyb7NPm}j|>SkG<Slv->dcXc| z)u)wZ)o*D18h>T$osKK_dVT48#%H!V-!001a@!W8rEYe0MD_1=ora#R?~8=4KX|x$ z@ACP=%ftPk^L*x$#sS(h)#EGGRUUQKhU={wyPsu2UP6DrfJwgnR3lt=30#`aXs%VR zE?ZZAt!9*QSNkBzSj9E3!+s9_H@ru?H#!N~zbzegFDk;zc9d&tJ~fuLUyvj#JiQ(K zv;BR2hpI-p3>0i>T&sz#T3SA>!cueGu&_-bUMIJC?(zNIx3`x{dBQ21ozm#4?Nj|@ z#ZQ&P>h#93?SsU%GL`33pS8X<UZ1-!kscQ$HYe&Y)OuEbR{gB5%wXTTL$un}NtNTJ z^-58FARpmW#QfeYHB7I&SzT50xpsr)la37h>DdAgo#%3|DXN9CM29zRKQ(UDe^6gn zyQ1FTFskWu+i8akSvQYwRChgoR3x~ZvOn3e#5`IvzqYJ)g?6O*omLa`w$mGm2dYYS zj4DUI-?>S2zx|OpMZ2uNzTRCw*^=7&4|BlLUas;`s%E<f%a%IL7d>x3V40>Lt^G;c zp*NeIT6)?dB?)dy_ro6H?jvN=oHyHNS-)tSZ0x2(R4{zgkky)FtF)gZ&6RziysWg7 zM@h5n3#@fbD@^<Kmvx2u2Gi=MM;-a1MCT~kUkX+cC4cC0*Wp7!x3-Oz&ka(2jA64m zrumo7ukGrcU&?}&&lMiB+s>}y!?yFyn@mZ%MC}Hhujx?JAnOA0de^PW4IZc6Ka@X^ z-Vr~wO=`YjY|#F#@zE6-2Q+=#dC*?(GERBSV>a{=@4D1s6eDWcVsz4Otgq7iV@PjU z(Vi;|cU~;-@3BsG%ze6yb=)Kv-5O)=u3w`S>dqR>mdR}|1#wO?*>vR+_kqfxvcb-i zMEBat%)|6swXf?!j1djv+N8oj=Y#U|?#tbW$}^-VB-fc`t!`#_U3R^v_PQ~#d68|u z<X5)|?h@4`k3hu;7oB*P?P_DF-cWbC_PzR2y`phmXR>&|OrqZJmE@V}-ra4X!+Ey3 zsa-FsFRsb1J+D1xHnx3cch2>qhuW)$S9et(`4uOVptfbJF-WtowrAa8Z69+?+b5!h zE=u<y>RIYL?(1ZGoE(JtEhCLe&Dgrs`eePRp|q`7D3O{Kj_RJC5vl_D0q0x7X{{d{ zi|e=7{$BU3PGo6lJs^m7IxeesZ&M9cX%yXEKC@fh9&Z_{f3CTrxuBbFn%Nx2e(W&c zZG>`zdyI0ltl4>p{q;`&rV`_Qoj`X|-`#9zp2_+<>~S5bSg#zaSm@Tn`KaBR&cRJ% zO}+H-x`TSXX@7H_ZI$GGmsFWb@ss?e+g<5%@n^P+%>&JjhKc$t!%6eF=GE4@_IsQ! zxTVT}ke_i|BHbfCVDo9&Vb0TkuPfDenv~7Et$XcDoFimM6sZcGY=ldx_(NNI^Gx$? z{Yags{(^C5<A}~SyB^Zf@+t0j+_efvw^#>Pc1^RR>4vtt{*LCb{+Xq+-PNw#`GNcg zkNv6;kCpOMPG1SmwO%lPsXJT$XMKbAsp&xLH-b@)%iUU(V^mS9Ey^J-_I4NB)eWQd zXX~%lsWj6Je$Dt_2pxQ7BRsxP%hf~N7r0j2hgvr@<r~`TQ)^$ZdrhZmyk|Wue&*6! z8KWvy1$tDteJq)68`iwhctW$J?r@z#_hCbb^%HS|YlX5}wOcJv`O7OD=Cc!<R~ahm zKCN-6&C*P_^yv&2ySg=cob_V8MC!4!pTsLWw>7+>`@7b^=F{3h-K554HaiD5naQKU zQ{gp2mFYG{?A00B&{J1Xd$H!dy6O7UO$F>S$97q(hfzIL-QB&-#m;_W#}3O^+CH`F zn(EqHy6Q%I*5L4le2sdsceuA+HAuE!+^;jqqSxH7Zm!%|{k7(`hKaU7$5o0kUblSr z`9AaPlo{>Ew+ETV)orNstf;IEt)E~K*eV>SxT}5r0;2-w_zrVF?-1H~!ql_&aoNI> zy3+mCUl<>EJd+Gntn@w-us7&-z;n;uE<dp6Eq&@1qp<y=^lH^Z{i!ycy;k<6*IoZ_ z1E2aI_Vjh#AZToqYUWqGD2XmzUn$o8++q;@?AFI?YQV;zy#YPEp14*EN4KQv{;aZ= z_AD){IHXN(*=$$mcFWV^w;^DjU$ttTbP;pAF<DbsSygth+`s0WLD*hn-yo~=8W!++ zpr>E7#}&t~tk*4_^&VAc%KxeOy7n_uQ^yF2MYhnh&Ud;07rtJqY0j5z#g;+!u9b$e zITZtHYmD9<i^Nf~!|D#7>3*3$+Yw{#3!Ixj*IFub${Z>N)yA3L?3g7sx*b)2=G*4? z#Al$#ai@c}9~w4j##N=1-vo{uz>z9;kn24c`8oQ#`AFPnIj*x7S-#XvtF~1tYGSm% zG=$jJImF1*)vJ8Y`yBVYBOfX`*|FVxr@pD`O69KV>6)J{E3N$<2Fr8Qi9V-%W_g`d zPH~E5?>ENk_SZbAimHjxEHL-)IAq`MI$iaFcZ>H%&oV`Krw+Dv^JcxVrm6Bq6<oCG z`;Ot_kKBG#{o_5$=alDM#V&{Mt<M@}=#px$)V!$Mt&eLGuxB0i$>LOLo(j*;-EA(H z?2fgoEE(FEy7bxsnl{7q=3m&|4wv1|xkss8)!(>ByWJ7Dbxv%2hEG>R>mO-08A=-q ztm`HJxP9so;Q6I`xx3M|R=mg>)A+tFw03Lt@!A4iM&nuA`wpvQfhsqz6wmiOdbmZ4 z!#XE79M^qUceJ*tUSho4ypC~j+9IE(n(8@Ly++wCwTfEX63kZ3kF~37ztH%Z8d??$ zRy$3UpY=GS_E1+T%`QFcE$xNoC0b4Gz1sVl38skFLcvt$rHT!z+v-KCYl;l%61%V3 zKQlLJKCk_x_K?QYbgV@pIP5f4;iP`g^L^EIxv#TA^h3L{;az=Ey<Pp=@D7h!mkPgk z9-t`lNL8sljIymxk-~9pdUHR0qo!8ls9#|2(HbgP=X5~+o`<KZo4dDcw9_#m+ZJU> z*S)LhuPrs~ZM@QP5dR_fY*`<rMR`Fn!fm_bB>~g+t68PLq!s8lnZ9eP=;$u$<`nIA zR_?8+k~z7~c04Tnx!tS5&fuvVtyh}&H9J|$MT4Dmt{=%2id(WMmo<_AW_4?*WvyY3 z{zJn#v#$BJ^$q)e(!Dad;yw8kx1XHb>@V4j&6i9&^(*!786^!atzX%q#rs@-Qj{x& z3V&BG$2FoitPw3b^FxD&;ZMZ5zOAvgvvyCN*1L%m-zg+=rOQ3B#n!)NfqAhZN1tkt znN>{@9cE#fQ<iM6@~pB-{;BJD$6mtnHc!hH-G0qcZGYqMjj9fRq1EB4>tBkC?z`Rp zmKQtciqswJ8o~_Iw6`?}btBAgwbn2%9oD)|mCsWwRyfILxjYpww0SnS8B=s&y0iKS z^YP|#YnFYobgTT1@`N%`eoOkEcqluo^&3l+;alxo?J&d0#`&FB?JzSkXJvx>Fy-rR zhaJ{1#jSA-+l@2z2XqR<Czk7NV}%l@BW^lHKlcxnk+K0!ONA5L-)`7qDA1nN$`Jbx zwB2IdBtcSlS-N7Ya*A9iy>GX|8sGA{Ww`MPB>vHIwDom1!2SzI0rn0j<R!Adq^ImN ztohAX%zqj#>cz%~mc6aR*_HNdo#wep<R<x4S-$g9`!8+NS|b`J8z<{4^gGS@EdyCQ z@h0cr+=eR36(^BVwTQNMj%(gyUSufK{h)6(H8+p3Ew*3pJVLfu8Seg6-e3BSU3TZn z=F{dM4P*7a47bb=TfEu9;w92J`B3+C_aH@}v{v+Hhp8ddutGDbev0-hQ+VrUrciR* zWx8S`a-G5MV_dh}2X$68oYS|~_pJX)YcplHCJL@OeCWDQ(Z}PC$4ccv7km3P9oO-v zzVf<_wZk;6#+xnvOpauR>qg~Sm6KYh{Me=0?#<5TMkiyfW@^1uJIyq!HCE8%@X+;! z;(_~0ce(tS(@3Gdt$V|C!-v|Nnq9g<<_)dRf_{$o-4yPpJ^H%eax*%F3tZbjZX9P? zt^Yu0Z`f!V*Tx9s4)<MH`5O00?m04Vr=J8LwM}bSXpGZe)CC!;%*K`}>@M+Pse}Ao z<t*h&S%%ZcqUMg@np#YY41EnhoBW$9+HWy0?Y*3Cxx6n6kUw%=?$}T0*)g}NpZPaK znLfk#XXBv`dy&L3M|#cmO}8}HmC|C#w}L;~H#aIwM*UX?J4<Cto$auFz0+J*cUhEd zkgL`)Srlkp)$(RTu4%pTfYHbDzbLxO@V1pDDw!lpvdo;cNmIsKW@ct)W@ct)rdwua zzGb+@Tjr!8+c8VF(3WgJy`T9qpLVrc@9fN+bEdi^lk`i`4!NaSq0Q3O*2d9cs*S0v z*cAF!WHvd5j6{|&h4IedN$4BaMfX<!QK!)upc=rN*k#%p35U0ZpOVLzN@AXDHGBx` zsePquqjO<zRZCNDz9s!W@`rRpWE8|*5r4@V!E&rPPT-C3@#sud3&0V#F&`rh$-(4- zsDgVco|nCcE~7&vaR*A<Q1cFY0X&YS(TmBq;b6FPq!fEl>@C-+HJXvyZMq@4u%-YG zfdk{0D3o{?6oa3oyK-f5r2K(;2(Hk7&~MN^!``UAq{_tpqlS`s;SNOc=s2!;^1i}| zjMIF=zv5#warF_!z~n&w5+#zANOQzM*NYubL8{K^Sv;cMtX-lRsGcjQMS>k1{X=vh zrjiG!T)uPap|TF@$JgjO>Wblq)IH=|#I<adC{BvR)yQNfO*jrdf|g;mwGXsQ@CE1? z)u)stHl4~P{)9`BbtnrzFWE?03hkx+OaHgdfqT`kqFEx&HjG{%HWE`JAL!#T3GJ*r ziop01tzPTU>{fSCgc9#Km}*AeB`lE`wTxewe5`<w{hIRH9K5ln5Av_llll=mPgjjl z#CLKF^%p-msZ-uWR!i$yPJ0-82(OT@OOV`r>KOTyctTE~2+oqcq?m!6$N$q^(VfHd zkuJ)wNf$qu-VxbGDkArzZP_B>kj$cPgjdwh(l6HTLcb_2sptH2Y8^R|XhdF&2H3Y^ zartc+(HziL*MZtFdS1n*hQu`VDe@q3i(E}r=hr10D#J(!zoo0CV>H!}yNWW&XWX2q zD||7O9ZrkR;T9#2DHoy3v;*`iy@>Zi3ze-?2|hu+C0`Ji$YNA$&XJfT$J9MF|7baF zZ=69+C`+V%^Z!zd$W_F9lBFVi`_wMwE`-r+(GJk=)R>V~ipz<HT+iq-Nw#GHd5Aj2 z&rF?BUBZs*Oa`OA4_+VHrpQkW<B;h3@QM%}o*DIXUy=`%ebJKIBHaPqVLXLwQR1lp zucd#Gs|h_hGRm>%6AEQ@w2Ah;&Y|;ZmLp4*l~ND+p459HH#~y8NX_PFCXXnR>N5Cl z-BaCVd?hkbu`;oMD^DFIWn|5WjgInbQq5J1(QCL%+f_ST(+EM8U6U`l@6l4EpEw*@ zMDOQoCub|nNDI7|F09?9`Jz6iSdl!zzotfz6^Uu2n`#?_fHkTq=zhG6E~d5PU68tp zJ0i)9jw~WH<gn;1re-`Hn5Mdnig=NBGCmv~3r&(e6<2V}sIn1~{1mOt{)|rr!pcs_ zKurvPir>Oqa9_DO@r7GJ7e!x3zfmD(L(G-Dspzf7u=f~`mO~an6XY35k~cHOsY=wp zbVKeyylQHgqO|%6wg<0=N6>0;4f(mmJH9@Xh}Md#sA<fV*t}F9<pXsU><6aBnj>Q& zM7};TotH7&DFywUX~ka^8UTp$I}D*S&<;pF_>{7vtYdOV{0G;Kt;lxZ2F6B;Z2-Aq zmFg*EfR90!RAyxx*}|k4zrvs4u5$DFcQJ=}J#|n%QFRk~1EoWCR5m3cTa}6kJz`n> zWd3bzjc_<I2&f`2u8b>5rB(S--b7Xhc%FD7T#5INuaCD87Kuxev%ygcL5ZuHD@!XJ za*eD9@H=rrSQnojPsTq8*F|S?BQRDzRC+=`rA_g#>@qkCIF~dgii_8TW5QRVfmlfr zMJ)sVBikmID;g?VC_c+a$*fX-^t34bPb?;C#be^|<iEfz*<HCpLCN3Bd&zn5M5<om zywFXcg{b%~@g-RwxCWk(MPx5zqh*+EH+UJCk(!o_B_auXvP`l<@_h15>M`(K;+6oZ z?4&z27hEAbE9)Z@!0Qs4yc#e%`ChCl4iq1YB@=%qHYD2uLu6k02E}Sg>cb}YfVF{= z$t7Z*5Ed$nD<z4ccL`@|E>Iub0IFm+Wv%6X<V$3fq>}I}HB{o=txQD{%f;qmy~NVw z*3@*s49*8%f_Fg&I99@3UzOM!-ILLTTEcjrkhl(SB^>x_peKmP%FEV(Ilx_sN%lMS zE=ebzBo-z2N@)8Lskah<c17wkun}AY%D|t%TZsX<BegGiEip}c$NkA>67N$79s@n# zM{uAt&R}o`cn;{5%1o|Jd`YZNzDaIPo=%RG5ble?4`5Ajsf3bOf@MGnpPqV}?3G-f zyq&y|e4129c=uZp3$#0M8(0mNk||{E!2!TQi3K`WLajfR(Dbz=-a%D~D^OPYtG&cr z{se?1#C&s!DfLT2x@&<hsVB*K$)(8^$sx(Z$sMV?z<#iTtiP<eEK_z5JPWi-HBKH% z^i1?gj7n^mGVhtde6RrA46?vEzyh8H=YpH1@#y5P<b<Rm**Q@vfg~rS&H%f>(z1=R z;_{Vpy*wA31<=Vc2~_+VSH%~{*Ne4M+rbg?eTt6C>&pJh&GMUokWh-@_|EwJ_^fy* zVSnPGR0HrS1FDazOjUv6ptRRVi4S8DZWJfym&8zUeM%)iuN()}gSD_8N>gTop~T+! z0)8IXn|sVX<0}f?Q)LxZ;H^j!xvgFUy--vIZHWo7m+VlcGt-8}dA+b8)kaYRK7iCf zG2{jGOd$Ynaek~JSC5^_9^iJyo{E*h6Utw3Z=@`83qGqdDb@nL#jU)8)iQUO@!Zka z74aibP5A_7kXdLaNnH4jq8BhlXvA%#uTu}`46a$cM)HrW2{Zu7LtmlY5gIz6Pyj#T z%h?Duin>6{xgW8WiAFLQ+KSk*5oiItRY`!q5*K5G*#q<)`V#vqwkmNHRH`1U8FVm~ zLdwBw6#aqif{WcswTmjLA<SXEgLobAD4!r-HIwkeSOs-Cr2)Jw*5=pH6QW(B_2_ln zUST+JTe$$4uCe3uu<Gho%7&mQzU4PExm1`s!7S$mK?@vK+=R=Zv(S%fmukJ-1`HB! z^B9|;Z!<XGUU-&VE4!!~fGoidVz-ed5H3HM<YR}KGtq~UU^I^@jI~M%G7@TveZw=f zW=$>iY{i6B{rFmDaI|W~9cf8RH)wGMxDa}SvD)#vKKN23rmO-I!bx^bbUe9A^0m#_ z6LCo$Pq_x|s$HdnwUg1Ws?T75>2`86x{%yV7Dhj@`-F5*!hvGlwFzxQ{BOjfDh}=v ztgIs1j<iK8&`0?-iBqz#5RNsKcnuHG2y{(8Fm)wfg8dv_AK4N8%nXk=OEpt8QrFT{ z)q3zDm<86!y@~U@K&c|*NPTp-<XdW`)+$JKCw#iDKzkp{ht|pJBtCO|w18+$w2o|K zl)`Snq#A`D)?Sw21D`bu;bF3o;v-fSZ9vfBa*;{Qr}!AarHmqf;}%^lZ3XNIbWpZ3 zQI8)+bs=99e<BWcjPMM=R8`RG+Nh4uw#L4zjNk_W<lND2q?ag&6l3oR$H1Y`M$9hN zMEYr~p>vcgQkn7I%#O%&qCZ)Wig8C0RpoQx?wUusbNa{Hrl?W*PqI>MG<}m)5FZJc zs>}CI)>o`mm%{7mzvvHYpCCqsH4$XJkxk)Kp^?NqYE-NkuuxSA^Xd*62O4d<K1dn4 zQ8chsBd<bFgImL7v{K9tY*5w1Xx)FtH^#qpTagd44B-rYp4cNrdTYazs5<feU~~Ar zCc`k&^jeD10&0z{Vf+S_9WEQJ6EqNY=s+Bj?Sy;btYNhIp6Rttjhq1o#A-*k2h)5n zyng~fv`HM3bI4l#B1_b!vaL5#=n|PS_LiLH|Hre^L;2Q_?P6DC{n68gq_wtVp)G1y zgggfJb0x@wQa0gH(cpkQdN{sIz6M1NZ!BMIEv>NOhq@Cmp6g5Y2weBte3ye+)MjD4 zqBhpv(AqNBI?P-~Hwj*lDq`;w^Znn7wt1fi|4<La2g=2oZN_8PSGF#e;kp8-fARox zJ)G~`U9{O7309};Cq}7S;hjt+ZH&!fxu!j;IwC%xN`<t(Cq)N*^TYo#+mgMY%Xl@@ zerqvXrnwMrq54nkLAyg&eHq?ozJ1{&^EJ5u+K1;EYgqHGP0j7J8&sRbS=5Q(IIp2d z?!&{!n7m{qIHA37&a_Xkm$m$@U7~6xevfVsL_JI0kBY{J9y3={Yt-lUi>!Y;>N!Bm zG<>^47mtzC{eOF|yR*FihHPvZpboOlFx$4k>2{2<Y{CaB*2XH3t9)PFecYYBeZz0r zN5Ed>s-d$DcXn|6GB?IYE5658lXrZd+>PAby+^{0I1p@uT+x5Gtg)xtYniL#enoB^ zjh+uEy*-L@eZ2{sGXOboQX4gGvyPIgT?l?!Syh}wT?(%7&MGSO4J8a*Ff|{Zp`Bss zWbJRQWOCp|%Aevcx^~#;-|ns9&k57a`ebpa0p82l#<Ick)R={LRxMA=W;zoc15bRW zfRpIOlt~O#p20dByyk0`TBb)h4s}VUv-^nJf!RKfe*jT}ZJO+)iecIMpQf(nCx$+n zJ5qjkICGLH7t9QJf^8$$xPd8NRY5adf77_qcu>~^ZJ}5wE@K9feM7f`_reA$JysTw zK?|{#x}Jt|hQZo~$V_=T@f}kwG9tV?REKCnHHZxZT1b)4Q*C|yD_vv!x_Y*JrdX4G z6`4%5BSu9!GjrmDq?6$gaz`^l+fr-Mi0}}3`NSb^0aZXc$@LK}Q!btfJW&ej3z!L4 z;cc<c@CP}Vyv2W^mqiOA4oTvtWqeucu|lO5&~2J|nx*I~=!}dP39b{}Bnm_yP!+i6 z0xw0*ThvBuiDs$h1o{E$BWoiXx!sg6qKLYvHk?oB4X#oRLv~_~G=nh=8Lv7G4ipb@ z73t>D%F*KVLvDe116-y;kz&|?m=e3J4k(r2M`0HCH{FRkMLlB%NOH#M@@vpXqyc8c z`XH5|kW7_q7Q4iJrZ!2p<2hVc!IL_#xDR(m+hRY^r24b!sO)XR9y`bsQjaJL^N~9w zSb@ii=kPFe1=bULirj*l$!{cJ{wUQa@>c|)=CN|27%*I^LTYPn<J<7dSPAuCiWbRM z{Cw(y6i+OSQ1rLh+SE|x1murqjdq-NqUMhJsA7GxAK!zjMj`}Hpj1AWm#DA!tiG@L zR}1Op;x*BUs;NM!_-DFXB$wDpj-U#-O^I`Illr&hoebJ#nr6s)<)zf>SYMhZ*AQjM zSJBd3p*UDRSuJSR>Udo<?QwLqYA~RS-={5+uEbt~irCqUf<;yt4q<++OmEa>X@<d7 zWgCR&%;m^(DRz#NooH)}PJ+s|NF#i%?y&ACehNt{mL=!%UnwwBpWGO^PIrmDO*T^m z;OW>Q+^#*ZX@@wJp`;?#mM#+s5iiJXl#zdtI3d3X&&0msJG2||TWB$;3Fs7#FpDFN ziQ2@Z$TQ}i&|KCYuA|wn<Mmp7f#v|rf;!<lT|i_92M70shf|sHgWwjp8g4PXF+#>0 zS~>De)?PSIuO%i1p9k)Rx<yOG6yQ#{5N~R9nyZ_(>SiK$WOw6-sWRcHf13YxaDQYk zzZ)0=m(*4_y|E0lyfrkyPRUQiPeykKGkp8Jy1+;h;U5B7>K3|5X4*R0`q*gK^i?F{ z<D+*2pNjq}dgmKLH05dnxo|t(ZSzc<&NjvLN7F@FMZ8A647T^?dER?9;S|$8H4$#6 zqs*Ud(`|Q6f~L7rC!VI*-~;dcqVB$`;cZNxWKGDfwV4OnhTBx;J-A&ZPn@Tb@JHVq zZw3Fq;p>bm(NvYM$u;)2p0@5VO~IS1h9{zQPRQWvAqkZ-q4`YHB%`{6dra4Dz3qK0 zq&5qhndnL91w%z<&$*&w!EW@z#7|X!t=6J&EOFGdF3~N4t|ofZ6M}xv4OatC-#`oM zwm3vpOFP)&b9kMfY_xt2TsJwHt{R-+;R^@3kN6W&UW6f7r?WP3<~tADp6h$TKN5GS zDuEtutnjmIt-l4eFmVsc)A_AGor1Hp?T>COG&qr<iU;?2TDcy(ErD6oPzi}sLPuFh z$5>~|s?uMB_9Y-%6FlqL;WBs(flzdiXi^!qV=Zzg@BD338}7ktlh5b{!GAnMTm|kD zf%4P>@rQB_zQbJKvC8?`R^LFtXOi#e$-!NoVy@-xr+$=rD=t?R(>^s{vrllGu^!ep zQ-4VHVRJ)=i>^uYc<z54ttuW@cEX34i|mlIp6!nQ2}~!KGkrp1i}tyex;y%NMN5nI zRpYd$ER<uHv!Sh{-UydYUZi&h|9B?5e!9yBmQvjkr6E8Uw1gb(oHwjHbhV(Si6E60 zyye;Ks_5An2vB<xRiW3~b(XD;s!o~hFMT2OD3M7Uf(Jc^Tys27a2O3HS3_pqXUh|Z z&e_ij>ISLGi?^dlz~MROB0a9)L1t+RQ+LrXwLW%?an!e5#GT5jLggs$pX(Xt)_ALg z|FAQFIqG!%J<ED~!WK43wQR*`At&k$3@g%m`g$|Nt5`{44?eByZK-R2VS8+vt7)y^ z;&-C8gVns9ithP35?#4rfI&T5_r*Naw%a<)SPvT^pBi5p?HByuo$l=tFh_p!Wx((7 zNNrow6^p`RF|<S7vTgCf)QeDW|3#lYxHM8MHVL$;Cu@Did~?iHMgJ9X%O1t2QfETt z{QG^ig0~~pV%5O|FoWMWR<&F)$MvJpM)DE@Ob-gb@h5zBgZ(4d`R_nKcqd-fxYL|w zUa2pKX31UgRn*7O62I2}caVz=iOrKnIi+1?dS!WMUZr1xK(br0Rna%Wbl)g%#X!Bt z*4R$jYh;Q(&C=M`)cV^n8Eqz0OA?Xa{MCxidsh2S5DodK;8mo&VS`oYu-mtpqSzey zmsp#~TK{OzKN1$ADG}#pg3XZ4`W(w_`)S)>roC7<xgicjuLd3!z4tWo$%(<-Ltv|# z(zUU?wei+h#+z8aJU3nx-4R?a<*GxzgT!{OKkyG6(@r$Euzj}X8-HM|JUf0b+CW0W zh@SDjro;~JB``$2UnjF<+h*F9o2F^zD*h5)MS<YHqVAqe-m2jRY&=y_ZPN3Wgng{t zVm_}~r>HADkNyZ$EL!EBRKy2IFeOr#V26IYHNz=7B9=v3N+}m3(TRaNo))gEp1i;q zx_7dvWD&FaoW?Yxt*>sNDk_YN9`a9j-<5DK4+Hb)#mUxik?yp0v-6zug0;MEoobm> z?K&SA;^`*sWPjjq`cQHJ{6<&Ndf9Q_@yBvT+d(x)oJx^_+n!6VX&yc>h3+Ta>T-0O ztc{)NPSCnm>r{;vk5Z$9U5o0vpLimHI5i>RR;|>ovHWz*aVD&vb={yYiJJ7S;G`m_ zyQ9Yv_!2EE9#Qtj_nRj=?m1QV6NV>hU#dS#ht3qOa@BC(^$m$!kJnOwnmMLp_G!+} z_Q}Rvq&j$yYeQU?1kf=z<m*oEjSZ6@#KxLV*?T%=cA0S=0)pSU8^m}Y;_2wA=dT>$ zV@>2Jw%Pd5w!l%x*4B`%UIdKch7m1&4$pB9?Qa{cEwoph#U2?C+NwATt#SP_wG#Nv z{tAEgzICtg0D(o(;{vE$C(R>Z10CJ1mGx)guBp-N$?$XU6ZdG(OMiuEQ{lW~hUTs5 zlHK9lZJTHKuC5Mbv!}vCylVG2_hFw%mW$t(pTX*xX4u<0E7}JcUDCT8;OxX!$)c@$ zmhUUc$41F(VAqYb&FfIu7aBXFdEheMK`!;(cCU9=_mw8g#h%LkLq{18+crAR*(w-u z^Z_`TPZ5KBC)|hKb9`IK<FUr_)>yvLX!kpUwm!zv=v}Zq|CBKJ+PJH_MX!ad7b9iq zSdOuR9d#=0gN^CvC9o$?5Pf_b-TmC0H;>5Wx5->+zHy{|v~z;}rm+Y5A2^Or5W{^J z-22_Fd?iUVwpF$bt!$iZ8|Ij6%QqZE8iG2WCZ72gdfs@R`QJtk#y`jhWAltoTYtOX zV$#2a=cd-Nh2f6AbDjf5<%0XDec~-;M6<%Q+-9_U%|o?&RTUFc>1v@;-ZamVqT9hI z^thx3p04}XQo-S|XPXb;y_EZer_mDu-ZR_1vM3q+i}{|M3yZpS){0Kp`NvX0+d!Eg zKNFei&v&12>5DwUK}@AoE<9Wxu^w^mb8fLR+L*G3a5xh78Qc#Ft9i->KhW=zd*Rah zC)S<LS5DmaN@s*Niua;t{dL_P3x~NIOFKC;Spg<>`>g|<%bcIBXLae&E3q6^HE`E` zp>VgmeSoHFB<H}(_0w&m)7GRdwmr~oR9z6RMo#*=x#kz_cWw9Yqgp2w>aB*jy+N^Q z#X37$8dgBBg<KN#)+wl)x1~Vmdmc?sj!_RVs+?1bKPrB}ImtK@?j*A0m7-<&U2{+5 zcl5T8BFX1!ohipzC8KJ_0Viiz3zZX&69YZt@~-?jl<)U0rLLrQqfg9r(oLDmGnzVs zdQdevmJBhjZn@E%PWdH${pk#FoaVIkQ!#Ui9~m-dHT?(0FRn>&RAHSzV{<y>Z}vHv zEZJ$?U~iGpJL`02E$3?;Ex*GGep>;WvoSj-Z-Z|%vqx4&yUKnt<64%k#Cd0JeFMcW zRu+H@zGi1+*UNkA-A}XN2YiV=FT+-Hdx_R*K7C5Do!b=XUf{`AWy|vxdArj`z@fO( zz9^$0Yhj6oY5DqyVga`*u(Y6K&f@IRd9S>CX$HKHx3RCtIFe;5@y)qSe@D@U>lJ8N zpvdW;JwGq%y-3SsLHwc}$#j<NBF#gtkIB!mia@u5**S)sKKX^dz07f01gC9JiytiE z%2?*8saqzW!xjs;3U>b4^G7V`8#v3>k*l?vY#)kcWfm*`-sZ-i%cihz0(uG4Va;3R zdK>(YE0h=0rmUCJ&llg9KEZld;|BfA*}!Pmr@Y4bN8Q^))p=GP#J5>(>0Gg|X<seJ zH8W*A8w&1q-^+iV|Jl7P^o{#V{zB8tlIv6z>zek~qQoo9alU^zt4LM2yx@cTQg9f% z0&I?1%xTV7>6g;3Tf1xTD=x-f6Xm^|3Rf4jcb^W#=|Ji{^3FKk@iM)6`c2y|T}pX2 zK9Zd2-BH-6;DYP5KTZ`TKd4(6J2-5`WW_$&^Yrzg!$JYs$@`<AUjFSu%s-Dhm;9=p zWSrw@RIF+-y`!9A4HOniL?(M*6%ct13pe;mQ0pWt%~9hE$NXXyiaoVI&{u=r3hg75 zcW+^KzRs25A5X1L?o_Lc1@>v_<<h^|eoOwPydaO5eN|ndg1PQ}fh+W!R2ig_af|(U z8t+_UJ)>Q$JRSc<cJ{q=Jt-XP*%Lg+Gy`@ajf`FGrZlaylVu>@Rq-x1mmKSB?q1+( zQZzW!h&={)ksZdf_E~9boi8mraEqcsY(KHUJI9qQbQH}EEo3R6JbK&s*nTkWm9w~2 zsokcS_kXlz(Z#}y!q%SLV0*R<co1!6YUhB{O=+X7eYI}I<JiAMGcQxvp|HPXQJ(bz zqtVKy%8v7C!<=(0y>U@)jg2KLc&oaE!X-uB!&kZ1vi{gw6KmI}t#k}9Yc;QAO?Z@O z>^<r_?5gNx!+m%`X42F)uXKz~+vX@^K8_WawdTHukfK9{?!u=<1>ueS0QnA0j=86V z*IDgEExk3HWHY$up=%zrux4Rq(co}NULzstZkkIwOQp|q*0fyKBxHqLxv;vZQ(@mi zQ&GA!k8!dM*b`GNN1rsWlq1pM8pYyRjJW3A>{7ZMMO#9T*&g6pl$X|{ZCX9&2Fq@I zl;Tn>o&4n8;CfuR!SguyiJ1>5P@mE1@TMu#7Fv&Mhbeo;o07}C$-)waes@~1Eb}fk z1es@aIL4;ur%ku5(Uny(@ss3M@5RDZ1*O~_0z>Ka)F(A=d~ffOUM0P`{gHkpR9)N_ zQTg^4$_fU!2KxI`jwB6FGpw-pNuQK{#9rG_28I&zq91&vT}=zRxYGR^>T}{WtT*WF z1!?m14w6{B9QKGqqVIe)T+Is_xRic~awk0SPQyq0`Sg?NckFcxGWe`WMymQ|70%CJ zQ8?bWHF`E7!h&IeV|TG<#r`-d7|+7$L_G4@d!t~cgp;b`9T3?gmV##+MmfOZM~fTN z_L@o{Et4;z6@14F61i*gs}>C-9|#K|n_+@uTJeb)8R>7$9nf;A@|4SaK7aY2Yza4J zCz$v^=#*i(^G^noxun<=%Rgvl>Y0Qadzd#R=i#4it`_0x@rIDgU`o5431%HGo@af6 zMN+M(!QTCOvK;-N3x$<K&11z>O2ZoGoJ?6(Uh)36shST!2YQ&VPk!edE~i`Jwctbk zl=7N>rt@;<oUExCdA3)Y0>D5=ydU!JXZOsxP|zrNju(}E4c*dCmFQp6npw~OUb7r% zMSU#VoV)+`_UxGjn}YpfIjUC1(&<gIu9U2qnPp$8$pqrj3q?zE*Z!W7-L{~AuzKvR zs=iT~uF9HRlFcA&<1}ReD^*w&%59w8F$XAo7;F$*qk3i7oA$g!=aOGC?%676B(2lv zj-tc4Kz6O1iqgA0j*+UQVSn0@5~WH$&3J4pt$Ca}9$iv&AQ#MTm{Y&7Ug%@Y0o660 zPwQ4<UKUXtuwBRArK(aRyr=R^IgS1RuEU{Mu~Vv9hBwYdnO90=7H?q9#FnS(Q=h#v z@`W7FpEj=Jp_8%ks_KTL&gGfz5=)CeupY-grm9dAy<hS==M4N4DI5_R5v#7MY#^N# zO8m&$l5yHrOCtjys;J1HTROXGPMJb1v^aKDb<xl)ty2ju>s1D2TcW82=&3hFA9AZ@ zkIU&&SSfTMc1v~1P&qBV#Gb4+8Jlb~H5-9r(oCD?^~$cF<0{w@%;O7{+4^bDEt!3? zhGvj9Ej|*wNB`{`l%JWiE$2Z298Bj+EBojhIQL~P%36~F+vRu$*n)QW!g=qr$LG8( zs1j_#*H@0!w{h;u9G5jA!)q(hD8UAF1z%deHRowgsltuH-TW-&9DOzC#LR|S%`;xv z-e`h=lg51Nd`-@c9JFwJa6UgyIZ1DGw#qbRX){*Xwrg^M;xyrXo9D`YnKP=;5Skp@ zrMh5flh&Zbj;x~M=cF}7Q|+TGixRnqviTg$RV;ii{sy{i^r!VLQ9Y|x@eh^?D3t6L zdFr{8o6Oedo_B|cUZPDs*Q8JXkf|=QHytvsQoj=~k=H$N-tL@&+`FDqk@X23!kNf4 zTV`HH<+RPl=5RuoMV2qBo8Kq*d44l56uptytwu~wov(_oFOE6$4W;1WV&_PI@5X}t zc|Qu0-cnL)11k&~HrRiq_bc|+F~itHEhfyA&aZL(o4>pe_dSU85gS1PT^HNQwD##K zdzSH#`bP2(b;94r^*w)1A?$k;=`L1-BD(3e_i267zuE5?Aa!PP8MVPb+U3fhS%~@~ zk(XjFbV-lfGt&p8pSRC9T!v34gs91{aP7>mTlm(yHd03%4Q<hPw_lJDkZm2m4Bz0V zi853Ze};s_>|W^d9*DFQyFrch?`@gsd(sp3n}&DrlSFxHoPW1#Y(YiWd0+MDMzJ3B zM(40KPTP{^k}@RC;ERcgl-J+E-J`IE`<lNP)gZA3I-*--?dkm6S;5v{uZA}#mQalX zPuy1vC%C`(%TXDLMo<-9$a2SFb-JuG^nb%UB&>F);0%w<HOf85FGc0zR@Hg!YRgDR zuH%z+gWdxdORZyihUOJLah-Bk^8Xi^B&<<hz~7lIjvPnGDq%I%+fyhT3f1r~c31Zd z@o$g3jo(tlH2uuk_CJoQwsgZx^|lnn{2OA5n!7VRWBh9(N8<|=H#OCzXKZzrwWk?J zA-#Zh?AB2GqE@aVS83mT@=q)w-=<k$zToJdR@O1jbRTUCo@D!nc6#a*{##hV`;eFu z<K)jZSIs$&U1<v(Pfax>VckWXGW^qnNS<zFk(NMW&*k?uFU_Q5VOkBxcvB(z2prCp z4c94JR(P!NQc-Cl!QYfW(fl$)&aG*GIU1Xepj*I^+@SELqP#-7u&}5caf2@}mvZ0c zT*tw*iH?n?7wA;56jxQUaJt60Mtc_%FZiVFG4{(e&@nIVup?+{kLhJcx!&Q$MS9mn z*DUWv0*b-%QCJhx75g)%Xy0w>j&+blxNG5uMX;;BYpnM-(KohAZqv9;5&JIZE_<3O z2gPJC4-sX&<6W~{UAzkkAT~s9)C5dw$3^EN`%~j^bT@d3^M*TnZ@X@~W_ULeQNF4? zfbpg_j+FC@J>7I(ipBon0Ajv3>f&9Oy+?^pd|0*(TV?uWzvg^kH<&h{JHQiMAUxa~ zag}hB-W*9rRxRIxO)}lL-*Eo6cQyS%KY^FI&*2VUzpIkl;!7u+#wyBJV>L|O?0-3j z+8N_%^o<k&>xfm}4EHE^AKz3dCY&eVfhCL~+d;<(TVrDl^fZ{_Hb@a)anE2+b$?m} zi64@$$8H;&+qT;$STREt1O`bCCTshf6zwi*6nGJ76Q3%NpzjRLtj8pdPIvuL^#ef7 zA0;~k4tiC-wZY5LWARq<VW?ZLvy8W%Hb2t!QeOe8@df100O~vHs~ze_r3*vl4C2(c zGQY7@Gw;=1R8Iz#vHg+EV0~XV-{#=K=*l=LyNa;7H1knQ8?#P725BqfVjH5LgNuBn zeL~=5q;2dnct+h+_r$c<GR53W{}W+lU*dD9JE4~Tqdqj)HFA}wfM4)3Dc9S^(#Jen zFCsR1BL09fhmZIpzLvq>kx~2<U@%-!D;TR;W|^<*d!bY1odu4n6MpOe%Re>PA@UcW z0feEG_&#GX%RzHO{}>I+uL|YpX5kxt!e<F`WC8auH4CbQS2n&k?=w#@?7?D+=VB(q zg%yE6zPo{bB+7kEo=|Pk+&3&S&oQr;+W#I`9!V(Ki^RA<fp1jcH8Gm4npCKwSQA5I z^KkQ8gH_{GLdjWdC6WvD@^1+2CV1v#V!84JR?{%TeAY}FHfY+ZS|<;%)yTI2$X_i` zm6*wB5)nl$Ol8<+u3<T6?1TeQZc<>okPia+K1QlZ8JH8|dc_a)mVSu2riC=V!M8yp zQ=_<@<om!q-v$4+@Oyf+*hz5|U8k=qwJLsTe1@NdmZes4*U0R^W#8ZaE#X3XtGHdk zqdz5FadnH^cnhBnwMaGOI+8;JjeRZseZnp}U$iS1V)YG2%@r*tj05pf5S+rf%4Fw2 zSzj@KmGFNwC5}~EHHdMp<+lYg4ZvThrYEPd$B3W)f4!f5T<8>?Esj?<(u^|dtOu;$ zO*(BYXj!rZ>mXYDTX+ZgHio*<r^T+yCYn9Qh1SZp3Faf(+t3%u;$8Ta?{*R49TS>M zhsE{Ep_(1WPFB|1!+cu%0Q#1!%)Sb5_O&mXF0siP(Z!_<`$&9;$!?os8*Lt_Z3Fd4 z9%3qoIqxk`PSF&pb{Z2WsFd1k<`wqu_H`DOt^;&0af-HtvWrf-eV+4y{?vQ%q-wX6 z-P-A}JHJ>n^(vT5G^R@i4|vA7e!GAB|BG%DpQx0&y4LAVdD=nSIel|DJCRK-3Vd|$ zC@kR~=YJk`i!Gq7y4%)|&bnz2CI8V0{x9)@njU!T-cnf7J<`7~x>ICT{dMcD2c1yb zZrde&cbHBH)aiiS^Rlq7l%+3<{ub3xbzN&~7v~vg4clma9XOH5qJ4qR9?Ui0z21K` zx=SolmC{wSHjpfu+2-np!#$GQ=r+Ms9*wJk8}~;e&xLf=A+622*qN2~(}o$|NICec z^i(Ma-^sPaUC$qm>=524|I!|@RB~dHr?VIy!@ZL&=wE?a9;55BJ4c$wVezu+hc;!Y z=)C7#V0)~e3P%#psHTAx?g53F?!(fpzf@v6bV7I1dces#*VyjqSHiWEW$3+uv+i1j zr(8L{veB+$u4=Guul1BumG-yotNtpyE%}CCF3qEnYmB?3|5s#&ut&+_gDr0zo1BYn zIzwG`htyGKY-n#0=L)(<_#Z@~@qZNw&1f?u@c_5mmKzGyAW)UP8ah(+!S%PB^>vdx z-DbsSO*b>*XzaXhdtzvX%m5CtX!v{4FR2!A#}_7x$JL5qnwaUcy@@kya~e-0za<`5 zU#U%HwriMsh3_8{h;#BzngY{5_Oi}zHq>|!c@J=G@36rOxlg)3`xsIe56bIn9++m@ zA2<fv4jQ^5_khyet?)|kTsPv$^p}g2ihq?yv0f(BKFU$rw#6_3aRco+SNNUxKPf-j z%wI90i{Fv^v5_Xdy`3Xwon#n@6asxYA^gMp!rjW#-QO+JD4s8uX{MVh*ylM)*`^z6 zA_sstyEZ(|JJl`s*!<NZJ>zv18#NB|7rVx}*Y?IR895F7%UZ(Eq}oUq>0R!TtmM}> zYo?gzJ3P*L_Dx0*#XwN<$!Ciuxbj?4uZipw8!bmQoT<3uoAZ;sg^5MeWeATG6TDg} zb18an5S#hVvYY5pBWRC1>e;QPUYID8D$L{|-%s~G$znNCf&T}Tqu&f=ZA~4YY@%@t zR$G2f%G3Au@AWkHboWgn{^9IkH>9@Vob|VTq3ykK8Ma$qC%!M@_9I1mJ%@cqC5tb> zGxa$AGmFEH+0Ga@VQ=KS<7J`;1HX!T7nSwXgp2zI>{G*flf`KJV3}jshgOp+8*`(b zgKxYuq{>EsoWrv~8+8v|RdX#XWO=ODp)uL!xG!o5z4c9${KtsMHU1Cq0p6|cY-(c3 zGMCqfke2dl!ZS)Ho&7ES*Mnyx^Y|t}96FBoF!nQ#G9A;MLk3CS;W%B6U;`rqTSB#? zXLupi5<0A@WN2yHWvr<?gdCMu5t}mKiMzpO!BOEa(I_wVEmR3u4}Cx5ZNpM+4P?7~ zzW9yVK=ulq44w{~snW4n>XGU^7Sa_M8XD5HoO+e~Zwb%xoxB$+9)gG(lsQ(Ax}@5M zz1BT7*bVvkC3P?PVX+-sKB5ax4s|7_Qgve9)JfG!?56IFL1Fle?@~MEEyMuhCuQMX zp)*93dLNqwq(Q&1-@2WKC;A0=9rZ0)k#L+jPu>Z23@s&66c+yqY=YWqs_EYue(J~I z3iW*1d0`AQm0T5ahMEvJsBf{Sz%gi}=7_$vvASWKWYJmHNeIvhqI!r5wjlB-Ya9SS zL;q;L>lYb^8P4G;xV%g)Y^4to?%=avJwl|0#Aky2r7CYJ!)fDe!)ZJRCc%gCI&=+U zQm}W>FL5V3#216B;N|#cgTeIHkcTsH5IhslqDv9Ig4Ker!gr~5@pV$g=>WdhpfcSw zJj5TsXTce9Ic*~b1qTN0gp)oWF9dVp=lFT4Rlruma(o%Q0BjxqN-2ox!BxSAM0NUU zJPvx{JNS0PALCTRbbLL009+I|(Y1;B!Ja`^_$Adjz6M+eufdNRs+c%~U0XxlP=*Ri z>BYq1V7uV@Fiv%itp#pDoMyaXxM{PI(UwC>$)5{;sbbwFcrOqMZHVUaW}pppSu@zM z-1N~nM0Wu>EH5cmXC4#dgXaQwLye;A`2SMr&@N3U!z|NV<9OXm<f**5Sc^GMv<hws zTnlxGp5qn3An2WDmSLAE$2eHG5g9Ho5JL1+qEv8I;C*OU)D~L<1fj0@Z^J9oZ(}`O zZ^R^@B}}4|;Xi>ff!Cqa(Z;ds00Q^LJ%%Dv+}K4oRod&fB}7yiA|99&I2jre{lhl{ z)<PdO;|yC(g~naFVrVVJQ}Har5%YrU0{uc)BHuVgs=Mkvc3EHBBpOTT5p1+FD+zPz zh%t0DKm~u14_GR(QrQL@sxN1%X<DbBi#<_JOm^g&Mrwv`1>_+Yd5S%nFe(FREq$h` zvT3dUZ%j~bPPXDQBY0?a;6?Bbd6$hQmMI5dNAz1w2TZ^8k1<9$JV~+p$w9$aesxem z+SqxCZpw{VCBty@X7gLaNzFehGFgpVLNb9W{w{$AL_g-Yn5$@s=?p8)Df3igPka!x zB6Xh&koKU$@Ae-LpQH_<Q*lwcD~*sC$q$S!JPmFMjNxZR<^(JF-}$?T|Du-*OXa1} ze)^W?Iu?^j;_t)nfIR+rWOXp+8{)qfnoWI)GqSfxHGNO>M$17Ht*xW(3U-KL(LKRJ zUmgFfP)TY^e2r`<@<FFE54G$x!MbtkJ>bFEc<D%J>0jf&80tc8i*J#&L-y%Tnm(HY z#^G8Y+!S0G+Z~-13iw+FW`~`0LxGeHL6+;LniiQS8=vBJ;Vr-?ULIA4uK1e;_J;@2 zmxcZE%4kbHXwESoGG4-eKwK(|?-!XB?BFji$!$HPON*Fd4Z2!i#VohnGM>b*Krd4q zS35Ew*wkM)5D0&vtBAN_B|1+JnO~dt8Xw>Zs4_5|KNtBgxW(TqP!PUJgW^+pNwk#y zi|ML)gYkxBQ41K#{~dV{T;^{Z_!+)MJH(`X0lHP+#H_LWF#2%}HUmmtDK)XV<2&dd z5uQ(%6uT)@SUm$}zGCTNs-(5SQkNv|CHX9{#5d00EIgSmFAh-{vDSu!`MSguucNI3 zmjiHK7Lf-Z`wsd0hX>P90aIL-;*W#oE|#R!Fwz0n0ow2rB0GX3rLXTGbj)b6tYRoy zRe#u2#{9{^YPvulQv-M|vLLil;&^9~Z<v3iuOCNd=}sFh67Q*!#PR)<dd;7W_6&~= zHV<7S<*bB|laE2(YtxJmjo0<9G$o*lK>3)GIv(C0tP~neo@ZK#1LYcIr`BZ5GgA7~ znv>8|;6`i!^-p+N5D3}HhRlCbqrms-ky^n(7%LihO$Z7BA7b;Uobc8l6-3D<%roJW zY`eO)_PgPsk<tIw5Ks#6#MV)s@X26$r~x^Z0mMxCFLgKVe}*&0clraGYfv`eja{TN zq!YDsXaKpCVFW>TPVLYxH*_)1(ht(?kw&Q;FGb%a_Jn|Nfc(zL#D}t)>Lqxd{=Pxf ziC7Ql8_+&JhBlIDcyoAuqzl_i%$DJ5172It>g(tRV<FW6pmqEty@XsB))Dc@bN0Gu zmzP$jG%4L-{ax)Nbcm`gP+GD$Ll%S=6GNiqxMGPZ^3Lj*=AEvIzM8fy`a*dzbyPxj z-X{Md6r_a;a`zG+<crj-X1(q|-5Gp6lCCtSYQ}2OPska>Qt}>kj31xur+BSSXgcc# z=&U%QUai=ae9be|HF6K}flQ+l{5^@wp+qw9u9DgXt+}UeuNam5msira$h8u;B}TpF z*CyvG3e+mRv&2X$j)&As6+4o7yj~h*9dVNULha$ZBwHwMt0R(f$0A)fyaw`15lW`V zYS4M)A>s)6h+4r{PKxqg>YW-)*HhO6?~mA(EmEsu8)zi5pO{NdmH0w05;x^l)GIU^ z-3Z-0`~WgkIVW`{c7aZdEGBA^#i{FD=R{NaFSwTm(yi4!!h^_V<+~IY%cW~ZHW8Ib zPqZudOMEQr0KdmhYKQ9n;62fH5(aEre42#L`bspG7$I72fS4vb0#(7%B<%17yg#~K z1%mB_3ha>R6mpM*0sDsy35P%<bO=3zU)OHJN1@MDoxlsi4)#{`2zi{m6<xy46|~@9 zRTp$7en@*8|BViY3c%8$hkYNNO*SOUMBPj{egJ5uDv7SeNo`f_cuaui$_|NTxEIlC z<Tv6-q!H6G-T<hiYJvX27wW!f<Jd&_h3vdYu`{9{hyg_T2u)Xs{{=Kx?LfO|3w2q# zI+}Ixb=f@e3R@<+h_DbmnN8P^j|TRtBIr?V8GR33N6i9wrL3CRkNq!FmxzREGD?q* z9|gWi$lg5d5dCyr3r$bBrwkNJvAZJ(@gp21L1sz(5kRY2VIhf^G+NhKvS=qGgiQ8` zWbrusfy}3e#*Y96s@52z?WgapE2n7$*OnCu4)$=wO8CN>h?SWiKMUlks$d_qt@Xon z^)+4LzA{{_!5)pE#D{Q*M43$z%kP(}81_(GPG3cbYHGo)WpSZAdn?k4NGGaB>N7Xv zML<eb9y_58=zeOCV^5(%@U>8v^+(naGl`>-vkW8{Koz9NW@*pqR%q*E-JyBlJZYwm zsGkTDWugt(HNpT8fqtNvHcirPIghfcKHz+z5?eo7i|kA8itb>a35z7;_zm;{eoy+g zW6%ex>fl15H#;TTpPWD*jUHy-3Ufd~bwJ|Aoz^bJC!@bqy}^UR6n0Ux57~p98Xd@P z5PE`1)pL}?^*T3x5oJ_^z_rr5n4%FvMb?hiVwVYH!7PYGOKF?xGPDd@5gH8k6A0!* zWFxVG_z_XClZ6@J0H_<bQM+B&O6x-vP<^nT@QS$=IYK-qkZ3x)K$s5Jl@RQ0q@A3l zeT@cGwZOiDo=uBlWLa`_bP{_?7!Asx+vt1zo%R4e8~vzi2W}Pyurs4GrJejTdY5$z zt3bDEG&(`j<jKNObib-I_)NIV=0qQn|B_7fH=8HS0twYTbUZF0Rq;yb7FCw?wkOyx z(TC&<G8lc&eicT7IjZI8PJElTKVAjhpt6CBgt6@Q=rJ;vbWl;26*hsKYNqsSSfuTQ zThOs80hlOEU@t|Vkx{ZTmBIZbUI0U?c4%4LsLj(nKq{)f0waZ$Y<^S|=@vOiZQ?eF zA<zm<M4RFY?P1L{i4|}k7$B@?>1c__@W=^jIX6xGC4Jj=s2u->AJnWwWU3oLH(?_S zQ8gliBAcl>5|-5i;*v#5^Aum88H#w7mw{2jS=LBZk)ClwIzMiRMp<=eIGWHL!s}>6 z^=M@!KrSp~OHu12;MW9tG(Sk<4QzuJp?@@;@Y~oZb)Mp3>S(+!Tax-2Sraue))=2K z$e%*f(Y>1Anljj9xVEBNs%N}5JD6%HalsBThhn3Wo#ii}CTK&=D9v?rB5YDLOG$SU z_8E09I+qfdhq1OvgM1eB9l4JcVolKuI3*vR`W&a&-gIXwLe*mPV}p`$Ss7>+G99~* zH9_manTi!DKq$pcq3ct3DL=C)=1MG-JytbDreP$uAH5D=Rg?gB346E`bOmY-wUGJ2 zqY`T*O_itajiqbs*aG!AWeISSSe}p2)u__ce{_h`iRXaoN{jjhnv2!P!s_;_Jg{9t z8#~XOp+-=@=_lMpp(L<fF$zvYyJ26@i|V?n6u34qFs5P+^cSi%Q<9g9LxJ;(0dN9I z!=|An)z_7Wz=jDt_Kwlew8V`Y#*Y#GKnJB<y$+p?okAO_w=2tm`^5!(du9nWK|%=E z;CqNsV3x9-+J$CgFt%C!T{#kbDemNZF|(*vR30sIn7AAWNf_d(=wj>xx<;*3y#o6t z>ctXF8vTQ+%EY+Wf*xq3_zsOg=AZ$j0KTmJ7rc^)#KNqOxl7B~1AH;DBv47Q6UtS8 zL|RK6Jh`#~I4bcYCgTP(e=#%IBtJ{+4^&gEf_|v)Bk4#6tW$OZ2PIy_Xto`rXL_@R z(oCi9xQfBh9rY8W4Kf5Cth@z&PLz+=<0dmGlg`fN9|?<7ZRCelu(|>gQg?$lD~+-t z$-H=sE5%-C{$@|{2ZXYze`TU_IDA~aNF9SlDvQgOCpAJVeiMtcIc$*67V4%h$?}v< z;nC`b>Yq?=B`h14<l|1h8T*(y#y;h9g$=0&@)@eHunPHCT@s$I)X91!|B1ik@|c!P z2HTfkBh*R3@+Hzd8X|IJ0(?nXN8%HP;v!d^-NB4um+)JJ5~&w5hw3;SQoojFdRy6B zb}QLYn7}V!{mcjUE5Ao@C5OvaDBnN=9E0yebCs)Q4O5&@Gd6~Mz_#PS*a6{2k_6+5 zUeGT11bhJ6ulyuCnwlrxkG<f2v1#0Do`{Qy#$X>sM0Fa@P&a{Fs@BPS0krrtwt*YY z&SRf))_ASNbD+JV0aRZ7OI=;v66&J3BU!A7dDuD3ROTnUFh+^5fZd8e5Q^MEa?}^0 zMT*nFA(7zAuvh6<^f0zTj1fzLZIusT64`*RM>64~iYb6ztj14aoOB0T!P;WB#3XR7 zG7kpOL+Am-3eQxu1Q4+SKaMfeQ)tNt#5yGAf%7FU*K4E|S_}CCO;t>j*j^WTkvT;d z(I?oou}X;=V7js;Tm?CUTv3mNiYvMSQ$#^pu};hyra0${%}VqH6-qT6QBOuDsvXcb zxe;g}@vOSCHJLrk0ErLgO?(CyD96Kfk$uQibx5^PzCU$cXvjZiuF!Rv`rPn%tK=kE zS5<$t32lgeRa>CZ@_H#q7|i{oe^LwRlPnUio4g?ls;VJL)QRmx4nce5+SH+VHrs-( zLH(dI*_$zSa+B<hsut21+k}-s>%estms8b+F5CvX8}*qAGc9Ao6CXjnYJ>V3S_$Kj z9`I>JKOijNd=CbtJJV@w-B{Vg0I;v}82l2Mfv!T*q%}PZtPx-GA!Z4Ei=M*viAe(R zU`gdPcqh^f9gd{KZxla)E8=H9kLg8^mR3E?|04+~W+<=1Ml=`IqMxOm+6`pIm}Ft1 zbEu9?72Ync2WW|R))DQGokP2*?<!}5N$DATnQzo%$)XWoQQQwe%Fpl!v>&z)ZK6J) ztPP$P*YabT`_xNn1#_CeD^>wlD9flfp}nzDXf|w79spo5$Ys;Lse{yEMjmUI2!Xv+ z0d;BY0yYxe03Vjl%XPv;ZZ=(l+Dx5dGGdDpRb_`%<&loknL80(2QOC;so}yHZWG-~ zI&<GL)nf}1PT4e7p*oCq$8fYQJVX&lZ4&<DEX+%)99@lF6FZs^LAz?2dJ*bE_akno zw#4;&Dk%5?OgVZ3J&(N-yDZHkqO7g{3*CTrMIJ$w6iVQOP@dn%%%pSZ7i=`<O-MOH zRaJEfbR*gaIS0{lsf&}qapRe8^hf$9n;EZ?oFN+{eYsKSS+p~<47w~In`$5&<I<R7 z^fy|^jfhW3-jrQay;Ltp&!BaXk<j1r0jYArF0MRNL$W}*CGjK49N9z3Vh*|mwMksQ zDe?xX^1?~38q=P(GX1!F@t?`caw`NP%h7S@WA$4VCzB$DctcLljG_B5&$*$(;gn0h z7ix#>N4uay)OM9#mYWb_pII-xgDzn9@m<8(z-k2qFGLogUy&>DXytgYd178{C!3_h z^eDD+tU%fwUlm%oF``9#AywhHqAXZ1aU}+FtC+crhdmIhoIt^wis#UK^%CTn`T=xJ zfr6c-Q6_Q}^OLE~eU8;nFu*p&ap_E6Af1Jmp$&>(fHUzRR*`$nd}i8kd~8Xg7sxA; z5RBYFeyI0BeH5#JlVYRTEA}wsX4Y~&<DtY`aD;T;qR3)onYtDfk^hgQYYww3dD@M0 z`drM!wr$(V#I~JmY;KZ?ZQI${ww-Kj+sV${dk<P){k~`ZoO&A7Rc}?jeQsA?)K9>x zoRNRSc_Z=m1FyL<NnbOyZ>#^8|C4VE8%aOw(PF+k+#VNs5gF^`;6nikGni|v?EWGC zp}zX8A^ombiL35e`&J~oeZlF(m#HxJn?vBG#)AHwKG!tp5g6mJd&&MCX<>WLM*ddi zCz;Hl)^nffe{bzEZ;>^6thnKRvGdrw?I!Lc{#j)qQDzzIFW+ciAFHuBoV3<sL?Lgr z6SBKG@oszgWo<&T+*rhpSXZs{?4ePI{H<?_rCxe>vh&4>@kWUp`Wdcl<YX<Z1=d0K z+~`Pl=mheXm&fhnTyXMwodnZoKmuMEvUXc<S!VMea##E1Rxjcda$=p=ZhG-aJ;brb ze0I|^d^xN-=4tXtXO<^D;be0<Is4s@e3P1la~M_GT1!}^tbx#nsvMdwi}G>qI_H@4 z$bG=Os0?@?ePC9!4q7R#v1WGK9c`Dj`BZm>bI5t)zUN(4QoMscGwWLCtSr_PGdJyu zmdlL1n%mIn=d5v$@eyhWE@5<KSFB>bSkPEBO@LC$vEEW=zwOwa-Q#?xx`sC!pI9~D z4BtQ2agdNYBwBeRoSF7nJBK@q$EsPlgRzI@_D%Bbw_chxX&qEo?)PpvPi))H@7Cs6 zIp_vW%@$e7eA6vyuBUg=f3gK{;udgHJE>hi-ykQU8g!vq$ognawvw?2G$XF5*7C7# zStrVgIFG%avOdaAXPHH<*VY&-J^M+E;}+^T-|G%^@;ltQ;FXmO-6eI*bXLgPWwl`W zjaa;08RDZm-znlebh>-{#a}uPS!YaUD?wr>J8P6CgY_BF&%5vBb7ng)-S4203itz! zV%<PzX|1VdaXJvKlqq;gw~SNCsqL2F=jCG5h^{qD!AkmBKg`ASI{bb=h8J^9$F_rR zfNzmAP$zoL>}EOE5G&r?LLZ=KGBb~IKie<ukmKXm<$ZL5=79GK>i9NWKh3^$B<d@7 zgB?z>XWIvzN8WaM7rlcVC717%FN3cWyGXa7fpVVL(J5jVv)eo4z2-2>UfP0X_C55q z@*QHij3oGl{NT-XO4{(7LMNm5pU8wt(^uwIYp<`f?+cr2?7|Dxa-PrKVK=lhJB~XW zeh0pav^JYs<$R{^2HRtN#UE8tanUXA?6zAwNxgBRfv!k?8{gSy>yCAR?K7fD4&7XY z+*ZzYyQTBhttIm5{N#fXV#(mQ<e$K23Xrn8nfT<!IJ@jz&R#cKd{EEvR^taN<7@1z zX4N-$k*#`@Na8hc7TO`Zi@S?YQ_JvRc!@QIubXe4wa-jRGozefiPN36_A9%f+n#4t znQ@5LW)H1;zNOYHa{!%-CdpIYLFc&r+D_^g=8k0e7f4*QO8I73_su%A0je$6c*~p_ z_C7n{*5N5tcAU%D3G0~eJ86A4o72iDp)Bnc0G;)<uQ^$GAvFOnHXPQ&cf$7;Br?-K z`m!)Q;v}?N+fSU@ytUebFBvh`EniB18lS<k(^q<-*z0bwuSJU3=bcKty*i3t811b0 zz9RmzzU-_5{h}9%Bkp1QVWhBq+$qlMsx>f1T?^jR^Ox|IWnCyk>%}g2fxSLr+S{BM zK3Qp8-n?KH_xJI4^HpNC=m-6`809vyTSj(9N;^-y$|{1pnJImz{3!#`{>y9?b#z^k z)_oSaAI=kbW1sTst5oEmx!X57a3(O>pW3=apX;}Ln3E=wJUlZz(4OqIQNu`WR?BY& z>jqN>rdU7dZGD^<aSntxhYE!A+bz5XYB8C{7Wo?lV}t1f?W}Dy7G4|vVJ{9J47Cdn zwU2u6l@!^=misFQI|XfjX)Bi2*A@6ndwKX|Xi#{){lj~vTymN1^cN474&LymwMNiZ zx&i-cZwfySEeW55hP$rHK>ua){mFw_gWLSCSQ*IK>hj<AuJGH?its-BoA*{(^a5Mx zPXiMB{E~H~wR8>s$37dDp~K<ZHs<fuZ?cp%^<NEK4m9y^WGQJr-3>Cs^pTd~#F1Q1 zO>ROTzacEUe_3E<poo7C^V7__6OVC<L#A9f5(6<NTEB(dAhmy7pkKi6p9*JNRS)6y zoHCJ-;mnbAP9BIc=Sd9~@(m3v3Doi*f|WMYQ+RDBNu)sdZ1{-%$lInikr<ZQe=+bS zFw_4Z8$yTcF+8L5JnV($hv(TxycOyoiDkq6S%VdW_uyQH(w4d=zi$r@&j790v6p!N zD4TqPd~0#=aIjLKtu>rx)A3$U+YILneGH|xCwfOz8k*2b75F#!J=h^I(3($6>EB*$ z`)=rUJiJ>QsqOVwPf3WS4m=F9s9k{%7Bx2Lj{KZmAzU(aJ@g`y+pDA|ldf!_zgBP= zyuPpp@^K4&<c*x$;RB(Z;be9`k3mFD$};(X1sXyobjm7i6i3CyF0i0ap-SPDc1{n0 zjr}$Q{-1%G!OVeuRwbh-$|#n>8xKcAq0pho9>@$&;(KN~e~#ek;PpUT-%Vo+WCz=v z_u;9bqoH1r{%&Wv6Q3|sf{lrw3e4~+;}-f`taVPoN@GItVd=z+T6mZl=c^Fp!NkG6 zzCxxz>%<A?X}Eo8bf`e2kefpG!t2c>{!+oG!C!%?zHi1qsI{2rtPST4bqVE-lyOVT zb@-Z@&EGJngH~{w?+dJ>nrP_^3XAxhp`YQzkg@N;o;lioIM_a_dGNe1VD3f*MJ6X} zcys(ksK#eI2SpXU!mQ!H5!@4XBiP)((=35!i}p^DaPRo$@id&vsVW|$j%Hc^t>CFB z36`3gt;O%ea;G)a>s8~=gs$0N_*4XUPQKXSoG2Z<;?Kag;T#gVE5b|S`^S^;SNkoW zfijq{eFK6sq8<mk`Old{@B=ZzDHWa<KOSaD=u{SOP($DzHU(!!9S^n#-XK37B`P@@ z_=~jhw?c7tL1Ezi<|Kcjs07iKqW1Xzg{;4iFr2NSyKx8NT7>4>FZn;HlR3;^F{*C# z+^9nE`{pC~yr|$D3+;^S9Vg?n+JkuqRL<<=uO2ln`gzodz#$eOKH15+5ZV+M6L&2B zW&~PF=wC*Df6Az)(YK=J1n#gDB&D3-d=8z8YY}%X{&gfTPl32m)Soq~L-cug9eWLX zi{FTbFvjk<t}shcdn)gVDw>`BMWgCRFNn$>XvsF>^&*k8I&>s%R$R7FXZt?Cffk#~ z{Pm+6MURe(_a|c=@K7P_`JsJrYvLM(rrWRhDKrN5k_q16t`N1`{}6WDL-?IDAr;5t z_J-iAb`g)3n}hu-_$Mk?)DHi3Gc&x45#^i>*>EL(JmlClgoPKI-TWf>KI(h0sei6% z;G*K8y(088PQ^V8m2lRGAvil@fss-9qO(Sg@eenbqb<CVogp+NZfV@yP#UPD&f{3t zF7PyJL3Afzjarz{cbog{%kjD5dc=(hWpJ*Dm-q<V704a^AbJ&?%V2X9>cPK6*2kN1 z<>JbR9@|UAIlPK33}lb~7=0k>wtu6!6V2v+7$b9Bt+;BT2lfzn1*8k>8StXcM(>Dv z>py0mMca8!`%ZkCIB2gF+HE%#qi{=BGw>+taP;A*@BRzs6Lgn1vAy`RaZTdj)it}P z=!46%3LvpEdTi7||621ry2P8>{!oXwC2=c4X`Suj03O4d2hK$GkFFlo(_hu>fd=!` zwuqk)cPs8msIL<({ZJ<j3Y?9q7abjy%P*iRtjE*aNkbds62+GfUv(<WtmG`~6qp+2 zL~RY8hPv?`R8pzzDxpC90{De|3-^YcMBcF4fx7T2O7UQIUtwb!;25#1hcdt~;FCbj zms*`ANvr{ZW>J%(j9}1b)28~e_c2l?lpo$-uNV2__E350RO@<RX4J;0#6fOdrz!P# zZ&f5N{&U<K;0zDA)m1_|(0T>Cl~Ij@1$@+~3=$I}uj8M@jfwv^JkQOqLZqQ}8g{Fq zMh5%&su&aX3-4<rS4hOIjQ<**=zf>W$#+&QP%vsx6b&Z!1wbMRuMWTVkB!e9>Kgg( z7Kgg=1xpxs3@8;FSZQqsO#bFIv%iG?#4icmid6J^t1Hko_N9M8aC0zgpeDSQ6{RnF zMS+_zLpMWF_E>K}tkhw@{L6v|f;j_4t%g*pQ(kWS65#rh(3?nKZ>M4uSt$ZHg71Re z0+X!85a+&o_3YE31M%H}XG!Q)Q<upnu+v*XU)1Wr0qY{|s1xy4_QlY?_?S??$OBi( zZe#*G;a?QIADkSxZv~895D8D&rNWs)t3zuduidb0K<cn|{#?OP!79L!{6}x-W4yF; zHoPO0B^+(%^86|jd12o0%?msZ%=T-xnx5BB`FJNL(mnhtyu)7aHBtr1adVt6O`v(8 zxc?CwNB3(YJ~@XY7s6#D)VbqTS2pfprttma|LDK%o6Y*uC%Ur8>3R_s=@UuiT=(** zo4APi#v1K^<p1b9&34cXXrUPCmb9}({)#Ajofju(V`*HphWVfRzx!@Mrd$H85d++G zwihlLxnlSC9?MxciTTGm?Jp9j;7?$Eqs7r6QN(=}IS_sw?r#_H_R4WMvzf*h@edA+ z^_Q|DG(T!39A|2zb9i^S6~wud5Iq{24Sjh7%L5DjH7#P~MCE~J=^CjXUJ-5p`nV~N z<4$IbFLhupWLw#+r!*z1DLy+RB5lI^;kBa}@4dW=2bwK>i2}U?Js|F1q(5{{@zt3f z=?%HVM7yVl)e}6}Z0*Yw7#V2kci9mdr_+f`PCwA;mGES{pO--e$u@Jc56&bo#h=bP zPM>PQH#;>WrNisO1AzZZ2$|zPbFHs!U{7FyKf85;KF|@q$|)Vm6P_1tY1j53z>@vu z2H)_&YhVRhTON%@seq}g7)cUt8_s5D@*c>`zzEIo^$5HQyz|eoiWs#)A1|C{k(|IO zrnO!7xO{*&z!<Rsc(BU9)+%9?Mui}%XN-If<q3a@d~^@Xd-#C))b}9JG*~fk#wrfz z;1>g&N8z<0J9H&-%iRTR&L1<AKT&X6a45X()Xpe`ByZ{*3r`L`32lp<ad*mh_>t-J zqu}6RN01m~)I~WVyO7~+p)aB1ATdF%z*EibzPSM_7z`Y?S{sAWcwx9BB4xvU!-jp! z?FF2oX%gROf4{&Ce<#RL=Ai3hsOv;_fKFrVPi{4-&<bO|HPW9Z(8=G~>TKLb8RTuZ ziH##(xUzlNrE(L>Xe72$`Ct31`ny{TjjVXA%<e&ND`1_=*z?@Wq8E~sS?T=o{=WXz z);Xg*o&((W82eZFRQOk<o;y#}K{iccRrePQ9Pq!i40Aj_By)Ma?Z@E-;hm8LZU?B> z9?@v4zQ0P~rr-2sH)rE>vZ^=Ez8jtzJ{W;FH$`6b8YHUu3kMGSzgkh|7#O3hH^X+q zN5hXJ1>OE2@rn{FzduLdlArprnCr1CX92gJA#x}D2F9o*KIzGH5Bm+w^#bU5QO$ga zv#LWLb~;2PNZ3x4*aa+nPj<o=^4|k)`>@%D>{7XbWA7Zf7@iWD<n-lV)qL{7?Cd+@ zzu=$XOUWLP{CW*v<1CLn3lEPpaSHG~sv~%RO^|ru-|cI_64M^~I^W|=2fY`JVCS<p zLDeRQ&33+T{uF^HzTPY+FmVU@QfGK%PMAeL*sr`Xsv%&^5?_Wu-9R!w+^<2ly_~mo zGDqr#e}y00SG@tMIf*lmgFmzlr1r08g=j_HhgWy9MyiGX4W9w-X}O9ejGgk;2@DKm z_b*|YX(c_JS9KCb3IW6Q-2UaQQxi#A_R7~f&>=wlf3rk1J5(Q8oaB+F;rQ@xJ0X9f zPLPVs0WNNGAccQ0b4V2M!48~D((r@u7n|@~>K^IGlK4l1_m}WbX5WabO7Ljsb2v@- zcKExUp8rtK$X_g@e@S3*AdSBZdr3T%gMYLyfy672NB|YgOVWp>^-l#JEvbJf`$<9| z5da3gJnWX+X`%YKNXoId;M=_d%GZLuA%0z(=Wr578ih$D=w#$~)ee%E-SL$Slns3H zbz~uu7P9_oPJu|TaI#2JCj-B&wvepsHt3^6z=XXJ*ljDG)4`Eq;g{jJcF5bOR+Bso zz7+`c2_*NAgE}b-%#zIE;nIMYU+fgXqdkB+DYJi0U=m1lW9P_O#l5HYiLfvHIh@gH z%Jb-~bQ`PeUkqBm=R>R)iB;#kqxPe4D|kI_igT5((WB`L2K`6^*#bj-Tg=p?irVO% zu}Nf8czfi#lTG~4N9Z4x$Dcd!uRo)&zIh%Kwb1)uSB$(1e}{~|w=mHvs0x`s7})N& zt<vTLTm)t@oc@s_kqUMXcc4&u9^J^U_>TL#`R`hJ%-gt>dg~Q;mPBeq8rU=3&7v?m zL{G8zzQ_I%{?}F|^E0lYzIauf&5>G>>h>t`+oWg_-2ghh>hB61YI5@&E~>tIO`NNd ziIIi&Rrj{2j!x1e>>9+eqW+2217kG)Dz^Zua5J(ta@;0fYT#-<(M#;4FV^q*s#+_I zb~s+%@LD=L@&n$|s{riPTJ)CAW1WBzSmAreN&{1SO+NS5I34VIc0XsCH%jhBcj*9@ z&v)Hd#<ze)89w}3n*4^d(q3&JaQ1n<<xE&<Vs_H%;`?d!V3v^%CsnO@73gR4&Hn1V z@g~T@s4+chcCn&;%d9l)5lsVonaszy?Va*YR#$s-WN%c8t~4uHZ>^Ca@tqdNjnrYj z&z<PBb*ccnHAogm4ry%uU@NS;mXG~Mo8!eQfk^57cFs7n-ST{aEQ{WeyyjWf+e&Rc zHt*8Lc#kR}N_$c6D`%5iiuVPsZW{?3b6Hg@+EQkAV-Gg;3USyQ@8)nXxK(&}`9XIl z%Zw5%V0~tHOhr%Os`|FL01^e=^KN!tL~hfC$Uq}ABUXe_*3d{!mgp=pIX~w%ckjFD zcoI2Y2S_#Ji+O|HWbe(QMm+vYyTafn-3sm=HwDir$LLSExPjRxcAtGV%NYWX)fs>z zz3jGd-?<fdak&7-sA#-053z0Rh^gsmTwQ+_o_EG=<34aR^9(S{cN{dfn9~?Ai>60k zz!(K&4W7W;<R<YN@<Q@2eF)#B{mnY8E}LKyBZ7D8QE~;Z<n3~$n~Yx&?^R)3i+(gd zo4MIcGnY}96h=xSvBdlB`n~twP%&LyLtn{m<Aqs~-85GjcgY&mMAZ~$yf^MOcZx@a zPc=jf$lt~lvjOw5KSn0{5=~a!1#mR(e7A-7hQ|Yo`VZM=M6(U79!p^sqMy)6RYdgi zhPeIRn%*n!S5uK90kZ`=2WyQsQ_)Q*vAV~LdTrd!ZX++b=%YN;g|;-8u{hR(Ju!BZ zoM^oq%-^}0-Dd7sub+6J+T&AngL#Q@R+eox29r2FP*&pm-JsjiUEmE9uhiebvK}!n zGVpIU)u;~)c@vqA&u~A3jg9sCi<cnrlRh$kvm{mw+iQ#<FLgOdz*6rx(a`;=qPU_4 z;&1emnZfF4t!J*WioDVJ<twka+s`@RAXw>I)dYW}(yVFCv#zlu<__{r=aCn|3adDi zoU85|U>$ql)J8=%)4FX*R?fUhT%AhJ^)5JJyQDMT-OGooUO11@8GK4unXKmKBl2E< z6&<{_&O<wm)8F00XQ_2~ps|F#u=4pjS^dq8WUk&U(tBl`PWBzUt9uE!{Ns4LAy_?M ze_t=_FLMu>54XH8+*D3)`>oy2{mNaHjc_B6)zdf9*T$-8P9g1ed9l+CIKypWuX1yW zlDaK;R8^~uubHo~#muZktAJSQa(kRz)cNN25d-ujQozh;<@BZWy<j_ykHF;mfpv^= z-q}l>M&1K)LT@A`%`_Ibj#~p*Gh-`0sXTra81yX8XJ@mQR>tX@q=w0W>78daU<Hj4 zc&T#uCwHY&$BA+;czI<=UnC{WKX5-X$SS~67(?(H72z-4RZc4>oqN}-EEA%~q^$Xi z9kPa7WmqPoKVASu_$zm|Q`*tM)0dD2x=*T_*t&16vRbkd#yosnnc|K+&Z*!CXSFBA zZM~L6n|IkhYrItxuy8fLrE-fX@3_;=$>iSfvdY(bJ4tC?fs<=(6^Aia<D060$l|?o zra9T%<6a7RTaP3+jp=|vF;+I%%WmwcL86<N%020{b3b`m<XPR0Y&4p%!d8^^84zYA zrh1AP=aq6lIP=}Kypp`2dy;ELKbFb*!@irzj8*un>LLE}^1F|nL9XM)NQ}0Ucg6(P z)+%qM0)0%w_f!kf+Dqu}b-KDyyg6uW1M!;|V5K#!03)EW9kAO!?geLw)5c|du&j-e z(E(;E>#;T4D$f!a^>J4~-1Tm6&_^2gjn@$*^3xS&b&L9rTAkr$qbDAwF2UW$FhK28 zZam<6dz2UMPpVrIbXtVP(*n4Pn!^Xctwl=5aG!gfWF5E*I0i4irt}@NI<X=~Up!bH z;>+BQaQC5{GhQW`3;F3tGmrJfT4B{-$&JRii`or7S<xZRd*_5#Rpx;o&CfBbfCX)` zs<D7k1=mrtcptZzL!GxUMtj)=m81vFVOAmEWvd}$MloDm_2*Sx!}(~xac+47<OnpF z#+$2wqX)*3ouQB6m1WFr`2Sbia1-(~@IAvhTAE$9VtnUeFNf%Uv{gFZPv^1y$xiI% z<v-!h@)@nfo>(n?J1ozfN!Ox9@*~`@aXXPy3T~W)453>zE8A>k_szE)a|OMLKFIRC z0^DnqcB;B1`2%?ZO@+IWe$W|ipcQBCqhXX<jpW1J4o(ZFzMBQ^r2a-#=n}KAb<b*R z{W34pEV!;Zz)yfT3;>Btd>Lpx3!P+UwJus6ER#K_d2ma04kQ*j!<-HfqvnA=qG@aJ zh9z)|_te}@F)pii@m=5zW1JywHGWu*N0sO_Gs;?T6}Rrd-I#|;sy+OGJI5K~bcg$< zO|m=6N(Y%7EGW74k2#FqL4Fm>7rS$v8O~U@0lz3GqI|R`MC36RwU(H@=tbnpfpBsY zVI4goiX8>5XQb`TFYIrN!FMJD=v5@-0N8C4u%Pm8dOl0mLIHTW`V$*q5o@QpfQC>} zwU1wPx4}y5x)#L!yyz*(W8Pw;taR2D^B>A^b#;cHac4NKof7VUULC3RL5Ll@SZ6DN zb<sRc%iuBUGk@<MficRs&%B)SE_mf7qZcb`DR$Mo1l<SMsAwVFYtCZO=|``${G*qU zXU1q&2BP|D^AydG`>G#2&fVwqbc(xQy(02~o<Y8VXIF<=-k8s6T|7&L0i||2y`0SM zb&!bHTZv(wVv|9qU(5%v4q#qD>%HLyRyljTM1UX108d}Bbyhp@TMx$g3%p^TTg}n- zb!WP##Z!HPls5^S{&GO6yhdl-2lO${&FtK@*ExTAU&Kv)gj6vTTF>DoxEjk~bif_e zT;AN3_D*{k+!a3&7xg|;+bm!Oz#B%fdd65h1a39kxWDYBaNi8PgV>~Zkw#`gE0OPs zHJR0h%yEF4$xFNU?Xh+_N4tx}a=^kGW(g~YFJkRu<BZLC28>a|y=u3zqn*2e{G&i0 zW#AsTjxVS05nE|o#v9ctp5NVT$JnlY%xx^X=vWeCwz9hWs`&&vZ@j}t)lOc(U1Jvl zpW5t}6K(Z8($VZ=jqr8!Wwf3eFY$6UksEG*+ld^oXSx+3zHBEG%%#>^-!NZx>xuCU zFH)m<#A#)Ji0rdh!YmUYdK@<&S<ifXe61~Id<W$3&L6<t+SSNBd$3zn4AvLO9`mmC z%6AYXJmWKrF_?dFD%&?Bi$Nk6tn?_^YTkysvs1nfP$N^aUyb8moO<?y$W(agJ(K99 z{~<HY-PQ%)24544nwT6@D|o=|VTU3|>}fDdFVOl_bAh$S7wgMqT{mvPER(tA4zr`| zr}iaxirBAT0*kWOTJ5Xjd(6fflW}cTnZI&|*ahuWP9pEV!0;CQH@G>S>Pzig3a6hM zKag*{f1K`i6}uMPCD)dd(Rx~p{j!$(Qu+GAjrCD9S03_4Ii>9qkgu=y2FaD^2yM&^ z-#p(Rs|q_wx1xS>wl~D-W)HSkJD0sJ@(y}Po3MyA+4tGX#}?5ssFj@K4Rc!CJ?vE= zu|l3gSK&tUyEO#tBNuRN3(*j{(_7(8wHMnbooC)oc@L_BD(t1z+jrfHVzG1v`djYx z7C95`Rba{Q;3oMRNYrC*txjNtS=c(d6pfeHyi?99d%1lU##k=5qwO>s<T$kfaSOmo zucFh^;J=&;_F?<B^TL}e=b>2Ynd_{Qz5}q1>+}oyB=hh@?pyn|{mi-V^^<J?El)vw zvEYtB6?;RIV4tc9$e$HZ`MvY6H&C`hx#?W^`r?B%6mtFp^eeJdU*5wl1z!QAbPYhu zE^x;`(adZ8Yt^wXoAc;L$bn;cC5SJ1o%F8jEr9O?+R!~_IqRX-6)<@%U}2o>#5=l0 zoHS6sB!gG{N5Yo`o6Yhd(cF4wE`#{;Q&!`Z-CRy`#|QWkEBgWBE`@ImURr-cL_SGv zlu?c0?cB7EvN_znw}AR34Xh)d_0F1U6@xg}823;I`AWBilhAqMto72#pZXLj4LQsW zYl>9|GL#v3o%+r%0K%kjt~&#~M`EX*23Yu+J+qElGuR~K1LlxvhXE~9INO}E-XhTg zzD77~Y-Imf8?5DQn~{Q4(KAFP?}$^(x#-mP=8M`o71>}cW*e;4)?#+dC_{Sat&o3& zok32V)63f;n(8!Ul`(?#w|ZLL*m#4HMtZLp=9%tNCyP7NI|3e+fy5dytgKbg%D~DP zcX468U99lxxj&o<uE|TwtB?onHaf8akOMz6f6&qRh3X_adb!>2&MK&IngAv*B2SGW z48EzhzL`I1FML(C0*Q=}jn8q*@@X<XItsfz0NGX!h^8Uh4<A<9MKbTMGu^2H8A?NG zf<$`rHQNhcO%!A~jYaqjRE<B~%}#SC=<fFt%O~Ks1<bGP7~~(ZY@l%hKT(B5G<0!j z2$|!~|JV8<lF|Ie?ptfEMy!~z0l!j(h3V~e+Bk{b(_TgxV+kQpc`ksepdfq`u?#;} zl|?a6JC~iwZU){(2GD*2uYSR9<Jd*>25pG9sp6u6SIG68Q*LLzSr$b5$RndElk5<i zXfCDYAV2LY=6SJh6R79@f!v`6+D*<HMc6Ginl&^>(3~(vJF(JR;`VlPczgIwSsL=f z<3<j4oy}(h!II11YihQ*>g{)jy4hij6QHpPP~RqJ=h;No6=rFM-+;t1Z-d*@P2i2? zb0pWmni#@7%x1As<~G_5BYj@{^e(vL+<e|jzC`|~JCiZSFQ~=(vHs?M+8=V<gW^B$ zr902f;7#B&AkO6_C5;>A3O0asGI!7^IKTcaGH}n`>sI%c@xSGHot9)V7MqP(CDzJ3 zOy^_xUQ$-!nZ2uSEpIVMoX`e|GG>@HpjN8^vn<0gP$kvoDZImOd2c%JDc9>SP>c02 z^RQ&Bpt*+50f|hq8?WNMa+`QdA;(>>U*Y$(vzY-Z)4U)t7uVA{WLu~!pScaZVZ5yD zrMKX<G>2(024n1|hw(VwLQduNya#SUsG<Wht8R<?P-?z6x!D+OjF1a@o;=J4d0*Ug zULt->JXS%Rl%6s!o3`21L`HU^^j-OlPxs!rmKWzu6^qnO^p?yu)|+wWKr^4wf|Nxm zRSt2$lWt1S@nXdYwGO&(^f88;C(O!b3ZpftiSnpQ;=Y&BE9v>6&v6em4eIPNMs;(6 zna=!0i$VpQL{)&3sqQuLGVxVnmfDC`fkYK^o|(q{k5(qtAe(9;q}LvLg%ss0#YD9n zO(iLebmmAik@<lZAf-`h@H)q<;dS+@^5bHOT94L}szzONg_#>TgL<R}Dy*8p=@#|M zcnSGzF;LAw>q$GKw|T^@2^>lfQXl11CB+pl+RFgD?F*emmZIZiurbAaYIZk^7@bK; zWT<ptW!g>bNpHDWuCAjHIR>18$;Ox^j0PkTx-UQSiQauT9{hHPxUMix30;=onW<SH zSVv0oL2r@!cr)+3OTB1*=Kr~ihBOYii$tuY`I3IeC-oRPnV0b{y2-q({H;i=TjPE- z06)G<&f36k-{W<<r<}m^d23w<Dy@6sx2lM{QDwY^b+iYK+4!iAm1}qlutMzy`F&yP zYPd0V4Q=LU!{BTakY{>>+`}7r$ALo$!0A6!>2YNmGPqfYO*T`*>3`AN<q6&nxEcYq z*hz5@B<fLV{4vwAv1WQB2kd2o+zqo_cN2O4TL;xp^-ykv%#5tN`I&yeYjig`omclx zfJ7ypNEX+l@n+fp<|xBPLe=;mUadRGDZH9@)=llz;aOx8y##Ne<;+YhKkEqj>0`V| zw~|A6e&As;deAjoHq{&O8QR7y$7+CQbL!z8x((#x1-vcpCzpHIgrz&-8MLffmi1v5 z%tl64;4c2R(kk9!_on*<dVm~J>2OP$2F6$d?AJnLF=>cA`Ha`{X1M#@T^@Y>puV6o zG>h4i?PEFNyR46721=!V^ETdecd<LcD*{~32Vncsn9bQm7Q?=SL@Y|GLcF6l)m;Fb zQYnylfr`;gW*fl5Ozf0#iS$QUJ>~Vih3-*zAN2CxuF~RmG@sd&t!3O?V5}fj&{KJh zxAeBUcVVR~fDbBz2h#$um%rItbCA)A1kp|ToOcF(?73@uhs9Hs4|k_U&01^(yJB`X z#*(7wiG0Y1c>lT)_dD3>W!P<Xu#aS{ExQh5j3ou&o4V(`uXoaY3$u(B>s1)#px=Sp z>IhM6uCa~uK<QLMF%~$stL_P}k?5!npg(}yf6VsmKXae)fNVsa!7ERDpWKh`4lk?7 ztHz*{fXesG>g>1q$YAs&>ZN*$C%~~Cb4Pd{*Rm>_OvV}?%poilaBM|sVtfv8`(N*_ zyAwFJbNq@-gF2J8#&xqlE5K5lZD?M6SFME3<d5AgZdGp!KPc0pA!Ly8-29tWWChH> zXf}LMjS#22W9|&Mq_+!d;LK<Y8E<?uXR&6ive}zv2YzFXxZ~|}W8F&LCH@d<@xRGL z*h?(S!3?t^HSj9n`i^;5+>LH??+O18D*okUiQ$+NSY8%1tI{aEPmL9qygRU$0p4@| zN|r>kV3tQ_H<pF@&7$->TCDyS4*+p@xIMfd+><o{>1G*U&5^7S?4==11}mK)ZUZ`O zbsKyC^6wzAgse7FvJ+sbRbZuAVV3S<IoQV#x0rXB-<L7yFw}g-7*tz;Aj4<|yi2tf zBfYL}dGOrX{1oW)2JwtR3|TwCb63$!c%(`$YIqgh^zLVO3h1;Wpj1Y40n2XPV6&m) zO$t0(WfU#EMs8O3o4bWGH4j+n#1IL~S`PrpM$l+HR;3iBfDg<Mo_h#ZIsnE<Vh&>= zHiOkRThRy_tn!FH-e9)_tn?1-b`bgj*+YBw4B~o>*^>T;`a=dX!JFgufT(?z+fa+2 zBIk^}>@-+eR<ktZ!DCf5F$q}dzQCWp<`LNzT_;aqx2IWORtd&XXrd}526%nkx`4Tx z_&wlYFOkPaadwP#V1?m(*-xma$_30+3%3v;>Ms6Kc0v!xccT^i1=&L#(E4}i*pvkH zQ3o`Z)Z5R$!Ct-sW7v+pXQN<@67UUbDfODC^9s9#LE<>9bUX@^c=&?&D(lJ8m<i~5 zQ~=n%8lbVdZaL58Wz~M*of3lYA7>@lTjM*KgOY(~m-2eLW8J=9YS91~=Ug<!|8v0= z*&E|6nTFB>m)FLd?JftFHjAjEwxj=GFG;~~rFq1-L#Coaa4xIB*1x&8y>4Qpx(w%X z3Tz#i9CNU-jC6w-l}GIJe!0l|;0+PO)h=|0%rkbH+8l4j7!%1L)DZG5?!`bfO~dDk zaS)L=lZHkYbH7=^%w!B9eNkJrKvdvUy#-z;enYHLTfhpl7}?CJW)8sQdZZ(0Y@W!$ z`#?XW(tMfdtlFWb#4s|M@TD}w{Y~Tu+N++5K76$|%PYbMi{h$0Dnu^R_b^We=-xFI z&|#%IDVo46U7^2MW076uMp?*XYMP_X!e%jJBRPn+s>`AwpX813vhaSQl&XTtl24%3 z@n#k?${0rGqFL&YXv`PFN^A2q5Rp5hCLr<7C~7`1ZqgE@I*Nh4bmrH*Ti#S254`pc zG?;i0>57?0jcqh7DTZpPEn)yjyaeko<X$xswIa9ZQ3IQcjM4NL&W}2&V`3D4<JsO` z9tM33LzT%Hy3YV!+}H})MSHNqw_+0yc|W~*{EFzO>Y<cmAzf`GG_M<vX;-oqom5)v z=D)qWUVA=M6i^A!4?K}BGZLF0jG(cWyg*o2kx#kyo`BY;iQI~z7kCI=ZlpKA7?!b; zJV1X`L3smax$U)uj%h*lM&H6?={lGN&=j<O54}`bVT|Pbn>T>36%|zw{R{CU)*$9B z<2#)|plg{bBj57$JQ3f+;e_B^Ofr%VG2R>djE8gpIg8>|S^0ve;FvFgsNP7WLC<gt z+TOTf%r%bEp5!)4r^m~}q9ZTN_wn1J1^h7o7OqVj82gRk#sS)woI_mom8C^ro)5-Y zBT}f_dNxi#GZ{NUV=w4*@)K2oJg24@%A4>je7DeW-_#v{BAPCSSw7PvBq#2w56iA% zDR0I1^VLGh4Z0RSOfJ$+#sK3kT}q;GFMVCMgR{%er-6;Vk&AR${0~@JKcgQ=TqphT z1#PP3;w10ISM#3Y0^Ah^@!w=EEobC5#?!w^A-rB2YL~dqyTeL*iL<hS{)z^YowS}2 zW1OZJNmIN*r&B`Y6<hgX9xHCk7<~=ZB$H`jqm*%&o+QoiL7iQ_5lC$2U-=<%U*^*% zQ5`axrZ$R#72YH5@flrOeG_3mo8N%FJce1GqS|BtO>e+21L<cn0^ibQ)h`j^qxnHN z{Zq1}euw&#X*4Z#vU^Tnk>2>8uBqOMe|bv|-|mYekSl#g)5tN}#Q4j=5KZUd@4AKh zBVO~id<JhJR)fSB7-K1|1sV&}ccd?Vpev{c;wJCFm-6;vm8`6j;63CK9cyedG8yqO z%VS+itrrvEY{&5&qPFzwI5ZqO>iuOLGx8eW$N>BSB({nza4t)EjEI$mwTDKKCA5_> z-|z#Db;7uiFM<3;#iysY>Ka<(t16FCY!@a7orVI6bvBQ4}4&}cnAkXIGQp*{(t zws0<8jAq6Lx(Rf;T;G$k#UtLAkKk=Zyj-P|<H_VIZDV9GhJpoU#Vz%5xkkL;{rL{Q z9lT+zPKM7CYV?JjK;Ikk3uV!3<!bST$MUQEu_&un=x98T9H7|@pD_w>Yz27KKXQTC z39}>>C1ekEUiZWCU}JIg4IKcL#aMJ-O_3eN5MGm0kwI2b+w@=fJK08W(Id15%}r(_ zsdmX&v6>I%sYQ0#NqvP3^(~o0U(*k?9DRhVgTxJxn9GN7zxXOrtK+&qK0roMXt731 z(6@LD%A=3LEPMDRo=+SV|H`?#5gtn_(5F<>D)a|lh^pzUvX?l`Z}L3i7Wm5wofwxO z6`|9irg>>1*zH(-Lyi>j{1dEnwLt2iHgFjKB&X?BN}--}(PI4-G?qmC;X!d)q*rV7 zLllpr>0aoB_lzVVemq}WDk6G_R3eLb2^rfYy&FBjzsN9Jo$e=L=oZ*sYnd845~der zL~_|sjnr$<cWlruGy~mDl9B&VCmp3K$UUNl_)AokUDZIn6nz1mRiv5d4WjXKlwK!Q zjpa;{LW~sS<z(o|w+1Qvo+PD`oF#F1GD@VmOe5REEDJ?{*;!4|A@C?4Ek<+G2jms* zjgspGDhXgrKx`6|WP3G2|3KwPh!mi?=s~g)7ez?>l_iV8EW5=NIZ1s2t&bu<NMTxw z?gc9)=##oE*MZ;W5eG#>SzF!Hz3@QtlazvaVo7<db)32@4}tHu6Ys@Bc~BKYBXD{0 zm^7rRD1s<=4mutVgmq>X<3$)O{f`=pcHzGWqD?8H$%#f!^>|fEP8YFa2S{9(<)QQ9 zX55%WV5KX`BD@Lh)XkL?O+*{9QY4i*)h6)#qj(A_Lo3rUBo?oPlTD(2!wkcqUt}WC zXavsw2|iBx(5kcr>5QkLI{LKS3Ht5_^Q4vi)N3t}#Q%}jG)(frUb`Se!}nfdf#@w( ziK+6t%7)V7d?Y^|MFlBNTH;J-vl<~^iRq$+*eo{5Pf7zeR3fQqVS0^JBmHp@%~nff zV!1+e5}yQ7$+ZB9>cl3$$#PPVw89AbabA|$<Z@VRPFYB0)2UDm+>D$gt4Lpx0(|zY z-l#m;M8fNZqKd4j(&+SP0G>eZlHFtiNkA-oM}LAYo6Y1cA;cP4St*qh^~c3XH!^^9 zB3JMlG*Mqt|Ff|7qN02$2dk!FUt4e%(i6s*PIlo1=z#vJxU491%9&EgiE0qo*GT*t z=OXP%Vp0mUaZL;LO;(ZJ<zrbuT~Loe=RNT*oSf7mH!xIoXotR`p3A@GR{2b(Rqs`D zq)}gd57!|rp!Xz4BhVv#SH;V-@)eB1)C=`XuSO~HX<UIsgSI?018vreRT33YZ{<;0 zR@K(YQ7p=fQ<15p2-$)w;0<VrUZ7H|UlM-RB(th4`i`!P3gALy49QIH;`#Uz8l$H` z&(WW94oKuxmOiG3q0TrdDF+(Q1}iy=mg;A!g*qjh%9XO4O04JWK4=lHMe4%IXD7$; zMf6aY*K5^%*-mbj4b*Ej26}{U#Cb@57^NyXjCaFcT0*Z)2ll&BW>j#uulqyK&Sazl z`3tmu3x`ozu)=MyR%p2hyNy*{b#s&pKgCVRD6o!0I3ATk6ZCfV0ao!)7FEktRb2w5 z0ew`2)1M94kr6jRGxb4*)DC%AD(Kf)Ugt&d8%kV+#FDWDe!+_8qZu$uLFiX{1@zuW z)zoRwE3_5IkddT3xrWQ*STse?Q6J@8IZU3ELsc`->Qi(BuOV;9V$j-F{1IK!XH{|a zNlupoWfGM`Cqb9de6Yjyqz?&_S@<AYtxu`a>Nf26AK3=%^pQS~-s81oKY_0U$P0W6 z?FQfPu5QYa@?XG?w0e(T1%6wF^dl3&7WV=o@6>7aNOeUnkOVrS3h2Lj5G{qSsTg!x zh0F&#e55OY1pICc<~R;xeAVC4415JnuQ9=3hqF);=&RaG{eb?hHPkqjPG^P=s1@)G zY{A*=#ui?Wascx8Q$<u8)eriZ*3+F)ZXAmr<B}vdS&ft6Z73c(oVHN)V1&$Sq#B|d zqC=<*PD!Sb<fJQ(0xLVHPpDR^j!LGKT&h;;7U&il1-?Ckq$8K`1bpuQwcbmWQSYUc zm!MB<Ds%#!z`aN_=-L{>+wd;X`bRZe2{}uCmbbxzegcji0`D&laRZZycp_S>Gl0Fn zgPym^)HUem`b$d`hbxoP&>Ob_Sq2iPba6dgodz3As0OJAYKOjuR^!j$mqS2jgYZ1$ z>5h6jobDT0Mom@U)Jc5<&A}mD6V{pycC!-&P+8qseU*>o7x3Jt>YSbnyM2q>litv+ zcM1-nLZGo(s;o+(T)?0|>MeMGY3K{vl?)=OU>yjTMlGS=Z4U5WEnCCM9oNHA3H%X! zyAJV__29e7P!YXI<pX`Zg}5MK9ph1btYDU|;8VMC1iI4}f!!8UVfkHFf|VYDb#w=h z83LAEge<^U5rG_clCtGZ8Iesv;+S3!D3qJbg})NyAN&n*&2%&Hhc~d7%8Kg$^aYT} zM|QzqVaSp`qiDeG;_5YwaZeTj-%f&Vqi#4M_){#Qps^e1iN2x|f}QS{XJj3~m}1aH zcQn}PcG923<Ei)+Isxkx@~+$|_kl!nT?#z{eCR=rk&fg8^Z-7Krs;7ik$Na&<uqAW zwE#^17oEg2L81qo?F7KwF?yZK{l6?m?vevQA|?6`^~-9q3D7V|M&Ta+zgMD01L|&u zJSwyPqZzDo5m`sZgN;nYV_}T_Dq78w9bv71sTw*zN{#<OMBV_tZIFt%KI#Q1^;)(B zB)bW?UPKo}O(DlwOxBV~Bm=31i^D84!LM7(l7P#-R7sry6~);=p9?_m$w+CO6V=j7 z)l*qtwwJ%;d=;bXLwqSn{wDvxT9ZONj@N~Ce>Gnwl;r_q>L>yl8wIlrBRj|m(0X>9 z2X)oc)K1w@P6TXk0<-i(J+O_3led5muK){6qxz8XcaV(%h0e&Ts=c0$sz5K~X%N+y zkc&7uZi+JLKXQy*2!DH_bMtAi!8|yEZ;%&&+jDR#oEP1Kb*=)LYI21<3(;c<Ab)yt z1x8SK1&+o~!4rPTTcGp$@~6z8186It#}x9E3<Z5{!_UxcJrsOpyv#3KLEey1pVN!c zZakiB1C5piJ05|m>&f8r-DFxh8FDpK-`3xd13F&?I~fZxXe1g15&5Dl0I~24#Hd&5 zH{=$VaB;E+<|z$TSbc~ubJRGQMGgRcrB=V83U7(O;=V+{Utv-KPemJaH#JH2mx}=l zJ(*t*L>ci;Je5R4hI0&O!!u9^sG;V{`LLJiU||bkoh7lxPe?*KjeNvSac7iL=T^7m zI9XiIlWWyF-2@ef81@ME(g~2RCyqv6R9p21)|pTKkatukoelNIgFsu|$!G$33O=F< z`0NP@zoL>c>b%Mc5$X=^2LJ0rE`U#71{|!R7plS17IS5F=qjC1_eT40B9f8JhaBZ8 zUW&qc4p`VQ7=fw=&^5XiRC3z^JBs{&WS9z`kQ?l{quK@*3J=n${%Wm$hB`v#&;sTt zPKw~Q5C?1Moa%zK0ZadY4W82T&>yrIkB08vL8xpvYJm#qrhwONRa%t|G8_iE!cXwH z0T8pdgEkW2%;*_lO9}AG!xF){y#%kljqZWhW`=mZ6z9NED4_R3cWfKZt+T4DFY8>0 z;W&uupCC&)4hVHkC(xHwb+r*JaHvWReYaDiY7kiv#5aM@;LGTuZlrBhLG6>jVVy2y z>O;{?7~==dL}JKh{5NDlmGm0*2<#N84r)E*1!KXVUO=|hgOmjPS%yNogsu)%)IP`x z>O*hv6Z#w)21q%P94Ad73f@5i;*+W7$l>5mPvw5#0*<48&=33^c?LP#S*($*FREAY z|N1gUZkKZ*LQO+M;N;*y$udCX;+UdK5LsGF3r=??<OSVyU&v2}lJAhMZ-vY<KTeH; zP`hN8`@{p$S>{&7^bqLt-I07HC8(cPgJ@e0RnS>f3HcoI@UrrbjHot%rHRRDs7#`0 zF;W-zLlyNWnMD2;SZ0(bB!}MZML}1ONlp3|vePbj9eDmLnO??;^H7DIki~Qi0;&ya zs2WiHWF$MlLK5hoax~z}0&z|Jl6kbNKcM0yD@{OWKt8n>*F)za2VNuph+ZNjia^%) z3~Jl)Bt88_ZjycEUt9uxgHxFVwOV&kSQb`q)OB46@aGyiO6~yG4Z{ghYTZaxmxCc+ z2R=t`R~BSAW5_M=sQh#usfRPbUMj0Ba=y4ODu7mJtAuDcMC03}J#9yOkz9bL)wB)T zSR!6PB{vqlE+@n|KY2jL(^j-KsfJsl!oaY+fQs}5loLzkD^(p;$I;{y8A8j@Ze%nb zhqCEy@~l`cj)@;)g?yt5fbZM*6=_G4(1v6j;C=?ET$#KI690)a(o-2w;D1&K6(hX6 zK!!pedjl%hT(FYu;-`2e69Cd_lohJI!t@SgN|4K<Yw8Rj!&xx^bb1Ze@ld;{3~`A9 zE9**D;EI3_(W;-kD^`eHGMn;2{K*XwpF%}>iqs@E@N2yrY%GoJ19esciPbw5(hWhU zk|d!X#HfBa39tc4R7JTS>Yu7I0YvQ75J`uDPT!JOq!r15pFj?jNTru!#ClN~^5D<F z^X&j6JWWifu&a_FR6tpwwq?LNd=RbRTwbc0Xf9+8A4wq^f*6(@XGIzHf0D?fpsyIn zaet`VfMeO=WYg3CAjipsvw&y6m&u_5dLS}_XO;x7Y=bkyDvHskkik^N6_Bm|g*xkr zxGD<3ZtDPAw!{5M3K~tfK-S+A=RoJwQLyAKVwuP$v#6rF66yjHf_PwIg`u|ntPiNq zvI0oV6{Tc(RS~kn#dsljoI&rCiX=CF3tssURyq;bgtCyaA;{K;f<AtdFxg8iBA~9g z3D}^-V(^A~(x(#WwrCl6r68p#q2)<>{81l=br7gckBa;<N)-T!0k}Egz-<_`CMkp+ zeHHNMsTc)yd;!U26h!PPz|p0kHK_^JZA-A^%W9##Ats2mA_YYCRJt8VjE6a<KqWti zj0JtfscZ6w7$o|L&*F{@sXVAXplJa*gjS*}$P(NfMd>$EiYZVZzZW~?O_dUIi!LND zjM18&AlCuOs_JN!TW%GL03S}u^T6Yz!TCu%X#xz)e(>8qz$dvfnOq7Q`y+PABfu#5 zFd`RWFV*QK@)93IBY+z#Esu+fQ2*YR7nRTjaXR2MG6P>QjjV-QeuAz84D4>;Bs^dg zcB;gXy;8`un$h~eIgG}u(IQ<%6_by||8Q!!+@VsTLJ*_=BV$2gE;)b?LH7C!&i0Nt zDXxfia;0*$g*_YszpX$=KxS|X_0~!zl?R~8J`C*0ZIuLN!R1H{-A^0QCFCmJ2fGb{ zN8JIv&lG<_{(%tO-U6?&9&~z`e8U^TlH+7Su#Zk+pI8jI{Sh!|BB@8G(GK(rWFSXS zGl+A=fTimqZUXnQ2l$g5xId{*XM)6S@(?eA>ZY{H1I$(_@Tty_v0Vm+wgd1ylj$<5 zA@c77eKb<l<XYf1wus`88~l&8$^bUFl&+u-@$eh8LYGi!<Qy?kToCnTbC9r+AMA83 zj1f-)zyn{`EkUPyz(UrGau5yA0Ehb-e*gx49{ovN{2J=)imIx-40~NI05w74BMO1W z#(+*w1F{F<j<}v`BcF*mVx8y+G3dAkz8!xdoq(a+MSkEbz-#4HHGmE32WZzt&VhXX z1roqowW2Yw+vG%|IgqPY28l5sQBL+yhx8|ez+XnuVGutw{)%SlTq+anrL&kP3PJWc zPoIW7T9BE*!+a+RNj#da)2gI$6tHVuMU*TKvG5Hd#G)JNDu^Jt2*nF^aup3;SyD6> z0f=;+^-8E+5gi0}`U>(Kj)v-tV1=thQNX(Lvb&lEbw!Y*rSoYw`W2$oC#d(@sOG@H zW`YP)6!?v7kbMTo7ht}sL$oXgHwoi`w;Ca*!pY4O#UL9h1l4UkWc-=vSeljk;1&Sl zIB2Y)C@Z#!gz}Qi1(E+5V2mHmKNl6C^`C&bWo0wbOl$zOdm#Jk$51m)1f6b$Soa*N z*F<o`mje)YHk|)HaZiqd++Zc%L1xpb^Z;bi@ld^FR0-vE@XGe$ov5t#>pf@>CiDg! z4t|>)^1jJBEHgoTX#||*Z&42_;31GprJ_3lK~6&@o))*(9@G@~MQ)K?WR=5J8(=pG zplLh6px3~)q{MY}VKoDM{|_$&Hr5_uayyieWP=g%(4=%cNrbyYrM5_J5<$@ln5z;h zJ5&XK@Ml1flAy8bP+9x~b=GFE!u)_k*#Qmn>sjaxz5u>og$8L^k^tEE^=c}3R9)cU zDgZN4S04pC-4FBB1#d`6exU1mwrVYxz#OxI3yhOhfPZ}eOkZ0%o~EQZfnB|>H^I5A z0iCV_OU|qs>Z@>r^DlT^L;4&lzB5qGbyH2{Vo@8oz9di=41^3dGhyJji)ngV1}tc| z9;oVpjl}?x<(0XBJN*S2ib==O?X)y4PQIXdx|OOTyNGlUaZ^HOR}ShI4Eg+8dJYhz zHOY)m18Z4O_7(-iV6Z|z@W2sNfF!0{=vVN%v7|7Lhn2RLodkzFfOmk(sdX&6f?tpc zbUCdEI_-;7qP40&MD?y<g)T7oJ;57Z;HP9h-3Lh4gTw#>yH53#+hMmY#ar=0Ce=OB zPJE2?1byUyG5SFsd|K_19{_{8iOjOJDy7??v%tT%ryXfdx)|<W-T_DZSUwd0$I(^C zM{#xSnRS<J*5fWDkOV@4yGw!MR@^D>MOvKV6sN_txEGfIQHZ;2);GIZ_uZNAeD5#+ zPG+whdCv2kxi=HMK@5nz1uB?I^cz7;oJ3p++~!2c>pF~&H3L(;Ffafz?tRD~KGY34 zXbj9n3GeXYA-Du94@3sGL6&+FyoU8ciqLBW2IP;6#9M@Hs62Z?c6bu#1KyAvycGP3 zZ9|&TOJE-tV62A;6Cej=<JDk=I|Ek$=bQ<8pnvEo@XcAU>QjhI39HeA$Y8)*M#!d5 z0dYNnn(tR+COV2Rh<F0f6zC(skaPj%WMEJm_!r*M2v{i-nTBp73?(iATRuQ2174~# zo{p^tuJ;6FDQ(aIT(Afo0r4^k(7`K$2{7y|d<%9nXbQZ7oa_#kVXY9^=M%I988MSs z1dPxj<T!pGI~)887<Vop|5uRd#-P&)g<wT#@Q!QfZeY+ZVZTFGR>Kp`!53IKAokvn z$Fhmb0Y6+r&ms@OANBzbPKBz@6fA}(h5{pSlMn_w_ZQ(Ja7vHyJ>U;A;AuApCBSa< zfGRqI04Jam<3Ov-2ma#~z6t7=@xh$n2w>5ifE}f%75xaAER6_^AF4r~;THhM?0^b3 zHP{-Y;6y}=xPkc|3qE%cY8?((>M`I)CIrJ^-8``BX3!EOkk`8sdBhJ;jfbIyz$kOT z&H`XTRj?j)kYOZ%`I2EA<-iy_k#bxK_;O?r2UN$!sv&=<5Fw$N5CQx0jlcse)Cjya zA6p#Eg0b+i?^pxQ0VePa;LA*+fj}YXAsYHH8a4|s*Y8jnz6H)XfHZ;1qXpICFhoNJ zAU`>t3Nd6qR8vuy2@B!~S_Fv84ybK2;SDekJOsn&z+UVCmX(C*Fbo*Q=je9WT?4QJ zdNcxc<MqIwmcl!BLxmcGQ;>4NsK0^kQA1cwXhs7_HU1r#!2Q9#z-@NI1h@@1L6(AZ zKVg5@5|ogoo<n764=xU-1m^~Mm>cs$eIkPTmJM~%bFiR7<SzJ>7x<6R;KHB`#!-vg zL2tMZc-%$!lkgfC);qxV)C5NZAGANn#%eGdE(M%(5s+UHo_L2AAm5-m)k0i`PDQYf zYRryf;Qa>)HbBcu36Fq-eS`lC?CE@9NH)QT@JdVxtDX<oPz8V6Kno~@U%3dp_Jm+& za22qQ*8e?G4jHBaBH}M#g?EwjU>{$=euTgXVSvYVpa2u0s%(MXTR}Jlw!RNoga3jV z!3bccTELPUK+h}%W<d>@YZ0(t$HCSQV%GsJbpT$VDfj`?;uho!x*w{G7Q!IHKEQpq z@pafKc!C{_5B?W?3H3=i@&tI6W~e?!!Cby0H-VEZ086F>MZpijLa2gYLL}Qvs03DE z65$J44H#uDAmONBNq`jm4DUFPpMX4e7UuE|SZN&!tR1iywcsru;fc4v<nF-#0p<ND zR4C=Zk*Q%EyMQyg7qkX$fO>KVs{WObEh}K8Ens6e3Dv-#{s~@r2P{1wl%z+&-{Bq4 zkP=uiB~;1>fa!mOTmsL&8}tM|1cHE27h$XM+sI3(rM|&4hX^HT5%Lx?e|}IBEc;(o zxD`8$Uk5#57F6_Kfrop6K0~epzxo)gqZ+c<)!-6r3*@m^=q^}O73_W<`WE>Q?Bfln zNyPzj@C-b$AAb+CT@T(5SO<LnEv(oMY*SDd_zvS(0Sx+iya05uZJ<bX1w7u2dZ7L| z3cP|Fw9GGnx5i*c@w3Q9h{{7D<6Z+hO+;<*#OWX}_!`h<B=EEw@!x=>e+bz!jrb8b zvT;xc?Zuu4y9GZ$R2~&vi7kg(Y9*`~3oz~_sMiOfMo@wXkjcISs^1J4HV5yA?ET+d zegJ1UjL-vZ$GzZlzrYi9pl6Q2!r_UX5HEpKg8h#HY*2<9K|2`)6`K&)m`R{~tc8)z z0G6#9VkR7T0Z2%UhXPt^4uk`X76bTVG1Tjsz+37F9|-~QeLqy6WuU!Q!|tyIHh2bp z8L-kgu(5FHF#t$}QV}QAxM4v>fB@Dm#X8`lkuhi#{6Cd=hhRpd(RjoIHJu=+4q$;H zp!AH!=Oa_l46w0q;(JhFCZjos5z|4Wbb$Wb0U}u%o(MWmCy0i2h-M<fXn2PM69Px( zgq;}y=z)#1ku-P*++zN}75f>g&nT#J{tBXymsbZn0|)QK<xrulBb<XsmjZlF1kw#K z`!=vL0`NI0ph>y#bd(Gpc?Z@c9neEE(gPm~T_kkys*Aynz+d%4`lC8@7%+bOp|+?8 ztsoSl<x23FQDDgvvBkhm{RHpWNw^NI^hLA+!64%DupPnS!6m_O!G*wmk3<qsB{~Us zr+C5@v=!0f2G9Y{1&0QQ1fPP=vlKYP0l;1@1(szb;W=nYO}GW?1gv#GU{Onho3MU( zS7Zq41?6KIp)aV7^@ssy;(dVK90Uw$ad0|dr4dL^P#cHAT-SoXG{88bf!$mURyGZk zui;=pBcUG4hx+qx!Zct=RiHP70$)59BHct_hK7KqxdN)bB6K6+DQG9RfXzz;#)k!* z&^(Bk+d%mkfDcEg=oipV?-8;HN6;WJlQ?9tOTfcU2%dmCX$mmxt;iej+%2Fcy+Gx# zrVQx+D1>p24?YiW0X2z&)PqlTBy<B6=OrowPG}&+DPM38tk@UuhA_Mmx?Rpe9|0Ns z=>l+<q42~t&@6TZH^6LXW1)~gEXXaCMHooPfjXLiijaxGDK`Vxdj;zG4Oj$lF=fbh zShJo`dt67&@QyzCD#*#_U^Uu7Pv{RQ28Wv7fMx-|u@5ar!jPZw{h*7T1tevLCpzFP z80i7{m43jYoPiZfM#g};;sjsW4+_izj0ft;XJiX->^x9Lo<Vd7LAnCYAwV3u6to7n z!@h_S6>uCOFw!nCQZ_ma^vK7U1>W#yun-iO0AQtez)v)SrVvlKk7CGRWE=h#lK=)e z0_%~1!8sH77f_^lpcD6ooSlYFgC`zg6zm{im~X)zSQ})A3S=wHHj5Aiah(ZSeIm@I z4D`yypaai>T8oI-kgLG;kB5E9N2AcLz>ojGa&{C(0$m>9b40|0{J$FgGx)+q6gpX8 z)z`tAUIi7W5$cm%JRJ!jmqEAq14i-?C8FJc?;8e4cpb!sYv7d>+z;_`A1LQ*A&TXL z`q~{<{TJ*5?EW-h>iYvHB!F=gL!8<V9GV5qMSCJ?_!P*6-NC2+05yPvYXH^LKvh2k z*3N<GFalVCiT~61+XDX|Vf0ujUW3#_wmd{w4?8m+x?OtXOCSdcf%RDpEZTR#20o+~ zykQmO1`(kv%yteSvKNqXbAVS)!qkwp9mrc?xF!;2LY_m>Fk~cDDEEL3o(y@eH|B!q z&;ongj&=if>oR1*Xuz;5v6p}gPJ;!_fZdlPe$dWLXbxD=MesQaFts~iwrgSMRKaDi zrU^(0dKLJZY_Rn|LGx_Ig}{*R4~~Ji6hNLE4}O~nK9>XNqa$G>Fd&UM9nXTiJ{4BA z3Rr`|fKcV2S4%<h<`A|(j%vpNwPII;OJVmvLJZ2qdm>Ww35;_K#JT+tVT4E)=#^hU zzdsRt85|4mhy+VM37Y3L=o45D$bf_p;8)&&4ITnyFc(_@oH7N*F$54yNAP_o?0ynH z6R^@Q_?`0LHt>A`qJZ6(fimJlPePQUARX{ESR?4&tN*7t^uohnw)tS|BA9J8=uHA- z2>uc*`Ec+cXf&GvZMQ)8&q;`eRIssH)C(T91AmQ~A%6T8G=T19!%!H<Rg?f)z!ZWO zJi9M)4u1h&c_R1^c+^;6NNI=&JqQZ!5XhxB0Mj|~0r*0wljjE?L+8bOh;+k{2=o|O z@@Y`c@1R!XC+H(s1M1p8K@E(wGnRpmhhN!%1|jB-ftYMSCL=pxZ$AgG!{0N=*~1{x zxxjBnfNIqp_BIjpq+OtimxEu=56%u!F(z&Y-e4!_MYq9DU7(+rATRL`psqZD{oerW zg$?_TUj%RHOV|a<g_!U+pi5wQKv%yGv2Z8!UTCq0fMV{WQz3t>g?M-zx@xxL?;tyz zgoyhPypn_e2PozW*vAT(OIMihZBV{cSYNQ^OHf(-jwOS?yh3(Bw2T8gHJ}sW9oL|8 z$btEufGD*db}kJeqgCi^@Y_|8Z)c+?kwVBpQP_Dv<4=PLSQY5iF615f?HW+<lL!Mr z8+(MeK~Kyhh^K83KZrPjNMPSq08?KEv1|b#)DL(8Aoc@bA@5;L{lFPUqotsr6o8T( zLzs@PgEc(~5#}_+%g?ZLX`r5wK?7P&s0W2j0t)VZ=y<q?1)$rZ7I^E)z>$nboXDSG z$uB^G^`T1v_k92@s5N*2-f<Huhe1$jOVL88Eh-@6#)IbF1c>Y<WRH`<IS@Y*q4Odh zxc+wZJRp#r;15Tk_v;v53M=*ueCjX2L1B0yDEtoS-na|sb3EY_`Wn!79X11$zT?4) z;8sw9RS=W^g(~>}qtMTgabF<7@4=ehh1qI?t6;Vj5FIXpjV*_aI~sJ)PvBGCAx@PC z8z4rl1vOfV&_OkGfqu3bI#C9IN(ZY9QTtRdAL^)4ST-nu!_Z2|P{#n}kbxh+iqrwS zO@?Ur7OIn(z|~BHUX`n$^WB0v%8kwh?^ohw&~u@MsQw<%XJ<Saeg#e;BYXjCPlnp! z1=PSrSO$#aC`9g&ki`tpXYvU>1gP%@p$}9+I#|;Z=)1@d?g0#wi`lU}U|Lo}kI*X6 zB>F(6dxCt2E`cQ&6;N3sb^|=B9gy-4Gyy80IZ%221>^XDo1nYH4C`fq^~lAIfD9Kv z2I@iRL{OmfpabM7M6yHR4;D}hu3$59KJpeh58f~he#4K>1*Y~4{tS9%lwj%R;9d;+ zLLpZ^0(7|nydU~6(CJV))M7tF<}U_+x((}L!Ap>{P!|q__+dwP0x$goj|4Q$fWDe` zh^KV$mvf*6`qA!yl;Ct2^f9bhB4q6#L@_$H5)<Jr{0FiN4F#WE1QB%+dJU<^8Te?Z z9N)k=euj#!1b+w!wG85APhe12p^p$fE&;{yE9^^Ka6F(35|RhKTNdcv7z*nAPw*=h zPy;7GwRICBZVJZ2J@_rqXn9a)^@JLE4KR}wK-)*Lv7n7NLEd*jSLYza4ZKk_bRS-W zcRWIhK(*Y84aQJ-W-sLIGkAB{{}+G_o6!g8LSRuY;ux%Df6Nd3>20hVeiCv}EA$86 zgTHg=WT-uVK;Kn0sJt@Jl3#%yeG2b@)Pcsf0X++rG!!_JHhczN4Eyg5cEApU5_}$? z2R!^<^db1w6Eqo}1-71!Z-&hO47y0hVFgg*97e{%FSG%!x1fEXAF2%>0zG2Epgt&u z8GXVIfi_A*r$AnKj6%mRG7u~%7rG)kVX<K82Qd#sx($#m$D=m@Kkfwm^*4kJiorK* z9?Yf}_6w-EJ0Op}N8-`n(0ynZ^gpC0jH3%weLJ!J*m<l7P_P!?1UV=R;=(k*Nym{i zsMk2~D~qs&(A)DbR5<PU7Ni}Sfc}Zj0tB-O@Yq4z3IG2KjB+aW2zcvA<R0MQJ?Is5 z99oLZLag{ih`1}^iAm7y)Qp|Np$`ucpetaMgHSheA386#!Fnx(-mO@$_%DEQtMJJP z0xNbI{T0nYjgVh<17bf5D;^1Nv0$5_=OGn&jKrZM(6Qk83It9L#Pgxsst1;eZG<Pr z;h%uZ6{2%c=qG@6tAgk;8n1$1VS=>}!)`*Kz<pRT26({=^gMLsb%ec51K!{xmWJVw ze|TUgb=U>SQ!U_k5786Qr)Ed~MY3T{`r=gZ@Dtb$>=GcIX*d_wRf6&X!CpZ!pw{jK zwE+|C^%3?M-q9KQs+>q8^j{d!Y;+=IkD2&9c*i>!s|k3Nc`)AF_|GsO4OB8eqw(l< zqz4iSc-esehWoLL*j>=r%3;Pb=nT36e<r9S^O3tq9C8|;jL*ey;<2!%X6PnZ4!tmw zAzn|$#=vTy0OYzBZ-5M@!^a@dH3mL+6R>Fp^d=v|wqQrF?HGLJfGvTwIE$YEjn)cm z|46_v@z9yR1r)j|pqNhsw&)nF0|R#T5&8oV$|T5gz0pX}iKjuGWe0AvA7~aq>;}FX z6#V0a?!+y`)kGsiy2rRR_$aU!&bzU?wJx<g+s{N4q#?AAbP{7SV-@obs~>9{EeY-E zaazWh9vIV2Bic_{=Xm}^19T~OA}@q{f?dvj!cF1jGClY_+frS;x}&yFTc&xJZL(A3 zDfQQ&8yIUspM+~-pU2&caEGYL>jU>aKYRMSpV;0SaK-Y56OAi0TO6^(d7M?D7lo`) zf*?aURCYXKZ#Y{xl5)y1R8?Mku=-K`c*P{uK^3kN=__p;2ycWd6YpkdGhU?(iIz(% zLw;p<qq4E97H7-Eir{y8<*=4SQ>^CzUPo-EhH!Iah4HI81XJ|Uv``Capl6w-)Y#4N zMZKu`_gX`htCpaWJ51zD0z|e=79-7-hJ{h0PsA;c4h;>*&l`p}?QB@oN^RS1ooHKT zGHUzi3ms|HJJN!LJE=z#{|Fnwdq7{zSk4x(h7h?9qk>eHThO;eSO2`NuX|mv0PY!@ z$_Nui#J)?%I~_<Qh!0Q-eW<hA{?eXi>7bQ0SSyFs#;MbtHc~C`h-jW@MQE<*mvC+T zkd%&zI(Znw;OwFfG<0n2)$*q0bK{ZPP1P&v$LKl+y#jWeJqby86U~WQ9$g=6h&d(A zqzpARRv#|vR2cY<RoApAwabhR)~UfP-kJE=uJXPQ`qp>-7@rmLj8ui$eHnJ0W@OE~ z{Dbd=?+Z&fT6gdn^LKu~(B&ePv}^RwsRuI}J4_2NX5{-7=9}t|&ApqKHGi*vQ<Yx5 zphee?V|RFeM@v#)rR-1KpS-@~*-q4?ddU+?oppI*@Q3;Ph>E+FbIT8vvuj@|j<sJQ z&WK=j4)2kiBkVLRi4`?Q(noNW<qVuwv5I@W+xB|+hkiu|8#h^oW2>n0kn>S%I?B6u z>n|Ma>YLr^qUbHw(`0MuTk}s@TuH*W4Ihg>$5s5%HW;1H`y}lc^&<X!YHh}n&Z-VP z`8{f^zsXr|t2B+&2%AVi|4*)Y-#W*%*NI~5>3q?m$TzX8<JTojh<_b5S}NhLL6_R1 zv?0nv%F(SO8=1A$bp+K~o1Ji%|BGz6e2rwL<at>4=&a}^^6vb%M4!Du-QFZ`IjXv% z{X@4ySFVd{bK5|}m5fUMGyQt<Kamze2E8*ehO~=1pOojKss5@cD-xBgu03Zwi}5Ib z5JS;0>b=n7*u+k2vl}xCqdG7f0<qrDo<0uDplRM%(W8)G*thnx<qi2e|C4y9oEz>A zYl>Wy^hYOldVcr?GRbtMhF83*WMyreVr0|ivV@`?m8tD??&Xdv25E-%?irK(SUyV9 zDCsXsVao$Gt<<mbr*+Td1qS6R-%xrt?r&@=<1O1JUyx?bUX+y(e~!1%cUbRL-D(rt zD=k?ner0oEx8kC@-L`Yg0kXekcSE}g{*@YI_jTCT@t>rT!h^n5s-5*88owwDb<^4w z8a8X@s5_Xil70>2cUalUnktK)C^$)fN<YkF3PR|Y9fup=7To?Y^Xs<y{q~dSXtdP# zuO|^tWIv94(Wz_p<>d3c(caFciEW45)9eeJqb-M&W!1u(QJRmwGIn#=r}&n*nexRU z_7H{K7i)^$C3`|!W0_E!{QXkZ4NZ4zo8_iqt$LOEhiMHmPy)w~CVz>z#{Y}9hWG*1 z5l2&2pl56p#ht1rRq;(L41VtcYIoLHT37ON<^yTxq{xh%%!$b!p&b8W(VI!mzRq!` zA&TnCttHETNLq5dJ-9ujyQEXZ0?|_86;ZbQMZ^Kg8p<Ne?q*rl`!cjj(DJbDZ>tM# zi(_IDtSPe4r2d`VId?imM%HmokT)UQ{2bSL^M3Wh8p)61itQ?blZH&EeuKM)>q33v zvT#>)w}=aZ+cXW{!_{K=w{?PIm2!x(n<A-onzm27*|mYRSxATpjr%F`fqaDgH`#Xa zalrz1JMy_*);zLyWqn!GLxo?{(w+qOscxk3gb!nuB_B_jk#aV%GQ5GEgH_lf^;?<> zD_4}|mc1ywRgO2FvveoT7OaW9mcq#Fo!OGsp6rY#hm$!hjAA9J88s!vsfCf>S(V)z zy6F0NztaB}_KNJEvbyv79CjB*+M?*?ybpe=p;z<Q>Q5zMUud6a6r@(ZQ(U*INXJDL zF_o!=E`jc;-G^m*5(4rsY_{*Fno#{mNx?VPmzVj2$~QG0)6B4^Q9Fk}PTP|`q1&q5 z^BM2s21}Rm-%`7|gRL{m7JNJXY4PXf#rGN(woP$OKxMqr$PuYGGRNkA=y@sEn=(Uu zleEWvKv`5BEZa~zwD{E5&fm6_e^Gz%vN(66uXbFYHK5axw3BJiQ{{25#cZ0*exzY$ zzT?B#yiP^S%TCwIl}k;NJ*%nX!j@(Dda?VT=<_+}bqXRapf}*hUGsEDsu*9dzFG9D z*T<vf;<jS^7|R%HiWrx=D?7GVdf!t$tQ}5;#s{_=`ZRy8%KFi-s9%1MyfL5l7F=me zchBbj9V6{DHG4pp)fx4j#%EbGObIImxq+Rkh2Ix^yz(KTpsAc$=V~g`Jhx3F>=%7c zqx9ttarMpVQk(c$HkSPjS?GMJjj!~4IQgvcS@S!z<Y~(y*BN?1*gax)(#kHGeOLo7 z_hDzhju}pS)t=K-Th*y7vFNWa^FAki=~_IsG1WawFfr-pto)pxdMJAg&FzqtlzKM& zHg&wISJn5tAO96T?fBp6uYszh)`+%Fo*-jK<lsz4U;VKCgI{#bi%koq(xZa9_VJ1% zm1X(o-)(vG+t+QitBee6KDRBxozyM;Z5E~bo?b_Dl2QU<B58Abu#WS+f8o%AjBlA= zCl<;oyD8VZR2){~sq8b|n!3_Dmv!8nY>etG`j4{LQe2&s_wvn+ciu0Z%6hdFo2Gl# z6Rf;IY@o~8zQqGu`fcj^CbpU7@Gdn)t6tQlmR|h!_`{dC#?QR!PF5eIA>w3*4PBn) zj_&q7_fXEU%ulfs*_dNM^NHdaAE<AJy{CS)6`!curmAoY*{7nHb*}Em9kQd}+U#w~ zjbYO`i-RQNPxU#4_?vw%w!cX(xLEr{zt2Zw4w0(k!?HMiP7Tf+I5Kx{;+>F!z<s^D zp|bMTch<L|AIjft%rloxQ8!^brQzxRoRl6{x~J#*JHPB0mi#VU%6MzOQTgx3q?bKk ze0=+;z+L@|a!LE5;A8&g#Lu}s1{Dk+HAK)I+DC-_NGI&a6_0*2eUiTF@T}8|2cIMA zQf(TlM;70~pDXBpa7gU%e+Sp(%3?Ao_uB4M9QYV~u6l~R-2JBI(~0l#trxxj32vn) z54t-}J#O%@&ONmqUqrX?k02Gs)0N-f-2WH7x$^#&w|h%{nwtRyw^P)w9hdhq44XXW z&ghK;%QBZqW!O2**~%07x8F&hYaVJJb$&g&WQDevuuuLtozmm@fG<NtL(==jcI73G z4&nO9irm7~*V#`$JPp2jk$0l>N^`VTN)<$%==y0$)lZv8Pa4!KCpT%mq>c8kyF}?P zIq-VogBy2CpHBap*|fpgkI^QdpVHnXyLZZ<wjo;w6la%5O`;gv^p(rMZhSxV?Xb5o z?|;i1^rN#v<6abEO1;)gJJ>vA*ns@*dpcFc_7jmP8?D*(CEsLkSG-#BPW3IjYOZRl zbt&G)yBb&CWp|%D{V(($)7c!8$L)eYutuq`)buQ#_qoHnIq!mBkJf6<Ka<s>n7GWe zxtYW+jIJ3ur#tJD5=09SUE8;MUFqwRp+D}IrBq~Ak7zz%T7Y1oXwus*-@6IA9!j4d ze>|)z#80X6wCcDuWApcX81iXtQCm&1T58)Dv{ToI^oqQfhUPBq(U849rK{{RZIx%D zF<n*DaId1Icx_?k_fIuvw3WU=Tvk+ViocU4>p)h1$HmF{QIya=Xjq%KT39svYvb3C zMf}S5O`UYDwoB*>L0jBE8E12L=6=lbB{oXWu;&v8dEOiDH>@cAxA0QYo(i;ekrh-b zMy7x!e;2(sacqZ+>1$HMqmS`#AycfY)ZWIXy7hJJy7e_rs-M+;ZQW!Zi9h0Y3f~tO z7H^NPionAn<uT$%+&t0@cY*$7^SJsm4MIhsCd2f?F(Y`8lElNMCt@BXen`9-^HECU zE+O6U8y#cYlQnZ2J62z+TG`;zc<fPVHM24#OYD*vBWj|bL|+fj7xrRI2=p-{npKKP zEwPF%%DGyavA1=#=TE{=j!!Zms$Xn*G%f6s0Am(W4ig#!UdI~apX!~8sfsG~1{2*` z?aRkcl6SMbA^(VH%Qnj{h?aAwQl}$DKGa3B9W)zFAKL2lTMhrT&vH%*7Lt2%zJ@Lm zcMz9|q~dF$AA-J|9~5m+Yfo>Rrx~Vxu3o8$(DgBXx5<2u(It%gg0=FZ$p0d1<jaMt z*uRmJ@N(}7``xx4N^ir0`ZrAkO=rs#|4?!kdxqe%q;tfpm`8CLu|2}4gmfX@bspB= zQ`~G!Xt>?*r0KrmS4~R0%)6Rm7L-I>h~JesGR_%3Mtp>y!WvCp>%U@NtO{!|*F3C0 z(rPulvgLWm*nHAW);bX*DlVZUVN1**nVjE;b{u)>Ew%k=n4!?uj;cCUEp9rhYjZHs zGR6=7EAid%`LSt9ktx)~_=vu|zQ`q;LO)q8QC77aZRFG|>mMi(Q$%1FvzKIaRBkLQ zwqs0mbpJ?^{J)SQ@_J{iieB}gWKfB)TvazrncEg??;E&ItCRem+}?%V{ax3^X_F(B zyjqgazt*0u+f{e0*qgWHYh7u4tJJZSIE1rI6dRG1;7-fPI+VptPl(yWyA>!iSR47( ze^p#9SC?HV+g<Uao^PNA2k@pwwj@4DK~oMS=Ek3i9Uj#|g3}MVcc>@S7)lqF^{&~| zY*%g2Juz~e`Go6&sJQ%2q1n$fM<r7utb+5*IN~kO`L^tax}uXGXM7l!zp;9+c8KdJ zVFqiWa7~mmtt>aL_t@@|j{Cz|j0DfjHj(O5)5YqM-_iU}-&XyY*ZkK0mQD`KO?0L5 z(#ED8P21F=Q__=&37qYoWv$lIjRm_3hm<O+7dN&mUTa6%9E4@!PbqV{uISda%iz?N zQG>)wxyvczeMZBCx;;g$pNV;uMR@I9o!{w34l)`-Em14ewsbw%J+`YhB}{gJw#b{? zo~c>T%%}-`=M+Q~6qHh1y4f_OywHkBae_IyF71zuy_ql4FUGM$g*eM#u1zZaTztBy zxG3y9siJFxRDZ$m<8u@3U3&Js)iXKgetKryB-sh>9%Qv~T{Zb@<lFae9_F1a@2?zX zEebwiE()8NR?uxizkdDp<aSSv61Jf+wjt_2>KaO;3Kx92l~+<|t9@^JNmwDA8aFJx zH1kQ;kgR(d`#VgE&f%efcCDtWwov%Zn!mSXT!pk@j<%<33U$5oe#(umi+gVFo|olL zdJwjT3tWdIs6JEuYvG~KPd-mB++B4{73r8tr1F0XKb&OC*xq$v*JBy7!~)4pYNX4k z8B%|ytgX=S_0MmYOQzJm(>8g`jM4J1iQ-O+x|DZq?D8tTYwWGiNYXJ|fueIom%{Qd zeZD%2CRLwTiS1JfH$q%7k2>ASrT1LZjh^X>n;=Xer#pA5yHyV?YRQ}TIqlox(pk*| zE#ZV)f~&D#IwobayLz%7r72=(iUw0gIX|cdR*fv0`R%{_yb@})u~luYL<78pNJVN+ zmzlXg<tQ>!lN01u7)IYE(+9<cDrNDj{1pZ9-woAc)H>$~%FNK6QOwlEkPk*>-AsR+ z;F6}$Ke_+ajc%A#R#sS;-(1-CV_NMK%~6kvxitLm)OTHOb-SKhmo+I>7o`-0k}ldL z3hc+#&nfSwetcZCwN9lQ<Q7x52&3Y~os;|M20rQcHQOAwg7?z@REN}dD!%Z!;%)Wo z#qY-ysB6jXeDV*uHtl`R;+|J}&FcA6&Ybj|sK=b{zALKfWlz3(K0Cg2DD;$eZAj9$ zxC6ACVgGcT)1#sH^zNigcYLX2H0vs|%KlGl#*b$ouDrVbHZfmVyRmIi;1qp8Xz$3J z)XePfJ%8$Rultbnv(g5_3UihMsXq1nV!`LH!mld}K2=m{?gx*CS`$rOPWH^{{jvu? zCp{xN;i@nX>0mHcjQc$7)#3lh@BjYhFMHX%)2v17g)Pba?o$Su2HxoTd#5!qWZ_Y2 zjVDbvqpHJ~KVRK{8U5k$_sG^M&Q?kf;mfG#)E8Y+dcW&0=(9a5Au5l4%`rh0S2w%D z^nG9<;hQ9X*$-LMbIW$}8Of>yMcT$rQ#wseAC;0HE0@h>-Sf@TKCW^WTEFJyQ+`lt zGnIOi-MfTVB)Oi%>~gsK!*1o7w-X*oAG1B^XlG|#WP`KxM#0!`!J?iu9PLaOmHbzT zA$)tn%Cym0o-Uc0GZPm|R?wz->U7f@+!Y^7d;Tc>zOBq%dtJTW!Jr(LJWnj{D9ret z-XpaszB2rj;3sNdPqtQHy|TnrSX6SLlHI~KUGZ)rb>rTauTCn=Aa{w*G$u>K6>JqQ zb&fR7RIaPDmCq<$Q8u-DpyIZ9AikG1QS>-GDmF49DlsK7DZWR<V*W0)$#zQnM{`Tv z!a99}qB+odU#GPVLXNPx(%)h>C8Z~)#A_lxiqp9!(k0(Bt6ZPooKWMhWYm=@EC!!r zAAXi5<VFgc!gj|w5;Nj2hYu87qWtg-G(Fc;D>o=^HRU$qO(y03wqIS5q(pw6bW*r8 z{8;$HuuihIVp`}eb}?bA)1x1ue4+3v5q+*1am;hcyl3zv#vj7w@Lkc8sEN`#PCLno zB?d&^)AkL<)#^>nxefm`P0|`{jNmV%&Wu&u%YtrVyBvuQiD8B9;=Lz6@q}8A8sha` z3{L$LZGX)<!+XbmRLdSOX^+?+87mJ8M+ugMOy`9&?-TaAHyMhXB(<ixlM0T$i@B3y zx93qHkHBDu%5KC-lNw?Xc|ETy^(an+8z+eN5<{!v*M?UOvewKtr>l*iVGiZ*5=!Jx zqxU3?OuQC5O5T<846|7N)7G`JT5dGnt>0IdP|s)?({|dwhP7WB8_kVd6FV+yXIPf> zL+DIaXZ%m|GDTyxq+&}|LE|dTDARtM(-Tho#OoM&I`u-<tIqw?Eio>UlXZtQJV3V7 z^gWwylz%A7E`C#aNV(Qlf;Td{3I<B;5yRs*q=csO;*Ux1Fn0tOTY74+=D!+p>SonU zt8vxuQEq8J8Q9B8kzbAPmTK?7@6eDmG8PGY8A77)T&U(wt+9+-dbey|^_?cKCeEVw z!}7|~l6)OkXNo%gk<=Qtjkl0|-}hJhY{mV`8^zc1cNEadE;qk4i}8-^5?OAdyJJ*m zU*}_)gHl5x*YeuXMthC=WNmI4@?+VL7iIZ1sLE<POo-*rh`5`iO52m()?s(@rkLHL z1Joq%d*gh?wrWvn^7rV{X;qQUd)j{Y3MehS&GIwxw>z9q&r1!&mxr$nxla<hJ%*%~ z-0GY%b=icPSItQ}%(e=-#JMD&o}f&--|0o#kpzCk&CqJvTi*fWl9r#VUzfK0I8gba z@vP>9dB2ZGeJ!Yrs7#!i{&T0Q)Xp(`M7J0T_(sQ!Hil|ZqopdZtfgF0C)QBx4{-@| zW~g0uGO}xIzxX3@>!VsFr#Y1blDoI5kM@qLLb+XeM%iEeSl`w9)<2cjF*G@BMC9oR zpS)EvQkc*4Fq#NVPX}XEYf6Ks?nYyja+hI=&Fp=HZfBej9Fo6?Qbc<qwo5*6amr16 zhPSi*p|PiCsA6$*qasOPW^clJ(`IsKh6cn6nIr67_{gwd#NRlVh#%cgOsBO^)rA_n z?!95Z@vQl*qtPEhKESysJS$;|M~6IPy{5h(rXVW+P#42;%<x95)}1hAIkNm>G?zS! zc9FS@YZR;z_meCT3b=PEPp~0y<M3{G(0$Cc9$4Oa?d4{+vnIeGcVRwZSF$n~8{kaY znG_eLk~|H4>OEqOGm_il+jaI6-k*Ye+>KX4BY>0ngFjSwBJ=_`igpFL;!pPJeP8^Y z{YO0l=R*5l=V^Z}k-}WadBWboa8o{zl1PK#gq<kF=zVT`YP_efGrTfKxz53@03=)t zD(GJ%HsdN64;dP=pB+Laz}@UI_-N?HdE@`fwZl5oTw^u4uVHtH9VuCqAEaoKnjFg5 z#+k+2!qL%=AzeL_?E~y-F1;t!8{z)Lp|G8>H@Q>sLzJg*i%bi344g}Sjc6xbr<|i) zAkM^cy!%~st_<(0Kp1`u&kq*+dk6T)5Au5EEv}B&hZ9Broiq!215D5}8jGFwyt8tR zj}05zs~rP<BZ9S{$=4!b#A51hHjmHa6)?()UxUrwx1RpKZh?LNk?wGt#=Oe*w`V$X zl8Q4gvs&T4oEBOd<6mYrYY@{(eS`M!U2*X3rH;|=Bc2dXylcE;xO1nkgurG-^KhPw z`xEOT{T)?LVNymC?*zTh;q8Cx4r<K0CGB<g5ce_9H(v;{kLKhzNoPk8Bc4b;@V3#5 z;6~XBEXB9UKB>*E?Ah{Fk**tWJ>(lom_v(U$MI(g)zY-^>~KtC<4vb@@<-VCrrvFG zgF>rRWhhZKuTAM#h<4>D#jC;!!v@HImP*CzLgV>m%t+z`_fN(yDw$$V>(81qZK2j? z=Mf(Xr84-TzlUv&9v)K|p%6dh(rF?z*=Mm8w(V0FxAbhvYCfrAncAGNI;7=H8*hSe zl=OHQA^eF1<3^ER_}19+jED7ub#JtzwG!Qvwh1<>pG#J7%cV=Bj>hze#=>7p{|X(! zIZ7E8d}vG5jce)BxT0x(t6bOH+{K-OyD9HDjlwv&DqJ1zl2L@)S<eY)y!~x+ji<De zRME;W%8{DYZHw&<0r+T^{V?>N^hnq*;cLTe(g{Ka=Mw3=Pib9f=%HSxtW~|zVuoz< z6zBS&jbh`WGIrDoU_j?eqC?u4CXzdF+tJ5Zsnj*p)Sj!)R{W+{+b7^>>EC(T!YWBH zY-Lny)aLMd(K@yrz3;l$e%H{fJF5+9wA!17?q<|A8tUY;g0<3_@?T}k!~#JJ=MuA! zDn$QuKQa+CR~0NpFBR7iYkB3k;n{$}`SrZtB=uq2!f#2-`1Q0r^m|~k=ZZbYJh|<u zR<2IdkWCXkF{Gc_y9IKwRB}Z8RNN@(B4G)<^b7c7r_Oj#vp}_26VUH74sGva?c;hB zct$$OF^gw~b&-t@-N5-mUrvriZ2`5r#$wYwRbErR*KRU->~s9%33>{h@s#sG*eR@Y zBt0Tjx|4UB{LR12mE??c9I%{jLv&v>3A(c;h1*GFvUl(|3A~{N!u7)Up>G7yyscEs z$1*E4zqFROSX;;F4w?Ms+g98qKvA|rd^+lG{GV|z!#acn=om?bpY%Mia1Fnxkd~a5 zrCP7;bMQO)7OSH`FOHO*k?#wi5S}gmjd>2svp+CoDd#lDww!NuDEF#A8aR&g*hU&N z#3vgS^&pZhUoI*NX=GogsIiT1w%MqrwG_9wG^g9&IhBD%;sE*(_U@1bS#4BQ%pc*X zXa;*WaiVvWt*KqpM$j4*#mzGmzpK|62fDLKyE$tGQ-$xvOJtR@za-YsSZ)Hjn<viX z(Tr4mZ2j75R*!ExW~p#mgMZMCq3^;bM>oVCiMc5+;rr=B$%By{o<Ge-tzGe7V@cz6 z70WWoSB8|6OPP21FN9XfPhp+I!zHckNa8ym-63nwF?7`b&?z(>)sM7dbB0Ha5E(NC zwbG69OR~MP-(*|FA^iLF<%9-ri@9AJr%utF(F*ky#wyz`Pru+n;#k(q&{dKQ>1W9` zQ6Vp#b_a3!FT0OgZ?wJE_0Z9D5&8}7m)-M_`IOVl2L5t!vs5OVE4wcp5qgat3}!pO zw3q3QsD`PUG(!CkL$3Lhdkm_h8~6-ac_ck*viz2?f@fn~Ayj&|+m5$cm6Mwqnr5os znUb9Y0zZiJ83OJb!BE+*sQPF?4WT2L9npVWuiH<xeKh>86RGXW_ZpFrZ~rfFf%ZCN zl~^fm5zmxFiAM=;bGFcP&{*d(y`@#97@?GEcDEt+wO(a#CGi{UkhnwS_?U|^<fv-N z49*BL3;FEVg9o}*u&)iuhMCF@=IwqjA&$D0xso?A^rZN(JU-%-tbqFm0dtG3(~Ow@ zZ-c+>lc7YLp_7~E`m!i2eixZA@>O`P<dAT%@J8qj-gCMLUF7=7plMmyl+=1tJJc9z zt#CyK_9Jg7zw_?P+9Queu%-L?6KMq)$>VWk**L}zO0?;6V^r%k1LkTWUF3cXC5RWx zeu<2aCC8Ct!owExx+BTfaNQTxJ!J=Fy>gxUqeid0ZC)Q(%an_UgwrC^!%31m{9oCB zGZ)boBX1lz`mrsly3KWewxDh29X)+*!P&%h%oU;O;jH*=$&ADU;WPL;N)h(Reakx1 zB-U573LC_AVJ(`rX3uHTJWge3t*BJwk~D{-(WT)_Ld&TV-!<dG){3TSEjwGEwgy{& z(Zrf2yVerM^97Lu68?*y5v>nfDp7`T*$b%`@OAcI)idh1*Nm^9qIj>LY47DP#~s8g z%)dqFq9!NYO8hG>GHedlL%8Yd=VY4s+Uv~+>ME+Q*PLp;X`JfUQ|dYUgqP&{$n7x| zasK$6nCs$>^pXBN^BfJQh1yiv)S>xo)7zFCI-+w5p`Fu9wkW1Y{IS@^sDC4rvL1rv zw7&w&ECW;<>iSl>sy{WXZQZHAW&0;!CHLl@l+KDxPhOO~Ej~5!k!TZZ5rOPmX7lQ2 zDCXAxSNo;@dCMzZ4|`rPmD0|t5PXq6i0m2dkDM3wT=<pw7MbV%*)q-`QkxW46)Tl5 zG~<jdjz-K#UBVqM+8CA|H9m?Eu}Kyt%wz2!cs+}(Rzs%xiQ=JxsUmC1ZC|Ys{%s@< zYiLN7c%A%~JX(51n8@$V=!*X9nPppL`l36n{-iF}-8LfD>23z1qowhNi}K`nL`p<Q z*?!?2o`U`r+2sCY9;kn&RJCkqWojR`8O=|eAA)@-Pub@~ZL$FoW5Xthj&kSFoghxF zaJ{vzGEUKKZ>>{4)Jv^*JZBI)wT5+!TNH9yJX&s)-4Wg9t)eeOsP2uHfN7Jd)VR#J z+4QGbWBukd1v*f^voG^shqQ$Z4_U<XvM(@2v^!{sx1V*YG20Mh=x8*X&)N-6nx}gJ zCEjCf<o_z#Aekrn&N~A)5+{&8qtG+vq1uO-R_nd`ZRY##4tQshlhT{Upg&=RbEF|Z z1ikq>hLVuzk9V?dQrk28Z;mx~y|vLg(ebl)JVK*c*`?e^Y%85dRg=rfmE>=v#pq=J zc*iC49`iOk<~a%H@$Q7L78~)?1QM+Z@KaA7pS6@S7F`eBL>b5<BpAHu8DLMe46*!a z_j(RsRKj!UoL)j$K{`S$XQZ)(?4k7Y1iSy8JJls}6}UdTmF^92%ldWKfItgzJ>zdq zf8G@CFqV}z0`5Kem+VKs1cth`*5jrl#&AoHYlVLsoW>eS+ypnBZe#|yV?!=;>uFoi z8~#b|XO8WT8mG+F+i?r-2Ud6%V<p7i^m}X-=PfIYF^ax`K8c2rM-UtEFTSzPmA1b2 zMrT(~u5Wl?FMQjyFgO#@l3N)(_B+-yMm`1ZoriCxe!*g}aDRb|YcI9<Eya#v|7*fn z%5I7d&U&qZTg4r$Z0-e4H%30u6wLFI+((?(ox5CHT@+`LUFUf03Bf$Xt@KQGHQU16 zM^C10gZnL>5&ig7e?M2Pwb<NZiE`-OJ^gjT2k?b@BC(Fr!0g9s;hVVgm^{iHv?F#j zaK~@)9&sJFg;>^EUfDe!JC;Gpgj)=#aEkCCN<Z38x|Zf9zd=^}E;%PTM!F_?ufZwc zY4Gjgb2wY@J!+-IGT*bD%;oe)<N%rp-;imbV<|T{(xbI6vx;m3UDE;?XenVFbiscl zE}&eadsz=Sw^=O|6Mo!x+C9Ye-MPfs$)T}|Es0jW^Lbz-@i;Am^@6>L-H&~l)580Q zKav~Ch$H^(@8Qh1{;=xpO6N0IzN^Ny+pY2{u}kEinb+AHSn2cuWCr0foSP<x6Bv?$ z$?g-@v+bkIEA5ND_pnvaVRW8wlr)@{&Ti&U3#AG$b|m#B(k)Qnz3RCQH+Sx`|7N{v zt#EYrbwE0id(#YX8%P7iNAXb)(w0y?#DA~`&)<#=`+A4iz0Irg&4g1L{eB_VlQ4lg zj#<Wf%Pgj4kk`VwEUVzOyi`InHpn;7^{3;9bDOs+_!7>y+X1~`qfjle7u7{S%=m+L zm$VBR5j^Kl_hUYj_l6sD9Jb$ZWO>|y8z|gGK<!VPO4HGr=u;W@>6fWFq%wT2U+B5% z%5c-Y8L$h7;Cm<pzQ?~roJKuBKTUr^T}*00mcw@}<KQfgGycooO>T|zsdJs%>}$j- z(DlSIq)O6Q@?1(ES{3~PeFK$BS_${1xcvA0A%QM|^Zt8q*00OgGoTNqAx{V^NknpQ zasfG&Qb>mOAmU5{j=v5p@_Jp5oWq>=odkD{=Y(%x-~mo1jiT*k9%BE*+0Xt7?vG}W z3(#@cIbXPYv!l^A+BV5P&9%q38as#1hx=Q9p(iqbW}RX!V9uufN1TPN^iFrC*?zK2 zvxM4?JI1(Y``UwK!V}6X<`mu*K}u+5$TrSW#(v5T!Y54TpX2UsA8t-EwVJwG5f{sU z2<H%ok@r(7s0uojRl|D2q|)0+*YP>Ne_a;GSclPm+ir)W&%U~jdYgljiPLG@m~cEf z=N;!g2O<}{GxHAhAz@zdg~#B)tz#^MEqkmod!geL+*bY)6;eMjXK`8l2|N*JHS;d5 zJNZ76>hI@#VLsYMGTdrAZblu6p49;f`Y(APV<C4}=tJ=wah@QFqoOvUZvuAD1Q*dU z&)U=6*nZ8D?C9@(g(px>GZwMdvl^K)=0HYo`f2JB(q(+3m+MHeIxI_Uw;Y)3U(W-$ z!|@2Vk$99gmzBZsvOBZ((|=I(qyT)~?}lAF?L}N4>`&}P&Qi|+|6Dk);O8KQTS#=~ zB%USYAwPk=p8AdO68|eW#xM4qwy$gNYB-@gV_;dfy2J5fWEtZEi^FkoYeLovy~1&V ziR`<iH2)_1YIAM-EpwYW*L=2pig~-O+!I1DGm`~!(PiO!!53aXPIs1ro=1L<30%|L zujo^B)AjF-8?6Q>)7#|li|n9;v5$ttfZp{k^dD{meJl9^+~-FNe0CLDxNSqUhqbee z7ws#2|KJyi3~GOdmAxk9xoEp&i0A;1N8gN^eQR9H9cSzX*5U0XhAVnw+hgk#pNOPj zF6PE_i`WJ1dE8w7ett7&CQXC=;XGjWm{QFtR;GQfgXDbc+~L`V9i>><>q8z15<-r0 zx-d%MjBq27h@S9YbJ$Gr`Z_J8?VELxcOZU;&`v6(idZ}N^`bP{YAHQ*AM-mQG9ZIn zR);wLwN{z@`XRb4hUb=9UNNDVwuUu;eStNewV0jGea7w2{*}54U+!LQz1m*i-e95I zr#Pt239jefcla4<H}0>Y9MK=4gZU-wYQ`wqZt|aKiND%0y?wOdwm!x9!!p)2-OtA# zpj$}?X-C*DJ}LAb)G4Pa0{pf&+x@F+i1VB6usPBsHa)Tg-LYr{{VTf{H;3Didxv|5 z_Y40d?*Z!&*%|2VtT#uSnvC<?S6lQ}wtb)Ty>ANPFk>_SKjCIknSjMr(7Te`;Kpvm z6K9WVFV=t3j?@omk9B4T<`L4VR~hHnVSJ+Snm9w8F4)6*MVcIZ;Ldb}*>Wt&?KQ^V zOlK@i*SesNyq=vKQYSbocoTArU&HOl*3!BW#&~t+g}Pp<G0G}cqVA&cck5jj9_UD3 z$*B?j2)iGd7TH6-J#-Ok4v8M@;QHHqM;}nlYE`#R&`vO?dp(3lOorgOWNp~ch+Yx6 z+#*tOu94n&ADB05|5H3`>eBSIS*ZM~6I-|VA5dcX(}2}rML8qv@-^ad{MqybB+oUh zeVlez>+P1<*8Q4L6Vds1P(*po9ubO3&qi>gsZm_HHH1f3VP<Df^BKc;O_Fk9OMJ@= zrB~m{?g`e?0{mFXa(Q9ci?9%Rq1YLc#bOYpo`t4(_4t;ire9h%s+Jo@Szmi1(Q}N{ z(B5IC(R1SF#vY2eFZz`oN(%V8*?JjHEB|SFUH`5ApXPXNthH-k1+|4gRTdW2GnN}S zFlKakhVTtTiXXC{({FG6t?6^arG`~axyngxnXbo#o!mm%#hAVc3ldV}oRJr$-T6t> zR)30Rxq5kHkJ{pz%k?u98}xZLSs;Tvm$O^EGm;gbnm8oBYvgO;4TcW?)g^5|tf95^ zsE?_AU-z!%hT)ydM<8>iitk4J6YGh;6Mre@VOYDsKzkTCWKpV(jniwRYcAK$Z5*#W z)t2BoM7Ya+EWaK%Ecu`0;|blPd&xfYOQ@#<g_b?)UJbuib*g++6Vh^DZ?u;L6RDkf z0_o7`eTk7N6^VDFbi%oGQn0V>iQdyXp|QH=X4R;gV@)yokFNRTKSH=+*Q1xlU5Vck z-!C>T;)_tm=p8uJepy-3psr=t)imf8=XJkZ%Drz$KlAR$XfYS!yT^;76J`96P(}yB zeeW*IMyM%z)?KM-tY50kGFe<V@gr0MmnvEmwl4Zr?8E42`Eh<O^-a*_OtKi-X6v%l zBbCEc9DTC&7k?V%1-HMbkMxUlrL<8pRa`4L#hwMl+ICaE>Uhh6mQdvzO_d?XJk(+H zl@ZyTA>#P(yAe}?UybL}m@mlh5wU-UW4`ICcD1TZm7;%Z`P+LNt)MPu4dG#eo#GVP zCD}glR^BVhrN9bDck^xIhPH_YoldA*t(UY{IQ!r;Xw$fZ1q(tA0*W9xq?VV&`I$bL z(CE#x*0qh*_cJ^*#n~cVV(%ya75o$VHT#y3Bd3QAmkj3bq<19RF_nL@XPbS7X}`9k zilQE1SY+$u&m&BuNmws9k^K9DBB4OkTi|2GkpA$Ev}K!)v`LIU;{;Qk2{+put$`xS zIi6FzK%OGMA?YjJ#UIJ;Oshv_zIE35`h2BMp;DT3&&+kM@j*9XCaoK1M(A;AW*A#; z6kcN26QB7C>`Tl~jOz`Zbz3x-G;G6stHR%h`i=KgB$7^$wo6t?){6C^cep*NdjfB* zQ}iXOP*t*~L?19^*zUNx1f~(sGM5SBq<iHeS$E;DoHNu06bo=Yhi!GndhKUbjjCM7 zwH))zM=B^eER^40sF7@yd!eGL30cR;L+##!c5A!9C^X<&v4*YLq(5z0?%P0q!mSaV zmntP{Q8;9-wY+=G{UovfpyfC1l-3uD=_;k}XnVQC>9ZqmsA}#g$;*h@(Rq<WW$X|y zjg1ogI_FBuPD3xXP4QZ>Q@z-vcK0F7VN`On1bu}!MCIb?l04By{%YEdV4gkCI7Ls= z_ce@c+uasv<eSGiyI=&`cb-GE4@NLmG+r>9*M~iuK7@2Gc**(P<kTwF$FwzV$<{8e zDLxAJJD~-ho-GlCcMdO*%-~DupHX&Tw)?D&Wa4O(Thm$&wC>h7+6Ul^=sMmDVTEM0 zd}a8ei1%Tg#V6SP(K-jEZLs<mWx0~7p03%TduB{=yvHgT?}g&<FOj1nvSodQhoMrs zLm7^HoDoK|a&GhXW{a|S+j6_tw-wz^J<2W;<VjaWBt|U^PZM=v`OvxEf%fHQrE!cQ z7Hs>Zs<+;2Jr{UGxyYF;NDyup5=AP}H&IIHZq6Xem_W8I+EA(<u4ZV@>dzYcTi!Z0 z`+5>unTv(&uo)5RFpuPepckhDeKP47W_OKlFV{?H{X;QZb;R(*_Qcl%y+;wSuJEsm z2Ff1E6;f$v7&8;S<QZstZ#r&Rsxxb{H5;{~j5fyuJe#2osgqolACP~P9u`Lncktgb zD~Tt3(N;{SQ)*ggs&DD%wa42zp0&XuVmGEagfIOppC-F69L+sPTS^cI=X##nZ@1^^ zM{BOA_vxD2H@JU8;%MvH|MF@=D8d2aZIU74?;%r|IfMz`O}2&Ye;N<9Z8cm3jc~oG z(0(a!hVq0<5dAITNKOi8hJ<imGv83<gjv2h))al6@@Q+MdcL8|(%@?FpFlQHQaBGq z*6>Hs2cnM4HuLkT+wd%JH^*M{VZ+~Qog!O7Q7<r^_fSb&*fj#Km@gS7*(Vt!;fn6? zywu2GciRJftoo2@yk?K?7sFBGY|A&78}~A{2@ApoN6ro}mn;zU<{YM9B8|nEt~<uX zsvFJso2RKJ8rL~@1=kZpX$U)7P%WJic_{jM#9h%a<}JttTP<$mU_&?UU1ehnUy-Ys zXvqnd(ccI@NuBcR@;frOv<l{C=lDn*?<Ug^mA0ioaaQfr-!$>8KRJ*4caeVMQe@3h z<e19v9ir2m8tM%~6!x#Dmvx6u-ICh)wP~6<&V1Q>fMB5QVjKBF@!_!NQCp*b4L=xq zoHjZz%SJZl>EgBT)zPX%<r~!ngU(Ta&f(A`IpMJpbHlXKzr`fsUEUPB5A)i7XxS}2 z8{?Xd%C-7y?GNo+y$)n9!xTC@A}#J#oHx=UrgIaijmTcV&6#fAudQs^+{ka<rcO1# z^o9_7GydU@4ecUDB4p8rq87=AhSX5v{1U55zf^s$bxliqlfOx)I0f3E8=t`5Dmfo{ zBIa_8B>G}RS9!W<0cSd~hwG_+dkd{W((r5Z@2W_H)BM;q2M=Q`6oy20i+`Mu5_?|W zKco|#g7)_=v~JaF6szi=R3E7M(v+=V=iGqGSocDkWSt|=$JE7jj~f;_NOXt6#{{+m zx_7N(THZ8Aw}iF6)`YgNa`zxyVt){?j9^Cp9hDOil(Ivk*|*6ZgLCZL^j{RO8h>ew zY}uo(GCpwh55$q;*}FtJ5jSII#P*9?CFS#SC~JZx&in0YI-XM5tZn+<azx`Zcl5I; zJGs5YcfyuN@}nk4YQnaQ-*bwIb37HMerkL3@upEN8<n%PpNvZ#Wb6RV7vhlbj-DLj zjOZnO9`YZvD+x|{cYOOliq1OBiR<g*arb0m8@J73#ogWA9g1u5A70$up*Y2@P~1w< z;<A#Bdoszy-QRitpJ$$A?mcqP`JT^(y1M3BC?>19i&F|6O`I)#Bs5_(=58;;$VMwh z%kPMub9$406z9dCK;Jwkoxj?b*iP7cx$i>81WcPCpXF2v5F)teE_}*Mvdic@2w+K& zBnRfW_4dK`tIkf~w_yLcFS8%9hmd2e<bM&rm#!6e;=vc};d&wlW!uK%fr!U$&svPu zk?ujEO_>g8BRS8i$KO=;NQ{wAm24L_WcMMK6`j#hU{l8zE37cK<?MUiAE1Q^0P&N2 ziHnrnmED*ACwj#{!JbMTj;mWd9e?AaIEKR(qjfOBtKoI&DWyx;Wt2SoKX|?7$rKVc z-$c8I(c}@y29bSGOYd#xZ2K&GKli2JrA&LwZxjaW9#G9o@h=FD2>S8{GE?|2g-)@0 ze!B~DJaYc!{_H*M?;qZoiXirpa{ycNUcO5Pl{Mx5$&izISbFhzBJOwF>zQ^MZ&~f0 ziD6s%AYusq6ZI#DEjlmnp`^-o@&Vcm)Z^5T&>LSJ&sRsv>bHb!uRUub%wnGO3y=~f zL~#*cv`g5OznRmN)&R38rSi|R?=mATo9x#;Md)^9Z*ps40sbSaTC_@eM@>}nL?rfR z(tdR3!sKL4aFFMeHEn2ZxM`W|y%ELd-ROTv7RClHRTPmCm2G6#`KM@OFo+y2mWB>^ zb<Qp}ndPeWgL_8!Lv9KFGIK4w2BSq5kwkpCY&5Sxe~F!$X&e{`=T8wU#qp;r>m40% zM`vZLG0mC1L>@&;Re$-qGAd^U#fSY+YMLGw#5?)M*}8SLV=axqn{i}Gj91fU0sn}c zia#|e&0mTIf*J}IF(g3?Y<2(7W;Go#APoPS*0~Ik7Kp#7XZV9<Q&cqd4kb<AReYFR zpQ0_@jr{F;XcXwmb!!d3Sa-OlK)Vx<5#K4N_<t&F+J7tVsC5znFHGx*`=#(B76J*@ z2D)hF?3&}|gWeA@dZ`0Z$J{7L$hwvHt8-O*Mj;YpD5pwYVt<1;hr+yC|5oRzZEr@n zr$jcD9>W@#(Xy7RU)3e$Sedx2Ip-7UUC|eL=6+>vsxPa(VVGch;C&RfWIkbzFou*} zQ%1CP>+ID8BujuAILb6ncMUFejWA<s7r>b@)4~CJ#b1@eq~n~IWshaURE;%y)vwYi z+{R>Y@m_SIcf4(xX@()HZ){4~-}sHm`)C!jM)XE?K#Q$7rs*YLAc)ZiV<%@8L1V3J zYj8hne$-Y+%pbw>gt;`A)B%_(?Oy(G-7fX|X<tbHW*@-q%616P_RO)m4G(G$)pjzv z?GppUY#4WiB^Ujs=%VhX-lOa$n<&&W7h$dGx6nNMGJ{!1)*m#zu)hNTiPkA72~pNH z(HrFzO-^N%zTx*`{ENdD^s(;#VUA{|3;HF-R(7{<bYcKvGU*sA&u=FguaK)oD8iy~ z92RkG{ss(3++c5R`JZW%$!dA!><ImyM5CY66M|u~iON^Xt#XXGA#V-?#0v`zB0Jo8 zOI<@zzrjp(>7a4(@44BS-ZU@og7mVgp{Ad*wWz@QL>!1rrk95&z+a1G98vpP&$F@o zt&$GJ1JVdKN%&3DUol8ELMf2cax}z``R<Xd2W1~&IcmOO7Fu^YPe8X)&oFIRkHnu; z&on<(cG<VGjlkd3o|smdEY!zVsasIRs99=U;7kQ9scFbhq$8ZVlFRC$6+5--m9K;g z>5I@8(l0}UygHlRxLDuFu*7o8(=j$1v5gV~riw<&Iw(3S+RH3uTRC~+$O0kK%Y(2{ z%tq5G%O3j~_kO5lVj03fso>9-9aha%J(lsy2!NAT#2+s`N%Zyqw22K*b)yX`dmaDb z_|5_v*P1q(TSxL(wLtr-T&nn$KZ#N(-Hp%n4|Mv>R{aqjw|2bgg=>4HerYe|CU2DV zjIysfpxUYUB!;~>`AD&2q|${o57D>OR~i@D&U$)=zNCM}6dAij3iX+aKPpD4-QpJ< zfIJY{IhBJ3J60GL!Kc36y2aKZ{<73e)G5jg;H;>xqM2rEIaZC6OlFhu-fTA*8#mPc z%Dmcm)-cT!u#2ECsnZw~Q&_fKE>v+<(-cyvSumd!BwQ?vi5OhlO)qOPdag-q-|YPy z%BRjFUs34%$#S#iL-{^ch2#b>k1`FtBRe7@^(w8W^$T<p^nY2``s|4u;uVR=HVWj@ zvkJ26v|^lC%UMmhm>&{t?c3&5*p^$^mI>BF&h^m#6bAExP8T4gGvrp;e#wL~G;bAS zI{x=OD{{-tx9l)bjHfMVS08_$=)9~0t)&g%qvgvrqs!kY3!;e}JoypwVY(_r_h2lT z+P|u)wO=hy!9|Jn$OV+Sz*W&c#Vbu4ty<Ghmf`wHdkU`b756#|*AUUwt8HQIZtv{( zC5K{GGkK!0LaJ$`xvY#zI`G%fA7OT<$3R(INnfaWrE?iiIZXZn><u3gJ8^c2@2YNU zcW9-m?xO#(I0SEDK>W17zO$ZLs&84l(-?PXf~PYSY-4&k?_bd}*+#{D#e8W)0gYkC znA0}`4rd?B72^bBGxKo!d+*4|kK9RoUG^@~X+>A{d(~DsUIcQ^QhK06=^??CvxE7b zev{s6THquGRwu_G){&-gDB^|6cbZL_If{G2|1tVwXJosE+j_oOX6RSe+^)H4*ys2w zcp>)(A<q6&G)Xa8&CncCJ(S^va~Nweds5T=|JZIB#?*Gxe===x^!8`t9T7b#4|qg* zL~~O+T2m>j5QrE}ahBZ5$X1WuyjFLh%3VFph;^+AIkN+C&lzU~URh_&f7&DEGZk+I zPiU)9W0F<=gyW8RyWzb4y3t`n`TmY~Mi!`V_`k@os#hw%qFQ3%k7BkU{93pg@w<KI zG5W5xXACsk|GfW&e`NgVziHq2Pi33b4>W+vBc2E}q;x?K%Zej?y;<u!L%-S+`o7k! z;O6+<QW;6ZUIh2F$0)JtGSxb1h`X1pF7=Kr2VdH$mYJqjrW!Ng*yB?rt{|Jy-t#Te zq~ft+w(OB;F|R8_i(ipvM%KD7nE%s@4N-G57YNNy%rD-;mlz?zc=;XmXZ001P6#k2 zV29-{M~C}cx~5ylnXsmgR;?!&UY(~Aif~=4y#z0>ly8*16*c63r|d*J6Z`#SXN_fn zx!m&52Dm#yo8!6SZc+<CC7vm_%VpB`!Z92S4Tt|x9Fo}W@8}4d)*CxoPP(wcr%8NC zh}X~!+(Y6yijFF+0w;RLO5&#%*zrD4Yj@Jt*D}(Kv-Wq<gNh6So1%~A_ZEw#KPC0W zN+B7TMcsp*lI|MdIq#UanATZlI9_>YhLovb={3>KzAu`s$SSwUMWQH&NUevxR~Vgq z5**_>XY-gXmQ&8P5H<OG=?^@C#$z|-jTPcWTg&?L^UMt4Q*l+IZ*U%X-o49p!}Y;E z5$q8(CYF`f5|yl${P|@#(IH`icZ>rt{vu9AlGDZD1J5kSR{ITS$lEViH-0q>-*!Q& zVYvkRCGVwj@eCfHF@kUgA;`ER-TX&fOKk5gD{Xh&>tJ1j3aKF-W$L*tg};c7h|IzV z+%}B&cv*3G{1o(?N9ig#r?>}$i9n;cEoZ`XrH$ntE88c&Cps#4&bdPSfnS7Jn^uMA zd(-x()|<AOuJwLg>{9kW<XeJ+zK>g3_OIlUL{v7J^9OkyYFXA9TOVxd6M4G2{7%Tt zh6wSwh3_~aeLgT&kQcra$_07A&A34PfjFCL8d~8U>XbT0IO}_c`k^oqR)cLMZe(GE ze@krAM`DEl$M%o~7-YUC_SOHNvx~K@<+$y!J0Ca!*S{tZMl<^Io{Q4bUa}Qp4^PH; ziTje@AIteiyZ^QKv_ZD#&IEWe(kk~H`+$CtcUkn0WFlNIt>JZG!B;b(!l@p?Medol z(-xF1?|k7qAL*6Zj;tUpV2u?BB^5H26j!!@GnsN0{WW_yy1}1t^|K>vW9;+XMQBpu zNbx=_#Ja;BUzQT@l2}DI_*#~acn>ivg$a%Jh8&f)kG30*i=K~xy9xNlD}sS}R`7>p ziEOBJQ`vD~8f_=8bMa&X5g6+FX<24EYi{p=v-J2Mg=07;Z9I30Xq}9pxFKsUs^yG< zp$fdzp5QA_!oJ)(#yZ`8**z)HC;2OUK2)<W3&x5^NO)qRa0p<hy~eF8u;TmtMAsCX z(;Bybb2o-)F+Qv`tfaI90%b<&Zdtjcm*5j?5_u(hdG2~_1e9|vw_UOXt$kd*Ab%Xb z?*`Y5wvV$_kQ42c+z~T{7ugXK7kMmoJhT;D?CR~%*~!jUo>~Zse<*e&R<T+NuSwXl zcaqU%{kUJ~Cj6bEFTUD;$MMy?#5C7JaPIUCjGD4Y%xdaEu25oDuvG`-NYMh0k?cVw zGaVu*&~9@XX@-z-i@n^xH!&R1pY)owMsQG)l9wyj%8!edajp?B7iL5^frlK^tg9{4 ztO@%#Pd4C4Zb$B*@ZjotKiN0g7fFq9HgK6X1@|_8HTpmBgq>!=S;+Q*9w<;R;mwc4 z4yWb0EXf+hFlAlYApwq=#`h|9NjXCGz+WA8EOSg1mQT*TfiI~dvOf6*YcYSFs7$Jp zy2VfVn;DI9?Q(4*W55>9FSY|Vgrlx|yT3yW%)iI)V$Cay$^KR}mUj~W!MnlOO@L|1 ziS7QpeX8k|q1yDw{s;IpGANrzeI~EtXhnPF&y`IT5^)FM0r?B^Qu<w(>pSdxXw8^k zTh2R7zV~r+X(MS3n=TYfQc|PztN4<D&8Cv(mA=Mr_;b##ww2bfE##aG?g?#4Wf2ni z+({PomZfBqBufM;_D}K!G?XoiUIBO8o0xZ-PFnA~ZNXFujod;U%Iv`hBq&8j(MwiO zxQN*TZ_Gc9{RY*zKiC&q%dMmAlRb)%H@ydaih30wmYKy%Bu>#70gpqcw!w7Gt`E<E z#SLcb9b4Kd@f`~j(i0HtiThbHAwl|1)=~OK*qpPEG7}Te&4~^3Z+DWcznkk=lg@Ea zo5aW>123m@xl_wtN+Qy2lEy+QTSl6S;G}ZF)80wW0d}q3?g)8~1P7#W$iGPK*~bNq z#BC)5#4m*_xxE;@2+Y#b#A2wotHL(LI^5pc{nCFax*&TKr6TuZbA`Pm4WxRJi-%(R z2^$c{(n}(M-{pF5A7{VgybPiu`0Qr%uaqJi9!i!xlYW*=E_(s+X(kMi%SHzIeuGzF zrv<X^b`JD4iT=nn!QmJp{snP;*(K>BQFq>T#%scr5<VG$=DTKE&zXO<R=ALmEKV*A z$IYT|;rYZKxlOTDW)srb4AN!9+!PRM?qxcvEfKT9dfiokh)GLnHPO!;$6qg6Etw+` zh(_=xF`nWn#cuH{{(i1Awr$q;wuY|rK2KzCmWTOFy~bTE9wQ&7xFlOCVsTT{*O+v+ zMP#MdX6s<CF-^7p=2{I~Y^or{qZwqrSTa!FSI&_Hcn9cW+@Ad5*a<(`wbHuTyvWkj zaT**F9g&}oJ5N8%yDy$DpQ)&nJr_0Q?x3ziOEQZ?<2_q!Tg->dgKf>-w7{iApAw3Q zXPp-$B!lIbWPQYEd0G0uxF`8Sbh{7h^jmJ4yIKL~RS*-&XR6S9shzk4v0PqH(N~5L znSjo;*;svUKCDAhIPRMlo0eI+I0yU7<H%wf-<LT?ut{29S*h$Ozg~8W9VfOdt%<+% zov?2(Dr-r#LyZ60z5ZnKJ*q2h4gZd;pT?uDqs=JKi$1Y>;G5*kp-ygtnXIp)8&iAA z6msH1tXwtT!TupWsS1}T%k!$q(ha=B)C6*6VlBATa$Og#>Qdu3@Er<hL2?7qLHWcZ z$cL0yRSePARkknN&&1-p<*Oq?@1K@mYui;ntd8lQ+s6d9W=hyk%%-BPs){;$>J6^j zRkKHIVXnYnQYPOw>&V*gl{0@ft(v88>1YyC6~>dB@CPfh+EU%)b<4FT`Aa^Uy1aBC z;&;aNKPxdm>sPJS54LxMiYYgS!|E!@mVc}7ZqU7MrShv_Fs&7;V>0ghY~7_B@>B6+ za@8~Acn?0_8)>Gx`C<7n?Vx&#>Rr+@<=wd5i2HK7U|;7v<Aj>7RjsSL=_lBx`M;#b zVyCc1h+C>JR$QpFTzf#-O>~O&7PmXI1QOZ4>ZVkRDmT@<Fwx!GusL^`Fb{Yw>kiMq zS?aH?_*?#%x0td7F)5A%8(OZ^O!%q%*|dgfxew+N&ryEbJ^@=%rtMtUQD>KCsbmg& z8?HR_0lH)V%|NT!T~$#dGtP2u4sFZ-LUM7L@@M7m>#VLrhdW{~c;6{25f@`uJw&sk z=2TUwdb{Di9rABWGEqd@N`Y4q(wghs*8WgPgiq)XF>f;6LVvk*raL;Q`mv5|UgvHW zsmiy9HIcW=CM!B>IOPV_Y3Y96NGcZfHn|ys9A`}R^!IBe#+kPB;J`RcZlyHkWu>3h zt+WHn7brubG&@DG<x}B7?jNR6y8l)4bXSb;94!MI(vL9@8RN=MDtBs+SJ*Wyd6Lhe zhtQMK(*vI!{f$3rcs0%Rx2!ra9;YJ<loLFT%%t9`y;D9?Su7jJlHx_V9iihcl(|vu z?waAXznYu7%fpLv?eGg&v9gGwsL_@8P|uS_xTh)2kVg`BpTwRsSaitR$;LPKlmFjo zL}I90czNjob+%koj#MH=|FL+4Kl8mKSWl&SZSB088#=%=(TNPIGjYseMqZd#ye=nJ zeAV=qqXZXdL^MD3%pbKq)Eld>Ri|rbS$BcQ;>QuUDHQ%?`7G_8x?k$_(`=XY;cOyw z$<GV_;|dyoRM)L+Ulpk>*{Yy%ncldStfI)L`n_Uiod@MF<XJw6W<s7zEcR(^^Yzi{ zSam!7YU?WSb$m23M_nSgrFg2v)Lm0?OcfMi+4Jz!93`~OsWRHDM^^2x!JCAxzM*JV zfPc<Piu9^Y6$9&3lwXqF=JBW}k&5Ihe|vjIzq9&NRYJGV;_?D<0P&qXo!d_OR{d+m z+6qWbksbzmk$A=C(bt|umKU`ZHH8|sF>h}RbxbuzBj}q2U*t{72UTRshbvuWO<1pR zld@fd_Z;^Pnd+*lhPqRxqpm|CM6LoaWFHhyRllwn1@m{F%0Ba2QST#j38SyGO$O^H z>D60mCt1^Aw?s2!gmRyELiSd3wE|c1LDgKGW-0KI?5fZ)cx5Nl7HaO*_A_61%@5tp zPRE^Pt|;>=fbxgsc=deg7<d=9Md4Dbp>B?r#;&?=HRtpbtp9oY#@xjnr0KvF$yoIb z?O^RGl~OVWs3I*bwT~M>yS0V>TQ#HRiGG>Q>FWdcn>W$A39yPx`J6h+iiIkRsFD@L zb<awJ^BigY!7A@heDzL4(P0cu&#fWUaQaD6<pb)zsk>0?lUw*Y>PqB~I0;l)GBy1w z_f}rkk*ra0Z-RiDMB6ObsJN+JQFmpXo9Yu{COd-bl&u$h>(Cj3)#I!B*IYIdTz5lH za%F`3?8)NpDx`L?_N@Auv@7o?MT2aR!1!KU$LdGae5hG&AlehYtqCU5MG^70$~jtW zU3{HJYJvC)D}Zxkr-xd)c&3jv#;S!iD~xBHvXDFL#r0sRMOT%rv~w$j<pbsa;}4^v zkgwy<z<1Ui`gt`AYv#ab&Wtx18;f92-}CD$T4`6;;a03rbreV00^+Q~iwMfo(mY=` zu-aI2$2i<63f9T|g-O%v2nQ(Emuo60<;&$H!G0P8y*p)ub~$<)Ki3?uHt2Sm$9mR8 zUlctg2uMrjsts_p5L7>r{^WimzbIK^&B2Y<+4>1Jzt=q16Kq=Fri2i6oOV;tR<XN$ zM8#j_EG0@*#d6|Jxqm}<oq9w6>L-<|8iZ-B>upGo`-Bs+v?7J7WyQ5RGI$N(kV4HP z>nA7pJJ}~1+SQDxCe-$^obrm|e<K=DTk|Vrn>7t8E^BQnrsN8z7x7zuX?VY@yXhC* z^y<$wos1hCyui$K6=no;nW##2t>Rf7iMGDtkU&A-jb5Mn;9q0=UVE~tN!1SBGz$*w z8W+Ge^MYHH-qbXy^GluIG(xGKV<l|L*MtwcXPeWyP1VwxgubKwBE-+M!@Xy%7WY*j zspwbdVYw2f14L+BQLhs}!1tC1x?ih4S1qaaTijlMtP$clWevZh!l^x4w`rXY>Mi02 z>=}f)`Kw{0tIBw-dQc^!dXJ&ZsSAF{MsPD&t3-QMo{C#_XI6Akx&=*XW03FSH^B$i zCi=D2@v7H4kD24W96N?sO*QcUkoPP9Sb?m-sT)eZbGi{n<rjyf&clY2)r+f~H8V^T zT#Z7rvRiQ{SwqAN)Y3XG*cYkg8vYsBx=tk5_}|(l==s&ZSAEmHwrm2Scm(l`vVhk_ zHeGYNVot>-wL}83)A-rB`6054VWQ~TRo|;wV_fbeh3e*>;jge?iy3N0#ow?(yqSC- z{{{6ja%>_6Znh?CYpQ>#d8+Se+vt0lpraPjJ`2o>ecB=LDCqABqHsO^9a^8d0NL%6 z45XU5)vIcMSfXB8yc41YMa0v}4r`uPbg$^GZYqH*qQpR+9y#jnXuhdiSDmQ2XKd#r z1%J!T!MYhS;V0N{53T4{Zj|2_ETw-%zfYZpx;lCrTj|!;i1b%2Pdv3S-)kuGGN-vj zrmohewae5$Bvn8;c|qxJj1O+J-qaIycAdb~(78I$H*G-=psy1wkgw2m(Vo`akY@#* z7;5a0%!|No#|J~pny%GpUBUdPhZdbwNE6hYfVi`IMuo3pr)HP53OGgri??ErVLk%Y z*r9e^t<N~uaSl43YK~q)o5lxZR@Dj3Ks8ei2){4_*wI;esJE-qw5|5K4r^#`^>_|N zw&zg<1^b7{rCe7&q5P?`wfH*6LRyUwCVN1a98A-++LpDuj0lI{KP|Zc*@@Dg`#|DQ z0a{&oLHQo8Szp9^a$m!BJzFe8_34_Mx_!pOj-dfl8i_r~SSI`;Z>%|5PSBi^?-w>< z(r}{e;owDQA5){+<+@5eXj$yxL>lHvgmdgGVk2AyZl^t<;!Ab|m&hSRBr)30u&WF^ zYTnd5Hkj>$A!N#j97iz$HR6lPJDRnc9|~954AykKB!50~#=F9H!Z=j_Ro}xLb*>Hi zGk$DS<`H3cIYMny(^WU5ANkwpOE5Rm8v+&1Bc?(6rus+5HMZH_SrK*KgWtz~AWo`A zYaf-LRYpa#IcG=!VsIkr`)MmPRMsrjeKa<5z6ku59*%xR)$$^e<tjosQ?pTCD=^ak zz)Z|^54qjjtSgO3LwDl>>rT%vk)`>1gbeF$*&X?NRbDk4)=Jrdsg%V?b@G*el|yMx z8=e`F*3s|;4kuA49wmNZ4-}CVQ&hc`719^{?+jSAU%VC{=<nmWV3Hfu#&cGpcW`8K zZY~z2b%JSCD#Z`w{}f*FBCeCt7xgC9A~??d(;7D2G{F!?*A~c`s6Z?ydDx4}X2`ZF ztnz)5|M*pmK6q5Y5`6-0wF}KJjf2gb?R;=|q*1OtHbdLTlS=~fi;6k2KgzCh>QeNm z*_p}V{@#d<W)_-SSVlTU(Cq{UQ9&BRhJ*uT<;n(d7x#a{dMpw_UN{q73J$RUZSoj? z8b?`Ix>2EinI)K|bhTiHY`1E(I;glSZpOt^D^cUqQ-jxCL`!qSA$>a Q0FmVcT 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�%T0A)SYJUXZ8BT`X6KQ?JKUPl_SVK-<o$=zp@A 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%0DD<H9NAB)Wu(% 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ΠD+akAv%l$ciPS6AI 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 H}jVf^CF) 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%0Au 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%0AasX&k7*;=ltk$?gYg_`1e? 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Ξ+<Rp^EOpam<rmr1c>8HbN2x} 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%0A^%fqwA=f2v;H} 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�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�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 STvwyX>Ra+(luVmcMsKm(irh1yOaz7cwMgXe) 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%0A^fCqJrtZt)qRUDII^RD*RX2 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 Jo3EuRD{Lf^s(Aa$OTd=d@h;4#W? zu=~cPu0l5{8kqnL%*8|v_Bq`YvPQ3{^~@o16}FMQt=r5z#<l|sr5O^hO~vz=w<dkW zJ$rfRl`t7EF`wy+y6(EMR3VxnCkgjMvS+BL9lr<ZL1Z#1`e-JRY6We0zo^6XT-_#S zF|wL_=S_39@a%;?!1Pd6Zhv@rDBth*zY?e5Tc{fBYCT0)QBs3v+|?ZKisX__-sS!p zzH_dh#fytBm-GxAmChpT@PEkD_(i#0xFB?1s)a9RX6r_<adZQsfp%5;puQp-83tM^ zTK1WSn7<g^?0dc2W{ob1{MQy`d0}`+5$HEf1zs6AGvWD+qHJ(l9K^e$3YJZcB+qJ) zuoYhNd&G}&kqT-6F(0xf>C#HRN_Z((A}&`rZ5%oRiO`NI)1X&khVnO%-=-)%h1~Gl z;E2FhzdN9b&^EyAr>0>oAw6dYCTuB$CO?t`;7$^$-V_Y{TQLt#lLTeH@F95CH^sZc zd%-VrwKXF#3Ak1>L0yv2XV`j3sE6@8h$w|ZZ+-rNN!TlwK`!FIK{Hn@z6QgnUAlja z-7NR4ius1_9PUv6Qu5^vK)U*qn-tm}`V|};+99sR9<p9z2NPzjs_#U_Yum(jpm=Q! zNg-S4oiE+n1)i%fTqCsvN0_QGl_x^q@+lSpZrf$u9z#uoLBF1DKr7@1GKNf|6Lo!c z+3a1GWv0?+*<5|lkZsI1IgBfrNtlduMptN~fU6cKn8SDcd%d|{i$5bEbL$j0T9>#> zEXIFBy|4%F0W@I};g$7#a`2^Zgg4grKG2ols-DJqAgNRa?&=`m@r^J#^pn_hG6A_F z+y>3RX=n?V3jH;2uob{AdQA_Z4fJ2kKAlB>58mc~;6eF^P?P@@?#Cy|o3s*SnwAA5 zma8~Q3S>1l2z2%=ol3sN8er?N9cWvm4QLP@w7JrCz8_?@3WOVCJ>eaX2_yJ^+=uW0 zem6WN%jMVN9{xt4oNHR~z+yXW;46DD-)`Rv{}XUd4+<wh9_}xNg3NCi^n{w=VR_2u zONpRe!e@aU1h!*M;6V<?&fvAl!$3eE1vHV_L@M?Il7h!*8CW-|poJg9Su7PvL+jz) zz^$@gz74xjXZR;<&^Ajg)J@t8$bwzdTB%=@6eSxtWls67d=j4Ip>kWGe=St5YB9uK zDu*N>3H^cWL@Xn_LXTTLW&lip<*46@e}Gdnm^{ZG1--O8^8_4nA$lx(#*l0IWtnP> z*KcFKgYWbdaU9;FW7tAAfnC8aVmmWg>|^6$Q&rezbONUGEFj!eML@+OGO*`}4r!?l zmCwp)kl4(JW+V<eA6F=d#E35;50M#~9efbj<UbC#iG%<eO61B3e@kc8A&3fhg(78& zWZ+kaW#}WyhW3``@ZXrMHr9Saci_Fqsq}JagS!o+)5F9kYzMZK_(om;74RGMwao@a z_yxjYiNp+eTYe$00-vG|-H(Pw07jsH5VMh`axY;SBrJP!WuT*VwER?Y$jjvc%4Sf4 z0+6yDthmMZp|9T2uDp_a&NJ>>-c`QK{s;bzpq6*>cK1E^{}ntJY6gV3dVa!p$y3A4 zxjuUO`nti!Ya}GI{^UDIX7wVt1$W?GAU``CG89A6B&<JP8InOZ@&j2H-sZE((bP@m zKizQsW|+gH^@9vO^jq0VK!+=$=aM+KMN3z2D3hh$Vo-XmR!0no59y4H#7Q!S?f@wo zR{sh*kD4)Qgo19+0+0nhqOCyc5LxtecDgQ4zt`9TZtJv}G*jkhhUKi8X$G737P^q` zAKgx!#{Na81OK`=dyI|JRnjwhldci_8(o8F3i(wBQcbHMx8WV3O5xL-TbLq8L3i&q z^b9&oJFMJRzAB}Z9I3CMg~kP=gU9{ZK67wun1m!@11%j=RGDZW_{~k23HXx_&?Z2X zP6Q5Q3fzDk!gJwI$kpFcW<xeSPD=wv`X1sGv<>~n%wvqy7W9m=RH`U_gFo|oibpe` zvyh|6pV%1U8l?g?Zx`K#o=uA|`xuBu1Vwbf52D+&DavJWB3~XT+82c`Vx$=6FM$^w z<*RV7fb!f}>LxjWz?&Bcc`iA3JGkQ3jz=Z++`WMqdek-5)yBQpw><nne4>2Splwo~ z$XmmBXhNtW*Iq~$D?ox`hLFdf;1`Lpnhfvx5W7m>U!SJytq*`cchz{<i0JwfCd3WO zrbQit{mwwkv+1X)l<{x&0EJS^>0@jU{S$oym<-xs<+PA8Mca+1(0Y0kf#N&R<Jw@P z7CBwN#}Z-RVV!IIm$lIC$&Tc7cz3=vjD*IZD#R9GYWc7$bc}uzaA7~_BI!ub)$S6t zsGDpTgQB}cCy>u@1J0uYG8;XKy}?S*mdIP6k9Q#>nORI4+dw~)eMr`W|NnXg(zu}R zRZ&cGhB#jw56xyJ%0Wm5w7}Qn7WA^RKsqio;15AQ^si7s@QuF%a3l}8k9x}ZZ-y&L zFV)59Q*;2j7rPD#@?vN;t|hPI8wNLeeV%dt%|UCpoPa71k<*Yl&xW6II83#*na|WF zAlK4JBju@p3oAvNbVN)98o>Z@A0$A=U?b?6y3@Mu`g{7V%mDnB7OU=4+A4RT_p^;~ z9L{Vy+=rKBKRS(UPd{P4us@g(nU7sS`e<vFQNn=$<EiF6UR=BAPVrCI1b>h40%3tf zL*5_=B$l~C3@EQz+_<38+q=XLoBdxU<vopj9sOei*6<E+!6mA1(d$$|_ZXVHCE$iX z2Y$bfxJmp3V%dIp<8R_W2syHVOs4Cb+S}&XOWQU;JLNU#^VY+Z7*Acr^0iiqMcOTq z>La8NN$a1Ou3NiBrbhi0c{LJ?nrDA){=+Z;Xi;XeIrNb~L=*7A<V;4?u|S&2Hb+=K zn;M&D8+#e-hHtuq)NtS}bO6^x6Iqp0Aa{KLi0tKH55kgF>6gq1wjS&qPhlE-mP<ef z92Y7Ro(-e`Rv04YOEcAP=rE!Nb&-BSwZ<nQHMI*$X}P~t7AD`pz+PJqlifgNro2ji z3*NtZssj8GvvxuKuH_=X5UW;4o+%>2gitDw2vfWcZ{I-2a940f?N)AUUbF_G;qTEo z$Pp5X7H`GMtuT|kLefn2phwyLeQwOS`=#~O<rftK4cSUOgn_!ry(BOuLjRV!3y z%eR1OpUkZftKo4%w33Oq@dj|?j{!dKGj$zk!Tq_^VEe!u-!;z|cbw;?FFQB{wy5nv zRXrrV74o?VzJf5Ee;!&CF#E51*LY^R2f5z5Mnfys*TBW#%+T-Q$NY9FR>@Gmqc)-m zDU+E*9qb}#`WH1f>=qKWYw)|?(2lC}AnDx`-$+^6xy)X=G&3CXlHaKpjK&6ab9I|( z7qJb_+dFh)U6SD>qz10ovMi^~AHkJ2&hpm!8)z!BajtF)okk8J`r}K91e#`QQcv+; zSORc=ZxAzRN;gH9!HlAw;9j%}BuC?sRJiSmQV+gDaG-CbuSsB9$Oe4$Vz~i$2%Eso z=B2g?Ww5qr744B!hffLh4g3~x2hWGw@*PA?dL{o<<{`a^=k!Rn8{3AtLN11EdR^!q zOOacE%5g~h19n7<@GK&Mn$G;K|J%69Sly7#QuG1h4)zh*r{!u{$a%PlHNm=I#n@u} z5Y9pBtSrtWjnsJQC%=ko7h3Os;`_tj%bx}M(;@H!`9qkHBc7HyB@sG+`tWzc9m4&f z5n*{S9R%%8F2D03I3|t<8w#}YO6>{l)63!Qm9DH+CaW>p3-CoX5;$lZDF@y04}dV` zfd+-L@OM{eJJ_I@w59OQ_y}CULb*VyE;mqKDRopzo2MCo+0+~e5jU|VWF}pMZNaXg zQ;B&Pk49lZv?;n7Ne6nXLA6Nb#h&6W(JS=^#u|>ihJ^Jo=y{Kao1_8WJlXP6aU~ZO z`WQSFt|Z8kRa=Fg#CuUq*w6aTrhA~6RkI=1ShGj}n5jU|qlQvL=^SPZTZ&l<WTh6m z!A8HitgV~9t{t~^w6r(v)62{Zn0WufuS2S7HYAEOL=`$(k`W);9#X2G;f^#Cy{<J^ zkIC1?SbiSdupaqud0lSVUFb~;<OXxY=Y@Il2{j6dg4yp1ZXiAYH!4l}OY-xd!-K=6 zxdix@FBgZ(-PGC0Cj138mpR8o0BvsrUX1(;3I5f<?I|tZh0jofmWrCVj>@8ku$6U- zfco}<iXt~bU*1i098v@EAj^@FpyMP!dw2(+i<iI?*_fO}K7?ejiYH;i&|Szdt&-XT zvhOQ{W&A$xRgdcK;*q`0g2&*=dle3GdciN;6aSK40xfYI<fe+bslZU|&Z&^2%>p;p zUg){+rhUNj$zGtcY@r9U8+3iy#*p}S5p(fvNUZX=Xc9%Kl~x_~qFeDz<N=DHtI*Zx zZFG5tp*P?xG6*`WWNACh2v#XxSqAi^j>=B;4pN_3Ng-4>GC)RCHOcWr0RM^C1to$< zY~TWYr`&|LiQd?J@*3Ti?hM3}_S7uMb4u)X-5<bRZAWa^Rx4GN4{{Y{y81*r0^ga- z2#xl}_7fCy54JO34TqsCWGX#@N+R9(FMJ)aHBQ1lvnLXbxY19<5h|DZLPY~rWjFR# z-J<MK*J~lzAWoIjA%D9>=*WNKhe?{EgM8h5WeqfY-cbi2ec`;h3NDj2$ZDAbmF)p= zH1;WJY89m6|I^4s?FKrQ$RPWZ8j(#DVIQ<zN`JYBJP&f#3zh5YZcyBkmFe<jWv^Bq z^&ooSJ=8|#sW+9qz_D8@8?_D4!Jeudms*K$ApLJqM`^p!2%N_vp~qn#<d3Uk8==vz z3i3qREVFWZ@X)uHo++)=#!3bGtyl^2@cF>Lqv09dshZUwkfTljnIjqc6i$oFL3{gG zN>;WggVa~ZVEhf<5I>JKL+gPWxDX*VUR{IqK+8j;Lm%WjW+B!S#biz9ARB;w==F4n zDhB4~P+$(tCbogj_l-D4SJ(B_SI}p%sZ32K7u-n+<Tlv0E}#a(TdE;7f|^3rpxXhR zIfr-*+?tU@4?F@k<7@F{z!~gJE+M<aUiSlD1HXw$m;v^<XVB~D6jYCHL%M1oly*uh zB~v~rH&xyMbFm0c(Iik*cfws_sP<KD4#XHj{iM!;o$Lch=r&f%K)y8@sf>RhdsB_5 zS#Zz4N;=7@K)+~5>!9`hJ+X`^gl3yM@Y^myYhXY&gE{s9>W7^9Iix>w1=)i3K~^d& zq%bg}FNVs5_J*Ru?ZRh54T3~Kf(FtC?mn*7uGjACo?760_~6q8Cx#AjO~mCuJUu4I zD=zt&{7s$<?!`;m7xfgJ1gYp#ARv7sc2X=mM|VW0fD2?6Y_pocY<`a2#cp8!qY_~* zc?bLSugEUMj<$xjmQ>_B@UK2AKcQE>6FLK0InC-UN#u6}p}kUYJovV{b2GU`p!bSG z53!x}0=_xl5Gy3L52$4&O1LR(0S@;E{tDki=p`HlK4VY_$=8s#cyH<|Q$tq)vWJ7n z&!E$uMEqKk#w#D?+VTZiQX_yEyp?XCOEerbMC(_wFWG3F4N~#<=q&06nTq#CMyhWh zPxFG5fPelMRi9i-%)}p{ozRvjg6vga$a95NVKL~31Zk!4B3=|<%Y)^Upwdl}Ix4N< zeq0};(T||h{Sa%5GEj#5LK_{bWJ;R2QY<B%0RHhKygEHtR}p#+ZE%yR2Gp%Lx}Um@ z`kwmA%mu=TSI27NH>e??M+}8;-cI@?<s|DvzmS7|LkB27@dr#DE!8W~?Y&Fl<wE%Z z(D!F?525E`0WS+r#OLrNJP6kfKKD2DUG*&XWPyWaxTl`GJ5cY3`6~t|0)uLXd{w?A zO@T?Q5x9Wfg-eAihnE5MFD6I^p9KHlIb{RhhPkcVqwBy9pevHEz@6m4y~KU;5-|qS z`Ma_CcoO-H>0wxHnrq%-VvN~_KcJKKma)F6wrP)HI6DHG`C1U;i0ecZvLDrw&IL!r zW+DxAi~H0-`Upi5KJ5?rpiq~q5mv$ozlAe~i-VPeLjzp`rr_w%K_DBZ3PGOWlf#XJ zD+Bj}OSsoCD^frl?Iqmj>+#XhkqWvAu)4~tpCw$BxEo=VO9bCjKmM?=0X7Bgqy%NO z>H<dL@91QdLD#5Gsk_uz`bVk`dEH#uqNvd1xEi|OngG3SB=!!up{xPY&3y3ExP>dA zlynCFN(<D7<RIIzpX68iAl-~UL9Hg<K&x1>QV$#<U*L3Zg)YWs;SC6k>cUjkozqt| z4Aw6NlG+w}6(qLmQrF3NQb#tYD42pP=+bq!3~kNrEpN@K=Ksu}%w5by#&d@DhJN~* z(3j{V&fy=h0(2VM9lL>BiJp+0<sfAr!Zu?JHX3aVO}`63iIM{@Up-H2mjGQ71+Fvh zmY%1c&R&D}x~Ho*;O*>d?z`nF?Vjv5cwV|+!M?7(XN$L&zjm-Bd_;I8m4Rk95jh9^ z8Ug6pr@+k<!mHvo>=@EYtE;6T!(d<cnz%xVbVGKEj?=Bu<HjbYhNj)n9&?`=58m0< zkY~t*B!fdX$rFISv=cPMx7Z4D6n&L`O06dE;*n^)T2<Q5PYYXu$^M5vJM2Jy2B>g~ z&{qCk`3z0sjiCSSf_Q{~85$f|<D1|q?HX1x+R@r!E4d7*^}oIK{ELEzx$(jtVU{>Z znlG+{{(!N-eVxL&fQJwYHRW3KC&c>D!Co4_My_N!>3-Aq1g}-lfEyWulN}CRi4D|y zco(kxA8Q<T^BwiC4O@)8Oq(rvwzc*twzrnb=7)w>y5US&iXjp})taWQ&@xdP=m{yz zJcG_sZ2fMp6_pbGK5Aj)5&LcHBl8{OABNTXdBD_8Wc#uUb&PSd`IBXvZG9viJvQoL zWDNMWlkIyfF2gHb2~&zpLF2V3IPDHXXJR+?q&8eDr_Dw_!F;n;J+AB*pNF>u?B1=; z4UYZA6N`kxfyJ03Sj0H|&Z;inImSCF;DJx>OrY3*#Cyim-*eNo#rfWOz2x8Ga*k3! zT6*N`5xT}56yGWd8U}xQ+qL)VBe*3m7Scd(yT)bklCVqu4LOJH!K;xk=$kC)$IKvF zgC5sGKz1Akj+PTzRc(*zQ*US#G9K9gEx}&=DZT@rMqDLpftRif35<30ED(TVrEbDw zAb>Dj6_^lD2JeSvh4aI0q4{cpctAK7UKczYI1Z%b6TWDFeSb^HMR)Mm@CO6u!Z*28 zAR9b_C$pO{UK}Cmz?WDGaU%q}4qXofzc{=XY<;f4EpQ>|C5!1Orad!=dC8b{xAgb* zlVS5&!TiLWXBiGT!+|!l?XV>W{P3#jfpLwo!1&CRZCYj;WfF|tO-1HPKu}w6YirB5 zcCc1~CWCZ+HDj{5z?^2@V393zEX^&smOpJ(BQ8b!vahpcSo)bun@$>X^{DZ)>4jM| zzcc?bH8R#QOa?N<6;m5aKT8wHx5pc9L!P}neUa=!<m0i}WSC`aQZ;@KR|mXkU4${B zMO@0Kard~o;f=xd!T$oaeC<40uCXOoixVB$4!2`yNqy%E=ND&$TYzUW%~RIr^E`Ad zc1?37JM&65IgdEMyHdQ_-ZS7hT<H(`-NC)#=G<KV4`HT|0o2=vK)viBwUSzjjfAa2 zI&4#x@~4Fyp(^kN7Ag7aK&_Sb8i>t$)vbJlKHH~|)2xSlM4BQk(Se}IRv><-hv?eq zdIE=a93_xGqAyXFh``IElfZ*_TJ5K$BD<i8_zl_@y{uhQwgC-v7_@Di6c_N5!WROH zM|BDAP2Q{CkI>|O-KP&s@QeQBa2x3Iy(H!d24Ot3zlhv4{=U#z7J(<70edSHt%+9z zKBLAY>W3O=V>9Cr<5zHXr<yjKcw;G31yeUeP&Y-tSAP>cJHL#d%-3xN_G|Xp5$z+- zN35_fvu(64v3xNtHULe7{leS<RqcxIfpMPYuC=Qz&Gy8e8__eeD*U^H><z8eOe=Kd zn0ml8-%l2hKgs>%TdEHGLia#_%2?f;WFBLdO#=<}brsn*)F-&LeuOD@xLjS1meUm; zRe(!8kUBsgp?gEW%ON=Bw#XBN%UqlAg1`vqx%k(+%G=Rj6l@UAh5PLV@CNS%#c^op zmT!t%?>ga_Szye&n_E98C3|!3@_a}B@xl|u$t68qN$y>4_%`^zc|5K{a2ILCTOAI^ zD92St5;T8R^nVL>;qOWvH5Pk-cO!3+#|R$Jgm(8#WDBUMjgVrk7x*Z9VZY&?|D)(E zfZIm9C~A;wS(0U@aGInkbIQ!j%*@OwY@0GOGcz+YGpB8mh7-rk7FhQG{@K~?%+Aj4 zHgTlyd+*+JkV}#}GAZ#3Uyt|1XJR+u&H7tJLPekq`gVnE7CV<|#EfUZf}_9$sl?i% zU82LH8X}9JapWZ5F?5v6<Hm<}0d1}hoI!u^0|b{~a{oy5RNMhcL25w0vky>tX>l5` zsK-Ml#2FbMc^=UV&jP*Ss-T|mk)VkH?g8SC;sxR_$Oj}Exd#(saEt=s_=9wbRDf*) zugG87VO&epB#+5|%4O7OMMLFb<#1Ie)kx(sMK&-d8FD_pOO_`iz+P2eI#xOoGN}W= z&^Jcb8&AMh|EJ#o6W1rGE+`ET;(PKfz(HJtOXj!28z;g~jrbxR1)CwUTNO;47r`A| zk8cfB!f2Sn3ONOk%WuHM&<?YrW??5kk^hg^@;FySj}Pwl5A@ylpP*~7<H2vZnpc1& zzGqm=AA;>ed?<_S&pY9ttsnjqX$;g;7fhFg!VJ+-QGd8c><OO;O$wR9@545JP52}v zu!jOMz74!L4}oD9g_};0zXZvn%gj{fKGTBP7+egbsKI_;AeL?iR`<qqBzS=qup`;I z?0sN*7jhHWN6d3Nj{ZtFU~V$ExQTo-m|DLOTo7i$)@X+0sHBE;fTRtg0IE?d!JIGy z3DC{JQmRXH!7p?%oeF*5a^X)r7y25S9y-KY=o;{eZ08^AQ~6r@F8luYWC4zT!F}LA z2w=Mp#>iIEy;x1zN4V>Lh0`6_>WH3@#xW2d@Bw5JwM+hod?f!)ZB<NCo>RHtXDb_= z7Ijo>6^+R@@ZBjV`wiSRrKBA)L3Cd{1vdLbq-l5_@q}1{FTqYpnxIpGOwbsZFo*cA zu;)I{-eKCn?`$#f*aD%WKznNui4E%`zankJllith%Qgk}MPI+zm+rd(#QWL4v%#~# zIcdZ94>t<ej8p|CPHk>0BMv_Etp$twWslVN+W!}B@HYA<^N5QM_lvZHThoYe^-y#8 z3GT#pfd8HWY*ZV71K);T4PNd-;J<VMcG>x`G_nLfDQ6<lg8snD6awSEfD49HyguAf zI9NOmxg%)-_Ov}jL$Wuyh^U3X!O~$aFbpFxT1v<c$a>=ENe{JJF<CJ|ag%B$e?!=1 zvtW0fh^&Crb1s~qUJI4NW5VOW<tLGJq%|^Cd{mSqQVG9A`T(UdHM9U&?yK0r>`L}0 zTRD`-cY~YkhDZun)c?XCd&3>Vui->gnYA%`;AOl3M$x)pO0ZF&i~pSO6Xf6fdow&G zu2g79Ew_KRR<~8MRj{tLZnWjtPTS8oemGRl2hNeMH||f+>3Zg0L^tJ79u+hce-k$V zs`?c$07PW3@Yh5hIg|X1@51LobN{fSgZh;ArEZ%3tFE@T3nWf^Xx?f%fsb;rd^fR0 zb{e~bY2Y?e4~LTjb_|@=?||9qKu;hg!dDR+e4n?5p7MS86`}561ZxnEf~lZXuoh+k zWs%zg46@71!*xR&*=pP%t_7P8zwalI#U9NM4bKgCjC_oIg&o$dNbB%pZV;<t1_Vz4 zC-7^aN3a}Fgs;Q<tq0Q^?ok6+IXeVy3EhJQ{%5{SpU^kYli*qFY37{_6r|ySIpBRr zq5HyIV+3=BxyT%0M#C0vIxzIJ;Cz1zSfZ_g;#>*Yf<BX^1N$ydS{2d~2Z>x_8##cQ zp}4Iusg#=fTEBLRZiH^6?z}Euw^$>DcTg{A(%7`sbi=eKH9?I>vq+PwU9X*~exsO1 z6_7)4r__s@kjJ7j;hjj0&;|A|yPvKYnCQO*txBoK=z0e`xm0TftJpHm+~2&;e5$ml zL{NIDbhO!6_P*??rK+upeX#Al<&fpObt<HrKRIF?Kfn=q$G*@$!*SVZaP5T5?jg@W zZxde^xUs(pG@>T}YoH_jC|EVv1RB>P0|@~YymKEhFTq0Jl<xue^H^b`NP{S(M`hax zwLB!Z%4d<)i5RjARZV$K^;<nrlc{;HmFhKM;n-q2A9XDHXVfOcTkU@unF^-{$w$hy z#9QflbglTl@QNS<sDE%S4nGPV;oh?$x(h9ap2IR=9-d-iX%@IHao#VUTi({bTmDXr zm75PPi4B6AqQl5csYA97uY~`WVR$-`Np2v=zz+Pm{50@&no*nJuQMo;x)05=LgE(w z8+$Bmh3&vrNSvY>k+{%Oy1Va+iw8^I1jhnLn&TXtJ>oo5Jtgkbt|(`Wy@Ta+>DH2p zrMS6@`K5WTg|;?>_S7D?+;5?s+$CNcHuL`QAYnzZ1nDJNkM{*0c{Q>!IScOp44FV} zS5DK6*G|xM()84B(o(vE`ZtE|rs>f$qkYCY`jgt#+QHfq^->k3!j<#oA0c5pT(%Z= z$@^q;fI;$DRzZ>_k_lB{B+Fn-f%4viZptlly>+y4j&v`D^xrS{4*0dc>z-5WayZ{O z&5lbpk#)26gsr!2xUGw$x9gib4V*t4ybFEJe3v|ZJu|$AeG$mjcJh7pJ@b`=e0dUN zcFMpL`Xksks0^xt4u8PA#Y2GUt7DK4?q^h?R9+5mNISnWtd5)y@8pld`)dwAJXD*P z2}I(9uxVCc7x5S5EqPb@GV&Kuk$8qLf^C5XZbTRH9Ac-ulsc+hp{}RVX_B?5ew41J zIz{<JagEwY&cs<6NzSCkK)!H`V!L{QI!d{XIxgQzmJ#>yeOQUqjZMN9NybZ;5D|({ z+NkaFzw!k6VeA~F)#i&Ti<^tziGb*enk9a;6$-pgY`!EG2o{Ng{*fQRCv^utKvJQ# zU*kOtJ)dXp&cIrTbzOF`&V!D#_Ph4k_GH@^>uFmp+gHfy##lF4TiDX=KO8Td$6Osf zQNA<2XrI8B0><HcbRVv3c!^K|+!_qKD4hnxocfZ-$UB4uf^jCiw+2d|%JPYwWW4-2 zbyN9I*^)AYe*|W^$ZJsrAUJk`IbBH95e%fjXGI?%H=&179jT1CMRlQRVMC6K3q*V1 z6!uYcQp}5QARkZ`&T0ox8s;2t(UB4};sciACt-isSn9(k!tKLx;ir5K@QJ6f1ijlI z?=$&c`p)}wzFglCI6(&ebpylUUUWLJ!SC}O^U>arXN*VU-Q&CKA0G$@hqFKazXM}p z;K?@?CNyXLJp%zqWwr?hfXp%(QWI^sW?X0BewSxgftlkQTbo+}Q;(zJPrwv>AKn>R zF8nA~LF3_~WUq9Tbhe}^e5ZWaBiUS>BIn6h$OGggc`e0urB^vmEzwDIi-FU!MVqD@ zs;R53WBh624RiD<`u@81ni|Tp@~5z&zfAQaeZ)-apK_4uu@X^v)Qz+Q)Ol1jxQBI> zoAFe5TYi&ia0~SN>f--MDOnfqjeo!|!0zWf5LLgz{Io65-O3P)c(ZU*cqsS`KC>sd zIb3gs4>qQ;U@frm9dX;8ogEkK1-5OL^ip53y?AR;n}XN^Z-FiUN?vmQ@cfl|74n|v z4K9c(-c_1yu4AcS+hMQh`00pu4FP^ll!x|Q^3L>qgvPL!?amE@)XaSW7x^yOE&hxC zl)Qkx$}!m>*&nGw`Vm`=|C5!Mos?aWU6GB!yWnYfb8v_S71N;0ya~Qai6jR%{cJeR zE|Jfp)+;P9zuBT3q+}II%66*0>H^gZ<!og;WwfH39Eav}T_P0{-=iU4+8$X8bI6*I z+x!F@i~qA(VmKGwAfWN>^!ULfJ>UMoM%$~qY%VMG3VL|LPKCp1Z)JaI9cF!Jo9evp zuI6dtx#1=JEB!Ts8yN*V8{TejnRNO?U_89_ZqqB7ETAR62~Ffe+=wt9nI3){i3PjF z5unYU5o?jXNI6JjmcoW%vGg6ZT*g8Y=@l`WidNQDYE*;a$#+&$OKaDy*E71FI-B+~ zG?hu!dblm`0^Zv`A_yHZ0i4rEV)L=XvPAr|%qiO{vq<iVzrnqs88l=V!7<Sq(My;k zR2J<;Jzy8A1Xihi(*F=4Y;Ni!i($7k4|xX6;WOfyqVizU;Di?iW5NyK=b|p3AKJ%^ z4c=xJ@eP0>T9KVee+ta;<+;Nyph>}oe7?2B`rOjR99NQ4^tfn6abn54;=-aHMbnG6 z7iASzD(q9#tE6|y<D$&MT7?_(Be}L*A|EZZ6`wc9TE<zk?IT^CJo9{`16zaf%o6q) z%W;>&4BQ{q3Y|z#tP{QoZ%MSF?x=*?1$sX;MAM?;qtl~zM(>P~#%g00MlXnd7&XIG zVnFrtbkhtD)4QlXQ437dj0X)}4SV#3+KrkOnq`_h>JzFu%EeSR`3X;x<;!m4kFm`# znZJph!Zg@@>0N0IaJBoOV}NbHJhCaYfpPf_-mjif-tis+yizjgcWiTgc4jzNI}OeZ z`x@Io`*{0#D{Ady+YYU#DYnDb4fgl0?jFYT&qoKZKq_#8Kq1<X`~<T4A@F7G6O94t zXb&)eOa)JGCUEwD3u8sY#pjSu$ZW{mtr7JAQtRSyoygPhqR?<QoAEO1fM@zG*eUoG zcHvE!-?WPX7h))Z{|v1D>`<l998SfZ<j~L#ZY=j5oWKHT<L%<X(ull9mr7bn)<_0n z@v^nj-_Q@ONL0X2Ku&!nE+BW|61<JvuB@XRCSOQ3(CpXM(JWU^QrFfu)ooEGDOi<Q z+d*A{^580X{x(FL3r|O;3T_M1`N?#@fF_6rI(n`-)vji)9NU1>wS_eb9_6LysQ>Q% z<IkFvQ=IkgPs6`MvR~!&{CDl&oqvvhzjJ%!Df4dSEiSlPC@5-IyvY32s<hX%YaJb3 zE4&?oH(5S(EZiDy_xs`gQv;XD=PE`jD=5b*DQGk`P%qOwHd<oK;?abf35OG#Cf`V5 zlm8{(D}N@HO?jJSD_1RPVN(Bc!T3t?#}XbV%#K}WLW~=XImYn@Qnz2zM%`F3hU`Q> zA&=pwBo{@vfQ<mwHPSA8D54fW0@Cb9;kZb}a4w|5w!;2pF*7)D3g}jSAWbiVcA^>> z?1Q0mDg>X*R?juxtw84>9!w6N1;fuH|LDMQ<}kOMJISmLMgk3?@72xMB0zFH>|bU@ zlHfaj1T2}4Lyv)j(3M{gWNBAuC;x}L$gE}y`5KWWp}o+A+3rv9t#@l&XI&20Lx;tJ zm^+qcm;5af7Zw+8FF9BGy7*FIouV_v+lx;W8_hkz@V?#F6P#Af+)mE||1?NSEDTKx zZ;p%&?+l&hM+*-j>A;C_VB7FgqB40@{#@Bz-BUeC(^30Hb3_x+Y}G8)T+($h{fz1Y zT!@EStG<O{tZthw&D1D*m~nuvufEKn*AtpwYJ)CES6fq4VJ21b*YZ|yKD$R;BnA*y zWO4Ad#Dp~>D>yp1CXgH$>NC44JEqxlY#)G-K$Q^1Q;M<+=N0}}m{ioSctXjdl1e4U z(jjK1B)f2K;qsDCWh1P|tYd9Mos+z7|8Ce0^rc6`KBgORve$-thNng@z$S35bU*Qy z7)%(b=PF*Er2eETuSJ3J(#V)#R7Z`E9vtn6N{s##(=P6L%zIO9lRHWjQ!jc$)D<v% zu8qzx<rycM%%*OpxkjI<W=x-`blpew9yOzqC?#?OejaOty_Tk6jb(4JcapV|`p~y! zkn*B2V4-{f{t+{@kdHE_n65MqiTqE{3rGX{^Mt_kU{YX#XSwU7YrV_qV%)pjVW-0$ zwtO)k0d_z=U>2P)FSd1eQqH6HkM^NJZJX|5oGY9I9CK{lt@+ko_W6!s&`0m&#y#6T z``o3DjW*o2#MaPO$EvnouvWLOxBRp2wPW@&AQY?uX4N;#A#-9`hV_>Hf^!S>ouhnH zycG1#zIbPQr+F%QEBcE9=Yg3TVJh(}BIkq=Bm@oSID8CV2PO$k$;uQ*^;Eo9j#E#E z_hFgpKXqTNz%bV6G<r>UObZQ{^rY!t^pY4|%+~0&(b5=KbY9e+C{@hW*hX=^;wr@z z#+-`s8e>f@qJPJJh}#^ihz=Sk?Ht8&!VVM>7t#?~1MR)R0#CSVXgy<K-Z5|KslH(j zd)d^|^+k>It+^$6NWrp#3WW;`*B1QE8<qR;Uz^;Oc{lS%6s#ziQ8=w6$+E^)%`wS! z7<lw$zHxyI&@7zHHVa(|FBH|1T){$kcX?;UQx&Q$(CE~QRfsxEbxE~D{Z=zV_ttRU zghwaFwu_68jf)Azyo!65peYwjI2Jc64o}z?|0>29eJJ{J%%GT?rW%H7hHCl|s%i3| ze7K?kB_My}eeqb?MagclN018%Q$GW2LPp4_;jBY=`gkUKeXt>^?XK${2*&6I&XIPR z?G^CDp26nsn`3~ZiKDrr8rUtb+WvqY*=viyoOqyfldHtl*=_W!_QZK^xm1u1{N+HM z3fSK6b$)X8cEs2Q+17wbnR2wUPqtsSU$gDCq*>nE>N+PnuQ~<pU#?6CZQBYQgG}2$ zM;~XQbCkOZ*ih%WPq+-ONv=Eatmpwr>YLtxXNmWO@0C9-xQ{llQK5(YTHqH@f@y*Z z!l~k4k`=N<;upD;5-KaJgK(poud8Sr7Uhqc7@ZVbJ^n$wI-ZSt68|zj5IZpDO6<sl zmWiVh&y-6_GA8bi)5R@`n;hFLdTUf{%-mQydYy5#ey{#4a7Q?8J8g4q4ecX!UFB?Q zDYcs_BmWSS<T&*YuLHB&^TP7NJ^V7d5q$^xzuI7_uQ4=V`g^y4iFAgo%+}v>x}<gS zwc<U+ON+b(|MGnW8;bjtv?;z)e5rJ(d39;6(o^Q^)*6nzj^@sKp633y{&~K=Uc_IU z&R}bCFGITptC8B0ieNQcD%(obBwFD^h^6u<>KoWmo5{sWlWL0cq_QV;*E*`#fFpaU z>Z<CYa)Gjgs-D`bo~aq4d8jT`{Zy_}5L5!$6h9#=2f5j3%neDFR*-DIF808F-U&UC zd+aS{F7UfP2i62kbTWO@|I*Xj-N#)MOshQ|6CDbd-?hcn*tNoS)Lr7?-93SPALVT1 zxMr1DzuPOhm$@%FdpJ{J$2QlM?7Ztb<uw2$?z>y<=H1)Dsg1c7c^3vNG4F#GKM_y_ z61^mxt`dEX{S4&2eZX|A&pZy!rlnj;=sSCcsSd>db4*A0TB^N&eA@%*aL#PT?E~7* zJK!AdqVEC`(&qo;FAK~9ull@T6ib3f>0{_rq^)SB=#lV}@R9I{unsi-<Iu^{Q;?|_ zDi*1ls!wSe>-)jEX_K*URLkf&F==rr@n!M;L^i2X@~EWxNx`Jj<bKJ{#8U}niDS#% zNT7k|H#yOq&^V!W{FS&ZaUElY(c?|`jB?{t{RK^1Ane>%Opt$(^?*H}6m@}v6%pJJ z2nDP8c$hVr=>>kb`#)!M`(mrXvZC~HQQe~RMc)eF6`TPgVo83>{HM9uK#LrkdpRdQ zr}MuzxxezN=9e$nSG>23w&<;>-RA5Md9sO~RbHLHIIt4-UUiuJTn$K!H5Pt={Cgs_ z^R}RV#Era%?DjVBw=I(>;hY^Wa}u4Y0_vswExAvgPMwDa=tP+ZUqc{-4c|^&ByY-v z)MU!5KvZ3n9CZ}v%bCOqG70EYHkk!{Ot*p3dRt@{qQbF}$>Cp+1i2BK$aV*--7jV% zZ2*R?#mjqNf@>n*QPm-Kq{4T7i+htN?A_~o>!X12l?V+Z3_6cXm@ixrbmMwL*1EAU zR#*zuq(pEKF?<1R!1sl(MV1KefDPp%q*RomJCXjpiHl{5VY)02{PnE!X8Qa2<z5r` zPq(_IF2d2ycEGyP`kxiE_j7sN3tW30CdYZl6fn4db0oT=ygU380%?I?fqBfS(A)5R z!4dIp$vq%Rq)D8T^Kc4Y0F9Wf@?ymTwMn<sP}LNQlE$SZ)=%1+{3v;S($aEc%GD@m zO_0Z@#mVDmCS)X*Bvwmom{2D{l+ZqIO>}{AzG1PUwV?)(Tb%l<dQ`VYvq>GRx=L*& z9%4159V91_J1~oj7WEcIiGIK=wjrdB^}=5KOLjFgKDgCmbo{d?INt(2biZ|ib+KiZ zg|`f{{AaFF(yy>?Ue$l098K=5yl`Gze*MD2l4+%n3sdq}7W6MFDKr&Ii>j53FlSh% z+P^~ndH@s8ZfBQ3CoL^>jNJ(N?dhSk$bF!Lj}`6&GDc%jv5*lS7486kN}^!Cu%Bp- z=!wV-+ZdsEp%@Xh2NFZ;@V3Y)Xh|FpcS9>n&&j$1i)aq{gEWx?$WQXg;1U`quS;Ge zSxT+cE2pZC14Wfn&QQPByig~qmaF<|{%9_%VyG^}H5r2Sf=1m>*wum;3O2Ppxo&JH zngMog`;e3eQW6~wbb{^NVLCuJgZJkkrV6+$3@~S?M7Ij!^dR;%a0Fikvw@F%mL+&E z?C%Ef7enLO9l`Q}8UA{H4N&P~gSpT{=;0gazVDL5j`FdacCG;)>lQ~<`w+ORP_7rQ zN8n`c=UM_}uOuL}=Gwh(nO_mSNn`9Ou3q>RxIB7_9*a#9i_{=H1iYu~*ev3?Law=} z-J`t=x6!KlMTVLNx#5YiTlD>yzA;Us_8S`OKkF#n8*M~aV)y`*tt{P3-70;OK2y6x z(^6AKJ4Aa!{Y%+hu~~kK#N=u6W^iZ!ELjKL&F$g~!gr9b+#@(A7##V_r-kk^FN6DG zo;Jka-FwvY*S*lW){Z&zpsCr*vDjg9zjBq?6qb&bf0kWkd(1~H<?WBH7tA}#c-wXR zR$H9?o8zFfx$}}^9EdS0IKs{xcaf)x{|=njU-~A&T{A>iWbf1SgHC23e<q}1FSGwo zqI`p#tX^~jcoWaW`@~mK6?P47Pl@;en8Y#oPppFEwxkl4D=9^DU~bz{wh5!Lt@saO zJTVNn$~r+#DFWTT4OkQDN@;hzhP*k2Q++5_kqMicYMP$vE2>-S`kD)>Cd!S9&Xh`i zm|Q}hBj1swU}OA%KO;`zJ+c1K5AH0<79NTC!n=44camm<duRjw6kt6m?s(T%=LXkS zupIAm>YdY^?clpgIJP>{-~^fge1uq+!Vz}VcRg@Yu2G&^eo63NU>$T?Uj*t08o;}^ zqra-p<4g7T^yax+c_#%nL%(4)U779-M3z~8iT_ogQLrFz5PaN8yqRag<CY_64aAcH z!hW#N<G|bT4Q$PGk!jLSK&9D-^&-aLi{RP5K-xtbg|-oAh=)L?XfP5$_M&%Ts!>;R z4y}hA6K_T+v=u_2C0G+OOvX^Bm0i@E)DzW0^%m7&l|r>z8Lh0LJfc(slXj!3wo0e= z0Kwvn@+tL)S|M*BlcL99Kk`jfLvRTk^BV*_|BDla%0ZfWFOcf?coA=cr@CjmR|j4A z-oP=K>M^@sx#j}DHf;apc<WNRce=Ow#?epN44BAuVY@MX=-z=LFq^Cv_z3gcXTe`I z4xNSWp|)UaSsMPuH{xc{V<5G4&OasaAG=(z7+oRZk*(+_=~_t-;UHcYHi13)Ah16A z3-^fIizkYApeAfR_Fa;Wu0?rds%R#(n`J_oc!;<Gk|eE;3yCrrjoC3PHUZKd?cuYe zl<gr@@}}_QD6jsl`3uzcpz<EIkoqJ?NQ~$}RD;=HD{2mPin>gl08i(7ybzm&o)PYh zSoj&-dFa#&xwhOQ*2<g#kK|hVU|_O$zk7|_<(lo3I+oclIL^Y%>aVA@H`9C2*TnbB zlL(oQxv-Uyd**m{`%d`#`F?nR_~o>oUJ5<(ih)dU?rje23lssN`wde7=ZNEhk%7a3 zoBk=jSeW1z2OdJl??+$~Jr+*L6w{kM$z?L>fjs}RU;(t&j|Drh^Z6&x2k0G|$%CZ_ zZq;idD0B)dgGKf@dQH+nS|AZgISe7viFQOCazFK3NvqzfS7{DvFX%5rLg$b!OP_3P zX`E=hY`PTn*woHwH=H#r(U)mS?Gx<|T?o#c5e=grqKX5GRZyNvh_GvtQ|Mn&J!lXd z2l~sh&?eTzE#_|1ll>|1nSLF78cYON>F&Ufpf$MD|JPH~^Uu@E)65lcL_-U*z3;m3 zXCRC18A4ex{RK8QMg9c;FPH<L^v?*cfV4<<z)hFYU4y-Ysf>h8rMvr${<<{7vhbX0 z$!vn%=0eClsTn)$_2bzKY$Luw<W0Cj_`irlcw3w)?kEyKyRxa+CR9LgegY&2M?l{A zEBZik6m0=N8yV07%@kc0okkp}4{Y#W*j`K_5ON&x1b+x#XdWL7smXrCUNW7`0Q<mn z<trfk&Q<SIj-sXk>rRV_q$?!fB=4lLSTQsPB+_)TH^PH?wgWWN8VAP(Ho~d0hp&$} z-`m`G-22@#)N|XN=9=M%vbV9#w;i>QbkufKaXfX-0UGyJ*j_|@w*v~glzs`B>}WXg zsvx~fFqP<%|I-Dy@!VoCI{)BDMw&o&uc6>VcsIN$n?OcM0~XrD!eYpU9~9mbz7~BG zCBoF}nIKL$1QK~xeo}ZrWECXTJHY0l1X^4V!(I3T+#&WIyCgI(;ulU8sYT7j;~+PC z09XYbu)}yO*o&ph%48deWcg~vadk`Gctac071K;(14A>zRiik1a|{#XiS@)CiOr27 zO-Bqnb%b`GMz86rN~VSrors}i1>yv3uC_{lpaVo$IGLRmT;ebAF7Qlo=edfU)g9yQ zAM7ve5u41m)GD#1+Z5Jo=1MTLerauIISDk?y1<h=Vu`bkbzqR(+vhR>%dwWXk87bl z&0%)dceQh`@*ed6g-oP^aR<Y}E%epkVSg?EBRGE#0VexPu5Y-azyzL@@4%)U6W+(Q z2)V-dBO4;$h2PM1SOUCD#$uCYwec%hD|EeRuCT6P2AC;(My?2-A*Ur`c=i+{jl{jd zOIkI&P%ss?*tw#Es08Z=Hdsbl6ZQoP*!LviVthYjRrRD$eoQe@-CNU0Ggo8L?AL5n zMJO#*jmm%xQ-HXHcf%S>+hEh+d6kP!Lq+hs@(KQhFNF58smved91x}^K%=oK7?xfG z6?~*`s>kn+c=~(Io<fhwml?<f@46xQCs5rl^R#d^cP(-Cb}#Y{^fUgKfmAx1nIDqF zzwIq|74r6%LLZ@(wUvIzWPppSAGoT#yZ}-&x8QtrDV#6-CTcCDAgLh|j}v7Jw+def zZ-^qImcj>MlQD&_hm*sNAXmbMX9)Bn45^16MUIM-&@JGoXVEhvMEn{$!rkHb@k^RV z#3@TueN~556*QAHv}%a*I%GJ@DMredkc;KVsLoVF`El|$VZ{B??Px_{lym~7y;N{S za1i_}E5cWRKX!+UVS4-Oz~r}uPX}f%#&gMc#@_@!F9FXg&p~hscXX|T>|>s<$Uo87 z!Mn*900PHlPo}4q&+5J6(R-79Z#)xRUEPR(Q}9r5XP{=_R$z{QlzX~kpaXI2wl{DY zfp<~|OpUI<<-osSC#ICy$$sQ^fEWE!I25|YTLmIfp<tTmn50Dd4LIXv@a%XldLu9j zt0Fhi{=jP(g1^U)$!w7Rd?M4z4A?nHbmB-$w6!E%vIZ>f3uXI>PWXFSDPfS`f&STg z*-n{Ab{+UG&mhTlm8?stsRNJ%PmuQkmP(p@8T4&W6Dhb1T+rQ!W3uu1Rrz}A60|`# zqCMcb^;}RNGKeFD4WUh3S!{!T{y<TwU{W|XY>FHY)dcd}HRc98jiuQKA!CFTWbyy8 zR(b_}GdLnRnU=GD=&w4%!f-)o4kVnmFfD?!;P-wB-YcB~3TR=i;6(f%puA-X=7qDk zJhm4kF(yLSeLVC*F!pokAbUOVDew!398P8kJ(jKv-Jyr!myxZJ!Qps*5KsmDw2{uC z-vQriE#E{?2%oOGky+4gUIhHRx(J2Mz*eCZkp+^8z@J(nMWq{LLr6-_5WMUVhTxUt zeIO-0k{l)%QQPDn$o&M4KLlRZcI<_$Dp=W;in_zy@dU6G5b<f~jeHZ26#4{N!c_t* zcmY*h4{j7!2`u9y*wbJ+@6G6F1wATo)6?0t*+sb<I!{^6WzVcb?R~86&2LIumFX={ z&6`V*l2FO4(w3#$OIMjcmd&+Jww<?TSl`-*Lj!H3<3CrHM*|+a*gyin05?NxH5iE& zzm)Q_7m)Ob#s5<8)bmu86}41VwaFU4!UajlA*zllp^8z}($3T#RlbMkKtHNB*+bd@ zT4xhwzaUvS1nnw0D%&I5jqVbSf~Iq!u(hxV_$v>QgUAfz96D4wR2nC_hT74ol5fy; zA0yRBgV;W>2*ndLsivNjYB=#K<;&$4i3WH&xfe)i8S0?=fTpr0q<XJ3Q?Cec5P=Wn zgXFkmm1H;Md!wZnCEvmQTq3v|QSr~1y}@^Z@BT5~Jl7ClCn?=;T%+7G+;bc?EbGh_ z%u9>Y3ZCV+Dl(bZT4U`k?Vs(qa{}z<9S$Q<N7p(}xCXd`o;LnP;AglP`Y6m5w-Bd_ zFN(W~GNDB>6>=>*1ewAo;vc9<T1|RfvQVOsev!_>)Yvk#iWr3i;b6ofl#6Pk!?2IC zHSpwY2NPzNXia25YIqISTjs}W6E1uqq?OyqcTpV_QLt&BD6av3U5<YRJ6aRGv#c{3 zjmV{suq??UWP<p(a9p@;D2L<NWsI9<fmxX!%4Z4YEOdx>1xE$v21<NEZ*5<^FWEE3 zmEpeOo$K>^FT=Tv_6_k=bzHZMH`_`VnopKKE_N4hFFR&Wb=0)IwzjuNJGR(%lxfU8 z&F4z5l{7aWvetKGIV*a0z|?;pc&82p3xkiC^6X;f68Azd5M3yJFO|ubk*H#<T!ep; z-6dnG*>a2;q7W#rs}^g==;I7k^m;9&t*L9MmXLL1`|<h2TWC4lAmZdVs20>2q7FU` z?<zYF&Sx5&c{rMYbOQRKOxhhQfZ5m>tg~z#I!$;+coKPqbb{UoCh0~lB6G3LSTRve zZo-=aReBEA1^(+hWRr<g^19T0xl<mXektxM4pDMy231{tMK)Ke0pe9(sT4d!`=lh6 zi0Xwu!jO*UN3iqhr}Wlfntzs0?d$HoVLMRfD7$OzX&Y{R0i?Y5j$w`^wkOseR)y6I zCWpQDw$3W<SMCO$`MwpwW=w#o$G&7xwjMW{i{(~wpSewZ5Ui>TkTf`r)j*G-Md)Bj zUo>63NPHJ*i>^nKL=Hi9n3xyCR`@#_g-%B%As>Kt)CXGs|7YM7L3`Q=J%J>oIebMf zNZMg>vb)%4U=@wS6xcsWGCChQi4K%ZK@TEBkVoQk;>YMw@PQ1LK9Sg@EwJxsBVi97 z51oK?;1>qtJfRwpW1l3xDC!}6A($Ewgi`5xkRAFLd>^<7Cc)f5G~JE99b6fx5LgHK zA*ZjLcM~LSJ^>ZrqkFl#mAi#|o163ucRL)EeK|1tl+NAGoz64PZSGOt-JUw`A#Mfm za2L4K!3@B<hWNVscfw~aJy?yq0rRDgoQo&L%Os5@HPJ<qIhYsh-M1wYd?|UISVFW{ zw$y#pyjP4@Zq;V%r|KF2{p*`<w(h-3MNO0Ug|z5qY8|POKU7ZC6e=povZX50OE#9~ z2_K1)B)iaJ;a-7GJPX~392HeZ>R>yuBqUY1M%-JPAT2NE1wKSUR3J*xzDS&`qudS6 zn(NZd#CEEZd=35`UnpM>t&5KGl|&aJn<&8F1G#7;wh4cWot4yw+<5~DDXJ8)M=;?N zcw^t-()n!Qe_mr3F<RJ>E)Hnj`)od2J*UmSxC}S5HZ$z)jrNPyQ_dJqP3Id+a+#}) zvk0v(Evs#nU3I(~|FJ+EeVeJp#?hw0kzgb4e5gC;;xdG_q{Ff9SRLZ6;+cB4I!F0b zxm5j1ov!Ev|5xp)d}X3iP7S4Ms`a{R>J;*k>=QAUJcqqQrXYWiZsG}o|2O)!@nK#J z3@1fICm0ZZ%3g+6)MutVtqt4=q_A%8CEefm#<z(<Ll>D2^wdxVkzG_S{2%NePIDVs z(4hoy=3;0gzdUp;6z1oFk;lXL;}s#4+r!Ra9zs9p3G`q~13j2JoS)qdRtT0J!dwj) zJTIK9T)%<#*2nY3ErLB!*!SFX0^AFYoL^n(4#v9N{@7W|(Zbr(y4^m-k?ff5JOuxA z1`v@e`t}18|3a`Cdz?24l0-AbRmFeBeWd;HL`Y(^lLu6<HP<w~v@5h4%}KQiniUy3 zxwgDvaddiARb8^?qHc(;qH+-=lCl*F@&@pc`^pZ&Np+;`C$SCQtfyrYu^EV8@KB%> zY=iBpTyz+o%;iM2rRC*i@?rQ~OiC;VCZtnZ2@~S0;KcHtybqJwIB?g*s#`0sDJQBo zs0zs?vT8(Fz8_{uedKA19aJK@7XJ&qlE-L$aaGY{QHFS~Xamp@ZbWVf-$5I>b?6{> z8Awt|!KOe8v3va<k*78|LXW_yZl~jqb(D3FEoiN4Nw?(Njsq8cwDYiC<!J4!=6vQT zbIf;Ux+X%-FAh%nCzwo*kJNzNM19E)_*7Q`BJ?%cP5clUp(dy*Y8>kOsyXU9T1q2R zK2zkX&Z--!#!&Z&^~6HB+b@E|!E9(OwvgBnn{bR^7;OGWho-~kxldq#FAYwS6TG{; z)xEoYr7+*9?CI>e1Q#5Q=Pr;}jjpD!Z+h%lZ~te#V*lxB<<E1c+oSA>&JD0ry5VT- zNe|eAcLUG;XZ%92Kfm=?q{B=%wjHyLeoIe-6ImD910ADlK%6QHli}ffT=+u76W$Yw z=j%s?@^a>P@CSW181l{VwFjSU6R_Fz^;HaF{>`q2;7j=EYwFnyCzJkxDM2LY3Ch^d zkchRgzxXYJY9d&?OLOoN`3PtYj8^J3X4pC}(bhL48<KTpT1J0apQP!fIc_X4ebu(m zXpB!yPc-kqv29R4Rqlq2;V-fhep}L6+7hda-W5qC2k~pN+R#YrLG;55;b$scx?5&O zQ^Y<rMaBVz{s2B3r|_9%MTJPQQT{=mtH@NAQ?T;U;1ms#<>B4ehuTiO$5u<nL1$&E zq%oov4?^N43^GO7PEaaJKwb-)@iAbESrZuvN#>1QM}A3YE!QTL%pVWk;i9-HOlBa* zf5RX46g#EvrQU1qU-r%R>8^$DOAgF-)9#1;Zv$sd=US&5zWTo%TIV*`I?q#&+kL_F z1%8g^_(c9k%z(%<VFXU2m!N^wL%LqF4AS_MiGx%xN<{V`V-&NMJr%d*BxO<7&^&;7 zaT;-3HW%ha!zG7d{#FqYiE4yNt}9*3@9{)D#optd>CT7t?v7XXTb5mBXIWL-RNH>5 z)3UehLurN5d!=K|ePCC-3z&}|9E?rvFu0z<v@pY+;(P7e<U8rx4Aao<(1<x2vPXIe z{_*ugL%?nSEIbOj1gC_@#Mz>`f<8bP>JwQXsST{Y*hm_*E9bH&Al3aDtinqpA3_#j zrERA(p_$st7YdG~h4gVcMBfQi@TPetdH?ec@{aW92RGB{a89Yt?F?-Mky&L#DsC%a zAypj>Ebr{dGbD@Xuk596rWNWZ8nPj^(N#yNS=9uMPxV=TpRA{H>T2kXI)P!5i8fr- zK85Gb6=0oKSKd>)6+D#!jH&;~)nq&YUPftc*x`(oeU<32|Hzl}{`gbrbePc=N&5qR z{kT9Gc>%dwt*|yQ07i+vNs_T@*jwy8xWqZx4g7$#7`mYeK=#`poCSAviMTB^BzHhR zvLB*^*3%v7W$7zyudGO#A=xK6i1tKoA}TaTjEcSrVukaBi4hC;JhVu77by^*h7Ro_ zNS%(MkNUc~@7RZ07L|RrILh*hZH3oM8d{x>>#i{_##PQ&;D6vbZ7;Pha4dA^yRW*} zd4+*BU@|(&Rpb{&?8rCpXU!nf<yWa0^5sM-aT*_mJ(7@^NY)xH59#e>@lJ7`Fkd(v z$k-P}n<B^9X#aV)(VgpjZ~ba+Yst2%%-8bo<`M;!3e|-(z-P0mOm4YnEwa8dF9gR3 zZLI_Efams$aDIB?SqN>h|NOu)4=)i95G@Xugnx)$i@_BhE{@a`?iQp9U>_=CMA?v4 zH%T}o4|?<E(bs5QFcyvy7m2%yNl`OFGr<<5Gv0^ngR{U$BBWX3GyLtKI539k815iA z4Bgn7;aOmjUdT^^z2rsyRA?vLh2G%b?>Xn11ME4{ztWc$sLl?Dw=mEA1`B&IoG7G4 zt-vl`C=#LH(ZRq087<3G*eE+GRVz$ZQyl|lbVsj^X<?dd%!rCNRnoQB_l}+sy-43g z_r!SAXw_&mzx4O?A5;yMnVOc`j`Ca5zQj7^9(e<-t!y~i0$+;Wf-F{fR0gNGN{|BC zAPGUAysGeAxCZ3pRl@tiFzgc_01>AbVnKQ%osq^UBK?c~#6C)BWG(s$drDL%D#*^s z%)~nK9G)$;N^)fkbw!n+{2(7dO;Qw+3$RVlNuMHZ06o&yNQS6!q$S@8I06SbEifr7 z)3XBKe9`U=)~4pdGL7w}xpv{D!ir_JEz^ox<n<^lGIzATv_@?ApsBRX_rU+z)7g2% zmFdq8Dqvc9pIICVfH``hun1X%bVUD?naNAUXlX36QY=EUfjV}dTg_dE?T(E<1owrN z{P)lz+UYm@-}qnnK6sybpLn}@Qry!$@4P!aq<fN^c6WFGbdiwdZs(fnc^r_l|6s$} zmA%UC2lh(|(}R7^{pQ<2e{FB%Y{V;QA#4LX<y_Hs(OB^%<O%AM48@AE?y@|BQnXb> z$tM!mVZQJfGr<gaA&^`dTp<4jM!Gb`Mrf`EAoDAcr^u3_zk6I%QDEl(a`RXX*B~^N zZ5GJzx;z5Uedh&7J9m!ng0F?=qUV-xy?326-Bx04V&~v3y#n$W*<h`l&P)x>5k{fi zBwwZZ_#b&a>O8n^aQPmk6nMXB3bO+2XnFwn7}SQ!Q8VLn5(dUTj2a!YAuc(#&@{?8 z-Ecv}P($S><Y96)Sy^5K2(BxY<&@*(i||Ic73L%5rMtytqQk-|d^|K?)57z^cX@H- zyx>>lP{>KQ309@+GwYe2>|{8Py@Sv1a4rZ9%uAu}VK*c}b0FV1I+6vmzXtF#lLGen zi4rGr8aa%LP#h?{b0Du{zyY|ZxKDV2Y1|TA%q>KA!T<NaPX0V_teWv(Le9|NP!0B9 zpl;w)U^Xyarn_6ZCIVe2-QKutXi1fl_U7`IQ)MOQ=a$Nj_pYWMJD7wH_?iSeKnKw0 z*ZZCR2Ej4RPi||dB-B7aqXT4|v>45lo*|ACr7$U#OD_R=*bHQ}+Y*;}thf<!UPM51 zXj8ZbyczfKJNXV^H;oRF;ZdP5LjmXE7CQzyJ)eOyGJ^TZeq!6PF`;RZpMuWdpl>OX zBg4VIVnxSdGFf-*4b}&rga3y`Bovm8bHqO)A8(55@l~?_|Gir1QnU&74|^rq3qAiU z$O&O}(QQ#iWCrJDb}^CQs6d-QoxnF}7(ZpYuy?>iRWGo{zuu?vR&~v?HZ%_@dv7^l zE?3&w;<F=;%Jzle0KR2EU@LYOd0FouI7gNDHTCTSnqIv?C@`3A7V?Hmfsx@BY(N`g z`(-D{87c!Ls<%-p<qd^YK8<`XcR@=dUb$8^QSqIM)ebk_(pA??*Pk(V*A`I|DY4Ql zA0|t~b^v{C4|WsDg?7g{w7s}}BqRJ)I8HnxauZBp(*=gGgImEj4EGJS<z{e0pv@kE z6!|^Q#kLN$5zs(H7%eD<ock)UzxahF$qDHr>3Td<k)inyGOSg!7j)&J!CX(rskTvz zmHC=g>N|=*sx-qLlhmX$?Kfo@7)`dyuDC%=l#B&)OSUjI@-Bq15oiPd^uBcYVBb3e z_+$rcT1%j`X-Tu9)Pe?iqyHVuvE}s7S)1kkGx1O6-zNVS=2t8lY0k3WfP7(XZ>cxi zNBeIClbFs-m^l<G7ilXv0G+J9NJGge!lA^}CzNICcw-Awj`qFsr=qF?rBW%U{4PFT znj?(>S8JniknpP5ChjAih*U#n3hMAz`J!-Lej#gO)3^!TMfN?t(Vyi_^ebVeoas{s zn$fM;ZEOWr4=KDhY%cWuUxoH_t$?lV<$kimgH0eQ^D+p&ZE*b^2<gK1aIHug{Q4F4 z`{g3L!-?Vh+$wr_FbSrG<AOR!$gF1HvUS*<(1LZ-yJ#g$7ruKtLZW-Iy`JrvwSQTl z_+_!bq)BmuLTjPD=xcF#^Q*EcWuwaaSxnZh)=E~=nqt-36wa}p@^H4<6ZpYB6f8!3 zlIyau@@dLm8diV8m}h8VQpA-{JRdhAYFJdm*lDppqld?|j1$F2$FE3;OFEjgD6w1O z#H1GG8pd8Rs`Xi#F3L9KHegzMV6t=?TPOP{F`ys7k+Vapk_3=JXgkSi<N+iUG)M~M z>}~*uX%uF`j-eZXY<m}ar~;UPk43W)6roWo_6)bddH5Q>MXplJA}3>hsf-Yl+p!zy z8EG6@Am2_rl#L>KlDlNDpm8Ba8zZU65qR>vL%m3Sv>v)y)JQNqvX86jKj@aZPdL_> zO)5z?TP-~-N^`8alckb1+kC(HO_8p6R?+u@e|a79wim1_+FLL+?^3~sl6dofrR&P} zJJbAH;QM?DUqR+b-bwbzHp`nR#E`S=L6j0pNv(VWHAd-G_tOtB{V`QAwgp4)Q{y<p zYP~|gT+>V$fm}{9zEQFr{ei3z#)KWAS!`qf517Nx_b>Bp^)ICRfr;p!|B0s`Og9eM zX2Yp>l%>7xxh-T#DH~ZvTfakhyA$+)E5inSQ(&fVgZI2|pFb%uBRGei4_1b;kV*SZ zk6~WZc6uuZ6X$R%=wS<xPADlpA$Sxy8Lk)-F_i+3yf*hycY#~wDze{lYJ7tNo4^E~ z0b8;Aev2#HuCfib+$$SvZd=mLyvw%7TF(5kY=Oh+5_?>}`OJ>cSvbSJ5H&+n(6>OY z@uO+@Q`vTDK>7inONEtD>IvGprg90RQmiSfl8%>Clp7p>E#`EzH@Zvgli1vtw=w5p zhDAH0>P7F2S{C&#x@OG$sD{Q_hAe$`?G4o))obN<`8Rw&cxhh233Ws`k&$pzM9g=k zW0~=AtLx1Pm@z<MF$WKUgCZ-4vi+EY!PCJ)W<9iUU$R~Ko5E&jq9jRD8GD1f@QScG z>Ih!vGs;+XU(G?y5G??Tv|}|(wW+!!Fjno+#;GeQpHq9ta(F&g2^=)pvWv2J(vM<P za5!|4UK^Mi=;TXt&2eNo%(mmDUkd*#dRbh*=v+ahz*5k)fGhY{c&IQ`*r8;-Ic$Dt z{%F>f&9Mx$McZ;Mw`}d)D)1M7W@?9f0GsM3=7IJjPo_|}l<PDSU8eRdJo|F=Dnm`Z zMAu$d#lRUl>)&e6>0am;=s2|&I<WJo+VTOiT1YO~=e|XTaLT}DPj^p&XBm(<9@!h( z3vFku-^&J?kCd2;Y85Xmxm;YUa9jS+{QP`T;r^ln#XE~-C7Goa%2t?*OV3&wx$1%$ z_^wAspX2I6w=oF$n@ZeCb}pS6ctm4Bt`i7jkx|l<(kyA7?5OMukfg%mS;91EabJhi z9KtHOhrq+L@$JJFpdk(6#xl9kwB_h4fhqot{;2^oSfmLT;`m~};!JaWv+uUwb$|AE z2wsCsn2vuF4)C)CnW$7U3W$}Pks&b2E|bUzTv;Bn0+sZ8jW)=$&W+BA;p3eNN8?Av zHj8NzcRFENLc;_>IZM*Eq`iri5(9}u!u=Q~Iyq)R^p&V+<38;oZA(b`Z&Lk$`TcnO zt~3>_)^5QzV7Zq7hqH#DvLJ)68NLeJ+uM9ME(f@po#3telWQBkAUF!?C<QWH+DP^t zc87jwhG$8x1L<ff`UbXdF}Q~4NH(PIQa|Ona*g6A)sbikr{FVKd+AaU+-3xQMEAmT zVJ7~Ky~7RwJGnXdC%DU>;;rNv>n2@m!CA1<<+B%9s=x%MPubtnaA~!&qO!UcnYEgA zVA(KpmZi|%%P|r97KP3qo}b?7-f_O1fQe}d)Ut2fbN)f3il{X(ZoOE4oRq&*4pe6; zo2pLho*APJy|ilGDPzdg*-%@{s@JKzs-{sIavS-Dybe!H0pY|BBMQ+6L7VV;wn-52 z?RH+a3N6jd1B*Ww-Yt4pvbwZ+F;RH0=wRu~lJy0R@@f|jE7?|<lDji^VZn%^^Tokp zXYtq4E0)o=s`g~Z9cLGJEl-~3Fm$G){3ghyjPuW@<-uRRKY^=oB3uN!@LGZ{;`YdO zaUQr#uc0(L4xNTnfOE4P6JmWN=OrgFmF$WH7e|RMBeT%4;+4n%Y$!Gy#n5)}3^|VG z0_&a@ofAlb+*XBM&YoljvHwE#!=3mB(64t3whLE9?g_d;2J!|trsl)@;gBQ&^UDU2 z9Nb1qsrstV+Eo1)eU`Bx>Pz&5=u@VT#=B9v*mkiyVn)O^kDnXwi0Kw}C~8s6ljudp zY6hWkroO3qJEbH~;TG9f=}YvM<bkvlZ3vm4=7?9+7RX?0Aj7B@EaBgC9k?3o6S^sL zfX!hCgsw+^!v=9!_)!EAWr#WpQ^cF32c_S{n?$R{Z$)L1oREXd1A@B@e!ey^e}LB3 zG2BzQLR<`6;R|rnUMhYniWY4aE*Go|i}_((ZRp1I4=KW9!C|8T>(OmtJ81PWk&(cG zTP6Mz5r?OQb~Euo&Nsl@*ryEK@;~*)c}Vz<ym!xY_Hhny)p5OYHg(Q-+;gmUHiER& z3x7B`js8XV=PChlwkEiQ#-aTP6ZML`Le^FO2dV^y>OtM0iYXnnTK*V1l=Gl(wvakO z%5b^t9F`*aASlnx2_E-7bD3?^;Jh%R>~v{&a|iSHqRRQEyn@`)e}i(4WUctS@bBKg z<Nq#!UkCoJlJzyGZJs3mKz_ZV`Q}b=&WN&ME{|uN=euVK5d9jlC_9_2!+qhJgk)eD ztS8QpT)@5%$%^fYE>ssvs%WR^s~D~5q^LuskvG7#rozulo}r^9(<L4>8JQsv@C^3@ zc%>}^wE{7~;+jfdf?Usae~GuXcLvZ8+W8)O>-rx+B2^d|3E9+>fsMg2kT`w<_L7#s zx7!MC^M}X-tfd@<?P7UIur1U+)JUL{)6vk`RN3^z*vm9Fs&bSdYG{ll?tJ{s#Ifad zl}=a8NX@CxsY*^IHib&jl+R8)9>o~?o2na5DdVY9Rk3EHvbp>`*k3CsIs&t(2fl$Q z!oHxpC2_Lu(&4ZNS_eF@>2%M)b>;x~m3hIS;d8>7!1;<pM8Kzdf$T@mW8JX3;>E%d zz{2<zKE#RnYmsM>V7Ne#E<PrjDL5mvA<NL`Fc~={iN$6~Zi*AcINDpX8@+_)ODoET zWA(5MaH)B)BUq7a7XC@vUHnzhMbMt_6@2gg<-OrK?Of-W<1BN`u+6qkw8uE|%aq0K zi+hxQElSR9oc%C+X7=j8Gyhi3$<Gz%&n{S0!dX^YS6Z~rOTk&8R(uOV2T3dZkn9Tf z0rJ(Y<#yaFpRCSM9hG;d-l!8bt0{t9D&H&j$l6H0pqrs(Rlr5FiOg|-PmjRuaF%zB zwr(o@R+yXT&$<4$`tN<24>Py_s`8Wgnfs&N59^Opzx<g$e}DbE_TQWQW`+BTPn3<c zB{*uqZt;b8o%futQJ_Bbk#G3ZeGB|kX%X9>NoGs<jlwzNVq~SnA?2|u_<G_lQ5!FU zRN7G4XrONolsrIlA<tJ1NatZ`E$k}x5`1&Bu)jbDJqG>ikI)*8NDpFNu@Lk!6_8De zCv(X9WN(5e7RisvqsWi2Dc*<2;Bj~rydlsDqVZqEB=B~Q#!<3F{t{SBZlwb{9QoR4 z?KRDB%@_>|fBMuzRSQ)EwD0vr`c8&~C^WV(Rv3RIv0Ax<@z3I(By5Q9WQx*_HcXD1 zZrq@|U}zNGDe9uJP0ZK$m(d4wd-a@Yj80D$V4Vn$EKZyRxx5wpZ2G)!bkM{-q_6uL z2AA=`&SbvRFZdskT-NPR1vg&}Pqw|IBhNL>&AR@28V6s(ZC(~?EEtch5(fmcM77X5 zFr~SID6vJbA<LJ|B^#2v@m)j_)k*oDLaBd>t*V~Nw%~+1Dl0%2MC?pf;DEP@bBt}U zbz)hgl5vHuybb?WWoQ5S@{|AC^Yg|JQ{Gaq55A0l$-HD<{d`sN^~1N4k9|HDem(P( z{A0)(mE+30T(rtO!=B^``5MvPd8y!AxP<^5K;&?;Idwsks^6^Luf3%2rmv>$qWz_d z(V^-X1t!0Tlh{bKwx~{cE8Ctf4Gi$F@LY2g+NL_LI}Dat#aYGuO79gN%lr7RUe2RG z+^?mX^Zu;;gZ;kt`*HTjyhnLW^QsiYlsqWgVEtfS2o|mVu9og@o~k~x?>jJ#%CVh+ zBi18yJJJjM!`Fa*M^GMRE%h3$#_-b6!FWDuRP2Jd%($rurldE?naKlFdZ#|A@Sp-; zVM)c+6&{w~mLgAno_H~#UgC84^=$l@xW6$+qSr><HMY}t)h^OR)OA#!<UR4)&<cMl z?I(FH5&~iL8;}^y{JPNi(CSbJ{s)laE=Jl!z6$1vjpA3~U7Ui?id2I9jzzFvoG5vY z$w`?aLz%4lsve;8>85K=K?hi`9;8lJ-B&f!9MFEy>!Z&@qoGAY*OZ?XdsjS?TD_vY z^6QG;R6eyzYV)L}ajT=Zm`>|At23z%@=WNlq>`2K6?j)-7;vt$M3W-_n0da5?zYbM zwupIpiLp3PR9vJjG8e8XZe6;vbaE+a9t{5NQ)PYZslatV?%LyB2JLw!aF}@*Y94+b zc`SO3RtE;pKI{vgM6{Al2fkN1VJ5$i9tOSfh<}4e>?(FHa!Twh(5NhBg~f;RV{%($ z+cKN{X!-5%m))NNA4Ysg{Xo1w`PT3b{owj=>|@KX;><o-IXTDj0)+=kI+o@arxuqp z+ie@1uUsx~O}aY}R?6|1aGiKAJUQcu`asq1E?ta$lHCNyVGg!j>X8&kyvRGqLai2j z7L*A}1hWN`U<%O|$w$|qv&Bt?HzHu7VV?M(c<Xt4c-MQ&d9&RGuIX-<r-pa9yVQBn zHPn6F`O`k#vCwIBmcX>d==@-3?9ZIF+>hNiJyHHtAX1!QrvT?HOS~D)lso_upBdQL zEtM-Z19Yto(&+o~Ba;56jHuADa;WOz>UFCBs4}h6@`~dsR;YNU!hqDW<PYWI%4H<J zj&BW(t{w5Q3ESi6$E}IA#Z-u?8eJ!<t}#KoO2LqM#6{Wvle*8*+rZqtf;NQb+$Gsp zJc_7<x4>pf!pJYt(?}h@Wr*XRu^;Ga^g-r3OsWbP3v_Ch(;EY|gDdDeG|3!gCx^Q5 z`}tnLJ+%r4ARVRc@m=HsDnr>%&1-7t#~Tf%4aQT(v!*AeJVUmwkG`+5iZM~2r9TnX zGp2L&te9r;+hWfeCTkyP@2ZB&u8S<fYQhJs+S}D#-h119!oJZaay+&@Hcu!uTK>n; zS%)`~er<SWGI95&Mjb2e?(XigIE%YGELPmzb#ZrFTuW&wbxoV3ah=K7cYfc+)ocG@ zccD!t?|aVk-1ohzgVt3Rt$n2Hvwf^(uH~%lfHkTzt#Yijg>{dmw{5xOCUjk9`KJ*F z!Xv|OnBOiYvqG-mt>F8>Jg`5__fGU&b6;`&foAd^pjXVXwX&?NoLtGTxLvlX^b+)G zB1^}Y?JkcjJ5lT}YG3?sQJ<p1Vo~{&%7@lnHd$32`wx3(`#rnJrE_<24s>{2)qFdA z^L)pG`>6}e3%Vz>9BIYt1sMlOL`fN074WS(0}*V#<b?Q&<P_Ll6Ja;JO*9F76Tk7% zVAhP{p9fCYeZft9Kb8hGJr{QuNrcv|54{4L3KkiK{)2VJMgqHYDEf@+Pe+k8fe%v% zXOL)r=irUdtzb(?B!kz1*$utctJp988-5<7z_&p+>josS)(G2*_6l9X;m~c&mTgwf z*3XVqMbC|ijsKM-Pa%`jQf5`JUHxV9uOu>QQqsJH#_^-#lj3D@e`1@)2&0aeTA8Xv zEYdg8-qOTrqE&naPtKG56ekHE^EdMM<M*-uV3z$6n~O<+U^Nywht%Xc0kh)_^@SW3 z(gt4y?V+`V1UlL$!~Me3$(dy9@O{z}Y8rY1Up{}Ox3=%4e^Fp?@G21pT`fttoVp97 zwmQHwzlW4yqwx9sZ-Q;2Xt7qr7u^#dfSIpbnlC@DK$JmcC)Fb$aIKZ6E9T4hODw?Z zIxfB-d?@@a{tuE@>57Z0BkDWqBGqW+B*j;Gb=fZPAz#Pr>|A<S_)y617yH(F+^(U{ zJNBtncH1G_1nU9F740l*S~9sPr{JIbTKNTeZ*yX@`Pt=vYUjlKd7PsvoLPLo=wNZU zyeDLkYE&+>J#`LuuX8&*+5U0Bf!_qlI(v8s)q|OeE(Dv%Yu*BU8r}-6$Bd%(gl7}` z0+D{PKf+h;o(XoBwZ7}V=YA%zJ-8<Hhp>S6HiO>IL@_zEhiT7^<Cb%GkbG1IH0hV< zBP_^^1GlXjEONW0b7XmtTYL_t&ma5<>?n7DEnvXG1zdpM^gzh@ouN)MB)1tUM|a@$ z_%QS0{lK^4@39%s-nj=fr%L2sczw0Qr{L!V8pt)x0WM*E)pS(@NN_!p3BXg{P&7p7 z5mvxd?K^m1f8g<8Uv&s3h;f*IZxVNvA@TvhN`0-Qls@@G*%{djX@AKmNi&&AabB@r z@j=l-IZ-)Txg53#%T$P}u40j_w{(hlx{wymfm`Ge@jd7wdZbxmi*SVKIS?$?f&HmH z><%jhtASSA7|-WvpjS8vHDTG<M$CvkK_>!3?H;?7i$FGTErFiDjSDk7{^x}uXOJTa z9eFT(jl2|65jdF`S`7@6m;UyFc7af!7SR))0gFO8WEAy)96<h}glrOXit<7B-A+`5 z7LuF7wc!5Hn_A60WGS{g(i$7hn}7=ipM*m3aIkdb$^KO~QN;jp=$cM$oNHVObe-g= z2a)SdH%$j351VZIr<(QZL`6p-17y<~%(2i7?``*d$Fz!X#gWD0qMEtOemBo{W^c)i zPrv(P;?K`NCVusQ?U#N&J^y>u&z9LQbIWqe3bvO&vUIU_tD5XS9^jE;>JubHm!l)G z3y}4l%-h88E$A*-Er3iFI86S>EMS4wGzQBBwjRO^1mi+_xI9=3`2Cotz;V_gb0eN~ zplId$+JI|#V<08eimXk2r(1%*YXpM=3AR190C^0CkJZ3qor;!VP2hGKhi}6_@p51a z{TNe&XSO{)1h~QbIUG9q0bp+Trk_D7>LuNit&ix@e3XYTgzREZew1Jr_|s~^?PRxt zulieImhXb8f?eHDvrs!xdmQ@ck(wcz8JcIB{Xm%*qi(E7l<A=x)=i2^b^(tK80#=4 z87k^3sUztOT#l)bgc^<9ff==uTg#+@vm_Fx;39SiVnJ(St$F4A9M}ym!c&Ef!Mx`X z{eo-*UnZ1N;OyJ2NKmv<j#C>nebh3w3%X`QHT%^yAn%#0Y$NXqX(^{<iD<Q;h428J z&JzVReiLkMJF#eFEfCg~aI@GD`r!ZSy##!wp!0A0M0-z19mfyIFkmho(0uy4)Na<b z$Xx_9t5k0}5JD$;7P|c~mzy2j6O1P=hR4!B=zVl5^NHQV9pY9a-OyjiP_zU7LNEpB zL5)QS&}A~<Gk2~~FWe8FUIl*=FhzEtuuVssAgj0u+*EK%m(qWL$={w1hr5Gkvkv4^ z`UU&=V|=^dWHrjZ%=)>qW5viaPjP(773hVF%l?#ZEmu{VD;HNLSn{o(ZNjQ?&=XH` z?s0T>jrY{@Y<AD~Ebx|i^L^t26M=L8geVW!hx?a{>%;5GpC}NC7K>HlDZ*#)=UORT z3oU;g^tyJ7HbHCYt*`-DVh)K0!BdzK?h@7!EQOr?1Z+E+1HL#G*?@M!cJU_hTL|9) zg=W5Nll-UrjN+4Wtg;c9qN-#!<RxH1As{n44DL=Guol1KL*dgyij*)-nE}vb8y!jj zgD)GPyolT5VC~Bt5w2~(mFnYf1r)sZ#7(f~)ugK!64}iA!rRAN%*RD8QK1-@KT+-1 z9MSsp<06_y=#5<>Vj~-yN(}=H`G#lu2bztlajG<BzI3MW7haq91qrfOxXVEP?|{j9 z|G`WpA34cA=l%mzU@Kl%zCtJ#RTs~bR7p(II<il4nX-#2U7ev>uc@m(piEahS5{NU zsa>i~KnrT1^(t%2KTGdO8jBU8RnT~9%HIfVr8?+;>}mED%K=lhC@6&vMFF%(3O(IC z>s*ZEqGOZ84Bb0{E5pt6{O4}!xd*mjtuHkY0ne_DL|3v_IE##hCgValbG3r?>(%gb zI)a(aTxILQ+-My)nT=y5>^LyGuAuO63*uO?(Er8jb@z2?935;Kl?{N0F{5l}X@jy` z<-N>G^CNSY%C43)>v#K7$hqZv_`XE&O^+p#!uw!Xl+Vru4)z{wBwjA+2|koP8dCqn zc-wd)qHCnZG&bT$#8}gFqf%d?J)-%eI3?*Nsw+4JX7p$-9jLz#hy>CN?f=Ez>pqjO zyL*VcwXchBf_tkw7Lt^UfTX4&D}gon4}$UsL7VFdza6AJS+E2wmTZMIaSz!X*(&H+ z)Q~D=BV{vX|3U99ENdr!EWa$TCFjdO!i~A1I74WM6zW#qdLVfwaOuF*4^VHzb;$$J z36?Tb!D9Y{`NK{J^6PqJ8QLA0&TU1Sqj6j(dL_`s?~sFoB|g1Z<?2=S&@!horebjU zqf&Q?0%q-Ksj&2Y+1`rb7Lj$E&0;Te40nujYP@R#&R_{~mTm|=sSE6FL=Jo1zJd}- zl&VOZX;>85Joeu>e!{}U_etKQ;Ys6@<|RK$8C|`7bxrk2)fZQ9ozf-gTf&8SPqlk7 zZKL)@G%<+vZS*?B14E&~Z;%=X7&hwiH8PD;^;EH6wq05-`CGgQEC_wTz$(N}vuSh` zc!0`@5;$R>gHJXgsUSXtD&h5Tf~W@mmX<**aL~8R*WBL;nrUkAny&N3_-Nlif4pzF zSL8eFYv()f`xa0Ub%+tcbboXI1@AIfZAWj1$hpmN%6`?pz+r_Z&pStb=TAo_?DTq6 z=9Y&`S{A=4G87FjG!(^@JSjb2mSVmP+}BL&H0uOgwEegJB)DEIzM_B!nDH0M3*<4f zNjNP$3Z}|9(BX$Mch~~-A6&%0%^wI)^0nd@qV|%X($msOz{_1LKdktw66nH)@g{fF zl-Lc`(yD!rtDZEay1z#2TAfoD*V&NTsMg-<-lQQ3ovL+>dSVEvb7dZ(6u*eXGNSPA zkPBXAlzWD&m;I6DK}D{4a(P;5x6-KcE)_Q``&lPcEwW#>I~`-(OS~EW*94zw3yk_b zqJZqMa+12gwzhtQfihe$EH)$?zZmNnAL!3R<F;Jol*NIA!X(H;A476WPx^f~-F9bb z)h~<J;sU!ZVk4{>ww1Q2*3Z`6K=khH7~*>36$HLR&u<7(lWa%EkQa#dL^@FcbLD7A zGTb4ihw=hHeG5GAT|=Q?+uwQEJ`qSI=WTAwrAnnG!y>SDw{>v@;Hliz_agWOFgr8w znbK^H&(uHuc8wZ!lN<ONiJRlC<Jz6=IHl{S?&EtN>RsMvUhjmSb$dj0*L9iMVRKue z<-H~s>o=)0xMtJDH_<u9qndHj7WiAXK6$|_ajdp@OVjiJ`m-eKK*o~v>FKk6+JAa} z3Njo&pZ?sE@gZ|+_KzHK!I%=6xpien>$$2ij<?Rno+kcNuqEgNTYiG8hIBy;NIb_e z2)mH`fjmR>2m@Z)4A>a2U`yC}>=*F8uAnPPA9Sj(0;m55y!$7(4>>Q|6CHb<3!S$e zrH(k~CWqY7!?Db9+;QJ|*!>lrbyJ`-^x5~=chBE9cs;lw=nb_18gvG=n|aT*LvLX> z;N%sAO>3oKh$vgQlRp!`2@~|;{KmW~SOZLluH~+=^H~Ct6|-0#G6hNF(m4}Wh>sR_ zmJF01Q1(#|(tgv=j(8K99<7fXmu#!~u-5OI6KgN4Yp(k=wV?Le)H}80DWwUjgof2t znVkC5`j%RiJVw-95YL+nxz6|y;@{z%Ya44-T56ToE526vu;4=Ojo-U6H)ht(dX?4c zciZfXIo|vyMZHRERQPPU&byu`eov@pxGlYdBX~SvH_;%;KDk&qNa0hgQ4i7_QSDXA zRYR0Hvewc)Qd-&;Qkr&grf7%YZ`_QzzzgbOR)K+6LFuW5;dEjvaSjOam7#mkX>JDu z)nOrqI0oM1$K)DHPUXN<+7@UYIO(n7+2a}SY3RNPeuOK|myT0lweIg+08QsOR|8<? zO!ZQ}+CdyzW|4>yZzwKP6lixw2x3npPOXuf+PlH(CMR2LXfwV2?T)4{_q*Qh+Nx`1 zmt~#zc39c=e5=;YqZ`ZW*G`>MJvM%8<U`#^#R$O!_H(F<r@w7fc}h`@oSwhB{Yd#b z=Hr>S@;3`!t$*3%W!skxUz%Pnf0_F#=S}9@RUdwRG5j?A*5tJ*HkZd+A39cgV?r#Y zKtJ+ZNt!BfwL^1L_e8%`@6?5LEHvMzXh&;=>PYxLA<`w{8p3Y)G&q~C=PK!T;JD8u z%AtL$2pslz_h0hgfHO>IXlwF-6Fkk|E-(SQ$-3|zx*vCvJIo$sM{)x0E3=Qe#ts6j z;W%y!G8W-+-MHcCaO@TI3zfX*U{;xn@vt@MPIzTMK;EDW(J9CRqy?Ib^yH%1DyE3} z3+xE(*~OfcdkU{N8CYic%tCe=(h}W@Nd=s^wJbs*)KoWaiBv{6k2S@&Pq-JaNLZ10 zCvjfF#du$QYQp6BFVzgOOQSnS4lrKOJ<vP^y4rc!X9+7@iASSmW?8r*c*vLIp6&b( zy7_y}j?zGJ>motH_uQPE4LNat{`@Y_z6vwQ<vFACLq#)7I+Sg(SeyfVw?c>52Yi>9 zCy&$6#=B8BVs9qis*zmlOU<3N$JAX{cU$V~+O<;K*4|cQWAciGi?O{Uj~Om%IVCM& z__MHg+&6j*IK-}bR|9z?)&AJhr!v-}u-vKORaz}N>#@ocmCr2#OFf`bt+jBLnwE*y za=X!Ga^db}-ci0Tke1K#CHvR-YWdUQv(g^w31+!C+RENXdjU~0ENCM>A+buEE1IZt zwXF<|O!cEPVkFhx#otQOB}XM?BrQp)nKClzTjJ*=RdPn+)r4jVOX9{wkBCS%^wcht ze-c!n!x?w*mrG)cG|wukpY!Zj;~$$pzj`<P&Bs^fm%^7NFJ!O!yz#%C^`Xw^N#7s- zs{Ln9-t3}`a+z(o^NIIIsFXf{-W4pArK!j2mznm)j!YPyn3Z@tIko!rl$*)NlFuZU zC2dSR6F;k3_n5-Sr^a!*f$Cw3ZqkXO?feB;6OK<;5v74o-h5Y~<192?pICd_Y*jPt zo9+D|xe(<QftT_w<f5X2n}Kl|PmCbWhsudJ)M92P>qiXuPW~9d0?`x6cyPqembRDu zBSU1T;Y@i8{#h(ZmT;mJ;X3d-ZvwYZ5AfAbV-gt|cmc;#x2OkHYpN#IgpyGcr~&jC z@MHesRH%U$E!Zh~CXSRgm48vJSB8|4s=BHw)d%RYwbzW({?yep>^HuT7-`BiU5~_~ zMn^t2DI?!R&Wv<Ld^UD8{-r;z)+$a*4~gpIcR4%NfYAB*?)LWAme1xTu;JGg4=>tW z)U$X`$>*}fiq4g-Ek|rt`*%kJS2xIMcmqvCnPe(VxK6TL(6#(XailCuIbY{7zBRp% zniktLu3!A6gw088@|u+HDZ`S9gg3GKO>W&2)fj0@{!U~7vzUDApXWYc-*1^wzOGnX zpvxVQotHV{S5Zduj0r!RW$e!MWX1d*nT_X$^5*C7EjV0!uq?{_zQS!C>G<rb0sOXC z#EY<s9>zRl1~WE>;P#`r=wa+BzFv?hd?)-z^i$*)y%KE~X7P999^QN23*Kj5M?8QN zcpBb-e+D>)h-jmvkGujpDH&S1VYqQmL=)4Vh<3&tJ*N9x-B7Vt(ndH3uR`Y2PU3fP zt$(p+nsZB)!!osEY}xE$T~SI=-J;P&L~&YK$h;4zOF`#Q?}5O2;vzMHeav-4XX7h{ z!^M7SqDrAt8V^LCi+vyONyJmk)tMTRHLGgqVM^;tiAipqxTRXR$kF<rs@>8o{&&Po z|3#jHj_@&8C+9KyO4|)EW%jkDTNSp`wv)CEwiZCL!=24si#(tG)1aAPBUXaDSW1O~ zLwz3R{->Bq*2yMvdytQ)7wv`}<{>bXUIp{NPC|hQtUH1a@K3+M$xr0h0>jf^Fj-s< z+uu!e14<CSLW~aSLQf%)7*E_M?vN|PDO3XefjP!yA_4R_FBXh2^?>)|la(oQRh)W( zhSNOOrszKCVhw|gBO~TTHi+@X-mP{lE-QXvLZ^go2^OGY@e<0aSz~-ryCeGPx~ZQi z7E4IHf@@BZ0gc;YJ6qY#yuEa6@$I6XML!CT=5H++RU{~$RXnbAy7^q?ZOcvDMrW1B z?>igh$S}pyO}U|PM>)*zDXJmM1N!qGb&3|#m1rkv&uKQnj+B$skgO2Z<@W*KpozUk z<^?+VN?rBr`PS0PH|1!_;Q}NtC1*o+)bE2?uB;Bfr~Gc6{o+qb?tgjT3pN+Um((k( zZBD7owyv<>aHKg#Id(cGIs^`<qqcjBSMOgH_#JeG_7PV|mf8s3_PywC-Wl-0t`eP> z=;T7>zp5n7aM<`>)?>z%5j{-fOj}G3OtQ!tQB9*)N7s+J6+5BYp4fdclVeWCgkqM) z{vCTR#u{BWS{=2|RMSXko2VBkMoCWb-=J^VDrz2S5B(dI1!VsBzE@tcC)<SsHSeuG zAGYQH+Md})RH61vdxG=5E8g2U;13N6n;1X07|X(YfFt#_?4q(%^GBa;TwubZildxS zZ=-HT&5C*(85g<5)IZ|1fz{R0`c*>|TIm$wd0quqoA!sA`!Lt?DqrQ(@_MC2Q7zbi z5&2j1pXI&IP0!8BE6aBj{3tq9y3D-IGQi%#o$Y%cGSQn66Tgf2l#Ec`(OL{$OcSDN z#ng{2jU5I%hh{*K%Qa}VJ%A}$1x?~}{1m(=)*AT)y~WGW0KG|-0C8w5JrRsnCiW=T z9TCAjG!kcVioZwLUwlS#R_c@uQq)k|l?m!NO^HUWtEO+Ex4}l#u5;)*=`;1s4DStl zj1S@2_R(-$KScW(=8TkNGWf>-MOk(~l|*z84E7c|FIR1_wzXI)#+fga`^syXKa_tc zH=Bo7>MYGHBP{(aYbyIzn9VgRSo0q96Z5o+iIo#9H!PPe1=e=<LPrmn_$>0Y1=gOJ z@Kb6qasJ@*B%fsoiq*>Ns#U6O%6CAO{w7sPav%@CLSVu>qh(+_%Oy_-H~1~y;qD!d zL(ps1TP{PBd93+Z*~*f?ia!>~i~bbeELvK!9r^|zD=*syI>Ii}+YHhSOJM$6hx?2i z!rnl4wx#&Ew1FZY@=R$u#1J-iG<`6&jvOAD5}9u5Xi714HLZx4XFP3e8PUhM0@$}L z4WslswEw{G{zvzpwpcq$XV6Z7(`OIm72x1DhFR|}NiA`A(Ivrio(Ky=KikOlh4b_} zS`zL6?palEJouF-d1rb$x;{Jdp<z4J@zkE?xZ|vJWqTU?uLf&F@&tw4ZFRiA;DM;2 z^sBsqYO&^uZaB~|515`rj*RLaH5Qm8i%jhz1cou%B=t(=IN5w*Jnsp2gt`%&;$7nE zXK!ICg4slA`4V7X{w`k&JGqyY->f6-|2WE>X`bHx)xm{?k=n-|fGk6_kQDck4S-GZ z0(Ea~p)S$z#&8;L(}|FC`vrf?W*Wb8pM0uRE1o4-gD-*!=0Wa1W-R?YyoKlxeC==Q z+u`o*6gYP|+d4}eGvIx*!pHf(2kfC^L=F)NTZaI>jv?4YbQ)Hd_a5IX*dlZa+lVfM zWnzhVfH+ayO}tJVC2k|CCHf}12QGzD;VWT=Ad%mO_XB-{T!wkb8m=v(K#!p3(Yxp& zXse#&nzL(YHFbu(8e#$#{|(>&>~!~>=YW8?(bmu=u@ROlmEnp{731KQmtJw)vI+Wh zS6rAk=pzHgp{ArBp79(r8tDoI`qOZ`IU=1VdkLwC6rhW)fTmv`S-SKlScM*e<M^30 zMS4;)TQWebfu!Sn4C0|w6j2(y5=irH_YUyQ_vLxoL%V6P>w}}3y@x%+aogG0wcT?z z(2>OH!CW-&2Y-OjBAN;QyAVw0GsUQ+i)5IjHn1|X#Ph@*L^1HnUXGmt@9$sWaJ>V4 zrw`~RUQ5^^bb_<aJJ@$06+9O-5@rD{_=<SF#3wD2Bg#`sfqJ5*ujZ|K8xSb(Yd2|4 z`dFhd;z2~f^eOVIX@pU(->SK+$OYEMNq#w6!L$ue4_@*J9l2I*WoB7%@sz?&`Rj8# z=A6n|k{8bZS-8A(W5q=4_p0yCk=~PmOGInh!ZqcU2q=kOY0yqL+>V$UX^O6hA!Col z{)yQZ^DH_$@>@h-W18NrNmCtDJdl1Bs`2OGL)Md#kRf^Knq?1JODtbto*HFVna7*+ zfysQ`+^SM;eE}V$t={Qipl`tpMm}Jz`KN>tpceQofenfDgk&Fh!=uC(MHILf*TV$+ zIe#tQ4*YO+c;B!d*mdw|`~WA!P)5Uipf6B$z*$KVH0&aZLS+OF_Q*VH1Q72(GBw$2 ztc<(JO#^32SKfGh41c<ySRfY~h1r7h0vU9OrsFQ4Bk#u2fu+|4J%^^Ew~@t2cO(wE z3AdVfj?c~IB*+_X5Vs1p|BcwskOF@lo<jByU4(AkL+>m1TbISv!CljBbDeX2aPEhk z=K}kmDz*Ka<Fc!V`=NWcH#u-EcsTTgJVG~PpRous4BLbE60{esmc+^4!^UTVJWpOI zpD7<9e<YtPZv?m5W<UbW6<+~AYG3%f|Kat;yvQ&1Gi3v=x8INYhIux^hF|Oc>bm2~ zcXf3?akuph_V)23p<iTux)+;<yu;4oa=}=kO*Bj5klvA}C|$}uz+=x<d6h>MH|6m# zKOQUT3D2uaK@I+JUOqY$xzD~}8ZkQ{X)%*-N>_rnZ6JLJa$jHBEOZZWU^vlj>39X9 zs;9N+P8kkHOpkmYl^6XdW<%_V*nTm=sOgc_Ba-#!)t}_|#54GObRE4aRL`q%lvU=I zUMiI5Wn@>&x}WhQ{nwA=A4|XQ`>seop0Oh9<e#_sB_(Yu_u8{OtwTY25w=+PLUv#C zGh$wBN}@HTPOYre_H~1Gwe^t(o9Z{NSHJGN)O|IFCYQ!Ph1*vH{Ye!oohMj`^rD=> zTu)EC+LBqWD5+m?BKL95{G6SCPGld<ZuX}`&b8dV`NxXpmL*h1Rh@EizS_hvdJp2p z^F^fey<&p;j`oQ@+1N88!(@nR8?`#JlSvvu8+Pe`0|C0B>a4tt^tb3azY~zPUNSD~ zK9L-_<Nf8%fGy`W+gfP49Ii~RC^E09XkF>5tYht6B?O0aXL#y-_Y=V~VjcB|-Hp!Y zwSm3sRMEeZa@j=1F{NC62u^&Hbyl58pQWp-d#bsj;wvlU&19$Ho<5P^iPsca!jw>p zpq)iRYbMga!eev73B}RfzQv}t^|GC@7F+(cnyRi><yTeMrLJ=KVb2S1jlf?ak_dz^ zGE0y**b6*a_)zSVX2=ti^;O5zWty4V%W%pYtNUBW)1_$z+V{Yj%uwD|&Qm;*8Dy`d z7I8B$M?3ld;n`R}EDhU$?&GGj9OI(vP#eLyd51bo&7oJYSCC%V30@}tn*UiaP;^!N zS`sZQg#FVp=^M!sah&i0-k0|qeZ<n?dBl<6C!foeX|Gu|(~4F$Fpn=kS9ZQMw`564 z%aT4NZA!gm0dpryYE`=Pi}y*;5nj*n@zJ8kGMT!LKE>2Hh8O=|VtTT-`th2ZYpt%` zDK)S5=vupKSW=3T_Qjuz857yvSX~>TaEVAB%l;-a{R(&2s?v(4Ww}Lxd`s@Eoc(_W z{Neqn`R7E=ue{cUu_eXj2d$%>%e+5=A*vZ#O;99xpq!=a8Zk5KcI?6UL5YKsnkIXb z(UiK$T;k#cEUqFt%amgnq2&~hB+G?+@EG(qBcx6fYXW8u;Y_oywtCD-Wk*X^!hI&S zaChO!qO{_*C4thn<zp(MEC+4lfa4$ID+r_!Q>Yp&2I=jQ!uygba+A`ms?yBSjnkjh z-`00DOf_WaJLqfamTCejhvKd@N0`HFfc&IulCoe;{|s*z_f%&`$7TD&s*bip);#My zYiH{MD`WlF_Oc3bv~aF;={#Ts3>1dyh1W1w5e2UU|C?~D<bX`2=&s7rbkQZ~*BB~{ zqa)nLY~z-QKM{>178!-cv4(HDTN<;fKv62CpyfFYzmFEPf6>|DUqBao9$XNp9_R$m zyn4XzGJBVJ3q8v{sh%6|Xduu2a=&o@aBued{Evd;iRa-1i~_;2zj3MXuxPJ1ED1}E zvU;+&vU73@$Ss@Y9Td1C8+H_#vY)bnGNa5X%>e>(B6xHK!byNZtHMsBbr2zE1~V`L zlW<Wu4;VixFrA3NsFoiX7%1_P-UhzOzMb&rNCWHr-@X;T?S4t{O;8vbPb>^yhOJhR zj%6ExA6$c!f%lH){)GuA4)fJ5Oi!kYeoC|Ol|YZCGr(S}V7GEkBo({F%i+6(QPAve zBac>{)BJ*r*(OuFsKjVx%)OYiF{@(s#*B#>AN?(|k!hB(zP><nM>R?DAJ{orL0!BW z(u(d(b`SczhoBiU&9>6=qT;8yz4>9e&@8J^Rd%;zSx;7#IBvLK`7Q>Vf(z#hn}p_L zb8rV=0FAen(5+bk{+M0RZKwz5h1Jk9SBYK<G<-47fcn`axX;Q%xBR=jpWGg23&*>v z*|q`JdKPPitYVwFmbr`hU$d~{c}0XpXlrk;<4kw`@ud0Bh0ccO!Yg4bK2G#p`dBem zeN@|B-_tPPuvgzpH$mH9Ge)ITw3fYq>4{U&oF4!qFM;A{W3Cx<n;H?G0KC@|#B(6b zZ6_asb0nVrP7h^oajg*^@{ChKXKWer04CW7khfq&JC2NkUro^;!0;^R9mVSjvW2b1 z7bQJp`EpEoL3tSrZ-?Z&W#6SoB)>%+gsB1%c){|}cgQ)gU{%6T<Os}ZeuW3Y%jPZF z4d%1sflxIp{J$i35@ij)C;JhTLQHUfa0(CskA&2~#=8)n2l<RLW+Ln$H}Q_)kNBH~ zGsUODOuAI&k(EJ4)CK(gIx-+RfKz}K{Svwb$>8t(fUn~p2R=|!;UeL4IB6UbeB$rp z@8mz^^8{x84E{I#3$Gbwgqv>`-GcfJoq;pKu0c=Wae(-LTIIaZV6ZQ?g4|{*a3r?S z1+<o_%XDXc0WVAiM&o<1#odM|k;cFsdj*>u0V8B?G1>6Fd&2GDvN#>`l-tC0g475H zceL~Te}!*E$3y{e5WJUcl1z}amy8j=5snmG;TPj8VNbUR8-blcj{~RF%Jin=!y`in zfEA{78=S-JX4^F|gd&yyn%|apDz9CBzx=bgdgXh|BU>GZz<t+SFW?N_2nXnI>;Pmu z>Odc2z3~xzHNPGZnQ{cP1RwdM`OW#OaVI1rjv-6ACXjcm<fb62VX}J+Hkrq;`&eIW z61oL817a3<AV9ZqgvW;`hV#QwR6H13D!|%#iJr|41(S9RCcp~?O0fd0tK;R#N>Vvi zm9841UJI7L5$e<GHR_;hyy}tinj%i#McNTEfggc`(~nmRTZj%qTceqX8+nCx#twm7 zXBkh=y99rND_DPQJ=zqVhE_+@z-68Wl*3fEf;r5nnAfy|c>*)S1Wt;0fu>sqjNKUU z@wA0sJl=emNlSSc&xu)qu-XC3g)FxMT?3Ax8tf`&JzWq!O7<ehkqybO#4#d`5W;p~ zHoU%S2S0<qF*5W%gb|&H4@3j_Jv400i>POG2R0h{4Qb{kV1r&PGC&S2MKM9S9<ot- z&22TOI->fhtdxhPHc1Of2$+b2`AU2MHW3`}I<_ry7tGML>06W~{5DL5cZL11b*)S0 z5xa?IL@i<@^u#U`abzCk0H;wKX&a-4#_l`h2lyJ3Ae(~VE$~8KUAzf2Upn%0@#*|! z{2o9TlJeT|-h%1lB%~-eBU&z#F)${emn|gQl0k5JK>GtYtf@fsITI`mo(ygez5?nd z9h?+$!Bg`9kpZMdKG^_VqQ_tZ85@2=P9!%I;!s&&S7243e;_vC_J0BQRF%IJOhrHZ zE`RO7!@#-V^-y=>8_^@21n<J<ERHtkh4Gt$bE4&ve$tE52eS9THA_}ZQ%q4P75(HZ zWj1MTX$Q%9ab59QQ6nH@wS@#kC6FmJ!XE;KpauUv9*cK|Q*Sl27?^ag;HOJalfm4W z7Jf=Dg=A7G`GWM2kHZYrm`P$|xdzBY^cU6$UeEJ^Cf#40BXLTv$r9v)<O|@_W;HlP zFUfea1nCKJZBcdbmUZL3M0cXQ(QU|lFhn;3&iYUEBe*qxfYGTNZz@j=cFSjIcXR+E z;Y{oZW&}L|&OHTW5<GjjP;=rg5Vb_XMerT$6|5di4_*v?4`~Q5u>z>5)u=YiGHwLg zkoTUyN>l?954C0W<dfyQWV59gB;UmUh$7)kKN7cLn}Gom!DTRA;4^kX_-A-?cm*jU zUy|#>y~4R<i*QA_HFb`f0;aAn%wKG0c-|(U%dmy`Q$a{nB$+5%C@+??@>cL&U8*>x zC{iRUU5b{#Z(So_F7rV8y^+v|pT+tiADP1NK;ml9=3nWp=iUsb2eqA7HP<!|2*$Un za_tR)ym{O6#5XsP8rnj}&^mSo7e*QZsj7vbqp$?pOlPD^<!_W}>JFOS8j<#g=9Sv0 zPFIOl0Yx3fDtWBzt+>5V!~co(N3JtCwTw6%5P5gO=0#@xZQfd%UbMYnOx~lM(4RAZ zmj8MEXMN7b+<kc^`SwC{$sDuDddfb^{ROhhBB0vrX0s3%7713?uh0<q0{qPq*<hf^ zJyTv&8Pv~!J3183t_!v0kb2T<%G6ovOX>mYTdJi%UD+X%N;imOM85?`pvm3?cA8_5 z!yL_)vL9Fz+mA_xr*Ad78+DW#3iq39)F-MvJ%V0I*I{sW2P@*rxk6+e+7{cv^TXW< z6MBUoL<!(G`VJg{PogEFdhkkBg43)VX5w9e<98KIJ_L{rAB()g<-)h{e_e(9VE>f> z^q&JjD?SE(`CKjm(#%f84&*)*TuY4vm4d^<G|>$4A911hintT}+YaFYffm?at9cu- ze^3<N14M%%>{RABJsVm~?SVMhB=itSJUrhMPjh#b(+qb^f7Q~e*Hz=~C+&qWOY00b zO^=&`pW*btvf#1M7&4XG0>;{_+!eF|Zy@-1?h9wbXK=1GLVg{LRfFVhfLroIQbXKF zbVN8#fbgq$3SK=d0j-Dp$K8cp-)8PA(DLJubnYe)?Y?p*t|xmA?%UVtqx62d8?B^k z&=?piyHWe$`}mr&PzL%gMTF-<mRUzGAgY6dlmQY!PogW)5L)@ppeA@AV1vnPrgwq2 zj`yqQxaWlDsOOERvo`?d@8rPi;BA5rS;2CyKGp)7`dfu<#aAWsrFxl4{zSeG+<X%G zH(=oJm(G;7lpd746`RCeMLz`v(ES>U=5m8s3;ax5h7*Y!ffc^Jo&_$21FO1geFEgV zmlfSA6cu6f@QPND+390FVVh^)>-_HS=F<duq={a|VZ0uK_F}$lg<`jAy2h=o(Cvd{ z!%^d?2pf=qM@Np2EHzCvA*PiPRmPph1;BpYW4Nq$>*93pG@aEcDv5Hr{FiiqWRl3i zzsP$5#-jPmeX0q#STh3ed=cJ6_kWJJRnKg7Z5yoZtbAMds-8eY&j8}>6F(KaNR9v+ zeq(e$Zxy7|OQ75GOngDo7I;kr7$`lmROka#C|)basZ!Mf%{0v%%|(q%b5wHzj1ogs zFO(Y;UFBD039^9XinzA8rudBLn9vLzthxMrULWi+a*!o~?$jfs34HcGcGq-8Ia@h~ z+q0?^_B8u-`xAQ`M<qCj`+*~LKP0e6yB+Qd&jT;(o$7n&9}bRbb7&)ZlcMNFOhfRq zHsWrw{aG92Y3Ea?fjMa*wd6(UGWUdMGe=g1H&ZXDR&){liI&k<DHqj|{)@gs4+VRz z7X0J6Fwc93)IztQL$N!M4SOmm7yb)8yV2qq;$C9CI9oJR^i1dgv&JZXADjb{Z%gD~ z_7gDl|0ddkEk4Wh#uefGZqKM%T!q-hj<6%o>2^hUs(T0ep8D$t?}iqT?Wt?@W9A1d zLmHt;SR}7AJ{J6bmju6op}$s|DvwsS2QyuauAhFJp{6kfX!28xvBtiJbbYD*rv9rg z9a=%()cL?fdMbS?ek$Z3ffmDijsA^r>_3c{o*T{}hKDSHfiMAT;<*P|=V9RBYF(v= zJWHX4XF)5IDu$Vll(#EiUf$k(tHN)|tzw)_yr%-~$Sm4`n0WOCQ^fOSU6r*pDSC%- z6Kr}ORGS;$H=!V*M`HEFsR_&C*TuE3b~fgD)M}H<FkJUt9jhEG`zWp_oQ9iGJ#vQ~ z!X(p+!SC0F8c$878dJ~1#_$kwI??KXeyl)Zpi$tjKuKUGbjCM;F?9rR+N#0nA_JJ~ zGsv#t7O(+*&2)xDS26k@FH$f8l11gxZ9tiv4(5`tkj*=!-2fc1zcsJb3so-_edIl4 z3#9kK)tMuHCC(Gm|6?MH&7vydEx{1}8{T_pdv<2>!bIqSe~0I>v%3A4^;>0@d2N{) zk{;E;%5^aJ8q6B&<oa@>@`DAFizCal72B+99J4*&{69ib)Ft*IngWE>1EOot?cO8) zOMG0^5_XPhU`-UFEx<RPLaz_Y$-K}$*x{V<9q``pJaSinS>l8<<j8X@a83f^T)?x@ zX9fe7EA)U=Qvcg(nxLVx1?z}+6Vw%*6SI<|GKu1sVxjW2>aeDcZjAnb;jyt}M5Blb zV+W($a8Rex^3}--S|S(K1733ka*kcb45GJCNz|n<MV=#HlO=El+#X&_^@Q2ja3I3- z&@XV}VQ^fqS#Va^P+T3Xam}SJsZV-dngdz92GEQg2^8%?k{9sA&lQU$D<sRoWnM0S zrdXqFt9qxh!q+ZUUzHX7;~5H{e7o$a#3Pz16bcr?C-?{8p3G-1Q@_a;#M$6e{|j$l z&vv&ROg>MX@0|iyXK;r;hfHU-x0*i#Sm@u0Jn}cN(Yw;6^i1Gn&jBjwCS)7X5v$>C z_!2=t5Do9QfY>a#EZr&HA(<yWA{qtf)1JHnI1y#CgPC3QJ8D2!Kt3g&LPzC7C=j{> zOql|*GW>#SK>wmYGUwTu+*D)`Y6FKxCa(zZ!C%8?_?HBYh5ta>{0)5dgyiNea9<9^ zGkG_74&Gn*Bm69Ii<-cfh3CQ4*euANi(rl`W9Kom!FSb_8VM=kVZ<*W6Wid9pYJd7 zE$~k8s6DxEl{?O5b9Q%ia(!`rasK7{?2@}5yKj27dx!cO_;msBe}#-hAoMxJgMU9J zgoZu=`F9QR0$A~7<Pb=qPowo<sJX#19EWT~Eod*GYi2?=_z2P$$hNP!4EUr|z=XFU z^OdR&uI#qNj8Mzqpul<mVxQVO+jALQSrfc+AL}Fh5y9ypD{()(i|zzu?aA17e2Bmz zoF&eZ2;ru=R9+_ErWmShrJARHta++^q0_=Xx5StW9p;4*^CHe04;pgxqk(9!S$kho zS2JDROVwMsQPE!BQ<^58EQ%7Ygl<6@&{JL^C&1tK4(4uPyQP{@CMtrOONFRG^by($ zt+WSVY7w$+*fFe?iC{L-gXxx#+Wbs!W(KoExWADJXdCEg|Ky4JeFVdW!$gx{fACW} z88TFTRPEG*HT$$TbaVAtdZVGIp|gS0|E*u78>F?V6)LTQk#-St{0yv&dj%ACaWKNS z+C9`c$-c(sw>+pkRzaIzo5z?7%J-I!FHb5@Ex%Dd)a*9jtXN#x)Y8v-+IF|<jQxY7 zjq9%ar{|kD0NlcX!JN=>vI+QqpE84h*fbbshefzv&{eoVv|qdsPRi-hUf?!4Ej36r zl2f8o;T^D*;MhiR(?4Qj>5s6;I|TQ%Y~m`kh}RP{iSuyg?nY+9Eomye*B{dz;5#yh zZN{C3ng4iB&e?$H`j!o{aa<KUlg$TTNiOV0H`0^n5OtDTN;RNnK`-?dv7D$3g@faR zwV(x;6`+B7%s~ezm*^WV1zzb6E)G7cdhn_NCFwVAg89HN{%-ycXv-Jy2J>cM55e?q zKtF*$<TX-+v_etr0QMC8nqPSH@Sk`byfYT@U*a-o0Bq%<yw+Gtuwrgt>o9MqZ{*!j z&7dey=DXp&@2T&}1OmZjcQa3c=aToS&k$H0d=}!veIS}nhuOw;1i_Z@y!bXjYf+wf zxb%<gESPyOYqE7d!~KZOk>jKH#x#yCj9ppnYPJ2<PE`B5+Pc_YF_F;^BI}v{F)r1| zYp<#libYb7Xsw_=PN3zGLhJxWr|+bM>_dzTod_-sE)4br%T%9GS1_cH3@3m!RL!W^ zm+U=mJ~|OzN3R7ZMB^k%NS?P=K364Z7DKafl>Ux>1GrayL7S<Mx=OiQ;gK;Crzjw( z!aqWfq7nC*anNn(1(3bjPyM38)N1gmH)Il+abS{+Wz*Qp;B&vm<k9OXhMYmH4%YX- z_bhkCI9A$d_zbyOwx=Yw=wjiE0zpAeev^XT1<8d&iVlOjEvoEU`Ou1j$^q6-V9M_7 zsOPK$<dub<ThJY?2z(4#NSeCKOy>Hd?RhG=8@3nnL>jSBasZ4ft)yC@KB=TMbc5xR zGT23Wh3SIl{2BNctPdK7^W-ABD4a&NB)maI@KNA?fD0Ufvyhe;OMVacg41;(+&d?O z8>tiT0uRS$;&*Tg@5}EAGnE?rgM5u(m|(Hsk6?`O6qr^0!VKX8p$r;nlOZiK5%MBU z_zn4A@kaPzFpI=uCFn`C5Rn7@CJp=*$LZ_Tx^RDT60n1k;M1<3|Ee#`tMTf+=fNEj z1qrbWz?NwUR?hz6UQ`Sn!%PNKQ#n!->@jcoF~S-^JnbO)BpE9G2EQgs&5|_|ADj#O zi3SL32@L!)UIVNnvWu;vJ>dYcIy5xc3~2Jv{>J{Z{%!#*XbILNK9L8geM~;r1^b3? z6}FJvkfke5s-{3f|EoUEI3S{<$!!`ExhnE_<hRILQQM+cMG2xtMD{jO#-oN9{UL2g z9SxIFA6O*ziFXUP^3!;G&`(@bb}{`DzN?psKVWNb7TOuA4wDWoX(8uR4dGKI6={d9 z!uJU>ME#^E<*UGe)c{Vqv$S8erC^SX(stL#)U%Y2;LbTu@?JC?&IhshVXQ5BpNn8K z=~C)`xCfa`v<Ni`HVj1jGl7^t$*pv;j;W4#=m+ez53$#<|Af0!Ox1o{SKAWXL)%qb zZ(EM_HvF0aTbvb^*_PWDJLJ}DS^HWySiRQOHc8cqs-||@u6D+_TrP)O;eF}t31kg5 zxXpGF@5!#z4tfGuwd-;S@*i+7roha~&pV4J^4s%!!@GYS{~x{sNJ>C77fc0a^K6k@ zG+Uf5X2g0)b4e#~XfG1SLT;4;`>|NipRdN(V{W8Bca<@~sdqVfpKyc<gN9%PyfY(0 zbVv(*J{2_v_&)d9Y;H6f#wOz5`J;sYi9BLlnknrf+b8=7_vS|OQu%2`L**r9Q`K|T zGgTjzNaa(eD;Ft`C`N*{I8QQ4d|CLO{|hYc6S=xfH1!3}7X|)u?`yZhRRjs+ZNT*; z?75EXFiD>8N%eXCzF-4jVRc{+B7STYzewm3pOXsYLlrlb(dws~!Mb$)Tw^$*Mr3r< z>L?<zb>w|hM#Na-4gDAG0d)gqk?g!=kjTZ~$!m;8as!wp)LF7S(K=K+I40on@AbEW z%>6Te-@sL{$3+MCg6s80D1+D=-b(Lh3z4b32tk?XhIFXns%no$pp)sX`a;7wBWE;3 zd^1KGyBS*P^R!bnpH+Xr!uL^f7I=qOa2{_jDg?X2OlCPWJKl!}!mRBzd6WDDr{DuH zb?Ho9rg-#w`Wn-LUB_;OwgU-9wVCWFb}Bm#o=q>HbMhJtYa!Sqo7qq7XLcvs;(v4; z<}sZ~%?rOE=wPM)ly`x<mh)59CTq3IGvyacN0sz19#zB@ZYpY4e4%(HFn+F;Pp%kk z8DX1Ze*u~B<32ptjc6T~)0xa*t`G7A`2@4##gGl($z=i!u9*Ho-3TuuYZES*H1!OO z^UwA@@^*(OKp4&;2fQ78TYZ0gJN%6UI|IMK=I|J33$Gy8yn~zvyN?8BE>Lwp!kMoP zR)g0GXcerW2lPCnq=RIq<fRIWGGDb#{YL#(JxD!VwNdF;q$;||=gW>upGuzoj~F3z z2^tAr19RL2O|{QpORI(HF&8SvT49Z_7%Unr%^$FSyn8$YJoml;C(OcMA{Y$D6av~# zRpN1yKavg7^D?Xaq#~#|q3owRta_nxszRzP)gsjq<zz)~`E=PP=~77}Ai1Oo#`1l< z-dGT+i!6bZu^U=Buj$?}n;AhHX#q?dZqdmMn1xvd?BeS{bN4Cl49q;63zCH?qI%-t zlJ3$p=@Ds`^s96fG=tkowuw)J<tUdQkH=xPktVE*dPibJYOsNSlJ||fqwAZah5fzl zjkUSeV2!j6u{N|#teRuL<>=!2?cU^_>z^OYBfe4h*be9g9?NeaN|s1vVfk9+JXK@$ zYqe7?)F9C7zonv-&6GnGE5N07NBUOs3%+x$gfIAuaUE|Tx)iy^onc2YZRw^|bl6K= z4NU+?dt~6de=)qy4bU*z?OW?x@0;UW?R(+#`C9s4`I`k+2GRpHf<s|S`@gC4JfLZh zC7*!xr*n8q_+j`(_)Ay_w&iUwZ{Hst8dkt7#7(S#6R#??G1wZIPSXOdpq02Q&;o9N zQv<I8^}zlyAvBPf0F<I!m?cNho9OX$GdLxN;51ni92W&ZFI?ykc|Usgxo5dfI`bWQ z_F&biste%p+fmiYz8xG^E!?;_271xWh*I)0SXGt-SFtB1gf#A1!5P?D<caekWkAau z^52RZ%I>PSs;O!%%qMDVecA`Qj`|$^HN#ZnRY+591^ek-!!5l|-$&O&+ft)dUsZ|} zon-?g%|)#QbMd3tIphc16*lZI!WCe?^^jx3x57&57}bq7!bv2GOGJ#Q7W)gl_0QlQ z^OyLR<Q<rauE}GSqg8{|D>XN?^We$A>gC3-#`Zw;y%@1CVq8R~F~{&m|3bG~Tc}Qg ztaz?0QW_&J5RAhQp*L7L{T<Roivqo&9siF@;{0LX4ep(h)^f`hOJhrWV1=Er9<sfu zN_5O|&UdYVj$$8QJAbBsQ=nTgFE|dK$vcQd;G1lOxx-v|j`ZRBLhf!Ym@TFNvnmPp z7a`1!<za`hc$o0LLh`v3?h!kZrI<U+LS_iFiOB{|I}KE(N6c`B1y|+~dJ4UV_R%uv zEuUhB0Sk9ES08x^{i}R*C#K@<<~0NEnu$M`Z-)KNRYA1yZ`fiz7K{+^1e@X3H50e; zrt=Eno%<B6M9kc8_BnHsUIxs^>Es6D5SZBt1GGQY-xqk4=RA>cpRDgrcI(^}_=Jkx zPdx9vasK^*f?y(Xij0JL=@RA?_)f}@pXfO368085hmFQ+V|?s5`VskGYi%$4oq-Ju zokn+{ThrTN-m{Co2)6JT*m|vF&N3dRKm2`FY!ML2ZZTHa@}*HfVZ-o>989huc7$F8 zCBZX+X8}PlGT1%ng8O?N=(b1FXPF*c5V?ab$9Zs1I1PE(N75Mi48;!Rd{u9CAIN9- z)l~o~u0r=(H&ORU8=>8$@u?T6`Rcz^UzD4b&6Tgf_s|3k5RvlhvIR1MtgbXhk^l_Q zzQW)9v3O5jcdRz-n)^Z5yCXY|{mym=R=`K(Ci)$#0|_iO(7?T-fs!Q1gKd`0kvCU_ z6(4}}QAhnz-4&?(X_|hT!I~wS=9=y5rz)qi048xOrSHV7u#4a>9>Lp<4n+9eXyzyt zfH^Ke&jU!{ysx_VvwM}RCzy9T+uK!5v3<9Wwo0s4i`=@?+SZn5+h4T`4DUmn$6dMZ zDo=@bCa@4@K({B!KgxgHA0Jp3I1#7{jDgwCa<D-k3_9WIe=HP7%qPwe9I+XAsMEtI z!g<jDLFg>VmjBJ{Wv(;l;3v@(Za}NxoFt-Zg}aa)h(V$6!L6_lDht#Ko(R?q5uwXO zU7&0hg*U-ZeFpF+0+1qIjvPYIV$FH;z)jd6FTtnrlVEEq5S5BPiqj-&=|brnsa<+s z>X9UX7bpYHWreUi{m5GgUZ=g>05*={(Z$dsUrlU=&F%BxlHh>gnBYn{&D0`(5)3hb z%pm8((`hN)p9z8Y?<iM*gwUtpr+>qH%*%k}Rsk;L%lO&QO>TsX;Vv}|KMskohu~hh z3!g`KV4C;{xTPBKu+T8?_TWePa@c9U2a8uz;N!c%F8W^3Uho!9=JoJ)y!zN>B$9i; z45yQ+5@@+I@EN;0FgVaPFcEgUz>0<*ZvwH0OrSQ?i`Z)DF5U+IO5t|#QRxB5(9~8* z)#ud*)XSkEFkTY@E&xouRwYr*Qod1W6;0&81DEZFe!_Ri4X&0HNbXDKOAbo*Ncu^f z;x6KsqSc}|V5Gsp)wcv6%3A;({AhFtyaJa3ZD0<w7<$=znBHtx?gZ?IV^I~BgB|15 z0)H&Zzr{ZQ?}8t~L83>ZM&b*wfmke#6wekt7ka>%(*l2t)khz2v)Rc^Dm_13Ok4^X zgG#^G6Ad0#pS?Y#WzSfqRL-iHXdY6&yzEeEWy!IU@g?2h>v74x(ye7f%a@oRR9vr2 zw{)_7teW5`1Vi0m&uwobxNl?!1;lL9A09-HWa8N8Y-6A<mvHxClieJ+EscPHmIRgq z9(3DQvHt=$=O5~8xM$c#euM4(TXHvflw3eICk^B(qCA9v^>HAPPxOJ4*oE*tilaBP z55Yj&1#OP4;@t&qR;oZM94X2a6Os?oxw6*sPKr;8(~6zod2XkORaoWMU?=cF{#|}c zo-KPV{U(_Ue$(dyDStU{ANC!s2078|NG8G{T~P&`RAju(yoqoVe+ssd9$@2XD0(4k zD_$dh40Nf>;(BoQ{wjJ0EcOhMSM*-=Sd=cx7FCF@h^mV)5edYcB0+xvP)dQ;;N;!p zm1D!;>4#zMQ7aNgqR|d$3)tHHL~bEx;0f)9-gX|c14xGDzytdaOd(<J5?7r&3FeH} z%pTfJJq3^QI(jyJ9Hx_>n3K#QM#G+DbAiGzj*Vhd*hlOpP6Ypj>8KH#gB4?&fOOlA zZwD(~8{sI?Tyb|vYw1zhH@R3*U%pV<UAz{|0{!?)f&2alkpefr9s+hd{xQK*!FQot z4DUynt@i?kmPE8$xLR<S{{@f1S+HXE;UoNL-YX;(&MEiU-Rxe5PrrkchKC$VHY1(n zAviJArLIwp;q&M!Ljrd{9rlknPzrx=y|}CFAn-uGAlnglAr0Fj5EGCED*T81v;A@Y zDZuc)<DuQpARCn8!kxHdHF)is+ViSzSE;IWwo%q^mdO^8WlLp)%JPaw740gsE9I77 zmN?tAD%|ndDT4m?T(8jIFZh$_MLl5l0TZth&BHG8w!pll7<P09EE(+x+dYJP!*=9q zAde6d-YZ`a6Ec_E&DLb*P}Rcq!*gL$7Ef1DH|frhyIhBk#cp72cnSD*{4zcjJ|k6p zOuz^liiV4IlE;$4(p!*IS|OVXo0NL8*|O`fw++gtDMrA4wNR0%7_G3$2SRcsMHVIV zN)Jmf!6(8N`AxZ6K3Y})yP8x;t|m$R;+tZ(sHUh1Od2#2ujI7UBs(H=gY9bz>}t<~ z&#ANOoNAJ)sVY?!R<2cg;p}~1Mo6|m{>d(A4qfgg{89V@d>EdHe}MUt5;pqt;qQAD zNHu0;6Y?IZjV7XYAXEvEFJKv?z){zOJ;ErN=X6)PGvy^&A_ZK&T%dNKng6=)p-%*+ z(T4C7S`zSrec1zqe=~IAQ^27&7CtW$$oO!3%1a%goy<AT5B6O#%xeGRn+54`vfB)V zx}lO1$s*}pNJ2N1oD%mD|0l9Tf;LO=TTokIg09tl%z)m7RKr4g6;QZ;lWpL3|1$J3 zm=X*G{P6!Y04-Y@^a4+3A>^|rhgK8wV2<9I91gFX5dmGG(qF@W&^N+&(VGWzFHN9M z=nyd_TphAB519$96`YO^t})UXi9xcs816d|>sQkV9S48YcEpNcQXs}Z(f8Q<9?YX@ z?g4Jx{oM7~_1m?|b;P*?TG_qr$Lt^MckJnQkt5O3%yGf--Py|B%ENl@K;v#05PeI6 z--%SJIXH4~v<&-!C&8BJm6VjtmM@mKl)Gf5GD=3ue#r*QjM7B04o>)R-@(W8lF?lD z4ZV)?g-NiL77>rgJ1~blMA@lW<`7KG(vbP69iwngAcd`yMSe_qO7&R1Kr4lb>oP-Y z;}-a(i0Enh64^R>cg#F!uiT8;7tKXBH+?pKHstGX=q73hXqKxBR0mXpAfK6}tgcur zyDqLNh~PZ|o6lVOH$}ocekbf9E-^jW$!s+^V|9VEXKS=CB-xVrcLnW$0y9Ax59#)e ziYPFN_mWHH7Fj$b2Z9Q@szTLYtyA|?O@Uj?J6R!2RA}&?tU&DG&{M&)1VKJ>EjT$a z)=!2%5{8gFpbC8Qk&w6l;FLJeI)*ux+OupMt#2%EDl;qQRE(_9ROVU?Ro5I--Os$F zUlD3Ypd=0_k?B-Bun3j2rCbi;gKSPZ+)H)5wpbffhIC{5(fh(Cpvhbh9t;%tzxhM{ zV}90G?34N>ez{-d{|I;83;vUVrr<*T5&8?}wQmR~+<PJ+D`SL2#ztZy876y#F90KG z1^tUL!!)cX+@=pBolyza8RlyQ++D%%h|$<gY&<#vo)W{^?o2IU`%HsV(A-eNP>WDX zs9tDp=)X`6;t6qqydR!V1*ipZ5+4U`nwrp8z0Dqh`#-^MWzRB`;Puxhe2EMY3yDUM z*Lg);BZd(t;p{ahd^tQLd_5dbsj0TqH;SU>!yW(sI64O~xy~+*U(d`cwylkAH?}rT zlZ~A(cGB3k(^!pdv$1VwF}(bK=`&B$G|g)6i*x=u9i2-;Rw+ONj;iETi)pL1#o7&R zj%$s3lBZ}`!SGI;5HBLOMwEyc3b&oZ^Hy7>JmrQt<{Ut?SlgOrt}({wiJ?yVcRdUo z^}4Z?_fvJUi9?zFJI{5(^C&zfa(PtYq}P)bNwGI&vD7`&%uAb?u1AJm8GRX-XOc1x z%`_(Cz6|Hm&q?<Oc^=WJE2Juy@@9%TDYhnGLMI!WWG$H+Qka`rjxFWk;uR;mJ<qiC z{h@EchQag95ltT`64(}K7i`NrGZ;MPmXIjDMaSOOHIk|AS;Lx!Wd+H4=xOE&xXXCP zd%AnldJei<x(~bNX;tAfPD)qBo}y1khUR9KlUn#wm?=yVG6?HYz*WT;Jk4wg=aeTD z3QY7b^lnW^6R-a&`z!U&_TRsKP52V{oc{B=PoqCw`gHiS^7Y5p4&Od}izS($C%46o zU#rPr5fhpvoJjazVl(E9weqd<z4Enz_xwy^_RPS%!0A9sCYtTyDNBJ6XW$g_`(<BO zZx`<rZ;ZF5x1P7Y_qcZ|^Oh$E1_a&A(yaojx7_Mtr$q&K6aPR_lw^gZtT=l_X)sUn zgH%S^Dvl7Fi}~^T%oWNDnYr`Ff&i{1udA6@PTD~RPztnWzyJPI>8IqAYRSiBLCHuC zQ&wdM>wk$<U8;;8ExXiPilTPCN@97yl^^Y=iUZ|U_{#9I;eUs92>TM2lCI?|xXeVR z6P%aJNcV+iPG4&%$imssRalX^q2zjT<E>c^q-v`Z5JKV>sk@wuJeUpYMeVIi@(hP_ z`~#isO(t4Z2lK8J_7I+RwnsuOu+-fb4a+#@NKMjOq5s?|-GI}$BJ6Yq+P$p3_yMw; zC5<ZZpNG(qEo9El6m&`s*>&a3DR51>oq57kX{wT68|K>ME`@5RYSi&0Rg<MkF*oJN zRFzX_O_MooLfQuD%BD-5u6Vj~=_W8e_e-i#DZeDImMkVo>&On_;hxRfZDpmrRmw_Y z!~)coDRe#fF0jtu-&e<*GqG#J-T1=sN8?h*{rRi&ugkx3$9;^u53dyMJ?iTkXc3A) z?-FgVboK~`#huas`K_E(8KAu8h998jCe8Re%;Yv#F4kjGcQscQt+={Gc_goq_6Z$1 zeR}FO(P=~^_J|ww^X>P^-@1Oy_T~JiYahFRJovHmr^laaepbIIUrT%&@qOoy7e6z` zO^?r(IN$roS0u1HSU{g)6gCH%UUMZg%fG|7X0eA-$vvmn3YulD>XwNv^f^f$|D)PF z%jAKF)XxK{_(s{K?V@&e`)@11l|VJv(ClT#li7XHZtwV<34%v_E52rm*cSOOdAPh^ zj!+h&AZn?e;%@f2s=M>Lzq%fhiZGWw)=oR1u2vV2?~qJ;K$dfTwKe+H-^uzjR6}{G zjHDkbsWpL-I7k(F-u1>c%VlbtaKTK}%4*rQqT2toVy@!gcO5(}Jr~_CT_G*2R+{NU zhnO#ZRVpQY6eFa*(q3u5G+ru*UuLRUkKMdh7%p@dI+J*{SR5;Tl2o}q9a~1FF3J9x zlx0d;zNdfHELu-yY0S|C)H-YB#Zpf(<m_Y4c|+^EnGuc124*_n)5mjip4VIHmqV*U zqe9t3k)bxB8=)?GoZi^jZbWj=6|lxx`>pOw_5Mc?rA2ZC3bj722ky>c?ubE=^`bmU z!jisBT07b9WTnxE{Yn;1Up78Tc+{+jq~Q}iZ(Jeurc8>n6Jg&nbE1f;9n2bd>|5() zb}+LHwfKD05Pjkr#Z8Ml6L%wSMcnwf#c@~ThQ-%QSd?%(VM*e8??1j{%qOoM+NK-E z04t^QLHLXAY%l57k*;L!6rLNN&S8PDq2b$c1ojL2;3?&);%@J1spV2bsJouQWKOpV zm=(ywx)r<=*vEu-k1vP!Ny6v&&hanf3dJq>_1CWlzn<`Gu3!4k4!=Ci`&|$>I(~k_ zb|&aO@?H0R@TF(&#B*G1_4Hn-q>t*=P?46T+C8E7H8P^Qsfxb6jYThMC)jhHtiluF zD*WYgScxi1Kl0AzbNl?z*187c>n_04PUGoAMRy#|{;n&%yA;1)%U)UO>hD@d9_lDp zC6}%ZWL|^D&yZQ3DSaZbT@WrfLA3P;QS_8?esC-1W?t8BCsG(7EJyd8OFSpmWon9> z*)5lt0Mrd`tRvd$-Sl9e)p&IaIfo<B8>{MZC0a?Mj8onz_0)^1sO8mqXnXkn9%$XQ zklIn5sN9y@$c}VE>Li6pcf?lWZDFN=W*SdcdgmZJX$&`VFRGud%-`@ZOKzt9(`sTJ zF^iffjcUew=5Aak@qI0b$Y{NkUQ~}J!Llg1q^*rh+|Ikmr(VyzwYqd?FU|b;4X%W= zP?BIpCd#jZ`5Wl}0lMN1?B#C1r0)QSEDPKA)43+@kx!}PUEAHyQBuqgA4a!OllrP+ z<hzKm5h2dnkzunu2i(tL6|XX%a}FNA>-JNgeS~hJFwPh#>z_&2^witQJ27!p!XsvC z+Bmt|#+7HHb-TE2aUbHU#HUP1mYCJshzzt{fiz$w5#~p0vol@nCErq_v<9vm?&I!K zo{^pho>ELuFzI88hm{CR5w?VE)k^MDt^%&sS`igptCUpC%*-?Tc6+@QZ_YFSqN=IE ziL=>UZ+15unKezzIAQEI`tgnx(VK^cqH--mdRV|e$zRDY`8P4qFSGxIzjB~Xph+Ni z@PDDX=-%HLBh2PZlu6>OWi<>IV$p1;l~2oAmCZ^s6d`Z5)2{4foMrG#!|!>-UEf{J z9qXRVWaDY{*Tp@1!7!%LF<tkZqZ=Q_ZPe2}8kV${)=d2>KR}`JR*0cSm};-H@>rFv z)nKJ<!4scb1?UVGGskU;Fh{t>WUzeFa7mO~%Uk8*N@?YUyjeag&ycgp2c)i21PNC! zsRs`_K6|4*)m~|@wM&A&M%#Hw{Td3#6Gs}4AS62N9m#Pxy&s#yjJ#BDUCmS|Mt|x> zSu4ZMJLXU`9A@Hxxyk&WSsn%CP;--Y7d?L;VI(ucvU5VOQ$Wb%b#iVwMjFC&+6PV> zrw!~=3G0(thM9f?jXcJ2y(~S03KR8rs8?t#Y4X)WQK3?yo}vDs!J+M;M+7vBOf^hN zj$Bjts4-wHmBsDSd%3IfNI9kc(we)kdkTa%jBrP;jm#g_GOA5fnW!a^A0qyY*c`r$ z`f-D6r?y2c0RP@pT<NH=t~HG9`c)F|B>1*P{?7i={^I^B{%_!2M|>S&3)=a9fbpyh zG$9k`haNC$(!*?U77GK!PEs*>ncPm<rXJG{xi-0Tc$Rw7hjkA-7IuT$<SD#zJ9k!h zTK8aA11*}B{!~6EEf;qPi=9=rWmUBLq65sz3M*v3H+~v9Q36zg)p<g;VqvqMxziM^ z^41Qp{r2__dkcGclf4iuHfXJ~+FK*6XVw;w=T}0Q6we7ZP<|zAibJaUX?e6<p4ik6 zQa|aZcthMLP88dT*~Ikdwp)w$Nm?w)O>~`3cCog}b;P~d)0!S%LV2Dc+!cN(EKAry zPeo5}_c&K0?V+-o%$kSH2zYKSHkTQyF%IOaR;V>9zkB`_=t8FYZg_tt7D;^0Y{eNU zSj`00t8x~9^A`!?8_?4jt<Aw!Py4;ILreqXHV~(&3or8}cXv-O=AXYoFSpVYMV5KE zd#9_1YY++N5w6Sh`vs_tQ!wvtwm3+r=M=I<u+oyocu<%cp$S1HI3%#df6*7|YwbOk z*gf%h;yLdDUk`uV!17>f-Dl*q8w=^BUGe}mv#X<fKJ(RMaF5F2;bh`g2y5=i=3cK= zQBy0Yq=MpY&go9DYpZamoHq0E1g?>aQqMS|ch~!o>-&;b_>ye2o4lF@PXsoB&ejR- z)E^otK>y1Mm89!RW!GHK=5SABUM8n~O_D8Xt)#h<K29<*NwOr{qTEq0NS*uPN#d@p zO(A0_i*UxOWZVr7^QZN?61vA#z#n_&=YpSIe$M>){pVl5V&aO&=S^slILZ6MH;vP6 zJa=jtt1QzQ3&3&wCHGPGs!3gy-R(Uk!mh#cJdNlad6!$hTGZRfj*;6U>M|c~b;RGG zE0f6Jogb-0d7{onKEZw1Agq*Uze@+-KO`l>q~Eiuo7Z@v6GNYZ$%Ewrwfr-DjeNCW z%8D{$bW7l4Fc4ZzzgLg>Xw7gGq<2~hN5tFGVkTr{QgdjjUGrRPTq{s;TtOl7M5)b` z#TA@2Ve%(jCS&EFO!e$bRi9C@<m1$9ZRA#D3kSFd%Lq%IJ9KbWnGt-%NMl^p1A0|s zno$sLq!{{_Io59SH@n%*?BsCD-^gG|X_YeHaW6%Xc|O&speG9r3%(7=0mGNkw*!3b zUvC}XZlBwKnhCj`g7LvKp{p>y`8m;3F+ruJz1#k5|4IM8PsoE;CKdD5PvGFGE%%1a zH~?<{K~p$)@8P>Y=dR%nxaPaUT#dE<>MG@q{93v!{v+IVY^v9DX2{5F6xG*+iiGws zw_#TB6JDohp^17YBZaxlOlJ*4dzQwjDAb|XStYHLZZUgrskA}*S9-u+jl#vZ0M__| zcvkF-ru~eQ)M;SvvkF*s%wonMJ+1yYbdEEy9z148y{|r;?)|8~NZ+AnB3&@j9E?({ z2RWUFv57OYsZoPp-_lE`ro!F~8`fVK#$2}1(j6%yKA&dNHL)m)`(lFWi0Jv|IXU3b z8{6-!&(<}or?uS5V`paVkF?u5rG&zw3pdjO8CN-3E?1b;_sl)R^VO4=343L^Jx8Fz zi$t@cC|jg<Vn#eWW9<!gJ?A?0&0?W1X}`_n+*G$Wlyl0TN`kx>J}y>HkCNvoot`P3 z!8Ka|raUv9U25s1_$Q~*J0XcUj=46+#Y5sFF}qY&5~-q(iL1n3;!mL>Gq&nDBkkGN zVYEME_3@#jXy?lZ?LfakAyS>y&^UcQPN4fF7*7ypGAZ;=>7g`K{zslH50GP+wYE^| zL7wkOFyJU*m($yEJDo|h>|)+D3K>21@1fZtDKsjWEchZ2z^f7pTntPMG-EdWut15x z7Qg8$>YM8Q!<*0hAhBa&io`z>EvBv=@-6hw2%HHfV+KeabA^?`i504dl5|aql^uDS zvRYZGSjtq~aznJBHr@3P9=Z!mtv*L(>2q&)Hvv5#>bk0>(f+5NR6fe8oLY(!zc>@^ zcykVT#+uL-?xSu@kS^l?;(HJOH_11}ciC4L_S*?u2rde3;SPLiEeGd#CGA&|Y2`TO zntIBi-x|xbpF)w_BE_h>QT3y8Ms18-5z#3;eb`<1B&NcoU}k(1!EN6(;zRR-V*>5{ z`F(l8r4QmgNS07H;atMJ#4g?h?+)KB<`thn6CI_`V8T)vQhe*#C7G7}5+zT5R@Xea zfbvYapw83sFl{Nj`;faT?##n<)33tsgjZ#%<lwNdu-={<?$@r}+Isb!(m)v{_mldI ze+sRc1a}?R$tCldX`0!rqIgfo+r3}~a^VTtN21U*DK(CxU2;KXr&3zIt<K`BRB)wq zsjeV8U0M=mj*mxEyV$jXGiV-DYyKtab13NY3)dFcY*(x+gX_FjSv#e6QWq#yW$|}T zk2BnQX-w4*gmQ(B1*b7_Y$~U^C$x~NcQ^Cye&AjkXQj8NFd3?cqY4knXsbvDU?Hgq zIK*uFyYeVJQcD_&j|HL|g>1BN-&y8VBd<;7Y$)LjAq(LqTtx|My!nWEc&kD+$WGts zJK{}9?39=<v0vh|#3J5>-tXRwzF6N|-xz<oz}~>f;ONj;eWWqKtYOLaQM(oV$Y&=& zCgLALE1@fl$0JhWX3|;K#h>?04ANn`Q3Ld{XE5WkfPKR{4a#{3HRlB9G#^<+C<)*6 z#X0WGcjkgAopY`@lSt9%;WTk#oDHy3kI4xh=#0l}dBo`~^bxDTU4P;oFC=%8m&;3W zdS#MN!m$*S1b$XW%)`6jh!1dsCDJi%<+TRC;CCq>)m%zBE$8DPlzPd;BHYwN>|a)6 zYpm%QgN(U)CcT_KQopB*#tZ!*$(==vWTtMOv&PyDsfvGzedQC%17?yobg%dH2)h&3 zFT8eyD{^||e&&20U<!*A*@pzPHsRC4mQf>&qx)W>#j7DDO!-s3FSX=c{*IfdtV2XH zYNP>nEGndbIm>e5w{0R^W47?W?0GNw-HIJ$H|IuKi&NvUbAn{&2k<6?l{D%a^$#sM zKG$UK%I+C(T{qp6+%k%ldRjSZkgq5OnhUYiziV(qz2oa#uwRq%m*}*^!PG{`2fj5( zSRwS~U4P_^b(%XKXTLqp&S(#_uHgn6Yy68Bq@_MWzpR%gho~IL=}ox8I4iB)#6Co} z<$L=jwQM!~BPY>TrLq@WS**3D&e=W#=Ueq)slYk^zy3XR8*#onbh-hQFs+#_KasU_ zD)1=a4jvBv8#<=f1TTm-CF`!W%f3RE)*>-d>L|UD*1_>*SEs9O)D(CkYbbs3G5116 zEsNPm9&Bt^uo{}jj2L5|zA%(D*uk%RQ+mrLW>2u<vd7)~_2}23U-N#w{&h6&eEjKz zY2?4I_xASH^fwADMgtMUy}ig-Z7Oy$R$jQ+R9X&CxdaVLR(Ds=urMzZ>@tQIML(4? ztb(VydzH)ODyg+o*D}Sqtdd4~AkUK1$%mz;(gblaYqq)b+8)nbwl7u#v>mgZdO{)@ zyQyINwln$pni8YlRMTpsaf{(Y(-O3=oUhqkK0G~{=!*BCAg!qWP+}EPIVv|nRr~;~ zF+JVVB(aiMj61)FxD0<|3vq~;K{_jC!Phug9wk4N7b|_#aIL8}PTQ-U(VlVIbayRq zop4=t?Q<=34aWyPoIm-41nsrjVzsoAOYX=->I1B>ojm7OJmpUyH1BZwTn`o|J-1BY zq<<rB(mC`Jt9)tElw|jfMZ@%h+BlWJi~q8}6iWOFr0p(7tD4C;X_Pj1(=nE@^E$S3 zR+uaHW_PW@DP9vjOCE5mXi_ISD9M#oRQIYp5N^MmI8WH*ytH3id(6GYa(!y(NiZr{ zgvxw2NtN3;VOsj8`Zl55E<m?#`R@ce1n&i7Ljk-<A)`CU+IRD_d4V%nqw*bV^{}dO z5?8jSlMwUNvcT-d)BD%vzq5m$R&~xeOF*;sOE;)MXDB0->PkqyC9jrC$p^W$ukqeS z@s1P~<~og>>drXW#$0Bsu@H6o2+;C&L5qaZwkS3mpsE<*TjgDqSUYhF8n3v--wB(F zZ-H-=e|2C5Y<g$C6<yF2GdGxFZD*KpQoJs;B0sydG6Cgyl$uc;q`m{un?tJlSTeK~ z&m_-sP}>`xE1s!z6Z`4$kGb}{F1co)|LN^o=2G21@zJJd?p<N-+>kOHrgu5+=lh&o z6{XrzTdAk?7qw4%`s0>LeYFnAXkU~ZecUVXIPP)ha_?~UbSbW8+8}km(q74@e3w7q zi|r-5<f$ZlmIdn`Cwz2@Ig9Mc<bl?=i*Y)?vCB9!@KD4EwQye7p#I4t50mf9$*GC| zBDr{!I#X?`7Ep6Ci?XnqMKzUx@<3^#>}5|3ke-Qk#D3(nAG2RtuQ(6Bpi#ON=<o03 zTjYI9C9*FeYr^ID<?$2Zuf~^8n4Azy=*j!}CUJ?kFy}-s|6zXt94b$PcBraRfpg)E z6>Dd5$_W$2>C!}bDj9{_)IwT+P^BuoLyKKgS>erGHOT;&!%ip&_9<$0aOAd-o0BbM zz;4g8V=On?=yZA+)FJZ&*ZdLwQNBXBpa1cCy(dxL82*T0Ui!Y_D85cw5zatiw|E|` zHnS2^o{@<d>&l3xpfuWoT%IBx-M!yk*Imz*0iJ%pl3TeU_uy>$?RDQF6c#+fO{c$; z);Y?lSc(&&Clx~`R3K0B{SL4~B)KhR&m=(^RueVV-{hx~D`qdGj@`}Oor^s`U7ReQ zA))Y{xQ82iuDDQKC$3=kzZUun6*##cI=!6y&O6ksoxsT^*bC4Yl)>@R0I&Qxaiw%k zuB?vNdbl#Uue&GX?aC9@C2VfkAN2OS$e<|WNpz270@XjPvRSUv)E!M+<z4AqbG5JP zKsC1-uN+qTv11Q1U-yMHg~~LV>UWNGQku&IlSZ6N`MG09z;lF1So)v1MBGaiEW>@w zlG?D=kCDq%h_k2#pMMjHlZ#z>T&J~S+E8_+@;7_#lK2sXIq1}OcG->W+g4MnJ~+?~ z>j4>0DOi7z_I$ARB-SCAx&r1|?&D3yJN8v~{7+S_zpUBT6j0-b)+M^DO(25~X#6c+ z4|v_jEwjojYhJ?@Jj^Ie^5a_l2RKaD(23yCV6C7x@DH3|3RF_-@O!sL8Fa(nJD>$0 z!1fN;yV5Z}Fb7$^QEW^Xx{FPu9P(PZnDQQN#ai`^ngo2kkSm8Ph0E>Qs<qXkwP$Ky zydZ|$QXVgj6}t)v_FzucVa86<=@XeilO&iBxEbgkhzMj1v<n=>SO1iAqM)9@gvof* z2RAT}Ox;w{Xn6rs*59eqw9aTkba!q~F>si49@R4vyt#%JtIoikGLa6o2zda0(mB?1 zd#9sb$|Ix{eo!e5c8WL!oyyb{pY7hZ%U)rXv(i`(%?{=lV~R1-@EU)c6*(Elp-?$W zO78;R?_xMXIy+Brq8}0JF+-#_Qz84P4o^?g-0Y<oEtz&noe#3xLv5s{!N<Q)IjNjh zzM$6Ku3lC1YqK@Mwa9gYN;bD^hISdRL^Z{d=HNR!;JmO~*oUpFW)7Uh&5gF?OQbVy z>0|V&q)g1Erb=y0Hd2{0%>AZH?|F`iYCBlRKdC61Qju<;${R^aR}05)Po(qf1Cq4G zeq^U~7H}3k5%!2%=~^UZ5-y(UN^24Z9>{;nsQjdwVnv~?6Kl68t8a(#T$l9#eNz9x zEByUaNkcBol=IZQlKay!@u+klZ9oMB-Gtw4DpOJBhmz@6^uLV9Mq`}%1wcYaI#cjW z_e0TLT<l5>TTpyXb^F{&LjQY&oxR&EVg8A8)(7IZ4R`ddz%o8#GQ4I-=)l^0kCLxo zd-M9H`EvUUGo|55NY|U2?fBfCoRflItjn|CsNU7mxT8E5JpIFDvfx)l9AvKXyQqOl zE+&b?!+8RQ$pfa%7mJFFd=Q>3EVsLymR<RduceP&$db%|^a`PCf&cj{!>%1oY@E11 z!ILmD-W@N*_lr-4BRjpfr_b`A2@ceYGTr*B<Du*OM1@sE*-h?iK~hkUsEfIsI;btk zrH|2$Qcdj9W@#g|4cacy+iUn9N}@DsLTcMU?vA0--%J<3?L;%d{XKlwaPyl{+nBAV z*8dG{2we$f)CcNs^bY7y4w^%)lD1=$X(*hcc3mN7L#>m6b0!zgD;pohZ0e#E+D885 z5IoabS%EdoCruM0#iPPJD%ATzv^Y|{CZ?sXuP9ZJzJUxD5H|>JQcbqmchTEAU<-!P zhPmI_^yi_~p?u_iYz&UaQ#K7YUk>&LSLqx|z&AKle}z768j~W%S#PY;uy$ZW^cUTD z#?v{qBf&T)fhpgm+Ail*aoRb<sf|ZDvzUHyiNDdxDdB|dOZH*=ft|`}$e-+V{&N0s z(l`(JTutq@)HDadgI|HNoaMy%8mJf0Sa~n}%~9#(L!omi*a$Q@i#{6_^g_HoGtI|l zc}}vi_9UvtTfz!)AZW`*(xJzwU(~idgY?>DvRrDa620gyB}y4VBEbV`r!<Clf@x~# zh8okoRkxQ~sbER6;Nov@%rSNtZgV(J?SkeI(=c~id+g)RHesIFPpTsO<(W!;)u-O! zw3+1Ej*_gYdyPAjr@v=`=QZ<bN{|wp0f*6Y)QBtGk?xMJ`Pv%wgc7bKm-myxAUd;{ zUKNWwKUt_eO8Dx5Z2z5Z9yA=^g0)HXh|%}y1yRQ3<UBq=+67&XvsLH@&hb&|N8)f9 z<!@yZYcEP2tbSEzYnfrIs=7zRB3yK*^!(u&?AhtL>^XwJb}Xl$=;;cxU7dSt6Zfv) zHO&?2ItKTd4VJVn>!y-gN_`9m-$izlDA)&fGo!RuOet<hUo{6E-!<VNzZ=Kzd(rh= zB@JP*bB)&)I?q4ILP*9-a4z%Yhl5s2JoB^8M<)+CNH2xn;wu>cZ{h_KD~F3!#0=t1 zYQ^24I|rB*I}A4c3;9N)=*~T%*}>Rg-(c<Fx4^<cqk!!{>%Z%N;O~zX`krsH?|;6h z^dEEmasI}E?WlWq2U~_R=$CNi)i8#_y!1yMzS*jdzi}cH1hSDd^gw7Y7LwjdlTexD zq4sJ;zTq<EyfTm+qar9He}F`p?2$OQvzJWv2)8fO!=5l3;08EH*2pAdEf||+lr+zy zO}u8MwhP%+nYz-2UVF6=FKiLdNClL&>ONHeN8GzTe}xUiZS*iAb7bbo)REO9=SS|1 z>;elhk*p;%{8o68@WHH#f}Voz-prx8t>#x_m45PYsg;<5bp9>YZScLR#(8F#<<uke zPoXbNX=wpV_f$`16f?FNozdNV2D7V(*SL>ZnQCD=PJWX~!eOqwE?jBu!R|URN(J1S z`<JVmYbKtR&B{>t>eNyavAi(YiLq;0D@@yPk;mLMbTcU6k00ev^gZ_7@Fn7}yy+JL zN0`f=iG-<r#wK&VHQV0iG$CzWS2}9@TzA~7Jh5TL!e@k!2yYSoEv#Xff&2ZY=es9@ z8KX7BdZ6$f7*>o_DNooHbe6|q&hvu<MQgj%Ffu&~$r+@d!ZYU#tlL3c)xS0GD?)Xc zZ&4)l6J+LTU|e7d+U)~@$AO<b;~~Kt!SXmh3h0ycEwGk;n1$E+G7$Ruprmur6>ZhG zqXBAS%s2L;0{Z>5DwrqDF4RJOm?W=I=S?8#Yz}N}Dsme7*_CY{^-r`_gmmxfxP;HZ zy4>VR|IjPY2Oq>UJvR^)XyJe6+l+f8oA1824SK8o+zHha`y~EMT<dM`%fQ6B0eBn& zp*-X{%mRa*XBB0p*A#FV4gUYM&_paPxnPNkD`ylDXX6yApL*Ic?VIM+lDIss*V-3N zA=TlIwhh(bWO&~h%p%j|YSJFkoR%;tpt`e#x^y3>;v~DXor9IP*)HpxVpdf{w7e<B zGGY^Ppx8z11hd=#|G_&}L!vwemz}LX)~F}kGnp5=&OHj$@t3PJob`6Ch_*=miDJB` zd<Z2@1@8IQV63Z1gr93Zz)$^FpNAi;B3SformoCq;+evXRwYzC)SYMGCUa~wIL<`+ zvwuLI%F(gL3a>$5n@T0*aH`&ts2jejHMDumA>X1c)Bd8HI83MWMj1xuw3>-<lf<b4 zn3Ua*DTd!kp6^FKN^h8@Cd}-c9vX@!dUNP_=uRjdQy}~6JM}|&d@>p9jpCg0Rjp=l zor|pZcw}SkT~s>@(R#kJ^EsQSFT#X&@ZbkItELGql%T6QlSc5qUE_XBPS<b)j&dTE z#&=HD&W6caTA(l2_vq{NIb=KS`OR1v^^O1We-9XAjf#fH$N)1L&_C&sMp<J7GoSOA zeYq!Rg7sgAhdjsk@xc0J6^B2)1oxT~-BtkJ^R|$Wbl$YmOvx*?rK{X2PmmkQHpu)l z(c!Ks<#e;>;SD*0H~k1zT?%yJ!?^eVMq{jmE(R+EpW}2|9vDRxw32i1L7-0X3QR** z-PYeRS?z{(**@>w5cZ3sq=vFvSpiPEQ{9Y8c7>|Z!MW)~Zfa}LvD8B0-<15QJ!)-| z>b>#>)WXql1Aj`Vz!N)=Dpm&dKxOfnFab5`H)oO4*D1~9l>y9Nc}05IDRSFR;4^z` zE$3NZ$MxWWxkwPFg6Pkdn^X6+Q;(^swOFbh1(bGz>$)qyd$T*>PEB%2FO;zrJyku$ z@p3xu=k9-CR}Q+GyArjI+6#4-nx6UUx8<hPD!0T4lBHI1laz8^*|qE|D1$1I)OE#d zgWpZ!EOwdEW;MJtg<y2D;z*39hRr8D7g~$!nXw_mEOY|Nl;rAgPuoG3+R>kn#qU#C zJ`O_RgAMH?{wt&x8al)5<5rke5Dt4DY;(8Jt6;_8ia_4LN07EB{tN!`_(%5ml|W9k zk2M3m0!ITyP%#FBl|$oMm5QEBZ>N7j)v7Z;vI;E9SF639(fRJo5lVxTCYAE=?oNUA zc`QZK)ARsq_$(JyI-;#^f=lBcbW4NynLkS%xDgMDw?#opNmVu){ijB6atl<Vx>Sol zF-dpM2}`sRMg1>svdkn4PIYEF6G`Dsw9kP@76D<16856#yd@5Ye<=+@QeJ(IqJNKe zRZHut;;KgHsKG<0<^*VhHtHXG)tRtctI#*asP&cf@+(yO51m733HF+Y@qz|J;h{9a z#ev>|TsV;W<GbsMM!Ac>B(;8VZr*?WAN`&{c~0mEZr>O(xvGL|Mq3%F<%$Zm#b_yv z+US<DN^Qjy+y3aw&f!N~PbyS`=Y(gGr;8`2CxX?mgOsy};4_I-$2GLgYNR?}NvE76 z+0K;4QK6>6!_t8rw1W2~ik!NGQhO;kSoCN(o-jFw{69Ip@=dv<PS=w0GnR6%c3*L) z$NMph`fH!(qUSSi@Aas(lZ2<i>%BE>0SP4i!ZL-;^qiz`Z|AzN<z$LlMv{^)iA&+- zZ`-NuA)v31(5>Z!ZJbT2#A;5R4n}h02|mO5=!q_Y*lh@1!UvELdJwvWLtE0r^^|%U zy{p~<9Zd<nnx2ExY#}VeHkhjOXhnMZxB6~-za-{PT$+$E;U5x0hs95dUlxBh-i)uD zuqmN(;=ROT-o@U6zGuD#aM&e+RYQO2o0;`K3r$TlYdp2MSX96cuJe<Jg8;UGXT1lH zKVP0LPhx$QmY++D(4Zxg8^U|7ldqC2QeK&&j3ia0nbK5Ap*#jZ+s*&^2Y2cUPNM`A zm;cB$<g>iTJH^pr3Go%Y>_nlyP!Ht10u$FK2y28r++pX1_d;H=`+w-kO7RqE%1JQP z_2NN(?}8QiA$3Dl_%D1{1@5(>sHL)kn=N-QL*G)*oq{L42W(`Z>z?K!MYEn#L{1df z3pGi2i!nXMiBP4WPA9qC=k{&(mL#`)SmJ0@?<o>rB|J;WoVX}4gLgA|db@qa{rmm3 z0xmSp9eB?-z`cDlj+))9OkmH+1OsPOQaKr#zIAF3(BUbrBGkZ+Tk?E?aqHzSL56x? z*ITWH_C=klCQ)}Qqm+6|QgnR9<Wtf>*40}$$NcmGe+mvc8EbLy>~hvSkDSKBQ=vXT z?_KdHIfL`1Q>?}xl3z*!x49CvMLqJj)5%$Q2Bq*bPKGb?NLRR#v%pOp7B*2arxE5k zg`7v+R@bb;bn<iYnSQ6%0Qc3~(^nq|wF^ar{tb2uehBQ~%<mIu0S8%>Zs3o=@W3w8 zTUG`d1X2g?`zMpE7v<j%vYQW$RD$=QcMsUxaBpYtY#eY0L7Auc4)~JdSxdpa(K46~ zF1axG%69!BSjijiw>A1PJzj51-b6OEPWfSthj4~GrIK`uhjB3`NcEU^7|y$M2PEZy zdV|*qa0>}VT2Dn&&d7`9-sCA3pmNS83vwJ>;BRj141CZBDNf48d3y@1XM+-la&5nQ z8U5t}^_%(@<o+rD&OtpOp`GghGCPD_dyyHfx!mR54S3Z@0d*3@wHduhW|v1Rq1I4B zFy&j|DRe8NHOWkA{xBYKFJ~|`rdMU5V`y*mN1c`9KjwW8o#-3;989n*j)hH@Q4vp- zcJZ1Bcc*dl&Or%tfC@nqW}|1C4tw?lpHV%_PfAK(({D`0LA*lGqTi(osT9hAGpl82 z4DVrTcK1cS5nsCm4E%9)aoeqeDBsJW^s6Ui5ub_8q^q3uf5;uV>+i`|<ZY-^yUATR z%Qnl0StT{$*5<KZw({<*=I=!?aW)qnXg2t9uXGnT)?rw+DIkKazy&|iCmj$ckoj3( zOaU`e1I0u-_@yoM);~cj^T1{u1M&Ox+XaqFG{13IpQvX=^?Z@~tctz_RA`DJnn%oD zD1}PVjYXlin&SM=$;>IYA5Gv2>Xp`ZO8lvdx!dpIM7@XRVk9?iN$TN3^uUpp+mfvN zW`BC$yx`B1jFiS%6fwEbXno+N>V?3dVyVoE;)bdYtCijA&gTeN!&y=1Nx-d(mi-Pj zYGo=6k4OkBo!BAa6u&+ef-vTj#LIA04Wx7QvLDdK4N|TslG;Swr9M&vWb-Tpold8D z(IPyfswt-4RSqa;m0OBe$*88|ws3*5Mv?J(Lp9VYOgn9<^<pMKJ~W!YP;AC9ou{~G zndgz`z2~Dx4J#eij?;g9*wnC?u<xGEB&s!cA9aaLLX1}{pov)s4|NAbWC=(&v%9Fy zY*tl$YLDl}a&S<|TuZjlE2}Lz2(6rWP=E^J22O+*QfJwvJXc1kLG_3>!{v7W?!d3P zW$w5H_hENK_gQ>F9hi@8FyVHrJPOTGfC^_dlanhMDM=bhi=JwiKbL=@&+F~uwGs~` zE@$3i4C&1)6VHL@Yu@I#KPr&_kQ=mhlV1V}-H!_CS#Vouvwp(}m^tkF&Hylv^-_%d z0A{`im_Q=jW;QhwtimNwf_?P6>y_T*Og)vyb4#f5ZYCX9mhO_UG6?SW_hi*<!gL(i ztMS@pu#<rZ9kotcE3D2|LF*&<Vr8?KS>4QIim29lnETiRXK`RZw|nA4s*T=oi!h4` z0ZD~7AOi1s9fEoO=-hJNqJ`-QW>AQGBNa}wj;PT4GI^!9`UIWwaP6>mkAIHg`&gva zC4cyp+DlDPIxDB;;__T+gSb(+;iN!mlG;8*0>VUU(Zj5=dpwDEoc$H;;$Zi?VSk_4 zVQ6kAJ9o$~Ek^afM%XIcpbz+0h~TM~gbhd`ZI>Fr+T>(b_G#sZl1eSasw&GXlPanT zF4%VJN*smtQGox{GPx?k`7A_RFvHaduk2>64=(bhYD2!e`RH3paT<mz+0p5C<{i$j zj#u}o7dYkifMr*MYrVyLz7dRJm~vC`!12@u6&#|jQs=@^zTnTlQ=gtk3A2g$$H~RN zaY{JcIn}^Vy21i~ux^3M_hgUHr1Ji0?Ez_PW#z>8p2oUh4g!y^Nf*<^Y-ZL0nOXr8 z@(UjCFv`_p<|{CZxkhjBkfKIv<EwsLAFJnK-nkTN7Q8||yU>5m7vQd)ocJ~&dqTVT zPjLt0M#WW%)8ei&IpNVSS6pMV4%fx!N?4oVVHIYA-5KLEe5=tbtPczgMu+x=dZ7y0 zXB06Hqds4ROFxzw4qjX#b*WCzJF?J&y5S?|a9R9$ZN$!SStbhT;`ICroC+j{Y_k7k zjoDzDE%|xR*`?5!j^!icoM>SO2=RJRM+b5Ulx-C&TK-Slm>)G+7ZB>V@*Q6PQ0Y{l z3M5yQlhh`|IGj7FfLuksD34VXwKE9p3pFFS=mYID-F8u)X9HJdZk9~!`UBcvI_`%& ztz~!u0x+5d>AZW(Pe8pE(R)9I+u!1Rgn2s0<jD%;GBvdR<b2!;|D=$c8fCv_f1I)| zTRYh!8~F3XFl@W|HPLE<a#jKZm7F*B{r^^FO|Y=bs1mjakz#qyy*N0LE!>tR*^5Wy z7jnG(QT`$aQM}}l-$_UCWM!5fqKm333gE+IQIB^4cbkkNq>xY=9oIr|0oi$unxQK1 zqD}|;3cXwb^bM=vB7$}?Q2%5?Ss{gx9VRW6P(m1q7lHmt>?e+bYw99)6l26jVlH%T z8H7b>&}P~pt1MI9ml_Eu!JFV!OcHDoSmW2JH3Hrn-f7-yUIk2iGU!Ka;_Spri3!xK z6TR=f<9#`(HzMGJj-gH}1X7$52E0?i@GtaN^=I=7q(%S3>xwTcp889EEzlYE=vN>L zwRavAbZa@sQq%P=4dp=X_Lxk%@g!yDHwQ4+x+A+ijGM}j%51swkZJ6(!UlHrUG5MK zZ}kE(AXbw`NjG6``^zuMT}iH_S5hj>#Z*$UKQppoHgFc+RZJy?T2&pb?w}G0)ADdr z>;!x1?fT$K<?c@MP%qC1PeT$2my<D`5EdRD47(M!kN@h6?rkW}kF@SCu1h#Y4E40y zUcCc<J4%_X>?h@A7N_kI^pI7-PYc4+_fzkn@b+j`sdRL$wyOw}d$xjuET$LlsnyXc zX{EH(+ApfAL16c<mBmU$IH@l9S))N)3zJeUgU9S=g~hO+E1NHj2`D5tfd;zt>)<bc zQ<L~{s5WA@%N-crT)`sD0~`t_zBE`m^behhTMyHF=*0{NMN@Cq#W8z?Q-E`@t@ug& zU9Z=ZZ_8Dgw|<SAw2<0|^Qw`W0faE8vK{2Nv-A{Hz=RoVER<vY+yUk7@8om7;D+u3 zR{M(Xdm&DWikwF==oYh4(-whg%wfGpP4K`B(4Y6T)>}cVu00au>Z7eXSy`>8?c@Ac zYwng1Y;Aq(D=6nA;}tc;W_+UQ!M|IuX1@7-e!st9pc@Lj)o3KX1X2Z~Ng1C*=F6l| zI8zVy>UoUmAbdGdPFLn8nuu1~Z`LO7{2_?YX#1vJfYrZ|?|K(|?lh>-UgsOV`6<xo zf50}H@w1$@2ZI3q#&PSDXtWfbA^}uw0XNngJb0~yo<bE|YwbbUOltqh@Urcsy7Du! z?k2&|N2o*9yQ+%1FB~7pXV+MF3Gypjp#1&`>(rJBNoT^Zqk>x)J{j-y#_;vwkHSBZ z;&(iJ8;KBs@RSk7BN|4;MjR%KyMAO$WE+yWQ%0VRC=_utyhHfyu)1MiNqzn4UgVB; zU%-D>#&w+)J6LsC$puKfe}wYsyEvcP&=wX7E$G>Dzyn8cHk1;Ya?{=?M|SpqIK)KB z29t}S<9i?{A#-vpJ>fjC?-@!Pd`JPZ_y+UDr^7%`r(c;MyuiUe1LUQuwFLjsLtVpv zT06Kfa20I0DH$CHKtXfU$!<wJpZGlSWTH2*nzxbn7|z0VzAWUEEG8k(6<QD~LLSct z;|hGqC~&#^&J@m`KFm+dO!wYOih);1K#R`&Id*Vcyn<!uKYMaIeFjhO!HKjA56ctk za|Ki~+S&wzo!`7*w8GJ|NB<Wk)ogvKzFA)h2Gfeu;vlNvqNwM4QlY)XADxT!Sl+6| zDjdKn4Z}^<!n}*3`zUJe^!ib7#)q6cIY62J!r^L?6Y>>3RffQrz|%l!aGu<um!XAv zCF7w{3A}KIC9!I+kf*){>?;d(c^8<aS#l1gElSU{YAbl%LpXRwkZ87zUT1+?9-Y+^ zrI8W`=9d7DvsQHBc<=~E=qkrMDV+`6ctvqoRKj(V9!>uOTen9$j<bk+?=ZKXPg*Ot zCdFnw3esszn_TH~Tut4*-4nq#o}osWLWQZjUb)tz*Qf@rE>NA^1wkIB<$y_FsFqMu zsus_=rcw;N@0Fa1yR86Nz%`tIX<57L)J^J9?#48nMfv%d!dfa`x%k)ts8QbIQHf># zQ)l^z6a-rq#Te2`Zi5D{Ae)fP0JM!{;DLo!fQ@Kpj5Ah&is~T3weg}IG2fUOITw~# zcgSyOV8`(4gL9-gJFb(R1`pCR7?k~FubAc%+z+*>V}8(EG^J8G2L{_5h5xS55NehA z!TP~)^6(}HKH*E9LSFAS@+Z><vILsrTz!ipV^7czE3h^cK{~@2{exZ>#6~1(=TGyP znb+!Vjlw6<lanbD<;Z9AG}U}DR?$Xua$CT4y74uKaFQJ4oXmzoA}1&9M5815my?Vt z#%(yx5@ZKw2HS}v+twG#h9<j*zCsV_&G<SO43#P@8~ATlezF60BJR5+LPpTVQdGeM zs6X3s`<`%Oo$RdSId);vKiXPlEH5kSqPd-V?K<Aba@HSKZmSMyM;ond=nI(%goeA3 zP)&4`CNu$#_oH%JZLXcwD$ywy2gSecPUk7%sq5+C>ENk`FK8Uo;ZC|bqJir}u52P$ z&splBc}yCfh<>^`PW8r40G;7f)C_$&>F$HkHKP;!7cFmoT#6CmA5;U6#A0Xyzmlop z$V2d?^`#EJuXfN5a7%86S1zypK`$1oCDo>=+0}>W1pIWk9=Si5Yl1k1{hJge_kEC} zEoin&f}xB9`?v|$A4!!lhCJL-sAz9WEvT?YQ|0U=8}hCk$J#tYSKJZLKs$Ppnj}K~ zji1;S&x1(iMzftqSm<OyE$mQXwc<HGGn<-=aj#`Ce0nml`ThDRH1aET$*4o`egkzz z6B4#dplvb8MeB;1_7nMZ)t!E@Ka<FBe?)!xl2d*$IjGU3pDy4wT4QBJulfYu`#x&b zze54$tM5a>ci7*-U!JsvwEjqDn|OT{sd57Tl6a-71_lQ<vjVd)m7;NQLhuCKNR`mQ z(ALly(BU|eUE)H;VeDe)mRIW$?38Url)05Pc>^!ZOcch~sAsOyA(s|f3XQ<qW(p^% zYOaFgt`PnfKHwc#3C>ms9QZ2QnZBIf(d7DcQ}(bPQmUoFW6sbO=R-$xpSog#Hl1fv z1wHvb5;V^!7nP^nQwjLIV$s201PvT6=cG<<1M<H|ek?!XPgIg~GSIW!M~zdM&Uv<W zUJKxL9Swe07z{@BbR;9?wnu@@>q_TbiY(B@p!umhGu);t#<c>y<w(|BS*4ZSR~kW; znv_|6W5_>mWo=}iJtBeolHNzp4!(6aG!+)<V(4S25zO5JH1ip$4#G%eDIzAp51v&% zC^rN_%*V-9lk;;uZ1!+Y)1m5Y)D*qcTJ&5^)S_x~>h$$WE)tY_$j_wGoU75~%hneT zbEAJoY0w;vb3gisLCy=OBq+}mYM8r1Zm}UZxQ$=ymNZ=UC`^jr9r7yuxx+0rLA}nI zy%gof6i&?;bQyKz*>D8~#8Tv_q~a&i>~SCg*Xe)@n;CFu?J@oY51yeH#AP~+6_W=Y z&KTyE)FglIt1*$x#3Xo$zE~ybN*~}lDL_{mjXGkUvz0n3FZ!Y!^gkESn?=({{Gy`` zaX-C5Yw(iWX%cr+<>0wMzQB7XkUZhcyX?39)#<xFQ0XlVW~9Pv{vQK6)<|NGGK=z+ z@==#vqxTxX+Ab{&!;5iOs0-G04Q2OeP$e5JX<k%4f5Ais<&sP*o(h6omrkh$T!}7i z0%2b+jRbp|D(%6o@({nqT0G4P*z$WhMAb7_`AUXsZWOomU3<~P)nOh_8deCYJ068f z<(9j>JD&R}2kIq{HcgE~?SBwtb*q$I+5+3Zmf9pY{p}L89?@v!AHmmsw3pFcMcd`@ zdv`*c6l=HQPomhVcc}CGq2VYG>V1!diW2lgi=}Dg1q?(%cZ%~QM$C*xFte~0?fp8` z-M{FIH!?dWAHKwg#%5z3s<kP`6K3_5<fQ#!rniQ`(G4TB@|WF_nlJ)%dmn18)TrvO zf~;o;we5kI_64a@LEO35nd>tWh28^BqMqV=v;qI))j_BwwB}s@6IAym{p~%tr=1|> ze&-dnW*%psUC(|*$8r@_SZAvX_s>r5x@Xi6G8)bY)=Nu6sn?Z`w;SK{O8dK=%PHWL zcRKJhZ)CDWKgY+}(951?53vI%ad(sGGLghPgDEc#?EhJw`?3G-$O`mmb*P0*-2*#0 z-iU{PX#;{eh)l?8@Y=1=^40=7Sc1B5wbc@S`!#I%S=iI-oI~@O?o|e)U@o(qm%^uY z<DJWC-Zn1sj(su`@ptaUY1M;|2;+Vl4$hN`8+?-;k81z8lL__5Vc`u7=MT7^epCqk z*oVoe<N9)!wBX;>`L#8?m5RzEGdX*gd6t{Wf_Myb7>N&Ykl2n6qrW&<oJpU*9R}=( zcoA<wCbA<2f`#VdF8H6kQT`_PQl1c#^oxqS7+uPA&b|5|e`{fpuYohCllSu6Zh`fd zMWu2=D2SV?gY%ucE{}bIe*Gcn#5O9&!`${WnZ{9)j^PbHkFrz(-%OX44{SxU|3VA5 zhTeQT2}1k0r_M@!<S<T&$GG%cql@Xl8MGCpZYMR0NhYaKDK3`JNJ&tsZYK+7GzobZ zsF%0mfbEV7y9D|HD|7_y&ehOiwAQ6L9ggW);E)#LsLl;~jFZwlNKUy2=k9RQ4X1#c z)OY^=PbsraP)IWpnYn3@mQ|hpd_O(N6#D*7c(|50IdRPmwLNxYYYK?$3Zsef0R|yC zGk7+K4)7Wsngb{G5k1Ub`cFO9ct#rkd3gGvtip0ATZXc>*4s-sdzOO%&j1C!%gM2e zJaFwl?Cc18<F~Wnh~VeuPQkt261?JrFhr=#4!+@Zg`HJEs9w^`4Y9W|L*@WA#R~L3 zf0ElUhtGP?&VdeWnUfCH&nh%S*HQ4tk%tfq2H1*MWx>aUFE2a1ARSgcZoa-kUZE;p ziltN!kNAi%u!$Z#(~+!@HK<~n@#+g|u|vEmUZQ6>#%j4HzQG6ch$^8cEc*=9gc+!@ zqgi$J;Baj6#v`dn7J-_lg4z5RKXe1Weh>P(O+rrQ<vtRVv(j#($DT`q#C%+{ru-ZP zCI`<q6*ui4+_kew)f=uXB~kAbsB;^|jjP}j_<d_wo@J!x2+~b)C|PG+IoBqE^<3b* z?@LFS4kh1q>o&b;6&xNNdCyPVGW^ec63=qrwl<goH;^-D0;g;uTG16S0w3fUbQ3o@ zWxs+<-X*E;p0ZtOPAyj(zu+=DCQBTEj_<2e1NF))D+Q^&U#V3uP@i7L7oCQCD7~(S zl7Rh>phn%nY4H(<{|i{3NGjTGcq>n{ryo$MCsOZLVhye%ZEZjI$3|R74ea*lOCH-6 zw^e`cs$5P6bQ6uav#RmD9e%P!=q#d96gRd$&}Y@fB|nAT<;CyFd<$z4o|v-SKDA(~ zGl|{Ee>qOC*NdCw15B;WO;Sl7Bd>?8tVfL}%VpR@OXx6$z|Z#}|9uv2udK}4d5<2i zt5g_&<a>I<M{tbIxruXw#*IR=-486w2eSME#mNA6N)Pb&l(;IF@!W<fSCs<P3X4Gf zNd8eTk*KhmS6$VILg6lsyctS)5Wd;yB4;x#Y@%3=y5OFWQ`n5&S3&O^!>hhi38&N! zX8a6+^-ItCZ^KWLi5sXIPLgwyL279g`spF^4$y$7@=cO!=22BmgOmLroyKz=#Mil; z`3WnTbGJ?C!{-;#6~9B7;(&@iac(+(5+ZKF8~uY8@}6ViVJ{*i=Wo6j!ufjr@uo~= zt?%ROek7&O;CDkgFT2qxj}gO|!%Gh;oQBEC>D&WfNo60m`f`#<mPU7$%@Qq(XVMU5 zPDXmJA#@ZDcdE?H-sa4Vo<S}AlG-EAF33vC>LjOfD&>se`xDTC<`*J_cqT2kB5{2= z@5()Pb}um6&hSiAQAF-H&?2IeiPjf{YKAf}abRn(V^9y=N0B`^&^pkP1cYvZ{(+c4 zeKZrB1NQ<iQ3#A@5}_L=?P91NN}if@)dkGU<`OF}T-`@h+m&(RHiJ78&_}e#7nBVg zs*oZpN8~B2ii=V`G)nJySI@B5FA1YL2~8Ya*SU%Ma%N=(XLW3md$a=@=OV1zkR8r` z{6)e?8(|&n(-ByQ7*b}l%Vp_VTzvNFieJe^ZJ8Mqa6L|s0<QKbqjI@kYHPLnut5{m zAbOhaN;2g<=<H^y=xA`}KX~e!&~ap;=IyM^p}$_Fyu~RSuKtOdRKm5<p1*fXnl254 zO+HS}Z6{V}Gt&2JqT`y0li@q3WsEJ7>ED-JjY2#v)q0E{t~z~TcB>sd&U>pYPpts= zS1r4sE!koC{r90ZuR#*dEAt)r+9|x)r||6jPQx8%cBLQ6XeO|$2O8mEX&c}vTT^pC z3t6FjdI6kg^HI#5A`O2Hci>4QH7T@JaG-rLKbU3E_AI7Kd24mUv$BfUK)XNtd;y5W zZIJG4xZ(SmpN$5FWNg&)=_#0aT07K;8)k55a%eAk3^zzuYQr<VuV*z5G3Bt9d4ldg zU@ou<bGN*<zu7l9Po6q8INj$l1v5mwKZ3Qr1_XRKjDVXIi#;G#U%__Uum@M#4Q-Wq zS_Q22-~w69eJI^GlDhGjnztTPR|e2+r6GT#B`VoPfh~c{I1Va;9~UJzFPxm0@y2^2 zJE(#W#rY|#9eS*eP6|5FFTxzL0NhV{PMaTc3(kt+sNFv+8XbjOearNU*YpGfVRGV0 zR-MUNC4k2MMb-HS+R(jxzwO1e+$zt6Gvo}O=hs_s8~M1CwxEL=gU2o){e=HcN7Zso z_R(Q&lJ{|@C*j0t3g?$u`9{x`R4K#C>B!e^p;RReBNjK)STqPO<v6F(0>17bKE9h= z4lO}m>ht-m*6G|fHMj$ckXbxS`XBnHtmHh-5ktZv-qBjPqsOD5eU1xz0yj?p9wv^g z<cS~+)nM%e>j>KA7@m1L>f)lTm64p<y-2z}!pXk^6ylmG!>hkD&w)zZ!zo_{MOtR& zfz+dBoW&XPk*fI+oW^x3**(^4%MbgplC?`7lNo6hw|-D>Zl|Kzz)g^e6G*V0Q(YcH zpIQ+Vt{LCS6xfk_mO!O{z|O`ltwJ{Aa?YDPuoL6xdKU;|g#DoTXJChhzz-#WOEd;S zkl+#TbEEuL7f<F?E(?Rw8hv=U^PU<b9ocA2I6+fUmGmUfbQ;}qF>dtJr19>eZhXnv zTmY1!gc3;~(i`2&F1p`>AQqo^R`IA6VyNwRf?On{gB*yre-2)W!l*>c!i6Z@eI_p8 zxA0QSQ5PPBf2fSMeJC^FvI~<~v-iOPD^hFhp%R(S)SStvZ#Hq8mzNL8b*LED(lOmo zlBr4Q$IHPB%u^qrk=skh8IKx$KMeN{GJMLz3SMR<Uc)cHh4bVu)<!$D`)N_@d_$*K zmG8I+_lhaiL?v*Fud#@#p%q#-Kf7p~xEaODAy(%UaTiteaui@+sgaIRCA~$NQv%IH zHqgffRI~yv-DmVS*ZBQL-ltmp-y$&Yb<kKv;q84WzM#|E#%Ec=jh91w&GWcH6}W<X zx1jLS+4rA|q(AS_O{&MSoMH_)r}Ds3KD9n^LiNBUco-M=M%)04$y0tsSL)*wNJp)j z0rbYf$ybe!TgiL*nribt-D+KD8h)GKce%zL8N<GMj34I&_uwrs>>1RCC+LeBGR?FG z9>*o1WZzL<jH8}UPbSYL7=Ta4dE*6p{<`r6W$0LQq4~Gzm?g<adCfW6iz>A|-?xj7 zZ2`SnId0T%DCg(VNe;)gVM&+JTuhX@NU^*Z`Ix-4nlpQoxR!OXkg7LAe8>7cMfIIo zxW}5E;~aHPppKjgihGJA+V)_4XYo|bXKHL+X|t4#`X)k|iO#nHoZ=^3#cN1d+o@e3 zarOcn<Q%+PC<Isw12}h<phUmNIWd-M;t!tgBXl&cseVS{M9e2WVfJQa@jDaYwlM?Y zxG<O#bUAx|7WLH;;Vu5QOYk|HQEY|twDODj#BkWK2~-Mu(J37i<Hht~>>a2_Ch(K$ zXi&4!=U<?w@5PhXIe&|C_AY=++w@;uK1vvm_G>7L4HxQ%{djd$XOUgRJ_gT|&ALZ6 zzSsB*#my`3k~QdM2k3eA-<tFp)R|G_IZj6}o06`kAos>KGHY6(R}R^+FfT!;Cg1&b zoJMa1i9ORnY(Nj_#St)#9Lk$G*fOw(pP*>`gJg;=^u@2hY?FfdcQ<qKRUhKH8e|-! z$E|M+hSMHElIZyVFxrvmej-7m+fc_o1BtE194nI^+e8_^-`>gT|BzodqEL8B9W$8q zmy|RS+q!A3<14hVI>6@+pi|C);-xC5UT)4ag?x|I<{DPgG_dTl<|Xw1XN|vcfs8iF z8|6T}V{y^#W!2?_pY$_F?1nYhE{vPr#FtTmF17+yeMPw|&-Ir4+aqd&pX>lra<l)| zaDL~KzJe(%#Ea~KV++!$T;nNrXQpIw;T4tV9`v2RoixR%MOWkA+KYbTEegOrg1{}b zpRQ*p2u*%^l`$Y@<-y1<sJ*mXFx+vhvNhB*f3wo^YKK6yN~!zsdmm+WZ9`9bN=zdT z7JgFSC&%-+0p-L`_DQ1Ur3VhPpR$wvob&hilRcc-S75hyP>~D+NAF`z<}R3Qb+YEL z!_QkG_WWlnC%8>XK1&%YmCU#eU-JLfu}?d~y@=L%R>O3<gsvd#ZuV?4a#J#}b9LUk zo75|Nd5()g(wc*sjpcdnXI|!WY6uNiLO6*?8(42Wjp{}zIEIjZ8hq`nz74nAYgBA+ zKoM>F+Z1TOrs95k!tNhnJ~11T=AH~}Wj|ca98@WF(13hL9ekS#unHLt)7kIO(d2&Q z*SY^C_5VO+;A6+fh#HmkOmtRm(46_Gr0(0p>~^eUA9&6l?!t|H?n(ds{P(R|)Juoa zWsY}lGqrK4;0R5r+ZS<m906xcFNJeHUlEUr|8O>6;Z!Xr76b=*%?`N6?)?J3E3ymH zh?dZjf2ZUQ`beePlN&JrcA1%~HaAb`8Vcv>Fs7O4x|>n0cjIS@V`803A8?X;Cpl=H zAvHl?JcL_kE4r3SI9q1Y?Kp~0iH6f{iyyuZd~`i{=2x)P)maUue1iM%8@<eSDT}mH z?9EB{g*z>+u#awU4{YgJzK8lwA8xu8;HRHK;hON1wEa(m+mLlV1x3btIZDydkbVYF zo`?>kJ{3zOD|`|^`vKn1i69uCI9bxMuAe(S!BNkG4)i5g>?<CLaH@o_B=RldTqz4C zQ-Hjyu2d-{sW*qh-gMzL23B`BwcJwnVt;s|GR%6*0seXo?qxqd){7u~e=`5#nc*>2 z^E9l^OVlVG`7DuOSrtLF7PF6+@)<gVcCDsr{%n5aoX83{)edBC39I|DmB8x1j+65= znB7(?onzJo_QY0eAm`XXYc7AMCpcVV&Wc{_gI!h>Q~3%}DW8Ewx#85uXHbB?EIBL7 zB|nlkk)_@Qjn4zMsMbhpuQkwWGkGEhiqqF5PR6U**p&^`X6TGA;-Al=?Bs@jOTT*- z+@b<J+d3+rNE9*$;b&$!AJBEjlZY~vv%Wk}JP0#52ejOUl5jTrUsN_xGoE6mQZA)1 zpDh*jYk$%`vnc}X%rg>~deXI|r>EYEYPEp08%|-J7|XhQ4MJQLl|dXQ{c=`&F*Jo~ zL8e8jt4gf18R(Ec!cO!71!|Ah_X#-iQuH-d;WLlOmYf&GLKl#c>uAg*)KKs6t;f@U z+e#Ix=~$(jQiQeE870OtGDSip-=!y0GzlxC2N+El_u6{adXQVRzta{bCX4e4<Uw&R zQClpsSEJ?n4sY`wRx~{~(H;8a>tva?q)uDKIe16#vWIT*-k)VB9ppXB$}IULU~xyN zDKeA4@sTQ{xqXW+s{!osGjlS!H3ui^cTN@&W?~<SesOqaWqyB(O5z>&NKsxIEb(qu z(t2Yacgzr@E(+buXfNWyQ67`QxsV)>s(NEo-lF~p-f<$R+vU)8QgI9FgFyL$dNh65 zGx&{_thQ(>mdTdL8M48yfTH-MlOD7<1L~W-OhCy=_0^mG(gz+RoG#x*(#jz!`xc<( z!@;}K(;b=rsn;HWRp;TBjHW-&&d(VI{`@a~00(@c0}9F_DCF<r8)(K}w3+g-lxp%F zo#_W935ew_82=9F{^}`r!Mf(l{m5*2fVw^p_mCleA!R8G=g$k_t56KwwgxwJIiAx0 z$eL-$nYIwT?IxV`CjOD&`cja0dY9K%GWc6?{tTsZ3Zt6bAw7~_(g&SkrF93z&CM%< z-svcx=LHDnLe2smej<S<+zy<-ot+ks-CZl(&Tm(s@4QBZ{R!QYi#1rC8?YU&(O%qs zH>eM9^7P+xnm<Gx_Si9;j8ukQdCli+&nPCLPD_K6`#%4bNcA{}{W2Q7)JyiuZ@#^Q zbKSPM#p>cDxrjz!9=udzba8165wy0AKA9S(o!$f{XN$fb7m$z1SCesbWoH`DO!KLk z6ea9!I?7qrMRYIMP~|;9jTc4j>$abP^6i3Sj^&hSjC=N>8BeC|c}|&&;LgX)EmW(q zW-Cs!hNL16=PViqV>5xu;<9;{zcB@L|AJ}Jc^#v-kEeFcgZm(gI;4R0fc(jYBn($E zGg0k+GG2k(1-K($l5Ad{^KFc|k@NAkDYC+g@e%cSwIIb~E@zm6g0n8z&mem)x|Toi zy!8X&zRON}Lfsk-zB7tiZwj~L2sn)yRGH6NQI~`l)FbIR?OUTe8zcV9>pq^%)U40} z@GrL{iN3fH>hO!yHM!|)(<v%!Tt?+Ox6eUtp<Jk$t^ZD&`O*-n8|%gY+aJx%xQfbU z4xLgz^w(**aoU62{z-*fl`OX2<O+Qgy<#{jln4~5bxAGzgFd%7$WIA+onCNK3A}Df zA*l;%{3CAlS1_0l<qh<7ZP0ynmW!f8KgM3l!d`j;f>sJ8$yioF9wEfk%SbTO<<tdP z?K>!xQ*!(4<jGVslcK`k3o`PA{U3!2;RPDsVmz<E{?k*&!_K$j3^|5IaS9***lx_{ z`ki%Fh<Rig`RtA8S1s<$k-Wx(mL_m^wWS)$X8%AFIh~A!Y|NE8OD1MT7`|52s<AxP zCuRojlSxz*PvL_y(@71sJJV71wf_efu@hDKLH2?`Y7y-``yxBNZWMm3+x83i#226{ z5BWQbsSTF$>u7r%eN`jYV`j8jL8`Ybd<Wq$POquP&RJ<ep(}t$&tmnaLdUWf&(M7o zVQ2XY#liTpkPEO2w5C7P5-PD9L;tZ?ePOU(!qMJG0sNTmEi-u%ZE?I_AZJQvUUf<O zpvSOYZ}Ga7XTNnrg){(+zYV{(<h?OKIkO7Y;QW54<tyyi&GdKYaFaZNbBo4rJ&fmG zPn<<h_Fn7@%l!~PMKwI}FS%W+p{-j+_U&IF@A2?I??A&RD-HS6mCADTd_zGAW9XIp zg3wO~sXNE)oqv^sBxc;@Cd#0y>T~$r2$F!_kg@O>eCInH(sNXL>*>vVlY`m}d_ON} z{(08W0ubDhV1uv8v^s)^W(6wz+0qOU{*)lm;nF_3;(yRnO=itD7K?+?*5=<O#Gm|3 z|HCQc2D3QKsr8HZCok{%L*DgeRwK&*UD?iBYH#K?Zy3F(WTTkgwMsun+SmxxB|}l^ z2lWC*X*!(C+)Xal$5t4({(J`2&IAJ39<9Jju+1XW1GB0ARJh#<;J>TctLLdC&%vwo z1~qBVdwkXzjnYI#>+up?bvGYf86Io}&$Yf?n<~8$4C`LlpMiYNX<+>;`KJ~uqYr;K z!Oj9d5rYT+9ZER^mZI{1XT&7Vi8XY<+hB3>QK1yYCm0I~y9i#kJr(V9G~<8sH>ShE zC(s*jByH>hXZ0y^$CjY~-pjv7QT=rye_}Gcd<|Ay9{xQGB&Q(h6a&C%U&7RvVa*(3 zWjunlDa%(lB|fHVUQFe&T~s*(Qc9n}Hol43NTn#j&GnEvW*Of{LD9#JIuLcMB-q>( zYj~HY@RctygQpw0Ujv+B|0((o@_Zh$R+F(#kD=(x&fT_K%*~TlnItk7HKa!=O6@!h zO~eke0hTM%P)oHWktQW7IhC7p7b~P5t8+7YiaKa?9p;zC(^;S7?(M>vm4xr`gZP@N z{3r-YFVOmKsPl^8^gM|oW+m#~;#6Eksj{{IzSIA+bRY0K*YE$p@B17xl)YEBjI6Az zL<w1uj3^{T36;IKY%+^%35ksCO;!qDL^hFGNt|=;^M8Ks-~VwQoOAAT-=Faw*K1tY z`~BJJY7)$!-{gdDxVl~RV<E2B^VSL#pox3im1LMaYp@Qhu^iTY^X!2gn8wq|P34*% zi38nvYB7<Ixo#Km4Qs;VS6QK&I_}An%Q8P3sr1gg;5PQ9>Yxtg)hE?dDQr|dcQINm zGXn?OZ52=k7<9rD)k@;Ts}i2!{vMQ@FTz_Nj~)KR^H>9gPdoQgyT*;wkDtjH{7qAD z<2k;pqU%0HJmg6mZ&TnsWK_F}ZgnZ?vk>hGr}?<Olqb5v6*%}!(eFnXSrwmt1!j(= z+0#e96VXnID$QjEJHw?h>K9UlOY+ah;l0T?USndupsTN`U5({rCB|H}S5rHc+WE1V z6?~7DGA`F;*5WYBX7VYiu-mI<M6N`eN8{>6&5R>a-|#u^UMa0O#2t<^M$cL;kTmK+ zH06f;51$;&X*nln`5=@Dj#R{8`pXzjv~$pUao|h)7kn*xy$Zcr^05EKNAFQ~tDJec zBlJ?!^L(fv_wo?tGR`QRz~^eiIV-J2w<XSz>D`0PG~#}IYi|AG`8*$ET7w|udj7#p zBfg5=foj9Ok9k3pasI*3w^#JFM3{WtD0|OdTX&p!urc+oasNKO){4qn#r67FHntl) z$rAY+`@GJf*yhPuUsLpp^wRHk_Nq>cZGtR$qH+9!{<U9R;$EZip3Kyd#Jkx4DX)GZ z%hb<2je$O2izJQIn(xuWm1HB%=+VyBNfwLW#v?hTdgYzC;&E}Zjb-d$QXwujE^l0W zYpFZSynhn6DXs(z?1Jsw()T-|QfD=3H|g|FB0xQHZISsOp>sZv{aR}l1^Tv#>XDe3 z`&Loch)EIi3;j|~p0^17($n)YjvJd}TwTt@gAns16dMkIH$u1b#^y=SyY6YUZc9ur zmTltAOri8Y5aaLD%*(BjuLuQtB>CCOjWSki6qVn9U#`EspU$W{_#LjaQ8&4t##$y@ zS=B17AE=;UEm<h$Yt^hJ!vCq*nqamzvlhRc`lqBS{!)eRCEhZof*pklaMKFI#BtH_ zbX2`WM)lpj<*VO<AgyG$mw7^4TX}>|swGlm{1NZj#o6y7rni?FDd0X!+0{K==nvZe zrsp4IcKlyNja%mC16jM9_TAfOl;wxy#pt((w9_~8g0mv~)oUcETm8z{V!!<tiHP*i zh##Yjn4O}})x^i@9xA%V)SQRYj(E-g6R5IbGWe^hz)e)kQsZ})Ol8>fZ&q1(Fg0<u zzkKUBnar+L_{UrJ4F8s5&YAE~9Lbz;R4@OBn?As2ORDr9VP!-No-^Ctj4|fIe534H zy6pol^EK|*d=(-dT_pG4Ut6ukMK>7{#pU@*i-Tq4d}Bnw_{17q;!f%X%27gXqCb6N z)yxyEa?_QKqp`j<UYnY0kDRBmSy5JtJmEy<q6{1P*VT&7?Z);kQ8yD+@=vHlw6<Wp zDx=vkVRa`T>+KksnxV99IkmkV`6pj;ZFlhPe^C`V%es<8JY%KW-!ayY&Qs4=Cib|I z(L5%t%K0zll_UI}I3Dd;9{MbIx5kQ=z3%FFdk+Wfx(_~lT7J9|o?8!7zGJuKE7Vhr z40ve_J64Xoa_n<fJpXLH)IJqSvGSn3DXVVKrU$<|9zITx6|QPs(^2`woW|ZZeKuX| zrb<kpn+w~+suo62gp#T#bFoq%Zb?k(eZPo$C!x<N@qHt$AK-H8#7mLYSnguadfaWL zQ41@LUa>PqmW0EU#zYlV|Ela?MX~IoQjUq_-^YKTg5U&IQ=7WUZ+-rCKIzwS*X?Eg zy~>oeV#4FNO7eJhJX!v5{9jmaW7(ix;?GNX?kv?K=ha2zbagosFB=)ZVz|pyOAN6C zWL?h^&P%sFZwKhw7;I7w<wU;A8)~O28%amtMSraK1sv&X?++MGbG&Ax$TtKlKBc~L zJa;aS9NFAZdU!uxWUcG@^J&cFHZr;ktZ~hh<SLhTH3rzvN}_8prYS`EE4<wdEfc<^ z2Y==6wN{-{8rvVKVr)G;zZ%NM-TH*@KMXQ_V*D)jiT8b?JRiQP96~GTP}csMDg3*t zPNAY`@ddt8&0JrC#SG%|f8yU{PUIzA^Bc(atK7^!*LNqTa%>}OiBqV)9%awy46!$H z<DbR<+Vo9tZqci>b%B@&7hy46$`+n&uGFV<w#wt@hs=k0D9!lX=lSsI#Q$@iqI!(4 zbrian@kIH)qW=V0nApTyV!|WUPn|e^P0W|q)IN;&bAFlXxJY`H0!ziz+L+`!o}sl$ z4P7r4OHIu4b4EoI&mn$3K1uvNj(A70z5%b~x?0?i<($99JYwyKc}gXHDyva`v>yJL z6{Bfn4eCC5S!L`*>*+5(NqCa@B)$AWch!2`9mAfns-*r_U477=SLeC^7vhfcYVz`C zF2)_>97p{8kMGCgcJOMxqu;j19rx}H9Km~W+34ku;-_%_eziWairCXj4pJ>xWU^M- zrpl>>tl@3y<OY56CB=Kq*Gc>R6%d)*!}b-b5l+jWq?0AN&!x$2M0AL$Pgy?8&p4tg zWr#lSE&8VjpA_4x<7!`tVUsAIucL9SAy2n~zBy#SiDZ2D-Z2N%zhpL}N7<EP4z^hV zw=9?Bzu2wT2|rW=y_~OB(`=8!M=#+yYvt_Tl)agvlAxTv&K&aycKvE(wZ%C~LjFlG z;bpNeBxkS@!>+E1un_O7EN)iK@9h(-@=q3tir28-$8uoR>4pnxVRHme)x@56SRZoN z*9B{W?qIHaMU-XqSPN&U8_sOxp2lfB@f8jgvCr}M+?OGC?Mj)r-puQwM&Wndt*6XM z;E(1?xF4S(;Sp|kQ)R+Ib%yCZ+2I9Mna{w3wz9~Xjl{nw%J_tGW@}q>wi*4=j#drR ztsyJpH)4^?c^MZW$7znsF}k?{JzfU4eO`2la6vZF>IY?;Mq6=woN5{#*G>LlttXNt zx5ME;qv$kW?~JU#AZvF2iSr~=+Ur4F5f0#B40HiUcuRbWgltxPr?W~VqX<{YIn(=k z-p`Lb#pE4#)C*_YqB7zY<7S==@Gq*Hda5|_oNeu12Xg(ugKWhKTP6;i)_!^AX2)P` zqvYJWsHAOah7Z77GGQ)xWScvR-3vwY;rQH9HBmKVTZ#2C_JAuc*Wb*##pie#1L=!T z)q8);W#7b6KEY}KNqpKFn}b4mP9;HddZYk1udaUs<c!Cv8@sJ0ytK;5ez2;UTE#tb zKijOJKIW$bR!84e=bSxRNtG=ttWxQe^b3gABI)huvlN?C+i8+qQ6Zi-_E%RJ<U<?B z<nRRJ`tpjYMY=|w5weBfx{!{UsS2yDY}G<J$i-F{w5L*5LeU4-CKkth8+&aSTrDln zlpcF|mVzl@-THCrY%a##!Wex@{^^?4qLb{xG)XinOQF_|#H(WdNOZ3)Lgf*022mp8 zwEkk;ZWk8wojAYV|6|4YF~(1Iu|J7j#Mjf>9eH4}Mp~?jl{q+R31jAU{#^l;v&U$h zopCc|4W@cp(sH%<UE=z2_!fy9!7AAUp8Z`=cA*z<rWsVb6aTcV;9QLPP(psr%+H+h za(1*`BxWRaH{Z%xuA?G1%AStHSY|?)jP^q7Xy(O2(O+EK)7;HpsHsCZ(HjW^;Aj)- zs-67!Nwso+CuENlboE{B(byV8-C|Y3!^BUZO)5-qpQuwE@9)KdILdKvZB;}+qv0cC z;6Gzwjf%64vD4Ir6thp%-zt`8iWS*oZie$=6Mu+MkHwu$;doVRCGG$GImUWS&Y-)h zlr%{ybLE?=W!!8XPz5^?rstGwR;h3Y51vi+Hlld*TSK|S+JTO;6VG|FQ5t))j^Xq+ z<n%reElx(A!JT47Pto$63YZkoD32)l4o7=F|L?r~<bU?bNUr95xV>+Ns`o2vFP_(8 zGl+vHt=D{u<2{wWyDEYfwr}oq$n&49S|73Hd3(Jcuq(qT9@+;96=Y_gmZQyS#^&X5 zR-i50@Z|=oYhJAPgXhHl#7W+aWB%ypA$+&4W_DE^=4Ca|6|6Igk5A<oc~qy|*Sj}V z5p0nW`cnPkSl;Zw_?2|YQrxDm{L>ezp65h=ZX!GNG52PGJXKI3{i$`<V^qo<we##c z`0_xEOQ9wqM%>7u+U1t&gP+8|&5pH&KDw`BYkTyk9CoP9>z!9rU0sO3Xy4_#@&jSq z_$3*NfikMeR6b2M(tpC(YeV1(xOgTyGA#~V&@B5LBi>3|w&m9L;$kf2q|Fe8O7Yfi zW7B)7^bRTl<JINPGPkbdyz%tae|7=w3-Ll+hrbeAnwev<(xl=0p=wa9quRpTDnIg? z^KHbXAGsMr#HjDByFQ7HEceuk?nYH-yVSOhsjRl~Y&Z!-EXCmu_JjY;NH`OY730#x z{9|N<xn(&WX$-ykW6W6<7B7ir1C6AHa*hk_0o&YjTkpvvT~UiLz%G>4jf7f0b<CA4 zgKxEDBa((6V9G1-{I;;QkC;+D^coIU&wV$ijJ~n1f3ghLaCdXu^8y~)du*|&GswTe z>hl{?1`T;BMdbjlQw|s9(R)L~x_I$A?69ucm(mk3_S?6qt?`jn<Zo%jT;QmWkKZ9n z_!AtP8~-LpC9i)4_{6E=f5$NHVze7Yj&ZokAe8_O?Aw*w&ZrkWH7m}J8@HaU^{kFR zo@9wDYHiYa+@`8MN(zfT^DyFb_{{0JTGlAeH=<S;0R`1*4KmJmV`k|g>iayp|Jl{A zI6nR&R`w}>Y&sP_nveDs)%G@2e?|rPF6wrL3|Aiak=f@`M2>Nj2dcc;t`=t_zPHca z{Ym{-5J#u-l+Re7R>k_0!_;CmnraYMyaVegDuXnI2K`ih<r6umR(h@v#xfZPxv6U8 zx0n-h<ySG7nR>OqD9{rhxro<fia8+5+k;+j@2g<=M^W(>^%@C19sV<PMdmOeln3u! zFGF?OE*b9{Mf>EdpQw25DyB6R(LR^GTrZnETAXOj#c$<%X^|sqY!2)2x2fi`+qkRP zj+ZxaO^e`De_X7&uMc9rhNv&&(jUO9X)#|~!Lrim{lqvPs?uVf+NLrw4UDlYF&D(C zg}8Dr%<Q32@*e--HE2~uT~GVOw!YfXiZ9WP84{10IWHvs%QecDc-nZmr+)Ul)+^7y zNk&gqwcqkkJ<`nA>#CEMh~6vo(zkT-T<v>FPkn=L-8AZUnsa~p_aAOP6oPE^x!x3N zpv!W25=l~7{)sryC)T};w{|3D<gCi6r>r6AD~c@^%id8-k(ZY|!SC%7-ov-v_5CyM z{Bd<G1FUn~Cogr`UhSKB^@XXXN_@d}@bXf$+Aa@It)FOe%@rNt8)V~DjHgBCi6W~x zE@$n^@g7aukCJ(wn>C8dwU(|a6E4Qz>Olv+sQS7-HS@BbZY*aL<Z#}?LqE{B4ZT_i z*Zt5a%1_;V3KO>DM2plxq%lrXVm`0xt1qaVRYuSrHBM)(MoPoM3r1E-s8CnWml74~ zVIUohfVb5Wv@tRU`u`*GqLeW)2p^gb^BSuMeqX(KW9+F+?7tM#CF5hE<L)#LI^kXK z+RMGDK5r*p)u6|(!={EYE!1{hmR~B&Px=dk-!E2e#@jx1Uv+qINy9&guVY1<arjF* z5%mba<0p}`nyRFRzCJV?bI8Ipk(qp1o3`ehy<qILRDYaZW$%+n4wZvR6VLOX#;ZJf zs1H8p!<FZ-cb7SNiH3dFZqiRM;bdIfBRsI63b?obmy1KasqMGq?p7!KpfX_s#d1@H z&CP`5YTr7_<4whsX7FXt%O!7w5?ie+`$rAR6q<Leh(Fyp8s$9IR5?|(>Y$f@ImL&v zkv9I;+u7^bRriC)UYVseRQB(YlpO!2Vq$T=;aVJIy0JMG!~K)1^b?=Ag?paJQTW_l zmJ&J7aFbGVmu^Llic;;ws%F^Q2l(3<sNK>vu5x{8wL;^>b`b0fN4Y6$Kbk}KwzWSO z>;=+Nz2sQ`f321wIix77htkruwYebe?0%3$&iE80*bWJb$rM(kvTmt<Tgc(aYu?Vo zJX`u{k6HFo=nZx7clef<RVoz1BC0}%-rh5p9y=GRY9udK=e7c)Iud?SOz5QMXAxdC z(Oyee#i9KipY1AwKKIoJQ)(*bcvEfGmp(T~uH%7v<<)e5B`bO}$@o1LS}Ov#l<6BN zqfuL(=y}olf_91HH>}}3_QhVl*FO9B6Tfm;_h_+#=J`XdcY_Q4x4&(}au(=^_r&i( z@^QT(Qd;BUDH^Dj*?WmrUyRM<maFVxM6@^K*U_*I)y*u&btkI^?`=KL2z%VF_P%8p z=5v%*QAk$ZI_H1zk>mKuHTAjq@r&RYst+-z8luMlN-fR`u;1e|Vo`PRq22N4pim1e zBvbU0&tq1BkDm#rd5cH?rt{aqx;EQKbw8ZCXrIfG`uk&FU5vw|R=uot=e?+;jjCe) zcHawR7w37`Hf{44hc}PB=y_2!0~fx!7`oSQXYl0M#IxewH$MG^&$Qv@46}x4qS5>+ zk7uy<OT@hsIeD>W*<d-6U#a#-oU7y<z)^U>5}ary<#8-jJKV%*sVOe4FtW1J%W>iQ zF}r1quZTH!V=CbvtwfLfo(WRUUK<U>ogzH9(;~=8Sn+Z+vy|SmrxsAiW#y%>$*_&Y zz?xxM`7qQi&VRvv5}Q;dd}efSP+KsW<I-1DzsS!|$(KD&A=LN&iLPrC*Y8d!e>8tk z#ql~A_aDk4)D=%_skjJg;WLN-r-o$;PSYK?sjvF7w)&qv@Z?9cC)m5Rq51iWYOGXH z|GaS)W1Z`QC|+zci-%KCU9{LD|2H<8x|x&XeSPSay}X+x+Hkji*yOj>;>5IQ)~_{& zU4du&zVZ5c<S!Mw3A9&JV=q75@+<a`H1Zp_=#1*8g;;igMT3pP_r$2T@r$pGqmQuZ ziWKr;W8x3k^QG~Tm1EbChMU1#3K{jejs2Ed=K_AZ2?xC;ub5u_N*eJs6<0S8_Sz6j z`<Jtw$X!lt7Du?V+j$KW#iL2QsQFyoq4wn%#B+Y29x8>tcvWkyfL!N7fAUl7W3e-E z$8+I&^haCV^^cfLD(Od4O)Jz;AK>%V<l`qza>+hy2kiY+Bgq{a>KJW(*?uv}Is9kT zQr%ToaD-ObE;H~Ot#ne&_(Iv}>z-TJ)l)mB@r5t*YQ|YbJDunIm6hv(vKfluc86BW zoNFJ&zTNYae)Xi^?CK)&Mb%V2d4#6a`b%_stn=J;wwtbC1Lo6;@0d|$;c?7feE3!R z>KsR=or)GufDiA+^Bd3r&(Y9-V-t(~J1?X0rI9yLwsn=S%{a$>ZhB!m4+QJz-ZT2X zrA`;n2U~HxB{b?}uYRWD<3s;m;Pl5CufM^#bzI@jaIG*Oe+8y<9fph$%ac;pcQA{e zje?-^Kj0gSM4i#<Li>mcZM^agw%JQ`sKpgLs7j!Zo#S5j>TXpBvy7Qfsj*+|^Dx(E zf*reNVm4_bC*+^PoTC)RUvuNNFTMYk5jztiWfo62h^Q%WtZLk>GOGP=TFX-u`uw3X z=qY~XpQ^+js_6a86ZW3-myDQl3H)uWjPC*nHp|S}1jA|=S1BMuVRu_cgcz(nrcw|u zo1F_N?c)^uG`KW@i*u2eksy<^-s{U`AF`_{x@BZ#4gVE-m&+Pds`S8#w#m$;rLZ4b zNj_H<`9|F18-8syD!GN-sAln$|2A^w89O<xP_2~YHQ8fN4~(s>8ZNo@_@}Kdc^Lah z#<>}u)7)1r8vYQKwTQ#}Lrf!H(GADXtrBJdM>&5uxmfgcc%@jfExJxJv$ckQbM&4y zht`Wmr{LeevOyQ+n=-4qNMo0g3+m}#b*Fj!9@YjyRYp<yqf6M|YoTf~&^LVQJM*%T zEafm*-PCTf4YlRZqVaHbuZ^rE*(p~z66)MglW+t|EK{Lb$P-J`SxJ&p<=p=09vag) zD>LJ!@!dMnM05E6GkLOSIJn`cYD&XXnN3SA@%h=b@3Wk@8jhOV3N_Ds<B@y;qXruz zjf}76(I>*ishXHZc~?}SlgplrN#oBtVxp&VZm`3{7PbBlRGZ)D_?_e3l;H7Xu`69= z)l%!#U0s83m*U?NlP-y5=M%C))q&#QzUT<ciSfJ-g{H!g8_|5{Ry9#IRn*nees`mh z{CRQsv6j7qFQ0=q2Swr-t(J%PcMaRm8O`OtM3t7}z<y$$^}`)k`o2*P>nb$5&&hd- zDyqpl8!CrAS8tA#uL<&+3;Y&jH}|Ow-mI$O8QS?zdMb5HuwtXQD!>p9`zDng31`Gt z)7lT?WxwT9g;h(<U30v)Fx@<Y)7S*d?dFy4F#|EEx-tqAsGx5A;u^+OXP?cjV(+1< zs@txjwY9trq1#rz_hbnAm^z-ocj-t|9+V&K6)E8Biurqjqf%8p+w-FQ?;MS=Rca@> zD3{c&J+Zp*DQ?Uw=6-Jq<um^_nANAmik}m%Y42>2i{^TmqxYBJ_i<9cSMAh_l1Zi} zV7JlGi>p#H{(&ByY1DMH!mLDGS&I3Dx`oyD*?eTjx=HFSf261HQPC;X-oHadud{x& zh#j9s=;Pq(f-3dhYVqn~zTa^>euj{B>@HVDJXi}wck98q#`g?!Ws2`_;SmwsW16p( z7+5+{Zi8|D2ljPTUV9|}Xr)~RZzZe|(UQW$s*!iSZ!D*-n0WJsBOOw&^0`Pl9J*(> z-u+`rXoWd@Ums>ssZyWbcurr`*ITWl)hdmn{I;PUjtghfH_2lTMn}Qhl-C9oF5~6? z>tY9k@q<yA=Ll<`-=wOh<Dox>?@_L8x%0tF&`dEea9-Y_&);x{0jj2+p`1?RIltnw zrMYa+(@QC1A5d1=xOeYbt6J78d7|s->&ZY=_SbXvuFb6~_o%$mx0LdAwcuThprMXC z&8P|1!lZRC<++MU>7|wGaMl~I8!+=(H1rqrT_d$yla1-2>I9z?r<$r-EhcAhOf0>^ zD?ZI1Unv_higz_m^c~L~_(bLEW&XnhOyIGs{}g?*hO6Egwr|1_R`Z9O&{-?xvqw@N z?Qox0{ry$zA;v<4`!Z7HsPE2{dYZ&+>Nqmewx7!D_A{dssP^0{6{=vEN7Od_Mgu3} zoM}~*ro%(pI!bq%t#mYlJq1_$8FJp^QrB1KJjFE!wHUc*!Dp!2RPt&c<CJf>$2V0y z&2{I?)S?W61Yc6Q<MhmCy*Sa|XX78!DVwe`GeaqkyfkwIM=2?GALnG1bgTy=LI$f| zQp)o`RJq$i#=o&%FHbqIQ2+Q>IFV8<s>O@wi)JFgKu*SI`lGv?!ZfbO$EwmMQPN|r zOYF(<=;XClzE_LxU6EHzXz25KjEiTv_pild!)0rE=P<{69WQ!Ebohbdna9tWEr%Se z1Y2gOi!AWx7?ym3&r;m@NgjLKlQPayNEe{eVEKyoMVkT`^(8wr{Dq$!PzCe3tY;r1 zx4$vlo~zPUyVO&ekvF=UA+P-tpQvLvY0b*B?lNn5GcIyKjcyVx($koD4G$?UuYVt! ztx*#*4E{8etNtfaSpTh*>Fq>gE~hez*dr?qZS<V~(@?RE{j2QN&MFb_QyW__hFBb? zHZI;rKfmUy1Lio3N^5SUyvA+Gf+ak!IwC=B(-a6d&+K2K+A_Op$K+}k;#5W^k%3x_ zr3}MdhT*dt@t#gHh)wM|+KUtY1KzugcmD_7^|uuuFZld+N1KRWZ>MxpM$b`SHoF)N z+)%7|&4_!&7%k(OQq9#$WRjh$4u7ih5t4BY3K+|;`<~Zl0xjM{3%n{u%`!5-a1X=H zj}x$bw>z1L`90($?NO<7U7P)5<o<)_+_tkpVVECl4eedepK400mN3tfsl9BejSIl2 zzzHo!EjLq7^0xoG(<ZyE?O3X+?^-B}arskp<iCvPwAOQlxIdZA<`?wgO&a*N?9Sib zu^nexD-*N|mu!Mj_K7;QbsfDd{QLm-3^4VHijwjwWQ$_z8DZ)(n94m*tH|M+;?x&z z<e2SKb#)xi@1t*eQc%r!3}yNM&r*t`_5CvKx>$ZBpI*-txlMI$!7Ml8lAmFl-Ko-= zGP`ecZ7W!5^uSIY8SM>qnt!|BGkWghE6c5Ly`#o@p4x@B@`oEax&wT#gi!=F2`{U) z%x9%h9`5c5J0skeL42YL_(@#6RZ1_)1-%hp-kPGBKL1txn)n--ivpDRnjE=}38h@s zF3dP52K#ZeYBs27_?9j!?V1~5vAeL2G%9Ml8mH}|8I3CmY4GY3KE1%`+6oufL&o(+ z)(SbHy|nx#<M2U3cIvmTQC^p4G=z&6F}99!4~mP4U-BQCX}6O4xhU`Bv7f3^O);u3 z6R^U}^0X5%;EOoRKNRU^F?JHIu#<A$Aihpg*)to1IS&t)7)#rzhg5niFOPksI?B&v z_|~fde^w-aMx+XhTy4d_7sRrH{J|=!K4;4Mlv3f)iF4Lo+|O$j(?*{<YyDtD{!Brm zAh*$Y#T8wlH2!v`U_aQWXur#1`$;_Xnzcpwyi!;_WP0Otmdc7n#?xRGbbI9FPx=42 zF*;91eHop<5>M|AKSqetBdn8Z;WM96&Do<>*vYMu$>+{L;#M8eI!ky~{Z)odGK<#w zeK~YFMy*eE?(4?hTnN%%du$PThKmpl;KwlIFo+cG%+DHTWf?AC2QlS&^EcjZstwH0 zJp7w|zP59Fk|jP8cXsl;4spb8@%zq+C|gB=r>z{j7|9cz?_H?ZZjRhb_F;zkS&TwU zA)}K_ezcuA^R5}xm6m<le0!kXlhAw(tQlJrbz#?XQE!J6u(!sPK`yI#gZ~Rd=+AJz z60&i*MD`AHH-%z$LFdb|Gbdzaw!-NZFlhud+APDrnZN%5<~Lc+e}?LYUog>me6F>8 z`GjzGSo0j*`GAkQ5efvZ|6Tl`omHvz?9s7;PQEAWxXW&BXK0tCNzU3e@=JN@iL`58 z`(FIc*MEq223J`KR&;QU*)Wv|r}diSKd^@6DaaJ8hWj)8FK4(t7p|tfQg3Ufug9du zMY78fmGIQz_hJ{x2^@;<$ueK1#5t?gra9LV+3=yRr+|#-ZL3}S@O0Z^#3}9mGg#Dm z2bX$2d;#}fg_#{N8i#YZ1I4@CUPWUuw%}O?tFe%KFzKNR;FL68ZA!b2)|tis{!ZI1 zgXe2-^OZQ)W~*qIJ9f2j1+(CeOiAAGm;A;4Mqe8$>Mz=0gP7e`O<8yGt2Xv=lSh** zF}doQSo|a<HWFv{K9D<jL#(gC^-m{D+zd*!Fq3=mk%rRXtIh01(Q!K7t95wG?bP!% z!drs<lrxHp$GJGCjkgm<+j7zITQTxmQRb-p-VtN)v2k}Jk|z3`wfE#Qx;u6UV{aKv zyh(2G7dkK=^D1V<H8RgPMC+Jh;Br`uzaM%OO6TWNzW$X@OC7Bc3973LaUm+f^=eux z){3M|6!Af=yGz!4ikZ369NmrEeeA1;nv@B2=Zk)7EdrzwpHA8lu`(2RB>!kp8Vsn$ zqwPj7^^?Ebz}Fq=-x0mG$DF?%N{(@Tic<&t>219-owu`HZN<Cd%y8Gy689Ps%|nFL z*JTSwLdn8O!e7IlDbQ@LtX92f?QJ?yB?A=9A{PA#eePKGQc-lg={lZ3&FnHi6(M9J zl^hjh8CUWIK5>i*R*DbBTt9a|V^uo5C^nYkR8?`bQ=;gyr~|VG8~qScSAg8NqjUc* z-Eofpd4M-J$xoN5sjJ-I<>L1r)>}M-t6t-k<}oUsGg4lH_|;Weg;YX3%O$Id1st$y z^^hLk6Ro*=)z18R<tcB$i*?k<EXY>{(%rY)b_p6fNy0jr>TN3W7W#jMjP!Q3E&Kfa zkV?Ip+~6v*2#aa544BPj*i)ZF|1FJliEI0Bq@;a)+K7UK@#n#ES4ZgGCyBY`KK_j| z^jItM)9Jfs?Fjobz8+MwHZk%GYtejIMOIE_D=ibOmQCTcy|CoI+R+o@{X)n5MXR6m z$|a-k0+boS(>nxvCiC@LVo0@|y*1<?W53xP=0yR_{uNG6c3$r;>nIla+N?!;^M!jw z2JnS@@QUVf*;i@f&hi?KImBHeufWMy@VEr^MK#ofl(DkxBUzXF-Zk1!+s&Mj+@+oR zBQ<vMtDefB-|As#)nz_DQ`0mNu5NReGdTl8<n9jm8b~QrG*dg7iLblfB6=x_>W<4C zsK3p(W3KN<p6Z7j*CwjtrpVBAh52b+*<9B-N?XtJ*Liw$pMFis&&q@$KIJGyoM(WU zUL7)Q()P1?F+VuxIsXsUCu_9h4D-LCaq+BA{KCDsXs&PKlsChCOL1>=$R!2!-4j%n zyef-5OfKndj(s{S=ij5X>#D3@;;(%u+LL^c>j}ZT?<VBKc9ZjZUvQMx9N!jn^E55{ ztvd?5wFF8xDUFmN@nR&S5uQ|LE8?}>daZ`ON#VLa^)(Wrm8P{iU>E_yb{Dsv_ntX0 zH&ENl{q%#rKPv*1HDc16m!)M<T8kcmXMaHsa+Ro4&K%A}KR%+Ro0#Em%EonoRgKK~ zR$_V(nV%Ec3x;F7H(U5C@!~9{w!thN06WK;^9`VCN{r)oWB5moabLaLL=O&;rD-TW z_mMdtYrWD@dyeH4moke)g}8y=U>pOZjAM_hxheW&#dE5_gy|3~z3lNnRDDk9*j!$@ zD|a@i0elzsd_+t2q0D;FU^8W%m&%%tgvw31FkLAByi{3n`1dU3A5=pO;K_VKM@^%- ze~{BYMO%ebc%G!&AFA*y@0m|)WTO7(Z%ggc@dG6O&hcM!=J({>-<2ziRS6%<J-A{2 z;j{KE9Ho9{ax|;(Hb&M@>(#>3($HIFF#24gXj?7#vRrLHs}+V(Yj1e>2j15~jP399 zpVDrvMENS>YAcHNE1a&Oe8poi{Tpq36#E*Yg<6~E`9$;-*!?X%Ivc8-F~heTyHhyO zJO6*L_u$e8mBsh*8w&;T{WRk7Je;x%B%Wwh$GT8jn)s2PUm~lw4;JUPOIsxL6b^aS zeuC?0jH{U6a-KmO3~46Ro?;)ZPor@?mGRSvHy4s=$%p%$qagw|Spw?BST%iHZG2f# zKSnQyX^jj<MG)Ofi(_w5Cr#Z+eewNk{oaB<`lg=;V3RFrneq5#HE}+h&s5>;6*FG* zVyOSa5^u=GOc1};i~f5>iFYx{*$_7H9@-mib49#aV#wD<*-$?PoO2rn{+n1>4kPZ2 zg|x(tXKT~-YULie`*m>EQ{cjX7<sp}%Hz<PXf5hd`szEG&aT?MFRfNw8<HJ7$6{6% z{Oy?AwEP}t?k9F^R&y{!9H|74hKVY5@r>bKU*+dFT+5fD**5&*3!M1>R?=>84-<UN zH$%6WFZ)$13^ZG^%klR2sa!bAUViBa(Y3i4+gK#c6<J4l9pmtw;|q?Wk2`oK@;eFr z<qg}5I;GTgkCvSrOE13*t8RPeY5B`Wa?v$qnLd`8+6xDN#)Wd?KZRjnEmi3STz6eR zy(0D(js73Om9B}g_eJe~)Kh-hfluU=%KEvc{P{mLQY<yqU9_zbxt5S#?%;E{c~V3^ zC)US{?YU$Dwz$LYSky?PBelFzoN=<>$V~&!<FK|1T6DLbS_hMU&^F`o`|3E^J0gBk z^{oMd2m6QY;T4SZ)qxB6kv#fBna_4=(3{Ix3{&Sf(Q7SSU%luR&cM*N`b2Md^`+1L z=xZH5FrP9Au5z2JUW&ENwI1VpD0~>gopPo_+U1Tr&w>x^i)y_j5HT~Zn1wSNR2j7A z(FQtsteG~Sx@iYHyF-ww+OH90N+Ca(QOh>bvI$(Tf_{2Q4A1H>_r&x2t}I@B-=K~5 zy0RdD5_~2>_4j>$FYK$lGsW^Hp7I3Vb7KCJNXWiYGhKObm-GEwA35)SX26S2<hiG) z)DNmPtJ0~}I5H(LmK5>^f7%`7Dag_l9!FqJK7Z}tw-zubyVv_^#c4d%wvN0FuAQLt zzw*-|7`*|5x`R7E=F$GDWe&L3`+9eo%<{LY4ptZ!%OLLz%6O1G#W4BINscpBJ^MWM zp(Fh~K{olKtKXxAA7kSgwc(RU0rPbVq#qttV@r(u-DYx7uk(m5JLzk$S$<nAn}G>j zGFr~l%<IkKJx0h*b9%0}U*=O={C<L-{28m<3vZH&8CmSVf7hrAz8A$BD|1_#;7$ds z-uoER3=zTB$n?$;%_dX3ySakLtP7b2bt-aP{>7?)l!v+}23!{b|0lC~S7exhiSERU z&)IqG1ms)fw~hV<>k@Y0&L8q)&imYbNBdgbIKi!nrBza6?D>7a9V&=He?q4Rer*qa z-2n9$%b;7LYM7n$&DC%QI9Ct8tWeYbExl%0JcT#{a=b<@ZnwkPEZ9+rAJmY;*^Xmb zQf?z%c!QW3tYBM6X$4HMf~vb9&-OOPT;KQpc>V-+c@tsuJioQVvCp~cEw255d;8rQ zndIR!t~mpzA<+uDUH*24tA5G*>-hTI@jHma>BRFwV*XB*9zo{vA1Jg{Jl-SzpV5;S z)S2wpQ{m_?LL2N)`@Cq|SKF7SGd4PF1{|WY%J#Z+;#So^3u(On!kKC4|LEYGG-_`3 zjHm23`Hz-)!jIh&&Ia*|*fZyAYI>^{+h@(`Ta@Nl$EeNuJ+E!H$O$f>9D{ned>r$8 z_(EErs>#7^M&%AyYcc{en5v%gDNg(^DqrWxP>;YHy5k0~#B`J+$Rj%w?;66^7u?ea zZ(2V(Usc{<TBoiRCGTtZ;xth`PYKGwFK(&*o8m_A`b*H8WA#jPp20bHa+&gP&zoK2 zx9hS?-^w8bdz4*v*Bjl}LHF{LTEC6d{~-CPlK8+dOrW_udMJFr$SJRHlZNjZkDDP= zSPzZT3;p$NcP>#)SUJp?Zl#ZFLDaYP@=#b^L@)hk{C@yZo5219b}X74bt9YmTXCOw zhhpex2JAE<+87`0`IJ52;W}v8Q;kgl`L*IuI_R}v^;~|6>t{;sKEEnCbYBX^dcfV) zSbHU0Go=WbL<Py?NQ{i|1B|;cM!U?czbx9V7Z-Yo7)!;GzhKHWQ6+<T*$Fo+7gau8 z#MH0M`2$?4yK+U-;KD95{{i$~ZH`YB3BI=TP7CNB<N>d^j%}jva8cxt>r3wX=7|Xh zqx$loBb>%Wa@#%YQDQf(^#;Vw;EqO`pLZeuIwSt3{NO8kr<a*E*?ORUvOROmur0>W zXq;@Z5g25W*5GN)G2w4{5~uXtFa9#cyC?Z+i_F7AK1Ctp;|pWrHLP{NdGi-$@t1Qv z3Dq)_-{FOf<EriA@%|@Xe2xc|l<`~V9%^D2wawCvVqwVl1XsM?ogAjdx_d__ynd0k z3D#+^7Bz>%ok=+KV1FO4RW_M-TXBmy{>>KyxB5h5Y-0kIH-L{_frs56MpcbE;H9Bj z3hr*|#2tK$&CwNHZ>xX{Fd{Z`Q{BkDghEu!Jr#}LU=9^!<^D^krWSI6+U_3{o_Hlw z<dllI3-%%SkCLrS^9_cg)#1%6&}k#&*aJlZPriq7uurYPF|Ykag?|ns=2Ct^=4Y<e z%H6!4$V>ghPoKfG&a}@gxDnLX1=^~FSEf4V90+woh2<SzDWghj2QAe-VV;_-`f}Fa z^Kkd7w(aiK6W)=WvpdPx9@TxFeY%~`BqWr9lRd3sxMoD2i@XGhR=BGAQSMj=Lf7OE zU58d1aiinL>U?9ir`$xaj%}x0{8G4i*HhmgVG;|d$r}kV(6+fs@difw3_PPT4Z4Fq zYoX7c$6^X|qayMEZ&EoM^=og)@|QiF4#S^wp_h0#S3}K>oF?*C)9Hd>M}wCrgRFMt zc`Ce+3o;A$|3PeT#Xsw6juz*Gj58;bnzdy^tF0L=3GZq_v}&QF=HorAd$)P?8%7zd zGFoFyB#6`H#f>T$YjRAzf~fJnJVdbi@Gmnia2tL$hZ2mLN!;o^xLHFuI@H{{A;O<_ zv>o<i>}oEahqeF1)mq^{ADWF*jk^h$?+=`W!8CedeEcoiv<?n?o<^Rf)o#cn<VxI0 zm$x(?mf~JpweMkLp`>wj%ZTe_Bo4%1Ud19;s}d-L(QVRG!P=7de6F27%uml2k{NG@ z`<;&Db)L7yoKl!|DY|!?t6t@ve>7vpLZcLBdm(rH7)MAdCN2{FYKeEd#kiRw-!Rzx zA_e<9-E%JVs+oOV9l#c-oKBRVAd1g3zZ=kRMfJ)INIRaw%OomS^3{x*s{?;3IzmmF zt&F_!K@t3oa6V30ZD^Dpo-gKFjur1~^H)Do%im76xHE-1RTglHdg?vUX98^*AFZ&? zuG0E8=e4vP@?{lB#qEtb);@-tRLo_y!}*KUXD3hG9V?4iMJBr-Rol>NxK|x<xV0s5 z;R<rbUEt)WR<aI{$)S$v3;X6Diz&l5-mV&^s% )w=!E^EUIOff9DdU9D>7n3c9Q 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ʯ$w+UL@ZX45bBfd})HkJL+N|?HPxWBs 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 I?X!N^-ee)GWB>pF literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/asr.flac b/WavLLM/wavllm/test_data/audio/asr.flac new file mode 100644 index 0000000000000000000000000000000000000000..3365912ae29f65308e87f0fca53fc1db39fa5e7a GIT binary patch literal 183318 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 }ih5;;qGGrhkbxGedFQbM*PskWhU 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Ð-iObmA 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 En1v{wGXMYp literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/emo.wav b/WavLLM/wavllm/test_data/audio/emo.wav new file mode 100644 index 0000000000000000000000000000000000000000..f4449dacb9fcad0268b7bf4c2ae8a5fcec18d019 GIT binary patch literal 71082 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≀i=80dxuGW&HYRO$?7 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 lpx&@1N0m?%uUy$XjbH9ypiE6+BFhUDTl# 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 On5I1M2FZ<D-Tw=(SD_RD literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/sqa.wav b/WavLLM/wavllm/test_data/audio/sqa.wav new file mode 100644 index 0000000000000000000000000000000000000000..dd44234286e2ba3f02691c2d3a5e88a9ca2e6702 GIT binary patch literal 1519738 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%0A@eU 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�!)R5phjWreeTR6AJ7u}Oi^>^g3_P+mMHu?f`@ zTFPblVbpv34<kz*s*F<)sX5dK>aSXgvB4?jPvQH>jY2zunet!aM6Lj*vZwuRW1rb! z^_OtREGJV`s+mjd%g(b{2XOY9Z!Q0lSTgDJP(5K7^VV0_9UPr%y*93Ehr_e8J_-M$ zEH&DC$$`sUD{+80Lp&tU4K9$6NUQivx`R8`cn}#E*{U>FPifor<@HK(0#0sFPQ zE;KA*TBwZFi66<v{O#x*zWerKjf;Gd^-I?4$Vt6yv`*}fZy}w7-N)CJ_J+PqY?W|E z8qWlMzq|k1{fwXWH(GJ^`^dN9Zxqjzy%W@Pwx#s1JV8Du^^{!ch?t98>n|TWVP-4O z!WY74l;5?S`g>!z{i8F{SC+jbZVZh|{4ey0yhxbL%%cU$?@hML8z&<*vfb=Hk^b5l zn~fExn=yZ|C%KkVB)B!?goes0yOh$Rg$zm8wZ&>rb%~m!{-o_SH#i6B8GJ5jiQGMS zO6nmt6Ke_IaP<R=J;%JHUd-;2^(>sI9X49qS<!-CIyI4*Bs2^Cp13w)AUt?}<`ot8 znmM!VCB{)@PIzv%o;^c7XTA0I`}?sSxX*>L(i!>7(AH29Ii2f37ja%0y|ivhbLAVg ztvX!2p|vn2w}?M4UtWF?8WEZ=dm=5w*b2;7^l@*WJwkJ{PiEx{GwOC@ik<2lj*X<h zWU2`TgO3tsB_@UT3%i)p)B$&`J<EKfSJoCrW@nEIpHXXDC%p;*lXHc>;z03NX|7yZ zJ}SQ8qI6xCG8?JUNOz^Q+E?4E4>s~xhnyXh$9^Rp4jv1A5?Uj*hmX79KSpivD%m%+ z^^w)t^Rw?qrs&yrhS!{G=+DLG7HD}y$P4WZJ{QxO;l8)dNV}T3O6Rn;%D<7BksC@k zbEwzbzmhvAK9_RKnNl4|mcAA<*jn^<cau3loe^mj8Ko@JEWMg}&OYpVzMafMQ3!2G zSQ8p9wc>wbrqdt$boYQQ8GkDN@X73>kvCdSdxqzye+aZ@yYdyJ|AMPSN^p_Xkt<4D zPMUcUc1x>fB)76kk+tVWMdxGsQ+}>=ULF|Cl2=J1#M}H<_LTpWmufCnuZF+N?i@a% zw9+eBo1<^sq0~j@s&F9qWny;1xS%TRWAf4sV~w0&t+)CPg$?(}-V%PR&avuxbLo0) z7k-l9ibv$!p^V^{lEnt-<4#4hsTNk=DSg%M>RdIZ%`j&=5vmy1KuQbd3hk6zN{fU= z+-b(|f8<rL3v1Ert6Aaf63Qe!r=9H_kNr%yXL<-jg3A&Di5)^s#6`@v)DE{}bfh(3 zzo|sSyRtik7pj#k<kNwcTpnSq*iFikBJz1TU0lKSq8B?=%qJ?Rj8aCZx_VAa(>?Pe zHwXPU+e{i5IuV)?{6ZSX&tdll_D}=8Rd%-4GIAjMdUlF(U$1Acbl>_u_n&4GgkthP zp#uq}L)XRa>@lj3yTER3cGY*NXCpVl>my6luT9?j-rt(bEw+(vN<YdC<RQ{#F@^us z|Jr?KK35rKOyp_gyt+d_YHYD|Cl6JaJt|%Z&P(_tp_^Prn8sf7SE8zVt?U*056bH7 zV0OL8UM<b4?9HHh21G8OFhoiU)lTRZ+ADp^RibCOy{*0a0_{gc`~#8Ok#TAsb2WUj z!Y!2^%AW>b$fe{Tq<@7p_Nf0pvJ+bUHGCxdMfjPLOE=7!(QR&P>NEDHI4o2-aY#aw zU<9)Ljy7VFd%^0V-;AutZl66p{94Vl{_uv<yP3z_Wr2|w1c!z`5ABfhavF8Y8Dn13 za;t5Wp-Nl)eyq(htGXxYliX^lNoY<eDY#quUL3`nu-kQR9&3SmBl}iXyYLQWiN3`e z=lm8sK&womSTEEqkxASWye*7p22(fP>d~U0pu18tJRp00nAg@?ue}HU@?1e-sdzxz zB>xcPg0$3&t4vRE{3fT3R4OTxl@ztOHdTLV>P`W=E;m&Qg*J!I1s6+<ki_L@KB9Yj z@2ufk@kop8w%HFO$Mnza`fkW~j}Ed!gdwsK%8}SBG)BD5d`E3_&)Z$hQTiG6OytY( zmGA^L&CKCBbRO=Vz)SU|Q&M-is=QGg&1KPN-HqlU$Tp{PN?E7g(gqr9t)q^gD#P9q zHwFiW)(4+T9fjd+s(%hO-5X?A(O*UihuQGV$ad|Ob<iD+j3XyoU3e#@2hWEJg<4As z**~a1+`;w*<DgbwEuyrG^oe|>ert|*$I-XhqM|F!l)sge<dss2C~>!F))TC=YL&>e z@W6;)-Ky<1M%nw_DU`@A5Z?#CNLU;iCm$95Vn4%luZH{HDyDCa{FOa3`?E+pt&4RS z`O)q`X>P0Vi5v@#2>l++A<-O7C%DC}dHOZ=N99W7W@NBZTpMJTbC=OmxtQn=ZVBcD zU$ex!d>i&(`Y!bQAN9}hsO(?Dhm>A=UTa-+f%g^NjqNPH4Bk!{olrZtP1wlfqF;Kq zqN3GY@2!*#Ps`TBy|qkhtha$Kz>eWl#8pz>pcQN!Tqw?CuTh7bHs$~=pZZX_rW`@s zAEbX}wRii{KXSdLpMyJtPvj}m6rmyK1$dhCMpy;4yb&w=r|>-GonF_b+{3Z|=oI#% za7*46Dw!}Wcu1JQ%%zgOCea&aN4<tREix(mW#nt^Z)>0zp?kAW_!Z(j>3{MTxvAV! ze8*OytGM^giP}7+CdQws&eQT5`>h48kDkD876%1OhdvATmZ}JuY?DAa>Y-b}7WH$H zs^M|r5z1KIwf=Rl`$qX2vt5M(ax^$3R5I8`tjdm{2D#(yL^GGZQ2k2T6ZuMMuF+Pa zmrdVgPY7M4hY~GcmKbTSaE_fouX24>1MMT_c%+ANMg3iGWR9`dxI3w)>@cxjaCFED zUXh;h9Q%cTrf-_d*pu|R%9QZO;e5(qy|rD%TR;s7Xlym1m((SgHx!j?i?!H=R8e=h z6*SIhN7PHoZ%TPp*P2*I-F<X-Zi@I+Y9WW@!jdhF<2_~sZMclZXeT4d5hEgNZH!6Q zljub6K9$L&3a{k}p-||NbdLXqDNT=w-EtxpYt&S0MAE`vDxc}y>;+za+6>g?5`-&a zefh53P|hv3V2@L+++VF!y|;Ey{Zm~FyWOKNw8ps!^bA%Ii^|L7)6#UYve1c>n38ly zFP~jbucGjg`;k*>6Qj6&!|4+HgdWP=;VtQU@M^Fkyk}SD7`4u0oP$<xL(o1~7Dc)! ziuTN^>2;#lG0(Ws!Zz_|#Dyi&C1Ebxf!^d!v}WrM)t2fXYB9`*Ct()U)!j<vWUmVK zWii-Cz9k;vm$Bammcl2GwU6jWm4=Z4k*aDH<9oZKTf?W(8<_cgYw3T%%faRH7U3at zhsy00i@q`yy}p*Fl!Dg0*ZNqG++lPn_7p!*{8*YUEs(OrZo(FJ75&a#V3p80b)3S1 zg5`Q!^LKl@yNEi)>=35Qn}WrI?WOzt$Luu!8Q)`frcE1y+B{M&a!%O+-{rZVQuq9A z*#~^0v`cOi93Y!QP4+0Y!tHHGj4FCaYoc1pbhU~8ll9OYN>63i3q7D+t0h&;5JvJ2 z(~GX;9k(88qm>hp@0Db&iqX>A7M<y(QoER0!e}`YHg;Be!XIQ-)5l|eH^nYz{Gu)b z1q+m6`bTyR?-BI?vMnau5nIUjWWRh<_y!SwrF+v#F;;3<)UN78wW}r==d8tUh#tn? z7tTq;<z)G#*h1*fB{Io$OD~7rTHmhx7<m%euGTPYYlnlIo#|~1C)|;?244i5$(@9q zXlZ%Xods59BcL@^mPE!YIrI#xl2;H~5QXnb6;DWI<+aiwp%42R{ocKc$f&4o)c)!_ z^`17zXk_no_fs~rS>WaCa&tK>77!k?p9h9g6}{2+1wB)l8MzqwPIdH3c6YbFFG^ow z_VMi{F4!elS6(H&WS&sXy>FtLnXVVro+*P+l_{dHxBT9h^gHHHzPVUOnk@~KPKc$1 z=4@v=(>-rZLQQ6ql0z+_&C<J=mu=R2PCaLa3PHI}@QPeSy2#gNfAg>Q{px;d=Q4V# z`yziwK2}}5y?x2eMaBHn*z5c&aja~~@1?%N6Xq&)+Wpp6jE;H*t*u&6O;hja@2qUM zKRt;ZAq1uM(lW^qPhs2Ic;ac@c~($=r&LkaDn+!9jR{sHddaI#C$Wo=$$T3u66_=W z!;fRe(6}4PIb~((OVr%Ty+}n>*Z;K#c-N`Zfu>wT;ez;D`dl6<RTmC0E2;UeV7D{& zXr_8p%~X$S(~SOhaj!Amid`T~lak~)(ikxy<mMIxexov7+U~EvP%<LZl=|8{qpr=k zr(>JwR3@KrMyi7dGC*3(S7&xnOFbnz*(zbg)HzBk<p(vQFSieRv*~}Br`&JC8D#2n zq;rTh%b8!PPu!oa^LkZnu6kUZicGzq$wsH3?NoTro6>LcbLk7Q37?PM>c8ci<a*Wt zy`uUeQcIDvv&MD%w7b;T+h3AB%a@Rj%bq-6I?b0y&f&Sq(Q~Gu_t1)|`<3NthTg*- z;r&VHXBYB8@u65>DkC))2lIcz#^<}!Q7<{DmQly3KWMM@7iQP!NUs`QoE<M5lh(>L z<(*<*{s<%Z8~Q$Sv#d0IvRVgoo8#&bP*B5bO{D~OvoZdWD9fMA4WtWv4W>Rd$?asn zH)`qSwN>iB>R{v%f5Ch1ru(wBgf#I7j6Ym#EsWvL2HH^l+-X)L@b#xsTV1P7HBMRG z9K1qC7h%5>u1L4!&hmD#I^UeBOE-x1bygx%->eQ)#w)MXp~hKzu=k3(9jM9G60Tu} zeOlTl&fwcJ1E|5S-yUOJ&>mnG$ZAD&$2ey9@P^T!v5kZ>(o1-*k>Yj!Ix6NLQPbRu z)(rg<wW_i}siggC<g>3j2Vzg?+-#CC2HEFz`7>!T--jteXL?!D+SX$|P5m7hj8%O` zPrC#>M+N2__pk6q+$Eiru85oYxy&`{JSa#oYHNKl3w*AY(#x4?c3m$AZ8Bd7Bc(58 zTD~Br@?+V{{(HU|ZoodQw^9o!&46rOqlw+q{T7+}$E?LyM~1XR9)ZZ%4;8G>z1GoV z=1Lt7TfLzignoCnJ9-VUGSZAMA{LQ;kV;5Z#AbXO<_~I?d&jz=-&T3Vg_ha{{gOF4 zdcymj_OVrjang9Xpu9pH%0FdzzZXk&&ROaDd_?i#N?09jth8h9XH=EI5tb63i$OU> z&KCdRKV|w-f4Kv&LGx4HuXR&@RcC7pjAix^Zzf%x&E!{#{oyzEh~EhPxO0K-$PVU1 zyC$eR6<TejH8GZ0m7NN)CD5)0!Y|SyxhK5mApRF-EIl?h%=r-&)LrTrrJu4#t#2%} z%X*8bZGkVj-oktFj`U7?A}-=vGh?YmZce*{@rSk=bFjV0QqzpP_DJss$hNo8R`R6H z(iRabI&A5H;``S9*ZN#{l%mQCC7;$DKKZTlJ{IuTX4?q+rDyVAa&BoR--&roZTHSa z3tIo^%hi#}Xdqk3m}~d-3eXLhGu#0ow{#31X{z`=Uz_Pdb#rf7iAF80llqOCsCCsl zp}xM!n@m?_n<6gNk#9<)#XtGh>|g$0e0khG)>_E6q%uZH(Uuy+?4j;N-&B8hHp-Wg zewKfc8L2y;lbMgmTs6Ai+@t5yMD>lrX+4c?_D^0DdNEU&zl@xtj^vjVA<PAk)sJ+q zT83Ul8>%i)M`^0=nDZgq?zG3qLSe}-@0B{jYPK^mx{%LvuD~OnSJx^>m9pAa<1%E+ zP*43c*%$n7@dB*j1S*MYpgwiP-DB4?`{<Rl+3HGlv9`;2V6OpRI<tarDJDqC(pa&P z(1M#9!28ecDr>!d0yUN)>N2f|vBqlSbdBvo#jlLe9GT~B%$5rAEtn>B(^v;*1pM4# zb+__ZsiFOA+_SrThpEkh3S1N6p147pA@vl?@LHfO^^Ggr6O1F;A@xT@yCQm7Gf(ue zw}t*1vx=Z}Mw%%7DBkCHvbukhk8=lDU+GoUPRdQCqxPFo&~_Z$YVIG#b`a)B>*RLw zZm~3<8?k1tHz%5A&eS)m^OUVher>gpVbAkEqPw9sze|XU>!mSLZ83{GAIL#fb~gao z#@cALpPB<T$5rOUsNtQZM<OnDk#foVA=_De8TLDWUEc+#jnzUgr+%U=S3c6#Lt~b> z8+^z8C)k0)aQN?@s1euZ(*k{|{9c~uaI+;ac%r<;{9~!%i=Oj_)7xRU1;nD#NGU}! zg{$12fS>xGyVH8AOIi!{7xjDXh0a>nqs3!;>1xP*Ka&c`2c_<i*HtD;M`D+p4b~NX zt-4UTsx*LX_uH0RkfH)x*kr*F896E)7Tfb2)0#p~Y=2?)M8DnD>FPh)aU<P6jM+*O zyO!@L)|9@Iwu`-lzTEOS2ESVy^c!j}wHLIYFJ^&loDs2ibQf4nPpP?_Ee#e6^WQQ9 z={~V;&S2}BenmZkn)cV)HN%9T-9c>(R6)GGB_5QvN#n(jcpuY>`qOP{A2mdshvh12 z0lku0D7wd6f=UbW7x8zgn>11M!)~htBEGNOjn*HCHOG}I@G*;wT=p|3Etc$W$F_v$ zn1mVY7O?@}gvmo29_`ezPU&~mb4r?0SKDD^*;7$LD!^>w)(8P<mo!c4EEWR=t*Pm5 z5!5FaYujKoA88ZxdFG&KnzxLuz!rnmWJ&)>qr{#3F!rE-sjrs%(0ZotRJSTIWsG*n z7-V;FJNx?hJF@|y5VDAm<n!WJi1;t5jo#*{VBOM-X{FS%Y9~<e8WiNCTQP6AYXXb$ z8%p^_lZym8Bcm;CcQHn4lhko)L+zmc+}s|eVhb^Ew|Pdgr1R1eaXnv|?d)&jW8G_( ztv^=JLSq_e^NnftKKG$7)xU);D)^-!a@6zUK)xoko~rJZkFGQq>!r1U>Kt{8cGpns zzr7ChN~SVz2{EyubXuG)OyD*Ls#D`#$!=l%sI5@<sjId6#t^HR(-hj3z&=M5KO@Zr zTJ8B$Ogfz!JK>x}CR16fga|T2J7sLQU%N%95`n8MFYFW-OH*LCRgrUSqe^*UyOTLW zuchr!v(+4W2{Rb|&8vmncR1ffEGvB?Ef8x8g}JVQeAMr5$S!P@);g;5)pgnr#%XJo z^G__5&c%lLn3yiDkXnfq`7z8$x-&e-R4ZVlXjP$!+q4LD_G46#76i(3p9v?$QBplA zBtGR{1%^?n?o!(@a_EM-6S5tt&p;+~*!z~g%&g*<i!-GWSXX$<A7+`r9bZqx=DdcX zW+}zg{@O^xur4~Ou_S*5_AMWf%FB7=Lt;<<XQm5XA(q=|YQ546Yq_un(@a}u9JWh) z^QmKjVcbOFzBobZDpeC*&JK*H(%sqiIpd~wSzWG{)+Xya&EKN8y{`0eW;MS_T!H!0 zeB>Pc*`@wpeRV)V1tUM|O;ywm+AyP*-Nfza>)~(3zT|I<_oVC6E^z`sf(g+lz2ngY zM8@)3S9Jtd3Kkoy>^j~R$_cFFcB4KyRLUv66EZLZnNB@+C)#_BZQ3Grm|9ueq@Oou zL?3y*>0`{_{C@GGbWS=Zrt!nsx&BT*(S2=|F>+~+;#bQdHcNIjcZTn%e+4TG>By5G zBaY8NmijTh%KIuh#~i9_Y7MoIx>P%AthWn#H>h?@1-`i0Oxhq-lr9R(xKn{a)CIS? zUDx<jYoJzA{n{=)$x@=_5b*`%5g|!}KYAg)<m<AP{d#Pd^P6=>zpmazJ++|L%BXHn za8rE+0trC&BgC+mpkNF?oN=i^UQ)D-nWfEFb7K~?0d?P(c27^Dr!&7Hg58x&=`-o9 zFpirXC`e6lMVm4%sJoO)%2V~AUe9Xe{26oU=IqBpZ)uu5KrSU&d?_|eFO9W^=UAXG zQYRtvd!&|!6t=omsGkG<xwFDRsh*rmz9Ie&DLkgCcxUWK#zw8Znx?c@4`_xFwnus8 z==G58P0=TpmfK6Kg$7)^faUwajajsDQT<Dqhbr1Gy)UYRXJaY;ui4^4LursaPVOM( z7xJ)s>1Hv;30gBzcip6{SI(+5>H(+R!PK?DE-nKUq{y$O-Qsjq%CA$jH`1PD^oJ!p zQGQZ2t(sXjy4mYRTTGNs!hEr=+(haxyk%dZdJ=^9JdR%fQvOvgsbT$;<vQQ`cKR=} z{e_lNE4hiB2ea`TOlSI{Hz+#EtfjA4pDF>hn${2biRbR4>cMj~5hqKUG)t-{%6uN? zU+SIP*sfs|(-PINvP*5OFEeLByZX=uBMFs}^;DKqq&mVs?C<`@zIV<NYp1?UoryaA zEmhHPStZ@+zFYoR>@PwGc+WC&1Qm&WOm+HSuU@pVsc3`Mi%M>_y*2|;w4isH`kHCa z&lImB;*OCd@gjE<`Q%=B&wR#1bsM7iI<=4fz`Pr+9NSNqhDZEXnkA2r>qsSq@7enP zcd<!M3u})4liCp(?NL=Wa@xb)bYIgz3+|9GNg62E!@PMhwCg=~(><}XjD1>Db)QmL zoe1xlVGr|)BB!3u?-Sokr1E@G=*D#qIPe@9mWN8q5oMpUPu-}uw!U^2#b{K<atRfr z29QEwDTAljtMuep9jAu18gr{7%2_2H+SM2pk<!%AKyz-XPy@(blGcj7ks+O?QoMuq zE8{G3j-dLJdPxhKA$ZUK(HoiB{NIS7Pmmo<g7+*NxaMo-zOsBqrkbv#D{1O=eS|gD zxgD$E?|>*;K*}rUkS*~ZA7%DHyLcxz))g+p&v~%07DhvRm)nY39hktK7Cw<~OMgj2 z#73AeJ%s<>VjnjaX}vHP|62{{4Uy6Qj(v~YnC<+1@ttHyg`_?L)<6O~;*s&Sej0Pj zv#_u<eF0XN^7(%7&t+Rczw60mWko#Ary{F2y$#VVW*vPo<|?$>RQtskY1{5fie_}~ zBXPVGk$#m5h-sW2_>sEmcD6ek|I_lTrgBmps2?}iN5$Bm&@P3~CzX`*V%^Ly3}c7* zi~3GGe^|%#-LRT7m<u;F^4P81b=Z-Zi5#t=R7Do#1DIC~U}*YxXjeNkul|>+DPO>I zgbm9c?m1LfrYYY={6j)L0CkohxIqDqn&Fm&epk{8s+1a5PwNe>rq29W7F~<YDI_EB z$}MM!xA+A18NDR-Euz92{SxZA5v8Iw$QWwha4S>Y15LOULKP`P+KVi)I$w}kL6z{* z>}1o>HmaYf+f`a`V77@~@S4%fnSOkKaT@ZYOtHU^k4p|5^tEwW`%~jHt%mxkT3_Rh znbtp8>n-Z9&pzYNAU1E4=87x$7tB_=Z|qa&Ys`hKXsr+x7Hj_)zu5QO2Goy%`rIJQ zL}wy0CWtYv2y=+4<~_Fyn@RdDb-WtXdh0XIp3xm%ZF&jw9p6hFC(XpHIlpj%ed*ur z`vP^2rp6aqBekRYoz}>BWZic--<SUHS(U#lUXnISzauVfXC~1#Vrn#qibRsuO#K;| z#8Jehu-l6|7?{ufC*+alOI0yjxymVlHB=FAzkM57{W5i+np>NrUp4=YKJ;3lmN}DO zD{jGVihW|3|CwFkAMPvVI#xBKlvZB-LhY&bM^<0L{l+)b{|hUEuk+B^5n>B|F!KqW z?(IQ+avAc;@6?Uzb1lJC>`%P))T_WY?v_wY`bCP0D}{mFqCiI~+udqEHjZmc)KO|Z zEmf~%(N3k<XjEnT^Ap5n(pqVqcog-?M*jT1h+|oujPKy<TZ4izMs2&R`<HK@e-fLH zs`}5!BswFj?}ob6c5hbnj=4eq6d7%*Dr2_d+AX|eR3xy0+lwe#9Z~#ip&a*ppb~Y> zU1h&B-fQ>O{qQj*j8Rr&2XC#?OPShyX|a;@snk*&$!9Y*{UCPP(X46k2RBu$PiqH^ z@9b&rdEagSZ1xymUkpeY;u9f@tBc6E-1{+l+&rNFtkGIW)aIs{)uKP3-o-O#xg)}5 zk(RoM>HKLnDG>H;bSK%DjVIbm^@(~`n*iBvb56xxqK4I%uO*g59>F6|{)3rK_m6dQ zW?P>llX$7hT1h>hdDedGmZh2mTu7m-_(ohP{veD({pK%t&%)6j<^a8w#%s&8Y+X11 zj_&iKRAolx-U|^>P)?lBcW2l8@v<grew&T`+5z<>`1;34va=kV0P;J`Pkb}6nv_p+ z1q#S^rmMw@J3XyZ@JP?qg4$<#b0C|HmFb>=5SL%*CEgIbW4BChZZPInHN6tiU(MP2 z4_X~93p3HNRvw3r<)m{ktGPMCYH^=<Qz*x$Gj;quuxERPUBPUpH`nTGHT9r5$!_D~ zj&}b^hUPa53&Gc7VFy<bD*%OKpE#SWWkx0a7i|@GNUShxL~DDUsaAnI>^VLr^cQ(# zb2r#JfreCZuVQq)c}m}^jnN9~e;E6$PEI52PcFkOfi(^hr-*w5iQmG!rEwnA?PBLN zd*~yzAzE9#fVtA1?*8HX(J!(^_!UAAv8C8qn2B{Do4V~ij<&VFH;U>@wNx!jKWny* zw)G}a(*k)ootMP6;&ov<|0gR3a#6bL*h4S_SfNeQ8t4}d&0640j{Qb=Va{{2g^}V& zagK0{8_8^=asQ~3*M4ra)PK`fYK!y%=3Dr#m%a!7zHC4Kh|o$*5;>s~w=uAvTI?-` zjh8oq`a!Ld-o>bA9f_{-4#CEob0vflVk2>`P=PPUuJ)hzU2<R9z0CRgzuMp0L_Nj) z3hUjMV%z8e%qi|ip`F+ib@Jc1ip&r6gxGo~hyB**ukY6GYftsvX0fQ{8psYhuwV1b zggoLIVLg9^?G~6uP4QMo%UF$!l6o3;*&RTYA<?<*ou-xqBrc7AF9_o2!UgU>rV+B9 z|J*=yv-t|UPabK9^xo!byRI9>x>*ZmELL0nVnEC#w8bp!fAlx8Wlk~p#9g|h<=68W zFU|JRie3@wo&OuQE<ZxZ6qX5N_!VqLc#fXlyl82wz0p{w^||^h<AwE&lM?gM2LpMz zNBlj(5I%v%{Ki;xP3ZS?dz0xm^6NqUnLgcoVE+!^mEix08OLe-f5I-|HeZrE9dM}J zv2ProUDkZ9x7R0OZ&g`qYV>QbF%=5*XUp^TgvG-Dgj{?}HtesAn%`t#Fv$2(Z?3=5 z>zS49WllTnf4Kl#*bklAETr?@xcZ3rN~{KUQ~YbDpswCcuWdZW4EwCR!q?G%kok*y z&5sv42z~j3>=4NIrkCjKvsB}mK23k2E5=sKLOwZ*`YN!I{g!Vf3={72i@2lA5B^g= z)BQZ^m|q#g^`UwlV~=?NKKWAYS2~gTguBEq6s8Evd7Hf$sEe%UuG7yRU<$_f`fPoM z(ZHG!t>#hGPJf7f$t4ND3YCNcd`DIQvJ<_F(c#v1W0O8iclBCkg5BK_Vt1&ifd}k- zeljq4!1v<@GP1wFZ-<*Fde^LIG}D{u<&BG`X8-6G^_{01G2OT~{2pPIu$|Y~H35&R z7hB@gvOhPo^p^TKeWKCSS{v=*eM~*`S7ZHr1!0j;Tgc5fVqf^nQSH2S(QmB3jpcd| zUDX?#)$AoslNe904m@LL@S}t|!cD$CkUdAI_{O-tXu8?S_!YgjHr|+pqdVPRz8Lm% zH0Cz)J+WtOIDe7-HE@fPV*Q;Gc4xD!u}XiS-!^7g52ACt-c*i28x{w8gcjIAxtn{z z%=AC-NnWpLIcv7DU0<p<H@2Hw?ZWQm*c3X*l;gJWLxk^z8N9(>3Dl>5i#>Km*%Qp- z#xMFBeW}sHnjihtW2sGkjX4Ng=p^L8p0zJn&EJ3;3S{S6S%#w@(W@FA%@li>QzZ75 znh`j}e!=GzN(evk6}c}_9qi%T<Q9p#=Fi3n{f@rLC}|asPI3$Q4$|eAD%=vjfsjWi z!B2)QzMvY#wmaSJ$!25YnC>?u^Mn<P{^`}HuJ}3jKkf{lA2OK3U1FyCGkmqZtyl%g zG7^j|eY$bU{L6mn{1{82R|QV6O?Ux^;j8oK*$08yG!Ls0qA_!p@mTj6@36KrCz|OF z^<~nvnG)PsK9BH%f63K=#>}Mxu{oe%xjDed)N2@xO`rX#bKd)&dgynVf4FtL#n0sX zaDOqK{TF>@z3tJ37H5_;C}X*iZl1D3?vmL5=zjt`*h;*{t9%81FS|d`jlLiI+VyN6 zdXS}yM#PwfmBSQov#+SX15=9Y$GiLm{t8!+ed_N(9rao}Rk0Im3^?m<3^6O&BcQXJ zs6v4X>@IF8f0OUPm&cyW+?eA(bB9F-Sf)|cC}Z3<%3C?2-?^Ew3G|b|ZT4gSDSw_1 zbA#Dl0g4_KGo5|*GxIMaWHc~pm=7(+ncyW+ll*I#FS$PGbqYTgyNagy9bY#u5`ATT zXZ~c=HMSYo%sKXTrw9De4}l-pyWC=aJumVX*l6GY{gH1OcAwO<o*SPSt&QB~&sHDk zY&GA1w9F`Mef|!=fj`bwXUhjJP@lyvI&<wa<~$>((cWlhI#x;NFRv=K-hY`H$xY-R z@#BE(R%W>WwXdmnHG06RVt#3qG`1RP(AjL~msk;cUSK7g0IW{)GQXX@9GHw~H^Aki zA!~<`1R7Gz)z+G*?f&G`={ih4t}CC;ui@8l6m0QloY9)&^tLyfzZrRqe#TE`6}yM? z(CbUx@V{ZEa8rOmAHFd+iD~LT;j7>sjc&KfnJqxUUPFOwS$9^f7(FYnhz;@A(Kat+ zdoeJcj>d+$xlq^NYj8#}!)H#j=0zj!C|@@HKPJR=;<NZ8{28t&Yx$>8w)ea9y}i|( zVdOS?7(bZB?9R?pZzL+^3iBH`9`gEzugQ&Is`@wha=>%^W0f)68?}vFMm{Usu7N!o zE$PjH)vUlD=6CU#+(dR(pccJ1R^838gVs^d+S2&gJZ;^NHt^2+YWjOYzgzPc`RV+0 z?g_KgUxQlj)pbfkyM8yS8%y8~2H0zzim{Vag}_Jb7GSW2FV1JO#h52_2j5AzTeO$u zGrusJ8<g4Esvn)@Ci_;>Y9N)Zj9%CB=eWjf{lIgoQ|y7W)IM+i2`RLLY;7yWS>TnT zmitdJ!??-N#Gm=@+&@e&f2yyEcPDz<s%^H5%QoHIXM4_!SW)`7z!Wx{+stp{J#IaF zCNPdRV}snh(Tdgs=;62EYoqm7G{f!VOQj1l5m?x6ehfc_Q<&HO*@$-Aoay#;a~rh# zPh+{+*zV)p@V=sUAn)o5J=o0G;|s%T%K5kXN_l6ar>rKh@g~MSBd?WVf8_3oHKbPr z=CKyHo!`X2=cclY0*&dTvD)rio3-{CMT{?uD&`^Ue6*am-B-rngQ>uM%Rl7j^RwY+ z5BpnCr@T&x3V)ct7%9fD#tO5uJ<rJzTSmElmi>bp$M557^CDLd9`R>i#9bWy+xp1t zZG35D8MUnBXh-*6tP8y<FrUqUjnCpQa6Q;zf#UR9>}C$zg{{Ys>}aE_`O?aaHuo<0 zKK6HEa&Z6SS3zSsaeJ8g{!-MxUVY~yd!@PB=xCfYo|ud63&;`AqncWnoy&d4Pv%wb zAe$A~P1o}6b$dsDwn~^Ijj={mbEY*gy2CB!TScb@_Om88jqk?)%JFPs;5gMR_Qct3 zTjm|3r?JUcYu2?}Ivc%W)CB)LrV>|$pU4;FIj$2^-GABF#&e@Sdy2Wi_}K`URV~#n z?*17I(%%G{uxo%<Pkt}gkDVXrN@vE#xHY1ktt9hDW1-R8ylowe`n{pPhloqJSsohO zitox@XD<22BHC@n-q<JR8EC-{<3ICTd$e;O>%!~&I}sV{p=|-)VH-0A{X2X$ytL?R zYp}V{82tY@y2fxjk}cX@=sq{LZQHhO+qP}n*2EKQVp|j2&W)3My43yFn=gOwcT!!o z_u6Z%y}LT>hYJf!<u~ht6r?k2;2dy!hx&w$y6v3_tTHgUo5`&ji<n+NL`)a&g}4t) zo^E{x=eUYE7!oQGs_Gu#n`vG9jXzgUlApboIN3+wax>*N9V-}RU!cc$5jO=8`8jr$ z@<*h<#r-qtg&6G}3vUjW_r{Bwc+=u#P=$=Zyy+6RWGGLlznjo0%mRC5P{E{ET|{AT zd-!&E8_*z;Zss4cLNq?#=UjA)hNK(Q9m9v<Y>)ec^=PTRXx<UvYzlD%Q$4v6UC-!w zp3_xs`p|ly!40;P)Un>1?drA|@7)dG3J>*;h_Pym;Z}Pxi`92#xM@N(RKk72eR{#} z6vQ=QSy^QEc89-&?|DsRL%rUQVK+y7|8%~(<wEb>S59SKkUq4!`Kfg_xz~FX-V#pl zl@(uQbkj3<Zf9ZfoB@b~QlYhOCubuYgMQ!+(^Jh7rMzW8@7~@Ou|eH8#jQ2uCR^s* zMmFXMRd;Xlr*x^EKX|N9%Y;IPXN4bQ1zlx-ecsQ5=$gnAxG}M_pWQo7HXe)auu7pW z88Ov65MB_@<h2rMR5h~;6~7~^?rd-ygldQ8ql!0Y8OTx8+Z3w0h=wY<K0LwW(x{65 zPAewO#oq!wM~3o;^15^RNSeVu;CIxmfL#~EgTl|kVQ)Kjws5e~{z_l+rf#87htN}Z zoAZ|KB~`2kX0h5U8hA^v+QQxh(Ml~h(X2saCmZivaeIUs0B2J;IoM0PcMvj9WlHfG zS+gWO9?Ua|?&p8Bs?iQSwwooiC{#IA+Fi^CQrDjBXNOjp=PeD_2p<YR_LgG>wS)WU zjc0XMyZu57Lo9UG`N}qvjMhq1L$wzXUh{Cfa0=Ah?&_#1Z5<~8IwsLWi$mQ)(~!4> zZL~85`}K7B0C89^ye7QPD}!2d#xHMgqz8F*oa}Vut-;wQr<<(I{=e#;XzR@icMGd< zLE+0HW^YiCjDuD<>kjxYYdSfTS$T3UsAO!FReTIL4^IrYLf&3g$^1oDbXt~kH&<vK z@TiS@i65d(?MHrZT~q#rD5x0T9zO34hN^Ib$@V+?oeu*ZEegd7J#gZo)^xKznuS2b zf?nTnhj1LPohYe>n;$_BvX{+sUVt5R2`zJTI3?L1dvp*J?;S@I55i5ui^EgB#4@Gs z<G;o%LvNlIIkPfUE|kZez&lXep62J!N#!`y+X~@h;V<3+`57JLM|M6|5L{|{Xh$eP z=)CiqEhR~<MW&*vD<V-BON3>(lW41sm~z%>65{W{r7nk70XgzHX`pLz1qby6dBU3= zP6i&)(~B>Q>Fs`Ayd8ajw*Z?v8LE%y>d%YO6IMy!(R0xpI9n!sDa^$^nb<6XbI_XA zaQ3)^L(@WU+&Rup)`7eXI+{$Xws5=-h{O`!Cb3Ap{jb`^<@XS?b3$!Hqg=s%BWn@{ z>+pWp1>i>c@SN}*Fqzu=AHS5n6_eNP+_tFV<wIFqI9T+QRmi`lPKcsjvvA(<sj%_> z#R^siImv7`-TCA04IM&sZFCN^_T)}b-h7r6)h<=I9HMKvSgRa=nUxVcTi)#-`hY!H z?OK@4?E-DrK&O=Ly?S8_??%n_YRU;Z6s)r2uzb$H?wQc9P`glCw;HNlFYAu!qMG8o zVuVTfAec-@wKY+}Z1R&uI`u+9=xrzt=E<k9w9s~udI9)RyYT&}#Nl|}E^z~S``YSH z5AjLv!BEDC)1h_lJH8Xj3N!rrrbz9@hOVd@p6PXw`*b<H)832?MJC|wxro7``0!bd zk<8XClTIZQTf!fs-bd{W=MkmVHdDd6M{@C$s0q;`-iEZ>+9}S?+F66uy1ASJCHf#L zT{xHbQKZ*@L4lm0U*Yu}g;v-W8trc3P3dJTw|^K6ExMN&3b!xn(qG_+tAoO1HQNZM z<ttcy_0U`A4eO7cEejqIc$=|X3B&KhUBpoJ-ORO8(e^yQ+Xa974>)2rD3BR;B=9J= z9D+UYqZ)_1qbf82lj&x^qRd(E!kZ2C4wZKY^8$1$IN~}rPsH%@LMv<vf5p^XT5}+% zNB%(-&lq|hdKyX>I_jKd?a28co4JY_Iy3w;DpB}Xc%)dUqWRmb3Uo2=;VuuwjyMaZ zo(Md-oqfvBqrZs!Ugq%QsJh`1UImG_@Pj>e0oK}4?%Pm|h+d&I@CM(b*6cB5Reo^{ zI?!NFKL@nk1e3}-KoawqZpV-xx*z)E_HbIU-*&6umL4b9Ai5)?3IRQz!XF*rb10A# ze44uhr?5IS);+^#(s=e5KSI9%|IZwLi+4-@_QuJJx@PdouE)AM8frXtMAuL(Hw{#C zVQZ}^stSoy;i#x@QG3JLL>{%&<h4$bWIV!c4;}b9<l-%(W>A;agL8U>T#KE35tSjF z&3h!G>nVOpdojJjr@DWIc*I&{*dE@CezKZl4(qNc?o|l0@YwJXZ-xA+#{_XmU)I<8 z=>7x#Um*0xiDHWhvxb>$|7oDSP#`+o5y){7vsJH1dM=%^_{;U76K-)hJ;&`V!8R!D zJ>C>3kS^f=F=bA@&MyEBbOZj)RGe4eP#x5z#`G?3b$F;Qf+yF+->wWl@OEPMWM+_o zOk|^+&+a~Gpya3u&)78bCunV4l}cO+rwtblM?+m2t6rFa7Na$J8Yqybp*5kcZUV<* zi)=d>smserUbk@caQE<7ub^zNpZI<3k2DVOXnW`rkTxH9a$-8y3h=hs1i`&r;h4bh z!22vKm^(pta*JJcvV|UoZib?VmO3j~DY7F-VNS?f-VDTdJ|M^6;)KfTA4PP{<2~IK z*x7BNmF{<bf!4B*fTc#rN?xAu`>1x|Szco}BB_JDb~;ubJNpXJ)hCqREy3TAM%H=L z9`4CqWWtZA?cszXo*H6eS}TcQU!4Y_P{a=)$7E*+i%$9nAM|p0%o~7QOdd|{T@WAP z$rx)4kYl*JA(SZMSZKL>kFTOB?D2jq9VyCtg~G3*8UQ(Z$y2&c@E*QYYbVmZ8*(BB zg)+Ih5MBAK6{eUfA+8__!cm*TaYS-8$K<vykPJKyDj1D;j~X_?>C8Ubm4idN7vj5j z_(xQ3MAr>?7gPLP_I{|#mDpJtu@cB}j1Psrt%AA!e?(d@UpRnwan4&S!+K7Toy<YC z3qf5z3FQvmciyu}<V(;P&OuypG@JsJiFw1sNZeR4%8Ego!aeC2dKuaf+T*4~*K9s6 z!5F10$?0ByDD2+hQC?0|{6~I&c#bih9f<E|sLfg3Has1C^6370wNxbZiib0xE+rOG zvON5@req)60`xo{+7<ffj&tU+Vq|ZS$Gnu5I1<i*nqSI0A<n7{{#GkJm`r|f`s<-_ z$lF)^5^aThN4n|Kax$u2n(*ZCdas$Bq@_R6{sRAIBjVr&>Qcxp!ZjIZX|qNx|8E6Z z!}s7_#8EBH^PnA8u*r!Nx(Idm#_fl*O+gkTx*kg3+Y?R>m!X_@Tf9*<{o7V~)TP{R z^Uxi57X#e0INKaHuv%xu3Py!9hv$b+d$Z&PT{gIAr)Qa*t?q2p=6s<Kj>Auoa@I-H zM~xFny$0dR;osqgVCoy8fwqz_>^xSmE3_nZ$*tv-V^8fS!E3!sMuJNf4fhH+^}fL) zp6JK4htTD`GBWH4oP$>IE{4!B?sSPjcc-&A1iF1U80}K|Sa%41*fm%+=d?Q)?nz9z zc)!8sl3R03IcOjoD`<<D{l9y1)Ks;u!9986B*w`Of<KzvNx_cVc@SOy*SCA1Sr>#C z!lA9GclpJE9H)6Jw*|C#!BAqi1209dTIKv_>b__M|E6L1LpXzolxe^@Qj=k<7ufgA z(CpA-ccQb2bs^t^9^lEv#P@K6aQ|=>@0i%DY=5}*ljP?%IQ`$KHN#MEAHY4K!D8J- z?gE=D5ndMF>9v+)^#{MBeTlw<dolt%;{W=#9FI*`TdDoi>VU|F=PDY$A5JeQnEE-) zsV`>>9TqwjIvi5&Tqx`k1ov#2pEA1G50ont&fx73r&M;_6_XxswPyu>zX>e|tN+MP z&??YC4Rryi%RY$jG2zW#Pq|5F40hNtSORA)&h~t$c*t{7@drSTTV{e<EOMgS)Q1ji zA!?`<CWW<-TxYAD_t=9`q5W<dco!dWOA9rRWjYZK_YJRxR){Op!5NFP8qjV$x|=98 z9J!dsoyB|8kUifot&2eeT?|hO{|HADC*@c0$=h~v7Tp=_mJPKD-Er4C_t-Kp^}S}W zS}AIJ>%tqu4d6?SSC_!lw~~8osdED-Rv6B+&tu|jD+VwB(?B{r7k<PAuLjuMCe)>& zbTUuwCcv*s_nT9nm!Z$CE`9=?82;pGxHqZ2Dq!kq%;Z3$Z<fcI=hh503hi_|J4;w6 z_)^nMO}zD&13Yz0xS#g`3Y$P-KOzzQiW3H(D;%l`FZCuJXU7ZnfOkcD&+%Mu!jax2 zco!f2#&CZ3^0IEuP$!_lStkKH5UZ>LsEkI;@J@hn{9oTzRlRZRO%BqQ6?f*ir9y?^ zBc{PSK8c~iI++TnAT_+B_|+r8qa?bHzuEdl2;Yoc$RGORDrW#6MvL07{PlX1Oa?x8 z4L(aL@mRjr*@H3mUb+k}+GjUqXocI~If1NcW`+D$Dz-e}g~RW{Q@rb9sXAfeTCK<+ zaL-=QjM^>XKH?Jkwr`Ntq){V8OYa#}#dkzZ2ffh`tTMDH?xr{i<$lS%?BwH_;ggT{ zE9<uMmzTtQ5pLuS0Fx<g76f1Hq%4w`a>H))&_K7CGk{em--G35q&g+0c|YNc9rR+z zx6nX?taIcJxaT}KTIi9>-6ecG?P<rs%|O>=Ik-*V!e!uy90E&~egk_Z9mwA}C*0re zICp^agxw>vp%oJ7a`Ky3&`aa(gt8i?rkR^TQj!-d$l#uE_q);E8$2=N<V-LTD|jT1 zd1buLUUo53meWn4!Y-m`RN1NGZgo4kQ=JUFE-eVx^N#)@M~H=9J#Q~6a~2iN<P183 zcQxjRoXPGUx3HVZS;RJwK~_;erLG68ui_Q<u6Y9de}j1n_aq<t0i?a*o^#{5mw9v+ zW$zCLo9^nESmed^ih0pRFIho%hNJzCyk(=|GW>G4xQCq*SV4OGslQzxlO;qok9gg^ zK_a?xO{ri!)XHT39s2UC+r=%16-*~JtZ0a?%uuaqy@cK&&l3mLbrajFL7K1_PI>pa zd(%zm9_L@_HG4`>$JB*KJI9NO)kYJ8WD`BXzhe312Uak}{o(%Yo^s0Ynlzz(*<Y^r zV+A$5Al%yPgsfqvO0dvA3V!n2x!^{*L)^yBW;TyhLMQ66N+NH1$-NlfX83Je)KxHA zyhq0}I(6N*?j1K7Sn3yg95=OPHd(;Gff-(TFPWGkdqFFBRz8}VFL$Q9Pu=P6QYSG_ zPv2WhP#NdQT%v`S#arU77ll<}GblJ^zoy%;f-N}R{B9hlD|!Vft$XIUa^+nQ?9+?% zvdEVzY)V>V;oszUYPnb34eoPi8a&74c3t>4ap2<($7<Vo6~%tJ2pT_*U7eQXhn;oq zD|fg%%=y6ra?u*@SJ54zK?->By=C5E(G2x=S@0I<`2?My2kt{RA8r^b%km<=x0<=| z1J-%*ygc3?uewaAa|1bcl0&SeGsykmZb#NM=c8#0J2`mQPuUUmE}qxJ>ngs<N16rY z?5?y1KM7QR;I?(ELEj!EQ>{9FVRY`|;1u$CXT9Huu8rn?5RJrVSHRVG;k*Lp5clXu z`#>-q-1DcnjveUW<rLFp3q8=^VqJkBP#kfv)9nw{oSYY>iR{<@W&KA^6wAGu-X`E| zZk5(lhc`Ea*5d1(KJIEaiyPPJ%leSgRxCdTyq*kVkk`pmUJm&jesX%NHmQI;P|h@W zn0wI~%@5PHc9)=>X|5iM`^c|FUVCu{EcJ;0$4W>eS!1W9JIgKWHifpc=zVLYKS`gE z-Njn3m-oPX2>xH+j0=vSGLGR#o$l^vS2!<t1$d6}tjFe_$}3}tVcrBUvuG+^9mlVV zTPy~#kdwfj;<j;DI}PCGj<G8RNlXs4Lmb5lc6u}6|DV#&{G@hinu1Sonz?iFTsfUx z>;~Cp_46C+8M3$-hcoyCRj~#v^$@U2!6E(VOu%#9a#ryus_dJ=db2@M`QGd5&GVXw zjk2}w;LoyllQk^6lM~NX87`g$H#eJ2f{!`|s_0Iy8_?jAsHjq#yg?(oJzTUISiuC> zaeweOY$$qsWl$L>$<kuFH^NIO$^j7{;U2m8B*gyaPf;7Y0}Tf9<H(v7!348HMFZ0I z_m+E|#c4T1FZGXGH_29(*~#Eeb}P88oX;#ajlwN>XSI@x#D47Tbuj9ts*>pv%(myy zDtv*{#2w>O_XDrOYLE<;<ww(<WnnSbo9v|#^(E#W{bE)#QkLC-=hw?^=Kkfh;7ibj zX#~#EPJI;La0dIKmfpyN`nJ#PB=ik@>P+qcH=|q9xy0U))7Bh+ygo07ihcOoui$-y zaqG&w;H-U_4&ghng6{4c=Q7WYj=yc)G`CejnMh3W7I;NOH<?tY_nTQ$;QWT1nC?io z9%8mUABU<?0B?<F#Mz#~9vt^p3R~UQ-~B9hRUpS`rzRpMp_|NE!%mXb@Ld}KIjR7^ z#{p;4$Q^2#IgYdaLpShSPG`4;d(fH6Khi(A74L7eU!{<)n2F~aC=Samy1hRh9h-?P z!g1V=ZaTNB^PT0V`Oz<7CYL%c9(fDBUqHF~DwW9)l(H+(2;Sbw?KW{=ICptHHjMPP zn)<EuR@p@y03H?>t>qu}*x)8^`xBkc4*-$MxbvJwsCI|#O~F!gNM)Bvkd0>%voGap zy~^JYe{wEXK!61);Lu)Xf_%5``}cK1wI3O_05SUuJKMx`$DM`4X%0TXDeSg#Ut(wT zv9j=QV*6<|=4iw=Z!LDVEAS}3pWmuVva-GWl2acmm<1<uDjjRL3~HGXDkNh8z5ex9 z2?hTDz*iQbr&&rzp*CtKF_8WSIczQUSLyF^2jbwQmqlch8`TuEDmV;IU50mdLT*xb zp)(GCTXga}cwuZkQuY;JJ?$+68nn^1{SH=dQkrcC*4yqq+{yHU6`^>eDaZ|7kxW() zzE@c!liiRtiExWzQhJUt=a}=sncytt#n?#PRye|+uZ6rRa*E_)iC8F!zG%(_7tq-# zz-u^<oV!jrClC5|uk1I$OA`SFFiwO-25}vol`-fQv;^zP#n$m<j^$o=VmWtMA=<#M zg~~WtrItm-2QQD{vc3xRXa5&E8(SE4?mO|^J<bK*p8Z93T7UVwv@Z_|<vsD5iB9s3 z+Gq9!C$I;V`5-5eo5&sN)a6I$V;f)dG2c}OSx4OPzQCRQ2#z?~pMv;q%&zkDP7e3G zlgv5ILNu=JqAt}}zeQsFZAKAajs^d(64bFv(04$YuTE0r;wqk+RV5XzvhcfZ$_?19 z?@&O?WHuemkBwV3pVF4Rw<DZLrxKXwKswzXkE(E4wU(WP=cN;`z+@ik>;41GXpCUD zkd1-!kMo3&W+%ug>wte%XIEcEE}^})qOrW9R+@FeX549(jF)m=I6rZNR!e?|{<7Z( zuT301Urxu)CK89mTj-je{s?P0DZ@7MdCqU=yyH6OSVEc#Y%Z~BtK!Rw!WOkeRykgk zHD!WYc5(WgC2_7g-yC#gc^X!q)Pf3Yp|2pi5{WosrPv{JY3|3c5|A&nJMZbdcdj{^ zoPhPBGjXTqL~~fx!E;3uWrQV*t0(#_n9O-Ho;}2K{c_egXLx^hmfW%~`ww+CbhvT~ zNAwq+<#qIA$Ko!|J~S>b?YzQnwR0NsCp0!{O&mYJ{!301mWV43hzH=lrTkJ>2@;#l z#B(wC;eRn(mbQexZDAH6Z;OiOs7isTqZ}iAA3AV5bDif-O7|#ou?<^E)*)-QYXat{ zy@y^y(MCQ~yU>L>XfLOQct<BXkZY{d27S9vh}jp$)uUur@xuE7l)EQ~gCq90`jL`s zKae9mZXe3+JZBl8+tb3I?4@GLtODFm*b*}<CR<S0&OmRl<j!j+p}WiZhnHi$NmtA# zjMDGr0TEsN_WFsjGD5#M_(A~cZB5?B`GO3q<K*Ov=}vn?u-$xA1La^5A+m~x@EG>$ zwP2~MNF%IZF?MUW^Nz1(KZ&%y`4Q-M$CK4WEYVh!mn&6c(<o?dm!U6MV&|;$)*0%I z;;~r;QWBneYklLtvyCN|;%svxW)oY<$T!-L4@P`Hb&5C<yf2+<4-bZ$9jcV9FQTxs zkzgke^$q`tb%!ivzxZ*)>`vz<9|oj9g&T7(>iFo~rN!U21I}Jjv&^huzCDs=<h7i4 z&L5{ID%f)xB90Z)&!rd3$%2cRVi(S~y)NhDo75x;TM0Da?qi(oYgUOivl|3$(6!2r zn2q#uiI8lhm<jt5Xt0?npr?ym+|Qe`<)}3){R29tx-Mb^Il77d@}1gic3}2o7FJLh z(QUaMohtky{ce8?ewn1uj1$B!FYxw=*K!1EO*^Xz$-<VSHb+O_FuC)X<)bC+Lg*Py zQCVeK@d`K_k}XwIlQ>9ehv+|yJ9qxWqf@*An@Gl6BmD(nb0>u>-XL!~V+H37z9EJ_ zet8aF0*2TfO87XvZC?z|nIAaYZsMcoBEH|r*?N*c2e-`DV@LSkPHgwK6BAWDCXE3m z6WcUWw#+8pp@Jos!&C*}QGIZ!H!L0Eo1=m)=Q&to<ZUJ3(KWdl(PfE=z~tmwqI(*h zynt8V*ZJ-|aY{Iez<rn6vx1rCoN6FjAs4cX*XT!H)`$F))<L+$*Z5W-$9CrdpTKUB zSJplMwJr)o%!d=}DjLYc=nD4^`r1ut6jpE%ncLmz!oSl@Bs;osmGl9*PNYC2>=Kt` zeVq+ACZ`}j=pa4>ad62=jVj(4H{%Tn#+w7GoNOwHC<5fDq$2e_|Gsqw$nlAv0D5k8 zF7lq}_@A}T`OkGObf(i`wcSKVc?Z4A#ld2`KaIz$B4(x257Bjx;sS5<u=DB-h%V)Y z#18RH4%N;5=2m@@k}bg5y6!Wa?E{vR7RT9EH8WHuDBQ1J0U&)JmDwZ@Qrpq#e&%5X z7NYBKUIIOkVb&;rt>)^1$b<MAFJ{R&`jx?VhR~7B$;$u_?>g1c>0LyR*!a@2iK&;! z#Ui~ZAzq4T>MuC;<56$31H1Y<*PZpwN4}9MlE6+D6vPTj%U;0x;i8&cpemaDK~6;1 zT6P~eciL&?^yP6_1Jd5=2^|<$eFt_I6aS!xo<)Cx=Xe`)DoJ=|XP2|pNd)dYoNlrA z1s8x_%j9}dKr|4JETB&5<^D=ky8>()@9vy(COJp=Kz5hlHA_E<8LmpmfugXODf-E) zYM5ygG_~`AbA0BDoc*X^wfQ@mgOswW`6IL^UyFvKo_K^B+CgVRwIk#P`lm&m9nMlG z%x|-5beKIo*k~fv6ja9QVwfl>dqXup^)FeQfnA$Xn-4f$ocZ9sYspdTx^Hwll>r*0 z0wQJ|c*H(TqD`<H(D&e7D-i`5on(9+eT`ecllaZ`JNZ;J7rjLSnP2VGBmMSP8AMlY zUJR9{zjFXFD@Y#jh*9RXS|Lw}E@HbFBTqutqzL|?x6+VJ<u#pIPBEt`chOy1Xr1v1 zcvlO#T?`e^#J}ik+%=nmv35zi6WQ1pu_d`=(~-A+kj)<eT@hPO71KmgnN@AjUHnQ` z5^{>B;qjeuP6y{SU&rFoQebm4%m+1J?iQ`YGEq-XQQ1udZj-)1nzKc`owF7Z)1PNz zL&$tEnR~j1N(YWsPn;B6WlVkD97Z3%3w_G|APyEe5f0~b=vn(-@Y592|H@m~g8?Fr z%&d0l$+(NUF=4C)B5|41$=SvSvF9X)of2AMg~BWkPHa68@fi4jRn(;rUBFHu66ZVF zoKpN5%}J_T&HPz9w)!Jli)N@b4`dyk7`JGDw71i=JR?qFqVt8{Wwq#dXrR63r<y8P zq2Bipsbp>SL7(t<SaZQS7Vut(n6AL1MwsTfZawjR-BP8I?GTAeQ0*S88D?P61v`5i zd~%C(&?)K^=4UA-_+Gf*UOxhQ78R9|H3mJ|+R#85$Q#;-H$V+rg=)8xC8lNU+Hii4 zt2S~7*kpH6O3qM)OoD*hugGY2oKJTyAi9S0q?pth0u6Ld7lI?vM3fW<#XqQazsw_W z#IZEYY-bL3HX1yJ&UBT1EO>4*!^^xS+976B1CQ>($((Mr#?IE~*`3j-%u9GncAP|7 zv4SeVuED6H1I1Y}N8VMVOp_qL{f+cu^T5$M;#YI>+d#wys0ycXw#9+UD?}`5Ft-=q z{}h}C>-m@6<n^8E&MAJ1)ujvV!@+w~R!2(mf7K`&$zJM{-T{5viu|F)cwDEglhx@5 z9<h_Wv7(_XyGsq1r^F2L6jl7Enr+$!Wo=F;Bg3j83M7xl|E3I>T+N@S)58~<E#`=L zGQJwGOW^Kz0S_yJE8fLHH=nO!sc92?K(N;MYO}luG&%^aG7rk?EpC>dO)|4iJQq$j zg;NhM-e|HHH^0X>6IElmRZJB>#4SuR95-`<u6BC54yVu%$n}Q*VDsr4JC;@4pQ;n9 z7;=VK4KygFcIfVY1uHf=K$G)WPH$k$GTs-OH68k#<IH=t6mc*VnJ`(NRjo{Rj0InT zi#Cf_2aieO6ymRFanc26dsjDBh2;`4Nf_}5Za{qhU2w?mOmDHryo1xyxxvq}s&taQ zH~3<z>Mzok3&l=R3wRWTYB$5GM?TT~Ji61`$>j{?RoM|BV#c7ed5S%FCpL=rV!QmP z#v*GH+gC{y)}1GGN;>a(9K>v9($bpif7D}CAKX@ZS>%_=)F7P_cld9#tI;iNEl=qr zMZ_#;1#tuDsUR@jbsAMv-WET_3^25K<_ylZ8o5oQ@drGM^NW||$=E`2&k6-~%>#8v zI`Ut{;U}3<A2K6@YPKL<*)YUG7BK4PY#O|#G*&|}+8U_icf~z{2`F_yxApT`2J;*r zp=@$F@$g)o*&kBD?hl2XQooS#<Rw(w9bn%zj1xRSUm-DW)|EU5^haX;nl>kEpl>sn zZEBAEDISPoGJ$HTe}GF3wA0W@K+m}N)dhS5t4(*?KZ3lNFDt5QqAqALPcBs&UE$7F zI<kxYWS6lAA9z7T%z6@qF9eJ=7W7gA>{nL#3u<W(zD<zLz6B4fCHHwUXCJ@L#?ha4 zF>5Ha!ca9xeg*IBE<2!twe*u%w}6NT*lHfz!JS6Hm@lLnYR!F9Unfyz<p+^a9+!_) zUE^aCtrK}hL;NC-;auS{`AgakF)RJX=99W3b4Xv*k!e*k{nShgO4|=eAy%AU=kNJA zpm$4p3-|aB@ZalYYOBm5)612>m<PJ6k1yuHWf;TS@Jsw4&jIh`9>LA`!B;av*HPnT zF4;)_K?Un%>|iG}{tkMPjpE1gt2fv_TA6IZmpwX~7+?~eWJx&-=QU0XOte(B?|`4g z=F9lsyb|vXExzB5ZgueA=nd+WtSRfsYw`egb`s9^4jj^vtTx}t7jlQkV24OXdvI{i zbkt?k1X)6Mld)AwJqAqXveg;2`8At@wf5r&*&>>SOahxLgA98o8(;-1We>Glr|{1N zy=_gZv7&qr-_48i`e2?D?E67Ze~a#_X33ngntUwpsa%NJeyDZ}zz!zzD|`X}!0yoA z<hGRo&RAj{$c8eL93TrLVy>DVK{9(MiOJ&gE&LR3$tSaV^uArdn(haBr#gzY7L|MC za`g-`>sXuZEVK)&f)%Xdad|>0#$xs&eD7d9a(s>~CA-R4DwQ5#q6dFl<;Z4wiVeV8 z`|*F+a+;5<z&B_*ndq9T_Ocjuwwao$eR#wr?eio7i@}%ht-Lf;U^==E9I=i6Qm<9V zWK~&9UI#abWfuGR8iZYg4rkS|+L=7ee$k~QWVZ`0o3^@~nvC7*B{9*f=bIeC9qjBm zdIx8_hj-`O*<_jk)03C{5{Rxy*+dqX%doR+bsGPC(98ab=t_&H+Q9Sh>db{ddOyhT zAJP-l4p~Jum9G)A+09{iGKBP{^HFWq@*(^IyH5L(r&hsWwJELhfKAnv^JP`lUSBaC zf@t<4@(#+qH=oY)@-D0ly@8!w08IW@eU|;O)@Sk`^#eE?vNqT$Xf2kGPvQgkcShMU z?Ci3@@@M00H_66wq)e=m=pIm3%dG-r1v0D)|BH9yN7+_dmF%-(219VR(Nq`g!3<el z_0*3I-d3>pkmxKXU&9aa#(WZMNS`2Y=laa-Qzvm=h2$nVRb9|k{cph%AV()wgP-90 zc|Kl-{U+V)lR;8{scr)%kwsQObUi~Azlgho6O&ocR-^efzJmW^&*?Do0?4t*WYw|2 z(J~+oGOHS>HLb7*>j=RLwjy);^EIp+jkGI4<43?rJSGbu5|_x)>b$P&`_O>}=`hxo z-$m4x<CTCM4efP7lo_B)sID>wGWWWCp{g5v(Z{MoF46C72mj3vbHX3fHe`?W$FFT( zsjD)h^h8aWQZ?0Y%<`a_ElE?>jDO-9F|&a+0RJ~ZX@9eBrg}>S|7wn$tA625<YsVB zR?&xSE2qw5AYw|kl^CmNFd16mqs)(AEg`kcs<)UHP?u-nj1}ki_#fo>F*XWLPf2SG z&|nrSV-n!!EI9&tt)-v9x(pSzf(_?yum>ffRbG<Hz@wL@jn1t)%fzyxjKutC2Sb8` zR!ee|euLxo1ljP69i=tMR?G97nJD!U`JG9QmNnD}{Rdf7#eR&=T@K*JdEOKXzZ5-Y zC&F~VD<I--<X2gFTJBW_c$5oxRG&^~?f6-~88@lNWrs;tdkox@?#P-^67MO<=*Zi# zCTVa6Oy&Z8$>!q>Ch<#bBP~Q0TakVv<Ebw|xvX*m5OE5;rmb-5-;rXhAaLVf-j0uA zMd>b^Sxx-wdXicu)5*+on_RCvJ<~63eX@Jf&1@`x$1funGO<(O5#56`sQ4*VLsZcs z^1Wnwut^g<v__GysJBOPw%dVShiG9S;#EJVxq_I@ASqT`R1MRve=Hb`@1=AAr+&@9 zARA|}5_E(8Dahxq!`Tj$OvaJR<ua^bsow;S-vWA-twI&O&kOO4z~oqVO>|mQ!4D{m zDw;#Sgr`5+<N^O*P2#Yu{5H3po%}7^MY91pcKgxIMzscU_(!yWhc+6Wm8-!FJ1ZT{ z`tu+BJMW7<$cB4G{|yrQV|6jG`afWkf5~mYuHEQwWkJ1ti<niYc**gB&)MWHFuA`G z>ONxjrzkDC%8z>6K1gR@CIwk}{up~OgYRHH=}Uayr<Z?I55#%-;09ymAVgPNKbdtK zTxu5>t>Djid0rHXu>f@YSyK`?TTs3ciRDH4UNuE@ov?b5NSct}1e-d|4ZB8bl9kpo zKfgJpHcBJzf*-|DHT5HOAnJq3v}HY!35lHbd_QZ4Zg&Xp&1?pfsVi@Y+t`EF>I~{_ zF6#?=y*Jqbp4M@kj=UCoi0En;Y&NO&TbW3n6+-NmPtXmFkF%XhD9enMCUP!u#ZI6q z46*k6v9PmCrG~PrATz0cI>NsYOte$c{;VsH#NH0T&ZbATI~T;l&X$5l`$t5`74k0? z)9eEtWh8&myKtty@iROrCeNpm$5!&74|wt`M0b=ZD#J3p-T?le*gj0su<SU2Pkc7e zb2R;J7YF};si&ZVMPP4xBfi(@LimQzF1sR~!v^sWSZ`zAnmL$D-57i}t-ukhgZ0Fc zTjV~K9QAgRRf?RUzpw`ZemM!(bP9QB#SdBmk4_>A|Iekq$`pEqsfT)d1^#4RtTl$S z8C+@>wMhkZPjBeXaK9geBi57U)k1Vcf1$_M8aTU!Cx=7ak9S91YGW@6ZkfX1$?@f3 z@j)!Y3bL6eK*Y`@ist6Ocs@86X?Y~=h`!wmKQnfAth@t89Z&w2rSu(4>a?}v(s9V} zEKYtnb4OWgAmZ;J2fB<IRW|vzID!?lQP=edsOD(c*(ip{a#F(OsKsuQq;?JXQa+yR z8<fIhu?kL4Yv}fmn7>cMs&NkX{fWot*MJ=Ttu4ON(~yg|#6FQ0tfw=a%zuNWaI}}P zB|Hs$gSGHS3(_gjcG9#%$0nydj_B$wCn;Ya@F##rT%nBL;aMF4-j$LqA&;yWm|A<H z4oXX&7qR7i8Beb_or41Q3-F_+Jc=g<OTEWtz(>piH}{0@sCvqeaL`)GI%+F4Yf|f} z-H#qd#Dtumyfxg(AEcZ;C^%$tqhFFozQEZYlDAY<6Tl}QPb`)mNFM`P6R=yf4p{&m zk;H5T$_4n<N;0)-rN5ZJgF$v`I+l&(mP4G$d?|dEU3O%U$)BtXs2cLQ_$?-(-hR|G z{JN+$+fl*J@}$mZsEX{+tns0&W*MTd%UDnqN#p~Go{-4}JlYJ`vpOnGa_0p9%y!eP zq@T4Dj>ue`?Pr`pEwH&Uz@v-76gwxK%jUx8i0MoMA{Ky;_&7-APe83Hi&OX_rpm?W z*K7cjNd-Le*j=9633v^jmF*${s@*uF)LG=>Az_2jx_Yju5hSuNk&3Jv*nb7*C6ME9 z`2UsBUHTV0+X&~iTjZ5_)na(Wv8_kwu-##ocsWGZGCq;TK*wl&aMI+`pYU9JkmGZ} zddh%(|7%SHJ1K<oDhgLBFAviWWG!?}R`mGRVFkB=$y8O>Z_U=AkDUN$FyKEt+Q^Tv zF2JK8DCKX`jld0l2v3ZVgW-LT_p4*`=VJxic{J>7eO{S80Q+tpY%uBdFPRT{n^E3@ z7Vn9E<X3AglvO_d918aY7wiHpMMk5y6BAjp9QETXIy?D*M;v%G2kc}v7&UVkc6Jdf zN7vg=gJi&?LaIJa!9lHAiF&)v?}{&l9EEprh9`i&E{s0ZZsOp}Ws`BXcV$ZXUgVZv zWCA_glnWy4V_=@OfCh09v(MQknx6EqHX>_g;cS11ccMAaV1`cRKMq!+SFi@|cOoZ- zGoDXldFcXl%@X><bOu#OUW3A)Cs)J8`y1b!%L%v3!E+UIs8bX5b~~6%kzlk5BX6VN zTyS{{^>(VMh%XbK1Rk|V&XmIxfkAX7#eCa5sOF)-qf3Z`yujq~@Q8l~`|ZZ`5KyiN z&UPK23#LBM-UdW$4Ca{@UA}ubg%v8Ld4wsfw&VkRsW153fL8$Ln1~q>->+h>sV(xC zH~}yB9k|qKGc~A-TGNj8<1x{(I?kU!HNS^yZsGr<n?otQhSSsvJ;uGdwV&B~jhV>v zY#Vl#01>+}L+W5s=ZYzzZIxd>!*gwsr&SU21zq8;a1N3HIpR5YcuM|<_9F+auYNhO z??W=Cd?gA=TNTw8FyB_&4wF`JPyTQRzSv=O&2V=x=1F$wCWx*`=-Xbht2&47QXcD< zJ(*rd6_4$FMRZkR&qzK@>TEIzq1#i*dm<Y2?OWB}Bn%!yw<lqx`B&uaC44UYDlJDQ zpbJCHOt?ZX;YSpdNmW~nwjT&aLRl?fOL+?PIG2K@)}Y(aIn3aX!`bGS=a4mcb6UNH zOI-uKg0(=7J8%v(uZa%!34)27V6lk}&ym7SW%8W-q57C~!Fy{NNy;jK`DQ_XEs7n6 zNBn=}pk_XJ#6z5IX6U6Jn)zpe9NEDUXY<rfI;>y`D~z`u&jqgEN2gS|QEM*4(;un+ z=*@_(?BobO*!`FnhKJUWXT#Lo7b_j!ru>fRGUBN4(ZTl7Ijn-{Iu0gNAI?E$Xnfo% zLSvGu)&$hs(P{`X;hv}{p_>q0pU^$6K$pWoLMPuD#)q@`v;*E@dv99kWU3h4lPIxV z?nHE5^B2OCxk7Dl)OeU8NXG*@f*glW-oQLVRp9cz$S$SKuaB6%s0z<e6&iz|ML4VZ zNj98*fOF6qo?|c74;l6cu4`L(G7bEA)-}5$-2*Nq;W9KtwTmP*?HR!hQwhFnDY#8w zGthw*%{PCK)seiS(ZRiK=NP9@Ak9#3fA|&6CAD2fm!H675~~LK8T__dwnsX#9{eYM zcN)41jWMMX!n=$+bX9QQ_gKMbob5|J$}eL5w5QX1h_2|U;#GM;c9EpETL(K$HvL&9 zmyb|GA3-Y&M^$)lO(!nc_dDdxf&Z#PW=z-}^^>9>xJ*j%Ml_Vg)C8Rj^>%`tj1FZZ zz)pVi9(*uMi+Xz((KQQxL~HDU4eZ*f5}I9pH!BTU2j_PqGT{MF&m-6x_-#dkdEm)E zfu6rb5g8@Z>eZ%Z;MjkWSg4FwkT<LOH8vM#+saz+yLdlvi%bZQw6AQ6&PqZ5eXtC5 zX&5r>1-Miz-ibx0eeEMb2%XmQst5Rg8hJ#XM{nl>x-bREZu$h?+!tt@5dTI;lABh- zU?BP>pP^Z!!)b}H%IFh#J210-4z6c@Fxp5yk#A%D;J4)imwK<~fKR5xj!lP;cnaO6 zIMy+EGK;YXAD}NQz@dGIvt0lc)?B9pe%ms)ye(g;no!t#&}F<%1v<Fj`8KHWtF!^x z0_3QI$-T2!sSixf4vqiLEW|e+zmS@&4xZ~9ABBovAO3$Fyxnm|cUMF4TnV9Xr>f_A zIC%0CyB9qI))R&TDbDj^MkFu#x7SQXbSo<2#BxAkYfQVw3of7&^_eEZ&T75`8t6DQ z{u=8Iu<MDs2(OFC4zdI^knL{|TH1fmFKNo(g3<OtXQeRRZWF5kCYuJTiBKy^<OWm) ziT9-|pjXh7Ze!yS-B)>b_&0xpbF>eRz|l^wFe?TX_7nZcS(x8^YK??eaQI&S5uV6X zwt=QWbX|Z}xUa553n!F=WdpTLXYubNx)RWiP}mQkTD$U*s0!okTmSh|9Z<uPK(`-7 zKQg5`?GJ_LxE9XuGMv|GV6w{=0Xgzw?jpH1@L6KW+A>1r(%YedQrU+{YOsTQh}k7j zqH`!GwedaCD7{>*0{eBaf|hEtF7y8{iNY0H!X^V{zVS}H4@*P`z)$u}XPp^m`v+X= zA9)#X>OS(<Sk1{x8XFOl*m=q`al$5(f34_2Q}aTdmPzFoQBsCfIrMg>2le2$bq41M z!BO9h_#T7k%8Kuk9?`84v;Rkq;c^JRD>wkNLO<<k$lHJ5r7FaCUG|m~$Jw4X1+>C$ zy%Q<GIh5)P$L}F}d=ASEHy|NAVg(geoh(5YrieMO{+4lNSTqBh8wm|`B<P1eXJ_y( z0Y*6*6~6?|)(a}2i{1skYk=O;2B=H06~Ccnk%@5pRsoM5gG(jF+2TE0Fxs-{`Bwuf z7lG@UQZF>cg3nN4QJCjA1?IJxKVoZXYMkvQKcBgQ_|Ab-=nfBSo=y#YJKT<-jo=F1 zM||}HCTBoZcpen>_v^lDChA=lxm9jfvCR(jZv%S--2wLd1a4|tbVN50%dUe?R9T%= zwUo(lwh~_}n`ep#AFR>jEi!C9VrCA%40kX!w8C*e8z$Ut!NE!kpQE0drIY%XgP}Hq zGgbmV&q-9fjx6ba*p=DefDD@r-CS6nfjgMo?DacYamh^dg@?dnSjT-9NhgwbR)Juy zNvmDe430!cnM#$?yD)bV!`@1w!IxUk&mm?PLf?MES7&GXLT^(0@SBCeBc`ZJy1sAY zi?K!F<~D&Nu?aDof!&6Gvn=>#`ocXK3{R$^6f#iF%`Ze(S+Wo4IguaZ!}w|T7kVJ; z;Ci+Kr~ZcL&n~CQCU6eEV(y|SICW~40xsSzxSp-Cvs>(FRwq=(rD`Yqn+oz0vc@*! z{PfmobmIm<TW!Z~3HFDsAxWU|pP4?ox|)Qwb^#)$*W-X3d#v(gBT%LX*4lw@W|L?t zG6UGv0qh_GZc}NwRCZExfE-KF3)@8mn8a{Cm*>KKL=w6hj`l!s&lBn~T$Wby9(L9; zBmG3yRyz?b&yvC=|Gz(}=ysCDo(+F;sUD*C%a-sb6R1S+C!;VSk&FxilPCj3Zoqf5 z^|TDxZpDMLDGn7hTegs^fE@kc>h}*~+w(Aob(eL7*OU)zt^`;;zB=s3F}L7%b;SxU z!9jWg7tOX-17#|)RD3FM)@O0qd1TnaAZ#Y<4r;BeA$v<#Md%Jj`hQua$$IeAPKbie z@SfMxB4io%ps~@)V6Q4*585HRsJ{_D$19Q(&$R>|X<p=QLU8KHpuB%lPedKBEStmm zy|2=n?S2ExLqBjiYlWIHn!jX^={WMksuFC2^P36TSXz!l-qwPDQziJ09RE!JusQIa zoAY_BD;0Jt=!y*Hy1EM=uQ;M>vO1xQ;Va9N>^Kzn7a(U2@&c$!VbUA3C+Ymvx-A^- z46?j@DqpLT<|f{oNktZe{m$eMfyuwwL)wenv9h9voeC3Eby4rSf=jj3x3ROS;QYpB ziO_+#3io?1T+h3xj5B?14yz0J%@T62T&3P=+)HZhwsXMwtpKNf9lVQ_;2g#6r2+95 zf+76{_r1T2t5WD;aP_xZMX-YH*n^e4J<fJ9%|(`4+8=DPU>a_o>>*F$xpwKa_*!y( z_#7ej6W-WZ{Ay`<7c<a_YUY2^$J7ToN=}xJ`VLIq4=wx>%&#rn@4;{~FR`0+3=viv z^h-wRe(JoO1TEeI_4cqSA3Q;?cPssimBh)Wh9lCLhV5?FUB5Z{W(DATE{D@|Og)7X zy&1Ge$A+;dK(A{2F=X2#(gTXEj{iZQQ#Ks0Bj|Ew(9O+tzm@gQE>9b?XuLMh$Y--< zv@v;R)d{YnXEa1Tl;||d+3;junU+A$PGlQh$+E$X_`wRI+Fh}$Tc`ax@ZSr<(>?%< zi3BG1@V^8D>?ee?yQ~=cP`lt9Y#^oVqd^Hw%A8S5?L|#!uj=XP$eJP06%}b6rtr6% zcYwalNcN+zaK?<(W7T_9P@?uBVxs$_0*w`{rqftF)bM{<Z03;-c1~-rUk|<U>gb%^ zfIk{d=Q7iLVhu&-?mO@x4Nt%qvxD%ZGTK{%!q|g*D!IBOKfp)qsMnep!4xYDl))QI za6ZGVF?KdK-o{B2>^H;oB%s$B8BHBkSJ5w73O`^t_Fxu^%d^12a@hwm705Bm&ue1o zlHdo|WodLPDw&;rUTd2jU;_Up%Yu&44Ah#A<hRuaUe9j5Lpi87KhU?EqHmhY!Bwj` z8I1mtW*PY_R)A$iC#nT{*!@g-_zdsC&vK~Gm@aGWKLhJIN}kY7EDn!_uEGtvl~lDa z<7~D5tn#bph=M_?k)CKigV8>-Gt;c>28+dCvwEx}G|*|QV(`E$)0<TS#9~Hu0UVL| zeQ>t*$OPJzMKTW0lQB*9qAFbSyI}>rl!k-WSS8gtfrvkX&d|+I&_}1(t?^LJb4U^U z3|0{6uc|P9)loB5Z@t_obmLw@TjfF=#D&7Ihz?sabZkms25FvNr6SY|=<C~<WJu;u z3Ji4fd^&_ltadN^O<$3Pb|!0&-vmset@?$IY+IFA*ESo_R~Tpii~iDPtl&HA%jVH; z(1B}Fn}1^kCGodO)J9bCGbU{?2ho*_W@6`Az^<@dnBrCT5+KJ_vqJAyX_Y5SVrRdD zsjm#8+wI5{xax1PhIQ;My-g<AiLI^ZL6p%06s~1ey;KR^0={boYqotKDrg1!gTL;~ zrqY(gx2D7I`l!FCN{Xs1>LB?4W4w*C6O#m`X*PC@ePMf9d{ptr_5jO)vYDaxsC+7s zYOCVt1g5EfD#(H8nnzo(OYAlq49&Wgw6Vj%Z1C@rdc4Z4@~D-n3##31Oq;F;e!oPu zxx)^zVyq47?Hg-wkjQ_bzo|wljjFAltBX2p8U!ct?e$7n!EXHRT=ty`a>{Olp3xdJ zT5nf{R3<e-<<|L3KmT4(#-51^(iwYofwg8U@Rj%SK#oCv9+L^YC$%c5cES-^4IS77 z+*1;du42#F0hX0jq$w~9*9`G}R^P@c#8%bSN8nL>MAu`h5NS^<v#aa_Tf*Ma*JQn2 z+PdwJHZ9>kCr~j|ANc>3%v@gt?NFP~Bga3p7pxmwK>L$4m>H{uzL~9SDj(ggO=>0( zF;OtydW+6oGVH8}^UaFsdtooe*<Qoh?osKKl4aF5^;;M9*90-`_GB`U_8I$u6+EEl z$YA8{8oxgLlm03?Rxngm)!ocVsFg+NFTDb*j%4>(LpBf!<dZcF(_PQ?2b`^oGdrjD z!}YBD-_BO1IoM(Lnr&b{wde`E33^7$%y48_Zs1IBl~Lz5Lojzy&7O~)?Z7VLUt8?# zL{iwk7Ig8mU}p#8Y)h#9Y8pChK3ufRwncx#&Af(RO$J>P13kXVL8LjUpQt+c+YZXs zzjS6~&3CIJ=}3#SefZTuaPcmXX>fi|`2$RAbi)eZbeF5<x(lj!9BTk{#YwQK^N56^ zsLXZY&8-W{LAAyLqs*ZiB4Uo|7kCq80XiEgX^1Vw-_Ah9Q2NlGgpSQEvqRs)3JR(5 z=rw0FP5d3$*~X+VEzNc!4x0nzR*-gJbAS8Yv4YizgNi`!QE>eJ^|M>!;fb82ec4Go zR|ZxcHT11DEhq?ACJv&jplYxFAY!=RAlMC7pOHFj0Zw-$>isLS!)|I>!BMk8|Erp) z@@f(M(Yj^^cD9h+j|`*5khAMq2{x2=C)wZ*PJk!URBypkbyN@GeV;L*pfxc04pz__ ze>;vDnwt9d9>i>XXsaZ8s%osJsN|ZP+^98otVARmRd5fMv1aTaM9h4<to7O7X*TM& z3bh00)lRoYZ~hBrH2RU=Gy~9Z0?UX_ZyS={z8;M7>!Q<nT=mDVYIJ(<n`A*B>o6+g zF<KM<e=~L;5%bnwX;lKBe6JJeg{rUG4h@#Y)by9(Z1a(FGy+I41<$pZt|$HB4qou5 zn6dhz>ZW?At8h6cLtQ4b`r4bx23ngfXOqAXE1?4sWvvXV_=yo+GgN&wQc?XFep|_4 z3AAur`Ui6&n^_NbmwqD`?O|4`;I`SXpWy^*t5vG9E^T`ICxRq)D?C?0wu-G~r7-(4 z8vOrfu+ndbPS9r6;J=++ulJfCetBy?W*LssR`|;?Ow;r<f?Tlr2U*c^Pl=svs%C+w zN0^-cz~HRKNGj^V6<N&cvTgJrnPFD|9{pqf*6)#rJ&|9-^boVv5958ezN8n;jC~!+ z60=5_Qi%YM7y{1GN*@9qPeLZ##jI)8V2E`DlQREc4<=)0Z_;1nwmsb{iJgtq$)GF- z0J*B_LZ%J+w_z(6DL|u8aYwN{Pztk1OU!|t^5>bw`W0e(yn3mYpn~1ObZ{?wF_}tp zvk}-WpBBbs)kkY#Pz_#vWxY%FQwvml{Z0p_Qn1o`WBcSjZHe=0j9h$4j@W&yq`@6? zT6=1&>Z<m@7pr6jz*A3Sw?^KkMifk9+1U^}gp{^F2J`(Erh`7Bx~pO8gW3+16L39O zpeK5e)@8F;S72v+#OzV43pyLVPKzAx3p^~O6PkS3+4EKeNlU-d_G}nf#6r}M$=F%p zpE3vZZ&c+;>IoRf2=f;_$AWez(v~J*y;vt^vnsS2Nsjr=xqfF%9b8uv)G`%A-$Dh8 z8Po$J{sZ@-I1r{fp35U2?44La4nLkLgbFfN9a2>gvlaZY@NWo-PhW!9_Xi?R1{w^p z3t7MXGv<W05Z}|)YqdbnFo!VpP|og7+R-?8s`iMO5{Ox5p9n_#Eloe<_!PAkOzIUB zW7c2*l<0X()s$ibSv7W+e!`c>=UG+J6Ag4u=+==~L2X^oGz3F?Yo#Qa=r<tkP?j4# z#uZQ%nZTtsnr-?I{{JyRgXv(NC;gaKV|yIwPgCGmdxIsHN55TJ+k=jNS<?(ka2U=u z7P96Wrk*ESm+ZIXIBM81RvRmLM=sgptUSRF^GwIqOR$2YINQ>utG_Q`c4<-#SJw7M z=4N2S=y+1!reHGT%{2W`jZ-t!548<h6N#ywsrEjyhL%Lmv}d1yM={A&Ye<mWj|<kb z0m!jQ<<rqk7Qc6J8r_`~G?I2hbd_eS>3%ZDu8NtlL%^fgSZhC^!EoKztistAv-^Wj z=0qlpVu@H&d<Qx;dh-*3M~zV#yJHO!J@m(L>f2j8?0e|owgl34#yks$)3d><AH)Hd ziVybNQms&hb$V0HpA)>W(jsdZ8_njk3T!3aM26bAt(X1=vj|n8EB;*tH<)Nn__3@; z_C)Z>qTn0jSprPvmLc5!C+LHnt);gCWyS)J9_a7b*>Toc`weDVTCqi__s^&ykL<Zt z*}(CC0F!5{PHLShsk56#{`%mDm6_zDn)YK8QNb3#4d`vBvTk7o|HtG}YBVa?e7y*Y zF@@FEo=S!TIYxpZa#ofWAfB~3XoV@Lra0Tth^`d+qqh8t!9q-ld>|))$zxa@cACB+ zXY3JHPP~WlL8sR1v0G=M!D@mZ9Y)ux6e&d|T)*BdIk>?%QX6yE`~4YafqtWAqbdpX zYYyUU3tMCCjhGh7$%dfbe+D8ZLjQIeJgf}xJ@*4+c7yY{CZ*pz*knc84t+?QV6|n~ zW_kv?rX8GvTjq+6j_4Yv{#Ao@M>7Y#uq<{9(uO8SbPoiZY)+e^+Px1}`&~?LeFgiv zK)L!lX2c_c2G%M#Er)=J<AI3JX$(vtZMND4S-_>T=rusvop6&gnDYJ@AO|Ih=_e=v zOmeXCbO{+`7qq@0y7uTFh}aqGEm+qCaNlrH#O_Ku(Ztw+4lGQI(1L_wUTPAMW01at zOjre_@JxR;nS(A^!7;K4>|h9x{yL2!&+PS9Yw+ZFV6^+yMC5HX@T1!P?BF)yJ1%{O zJ?IZio<~=ces*5#w|@c1A=O+pO+5oYnrx1MW>vC#k<Q55L97d~t0sKJnD%kh+crRs zYxvbw$lE($X!(MX)<OFQ*$D^d|9N|f{s3}JwMwJA<LM08ga7Ak9i12KdlS0N=|~3p z9<E;}mK2ygnKZH^tdssCvle?W4`-{P@Hd(Js0uyoX`~-b1ddz|wI&fJ?4DS2gL-~Z z^lYxGCF(S)cx;?)!(f?p6MS+r&CcqxB<S$%CCj1h5(gj5JFH+2;xJN8)ZNW2{~BDO z;v_$Pjn!6VUuYRx4?g*qV1qx*%tU<8SDV33?m;mc)Z2;n7BUC%-3}3Rj!N>~J_h6{ zfEl~O`tScRxspz03i|zmBUTi=%%|Ado-8dec^w&vS-4;RF`VsJ{N)g6ut}Kz+3bG? zm+A_po*2m0lS!Oy5faTl8;nG~ZGrRZ3H)?XZ{K3-p`En}KF2Ov5qMA+S@WLU0{gBW zME8H`q<SWD{4Z4=im{GA58g#mlAVTWZ#E69olob1Bc_A%yADkK72>cP_G`4Bi3z*d zRzrIVkRu-|{tzhqsx&v)_ZsAFeyFhZU>uWy91k&<S~i$%-LOBC%d{zKXiavEJ|+9@ z&Q_w}vALub@~fxXi<zF%W{`glJ6j%@9Kur#V5wPuIuK4zWU$d6jtS0xv4Y9!m--v; zcKpQ7PQhI0N?HQX)r!5LNvT85V`uYYXY&J-`v8yf>KG=Y-z7K%XDkL{wk6m>VIbnc z|1jD2&zgfe3NbrHJ;HMhH0y!MdF>AW?Q9=pjiwc8B@!2I*F-p^z4T>d_-d6<Kl&d} zXB}QuvTX70-Umr=Cs=TIch?ZyT?ZT7-DQx$-QC^Y-JK95gy0Sd5OQ{RzhCm^y>Gs` z_m6w-N$>8eRco!P-iOXg1~7R&dAozEFu+rTNuhTznWdr$+Rp1{bJtSAE_mCy<zU|n zn2=6P%zks)lZ_df#ha!6qQ@5&!%{y`@#pef>)fUKD*V5`9I6HqF~h*4&rUvOyM9vb zdZI2{xJTK8<xIl;V7jcF9YfFPIaQ$vI9rD~v>=$wXi*wx><d+42At!Jx3gPU55n!z zqL3=($QYKIpK3Q+1<F`(sReo&h&Y<~`a;$m01=CdL2{{@2A3KGmkM{XI*D=dX4(d* z%X;o<ILCT#cGuBaOc$nTU&?UKwjn!P)w9dFt~SdKOg4QYYtj)1|9EeC2ZD%G@yV0O z%3$&@Do8iDZ)c|)e#8&E(@fC|+z(#fe(3eMN8IE3rzwjow1}#Z($ku6z2o>gt~@Ws z*=i=QZVGZNW@qb=H3iMz==N94#vXGDQ4^A~v+H1~4Y*tJOh4rmPI$L^Bbk=^mzjgN zHj}K*3O+fNJ>{rid0{e1WsqHKChH~cZ}iV?Zv{6BEuP7?74u>0W1V=^@Km^Mx7Ag- zQgmW+FDDuH6g&*~j&qypE}ZRke5pU&LdZs~`{V>Vy;N)5uAk<He(2_KFHw~;y4Tp* z+aO|b*;G|?-Z>>f?~_h!Cz<*oPT1LI6kd;V&w!mR+)O%ysbKrzC+{S~62Rz_f=7qc zE_iZFR*(x${l<HR-I@=N7-zQFVByLLa@^lj2tTBn(@xct>F|^9a|$Kg2j08*2G5wK zeq)k}3bL^(={#k>vU(0u#XTxi?6LoVU2EI~?nRhqQ+779;SCbR_cj!pb&7ftz`l2> zRkDvLgTnTMpD;J(^}-Pc>FMUQ{lh%BuXDo5>?sWQEzjIuLFu(;%_e=$&EnpQSwR@R zW{)k82AZH+lM4me*)3$vOL;(y#5t&rm-&m``id)6R@X8k>;dsYhQhm&QfYoT9h}K1 ztMbA_U*Rp!^$;GD&OPaFfFu641!O%{n%bPhlLeGZfP)n!PTOf_5LzKN755!;`hGek zSu+$w+^Z(Qkn)n@L!E7EiyVvJmd2!mPrl(><GU-|!Fr<EWnaP6t=j9P0FCZAMVPEA zNB8u(Ii>Hox!n73)ROLN_l|x?2cj0pQNwwGlb3?2)KBWSd?eP{{_x}p=!(-Y>JDyR zlvQIp0}XTm2Pp{=;{oNCsDH_tJmjr)%d%U?yuw|@?8{nnk6SCb(FzaPtpe!KyiO@P zE3fT7vqbN9<HL|{c}u&$xsR0628bcBxpq!CXPcNg{Tu3%TqSzj8m1}^>2L34IL`!P zwuAZCo?&MnsyXaICQqmn;Pg~2=xewpO#gBN-1kI5F4)Ooeb;zIAz4XfcFwTc_{>#B zso3hRIKa-1fvKl=pOFb2+{~as4R&_5T(5dM@5x+l0^=qxll{<kX-sC_jTJmaDQt8{ z!;j9`2oTZWl*a`NxCg`JNiICJOJ=XW<rV^wKI0qwa$jl3mJpp}U!1XfPC`0M%(kc? zd00%g?NDL!sbOEe^z7Uwx`F9uSBX=S+ow*5^T#<&UF?aY9w7Yb<EN(=mDG*vHgw;* zC-fQoh`7>EMXANC_O&zH`KFS<eM9X@vrj*EtCEc=++nb;cqYBABs$8jss!Ko%X#E< zadxUxavLk?3YS_9JBae;a5uPJ@qLHc)tv2K)OZN&^CS`T7f4?nm)e);>dD`a@>X+0 z+#|5>Q05a-DUI6{iOydR>q@Mod}@!H-TJ;;1{D;??ZeI{G1)lV9<rAz=Uj0dYF%$u za8NF%+O<LBFXt3~P!m?U-O)8u>^5;m?n8}-Isz3~%IQiKuO!mh_$CXQF##*606W>E zPp|?<CQx6QJN|-?wbqeNdKHi8x?oPjsq3Ny<GNkkq}rfB%86F8mCEHDf**uA!<@6~ zhTJ3mp)L*3yWIS)>-BdRx-HOlgY6pJldWjRhwQ;+r?N8`ju<F1#jId3r=aO^-h!d+ zr@QpOr?3n>h;Y_}h*_z(VfKjG&K^{B|9E4$onUBQR!~j!k%K|c>+Hc>XE-akF1L#j zwlVJDEKch)e0HJRl6pJR?i6=W;}iMTxb&~9;7<1D6jIWSi$fKSLfMsZ@3>p_A@(4# z%&8JP`^W|3Y+w)kVW}_C3Twfxyi_LR?c%1=9+TGA0J}!3MxbY6kba<ZkT_T;2HAQh zK#z4}xuHbjDte4P%}jfo3C<w3fQp-p`HUj)|9bT1H5nG}R>41c3#WhQ-qJ6PuP91g z%FWrP01cMnx_+0B#V#^zoZd=&KlfTxMHyWJ<QOeh$Q5wv4{*PCPDf`ROr|&3mB$o= z)k{{8&fV!wCc_TE=Dy1iP{w7oSKtwWaH-@}h3EQ@TMwrEo;?WV9!RK(Cko2a=!%2v zmWK(y-{klQandd`i`avL>_HUDDxFSYio<#)qQ(Qs#`vBuoWda@aSm#ws;Q%Aata^l zvM!?H_c9AnD=*|tHI9lK+j9-)ptEW$bI@&mskPhOHMocssY_>ckns^E*n><&mnFxR zIA4^NFU3wfp1QQ1I{wugk8CWW^P2i-{2g)!8TOjhK6YBdQfJD)L;)CWa(q0m_XD2i z32xY|f~hN+Q6+Tt<IctL>~oSj1ywrv(H=Id^l|D^i1&xLxf@si(n)L;F#z;z%g$!- z{Bg!R=VPL4s10PMWgxkD#~a)I*KMv_nlbdSgK-B}I*F*EAx<rB*mT7wPhdaj?`|pT z(rvnSmzfbc37<?OORAjgR!(@|ahOb6a{Qj%U}ovfuCIF*<{1b}jbn1y=J>92RWEj+ z1eiFB_&y;Q!a2%vwq2;Vhhb==$*}J1>=p4*zGpr+GmhhLr@7NtHG@xnH}~`lH#fbz z!zim`?k?QixT3UdKxGWWc`b$pN`b!pB=)ki{WR}h!Rxw21ySH!SvyQ@gmXl*p30u| zc;A;f+p(ew_?<>Kaf9LMZ@Hb=Soel=ypE}i2U$TW&o54)pK3sK1(~DZcXpWadE(#% zD|kR3s1B8}Du|eyJvfcNO-cpXL}l!VUQ#fmm)-_$Vx81fvg5>Fc~p&O4|3xBj&b&@ zt#Sy{UGbQBZ9rAH?v3j%Aj3wPeYgyMob3rZ3mHB49Nzmvd@FI$Y|uw=B(8fO;fRD$ zo4=d9;x9QC7cBx#o5Zsk=isBfAg0<zrh@K4#XpX=>*JQz<xO|Hfg4;e=^bW_d9Duh zBZpH#5;BMNf`~auzbKx&+g-#w$xE9KwNjdhspu)r&Zfn4jLTfnQq;;U&}b9vyQE7~ zjyogG#dNtA&XEe9o&^PR9q(c>9ppk_a$VH;8seb08>riY92dn`*xYegR~;OY&dvzB zOL^gwci@w0>4t4Y-)^I~bJj$`dg@RWKH+y&AriBIo>AhIonZ#+Iqo-j`XO&_w1Su0 zuieCAe2&pzK_HIbX6L>-D`$v$%-H#B-mlEJK4$j42JB!NYQ@Gd+ML9J@N{y95nX9w zSkEoI%rit+Jof<Td5_+FU<~Vd?G%C0UUCwl6++R0J?O?wg7qBt1`*#$w4bSCXHuIl zF#qBMOI4mx@UEq}Cz-)ymwFrQy-2-VP8WY3c^h9ARQ}Wsf6n$A?4X>=048&jT5qC) zU1ql`xe@MrT+aY8PR@sO{DODICTnh~JGdu3=`!Zmo#+Hzgr$x{12v*oa2T!d8vi}9 zC$s07!~4>yjK!Gw4c4#RBJLyaLvLR9HjdvV^NSm$HF41%5#LGizJIGY%z+&PlLwMD zhLa5iInux<OW9sHzuQ1LU$kXx?rZEq1C7D;%wSUL0NC7arU<5hh=ZBtc!sC$aW0^n zD|x;<wdp`qgHJv-2k9Bb#}C*^-k!xze$Lxe>Y(wPg5I_18(wwdaKHVLSVkwRksg2o zS>ZiN6-|s*Xn?{#Nwr%+XQLrJb(XVREv9prg?o>YJl6@L>opySzIv{?$$htcu(^l0 z#MR(vmGF}@QE#`HnR)~Deh1x>v^ajj+LxUj3m)}$6tR`tbHMqiUdXMYyDg3iYlB0& z)%yUoQUG6S6gPK1F=x1o6;$!W#c!KW->ww*!fxrHn5@}N1zAR2+JbkH7p7j;c?BMo zM1>V{$};133rBmPo(<0Kgem7DZ$our+eFMJX2(!zs**L^adTf#@w?z?r$>q2_HOY$ zfqNFwmCR6kf(f@jWKDigb+V?fGl#sbfbV)$Uw2cw`@K7;<7?b$dXssLH`hqjgeO<? zl%dC%4e!ENUL$L|G0zc-!aqVBe8EpnYukvW@&NoOGp<k$&syiMx+oWj#x@<^Tyggh zUeg0_54RS~Z-IR%;;2M0^{RZ<<7o@$Xe|9iFdBa^RcQs^E6AE1WK9yzwjcb+*VCLQ zyNg<hi|4r1c0}Xz?iKHBv}g&sFsWm*=B&JjFIAAPT~;Po_oyYDZ6;jLFW~G>+@{BL zVY=vla8Eok51x7mQ%KBdICYp2Dab_20W)8(Ls_lB5sB@dVWRy98o!sELamACX-p*E za(o=2t_kMMO&MzFP29;NRD}fSz&5bC2i#lPg{o-f$>~|*9D&ty6VblXFF}J{sPX62 zr5<pO`_>PQU&{GN%r>Bk)<Q33mce$h8Oqsy^RB~7O%oGc@o_!p!VxE+DgwZxonUgX z+$cK0Wc;Z$L3}cdx$i2vv6*gfpl@9iwm;pH?@lWa@h=qi7yO%>tl$dDCcS%ssks}d zmGbn$YC3N~`sjKa2R!-+ml}e9GZvP70_V9gU6^F14Bd)N^h;);E=v+Iqv6!+sWs*4 zGRDXGy~7Sfaj&6^9%44zP^w*A=R6ow(DT$OjZ<G<#^)x;A^1^J_lWnDHzR!VENm{d z;1?8CZRax@KMS1Ww{m3=h}Z`mI0j|49d=L;C7K?+G)8Qf2kBZR1!t3@uy?DqvOm=> z5%<k%5(nGiGUMHjtY91U)>k<wiriHEuk36a?u`53sqfbpsCGv|`Xn*P5ki--Asw6g z^j6Av@_EkDEAVjFYlZF3eA!6&*>>+$9KS?5ov8<MoCY}-<5Snb^_;`mZjin3)Ge4? z3O8U|jO*D0|K=j^#>k6@6~wnz#TBaKv{uErm36?(!_}Ac*p8w>9#C&Jw<$+}$peY+ z+F<<&I#J)~g$?00Og^TWA5t0bd7HVpbV+6o4si1_0{^BU)h;o!@5|K$SwlE<;~r4$ z4v^!&yi0JjH}Y17+;|rOXr)@9%qyp;Q$eMo7dGGY(c|f@tOUEVxvy|NlYty_<aS(r ze@|0RY(Jf-XyoW-^W$Aqp@OX-Z#%jrbagY_9;J&O$xZCCpr<c48K<efvIN+5Q{RTq z?qUVf-Qv#Id+8wO2D_@lBLZ+`?mDT_3SM!Bs?b+YrPf3vM`0?y;muuLsR}!pWk^ZA z%}7`HEL`dz5eRZ5rz3d@OnwHdZ>jszFL@?nakgiu3bj1eY2kF|jReW43J2&&CIh>6 z!FrBTmx8Fb0kRtk<QLdg8b>0L<IC;tHMSS?HzQCLn{jAMx*p=YhMg=9(~Vn<|6Y^n zg!#^KwGscOFdZAkq~irX`x@kEt4EvTHj1fwKj#iT<O)PrZKA6LYWye@65FT>+hBev z+$-*RkfXThOULGKCl=qDpA7S=NO@6=r_)-B+i{O@lW&t@S#=@Y!7cFQ5c&$4sWtI9 z+co$cP3V`r#=psfleh~<VljTe5`2zic<KdlPs*`^H>lPc^yXjV{7%q|!LBXDw?D{n zpZji=s7otgsmbXS<mYTZs#kKq=*P@h7F`E!u!`tvO9#0oO#Q6*#dOz2a<LAzxd*+1 zUUVzI;NP5b<Io%50_Qk@gLJ`ITL$E)k8e<$47)?GARWE=!*nY;QWf5?TUSx;@!`pZ zY!CV+d(;fa59~_I-1kwnTTT*nZASX|wPBu{y|38W7P<$0&bxxqP|mg>S@YXzh#Ide z(~GxsTCWjZd&$PwxSo6HVf%=3vLz1E7pD?T;+B)xNvOiaHanczSl%>F)|~a0V(K9Y zJb9SdfXgrq#aPpm!L!&ojfXXWyKzaGOs&BRwsE#YS;1hln|qJ(h^|v0M=AW|+D=<| zvb9&u9(@sYc>*5chgvzI-<s^ArR<5edk5BM@a)Br_#<zK*|t5%F_GGQ6bGjn?qF8a z$j*gxoK}-j&G~WB25`2EaP{+A54VsTxG!*MW5MQz;SQd(ks_^%?;K&jvUwhow{?jw z#njq1;yWYN=B~G(`@+4ezj1%6jU1#J<H_X39o)v$Lxj9ZAHO~7atIaV6wlRxE@L6n z+Ab8Am>pa}h80IE^u<M+#_UN3-fi^FElgE7#tPQaiCWFPR1#EJbaa)#pS%yBEP;#m z0zNqf=l2(!;{v_;2;NVUnlAceqH7e|t_ECcwex^Z)CSQ5KA9Wu`7S)-Ej!x)ram1P z?SuTH4zRP8sdg>tR<xxq{V|Vph?|oPJB1%`j<daPTv$(adPdL4@tkO&*vtxj6i0D> z$LY1WEa%wS25w3!etFxQ8I2`m*e`lfj%OSde>1LrJ+wk`Cc2}QXk2%(+n>4XolI<n z%P_SRC7b~*T#h?FRZwB?SV1^G-Y4%Hs`v{u{%ey0=QjX$aE@x@gT@b60;awj?3zLs zBp2~zQ6PEfm(;Q&@bOl_PhRrbk4`UqytQ;%19)#$QBcN*&-%OD=tNC5dvQpG`oaoa zSlR_A4?Vsz%xHwr4-CWS_>RJ^>3(&Cm_$ntcD2TPzJ{mmIt!T<`YP|E14qOB)`Io# zc&?E+za>m_JB7-)lM2EwH!#QCoXL;rvK!uWT9c8<i$A!zd2oIg;*eg!Nlc(zoJ0>* zd=FWZj|quy_98ysO{NaQyb(CRK4|;|wxnnar>+9~O#+V?;hbbTV5gX1JD7Ipr36H6 zVm$RWX#8PzU5t}BggWj6`!3~lQJrKJT(nrQ`i}59CK&N9j)5F+;nb;F!CKs|Kh6qz zmp)7fKeYStu<qgGh2zxsadU9C`D{Hpl0DIk7x9H&Iz60?YC97Wy=_xgu$(S-xHmHn z=^*lUo;}EWVh+K-pYg57o!oR8YcVqx8&;o8cjpug4(SK(fjkFbGT~u4&T9OwPtGhR zTEgWMvEMGFyK~7c&1#dnW6-yS;FE*k)c=s<S8*M0fk#u-KjdvCICTX*-DOUj6<>50 zGoNq<&Jn@<<Y*@tw!Rc+EIaN=lnth@;B~nP4SMv0OGWBfHoK^dOPr8TJ?7au&^^5> zkD^v4px7?CHTZ0CcN0@sbxnIbthsWcs(>pK<ZK~gy5s7%Wd(&{zl+=gd}|XN(ydhd zQ+QZ!>0b6DX6`zZK?6T3zOi9=SRVEu9ok|vQxA@bZ*vge<v^JwobE}diL*hSWM*tJ z^JVla-I~l6RRU)R>P~c8r=x`@vw}TTJl=fgG*azkJ$P3Ee7qHINqBX4H`2X`M|;P< zA;&MN9?n^wYq0Y~#Zqx(xP4(lb$oPK4&1SsOthphezt(9L=B7MEO74QN;Coyk1&6; zh>rVgG)Mr?Rlz+>U!j{B!o2HBIRj7o7+uM&bl6&=@dK&NIdPlj6SZmFw&?atDADKk zm+*25!&vJBe5sepQLYHHx6EBFbT7QIg6<r;j9E;6{K;lAP$hL1^Vvgi#JRA!g<>>L z%Vbv2gqqs~-*vX0VCLfz@0AOfTieca&4eeH133y3-)WisSnXCLYR0<B^c#9cUhYWx zs$e4VC=Ou<=ZtzSUx=%)gA3Z?%9VBNyZbrYDkczjurF2A&zVcTSw_qbV6thr=xkfj zhq>ssa?2Aj-?)LW9{=XDxK3|8kQg|`&VEoCxv`O2#G>b47*r16pCxqs9V2WK;yaCc z!wk>?XA|9uE$WuMg+IB+oYYb7P`5I>b;%uo#&3qt(Vv+uKOFtTWI`IJlNu=pv4S?- z0l38Hsu3|#pXGfQ$Luw66PDP}*+p&Y>x8JJDh;fji=jFzGeBjCm?dsWo!BI>{-OYV zm`M2CC1)=^zEwomG3Hd3GOrZsw&TPapg=~^5A4mP%nUlXg`JH!x(l7;<ZTDpR8-}S zF0Gl%tmzhW2gA^AbGG+E&oCx0+VWgSL4(^WN^0?i=z6F9^klajpWfis*11d`TZU<h zlAz3ZVrI2djER=zDA9@Z{O9Q>c;uz|_Zc1JsVLEnVhbFt7+7@B8ATP(Pp37vNCWq* zhRP2Fm#4e_`a5@!HBO78ZiDsP@V@JzKpx5m;+#EXE@}t8Qq^sNi`Nw{RmZj$-O<hQ zoC)mLbau82^9h6SC)?t8-E=#<)j5fuu++6?hdl{;E=A=pVi&qNPgM$BhU9ea;!?v_ zu~!Y<H88Z;#xjGHP9`C`I^+H?pkuQLPyG!3<VLjBZ+AFR(A~Yqo2c5E4)jEa$_^?e zNU)g>gk<8kqih533Sj>I3}+kYPDR(;A#X1+7kU?cS%WBC3Cf*@M@Sg$CljHwkzsY+ zmc(o$Cblx#JoxX~)CU~pjm`{mahO^mSHn4GbGDz{fo^U7eebTI(>f01m?8V949-+m z+lwAwe%^^zNtD2&?Wj+>9o)uL=B)aYeqvs5hwM2M3N_e+MNV~Gp%D2|yt2>D7oDAM zZ*w{;=TVpC@YKtRiZYja%e2liJkOL&#{Mg3(_5KJ|MaIj-fitpqA$Hm&nIt}i$!<` zsX5mLP8)VMgDOJa=3?%lBRJQe-P#G#EAzudS|h&TUQ}_WITP_&7BfN0`;+OhJ<}QW z8a_D&ZZJ`|q29I^?eQ{yvVxgTcY1t*>TlVTv+csf)Ejq#`?tFq|DWGwpx1i^%{Z4i zkumh*s-PHu$+)~#N1J%23QVFuh;SXvn%`uyIYnM7<3rVicp2a%!y{e+ms-hW>Jc5A zQ|RT+BNulNvlHz!F$E_vK6yA5^nRkUv$NHy3bjCvAa@)&a|o34qOe2BnuoZlMV!&p z@chn7`hlOsC(hRDa!gPTb*J!LBZ%1&RQzHxt-7!3gPdI*MQ415TtZb?i2_KdSMu3a zM9fikb~<M}9{w$f*Rf>yU6r0*Z&mWPff);zndXjikGqxVg}vfzUw|Bo=-CYBpFGYo z^+3KCAMI!3VGoY;$!SbPj?%U9)XR#Jtl%y<H=2HpR?XFT`7d`6<`LiV$b}K^dU)Rj zvSvAxsdLx^51$+2R6sHMa2F<*$ZgAT!z9F=MRebEo53Uap)2cU@?wq3;dFD_;U5iG zdzg^8WN#8(W$+|sQ*AwZ4eGMJZ7mwW4(_NjPJ4PV_f$T5y<NoLb_D!8AzkDp?p3!u zF?*4@xdSl2uIdjeyAg4?NQII$@lb4eO)oSXzfj|TXJ<>B3^tWWD8I;cDm|a91bR22 z3$q@za){bo1W#fGxRFVp(X(&|2a7JUgnC2=m0v@F8~CbXvYM!a-?dc7;-1ZV>U~Qc z-@GwF_NLe`2htg?PR<CNo-;BOMEqm?Ob3v51KvAt6#?l>*nGlYM&Z0><XcOT36+^) zok_jjXm0DAWaAPTVh(*xuP`&{84V=9U#d!Q$?Py{MXf2u4VMOHDjBwptbIgpCka{e z4zK4T>>#1j*r|_qGE^Osx5XnHYNV-6Z)1_W*%f*bK6#+6E=tLy>V(S2x0ZGus-kej zfpjEim}5E(xv-R)P)vvDgG{ZhVurK<IbI%=P35dmA7nyiG_u=DD1cw?cE0ta+Xtlg z<!rw*i#7!&Q5{DARdrCSsWlhv1EY0adefWe?4;1!nNMzG8^Jk}sUs>2)jk(Jt1Nhq zUD3jm>BFRF517JtD|5DIskd9<UCqF`a#Ya7IJ7UMBNK_#%%Tm(OWec?zVd#nq9(OX zBx1=|;CCu^ptAE>wNP{M)OXoqu%2R^?GpE(n_3^zQ|R^fqc>iR953xOqsMrH8d@6v zCXlKyUu(GRA{_NVElntAdyl&)W0WsD+r&x8&5BE$?OU?Om$|iDV8LoM*gs67l_hTr z(3w6-j(5bTf2(TZCr_qhGv6H7$?1wt0p-$?H7h~HdCb@~1-lwiL5s5jA0`P3F!Ni9 zivN<VnGBx|pu_gryyu++cevk?!RZW-NzOdUX%xsq`_wR}M%GM6vHpS|wV~Pt!f4a0 zE9jLD#CI@f+fM#1dXY6-wJ*K9S?(#fsD8!H9*N1CZpy3b5(j={%`+J#B(Lhu%zGL` z_|7%B$s_14Wrs(kkm0<QAU!pyg7X@j9Y+;kZnvS>3bM1S_||Otl3q+7e>6S+;vh#M zG<$mPvkIQ86nNB@tnmTow&HcQ*U8N{@aUe{$E;-pr%=ZEsroQs_W+I<PS$j#hV22l z66ob<*2=b+$Si-$RXEk<(ZSbL5s-cY8h@h+(k1m>cNf#-CG}&R`uV7^-kj}qP^KK` zwL<-n>8Um4ZELeaC(@^hg70oG?QbIS<{rQ&|7Mn;2$kle`U_oiQ@mgWY0cksMGsT! zlIwM_@2a*adHaLt@+E7tI9F6*W;7-X7%6qB42o$d5mQt@U>a{GT<ULDa9b51zSB6H zl~-nCPQ5ZKSf~}9;gxPM_al>$w{LOL&d}xa1&<n_uZOAq^18ThL#PTh^;HmYH8pgB z?u>U)PgLb>FLSn?oT?y4Q6{#!qVY$d*y0miGs&=m`Xy(3j5pq`0TEr*z-jAbW|H}p zv?3P0-rS}qRbeUrgwa_kX8f(6NDLybCAyli+8<=iOt}Vq%aj9%c#cfi2htzn*5gPJ zv9m0~*%o89xt(K7ew3ir)M2K5HJE&aym`Vziw}qx3?lAgXTxDrl^mmn6SL37dmCjk z<2wGpy*k0<`C_IX%7BPz<X3h!J~*F~`JZA;Jxrsou-ClS)$}t?;St>6G3<K=(bXA7 zdxl6XhWoz^ew103<hF2Evqh&vEu3=yz^Jns7etIc+wSTUoVGBWrxQNnB@t}Dn{+s@ zf9NROg7X~2rEXzsiNaE<jVcLe>&NVSD%`Ga+{#*LuIobdFHgIlIWJ}In!|KjC(~nl zgr}U3>6^ZEyFUmIvx8O59QNQEwJw!jty_ci8HAFz<w$Zo58rxT6;R!It_?65tJ~sq zTy@{lxqL-W_Fvndj$}f$i8#nfwVka#$qYPK13Qe0Uzl3}H<(-;hFXd+PjLqq%Gy-M zw2r^?T(zawd`G;o4jr!P#P=;SA)Ve##GsBj+b7I^d||aIz?f{H!5A@*o&Bzx;Wu4& zU$cVOyq{z~JKKuMqU|ac-x{fAsy8wj{oBfLsa-lBG4qIAoXFiJVPD%@ble-On`C1m zdct+oQhAzM6K=Aak)X^&GQ2SCWFSs`aggJg9EA!>#&fL!<*Li>@c*smy>6@{@kXQY za$Vl_wwAnYFVm?lL~TNzs}EY-3V-H8JF|kk)bZC;=4J3BKO2REv`scA!+aeNen?3* zMs5)oP}r&I*(9Xr{gdui5IxzyZC#ODexx#f=5#-)sh~kY*^ryE%S;G$=@+vkiS$VN zk*{(5mVzAF)lL-!o4KYMscj&=hicaX&XHe#MgtZnVmh0`HnI354x$<Fs@U9k+^#b7 zR?mgvkbP!SQkUYhUoJCipY%4S-&+%1yvKqSBy`@Z2`WsclNFg$pN1B$qCc>+3E9~^ z=BK&KjK&0z<2ZUH8C<R*vx`^Bn)p<Og*q*9@Ct2t9G@l7<`?mZuHI;n#N43Us*+Pf zN5BzJ7^8dWxa>g`G5ZHJSj~Jw6QXM=aS)e|)d(hjJu({;61}LmrF8^;Oh&jtRg=Vi z<!o2T8f2IxYmchZDB=C!(QlIv&XI=IdQo-{=$du6HAM!_cCdP)1k*oLaa~K{h>YTF zf9StBg$O#$V{{tx+#KQ-L>IL1O7&j-Qs;QCo$`(F75Qx^?f{gfYh#$CK90vwlq&v~ zNtp($;3rjoHQq@VxbF%3(xk^#Pfy;&(_MJ3-7z~`NPgf}YcSmJuIjBG$y7{QcBI~h z>DE-6NSwi?x(v)Sm})l;wX#ON1`&3v5=<an5#OyJH;cD}-yT?PBc5x5sf#D0(F$$V z1@%omRa1DbDs<RZ*(+51!R&$Srq`o&Ds!Kh9m@QqBwJphvTuShXNcLn+;Ex5OiNv~ zXcRSJJGV>xZKS=81}X>ZiQ>t2puxsT-Xu=mRxrzn??@(kn(HvV3@u&*M0|py9IO;9 z;vammVzM2M-(EC+Po0E4NTVm|?B*lyms&}!Nw3yX!z}sGTJ4qZL}FZ_-t-v**aHt7 z;S{qkrHI*g>});u->ZIrH5rN7MdAoMn+>-q8*5EQ<V3;yX5dGZ29rm?kiz-a{;;l$ z@S|Sb1o@;pa<*PKFX&wyoPA{XiP7xr2KMzQPgj9X?_Kf7W}@01(bd`4gzW5H&07y` zM)6A=fz6#&-&L5Jr{WT`Q<>v^!r4v-W#a10dKAvZMW*_D(i8p83ht6O7gc+8LB{4S zzpd;{^8)lt3Ii`eWv-6P5k@a;0zKsQob6liqX-r3lK5s*+S+L05?Ydv&GZv)bGEPr z;fUAhMP1`;gVb1dwmjXXh4!3@MO8?lf5Q+#5Ob9q+k-_-8A~kyyCV5~8+@^Fkq&J) z5C^HMHh67C^fo33)7xL1?NXTfX|U@%E69U;vqRjqUQ>dqkXCaONH^6l;78qUW#Px! z4kT+7Su>FyV-ap_jJ4azn)aO5dsZ+>XELv1@TePEvxd|1Fd@>Me$5*Z55KJ|d0Q6j z`s(J_dvr&7I|;>m>TN?}R+C{{R2rPQS$L@-CX<<lFXUzBqO%TXo_s8-xi}SnG%NT` z72#bMGATDUS~E?3U)RB%i$H%Y&}EH}eQA%7H95(`SLEUjD)S6^O1!jjz@v4#IG^<a z#e?7mt!*ik)oonjTm1bHvWB-Ffb=t&iS!axDTuDLWKC-GkQ<UyL<^Z%E#bU=kmrqf z8^AY_iat<JCO9i|UV@C=2cONskD5HA)&#<-e{c?~R3_C=u0=6^1&`+7NJPQUdg!0r z<{Sd|%^-tW!8LI129-HPX2-!AV|SZK{kKjD^C|=y6d-Gk(?M<tBF-hlUV#P`(JCP# z0Z#n@9HiRRu-L5Q8179b`;&Kx&ye{!g<$nS%~A<bODpgrTvLfz%Ob>KD&19o<JMz; z5Ru=k1Ub&BcdVih_mOhp^h~w~QDFmgYJA6B`d|7`q4c*VabrTTPr>Z$A(X;q`AQ^; z$=i#ZLLBx0SAhGZ%vTF0Xk=Nc%v*MBwMqx`TuHV2YVzZv<>hSS=$87uUSkHp5i`lB zI4!rpgIlVfdP?2~ivHa4`5KeAQSkIx+(3w+1F@dD&<tR57^u7t9lBiJ6OlH(ZNemP z>6o*vtFOY3s=;I;sCM<q?l-s+6Y%@EIV+af%O;^2P0kAKACtG&%_=)YRFi*Tw7f%s z`q5AwMpfh#4RM8@fXS&ruK<05vrT8e*$ZMCb3LnJQ+L47<aDriz|i92o@~<<QB2u& ze;om%?!_!~VtJWK-ec-H5z`&561}risdm0hbm!t*OTi5anh(^Pe{c?@nhbJ;sBNko zHS~o@!mX^KDD0+uYclZY8aI#&Sw}n&yfc-^4g(Ela<-kBPrhV-k+;jyjJ`U99-uX~ zW)zw=lMI4SUgQkUsm{!6r3MlE(T)2JCZ{G2io*LU;0^Lyjd+g9z_(x(sy3@aboefc z2%81x;EWDrt*O|FCwelqCbI|^yJan6@HsI%O8unP422^;GXBIjzwJTH&d_Pi9kUY6 zT83)ZkG~$Q_Nuyc=A%R|(F{-K1M!`e%2YRIXZ_jPQ($riR&bkd{TCmz4>M3f)|W|{ z1MGiVom&s0x3r#}ttjHlbFzur57r;$xq>Bk0CDk7m<0ImMPSvHab${`Pxve|;Sm-# zcb?c<&T}nf;@5|m9c&)x4pfkAU`#MbU)IJGkHrF};g<3DPpctBOe65<l#MXuskgN` z*@}7|XmHN_!_-4MFu94^%J;5OHSnkt$(r~Phl#Eke6FBw#dFnxd0vJ`G?iW|;~@}X zDqhzl^jaKd^~a*|d$ZbNdZ2!X!mn)Oi-+`#a)IBM;Zp<H*?RaaXE@smte_TATUyVg z19HwxWzI2^yeHceU606w#!NXTz#r|0wllEqT)5h`z@s`K;v-z@ZZeUYLBu{%D^xD{ z(FM*n8$9_UapgzEbkd>pj~j5dUwOY%74r58YIGEiV|6;BJE*t$h_13AQUN`M6<jlm zsJDgW3!>{3XM2zpoW$iQhX21B>>9@BGU<lwK?_`tH!zt2GP#-#!rbJ9{i!vF@gw|D z*ynT;GBKy_1scpVE#d!vcneW=vfv?mJD3UW%0$<C`<RNq2#ob(zh-a>*Xj88q$<3D zPo7}~`@!VXG7bu)6Fm8=?!(EZLXYlc58~Npu+$-Njs@Uh5OKgSE68)WU4FJ1?qCgS zbGrZbpfM{D@|0}BbG>87MzaT1ao?BH=Zt5Du~vuG{zH7<$7>od8cQEA`6V^<G%GkL zBSZ#R>Oh!GHPBlS3r9f2=&JCPDX6;eh(EA{)haEBxJsP2A9=3HoInJOx+_&-8=AE_ zp3E2S?!2Hf2C0D{qCf8y>Vup68om`9A1#MoNcZ-SxrNs>lxnw)zyC`erYb};883O; zlBt7|@IHsgy`hKW2Ba0=aQvFEtG~d5d3b|OnUmQK|M#aeote+3CK6+rliWS+%9QvQ zvL*;FbwhQd3zS%v6@M{b_Li(k!gCcS!+28$J9|Lz#!|S{d!B1oOuapaLz@D}Zzt#F zz^0m@gs0LmDkwbUZ5vkbjrf}UA0{v47DRkhSVpR77Ck}xQE#_VYq%p$z64Qgj)Tbu z<PVXSogIz>X$Hn5BEFB~4d%ebyAMk(2|IjFe9r|r{-)kuvyr9@_n<5A*&KQ>e)d-0 z2T)t2m3PUSqv|o4(-HQaRW@U$=8%bv_gs)DsHQjSQaC*)nY(ByJ!-tV^dE98k<SFb zjl+c7J=k0p@Srn1VhE}^4#=?t-*v6J2b&qmM12dC)p?Mkq*=oX{J`0NU}(q8c#tCt zT&jCa%<dy%ct<1-ZGSNNCo!9a46CIN5VLXYeQrVb#?_xs%sx;H;l5+&*Zi=Vnb9~& zy-f{%_R(MT0(Le#n7k7Ww1XWut$NZoEQLSH6s*Z<7IO+|$=xNe?;tR_C)zF)K6#vK zvsqPzp+$*8<n0>rb|{QC6PR$C&U|wFf?J3Dt~hM|3Q;fz>>9yz*%x^7U*<BAn30|B z33koqzC>1{Ym2PNDLh~ghM-xi(2v~A3UYCSstmbUSWjh&_nKM!U*7g27oLKOaBK3m z7&F?7VCsMKtx4Fkt?=Zy_IXTnWd*fDsCQe4u36NjPc|vH1-62Q4)qR4lgX-js7oJt zgXg+MhP@^Z;^2r3!R<O?qR6axIIl@`KOGmIyoq~Ze@TDV`V*FV4-f4;d*H|KR<t!c zK(4Q_)B<`76OmbLZ1F)HWzO(EE^#DzmYp8@D&~`)n56KdgmB+jx*eymiK*uf%oSNV z4^`ozuQC`e<xjos0{?$N78?4@Ink`e$=kcU&t-xv3Tpl2p956<MK~hAZCa|`M&j@f zJ%zeF*N7M<^P35vc3@{DI5UgBcq3fA9X80MGNY)Vk>u?lI(#SbWV+&$N61O+R<yS3 zrf$k4%;t8%6$<6NeBhq>^-BCvVIOjza|E?!3%U4{Qz%bmyeWRdrJ9nr#aV&HXSu?g zdaBz@B9gmSt<+Vt!YAru68ajG#TI+tq#$oo<2uG?hrRlUnPdBiD$<qHIRVKY45DL{ zj2S=XOxS~Z;Kp}1vz`lfDI3aE&rI@mKb+pBHdbX1F5wEriBXriK}45#gIwVTLPNaN zBviYeM63pt7ofuGfXQ<?TSMhY1|p_}^~5!onem&9E0magdByi$L*HJK3g@6|3{MUK zJ*`_pZ{qz8N$qzu&~m0J4!}G=kPG>#3P)jct|`hqM;=ZrAuRPNm9aJ5rPSo@0OH^` z*fo(^yvodP&ftFFFPwu!s4#y$j`+UMdszR)@k<LDd_gx~B)$(*71E#;y1-;g@X1KG zG_|=Ex6PCYquRA3yA*Rm>*+D}f+wG%2a?8&0J%OhPtzGbxr2^qd(Jje&Sa$?Cm4Mj zB>k9^`HOk(U~)jBuyevE%dxYM?S3>+0nj)CtUsVi;T&8RUs0F!@EnW6z8&!64t>@- zG0wp$riCu^T(8OTSY!?NQSDuPsR`s_6yD%KJpHqDyZfMT!{Nz~iJ04}2lHBq`Nf2e zMAuuGdQx^aA1G52g?-;{r{br>zX_u%9O7(O%7?<WS(yMj&EHPMKXp0V!KR8$C%%JS zHQ|S^K>L~0rDk#p{jDIAk-Iwu$?(kJQXF%d74)N5@DqRXCc5G*{hBM%2cNv5ox~or zB@z?h9PHxl3CZD;*ST3-42SduD6<T=YZwzqcj<4H<W5p)otSU!qko`4`Y?Z=UOwdQ zFK75{G*f>r^T<|Ig}p@A5HK!<F0WTH)AIqBdY))Uza*MV1%n@Dnb&#^Q!j1%nJeIC zD%Q}9dfOMjEjBuEEmPV%`PO?>GGEmJSLmGmVhZ4l6$X*Az>}oeL&a|>vdR$dUS1=* zFMvn)@Z0J#$GgddgNSL_gHkvL<=NSrXrSJ>o{On=uVR?`Ox*WBu(=LYg#ex_rEa62 z!6)mIx6wPxZvyej`^2m(1LZh&_PNPHd>6)J$c2lS)Ldd`yNe=pqWV(pUQiudfQZrF zMMwI#5h$8$>_Js_wvI_?L+oxQKT?52(R^|xd~zaQ>Svn{^gN5UPDj*q#?zlkUCQ$x zo7>KAU86Gogi8$-Yl*J(yj!Rw-&&BW;Ad{*_zgpaMaUsUVhBv8kvb+_k%KocPURL` z7rrwEPj{58NpFA98J|Ubuj21NWGDRTNA8aCrK(UBDzOI{*tIWux#@}uOCfKfZ%?3W zE~0N=%R)@`Pp0C>0zGqq9i@obJmxJ5djV$~pR>KMp26&SbEphMVHd}jx(t_1NgZ#d zuj_uMB;G|B8ozps2D*(R_EBx<E}gO;sJF9urueXfQFIlKnMvGmFAA3$M$EoL2ero| zP7G7;0h{}R50IA6R%B-bOl&ZDJ8uL?4|Y8y6PD6r91lwkr{1>Z-4wN1Yg$-pnEn^0 zo&|loo2=Q*TCY-Xzsibo81?okd~#t-#V@7j<Gw${73#^^zJzm}WWRQ+0K5xV6rn0? zz||j(TKnIM-x`<tEy&Rq^qfK*T;YVHEB+DAHak=G_c+!3pvNF~b|Jo0Hu0JGF2?>} z;+qG-)GM)qZT6KZ#wpZ8uT^3N893X;)TR9R9Bn|PD`aFe=kSWcF!j|qE#o<X9OTY% z>TN<Q{%$x&TpZt%@Wg2<HF<l8X^!ML+GnU?+1cGeco&OJJ6lM&I7sEl?(=A%E;xP# z>47Y^w{ehg-9hl0=-WKz85Ms7ov5$e?A^~9EQUv{W{w~|eW0mu>i(c|QQe)Xi~gp7 zb#YH7%Z&W(leh=NLB!6?QarLgwhmgM2@I(sF&o?L!n>#-;>hFN4BN~eY*kIT$(Vr~ z8#65LQsS*-Wl;)s@KVd0?{s1Q5%s|Df$*-&a5_{T(Upci&;<JUf01F?_|GTQ+oEWN zo7`f{iQ9CC?;WYMYzCjaVvVT=KdB1F6u@swV2;8$0;r4^=qns1Vh&JiF2?Z5q0}W0 zE<*t#rV3mtfVsUOG=3-M%O;bF52;T1c~j?Q+>`7$+UH{8J2_AHKu_Z4XBLoSyQ~JE zd=itl5t28$;U_;ZSx{l+_|{^2IzIVb_+%ecSQwqVLqzyiRXaxG=N2tsbK&4yVOVMd z^0pZ|@B`l55Sc<v0%gyWXMSoBlY=j863+G_PGUa3b-4bmS8%q4QDKK*v>S=;J!DO& zEY90q=i95Om8E#Jd2l5*fXQ#^w~q%ozM=#7quJ)s<y<A-q7~{g9q=AjP?V@`k9*RM zdi$L>6i$#?sdE=t!$cJyXKa<Y$Jy4!pKOU5uZqG>WDcSgDv1QBm0Fy_e*Ue7x=hJT z{WR1{8up+jpKZl+)ihol?K$W`FW7a2n3)DspG*%#;xdfHLFz_^mE^g;!;@>^GVog` zG7I(K0QJ5VF<TByK1yAxO^&x_wE^^xGs2T+aC0ZQJjp36Wp5Xw?G94yYT>D$r`JpG zgVSw6*3_lqU!^Y9k)NnxyFj{sL5|5(1%9Q8*{W~!iYgJaLt*NZ4DWvv=fy~-DTZ)b zTd3k+Wi94pE?EUTI7g0`AYx{tu&>Y+Zb@al$SEu%YS*e-_{knBejnZ?;$voV3MKgb zRrGC2bRch1k{XV-g{T=!wd+e4=8et34aEm=wDRbhsW|n^n5D=qzVObC0@V6_V0a_m zlarIK@M`K(0kavui#Jk{HHGQItOdLBfZu`CnWNxhapo+)i`;ag)=-<Lpxi6-TrcR` z<+Pu{u3j=W4&nyZ+J#!vg6Xn{HX$>Sx8X1WeDgBAi^H64Sz+lb6lVoH$;FE5C|T2x zyuE5Nn3dG9N<7zTcGk<x!B{3g-oU>%aAK3u?Gs_@zD%@?q#GCQ-xSq-nLHVSH)p9! z<6wT%h{JuTuy9!)2k9&w<Z9d=YC<jq!2eUhrKV8vlX12+aRQF1MXC&lC}HZu@UT)* zn*-Rd-r!MBrshKJT9jxc_`RB4=!_rHT5bXnGs8Jvp_l8CUvoi&J#-EWfXRzcHe)%1 z6{;S(JvX=3x8O2VA-cK{Gp*1ydCeo-llFL6r?`ziiPIg1LpzIm;Mu_BZ6*;@2d((t z(ezn|;pTou2e!t?t53#^BMM&1hA8ZpaE{?b*Bok6PrZ{4_C=ifN+JqQodMTkA>K(L zW_r@_#*I}}#=6{59Lo0&Cl_nt&25Lx<(AjkgBhr`t|}3p<8$1TwyYo-%Do$$axM`w zo360s)?p8(DOyvLrhzffWB{(`bJR+2*uez8^>3V>oH%1c=-+;4>Nq_yxPou4K;HUO z6*ky6xZh`3X&|3HuWP{Owlbq#Tt4Et=8<FFh*^F`QzWN{z1qa3iZ%lkr|7SA*owkA zcEjpj^yLb2u@(248#8n8%%&l}gV2>#iLT`+kVQBxQk>)s3USG>Eu2_eJ{!oC;dPsU z+1Ts+^(xe{4S4ETaT4pGT6YtP(}~%U^a@s@L@Uq%xQcG(*9Bq8!}KHiC5h}cDo9!R znAI-evx9Jchs$gD?+wU>__%W|Q32zK#I`2N?BUK`UVQzUAlFV#IJ;U5Pt63M+e^21 zIZsxf3i6G+jOD=tetng_ZO1N5$D<9Eb?6qnpf2!kV@|glxwD7aljCL}755d>RmteU zEPx|aVa_oV6K<RE^=oneb2#hmi{DkkJf-HhLNT47I!`BVN2#pbW&A|uc4Gy}iLW;7 z!9V(=9>Y{-6tf?l=r=cErP1*fB5TWKoNi`2i22-U#8-dxQfBI1|CrNVfGg6Myd8_O zIm798;LhC}a_lmD)ef|~0Z;wGY-~?F(o-nRQLMFvlCY@|k&!q1@Vg|;Of@6VC*wMf zFhy9wQ9M!?oj(i5r#kUfL(T^~($e2~&aSrOg!k(l<_tBz0DY@@Fz`Nnb_5eGCs;ub z-k|W)1acQ+Fi$odOsrwv(^+T@f*)lCW0{ZW!Nk@qCNB!(_8dkzFDGi75MQ5AxCPKF zyTDH`S-zYnV|ontd6fvYIhd7sr^k}xZBYPeL9f4IULh#w%<R^7VzC~R#KmA<2dE+S zsiQrpO&vI~!X}t3Zz+<>BeFbayPeD_OwZ<zD8-z}c_tq=Qx_Y-Q=jS{u<94wKW)U^ zL2JHq1*?^+8`U|&mZIzb6VH`5GLVlJ1g}qD_NEvcQ$scpi=EXM@^J>*M$nr+PsCJY zy~|kbB{PjGmYNz;m(QIb5(3n58H?UsA9`Hz;L5e&s$KMDx+^I`x*c?e<8xjIz|WEF z*I<0&PpHPfLGUhAn~Gr4cO0+gG3;}_ECqI*<Fh@;u?qN2+hUyRHRN~^R<Hr?_tb14 z%cHvxeW}g2K=Eky86mQZrYPrkRHg#(j!sO8_vRD?)p-HgxCVWDo>=sO`>htYd9KRr zRu!~OVbI1GUO&+`#mRdH>$m^|KSHndhD?FmGmsnJzlfF`^!@9S3yt8kk8$#P%9OB< zJACgPuy&|C$c#h=x+~|2!yNFQ5%8W>rV}n!I6iS1p6e8>vN`jvd6<UVNPHIu59(8G z8iTc^K(8I(XI^=S4(cjc{S+AGQhKeKsg0X(GiR`~yiWs0*`M0@0iU>oH0;3^zO^?> zuoXT-F!9~XJR@rYh=Yajo_(m{A~<==nA0B3X-&fyItlM-iT@pH$}$t!i<liuhBbwC zoZ@YQ`Q;@}VK{%EUtY)8ze88F4QHF4_X`b2J#Rv}&o>qAAL6??bu@sS84M~vM6b-I zzmwIDLj$bgvy-?hPzVQSIBw5J;yV%geiU`VpP2QfE4qRj5<m@^45yn%W$J>jf0h;G zgZ~!84;cZI_#^wnX%jKcu#PIWnU#(p6H=Saymv4Gyr&m9*O=A*&2Ak5yZVdcHXaE6 zfoL6v4h)5-ej{(2h}d!+eeAZX7kCsQ2g_iQkN(abQ;yrJb6_$D==sk@<-g#DNpX3e zUVeMlTL|S|hc_0vHjp{LG)#)jpf7!kskPIlBdYNTUE~+^MgQVtQ!}}j9yNRoeK!%d zzK87E2qLydEi7feD*}z{gY(@5Jc^J*!LAZ8lsBd!6>kmSdV=R#PT%SsZ>KIU&&ph! zKnGP2&#xMlDZ<tw60?8@%lX!qAmS4`g4x7Xs#q8&))w4I2vd&78(og!42>rnPwDk^ zkUeHNQ#D8JUsR^0(wE7}*5K?L*^L{D*?520Q&8p|F}RVO$xFmE!NuCaUF@6eK}*$? z8g^V3U`FDJEx=SuDk6Lx=pBw%9}XT>V+v_J-PWqCwuUltiu^1p@utWRrX_lKw_eMv zX=<~OoeiOPR|s{LK{a3(vf$%YL5D@zdfZ0IPZwYlYj};adB8gfvWZ*ZcbF{1Q<WvU z=fG1th=Vo}3?&X#e<z5X%uK`=I>bA#rJRdTTLB)ClMX;zA|?}WcnUIg&<h7yYX}u= zAMa)RW*0Hlew;X{L9aO>xRD=~|J~NMyG&m6@OEYl!*R;P@bz<oh<|am`9Zj1xZjh& z*_L2(5~`>VzQ|5;#?Q=Ts^%1Tcbu3Nlqa?_qZ#X>aFf%!d&tgyfzcl$3TluE?O_sY zas7_aJ1Y<Ob>$*>>R|D}mO#7b#q&DCbH(Sp;@I`<YzQ1Fi2W)COT8yMGI3i1HEhig zx{^1Us0k&%Hk;BY!9h%7{VTu898CDdVWPblwMNhbxNDjkmz7@Qu2}<f%XFsSyoyuU zO5Z;xYyHgs%ZGP3-?7C(nIdTCbNGk}%phZk*)sGmI}iuSRbG{n8I7*=T1zvj5@~wl zwp?Ph!OUH+hD|-R!|`R7Qt$FJ`{Kh2ics-?*@oP8D$BPXXP!L*?0m?*^_1c$a|f4k zoQlCBUdvJPr)a^>reO9uC2??qE{wnV*QBwBsdm4qOK+)-`CxO$Q8q_Vf<x&-G^gi% z0p9n6h&fNphST54B{xgOCv(8m7t$M_0IRMBKPdsPKBI4f^SwZWDR`t8=;2<6brfbw z<)QqWxrab1esWyx)WpGQ{ha4o%GB{`+@9ZJ3@gaO_r{@XRRL!z1uF<OZJ8>+LZ$o7 z&R$0a{YEurk*k@k&q2<7k~7G~A>yg6jCL<)KJv+j#OyG3b^*NW3bpwhwK2O&tgaEW z4+Ot>fVTMuq<z91^D8C^)}cYJ<K$^p@Dd%8ok`{$vM6uPijChCWLg_R9NfUEZ({E8 zw$4~$HJ!$dtRO4S^E)|NI@FqLwh-7=j9j=%-!7FILv*cy*9UX9*FfcLsOF2ZIr_2? z4!qY4h0i@EVm|58W+!~|nH`BIF$*S<9wq!su0h=`ptsS&ULwOH+1LBjgihuqTs@UI zfG=}I#v!`=@Lh+?U!o0|?9YTiR+!f%axn{8lhW=%F@3>3ctL#U<!n#DsZWV4xU}!h zU&i4bke4~z8s-$8pwBq)S>#&yTuyM~tDHv#n}`;z$%Jqju<L@p2YL@QztPya#U;-6 z3Nf3X8QMFt3piT?#gq_V1~;FY^pc%j%bmZ=whO9p63>;L&w65Zc0IEMe>3^e%>3c+ zUt#W|H8|S`mA{b=>Mr_+xv5_-<w*Hkbl_$|e(F+T^M+48=egz(vwN8V3I#dn)DYdV zsY=!9L1bc@A(FFC%^q+E6i53KZt8awKngPO4Y}Z_-piSEcgBd<AmSzRHWroq6`X4% z5i^%A_8DA}J)Er{yLAmTcq*#Fk5bdaEn<Ga`68Gy+-i#1n?y_$JNp1%+m9Kj&E#VA zbM@hNTsM=%grTqFnU1(<eV9<#NcV699(-D6UtY-Z^j3O`o3<#LtvoF85%(Cgn17gX z+hD7T=P}Rqe-YD)&U7hwgu~=R1~M!NZC4$qrILMu_nS~oCu>rJT;JsinFFWX+D`T! zRUtNe@QOI>&%J_CHnrF*D#*RyQART1p6tgQRvR>SZd6cF(DM<hrkGh}vf3js&kwkn zK`^hZuvvb;1vZ(Pcdta40X)|e@=JjWx5>p{RPoGm6}y#_&wiD&+1ar~OdxM5tj=y- zkI975aGpgtQ`fltc?BP<2>$3pQ0^H!yM><Qbe=1i=z0bB-b`QkF5Z}j3ipZHT#Wj0 zNR~ml`!bXGgj_U4!9_a$jX}BIu#>GI{a)&A30TA*IbX&HXK%5yn|Q7;(EB<_KMa?6 z1GAPd;mN^ZOnI;?1Uw27#hH=*Lrljv*TC7w;L&<h26i%$j`s?fUvW5BN)WLOeD;rR zY)_fWWWo^~tS>~@L++ROi*sbc4cvpOOecHU0|%%4piM?5Bt_lrCL8(9ZEENdDwv1= z{f{gGH_6H=w4gJch6&}nWcVk27<TlMPSi<UVkx%J5j;Z_R%S9+!8lT*Rqoil_=6ci z@BMtMFZDx!F||0aAw+j>)|v_C%da-!Q_r;DOm{N;vOY<@FGXdpW?#|eOD|WF;rXaw zR<37mZZ1xF6W)Yc6V-YdZW7n@z-1U`(~HAo!V&a%F3|g_93;Pr=1k}2ptn)LyakV5 zvs?2~KnGCcA*irx%-Llk!;eruPNEe4wc3ovb9+v$`w7Mz=jMJWbF{JKSh_YTh=Opr zoT>h~xT)>&NZXQ&4{%cBn9iWwK<0xtg0pMrZupa7p;WLa@fUt>Vdjp@5?#0H*Q7O* z(fFId*++OS7m0(cI3icr*=wR8XKTUXv^Y*T!P!!H&lT-cR^S6>zXT03GE1=ur4Ws? zt+|`l%qa7a`1Y`tXRIKZ*bbA~D1XUxDj9n)LPm=AOcvz=k4mv$_lVidW@^j|s){G{ zK`zKx?3RN4H-sPMhoQM<6!#Eb@?1Z857Zu<#31HPePB8-P=bEs?Mm`?G2FL3D`-Nk zc}R}OHto=0(a5n0mb#6Kp8;JL%nH2h!6loA`P>3j{44B%KYQS7*RluCa3tt1g5GiQ zZyGZ9T!5Q1zfC`U^?RJ|CtcR;rq(>c*H1zuewLZouShaDE4ux+ZH~T;j)RNTFoQoC z21iUG_Ru|yj)UANun;+niINs@-%PO7%y>Ab*spYEnn^*esmDZjZ=9jj%*Dp%o@{OA z9x_sEJ`sr?a^VcVK?VGXy40GfOg=B9FPei~{3Vyjv~n`DO#$5Ds)jpufxL|akNAPt zlO0SBl*jNWbF#O=vJXCWJ!XmhP@*}=@oV&Ua+_t$w4C96SU>2p-DeLnaSG8qVvk6P zZhuQuCj#joYM1+4*J60YES$V~pl1>y=B1p*B-k)`L^Zs`Kv3oh@tqcq7=@pkTbv>r zx8t=WBx}yWBZ9%Mt?>T^)TIcJK9Zf?$omt{!;`;)GM8b>yg>t=QV{G)EC#cJenjFY z{T990$vlQ5M!{s#a|$8EjKs|yDvjt%KQ4L&^}z49%<UDRipRIhxs!C6J=jMs_`;HR zkzto%sjI2CvxtL8m~T8{hb-o7`_Tg!hQbx>KoD`343FWD{R{N$&V8%zd}~fK0grYf zJYpL?u2o=%gH}39);tmQ>BkjhM!724_#HH;Mb;F8p*0dOc=yQ(R$$QY^JOkn1;3yL zdX6`_spAp!HF^-Ue=+|)mAW*B6?oB&m#8&fp6eO)_9pc(8Pz5dMm-xHx`Z1+CvfN1 zata<YVVA5)%$8$k(}6POnWg<q6x0PdD%m?Is~<4+b7Z50^US7aw2(U+{b4eLP;9^8 zF=?rGpLjP$e6a#1Ge<sUt-s01Zgj0$h|9J#4pJRF$}d`gAS-c+_fi$^!ISsW2{B;8 zN?C%pJ!b~HBt5PIXzXyj?{+ZH#<&6FgfE=rCI}uyo{gc_j1})}Bc7`hoFkmO3i+tw zj-6w3@mv+a*VnA|yWEeXeOpw7N2ImOVW}Q!eqz(uoM3wK9ut8P_#Efi*+`}}CWG{I zg|Xe?5q;>${UKs=!cM-S@Dsv3v-4b!S;1EnR!43Cv;q;!kTp%HHj&hX>cnAYyMy;w zUlldv7S1+`xuq3ol|$gsD(ccAQ<~^<$=XilCcN(n?+c2+dA-aEep1QCpq8eB$=zVz zeW=ZmU_m}A*iYV9lmum!ove9I&*B@X&<ftyfQTs!M+{_VzkyuUsN&h}L3(TtdDGVc zzLhsJgY<>T#f;o6w(L;>ri;F@vt6j6twDqFB9WW`mqJ*;4aP9pGy*he%v&Tn;RpPJ z%jGlEnQU4}E*@iEXgv`V3*<T>o5bwwE*z1Kxb?BA3(+wPV}+r$74OjPOeqmvp`cAp z+#6q1#Wynop8S)uO=o(V5N7o)Za`YJL@;?9MI{?ZueTRYW>tHJs*s4uNH2W$UvPFg zKFdYkb+DZih)cKR0Mn*7L|JA(l7WatIInlqj{q22S$mrf?jJFj**OP9e#r{5;}OT= z?T^n*S2E!}h@6@gykI&vu2_dFv_ifk!xe5sfAm^s&bAQMt|F%uN_-bY;is`XnLdBY zn_|wA;mKg0J3+a_A}c!^&3)6sPhOBUEnsLZ?H8C#a#Y1@SSoMgBD&(Sv#-d-bL5ra zhQ((b_3<#Y1?1u>RK*^mFc~PvEGImoJRVv!%H<~$pTaz=P(Mo9Tefoy%H3cGlH$28 zVP{v-H|u9#qgj(v?Ot$KxjUVxZdNlNkdc^u2_E`zwnG{E@6FCuV3wdZnGgn(%E{Tr zw<~d}ui%L624{I=4)I+dG$_V>`~;v}A>!~2K57lT+$#1#OxE;<PkK4qmvRAa@*G@_ zuIy}g6v$`#4{2D-YpQsBw0PDSG_YXDIndyPXvW()@`7?Th?vjBcS&?;I=dS*xKF=% zH<eKkv+HDO&>$n-%jlTR&)I(Ex!O=a8o;H7!DNQZTd*n336G_IOk`T9C2m&-_TYO= z%uZx#Z6Y(IyWtTlnG_MA!6A0`g=k0(&4t%glezW?@-_e!m=}&%7yjRp&qU)<C|bV& z^EVm6BY|oz$mBsJZ|3WXT58AHj-}T+9?bB92RFfd4{t&GY+J!6JAg-j;ORxFA3m_} zT(G&aaGj4t;&*viHbV(lVTv^ij!1dF^)p#hhnOt~`~Hiw?LimBQSsCpxj5!*eW+kx z(5xA#V4qpR0P~ivf)6;G`M<OE;N<qhz3ENQzcM_zDelQ95V1Iw+0SkUk8ZQGd${Qn zkGwqyH@GZHqQ#S=tjfT<zQNO*(><*Z`|d9c6CGE{L<QrRDgEdNTHBlG>QCMprhoDh zvtGDC8u(Ezs?igo_6r=L1O1vN=$c|6eG}q9fQoh4+5GmTtuKOD!FEm|g3m8OukB)% zVTO&3YA%D@<e2Q>T`)WQ9XyH!23#Z(e}Icaac{=qsJFyx>Io)m=6#Es8AjUaObhK} zQe_!uWkAHkAYv$pcm$pteYQR^c=W$#djfy-Ej;-oQ5YNFU<KS@2R_RL?o*E7Z%2~h ze$>!saD!jWTKb_`pMr=km>i8q{pjrkz|@-<epQLHEk)NXIsCtf;MX{LuJ^>jYtFce zJPZF{Ppw%Ea`<q%8K}EgaONI^M;}EyaQg!hei1ea3lt9h(?4WjNmybc>f&_6uc=y( zm`Sx8AW!q1PjRxEku_a$CmZ8r4ka5CgEWoIHnL_F^Gf?fPO#+?dwU<Ztt9VysDuV8 zNL}i{iN$BnI-$iY*^9OTOuaT0|1s;m0Xs<tCZ{CBJe)!W{(fxO#8C5&e$6j_nK2H! z<1DNFz&d*3a`dLd)&zaqoo|%Xo6;zd#9(q>9FfArYA|OTM%ClDOhp-ZL?(1#4gNmw zXD1?0!2j<sZ~7LkaFD<MjjWjr^IRYlJmRYvYw{6^9;(wQc*FoElo#S0j3NR)@nrkp zeIG?f)MZ6@az`dA9HJ|bYUgja&>O$ZTT)i=Twj=qTR?Oj=6>K37}`>}RARn0D}43= zx4T1NXn)ACqwMT^@Ms`2W0PX)?MpM575K6X<#5S8b}9^Q13NpL9RG}7*ox=*P}Bjt z3gNfar-DcrT{9SU340Ew=b32EbA2Md9`OIk3G?)0XB872Mfm&5<iXQ?$$JlfQWfHY zT{rmTcT{E{Dd+-yKm$EBeOad@5~`55iKw^yb}DsgK0Eu1J=ny~-V?R)nu_2#wuI4o zaMIf24VJSP;E3=?Rv8Abe}FTQ8IG7v%;KKULLxExZ1WK5?_<t(A{uBY5%Zl4yD0mj z?FQl;w7?bW#R?R0Th1&YzE{!PIU-7eo-e?I4{*dlJhbxoh*@JYEIv#k898w>hD&wE zC+|dtg@ek$>_KL^6c=wG*fo+FGk&~UXJe1wQx$y0a^cS!gFx?}>_K-XBs${amEyS? zv(|9!5Ra>f@9lUp(N$q5=xI5#)l7*WM&I)5-EhQ$)aD;VR|kCG#!P~ZCTm9h#}RLm zVR7)9K9DtN4$kX4h?p0>W_h1WMzNo}m+N3?0`Fu$o$-gFrr1Z!t|G1t+#oiwyOaLf zX*`)%AjeryPU0Uel6g7X<lH3;kHO@x)X>y0ibr5qICt)n;+{OEE^3&}AkKCWSrf=j zj3#7Ew5ljbRfuEf!=+9Tvs*a>U$ppccJ?M+^ewnuOK>uOp@3qcMDUjF4ZMpVu+%H8 z)dwy$iyq7(m`q<Vxeqb;iPfexgUFgeFq!4l+xb-dILdIsUCEku^zqAp$#q%5M;L8s zcGe%3T0z`E*X$-|9C*Y=Sr+Fx7w&rk(4aWT70%hx{b!ar%nrbB>m9?Bf5X1V%7kQ1 z1iB^+|0XM#EIErw=(R~?%{uDRbh0KKp123>dQQDPjVpANY)Qdq6H^s-m|XNV0yx_M z;yRQ#d<3)2N4?EJRe;5F3UOIOW+E~OF7=VFnL~{`Lxz1OZ~HNOGJ>;hfp^gZJTmN7 z2{VhlosN656YpXH(G^bCY@@q%U)18(c+US~_75wlk0(<orY=S2?Ezx@C&)1iH(&#Z zIEnd}@#KppW;3zJPkFyobY1e5qj~z@oY`6OR*ONrM<ZH+v?IF0*@KcGM_fCX-p&EM z)HOW6<(s!rZ*Rv`{7iOjOvV3#Vr&4HDgh?9geQ06x&Ckp(aI_-ov_68tiHh~GZC}A zX&PJzgC~3GE~Q2*KOwpd(bWe>qz|e&07PsG&PG>!roicht)Sz78s}gudlgH4i_vzM z>1%9e_G39aYx&mrWZEg%+`Sk+*^NE@&1!?;;pxzJvB=xcDDbRQ#z<J|P@K%cMAssi z`qcmO_B77(7tx7cb0wI13;f9l*mrc^rUjGB{ilK6^Q~{u4CV2q3h>rHaE%p6J{uif zSGZ&U3{3W-fi8k_E;VdIjB1YNlOgPVM!FzTxLspoG*D8p9!#E3hG}Bvm~02<Xu&Pb zVrZbc>_G(VyDBOyE9$a3(bWKT`5AT)hSDxU2Rl2yR2=&+&Vj)bN=;?FMOApseM(8k z^g5^T2Ua<n_?|+1cSN`U4bDdV$0sA{nx%mC<N*ajL4$Bs(DwgVK>v---50Q{GEQbD zyDJ8}{!fK{U=PajuAV$}m*TR50zB6zod{R;DxS;>d?`g$h*m3caJ&AI$#D)M@sl6Z zD@aDS_Y09Yl06tlcWEpAt<_{g0<^*fJjXY1>a#J<L1mun4LM$cJ;+ISDVou?CAtis z{S4lfU_Qd1x}=HkY(&>bPN5T(u?_J(iQAu(h^{#Jh!5BUAExTx+otHi_MC0BbC4f? z5{vlG0i!L0r~U~I@(bS8lo_OG^o-Vlm8l<JV6=he0CO^zm?wEpe4nL$#OD1di)C&y zEE&^65%`nY(ShHI@7~<i?ambI?EjB%OMM&=!@Hiv#CJ2Q;ulV#SPbV_3GX_O4%`Wg zh>It)C#EiyiP1}o!2y?@^(DiO!#VELEBMVF-0Pf|4=Y$8voVJi2hQ<^yh=mXe8j2m zNp0>8?^=p?v4D6@$Y&pL9v0>oY^%em8{o;jqT1yB&lM_y5)FWtMB-t2VRa4VE!>k$ z|M^ls!EX-{d7R4lfT<oYO7tE(5MR9p=lo$kf-X!5*p&iI{>t>^F#NVLHo4dgcCCb) z_`p5S;xfE~Q=jH+cT$f$?16{>-tj-|y=8b*$=3J1_wMc_ga9Fsgam>FiQo+G?#|#2 zgS)%CyW0%zE`z&EaCi4WASCJTz3cf^H#y8X_qpHqy`E3+hn>EXw%V)K`Y)|j)gAKE zQ8NA$r70E|OQrstnmQ-n&XI<_0)zFET&>91)eB@hux~e>-P0jp5KBxvMdWah@n6w% zyo2PSRO;UN?P4OwB6Pb8>sml0h$VW;YA%X?+dh$#s;3TXD}~ifV={hmblU*yYKVuu z`x!m6ux}Rt2MYTN1*kYw@_v85r=|;MDJHO98irQC6FpC=-C3>l;;hi`tk~L9#prqx zI9Ni>v7Fd-klg$y9+u#$ddl+|8(B|g;PcfL@Nu0=y(JZGW%gv-v%~fWtJP1?jbc5P znwnbUe-?knx^jY-4NsrII&cKL6^n^o;~4c7{q7_$JtcBn7Ueh{+lsZ7l@&`pvO-R= zi}lhOa`T_~!bh|=lZ?Ne%(#N+xr+XVKj#jz8-2(Mjp?a(Va3*l%I^hKk72X2o^*;n z#P3m5em+#6CFr+lVm$quCG=g#qJ>Z7=PjI;dWde%u^K<=;=l&7^^JX;BRE8tAqx9m zMYr!WF<~lMVGX+#GdTINi0UvU6<RK$!8@a~_)gU$=z9JQP5xV&+KRn`?sOTNvV%Mj z4pL&{HK~)+fovF=F^sDFB=PeS`}z6R!(@dW=ypFfb#`irJov<QRx44Wp>mHN)<Wv< zo2-a?(Yu&Q|7I*JwxwjxFs!BmayjVu2`X9xAKwVJmq4u+r!w2HT4_iZZ6x_FBa~aR zz71oqAQv6&Z0aa_M>jxg9Ch+;PM2+BHU2jo<fN`IO8x(s-R`?|bDvV5@Sl_EW^N|R z8Ok`kW)S<gb6BxwCO6e)XWm<kV=X)b`|eIH6GhE4kDkmm<#+N@bw2OapS4;hte~rL zhEGB46-BAL@{+@jL3KY>a2j?Fv-0_lOq>8}4yswnACrw}x+iam9B<iQT8-6Srao%M zH&YB`$G;!d!7S_`8~irI7lT>j2cz3mWRQKxbsCE)jLlYN_p}oIfPTmnh7}CtlU7wZ z6Iq?rN@2#FqL$c6_3g_JL;zVK9j8QE(>2JA9WG&gJD4u@AWnuhBzK)8hA*O$d7*Tq z>)Dlkg$3mNB1GFB_+oaD&8GatzCstG@?rA*FnYuXsML=UyY3SY>SHzakn4rffG$G~ z_RVq<-PRGmmVvB|HNGGFoMEhR`M=zt+rd~zB{Pzk%*p^em<r8p{H=)BbfnMGj~Z<a zo?DfeFqjocPPz=4@i1>{f)&)$tHC0i9f(rorK(usM5>JnMpG>2CHeL$dFd=#7=d1Q zBUcOd?PkKkTrk*6#aD?=D&I9l_hcm2HI&m`b<yfx^gEv2z}r-`Psxm5sC61)UsbV~ ztMnXq(nZ^dkM~Abf8#ry)s&q1&5nH+66aZcRRyh<R3}d2(R1<==Ml)WTcIlDdad-Q z&oPebccamfu{E)rW1PQVK<9S?@w+h`Y=LTjkUha!ikqz1KEXi?ETIwoh{wdEBYZdA zHhKqLh~V4kOSB<}F2TAsbM_>PzW?uZCEBnvuZW(kR$408=}Zkn3tOm{D-h}X@Hyzw zoWI#kucanca(_+-hlz#k#?cdI6*LLS{vyVNqT9;sNH%77XDQs)#d2qWES*K{dk0yx z4fgdH-JwQgu-VkqYgx5M!Q~(D+TGYp|9=SILew4~FT^Tk9=r|**}Lp-ec>G+&T|Yx zvevAYqS$X=&v#SI!N+S8y%tj?w<XSQW@r2qz09|8(1Ve^sCnW!4S1VREFWfd*Paf_ zJUaGeS%Hk;`&8y*T^Ec=*i1WC3TLQ~rlQ+^><brV6+Vm6?a7PBiHI*j$BH)&VPp?H z;WeK@pthj)6ksp{$wuG_g8o-t?7IdWEGHUwARg|dI_X5luSk6oOl>%pYPlD__*@yx z=b*_fWSd!V+6%NUq1zdBNW0Q0&xOV&5S5zKk2uU~<)s*a7LFi&cW_w6%BrR~Nc5be z{2(e1Mq7i(i%w-Br-KiZ!(y@3L5!V<FD57UKf}KF;*AZVIUczpvDu#VdggJO;*PNp zy$(RG`<&ukLhKsA$~`A5wb4+nM>N=tZtsZB#QLMuTYZV4o2mO6pxgX(QyrY`@5$KS zAp1?3if-wglJEEqEXGcPgH&Re_{b;n53v^I+p6H99UNT8Z|z8&gNkwq+zv68(d{bC z-eq#4+I?!;Kd{BVAnQ$MtSnvP?(|QNQ|$}`t%KNX3u0GcIIzP(H+2B`<|H1CA$F~& z>-dpKI0?<JWPdF}Oe5pBBhICvF6x0NRwjS!W#{m@7=({s!)C@33l4Jbqal?{gfffX zSRN?y4bf!V=gL^*+9&GJRo@E-<I(U<BeNJI-hu2+`X?3XBzJ;p3RV>@sFUYl-%p8I zQ_$~TzIUY(HtR!$agA@Qse}AY=?Q&fZCsS|oBdd0M;U*SMOGVE=wNl^1X6A?$ZO8_ z{|*mTu!394Q2ICfsE|B3sj?Epc43Ekk?S+jb0Zk!XKVv{)K<FG4af?MSp~&{{z_vF zwTa5PupMOlZbVvdJgXiRYF1VXv*-@q5(BA}pOfiVv%hzjUHtyoY#wDYJ*2dJBCRHC zB|my-J@}O79->Tg*0?*#;D^adMcFHeVXt>RXKuqlp*lI-Am-F#2YD&AOaf={wsN~b z#ZjM#m|W?^O3;f>B2^>8WMR*09($Mf#c(q2Yw+JlmHvR*pf?#mhcXck(z!S&g@;FB znZfkC+Hy|hHoH1ojN|Nt6{h}=X63$$s2q+4s?sI5Q&-eypL03c#t8>okSmJJ+!zj$ zD(#5}Hu$Up<q-C)rYZTU4n~Sd7YCc+;uXF)fUF=nc!1}Yf^GpSsS{w}&;QwI%6F<< zLj&808}Zci3s|kxLJM(NZF&44D<^7J(;55B?q3nUd+<0M>}Gc>rD%=creU3akzLUu z@LG~{RkxJUd`k0@=*4N~M_9`ywDu9*j>m6{DRb%ego0I7I>b)8L@n9p+<+z8#3iV1 zA#T`2ZLyYf*G;iR2i1CIILJWsUO={cDJGL`V#tWw>D@eMm$L__u(Bw_Icw>IOchvx z`Jmf@*!OW_RR|rFqeym&lcq()bnLr4S@Z>dQy3J&*@xPUb=k$A)H0sf!G5|1w}>%K zur42v{ToXRXJk?8m<M!?3(*f4!;WAKE9?EnX;$sosUtYMLhW>eeZKr4kR6LTOpVAX zMRc16zd42uZXj1>>i@6U_bN`cqz5m)otXXpzwp~wB2^W9;WlH>&>_wQ?}u55_E3&+ zb}yXybE{sQ`xr^z^*R|OH{G$zjE$lvR8&mh<VOK=*bOkq2@e_2*H%t*c=KJ}E#TlK z9&?73N-F$q9p8@80Q>%kFXZF&s;_#VxLcO*=a`FqYsAkpWcwH+k~n*YUQZuRC>Tms zH7{Aw!7f@qPNH29eX;LoI5<O;wXu^plRcwi`1n0A$N|*=<XX$B*+MU~8Edu|>?>X2 zgn9^T{vCV{x+&K65lhUC4m|OMi6HwN{gk2ZxsP|<#14PMi>{*E{&<)jydpsB8=aqy z*z9pUDu?)i4PK?@^2L7sq&rv<@4JIHX2xQZa|UZ6eW@Q}6>IDOP7~iE7JMV$cPAqH z(O20@O!PylAl6DJ$Y9~r9Anr=S6MgS!nQn#x>Nb|X+C1`1#)9LPKT#Jt__?n^Cot6 zB+BqjmiTuJ{k~T0T`I(hKdGvH_`a%i^d_$mbBeLXUx0O`5O0|ODRI7_7)nG8!9w=o z<Ehb>AAO$PN>_GlF7jSMICu`-Pn<icOVs&5uV)JOZD6%&@!I>;!gcs8;dZPmGnMLd z5OAQc&Q#wXSTmnNQmm>!n*EMkBZ-JFh~L%N!;NO-M|LC2P={Top6rc%e}Y?obnpUC zXirQ&4+n+ug^%olC18im$Y9a*GN;hZw1bx)RuDzaQ&rLFakhbjcq*ee#KXLJ{6TtH z4dLLi;(-mMzzz>7gXl{=gM;cnIf%v%t6?z@$V>e=$@`g=t3Pr6A=fpbjyOU5<{MO~ z{@#(lBIr|Xqf)OxE<Vp*zBe`BSL7N^u8HQ1b4xyzq>!Iu@Y>Q;cbDjpwq|GHK7Qk^ zYRI)!>B27KEp%Cpb2UzEKyZqnF<rd3^f?BD!E3O!aQ5dCo=_8;-H+|_iEg5O0_PSB zQZMbLma2mPp9L?2sPvMnhH}F06CAW6(t5FGQOUg3iBH#9t+XLt-l3XNh%mQ#+?Kt9 z>-0{mv2&#`){ARef$V#%YallLjQZ0-R5%IFm8g^dhJzy1NB{s@{NHS%fsNgfnQ-t? zaWeV|(Xk)MzF`-k1=RTNYEA-Xre8XnwOuB>WE~vDup9G{=)4fEq+~5TniDud_?SY@ zDJZ&Ov$0s$XteYaZoflyFR`>Z@n|ddlwbG~5xhjGsL6iKCA_9F(enx#OJG%g4SoGV zG<e8P3g0)wIECsy7jmtj{tpB7^)3$LSmm7}Hq@d@J%fi;0s|{Ho(f;<!wEY(*5&3P z0lF{P5gA79`wi>r3XdrnX(f(VgM%o#gH4o0$nyaNzOurQ$c9i$%_19T0|S++E;}~y zC%Vl|?Al61`if+4mD6ai8oA~$@wzM=cwu3|c)}1?6*krzQ;Bmg82b^b8;QHw>EHY% z{t&+rJA61<o<}q%dOx62Zv_Tt(bya1A@Oh~E8$eEg=Z35bBRE3&4?ZL!e+l<U41x( zbc5O7V~_igvMjnigojmNRB~>itlma*vdRnICX+RuU|(-Rb}i_IlkFr2`CS~Of_hUT z$$b|GOYw!5pzsX2=5cn>pVi6?Fo*=z6rfdtyttK0rV!q@6AV6ZyG!S37`lz4+V9PX zv}h|8SNu-Zb(zm^)kBu!c<vj1PqI7M9AqEiC2i3{I(P_0uI|)*uj#+HrPe#kxEG+c zn`*KO5%D7NyCIn=n2Zy_x?wbN)?n{&Ad%%NQSmYL>YvzUB>M_ms1hr%Vo6J1peXws z%jr_5C3Z~(rE6ey4Lh7nluLzfmlA19v%3&V#IHgfvjb#vvR}IxZf`U8GM_aW$_XTe ztS}yF^3ci3z~6f0#WO_23apQ|GU`6O9>o*daGvB9a`dK}%0Udz2`Ak-L;IZbu8pal z_7DfI(V^OmzN+!bp_}C9j@V32q$)^69>LDaH>|5892{ZfHTd|G^+y4aJ&1kRr9Q}v zY{jUK<`HLop)#5p@*?wJhWb?G3<lZNSV?90j6}n=sN1&@>9Z=$;9w`%UWE24D#SAM zQZJ+T4rJN9pvyOa;|a&ut;mm!ET)%t5nK2heYNNFNHIi?G32|#NR|&z>xL)X$7^aR ze9H$iUBMGKlh10g!}fs8*b7ASVOd47oe^R;)ps@*2fN_l0#RW(Iiffb@ghFn9t`qu zD~*TGpgYN@*~wW;7<B>7?xyx`McwxqbjA{0i^FXp;zl1Tj;GX!HPOO4GWl8LT7$kS z6Y1{|0sAnf2ndu$t_eiBALzC<(P9Ujp2iv$BIR#XXeaToKhRVmMpqSG(8&#I-!kyG z6zNakI~$boAe(`RxEl^yFt!B0O_6IGI}mBXU@)tzJs`FN-1;fy;ou&2Fa*ynPb8>; zgwr`^84m|7u)a-5b_m;=NtDY?^?jNOsS|Oi6m?R4))cEabC3cKdcxyQsP4uJ_+Me1 zdUy*4Q?TlqXrLDUGmbj_6?v%wE2eqizZ2REsB5b5$+$OYYzo?~1LeBhPv-f1xUGiY zELFC{?<Q*I?(~{`SXXSMCThmWDsa$)&c!*RXCyIkEN9oYb6W`p%{dEa5G((}rkX>y z9(Fhk`@Vt3a`Wz3P}oF_TZ&CIrk+e3+k*M)k<mwh$!%g{e!P4#Hn^41i@~loX9r{W zeBE4TZVcUqWQeJ7`-VETB6^sMem66I8lF)cZ249g{IMhGHh_b{SmGtP4M#`Ap|_sf z5~`CXaI26T*C1J2Xf{F%quJlO#pjIju{sz_A7TTP7ZAzn(Cdjq<|Uxt5~@we5L3w@ z&shnUW-T~_**Ee#9lI=pg})+iPhm_`=(Yxp<$Nmw-)=#q<2$CY!ZrLI3O|u_l%uf4 zVd$(0m~}%7JBUc$Sa@41`z6p^fn42@Gc8re3H)&Y*4P}5`{Nl$$Tq2&u?u)DW9(8o zTJ69fB@uit(X}VsHf8)!Fu1^OK^7z#Kn?XL`kITL>(Twz;b65Gg@v_**WOtBUi>C0 zb#W{7G!ME9;iNrlpa4$m97Fd*7~6*5VaRnF&ke$&yRZsajMvV`+nV7wUU>OdF%gMc zU^ktx#Eq<l6(U7ra>0B!SVlbRfj6e3Gj$4N2ZMhLcpb#!lk_<PK(+%j&nNHBL<f!N z3VEU1z0?^4q1c`nGMRXO6WxYlwLOr14pQ;|3&^TjLH0UxP6UHLxb-1&>}IuM!x9^# zg;{XB0GsUydTEFqC&;mbTpY9o;e}+7x13ZjiQHqLxrp&Yu$cV#!ZY+flPuC647wrL zTC6J;4yxmilc2efN~#y$7*58$fjy05R2vru)6ngG^1^Q*Gz?ys{zSGk$bLYVbD`Q6 zv?K?MK>8i=vn=cU@lag?2LrK~+*A^GIXyAKg=`CKY=YRtJUTUPJv@6FH0N_gCv?KM zS&@g9<5!)DoPR)d0dejXy@SH&b~si$m+^zZLn8Z#>^uVw{=g185y#eZ*7FDToRn)a zH0L8-PjC*UD{~pI8N=MIk*p6D_I}Rac;Pio@z&|s%uJ}aqE7Z>4RRDT2Sc$fT#O(# zoaJOH|Cf;1Hk`4u;I%t3I+9p_4}7Mx!fTH=^v1uo;fp$%sV2G|2hACHZCkEP%i8J+ z(R~7QcZQ3hpml_GU=rkL1O^isIT<@|07of^iHG4}IGMH+wlE&f&#|ruLho(S!c@kN zhkh*=2lt7WGqJADM2~*(vJLCfsVHmU*Q3E|3Rkp&gCMHJOHdjQx80yTj4shpkWB`% zEg3WYC$de*&C+821|zr4_HbFuWh^E=QMem(OPiet2Q}Ekc2dJ{By#j69=CVd>@F-u zk>3DJMK=l0odqB5u!?j<#ItzySY&FCWW%VJj$^YaS@*TYZ)c$ew{G+C`KhOHFdx6| z!dU4wo0%tpby#)goyh#sYr3(r3MJcI#bzghe@Cbe!eS1%bX$P<Jro@*g5Qx~P!gN{ zgx@X$*{+Q3?LziE$fm(>+Ytq(F<K&91MW4fYcI8Oe~|6M-|0l?J1*VUV8l4^ng(hu z;5~>Hz$G%=SSWUZ*D=U=f=Hi&c+?DAoeb4U<j{tA5#M!>mn>&&AGFXHxi+|LHUxay z!R1Vsb-8t`xvXmjTIdQ7{jl_1WKo6qSBDHTiIG#`;18}$i`Ve&&RADpIOqnlOF{NE zU6}$d4kp3tM69bR&y&(SIEd~?!EIL;2b;j}2W#v~M8q-J)=Z@92F}@tvp0xV(_9!x zn_Ym{JSHCTefQ{gJXELP5v{?%k7#fP3?{&5cVrs}HxgNY-fKY=m<X@qh%vRXSsM{i z>X!fa2U^3a`*wq@z-Frv14hAt^qTfWgAkCtLadky2a@V&m&LrtVhR%327ti~I2eNc z7UrDFdzWrULbWGcj3q~%C(`@DK^wS~x}6Aa^@vB(y7m#f27^{-V$4i*>-O8~NIni^ zXJWIRKqM16^a}Pp9WA)MW)W+WXPgMkgWnEBDyfB`a3CYc2eQD@pVr0yHX_bmW>1vw zT_t9Z!wP3(v%Sz>I9_v;IcG9==bs!%ud#sa?^w!Y#!3u2{EUcak!2k6cL9arF5SK% zA{P4Tw{zfNFnCC>k-A-orn=$@y<C19MHWvFosKTuPXDQeFgQrmZ5QYc!rS+-VzW|V zH2BGZJ0g~#?uy25-MZ}xy5r&I6m^#$s5fTseiGcygj?z3!JJg#TXnJP{w^(yc5(X_ zZhvF!AjVDu18Io`U2*OhmN>$tu>r)8L`y7(Rm(UhBW*XlF_H{&A1j&1*j~^bh9&MJ zGivxkP2$`r5Sxe{{6W>2kyw8fO4E?3C-yxKZ#>4SF}KDBF#BZcq`q)dh??UaezFW- z=m7@O8`okpUx>7&iAX~kIhC=!=_lucg9jiaZKkWs!z2d};2=8|)tA|)Bij%xt+XrB zUM3e!gko2C7{v_7h_pWB;wCPenTvLZ;unSC;61TIa?l$d`m<VD_tR#|{={Gg8tZ}0 z<aA-M3q1|R3c6r9vq0oN97K`{y1T4)2B@_rOUOuj9!iNAjAaH{9Z0`vgm$GC#*=lL zfkARAza!Kyi5$p?6h*8LcE!Yzj7+o{neQGj=NzJPHx~!9iAZ-{5vdkD%Df<BeFyA4 zm<s6($d5+;PDnP2K8L$PDhY=}z*WY?{%9fp&xo`Tt;(p}ix`ra$K4guJXap?fu_TW zNLO9R_9WkS1cMpm-v{LJ->|45&|E}bkQ|i7YGoc@46hwrRnHhK_@XO^NnaSt*ctpy z%%W1aQm*dsAbnvskygbU>tm}^p(*1*M=Dyr%awQ_v#8q}r6vANO!UP28voSobhIFI zerh<7_B|9%TZ6&~FgQa@OpBFvLSOT#dnQw#NZs;{|77mz#I26-+Xr9R%DO^9w{=~y zUe+?>iO*Gj)-r41pa&Rqz-DHX?_`Bk2#ex>{roH6$(s5F+|4C+wTA;)%Pgb%jbZIx z8Cv6^xd`p{C+0{FZsE5RpxTD9J@5rL2NHvRMA-$5o&euvK=u>5T#P4lpzdnN{Sv(B z9aViP<d!ws9CX{4e8>OZz;7k81CdMS@d>V&7*B;H>yt4=#JTX%)s@F(q}_lA^m55H z5N|&~RqsWG)P%?}1szP`zL_i5zv8_)=wDLp&i>7EBGM;Tjb+gNC~S5bw7ZjSa=7H$ z{Ifo32eMPCBxF?|$-A=to(;bv$Ts}XWS7^tBdxneTY_gir$&?3H5i(*_8jc;niP1= zK^L-}K|$7NGT+4zX)7t6nR^zuu`UiG=|10e)o26onQovpi)VM>AUnG4$*39VU<BSS zBgYq4q#aK*=!7K>!MYApN$?G+#QLFF;vB{fg`3~-nwMlEx7WBiSc83khl7e(>PV>0 zLOPjoBUrV{b;XpQ)+MXN?bx>s{WQeBr%`v!K?|M95<$fJ)1WCMVn_IumBa~ReQK(w zKcG4rJD7>5Ne*QFy%!7y!K>8mM6`GHUp1OUb~aWnYqZSNXtMg91P5J^YcRUyztB*7 zx+|n9%r9eCD{^%zvgj#1Wi%Xg0f(`!`kVjl!WywPW2V4wqTkA_upMb6vYqjS>Da7X zSNya39Sqgd==KM3buISS7klYLjV2@FE7pwpz@RS_C!)1JJkC!<e2YD=AanF*{y|vG zdXSAFE0l!R5LZ?hjc#TAtq~FT{;XwsgVtOk$6YwcMzrdVB~F6wV02f4h!_h8>+q`q z*h@b+S&0|D0fT(_Ul06d6q@ahx8<cj_!87tf!7d54<pKLMuYLxXl3AF0NhSsY&$fa z8QtDx&IL#`fZJH~b&z<Z(Os&7#`;5d7!jl?=mk<GUPMPT89R(RVlr{;9A4v#E`LW) zL*ZZuwo`*>kc7x_9Gjj-%oqw13yJi%Sha?LL3854XvX#<-jrtV(Ba}>K2(P?dKxI7 zL9QfFsfjoChweb)Mjd8JN#wXlML7?D83h9K(N`46`cs$I#r_81-@QPqJaVb5L5_pL zbm)%Z?@D~}0iC=MqD*7P_TknUeU*d*JN~qvY%?7joB|eG@Wpp<5Q**apPtcgPcn0L zD!&x;1I|+&%tQLgM3B|^&}}&IL+^FqR#NRq1yqVSE2uDzFk%**PGsy__<4fgW<u&F z#Lqt9+JUR`W3w@=PWE6kGtt>((At4qpUC(*&_YYJ+J_j|lo%66hw?3bjV;JNg^{z7 z@DRQj&l;p4zS<T`=;h*|ICAMO4%S0&I=C(bt#jC{jh<{t@cM(X-OxcLkWPtp-9_^& z;d2@sFNd3JR5HF)E|uVx|Dy`8jj^B1)Ddsc!cOp-$H+xQh7<H}biPTtAi8e_s-57u zCePA<>=UeX6VZM)w`E*)i8?}ZP#WypGk+(jmm@Q$pz^x|2W#MS4&yg--2?KiA5o?% zF|$3lR-jcBxm4`?Jhc8|>;ib*hFmYP*%0DEb;h>E)9XVu2gv?Fu47347o0A|dJhr3 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 z%0D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�! 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%0DPv?HbW_*113$DmZDJ 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¼oH|D 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%0DJP9j7`jXth#tw>CO7V+QeQ1F3S5* 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 z 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 zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8< z2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|Drd zBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J- zkbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU z0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb z1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ! z5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^ zNI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndv zAOQ(TKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnw zfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz z0uqpb1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(TKmrnwfCMBU0SQPz0uqpb1SIhP HlfeH0y$NVk literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/sqqa.wav b/WavLLM/wavllm/test_data/audio/sqqa.wav new file mode 100644 index 0000000000000000000000000000000000000000..35a394dab54426707fa721fb14d4f6c05d3bc97f GIT binary patch literal 265006 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 literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/st.flac b/WavLLM/wavllm/test_data/audio/st.flac new file mode 100644 index 0000000000000000000000000000000000000000..824b4fc43c147e5f44d014bb402e87271c18b6b8 GIT binary patch literal 30343 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%0D@gi@< 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 literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/audio/sv.wav b/WavLLM/wavllm/test_data/audio/sv.wav new file mode 100644 index 0000000000000000000000000000000000000000..169e336d02d0fdf4df3d2204ffad679fbc3a2aea GIT binary patch literal 702768 zcmY&>3A|0!`~F&c?{m%_xrWR#WymZIL<mVGqM|4bh9W{q3Xu#+G|(uKk_J&BMJOdg z88bvkrp$Lf=j>tqpXa>opYQ+d&)IhmYj}s}9oE|Wp4H=)PMzv~m!W#y*z=}=Lq}H6 zQA%lS6WZWloKlv`QT-np`H+J$2h34(%A7VAOp$R-(pV}(l~kowSyfq8Q&*@us<vvV znyRbSb?O>?Td6kqwoupNtSRm^Qdg?_*f&;Jspi<4sV3N8g*&&aKB^t+msDj`mP(qK zDl%u$M}X}-dW)#bR4w$ArhIeUd}}^28_hQJwRzi2G=t4OW)S|4HxtZKvl}!Pn+#P^ z)l=QoX!W9+q@GvLs6pxh^^|&64N!Nen^Z?oR~3ClRWA5BYx1z|H@};o%qFwf{B1n& zxZi9~^>Wx0fY&?|Rn<XZQ`Jw6Q7@?Z>RYu=tx%t<Pt|la1y=^Eo~pGfrTzpJ@0;mn zsCmfTVXilgOl6a8N|?*dRpx5b(+o4C%`;}2dCM#UwP(>+MaZuLD6R?lT?_g;st&3X zzBhu(cKF*$-GcqKkX(IL9%@O0v@2m>3R{rULpr!^pDNP?r7Eh3$_Kp_p_{YjfH`D- zG@qI;%m&D8C%D^gelT0X?N)QdWJ3;_DyGWeTSC>qR#&xEU7(p7&`ce)Q44K1!%=zY z<Rs`#7^Mo)t5z4yIkbJqoG{0L3lDg3QQ|x#nrj^3rUd%0fNv(g)gZk}II95+R0Zu( zm5mn5;d)J6X^8KY=(8<&Xa`PO;kc%%g5Im3bmbJjYNLKdl&=GNY6ET5o^Rsj47k{5 zHUkw4%{(*9Of}D&N!Y(^W}4S<{;pYImY8+sH&A*KdbNSDifEO(Y^WOGZ*`oN1#Ou? zd#*VQDg6TJY=nHanq83A3GiGJG&F=}?gNS@sj(?M^~6~()dSR4fW!?-<)Vkb%nsDq zkNQ8E?;z=K(aN9Z545=!RO~hvp&5<RnJI3rNa?t}>IQrcQje(K>Q)?g2g*9Dmf(|I z7NF%~;QD9ia51pI%zSQEn$>2#S%WLznpJ3fE96iN?OcE^l8{PeV53}$=4O!TZ7I3l zhE_+Yr$PTH{Cy<VUq5hg1LS@kq<$rIT@pAjs82a;ghbzl6kmm94Kuw=XLG0N3TwN^ z^fQl|;bsPK{sk!c4H8o5>k4d5(9Rv;r8nBWOWgy@z6q^g0o`RO8<u?>np$e+nia6# zFTux$sQ(S5br5=~4R3HeEOfeBtUgn_)K>MITBGKucT(T+kpA`XIA>v_-$M@Xf~ujQ zsE_Gxy1~+hn`g}!=za>cy#pMi0VmDTcSle&QjLcvn5<q`Z>bN|tFYIpxH1%Sz8+F4 zhSW}h-(AqyEYyD));S&9o8~=mxEd60Gg~0n<3M!<lrIZTDuJi^u*nXvjk@q}HQ}L3 z;Hrb`9pC|L!Fn14UH7WTA?F9-i5^jRs)wQ5t0Cvg=rbRv*kqQ2m-Xm(J$hLJX;Q0y z!e)0vs$1ZT4#Hmd;(QM<{u@xVKXr|${0-V)iPFD<TOw-}u=Xp?w_(3Ah2Q<S^C#*Z zh8K;SEMT+(Xu28HJPN8N0LAaBkKn;ps0HdPwL~pd^WeqqMVW@M*Z?$qXI_Ui#+Z@N z`OW4wbGv!KJZOeM`{T`Q^A$YGZqOGub;0v6a5om{dP9AJ)_ztWqqP~3_)GA=<J3by zL`zt68ob6n@Vyou=@m21JY_~<n`}myr=h#qkoXGd;Q-n+riAiL6Vzz|Bz1wD%R_?o zQZ4mJd6qINVVdG<DRl;ZtN<9Sqb`SbE`txe9A*2X&s#v(gE)E`TDTt9Yk{u-mU0-< z+KKN<Sk*pA_YYv0k~)We9cZ!?+K#7uor}N6A@?n?vhRV|Ps|+PV+wrCi{`l$=BApL zU<)tf+DrJp15AGdY_EZi&H&XhAmRq~n3@K8e5{tK_3EHHr%LN=om79SEx`J8P)E)( z)xRlEy$Eehh6kGonLGyRJc)?${C{3;E^xmBRR0S7pEj4lb6o{L)((8$qx!1*VcA2W zg^{rF{_spaVEH|P&L---DFhFHfyXVV`#NIJY|yv_+<y%{uEx<uXp(WgJS3En^3Jv4 zi>`yjT0jR`@Vw1|efnw_a*4o)oj3H`F-R&3izp8o+MsMJP}B%Ge+HJ^8xiq(&{z+C zzY_3w66o9nU-dKezZU4+32J`FwZoA9c|;JU;-IqtM;gAp2)ZaT|C)brSL|~=5ceaH z{%uOai_Cm@sO2dyvH-}LhqJ}F^F6F#JuK%Uq@M#MTn#Ba0UXlyKLa|~r+mwgYLog= zZBW0c&1xmA;2p&9L5RDJ(DMZ#<8AY}x!bfcwM+#QG0G%@AaH{SVtFOg$vljV<8|{H zdOBySLcc^Ceav_8S^L#a?6<3Z>M(j*0e|xXa)w6`E$YL6F=p<-cM0$_9G-M^s--93 z%SHfGU#8^o12lCK7F!qCVT5i19(t&*kZ)bcvlILdBV>KtsRN6Oz^__BPbP4CE|sIj z5I1TdnpwDGBfd3+=AzKkMZ|`DaJL6uWIr(f4>VZ_S(imijnG$PwAvC{XXeoy*O*~s zqlW@uV+T;T3ex@rmirzkoeq3X15#f>l${Rb&jdfSQ}^ZrT?-(aRglgO^mE4e&};=@ z;}-arY0v}x&1UtN+5=e~R(sU}Si<kHjfK$840xu8Kz%W+^a%Q#30b!>wM|V^!=#&J za1L9VsfzP!;Ex`IJ*)&Lg{BldL|1s4S?V=pXTPJ(ztvIbVY51<PQ&I_!xxQG!=Z^0 zkfEav!WQ-c^(#U32-w&pSlA2D#iOvg>EK{45V`?a{R{NRv0VnAQxB44R@4O1xdUR= z?Z9_a*jF1MpcyQMcEX&cG~{nUlLucC!IlRc7ehy-pdk<b=K}J{LTKX<tavB<#8&K& z!dIUF_M?zg1L(UAthy`wUN=}#my~T?4eeKjy)hfz1OM_lq&zc~?~F79&Hbh?^5CK7 z5%}jv;Fm_jM^6Jr=cY1-Z(wsjp@$2gBNOqbHsWF*M1kj^jfK$0_mI;jNNu0mt#+tY z>TC6(dJ{H$H%ev!IsX7L-$GKu&`TfmHqZ<}+-+srBJw^BxiM}|g*~oC$-tCT>8Xsp zvl;?VGzA)c5^{eL9&i!#GXmbQH@xyF<OuCSiwCZ0?+KuV`d9^z@C$s>QuxwY@K2xM z+BZPnkMJG)QyCfkMch<L<x$lkk^11KF*Lz3MQcc|4gNNSmYLhtg%7BRdu5@OQqW2| zu2sWP6n?A_`l*DYB3LnVwzI(b5y*BM5OoszaWN99gwpk)@n*;+dO&9P!q!_uKP{p2 ztASHnokoq_knJz9-q(Pl@sP!Ic<|wn(E#XTJT^v(r+~4UDSdo_NWT_69tYpq(Dse+ z(xc!dURCeG3O1@gpo2Zo$9{DY$lZl821hWDp;RYm;}6JU0i^RetnYqU!R4kU@}L12 zZ(L)pH0|(rPAW%y3x7Aj;)&K~=%uw9h#nS0ug|BnvN)AzO@`kZ4)4?#x^4#_Pzm~A zKEEG$`4#PajCl4LycMIx=kT!KAcJEzy$6~&0VEc|x*0JpgC=VLyXnY<D!}X32G+Sn zAm6g^M5UmIk~sDet7AB)RUCun&mq?=g7-fGJ39x7YuIK6Xvn}m19;Ct4GS7#T#lx4 zwX-OfM9p|AW>}C&4fI(D{Iv%Ty24_*K}!#VpZ3tvb>O@a+F=`vBKzQBe@NN)yRZ(9 z7hV8@pTIUYHHw^$SU%f)kkZg5aQPQdp+Px$Y6h*}0@U_Jv}G1G0N?x2PiOed+i<Tw zuyT2d>oU+QGihQh1JqRm`p9)@VCHs|y%HXxG4jtrh#R-!xHM>Fv~38U|As_jkdFsn z{X68n3RdwOwzZ&X4z^EW`#(W5%omrT1f%)^?EeH}V~7Ga>Slu8s?b3-=%pN}FAJ|! z5&MduD;;vw@ambc>q2PoA~a~Fvi{>hq=NiQg3^4*I6w@l2>C`Z>U2=AG<b`G4;%MQ zN>d!8Gs?tMoYLc6M2i=Yo18*h|KjW%w8RmN0%s+$l}C&9!2eb7n~k8Grr0;c)&N&) zrF>{f&}JhG@lqQ88@};3aJe2H>{}r5Blv@P!2hS%&&Szf$Y2fbZAGbr=<y7`F6!DT zuFGP78FX@as^uz>LT&U{8-3MGSvE(V4L}X;qd7Eq75+AXW*Xqz3=*t}vNf??ff`lN z2In|9W~~mXmP$q3G{_^OID*Ip=LX+@K+8sG;}DQ@27j6H5Jv}bWiO6*Lt95cWj^k5 z?0gRLDgwQX3~|WGhK|ZY(hj6d|G@q$pce;nDGzR{K$69%kw`@sN<SAernVF`S_BFb zpu<9$B#!d&b#Z1vqKrj0sLp^@ar9j#g=&t=tD|iTmPWg?@%JL=J_w#pfQNrz>099s z3ekgx6`etUKE_uik*yKm9y~E+K|er*R|SQnHi~N%AZ5+~&`M+Y=A@9v96S$vp8@CR zAc>QRe*XY3=Rqx{LV1vbbkws^gLsbOm>Hslb`<&|cBy3|(ZxnTL>$vI5Y?0c^T&Mf z!f~<x-?-aHS%YkWNOsUR{R-!u(s3mdJ!OOD%HW_9binzGI^gFr@W(u>1kOvMR0)*M z#@*78WF&RRL;J<(mGSiqbowv&V#Ftoi$O~iHOhj24ca-sMlYwJAyQfhdPs=}YRQuV zWu%;02PNu5-X|a-;v^6J5HZw#1Z`6$9wNFz4O(F`#hnk${fk<hNy|jboZm_Z?KPn1 zER<Ey136|4yof$&FL@|`5q8V`n>iva)&iADTrEh^k%s=5yD&Q^KjgxKJSqW6#H&WD zrGcvqlp~d_l@HmU1nQ4MDx9mKX3t_HCaEEXvbkuHSdF4pYSV`_Vkw-Lh1^L)CZtV! zuv3^OGMHTzV57ZIqr?MI!1=Jkl<bmd-G)8nqiuuhL<;X1_%xy^9qlnsE(M9C<0yjr z#9Dy1ic*;Q7c${kgnpPvPXm_~KnG>bcu)m6NlQtS(aeH1oCAi>p)@ZhK#`ALbHGUs z`p8J3sT}rM;D(aQN=cU(wn2f7Rt;p3g_bB4%7YlqgZ${1sm*h+O7R`>6fVep7D|;w zd)esWvJ_?+c{n1=0CnV(ej$QuPO1ktB@gQ2Ov)}UpyjhE+oN63YDovJEE{^Q3_7#1 zl|aiCab6PrWuQ%BuMnKl+nfc~h|kk0`@NWIHy`risD#?F(I(sFNP_l7UO6s~q_9KF zis2gVgISq}dig2M=7L{JlOyrM6qP)-(H3p00MboI3ygO}y#`&9Ul2<Hq?d-0v~RIE z>d3)Hi}b-EZN~xrX&brdh1^r$9Cy%DN?l@t_#@?vtMo-NY?OKqwo;G}kIDlLmt$WF z9CPl1NYbF|JUA%AR*XLBJ4J7TaJG_-_9*Lg^ub6?EK*wZDjI0_z;P~Wai+5vG}6N9 zJ2+dLgF56n4I8~H`QaRF5*vG?mBhi3#OMe#L3^RbC?DEO9QH_W&KYjf%ZST40BWWT zS{Lua{%Ac3)Fdy3sLRO0ev+V2`~>ku)Y7Ucbpv|yQ?^)$BYNv%v`(wwSv*xwXrxTZ z2k}9j#c)R6m}hY0s6ZF@Y@M2>wUb)vP<#L*C++?s<b46x7z=307Gz0%5x>+_Nt`hs zr6y?`(m&}5&?-F!y*M#O3&=>xlgMQxqgBzOM6<*-DIyMO2lREs75k(WmrQAto`zbc zucS_iCP5|bl3Hgu(!)qkj*_6Ah`fL{iAK>S^Xn3zfZ0rD$`UXCzo<l?snLQ#Y1Uvq zN1q=0J+XugP(h9(=#Qw&Kpl}Ku|P=@|BU~PBB9N2#(=($I3$0p;o(c9MbHktfp{Jw zkoqGEC>Khz2*|pCjS)^fs34INO#?sVB{L-f;uf8vj{hI!L_DQQUrWoS&C#1Me$tBB zOBnU(p-DUY6+h1$ht!ZhdKPjoGA4IE`XNrKX>!dr#YZv2qKug1(gQ?OEsAbfpR`c( zLYMdz_Dp`+H(N5G27gjI5zWwp2=3ToI{F}vV*m9;R7hz?RrbQN#0LE=ErR7sfCGA7 z%7J(k6tXmBAs&HwNj5mArdg7Gk!E^edTVkmQBitf#>Y_raZU~xkts`V)N>LNqA#W8 zGLMpt-hy__EP$WT9wd6w>csmHlj1kT5}ARrUzQiiQRXbeJG{n>pA^#G=`V<2_Aeii zE!ztFW$&~(YF_G76VwrHiJIU?A^^)uFFY5mvkcp#uOJ`P1gXAMn@9A4L=165zb<|8 z4x<>+NDHJMNDYsuPeB#0l1Fk$Ofia3d!konAZ&*;i#MbF@mMxWPinFp+m#-LX0g!_ z2SPV#BmYvCv@!o9b~4bbWU7J}_8@X%_QZOmRa)acIU?r@euCB_Iw#7hCEgLb$*p`q zI!a4hq*Xp_NwgkvAUY>6#DnlEc5|r(N<r?4-Y!XntxB#(jM8%x0o0A?GxS~5=p|i| zBjHf2h1w?acqXGF_Qvw$EA%3QU%4aHkXuSXJPvWhaTPA6t_qdZHQT+^zu<vhR***P z=f=?k^&!~>JzOXaQcurC>lCyQJsCKs9!WXn!%YyyIg>DtVkyp@um}1xu`uQ@tjoU= z1H_+5Yivnui~KMTkQh%rQ_jq<sdX7+P}<~)UrLL(72gqNA1o_ZB-aY9OytKikr=fr zx)vN!`uy^)AdRiiH&N!iLVre@h(3B+mJ^#NHROYBihKk^lrXOl0ilGc2iBKJMXJRM zum#GVr70<TZlZv`;S%2EeuyYqIOQt6Nza0A)@N%HqeWMOL_w)=E*43&utZo>S`+lM zC+eBhur)>}qCtEL^&Hv~txZ1chjcL_^DCR=Amom1iUe3*BqMy17wInzND=A;&%zsJ z&KiPt))r~<h<A7<a;A*s9+A&B_@VA4UW+byg&%31atyhVST8m~&O$7QdL$3L8=gyF z(vC=2+7|!ARzq*ZyVQ+**aGj7c4?7+c}9;<k1hECIp8LDSVr(67@?%teprTmh;Lwd z-Vp?m*Z=K_(vlLy7<nNL)Ee_wv3Jov@kB~^#y+WC(#9=BA#2cQNCw1wfZ31u14etv z3wX{9gL~<N8HZ#8JQtLb5{Y0!759QaB1&>vQo-xwO7zP!-jj`dizNx-7)xl&;rKzk zi)0+ML6I8e#v`^V7A_uxh>?CM<x6)3k(8pu0(uI$CZ$AY;a(6TXka^HccHf@#iAeX z`Q;tTowBB!g+sPN%!JyMBVPSq$%y9Jj$lC$#ulhSYL2!{-z{-bG<^wIf?c^wsf(YX zM-!=vcaoNbKDI?FsYhuuL^G+Njnj_An-D9)nZ!bt5V`ZOa7sB5Zyd336wkOsTrsxr zidX?liH0dZ@<+-fV-mkiO%UnCJIk;<uh1$&e;^Vk1>r|pBQ+rx<cY`sYp<da)?q}F z(xN-TiL}e>JYs)x_kVj5D-_=)<;XL=?4<}yeklvt3t}X<<1w`&lA?4)KGZP1sAz+9 zGQSmWB!`l|s28G)<v7aZU(pPY1a-80mf)UP5Q&SV1&zdqXoV#>_GD`^s*xV3Bhe3~ zFW44cP@*iudYp$655Y4cl`V_yQ~!(%%r5xl8ULmM72G%iq0ixnUT{Km5+}3)$*{t_ zf!bj2;y<Vt#(zNxF~P`BTjpQNiS=2E^+J77V{%Wty_6!VhzGV#y@beS8TybgFQGO# z1|}VBljZmc>Ed7c&=c{x<Of12eUsEAUF?~A`ASW>F0@E(mJvP#`5`K$M{1WkU`Cgj zlCAiH5Os1!q;TU*9G}cc?4f?-%br9&^cUid1+}arzMf+P;+tMyG)Ux7SJY)_-Nc@t zj@Mb5IFOCfVn33*h`%R2yh|IU?GpKHojT@M?28hmR>G^KTKE?kh5JjE456hYP3eoo zL{~&Cd!`j!LWH20Jdi$#P;x}6kv`UzoP)CDl~7J0Z{&e=h_*uNseiE-k-214Y@3>) z{A7-ZR0@Y|N4%KGN^CB?CLV#<B1LTFk_|9&h8D_Rc|W9*y^$uNJfxp8qNMl{I=QFJ zr7UGZZo?dcy5TWxTI^fwnTQ}R#G<od%^XE$|2JpDGJ+hL6Jxd^c;p?<meJn%6(mvr zf?IMRl4R~dG=;u{N2G-JDK~NwS`)dEkqGDhcq}uR%p+*ca*y6ZX0XEX8Ld;SjbnZp zLC{7eJCM0c_7kFvs1OYCDrL>ySOZ1=@53vC7M2kCN<?BE%38E7oX9m+<~@--`HP`0 zQBRANh%CCLehp?|c_#Q{+x)O4wk$X&vO`;w{v>mjUd2Ww!(~0OYxYE~i1x#{C0vLP zrR+m{XFt?h82`l2vju6L)DXp@H6oDLSwr|@J3J@ec$NH;V!@z9H<377AeVv{K5b?h zp_08xJ0cO%L|ITuB6X3B_yw_R@zm6zNRHAIk4v;j)Mc3vVU&=3DM@Kvau>G8Yhq2b zOz}NDmote8>?`y_VZTJJM1)JRhWU`RCM^mos2|FioQ6J&dL&{5iR6wo=p8Omz`jEd zKpC+tslQZ5kP%8H^caG1(H=9E&=-lkC=01aili*jLCvvc_9(h1&7q|;I?#`V7SEXq zi8T^6cucg*d^c<IJ~u(JppM=^e2<_<vQ*|1;wM5Z$Ot9GT<9%CGBS!1DTq8mgzzut zv&0wBU(k=p%qQoR_;iBzxR>iP8zEjr=6I=f@hWm8{)brwYhIco=P_%u6!Sg)l@F<u zx`IDa8hR<YA|;6pV)T-}!($>itRZ(%2p?it{<5UBLY;=2V3qgym9mr_waqX0v{(87 zYFIES`j%+M5@IX7FJImvHfXa%l32JPgx1P(f-$jwxgvd%20^XhSZtehrPuH(+m>={ zi?tYKhza6Ee5mxnQsO_^FF&*xa!jf7j3q=iq6J<PyQWk{a*`#AjJanSjzFa)p_&rr zCT+4^et1Rn6W$5iVtJYS2&tgNc~z+6S*UM81g|qM;9rp<rAy6;jdHXh*k=i8ixQ(( z;2C-5UOWjdq&}=G*F$-*SMh(mLV7|<$u;lEUHV(eC)t8Xlst!6V)N3k_!jm{dPqI@ zf)gI|4s}ZHF<;^p;gQ$GS5Uj+5$RjR6NH##_Q8yW&n{R#9G%KsN0{F-FP4ZWlu@e8 z9ccIAtRiRrByS+kd}bfsp=HbHLu$}Z@EYF*5NqemILk{GLb=H?5ySBcr6;+Dlwetr zuFQ9cwArut7PcP73ep<dxnPgy%zZ-7!d^lec}ye_S^TmWTuSMP$KiF+kDO6cm#(v{ zoU`7g*--j@YDZATzeE7r6zxhrLaQW3*h=WN*f#G90(o8ZFK8e_sB1nC6_gMUQbyvG zTo+uh4zCh(q((k$U#Mmu<XUWn@5~TWk`vIQ5e0m2h-e8tk|33Ig;J4L1@E#Ct(g)D zrAlwkl02s*#6O4*MMKnmr~w{@dX_q(DO|+oe|1TuP@f?_<w+X#O?zY;!lU#pG>hf3 zU2-AvV7qcGC8-0Exs;;jLQGHwM42E-j@TQo$X9xn7BAtEeXuTDl3pcO7Akp1?h7VJ z2YVDNmpiO0IO0`70H2&wZ<0YuG@*y5)?_9|e7vB9Wd%c$JFq-0p6$t~RdQ9)xm*{# z2$kY9*cWTEHBuq8lVY)K+IaZhf;<(GXB^BG<Y@@sWsoy^2)WC5D|nU9nAw8ZduY2v zkd)*VVt~1Wj8SOiEYD{!VHU#L;u*N77D7J~+9|1~%&9rq&>TKQCHWA|iT~ks%AV!r zBU+^O62IYf@jrY|fFD5v?@^aTA~h&hA$yT3?+7)NHEode@QU=v*`06>D6}e;U>j_K z<-#_EO0j)vhdLC5NOs6`e))bA%S!zadBk2A2gNf<yFwjHg;J2ZQd+VfzI{XgBW0x( z(iU2S@I;zJ350)H;(xtAX(D$bRUT2lA;+TCRF(gv#&Ya8M5@S8G!*KW<)sCpMr0@P zMp_bWiIk-r_e3-$Kz|}AA}T~bB013$kI9$R5uPcnP>10a-WPd<)Jh4_IrS`5i{BFI zQ4d5fHzJd5iDXDQ-%}8Zct-m9U#0x;j5XPlWDeYi8YT*OC$wlr6&bbC>k})CG!jo} z>-=)GDPs@u72+d_G4?25_7V0XwTO}M3aJ%sF|J(lf23FL2o`9`ls7l>%p8O7)bM>M zZhV)M?-9wnXGQ-V@m(?c5~4+70&CNfDF=xa#1Zuw%9Q?yeuZs@PjJ}-rA;ely-RfP z8qau_u}1DuFVsG{zyXdz1d9)1dA1~eg?y4*K?{49+3hg0u}5iF^cl7rB1W_;eUTTj zH_<YY&-?66W@*`{^o*kTupZGxjmY?f(S!Bq(`D8`@FMM|il=H^s!i${hvW+X(mKLk zrH{~Wgwamygjiu_N{rA8NzbHM;u^US+Eb1H-%jj7=CDLM?3Gd?m;6f&h_tC8euQh% zD#(&+)E=*}7Ad9FMWfUb^9aEVF+to(90)ZSN?TfGJ${4&QbKyzKK+Hrm>dc9+>7M! z2mSIJe!{GPnI9?VCoCm&vJa8Dv?eHG>%tv-3%y`SC9kj*>RLATFa2^a;}o_>%E(Ko zb7Fz@xJkyqeV9o|<X~CR75~zcNbbP-P5Oy2pI|M?7N~J)k4NHF7&|zd%y-Y|Z<tlc z7>0d|9H=jOualO^r=ipfJpiLV-?pN*<P8^j^G3?BEZ@iyU%_`UCFhXLg8HSO5&tge zp_Ik8WzSYwitj`7?KxiMd59Q69Ir?o9qK|fNV;VcG>PvK+vXLv$^Q5uTIH=Gh&3hI z5C>9TkVbs5ZNUWhL>tS8JraeaCe(~*Q9LmF6Ag!1Ej1USR<Ob=Z0{0g7zb#l)RXuL z@#s9Gj`%@$s6~CTebF56(#NxOcvX<bvP3$y&9ZD&<~&3HCD(`t;zRnAlI)8zCGN?& z@IxttQW0uG$&2(ZorxWBFOs6vxlzv|UEbl5^dQn;+#+uxW#WLbfjVLPqy~qnI+Q1+ z%QMjok3v03E0h>1lAMNb1+pE%fsAT-g<MlElpgCz9l;)3;1$x$jZ{c0qFJFvWW{oF z6t)x6LmDUvsY{vjBiSa8sV!dRml7c@)EPBGP4UCAF3)+7cO_?_58#`sd=?UV19}AV z#4_^Sf|)666I+sT$e5EQ=>vF8`lC0Ze_=Vc%O~)Bp2AonGg>lcCPjQ7nNeNdon}m@ zmC_^dDmNZcgXI1H_b9w4qYruxkt}5?nxv%U-70E6{Du*PsE~KT8A15|Cu6%r6PEs8 zjEa^;gQ2cSJ7rFbVt?Uv!Sy8sNUp)Xy!}hh#lA@$IVC+|9!srV>YG;u+0+*24yZG+ zQqeszL@L-PJsN2dZL^e6Csc=Jh<zD5Qd5_-DETC>u@6C|=vj2n7!uwkB|;H-VvB53 zS`!ZtmKIMyS}7s147nzFxb#%u5<Ww@3)<=XLmLyD<DO*%6(V`cL2Q<OnKda__R4o{ z$vgX|>}UyMA)$W?{RYcRJ3=ir$kw=Lf9yA$r(j)?2E8ZmFpniV<;gzVVL#F@`{SEV zjG^Lx*@Ltn>X)sFTtz;izJvxDEen0ritrL5g=i8SP||Y5d!$YH=3Z)38th%D6BJQ~ z(yP!XJ+OqJiT9Wj(0cjommY%8Kl!0gpry;R3+50qKOxUO$QAFh-Ov|>Z&mOq3Ga#? zh`J!<n<y=Alve0(<eU-`xr8yD_CbA<f58dmMNTPQ{_h#z=$8NY;xWe`3GDgawfGL| zmU`vezv6>L*1SrO!t0WG5OvfsGnB$qX_*`0Rq<4`Y0*2W6w4-sA%a3A3%#V0A9@}7 zAIXl03(=HVYKU4|Gf~Jk<n1!*mu1+O_z~%qUX8pFi-K60PZZg)d>B`V6roelAmt?Y z;JinOc$Si$X!k@x=*OucYKrwmkNnH>*x`uRWn(E`;a!#?4T3uM7g}bhUzQ22hySI* zU+V}nRC*rXqhx815buAKQX)KK>)};OjM^1{Aopd@GSUv^NnWYNP?9Vo<wAXk{JE!8 z!*M11k#gcANDFJQ9b!w+!7`F<NqI_#eRI#R_z&q@G6|6l<t2!sj96E)4?!Yn3Hc&A z1!tr$q*>6x9^~07@yYf=UC}0`WnQ6fWd@V<g?#at)QBC+|JjKKs3YN>=k))yVz$X_ zKy-R(R)<oiOjt|20^iKz{}1s!D*k7xJXhsCL7BXr5tb3ZAs&HP;yI}&-Qts&WrR{? zeBd~O8)qL1@Si%gTOvVhjh;YeDkwL8gg$CP#v?2twj>f2pUo&vFHrO!24q~o`t(I& z<J2hmBm&qTM>cGOn~Z9t7b!(V)6-Ix98-{zaP&e;=6|GxzJp#-Y>egDI!lWWl<^bC z#Qe`z!67xruh^XE6c_N3R>JwKunh4=nX*0+MXa+VwGvuth$4{(r6!W23|L!Y8KacY z$jqHOmpqXgl>aFv-%bj{jGok%$d7yxmGaz7vK}IgT=2tQ*e4~-O(IL!E>R&CNEuU- zj1DXpQpUWB6ibH5y^KZ0dka;9EcPXKFG%2j*HV9!J0&RZG6>SyC$T{us1ag4?3cWV z%?JWGIwl^-hx8$wkV9^~Lysh1oTN$#wl7J6rN|w77HyFxmSQh*UGivpE7BB7B(zhh zClZyKqBE&0wk7DK|6r@cBQs60cgB9oo!TOgL=h1rzL_(dEGwnt9W-iz@{*F&9l7OI zW`z7t9{%1U|2I;i4D}siQ#8mYq8v-eds{pX=O04b7d^8+|I?p)`OiJcRalBNiUufu zu@#Xb?UecrXO`SlwjlrI$=`Tjtf%fNO^LKb1SQM==i+~kGB=Q{krJgws3poye4pfy zEKh$#FB0acVsB#0)QOz4Pl@}ajo9TU^em|pTxAJ<#mlls>VsaJ^5%Wwm~^l%qdT!c zjPkzZZLASmEu|vJWDV($`59XjA1sJwDRN1@vmN1BJP7qbo2QkCJ&AV->q`dB9%)G& zflz1RTg5EJGl~0bml-0F!~gDKGz#@DG8Wt6+e4Bw2_?Ko{#lncKso4CO};tIcWy`p zqZ)Z2GDE*7+>-~nLp@TCY(XL~kEt6<k!4te^+j8f*NKcn`H?2^^fDS}JEVyl?@@1J zlaxAbOnPKokeEatPvi-rC^^=Y(o$RcV7r$-8u<t*6tsuWm&7Zvl*omBlRD~(d$uIJ zUFwA;Xor#~(DM=%lnrso>%xclAM(Wyukx-)hgSr@5;p{k!aZvXmRKY7EaGh>2GP?9 zCOD?z5#Pw-UjCPinIbp-A2M+w_~U4U+U6BzDuNw}E#U~4?Mo@*j?!US@<?n^AMy#2 zBz%xVkstq3-`waCm{0P*mFYA2pW^&~XZ|NX|A(2+KzN-f31f!D6~-4{<2~k?{LgyY zs?1>VDm?<d4*d`NU=5j76)!-#sDFt<!~uO;h%@3v?vhR^D^W=H)ERXVa>LlcYf_(k zsl^g(i+`zMo{5gBL6H{sl$z|NlpsX#LyKcR!+PAaJ=P_<{}XnqJ`uq-c$a(XDI9sq zvG@{sFPZ3N4M8&d=aEn$_307B@9<ox747nl;FL#lOuR6|yp)N^b!K^#u6P5HDJ_*U z5--lXVu>tCdGijhh!s;W)SW~S)**5zN3k2WP05OdORH={G(xSgE%q<HvMnMdY>`?E zwMG6|gBx2F8UJq&q6hX&&iRqw(-7;W#CXK|qARv6<plGjDwG9o;h5$45g*JJS)N{i zd!A9s<bo3Ak;q=k3FoXIwokdR6;i+t>#(e7if!>j?O);{#1ijG1Qa@1Qs$p%?J|?e zm?Ks%vsv^L+^B!%5xmPgyv{G*8V|?Ayh{9$YSJWg2cnDrwQ=f*`j=4%t(jvCS}{EW z#~jQe_~mbc$hpi7NX9A|2=yAaO;2;_m}fHX;V(82ZPGh2LDcasy;F!#UI~%MyhhMV zNegDf88C?_)H(eM-<e?S6NHf#9$#veee$YclNx3{!7Izk_=ZvvUnzJeng#tV$vTv# z*qC6Fk&GYVEbN{1bEDRYD}HF-f(Yg;JR*JtS;U8U0$LCIU`zZGgTkp`O%P0a*(<RW z?xl`UEN!p^ktx4&5aN>8_#gISH4=e|K=L6-4tWoyLtExodJE+t9P>ArsV|8GVZ5P5 zi7g8CQlEXY7q-O@H7$IyG*L(#GKz>6c$HL>VqOn5#`6#{{7c>OH&CcK>WFtKeaepY z*$3kdHz`XjNJ-HvDPdofgGi8l6PI#dFcIR5bkNtbCzfMPB2at*&n|fgp-K8;>y!%n z79@xc1SQNa=o1)&1Y3NkR`P`~TF5v_Vg$8HFTq$s+h<-N`7)3BA>O1twj-FMKVyCV zmWVu;lPhwS+N6d!cA%}(=J}f<{KXaOS$@ri9)jn*$Jq?-<;@EIrKjNUk8oBq9G_CB zlrcAIjBPQ}P{I;%=xJ!5)RE|xdJt^MlUKGte28}t$x}Q0Qr`UKF4mDV-e+61EZ!BI zQ7VEzVww61^(QvRGx8rsDLyxrme_LW3#fS+=Mn|%ReBNMPn{BHqASW@EStH!*aXY5 z7LhH~Qct`pn&<e0-hpw08s%7kXW>jhh!Il3PiSpyfgk!D&Yco9Y=Lcsx+YaZhx8?N z1aGXtsKN3?2y0&QUz7u-D7Hn3iu?rIyd&BpPvMbpMR^hPay`^BWzAM71yap@c#UmS z+o8u6|3M!i`lFrG=BO$0OQcj{Hv1H<O22YWTG<0ju`a2m{f0->3}qqyl{Llo1+Oee z>bMVE7s>FN*cof58pRcQ1JXv_vjh=9ZrKLUsr`^!B8&V`g4~OI*{|S=b@`#Bga^q~ z*ekUwc_l}wjQq5687oke^b4Gk;7C^HxFmnzTU#;$;VcLJ1+`7>^DkTFS%?Cb;fRK~ zkTF`w4|x%uMeEcp=@(n46lDgRo|F90+WG5%eDmreey50EjzRbvd;GndFf)+yk~K;; z!VwDnfIOLyk&4))%zV;Qur~dO_##SBv=>stxWY0-D(mtt^}$Wf#hT?jL<aFi%2`G} zj7HRm#Iw-jgfT#H#0X27Fj5d_#GW9PNDGljjq)BNvfx*q(1qBb4TQdk*94#3i=K%u z@g0H$>P_y5{&=4)vnHwMvGhdxLqy4a_Aho5S^|AV=&|TCq`cssaY>$-NnRtE<X(6t zl4<dj5qlEa$qhf^jb%PgtdSBXmc$N-B1UYEKq<G-!%}V{JE2s1U<pc+eaUs9RidoS zj`6NU14>V%Ame$~q?AHVLr)M|8B0@kD29({OS~Di#v{4P9z@DQqtMA#$T53iOQG%s z7i{rT3AryiVrfd2n_Qtivb4l>sU@xPKFf<gV0muz_<Z)sV;R+QjKGpCM_qCgiH7{s z<1_luJMb?(3j38K`VP)%@OQCTLY|MvyqEl{0skMJzfQ*gLFX^taMqM9iG<iIM-z<r zVw0S0;BQegPjHd{M6enNe*>Cw<nI*c{pUdo@hfxuZ9^YE;w<c&+M@N+_bL3wUw%r$ z%*8pAO^Gw(AOe|V(AsIU(l2RX=E6IYbx?LhB$`Uqq`r78NGBG<PZ%}CUrQttKSCU^ z7JCX&BK1iHXZyrkNX8%<<$cjis59z;{qhs$ZgP)U;D`4^L`nUyj@*~p;zi^)m8fIM zA6b_@QvVX)C1d2MTCNHXIFrG4Bx_)8TD!=DXUsX}{clpj+LV#ZtIHf1;|sM-Z_6jL z#3K9Tuf4J-=9l!LY51+z7WiHFp7<T~NAy<p4^{yAI(WnH<&X27po$r-PU}O~gZ8`j zYr2ye8NBH=aBH|Z-VG+hx?qot-0SSugH`3g@g8)4N#5W+WTMt`XGEm5Q^WpTKdyc@ z9|mKBm&`)7RhIz)?;92P-b%kjFghrq#_Fr=?oN5<tTjZ{3|9F!_|^T9!Q*C@dP)Ca zwX)yU$AWEs6aO0j;b0D~cD25-kJ?Y!>AGd`hx<n|({1kc^2?YmdXc@_8SDIFZC7sa zod1#EHF!HHXQrtJ`ZwK5A2&Y-w*=jSVP>kjRhP7Wu`1YqS_}0#^HDI)ztjK3?-tAp zYT_4vA5;_Y>*?*x*r0S!J@_-245_xpuZ2&=uY$g5W(SA-xBR#LX2BrS46EV<dZ;zs zDr-HiA5$4v>F7nQoG{#!(lzy1eMYaKWK2nuX)Xkv(DOU^P5uY;Bl<=Bdiw3a{`abs z?rR0sTz$9NWRCi;cq`q9-3e}ce@$>iZPe4OC#?EbRF7B9&7=Nk|55+eV2bHub&foe z)+S?fX79|Z>5U_sRb}t);-UHZ7w^t}I{&TW=iK68p1#{@9~~L{C+5e#i7ktLA1jL1 zicGg2Gf}TZ;)>!^g-;efS@dswpm*9FvL-tTr&{EM^QB$QO4l>Yj9_sP4`v1b`hEQk z-WYF>_obg6tO>5gub@{`$MEanoq~J)sDF!}?{_u5)hD{pD(mcVzH)}zKU>@N2WmN1 z-5H5hNDkt+@c+T@j>pVZ!S(+A{t!PB#QgynRn<`=^$2^C{i!w88WVXmeMsh<tY<Ul zX3UQ)H}54E6qdbk;`Fy?Yvg`i^t9K>YVW)g9g%TQ_Jxe4Y2(xU*j=#$(TkBT)-C?% zxGv1i-EeW?#jA6zg1-{o^nh5ijA-VYncFk=rQH<$*P3j;@~(3SyC+@O-H|Mxcq#sK z;*h(+|H>TH-5fjiL|TKiYofa?Z6><i5|iWC$GgQlB_4IV2hXavb!RKn>S1Nt?d_=j zrFE_T*TjR%gPXl?k^_@-l2>{4%yIp!{eV+4k{z8CdBb_cE~~j#&(~NXqn_Gjt}xBb zt@tJUdge^<R4^^*jNh=|gY^eq!7r*G#fk&-%(bSrvn~BX)<4-r+2^yeVxQ;}-Yvyr zFTQr}(eo!RepI+N`G?=gjIe%+d>DN_az3&v+6+O#Pb-`Dw&R*Iu3cQaV0WIAH!N>- z;g;k8HPOk6{Tn+UD;XOe{VB51*=Y~3dgzjRwQ3UdO}ZE!I>jHy?{pLXAa&51<P3<s z?JTzNTj2ih?sZ-{|D<2pJg(l<1FhcH<+`eQFi84W1;s%{tQS%OE7^Pqy?$y+o3{A9 z?^$ZKHPT*TN1S4Nj&%Zk%r&LVQSTK$?*9pGFAKgk7gP;B(W>u^wl3)Qv5&H@EAdPA z{OqP#H#n8d4)<tb=kv$U_Pp>xZg$ak$?pCcuR!HQZ;gEtITIU{elBft#vhqG)9-hV z1UD!03ZBd>nO7&bL~eRvRkyUd%sv}w5bGIxG<JE~z_cN;`q7b2ntf0oFz4Mv#ZwD6 z6bvbRuDG__IH;heTOT^rBcq)T_Hq3le&zg4tbsB@y<_?Yd;E2NXMdY_nSa>d7kqC% zQrGHibv4#PsQ|0ISIx(IOgHMAtmmu|)<*pWR#bXl57aN~YWjJ!^NhJ({b>FSt_*et z8~wIws&1{e;FsDb!w)@bl}dj$t8vzV5*<s<$oM>RyI$vZE*NsLU+%@+K6$H(YA5F= z;%;};NviJlb+Ieb-_E!_yLR^1X$zcLYM@)I_@ja^^UCI}%b!+U%5Ca*Fw4{r`a!!@ zWKQ(Dw9)B9(pRVLi8YNh)-C*&iGxM6iq;gBimyvN<_`4t1lb4|f2n`feR`38-TK3N z(W+;?qSs(8sXoD*{%ihS{uX~{V3`BKE5TPmLC^!gc0LGeRs5{()vxLWx{~g$yXkB6 z)mmFktY>lUcH~#Z!9qXJE9(z3OZDJL$5_ks7qi;u94VQdJuu_0$m(D~a#%dS;JVy{ z7jDn<@-hoY7e5xCo_NRit#_k?(-&nmE4d~6VwRt|B-UDw^%lj?7uG0TQg9;wxBPB} zBa2^2EOqAxSLhe)^jJ=2iR{7IeX`nR)Qoj@M(VYGjpX*?`9;}9_ZO`wo)j;UIFc;% zw6S2L4eSDYiL=?c(pd{{T2?Q_iYi0Y9;^>BE=c%W{oDNAUT<%hx8FPKKj4oDRtA{{ zzh|!>(sk^e_5!<1<Y)UXr;5E>57V916f-c`?jQDsy2spT@S;ju$0Bc~XOtM5lT)f) z$!9Vji=HwMc+28d3v1*x&3ilV#{7c(dIduZMi%vO?=i*pGiisjek(aMr(RCa67$pl zwSO^>crBBi<MF~C1w->6&;KlcQNg^TT8aMNX0<EQFe4}XboRRJr?P^K>1nkhYxISn znWvL;;^T^s7fvcTRFGGAeetZsHuvS=w7Slo5qTo|ee|Vhr|6y0e<Dug5BpW^n`*(` z-m+xr#K8Exc+bSq<VAOlx5OU>G+$-e&Rpl2Nc+fz$PbaY-P^g`u4iTF(dMC`l~<HJ zlejvu(A#YK+Q(yWW^5{1nDc5*xso4eyb_tI`ub_^SH*V~q!l~?%eyzXQtras>k7Ig z>IF;f6>0Bh-BfaG$?7HRmUu1WtLR>PjK1D9^De~gq6+!%=AOLRK6h2#WrZi>6ES#r zJvJbtU)HVJy|W|PBQkGEe<!-zzEcklrn^pjX~FM#@8s^v{U>j2LEGX+$=m$r)Cud3 zND!T#7Rwl#aVq1P^iHug&Mv(+=;n<|ToWHu{CH85;-I)u;+14gZ-C#!Wa_)DpPlB> zaj`XN52Te#+Z4SCyyjR(%;I33_pUoRIn<wM+S{WegJa9G&SYh0ug|<U?R%$*{t5ZW zxx}>MzYA|F*plBd?_6%bye<Xx<44`+)NJPo4By*j4o5smrvDTh7fp|>w8!eSpilDd z;(rP{=5NYtm;Y+PXGIl~1A?;Fo6eSK`?TKaC)4+&FHV0kt$u7xWTO3=%J$z$EGzo9 zU~T@?{D%w97v5LAE78mw5@hOr_PWT0SbloDjAj|PruT})A|0&><~wg-ax+rn1I1(F zw<KmKTe{W#c|k-i(VML5&d5kkv{bBRY*h5O$VBIR`w{Ccb(LA-PxIymJ@h*JkI44u z#~D>K%VfNoJ~2|tuB>(izx&_2FDFhGUnneJcs&1uyzco=7rav3(LEkqX8r4QjD8Xu zkajAqYg)P3n&`0T{gKb@$+}Ze$9*eav$$!|_`<D)CyH)O6uKRP{^~7V(H`e)jr<yY zF19xoNoyS|9qsEpqVEijy1Nrs#LE`9DOy>SRoo>0L86?y$NM{YMxV2PgRh<wn~2C= zD*BbP+Ij=2>uCRWuZ*|Oy~q99{myOXjq^5mm4Y9Fht)+r%4%nywHMnrM3y_xI%S=A ztufY0JwzAUA3EowRnzXz7?^oDy-fOXr>-?Gc+sEWR!^RfmyBl?-&EAL@Kk>7f-4HP z6}_Ce*IRAgwrWSVM3=?trR|ROi2WSx7yC0>9O>k=us$=_`-_sZ<KGnhR#?BN3<e}4 zlXrVN{5OMNO%t7Et+ua^bdC-I-2-DK_%O&CVV?K@c1I_dC8{UtCb}fvO*BgWoQ!y* z5I1+J$F24DTBl`XY9tc5X#Zg?*Wch5_$Qi<W>fG$&=S#Rum6PqtpASxFEZU01}l~6 z7S=yjXS=n1)*5I<tSP#pw!!snv5(T*X5O8(Dq~~%l-M%okj{l)O7kD}I=Sy8cf{Kl z&n~>P;O6{Jz+ac5!||zZ<zSa7ts7a6J;hFQjB_NiE&6+GOxnF^wPQ<x+wI7AuL>UU z|M0H&GCkjI?S7YRl>9L<BjG3hOuFvV{x3n1IiYIl*7`AhlWw7J)f4nF-PUSpRj~^6 zOk5AJo?AJ!-Q0^6c<PuP!9zh-u-9MXZ}5Nf&-!hG7lQ3UHRQk}v7U@EWwEwTpeE>C zeU0^=^^<kPdf$4(>SSqai1oEy#o6x+jXoV45NjK|JXSYaBGLl!`AX|meOArJY?)=M z27A0(?v})&_{QQpiyIX`Uwol>NW698_rzt%R>_sgN8N~br9UgUV4l)DtzGtZr)T8t zh!<%ZtsK2NIyQP&v~=`Oc)se+DeEoWOVu-b`~t5T#wyE`{ge5LdlO|6o8x=pmnUW> z1}1yD4|^~9OM*8|Kh;QY&>gJp)=l;ocGRivG<2?T&e}8VE9}|Ud3}%Gi*<I^Vjb3I zSS9WIU~RAv`SP0>L(B_44swG|>Ro-iRmsVVL}No@d9fq0YOzJpv}m))hlo*&?dQ?T zQ+l%69OQeW-ImFciRSS?i}x41#n;7OihmW~8s7~rCnn;FvhMZXM87C#4=K*KYS^po z;m&qPM_!HG8l4^89gW03i$<euBh{R8_6FS_8O`coxqrax<c)BLC4WskkT?}zA3qU) zEiour%B|$t(AA`%EmqID1KIf`eVO%=b;@dKzhu8^KWjf}cd%`HzID505D5#g2Ick0 z-@nF+kk25Cy%Xy!RWpZz!T>8DsCV>9YqN7M@=&yFtX=GNNcwGX_m@4`E(6@RvYybN zs0rqv|D5-LTRB-a@pXJ|{Ehhb_!WsKz}e!2lWdwCmb}_+>UH*?3zi#Om$1IFZnSq} z`n1UI>FjWvNRP<U$j6b9k?hDoXM)|ss;_TUBg~lKTmL$LhPU7C?*5o;oZOI@p4ggb zmE4eA=6>oui?LiutP*v>Jb)FxD(V;X@46wlTxM;xc3JbS`>b?pi=KsXSaV%nJIK9U ztedt7BjEa2#oz!|*I8xOtIsh?tZ&bE?u|Sh*#{~zBkutLz3tzuxmG(X%bE(iE&;E5 z(*Mpo=oTb90!;@J+Y)xNWwK84w&at^`N=g&?JjU%@`m}ngTdwrjIWb=yp^<S+r8{1 z_945BbDJ~8ndMA!x;VS+iuMiG)A~Dg0&C~K8e|4ze9wE_`_~=jmUI729#3YuPq~iw zhS%0V;Xe`V2|7YA5v<DewJNJ8W3<^2bajK~8d+tm(|Vqs0Ulq|bM;i+NjKJ)>A$fG z-L;qj7^|Mt%k;h0VLL0*CGu<JY-DhxY-A=-dDeQ(y3)$i-|2Kc3}e)F!6=ML$GS6< z*~yiOb&0<d<&tfaw<gCXKTJ+fzMVXq{J?$6yWbxeOfp}n4`45+t-CNf|Je@gdQN|2 z9d9}BIqy5IojLYC%hUB>fql&zL51KcKkz>FI(o<5kKM=Io7{fxtL{<vW^ac#&aV_q z2ok}QSOKXaGW5kNt_JJXI@7w*>T5k~^|#tv)vQ8{tzU;`dt+>03pm|~to%l-MzLP? z(4+M*>m;&46<HBE8u=j7D{{v9+iq?jvu?0X>KFAYte3UUydS*luk>cRi<4I+_azo3 zeoa&Z9$!nw@p#K}FLxhu&$^wxi{3W>kKmL!sFq@+zr|`}e`qhW_rtqh<Fs%da7H_g zouBM>_UqPOeNOGfSif)ZC9t{1>)}=LEbmwM8+Wbyt$W7375vunzx1nPY+VQI_vK<0 z&k0z6t~vDc9sFZWt0R!v-RfZFSX=dGy&JmgraSAlz~_3bad{2==>58@u46rA*KuBS z8bq2!(j#e+InHMoo9?piu*zFALBq??TYgaBSMe)(jolBxot12uygJz}xd43K<~E1T ztaclFV?EDX?k@<2m{uyL7waqFpS4}x?qbih=h%zv^LE_cVZUZqv6om4t-*Q<R_MCU zOb^Ngll(M)hxe8Dh}X?)=e6<f@@9Cyc`<*a{|n|tRt8sM?bMy72G(0Ut?KH#^fY+V z0$s_fY}JA09PoEKh04ctIc+dLc}o?luk?D%4qb2OK%QSYR%D0swKLH<YInv|)g<d` zc-&j{2CN77vH3PQ>*srpH^AKk8|#?tksJgpZcdhW8-Ta5?m4%G_p;Z>FZ6#5#+Ylc z&SDq+3q}Y-t%=q?%eQjuI}jb8#J;}0*BWm9t*h!um<1b!wJv7_Rgw2E2PZZCOg|TB zEb!9(a{hh(dwwxylwO3@HNXnId!f7Gh*0}gLwz4?Z?RsbkL&Y#4|;k>PsHf3wa(E$ zVI9T+dY?A>4eMjOkMq29(y16Z=6vZ4aaP*(U=bs&X4ZP$NFTs@Xj9Faz(I7c?kz=J z-kMyV{2{p`nGLRPcJFmNyA$0*uI1h49l>18{aBTA1!k&ts~a#*`%}BRne~h{57D)O zeH}EGVV}TgRa<@a9;}~t8os-h*?`%HRzaTs73Pt;V?M2e-`^kOf9fBAy^Rh&41Nk6 za|_12dobtQR!vktz^h!Vdm;~*py$Ao4AXb&TXY-bCKs^=c(IzUkLt3p_mlQL7<bi< z)Qs4X-<*dq+wi#U*z>GGR-nh}2Kp)WipdRf0?TiVEWEk<7jmVI$vw%-fW<rAZtmUg zTkZij&%Mn%=FRo*3Qh)}n~qqsG)wn|2iu?%y1La9*xX_5w=P(JSqrVltbg<!I-zDF z8Cz!hV`b9g!O~z9a;uWT0e=@p@xOwrXmDB3J@_bC7VHhK!1|W&VWq+(P<aPp+A^$D zdQKTt2YxX?6g;nvAyUl8D!wPx3y^1PtDb$q?%;gv<U~qDwgHQGI=k)n?2h*D)(7xE z>vcc9R2{;6U+-X;zuIf+t$_z??{;uIxdYr$?ilw8_i^`AcbmK4y~^9<-RST39}B8u zWx+aFku`~ouMZ@;MF+Y*eA*am7UsbEVWw|~eo&XtpJ8t7FxGZ^0`1o|KJuwA;1M4W z1_teeYlDu#oxya>HJlI9O;fCd_$+kxIaZ2GV1=i)@bGVAwO6jgx*hAWeuvdRpTjDL zqm{27h8^~?hTF&O>zyr5fpg5+>b&gKc6QkBAR1kch&|Y<V7;N&V?CccOuJwN#=rM^ z7u>n-YvANVcP0GTH}1RG*14;|R~PSRuLWjK9>W~*3$TdJm{HlJE+B7u2GNE2-Uw@o z^?-GgRoeOp`tslpD&h^HU08jvAJ&qsW=<n(S_GTx2aX;>-uPi~AjmN}m@gZEl_Y0j zox-(P`Kj2H#u|0Ku;$=w_`%iC(gO4}4qQF1wjsKA&=svTd$@hf9^ou>mOxk2oXXBx z`00LjWBU|lX9rpbbq)QwI&S_(uG-7r<K5?_d%5mG_==ckd&TZ<An<Q@J@)mznO?Ei zAG6aRWA=C|)@Q4u9)wKysB+NFd-_L=2wFo^nV97qiwyZ+$hQsFruheJPJWH@gRpvT zd2<rhG%xrhSRQPEo~lBNjdAB$$Y}yrC;bky%>Q6rt!k<r)_A@j^Ay7{lRONWRu!zk z_bOJu%+V|LS5{4Xw%ynn>5PFVd=PWwKiXsM+mL@ItapGGZQY@dU}enCW<qcZBZ?CK zXWle#x;Mpp&3grNwzqiAy=xGGEU&%yl6Tm<!C&TI7rcde-F}#X+=^#Uy|D&rf$F3O zLth?z$T_`9PtrFan$E{Pu3w%DTzw16nQVFjYn4nCx!>NvHVuKyR+zz_igj>DAk!ZL zzPKv!7Obm86!yf*!(3hSPUOhfV1>si$Wi`PYxE1&@78VhLHlZ_tJBD_oelOFdjKMH zHZqU($j^FP^K?@^LoG1p;H%d9J^Ui?Bz*7%?;r1|_lGwZQR_jkzSkJBXBPa$&Hh^d zn&A0hUvL%H8T|k@Qwg5*RdqsLrAO#b;g{dnFTrm$)+aFE`T(TW8e<p!7QjwuVIkHG zZ4b@lnChkp))2iLUSbOLI3G_yreb{aKGvLm4s+M5f$ln3(Y+m35x)`ZSa!!MM9ne3 z^a=EIRzGWPwt69FjXGJ*Nqd$3qTK_&{V4p^r|?vdBI_B6`KZon8dmY`8XUt@l`H&) zeoMcpU)8VZSMv9JUn5@ifySnK3%$74!{6z*2%d%2m&WSzGqBEM(%gb42M6#ZV>CSR zLU@jT$XpAt#_~8&R2OSj@s}4I;QJG-v-$;S?`A4uYlF3FA44o24=v4skC=;fSSJC6 zA7JIOQdqa^N?>m+R?fa1b}4Tzc16CmM!kVC!B}{};dth=(taQQp}$=cariHAx*VQr zkY!t=FgrL1v%r<i)SybR#-Hj>#F%yhB4<C$uhmE9y5C#wE%m;K{%Ro7Z1T(E>B}OF z9GYMxJOnex8ZvwyzV}LGrw{7>$m6Q%qZnIGfutKiOMFtwmGm}aoy(=Ln(^=&z2Otb z!7oh18o8T+;dK~ez6`$J!)o3;Q)^$B0^V*%mRl36R#wMTt>IYVy(x0xD%MJ?sXgBQ z%${e@0%x7<s`gfEfwdIl(Pxog>_@hhru(QB$l&G&ErK2X0)IN@NEi6C{Wtv)eluhN zMc#35yZ5d4m)9K6mpCW>eDHgag*D<I1!8_hM%N5aiMFd;;GzvMmxkHbkC5YagO1AM z38}opbsX#1F2*XR&zT3{1$#n6T_KNA(As<;?klYI`94<7R9K0WtHxD=cWH%L<|tMX z&%oasuuAkcbr<rCyATg+AU_&vKW*QSTt*|G*kpZdO+cP=KOQ130u6JqmRcWkA{ZLj z!4X8oA7C%vW19~xwLy*(@lSYvd)n^^PWSnhgTBH1;9vOjwphP+8dmBpixpp&Ku0;4 z3227wJ%PybCDzkz2Pr#f`yWVsKUOII6gqer96bU1nF323Yv#clE&-pbu#)S%)atE^ z%o{-7W@ywyhEW>cr84sHm(+1}y`G{gSif3L?3;kJsrEGNtJ(S1x7HlwG-IrLth&~p z`YlApe#m8dnLWW^Jexb?uke?Gmye*Ik;rE1;(63L_=p{z1Mars+2u9CWUQKfE!Jv& z0`u`ZF`Iu6R-OMED{x<q{H!q^y>C(9AeP(>{iI`7oa=-i12><5>QAu_dUxQBI=TU) z{JF5h)!@}&)yYgmv7;C#9>SWYT$i2x{0P=i&Np3<MU>X}BQtv6Dz-B0miEKQhPuFK zN05<igNK`sS@`D2U)}}UUjV*eg-?AxxDlDl8O#f9L_GZjR@BRH<=27@?eR`~*?t#) z4tzpR&?opDGYieZ%``~Xn0v6Q^c!laD#ASWmAVKkCjXpzszkJv$5UReEPN0)G9Nk_ zjTxDqki>o9=wYDkZTN{#ux|4#9L<LnJpoF-1^O6q(_lB_v3__D{TXtvxz;(WihV0a z^?eb2Zn7I7yDWsZ79zU0w$8vC)zq`_#=+N!+e?B6gQh_YUhZ3DmT&rx_*eVszQ!}1 z)!q+Y!n@sn9UMlWzqLVL&=6EDLx0&=wRkCVhus*5*8$2L@N!grfz`9S0co}HZ2K6p zh7FMP0#Nx3?Bx#d@Hn`771;U-njo6a0$V>|&FuGq!=cCuM;WdJ{Uzk|y2@AScwW=X zT4QZM#@ZNGbG2R8&cQrIF|_ilwb6RrYKt-DbRc{(R?1z4b=KDeQ-jBXHo*mCl<WOj z$eF7k#wNYr;nQ|uRM5kJ-e2PD;O^i(JSA=p`&|lNsvw&Gh;`jhsLOO6`2Et_);keT zC&AbCgwN$lg&0?3KJW?Dc){FdZUV}N!DdEdHThZa&@V%~bHM3K@C+lMwL4JeA(U8R znghAbG3M=pQA~BauH75sv<1*h54(^3fZfJUw~H{p@uJnh`V3k6tMKZ}5!XHpdIfER zn!!$g8a(vPcy_bW`@oxnNIKAa3z4<C-wD_M^cw`dgDJsZK`X@ab*2_F$9)(VwnBC= z6Ta~&Jscyj1UTEP-o^UOjnR5ZwHXxOk4)e?QwC4{iZOy{h;1Oaxew8GAvEwK_!*B< zoDKW{tAsCr-(QH4#T6Ja&9@4yh~2~<g<Neo5cYU#RF(riD%ihT4`ZD8ns(vuP9q9t zBF?l5>IRYE8$4BP<CjNv`kD8(Hycs&U3ld3epi32|0AsAeq>&Ug7%1XpCcC;i6_x{ zKvge{MP9&I=6?OKZmEmaRz#Zdh~~E14O<^!I$$;NGRP1ALfymA=gGjw80#W(ok|!x zRYZ<ZDYeG<>+k}<n|7)^=9DU0v#r<cy3W<kV9arRhS`AAw&m1u*4sVpZuUKP(t61H zR}a!3tKSjx&LR501uFYucHjU;&u@6Wyi#7m&G0-o;nwt?^^|`v;!P$vSP^JsCa+^{ z=Q7BmHmMf+IsGPP3I5VW$kE==W1yEJc(PH*t!(ujJZnEZU%nXp3J>uPMh8RSD<%f7 zBi`-^{tiyy*<M5B1nta?DEBt-HwIbXTHV;{0P1gbdSk?W3}c;kPNs7$=zr1fYQKqD zoV`|OYagEe-JvF%0D1ax$i0>Ske}nP^S<z2$LK%ZJK+A|UUaor8;EKRD>;f$^2c}u ztTSY~2>!G=GKvf8L1bZ{=_A^*N?3>W+j=PUzZa2Y67s`LwF5SNGoF*5#0X$8#%vD- z!(e$Mkps=fbII+{#eQfd9+ZU?2Lem|)#G}<?rDv-yJG%j0p2?}<$Uklj@h{`&gIUV z_GG*vGTGjb$l+Lb>POUgNM<J9I_QABYnXqT{|&s+46ln9^R~J_f%<&+y!$fp<LCYT zc)wyrP|<XTb^Zd`UkeF)n6-NaS=SmJ$1KKdJpj2^0cgJ$Yj{`2s`MkFsfH$EHU@Js z1|1rVgB5)kd>d>A<vzxI)sb1YFttr<c%|KV8h0n=vc_18?Doz;XBlR4XF2ycHJoh6 zvtPHbvB%+AdQJNqYrM4$8g7I6(|<7TTkN;?XCg*N{6eoXo>V`H+1<cBjkj=)13!Dc z4*rvPKVu4dtPXE65&1(^&^8|P_+9aYbDI7N$XSCtI9ngbY)eCR4iW1;_?HHzhAC@) z!J9H4Vq`D_^BXge(L`YhHNjOcj9DH=)aYX#geEs)u4A=6Wvv3nXFGwj*LlO~<7nr+ zy~n-*5pE%}kgb?ueZ+cCZ^HV$?afzsf2P0R*dGtcpT;cx4gM*hrU%9)4ZNCOzT4Yt z>JRci^Pdbn%&PP=A7VY-W>^irE^^Q|`gZ-a{!kx=rpIFz!NF{6ZS^NI{28F>3iz6G z=2Y+!-Yl9NjK|n`B%Wda0Lv|dynQ4*>saJeZ(%!UepdDM7dp>6W;bwta~_La7dh%| za{4+M&T+ey?OW4fsdJDyEw&cu-w|!vnrAS>RNh|-NhdLqI*B(Twt6pOmaDoKg~e`l zE8xmN<b}^+)X^U(KWcK2$qYrbT8&ZmGnmgitgp2$0yCp^CPp(A)JO1=EsPgz!$^K> z@ILaa{=tCYNuZ@SC_f0ql|z;>9X|3EWD_e)J%wBc_TCZCq#HTAozF1`T^>(*XFBzq zO3u^vIqO+_f<4%J0VBa#`YX)onxGk;EbaGNz%plJ&iE;BE9|q2cdd5<7TUmDf-!sC zYlB>3IL3d2kPY35_&Oiszh&x-S^-I~(X}yFk6DM{?@y>cKz1GTBVt=Gyf@VW5}pJ} z&jj5s25$sU2R)GcZVT20e*|5TM=V4XUZ_5UoNu*$uy24zX%smXc{9>B@?7MB$WF|6 zm2&n0+1mad8PIn+q8F(z&6`2(V2b}D<`5siJn1v;DL3wJad%>_^bqzD%%670ykbYp zSlt;kMZS`a$WdC~4EeqRL|?%C{0V&sKIH@bIA%#-!)*L=jIl;Qsy8BkKk9c!E^;$w zz3#-7>9EZn!OM{STbMT)h1{W*8m|A)k6B53sWaK>AL$=m7kMy}i6^SpgXX%Cr-1H( zPE&iVHO^|OFT=B*b-{3q0;YH$xPQ7w@Fvmz<b1pdhvyG&MfbPlOTa}f#M4>G;$99u zz*^ZiU?wI5BO3?ve1q|1;}1Ofdc_)TSyma{2(x14Fyr_X#_oF&eO=gZ&!7q7TUKz| zuMf-FfT-NX?}>;|F8CmrYqV9-85)@$`!xO5j3+X_&g_=?c6yie?rE)~{UgmIyX>CU z9=xCNnSZNyb#i0zgGDO~KF;5mf4X2n;qIcp@ErC~^0;@#Ump0Ts{UJVvtPy&-!*Af zGYZpxP5&Z&dRo6|mQ&igQWXYU{jy%q<n;KJ#g`S8Ewl>G<Q3;_LQC1jr4k#HmVcWW zrCZxKMV^ixh~AV|Eq!y^8)>hlJrSD|*=}EB4O7egEH%aH78#UwU&flu=9!~1zDXZr zKdxeaw?vTmH1T$PR(xGNH(nt=x%knd;RSaTZ77-)pXzT=4?ELh<ulu4Ezca5`DJ>O zv<uNbk;V3Ts|DUe`Y?Ffdp}XDXmG)+`S0g<&aY7D7WZ_cc;PdGxzE0M=F!XgN`IvG z!Wv7c7gbGN%~-)a%yc$_*Y677*)r&jchw$(H_t>=Xrg|@O4?R5GjnM6;8Mp*J7xEm zYLZhr>qV!V`6NEBa6{q2f=}`e=T*#q2X8*SkT)l<V}5SYkwgu3A$mtvVaaDpUsd+1 zGWAM*nf*~lZnU+1rD`3#=Z#CuC>odlPwwgq&Ch%1=jJXi=n@~|H?Z!Hc1a(d@nL%T zv>MUB@rKfu3UA^CYw+aT@eU^&BrcDiDLxzTlKj-0fVU!F(UYu7cmmePX=p!%EMl3i z=#<V{P~wH0@@4CmSyB3`67$kqI;*_O#f|co=DwA`A@{Y5<8yz{9fWtl>K0rm+@9DF zq}$ul50&gu#*`UX=H@apavsc>8@=1U+w}JiCiWC>C~Q-3XYOAY_Fm|C(d0%7+b6yV zl=Eopuk<~cle4bPcq-P>DXpuRjov`_+vHD)FXOG_-^Ux_S@)VmhvYc#b~9eLviCSo zMLef!<S(bW-O?Jb{2*U#OTR0-Psx|cR47xfbjK1^(udmhgBOZU<QC_)C>UIjkv}Id zl0UZKSpI7TON*u_zc4kO4e2vW9w_rpnIWZ4<qR#+BJCObCsW;Pl-wDAy=YNEGJjCs zj@-?7ljMfNzVZIvd-_bYcSb?x=&Y5QQ`7H`W?7wswr=-?7yl;SB3>E)s!%<Vne2ku z%EjJDzrAT=mBdWvJ&^%;?s|_i(`ulXsUg8R^?AmztOhwjnf;}|FLgBgRNAZd5x+t4 z@!U#z4GYfaH^^U+dn&JQe*65Dg-!7Ka!q|rq)tZZoLkF|FY{2Tv{EOscEy(2j@jb& zNw!byE4;tpY<^bWirm}s=HxFaY?t`PZ($9JHO`!t*){X&jI^|#5zA^H<RvR4FHf$= zTLY)#<?!VBRN`99uWs;){Pn>Az0!Wr@$DZl#%gLGvNq@y7>68>-IM)&iATybE&F-t zBPFiPxGr*&T9as&-|ONXdAH`@o;L<Pew{xfe_P>};`@^isO-oMX@6z+Dzm7}m!$@k z8eO7U`rVON)G1ddXT_f>T##QI@8vv_du?9Z{Mv;r<1cvK)oqbyGxlcMS-F|3(%Z&% zJL7dN|4Qim{X~aErNs5|@$rm=N=!)B^#X6bzslHFN4zl=N6!Af{joJ0PvLf&W6_gY zZL{~4ZdG=FnX@_bGCz)9tvk323WAHPbI1KZrp^Lfit26PJF|K3-r~~TAR?uR(jcIu zAc!E{9ZHA-(wzb#h=`P;(%miH9a4gH-Pn%V@AvNc@8fsp*}c27GiT0u>%8Z!lQAG; zdb%$?yQ@^@V^_N8Q(q;cq<MtxwDWkD!rA^xy_h;L<+QV=<465UxIyq;{}-MQT_-b# zW@s4=Giqo2nCbNF_J0=+X`StN<KA#yaQ+_O$8mxX=3k7Dk;Jy(-GCWSQ0qX?z{Egd z{?`un4}KrgBek_#`Udj@Y}@hX1^P5C)0FD?EOAKE;jDAB_shODb#>y;_QBeT;1pM* zw4G_^)8f*brDaR+lUXQph3lBRn)hJnO|6sVO5FLB=~;(oeUhzx>W-xD&N%Cp$b(S5 zzzt7fcR|;vjCV73q?bq!q>sov?I|3XKvYy#yB@#CxzU*t|FL7SwWwA)k{MnS`Z|<@ zIk<JOW3XSKwZAa@bkeuk-zR7_3Yk)M8?he;%wh8uy@+*aLcgSwS^mzxCC8N<ue0t; z8tNFY9|?Sx*)`4ms`9J6uLiy>|N2l`zKnk}%e$s}TZev%<Tk$-=S~h~S)Hvyj>_3? zrv9CD)A61K%UAFXUv|&j%t9GCGoGd8Ok0<>ExnHGmIq&T<b}S#HaqS{{I2*?@q_L2 zEsgXBrgY{WE&NfaDt_7C!PS9Uf$siFey{JXz~bQQP#0qb9{N9s^F3hk#%D|3l5#HF zlkCrP49os|>e9qDjzQ+0!7ZMqnIqYb{)3nKU)+7M?$w;M>gnkjXFP6y<?tUSr)@#} zTS*(U{F1sOYul{ZvusOT5r5m(MXwWS7QEqY<(cLxo{^INP1?b<8|kMrAGyExEeswv z8tQW_&1~tm7q&^n*H*F=F*nvvo91Ar%R}7BAK`wXqroqOV}qlE-GV=%JKPPW7!@PG znYLNC$B#*zk;R?$)9lByAIMfTON+$CaqG+vjHSW4zHRQpu3PEmG|%hSX<5>2X&<L= z&)Dsn>#Y{NVBFMe*gbJ06NV;rNp7C}X7c>R)A1GK_SpU+8vV1#qEPujJzp))WMbm_ zX7<SRWS(=~@Z9r#5v(0PZ~S7qruncm&Nde(zWhghhxQe|o_bnV?M>}3bnm*R2@yx6 zj<JMT=p|S~-i^5QzSiN6n$7@GqD_-$Ce=)67;o6RnYWs98%d$jf#UvTUqA2H-r?T- z-b`ZNs(G7vzxDl%<d_{k5{c96SQ^^~*pnS|9k=WkZGTv6TAuOL8K%!8y^NdTv`{xz z3f~8F1}_Gj!REpI*vHz0YqFZ^h*kfB=$gc?9%AM24}OXk#6A?n6EOtca2zX~PfXqU z+!yQf7W!_*UzMppHQ%>PvR1U6wpr}6ZAXY2Z)LuuEg@!du~C>v;k0lAwA`!46V_|b zjW4ikZD3va3sw}H(c8FW)WVvv28+%-R-{E)SEisDe-NpHEy@*nlQqi<w7ex)A0~0M zVC}yW8%XZRMPsB<#mH;CVtriD$bv@N4c+M*bkg<c&o!cYb7rKp>0|ug+oQex3LnPj zruxKmd};c}geO${2%CHz;>j+VubUs4Ph)o|Z+?wMdm?cY2AbqiZ4jElB5Dowh-@+5 zGX6mODiO}gQ4;^kVQdS7@w??=U9^OC$TjS_8LW#6VAaWm{qPBP>M4=NjOZ4gpNXsk zJEC(=;x!7L^BCIlIV00>5I0>A?@34OA_uX<+sVE7gcy$YtRKF?_B58b`GIIJ-($&} zOYFm6te%VG%Q&y))mz}xJ*;P7j}y!F2)zM1&sBU<-L-t$CDR{_^Ifcd*RXrcz)Ic$ z%Tg_3%S*EMti<ZG9+u2{SavJ&JrQffapDl>qt$=SYYv~5(rbxh+GCu-pK{%}N5r=? zQU)(i7uM&CSPx&Pzkae*vSIm=>>v4*YRZDwN_;#m@yAUhie@V-itTtFxAS>Ez1qWS zZXcezbJ&jVVpV)hJcmOopuMd%*LpFs!Ene>EHgcc<*0?tOxNyk_k2?y>~ImR>Wi@F zHIKXv4d@XM-n4)45}v1@JIF^k&idmj9;pnXm=jsGzJVpGCARCnSkq=>N#BIc@MzRi za2VU*K~^cdu-}}+R(qcuCdrSMJSW*zDZi;OD`q+Jo3i6k$%c3CeJt-yuub*=vVGtL z@zV{!_Voo;f#Fc<L~yhSJJKrC&-f(&;M1Sj1=ch29l&6-X(OKIDO}wV%U=yvwW*9J zJ!(0=h&6LJw$?q+%pU&l#`3xjJJgSG#S~VrW3l)3!(Px1>t9nw-vYYo03UqIFVpya z3fwY>t5;&*JVlEhteh#dFI9EpqS;?@;Kd1MO7YwhSnJ;6y&Qg(vRExD(VGuU4NT1$ zT~jdE7%x(FMq7iUIv%nLcxL2P1y5dmxTq5_=mrG(L7Tn#)P@lW#kPXm>e13WJja1u z^EKYT7tqKHEKL7kmA!;~*@snh8*AD_coVL&>bwizTm~bDIkN-n?|QJbixuQ5EbPDV zS_W_Zf<<~E(AbQ0ItKo(VOPD+ahvvEGS*D;yJXLkWJXwk9E<npX+?Z{&7*ltHSzE_ z<J-IR{#`~^HTqtcUcLczvT#VgS27mzY~Z{gE#$-7loX`_BIY?~!<w8A&r1<r$xuWR z*9)~vcDzn3X9m4UhZCM)^?$;6(~$yF`$BT&U7UM`-R>Iwz6cDCW7D{U-{3K4GJ!!R zP|~8lAgMG}mRB*83n`F?HN44mi~CRGhseZk?*mpkUZ7O^laoGVp}&$pY((DUe+oS- z!(C<gr5LzPV(eC~aN#vF@h+Kb8rgqE@F68eZMCV;he2zuNDizV1x%HZjJdeO$#qZZ z)f23xR~btX+)1XM5lQ0rL@1~NSbhgMyou+u0#A11Wxd0=Q?bXKVT>1n#iJ-p9!BAk zO5akT2dQ)9$6sRQ`SDnUgyTFsB{iBYcpZ#NZmkBtCDD2oUZwEa73N+Gcl#sKn&j;j z1{+y{?=#?d0mxjWhiTBlV<7YZU#^95CedmFZRDfR1sR{ba)Z}o=tQ#r0<<MLtdc1z zd2g?|Pk7%J<#mCk@QZwxYb7I6@@~WMm1Il5Vtk7BBtug2xU+M8Zr-y4L3OX})FTz7 z)LoKms484Y*0L!oFC{P7!c!!BQ>xlY2B!oR8$3laSLIpqWO=@1H_E%ZSMorU=xJ7- zmy`Dto~7~zCBskh<Rzz5s!2(07{Q%XE0DXKT${|1#G(Et{=X*+tw`Rb<Ol~Dv1Bky zcB#r96$+K!iYHe3Dc4HABM*#@NOCOYC1(kX<~qqWRZo<f;gYW|ZAylsWI#%eqU453 zc6h9p!i&;Voi+s80)17DLjFr`sMN5K8og5ELgk#REK%u++$$N9k`*hTB^OnCBO{7s zn@ZNZ9CA*e8iA|Sy)vfQ9nwdYWh$Q}GgejJ5_*wqRGklblJr*kD|z^GNH(RkD0qlH zBSc#Yrt(BZ<pKk_TJm`XGV1B7C(?%WTs=oxm8Zxx@+A2#*U6!ts<Jtyr;=?gV^z?T zo=H})(4wl@F1QmIDM(2>G9D!z<iEn4s?4tXCr?!nm3R59a3oKU^+ei`L;mD0`9;+w zQ1y;t{Z~&`SE^^m#vxhGir$3JRJ*a?1cRz&p&FH!uQH}%&r<ME&y{D%^A%kRWvYyK zp(UYD)spmBwJKK#yj1U{*J>=%_J1wPH|f0^mm0aeOW$ILv>5B@f1f4SR*gj6FVK^7 z>MTSOr9ah%^hN!}+L1fuDQZ-5r{Glah{B?@q<Si_mr+Pts&(nVaK8Mm-qkPa3gH(; z!T-@&Z0ypee3m}TXQ9T}bA(2OVpY8>m31E5nN-fnFCzPd_a)a{aigLmd7_dcDx+QA z)jcuV5Gq#kL3mS16d9A86)CE+y5$P#pBk<F8iT#SFNSF)N#%_E2}~7)g-6sU;b-+H z?a7}yudbCR%Aee;AS%677!~;-?Z~qf{U{vDyTI(fL$$Bo)i|UzH3Ff-*e~jnJXy6Q zPn5s^u2AQdg#GV2IjiVH(Sh_&upOgug-Lm)U@=B3f=#(X`YOMP%#l`vw&cH@S5iXW zMQX_J{~a<u8I2mJ;zzklT_^nfAH?KbjB<tk6$Q%`a;P?i3Z&|Z)H8@(t$vYSN?#RR z{y*f@$kZ>20{+9E^i4Qh@w|e2w2^49r7h{Zg08}`YDd9X;H0oF@9LBERsPg7<WALh z1uyA~z&G|M?Z~zA{QugQU!@gkU+xyzO4X=jXx5LeCi989Q#1>y4I!<_m}T~k^+WE6 zW&g`Lfu#H?h{vF!&I>FBHnDk0!Cbz@u2(In9;p_jEhTlNk1{UlmE0-PUvQ-GEWMBs z2+s@l<eS1>Y`&5!R80ys&&deoZsB^lCPrJ*hJ2GY)V+#k)V?69ZN*jUU3#dnD|4&N z%}T$LZ)&bp+JoZJ*jeFL;aB;t=4atx^-XcH!nI&5hCRWyk|%;ixk}C`8jv#rWyO&( zNvmcBg)8}0AT8Gk<W&2LZUmkRbLvy<H~FTXFR+)kW6zWOq}^CMG1`{jrLEYX!kvPY zqDpm-JWY68UJ9RzDx_Y7+$&F&XUhz%o+Evce*gDh-LE)PS`kVRNg*vMd`kO*SD^%@ zZAjnbKEbh~8AUhJid-T0%Qdl)$$8a7b)WP>KB>N_Sxf05F-lbQsQ6i~6<DZmu{LFV zGA4nUdY1aGu9fk};3sF~kf$lk2nWe{<dB-c>2PBL>jr^a0I!i~lMX(scGXzayW&eV zizqq~sudkabWnM!JVEZ0Q3?FzC9{%zQqoJ-B|-<PHxX8cS?GnV24v+RYhOES_Aab> zZN!OR!?JOK)z@uSMjE!HuUHj|J}0aH1k-)i(PpmB$)|^0D-ls9{0hHDva>S2f|X$d zwyc$`(7m*Nk2POaRy2>O81iOx9o-&#+VJSnny9c3SWjnV?O2_ann30@Yxr$gFn00Z z#i~r_Ij@N=RTVIuth`In$^dK(?XViuWhGgXGdYk3MOd?HT<c?9b(=NwH7o(!X=Mc# zk-xCi>}Bo0603-;@+8vmAuBzxKAq>+ct*X65j<tYZZa{P^!FjXmle1LSk*T*B5J5A zpK`I*xrtZ(4r9(~DnyK!)X&RKB*9B86T2cMv545Qi?qgqP})=rs9$2GXJU1G3kZ~? zzwL?WTu*+$2l(S#<7Xa+_jwTUEA6xoh?LGpZq8k-KQ(#wL43-eVPA`j9Kfd5nP{IP zMiSXFHmsE&64x>VE8uS9p-~jO>tC#4Gs*m%j8*klY<#cCb}$jmy%9_6GBPH+1LH8O z=Y7N%yie>=ga`=_aXj~oToH3*mvNN1q^iVuJV%;cj+7#bw*zCYPmKID?5DpIul_Z* zrwQ0U8$l5ZiF#}Z<~p(FFMuT|2eP;nRudgObq6!DV(UpHWF9PWugOn~5Q&+SY^mqO znLX8a5rw%$U!cFOuhBBF9ZieeBeL>n_!p{?n8LG&G5<R_j|`QT!C}Em!RDbSp$_45 z;c9r=eMWcI{KN5q&(h3#C#>N+iNam3Z`IdfbM2!y)C1IJS*SH8-e3kTZy*Lsi%c{g z5Q$TP$kcrt2RYJ14at^$9B#|FgT^p;u@A9NrHJibryU?$;|!GvHc;chs%;`V?Kj5R zp7A{c>q7z~XUi@Y#485@YuNi*sYLv%D!5t!^Z_0tZMmy~2qw2ZfOw7zfaZfj=i zYRj;GX|01@yC1m`*~|s>vYH>;c8hSWP+l@BgZ?glr{Cl2=d=3q``-0^=_}<=_iqXu z30@;tY@IO`yygIo8}*6iL1bx-vF@`Tw=O4(aUL04cP!N{L(Myh-mj~TF%6CkAa8k7 z$Qqg&)Pvmv8U70_ek%ob1)7izU6)AKM^vQP7MW&hN<P?haw9L8D_92L7cOqOXC6<K z><`3K<<q(m9sFhF8qp5Zh!FaNSghYdnV~M>-Qicn{7aPb*O7YIUmKHGHcoG5&TV-} z-sVKxbDLqG<5=#P>Db`-+P>WO$XeeTZ{c@+rKw=#NO(*rKKR%_#dqAB;rYqa(X-Ig z)w9ME@KpC+^2U+%+%b44WHrj-Ro|_h(SI@zw&Y@@)olORO4>iNXWGWtGOgXnzME*- zY@SEHYadh7NPlB}cxz}_a5qcrx&9CR9q@*h_E+&A_fHE<2`>4c8%#&>yjDsk&d^ zXf9wGXt{1FVJ%^GlS^o}v@;(h8~HaP1MA^KpN)T^S2!4273v*&oA`@X#J#)-RSEw} zR?~XpJXJW#5RKD;oXacb8y2(e4f}b!9(RHK{L^u(<Nk0AwV$-zw_dXBCK9N<c7^Qd zrJ>&f?fnnEFFd6@``zo^ciem2|G1lY#(N5SbNFidr{f7d9j+M}WxAt<^tI*%mX_9= z)^WBn_EGk|)Y)loKVW-hO(UM`Yk0__7uHft8;zCW4WaqOiahsM^<Ve>>YL?D^Huau z^1t*?2y_b052b~3VO5LMtVD@iG=FWmM@CgW>zmem*1s)ZSY8vWT1YRWbv7Nt9z550 z6mA*5P83)pVv<6^V&r^042>kheh}9221GuZ@u0LKtNfhak*Fu#ddr$&n`jT&mpD@6 ze2%{zlN~GUzuB%>Pg#1KyXc>4nrVUYW_UxeQ=o>wg6}i$m!7O1ho_9^L(g%~$6kx? zu<wfhQXm-oJbco48Of%7tT!i%$Y~vIJ!8#bYh&vJ=X^r`?<}i}2)uX9U+O2x?W<#I z0(~zHp9<v<O$we1)C^qoukbG>ce@HXVDAU-1{ag7I~dyh)KpNrt}WNQnEmG7<Tid~ zscmtQYn^KThB&x<T6;1pJ4J%T1D2-7%EWM!a2sO2r-xUBUn6OzAZfmc>_-}wMV{?2 zS%{XrN<K>#WX@*Yj>l)9#b@bbeb2Vqw%fMTw%B$DY8r2OO6JK7{WfwViTEkIaW8a{ zygOT<q5lf84!6m`PWE^8&+*^!_Y5Qjw*(i4#)k(Q%_DV8iP|=;qW*(^N6%*dh|K9j z=2PZ0GA92da?+&_(9@AfAL5hg#Y{IF={<nx`!?iEb`6yS7NtYILWe>Q>aUy(*C#{h zGrVD6l7ZHOs3wn=q9;-V;51{XtHo<u@V=F%=FVPbv9U<97Q}FVNM^@Je4b8x+Zrt7 z*O&>N%*$e{bD$rjga0_Bd@knShRkhUi4#9g4W5JAD7~opx%s4}HreBAtuw57tVb>F z$Xe-0L|H%m1=*(4kiv(JQ{fk(!l9wTc)W&d1M|roU5iY57|0!L7F-Iw?F;n`XE#m} zN#>$b&`Gke+9SuWYHs5A>ymFZ0LWL-GqpWr+qS{ilg`XG5Se@j??prWG&h(X`WaoA z6-P5G{!Yy04I?ocb-4n2vYDB>3jOYb?{N@*v5x2t?eQ-)#y?S+U#fD{<bQb}lb;dG z?mhnymAe7o!91QYmWbmC_^kSoN7fn7Nptcu`g3jxy2@jGgkO;@oRfUUmqgj*AbN4B zr5y2fzgWMq7PKBB+sa`XW%dD&b3~ObrO&oVIiqcO37j@DSSjca><?@R><;`LC=?tO zJWnR=AE9#Lo#D<#JYI_e!1^T_4PTR&xt$#4dCaMufonx#!EfTx>&QHpj1B%K^!hs< zoJquhPomE=dH;r}#VMTo6KtQrd-4o@E(h~<E&MF4fJYZ#F%WFFL=P*2g*zL#eu?gM zE~+u@Lu2}tNZ=`vVR(uLaeT?#H;8D+p?Hjb!mIK-`qfEvA%n=)yl96-(0pnG+n#uJ zdZFVj#ygi2U-ehS1{WYsuc7&#xw54<Ii2OHe6W!?NxwcuPu72;CeU&EbClT856I-+ z6Dkop8=Oytt!}|@spDY{bs@gl2sI{`p#XlxvcSC%Jzs=x@F2$?JZ59ae5=9OO7SX+ zmKH>Vy8{-VqZgU67-a>wb?Ms>benI;v71R&*L>b5;F<1;w$m29@&jm~DA1JZga6<+ z*@5@yJH|f|T#qKt=_}wVu${~3*U^U~(8w+P93gxV`SF^R!T(Z<|ApWb@e;_oQZz`} zSxnXfL9|OZI(rtbE)K<Yp%2$hdC55Jffjf|dxLD79AtQmLehU~u0-7W1$_cFmUfZz z96}GPZ=!-oq#u4{e`rGJy-*%<@$8{Dh<4l*N(#3HI=*l{A}kZ>>*YvpM$-_ebU=o+ z!82EZUYYR<$l6)_K7M=_Ptgg(tUSc}CNL_F7FQoHc`IJcIX>h5M!>Zq+Iw*{?2=JW zNG`6HyaOM1KSPhc&C^b!NuT9)nnN<Fu0?%WFYt7vbI5MIvTjkUe_08Me@m)0%6>OG z_{s_W6b5zz#dnZ174bh+M#pT8uXHy4_cP@6q?31H(aI4KdmdR_nauWT<bYfCe~D}z zM;vFIcE&V^9><$j;h{cYv@^01`*@XHmovOSCxfSi(U@4%#l}JO=0r5!Zs@!};2m6r z{=XCLSXLfe!R?<!hi(M_`{1hm_!f^c!h4KW#t~snlOI`84SH$>C$&bF^hBx-K)!T| z$`$c}egv0QhBwP`<-3fi9F$Qg>OsoGNJW!OWVI!$GJ%WKP81K6_yJ#`<30y7k9mK= z8TtM%zAag?{L4ADw}-$p0z5@Ri)BQ-G2(|Sj~3H~JibNbS?xk2y^glrlE~q^S|&Q= zZDJBO5U<z=Z@CX2`U1SKRiXEt$hCMfx)%`tJP<kB)M!MM?x)N%(~RZDF8t$<4Leck zA0zp`0cO*pxmN<UEgTz>l$-gyjYIx#<oz&G<ZpWYn31^YtI)jojo*Rpn?RF&;op9E z!h1rU{qbq{k9vZI4_k3G!<$@<v6SGhywFBMlyYAKjVG+9WQ}?eDm#v^`V=%Lly?Ph zu<*MacQ_t`tyg$>lzmp#@M0N~y%fZ|mW4KRL2Ko~(x+gK3{heu){$Me18G}{xpFi4 zB<qMp8$o_YJu;Hq%y<it9Ib#?GV9z~<hG|o(#Y>PM`ZqPvcfk-WAy(aHzG{Ldn(b+ zHHmcZgY+DYOr99^u+Kqu%p@OY3UlooX4^$blAn+=zq3|7$_O684`J*9sqjKYAk`o$ zsk_4iBTXZaS`&$3na0{?I(gY+S(AMM&2@#lKZV{ZLSY4=u&mI69omqps*mt+UIRYI z@s96@ws%6|dpYENH}CsdWgf%ldXCxQCQy3-)Wnl1J`$+~oCQkFPpjh9E{J?DiO;(X zlB9Apj^PXFY&>y2Q(0pkGx<&B$ja`_%>4-xt%6pFOr<--YAmMTy^t#T@Yrr6_Tn>E zWkrBbBpQ2holJ};#IXd3xNs7|TmoIBIngZrm}^D@r@26B2{8JR_a#8;S9o(3$FIO_ zD^zx#em`WSBFF5&tsp%tixjI3?3%%wo#BSg(3sHM5ay&&;BYW->&4j)z^x(DO}O(- zXssX|6bIx2z)oTh9wObZ0GTV;L(T!ElSur7K=KH<I?l8A1I7J(JHc;Pk%IpK?^pCh zy!Wzihj3&bAeaAtM?Pd|MKINt=Z}Y){)7YXk-eV`eU%`8FB|$<7%BI+=?Kvu)1k{& zj3hg=`&DGo0^rdfifTyIO|@tQPEE3mK7tNgkfYFvC>5!ZG>n*zam-ReV^iSMsk~<J znhnLyh30;ULh%pi?Jvf26%I`U+g7NiAoL@ctp%<=M)rS>EECA}j2_+K)o!eWJF&k1 z9Jsb3(xWl5M&djwGPlaikP~{5-ASZIYzFWXPQA%9E&!pU!0RA1x05GtjLHa+8k?}v zY~jpqpn8Jqt|Db0A>pKQu*}-2Kv3p|qCDYEX7)FDFU3&?F8qYv2?fr8ceheq;uz4B zIGJ_8btP0c8_N6=>^G)|CE*DdV?7JT)<H!-Ft1OB7QY2vBbY6}W@aBrp4w=RvHYI^ zzfOqiedG8hIj9q(ko*oT{1W+%UT+2S5|ME?I)@tAki;HTj%U>*Rzz~To5PoFps@~7 z`#}eK+mTNlIM*sVx5^w*hj9q}MDr}kIP;=|$sP_ugAy0=6p4QaIeI-xgJ+pnPXVWs zJo#kwlahZ|;PLCw-vgwr)K?ZCu|$^0OfT{-D{#yPBqbWD5U?x?t;<|4&=iUMF7s4X zdfkkkwWp8L(~e+UX0y-H1RBF7b)k%RxxQdj8jJSuDmwF@r$2|0Bs;<7I(Tv!hvZKy z$@VjItHj_)JkIY}4%dPEt;nH0(86)BA-r`f$~VuzdM2Y5xf2hzvPO9)FVB+*j$+83 z;=Bq+k7Dpsp(tPFMT+Nw>XP9$(P_jED*kcV<w9!GrvZ-_9M7OenMp+(k*f1*7Z9;h zi#1vNiE4MyBtAQUSt1ZC5uK|VFn+;e|H>%lo<y$w-wdJ=4$d3y2P39;K3HJ;N zz6K?qfxkqX*baTmjJSc7)oNtdYM`(h`dJe_*7A8R-_}QClXh^&fhb%q!wI*+{S*4@ zW%d*=d^Sc}5J;4U%H*gB*4}59tO3PUhihx{Nxh5aR0YYQj<=z%^7OGZBPs&qaxu0n zj8J?-Qc+v#a6g6X9?<h!QEIyh*WQGpZZdn^;9Tr=4{Co9oztaf65}KA6ljX2RQ|*g zEi<inY{aiC+KGxBP@iPy0=23Xzl>ZZo*A)RtH>3xP%FE+ShmG}EqjAV{E9?wNPL|{ zZ-@pYHN{1<OyjfKnMCj^I;o0s5g(4Sri)ia^-FB>$`2sE2IbL`|Kh6>7{`7S-=nhD z%N^oJ5O0FStB4(4EbDScJQQ-3v@YMowl8hUc+_X{xv4f)Yr>Jr10em8&oWkZ7(h>X zl2nw68n4=0T1G9SleiW2QaWHpl)_&{AtC#|2?vQDDc4H<b*a=XhqSG{6ABK38^MC? zf|(`CYZ3{RjhQ9~->HHNHD}``(MWPmVv^)tcv3RKMVjP_{vr`eIih#UewtbT$3^11 zmvM@RTX5%sQiK!5_Wp$9F_irfiu)I8ddTrFXXLxQo^m|n5Y1QZBOx=Y>=U8(fROQs z?@f8N1Ov(|Bs3?Zl6Xa_WiJvzqPQepODIqsvX_QjCoe^%%8#UQEEFfcI>EEho<#bn zI`bk=6-6pq5t>r|CFQ3UPpi<fJY9Mr@6x{VNy@d#7cTT5)FOCSz8axZ1t*D8k~k)L zkL@TfduXV=G-Tx{5lgaPhE%#2D2NY8#WN^)2qjC)LZ6CKWBeq3HQ_QDy}YY_#rRIe zkBPn_QC)&v!DdQSu1buT(1<`*_BfSDJUJ(aM1Bc`CHhSGTE+JWFNs%FRf-oWoc=%j z3k8Tgeg=+(4xUBdpG4_G&dFJMR}r5txJx)(XkDmY<c!2?DG#jRM|e?<HpX89U-g-v z_$+u7I4iH1d{TdMR=7goCM&R5jGgMYipUVWC@PD=RGuZ6R<KllXyvn(kqb2CxBooZ zBHt9`1rI_4(ho&tio%p%S)`W8P@!<)TKO;EWQ8nv7P+AAQy7;1D4LRy$vO3_iboKb z$k^mhNfqU>mT@X778uAK!l6nMNqZvC<R#;ZMc*in5=o)(E-{7@#i!_8NkE}z1@#!^ zsZq+iikT8A5RBqaa2Sig6L}_>Rq|X(IH7Ne%@Z0|F?KR~6+J4LlK!hd`7E3&u#s3t zxk~-2#-_Mf$zkOiRn#f|UWF&Yn0!+nWPzuO9Qe;~tR%Cvp&+JW@}ggWu;M%w2Pl1! zy-m~(7%JXSA}>W3iA4*@-O@vWlJrsLkl4JT_*5__hu~CbTXFM$6!YI%>7$ZB%6}~} zFG7iGHWiFWJJO!$I4aUo&0Er%w4<IQ)Tt;pcBi6OMGMl3n#<&Bd8VSa|N0%fE7oUq zb+qfzH-U@DC<Ox*OCeB@@yFmN*C>t?%nGhm%w}xvmsnKMF8+(pP&1`mCBMlG6Z<6J zgk%1Tw*3FC$rJy>iJ~4wRf<oPM3CMnc_7bJ&*ES7v-D4XRWd_SxJWxCW8|#*lU8F~ zpzy8Wtt61NCU{WStIrBA0$;_G3P*|(l+==T<Rw?CIYekcVN=nM!n)!|HPc9M)IIY2 z80OV;RjZ0yRGW$_<voULCAHL@(w4%%yvwsxd;iIw*cBp2WR8pdBL9T~q-6!a*x2Qa z`jdNOkWlhY`XtvWD69X9QewX=>8akOWpyZO6N-`Vu~yWx74&5Gj`dCODxcMN^?U3t z^&IJi;7zrpzDe7vUqVG9Z-pw<I92?Mg13U0+$mQpoC<#BerYMD1;`cZvwDugSqx7x zsH?Mbt^6YG#l|e>Vl=Dz7VB^9nQF|6f}|ZqF)`{;Jydv=-(vcT`Y+m?io;P7Ms_`x zXkazl$uII*=@sfanFUoVLM4h86OmEs4q2y(gpntye#&?hZ;IR(ewR5>#jOi|g`Y*X zDt?z=h0o<(V%&w}<(zzy|H9*f5s@HD{{H_vlmw7Fq~+N4N+!i%C=eFOA+VHp`BU^R zpA=omwQ`qSp$>%=d9J`y{a4tC;Yu_%)q>zlu8L8fe3$#BZAFXG3ppcL5xhyPQ0%jU zt(x5go6@&fOQIJ^8$un@s^Ua-t$G*8%e*IR?by7hB)pO!a)+V}X<MGFW-ZkZ>4l=V zSa0Mib;O>f?v_3&46B}7SRqJGg;<G1Gm^0?Tq}J?^jj5^FEE$h36)461=eB_QE~nX z(=xOC7k@80i;7kMPx6WM7O2Wg@;(HHs!f?I#iyyX0r5qM&aJd<wP&`Py+zwpuvBmo zDwmb4qTU$KN#8^_RXVC@=x**4+LC+alcER(U6HP8|8U`WxytuHEl5_gucKP8tl?y@ zE0r4}E1D$kQ95@DYpz__dBvKO18qEk-l$n#$rVNQ9@gfPJM}2KrcxFVwQ5#54<^Pg zdcR;Jc8KmTn!o7#vRkF>ekWs*)uia*FF7PvN!Deer3t0UY$LkA>Xq~>KQ>QULFS<? zSusklCFeuzf=U|@t`VuLU?Y&0Z-O_`EoGcy%}M4S`6g?rcz#ps$xxI+lwC)BPqJzh z3z@7YpGSX_tSa$y$sIc5kTK?uu3WPLCy^P?7=x^nWmhs88wtkPpzhO}<X&ac7kP>q zs(8uO0yWuXPOX`Qw_NmJv~&yC$y!gwCs|KIr&2XlU@Lu=y|5&|E0cDf@Di)2NG!E> z6a0qghm2l0$b?NTBf27f%+piBfn=85#?E(v$h9@tnRj9JdmLRG2N>&ZtbxyIBi>Xf zYQqz6RBfz0Vr9<4^9x}sdIPIaIp{=u0v5hE$8t4<qYbvy8l07JAIFxy1}oHt$bKwU zo3Ynz1fo(^uOO|J!Y<etJLSh%g(cEU@G3Sp$vxYTJ#T5`m#9ryEL)OU=fMgubR(mS zhZ<xR9t1acxc&(KwDm;fE#WywuyDPO!Z>@>7TFAMP#?S;v&nG$fl9nz)7Pq4C-X%Q z;kcKPyZ9=0VZq%1JoZK{@)AS&nkPzpU?bBo?%hSroHb;-j=`E)1PmU*{<fMCuD~KW zl|0VRiFRm=wR{|HoS~2Tv7NQSs@E@S;Ty_*(`aWfmd|3~<Th5zk$4GflDAre_Xb4E zv?2<iI~Mid>BAFnnFxH#0VVMzG~j=gs7+k51GCa=kt<mlq4*>!VL|;2Xg1<=33x=- z*fK-i#g6<VK95$^cFINde;r!MuKleI(({|ss8swjRS^~wg(tgweM>%YCRxDu!(M8A zWT8&{fna)QuyG)gZrVvka+;nFOP0cWT$p_1jpkbB?B)^rBGX4kTIfPBE?6<xmU_Yo zp<AJu_=+cylY5l>znoN%+H78H8D*Viy=ysX{#qZXVXG##Y5^5$4pMh>4s~sRpti)* z;N;Nv;jqz@s-7qG7R1!tFz==2YA*9|{l2yX&teelt&J=+{t8#YPkn=EyD{NpV&!HK z9XXELf`h2G^D|X;y6Knone6klnW}U5s4n>rQL&cDXNFEr_McQ-92Kq?z7#4>jj#`? zX7i7MjmUIG>rCC7eH=ehmHr-H--6U!>}gs<MBWr*MYu4P(B{$GK4Bxg-snqa;&N)- zHP)8m^*p3Gs6Mui+H(n7cXr9TM;zr?YNvfl^~xLJX+}<H;ssTVRuO-akBH0-RN$_H ze>u1Qgv{a;?IV-K1LOxgCCNk2gXhIXY*aJwb_NP;ir?We-su$WE)kpo?7q+l@U2Uo zyeqUnfZXpgRNxt7oQa&!o|$i17u%mZs>NlGJ81vJTEM*B)ZJJa8Xa5^SmyuT_u4zd zTg*Fzy!_|>8li@fAN0xAVvZl;PQ`r}_t3G({*G<F<!|<gdm4Gms2-{isO&rEIq#nA z?%+A^EfmNR-V!mW$n(r{(%Rm(!#3Ym$o3U`p8RS4P;X{B5pGR&lOx_ZuhX069pi5v zoJR$opG_6?ZsxBn`>j)LPuW3Zu>FDUf;GS8wALwdHvAUle76U_40I1X3*2B&iz?Kr zS`|suCh6DBt1Q{rPhldFh<B*dy-w?g6`Y#I#$xbaKU9%QZs(~pzBzOxe9NfE9&H~| zQ*bENK8jOaa0+!eR}l9)ggDtZBeRU0#&6+L;isWoR7eknuNh6?_z^^so~7FFA!NgN zd^_FYqSB^6;YUa0PwKk0G#Zk5ejK0c1iUlUcBEozZ~WZzwBM<nUXhyLt+e~Z!`6eJ zU*m`9g}k4PH%uz=4k4yv6}Xy&?fWU7j7PMv4IkuMsy=;hj0+c|7VR}E1#bygkDS&| z+UCU_c5Y1gH^J!~Zab~-j8qQZ@_p)C=H2Ca>B&h-q2F`CyUVx8Um*Nk>usAJe<ksa z<Yq~u6WYYTY0ql0Yi}682a5!3{ypANo{{dut`@Gz?ti^o1CxzcdQV&NxJ&W3<Ilz| za5S|qvVLT)pnVXbW>|1r;9uVm??8{&z0LEXZ$n^DxS{ERzT2|R+SQidw%Pg?HT(aj z%G<Y8J6?)^Zg%7*wLTk!rUyq-LoeR=*I3PbVxszbeW2no)g^MM2o*lX+xUUD51GD( zO!#H^VfPa6cbQ14^+ZQpFxpey{CuQ4wfzF@Ch(iSntJ;-YTNE5!nPt2J6nkW{m3+u zDtc?FI`$Lw^-54rd@~ivst_wwl}h8;@bwPB*S4RSmk3o3PlL;zNXW}b&puQr%NChL zjjEwk2&e+ozh*XShA%ML^b=m9y2LKm(;jHQQR(6#aa(opbQdxG4n>?oX8uG(;sB)R zCgze^WVg>C3U_U!J!7da^By&`J5mq)rBNaBxp6oAj4H{;4XY)^@q7G;gz1T^obl9r zxnL?C*hCEKOiyK^66^csd0YE_4fF{P2vv#f)oNJt#m`CnCwW1#Ik7|B1#7bTW#rw^ zE#LQ^PVPo-o9C`)5_P7=u}tY>l+Y_!=h#1s?~|}Hp`!D=W1)4PPSgyQL2~*xdXIW8 zd5ZaV`M&oh_{#^Dh89Fh>zyp$vggt(TU~o+dpBEt%PD;_dn&ajW^fl#&r678+!!7f zenRbwUk$S9sf1RMDjZj}UhJDQf+)UWk>S)Jdu@zIW~Bi!2R_G^@I@2q7VMy+MOnjS zBv7U5>+n6QTpvabH#1h7a$B~=ZA`42GAzrqlwk?$?GE$o@Evaz*XqnunfEfUyUw~& zT_3S)n#=!lI7RPd+aGTvy_*_H-JUWjVUc}=`F3P>=%_!Nx1zh9>n?kgozFay+0mWk z%M9kxUR$Te^-Fj&X;9Me#J}Qm+H0B*MBWd79GvP8d$)St^W5<)^7i-jAS!o8C~stn zKGFKKJu$9zoW~JjC!1rIbbThfj*X*AZkYI6U+}9yUUocj2ik}BgqyP9$jfdU-|8MJ z?Up23ek!z_T|0rNYbAc#O2%NKc4vkc8yg~hO;_=u?*SU`m{vzx6Tv65Kxv`|gUr2$ zxVjwG6-NQHBc_ge20Q$8ur{@}w)8Q7s@KxKFiod2sMV+&9viyN?AkjpmR)Z0gN@Y4 z5Yt8Ng+AMS(!9YOVrPxB)DfJ;4iX<5pM`&={@}G>fl#whmhcC}gnvvF$xZ5B_hqNY zR_yq*(cHw`msxJ7X-uSz(IdP#<f2kn2jbeC;d|kUMi%l8=2ML>gFS1;Q4wjNUWr`+ z-ob1AfNG7J@iR4VZ!uF14ws?2#vNlz<PXymt-XFgPc%=~a}d8gfa=gSO=H<jGM~|m z%6*MPLPJ#d)jL~v*>gD0Bx=bWk{&uY*bnQ~BjZDc@0oj^`+z$=GkfN;%#N9jGkbat z23k<(Yr5l+Gk?;$l(;Nz_TXD(-)D(vWL+3n0yVrISNDw1)9R)*Nk5(Oulr%(J=5Qo z-Hsm4nF)Gga$=fuVtlE%>QsGtrF~&655#$`uDFaz=^Zk1xXya=1(t{7wF~AM*2lIz z_7q23N2+5C)IZ&FidjYvFAPlezeDV{%ik<GC^R8F$!G<)Hz5*Yndt;EI>V^r(IM*l z@5DK`sU)y%ZT^NTmv8G8wK66@JEc5ehk+@<ja1>R8O}~sqBrbAoIfSUr&h|6H~Dfx zdHdh`{zy1@-B-yw&(q%3mWpMEUd?*B{B^P`!+SGS$$Y}`L&EvwxmivpcS+2V&@{fM zBVa3HAwxb?(pQE0Q}<r|`?C0}F=<0xZG5XkznOlb@{}_!Eq+?UzQlS-)stE$UUbfM zoHgf;91raAoXcE9t+$uyZ8BH6`+Ix%HwW*8iJdVov*nH(5Wg`#NBl32Ikujb_w}^M z8%DWs^H9U!m+aw~f&sj)zg%E#@K&gjp_{(czSi&Q)fj6lDo{1Iq_byC0ipxD>iwua z8(`0<CDb|XZ5*T;@3hdr!3Mz}f~lcGMsGdS{&wQ$S=we@kUBRxTfz?eP;+OK)mRw3 z?QiF6?cSU|`_;M^i7yVk9F_jaZ4MqWWmvn!&30B#nBnZ|bR^tKsGj&oLaz7%wprSW z&=PN_%*|=JUN?H3FTG%9QFjS%vj5+}%J5}V3Ck7xK<BWePgBxUl2U3W9*OI3%VFLd zIUZ`u4vVMU{app9X7*3|<%}1uM!vkE1CeWbF6&vF+3}O3L|l<Lm*Wq|?{>d+y7{{4 zdHD0-UjGtbAzw+~DBpA6a{qw955afBnMR6sM9*UR)OySsuqIQPsIqkoQSoKi#c6~# z-qZ`Zae=+xOz2R{1K$Tu1UiLt>gl#~&YQ_`S+b^RNe!G<M+fUHvsWvIq2*QJfM;>W z=+^^Y#=WfZs$1H_%*wtkp(>{S`aSbQOFi3t$13Ns#0yE?k~Sthj%#jftk*G41&aEP zvtQ(A?$fTBu9~i9uA%NS-edme;i+0T>mWyucu)M9_+R6@$M0pQ(F1myEy*%NYi(Q& z?DY0@_jC1f1zqJlW4#vtTonJw;VO|D+97jp+f(~($1%qTjwbeF*6fyIdR@~NIDSp& z6<XIW{|GWfQUY~?-9wwgjU#7FE2y;FQSZ*4!#mB(E%%8-|Jc^SdfI$aTOKhPGpYQ) zDU>^MNZ)B4K#$7AZ*b(d*S0=252C_abD(81Z415Ow|g=(k7jJnSe*HmyS8_ze+WCK zSgGk=FLF!^Sf1M}$M<#Sb3UiS;3?~9^CN95I@%Lsa(GQ}uK#CmVNXN%IQKEn3*T0D zLrpYQpl(nny+1nVWZQUqeMfut#k*v)SeNSWn_3tTh*I4gGy=l|xBa#JVc%<CUou>l zgytEOOkQoX-rIbSDxbZ{LRm-s`RwK$=ouH;d8``ij}qbH;V;5nh;83OJ>~~gP3nx6 zayl~F)JBWfhwA^b*Ihnp)mLM$D~mRasEi!icD=fFojp1J1LyYmf^jZeh#IHa&Gq$~ zS|pO!m>rDsAM(s~b;vB6xja*M-}kKX6{XIbi7Xdi_)XI~{Zs2k_95LEH$HB^<0pG( zTXAccy+5Y0k6ePOvf&`GcZ_eocbd16ubqE!;QL^S(D+a>Vv|3KTsFO-k24>$Y_=A) zg{--)cg@fB@~j~CQ(<{5`x~qPf-^%WgA;-$f%m=8Fjfauh#mBkb6`OS8Xu|7J}Xk) zD@l87dceLoFH9PhvL|U<*nOfc)r<}hwb_?-W&u|DI+4l;(0v-BN!i#F*+gyr8pMpx z)FztSTF+3&>uY;9dpp~7>s5A~IZB=KrR)iFoV_FR85`O0s99j0e}aFj-|w##Xvxlf z?^5;d7L`YPhCU0|G-_kZ*h^I3H>{u5YsXj*<z?sMiR5ohWoN0v`g!6b8&l!xHmmNH z<es&}I<}VT;}L2;EobdBkO<r+?4nZ*y=JwMo%poP*gMLz&R<M?+XOWEmK;r34X09D z{xrY-ghpPQcz!#pEYTgiqtj2v%CH~(T*v;<lYLFrFt?xP{xQr4O;~GJ<o=4pZjVGC zY|J|BOVd)I_7Sz$@3TuoHzLfp=_{C12f#61*!iayk;Bw*)NioQ(!1oy4ad%4Htj`= z>;(K@qx*IucVjPEAuYqTSRWP%7Yr9;UyZEcWR5b_+g?NNSXK6y*+Q)6d(^)D1v@|< z><z=vSl1Dcew5cK(_!@E%Y5F(x3j?U0yW$-(ZZ=Oist>AD^78C8P<;JL|RGpoCr3O z--&x{PtD~f*cv`3R`LV1>-toDu0SQK4}r%pRw%z>yI6)^GZQU)8P=g-qy~{l-vFBl zyf0&xTu();o?z_=ySO#i-_`T83)>CtF^1wNL;*iUtG=PFgq~W`kJH!{Bm=-f*5e&) z8WX6ypGgKq8+1q~`yZVo7hyX!*T#msb97;4-XA^WJo{JGH@<^%|E2!z`}Ax$wb(BZ zyZSz@4Pi`EiCEu7Jl-ZC@Gs*|A^V{@^`qO8DbbeQ65eACkwhIkJ9#bpS#^)VHj)pE z+Ffim+le5X2QLgII<F1=sYJD|JlICU@Q9an$^$YNFQEl#kpfUjZ!Ai?u~+4U8v66( z6~J{bcAyK?X?soO<7ViK{iqkd6aD!%<G;)+MR&04NSq$jo>F=JPuBYtwVc{X(=YVB z6!nX)vTA7zKb=I&Zp9kKVmzec+;M90-efO`%jD7NKqo&Hf$NiXGCNx9?40r3NTO!g z8^mSy=l(5N^PJ$d7jz*t{M{xeQlJG;??LVOQPiQHL>2t{)c?*69<GtMxg0JUi9M<s zac+JreYfFmi4I$Z?P?S&shUK{TF5=T$cpJQHPvoX8_s1U1D&^s|D4Yg?_iaD3v9MC zNu*{|XuBQHmx%D+hy{0%wbOzM@{8Dm^CeV}!p=igSk;w=LXvbparH~Ij`T+M6K{hJ z@fg;?9@KYZ1xXHSE2Fwm)QC46Mh^bxGxG4tPYu1I)X^^imp7v>@>pQ82p&3Z+@)u^ zfy4-~`JBBnnqt#i%orb&ooXjOxF#cS9fihc<TuoYB1)j6r$P@;fyEg(X+Aa41Qu_y zs&f-hw+@;Z2p1G5@;cqP&(0!usMaQx^=)Ly7Jx(Qv#Oi~9M%y}`Vz}q8WzU9NXld) z=ZYeol4(ool=UT2)MqM7rMsEbAb&*8W<JJWLT^lM+}2bFE=?u8$M8=FXyPbQ*Ilsi z-6igGB(cebBloF;KMBi2XK?>M8Dwu6?-^yt&Mj!<#)46Z?{69J5I^6YY@{EkU3h|B zHWINQHY9sy8T6fCdOMm!wFcfx$0DX_g|u4KCvOTg+Q1vKOJ6l2^oy_)VF7l1dBRQ{ zd&mRo1uSw!Ypw6V=Gqr4OG7v>8H%uri-UZjtVqqQNQ>%7(MH7d55ZnIi(@f;r>ZIu zeHWn+v9>$V8VxdiTM`%j9rg5blaKrZIj_f=Qwy?FLUtrZ1*juCyKQ;Mh+U%%XP*NP zJGPHS*5oo>$ErGtdUEBl9PDOAGRf$Lt*fl@MpWJx0}6SfuqbJ~X;h@TVo&7dN@FK= z_U^zVMd0WrNQ})`-7Vlm_E=hllzh$(e-_qv)q%jrz@iU)+a0LX!dj7=yt-G&(;d;d zqZjsoyx8I&V71x6yzwotmFVdAqx@F{NuHCsh{gC{lBbo6X1RTe?Pm~DWd#!E3>h7g zFYpxUDZZVYSh&AIb{sHe0sfQ7w_8QVgcYfo!745n^M#c?y3)0a%;e+X;sos&+&UIp zdw_P9MMh(}$Q`+C{0VJLH9Arwye2smU5&SaNF_L=JWwbHwKN1yqm5sH!!Bqy1$*M# z(9|#>@dDXd4z8UI<)48^UXi_7ktfwdel;YfzBy1R&)$MIvZh}Fse{PY?PO&Shn6Zs z-Py4YUqpWYNZj|g)L5)XHU2kgKQWRW`f$J>0*7}v+XOBd0JMf+y<bD*?nUO_3-G8! zfEv{Odk3nR%53!>IB18p)=Tc=DddF@+Q<(z_}PK*686-kS|cr){ofY@xfFDf`^-$s zv8Yu=N*!Z_+p#2dMFZ%_ZgUMdS{k*;D1Hx4d7r&Enn4jiLJ>RIQz8l26=9BRfn9wE zQZFkuq8{Y(tjFrNg~;xg$j+ci*Ro*mEv)55QaD-n_}ELq4MpsSa(2;+5m@aTV0RCL z)#J#_#YDUhhYOk`7pfs4i@>|3q1d;h)hio9y~BajaALdv<a()^D7im}h)ez#JE8@x zVj9n^$nyp>V`P${b(wdQ9ww7GOh!!_H9k*bQ7cJb&XJ4P7^!V#Z;l=4E8iifa*`kN z*!T<kR)6+>nMLK!VdU3z0v?^o;I9RJ)TDC%JoZXhi#&H34mh_ooY5D&>_hsCZ=yGI z$4Yo(3zT`%^f$*7IK;~M3uFIy31ociZL<r$Tm?NYM#i>9(iVrJ!{Br^_*ex0k4CHL z3Uo!Us1vP@+9aCK*a=#ZXzeAu&q8i)MNTXO22uqw9{#FK9+989y9oTS9jpC%X3(?R zHMECAXcNz=@xPtDus%U*zod8lfmmfM7MG!<1<*lnD9?#>I?D)GkaP7L(r_C%AB%0Z zAN5v;0g3kP5V4Zu5Vou|X0rF#KdmV`-%rdMUUJw<F`6N0cEgyF7D4S&4f8Pb`VD3? zAEQ4FuUtWX{lc#cpxVLAclD94$#@f9A{&-5mJMKIB3klfW{>VjfWh?bOJK5)F;B<a zwVN4sEf81$&1?V)^YLTlK-SK}>Tu6g8U1%4`oU!AeF0k2THvq?C@ka{p%r7kx*V-6 z`vx92H?(`7R%ViK(HPm|h+KlpA2Cx)4OAalXJ<LqlEb)?T&s0Z|6j~wPUKWUsJ{^- z?@mu=VS|27?C=}pS2PEoz0qm=GiQxKKK+Vbvki_o&rEs<39t~K$|Pne$pz|)XQ?4L zu#?|=9}MndRI-=CDkR=dXsHXq_B`M)6O7AlI@_32_Y#l32I=!FnBR%_vKAJWiD*rt zrM%DUTWt*bLJMr@L-;fk+1HVMz}`R#ZADhSgXW%w{5uL17X#lBNZ5+#C)e;%rNP(d z$ni;vB;YA|!Z@!(1A7_&Q9ebC;z+0lXty2V!EtDvbLqu(<WCtO-+&om2)R1_;pl$o zr&G{u7lV7T`mSNF=o!`YKZQREK&3_SOIo4#yJQvYgKn15m!BE6Xik#Jx1IOJy#Az@ zDr@H|QSFz>Jva}ScVu?22RwVR8)-#GHxY`Sh-T6<I`?$N(%1!ky(~FRJCI2q^Ca;I z{|<&%Lqn~ht-(}ExP-0yKI1zJPM;a2(NC^2av$S;MU9E=<cTFQGq+;)X@;HqJXUMj z;q5YzGey0(O&QZ*M)xzb{2<0Unt6FK96b?VrqsP11|`%YKcgNqx5oUdu|wp2Mz9%q zKOf4S5|w4&GtOCHax4EA0*zxpU?u%LL#Bn)tIffT)eiqjz%-4q7NPRUdUC3#NApjA zW&g?c>_;;miY|fv@iUPB68w6YnPe}<jjWGqkqv`Ch)nGybi(a$?LIK;XVh27;CjT0 z=qz&VD$sbzdao6@t%DR;4`uyGFC?GpDn5m}NcVb-b0*^&&#Gk#Bb^AhZ9>Nx&1jc_ zd&$mj%5_q^GnrMvC3x~#G=EHd15?m;M<Utg(x1uTdns1k9~k#csQXuF`X-u93oyF} z9q%Lb>z0h_hbSdaV?G-SH_sxU`XlC(_gH~^4^|uDq0OLoXW*IzwEYb-q7szsLaTbs zcrP)|*NiliwMPbge2Nu_8=AgpWI@umWzE)^XKzK`u0-x$0<S*y3a-wK{t>vF2A2** zv;P4)9)+y>fpg=*>{!;o4YAtR;yQ_YFq!^l?s*NaRsgf@<mk_Wb0z<HA^f`tY4tUb z+yu@2L|?Nb=bFG3dB9g;aJY#*$v$IUu?WiT#fWEVW5H+*a9K=S1>U=HeHwH8A;!1| z`jwog7D(vVMgk+<gwFmCbzuzZAwOYM9`YJ5qq#n1>~YAZ4p`<pAuIL)?bS#Z$+3LI znyWtiS|2RV0f+tgKNC6CFPfP(2F~gaE~`g#jk2SyrP1qS%#IsrVI}bTl97DRd^e2s zjpVNV2u3G?#aUeSCNRm$>{pikjB~T=$pQAN9Kar&`=HZLd96VjH$x+8!1#`lv(yeg zO5;Asr&$1f41-EqV-<PCSTgZSZAVYN!FbLx%7n;EcK5jkZXdH&c>uq*Kuc(V)VLL0 zaXmm6lPW^*lK<3*b?GQ{jN{DkE0}whp=W&0r>@AR5j?jx{ghfkF5tS1QHeYlMW&s^ z8VsfvqtL}#qH)QdY$M^zZP-AXa@Q!+$5gAfqgy!izt|^L_Ow0>?tWu_y~k`*6ODU3 zBkRMw){t5CBJyi5PiTz<8G-)xfIVSzM*d+9KAruRF7a(Veoz-H!tu<n7Jiw?>{607 zLQ%Ae-=NAhtPdZtqnts!%V$tyU*^j{nMv<3lbmIIyBOPaR-iq>XCt7Q1U=qGH{1`l zzN7!&FrIdd=v&@9L6all?{;wBm;678-6{`SXjbf0waL-Wjg4h7(xsrDML!I$-PdZc z;_iWb^-`O=4P#n~B)bi^mZLBAMN2P3>v<xLnHgWRqOOmoIGQo_AshK9Hint3J+~uC zhoeC~Fy3UQ%ni@IV7^_)ELH}|Xk)%y#oQ=*&_!057s1j(zV$&XYruFkW@jr^)i0vo ztpYz2qnf}___hmDc`W0SeP@TlY2R_~NMsmLZ*Ll?JwZxN(&p&DvV+DgD!)|FPf_`z zpx#n{8MVq~(R*qAn3<NcU+Pkz(wo_=3Nu2)pnpa&G@bqIrSy{hcxsVN-H=t$I^*-m zQ==X<`4S6R2P!dj#nMv@s?QB>4k0~q0sRnr#D34Ng=?X?Tj+h0kWw9xCizX0l_e2U zQq5Un&o+aB#!(H|g1#?1JjWABB2<4C7`8ViL|&V!X*Kl(%Q<!j``kL-w%$6C{n>_E zf>f^GWG-UKXSuJtsX_9@G=-p~O`&&!0e?YudhZ*^7JL+V6TiO}+#L8gFg^HLs7z>3 zxML($Tcp3mzM3hPzU*B8k>v_)=b`pT9;;@ZW=XYFFgMaWXh+%m^ikLsx)i(_7!$}B zSmAHy|IFXW|H}84KQ+)Q*eg^o%r4E5cc>CI3k&c>%V?@3Jww4AZMkReY~DzGfQ?8L z{4bFc;rikG#%t4J?Wy?_+ZNkT)*iMy_R-d^?2Ff1?}R1qL)NEMo`_Tp{~TN!F!_G= zRP^fJcHSz!Jb~7s9MQO$TvS{69P8j#DpB;axU388EgdK9k8G8!jm`J8wfI#pQT1jJ zyZmIM@{u$2ad3I?&%h&p_dpTqlmtQ@**PtNIF6s$x2_bGVrCoEfiShlE4UEb`WAhV zo}jNlgD8ha{2UIu9eFo`H8h+U&eY;;GwjWrQxaz;)^@&|P}`YcsZNIU<8Vr7SLnOo zQ-41HQ*Rmf%#5}frP(Xypr?xeP-vE^h-HpFOMHp=KjI>e@s7V7_2S=i`W&CwUt8V! zu}DVfi0>!Y@QjifwKKnWiJ$q5e@F0fsJZcV<dLb1KEyJ>R^MTbo9ftVUvB-Cy)h<) zJ`7~~lKfxzxA{8;$_4KR{h{f^TkH*ojQ*w?`g?d-T3HKN*INSSzGfHFw}EMc(JHc7 zzh!F}_pLKW;$i2~xKWORwof#h(IT`dFe*T`uE1>KAo6;ex>jW-x*oYK-r~X1k=c4R z+fv7!xI^&+<Lk%Wuy3$^YU^mbY5m8%LQ6B|2Mu2q?;e*UGk4~juD?9aKuWk-WRIzx z{u$MPKC(`*cCd;aeUEjxWtz^e#9_mK-`m@>)7{<^_HOZC2p$M0ME*3*B~q#cwRd*l z4OzsFTcvF0ta&XC{S)n0q%eD8EYgNr^EjF&OiPMOT<F{zcg1?k^hvl!pc-|E+6I>T zd;8w;J@%|~7jy?)kKC<%r9;<E-&tLbWAT%ngPlF&y^dA3vX;Ag23Cl#O?M1)=!Wlv zr@Z@7CLR=5XU`NryT)qsEX8aaZTD@rZ6j?1tjnoe<YMo$Z%s9f0l^u*KAvl?Ph6$l zqdiM}FN3R$d8W&{*^+6lX=!2|%u&IX%eKI}o?XJG>(#Z>#*<*S;5(*?mb<pf&V7ls z6Saim&bIb=JrG_RIOv_~8z0d8+q_wPy}VD{x!gnCbKD_st&nb7U?~&#m9wq0y|a?@ zcHBi<Ny}b+fwqSjytRfqSk<54{m1p5>pRysE|>dLf5$Mp?clL-*>c+J+5fN&v;J%8 zZ2ns_OyeSb!$pIAd^tQ%TqlT9x#6kgzZ1M}bkv#>Cw9>CqvZtqQx3O`B>E(uwU@Pm z<xTVV+AO0$sJJoLe8d`Xyp{Me(Uy408H#If?PV$(y5#Ne+3ow=H;9FMRo_N$P47m} zHP16|<G}M!J#CxqLfn-2kDMc&1LD7N+_EN^>zKB&R^JrfN1dxu{(n4uJk2~=JbOH| zd>MheMgeno>jc{)+ZEd->oeroC;IQEdXW~!C*iK4vw=U@YwRn}FP>@MyS|ZuYoVu+ zMtVU@XLgYD((i|s9hO^`*Op62j$3+heFJj8uDO?WseMEIoP>r66`aT7cG~{d?-)gc zbG?b)72a2#;-02dDZA=9=K0F|tM7PVLa1G&o_VBgn<H2J$oSFm)#JxHE?VoFkK(g0 zZ``LcON+oH-!1O|Z!Yf=?=)Xm|DxbcW0dx-`L$)0b%%9~b%$jaJI`z})s7qqL-(O7 z!F++bevQgyuh?7db?``d3f`m&M9CR?J)-PN;=ftPZs6J2H~XbtfEs%DZO<K!_-_)t zi5nBXV@H`w*5=xfaFak)?_|#(o@H*oYn6M0r?=;pXM%Tu@6W)2(9e-t=1#UAjso%b z<EuD*@w?+%+NW7^nEPo1Bj?!pW?jJK|He1Rd)<@A+tGW*+unaE*vRN&O4ssI*XW8R zVrgk<ZT>*7O$EFBkx@pk@bu7=;3vTkgB^o|*gx{G(9-a)#*WBHA{q8+gV~+^8hhcc z)~Dlv8KvLWf3Y5QjE(P^&^W1SQjNs>&N^|~tyQ&^;p^-mmfKszQ_-EzJ=gt*+wbo0 zY2*odzW22X90?tWe4*d4^tAVk+Z#Uyx(>&+c5Jtmv92=5>C;UvV`_LsXk~CnAcsGn z?{lxoJKfvK_oaVgAP}4rc1C8HrZ8V0z-IL~v47?9evM)6(UoY-d{i82NENVs>~31v zILEHYPr`N3ISR5Gb)z9o#W(4-l(83z>){M0Y)UMZWJ#)+&?s)Utu2u-qr>}yn~~Vx zfa3?A2cE;8=AMS0eV$R?s_c%}E7&!BG4heV%`(K+-CoY|t;6ORVIOD9X1#6>>b3N7 z%vGMqDPw>52z$1M0_6kq{M3T;w+l21mI=8-Tf-d;9W8Gf8s+!Q@E$52b!PQ&(v%CE z+z-q!UupqHQkIH@Uq;GC_M`i`jRxoe`N39Bb3@A^>l)HE#@l`N=Jv+ybX48K&g6Ix zSFulGH!Lql!b9<J-3qk{B~o#*H+%W44`vB%V86k&#xQIrGx1ghu}`1Dckn*C#~^em zohp^p@J+tY&b{9O!E3AvZ0OR*iT;|xzM}20d)7wBc@JA~7j(82tn>}w*#_M;gpce4 z)_tE~BPz(M?nJa6z$SFd-&l2}vAX*Qefums60c|1$0K?z^EPu~Dn%7w7u*r-tb9qI zg)aFQahboN9e3B>(vG0j?TF-y^fk^fe<ct#6b`+`PMXWY|Avbbk+zarXc<Imwn5*! zLam&Fct)zTPWYS^OA0fy>{$947SU98c~q7eH#$Oy)j>9_>IKk9-$kpckDl3&)zb2) zRqS7Ei&9xevPf*SlE6qbD5*R!`WzkbE~~LG@G1DHmN$)BmnY%hy~OZN*1ur)+X7gT zA7MLN#5Gm%`Aoy^yaEr_9klpP*aK_hb^F%%1CPNqEQfc|<^N?Z<}$LP9af|#EjXIc zr!w@=0p*6#h;?>-)UdP_q@6CTp2U_i4qduC7C*6XPGGIL7|s7G_B5%PEV1}Hk=X?} zvPGlUB|<+JV<-WZzr(g<#nwE72+Cw?ueHNpI!qtQj*~s`j=YJF=rr1VA6At2SOaxH z<9`KQMgpUntTR$sO&Y*FV3?qbB);c~TH)Wq7FHOEk&k}o#5yd!&CRb_@Z==$KR33K zLRjwKW-Z+mn(7YakAn6WLjAu%{rjL0*`q^p`X$=ih(^&%Eg*^d_hU7RBkHd%d_9RZ z%t7o|IawEeP5kFp?Hs#P-pB8E9;@97DCY~-#P#t%<zemh0=v&<);tnbl*t<APpk<& zS*<l8y0;0uREH?j3fPTv(_;rd7CUs26aQ0rtjWbVpC6xOcFra6UYINELQmbWtbfZI z_D9xgf3Q~Hgne;8Ban(ayI7k_Ec#09N3s{qHP-q`*f{Iq=NgDjU<8)*!5m+*ejdR8 znZWoUmiTzBxK;(fM0+6r6>HybS$Rytp78}fl3J{eGq8iM;O>tZM?4t0&hx|?B0HD2 z1EL>c^L-CWFGIh}M*ChE4CJTJg;+0?gSOZ+4Y>D;dW^*9{saA=&q`<(>m*tCiFc(B z|3}m6V%G0_SQpCvIg$&J0yUMuwjlK=s$k2g9<^vlEs8pDXmdEOKVFJiM6e%#KRm?Z z7DYd<PDR7|9JP@qZxcyZg!(sTwB{>#cz$9mpVL}SF#VAA&>^J6V(bOO=|g*XK<tJM zdH*D8W9osAvOBMC(0_YY-L0up)d+5>hrOx>S2kd6-vJ($U0Ua1MUhqdS~y}GYyExT z<~Wu(sUmeNnoIHwK8Zwg7fQg@V#BGyNNOUr-sh0&F5*G#1dhhBK3h!`;T`-j2BXS@ zccuUyihNowZ1c%j>AiTqParoZW9Rt*D@Yvq0FSWx{RQ@a2fh=4Xcy#DGy2$o5!L5t z6djp-|1io8Ex}+9_+e1AO3i3!>szoe7VE}zurn`e{S$lVFG#3WjB6*YUqIg7MTV=Y zNQwA{r23Y~s2W%vYVxXuXSgD(%(r<-1Vwe^axdl=p|?BW$cfiOVuZ`VDQ|OB07C`9 zP?(sM!{Fx|t}hd{vfsq6xCW?BqgMlvIURw2TUOA$u^5Q0U@X!|s^<*?1Kl~_2|RU& z%lbf31Gz&yQC|RuuenaF^s^b$kF>V}2yMVNaD+^c+d%CVv?e)$Di<e_=oiT{l6|&h zN2-!|5#PWPET76Ss><L=s{Ks|`bX)r5B%hY?us+20({CzJc5nUykc#A1S`lCR*ns6 zBRlKvCqVBnsN*+aI~nSi9`@wuPcOxH@C{rtm|3?k=Xx;W_Kc~0^ymmS<vQ`Zj%Os_ z(ZWyQW+}&V=uTm1E3)7S{BsdLm6}n{!ISKR=EROIl>w!~mS9C{;7JXaclrJ<bC%R~ zse#3>6BQ@tLU~8YZEzv26R}~YMqi1HDa5&Z$b+qTL`HIL9pp<^tm9%UISajSg!<=0 zITMiDUvmrxJ5ujxDr21twnlMIMyD_{0Ni}Rw=bi(8pb`N;3AO^GOiWC=vSniRB_sa zZT%FydV}ZuL!Oe<vXd;Vct$0a!^$$AN?_(~Mk9NMz01fd@v6ch7SOuz)n}}j$6_Dd zgIs=W%D}&8hKn>}W_)1kAy$wJP~RHt#@}LFtdHeQb_(+|Gd#u~c@-W$$ZR21h?c+) z!W9DbCDHLtgc`;F(*b^B-(KjnEw4^|YKhdA3R-=@?HI<kfO~$2rq=_jZ9wcO?f#8V z>jfi{yf;OKvP)Dh=Fnn{trU^hQo*SR-``;rQbFTg#$A%}Rbb>rqZq7(MS3W6{?Acw z-Z3QIO}tpwiC4ae-Xj*ceb~Sk1A$&}S5@vxMz@gtqMl=myaM(PU=x;|-TnmbzrpP* z=&9IDCxWv9Nbl~@pB$YzdPJ$S8~=q9N5EaPfyi&%zZF~^fWl9}SyF#VDh*10p9_4c zY*xuTl>Mj*!x2(#t2~;M)De1%QI_R+i*s)<@`89@Qn^;`(U1i9<l~O_q0x@e=u9Z^ zPppau8QDqn3aQk&3GA&zZi=U_0~Y=o;4pu5Mt4CmkD#3E%=O2?qxfTY&{wG$wFZ2w zhKCk_$(cx+DbT5SZl!M57{(@_hC`P#_+7Y7bOyy^=b2;gMmfwC%`vnCQ>k#09cyI) zJa$r9?477wtOAGCj7r5yoGC-Uq?%|c_)+S4=8o!mvP+iaw5m!|vPYIwXORjeQny2c z&jiyo$OV(Cn**7}Wi}tiTrmh)^aV1eBe1ClRY;y*JP}`#G3cj-$BbR-7D^q%b71;B z(%~X<{2FrNESiFN>UMCfK_;#R|FRdMSka&21)2>nE&|6tKoJW$zZot(57pkMy}M`_ z8S)r<C-qyTj;~10LX5O6GE%YwgFO8K6#h4y`;zM<pIGXy6$LH=6R9y(nHi!A^F~$h zTb%o4zdI)_NfjsAQ7%^$K6!ytDd^)J?x{yaTvK?u33p2k(XxCiO>5<#s-nmv*?}zs zdb<lpN#3OkdVGn7B(?UA@;U`Xo<a+fZ}|!;^#Fr2NSEo+(a(bx7BJfR$e#_--zAq% z#{=*Hnh|-s1Ui|(Y`B%XB0wR9xuF6QrwRS~it*Hgp3@@5*&{Cz&(C%GAr&Ma;5#~i zR=F2#a0_>*!4rLuH*w5=9}y$dn^!G-fg$|jR%EUd>1!qjZ2@>L#hT&>bl8JeXQbvJ z^po=FS$5(8Ua$^IMZ@jJFGG>F-Qdo$QJZa9VpHnDql=I=XL;Hq#wz;<<^zTUkp!dg z@chXfwHp7*Al87j&?KsYgJkGXcEr00|4)XyJ0RcY!Y%8e3h^&qgok9!vY1(DCDL#c z{2`i;`1-}~B3kwzQR%%Es`?eUj--WDsN$w+h4z(R5L-i-eVNZ-A?|LjV*UingIj-1 zyzLx4lQrlNEEmm;N#WdNCQJ!^68bSTj(vVh5VL$H_)Bnq@cq!8(4XP&jCbI^ACPz! zd~HqfrH&zfWFlFL`OVF!Zf!F!)F0qo&Z~6?3lEw52cY>pCQ_h0R@2d}>w1s}Ge4XK zJNY8~jYsjpiSFGFy)BN};-IOfHjOx~s%R>ESr3;mZ3MavBe#gR7{t2%b$Aautu6{L zCUWm+I4d!!-x!r6%S=<Xrut)Z7i&9PPDhQnO>qz6vc*@9o8egMm_^j~Mr&WoNPUs^ zw&_9mZqOQ7=j}-bOEvdCS5<do_Xu}K&!<?iPWmqS{|QVCtuscGi}2E%jkxstwk_<P zTiNl_o@ozLzx}cOZF?D8PU|%DbF9mC$;{ds`XiVlIGlaESNjY24^z9nlW)DRjsJxI z=fI@k_|RH1l@{U&cy9V#OV_aRn(JV%O2#64)iT&J$J|rztd%$2G~&qeSR2Y6+7WCR z^aKtErUn)Sb_QAplR~#bm&1c2Gq5!UE&c4h;|*uYq*uw?Q`)AKNa>ZlD{*2%7H59P z$F^*iOj9{yZ*YyTv3qRBz_g36K7aM(rTNvPSL0vrP8*vs#?{O-#g`hK82;Jx-29d8 zfWz+0neZZEVPb01?ZnQB*%I$K*Tk=k8|27s``%nb``*YJ>JhN`>w7DDK5=hz?Qn%% zn_U6dHuqKcZfrSi1ABs}!V@C%P1W?P=0#+iHn#P$9kzXMk8}KGpJ3l>>t@Yo`CU)d zx<|~$7WOc(2j>S;0}K6m{VRNjsGfe#e<F|=(!#ZkKO=LAa;~N)nCn_*VF%mi+?A9g zi#gSidN7MA<+G%234`LlaP+fXx2)8ml5nfQI8VLIEol#4oqd_|>c?04Usp`4l0GnF zQ08&h`yR9J`@o#=Bh%X!n>}}2_xM82Mb4{Ek25a8?|kl@@63p|#jkS=upKg2(cH%C z(9Gb;z)pXrufDIPcfH5$Ztc$F{=|LM?ezZUs~or&Y!)twB_TU;D)+F(6tujuq*-s+ zir5nwW4hIB9cWo^zDvAeKdp(WXrzi!C>$5+5&S36jAM78RPa`CWvFy`e|V133=QhE zX(<tk$MtW`0kh9i<^PyE3vj8bu8+^DnYlq<QjiV-X{41Bq#G0gK}teFO1e8l1wjM^ z0fUedm2OZ<QfZ{Sxp(5!e7`m4;d#G1&#j4b_FjAKwO9U^|3F|yP)+<Tu}os##H|S% zf*%Effm_B1Jq<kVY)T|Hz-?ylrIzNC$gJ>(VLNmNuT;CxM5@)Uhq{JaM+!ziG;QlM zXSRES8qT$Ja2TUC*PrT(jD}$Em-m<U?>Cb0MBik`e?&Iq9BloMeY;{esF<CBm*rzS z#Xb){cYkZPwTD{bZFUFey0gLU>D4WcI7RJjls8c-^*Ot-eEk)Ctb}9-O$9vCg0R zN{}&BRk?*ln4RjW;hf+b$->Lc*>nPJrajhZR(u&_kb_0ggBoz+6eYK9J*UEX<Z&5v z+M#Gs-=Y5&A~$C%S>8kNu>1#her~OhmY%wp1^9{@gFnBGJ00QtEk{<?OtPOI5fiQC zo^U>J5}adX`>(Y#JHyDpuSG7>`$XjGlF?d-nB!_<#P#C3pj3_bLQkB|X>dDM4*A=S zM_=+2YVr4QEW1VY=v~fe=J0$?&J^j0TOSLt5g7~>&<OK$>QzJwZ;MVKc?K=fbc->g zf}Fhh(Ltm#Kf;OgZ(M7>#Th8t>}Ad)!JIuE*Uu~>mx5d&7zu)W5+jFHY&yZkEC3Zn zr^&$ouXE16!}%bVY7HLs(Kn<6_5s%95hqq++*Zhf9hZfE3VE>_6y**YwPf(M;A$49 z#(HMl58p>Ia%ykUXL=o8ysz<3eaYh+I-V>e*LedO{*vKqx!K5)=)xy9GS+iwE0Vu( zn-OM)4$Yy^d(5^9`an5!9_bR?1aCkmEUhYNSAv!*&v|&Mjrsi!t1aDjoA3_7)@}j~ zYeCg2oZO{2^90{mI?M_kH1re?eZ@m35iAfvcW~o)0HVF-fi^{;iRk8{ofqPSE&=WH z^NRGo6@(N)8WRjm4|PnC3I*TdF*>(sbPjZvUb52bxH98t$k;k!c?b^(MrsE%y+-j> zmmFgaAJTm&aF~<)CpdXhJWl@+7UGATwSD3A37or&(BHPf%m1+6(yz$R9kOuR7iNTl zu`WE3l{xxZY015jE=!(9ygjY~Zi#y=j^jnR%I8gHo1M?S0UaBnVYMLdr3KvCmcN@q zO~Gz2#(X6|Gs3*?@F~f{IT6>e1V#35u5_8ZJb`+Gpq!ici^eayU$wYpR+Fn#f&xVt zSr+If9d92o`ZJ7ce_Tr!jMGhUj^Io0Lu36HE|9Lu($`k{0*D_)u2&PSs}3t#ol%wI zdbwGL49wJt&s21;e;LnTXi@vP@<B#-9F9ECUht6WC4*b8C^nb$S}Ms^L{Bfq$`)Xq zQlO=WT;j%cb3q<_#AgLfU923jNj>aWLFE^u6G66=F1RW2hu~ofDnmNxFTPR_0Yz{- z1erw;RRo(-t|JJQf;}q!2*ES)5P1aA$iqq!3qkNlM3;8iuUv}VB{)VNzl9lzXyzW0 zr=T7QhKr!F3EGPwE51Zvl;487C+JBc1LTT=E)?d|9s;PKp@`Iws|lXIVCqPYx1cNu zQjLdl=i#Avh+dNM>^<aJ8LM2`!vGSz9T|lnn+UF>;HQYUMX(+{$|S_EE9fmU8^I|S z+B|~7g6en|UJ}%IL2;BEe6fuL8&AgL%}_8S1!Xh^%4dmRUG63LDuOrVp~T2l<+>ie ztA}hVNHlUs5A{drEXXs05tA`KHo=YY&|?zfv-9wIgzB>9f<5RVXujaLha@TMBWPtF zUW-s!t|cfqGB)8&!95g@xkpKlrZRI6WyhoSOCFFlmN^QVt=IEdW-54@vYvv3;vs^{ z9c2wYq)Nd6^3be=o*t5rtf1UMXd$?19?p*NllMuXl5myBS27xTw>&)h2+E?Mgvy*n zj>&Z$-YwS?OVHy2@2Wy`xw3qD_P-#~$aQ3Pf^#E&H=(_ZQ)n-D_N+wl69|@)@T_0~ zdWcFMwv@a>?&yuoyHW@a6<I4BA!GE=p9H7M;|>{@aDiMwzF%UI$w=jDay?nkm$+RX zf|uOG;|aNrH!^RIGB)qz^nT0#60ec@%GCr9$YC!3Ln)NK{6BgNzse_NZt@V^Dw(a! zQ}&~GeL0O}eDcuvw0C7e_wk+)`pP>z$>8C_3f%;U)<fWu>&WXKN62hnUd21%JcOi| zIAbzi4}r_OviB)Lw31nSw2~{x`R2V(WRGx?P|o8M4-w6yzg$<|C-3$?=h5*0|Lt8{ zuJ2KYU-6wP(oa^!=BKQXyhEtqQ9`cc?Fr#BdBt1lm)K;oa`GMzsqE#a<vk+d_`w$! zW>hafEBn>^+v8bzr@X_vkGvwIkWqTqlxxdcd)It<hnMq{b&-eAPF7JU=~2+*LHS!= z_c+Fzn|FQhzA`ttmM8taYsqzlXI>)hzT_QGddqr?w@lt4a#sHGUXf3G_+&B~@6K{} zZ(PEM-a31C@x~`}mzl}Kqoq(xzC^0LTpN)kLQmN>vett7ExS)p*90qFq^gIxDssY; z7Q!Eb{^k9YSLHokM;p0@ND@yvdD24eCC|tmWF#-&;oVWL^wPH|SZ?w@k!x~&`4-GA zc~&~qhFLF>{<8jRe2+-HPtd~zaZElXr>%#aCZiY5^Hy7MyF|{(PkBygDD##(O59NB z?dKVu;8j^iSpz{?6Rwg~v^j4KB(`+m$i#c)<n^v2dqYMoUqZE~j9KvBLj14bhY@dZ zQe3AO<SQe7a^%2E|B>$|eyu8G)2@hpjBRumEj+<j6$GKlM9de)uKR{jMO#aG6q^lF z&`{@B=cL=o_pMTtnxhU%c3(pxbgj_V4)`V!H}0ey$C4>Uua*qhM+NYwzNTEq9@>IO z<P4GEYG_Q0(DijH_=@|s<IxeME3kElr!B-oRf*0eE6}O_<aExBjyRNf@B2{T7c|rE zc&xUPQ``<O$}nF(-*<R~3h|!T(AO<|i~F&lma<x+=N@N7&p6*DH`_u#%S+ADbv*O~ zd?$$luLg;r2@&jKWF7uPr=D9%XFNX-$+?K)k!s947Lp^d2~4EUP9JBPlLJar=ZY1G z*qkTFpagNw2FiO>!d2ksJ5+V&!)}pW+X}w5=mZZK=S`@52LE5_*aa%Cj^bU*gJ10u zev>!QgR7yZFCjWo9_w~5R%j>XG4nbJB?mIstFh{gr92vl!;A*8K1<Qd*KyTJ(4alh z!a8W{v&g%c!#W4a>nw-<njY(<JUVrEEP&}`mM*}jwTXOF$#?!7I;8jgg<ow5wqjl4 z#X2$9N<>&|5}~Y4r06PiYsmX=Grt~GkW67r&4?E!DBqE<TF2L$_<0%fL9)gEb93U~ zUcwsPVTPhb6@jlhvrbVotF2uBb5{OayaKt1&zV#n4I@+PeSDoO8LfD*|0CkN4NLbo zGV<rbr|Fq(WA@cpqSYb#g&v5t!zNVWoDbpLU-74E*j~fPaXvuo^#eSjOYl#=jTikg zHeF_VK}rmE3wGUFe9aSxlMKeIx*PxVue_25m-Hmdb~W6+1j>vgiZ}sJ_i$|D6L7nx z{J}n2ju&(RJxjrW;+i+m@&8~g26Dw8*)5Z(g)U6CdOISgtKc~w)eZMzk{REG_}u{b zw1lrU)ohiC>`uh8st1itvRhqu0DEyL70)N}k$!=#X+g6LSOiilw2f%P4D6s=MC3*= zqor6C>!F9{+ebX1F4+f#iTezP!UK5sGHS^l`Z7`z@QkSKVWQO^v8RP&Gg6mT8VZXK zIV&^C!NYZ5$67I=<aX{+jDCUz@z(ZXzE`kG782)?%EC0Lc9-`(V7@;<)k5Utw!=P@ z=YPaz8cY;p1(A-AsMmf77k$M_-N8aE1O?X;|9VAP3)kHxd*VL3`wG=0zq*Bp5$9qp z*TJDuF(|nO+gSVK)cya2=cOqg)+JO{cLdd`C!fqkWO666$AMRSU^VrH!;X;e@+wwp z9xTOHNX75*xg;Z{c96OCH+6rjxJEkVNA7L0FEhgv+u@FR_!GWo6%wfDiMqv*Hg6LR zT*#+lvGPO*dUJ<UjJYqqSc_e89|<DWsNckPu`i{cOl$5XQhzL~FR_5R_-1t8w-WjC zl+4^UzA99iCMe6XX%~_$vWt;c;59o|nw{4Si&!EPqGO3ga)zt?j`yK7c@3r5Gq>@Z zOMJ8tHbF7=YF^%zz+btMW@4w;LZg>{8~0<CS#7B{naHR&vgb!*x4wooU*1=fz4(y5 zCw*w1vU3VB$|__T^&xxWH1*xD!h_?mQl-Du6ZS%FKKltPo5CJl?kmXHPcn<mcwOFx zAAe&VOCcN1!*}mOw|dByqR5(uv0B9X0>q*Vkx#V`Z$f)G>o6<79j-abZc9X(Y=ckc zv)?<#Y_fqKk;^}m{c;OwD?M8p<Aqx9t4PPCG1NueW%uQ$m+lzuP#TGI6CTRWzI>B@ z#j}wtkH{k`4ZQ-K0lo016e0@w8?iY9@7#Ng`fE6^8Z)1S%)7<>3P87ii6|z=zQiB4 zhgy)!E}cT*g|<YqR#Jtxk~rROqUS})Mrp0=gzksQcRvl{R$Z>*uon4w_{sCSN0ddp zRiCntb)?Htq~ZlK#%AGXdw|#QT<jJ0cNID#w&#u&W0$E7+rxfZ>Fa<GaUqXk%2D!R zX7YLQ+*AN%Lb7m%lV@KF?%E1n(qjLRuXYicc%D6RfW37YxsspN%te&vFfra_My0Wy z6Ub=0!!Df%6~9A97m6JsIy0XUH-sC~Ls`xDAu*hPcqHNX8~~3>&e|(<vn~i1iDy8f zGDG4yD(yIxj*w+ikj$pLZcR?w<;1F`I(0tTaVv=c{pD8UgelKe_93%7;p6-q$@w!Y zw2E<D^C`-H{5SbyQpd5%)rilOhR5&oiK*<f-uP8+#Okqo$5OY{lG^w-pokcB0jx<? z&NWV^j_l5gNcSyB(~)2-&f=Vp`raiI-~jSy2Q>W<E-g&NM1wD9!kxL4W5}v(zKNVq zm#D}5oxS`bcF$K;xeWzp#4$xC#p~4O;=6heJ}-d891GtsB(l<l%*b_Aq)((~B?8XE zN_Jv@&b>e3%?$Jv{+&LfpTd>U&i&SD;rwG4bF#a8Vil;DO-D^gRV2$T<kE+H;zuMz z8dTm!<SjROOIN5O3HoNC#Vo;F`ye)fJ=zZ{RZ%`h4}QwK^KtUrLV5egmzC3VlkX39 z<t}`Z9q{0;b*UeQ#tVJ<sn1UEX|V~^{Dk4itiA?t(g~^;w;|K+u%Ehf7X9v4g-gnF zb`&BTb1d@WAot7#J=2jX7U7vTzR$sl97Z%MnK<6Um~<1H#rxm!Wr*!#KX&0PR5>j= zFqZ$=^VPUU5;Ar(lCdw@Y)zrrKe2(}fMg)wX*&EE#xq!nm6DF=LHuBIkxV~wo`i`? zbt6Lex$g^VZ9k^skQ!`GsNK|Z<mUOV$oAFf58pAS98_8_g6DqV+B&DkQY2&0HzY0{ z1|VCyu>+*$B}ZIBE?|Fb;1nv$885YtDb$#4L#_<u{CJ8ys0(NIL^r8{1bdDjN8+rf zkY_HtGA|nRbxx1J@Z_w8i!bAgjPiU{xPLuof*@ARWbazM+L04-Jg4Ojw5v`?nGWoL ziCj0tbKjtu2}-JT#JYhz--irrLVWaRPSD~=p6%?7AyDrHBVEU-Rgo)gVt!x22Z!U* zSh{6)M@Jcm+%u3NOOf}x8EsDF!Y=ZA{)Gk`k$aapBYphd9eaaaI|O+yJ>sRJyDai& z6%y+N+?$oXRZehLsRyfre45KXJiyMa2%22U*m*KmhjKDsWHrc_Wft$^JDmZ=#t}iy z&KmgfpI?IyMnSQ4oShM(oHbePmGIA7Xlhg7+p5?Q8oF2r?rVn3x`s?IiC5_Xv^b3n z6pQXKueC-dWkWk%iuTk9o8&525zlddD47*cY;HdLG4BdP{ioO(uOZW#k*_p?6%OMO zUdj2>2zj-Hos^%`syC;6JLLQM*nddY<6Q4wER_<_Aup%lD|}1-*?K5+9WG3PD<o?$ z%E%Xx^Ln33&L?hrXwrmx9D*)$_{1vgh@zb29a-lj&X1|+H!V43e?U5jPPQCfwHy-l zFsEuqw5E;d&P!OoyX>wB)GSNo;~cnMddxL}I+NkKK8z?0E&g4yjL$1K)E!z|eUrX{ zKFx>JuFCOPFVI=DQiIdp+3GxZnovD{j>_6h+;KW5_+T;#GmwQm73mv{z2%N{ZrMxi zvGzCiW4niQ%V|qx&R(SH8)R#3i0_k3oIQd+eup`%g`=O4QJu_*cNB@+55$a2u|Lt7 z7g4jEo}JX5%;${MJ)a_T^fcA~MXC4tS$&`tH7*-5W3yigb_x~=o(**Och?)Lm3`~n zOZHkiuJ?*IGPha3+M}H}z=7E39$@#^<(%zGyz5nTpzo+lS7M3oadNH?Sl7w9PG`>} z3boJK<1Qf+;UjozD!bu6h#U#TuKr}7{SI$b;N0kl^h@DPxP=zI9QmIM)Rj(*cq=)} zwc)ApSeJRxpu@=dVZ;L-qMwuk4YC0Jm&br}`<C+_s75D2&^qb<6YK2zM46@z(Vh~U zoEXp&e@VKUyfEF8bla0FC#r$m+7kCivwHXx7^NrDhEj8p+u7{?8{6;ef_AxsoZ3Vx zomQ$fv`;~zd#GHcQsX~z@M}d!M`lH;Mc+4XS}mM;?y*=)WI$Im+Y?l>J>?X;r_5I~ zXvy?%AE_+#kw@khcK;yC|0WezU7QWh-}IQzO2u41H$Qc7f@)k5l&?8zDRmt=l|f?Y zOWcj1G4-||S>vp9Rvv4m)s4*W^G*hIxI$ncZ&PRJSrcX_pH06v<C9DWGA+pPFnLaJ zr_$VdGqnC$mZxt#znD5TT*S)f>RkO7wY*wQ{Yt$=#ljZtU8A>ggnFD)>iL)jQf|SB z8Cn+_A37MGX704hxm#jWSdrCO2c@vDO{B~fs;oZOW`fOENvp5+R@V83fnpp2H7U_K zVUKZscUn?SHjF%k(r7z>#g_ZlD+fS$>_q;<F?AIcMN?w^-QmtWd#JU^oM3)v)-u<a zZHVLFv`;%-u;*7Om(*)UyQIz;e#o>s%k`AjSq^3REP0oIp1UV}@_D7lryebRwkmZ? z*swo{)l(i&i}s4vN-L*zQ!nB$e#KwHKb6X!Uh3Z1yUy0=<xu|6*tAukcBZqQ*hk!v zVC$CREH9?aW1Xs?)x4&b(ei;GJ&g|WojFM+#?DdAUo3VTelAA#_S<f6=ZXD?ecS%Z z8Rd2aA@*10yjoGKr@f_BQ-8pw{5D1<ytCNuV$C(f(c#gi^l4Ykhh`r;t9v5WK<TXh zrsWSlNOwBp?99=WiCJ@HKAQgXq}KX=YeHK6r)3|$|ER~a%&Eu2+wDfac4`8(g%|a& z^{Lu;b%xf@*lI+KYJN?BRjD8AYFCZ~LKD*Nr=CvB9nD~0bk4^5f@0)T-&RK}jeMV? zXY}!vQVVOfz{DOyZ56(d*g6otN`c7{<ZKf>;TEwU+=rl5PqqKFr#sVK)puGkv;$fW zy{C3ZSr78vcK4)n!QNtBr3&(S^h7i-k^150OzU5}qB{`p%v|M?b}ON2hUuBkX8ADN z!>neeLK$Wy?p6|_DKBz7{_H{0<J4zgrml=^bA~C4wdZ<gBfs&fo>x1d&eb));jisC zjW4y=a7uNzDu&ynWl1}m+B<Y3I?8V0*7dDYbdZS(sW*IcVh7=(2EKgc;pAXWr_>)5 z>RnlzbnahHS=W!Q*qwacR-7cYW7*xx&N_QLc-W@<tFMAOMY~6T>1FC2@~l@;Ew$7B z#M)rKV_uCej$V!4k2W=vteo}|=K|iU96qY*g6Gq{n(2!yO|o6ib~MW$8Cxg!)<;=G zQVTxW@F3HpLr>ejxDk5K)|GN(bBr>ok~Q<0=BhdLBSwlpYTPn9>Fw1FzNL2W$nR;l zQ`fUb8zSFYw;UhXrI*!w+EI17vKO3eYK&q@RN8(<P3c(eFLgcMo_p@+P6=>(hq*7{ zm|yUbJ%vBB#>O}w+snv2pz_h3<?F0|rybH7!L7a3pwce3%(-Q)0Ld=1xi@+`noL$q zC99@A*eQX;yzEZ(jW*6CUC+=h^PH@0vwxCxP3FQGt_D7HPltTZGCj=qaOsn`pSMi= z-7M_;T`i(_H7XdVs6kDq&Q_~ZH=D`d%|Fv<tv6Qn*aznQ(EDj`rY=g&7~T~H^)=Q( znL~&3#+rpJ96;VtUw3!Rr#MO#t%9!Tel4PW=v(9d=Ja%yI1}BS_!3TIf7kIfk43?l zt8JgL9@|4)JGNJ;seMiD>kzG&_Agp=LAR5g*=l8;iSCKsj8-xCn;%#m?WT@Fg-u&` zu`kK5CC|#Rm{zITvqw^1$ucOzCxOiFlu(1GTOZVV*y%~1XO+`RTa|p1)NXo;e;0^^ zt*D|Isa_zLB)xwe`6#`NE?SS6Zt0PgX)|9$UW^VMjg+;zy494y>U6EFK1eO-+W}V1 zR8E-zz7%x;6~k}pv$Zy=<(nUC;?_dTPokozI5a+ot-lJyqgBq|_P_Qq=d}B#FE1-y zN*k%Y&}wTxD`u>)JH^gpZH}gk){Fid9c?=1A?u?34fu)e-HWkxdd<Yi>565lob^FA zE!$@)MKdKOHdlU%4tc)e;olFwepKhlXU|(kQrw2hPVKbO-T$i5Q!9bDbg}xA_PX(# z@z{9RU&dIeOm<e9>%y&5C%o8`+AK6bQqt}ko2A^<N*Sf~kg^3Ft+VdC*z?PL1{G?x zv?JOC?GN=Jp4d|EYNwjh)V^aSI1kAiGr;H(`@0&xg9ov_zSUIhr$Zaa2_obarH`+6 zY^n3WnrRM;mIK|gfAn>;x;5Lr=Cng&ag@A)JBg3dHP1XM>w~QAv(`(Qkl~HsdS9*R zo@XN-Wqj1@(VE9##75TGbdLqI(Kb%#-L*UFT5#?UYFl)NYQbLqqk4B`o11C{BIVO2 zr>;xgn)X)2HRn3Vd|y-ZnoVz}bx|Mr=HgX;H`W4s>3yY%Itl6Zo7O{}<-6~G<7Bea z%=2agYo9gUe&}?>&bomWbr;L34Y}|)$h7W?-654#*~m#6?|yH$wmO?*qt8LOJP_SX z4dr|IB`+(czgnW3ye!kSlz&rBrsydZGo~h-*OHulY3ZNkc+&at5!z86Pu&!8tPZic zYCS5$4{H~-PqZ3Tq@AGVyp@s9|C(`yJf&r>-^vnsFElspi?n*7L@HW)J0pA-(Xr03 z5>G*c?umtd1}h;N%coRPOK5+=KT@OJKGwsTYE3tbn$^vm)=b;)j*0E^eXrD@%4!)k zN|lr`XzWX|Dg+U!xUX@nhdb06V1H?CGxM9-%$4TP)-ZduOKzS2SmNgy24&unWp+y0 zly@?1OWqNvtjsghheFR=J}dO>=CeaDa)wq$c3UIdf@pC8D(_ZN7u8pLU;j)0+4$Vw z#s9G}K+mH7=T@<wMk_|N@TZ}aaOKG3===6ocLct)Kac@~@%4U!w{|}{OYK2GSgtnE zs%ewR<jd!~?)Gsi*bS_O=4NxC^|gK9DTGek0v?+|re$rko)~sa5Szs%KQmkGINbO; z_>_a3|Lm$%s28<g1#|jz?3`N1KRxkEy1W_pWa^Xo(@bBcpO-k&(0t>p8{q|MBT{d@ zSdm&PbS0c%R<RE{t+1H|b726!$J$^{m((Wf6OF&vJ;jVh+CXJ|>}Tho<u|iLS4Wg+ z(EOY(6MLLv?vc2?Tov!aYLLnf_)@5{dPFyezrY<SsEotEcEk;nUscZ;32OB!w*dBf zeJt_^;4t3C2I!6qFM(%DjoTDtkm4;WNv_dZs^0d4@Gt;x(<Aq6tg|vu%Vw<h*9}%p z_%q>`gs+1;{73YE)os2Su`;e>e`F7|XWO^zX-*0Ve2H!b_fN7!=YdW6zVoG%3qRC+ zG~C-zd%iN9Dydh|v-aS_TM4p6Ly*X-AwAcFB$0>Q|3-`;C+Iy_+${JjQ{q0oAJFaU zVzCy)dd!FAG6+tZhvhOA|Hw2f{f2mo9^gs;0b8Lz8LO}2-+l(xkAasj0l!MMcqN#0 zm;RO*RZsY!q<UT5tbL%b)vxGB_4fK2vemvMHZp)(p*2uu1N?f35#I-?u_s)+1rNwQ z&?5?gx0nHR#bJ#1967{g@#v;txvq8lBWJ6UvsR1TwQ=CLJjBD-oKL+Ux61OsD+x%1 z2W~n%f-T~n+I8528nbFfF8Xx*lM}Hl+v67%AOAV5Lct4LjO{%PFZ)=mhehPzNPU1G zzgtnf9(|endb}BV@bLVpyr=F~U(<$a6SdK3BFX47?}MnhoEd$}V+_@4AL5P9j^)!G z3%q%3E3~)Cw!7>^obt@<JJ53?jPEcU-3@$?LgW|bKrh3Z14-x(@}@do0;veBjCH0H zyLg7iRso;XWa$1EmaW0sRAep0voVCZ^osLW8|K##{am{KSV-&}SpU*zR{H&<=eZO< zC0TiI;Y;X*t=t{Iz+Dip{#J@`(w|i|EuvmUcm7Ik%DJ+OJwFZ4Q6CT*-y&m9urbqt z5}%Da+P7Q>Tk{$Ityb=6{7`9BK1SVt!S@>Bwq#w3g9F(Dj$TDHEb6`jpVh^0Qxa~8 z;m^-Z{ar2MZVRFOCB~M4m60yn<*|}q$AeOpze@2;CHw{z;+bIuSt-d)$;azud0r~+ zs_-7EFv$VWNbaH3*VMyHb<9_UdgnXT(#}@*sz=ma{G0~<ZDI8SRgsI)_<P`~D@5Gk zXKeOc_zsh>#ae*pX}B6A@636>6`koOnXKnokFUU9`Ir;BH9Kbl+$V@nS@GkQ!jn<} z|7SsVab^62{qgo3!Q+q&g{7B#6QTxhGK2i_Y%i%kNWnW%h`E+x78RJK)T6b*Z_x)o zc$;|6S{Y_5-8v+{Ng}!uPc4LB;}<H^dSHEKqZ)O-x<y@syq~3ZQfsOzXv7;qvg%5u zS`yyDZ<vz>FE?kW{KDG2&sqNgzZZi0a}5jn1+lR|nZ*=V=Y6mU8-Z>*lnnFT;2i~- z&zpGg-odlc3a{J%{4q<}>-UHnORuFWj8~!y$;2a4@wcV%e2{#@QfPDUBHuoR7YE|= z7)cClIGz$ZXfRWWTRg)`--oAmHx&9ee!YUsco`AfDy+y^ybRsd5$a^@-2qe!7r?^a z3nJGra25+ut9F^aHxeIFn0);n;5wc~BFtiy=27XqmdyC`)D7<=H**Rr)C7r9E{-?Z zjoq~m$&{O&(-3cPdm;)_pZ6)UX)!*g%TPE2^UBL3B_5xVd;qBy$-^4G8Q&jXCCgBx z;9&f1y^&9y@MYA8SM%Y;dWI+I96m#d3ZI3OpRis9Soc22{j1d7)gu>pGl;Vp!HgCp z%|!JYD4M^)f!&bIwU}E1@!4IRCmrz7tj1zX!RxvYkB{V=eoqIC-^e#z!yK36BOilw z7>jRZ3I5yD@LvHCokF{{@6Y{Sp@nBA<njF1jZ+2N)l#53|Tqa6H{TC}&J`$w$K zI4C-d73&4Rw8Ilti#3#L&syxR*Pw@VaJrA5>_+@?9go%xyh%IoDV?N(Wd@RPI=+zn zU`n@8JMvvZb->mARhf<aYX&ctrm{g-uHrH13WuD>tC%ge1#fk6H;bF%R&*P~eLawc zgYaKZa3`|IW-`+o_^c&1dIss0iXU=2-p8)Qfx1xXu@;Y&LnNXmoKPBDdmWO!H}R>V zNX2=awiofx6=v*(IH9ETSxKZs_4sV3vMVODi|QjSlF4<rfRA+^SDu6~bsqk@HAI3} z-~}89kCa6kBr}G3_<R0TRXvSvGs*sp{w+oxqp!Xkduy}$fm&L9O!h)Kyz^c0mJG71 zShdXmu#UsgZsrB^3#-0;%&vmhsk<|tZ1!d#9a^zOB~AHDZA#~;5mc2#$kna}_RwN7 z#@oW@H9!+@<C~0yu9IutmL5W{I=R7sZ-m`61MkocClBY|DYqw)D2YMP4+O;CmY^8F z4sSh2+p0t?%OxYZ3^;YY+!vrabm9KfK(OA!$@2<moOj$0h#TI=_nnjIXAlWlU2p3j z9t<b!OSHi5pOP>#*f>z#|46^8rPGS2IhDn+_ngeuSCO@$T4|$FC#M!ms}Y(U9vZ0_ z{gv(nt*r%UZF4{|Dy(HRj{5%#yhc4ksz1H|10zk}t$(YJ)g7%k`25*?joo?nn^s+O zUUVoGAC1lDW^Jpo_0-&9J~BsJUF@&XvGSrVXliG57<uh;K>5#v&3;@fp$`Ia<uEqN zFr_s<rW3?4ve5CNyK@_D=%F>!>Spz^_FHY}ne{F{i9VcZC6t=PjK(Psl|5=*y|lk# z@U_I<NrRGyCJ#t@k&rLA(tnV;lFoWNZJUDS<y5m~MQVm7rtW;P?nNW2H&&)q3tbL1 z3m*#Cp&v!W?B^5$9e;@)F;4qO2Mz@e2fhw;4s;9r7`PU=6zCYJ;$NsQP$&ELgK~e` zZe?Gk6UAaP!CV$C6<rj0J(3t19vK#0Y3{c+<2(AueUm+Oi>@lJT1d}tY&5PI8;s`0 zCB3;mUR$89B}1Vh@$F!&k=x%nV)wP*x0l$uv%)FKNwl03wLSc_!j}nzzeZ>rGeIP6 zrG5j>NDJ+CJzyL){2<@|t>@SGYIC(7puO}_ucEIOQ-%>;{)TQLiZj>lZkM(b=$UcG z+GI_#np!3K-U7~*&spiTMt9l<CgwL}7#!s6sSUUP3698laFTyiK0_a{h~v&fDmF*L z2e2vkA$10!v((@O>BLT&hj)1)agJ?Be97lOL(J|zr&<UJEA?}JcJMu<<_YA<5xh~$ ziHuA~^BRi|_9>B&-aPuT4@a}}=d(LEB72VD*_Ucm$*h%rj4G#ofAmL-IMh{o!pwnl zY9MFxsjc{{2Rp;Uw*s_`asX8L?8w^dRAhdE1aZ*qr2qPUuHKSScc9jxExPa}PL>r| z2+NVclaWayKrZ_-E_?eUtv<px`x&z83r^FYkivh0h4>tOCL4RM4H4+2NTI#V^cJ%W zGRure-4dK6lHdO}-win%<k5!nejpNf5_+}#92Y-bx)D+Bg)a9o+Ga1#nYPHQH;`h* zk!Y_GBkB~lJMMvDX)u>cWC;yJI~xmT=U3or%p)4ziAue4MCAO+MdA^&k@K~QdxX&! zPcg3btchfUG$G@rD3vCOF)ij0Gg65PKIIJEkG`;kGjldGUW8ThD>}hJPS!*2F<yO2 z1fm>T!9Wn?*0WxRk)jV-fdY)O8|TSPGEbHfTmOo)VG5XtOF6Tp{`EL<$$el=e1~Q> zp2*_F_?(9_w&v(-8Hj{jLpM0a_<rZQD_Q9!@w&cAaKjw*@HNElrM~(wr_Wt@ry%$1 zk0!bciy;AyeiQAq1E?q;LyfV@RK7nUo2ELaPn4XDHP|g56S1kx=hAVnbHt6LK5`_y z+7~YC!_SX6U0TAo#n4M*Xxa}rg)TAU<4|M=tGt%SDy)p%L=PUgI`PmqIBk1EOF<mn zhmM`d`ZR<JBboc0c!rc@)vO|uWfSYL4n1>8`~(^nU)MIgSE_%Dq8BE^iBH%UH{om1 z)Nk?kV;)bS?PD^{%=m7RY;lR;NDj1Q>?K0=8faXDS>qLCGaRC#`UY75F>;R5gT|1P zM<(jWBS^wC#40zTk4WUI3$!Z<SEdnfKExTg3<}TSWc~!rs5KgSd7|agPb0!=KVh!7 zcw9vjzRKe^Xe@qSEsmA=E_p>0*p)x9Hh)3W2S}r2W>W|qT)16oecCd<j-377(3<*_ zOE8EWhT&)&W8n7*an7H}-^1AlAE769<lUl!R7INPWrPY5Q9*4#27R}&_r*RFWLK$! z{*s3vzb=Ja1Yz|sC;wyO!LPEz29TY$h52q{?Vk`ysz{%Xp44JZ!y=djlJ5s-UD=iU z#ANoeI&&FcX>w}LF_Vw6PEz6Ywe0@y+27xiAFvc@Z~(nHBU(Wn^x`IPO20V9!JxQq zJddd8BEA=+bA64yEA=hMpzRgL{sIY*5w0tWuGkvgqaV6)Zyuk(1AWPA`;h;;6RE9_ z&Q+dKh|MPXo;k?dko+k@8M%rq`I8;711kK(E?I>>bb{Z43Hyw@oJ7vV(38%hQ=jAe zdRz<jp{I91o9oHSS3@rR24eR!qE_k9KXa>Zfot;-J!7(h>3)t^3oE~|UYW2twh`<6 z2aDhaHKQLoW#}oHl}8@5kgD|l_zoQ+6PSuS-Ac^!F4lB*)@vfVNJg$vgNUIZC)Wfc zDTu}%AwR~$)%+A0c#e?^zW6TY@dNvBEvq+-{J?k6xB9b-=5xjQ=y3zti-VEK53yFC zk&hc<XJy2C5Zf;Yx}DT1Jd2+ef{SxA{`e0nY(sK@M#x{M;Di)(-pcUeeYmn4c^!q( zwpW7Ven%OlX4QtHe|-sNVHd3qk)pC%qP86U=?gL~Pa>JQ4*f1BIdz?4&Kdh{d!5x0 zl&|jAa_e8qwVK$Y?LBrabg_YGVs+uaS3xo8iq?A&J^v)#iFOg4xS^iJmZ_k+^g&yR zuHOi}qZzD60MEwT=w|b&(A|iRKc1Sq1I`3zCS5i1K-uy5GJ0~h*!VJ+u+ACS5exA& zMbXq8PA(k`uf}8?J;E1J9H}l?Od7eJ)9@A)0O_<c_CQ%OgGxZz>FDVb*`rb$Ukb~y zI4EQ{)Q;K@_!5iKe{Y(<mcN|;j`4}n!Lam|AWc=*(&InO;j0u&Psh|ht-I!Oa4Vlh zvqoD+j)k9xzl>Ch-ic;6r<%6;6@K^y&LMXJUhx8g*{b%@{?=;iKY@l>+4$60YfLxt z88!85+B1#HQEjApSlNlxnu+Y}hrg<l)5Bg&1T!an=8l<L%}wUtW(DiKRo<RL?eqp` zi8~fOf1@uqD`zPS)dJcFtk^)}t=FLNcC^D%>IO1Jr1Oq+LM(x0(GJ_<b*zi4#2bGk z_LvphA`g1V0HS<5l&fk`&jzmIZhyDHZ-L$DZ0YI1)<5vQzm&ha(OiG74p1`U>rZx1 z*hj5GX3c1^$oz1P@b=J!(27t_dWL>O-Sc0O%h6rt1?#B&!nxumk(+cC8(}w|=zc~P zf3iQbKOablr~Tjh6a2%BqQtrGQ|Y}>-G{_U=R4!3IqjU?^l5u+w!>Oj6FnULGrAx; zE}9h&^(Q2pudq9!r$2Rf5o;}lRos*gJ{RybP107<Nv{!AuG_Hv7o*o4i2GxDlA$mq zb^{x6K6X?(_ZMfcvy&^d#gq7VY$6s+LA8yRghp7x|4m?R;E%xPflYyEU`^nsKu`bQ zMlbyjt-I=1vio+r7oApEG5exVA|FJ;;U3`=p+#U0<_)(DFA66`9)qswvtC$h?U_Ug z!KLvXR2I?ostn%X9B|P-qo#kOe=C~*$3|DsD??zcZq;tlIiiCy*4K+%x~xRCzOegS zN6ijqRkJ3#@%`vC>T&-w+oHR-wBH6Nb`?3Y+hYyLLfWKcL6aM&?pGhEQLqXR(uH%4 z`Zb!}QM8-}M8rmtnKB8v+lcIpE!h0|(biTGrR`59)c1H5#;DD~Yuv8yXH@I_xBPqj zs{)Vwe*`A`e=>Gbg<Mwq5A^82i7I|U#3Q#=*&I&?z6p`+k;x!5jth?tN5jP;;mD}y zn`U8ay*0`1<ZN_j#d`Vj5tHknme#IlZ|JLa!)RknqYrE@qYTmWqQ-i?Hl2MFwRzy> z(!YW{wA!%>ZUyHjyP&-sX_CwO(rjzaHqV(V_RkLV?Nj!<&ON6eo|)BTm~F&!P)k{= zJXXqJ+kJ#>JrD%71|X>ArZeJ2<cY4##fP~F+xAz^>;hN`&+s;9<OC{@)cw<UPPstE z^y_+65JbltMg7J7-@%tn{dtK$+|xJF3+pr*(l@@Hu`%wOP7S-d6*VWC52DG@ZILFC zL6L!x-y;VjEu+_?KJz#comYrw9d|mQ2W*ag$ceHCyKxgyi66CcdVg>cE9;-?XUJd~ zuGi8ZX*0AcL_+(hzay!h<6XOepQa3)S=1SCpS4C=U$WZYTLZ11;ikG&BIiN=J#)r_ z=vI|{%?zyTaWt7%@T#u_p*=(olI!U3MbsB`wH*ugR}DN1&(Q1M0(0V7+;c0)*^6VH z$VVtapRWDtZMCQN8?!HLtTql9ON~+3L!FJN{-wT}KE40JKmXvhy6ir44%^qPKdide zF!OwLb~G2Vt}IxDWuiYsA4Dsfhnf4I)(|@{c2_g><e%`1pYwIYTUuP*sJ7M?Ydf{w z#B5%N3Vp!qE2v+`vhSq@kayMSH<ewfiBG2)*^ynr0xs>$r|TtAds_i1B8}{q^7hyE zWxJxYngWu1SQ@;K^E)^C(<o$C3Oeml^!ne)8+k~#4NKX;X}tjiju+%6t-u=il=Jr= zw17L<Lc`E`Hu-|^${ToagL)^uv7XQPLMKFRq{DMDM!&0dz?y!7tx!>^M=l9=4qXHP zrc3b$Na4xm>FC>L3T1TZ%pyD%m_@8tt$^K+7<zNMel<e-Ta0!(i|oS^_!|ddYn>(z zSc2}Jo3%aK_r%xF6TRw#KYSOy$z^mEYD=t9JTBj$Pp-#b+{md#7qOr0arSQeGrJ13 z_yb$BAvm?`onz$Y%*XFt7kzv`np1Voxa;JBmjnrX7XI|fpxOPydAbz-|D4V+*_Bi@ z?7V2SqmY4blU3CXtdgR{V?M-tm<x>KABm0+rT5zqJUHLz8a<%vYJIhh>K=Mp+(N5p z6x&AK$tb5j-kT}bN1R6MOw&AJHZ(sr*PEw_7`A73=4GT;@#L%r*WkKaia3-X?d=y| zOSFj>N(rRW1oap`of=wA&ZiMtL#?FtQ2iGzV2N5wT@BJ+8vOi*ZyjgyUiVF+0Dm~W z(Joqm+PDq;fRJ6A+Lx~2Dz9@+IW4d@1iA4;w4>E%{;iqg1+u*o$^U799(M%mdm|`> zL-82(Lu1K;&aw@Sy8>f+58by05tK!~a-19sluy;+NTG}BVtOBL*Lu)laI^NUmI1Bj zpqfifCEmG_+}8e#sxyx@&Np@=JJFtxp7XEu3b{o&tpZk0Yl0QBUbEk`C)sE1H$h77 z%Lp&J4be%%vH4WFB;$8}jPEHEzV-!pAkKjMxK~}FegSI3HnlZg!RvTohGLKX4Zpqy zMoBj^n0H}SHz9g;#aTe)YAripCm1EW$bTxx3Emgm^OzeTTeKY#;W%E*uB`GT?3^g* zhPBW#ha(9FDkHJ^+F=JbR&sOoS=bWou#0L#jWWbR7UG4S4J|f+*S(4O%n<lBzqUYo ztPKLuC4=@o-sWCvd$piCL}^Yo))&}w&B0$e=lGm`_9l39D;)aVIz-0BT6RKPGVI2J z89LPV({DH8v>}$(3}0<GEFc3tWCY_2`--tHtI&v^Dgo8c>DLe%lu@&*VfOG-YI0hT z`5r+hU4fl*4*$piybihWIxIu?>p|qCDH>oO{Phj!95n!4`wDhf7};1G@4~O_brpX? zPi&lB_+)Y*32SqP6(QDC9DN`!r{YF@GGCz2r$=8-MsvP|wtNoTs2t<F3^iilY1~)p z5nnwGa`bGiftE|V34K=JFBuK$<!WU!lC>xizD@XDKXs3iKUa@^TNb?35palZ=dfFo zx3`X6JjDLR&VY~cH|LR)MqKL;IJY+Wk7R#fe@tO4L2UEE=y2b%a~~qXVo36%<P^Hp zCQU>R*8pStA+mfNv5yooM!!a5{RHbeJF$xsSl|zdSR8=kjuT(<<Co1BtAek4G+w2X z@ZYOgO)apfW{`{hH+3|ECw7fBI7qyDEB5x+@J#!-f9gC|l7<gj;uR;bD)V3~wuc_Q z@MrBpwq`<G9|*Q^8O_J;U5;0^BAn45N%Fa}o3Z6X*Eo!=vXdy$1+0US)Nj4+nD!RC zkNt_g$Ub84q@VE-+qUaa+w~>fY=Woz4WloDM}8hsJ%N#~$0AL{FHsxM`9^ZGuaRH5 z3w+)KbaeO*ulYM<Fg{~0%QypTV+mfs2Hc6Q`vKmG@>r*DpzG8?!<S67ig>KXU^V?f z%<_9IE6MULgFi)ZHr_`XbY(Y8hyN!-ozc*DJg*ePYN(EPKP%q4>v+-x$>0%rs6K4Z z8ob^V?@d`yMRw8`E*lcUQR=F5)qTV|N1)4`;ru;~hkrU5<FmQazgXk%;Vbxy2+~7( zB`(4rTY+wom(XXP*{?dT{THWOA?IECC!TeZ@z~ZSezBKRej&8HkFWl1$q6N6y&7?n z0Z6qaP~j&cCIdP7Iub)Dh}OJ=k#|P6y~F6ALJz^N{FT#w9-4iBZ1%x%`&;~sYsmIK z1*IQg6+I@G{dGJYZ($u&$EtgaYe@X2DOPt6DAX5kL<@d5VK-HS))GC;O(w8p8D~c~ zNQ6IL<Bnzd+-CY&cfzl<i)y;>SSww9g^bvGYEB~9OF4^1Bbgtw_lFVZJBucgKX!^3 z&D-dsio4I5?6h(+IY~}VZ0I`9YxL868-M;-Jn{+b@IiRoZj(Vh5W6@dr}-qZu2Yfs zS>Tdp_;m*(<GSI~%c;1Wh4<0!*0Gl2)04^`jk*!>>q+-e@eD|X&lc$OC${4u9yjre z{KwuG|G-nKQUnPgPdu9<5B~ooA^=U03)Pr?At)p$C>8OHmLY4mDfbYJi7MRX6`m_f zPMyX*3v!b6#ou}hO{+WWGz_{d#rAzn)?uRhgui}d#P1=KH8MVCaegIIq1TH_lk4$V zWJ{=W!}*0B)EP^tJDtmW;At3)2C%_7=j7%bT1;g8bvSzy9x%bR9fTL{0$Jw?#5M(Q zEFIp>OnCO5;CI-M6qH(~K6sBh<8i7OU&UwfxZYjPji>mR_Yuc;h+_Rkt>$*9bCW3D zskp~+4;~fS1-Fr@QvIsnkxq{kQW>-0;#I&e)e)aV4QL}VGeJ*l#w*2mtu*hGs9_f9 zm<PJN#=Cp6Z?967)PR-i$jS5>+S+zyKaZ8f#0JsHt|Y#>lgQ_;@YOSXAiZO+K$i_f zzj~9;@Z34>tb#Ig&^DLS@%N~63B9l^dCp%EL(hTd^&31q57@7z7*Q|o#`zuZgC)5> zv!KO(e*cW^GYnZj0tws{nzSI&-+(=k53iC&9ZwK16X{R!>V~7}b2p*I1t@ldJ#zyZ z{S7y5g(kQ0!DwjMfAiX9{7tvmQ5m63T{t5MXS~DTQq@os4X*?Ik&*ujvIDB{dhz)0 zSGh;_`0o0Y-EoGqKu}`K!p&XK2d1#kzk(`VI1yh{6g(scIWgL@f+2K^KE&27PJpHE zD5BTJ-1KgQd^DFmlO0Mmb3egPeT1C&WIXqsslYjn40GWZ4=0q~C0t3cLc7GXBR*i1 zt>O0CJU;<$`G`kbM%^2Ip$AeyqVysu1P`S!>x*3voupRe9y{nD->2cnjZj}u8BcJY z-hwWIPIwwRNj15}{qM2U@<WwaypNao{n|mL1lGDX{80l+2#!n+c<fbt0To%H&p4s> zflhRj1*u5IZv{?(7HBu`qT?3_sptl0+97<D9T}hBcNDMq$JAP6#@^q?J{cX?6PlnY zyhmJOGCs>+(MIkOjmUtXayWZvAwDv}6g2Se#o{af3Tu~(ot>R=zK$3A4d~JldqeO? z--T9Pp-Dez@+n@~K0H3;ENKH5y~8^TaFq~TBIm_fD07t4+Uv5m5nkSmzv(+<@Oq-C z3-QDqfO;qKUJ8=sP3*KNwY-J#fCZ5<Ww}->=-!aCs406Z4?9UvamZIgN)JQVJBZ)< zAG|9i$;k^MO)6n?lwki9BI<OWSJpDV_V8k6bcS8{UHf1+WFwaGka)#b`jCB33}++s zIEc>v6iu=qk&7lom4-vZ^{nMNJgc|iZ$TN5et`<QQWn-diG7`gRV>Hqm4$06v38Ak z)Q{)Obb@DkqGfl4QgZ*s(5wybEdg~(u)_q+GXRb5bE@7(=AMXqDg~Kx8Tb4i`|$wW z^eb}c2s+X}s3Sc*_aTEWu~H9_Q+Lr*azl+oxJ0-yz<30MGY>!0@ytia-gVS}WK_<; zISzi3^z5E|@Jg7PoO|e%BU!uQc+s;mgA8~x2a{#f7Hy#-{{0fvzuqFQ_Yh07D0)Oz z{Docdy7rA%FU>^*KF=xinDHkPA-K)Yg4{D3ds|RlVw~8Sk(548gu*;Z#=X`_@RMW= zlxIcj!&g#=Q;NIi;4eYWDZ;9Xe5EE0I={ky5`__*fEVnSJn(~uC@<JkF}Ugk-zFBV z?5wL$MWk~o6pF;X-1mu^re~)MqQPB0k(<#4xrcNhEXFP=&j<vERuH*mRD$!Kf%gbr ztDuevg0i4$3dYrQ<|!ys7g?=y+)uE3(y;ENqm@+m8+@i55=HR41WC9mKTGovY~r#! zTbem$V8unt7ECgek>7*YuQJ*jto~WfnUhddvP0x?k~`grueD%3o#&n8;qnj}dzw$l zxpX<M^IhUxy24JAPMjJiOg?5MC|M=gv*qE)8c0cb6pC|dapskWl?gGg2<O->?jb($ zeejsz#;#@u?qNg*@5#f+8^N<}h{epNer`D$pTr&|t3{$xb(vQdsPvH09A@wS&dy%U z<6B}xgW!@eJZAC#BKG(SUXxmQ$$Pm9B?SdT5G1nl$OF9ur>YFU^D|CCs`B!la<Li( znNvnqMzB-`ZP$<HC7+gzqG#*@iF;h<r-!H}aj`TctYG*{=O;lWlT%mlt_9_+EL17Z z&yvuoAphr%Q%gF;3ucgybrE!*7tqFzue@kMf?o9!Z%8;xMlV=b9zw`VEFpzY%QXc1 zR$~tY_$!I~3-W7_=LH){WX4OJ9g!w4(MVK2D`%3;Dmr`%LWdxKc*r<{<l-T5NIXwI zC!_W7UE~__etFJ2sRb#<!#i=glI%c17V_|pJVa*sDfm}{RwDP1I|*usTv<lvjn_kA zk}6)IWFpTCmWtpG2@Z?w(rBF0f-@yl5=<09`t>lQBpXe7Zh4fG6_eQs-ibWqOMc1- z<){1>d=YsF_K4iY8-?J%Xz}^TTx8brs?66zvlE(o2vHtVk<38GD<~uKEr?R`TVkQ| zxtG)sY!X2j6O1LHgNMH&)Obm0?_PqPC75D@K_n<u8Q?&<vaG9ISLh-Xku{euZ<gMy z<fp8Stc!=HBLB(UWc`HB9#)bd9C>JF$y{GB)kIEs<4)iX@~VdzC6t#t$u;CEGJEg( zLO;2?M@gB7P+T4!KZ!=};Rks%;G<AbRzX%@&}=;HD(|OY-K6mlDtWY#>v^>CcuSCU zWX2vp%2)&=##<|o6Xi8;{x8>EIL$-H5ss1T$+tXY)N)-Jp@&K&|I3%h@!plZyUCs9 z>woio$xrfGnUTEmlDE8BdNh)&$R}mY!t1hUWXvxqDmYbwW+%^iSVQuf_o}zP9*4@` zFOiJoN-{>drnd{_RiTDFy#4g@Q*t+X&AY!xIhn0ICs&l;!WTl<mm`yFc%${!Tz0*@ zTdwK-_9!o}dVD09Zo-qE#PP>RrN?Lel437;#G|^$6+%ysS6|XdDE0s8=&g;%-yWX} zwY_TyO}&TgLZO2<>X&1cxysxn7vX=eczf4d75TJWPk6^$Pr0&udDoS(c&jMy@b;QV zbK&g&$wIlN_YUEAp|!VK-ipb+<ti_qmuq_*@RAGU6_KDqTX|JJ;o*_VN_f&Jz+bYm z9+${-g6}3W@#P4G-a<#2wTwruC!_YLBiHpfM5Nuzl@fXP67$T@{uenQ=SMO$lfOMV zkjQ(ycgbqYe;zuTthOgRWt>`kJi)lskWYJ8lat8f5qYnSN4QAdFC&uC3jUKwQyHh6 zhTbgXx8O>7UpDem5cmXNP9B2(DK?GlWBFg?w47VsI?AfbC%tRSso^~@zdd|5Peyr2 zeI8%Q{RBNqC@80eoXGN*_o_!xxuUGRe9M&t8&m$0&j@wpKf$b$`S^KOR>}K}+(}-O z*~q<R-XhryetP@Hql{cZ=&M3|dAEn*C)Ag7L})KpNyoQ5CmO4CLy_l%?!q;Kd?z}9 zWXFnC<(+AM?j!UTOg+&m9-xJV;~IzLaXf*tBD3Y*f~h6=E$Ps*a`0PfTQcysV2@_y z>RwMJ@j!?s?PanGZ)8NvF6_(4Cq$EZ%2h?1PDMMuf~ItxJBq#TA%|IvC5^fH<9csS zbfWBhE@S+^B4}Y5xt`<=coY!a%tw6o4t{{EXj-?>VJT!n3zNPG&!MH<U9@7s1WQ5l zD#%Dhug=DpM9&v)6gqh8`-tm3iJvqt80iD9C;w6T%{`^NjO>2VqcSnq-2BYN6-0X$ zDkQKsWUWKcQBEx#y-+X{MXybTvVw!=oqZOzNPzKVf^u0{nQZa(k$H-CBRpX7Es|e) zaEJycy^{nJCky|{I@yd#^uBxC;TH412nFv!2@9)0I!`#PyjL+%9Quh>A(l=G*T~A} zg>RoSDmnc`cMMQ*E<EaC@X9`uyLrfNGHO9~%Y}w2{RCdeJ}QSTA>PN9ace1swe)tz z6SV0)_+JFOUy$iH#CBmJp2S`dd|{Vai!GBMZCCVO@mw~<f-ld!b8-zY?>P&WRWdYu z0L6p~(itGa+yqJaK7Waf6E4UJb%aJjuXJeAw~4))SS7L#axr$n&9zwrg?9)yW#<22 zoU?AiAz^GYohZSzxV|o&BA=sECGQu6)2v+a6?Tl|C!N8nyUjfAVrLcLGsU2zhR&V^ z%c=--(6O|xLCNckGKe4LDRVuHf8j8r*@JZ<S%0ZK>taRO_%S7iU97S^_^}_e!|PzX zyva|M@2A+9uj0278Jd8fLON$lXN<Xch?kHpwhvF>K`1JAWNGM79!s$v7QJ{BsFsGN z7W2vu_Qx*X{Vkr^kI9f5PoCV5*ijdusn~?0v6(iLf0#)AVL9UQF8(d)Jo6JCf!yFS zOe9+@f!+tFsTDaxM%fXn5K_pC?Z(QU27RG5UhTm|sFvd0`He`$YJ48G;f$>KGk(S| zxgegS_!+r8L+~3+!rQ$KN-U4{$Met>j2&H>>?^J;@zo@QtSuBT3q2Q;N7ao=q3py9 z>XU&xm8yq)RCVRXFOr8D%)kdxmUzG%uxJ`;Lv+<BVjLrKeV;1b)6}oOq5h)WkA3U> zXO%XGM!$^Cie8SkkG78f6+Lg}C$2Hl9q)Tvt*y^B68)FRAe!i3<DczM^uJ}y(rT!) zeV@21?EzK=Ym}L6wg3yEe<TtKMIV@z?1_#MyFg9#$J%r4g1*UE?{5?+893oTWgI0x zxrdsl{D@B?(cNyZwg#9zq7|cGMeBm-U)w5dr*{J2e!b><RVlA#)2dTF)<Ms%kJP4V z6UlymM;Xr=e#58Bxl74cyX0hs+EKSAS;TY`!jsmCIPGfU7`gD)uOw1djY#BH`1~*G z!^RL(Nf%p;Pti}-)m}0lD^T|`7XNug-(K**`jEkv9|ZT+)Ta$4(`_m_S69ecyFzxT zOT6;9^O>7n`9s@h6fz!YTZtRh)xOXMXqkuxk5Kpd4mu^RcIFuKyj6{^n3*ltJZMcL zHqzE{oZ+!3b@O@kkF?3;GCffTX^Y4kcvt<54EK_;Va{NCl--iZ+B9bmnDbq1*B(N3 zL?dMMDWd$V$O@@UPSpXW0<oE6#Qx@jF0+rQ>1*y_rx-}@pAcbP0eV%V*iPSCG8V>= zNmPi+*h!2nSzAG0y9iOrqRL=ucsInx5ueXbbzpkx(0aI+iN_{!t%As#T5x22cG4E2 zidmJP@js2jBmWEZkeI-IWYtb0cH{64oW#HNGkIsNiAChbJ2oGx)gc3TGw6tS@tR46 zQ!b?Mc6_!g$ujOu2Ha#Kops5yY)#+pY1FsmK|(wNH=_sWGIPk#e1({IBl0&>@cySL zm+(>yXKx1Cf#1O8>sYZ1M2pW6dF%(GR(?2sA2WVI2EhVyXl(qyeTW^MRnDoIs8}r% z+!Ndo(ESVa#YAwfE2?rWcEsInr=!cohR}jEU#L^qjFdCGk(1NL8Sj2c57LKPb^qf) z?u2&}h6ghQdKr)D#&}K{<J;s;w?~<4B5#CehE9cAhEGNMkrj8rew7-k!M?_-U$13+ z=-=%B!XNZ!HFm(|qm=f(p5*H6CiiWEmBCtK4z?QD&B*+?L?pcuxtQbW4f2)tCjD8D z>*MtO+I4y+{)Y#DG(O)Sq0^USV)m!{^RAuZq=F9c!0m-JFN0>V25<6uJcIvGVKPYF zP0TrkDzT~bsBUh!{`A2TfosM``gLU{CsXHGZMr-s+x^YWk-p)vq0yl_;Xfj?Ox=Fn z8R{Z=eM#iDbk&C&gZxHdx_`EDP`j?w@%4*+<qmZE**&cX(O&fLP@^NGXHCN%<WvP? zuOc}yuWCPQwe%n8Vm(uj@OMQum*V&R;{HQ)xEOKb&30$I6p_;NP6_01Z*tR?s_V2w zy_{Y|_v?l9B)yGxmAsLGtZ}wjACPS_IM3~abXUplOeNOZ)cM!B=zfA1^$jF%E3#U< zs8gvM`++Q}KI%rQ`Z6i&I01eqr(qPkx(J;0lq%Uy#MTw0dDPcN`GE@LRJE)6F*Q7! z@heN0w-xa0Flv#DIG@=)!5-;NuEPeWfwP>hDF>;yX+e$n4DwK}lZ8}Uy-bAkJ3cvs zc>W6|MSY)4lo`aEfAD3;J6(zFoIUtrn}Qd3lvDe6PL8@{zh!U_IZvF;&J^l_esff^ zY@==`;-{-Y)>=ZuuRA%UYsd|#Pez5{a<l^lZ#=%+G;*hM^7xNF6K}b%vPUxG$sWO} z_#<b;LwbR{K^FBn@|n+)@hm8m6^SU!fhW$R8%*%kAtJYe`m@PoVLT^iy$2EWUf^)t zGwucwgZun#={s_so)LT0U)ABtX|g~2S!W~jLk-flr0oyC7mY?snb+un?pPZfY6F#L z+G2m};LTuiu#SJ9K3ShnUeV8*uIj#AbcbFa^}|!8BaNa1&F<Fk)*7p<J;E6mdrP^k z7BMFK`vm3(PWy)%ZS|6LfbKyh)p1`FH@|(ztRG!PpOf^_Or}P@#X@pzuiFFN`o1RQ zay0@QX`Nm{@1gZp-$D{-<Zm5duWxf~P)jb@&+UvL%p7rtq6>WF>qKtMO|^#p2id55 z^!564qfuaPFk8~+i8q3a0$&@2wX8~0UpMzJGM{EzcfwE7N~NxO9(d6wZ9#ZLB+2yI z-5l3_OR1$U(#rY=2OA`=OU#~lJ&?<Pfj%R9)PBk&dfD8t{*3+?t{f_rHZtvKC@qrC zoMg5Fx#lxR^|e$}^nJ$Az?I;DglKR~puYdI@rzN=cwfJyq>qK|-d29|K;+Fx)5xyK zfT&{jgu;uh@y>@x_C)PhdJUH~RvG<_Df%hxBw0m$)d9+tSUz`-UCh2<b>@uyf=)vx ztYu_j+^}0Y`(1^Yz!;*if0D_NmrRDoobdr|i?$Hj71r7lvHn9j<$IxY)G8Z?^t=Hp zxY1wL7^$CC-=%6sQH%RBxr>~e=5?|j7l%ft-3jfBECc<Zoq59?V@-1^`+ilPYn_di ze%GHI=;j|~e69D>2ar=WM19{^#cgk&Fsqo`qNAe|q9!%-)yZ#s(<);-4z(xB8(K^K z8S><?vD>KO@8M51N*ROn$DI3<V!7R8b~`(ZJ%XI0EoLOz$1Gu`TA7>??lf}RT2VV$ zfn1_DL9i)6hm)!7S(BLXw%E6vR?D2m)VS4hQpvo?Ku+;-XC^t+5|_Ih>p^YQX5SO# zXZ5^#M(aw}bBOGYUTQIrG6n@!7*_*(5^@GF8ZV3j`Ze-XhN-7wZJcR#J97;^W8Mk1 zP3xDoE&N4fMPyxczuDAk>D2HQS4--9k*6~QD*}@PDS=vai<xTttlw5I`&PN1*t5-h z(UQ?DAV(~t&v*04k;r=RBaYbD-0i+Ss;%AB#~aoCWBvK*k8~yQo8K~q=mXVsO8MA7 zWP`n9e{8)ltC<y|V<X+8lg-XnU1zO34xQ~?a(3o`d6ONAf5x8sOq+n7Fx$7AOpt?A zyq*L<YLxvJ*`)`pV|Guv0B7O!p9MZqJ|gw&l_zLUUy%jYP5YO9Q8VyC@a^ElK!$|m z#36Lhi5hpbOmyVwqqKJSSr?;uBBMj=L+jFpr|wU+LU#CJWHJ4jezYdKma>DsN-6$> z{@(-Lf*YvxJL5lLbT@|TTiE|2oz2!h(~35T{v6p6elI*HJS<{Heu|zkb2;l{?Uk?8 zf!ZW}t+CYqOQ31+PGCSl4YZ@uaIb18i(>D(l|Z+tXeF8-M}tv4nk~95de|Ib8=R*G zIjsxHF<-#xGDCkyKZcfdnY^u6l>)x6kfA>!>l2-C$yGdLr`iVjN>!X)pnY|swtg(O zLwPDcMpN%_O6jZpq)+ts4gL}=8Mq!;kQhj;8hk4d^v@v+dav3fw#>>&#a=j^DeMnb zO|ALj$Fy4E*U)1FW;JWQQ%YGuzH=7N^}B)W3C9u&Buou7K?8orn4&%MZFYCro2=$m z|LB_VuFxd<rH8`hqw^xYqFbya_e89Sa*@;Sfo=pU2Wtht4|ET-3fv=4yrN!IZQ;um zYwF&%+ghrbF&d6^jD8p`AN@U=XnkzI?XCo~WQ*^pQj^@ZdSrGcp#f*0uF?T5=x<K+ z<z$d8bQe46sXR<^F4K>!zWq7bdi}wUtBaQP3Rr;ysXT3?RWKs{`hnhoKyYw^k+dUm zW5R0CC64KXwbjZ~cP)~siP<v}4ZV@}$BT<Es-|@ceHoq@xe{$<U2!JRUArr_10ny1 z!FdTc6CMT6(bcK9f4-5X{i&RZ4FTD08GYO@g;PU6gvNxMMaoCIMCL|yvf8J+YkYH& zrxlDp{hb2+0*lB$pB(5A=<7eFr-FzwAy&)%(e7Z?F>giNMjuB0<1sxt)qKZ3<lJ#@ z#~%3<^&H4qZNO1EN*@13y@g&%%d5^%4q`zsAipHlS>jwoQz&I`v>sWb><Z*8cSB1` z;=Fv|dr$dJJ*OWx7Wk|B*987x?q4PTlCUbc+&{pmtPfLn#Ckg|?MzkyI(Q|dJ$>O% zeJyQm=>2g0NK<xVTW4&n8vHvzU*c~Ztd-CXOpfh=5`hpMqt@tOs@HtEV^RA<YiKkf zGBMmWe4NbjT#;UpZIO-U`}P#DP#mSAwocz^eCMwlsKB~UKzbDNkI=WOuP6gz`Q55c zs^w$$_oD5hm7*h}>!U}_j`lL=vU@qU5hRbsWSCwDkLX+dXEZ~f-bgElBs_slLhK$r z*l=q*$H^vcXluyQHSB_F)az8@MC`%|8rF^(`>6>1-CrlMUebWXdkIED&A=FArqN!T z5v%FEATN7j^rvu#w2m(pzvz^9EYu);KfFCs(sXSi?7q%we*KVtM6iE?m9PhiQ995p zaMiCFn)a9PgxkWIVQq@GB5OWh_>1tU$b!h#@SMmd^QPU!{oI$IOju2~jAqQbXrN-C zT3{7D=BDYr)waGTWG+;6LY86GHg|D$TteGOZ~Cks?SPwv|K%K*suk4=oMY+rvmh@; z$TKbn(%i39$M*I8Ol-S~JI4u<hnM6yR&To_I^q#~9SA2=z;-#W)-nF3uC}u=J&>66 zUt;~lHxh0K)=`;o4%C{=Ze4qVJ=0X9g~Fj!`+14fBB66(C!8btT{M^Vm0MiNp_bRK z>HPyA2KOW!Ovn-ZmK^$b(dV~nWt9%G@0_ysALfZ@=1Adiz3{b2J36)1#cKV>y6)VI z{i<|UzvZkA`eXh}{%Zc+#tfqbHsWnHr_v)<&}|1c>}qR_+0X269x|&?!F<UoXYX>- z;Q^TlZa`gh+b`8>NV#vI-yyXxd8AF0BIHuJ?h<l_+LJ}~u5*WZFLZ`D8=b~j0<)C~ zdQ<<K{x^&o#_?b%v0CEQgsj2Q{<V62W2ctQR}$$`!wQ;zN377>sTE)BPJJibCo&~k z$BdYYGu+o)ZAQPtiAI&cy5RAI7r|VCY-kAk$?9*eQe)xdvI|@9m|dff!ohH>aGz)b z`N66+jc#f~Vz-s|@gkhp+Z%P5?^=IxBSn8mp6zLMnQ}e0-x+83w<p>UtX9@_GqbhC z8e^B{+@9*(bYG#GwFXvtA~|l$l&V;@tI+U#<Vg)C=dw8UXt}9J9fyUU$KByP;ACrv zlXn3~(7M_skTF;z;Ywguuu_tpI5^2l*dN%ZzpvlZ{!v;x+oIow`-OfF4Gu+8L(dOC z?~!^wv>~#_{MTA-PxZZxUH3DUI)4XB1{Wu!Ppq9#KJbYi)ZSC`DHUQ1t#szL$enO< z<cDzU@av%sq2%cI;I6F%)$0@AkLq=Oy1!^(wZE7DKmV*i%RoM(la{Pj$C}O;JK$Wg zW|%*lDON3Omsy{aqqRL0+_O}W4OYe~QX}>OI@%a=pjz>r8@x9#!O1MYip@UCT|nj1 zU)0$R!9Jcxu7)3r`>1c5vQ*8h*A4DSYMi_$F@NIl<P}K;l1?S`3H+?>AWw5<tb$b{ zd_487=QW>~P0f{h<N1l_GgEhlvPLW0?cCw9I_fXRKf&7xyAys*I2A0FP%q&Q=UzJf zJ!K`eDNpUpW}9%v(C29#Lx)1O!|B77!rw<uS-0KMzLQE@kRg}(YX&!>HEa*;@+Y9V zgwT1$`NG&H9i3Wsz&a7l6m1zDM@`EGbG6mUcAfdLyS|QOXYW?(sZX(MJE;%IVgCjX z*Ywy&;2SiGXZ=lfnuBxN%6XG&x@Mq*z7;D;4QqgUuhDvez>uV~$+Oe-OD>r%WBQ+x zpCo;oP%3Z)l)0eq7kgo(f12|=-LtvRUVYx``Icu3p8uViHGD4mmt8ydr7}maAGn@y zCNUpf8n-0OPq-1h7np18Q6I)WajILbqEo`vLZ?!{N=-~#k~TclA-pOw%53K}^;OrZ z8=d?E18MXbtd)>Ap-r$<prwDYQBJRemX^b*XMJEEk2aPQI&v)X3uq7JtdaIfr)(_M z*A}#b_du?DSF5N!16R#aTKS5i-(E$|6t#2PzgeB_m3A+@GnVtvt%z@~3HdtHL0Nr^ z9)9VunU4pGB`-`LNq;PTTJqcJze;x?`AI@Ce|;^d@_FopeJk=o>XoO-Pr5!C_;l~H zX3rZwub6r-l*?T1r1yQIs>Z*86^Xr*$0pxM8jY`_PvEA1ppiw5xHGK5(F&2Bp~-0( zQ_H=Gz9^eEA>25++8kj&aeC3+@>hRqU|_IiLZ`$7iRThuPdph=jq&Ow-#K@jUE53x zmw_Lqg*S%RhMPw|idM8zT)%HI+QdBV2ddtR8B4%&+(u9F`FJ4zaJM*x?fm4*52R+` zz8!SFa0a<+K%L)8&gM2{H(FLZZ8w!6?a=HSXs3*y{68fgN={6_ApJY(+N7(K+&uB; zgf{;6`V6H+?3DFOq*&_6=fj^gf12>L#j~1>zDrus@cig2&WhL?wH>mmKtkKZI|;$W z$-yCk0mgfJO|7wV*Ue{t#fg+I{7&efw6wG;_&3&@d#!X%PAYlt`tGV@^-i3AOQ}*U zZ8Xtusy`^xK=SSuo8lI9wqae(A)GzU&O-OpJmiush)u($PN%L>rmJBp9lL3d@j7$| z7il#)SIKa6dveZdvaX*yZ`fgwZI9Y-Q78TcZ=pebdL^~9I!pTruWJf5LodjbEw6rU z6!6ar)=yeZ5O7XHrKD+zmjY#sL0UrWIW=Z;ohH%Ip`9<3|6}PKz~lO!K7O^kNtzU? zk=nMADz$Cfw%gRUZ6m+BscoiqY6Z)S_jC6DKKBXQB)j*XGiUIfneW6kiqqp?$5%<X zlz7~g-y3NRqx#b=ZB*B5-|Zg*UIZ+#_qTn;u0-Go#hTZBGkN#6zIER7c;Uxfi#>+# zi_sU9V1+ah9<K6mRypW_8biE)62v5nbkyu)<btOp%4lR%F=CAu#$M{>PJlPZTa)R( z+ymON0)2c#%1X`tS1R}if+E$CicyIeNdLwhI@g}UXXT;)axgXC&&;(}Ul6;$N?9Vd z^jZ>ifOZ<6`HptoRu7huS;4K66b_n%-n0c|3JAAfP}fO?jBNTRZ)<nq#D4Ju<Eq7F zNKD~+?|S4q>rUdi<xOc0mj=nhl(brZV)`kzFPfX)s-N81HhNEB&^M<0nu0Yf@Llz- z<Jo<_YQ`Be0w%H)VBWK&JMtwe`^PAw;i8GBW^N6A7pKTAyab&&1U_CLHsQ0N^B&O5 z#pDRO;WIskulGCr^ct4wJvEsYoKp9xuYE?vT@Ps(T?!#E*Y=_^w>gYF`CzNgK{j9_ zd5u<d6)*!rcG7LzU5Urzzo7Qk?y7&)FxxVwwf+p47BI(t+up)a)REF&Kzk@Jz_QIW zT)vK;d#)3S-4j+N{^u-*g&pLs<sRiprw389chKrU$ABeQQm?XqJ9(PyN>k2Idr4>A zyMeGBV(%&%Yq7G~kix8>q4%lsYsyaMqA%<r`Gtv8QCEVuBOfSFKM>X(c#lP>zB@}z z<OOnJd+2S?LnmQH@L*9--4f)qF!_elAV~|z8_e|A;D1A=n~=%)L}$Z5kn#s)L>7?E z7)OtN1!W;<(=M#|4kFIl>TUIjT9U7W)UVoZTQB<pdtF;=Sb0m^>ku>L(~i&+e8}2o z7SccaihHwpTDT9p$GP{ruDi0hGrQY(VqsEltoJa=(?>Df`Y0)2brWH^*g+qZqU@Bj zf&}d#GbDKPztcT76x=&0HYp#dUodsUZRx5}z=@i1r};PmcfkazfZP?Q7P}X(m4xb2 zoqGEtbmNR6Yj%<v-+km-7GtLmQ`uICd|h33v^@+G9YOd^I=P}iS|i9-KKEw{H_)GS zjl5MRDrHZQ$Jv79+yNh71PjJ|dKVNqoUB6{*rGGidsP$uyMq4S=yCL6P6ItTgHF-p zFeGXp70!)}buhBrpck!*FN-g?uaobTFD)!BEA(%~buFj~|7hf<M`#@#SYdvam2gn- z&eV~M$=hv_+$kX6zo^tMNG+zAN%9)@!FTNb9Woi0xv$CWYe_WLFQoqzb*ba|%c(rW zCTjV_{K{Ceb?K<2tjWHQhtXpb^?}Rb@`&WA1y59U@@0AanQ758kd3@uM)G_m&<CRD zM9jZgz&Z=&k0|Q%b-JO3)3H{9{-Q$aO7)>CYZ<ikaKe6852=G;Qo5&%Qqm}^*~hjp z!WXmln&r%BIszZ*^I`U>rx%0a(FEx_<9kL_XZi~34fJ`SvpGPMSJ3DE%=n9}cY>+m znVE*QAdkdeRON1laVH1ZjgKH8zd6l+S&1)16ld7&qcGRpV_iP-lYi`yhG&u%3l>b* zMHqaEY5AYeWFK~ernUlKPeR`GG3R7G>(z}OoH|?sSoQA6)grQLZ;-&O<a3vC!iI86 zm&5WsmafP|HMdq>3)e!mcj_K>f?5=RzL)ZgtW-27ZwvZq0bS8M=nzRy40cstrjOzI zO3^2rT`$dC@d^4){k@(QE~v3!(Rb;x3Z>7v58M<_h-xF~gW7@23i<m-zB7-%ihCe? zunhcnITE-UJa`AWfoS}U?^q4dMQ9g=3fSV`ti}f<;}UYci{BrQ1ec@YAe0R6eR7{W z&<a!NcI-!#HJ|$B(@2NtxAoCMQVZGs3YLCdZjFZP#Irq76Vwn8{1kZoQSjYHz&Nyn z9;(Bv=uGlN<1H^4p3LTDc5N~|m3fWt<N-G6k@{Hrr$&HQ94D)h8E>#Z9hssd@QD#% z76G|mM*cJ{{ZEt0eu^pag402;1=b?BGZ@@`HZnb$T5=(Mk?i>n(Dyg=#s#yBVO*)$ zSB?IhFYNe9^0RX|%OYbQ>d$rG;k>UVZ#tDb91W^I9!|@ZypvefN35$4?Kv6=>MOhD z1xgkens2B+cC{ubR6(Bh2Ta-XiAnF$b-NlX(E~PyGS*SfsDVYDNsN}C48|G!zSW%K zrTSXF|Dp#QrIFvkbc&6mS8Tg+!*Ch-!K&8d1<PQ1f?H-Lw&^ih_H1aI?!-cZQD+YQ zL4vbQaOf;zZ;zwV-qH!<#j0uK0Mqicsi_Dzk?iY8|6J<%#Vm$IvW8;r(+c*oJw1+f z@v{rjN!F0c@P540PWJmgyQ^E}d6%T}COpzx@U-q!zp5FuQd&c#IER*0bE>alVJN3w zgFR#m>@tJkajr^FTsyKG_t~{pWMDtj2e(3>t52dka1k9~23e)HaFdSY8cg5Z613PW zxEZ=3#rKHvOLIT{$W<TZX?60hJ=nvY$m}k5axId)3JtW46Z?eoYruPCV>f;5Zz9kA zo9FyM_rxQ9zKj!3=9C(QM4sdZ+D**fm`crmKM=zD^x%j4Sq&SbCC0Gh>(TM2*yCVU z_op;XPJ+i?M4hT$Q%$uX`&*KnRBF;1Kge!$RCQ$#`QzsDHR=wCJ(-s<8ck)wbU&KT zNRR#i`CU$@@J#yIZ|RBTt1^<SOJn4KO}PQjy&CS6{P3?`p^H2pwE_LOxAVmMY03Hz z!)jc?#=hh<p2ON+<nu)`NUxDu5BsXoZ}%JT;td+>z5nAieIds<-6N2V9DeO|gZ10W zYc8NpyRUzbYf}Tzfak8m=hpBF_Tnth=T!ek@4*)=L_d6)E^@5g2iDKR<QTRg*{`{7 zsHfqYSP!RvIrY0Ti5}J|+`$ZN#%d%cfu4$y<l28CwOx(EU@u?wd-`qq{3LW(ellpG zhQfNdbQ$KDvc^#3Jh5zR_@r)90g;?t7>cF&38p=XPB)*FQ!Y!dOJycsRm3t^=5sar zr>bG2bC8`CXZ8}3e1qv4H}Su2vd_!unh_l%2Hx8lytSF^W<PpDYrw#j7yl&>ogOvF z=XK(prX%s2IY-y1wiirQS-=WAaDKM3)+y;y+l6nJ9;VYV@SX03SLB*<o37XxWdE|V zi!4f6I@(rqZx7J{VNCv8h^&TMpUJ}yrgty3`P;ZfMsF|uT06KlfW<7M*Kw3FgdHDY zOox^C5M5k<>1;1T-{=VJ_65^v7KG#GAl`K;c77WcN}_MKB7L&0<-YX$O{BMZ1l?n; z>4_{tKd9&*|A{QzLr?GK)Q`q8SEp(wkUXd8k2uBYT>%5kM9%g=R-!kaz+l#73Y~~^ z(BX^lW)|SDj`d$-{5ozLImzvK3g5^Nbm3Kf;A}hKNDGI1a~plz-xZ&tsY&oOEn@du z@Qri@J->nHm0x~?hG<0X%snb<TF^oAm`r{Lp3h-^BmZ)S4z~Gd@J`5mMmj)$>Ti*a zA4o%Hdfxld+ja&&H4~lF^I#QAf@ikUdW%JAimp1#b7qCJZxTJA_vsOqVbo1dZt54^ z>=*EUx5CmrR_={AUJ_mRmz=;xR--<Ch?k0)6X@}YJbMGqc{#er3UQS~J4J8;YGbo& zz`Rq#|G74&qLrV=X&UuChlvE<Py-f%*HaB$un4*QN!>wXnAM`_b`6H<v9&S*3E9Nj zY*OZtX%1H$%3W9qs>%jubsBwvS-`3uBH0UB|EjRa{UIB<i)S2-R&POnY&En+5&GS8 zn>oy^*ugA(m(PC{h9|c??7(gDUKi2n{EB=>8BXvt&hur~#tGYFUg~^WV&fvwh5Na` z2WY*&=!PKleFnVX9DJmwGg3!SyaX*eM<u{Eyf@MRRu_LS8&z4N!!efXihG>@3-~gk zlPwBuaGV~ly=adke1C$khmg%EKJUX`?BxG0(UIbVi>DdZ=MwK(OzsR9!$#PS?ozSv zT7E?b^+S3b_tO{L5&1}@cWXKQB;}~?N}z7-48G+QJf*s@6Xif&0%0@O>E`}xzJ*Qg z9E>f3XK#!-1iVYIf%e0{>C5NgU||bj;XB8QD4gmD_I3htyN`O4r&N8ZoXFDLRd3Go z9CYCZ<oFaa@dyq1oBPzkk#u^&<Jrx(SdY8-1;?-~g2{Re_ty+Bu?SvUTGmEIf<!O0 z=zhG2?H5nKo2TE#wUzr{hn%b@+rAzBd4M&F=G^_S>*XtTZ$31O#)-&8=Dj6ndKrHA zbKX50(N-Js`h)2NolNz>RHSzx{f_nN^$Vrz{UVX5n6Fj<oAr%)q<x&zL3lc1E?aU| zDS`gR&-Aao!YjBAzHkUugpKHs)qHGZWp=Z6M`8ZCjyL!X&ZyM%h&N!BCZZ4aQ6upZ zZ%ttrauLNeBz_slyG=lb=CMEPsaDv_eV*pjT|}ZT;v=5q-=c<O7e8CaIhcj7F_?Iv zIbA{J{QYgIumYmS@h@u?Lv_P7B<VB~6ovHs?}|c(PGi|FBW0o&`yF~$^kc*mUH`9( zMWPZjHD|Ug)sKR^V<rChT~HJqF27XNKjfy%uMl6;uto~~-}m_W3M9D=Pm!5*{zJqW z#cs@|GOq*rIGh@;?9{lWK{E$i4rI#*()t~y(^%r)Pkj7<(Jzt9FdeYhWx@W2qq+L} zrD+=yE_e(@-DeVHp#Z&A^?0u?bU_Y6yF}t&&PBeKupTRsu`Sq+&BRe#`EEV>XEkfN zl;4@@@8%rHYBl4;Ri-wv80(&c)ej^;=VBG!@h*4R<uk~y=p{YGsoU-E*FOCJYxf`j ze~#Kj(O>!n3IFNu*bv<hqDw~91_u#$3J&j-R0@W(E8SVYMfgb<k@^_Cg*a?U5FV1y z17GkJ?qDys;7<)B9;(D&Iq_(PAGjWWYXtVOCw8(1R=o@{az*TBVb-!Byw+JjMUo+d z!JO74R4fJ3r<{}XyN$If45RuIEKDQx?NvOAy;cRDKMV;@MJ(7D8H(WqG{QeG#ofx> zX$k7JGGMcE5-Ij0ci#=~bqS~SEV0-N>~J#qD{)f^eDp(D`dh4bZ}i(Lo>uhmZADuz z#7=z0cRB~x_(9`7><SgJvKFy$Ikc>uoJd`~$9(MC2UZ|8mNT9F3BT|?k$Z98^(GzY zzpZw}D>2F(E!5W3R?1%8-kn0&BK9t}5w<0^e_D3!q-w|^(nuzBXudk$ub!)JyZfH& zi!;Po%K0VnWnynv3wL!-9iM}lTpO+A%=#Rud{Hyn^4f1Xjs*-4m=Q21V5wsT=tc^g zo$4)3-6L<8+FMhNKfX2IIi3V}g1d^Ro+s2}x_`OzdLC0<(bIQVhY3!qqLfkdz@7FI zd@HSeqCLCgwd0W^vm=N77!xio$?c>pplyYX{}Au}<jQ`#^SDpD(!<g;#uMW$rF-<7 zWF`(<|4EjdT1};;wb_`@kkx+ER?~JsyQP+8^36i|1(u|ZwUkOfswDAHHd5pCR1YLy zK1ZLek2cGaLE7!86Eq}A_u%%y0ZH-%T?@<<bT}}5;2%e*{e-$*>S_G++;hH-?-AEI zZe85#xRP<<|F-<S_;=vHeQ}|QbKUoSJI#smXt;ov*`plS18hOxf?|>cha3p$5war5 zn*h}wt^Sk4rB~FlWz_3<x4IuW3ni9Lm>Rz%zI;ND#2Dv0=55{58=93Y=Jv{&wNCa) z2w;aKnSwn@wt?oS3ViBVMb*F}HI>p;T4;{cQ+mI+QaRHlCQYoCxRQAqVXjzLT2CAA z0bg1p)_g9VRJv+sZU5{u9B1J^Ti__|_+fY1C)q35&Zzm7HquJ7y^&oHV$WZAB0c-v z{oQ4#-3aj1@!nyt-R3DWP3y?TrPof`PCN1jHce7Bq<XUFDfH0fDU*h}k`GH7pQLeM zG5ZAdEj3W>z5h8U#BKb&>c^gMX}(?mn)_SC_o_c@{0WY0pWt>D^Nuq5$fImE15X97 zNj5G;uh3PY&J<gcr%aX@GBUV+P=q73c0_7m6!JcIK8<hlZ}Fcyzm-25{^a<Z{9o3% zKk+r3Z{3T1UCgtxW^*}e1!W4}74kXhv}B`_{Y`oyq<rv?px1%j19ICZsSBm1##--E zcW3ALgd_27<8Q`&jcXtOBK~wj0q0p)56@Izh`B-fpj5PFbfgd16;LX0Uf^A>mgKg# zJBr&EY3G%<%ugv`%x3~mch41fDfcVaE0@z1<Zk2c<oVAVp&v7vP$j!t4p19uLu`uu zoV^rG$ax*L9PRB@ZA)z)TNvwHhI)snz!O0Yg8BrWcBHV^(G2;LB~y2q(zn9%z*WYX zGoesi<9|>7y8p)fljDme40L8C&k$&AHit@?6sLOCHj#>@oIy{6z6Z?<8WtEw<;_Bn z<u!6zs*Y{OHs5rrhQr;-U6q^}o%5W{UG>~MJR!cZ`YQts220U6>MCDpIqju6SLp)Y zIfgiX+u=pCRbduIA$5{61SI?}JaBFG621!FnVx2zVV)?D%{$!t%G=2I(YIM2Mm5Pq zCX$_&ZzwB?i=FBxu-Kj8>7`-0+rf;g7j&riCkGNoZQn64^#qs<-x3Rk;rBkJcJB~4 z@kXYUew5~u16-#VO0XJ868#^3<z(fMlAju-&e}dLFOz+aJEjF}3uqg#-(hzI*#~J` zm7+ZBA9I?K=qvBN1T*0Z=OX50^-5@w@HpXo;#X%m_ZrVPZ$*8Nk(AmeD!G*qv_Po+ zko}YWkNp=p+3NNgw!vCMs=-E(hdW{2gz3m;l-H;DoZgw<X5QA`#c*=Bgzu;=Q&m12 z7tQJLKYMtseo8Jd9s^FTVbuHWWgb~RZH=lh1u2qOin3y1EqYBPoZI+KM!GJz$5nJ> zMspafv3;n;DuEq6PX;9c8=ruE_>5H-Rqw;VC|eNC<;4Sgfo(j6Z?%^-T0!KtkPhQD z_%Wx6(VZYZC9tdAv1Nko_7q<5VSKsm{A)H9!R_%SYJq<BBR2U!t;c0KAO8A7#Z*$k zV*Z2JZY2CQckx?G${(=UHNf*`Qd^(g`bJ!O)I7+HhtnYDqrr~95w+EX0qQCBBVY6o zqc)5j$BplxjGe)vt`onPCz9TYCHzLrP#6o<gqnXb3s<l`gyU`J<9|!@R4qVEr*g-O z@eqU$u@YOnm%G10B>RNxKGyCeNQamsDr(JJ@LGAX(q4MC1%vEUqMCak8G^TY3(=gI zs4|}Z>xp<SllXoL9*~$mI~mOC5FULr9@%UBQPDY-2{f=MD<W8UTltwCdhrg!SgS~E z?^^u3^>|fth+QV)<qY-n^A5l(?#GUF$Ny=I_cI$CeG{amI9}^U7`|@c?>~Uy<p2>{ zL-N+Y@h(Q->6pClK|J$e#N74qu5|451laxa!}2eIk*Hwu+2H$+pi*rDIqm(hDu1L! zCkyde4gB5yJkNagdOLpIHJ<uC-cJJleM<bNB1G)9@u^ziS@p()9nPKh<-5N4vZG-- z7|zN~_4^ZIZBO7+MBzp3;tA*QWL=S&5_lyxvK-G@pMA*Gba1|Ypt!xkL|PJOb>O2b zXzqAFCM4u7n%de}d}q;jl@9-<6!KC7@3Si3mB6pdizkzn?wPdw^nV?_q612FyqChO z6%$I^afics|Jn4|FUL##9~1NeWcC=o<2L@ilAnzOvmC&VEC#8&54vR%&na>o(aHsU z%*jYpIPVk$Q_Mq7#Uy;Sf>u(rOAMaSQMw$C5)(u-3I07Eu8&wcDc)_U-&4y6s#Xz{ zsWDI22ML*qzqcB{?-<hb7VllcGs}j2)L>n^v7!Pwogs2K-1ShTwmT?EbL3i_s_I-d z_}Z9VXigN-nZM}7*Y?Pk@bbcW<`Vwid(ppUa8`dJzmJFj&L9;#iJq3@t4DGV6Il6S z_?;8kgQ>{uQm~m*#0pRO{oml%=~>w_oSU}1{vhsSB-c1%H8FKV@VK<+C+*nL`u^Q0 z#~CYyzh01!9DFX!eN^Emf^)i$Uyl2b;~M0bnTh!6CqdVQhy0uMy^ZD=$8VOP$LTMt zdz8Ce%=v1~+0Mxt+CZ!S5k*ME6QM+{g;~q?)MATS6a9FGF-XfaG{}6OVI?xPj%y>Y zA)>@pd<ez`F(v&CXtmc$@&9sMhxKaC>h)*ENB=(y_Eh#?aP<fTy9aCAn%`*66GreX z<<TX1*(cE_C^#lW|D2PYvgq{_{0OgzC}Oxo9`hxucn_T<dYjJi-sf0X@tt5?zD`7O z6U`u|8HwJ@B&>8!5TqjXI+bU|L?2pncC$5C3wBv(vwD1O$p1FvYa{kV@YmPjUv>PS z1*=d){;DRjQH!6{<6kXV?Qux;3gmkm`eiP<p(C$eko!0NonM!U6h&5HH0P~8QAY_7 zntWVE{Lx1^I88H7WG9fB?wrSA$je;TcP&z~lc@U`YkG#$DV|C6aNXp2AM;eAXUv7R z2qZ4b2o95jH7mrk74vJ3`aDAmo~Hx4pd-@L8X4+>e0O54+agP~keYn_RR&IkV08Fj z$KiK$&>PlE@M~Y=y~N61^W!EWvc1455^VJk{k$Fb&@6&Q>H~Kn`jV6Tv4Et+xao=2 za&YBALW?4w;u3rn1$aln-cg*Z6jyoHu{L+|zt448%|@(kW4{(|$z8VM`xe~)|8&J} zEa`K9Y<Cj;U>N&TocA)2idWp(ZtUhL)~_CG8-^~(&MKD&krD`417fzO$hcrIA49*+ zMDW3-$n7r9sX%`&_}BC~QYGd^d8ohpADc%O)~6u%S%$l;&wW-v7mDdjC0XUXJWW}C zR*>frlbiDJKY~lG98Xo=|D*+p+LNOnMQ^V}SC5#?EEr0jvUi_2A90+1A)5j%xZ;;r z!S8mE)3lpA+rzFu;9_n$HX(>u+D2SmnoF?ES4aD_;I0~RUsbr968vus)~>QY`p)D( zGorUwV<$@R+as|HTZxwsqJ=kNy{_YnWe1zNFWcd%%m~828FVI=-|53MSy<I3^k1wp z(=bIar*T7%0_pbY1<1x-=OC4!0(}BqQsG4LS+Mgz$%ri`+q;?1y?C9fVB6uuqGIa% zee_uXe7h6Cv5HdFCU&MUdsCR4X8``wFEc5pU^Y)GIKM}ti<g7q*+C(PgFx?MlG`}G z|HS#K&S_c)evzH7zFYK6HO9II5C?aJWjBUN>iu|?W5}eFZcyQY%qB~8f$J>KEFx<$ z6}$pJ>5T;yJXj6bw@jST{OoTH|EhLErmBD!wCB9^<rPM7UWTK!%Aie;QWKGyx`S$b zj0cHzN#Sr*2hqEBgxpC7D)iGS3*h_}3_qQ$PUd_nvF%2n{=^&Qsq7g}b!QYj*JH>D zZ8n}8LCn%<X!V!6%F~qPYHF=HJgpD4CE6EiWIBSs9|mi^2d3B^j_V#oA}z=VQ%gsk zX9>MM`9qb8=TPeYZy1lvpVnPz9eJyXAomB96>yIhATxJWy#x2@26C_I;N;yZuVJQ2 zN^2}@7DcvVvYtRiVk}i_LDVtk*JGGjT--FxAJqGNB|Gv;?!iQ~g=ByhtCQ5!Y7=FX z{0Hq_6BMcs`*sx+E|LoCT&#Z&tZ^3X!c+QB1q)PV)=Z-Fu)H#w`ptPvAFD@aQ&Q^e z%fJOXmE33!C01TVE_M&A-<nk@s~jMU+K$e_)1ZS5t<mJoB9V+rW>w<TE%beipi9Q< zF6?o7Ci$`(1F7o{hb1jDS}_t<;%Uld>MRD@Vu@*zlWFduOqPezZ5PipK$U(fJC$g! z{M{oHnUs@_%tUj#C0bL#a?{*yy^?;hdNYZ0AE|%n5{#r?PoZNl)L*Ssg&xHgaviCY z^#IRfG*6tHn)~^9%BhV7dQbWj+k!#-G47gUu;h#IW>VuJ_Gaq925OG7t7nOiUNR+M zJK4zoNV=W6&I`;@DFU}!O>p0b$iW4=$i7OURAnggd8~98tCL9HHNTP<9_*A{>p_^` zksXPX!<gk(kXd2>$^WQp_z#WTOpbu#wyqYe>eMTp1Q~ch^_h)HbVrSmdW7#4tmAd) zEa>T3>)Gy|qK`8FS<R*WXu(2Kc{wi=3XiFWwQ08HwqA53%pr%`m7eZS)@}B675CZ6 z=%5GtntRVvM;1g*XA5WTJ~^Dq=%2&V7WuK_Q}=1_w58NHtWsl?Cp?4TAnM0CJ4jvJ z4fr2>lOyfOO!r23!1b_ov0ztC$xvQlkK(QB;QD{5Mu^55-KL_TDd%k|2wzV;&rf*C z>8TgU!(X*wMu$n~<5zOUqT_J_+H?dRWDD`lZ^Ei~Q2q?}>{mH~uMhd$8GLOAt8^0o zvMYPilrA}&ybV7&3sK-}{M=0FgBV_^n)MV(UdPJ7T&}I4H@6ae`<a!!QYktNDq?Tm zTEorEMgzT&@2jT?jM<+(oxNjy`HX{j^cBpf#vwTIOE8IOzWP}^L~qP8ttGQQC1n?A zSpj)DJ*spx6CKZ^7I_7_U=@+|RKsIbqk88rEBea1P7h<Cs%ky7D%uCN1$6|`N-H{D zC(0GblVz8WBhmZdZ7xHE-HhDo5aS9}G3Sh7^a_@uLSm0ul=F}c54r(zu)&YHHz8NE zocv-|`3g4a9>}KxBefkZT#dE#ni;T$^wN+$@JVBkt^lk-FY<y#IkP8VDr_MO2G9*? z;5T^g|L_I&p?`y|c=Ufq@}cR;>1^Tq!)7k4sa#rXVQ*vC!SX_Fs%@(>h&?<ZXI9!s z$Ba=_23PQ0a_w`SaD8%praxq*Z!gS-59l{dVr`YPs1Ew1GB`p4PB?DaE7^jzYU+Mv zKU}Pl(ntDyG8q;1OH3y1<lgJP>M7*Qi56@CYw|^Noz+)rE?-r8X&>k^SYXe={3joI z`)brBXO^epBW$o%!uGD{=|B)~F&jDw?>XG8f|c8Zoy`OC+J@O%ZIrRf3HpnJ6{?fz zvl@$hw#92`O|<roxdJzhL1gkj8*|C#_Vjzh{m6`*#HKeTCx41gg>7(uPh|d52PF(0 za-1Gz9~H{GK??q&A4jlq<FKobuun~}<uOEk`G^O4<Eh^A$N3fUF$H5OQ%L2uYF=A0 z`&nB#+iuNN>nL-iP5kD4;+w2Y6RYXF?HTV*=8kh!bkB3o_jL4iHloNYexpZpt8|?j z#Hv)N4zfS7pQU4c8Z#aq(i`{_FD#wa-MnK|HX70Mk=#4pv&S>WyUBM^KZC|?M@_(5 zB8A~{TV<j;mw6V;Y&&d?Y)7?w=&>j|O#k4M&LB3(53B!dJ)<7ud+5ueyY&pL$wvH? zlGw^IpcH}B@$ZGfz7={kjnYM4jh}Ry^I9G@zWT(z8La)xDSQC;>3RB8nu0IHo4t`l zCsp5hh;AQCbznWOizS?*48bCHrEdHo{=gnsXZunGF&>Zi176!IVnZL=APqiVC=AxS zhzZXT86F0IDM^IVjVTq$wBxoBNW~>vw5^uy4Qm-m{p4EgSr;qRT%~9BMR}gP`?>$P z?$Gse-c!!!@#VnEmc=6GrhllX?4|d=mF+qB^m_XC9oivm;(IK_IC3_p!T<N0J&o4- zI$t}k@yrp+LM2FLV->!V&uGK6!k5g7Um%xbM%hX=Ov|E0tIffXULoDRsb>5{b~zDm zB+|N%MUu_C)X(f8yB=fMS);Dh#!o{J-!qFLt-9471Sut%`EYzJQO(z$^I4z!_{jN; zpaNtqewKl6cAx(6KV*Ii;{%r>gVBclp<)z$cMvox1-XYXxa4b*X-`S@S1A9=O|`=t zysz5iE-rz)EXSknOYB#k$)yVH3O-(IH1=j9-d;NVjE_`6y`{IlloE}PCUSgj$-%53 z!rI9G(ldvKa_VQPS<{T{NL(u_oMuxea1?~BCOcG&7&tBQ$qFo<$mWV#rC9vZ-((Pj z<R575`FIk|Kpg(y)!iok5H*TB{kbC%+lh?QZqA=LFE(P164;Hdyj}~u^de|GF>6%B z8l~|Z%Ya#ksY;*F`j7E7Ka%wlOlTtRv0w%fvxjoy#h1jxsmJe&NuMIB*EqTFiFVH7 zS?(dqod)JKjx)Q!AMNhs32x!ZOZ;vL;;sIE|22}G*bEZ0l~`~-k~)ZcYEJZ!3t!|1 zUeZ}&x-Fcey}YLI_fLX$N!)Ks&K`4J=(SEx=Dj3d`7=0%8_9*KTzg1%X#=mH4X%<X z&QTt`h<)TiH~VLSt|Winlex6TnWI|(ru|XmMib0bL_I5r81M3)zx~))8djz?(UoAw z6%~z{z{><<i$E>}Hex4Q$&3G6n4jck%_`zE*XA#J<M|B(F&jrDS)Z7!4!<F?art@b zyqv^P*6=ft;W=U!GBIeW-|Wf%*lXf=?bq08!It9YbX$CVNql*aRoKirM6s`8FCVcA zH#pHxxZ8*9(J%afH28;tg;<~h;pj}k$l8v3nZ(@)p6~Yf2Lc5Vk!4oysRZ{d81Rd* zPAOS!fhXQ(jrS3KZ$MTOnPBpa`nVG0q9@@I<N%ZX2hRHs?<*E5JiuO+!E;$b-ft_X zZUnUn_3#tB@;MK&P*P^(2Jvsf57C+X&&HY@BEGmG-K9d{K5|>sU%^w3Q{@D0tjt}w zi7G{2^A%5gnJ2u(GxzdmVJCy49A$Mf5GRJfyYtQ;X}>4qDJo0z5lM#gREhlkEi6Pd za{h~GKQ;d+_=N?}<x^zO!LycUr|Ph;g6+FD|0={9l;_<mvd1;~ELdmUtc9o`jAL*9 z$5<(tzXb1da%4bU3P?asRxumzFTn*9$4))wj4j6!_CSN=5uTX8c50D)mU-rivJp>L zC)=NwbDzoo%;Wg`M564W=2rN>@8h35gN2|ok%E)jH<|VO4Lf{#?mZb#cU=;!zqzP8 z&CBWc;K@6gs(K5wdOZG4C;XjdMCu|}D{#C@cpV0I<|Y+%JwO6;fTo<If~G1fBF<k; z){NRxIATI%Q73kbbJ&<?u{Z<sh#a4C`u7w6cfkf1VFF+-eB8O5V1cm*5}yaKcHO`n zdZ3YxQp*v;zHY>et<QQEMkk6)bZz7-4cy}bb#gMPD>JX3jfh!bSAzXjM3Wg<)#u3Z z9rpV*r+ko=4v*;v6BF;4Ok0FcVIo!eA!-@bj)(Y!PN-JYNo?h#ggjB2W%b2NbkW5* zm&u-=eOvXa<SQ4WH%Cxi<R;#mffSFCk0{O5wq#Kr&{r~#8ol;d$pXX+`LL5Q(qd~G zmGM)J;#{M!Czt36enNdxHMFoog}^SW3Kb#;(KJ<+%EV?@>2Pq$&6x|)LNSTDGs;zn z%+67jQVY)MQB<X5HZM}aIE{OlV63E~FTuQG)dhF{!FkF;tiK49JcOwdSFs2Kl-I=m zdpV_Pk<+8#+X8F0Tf5LuUaDK`QQJ`*?dP$EfL;G)$HW|m&2a4NVC-X%g!M$^UqF5z zGug<8mv<coiJ_)LGUYHejGhlm$)sMQ*S|VU@p1Acs>lvWJFGv(COuex;~VAkc|Um1 z`F`l#nB~@xtjr#yZW-OMU*+veQ+(`>+EwO*bi~)K!>Z-v`I8gl-2|cNV3vjHqYpK? zEvamK2KU4RIBS|P-=QD6WQjCSZb^paAbFL>Ou8uuPsus7Ng8?!g5-f%z8JF$5n>qn zB8wSLgx3fAJrX_A7i&Bn9a|fVu!)!?p19=?x<~S_T?~Er5oq~HbTip5q$`ede;aF4 z0&D((8t+tC<6~&?98_FHQoXXlFQwO{l2qEnvSVlXdjoCx3H!91dbp)v=02j_uk;!g zGTs?|%>mLW<%HIduBFY|X>~8&^){xe^_9Eh54~YR*DHO8w>1-LYtxOI;CTltN_(<d z#p$W=80D-FQfhUh*2{Low#wGec3Rt@=2R}g0;1B1{EEmTh51Oo>MQCy=3VdgcwhQ* zvTMcYifMwKnr7{0<v-8`U6rZ0W3`>?D&-RIJP41$Cf7t-pHUGu%!tx+G9&0X^VRwi zRehwhraG23fHjGdD)L?(@s?Ke7pJj?tNFj_phYdw{a-o7lkoxnF`sWfII&=A^B`T1 zL4vQMJ@b-Ncu(HRg_iz?yuBlCoyN6@8dC*NYAx0z8VNlQ6VeAJX{TmFP+@C_S=zd2 zZlG(bl=4!mWAEcQY-?*<LG|-Ab%%T%4uTd^n01c0;=3oKJKA}jzLkugQJ(qUP<?^1 zpWIpp>y$JcMvM&h$&Oi$Cw8}Oq^&b?$y%hfCcZ$R)!ay?H}TemQ|6W@m3O}PE&)R? zkOZB+8o0ihu$D{fY)gO>Bd4u{b_Mo>9P&?gxG6O&d(4$a9s1VW(fJhXE24Yp#!G9} zBXf02a!{kzSxL#Xm$Ir06sCgGT^=PZCF?gEW|&pvC&i40d-Rl!Bmb9Z?y(w^83+b( z`US@7l$evmZ035@^!H(X{sW_b41S&rw7w=bO>pKvMhC70tImUE|Acm(h@V*0T1s?( z#SFybJRmKU_bHjRdG-PU69SUZgZM!kt-VsW%O&aC{$b`eet9c;O1c&#{!H*B9(BEP zZ-#H>i!aeQ0VmLUxtv-JzKNp&8w0}v7dUR)ZfObX5#<H_<~ht_MsmHO_nZ5MD}!r- z>xFx)w;#QT(Z*OStvp{Dt)|e**hbRr-@_5+2(%B;YN~~lT=Gh*jakna$b7%#zG2>5 zp39zY-ub>KdW`YLyk)(oUptR_R<&t8wOB2^?G%hBvC2w$JyTPDm@aa=oAq$rt{2qP zgTdY6-L{)ctbxQjwdK=vKJ-_H6Z?(AFK(p7W7QUdR!$^?lAm~6H-}P<x{iF*Vl3KB zY<XJz%W2dA1>@bFl<a8Re$qB<ToI~|%76s*QNq<FwtMtq?sp8ZP0>22;c8>0gd|%f z%tnR|8g|z8I&o=2fyC;rJe~>O!pth#Y;3VIf_kh_BWyqI4Fb9a)(^bvIA^<|?p5B( zho!e>7h{NC+V|db#BFmoW6s?j_hRpKJsFzGZMBpWl-ycrTMg#Lb#ct6WBm>M08N!e zbeqRgGt&^}rWkK}Z;a=gC(ygp`-<qjI1>hEz@m~#4b~oLRcw*A8n#edIjx79Tv;a7 zw46pkRxP#Ol#ZT^zPi2_zDT{F(T+%OJ%8t-vu%&^9?m97z0cZ(DAT~6TEqSmYAwT$ zoruK@C7ag_`+c8$d^ou9SoCIVbp90P1r(Hf;Kwe;GM^%{ZfRXIYg_Tsclos%Z7&m; zD{zaWpgoCgj#^oLC10Sw=DwN12=W$lcXYmt&l<loL2|{oZ+MUSmh0oquhJFymGVn_ zW{(K?9+)Ia>!5&uEw<X~B=~mbSUrp<Oock@$>Of$D(~!@Xm>Vr2m8htn*sLE$=Rs+ zxnWylukVlpng%QnFdWxxP1L`V!@9%#lhS&O_o-(f>?j#LZ9FgO6wam3HMdIrl#}Wy zt*Gsgtv0+cuWglW3$*R(JXnD~nyRti_s=V?<=$uBq`nir?)m_uvKfZ`m?FQ27w8eQ ztxZLjiz}D0oOy^4LO@fG<9D2(r!Ol}!8vn0*~V}(q5ts61M%|epcneehd9+De_W3$ zf?)nCHU3&vs(uY=DiL>}w#qRrFl%4|`){<|P-Qs$beF*YQtLgu%{<B6_Y!l)Pmjx< zSl8XdR}&PqoK;8;RW&Wl*2$jHG1>7opit0^z%}+%YD#GZRxqzI*!RaXi>j>&?t$*4 z^psb2H}m!}x=VAJ)Av~orfWWzqm096f5$3hwg=eqsx_rMhC~169S57<R!;>Ow{m(f zdY9r0-Pb3W<>Z^{IM!^sy%p2_^4Y^}IkYRveNer_)(Z27p3yf3eD0%Xo3}mHD>kDv zRmBSW%PB3BYoZaa(zjBbx|diYtF+*9slg~ufNA81+ipKOh3?D~Ttpw_N1}lT<O`-@ zJ7S19GLxUa2d?;szdMHgX~ueP1bsXMzeq5(^I2`l1D*$_4Sc}LC8{%(cJf3kkFm>_ z=uPwtb*FZPC1#EP99J)Kn_Kc-(2IduMah3uOIu|dU@zpj<G2veCa`2cBU>4TJfE>s zUkxA1I(IsE2BtC&aj$pprt)ZxZ?V}>UZQ@{#xrv>)Dh>%5)kRQ3X@7<TNu0&&#YVe zEbm}s?TLGr`;j|~=ewuA@1g$H_+@TqhPz}-?QqlKUDdJOzR|XX`nrDdYrL|%#%=wk zZ?rekQ_iD%;=Sj6$-zE0SR3hq4*>~m4YCzZFXLSG4pC`Fu<T>x5;_qNC8ZNI4?fB) zWNjI?w<J;}st_`gTbfCY^Z_vK>Y$6wvAaFN9YzpqjlrY-f*j{kYJ-rUL(j#+NR%|N zxx=YtP`{EvXbFj_;!W#m>mKEL;k=ZXKEaINl(^eH##h%&BXwhP{3)i<Pq+WG%Tyiy zvDbDCum@_H<Z31}YdLL}J06tL?%v>D=-J>c>$~d<GwxX9l?&Qbdk-epA97r$R!gzR zz^fIa6y^+MGQaw=dtbWCx<|PM4@PhAdta2%)_Nf2fH!HD_QRH7AAy{<vj^LrsvQ-t zRNFcRQ{gOT#a;9+@z$q;sGDyivm#3{cegqm7Q^rnuQ0W<m!iT|bBOwz#mrS{!)lM9 zZ?!8uK=;knM5G<SmY?JAewJFXV!J?lYk{AOe#Q30wPDn6ye4Y%a)MK!{btLjl_9E2 zErB1`#Ss-aB&cwpVZW(;S9VIZtX+DLH-|ggRoV5}Il);k(G#B|VTE(8XOlk6swBTv zEX}lEa9nfDbG)#pvX_O^Bh0p2iM1Z;UA-whmE3J$!2004<B~jUyjhq7SJXI)W^AHH z*@id*0?G$0Lci5?e70rQzRN?YTRLH;HHP~%?;3X&7+-RG?t8v_*XYemFc@&~DOv<o za0ekGe`Eh+yF~rfOSvO;b!ClbzIWa=Od9+GL&Q2?6%e8~#z}J@)my2Nw=T*TI#HIR z-6n#Z|DmpF5D3F_P>&YWC&<=4>YMA}jZ6nEsU%xS*8p;i4T;qzamugJryM4a!N*R) z9rlF5E~}hH=|LCr60Lx?!PefP1}+Lb6_C+!Q){a>k?9lCPkVm5J~=-*e>zt<uOzC8 znG)AI13Zzwr^aY&vmC7Du}^dSKyI4YBW=yV5XWihRZBW#zSgJvDtjNn`Bcrd-F4dC z28NCQuyD=H&FIDNWD>I5{@NbG`_l%#sOh$OY8vGec;R{Tg0Tz6(B0mB-iO`=-Ywqj zJ{dGS%!-xLz$KUn_WDE1V|&g#)xPQt5Vm>P?|oKR7-zQWHS|z;2D<7`^od4<nF37z z7<m+ni0+t_hA4axd7`oO5{2O>hZD6vBWegD?>_`@c^I`hUBEap5M=~|2}Iy`bj9Y@ zC2sxWpOcjqOL0jWkM~$k^{VZ(E$Eu9_V11+0cipf?2l}vw42HY>5{odKkwb|`3xGL z*FDK~)Y->*#Tki5;qdnHz1Ppcdel=nt#;SOGbMGj7Nxx>KNO@@Ql}_q<(FXJ%gkOz z8zP2vbnU;R!?g&Vb6Ln{3_xFx#Q(i2t);7aD=6c0<t%4u8FA_{Ij4M_JFW~maS;T* zAkyGA9iWXFsoXA2E@MC5{wE>;!N@G84hSA>6<@0q&p3#DR8MfYyhKSMyh1EUh?w5~ zg9?UwejF+qv?H4H7Kf*s4Magy#CO4VjKuF9O^h&{6WAYoKve&TDx8A6ax(Olo7WIC z1}s*vI`6U{Ef>Mu_0#0+eiEPlWq#*&b|nIoQ<Z;E2e+2jY{{C7i7@xTrUrxB<_2Yb z1#-6<<Y^dljXGhCDud`1Bx(*P3U5aYIg+2AV>03|=KcKi&-cknH*{^Rd|$Nh8GLaQ zO_7FYEC*iJ7sPG`apF#})EmSTqVnzz-`(<8%|FNgd`s7in4`Jb-}5jE-8_QR)Dsj$ zOeo6Bxl=(vMg4v>c-Jb>n6bo`9l-D_<Kq`23aLo9U2}hr-69auXb?ORyQT#vsZIq) ze=_Kz?xY=iCMM+w)KJV9D#O345li%^V&**P*?aO&*<poQ2{%Ror5jyGL%BwS`xnQX zJ`Ofgi5`iU#J+i%D%^_w{z~4drJ2tBVq7B&{urz&ieAHs^w_R8cEKcbm-sU^wRnrD za6Cn|*fqLo|C%A>4a?wBjsti7KvhK;(PK4`v+>{%H?i}-@reYg-d65J&Z{QxTAr&Q z__$2gAs)N+go=U<oT7o~=PKNdm{b&i4=Q-3AA#kHHJZ$Bv;uvt1@>N<6)Hi0UUn{F zDJzrxXzs5~izI&920nD0IR6bYE7+q8Qd3f!73+ztjYgkE5~D67GCPVlve%DFeWhB? z24<g`UXf-nab6_?F9@qfQS!ps@S(pjt8X6IW<@ZZKS*LL(A~8>aR}4hyW<&tXa3%Q z%%NLB2W}f`JnQkf8%X^Uva_Fz?4TDjuuTWZ)4nxrM0735Tpi)8qz6kA^>TBtRr|m% zUQ+epBF+@|QGu%{-=zctao~$Gc$e%xC6MIBVyQXXgO@&o^VgmoF9})~#67*mtKSAL zHx}9NgG9AuRqC-`rFqXhWE`?mk5-V(n~<(9<Q=BsUu+^{cZI)90C_6_Lezw_I0%Uy z&q~cDW4wy0!<9&TG#wCLavZtY!C}~57d#~W$?lCLJ{zg@RI1S1c?VhR%Dp>T*J@Y_ zc+M;r`J=XGM)MbVQ#7@&Tft8H(CyiWx|fNdNbAX0J!2MIesb#(ARFE3b31CjW}Ql~ z<J-_D+1b4=?40QBdCvMIp&ug`-JOl_(i>10QvzQ-H!)vPEL#q~%fqTAW2L^bO8=2B zn8oR<?$-;V+h-s71~_Z+O>-gfqBA8O@|%x*b!qU}G9aSW$a{&}u`c8W2NI2s<vHfE zQoA{ag3&-s7psa44CCaiMiZ>(tiPe-C?j_eL8s+Za3c%cZyNo5o0Xl^kL&;gY>zaV z@>5oB6#3tKp#BE9erHPp6>m)k#b?%M4~S%6<fnqs)W1SwKo<{ES)o$bP!ZfK0)5q= zKDJGqzE37xBUJ64XYahQ6jbNjFCkiaf}RXRQk%hF+nxMmL;or@Cr@7=`&FArMV!5~ ztj{lW)m{E#BUL?vuw_-r_k2MX)*%_4ScCG^d?oXDK{@Cj6ITcwcUg(2MWt;skmBCR z*?6RA4kvVvKX3DzoP}WLPm5lvj7IOksoseWFr*B0;Wne5;JKVtnM#)K4*vaHuG_?` zqm^1zhJ2wzatix-ll{sdT>u#m1}&XHt#24&|DAr&wa83=Fxwui(s=OOLujNx>Vh*- z9h}iD2_oKwPQO*;Y~#p;_2;e*koRyQ+2uL?b2#r}_G1<@eT|Uf2v(#y`_%^KogQE^ zz2$afSWD9T=;Rze$6_DEkDQC`5t=qFS>!utmZc!5{m?^Ik(FXr0c0mD5|ja3nG=na zn;NVltXw&Nl-LyB^g&dsu4irTvQIATNKQ_MsP7iFR0pvgPUJa1(ma%&)OczgW+N@f z=or2Q=DU-#RTq5DhumynKNYgxjX~jdv-$=s)xEK0xxjK?BPH{|q^I)Hk5dIw2FmDz z-yyY`6U<c9mUX~KUW^8cGYjFtt-!x|fSt~WO#;J03f_=k&c!JTM?aTg7pfyG4Uih~ z(H!kvlI%eU@!D6qhp%xGx1fJSHAw{cyb~=g=Jn0xytG8)R7Bt8qKhsRi4m2=X~Ar= zB2Bqiu`;j))F=Pn6UkYH7Q6uJB`RBO;QnG>XcJauF6Z_E@1){yRYUV$f)}|r6QTFR zGIWOuj@`-}JlY5)h4PE){75AF4*DUdbQgI{N7czvx@5~E7eX&D1zR6ZjX_tss24H` z^8)#kV9r~5RxTT-ssVAsG%~0EJ5R$wlXi1QDjKyJI&cG){U2H{56@qoPRsI~p?V-u zEm)P7$WC3>DkmHX@krJqBxXDMawa-m*s%<(%L_7-+o)2VL=|OYYEmnrcd~M&=RUKd zlMAyRWssJ-NK_N_bq}O=Jk`~rQt=wusW_@YQ}ass@R~&Z&PlYef|l!pv^eD^bky%4 zB6<Yk6T_tJ&G4|dQ}QT^a-M8Y7C9Ono`(o&GVk*n=FW-e*Ysv0^#QAlx#;1s)Va*% z9POm)<rQprKMkEsMtXQ}YLX3_gWvSUOv8TmAr{>aKAD_zFc5oi3Y%?mqKl$uDsX0+ zb8>o6rPv+q--UIlhP}^*#rnhD-bc2!pe4uP6W7H{6jL4^@N|3pwWU3=={4|pa)UG{ z<-7;eMUjH<({iG6VFAjsGGbMRfgfxm>v11XG!B0(4cWN=burJy);#2HDv<F%L$0GJ zH7C<R47V^pd^vJ5f{a9I>Ls3|dm3R$qp@$PKwg)yA1SOCSf>GKm_U4<2k4Wn=-`ud zmEXi}|2CY=UAE&7<-l94jsLhD8-CApo9U6`7T_C)coM@Z$}2A6EZ>Af!baXdH>alo zYtr5yH4I{9T5y(1;im@S@%%*Rp5?cf<BhcD8FJuH|K$W+=joQCE5=~ABY5t@*y}Xt z+w^>-;v*9_su=dP0d{EsDCj!Q&PDvfpPXVb+b1(tN%(&akiMm0@$mYiRk~C4c9Xif ztV$uJ5_uVMmE-#$<qaO-O!g{Nz6u^wk-NBpx7&<&`b2Nh5*YBSnZ?k&DbOJq_?poy z#8ry=!5a9@P05XqKtgt4iSGHQQIupwrjdQV#QvnikLZov-A=~uBj?ACG!$k9s<JB0 zIX^YfF~!g)No6s4_YI!UVZ7z(__cM>)FM;*nVmjEhIuj8w?EpV3Z8L(bZt5$BaAC2 znztCMR1ICy341jQU2+Kf{1%^2V}G+C_eEKcM(A2m`z-iemZG)pquE387+Mntufg7& zp^NhtJl7&uw}%<xgE-Nd$zY%56xTzu{X|k{@%{zLD||zH?!@|zNALE+4)@`V^h7EK z({Db3tk694>qaExDswvC(~*)HkD?xTzksvzfINLh?xz(|^&)ovvj0xJ{;G_0oaZod zz3K7w0(kFlL=X?TgMC=$d7Sz-tY&fU#Udh#A@_0^{jdOUyB8;;5zk){4N@N8r2?x| zn;mS&c^$)f`JZR^+8?>40rx1*F4reQ>Plyhs9G1X*BDlP1@(NVrB_4?Y4J>IA+25f zXIXr1&u&%0J|&@!`5Y_Q6)8(XJ`BceD#P2b{@Ll!`9v1>G`X35eC#!&&>NS?C10h# z>4Eu_$SRg>NFdUjhkI>IPG|^nz7CuC7_T#w{Bm9HXDoFcD?z!A6T95P`o71@{lad2 z1*>?9CwGP1)Lwk81xRaue{@}jjD8^X2w$;2=h^+8tjiqMWgsilp0#Pk)d36Ki)elV zKUqNq_-WSfiND6*qTfo?1QcaeYJ;V9BL*HpG(Ve5OgUfVj}q3RyZ%G#9$|&<qT`=) zH=p=?7rStqJKDhg48dj<^hf^Bh<LZ+DUQd#F2#w}m?ZL=u6xmWA4er{DzsY?)*%a$ zoF5OOy+3AIj8`F;66m4hJikYyi0pS2>M{m%N1|eS2KOU6A@=(#VAkWw3`gfQ;jD;W zqT<BWsX!RSG}Y%=jpJCbDB_>%=vYxrBP_F+HX~-=xInwb1fdW3MX&L#-y<C%=%8f8 zNa1*ZrICyA{xud%PomaFaOK3{E2hS;4+a@>vpXBHax=Jx20XVHnLLPv>4J3=F<Cj7 zG3pSJRYMx9BLBTu`+0s{CFYmj;Lh&w-lBi~3wQ7qeg4B=n{oqbc+c4tGpj`JgP5M4 z4)3BK>${!x-^snq!k+bHRfc0<OQP{K=`xbk9DVQ&9VC;RP2}r)*4$|Zqc7{BKcab^ z0G=>|U(Qysg2#|_H_vp4xV-~UTpYRHM|N%~S|M0|Dc7O*a=V;Uc}1Kt2MuwaY)w)8 z(SMx&ZPeEdqz*XFxQy2o2V+Znvm^fC7&tA&PI;v@e%^|5_y=`3*D>s58tDlqB?Gnp z?de~uO65j*_-BiuOGnaY)s9_q!jv?ZZ0rW!Zz~?nb25!ie7-i=a0BTZi#L4|-=;B^ z@(tC^hta+3%;ZE51KH&?oa!y$cJ=Vts!<s`j5|n$onul7s82C!tQ+G6rZPVmZ>ebg zN9Mf~91r2>>SXvh+tALF(0z~O$M7*G!216YZ8!{VEm#_-;Z=P_D(9nPBhfMGs5nRp zrcwpXvxt)vh@6(iKMq9t+T-i*VjV{iag4(11<7mKwV^~6#n`R=SgoekL;Ule<VSmA zOLaO}!+90KVIU#Lb3g%1s(nJ}1Nek4XpUaU16F$-1YkX9r7FHaLGGbHvG*>{i>L+> zy*&HzI~Q}ZA0qQN`JdVRUVqO2Nc46q{LEfNDxJ9d?r6>P#3xtaKhMRPuZdJ0!I!<x zwU3n;gtRq4#;(C!^BaV02^=+L)CKBC>NkSOcP*55vZM3Or1+2p;P<XWMae3-mfz`R z;2`^JKBqdcr8H9MOSNiY@~XOgQR%BLSEk}6MM!IT_qApf<ETDMuMZAfm2QJQbS_xN zGjoEKne&{1%GRCmQ@2nrG8bep-b+m?ox|jE(n_8r5j*o4=Bv8+X|<_o916eJX)@|z z@HGUJ_x~l=P&VQP?#8<R10#DYFT=jpm!?}cSo56bRKuqqrQ^h<x2B3{5fMUHvj8~R zLgJ5t)YDdB_Q_T-k1WXjae6an;1?8T?+37cKRHuFu=E$ritNNh&h7`QOwLhtvkG}V zNyIxEzQ(1pn;y?d*Z^Zd7*s1a61UIjg+En?I`t2F7}jBf)m46}wzLIM&Ar9;PIEJZ zX^46eAHIehCUt{%yoav=GY>9$!n{4ax^KSzO7|M$@dg@8333Z{s`lKr-Co#U9K8IZ zBDgerNdv5C&SM-*sirrx_qHdWx4Q2L-2->bzTk(8@Pp>ddGG|&(tB}84OO2a*Gpl& z9)jI=&}l4Km(CDrpQbu=j5z|<gG+K%BKD<z-liXltX>D{XiYy)ZMiEG0?tx#)se_+ z9RAR9B8@9%TF&rLSZUix`H|l1#Fee6mO2AEun?&l#|cS={>VXeca42bM`g@bto$61 z%2i-#%cw|g1$rH)yL~0~SZ4Ta!BUJ6Cqt@9oH`O;WiorRQL(9=mD}<^>MHDDw4=@8 z;B!UIkKih$Or5;&USl6C+(@beIts@#EIM<!kA>Lxvv?c}uy<Lln&v5LjjkFRvGNnM zC3{tz^H~c!I9uv2d*xZozgYuU(rjwnGs<WEU3kK`%tyb`BfP>T$kInM1sc5x@yQu{ z@gyJ_g|SBGu-I$lK=~W*DEK{FOZnubJpUzX$rr;T(OC=8N~kuX*@E&J^!r3}HWN3} zm}faX74<OR2__y@pr)t?RVGWNGIB~}xvmnRXq<*<I1mp}IZ%+v22uE4`;A|4lOER7 zQ-vkdeKQmWv9l%-wzLZU`HehSXC)I8$UbA$virTjPiTQ<<}(nMU2toy;0(Pr=hAU; z7Eio0Hsu!Ycuy`ywO0=1I(1X|<)a{xvB<iZj_jr0Du~LJ1N50JB%9d@U-tu<x%Bu# z??F5)av~kbFID!}&a?m}_DTKOg$inWx*kr`w=<A=9f!4R>K|s#q-O^wS!ImozHi<n zzD>S)I$XKFTE54=Vz3lUl|ISQawVpJdDUpOCN)9(u=E?zQJJL7)*7QAY>qbLFWhj? z^}g^wmt%cn(7|`%xL79-p!<Ij{Tdl$;hhM1JqYSO1Ru;t?@4tkE^DASy0CLk(W_k~ zbOiEMnh5p~evRPQ>?B{nx(8DW{*`AN!s+^HmH_KnN<MN8zUCr){0w+aTS44i_>I5O zT^1cDF7&TKhM+6jsy{W9*R8SAW_cl<FfVMX<CX2EHqbuWK8qP;5$bg5jj@Vow2`l^ zC&ts%J>E6ja~PJ=nZ9pSj-0o0Dk-$)>PYpLwvDcX(b^NWwET!w4>GsG<tgi<y+yn& ze4l(zeQWjQMj!K;bx*EBU)2t^nVLauphl|a(B7%#*{n)mY8->iCwepfvH}QXRrq;b zW(|C$8N>oUYE8C)WwxTiE|$}_5=)el=b44w+zr0{ggUVs-~<Z%295d4Y*@a@cvU~F zN%*K5aZNY$OM9w{8(?#r6N#;4t>Vxlr-&29M5YH;N9m@VLJhSwV}{S5fF1$21B`&> zj#TzAt+c$+oMoKWqnO}R-xZgbJ@IGadDk`fBhOObT%))3UH-0K)S|Vzwzal}REdSy zI;pMY#}-eF?HR;$kB08Y?ggIW-dw&KdO9OBy;mLN9ZIyiQY&wpX*+C-vmLh`)9R|# zl~S_XvhY3984s8%GRn8hcgt56R)THDeE#YN)gvjCxpZvBFdN|!+>{^ak*Xn|Bl7To zuuU=28Ao8@PNv8D0`)0+T_Xol@xz)c<-l8tCtvTB1L?2(05Z{%9-*OlalP>ftMjqR z)QF$564xHa<BNjhhYBERf;@yA)Os~RQypsqvIZRwdLI}Oa2KAMUbfE)^Wn_PzGY0X zx$XY#+>~e~{7tCg?CoyhUE%9u3}xz6xOzn^XCrsags=z93Cpd`Qff+L%q+$W-)5!< z#k$M8H@m%_Ouj_lO}(d4#2jg5mFLlg(E`>9r#8~I&sNvAQroC*QciMSI!RN(Vpkjc z^h$IFhUpIGU&QN&j7jK;2uVdBHiLP-wc1k6r5+|futL6!FJ0d1Y|f)^@Hfnb+w{Hq z2N-aAg4o{1`uv2;I6IQ@SpFfOL#NaxQ}teYjGoAfuO3ajGTM(UA7EWV@w*RmVn6V4 zA6>eKzRwKA>Dk~vy`}}*Cpf|ast0rpI0x6rL0f;Oyckwv)1^Q6UBT-8bN_I4boF!X zb=837xwZEe(|#&ZNpTQP)iWThFO;9kDf%Dn$^>~A`nt8%j42`Q^b1TCXn_WDu(O}^ zc~mGQnhU7y+auMbUvZ7nR{cR<yafFf_tic~L=(8p1LY1>t4#tah{T^gLq+ESaM%pk zuo-BWjKmtxh$>XP2f-Q9iwS>Sv47u)y!IgxZ8*h!iONP%vwZ{&bcq-+HRx(3w20`Z zy+i!B4_g)KkJtsX?kf<-H>}7({(m95JRf#UR0xYn>w;seDzV!Nus0V~ObJ-YIxwGP zrgyKDW?}LF(IGh*E7%8loJ-UdLmf|b@Qipo_{AWD<3UUJfxZ7S;te};UeGL!ZLf>Y zoN1mwYX%alRp6dSa}6b)6i9?%xGK%pYQ#Dn!Ql7eql)f_P%LRj?r|pw*#+>RJLu(D zvO2dxo_DgZJNdeeEcyzrNWA(%Se`m~?{(0o#dxCR?94a(+S8yJ<MF%Nvsx|LtESl6 z27K27k6-XJj|O{MM?`mvh)!4^ufGdl<hjKBR>27{fU6s}sGh&dzdTk@a4xhU&K|`5 z?Ezgir7A=lH|4bOiXUWRWM--w!_|svK`N;4Df5*EpsN?boP*_c<W5cyOTD9JIgNP+ z9JR8M0dM8Ceo^1AZ{*s>jF^-93;j17_f@dP>x_%=xZBO_^iTB0!?|Xvoc-CvrZy~D zU(m9n$asR35+tS#zT--=A{XV`Ff+ywf4$_Z`1}zs_8IZlMt-9{Xwgqrbsp<0`cD2J zO)FW8QXtHKz+29fk=zM`-4P`41fTa}ss96kcn0%A60oA$V2ERgLst_oT=VZ$X4bqN zv8BL;))49L09`mvG;ou6_XVf$D>1Jd-#7!=g4Xz88>z)s@Q-`b5gem96-D(BB|Id@ zGX!1m3zo^|bV8mc3i?IFo7Or+p7bAhb3@kZyZ%r=4g2y!CJIf^$K$!Iry}>3{+H~0 z3z$9kQ%h`M$y?)3KE(HH23GOL%FWqX4-(`d_AbJ!52sISJD$N!cvGIsZ}_-Jq;>}G z#FKnJg%7`kxUDg9x+GuYnFfLehLJ^m2f8qm_`DL)o0lH0EBN8ti657OSIwhqb_zJ& z3RdqDKhv>U5uDO_#8Fp>(sg9ID7huU$1sXhxd|CQ;+O6#NcI1iXP&WE5(v47`Zj>o ze<FKYoGkNfW&l1@;#es!wfR@^!0UocAI85($~tvKcW&Thy~H;Oq873}Q^%g`|LGf8 zr8#i@uExJPq({S>lfXQ_(&T)WBUN!^Q(J=9?}5kAj_w@{_K-l&Z6EII9lKSO9MfR3 zNUNxlx=g?7EAHkqwcM}h%D>1=#LZ~&d308FM;GS<jTKeP)47-Y;GZJ*wHd#=A=!)M z@Fl*bn&=`~mMA1jd_INszhuVHDeJ-GF9>ek8C-e+KG6Z<N}=-vYjy-@dL-WODlWky zbBOp|FzN|by29Y(Q`y7Ic!t@Ows_iasJhPrXH;=DE47DDkftWoHboJ|r<aeT8D4`e zNY-LHhVRoUncMiO-_%dQ|GYt8#R{#}cj=e)N7U5^8AZrBFJy&&(i>6+-+q=qi>h)$ zhM{NO^xIA#I(tASE(~0_9cafK{GJoY&~w)4HBuGL#K^U*&SYvqJA(q&;dCaKe-k;Z z!J0Q=jqJ=-j>Z#?#Fws0PDiGS^#Q2p3HD<jr|uZ*b(7O5Fu%X7QVR5KWu&=3`f4q4 z`c?Fm6TB&(A93r=%C7}6IKuiogi$;VdoluDa1sn6C;gtslpj>VRzNF7Fasq$>k~~r ztfcZ+K1QA)P(DOG#$7aXBJ(23&@CKE<}^1^bpkf{5wqJaa>72KlMI-^tB^NbOI5>n zqJ{MI7Pm+41(q+fK0`swbbOKlJm*cUNEkSEXJmOX>v4y9zfStbKeI~LxwD-_xg+uR zYNHkMBFDeL0e2BO_2G$f;`<3JC)kU|pt&nyIRfxK1vBY2PTdW>$yXqOzd)x{ev$$l zFh6)k1kW&>6<W<-UIfehN^NB_e|=3O&hP~CY=_WCsky68AT_I)fs;Vh<w_<wC0Fw? zAtpcF8#a2x=PTh%iMfV^w*jx+gMNF1r<x0P>2^eiM~q3J2VLP1uTB3(W+NLN&pG*= z%_u>(dAe~HjqO0c7lD0i5HXJ6O8tg4@4&wO#Up5g#X3xcpdguf$%8dxuU6sfT|}CX zbK15eJ2S~kwE%@GMTD1$T+1hRb_<Bg03<md7|}lvzw12ZN}`GuNKhX1qzPj8jShh? zd=(g}%*qI)xR@W!ZV75L6nR^T)E%YwM{sK<BF!?^vMd&@7nsvQ|H&@^a@~bKm%T_& zxUzwhWn(gNu$oj2P#=*Gst?QVEqb^I)8qM;RZS&bBe#&lx=j8rIj8Heu^T<SmRgs= zT>a5EJz-2}4cfPg%#h~Kz&FR5%?1NJj%9g*t}IIwcpIBm7P~r+zMYrge=2LAk*ru3 z&d~~bVmBet%hB8u*p&+8h6J;&Dkt*0$H51tpjRV6qipm_y#~*^geNFE0NSI4%7Lvr zi1YtaOCHC%F#L;Jy%4Gva*`b?i%n~d{)<G59>9;f2!8q*MAxEDC<mCPn7J?s9drN* z{Y*5P2dP~TD|0Pn2A<$GH1i8|@@{aBx<ty~*~N9-VQM1t_Q>%bybUK-p)r}#KX5F^ zkTcv*E_EuI)Zt{`yYY1)GW7**Q;ZyHAFz~p<kC(d>96qitKi@L$K9mGb`0cv?8YCu zg(v5f(s6P+pnb-%A``J`y^-n&@`YJITa%G9^djpw(B=YHuLr)I1i$SQ`+keHIl$UX zN1L?9^D4&Pr9)EE;)kXIT}=ZDoP`xDjAvGh-{{A0t^}8f_T$Q;OEM*XgXrt4ix1fq zKWIAVUCgvd30Awz&)qFDhl|M@u4Yw6!?96HNw38DPgHaKfD3r2NtiIw5&ToIO*EzA zAhVf-?yIl(zb9Fr9oYM=oTS@m;Sf$z12ROT$qcPQKSrS!<IJ4+ax>Vizu<P^NX>Ze zVIRKjYa}NPmb)IvQ5V)ktV&b=Ny>-BB&GI8%vgAiE<QqDq8Bl09_}T9mAS$?@8L;j zaZWmdyccI3Qh-$?=Oci%34^<*1Zz?OUscp>48yi>L*v~ccGE$C^HYyqjg!<I{Guo5 ze@Aee?)av&@QaSoiI#zk*fh@fTV%&42VtE&V2zLHRuq0&6YxnFwLt?xSzeL9Y)P*2 zBj;ld*FrGL8mvMDIm0Y;E#<(s&dk62;9FO~Gi=4z=A6DU_#<w!7WrTgeHvxJV5gz; zhVYbYL1sTmnc**AiNtioYV}7_WRT@-bcYq>e`c^!8K~E|3SL|aNf8XuGg*l~JnctT zzAv>$`OIM6y)-(10<xKrTys9O%3{_a)+)jd978UXBZE0*om}M|o_r8KYI!tz6>y;@ zXub&Yb_H1P6s&p;R%!sK$y=qe=CBnaDj#4o@txNy>!ctv)Tjje!e>1{b<Cf<<GuTt z#vA1Gf>QJ|e!+v0lW72Jv^VM=Y8l28LB7MXCUWLw<~vgb#Pq`4bVZ~F-&tg=qvAC| zYOZud%lBd8ybq6fs1l+6qPs3V`;bhI29eroEW)cSZ)C-rdjq0A3ypLV8LNN<gp)xD z2BBSxMi#ZZ$I%)G@iNnzb;wE0#3pw`o4f$G4ndRcqjqnTR35&HVoD7r$#jzops%_k zhl9ugmO~Euv+7l-CrD#`F>PefFOyZvg3U{dHf;#YNOp48D~OwF(VO$kdMc$;UufT% z>D7U$(A5;TG|tLs#?s55imsnEFdXcJx1+A_tZ%ix+L&Zz!@qvcOwYZb996XUN?JLc zv=<p3N;H<p$=XD`7DsG82F|3U<^yYv+?0BdCU8ksrN_f7ua-umcV^)^UqBnS<xVuy zO_nB_(>TklN<?~=8kYw|L8>HJ+SX%rCy{$7jPHMms3-+d&Mk1P=Ga@o{5K8ndj_8i zNH_2c=i}W4Vr@k2<uEiz4Ep{ruh$4~ybGEv4|rh-d;ll$*>f^bE2&v3N?k!DEDS5H zUgU;4Di`4l?PO;zm$py&OvOraYqS2(yV>jTIjGfjz-+YK*GeB_95L5RW2oalqo%Tr zvAN-@n5guZE>N-Z91A`WOTM0XVkZ5Y9q9hw0S=Q~s-eWIZqToEYI~)fd=U9<4Vp25 zT)wFHsbrl-8#M#7ehDt|2aI?h9;qVl#itt$DwH3+G#}672bktW5Yf$kpRXdgZ<OSq zU&o8KEH3RvUMf?g5yC$2r+a8Und;KSh!u%E=3wg_=z<V=AN4ZLzz?e+S$8<!BdDMl z2tpFf<e3*{sFKQ-!%;M#W57JeCs;HND9f#+dRA{6&qk&j7XSl42e#Lh8Oa5WUDii= zncBk^;yCQ6;@E4euFjM;^I8v>{63aBFQb?U0*Xp!$1#1OVVEJzfcvVouszg{sr{5H za%w4-`9CF@1LHIvm<@<w9}{5>$G0hre6GhMzrxh`yYf>oyJ6-&aDdGCgi~R4_|3Gk zqUfD8So78Bp;&1K(ZqJFQ!HNZF?4@BEWmxU4w1JDo0bm!@k8oB#(V*F1%vURGs4o9 zlg_$zoCd=fhBrP1t&|*nyntFPw{hFds;;u<4E#oa%N)mdX4OZ^$Bjr&6IV@F1@}qs z2P539s;BYw@Ez3S%_fT7_QaOo(JY`%KmkX*c1b>9XuhWKte){M_u2HnWISFQxy{=~ z82pVbm?_!P##Au-K&`a`uN!?OMZwr_`kLwEjASsVR-iL30Tzw=RvVsk8&SXxDu$BC z*`<`$W%63g(=<6v_<W*1^$wA6EYflb*_cUO+>fX0DkZa?GL>PZ!Mp+Nb1SS<7kVvj zP)(PDQ+85n0=Ed+Oe)4x&|gr_9F1?jT9-kJdRWm?PdSb9m8!`~tkzs5&XzGy4}2cr zvwzW6$QQwRCwulM-c7jR9PR$>n}U5CY&_Nnk=^(wr?6eL-(X(me~x<gTk3adv!Qv5 zGCy&?XRvp?@1s5&Z*2)Z;i6A}ncPM_!>qV4`x5QFJliTwwf_#{%dC15@QPw&-d5nT zy(eN@i_|v2uDzt9t2Wqm39BVJ)8^RtWt`vPSl*e~q%T;bR7gP-Rx%Zt-ONO>|IvT) zf%>UI<kKveVz#pqGl<5Q<Eg(#cV@*8%tgkhpft%UW^Se`xFX&qGrEZamSTe+TKWHv zsj~o=s_Odq%sEpx>F#b2#6$%I6ch|lF)3S26crU;6$}ss15r^_5L*-hQNch!N|f#t zBrkDm>co7%|LpfZ?|0|9_fDMIXYaMvUVHW86u2~awl&#qMkk<Sq5GqD?yB5Tu}?$Y zg4cO-$hlgO+DO&#Iq|EK8`HU1uA}~aUVri-T8FNVmd4(U_K5TjccWtT6@IZ(EA?Sw zLvkDytLM6H@V%|_)@Hh*0aqgX;FNtbG&$Tq+{T^}INyJcp7krS8dvf{#DLx4Pt9xs zhr!?rNF?WDQ&@&X5(=b|d53X+)`8|fh2n`hK&t%&S-To1M3{J)=D~M~l&P8d9PiML z#6y3JhkTMx{C%J!r$%Sa>G4>IExK<^U`OqT+rEiz63FEFlf7|BPA~WcNC#heJH3zn zS=0`@0x!l8dt&H3>J0xIc_OD>-i5hGBggGm1Kp`C6LLl;W|#d`_DcMf#GmO`iL89x zzdTbEtY*I%o)>#6r)JcSycc4d`c=GC`qAWQ`ZfMS=fCw%cW=M9kP6)O$&S2?jP(_v z8sRc(L-nw}$`p9HZX5bz^&y|X3Q=HR_+cy@JFu$^<lHO3FI0kUr4x0X!+6||d$sXi zxa8}<7I>5s-~<qPh;yJT*rw|Td%OsHMKAbsFCsFJ<Lme`gPsTssuL?c+!}}_X(?Wp zrAWqyID<b%L;DyFzX_WAhtS1+#DM$>MXpDJ?}3GLeqe6Ur*d+$(9%%P@Dq_&b3V<z zB4=M@z5PpOhI_AD**P8`UtTNTC^0Bm)%_Z;W*e^uo`BBw%1Ha1Vmea~h)fC{48BYq zxKGk8lRFbHraE!%tZ|;CyJo=e9+-jG%(6R&PKO>0KO4R|v@tj*WBDHTmph@?@nn+R zfS2**%<Y^9$D!6A$dl|#AD1|JYYr0b7~*c9Wxu@S_knlX@RZYd6aOGfqmnfczg<D* zb?<X}RwdkCcq+$2{V9JxGQvanC_i9_G{I|iKlbinK`KWf4Lw07)P=;|J;3RI1D=@g zd<(g*0Lk<TWEyeWABYOAYP~|eg=?+5?5jh$k>_Hc<`(5%7dsw07JSD$K;O!o<Zore z%IhV5Pu6gz62tdAvKiHFg6+aZvFma>#V(Gvjf}Rd23C5HI{lMV6RBj2^!Mq{okFTG zRdT!fMVY){4Qr=8fZEsBMka+nvC1<|shoeScR7}h-Bhfb1V8%@UO5N-{R3(l{6@dF z7xBQ)2;7Rc)(%PY32eD*u+dHqv?rQlHFA7ItSl~a)?a}(nIif+eM?W*H{I8;TExAx z$Z!7`kHO1W{N|7c{4<Z2sR}Zg9F42UxUKBJ4rL8zS0D0+VSSQ?&dtmY?BU#b3#;Hu z(9HheM?`@(#6B>Q=z|;VlaZ<P%6uoMccj4Drg{<X<W!=3U)j~=?<Q8K7qR#1xKBHG zdaq{wwwuH@=Jbl)OK09Wp{7=yz(wA;l#|$#^isd2Z+F@{x2MlZ4{%@bFAEF|=Gj+- zj)Xgt_g5{vIrvt_!HU@mIleX3*spY#Q;Y3ktREjD3ysWF3m&n)va8s42b%<DW4-<q zNh?FXdkrKJJNO#X`!B>wZ_7M}y>l56k<0Kcd`hK+fVT&q_*Czhe{WzR6txIzY*%*L zZ1&u5=u5HS`N(beXYQxM$9=><uk-%pl-LSfIv};5#Pik;zB36;C5kM2H<ckr(VglM z{9&VmbweFvHFBHgTpF2ezn3}Xo%E}Fk0erMgUZLnKTY=ZPiKB`e@y@3&hsA#z7g4z zGbc7CQaAcmc!d2M-pHGrbCN^Iu=i5`r0YBJ)PPjPdD8nhb2dJvO-L<2MH)qKjC^Bn z2;d9yyJ7oklX=X$&piXnW*2x}L%a<S`D-$#gM;mf_B5+q@Da3)p8`EOKmTIK58{0J zl&B*IOZvyuAZtf-TJyj-e2cx1tQr#!lEA0cDsw54+=u9rDRkWvnIbZ3zlImZf?s1- z_#Q5MCsv(Y_{xpMB9BGy+l=1x0lt!R(6=9>cKi`);(ryoAzUYPGj+V?Sp|_>b5c2P zM%#p6wVtO#Mo;g))XuVTWoO4r6JwlyVE4=P+w^jOF+)~-?8%(>q8+1cqrJjGI}n`a zO-s$C-dE4`#&kUWW9pM+v(#tlx7_i5JTSn1G<<gSm*|qn^w2HVA@r#L7Wg{@p5MdU zhEzWbKhy*6BXHoeGj|2IT2s)fiisiK8yJiQ?jG#PRV;LM>^9%|i|7f}mAY|Mguov3 z1NNjVu_V2V{b41N{vuY{8qM~3-n|OX$yz+oo3K_lBqFH~P(<&>!=jF6Q?R!U1s*>m z$5le_n;zH^_=$R&-R!HV9r|l%r+rSSQFMP!ue@D3FGUB2mIfY1{v4HF9-mOwr@UQ! zWbzlfZZx91M<ZvI|ABRDbac)Ku^O@KV-urKgg>$e2i|Zmpi1U2=VPGpVdDGpy79}B zqtnaXq~AE`+1(=-Mcb28-#%0s**y~a-oD=I9_Z>Hqlam0=h5`R)abP1Eb**BV{CsV zc%09rBIA5(hW!^cQXj;-wJbO+um)+M9r;Grlauu=Qhrq^V+g*Fz1TSS`kzrzAqCIO zV67bv*ZPvzvU)#`Cc7M)`JY6_#fi*og+;1T@b*AgA}pr(_0f4|qkZ=#`f{>$seQY> zo_@p2?N-sBbDHLt=FQB#G4iL?KKPiw#<?VQS7LSf!|}6{i<5<k1M!LRg^Amp*?~!+ zmm}R{-EzK*{T{0q`z@S72ka6!BXf{ipD(9pBrYg_4=4^zWRf+VTfE;h3#?Z3Gj&5t zLRG>Z-IyE1_C+d%ehBW$_}*jm)NoSI(?wy1(+MyBY}UJ(n2!m8Y1T=5CzTQksD{xw zRAhY|oI-r}1NfPr$Xwvx?mgvR>Smn&c>n2&No~Wgsf}5m`a{2GE@H)lu<wi^v!YY* zA7C;L8_|1M_Mavq>pVQ)#n_aBXbpqV7H>uJ`H6Vu_pt)M7aVBcAH5;gB3382cm7j3 zUqmZM3qw!&L%ol@C)2Hx7pDr7%gR=k{Tx4Do*y5Zp5eXb*R@(l)<qtP?2aCZJ|5W+ zDT`FYo8QTLEHluZl0KcR8Goz%`S{(5SCV(87dSt-Bm8^F*Boq*46nlb+b1?3-}vru zD0GoEizt{Hes3z3)OFrSk4ul@aX%W<PWM~CTOb{*W3RSzLpwrU!n?^8twMJbkBX~p zkgIF?mFP;5rYpmA=Pl=5Joz)-v+;iR#|FDMvlHGi##)H&^bP9}KASyMt=x%E<th9S z6RFtI+TTay&|CO>FGT|?^N0t+!#p^2VdUfJ>c};*>Ur^;A7i7V`@+qwm7EV~!RfP7 zixP{=x0El54~bt;o{7Jm8sI$OkHJR!q%|j06!|1tFZN;VtmvWe&EY1YW>zS$#Vf{p zzdqF?Rgg?4no;FoQfin}2Mfn{)Ns7YelEN{(mA>+vN&>I<QR2xwuB<~DRk4d{uADI zXGMBvs&nf4)V1ll&X>;3?i=1_|NOuU!FkqGbe!-)bEsI@EPN|j>i1e#5<NB~v(x*A z-FCI(rB|d6rETXm=PfrMX`?pQr)|MIt^4dAR1$t5G(2=L>jN*e&I#71Gshv~o=eH1 z2+^f-qWc=!c*H;Gjr3Or9uF;v<dN517<(tOKin!ZEi}oxAh?oP#=U+U@3r*QM9=tD z@y3a(le1GdrK>r6+|&Ny%$LZA)2$An0g>WpTl$aZM+S!a+mo%kgX=PH_`lJ`HlJ#n z5q$kGB?qK7q=&j6cr*M1nGpV)Mb^tyjJP6nI5aQ(WB8nKyU;dkeDHqiY|J4#YB%yl zXX4{Nb)IzYc7AbQcR%tD6J^sIyVuU(9o7PCAO7F1M7sIdg*{HnzT^|$goX7i&fyox zADRlj`}3^CC$gD{y6Nb7d+2sp(`t()>NuXH!B_(SCJOX%PMkVux%aSRKE^&hj(F&a zc%at9Wm{mA{)$M~v3UEFc&=l3Ico8p0zBWRiKqG$zsW7^+G$v4e#PGVCRW^`M92<= zQ;)!V{}Xz7eXQ-h$cag2+GDjGj#pA$TOY;ic0Hq>!X~u<AIuW$6T`5emlBJ<8T;0I z*drJ5f4`s0s(LWyk6487CZ>1+n(8)o^&a%wO>jwRGv{G(-Am-#wZt%}XY2Lc<!S7$ z!C+G|ZZ4z#z+Ki+@>yTT8rhi|h*hx)7iOOH*Ldf8jp$=}E>W6e>4P-en~t~Vq<=9s zsfJidza<Z&F12iWl2h82=$d!&v0Z~@_X@nU@1P?OLwjll4J{*QdzY7s_5C{ffp5oV zIg#i>WiP~t^n45GFF?PXh{iq{&1wYxgtyQUqJg!X@9i@#r{EW?b^&?Kk0N_*@atmr z{h9S%OuYXZ?A@L4(v0IA*+R6=E_C#}uwN|3x}D%0ZGuPk9dw(<eg?1fIx;hRVl|rY z$IwZZ5ch=?hUdNwTK;6b_TMp&_c)nuz<%%IJ)g)Z=Mz1(f*JQAN@4=B5#JM`;Bf}e z$GWtQ$lU{sQXlWssH~OsQmp*y{Cp-cF{-6_9+Y<sop?Ht{I3#C{}I;hd0_Jc=n456 znotdYRXE(vNU~U|CZbD@UtRnjouQ6?*lYU&kF)Sxw?;$H14Da>AXRj*=~XxvXsqVj zC-6o_puLva?{(vB>WrUC-8ia}f9x@Db^2J!y?)~F8fbV2UYcWA@4ak4k3weLh&wc4 zgeKSzl^tIdIif0KR_F9+#Auya*%{c;&Shoi@%(H~+qS&lguB$>J29-07FIa@=JKe_ zBcFG3`Kxz*yj`WtGtS@RczFKB=D&}*?`3A2@olVUU4H`IwZ!sn0>0bWXUDMc$wx++ z2xdbi4(8Yt*|9Ot>N2ycz(idJb!Q9O3uXW7RW6^^2aYY7VH+%;U9iV@W8TU$Kbzkc ze7_+3P30VEe(Fb8!rY4aEy?=k%uI`j??1p?j{@ZqEc-svK1nhB^{~X|FiHWd46(ix zYdg)1PjcO9aG7G1a-wN`qQaxhRIsecqZ-c&d98P<@u<$jyrXq$H9=+*1aB!~5mh_D z1H1WLRUb?=<<Ts=rcT*fj_sk1My$4wRVX9kG*J5&ePk>4gtb|yu0uB5fz-YSh>Ffm zGPeYJocrIEc)*ylD6Cs^Kg9^8+*8z;%FaH>j5MDxGZsDz!9_KwqCQa>b@;E2FLij{ z0GQSU8kLx<uEaROulfwI1$m?yP2CR6>IB9AjU3_nN_-0&8?aC%fa;8^o_^JMrxJI~ z1=cavsPUrACBj4ZDddj1{1>f78C%fvxRbCcY!rdFW7%~d<^PH7`h;ImVv;#|%!uMQ zd@r0GUn?wNJmFRQpb`&ZM{}vpI<?Yz*;UtIo^^RvllN*eTfJX5dqv&s`}(YEcJ_tY zS>`jIRuKl80p=)(BzTko?;`MW6ukWdtsUb3VID`bk7HSko#L8Oup|7OWL+ottF?$G z^~$_^npawt#?Am;K|jVLKf5BWC7-(sg8D=d)N}pS+67HPzZyGDdrLUb{44(#1A@MO zgiV7<H@g!=-x?>z_Z7>gZ&hUseNW#Pt*f4>c1$u0dBI&2=kV81g=j$!jc$Hi=+i_j zi&EoRiuHKr@viv^GNN9Kl2p;p?B5b#ASe}Qcd{s3I2LcvUaiXNgsD30nFdg>YIN4) zm9SWoIalKf&0CdEg?T*$0X?*;>e*L@;?#FiyI6E0+ROz$>XxFOlzQZ4DM=%Up8iL{ z>iMCS#j}_%2Y<q-DAiD_d8K`LoOh1%zUa3o%MbPHIIl$s!n&bkL&t_I2{vYri6fe4 z+J_bI8Hx};%4aR&NVR!r53AorJ)qK%XLb26T2?KXT3jc%R01m68wMt|__Tf&f=#n@ zud8bTLG9gYT%+}h&P3(njOun;0!~gq-G;soXP+H{=0)`fI1N;TS<er%M)4^_--auT zFPCNMK$Mf_S36i(FVDUbm58H>?nU|HRyo=EYMtUEHCUfk*MKvtDZk>Tjj}7yUr~e3 z^V->U>sqZykkLLcbRkMMc&>n`&K<#0I5)H}2#6mFZnd(|5dRXL<Uk+V1!iZ05MU$v z)oyaKJ42L<<>SAcU@vF%4j$X^25&=>*vPrKnZFyd&$sYOU1_$%+4Wy_lLf`2j8T@| zTcU#y5YW78WHH;Ab+_P5Y{i+O9yRSa!CPm~5}lK+I9HkhmnOhM*sY%31%=Ezs>x<? zX}Dz!c+?Iw<{KTeC+mgCI~Q=is;cls$W7<+Zfi!V477CapMrkX+h$`n`r&6Jsd?BL z=ix6_|Dr`mF~9J;gui%#d8jVuS|puytW=W079QJKp(x`dG?V~tKDl+GW$~-JU{zEr z%<9b7uhyxR>aVK$=vS+3o?WL-(S~4O9NXYom=^sSj;%9VCxBiR00-gD;Lpf7qA%?) zv%~BxrEB*`vk&nA^T_2rb4Hn6qaCL`SBpD~x<rlIW#U4bkN8oI>@37J#5Kh!O0zs( zJ7q@}9;Wls??me@27W(g;i-Dz3xMZB;JG-fb*w-({0o?G1@`JGRLuTMWvS0*PLf9I zg2QIOr4>G%jz|-o_+Qb3sSC26o_G4MoL2$ErrB9)#)fMMLgs|l-iWboK|`mo*(0KF z%ogBG{9Zd$Qj;VIabNYNl7&lMpj4T<12owpOM#+3(On8^J_hgG$8Olfdj3Wx{{tEk zwfvT)o1cNeVt#*O?LTE7i}_?J4^`A&4+PXzX)inD1TfGnGzaZkVOdoPj8xf%d9=+! zK^>^nt>7Fa#tWe4^P%mtd3A19cI=8Qtjgl*SfxixXv#>X4S<corKCJ_4hlAsAjCZ- zt4JD_v>_g4IJWkd&OhtFv{DtCXv~;`%Nfi>_dSbycFy9bEznU_^)TEc30+8nCTj$! zECmV+(NO1*H~T62$?UAw@ezNeeaz(VY~KHz_=s<^`%YA{90;uguDhVEBaD^+Tatv# z*&q(z;J*~ohBXUAXD|=-=Q;~mbmdpw|IT7&f`@jSU?JWrnW#3<)vglv)VZNkP%@DA ziDX^zLnFQGbP@#gqw`T`dxrSI0RJn_un<=mnZ^Du{PYbymkgtkbw*d?zIy2X=1kJr zUOl^;BwYvaGDtF)RQNAcwFjQ6j*@>uTYs=)R26tB^dky0RHVLYsy_c$mLI9J-2UuY zT)~ONWhIMBMyv^Lnt(mgLu=rnPJA7+c<hj+tj<|V@5sC2w}O^9mVuY_DDfXjPLe{z zfsD+i(^Rn2ui-H|UGuoF<Y4hZBh`r;85kPQB<M-%lDr|#E!j!G+J~y*F5N`CQ*`L_ zUsoClOYdpd>IzjDlnkYj%wCqvroMZUu5<z?`PDhB^SOk-W$d%!?BCPSl+HBCsgi4q zexXmrjdYE4BxyO)H8iT3kFc(l7%5fKsgYw1Kb1Ud^bAQ^1@Is3EbTAziIKky2bP>8 z&ZJjH1`{_ISJu1Y)D?VNkkwfy8Z*>sD&GsfqBK3szSX?Kyr)+>2h5pZaG<@d9b~X# zo*Q1Miu(VfSDjt@uC6m9i(ghyw4rL<#oSlW(5GfM2%nO=^`klHwK?r|VhC<V_cHS} z6d>FgT*ZO2o*AeovXB?{B##OYlGTh}5(n>+wu}^Qq!dYB!jYj6jru={+|ZfXyPA*L zy=MRFuQ@f%`(`DgQ?10Tz^qU6HS00-E2<VpFt7AIb2UrOu3BU0oUC|N!8Z)f3}4Y_ zW?ts*f?EZg^vpn7SQF$8W(9FUQg=49H?z{+&1|wCFq?{>|G#n{?qw)gl%hLmB#mw6 zWi&8DIYxfa6-E!OpbCS1&B%ODbZ6#WF_O`n41{%eVY~wSnw_pTy0XU5jP$ui(|62F zv>w5<0=|YD7+h%g8?K@M2G<%_+{C~^Yd2ck|M-jf%#5dZb+w^a^Vi_M0%Lk5Na;R? zKbbq~mBE_6RRLRbg>-y<YUXNYpsUPx%-@Pv26tvQ6?iZZGZ-@X6}~EFWbh?eSMb*g z>=|0oIU>xN6HGYM3My#S(2SY6=BYcIzh>PA6B=EZsQA%{=3%&pc#k-f;rHT8;$eEn zJg?wTk|uPOt~b}pI%2NX2!@&sWr@lq`{>?Ao;BP@>(zBygMpLzU$M6h%=K5gifF>{ zYMlXwKP2HDMn98QCT>!3D(Jt?52N$zOwq5-4ZSP5P~1eA6i<<CrYppEDs&@3Pt>P7 z>(h#dzNHzNSqh{2+`KaXb<!KEGOzWwVvUAc%sw`FH}^B&H!Iflx~>AVf=UICuGpip zEC{ZGx*#h&m@`DLgjM|*PEzsA>=y%L19i=#;!49^gc04_@CNO7b4UHxduI3QzxazD zq9y$omk=i~S5%B^J~N-2`&T>%XxSglPP3Pcq+hK}bCk|1?3f?zEy2jZ#_U3~4~0E_ zRslynH(Wz!g}!6HB|MvJDt4&Bg63awovzeR#T9z4?;ES7Bof`t$O;-u?`V#OivIU4 zedm935<Jb_^~`*txpQNF%rkRFRq$8yuHh59&d`|VCFp6!6<87Ew5x<0^J_lQRTY@g z-qUx@{3Oi^`@*|9v-GOsj-olk2@EGO{7K&wmSk5E)XevFSK&>vU@*%IWN{Xq=pEfZ zg0!QGw~~A$2MM?0CHh>J`wFX&u}|uKb7~lQTecL@ojQ2h*%8Do1lJJr(4N))77k>8 zlpH8~MiR(6S-B#^K9uE8^x^VfxJt1O?Q&r{1@90R#S0{XrdgZrB>5wNhfHHjA`yO_ zY)u_m#JeCr|AqXnZ}cR_eIN3<`lCx@EMNrzbhqnShidu$j{fr^I^uSIBV<j~qGq&9 z59&|Qo6<=C3z7Dd=u9*5<?X^Jat)8pNawxL4Sz)s=t)-HpG2<oC0F6Y%pkmI>oV7o z+cAPnvVp`>e?*4DBgBxOPrj78cF#f!zm2=xow*+W&|6e$S&JWz&gsNcz0duoppE{B zH%L0`JaqV0to23eWNasEC5#t;J#+6t2ZL+Tnr<c5>N<4L`_Ut=!gG`$2lPK^aZ|}4 zc^c2u`FOkD<yDMtoT97gIe`U0v^ied(`3uNkM8$8v))LiMqTRQtD|Nb`0NK$|6pY+ zz}t2<p1TF)J9kHWX$?g0!Qc8@=0`kG|4><>61|olrRvxH)L@|E99rK@{&%D2;56#} z6cP=OKb{KIW5Hg1{D10vwI99o4yfjb%p|f5CZc=xMe~teXBk@8R6e}~?^ttUH+rKh zbtkWCIl9;-=#h=_?G49Ium07Cpr>PCRaS{Kc&-bzsp3*DF|2psZ)*sSE@J*WxwA*k z#SkFiQ{(6o^v@lvtva=&kCGdbfS%%5n<iifIF5d|1sbYF?EE6AX$5)D#oT2f^+W0b zpPj_fABGlMbBCw##I`3-U^ejXfERER-&=rvZY>rUSu@Wk&gmL5HXi4Hb>Ptx%>2wX z&CrQsboD$!bk1t%<bGoPMv+-H6lf6>Of1wbcrp)Uh7uvz5GvcxoTA*l2iJW=ta7Ws zdZO6JQU7NolrfeV_Ftgnos72@Ewlsodye0CfXY#*cm*rVfTw%$L*9$VIh9JLpYmRu z_a=dhG2Epl>%R~^y#w?$5;%2d$1h{9-=W(!Cm#3(*7^kWR+-uKV$FhKHFm;&Yz6ld zgF@sr*|Zb!hF=OCDrY>hR@)JibS3Xkf(joXL+>*z4-0_pQK)Y(D_WnmSw|V|JVtJl z-N(mR!5>^9Z%rJ%`ykMYvtxF%f@big6!A-8{<j4N9a-bs%=H?mqbEDzak9*wBBp;V z{_>I3<?F`2dys6O(bN<BhOG2yP+C{MsorQEu*5WD1$D@B_#7|q4@6!SQ`@1K?9lIs zg`LOa4XR}9W85#P@pC84Y##MgUhu{chrg95u6x`&$xF?l3h8FA1J&_9Cx7h<e7H8T zUdsZFsS7oM7{!PAe;1hpqsZVHO6`%C(A?i8!sc9}+ZJW>&Kgl8>jYl#(_THi;veIG zewe-cD{x2>w=kW2(N5HvxSiiC$POP6Y>&@AMU;9u%zYhmp9<B~#6ln&i)@xLx@P5o zAK9mGB{Ob19{*EZ9ig(FVloeqkryRec`R`ay{MC&u!h=C+t=G;sK->9zLIwlY1NCE zx}9X5T}I`aG9n!3IAkd}r_<%>W9hZ&B6?B3OGk}~RHgaAyTy+Z-F+6L4kUB*N^<Vf z))iDV>18*wTQTB4RHjUmVXy>@y+@?zQ2!9oiwE6j=#truE}$H^P8atJw=QwPRBs}e zb}p27Brq-5m`Y7Mvc1j**!NLirmp=5J;JI|1AZWtjV^(sG|T)*4TCc8SL!R@M`rbv zVB>GEBaxVWp`i7FDa7thwesmcF~gomB-yX_vt<6aB%}QevfgT2_fhAq2l)=l#_vI< z(r}`cTT|V+n92bcv0rn^x_jQgnHpG&oE}a`r>irXzG}0`<T>rw;D3`ljHvFb$S0qO z<+)EbMq?Vee>Vi@5)b?j5e)r_9WNs*`WU&1bD+mIL^@th)W`~dDEWjPs5p6=oQ;3T z$9#p%!`eha1lUi1z;6oRFW*zCaBOe~^+u{upSzZ|o@mgwh>W<D49h4nel_4W*H9PW zsNaZOy*vbzedOJ)C*t@*B20dzKg1toG+YfWZ$%IoLd=UrU8sn?hMa75hW5zj7)FHq zQFg^BXmdW<w<Dpic2q~|V8_Wye#rjBdY1UfQufbIPNQ0x@!rMmVIpj<c21->r<W2- zbc^%1v)-w~j+jf|)6LYQdKJFWiD;E);Y>FKs{&PvOs-NQF&47Bt|Icjlw8&ixa%CE zIL4ES8}ZkYTlhD1#NQ-)<{lzSioHk4+Zf6zIFQIlH&CD0i<iJv6RQV3*HXmCK1gI| zNj9S8FY@Tl=Nx~HSeR~{w1>$+{)g!DCS(b=raqx6NKb~7T}Ym8H=^7plJ9&h7zE$% zQ}JrHHJ)trKGrFsMO^kvH{_Ubwle1&?4GOOs2NV~-tfw))K3^o<m7L`gLHzMZ@*=S z>@%(JiKCel7zU@9PX_x)>Z;_sbl*!)PCuC5l7617m8xzd_hR=uw?EO~yZqPb{q;BW z5McfvLghD8v9uD|Ij_Pk8U#N<hKN#0Pu*#c6V)=9DE#@v=`W@xz~y8nTuN1_nMCAI z;>_v+pZBRmH<0L<7s$B(7CttE9M8wu!Fgn2Tmo-x%}EyGyck1_Q)4)p1BYo%R`N$# zi*Pynq&}23A2{|P&gU&+1n(qsxD%P*w-D=eHW?k!;4bj^B)oJ4a=;LHbz5xkb*Tuo z3Q0v3`$Nb8ZJEtXIy@eP$E5hXny9j0I9=2c;6mUzkF&2UJF0+;lP8d~TEMT)Mgk~; zyKjNpt%tfkW|j>z3+Wixi@njB=$zMxb1i01IDS<!y!%nLU=k<s3gm?+I9s}c?aNrp zgPdsZAfGHi(%6LjSO<&vwQ%<C@SG6+<yP?xNpS12XD`Uc*{CYiN!ETL-1-qtw{d}I zh<kdQe6UY}#rJ_vI6YtCL>bLzik4KBmU|iTT27mOoPd4d59)CsOS^?_QB@av5QlvS zaX}A2`7`+b2hh?OB86V#?<0JB0N-fA2^vK5+KIIIHIE;e(OM*yzxn$c6e>?v5t5DM zZ~1@}-5{%Aoa}3dcgy&EIlJp?xa3?Sg+9z$?B@f!#k}_!InuMR;Qx*sC10B2i9X>m zkFkGc{qppf_<_Ayi@rMA9^-xofy}Qw6#Mfxr|wQZl_%{uQcQ>y%9~d&>#s0g>pY&< z=gd*0iLqqM`=e-|_Q(fyvi=@fT63Y~D7#5f8;TQ>Kc_xiOLp-3NOFxBqb{^#MwRDO zo{;L?OOaCYeCb-_1*@06m-?5=C#8q{c8c9;$yoBz)nuj>{uAj8M%$D2Ax%g6iQ)tl z#UjgcF?1r$A<pX}9*W43-9bNztY`Ts^5r4qNx^C#vhXhOw3lZ`xKg$Wqwz`~GkTdc z9Yq(&a;^Kw&JpL;NnrdhBkA`aV0}0{%APDP6mN5!_k{&Tq8#CBNsh9XlxIiNe5L19 zJf!Cs3x~%{rDN$=+OKp!*)L>MGFq&3CfQJ=c~wMG$g*#&0!G&}F)Z>b=$X6*#_lbT zi7W@Yhko_fXqVC|jn*hno$OA+wftAYvSJ{Ne?tBa`6-N7+-RCsR)3YYCyh;7q3rrb zgXJSemS$%j(mI7XtxY<gtTnn`79;79g0OT(V=MUo^Ak>_pH}z<WQ)^S(n%Eqr7`4% z5T1&`d<8`)ibgXt_9bZ)y54Bq(oCgA$gUuG>S3(mvTJEP6M-O)g<k6}CbmT57+Z?5 z`kR?(t$e`v!jXZ8S)GYjFt&BARqHmIu`C+WaE*<{z@@^XVQ4_}6I=~cG`eQ3`3lPB zTJvpb*cH$8nXx+<Y8Hja?qIAv24}|lX=ZDnV(36nHIE9*g={EhUFO~z-B3=&40MI? zrT1mUFw`V_i0~wSmx1rdiXkms))DPq^H<M|ecH@buLVg%DcXs~=B;=2Bb=KUD#fb_ zKJufA;}{MlpIJ_p=4H*24@BN{d7TtjVqy}7Y0<0RQzVrlZjPa)XvdmJB7JT!pmiy3 zOXG+>L`%Y}C{>go%Z%BTqUa=4V<KM+U($17+yOGO%E)G<SDJ@DG1gMiy*z1pPkh2~ z1ktjhz2wC=_GCdqqX?eDy?lDYon|H8XMPMO46X&OBqQjd)r!-}5~dv|sHh{7@u#Wp zv1~=gBUWKI(ul%~Y*50RM$>(CPeDa{#jH`72rz>7x~#VPmif_qgjLz1W%DWHuV(MF zr;RPn%*W$(WzGoW?Y3E))~%Hr|8%A73=|coxLk7rDE?8LUX~;atefa9#b?Ueq`gzl z)r#qq=l375tS%p#iJ@ZEZB|5sy7rW3ac{VhIHG~0V6L@$jHGcCr=%UJ-6neUnTg<| zXtLVeKf@hV8(OQ>nmwSdI32~dX3*rc3(|~qfb-*Y7MAL}Eeo71V2V=^^@_))pvcYG z6Si`G7crh<sYIc1YzOkQ*9TIC%scVlceN8Te0q}aspoo5_B>Wxj?3$V*i|-XBrk}< z6g7GTcoYNknw+_kWOQ<yA9c4@w5)z~PemMxQj87IaC*_4c36_n4l|mv;;J&MD$HE5 zwec(k*x8k6oFKDsfu)b#N|7G2c1uz@2po!-hhm2IGtyDurF)sE<XoVYla*KMW@RT6 zb0R*X_$x(onAkJLjp!86Jw#igH0@2{s1TZx*S%);1e7Epn$T&k-KD+%4|m?fz0E!p zHI`;)Z)~};FN)L4Dym%-!?L0MB*{y(uRW!{_PhD3SX$9diWS6wP6#U2%G8I<@EQ}t zC+ZVV(T_NDf*Hv|Dhw87<&x8kBYDe21R2h5IJ9OEpc}<*W_^;ms-LI$s>4jQa-Fz3 zS;c?LS(PI26jgeNk&p8_4gF|GiH`<>PCj=PB*c$obyoL}^^EOgszG73p#<#)$%vJB z<^ZLmtR}@+rQp&;@5ZusjBrg&-jTn|XGO(a^DnDce41jk)n83fuBVx$eDjJ5s>KXs z&lY`auN(facT}781Xu56=E8^k_(s+d9<=9$1@UB6Uf+W}w==uL6+^CwCq)QIb`s9Q z(34^U6|E!5=rrp)&OB1+<<+^?ShRIU8~V^r&F5|<j3qfz@Y0C6Tp3{AqRt#3C60QM zIcVRC26eWd1jhUL6&?Ff$WAb|30ZtMqnO=M#9TKJ<9C9QO=PCvl>kyl_)hI?<WD0; z-_3WoGkPIV(%viwk9&Z}9_UH?Tkt3Y!vAuY47D^Qe>Y&B;;TCG;@scFEr?DfX;cND ziqki-sER5rX098#%QiHHZ9qh;tD2=Cokdob%QQvr(%LIQ`3deMT-E?XqSyUsI)|YL z^$1d=v+yY1XJRcB38c6nkC9#8tH&Jkpxy0!YZr4<CP8IJk<6}{Y=!pJhfg$|fM2Zw z_da&uu2es|m_2N=B1#!w*ie7MGR9hlg=Gt~Rh(iBoM}%6SY<=z-3<LA7kG$2Sj<JS zj_NrkDLlX!b(v9ZW?ssjb~C4AjGe<Zt(dEJqv$=%D(Z4C^&gOCH4huYUMNVqR5%M0 zooce^HsB5xwuU`md;|E^4wJ5>?f_AsPzHv@%S9QbU~wH#|2IpoqA5lH)Xs8Z#k)vy z&oGAci;c`|AHN3}Ssf6{S-+y53W2!GNJiH<#Y`pXIp9_ORSJQJ;yQD<PS+Mdq2fk6 z8S6k62h#WdWyPXgJ4?T!{5E(ajP=n_o#MoDp@gQ4<**}n^Zg>|Ai*e#BU9JJy*v&w zFYU`H@J=#Aoj_f<b9H7VUMRUn{U;Uaq*L%H-%Nr9!BD)Zm^nyG6xTZee8mw8vN#lF zSI>?rDJ{dwssK&ZW!ujDb*7u#fmU2y3%KcA&IM-;c@<$@x>Fkb>pauGl-#6VhFf`G z+$aYq>P$Yt`|96U0xhXV>sic4@>UqkXb!Ssp9ac`i!Oy0wm>xzaHcas=U0lm>PHfe z`g9a<zk^^S2J{-TZtdS=+^;FRZXx?w8mVNl1b0>r$2zbrS>Hs0<Z(CYnK}#V@NH4; z0oLqft>#ItRsK*N@KS~QY~wS<>S)L7IuB0Lk~zeHv}C=?tfx7YDCkNuD$UOLFxMAk z&t`Qb*#j2;B+7CFcWjAOy#?!9idADLtLX|Z^O>{qDl&|}gil1{jj+I<!IkO{X#<NI zKubGEa5%{xUdvu60ZNi;>LF<;R=8%irk=VkD$-FHm#izTGk`bd6ci+#Ho~e_^8G_u z&Y^k%+jw<~)z{~K%~-XG7}q|o!CIR!QUo8?8tg+`*tg=4HMpyn-9;yubqj1gx?hZu zx3Hf|nL%T4tj>*+BqjH%8m_AJ%A+c8<SFjDl~v1&sm_i^fPW$TqcgLxx!aEHe04IG z@Tn|t)fq*dKy_{^ODlqHO{ecczFWjz*$JI!eR)u+IBo;{M;-arNj^W!6)B+mR~Dap zxmN^Fry^hv00r4tRJUG|wz4eJ?6(8Vpp>0sbPLh1k;^jFC{S%)3!ELu@(y|Fc4wtP zX)lt<gv)Z)l?P=sX1^$!w=%!~B6t48?<rPOlle=gRJ~r=71Vb{5#=qpT5^NzN+!R{ z>_zPrX*wBZUW2t|;1(&UtTK0~!_Lw9qF6}HSp0A=vk!uGL3S$?XtWuf#gg*0hwE{z zIsbK%i;G%dtbUfON?KB8f#e{?`)du7$2P)Q_d(@V_`W2XzoFJGjNK4OU&^C1b7-F3 z5w#dwP!ko^;=4M#*MTFQ13ApNCNoxie-$t+dMIJ^Q|vtXD-ZB24xFnoFKLMKxHn=q zv<3pww<H^w$VhRWAlFDrkVND&vpi_v1bb*bl#v5PD+{nrR_4&DBP~l(hU{EgrRpRm zcuz8`qW^Wu8Hq*uND%nSPNR7?WE4qZK6EO(T0NjHiC@zHDeiTMZ%fvWLs2G<HXkhM z>@X6TtVYt}bczVJ2{3$u&&9jtZ{N#omUA}mWo`1z3wxV@TaunGEx3Er>{+98Rq@qT zsF|~b9eENetIH>+pgoJ3R%d0B7AnI7E`ciq@StwXp7`ZJNPJ8@-N0SasWN)%vzpr6 zPiv7(C@hGgxAQp0NXm^X#B;Ec{j-a))z!5<yFgLNg12II%t@OMO=W<kq{j8^Nm*62 ztMY-?8Q`G@9*7puuk_J6jG<0EHK3&ZP|}Zhl2-y3ox#cg{yS@*J<i>l!6h$%$H^C& z2F}IE(Cx5W_hW>rz*kgUnOXk>EpCM3OQ5uQL}&j2geB$a+;7F*&t(ira#gr{4e+QM zo9n<{Ie0d@t<HjCX0sLgQU0XzCWKXCOQ*2xj*9YV01nh|O6Suq#@WXe;sfGm(xD3Y zq!`+)%$3rRq+1CxM}gp<TrbWo9aGT-7Bg%PR0?^$A51A1Rp+;)|6`1<(=ZNQE5^TZ z7EcGk{CwoIoltWFa90V8?_i!Mxc3>{QCUXPL3Dzi;**VhBJSRZc}ahe%qk69C!GZz z>SuANtWD*;)d02~Iep|4iDo(Re!g!aF;6nqN*?RDQW!4)in7E?@{;VRcsObQ(jS$J zQ5PsR<qonP$bKdLM!BlT;Th`bEDhe~x(=*DITVW3Zwb5(0tM09NoJY?wvu3v0Tb!Z z%1;yrX#`}&Idh?C?GMG{=xWK&0eaPJ<slhf^>eH7%^W^I0xT6hEm>Pyy)4j1f>B;< z3w$k2nWeFOgn^)w-8+9m1&5)LeC99hMm7ye@se01qnrl+;^ZaSaYMkRA#;<2B>o|< z$9c@t<=%fn<15(zvNVbh90UT=-Iae+3u<o3_iALh<pD;OjqNCSRd#_37pTtM#I<yy zs{eFbu5SPaWM$g}o$O}@I)UmTYc^!I(r-nr)v`2^2eit$W;K3}HPE+9WQS<gXsX6? z76JyHfUW#5N1-oOv6jBtntKacf>{b$R8*0?0^+*jnbL@=0QE!6#D%uChm{>8%~14M zz&A=*wJeviA(e7nlARqz-V+Cx_FRK+$l4{{T#{$KEL6mGrM>2Ijj`Dpi>@p(4zrU5 zTX7IoxI)lTgrs`@Nk6K@cTVxpew9xp2Tq*iQ}IiAIi%A{pO?hFm+`c+rhMwbNt9iu zU0M}Lh#us1Ft)A~JVklWY2H)T$ad&K8jpCH3(Wq`N*Tu)S=?AV<QU@@GnV+Cr06nM zud}66b{yFUWtWpaFHJ)BIcaUG&2t2JGz2HPKu;RJVvdyAlh5^{H_h2*{)d=LInQPF zaQQ?yh;kpz`QI!R<N+sXB(mryvszUr_F8RrK@lt1#<#@-rEBV&%CwPAvY)H-fJs|s zs+}&2lH}+-)}lS7)64jW;#o=)eJIbUoL90sR?6;0W2qHal<i2mytK76c#*{3icw@+ zD`6$d;ZXN5(^sAf8O%()H^z6Rw@Fj`2fSAY+MS^OYFw#VNCuX~F1tq>%t@D*WF^iY zLeARH8aFbM`ur(-u@bOQhM<8&E52FCbtmA=qThV@@fplSx`cS5#pt4EkLNmDWv7%r zY-|VG#fNxDHk&Fye?NHJ!yKys-Ri(n_Al{8*}XD+Up6J>&B$AJ7``TnK~{Iswf3&~ zU?Z+o?y6)7lXs&CAL*D|xtr`Gk^|*YDC6Gy8BLOgs8E`zq{#xlr`*C8><#TWX@aMK zfb>aG_Yr0#9nna<8SbMh0HP3Cfh7ZYtWXvXRYj=Ej2begthPE)Yx2DmtB|H8O-lA} z<=7o%^wU}DQvQ-`0@90QuT<`&c$;irHGs7!U67S6?+E-&C-ElcC|g^a85pa+tWC1Q z={;E%bc*PTTp-<oQ%Vwn&J|fdWx34(hdPh7zYL~ZaGJH?6J;ef;F)l5LvQP|C-G)x zD;_ORs;p1S5vs<oZ0p6$ODB}1J6XM>Ktb_Bk{wLUr=6`OAzft;cQkoBI!$CJ6D=rL zOY~O`b<3xz>|FJ$)eh2%)Xi7E+S=K@DT(1U_uK(*RyNhfto*SR+*+(oc4WzwHouA^ zEn`-S3eah%og2;KTsBA9(j916Qh*P2ZRf7iphSQAu1@I$?`X!d_$X6KnD@c6^6ivy zEG{jL-~=<$Zq;9DStWc!Cqgw~WwdGCTNsFB$JN@5XUOJ?9AHq$XX4+oz*ovrPF3z; zEXk6K#YL5iEepD#KKZG1wJi2V`mVz$vZ%_NsK{4&2V{xXxgp!4EUc2V<z+QCZ0T2$ zL8SXieph^e(K;pH32ySRNY0lpL|TgIUDA;BX=OgiW20Rpx~k8-WxdlbGIcBt^X(KP z>08pc!rV<3DP?-gmn&<L9y(>@7Z4nc$GVJX@{XyBgrWy@PuW2$XICqqiTo{<vL}bE z#yTsE|IGN#WC1XC0KwIGluYKdYDFlD*Z9&*T?Wyyc8B=7cz>Kv6>Ffqt~g`Os|5Zk zJCb}%q7T`S70s-(R8pF-qI@RtD8b8Ub;726T;gkzx->h<8j^D(%tP>zlq1|2YzxMQ zPw0%7KU3EmENd)j_u`GZ#`sZnChCqRAE3fFEl-KGS;1G9L~#q94}zJ_eC4AWe~|7k ztcqVtZ<NnZJfwi@q`N3Pwn8!$hn8nw^U_Wclyp8z7m-YBJj$}t>dZ5`t)2^C#!o8i zm848#88==XX`9Bctr_Wi#xJXLT5FU%BKw^rHS=21kl-V&R{kF24K(o*I=hYBB@4Y) zXS|+*vZ;b$yrS}vX=FXb&rLLh*)ayff}x;jJk^?|<|}H^?vsC5d)CmCXh2kK>Ott# zJi>mJWkK~bWW|&RMLN1-8EOGD?E+QpP;RC6sP3f|NEXw>M3o4y+O3L*Q1-UT`PG@J z>{I>KK9K)e)-^)|lI#U5(ULH)xyf@Z$x!PNbd0Y`*BG5ebR$|b-g@&&Se6A+uf&T* z6*`@@a#6TorT-?1LDVhIqlaLnR~ldN(Y2DfH6u}no@p#WP?VsP$yBb;I%EOR{?c9( zti`nqy=e}*yB-=tKbpT;ubD{&Eg1^YJ<PfU9iv|wdzEHj#?hL@Wi?x^&Uk{%H#IvG zRUnEMPu2K>o>`Tsh^PFBCbZWKWX$~ZzMkoO`rPart;gKQtU)7b74jH~XB#TlS~Vj< zP<zeHRZx?M!cd=iU$BvcZ}yGWt9@inl#2hxcdwDmID(lOL$A%~6`z`wYp%MRc_oXe zxPb1iZ|E-iOrM%xJs0E*4Vjo3@dss$$)6z1>TDKv#SN5UCZ4Wm;)ptzgdu}%jUx$K z{LV-@8sFSsP!r6=6SV8JbEJKk-KyOz+7p$VXNCue0u?Qx_w*h8SFDWQ(XXgSd{Ekz ziEj|C$}(flKEX>5tz4K9)d-_HBTP(zzAZ{Ow4ph2AwQxJjiMiYQ}m-B-BUYM`_fR2 zq(fa}DB5rt-N9hSP>XP`ADzh>(@=@%P(KDEx<=5FgdoftKZ0Os@S^=(LDyz?SM2lu z4`pHYf0U<Pqjw}xYffhO2qSveyd%xkJPh3%i0Mj0ErxD{S%b-nQOq1QqlzpbbEWQN zcAFrj)k;^dn7!7b8451izk-DDDeX>NU);`MRIl_fF)!xq*Ohut=d!S7zGLvGle2<W z3^y}7Uc1|zJ(`JGqd0=WgXqR!UvjIc%EWc)x$b1>LwDDY=4xVR^c}q`E>LkA>n;@( zX}%|V(ku**GVkfWq7tp#e4;s3(1hU}=5Ga#Dlnz13<iZcL))S&!%hD`C#azM3iyhy zG@5<|dErtc=pFGPy<2gG#x<O~f<D9zBspnM8(izPo+)-pJU|c0wI=`6$XWVC+(2@J zp%JaaP_RZ4N7VTtdN9<b83=;HsxT=ljHDZBYeqhhWGmUhJaj_K&LxRg+(f)XJVJkU zdWx1bhB-+Mof({ouT)5};whplVMo|CG-T*Z@0#zM_YDQ;3ek_G8$+XJXY2b$E-~_a z1r3=K#;nQEp!qB8NX9gJsrZs8L$qPIjp)O?5?u77YYbKlUp0JIyH{{Ea5PvJzteXN zhtbY7-_#g-rF&>pGorqueJyUG(S#dePrO~PD`ZJSH|7pzOr6MvVnj`%EMeAMQ9*Tj zrJ0x+=v_l=dS5(6w6A&Tudb5BW%!o)-0+?M#kFd`iB9y8{3?r+cD7)t9cA{mIfupb zH9vE;#uw}>UWqs8Te?EC(_eAr|Lrv4LpxY25LV1cf}1$G?y4WrkC}niU~r{VM=%zh zXl>?KJWp^on9<w?w~F)GK;N9GnuXb+X4h+<YVLxNeuX*RN%uGV%5YXAQSt%TNZYB< zV-3aVN=Y5Mqxsd9`lcSbLj_;dd<8?{%1B|lQt%KJn7;<!CR0=#z(|1dnpEgo;tt{r z^5cnHNGsASok-#!CVo&5F*>fs7A<R4q5;ibTAry4Bfg=yWKpHLN`4>FfYzy9C-1np zxT3ptMl0&TM9^wI`b-?(Xs_Zcirtb7uZR@=mrNp_AwHrX?SJtM!$-tPgfsJb8jnIN ztb{w!7j$pMc<p99`Ke@;QnZf2v>+>9XLM=#$_``O+De|_5_E=YSRrfU7gB`O4&wEv z@jIQ0qKfZX$sDWUTY8X;f^l5+JJy}b+_h?84Ke@fPkjK3N>i@54PV0nat`mr=5rVM zE&*&vs)3~XncactLdJiVOoY>9v3`el^QX+O)E=FIy=VoNk6db~cO`e>Xl4vqLlekw zxR&m%H<9<!jhw*8xIYz_$=MvoeQ#k#_mkl|pInMN$N-!~Cf3o+<HYvdz?}Mk>6e*( zUveLwC6nt_vXsbZp{Gduz;~H%GySN>T`h1K>lhBsdeF1y2P|X_$h-&yT9CtV6P}rS zu=#hvR=Jvf;|GCT5%u5ukb$#_?5NdzZ#+4(DQcoW!|21XmKF1<9c)kUpv!@NE&O5i z$=Eo?%sbLqZYF(+hLL#%hRESqPTpM$Y*2BkT))D7-XW{ycXIOH%)A?D9J~tec{|3R zmkH2Gs}I>M52CTHrMLB6WasSnk9ze3zXq=j^n>oklkc)7(~e%#n=@^La|5cL{RbH@ zy~(s$l6fW2obG^m!55&0?L<e+CJ(6to$k*K&JMgyzbExAdjo3v0t?~S%=PR*hVBxx zSpV5@q_%-vdU<97ll;5A\TfE?f5nRdbNtm|MtC%mNpB0Vnm(!=RDx-%WfMEn`v z9Dhw_6yIA#?#hE?)m}qKlX~R-ejd1nZh_wik7TBhRa290Nq=QZ18<P^HYE6FU~6U@ zeWzBlhGgcKz|7zj>hk|dSE+II06jPJQlJU>hV|$jv^TSwe4Ljvs{_9=S`Dg7cclmV zmHrprMgHd*Kd^@W;48?QO;A;R2$^h?$nE`%%*!EUNUx_RaVqmR`HH>iu-4aF9W140 z`Mv%;Ao2n|sRok|HY%{m-|Y4AAI&^RF3yXAOM<PeOM^`^d&qmb7&x5?o*t%>^B!<N zhfKGYfn8)I)rQ{pliAubGr(WL`Ztg(_B$D$`^XX|>y(}vP05HkhSl(4GN=E6svBlz z`cHD-QDpku1dR=6jGHt4{YrEdyMXy_C;RU?@|YK}%Pz_^C6eZMdc>9El~g_^p25rv z|0Z(DCgX)ZnRy_P;cgqqLHYuUy%jrbh}Bdl>#u%5oegJ_x7rJOe3Bf@%}{bn@|z0j z3n4#a4wab~;wR{undZOh=d+)>aPMk#Bc0DkeaT=R8~BSJUH34@YdJ^WquW<Ua`4W` zR*(J(pW7JvjeGw2<cl9BBl$+w^etIfm*A~Z_U<b9QZ>G*y({0fB3g3c5sTqD@&)}u z#_rv4nr-l%IM(IQsTUn0@AF}Nc>#87mp~74Yt@@`44I^3$ZmR!PGPg?Yup8zR(we> z_{q!gi3hl{6I!88?hw0MmVQ;#?aZ^<WDbrew|X(VU=O@hQHa}#2bfM)@Fdo7ENc;7 zjdy7|^SO>ZwYKyMeUq7v5A-9SZ5iFGs#{~N?bc=XA^Xjc9qtou8(u}<>-TJjT)@u3 z#{)l7yPmF6?t{*-^y8^T)KdQ_X{R1a?Mj_R7G6<$x^uR>!u^j&hc&Vjy9O4q58tL6 zlppMAy+?1_bM5A~YrSqAB-1tp*D5AM_f>YqRo+~;zgz0eagI2n+&piISM1lJdUg|f z40R3l4kyC*Me0ZIiT#wbE4NSHJ$X&@SLNpwY|1|;|Cii0RLlP{{D}Ps{g{S(zooxV z)Ghx{Y3-5`r^BbxCw@Qi(aEl-dlf%Y(z?uwFG%!D)pOqWz6soCzY@MWS~=%n?$Z28 z1)~ZsD7dg-TYg@CgS@RdpT%O)*F(<-U-z51ZPVS8Iq_)O@se>Rx0hU4az)9^l1EEt zmaQyro+wKWboO{9nHPdx?b6VHs9N7AHaK=u?8Vp{u?Dg0qC+CX!smouuzsb!{(Nt$ z`?0epeO0<rdT@G2dXV#(a~pm3&hjq_jJB&s_vJP#{GxKA%2!n%s`_h{UX`ycJS)F6 z=f~)n@C5s*;8uU8b6#?M*%ie*PF{VYTT$xx4Mh`9Y(Lrmbg*Q1>7w%I6ZfVbc2;`3 z0_{RIqC;|S&MVGuRXDTo;lkevocwTpoxDWO#@HLtCnH{Hjny+S)9d6MOYVv%%dRTz zUh;SG+~U`ZUoGBN{87oa(y`@(5+9`QaBs*ox5kGCM*fXnnA0YALhk6?rn#GQ?#_8U z7L4`{KW;Az)(o8M&v0LGeAcr&eI#9)9^&kEu5}l<7ke%IF63XnAH2zaCv3+C<OcKm z7nBy%D_mOeOa7U8cjdeoofl5ionkL}+N1o|-e*o;`l)2SM5=siS+Hzw>Cw`c%RVgM z8}FZ7n!3Pw$i0Pn{m1;}@VYa|f1YklvImEbggS=@g!|DoaX<appS71*J*{12fp25K zmyicJfo=_*-9bS8i}b>DNqUTPx!cm)>W%g*bDCaGF7=t@f__bxuI==noWeKHqZii? z@Q_Qe#3wj8zhLJNpg((SdaZP&0{JauMoy$c#2xJ5TgkOwh#zq}9agpm2hjCAZ1=E- z+jrTw^0?E!jSd`V*}3*nYdI8uvvmg9w0{KO;f@38gIGfL<AX>N$2f`a$#f!5{VTe` zo&k3}<!vAb{&nw3?>4Uoy^Y#>=g=X&7g^Wp9s9Gl$BR)xe=yzCr_r5!E8ScZbi4f< zuDp)g^t*skoW8eVssps362idDQ1<_;NFhZ;1YQY``3$+^AM(^2lXZGg@IwA}p#yJy zI<qIpVP8rwkI&)G%YjZ=pebD&zocVvAL~uJH`KNV*!SBL?6>V{WO!d|H@1&h-_zrC zARS+K)1Ry#-1v25tks!2;g?_2m#!%t4K{f{kkS9L_dGT1ANB5{uXKNUVqM^MqpJM~ z`s04YZvTf4UuSatOF&^cnbrHKbD#9BY-hkWneLgv^r(LqX=(-X#4e;Y^`)%==j=!Q zftNX7w!!r)(Ov8UI!j*2-!9bMw>ZHTA<aF7baD~rPn2k=CGhsAGb5;;&<^g`9oRfa z?q(?!FTUh-zdiU{u%7j>^#eU@a>=W2V>h8kNf}+)zp$RLdZ8#RrV~y(@^q&l4<5^W zKo|6OoWrZ>#`l>&mkRld=yJT2?(uWUjh~AAGl^RF_s}I}I4AXW<k?>C_wjqs1FntV zgq-yHem&~*pUWrXS@#}#33OnkFK|9AL(Z!NbzDw9>v*zUmvW|UqpRyd<h+ygi9A3T zm38#Bog4U&yw@jz!gWM*G{)1QIL-BZe;$(I7p!&ybu}KPLdm^Q@@vS!2Z%l$!D(1P ze)bA_=3PtY=M~lg`l=tdHd>3x&Yw)ab`Ps5{mB+nP2mD^$mb#RR;6p@8^Eh89a#g& zgr(GBD1z?xL3wlNhA@(T4jug3bg3++b49{S^YFa@eaKvJo6l;`r60jWD7M@`1NxYT z#7wUV&aZRXZFeA@d<3>OL7AmsA`13=aC!o1b`LT}S)hpCv86~N3xNH-NTL>J+b8Tq zb?@y5ou5a(^O<z<ZGwzko9+pP^jXQ{onf4P$EdaPNuVbE4R!=OfXR31NwU@2LVxrf z)_S@YFQZG*4C`5I5OlnqKGcoqVKWk|`!ae&3}p8=Vyq<lY?r@;-r!^D!rP1WMExK& z5fWa?EBDI0Qo6Ej_11c;q2@KznMl)F{%Sg0EarQ);2he6Um}5?2L65NFYzvXW*ZeF z99DHIaFlHKb?muc$>m<k{`>_D{eZml7WF`eQ+1;e68sU)?-j@{bI3-19lc{bl|V+& zqxWXGk$PPGj81hn)UrO%iahldK`+>XzN=S(;i2?h=}q=~TdNrv@a1%8|Bn3g3*dG0 zku-WhGaI0}sX%HB@Vt(FQJ?j0@n=JqBUwdH`s-fE-^=Npb}`R8A>B5o>uUqQBb{IG zqfgRC_9`6?sl79q%;@<<#VUS1L{!At@SGuJYu^P#>5hWTb~W<lmHfYfiW(z$+=T3- z&Y<m}UqzTTgM+9NZ8QAJE_&LJ<eb0Au6+_({*-YWQzvB$Jof{-clDsIz>8ED_{^GR zeFR=#qqo^}balVp>S876YB7Qu2w!uj47$%#)Jah{<1oB-J9v5De~R8l7eTdk{1{#M zEbtkj$EycEPeQ{<`mfZd&*TmM^HA+!zY<ySL*f5Z*!T1Cuq)D_3UN~BlW~3{YZ=Zi z8HyA*m{+$TOFl?e`&i`b2|WJ8`Ueqj*c91KQN%mYuD)kA?{b<v#z{4V3Nz!-+2VBH z`Xtbd{=_B0>sZk;I1vp|sHEXpr|6-x6Mp-)^$^{64xt4!4lZIZ<e_oC1f6z;@;!RU ztcM#tPoLBa=-X7CPF-;?$o|XqYxwG#9AllubeKK~%~qk${Y~(wB~-R3%v?Y}=iA|j z?{li{MlNkcX2(rnO+7lFVSm2JDxN{(QFVqn$iLsxLF5bg>v-_m7hYUQ<ivWu`v$wa zKeNdN&PVB1QUJG|g(iP5d---MLY!rNV5vV$FZ(8YDCgu;_TzMeI-hzOTdh~EuI#{@ zg7im)W3K@3!;!*sGyCX?HwTXT6g;FmJhMI=v^IEa&a>+Du*+jNT9~8a?7ISZYd_Zi z6d0cG|3&}O7#yJu6%6iTyl=1uB&n0s4!m6fz8=V~?{)b9O1MiA`!R!NljPYZPUtt0 z^sfNNIpoHyWZ#XU3c~qt>88+8D|*-729M2ThN7PirlL(_c*t+oUMt70PyLTPR^))c z6?BWgnLaHm=}w*(e4pK128^#prU+zqQFq~6&WZ8tqRZfrZ8;Gd`R$;|9-Q!lsZ?_p zD;Y@VmdoficrCrIpJul$WN!xHN}b_+HzS8Ukoga%#{1M<P)B>km(~M%E!k6waJ>%h z`VjVnDPZn(bo(cuO|41URvXz}AG7mc<)rwQU0X!erg8AwVd%td>05r#3fb-LfpoX* zZTCTTx9Je}t2L4Rm7)9lrNN!RuQ~OkhO@JR=&irdDQ0rEPxggyiMCLk4aKFY$I*e; zT{t89!9OnX&qC7a!SieA={=SHGD-S_odNyb!CIb!4^2dCnZuslz*%3Gjlfm?4AnsB z4Bjq+hup^FVII=hE<*QF#P({a??>u2tYL4aGM%B;zu^-rf_2eqPFOYVGoiKz?IBdT zxe*M7slxLfr+qu?7izuK2)@BMr{FSOGttaqW;GQn!5zpXXM>X_ejz<}3w)hutyotV zILA=%aRYd{i1Yhq9%JcPIUl*D9@5+u=zFTxG#ZZhI2E}bWlirfvrXBk4dsX_+C{$U zy6B~?(ep0B0@Rysa&54}DeFQ}cmKj+`lAQN={IF%>&mnP5BJ$q>?iHf^!U5qzRteV zZiIxgj&<Z)^N@f(Wt5drsrqogj&<OUEakL^ubtw2`i$y7bC9@}(u?P`SBt%LDJvNc zXCK7Qx{>~YuhNrs9XqBIHl`=2e)TrAF@`ma<|G})&c2^s;IojKerATsx>Z!6qMKCd zt{yT-cc6F?^**}8Juc#G?=Ndo;6m!iG`6N&RqVm`So?E(q5YBlsr{yXi+wTlRmncZ zDg1=h3F&=E@Ly=^5O`>qnMc2&!JIr7A~CgOpI5>vw3@lUL-m@sym#rZyc=1#9-Qt{ z;C~0_@<?nQqy1N)DD@z}j1Heu*rA{D_#D184s6^7W*$cp`Upz-3yY%ik7e0gOm(s8 zygw=P7IMY!NSKY-CkyFkHx={kKx-A6=wr+~9EydkP-D8F9iuDSOW>n{y@5`nEve^p zP4F~4GL25%i`rtdp^%H9_BPDBDjjK$At7w{zW2W6@d0c2oN6<_d0TiK$;wETk(N8M zmK(4L%}3U#3>A$=0-2MI=>9XSw=aUW|76z|VK1%2DS0m3MBRycvnv{4X;8+j@&-5a zEC>!>Lvp$ospmRti4~=<`6ysM)1G5bXCGW^ceD%b1J+zRr(HztsOeNYT7|4!j9!zU zS->v7gZ<f;$Cdt_RNfjzr|TiSY6HKucoe{a+q0AVLN~Y4SM_e-KY}Z6<+`cxs9n@1 z>x`cCA7J`AzfS}Ghq8|++20=`i|>GH>SUt=)vaqE_K{Ucg<IgxI^nOQ57|AOde__U zQc-G)y~o~Xzhk$xV{{estV(ug`zomE5_`AR!MZ>A9XxtSW;t`{4=p?j?SIUEyb%fQ z8FY;^z3Zv`^bOUHx-h?q$YnPmy?AtXZp<~a`~y%+b!;*|+S7LbSH3wDJ){V!CYUKg zqMr+AJB|Hk7#v?U|8`-wK8il_I9AnCsvuoX-{(85&Gz`v+R%wmr|?7Jap4!jpNH#2 zUZl75%aNjRFg(fLADn_59U&%bV&*CTMQ^P;$o+--PQ%h8(*^X<8|;4To^&JLF?!iQ z=8f~`U=^Ip8MF|2{}6WDtBEPSg^pWgR582=JL{$3DVXUCy-uMT(<Cr)GyA23zY{7e z_HOt8;4u!3qoe<Ue*<$41b#xlXpeN~`HsIM^IC9=eF6R8L!l4sjNLQ*Wn@k?7<(~# zN#p<&zQO*N%1aMeRf9DG!!rZ?ptsVw&pF@C^>V$F&RgmBXw+f)`F?_~e;#sw06XTO zz)eV&^|8@z2wWb#o35d6Q{877J<aK-mU+{Ekt#!1Bdf0g3;VqXy<y18*Kji2>aBB+ zy0?2p-ucWnL*L?&U|}&-RTKG>h(UXHcuV+_(Cv2LP~XT?v0XWHa;n5eM>d74MaD!% zL?(n^vM&ziVfQ{eQ{8{o9qT;h^mLoLAEwtP|EBx-1a~hT>!#7cZyFB94>QX+>stjr zfWyWEZIP%_=)V2XB)g*Bof)_dJRhgh;$4}c{z-2jTJ>J&Y8#sPx9$P=ORoXd#2!O4 z@90gVN9F?m2`pIevWssFr0n;@kA>RWAKLeaABh&nX6CGl^^H!7oQ~{|JRPYTNrX09 zTj{)e52t?}{}H#lQ{8#R>FG>QeN9j4H=Lw1)Y+SE<g|77(U1G#%n`o^GXL#pLT}Pt z?W^F$!PV#nmtn1VKKLrDO=jkCK70z@FY-Ha2G692@F3>(IQ*p>HnkVrBKIEp`wpd= z-eun9UMp{|f0xxd{8nhUwbmLDY7*_1^H<KM*tOANk*3jb?33t*$f~d%s&1{##;8ut zeBgcUM4Z9SLv-qGp1LQsBYml}CVffz>+}w%Dw5^HXn60_1#?uOLC`^i+ZyN+Y=Z7K zi{5rCkiH+qPI`W@ZE!Sl>i5XcwXh(*g4Ff}G`feLn@ilq?f~oq!|6x(y8E@;)w?|N zTW~)zMlKcYt_rP+bd2?keH7gn`64nb8ja<|PSfXdoc)Fswic?^UuK;*%C+e_ecD-< z?wcN;PNn}z_evj0{hZzcwsX9=`;*(;>+9c(ZF)O=zdk$33ycaLp?2I`&}uH7=MJI` ze-9T`KG{xA>j-DhFf0<s=%H<UDfdjQFTc3^+(JAX4)Q#uvVzaqq41_~EV4YjB>Z}$ z3tfxPi55gl!mo#3vd^Hi<9_R4U{zML*y3$)zjbOk%hT7So26Z>r8Uy;r`M;yO3zCV z#@^YNuH}ooGm%t(#1Hcw_}xc`@N>|^??WFy0q=f<DtdoWFY%LL)8Is`zpK!NJos1- z<S3t>(fRD3Dc-0|53Ffd;{&-ZINSQ&4u;;q8r30Gn-1-j!*=+M&@Xm3`*N%}rAQ0w z@fW;|e~Nlx*x$Cff4c9|$Noj<T;~q@c$ZLrZyx<FbFta{!0a}9<NXoHm=lo7PU0nq zk*oJIvSM>OWnO~r*BjhYLChcS4e<8)_XU&aU0tAs1=fVn-0;G1!*EGxT6jX_aAbMp z?a12j!*t9XNHxTM*b%4VKlm6OvVp(ReaE@Mnd(e*>N)SESElcAes{idUUC*YGu-Lu zEUUdJmXceM?#@9U3DCQF3Y`b%1RGLa?gr~OY|Y<ci<^lps|Ws;Wt{QnW$yDgz-9jN z?)5ggv)nJ~2wdiTK{xIKpDLti%U56vxeaS@_sF2g&hVn}<&m4C-|$FB)`i!ElJ;i% zPdnd!CirEhIo*rTrYqxfZUbjQx{fo%DRAbbkEU;R_Bl1&9JdamzvW3v@6UexEYl6? z^lNy^2yASd&@Xa1VUHn?KS!Oly6o96yp`@XZmzq~spD*S+Ii1;Q~eUO-KCj}tcyeE zhfjr_aIHwEXo!Bd9dp{pMn=zyj){C5p2fUMt>t*U=AzM@^4ELY=>q+t^AWrxNN3>L z=|8B5Hv@a@B5DT4osslO|ImHjyA$br26n=J;C%-k71c_dh)wAnsvmBrs$GBVlF{ID zJP=I-x1+uNh+H_=JKHPa`?+o*{mZx0ld(&td1iiKg>^LaOn6f0fPHglN%&IwFkcj% z9GOCg*hqL#xLtU3=qGCtXWa*Z;lc5NA^xlGQ*LkXCU3U;jpL?UIy0$kxDcE16z50h zJ%0B(UETfk5#2>i!joQ!KN-55NoV0h*nLXy1dIyiA|L)IxEt;4Rw^Y9;Iu!ClrbHN z<4v!ZyUKaruWG#?EXeHl{eWkE6uLtp5~18szwlR)s?pt%A(4Z0uH9sR68Z+&t&6pl zzM{3k&ews5{M+0c+-cnTarYHxCv$n+dB9oje9JzV;4X2`b&omExnFtR{lipFtb%Rt zaiq#Out5HW7wbp-T{D8VH6Op_8em#2xD}~>5c2nH$Qj)^=cl-qTjD(L{Sx>*I5{)W zKbSek8XXEnUJiE-?XvfU{)}{rosRw!nHs(?G%++P{8IQp=t<j!ulET&K{w22=o|ir zlXe$V&+}{NXgcE5ga_w4&pDS;Epw6cfpd$q)``2jkacFeS9;t0w~;X3#MZPXFe2E4 zN`o!2B@DMV1Yg9~UDJAp88!>ti^OvVI%s?UxI4j}@Ajf&_BwYCXX9C!^XLVi2tE~h zB>Y`ytG&U_3EvUzAA2qOLnIjK8J-p{qz~;w;ijQD-01DVb7=Km=7_t?`P_ZQYway? z?nw`Y0vDy1r}w4Z^xpLLbZ_TQ=PKty_gyU8%Us9(k6(lY`zc=JgMr8By`F>3@on^& zm#he0%VyRE)(gSc;7~V02fg7BoxMTs{hVhl-8^TIv%`BC9pNNAX@8)feI#^o`0LP@ zp-aLiB7I|1V(X&AqmM<>;U1BZkuxIqg@@SvgAe293|Y$qOT2HKD7<ci`zj~es?@^N z?o{J+<8=M>%bXiS(o^Ys+|+I0{R-dT;#T#4#;ZFOO?g)!gp@o8TmCuN^=sNsTMt@` zu=(F$4G(rAlXesG?Owl#?>yy>aND?3ov_m<eZ4cw>x&-Jo}I^uYEKUJ3O5MHL$kxB zk*={{V>iZrr`!4ckvk&^I>G-Ho^Jm`H~RIQM~?+s`~8p)H`8ajnR8pZa{6ehBsDQL zBDExS4gJ#ZOm|L?NI&V!bS<ykEkKu;<&Q^ue-bY9b8u<!Kyb44AA5oQqP-4#(RS-> zd#U9Hi;!{#V%3?6Z}m&haZkHnxwYIcop#PQ>0Rlu?nC}zG`=PNfy{>BS)r5o-MWVd zhtG%%iGCF;$XOC?0$i6O)t(>uFx)8A(E1K;mPEE|l&S5_aQ<-GyX&2`bdRo|Zjo-z zjBBQ+r!S-r`yi((62zPC2VN^Ir}dDmbFf@r5&SS%o3rf}W?0Mq%znYHV&7zK#jf`+ zRWTn649HxIj<L!6(fz?W%xc@Gze@E=y_9+{-5r0>DE~I<2HX)GVYd#y5qUPcIGPu0 zkh3Z0k=(+(uX69nnI5|~);d-eogG;hI@kUakHBsuraj&m_X_8ZbnEnzRHfAA$*&WA z5~C7dCKe?k$v(-3$@R(a8UHe85>(O+ZK2FxkA3F^UiUApyX_LYH}d^hXn%b8P<U~8 zM))pxal(GxK5gA@jicN7cStyW{D-~uZWnijbB^;0XMX?m`TX@$SEU-K?n`}}`Y4@p zH~Pb|rPT<O1xJP=(dDt`IdfyL#@^2f<@Ly)mVaH|-MQ!F)Qu(R?VT5`8eU;7!Jj+@ zk5)VHOy}a%^yKhl<zy`JXuL(dU;MK8jqy40>k>aFo=Q$ktxUB`k9JPFr|IVWY$kyA z*TCv*KOL%s6!3ERhw#qu((vkVy+~iWIv3e**iTw71;4?Yd_G;#8+Z@9L-6hXnQEH4 zBAHBFoVX|cNBrK@B(I_W3|-O_{y3{{_{C_aoC(bBV*HFl^ZOO}1^x1O<@U;{meV13 zR?Y*_RUx0<+W~oSv_H(f+-Z`2E>$D>alE+v`gnePL-~aA=gYR2-5Y--kxH~pUYooy zHHnj|78Pxu##jD8pk=U@{ZhycMZ?{~?{glX6WtkI9rYvQBHJRtXi@k`=<?7S`=GUo z2#+_3p!mjXgber}=ce@EsTWcorCv-;PTiZjIJG~SllnZ>GkqZaO!}pC%y|Z$-pz{y zZ?V_d{pe>tC-QLYh1|{sy$asT?~=bP|7d<${{02@3U1E(JGMP?Q{<cQvd~9XjX;Ul z7H(muZ%>|==o24T{%YC6(z8k{m(DKjTh^nzMtRlpbotUmqtvm~WljKD>1yCUIe4?3 zvOf=96K);(HDblQSb1zrtWWIE*os)ASpDeW$QR+ykb%nJ#s6fc`WJg$@v1+co|Q@` zZ%WomZb+<797^m-<RnKW&rB_&Pko2<U+L@UxcwlK%dWsJp#ew-&5%`^<sQv@q%c}( zNny9b_X}DSRxdoOu(0sV{64vtN6W%h@v^qJMrQ8ues=uSdC3dnPT9?6Zs~KS%}UxA zKYF@N@vS9)m9{T?wd|7eA@MH~kEgD6ZuP$Lr&C>jesGa}Uij%qIJzQwSL}3bZq8x$ zSI68ha^KATHs{gU<Y*D6>Yd?Pb}j3rK+^B$C7qj`*V0W=%M<U!uZZ`J&ySbJzlzU} zS4tEnCnpajuTRxUw{z;d_qjo8NsmL8>z<hrJZWDMni9S{mdu%)+dFSmLC3;Ig>@^9 zt@KZ&_Y1Er@be4u!+F=_RErIYJZx7F#<Bm7ar4rZl4IkQ%fBi8rlfnx%Hq3=>l8mx zd{4>960hX)vd!fu;^!tSQ!{xi`(Rk+!C=a|CiH1|WTXfE;hoqOIpcHOoCdiEbH2{G zEN5wKMzl2Yb)-D}Rp@$qu;m3F&D8aqQGvOUGc)yNGMc<SQ563){#SfwJeGJSF)*2z z8j>nVcXNiiE>g{M?|mX?#*_VaD)2D%l4k|~vX0mjk%XFsdqpmbg>(PReLZ(X-WvX| z%d_$u=C93do*T`X5^WbL!E^nwb!A{0@kdv<%hC@f9Xi_=mrpNGmfcy_rS$yLU8Nh! zJ}p05J}bUCk(2s5Rg`|xUE!_s!&I&Q#QN8MIdnYKCEO&Ej+94R#<oNsLUJvSToBz6 zsT=7X-V~}H%Ck>mQ?DCr8aRc<knnnYwcLhCuFs`=!llnk&x0>rnrfc@fy(0}ok4C# zPLpO>2*R8d&vBl77Cat26?E`PEFik+020JxG`fEH;p<v=64~*ReMx9GmX8m^b;D6C zAN#^JBMZW>hkJ!T3C)5t>P+9p8F^#oUo1&MZ!pr@lT<n{a2hy2r^lt|us3Tt&Com! zI|JR_Ky-;W{QsCb3wWujFW%3IsoO<&cMC{2NGbx7BGMp;D5-!L2qK6GDhdcHpfo7m zAt0c1gOucj+jn}-nfG1yy!-xd=5yyxoU>!?wfA28w+ic~r&y!iiVQ~Q7qTUC^6AQ{ z_ab&p2hd4xQ64F$*ysM>{d|z<Lg=1vV`(-QJxeX@g${zvbOfVUk+pTqIZuJ-6aXuE z9RzS0yY(J)apL{<2y2+bAShGO54}sw@T%yC9H9FhIMX};^*I7Uza3PlF}U<+pq_&{ z`%O^(R(h*v)LeGe!&*)K9leh}N&i6~q?gh!q92dKuHmV&P^qGPjV;;7AoW{8F^Yjj zturQ~3I7@7a<1{d@r&^*r{MF3VZ?KCN;dm&qT2{|nU1b0k<<LEwCgbV-*$8l;`JGg zMp%5eC6Y%gG;39`02062>S&;bpluqOm%;u+B8-2C955frOtd!BLHyfuPLs@c#X-2m z*83!Q=RPbC-s9}{GCG9r$XFH8kyJ+GUIOh#c{IHL(DO6IIDZAaHv?OqS?Faap*ySy zUic^a@ei~^T8v&nFQOZub3dWONzgW^6_CMS0Hv77`Rnz_Q#4U6z;mvH*Y+~%8x`4M z${LAA1*5!C7fXPd%$-c52pH8D=rl^B%bf!bdlsEaSrD!U*gd_9<<oq07pu|6{Ddvo zSKu8>(CN=W^VJiaxeb_kY4n5{;GL4aQ{q7tz*bbS#p3L0;>9L5t*M+?8*(0b1Xf*= zxIQ&NPit}ge{ewp7M0JTvgjSA(CTL3mgT?#iy|Q#$SPaS{UAVP;g99`;8q1cXv7?M z65V})x*aUCrM6Hzt3A-pX}@Tn5<$PIc317MKI1gnQE@0M@kRR(p8CvmgU);fI&&Wj znaP~|dW3t0yM;T3M}<#?dm8J}Bv)d795HKhx`+Yk`v#jsmFVSFuxDsOtngA;H;hvz zW0O%7t^764uBn_qwldxWLEFot6TgCP@<&kY#UQStL0OW=*Bd~(#Sc6{>&0GH;=Nsj z|Ifl-2f&l(aUNXENpcYP{)aY5GEH=X7t*oRYZ&<y?td|I20Xebam{ZK`My8+zYDI~ z0WR4?QP7^3)lO<R!5hl!4fQelXnmlb#L4*=c;Yz-#x*pRBfu=)1uLCyZU9Fc7xsi! zbG~{VWT|iHozU+@`kw&$S&TEVn_b}@*3waE7caBMy@fPb9L=>!=7<N_k{!Z^roWP+ z+~D+jjK48xQqs_^&p?B<o4z!O1hGlDNM!n4xHlUMg+h5&6<DHz>35^uU!!XefG}@H z>$e_!bpu@WD%PjB(9rBaCp#7ds4>q9Ai_!DRV%ULsEc-PB*=C%=IHmlI}Vb05UIWh zn)h~CEv!IG-~)3Rrnj`e=16rM0P{QI*zXwUSl}q=SZnW~kI)u_SPi%7kt*iq@a53` zV8>wZK&rpI|3}|<zU{uSZ@K@oz@@;1U>T6$iN-v0Y~(ZBdSxW`c-8dX`hR){`!vpm zKiI#ux3?GK>^&Em{$2Gx);qHqc}Jv%`K!?itf^l3uh8buo1w~NQuu%@3h|trZgMhv zjrH_i<Y!w;EPB?coweV!=UTMhTyLcp*B@xBuy^@JeWJwD#;e%n%>~&TVLS=1;O<)C z=b=AAIbt{qw<E%SIQ*vZ)ELkDPyrp$O>oqDVA3CQZac@Rqp^O|e$H{hx!N_+UEdw$ z4!DlG-f|^z*4gcN!`@B{Be#`^3^ZN|-wSpMyypMRH_`j6XOKtryx=+PdB>aNtM4xo zxDvP&tQUS@ycY@Cx~pGkee?n#BHOV8{MdQhdCWQAS=c!PjHaf&kp4`qu9CIG_I6~7 z*~h30{_6_;9-I)Y7EBF%8koecSp&p!RcJUE!vao9pG4k=vb)sbSUP^Ezii)N|JlCY zzS!Q3^KN^64_c8-_7m(EB6ZC7!T$z?KM7?7w{q_K7)vrQXnpI@x14s)gl8~k@0ec` zE8r(k#meY_{!zNC0rjl*t=`Z6lOxJC%JruExw~!DZ1+L;F!veP7*}~$LuY^cM(sSO z(nIECqj>mEFy!CvTj~A6b0T+9?#A5txpAK9o_J*Mcz>q9OmK2YgWBZyQC6xewRiMR z_J$7KIm>A{OS;mW%be|;a~%neIkf&XYtIg4s_kgxHu{YeV<@P1a_EPkD|jMsfV0Pi zKviU69gJ;2xR+4}oa$~wVXvx;b=L}XEW`C|Jq5XU2|HR<eT?SRmZ?`1JNC<$z*}09 zKcbegkW=^>PId3_{2U}_XQ)m1T)2#J0yO-**&7W`ENk{1bmFh7F6~3DgI>fw%)ZSr z$645Q*!7<Ku4|HOx@(8CwzGya+wqzGeLYqit2{(YU%_-5QQ_}`(*iU6%Y80i8{aeU z4sWJcMgCguo9!=5`!6z%lf!$BtLCN12HQfVy6Vt&Yt69+9Bv<CpJ4yUUeKPS`}EU# zWBmks(jY9E7Ai^L<#yYU$U(H}kBo)j&6SKWwyK|nmxQl|v%)QnX;`QoGCHyY*JAgm zizaLZE9`S5kJrdCGYwn0DCG(0`w!UaJjS}C13OO!t7jOU)gX4RT9I5cnjNE3q%}Kg z19p*a=;6LWBeI*_q8}^vYN&D<>yBnhZKas95!-@els*RCZb$V+wUOFF{ZHwKHOppf zlN9986g5qGAK7M@QdoHz#O4!ZncvOztU*rn5=)Gi*h`8S&%%|ADn<f$MJdAwHv_Nz z1s!jOQ5g%tQ)Vf2wx6>u-eJYAhBUCAd76q1*#opl3CL89$aGU#DTpmlE?Sz0;P*GM zKiZ2W(l#tnwz1bvWQFa6rm-E^fy8JH(&uB8IG<f(0yYqh*&~WZ3bJ2R;;#YU)Wnvg z6PmxN?5BUQ&-|O`?I9j65=W>WQp#|4^%=-&i?R6rikY(<JCgaxEN^4gKLq=ke&{qi zAhoo@I;jH^-D_BCj6nifhYeg2ESCnb4~{2K$=AvXvYmXxyOHdT37k0Z+xDSxeg$ik z<7je+u^W_O*Ez--J`p{A2ke)cp}!aVyAtSIo1ohqiKcUbxd^+8-&xNx8N>3(Ud_>= zzr~)oiWp$mutJcSJynQyI*L}WWam49ePkB4B04&*FbJhk^Z~RxiuL3IMpklowBnAq zyj}NtUVM^MAiI(qdK<5Yq00>@BYzTUIT!gwJa`h2?rK1zCP+5z(Vo9bIbEPeJ3h5X zqbqryC0=Aj<UolnAQ2-Z`k+Ls5U=+Vd?Qk!#8k7qwL}84V)jV%=CW8&bO4urA1eI> zH|)lW@Enr!eXRR$u_qqGu4fsR*+ZzUBHk?jfugTKb3TL-tqpf8aQP$iCj09t=DOIM zrjaGZfxTT(<i|!x(7lncr*Inj3fgUjQ?5fjiAN{?%#y9X237)1=}CL6z<M&v24fvI zis#$Rsj+!hVuKm&0kl!9#rnZ}uc7(u3iruhGjyO5VM!t_h!usziI5nz;!h;rixMS3 zyb{H8*oxpOF$~0$$nrT9??bs#{D=(XOz}Ar??3SylE@E|aYJ%$R79$lOyBj88XNGg z9#64JlSm#C4@9D}Xv_tP7$9*8B+~0MUL`V!L^TjgfAL(iA(cs-+9LG468un!vg-cd z(rWOjT;6y|1R{yAk%@$M8-A1MoF}0C{yd8oiEDR&=OMV}1hTtiA3M((<_gzc<0*MW zBwpS%UM2dpWIU6|s?r`Ss+086@<$XeFNx!o$e-i@k+=z^Xq(v9NEY?#$i-C{Bgyz7 zx!|n~>sDMzX|3eGk~le5HgAcrU`4C5qAZ9vn)sbr-qcof5%D*(a%AWGwu`U3_@oJc z3XR0~OFYsg*Mvlfk_aafo63r?VtJQ|SDD0skvSrDNlaeJn3BRXA+I+Qn_aj<$`*gN z{IbQ*Od>+dpX3OUagum3k_$w}O6rmrCgP<gUa%6UL^wozT_tLT#DfS!J$dB&30j_u z!Z}v947pFru{>nOd)6w+^1GMPEPs3HtMHom)QRV(c-+Z|2)*Q!#B>m^JIg;*yd-t_ zLgP=oGV{G4<-c&2^ie!W#ZOUU1jsqZiV-1kRU{&uL?n`EGFE&M`Bi?mqGVhCf>Nja z2{((kqm(NDrG@eoA5!rGl=lA5qtx;vl(t*rDD+VB?v+=|pHWJXE5vtJ?iBAv%ga{g zolwH^KhFOo^HF*vcgw?yETHC<Dr0Z8OG=PW^59rc8P+(<7|AEO>wj&q{Ey`~nW^H- zZasv0`M$)Kr>cCGU-R$I?~jbJ)M$C4N?p=2@qe{^houeHESLM`Dru*6xA39m{cC-1 zl`XB4_6tQUUr>1`BQA9Q-~IBd)oZCkT5EaQN^9~*N$!{Hgy&@}gyu3f)`-cd$vb(9 z-={=8usF-QPew=Dluz6Ik+!avJMu?g#xOsklK7+xS4pHAc`x%$=Do~3`7CV_-je#H z28-L}zqC}^DBh^zza;Ims3q-@hfq?yzO6rNY{jcrXl~6y8Dkk`%LiQifh9(Pd=hU| zi8Unaym*gVW1oMo++mHlwc?0pvsIhWRs4-*w#mKLeqeb)3+2UcT)xX61B=gPoUDg% zME=<4bEfs3lqvPgXbHDkHCntYpRHBpe^=%6oW*VOy~X$PS$M=+59HON+W$B~`lLg9 z*$*W)n9$mqIr82bd29YkNit$GPpr5A`Qsq#fcT$Fv^Sx*^iIZ4Vrj_?mbFSE*vl`n zlI!e#5^+fOuGqY9G%P5Fk!fr#cvU^{o8Iurbk5~r{Qc^%pQz*#JcQ2mTP&K=ur8c} zgiss5yN}2Zx-4(!tAJ(vOYFDF$WCP_=`i+U?}NJ?WmmfiLbINcEx}GznjI*B@6A_O zmvja{-^~@z$av}`6YUP<DWQjqS9$iZdPqeQ)mJ$1Io9JNkusXIcgT*}9Hgv>Z6)o^ zq1;?rF&ZR9$6~w{eiYxc!&YOrc60W*iYMRuAT3pF8)-#|^TA8B;s8j^aiT9bqlQhi z;sGmvHRKh^^iT$yJn`y%0opyJ{8;W#v4J_wz9YMw>~#|7uq&QM`=HrfFt4iIc@JFf z0X7`*wnLFS^h09aH(<Q}Vz-ybUe7_SlJRe<gfuEyAl}8oDh@g6EBf~*qnZw0Cz0@9 z!|!!A|No?nWaPLfP<{}SRB=Xg1d@G6_@x?cYk`E{ox650PF3+XK1iI<2grPqxwIH9 zlAIQ+D5Vi{Z%_7r7uv&L+3gx2WtU_`f1~t{JeyPdSJ+pNhDt-Ayu-GaGIpV1|AaQr zL@qplPpd--gD|Eb!w53D8@w@zk;*~xT#3x>LK@u(zE&Rn`J_lcB+*Lr^(6fejG+;h zbI-^D+!x-sjAYaV>Gc>?9SrvIdgPd`m-4o)Gn&oYCXs%X@wR42^2;LQk#0xfS-gea zelc=xMKp`mBR`p|BUzj!%GvgtYtbWLx5cWPZF9{-M(@Z_<#RR7<}`l@zh<_=i}r$T zj@jS1Xiir4s8f{+kq^veoa?r768J50h4aEe+ih%~%E1p^ZAqL*>L{y0RsUpsFF=vo zAZCq0;{E{Hd>2Vt0fXEJzn13oQ&vgG4?1EtfcrXgDk`p|+1>z+EylU?3U)~iZL2ty zd~O?|%mFdEX10m+1P$L8*#$<n25;tSN^#p@bEDBFa!R?W-nXp<L*5;kP8%B71|hMp zj{M4*=}*pRMaZXnnv;YZt}4s<rXy0{La?h%SSQb8e2-yK^A{)HF!wygGk6|rObf8U zjL0I|iN8CuVJg-b`#2pAAe-?yu&F}$A2h@>`!giYxp;_|LSMg_`5@VKe*z;M#0ly* zPCH9M{>Q<;lR5p)XGTcIkRRZL1Ly=AgE<z0bN6BaT8-1oGkE+Uvh8GA(4FkTTd^(w z9$W6sNTNUB%cQ`wlc>uBM~&rdQHV8L;?`x7zw&p^W$!TiW;4oL;LQ<{OtU3c21vGe zqhX`Qm9^pe53m#;#~F7wYe5lcvWZh@FG}=d8z#}~vzZH@F;91ZqJGbOxCKQ_xaVo4 z6K9f9oK6yn+bAn;an_fLd7gqbD5pASwT5{1-(YS^v|5RuE?&67JR9RDj6gw7Gp}-n ztH`e!*T2Bb*n`Zz7mMTatRauMLwtG*v39(iw~Ab1#XQUNFl#{;vj1)VA7S=YW?mGh z%_pJ#DQK5LIcwmr5n$B&x#w%n=c70QpJi5~!Q{UVZ6D$#?FQXD#QEVVcb(!aFWD(d za2hKEo%%!b0i3r@C@XPdOM{!w!(Oy79!$*`Nr|A}3~R(X*ffm<<+`Mn&<0^qzg`P# z8CnHh(_aPg-JlLvTdQ7hh1Rwo;X)I1KiceO%nd&aO%7EF>7fh3*Mq^pujpwH1)_u9 zgQJ62gLSdF@rL$=KQP`x|KVU3Xsjbg@kN+Sp3SD<-@TL{&_%rldeT7Ij#u1GR<2#@ zFX%u!JC>jo9`E?k-7flAlq2dV*9zx;*Zb}T?l$fr&OZ8FYzdpHeU#rLJ&Y@%?BJxp zIA74)-uH&Dh;NAJSk7NL-{&^*9`~)`a{-_3-xin=$_)FAjo8Ci$0DY^nxIzzb!~3H zV885m%NcRja~*eHa*lD<cTBO5u)k=3SKq8QMZfm3`2hXKgU}Q-x&Qhb`)^}c(7}J* zm+af)t?Fy$zu;fw|JuJcuryc>>%`B@P^6PO(!SL3w_}WZX7r?(eQ{+Iw#WBPxSFs$ zentGi1b6(0v4dmoxhuFTIN!7@S}P^PED?SyxX!=LyVNrv_ucF<S-Ug8%ea;?H1qq+ zrCHmu=49D(p67n+t>_;f7#RFJ^s6x^(noP?ef1&sj~vIH9#`Y29Z`p)N<<eV^jO>I z&QTuM7p^<bPL4<V$J%yqsdbUn#yK#<(Seoz!@gbKG|wDQ2#tLaPcu(j&ySvuJmtJ^ z238p**(G1IeX4w}FLHexJwE0wH0T{-OT?XyUzD&WAt}KXXGX_GKaEO>dc#%Ak*2j* zd)mTAz3?lc1;K;<pS?43_h;v1=jP1FotN`G>z%B2*#&c#c^Y^pcw>FF{IdeBLeIm~ zOrn7+IZ8uqvVP3|z%kgl&Dq`c06lsISC;cdu+&1%a`qnDCOja%Q{ruVjp%TZP+FjH zptpaJZ@71fXKwBX-V))eW_-9qXj1sDIYn#iJmDDNnCe{O?BxDAx>n2@bpP9<=DS{S zCqxZ!mv-&6U(_~h2h>Kkcd#Q@%?IJ$p;!HO-zHzOzY@5l&6}Eg!t)RM*c|@^e?fok zz%(q{T4NbZ90Ydp(P)9MtKVsL^(p%IdVPD2eUtr7`(O4XM>)qh`(3R9eki}-^DtG( z05_``>0{PI``<5gHP|P3oR-gqZ{qzAd=-2n{4<QIk-FHf*Cz(YEBYGeF-HyOaaSML z2kw>82cx56I>$_nYVTU$N^y5~4RQ9c$6!J8jq)>I_4UoU;Wm`n*Wb){8V!TTm+2eg zUFBKnE#j--e;8O6s26Yq7X{CSJ~j%nPu*pIEkX2+Hrk8&JiWVqN-M4Ruzzf?Yp-bk zMIWaZ&^2v}`nx(4I!{DI%rX`k4x@e8i=H7Ahz@-0U+#AX9)!L(_ZdsYmfOs=Ro1tF z&wmQ~JIlVr>2$Am?{&ZDTIVR`xbFx#PB_x-d$m{9HSBuT*$b*i78;MSaI1=~L-*j2 z;H$x%fvx`T{xkk*fggj(*j!e{hHL=HwaYBbjz13#=}(a}Hd8sOrecrP9-ZtUJh1=P zQt>IPs7+uE>ZDFW6t0Kg)kVA|i$+G^3A4~h!(zBx=wIw_&!fdZ9)8nYj@`yMBA%2{ z6!7X-^%hv3yl3C<IPA=HCb|-xF^-4!DvnKd-QG*jR?Da}kZLv%Lt(x7B{pAvtnwZO z|3s5L56hyz0>=Z1!7{;1!TF&*p%=pqvCb@NbU{}#3pw&0lHqyV8(7Hp$0qMhJQ!!; zA@)!$s->!1)M#}b8id2jP&~xHU>Df}nmP?D>yG9sBgq&N-V<6A>KWdIUG7O^l-UX0 zW?MYEZz(0vWX#q#=`)GjFd7ZfU-rMz6cx6=s`rBu?a>q!QY$KzuzBwmxrr~}YIFn3 z!tY_%xjXb-=zT2vmxnHg{tHz@8~Hx^$SUZjn}M1hG83V5Hk3JlH`P;C{?CaNagG-5 zCZG3Jbny#8W2@t@dltE`KPy5MQc>%O7kuz<eD((8C$i5tfOUK{`p;fwedNZc<S<`N zCit=VHh!jE)Z+D~`VhUR9$_DO6OF@HxLtgZ=Q|K*n}&VsT)gAnBztu!^O-@614GU8 z{40y!z-!o&pD;BvbxpyWKSM4>#zeN<kBt5u(!zB7h(;reH3FTl3V&5c-spfN+6#pK zZ8ZM#(f0kC=g)+`1X@<l^I+-#COHj6dMCTjDWs;$_~^zd^_5n6Xn7MdWDiFZ{w`i) z1F%VG&CXO5tyvC|(f453L)kw&Q%+eZk&c`s9%);sV;(j3U^nc7WZs9@#^9+n*j2mW zm)eU~HG-S!fuFw!W?hF>L3|8F6JH8XsM6@8E78lU{N4g@=hpOBv<!3TZzd8>YdqoB zVk!Fq`hpGE{~aUid_ZxiPG-O@tR&XtA>`e_$g84}{udci{NjhQ>!%<U9H(^)!RqI5 zRvU%iS0|p``QMA0>QHZW+SC*ZCP(6t*AwwAE6=BTw6iVQvq$5>`Z0dL%a9^}MV=IN z`%mNx!6GH|l*XAwax9nP?1V))GEXzOqyv&hKj=J$cFdzS%fX`ez+*>|LXRWWA4a}j zi>`km(%dKP^KT*#wE&MT2l62C=_Qx)QO*EcsZsoBzh=C@;r~xO*WjVEmETSv^;|}# z60A?+oy*BrvU5pW1mTsu#ubrr1cQ|<80C?uBu=wrag^xvNt|D;Q?KA8f&@quD~X#c z`F%uQlz3QHgjR{wF82x^SrDmG@;D3bCK!oCeUh`Yod4xiE)nb{#<gT!c*wddSq^V= z!uc18OfoOZw~{kNvI9z9LMz^L4)x0!UC<T5ss&RnPOVn7+x%$N5?M^zDRKIq(|7T2 zyF<AWD_&mZeJUl&`O}J`E53UcS}ItTAUG0{RPY=NXBDK_imhzL6B9JR!VCm!5>!F( z0Ks@I3`p8%{Vr6qa4RWa@DIT)1YMA*y>hi+z=G;Z%q~HM1ltgdNOC;=4{xz>4ncUN zrBbHUEGURjU!tc9QYASf1kn~uS|~3Vs8GqmSY?z1brKXs&>2D81l5q%$a@O~m6l8Y z<eY6qWwr2aDM?yvMGUoYHHn=jsE~ypNu)Btd`0RP>WWUlij6I?&;<Rp^bLaYN&lo4 zp|ypdS?}bN(8NOiBz~F|`8Xeumh87OvVw96o+Ysp1&Ndv2;D6FPH<KWgBLtU`W-`= z)>v4mm_%6<^g*5y?@^F;iT7w_&=tHZAO8^wOKUAeT6kCxA^BvXc@}PGA+;7pmycRW zoKcCPC;gQc$vdIH@Q}<2DMKRI{tpq9F|<mxa7h_uDNX7STvJN0I6=nDLgex}O0JcX zEZR!ha<7G~TUe+?AECR2N?KT?g-lDm`M9a{Ra%&zvsSP&LCvjMAzUH|r$p+uG*B{E zBu=k<BQrpv@5v`AN7`(0ti-aj5KJp_rD!{Z+JZ`pK1#U58b=GilrgZbmuTCT2ExKU z1@V+o7fSHLUDm21y_6Yd#VfSvE$E|#Nee0{_gS%4rDows(URqlx!|b6NAi#><+psy zQ{r}7Wy{=?dM!NCdT+H`zLSTvT3RIk|Mw8g@PDHxw3m4=trgyoQIk0(-v~!oIJbNf z>Ivt{d+CkvfQ8q~Z&r!cJL$J|mGFX9qKts>j)jL?V=rSZwF#&F{}D8;UP;UI-$|_& z9fdP3ddqmqiYH}SyeU^mrX?FIO&QRI2J9RK_$0CVCEq~?GgBva$5YncD_{t6#+S8O zvO+w_+av$uN?AE%1@S{N;XlbGB;{DzImzo*h25$=`<Cc;Wp@(oj;za~-4O&<S|O;p zlr6cKGx#q#5hORI<k*niMp`55zSLxKm8_4Fmq11<on1#XhO*DdT()wRX7Rmbv$b|l ziFhyjr(|Z5+({CNOfq*_+3h8plgt;HCGwCFvk-OR1<3{>nl{O1Ag!=sKw8>8;ZCVh z_C}$uJmfpsn}l1e*(<w>lV2<@5Ivd|)lx=M=1D#$TD&S_WUVJsvW%w0<CO7|St0GR z%C<N{&~Pj2wv;KHX>puzleOl_3LrbL^iXEG)GoVTJfk7GO{|Q$5)o4}(@I+;ZoZZE zURGL}<<bsIqbD@7)(LCplKn<jN9n2LGn5rVUL~)kWZS(9s&o#C<|q>1ek8VIAUBdF z<_YDx;k-6ry7STK|Bh_84jgYGr-zR~tjB>?bq8~+Kz%vL6eqZUD-zRBcvt-hS~njY z?R_NSPq60r7VPL(B<BsFxVu1{4pGlv)btNHrewR83{fY*nbsq7{Q)|*9a&HO>OTj` zAB4|)A<)pZ=4K+^d=eRD8;DKOI<=a%P77*{I0-M%Kft!ij<0bY&eq~_dnYo<^n?SU z!5}i*u&Y`S?2q5j(%>E9h`GX-!ao}$&89@!tf2UmbLuDBQEeZmg&fVTx1=OppRf6` zn;D|)hW_tFo|#kdzZq$iGBWV)IT=37DduoEhFAeD@$a4u-ueM3V!+l#`I3`MeXLk# zarSDZD(Yor9riimyI%-IdNSvQN|F0`fWJcIii3F4{)lCh*Qjc?C6>ZaqIKLNg3)}a zQ5-aIE0|~o5e}9y^A|*p6RAMOK5&#ROD$y2bo}I+>Tc)0<NC<;v2%xGf};+e%6?F? z;p$1^8}<)>9vJ3Z;rTfCVD1Lbo8IoeVgB1#$=47378n`)E40(dh?G+=XfgIz9QB+p z;eB)2QQfi9J{KFOm#{70rZ3QfN@rVl?BQ#M`UZ_a31Z6)B@*8T&b9vp9|oI-j$%vL z-1yuKL~3vr?xNjdIdbX&e7c@!t+4TWOMjhM27R=T)Y-~lB5GDQUo^&tlfvghqp``3 z38gbK2ZDt{Z-=gdS1mN=n&ZJ~58JvDFJLogzut-g&xsFL6ZK_nx&FC*0KPb9UC-Q4 zqt->=i+(G5QIyve#M@+}=EEMkd8C@LCwRo4<}Kx^o%>r(>70!0_j1bT7W1s~4)&|T z&7q#4Zh^>f<(S$@k0qww9#>;fynkJtTz@)~oK+l6?Om}K`$PE<ucMP74TD2<gCheA z{nvbteUq>od>&9kmqIPVx5AU~BY!dS8lLEV)xlaFY$zLGKY0Yd2^+p0Rq(c3s_kU- zW0bmR1WK62!KNmK?ghWZUu0(R7x=I(K25#CNyZK1XY)O9)ES(yCUNGyqg2B`*H2tS zm6%{lIjv@L2D`<Xt~F=Xs?5-2<(8VIRj~i-DC>IeY7;dz`h)0J(FxJtyMM&@<AQ!h z{aEQ@^BS{4=K_a)J3TjYhvY8K8Jcr8$Cf)WcaNu#ue$$8U|MKH_!QXBSNIA2hEMr+ z#{y>qS8dlb=N0FN&Zk5cc!q`l6736hw30}a!P;gmV`TVK@U{BECU}Sq45oscTneTI z3xr+@#S&d$xiQ#m$2#yT_FgNL&e*KZ(L%)1dr5cT4fGwS?|$mn%3RwTym?ET9~dtf zvG@jOh0F5pQzL=%wrS3dRL7R>A=ZvRfmNJTqSZR8OTB?#fW(1w^O}uS{%owXns6%4 zK;Ku3Gv06D;0GfoZI_jM%0_jH{+@lh{i@x>U!b496N}3fbv*GA&@)B0U~@SgpRY;5 z_X5xTzxjLOBNPJ7+#eVaEEXCWS{SN~rEq{T`3g_eyUGN$9Dbbz^pbj8Y+2jtwefkl zKny-&zNk%<j%?`9v6CAXJ{>B9z*97I7i6Y6Gb0ij8-CYVVD>@Z@tZPKeXceoI?3Bw zcdfAYy}BEGd%fBcOaArP8y{t^H{v}1GZypJSnCXI!rwEW(2D9rKj_7}P@Yv<EbJcG z=5oiMN*A@BYT&h64&>!?Wico79P~SJ%5UsK571)$M+}S{;-l7QPl@70+?G>reOCXv zoO+i+uM4(sl!3&an@I%BF?tZM!$WEjb%1glJy8M1=Qyj=K;vJ0wnv4EhW^6qZVM>n zjL>a7$^+pZL=QY~ybJ=<gk9$Xh|5}hC3Z4mZI#mC0J^f1whm<HxWk%17gQmIXhd6B zyU(*)mgJ28GUxwZAQXi_t)lQ_cm+MlEmpc&U?E@Nd2OPzD+em_HCn-eXde&Li{H>> z3_&0HBRfbdX2f(>$*M%F-H7i%6#mL5(RkIhZHf%C6;{4SsyT<<+)`wkRA$UxbPi|X zkUd1cJIt=O2uz?Z5st@$4s=5Y^)b4WL^J}^u!ZZxT{*11XkyR=NH(OdXnw>N>?G~} zf_-ZiXh{-?-w5J2_CfnZ%wyK}NuU~Uq9v&Ta$!Us5m{#!5rU>;{Wu?c`+4k}HP}Zd zW1rTDeR>J#hZ5P0)$6b3%ak>mU2j<)hLejm{44C5-(ll;nf<;Yy35g&TLSL=8o!f9 z)U=;nvJHB_S82&go^Nq?Wg@Np!hS7M{xkN^Wa#fkV^jzI(=f)r6cianB!Y!l_dAqQ z{FXsaMIwKS<}C{3WCYhW!nV;3*0U1yy#m^h`RI2FqK!-g0V~KZH;4Ux1yMKVpp%M5 zU)BYF8yXpk=X4Bm!cFe)hn6qSwkopUgzCf#y21>Y404@DEV0w*sp=pDeH^)qJkb|T zetp{v@Sx*J90iDZ^0qC8Ik3gH3tMY+U&K@>L~CNevd^0ax{?X-@KvOSc(nR9ICUKo zM_Y7mt-#|hfMlhBSG`~>1GU7C>|b!4aYz+CSUqPU9UVizRu0teF!P}%6dZ$Ixgyw4 zQF=d=*6Y~tdLnz!d>utweI6;yZ~ln1vVzfwLQ<Ivvg9#~;k8?h9rhFykHFn0(f1XD zA4gKlTsWXBv9jAozC({$8I9^*{Jr)O4>Sqg{s1t{zQ{FaY)irB_hBtx8!i7>qD=pX z3_c4x`~Cbj794d^WHp@r1*Lrfe=dM;doY?i>E{@18a_pCdmPz|EH)JxZXWYvEM6(! zGJYp%<D2NvOTg2cLC&VrpLMpL=-BEpX1Cy9@|!7TSsy0zdnIPv=WyL3bobNXpoYp= zqG{W0gV=XV!P7@0|DfA$%(Wk(+3gmoq^z<%Hm66f*v>PDS1=B(!H9+t*Y6eRch>wY z;zthNZq~9*S5^?;8B1s6r`3GlMNyziJ=>R1F%v2LeW*}Y*@>_`4a@${wkhVCNE-5g z6V|!U@pFBMPH;iwEs)27puO?vP#e&bf3bBqX+FWm_^GivvKfuccC)Chh4K>dA--bX z-h<apvuY2;yZ0!wpb@sS10yr>XsoYPwT(b>oTYq*{56lY;5A!3+~H#lk-U!w@Im^X zwY(4Xo`(&<EF{u&B0#qX`CX!HwMDar-Q$WV)}CwhTIBC<nPZp16)&(R{KgC_&!|e4 z;tZ}SM11#ML{OMuMiC7pHgd>3&s+;2|Mj$0R}z>ZUsC4|uIPlOy$<?`K9Mzek<SC& zY{&U*H@vV3>9ifR=!0hXd(L9>%^s1(${1UMISIeUxA7$#fz^cIjW4m9)kJUo4jeKI zP5Q>XNTw$u>sjk6(VJ>eWgc8xTPY1^yayk=&RTT@DxZPk|3#X^5$Wi~UsYxhm8OjH zj8Y@!xJW5w0$jYzTo8#zE2FaBbYRWs58`|pP4iP^mU8shpdFd4K$nSKQUUI-OItrD za>qlk(i-doXPF0ML0%JWqarV3pKykClUV(<a=)3wjL!hGp36#l90~eh<e>Sj%}};u zg)qq0l>K$I+25wn+m-zO7|V(lktBF&r1^d11*ME_li8IWgG^kJzN|}O^!v*h(VFZU zds#oz=*JTi4Xf>-8B6bvn=8x!tI2!BH9uu*t^5=jXZEzMf@dcYg=ikygLiE$Z7rde z2~}NS;OklOsxx|n>Gy4TZ)c>ul1@a$H?aX|jUCDFkxNAM5ncTlY!b5QUn&^rbw+w8 zXPnvWTm8)Wkr7Hw?0?#Vk5<JJr7h7uo}2eM54;JLelmAs>HQtHKHo+*Gp~MUN1edC zp|%8k!((jSi7#4)^>74hmy7rq%_F*Ujx{WY8SiFgPbBvJd0TDTbPOw%Znn#&ifw&i z>|5T$MrANI<bS{^t+Dc`ga-KlRw@PIlfQ_(wgwLEh&^>9wDK>)#c|MW7^7O9*7Rci z8E;$0xO_n`_OPy0CsOMaPMMilUVVuCHk>*2QRF+*VGB~9$GpM`(urk%8Z+k%bLSbW z?*O>DChKBR>g#B`V}kiBogzfU!15=R)o>zf!ExsHWKN)xKXg6P%iFB-uVMFb9E#lF z_wN|P8AuVW;Ls=LICyIoJnd5AY(JS*s3o42f1+|4-9b_IwJ+&&7F>Fk^W{BkLx>j4 z%*bYhBs*y>Y-kQs6JtS-XD|!jwtWVVR#aMJiy`^tJ45Lzv~`AZ1b+x0BhZv@T7af_ z@S1DSDfcSvico3+PN#cVqtjVGN~6tr$awE#pB_(y)X&gg#GqNoV*ef;slpj%G5gXc zTPyT!!x_^e{E}*BMhbAwXvVnjrKGoPz2Vs9kp;*gM_C=8M^;kzMfSH#dHc&O>?7tA zW9tbe)Q7H<7?tJb(#Y%dJ)8Y-KYY@N8Ng1)-f-83Zy}s<hL}HB&`BL<#eXw$gs4+D zSWU#DTM+N<?Brk5>dNe^kGbm+`lOjerCWgJ<rtJ-$xie+V`FgtzgXSB!G1Ld4r#>w z_aY^*4;sPzS%+Q9mo^9S<T8-3v*F4gkz^aP-*;l=i9vQCQvz%ANi5<9v1iv|b>0lG zvZ}L2xR_U`>CIWV^dal$Oz!Cfzi!9l=`lLh(^x=lxBY^4>IimGzc91QfhoL>zUFP) zEBKhc%wC*>cIg8sSIH*0#V7E}EfB3W>`Qj2o(f%$vNBY+ZG%TEvfkW-UVkz}-#{)) zv=Ipl8K}3&HPE;UYuTTCmK>eGAV)Pu28pG0t=PerF)o?xpo6hw8_j>oKX4w+RC(^% zpJ!!t4Y~&NqVPJ9iv}Sv^(AM-E+o$jk&O%}f5x?aTUFNQt!Hv2#voEV@@P4TE5 z%V?Bktr$wAs2xZ+MQC9RBe({>6U)C#(C7&5=>vk4Ls>z%JrM~xk$pluF#EHnEMSin zq_Y-0@sMld;ENONRpqf(l)P|~y<AY=eo#(q{BKZC7pU}{k@K-fr!ZFkQJUqcP>u09 z0S5@0UyVBim(r1+vXI!)`Mw~lQx392gcTwJO(M`t@;zsBze$;5)sx69aj;iBXN3@Z z#bj38=j@Og=L5+WZqNrorUWGx?N(tZ5T@-acgDcef@(?@*juzAmlDNZO0s<mE-qQ< z1ydJ{H$p2d3_Z-Z;?wM=otZr4)lZw!sLitIeM0FD+9es*3sR1tVUq2<AhMublS_;3 z+${*C=!+!Jt$6%O#&*dKFL<bA70RKHSx``PD^i1n1WFzmvCtB~3&}<#R}1p#prl~l z|7gZe+VhO761Y2;{z^9MC~C_>3Nol!&|1Oc#U@#_8iFZ`jz$nqxlWKo(WeOh=%i%H zrs;rZ3er;XH4v?cg*ZzFT0!2$t3<NkNZw}2lN?XI;>8hSg$z@_pn`%{3c4!q#Y$If zu?7Fu`7e42K_><6mweuWsfvyvNPCJfLnMp0ctS{4X0Zns`bh3=c`rGd1gCVsVTCz6 zg!oOR1(I7<@<&TP>1cM+;?$7Asv{#LUPli2OS0;?*+-J-spM8qr_3^NV=+n*|7s(T z&n17gWV=qMpOTZzM;VWh$5i?tx!mQw#tKvrx_Ky5e1|0Gwops*mx~Ti@LsX_OQjz| zO$~}a<x_wfW%f9zQL_AGbFE~T6(n9LD8EX!alxQPiz^tjP&5ZRiY>Fu8p#+NfW9)G z^03iD$&@Eql1$nn+$|Im4i);#oRg6e^j)+pLTk~7363i>Sn80`xAdQK?z6NWf-Va# zE#o5(;Y0cRp9V$7Lij^Ul2=QoB{c|QY+WlnV<F#yiOa*%l~|e)>rVMrbP$%N!qUA6 zx-I-7{j)SiQjYMUg^)`r)|G;x%e=SHatjlep2~gF2AM0u?edGX#Clk*lfFxTEUmX( zFJ)SPQkSKhl6&M%;eDZqrERkCbE`y)dUBPNCRxO+_E_2lxkoeyGG>Ci%XKoBEp34O zDmBTcd@Y02Xz3+*lUJv-Q65%nMF(WvEx*byQlI=Pc`2=N&c9NwkTH>mTqWzHTqm#6 z3Tx&|>#XnOzx*!uSgjT+NPR+i;UkL=WaY4~6zb*E)9R%~duu!`zRIs%YL)q6T`y%? zCCjVzkl!pFn)QpU8P?S@f}&H&A0heH(!|O&);mjYCY&atXz5Z#S8rwf7Jakm*77yE z`B%$#QigD$rE{~mR9Yu|Ei+i^w%THGl0`jPjYJb7S}l2s&eGCU3m=H?(#lq9X*Xpy z%eV5h)@1o!=C<YiBYbLcfoPlZ$5rl<k+Vio_|Nhavc}osC@D?mynGV=%-7dSE37N5 zu@t(<cv?Il<0o{Nl4Q)SKe;D=%;h_I$Q9Oz3l)SDgd*0QmCrIJR%!X;EhSq#DSRR` zM9RsZU)Ef+c7*(IrDV~JTB9O#7fQ?MTRv0rtF>-PZB|KEJ7iq)+i$f`_(XV7c*Noc zYy9##N!B&tH+dBs3;A9~UsfcU)8d&aIx$%xLtG)P$>$!67o<F^7t$8V?k7~T=%1e{ zQpQ!rQ^v#6m<v^`Omfz>RK_EJY=lbIpNxrIDJzt4g0xrYkUvJ&43fE!Z#^RKElOH_ zlRgQrNzEdK$i6GPzvOg(nkT2H=B?i1Z714V>77UmlF?qgFXifV&O4G_Zd>FavZI{R z#kbMT-YdG_l6f{sEx^78^H&|IU^n`@FE|y>=L~WTIr#|Zj?_Gvq%bn~SR(Py2Ok{` zDkK(C*XdmnySU^jFG1@K5I@=NWexM=VbB0s_hpc{>h#1;UqnXo((>!<l_D`cpyaFc zMRvxEwDTyfl#Ct4+3^F^{14w<Vor*U(sNLq3$(?H+*pj3ihLGBxgs$<q23fE%NLOa zO0cJkl;)y;rTO+Il7X8xR^oj+rC&lWs0hkA7#Ue|f~>?_T{42Caazd0_xmxp(lt=B zZ$W+=aQ+uN^&dcHOX2Gh119eRiFyu#y^qL{hlu`B2Aj2HZ0SmJN@)nr_&yeH-*Xz+ z2+c)aD-EJpkn_X{e72kOKNbn3A~YOIo1W0)6`cDr>D|{Lxl+Q9oE!Rb0-ub&PbcF4 z*J?-Y7@D;E=p_$nyU2|5s&-TT3}1d#-9iM3tjK@lU+8W;#nSR}sBY+J@L;e~Xltkl zQ8X%rD}-l~DXA3^cI@<L0nuK{fYH}dho~=8LOr#s`XMp+=cozlVr=Qpa7yb0-&o$o zM?v4_nSUEDqA`3IUP?rnR5YGj!k+LlG!o08z-;mZ6=t4YCwA~M(8AWXZ$PUT!Z*+0 zq!s9Fm(aKKwleBBT2=dRj%Nhd&2{gJii-9{&5U~AUEH<N@s53#env~y_9`bL6^(a; zMg1eZFM0Ol_R6i2TOhY{?)lt#o_D=teG~obiPq5~yvdjyS*cvsw%S9Ena;(|H=Lu1 z+}72#-F1(M4_ln?Ib!Xzw9@KvVi|NdYa0r2sD=fz1HS~O1?mTs!0-M^XnQ{O7Y#Ur zC5c<|nCQ}PnZrOjh(4tr&|2$z^y>Cy!~r>OuWYZXXR1q-^2E>>VpIwj4!sgw8)y)? z?4RqO<!>Cg8$4=^RaV=-aA(H65ucW@DsgLKa^f2a|HSu-Ul(^XwnEGs?j!cq%0Q!g z;J9aF_VCQ=8U531rU%oGrG1e0b6VH*IT_Qkisd%-g@Zqsmx+cs%5lUgy1ZS{^<%fi z9f^M-AwHpee5=^3s6MX$>>p}Fz$n@oZ-$m*VDXoCnP)Z{z3bVdvWI48WZ%!J;yLYY z<=+%&7}_2lYR<I%q;A(=bS!i>bZv26b1ilibTxA(IX3Fa+AB)CNJFE3s9oS&-$&k_ z-cNk)-~i(XWu^Ud_nw&O`0)w564oU&N*IQf{f>m2@x|iSM6Gp{QTG@X1Mhh{XSc{K zoUtlBkoIEQN6&4~Cp~|XRyxzjZs<)3{%nj;rs^vk?OZ>&6QVc942%0ZzG1?|gq-*T zahqadq82)S(2|r<5ySW>JdOx!dpsL*a<hhJeV(;A``z5Pym9_wf%SnZL0@oIxQ*Gt zwn-hSpSE9clyI(aly>|}yuR|pP`RczKqt9EeQGn!Kf><>)BNN8{rqG6n!l897195C z_y&f0D;u4G*e!`&Q~ph9pE5Jqp4=e$c5<1NN6B>)560Yg46v09E%SEHd6W^CHt|{N z)0t0uJoP_0`Q+l06{&~Qs%5Y9oezJjEVh5^njN($`gzQ%xU&gMlj94XEBH%+kx4D% zcDS26ZfeKi+mDUa!B>6HbFwpgrmuMZ<MZQbr!snFpUmCrE#?0!&@Xf=e93%htE%m{ z_ji?z`VH@qKZ!AY%3j|d#A;!KHckBne0)t<3C$($;%Q$W-xowN?B&VHjqyJ7zi#I0 z-J<&@JWHCJTsFCOQj4TcNui{P$)2QriE(jTTrJddq1nFXxvR6gWOdDWGi}1N+Nrai zj()l}_2=iQ8DnyL1fCd^m5}z_{+@HP`^)I0xbX?ik_IPNOWu-rKCVRcV&^(NqCQd1 z;R!ZA^p&qd?(12Z86RfU$Q+T?E$1`OXy0M~n!ui5a=4orw4Ku2j{eRpEY^Q_Rv}jB zeInb`uus>!XwwvO`xrIC_*4Wp2U`cn1e*9$d|kZ9Jr6zIy|;XEp-&^P*{?)*OZX&t zGmB>H<iW`sQy!#@ERd4&cjDOCSDmKqpI{qr%iOoKk7vfF-%b7dvHMZv;l9TgpEgT7 zl3C5uC@|VMYiqA<u<vud8WWDclT@m}umbO;Y)$$w;bQE-=wq(Qj=FjUwPB=dXqazN zPF$8R<6efD;m;_RSt)Bo_Uhb{zPf?yp`PY^<z>CRV-eZ(-0sWnVNsr__oDW@i@An6 zzR)MAJ#Ft3vGzJy-R=bz`)m3dct?3Y!z-nqcdys!d*XY;-#2)~=&E*eca8fpc~pT} z1+Ns`TcB0JcMD7}us7wyr1kL!-R-qM!}WZva@%H&&)D_6L2BVAQy<lOG~>~rCoP}V z%rJAt`$va2MAoW*+S|Hch`pY$Fu7rYDFyDsr@tmHiVwvciK^kcY`>}2j6CG9emUns z)`d)GX0wdD=>;+_XH?8`<P7)J_D6@hn>TG`wAFfFhwd8Z-WpXWdVh4S=ojIze;pO< zt+ak1gK_5Y@S5NQ{|ukU^M)tI)56o=GtG0*6ZVYvX801qYn6bjPwYR5uOw|t`ZQ@r z@|^;Y3VvUxeZeisFT^i$FV#v$ZnE-C_x+apM@G?SvmT#)s686<`1hx0p0!So&FY&w z#rI`!uTfE*?&uj^JicU-ne<0elcZMU8GIwDSK_+(^D$lBiT0XGRkM8P-N0C1N6*0Q ztr_<8X=xMEgBfeG=H}?0BwxwE?9f#s7`d+2vJZ4tb9>xxM-7geA2l%QoIB#G<LqE> ztkqYRkms;!_^V*qz@NVE-a4K)a<}F9bCleozMH|nY$^JS&Ry>7Q6I)Aamk5s$=g#d zrJPEBJ#ks=Aon@PWP547yrLMoKQ5<U=HB$Iw1H`B(#EFUOWT*;F0*KMk=*aRPXp;j zb!N*v#~-e^sAbWkV>`s(j=vSJ#Mg}bDQ0F=J=fQc+V<L7oZ>Tn3)=k^ygNNTJUeq& z<cwq;E|;@2H^sZvS1GVJ*gxFNEN6>Xf6&_5GaU7a()6?I2iGoFBUcq?mVJ~SR;MXR zV5ghITpK9jAMR`EE$iv!>F%2v{wuOenMr)dT8>W6QBkkNPKqCp5S7q7erRl$sCBMy zT{T^=JD#Zv%_hMTz6#zaxg~NPIYYB1W){foo4Gp6mGeq&SMQ*}h0x=0y7}BzlHIqv z^A~q|)Qsrn(aWPRM;D2n88swokGqSjtHY;_W9GhUR%h-G3fA;D_O|d;@=WmLc;dW+ ziHkG=AEC6slhAmhWn`HxTiKyb(*Dp*`wmB%<9Ekc$NTmhSVQz@6?=r<J%KpfJA%~% zHT+!y&BJH#Vs3zjAzgV%^XPS5BcmEb&xk5c?A$EpR)^*axSBgxYC~;7<9*^+PY+cK z4)(9~=H#x*9hSR3_k!m~Z#Un^{`rA$;6ZS*aV%0<X{+|o9N2V>aU?qf&N{AWSE{SO zy9}eU+@4||uD8|<ygpk*KEvOs5mBOd2Hpr9@fY*o_x<e4@Ll!a4t&kta*Zge1<Yz_ z-J*#t7s3K+g??Xutl!hGW2Z7ldxU+-2wS0uml%To5J6H8ePj$lewqqi{F-u2{Z>Eb z_|WyXYlCwj`7AyqF8M^~ORjE?z3R7UCOQ$@@Gc&DSwusviwEEbKE>DASJ&49PrcLr z>VZPRk>Lu&K5vR<rkOfhyQiJfbBUKb#PN=^wyTA+G;!jWIehkS$VRaZDQ}Ezcw{-2 zGTp;Jgvy3q3%(zijQ`JF;?PbF;73S=^J(NCIByI$yMdXvByQk1^%mY?x!NCO7Yq>V zsjk{y=>*c=!fZ)g#4_k3D`Qo04xRrRBFg#Tvv}uMj$}us-R?Z;c!%hoiyghRm9~pS zLf=I$<^$p4q0Y>?RDUCU4*wu->@DANUyiSQph0j@s8jfxaARY#c@HnZ>S|B5ruH_m zfJfTvk&i;67=P?&<#-jFDu;fAOg3|oTDzjF>T4dw?&l^k#=i*l3ylgs2=vEtW^ibB z=w7I8I4ykK7)u<WH}Pc(+P=W!WTmo=oCP1Kuc^z3AwL)SzB^ey+7mZ#XXINBjb9=! zKU2%=>yY2pIbL(bI(8ChbEe}p`=9o?jx+jPV!96}f_lryDx-h+aA+zqxyuFT1Pb~4 z_!9%W{a-LLPU48aMby9^;W5T>w1q4q%2p*+{Rs*DcRkK-=oRsM`pX_mw7stS9DR#6 zm@IH76%VJM3D_pyA`3=WqoffZo)vl&>Kayv(tUwEA-9P1JfGYGZlXXHLnFT(ui`h* z7N_C;^A=~3x6pD7jd;v>G(t7dD+RE4Duj2<S#1w|`4#cy7Zc;}fPJOobL_E_9NG4# z+I(e|(q8>S=^WWaEa(y8F6>tef@y&Oy?H6H)4#<35^~fu@<8MU%Y^&mYjx1<1d5+! ztAoUUNF9xpV{`pO{jMI-k71|xiQZrTl$;U?+6^*^oj@B}7rl_=fG9-7yK2Vk!~$Cp zUQ51<(ncx~&0>sE#!_Rqk&N}qXL!U{z~{RY=bs%&{|AWDWW%dhatB7Etz2fyVdkz= zTB^&n`FawOTRS^4?6>XD>}wq(9oy^+@!l(?S0<um19hXa86UcL$V}QbY!W5=pWubS z;(!rY6PO>k5m*<zOeR<}m`GIe)#N++%500y<pJ8ec}gLyL8G*{$Xqpw*rB`0tMG?b zOS_{!R)1D2t7pk>F^Ig;FQXBeh#u@^ypI0DuBs^cw%q1%tT^8{R*=7Hq|uu=Z6}Ct z79?tF8$63w;%9c1h>!Qkds?1oUrE^8Y$0>bSf#w$nM`E~Sd1>!b^AB=i$wSvK#aKG zumY@W-=~MQ-#MohLb}>$8$@jFlIBWIYBR%y$)(_6E+>W#5yQSDK8KS+zlQn{WqlgC zHcr6#WjUvI!GGxkxPK}!Q45lrpo-doXz(9$dh1Cn@X`2Qts_Eh2C-t_AikOhyPI`H zJm>&!y`GcTD56yUOy-!5WQRIs{7znhmE?CFO!T%NiL6+jo=q~3l9lLnPWwyY$S0gj zM{@4{%hniwu2}LoRv@d{F6{T}Ys1N+QIdRfe)S&yne)gLW)d~Cq!LCeR|8GuRJ_aF zku}6RlMGrXj5Ee|V*zn!e<GsyKI3oV&vqj7>UyYH1MWYJz9|(gQFnUx1&G4OXi%r1 z@f=LsB`#SvG_XB6BTLNDCOqr&Y=j2a^6@I0r#FZJ3E}LUhssMns&nXi_o8Dv0`G0Z zQsyZ7=i~hS3myOC|7or`%lB*1_pansqQ;5Wy^6&~Cv@NAY~SG-c7+x184(r=E2WhR zc(PTakIDE6YRX+OfxUQ;eS;0}6twW|K^nvcJqv{8BDJl9hKsQt_>}Yi2b_FIqCM?_ z?r#{83EFd#7H_wHeAAofYglac%d_^HilxR}yvoF@@HlhxZ_tKkpd>nYP9gd!USw6# zl{P2(g+#0Cir&39n(+ZVU*=Oc+TIkJNgT0?;3lFeQ$a@rH%djXco($gG5x&3`}?3R zlDRKW_sZ%s4&C(k*v;)gUw;C-xs$fP!9v6<ZWY@24?#zIK>wQHCZcJ(1HBGIHOct; zO<qqwCuYVRT0a-<utaxV3TCtfJ+}OP$Lo)LUdroAUYCFdti$Si9Xj9rXdcf)v)kZ5 zsd+jR@uVsOHX;$w8qv>}8UK#-RwDGZ!)~!IdfdviM559agYKocx-fbm(Grz}LS^&* zBu1V1Eu=sN7pS0McH-G4UI%ynU*xhIAWm1Ii1@_)2d$q#ABl}8R`uc=BEB_}F;AkD zRRg<f2z@2foW#cKkoRnx_pTKfQhj8bru<b0T@qivvb0XJjTJ$kWqBZ38UrtUc8@wQ z!-a<!X^FYE6@+LV&(%EF@Dz*pt<ZNn$jL!$;!i`RvmjoV;M?=G{yrth2tJ`lf>Mj# z(Fs<Ql1GQK%))xK#F{D1cqh?tDnpl&&`h2cxS~F7ZUfJ}&fFT#o->g-H-nM>fP5?y z(PF>N4D1EPn?manaG>ZZv!T)z+H#y$?O|=-oHvS_Xsxt<BcC_Y1M$mT%jaKszmC4F z=liWZw{yo{`YS!U1aFJY!DG-o@h?-+&c%WB6{Bqu39mkMZkgw|*#*uPdUwp@fR}h} z!!MHauL-@Z#Zzc4QQ`{cal9a(mgZQZya}E!$nR4$ec}UipV1ee#D~0p1pOpFo5W=k ze+h}eCb+zyyn=FDXu13s{fUK`3m$FhO++gwSrx5k9264Y7V%6G`&z+qE&n?4*OKqz z@=#bScAR*wSkDCRlj}u;YWZ+kD75IgEUZ{YS9)S;0!5Q3??n$NI>CG`vS@dtz0x|- z{93W^#9PGjO|&AiiBE~;BPx1w@jtO}V$rr(h_m$6ijOCLB@z`cle(-(hvF|Jeq5GE zprrw@5O_iG1>YABI6>E~(ga7h9&(i+?1Ft;n7JV9f~Du{LIhQ}uypHNYaHZN#zQoq za<6FFta~hsUuqP(<$L)F=56^~St!1RtBa=0Lfz$F>75nDOKP&Tc{0M520*+I#mh!~ z>|}(jk(2l0JtGto+KRS9Xl?aRI74d6f9AJMdM#I4PthS;PphW<@AE%NKZI{AuSM|) zlv?G#SOAEo%kq5{idrR$RzdVZLQ{FQdTG&DG!N1%xmsT34yjQ}5sjIQw)_dV$*;oK zmS#-u$k!Rm@78Cbp*)0Q)>HHn(to*MzL#I5CTWG-BP|eJukeY*A5yn?JBeL{lx6Au ztyWtt6>7<dioRJ!M6QyuE$)^!$~>|9BfYn@F+u}N*JkNPES|75Pg07sLgs~hBNPyg zgv@6bwTLdzmiL{!7yAXV=nx;$5buTK#9~D56+N)rAJ6?#N*IeFYs5s$FSSVg$q4!d zX<;<|7hiN4A<^nsHZo#uA!Wt#7n4_x%)b;qi^reLE`J{F4Cc7ZGNG;56bNrf8A2Zy zJGyAe#WKP2TbAF&vc>A5SR}~KWzs&Gjfs>XRt91n6u@RitRTdXPqajZ_#{4N(R_0A zKZYwU`sA=KiuOpXI)t~fc#Y=@(I#osEjy&>9%WAu`bN<U;U%#a5beC!o=A_xMlOs6 zPa@wu%hU1PrKKs9{FEKQK^w$RPjtI!>;zeq6HTk`Vd;{{4j$reCGV4PlUT;c9R;uy zy3RgygHg0r8jXGL2CI24dt?q)O$lg_WR>)y3#vd}m$*BM{h=Q_nYDw7o=G$tUappG z%VH@b9>P~BQC6`aZ7xhrvT8?BpB<}?3-t97t(Q?Phi0iD`+Q-pz6w<z=e5L!ZFDL+ zn>x_=1<Kmb^(uR<L|TjHn&Mb@hy~yYt_oxO=Eq9fMVsnE)w57XEJu>qab=gt<_aHu z%tkuNqOEPP4z7(QeiA)OLN*uf4DpK}2}W#M?jx~_p06{dw!o6x#40KUE8s+~6iFk6 z`WsQ(Bk1xtPY(JIDqh68OZLuE*j>FrPm3eHh$WEt0_1S^tPEv0Kt++?%2QrCt(Udh z6M2!}&O*hu?8g4cbbh-^zYbH6hRh?8af6&|-9*c~!X9#y9awDY&qca1qEG1e4ff$p zNCI)RPjYjG`TRDL>_>1{MfxF`5&uMD{}MXe;eo4+;fKgR$FPQ*jck;Q?ynoxeFu;g zLwS~w??CYzSpDjhU4hpBjLh@|iQ^+$mBG8zyxDc0dj7)lt|a=)v1s0AVCjejHTJ0E zBJZHByNFC<aD4zts}g)<@cASoya*qrYgovoFuL8~qU!vXfDD+-DXS(umiV<2D|sg) zahU#gC2m?4r;oCXq(SSiAQzdONdAVBhp@p+$0}RmA~wPLt_jvn4Y8<w2}vvo+u2K4 zM_<MQ?w3e2M&km!rBLH7?7&Z94P2Em)EHqOdctGygq^cdIrM~;@?@ev@C*1Ra){Hq z15SFMp7x>K`IJ_IT2>(4jim>_;}6k?v06i~$|LVJ!3I&~zSGEQ!l?#WoxyJ%Db<Z- z<X^~qrRZ@ko(cQls&|pXt`Vi<05<ul^s_viU7uDqW;Ao@<z;5S%&;1ad39#@CDz5` ztRU%pD{E;gw0%y0MB?)yOM0QyP3R(#9Q`0+6XCm`kz5Ni!pV5jtmpcl;fHKIN&n+y zRSvt;3j7tI^#Sa)j>9FJkSqr>1I0Qlhq)(t(uUC2zMLyxpr%wLP|5Hul7@=a?|*RA zefqVZw*E_t#pbOQvvnM&s^*N1LQi%>i3dpC5}(k=OpK$wcd&XaNS}htI<ZbH%$Zj- z-X%CknauuJY;21#I||YE8no^a?fZk>CW`SmLN*Y|scc89dzMqw7-(yQDo@amn|XGg zk5~hvm?4Lu>3Y76V*bh5e>~$bkxvKl-YHHmYvip}rD@|SdRv<B6Bw%t^sOoD*%d}6 z3!ajFr7+)SG8a?nWh<^pf=i=q$DmJX*<PT`V<_Rm3iB7*^_;UsLB=Er>N=oLC9V+v z<35xkn)834(-~-SGjFF7pYJqEHR+d=8pICT$^0vTWu_PFd6~<n;i!kS;1p%W6Myg$ z<)^a3Po@3_w4^KJ6boJD?Dd3S*V68*%%Am8v>{Yl%#7KXSF7w4WuR;>rE07R_ZjO0 zj7fD)0TP!xnbwKSCLUfv$`Z@XHqbJbyNcwk<&U7smAvs^#Cnv7#enGGOXgi)l@ZT? zPS;qgGHJ7&7L~_GC7$xnQg$VFAc<$^g%2vy!W7<BVJ_;-CKog1F6;Y$c#VjJ>4$6n zCO@j5R@I=NZE3{@IAK5h>&9CrhTgBly5KL{T~;Cm3+-Cex{&@nWqqxP7f32N!a`QC z&$%|p_!j2e>16E6Q&K}}?#!AczDg3Mr4{4V5&o}-?Xj%CH^527UgR9(sli=2toSxY zR_raZSuw7_W3g~dd3K(5(4`~)1q-mVdR=3em7F~-;orktolH*)!3V+-X;8|_Y0?XX zWG?fh3jS8JIny72C$3Qban{d^^!*?wdYxHc8t!RB58Kg>y3EC6P`xShBNqE&544KV zn&;g0kd^xz=+}-ltS3ms95|{SeZGa~LmRBD|AYfhvx?4vi;l5&oo9s>yZtaDBG&eG z!Cv}8kz4Fyb>WOA)cKeh(HWXm=J)%|&>QS`(X3Db?iKlNB=bE&Ys+FQ5>HzV+AMO< zVOF`;%yI`iP#sofJ8SWMcFdN{hobCu_2_jR9F+*CRA9WeQ1)?Jdx4QILQS>kUok%Y zNBw6RRpBlNoNnjd%ajwMA1SozKJ)1@bMhbd>ud14gH`1^zqP}^pagv=1Mih!Tu#BS z#W(>sV2-9hAK81$v0sW^{T}#hC#&2(TA4zfl_;S%Tv(C6PH?l>Nc&j(3&Op!PM2a$ zilP-7=jcncSI&uD;G*_K{>tX+$52RYXv)x<2;7$h1+U_vRFhGvP77k8YXzuP6Dlr+ zTC1R$liD@DcR-O0dTVi9ORU@r(hG@w|BOBB66=!4t6pfC0auk^&uPOmiWy{r)m5Oy zd*Ph#@YYN~3b+Nrb_Y!2HmK1IB0}|IZ`j2;)t+A^!o*@EgVo?oC+JU6M&lJ`Mjh6& z5OuYp?aisp!}?m19u{VXMzc}`=}{Bta1(!!zv=H*sQ-u(B)08y_OC2<u1$IPU<zY+ z7rHg3ueDgK+cW0%Da!_RvKfub>{-R(tM}+*1nw^f4Mf6R&R+WhYs4$8vE7+J9at4E z<ju*y7@_m5Z3<qi_u%*o@I(-aOy&C5Y4@veyn|JCDKq2_>%=~&w2kr7p|q@@T|nTX z^Ej^tEvgFcSd6g|kAs1<ITO_F9Ba!>Q1&g{{SeL$u|}){$C(dK`5x4WhgbK|XOndT zPcTZ|galEU*KTlTL)Mp4jPJQTo{y#NQS^E<b4={SL{_;>`&KY>hftQ-smBmqcsta) zjz`Zw;Kohh@K)G^HK(RdP^&#Xm0fim(HXoEL2!ydb+U)EzTAaxYg5-i#%v_=@niOi z6Ra~bSDM2$KKvc<ZKBrQjLA2&ISamiD=%*AbNcWAIv%BFveGe9Ax3aI{N$kS60E<g zp;Z=p&|Rpq6yMl1+MqE59?*kyuDuKnd6_!;f-)sBpKl@U9EM`)jLa*{qxZ468q2s| zW4vU=-V3L%;rG92$8A3EVATjA1#~1|$=i6gHH04R7{P(?pjf6)#anj_HeAolks$9^ z%#RuG%d86t%=6kr5}iRi`$FxyAZ$JG0{n{6e4Tomv**4<DG7Lmz6F(g!p$LCFpV|h z1RkK<kVJL-XwOjEzqDye-g<Qs|DWDa`%4hJJxI`LjBjJ;QWD8_AoR4un?EpHS|G3W z0FORKYs9+lWxiQNk44UF$JJ$_PzC;1WE^#7<^&`miK{KUq{vSHvJ=MBKS6d^vl4#; zbuwtteM&H(Mpb5EDOLcLyN0rY_v2OQTb#SBz3WBx7&#T{NIe&kXHT<sbl}SG@cjMH zRvxRfIAX0%QDzeFZU*u0-a)U>UhyLdPN9WQ&?x1Y9&?*HfLIxY&46*+*k-IE*V}K# z72~c^n5^DDvoaCx+T%g{2dLvM<Y&pCvIKdx6SGxj?;&Vc1WptS&@A|3I(~{DGTX$b zsTp)DKs`%Xg@hYtBRQ_c=Xd~7?c%i!`ZN1ZM}22A=V?b}#|{qRHS{Ukx9U4eA=?SG zVvj>f!CwAaL|(n-o$DLtKSg}Xj{;eN--5ZJ<;LhpVdXc~p_j7z?W-J>ob8?U$S8FU zU0%GSrTu{xr#2-sbd+&7^k1-2aB5(?zmY#omaf76SWJP9U_r9N55V8E9uWfD5&>cn z@h}>yKd4`;-PGs2UjVH-qJw#l@oyb@WL`&`^9eI;w^Ca_;Ye{eh%O!TLd=Zl=TYN{ ziRpDtaMpFK)=Q`rBU?jcgYsU??UFM(ds=pC_JEw>xg9*+J->S5eXWSF`CjClIvjf; z({;^VCu(@q^(cGvm8egm?zrvl*PSKom(`WFL&m^Re6TgyweFzVZs%>~d7j(P^NRNm z-}FF<Q2X#Z#w0Y{k2rq}S8A${)T`Q7JyX9-ywb<o5n?%fL=@|EbPl6zFOg^YRyaA_ zKh%H>s{az_)L|@%tkNDj9=X@XREhg0_RZL<v2A0A$5e}H7TwBy#L-CaZo3rv)!)~f zoLeY6E^9;Ph|C_DS2K5J705oGo#=VNzcJK_45nW@PCH+4ufl$7PK+n^cwGCq*0Ep5 zd>7TzSz14(G>eQ6pA7B_%=V4;e3yGCXHRz1?33B4ImbM${JVqA!jHl`h!nCUQeP=Z zB$J<YQ?Fq^i_Y|<R$CjWmQY_%H=t9lfw%e$<Hhh+qDFKeA6ja7P-L9i-|@P8aP-5N zsj)L+2gZILn;z3Jrg3z@ecfs5mu*|aNB#4>hjT|`y|*Q6O{SiCFJofnk*v)*XFN%P zOW|I&h1xQ^$5GkU+x;Z!otRCr!Pu{2r^Jkm>fnlZe4*X3r2vN22zL$c_m}o9@+`{@ z=C1JAyjQ&S{XYbb1;>Ra8&PB$YGiv!X#<4RQaeSI(oV#(DXMB{_TEu`W6eyCoG{LY zKMcPVzDIWWaiOlE!C_nEEv1K^?rId%Dz0w4FaEdq!SPkGX51ayJEmHc*YSb+qZtV1 zK=&ru%d=Kz_RMIMz9;Q*T9b^AvOdRg<&V%&^AqKamTQ0ARWs^L^r6_^L>aysHz2lm zbZ>Vj=LhyRS|{a^*(7`_u*f&VW6N!m6PxpMPLk&j?^L3z+zY%A?uEDSH)=U}rIme$ zeLpsTd-XwBiH6iq)W?d$w$8MhLk%Zc)6R!q4lfH84lPDU9FJwfLM%J8{3}AYB72qJ z^~LTIv8UsvCUj3~oRpI^Hu;m}ElDd9e6dH|-SvjbL!(OYs%L%nvCJ3J%Rd|SbllTv zPtT{WNh^~%Eaz|U+ku(k6Orb+-?<>_K+M4S{)wj&2PAG!2*>Y_8y9;%`nYR`eX072 z8H3H<Oy9oT?Cb*B!?J>zyE5O%nvwlxuHyRyn;EBhGICfMs};mrwUaBu^}YM7dzSmD zYozli+Tm5&0=13uC0UVMgl7a71&%V4nqwzY#rLvru}|?2@OKY%38shoM7HT&TxX(h z#4k@66W=`Hm88c>kCM`p`X*k9O?TgRe6Kz;+J>qGMtV2p7?~x~3qHH`RDISWZB=@Y z%oEvXbF;nugQ-Tm@=ROeydI^-rpEmnZ%=qBK}lF0A00m^_SdL(uI~2RO0md-aLr&T zzu!|N_pR)|Gb?9a&Wz0-o>Rv2w^#A+3_K5&G-udUZJYkU-o`nMn9e`A<`NnBsq-0` zZJX<@)oHdOkpsj*=@V)cEEMn&?Yg#4_a64W6rN>XP}(_D+|wL=oRy=KV%>4e5}G91 z<0r%niFUi+vQN<Js;46@jFiwWU+ElsX1~n!S!=U;X5GnpoTX%cm2=X&G_WN!!R)5Y z)&ll*&W_j)eG*+HZcN<wvHfGxv3FbNeAl_nURP_XG>rtYr7RiP<(=YLM83bVo=3SK z=Qj6z#q6jXJQf-s{=!%gd0APZrfUuCuR0=*Po3wSMV&7=HjsDw9eui1Of8CM@n)lC zI4*RNtlGW(or!PUE7Z|Qh_ut@J1*%L^+eZ{sP@rD%)4<bW2;ANQFYu~99#7rT3>ZR zB+2+S__FVD&PO?a<hIVe!kXmEE}By*cZ&Cv|I6U*&=sSqt)hBTD`daraJffB6^Xta z)iKKJ-t6v6?z(rKOYPgV>v-VSH-E=+Z*U;&|J(PCcZ(<9Gt={vcag7?zXEycmIhmr zy>LjRBstyIXxH_R?0f8`i2(hPV<mB*485R!UR_W0l9Q3f<|ShG^a=jszu{jUiX&=E z2X(xjs4i8C+ZQ^Uxk^QS6umZT2l1{~I0riZ)d%Ziwbn{f<W4v{Fo)dbWdlxsSMQ&m zex78{8P6`?j6gr4X#LC{_pf<3GG8Ifv_68k(dC_`oCln5x|X<BxRyJsI{J_~akiSO z{BB!gPBe~%3x=L>P%iE-<Nwcp%-_&I*#EKL=Pwmp8*&+0<Ub%Uh3$g!jXGVcrKjst znE5;O71;WYCC6`^x*nh5QRGtiF+3#nNBD2z@)ow`XdAUM${T7k$1}%c#{}0SR~zRV zyXH_Fx%wdOlKQi9D00J?9j+U!6?iF_72N1A=*#qGdE59J`2P+(39b${3}%O#lf`pm z<g8Lbo2E_F%h~JLPul-<yZ}dCb=<@b{7+(4zpXXWW+~f<q1(Y+5#ASS&Z_fm@WbHO zfwTVW{^b9|)LDQ@aRhsOM|SrdIovG}+&#EE1a}A?f(Cb&KyVH28WP+I?#|%^cRgR5 znSH<7efi#FzdQC;X1c4Zs>}Lco{b<#SN9$EH8#?iRj6AkZHrc3Dht*2po$&VzG}Jk z5NejwX|W*vMB|-g_kRQ3`X@`plU!)~s@2eMEA!P8_8pE4bfDbheCFs&McaLSv0hV~ zMCW(Tx|;WmqF_;-r9Wf?Ph(d-*Hu?dcU|gyMtaZFf3cZww>iU#u{PL>snbCkO4NFR zDc_O)pxYds9c%2(>?7=}!C<nq=c*4&&2DRD<uq;PaAT1#)HmFF*)zy9-t)=R8GNrj z-VVOZ#v$XldBgf0>nWA;SgAneN2u09Ypj)^LN32L1+?Px_$U3rX=nzH$us)Zxzq&x z89fmv>Fpe)9Y-7kob{cr>0rM=-$@tyg`h|g=kvFtwkHt`u_fLT-udo*t|P8m)a74x z-vH-4y*Ix%rE$@$14_^V+ZHOy7OSnnk7`X-&0BkC$44q_#@TP!L+lg4V+z*}D2<h| zbm&-3?MWHta>Ew|u2XeyQ;^D<dFyz82RFN?FUj}PSYhU+=k#lkOy1gNfF{;k?GDy> zFZgq_vPJn(d4W}a0snHnZJ?4HYqWsA+&)A<rFrx^jyaA(&ZSP%G0Q$kAEF=E&uHN! z0B74?Sf$J)Uk(tT-g$d?pSmx)cDpLN=TL)n!Slq^%@g5G@^zx>CX_0*C^|6?Ren+b z(#Gjq=-rvxv7Yt)!T!?T(Y{nKuWzHqX1qF4S%DYZ+kb-j_`ykA=^NxLPZd;GZ!vEv z?`UtVx4rLxuP)s%|1_IYku-~FNk(NoSXeE<8M;Qw>;b(C(<s~Vs54^OhlBL}oVZga zZLNJS6_S&&Y3DoKj#-?YSnrr%&uov?GwWB?J9IjHW_x3uH2Trmb+xaO?>ZISzq_`( zs=3$E=RUjVwmYBaXYXBKRimqM&RpS_%7Oj1Xmy2FSMR46XMIZAYuY0mt&#g_Xvi;m z2^}ap^(VzoUC~zm89Enujh~I&#!0%TE(Zl|v3H$!rS}8t<22S7Da~<IWhPtC{Hs8- zxNgftPs}yUY!Y<K!5q#IEB}HoGt)L(nG7CU1*N~X$9~wJk~xGpMmuUa&pR7BM}fSy z&tA$NsXtINsCz+v5Ai=VMl+|GzSO>>o&xSMu9>dP?y>GY?xF4;?i8L<-dw&ezBu1( zGcP_$HoEtoQc`MPw06|qm7>4>1bZIfKJ(dc>Y44K_J-8DcU5m=kLOUT+Zy{@SgXx? z*dl$6QND`4Hop2`+P(5N_MP+<FlK|Jo{nDQXRL8}t`cck3Q|dC<vn#ar>Xrrh__J* zU+Fns`FMXDTV<t>(hwggPW|5g1@y8h_F9g=9R=vWI@p=sIS0!AYX3@2SraU|O3Da- zUvnW{&Nut2QENIA-uvC<b`=E6tdDywJp(My3Hr#M_2n>USq<?F9JT^V8@jM|;~Y_b z{it35eNf*%S1*E&wb{q()Xd>oyaIF2sWhTWt_>B5^{r`UEwdcmKaYaj{)G;`b&cKN z9{#~2lX=6eX$_`-Oeo&hTOy-5iIU~TEAC44vo3yQGx8>7@Mte_@29rYAh#U`C%lxJ zSuf)Fk-ER`_7C>fj>C=z)SOmy+_pEgztnoFYn9u|DrKZ?J-gO=IML&4;mhx}d+u{; zXNISeC$py>(ly^(#y5o?xlQQj(St6tX^0ah+Lj>!7eUS2uWr>!Q*k;&b7-YCyWX6> z>D9r%e?#}vwsbU}2-f;rVolrVH$B^$Z?&@yo0-fL#%cN(?=%J&QS>-IXH+wPF}qR8 zmSB#t(t$H^oCrxPJoOgD0FK!5(<!7pzUmRYm~WunoyW7U1&+%{DsazIL)TR8q>VxE zP1C#U8}&F{v47S7(Qos-u<ladfb#yU(m+{gtL=Zny;IOHcDk|CcL7|$o!-M#ZWi}u zqF=*(`gnAs7j7*h))-H{Wor7S-||ldS*$!AN|Tj6YCCPYHjxUwuG$vR7dL7@X*slH z^%}ZOWrwe=TqE*04Q!Mx)-NF3FQ!_wjnR|!n_~QE)G>x~uB!`J{0U}bx|6nIj^7cV z2xD{$;KfE%x4u)J(`mfA@&om7xxtu|Zq^NnV!b6oFclo1x%kqr$Ov4qwE}r>pPEA} zr!}BodoFr)ccITiH$76{qg4b6vA%keKC0)5yruT{25Wy3-Jhoz1xYXNMLtXW6kkeT z5h{RB_%8Ue7}JecMm>0}3wzoSVj4ZERVz+kfbZ4T>IU^+^_F^Gy$FKd0Hh%WD0;J% zP-O~{ndd}{Q~S?Zi|DGImtMRV&9`QVWwRPk%ekMOK8kn86CIastL>5Y3m`3xrb_*> zExVEm9T-iwfvj-HQKD#%IT5&s$WTGzT#{G58K`glN-U)d9gjK?HRw+caR#vm7q}bu zZ3{VF*F~M8u2Ju*UsWASjMHXlO|%bm56PsSQ|Mr=tU=<J6SIh?Gwc)g2ETEh^L4XX zjr2ww{_iWF<!fs^<mBFNGl~l5qgH!jHVs&nSX*Dv_qQsmm5y`<n6C6vnzBOamCHn4 z;)x1xA<A=%3d_FW%AK=T(>**5m9Axpq6{M{wuxQkH1YXTM4Lu%)^QK>9>(k*Qa>9- zhk-nt0Ng+?f<NHsOK7MtMw*7mjv(sS<r^c2?3^Ty#)%T*C|;r}i;2-+CsQVU0!|TQ zx<RJZMPxLB_dgId71X(*RG2M>#wp;$F7z~*0Z!pKYM0m3=b<YcmY3?v7&>x|LsQ&j zU8;lsA4YecXPhpqW#y)quE(^4jM~MTY7L@C!xZa0-C>_llbe;f)uF<27ctIhd~Yn# zyWGSUOA^t!M=mB0F)c8ecqKjFuABnRgkH)Rh}Y!-{|G!wI6!J18X(VuiCpC+Hr1cH z$hyQ>`+;>-fxqkXxt{QQZZvfxUa3Xov@%?lOr*Xq(Tl3kC>60iK{~8~=4;68^KhTi ze5MKCk(h6GY^@|B>raTDr6L~o8amyFQt^S9?Q^1IwHd`-BAh81vDCS`$%;uOi;Z=C zLPSvN-7*qq|3XAgBHn`9@rl<<F={`#5veo`<@GmQ>pB_Zi@cHmFZ@I7au(UsKgnyh z_4lNDvn181z38?(hdfhla!^ains*}a1l}W&vQ5MtuabNDfTk<LdP{Dq9H&=nGLAyf zs0*XhiFFs?m3qY2K*(Z_*@?0hhnjhiY&$cT%3Ou4kL+xA*7bW<#79g#57FlQ0ZO)E zhB~xr$lsaZk`}~rC4N}}Dh?q+e2LYQ?od)WQj<vS8}bu^Tk?|YhB323U=i&h=OMT= z{}7kX6v&Y!FoS5;Itx+NQ-Pe^w?JOyJ+zd%s;AIW@SSa3|22~E8ZLfGBt48QSR6FA zbCn}RSnI+=k`?{NJCgIO0IiR3WvL=cB5(DU&!i(7eUwk!CO-ZW+4B$umeENL`2$wU zOQQP8e9BAgTDsmwQ`>qMty2NLS&|IRN8;m`8F@zAJSZdiJn6>Ufk^*hM)iuj=V5m9 zSQY7=EB(vTz)Nz5I|ciUjf_z&cPI&M%>cC}(rOZyPiBS|<C6Ly=?~)P9yV~+9<z=* zQTKJk#lI&Sn~RY>K&!a1OER!Jl6Owc3@?#QDb9Og+)H{+Jb;3k;oNA(?cfui`D7fi ze8~?TBI6`|60?A+lnyBpM3$$}s2<;X1$VyUc>-feL5w(rcU{C=<H?<r;W~SukaYds zj}+7htb`pdD#jRJBQKKA%8wMMhg%k~Hb>zcaPpw-bH<#+D`nt(H~KCd8$<H1MH#c8 zfk-c8L6W(`XXIRYJmdH`ur4v&S?UR2lJ%0V7s;$-alU&B9+g_Z^KgGjuJ#ySiRKDY zYdaLV+)M4ob0oGAqpAbnodIv^C0T(i@J3-~dWE^wKn7kgSBY=8CFk*!PsX4dMKT5F zC<|A3%{=duX>3M3{|QwZx6zlPKTfja2LC0H35(;^)NqlDt4iHODt^b3A&Fu{H`#Hs zbI&)>MQTjL(Fd;s`PFbJlM7m<X7m#0ehTetvf3|*y?=w(q!#84R8slIGaj$t3(5V( z@aaUd3_5&QlJ{;RS*6I|C&2Sxv00_3<{|WbZPsE1nIp+D=Vlg<p}!82<4k``WcVsH zk?!S5y#5pptw#mJQ~zM9S$4zGvO1A`rYOAr018WunNIbMtkhFh>^<X=%u6PuAcp<5 zHJS%hMWm)Txy>`=EFVFW^xQj!duL%plHaJuZ0CakRvg|FjI29cB?V)@3_myLK2KP$ z^Ke`Z?wm{}*ABf+&?Nuj%GG#Ba1=@*lTrbZhjB=5_p5&dG<i-&NRY^%2C5(8p@NHV z+##ow37UL^%cNGX82bGt5|JCJmU{bZR0`!`R(@viJu_SG9|L8FfW_Gl?IGwvrO}$# z;a(R#3o9TuZ`idmk{ddJX3o#9`-Xa?ROF$Sq6eyRo~RMom^);wwy<*BsmI#q-%HN+ z0GuP|>z^XWDjC;0aGrP<dH6IHPFx`eUhEg>wVKiH0afiEIDR5m8j8m0ha|tnQZ9_P zm8_PNJn?hJmJjMmO^RfUrK;r<*U8Ow?(s@~=s%U!ERU!ElzB^5J`LCV04iW{EX$d2 z$FKfz*hu5aYu8|H{^dJw;TJ*9>j9@!Amez4Y;YZLQ0c45s7LrGBXKX$v~o7%3wu-@ z#x@ep9~aP*Tgl}~j&dEjr_zk92E5UbooWfYOJml#p6xeAQWX94jWb7`nbjlacoLdt zL0<pjs$*Eobnr$kr0)*b-NNcufWt45Ep3S{b&I)wWoK-Sbe&*TyOIl=hs@<-?rHgP zBHbz3gZ_jIYQQC7@Wdr>Rt3?rK0CW)3XAX^3o1sFFRsWuwxct51Ty0<k?C2;!wV#A z3wVG}pyNn#srMPhYh-{PnNaN#E0U4t?cve;{?TZ<dHgO69aBPwf8po~WH;ZykA2{W zSWuRqGU5obTbaoLSLFMzpl%m9xFWk_GP%9!jHjl56g$Kvc;0{uq%xrsXb2H}q669I z^tQpgl8&oN6;n0#=qqR>1-(%cPI?0$6@sS6S>X!Emt<|za?O?g!+iP&YQa{(Yqh~$ z&J3T;=M>ZcW_bi@>cD!67B0m1*0Lwp<9=h%&MC=|zeZ-9NXs$*ugLa!zMq%57GoYS z=)XIN3}!j>)MhH~rlCg;@~x3vwHhP3!@T`)(=PuCRODi4P!^kA&|?0=Q=h~tOkoGU z%4$ZTLC!->za?h`7NZ$nz&Xp9S9xe~lbvTRRTCx}sSj9$OX1WzXxkfDkL!`v%iQ+@ z(zug5l|@TLDJQ7jxydf|4>WKSq5B=(DHRnr7(*vMB|4=Sdi@9V-ZRF%5#Ij8f5FxY z?kWq{^hA?aXBE<5L7re8N@6E{CTIRTW9%K+ckl5#j9u#hSISSF*k?GU3geBy-mK-H z&rUg=TE|Z8$KaJ>+3dy!NQFdfWjCmSK5j(~<UUs70`nS!##{z&ZCWHT1J`<sro0Ic zW+YE+B8j~NGJK1xJ^|NzEBLn6uw+u>{gh-hHOR=ua<>uS3V*YH!r~9{=TySMm~0lP z1<4M2upnp_M>AvqgYX`-+Q7P;01dR9|063r9Z7x$r9N_B>Fm%At&$4+cs~?M#XemJ zJ<tK31}%YD-4VvIj&BYi*P07F+|{hbDn26;znw}*=|p0{r_IoyQ{a;s)R^6)9z<-A z>tt|e@QJeMonE%0>~i?u@Tk<Z9fHGK6Ju%1E_t2tg~Lm4(b~1)|0VuEm_aN524wjz zTJ>+%^Rj;m{8$~{UI7)VVAsYlul=ltMW(zB8R~j)z8_8+!zk*axzj?g!D!<C-17sw znDk0n&xrkuZaJ&{Gl-Zipj%&j)jIIP19U=3WF`&Yu0phd+78f`2cgGuqmjm;QN}X1 z9PC&bv92#+LzY#fFNV}tU$MQiE`lL`89VC-{|#2Mo%Iq<OrmD>D)NvB_m1{I!jB7M zwEdKyK>OceJE$abQn9sdz4D%zXl>;<QdJ*Kl1ZtE7yVFa$VfATs}65lYr#-m?w@K6 zwlz~qSe)KbM!_q8!)Xu5ZwrR(e0-g)6!gEb&9eG(&&OcR&h-C7Zlb+kRepwAW4XF$ z{;aHMVZ7*9)*g^d-(ySBqnF*`vi~^fxo>&x6r7p@A9;!2$%)X7(77fW>Nj?SifHW& zR5O&v@~T1PX(U{*6<+uey)1EtR>YU4O8p$WY#(@B{FTc@mmFxTRLU@X(!bg5wxXH- zqP|sSr~inK7B68FD707U-O-<QnvI0`kpG?Nm2^a@3bK3sgeDq><y{n<?QHDZ%cyHP zPbJC<IN%UFdL_7dKD$CQY^?*VUL|OL3r=}Q9h7)1H(9Bocpv%L+c&}Sp^Sb#)<FR@ z({Z$7AN1h`;+aEO<!tE6``F)Gu^O&H=Zbvm7<6mT+Mi)Z&%{-SAUm0`APwx7NdYUg z46<+p53LL*5R1aQm5DIL6LshSKkY@5it+7xSU^kJs|NDjT5zlMgt^7Yb})wnXs<Dh z{w4Avh>Km2DZyzhk0#iH#J<D7NP{)$LR%EYR=A6VZDU8SLxw<n8mXzh2CpAxe>2$6 zp7438tgMX|4q^Aupz|r>ms7Ddmf=y(LPkz;*QV^$@mOzP(Huq4i1R@-nn4_33-t=s z@##i!6(>H!5A3)#p-%(+MCsT!iPMKY@T135#ngsRmPbbx$9j8;#V-Bzf+trJ(aYPY z^KJl|uE)A-ov@CB$8^DZZhf_KlcTA`spEExX$pJdQRK;m|L9@tPnnsZoc@a)UI*Sz z#hiO%HKykOvRK+~cv<Q!v+-Ui)@KOsh4Ob@tdk$$yy959RpHjIbemWSa#Ts8FW=au zb|RfRJN9)XQz+D*7}*?V&^Ev$TZzBShdT`00cDoDMms?-<0yTJmQgFEwpRXTwTJoN zSnaL#<}*W1`789-sO;_Uz3rXh+hyD^|FU|ZSC0_=+NESw$8owp6M2}QwJP*N?y6qm zlxhof%r|;izB1RFGtCZWaUzPT=v33t+(Fi3JzX)ub0Vgbn+VJ#Why^ilw8DlKT&f# z3<|VG4ql^;b`Vdg#!2oX^nonJsntG2_rw>g&#J8_DzpxK?u+#1ScAMdm8wKQFDqVU zq?(|0wl8zkbDnbM4SC}%<jm?gu0K+rk=q_)+$Xo)-aX&7EcsB<?@7~>yh)FeZ@Vgc zYWpsjKiMv;1?&l6K|Baq8oDyHTj<A-Tp<@6sqJgDC(053cJmisOHVIXSaNGR1UF4e zm7K-(hr6^l%1Aa}`ZrUVF;UkXRh>mco`>`g-4$9nv`t7s=kNAuT2|$fwaFOo{Y;1C z8m=_1ny&k<Rql-*o9`DR)cV{1gA$|a`cr)<XSEC3XX_il6WXf$#XgzI{}1?9J*|$` z&qSLR&~fOaRTOSoz}_$CCBzRo&W>Li6#1@bzyzwP=<P%2i#f#RephNKX^C)EQ=_#J z`Z34TkoIAP!;gi}4L=xK%(+GPDWHe>W_cpqQ<HyBdY?EmF>j(Xu}I>H#4AagU2e}E zBf?fsYvTwD^@h2^Q%7tGUl*1blGQofzFM2Fi~-qVxUZY%C)duTc8RMJ#wMgl{59z} zS9<SF;}3s5bu~yZW1QK@&EE@&4M`W8GjwstNT+2lsz<7w{b#5%DB$kEeSf11a%<NW zcQ3EkH^<E9-)Rd`(`%{p5c?K;21h=}Vf!|{o))8g^)Iw`na7Mm#KSuq$LM%d+InQQ z#Riu1tC!Gl1+j&v5jPYKJQUd}fW7euKkyIs%x+Y~jq&%eomZ-9x$W6QN`%*o+!ob7 z#i$f*qsE6f2#K`+sx&fdc-kh1C3cAS#1@E67h67der*4^><R0WHoE&8;A!afLXL!Y zin^JiXv#AwhDDW*XdK$mF<fJhF<sz=G)u0Z_)C1&xW8jl#l4Q3nebh5caO`MVN29v zsDVlfs~Yi7#Ds{;;n%}{30?2pV85Y#P<s1^8Mi%0UGYh?6Q3qDN!*vT(dF_SH}?74 zs}=Pj_BM{&j^~b^<V@d?z<Q%DA=4A$UvB0%Ec)Kq$r-=%Mi@2ddUP6_e6I3^^YV|W z&uULSo9vaF15qA{tJNmY>!2G*HSitgVGT&nRuipTl_=+B{~23q)vvv9Gz#-Z+>R=h z@@&d9DX)U@(#w%S-Ds}&R7`%5PzAaSjU5;}E!G+5iL0JqB(`)d@iygn)Cc>S(D;ZV zDXOGwkaBE_d66f=dN^HLf-S*J>AUWZaLq|7oR}_QR{Y5L$MJ6yeowmU+T?w2HdAKn zL!Iu>xbUoz6(c7^v=6@%`rdiUzF+&Q<h400x37wKjXSmLep2qFY)R*ne91BHKE7dA zJLQR%mU^oDA(=vVgq(ABacqS$6_m67j`TH3YZUfP@a83Z+lH=CfBLQ(MXedw<*NEk z?Wv6?XMBZjMqx@ea`?OHs~c--M7Eb%305C?r4YI`H@aA7CoPZv(}fs3pebs8{jt4L z$eFOC5w9Z0MU99W6j?pIUdS>1iS3^8+}%CtY<#x34zVR-N5*!D+Zx|Ev2=1}_i%5V zvC>~teW*`&W)6#vs26#d3akPVrNjPo?$M_zEv<&WgYL`8qmp(fj!N8@SeCk}jIKWJ zSDxQ}UCb8#)=Dd_uYDYKW9`FUg*^*v5mqVmsPm2ev-V9Ps$f<y-g;k>gPP$k<j&~s z;!bkE^yKxeHcD7e{Nof$?WB*h7jtxX6m~4N|Ba6CtcK%D%(a%2>zG9LbGC8DNM%km zZD^KESiO<#d4JIPI2L>E4t4MiuqCgsGmEXGVQ(zQVr)dM-+nMq_9=hUNo*{c7@KmA zopdwja<&n_uTQV%-D-a=kG@Gy&?D@h>88Ds4nw1rnzk(d%vNo474jQpq%?9FEy3_e zG|G_K`VCZwN2brrWi_<MP)T`-+-qqptrhH-@z_G`u-8{}_U9ZwTiL(+vkT-Q{_`&u z(k^2E<A_)EC#QhTjUF6`B{+}$<2>*Cuyx8|&38v5OeOlig8gC{SCBrty@>WUz<Q|0 zqYD4m=dT7>EmGkg#noRCyWWph6(q{vxZ(mV@Qv6^o2Uw3g8wuV4|pN39fWT@cm##H zMr%CCt~}aeJr={R6ZB{~A(}ws<2IJi4Jdk@D{I(DjTzBNP&EpZiCRsTPWl+91?!@y zT2ZY@x3=%7kb6o!Ku2;x=WP?P3X-rj=95#Yi@uK_Yje*!Vy&}gTK(A}npt(MAL!3i z3+#)QR%@#puMP!S<5zwUAvfBe=Todz*d{NnRAej0L%ApHBKZTO?uN}j9(!jqe%Bp3 z6-AL@tERM6egdhcC%;>fGbu!kVLbNuQMhC>_G(qUbdC7LE$r+4*s|N;l}%{leNaU3 z15WUJEA(57H8ztq8HP{Nf!(V;)xS+arD#K+ls?#*L~NkuBEBsrIo?B?%+RhTYc>Xb zzKRt;h`n$Ut8*W?BCD`w1gm2ad;dN-;)N}Vs)N!>b9TBl$_@B0IzYkFYChFRcj%ey zf<ETe0n6$Pdq7ElBKR{Cth#gt|7c!=^R`pJu*W=Z-ZtM+9g!cLlAdtkGHa)G+WHra zO`nwk3#1V_i}9@XA=dC6_GfDBloHrrJ*jTkKt;e)o6nY>%vBksGEz~TXDO(N{YVz; z0^{7lXxDS<W;y=uP{vXPTQd~<_zZkH3y$qXKbxxf`vpLC$rk8>oe$fmdH}g&Fh1>k zcCnq<kLTc`$JmW7qQ??_l#|_JhYB`(3UpR}xL0~cb-}`)%)J&vuMNz83zYkdO#dUK zTcsu=JDt2MDCOu{R#mB^G-IVZD4nR=sKqKrP!(_p-fV_7{(&`FKo+wGeXyM%d|to? znGHvE$HMDM7IzHXx6ImV?Z)oC0KLvy7s-b`uwGj#9imFG(!H>KSHNo*7`LG7=Rm`D z$F^RNEZ?M3=N;HXZ~6TO8}?tQ_>9Lr-Z@9sYbEvVzaUd}p|o_aP8W!TMPRMV$&%05 z(6_kmG5o~M(C0V!Xb83MUE#2na9DFV>?fpU6cm=K@qKt#H`w_knl1?K>5;(#NUhYF zSA}W~16F@8)@M8jTk`@xb6ByJtloY`8-vgJjXn?&)LRsXYVD{78LLdef*pedH&IHl zt2~C%!&u!gq7Hv@=bHYM{^xMgIQqAjw4yD=@}cLPbc)Yp6+~W}S)Gu}*+}t8a)~N< zKDDuXComi7PW3O55jmq<8Xs{072#{}uutJdKIDYT6Ji3d=`a5c%-AG43&ldiCv;Lf zfxKX=Fp6G$t2SOkE;z$v&QI_N4l}BaXs_R>!WhlE_Tg?_pjR7y+98j9;l<Is_dA~b z7W}B==)jv;36e39IAjhavjV!U0oQJWmg|Iv)Qjj!KeCvEq1<r%r@@>T{F%pKa@jMX z<3_mYAE+lI{$_LIHKv4u-$So5a9~j-3mw{?F)#79DzV02kcuT}g_iU_(fp6CLv)!O zZw*AFb;dL42;cQapN+I8(V<Ux?+97>cywA3e6U_f_%b}}^YDh7*kw^{!oGNWtMH4C zQ|A(c{(8hZJ_>N!zfdv;teG?Dw7snII^<<Gyg34{>%=#!GTUr{y&#sj#Wl3=0pxWR z(m0W|9S*Gq5<wZrSch}papb$F26lz{WTJQQ=@|5WG`w3GkFp@zvH;I35Fstkqas{V zjXZ7}=r@A(nnMI^9`qUy1;q<$Ok}w#(p;MF2pY`~T%|gcug;?)^C}wfWoz=ufsA+= zGhEO3S8$zS?3b0fS9-j;msrNT@SKLBVd~*Y<)Ky}4c)#n^GNScOZ`D4a_uB$na-aZ z-B_C)^k?QXf&Fed+ItUcahs^AbY9Iw1VNBnWT$M(-r1J>bPcTj&(OFx&)ZXz(h|;) z-<{AwU0KmCe5wVstjB!IA#M5awj<d$1dHYwQGMz3O0OX9a|ZAI0{nIrDU}m_4~U{X z=I390{Ws{`w@AG7GY|{}K@1Sg6X`-P2-1SUlM|buNPxnE-cl1<)!?_}$SW}JVvIgN zpUA=I<R=d+BB!RyF{2ttzr_4n6IJ|$c)&#Vomp_rbe;_-;@yFD63pZbXr5Snic{=$ z^Vrb_;#agIXVR8^tquC-M;=Z2X$_WDcVz2VvJ2zjm5F%&llb{9U_<PHi%ufl58+Y4 zk(QpyX&6xv*0m;Ds5x}}3A*)$w$f**`~T9h6XR$FB^yCY!6T~2c<V6JGR!RpauZI> z;0xOAE%GWTGeDN|_{jfBfmp*MA}UwV=O=kcr`x;G|1}hq{@2nmL~tSmBSX$@%9&h= zsYuu46pT)Ayrm0sI%q8@+tM>bx+6>14#7Igz^Vp+GVw}kUXjiz!OqU<0^b!xD9HoM zeFPguu8;+-{yi&JiP<z}W`Zcy4!&xECT;*NDiY=Rj_XKlCkYOSL9RuEZ9vB7p`&I% z(+N;`EWan=2T$i!!G8*3|Llg&M*{Pe4#Ky{Ye=7<59l&EyD42R!Wn5M^s8VK72;78 zK9L-eNaqjyROL~Pm6zYbM<Rpe1MioD=KpcjcdT7@W}J#~3O>4=V3Jewf=VO1a}bY2 z@H_<3La=_M=ZPTw%R{hrf*p{hgM!JAV4DQ5A*ej^5OfVeFp-rJ)CqYeSTMo&gSaMw z(h<bi5!4pJkCD#o@{n%?tpxckxEX?~A)^V7C)gidMkFH;#1ldNk#P#rkM!%76L+8C zBtd(B0e3w`CdIQB3@edRdHxh`lDNBI8@=Jv(t%sfE6Uu09Y|~enuw(m#3hpY5y6QN zq%7ef;Va>ybo`c|Oo6|I!!q(tutSXSV5-0)3cVbhr{LuXR!$JBCdgqz3!zdFUFg3x z39gQyr3g}yAgajwLSLbgAgf3wQ*t_jb`o4W{@@jnh#-QFd{dPdc|~5Azr+FyzAvu_ zacBO+hza863l@}M`2UB9Bgixs)Rynb=LKU#t|Ry|@?P+n{1!YY`TM_n%K!3;{0@FH z_`ZDd|K1DUUG5P4ZV;_Vt{1H3k^9QO|E?PB%OLmuZ|1@I2wj5MJTkf<Zcp%;%sog? zc|VBkBj`TDlfm8?!B5CLLgOGW%6sycP+9&Da<ouUR^|UFAoP&Y%RiBc|0pc~%O~Zt zGP2;B1;_aRf6Lv1GV-4+$_fU*EBBHS1Z7EN<G*_cS2K8hnZFjGa*!Kjv_ZZJN~hE| z$UTB`8I;Q4+y&Prh?*lZDRT_+Pw*}>p5P<Mn{r*jkP3E47haU_1Su0-JLxPTQW^aH zAMTK#QOWZl#$K>jhrA;ECa=po@)?nHL2D6YF?lZk2a%_O{3qNed?CCf+#<i_Z{d&s z=q~RGp9i@q_$m2hkQ0T6f}a%K_1{&3V-Iq<&@s4@L5}<nwMy3eztsp*IVfkMJ%dsf zl(6861SL<_Ja`rPw#a61RpobZ)bgqdJ!Nf#meO}hEDrg;)NILaB05u^hq0dv#-ZSR z>3qsbY~F*dBj|<h0L>+Lm!F+?3YNkV_Dxx1=|L8OmAf`jpCH%|cd!LYvG@1E0vyX8 zbdDT`^xPuzhWFYW8~g_}TNs*aA-h*svQkg|d$8woV3SrMU(}AP7r|b8&Nu8-1I(m` zU<x~Z7TzC27O@2x+7bS6YcrYRcKC|VY@>+~f8@@&z;77fe`-BtuPbBGmr5CcHx#A} zq5t?Ze_Q3MtqvKlxe6V0IhDGPIjr+9Ab#G;R+1dpCR?0UioA0ToAf~bmncgFx_$-u zgZ6=}Q+j6A6V3V<Tjmgz6@rA5L)n0pQiQYEz3F*(hOD+A8hxPST`Th0g`w4TW+xpl z&X6m(!nZ#Wmp<dqMRy9xS-&Em*@QXDF0qsRXgIrPdHgx4qmjORf_rk47)y5O@i#f% zB4n2Y7vTl3MH6M3i`CPP)!fZ0$me&G;mJw1S#qxj$$2f}Sw5oY8_A^iBrhiY=hne~ z*`a0!e3E|nL{aSC!?{XzA_@DkXdjZ<FHNrR0A6ARu3Mhf|4QVk2HE|NSaCa{Wo;}& zL2KxVHSii6G&gHH7z^zOuJa4oxK)h%4!-6gY_NjZ^3z$}*UVOWF%M>s6eOBh&bv2) z%R<@H@<PQ<Sb77o`gdV*_9U}WgZ2Exwc9c>!IyNBQ9F+(_7`66HsZ8K0LS_}Mm&zQ z#ci>hB<CmkA`BZQ6?eGHoi5_HNe%2>C~=Vc$3UlxeET|fQyr}QI`{z&Jb~Oq8cJiY zHiLV2v8SJ7mJ&aRf>+zIM&BVn8hm^WAK)81*nK`D)?#knor%A6&-NaFY9~I&cDPhf z7*y&F`f>(+5&qBsu6Y7#B#^D|0ELF~DS9X3!|vo~E|%?3EM4&m8nMRGl}&oYyrcG^ z04tRRJ4-D1zQ|c)VqdwD`V&yM71nkSYL@#@H`*TmdNMP-L6*OglBg_KYiPGLm-axr zrq$5~tIs)0GnvfhH!G*r3e@TYzNNm}obCPBx6H_IJ~a1PgRx$!Fpo6&pe2Zb`~cQ! zI%Or4|DE{S9IFavy|YuhU6Ee*d#!LH8ZC)uT|iq%EpikbYGb70+hu2jd5Ki?hZ_6v zCN~lHd4jKg3N6tS4I)@>DX7GFgdHVa_^RXQ^}vrB0ZpW8zr2!CIZ6~H6#U$9YM`&- z%k9G_Zh>XAk4#W{vK$%l1%5>8Kf%$Vf`LNLPrSdy0ZlO&KU)V|xV>7NvlE-toLXIN zxHeMTq5h)mW_;uPd#x8{xcQGSlIr#vzG*(qsAeoOvYQ*s+13=U+RpZwd*|l_Jowq1 za~W!@ik6%Yl~emi5w9p_RkOxgbBQ~)Mix(_i@xB`6USHT6I1$%PrU%E*^Z9+&c6@8 zeKL`>)qFa}inFp4&pkl|CVK$;sx{H6et0k=k*UtCa%sL-2aCTqalI92r>F4MKg_EK zw42PQTHqz*L{~p1?pB4l2oBD_Snv*Jz6AV*X+*b9LCJ5>auqR<LrBy-XtW-mpcQeA ztLTYVtll&0Pa;%x;Iqv5sF&$X0-84G1)n*qhMaJIa15rmNe{(mtuQ*!PHP({!TxY} zb6c)mF0ZSvXSc7qb=g)@i?olX_k`hm&N+IoeY^gPR#PpegxKbAO7bM<P4BwCb7gaF zbggw4@uo4-T43jL)~buXLjT0+q~@HbS!>Tn7R^*fQqAzmc;K7i9pK4LXPBS7lYPUD zc4k4&(7*C$Rz7oXud+5%JE$Gdnrpk%zm(ZjVYEe;Rz->nP@nF#BA8c6x}b_g9HCBY zH8K2)XqI|NX*1$5_lXXjA>$jWJmO@?SUfJlUCP6rCumd$i2u|lc5;qrUU~o#8*qlE zuB{2t=<3=#`yU~5!{WlXMU04u2#*N~cU)EL`#1T@xbGznj=vO_BmR2)rG#6FXOo(c zwffB*uWYa{3>_WOHL7=tu_<arS>aDZ%G)o|;kdbPi2GtvlZ2n+2E=xW?G)EMAwJ3B zX=p^+D(GcH2817sJQ+1Ksz>C5@Cl*U969xhN*=N!N$xwzVM+GHvkC1JcO+eO4e~ZI z6<b|(fL__r+<Dje)LFoJ)m~2DLkELibbBsrl`sn$%Q>TR+gA}>?uVS3U&AT8g33`& zkIW%nmxmnrRU%}4;kMFncUSb*N_5gM@cCUd<$65HW>mo}x3UnOTaUz#r;?#8RzYU; z;&ABr!gfW8(=t1sg{_ZlOaAawRAl7*(ChXg%4lP(>xYCvv9VvhUyH@wjZ2a6JmFc= zR`)eujDM+KBvgxxPWdR6J@uZHuOcspCh9e9(MEH3v7|HcZ(`4W+yAXstP$5Yv59My zH=k8kUFo<P)-mc}$_1&`rK}&7ExeSopH|Rz%4p(Qm%KZ%Wx^lvm*bZuq)qz6_10U% znyc*6D{!iLXxL_)tE1uX!#;&9cO+;;e9fx9Ywpv@Q<JR33`zBp8-OS<%hYY(sV}vS zoQ+Fif2G&fZ)%mb(yCp#=pSZvFgJ3VeY4TnG)#|moyxqW==ve-1!eue5y`w~{XvD% zSa{P=ZjmSG!@hHju2jwF^Se;ZY~SR35?VT9N94>XgKXEop)c(#l@?|jPoCtS2}9zZ zf4lQ_-nVUW4HEmh%J{xmZPn#=SIEuq(~)IU<Vevw@^#os=Q*v7znE{LD|6!RxJI$@ z-`2%OlT*v=YUE92<xs!bJBLO^Y>liI^)2#MgeR<2$YVXu*2qljO-x>p*f=3W!p($+ zNuyntJiU#*{<PX@`wntw=R@m;E(v+)9P1dTuU2>4{<c1H#$~CmF{W{%Hx2qQt+B%_ zLw(LKN@eu`=;9kdR6nWQrB<#RG2F3aP<|p0zuq#eNyJyg+jvd<ArE*Ldx%Zi=pt~B zjt2XoSOd=9{GlFJW7LIeI}j$;VZngpXdAD#)_dBY(N!d4*o25hk$EB~hj({QQ;%CK ze9hg3k~bxGi%<AgAhv6Ke4^L2#dqDxqRi5UI6jAr5A%o5k7xttM0e*u`a9cnW05;W z((L%{aT()FCwxu(n4H10z<1eNrsj2ohPuKYg<lUZ6#gtUUr4Myv$oaW-#F;0?5dhH zoGkycq!q4Z-XZ1}e_!>CKHIUyIVI#xNXC#Oj&O|YE4D{gdo$Ds^G)>5@_zAd@g*AP ztVXs`>?mcmELv*qkQ$+8QPSIL`X^fN>gLUgA=;=alR~stf<d@J~%W$73>98nt%Y ztZQaY^C~CxvVy@*hJbpZj!J({C6xss{}_D(i0AuXQZF-#Zs6mUFmi_z^b_`EXVb8< z5!E8ih;CsE9p}``Rz}}Q_m9bs6Eei@`!+7NOMJbg8lD{HU|TV5j{Q$(hR^|F<HLJ| z=MP&%4~{C@9;=^sL2`$LBXM`*KEy9dJdtd;tNT3YD8GIM4owdG5>`J<3mxX%Vqc+^ zQgT^0yeZv@Nlz2MC2Gm}+{eAWOnSJh+3f8(mtV-a+2L@sv**?)syA&v_-~mj43F=+ z@0jnduZoeuoNU#zy;VwUvD#^^s<ug;s+6#0_y1t^F;mk&V5WJ_EM@&=m0|DS0TRYs zw9yTvKeonu?1B>X2kS%!it~nt^KXBc-K~;X*@ZZ7yiuK_hN{(+=~$~ZiJsq7hN?NV zIIWoO)4JNfIs1oIh{zBb6Yg^M)b9IF8I~utyGrt^gsO3|u~XvhNzL6Ajqcz+9M<;P z$2fO~Ob*RNccEz^$&T&%9a}-8vitj_$b@V0*%OZ>^>C&1y!G15wf<M?9ea$kUg+`A z&Y`P9dXRB$s)wuJtlPd~o{p|A$-R?%y56~?eW%Qhw(Y7@KcFY;@%nYnajw#1wK-~D zC5hetf?3D>Y+Rz_L`hR;_otd%>8B=h7Ojc;2lmJ+`q-zmcGCmkhMC2xPLA@dm4p2Y zbWt*%%al!=$a)43fpqC_ZEfIWYi?7e_d^<Mvo(h5;-8fWwLel;o|D|0@!VqYK}OqJ zD3jE2T8O?@KWM-13=0d5a7AniZx_-;?`7*^miM*syh$#SXv8&&>mC0&G0ff7*V9^I z+o)dFpE{<6tO-pYwm)=lNGGS=J_w!F$&)R)Y~quIZHXt79ww)DFZJB=owZ!bBi(Y; z2#F8L5PCNxEF_(CkbRxn)j!E7>YeKz>8kBo>zeFt?Y(Vu_BT~#s!iCtqd9Ha-d@c9 zqn?j*$PcOJy+^ma0_I=FVWXkh!WxF{W!NUe756z;*hN`HRcB8BBzhy%w|ZGUtO4Y4 zm(yV)o*LzN+fT|;^1_SApx{4HTltY*ABo0G&Mgn+9Bd?({s!A}g+55?Of|duyK;|c zYCo*WS)97P2z`!eZ?z42UPsrEkzo_UmGEjIyYzX=4LX1A@=|}0G$CPme7l4hNweIo zd`rxQ{$k2gb+=yCvDDcsWP3=5kgm?D_KE5o>y`I|t8Vh^q*}=zlBc)|xLbNce3Q+# z^m19G->3IU2j@9wtaG;Wk$s)!RCZX0=v?>3lMj59b)Le$l;%Qf8nuV(KwqlLsPgJn z_1BzId_*_E9m*=(1phiK%2KW7bUCa`et#w&&;k6A2W0ue{in#x7ALYkhn!DUa*bv1 zIF4Z-TIiRPoS*EBMc;us*LbqMQ?1O_1M1NxnorCFXm1Ul>m>QcSiFXA^i}wV#kta! zl`bavv_kYC8Lm&&kJ;ZlZ-h<>I~#h^`AQ$77Ps9n*ZO|)w06}<ib!0VSR}c*yN!2~ zue-UE>aYIVJ3W)5tn-cYle38PvHhSn)K=15?X`L8xu3hXxPEgTbPaN!_H6V$H%<Q) zs*on?G4@2qU}raQn5NlhYaNvS{ukyt&fWUGSG~nKYkbd`0It+$3(S364Bd`;Xsy9B zxS(zVFW?gAeJ4<BKAMb8D<TeS@mr_jqxT@M<FamoQ)N(nScGa^&F|*Ka22BB241-2 z=$2zyzqCavud!!RP{~@v|Jqt%{b)S`&+498mNUpX@f-`0Z!gOU@R8&>o8k?m<{WN! z#Z>00ZM6pa_j)z32kx<x4GI|-VmbRd=IZU$QT`F;3ZK^#?JkoXle9AVv#X1zjdzx> zt@+gIXxpdM*RtC)a*q7D<5$OA`xNaTTSKeAQQ6nR+uifQz2Cjjeb?Q9j#Z-#!yHA; z&RVsLz5%3#zZ?r3=k2}q+v;Kv7KZstffliZPBSZw^~Ol!cjKEe7nFuU{%y84$~NTz z6>n$3hlo|TsZ~@1P4XkyUR#JUtR?sL7yRTgub9itzs$#IrfTF9H(E9_IOm96Y-jh% z#Y`t4U89k&8~EgYvi{A<k?p|)x^Dh$UNSRUORPfp<W=xx_K<~biXC(reYFAqC$AC@ zvcfHOxOQ24r>St#ZhH>rN9P!4d&diXm3CPnA7`HTb@P65zjG~fm3OE29Ps4!y1hM( z2j=&j6j-lxgqz;m)6vteg#9?3{l59<S?5gCaQmWtUA)=oQ1sMOg6=b6MiFzdl?J`> z0X=+&Amms5px#5jL5GxLYGvhjq8M}h$>g1Dn$wIFoa!BC<YN52srPx#PSlNx$^Pmc zH5<J=f6|(1>9zfwVBVyBhA&DGO{&B$*Tm>(tTL_|c69Gqv$GY&yz7%^9?04Dx@srt zRNVNBE-dPYc>H1biRG=*RG|!m2SccSokq6FiHAH5um1=-Xb<-H6`KPsw_cr~X?hC1 zKZqJ@9DAHcoN1h@!>8xh@2i=VLjFqTPLN`1d9J(Xx(~bEV3CdX)bjr7du3#^8dDj) zM#-+V)!*okuwPebPOYQ59ju9+{usR6RAwDxv#*vf%xCwd01F}Bciy;S##<?<(%7do z<IHwl&V}#R7U3cHr6w#3XTn3&97;yKh)$e^9?EX>&3H|eV69o040BPkp`4Yb(qtvr z0Ugw3^rP8G&z;j$OMrfdmKg+<W6f9QXH(&%a3|{zY9J~hm+?e=CgGhv#HWp+5@Q7M zA{)EfUh-JSk+Y|0v?L;q#mIh5<Nf`3u8aA`2=cfCiLv$J|D|}Us#20FoJq<KWN;c4 zo#QxPKNb9wvuZ>2f>Kx+M5HRrzsVYojoOJ?gAh8V{>kH%`LCIT9;wV8vcvjj<t5(p z3wm=ZF`te+dJ^3lh34puANUKAD#@Zv<XM+My~|>vT04p3Tqbgr6%R<Np??eb=v#?# zNF-+k8S@FmXnNvpw#BDzM0Bhi-h3lsJ6#!lSE7P-iFTAD29g$jd_?r*BK!PNye+90 z+Cx-e7x&mi?rtvesioxpcc9I7qs^s1%NuMViQo#ByWks2*IuF8Eq*^CUiFMuz7c(V zON{FYdxN0Om%^(%Z%d2b8n3Ly_j^QDPz7}!J%b8@2T)u~LWkC*7g8VP0a{@@o=Yb3 z;IY&aw6S#S3RGJ|m#h(HceAfKkA7wa*nLkB!^lP*jP%m!Kt!P%+&+TGKxifTf9bX} zl-zkgGLdq2`766jMy$3$M0wAHwELPWmrwjWqx#@Fy7e&h+soOE-Q?{T63rXLT6cs8 z8WQ)CEO{FIEjfLA6IyM7DzmxnaIW5yop2OuG#8HC7|74xXYPVdEPa`!ON5+qlyk8! z`R+xe?_i*A=q`KX2cn>%WYY4H<*bQK(2CXR&n_^76<x=O9-{rCsp0-kDTdBm0ER+- zkZDG#eTgWgSDz^>l$y#L*1tS=iJ|VUAr<dyscgwXRm;C<hu!90{DH6N$GX&KY+~Pb zV~u2Fcg~L{XwCTNun#R}<SU3~?Pp}iS^bNFvwbEJ;{xPYTM@Asj~-ovm%a=7?1#&C zAQu~`BiTY!P3pfUFy{X7R%hahjp40QMBXwJ#g`MDm(WiV1D=UJFo^Z&4#j@q&Qr)1 zFAUIZFZ4JI_uPkLr2mQw%h3yOy@%Rz+W9rl1UFqp3#K9-Tat)VUG5|N+?hv5xV$Bi zl@{daM^kz67yIdbR`@*?I4`Ki$v{2TYIY$F+x;zeT06Qp-6k5<f=HnUem%_CYWm}- z`Dtx^N5`+v<^$@`Zh||N1#52@dka1!n0e`l>HNrw&t^vVi8H2Q<pi}o*ds=IMMxGq zWq@kZr>X_=*9GbgCB`!j4Kf|coJ$?UBz*Uu8FzbXO`5XmwV+rHC|w$=rR9o}E0YuL z@ko-?2wY_+JOpR`N%UPF`?>#N9>;n8JUk`2^#8ipybjPy5Ec}!l!3TXL?EYL9R6wv z&FY~C1chZ#Kx@omWIwaQ4T)dZCi)^-|7NUVN21_8iCA?e-ZzZu!kB>Ujs;huHx+6o z^qs?}isEs<BZj@7*yAW_<9u|!o`H4TimK5@c;KU;=oO?if_`sB;I~#t=N4k$HdgRQ zq^l=)mQ##6wFJ`dJBFzCO*DpNtltt%yv6)3^LGNWl%5@{95ku}y&Cbm8snAPjAqPA zc%TE6tVvu*s(C8If4PamXM+bLSe3XyrPXOhdK!y$H?%weH7^CKB&93ZX*8hpkaz&6 z3EFH9z88(ON3j}m)>SIq%28wUBll~<nu?ruKr?h;h3j#@>QGK9R;saQ<R&UAbr;$B zorbGOO+^;|%E!oBBiDzh<;}wGkW;ZM@33-ZZyCmwv%-mYq2yBZesTX-V%yWGs_M)x zwum}DJ6VCo$jv~a>&wv1XP}lK7l@7#{D<s})kK@fEF>q8j8>688<Ibh?0y&;TM+GS z%qS=Kk{rKuDUvQ?xdJ21hYo4T+?w;dI<Z~p5+%42(!Zhz&*Y50XmXWYTMRqFZZ!T^ zWKz&z<^1@2cweqBz1-jNY83PjXHH4vCoD#j7A_RokTdFnH7^+Kg4>^;oJLM6J)}of zA-<EDd*$bzdAPGwykzBB4n8B%{K9;u9Pi0_^eXVEpofS~+Ka@mLb`ge8ilxz$#`xf z8AsUDm$HMlLT(FDX<vfeSuvhh#6M|`F5(<8zDgH9F(2*s7oR?Yc7DhV;&{B~@rjv8 z@1``2OR7?26se(G8Z?pM-^)nz@hB1)S$-n91sPr80R6t_wKDvbm+xfZJ1Nl?B8}1; zE}k7yI*a)OYjz)6N?nI^y_fzT(#=DvvEl<7FC}>v=|7Vxz+I9hb+WF~O)NE1k%@7n z<?k?_ORq7h&Pl_2Qah8Izw$D+B2X|Z?+eO?JWI_OBvT&D#cHgX^l%Abbn>aRe5NSe z+yKdHPd05dIzsB-S|E1~nUU0DOI3pOYLWgJ>v=4rl1e(;bz&D5)SF>E2Jvhtx^gKt z*M1)VpyLJgK={^2PE#tK45Dx{7QrZy>L0<ekleBjYDsNVG^5nGUk>I_mid3r3gm#s zg#$EA$0xpL)|vRUolnV?B=aV_t;{GLbO~jgpLy;Gyf578W$Y1rL$s{QUF6J~RIp0E zT53B|p}%tmXfAcn-}ATNb{IsRvqGB?-jV(WB^XgUvPWN_TMlF>9aI$l59d>|?*(@P zL2F3lGiD$^l*H;L^GxbvL~_$X%|=*h9noE~Q;5c`%^d~#qd5PkVGodgbf2*lj#0t5 zfGX52WQ(U_501y)*o+@EpM7)|JNRZkaT*$*Ciiv)8vD3Y5<DbbyBy3XlDSDOLo}3= zdN7UOnFI674Nb$~m{N=;Kl76+h%|gE8`SYL(?ZNNf=rJ=g>E5epO!fZ1x4?q<A2$a zBjCau@XmLPT98~M7Avb(i1(zXC<F2$z0Kr%Qo|<Q*`#-l>`|f#1n(g&RFldQS^1QF zLOL_as!2a2;Z|9lFKCnO+&4W}672l2zzE`@kW@oS4U3#Zd=$`(7N5R>K2-U1G_Su$ z=Dc{6Ww@i%hm}HKONS4^mXRvj99&bn!AUKchdt;b*3dzAiWAfa?Bw?zY~X$Dx(5S0 z@g8JWurp4wCg;$@vTy&3{&<6LW#e3`;K!&?@jGN+x;{z$iSUAOsK%TMGDGQoCDr3u z*graQf9cb)jXdT+^jiiHMecLLvJaXro@~2Zw>a7_Q{XB-vg558b0)Yk54(9!@+GOr z*bB~2A$F(o)CHV}PxB(lEm#r3L5jrMXu$dXhuq}~=eniSgbNOl{joOEmB8mMWU?5a zOT~KMhQ68kZUs11^yxS5RGP8>gWYkK%zk@xL`h~8Nep8b@rzy93{BXHS79HHVz-Ru zy#%s@8K}HIg}pZx4&I8M9mHOimh%#Au$I?T1Dl7_6XVb%$^12tNYW>A{bDz6#I6xk z^;+=cV|Hb!Qmw;y+?<qB`9yX0{tD3b6SJ1u1?fc@?4&4|0-tzro*lmUj=eb}=iaYz z&a)}jPE-CW!Fm;eN`l}cU8$m(zt|TY;Ws(2tHY<VQx(KFECf%NV6DD!MZrCJ9GH7^ ztc_3bmkTY^oO(%%XL1H1C$AS~d>^6FRX$&Y74RX0QdL?kpgk4x7t(u6tdnT2n+sZv zq2Booxza>VdYIT+QCRhRSkvN+FdNr?fYi6+G(tMRfepV2D{G>)n0)R(<bK}c)feJS zYeTAC`a{V-xwAywqzh0_c%vcL??X;@5jJR7xS<=h&C9Sk$}&d_t`cpK%)G9_7YA9X zvvBk%R%<#|-5&JHV*I~d@Usg#N&f-S)j6R{UufA78j3{y%=Ma}J#z3!3)hPUkq6Gt z&nJH5vtoydBuBF!MZsGNYfu`E*M=3$g#=37kL;>Bp`=(;qFbVom{hDlZ8)GNb7+qT zzJPhmVBeobT<AF`R);HlK_7jsoL3f;Ay4A{vPj`dP8nqLKjd^xZTjklSaEckok;iI z-k?bSja6UOnr=M<8@@BU);ac_x=`eA&SKo)yu&+u!Y_CY&+zb%;pL2jV&5|oH<BSb zVF#YlEGk`Bq7x2cLrUMu>)4Oycu#)hM1$a{_>l|g>}DbZ;w?*Mt5ip3LGLtSHhG|> zcsYr1sPyYf;PawM%kXYf_`Gbut}F`&6oVhL1gMmZ&bg08d<6~niErvqO}d>_;`8;O zv{0%df7L}2XJQjQ;tYQ!P74j-^kG@*`zwJldQnM<@7P2wsV0H5R#@4^itK>1E`oFT z)|_J2H;b8-%^&f!+nSZkyykbD6J7<%+7M1DRb>ZyNJgmxGX4ZEm6J6EIMJF6)m{ZW z>GODn1JPy~ur?pC8y$jkw!u$wx?u*s-ez>^5_Yb+{C|R3hr%mT@m+#-mg;Zm-Wjai zl}h=iP)1I6hoY%uzm)w;PS)s9N)VPzEKTVpln~IhvbTu+n2ReFf`6jeL8Qi0`lx+^ z<1+KAaHX7Dk=oX@{GX0*<ilTRi%+(fIDQ$WAD-gnKqljnT16YBE!0M66|{HiNcF2y zRhfe(Z0x^km9<uq`<QH0G}0NS?>uOeb$ma7lMYt85e|<vwi2yn=;+Nh1r)wzoC2+@ zj!}OD>93huTFpg&<~y8JiB>kUV#)ASS3IPTpf{etgZi7(Df@XIXE~AgOq>#}gk`ms znN}jUV}hi(hQ7}Clnbn1Uoi3>pgpn#&;v%p_YJ8$$VP@H%&+(@%R!VhGgfaqvgjhs z*Pxi3j4Q|*m525jpr_b!Qu8NPdKRR)Ivm)BHI~Zn#_&^KBvbTZHYBzge*RzNMVf#$ zsFF#&qPEsPahCZJ2$pZaBhIFe*A9SXc$kWl=T>2Bq509MZfpgm*6xe<#(39yJ8*iv z2hWE3@*1~|CFTgLAGJa`iK1y_8CI*G)m&O3Ekt_&dgC%E)>kc{UV(q#;zcK7t>2^H zgN;bqA#f>InwyCmrz8u!&w59<hfwO-n&8XFuv5(>J~vOv#uW{<B=N*LT6XOkD3dFc zC(M36R5?KWt)!Kje1^xgOqJ7T70D>C!_!ys6#8MY`apwdiJlvP9{mwrW+B;+p<rx) z=ltv}?T9yTLU(LqWhS!s6-OdPQ>0|qo<Lmndu6f`L*8d0ajs<Twm!@50EJs|EVD<^ zC%&ZiNa;d-pV!P|b}@eQ9rQZ9J3TwV?@sVs^i1+}@GSE*^40@4x{{d(eMO%oWe3Qi zhqTvpXs@Jq(rb{P>8L#g{l1NwgWULcN)K=#K67Gj8+p#zMrk6<`8d}($GB_MC6_Q7 z8V!UGq~}v>qBttqmb3H$c%t?rI{s0+r>zIgx}x?)ZBLeJBUo^${3Fl{Kawx*VH7cP z8YPTY#$@9GdC|<|mlt6lF1A^=mhj|F`eIxmM%9S2-apaSX^1}`Ao8}By=y1_qMQNP zf{*nOiO$9vq(f54VpCUCOF2!3V3_)+`b@1)RnAoVKF4_HJ?C2IBZum6>3?X~mBpNH zkM-sAZTIH!HV1up1sR+g?#%Sm=<bPizjdGSjPk88C;MO6TuLg?t&iCkI?g((IOc!` zy$_sKhh7mJ`2xyV)@L@^?KkEXV}oy>H_Cg%^WM|a>+n7D{bh_Wt5_+;ZnhmFJ~>N0 zrhZauYuh!qmQ_!$ry|SyQd<DMzbH4Uv8>J>vkY3lHAkC;OuLyxUx>?`p<QO|H&T#e zP6_hF2oPiZwiQY^Jt2xBXa~{31r$Fh#;cLD7sM!Y5Uc*g<F&Pm(|h%)a_P(2v$9xA zZv(dA1x_*6BJwgHnM<qQQ!g{Sj-ZY=*B)sV>@OXTkO?8DoY(D*_3~OTa=ojpt@Q8! zMZsOjvlrT|cFj$GlRV8m!g~-*+$di$-$~<?-%x+D4+J$hi=&m}mLsckGPnve$x$pI zzVi@^>x4A|p4{)t=3C%3sDm2dS>(y$)qKUkckT${%o!yYr(*l53i5wW&t|_xmSBgr zO8cNW^hsK6^$>_)+pRuia}I$cUJE`PZ4@OYsgw6x2=YW_Vz(X;UT(1d@wOsVteHw- za8NI>OYKMMvcW$#@KMH4PqmtiP-PxDEEoOh4YMV?cPn<_qu4rksD`;`n@MC;Q7t72 z&E1hYk<Y58-BI_dTh-<0+^5Vb1PxP8bJ%-1-Z;`Z+UbYX5z0K<RR2zMjBlOip?j+5 zzSrj~K!1XA-sPT;o;YtbS(e*IL9?V))HYe2rq8u^w$InsYYFNSwUT<A>cn+uQK^Z& zg4S6@jv}ks)41;Y)i)b_bjt`M<F^hS@f&-<Xyq80<n`Dq(?QJbMXg1mdPHr-F3_Dg z&?0=sIaKsrv5s+4(@jPvlv#fOtLHXnHy`mzY3#8>?5K~?K=1I1<fLm(?1zWg91r2w zXzVHJU?a7uV!>S`mh=W+DGj?@aWs7qtd6qmb8?ocGamg~;<$&2bgv^GIUE~Dtiy#^ zPlvI7T*Skd@^IPiDGHShVfI{{R==c0XtPvB9ioh~_3{5=T?G4hA-#46nPFys!{yuL z>kCqL3u+j>zKzBtc0e5~$xrV0EN7RqaANu~S*9<xVw}(10wo4PzYwY|&Y=M!Kx`}G zM+uW5EkS0qHr3U?u<|pAun!`Vuo8`)5-YL;b%*P)%M3EZITZ)Fz;%p$5O#7eEFM8v zF3eu##&VE2-#nrZUD)~LO!HVQj)gp=|NMHq5IJ!vCzG}lkNAdVu0YFgfoC@C{6~Q} z<a2Cj>2M}iLm7OCR_ux`*aup&8!W*#JWGA!Kk!~G<4MN;c?c&bGQY8$#{UX8yOj_% zBb7PNmE~9tuWf%q>sE|VV{aTyo+mGPu}M}w>#{lDT)>I@*;M14A@ZCBZl3@Gz)I}b z>G1v$PT#*EADS9{GaV09&f}fn|6`2(6~3Fq7D^CN-c3fs&1l|`*Lut&hVkuVMQ`F$ zq#=h8sd#wjIx)v1>{rx_v9on#PA#z)rRVG?tl2eCst+fttAW6kkDA6@)I8)PSC9+) zBqKk0iJdirqNC8EYZ$>DyzLM8*>Zl@jz#qyHbM=k)RUE(%*qa6b%yXW8ms*ecFK+H zmFLL#MJVBn$D#r<3w+Q9%-<ML9W*k2S-@*{)4`}Y)dC0jUIRFo>J@63%aJ+1NCj{? zboVxMjQOiMfeM0u$nd2@2M?zTcDc1MK)1c@;h%}tSL9oQmGBAQMPebZ@Yp4u7sc+= z6pL>^cD{x#c4525kU_mhh42;5hra*=AX>>t&96gAWMwboovlWW`$4ZCnO`}qZaZG> zNi5o7__4*Q1x~>u3wf11RNCgDjyngBoKUV1_*|{XOwDEQJB3ufMytO^hTmbo`-zf@ zRaz12UHW7Ff*;inZ+Zl_#4=XtBCB-++d3t-dwFu-d6axSt3fZUZOUEny$!O(iOMtO z0964Qm9xyKC3~vHjF%FLE8<uE*Ex|})rvPyo9oD+?Ia^~*L0h?!Ac$o#YUi?yI}K7 zCl7fOdovYrQINb?*RugVauSUr=&S{}?gS#&-=InkRxG8WkOOe@NPxGJSkF*w*%Ykj zduX*YkUi^$Jk}3*B-Qa?z&AoS?I&8*mwN3=NO@W0yb2s$g;lD|UuB5Q79d7jfm+&O zNax?kuw)el5BU|;`pg<S0~}V7eX|ps^(&MbfVVM}$nR>R5BsPfc@L*o06D#mQU&j% z8rIDs@;)j&m5QGTRaft^kCsuMQeDy$eHcyrWd?P-si+y;O{_hSb&L9^8R)jnaMo?m z!NaTyR$HhwifY{Md}0om+y5es`8eA=oLuZ)yqpt6L{2eQFEPT3=%PiOY<^?2lZg(& z7K#mcl<(1f@mTLpD3t+PCBt*q0vdP*64DRPyaTdW2X9Ew>g0sMXmnRK?voy_%EBW% z|7YZpiRXEsU@a*1D-_+qy{{AVm+q@Ch!#Fa9_93CMj{Wz(TS~)NATgW-P<FPi;;cl zGpcdUyGh{0{7+zQPo@_49P*co>aB)qEo_y{>H}z37`uBd)Gk2`>NqjS>S&?+L?5bv z(7qgRv5)z)Ii7uBFLgYTV7JsGU)#}YLGEW9d5e8`F<$C2nxe~>A}c!rxfkIn2m59{ z{FaT#TLLI13Y0RbK?q0c9g50d8K|UBM~#cY`(N-j?@&X&9UT(Po^?QH<wlc!z#HC- z#ovo8aCK;s8_!2$CvkCKKX!ZyUMYt@>kLm#M&AqOzzM!{72bM|UJxYYZ186dc1A&( z?m$eUGrDULRN9CA{sq~qLKl%<$lO@yaSF|zPpzkRqvGdRez#KdqTd&S#Sx-hBD+_O z*v2+ALbU%fy1giMU_0QZ$<S!3IR}5`AhmTb%x|U!-at-jG6quTv&Xsv)=g$cUz=~X zNB<5d=5h><mvc^S&;@IW1zkap-$8%BLtAOYhtg3MBibM%^s>>(;w6t~=&q~iu#*A4 z`dv-~p<TjQyNB3H8{zap<UK0jA3Df(z60OjAv?=weARGXD~=pC!h@6;(rkS8opAPb zq%Ri93q$hqunU$)qJ@uo!n42Q-5zCBuh~9xVzt!=m1KxA4HTN&=<;G}4Qf$-Ry$LZ zQ3$*DJf1;g`dhq1^4hT5{!Pw4)W09!EwA;Q&V7HtMN>ijpTf^#9xLFftL7&&9A4{B ztZNsRk=F`iJ&U4In_(X;AQt<TXhd<=Z36q*b~NTS_Pq~KNc2&5^kp7AqRgy~XsUR6 z&;%c!pw(S=$2~~HXtG94u#KcMsNi=Wg;PgBrP4^5!*8QjCmFlM!B|rV^5%KDe`O+; z?eP#NU{UNqE+j`O)|P1VVuAQeC+IVoD9PV&?V|vNvY~bAQ3Lm@GE4arTQE+^OeCNg zJk*u06P2)hzbGepuQ?+Y?Nk#^0;>pLZZ_Qs{P?-s;G~IWFS9F=na;##e#U0lg4`MA z_ek7O>o+q0C&{<Ig8QSOQ3p7FBi6zzv_TG}Z6rSG8D?%mok&iHq^FZXMyQhsDGP^- zoM?3&9WI*PMQ!wB^u#{)p$Y6tO|Ty`V~;<DKC75_Usj;9|9gK1=t4^ZR>sS36%3rT z=%!-4*O(nhs#@kD52uKUiIo+>IErC2w;~2P9NPbl7bKb}Gcwj4+ju=z@+<JNN)w;z zk3ZNQ8SAXJRDU2|5`*4uzz9!c>179>a4}aeOb5sVXror}ke`hGdULqhkE*E7{2oHR z$bP(qFslfabb~-e*}*xJTh?28My6p68>2fHqh}MyC)8kuQ>pqm#aewt=98d+58qhy zQ6$t!jkINgUeU;1IAi$AsIL((T7yk61kEaTr}PncNgQw&{4<73ZDTk{uwycygF=YL zIQdBdb+Tg<R3u8%7XBFzb#`FEzaU0sXOGN@o~?!+8pQe^g+pC<ewC1_Ny-LdQf?&= zv=~4I>F@l^QKzXxkge3}eJY^3FuI#)_u|O<Zfv+RQ05?<Ll-A1!uP=`eV|Gcvw_(X z`cM;yrTH&7Qw6aEWdC2!?so+&I~_|;dH^h9&E8R8RSu0f9{sZ)t#TdeyvM#whCYc< z$ctYq+FH1YhH>zZfqcD2BOFIF%)q*AioTE&a|y`DF?8>2_OzdoocdS*W&YQy%!IB? zO`I!TK)MQI35X6F31zlp0o+Hz#R|^~g=?U9#<J6&VgzNt7CJ&@ZlaP3FSHMFq7`&+ zS)$ITBh*ZF5Vb_9pv!Xbb8N~sxYr4i@;L75qNaHhHc@Z9Y~8wtOwB}&8k$winr16_ zW(BB2uj!*w2kU4#ymb>T>3}BH$!pGFr@6*TMMIU=>|IOIIES!iuVJIz<Z%gkIgPv@ z#O6N1^Bb&S4Ep#YQg;}uXel)L73)BD`O56gIq+4y=+|?2vEcKf^?S05)kAj562mLN zqab`*5^iaPx6nVZf9+yj?qd@Lt^SnIr5N1THo(8z(f^r{qZ9biYw$0>rz=@WEfxOi zBjOnIh!CY!uY<mnUpavePa+=Jgq?CPQLyS(2_6NltW?aUBx0V0sF+6W+*|V*_TmNe zB%1g$R(3V&o~MI1bf0>JeC$@;p~+w9Ovy7fM;4AS0<SF$d5K2n#!-WF09$Y<_Cr%5 zJ)N=F1OaI-l0Tcc*<h^cx@b#@FFNqRBuA#A^&V3LatX;4Y?m$Qz$MfuO++V;;xPu^ zmj5T>TW%(fbpnaIf**7X>+%ji&)79BELQ1DJ_n0FJN;w7DPz@)L?#{(FFC7C=3LDi za5Ag1b7!L#bstrtudujNfvq0mA4#_0G?vXIv!~gZ$ItM`0{pXu*n@wYyWo%6=2Bvh zZZkhMeRHVH2#1@eqT>X;J0C0C9UfiJ%G<E7YN5?rf#TGOy0;S8d>`S2P0*k>^sgQ8 zBfcXekc3bF57v?RgiW!IJ2ShL*p;WL@(^SY$?INYX31Dh(d@&5XB>tumi`j^@Nbr~ z3;hQF%*Mx9f_C0WyloBCIm+(+4y{`l+j1j5jU6u`LOrJrqz1NuK3Jcw&!N&YtA0YO zPbZ|MbS<5O7TJvjWWk54@Ups?FX(sl!8g#ChZBm0=p{9bo>3)?CB}8*4ZVRfnFHCO zTcbM^WcD>!<(Kfx+aY(?(Btpe;|dVJ-Nw0_jcN~U%22HDWyE6Mu=)*%Dc@veJE6th z&~XxR-Re{gwZ<dqOhs^Kyx+6faNn~Bc42nMuxc~%ttnXgXLtzm*iP!tr0;wlvQjZ* zI9HGh7qqFS0i4o&#Jy|ad9A?XD#YIBr@D57lAuf^X5E>7t!M3z=`pq6{+m6k{i;4r zZ=~nbr&G;+1<R@*=ckrfRm|-46U^W{>>cC{^FHw$@+|iJ2)<tj&sWa_Z%-nId5p8h zM$Vd4!dm(Pojr{HPQR;Jh^6+UkK1tiEIuSYmQ63JEBa=wjCNElp)O>X9gF05_aC*= zS$`5isbGFJ78nhT?~DR;T%BcnCAxZ$`m?X>?3=A>SZ@u9x@*+>ji&q6Y2{-e_Vyj! z=}u!yOjb&x<8)$KWw3qEQs>$a`V~WhkAtN4$!vqa(i%IU4RMO$%D+g%&)Q49If$$i zoOHW&-gGQ=<lrpL8@tCo)ZRiru70oN<t$N4>p8XW_r2r11-%nI2k1Y1(zV>Rz%|Ad z<GSQ_dc!%XHHz~#hm22VZgQfg?F}8CS`tD2Opm`ZbYDBd^(xsL+56J1@unWFch^>{ z37k(`jF-9z9I0F82P2PhnXXP9ePwyn^|ka3B}VC>=TS{`bBMJDWNFaYZDrB-uasKs zd3)5`oVaPFb<y0!s2{WUb>Ku;726+Z&G*(kE6iGhCa=t1SC6Rm0Oa(xHIiMvFVUH5 zN>1XHGxTbXgY+oP9`cX#t>ZfV`*t}FIMz8@I4<fnwFo7aPTd2ncBX2C(!=?*C(+%> z-Pe`HRnpbmwZ!$v_0avmliD}Q_ZuA@=NNgcRsIs#ESKr3xDy@Y*3Rn-?VTK>9Jw6h z?7BUU{)S!ji&|mrM{*CB$?^B_pRv50E=p~*rR!Xn&+C2ReMIlR_uhO&4l5d&nfG$* z24^X*`*+!TC{gM!>Qyx}72z$l+FB#x{q?A=?nMN$E0&X>*k@#|K2sMxl=CYJMTkkp zXXBj_O{FopB)Z-wf)aUDS*o7Ww%C7it_w+|J8Pzp^3GDua}I~|uH%N|sQrnis&qE+ zM_LojN50M8wVoJy;N5g}qr2$d<o{vnJ>a9LzW?tnvn2^Bgx-5qsz?_VQB+jKhKkt0 zj)+|pMHIV$6;M&IAlN9P6cGg!P&$Y-=_T}pl&v$n`@BDMfBAnO_LY#`ow;-GIp>~x z`q><fL<h$5<JTv~CJ);UovWNhPGS0!%vIjKz8U^@)1dbyVdss|SZ8-^0Wn}gQ` zHquWp;-Bo_@5}M6V27T>emf`CF4db}pRXh<5@!+?zMx+8$y||4CU3XfIek)hQS&oH z1i}Q*?cN?f+c)07iEeuVD~iwK8UKC$YyBDDlfK`*Wyou-$t5{}d~+RL%bszDJGWCq zbB6P!^P}^=6LsE6ZA_occ#$Zt^HuThB|EEG=wx_X)}E|)vKEEAhUbOGhOQ08$a`3B z9rBIv{Ffe^+Dz}xrpaUR`LR~97ovls@yO0dZuG|JpV4z;qp9WjseKfWRU)-0-I)3f zclv*^76$4DhX$Vr4uOI?gx(E}Bx5-dI7lbx$Ngo#{=Rp;w^JSVL~55a#MuS+9GBdZ z=taN8)`?Mxjfug@)AZ6jWRIu+<j!<kPirjvQSSpp|L?%YzsTBe9k(W1O|6fJkdEWY zYUjJ$JDhszNxGHQO}~gwrjs+%9%5f-KSxi&CeA2lF7-Q~OWm5jgPsHbdXM_v^FMA~ z5%@SbDcp`q!wqx($=;GxH)~vYPN*<6G<YPCZ#DA0l^K>=XP-#M6ZH3uZjM|ZiB#l9 z_E-E-aZlt_WLEUX*z!0%Go69##T@LO0bdXQKI^97Eum<rZ}`gay3oqdS0Orr2X71B z7HDYo@u%72gYYWfnGU9Yu-{2GPI{Ax#Qkv2HSxXia}pC19g_iiMRr1_SdsoH^Mfbp zJ=eb+Jh!u6w;XFA9OIn8F{__7gWSd<Z!_;|G|oTSmo^;-mvSaK_E+{GyQ&>ewza>s zt2>j(w0Z_<WmvimHt&19zxeX3U|?}zbnt@E<nZO$FXU9MvMHxW&XKG{`18;Q!RrDq zSr7Q%q)Po#XF)O+?@B)I9g!<4zAXQ+{D<;8Dn6@tCNeZSGS)lZHxWxNat3Cu@t*c= z_Rq7PqXO_<p?2ZY@OfF+W^D*J2~P|i#EX(o_r+U$RlRF7Z>N7D+hLsZi2X3xMjhEh z-Qyon3wAi?$IbL-oo?UkyqVgASK%6$A657Z11AGl2Cv1}wJh)!ymFg$1LsD-U+CLO zFO27qNP4G!ac*!9g69Ty&_10^CEM8p?XmVI`%b47*#w)@Ly6TH@5#lc;~|$K%Ni9J z6s!e@za(5WYgG2#IdgL^%$c5jS=OOY_uy))t^Z<Qb?+0IR;gpjT~ze#AMG8vuwqpC zb>&Z&pDjOLu`&{fT^`?<@Y+3{`KhbuAn>GrK;YisX!2(Ig<lS@46hH*2oDc`5L(W; zag<uNm-y12A(_VMb<S9OMDkc-PGV%@yu|wW&G8G!B5IykoA@sIwf%=<r&8(NnU$W6 z-u1xqBdc{_3VlI`2OkO!3swaB2S!8fui}MTOiWMp%&qCyQeQe-?Uwcmy0tE*esD+o zZhI+p65e#;&hXSR@?VP6=sVav?(sHekJ$K+U-bXN3EwPm99*>xErJ3@X0^|*pS>_E z9e$i#uoM0PzAxx9FfTnUwZcv$I>o<^u85qe=v|RlF{t97ikXpZ(JJw=R3T3~*QC|O z<_B-ex6-N+yghVhcvJX~@ThQ{tg`2WD+5QsR4E?sH|afdQQDho=Jd83Bzr^Yi{swJ zM~T|W5p*$q(e}{q^X}Becyb;iQ~PFLBV>djRt9?dgx9b@e&BU-xIXq*V1awuJ3?J^ z(x0amvcs3zBdC#a6=&mk`=tF8c|T7h8Jv%OZEw0alHWe!44y+LYfWa@BJU}0eYXc< zh3^3h>^y00vIbF<VL@<xXj}Nvtl?SbWVH=XqD!^ke}#8;=EL-(sV(;S<oStUynbw2 z)EB)x(kpUPWL0E#G&}xo;%0kjDvzEf<GoK&$>T!na>iN}e1HtXk)ex1+k>@&w**F5 z+5Uyzx9P!CC*3slC|N$k>{RjrXyCiV^u*r8h-6uEtbMD~5g&G%8VZv={pr)Vz*oor zI8_wN{DZA;thLr3)?BNF^)mTRo3Uo$S<iftE@n@cI^Q{WI&GX9__6ysgOQVtI(Oi$ zU!J}KO*epdKoPFFNW~U1|NZD2tFf%sCu3|Lka*tLnFx-cb%%A>dNc5FaB*m1_|B{+ zvaZN#8U8T%i#6Hzy~meXg{Sjqa$Vwu_#ae>*c-hk>O>Ne(#W0Bn(W=hi5d3Ksh=~C zd)N5Z_&>0237ih}5B?b399$NBH+W-k2fa$yStWFop6tEIvnYK{D#xjA-<#~pt9kO0 z<bdQG$>QXr<PVO9<84e$PvbN2;QjJNsQ2H_ddYg0E};FaCe|7MGGOBIkHZ5pz&nKq zz&4pt>7Vc`zT~uaPLbVQN^bL)P9AXCm}-oaV4*Fn#O|!VZ1PMr0vcWT>viPaCB#M_ zMI(I8TNmwkm_OnlX`Qq#3hWEaCBu9{xRCt&UE!snfx+R{BfbYb)6(apZnI;F58@BT zHb(D@j)^`M{UK^cJJaR63)x=Xl3VQ`Q!_KKdz-Sm#vtRIK!zM0x|Q?(emd)JrHl2I zWE=nLJwP7*9OQ^rP7S)VPNgSn+r)sxtBEjqlpoqtoX1j+q%XuHGYy^OWwO>jCiiP2 zIgAtNHv0v7$*oqx|E}MnhR0Lh&*_?xzykIkHl3QO)#S^ybG%N}u1!?KJgQ~C$$9){ zx&>CaOVJ5}*o~`r_o82RM@RCaA76kS;w|hK$32%IEBEoOAp3VM8qiJF*H-gDEU+zj zEHn~s_Gx%g=<(o3)_mXRo|)+w+4j$nyPb$W7VR4yAKf1v5{ty{kMAU-c6DL_khm>n zWoCM=@=fy}v|@pk!KXv(LT8Wwb_LG_=E4sj^}P)bOCaUXN}oujoodcddqMIRPQu^t z%CAWDNp8j;zuq~N>O>akKyuigClkB1|6%{f{(1iOWUc?^|Iz;@yzCZ#Ya$LV^L>VH zwkoriXoGX<2HTh#B{S@~_D}G_QRG`bO_$bD>7(fzun-ht4_JZi=xVG1_ux0Gh4*nC z7VVeO?JmaF*%5tw1~&I;^xNI(8$>pAPdd*&9Ox9R9hx6XgldPM2u%;(9$4c)&v(0L zeY$GuW_xequK1|fhUiB~Lyck!V}s+z;xp-wT#-C!A90$buclwlOk~X2{<p0M0~ZIE z2kVAPgH!2|e#AQFUkz2PBDyv|(>eV}Y95--GW%sXc`v&Y5eCiajQkpA#3}6TtH_7T z#ilZah>(BCu>H-Sjb4^#6(LDp<Ig9%?hWE7Hsdo~iAD0x%y(%gH3SLpQfD*#@jiPT zwS?{_|9?;Fi}WyT0pqZk)7zNd7PkP2a%{e%vGw;uW4HnD(KvkGpJ1^$;K|2!y#~GN zMc)bE2%>9_SX%>2gQG%4p(;pA8DyomEU*7k@6^n)REga)xgowhmK9qU-4pFjul0xN zKfE#VX!1OY2_GOr;ww&#JE<5@i>%iQq@`~--`@^SrnB*Oyy<<c8~pu!J-jXG&Qp+X z&hE|zn@jCkU~{#7hPoI1oY#rixqvFz=VGsFjV0hgPZO-h&-(&!h?P_vaQx-|&HfLG z)mcr(=MPjmzK5zr4Kowdf%IFctkgH~%3g5H5zaF7^v}?Peo0@6Rpk<V0~VQ!J&7EP z;J<zw>&!*)+eUbR3(?CI*SQEk-*es*-dlV>`>F%?y4GLTxWE;`L&5H$r$g6-HU=96 z8*qv~=_{r3!m!lOcFp9U@zt@W@QqE;!q{uE+VTJ5-zDBoPOv8tQ*%qY9p2ZsJiW=p zo#lI!e)nswK7scFivm9cUI{c0Oa;3&{H>9m{GM1kNN(&jr={~3n&7L{1NqwyBi*lY zI%9+J<5~JW-H4pXWAM<mo*s17C?pDHv#+Ip1T+1@KM^g-@x4S3<(}R#beqY}3`)<U zNA+B?lZQAXoo}5gMC+u8J1b4!iUmnl8&#WE?7RAwHG`A(cBAs2A%^UGtam3oHL)X3 zC(g9B?>XNt-`)OVa`mqd_<}Qn<-snYI-zC37Qw3n-K+z?;ofx_UwWwXck=$kb@8`j zwK+|a(f+ZOu}9+l5^a+$>^5{~Po&nQU%+Oz&NG6jm5<r=GyS>NeHJw!sM~PRTEKaA zgow5Az8}3?i4Sa@xt89{$LO*VayHoO?St4Io+CD;PiiK*;$uXJ^uiB#i0Wvgz?}~Z z%#WNdclqXX!nB~r_4(|ZZCHy>W9ynsrfY8Iru4j2)6_CFrf1N#PdY=W7&02K=F5zt zc<BMaK(Q3+@^ctZnfgQ407kc9e_e$o<r43kM3Pp+d$H7)0i*x=Z$SSW9@rhoM~}XU z2)8MLa;vtL=Re?`M1<R{R43<1a!F!cyfFSj?2*`mvF~H8;#=Y$BwkC7B4%<(>WXwj zEQ#-Wx}&l6M>+_h>%Hb*LiMmSoLr~ih#!*=U4;GnFy4aiuybFWd5?IYhf-&pkI0Db z?_3G3e}?Vk5_U~3Y~KlF;+06nk7Aeca-P15_wFn^yua^GMj1(*(0RVIM0@u1F6Ydg zg$4SpbXDvzcVmy~g}wZHYR^9fN4*X!TLqE$%JAySK2fLL9oQWg<0an=ywXHN55?NJ zogF$7oAh~LGyxAe#wmHyx-IZGGE*xgrFDTv(22uVRlh^z%D7Cg^a;A%&q@BCNXPGv z`{SEp+hc|Cm*XuHC5cVR<@R^ZXQ@}|?sE>O_yi)qUV>LQ!d5pDxXj@7KApXX_}i0J zKi$^{|H$3m9dNcE@i2TujkKS!e&nbAqngDc=XVD?3o?W9W~Ts`d$1>V!X6!QyGN`e zilC0Kxv#yi8Jc<#{=0`cMdfEnVNL9ezxNeluT+UDAFI;+R85JbFT;1S5WA(Kb5+4o zwak@6On*f@AnFIDE|WK5={?}-MQnE3dk3>03^s4KimW>We+5#3rojSEhZo3@??ykF zZoX>X&1BWzoa*Sbw0kE<C-%gjiT6S?8y^2Hercj8F_W0lzO2JeZ9r!ngh%grys_61 z;kAWs+D-g@v5s6w{&g)RsDFH4;5jP9Mslt9Al~%^KH>&Md=4bm^J{!(JyVTSb;u~c z5F6*)ShwpD-@GGzIrDFbW#K<hM`Y>my}R&Zrt!NR#Cq~7F$E#-A|mP4L+>dp^HID5 zi}2nqqsP=)q6T{)i@ks~R$1iBh;^8Q74|(WlFHS20XcmdT>K2&W*FX)Vj%y6H=npo zc$L49>L^VD?+11Tss*c}Pkj`q7Z`~i^uF%}?@gYznP9qv%1Bvu-{dEW=Io(4@gL(y z<9!l8CHhehXg2l9`lo8(_xp@mmHV)qY#>W`6j5+%&;$?riunBxf6v1*IUFp<yz`L@ zYJ2~HTU4co+3i>j7hp3yCtZ%M|0}$VW1y9ZRAVT@{`e@Cs8-ndi!(Riuk!$f=i#}( zu$PvQ$^AS&&0Oy~e1yI5@+@Vg*Sqn@wK<7e;mNob`>XnF&A^iX1GF(4ufx08@*m=< zw`13RnD6EiyHJQk@+o$zo9MdHm0C|%`H%X?puvv{tb$S!fgOQ&19bvVTC=E6w8Z-r zw)$7nV^R~GAMKLlz~qj^^NB%;%My1HFMB3&YjR)mS-UkcsuNR}kzfBV9BmGsfY*qb zu8HsdA*}yz^O}g)Xf(XwQlcIbL_bW$i`E!P=_BTn1CGZMo8rr?#MW{haUs#vHlk+~ zp|yuos0Xn#>M}kW4$uOx&LXI>DUmrh<Kev(yMHUMpD4=j@yJnAj3|Z0SfO8K-H-5k z3LnO6ShU||?eFvXJ6P_Y$1^|D^}Uba?+@8YMf7SMjFcAj+zL!C^=&{F3RrJg)zLP- z1S&rVCI-3$mRbeYCI0(;4|^Z<49(n;9-bQQ%(b25bIIz-y@{2`s>c&elTRlPC5PGN z_S;lXSV{Ec(e#6ie<NP1>i8$##fp5G7@0;s`Rp&}rz@R0YWkwY7|kJHe;^p%1$OR3 z&x&G)f0lTeJh;M__{avr5o(b!or~A#LZXSL6UEvD3;bu`R9&CPK<g{<108W=VAKy` zEtc%}$Q8dD516_?9>O=g6zjQqxO~FvGxo_;VDkoE=Fvp(J;(E2;k_dDqMVt7@gMD? z+u3A1fA3OJai+hX^%U|+7L_^r2YQlt_PJFZOY;;WZU3fb&!+U&)M2{Y+-o05zLLB$ z*_qcB$??feRCM{;ZtQ&SG$i(*HZ@jq@Cg4$wU6h3OU%;-T#n_`|Aol3y~J!D#h-DU zSfVw=ro9cHzYJQj@n3(%`O*jf)i(Stj}SjqNafdgco;|F$GDy7hEe!2rXhRn!DrSE z-{+g~&13iw`@oeZyIx-P+K@kaA<-?P@Kv6J=5iK~=~}#7^YIUV2}C}`Bl{K<BtO`b z(8@R{=X=+`Qw6Ntj=%T-ve0MPir*xZe}sP>GS<`9FV-2$A1Jd{;^#So<@g=;&RTk` zZc6`~vhg=8v9Go*dwcQ^^s=&K2m3K(t(HW0A8{@vvNMM`<c(-nPs7bp^cEb0MtO#M z8yB%p#t;iL3v0tNXlD@+`JCQn&%sqLhw?+{UkkvJ;;U+q$F-O>-@{&Nnz4vx*he(u z3bgk>@WyZE-6?DWb%|DZ0NigT!mB4b{3K!}f5oD+1fAtQ@NpXws<H|_WKQkJH@Jcm z=12JJEMhr7gvU+-HWPu!mwf&YXHga~xr=?ggAAcD-re2{IUytHnD6-iqo&a<);Mdt z^?=pM+JP;75qrO}x3}l|%p>WUsiV#n=n<pso^~C(hTQ_2%LHs}4UijGICZeE|4TIR z1olr4IQmM?zDtO?`^ojKwSg1f%hTSbCc{kP8NUD<?{aE9MGV^I_*_GrL(4r=iSbik z-xAJ(PpCmVfODjP{x>`EfGtda%j;`?egZz*iKu9aNAP33KQ-V;W1%#8mHz;?Ur?9i z5kBjNeyh&t2k`{{i4Soxr;d2+40h3Hz-AUvHp`*uD4AQWiN+g?_EX`xki3W!$XFlw zj{3U#pZBl!TUJ+VFdA_etHS@8zoUPe?+7|$UwYWSi7hkX+=6!Ul-(I$g$Jng!}qb# zuIoJPti$#=2@lf%Vk<0Smu4a@w!^RcgX{lnMt0Ekz~oU*iC4VikQm3aqn;%K<^goE zeni1n^Cmg3enm<c0fr0QoVh9N!U37)oJj|vk#Deay__CP?TRtLeI7OG>Y-83LmIsR zpY3<}*wu4oFL0Sj6yTjmtqtKR2arF0hZer&^|gEEe9r&hKruf<JDZ8W^drZe2QPUI z4}Jm(<qdKdI{L;^r6?b{^CR*gva!Z>AfM%oe-@I(A|g;O!YcOxaa}2F&|f-LooVF! z)UdsF$Zo_wdf8rU*Mv^CqP0yUvf>^v+JfD>0g2*1X7?{LXe)T>gGd%{Qg7~kq@oX@ zkk^39lR)V@{Gx4%%1PrxUruDn)A)#6;)&e?7M~@Wq&4|G`-wfA4m?y(=2oJFpFo;h z4PUtyj(G$*@qX_61L@@;e0IIdXCK1D-V!;kh*g_TGt;4{Pmt?o02ft~P*sHe_+0YQ z{d(}sm!OeTo>usZ|G-;(BRM#`ea-xL`9DG1EWx7awGR7#_TS?#A!_M+^yyZfyXXVB z30dlSEL2akXG)VhlmFn^sA&(jzp?YtG2+f>vhE%xmSP~XbTzCK3pp<vvoA&f`N`NJ zJ|#MA60mp)Ki??i&*9#|e0u?1eHwH6lmopVsn?-g*g`U}<|9+wKrC_!*<>cvF$DRv zZMrp8j&9)HQtD0MV<Q&xezMWF5Vaa3_Nxfr^lU63cd*LpWD@OW$1HTuo!R)yXYiT{ zeJtYBb?i9h64wNB>O1-rXV?yU$=-mxlOQYPMP#Wka`<TMG@JZ;{D;v^zW3kn_xfM- z9dfnKrI|C-5qS{nZ8c|--OS#XoSU4Od_Vakmf#*l$~UK$=Xu1J4n%Vsg6H}|;@HbQ z9grQyapKHDKKq9MClV2LAC>p6N3Q6F#@-J4Xn`-JJ{fm@Y@}P@Jnyo`-eksYCVt=! zWUgbxb394bW6g90aV$r%lXl>gUYG7jWIzHt(?^^$6=;YaV7iN)H<eT9V)jA+j<lDR zi?h;89_~7qALTkPfrG4qdQ_nx7uok*_}8PrRTY}AceA#xC(GijuP2;j0eMMY>PJ<< z8v3VyjK3xlY=yV4cRW(&9#^lQ=oG<I4=1N2?@nHh<o0NCe$ui>V%Hq&6msTVNM+)o z=n{kA{WXBcMB+2>W0B#xhl*Y+keMfYUuVDEPfW#)XtVt}jd~GV(SrCaKOA-`XU9-< z_`~4yX3pZZ#C=_!u0n+25@O}%paB)2!TgKucsVxHSD~vQ_jUxbRlTRMhD?UWdLpq^ zz(ZC;AM>CPb+a@t<tu;1$e;6jE~oQO&Kf@)=OSWU=3po2j5YH(wXEj&3jD+UKaufu zj&&VbT0^PLRzOA92Z=nn%=emi3E6tb$x5x3y3BdoE=N9Vk}OXgN}NvAO5U1Wf{$ad zeG@*+Pg1>+r=BK;V;pf;136Q6du=qqhD6Ed(o5|SQtNC^oH6X9yWpueBC`zQHGrMd z7CY#1B=*OM-rkN(*(9?HZMF?rD$~%J`=`241#<-QY<)V=b%N@zCc>*7yy-j6^hHE) z+>a0M06OB0NNKxSzv7eB)9(?+k~}sQikk^MrbAip^KJ@|TE^*noamcAoHT!9gMR{V z#3)XgyYY(;u{Kyu@$0=9cs4KyulP%F);|7WNUrn~%Up~VtiWkP-MLx#Mi0mL#53_r z65l4;C)XyQu$wuDoo`bQr0c+~1~GCs*1U%3_on0qwnTcbNo041Xp>`5N)b>wj-4rv z?sl5k_+@aGfyC_1g?IdhHandNftRq4%_g6%x6{SBhIot9&Mo*3pT(}Uo}Sx{v7Veq z?$=^YgRil0Wcj9Y8cv5lE+8VidgcV0;z4qITJY{QDCBQ=^j75JFOkY_A=<cs8>iib zn6ane{$0R9XYll@?^3_*pM^Kp2|OPBFW55FBILyrSrTXxsB0bbjrZ2^e3q`4T4_I! zyf*Pvd_(LG>}l;|Z^f#`|HRVzN%9*k0y9%n(odqhFUL+Yfwk@CBtJnETpT?$hX|f) zuu%PitkVVCzzqLf_|jzmy?&cdw{y1irf2z(^nLW*oo`3U!t^EoA=B_;vN5OIZ#eI# z=A_qW4tw@vqq_;77O+CraV%=*617nQ3>P4S{fGqH1kLv}{k?*CCsdP0y6xk{l2t{n ze2W;KDB0F?sIOW?&Fm#;8s~c&LbJ{AL@x-e2>y;Y?)I$j@xyP)x;g9j@XS!3;1|{& zpY7S7cAR?lZHd#d_oF{VI!E#&-RMQzH+p`o6IS=}$(42>)eyM<jz3ObjR+Rvab%#T zedl8btztcH?XmjOvG=dQKg9M-3v>&7L`K?YzURFcc#6}XrfziF+pUv*60gPE#cRj= z#AnB^Oyni=?GDb+)C_!*8BfBy!}kH!&eyFK)@rILzG0nXE%gud??G=qjD6)Ow$V82 zt&>?spSb_95oM*m#VS|ZIYxc!Jrn@xhJEpTR=zMjnH~>2yrsT?RS+1-s!PI$vtG-- zE$8)|u{ncsre!bBx-0yB@D;1I??~qARB7_J_^hZEd7qxF{<8eC*=7C8`&I0qiubPg ztH}n=j?^=m)t(jJ-+c4^ccBB$2{a^P#SV5Ng6DzIJE6xy%|f$+#{)UUalGZbz`HAR zb9%nh!9JS!iA=zAVw<A>Mt!lDV@>0w@#@J-?f0B*sRE*k?(yD@{r_C5ppOh}4updZ zu|I4HyoUYZU28uc=*C#7skMU*^$O1SKkO#<%;X?^T9>$-JDPkGzvgT#yceZwD5l?g zt8a?`KPw(+6-tL+%|4w|TxDhMy?N*5mE|U?4A1#B>-^9l%kqAbx+0kqn^@7ljN0QR zbBmW2KUA{l>}_Rsd4uS+@vD+IIH}YZnWwxh{jXZH13QE9kP~i{y)*m1oC7(HsvOR# zos*xvC|nVAtbcq|%uG+Qha{eiMIu`(tcq3Ths!UlD2xQ7onlkt^|6jboqp*LGdnyz zd_(+WtvP{jg0F|_gg*@L3;!GbB)mU#I{16wGV2GQ-#a3+KlPN;9iP=5iSqc$_@;Q9 z#N>pZZrkO_abS0xQ||moOwASK1wTNK=qc81!8YNSvL4KtmfItLRKbygepP=dcp`so z?lwBg-fO+(ndxkd-xNueepnJHE;_yGbni3KGu2CWoUK(Jsn{DGoS0(!)3<rr_}W^Z z(bc(5&VedV=S|G-S}?3&PX2ooOsJFdO8AMuE52JZw>cXVlVa;5_g36nzPRk!vV~<G z%ab%3JU9AO>~MU1vXOHlWoOdfBLBL;xKJ|OC3|~zeIWIH_Agl%g`c1r=yG4wb8%*J zs)N(delWR#2$XXYy%TpQK1r-+jpru^C;v{4M6N&L;O$KRlnHy=`wIQ}R+qpV!8M`v z;VZLBv&QDs%bl3lJbzyP&iwE4`sDtUeQxM^KQ&V9VX-gD`<@+g=GdtRPOUjr_00a_ zrDtcB^^Y8kZB67jBh%A7wf%zwbwd^5P|mfvR({8V6$MWeOv~S&J0xddxL@Er--h%8 zI}=|P&54{Yf3bXI`PT9`=)ij{GKWgGAH?e>m)Lit=pX6rMz#MMp^w6AvR=ymHv6jV zVOhR#yWq{%T3<V_$FnE>IQ|r`^E1An3y{5>WNp0BE3kkxvR}a}<i%#*3eWiySRS53 zGJL|j%WF}U^sKM3^-N$wZ~;3tlv6WzM&8i;r}O*fkISu^Qxtm7|6=A>`>J@?$f~lu z(w9mam5eUA_3Zl6OUuVrd=lvqJ2$a0`LEL|v)G%Wdj9(CB~_{erAhg*yy>|Ub2?-_ z7JT2o$dgL7b7m*6OWYBEB~}u>D!M81P^50;u}GKbHL>~e0nq)Y>0aJ%{qqAi6KAk6 zydZo*xPR#U;8|;q|3lxO<nT3QFTRcjGBLHsvF-Ng?mr|KAunvPXHYABVft}$5Y*@P z2sVR(blC`IBKQXW<<z{6z6BGl?!n=qd&AjTTe9D*@^<cDx$ANtqT>0zSzUq)y}MJZ zskeP?<gxM<rMYLnEjd~8)!FjWS>^R2k4Ha`pGnqCeUrJs7qfE0x8zL9otif{uUFnf zxfMALvr9vh0*(FOdHScboJ*4X@C4<>T1Kyq?5x;Waj>FE<l1Qe_*co>Q|KVx@&5jS zCDazZni#BaL)p|9{R2IGhi@tN$XcG4IG=w?J%q2cs_nOH;vt+zG~irkHu<ER@tJ&y z^f4Ga!V=`VkJDMmV2eF{IpsI_e)gXq_#*gs=;`qJ*&kKO$vd3)OWvToWmP(6cL{yy zYmgq1{2+E^q)mDIvihZ8oZWHOD*dT+X<5~ZK9S#|0}`cnF!Q=^YT%ymm>gD>e{p`V zymeLV?2EGQ2wfj|#s7!5s^^My59i|KW%2LnH(#UT3Hqz|tr!_8iB`mW+tJi#p5b`& z@3*eTFEoi9<G+Jzf*%plQacc^7Wldo7xWsQ&m}~7PK7GZCwB0DVwQ%d9wTd^EY*N4 zy&l9~w;_Wuj16@cF&A6#JKcob`<w4+YiD40uxI$2>?i4P(4k;U{=~fQRr+Ub4cy`F zm3lY1I^Hq1H&R@2e|ej-L8ar*UUoLG^s%yo<)<Ql#ZS}gpv+%EORIGD$5n#4i>vIT zYy5<)7FpYgVfi>X-8#qjWac4fbYgF`ek5Emy!?go<`rWj=f^h28z*nVoB3J#a^hMa z@-6aT9oUYy{Ic*4JpNk(S6g5CntEfzslSM9KRY#@tew2nXLK;>;tX<T;d3bEEPOB3 zf|?5Z(fyiX(c6us*TM5Y*fZ68m%n@9WUy_xarQq|Hst*T%%|u5RV6F?+t6A6C7v&c zy<MD~7;hEJkNjBHru3JRv&D@{R-gT|ELP!*Qx!Y)pJ%!Mxj=DnO}KNmFK2Sj%$(ji z!JGy;Ut|x;Y8Sf2y2JZmdZ|4yaaZhKiu`PijE}q>DT+K49U8ki{%T@~y*G7*r_}oZ zGTFkwTGC%8v8D`?`Y``yJj~<B`FI?C|GV@);trm`o7&mw<1BaD;%y$7%1!-Fl;t~U zST~S0xr_C@fi@QPH1Sopz7Ke*?EXSdo4oD$JMtIg9jWqV_S@lK0=M}_X3k4bOf_-F zCF8ME6(5(KIQxA`q<Brq52e4CzZWfzZ%JO2ax#a#CBCWFBf-3IMOL4jFLK_>S)Ow+ z=S239tewHMe}Q*drYv>ZelGcHVp@DbY<zTCWKd*UWK6VAY*u`CazN@bVqLpZ5$8MK z0%9u06I1aG{)Mls`>nV9ANc;D{zZXj3^h!8;n7*I2w5yV)13>cWAZi8-Jepq`C|MT z58?}a1WjkSC*>`${t2uK&Ced5dqMt){KxYqRLRMnAFdk84)pTJum(=eJeK-B*+2GH zMZdBON{`S@q`2(5isO--*y>n=#NOm*&au>2nfku#=xs1MJR$2))}L7$=>KpF{U7cR z4GP{IsA`Syec)M`Uhf3$#}l>UBVtd*evTcZ$IFEH{KQJ4Mw&S_Q@5u#X6kwaWHWTY z3pUCBy8mV(BU>V;Od*3Rf>sbG?&HqP2Uw)PC;qp6>JYxKqts-6D0MUO`!TF{W72Ii ze|e_+hFL=c>ENKOt~ryc+(t$EUfH#>riB}ZmIa=rw!(Vf$DRr4&+Y1oI<a>mR^+>i z!I9e02clD>HKVsjpN}<6%uN<L{nM9F2fQx+$*;+hUm2K0WMH*$`*0*gTuktiKoM~p z-{Wx|mbo{5SLz+7j?)v**1$v)Vqp#^h9#FJU$S2#(s?zJQGccHfOr4xdBl5#?~Jc6 z^`d`7YQKjJv8F^jyoe=a51DF5u%mv0H^P_B$KG)Tamtg)jQfeZONkS&>FL7VOZ@u+ z;c%y{YFR_V*M;s0?hlL!bbt>H3dF2I{x06R={ud($w=ZD+UD!YNkpVBk57$NkBy9d z63<UwW3O>y#4qehXQSQR>Uqq&z*pwCt=9wh1@>E4SO?K5-tZ6e*YkhRE_ubflnmNp zGDila{vu{!EY(5k;H%nh%THZm_i>gw51<F+W21Z?D@qz2^LaG0;n)m*#zXZy**oP} zetKXD{0r@SFt&`Ju$o<mcefjUhU+=SI+Lq-9Lrxzyij567bm<Q5M$jvkU&1~#C-Mx z|E|_FYd+HYX5UaR-7c|?wZJCSh3?MPQ@iZt$$H7w$*=JWHN)P&8jts#&b7`0=cUvq zY2umi+{nh#6r27c@AcTb3ZbYkeNBAxu-#sXF5Q6Ks++Kzcj4T*3SQ^Izgm_2h)=Ny z--iy}1bgi@SWi^ZvO5;H*U0-BfCXnguVvT-ZbO$YAVQ;sSKV&5VWUv(th@0I)yAs5 z4Ly1SzOehSY!1bP(3K3$7U+?Kfx}-|4}Zjp{Sx}_I<#8bTb(?L+sWp69q-5O<W<hX z8@?8QN;l#qf5wV_7OP+Z9X{S9lX41~EI;7y{4n(ad8j*ywtbZxuO4XfA7TSsh)=IG zmW5@my>KIOArr6%&A<w>5?n07R@RRQsv>x{>M$KdyZ;!C_6Bm-29jm*1{(jTP{;&E znu*0Gg-m<}F*Vm<S5<Z12Z=`g5U;qhT?POZ)t~K0WZLz3ey+rd)Cwz$Y6jNDhFt@X zhpLCF?;*}xbS!lu-pP;Z@g3z|Ip5}B$+(v2ooQ&)zv4&Qj?d#1)>~yRCb60><eQgy z?m(WE?>U6!>K*1e1Z(nz<hC{@_Q*zWErOOR$W*L`wd`DU^c#TL80;BeVE0mwwjJ31 zyv(dQQdC!>$9gjNo>(+4!R|GX*Hx_TB0ld%rGpN{%@n$Isk}rVs&b+aPje}AR^Qdr z*lh}sY3h;Jr_Q^kGF3OA)0ZE07i^7%v5os`fpwuCPp!%rs-c?1W?zgo{Wzl>B?4m~ z5Z+0Clj;wt-a?EyhIzKeR9(_~{B8y0RlDhWuy7S~>`VlQYHF!}?gd0RXs%vht2(f> zhoM?sl+h1!dZ}XUQARE2lPGq+QtVplft%#oVxG4b8|5baQSvdYK<4_LA63m&7vGJ1 zr~0J_@M@Ki1M9;VmgiP`EZ}!_d>yJ#s+wDZltoQ04^UD?M|FpcFoRP(Pqhctb=g!$ zR7GXcf+{tr-?2sz95q&Btd;dyZGD$^)RDFT>cN1`Jr%%3RFq~Osy$fju1GcRvbai} zZB>o8Aus)|$7rSsr8=6@T#S2ENmAY1idl<#5*wP-OtP4VIw&{brv|f9P2DPdsvga% zg__`Q)9YFII>dfazh~9PRW(`7MxC+~JV_8ztvAyny8-KI4h^&gS8bq&Cd{l3GcDi= zL1-b)ovNmO%pL1E6rpNnrx;CZ^#L)>qk!FHIy|eUr{<`Ry{fq>ESSouUg%17Fw{L* zRY6s?TG%ihW(iVp;jccu!h?RRr=6i{Cc<^<NF3oMd=;}URjyM7HvK-~uC#=4)lJz3 zc4=&*s@<mko~lHwx}WMetuDdp1#B^<>33Z2&gd*-o^i)L!-`88C&5TDo~aIps&(vl zXQWzsx$a0>wHecN5;goowaoNh-C0HD9;jXv2eafa(+yShqR;iavSY0}oBH`)wM+f( z9eS^OMVq=qBb(9nX=T^h|6Q*xvgRH=2l2|Cf$GBQFVUq&(g<coy4vJDsye9FWoSxW zYE8{k(=XNZo(*!fo}l`yW+s+9j>gi{G`9N7>POEre`(&LZ;yMI?p2<pdVXtEQ!iJQ zaD@-eU63-*sr+A~ntx^$T92t1EIyTR-<gW-s<|s%sc*HqX=@((hr5B7up^k8mw8s@ z6Sba7*j8f6;7^@#O)p&SM*WysXe7bXU_wx=><6s+fR(Eee6<dJUwN(Ys5uzu89ET` zOpjg7L{QRb!mM7xwSl;Swf@#$X3WY?yJiIQoq3`e!E{>I-@>LwQ&&#C4E<?!dVVF1 z7?=re<{ERYRwX<eN){EEnzG`f8qr`+cvJ;sJyY~zu&HNO{%z<=)b_t?^|yK+t510r zSL&S^&#X!FOMy|<#Z7_(;as!TOobn&<*r4r)M`X~q7BET25}AX4YQNY82U~ln1A|P z&(LVPUl7$;X0Pb~|BbJ^MA;g_P=wAh-Sht+Q825dJK<R)>odX4P=w%NFl%VR2X2Hl zbq@^@T^L7GRVUfQNI8=^>wHKp_3@<4!J6XbH0lhuu8GWbis#mVcee&|Mer}xU9ZL8 z8AedQ)MK2RTR1@-s><gPIVkUQ0G@vpT)&u8Q>SZ)=&45dHGktQEn@U0JV`vR6>`F* zTz3>7!{*F>)|`W%ZXK^v%%>K7K93ctMtVQ|c-O=0kHDE7=Fk$pxCbBCPTr|*aw$(L zf~%_Pb4_-lYA37ydzkC8kXcl%R6Us;p01N$oFVO=fU38tdd2F#to-AAuJ-U*%pEPu z)#lC4)>)*h^uKt9Ag#{ZHm9Gei<=!KxTv$UqVr3@O48-|3FcYKH+o;f9E2O4RH8R^ zepY2|Rge|chq+TVv~&2soS6#(<-pOVMwt58*WsEpvUpQ)pw%aMp3Xg0fI7+3bb6IB zC(T-?Xok6IF9;q+-cTg8c7SR+i`GP8q9BL6BzZ~JkR)Z!tqL$x<jM^`&TYvR`QS!! zOG_}LZ0)+d)1EZd#TCaQS}oz!)QPMJ+vDzemt?l0Y*lgAysCn$s@$#GZu&cq@e6^R zk(^9DV#zpy;W1`c6C4W8`Xua1IhKnD)z%F$rom4sD^hpjJXWC9sJ3htFxH8$%Al%- zu03ORu=ZgJdO5-~G%HEsDQHKv=R?qnDq5@lyn`H|xQhC`^AgGNFFvsd->GWuaqbiT zRHZ(^TvWeX)qS<!be0Gcap0jkxPpnUs^G7~;3);olRL@`M3t%;X)*dSpd;zB7IQxC zY9D#5KwZ^U1t|gKWM@(p|0wjKy%d6;Dxjsh%%KG7>8uOq>f9wsL+5_drC7t09G8kk zgOX@OGi8i?0I5#>3`+R>Bx}lHKB_&hU8L^OlHL?EEzT5T23cq!>(QSQTp4y(ag33I z;8GpWi-C(~s+#*@;8ej?jo~9rUCh|zG1iA>w0n*-#v#_`W9Fxr%}M^Q&2?c`EV;A+ zcc~6x61=E)g{mz_SfOe=tFpabst2X+1kL!r9=}_oC3S(rh(2rbq=w8&{7|QWq_wE~ zoD<M>84z8Ge^c>ArUv>KL>GO7w)rF8&-rkzKj2U6(VhNfCzx7ml9*L9NR^%Sm-MN2 z%u#(On)B55JYCgiYoJ4^qe5M-%;%}<jUfF)^N=KJUbVTt1N>H%rkerbmahKQj&*Cc z%~?wgVk{2;7u|atUa4Lwi<$KgZfwWr=qG)NeV9SE!-v!iSWAAxg+x*$I96KV7u`Yp z#Xa!QzGzA(&>8da@gBhf@^|_p@(l)2(P{`$1h)}W{u936AQ9G0s3r0y`d9^g<|-<B zj6l<!OTCGGSU75X8>8(PW6N1eje>88I(Z!F-pfg_0dM(OtZLU$m!KQfJycz<FVQ{I zh$dJBSI=bzcayC&k7^>P7|B7mjo_n*VOiWn1m;Av_4_z0RQ<jtyI?Vq8o%RrS7h-L zq5~&_jamHsgO>OY=Zej4-NH{C9F|fwy&aHhi~fBXQ4Ss~3h!g{sEgI?UFss7AO=VE z$6uzF(}kW7sk(3uaYgS?n_+*dFVO;Huv7m@9jp4OFn^_}ld_(ik{QI>OkjNJ>*tft zFp#L=-SpC2iru=<m*;cvP4Dm?B!=S!s(Pu@$$Qk+8c4_F3HVV55}|R39#2ma(ey5H zk_G8AL}Fh}%-32p_5D=9yqR?!WvAZ`-WCz(b;k1#`3FfN?W;20F6<Rg5#jJG(NZ@< zBekHY+E7Fl_KoVrUk;_kp^E*izA?53>BaYejaP{sdkI^?YOG2B^80OKi{2(jY!&~% zz?pk7bdXJc=nOo~$Eg_c8=pN&l;#6uX}#ke!M<rvL|-?0sm>;DI-Nd>9b{)}4S85U zQ4L}^7UPZ1_gEcgQ9-VAx*1stMd?4lMn3y>Gn#bV(}ft@dBlPBg9;ZDi|6q@L8jJC z#BA&!y6+VBnF{JjH1jOP8uS(!9%*u1KcotD55%J$L}REQK^a!(=a}!i?0}tci&wDV zOrjc*my9`8`2Pv&U&PFw!?M(o-034^;mE4{Dbd&U80i`4$BTqAjQGm8h+laf3id(| z?VyOU#H#Heo45}-Q;!gZRM)FYP&0`-d=Pui7~;JjU=OO-#Cmw=wQ!6B*sA{KX^*pi zF2|ZR8C&>Nvfmpqb{JY)LhYFWK>asjyRHE%{W8<YtoW6+zLi>ujW*#>%aKUyFP+<* zp2VoUP3+4>#HoIeUJc|P!|$`5Gwq;!rM^3;dv+NSK=aA%@9vvK#P!3(`4@WEuo^$O zdlL$qK%G3rm=1u3AEOfXdLrdg)S~N16z&DY@9cxys+!dy>OV~;UhWM0>td+rd#GR< za~_O+r$02c1Nhxf^vnBLzh1*Gx06wBAX57tY++9T!?{3uJr<Bgz~)<QXR5t69=gh7 zjxE_=$B4u$p_<ewzWJ5s>;zx0um^PpT#jYz9=P!?cJa61YBl(n&XaD%B6TCbU%*C} zM<(BU)Sa5beKoK~&c<8$xOXG*VgraH;uypNGl)p(`B276EPm@#XHs6eqt(J=KP2@} zs#^M7B1?BtQM>{Cc^6TC`-pscnfQ^}#0hPHsyh-lGzJcEy|)yOljZ##dXNpREnMwJ zvhJ_uC3~Oh%07~5iN)+u?39Yv{hB$er`k?vZ3_^12-^Juio6pm;N4h3M*~H5A7~Fx zS2vBXp~!vAVj6IJ6sW!e9#q|CCnuND*;+wWPmqx}7CtwEdECWreFnSa%k1)780ma= zbT?)-oWC!}LZ@CUJ^Ah$Uib2}`pkPE=R-5DQeBvGPO$^bd;{EYBfH``POg`z$2k^0 zsmP^OoL8Ng={{ooUVvXGsP|WhrS^9s-2T80dJ9~3HM4w**q-~bLr<W-=-l)yIxqZ9 z-}+an*Pa8NH6zpEF81d^Vh*cvg0*EXZ!p>l_Ty7<?JwC|qv1bI;VLbd+fnc>3!18r z6#<vI@bBH6*Xm!f862hI6dq1+NlmIw*cg5v;*6}v`F929U@oI{a^($mrpkAv2A!PJ zY1CywJy|4!=%lX&^xJV}$QpPFeC#438pYu*Vm9>|M^+j2$&ox5=6^}KvKgrtPjy%N zkhHCCcG*Z?lKf@=iNT+;_*6YrcCwCLNPEh9QMBMM?1<B>tU0-2zY~!<58Lb^&YRAh zxp8=S0#17q=eg)c*2H(&lS#auPTG$zu?O+cHHmg@PyMvPP~Bwkr0SM`Gios$Kr5`v zO1E(?Bsk}`gTZ3vu#>s`3l*M4cF>G{;ND@6tJjX~eX8W!+}(8zIR)Ecfo=<ABpIK_ z-;Md*8CW#{B5j~Cb!lh?6lwz-Y3q`aYVg10@f32lx=ht)1br&|nob;xza-hKHdmBc zNvlfoPEqT|wkkU%fZ!^PDA`7RfGoIS20D<eS<Gp*59n=&FCB1yP9S*~@qVi-Nvfig zpJ%H}#0YlDOk|D<PXNC{GrSbp-ZNP9KjNGIU^fDEr@*6bL*BTK$g}~xuEG|6Dd+kF z?7+8?jpo7u)x$#ddnJv>f$G0NdKr@4chJ513%w2wwAX(F59@*WaaQMX>9H{o?M^&x zJE&;@GrAK$#66r0bZloAKh4i*s$r=w;N8UCszcu(^x1B}zcFi<)Nd@2vX&oW2kc?> zXIZ_Vpq^q!_}f?)_j88tgUZwm=_s#b%;GrLsxOl?CE1nL%_<jo%ElsVqiTv7txcN0 ztd|~WLO9V=i+QgO8bRpr9JtAy%v2TK{y@^&Lk#t1PQ$72o}1x0`RE9Lq4|FV#~RIP z@(AbXeMG(u<(#`4-uM*!<Q>-!G7osJ0)AWIIP2k;il$Z1i)rv3MHtURVl&+6BvO;Q zDoBoR$20mOf2#MMx&{sfiuZBSJ_H=^<?nlW4drAX42%aLy-7|z59)2py^`9cAIayi zo9AwFf7JI#z2Nr4lMb?b4gtA+{4dM2Y}5G2xaT;#RNAm~Fj1!LBhr?n3#-3pKGbdO z%7yR(N$cuiR>)_v3`<+!&;bKcC|9(rP8_N{+Yo*;5Q_xyPxz765XrC(Uid91*eK3} z4%}UWe5&36Q;-8+;WZYxK8@_~G_SFovmXMn*+B1i@+{?JFusQcaP3d|?p<;|rt+6` zkiXdZr@(2L`Kc;;FKA!AA#a4o+zQp*jeH}SMKHV<EDMV2<99inRFJ&bh35G{vjw|f zc8(a-wUhn!H@xgOms9KHTf=LEEAMP{{}-I)`Pc<qW#>P|+GRD8{-_-;E0a2`$=+Q6 zmL!|jg=fe*Ul&NKJD}|I;<VyY(vzfxtJjIT>}VfoT-nyu5mSAME{6)np~cMQWKyNU zZ;+**Wu4u@N{qRzfV!qZrGn5zvSO4)HG!W=!1)Vk?`O`LwX9()(BIA~*0Ms;r!uc5 zbDwhb7P}BV!S1NSY@53fy~y=_T?gD$1N}x|IFwq9gE<`s^X?j;IRH3b%=yxrS2uX4 zx(CXeQJ;0@vm&iWeFL}hOw}(}g}-%hnw`+>KB#gZR4JO&zLv+NgcZx)C_j*3DeI)* zlf!7az_L0Jt-){gCzO3ea(^B7X?1~x`Yy`CP!-rq^EWn8(P|3pNKZEQNm(Xk$q6#9 zx`1`S&v!jL?@6HiCa+iFVE3@L_KfI3f7=2z%m-f6fTtp!Kjmzi#%nq+Rh6FuKV1k1 zScX*d8^3?y^%I|c3#EVQUZK97tAPGK;Nf9*>X6hK{9Op_E(OX1fTrMiEu7$bUf1x~ z062rXwaDM7v&r;(ti?VQk5kuCaWeJW-3L~80AqF0+|2KP!S!~2i*N2@*B=4Wsy$u; zt%_1v6tJ!IA!(1xsw1n4dc)O4c9$)oF0WcHjH@$aop#3iB3qm~`N>WstB5RR;%K#? znl8}lP4N9^(G_0i^(=ev7FKZ%I7u>t&926(T;bWgzTvF-1~|=ueis6_KcS9|tYnW% z6*>v`0<(>L{;R9=&O^Un1TNOHwu79lad4OezD2J()w}Xi$K#&vOa9xgK<|9`tn3c@ ztqwu$;GyE8?YO5kyWe!|lpRT(=Zwv;9LUQ4V=R4!%ZWPAu;1nXk~K!&sxqz+_bUey zvMm}vnY<+bvr!wnwP3FENEY~PAX$}{ATJ&v*vg|QUSNDM@>>`?w)TPcgXyTL-=b&v zOy#XmC%F)?7jD#Xtszq8xvW*b_&&(gy}^ijCf4P9SwzdAm!rV$KbO<#Twe>!|3Z>e zN7>czy1(HM`dnOME${W|3Shp1|Nr9Ctx(nhs42n<)uFKll+qabY{!#&@I3XQ((hhi zqAQ=B$80*fd_kR_+PczfYnMmJZl)ffvV+Njs}75@dZ}ZwY+bV1%3^2iwz9+t&VsbC zBY%P{h=Qu|ut=_weNvL2EV}Zl89$~@H@&pujZegQaU>@g$xKpify+t6`7VLK-NhOF zD7xLfaK6j<tO55{K$q&uyOO=W1d3Fi%tH6~&-}lDzkXr=>*U(va@y_CyI{By+Fs1H z>a#4Xnd(N1exuA^R<Z&pxH0>?Eszq#dIG_VTv@#jQ0&3eJG%5L3U0}DExEc0FL}i4 z@RBE7UR$k4Ubq;rqM9LC5{KRAN(ef!{&WA9z4oLFS^53di%c(3sm`xT&yhH<EOGJ- ziI3_`3%OX5^eQ<^K4#IdI=o6gR{zF4?vRCEP!^1(RmeJPFeS;)@O2+g5`F7i@n%UA z;z{yBnNE?CylVpW9mKG9BNJsX=XHwO0$1_9m%sBFsV2|d#~MPOO{_G=>i%$f#u6x4 z8kM3t{^hJw)pyBd>NNZ}yiv9oamk(Vm%T236s-vx@?FaxQq|o{>fS4z!NgO@S1-yn zC!BOm>2&&O3O*XS=eyyUf`Im?RwciOId2qKp!g2i(&bN32g0cPt)OpkATDA2aDujM z`o=$M=+yWN1y{)m(wybB(^Z11IF9_Wm17y4M)*WDp_h1@BtH4ngDw^eTuv`}UOj9T zm!f!-TC88%kCE_ByF5d3xPJBkF-esBdC4xW---e`=zjMfRJId1?}kh4hTe8_<zenW z?#eRq<H~251@?4ui|R%9vgEdQIkWUL!M7Ek3BnD5s``F5;5zkFmK-JBO#Ue8uEuv~ z=*XP#@<1DkmcPPy2L&5ZTH0N^;RT{)qlt-Y7>P{(>#sasI_o5zNsd!TKheD2i>D~E zL6mMdihk=y6m6(or+|q=QDno}|HsF~$)fH#VWb>Ig_x7rc%Fq7?HuEKHhy1yFYlOW zNawxy;TbsO30_4mX4J1(@Ynyshxsw@4#VyBBYVDNRmE9|gNhP#Zkreo<Ehrla^2Oc z539T^>XfJ08%5nn%92bV=xg7}SEk>(qLBN93w1h`W+mxFRH_{=?b4iS>gB2@Nj?@0 zh_C4UGQM_wBaUNujc8xGhUsA~-ebnmnE&(ROET2+v`5TNkx$q7*IiUY=bDM`74F4} zgduaDn)M57@{$YM28X&%d`qX1WE|}uof7(|(Pa(MUwVQ@)At%(&z5gqTu$F<u7>g? z4`~1C%rd)BTtJ^n-Y_&{o@C?(?Octgf0~v4(wKUuwdgN>uXm<Dq9Cf1L@yI1W4b09 zh|A-q9~1E+YmtGbATL}Q3O0UPU1cC<xQyOu&&o5bAK^zDw|)y-l}`|^^r?wH(0mOI zNahi@H|r2o44kzpvj)M+Kwj(B+Vp%gTQj>#sYo+7V`)|zQ}6Uo?=??zw|;9B^O^qE zKGWEhkkg4H+klZD4F0u##Vr}y6fGLs)QUxq`o{2NT_;SNwP;pmwUyjjv?NJSBbtaR zvnK>;ePiy>T?X0)BATC{S(<qp?CJ`$M!`t*CW;ZC*Z)a=Ow5&dzwz4|ud3FiRf~p2 zUpk4jT5&{Op-)7!m4E4Py)##sGg%|(Gjo+0O)`S6tc1HDt~FF*LJ%<41mR3D5<OHx zM{6?p)Blx{MkTf@@6_k|wo+0v@5D9!M}dN?;Tz%&g0As)il>MwMd_7T(maF-6Ma+p z6pd%T(I<*osC=(A2n+f#v#q2gvoc+&Yc#%zD$&!;9x_<dj4P>MqX+`hk@T&8n-kvL zqj#E}d4@178WsKwKFt4>^AYqbaiy!wx&J@B>1tt5xHBW^^bj-+4zx0J)@aWt>Oi09 zTXT)ps~PHB!xywd{cTpE@%63dqkHsD^U)`|*Nh{GnkXgh0^!N<2?I9+b#=4XH3ssP z`$FFtyj6~2_=_;4F$~W!dr>>oMBfS<!ivF$?l8D9Cyl|lAg|}^e?yV_Uo#M7gc0Gx z%t-6iwdNbMU(IjbDM%TtYR%@8%FlJbIH5VaG(X{1pNf|l&Z*~UHI>{&e@PaRq@k!r zqqS%S`bM+YiBd@qg0|jO?n{GhVL&_GyiAl97r9p{`ox@Q-1`4^zdqG&7bmD3&75`O z5&xq%vu?wE41Udb<`Y4~NVyux(1JLTp~A{}8@{Ib7^)Ej%}aO4w;-%&#e#{U1p{Z@ zY2a;myrD94iU@mVM02g~7R1C43>PpsHJn7$rgO~TT+gY*vT$$cTUQ9SX3e6f%BWa< zqZR8(q7un|8n=@64c$uSH?uM$2>X>Y(MWoZo}@LKJ!jq-xam`Ut~HDInX^{5ZD~ZZ z&WcLRnQKmS%|Ub0Kl58$UXU{U#BgrOGDa8Bb%s*STJ$8X$ehIbR`(mdT2aE49K>)= z;aQx;P_pcDf}m(fyg|?q<OLmZF>~seF+_Jp7T4@FhA=1&pw$R6ib6B{TknnRV)mAq zu~w%&W4wjt8)3p|i;^Xc&Z&85R+W;y<VJm>&-`3t<kZR&!f-ob(@3I*yXuLeIpIo} zki4fW#TlhFX>7yQ^j@>op0DI)TD_o}A>Kzj-bf7^N4V1r1SM(JvS}Kr$vj<}vw?)D zLNL{<@;muW4Ak_E(ZLnPUdh#T257#X|C@_q;f-b5;94^hJqWMDv(_YOLfDq{pwWeI z(Vyr=c$LN~o0ue5BWD;sBRN`jFL}CBJXO%qIND#@dzw{<)ycADqW289&@+TdQIcX) zjP@(9lBh>CE32kpCdg{9Y7Yp9q8Mqi!i<5e!LcBu9-g8>vj;@a!isjUu>{pYTNIY` znJn$11+$CwmtZEn$8c>$gBgih7}k81MPTr5bfa9}iLc8~68b+_Ilw^o8-Jj7skox~ zk&Yw^(aO{-Q%@8v$U>k!EpDkjA={MUAELJevk;w0_cU;krY~!eV4?g2FW-vR6gQ>M z72BuSO~FyV7*U#H2Ib||^`cMhO8LPAab;tsksl>R%7!brRYB*=;+e9AR-UH@!lD)V z+e8<_xmK*RM4yYxOQRBug)hTzby8~;iilNah~Ta}bgwyAH8TS-;Y#={;2PmVb4jAF zD!#H9omWrOlgwVu<vQ(P!MQ3wTDP<+&BSK?iVqF4c6kU)K81LxI8zRHYJNdxVl*<v zM#|SEPmG|h8On<+9B3w*k9eFos{A?nTo4dcl=CB*TbRgWE%NMY{o2L)URMbZ8d(vf zigJ~oM{^PNh?33U1-z3lQ#2}S*BHt=smlL``sJsPU&HV-aR6hLkhN3K6a{HdX+*`} z6#!AiooY3rE&0W@hqRB&fN3dz2_EV`CQnHr|I5E8f3|kMc8ZZov|5d<u|>P0nFPCE zxhO}l2A$>^hHuEHDE<;-m7)~cNOW%*R~GYI{9Eu0<Drf+n((UL^YT7a<vZ~rS-@p6 zt6)^ovMdU+naE<6a%W!le`{34f_#tardq|dL7KS>yIPqjqY4&_YP=V930J~}II$v- z<L>C<=UTDh`NE`jmN>m&s&$CQ#bd-PrRi(V`d+-n)Ic@ojfwr1?MNOf`4a_O(YL&R z@>?mgLwi?H6eg50CM&nRd^($C6O(sGb`|YG<Bt)A*j(wbi^L&>Gjo<nD$sSJ3Y`wh z7E;`-&6S1jQv&XtHh2@Zy+ocG%anMLs8P|>4Y0Jyf-JlUTk?YnSK_LoRpDM&3tq~A zlJ8B@iRel@S>FrC+B@PV;&O^;P^_vTFO15soN_H;#lSGkJ0ssHmRvhXw52_tkF8Ih zigN6Q$^cA3529}2#L!_G^Q#X|75iEML=`cuNCEk^6oD?Dpy<~^Rw2$NTbJ^qRN=a& zJ6F+Cis;+=SQ-^c8^vy^UdEzY?QQLKot4_@ig%VzrKP*>LKi+cToY#v!by^OYi|p8 zY2M2_p$c<txu-ho$l=NL`A#R1{OL_RjTu$mBxN@WuELGrXCx=#Jq!)V##V>xb-rsR zf~k0zq!;ZWVbSRH;<=L8PO}dbZ7(alX5&Crx<k?6Ef}Ys`#V4$!U>oA%g>kM1Xo0a zpSj9<UC5o{9J1((y9v{>1q;WDov7fcf}MDacuEORm5)Iq3U`WTHoHr35ru1JCX!lw zL3=g9Z#_}`T<7~~ct{yz9A*sh9NAwrhA29pwd*8PW~699mQOR9%?Qd3)d?prdIJ0B z37()cM0${DMW?Ewz_eTSBd(?R5bYRq>Pl(|vbGAo%|L05nUjeS5gg^GugX((zGyA- z?`7~mh(2|)D`W7q%bC2uOIFhAE?$@bS7f<3GxDjps?GI=OB%_v2Jlt{k#=Q(`{a+& z9@2UYmlbE!siL^@a=yuOsah1RdDn*~t3bPonaOZh9<$VHwGPAU#c|D*br>_mwTk7U z&N_1z*U1n$+JI3MYp!ev?Oe$klJ&)V6l1QKCe5iP?*i^@1=Tpu(Ol)5GuBJ-FYyj# zoQP7hxkJ8W^E7d;>h34X8c9Pl$|%ttxr}OTpo;N1!FU#PQtWt57n5G#C|)5bDZX2L zLQ<eO|52CfvfVRF=d#Ykv<pX3rz&5H+7&4j0d@@;snn%1aRr^d!nBclwcA7N0L9YR z=Xvs|XvNy+qIz}fjxg&8{%gS~2db0gA_-CFx#&Z<RZrnOH#Sbb(G>L#HJb8LGR(&U z15tL3BsI~Zt}bL=`P^YcZ}M5{+|bG5C;IR#J7Yi3l$@hHV)0qgeNFCBJhwPd8cal> z$t+gm<9^YphgAzUHb07livqW^JgXY3Q)EVS*KgRAcXiySt2_E$R;IWQ#rPQwKyseO zQKVEp*VSTPI)9^ZD$P(bwPYCaU%@ZMX)k|dLq1cM#u?^QjkRj!I=RKy1Vim$$>|62 z5~&w@6nKhC<P#H46sd5KcR8$Bt2zOuBRoO-KvJWgs0hDfaL_2bARGFT|6S|X6Jk(+ zPHg3Wh~vcE@yp>4JCRi?-~bjl(VniwSPpk8dpFAbBrhnFSTP66=TdfbhHQ(j_+neT zs}<)ke)KH%xadgr&*fcF{;zZdQI<|(=|tjq$~}_AmBr}dVQt-gr8pJgUDA<gP!g&7 z(<@R&5Ro5J{7<v23sh?}Q^`bSTq*t~tx8!&IY3T15BuCTi+c*%ddcsqUYPZ{TezzZ zCWIx?SqpGipKCSegWRe3(gJ2s%s3{-Pri52sZNwrz$40C=MsaWv!EvMQx=@O&RvNy zIEOhF0oz~kt4c~wb2?}>#jK>5*J<X`lzY4L6M$!*VPr|++T+@>I<F*UDbptI!b#FY zxyxB~!t8fFxQD?+9lYQ@SWk$^@qdUR+QaA}ckFu5$!<Kle{r>B!Fu?M&vmgZ8OB7X zN!FAe6#$cpot0dpJfoQVOhHud4*<<Q?x&Klq*v5u#eT*Yek^8N2$d-YR=qoSL9L33 ztOk8Z&QvF0(Vi%>4EWas18v=JB(s_LF6m%8Zxrz$3HUJU+Y7y<7^{RQh{D>jOLgWd zDp#<s4S!a=hv?}HYt-%zFcaCJ<Z0G-;-|71C?`#D)Lu3+gKASK|6jR$k|d2BE;;lV z&pynU1<-^%czz%&-9dCNol$iLr2D3UX^2%z+co)ulI|o+iUuVoD{4#8S&hJQeRntO z%ogRJ;>rZk(KUggxLy)zOmR0=d77>`4LwMX)0ru2z)7H?Q&l~YrHdM_t{Iqoz9?hJ zzpIl;x?Tbr-UCz;!~(Qoj54632vS9q#<)h>i1Hd$&0-gH)tK0hZp^xrPl})jad~<B zg`rZOy^TF^lFtiyCk^K?PpJz$LR?dg*(e6+7?A_}n1!<A#1oaHspl!fOZ&1GyP^}= zk^XRs`3X86_Dd(c+LGsD(1!!;8oM;3^H;L*R$>>{fRP9*Y0FwV^IK9_7I^o;wYx&o zs`{*`D8&cL!(Pm|qM1DR1o!iFRg&;<%^5JMC@#%infZz_FLBQtotQdf#p@LP;BaLf zpskoP!B{d<8a#{ob>>&$GaE=8123se1D+sxMLX~apG$MB$1_F2g14d;9k{8uObtd< z#F;3s9<z~luUx+ppqgOUG+>ntq4WP3NgTL2?;`N^<L+KK%Nh@GT|@4y2^<v9f0A=S z(VjKnFnfW(QI`s(*C|rOOBSqRiDeIwjYcP@?56UWtDZ&R|DYrIpJZMEU?AO6lATT; zoz*qLisU81)$7u{_OoJ)6U^%b<Llfx&Af8BTW8EMXhG3XlBZO4qZMO_Uu(xpn^Nre zA!u(k5kOmcj^d8nyL^mWpzGGe_H=;OwWk#Et>1_Fzk;1n&Yg;Hx5?q^2^<3K5mEOE zzN^cVdO#DBlA}Ogl3yWk&tqP3cZP}?kmQ)_LZ=?zM3{A3Rw&t4a<XXp6wgo$ruK?7 zUGb9Yz)oj&4OXC$4+DGUC<>m^Y%)Ml8Htht&oV#d^-2!cT4m=@G>tT6St-QnvU%27 zup&!QUE=W+52#GV{k%Mksr@FcLb(SK_JFFI@8D|Ds$y$GtjSmfn-CqPebAnHC~`f@ z%#@9%b6M5^>2lI3bdD-RQW>&E(28P9CC7=LB>_wGR4kupO%dUTxF*h8i<zOxMJ@;D zvQUc$N)OFp4ad3eC@a(6mOK>YuUgDr_EDXFk^w|*it5+NUdFYu0~%XQlB@H9uf?go z4;+?*eeoTge-$q7OL#(*lTN*eI<u=v-B?*gc~E1M{h=KcanGFuqbmMNdbqL6Yd?!S z$qI9ZzoilD{OSxAy<m9{YYwq@RFS74Yf|<2L#)?kohAlP@<=%|E8@;<;NA*2Tb$Xp z3qx@;$&|U^NZO95dI!*utSjq@c)Mg^Nm#P%HRGi-Aq@YKty_7wg7989Hf|%&DF%O% zbLud%v>L%ml9jRR`{1>T8&XZ4I;>q>K&P}Kr(~U%Y^5xVv&<>Zk0fsG<_tVa5#6m= zm10t5eN`RwBCeFS;$cObT%IEtTym1U2ep~4$!ZoKP=<$U0Z79=>0T|oXTintd9oyh zQ_NOplOKFbgEgm_EO<HW=w@6eyOV4i(r*m4oPw@bBBdN<{`J5_W3GyGr#a<xI%<z8 zKSuPf`;M_9@g2qNl=D2%SDbaIN{aHs#RFOZ7fI9^_R?uEEICqnI?{mZgB3-3Dym!i zuC>bnb!wVgMJIuW@{9_hLeYb=xD`X&k@YK=IL2Jp5lbh2BkN<@<pkndf|)GWI_E9; z?g2*11xw1ZKH{DY0dOGOfzD&qMhGD%u4S**fFipy>k!}UVO;HdK~Isy(nxgPX@^Nl zl&wYfMcHyq7X2wOrd7nDpWWcEIj8ygJVjBC2f&IXZ{=GmlCl@jG`1*NFI0_3dBU<T z=-ihCFYQTMq4J9qxmShS3F;THg3+X>$a>NSjC5k0-CUWX<I@$4TL;?Q?8X?XTGd*< zOYlu!t}Q3ZP|=1FprKP&`=c7TIm@oy!t<0pB&(CwsJxAT7)QBFvexT5$?&pz=sd~5 z_4^S8+5!j{Gs{v&s?EHQvQkl?EdTr5|E1qn1@p4*NXC_}w4LvguGHKToQP7Jz;!Lo z(SO`CQfJF{*07VAil-~*U9v<W__>HRDh|Cn_mncvtw<)PSxE}|k_A$>aP2qo(P}(R zJhBXKu$d8$0c+U<&hT_u&n_jK?-oYu#LA?PmAer83u$LR_}Jw}(MC8s&m-6O4z50* zXP)NsQee><*tcfpbI4|xO>FI9@ZFziTy?;RLD^e*rZjTRD&|5`^{k>?r7XcKSZ^-8 zR?^T3)+P(UAy%*0{Qsa=A2{#E(`4IG7poJ%TX`WDLdQX%yo(tsQzpzDbXpw-T8i*5 z<r52PX#&hu1w<MBK5$=;6?*vOFdQKW59m#fgkV^~uK$>vs}($5lpY6X3Ff3IVcD=c z6KVVqYw7}TDMC(I$xhtQ9?xYwd1++ZlU6Q>t8PPe=(;5{RPLQ<FO8Pkj5(_!ST%Qi zSws`?K}BBIVkIldMEKd2ZT)=G9jfZV9a*fY0KVFaPufA36~JaS5z5PeMG4Q-uB{7Q zl<`d2>vG*aVr(|jMo+K~BY8_VYXuIfbA{{zUL?@%z)lfvr-7}qJ1T(5DejRCM4C}6 zex!3tcB|o1brGx0299lbrlRX5Q^-OmyNd(=lEqTGu_#>iPsA~#yNJhE0jfv&rY_GG z2hU<2bzHun&M=Zl&jHu%`Cc*9vTMp-*@C~DGY3`C*atNKhBmeU{R%jU!<;31h1eZ! zxkfT#04OP6pdoyzm{Iq^=~l5f)b~ttk~R4de=ld%s^ZWUxKxLJPqSlpLKS;~n3vgV zx5mN$_na*$uy;8$T@(3bE0EvDx@+*N1xzI6D^fg(jYrl(Y0dJih~FONe|gDd_m>r2 z@>@RZlXo$|?9-eO?Rj+o<29K5X+Dv(Abn1jBw6$hK|gDl?-}S)^161dq}fC4Ol1bj z8mzh=@=7UJL0$y$661%}{%!(1B)@4l{s*nrV*gxA20&fb{1@vv?OxM?-Q9}k9_49Y z5-GopPdk$*au2hM!wG(Z>WZkCe-j+wYH0fuIUy#?Yd3Qhw=4xiTi~nGYwEI7`a;{v z_?L~l7Na!eZ<}kB2cztUGIpY5vuvnDG5b59#6lpU?AeA;y2;!Kfqm6qtHbH{H?%Lk zM6yP0X0Kc+$&EF*rz_8E0qnNJt!5L!e+Ig1%G#^5^Y?>|A|TtuomCh1pyUYIWfh?( zyT9!F+5Fzcctw0x2MM+YuwMr+*$h_d!)-e;f8ko$dqq&WyuH$V#1S^Ie>XAX0$_F_ z^RME{g@1BgF7KK$T4V67DEJ~)s<T~krv=oC7+qMG{lAdiBdO4VE?UCT>ir+JZe=~2 z-5pk&HPnStq{+%kuie#(x!na<R%eXu;4cd}oX0aw-4|IXx3PZthNYQH_KmR<bXH3` zl_yhn$`j0@D(mUP$x;vbOZ#jkpGrQ{c#YVvQD|MXc$QCPBWMQ}WP|#b=k8|oCah9& zt0E_qX;>B5?*!8)8ChD7cCf4&%3f9l9@Rd)7%nHPh3rs8K;;zIs0xehemV)%GfH|| z9Y#<!MP*e+8CCl}kCk_39OYSx2PvOoFOU)iN~bx+%+|6Gm3OT1a)6!qT1#Lh-M~*} z1j)w-`K|_I*XOP@@Y=u{_plyWIOWMY0B4?w%<&I*w1+Q?W6Po<UMc>Xrq7(tygX!_ zg=FR~;xonbOD8|Xnxep8QT8?+25(~bDBDL~7Wp*J@Fe+YMF+C*9p`#kPh{_vgi{yl zZ_8T5DP>D40Os<?${r?uYeS8zc<R5vc_)}wMyB|>bUf*b*+8v5_*0g(Y@FI#wV~PL z>>g#o9OGFYsHz&*iWU?*RM-8#DZ4I@r>d`41>N1cvIC^w%0ndEn`{imPA-i{vfgPZ zE1R*-<)=Q^%KEA7H=T|q^7RBOlK(<JN@?w?oTMz<`Yxr*Hg^d8twXom4)nW29}Qie zu?uL)uAmX+Jx>6ipXs~y9eYkv<R!qg2J7=dR}N$B<vC$sRu`^!nE6XGFNAA!WKFUy zhN1B7JV*R65114H`E_s?<yjTMRh8S{gZpi0LwQvv7)|<;v{iZ34uLb-Fbr=qkw^}A ziVv*hiMgC)mjki7tbY@$*~%TJ)7Lr7q9t=Y2CmkCwaUt0(p02jOGlGLEJ@G!V&wCc zO;olmd3EH|QN)Yl4-~VZ>N*ElqcAD2oGjP!H`f8<l3`_ADB!7$z^&|J^T{XuhB?Ju zoa&^M7F-QJqDr9W@*MHy2>DZz=2SCC@}uS?Uzun#n^hS(@q`Nn>9DF@B!8-4B56(D zM%j;b8Xf`8yP%Iae4`oEtQ?U7s6cyNTEBcI%IQ#MSqTt71h(X%mxieNTFMjC%4FLJ zviohGeh7{xubuJ6NlVqqDLa^aiGrN$wz8i4Sb0;PD=w@I&3vRSoy*zGS3VNyFUp$P z3I(XbRSr_2Iz#RQMn8~$yMXV~JWDoF**^BO7L6>wlPJZ4#*|H?ESd^<s$?Z&ojDDr zH10O;5geN`s;oouu}Fg!+)IE-ZFs$`QaSisHX)h(%1q9(^OXzP6qp-}l6Fx(J6XA= z)sZZ}B#(GHSSmx7?&9vCGhlZsPmHq1y25F$cX_#=b4(Rtcd=?^Vyn`PWHf08@>NS( zQRJWSR>n+K-#}+m7F@1AGdPduHD~6kU3LP<OUsZwMD`SMHrZ}<V)jHTl#f$7oa}J> zd0D{h0(f*gpdxFNIJx{evZTpReFE61qnEyu_e+qIRYF$Ll*`4$vs>`FthkCv5gZkp zAq#-$`xtxH^fpp-fpm4V&s70X@e;CO*5f*9KFYyY2JRO4Z4CG-qD8(-FHh(T&yrqh zYMBL*>r|ISwpPhDss?xv=+$zcschZ@%)S=yjZIcj8d{n1_mA_9c58-f<bM#Y36_en z$S~g{;8q-}6euYAN;dW!W~n+~4cwh8|Kl01lW$%YPp?aLstsHSj5;uuET8+~G=CzQ zEr*BbWJrM-RaGm4qNMv(2lnT<JE)BPw+_5YrxEweg{sbh+N4(>VivWbpAJx)EOheP z$?H_YmGYpf7Kfsv<VD-Zr#ji>cah{PZl~xk#T4n43k>BmS5$<b{VdOxvfs64<&Vqv zr_)BZ4@Ce;_sj!Q9bH{Vvh4|;tbFsG{7(GeHC0?LrntBhd|t{PXwGcAK_&7ct9s%# z=F}D%>q<U$3!o_)J;ZAL%)J*7=*En;0D;ZG!Op14b9cUx%~KW~aSYjIWerd*2A#lJ zV51eY%VzJLVvU+t8Ca74Hw28f@mkMpqCBGp&uj*j$cw6YJ^73kSE&kyhk?2>Nl)>e zWFimeuCgAt0Y~{`Ycg7zy?2P2?c^Na3Y?@Z%gY=GVuH9L=8V21exK%3`I>YFNZ0hZ zbguXe<q1oBQB@P^Ws-hdbH@QB0!bm_c(PhayOWPg_E*JYD9)xfYd3kkacEa@5~_=6 zdU}d??BTj*K%^xcQ~W3njHU6(v!Hy-6f526+GJvIz{b$KEWCSN`d8#nV=&x~d&McY z0Zqvm?ZHB4C`8`aqs)Fge4q+rHR2Q5GgYrb*1)#Nw$k`(!N+#<9G%$BdC8Y|gt4S2 zC|W3=nd$ubmwBvW&N_u#@PrP`M_Q^Zbh1rKcasKil%4Y#I?T^NIh(64z#=iwoo6d% zC;qHx!utFz>%mUAhAOWt2bO2SoV;iap<V4w*`R9x@7lbVZN3-`uVQch3s$6!iHAvc ziMn(o{YU;G@nFSN$ww_-nr6qgU|&j7wvh3aDX2Ot(#(Zz*^DK@S98yWdQiW#-#=W5 zMX@L1AdSG1d>hgrC1uNoq5OPRC@o>_@;oalNfNqvejax<1~YA#p<-raS+{xS4n~&u zP&BPrkT7^|!pO2q%C;%bgQAw|@+|ET+2~{!mp7mpYp4mQlawTXkZg4F)5y*sxyg8u zJ91uJ$obTr8OSOu$zQfXMTjV>MOJcoKlej>aWJXX)N|+PL;6s}#7?eJjDR#o#fiy2 zb{4!ZM~+*?a}_ID4LUy#tVJOnaL^k3c4Bt24JhkUaFqwdc;Qk|f;z^jR;Kv6&J)SQ z()8rJl_b>!DmKw-%~(MX_((nEm<>?1{EO1M#SawCmJNPXPgb!5^7_ipx(_;Eist+$ z&kg`}RgI86R<qDqdXUfM&5?Gog=_zUYwcy0ijQdxg$_VJtIcRf;1oqbSCtNw=_~nK z`ki)-#TAMjQS_rM*YbO-N|dS!NVk=JPgPkQ=5rJ%{t2}H0hWHQYYFbOW9o6e;(azT zqU_{~^-1#-#m_0qGU!rjZN@(ayytKZ?B{dUe(b@DwBNL1J?;M^>MOvcD!>14PtVTw z!qOojT}qdfbQ>Vjh+hz;LqS4Pq!c8iL8K*=5|HlhT53CHC-1#;<M%l`f1f||u)8yJ z?|a|(ob#Ud^dZY7NtP;Rdkk9CA&i*;UQ`m0r1}ntz#4<=De{G^?KD%$fF;}2D?BfN zYop#S6P$&zo@vie<p-+7MKUJU$R+FBe{sL`J>iSwm3yFt^WYkVpiIJAX*`wm64H6e zrkxCGC0;Fna&j;tS!GCiA~}Zk5LpVTo;%smiGqlC5;c%5n9g95{An*yTvs&Tm*gkP z;V0W5Rcvhu8vg(?+q>AEK~M=rLEJ1_9aVOU#&l715=rVwfJX`-<AEHQ28hzWCI63! zZ>UCRDXf&ZM+WYrnUj|M8dCZn&{3{}*4((JJ1W5RgEmT<A?<XshsEIUAaH#bm_7*# zPXn&Y0E1<KSCSgYj!L=qnYca$@JYl>ALIFCA+L&4wQSM8qslv^PhY?|QEzZ6)=qIO zRPVSlPT2;SA$cI4VBR!G;<Y?zmHc-UJ3+c3)p2Qot4Ra9gMIS^Pp3GqsE$rjD8ZPb zVyZz7C)*~~44~Rl_pv)DeliL4R1z~!z|-lhAukB&CFI2>{zSIOH-H)Gmc(<(HcC66 z<QS5q=?qE7h@>NnfNN85gk;Q9!F5#smLe@u@E1k?yaM$c$1ER!Do76@oKjXiRSBYq z@I+vtHs)Z%YRE?RFRr9&VRk&N5i9~708NTlB9FHV6i#uT1T(70OA=`Y_H_f)OQ?&n zbFkO<VHC226=G(j>kBwXui`VZg%iJN38;{@lFr{p{||nok&zvX>P!(Qrl>B8RpWtm z+Ow2{PQJ0Iy^G?jY38*1(*dUp{3LCJ^iHbyOA-x58q<sNU?@T)3p09vF`}IlNb@6$ z*n5~yU98;-Nswy2-NT41uu%^1BhTR7BDj$>Tn3z;>g3b{o+xVgCaxtpl5`AO3vndc z^Cqk?6^r<JSzwZ+X_D0+V(wHWl(JQ*{zkMP2hEIjCvi+VcPN&SyuU9%NwlvU0Q#hX zSHNs28j0xkA^3UJXGI#27w_ooCFz`Wd$J9b#hqjaBq@sQQMtH=B5Ns1?!Ou`I;50D z;FY8ys&Y$wg8V(C*N_FBsz#H{NF0H<EZJqLJ1@nZ(V0RKjZq6Qor(l;ihQ8Bdg5gi zJ1hVLWWyzWmZB&LPvi$AUPF{e{@SNl(-T05EE~}?jCd}c!W7wO0lilSEqib!;f5@~ zq<4^)oU8%StQG;ZM4nr+bd$b8U0sM$NXH@@KIsbdpQ;Ryrc88O2x=goJoyYs--yPA zlNTiFZKbGO$`v3lKG`=(T6hH<k;hZT9-z2sdM5c32=7t)i&l&wE)dlXsO|*Gn-xJ% zB$ov6yw`Xl)l7-@J)ycY<h6BRm2@3>bjhYbGBM4Bu;Rx(q<4_*-GyhC!8MctLUqi^ zS3rG4C~lrAkW&Q+@`_RP6kSPCG|`ydXr2M_7CHq8TcoX$ADt+JJ|PZBXGT;?p-P2R zM~tkJG&03JP=sXERuGNIB=06knEz#-MJo=F-<;q{5(8ybME%mVD=E)|&Mcx1im#3O zSZD;o$$#-y6vYsY4JGR%>1xDFDGr?G9sv9(!iuWS(fLo78p@@jToa1(B$!0?A*zf) z(k59rqOqf-Bhi^k-Xbq3fHZu97=23>GDvD8&5oi>qdbyyM~az>$}|-1K-h}rX^_TC zkqA_?p7=QJU5baHQAx{>W*^b{Oy^=WyMf@3TQF<V*hm{B7*V7p#lI2%qWROz>HH^Y zfMTO~j7_nm(dzUhhtZuxZG=mr5`r~xA+k&m7a>a%#iB>!ib>L>Gn9BgN#(Qx8ii`K zlY~GKIwbp&&6c7Msgn(5h)_g4*%b&w^pB#^2`2<I;v=Nd(X+`<`=8&CG-%S?$htv! z4MgjtX;EAa@donYk~NJ!q5VmGg0j|#K8Q;b<wUcUNCzP+7)5DDDUa|+up??Edo;-g z6t7S87lkrK{*t6aQJB$u)o5k_>FgA_!4|E9Mxin2X@mv(l%7gb6VVENLq1TF!2a7I zQSFAX63zaj+8)u$8ngm}5#fs@A)@1G1U^Mk5Ump)qLma#mLWT6bl(un2)pzg8sop* zDxxbIA?np2_>x_Qb`H@9J&WK%KPe|9dN;u#y1S@`44rvV%A*+*l|(b8DVm2qA*!O8 z5q^o9i5_Tg&{)wJ4?1-zhK1lldxmC6PbaKKXFz|^KUxoAoMuS$MDrw^P@ERcI65Lh zlHftt(Q1fN3G30EDdNumb=o0XCP>h(p`A!rCs;?b$%vZB{t}%L&77jBh?dApOE2O+ z<X0k}2F2BoR`wtEh&qWbX!jAW={LceI3Q6IVUH+<Mxi}MS{!{7#RpwY@rT3%Y2BpZ z(Y?eqqPv-{i@u}p=^Mf-!H#Ac{U3#PG)kK8rn%8mXjJ0CL={nd(C#8w6UGRN1efUU zC#=xOG-fm}m!3fQA&R0sNnDnE6hsA48jD^_aHDaf*rd;BBzg+H=r4LET@&Tg#Iwm? zLAZ)yg*X6VhH%c{WTtptl0PIsH5!#pUfie-PV`P!laGZYGZPpg{y@=S<cT9agg7d} zDjM|_rB<STf;-KHXg0c5`kU@1JmArQ7GZ$?ioPdkM`?$kMR(KpWF?AzPoqRny(s4< ztVQEVX^wO^(RvgbG&+q;`=789-Sq^c=oQiTQM^R45yfA0&(Pg88sU=8ErRNQcqhov zKN_9*A6-kFH9C8m<A1Ot%BJ;3X)HRE|K5?jM60C;RH6WyHO-cu7^Ri}cI^MhEKwru z7y3;*k@!%QKK`RLq9CFl;tEk3p?A@k@8~$uE9pBL<v&;u4MpiT%KM26MENq=9cWC- z79xs@=I)ZGBMK3ER+J{AbV@U%b<s?sdpycDqPvJV4UHJ}lhBn>YK_tYL4-~b;szw) zkR(Dsqt(xdYmi5Z_BL^NvO>}K^djAxcsJce{F`_~H18sMMnrdh6iame5C#cLBrQbu z1AT(Y6+waKO@Glj9sP``ndpdK^e;LF?GC~Q;f^SY)<SEbwMO?W{Y4|u-2`E}n(#np z6<tm5q9+u6NAyhmgm&kD9O=I&5~gT|B;^q9h@$B|;g=vxCjr4e`j6lk9VH5_C_jvz z?F4^{(I5$!x|2{oGG$kgMn=|4!Ypxll0@iCpr|Q&PdFnAAkI%7ulS-dC?}f6AuAVo z$VdyOyP|SWbak{M^7vDXJH@w9l~;<2qlm$4c#$PKT78t_iz%yw>N=9lPQS_18Py)i zPeAqLo<ehbf}dm^AgegZJrp}03w?+xOxA@xuSro=%U008T0-k<4_idnqH6J@QN?*N z^EayOhtbuu3EPtGz&1jMk1TZI=z(*7DSAHMFuq4Oj}-J!wV_IWQ)3cp<ICuh{WUzj zcR^dFFnUkKVogWA;vJ~ke~ZaNwS6x-1UyF-<6lu9wg&j>VN`u?Wfn6PbgIZT{OBlI z9$h`gAinE7Rz;aIEl@r33v_6hgRT-AP+$HqYIC1M_s=`bbyV-&$t*{0_|DKOROpRc zP?`Qy^gFFzRQJ3ED((+Ko%)T4$%s}rrq~3Ef@_4;c82w35b9BmM&0{w@PvVgFKdZ! z<3SZ^&_MT~((JFO?!B<6`tNG^@b<(0b_>vqW*|^}bqZiv4%#SH>g)h7-lvGT8G^Bf zBKodRkp-|$ksd>mU>K)0?NiDpNyKyBhpoIPDgb|8RMopDu5O8$RR+C~E=E!PRO$B$ zRz=?31Ayu-R2JTZ)vUv71J=3))}(!aAlX6h0n-%4M42RhJd5fclU_{n0reK7Jgg_M zXI+9_=>+bf8oPhN`hFeHQDA?r4eSp=ecAcw;ISO_kbgwg=}Ev*KhQ>9XwMY)OLiCH zB_w%Lb^@I;B=be(e6mzi-au_w5V`@Xi_yX1EU?X^uV^A0!+Oyn<afj_+L&YJXQ)np z7Ipu78<mWByh@=*#h2(re#2nR#;6It6xNxy(0{7|sslia>(I62KI20tjWTQv^zf~X zI_=Ra?ehRP4|5HbtUooA&1`g#U5DNR3(@=JcjG9!WjoB8<^WU`{~J3X7FGiq@0%i8 zT8*mOJ3vd9(8uN;^BDAb9e*Ffr;Bj~)hka0pGwCrq=>ZLsFk}1ucH|03|{Af7pe_R zR&TN*QRH()&_R3PehRu@q%p<VG3-fnZyChx;&QoobXcwdmbs2|aqZZV%v^JUu@U`E z;<Z_k3K1q^i@YCM5K$uEYplLhFJ}B^B%oJ9CZZ0<q3U-GJDI)Dmf_~2r*Tt$Hh+}A z!{6e6=ezT_xVqe2^jXL;OPjromAXa$MQf;))I8{rK1|!9>DqAgo2h4PLBEauz`JgC zL?49$ra3#Gy~UQ|2A~J-dG0y)kh{+9;CgZ)b}KrU?8M&OkKQ8rxNnrv$7pMGL2sFr z#xe9qu8F=6qky5=sNnuJ_G)8v0;!HZ8-qbtA7FP5W>dJm+;V=kP*+S7*Ge}fzobbE zq<dnFC<)8B0Q0H2TQ99WQ4cC-<QREhcwPAKaAA0cTtV5Pj8hw+=kY3Ss9xL%88^+P z%%|+ToSQG;Hwit(H)03r7iq7wP^u#B676C!!NsfWIcBT5+?b@#)BXlSU#vD%ZE7rD zZPa~Ws&gWBwL98s{VStAEMc#iQ|vOX8UKX;NLVQB6%Gqigj8V@@8)}=CruixvQtgL zTxZlmcj7ntas7c_s0Z~#ql8i1NWjlJMon<NNydJ|jSeGmz|9@j!T(QKD}G@4$-2pw z=-A>=995iuJ2d-0wixS0aT1@xwlGdcx+@=s=Lg>p{OW(?%kvfUck(9$4hLohH-~10 zm&;ESXQYSb)qgVEuod{H!q?IjOD$Vt`&D~4M-9gwyKK9H9^a-oS$M{M$Ch9&8AtT9 zT5;{0NSgYMdO`VEc_UAjKb8|@m;AN-Ox~*8KxgeO`e&wt{gbOCbQilys#M!j)^b5o z#CWl$P>wIdeZUSyhZn`@h0&Vo$Fv&ShDeFXGPS;HQH$Z{esyZ(eQlV2#!$?D>~iiD zy1Z8q$BPriMq;+mQE0~h!d>JvZZrRlC`)&&f@8Py4_6EKBDdt8;+$h2VHwBYH+yP7 z$X^8e`Ue+&;;rJH;q6;E)VILDIxr|$82m1j5MCP|FJDtCMXqQb^AEO*(Att`yXW}E zHPgM$t-3^4Pe(0VMaw;50ymdYjGMY0m@cNBjP!|IS9`0QlpJ}Od?x&UcxZTcxPm-T zDOA7Hx*C<4z3e?MUdR`0m~EW+v(QFJ5ccttuz$MnrTC+qjr))-!#p;Y>4lMzYFnj` z{8#u`xUu|JE>uQD-e~QO%VrWfPyfQz=6m!1@P&M=FhR%=(uB{%MdAk-b(2s`7{Qm| z{d^-~ySUVH+&bCrb!>26bS`$bc2uy9kgjtj%yy9!c}XzUpIcb6@ThliVP4@S-&6nh zf%?JY!Q{}9(Aw}#dA<5T`^=2z{t>2Gp4l!s8n`yP+PM}vQyrab(=ES?qHvn~oqY}- zv(xN?eo2M8ru`AAsxFe-hD(O32cHC91zHFDgm#9TDy1V{?S%0qvxmLG&E{i-ETM(C zO7uvzr5VyA>9O>u6em>>-|z`sFJ`-OLK_(wsD7!GQz|R}Q<|$4A{8{depLU?$T51D z)zHnM4tDfq?jWxU8^vBy9ZOqly7h`>w6sJxD10v#2q7tAnP%;4uj^p#?XACB2Uza& zE!bgtuDmHUHYEGI_(ul*@y`s52(}D93@!{c3#W%Vhfju6<@?HwNGrq7#)|i({nn?p zHuh<bMvgCRcIz(bfiRT+jEiR%Fgi|-yXGNdgg!*u5?Q5=S0>8K!jr;j;qT>n${Y2c z$d_7geYJjC?+<>}$sEUYN2jFu+)DmWAzd6Pm6t|~#{?gLg4@gvVCI{;(Zu*x&(mgT zN3ha6+A{Pp&x+iQRMM70)xE7xH&PHIV?jr$-Vo2f<M;BL_)qw@ypx~9*A^-ZbH$F9 zuk2f0PS1td197k7-ihnusqI=~dn)F!jg7a;lTh!#Y~Qzq<GnKrdgdFsWph(=3bOyr znV)yRAjN+nWT?~4LwqIc7RONcXiwQ#ckEHmm!4S9hcW%!^<7gPHElPg4SXFYN9(KH z3oh`zEEtoYo;M`_?}D!iTlxcmouOLt7Nu+CJ-wnio6X?IOE<0G+6x_DIjzq7_N&%R z>6zf*HFPnl2P^p=(`9~TG}Eox9QD5ZeYi?!Pmm8~hDOR2)SSqEy{6fV`5#*qr@&x7 zhaV)!;1zGgzS0zFwDgboNZ8Cz;I^=Rn6~CBBTEnK5&Z+R8MjD!-_bDULTu~!PvU#U zsWD@migm7ZoUg{VG{#20hoI0j<PKc&9?zSVvpj2OW^C5o>|J@)3%3TGvR}0rVdiJP zm^9eh#U66hc5Qa2dTx3OJb5t@S0hJbYgN%?i<uX+i|R@FQYb$7*1yJ|82BbICNLwg zCD1$AFLW_{O}P-ctLtV9b|&{P|4`^E4YLT=Z>{fJ-?NUjcC<RJ?JPcVyfA`W%KT>B z)z*V@W-ABfB>C@fet3c$r=+M))r*lsnrJLGW7)dgd;CV63w!v{yva@AzU6-AY<xQU z*h~B@?i%Z09iSZtq|3_8OSYeM(2?M&880S|PJ9;shbPnd+{#LI#3n*hZizWuTc?Z- zz45)xf0Uh+nVNAg-I>`w`(<9DZ%L2^&8}7_Y9E^-pI~`vAMP$4`$t@p_@sDWY+6hg z*IfH{OC{06H)Us=emz!epzI2M?3?0k=uP*w@SXK11P6z%hVRQGlm=>kWV!A!H!~k| zjf4f#6|2?mx0SVhX6<4bg*~1m<%&zilY)~!$s90VYVSwREC0xs!(GFD!&T&ul#yz$ zNPX>ht+oEXvBWIHUgPEn)5X)`7V&{l$Y*mpTc6zvN#JwrzbfoFRzoCP2cxyVL5tJl zjHBihZndSQ>qzX5gkWOF#7^-|V(+-d*&kWmwrp!>%PxMDaZzp@=-{oIJ0>$O<77rk zR@>}tId^kE$*=7F-1ob`N^rFNLSMmOva+s?F=0>B*!`Z(G3(tQxc_h;cJFe%acs8D zk=}A`%uA6b^6p@_z+(S+f6Ksyz>>fc|5l&drxo_}{}`+#8)`t`#kAlOc#qInTqCKL zfb}a|x^0)etHb4p*jic3O0W4NY??XUXsEB$UPfl9x_mku7uG|E!@tPGm0sW?KCPEA z*j&VH0>`)TU+{hS2zLkAmmwo<;u>=W>`_3W2c!+zus|OC92(6Pwx?uq{^QAr?~r&t zo{xRtZs7dc_KS70?SSp1^{8MqehmNZd*3@SKawM5x5<8xQ$DXpUiZB6c^C3}dyDz? zz{9Xjf1jUcJ>?kcEa~{wzS7ad_0)YnW{4-vQ^m8!m2P`1F5<Q`yUi@UK_pGi3eO7X zg>GO^WEbxAHYi-_a|Z4PUxt?}57lLndRmO`HivQ-#aL^cZKmxf+Z9_+`+oaZ_Jy`h z)=iclqzgg;XJKoY?e)2lOl6haP~IZ9RB9^Q<zjLm{HI(-?X1->cA0-MQ`jZwVD}08 z6I+?v!_@;s+VIKz=loQ@3I8sajR;rdud*835a(&SIM<%;eiEA+ug8vZw{|)l@7l}S z_S%-(lB~0Z-9`oZxo?MewfBU#wKtf*DQ{R_!@SJg6}d-p*X28WdBIcinMg6SBbO}< zmqtnRqy%fOeTBP6?Bm!Hp3|<c9lLC@Wr);VyeK3J^|=}*r>#(u<i&u*?%<@rAO017 zAuua&Fz`IkHuyovE{|6?YbDGfkfmx10pYwDkq%lvvVZDm;h1diV)I%yOMi<#;XGfN z`-Zt;jMfKhTO%jcN6I_OK6#paQvO7FSC!T2kbV?xgWk&+Wq!jnW!IxG<1toY&v1A7 zL&6hbzVMQl_|Dust{i0X4*VOTlC8e0nP+Qk6Hgguye-r6%CgI9w-2#@VjU}dZuV0< zhdv4P2-FS+0~7rt3hx&r6l}<!pFcJ~rQqYjqk+xgchzlLTjO11Xtid}vWtb@)?7zP zcO&-?&VKf{;A>TEtUbm)z*gGo69@8MW{}z1n5%EozKqDqHF;-vYp7B1sXxVE!=L6K z8tfdlE45Wy<aLD6=NfAmiSHq1N~bIVOMxX3yz-j$j<v6KzNL@!TIj~dKsGPOv@lB> zS(+Xh9LZ59st)ypvRHYdtWo<%T5A`yGWrnxuwDwC6yIllVKX^i_@B^B$mO^5bNL(m zK;gFF7v2#UOCQ@tI)8O1#;kCiwa>P0wm7Y2ZMSTtY>TC>+<c=|WT5hy><j-d+%@!d zV7~98!YkfkUeOyU_|e<gw<2&Z^n-js*{FUK>8$;x=bPpD+ER0?X8qB6$uh~pTR*UU zVdorI>{+&b);^Z1QgP8P)Z%+^mDmGjZR1xhPYuXYcyBN^XbbiVo($SUWkYpB$3y4B zt(8`hsrol&E@R_FzM{}t94qy<<Xhgema=AA=34GZFT~eE7XOk{(ATsa!<(9(tT)pl zk&MXO$eqZG$i~R3$ZwHbk?vX=w2D@S2fFYC<{&uaC^ipg(Iu`ee~K?BOcQE|=OxMZ zz@Fgj?HuWdv3so(t-n|U)^pZXmKow(ZXC1GsG#49Y*HsGP35v-TPP)1E706O&G(+~ zi0__1G1v{V(&2C|IajWzK8++8O__W)n_CPy^r*02Tq@1Bbho~=Hn26Zy|s3+{$klA zorhGKCiE00@EjL0bM*#Vu3AA|tt2Wv<=?}Fq28gEp;@7-;imFP<%nw6rs=%7oVmfW z{7rtE&|4fVg{2mj_0oFCb&G}K!c_hU_Xd4f_dyOsw;|)G-ckQvKcz3!tLTfhIoe?T zUBjn$*GKB*j911Q^AqUf-I#o44Z9PXdOW+29m}=g7x91dXN2FR7S@I~k1b&FST0Iw zQe{h9OS0vEQXlaxUxi!3^fo6MJM_P_8IiBlEy@x3R`_8kCiHhOH`p$8BGfXx1?P52 z`5QS|NmaK;+Ucu}U(J5#+qQ=Nh|{?n{4rsJ_&@2Y^h{bO^_E_W6T})~Y0(sZ6#n6- zaykRu-3aN`^)Aqwj;RUiTBU<hUm2o20Cn$)Y}4lG!_XC!Lx0J&>|m}B|21U4@A==j z2-^ypcVDg=7td`+H_AiEFRTn($Xi%X&Y`2`YS@Vem@lCxA3#sTX~qzo4*ek~{DD4v zkBsiHJp2m_!z0+Qeqi1*P1we;sC8n`vy-?({7Ye_SV4MU5~ZKTvEnpn%pIgpr5sTd z@A5yR^XFsORK}R+jYOlR{<-#9q^&wgIVMk)zmu2Ao8;f+h4M^jeV@rU<fBTanitux zb<zF$edC&WfLRW>Fo1nY;d5b$utJzB^bo2Enfx~F)dhS{{w((rc9frB5!`RKFpnCo zjm!FXdTm|MdA+heL-#^w{>^ZiJ<-?dZ}hsmV*UZUh6DXUKY{IPCVCOgKu^Nwz`#$i zc9lky$!X>Q`h-!Io@O@0`&`73tpSv5%ywAfM#BDZ7@Tc3ER^p<s`v&y+G@aBG#Q;f zH!-Wx<8UqPL!TkWrYkzfeZ<Cc5pFJ@&DR(F{8oNF=Iy{5{uF)^>_QiQIq32u*2Qjy zHEoqyVAL@B=~K1ak**OTasitE3U#2GsvcDaDfN`k6-{}evN#(H^v{iLhH4y!Wnm86 zA2yGx+&|nF?kny?j^)Dad%$u7t|2<^Zbb**HL!e9g!m|69J?HSc7sN$*&Mw)rxe*` z2fz+G8L)Ya2z9atMmx%!fz9w=SX!u7&RJORsMaJ|?8xg%9feB3_BaV+4uLhQGkPZP zgvIGQ^mO|f5bY1>HG=i23G8Tfi(+CZCY5}{R3(Tyf~UdybO~`HUg%~&GC}5ZP*P=X z8dh-!Ysuxx@U8gP_@BTl+;*-OcbXl@Cb1V`MZJn1dy=`*h%q)`_ukc}YIU^q$hXk= zuc?>R_R#y>!2b{WMd*GFVefQ6fA|WV?Gk#<jlzuH1(xTc3)NUe-&TR=yegtOn!!Hx z3wQ%{RBj7v?@H!RSnIxpm2EKocPfekB7b}xME6jf^;K9fk0Dm_Dr{%e$@CArBfobc zGSV6Y9s}`=UZAUA0Fy06*2rt<sk<Jp(RjlDV0|6}>L?9}Myt0R27RT&vUv#OY{1_X zJ#-BA&>UExDU0#}Jn|)AS8ai@r=!cGoo&yKW&dP@=s_%EXLDQ(SCK2nCBxxxg<Xt& zX+YXt1v-p{owBd_*7zKKhkw*t>J{|HIQy3Czv;8}nfl-QD|FWV3AA*{@S*FbXp)Pf z3cAfsz$^~Hx_SWiVyffx81~UrP(~}voBF+d0{++w>*xmD55n)(m>+q-s6Gfqm{NQm z<wAQ9?M9u<Mgo#O0Gl?T8G^x=_+$dQLVk<CdlvQO>j!IgBdo9m?Dt(@gDi=uQ1p=i zYd__>Qw9+AzWfXEpX5!U>M4g{5vPvi_hBQ>g&bEN7DN;IS>zL_1D;b0bL<OC<`3AH zuRvuS+lKvuoy)Fe=b+2&PwXVT`yaXmH$_k5$H4j!(5s2n{s=o@b<=O0Gu9jPjXB0d z<2!VF{T~0<8cXp1592;;h(SX%W3hLtnsv-3upxc{Tjx0N&}p!#Ed@7S3hFxtIzI`! zb`E^66#1D9TB-;7_!w{;4|*H{e2xbUX5#lm^uzuV82%E}`31i30eFx-pR#qyrcTjc z<pEXlS4QJ9$b;<y<SBNWVx}ohk*xGow=f<tl@!&Nh@BVhDoS2D%DABlK2$-RYPL`n z9*SwCOpqizqXy>J06dR!a44dyDKOq1Gn$01wJQLj6F3zaHUb~WQ&^iHpg-nycrh-* zr!f+DmBh#jsCN%6+2cV)&0x<h4T^egyhR7~hejT}Bae)0=$q~}lFSNbj9CUJOlMfq zKSB4*d7!!7h}hi&TQx<jQ}sWJaY@AdD5sd9Pze-76~Cy5Src&CE|@9RyrG!NmiVp> zJ|)jcJ*?whaOFlt@s-r8iT<K`OZD-eGTSLfk*Y?N#rr0p7>Wa~f;*@$8b#ZY4}+q7 z2s%mNU6hSs7Wtp3>M8j*C`Ov%WC*Vbm<3hgqZv|WFxBj!xz#D+85HT?5`3f!XnSB0 zHU5k9c?HhWS%B;kz;-75OJ8B9RKU1YM>`X%KMo3-i<5aAdZV{PFWmaz*==yf)j=Qd z>Y%$euwf5Cui@{&5&M~=@mh)9x&pA@4!w?gDgOZuMHM9|BJMGG2>IhF&MFn_tX9N- z1pID_*;dArQvjnfSbH7J`yG5vlu-xpq6{#~S!_{6eN@kbY6jLWf)K^mRl;4AmqDGd zD87dx<f*by44_Ok3aQGa1Ao&l4kEiE7SJS*3so~FUrSx!fNH`}&Msxj)Bvog<1S^- zRmRAai~0^mq8d0<8H*}WRw>#aok0O3;8mLoZvHX2$YgNv$@r@^;N28sQZ#Btkq_}W zJWi|N1DgoH%s|-r+r!5;3_qK~KQI!sHyGZ43HW|4el7<LSA(nn4rrbS4PF5~-o)uh zUN7=CQ%)O2Kv0c0suf%V>!%DuiYkl8tSLu3wTRLv@02pqdSHz_K1%@|md8E*BC4u@ zdpN{_6RatMpQ@|&1C>yYl44c|6lll4gHg#hNA)VKpsIElpW;KQ8d@r%_A}A5nle!- zhO`uDk1{kV9*e5{P~;JH(XNcos2T-%gUEwd9^WP7%JRVJK%CP(ac*w`j~owJPJtY= z5GVPU_`DzXQyDy;Do(xzC)<P5X%*lz5IuxDL!#;r8mwa01^x90UA6{X-$xJJrQn}K zaUDe$Z^0esL4z0Ixif(Yf)Le}q)J&tGnB#G1azn2dktC5Ex@g)?%NA^dC6}Tk9AXZ zDym8H+H4P)yasnGhZR-B3QGcN-LQhUkWlL5oE;6w9s@+`g0s4DLQv(10g#xVo8186 z3e0KH;%9(V9QIrZSU^hS+`o@qQX3LL60-}qU5Xx+D)!!ea~5O<8D4BRM)(}qq{tsS z*-ByL);QV6<H<+iAET2vnHAZ(=<zP2w|g135-YINu%^D4-)ro{X`riGrX7&!X{H+& z;MW^$>_E5hoyH8~2y{@!Jcbh`8NBd2P+UL2a|%}b6a2?V;Z0|dNj4HZn8m7VgF+U< z>#V`Pvl{p>%iM#^Rvpl30zc(4__7`Wvkqh#9R__51%5A>qd|c^AhFyqWb+W#w%)8q z{y#{|BS3{CnceV|Uc~A72rF*}9=O(A$0V^y%t-ic$K$)j*b_0#DYGl~*r%9bJR<%N z;asbN(a9G(8uCCYq<{@Lxe~GOMq&?+hEJP?fAc!qj;q5B<YsZ7aYMN3@KucAHgg>~ zFFTA4fCKhrNXncI?q6t(hX!_2-=^2pPihafPWldXuOF?K)j!bp>*rvxZDJgR*RHJ@ zHl9O6xn&#zY)WGHw*<YWupGRHld$tIGSgw*=*_NzWN{lDma;|v0k8NQR9W4;VkpL9 z^b^lDCPS+F1Lrk$(%xx)3b>e{u1m}{RQp+l-F^{#gL309m`k7?+yhSPGGj64=imyl zkXZkRoqQd9q79_1Z6=FVP*lT2aFOk}uPUPReUMK2;PXtJWii0kCbkQAgZqYm#D6Gk z6$S~(@H~x$MzchS5oCTD|A;HW4S<CE8R))_*%Ue?r?=J?N6y23QC+R54pOJXlT{(o zI5ITy5>^bqwov~NC+b{0@3q+<T1y#rB^xf1qOWi}A^rc$9%mo2&)DMJFkoOAm&BE1 z`(XvWU`sz`^n|y%v%wm@^sCx-&8vL`h*vgd!xFFq`)(6Xk9V=kIgndbrX#GTB#m^3 z2fGG)7@pzh@G&n3=i3QsjQsIc0l`%G!@mbFaGEQO-9`&Q_LVsUbQdu?7tu{WHjMD1 z1JYE>YRl&qEA(d;|0h{4SuR-0TONyRgsyxVJBo=lpX(L%joM$4jp}rzz8nZ;1ZxKS z!OK(-x*YzW?3Mc~h00O&P2@v8-5A9D&7S7Q@#Tf3!Z9INXe<6MM#Q#Kd+E8@M650J z;5Tp%_^aDMLY}||&5w;Vc&mR_8^gEyuG$j6YvV6TouQVFJc$%)!;MR3C01v<a=oEN zwc!rHTm3G-7@AvWz8^P-<=J820A9qhP@UAh*i9P@(fAs2bw|Cq{-GYwHyfWqJNZYS zr5k#2^8~Y>D-?EFWSiB|&{5oR$o{+i7yCgdM8)9|Jz~3Naf+k3F3kJJY%MinC?4fv zxJl@6AmrOo$QM5K_AcD!D;0Pid^gO?ujLfANkrAEn|oMZP{sL{@2xJ|XRweiv+b}w zu{E$)w9m8+vl>!6u@t|Eor(QF3)cRBbbsWvvM(%!LV?kNX#oeUNs~ja@V@YFSyNIX z-)ZZOm&|1Tgjm9oW~pdRvhJ}sEUTn$2uoZcel28hW7rqw0K=x+wL_5>&`mSpq3(xp z$l~f(YDirisR^r^rmL{dZQ(8m^(`&zFP&T5r9HYQ-4o|o7qiK|%{9sSnPZRb2g@Yk zOSYO(BT`YG6P(~bQP|JBqu^P-lD9XnAg@=xmjAQ&qOWIAl=rKZ;YnV}F5?%8<1KA$ zHpfrSt*+MY8SVz|p03)?ijFMXm)3JqvN(bt&rUTL>gOYpx?KJMHnXmQ1^z7GLf>TH zJ>NwCSAqS(Pr@Y?Lygnhn;)@t`0`@DG{<_$b_V`FpMALfj?HJiY?&=(2u=9G>`L>1 zUQ>In-c)wOeq#&I3@r}b2#pQ*l)qQzsV^ga^zraDbmF>+eXZ{~ddIvM|0JPx;`+o^ z30bkbJ<nq5yN5YNM_=m_A=BI&c@&oYOT9Dmxx6bmjdRB51ada#oX>fXYt3I+5b%lN zv+B1-8_p)WEC;Ob*_%6E?m02{J!fK1#m2{$^6YfK<D6_OX_+ouW^>FhjNw{$b%^}G zQ2oGG-#>-(3)>cMFPs5S{2qT+U|Fb<EU1iD*BH%Q=QuG(`pEi&t)YFjeU<$;`wY8o zyKG%%aZB0!9(WOI8Z)#EH3L4=59F2M=HdL%ccDq4OQFYMUYQL0d0CuIqnSZ$3GN6V zmNIRPT$^Lvi5W?^l5ZwoN=%7g<(clD1e^8=%V2RW`%2H0lLD&>(sEj6)z7@2Q95%^ z*0t<cIq`WH@~e3-`>KS#S4SGP`7bOt?WJ7FF>cRjPqwE-Y^T_7V@t&<F-P13ox^QG zaTa&OI3DSt><K4^-Ud8@ME~o;DTSL03k&!A?15i{6~n9KDe#Ra8%NAlY%zYkP+q!i zsbbS@BkYUp@7UYeW?4^JW`Qd1@Xfh$j30K-jp}XrM7T<LSEw3RSSq{-0fcwubIJ+T zp#}7X@V;&0*7BbTv0`8NUG7?A9ZOw8?4@`!p-*Bs;Z)qVn9I(R_C}VUg}2-s=1;ww z`YIIibuIAZHqZVtYhhO3?1{N6@<)3+`DO&(54DynMz$E$xJTj<+po@R?qJN<p8B4j zV%E8Lx=uSUI(pf!TVF^6g-_Y$hEHYXo5B8pHU2q%KCm+23Dye^3+@kcp~BD<xr16s zYiNAHTxZh}wXjsEE$$X4Ni8iqEN<%{YaQ!k%S5S_cmjTm+c<@OHNMgRr%j2>R2L~1 z<&WeJ@-F#f#i@!B4Zd_cVsTKfj7ej2xT*Yb;a^xr+X$_NZ-kQA3v+E-9i7~#V_JEZ z#*}quIu6?=TD})A@Qu0pOl!n_6jO?a8v8GLnSxz;=kiwNpDNf}I2C@MxgjMyN%<)f zYg}MNp`qn3+g*ptwZ%2lb=#>rsyc4ic3HPthD!mV3?I){HE(I%)ShzX@YP_AVDI4e z;FVxX=rH`~>%(2)zgnZ7z}|{Cr!!C4F8m5%B>epwCDsyasb*<pNwoYf`NSkKjsJnG z%w96b8rAetT6geryZVpvOmTsipHo*yQnf4Eb$y4?$^4LM#5!P4TE~|a`Uvj`O=0IB zftMjvmP%R&+B-S_b?tKNuIA47?JF&>1fJi>)?<D(46SnHj@&EsRp7ACQdr!p6fE{$ zC>-J+9sE7q4704Ijf35GFtdg`Cpau_+Z_8K$4bWsj&1g3wvVh$EuEyYVitc49%ocS z)hlT2)DH6P5Eoh=oD{qhJQ$iCejV;1$18s;->UZ`({<gL55M0TexER3>?9pRbi*y_ zg0ungLGwgIXd=Y(*Vz$F#CW1-AiCvbWM-s)WE$-EPa~ge7JZU#Gv+~l+y<TD1XGbc z%uazNc`AR1f6SK=G=3<5nOh6#%fX%E76}6+hgGysc32%5woBHdQlc=98_Tv~YMXW7 z6@3+Ht!@K;z71A@ck;6TlR*DqFmzi^QWGO3v_D{bOxH`B^O??E13?!1S>Cr!w)R9E z#aqPVG!Q2uK4B#P3|_`c?0GZA_)wdoCMgN>ui*vZVE8vVQJJB{sXwXJBOWcRl`=+~ z$Kk<f!gmx>#Baq@;yN)=Tp}3!AFx`N<1cbu5$livDg3pe=pX4W$OIE`&anDm{Sty@ z2Oz3zkTKJ6BBqdmgf)ik$5rPW@QLtz$MCPY!Q4|;hG%aj`yOk9=eq>knmxdF;1uo~ zAs`Ntwo5%N1=1|>9U+!~0}JdPXxN*K+ki2r-Bb4}_v9w>&G6Fji||2tkWvCMT^%(| zTcE#ZoQD)Sg86`L%T?na@=b(I!b;%>$a6k^C2!|H;SNGdfHlDEWz5ol*Ie4{Nb^W) zq;BL-z;LfN6VhxaV=*vx$6U*#vVB0Ke<E_B3s;ky!cB(M@eEd}O^CZ2%)WpnXfZ4U z>mVbyfwmfg)b^8c+t_M+Vcdm%^B8nO4l@64W(m8TJqG!=9()#C5Vbc4(%)i4ES`Z4 ztR1Y>0`m=`NEKKHnm~Ko1AF#9L}1>6hc1n&20L*sXYvz;OTvfZd*ThDv+y1NJ68p^ zdlR<4Q?TT0HP!(BEc_Y|5tCL8=l)r>Wn^EZ7UEC(>wEMxeH`K*M?)W3%v=C2igT4= zn-n>jeE|)r05anoXk{Isw_Sw}GRI6bml&gs{zglqgYgce|GyyLpEu6p)dDeid!eu2 zfj&448es#(HkQCjIQAj)i0#I0f;5`QE(I=a>;%}IpWs!4Spln9P3UlgA-}JMCNv!p zGHoHDPlGmf9FZ`T$K8Ngz=UvbA#;)$3R~b0(5P~m;)n|w&)Bfi)rkB%gAupE#+C&g zt2*;DG=!4SnGaw#F6J-jz#deEcmk~=4py50{AIJ)pV<}gFqdOD!0MZbObM#qwFB2A zKqF(#`-a{82NGd(W2$i-v7vv#!z7tjGZS&bA>*;}DfHwj=7-RdPeX664&AK)@c99D zFu&OW*4uXxpLoM;1xdRe<jr>hz0<Hmlz@hu$Q*~fT@uzqs-R9CS{5+}p*yUHRX{iX zG;c#Us%ZXzD9Qbp_gF+<k}azXn+w_fCuqQKL<-gceYIe#u=`*gx(}^39~L+_vlrHl zpP>Pq!yG7v@&slS2YuHE>uV*%Q%`25o1+*5R)-p(o^h}xP;BckSZ!jVpO%0I^C$H9 zP0-M;z~a9j8st;x^Z6KMEHvClfS!X{4*j44w0p`hnFnpD6>I?y@J%)}%LL{pz<mW) zb^>Qs0_-2nV9_WJzd=1jo9~5oP8H+!!-C_1#y<uy2tnh$4VqbxDA(W2kAd@vu)t<R z|HuXvJjV*286`ng&tQ`sfq3X7SY*cHDl2T$Wtd+v&y9$A{SGnKGXa};!0{q%t9vo0 zKG3e3fH%AX)YqGhu*xK8<FBy(E3osNz$XFF&1PtSR}tZw$ovmpp?>TQ<`UMj1Q_WJ zkK;VE4>aPs%wgz`rD5kj3_Mc>)McR5%jQ;C82$xyU4)ML1*{d9@#GcEGv;@!;A_~0 z$tTkR6iRhix<KcDV0MO0j01JLnP2dfnXqfjg3ihT?{i^cxr9~Dg3abn(Ck68Epr6g z+()1vvVCrXzlCai_rsoc!ZPK7m1Gyb83nuBXuvNQPp~uffv^6k36O(3FCs(VfDQXP z^g#{pZsPstu!6h`+?9vU{VsC_&lrKRt$<`4Y%!fM^ULO8%<}-~ZZY6tWBS3i>%ezY z!Lf2-i+ln+9m9IsGB<$7a?pCSadm5Gn6E(*y`Y8XgCcaype@$((j3UF#$1MD2KkuF z5<p-8GY#u34r`GKUF-qIcz~HDFegDj8K4=;I_wIbuJ2i6lF_&tm@4+Z{8W9N*9 zU2GvZ0>!D{1!YiWWD{__1!`)GeYd{I!eM}Rl0kEnuU!DR{e%&(VJ{4V1xmp>dc%uB z)o6}lUvxw^^by$LL|7YAU=4o;C{n%F7oaW;_Jy0UM+uliUs%?*!wzeJ3Y%j7XJHHN zihC&!gt`QtLv-_X?2=DGmnQ(@+Zd%hAaVe<m)*cZbKslmHj#Hl1MbQKqh74I0dTPo zPa#{rqsY!j{X8PzEZ1SXa>80O8J37au!H>uUik@NA^}no?2Xh>Ld6Q|q26Q}K<6}e zW;@t|?qK&(1+&NSU^qZ23ZRn-tM@bPR|T{{IjdBCiE^8(U{B<Ls*B_9N5DoqU{t`f ztgxOKpb4rk*b<aL6&_xJAKOrwk}CT|>xEFgy_R_L2Ec46sOSuA5D|FOC=<OpXhH-$ z$w&4fR;B>kl!3h&tLO;Yr0Nk*@i+Mis7e9(FRA8FDq!{&T!CuKrh%%6b|_Di>K&he z6}&1e)PBIU6ud@cQ;Y*--KZBpxd2tLOP_$!sJ4;;=u!qP+2W`s#Vv5?ILwTmNOgp- z;@j%rNA+?47C^Wu?x}}W(|TRF?m4he7T_bG`X->3N1!*Vi{-#RIfEy)D}wA(&`cuu zNeK0#Dq!3KV74B<c?N$L2P-AjYR<ulZ3B<6GKlE~9A9G&Dkvh6IRFSyw}DQ0?rGf7 z3oyA|WdGFh4RP6epps0ihw>NQpk5pE2e{`L(8)$Xsx#>H5#HAU9a2SxG@QLA)?a|% zBA`lE;QN@%OTeZYU_`VNGMi(}LeQcBE42%Au7)+~;L%RpL3u(3?zjdHSr2>o38;f= zP+vEx>&pR9X)SQZ=itC)arZsYVQauG7j#OMpdMo_F3hC{PU!2HQ9bPLEZ|DV=Ty~~ zYORnr*#=Bs1%7H_4w=}^7qCV;Cz@g=dqBlhH<qd~P-Uw7c*ZTvgSht=j6n4ZF5`U< z{C)^KbQoBrs*SX-$;zC8^TUImF_?!Rqf!mzVxSYMiJyfX(G)az8#EOQSg@eaIB-nz zfu;cG>7Wv-+D{qgR5gnFmXH<QgYPKYF&&>!u1RfRm@1}FO;6%>l&M8|)X{87@|;lZ ztx{Nh8t_ZLnOxA7w+QBx%}JHNsE?h3`FKEMA*{7JAV~F{BKW&F)}4uUR{-@>WlEy$ zGniK&toRY;^BztSs;%-4o=X)J8SD?LLPgy)-e8yUfIe05i{Ks)cr|5T#b9T|z{lkS zmoLCf%H!H}K$u`f`DBzar~o5r;Mfgd<IMyA`7alp{Fjtt%0Lb*hP9Iy%~IqCP%%3N zv_aLb8iCgez|||vfIJ4VcwY$0pgM2VfiPMHpSmDXwWs2E!X2!>D)2yc$z6a0b$Tg} z6;aKWbD$Rn`_6zINOf0<TT;z_%A~uBz2N{<gW%vbuyU&5<p<4DE@}#>_!ca@rI<f~ zR~n7#R0V*!@_6D)JdvuTslYJR6r%1vRK>0mC@vQ?kq%tifVcYiSpaIkj5}&$e$)%+ zDt2H?K#8o=(RyOk`Gq>QvGCW_!#Sygb~Axfs`N^9bpvM@Rga*WX%#?i$MFqS-zf*G zq&mYP$PQGQ@I9=m08lRk_L7U{R0Hdw>|&}LmW7$7V*gMjP8-%vRRF0v_6blPc>#&y z8v%|a-`2(Kh(8n8E5x%XE0Hij73v~@K_R5DlGwB4S)z5Y*lSMgv6A58X@Dx7Dz7mg z6EKu<zYXUJRWsz6JMg<S1Xcvd9A3b~2JS$8q#nXc<Hee(Vrym0l6oR#V}xYvvO>^b zJv=!LP^LVt*VwD6crSzUs$&<~u`dK%@c=M*7gS7D=BV;rJz(z|xIGIAlBx$%|A`Dx zlDp`Hr~=xe8oR^|Pk?WB#M;yFoAMp$OxXh{*91P(v1gp%>m0tNo)zTDqUt(nzzbzZ z67M12m4g+&#@)prT~XGm4hWwI9n`_I73=~P=OAUdQ;pEtxaT@3;vufl;lC<Zgc*`W zbVxVU=PUsDm%uX~nl14AHtwnhnt6a3P$gi(+hx!o)ox11(`$e#Z-H|)2OjMhkupT7 z|L-}BoCJD_!IOz*U*p7~Gr2zSbOrpk7QEk-llcW;e--kK2@RkOWc^2wg*}+%3&6ZA zt|$#^dj;H3EoTSrtc@p9<<5%Gy5jKUT=3N-P%hO9_5t6NLr#^LlW<imAaWC<P?bIM zoKo#1s`PsvyQ?qeMz!)ulDUMPS|2MWd55G8stJ}3oR!2*jE?dG(oFNBeIA3IqCrb4 z2Cq6*@u2ve_duo8nTz^@6bB5S<5Q{$Lix<Z1F4@OWuvixiqC9@6Zw@n1Qf9cbFGRU zd!>kK@8Y{?RUXQXq^k2zv5G{T@D(xlbYOuxrBHRq1g!fKphQyZ3hdD4kWr{##~RQp zMI&Uvi&q++lN-2_vTOy&H9WM3CpbxXocjW(t`5#>st-!_1*wws$5`#}7~L$Ai^(_s z6!be2kX;YnG6r*>h4~E!J%q8YJgg=ItGs~~`~uk*5o(adM*)tbu<xJ4SKA-E;wm6~ z0b|w$RuTY*mqomkYM;kKiV{KpZ!x2u*li0zCm#XR<1pSA&`PLk9?7D)pb64^V*o>n zl%QH(UP!0{B+?}8W~yfI1-(*+H04*OLO#!hRDA`pl;xoTzQRt5fW}UnlMqwa0vvji zxxkzPTfr&Jxh8y%7VMFuz~&Ilf@;tg2kqT~j_@wDq&R3C`--soiTOR~dIz-HAhdua zc&-O9OR@7?VznJ0(by14Q2>sx0(ahqpE3=Y*kta+9{n0HcptuEs<7J`e#*Vj7_XV6 z&0PlU1EA4HplaEi1B!2q9X1%0`8}fIR^z*ycsBv|wVwf#PS9k&0v(LU)4k9#$wyCe z=ml`HPr<dQp6}<Nyu;?Vp!{FVFF}F#00)w;USXf-LPz)qknq7{o?$KoS6PIWtOf*j z;HuWZMOkPEA~d48ptW|G4TrI3;wc-To1KANGM)Jlkp3AXG+<_6Zan}6NJWNWZUY_Y z&>C+-&Lj_bU94YXD<Jl=46_g1c|IWd9>y61yW2Tfl)3^l)xpV4%&Ur-1wZK&aBD~; zti*g_t^t1yAsdpSF<yd`{KU)yhekAvc@q1g490?e0h;<Va~WvY27RnP^whh+*fn6U z2Qd87oC|FJg{QlauSxw;i^J<a6A&d#<%6&N1^RygZZI6M)`8WLjAl$XOS2;Y-&Cf( z`3!KV3O)Y_tQ0SeRpwOo46u{TE`o*R1@i$$&I9%;GoPCQ?D0m})9+ySr2<okNyFY4 zg`a;Gt;Y)PJ{FYP4<7AW@I6;%W@6@Ra92}6(}Oh*Kwe&3=<q*)BFABlqXESZY^<4O zP>f@B=BD8{N3at>Bi)(x<~8iQ>(J{XMm#*;SIo)CK`emY{xL9_i71kWpr`Fc9%d`_ z%=VbeSn!*9kOa2l%10)}ik^c+G9UY7E6%BI*n``E(c^&F9O&<T!96ZvztsX{LO2x` z!)iel&gNrpmjnITK=*a<<c;8=OTe9|BgJUos0Zlh0<e~eao-15st^7$43c~tvl5d2 zYdm=`xJ(LcidFE$E!Y)hfv^48{}m7+Sr0fi;j^p?%R(VIZwX+Y>a1l0JEcL3CT6q< zBb0?cw-@JQbI?-_*nX)0b6e2iPW(R$X>0`ZHMrboxQn_*u*`5^o-(Q}z|Js0<}}ti z6z9!AND#k)vkk<K{23=tZHy#iFV4r9#NDXN!`HAJ*2Fv-z?O0u@e#{#`jO@71%A#h zl8)-(_e{WKH(pf9`d?69CU|&v?Dy}Btd34l`d>I#ZXzDVi`5fssjts&%;6MlUE?s% zK7jl#;HfvL+l_rW1Rm~+*xOe@36o$^Tn+o_OweLu#AH#WZmNMVgP*1Wt_NVJ=!*Tm z1E=c(K=Czbnk2l};5N&#eiK}%KWO$K>`#l#FEQdSjC2ZdgcV?o{hzs#*}=^cvc#bD zt>u{Itfh?QDsrBx2p{roxNeAUF3qfkzizmerGBLt;acGsc(XQ!_sBmgA0s#Tu+|v) z4E>B!*roN^Z@5*+>-Y@$t#5?#!Z>~>m(7+!#?M_?Mn8v-{;=UPYU``CIPF;^E8<4> z_ChV71+}t>2;HwALlj0F@}w^rHE`x`MHb>;$Q5bE{lT3?hV>P$2e*-%A+E7rvR`pl zb1!p$=I-H^ot(Xob(^H{!`RhkALG1M7%8Uy8g3Pw?JFoanV*&4u3(rq&zBcCAL^uT z(Hod=84q6xIW5PeYu1wXa!%RR$$i&#%X!cKskMVtTS#F=bA;Y5;!^)rT*|ue#gG;h zf=Xala5((11#(q&awMYFF^Yp8GZFc)mi?0J#J3PW7w1STr3%s;n4XXEA90P@fZ5o1 zp*@JaL>%>QrL1yP{!2EHD|AKqN4*tkqKA#DY#H%^U5S|=UpeV=a)*?HWP9?ygz=u? zuDbSL#2_<E|4PjYh5fU<qjL4kdg({sTtRv1=9#{nY2F0^kFv&i%RjcXbJTQmp5?LY z;_D~QO<b2aG|?abVeHSYZnj)u2=jZSefWrfn74fXz`Txm6Y@spOWuI@Y~io|(xI?? zBl4*+mHD0X3B@gktjlcIZRc#GY-_DMEPkn~^q~mf6+em{WA4)5Mr`UVc}BQGs36cW zP!G96M}yVE)n%8Gu0GV8bGg!UXQTK>$t6<Dmy9npxa92AXDPw>Pu<;YKAtryDE)%N z3N!P*&90i!_s!T>Ctr?x_3RCoDdbKpJQQwVWC?8@PEY^%{fQ-$yC!!^o|L>OiA!YT zXL>$zY1YxgcC)8?GtkESeQu4c9T`_M^vuMZnEa!Ko?tckaHOp{iVFxC(gf=<+a>!k zM|)>4=MKkc`(A4ssgS=4&b?jFi9`_1vR&z|R8-c;+2Jq4t3z{w+XDjw{|h_}><g7w zjz><L0pY5xvHN0tUdqYTVx`uVu3b8(#P;HAlF!B#IyOoR7*lB#=wDDj`{mnduTs-2 zFAhB~nU?ixNBYM(x!%9RE`t}^*ssR;;=3is7yn=Cr>PH$pDQ*e`Tc~Ep8C#!RG*F4 zs)kGW4(83yuAMnOeN_7CjMZ6Xb2k)R_g@a*iL__F7Rp$EbbRaH=_wJnFz&s$VX@<4 zwmNUxHc0z9o9Wb^$ZTkMV32>YZ>8@S|963P!Q#k%zoz7<6}3xRJN=P<&VVMwj^Rvh z5OQum5T99BJL|`W6aOgIC3RSdld0WPuEc-g9$~G;j#O_1_7~j9c_(X7=IM<78Ce<6 zGm2%#WzEj1QE<#JD$|X7LIp>Gr&`jhV!x(tNF81L_vGK=JI4%kNS0gNe6yiuRqBLB z`n!3T<~__gki8*0DQ8UX^n&sJR`PEB7`It++a=dlcY~N}G1J^_T`S>}Eo&VojS)<C zq8ZR8t0{6?@U*`R@^upZa{@a;$K_4x1nr@2gZy|Dbxp1yQf<9a2Dar%$e)iF!`4!+ zUU4szrWgA<wOI+Nc*~^nal4&iag*6iEfc)!-I>=uXK~h>%r}{vGxub+%9@?sAuq15 zYjBCWff*weItIiZOze?zyV#Xtr;~dn?DPn(Kdc`L8<=wXYo%YfYH*&fiT8Q_^SqvU z%kz%sFZOoy7Yk2`Br*qu-PV5{S6nOIFOXBe$hF=v+&13QM;ywZW>MQ!zZP+-lFWo& z1ZoEY{%L_=@OJoy@**-pzhmryboec-N;eT@mZo3OSLo05E@l^QySUAE%e^ChVsb+9 zIjKJvPfn?mSln~e){1YVe;=Of+mnAP$CBMD>yxbftX|n%&cxg``6-3f1HZ~k^(|b6 zrHRWIyCbo8%AsQJVkeTe#~+M2U>_%DGq<#WEC<v4#e7S>X$2PwelB=Wkm2p&JL4}G z`bFuicVNF2Kd^n|T<G2z^B^WBW~!^cW4ZN|XmIP9sm3o_Y$UAY%Q?t$^@MMQ-h{@5 z2g!?+M`|Ojz1{+G8C~Hq63ux=F=MS>N#CX2)AkvY*^PqTHpAUA{$A4jVh4*S7XL2g zlSFUKOj{NHytW}Uxo|<=%j|_&?Xpf~&CK4AQ<%Fq|B1J<KP7ZSNie?S23h`gj*A_X zI4s3l{8}+7rE%gt&xa@&c#v5ZsU3C({w+-M&MWw(!0El`E#YhGuNpWMJQJ>pLTY81 ziTnlWnXRW&bh9y4Vp_UKJLBxNEH#DJ>^!5A)>_S%t@7INkKyykeVQuUlr6~7zoveU zoW2&?Ib{1BN1je4L`Lp`hpYtjiZNVOvAyk<t4mxkaYV|UVt*A|m2x~WJ~qRi&a-;i zP<!u!oR2f_rcX*=k<mA6ZjL8^zjwXATd1<qU7Kn?;f6`$?33J8<K`xwP2QGLCFS#^ z>hU|>Lv8E$bp3=}H89qjns3ju=Vj)dEjUwn)E^saAiLC(+UEwk(s5&iAEfTqYW7o( z$IkAqVlKlGXaC8vLD<RuXsnDhR6Yg&{W*9h_%+U=YjSP1d&Hrw*Pg?-J4qX$)z(UA zt+dUWPs`V*G9CCor6!J4Pp5?O$%l%~EMB+x(Uk6qlRPc$fAF$4K6Kja%vCbWXZ)D% z&X|_DHv4Vv&Vs|fWx><(JK8vN4VNG}?H61h#(t5oGHGk_^5h;#N8{a|g^pfQkXaHL z8ye^vUobpxL2e+oSpMk(hws-wUg%Th4I(mf%**UazOA?qYdK=OX+Pi)oYNhB>?f?} zr5?gkHq98Ml~nEW@lagoO|WaIO?V*A#qMgO$S%|oFeBBq`dURzj@Y&H+BRc0TTArY z#F*ppW0DJs)lF@e+OGJp<ZW>)og2mBMvZW`_jXRr%*N?E-VRBxl6g4$x4iS-xIpQ! zMZK)q%{uI9eyg<4mgB7H@x~bmb&|#>%}X2?-_sLuJdv8QGb3F>oNsIX=-gd7mfXR4 zn+kgSPzgf*DDp&ywVrkJPx%GHS7J}8t)-*2I5L7y*yh__Tklvtlv)YT+2-aKTAuPc z+&A=Na5$n$ehcjjUzMLLH`V#@P;W+r<63PvFtXopvf~8ScF9#eE;cDIWpMH9#mg1X zPTmv$*wxJvG3Us^!tZkXW?p-n_NMpS<ct$&CiK>ODbPzk7Wvb7#_Z!32ot4V)}Hot z&K>UeJo{qz$32T{7x&yV&h54TD6L{QXlKJ8`|}FE%9C^c%{iRAAiqrEh(K<*L!`e^ zg008@D9jTZNlT@R$nblDNRM>XmEkS7q%qPlalY_^d%+wrHfn3tv+_q+%}r35BeXfR zB78@dl>n-t+(*9V7;`RrmKP97^{%^H?6`zYNvD&gluwgeB+iWWI!9Tum|xTjfo}^s zV~<QoPfFL*|H%9}Cog}$Z*r)cdR+gRsl#s)cUYR*UfV}HKXuh~yJ9BB%#HaZW`Wyu zKCpAv-vmD+>D83o!C!rXw@d!Eyt{e#@?Uuu`G<wpE1B9kvo$wEXe5mTHWpd?TUE<Y z%Ok0WbVRHv&P26^P25Db6%#b(=}Fp7wTZ&X&T#F}9b`dv3dtc(b}JvMJG8IN=3Iej zvF~u*^*o7BNUEFsQ?f0&equqa$34fE%?~y{Q2GUWd7I?j%bt_fFDo<aqnu-T<GmmG z=Y&=$4YkY0x2()NB*7Z6ec~AFobPJrUhLlHZsY#M#W<7g+bkMRxqZgc$aeWbaEkwG z;X!Xx??G=t;kW*=!B^n{>RGKZU^$Vmhz!~!%Sg*+%OXoN%VVr$zo-f&g(UtRt_1rE zu~ofwM%%B>Rffw`!r{=pP+F*T_)>V9yia)@`OK)xUK6%hQ=CI%X2qRJD3-J~sb11= z3HM?<y06++2?Ncx>V)9b!lwC$a|UO7vcE=LT;=>fy%YWOLPHf+TVcept@sM!3+Y4a zVB19dSVvXoPN(7YJLfrXIF{HSTJK9Eg#&D^VbjVht3$H_|N8bID(+3;-#$+u14g+H z>R~O#?8f%uGX+U{A&s#7Vwq|wX_+hC7F}W`p*r7+>&kX!`kGyg>Uvp3n(7L#beFG% z=Z43G=Y{WvS3ss7puIH8aW}+Xw)@T&9w9!G;7Y2TG(2%m{5;P!XFaRH-`DTRO#&ml zUGo~{w8$=zZDha7?NDI%#RTK!p!&DofEmWM7Osd17Mt~y^=n%a;ts8j){c)IwH#;c zuWT!=cGQJ<z;$Cb>aP(M<qwAZOMPjD=L>83s`~c__J@4(h={Cz#{9yK7w(JM(mo4k z^;>?kM5Jm`Td|Q)iLb-8V!Ja#%_+ueMAz(&Tvk=3qjFAeE$4<sxx2hZo})C64AfDd zmun^+vL(4{doIT<Nf@2@L*k}{9dS=%Dmu4Yj&XDJS#n&Uls7-OFgu);mGvTfe{Qvc zBwvf*6nS-Ij?tC<lV6CHw6?Og?+{&^YHw(N&u+J0w2gr=uPdrU#7jR5|8fVJ(S}ny ztV{`y3+DRMeFJ@?e5S8r;9f90+*y674KN?DR^hVP%re3nW2<Dlfh_GRsOqs;sKLKx z|9}l=lrd933{KlNvQ;goo>jh5l9W60OS!x<TDh)lQIj>^=*k$JOZwV&-T63XLR|lZ zPZGaNe3Z~GevhYt>zZ{7-`cP!6#|zFdggN3=Q8JH_Q@)rb2jg#w_V_R_^ZfULt!@w zkEA8mXSPlDT>DG=ar;>NQ(JA@7Hgb!h-HU#N4z3z<6CkYnFmIO_CmcSKMmCm=J`we zANWf8v;D1usp0m@>Bs~lk)6*U6&G6^$l~v7uVr6s``-GFWw{8B#0_HZ8RPX{+PKIS zwVC=%IiPG;jw+9pEXA&NMmDQY9UgfY*{wMY^blYN3Y{!H?O(dOdv?S%PT&)riA@tG z#9fFHojoj7xg%QLaBH8QH#xgzraL1uUCpSR?aW*0-4=KyC+QaUH{pn-wmk_a^eNZx zuBxuOPP?PP_NR4<WsEdZoFFVkU8ir^Zm=kg)BlMmN+tQz(Br^qzvzGLYw0f&SQFeG zj#sZ~2hF8iLve*=D$dARj^z%UBiGi?Iz{R!#B;D1>mO)ARYW9uA7okYK_!B})%PO1 zBUYU8qfu*TqjpP6);~iGUR`qw^AlHDOtg9&Deg3n6yGl4Lc(te)8jkFwsV)W2Zb5t z6QxPu<ARnsp3D~Mf4yy-E@Wn8PXu2c6fUo=WY!6dttB0)t}*WTnA>jFUFe+Tcy9aJ zYPB2?w+M&%3*0L<1SxihF-(7fx=9n|E1@dDQ6qoE*UjH6a3}a6JY21)^UParrI=ya zXggu==tyz2u|sA@oVmhX#_1BPAC3I0wpGihAE;Z^l*p`zFVabytu4^L*7|C-U>9&| zjj^g1dNb3_e#N(!KC+E>PK>d~or>R?a5tf5!s<BIGr)P>@+%jw&k6VToy<$hUX{@z zy+V4gjGwdi=g#-O42)May&4x1-?Qy;40C<q-U~ayBt%+1w|{91S$0X2#m>S9d^4^p zYh(U4n(Nym=}L8ZdMG2X)t~13&F4jRsbRq%!ll(%y)iR@?<hUAKDO6$-g0hro^mv` z*Roy`8}N&naz>&yTy2JY@{@8Er9kmxw=~u38U@BkSZaSXJ0g31h~d}QBkT2;Uc$&W z6te=mm{a&9vAC3Cd23l>tz?^HTW?!oYim1beQS9Q-v6#Jm|MsUGpzqd)LFnuaXfE- zN7m1AcXxujJHg$9JAvR%@Zb^%8Z1Dt;4UE$T!TY!x6{>;eZRf;%ll_Oob27r_Ec9_ zS64mtlzt=dn{T$~Yx4P|K;py1x=9(5C#H<^p7r<9N|`S$6O?P#YxWV&m97@<jqXP7 zajx&2Z|wPOZPWqsY*tbY<4^6U;GDn_e_4M5{BRY)<kks9!)8$u)`ELxHOmU=w0uOF z2xC!EYi<~x(yR5sEtiw3S-QcHl@(62<;GTOVeDpSs)f>nZ(B$#X)Rce#vuEz!B@H4 z`~yT_z|2FHg&7(H!{AR;foziNC~ef`cz=oZ!Omr_`tJSiKi&D=&z!N2gVz0W>CkNL zny+R`)kN>tpT4-i{P5-M*S873CBOD=4=ypw$g`~9JGQvgi2V`QBbr52ao=}VaP+b* zRv*hPr2y}H&5&3bBjFp#5bPQ_;cx9P<j)K0I03KAt}WGj5lhV^|EXlOM%q?^X>D&? zY8|6yR5nW$EicWhMy#<>pQNAD>lqJ>xn?!;wmre#c`PCDWwVIxT_*xuH<S&WU||r8 zU8%eILbP$6<*lWN)CC5c71B0okJMUjrBqPcT3^^IJ4!o4&Y7-JuI<hmj%K#m3M^x~ zH89?@HmOU(zhB3H4SlVjusCV5=c<3IUc)k9>1q4JQQURMb=p<VRoQvm?zHt)ugd+U zuEb~M&?ECAa-C^bFwYxh!Bwx)^kDbkrNFYl#X#d=5p9TWHxGyENJr)O$`%mCNg%0z zR;D7I7|Ta9)|_v&G<pzAn{L)3N_fE1PC5fwu1mfw^#;|M533(E$C<gz2-D6ikKo*s zA2e8gkes>T;5ZE?G>x2%`jh%{C;6>>LHS)hXjSc{90`tY&Z$njbBFz;b)eG8@?2jU z_|7{zxn-i9uqeJl!l}gf$xpr2gG-Hf7MnT>wu)}f-<_qMB^@tpy@-jGm(xm>Ko<2P z3OSnEr;9{iTQQ$@Grv(vucj>v77s=S2M4QZ^<XV23X(4)OoMii(@oUFun2izj-b8_ z4vL>(SGWNafkJe7o+ZCDQ@Sc$ltzQI-9!d*K6O_Aps`2I$7X48Rd<Pq52d<r4HZ*8 zh_2=%CsP>|(i~>I4K>*gxt}~Au7t%(VfCrH$2!rL)?OEG4c%tqQNEG)TO!OKwRC|! z-WMsGlAXytlKT;~tm=OpoNTx(FkOM^{RcLVS2nvXNqwj+lSfKN$PxZUr1mTsCBY&5 z3_PGE)ZJWU+||qJhqU?HUibpO>UZG=d_+EB6)cV8<PmZad4Y75nDacC5>8WXcHYd* zsxx6o5nP})=_PvDfegWV;=u!`>s!bDGm)wIiP-)T(37LcsiqL&9ROxC4o1%k{N4?+ z9ZxLX;1WqoJ=Or~vmEkCsSNx7Qt+~csIr)-TvZiYq<xKji#;Rp->b^EQh&3DHs7Dl zTO!4pd@X5XazoDs-;co`jcS&C@>cbswX3a;ZIQJ*Olc>ib!4h{5n*;%R)d!v0Uo%Y zltexxODG7Y`JGlydlmc)8%=wCjB%7|K%4YP>IW;-C^-*xP3MSFw+ua{x_vEN0KLe- zRRazC8Ef(a>~34);Jb;EH=y>oFVXHK;weWh5mG)_Q6r_V)Fc)r9>0loTA94kSS;@& zvJ<N<x}|_roz*%DPJ(h$Mv%8}s24v58uBDk>PV)n58rK)PRe`X#$0K2*lt-XTAQhd z<V}_dW?MZ+u(m(O*WOzPwwE3Lsd%|b<^#)k`46S8I!rCAj!=fm{iw+LoeJqP*v94P zqUg@@FZq%(p}l4v?B_t%Z(AbU*<t=1AF7OfsVxlvb)6ZM=6rIIZ&(G>sEVt{-_Ix0 z|1ykb5WP)4kj+a+zO**kh2vDar&zL4<rz!0r-FWr0|R3xhrJz~>?N{H$H>!eLDR=` zKNSmBjEvG+*7JT?SxrkG@Wy?>W^a-v!a7h;+DCp^bmAGo{|A;h`Hj3z`CDCW9cQ&! zYh#D5!>cn<pC7ykdj31#0$&UNoxl!lt8oB6sHO5WWhXpV=c%N8!8`2<Wew@3$o8az zbz&X4!QSLfv!dyL8l8>W#$e;FF$G+;4Dz>{G#n&wYw0>`V_7IIEB_d={+wi{E|b-n zz)Ws}r=ll$owVeCm-0k^V4KS!frBuv%93IENUd;Hp8Obji^<rmjjXJm<Y?A0r;Etr zWFY@_nR$4?>-j~6EjmEnPWm7vNM0%w7x3N{K-gvn0p7%H!TNdwGu0}~4k^F9QXZge z2mN1P8L4EXuH`%FZ*t^IOusS8*rAsovQmnu#8|QwYvD6J3J$+9nWC?}LwU6885Nw% z$%O4-O{&<av*t7NE?fg;(c7lrsOOQ78;g|0*#0F~l7p;j0kTmQm}5J6$X(>5$C7=U zOa87u^EiQgxX38IAX_i`4%VR}ax8JgmAvOQ-ZdI;>;^dCJILl|YWYhe^>t{`H`GGU zA=6ukIUd6*no3sgC$vFeorW^P$yBC_F<Yn{t^^<ENPeEg*nT0Swg^Pp&z3k=%zddc zjJDYokDNlyLK}G@)uC5HFTu<AGuG?%@zc`auWcZ2<1rSR1(5a}%WEoLx=D4U8j@Yw zik-DsX2KlcAny6XOcP22qx3-5$PRS;E_vuP$f7HGskY$zo5C{CpA~$C%vEmk^P=*< z7;_n7Jeyz^SWGVa6j?HXH=IMY@dfOH2aC2GJVPv~0MW}M#1oI95>;>zpC!}!PiSb! z8Cq@5!ir`mOO}yU)B)y=rPS!olfH$~Wgq$?a2~b7n&$vTe~i57PI7QJc)ux(U2rL% z=Gk&$OVZ1$<rw89TsmtNtFlDyAsq`%Gl#;%n^v=F<F(6LUww+P0Z;rL%x~GHY*G%` zn|=j>Ado}9v)|3)<365d9oBg;cWxc(#(T77)lOrs52F`?(Pcf~H-Kfv0#3UN*<b^7 z)ELJ849@P=WclOJ{l1}wurjBC-=a5}&}?KrEm*pCQVDEBJXN#xL81u!n5Y~`WnfN+ z?kr;Fk5D;~fqdpAp70OkDOgnoBCk?XGwecjE*~2895$h>j60gl`c)+F;Xdp6FL-sP zV~1Yh`>dBsDsy0URp5a=#OXe3=z`HmZ>we0?C{FE^iTR@<EnWAZmg!#YB=9kQl)+z zT*WD#wI9p}T^V~Fo^S>pKvAB!K*)pzCU=;XV<FjX(f_Ilvny~6Q_$!&<UJoDjr{Cy z4Z))HBG>F=XIsG9nuJ~*0r}AcjaW?{`Ycr$3)vHA!fPV9OY)+NS+N}Nu`naZ1ivNs zEWFryWOP@P75~+86)Txpa!9ApTPxYhi=ZHe!DRiX<sCL;B-nuCWXD%yPm{R&YFOPf zvwGZcl|6^!vX63v6|#r1ZZ(%1PxJ!%9__d`U+;+LEF(A3yR|2^>NU}=+Q{`T2$62& zV4K6?62mBRk>}4Iu3>J)JHI7++>0D`M{>FO(H|3i8OFN4XYPT)L`Gw-BZd0huM760 z06E}|Nby_r0lq%gOEi{0vs6{;E)8Wqld%$qd8&N)MR(Dsv*^V(^2cBB3=_dQ2*!{m zU`Pt`bJ0~O8}hkqsgKnhEp;MydyY|mVV60K#Lj~<_!s<6Cv+?dA6TWfz8c)U)z!Y# zmB*;3<(?AtAI1<Eak~f41g-@(1_x?GInDI}^IkzJiGNc8&Y-{9x7&f`yhtuOEA#Gx zr{#!wg7eW~IByPMH$&z;ux!1s>jy!P^aDHe2kSW|bRLfLov@NuM^2qst0!Rv+l#GO z%6fQAWzu>$cRTWYZrCJ_Gj}a`io&q3g&6S&bayOkULcP4poMdp``xU@jo6*1<kAOX zTf1Xr*HJk!nf;~<enTzRMQIp~?l6ieXkJ!uH_t$uB~X{%Q$D9`R*S$8dc@jVZ7lz4 znPd922Ep2aS^j$d-hm3*Hhr|Y%hDc8+EN)zP1$*v!B>Ki5OqPnaK;#d9cTv^<}|as zd5&FXhT(@fY80#id!#~gcl_^zaD~x@751{RFevro6#1RmoV|1gEI9e4dpyfTc+*Cc zGoK1`do8S0RaUvrQckMCo^%gX#aNzuDNp|!d#6L1fhNwTN`8jf-0WwrHht!g=+YWk z7cRne)>*D0SCfyi&(;qkOx9tM8h~CDc+NCDIX(qva!t);i??;Pr?(%n7FTylE6kf( z??6$X%Uj+X?YrXt9ISz-a9PT!)KhP&&ESYk2UBu!EbcpIr44AQpI||-nwgDJ`U*}q z-*FzTXGo#k(l&XO(px>Ky46Q`!HF;tUej&*KV&#=={d}D*y^)*v32o(+EQ(mL>=1- ze8zj`_vn0gR&hc6n<;2*e(4iBzk$lLYFM1wpfiTBIv&EIRKUz(c7+LO3ka#E@VA$h zf0qA}JIasoOFpr?ir()M2#i|zOatT})Je7j_5qH=j*O1y*6)<lmT5-4;7VA?Yp3)f z;!)DSDCp6*gq})mlzD1jYkliowT(JN`B5$<N61^~_fXv82%Uy?Ijt5QY!5&5)IghH zvNqZ*B*Bbl_1cEolWaF&bw4f50dufa8xbr_Tx6q0Rt*-?J22(;WwqHr*G<4fp2QwL zo>M?|R(Bf4yMcYZB#6k&?DgZ>6=T@X8=w)#Ox@@W-&SF`$l^@Hq$9WFlJBF1Q<bsG zCr);&sYjf^ef?nd>PS<R^tKQ7%1*26Ink$YY-yAsp~~76U+I+3iIozYC5=w$?(+t# zn2#(4l?>JjwnSSA`zqTC>j}6-7b=ygx{Q{WqW$^x6M?h72Hqb$<2^rnr@<;)-)t<u zwr+6z?CR@&>Z<Mx+P)}LE#nMT%Nl6rpXkpP$QzukU57LJZ*vaVn{GVsOx9jgDoN|X z8!?Kpo?`X3XVr9P&-@0Pxg5Jyp6BfZ%BN7M3(@gqdNsYMeo#MQ<b_?Nj@%53v|P=p z9#!%y*<@AvUAn8>vh{Sfb^jdkDZ=Z%<NRn%4wVm{PH7)6efs0Wi;uUyY)_H`xkH)M zE{<Q_(UC^Pu85}Y9gfDZy^c_Z%eCY^MB>{SgM#IKSyCP(UQW1~kUh!iu>?*VPNlEo zYQ!<>=FRAruyu~JJ(WHg3xc10o#9q}?eTi2`fb5)v?6*tW1cw+3{p#}sr;>yMeVQ7 zfH~qLJqWfFE6gA2&6%M99!n)Gd`7IA0(xqUIgE}3N3>qr5HglubYd=+{&I|(!#czo z0e}BwIQ_C)uiK6}J4U2Lek7anG{STQlo>`F@AmkKAM3yC{kGBji=XEul@7p+XIt-z zkGvkeGrCq((}?}fXnRfTdu0wC6|RH^8@YnJy<L-sBy{?E=gZ}<1rxh@N^3t$ZpX{W zJF#loKhh@0r9{nkt+PH4Jq}LtnJM#<6X784>3!`x8)#45<xj(J!rdh0l`Fyw8c@$z z-&uQGr>L2g4$|$=K(mqYOm`X+jM`L>z5wB+!1OZG{Fa<RJ;5Ct{6mX14!~@kolI3j z>nm$tTWk9$N0h5m#Kx!-(bZz+NB<eo$Pti7>V-TDzt;ZXdGq4+q_<l>?oZh1D;LUO z8{-}veIvF(-00X>(X}EAx*FJjS2M|5LwSuF!F%2g$(<4|e98W~+2;;lS0%Rb{-kG6 zdN}h$uS*k`et7zP>Ffj_gSHk@w4T;iH@Q~g&k63t(Mg+9VttDOS@kn!yk&)4T|EKH z=M~nkuDyjVoppn<Lc+T@Of8+}56;)7=zqXOk&$!ESUjiW=0YRCekvFjY#F>BJg;3e zih;E<)O_}S&c*Ka5oToNnBlSAVvEF1jIQi{X{}&65qOdG=<|&CSKh3BZF$@KWAB9Q zzQyJVYdiO%==*W=()LgLIBsT4gUD~4S*<Q9+UO8?<LQ!=C;rmsm7i{X+WY0NgbOL@ zf)y+UY_r@wVq(%Jq_d`Pp7wT(-#y&+k7a|F=uJ*)nUEts@$0kr{7FSUfB8S_A1rCr zr?#%neXh5zX09ms9&V}m<>4Wlkr_^qIe}jT4TGDtRz_|RhI1vW{0Zxm*>b|{Yjo6C zYs0kX+E#sovCk~V?y!h17#-+}FhnY+G`C8QsuB5PX2xAjGd)d0Ooxa(w!7v-?=N3# zzyJ99_^VH^|NJl^VV>`R*}+=QwLJ1_^!=CtF&CqLjp*en?x+GvBu;J}YN=1~N2SCi z{QLRt$B!SQ$-uSnJkyFPNzUETchaO!|3mu7bgN>&kC<zdrH*<I|HPD`N%s<s#3xDL zq^$Hz_GJxT*Xgn$H?Zb&)NwU&w{rI+3q9J_Rk<AMqpu761%q`5-vxhR?TyjXQWNgk z7RnytH+w=0jT_qRpd2h0bZC?HiRMg8HP~2o%Ch{6T$y;m75jGgzUVq}Nom@oEgiQz z(re#sk^LRxKfYJqI9@G&wd~!CFJ(MgjfH9_SMR7Yv7_UxaiwFPM-FvYa6Yk>R2xd8 z&9Yi2UytM!@m)TT{P^(WtIydJns{pI6O}@)*qCqAc1r(a`WETZ#qEe#XKN*O(hvKJ zrX(Z=66z#2g~xonXOnMnu%B@=)LtHBt?yXi`r<AfF^LSqclKOrU&{u4LZFK84ORbs zZ>2yjy+vrB)LDsAH-pNPqzmR%eT+64WLoQBGdf4CHS1gENmJ$K?7-hyf3yYcH?S0I zV*12oOfxk0L*yNYPihskChMQOy`S)A-)s5Z#ZMiQ{DBeDUi<0@GkR9+fY_2T%c53C zM7Ugbr<zOp#%!zg@<(~*CSLy<`aI?Hyf0-EcBSkH7L;1q-H~%*d!-$pZd=-tadn~! zI?pNx%qM|oo}tOPl9nb$Ce=v3p7O~%GEiK9Vz!jlDmg%Qb#X1DGe`^fQRg@In@VxZ zV?8=}#n;RG*|WpD#-B$!ZFI6sAcl8Zk(7N>T1$6Y6Wa7%@GwWiSk%%ignl+5=9GX( z*o4jme&rWiRoDB-w=rwup2j(1UqxiF_pto#4<_XPH1A!?8{gYEA4evn_Z2f|tHqoZ zBeF+1qBqfBV6ppzGtvI7t(m$=I%5X4ZT_bzr4kE&o&5RE=j&f{Cs}-bjQZ+mSJ&u$ zaTU`hrkNWzB6_K-wsn=Iu|CSb(eo%-O|G7tJH-yu#wg#Tz+nBbnODlFmb0^@BhE%N zjCk%^;3#V?E)_E_1Zw)8d1iYWdmH%kYXxAsSdWji7hd({(yq`sql-RM%c&L9E@)5m zcIN9)B}uRbHH2~D7{6z+9=FeTd!o9;9*&zGw;_6qYq=V4H21cRZ~C$0yYz2QzpMQ@ zZ<5EK!P3RH&=nUsE-FKGr>G=$zID!X_6u;^%(tvI`UXFFt0iBGH$DeG#eKON|2X-_ zKx4}TTmOjLF}u@rN!uz-`Pj3O2OJ}mtf3m(DPMn&mYg%WaPqt4#FPTwtuS&oCMz^k zZfVW$IOSRz@i{_?sN|Y$FQbmItki!DZ1A1%F7oE}UGn$P@|r^}1z=FfsqB`|NKGtv z%)3TI<AHuikJlTLiCAlP;RI3>zxF0R`W?$A`MA2(w!_&YGHuNE*n)ApVm3#lwWpU( z2d^a8`dahT-4DAzSU$H%Sml|gjg<1(k{x?p9{1vikh_|Dh3mF+f@7kskMb_GN^cO@ z<|&X=IeyTW?O(3MXHTBxYh`Rv8aYQrW{jyB`zB^WbeG7CuI<(>(j;@W_SApX+uL(H z<$g*w&nQnhFOF2Ox|wL1q4cs<bGC8kCr>oQRnbwy`cTSl?hdZ>zxSQ;ee!+rKf*ii zLvAapJPlqlryK%5UeG)YCv*cNlabjNXM~JB=5V4uyDYn<bm1t}bg7}DTFcrGxw1w@ z$7G3p6%!Ga-}$#v!@T5ck*I#j{;B@QW}mF_a!QrJW%H?0%>KZU(N&jxqU7%Gy6U{? zXl@UwFQo-$6YZj}MoQ^K{cESMkK=D8E%dh3vP!3H?_H-N=SH83?hrLGqO$9}EhuNS z+%jrt0e>f7S?>T(4G;ZSyg7aS0w?s7p;mGsYf;A(*E#nd_xG;4j%n5|a=_f8)eDsI zdwj+Hx_?vfg&r5WNdvioFlpT9y!VLyBSGUI<Fv8B*aVAk1<reeh)(q81UFs!N;f5e z*Pm`tIaQUmy>PaPoD%&@OuLxJkprCHsE^HG{5_NEe(m~s!KW3UKg5qnDH%}A-f}hT zUR#u7k8`4HuImT#FQ1*;9D{A&D%V3z^*;WgDJ2tqaKmfy&g2)~4O$whzRl)p5V0fj zMdbDf)!or~&vro>AuS2zGR_BY_@jMiJZ8#2DWyHty{G)G^x2`A@>A;v$9vb`?*8tF z&NB8|YBi~VIau2VA9%LFw7>{BR4N*~Oc#uAe$HgqICESf(&dF`!5|O#oaoa*^R-!q zh@Oj%Yonyg^g!q(Z6`;u5*&XndAz#P(K_NDeN1-6T#Nd_bwVu@3i^LZ`t|Fy&r?7B z`MFBMnv~grhGu`cg!PKe33K}uXFk_WIJ~}fWp-Y)4OfUy>7RY+Q!*r$h~M`$YeMbh zVZIW2D=C|;kF$&WLWC0e#l78?-x+DYq;4lme%MF}?(whoUQIcXygs>aN_lUYz!&|1 zr3e=2EI#sd_f`z}R@)`zk)^VkQJ)(;9T*c>1bfP>V6<Mxm}njfZKXQljPy?0Ep;Z& zKY)lyhENYPz3DOyqdqJX<B1hrAx8I+Nd0$I1N>vYg=vOZzMR+Qb+wF|5py-R23Dhz zqno@-&+omS(E97E&wW1M`ucOy6mK4FS!lkTQMKU#+8w2w4_tplbd5Y4G1lG6aZITl zdKfJ3&74#^{@#}^U)LrKO(`14V!o7L+NwH#aAl)k#Vi>9y|D6EvQ1XuCl39iE%opB zv`JQztVzX^Z+T7yt{Qu!+}3;c-Oi;jaBXrnan!MC%5kZ0Xt<F^*Mr%E6XB-nhUc?T zD`FH2Svc*NA<k1)nJo{NhJ%P-z?xl3bbAW<-mm6tB2#^cKD7efKa0p#W#XOzIA)Go zO30d0+@9NAJgRU^sn~2W9V15Co61}D*WTqxwGwWA&GU6yeDkE1o@4&y`k~NHsj;%c zn#Ccz40kbn`KYMFZpl$uX=$DdT=on|^2BG255`9&Sv=?bAN8k}`^q!xDEnQ9=FH|! zbpH-sr?In?eV=k7bVsxM52W-=YMj_N@qLoRn>M)1cy4j2BW$Pa)#!sT5T><poZ<>t z3n`7HfuSOXMe7^r?SBTMdu*VcR@Z16DkHUo&F>n0T;ioFFqXUub%HJNrI{8MzpO;? ziW0YRG4qYcL)<5x<m1^ZgvOhjj0WcNkY<Tf|8=~N*cClB)*V+d=7M{oEnqnttmCPf z)H~rF9UGj9tCAag<NXu09mep`UP-mib)0lRr=QD|*u&8UBDUN2$n}kp{-Y@u6XWCQ z^^h2myuowZpG&`Dp0&uzVQW3dNmu&Feo>vG@<bZ0v-T#+ZgWr2@E%BhmiQ_$G3j>7 zVc)@E0i$}TsZ>;1rzV0OIqPWQ{MDJmxz&ErI#wBGsbKsN9N@3z^LwxRrUVLUcl2M) zMDP^V$%MX<On9!-z-+#Q_~lgU!H$s+Xb;ExMxz=W%uhn2sqsh$^Zt7Jnk5>=%pZwg zHHD9(1o`Jfwmq&}ksqQn$L@$39l6F4Qf`?=0}ju}q(+JU_(}<n$(LsEj`yDop44MP z`Q<0pEza1;C($iprP!rWzqqQ}Eb<a#NFb+oUUEv}vP4VLlcen_H8^cu(j+spv{|j- zSmut3iikcHH7l}!`!9R4QrqG*9tG}sPo)${>6{Xu;_}Y)<pRB1+V~opA!oCmvEOp; zhpp_kbHAe!>}m0GX3JQkt9C1}!Joz7%P$Ak2L{py#btakA6ur#bCon|A9a8luf)qY z=@hpa&0lEb0Qox{KBhcoG1D|&fuCIk*Wv(TogV6hnxGRF;`(dpt5Zr1*`B%HMgAMT zBIZ)`r-(L=TT127+F&|g8qdV!VB+}1;z{M;db;Xa?pqs}r}wd(R8{A}h(Y}R<LLI0 zl54K5pHhXEq?LmAeS3+#EJ)6q+&+0`N=I*1|BT=lBUX0UdN||VMI!4&PK-!&B{`<p z@~Q8nX(5X-l8S{^zPjF;o_8s2J<Gh;{VTN%<`k*4I?;B}Ueqzhalx^Ojz^&HtSgmK zQvT2wT~s-Y@a^(G_Ga;K3(VJU8~2D!MZ#+}Q#nT;Jum&w{**sRcP(?#^|g2>lk_(F zL_LkM(`aXYfQhIy*{SQqZhj|A(+8&Sy_Sj66}cCZDDH}ioCF?aYUEwlXxmNsw@@4{ zAZ6c6&;FE~$*+^krZi1?oO04Lz*jE#jk!er+g8xkBcgufKN0)gubqayhOG=<XOYkg z{g>cS|6K3;l!?iol9nY~J?(rig1gQ1@_zM}t*PUYqmlE3bDcBNnG^h8M(aJfhvkFO zNxSF20ZO&D=f0<$PX(cRNMC7=wrEm6C5`n7yUSO{G^YutRyvzbJ<Z?dYQ2#5DUd1P zq!OkhSgM7=McNKMi+Lv0n%;0;r3IN#FFg5wNt>zUs!o54>E>9ok=em)Zw@ji5|fPP z)v3f=e<7bIIQ-8O$JIk+rAP8N*6xmd?kACdMkPhIia6-VW34535AD!v1^@96@;&s- zPWcL6YFN_or02=sdb0%An$4AywhYc$u2ZfpuGX%v&JE7|&V67JIw?O{h8Wd@BYcli zZY5Pn`jAv3WxTf;=*ZPZy3i-fL3y0I#CG3N+Vu%UV0YJN#|PUc)h#y<J<!W(PXcKJ zOZ>V0r+htp%Y9Xt^YvOf6C8n(-zwXOI=(pG(Ge@R{e^WLsG%h3JIgIlYTjT6I)YsC zJ@n1-UkCGdOz&s@720cQFGa|c$eQ)SOMj?zQ4YwDq$|YmC$S%#G7k~2{MS5bE;r}V zwR4-X(pYP>AeXp{>b@*Wf?CI3*3~Ftd1TYb(Gj}yvrVxk$!jbb%o2K`;9cK*Ps5at zNjnp_B@Ro<lyVq6ZJepFW8|=wu@$n<a6EFpb$##7;C|%%$G+KWRV>)Ht-<>Kk>0;O zYe4gs^D4d_zMTI4fi~gOQk2rfnqsTxDC(TxEa?2xVc4JBmRNhJd6XH_FQExog}woY zzn^cB&*I-tjY%ljLce1y4ON!L%EyQUzqWR^ow8lArLo0>yKOArgPUnOIk6IYYwc}t zDQs)Eg5PQnwNd&cV~II}I<<`Cpg-Z&=96p6RpjDCNq0$&r65`8d1UrF6RF)CdIH1l zewfBq;5)TsS3OOvw6Lv^Bi6Oc74JOim}Gmd-d6U?m85N<$Hrj&PZ0h)I3=x3DWCE@ zWrlYyH6*KH1ifIs4EZcQ<%(*Q?JE41=NvN}H|@u5<*W^rI?|d@Etpep>psmFJRdmi zxBJi1)2mrvLol;`#K=nJUr(ypMw0J)p)Rl%wfzNN>k_fra_Tm@reucfp>q8FFCZtk zXmh}^jnj_8MEX{LV`QQ#wyd-r|L85x>Lh~MOP&E2@!!Pce<Ksshm2@%v#c4%j!}$0 znNcvzDR8T;F#my<EiFuNJy<Uys{1V%ffS;Je@k}yY5XINq#mxnv_bk=x+&$72hppd zrt*V2#Cp*-2MlE|bvIqs>cc?X7yh^QMgzFt3TTgl69PT`%Y0@1E7{xn=|Q@c%`$!@ z+L~<nM$V5lYYQLa1NduOs3*wx7L~_J4~fARqdxWmUH+!%9?hy(CGWiqwzW5U4>G>P z!6&^kYm<>pD;1R$rHJBIUX$gJ_$<-yrW;tn0n!ID`9bn?&B()Ehn05$oYS4mGQ_4Y z8-E!t;+&>gmv}C<FhsX+z=<=HT$M)dq8l0L4rCz~kx#!({%<0&@95AC@+3c)-?M_Q zfma$wR<#y6nS0;@3X-R(O`oj}QcJR+J^0)g7P~HJ)-36JdAG7nO;87_6%+{^av3lP z-KCGjzRQDUY;K-5uIOjAFKFseZKPh<s9}5njW|nJ+0{-mzJ=s-zo+ZPR5F;Y@pUhe zMVZcS(3#66FN44ACHb=BWCqugTkTAK_7wTeEXZ!I*_Y=X3E#GtddBMP3Qqi`jO6_; zk>zenezGs)KSFni08gFBOh>@qT@mhTi*$mlO<iy;E~-uk<4gWd7l;L*nJSUJIRp=Z z=<Og_8G;~A1h>K~GIu8E8;P7~JXv%H=z=m-#Wv<HHM#1-veS}k+z#XnyAe(QmY-A% zSI&waCBws+w2kD!dsAipBiW)0oMiq6adeq;_EWkoT;usRl1G{iK5h&nFF|fz<d-*N z*XL53)t%?dNq#Phc}hz@vn;vY2Ka?dnElqF_OPP0;QLyknji-|fdlA^j<@Eg&G8~f z@=R;NIvk@S`8;~?il>SqUs*0()!UW4+*oYG66Cv;O!ps*?jTY-%7}K*e|QslpI`92 zmr&0?gG_BF@FCe?XLw8Y<Q#~kjUX?^kv|<sZnP^|*Zz!l7CD5qU;;LiDcs3g+s%`l zBn$W$=8_Nme-1_=9z;P5Ip&hwuO9O1$ZQQ_EWNn~A%h>eW|C{$2v_@g&aiJSpXg@y zhR<)fo*}b4X!B{t%-%$Ou3)P0F;f@FWUeH~KY(X1L%usJIKzD442zM=$jjH6kY61B zbqqdKP8j$~k@G0d=OTQr$M{Es6Z(~!>C;r&KP3|)ft4x940i<GF@@Qg&8TK#P2mQo zlgvrW8S>Sq$cF7fR_l0mF+ZCdp2vxds}s*wmTK(mRLN_MPVgY?r8apDn2X6^uKMH2 z3?q9s0A$H`oNI=Yi=WF*zJf7qBj<jRI^9>`FGR15G-OBfV>gPxuTzrQtAWmS#0K;x zkK2#;8ijsML~8TF`0PP4LbG0iHFzGD)n&$cBAo5r!dy-Oo7IRrr9q>=67jhRa$-5i zn2zX>=uKV-i4_DhkPjJU3(GJE-@#oDZc}JnCy)hQ(Xye;{f~@zA$q!*nLdSnJ!8cf z<eKuJ`E^+pUC{aO$tTSOGq3_(T8W-7M4RSge-<Gx@lkv~omn4*#J=UPs`0l4SU*mr zmVmB31)J~>8uS;L{ln<;X7b9*dDl7AUH{15Kc0CThaWT-)XQ43@PgOy67}%!@t0LJ zBL~k~0g2Tk7vG#!`W@QVpLZJpf?+)RKbDWv(Ka})!>Fz!AlFW@2KF+`YZ$fY<1rRV zH)B=jCW|S70er=XE`qe#ioVT*>3$k^bPTA6@r-07GdYMg*a2BJM`F#u;51;()`S_N z7GE{zCw-CkEdF*oI&lfi!Yjt=WNj7y-->95EP67|KFsa_=649IV<6x6=9T_v;|OMa z6d0_b{8aRF?+C9z3$Pni(T=>#tYAxd1?uG{ayt(m=ooXngVAmV_a**|E*QV_?%TMw z^OHUN{3voe2g2(ndMEf<5|~MM7#~#{L}wjzrX{i)#C#58Jj1vK@O`JS)$741h9aej ztdnWsRWhBAqF?(Qz8}x;e#iK#V0AOWEs}^0xXHV1WB-|j%!Y@pR&Q2;=zH>A_;VNZ zu@m2S=ap_;UHRM-xeY_klfYyw1YxiheYn6=zQ?LXGS9_%hkC4xHtZF>7~Np5fk><; zR}Zq-J&;tl@MrO{8<%*c6FSkJ(KSFvN~5{ysP8v;dclxz5xcpU_YuhKWxVG?a9lr! zv2nj4wSBD8Gwc{Qkl5q!T1{dkGEZoSl_L#kpzPRMv0}@DCaJ@|&<qU}9hTaKug>8) z9*E>dBDrbU*g33>Ia~`^6+f|_$FhI)=V_Y2vhWQY9g$dHffKpRjBaP$iGF1h(WOCH z;2y}RJv!G0+(SFQ>cT6%u`)wgsUwiGK>93(?ci7DU$CT{MmO&Bl!>4r9ay^TSeO#v z1FNwHMVGTS$faX=emjLfc4nr#{7-`2_$-(%+we3^(7QTlUK!Sz=&2LI3JD;;*PP%5 zi`(D4({UuVAM3oEcit7&w?Ft^^u;=Z&Rya}cZXH}iX9?}(J1WAqB~4>bh$9IT9SL0 zWA)VpJ0N&VYVf%>^VNvCZq1nbppT=mYtvY%^H{IKzRW?I)37ST(9HJyZh2-RE%+nR zPvu|U?;IoA!Mv`-i<-^)os1kOu!2V-tD#}^$RNCfq3GN9yf%t;EwpYn^S_e6+Kv3q zVbLG*lmhJ|ffPu``pu2KFUDvqFyGa~zCpwAthWfyc}Fy^S9lEzyZs#_?}P-Kfe5L= z@0Y~tWn+wjD^l?9ed6A!w(kb>eGyH+fGmZ7a-NTuc<l<$aSKayAMF!;D&B_CdV-%y z=%A3H;04RUtmNkD3p2Z-*HUq`JXM}mnduhH;{c>L71=GpLa%4n-(uOu&i^wjcsT2% z5x<>-=kqb1JG}Er=4}t!C+zSF<S`rBjb%R@jBnP9wc9zoKYWKy3MSU6{Cqz4dJR6o zZ~WCRR?T7d3bAS)G2i~Mjn2+KTPkd2>LahlXjJMY=C~mm_ASvr(YK~+SpT~5RU52P z6ZD`eGn*>844|GIJa>pSn9M%(2AK%l-&JPnG}i499?L%d3%xsn=AC9oxquX}^E>y^ z)#u3XGdLIx>A671W#Xw*r6zPw@V->x-Kz7R;;MsAHAVZ|Fo(UdiQ~|=S!mxvcDN;6 z^YH|xgwbuCm|=mH$<6p=u%hpot(!dmF=Vj`YcdxZrOIyrtF;d@?1w!ZjNbi#ts9SC zPGzT?i=>xh^EP6Q_A>gvxyKVm91n()6BBct8QWC^?JJE$s-SzR`&|p<B)rpBjI{-F z6dXzQxoV+vHF=&&T;=$i66lBE1kHloaxzYXh@;>mdxKmAv*m5%bTzDjLYk-1f>Yto zXF$DOKof89J5R9dqQ6QKf2$)!2Tz<1Ip$_$1y~uy!y5R_|Flm?v?^CkX82ot_HJQc zVKh>kf$UN*;U7#zJNq#H2K;_8<|HF?6UDs~ncqvy>vmQo(IVtEjFmcukNxqfI%5sL zL$1sC*)VW@b?~B_B3r@vG9ABR3fC;;d5HBRIOfta*Wa)nIx%Mp(f<Q@On>6zoxl?~ zj1RvBM9_LX(p7jZ;~7s&Bq(~6i5^!ja90nI#&1~H#aP*?ykpPsTId<xv&4J;$VfIY zb7!#{sr#$&f(1Wd-muhN*v-t$UsW_qbjvEre3VD)n)2jzkWU?SNOaN@J+NAaceB29 za~i{Fr{kySmLcJ;F#9;&RhJ^9Ody4OgEOor9Y*fQkVqA9+3wISDql*PkEuM`LjBQv zV>CIjZN@XBklBr&>?C?}mpc6=a030zx$6R_l-m{sRM;x%J%~(?bO4m^5ODwF!2Z<* zFMpMHuYm5Qu%i0mIYz-=5WzX+E$H+0L}Ip+pD73m^?NkB2|JVE30Bdzs;u?AXh(W> z#$IF_=djcDVLjL9X<P8QG&|^f_Jep<<9oF00Jdg4^R+o_bB{6OE73R`($9}pHAH(_ zV#U^jUA~O<Z_Uopo0<A*DJ`9ZHGc;kG;4$TTSOPii}FF(ZXUwQ-jvFU=~$BY=*2ps zYO2}M7^-`<v>=``>UXsL+EcBQ{+(V^9|w~`HgmGM5{zg+Fs)ngr?U|=n9uz-$#X!e zW>#t_(aLR@bZp8YIi0)|ruN=a9MQ?P>^WD^%Zp|evk;dLPK0?zAEPf_X-5&EvQjN{ zjMI8s{ILi${SqhDHbinxlFK>)ws$ieI170t4@k-5JXLvofD72v9#m|YoLbMA8;Fa~ zFb8tp?oJ1)@yPwK`5vrvA7pe18TI2-7e~L)Ch*QLqPyfX=_3_A26yi(<pjxSA<wjl zenP*|b66EU80c8kOdc=amJi93;TT#E!&D8T1dH)1#?hT~BNU{|L1n+wzSDanuWni% zZLwBLH>rI4VzeQWu-%M9*T-54qb(<Rzg+Z(+CsmEFY*VP6~34MB<s-<T-#A(Q~^Z$ z1?JxkgH)x^Yx4<J1BXDW);3d&KatfvBfZ&%O20ZpaYhim8h|~jfX6fryRaR+UR&ub zk)X@q&Rc^Tu1VjnqLNFx$-d<R`M-mGXD*V+7J7!9W^#vdNNYM@O){5(X+1-JDKjyW zCHMsCS!HuM{ko;R;2dX%rGHI&L9Zp7{FW+*4#YMpa_{rx8qaX{+{F72madS+Sjc;3 zV8yio={Q%~#Tsk@3wZ%7_hl^1dpP|M(?RI9{zR{0{0v7)dRUr<k$2Bb&bAzpo2k?Q zj%1~D$0AJQ>=sYO+-aVzA32h|V0xdT4Lg~;sc6G)>MW`fMcT|+YAUP0Jr*_rk6<iM zQI!l)Mv(On=|*<K+y^gxkiJh<SbIO<D;{IVkkOxxXoNUBjKY$w;s0i=+9=jt73_~4 zZ562Y^VqUQ?As%_rlGw9!xr@i{NLZ$30`99y{v=M+-W72@(fn;4?aHQbe=$7@-m~p z!|QvfklBonJB%HW!hP;8c2t2fKL@u{S}B063rj_?B-My4Eg-6Nj$NQ5o>2qNZBOvI z3lN<dM%4R9kfn7%>OKN>IfMSDirK(yi6zTpHpX(TGVPop{=lzT#&f=fZSN;47^1<P zzoxhGb4#Suki75!VpeYHA9^Xgr(1vwdixlsJJIF01XnK3Ot*RFKCG->_%5@;r;=vG z2<l=zXW}*QX1`v^n9k#AN&J3syfqcCNDZIc%CI-N$;OI~rlK#R=p^|ZnUgKVf{EQw zunUVbmEi6z&u%Qbp^6T}-y+4~cn?#UgC<zU>g+<|eA1n<)ngxs<<9xJ(s2K@%(dVX z7c9(~*bT;D?G}V%54-W$_7W|53X1+V7HTN>5a-2C>=+q9r?2EGda^5aW-ly^ecos; zLH{qBZ;7A<L5IH~$5euS>I9?xz%w3XKYPbXz5?SZgjT#@g?u2-o*Qo~d)OCz!&7Br z48lXJ!ZQ_MKWxQp3!kwG5>4Ihg%?~IuR?I7XCR7ElxHu5&N|pN1RrY-zRM8SI;cs) zaW(^=<0iZEUHlE<VL!mXIL1CL&Zk#-^&VF30{*b*()$8WFTmdg;FOiou#DjoLt#cz ziT$!V`$-dahNfYkQuvkik!VHqwm4UQ=1_2Ri_@}%)?4^&Wt3L*)XC`5hrK@$IcUsG zbl|Cagiql^@l*QooFdX!le-l|9x?oFGUL7z9_t=_v^8PRLsX58V{MM*<2a-{mQ%!Z ztoKi>q-A)|;xx7$uRuKAaXhMXJo%%rCo1$vurfy>JJB;!)a_Jb^ukl>7(O|4WCR_U z-}d3Ne`Dsk3Zp5@{1gg%6ludNPUxM6KbDAQe#D;>Y_=bnN%8d;UK2dp;^T+#YvQNx zSwU}^d%@8zK7R=R|G-Z~^wW<9Q}BwMY&>;3<}Nd{D$W==kyk#(T9EfI%vFS|Q22jA zUKd_YPF9NOmMOGX@Z3jphe)*A&b@5mJKDn*NM%06KZ(}_?{w-viJ1}H&f*pEb1?=h zAH`?{E3WuX{9NW|f^k`}^XaUX0HcoQS-<cE@9-&};(tHj65Sy0aDKXmCvhXJaku$C z^?HbfdlEiXJwwM{AqgReFRb4LyjuWCSZXmkpdvg$EP5;$zB6-W;&UdhEJ#JLAEygH zZQAf>(al4!`$uz$KC02okc*Yz<a0#$b@9DmlohWDZd>vEsZS%GlMpx3*ZC-}RH>MZ zL$KcqE?n_Zj7O|2!Cx#s$MRL`yGHRI;=V%KLc;&uQUBjP#hnfA8{*EX^5x6090mKX zm<1tI@s;3)P92RHo0tjly%>{VC)dN5fs_Q#sNixImydZ6U9SWGyTrWs!(WT9#0nO_ zC2U*jmHM6diMYf(iu)RjNW702tB}Kg;}x%_{!bl|7**;&G3L~#`A?s$=!m#%NW#sP zDr=#6V%>{NNJ!|J`oAX=cM{M0-#<&(TBJ%URaU98`R^TtG*adJ-{(}FO_igNpZKXY zEKBiGXs-AT@m1<iQ>854KXvS>f06o83Cmo(m(T(6^Z!1EzvPwwR)m<B|7J^k{eO4) zzu!z9=YRJ|eLwNqf0r1O7@xSrnirB0AOG(X_A>Q5@q4Mykoq^NQvC0IQ|CdvQ|er$ z>Kl-}@Rh1HsdJmENx}cUo~lv7|F0WD$HXQ6PW&wOZvW|m_}f$+5Fb;2Cf+kub5dVP z{b+=LFT`EMztr_4#+WKUq3J@l;^Y6#fw-s8E%8zOO{xy0ewX@6>Z@Wj;`dTVBi{c% znWoP0f0`h^OP&4Huf#_&W5S9F8H%5Zuf+dU{SY%MzD}K=)VqrBQb(FPTJhK76)`Wu z{tG#2tYpETp8C6d$?M`f@w=&iC7$>{jsL&<|0fag7ys$Xf7VspS?4*$>;K(1^@)WZ ziT4((M!^!M;S&9?-?9IQ_l;p}QAkJ3VKQDt99AoY4G`T@Tv*ds=F5Y<NMKJDwpZh9 z<l=8c^hB_Nix`ctn4*V#>deaFr*(7JINn+GxK7VcP5xG#Aw~X9*rWLH-sj_^*y%oF z(>;70U`#>YLF`Ti*tzm>7ttx|E5HAOcM}#$bm6cuGGX0?-y$rMlW~g9KQ?l)31QnN zc-zHzKC#P)9wLdnYVy2dHpCo+IFE@A6_LDym@%0Qj9_yYt1FTxuyS{WDn`-K+e77* zpRX)fB+=D9JziHRJZ?XqquFcX7{wQMDe+DT{JvNXLV{nAYBolh8xJQ<SQ;7e3u@qp z<>bAeaw-wgifi~8kN8~?brs!FY)H5WBN80zB4Q}|Gshqg6S>*&ApKOK3%^(N>J}a5 zMSjIi6h`bSufucum}*Rs9dYxnUSd+QWFd5X)hO;<kmnZO!WZslMHWJyUS{_(5s`~X zDFIgI$&69-YB<d3bbg+ls96jWdWt`~mEWm?x6={NP1uSTNJ8N^#N89%_TP(-DE!r& zcuL>kcSQ1cA|mxKzg09GJ+2Ub_lJ0o=aG_#9SF};=%6^8i0D*t?kD<b2!FvqV<Px2 z1sRF_rHHl)zu`7>E7p!e6`zP-$~;w`@cl*SbkXJ7js)z?jh&f{#BaXLD8BMHnUKv> z#&d>P$vr%)ugEhCQWR0u%Sb|W!YYdoCuTi~h~x+KE1Elsc@g&YJ<lgrL4G`F(G$qU zOgK1Wh`gfkU>+dZ5dZ&0mT#HY020iPH<*vP%+6?%;Ib%$580N}SY>86Ti9pMz>Et{ ze-oLw!udeq!#=?~dJ}ra$VB&_^vr|cLl=E`M1D^&DMazy1$aedlUs2b-^HobN)G=O zXS*Yu|E`j;ea)-XrgHz|<a!npduvG^Ho%$V7Wk8+#8YOOzko-%&e@|FF@~C)RqK-X znZgL1__E#cw0o258bL(vFY1o}B`>#?Oi2&C;95M31ZUE5vdjzdtEX~a>q8``JdwVh zMB8prS1B?X6~a&1oQUjmOGRqa>w)5k=A5~ZySL@kwSb?DWgc!3U2Vqsc`TY{K{^$9 zt`Hu%h_a?9>-7iko?x+qIa^4?;em9UK6Ue?uAE(q5$CZ=zw+CyLYJu*tzbG)s>jA= zqm^L+0dZN6GDaHvjdzBFZgERE=hsDF3-i9Oh|AQaN1p;0%rYwSh7y&EfJtUMcOC@t zVmD)7A1VoF&Ch0QGpG5Ad;VawF?vzwwbOVC>rr<i7&$pbq$SgJk-Fh*QgiAwj}o;A zN&?lgfHQ9hw817$EVY^A6`TSqgg%+i;0?G($L%j*OdFHe5WUF~i79VH$7CYdji}$e zBVCfdlP(c)A7q&=eUO97W3?yj)7#XbGE@l?>1ss}$|U)X)Wrgqy5Z1EXcvPUgFglb z2BU*B0=)y{0&4;%1O4F!Tc_VQ>_inGSo%vT(lR-Naz@#&{%S35D`9(V&1J2s&Q=V0 zg<K9Ss7)#t?iFpL=6#PgNvo(m4xSDs1{-K&v=gvb?g2^i(%5azqMzszslR*=c9}fN z80EO)S4yZQ=+-!e7*iU#y0nE;=xP`=8o(%LflYOhK41S0PVBNoJ+B!>h?KdIT^*u% zX_?g=be3EyzmlKJ^QgV9B-`cR=(czqL{KT|K9QDVM0MAOMo<ZRMD{74sKL8R=g|Sm z8CYN1!uxUo))dt;(mbS3(iYRXbPV-f2Lgv+g{mC<fexmlz%b=ETAOg>OLgdu`38jF zNZ5B;t6kN0YArP<7@_+}^MYj&%yB2_hMCuR1TJW?UPb=^2f|hDhSox_1>ebUW><PE zj3jOoK~!TMwc@9#%N(tYqf4h%DJ%a9Q^eoQTT^Cy1a;k&c>W~1e4e4w;~V0=c|Z_O zpf|k_%*%Evk4?)sNtVBtSIM*F?sA;`M7kkulzt+P<&u8qjCqcn^(FIxxro1MMz{GR zblUuEEoa|pKVnzxk+w<d3Z<)3Mwuelk~)Rb8p*+@{-(a}-m>21-sYhG{_yt+lnkZ> zbLzht{Xz=NSiRMMtO46)dy;*yeUojM^`iPhaVkaSGE!d4DVPlBYjHupf0lo<KSSU} z;P2ozZ92%Y6Xsu_zGqNhlv{DA^VP?y-Fi#yq#jZ35TT2c2C&EM0Uy52%m_oJ#dxC! z;BXs4yeOWvSBtKq6N$B^C)y`*lAca%r~sIz(IA=nQpYaSLGdhE#MMM$+hD^JiTCt@ z2O>ZCkb7ntPVF<XPNT8Ghb_zHpREh2>TT_caxZlCa1OL*u~t^Bay24<pUmI%8bOPH zo9A6}w&cdi$CG_2Hs4$SWsq~{%!-!R(!a`ftK0sKqlYt+4$iAwe>ye$LhCJ=PVDAl zy{MKkSSC==U)OirTi+Y)UFh}tb_D*=5)7N=XQ`NSU#(^vWl!g5;BY#&+RNDw+nly& z>sI&^*ICY)2lYU3Y2c`Trr+<c1s|^z+yu^kt8N-~>C4eg%1*ReQL-!f!u?dQQ3aer z47dcnMRek}3y4IvHDgSL4)R&4H^@iSJ1rLZ68sOMzI-8d2Pd%b@1!Q+8!J&4m*n0` z-R~NAC#TC^Sv@ATv$PI9GMehcf{T1vJT;TwC&nh;N^F{ZJH_gI9hjn@G$%{HDwSb? z+~N4!S=*&kOXH_bAhYwNZNIYD(%pC#v<1$?#ktJe0%p;Ro&?V*?`&V^z)UUCpe{+a zT2I)5_JHG8=Ue9yu$9m3wQZYKO|B?C2(>eB>gTiwZDi0LycpONxD)t3m{m*G0x%QC zu+ke!iEu%6keh-T><gB3CXwk3a#!gW{2NQCE7AE&#yR5+T++vlg>dW)!fuyghbqfX zxZYBg=x!Ey3|69z90j9TMd`Y<0$$9?Hj8t%YrOj}cMn$q$IsRp%04VuEi(u|{efWS zzyohBPx_SN$pw-trR?);_e~AvH`;|3OXHP8>Llx8TP=D6EJYjUI3r+VYh~M{BwK2l zN8yBj?|1wE^qr@p`)WGvw)KDZR|_80Ivd49O{5}<Y~5!&Y%dS*<Q;ow`*d4BYajJ{ zSmv@zl4YE^1GdHuursa+*3mv`EA@WH2ctLLGDqSoH2@da2&~<8c&j=PiG4|Ss|CCJ z1Ta7E*_#iLL+D380mame`-W!JBnJE3tVy&gL@&S{#BHaOpGZpuQdx2x52f;QJE~Lr zV1b)if3lx;G<W)(O`U`6$E_9VhaD06U@X$V)iP;=gKhnny{0FN=X}Zy&wcM@UrL~+ zu9{JnW^{Azua325vW?+jKHI*^-p?LwuV_1^8uDM3Hf9(7EqtI;0%HTM0!jXySl7dW z`oU=Gw%_X0sE<8C{pD`;Cu=?1UfT{^G2001YV`^>X*|pj`K3ITh)`xQrElQXS)<Q{ zIXGEwWt_qij)4U%JJGr~*n~Xn`X%u!CSzHD!qXI9PY!%IgPie5e3O4+OdkdEa0Kz_ z-(ey82fVQk$K82QsR@=GFnSat$1((T>IS)oQr)`K{=M@%S5<c{_h_fzzQa~oog_84 z6c3ev#pAOU8$9V-=Pl{En!F`BU&`7PuV<*gPw=4LETp1ky_GTQCpFgA+^*Z_IjT6b zIEy<P*!O_P&M9@Ek|qh>uZh780SQLY_5L~jCD_V${(XT*!QOgTv##a7)DGUU<JKBT zW0S2NY-|70hdIXDRUNLhkkd;ROA^{%g8KJX<hz>cBlW3zUA>szUZ1Bw*83Y7dBXbm zz{f0A$oFlM?n)l%3y9nF@;!W$B5;FE!s~Au+Jmn%+vtu@GS4^w`+5;_QM;*QX^W+t zLVoj^rL~kvF0NeQdHUKqIf^^exk^wUXmbv8479&i-^%e)K1&g^H%tzVg1h~5d@nqn z6xFjnrGLuzo<F>2e93{~u-3<fE?OQ)L*)BP1M3ItO`Fxx)&U2e<CML!&C5(@l@AlY z|IKV_jL|<)x4Af&D>y80!@t-6-aiN*WP|oXFJ(@lBgZ0Xv~0?Q6h$3Dhvyh;XKNm~ zC6=hwsNOZP46~%8oIz@Y{x++b-x-JDV!EO=&`N5JwD#Iut)PBepK27wXI)629mBE^ zHm3vfdHDvO!(Dj_{@Zlv3I6FF5I8T`F@-h#OuoXxYRXT(q6AU*I{1H`Egh+tU9YsZ zzO{X|2OV>q>EK(H9ZzhHt<}`Z3Y>fR{zvKPp;IXx7pUf6?mOh|=w0W1=AG<&=}#AY z8%)v+eYdg7yaW&77U{m6pqx>6S--W_;<#|nTGzS|-k1r>DtRA!<8<QFL)gWWjcUeR z{f)MU9NtgxofgL{sBb(mYMD#Pg|#Ao5(NrG#)H@+6_@AAPvlZc4J9w=<<ocwx#jg_ zRaSGt+CrXp8Tjg{Fg_;GyW7<B!W@{F++6|oS8}T40k+~V=O#DShK!Yg@BRx>^H3NE zB+#Ri$r#T7@Aw0FkyhXiBgkmZ;56C{oaYRw4EX8v>Thao>pkmb>jZ0CYe3Dbj;1=d z8mxAa(r~)(T*1>;jEeeBP1QOD3kA~zEy13_WccTwYxDF7tas2DOOCW3j1RwoeZDJI zg`;n=yc1u05H>uWd>AjMKltX7<nKOEQ__!9)gSnIHP{Va!DW&_KJq@E@-cI(xrwvN zHuEYqD2*9?Su$HLa*lnt>f`^P#h-7*c~bP&6aAa}a1Se3)8gc?8iFHQ!bw7OyDLR@ zYcctRD)?_BIf;pAS_J2qYvi7War&4|#$Y5lw}oU-myor&%+7O~Q)ezRI@{QNsc*!$ zA1{BDzfl%}FwdptfGOmIG78E3z}cZ9+M9`P#jmj6uZ<s#dWK)$tdG!JvdZhjWB;4} zOfP4AZ~SI_H7c1yIX_gu2lj?qGdt(7Vrj^JegmgpCeCs<LAfr%8ydiqRpZnt>|us* zBq9?ZWzOAiIBh=XB&&o^s3M~8;u7%<5p|B{{QQb1+t2B5Ju*9u|GWYW&UsE}qKB*K ziYOu!B7QCq$s#jTiVRp0A{`I-yW2zt_LBKu#F=a_^4Lve;1ar($SL$CaSrhwah!tl zlkMpM24@*r$MoPIy3oD*Aa$>K@yn;lf3P$CB`*L0;Kz>DmToi45p*h=3`3Zg=U<FP zFHN@jAo@F&ocs^Q7;=oO@BqG0d)1$Fssk3n35?(#C&L1qqdFjydF&9=IrsJ_7t;ax zw8r1=&1rXN7;z}jg&oL?Rp9I`o-YQuW#?IQhM!j@x+D4kiXMz2VlQHBB910{7Qg4z z{fJ0|$bh})ImL-vWaQq3&*T4+{}SCOMV96ragkSiet|U4kUu(rRe2naD<l#hiQ)b7 zab_2hwn$`@mGgQ!K2|65yP26yre359y1NQ2fLF>uZ9)n1{yOK{4cPleFbX|Jo;8`{ z_25-Ap-=nCR5v0An+W^qVfqrCCVQPgcD@!F+D&)|=|Hy*U<I!s6MLGOyU&P4>`g=! zc{om(0+$xYm;^UpU39-SxhsKz>xNzE^FLIsKx_^~<N9;;<@N6TydA$=j}=pzzZ3{L z5h)X$1x38@JyN($yg*=FkMPbrnWw!-;|yAM70KLV93n#Y3OT*zw?86z4-p=bF%+?5 z5xW#|OcBAfF&9FAMIIoQj8%1JbRnpV*VwTlL=L)AC9;ql{5}|Tw&Dx+pyI(U{R^^s zE;y2+%<4JTZ8z*#Y$yfa;0jeqd)Y^K^6`jyj@pX*<XIC0YY<5EY~iy-VJt)$G_fXo zX%|pm<H@?O1z-0kPxY2{Df%dv1o_jRu?%C+or(2Wfw#7m*vcQ|*pG4@1mW>JKFcpe zGXxLUKt|IT-OGct{|^a#5s92;1?^`Y?M6<!k=7yNC+9f#3)Jr|EX_UQJ^~4sDyevM zRAg*KtX<5Xh_MP}tH>**N29Z#W7(Mz5g95#9<)3f-v#}e$q2XOIb0=X^T`r~Sv89D zRW!2F$-Q5PIdKgbuL0y{i*v7dR{E|m*IXygSEaxyMPYrDVH<l*CCp1ce&VER1G%4t zvsekFRRy%ZsBRd@s+>#QW)t!{L458ht3~I0mYMiX8T`1W$e}O$kihOQ!ao1ZxR(A8 znKz!?`EbV2lT%G&^t>!qCl{787K<z*(MhZ^kpq2!G@fDQgq?ei7QI1-L|j*N;!Vvy ziL8joyt&Xzkz;dm2a%)sFQbu~dl0{y8VwhHHsg4wf~<ljSdAf^ITw(zKLp<DHn@dX z=-UfeNw2YE?gG;^kBFB*?3d!N0*vK6^R}9OViZV)MnrRpqDL8!PE@!;BnD>XOh_s# zo_s-cs}$$qI#h_HN=wu?>?WRh4I3l+4eQt(k>?gYE}O8<1V`KVNM-_>HVJ&mBu;&! zuxb6-wL0_jZ$V}Vgnl_@J0I30j^`G!YLQ(QQDl)Z7MI8{f92I=)>;5L;cj9DQZq-X zxg-($7V<E#f<d%Q<OW5=-$$HT{1^E?kwH;;hZwx@BD`x8#xM+2^h)q}$H6+>q(bQ~ zGP?v$Z!ari6*hSc>!dlFn3uWmGG8}{;ca16js^?e9(mOUWmJwjhceWBlp$JJp0!t% zSL>jA4OxS2kyKwY^>f%2x3fM3Uhg4KBy6gK=M{aCi?Oz9A`4MVFc5hOH2xU&gdg~N zNLW_gIXwt$bYtvRb@sKA%ytg!udrMqAMZiGzA^(Z(J#@7^<P%q)Bj!1c=avv`^<Za zzO14{xv-rk@(`IEkr@?|^0GQTTq$8G3$%cU<67Bub6|@qvKG6c;WMxbzq1zq28(kW z<kC&PI*z^A#Cn*@SX&cwFUpD$osM5%F%P04^YKGO1w(5jB5;$Hkx(_Pdwo2g=J;x@ zL4tJvo!<iwZYZ*v#$T*N%6qZ8*Larqj3|iR7bx1S=t&7Qy*9FFi52V4{0w9k2cuPk z*@^pt|Lei4UHF-hSR?eSI{GE>8Cm&zJ25P8Si9aZo6orZMNUFq|DwZUr+m!UkCCB} z+Gj4&M^|)q7cxo-%gFmbd5Kq2H7ixGM2GDX=v6c3aTGRu18eX+QhLNHe1vY@4kMZN zu?A-`;?79441W<F&JEpR6>Y`#%w!$*Ll(`ERc)+zZ7Mt(5=m}L)I`)~b!I>4PDHv7 zzcmEUZUV@nrQjG3pjo$glF!Vr$cJS{V~cbDYDg-zf<ee>C>kZSYAEZnKUP5OhHcQi zhUisoJf(_w;sPBc@*qOD#9B-UTP`6hAt8aEd4OHN&2=3+FR(M``G1kG|Jxsh#TV%D zx6GVayQwH9k+}+mvpCsUeHEFPmdw>i*4SE*U8jgQ-^Sm%|35jMMRpsI;Yen)C99(Z z7S2v4<25_WF?Jil**^vubN~k`YGJCPS2d7U-SEn*i)J+gA1Z1WIwP(AAVw#%C#(*y z!Snb+sqD>B<ljWk_Yz1-)T9Xfzd+UZKsEzedqS&HW!01U>Of4RS=eILKvtroWnrY8 zgOLf0vxK)LR^eOp>Nz?j@F4eir(5B@P+;yau``}$fBcKj0^^)2uYZy3JN5v<=qZrS zsrF4+_4H^*>9A$!jvVG=(~n}C?vr_V&A#^z%l?e-E)zf8%uhv4kyw4j7>^BG^^A8o z1`2c)2q9tHn<Ja5*r#$_;$sCYRV7}j!|vA*OV*TZim+DwiSbS)yCUlRPBO=@7?TZ4 zm6N9}#mXb<g@4)^9q)%0iCU8}T%z)647w#Mh(slVs2>s-qH4^vK!X=Tt8%i#i%#nj z`8tt{{lL9NMZ!H~bc1)g!gU$>oM!hufzNe>>o68XTt^toU;I>56AAxI__9gJN_f06 z%wj%fux41J#<3^w0Bd~{>Aa^_6T%<7(@$Ut?{Xs9N&VqubiZ9#QUXU7MEZBR_d&81 z3s_HmS!a#WrLts7Qmgq26R|CheHRsL^~0;NMOd%;qE!>wIhTjm-zCPCh)*LjxFyh! z21uaY|1@bRmQ&dDamXq48i%|_@#+wy*ppS*n%yW>THl~oqPuTq?7JH~YGH()uyuci z?|BDFi8Xf)kM0!SmhjW}VJZLk|JPn#ImS;;Vi7L0N*^Mvuh=P(_Z4`ya;&_z%+eIR zrv2#CLo#a~PUvoYsz|aW8i>pL$Zs2R9M4*)$J2=J>po`dAKv!>PrH!k9)JuQW5-Ky zBF!GIg-nB=Dk>pGjbsUQtSXw-lr`81<h-b}`VmXDi4kAHl89=^SZ1vv_ZKxcy|LV4 z?-SZ2D(HkZjS9;vRj-DlS*aGQBeUEnY^}b*j^x8uWyFSxdRjj^CC)F88K<yKqQdV8 z^SVD=U-BF8y^(7j*DC(6<=W2r*v)SoN1E5LYcE)b8hOj?*uh%N-ViMHZ$$AQkd0K~ zu+I$cxd53oIKYToBq6&$@e`IX>Nd={z#&?QdOqg8kMnK|Sa-efm1?6qc|)1;r=S(# zvQk|fiL5eGeOnMMD~<iC1D<aIyW|8UJDHREcJ{s->^51sZ*yj0ApU^xoce^%FYWj& zyu3y1$79jw_1K1;d?(H~Js5WdBqHjP{^g0Dvu5sKg`LQ%Bx|u8Ygp8ultvda;$O;G zuRMGeLS{42@N}VgnBI>Pqqu4&o3YHU7@zQu`!mMPXj26|-$d9Go=G$1>dF^oI2Gw< z)p>N0-KpdzLV7~F#od~N3Oz~%_*m-apTR&9(1+^D+BR*Gc0hZpRVH#!h*<DSa}fQ? zf5D190AHVt{K-n`Ja>K%3%r99WM(-88haY&rLD}$ZmfD*&O(pqxiJ*Hu7ikCQINcK z&1PmFvYJ-*&nUF#7}ct>l!d=44I((B<U`L_v)Wo9ft)<^8zKnb(!Jv^a(0WrZg()t zai6MGtnY*sBr7vE3jgCW_9Z*(@GCmI0a*?u_Bc;YQKnlz+u|Je95tN-owc10=sUIA zCR@8Gccjjiw4s}1+5BMGn+692Hv2F5g5HMSd!8NS9rk+f`z8lEX|;`9p?j9T@($&M zI*d4~ZiPI9k7;Z<ZMo=6aoAeG+CVJ_f5k8Ks=jT|B?Y$Gzll}P58MjW3~mjo+PB&U zEtcx{0>&|8pjn=d$W54yzlqUqqF+rNTW;HFYdPz9br+1K3FM+OSZaW_zhLAuX6moC zX4=Exyx^4J!C<WR3%wQn`ZeQ_xs<F-A}H~F<f6CJr=u77+7^85!wJ4WF`R#q;Ymw6 za(j7{^Xhb4Nyi7L;o9lG<n9Mk$419YTS4`pR3}u!7^7tm76|n72YlUqU%l<TXFN?j z@hKNm+@8IjH{Ol@y}<;%9V|lImCn{*ZQboh?U(F}?YUrW=x%e{PFV+A(^%)JA;qC2 zOKXwoG~(0Sg7X4T{6G2^_#gXQ1kAv)V0|qShLes&Lywq)k$??Uy+{6{TvBIP<7rNQ z%G%C)O#MuU00W#hRjKIVH^xEY((qhp)wNt&8EueuMr)<N);AkH%~Gt9>oA;Y#9+(H zG4gG&_X}W^&Mv(NjeZqB<ws%|yDT+e)=aC6Q*T&X*$+5gI8V5;yVJSLx-L6RV#m+r zbC$=Z&6uX;CC)m}U()~Dx6W7IcgH*5JD7;;0dFf`c7K(?oS;iTV~h&9q(1U;WwNST z>sh;5n^=olGgv>7i#$mTd5~IwSacud1#$AaQd7FhPcg64Md~G4+<N+5xGb`0PlJDw zBcB?a9XuAyMc1q?`Xb{`^HS(9%VBAy+*<iZDX)G5PxE=Drt%Pei;vPWA~hPee<q&s zJK`(#h+Cb9=OPXF-ejydw$u6a4YAJ5tgN45Mr*}xoD4_KB=W<*NDJkC<lD~J>N*ZO z_qfKmeOzPR^IV@CH*9~aHRRSjeVlPgTTQ>8d2m!M^40NW^qut<@UHi4^Sttm_xAQR z@lOi)gN4c8whAq<knK?d$^rE}+!pWEFKSimWb4n?gVq_=BGxGDQ}t&xms&-sD4(Q9 z$vfjJR-`Z5@QIvFu|RdQa^-_hgEh3@G>g7dA8iaaJB5nkBaM^t$d~2*<dDj$jnyiu zLp`kw0ra+1ZbS{lPN}JMoSp3-PG&9P^`2|S!`baHUg=&vi;)%HsI^7__KX5pf~Rz0 zPfHh+HSotbQVX$8f486de>9y1oRsDF_UDP|nQgke6a;B0rBq5nT0&B3P*Os=yFofc zx&`TwPC*F?X_oDseDeK1{QmD}Kg90NJahMb&ULPHF4sKwK%%WvQ3dMep5gL2i`m~v zABtbw(y6vOS{tVRpyX7lMw>;Xh&$XT)G2f)cq8~Am>%388WbK7NsfL*4DCPN25To` zyDn@L^GTbe8uBl4UN{kZ?RG~cM}9|&y@&k<i0tQ5Uva1~&9;&1Y$2*FJ|&7^s3)oD zTAR2{MIs41R6*+t7h$yCp6c6neE(rWUMfp|NF0A5^=%GFOQbodWqc_)r8DAWPS%6q zvgf!Be#iE^W_(Kj*Xu3xl6pXU%?LC=m*`hk!XqekUobjbP#y{!t+15Z+PZT>pB7ii zxgAfO58dxP$=(jWbngW3anBTYch?k06}gT05JdDk@xJr=Flv{cSLQ^wN5bJLq0fW8 z13R;QfzJa612NRN=^u$x3aj5~i}X3hk9aN@ZPTbz5|57OVR?<cfnzJmm$x0;9F0*W znkLVYej*;S#`Y^!$-gjW>u<CsR0QdOs>5bwsj?Hjte@Ed+qL8RN#lgMks5w6^i`$` z)IBL)PLNgUDYcxx;AGhY!W~B}!vvp9=eECq#dpH^20St+RZmXqtKdrrdM;hkz4{Xv zH`&@7?FW?4U+YUi;6CGq-eSuqt&|@){O+!vy1pj<Sbr1$QQs6s;jXiveWQE;-JXZG zao9;KjBfg1ZJDwqIw&$RWD7b2vDrhjKMWiWR1f*XA4FzFKVuBC)C8?N$og&VDra#& zQ{#qMAZ5w@?Dy<W$G`T4_6)hcJPm$GdGRs(Ft5;ssL*3_z?$i>8Pry4U-g8VuFlZL zqqZ~=#C8iY*%x5@A@J(F(o|`?6qa(+`+4w0D#}l!kEC&^3$>>@`ClM^^YDOjV8f(g zBV7WUeM&yxQT+q`Cj6Lhh+<dd#@$VPGHlcX1uBaL)fpdtE*U(HxmCZ#C+SE<)9TVu z>R(oNxShS7D^MuPc6N0hcl={tBM+1>QoY(mO}>)CII0gFG!Ez<{d+A9z4gB$YIsOE zUwByPT<A^cFTjZ3LgCP=@Z@kL+$o|*h7hH;>6?tG`L(c0Y%ev2D|1TzSN?%&XFtjf zVd-QOy*MG2r!L?v;wZa?AwmsXf_aX%eu#Z^3<S^z*0vfut{px}wrzz_kI4H1*gm4P zOu8*ymv%Ek<)vq2mHk5<p!(#kO~K;ZjAd8YR^6OuG&at#AJX7|An(rUZ~-;7#V~%B z8UeE7LYx#4vZP8-4a6{p;#<ksQcgyy0a<9(_%2F5%ohBa*4TC{uuwbUr%i|b@Rw~D z`{~^KJLe;D1I(>KME@!iAB&N)#RJkr;$^j@OJWnTgU}By&sJ{nu+|TyvF^mFRx91n zf>fjDqh2LO5tL7r`AT)F99>dxYXxcNNaD&pU^+Gx77$@qggVk-sjt)=UQbD>l~fHS zvK&NUXOK5H0y}FSOtA=FQ%-XD0@&N-gn!8wJR~F%RlOu6uv?bGU@E}Bqq!F?g`m2^ zS*%Zsm1pG|ZQ_pHjF-O{3u`*@+Awkd`mCh}#vQ#WT(vCXg2RYmntGUXsz0oujc{mQ zqMOwdkD&%A?Vr?E%8y_1!We{o{s$bdemqsR6(%;;3~s>*cw`5NF{DxPPZMg0skBgp zb8?Xg%}Fek{^00+g&klAS6P+E$%?6iLd#@sw`b&fE!M}vf=bXU>xqnEK34Zi{jok? zufg{}=&SYav}8ST_!sbVj$wNjgts#S&!q(Vdrx3(wIoXT6#dizLSf-4%&iY#HZ_H1 zW`o^zQ<x)s3vX(mR8IPZs=m$1W_=1Cn-h(ij$j)fkd-zU3w{`A*;wHxZsJ-*N$v}> zu$OgE!2D0o#ckW0_+kP0T20`~d<|<xr1sQVcH#j26Yi%gXvR;}%j>7~$#Csr%#!3! zZYR?8K%ZvZG@HXZ`GPf0Jd-<a3(T{6XwJ>E-@!Hy%b!VOQ5kte#Bwc+z5_4?*D#tU zo<y9jj`;=oo^~*mOU4_muC`x2hlN=~Ye1DmH}yfwfW36V2Yf|7?;Nu|%*<AT0Gn$& zBb3Ly1HWS{ap_iQV@!n|Hw13n1?{zd3p%%5FJx(E!18K{wo^Z`o8*IQwOBS~yId3{ zlG$>8d5o9<lkyF`kAlQNI<td+Mi=8lL7^&-WV^)OqY*Q!4hyRonVe<KcC6-sSfj); zja*poXN=q+`BPvaPD6>Lo9Q!pP`Ng@9;<g^Zzj{Odc1d{G2h&2Jko2x+_9Ny#!GS| zHxZw#OBC;oFkS4<*|byKD`pFq#q-2LKap<I))?xCHKX=@Yhtx2tc;`POgMn2+53Z0 zW3}qYtuvn(_1V)m!8GO(h55ofWn0Wz7)oZaPb@~Z>lSvx0P1u7gN~u3&!nDiQGAKR z_?9QZy?jC;o4_jl8ce1goRDwvzshj7w&Lul$TL&%PuCNLSc<2onWt@M*@sWy1T17t z{V7ZkGf{9%lG=z3*x@V1HDVOyv0k9B-8hrG;#sf2&prvlQja*tVD7F9RDLZEtKw_J zf&Vnb2%#*KOzh){QJFC;k5+tX<9k>SkF<#X&NvR6`5NnD82FUM5VnCHyaW+!V#~w5 z@f^RZGLf5__yu+GIJemDa|b9`i1VdA;yIz8P@YvXmNEVvPjxoFYhx6BZkXFS1Nwtd z6tW${51wu;XYEV$ayY!)e?i7?gK;F<Ch+Gbx#)*cf->;>x8tuB1WP`_4b_(Yc@dn- zPUZgEupxFCzna_0(Ohd=57Xi*(Xnx6T~Pe9pjMCZYd*Fe0XMx1(=i6Cuc(0L93EZB zfT_bSttOyB!VFFTcisZ(_y;R|AS-qXKVJ=(w;uO>7Z8FhP@^CD$*<-bFq(3p82zl= zfATa#c*TCOkvNocQbFSm^ScfxnXF?yj0dw?#~Iuh6^wY>R_v{w;M@s($}v#RhIp6~ zY|wjn`ypzS{>@MCf?g-0pID36RRh1fLL9Fl$dsQmQKg+*K)423$OQR+=U6p+&AvqH z8e$WC4L<iDXht>Au<p!#J4Sd67({JQ2}=)XD;A&5xE2Rbwow~*1mn8{CNu0sR$6O5 z<0GtqoJ1uHb6yR$O$MDm!I`uG1Zg(-V{!2FuH0q^Ve-8;Ccsn*a!ceB+S!_+^6~&* zp)4NKr}&Kq{`OpIWi^D6aSN5du8drQ?HgY87dvnw-nE|<@dx+o1CZ>F%;^PA+-<Nm z4iZ5aXTCIQv+g{!uQw-uDl2*|Sm6Q?n*cT0?(n&@Kx1zao4P}tf%1I9Ci1?&;Iy5} zm=9)^WmBVi6h9fx8VJ(+M(nbuFdr<u<T|~z!9=y<;qz%<UT~=W?5K`J?l!Xf?r`R} zBsN+D^vwXZ{fYLiWo3R3^3<9c>tlLAy86KiPv?EJK{mf-O~!(i2z+;h5%`X}39GRj zW??zcKn<r1NQB9(45y~xPn_Pp`HZu+@j@0}Cdx48cQAR5z~i}r0?d4H(rWm6|1zE+ z`iy~Jm}$%84Eq4QqBCQ(h`NHG+iICpjn{f*b1+=(+F~JbINZBc<`P)rla2LeF`~*F zg@d+2W^QiY9fp^6z6iy~i*Qn|!&F-YbLdOFk8im1bJ+5lh1iv!ac-Oj<=BaK#J70f zec4;T8;Q1$gu>zmPAb`~K!kpy@d>k+W~<5F<+rs5d;fvm+><!ROV-~6^C_&BS**&- z%$7Bhl|UTJ@b@sHM%~~9`~o-j6We*vxu4iujljkf*rNB0<=AL9u$s0QojG-jv5Mm1 zpvN$hf3upCsN#ANhQ%vmDfI-mG0SB^ras2@s1BNW(AEg{O<UmxRs96;$jjyh>hyhR z`_Pn(4e$zH8O?~hR}zBQHGP@em*#!&oki$Q6%bDGx(%$31K1>&jE>acI>72_4vzFS zRiYbX+s1MmjpO`U%z0Oe8}k+Dy&FX33S7=_*@1rIFprq4R^XP!K~M&BKd#}<EKCGt zHwg0!UiHH0Xq+~hajL6E9`@*bEUjaVA}<w=^X$X$W!8d7e-EqW2B>K)%9PiQT448o zo2|jtzX8?%+x!X?W*G==I(WweaMLoJDCO9XW4H-3@qO2#!uU1gU4YX@=Y7xN$Zw$n zL2h9Kn5M_pkGdTPsb28FD9pLg9P8!|H+)Y{%2MzR(}@mGVE^|8^RU~ha#P;HehV9o z!Ni_&YkXubw6()pTtS@u6?;jfn!q2dx;5C^i9Bs0>tHGv;(ta?Mt2T7VLJQe0q1x{ z@W<(>*L??<yef0#VwTskzMpc6-@x9<!Sh<Nf|Bt?ej+9{$~Kr<2x~!Z)=<g1K3ch# zj5h4QN30?;xM=?Xvmvi92Lq=IcG_@o#45rw?7;T6+-4qQnLdcBB<r}};;FrG0?f8O zC!@&8F$Y`rIM&%H^B*kt`cx$O!M4OGsPETyYQyz;#(1ho-eN~}$6~pNJyIQ|s#iiy z?1KtIqHU0Q3Y(%ZcV!RbqCSoa73IN`Yn!+6#16w8T_vQzwk#&C5Sq}7`?foHm@RD2 zjm`Qy?YXu>4;ZIWvK@_GkclmGh!z#$c3RG<x!g8G=q0WbzY^csJ~x*cv$&(Xp?ukl zRn`yA*#_q2KM;#w!C=SR*0a0MkT2B*&O*qxNNg-s79X2y^$3c7ALv_+FF>mnnn89| zBlx*7*f?SFftVspVi%1E^=^+JUsyaVoHoDFf7I@4m5jsex$Y?8_Ay%PC-uS9j-85! zR7M;q9A)Jc;S~CYQB1UL!S-2<jk1ntUJGu-{nR`878c4`?!b|@^3=EJjpdWhEw~?4 zKQH#uaL&p_*kBQT5ByfEBH?64Y!JR#DeQ&;AnZSaRumP#hgmq7`R07G^~3k7N45WJ z>NlF*aN3>=CBz}N4aPxmsqf5BIinQnn6?u_?5{%jp3}tE;!)dV<16a@9#(4@du%(! z-^D&8O-|LX8Lvr?`(7$0Znj-9PU&}zw!&QL7iq9?O+N<*^K<=6R>?iq+B>5Ydd&CD zLgFn@qEz-=CQ*fedDr$I_SHyR4{kK8V(7=lP@@+0UQgN*&4ys*Q)xp{*5-D45ac{~ zhi=4oLRVW6GubEtrf*fk+s7$+fVjW`PJ;}p<?bO0e2_?PZgiN&zgO{#rT4u#(=&{g ztiWp2^{uY=F&=Z@&%yd`$<B=D7VU>R-wa_8H}*wyn{B8N!q0h#1-=jOX@}7ov?hsj z_aVC}Oh!;%&bL8i$<(IOYd+x%ZnrdQo%Y1n$S?+TPab8b6w_PkU5p@DWQ_2c?LM*g zPlU;07EIJHP&q!xIs7X~!mqXhMk8`wu2FHhysbY<(Az+uPwGjwG@+AdN2jKyG1}&q zu26qmCwt`>`~D4>`D4x=)2NA>ayR`Oto4pYDm(L#{!V|&?wpF<vWl;QWU4HqYD{iv zI2F5JviF|Z_Hq(uuo|-UH|k{duC|K%sTgbeHMvIF#y&G(%c5t)uvEJ7j&WkTxEs{v z5cY!=rCfp6{+nJ-zpOn46WMK8wWY%3Q|&RXo0Wu)tnDb=z7M&Vf5MYogc4jq;Rv^L z31%dWUFp`Js-?8e`lm#5b>=M}v4<ySN3`$SNVUb2tlK6;DQ45Vt(-tEEZ0=5QptRY zr&)yYy^5alZoMU1!twmBA4-kW1c@Cq51YNbpnx5G30^%=td6pMSzgrx%xpDr+28ee zZKqmCe{L=pmf1#7bGQsv>L;k0#<1Qi3(4F^ON87Yxy1!)Q(#X{V4Pp#mE-}v8cP;j zKmBhl#u!4omk@LFb5Ez?Kg-+$jaWHVZNHGElg6od2qt}9V>@U1Vpfw?K{BuTiyo(+ zFv#JcYI7fMiZkX%czf6QgkgO4EYpRD{tR8SrNU2UePg=eMG-U8aDg?wwf$)XwKaN0 zTXE{`qD>06dWQR|9)90x@l(N#dP;8mryiisf0~EUG&k6Z&B5Hyn$?UQ`Xv-)Y6>s8 zbro)-`q-|htcxL`jV)+=!1yd-9Jdo4&cxfg!YbO!YUs#qS`r(1I$qKiY_I=pW2i~| z3~P8Y&$$G%;G)fq_wfX4d=PhILvu5giSKYG7BSBl`LMdJ`@AZim{s3O63&D4&Y@b5 zPZ$7e+o}oqfH^;jXJ<DD;%W4v#tCd#?3Ba!1mm#`S7Xu41rKRPlxY!`K?tjEH{8Bh zo25v<6r8M*xt7ynIyIF#QCa303g0EUiMDcj<`o1{A?lidCEpTu+kJLSSv;n1P^w-E zC-`?*2FduWmr-e0itV5<4wc|%HO3lul2bK?-Te|~*LB|e7>nROF~RCsyLCBrcXJ!( z1}DuhB6z{iVN_-rxnM12uv(sQ3--dcod^<EnOS`S`qvH{D1lvL#StHXnT*8a?Zi2j ziOpTv)UjB<#y)>*>&glD8J2U{+`;<qi(OQQ8{h{#kypeB+_s@)Eq0@ZPE+FZ4Y7aD zg29}{4hh@7#Sh#;Wbohjn&EHp85`hRP9v(g4X>;U{(RJE$9szs@6OE%*$7YKA}6Pp zn{NbGMjoLYR!1+^#u4^gAv~uhcy&H3iDB%!H6Tdo>|IM?7F|W|mL=RjKVxV1VpLV$ zHI+#7XN*rQmXU&$l%G+b$nANT?6;5EKl_NeTD+D=%uIc5t|GMP6x@gUJfRo<XD!eU z1FJENk5dpPSpWuu#o_yxxO^I~v$Db!R@8p#MD1WT?!b#Zi&xtN%d$CM#t|45L)oom ziTQp2qd>+N+5xZnD=fErMmaufjcuJ!3x)fNVkfbJR9wC#XUj+APvmRT$I@gh^1q2f zd?S2md%;e3vYM(IC&?>%sSm^h+R4s8h%GXL+x9C~UO_mvUBQmJqibFfr0cHsIg!7| zs-mjuZuLj1p#Q_^Rv)zIOEOrFYsJV0{n+^4tSx!~2CkyBvc=KBdB7d?R`n0}|Kp3G zOw+-&-#$e?AU~0xN^aqp{+I~dXzf!qcXU(uPWVmqin>yDD9<A`qKlNXY8UMvZH<v2 zd<n{R9QI6a;iXtWTFe=8#%RKcN~W$_HM%tNLo}x{FWNPd9BvfZ6{#M%9=;bo6cH7l zI)!@XMf7QAKsxAJ;ydE^`Mtgm{9R)!#Gi?;8UG@#V_fOjioR_wpJNi4O7Y@kbBN|v zKT-cwCn`UMrvxr%KMEd;Y>1{tDnxcf+9?y%UaC!v(?A?p$7$@8e1a(XWLesP2e!y8 zOO9e=bF@~942@q^QC%2qAGuHTu7CJ^=zefWP!3HD|3^*!jA$dRx-i3;&o|Yt_{#dn z$A;o>CX`QT7VnAwGJbws(U`j4L#}+z%l5TW5nDg)qVm1kgm_(^s4r9@I63rHq+ujy zczftXxTvyC-K)+ezo3g@Rs4GdlJT$UBqMRB_=VsFGbjVj@{KuCZ>;&Xr^GsnE8)mz zk!Rse;auTbp+~{fAvsbdszeoKtlmesWdGhh(EGdZO3anGXuL1M6MrFgK}<9MTyJ0Z zGBVq)6HyF^D{V(n2X|9be~s!_PDFl*%!?k0o+h{SE2X2FU+bj(qPcWGC%{qgzo%F* z*Vy|@IWI2ZmslJaABf>xZr18lY%8wzP+mqGNB@j8jcf=H2)_<5i71hZ(K_S~xy^xM zfBSFF+ny}{>e%yfm*b|#R*Ko_OZJR(IUO_PhvHDG=lz1Muo$1^DmygBJf-i^9QrYB zz1mUTM8{@o^{^Li=wETBtYDY=xp$5eu{@8*F&l4mg%Je{9cTFvXngF@W!<5TR+E(# zN^NC)bW-GPxMSpTWPIf3NX}?&<&-Aa&WroxPn}2HMZCj&&wYu$5#EPrZ?$mUa*VdW zKvi(2G+)dTo}#V(y*O4}49@ultVbC5)S+Lex6yq@5aigxj=$ri8w10^VGP77E{_Ei z2Bl3T@3D|^L;sB|rfF2?OVC$pNm>{6xH3(VmH22Q)F>W@i$|(P21nwf<CK@$UQ-hH zO5^M;ov&P8&w5W6&vW-L?)L8AT`!$G9Y@fsZ9rD*S*epW7Nv@u;C%y$>ih6wYT4GY z*RO-#>g18VCW5<BzpcBCYwY}=xjFtrR~GM|@ypcn8~2DFSJl(8+v;oU)ST*Rr8r+7 zqpQ#|dOFfC@>|3k-4ku1M3jkIihh%om;-)?ZZGJ(?AqWShK|Q@_Z_$7x#miCZgu=; z|H9GS{sFqE#iVXhQ>ig=f(B&2%mC@GXj^QqG-O)#DY299`PAN6vy=5&#NfkZ2o*H) zp}-wuH03PQ^$tWH9b`wX(+X*8)vwfFP&<4b{WqE#9TMF_)PHcq6@3xSM~2=<+5$b< zTp^qn2gv`~7dcD1pSkmUqV57HjTHBcaPK4v-`p|5G1i_gx0WwRm!!7RO|cPKnVYe) z7l3p)&05sRD@#mbgzhJ@_m~LR0@^kRuV=pg1g)Gc`V0R3i}|ZWCeki#f;L=J$QJLc z{-aDL-f}$}L}M$5ay43(2=vKl7o`^YPgPJ{*l)xLe~G!sN51VS=DO$Z?b+p7;wk4j zj0#FqcYD+<i#X~#y4kbk4908?v4T5b^&N=36eVJHixIP-E4z%D^XQYb(|qOB`%&Sq z3ZvIoze5WbU^!1FTG5)_w?kV_HqHeUABs}O=7ib}EsviVxl_?6QJb<nT8NXcN>oy= zDZ|v7+F0FgmK6F+*W?0@#m)<^LY}(h65jQ!@T~L9_w09XaWzGUYnr2$qn>@c`~mq< zdF5HsAL14GAGL)KZ54>4pgc<+Yo@lJXmefif39htg0p9l4cbNTh&P-{eFBXZ?WLCE z$69l8gt`*dticF2(cY+M)OzZlN*CoubOfi38O^0!iSCZN;Vsml-s5C_qEX0JQY<H* zw@-8YLOyg0&lIo6*VS9Z>-B!@H9g<EySfTHdpI&24#xws+~*L}>@IZ>`+(L~g8y}k z6QF=zo=@9DggjRJ8*ayD?YfpjKcHRI>gztD0x4P_ZH%@A{?U(G5v@P%97FzQSFNR1 zK)b}v*hamf^io`m;m)WYouK4W`>9jaQRK=u*I^uCMb5Lm6*`eOIK*LhwkFeVyyuA5 z>#OJWcoV$UykltP$FA9qE{?^Hw)QP@3Hb+UisYAMu_WGCXDpWGhN5303x7KE)|NZ@ zwpvE3LOXY8iP`{dgyusFbCOz)*&N2_R#ffe3icz~e}TG~tN6)Wbsf>((&|g)B41CH zs`y4l=;I~g5eu<UAL7^9h=8rK6~x0&5zjN<S5S@ixx0CWde3;zdFy)Hcn^EGcviSq zyX?;29Qz#+dq?|X;>$0{aaF}6F}JY9HUvzP946Q@i#UmEs;Bt0a%wKrjmN8v)CT0= zW)W>{rPNb0*bleKrd>{kbP4J;{0b+<R642CQCzvDo>!l#Z`FUPgxZj-P*q#5*W*TU zbDnks@9K?Giivju7A~}qn%fhd>s&A0mAwW0-^C=y43Amr-|zdI`7iC6?CR}2=BVn} zO++hIS}7$+e}iY_LCrd%CDX!&N<WnTCPbSnXO#bx+z{PAQ8Sc2%17+eU!!ZHUq)X? zr09ZZX=S2vLD@lViMh%Q{;s4vj~<I|Cx)6wnWMB-`)jLpAJ*)65XkFPXXr%Cv@+V+ zeW?jiOx`DH#2e>R4RjWflas<>d5LSex4l0uCe`04rdn)K?%S6BPkkG`<Gg=+S9=$G zqOJmtB4SHa7n>`)Xjh8zOLSS}RQQ8%ukfSrj_{!HNO)3zhVw=|s9DVnEeie|2nGD1 zIpHKuzdF%b(QlL!YGpm1nEdy||H=^EXbMu_2k)mHHYPk$aHDi0+1;gaQhs9NJ?yg_ zZ_qxTZXYNYB-iqQSX~@rTWPf7ZWN3wwrqK;tEI2G|FzffeCFxlyA{(q?nK<rv4-zE zkJp(@H2s~pTpVRvqxV&pM1O(1aUq;LBn8_Be+}8fg~Me-a|2bf*Jq8*J|0*asuwO3 zniQCyy({o-xVExN9jdNVepBA4)AV9si+*AV6HF22U?O?UU8RdCn`er@lh0h&@!IYo zue6z?iBodLyRJKrIWru?9VgMq>E-;>G0WaS>VmD_*_;VZ_njeXOO&Qmz^JVZSGsCv zP1U}|bI0?}S>JxbzQO&cFL#XLf9PxCed<gWpV~T$A$f${+B_c_8EO-WD379TLW8qM zW^W622?YWbviD|<$X**b5oi`X5o#Z)8@U+_Wj70!Q#Ki+%$-;eW3=8znym~K4bF)3 zrB9?Esm<G4UgUV__|-mEDlKi3&pURJE&PYPNd8G)BX_f(v$u5=a|n(Ou(;CgXW%eh zkgrQe#j@fyF-`0!Y&KKTKNq#zWXcv$Hbxgmr$w%YC4~r$eVprx<A^w3cqlJ-zwzz$ z+kGe9G0uDvwSR;zax?pIVT`gYm=f3+>8TD?YKCtHCx$wQ3xpSh>WBUaJqmvoIT^kf z-Wa{hO@1r<cNiPkTr4a#2Vn^f)PF$Du@l*;v%z;S<8f^grjr|AO`e5i{z%MeuT7tN z%iHAj_75G8?8oh2b9Zi+pUEHF7t@y~vL=n9c5fT0qMRZc!UPciQlR6FiCSln`*}rk zVz2c84Z5$+hWE80`kOLM?Wk2J0-WD$ApA@gaYwr*&#`xK)Nv)d%DQ@xhyO|(fY0|i z@u@t<el=ILX?SCJPb4n-Pozg=Zn#r;W2Cq;PCbrNd4@j2xL_8c*2Htx_!+Sdy1@Zz z#+;>sbOH$65aN&X%~8h3dV5;(7n%5@VR9|fzR_-KS$biRx5C`|eTZ1*6i<l*q|4Ip z(njgLv>C=#qU@BvlBR)jW(W_dcC!kf)bgK;*_Pt*d+}>WfE=vHA1w%mW2u0I$hu7; zVtUscgKhpH6>WY8oBs@S?jG@@&UoI3$Z#pbsvSxEZzJ5&%lK&9^?)7+vnU5Bz<&lA zYtkzD4{160+F)szy_K`Nvz$Fk3W0#G2E*6}rdP~-tPMlcdH{aZTQ#b*SMK3=6jnQE z@!YjVv6uWrGyB1jZb#It0?7AU_?q>EYQ$W>f(P-1a2F5%5BNuK%>`JmZHX~fBieEl z4E-29jiz|!?K#6r5I6gq=<Gc_R2QE1L)&@I<y=_2pTCcr?ZAJnMJ;Yi`=&qtzX{em zlN`E4u!Vad5)<&|XMi=IC1P*!MHdK_z|yu+^`;yVscGVW;%I6*gt?D~aoVo}BN+~U zKL>1RH!;zJRGY0%{PYfZ$^}q@Q^dB;6QTTt_=pv84#Q<D0v^%Nd~Mt}1~LPS&1+x; zJB>}o_b`(B;-kcK5`IJUEs-b3<AE2nZdu~$xrG&Y?PHkDBw~?A!Pm=^wQkj(x9Z2g zB$o1$nXOLrY8X-FvH0c{Oo5rJf`^gB92O$VP!@c)JuLPgh-!=l2cm8VUi?cUsXiiK zP2gs`z&Ji(CD(_c-Iyq{6)Btvj<<`IQy2D6C!zx(cFQ90-fuvDrW0>Ygvs(bc-$*n zJhN4fYTO?YL)lDpHI9|koiW)){N^TW>^Q5p7(e-*nAHdnj}M8@Oy_fp5r6K^|F^+( zz65^$f;pW5K0Fz2d@2a@U_N&oxkLAftF1OJ<00iDRyG)1*uhv_V2ye4AMR2WS^>2_ z$orgN+vUuhpu;M@#7*$3Z?KY&8EM2iYJ+vfgHN`G&C-N%JObu439RSl`y7^gAT*!A z#n(YNX0W2po5f+{Phw=tvv*Fw2f9I9Ch=Myt(ySC^ccSPSXSg=yzo^*A+R>lW~q>D zB{E)*RazOW)lW3~7$aAXv8~Rh&f`;;61!bZYqt}l|Cl(z2;TD$glIqQ>xEz1j+s1X ze*6CE0ywtG|NkcUV?N_`A1rw!xB8dFU~{knPccJb(8=$4au?eHW@-Z*Vk?6!1nxJB z-@YKCG=oUnQpV;At8oDFx&Jt8PSeg|@HLjfPZ|f-QV6DdSK`m3iP~Gb1D$DIfH_XW zroTvpq!eF%+uyABsjRA;AjFs9s#K$|TVa1T1+9)_4YlX=_(G^E93c`df!_T<?~C&8 ze#GGh!Ckn@NLaPpL?Yqo?BbQ6V-7|k8{}&r=aL4ZlEiu+O$#h#rv*H3C0<wtueu9T z*@G5OppS#u%>zIIKZ6I+5Dv<6&VnhlyAc(iA2U0j(VlZ4Rwh1mUEa5xc@)XCS^!E{ z5Jtfb&b!6L3;ThtEg-@bXFJ8nb|t>KpB<G<45$xzR3EU{tbDC{?2s%*G9SpnkBsVU zFpdKFtY<;#{Ct)Il353o?h@xmb(@u2&;w?MRVD2LyoCgIePz}_Yu4H$dR`ya!%#jq zkvxp!?7*w+4NGZ6=X~gBHU$aJ&#L){ar42$*vObPC9XP(c%l_iOkwu@tjx!>(*--M zGHjNeAR9S&x=b8vH0OAGPMo=*cGM7I7XG2NQ&?LU=|K*dQr+31mNHO&J~2#G_avv( zedb{^JAN#$3$xz7Vzw={h4S=dHK$Lr_v2wzn5@l+Kj(E$cqnb*9Q?~XI*AY8<KHUm z2gO!`UbQ59>mkoB!RTbY&$Ri06KE>0HtB73_?c7KQ{NI18cqZvhTasVt@mhQQzEQZ z4&fF~{DGY0t%>&LA&2M;Y{Puq1ue<)*u_YF^FF`p4y!#6yW$*Ci^|OBZm`|I$dLLL zG<OC&_8kcHC}!adeQQqqZWO5JT+Z-T^rtra)kRw_+3It$7qE@MD;mq}?!n62#M#%7 zJuw*;_BL8E^gR-PiajxxnOn%Hlx8oiVhxsKe%o^buj0Mm5?}7jeu$d=*|9fRjdzKr zH{jIV%&0q=mDlgH%L}rXf23bly-kUoT$43pWr^<MdE3CM*O8^tmwkQ`EP5z2HjLFh zjPYqeKGPGT#cR1C_JP@^V+GacTr1D&wv@iU=NZ+QA1^y*4(EprhC&B+<tXm0KCGt0 z?7)KN$E>g*yp;94zc{}w$?jbRy1Wx^z$i}WPnn&)#AlB%r<T^*ZARoNyRrZ~_dX+Y zkyD}v5qqoN<Qd`$3jaPZ%dk3|u~$-=kp-;6EY=gaIrl|PqK}U_;ntBSlx%e19lObZ zX~EdOU{6?zc4t^MCpoiva3&st7torMZ8<xw4i?&Y_R&iE_X+obm1Ug4?zC>kb+BCe z^Y0G!z%E8Dl@^+e;2K8Ks&8<Er@KJ2-xBvM$;r@+_ZHz#eK<+a;4N8o!X51T<2=u* zPkI}?z6^Wl0{bR_b!1grHHe26B+9Xc+aMqJVgttYBTnHQe9}{@jrQQAO=48nahqP_ zlkPC4Q^3aKX!&mTQGn5V#{CyI%X31n;l5e%9=CUK6SU{li^GoH#ENUn*B<UB2eZ0} zcbdcpW^p$4Vm?MOa}&82uQHNTxuJAcS1x*DF-8PF`#knVG4|^JlnQdQI|97F3g?2A z7iD8ce4q-snU7cOgI%1!GViu5!Ai_w4o=?xI8UrN!anAtB`dH!96mR!vLK2XSK!*+ z!8VB@DzOjd&JH5xmbPIBPGT#=atX8IfI0gs)>bOxt~1ts`EE1&{xpoJ7bqFWkipPS z{zrZz4Yg|JNK54J?0?8Rh10f>kSb0h8u-$dLRFQBF-6Ox1@u1LL@V^ZRD)^+U;Q_t zt<A_7XitrvMaFMtE^~*`ja~T{Z7**8ql-41_)w?-tMiJn!_0u=QkEN`Cl>54#Pr@7 zE6ijVGe4P0V44OI>GQ0X&F|5?-e7ls>0V+Gb>Ki82OZn3^`J&&J?a59!apr-o)D58 zeOwObcxj1v*1jI?@0IS|@@V;{W1n-beXkf4&&Vh3n(&kQZS;s%pHnQN4N-PShb!Z$ z$#_~@ub0uAgY^B#?yN&qsrF_8Ece&854DGCE!!(H8eZAl+@&KpD=NYysY`sxOO>)j zS|b}{*bO#wx_+PMWWZSc(P*M~(y!_vBHhcdrmtxS^etMN8mkr3UDWowXRHuAy83%d zxK>m7QFQh9&5dd9{n?>AZn$0U1@`9BZFv#c*ym>bNV~}I`b=9Xqmc44Tqc|tsUPj3 z{Gj#L>uIs-7_BqeX-%n&CJU)@H<{f<QIK)+eaELV%5~-g+bChTtv36&2V7+s<SICY zR^6Cot~TDO6_oFlX6j*T3~K66>RB~b^(aT84pqX(I!P6(-?cbnhWV59)ZM{9%e&1{ zRbKCU9MdwPUhGZRX;%y1W#50!f>Nwp!&ThfLP!ip0)}#)e6&ZAQNh&UoN&GHlhD>k z0T85{N*sApDwy0ceTT5mKH7f3HdsGpJL)L!+9Y3x>(Ub?@l;!0<GHy*`cPhPeyvK% zkLq|Mzj;oZtsEo|?RK;~i1E-!ooFJp6@~EL(6^ECpvG&prOe=A+g|4@Z*5Oa=Xi(R z`)B+wNgWeDj_K~-8(TiEm%o(TbpGNV>e=8(H`XdYYm4E`EmX^eE@vMOtP55QE(v^x ze_l1aQ(#o^THtAR$zYXemX@r&Rr)JC^yA`Yc{AA0LV2z8D{^m6JAY;Fe)D(r)p6B# zWIBqves^A#w+Tm$s(L=HYjk9&TA)_;)~v&sE7NDDO-w73p=5lSk(u!zt8FM#&yYqr zM8`|YwPg4{O`4LsaLyu$*+~O)mdfc#RN|&497-CH*vz|G*lYHb-q`C(=QMY?OJGs< zmsx8wPN&z-_$s4!dZRSu-HYT#sSPqG2gil~4Q>kvp<QZz*bGidm6kiExX-$4yKj4( zF$3fOj$a>J%NO!=^o{l#-sLV`{#jgSn`lf|nuLl5+XS{{z0SCnIwPfL>Xy_2sh3l3 zrYuSC8!B#&lpNwM&dz@Jg0Z)9T*@&s;Y32$9Nrvv;!DNlP28EYYOZ&&9=WmEOv>;2 z&9zHP(3?jFhQfipS!r4A0{sJPvaY7*OD*xPN6Lka%s{JfY-m*0v8+gVtFFVSJ|nb{ z8&E56slBuFt#@+V@%V3JgWiuke|qowYx~c5MmV3zKZvLVX?>!xk(=Rjp~=~`GD@eN zN`0O7CcRa<Kdnt#a)uW2n!}}0(gD<gw%RZHT#5IS1|{ZC+MnZ6;_%pqzI(CzlXm4i z5Vu)grJpcI+8a4@$&HPP(I=s@f%=&nGM;Ds9SjA(%xaw4Hu=uG!x>kDKSo}KzYXpQ zJPgO^M{VE3tg2z(<lOA)?!4;!%9|d$G~q^EAzvZ)M$b?F9li&yW&m7^sdF|(O$jv) zv<dVMw9Im*Z%!+j5z6S48A*4imCC3YI1#?5wiLpS>+WK%m1H0m_pi?}KaZNLLXNyi zn-db^2KmqW+r-~a>>9VtK2#f})YDtRX82d_5WblGEMsSCyA)qq^URUiSF(<z>nR_n zPRqC+SQ~k*^i-Ru3$&SL3#p=`sZ$}swB9?<x5D?vcP?ggoIk!?Od-#Iu1t4bPloeT zX{Aw4tEkqE{vEuMbtbcPX1(<Gsd-Z7r>3WO%3PFrJEKkJ{j3VXcFG`et!H^`*;ppq zec!t@p-k@8c^Bksn6FLlB?*FWm#ew=acs}{Bi;?d0i|E$-^j&C%di$~9K4YIMMiwe z?6-%Lzf8NEku&pMdhPVR8B?<JhMz^>5TA7!hXldV#=YOO-P6t6+n2}R)_=->Fm`rA zv!vhRJ9^)Ovj5;ra_zJKV{4|3k6s9Unq4-daJrbWGowIy+PkllN2Od&pO6*Gt{P|? zd=)vOEjRX?L&THLj{fNh&K!l3-Xv^JJd#v7$EX}Pa+J!sAxHVdK{1zIz3eZEArBK5 z7_*cDkt(6@vR7veN?Vwkkh&nnco&<pIkkOy>5QQnJ2FcLDue>zKFV1=Dx}MPhu<;X zS;AW^=5EZunE5diV%x>FjB6FM+Lz^P?~i&Py3Wa_u*nuM9;=Cwj={m%`!YAAFH9Yp zQZ=P_%I1`>Qv0XXOrM-_D$}3cA&@8ZR|Fj1@n`I&93SUem!oddyri8uGjp}dy)f^& z{73Td$$dP&kuR5Lq{rhPDDBn_GAuhrp9k$(yVGJ)KX~`un@z9AzkZfHFzvgHju~~+ z8>D}q;mXbtUaFSobYCaca9neZ_b&H&{1anZ#GQ{j75iE2q_}(u-zDydFXr#;&ZJK5 zNU50ZA8lK7Lilu`X6C3gZ)%RzODX%`jYuw*>`U2~wj(o~T`5#JT3P$WY))m+u1>)- z*&Fn3^KFkA8{a<1!Q3VD6wCcrj++Tp;@Za8VsiO^_O5bQbes@po1*?mDIWPU_%L%; z+TE0MDVtJfr1eQ(mR=?OpR~DY)6zF)9t`{wZlEmGW*L9kno2$FtDRZy-@Ge)zx(p~ z+r*^Dj)|KcTPDWs_xn;jU%IP0x7&Y`yNcaRr#3hm4lfPe4BW`9ldh$fPd$;+KV?$N z<JA4>KV(+PO3%6(C=vcL`cMg~|LM=f@}8@4b8{@r{a@Zi`KJ~*mw#v;Gv~>iKj++* z6pGvIf8(9%UFlKnr_IsI<<Q0KJQ;;klizhtF;bFJdL^HJ`)BgPlyj+_(@LZ-%xILg zoV~kNooBWdhsm=Yzq%%Pws=?i9{Ycby%bk3?pe(DG2h019rrZ$lD~>K!TqK4k^G%- zU4N&ninv2XvL|QUNUM`pD(%bEx+%}zO-~WhQqs$3^#Q{UM5?Q$^;F}Dt)rA-@9Em= z+3f2W`zql@&Wt>#^Xhr3<=&L@MN+?nJ+Zz0eZ7U;c^t`Nf18f=(^|b4ZW9=m=}Rx2 zn)2?)cjZ%BrYfnG)1qlRGxla(3~UH>iBwi(?N2@1JR>GKj=E-hQoJAfhs9KitrFWk zW~D!mf241)H|(~%`%-_hq2pKSk*&TFtNj&~!es(`GB>8jr6r{n=Ba<Cr)GA}ZW5>y z+!Y!bag*sKX(zSP#uf8pVV2a{+0XZPe8rrna}UWgJ&%!RR-Tc$Rwhl4pA<99Tgz3{ zE=j#mNh@h1KCb)_?h~w;Ju9Pd+VT|r-I90v-esiJN`IG`J8&_WJ3KUUCF)b3YJT%` z;a~BhB-zV5lRSNWYyCB1_D~qAMa*{JBhMc9Sa%`!JZEqFOfvhf3gc}BjgS%!w+f!j z`YGd0+N8AjbYDh=%+IoBWY-Kf3D=I!R0^o^Y6&7(SG5+fxJwCzq^FKP-U+eQ6SwAg zn(Nm*h4MDavoWVP>1_Oqn62Jj&YALFaRJ#0pBuku<<+H8XXMl1f~>I_k+kEf?Ndso zyh-VhHa+7+R;yr2xP)>{U5AZy(ew+ih56!L>7o6tvy!`#=YaPo|Jay9F;{&9yz4xg zdx@);V~!jv?Gc*Wh8xSYeagPb=#U&Zo|!9SQu>?pe3>V*J`ZdSmI<GUG*l|9zktD> z*7uqJ3VozW@^gDP=MGnr`?f35UCWc?i}<D3*0Ggi?XeeQuKO4IMtYyP=Q{hym4%ze zX_VUPX+J18A}Qe>;Z>oY!G3|7fu@0fv(IFe$;z4CB)B*n7p<%OqpsGgfUo$4@nSx5 zJ}23~peDdDXKA<HlR$L)HEe)eu6E8CDh=4knCfm@W_&_c=|!TIZD8Ldgq*?Kfk0qF zPzr4beHwlk9uZL^snK*LNqa_q|81=j5%-tIFXWOew(S!I$8`5JU+>tK3CT&9a@NZ= zHfP}+T@$n8`uU5x7uz$%+VFxa87lGH32Hax*GO_`Xz+6OhRjdX|4bd9YD+7Uo}RHK zduB+F9K@FVTmRRLg35S>?Lw^7N-l2y)KS5;-ZPY&Z<nv9uc~i@*Y0t+;vCK86QWnx ziM=~TPt;l|iz2r|F~KI;d9wnUbBM^42y_XyW~Cfr)JMV8xelMu%Gg=}UvZ!4C6o6F zRY`}~x7(*UD|!C%^@{BhS0O%s!mb2=;*t2#vEBSrJxiQF%BO`ab3U1|gVj0YU~diI z42=zz3|z>%nmH$<6K7y%`pL|P*#m-o!c(K0)K$8}ykr|Iu9Hg0<;cCS?zrg8<G$`* z<XP^m<SXcV<Jst5=bDTM@KBm2+=1^b8Sk`(YH8(Aq(}I1a7bWe_Jb@}_Sx(c0U!C@ zfyhRxsXo#^By;vAY)TRC+d^^!Q>4N~F84|v>6rMN=#uw4y11RbgqS<AJL8pvKN8<2 zd=Y;&Hn)F=JK4Td4C68MrGocTGKU{Vo`<W4rUuGpPtVLu@1J%hbyS*=aW!*8_KV=r zNKMsE?xJGe6(&e!<y%q?xf6Dr-L1QAUd3C^-_u`_{d&lK)zt($uD@6x*61bJ*vVQy zHJMmsq41HQH}G3lcBU)qudElW$_C*p(QfRe71ZzONj~Hzas<}G)SW@4+n_W_sv+f- zHjCB78+gIr3D@MV?km1}vE}0TCFD&SkaQ|xbDSskWB+=07kdtIF1~vu+aja7HdDDA z9T9FA*q7Nk<Dc}yX;~?+-Z@h1WaP-s44ex!jm}aRYG<`ZdN(t-I0)XxHmRDUvwN@i zq_2R#Y)mvJN6aMe9oIwW3Fi&Rb9tUvLU;h$+SELw*V5W6r^CsCm09C53uI<w)X%J% zbu)Wjutd0cw68i=Z%*tbH_`h;wmj52-9q(-z4nhC+w4Q^UF`Mjt>wnz0WwM)<~ta0 zzllek7kw4t?#5M(&zCSMVQl<>m?Ym1p0Tc|eWMt#eNHvm2|`f!Dq`3O{FJpOT}T_2 zS|+V}+LP1@>3?K440Z^oh3`jBL=9z^8d2Zr<AfgeURbPux}JM>`=7@o#Z2<`^N#oa z;F(E<-cpWKxB}O(TpeZ`{ji!#QNy1HOJ<MGtekl+vsTvMS-G;!?2f^Hp~>NK<U;q- z?Y7xM4iq&5@&u>H9p@hCGM$-J{Wk31Q}us16(c%QhvSL<JM}?IYkAa&mLMcJUA{&! zLt^j7o{j4ppEq`|w}R&ZY@Wr=jq(RlKQiK%iofbVMwSQ5XSdB%(<Y_PPOF}=Df2?+ zrA$Y5FmNFFPq1w0Zm3c;mpV$DWX_Y~T%zY&_dKfBOTM?h>)zrp3!3@|`7=C^oP``+ zxfOPr*Oe~ek3!*Kli;!JRatAZ9%k*y%8`|rrDdHD91RVObW&PsPmM9ce^S7{%kjW* z)=|wl&9&cM#q))ywdY^YFi(QJqO**>y_`!rEriYX#ya@h0i&p~O$(~qmG7dqXjSE3 z-7kucBzG=PUhfuf9m;O5a-DU}aQR(=bCtc4y#{stXNqr)4r=Yl-eBcG%j^Z&F9U;u zRfGKlDcO!dfk4q<XX5SoqHC2=+8JZ6@Kjm~b7LILjpx!ZIYS<AZ{>(_?s1g1@0MDK z+k}oNGn~}ER{ubSVGydWV>pNXO0TFI2}KeWFIdd?#N{UnGsWMe9dbYx?P>CAj=(P+ zs-uoGmvbD|)io3jR=!uhy$SMs1#IzCW1(J+JkfSUiLay25U=IZx@ZUC73C&}Iuq{H zMqM?k2rjv~vjgHpyJ9*2{Oi3B-S^zP-A`PbT(g`_9G^;t*;F5*tcWZPjSVcylCnZs zU9%IjYh`_uxg?``M&FEunR4J|c&pmq=t{j4k2FV~WRHh0(8Tq-d#|U9_oDZT_Y?14 zcQ2<Y_m}2~KMO@{$Bg~@*V@-g(MXF>%issWQo%-4)3=5HLUwJxQj^NhSM|PTZK1IA zvAvn|lB<ckfIHjuxqG$yM_Sg@Rl;@Fsla6GAUBYTbGB_V$517AzAoxzv{vd<WvVh% zX{?k}x+?pX@8IE7)&{~C8KnK7?IWKhfhg1x+f3=Mvz~83>__qK;@mMG`Br(KdK>x{ z`Ih^NdLKId(m#5V(lzoyq(gX8@KpAJtoB)zGv}ozr}j?mkoF|~Xy(>zPpDqhi(<!r zTC85fTp{Ll1Y9A{Zr@dZs(-z&y!VM`u(z~N^gZ?@xqCVqNEv2zeY#poDG(JSg~Kof zLI;BD0-4!D;2v+R8-5-+uUytXBuB0fd3yb%?I<x^bGC5(>+0fe>K@~I?KGWLT#ucr z9YyW8rSsx0;d3(W7Lcv+hmqGfuMJf_>S8MJoYlI38kL1VSdHw6`}#t%ar%MKUIG!^ zON=iM(WGY}nOFFlK@6fdobq$}zuHh3a})J~W<K$;eZQ-vd!{p8&M#$34;){+*Lj+I z&bwOJuh=rRB(<$}!bmaq>m8$6!CryYfop+B*pc-^KZN^*cZG(9qTwq_k@uM1Z6lX( zm7a8Qba%9({{2X21=oGoefKoaJ@;ehZ2LRuD`}DR4ld#Wp`JNTYpgVjP9rv*9qkca z5XlaorE0^V$k)-sN<l5ZzDU>fH%15B7Bc035%W+dJ-7X^eIj*D`co6)XStgEr!-w^ zhXRZ&9syze3S@K{So=4|D>!(PVK@G!jzJM}4pr;`t8!LHSfE>pB&`FNEf2<P#oP}N zUmQ=|q6ZjqcTnT6gk920M`iba?sl$Y_NdfJzV4Xis_OpAmEWO>ADh#){^}0x3QVaI z`p!t*U^x49z!Q2KS`@AuIU8vlnHt_5{xMozTWMH`cLP}R_r=C?E&FSGLH6(_M-k^@ z=X|HfdC5LZ-bG~{hxAz7Pu>c86~-uLb+bB$6*g5Xqh5&Sj*gGcR>rbJR%<pY+uzY! zlF{z7QLBJj(u>6(V2A9Gyz&O>J*;7jPLRp8iY&RZ%=23!c5&t=vK?xZt-TPA-6&Sc zc6hnn;G7nOds>KU34=fsw-EiPKqR0hxc5}>^$?i?CycYkGV_+LlGM==<G$s7;Vflu zB~6pRb$;p&xR1N;I@-&-xhX>WMK}qsg!$$*<xr?*utn%%_>0KV@WAjt=tK+(-wL%4 zw~o5Bk3fZG(CgE-=Hic1jNBa6ny(x;oLyaKoI@Oq>=C)E{iS_@eY)I7sw3*eh4PV$ zzg=%erpGL8rP40?dGtf2H7DB&s#lCuQ`9M1Q5dRe#+PLKr3k;1!5I<kR0Aq2ACT&@ zD&|N{q;6tQIM4~?;q9|BSFow)U{^U{2_Jw9@ipw);c)kMXg})|;y2do_4Ibstw}Q; z+dh=-uJ1h|cQxlR`KEl_+0L`m8}BXW9_JiouP&7#Lo+IDlrD-t8Y82BhVpZ}9*ryx zPYyi~T?lUtj|j~OR-szeM70*01e2(RFxuQ}n?N;;h<HJcaSn4C&R*>6PwcB4HdiT^ z>^y9LCYO;TVs~<EVyKC_nd%5DwYkb(xT}qo0?N#2ljx3UL(aN(N(;rWuF}4t>dk4Q zA865IRs16sqJBgH`98Ifo=Q8!A}C@6#XI6^L1ivGQ0;#i)%NGWQQWKkrT(UFP^W4i znVOhoAL)q5W2j(qz~0{_cpg#xe~W9WbH2Th^pH%sSh=p;M<}b8R(^{PQ^qKtMUR9h zh1*1SMy`d&!yp<J{x$luT3h=XZ!%kNNJREJmEjN5%k>T)iac-RW%5i^5}G^D!1?XK zZTdo5BaRTBz-34w4mJ;!qL0<N%5LQe)yXPSo2iNN24C;3@<_R)!m=gGvzTa2F<Ue0 zt_-8*en0XXPQzvHFZL(@YKTxqATP%7qNq_$F9ciqGc5mO`bx8>*vwwX>2-FtAK)I{ z<t*sA;+gDj=4yo);TEX@>tdjIM@kmz=$}Q4M><7)iX6=gv;JQAPUPE2R;WX00C@?` zwQu3g?a{ZR4AO>7wrt@H4Df*Cj`OJFKI|ryezs&TW9(zmZI~k^!jOMUhR7VE)|vV} zbtWvw&2R<>A>H>pT3@-PB&u<0ZE)@f`b;u+$crHddo~L0m&LWPUrI@fVJAMKVv|7h z=oA%zqFM>9Ce<)b=x3+|A7}m~YWCaCY{yYqmIL-g_e{?-_jp8CpF7(+dP|EqamtBb zNQH#{n$Br7GWwMKh)tm}p`4Mj(Or>t;e#PpWGTFHDoCMa{gwH<jSN?6#1xla$V(ih z;ia8IxoWZe%-$8g<W%_x47N37aQ8$3Yyq*hJmy36u-+=&lub%9^|Ll9<CGiZBDB+H zX!A5#uL7o^l5cvIysybZPw`i@8|sK1(K;AOmiZ#s|7-P9`X;Rb3Lm>+7C+Z_8ij>r zaw+F0&bw%OJ+%MM&U1N|xkk7iyIwi(%M-|XJt%x6Z4+wfL!+Z3hoX&?SCIjs4#9h& z<B^Y|@4`1iZNu}Ut*DB2N57|sjC9*FxL()bY*mn_JK|k)Ic*0~Gvu~?yyL39h1^e) zq-EkC!bCD9r;zd9%Gjv4&`!e6PKj<;bo!J>se{hf46Qu*FCFy8#w)Wex+9j&<rO7q z7AMR+v5ojA9Hk`j3)?nhg8mm=<q>L8Dr&9bJekcIa$TzHsOhki7tq{(#P!Z|+w%&Y zkTtH{t{e6_qJ)acJ?XAE+{mXih%{htkBe3b-wtjLm5iK>oF#80HFP7gP2H#$h2_4* z_|T>Z4W&x(zT@QLj)Tq(&f1Q}@^EUN<#ODC;eSjz0mH6@@Re;enVF4@Tl%;9bhK^? zD8EKOL8GIF`bb%zWDqr)j@rxzyrQjX7utyD#KL6CO%qp9=W4vPPV|cds4vq`SZK;d zOZ}}@P1}LqO-i(<`bNu71%YPZlf4}I?7vG3WUp(rr-yfzdx+}_7UXot7V!^T3wYu^ zq_O5RrFLX%WN0)#`dRoonJf7trJ_?%<5I|B>8J+uQl^Kv=Q3LY{@O}beQDX{_{Ukw zmBZP}-h&vDCJXj<@@VO6v62vDt6?@W8j+j0Sv#tY*UqUul}gc)u)sf4kE%!1L+T<; zFnsV6`oVQMA@DBwZ+zt&@GtAaNB>6p3`L4naPBh9!PL}xsm-O%+N<d9$o@z)It@jZ zjz)c$jmsQE=-D=TBGJ1u-hJLdo_Fq>?vAcW_6nkEixa<<N{Oj@Ao?);081rrcz^Ko z;FQo|@-cd&iBck5D(cZn!mabcj*2J$;T9+IE4d+<z*baZesq4|Xl=g=x74aSHB~Ag z*0C)n&$NubT6+dty9OF_pOK~WEV3l>V>FgC;%C_AHT6}-4HHH!S)gmhnpAl^Mh3tf zs?)WSYse#|p5(yP6>h?7m}Yd*f5q~>Ne0Wo=+4OMNQY>5cIFOksZmP&$T0_fresH6 z#}?-<&otkUzN?-=p2nUG*KYeE;UyV&FQ`n~R4)-75eiby`*!e9pktsz@VC(7@V@Z& z@bz$+=tXs`G0}EZxGo-*{*ZUsOE@|^k{u;ob~KhYy6QVO*elAFq}k%nVh3_SYnWe< zQ(j5E%#F1vx-?o8=5!rpbkrMN7yVj|*K3gh69*$M2T?<m?5Mc+ojkyPlbGTXDt>_s zN*$zGsNj5u#jm1_@d?@H@tO;c`&qT2I-1&5S2zjwDxK9Zx7j?smf1u|l?FJAc*c4q zswysa&+ruV&GH4j8$52$0M{z}B%z3*Yc2Ji`VdtMzYLtnPS17*dS)NZT9&;bxGQ`* z@@4c!G)+;ob!G@8KGxpZG054<waYccRlwEWb<LH-{mymS`OJP_swalvSGA{RMhmjp zW-6mtO)-(N;qlZR8^cLIoP3X$il$!G$D`QQoSK5&q<L~3@^L<b8~d5#xMQMYkG&gS z(qXc5{Q?!T@l7{SMK6v_v~kKXC5_y#Ls&YQWDxwJ4aUl+Zh+B{YOAH-VbmwyUQlQ& z-jqJDmv-KApZ3=EZN+M@MNQ09)Q$YE!j2d63o*g=k@iV+K%_4AlNg;5QnLNoW3#&k z9KnTP9POiv)l}^dy^--HNboZ0n!T>G9lh-7Zsq>N^~~v}Lg^UCCyu%Hcv%$=n;VFW zHc<1b+1zN0slL`DQZv#avL(_!dREz_`N*z1L$>HGv#X$s8uxAm`we?BN7!D`{tar4 z`Q@tcns<ty2`=oL9>y5`4EI28a!_RLq}q(kh52fCtq&{XxzP@uOGT>Ad`M1hrqG$X zBKOG!{t`{WDlmsG)BDHpaIP2|s3$Ydn1dI!)izvQ0s{9Jr*1F%4ys_*giW2~7zmgB zm3Z6slQCUeO|?g#c7pNEh&&1}4@;4;k>`>1(V)_eyXXsYUAw}dX-)j~k#s^HN-fEo z_W4++jpVITf2phV1DyC{LPguZ_!#x|H0EU<o@PB50b@A(i_!kx_+!=3+^B<3k&5Tp zMo0(ya)Jlkl<tDCJSA`Y6I31J#6yBx=mEDj34b=5>Y0;Rmw!?@Z#ayD33>$XavoS* zVe=b!8aC>Wd`qs+J;6go&upsr)rMzu2_DZNSSPpO*OoU8*chu|ZSH)Zv73Wj(cW-D zsF(qx6)hDpr+nOg+VR3sk<6=+RJJT8-=j~GR8pL2Yi|?)%dW5Vg)RJu%%m%5CH_Z- zS;MFnZKFQWYLPLW#FK`RWf~UONS(QN-r1`<p4oHTOUvD*2jrM{rKXytn;0~X>*ux7 z+GF)5`bRIYHxH0~vWF^#7qva8M0KP>%2=vv52Bt+UFv3)q2|+eSlL;e8+oXPwvfKv zhnpS3UpqwBeTsgU(a34UQq{~u?cOo0jt=aCFW@khq?X(=YT$)w*AO!9dSdzh2}2?m zH3yo*#Q77Su)A55%1)DD{0^cH$v!k+gUrq(SUgW*;WWY8_ED>23hQhW73+>tV`c;_ z+ct2aOLMMvfc>-yzG!>=%dg-I{{(aMJ8BzQb&UtWKby_>(_!$fg_%5rSGC}GJz(j~ zgH<$%jM`qX)7rsO>&I*iBx89JjJ(;jY9H*s>oA~h!p*YbhnD249Ng*tFv7;eL+S~q z$6_P3geQ~-&RhnZru{J9=HjgmhBes|zG6>!nd_*9a|>3PAD&cOm}|4(m2HCq_BWi& zzv1it0qb=ySioZVVO?OIRf3`Pichtw%AX_meJeKIR+vzhD$*_ZScz}}%fp;)3ZHK% zRXIlU$7<1N*i>!dsae{@@$l&EjBe;X8*LBFwG%`KuEXLwM8AG#=iY*Y6@c|*Dcf60 zHkSTE0p3{*o4)|xS<1~}^1R<L2d`mlJ%`O^Rhxdm`<_uZ)lvblbbtS+sPKaS--nBM zg*iI|qsmfbvUE_M@l&fl{%u}qsZ^xDuga9c|1C8G8(wfc-c&rJn~%>f$lv*?wNaGu zjHLxSpZ`DQ3#*F0^$9oW!(E>BmS?FjEG@MpOJSxU%)^SXzbr-P>iEgk;rkUJ=RKCE z`(S%&tmtG~^fx{Dhc^F5zf$SHRg+(&_g0np58%O7BrCrL@BWzYO5>$ltTs2}XsM25 z@eZrcuh_FM>6xVxluSExm}M$`vDCWbX}L9qWnqezq#t={TTY&l$nOOBpxM0s9q)R} z-*0*U6BvNjC?)e7OTWX?7!qi&rNoru{j>7_-?-$UH<pIDr4VJ+j@N0urS6o>h+5he z0eHWb3P|ApdSoeVS(?z6BDjwp;(+i}OKIJzIsd<Tu-fs0eptP+G$0-^uP^wS^<~xI zkI*wqi^bBbiR1Gvz3)8CQ33wV@qT121urKpww@WJ1!;^?GIM6Bl33~xnY72!B4-F0 z9}iEl#=_F#vQ&X`&>KH3l;};6*ILZax9>;TQeU!qqcFM#@3;O~<LjmumMV<ZqFCN- zG4`ylLhqToxp}rV<CYS(!RK16$d~W?XDL=#Dh&U7-v9K~EoE-||Bbh$25-I7dbXvY zEz>56eu=cq(lfAXC0IHo-uJJves7JXrMhj^r<Zx9rHdV<w-$rjQl7U|ZT`2utiS)K zizM(4OAXsv>-phGT5}oCNED#;`FN7Z3bCq|S!y_z;*|BrQoONr#?u%Ljf@FP#Xk6c zoU$2JAMgJED<lv9kL44rmRU;RPG%*A{#&cnQX#U@H%mjzQen6HX|nSF*GGf)S$Zcb zpJ#npiuKm$Nbg6{T3eQCPa2<UX~$b?1J(?>*;SSbkF{z&Jk`yos<iYSYaqhBxoC}_ zp9xfGv&LS7lj)+5q4z5!<^7W^<#emQzokbn@&xNNuv%^@xn%Mc;5h={`{=hdI;lLz z(p0j>#2Ot+81wmI-fOK;>m;!Dnbj-nwW<6@=afj|=W%?Fr7tG%N^3V-d)jJiGJX1= zE{8R;Rx2#cr9|3cwai+%0zbF3a{RnIz)rcxIrM}ciM+yEzt&o`R-C2gWbN7{R<@t# zM|rlT*z=OLVC_nQXT-lBH-+9=nr>b`Cz1DOzn}Bh{GCDns2#%DQJM26flq$KGpsT9 z(IS)fS$aS!dm)h(W1Vj~->;oGM(i!S_Z82z@w;5_N76b)VwfdsO<G#?Ry(a(%iuJ( zcD<$BVzt}qqqWa9=GYpw2tW1k6KkFQZ)|hF|8$AZE5sRDi4)G!I<<7KtomnG4^!x& zwYC&S$g1q|ijhx(Q=f~^bTYpxt+4I@>$EM#GfL2Ml~=vtGX;8Fl)dbG&y-GP+#Yd1 zS$D`wo@%LKS;|<JnwYhBtP`~u_g@QcyU$qt>73}+y>kl|?^XI0V&%!?0G;7BK1OfK zVL^P&c*-C-5174FM&8d&UW+U!OQ$D4E6W-QH?7FUXsEp68Rzod_xIfs#@y0!%E4-| z*us`3oV8DE@5eF+J2{?lvsO?7H?LJa#D?1G6F%u7qimg_|I<aY)?|nkXYE=SYs6Y( zmbwKM8TpERKmM-wGbh>J@a{*9>kH=1MUP9c7ILwAGkNY?S}*Z#Cv5Ns^frZ0u+xUp z+*%)SI@?(ZmO7pF{Dk)-`j~!LifvCA8Ef5G`ajm~Zt?sf7V*8+@1nH*WB$alZnOEF zrNn2gVe6)N%Zh)@t@%HNAgcw|X_w8<9xzsxE=pcLzcRT4^|^cV@Xl05?<}j}FUG*S z>jI3fhflTct_1p1j(%I?;Ca7KA7beo=GFf)zKWTX-&)M=+E^l%4wiKWYwUUJrn6Rq z^uASAE0P%T2E5kE4zkWU>)x_%4r_18ywlq8mU5z{0qCby>8w`k6njSdu44&Z;9sjQ zc6r)lV<hrpHCXu_C265$NtD2*`vbdi6*i2O(bAkT&PATbeRg$-en*+x|3}qVfH`$N zZ|7<}o87Fk$U<><r%3VQ?xnaxi&H2?TPVegyB3#Hq-b%6;;!ow_vGGu@9h2U)Bm@5 zHk-Y<_nbL1b983jp?YX^a-q~$sJRqYV6E|68qa3Jhh7c+Bu-rhN9>^S73lM$6&C1} z5t>7zV#R!2t^zH5fYsTpe4dK<)`F7tsKpA(?cliu{73|?Z@{f<Xv-H^FHVGR*Ma|i z;d}{D?#&wL9WL~Uo!H+j2U5)|JV~>E0PC>RxE{`@u|70C5BiglzrxLh&Xfkno1l(7 za3})o#ol;*iFHgg?&J`+auRlky;w))LIMu7XE#dw2(2%TmI&y%a5+b7W5GY*34jM} zQCdmxH3wxU<4Q+R89`f~Bf8)tICleU?0JX`SPu$CJZC}=q0EYf!4J}adg$M+pjB%4 z-~%5PYqu1%7nwTH$L_&)au5{VgGP`RG{9K33hmtuUVn|)nZcmSi*`uBF{F5%67cSC z35v?1j@O|5Iyg$>cMyH!8mNiJU5!8=t*<0#;Y-M!Mvq63D$W0Y<D@qiUi=hwLa`$x zzjBa;2fh3S?kSE)ic*l69aLsO>R&)^Hb^@YV}&VyZ4$(Pv|3i9UDZHOS@1*$?&PA6 zq=6O|t)lvkxLyq0D2MWBc27k6UqD;`!476IWcnBQ_6(!Lb5K<&UvFB1TNXTD2(qt* z-X}soF6Gzs1+Mf)OhrBXjYE9LRYXx7f&^(?@}Zwuz;71uu71R>e2E^{7+UW`A4)~b zec(3DcQT~45!^Thj(w9KLl%R3&f+f0L{<Y7Qj`<rD>{N5$_=!nJ@zAuu`}rcJ@BI@ z%AZAN<>yep57D+-JaGfNqI2Ng7l@5ojwqrpL5l>r?12ntqrUslKo9zs7iI1T1vf!s zX~^+M#Qgk*vlSb5blngOb1l*mF>5DKTUF@o6O_9jPw$81zeK#uR~T=u!{WFaR5V2N z){ls@Yy(M`hukTb(pA)$jh@XRBI!ClpMyT#h1|EJwGL=@N9^_Lq7}s<0|7dJ1A6!l zl5YTA%7a~QAhh=(P<4C2QaK9o9vvXn1n{3mr~vp|27IrKc0Gjl-h~9MI4^085poE6 zhXJ~C0=vx>(0&_qgs_4sV$KE0Nr*tAJw#XVup;_JE~LE)uQQ;Mhwe0koG3y`09|qT zuMcEb0g|V2#SESD=4*E<I2fBBd+9~QPBYZn6Z&}$Z94=Gy+TbiyHr8@D4vJKd}7B8 zo`61@3R%ua+|;kQ_bu8%8IxL|miC~j8hShJE@`!T4-$L}P6l9|q;a3tKdI;o<G^_( z8~SUsSwO_&Ozf_QW0y|*c^x#MDemZlh^TRh;cJek4A9X5kl|<S(Obj1`4!Gf{zAVL zFxrXe3$zm}4lODTj`Ts)Saoo33uruyQMCp3z5}rfr|f97;&)=U^T2wn#(e(-J$E<m zx(*$Bh0@AGR>M$26O{T2oOU2ysRe4T4SD_p-J6Mhb`H2w7n1)DQXK?J9oTnMme}(c zbM~VbE<`VU1&Ngb#^VBLF6FtZ4(YW;U(=)1KXA(31X_F(eCY*i+ehs0r{Md)!Ku%X zkRRpeLDRQ_vMu?MZ6(p?2O(N>BuXm*zJ3O!alp`>gY%1-7#~AGJKli4*8$(r>hl5g z{uVT0Kz_s=;i)Y|Oz9TLuN!Lm4SHS&XK#0)-+w{I<w0Rtl$QZrTY`SG0&~nuw7Ub& z9M+-U7*IA7uQT8W3qI4HrYuHbE&60paAG)Wo`f|N%{yDrm(HONWaN+b@whJ@QY!+@ zwP4Jm^)l^~C?h9na1gwtT%8=|0TWvF3i?<coTsSOtr#<2<j+0XC`*Hu_XE{QI4PrV zN`jX(gHZO&A>eZbSnDV^*$%X^Iqsu1><7r+ftV*J?tcjx?Z%a|;4|&?Z$MfhXrdK$ zBw-GrxZQThsj(P6b~8$HVpUiTdNdP~yN+3?Ga}$;g6c6i#ovKG`VyLR6@B&t+EN2@ zS&vhjuTaxw^!Xpb{aWD259m)B=u5M3ZbZGf8|s({nm<7U)}oHLXnT3o`URf54LNUz z%<n+|+hfcd4t`uk1m6zuW*TDHvf%&G4P2Rm7_z?5oUb9nWvHVzWYaa$3S4&}&io)w zj)1v{G36NIFdO59YY9f5N5BT0g*NU7erY$<^bRu$2Wg0?8F>CcJ2(fOQ-S{N@E)j- zr|UvH{y^&p4SPPuym;`UDf+k(y3T?A9Vqt!T3!f!-~cS$voYcs5D{+2%H#sZBAWGU zL!)e1Ukn1q^AJ$?Eu!#mgD2lW0+e}_R?(LrlVvyoBaL|pU8s(}-VnW|Gc<-){Sl0Z ze<D(RF66lYF}_8CMKA)R<rth}z67rD&zNb3pj8d>5fgs~jTw;VDzv>bc=rNPv0hlS zsxS`J%Y(kR=o4ljrfx-?<RoyCvc@-s@6`gVR1&~t7tUjk1BD<Jnm-;->_9Z>8PFAm zj7ws!dksq0;f!!5#sUraMG>eMz=;#!(mMPt1DV`Kj)%VJrJtcSvr+0a{68PHP64(+ zHJ~Fm#nW#Q>%15}e>+eCvY-n$amKp~7`ufL1KbD^fc<d>xeR<vMoFVlPZ;toj%V9o zRt!dlBa*fgM!HOJZx(v?VeoD`IC2cyS{!l9e?c=JU~H+0ago;YufXBSm>q6GD@UNj zu2>PagpA8$G{Q6rZP<hM9LG4a0V}3=xN9zYR5Of~GjK|I2D0pexZC20s`jIAb;6T{ zQ8#7N%faYf0%L0<^qeiY^B#Id63UK2fBX*A^npYOJ0lNc@K=}>Xcr+sE3(nHn^+ZP zLEoQZOeq3N&5&g}M&^TP>r2f0)u6MJFox!#XDr5Oe+N208vSe&PJ72<_V|E1XQOvL z#|k|OtxQ5cT>;r2!+K1O`VEvJCtuHUK-U$l7$mF(Rw34T6M9!=wC)}#c!1TwV$3~5 z(AFc+tW4}8D`AY>1F0Ru7;nZrqQV-h0w~V`AN%1o8vP;@Gg@!Z(F)(_G0$BGFLcmr z7W7_+w$mAFCTO8vB*RN!1jd4B)g#Di4@QFWSUF4rib7BHkzCM5`3#(Ba}|uXH4!;` z2s6#EplKSkY7^+RV&1KU{{KBFZ-V)#C+cpFXQ?m#gXibq)VeqH?IG4c!_g~-p}uC| z9S^Mgo1j&Tr>kN_d5=+#a+?1QM89w0E3^qS>`07ANod<%=*=tKYs32s$l)s9k*y(r z4NtS>bj0bkM;o$mowAnFj@E*)G!@c%gC4@>uT-<pS~|N`VHS^rUQ~t#Dkp$(SXm7K z?X|G}pwpx$pzJaFIOQcQhxPJb=of3ymSk{$BgS;(yTECCF(5+pMh|f!ws#li$<?^` zHlDM9Pv0T_zZd%82XN_Y!~)L)t%)eF7iy}NzrIMoIXTTVHK0wDAN(Qs{|uV2AERtz zwB;ejr;f;kdNl%UevD(gz}1i7&S~%<4SlyBxU>{<YKZZE4o2~%(A){ojU}jo;@H21 zg{D1xqOM^rJOp#?IP@(E5~CT4$BJ(k=Ffr99N_VwuTqBebgZ<7fai_TPiI1x=3z{U z#T+mT8X*GH-~uQ-4V`i2+eX~b*3uZ^Ct_B1V~l8yRwU(1-~kXzlHs#VnFIzS6XiN+ zB4Hu~A{{~RLhzK!FYPW+PDfze_!g3+mG@GNrmHYsPsJF}47?P8So0U=p^}(i8({T7 zQT(?dJq~kdF^u-_p;NTxjG&*=%<ja<H3jrn%GbPu;NMM*NOTfMJ5?WcjtwzVxS%7) z!G$ZhuE%IWrzTc#Uc&tQHTGT&F+$idK8?aSvkbCwqZeo4_ZIef&p^*T%&V!;+6K_z zr_la*j2?3^!w$!Il7PF<pzQs)kIq+PAmg*p)DzGbS{KoZuo%X?!_bNiSW})wwxx5b z2z<!)<H_IAhgX7U<<UoIzgHaV(e?S9tO+~M9gI_(;p;vZTwZ}bwHDgk5AzmbrM!e* zVGIItD+f*xTF89N5sC0V`~{=`M3myjETLfXd<MVE!uFL3%in86>F>ZQoiM<6VwC8B z_V<RK6vq5cSwctP_bm7}82xrAX5<H;Zy)*}S%X?&7NtG^LCgk=an*_$rX6OK!RS?a zkV+En>5Lae;CrB3H_#Wo7{N+mY;S=6PT4?q;&lqLDGmuYL$4vMyr<B{3y@7w%s=1Y z&Z1afWkY5h>Z8?r5@xS8@TP2xxwSF$oX4v8IA+J27!fO?PC5hW03D|N>=m^9JJ`o4 z&+<O>n_TRbzrZUQnoDP5baF@M*o~llI;?aqV#c}zovDrgr$QflfFcQWQ#^eT{VNaJ ze;V`L8raCD<C6zyCF}Bca81z4OwgW&wP`#?!x5NY;(;cz0X$rSF`+E9X&UCY=zQrP zL$AJ%r|aNaPxRNysGIT)zeCGEVHae^_*f16u!2XcLDK<@Vlh}hWMKphVg?aF7g@+m z7@KJIiHuliO&H%3It7pZ8w4HCupiio5>JD2!rAy9y>B+OH3|HDjP=kbaN}!mxf}Ll z8JJDKfL^o$pQ123P6w@(A@B7V?Qf$8j>#W^#$&V+fv2!A-xuZ}q}&Ny`UNtN!`gR0 zM(-TRy%zYHf>HY~tT@+VmbnMHC!#e2QBw=d&}Bh&8d?zxU8s%!%b=$uL;wHG?-d(? zud)hym5E&nWs|29!cyqdJunU}K~1f3_mlkf-x`bu7eU=qw3f~^3*#F){Y%0t1)O$* zdnfSyGw4?rw0<)5vl?pUK<gPuk#<5Blve}wq+(v9vGreQV?FeNao9KXM}H=Jfdi!% z1C>=lr3*Cn!R$8z^ZQvyBL$j9`!`xcv_x5TP)9BF@)xLi2YSXq=-^xEjSlq|!MC*j z)q*n0PW~1nR|?i{6|mcL;lB?Uqi8haajibeqSZG^m@-<}ah1-Q5}=1<p}K;SkAQwU zp{R%&8=~Y^;8q6om%jNM-^8J0LPM*Gz7WFra}HO@f=bvhX^;sI4JBI$o#dDxiS8J8 zD4RzEP)e)*KOw=>(9}neg)4teOsC2xpixgSo+P4YQ%)WoB=;Kkq~Z>;AG`$x*KtP> z<3=;+W?kGz{a-*GbfQUTb`LNzpT>Q;c%m9+j#j9%JjOe+!xY7p%GkY$7=_=WJ~}5( zg9JE8v;@8>g3;wEbSf2+rqkyjsG}A7Yy1__D*|X4St9J{8I>TNwkW?MH2xW+;6f>M zQW%f5WiEKJ15^;E506@_qc3#I?;T#q<|4|Ipb5PoStHgadmzi-F;=Ca-EB~6Wvm=t z<Gx#<B^z@9q4v-|+6QR~7<n5|{158YVkG?qYlVf-uLv-nD4%pENbwPBID=lOMr-NB zFa@K>QQSEjbHFLoTo)twe$3j<pnd!B^jb*c1vpIS-SOaK8ro6_bPPbx?1Q?K!Q(q9 z^C{%~0o?wGzhu9;0(o5r)hh6<AzIite}ybVe$-DAAbmIFu^U>w8$2~ZUY$XE3grJ7 zoVg1LkoQ0lNSSP3lsEo4%C%uU>xs4uMvra??R}5)r|qEe6u6d!c9y{tJS0Olun5+D zbs>X3ka8TdgzN(+SAiSvG5WN^8m2k4-41<ugRw)4b~FOdyFmZrP+vOkA{%Hrs4axv zKw~!9j_FJ}8*+|;)>OeaGGu=f9NLvX_g=#1OVD*XXMT=5jnKfa&=cC{&qsaHUk5-2 zH8IK(Zp|X>uy%k467ZiYVx*z-OBSOJS)$6JXEnf`MWKy3ppiTwEND$P(A^dHy0K;@ z#JCNp&j#640_P&&+IFD$EXJz!C3LU`R!`rcXAOiV)`9ks^a%0k1-N+=J!~I(<U>f) zfR?nty{+(<R`z7|O^24|;FqkYYVfoiN~;T+DuNeeqo-`_I?NKUF`L{$uX+nUkgYNR zDbPxptZ!ye)dr*I*BIqOxZ@J^?i9v=rzn~1ixI4I>4z-b(P(>Nlu2hi|6;tLbH?+a zj!u=7x~rkIvZ$F(edrX;4IO)ix^F=<9-+oh=yzmYO2Yk(z;EQ=%ICBPk~j;g??ah4 zaF-u_E(vWYkNb+FRzkYsF@t$QaSn9h5w!LqwD&1m62Rz5=aFQ)D-Y_(szNq3vaaf& z!Dd{E;4VkL?!U+L0$M>HFDZDA&hVe0?vog|D3_Rk5=w!`l+XSPd?u^246c!VB^&%B zo8SlV=?#8UL5~ilRE0j0eW@^X-Hm%P(Mme6Brg-P{AWT-iB2lJH14MHxGp{!(U0Ch zAMS!fFF==^ZwHLWNN7O4WXYnroNVt-Xn+l+k-d<`b+YwR8|f^T{)Y2cx^#v?78&yU z(BOIUjZpj}6uUp!yr_40G5V53$r7eml!;R$UkiT8ejLPod1x!yZ58`E-A{HdvT`f7 z>2N+RbWTh5G(tW~2Zz(}gezZj$RbPjZn6#%g>J~siMz-K>O`rE?}XxmLAHDHZ6KP- zYl5hzQUQjGd+9~%bj5P7LHmgVEWRgeehBR)n={#W$*)3!?&u+PdJzvvbI9|7eu)<H zxS&1|z>@_nA&VjLRk3u_6J!M>36lMo`T+5X?x9b_am9OqZ2O9>p6;Q$sdRc*_(~im z%RG4_(6dwm@lT<GbQA#Cc&9dy{V#+XmAj}OvMf^z=`Jb%8}jO)776)uP&?>(s!#b| zp%u5HJwyTBtpPvjMZOc{W1&z-wU8GC(M$577Ab8dTNm+y?j;`*YLyCoF901w(A@uM zB6|J#{gEucBwG(8N>}Kee2P4{?!sTXFMw7MrSwi*RX7#SFPWrF^b-&KxWk8E^4L(G zQh20DLh*4RDiuB}loM~LRK*WPkq81FaFxmoqin_7gxaUHU6BHDSm6S3iZr7@f(pNh zS}H}UTd9@qQ{;#QP5I?1r6_!-J4w1kk-|?!8|XS|T7g#w{ZDP6+Q~bC^n*SV7l=Yd zn)F0LJCzcs6y+1uu5f|cLi86%SHNeIAn7Nyfb1?r4fP#*s-Oh=Pie2hl>%-lI;ZFr zQ9!lOozx#l2T0CN^fi0FbV;tnBce=cBmUqsNt9?;bWG8HY9IY5{X=OvQA@p8krZh< zNs($Q;1Bg6THBJ9mv+c%{H0MskH6%hMPnrOF@=9bsX{aJzq?6`sb7=a3Vw(NrENqd zJ)`^*->G(@fnEw_%2Ne0Q|?zvpuS03O&&YM2h!RAt|*#8V=#??<Of9ksGvU;aGhF7 zPm%``joeunKR-rjRrUezpD_!PMc)Q~Be66}CeD-B7;%YO%m0r9<e5UAMKp3MBOGZd zwO9E|{w_41kQIY$uH;D;i(hm8HS(t^f;qOt|7P2gSmDqebn-=hR8$7}Q7Rr!WZ@zi zke!RTPiGi3&XRwW3UeQ2mLcyFS_i&^p2T5aITYt4CxCbM45#_0ux1^AnUb(F_u`!J zJDjn1hgGZ@@bl{9jJXuB(ex2X_9D_y52VGuST#Pwj<YGwE0^NTc|R}<58>SYAl?t> zfBqAv?1!=Y+<=ph!KlrE)14DIO`VE8*f-dV^#BTF8<bub7<ct>y50+`?Uh(pJ%*%; zV0AeR=j(HEe(@vDKU!nvXY&zuDT5AK$xmVja2zY|eRz?Fz#d$?1j&%qrxVUlen-v6 zaejRiE!=_E8eCb9bC~5oE8GHH!(BLWI|p=1H*%H!gdEUCkgs<xvSn|Czp#M#<UFh# z_8=BziL8}(NgaT5{s?iyTM!{K2RYTJgqI`tt^q#T9O6iOL01o{Dk8U_hbh4}MFh|{ z>|k~v+X0!?jX;z?$IN5CVlvPY9dcMiMShWs$#;-Zc(OE2`V|pee&osd4*uCW$Tl=K zauH{Dqv69`6qw5w5taWfB06udY3v*J8oK~_yl){V<#ViLKj9RvY9tT7^-GW`qz5t@ zHjv98f3ZihAtt~EWazfQRelPTz?tBw8T*>$kn&@k9ese6<1Dx^59bertZKnJ{sGqD zqi~Lp22bc6h=_lO%s*S9&C`+DsSMK}Inj19#}Mf>5INsIK-zP00x}gRiFFyCt<J6I z_X^9!qUy=&sp>D)+r;6*YpxzUUX_d7cyGfk!+R0$aU30SIO0#D{F{AkeRX{OeQCZ_ zf8AhA*eHLB>|;uDP54)Q1)+`*;7{{w5bM(qaZCsJ^N1C!%n#sNvPGD)k<N(Jco2FV zEDwzRH^}pIIM^<f9vTsT8g7Ve+*)}2r(pf}C$bqHV*lX2;|;=C;UJLHhazVG8S+Fo z;E!>MTsw9eGgtL(q?2rrE{FaK?hAbI5Aj#R?`!|gz>eU7kUbm^&J{+aK{@z+|B0-s zlo`$p1nN5MaAb3z#x_GncPnH*5Siv)sxpu*t2Q$Y_x_42X84)=fta}!lHLN$i&o&| zAtsjJEq>5+(2dr=(I*+&>r-?$)T@Q@TpQ-g$Rw#ocv$F2aA`pFck^C%|K-{M1e4W{ zOh>@E-2Jonw!b@a5E_|Q+y_2aI3SKx=OK!^s-}VFC(U)uYt12zUmc@9f(VrPj9Xq5 z-Wlu|C<QE$SKdV5bYES6rhhInDLf5s0p527siZs!IUdil-|)|cp6bV%Pug#Em2|VU zLo_aNo{$OIWdX_dguGQ+5MCCV8JrO4@Bh*_z$<z5-ouFQT;Vqa=Y^`mYacct)icB? zmgl+y1N{-=Z1*8Icxj=b&{Xj8xA<3F3yx(gFdcvbdlaXkE3q42i*vnZz~9dS#`^^+ zR<0>0s5*1k)U)+@#w}4z&Hc>0d7IIs%M|*uQe>UfBjgFZ^``_bV-d5?z0`5hw#^#O zv*z`&X4qm~o4uWbr=)1+06#=sMSDhDS?kwy*S^%2M0EKlZ4ID4r07O#DvRH7i&g!k zU4c>FTJE8)eXe%yyY6M4b-=n$M#Rvw;KR@|=>qc8)Zn{`*EPJpxFMjgq~D}X&~z5N z@v~Xv+XL?7UBm*PMV5~;;qjqq!Fqw3{#0P&4D@ICR|Vb#TO!9zw!9HL%9+51tqgqp z>TEM^8h=+<AZ|jO_a@;E-+}v%*%pZhN~9F7E%lJ@A&M_2lB(*Bc*yUOU8V+~A~fMk z2%k6$qA0crorLE=x}PQ<)-Kb1Yj~imuB)nfEnMLiL>7c?{t3QCp0}>GPKTq4>t|O_ zcM(@lr{4LebC0_WB8}UHa^=o!b0JBcqiL#p4@|Zl`o+4LnkpK%xLAD88@aQLR&_-V zg{lV+`+o6`^lWz5abI;E^7Qw;4la{A0K+DkUn_hi?iJ69`^0uYOsk4WxW}9s2%=hM zQ{*%-9Qpu(DF;#5PeUWa<E10euCs`+zb{?I2v-;U>W;|5Tk<^Ysuv@7-fG6nv}Cgo zh5RMAgB^+diVc}QjD(S770y!{;cWQ2d>nYh<C*U4F19&xgGu5s^(9S5O(RVk^+n+k ze-Qb~&*OY@Y2=ye5LZFGthu7i)Q(Yi7TipRJS}w1*V&uts_EY8GPw7+4|-}K3a^3p zq&w^?@2>1E5!f95Th)XAtUjc5>4xYyT`TQk%_Q~T!Wkg<cjs2H)e)_GNlpz<39j&W z^-lMsyFH$9z8Qfw;rFtKi2${+3!-I)BD(Smz82z1HOPeEz-j6{=tobfOgKLDC{R3b z#XmE!7HDXd<;@Wm`Q@Y8wM=(rHAe2Sn1h-zYcN;T!E7^(EzRy?nlblb8yuOxBJyC@ z{uFa?a^y5(^fmGtM2oLSRJ##-+U?9zb|5#FyM%bD5o{Bj9?rzcR#~9G-(Z{YXS5rP zXUr{QE?HR1xM;s|g6@X6k*OvR3x4f?<vHe@Y@ciGXPazuTNmc;&#sWYFSnW_)%&fq zlvC?Em_D0z(fiCB%^`E!=&I&uQ&W9Q?VlK-X0msstpU4xoMTa5;hbYxb+YH@wy;fg zKK2w1u91(jH-!P}ck0TTs@hoHOr1qHTsuZnN?k~3%r1;nm(~KY!04auoru`MalSr4 zarhnRS2x4%a7H*STtn(3-;2ya*0g#&FB}#e!gV2s*YPcoF+@aWDk~SyU*vD|CHST6 zMwLq*FMS=}iI~Wg(9F<wMD~sVBEcKE308I{W(%{0HF0M+nQhO$P*suR!+U~jgWm!* z&ZSzb;eZJ?K7MyXI4&>xtjVw2F2*qCaJRrKpT>8|ec$<uW1{1Oy@Pc}_Wq3hncMTK zdKQMObCb2_O`l?B#de6j9&;(WQS?sp22*9dLw!w{%AaR`l0<(4*CpHPyj8i{TvzTs zTZSvw_iLz$d_Z-PUBuh?&fHz(Flfkj=Z<q_5Zk#Q(OR!mV<SFfV>%KVA36}K7M8-t z<y)$skd2}kdt3E85cBQG#Z)T%Hatx(tFklq*h*Y^?loJ9Z49K|H>y9GSL}6cxkmGq z5YPG>dsH<^HY2}TW_XvhP6l$dss;NN@nl)ZVzCY}%qx+z^m%v#)+^D{jj#`QeHmHG zUf0-7b1WO<zfG*3(8E$D>bP#0&@R#|FvWeqvD7}?R@?eEucWP%-D^8!ZIpL9&kHop zH_}@EA6=}uOzh71_6axRVl8#di;XRHy~K^|50Ng?XrS*7_x|V_?C5V#wyy&+;&s<Y z?}8xmgsGZwkNLC04#ZjSWc@h(oQw6@Kv=&z0b{)<Y?eb1shSNmi>Ant)g0Jj@sW|p zUD+G)Y@Og`vKH&{w(z{T%LLeGh%;-)8-RTEkSm8Ayk8-UaRRbz-eB$^8~1eJlmCdk z-oIldQv@rs?LgU|2y4#)V4+n(#&qQI#QE@Stb~fH1|W0Sy|56j0Bo==$kTHt?3eba zF7mQ=xarquSIn50LFRNrZEZPWI&)Ea5M1s5$CK*3XRl(PXIDAeI6m6n*&jG&yF2=C zgr_n^#2B60*vvG{wAc8r;htX72GzTT1Ka^dqgpB-3hxTe@*nWta(8jvbCz=rcPD#W z`xgX1g=a-hGhbrn^l(3Og^{!4B-W04b{Vp<?!~(KIx-17lD`2mU^Qt+cvrZwv|g?U z9T)-JsT9nvCN2vbidyI=c0K@%mGxqC<cX@l-(qVp&yd^VE+Pn<A(vBE<h&__Griwb zt6(wGVg<TQ3SmsC1FTjx#=QNg>4rQE8Q%&a68f7kgG|(?R6F?A+AhWl=F!o+%%_Y+ zbrCV0Gc*54+R#0}-CNgF)^*=e$Fa#FI*T}4IE%RAy!zlN`7~Qo?5&-kzipUhIH(_? zTcUld@u*vg+1z91CDw4&!s`MjywkynH_jYqbyrpQ9nU!b*iZ!-c^KG7+$8k*=KKau zgVFUS@_sB}=3{p=3%ihE@{d4a9*Kx=v-Awv(WJ;k<~d8FL@YmnE5)s5e_;=^gSqy6 zRbdx$&8z{6MHe=nIS|<loR8v&Egpr_`hJnHycInCTVkXPWWI_7#s!K5yM^9MD^<sZ zmAXz*zs5X@y&5+>?k`Ih^BqHB&1bG@WMOEc-|JrGFj!mWhO!@LKgj+n=XmaEYrtvt zRSq9i4HSlH*BiP<9W*CLmp8YK+H35hkJtVrPU6=vEhDZ_(Lg)zXCTw1+imu#jxs>t zYT}oJ6Q#AlEu6qUWW&HjsLwvbT6+L8xL<``N)1~DS?))}Q)jolTwWwMhHp$QrY^E@ zwZ=L&8wd)$*hcJ1#Ow21UF6KG$eqOc)PPc|L3>K(+p`wILhv_s{B>}aUJ7}_Bgj-2 zLWZzH;UB}LkTux>EQ<|TrEd*CmKGutb_G75er4Ef)>}5jUWiSI?HoP9cv>A{x=Mk7 z0PJV0^LzVcpk5xyTb$Q9uZOjk{f6tMZ$#LkYAJl9tz(EYO*R!Wr5L|3{0(e_C}2KG ztV`vP=ZC|A?Y?22)4*ar>8#+I=N{z!0X<*>P;uI*7*=9uaUHl9Z2$aYplqPG^hQR) zz1Rm2LpH|0kiqUz*cx6b{f6~Yd*)ZRHjsf=a)*HXVdttK59M=iHrEUNL4!HG1o9HM zVWNSUA;G?W8+)X+$g=K{-^(lH6H?#s)8IfLVEBE717C)c<TO=p?g#OecAzOEdT8u| zxQB7U*m;&2<^_hS8YeeO)jizU?{F@$uFJWR)hFvg<_}rDvbW^6w{z}_&{}v<v1P=P z+JpKz#<8X@QJbQ=M7;uvmRGY)tPI@fo^sRRRc{gZd*?7`TjvbtMQ2HOz%$C<D3}o% zE$x?Kvr{c&Vu2cQfE$h6PY*c4k2rwb9gAQwjf=bi>iaq5mH##0FRm1G9C6RffbHT3 zx=UBCAF_$vWq$(l`oD;godR5^o!B{dhP|pStWa;UQ|^Y9d;oL6*zoMo)?j;NFmr_j zxh8PuUb5qax7uG!Y0-I>_OZKT7sl3)y%9avSWMFeSPfl56@1N{bF3$F<8r+@mYkj0 znc25<@7pT4T6*93dxl%9to%*Q5j|tvYm|&5OzliD#v}TB+DV#Q;tXEHTnStKjQ3l& z9%Doe$0A3(tE}f+Ur`{}Yz$SA;;>6gX6-EUCSl|{hr^^%$n$-dUC6$}p;jf>-xgs{ z|2Ou-A0mx_3eyk!&yAQp7c;96+xru870+evA&1jytb+pJ)digNzrzVk98OG<q4^<r zk1dtsq_e?7fpY$mfltAQ;T!U6pz&1|7wA_;6^mIK6C3j)rlRF*%UJUdhK=g>{4VBa z>4RVGx@TLKH!|;FZtt9<+4Hhhc}Hw{&LmF?vXK>*bJ;({VcPDxJfN<&F(#R=8|MJe z)}&jnX($$ATS?h|$@9>?+BM$!mE$YN9_Ljz1622q{>_15q21E8NJZ=>>mvJ=8;BuK z*-qF+_D26*#4=a~wr2i9UiEXpd})Pmj<ZdGchHS1&z56)z#5_hQde0-Bj3V4ya=-u z{h|!Uh}+noM^qlz{hvm*%YR7m;p(B6!N$lQDTN<OcjSsp7h$sQx@mCq&X_uu&6d@c z<d{#U-k7tybMZ_oc}sAXx3Ej?SZ@2;x;J-z&hVUbxtxu2o^jXq`2zK&Y}H&oT`Zzm ztr@Jnsr%Z{(>TJIVR)|Zu6w5L%a>3U4%ZCS@O}2YcgwDIt`DwMcbaFa_nmi)@0NdC zu!K|+-YMr)pH)*JtJA=uI><i5i9sgUhF`%?M+E&Kejxsez^r(JbCWU{>pif>bVsI^ z%fJ_1haL2F=?ZYf+95)_F;>QhkU{4Hd`U`S2YCg#vlB3?by8(8i-qZWDXOJqM(j4r zpV4E@?W3L`=h<bUDEEV^zg#vn-zT_#a)fMctVeU5*{!qroI!bipa<XfUi2r2>dI@F zOZ-BymU@x;u*RrAX<Qyv-~2IZg2}6&sF}>yQn|u2gW3MAzNOwao=NWF?w77lt^=;i zt|o4qXOn+)XutGC7LaM^bYzKY22&5GHTAjTd>mG^$HZbd6;Z2M^=I)BG9&7R58PIE z1~XhWJ<?vDC>;vV3cm;q3dzCv(3H?V<QTBXP0{Xw7^^zM=g5KcPFrM%syo|TY+@)E zy+5{G{1<TzfcxCd+`;rgUs;<gZsg<GWAdobdf#{MhxVa)XkX@)jB%L@vxB)yY(F`g zyZU<``0fRdN`c5-<{5WDT%{Xisu7)RsczXDGb%d4JkgY3n5tbS-r}yQvZQUn%Dy+Q zE{<k4!CE^{msiqiw6}BW-P=9aye<55gZ^-HWMUh{H5EFl>ub|=pY>e~V+^9<w!Vq} zuI`MsE5^PhJi`u()RDG@+6LeG*Z5X?OMBzJvUi04LqGr;&V0EOcEN|kZNeUD68l*< zE#_0gAIX=Kn<sn|Q_P%h{yuu5`H?ZKO%v~NNz72m?tkbiZ|#&dGwuFo=`)-DKJ$H! zXlvoP>ulxz)~gCU3e5vvi&>bU+h9H(XHB>t-`LVU>WG0cyfLgc2905ZpgSmdBmIK) zJkuTbt%khGx$Sd5<nGUFZJlcEXT4{gXMf`Q($C>Ef#+L^b2Za-afbHBb;g0lzYHhz zH+8SIPc=i4Z{l~(z<8x|!AHJPp1rQ_u5qr>?$w^N-dV`GX!CapJPx!A&J4F?D(X^V zn<iIFNh+RJct^tfxQzHxiKh~*u~W>u^l#Nw_?3}Dfhx|uIjzz+d^+*rmk)P87Ej%t zo{{-H`%`W+o7p+kQ#J53oTlQ%(uQj>w-b&h?N2yu>1uv!x)!xPI^N=mDH+|^XjNZe zUD7R}c*M9vj<WWewiDJQ>&x7+IjyoYvg+paw{~^5^5z7hq^hc`TygbsZHoTAzJy^B zP|jZ)-y0hk-|LI$4ypI^wV6lKzrnly1->`lh2A3GgPtxPlV`cRrF*6Ox@U*a5Ih;~ z9GSx|RX;YpinkT6ky5`{<>Uhi-^C{+1mnBKb&vku;8&05{i>vJCGSSt_AD{&=BHVo zE`4^UX){k`oy$I*!{()1>pB;BwV?@-XuiC*ylG&}53#Z(F6I{;Sf4Yuis@yEvNVh? zY?8Hm1V8ggULQIIRQDuzu5*xcj^n!RkGuyt+p=fn#9IUQ{jQB(OYo(%oLL9txXJ4K zniaYYhGM1<Cby}pDc$ggZlgMipQ2hI4GsxF2b%34@0;ws=jrIV;=bf=<ay;u^Vah> z3yug+j1=a6)3h;{OdMTgWKn%`Fy0r}EKyS^E@^+PChAYUUHeA!y-+1`$#=zmCwoV_ zFZEMuk2FtOm-GecmW(x-LiV|wc$?WZ$u~EAkJ%);b=^$$qsEvX8Q+;wqcdZFiPy&8 zvW$w>N4X6*b%)i%xO;M&P?^9?e^=xu47fWvdRcRGeYuzOMp_?OS^HLJN$-Qe;qYcT zJ5r75!}$f5=D2>GalJ9s@IgOXcV1&uZ{lw=O(RF8PvPp}xX|%{-S-nRc;E7*dH(h6 z_6!4NR5%bD?y6d*ITvkAI-k5XVQ_RwbJN(<3I8SvaZgOEu|n@_YG+6l`ba}PyKMjF z{*iMK5}K9wJf~GwMusb+W7hkeme!x_26x-Qba@K!GAC&#Yo@DD0l&M4>2}P5*w&U> z(e0z|8Xp+`);l$s{07DtnJHD3+DXAsiNIaY8s~cZX8R<^EXPboKj#<jqu#=S(#Y@a z4Qvh_!0Evh@dr%<puVPQOX;TI^q>*)c)#Hc>}up;`9?|)-tzDA9mV-gQExHtFmIAi z=Pw-Sj;yK`!cKXg*xl?&2o*Y!P#2lWQ)5df_D$#?Q`M+3j5fVO&wt9h!)v`3XHna{ zysmlQTZh;-<xPgOz{{+LIXiL#c`>$f&L)1nJe2J#3>JSBBK!}cq?u^g5*0L$H)mo7 z$cY+dVhuwzfA9;~f0!s{DfZMk;faA?ydB-AoXwpn&PxunbGz$%&s*<xpVOD(KaKOH zd65!qLw=0VQ#_}>s7cez)f`a&B}R!q0b%7Rdr@^v{w?eY&I%;@S>I-Fl&_O-zwd*u zov#B>g0=+fMM|mdQIF&1CG?BC7d<X|VC>|0V_bviN~V$~S5#;70K-_`9&YdZ!PUXh z(_YD57ud%y^Zv*_k@X;Ze$I`YpK|+HKRZtcsz?4}rUL;o6K9$}@rX7VS!k|DC7N%U z+eCLU-!}fPdnOL#8vz}#2eKzDiQEaT_P@e;SFTIrn&TYoJnH({Q_ow+Yxc%@hx*nA z_3|85J9Y~9BVSaE(IjXmXez5qikF2H<aPL+|B`(iSti{H9S!~v_~`r9JH}fSIcRJ8 z)&7IN9{%)zGc;SZRFh}k89zVan5D9LWAwVX(g|+MER(?yGPX2tkE)|Brdkqs@7e6y z;Fw~cZ~tIlZd;LCGkafl%iQeTA9B~^ZnvHBW=Ruauj$Je*xI~N-BqjC2MrfYo~R7- zmFO|ib)$ysJE<4(wfHH*7@;h8G?E)?h5YCa?;-ck&e4uE$625_r+O@&WA3V+p}ytV zf7O8}`f6q$S6XbL*^HCGdEyFjz50}9zD5$dvUMXZrNr>H;9vgk-j*Ia=D(xh#|WSo zpYY`br>mZ7N<<HhKObMo@`w3AO#Ap|306yV)R(3o%sJ8CsL|@TQWyyKjJu9=x4nqn zW&6(hAV<pjE&D*ukeu7uft)UmDS=0k;mla9dd9LAF-p5uC+lrSDeAZAzA-0brbKh5 znc9!QNGt@T-){vY<3JwI-hmUoMegB_miFHq9@iDm4iD=VTxVPpyyF93ga!Fv#KRos zlhiwawCYgjhz-=gXqMn)JXLga2~0wys&qVbGcd)+ds}#Q(7gWM3+{8SS?+~s)8EoQ zcC7wqi!rfO!oM+_%q=XDcqU;%Oy#Ih)SBqi(E|*h7<b^a_ljqj>xzAs?WOG+R#ooo z4q0Qfx99ZCS(4+hUiF-jcy<f(wdx>KStzMFpgpKNZ-_F#jxohrV?yTNO^<a+YCFFl z)`FUReZ~`Z2V(tAygrxD{(~*YzRtDX)7YErx!{U-xAGPV><&p%E7dl3qHtLKO!K$q zu6m*RrFyI8n)a}EmHIV*2cyoK@N;10eRl72yFH@MiM+?x-2b}EdoBK&p)@wucssUA zV%K<AOf}1@_?C%jvEN0_H2KVrVopS7Xx~PP2ikalcI~zG%-fLn#JbvAGOtZeyPOL- zC$nc~jm#<L+!CAw4A?3-$LoUi|8KfD{YHb^v?KbE<y35m*xYE*)L7#~cHWxUk-bAs zgc*T9e9_)S*N?V`xpT3iUhn+mp6zMn$@Yx*-3Y7*e-Ww2T;L?Jsji=)CURo@jWttS zjZ^bpGeGU)8?pl<_AoMp__n&6xgI(1yMA{kdY-xux!<^fa34GszAxA0{Q8rzWeeRY z^fq1<dm*lMV!6aWEhD22nodMDifW`wVfy&jIiqc^oG-J}v+w70%W0amFQZ~+r<|Yi z=I33>yX-g<_=$a^exhli`CZ!r`Hovgr9|(IS!F2~+ah+2Wm)teMwdF8y(^cL-%6#! z-}_IvKRedg|FZS6j>&zQQ!`Jt#k)uQh6S1hg-}Z=UA2c_s&;F?M~~cMY7^x&Z7@94 z9#QMX2|^0?!A<04!JEE1-sbM_omCv|>@)2Rodey2JcB&4r<VWM&_}rqQ(ycXwK36N zq-ilj;o6Cn5`{vW5)Z~~GKLISjW3Pmv|mSNdlpzjS<})VrQT25mT@*Sm{~US$INRv zI%`{Nimjcyuhdc8X2>vUqFD2*=<zYgu@RGCd2Lw|yD_%8Wo6VB-Fr?eJ@*d<K4c$H zZ&#W<*ZLx_c3y|vWjRL73GJNqeVsz%W%zh9PWFaS73Wwwoa&8;`qO;XeB7kbr>K1# z!yZ!gj?~J>Y)|k^cWIm|$2az7_9Kom?layiKz>~lSRA?~H)W#*qxzB2lJKVR(PEE^ zN=c34O$kF2Kg1R_{i402nWL$pUaIQst)4d}<KE|rpXPm*(?(<z%bc5aEBjgANvF-- z%hT4kU4Es07d1bwbo}nvjh0-?NQ*zFisfVU?5HKi=RkfRrk={g!I7?|ZLw{vJ=Pv$ zJCnC0FWJ_>9<is}YdQ|N)*yM;eD1LD64-Tz)eUuR4ZkBV%NNF_#skKZMoza>Xw96I zPKFXgK;`on!D_3mtB0$W>#TE;v$i|Q=L(d<ZgLkawOw!?oy2DgoyESI&E{8$rXqui zbWSP}yCXVe84~;2_*(c2+s91q7q(nzlw(x(59t>^J@_;*V`O%j?Ake#fN0;;y)MXx z<^=u<XYtn!ICn^Vm#{nTRNTtgk};E`8$?eq71giMR#LCx8mS%z&pNYmi{_rqZJ+n2 zwUF(1YbpC)=Kyy<SR()QP7N%NoEK6xZM4~%2bx@M2mMQZCw+$QS6yG-Y3)jNdHzvk za)<?P`D(8K%`4<db>DFJ^@!e$o_n4Kz6IEa+?DUC>fyw&6#tHE&;0}R*KV3A=0*wq zk`t2OCv1z2vV3W2Y96dD##iFH^2PW@%)?+K=Y*WgY3@%QKA+2|m6M)3!1}%Ys_Uum zM(|Sb>)=p%g3!u1z!IA<F5zIDY`Gb|Jj#QdEKPMU)X&68g3R8RH~4>b9L`;ub0RmA z*TB}#-pbj}?ZJ6)A^&v0Coo@n%k&m2!Fst&cVDN`4+Cnwgx%xU;#Bdn__J`5{Y{Pz zZS{9TX71L&Rj%e^{LB4`f%5^`FTlcnDljQ*jLcTmX9}?;xCh+#a2DCeh53<chp}Aj z*@PbxU&N2F6py-N@*;OyQGO;{kFCk1%4vc5&IY+(XO2kAO0AMvHn*SklKlr{F@NL} z!sUSrdr!4l9B6nDeKk(RT2>!(AZn-KPhGn9z1qQ-=H4@_BlB?PGssoV%H|cZ*0CRO z?sl*9l=n>x?86B0G_*e4LY~SL7fNeZYA0xmX)35!i=)L3Vm;tb781*fE?|LgRt=U` zLI>yj;{t^Pd;A;yW&M(`ia*w0#(&pe6{m$doE&}6TxO0i&zKJEJyziF2|LxV4OuZi z#XnAX8CN8xv1x+wN8@&#Ui_N#Gr%H{cLhecR^|Pk<xKC8{xb7eZZ+FAtgzp?zw^xq ziLx>BSoK7R)>kuYVz0*fW9mm&h<ayep|1(c@qOfI+s(i-EL96^c2Bjxw%)ec9e=xG zJ^PU9y{-RhV0o}(=zS<jIveT5RTj6aFJh-ZOFSX=Q*Tfk)jx|Z#TfCXu!~P)ewD@W z!eAhPJXN8ugF^y0;Bm0Y|JHxcuMeyYz6(E<lbELLuWSaxvR&BUks&^X8_IpdkI{@Y zahCFNKU(^l)yA9pP5K?$dBRt03kDfOBS*s_-zn!>Yp<MJS#5J_SbN&9I$~WG&pcnf z&=SdnGtXm8ig-zvW_oVkY+i)5`W?Mmw?(@~Qx|yzSFrP$DyqWrrQjCtLstct&z0zL zc@n)}dYfV0)+%5Q77DHj4hYYPbVe4xF*sAN0Zi_f;s*6I^%ks^?g__*mcV@-&zzJ0 z021d`pb{?#PY!JerT~9GEtnWe2-QR$_rJr}WIg<Yo+B@02_}>I6B)hD>^htUZRK;+ zFANRM-J?g~6ymu4iLR=ywq`fqiOqyXxI|=U__cqMdxj&{wmWZzHQ9c^@yJ=pearLQ zw>S7(cs?)y2dU<8HgTrzH$!>jLqm@Kpl-U>pv_QM5hwGzIF^e=Nh9PLq56R=Ut^!- zt>D|{z2WWcGXSIVU+|yu!<>e7_p_=nJA&H-ecCQ&iW%Z4v9P#T7$w}|*KwWLyQ=xH z$PSa=NNVZZ@UhUM5F4HhyyAV~dca^_FHeOXt0*G5roaPb4^HXNGgXn5C4^J0hs;H` zlo+RbYS>{sVfds=)V0xGQD5grvIk&~X{$npH|b{3=9`T9XovHK^Mh-#d$i|I?@Rxu z;IQym<lpQZPLW@#&TtlSsd}7drN*LJq;7;g#arP$KLDp_>-Z;p6Mg^-yeD~bSQB~$ zROiz`veaW-Sm@98`Me=-EC0M;d1-tkN0r4SAn(vV!6M!fMhLZp_K;vPp)ViH1sOm5 zpL;|O%dzrhX{&Th+5mgp4WR38Lxx8+&=MEIZqfy~i9;d>R9kSCxdXOs%Jdt{-4qjb zB@D+6{q?)GN!tAypLm6D%k2X)qz4G*)8zM|Yp}MK@>chpa1TKyz3+e`Tf^TYFf}k4 zzBdyBRl+|<eq)#McZ8GTSLzz-uIl~jW$N1M7vjI-apV$w2i)no>|xBi7WqWDW=IY! z2#gQJ2EIZjg*49)&opm;|MXz5@J;EmTvWB0iRK2umtvf79=NJMh_PZn;b&lR|IG%O zicBL_f8Zf+K-PpY@|ThtXyXGz@$e!VCXJGkr25E^xmbD(&x|dQ<Rn;@uOdfAaZR4S zlj(-3mGPop(v8u*)BGjQ0uJa^VKpCS`p7Av$9{vaJ@Nw0aEY!QXLlFtp6t1beNa!V zvOT_Gq2ZBD?0kNWFj*X?{;W1@nrhZ)Y?{8>joQB2tv~|4Bi!Ulup;w1k|G<zErW9d z-v<Kz{=T}N<*uHt)$T>!zQ_W@0!#X5xrJ&ybC=EJG(wVS7r#??Q=b-dg}%ZQV5uKP zzNHZSz9@5iro2r;-j7gKjK5RD_HY>ev$#|Vc~xh@${LY@6Q=ruxrshG9==W*UaOg* zZ)>b(%+;UAEcyufFn<%93T1`0LTMqF9UgfQY8rUqJL2u(spDSaI_x^;&i2egzK4?@ z)-%d8%-1h?R=TQs#TMt=37y0e>htQ?>IdqIKm+D=$902sK@F!aEllM;Gl<ubo`o(2 zR|8o)95DHJd5*fuz;8q6J>rx7lY$+?{p1>|I?N<yCexLD#my7ei=V^~*qt>JF9;4; z_A;5%@M=q7&N921bt=1DO&S(H9gdaG!1?n+s02Kn^s*P;6Dy<v^47>5RSD)2Vk$bQ zHZVi@f7B!45tFSq>Wk^tYV(jOt)1wF&sjgdJb#z1tMY}*2NwamccpIyGD_8VA8@zx zzVh|<PxH0&#v->%g`hp`lHq-;`js8Uo5WLMAMvE{Sn!KOG;OuTwO;iS@fU#+EPQA7 zUZjCEC1eP74|NPR3C{6nc>CcT)Z({deBBb*8C;Il{0vnx&KGJh*O||3CD=cg@-_HG zemSyRoa6^__Zd4Pyk;P0?qbB8wL@N^3qbu{Cy$g<@ERvqgzsZ@L;-JrwYxj`agO;J z$gp)8H#{KkVJz}u)ixHs5hsC>Ujo^pzK4ZrA#)E=1-lRtz5w2T|G>_89kF$7kc}!= z8YwlF#!CmK2U42k0~ed*XB<8OoBCZ@1+0`7h*53~|Ii7Dp*eupF?eo1fM2W!F$5IJ zp+WpjN1V&oMzluN{MZ-5OuLTzb|9AdCybO8BNq5VCcx*gH0;skBMnjFFpQlGQQ~QM zEV_{cx-)!b7Q)-`p~|6(hF4uOu)13?9hmy~<N=cDb;RutM@$G|e?39O%SuGt4+b_w z5>Rg$c&wI!Z$U-W)<9JOHkU8B7hG$8F24hQfMa1VUde@FD}B#&W&TA}kQM%<b3n%i z*(QC1EHY2R*TW~n`;kdSkUC2{U?;62PnJ*0F1ZDKb57>RCuX9(<j<XpsGV2vt9^nP zoekjTPw;1016~q_>M2AE-9|*rAw*9tf&c3^#9JN*t^XoQB>)dv!lSf+M+1Sta00ov zFXMFq*|bl>A7~pqbbo=}Z+X5CZGG5#O5x6ih>B_p-Vn-C2Uv9p@6LkLgW~wU1U!f( z$bqorDDLSEe0{aJW`Zr5@JPL|B~X0kSBUVL2%p%)@PT~>Yzha^ZYwaY;EB}>xZ#Q5 z?nC(RuFH?TtO&p32;xVsqBR>3akdVgS2N(l*Avma4I@P&0r?T~)$E5S>;~AVm%;O5 ztGo;Ttmousu(-y<d$=Y1g};M6Z!@CR4#AfBFZ`-ah~lY%xHUptX$gPdMrcVz%sqs{ zMKOhhAs7I)diZHnf(Erhoa0dVjf{n7@L<I0PJ}1NN?<o^KxF?$#GkK3&zKLtj!C#@ z5adY_$SQcY5+W!?COts>(p5-8iRyU*KW-1AsAAE!1n{mXYOV}=>f*U3h`DMD$_Q_P zFh>bbjSx90hK1;ffqgLrG_{1xW&u558+=SQ!^3z5JfRoD|70Y3Y8SMq7Ft0_Y|jwE zv>%*Xf(Y4R(DJ&l=Iel6?f@os0D8*er3T(}S>%uJ3?Io^@R9rj8g?1J*l$2RVb&7z z0ioqpgI{t3(AFrwXO)HQ38N?p+@i=6ir6Ud)2C+&<Nl_gvl-e%2yxvI%{K@!vQyx_ zI}NfWw4raIMeU&vwZQol@IwzzYeLkt=5tPo@v(slH%catb0x}$qT~q~j_^bYvy!4x z6u*B$kSh$XnsJ3Z^|AGU94Ll_Jme|Hldv4}P`(>}_7o9BKJbL*R~*_+7{m2JEk&T# z!{_SIhGJ-)jQa_D=N7m^m_~bG-6c)jh~HJ{_sj5Fj=wA6DYO&Ofv3^K2ov}rybeF- z*G2I$6bqn4Uyye{dF@ja40-L-i{cRoT{9Z(N<gip5#vU$GWabI+KS^EVW^RQQY>9@ zv@;1UEsX1h@R!hXqfi3*;H&W>PkbY;5jrp73lsioa=xy8f&Yr*Gx_Kf_egdW_dq`s zwcyH+Iv@-~iZW2*xhUp`FiE5Gb+!=7q8Fhk;_wGoDK3EGRh0NALi{C!U5ZwqcX|<K zW@dhwI2ORTpy1?67{Ta=B0MNUh$4NINC}FTAblc@QeuxNPKACTQ0N*(w-C~=g04la zrFK)~2#fD2vc&_=XP{P!%X<q+JVW#WMf|?O3&{5PeUI1*LVO{F%i#YcK@k}gSE9$O zfR{Sx07c&^k#qD7#jhz5B!n?cbrOe=pb#%YASEdhZg3&I7jTO>M*k(}U#F3mVl5Q( zUg91_Zz!=i#0>>gN{JaF^a_eWqo@{&cv0f_NOviYM0u8;COuNPM!H5=jTCD|y@<wM ziYlR(qIDG8LR3=}47FGJOKqnJk%9;#2@)ZMUpJm29?`oJ!9`aJkUmLbN_12~^ix5} zq!UW3s5XjqQR4HI-ayn4ZW2Yy6htKv-4tg;Emz|2s9h9ULt3D;kn})_)gd|4v-BU) zK>sP9D8ft86MBl;L=vJGeWGze`Ao8-7x7==AsUZQR0C-q)kRn6M|qB-is*Ue9j+sI zn(imw)BW^LSLlcCQK(kpxJcjWMO4z~g1e}0rTzjc6`3d;Q|eXjRa&k@ViDh!NH(QZ zkedHP?f&nV_^&)$zzKySMb`?Rp}+Ku!h0pwNug2sMxj+{PeF_R<CwxDg=Yn{6#OMV z6!4IEPc5W(<waMBH*^=(M>Uh|scqCcB??T51ytg&Xp|z!D6OKFk=*E2z)gidqK;}- zI9pJIqG?LMqHD^x1sYPI8>BCaHc(kg$qFCn32LW8?SE~gZ<R5WzAGqIDVIv47s-)+ zNe3zRi>@isDY&0XQA(%w(RT&fsp#o{T%(ed-t}M0Nmq$F(kyDZqKj0b!leSbls1vh z6E#XLN-OF8zt$E=jY=STlpm${DOU<gqEe_dk}Uly)G0L6J@iukQW-=eJ+H_{X=4Gu z=}x705nTm8N}CjYEU2IUQ(gtvNg7JK=^jNJ=}ARz3a-&NL_@)^qBZm^@r~{!?Vy^K zdkW}RT2XLa86yk+E6`wiLg9A7)5;x6>y?t|oxWAZ4El!3Qtl^?(KqxTjrj^E3OGbj zk@>gcE~TB+Mum$Cb&C8Hz87%3;2EXW%6;^_QV*4*{8GsUlqug9l==VvC29(;DB40b z(GQhG-zoo5SqkNJcfm6S^(nE)|6QlM6-t$N8gG<V(sgR1ay`G${5QH<@QhN9LbY<A z(gzf&5|{qd8l^mXnyyh%1?3Q(^qFW?e(1k~w*L2*o}m8}ekr|7`K-JvPb)MPNVMQ- zDwjS}{r{Jf|CbX5TrGHp{#VLTxTt(zz)|{7`6-}Use`W5b5yc2)+pLU?}~;f*Xg~W zHUG8ze?|VEKU9uFyCPM3PPt#9z2G~gJ{k|GR%OIe#y#Z;r8av1kCOjO4_&1ZL@AXh zqkENKS_#p;)Dx(+%2j$-Bt^YlSxM0PNm&IcbEVR+X?3a0F0|@URvI*F(=4iJ2{o8v z=_yj!jP)9!M@3<sMgLPTSNc7zTWomcVRcEE((kZ}%tqaW$xo|rQ+^4A;cdfrFYtPZ zJ>b*)_*cR?peW!{*dMjWsY!qAiTY!oR0n$(FYdmNUE(9$nGt!9S1L*-lmtR0&qO(d z#D59rCD*Z@C5(>@tixzMS`wu-z%FYbcBkKBe_aEsP33w`>=~+J_tg=5*F}i4EsAyZ zEu12Z!4A3sPASS@-}fWV29CkUlhAM*V6R&iJ6=Lr8irG!1wblWj6LpJ>^5iR)A}X$ zBuPN6d5PWhY0!EPJ50j+pcrMs)F<qHLeM6RRDC`w3UOP;cQk8iu{!sFb_Z79v=^gQ z<-a(mAcVB%kSgIZ3wU<}_u@1D_vY^-o?-v|0w*&cAhm3)-9LcawtT5k)VYi}Btqnl z;28#O=#PCI;T>JVdB_x;`J4go8Avh_d`<vo43KdcdjmrEaU(vJcHM;C-xT){dL!)` zXlF(U79a6T7zD*ZQx101SFxL*wLS5-7|wr+V?V_LiARl6h;M!JdEEr^NC1+bAE-RN z@J)5xM`s~~to;-`dxFyAu#Y1o(u(=mK$H(4fZDXU-V9Rgib&j<IBjT#witi_Mp$2j ztaJjrPK2ae10jZX6zTb=TBpG~LJ#&J&Y}Za(+d0R5!hLmgd9%b%mluW*yHnv$#^MW zlpo5)a5B;s@h?qrUPQ>eyC5NYs=X=&biTl;+Inc&S?rfe<0Ne$UQM74{cwUwSi<F@ zQCh^Z>_r^#YV3FkuPy?_uYTCqkHh%`q53AGbr!U(7qn&<kk+z+4=Ulr=O-X?5zg6H z(6Ab~{~RJ~`Y~z9xVD28xN6A6yMg<Wi{j?7P1se4T;7ZNR^wEnL*zV8c1|JdT39M1 zFOup>ZIG*LarjbrMfi_!PS_tFh)h*QaPBi0`|klbL9(iPz$g6x&S!_fOSvwrRp;ef z(%0}0yB=N{)=Flnixe#{g|BaSoQ;gYu6`Q!^RIw~^#VH+8+54*q}CqX?1zZuJ1W0w z7|u3LY)7^y;vU{II%cG5BjQ%N%Bj*x>6O$CQPg)L^Hgt<W%3lWoY}`5MOLg0$l&B- zZsQDa75jp1%IWyUJcq2oYs56MxB5GEeYHk?Ui?D*LD<3@`G47dOnvxh$>C?n2;Lc4 z(yYF3e6m;V>+E~sYv&L87YB|YBV+?)O??rbiTG^+6#t2Al>6DeTz@RT{uVw9hlHiD z&1~iRu?JN<Wv#R|lnhVwT)*F6FHi>gKHrAqa8Y>{ED$wdHF_<Vz)4zBw0J(^v(GYL zA*1QP@DR^n|3dcO7fe-VKV-TG=ZfDVKJp;4o4u57OV#8n(j}bY_mD5i7y(tkGqYe3 zn9u(pi0bb&Rdl}_hMBrWy@e;l>Zpk6OVfLUUjIt-NNCEmk)8zNysca(9F6RqZR2e> zY#PKe^>$Wqb#}i+2F*{t6M>PT-qIyx7UhN7>R#GpeRV?(<9Xv`quJQf@Q?0>=7G3} zFTw7LjF(mfJ-*6b!M)J=+Ofm28-9L^T-V)wy+8ZE3Km0_-*XWjE&7(LfOzZ}aSyT` zj|R_K^-`SUAB5-kI^>l+D4h#^iEOJ${#(9(d>0W@TO{BJyb88J-qz-ka?CzfFBI20 zjhkYU<C`RIO}d*jFsXXt!1!yH$x+X>pSVuaG4FcEg*-=gW>%@}x!Ij_D&(Hat&um{ zdf4{HzQmaYTkor2qsTihR@=n1Bj#h=^@MGSWfE`3mx>F<G%&X|M(Ku#N7)IH&!N%& zM9&WnXI@_Roy;K_n=`6rP0OibUFRt6S>=xpmx`={C(yUT5K)GI-zZIU?T@;Z`rd}+ zhL8Grx)Yk3VpC47IvMT|804+yKIS~_FgW)iL;Yq%eQbrzGDq6MHP-Klu_R3`qDpC9 zymE0q<+md4#LAYLhTcM3d82Q*GsoH?_b|M7PiHpBu%|spt&ti?wPa*wZO@zJ?B;(d zyM+~oSusZwIwhAb;w=1Ya%|GxxRWvVs5OQz+S9^zhL`IFTYLLC%Ubtlzs=~CUMk(5 z-X!aB?q&NqcWZxCsIyc!vRU;Nd!B19JVqw#mAX3yujzM0F7-0sHht9B(bVKEs{Ucg zU(6ft{>^#cG1##l-kUo;#(+2cFZZMVL`*2Ldtr6aoFeYz?TH;@r$&v}%@@tAQ>qaZ zz2#gB>^H5cxudg3XZTX@eV&t=knv~s6YG0d)4<S3bK$(Uf$?C}#^?o>e`7UqZ(<{s z>6T5Fs+OOlj~KVB2QvQPx1PcF>p619^0cV5rRgiOI_LJcZFg?-toI)ZriU(uznA(& z$|8PcfM%{PTYuOv$7nRoGv3zQw2RaR@wjl2H}N;wo+_8LD|FU>+OyMj)G^+1#PeJD zIN#m))Y2{CM&h1?)3FQ9tMygYuepkB6{d))ZDh85G@Ki37%1e8aX!k^WY^7XlXW}y zgyUatTClEMml?qw<BJF`KFr?|dZ@q9me#ur2aHEeH=-Iu^)uemHsbk+5PIo*?5X9R z?5yfo2S3Jjjw;Su&c28iNJfVHE`jdhsgaIse}UIj(H_xm*US)i@a;G^qBfgxr?`(? zHg^!2WOu0~=}xeof4O&tr?}^-cZ2kkSTQOkzFna;$;nA3%QHhoO(#B{+t23+I<+LK z`KqdI!TavB_H((lvi7A<O`DfKJZC-*nJ+{Jvvs%*EQ_(6W9;l%F<sX;N^hANn}X=B zyT(sCgZc-KQ4J6E_y6Ym)7LhT6l~#N=NaMbXuF?xGq0X)th1)q7HA`Fh_q&mz@oUq z&EbC*ri-_c&pjf(65om*alJ5<Z^_P#ya~4tj`A<_{_ZL1e&!nMs^aeDO9&0;ryJMC z?ki*}{Co1y#AlWT=08kkQzc_RlU4s#^M&w8dgLGFG~{`*eoH@`dg}Avsj2BpaxU9T zdYS~PBcp3tsGL-h=`HNmrA9T5eH*_g;bDA2?9J%%Q8x^GbPd#(_?Jw@$S~<c@QmN( z8SUh4Kj%Km&dBbTyUxlxMR>2T4lG2B-}CTgxhwNMUqu~*EXn2cqxHQ0iguf3y?B^! z$u(qB;NSZ$7!~;Jo97+u8R|Ldy%#RdH#a=Dtc*V%-@r1_*g`8I9zI56*G<!>>fdNv z@|lsXfhX>g&NOSgyw|y^ypGnvj%-&suM;^^^DuWTgU8?KFy?Q;t37ROYCdRAh<ah@ zgRvqE>*y9uEzN25YvgX8%U+Ij466d;yjnzyjd8YgR(8p*p!+iXF%EdQ`b>d#p>py* zm4VCPSy2*esPBj&A)SBEP3Br5+j|UhHu8}L(jsJ8Y#AyaekTuO�>#x|`0LdK;E# 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�K`;d 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%0Aa|ysQtw9?Jm=RAurk1wUxI@-wtM1m4?4ymbe_ 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 p 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 Xaf~|uVzT#6WO-TaYtHnpVb=X0yU);H literal 0 HcmV?d00001 diff --git a/WavLLM/wavllm/test_data/dict.txt b/WavLLM/wavllm/test_data/dict.txt new file mode 100644 index 0000000..d328f21 --- /dev/null +++ b/WavLLM/wavllm/test_data/dict.txt @@ -0,0 +1,5 @@ +1 1 +2 2 +3 3 +4 4 +5 5 diff --git a/WavLLM/wavllm/test_data/emo.tsv b/WavLLM/wavllm/test_data/emo.tsv new file mode 100644 index 0000000..eff6a3e --- /dev/null +++ b/WavLLM/wavllm/test_data/emo.tsv @@ -0,0 +1,2 @@ +id audio n_frames prompt tgt_text with_speech +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/emo.wav 12345 Can you describe the emotional condition of the speaker in the provided audio clip? sad True diff --git a/WavLLM/wavllm/test_data/en2de.tsv b/WavLLM/wavllm/test_data/en2de.tsv new file mode 100644 index 0000000..7f9ce5a --- /dev/null +++ b/WavLLM/wavllm/test_data/en2de.tsv @@ -0,0 +1,2 @@ +id audio n_frames tgt_text prompt with_speech +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/st.flac 34560 Sie wird schon in Ordnung sein. Translate the audio clip into German. True diff --git a/WavLLM/wavllm/test_data/gaokao.tsv b/WavLLM/wavllm/test_data/gaokao.tsv new file mode 100644 index 0000000..eeccefe --- /dev/null +++ b/WavLLM/wavllm/test_data/gaokao.tsv @@ -0,0 +1,2001 @@ +id audio n_frames prompt tgt_text with_speech +short_conv_1 gaokao_audio/short_conv_1.wav 111111 What will the man do next? A. Start to take exercise; B. Do as he always does; C. Change his working time. A True +short_conv_10 gaokao_audio/short_conv_10.wav 111111 What does the woman want to do? A. Mail a letter; B. Use the restroom; C. Find the police station. B True +short_conv_100 gaokao_audio/short_conv_100.wav 111111 What does the woman suggest the man do? A. Quit smoking completely; B. Resist the temptation of smoking; C. Be careful of smoking. B True +short_conv_1000 gaokao_audio/short_conv_1000.wav 111111 What do we know about the woman? A. She plays tennis well; B. She seldom plays tennis; C. She plays tennis regularly B True +short_conv_1001 gaokao_audio/short_conv_1001.wav 111111 Who is wanted on the phone? A. John Smith; B. Chris Watson; C. Sarah White. B True +short_conv_1002 gaokao_audio/short_conv_1002.wav 111111 What time is it now? A. 7:00; B. 7:45; C. 8:15. C True +short_conv_1003 gaokao_audio/short_conv_1003.wav 111111 What does the man think of Zhao Benshan? A. Rich B. Wise C. Funny C True +short_conv_1004 gaokao_audio/short_conv_1004.wav 111111 Who supports human cloning? A. The woman B. Lucy C. The man B True +short_conv_1005 gaokao_audio/short_conv_1005.wav 111111 What is the woman going to do this evening? A. Go to dinner B. Visit her sister C. Go to the airport. C True +short_conv_1006 gaokao_audio/short_conv_1006.wav 111111 What are the speakers talking about? A. Using English in everyday life; B. Learning a foreign language; C. Making a piece of cake. B True +short_conv_1007 gaokao_audio/short_conv_1007.wav 111111 what does the man mean? A. The woman can use his pen; B. He is reading a book; C. He will buy a pen for the woman A True +short_conv_1008 gaokao_audio/short_conv_1008.wav 111111 What do you know about the woman? A. He likes volleyball; B. She doesn’t like basketball; C. She likes sports, too. B True +short_conv_1009 gaokao_audio/short_conv_1009.wav 111111 What does the woman mean? A. She likes doing morning exercises; B. She can’t get up early; C. She dislikes doing such exercises. B True +short_conv_101 gaokao_audio/short_conv_101.wav 111111 What probably happened to the man's girlfriend? A. She broke her leg; B. She broke up with him; C. She was in bed with the flu. A True +short_conv_1010 gaokao_audio/short_conv_1010.wav 111111 How are Tom’s skills? A. Excellent; B. Just so-so; C. Very bad. A True +short_conv_1011 gaokao_audio/short_conv_1011.wav 111111 How long did the game last? A. About two hours; B. About two hours and a half; C. About three hours. B True +short_conv_1012 gaokao_audio/short_conv_1012.wav 111111 Which ball game does Jack play best? A. Volleyball; B. Ping-pong; C. Tennis. B True +short_conv_1013 gaokao_audio/short_conv_1013.wav 111111 What is the conversation mainly about? A. The woman’s phone; B. The woman’s new sound system; C. The woman’s favorite music. B True +short_conv_1014 gaokao_audio/short_conv_1014.wav 111111 Why did the man apologize? A. He incorrectly guessed the baby’s age; B. He mistook the woman’s boy for a girl; C. He made a comment about the baby’s hair. B True +short_conv_1015 gaokao_audio/short_conv_1015.wav 111111 How much more will the woman have to pay? A. 3 pounds; B. 5 pounds; C. 8 pounds. A True +short_conv_1016 gaokao_audio/short_conv_1016.wav 111111 Where are the speakers probably? A. In a restaurant; B. In a hotel; C. At home. C True +short_conv_1017 gaokao_audio/short_conv_1017.wav 111111 What will Mrs. Williams do later? A. Give Mr. Anderson a call; B. Attend a basketball match; C. Pass on a message. C True +short_conv_1018 gaokao_audio/short_conv_1018.wav 111111 What are the speakers mainly talking about? A. Preparing for a test; B. Eating during an exam; C. Getting a medical exam. B True +short_conv_1019 gaokao_audio/short_conv_1019.wav 111111 What is the probable relationship between the speakers? A. Father and daughter; B. Classmates; C. Teacher and student. C True +short_conv_102 gaokao_audio/short_conv_102.wav 111111 Who gave the woman a haircut? A. Her coach; B. A barber; C. Her friend. C True +short_conv_1020 gaokao_audio/short_conv_1020.wav 111111 When does the man usually do exercise? A. In the afternoon; B. In the morning; C. At night. B True +short_conv_1021 gaokao_audio/short_conv_1021.wav 111111 What did the woman do today? A. She cleaned the car; B. She bought an umbrella; C. She listened to the weather forecast. A True +short_conv_1022 gaokao_audio/short_conv_1022.wav 111111 What fruit does the woman use? A. Pears; B. Oranges; C. Bananas. C True +short_conv_1023 gaokao_audio/short_conv_1023.wav 111111 What will the woman probably do next? A. Go shopping; B. Look at the homework; C. Go to Hannah’s birthday party. A True +short_conv_1024 gaokao_audio/short_conv_1024.wav 111111 What are the speakers talking about? A. Where their tent is; B. Where to set up the tent; C. How to recognize different trees. A True +short_conv_1025 gaokao_audio/short_conv_1025.wav 111111 What does the woman offer to do? A. Help the man’s wife find a doctor; B. Call an ambulance; C. Take the man to the hospital. B True +short_conv_1026 gaokao_audio/short_conv_1026.wav 111111 What will the girl be doing tonight? A. Watching a film; B. Reading a novel; C. Eating a meal in the cafeteria. C True +short_conv_1027 gaokao_audio/short_conv_1027.wav 111111 Where will the man find his car keys? A. On the bookcase; B. In his pocket; C. On the coffee table. C True +short_conv_1028 gaokao_audio/short_conv_1028.wav 111111 What do we learn about the speakers? A. They are unwilling to wait for Jack; B. They can’t see Jack’s grade; C. They are eager to see Jack’s reaction. C True +short_conv_1029 gaokao_audio/short_conv_1029.wav 111111 What does the man think the weather will be like? A. Fine; B. Rainy; C. Cloudy. B True +short_conv_103 gaokao_audio/short_conv_103.wav 111111 Where does the conversation most probably happened? A. At a snack bar; B. At a photo studio; C. At a fancy restaurant. A True +short_conv_1030 gaokao_audio/short_conv_1030.wav 111111 What does the man imply? A. The woman speaks English very well; B. The woman has a strong French accent; C. The woman must be from France. A True +short_conv_1031 gaokao_audio/short_conv_1031.wav 111111 Why does the man apologize? A. He has lost the book; B. He has forgotten to bring the book; C. He has brought the wrong book. B True +short_conv_1032 gaokao_audio/short_conv_1032.wav 111111 How is the woman feeling? A. Ill; B. Hot; C. Cold. C True +short_conv_1033 gaokao_audio/short_conv_1033.wav 111111 What is the man’s reaction to the woman’s words? A. Anger; B. Impatience; C. Surprise. C True +short_conv_1034 gaokao_audio/short_conv_1034.wav 111111 What does the man plan to do in five years? A. To leave the company; B. To manage the company; C. To start his own company. B True +short_conv_1035 gaokao_audio/short_conv_1035.wav 111111 What does the woman imply? A. She doesn’t appreciate John’s humor; B. She used to understand John’s humor; C. She doesn’t have any sense of humor. A True +short_conv_1036 gaokao_audio/short_conv_1036.wav 111111 What is Robert’s occupation now? A. Novelist; B. Reporter; C. Secretary. A True +short_conv_1037 gaokao_audio/short_conv_1037.wav 111111 Why was George at the hospital? A. His wife was sick; B. His wife just had a baby; C. He was visiting his daughter. C True +short_conv_1038 gaokao_audio/short_conv_1038.wav 111111 What is the woman most probably doing now? A. Reading downstairs; B. Sleeping downstairs; C. Sitting upstairs. C True +short_conv_1039 gaokao_audio/short_conv_1039.wav 111111 What does the boy want to have? A. Green peaches; B. Red peaches; C. Red apples. B True +short_conv_104 gaokao_audio/short_conv_104.wav 111111 Why does the woman look upset? A. Her purse was stolen; B. She was given a parking ticket; C. She couldn’t find a parking space. A True +short_conv_1040 gaokao_audio/short_conv_1040.wav 111111 How many people will go to the museum together? A. Three; B. Five; C. Six. C True +short_conv_1041 gaokao_audio/short_conv_1041.wav 111111 Where is John’s father? A. At work B. At home; C. At schoo1. A True +short_conv_1042 gaokao_audio/short_conv_1042.wav 111111 What are the speakers talking about? A. Banks; B. Money; C. Cards. B True +short_conv_1043 gaokao_audio/short_conv_1043.wav 111111 What will the man do? A. Invite his friends; B. Prepare some food; C. Go pack the car. C True +short_conv_1044 gaokao_audio/short_conv_1044.wav 111111 Why didn’t the man go to the exhibition? A. Getting tickets would take too much time; B. He didn’t care for Da Vinci’s paintings; C. The ticket was too expensive. A True +short_conv_1045 gaokao_audio/short_conv_1045.wav 111111 What does the man mean? A. The dish is new on the menu; B. The dish is a good bargain; C. The dish is quite healthy. B True +short_conv_1046 gaokao_audio/short_conv_1046.wav 111111 What is the weather like now? A. Sunny; B. Windy; C. Rainy. C True +short_conv_1047 gaokao_audio/short_conv_1047.wav 111111 When did the man visit Yellowstone Park? A. This year B. Last year; C. The year before last. A True +short_conv_1048 gaokao_audio/short_conv_1048.wav 111111 What are the speakers talking about? A. Their living place; B. Their children; C. Their hobbies. A True +short_conv_1049 gaokao_audio/short_conv_1049.wav 111111 Why is the man excited? A. Because he's got a driver's license; B. Because he's sold many tickets; C. Because he's going abroad. C True +short_conv_105 gaokao_audio/short_conv_105.wav 111111 What’s the probable relationship between the speakers? A. Teacher and student; B. Father and daughter; C. Classmates. A True +short_conv_1050 gaokao_audio/short_conv_1050.wav 111111 How does the son feel at the very moment? A. Tired; B. Hungry; C. Disappointed. B True +short_conv_1051 gaokao_audio/short_conv_1051.wav 111111 What subject does the woman like best? A. English; B. Physics; C. Math. A True +short_conv_1052 gaokao_audio/short_conv_1052.wav 111111 What will the woman do? A. Make tea for Tom; B. Have a cup of coffee; C. Make tea for herself. C True +short_conv_1053 gaokao_audio/short_conv_1053.wav 111111 How will the woman probably get to California? A. By air; B. By bus; C. By train. B True +short_conv_1054 gaokao_audio/short_conv_1054.wav 111111 What would the girl like to have as a pet? A. A fish; B. A cat; C. A dog. C True +short_conv_1055 gaokao_audio/short_conv_1055.wav 111111 What is the woman worried about? A. A job interview; B. Going out to dinner; C. Talking to her co-workers. A True +short_conv_1056 gaokao_audio/short_conv_1056.wav 111111 What is the man’s advice to the woman? A. Buy a new TV; B. Get her TV fixed; C. Watch TV all the time. A True +short_conv_1057 gaokao_audio/short_conv_1057.wav 111111 Whose computer is broken? A. Bob’s; B. Bill’s; C. David’s. C True +short_conv_1058 gaokao_audio/short_conv_1058.wav 111111 What are the speakers mainly talking about? A. Lifestyles in New York; B. Some health problems; C. The heavy traffic. C True +short_conv_1059 gaokao_audio/short_conv_1059.wav 111111 What does the woman probably think of working while in college? A. Useful; B. Difficult; C. Unnecessary. A True +short_conv_106 gaokao_audio/short_conv_106.wav 111111 When will the speakers discuss the matter again? A. On Wednesday; B. On Friday; C. On Thursday. C True +short_conv_1060 gaokao_audio/short_conv_1060.wav 111111 Why was the man late? A. He didn’t feel well; B. He set off late; C. He got lost. C True +short_conv_1061 gaokao_audio/short_conv_1061.wav 111111 Where does the woman work? A. In a post office; B. In a hotel; C. In a cafe. B True +short_conv_1062 gaokao_audio/short_conv_1062.wav 111111 What will the man do first? A. Have some coffee; B. Return a book; C. Write a report. B True +short_conv_1063 gaokao_audio/short_conv_1063.wav 111111 Where does this conversation probably take place? A. At an airport; B. At home; C. At a department store. A True +short_conv_1064 gaokao_audio/short_conv_1064.wav 111111 Why did the woman thank the man? A. He lent her some money; B. He paid the five-pound bill for her; C. He returned the money he found to her. C True +short_conv_1065 gaokao_audio/short_conv_1065.wav 111111 What is the woman probably going to do? A. Throw the paper away; B. Read the paper through again; C. Rewrite the paper. B True +short_conv_1066 gaokao_audio/short_conv_1066.wav 111111 How will the man travel to London? A. By car; B. By train; C. By bus. C True +short_conv_1067 gaokao_audio/short_conv_1067.wav 111111 What will the weather be like at midday tomorrow? A. Stormy; B. Cloudy; C. Thundery. B True +short_conv_1068 gaokao_audio/short_conv_1068.wav 111111 Where does the man most probably work? A. In a shop; B. On a farm; C. In an office. A True +short_conv_1069 gaokao_audio/short_conv_1069.wav 111111 Who is Miss Jones? A. The man’s classmate; B. The man’s teacher; C. The man’s sister. B True +short_conv_107 gaokao_audio/short_conv_107.wav 111111 What is the purpose of the woman's call? A. To ask about a bill; B. To pay the gas bill; C. To open a new account. A True +short_conv_1070 gaokao_audio/short_conv_1070.wav 111111 When will the speakers meet? A. On Wednesday B. On Thursday C. On Friday C True +short_conv_1071 gaokao_audio/short_conv_1071.wav 111111 How much will the woman pay? A. $12; B. $30; C. $42. C True +short_conv_1072 gaokao_audio/short_conv_1072.wav 111111 What will the speakers do after watching a movie? A. Have dinner; B. Type the reports; C. Help Tony with his work. A True +short_conv_1073 gaokao_audio/short_conv_1073.wav 111111 Where are the speakers? A. At a bus stop; B. On a bus; C. In the man’s home. B True +short_conv_1074 gaokao_audio/short_conv_1074.wav 111111 What are the speakers mainly discussing? A. A car crash; B. A funny guy; C. A car advertisement. C True +short_conv_1075 gaokao_audio/short_conv_1075.wav 111111 How is the man going to pay for the car? A. By earning money on holidays; B. By asking his parents for money; C. By borrowing money from the woman. A True +short_conv_1076 gaokao_audio/short_conv_1076.wav 111111 What will the woman have? A. Fried rice; B. A sandwich; C. Pizza. B True +short_conv_1077 gaokao_audio/short_conv_1077.wav 111111 What are the speakers talking about? A. A class B. A trip C. A city B True +short_conv_1078 gaokao_audio/short_conv_1078.wav 111111 What is the woman doing? A. Having an interview; B. Selling a typewriter; C. Doing some typing. A True +short_conv_1079 gaokao_audio/short_conv_1079.wav 111111 How much will the man pay in total? A. ﹩70 B. ﹩60 C. ﹩50 C True +short_conv_108 gaokao_audio/short_conv_108.wav 111111 What did the woman just do? A. She argued with the man; B. She shouted at another woman; C. She left her work to someone else. B True +short_conv_1080 gaokao_audio/short_conv_1080.wav 111111 Where is Butch now? A. At a friends house B. In his office C. At home A True +short_conv_1081 gaokao_audio/short_conv_1081.wav 111111 What colour is the dress? A. Blue B. Yellow C. Green A True +short_conv_1082 gaokao_audio/short_conv_1082.wav 111111 What does the man think about Jennifer? A. She is like many other people B. She always keeps her word C. She is tougher than men B True +short_conv_1083 gaokao_audio/short_conv_1083.wav 111111 Why did the woman decide to use a bike? A. To protect the environment; B. To pay her tuition C. To improve her health B True +short_conv_1084 gaokao_audio/short_conv_1084.wav 111111 What is the probable relationship between the speakers? A. Husband and wife B. Waiter and customer C. Doctor and patient C True +short_conv_1085 gaokao_audio/short_conv_1085.wav 111111 How much at least does one shirt cost today? A. $60 B. $40 C. $30. C True +short_conv_1086 gaokao_audio/short_conv_1086.wav 111111 What does the man mean? A. He failed the exam B. He studied very hard C. The exam was too easy A True +short_conv_1087 gaokao_audio/short_conv_1087.wav 111111 What are the speakers mainly talking about? A. A strange belief; B. The habits of bees; C. A visiting friend. A True +short_conv_1088 gaokao_audio/short_conv_1088.wav 111111 What will the man do next? A. Watch a show; B. Take a shower; C. Continue reading. C True +short_conv_1089 gaokao_audio/short_conv_1089.wav 111111 How has the weather been recently? A. Cold and rainy; B. Hot and dry; C. Windy and dry. B True +short_conv_109 gaokao_audio/short_conv_109.wav 111111 Who might the man be? A. A crew member; B. A doctor; C. A taxi driver. A True +short_conv_1090 gaokao_audio/short_conv_1090.wav 111111 How many people are having the meal? A. Two; B. Three; C. Four. C True +short_conv_1091 gaokao_audio/short_conv_1091.wav 111111 What is the cat’s main color? A. Black; B. White; C. Gray. A True +short_conv_1092 gaokao_audio/short_conv_1092.wav 111111 What do we know about the man’s apartment? A. It is not quiet enough; B. It is near the train station; C. It has a good view of the park. A True +short_conv_1093 gaokao_audio/short_conv_1093.wav 111111 Where did the man go yesterday? A. The hotel; B. The office; C. The airport. B True +short_conv_1094 gaokao_audio/short_conv_1094.wav 111111 What is the woman’s red jacket best for? A. The rainy days; B. The windy days; C. The warm days. C True +short_conv_1095 gaokao_audio/short_conv_1095.wav 111111 What would the woman probably order with chicken? A. White wine; B. Red wine; C. Beer. A True +short_conv_1096 gaokao_audio/short_conv_1096.wav 111111 What will the woman probably write her name with? A. A pencil; B. Her finger; C. An electronic pen. B True +short_conv_1097 gaokao_audio/short_conv_1097.wav 111111 How much will the woman pay for one chair? A. $ 59; B. $62; C. $65. C True +short_conv_1098 gaokao_audio/short_conv_1098.wav 111111 What is the probable relationship between the two speakers? A. Professor and student; B. Hotel manager and tourist; C. Salesman and customer. A True +short_conv_1099 gaokao_audio/short_conv_1099.wav 111111 What will the man probably do next? A. Go back to his work; B. Eat out for lunch; C. Pick up Jenny. B True +short_conv_11 gaokao_audio/short_conv_11.wav 111111 What does the woman mean? A. She missed the travel; B. The travel was a failure; C. Bob didn,t travel with them. C True +short_conv_110 gaokao_audio/short_conv_110.wav 111111 How does the woman probably feel now? A. Excited; B. Worried; C. Stressed. A True +short_conv_1100 gaokao_audio/short_conv_1100.wav 111111 What did the woman think they would do? A. See an exhibition; B. Have a meeting; C. Attend a lecture. A True +short_conv_1101 gaokao_audio/short_conv_1101.wav 111111 Where does the conversation probably take place? A. In a clinic; B. In a hotel; C. In a store. C True +short_conv_1102 gaokao_audio/short_conv_1102.wav 111111 What does the woman tell the boy to do? A. Tell the truth; B. Read newspapers; C. Question the news. C True +short_conv_1103 gaokao_audio/short_conv_1103.wav 111111 What is the man going to do tonight? A. Go to the concert B. Write a report; C. Stay at home A True +short_conv_1104 gaokao_audio/short_conv_1104.wav 111111 Why is the woman so tired? A. She is overweight; B. She docs too much exercise C. She is on a diet. C True +short_conv_1105 gaokao_audio/short_conv_1105.wav 111111 Where are the two speakers? A. In the room; B. At the front desk; C. Outside the hotel. A True +short_conv_1106 gaokao_audio/short_conv_1106.wav 111111 Why did the woman feel surprised? A. The man solved a mystery; B. The man achieved a high score; C. The man won a prize. B True +short_conv_1107 gaokao_audio/short_conv_1107.wav 111111 What is the man going to do? A. Move to the countryside; B. Live in a large city; C. Have a holiday. B True +short_conv_1108 gaokao_audio/short_conv_1108.wav 111111 What does the man mean? A. He doesn’t feel hot at all; B. The woman is very considerate; C. The air conditioner can be used. C True +short_conv_1109 gaokao_audio/short_conv_1109.wav 111111 Why does the man like hiking? A. He can get close to nature; B. He likes wild animals; C. He can make friends. A True +short_conv_111 gaokao_audio/short_conv_111.wav 111111 What does the woman mean? A. The man should lock the car doors; B. The man should let his dog out of the hot car; C. The man should take his baby into the store with him. B True +short_conv_1110 gaokao_audio/short_conv_1110.wav 111111 Where does the talk possibly take place? A. In a meeting room; B. At a patty; C. In a clothes shop. C True +short_conv_1111 gaokao_audio/short_conv_1111.wav 111111 How did the woman book the tickets? A. Over the phone; B. Through the Internet; C. At the ticket office. B True +short_conv_1112 gaokao_audio/short_conv_1112.wav 111111 What is the man likely to do on Friday? A. See the new exhibition; B. Watch a baseball game; C. Finish a report. C True +short_conv_1113 gaokao_audio/short_conv_1113.wav 111111 What are the speakers mainly talking about? A. The weather this year; B. Water conservation; C. The importance of washing. B True +short_conv_1114 gaokao_audio/short_conv_1114.wav 111111 How much will the woman pay for the T-shirt and the jeans? A. $10; B. $20; C. $30. C True +short_conv_1115 gaokao_audio/short_conv_1115.wav 111111 What do we know about the woman? A. She has a fever; B. She looks very tired now; C. She fell asleep in an outdoor chair. C True +short_conv_1116 gaokao_audio/short_conv_1116.wav 111111 What will the woman do right after she types the letter? A. Havea meal; B. Change her clothes; C. Take the car. B True +short_conv_1117 gaokao_audio/short_conv_1117.wav 111111 What is the weather like today? A. Rainy; B. Cloudy; C. Sunny, C True +short_conv_1118 gaokao_audio/short_conv_1118.wav 111111 Where does the conversation take place? A. In an army; B. At a restaurant; C. In an office. B True +short_conv_1119 gaokao_audio/short_conv_1119.wav 111111 When should the woman return the book according to the man? A. This Saturday; B. Next Friday; C. Next Tuesday. B True +short_conv_112 gaokao_audio/short_conv_112.wav 111111 What does the man want to do with the money? A. Hire a babysitter; B. Go to a performance; C. Join an educational program. B True +short_conv_1120 gaokao_audio/short_conv_1120.wav 111111 How much should the woman pay for the books? A. $ 10; B. $20; C. $30. C True +short_conv_1121 gaokao_audio/short_conv_1121.wav 111111 What color is the shirt? A. Yellow; B. Green; C. Blue. C True +short_conv_1122 gaokao_audio/short_conv_1122.wav 111111 What are the speakers mainly discussing? A. Washing the woman’s dirty clothes; B. Folding clean clothes; C. Doing Ben’s laundry. C True +short_conv_1123 gaokao_audio/short_conv_1123.wav 111111 What are the speakers comparing? A. A movie and a novel; B. Two movies; C. Two types of music. B True +short_conv_1124 gaokao_audio/short_conv_1124.wav 111111 Which pair of shoes was comfortable? A. The second pair; B. The third pair; C. The first pair. A True +short_conv_1125 gaokao_audio/short_conv_1125.wav 111111 What time should the woman start recording? A. At four o’clock; B. At six o’clock; C. At seven o’clock. B True +short_conv_1126 gaokao_audio/short_conv_1126.wav 111111 What is almost ready to serve? A. The noodles; B. The salad; C. The bread. A True +short_conv_1127 gaokao_audio/short_conv_1127.wav 111111 What does the man mean? A. He went mountain climbing last year; B. He doesn't like mountain climbing at all; C. He hasn’t traveled around the world yet. B True +short_conv_1128 gaokao_audio/short_conv_1128.wav 111111 Why is the man going to New York? A. To work there; B. To visit a friend; C. To have a vacation. A True +short_conv_1129 gaokao_audio/short_conv_1129.wav 111111 What is the relationship between the two speakers? A. Student and teacher; B. Patient and doctor; C. Lawyer and client. A True +short_conv_113 gaokao_audio/short_conv_113.wav 111111 Why can’t the woman tell the man the time? A. Her bus is coming; B. She forgot her phone; C. Her clock isn’t reliable. C True +short_conv_1130 gaokao_audio/short_conv_1130.wav 111111 What time does the woman usually have breakfast? A. At 7:00; B. At 8:00; C. At 10:00. A True +short_conv_1131 gaokao_audio/short_conv_1131.wav 111111 How will the woman go downtown? A. By taxi; B. By car; C. By bus. C True +short_conv_1132 gaokao_audio/short_conv_1132.wav 111111 What does the man mean? A. A cold drink can be relaxing; B. Scott and Tina like to play jocks on each other; C. Humor can be helpful in embarrassing situations C True +short_conv_1133 gaokao_audio/short_conv_1133.wav 111111 What does the woman mean? A. She is encouraged; B. She appreciate the offer; C. She needs a friend B True +short_conv_1134 gaokao_audio/short_conv_1134.wav 111111 What surprises the man? A. Jane dropped school; B. Jane made much money C. Jane is still working. C True +short_conv_1135 gaokao_audio/short_conv_1135.wav 111111 What will the woman probably do next? A. Check the battery; B. Repair the display; C. Buy a new phone. A True +short_conv_1136 gaokao_audio/short_conv_1136.wav 111111 What does the woman ask the man to do? A. Have lunch first B. Eat slowly; C. Join in a game. B True +short_conv_1137 gaokao_audio/short_conv_1137.wav 111111 Where are the speakers? A. In a university; B. In a housing agency; C. In a lost and found. B True +short_conv_1138 gaokao_audio/short_conv_1138.wav 111111 What's the probable relationship between the speakers? A. Salesperson and customer; B. Cook and customer; C. Doctor and patient. C True +short_conv_1139 gaokao_audio/short_conv_1139.wav 111111 What are the speakers talking about? A. A dinner out; B. A trip to Hainan; C. A birthday gift. C True +short_conv_114 gaokao_audio/short_conv_114.wav 111111 What does the man mean? A. The woman鈥檚 father likes her present very much; B. The woman had better not buy a shirt this time; C. It’s a good idea for the woman to buy her father a shirt. B True +short_conv_1140 gaokao_audio/short_conv_1140.wav 111111 What’s the time now? A. 10:10; B. 10:30; C. 11:00. A True +short_conv_1141 gaokao_audio/short_conv_1141.wav 111111 How does the man prefer to go to work? A. By car; B. By bus; C. On foot. A True +short_conv_1142 gaokao_audio/short_conv_1142.wav 111111 What will the woman probably do? A. Play football after schoo1; B. Register at a swim club; C. Go to a gym class. B True +short_conv_1143 gaokao_audio/short_conv_1143.wav 111111 Where does the conversation probably take place? A. On the train; B. On the bus; C. On the plane. C True +short_conv_1144 gaokao_audio/short_conv_1144.wav 111111 How much will the woman pay for the chemistry book? A. $200; B. $100; C. $50. C True +short_conv_1145 gaokao_audio/short_conv_1145.wav 111111 Why is the man watching the movie? A. To teach some Italian; B. To improve his Spanish; C. To prepare for an exam. A True +short_conv_1146 gaokao_audio/short_conv_1146.wav 111111 What does the man ask the woman to do? A. To park elsewhere; B. To drive along the street; C. To stay for a short while. A True +short_conv_1147 gaokao_audio/short_conv_1147.wav 111111 What are the speakers mainly talking about? A. Young people lose their jobs easily; B. Young people are too quick in making decisions; C. Young people seldom stay long in the same job. C True +short_conv_1148 gaokao_audio/short_conv_1148.wav 111111 How does the woman feel about the zoo? A. Sad; B. Impressed; C. Disappointed. B True +short_conv_1149 gaokao_audio/short_conv_1149.wav 111111 What is the woman doing now? A. Baking cookies; B. Making a list; C. Shopping for groceries. B True +short_conv_115 gaokao_audio/short_conv_115.wav 111111 What does the woman imply? A. The tickets are sold in advance at half price; B. It’s difficult to buy the tickets on the spot; C. It’s better to buy the tickets beforehand. C True +short_conv_1150 gaokao_audio/short_conv_1150.wav 111111 What happened to the woman? A. She woke up late; B. She got to work late; C. She stayed up late. A True +short_conv_1151 gaokao_audio/short_conv_1151.wav 111111 Where does the man want to go? A. To a railway station; B. To a Post Office; C. To the seaside. C True +short_conv_1152 gaokao_audio/short_conv_1152.wav 111111 What is the probable relationship between the speakers? A. Teacher and student; B. Boss and secretary; C. Husband and wife. B True +short_conv_1153 gaokao_audio/short_conv_1153.wav 111111 Where does the conversation probably take place? A. In a store; B. In an office; C. In a bank. A True +short_conv_1154 gaokao_audio/short_conv_1154.wav 111111 What does the man think of the lecture? A. It was interesting and easy to follow; B. It was far beyond his understanding; C. It was as difficult as he had expected. B True +short_conv_1155 gaokao_audio/short_conv_1155.wav 111111 How does the woman keep slim? A. By going on a diet; B. By eating fruit and vegetables; C. By doing physical exercise. C True +short_conv_1156 gaokao_audio/short_conv_1156.wav 111111 Which team lost the basketball match? A. Class One; B. Class Two; C. Class Three. B True +short_conv_1157 gaokao_audio/short_conv_1157.wav 111111 What does the woman think of the pet dog? A. Lovely; B. Annoying; C. Lazy. B True +short_conv_1158 gaokao_audio/short_conv_1158.wav 111111 Where are the two speakers? A. In a bookstore; B. In a library; C. In the classroom. A True +short_conv_1159 gaokao_audio/short_conv_1159.wav 111111 What does the woman work as now? A. A waitress; B. A manager; C. A cashier. C True +short_conv_116 gaokao_audio/short_conv_116.wav 111111 What can we learn about the man and woman from this conversation? A. They are probably art students; B. They won’t go to the zoo together; C. They are making an appointment. A True +short_conv_1160 gaokao_audio/short_conv_1160.wav 111111 How long has the man been a bus driver? A. Two months; B. Three months; C. Four months. B True +short_conv_1161 gaokao_audio/short_conv_1161.wav 111111 What are the speakers talking about? A. Driving; B. The Internet; C. Their job. C True +short_conv_1162 gaokao_audio/short_conv_1162.wav 111111 What are the speakers talking about? A. When to announce the news; B. Who will attend the meeting; C. What to discuss on Monday. A True +short_conv_1163 gaokao_audio/short_conv_1163.wav 111111 Why does the man lose points? A. He is usually late for class; B. He hands in his homework late; C. He isn’t as smart as other students. B True +short_conv_1164 gaokao_audio/short_conv_1164.wav 111111 How many cups of coffee has the woman had? A. 3; B. 4; C. 5. C True +short_conv_1165 gaokao_audio/short_conv_1165.wav 111111 What sport does the man like best? A. Ice skating; B. Skateboarding; C. Skiing. C True +short_conv_1166 gaokao_audio/short_conv_1166.wav 111111 Which class is the man taking? A. Biology; B. Chemistry; C. Physics. A True +short_conv_1167 gaokao_audio/short_conv_1167.wav 111111 How many public universities are there in Britain? A. Over forty; B. Less than forty; C. Zero. C True +short_conv_1168 gaokao_audio/short_conv_1168.wav 111111 What is the probable relationship between the two speakers? A. Customer and waitress; B. Teacher and student; C. Boss and secretary. C True +short_conv_1169 gaokao_audio/short_conv_1169.wav 111111 When will the man be able to visit Mr. Black? A. November 1; B. November 2; C. November 3. B True +short_conv_117 gaokao_audio/short_conv_117.wav 111111 What does the man say about the course? A. It’s too tough for some students; B. It’s much more difficult than people think; C. It’s believed to be the hardest course. B True +short_conv_1170 gaokao_audio/short_conv_1170.wav 111111 Why is the woman surprised? A. Because she found the assignment very difficult; B. Because she found it hard to believe so much time the man had spent; C. Because the man couldn’t finish the assignment because he was busy. B True +short_conv_1171 gaokao_audio/short_conv_1171.wav 111111 What can we know about Judy? A. She came to the party; B. She hasn’t appeared yet; C. She planned to come but changed her mind later. B True +short_conv_1172 gaokao_audio/short_conv_1172.wav 111111 When will the speakers probably leave for the train station? A. At 3:30 p.m; B. At 4:00 p.m; C. At 4:30 p.m. A True +short_conv_1173 gaokao_audio/short_conv_1173.wav 111111 What’s the weather probably like now? A. Rainy B. Sunny C. Cloudy B True +short_conv_1174 gaokao_audio/short_conv_1174.wav 111111 What will the man buy for the woman? A. Notebooks B. Pencils C. Paper B True +short_conv_1175 gaokao_audio/short_conv_1175.wav 111111 What is the man’s favorite sport? A. Tennis B. Volleyball C. Basketball C True +short_conv_1176 gaokao_audio/short_conv_1176.wav 111111 What is the woman going to do tonight? A. Go to the cinema B. Attend a meeting C. Watch TV C True +short_conv_1177 gaokao_audio/short_conv_1177.wav 111111 What is Claire probably like? A. Lazy; B. Clever; C. Hard-working. A True +short_conv_1178 gaokao_audio/short_conv_1178.wav 111111 Why is the woman calling the man? A. To buy something from him; B. To sell him some pieces of furniture; C. To set a date to visit his new apartment. A True +short_conv_1179 gaokao_audio/short_conv_1179.wav 111111 When will the equipment arrive? A. This Wednesday; B. This Friday; C. Next Monday. B True +short_conv_118 gaokao_audio/short_conv_118.wav 111111 Why does the man suggest a woman wear long sleeves? A. To help relieve her of the pain; B. To prevent mosquito bites; C. To avoid getting sun-burnt. B True +short_conv_1180 gaokao_audio/short_conv_1180.wav 111111 How will the speakers probably get to the exhibition? A. By bus; B. By taxi; C. By subway. C True +short_conv_1181 gaokao_audio/short_conv_1181.wav 111111 What will the woman do tomorrow morning? A. Go to the zoo; B. Go to the airport; C. Deal with an email. C True +short_conv_1182 gaokao_audio/short_conv_1182.wav 111111 Where is Jane and Bill’s new house? A. Near a train station; B. Near an airport; C. Near a highway. B True +short_conv_1183 gaokao_audio/short_conv_1183.wav 111111 How does the man feel about his job? A. He enjoys it; B. He doesn’t like it at all; C. He wants to find a new job. A True +short_conv_1184 gaokao_audio/short_conv_1184.wav 111111 What is the woman going to do first? A. Send the e-mail; B. Fix the computer; C. Go to the club. B True +short_conv_1185 gaokao_audio/short_conv_1185.wav 111111 What do we know about Bill? A. He will finish the paper soon; B. He’s not going to write the paper; C. He seldom completes his work early. C True +short_conv_1186 gaokao_audio/short_conv_1186.wav 111111 What is the man doing? A. Asking for help; B. Making suggestions; C. Asking for permission. B True +short_conv_1187 gaokao_audio/short_conv_1187.wav 111111 Where does the conversation probably take place? A. At the hotel; B. At the customs; C. At the station. B True +short_conv_1188 gaokao_audio/short_conv_1188.wav 111111 What does the man ask the woman to do? A. Lower her voice; B. Do the laundry; C. Paint the wall. A True +short_conv_1189 gaokao_audio/short_conv_1189.wav 111111 Why is the woman in a hurry? A. She is heading for school; B. She wants to fetch a book; C. She has to pick up the man. B True +short_conv_119 gaokao_audio/short_conv_119.wav 111111 What does the man mean? A. The apartment was provided with some old furniture; B. The furniture he bought was very cheap; C. The furniture in the market was on sale every Sunday. B True +short_conv_1190 gaokao_audio/short_conv_1190.wav 111111 Whose birthday party will the speakers attend? A. Amy’s; B. Derek’s; C. Karl’s. A True +short_conv_1191 gaokao_audio/short_conv_1191.wav 111111 What does the man suggest the woman do? A. Learn slowly; B. Practise more; C. Take lessons. B True +short_conv_1192 gaokao_audio/short_conv_1192.wav 111111 What's the relationship between the speakers? A. Teacher and student; B. Mum and son; C. Grandma and grandson. B True +short_conv_1193 gaokao_audio/short_conv_1193.wav 111111 Where does the conversation probably take place? A. In a book store; B. In a library; C. In a ticket office. A True +short_conv_1194 gaokao_audio/short_conv_1194.wav 111111 How will the speakers go to Chengdu? A. By train; B. By car; C. By airplane. C True +short_conv_1195 gaokao_audio/short_conv_1195.wav 111111 What time is it now? A. 7:20 p.m; B. 7:40 p.m; C. 8:00 p.m. A True +short_conv_1196 gaokao_audio/short_conv_1196.wav 111111 Why does the man refuse a refill? A. He has a stomachache; B. He is full; C. He doesn't like the taste. B True +short_conv_1197 gaokao_audio/short_conv_1197.wav 111111 What is the probable relationship between the speakers? A. Classmates; B. Teacher and student; C. Doctor and patient. A True +short_conv_1198 gaokao_audio/short_conv_1198.wav 111111 How does the woman go to work? A. By car; B. On foot; C. By bike. B True +short_conv_1199 gaokao_audio/short_conv_1199.wav 111111 When does the train leave? A. At 6:30; B. At 8:30; C. At 10:30. C True +short_conv_12 gaokao_audio/short_conv_12.wav 111111 What can we learn about the man? A. He is anxious to see his sister; B. He wrote to his sister last month; C. He is expecting a letter from his sister. C True +short_conv_120 gaokao_audio/short_conv_120.wav 111111 What does the woman mean? A. The food is not tasty enough; B. The man cannot afford the food; C. The food is worth the prices. C True +short_conv_1200 gaokao_audio/short_conv_1200.wav 111111 What can we say about the woman? A. She’s generous; B. She’s curious; C. She’s helpful. C True +short_conv_1201 gaokao_audio/short_conv_1201.wav 111111 What will James do tomorrow? A. Watch a TV program; B. Give a talk; C. Write a report. B True +short_conv_1202 gaokao_audio/short_conv_1202.wav 111111 Where are the speakers talking ? A. In a house; B. In a park; C. In a library. A True +short_conv_1203 gaokao_audio/short_conv_1203.wav 111111 Who is the owner of the book? A. The man himself; B. The man’s brother; C. The woman’s brother. B True +short_conv_1204 gaokao_audio/short_conv_1204.wav 111111 What are the speakers talking about? A. The new house; B. The new friends; C. The new gardens. A True +short_conv_1205 gaokao_audio/short_conv_1205.wav 111111 Who broke the window? A. The boy; B. The girl; C. Someone else. C True +short_conv_1206 gaokao_audio/short_conv_1206.wav 111111 Who enjoyed the film yesterday? A. John; B. All except John; C. Everyone including John. B True +short_conv_1207 gaokao_audio/short_conv_1207.wav 111111 What are the speakers talking about? A. A story; B. A textbook; C. A movie. A True +short_conv_1208 gaokao_audio/short_conv_1208.wav 111111 When will the man arrive in Cairo? A. In the morning; B. At noon; C. In the afternoon. C True +short_conv_1209 gaokao_audio/short_conv_1209.wav 111111 Why does the man stop his talk with the woman? A. He isn't interested in her words; B. He is expecting another call; C. He is angry with her. B True +short_conv_121 gaokao_audio/short_conv_121.wav 111111 What does the man mean? A. He didn鈥檛 get the book he needed; B. The library is closed on weekends; C. He didn’t have time to go to the library. A True +short_conv_1210 gaokao_audio/short_conv_1210.wav 111111 What does the man imply? A. The woman should go on playing chess; B. He wants to play chess with the woman; C. The woman is weak in playing chess. A True +short_conv_1211 gaokao_audio/short_conv_1211.wav 111111 What is the man? A. A weather forecaster; B. A pilot; C. A trainer. B True +short_conv_1212 gaokao_audio/short_conv_1212.wav 111111 What does the woman advise the man to buy? A. Nothing; B. A computer; C. A cellphone. A True +short_conv_1213 gaokao_audio/short_conv_1213.wav 111111 Which room is Mum going to clean? A. The kitchen; B. The bedroom; C. The living room. C True +short_conv_1214 gaokao_audio/short_conv_1214.wav 111111 How many people will go to the zoo? A. 3; B. 4; C. 5. B True +short_conv_1215 gaokao_audio/short_conv_1215.wav 111111 Who cooks the dinner? A. Jason; B. John C. The woman. B True +short_conv_1216 gaokao_audio/short_conv_1216.wav 111111 What will Lucy do this weekend? A. Go shopping; B. Camp in the mountain; C. Go hiking. C True +short_conv_1217 gaokao_audio/short_conv_1217.wav 111111 When does the man plan to get to the party? A. Around 6: 00 pm; B. Around 7: 00 pm; C. Around 7: 30 pm C True +short_conv_1218 gaokao_audio/short_conv_1218.wav 111111 What will the man do this afternoon? A. Play football; B. Play tennis; C. Play computer games. C True +short_conv_1219 gaokao_audio/short_conv_1219.wav 111111 How will the man go to school tomorrow? A. By car; B. By bus; C. By bike. B True +short_conv_122 gaokao_audio/short_conv_122.wav 111111 What do we learn from the conversation about Tony? A. He is not very enthusiastic about his English lessons; B. He is a student of the music department; C. He is not very interested in English songs. A True +short_conv_1220 gaokao_audio/short_conv_1220.wav 111111 Where will the speakers go first tomorrow? A. To a castle; B. To a garden; C. To a museum. C True +short_conv_1221 gaokao_audio/short_conv_1221.wav 111111 What is the man doing? A. Offering a suggestion; B. Asking for help; C. Giving a warning A True +short_conv_1222 gaokao_audio/short_conv_1222.wav 111111 What will the man do on Friday? A. Go shopping; B. Go camping; C. Hold a dinner party. A True +short_conv_1223 gaokao_audio/short_conv_1223.wav 111111 What does the man offer to do? A. Take a message; B. Get Ms. Sullivan; C. Call back in thirty minutes. A True +short_conv_1224 gaokao_audio/short_conv_1224.wav 111111 How much will a stamp cost in May? A. A penny; B. 42 cents; C. 44 cents. C True +short_conv_1225 gaokao_audio/short_conv_1225.wav 111111 What does the man suggest the woman do? A. Wait on the phone; B. Order on the Internet; C. Drive to the pizza place. B True +short_conv_1226 gaokao_audio/short_conv_1226.wav 111111 What’s the main reason that the man likes his college? A. It’s not expensive; B. It has great teachers; C. He likes his classmates. A True +short_conv_1227 gaokao_audio/short_conv_1227.wav 111111 How does the man suggest the woman deal with the old shoes? A. Have them repaired; B. Throw them away; C. Sell them online. C True +short_conv_1228 gaokao_audio/short_conv_1228.wav 111111 What does the woman mean? A. The new computer is cool; B. Her computer broke down; C. She needs a bigger computer. B True +short_conv_1229 gaokao_audio/short_conv_1229.wav 111111 What will the Jeff’s father do? A. Lose weight; B. Learn driving; C. Buy a car for Jeff. C True +short_conv_123 gaokao_audio/short_conv_123.wav 111111 What does the woman think of the science fiction? A. It needs improving; B. It is just so-so; C. It’s wonderful. C True +short_conv_1230 gaokao_audio/short_conv_1230.wav 111111 What does the man want to know? A. When grandma is coming over; B. When his mother will be home; C. When he should call the woman. A True +short_conv_1231 gaokao_audio/short_conv_1231.wav 111111 Where does the conversation take place? A. In the post office; B. In a taxi; C. In a hotel. B True +short_conv_1232 gaokao_audio/short_conv_1232.wav 111111 What are the speakers talking about? A. The woman’s family; B. A trip; C. A picture. C True +short_conv_1233 gaokao_audio/short_conv_1233.wav 111111 Why does the girl talk with the man? A. To send an invitation; B. To get permission; C. To ask for help. B True +short_conv_1234 gaokao_audio/short_conv_1234.wav 111111 Where will the speakers have their picnic? A. On a rock; B. On the grass; C. In a boat. A True +short_conv_1235 gaokao_audio/short_conv_1235.wav 111111 When does the conversation take place? A. At 5:30; B. At 6:00; C. At 6:30. A True +short_conv_1236 gaokao_audio/short_conv_1236.wav 111111 How much should the man pay in total? A. $100; B. $110; C. $115. B True +short_conv_1237 gaokao_audio/short_conv_1237.wav 111111 In which year is the man in college now? A. The first year; B. The second year; C. The third year. C True +short_conv_1238 gaokao_audio/short_conv_1238.wav 111111 What does the man suggest the woman do? A. Ask a repair shop for help; B. Buy another car; C. Fix the car herself. B True +short_conv_1239 gaokao_audio/short_conv_1239.wav 111111 What’s the matter with the woman? A. She has caught a bad cold; B. She stayed online too long; C. She can’t stand paint smell. C True +short_conv_124 gaokao_audio/short_conv_124.wav 111111 Where are the speakers? A. At a ball field; B. In a classroom; C. At a hospital. C True +short_conv_1240 gaokao_audio/short_conv_1240.wav 111111 How does the man think of the book? A. Humorous; B. Scientific; C. Popular. A True +short_conv_1241 gaokao_audio/short_conv_1241.wav 111111 What is the problem for the man? A. He has to meet many people; B. He has to leave his friends; C. He has to travel a lot. B True +short_conv_1242 gaokao_audio/short_conv_1242.wav 111111 What is the man going to do? A. Go on the Internet; B. Make a phone call; C. Take a train trip. A True +short_conv_1243 gaokao_audio/short_conv_1243.wav 111111 Where are the speakers? A. In a classroom; B. In a library; C. In a bookstore. B True +short_conv_1244 gaokao_audio/short_conv_1244.wav 111111 How will Susan spend most of her time in France? A. Traveling around; B. Studying at a school; C. Looking after her aunt. A True +short_conv_1245 gaokao_audio/short_conv_1245.wav 111111 What are the speakers talking about? A. Going out; B. Ordering drinks; C. Preparing for a party. C True +short_conv_1246 gaokao_audio/short_conv_1246.wav 111111 What does the woman think of the movie? A. It’s amusing; B. It’s exciting; C. It’s disappointing. C True +short_conv_1247 gaokao_audio/short_conv_1247.wav 111111 When is the assignment due? A. Later today; B. Tomorrow; C. The day after tomorrow. C True +short_conv_1248 gaokao_audio/short_conv_1248.wav 111111 What did the woman try to do? A. Create a new password; B. Get some information for the man; C. Go online using the man’s new password. B True +short_conv_1249 gaokao_audio/short_conv_1249.wav 111111 Why didn’t the woman answer her phone? A. She lost her phone; B. She didn’t want to talk to the man; C. She was not allowed to use the phone then. C True +short_conv_125 gaokao_audio/short_conv_125.wav 111111 What was the weather like in the morning? A. Cloudy; B. Windy; C. Sunny. A True +short_conv_1250 gaokao_audio/short_conv_1250.wav 111111 What will the man have? A. Coffee with milk; B. Tea with sweet cream; C. Tea with sugar. A True +short_conv_1251 gaokao_audio/short_conv_1251.wav 111111 What does the man think of going to Aspen? A. It costs too much; B. It sounds very interesting; C. He needs to think about it. A True +short_conv_1252 gaokao_audio/short_conv_1252.wav 111111 What does the woman tell the man to do? A. Prepare for landing; B. Take his headphones out; C. Put his chair back in fifteen minutes. A True +short_conv_1253 gaokao_audio/short_conv_1253.wav 111111 What is the relationship between the speakers? A. They are friends; B. They are cousins; C. They are brother and sister. C True +short_conv_1254 gaokao_audio/short_conv_1254.wav 111111 What will the woman do next? A. Bring the man a salad; B. Take away the man’s soda; C. Give the man some cheese. A True +short_conv_1255 gaokao_audio/short_conv_1255.wav 111111 What does the man wish for the future? A. All his dreams will come true; B. Science will develop much faster; C. He will be able to do his job from home. C True +short_conv_1256 gaokao_audio/short_conv_1256.wav 111111 When did the speakers last see each other? A. Fifteen years ago; B. Five years ago; C. One year ago. B True +short_conv_1257 gaokao_audio/short_conv_1257.wav 111111 What are the speakers mainly talking about? A. Young people lose their jobs easily; B. Young people are too quick in making decisions; C. Young people seldom stay long in the same job. C True +short_conv_1258 gaokao_audio/short_conv_1258.wav 111111 How does the woman feel about the zoo? A. Sad; B. Impressed; C. Disappointed. B True +short_conv_1259 gaokao_audio/short_conv_1259.wav 111111 What is the woman doing now? A. Baking cookies; B. Making a list; C. Shopping for groceries. B True +short_conv_126 gaokao_audio/short_conv_126.wav 111111 What is the woman's advice? A. Selling the old table; B. Buying two bookshelves; C. Moving some furniture. C True +short_conv_1260 gaokao_audio/short_conv_1260.wav 111111 What happened to the woman? A. She woke up late; B. She got to work late; C. She went to sleep late. A True +short_conv_1261 gaokao_audio/short_conv_1261.wav 111111 Where does the man want to go? A. A railway station; B. A post office; C. The seaside. C True +short_conv_1262 gaokao_audio/short_conv_1262.wav 111111 What are the speakers mainly talking about? A. A film; B. An actor; C. A book. A True +short_conv_1263 gaokao_audio/short_conv_1263.wav 111111 Where does the conversation take place? A. In a restaurant; B. In a hotel; C. In an office. B True +short_conv_1264 gaokao_audio/short_conv_1264.wav 111111 What does the man want the woman to do? A. Repair his computer; B. Call Sam for help; C. Tell him a phone number. C True +short_conv_1265 gaokao_audio/short_conv_1265.wav 111111 When should the man hand in the report at the latest? A. At 2:00; B. At 3:00; C. At 4:00. C True +short_conv_1266 gaokao_audio/short_conv_1266.wav 111111 Who is the little girl? A. The woman’s sister; B. The woman’s niece; C. The woman’s daughter B True +short_conv_1267 gaokao_audio/short_conv_1267.wav 111111 What has the woman lost? A. Her purse; B. Some keys; C. A pair of glasses. A True +short_conv_1268 gaokao_audio/short_conv_1268.wav 111111 How much should the man pay for a night? A. $20; B. $30; C. $50. C True +short_conv_1269 gaokao_audio/short_conv_1269.wav 111111 What does the woman say about Sally? A. She is wrong to fire her boss; B. She always says what she thinks; C. She seems to have a lot in her mind. B True +short_conv_127 gaokao_audio/short_conv_127.wav 111111 What does the man think the woman should do at 4:00? A. Write a report; B. Meet Mr. Black; C. Pick up her parents. B True +short_conv_1270 gaokao_audio/short_conv_1270.wav 111111 What colour window does the man prefer? A. Green; B. Yellow; C. Dark blue. C True +short_conv_1271 gaokao_audio/short_conv_1271.wav 111111 What will the man do? A. Make a cake; B. Buy a chocolate cake; C. Bring some chocolate to Alice. B True +short_conv_1272 gaokao_audio/short_conv_1272.wav 111111 How long is the swimming pool open today? A. 10 hours; B. 11 hours; C. 12 hours. B True +short_conv_1273 gaokao_audio/short_conv_1273.wav 111111 What can we know about the man? A. He likes singing; B. He likes challenges; C. He likes music. C True +short_conv_1274 gaokao_audio/short_conv_1274.wav 111111 What does the woman learn in college? A. Learning communication; B. Computer science; C. International trade. B True +short_conv_1275 gaokao_audio/short_conv_1275.wav 111111 When is the meeting? A. On Thursday; B. On Friday; C. On Saturday. B True +short_conv_1276 gaokao_audio/short_conv_1276.wav 111111 What did the girl do last night? A. She had a talk; B. She watched TV; C. She did her homework. A True +short_conv_1277 gaokao_audio/short_conv_1277.wav 111111 What does the man mean? A. He dislikes eating chicken; B. He won’t eat the burned chicken; C. He forgets to cook the chicken. B True +short_conv_1278 gaokao_audio/short_conv_1278.wav 111111 How long does the man plan to try teleworking? A. A few days; B. A few weeks; C. A few months. C True +short_conv_1279 gaokao_audio/short_conv_1279.wav 111111 What are the speakers talking about? A. A term schedule; B. Their vacation plan; C. The optional courses. A True +short_conv_128 gaokao_audio/short_conv_128.wav 111111 How often does the man write to his parents? A. Twice a week; B. Twice a month; C. Three times a month. A True +short_conv_1280 gaokao_audio/short_conv_1280.wav 111111 Where was the man yesterday afternoon? A. By a lake; B. In a café; C. In a cinema. B True +short_conv_1281 gaokao_audio/short_conv_1281.wav 111111 What’s the weather like today? A. Rainy; B. Sunny; C. Windy. B True +short_conv_1282 gaokao_audio/short_conv_1282.wav 111111 Whose niece came just now? A. Jenny’s; B. Alice’s ; C. Tom’s. B True +short_conv_1283 gaokao_audio/short_conv_1283.wav 111111 Who asked John to leave? A. Paula; B. Mike; C. Helen. A True +short_conv_1284 gaokao_audio/short_conv_1284.wav 111111 What will the man do next? A. Put on his overcoat; B. Put on Jack’s overcoat; C. Buy an overcoat. B True +short_conv_1285 gaokao_audio/short_conv_1285.wav 111111 What is the right time order? A. Start work, visit friends, rent a house; B. Start work, rent a house, visit friends; C. Visit friends, rent a house, start work. C True +short_conv_1286 gaokao_audio/short_conv_1286.wav 111111 Which place is the man probably going to? A. The Science Museum; B. The railway station; C. The No. 15 bus stop. B True +short_conv_1287 gaokao_audio/short_conv_1287.wav 111111 What will the man do? A. Fly a kite with the woman; B. Fly a kite by himself; C. Stay at home. A True +short_conv_1288 gaokao_audio/short_conv_1288.wav 111111 What does the woman mean? A. The film is too long; B. The film is too short; C. The film is boring. C True +short_conv_1289 gaokao_audio/short_conv_1289.wav 111111 What does the woman ask the man to do right now? A. Watch TV; B. Go to bed; C. Do homework. C True +short_conv_129 gaokao_audio/short_conv_129.wav 111111 How much change should the man get? A. $3; B. $7; C. $9. A True +short_conv_1290 gaokao_audio/short_conv_1290.wav 111111 Where are the speakers? A. At a department store; B. At an airport; C. At a restaurant. B True +short_conv_1291 gaokao_audio/short_conv_1291.wav 111111 When will the speakers get to the theater if they leave now? A. At 7:35; B. At 7:45; C. At 8:20. B True +short_conv_1292 gaokao_audio/short_conv_1292.wav 111111 What will they do tonight? A. Go to the cinema; B. Go to a concert; C. Go to a restaurant. B True +short_conv_1293 gaokao_audio/short_conv_1293.wav 111111 Where are the speakers probably? A. At a bank; B. At a supermarket; C. At a post office. C True +short_conv_1294 gaokao_audio/short_conv_1294.wav 111111 What does the man want? A. A cup of coffee; B. Orange juice; C. Pancakes. A True +short_conv_1295 gaokao_audio/short_conv_1295.wav 111111 When does the train leave for Boston? A. 9: 25; B. 12:00; C. 11: 45. A True +short_conv_1296 gaokao_audio/short_conv_1296.wav 111111 How is the weather today? A. Sunny; B. Cloudy; C. Rainy. B True +short_conv_1297 gaokao_audio/short_conv_1297.wav 111111 What does the man w ant to know ? A. What time it is; B. When his train is supposed to leave; C. Where he can find the boarding hall. A True +short_conv_1298 gaokao_audio/short_conv_1298.wav 111111 Who might Freddy be? A. The speakers’ son; B. The speakers’ pet; C. The speakers’ house owner. B True +short_conv_1299 gaokao_audio/short_conv_1299.wav 111111 Why is the w oman sad? A. She lost her homew ork; B. She didn’t finish her essay; C. She forgot to reply to her teacher’s email. A True +short_conv_13 gaokao_audio/short_conv_13.wav 111111 How long will the man have to wait for another bus? A. 5 minutes; B. 15 minutes; C. 20 minutes. B True +short_conv_130 gaokao_audio/short_conv_130.wav 111111 What does the woman imply about Peter? A. He likes to follow the fashion; B. He has bad taste in dressing; C. He missed a few lessons. B True +short_conv_1300 gaokao_audio/short_conv_1300.wav 111111 What is the girl doing? A. Making the bed; B. Fixing the chair; C. Driving to school. B True +short_conv_1301 gaokao_audio/short_conv_1301.wav 111111 What did Kate do? A. She sang a song; B. She listened to some music; C. She took a nap in her room. B True +short_conv_1302 gaokao_audio/short_conv_1302.wav 111111 What does the man say about the necklace? A. It suits the woman; B. It doesn't look expensive; C. It looks really old. A True +short_conv_1303 gaokao_audio/short_conv_1303.wav 111111 What problem does the man have? A. He has some pain in the ears; B. His glasses aren't suitable; C. His back hurts. B True +short_conv_1304 gaokao_audio/short_conv_1304.wav 111111 Why does the man make the call? A. To make an appointment; B. To do some experiments; C. To ask about his test results. C True +short_conv_1305 gaokao_audio/short_conv_1305.wav 111111 What does the woman mean? A. She agrees with the man; B. She doesn't know Mrs.Kim; C. Mrs.Kim shouldn't be on the committee. A True +short_conv_1306 gaokao_audio/short_conv_1306.wav 111111 Where does the woman live now? A. In the dorm; B. In the hotel; C. In an apartment. C True +short_conv_1307 gaokao_audio/short_conv_1307.wav 111111 What will the boy probably do this weekend? A. Have a picnic; B. Learn about science; C. Study math by himself. B True +short_conv_1308 gaokao_audio/short_conv_1308.wav 111111 Who is Jack probably talking with? A. His mother; B. His teacher; C. His dentist. A True +short_conv_1309 gaokao_audio/short_conv_1309.wav 111111 How many shirts will the man buy? A. Three; B. Five; C. Six. B True +short_conv_131 gaokao_audio/short_conv_131.wav 111111 What did the man volunteer to do? A. Do gardening; B. Collect stamps; C. Protect the plants. C True +short_conv_1310 gaokao_audio/short_conv_1310.wav 111111 How will the woman go to the town center? A. By train; B. By bus; C. By taxi. A True +short_conv_1311 gaokao_audio/short_conv_1311.wav 111111 Whose book does Suzie have? A. Hannah’s; B. Her mother’s; C. Deborah’s. C True +short_conv_1312 gaokao_audio/short_conv_1312.wav 111111 What is the man ‘s problem? A. He is very hungry; B. He dialed the wrong number; C. He doesn’t want a room facing the sea. B True +short_conv_1313 gaokao_audio/short_conv_1313.wav 111111 What is the man doing there? A. He is living there; B. He is on holiday there; C. He is working there. B True +short_conv_1314 gaokao_audio/short_conv_1314.wav 111111 What is the probable relationship between the two speakers? A. Husband and wife; B. Teacher and student; C. Employer and employee. A True +short_conv_1315 gaokao_audio/short_conv_1315.wav 111111 Which is the best way to get to the Water Cube at the moment? A. Taking a subway; B. Taking a bus; C. Taking a taxi. A True +short_conv_1316 gaokao_audio/short_conv_1316.wav 111111 What time is it now? A. 7:15; B. 8:00; C. 8:45. A True +short_conv_1317 gaokao_audio/short_conv_1317.wav 111111 What does the man say about the movie? A. It’s horrible; B. It’s amusing; C. It’s not good. B True +short_conv_1318 gaokao_audio/short_conv_1318.wav 111111 What is the probable relationship between the speakers? A. Acquaintances; B. Classmates; C. A couple. C True +short_conv_1319 gaokao_audio/short_conv_1319.wav 111111 What are the speakers talking about? A. A farm; B. Some houses; C. A corn field. A True +short_conv_132 gaokao_audio/short_conv_132.wav 111111 Where might the speakers be? A. In a hospital; B. At a restaurant; C. On a bus. B True +short_conv_1320 gaokao_audio/short_conv_1320.wav 111111 Why is John late for school? A. He was stuck in traffic; B. He hurt his head; C. He did a good deed. C True +short_conv_1321 gaokao_audio/short_conv_1321.wav 111111 What does the woman think of the car journey? A. It’s too long; B. It’s very exciting; C. It’s rather dangerous. A True +short_conv_1322 gaokao_audio/short_conv_1322.wav 111111 What hat is the man looking for? A. The cowboy hat; B. The one with stars; C. The one with a baseball logo. B True +short_conv_1323 gaokao_audio/short_conv_1323.wav 111111 What do we know about the woman? A. She works as a tutor at night; B. She has a well­-paid job; C. She got a pay raise recently. C True +short_conv_1324 gaokao_audio/short_conv_1324.wav 111111 What has led Amy to success? A. Her intelligence; B. Her effort; C. Her luck. B True +short_conv_1325 gaokao_audio/short_conv_1325.wav 111111 How did the woman feel about her life? A. Worried; B. Satisfied; C. Bored. C True +short_conv_1326 gaokao_audio/short_conv_1326.wav 111111 How will the man go to the train station tonight? A. By car; B. By bus; C. On foot. B True +short_conv_1327 gaokao_audio/short_conv_1327.wav 111111 What are the speakers mainly talking about? A. Young people lose their jobs easily; B. Young people are too quick in making decisions; C. Young people seldom stay long in the same job. C True +short_conv_1328 gaokao_audio/short_conv_1328.wav 111111 How does the woman feel about the zoo? A. Sad B. Impressed C. Disappointed B True +short_conv_1329 gaokao_audio/short_conv_1329.wav 111111 What is the woman doing now? A. Baking cookies B. Making a list C. Shopping for groceries B True +short_conv_133 gaokao_audio/short_conv_133.wav 111111 What is the man complaining about? A. The food; B. The project; C. The noise. C True +short_conv_1330 gaokao_audio/short_conv_1330.wav 111111 What happened to the woman? A. She woke up late B. She got to work late C. She stayed up late A True +short_conv_1331 gaokao_audio/short_conv_1331.wav 111111 Where does the man want to go? A. To a railway station B. To a Post Office C. To the seaside C True +short_conv_1332 gaokao_audio/short_conv_1332.wav 111111 Why hasn’t the man begun Christmas shopping yet? A. He has no money; B. It’s still the early of November; C. He has no time. C True +short_conv_1333 gaokao_audio/short_conv_1333.wav 111111 What does the man think of Mr. Anderson’s class? A. Easy to pass; B. Hard to follow; C. Worth learning. C True +short_conv_1334 gaokao_audio/short_conv_1334.wav 111111 What have NOT the speakers planned to do? A. Pay off the loans; B. Send their kids abroad; C. Go traveling. B True +short_conv_1335 gaokao_audio/short_conv_1335.wav 111111 When will the speakers go roller-skating? A. 8:00 p.m. tonight; B. 9:00 a.m. tomorrow; C. 9:00 p.m. tomorrow. B True +short_conv_1336 gaokao_audio/short_conv_1336.wav 111111 Where does the conversation take place probably? A. In a hotel; B. In a cinema; C. In a shopping center. A True +short_conv_1337 gaokao_audio/short_conv_1337.wav 111111 Why will the woman go to the park today? A. To play basketball; B. To play volleyball; C. To walk with her friends. B True +short_conv_1338 gaokao_audio/short_conv_1338.wav 111111 Where will the man sit in the restaurant? A. Near the door; B. In the corner; C. Near the window. C True +short_conv_1339 gaokao_audio/short_conv_1339.wav 111111 When will Professor Davidson talk with the woman? A. After his class; B. The next day; C. Before office hours. B True +short_conv_134 gaokao_audio/short_conv_134.wav 111111 Which sport does the man prefer now? A. Tennis; B. Basketball; C. Football. B True +short_conv_1340 gaokao_audio/short_conv_1340.wav 111111 Where does the conversation probably take place? A. In a hotel; B. In a hospital; C. In a restaurant. A True +short_conv_1341 gaokao_audio/short_conv_1341.wav 111111 What does the man prefer to do on Sundays? A. Go shopping; B. Go swimming; C. Do some reading. C True +short_conv_1342 gaokao_audio/short_conv_1342.wav 111111 Why didn’t Helen come to the party? A. She was not invited B. She forgot the time C. She had a piano lesson C True +short_conv_1343 gaokao_audio/short_conv_1343.wav 111111 Where did Alice go on the weekend? A. To the countryside B. To the entertainment park C. To the cinema A True +short_conv_1344 gaokao_audio/short_conv_1344.wav 111111 What are the speakers probably talking about? A. TV shows; B. Stories; C. Books. A True +short_conv_1345 gaokao_audio/short_conv_1345.wav 111111 How old is Tina now? A. 19 B. 20 C. 21 C True +short_conv_1346 gaokao_audio/short_conv_1346.wav 111111 What is the weather like? A. It’s fine; B. It’s rainy; C. It’s too hot. B True +short_conv_1347 gaokao_audio/short_conv_1347.wav 111111 What’s the woman’s plan for tonight? A. To visit her parents B. To see a movie with the man C. The have classes with the man A True +short_conv_1348 gaokao_audio/short_conv_1348.wav 111111 Where is Lucy? A. In her office B. In the meeting room C. On the playground C True +short_conv_1349 gaokao_audio/short_conv_1349.wav 111111 How may Kate feel now? A. Excited B. Sad C. Happy B True +short_conv_135 gaokao_audio/short_conv_135.wav 111111 Who will pay for the meal? A. The man; B. The woman; C. The woman’s sister. C True +short_conv_1350 gaokao_audio/short_conv_1350.wav 111111 What does the woman want to be? A. An engineer B. A teacher C. A doctor B True +short_conv_1351 gaokao_audio/short_conv_1351.wav 111111 What does the woman like best? A. Apples B. Oranges C. Bananas A True +short_conv_1352 gaokao_audio/short_conv_1352.wav 111111 Why was the man late for work? A. He was in an accident; B. His car was being repaired; C. He couldn’t get his car going. C True +short_conv_1353 gaokao_audio/short_conv_1353.wav 111111 What was wrong with Jack? A. He had a fever; B. He was in hospital; C. He was late for work. C True +short_conv_1354 gaokao_audio/short_conv_1354.wav 111111 How long will the man stay in France? A. Five weeks; B. Three weeks; C. Two weeks. A True +short_conv_1355 gaokao_audio/short_conv_1355.wav 111111 What are the speakers doing? A. Working; B. Jogging; C. Drinking. B True +short_conv_1356 gaokao_audio/short_conv_1356.wav 111111 What made the man so worried? A. The exam; B. The paper; C. His teacher. B True +short_conv_1357 gaokao_audio/short_conv_1357.wav 111111 How much did the woman’s trousers cost? A. 45 dollars; B. 12 dollars; C. 33 dollars. C True +short_conv_1358 gaokao_audio/short_conv_1358.wav 111111 Where can you most probably hear this talk? A. In a department store; B. In a post office; C. In a bank. C True +short_conv_1359 gaokao_audio/short_conv_1359.wav 111111 Why does the man turn down the woman’s offer? A. He doesn’t have coffee before lunch; B. He doesn’t feel like wine; C. He prefers tea. A True +short_conv_136 gaokao_audio/short_conv_136.wav 111111 Why is the woman surprised? A. The shirt is very expensive; B. Her husband wants four shirts; C. The man doesn’t agree with her. A True +short_conv_1360 gaokao_audio/short_conv_1360.wav 111111 How much time is left before the movie begins? A. 7 minutes; B. 15 minutes; C. 30 minutes. B True +short_conv_1361 gaokao_audio/short_conv_1361.wav 111111 What did the woman do last Saturday? A. She saw a play; B. She acted in a play; C. She went to the tea house. A True +short_conv_1362 gaokao_audio/short_conv_1362.wav 111111 Where does the conversation most probably take place? A. In a library; B. At a bookstore; C. In a museum. A True +short_conv_1363 gaokao_audio/short_conv_1363.wav 111111 What was the weather like in the mountains yesterday? A. Sunny; B. Windy; C. Snowy. C True +short_conv_1364 gaokao_audio/short_conv_1364.wav 111111 What does the man want to cut out of paper? A. A fish; B. A bird; C. A monkey. B True +short_conv_1365 gaokao_audio/short_conv_1365.wav 111111 When will the film start? A. At 5:00; B. At 6:00; C. At 7:00. C True +short_conv_1366 gaokao_audio/short_conv_1366.wav 111111 Which club will the man join? A. The film club; B. The travel club; C. The sports club. B True +short_conv_1367 gaokao_audio/short_conv_1367.wav 111111 What is the relationship between the speakers? A. Mother and son; B. Hostess and guest; C. Waitress and customer. B True +short_conv_1368 gaokao_audio/short_conv_1368.wav 111111 What does the man imply? A. His brother will watch the game; B. He isn’t interested in the game; C. His brother will play in the game. C True +short_conv_1369 gaokao_audio/short_conv_1369.wav 111111 What book has the man’s sister got? A. A medical book; B. A Chinese textbook; C. An English textbook. A True +short_conv_137 gaokao_audio/short_conv_137.wav 111111 What will the man do on his birthday? A. Have a party; B. See a movie; C. Go out for a meal. B True +short_conv_1370 gaokao_audio/short_conv_1370.wav 111111 Who is ill? A. The man; B. The woman; C. The man’s brother. C True +short_conv_1371 gaokao_audio/short_conv_1371.wav 111111 What is the woman doing? A. Walking; B. Driving; C. Running. B True +short_conv_1372 gaokao_audio/short_conv_1372.wav 111111 What are the speakers talking about? A. A dress; B. A sale; C. Some shoes. A True +short_conv_1373 gaokao_audio/short_conv_1373.wav 111111 Where are the speakers? A. On a bus; B. On a train; C. On a plane. C True +short_conv_1374 gaokao_audio/short_conv_1374.wav 111111 What happened to the woman? A. She was late for work; B. She offered bad service; C. She was asked to leave her job. A True +short_conv_1375 gaokao_audio/short_conv_1375.wav 111111 What is the woman looking for? A. Her glasses; B. Her keys; C. Her books. A True +short_conv_1376 gaokao_audio/short_conv_1376.wav 111111 What kind of weather does the man like? A. Rainy; B. Sunny; C. Cloudy. B True +short_conv_1377 gaokao_audio/short_conv_1377.wav 111111 What time of day is it? A. Morning; B. Afternoon; C. Evening. A True +short_conv_1378 gaokao_audio/short_conv_1378.wav 111111 What is the woman’s job? A. A shopkeeper; B. A waitress; C. A saleswoman. B True +short_conv_1379 gaokao_audio/short_conv_1379.wav 111111 When should Tony return the money to Emma? A. In July; B. In August; C. In September. C True +short_conv_138 gaokao_audio/short_conv_138.wav 111111 How can people travel today? A. By air; B. By ship; C. By train. C True +short_conv_1380 gaokao_audio/short_conv_1380.wav 111111 What will the woman do next? A. Go home; B. Copy her ID C. Deposit her check. A True +short_conv_1381 gaokao_audio/short_conv_1381.wav 111111 What color is the book that the man wants? A. Red; B. Black; C. Blue. B True +short_conv_1382 gaokao_audio/short_conv_1382.wav 111111 When would Thomas and Lily like to leave? A. Tomorrow; B. Next Monday or Tuesday; C. This Tuesday. B True +short_conv_1383 gaokao_audio/short_conv_1383.wav 111111 What are the two speakers talking about? A. A novel; B. A film; C. A cinema. B True +short_conv_1384 gaokao_audio/short_conv_1384.wav 111111 What is the man doing? A. Asking for help; B. Making suggestions; C. Asking for permission. B True +short_conv_1385 gaokao_audio/short_conv_1385.wav 111111 What are the two speakers doing? A. Watching a film; B. Talking about a book; C. Listening to a record. B True +short_conv_1386 gaokao_audio/short_conv_1386.wav 111111 Who is the man? A. A traffic policeman; B. A taxi driver; C. A restaurant waiter. B True +short_conv_1387 gaokao_audio/short_conv_1387.wav 111111 What will the man do first? A. Wash the cups B. Clean the floor C. Clean the windows. B True +short_conv_1388 gaokao_audio/short_conv_1388.wav 111111 What was the weather like yesterday? A. Rainy; B. Sunny; C. Snowy. A True +short_conv_1389 gaokao_audio/short_conv_1389.wav 111111 Where are the man’s gloves probably? A. In his schoolbag B. In his pocket; C. On the sofa C True +short_conv_139 gaokao_audio/short_conv_139.wav 111111 What are the speakers mainly talking about? A. A book; B. An album; C. A song. B True +short_conv_1390 gaokao_audio/short_conv_1390.wav 111111 What are the speakers talking about? A. A ball B. A boy C. A hat B True +short_conv_1391 gaokao_audio/short_conv_1391.wav 111111 What time is it now? A. 1:15pm B. 2:15pm C. 3:15pm. A True +short_conv_1392 gaokao_audio/short_conv_1392.wav 111111 What is the weather like today? A. It’s rainy; B. It’s cloudy; C. It’s sunny. C True +short_conv_1393 gaokao_audio/short_conv_1393.wav 111111 What was the man doing at the moment? A. He was listening to the radio; B. He was writing something; C. He was reading a book. B True +short_conv_1394 gaokao_audio/short_conv_1394.wav 111111 Why will the woman leave before eleven? A. To go home; B. To buy something; C. To make a work plan. B True +short_conv_1395 gaokao_audio/short_conv_1395.wav 111111 Why does the man move to New York? A. To work there; B. To look after parents; C. To make a trip. A True +short_conv_1396 gaokao_audio/short_conv_1396.wav 111111 What are the two speakers talking about? A. Buying a TV; B. TV channel; C. Sports meet. B True +short_conv_1397 gaokao_audio/short_conv_1397.wav 111111 What does Susan mean? A. She had a date then; B. She will put off the meeting; C. She didn’t have time to prepare the speech. C True +short_conv_1398 gaokao_audio/short_conv_1398.wav 111111 What does the man want to do? A. Learn to play baseball; B. Organize a baseball team; C. Find a baseball player. A True +short_conv_1399 gaokao_audio/short_conv_1399.wav 111111 What’s wrong with Jane? A. She misses her home very much; B. She hasn’t received her mother’s letter; C. She is worried about her mother’s health. A True +short_conv_14 gaokao_audio/short_conv_14.wav 111111 What is the man going to do? A. Stay inside; B. Buy an umbrella; C. Walk out with an umbrella. A True +short_conv_140 gaokao_audio/short_conv_140.wav 111111 How does the woman finally decide to go home? A. By bus; B. In the man’s car; C. In her father’s car. C True +short_conv_1400 gaokao_audio/short_conv_1400.wav 111111 What does the man advise the woman to do? A. See Mr. Smith; B. Check the letter; C. Type the letter again. C True +short_conv_1401 gaokao_audio/short_conv_1401.wav 111111 How many people will visit New York for free? A. 2; B. 3; C. 5. C True +short_conv_1402 gaokao_audio/short_conv_1402.wav 111111 According to the woman, what should the man do at first? A. He should ask about the flat on the phone; B. He should read the advertisements for flats in the newspaper; C. He should phone and make an appointment. B True +short_conv_1403 gaokao_audio/short_conv_1403.wav 111111 What is the man’s choice? A. He prefers train for trip; B. He doesn’t like traveling; C. Not mentioned. C True +short_conv_1404 gaokao_audio/short_conv_1404.wav 111111 When would Thomas and Lily like to leave? A. Tomorrow; B. Next Monday or Tuesday; C. This Monday. B True +short_conv_1405 gaokao_audio/short_conv_1405.wav 111111 Where and when will the meeting be held? A. Room 303,3:00 pm; B. Room 303,2:00 pm; C. Room 302,2:00 pm. C True +short_conv_1406 gaokao_audio/short_conv_1406.wav 111111 What does the woman want to do? A. To have an X ray; B. To go to the hospital; C. To help the wounded man. C True +short_conv_1407 gaokao_audio/short_conv_1407.wav 111111 What is the boy going to do today? A. Watch a football game; B. Go to see a doctor; C. Call his head teacher. A True +short_conv_1408 gaokao_audio/short_conv_1408.wav 111111 What does the man say about his country? A. It is cold; B. It is hot; C. It is rainy. C True +short_conv_1409 gaokao_audio/short_conv_1409.wav 111111 What does the man mean? A. They don’t have to arrive for the Brown’s lunch on time; B. It’s impolite to be late for the Brown’s lunch; C. They don’t have to have manners in France. A True +short_conv_141 gaokao_audio/short_conv_141.wav 111111 When will the man leave for Sweden? A. Today; B. Tomorrow; C. The day after tomorrow. A True +short_conv_1410 gaokao_audio/short_conv_1410.wav 111111 What are the speakers talking about? A. An article in the newspaper; B. A meeting with the president; C. A speech on television. C True +short_conv_1411 gaokao_audio/short_conv_1411.wav 111111 What is the change? A. $0.50 B. $0.75 C. $3.25 B True +short_conv_1412 gaokao_audio/short_conv_1412.wav 111111 What is the problem with her English? A. Her spelling is very poor; B. Her speaking is not good; C. Her pronunciation is not good. A True +short_conv_1413 gaokao_audio/short_conv_1413.wav 111111 Why can't the woman go to the party? A. She is sick; B. She has to work; C. She has to stay at home. B True +short_conv_1414 gaokao_audio/short_conv_1414.wav 111111 Where is the woman going now? A. Her brother's office B. Her own house; C. The market. C True +short_conv_1415 gaokao_audio/short_conv_1415.wav 111111 What's the correct time? A. 8:20; B. 8:25; C. 8:15. B True +short_conv_1416 gaokao_audio/short_conv_1416.wav 111111 Where are the two speakers? A. On a ship; B. On a train; C. On a plane. C True +short_conv_1417 gaokao_audio/short_conv_1417.wav 111111 What is the woman going to do first after she leaves home? A. Buy two chickens B. Go to the bank; C. Go to eat something. B True +short_conv_1418 gaokao_audio/short_conv_1418.wav 111111 When did the two speakers plan to meet Jane? A. At2:00 B. At2:15 C. At2:30 A True +short_conv_1419 gaokao_audio/short_conv_1419.wav 111111 What would be the woman’s advice? A. Don't drink water with ice B. Don't have the drinks at lunch C. Don't eat cold dishes in the summer A True +short_conv_142 gaokao_audio/short_conv_142.wav 111111 What is the weather probably like now? A. Hot; B. Cold; C. Warm. B True +short_conv_1420 gaokao_audio/short_conv_1420.wav 111111 Who will not be at the party? A. Jessica B. Linda C. Rose C True +short_conv_1421 gaokao_audio/short_conv_1421.wav 111111 What are the two speakers probably doing? A. Playing a game; B. Enjoying a play; C. Watching a match C True +short_conv_1422 gaokao_audio/short_conv_1422.wav 111111 Why did the speakers’ cake turn out poorly this time? A. They took it out too early; B. The oven was broken halfway; C. They left it in the oven too long. A True +short_conv_1423 gaokao_audio/short_conv_1423.wav 111111 What’s the boy’s plan for this weekend? A. Going to the countryside; B. Visiting his parents; C. Playing chess with the girl. A True +short_conv_1424 gaokao_audio/short_conv_1424.wav 111111 Where is the leather sofa now? A. In the bedroom; B. In the living room; C. In the dining room. C True +short_conv_1425 gaokao_audio/short_conv_1425.wav 111111 What did the girl do during the winter holiday? A. She visited her teachers; B. She read some books; C. She went sightseeing. C True +short_conv_1426 gaokao_audio/short_conv_1426.wav 111111 What is this conversation mainly about? A. Grandma’s cooking; B. The Spring Festival; C. A trip C True +short_conv_1427 gaokao_audio/short_conv_1427.wav 111111 What does the woman think of her interview? A. It was tough; B. It was interesting C. It was successful C True +short_conv_1428 gaokao_audio/short_conv_1428.wav 111111 What are the speakers talking about? A. A restaurant B. A street C. A dish A True +short_conv_1429 gaokao_audio/short_conv_1429.wav 111111 Where docs the conversation probably take place? A. In a bank B. At a ticket office C. On a train B True +short_conv_143 gaokao_audio/short_conv_143.wav 111111 What does the woman need to do today? A. Attend a competition; B. Collect some material; C. Recite a composition. B True +short_conv_1430 gaokao_audio/short_conv_1430.wav 111111 What is the probable relationship between the speakers? A. Workmates B. Brother and sister C. Teacher and student A True +short_conv_1431 gaokao_audio/short_conv_1431.wav 111111 What does John find difficult in learning German? A. Pronunciation B. Vocabulary C. Grammar C True +short_conv_1432 gaokao_audio/short_conv_1432.wav 111111 When is the plane taking off? A. At 9:00; B. At 10:00; C. At 10:30. C True +short_conv_1433 gaokao_audio/short_conv_1433.wav 111111 What is the man doing? A. Watching TV; B. Answering the phone; C. Repairing the TV. B True +short_conv_1434 gaokao_audio/short_conv_1434.wav 111111 Whom does the dictionary belong to? A. Mary; B. Jack; C. Jane. B True +short_conv_1435 gaokao_audio/short_conv_1435.wav 111111 How did the man come here? A. By bus; B. By taxi; C. By car. A True +short_conv_1436 gaokao_audio/short_conv_1436.wav 111111 What is the man going to do at the weekend? A. Meet some friends; B. Take a holiday; C. Stay at home. C True +short_conv_1437 gaokao_audio/short_conv_1437.wav 111111 What does the man think of the book? A. Scientific; B. Interesting; C. Popular. B True +short_conv_1438 gaokao_audio/short_conv_1438.wav 111111 What will the speakers do? A. Buy the T-shirt; B. Try on the red skirt; C. Go to another shop. C True +short_conv_1439 gaokao_audio/short_conv_1439.wav 111111 What are the speakers mainly talking about? A. The environment; B. The price of petrol; C. Electric vehicles C True +short_conv_144 gaokao_audio/short_conv_144.wav 111111 What does the man dislike? A. Old bookcases; B. Newly painted wall; C. Old paintings. B True +short_conv_1440 gaokao_audio/short_conv_1440.wav 111111 What does the woman want to do? A. Look for a job; B. Put up an ad; C. Remove the snow. A True +short_conv_1441 gaokao_audio/short_conv_1441.wav 111111 Where are the speakers? A. At home; B. At the man’s office; C. At a clinic C True +short_conv_1442 gaokao_audio/short_conv_1442.wav 111111 What are the speakers talking about? A. A lightweight bag; B. Things to wear; C. The warm weather. B True +short_conv_1443 gaokao_audio/short_conv_1443.wav 111111 Why was Mr.Johnson in the hospital? A. His wife was ill; B. His wife had a baby; C. He went to visit his daughter. C True +short_conv_1444 gaokao_audio/short_conv_1444.wav 111111 How does the man get to work? A. By car; B. By train; C. By bus. B True +short_conv_1445 gaokao_audio/short_conv_1445.wav 111111 When does the man want to play? A. Later today; B. Tomorrow; C. Right now. B True +short_conv_1446 gaokao_audio/short_conv_1446.wav 111111 What does the woman want to eat? A. Fruit; B. Eggs; C. Pancakes. A True +short_conv_1447 gaokao_audio/short_conv_1447.wav 111111 What are the speakers talking about? A. When to relax; B. How to keep fit; C. How to handle pressure. C True +short_conv_1448 gaokao_audio/short_conv_1448.wav 111111 What does the man suggest the woman do? A. Ignore the ad; B. Get more information first; C. Order a computer right away. B True +short_conv_1449 gaokao_audio/short_conv_1449.wav 111111 What does the boy want to have? A. A dog; B. A rabbit; C. Some fish. A True +short_conv_145 gaokao_audio/short_conv_145.wav 111111 Where is the Blue Ocean Restaurant? A. Beside the Blue Sky Restaurant; B. Opposite the Blue Sky Restaurant; C. Opposite the Blue Bay Restaurant. C True +short_conv_1450 gaokao_audio/short_conv_1450.wav 111111 What’s the relationship between the speakers? A. Host and guest; B. Doctor and patient; C. Teacher and student. B True +short_conv_1451 gaokao_audio/short_conv_1451.wav 111111 Where is Sally going tonight? A. To a party; B. To a shop; C. To a mountain. A True +short_conv_1452 gaokao_audio/short_conv_1452.wav 111111 Why will the woman go to Beijing? A. She has found a new job there; B. She will attend college there; C. She wants to see the world. A True +short_conv_1453 gaokao_audio/short_conv_1453.wav 111111 How will the man probably go downtown? A. By bus; B. By taxi; C. By subway. A True +short_conv_1454 gaokao_audio/short_conv_1454.wav 111111 Where are the speakers? A. In a school; B. At an airport; C. At a railway station. B True +short_conv_1455 gaokao_audio/short_conv_1455.wav 111111 What is the relationship between the speakers? A. Boss and secretary; B. Teacher and student; C. Co-workers. C True +short_conv_1456 gaokao_audio/short_conv_1456.wav 111111 What does the man want to know? A. Where the sign-up sheet is; B. When he can take the field trip; C. Whether the woman will go on the field trip. A True +short_conv_1457 gaokao_audio/short_conv_1457.wav 111111 What are the two speakers mainly talking about? A. A new movie; B. An old movie; C. A fun experience. B True +short_conv_1458 gaokao_audio/short_conv_1458.wav 111111 What will the weather be like this evening? A. Rainy; B. Cloudy; C. Fine. A True +short_conv_1459 gaokao_audio/short_conv_1459.wav 111111 Who is the woman most probably? A. The man’s mother; B. The man’s boss; C. The man’s colleague. A True +short_conv_146 gaokao_audio/short_conv_146.wav 111111 What’s the relationship between the two speakers? A. Relatives; B. Friends; C. Classmates. B True +short_conv_1460 gaokao_audio/short_conv_1460.wav 111111 What does the man mean? A. The problems are hard for him too; B. He has dealt with all the problems; C. The woman should make a good plan. C True +short_conv_1461 gaokao_audio/short_conv_1461.wav 111111 When is the supermarket closed on weekends? A. At 9:00 pm; B. At 10:00 pm; C. At 11:00 pm. B True +short_conv_1462 gaokao_audio/short_conv_1462.wav 111111 What does the woman advise the man to do? A. Pay extra money; B. Drop the lessons; C. Continue learning. C True +short_conv_1463 gaokao_audio/short_conv_1463.wav 111111 Why does the man telephone the reservation office? A. To cancel his flight; B. To confirm his flight; C. To book a ticket. C True +short_conv_1464 gaokao_audio/short_conv_1464.wav 111111 What will the man do next? A. Search for his room key; B. Go to the front desk; C. Change his ID card. B True +short_conv_1465 gaokao_audio/short_conv_1465.wav 111111 What is the possible relationship between the speakers? A. Waitress and customer; B. Cook and waiter; C. Husband and wife. C True +short_conv_1466 gaokao_audio/short_conv_1466.wav 111111 When will the man meet John? A. Tonight; B. Tomorrow; C. The day after tomorrow. A True +short_conv_1467 gaokao_audio/short_conv_1467.wav 111111 What are the speakers talking about? A. The photos; B. The latest fashion; C. The woman's younger sister. A True +short_conv_1468 gaokao_audio/short_conv_1468.wav 111111 Where are the speakers? A. At a travel agency; B. At a post office; C. At a bank. B True +short_conv_1469 gaokao_audio/short_conv_1469.wav 111111 What does the woman look like? A. Excited; B. Nervous; C. Tired. C True +short_conv_147 gaokao_audio/short_conv_147.wav 111111 Why is the man worried? A. He may be turned down; B. He was required to apply to Cambridge; C. He failed to be among the top five. A True +short_conv_1470 gaokao_audio/short_conv_1470.wav 111111 What does the woman want? A. The man's phone; B. The man's phone charger; C. A new mobile phone. B True +short_conv_1471 gaokao_audio/short_conv_1471.wav 111111 What did the man like about the movie? A. The acting; B. The jokes; C. The music. C True +short_conv_1472 gaokao_audio/short_conv_1472.wav 111111 What's Jack's opinion of his new English teacher. A. She is ambitious; B. She is humorous; C. She is responsible. C True +short_conv_1473 gaokao_audio/short_conv_1473.wav 111111 What are the two speakers talking about? A. What to listen to; B. How to handle stress; C. What to read. B True +short_conv_1474 gaokao_audio/short_conv_1474.wav 111111 What is the total cost of the tickets? A. 165 B. 220 C. 135 B True +short_conv_1475 gaokao_audio/short_conv_1475.wav 111111 What does the woman mean? A. Dick will go to town; B. Dick will break his word; C. Dick will finish the task. C True +short_conv_1476 gaokao_audio/short_conv_1476.wav 111111 What is the woman's attitude towards the man's answer? A. Understanding; B. Doubtful; C. Appreciative. B True +short_conv_1477 gaokao_audio/short_conv_1477.wav 111111 What time does the woman pick up her son? A. 7:00 p.m; B. 5:00 p.m; C. 5:30 p.m. A True +short_conv_1478 gaokao_audio/short_conv_1478.wav 111111 What is the possible relationship between the speakers? A. Professor and student; B. Customer and waiter; C. Secretary and manager. A True +short_conv_1479 gaokao_audio/short_conv_1479.wav 111111 What will the man do at noon? A. Play football; B. Ride a bike; C. Stay at home. C True +short_conv_148 gaokao_audio/short_conv_148.wav 111111 What does the woman want to know? A. The weather; B. An accident; C. Train time. C True +short_conv_1480 gaokao_audio/short_conv_1480.wav 111111 What does the man mean? A. The woman got a good deal; B. The woman probably paid too much; C. The woman’s hair looks better than normal. B True +short_conv_1481 gaokao_audio/short_conv_1481.wav 111111 Why doesn’t the woman want to drink the water? A. She isn’t thirsty; B. It has dark stuff; C. It tastes bad. C True +short_conv_1482 gaokao_audio/short_conv_1482.wav 111111 What does the girl imply? A. She will be out of town that day; B. She will definitely go to the party; C. She won’t come because it’s Friday. B True +short_conv_1483 gaokao_audio/short_conv_1483.wav 111111 What does the woman mean? A. The man always loses his car keys; B. The man should study harder for his lessons; C. The man should let the woman keep the car keys. A True +short_conv_1484 gaokao_audio/short_conv_1484.wav 111111 How many tickets has the woman got? A. Two; B. Three; C. Four B True +short_conv_1485 gaokao_audio/short_conv_1485.wav 111111 What is Summer in Paris? A. A film; B. A magazine; C. ATV program. A True +short_conv_1486 gaokao_audio/short_conv_1486.wav 111111 What does the woman want to do? A. Borrow a phone; B. Buy a map; C. Ask the way. C True +short_conv_1487 gaokao_audio/short_conv_1487.wav 111111 When was the woman born? A. In 1980 B. In 1982; C. In 1984. A True +short_conv_1488 gaokao_audio/short_conv_1488.wav 111111 What is Tim doing? A. Locking the door; B. Walking a dog; C. Knocking at the door. B True +short_conv_1489 gaokao_audio/short_conv_1489.wav 111111 What’s the man’s idea about the skirt? A. Change it; B. Buy it; C. Reject it. B True +short_conv_149 gaokao_audio/short_conv_149.wav 111111 Who is probably the woman? A. A policewoman; B. A hotel clerk; C. The man’s wife. A True +short_conv_1490 gaokao_audio/short_conv_1490.wav 111111 Why didn’t Peter go for a trip last weekend? A. He missed the train; B. He didn’t buy the ticket; C. He didn’t get to the station. A True +short_conv_1491 gaokao_audio/short_conv_1491.wav 111111 Where does Sandra sit in the classroom now? A. By the window; B. In the back row; C. By the door. C True +short_conv_1492 gaokao_audio/short_conv_1492.wav 111111 What are the speakers talking about? A. Rain-forests; B. Animals; C. Weather. A True +short_conv_1493 gaokao_audio/short_conv_1493.wav 111111 What does the woman think of the cleaner’s job? A. Boring; B. Exciting; C. Dangerous. C True +short_conv_1494 gaokao_audio/short_conv_1494.wav 111111 What does the man want the woman to do? A. Come to his house at 8:00; B. Attend a gathering; C. Help him with a job. B True +short_conv_1495 gaokao_audio/short_conv_1495.wav 111111 How did the woman read the book? A. She read through it; B. She read the front chapters; C. She read the chapters that interested her. C True +short_conv_1496 gaokao_audio/short_conv_1496.wav 111111 What are the speakers mainly talking about? A. Which orders are urgent; B. How many orders they've packed; C. Whether to leave work right now. C True +short_conv_1497 gaokao_audio/short_conv_1497.wav 111111 Who built the scenery? A. A carpenter; B. The students; C. A designer. A True +short_conv_1498 gaokao_audio/short_conv_1498.wav 111111 How did the woman feel about her presentation? A. Relaxed; B. Confident; C. Anxious. C True +short_conv_1499 gaokao_audio/short_conv_1499.wav 111111 Where does the conversation probably take place? A. On a farm; B. At a fruit market; C. At customs. C True +short_conv_15 gaokao_audio/short_conv_15.wav 111111 What is the man probably doing? A. Greeting his guests; B. Cleaning the house; C. Arguing with Maggie. B True +short_conv_150 gaokao_audio/short_conv_150.wav 111111 What does the woman think of Tom? A. Shy; B. Impolite; C. Outgoing. C True +short_conv_1500 gaokao_audio/short_conv_1500.wav 111111 When will the man most likely get home? A. At 7:00; B. At about 7:30; C. After 8:00. B True +short_conv_1501 gaokao_audio/short_conv_1501.wav 111111 Where is the woman going next? A. To a snack bar; B. To a movie theater; C. To her friend Simon’s house. A True +short_conv_1502 gaokao_audio/short_conv_1502.wav 111111 What will the man do next? A. Fill out another form; B. Correct his mistake on the form; C. Tell the woman his medical history. A True +short_conv_1503 gaokao_audio/short_conv_1503.wav 111111 What is the man looking for? A. A book; B. His iPhone; C. A pay phone. C True +short_conv_1504 gaokao_audio/short_conv_1504.wav 111111 What does the man mean? A. Mr. Johnson’s ideas are nonsense; B. He quite agrees with Mr. Johnson’s views; C. Mr. Johnson is good at expressing his ideas. B True +short_conv_1505 gaokao_audio/short_conv_1505.wav 111111 How did the man feel when he was called on? A. Worried and frightened; B. Quite embarrassed; C. Deeply ashamed. A True +short_conv_1506 gaokao_audio/short_conv_1506.wav 111111 What does the woman imply the man should do? A. To cut his jeans short; B. To go on a diet; C. To buy a pair of jeans. B True +short_conv_1507 gaokao_audio/short_conv_1507.wav 111111 How much tax should the man pay per night? A. $5; B. $ 10; C. $15. B True +short_conv_1508 gaokao_audio/short_conv_1508.wav 111111 Why is the woman upset? A. The flower shop is dosed; B. She received the wrong delivery; C. Her delivery hasn’t been ready in lime. C True +short_conv_1509 gaokao_audio/short_conv_1509.wav 111111 What does the man order? A. Banana juice; B. Orange juice; C. Ice tea. A True +short_conv_151 gaokao_audio/short_conv_151.wav 111111 How does Jack go to school now? A. On foot; B. By bus; C. By bike. A True +short_conv_1510 gaokao_audio/short_conv_1510.wav 111111 Where does the man want to sit? A. Near the window; B. Far from the window; C. In the smoking section. A True +short_conv_1511 gaokao_audio/short_conv_1511.wav 111111 When will the man call back? A. At 10:00; B. At 10:15; C. At 9:45. B True +short_conv_1512 gaokao_audio/short_conv_1512.wav 111111 What does the woman advise the man to do? A. Do more outdoor activities; B. Think about his homework; C. Start working and watching TV. A True +short_conv_1513 gaokao_audio/short_conv_1513.wav 111111 What do we know about the man? A. He doesn’t like skiing now; B. He is as excited as the woman before skiing now; C. He got excited before going skiing in the past. C True +short_conv_1514 gaokao_audio/short_conv_1514.wav 111111 What can we learn about the man? A. He has a great talent for cooking; B. He is a green hand in cooking; C. He improved the dish of his grandmother. A True +short_conv_1515 gaokao_audio/short_conv_1515.wav 111111 What is the men's attitude? A. Terrified; B. Apologetic; C. Annoyed. C True +short_conv_1516 gaokao_audio/short_conv_1516.wav 111111 What are the speakers talking about? A. Ordering various drinks; B. Preparing for a party; C. Choosing suitable drinks. B True +short_conv_1517 gaokao_audio/short_conv_1517.wav 111111 What does the woman imply? A. The delay of the delivery is caused by the awful weather; B. There is a problem with the policy of food delivery; C. The man should have his delivery fee returned. A True +short_conv_1518 gaokao_audio/short_conv_1518.wav 111111 What is probably the men? A. A fitness instructor; B. A mechanic; C. A medical doctor. A True +short_conv_1519 gaokao_audio/short_conv_1519.wav 111111 What will the men probably do next? A. Take some aspirin; B. See a doctor; C. Drive to the hospital. B True +short_conv_152 gaokao_audio/short_conv_152.wav 111111 Where does the conversation probably take place? A. In a bank; B. In a library; C. In a bookstore. B True +short_conv_1520 gaokao_audio/short_conv_1520.wav 111111 Why can't the lecture be held tomorrow? A. The CEO won’t be free at that time; B. The equipment in the lecture hall is out of order; C. The lecture hall is not reserved early enough. A True +short_conv_1521 gaokao_audio/short_conv_1521.wav 111111 What time will the opening ceremony start? A. 7:45; B. 8:00; C. 8:15. B True +short_conv_1522 gaokao_audio/short_conv_1522.wav 111111 Where might the speakers be? A. In a restaurant; B. In a supermarket; C. In the hospital. A True +short_conv_1523 gaokao_audio/short_conv_1523.wav 111111 Which color does the woman prefer? A. Green; B. Yellow; C. Purple. A True +short_conv_1524 gaokao_audio/short_conv_1524.wav 111111 What did Patrick do last Friday? A. He moved to another place; B. He sold his old apartment; C. He went out with a friend. A True +short_conv_1525 gaokao_audio/short_conv_1525.wav 111111 What does the woman do? A. She’s a salesperson; B. She’s a librarian; C. She’s a bank clerk. B True +short_conv_1526 gaokao_audio/short_conv_1526.wav 111111 What did Fred do? A. He travelled to Italy; B. He offered Kate a ride; C. He bought a new car. C True +short_conv_1527 gaokao_audio/short_conv_1527.wav 111111 How does Henry feel now? A. Proud; B. Tired; C. Grateful. B True +short_conv_1528 gaokao_audio/short_conv_1528.wav 111111 What is the woman going to do this afternoon? A. Eat out; B. See a doctor; C. Go shopping. C True +short_conv_1529 gaokao_audio/short_conv_1529.wav 111111 What does the man think of the party? A. He doesn't like the part B. He hates to prepare for the party; C. It is worthwhile to prepare for the party. B True +short_conv_153 gaokao_audio/short_conv_153.wav 111111 What will Cathy do first? A. Visit her aunt; B. Buy some fruit; C. Go to her office. B True +short_conv_1530 gaokao_audio/short_conv_1530.wav 111111 What are the speakers mainly discussing? A. How customers could be best served; B. What kind of stores can offer lower prices; C. Whether online stores will replace high-street stores. C True +short_conv_1531 gaokao_audio/short_conv_1531.wav 111111 Where are the speakers going to meet? A. At the woman’ s home B. At a library; C. At a bus stop B True +short_conv_1532 gaokao_audio/short_conv_1532.wav 111111 What did the man do last night? A. He attended a party; B. He had his car repaired; C. He went to a restaurant C True +short_conv_1533 gaokao_audio/short_conv_1533.wav 111111 How did James get in touch with the woman? A. By letter; B. By telephone C. By e-mail B True +short_conv_1534 gaokao_audio/short_conv_1534.wav 111111 Who has the stapler? A. Somebody else; B. The man; C. The woman. A True +short_conv_1535 gaokao_audio/short_conv_1535.wav 111111 What does the man do? A. A waiter; B. A salesman; C. A teacher. B True +short_conv_1536 gaokao_audio/short_conv_1536.wav 111111 What does the man mean? A. Baseball is his favorite sport; B. Baseball is more interesting than any other sport; C. Baseball is the most boring sport. C True +short_conv_1537 gaokao_audio/short_conv_1537.wav 111111 What does the man suggest doing? A. Getting a ride with somebody; B. Going to the gas station; C. Repairing the car. A True +short_conv_1538 gaokao_audio/short_conv_1538.wav 111111 Where did the woman go? A. The office; B. The railway station; C. The doctor's. B True +short_conv_1539 gaokao_audio/short_conv_1539.wav 111111 What does the man mean? A. He will go into town; B. He misses his parents; C. He has moved house. C True +short_conv_154 gaokao_audio/short_conv_154.wav 111111 Where is the man going now? A. To a restaurant; B. To the editor’s office; C. To his own office. A True +short_conv_1540 gaokao_audio/short_conv_1540.wav 111111 What are the speakers discussing? A. What gift to buy; B. Where to buy a gift; C. Whether to buy a gift. A True +short_conv_1541 gaokao_audio/short_conv_1541.wav 111111 What does the man do now? A. An officer; B. A shop assistant; C. A teacher. B True +short_conv_1542 gaokao_audio/short_conv_1542.wav 111111 Who did the man see yesterday? A. Jane and Tony; B. Tony’s mum; C. The woman’s boyfriend. A True +short_conv_1543 gaokao_audio/short_conv_1543.wav 111111 What are they talking about? A. Boats; B. Paintings; C. Mountains. B True +short_conv_1544 gaokao_audio/short_conv_1544.wav 111111 What is the weather like? A. Cold; B. Hot; C. Cool. B True +short_conv_1545 gaokao_audio/short_conv_1545.wav 111111 What does the man plan to do for his mother on her birthday? A. Buy her a bunch of flowers; B. Buy her a new coat; C. Cook a dinner for her. C True +short_conv_1546 gaokao_audio/short_conv_1546.wav 111111 Why can’t the man return the shoes? A. He has worn them too long; B. He lost the receipt; C. The shoes are comfortable. A True +short_conv_1547 gaokao_audio/short_conv_1547.wav 111111 How often does the woman eat out? A. Three times a week; B. Four times a week; C. Five times a week. C True +short_conv_1548 gaokao_audio/short_conv_1548.wav 111111 When should the man check in? A. At 4:30 pm; B. At 4:00 pm; C. At 5:30 pm. A True +short_conv_1549 gaokao_audio/short_conv_1549.wav 111111 What are the speakers mainly talking about? A. Some kinds of art; B. The woman's mother; C. Their school life. A True +short_conv_155 gaokao_audio/short_conv_155.wav 111111 What do we know about the man? A. He has lost his way; B. He isn’t a native of this city; C. He is busy talking with the old lady. B True +short_conv_1550 gaokao_audio/short_conv_1550.wav 111111 At what age did the man probably start to play basketball? A. 7 years old; B. 13 years old; C. 27 years old. A True +short_conv_1551 gaokao_audio/short_conv_1551.wav 111111 What did the man fail to do in Las Vegas? A. Do the shopping; B. Go swimming; C. Visit the Hoover Dam. B True +short_conv_1552 gaokao_audio/short_conv_1552.wav 111111 How does the man usually go to work? A. By train; B. By bus; C. By car. B True +short_conv_1553 gaokao_audio/short_conv_1553.wav 111111 Where was the man born? A. In Boston; B. In Phoenix; C. In New York. C True +short_conv_1554 gaokao_audio/short_conv_1554.wav 111111 How will the woman go downtown? A. By subway; B. By bus; C. By taxi. A True +short_conv_1555 gaokao_audio/short_conv_1555.wav 111111 Why do the speakers line up? A. To buy some water; B. To buy some food; C. To buy film tickets. B True +short_conv_1556 gaokao_audio/short_conv_1556.wav 111111 When will the bus arrive? A. In two minutes; B. In four minutes; C. In ten minutes. C True +short_conv_1557 gaokao_audio/short_conv_1557.wav 111111 Where is the man now? A. On his way home; B. In the kitchen; C. In his office. C True +short_conv_1558 gaokao_audio/short_conv_1558.wav 111111 How does the woman feel? A. Excited; B. Surprised C. Annoyed. C True +short_conv_1559 gaokao_audio/short_conv_1559.wav 111111 What does the man invite the woman to do? A. Go to the concert; B. Visit his brother; C. Have dinner together. C True +short_conv_156 gaokao_audio/short_conv_156.wav 111111 What is the probable relationship between the speakers? A. Husband and wife; B. Salesman and customer; C. Workmates. A True +short_conv_1560 gaokao_audio/short_conv_1560.wav 111111 What does the woman think of her Job? A. Stressful B. Interesting; C. Relaxing. A True +short_conv_1561 gaokao_audio/short_conv_1561.wav 111111 Why does the woman look so excited? A. She will take a trip; B. She bought nice goods; C. She opened a beauty salon. B True +short_conv_1562 gaokao_audio/short_conv_1562.wav 111111 What are the speakers talking about? A. Throwing a party; B. Getting Mary a gift; C. Doing some exercise. B True +short_conv_1563 gaokao_audio/short_conv_1563.wav 111111 What does the man want? A. A magazine; B. Some fish; C. A teapot. A True +short_conv_1564 gaokao_audio/short_conv_1564.wav 111111 What does the woman mean? A. She will help the man; B. She won’t finish the paper; C. The man should depend on himself. C True +short_conv_1565 gaokao_audio/short_conv_1565.wav 111111 How will the woman deal with her bicycle? A. She will leave it in the apartment; B. She will give it to the man for free; C. She will sell it to the man at a low price. B True +short_conv_1566 gaokao_audio/short_conv_1566.wav 111111 What does the man want to do? A. Play golf next Tuesday; B. Visit his parents; C. Take a day off. C True +short_conv_1567 gaokao_audio/short_conv_1567.wav 111111 What happened to Nancy? A. She tried out but failed; B. She was chosen for the lead role; C. She missed the chance of trying out. A True +short_conv_1568 gaokao_audio/short_conv_1568.wav 111111 What time is it now? A. 8:40; B. 8:55; C. 9:00. B True +short_conv_1569 gaokao_audio/short_conv_1569.wav 111111 How many floors does the man have to walk to Mr Johnson’s office? A. Three B. Four C. Six. B True +short_conv_157 gaokao_audio/short_conv_157.wav 111111 When will the speaker meet? A. This Tuesday; B. Next Monday; C. Next Tuesday. C True +short_conv_1570 gaokao_audio/short_conv_1570.wav 111111 What will they do? A. they will go to the Mediterranean by train; B. they will go to Hawaii for their holiday; C. they will go to Hawaii by plane. A True +short_conv_1571 gaokao_audio/short_conv_1571.wav 111111 What does the woman think of the man’s paper? A. It is not complete; B. The handwriting is very poor; C. Some parts of it aren’t well written. C True +short_conv_1572 gaokao_audio/short_conv_1572.wav 111111 How long will Tom wait there? A. For six hours B. for two hours C. for three hours. C True +short_conv_1573 gaokao_audio/short_conv_1573.wav 111111 Where does the conversation most probably take place? A. In a classroom B. In a restaurant C. In a bookstore. C True +short_conv_1574 gaokao_audio/short_conv_1574.wav 111111 When does the conversation take place? A. In September ; B. In April C. In February C True +short_conv_1575 gaokao_audio/short_conv_1575.wav 111111 Whose advice did the woman follow? A. The shop assistant’s; B. Her mother’s; C. Her sister’s. B True +short_conv_1576 gaokao_audio/short_conv_1576.wav 111111 What kind of music does the man like? A. Jazz; B. Classical; C. Folk. C True +short_conv_1577 gaokao_audio/short_conv_1577.wav 111111 What will the man do in Edinburgh ? A. Do business with Justin; B. Tell Justin his new address; C. Give Justin the medicines. C True +short_conv_1578 gaokao_audio/short_conv_1578.wav 111111 Where does the conversation take place ? A. In an elevator; B. On a bus; C. In a taxi. B True +short_conv_1579 gaokao_audio/short_conv_1579.wav 111111 What is the woman concerned about the most? A. Spending less money; B. Buying unusual flowers; C. Getting something conveniently. A True +short_conv_158 gaokao_audio/short_conv_158.wav 111111 What is the weather probably like now? A. Foggy; B. Cloudy; C. Fine. B True +short_conv_1580 gaokao_audio/short_conv_1580.wav 111111 What does the man think is the best way of inviting guests? A. In person; B. By mail; C. Online. C True +short_conv_1581 gaokao_audio/short_conv_1581.wav 111111 How does the woman feel about her weekend? A. Very pleased; B. Somewhat bored; C. Extremely disappointed. A True +short_conv_1582 gaokao_audio/short_conv_1582.wav 111111 What does the man want to buy? A. A bike; B. A lock; C. A camera. B True +short_conv_1583 gaokao_audio/short_conv_1583.wav 111111 Why can’t the woman go to the post office? A. It isn’t open today; B. She doesn’t have enough time; C. The man can’t give her directions. A True +short_conv_1584 gaokao_audio/short_conv_1584.wav 111111 What is the man doing? A. Asking the way; B. Booking a table C. Waiting for the woman A True +short_conv_1585 gaokao_audio/short_conv_1585.wav 111111 What is the probable relationship between the speakers? A. A couple B. Workmates C. Teacher and student. B True +short_conv_1586 gaokao_audio/short_conv_1586.wav 111111 Where does the conversation probably take place? A. At a beach B. In a restaurant C. In a hotel C True +short_conv_1587 gaokao_audio/short_conv_1587.wav 111111 What does the woman want Tom to do? A. Make the bed B. Play a game C. Lend her 5 dollars A True +short_conv_1588 gaokao_audio/short_conv_1588.wav 111111 Why did the woman go to Beijing? A. To visit her cousin B. To enjoy her vacation C. To do some business B True +short_conv_1589 gaokao_audio/short_conv_1589.wav 111111 What do we know about the woman? A. She is supportive; B. She is confident; C. She is active. A True +short_conv_159 gaokao_audio/short_conv_159.wav 111111 Where does the conversation probably take place? A. In a hospital; B. In a classroom; C. In a restaurant. A True +short_conv_1590 gaokao_audio/short_conv_1590.wav 111111 What are the speakers mainly talking about? A. The money; B. The football; C. The birthday. B True +short_conv_1591 gaokao_audio/short_conv_1591.wav 111111 What is the man doing? A. Visiting a company; B. Having a job interview; C. Making a telephone call. C True +short_conv_1592 gaokao_audio/short_conv_1592.wav 111111 What colour does the man prefer? A. Brown; B. Black; C. Blue. A True +short_conv_1593 gaokao_audio/short_conv_1593.wav 111111 What is the woman going to do? A. See the doctor; B. Put on clothes; C. Go to bed. C True +short_conv_1594 gaokao_audio/short_conv_1594.wav 111111 What will the woman do for the man? A. Wash his clothes; B. Take him to the store; C. Get him a wallet. C True +short_conv_1595 gaokao_audio/short_conv_1595.wav 111111 What's the probable relationship between the speakers? A. Boss and secretary; B. Taxi driver and passenger; C. Driver and conductor. B True +short_conv_1596 gaokao_audio/short_conv_1596.wav 111111 Where is Jimmy now? A. In a hotel; B. In the lab; C. At home. B True +short_conv_1597 gaokao_audio/short_conv_1597.wav 111111 What does the woman want to do? A. Open the window; B. Open the door; C. Let the man in. A True +short_conv_1598 gaokao_audio/short_conv_1598.wav 111111 When did the alarm clock ring? A. At 6 o'clock; B. At 8 o'clock; C. At 7 o'clock. B True +short_conv_1599 gaokao_audio/short_conv_1599.wav 111111 How many languages is the man learning now? A. One; B. Two; C. Three. B True +short_conv_16 gaokao_audio/short_conv_16.wav 111111 What is the woman looking at? A. A train from Beijing to Shanghai; B. The railway timetable; C. The maps of Beijing and Shanghai. B True +short_conv_160 gaokao_audio/short_conv_160.wav 111111 What is the man likely to do? A. Drop out of school; B. Try to get a scholarship; C. Continue his studies. C True +short_conv_1600 gaokao_audio/short_conv_1600.wav 111111 What is the man going to do first? A. Sweep the floor; B. Do the cooking; C. Remove the rubbish. C True +short_conv_1601 gaokao_audio/short_conv_1601.wav 111111 What does the man think of his new computer? A. It's quite expensive; B. It is hard to use; C. It is of good value. C True +short_conv_1602 gaokao_audio/short_conv_1602.wav 111111 What are the speakers mainly talking about? A. A museum; B. A garden; C. A painting. A True +short_conv_1603 gaokao_audio/short_conv_1603.wav 111111 How will Uncle Tom come? A. By motorbike; B. By taxi; C. By car. B True +short_conv_1604 gaokao_audio/short_conv_1604.wav 111111 What will the man do? A. Go shopping; B. Watch a game; C. Feed the bulls. B True +short_conv_1605 gaokao_audio/short_conv_1605.wav 111111 How much does the man withdraw? A. $100; B. $105; C. $110. A True +short_conv_1606 gaokao_audio/short_conv_1606.wav 111111 What does the woman probably do? A. A doctor; B. A professor; C. A policewoman. C True +short_conv_1607 gaokao_audio/short_conv_1607.wav 111111 What makes the man think Kim Yu-Na comes from South Korea? A. Her name; B. Her language; C. Her appearance. A True +short_conv_1608 gaokao_audio/short_conv_1608.wav 111111 What does the man often do on weekends? A. Go on picnics; B. Stay at home; C. Have a barbecue. B True +short_conv_1609 gaokao_audio/short_conv_1609.wav 111111 What are the speakers mainly talking about? A. Their biology teacher; B. The woman’s parents; C. The pet of the class. C True +short_conv_161 gaokao_audio/short_conv_161.wav 111111 What's the weather like? A. Cool; B. Cold; C. Warm. B True +short_conv_1610 gaokao_audio/short_conv_1610.wav 111111 What is the relationship between the speakers? A. BOSS and employee; B. Waiter and customer; C. Co.workers. C True +short_conv_1611 gaokao_audio/short_conv_1611.wav 111111 How much did the woman buy her watch for? A. $1 000; B. $800; C. $200. B True +short_conv_1612 gaokao_audio/short_conv_1612.wav 111111 What does the woman 0flfer the man? A. Iced tea; B. Cookies; C. Chips. C True +short_conv_1613 gaokao_audio/short_conv_1613.wav 111111 What will the man probably do during his holiday? A. Do his work; B. Travel to Qingdao; C. Climb some mountains. A True +short_conv_1614 gaokao_audio/short_conv_1614.wav 111111 Who is the man most probably? A. The woman’s colleague; B. The woman’s brother; C. The woman’s husband. A True +short_conv_1615 gaokao_audio/short_conv_1615.wav 111111 What does the man mean? A. The diamond is not beautiful; B. The design is not fashionable; C. The price is too high for them now. C True +short_conv_1616 gaokao_audio/short_conv_1616.wav 111111 What will the woman do? A. Go to the movies; B. Do some shopping; C. Attend a party. B True +short_conv_1617 gaokao_audio/short_conv_1617.wav 111111 When will the man leave for home? A. On Thursday; B. On Friday; C. On Sunday. B True +short_conv_1618 gaokao_audio/short_conv_1618.wav 111111 Where did the woman go? A. To downtown Berkeley; B. To the man’s house; C. To Amherst. A True +short_conv_1619 gaokao_audio/short_conv_1619.wav 111111 How does the woman happen to know about the Garden Café? A. She is greatly encouraged; B. She got to know about it on line; C. The man talked about it to her. B True +short_conv_162 gaokao_audio/short_conv_162.wav 111111 What is important to the man? A. The cost; B. The time; C. The airline. A True +short_conv_1620 gaokao_audio/short_conv_1620.wav 111111 Who is the woman speaking to? A. A policeman; B. A friend; C. A shop assistant. A True +short_conv_1621 gaokao_audio/short_conv_1621.wav 111111 What is Kate’s job? A. A writer; B. A teacher; C. A doctor. A True +short_conv_1622 gaokao_audio/short_conv_1622.wav 111111 How many letters has the man answered? A. Two; B. Four; C. Six. B True +short_conv_1623 gaokao_audio/short_conv_1623.wav 111111 What does the woman mean? A. She failed in one of Miss Black’s tests; B. She finds it easy to pass Miss Black’s tests; C. She has never heard of Miss Black. B True +short_conv_1624 gaokao_audio/short_conv_1624.wav 111111 What are the speakers talking about? A. A new TV set; B. A TV program; C. A radio program. B True +short_conv_1625 gaokao_audio/short_conv_1625.wav 111111 What is the woman going to do? A. Play baseball; B. Watch a game; C. Do her work. B True +short_conv_1626 gaokao_audio/short_conv_1626.wav 111111 What will the woman work as? A. An assistant; B. A lawyer; C. A teacher. A True +short_conv_1627 gaokao_audio/short_conv_1627.wav 111111 What will the speakers take to the picnic? A. Some drinks; B. Some fruit; C. Some desserts. C True +short_conv_1628 gaokao_audio/short_conv_1628.wav 111111 What did the man like about the movie? A. The acting; B. The music; C. The scenery. A True +short_conv_1629 gaokao_audio/short_conv_1629.wav 111111 What does the man imply about Linda? A. She rearranged the chapters of her book; B. She assured him that the chapter was finished; C. She worked on the chapter for quite a while. C True +short_conv_163 gaokao_audio/short_conv_163.wav 111111 What will the speakers do on Sunday? A. Go swimming; B. Play volleyball; C. Go cycling. B True +short_conv_1630 gaokao_audio/short_conv_1630.wav 111111 What does the woman mean? A. She used to work at a newspaper; B. She'd like her supervisor's opinion of her work; C. She wishes she had a different kind of job. B True +short_conv_1631 gaokao_audio/short_conv_1631.wav 111111 What does the woman suggest they do? A. Pay for some of the food; B. Insist on choosing their own food; C. Treat Gary to dinner some other time. A True +short_conv_1632 gaokao_audio/short_conv_1632.wav 111111 What can be inferred about Philip? A. He'll go to the party with the woman; B. He met the man at the party; C. He has changed his plans. C True +short_conv_1633 gaokao_audio/short_conv_1633.wav 111111 What does the woman say about the film? A. It will be ready at four o'clock today; B. It can be picked up at two o'clock tomorrow; C. Only two rolls will be ready on time. B True +short_conv_1634 gaokao_audio/short_conv_1634.wav 111111 What does the man mean? A. The next dish will be really special; B. The baked potatoes are his best dish; C. He’11 make something even better next time. A True +short_conv_1635 gaokao_audio/short_conv_1635.wav 111111 How does the woman probably feel in the beginning? A. Confused; B. Satisfied; C. Disappointed. A True +short_conv_1636 gaokao_audio/short_conv_1636.wav 111111 Who might Shelly be? A. The man’s wife; B. The girl’s sister; C. A babysitter. C True +short_conv_1637 gaokao_audio/short_conv_1637.wav 111111 What does the man probably want the woman to do? A. Fix his pants; B. Give him his money back; C. Give him a new pair of pants for free. B True +short_conv_1638 gaokao_audio/short_conv_1638.wav 111111 What does the woman want to know? A. If the man is thirsty; B. If the man likes Beyonce; C. If the man has heard some new music. C True +short_conv_1639 gaokao_audio/short_conv_1639.wav 111111 What are the speakers mainly talking about? A. A house; B. A friend; C. A garden. A True +short_conv_164 gaokao_audio/short_conv_164.wav 111111 Why is Emily mentioned in the conversation? A. She might want a ticket; B. She is looking for the man; C. She has an extra ticket. A True +short_conv_1640 gaokao_audio/short_conv_1640.wav 111111 Where will the woman go first? A. To a post office; B. To a bakery; C. To a bank. A True +short_conv_1641 gaokao_audio/short_conv_1641.wav 111111 When will the woman bring the iPad to the man? A. This afternoon; B. Tomorrow morning; C. Tomorrow afternoon. C True +short_conv_1642 gaokao_audio/short_conv_1642.wav 111111 What is the man wearing now? A. A blue sports shirt; B. A green sports shirt; C. A green T-shirt. C True +short_conv_1643 gaokao_audio/short_conv_1643.wav 111111 What is the man’s grandmother doing? A. Having a swim; B. Taking a bath; C. Reading an email. B True +short_conv_1644 gaokao_audio/short_conv_1644.wav 111111 What does the man think of the lecture? A. Interesting; B. Hard to understand; C. Long and boring. B True +short_conv_1645 gaokao_audio/short_conv_1645.wav 111111 Where will the speakers go first? A. A restaurant; B. A cinema; C. A hospital. A True +short_conv_1646 gaokao_audio/short_conv_1646.wav 111111 When did the woman plan to go to Spain? A. In spring; B. In summer; C. In autumn. B True +short_conv_1647 gaokao_audio/short_conv_1647.wav 111111 How old is the man’s daughter? A. 1 years old; B. 2 years old; C. 3 years old. B True +short_conv_1648 gaokao_audio/short_conv_1648.wav 111111 What does the man probably do? A. A shop assistant; B. A policeman; C. A postman. C True +short_conv_1649 gaokao_audio/short_conv_1649.wav 111111 What did the woman do in Beijing? A. She visited some cultural relics; B. She visited a friend; C. She attended a lecture. C True +short_conv_165 gaokao_audio/short_conv_165.wav 111111 What is the relationship between the speakers? A. Colleges; B. Classmates; C. Strangers. C True +short_conv_1650 gaokao_audio/short_conv_1650.wav 111111 What's the probable relationship of the two speakers? A. Strangers; B. Colleagues; C. Couple. B True +short_conv_1651 gaokao_audio/short_conv_1651.wav 111111 How will the speakers get there? A. In Lucy’s car; B. on foot; C. by bus. A True +short_conv_1652 gaokao_audio/short_conv_1652.wav 111111 Who is the woman over there? A. Jack's mother; B. Jack's sister; C. Jack's aunt. C True +short_conv_1653 gaokao_audio/short_conv_1653.wav 111111 When will the match start? A. At 2:20; B. At 2:35; C. At 2:25. C True +short_conv_1654 gaokao_audio/short_conv_1654.wav 111111 What does the woman advise the man to do? A. Turn down the music; B. Go to bed early; C. Set an alarm. C True +short_conv_1655 gaokao_audio/short_conv_1655.wav 111111 What may be the weather like at the weekend? A. Sunny; B. Rainy; C. Snowy. C True +short_conv_1656 gaokao_audio/short_conv_1656.wav 111111 What does the man mean? A. Pizza tastes terrible; B. Pizza was once cheap; C. Pizza is always expensive. B True +short_conv_1657 gaokao_audio/short_conv_1657.wav 111111 Why does the man congratulate the woman? A. She ranked Number 1 in the exams; B. She was popular in her class; C. She quit the exam. A True +short_conv_1658 gaokao_audio/short_conv_1658.wav 111111 What are the speakers talking about? A. A dinner party; B. A plan for the night; C. A movie about dinner. B True +short_conv_1659 gaokao_audio/short_conv_1659.wav 111111 What are the speakers mainly talking about? A. Whether to go to a bookstore; B. How to get a book; C. What their teacher is like. B True +short_conv_166 gaokao_audio/short_conv_166.wav 111111 What are the speakers talking about? A. What to drink; B. Where to meet; C. When to leave. B True +short_conv_1660 gaokao_audio/short_conv_1660.wav 111111 What did the speakers do together last summer? A. They went to school; B. They looked for jobs; C. They did exercise at the gym. C True +short_conv_1661 gaokao_audio/short_conv_1661.wav 111111 How much will the woman pay? A. $1; B. $5; C. $5.2. C True +short_conv_1662 gaokao_audio/short_conv_1662.wav 111111 What is the woman doing? A. Buying a ticket; B. Driving a car; C. Looking at a sign. B True +short_conv_1663 gaokao_audio/short_conv_1663.wav 111111 Where does the conversation take place? A. In a fruit store; B. In a supermarket; C. In a restaurant. C True +short_conv_1664 gaokao_audio/short_conv_1664.wav 111111 What will the man do? A. Turn in his paper; B. Pay the telephone bill; C. Help the woman. A True +short_conv_1665 gaokao_audio/short_conv_1665.wav 111111 What does the man advise the woman to do? A. Watch the game tomorrow; B. Do the work tonight; C. Enjoy the game tonight. C True +short_conv_1666 gaokao_audio/short_conv_1666.wav 111111 How will the speaker get a ticket to the concert? A. The man will go to buy the ticket; B. The woman will get the ticket; C. The man will have someone buy the ticket. B True +short_conv_1667 gaokao_audio/short_conv_1667.wav 111111 What do we know about the man? A. He is going to take exercise; B. He is going to have meetings; C. He is going to clean his shirts. B True +short_conv_1668 gaokao_audio/short_conv_1668.wav 111111 What's the probable relationship between the two speakers? A. Classmates; B. Colleagues.(同事) C. Teacher and student. A True +short_conv_1669 gaokao_audio/short_conv_1669.wav 111111 What is the man? A. A secretary; B. A teacher; C. A doctor. C True +short_conv_167 gaokao_audio/short_conv_167.wav 111111 What does Jack want to do? A. Take fitness classes; B. Buy a pair of gym shoes; C. Change his work schedule. A True +short_conv_1670 gaokao_audio/short_conv_1670.wav 111111 Where is the woman’s grandma now? A. At home; B. In a hospital; C. In a hotel. B True +short_conv_1671 gaokao_audio/short_conv_1671.wav 111111 What was the weather like on John’s holiday? A. Sunny; B. Rainy; C. Cold. C True +short_conv_1672 gaokao_audio/short_conv_1672.wav 111111 How much does the woman pay for the tickets? A. £9; B. £10; C. £11. A True +short_conv_1673 gaokao_audio/short_conv_1673.wav 111111 How will the speakers probably go home? A. By taxi B. By bus; C. By subway. A True +short_conv_1674 gaokao_audio/short_conv_1674.wav 111111 What is the woman doing? A. Making suggestions; B. Making excuses; C. Making requests. B True +short_conv_1675 gaokao_audio/short_conv_1675.wav 111111 What does the woman imply? A. The Edwards are quite well-off; B. The Edward should cut down their living expenses; C. It’ll be unwise for the Edwards to buy another house. C True +short_conv_1676 gaokao_audio/short_conv_1676.wav 111111 What do we learn from the conversation? A. The train is crowded; B. The train is late; C. The train is on time. B True +short_conv_1677 gaokao_audio/short_conv_1677.wav 111111 How does the woman suggest the man prepare for Professor Yang’s lesson? A. Review the details of all her lessons; B. Focus on the main points of her lectures; C. Talk with her about his learning problems. B True +short_conv_1678 gaokao_audio/short_conv_1678.wav 111111 What are the speakers doing? A. Having dinner; B. Having a class; C. Reading. A True +short_conv_1679 gaokao_audio/short_conv_1679.wav 111111 What are the speakers mainly talking about? A. Preparing for a test; B. Eating during an exam; C. Getting a medical exam. B True +short_conv_168 gaokao_audio/short_conv_168.wav 111111 Where does this conversation take place? A. In a classroom; B. In a hospital; C. In a museum. B True +short_conv_1680 gaokao_audio/short_conv_1680.wav 111111 What is the probable relationship between the speakers? A. Father and daughter; B. Classmates; C. Teacher and student. C True +short_conv_1681 gaokao_audio/short_conv_1681.wav 111111 What did the woman do today? A. She cleaned the car; B. She bought an umbrella; C. She listened to the weather forecast. A True +short_conv_1682 gaokao_audio/short_conv_1682.wav 111111 When does the man usually do exercise? A. In the afternoon; B. In the morning; C. At night. B True +short_conv_1683 gaokao_audio/short_conv_1683.wav 111111 What fruit does the woman use? A. Pears; B. Oranges; C. Banana. C True +short_conv_1684 gaokao_audio/short_conv_1684.wav 111111 What are the speakers trying to do? A. Call a taxi; B. Catch a bus; C. Take a plane. B True +short_conv_1685 gaokao_audio/short_conv_1685.wav 111111 What’s the relationship between the speakers? A. Customer and waitress; B. Teacher and student; C. Boss and secretary. A True +short_conv_1686 gaokao_audio/short_conv_1686.wav 111111 What season is it now? A. Winter; B. Spring; C. Autumn. C True +short_conv_1687 gaokao_audio/short_conv_1687.wav 111111 Where does the conversation take place? A. In an office; B. In an apartment; C. In a shopping mall. C True +short_conv_1688 gaokao_audio/short_conv_1688.wav 111111 What does the woman write? A. Books; B. Plays; C. Newspaper articles. C True +short_conv_1689 gaokao_audio/short_conv_1689.wav 111111 What is the relationship between the speakers? A. Co-workers; B. Boss and employee; C. Taxi driver and customer. A True +short_conv_169 gaokao_audio/short_conv_169.wav 111111 What is the woman trying to do? A. Solve a crime; B. Decorate her bedroom; C. Study a language. C True +short_conv_1690 gaokao_audio/short_conv_1690.wav 111111 What’s the woman’s secret to making good spaghetti? A. She cooks the spaghetti longer; B. She adds some salt to the boiling water; C. She puts the spaghetti in before the water boils. B True +short_conv_1691 gaokao_audio/short_conv_1691.wav 111111 Where might the speakers be? A. In the man’s garden; B. In the man’s bedroom; C. In the man’s living room. C True +short_conv_1692 gaokao_audio/short_conv_1692.wav 111111 When will the bus arrive? A. In two minutes; B. In four minutes; C. In ten minutes. C True +short_conv_1693 gaokao_audio/short_conv_1693.wav 111111 What does the man do to relax at home? A. He reads novels; B. He plays the piano; C. He listens to music. A True +short_conv_1694 gaokao_audio/short_conv_1694.wav 111111 What does the man think of the game? A. Unimportant; B. Boring; C. Fair. B True +short_conv_1695 gaokao_audio/short_conv_1695.wav 111111 What gift will the woman probably get for Mary? A. A pen; B. A music record; C. A movie ticket. B True +short_conv_1696 gaokao_audio/short_conv_1696.wav 111111 When did the woman take a piano test? A. One week ago; B. One mouth ago; C. Two months ago. A True +short_conv_1697 gaokao_audio/short_conv_1697.wav 111111 What time is it now? A. 9:40; B. 10:00; C. 10:20. A True +short_conv_1698 gaokao_audio/short_conv_1698.wav 111111 What are the speakers talking about? A. The man’s favorite festival; B. The man’s aunt; C. The man’s school bag. C True +short_conv_1699 gaokao_audio/short_conv_1699.wav 111111 What does the woman mean? A. She thought it was very easy; B. She thought it was too hard for her to follow; C. She thought the instructor was very good. A True +short_conv_17 gaokao_audio/short_conv_17.wav 111111 Where does Mr. Green work? A. In a hospital; B. In the railway station; C. In the woman’s company. A True +short_conv_170 gaokao_audio/short_conv_170.wav 111111 What aspect of the jeans are the speakers discussing? A. The style; B. The color; C. The quality. A True +short_conv_1700 gaokao_audio/short_conv_1700.wav 111111 What does the woman mean? A. They will make a phone call to Dr. Smith tomorrow; B. Dr. Smith was late for the call; C. They can call on Dr. Smith tomorrow. A True +short_conv_1701 gaokao_audio/short_conv_1701.wav 111111 What does the woman mean? A. Business is not necessarily good at the turn of the year; B. Businessmen are the busiest people at the end of the year; C. There will be many cases at the end of the year. A True +short_conv_1702 gaokao_audio/short_conv_1702.wav 111111 What does the woman mean? A. She’s already an hour late; B. The man shouldn’t wait to be interviewed; C. She’s too nervous to calm down. C True +short_conv_1703 gaokao_audio/short_conv_1703.wav 111111 What does the man think of the book? A. It is not worth reading; B. It is not the one he likes; C. It is better than he expected. B True +short_conv_1704 gaokao_audio/short_conv_1704.wav 111111 What does the man dislike about the computer? A. The price; B. The monitor; C. The keyboard. A True +short_conv_1705 gaokao_audio/short_conv_1705.wav 111111 What did the man do last night? A. He painted some pictures; B. He watched a football match on TV; C. He went out to play football. B True +short_conv_1706 gaokao_audio/short_conv_1706.wav 111111 What's the probable relationship between the two speakers. A. Teacher and student; B. Husband and wife; C. Brother and sister. A True +short_conv_1707 gaokao_audio/short_conv_1707.wav 111111 Where does the conversation probably take place? A. At home; B. At the airport; C. At a supermarket. B True +short_conv_1708 gaokao_audio/short_conv_1708.wav 111111 How many students took the HSK test last month? A. 300; B. 400; C. 600. B True +short_conv_1709 gaokao_audio/short_conv_1709.wav 111111 What will the man do later? A. Eat out; B. Cook dinner; C. Buy vegetables. A True +short_conv_171 gaokao_audio/short_conv_171.wav 111111 How many fish did the man catch at the beginning? A. Two; B. Three; C. Six. C True +short_conv_1710 gaokao_audio/short_conv_1710.wav 111111 Where does the conversation take place? A. At school; B. At a shop; C. At the man’s house. B True +short_conv_1711 gaokao_audio/short_conv_1711.wav 111111 What does the woman do? A. A student; B. A waitress; C. A tour guide. C True +short_conv_1712 gaokao_audio/short_conv_1712.wav 111111 How did the man feel before his speech? A. Relaxed; B. Nervous; C. Confident. B True +short_conv_1713 gaokao_audio/short_conv_1713.wav 111111 What will the man do today? A. Play football; B. Buy some flowers; C. Work in the garden. C True +short_conv_1714 gaokao_audio/short_conv_1714.wav 111111 Where are the speakers? A. In a store; B. In a classroom; C. At a hotel. C True +short_conv_1715 gaokao_audio/short_conv_1715.wav 111111 What has the woman decided to do on Sunday afternoon? A. To attend a wedding; B. To visit an exhibition; C. To meet a friend. A True +short_conv_1716 gaokao_audio/short_conv_1716.wav 111111 When does the bank close on Saturday? A. At l:00 pm; B. At 3:00 pm; C. At 4:00 pm. B True +short_conv_1717 gaokao_audio/short_conv_1717.wav 111111 What was the normal price of the T-shirt? A. $15; B. $30; C. $50. B True +short_conv_1718 gaokao_audio/short_conv_1718.wav 111111 What will Dorothy do on the weekend? A. Go out with her friend; B. Work on her paper; C. Make some plans. B True +short_conv_1719 gaokao_audio/short_conv_1719.wav 111111 How many notebooks does the man have in his backpack? A. Two; B. Five; C. Ten. B True +short_conv_172 gaokao_audio/short_conv_172.wav 111111 What will the man do next? A. Pour the milk in the sink; B. Buy some milk; C. Eat breakfast. B True +short_conv_1720 gaokao_audio/short_conv_1720.wav 111111 How is the woman feeling about her speech today? A. Excited; B. Proud; C. Nervous. C True +short_conv_1721 gaokao_audio/short_conv_1721.wav 111111 What does the man want to eat? A. A pizza; B. A burger; C. Some dessert. A True +short_conv_1722 gaokao_audio/short_conv_1722.wav 111111 What is the man’s problem? A. He doesn’t like French; B. He doesn’t have a dictionary; C. He doesn’t have good reading skills. C True +short_conv_1723 gaokao_audio/short_conv_1723.wav 111111 What kind of music does the man like the most? A. Jazz; B. Classical; C. Rock. A True +short_conv_1724 gaokao_audio/short_conv_1724.wav 111111 What does the woman think of the shirt for the party? A. The size is not large enough; B. The material is not good; C. The color is not suitable. C True +short_conv_1725 gaokao_audio/short_conv_1725.wav 111111 When can the woman get the computers? A. On Tuesday; B. On Wednesday; C. On Thursday. A True +short_conv_1726 gaokao_audio/short_conv_1726.wav 111111 How does the man feel about going to school by bike? A. Delighted; B. Tired; C. Concerned. A True +short_conv_1727 gaokao_audio/short_conv_1727.wav 111111 How much will the man pay for the tickets? A. £7.5; B. £15; C. £30. B True +short_conv_1728 gaokao_audio/short_conv_1728.wav 111111 Which is the right gate for the man’s flight? A. Gate 16; B. Gate 25; C. Gate 22. B True +short_conv_1729 gaokao_audio/short_conv_1729.wav 111111 What are the speakers talking about? A. WeChat; B. Online shopping; C. The man’s grandma. C True +short_conv_173 gaokao_audio/short_conv_173.wav 111111 What kind of movie will the speakers watch? A. An action movie; B. A comedy; C. A thriller. B True +short_conv_1730 gaokao_audio/short_conv_1730.wav 111111 Why can’t the lecture be held tomorrow? A. The CEO won’t be available then; B. The lecture hall isn’t big enough; C. The equipment in the lecture hall doesn’t work. A True +short_conv_1731 gaokao_audio/short_conv_1731.wav 111111 When will the next underground arrive? A. At 1:55; B. At 2:00; C. At 2:05. B True +short_conv_1732 gaokao_audio/short_conv_1732.wav 111111 Where is the bookstore? A. Near a hotel; B. On the left of a hospital; C. On the right side of Main Street. A True +short_conv_1733 gaokao_audio/short_conv_1733.wav 111111 What color are the gloves? A. Blue; B. Green; C. Yellow. B True +short_conv_1734 gaokao_audio/short_conv_1734.wav 111111 What does the woman want to do? A. See a film with the man; B. Offer the man some help; C. Listen to some great music. A True +short_conv_1735 gaokao_audio/short_conv_1735.wav 111111 What will the man do? A. Change the plan B. Wait for a phone call C. Sort things out B True +short_conv_1736 gaokao_audio/short_conv_1736.wav 111111 At what time will the two speakers meet? A. 5:20 B. 5:10 C. 5:40 B True +short_conv_1737 gaokao_audio/short_conv_1737.wav 111111 Which place are the speakers trying to find? A. A hotel B. A bank C. A restaurant. A True +short_conv_1738 gaokao_audio/short_conv_1738.wav 111111 What does the man like about the play? A. The story; B. The ending; C. The actor. C True +short_conv_1739 gaokao_audio/short_conv_1739.wav 111111 What are the speakers mainly talking about? A. Their holiday plans; B. How to celebrate a festival; C. How to spend the weekends. B True +short_conv_174 gaokao_audio/short_conv_174.wav 111111 Why is Emily mentioned in the conversation? A. She might want a ticket; B. She is looking for the man; C. She has an extra ticket. A True +short_conv_1740 gaokao_audio/short_conv_1740.wav 111111 Where is the woman’s next stop? A. New York; B. Paris; C. London. A True +short_conv_1741 gaokao_audio/short_conv_1741.wav 111111 How will the man go to Detroit? A. By plane; B. By bus; C. By train. C True +short_conv_1742 gaokao_audio/short_conv_1742.wav 111111 What does the man mean? A. He’d like to see Joan; B. He doesn’t want to see Joan; C. He will see Joan eventually. B True +short_conv_1743 gaokao_audio/short_conv_1743.wav 111111 What is the man’s attitude towards the plan? A. He is against it; B. He doesn’t care; C. He thinks it is necessary. A True +short_conv_1744 gaokao_audio/short_conv_1744.wav 111111 Which house fits the speakers? A. House One; B. House Two; C. House Three. B True +short_conv_1745 gaokao_audio/short_conv_1745.wav 111111 What is the man most probably? A. A shop assistant; B. A postman; C. A passer-by. A True +short_conv_1746 gaokao_audio/short_conv_1746.wav 111111 What do we know about the woman’s son? A. He is still a student now; B. He wanted to study arts; C. He taught in Harvard University. B True +short_conv_1747 gaokao_audio/short_conv_1747.wav 111111 Where is the woman living this semester? A. In a rented room; B. In the dormitory; C. At home. B True +short_conv_1748 gaokao_audio/short_conv_1748.wav 111111 What are the speakers talking about? A. Tradition; B. A disease; C. A service. C True +short_conv_1749 gaokao_audio/short_conv_1749.wav 111111 Where are the speakers probably right now? A. In a restaurant; B. At a supermarket; C. At a watch store. A True +short_conv_175 gaokao_audio/short_conv_175.wav 111111 What are the speakers talking about? A. What to drink; B. Where to meet; C. When to leave. B True +short_conv_1750 gaokao_audio/short_conv_1750.wav 111111 When will the professor be back? A. At 12:00; B. At 13:00; C. At 14:00. C True +short_conv_1751 gaokao_audio/short_conv_1751.wav 111111 How might be Mary’s university life before September? A. Exciting; B. Terrible; C. Ordinary. B True +short_conv_1752 gaokao_audio/short_conv_1752.wav 111111 What does the woman advise the man to do? A. Go to the shop to replace the camera; B. Choose a good angle when taking pictures; C. Keep the camera clean when taking pictures. C True +short_conv_1753 gaokao_audio/short_conv_1753.wav 111111 Who is Rose probably? A. The man’s student; B. The speakers’ daughter; C. The woman’s teacher. B True +short_conv_1754 gaokao_audio/short_conv_1754.wav 111111 What does the woman imply? A. The man is so forgetful; B. The man is too careless; C. The man is over confident. C True +short_conv_1755 gaokao_audio/short_conv_1755.wav 111111 Which aspect of the film does the woman like? A. The plot; B. The music; C. The dialogue. C True +short_conv_1756 gaokao_audio/short_conv_1756.wav 111111 What do we know about the woman’s jacket? A. It is sold at a lower price; B. Its color is her favorite; C. It is her sister’s size. A True +short_conv_1757 gaokao_audio/short_conv_1757.wav 111111 Where did the speakers plan to go? A. A shopping center; B. An opera house; C. The parking lot. B True +short_conv_1758 gaokao_audio/short_conv_1758.wav 111111 Where does the conversation most probably take place? A. In an office; B. In a library; C. In a bookstore. C True +short_conv_1759 gaokao_audio/short_conv_1759.wav 111111 What does the man mean? A. He is very excited about the news; B. He doesn’t pay attention to sports; C. He wishes a different team had won. B True +short_conv_176 gaokao_audio/short_conv_176.wav 111111 What is the relationship between the speakers? A. Colleges; B. Classmates; C. Strangers. C True +short_conv_1760 gaokao_audio/short_conv_1760.wav 111111 What will the young woman probably do? A. Write a paper; B. Ask her mother for help; C. Help the man with his homework. B True +short_conv_1761 gaokao_audio/short_conv_1761.wav 111111 Who is the woman? A. A clerk; B. A teacher; C. A student. A True +short_conv_1762 gaokao_audio/short_conv_1762.wav 111111 How much did Tom return to the woman? A. $5; B. $15; C. $50. B True +short_conv_1763 gaokao_audio/short_conv_1763.wav 111111 How does the woman feel about her new job? A. Bored; B. Worried; C. Excited. C True +short_conv_1764 gaokao_audio/short_conv_1764.wav 111111 What is the man doing? A. Looking for a job ; B. Asking for advice; C. Reserving a hotel . A True +short_conv_1765 gaokao_audio/short_conv_1765.wav 111111 What do we know about the man? A. He canceled his flight; B. He was late for the meeting; C. He skipped the discussion. B True +short_conv_1766 gaokao_audio/short_conv_1766.wav 111111 What did the man think of the movie? A. Interesting; B. Moving; C. Boring. C True +short_conv_1767 gaokao_audio/short_conv_1767.wav 111111 On which day does the woman work seven hours? A. On Monday; B. On Thursday; C. On Friday. C True +short_conv_1768 gaokao_audio/short_conv_1768.wav 111111 What is Maria going to do next? A. Answer questions; B. Attend a lecture; C. Set up a project. B True +short_conv_1769 gaokao_audio/short_conv_1769.wav 111111 What does the man suggest the woman do? A. Write Daisy a note of apology; B. Return Daisy’s notes in a few days; C. Apologize when Daisy is less angry. C True +short_conv_177 gaokao_audio/short_conv_177.wav 111111 What does Jack want to do? A. Take fitness classes; B. Buy a pair of gym shoes; C. Change his work schedule. A True +short_conv_1770 gaokao_audio/short_conv_1770.wav 111111 How much money can the woman lend to the man? A. $ 50; B. $ 100; C. $ 150. A True +short_conv_1771 gaokao_audio/short_conv_1771.wav 111111 What was the weather like at noon? A. Hot; B. Cool; C. Cold. B True +short_conv_1772 gaokao_audio/short_conv_1772.wav 111111 Where are the speakers? A. In a library; B. In a bookstore; C. In a classroom. B True +short_conv_1773 gaokao_audio/short_conv_1773.wav 111111 What is the man? A. A cook; B. A teacher; C. A salesman. A True +short_conv_1774 gaokao_audio/short_conv_1774.wav 111111 What will the man probably do? A. Sail in a boat; B. Swim in the ocean; C. Go shopping with the woman. A True +short_conv_1775 gaokao_audio/short_conv_1775.wav 111111 When do the speakers plan to meet? A. This afternoon; B. Tomorrow morning; C. Tomorrow afternoon. C True +short_conv_1776 gaokao_audio/short_conv_1776.wav 111111 Why didn’t the man invite the woman to the party? A. He doesn’t like the woman at all; B. He thought the woman had known it; C. He was afraid that the woman had no time. B True +short_conv_1777 gaokao_audio/short_conv_1777.wav 111111 How did the man think of the movie? A. Uninteresting; B. Very interesting; C. Too long. A True +short_conv_1778 gaokao_audio/short_conv_1778.wav 111111 What does the man ask the woman to do? A. Do her homework; B. Make dinner for him; C. Have dinner with him. C True +short_conv_1779 gaokao_audio/short_conv_1779.wav 111111 Where does the man’s uncle live? A. In New York; B. In London; C. In Paris. C True +short_conv_178 gaokao_audio/short_conv_178.wav 111111 Where does this conversation take place? A. In a classroom; B. In a hospital; C. In a museum. B True +short_conv_1780 gaokao_audio/short_conv_1780.wav 111111 How much did the jeans cost before the sale? A. 30 dollars B. 50 dollars C. 60 dollars C True +short_conv_1781 gaokao_audio/short_conv_1781.wav 111111 What will the man do tomorrow? A. Go hiking; B. Stay at home; C. See a doctor. B True +short_conv_1782 gaokao_audio/short_conv_1782.wav 111111 When is the man flying to Paris? A. On February 5th; B. On February 10th; C. On February 15th. C True +short_conv_1783 gaokao_audio/short_conv_1783.wav 111111 Why doesn’t the woman want to wear the coat? A. The style is old; B. The color is ugly; C. The quality is not good. A True +short_conv_1784 gaokao_audio/short_conv_1784.wav 111111 How much was the woman charged? A. $21; B. $30; C. $60. A True +short_conv_1785 gaokao_audio/short_conv_1785.wav 111111 What is the woman doing? A. Booking flight tickets; B. Catching a flight; C. Trying to change seats. A True +short_conv_1786 gaokao_audio/short_conv_1786.wav 111111 What’s the man’s excuse for failing the math exam? A. He didn’t prepare it well; B. He got too much pressure; C. He isn’t talented at math. C True +short_conv_1787 gaokao_audio/short_conv_1787.wav 111111 What will the man do next Tuesday? A. Play football; B. Watch a game; C. Visit a factory. C True +short_conv_1788 gaokao_audio/short_conv_1788.wav 111111 Why won’t the woman go to the bar? A. It’s no fun; B. It’s expensive; C. It’s too far away. B True +short_conv_1789 gaokao_audio/short_conv_1789.wav 111111 What color is the woman’s new skirt? A. Green; B. Red; C. Blue. C True +short_conv_179 gaokao_audio/short_conv_179.wav 111111 Why would David quit his job? A. To go back to school; B. To start his own firm; C. To work for his friend. C True +short_conv_1790 gaokao_audio/short_conv_1790.wav 111111 Who probably went to Prof. Freeman’s class today? A. Felicia; B. Jack; C. Eric. C True +short_conv_1791 gaokao_audio/short_conv_1791.wav 111111 How will the speakers travel to the countryside? A. By car; B. By bus; C. By train. A True +short_conv_1792 gaokao_audio/short_conv_1792.wav 111111 What will the woman do this Saturday? A. Try the new restaurant; B. Attend a concert. ; C. Go to the park. B True +short_conv_1793 gaokao_audio/short_conv_1793.wav 111111 What is the man? A. An actor; B. A director; C. A screenwriter. C True +short_conv_1794 gaokao_audio/short_conv_1794.wav 111111 What is the man’s suggestion about serious pollution? A. Don’t breathe the poisonous air; B. The government should take action; C. The government should protect the environment. B True +short_conv_1795 gaokao_audio/short_conv_1795.wav 111111 What does the man want to do? A. Buy a light; B. Get to the nearest light; C. Go to the supermarket. C True +short_conv_1796 gaokao_audio/short_conv_1796.wav 111111 What does Laura need at the moment? A. Blame; B. Encouragement; C. Help with her chemistry. B True +short_conv_1797 gaokao_audio/short_conv_1797.wav 111111 How many pills should the woman take at a time? A. 5; B. 3; C. 2. A True +short_conv_1798 gaokao_audio/short_conv_1798.wav 111111 What will the woman do this Saturday? A. Go to see her sister; B. Go to the concert; C. Look after her brother’s son. C True +short_conv_1799 gaokao_audio/short_conv_1799.wav 111111 What did the man think of the lecture? A. Exciting; B. Boring; C. Moving. B True +short_conv_18 gaokao_audio/short_conv_18.wav 111111 When does the man usually sleep? A. At 9:00; B. At 10:00; C. At 11:00. B True +short_conv_180 gaokao_audio/short_conv_180.wav 111111 What does the man tell Jane to do? A. Postpone his appointment; B. Meet Mr. Douglas; C. Return at 3 o’clock. A True +short_conv_1800 gaokao_audio/short_conv_1800.wav 111111 What are the speakers talking about? A. Teachers’ hard work; B. A school performance; C. Long studying hours. B True +short_conv_1801 gaokao_audio/short_conv_1801.wav 111111 Where does the conversation probably take place? A. At school; B. At home; C. At a shop. A True +short_conv_1802 gaokao_audio/short_conv_1802.wav 111111 What can we know about the man’s hobby? A. His hobby is stamp collecting; B. He has no hobby; C. His hobby is photography. C True +short_conv_1803 gaokao_audio/short_conv_1803.wav 111111 What program is the man watching? A. An advertisement; B. The World Cup; C. An interesting play. A True +short_conv_1804 gaokao_audio/short_conv_1804.wav 111111 What does the woman think of the weather today? A. It’s too hot; B. It’s pretty cool; C. It’s sunny and nice. C True +short_conv_1805 gaokao_audio/short_conv_1805.wav 111111 Where does the woman work? A. In a restaurant; B. In a shoe store; C. In a supermarket. A True +short_conv_1806 gaokao_audio/short_conv_1806.wav 111111 What’s the relationship between the speakers? A. Classmates; B. Dentist and patient; C. Teacher and student. A True +short_conv_1807 gaokao_audio/short_conv_1807.wav 111111 Why does the woman need to go to the dentist? A. To have a tooth pulled; B. To check her sore tooth; C. To get her teeth cleaned. C True +short_conv_1808 gaokao_audio/short_conv_1808.wav 111111 What meal is the man eating? A. Breakfast; B. Lunch; C. Dinner. A True +short_conv_1809 gaokao_audio/short_conv_1809.wav 111111 What does the man think of the film? A. Worth watching; B. Difficult to follow; C. Very famous. B True +short_conv_181 gaokao_audio/short_conv_181.wav 111111 How much will the man pay? A. $520; B. $80; C. $100. B True +short_conv_1810 gaokao_audio/short_conv_1810.wav 111111 Why does Alice feel excited? A. She has won the first race; B. She has been chosen for the race; C. She has got a pair of running shoes. B True +short_conv_1811 gaokao_audio/short_conv_1811.wav 111111 What are the speakers talking about? A. A dish; B. An artist; C. A trip. A True +short_conv_1812 gaokao_audio/short_conv_1812.wav 111111 Where should the man take the first turning? A. At the theater; B. At a post office; C. At the barber’s shop. C True +short_conv_1813 gaokao_audio/short_conv_1813.wav 111111 What does the man want to buy? A. Football B. Some books; C. Basketball tickets. C True +short_conv_1814 gaokao_audio/short_conv_1814.wav 111111 Why is the woman late for her class again? A. She has to prepare the supper; B. She has to do her homework; C. She has to meet some friends. A True +short_conv_1815 gaokao_audio/short_conv_1815.wav 111111 What are the speakers going to do? A. Go skiing; B. Go to school; C. Clean the snow. A True +short_conv_1816 gaokao_audio/short_conv_1816.wav 111111 What is the man doing? A. Buying a book; B. Chatting with a friend; C. Asking the way. C True +short_conv_1817 gaokao_audio/short_conv_1817.wav 111111 What is the possible relationship between the speakers? A. Classmates; B. Strangers; C. Workmates. C True +short_conv_1818 gaokao_audio/short_conv_1818.wav 111111 What instrument is the woman best at playing? A. Erhu; B. Violin; C. Piano. B True +short_conv_1819 gaokao_audio/short_conv_1819.wav 111111 What are the speakers talking about? A. A dress; B. A sale; C. Some shoes. A True +short_conv_182 gaokao_audio/short_conv_182.wav 111111 Where does the conversation probably take place? A. In a library; B. In a bookstore; C. In a classroom. B True +short_conv_1820 gaokao_audio/short_conv_1820.wav 111111 Where are the speakers? A. On a bus; B. On a train; C. On a plane. C True +short_conv_1821 gaokao_audio/short_conv_1821.wav 111111 What happened to the woman? A. She was late for work; B. She offered bad service; C. She was asked to leave her job. A True +short_conv_1822 gaokao_audio/short_conv_1822.wav 111111 What kind of weather does the man like? A. Rainy; B. Sunny; C. Cloudy. B True +short_conv_1823 gaokao_audio/short_conv_1823.wav 111111 What is the woman looking for? A. Her glasses; B. Her keys; C. Her books. A True +short_conv_1824 gaokao_audio/short_conv_1824.wav 111111 What did Patrick do last Friday? A. He moved to another place; B. He sold his old apartment; C. He went out with a friend. A True +short_conv_1825 gaokao_audio/short_conv_1825.wav 111111 What does the woman do? A. She’s a salesperson; B. She’s a librarian; C. She’s a bank clerk. B True +short_conv_1826 gaokao_audio/short_conv_1826.wav 111111 What did Fred do? A. He travelled to Italy; B. He offered Kate a ride; C. He bought a new car. C True +short_conv_1827 gaokao_audio/short_conv_1827.wav 111111 How does Henry feel now? A. Proud; B. Tired; C. Grateful. B True +short_conv_1828 gaokao_audio/short_conv_1828.wav 111111 What is the woman going to do this afternoon? A. Eat out; B. See a doctor; C. Go shopping. C True +short_conv_1829 gaokao_audio/short_conv_1829.wav 111111 Why does the man come to the woman? A. To take a picture of her; B. To ask for a new ID card; C. To fill out a form. B True +short_conv_183 gaokao_audio/short_conv_183.wav 111111 How does the woman feel now? A. Relaxed; B. Excited; C. Tired. C True +short_conv_1830 gaokao_audio/short_conv_1830.wav 111111 What color was the woman’s couch? A. Yellow; B. Brown; C. Purple. C True +short_conv_1831 gaokao_audio/short_conv_1831.wav 111111 What are the speakers mainly talking about? A. The man’s watch; B. The man’s brother; C. The man’s birthday. A True +short_conv_1832 gaokao_audio/short_conv_1832.wav 111111 What is the dog’s name? A. Scott; B. Michael; C. Robert. A True +short_conv_1833 gaokao_audio/short_conv_1833.wav 111111 What do we know about the watch? A. The watch was not worth that much; B. The price was reasonable; C. It cost the woman $ 40. A True +short_conv_1834 gaokao_audio/short_conv_1834.wav 111111 When is Simon supposed to arrive? A. 8:00; B. 7:30; C. 8:10. A True +short_conv_1835 gaokao_audio/short_conv_1835.wav 111111 What does the man mean? A. He will carry the boxes later; B. He is unable to give help; C. He refuses to pay for boxes. B True +short_conv_1836 gaokao_audio/short_conv_1836.wav 111111 What did the woman think of Dana’s speech? A. Important; B. Boring; C. Well-prepared. C True +short_conv_1837 gaokao_audio/short_conv_1837.wav 111111 What are the speakers talking about? A. Borrowing DVDs; B. Buying DVDs; C. Sharing DVDs. A True +short_conv_1838 gaokao_audio/short_conv_1838.wav 111111 What will the woman do about the dress? A. She’ll return it; B. She’ll change it; C. She’ll buy it. C True +short_conv_1839 gaokao_audio/short_conv_1839.wav 111111 Where are the two speakers? A. On the ground floor; B. By the European paintings; C. At the black and white photo show. A True +short_conv_184 gaokao_audio/short_conv_184.wav 111111 Why would David quit his job? A. To go back to school; B. To start his own firm; C. To work for his friend. C True +short_conv_1840 gaokao_audio/short_conv_1840.wav 111111 What are the two speakers talking about? A. A new movie; B. A weekend plan; C. Steve’s cousin. B True +short_conv_1841 gaokao_audio/short_conv_1841.wav 111111 What will the woman do? A. Cut down on food; B. Take her temperature; C. Take medicine with food. C True +short_conv_1842 gaokao_audio/short_conv_1842.wav 111111 What happened to Susan? A. She lost her ticket; B. She got her driving license; C. She was fined for speeding. C True +short_conv_1843 gaokao_audio/short_conv_1843.wav 111111 How does the woman find the book? A. Appealing B. Just so-so; C. Strange. A True +short_conv_1844 gaokao_audio/short_conv_1844.wav 111111 What is the man interested in? A. Education; B. Medicine; C. Technology. A True +short_conv_1845 gaokao_audio/short_conv_1845.wav 111111 Why does the man want to move? A. To be near his office; B. To go to a good school; C. To live in a bigger house. C True +short_conv_1846 gaokao_audio/short_conv_1846.wav 111111 What would the man like to drink? A. Iced coffee; B. Red tea; C. Hot coffee. C True +short_conv_1847 gaokao_audio/short_conv_1847.wav 111111 What will the girl do with Holly? A. Wash their bikes; B. Do their homework; C. Shop for new skirts. A True +short_conv_1848 gaokao_audio/short_conv_1848.wav 111111 Where are the speakers? A. In Singapore; B. In Canada; C. In America. B True +short_conv_1849 gaokao_audio/short_conv_1849.wav 111111 Where is Peter now? A. In an office; B. At a restaurant; C. At home. A True +short_conv_185 gaokao_audio/short_conv_185.wav 111111 What does the man tell Jane to do? A. Postpone his appointment; B. Meet Mr. Douglas; C. Return at 3 o’clock. A True +short_conv_1850 gaokao_audio/short_conv_1850.wav 111111 What is the man going to do first? A. Watch a movie; B. Do some shopping; C. Meet his teacher. C True +short_conv_1851 gaokao_audio/short_conv_1851.wav 111111 What does the man mean? A. The woman can’t leave early; B. He’ll pick up the woman’s parents; C. Mr. Black won’t come at 4 o’clock. A True +short_conv_1852 gaokao_audio/short_conv_1852.wav 111111 How will the woman pay for the toy? A. In cash; B. By check; C. By credit card. B True +short_conv_1853 gaokao_audio/short_conv_1853.wav 111111 What time does Bill usually get up? A. Around 7:00; B. Around 6:30; C. Around 6:00. C True +short_conv_1854 gaokao_audio/short_conv_1854.wav 111111 What has the bear been doing? A. Eating campers’ food; B. Chasing the tourists; C. Attacking the park rangers. A True +short_conv_1855 gaokao_audio/short_conv_1855.wav 111111 What are the speakers talking about? A. A nice hairstyle; B. Their wedding; C. An old photo. C True +short_conv_1856 gaokao_audio/short_conv_1856.wav 111111 Where does the man want to visit? A. Spain; B. Italy; C. France. B True +short_conv_1857 gaokao_audio/short_conv_1857.wav 111111 How does the woman probably feel? A. Excited; B. Nervous; C. Unhappy. C True +short_conv_1858 gaokao_audio/short_conv_1858.wav 111111 Where is this bus going? A. South; B. East; C. North. A True +short_conv_1859 gaokao_audio/short_conv_1859.wav 111111 What do we know about the woman? A. She is fired; B. She didn’t work hard; C. She can take a day off tomorrow. A True +short_conv_186 gaokao_audio/short_conv_186.wav 111111 How much will the man pay? A. $520; B. $80; C. $100. B True +short_conv_1860 gaokao_audio/short_conv_1860.wav 111111 In which country does Jane want to spend her holiday? A. America; B. Korea; C. Japan. B True +short_conv_1861 gaokao_audio/short_conv_1861.wav 111111 When will the speakers meet? A. At 6:20; B. At 6:10; C. At 5:40. B True +short_conv_1862 gaokao_audio/short_conv_1862.wav 111111 Where does the conversation probably take place? A. In an office; B. In a store; C. In a hotel. C True +short_conv_1863 gaokao_audio/short_conv_1863.wav 111111 What is the woman doing now? A. Watching TV; B. Taking part in an activity; C. Preparing for an exam. C True +short_conv_1864 gaokao_audio/short_conv_1864.wav 111111 What will the man do right now? A. Buy his mum a coat; B. Buy his mum a handbag; C. Give Mary a call C True +short_conv_1865 gaokao_audio/short_conv_1865.wav 111111 What time will the man call the woman? A. At 5:30; B. At 6:00; C. At 6:30. A True +short_conv_1866 gaokao_audio/short_conv_1866.wav 111111 Which dress does the woman want to buy? A. The red one; B. The green one; C. The brown one. B True +short_conv_1867 gaokao_audio/short_conv_1867.wav 111111 How much should the man pay? A. $19; B. $18; C. $17. A True +short_conv_1868 gaokao_audio/short_conv_1868.wav 111111 Which place is the woman heading for right away? A. Her office; B. A flower shop; C. A hospital. B True +short_conv_1869 gaokao_audio/short_conv_1869.wav 111111 What does the man want? A. A hot drink; B. Iced tea; C. A chocolate cake. A True +short_conv_187 gaokao_audio/short_conv_187.wav 111111 How does the woman feel now? A. Relaxed; B. Excited; C. Tired. C True +short_conv_1870 gaokao_audio/short_conv_1870.wav 111111 What does the man think the woman should do? A. Cancel her trip to Spain; B. Speak out how she feels; C. Go to another country. B True +short_conv_1871 gaokao_audio/short_conv_1871.wav 111111 What does the man want to do? A. Borrow a book; B. Buy a book online; C. Return a book to the library. A True +short_conv_1872 gaokao_audio/short_conv_1872.wav 111111 What do we know about the man’s ticket? A. It was super expensive; B. He bought it a week ago; C. He got it at the last minute. C True +short_conv_1873 gaokao_audio/short_conv_1873.wav 111111 What time is it in New York? A. It’s 5:00 p.m; B. It’s 7:00 p.m; C. It’s 10:00 p.m. B True +short_conv_1874 gaokao_audio/short_conv_1874.wav 111111 Why did the girl run into the man? A. She was running too fast; B. She was looking at her phone; C. She was holding too many papers. B True +short_conv_1875 gaokao_audio/short_conv_1875.wav 111111 What does the woman suggest the man do? A. Get a new car; B. Get a new job; C. Fix his car. A True +short_conv_1876 gaokao_audio/short_conv_1876.wav 111111 What will the man probably do next? A. Check out of his hotel; B. Take some medicine; C. See a doctor. C True +short_conv_1877 gaokao_audio/short_conv_1877.wav 111111 Where might the speakers be? A. In a restaurant; B. At the man’s house; C. In a supermarket. A True +short_conv_1878 gaokao_audio/short_conv_1878.wav 111111 What does the man imply? A. He won’t listen to the woman; B. He doesn’t know the woman; C. He mistook the woman for someone else. B True +short_conv_1879 gaokao_audio/short_conv_1879.wav 111111 Who likes music that has great lyrics(歌词)? A. The woman B. The man C. Both of them A True +short_conv_188 gaokao_audio/short_conv_188.wav 111111 Where does the conversation probably take place? A. In a library; B. In a bookstore; C. In a classroom. B True +short_conv_1880 gaokao_audio/short_conv_1880.wav 111111 What does the woman want the man to do? A. Take her bike away; B. Go out with her; C. Repair her bike C True +short_conv_1881 gaokao_audio/short_conv_1881.wav 111111 How many classes does the man have? A. Three B. Four C. Five B True +short_conv_1882 gaokao_audio/short_conv_1882.wav 111111 Where does the conversation probably take place? A. In a restaurant B. In a hospital C. In a shop A True +short_conv_1883 gaokao_audio/short_conv_1883.wav 111111 What does the man advise the woman to wear? A. A suit B. A uniform C. A black dress C True +short_conv_1884 gaokao_audio/short_conv_1884.wav 111111 What are the two speakers talking about? A. Diving; B. Drawing; C. Driving C True +short_conv_1885 gaokao_audio/short_conv_1885.wav 111111 Why is the woman preparing so much food? A. It’s the man’s birthday; B. The woman wants to thank the man; C. The man can eat a lot. A True +short_conv_1886 gaokao_audio/short_conv_1886.wav 111111 Where does the conversation most probably take place? A. In a clothing store B. In a restaurant C. In a bookstore B True +short_conv_1887 gaokao_audio/short_conv_1887.wav 111111 Where is the man going first? A. To the Healey Supermarket; B. To the airport; C. To Canada. A True +short_conv_1888 gaokao_audio/short_conv_1888.wav 111111 Where is the man’s mother now? A. At home; B. In a hospital; C. At a bus stop. B True +short_conv_1889 gaokao_audio/short_conv_1889.wav 111111 What might have happened? A. An earthquake; B. A fire; C. A gas accident. A True +short_conv_189 gaokao_audio/short_conv_189.wav 111111 Why is Emily mentioned in the conversation? A. She might want a ticket; B. She is looking for the man; C. She has an extra ticket. A True +short_conv_1890 gaokao_audio/short_conv_1890.wav 111111 What is the man doing? A. Making a phone call; B. Making a visit; C. Making an appointment. B True +short_conv_1891 gaokao_audio/short_conv_1891.wav 111111 When will the man have a meeting? A. In a minute; B. Tomorrow; C. In a couple of hours. C True +short_conv_1892 gaokao_audio/short_conv_1892.wav 111111 What will the woman probably do? A. Wait for the airport bus; B. Go to the airport by taxi; C. Take a taxi and go home. B True +short_conv_1893 gaokao_audio/short_conv_1893.wav 111111 How does the man like to begin his lecture? A. With an introduction; B. With a smile; C. With a funny story. C True +short_conv_1894 gaokao_audio/short_conv_1894.wav 111111 How might the woman feel? A. Uneasy; B. Disappointed; C. Unconcerned. B True +short_conv_1895 gaokao_audio/short_conv_1895.wav 111111 What seemed to be Sarah’s problem? A. She couldn’t finish the task as required; B. She failed in a job interview again; C. She always went to work late. A True +short_conv_1896 gaokao_audio/short_conv_1896.wav 111111 What are the speakers mainly talking about? A. Environmental protection; B. Greenhouse effect; C. Gardening skills. C True +short_conv_1897 gaokao_audio/short_conv_1897.wav 111111 How much more does Lucas need for the cellphone? A. $300; B. $500; C. $800. A True +short_conv_1898 gaokao_audio/short_conv_1898.wav 111111 What did the woman try to quit drinking? A. Tea; B. Coffee; C. Juice. B True +short_conv_1899 gaokao_audio/short_conv_1899.wav 111111 What are the speakers talking about? A. Weather; B. Clothes; C. News. A True +short_conv_19 gaokao_audio/short_conv_19.wav 111111 Why did the man get a ticket? A. He drove too fast; B. He ran the red light; C. He made a wrong turn. B True +short_conv_190 gaokao_audio/short_conv_190.wav 111111 What is the relationship between the speakers? A. Colleges; B. Classmates; C. Strangers. C True +short_conv_1900 gaokao_audio/short_conv_1900.wav 111111 What does the man think of the book? A. Quite difficult; B. Very interesting; C. Too simple. B True +short_conv_1901 gaokao_audio/short_conv_1901.wav 111111 Who might Mr. Peterson be? A. A new professor; B. A department head; C. A company director. C True +short_conv_1902 gaokao_audio/short_conv_1902.wav 111111 What will the man do for the woman? A. Repair her car; B. Give her a ride; C. Pick up her aunt. B True +short_conv_1903 gaokao_audio/short_conv_1903.wav 111111 What does the woman want to do? A. Find a place; B. Buy a map; C. Get an address. A True +short_conv_1904 gaokao_audio/short_conv_1904.wav 111111 What does the woman want the man to do? A. Speak louder; B. Apologize to her; C. Turn off the radio. C True +short_conv_1905 gaokao_audio/short_conv_1905.wav 111111 What is the woman’s opinion about the course? A. Too hard; B. Worth taking; C. Very easy. B True +short_conv_1906 gaokao_audio/short_conv_1906.wav 111111 What will the man do? A. Attend a meeting; B. Give a lecture; C. Leave his office. A True +short_conv_1907 gaokao_audio/short_conv_1907.wav 111111 What does the woman think of the weather? A. It’s nice; B. It’s warm; C. It’s cold. C True +short_conv_1908 gaokao_audio/short_conv_1908.wav 111111 What time is it now? A. 9:10; B. 9:50; C. 10:00. A True +short_conv_1909 gaokao_audio/short_conv_1909.wav 111111 What is the woman’s attitude? A. She thinks spoken English is useful; B. She is good at spoken English; C. She isn’t interested in spoken English. A True +short_conv_191 gaokao_audio/short_conv_191.wav 111111 What are the speakers talking about? A. What to drink; B. Where to meet; C. When to leave. B True +short_conv_1910 gaokao_audio/short_conv_1910.wav 111111 What is the weather like today? A. Rainy; B. Snowy; C. Sunny. C True +short_conv_1911 gaokao_audio/short_conv_1911.wav 111111 Why did the woman have to walk? A. Her car was stolen; B. Her car hit a high tree; C. Something has gone wrong with her car. C True +short_conv_1912 gaokao_audio/short_conv_1912.wav 111111 How long can the woman keep the book? A. For six days; B. For five days; C. For eight days. A True +short_conv_1913 gaokao_audio/short_conv_1913.wav 111111 When will the woman sleep? A. After taking a walk; B. After turning off the lights; C. Before turning off the lights. B True +short_conv_1914 gaokao_audio/short_conv_1914.wav 111111 What did the woman regret? A. Watching the soap opera; B. Paying for the tickets; C. Seeing the film. C True +short_conv_1915 gaokao_audio/short_conv_1915.wav 111111 Where are the speakers going? A. A toy store; B. A restaurant; C. A bookstore. B True +short_conv_1916 gaokao_audio/short_conv_1916.wav 111111 What seems to be Peter’s problem? A. He came late for a class; B. He took the wrong seat; C. He failed to borrow books. A True +short_conv_1917 gaokao_audio/short_conv_1917.wav 111111 How does the woman sound? A. Excited; B. Surprised; C. Annoyed. C True +short_conv_1918 gaokao_audio/short_conv_1918.wav 111111 What is the man doing now? A. Applying for a job; B. Asking for a pay raise; C. Interviewing the woman. C True +short_conv_1919 gaokao_audio/short_conv_1919.wav 111111 What does the woman mean? A. It’s terrible to go abroad alone; B. It doesn’t matter if the man is not good at English; C. The man should improve his English. C True +short_conv_192 gaokao_audio/short_conv_192.wav 111111 What does Jack want to do? A. Take fitness classes; B. Buy a pair of gym shoes; C. Change his work schedule. A True +short_conv_1920 gaokao_audio/short_conv_1920.wav 111111 What do we know about the woman? A. She is too busy to go swimming; B. She’s willing to go swimming; C. She doesn’t want to wait long. B True +short_conv_1921 gaokao_audio/short_conv_1921.wav 111111 What has the man been doing? A. Having an interview; B. Filling out a form; C. Asking for information. B True +short_conv_1922 gaokao_audio/short_conv_1922.wav 111111 What is the man? A. He is a sports fan; B. He is a referee; C. He is an excellent athlete. A True +short_conv_1923 gaokao_audio/short_conv_1923.wav 111111 How much should the man’s rent be? A. $500; B. $150; C. $125. C True +short_conv_1924 gaokao_audio/short_conv_1924.wav 111111 What are the speakers discussing? A. A TV show; B. Their friend Kimmy Schmidt; C. An underground comedy club. A True +short_conv_1925 gaokao_audio/short_conv_1925.wav 111111 What does the woman mean? A. She will help the man later; B. The man has always been lucky; C. She can't be of any assistance. C True +short_conv_1926 gaokao_audio/short_conv_1926.wav 111111 Where are the speakers? A. In a grocery store; B. In a candy store; C. At a café. A True +short_conv_1927 gaokao_audio/short_conv_1927.wav 111111 What is the relationship between the speakers? A. Boss and employee; B. Customer and store clerk ; C. Father and daughter. A True +short_conv_1928 gaokao_audio/short_conv_1928.wav 111111 What does the woman want the man to do? A. Eat a slice of pizza; B. Lie down; C. Turn on the TV. B True +short_conv_1929 gaokao_audio/short_conv_1929.wav 111111 What will the woman do later probably? A. Watch TV; B. Go shopping; C. Go to work. B True +short_conv_193 gaokao_audio/short_conv_193.wav 111111 Where does this conversation take place? A. In a classroom; B. In a hospital; C. In a museum. B True +short_conv_1930 gaokao_audio/short_conv_1930.wav 111111 What does the woman mean? A. The man is not fully recovered yet; B. The man can leave the hospital now; C. She is not certain about the man’s condition. A True +short_conv_1931 gaokao_audio/short_conv_1931.wav 111111 What’s the probable relationship between the man and Mary? A. Father and daughter; B. Friends; C. husband and wife. C True +short_conv_1932 gaokao_audio/short_conv_1932.wav 111111 What might the man dress up like for the coming Halloween? A. A ghost; B. A skeleton; C. A witch. B True +short_conv_1933 gaokao_audio/short_conv_1933.wav 111111 What is in the study? A. A thief; B. A rat; C. A dog. C True +short_conv_1934 gaokao_audio/short_conv_1934.wav 111111 What is the man going to do? A. Go on the Internet; B. Make a phone call; C. Take a train trip. A True +short_conv_1935 gaokao_audio/short_conv_1935.wav 111111 Where are the speakers? A. In a classroom; B. In a library; C. In a bookstore. B True +short_conv_1936 gaokao_audio/short_conv_1936.wav 111111 What are the speakers talking about? A. Going out; B. Ordering drinks; C. Preparing for a party. C True +short_conv_1937 gaokao_audio/short_conv_1937.wav 111111 How will Susan spend most of her time in France? A. Traveling around; B. Studying at a school; C. Looking after her aunt. A True +short_conv_1938 gaokao_audio/short_conv_1938.wav 111111 What does the woman think of the movie? A. It’s amusing; B. It’s exciting; C. It’s disappointing. C True +short_conv_1939 gaokao_audio/short_conv_1939.wav 111111 Where does this conversation probably take place? A. At a clothing store; B. In a tailor's shop; C. At a laundry. C True +short_conv_194 gaokao_audio/short_conv_194.wav 111111 What are the speakers mainly talking about? A. The man’s haircut; B. The man’s friends; C. The man’s social life. A True +short_conv_1940 gaokao_audio/short_conv_1940.wav 111111 What does the man say about Stephanie? A. She will get well soon; B. She has a very bad cold; C. She is coming to the beach. B True +short_conv_1941 gaokao_audio/short_conv_1941.wav 111111 What does the woman like best about the shirt? A. The color; B. The price; C. The material. A True +short_conv_1942 gaokao_audio/short_conv_1942.wav 111111 What will the woman do next? A. Walk to the university; B. Get off at the next stop; C. Take the downtown bus. B True +short_conv_1943 gaokao_audio/short_conv_1943.wav 111111 Where is the man’s passport? A. In his car; B. In his bag; C. In his pocket. C True +short_conv_1944 gaokao_audio/short_conv_1944.wav 111111 What does the woman order? A. Eggs and bread; B. Eggs and fruit; C. Fruit and bread. C True +short_conv_1945 gaokao_audio/short_conv_1945.wav 111111 What did the man think was wrong at first? A. He left something inside the car; B. He forgot to turn off the lights; C. He left his wallet at home. B True +short_conv_1946 gaokao_audio/short_conv_1946.wav 111111 Who is the man probably talking to? A. His boss; B. His assistant; C. His customer. A True +short_conv_1947 gaokao_audio/short_conv_1947.wav 111111 Where are the speakers? A. In a restaurant; B. At home; C. In a grocery store. B True +short_conv_1948 gaokao_audio/short_conv_1948.wav 111111 Why can’t the man park there? A. It is after 4 o’clock; B. He is blocking the driveway; C. Only the police can park there. A True +short_conv_1949 gaokao_audio/short_conv_1949.wav 111111 What are the speakers mainly talking about? A. James’ daily life; B. James’ business; C. James’ family. B True +short_conv_195 gaokao_audio/short_conv_195.wav 111111 Who is the woman talking to? A. Her student; B. Her son; C. Her teacher. C True +short_conv_1950 gaokao_audio/short_conv_1950.wav 111111 What will the man do next? A. Leave; B. Phone Linda; C. Keep on waiting. C True +short_conv_1951 gaokao_audio/short_conv_1951.wav 111111 What is wrong with the man? A. He’s got a headache; B. He can’t fall asleep at night; C. He doesn’t feel the pain. A True +short_conv_1952 gaokao_audio/short_conv_1952.wav 111111 Why does the man want to leave his job? A. He doesn’t get on with his workmates; B. He thinks the job is too boring; C. The working place is too far. C True +short_conv_1953 gaokao_audio/short_conv_1953.wav 111111 How will the man go to Chicago? A. By plane B. By train; C. By bus. B True +short_conv_1954 gaokao_audio/short_conv_1954.wav 111111 What are the speakers doing? A. Painting the dining room; B. Discussing a house plan; C. Cleaning the kitchen. B True +short_conv_1955 gaokao_audio/short_conv_1955.wav 111111 What does the woman imply? A. She won’t go to the beach if it rains; B. It will clear up tomorrow; C. It was pouring when she was at the beach. A True +short_conv_1956 gaokao_audio/short_conv_1956.wav 111111 How does the woman feel? A. Annoyed; B. Embarrassed; C. Bored. A True +short_conv_1957 gaokao_audio/short_conv_1957.wav 111111 How's the school now? A. It’s not as good as it was; B. It’s better than people say; C. It’s even worse than people say. A True +short_conv_1958 gaokao_audio/short_conv_1958.wav 111111 What does the man mean? A. He wants to order the food; B. He doesn’t like Japanese food; C. He hopes to pay for the meal. C True +short_conv_1959 gaokao_audio/short_conv_1959.wav 111111 According to the woman, what color is the shirt? A. Light blue; B. Green and blue; C. Yellow. C True +short_conv_196 gaokao_audio/short_conv_196.wav 111111 Why did the woman call the man? A. To report a car accident; B. To report her car being stolen; C. To get some information about cars. B True +short_conv_1960 gaokao_audio/short_conv_1960.wav 111111 How much is the service charge if the food cost $50? A. $5; B. $15; C. $50. A True +short_conv_1961 gaokao_audio/short_conv_1961.wav 111111 What worries the woman a lot? A. The location of the hotel; B. The damage to the environment; C. The solution to the issue. B True +short_conv_1962 gaokao_audio/short_conv_1962.wav 111111 What is the probable relationship between the two speakers? A. Teacher and student; B. Policeman and driver; C. Doctor and nurse. B True +short_conv_1963 gaokao_audio/short_conv_1963.wav 111111 Where does the conversation probably take place? A. In a restaurant; B. In a meeting room; C. At the office. A True +short_conv_1964 gaokao_audio/short_conv_1964.wav 111111 Who is the girl talking to? A. A dentist; B. A policeman; C. A salesman. A True +short_conv_1965 gaokao_audio/short_conv_1965.wav 111111 What will the woman work as? A. An assistant; B. A lawyer; C. A teacher. A True +short_conv_1966 gaokao_audio/short_conv_1966.wav 111111 What is the woman going to do? A. Play baseball; B. Watch a game; C. Do her work. B True +short_conv_1967 gaokao_audio/short_conv_1967.wav 111111 What did the man like about the movie? A. The acting; B. The music; C. The scenery. A True +short_conv_1968 gaokao_audio/short_conv_1968.wav 111111 What will the speakers bring to the picnic? A. Some drinks; B. Some fruit; C. Some desserts. C True +short_conv_1969 gaokao_audio/short_conv_1969.wav 111111 What will the speakers probably do next? A. Order some boxes; B. Go home and rest; C. Continue packing. B True +short_conv_197 gaokao_audio/short_conv_197.wav 111111 What will the woman do? A. Return a scarf; B. Exchange her shoes; C. Buy a purse. A True +short_conv_1970 gaokao_audio/short_conv_1970.wav 111111 What does the woman say about John? A. He won’t wait for her; B. He won’t come home today; C. He won’t be on time for dinner. C True +short_conv_1971 gaokao_audio/short_conv_1971.wav 111111 What will the man probably do? A. Take the job; B. Refuse the offer; C. Change the working time. A True +short_conv_1972 gaokao_audio/short_conv_1972.wav 111111 Where is the man going next time? A. To a hill; B. To a park; C. To a beach. B True +short_conv_1973 gaokao_audio/short_conv_1973.wav 111111 What does the woman want the man to do? A. Go to sleep; B. Take care of the cat; C. Stop his dog barking. C True +short_conv_1974 gaokao_audio/short_conv_1974.wav 111111 What does a woman mean? A. Working too fast may lead to undesirable outcomes; B. The result may not be as bad as the man has expected; C. You can never lay too much emphasis on the fast speed. A True +short_conv_1975 gaokao_audio/short_conv_1975.wav 111111 What does the man expect women to do for him? A. Arrange accommodation for him; B. Explain the cause of the cancellation; C. Allow him to take another flight that night. A True +short_conv_1976 gaokao_audio/short_conv_1976.wav 111111 What does the woman mean? A. The woman is afraid of the potential noise; B. The woman has sleeping problems; C. The woman will sign the rental contract. A True +short_conv_1977 gaokao_audio/short_conv_1977.wav 111111 Why did a man give up damaras on half way. A. His shoes were worn out; B. He didn’t like hiking trip; C. He was too exhausted to continue. C True +short_conv_1978 gaokao_audio/short_conv_1978.wav 111111 What does the man imply? A. He has never been to Central Mountains; B. He doesn’t plan to go skiing during spring break; C. He doesn’t recommend going to Central Mountains. C True +short_conv_1979 gaokao_audio/short_conv_1979.wav 111111 What is the woman's attitude towards the study tours? A. Negative; B. Neutral; C. Unclear. C True +short_conv_198 gaokao_audio/short_conv_198.wav 111111 Where is the man going? A. To the classroom; B. To the movie theater; C. To the library. C True +short_conv_1980 gaokao_audio/short_conv_1980.wav 111111 What does the woman mean? A. The movie will be quite boring; B. The kids will be surprised at the movie; C. The movie will not be suitable for kids to see. C True +short_conv_1981 gaokao_audio/short_conv_1981.wav 111111 What does the woman mean? A. She can’t see the time on the sign; B. She loses her glasses; C. The museum is out of sight. A True +short_conv_1982 gaokao_audio/short_conv_1982.wav 111111 What's the probable occupation of the man? A. A tailor; B. An electrician; C. An operator. B True +short_conv_1983 gaokao_audio/short_conv_1983.wav 111111 Where does this conversation most probably take place? A. At a kindergarten; B. At a police station; C. In a library. A True +short_conv_1984 gaokao_audio/short_conv_1984.wav 111111 What are the speakers probably doing? A. Operating a computer; B. Doing an experiment; C. Checking the power. B True +short_conv_1985 gaokao_audio/short_conv_1985.wav 111111 What does the man say about the accident? A. The bus was speeding; B. The driver lost control of the truck; C. The bus driver made a sudden turn. C True +short_conv_1986 gaokao_audio/short_conv_1986.wav 111111 Where does the conversation take place? A. In a hotel; B. In a restaurant; C. In a supermarket. B True +short_conv_1987 gaokao_audio/short_conv_1987.wav 111111 What did the man do? A. He had some drinks; B. He made a phone call; C. He looked after the woman. A True +short_conv_1988 gaokao_audio/short_conv_1988.wav 111111 How does the woman probably feel? A. Angry; B. Happy; C. Worried. A True +short_conv_1989 gaokao_audio/short_conv_1989.wav 111111 What can we learn from the conversation? A. The man missed the meeting completely; B. The man was late for the meeting; C. The man attended the meeting on time. B True +short_conv_199 gaokao_audio/short_conv_199.wav 111111 How may the woman feel now? A. Embarrassed; B. Confused; C. Frightened. A True +short_conv_1990 gaokao_audio/short_conv_1990.wav 111111 Who had a car accident? A. Bill; B. Dick; C. John. B True +short_conv_1991 gaokao_audio/short_conv_1991.wav 111111 What do the speakers think of Carl? A. Modest; B. Kind; C. Stubborn. C True +short_conv_1992 gaokao_audio/short_conv_1992.wav 111111 How was the weather at noon? A. Cool; B. Cold; C. Hot. A True +short_conv_1993 gaokao_audio/short_conv_1993.wav 111111 Why is the man going to New York? A. To have a holiday; B. To attend a meeting; C. To see his grandparents. C True +short_conv_1994 gaokao_audio/short_conv_1994.wav 111111 What do we learn from the conversation? A. The dancers impressed them both; B. The woman is also a dancer; C. The man invited the lady to the show. A True +short_conv_1995 gaokao_audio/short_conv_1995.wav 111111 What's probably the gift? A. A grand wedding party; B. Two plane tickets to Hawaii; C. A picture of the moon. B True +short_conv_1996 gaokao_audio/short_conv_1996.wav 111111 What is the man mean? A. He can’t understand the lady’s feeling; B. The lady should not blame others; C. Nobody may be interested in her problem. B True +short_conv_1997 gaokao_audio/short_conv_1997.wav 111111 What is the man mean? A. Lisa made the mess; B. He and Lisa are settling a problem; C. Lisa likes the new place. C True +short_conv_1998 gaokao_audio/short_conv_1998.wav 111111 What do we learn from the talk? A. They just want to grab the chance; B. They will probably change their mind; C. They’ll go skiing even in the rain. B True +short_conv_1999 gaokao_audio/short_conv_1999.wav 111111 What did Sarah do? A. She threw herself out of window and broke her leg; B. She moved a truck to save a little boy; C. She rushed to a moving truck to save a kid. C True +short_conv_2 gaokao_audio/short_conv_2.wav 111111 What does the man come for? A. To say goodbye; B. To visit his frienD; C. To invite the woman. A True +short_conv_20 gaokao_audio/short_conv_20.wav 111111 What time did the concert start last night? A. At 8:00; B. At 8:15; C. At 8:30. B True +short_conv_200 gaokao_audio/short_conv_200.wav 111111 How will the man treat his cold probably? A. By receiving an injection; B. By taking some medicine ; C. By drinking more water. C True +short_conv_2000 gaokao_audio/short_conv_2000.wav 111111 Why does the woman say me too? A. She is also working very hard; B. She loves American football so much; C. She works for the World Cup. A True +short_conv_201 gaokao_audio/short_conv_201.wav 111111 What’s the probable relationship between the speakers? A. Classmates; B. Neighbors; C. Strangers. A True +short_conv_202 gaokao_audio/short_conv_202.wav 111111 Why does the man dislike the second pair of shoes? A. Because of the size; B. Because of the style; C. Because of the color. C True +short_conv_203 gaokao_audio/short_conv_203.wav 111111 What does the woman prefer doing this evening? A. Seeing a film; B. Watching TV; C. Playing games. B True +short_conv_204 gaokao_audio/short_conv_204.wav 111111 What are the speakers mainly talking about? A. A picnic; B. The weather; C. A forecast. B True +short_conv_205 gaokao_audio/short_conv_205.wav 111111 Why doesn’t the man want to eat? A. He’s feeling a little sick; B. He doesn’t like the food; C. He ate something just now. C True +short_conv_206 gaokao_audio/short_conv_206.wav 111111 How does the man know about animals? A. From books; B. On TV; C. Through the Internet. B True +short_conv_207 gaokao_audio/short_conv_207.wav 111111 What does the man ask the woman to do? A. Give her ID card to him; B. Move a table; C. Sign for a parcel. A True +short_conv_208 gaokao_audio/short_conv_208.wav 111111 What is the cause of the woman’s quietness? A. The violent film; B. Her tiredness; C. The crowded theater. A True +short_conv_209 gaokao_audio/short_conv_209.wav 111111 What crop does the woman’s uncle plant? A. Beans; B. Cotton; C. Corn. B True +short_conv_21 gaokao_audio/short_conv_21.wav 111111 Where is the man going tomorrow? A. To the school; B. To the beach; C. To the cinema. C True +short_conv_210 gaokao_audio/short_conv_210.wav 111111 What is the woman looking at? A. A painting; B. A photo; C. A mirror. A True +short_conv_211 gaokao_audio/short_conv_211.wav 111111 How does the man feel about the family party? A. Excited; B. Hesitant; C. Scared. B True +short_conv_212 gaokao_audio/short_conv_212.wav 111111 What does the woman want to eat? A. Pork pies; B. Beef pies; C. Egg cakes. C True +short_conv_213 gaokao_audio/short_conv_213.wav 111111 When will the mall close? A. In half an hour; B. In an hour; C. In one hour and a half. A True +short_conv_214 gaokao_audio/short_conv_214.wav 111111 What is the probable relationship between the speakers? A. Classmates; B. Teacher and student; C. Doctor and patient. A True +short_conv_215 gaokao_audio/short_conv_215.wav 111111 How does the woman go to work? A. By car; B. On foot; C. By bike. B True +short_conv_216 gaokao_audio/short_conv_216.wav 111111 When does the train leave? A. At 6:30; B. At 8:30; C. At 10:30. C True +short_conv_217 gaokao_audio/short_conv_217.wav 111111 What can we say about the woman? A. She's generous; B. She's curious; C. She's helpful. C True +short_conv_218 gaokao_audio/short_conv_218.wav 111111 What will James do tomorrow? A. Watch a TV program; B. Give a talk; C. Write a report. B True +short_conv_219 gaokao_audio/short_conv_219.wav 111111 What will the woman do? A. Find a player; B. Watch a game; C. Play basketball. C True +short_conv_22 gaokao_audio/short_conv_22.wav 111111 What does the woman mainly talk about? A. Paying to safety; B. Learning how to drive; C. Buying a good bike. A True +short_conv_220 gaokao_audio/short_conv_220.wav 111111 What does the woman want to know? A. Where the meeting is being held; B. Where Joe will meet her; C. What the topic of the meeting is. A True +short_conv_221 gaokao_audio/short_conv_221.wav 111111 Where is the man now? A. On the way; B. In a restaurant; C. At home. A True +short_conv_222 gaokao_audio/short_conv_222.wav 111111 What does the man tell to the woman? A. He took Bill to the hospital; B. He forgot to call the woman; C. He didn't know which hospital Bill was in. B True +short_conv_223 gaokao_audio/short_conv_223.wav 111111 What does the woman mean? A. She needs the man's help; B. She thinks the man is right; C. She plans to send out all the invitations. C True +short_conv_224 gaokao_audio/short_conv_224.wav 111111 What’s wrong with the woman’s son? A. He gets poor grades; B. Hedoesn’t perform well in school; C. He doesn’t do his work. A True +short_conv_225 gaokao_audio/short_conv_225.wav 111111 How long did the woman’s sister stay in her apartment? A. Two weeks; B. Two months; C. Two years. B True +short_conv_226 gaokao_audio/short_conv_226.wav 111111 Who is the woman talking to? A. A repairman; B. A relative; C. A salesman. C True +short_conv_227 gaokao_audio/short_conv_227.wav 111111 Where does the conversation take place? A. In a library; B. In a classroom; C. In a bookstore. C True +short_conv_228 gaokao_audio/short_conv_228.wav 111111 Why can’t the woman have a room in the hotel tonight? A. There aren’t any open rooms; B. She doesn’t have enough money; C. A wedding is held there tonight. A True +short_conv_229 gaokao_audio/short_conv_229.wav 111111 What's the probable relationship between the speakers? A. Husband and wife; B. Doctor and patient; C. Teacher and student. B True +short_conv_23 gaokao_audio/short_conv_23.wav 111111 How did the woman get to Baltimore? A. By train; B. By bus; C. By taxi. A True +short_conv_230 gaokao_audio/short_conv_230.wav 111111 What does the man think Michael has been doing this week? A. Going to class; B. Resting at home; C. Looking for a job. C True +short_conv_231 gaokao_audio/short_conv_231.wav 111111 What does the man think of the jacket? A. It has too many pockets; B. It’s great for everyday use; C. It is suitable for outdoor activities. C True +short_conv_232 gaokao_audio/short_conv_232.wav 111111 What is the woman going to do? A. Pray for good luck; B. Prepare for a debate; C. Study for the final exam. B True +short_conv_233 gaokao_audio/short_conv_233.wav 111111 What are the speakers mainly talking about? A. What the apartment manager is like; B. When the man met the apartment manager; C. Whether the man likes the apartment manager. A True +short_conv_234 gaokao_audio/short_conv_234.wav 111111 How did the man sound in the conversation? A. Disappointed; B. Depressed; C. Excited C True +short_conv_235 gaokao_audio/short_conv_235.wav 111111 Where does the conversation take place? A. At a restaurant; B. At home; C. At a supermarket. A True +short_conv_236 gaokao_audio/short_conv_236.wav 111111 What will the man do next Friday? A. Attend a party; B. Go on a business trip; C. E-mail the woman a report. B True +short_conv_237 gaokao_audio/short_conv_237.wav 111111 What was the weather like when Beth was at the beach? A. Cloudy; B. Sunny; C. Rainy. A True +short_conv_238 gaokao_audio/short_conv_238.wav 111111 What are the speakers mainly talking about? A. A picnic; B. The weather; C. A forecast. B True +short_conv_239 gaokao_audio/short_conv_239.wav 111111 Why doesn’t the man want to eat? A. He’s feeling a little sick; B. He doesn’t like the food; C. He ate something just now. C True +short_conv_24 gaokao_audio/short_conv_24.wav 111111 How does the man feel about Lila? A. Bored; B. Scared; C. Excited. B True +short_conv_240 gaokao_audio/short_conv_240.wav 111111 What does the man ask the woman to do? A. Sign for a parcel; B. Move a table; C. Give her ID card to him. C True +short_conv_241 gaokao_audio/short_conv_241.wav 111111 How does the man know about animals? A. From books; B. On TV; C. Through the Internet. B True +short_conv_242 gaokao_audio/short_conv_242.wav 111111 What is the cause of the woman’s quietness? A. The violent film; B. Her tiredness; C. The crowded theater. A True +short_conv_243 gaokao_audio/short_conv_243.wav 111111 What are the speakers talking about? A. A restaurant; B. A street; C. A dish. A True +short_conv_244 gaokao_audio/short_conv_244.wav 111111 What does the woman think of her interview? A. It was tough; B. It was interesting; C. It was successful. C True +short_conv_245 gaokao_audio/short_conv_245.wav 111111 Where does the conversation probably take place? A. In a bank; B. At a ticket office; C. On a train. B True +short_conv_246 gaokao_audio/short_conv_246.wav 111111 What is the probable relationship between the speakers? A. Colleagues; B. Brother and sister; C. Teacher and student. A True +short_conv_247 gaokao_audio/short_conv_247.wav 111111 What does John find difficult in learning German? A. Pronunciation; B. Vocabulary; C. Grammar. C True +short_conv_248 gaokao_audio/short_conv_248.wav 111111 Where will the train at Platform1 leave for? A. Oxford; B. Reading; C. Southampton Central A True +short_conv_249 gaokao_audio/short_conv_249.wav 111111 Why did the poor woman hit the pole? A. It was rainy; B. She was careless; C. She tried to avoid a biker C True +short_conv_25 gaokao_audio/short_conv_25.wav 111111 What will the speakers do? A. Catch a flight; B. Pick up their son; C. Deal with an accident. B True +short_conv_250 gaokao_audio/short_conv_250.wav 111111 Where are the two speakers? A. In the street; B. At home; C. In a restaurant B True +short_conv_251 gaokao_audio/short_conv_251.wav 111111 Why did the man fail to wake up the woman? A. He found the woman tired; B. He felt rather terrible; C. He had been enjoying the scenery. A True +short_conv_252 gaokao_audio/short_conv_252.wav 111111 How did the man feel when knowing the times is closing down A. Disappointed; B. Joyful; C. Sad. B True +short_conv_253 gaokao_audio/short_conv_253.wav 111111 How did the man feel about his jump in the end? A. Terrified; B. Disappointed; C. Excited. B True +short_conv_254 gaokao_audio/short_conv_254.wav 111111 Where does the conversation most probably take place? A. On a bus; B. In a library; C. In a shop. A True +short_conv_255 gaokao_audio/short_conv_255.wav 111111 What has the man decided to do? A. Continue his talk with Mr. Black; B. Go to see an engineer; C. Check the schedule. A True +short_conv_256 gaokao_audio/short_conv_256.wav 111111 What does the woman do? A. A teacher; B. A nurse; C. A shop assistant. B True +short_conv_257 gaokao_audio/short_conv_257.wav 111111 Why does the man want to leave? A. The service is too slow; B. The food is bad; C. The music is too loud C True +short_conv_258 gaokao_audio/short_conv_258.wav 111111 What does the man mean? A. Wash the clothes twice; B. Have the machine repaired; C. Put in fewer clothes. C True +short_conv_259 gaokao_audio/short_conv_259.wav 111111 What does the man probably think of the party? A. It's interesting; B. It's crowded; C. It's dull. C True +short_conv_26 gaokao_audio/short_conv_26.wav 111111 What are the two speakers talking about? A. The gift; B. The class; C. The new professor. C True +short_conv_260 gaokao_audio/short_conv_260.wav 111111 What's the woman going to today? A. Take an examination; B. Have a history class; C. Study in the library. C True +short_conv_261 gaokao_audio/short_conv_261.wav 111111 How did the man get home? A. By bus; B. On foot; C. By taxi. B True +short_conv_262 gaokao_audio/short_conv_262.wav 111111 What are the speakers mainly talking about? A. Driving; B. Health; C. Weather. C True +short_conv_263 gaokao_audio/short_conv_263.wav 111111 How much is the entrance fee for a student? A. $30; B. $20; C. $12. B True +short_conv_264 gaokao_audio/short_conv_264.wav 111111 Where did the man have his advanced study? A. In the U.S; B. In France; C. In Britain. C True +short_conv_265 gaokao_audio/short_conv_265.wav 111111 What did the man forget to bring this time? A. His keys; B. His phone; C. His wallet. C True +short_conv_266 gaokao_audio/short_conv_266.wav 111111 Where does the conversation take place? A. In a hotel; B. In a restaurant; C. In a supermarket. A True +short_conv_267 gaokao_audio/short_conv_267.wav 111111 When does the store open? A. At 8 a.m; B. At 7 a.m; C. At 6 a.m. C True +short_conv_268 gaokao_audio/short_conv_268.wav 111111 Who knows the best place to ride a bike according to the conversation? A. Harry; B. The man speaker; C. The woman speaker. A True +short_conv_269 gaokao_audio/short_conv_269.wav 111111 What is the woman doing? A. Offering suggestions; B. Expressing dissatisfaction; C. Asking for help. C True +short_conv_27 gaokao_audio/short_conv_27.wav 111111 Why doesn't the woman go to Europe? A. She is terrified; B. She doesn't like Europe; C. She has. been there before. A True +short_conv_270 gaokao_audio/short_conv_270.wav 111111 How did John do in the exam? A. He failed in the exam; B. He got the highest mark; C. He did worse than last time. A True +short_conv_271 gaokao_audio/short_conv_271.wav 111111 When can the speakers reach the Overseas Chinese Hotel? A. At 11:35; B. At 11:45; C. At 12:00. B True +short_conv_272 gaokao_audio/short_conv_272.wav 111111 What did the man do last night? A. He watched a play; B. He did some shopping; C. He relaxed at home. A True +short_conv_273 gaokao_audio/short_conv_273.wav 111111 What is the woman going to do? A. Catch a train; B. Carry out a survey; C. Identify her personality. A True +short_conv_274 gaokao_audio/short_conv_274.wav 111111 Where are the speakers? A. In the classroom; B. In the library; C. At home. B True +short_conv_275 gaokao_audio/short_conv_275.wav 111111 Why was the man late? A. He cleaned out the garage; B. He fell over from the toolbox; C. He tried to find his baseball bat. C True +short_conv_276 gaokao_audio/short_conv_276.wav 111111 When will the man leave for Perth? A. On May 24 B. On May 26 C. On May 27 C True +short_conv_277 gaokao_audio/short_conv_277.wav 111111 How will the speakers go to Zhongshan Road? A. By car; B. By bus; C. By subway. C True +short_conv_278 gaokao_audio/short_conv_278.wav 111111 What does the man mean? A. The woman should get the skirt; B. The woman turns out to be a fool; C. The woman shouldn't go to the party. A True +short_conv_279 gaokao_audio/short_conv_279.wav 111111 Where does the woman sit now? A. By the window; B. By the door; C. In the back row. C True +short_conv_28 gaokao_audio/short_conv_28.wav 111111 What happened in the cafeteria? A. The man met his teacher; B. Someone took the man’s chair; C. The man didn’t take any money. B True +short_conv_280 gaokao_audio/short_conv_280.wav 111111 What happened to the man last weekend? A. He caught a wrong train; B. He failed to go for a trip; C. He forgot to buy tickets. B True +short_conv_281 gaokao_audio/short_conv_281.wav 111111 What are the speakers mainly talking about? A. Plants; B. Animals; C. Rainforests. C True +short_conv_282 gaokao_audio/short_conv_282.wav 111111 Who is washing the windows? A. The man; B. A cleaner; C. The woman. B True +short_conv_283 gaokao_audio/short_conv_283.wav 111111 Where does the conversation take place? A. In a bookstore; B. In a library; C. In a classroom. A True +short_conv_284 gaokao_audio/short_conv_284.wav 111111 What does the man have to do today? A. Attend a class; B. Work on a report; C. Visit his mother. B True +short_conv_285 gaokao_audio/short_conv_285.wav 111111 How will the woman go to the show? A. By bus; B. By car; C. On foot. B True +short_conv_286 gaokao_audio/short_conv_286.wav 111111 What does the man think of the new play? A. Strange; B. Boring; C. Interesting. C True +short_conv_287 gaokao_audio/short_conv_287.wav 111111 What food will the boy have at his party? A. Pizza; B. Salad; C. Fried chicken. C True +short_conv_288 gaokao_audio/short_conv_288.wav 111111 What is the man’s attitude towards the plan? A. He doesn’t care; B. He is for it; C. He is against it. C True +short_conv_289 gaokao_audio/short_conv_289.wav 111111 What is the woman planning to do? A. Go to have a coffee; B. Get a haircut; C. Go to the man’s house. B True +short_conv_29 gaokao_audio/short_conv_29.wav 111111 What did the man do? A. He acted in a movie; B. He had a fight with others; C. He communicated with children. B True +short_conv_290 gaokao_audio/short_conv_290.wav 111111 What caused the difference in the price? A. The color; B. The size; C. The material. C True +short_conv_291 gaokao_audio/short_conv_291.wav 111111 Where is the man going first? A. To the Healey Supermarket; B. To the airport; C. To Canada. A True +short_conv_292 gaokao_audio/short_conv_292.wav 111111 When should Susan go to meet Professor Brown? A. At 9: 30; B. At 10: 00; C. At 10: 30. C True +short_conv_293 gaokao_audio/short_conv_293.wav 111111 What will the woman do? A. Take a bath; B. Cook a meal; C. Call her dad. B True +short_conv_294 gaokao_audio/short_conv_294.wav 111111 Where does the woman want to have dinner? A. At the man’s house; B. At the Red Rose Restaurant; C. At the Blue Moon Restaurant. C True +short_conv_295 gaokao_audio/short_conv_295.wav 111111 When did the woman came back home? A. At 8:00 B. At 10:00; C. At 11:00. C True +short_conv_296 gaokao_audio/short_conv_296.wav 111111 What is the man doing? A. Asking permission; B. Offering help; C. Finding the smoking area. A True +short_conv_297 gaokao_audio/short_conv_297.wav 111111 What does the man plan to do? A. Attend a concert; B. See a film; C. Watch a game. C True +short_conv_298 gaokao_audio/short_conv_298.wav 111111 How will the man go to work ? A. On foot B. By car C. By understand C True +short_conv_299 gaokao_audio/short_conv_299.wav 111111 Which T-shirt will the woman buy ? A. The $7 one B. The$8 one C. The $10 B True +short_conv_3 gaokao_audio/short_conv_3.wav 111111 Where does the talk take place? A. At the woman’s house; B. At the man’s house; C. In a local restaurant B True +short_conv_30 gaokao_audio/short_conv_30.wav 111111 Why can the man speak German? A. He is German; B. His teacher taught him; C. He used to live in Germany. C True +short_conv_300 gaokao_audio/short_conv_300.wav 111111 Where is the man going first ? A. To a post office B. To a library C. To a store C True +short_conv_301 gaokao_audio/short_conv_301.wav 111111 What is the man’s hobby ? A. Playing computer games B. Climbing mountains C. Collecting coins A True +short_conv_302 gaokao_audio/short_conv_302.wav 111111 What does the man ask the woman to get for him ? A. Some books B. Some pencils C. Some envelops C True +short_conv_303 gaokao_audio/short_conv_303.wav 111111 What happened to the woman? A. She was ill; B. She failed a test; C. She lost her job. B True +short_conv_304 gaokao_audio/short_conv_304.wav 111111 What does the woman say about Professor Johnson? A. His lectures are humorous; B. He is quiet; C. He is not strict. A True +short_conv_305 gaokao_audio/short_conv_305.wav 111111 When does the regular train usually leave for London? A. At 5:15 pm; B. At 4:50 pm; C. At 2:30 pm. C True +short_conv_306 gaokao_audio/short_conv_306.wav 111111 Where does the conversation take place? A. In a bookshop; B. In a bank; C. On a street. B True +short_conv_307 gaokao_audio/short_conv_307.wav 111111 What color dress does the man suggest? A. Blue; B. Pink; C. Green. C True +short_conv_308 gaokao_audio/short_conv_308.wav 111111 What can we learn about Ralph? A. He is three years old; B. He is a quick learner; C. He starts losing hair. B True +short_conv_309 gaokao_audio/short_conv_309.wav 111111 What is the probable relationship between the speakers? A. Cousins; B. Mother and son; C. Brother and sister. C True +short_conv_31 gaokao_audio/short_conv_31.wav 111111 What are the speakers talking about? A. An accident; B. A flight; C. A pilot. B True +short_conv_310 gaokao_audio/short_conv_310.wav 111111 Where are probably the speakers? A. In a candy store; B. In a restaurant; C. In a supermarket. C True +short_conv_311 gaokao_audio/short_conv_311.wav 111111 What will the man do today? A. Work in the office; B. Buy a jacket; C. Go to the sale. A True +short_conv_312 gaokao_audio/short_conv_312.wav 111111 What are the speakers doing? A. Buying a new car; B. Driving in the city; C. Choosing flowers. A True +short_conv_313 gaokao_audio/short_conv_313.wav 111111 Where are the two speakers now? A. On the first floor; B. On the fourth floor; C. On the fifth floor. C True +short_conv_314 gaokao_audio/short_conv_314.wav 111111 What can we learn about the woman? A. She is angry with the man; B. She doesn’t like her roommate; C. She is rather quiet. B True +short_conv_315 gaokao_audio/short_conv_315.wav 111111 What are the speakers mainly talk about? A. A child; B. A room; C. A present. C True +short_conv_316 gaokao_audio/short_conv_316.wav 111111 What will the speakers discuss first? A. A report; B. A computer; C. A pop. A True +short_conv_317 gaokao_audio/short_conv_317.wav 111111 How much will the woman pay if she buys two shirts? A. $18; B. $19; C. $20. B True +short_conv_318 gaokao_audio/short_conv_318.wav 111111 Where is the No.1 Hospital? A. Across from a bank; B. On Zhongshan Street; C. At the end of 5th Street. A True +short_conv_319 gaokao_audio/short_conv_319.wav 111111 What does the boy’s new history teacher look like? A. She has red hair; B. she is tall; C. She is quite short. B True +short_conv_32 gaokao_audio/short_conv_32.wav 111111 Why is the baby crying according to the man? A. He is hungry; B. He is ill; C. He is alone. C True +short_conv_320 gaokao_audio/short_conv_320.wav 111111 Why does the man refuse the woman? A. His car just broke down; B. He’ll use his car; C. She can’t drive. B True +short_conv_321 gaokao_audio/short_conv_321.wav 111111 When will the boy go to bed? A. At 9:40; B. At 9:50; C. At 10:10. C True +short_conv_322 gaokao_audio/short_conv_322.wav 111111 What does the man do? A. An artist; B. A house painter; C. A cleaner. B True +short_conv_323 gaokao_audio/short_conv_323.wav 111111 Where is probably the man’s dog now? A. In the garden; B. In the park; C. In his house. C True +short_conv_324 gaokao_audio/short_conv_324.wav 111111 What do we know about the man now? A. He is a teacher in Beijing; B. He is studying in a middle schoo1; C. He is teaching in Shanghai. C True +short_conv_325 gaokao_audio/short_conv_325.wav 111111 Why was the man late? A. His phone ran out of power; B. His car broke down; C. He lost his way. B True +short_conv_326 gaokao_audio/short_conv_326.wav 111111 When did the man have a tour in Mexico? A. Last month; B. Four days ago; C. Last week. A True +short_conv_327 gaokao_audio/short_conv_327.wav 111111 What did the boy get from the shelf? A. A book; B. A toy; C. A cup. B True +short_conv_328 gaokao_audio/short_conv_328.wav 111111 Why will Jack go to Anna’s office? A. To have a good rest; B. To ask for sick leave; C. To talk with his teacher. B True +short_conv_329 gaokao_audio/short_conv_329.wav 111111 What will Mark do this afternoon? A. Watch TV at home; B. Go to the cinema alone; C. See a movie with Rosa. A True +short_conv_33 gaokao_audio/short_conv_33.wav 111111 What is the most probable relationship between the speakers? A. Couple; B. Neighbors; C. Colleagues. A True +short_conv_330 gaokao_audio/short_conv_330.wav 111111 Where does the conversation most probably take place? A. At a hospital; B. At a hotel; C. At a restaurant. A True +short_conv_331 gaokao_audio/short_conv_331.wav 111111 What does Ted often play now? A. Basketball; B. Table tennis; C. Tennis. B True +short_conv_332 gaokao_audio/short_conv_332.wav 111111 What does the woman like eating? A. Ice cream; B. Cake; C. Fruit. C True +short_conv_333 gaokao_audio/short_conv_333.wav 111111 How much more money does the man want from the woman? A. Thirty dollars; B. Twenty dollars; C. Ten dollars. C True +short_conv_334 gaokao_audio/short_conv_334.wav 111111 What does the man think of Bill? A. He’s thoughtful; B. He’s humorous; C. He’s careless. C True +short_conv_335 gaokao_audio/short_conv_335.wav 111111 Why was the man surprised? A. The woman was late; B. The woman arrived early; C. The woman worked overtime tonight. B True +short_conv_336 gaokao_audio/short_conv_336.wav 111111 What did the woman tell the man? A. He could use her extra pen; B. The pencil needed sharpening; C. She didn’t bring the pencil sharpener. B True +short_conv_337 gaokao_audio/short_conv_337.wav 111111 When did the woman learn to draw? A. In university; B. In high school; C. In her childhood. A True +short_conv_338 gaokao_audio/short_conv_338.wav 111111 How does the man find the woman's forgetfulness? A. Annoying; B. Embarrassing; C. Understandable. C True +short_conv_339 gaokao_audio/short_conv_339.wav 111111 What does the woman think of the wine? A. It's a bit expensive; B. It's not her cup of tea; C. It's tasty and cheap. A True +short_conv_34 gaokao_audio/short_conv_34.wav 111111 Where is the woman's father now? A. At home; B. In a hospital; C. At the office. B True +short_conv_340 gaokao_audio/short_conv_340.wav 111111 What does the man suggest? A. Repairing the laptop; B. Buying a new laptop; C. Using the laptop less. B True +short_conv_341 gaokao_audio/short_conv_341.wav 111111 What's the relationship between the speakers? A. Strangers B. Friends C. A couple. C True +short_conv_342 gaokao_audio/short_conv_342.wav 111111 Where does the conversation most probably take place? A. In a library B. At a theater C. In a restaurant C True +short_conv_343 gaokao_audio/short_conv_343.wav 111111 What are the speakers talking about? A. Sports; B. Fashion; C. Magazines. C True +short_conv_344 gaokao_audio/short_conv_344.wav 111111 How does the man respond to the woman? A. He’s doubtful; B. He’s impressed; C. He’s inspired. B True +short_conv_345 gaokao_audio/short_conv_345.wav 111111 What is the man going to do? A. Sell something; B. Leave his company; C. Have a job interview. C True +short_conv_346 gaokao_audio/short_conv_346.wav 111111 When will the party begin? A. In 10 minutes; B. In 15 minutes; C. In 30 minutes. B True +short_conv_347 gaokao_audio/short_conv_347.wav 111111 How will the man pay probably? A. By credit card; B. By check; C. In cash. C True +short_conv_348 gaokao_audio/short_conv_348.wav 111111 What is the probable relationship between the speakers? A. Boss and employee; B. Waiter and customer; C. Co-workers. C True +short_conv_349 gaokao_audio/short_conv_349.wav 111111 Where are the two speakers probably? A. In a hotel; B. In a hospital; C. In a car. B True +short_conv_35 gaokao_audio/short_conv_35.wav 111111 What is the man doing? A. Giving a gift; B. Buying chocolates; C. Making chocolates. A True +short_conv_350 gaokao_audio/short_conv_350.wav 111111 What are the speakers probably doing? A. Watching TV; B. Taking pictures; C. Doing exercise. B True +short_conv_351 gaokao_audio/short_conv_351.wav 111111 What time will the man arrive in London? A. At 8:30; B. At 8:00; C. At 7:30. A True +short_conv_352 gaokao_audio/short_conv_352.wav 111111 What is the purpose of the woman’s call? A. To open a new account; B. To pay the gas bill; C. To ask about a bill. C True +short_conv_353 gaokao_audio/short_conv_353.wav 111111 Why is the man late? A. The traffic was heavy; B. There was an accident; C. He took the wrong bus. C True +short_conv_354 gaokao_audio/short_conv_354.wav 111111 What is true about Ellen? A. She likes African art; B. She knows Susan very well; C. She doesn’t know Bob. A True +short_conv_355 gaokao_audio/short_conv_355.wav 111111 What does the man mean? A. He will do a class project; B. He won’t go to the beach; C. He will go to the zoo next time. B True +short_conv_356 gaokao_audio/short_conv_356.wav 111111 How will the man pay? A. By cheque; B. By credit card; C. In cash. B True +short_conv_357 gaokao_audio/short_conv_357.wav 111111 Where does the man want to go? A. To New York; B. To Boston; C. To Chicago. B True +short_conv_358 gaokao_audio/short_conv_358.wav 111111 When does the conversation take place? A. At 4:45; B. At 5:00; C. At 5:15. A True +short_conv_359 gaokao_audio/short_conv_359.wav 111111 What does the man fail to prepare for his wedding? A. The church; B. The transport; C. The wedding dress. C True +short_conv_36 gaokao_audio/short_conv_36.wav 111111 What's the woman's attitude towards the man's idea? A. Un concerned; B. Supportive ; C. Doubtful. C True +short_conv_360 gaokao_audio/short_conv_360.wav 111111 What will the speakers probably do tonight? A. Eat out; B. Go shopping; C. Pick up a friend. A True +short_conv_361 gaokao_audio/short_conv_361.wav 111111 How does the man find Mr. White? A. Strict; B. Patient; C. Responsible. A True +short_conv_362 gaokao_audio/short_conv_362.wav 111111 What does the man probably do? A. A cook; B. A waiter; C. A fisherman. B True +short_conv_363 gaokao_audio/short_conv_363.wav 111111 What does the man mean? A. The woman must examine her teeth; B. The woman will quarrel with somebody soon; C. The woman doesn't need to worry about the dream. C True +short_conv_364 gaokao_audio/short_conv_364.wav 111111 What are the two speakers going to do next? A. Ask John to invite Professor Li; B. Work out details for John's farewell; C. Take part in the farewell party for Professor Li. B True +short_conv_365 gaokao_audio/short_conv_365.wav 111111 What can we know from the dialogue? A. Sarah will stay with her cousin; B. Sarah will serve a room for her aunt; C. Sarah will move into a home-stay family. C True +short_conv_366 gaokao_audio/short_conv_366.wav 111111 When should Trish get to the airport? A. At 3 pm; B. At 6 am; C. At 6 pm. A True +short_conv_367 gaokao_audio/short_conv_367.wav 111111 Why did the man fail the test? A. He didn't work hard; B. He didn't sleep well; C. He got to the test late. B True +short_conv_368 gaokao_audio/short_conv_368.wav 111111 What does the woman mean? A. The candidate is not good at giving speeches; B. The candidate is out of touch with the woman; C. The candidate is not qualified for the job. C True +short_conv_369 gaokao_audio/short_conv_369.wav 111111 What is the man advised the woman to do? A. Pay for photographing for her wedding; B. Save the budget of wedding; C. Avoid taking too many photos for her wedding. A True +short_conv_37 gaokao_audio/short_conv_37.wav 111111 When does the man learn to play the guitar? A. On Thursdays; B. On Wednesdays; C. On Saturdays. B True +short_conv_370 gaokao_audio/short_conv_370.wav 111111 Where does this conversation most probably take place? A. At a drugstore B. At a laundry; C. At a furniture shop. B True +short_conv_371 gaokao_audio/short_conv_371.wav 111111 What does the man mean? A. He doesn't know which taste to choose; B. He loses words to describe the taste of the ice cream; C. He enjoys selling ice cream. A True +short_conv_372 gaokao_audio/short_conv_372.wav 111111 What does the woman imply? A. John lied about absence from school; B. John was too ill to receive them at home; C. She didn’t go to school herself. A True +short_conv_373 gaokao_audio/short_conv_373.wav 111111 What does the woman mean? A. Her mother is in an area with poor signal reception; B. She can’t connect her mother through the mobile phone now; C. She has to notify her mother that someone is dead. B True +short_conv_374 gaokao_audio/short_conv_374.wav 111111 What does the man mean? A. Their neighbor broke their light bulb; B. There's something wrong with their light bulb; C. It's black outside the window. B True +short_conv_375 gaokao_audio/short_conv_375.wav 111111 What does the woman mean? A. The new movie was positively reviewed by critics; B. The new movie was successful in sales and reputation; C. The new movie wasn’t welcomed by the critics. C True +short_conv_376 gaokao_audio/short_conv_376.wav 111111 How much will the man pay for a sandwich and a black coffee altogether? A. 6 dollars B. 7 dollars C. 11 dollars A True +short_conv_377 gaokao_audio/short_conv_377.wav 111111 Why can't the man get his car field? A. Because there’s no gas left at the gas station right now; B. Because the gas station is checking and repairing the equipment now; C. Because the quality of the gas in the station is terrible. B True +short_conv_378 gaokao_audio/short_conv_378.wav 111111 Why does the man want to see the manager? A. To put an advertisement; B. To apply for a job; C. To sell him a mobile phone. B True +short_conv_379 gaokao_audio/short_conv_379.wav 111111 Where will the man plant the tree? A. By the front door; B. In the back yard; C. Next to the garage. B True +short_conv_38 gaokao_audio/short_conv_38.wav 111111 What are the speakers talking about in general? A. Travel plans; B. Picnic preparations; C. Barbecue time. B True +short_conv_380 gaokao_audio/short_conv_380.wav 111111 What does the man mean? A. He quite agrees with the woman; B. He enjoys the lecture the whole time; C. He doesn’t agree with the woman. A True +short_conv_381 gaokao_audio/short_conv_381.wav 111111 Who will probably decide the place to go? A. The man; B. The woman; C. Harry. C True +short_conv_382 gaokao_audio/short_conv_382.wav 111111 Where does the conversation take place? A. At an airport; B. At a hotel; C. At a travel agency. A True +short_conv_383 gaokao_audio/short_conv_383.wav 111111 What is the probable relationship between the two speakers? A. Doctor and patient; B. Husband and wife; C. Teacher and student. B True +short_conv_384 gaokao_audio/short_conv_384.wav 111111 Which flight will the man take? A. Flight 201; B. Flight 120; C. Flight 102. C True +short_conv_385 gaokao_audio/short_conv_385.wav 111111 How does the woman find the man’s mother? A. Brave; B. Determined; C. Hard-working. B True +short_conv_386 gaokao_audio/short_conv_386.wav 111111 What was wrong with the woman’s milk probably? A. It went bad; B. It had no smell; C. It tasted salty. A True +short_conv_387 gaokao_audio/short_conv_387.wav 111111 How will the man go to the train station tonight? A. By car; B. By bus; C. On foot. B True +short_conv_388 gaokao_audio/short_conv_388.wav 111111 What is the probable relationship between the two speakers? A. Doctor and patient; B. Husband and wife; C. Teacher and student. B True +short_conv_389 gaokao_audio/short_conv_389.wav 111111 How does the woman find the man’s mother? A. Brave; B. Determined; C. Hard-working. B True +short_conv_39 gaokao_audio/short_conv_39.wav 111111 Where does the conversation probably take place? A. In a movie theatre; B. In a science museum; C. At the train station. C True +short_conv_390 gaokao_audio/short_conv_390.wav 111111 Which flight will the man take? A. Flight 201; B. Flight 120; C. Flight 102. C True +short_conv_391 gaokao_audio/short_conv_391.wav 111111 What was wrong with the woman’s milk probably? A. It went bad; B. It had no smell; C. It tasted salty. A True +short_conv_392 gaokao_audio/short_conv_392.wav 111111 How will the man go to the train station tonight? A. By car; B. By bus; C. On foot. B True +short_conv_393 gaokao_audio/short_conv_393.wav 111111 What lessons does the woman want to have? A. Waterskiing; B. Sailing; C. Swimming. A True +short_conv_394 gaokao_audio/short_conv_394.wav 111111 What do you know about the woman? A. She likes her necklace; B. She lost her necklace; C. She made her boyfriend unhappy. B True +short_conv_395 gaokao_audio/short_conv_395.wav 111111 How much time did it take the woman to do the room cleaning? A. About 4 hours; B. About 6 hours; C. About 8 hours. A True +short_conv_396 gaokao_audio/short_conv_396.wav 111111 What soup does the man order? A. Tomato soup; B. Chicken soup; C. Onion soup. B True +short_conv_397 gaokao_audio/short_conv_397.wav 111111 Where does the conversation take place? A. In a restaurant; B. In a shop; C. In a bank. C True +short_conv_398 gaokao_audio/short_conv_398.wav 111111 What does the man fail to prepare for his wedding? A. The church; B. The transport; C. The wedding dress. C True +short_conv_399 gaokao_audio/short_conv_399.wav 111111 When does the conversation take place? A. At 4:45; B. At 5:00; C. At 5:15. A True +short_conv_4 gaokao_audio/short_conv_4.wav 111111 What’s the time now in New York? A. 5 p.m; B. 11 a.m; C. 6 p.m. B True +short_conv_40 gaokao_audio/short_conv_40.wav 111111 How does Julie go to school? A. On foot; B. By bike; C. By bus. A True +short_conv_400 gaokao_audio/short_conv_400.wav 111111 What will the speakers probably do tonight? A. Eat out; B. Go shopping; C. Pick up a friend. A True +short_conv_401 gaokao_audio/short_conv_401.wav 111111 How does the man think of Mr. White? A. Strict; B. Patient; C. Responsible. A True +short_conv_402 gaokao_audio/short_conv_402.wav 111111 What does the man probably do? A. A cook; B. A waiter; C. A fisherman. B True +short_conv_403 gaokao_audio/short_conv_403.wav 111111 Where did Paul plan to go on his way home? A. To the shop; B. To the bank; C. To the office. A True +short_conv_404 gaokao_audio/short_conv_404.wav 111111 Why doesn’t the woman try the fried food? A. She doesn’t like the taste at all; B. She is careful about her weight; C. She thinks it doesn’t have vitamins. B True +short_conv_405 gaokao_audio/short_conv_405.wav 111111 What is the man’s opinion about high-speed rail? A. Comfortable but expensive; B. Convenient and relaxing; C. Fast but not enjoyable. C True +short_conv_406 gaokao_audio/short_conv_406.wav 111111 What are the speakers? A. Newspaper reporters; B. Students; C. Teacher and student. B True +short_conv_407 gaokao_audio/short_conv_407.wav 111111 When will the man be free? A. On Tuesday afternoon; B. On Wednesday morning; C. On Wednesday afternoon. C True +short_conv_408 gaokao_audio/short_conv_408.wav 111111 What are the speakers talking about? A. Weather; B. Clothes; C. News. A True +short_conv_409 gaokao_audio/short_conv_409.wav 111111 What does the man think of the book? A. Quite difficult; B. Very interesting; C. Too simple. B True +short_conv_41 gaokao_audio/short_conv_41.wav 111111 What can we learn from the conversation? A. The man’s room is very clean; B. The woman wants to clean the room; C. The room hasn’t been cleaned for a long time. C True +short_conv_410 gaokao_audio/short_conv_410.wav 111111 Who might Mr. Peterson be? A. A new professor; B. A department head; C. A company director. C True +short_conv_411 gaokao_audio/short_conv_411.wav 111111 What will the man do for the woman? A. Repair her car; B. Give her a ride; C. Pick up her aunt. B True +short_conv_412 gaokao_audio/short_conv_412.wav 111111 What does the woman want to do? A. Find a place; B. Buy a map; C. Get an address. A True +short_conv_413 gaokao_audio/short_conv_413.wav 111111 When does the woman probably go to the gym? A. On Mondays; B. On Fridays; C. On Saturdays. C True +short_conv_414 gaokao_audio/short_conv_414.wav 111111 Why did the woman catch a cold according to the man? A. She wore too little clothing; B. She had a cold bath; C. She slept in a cold room. A True +short_conv_415 gaokao_audio/short_conv_415.wav 111111 Where does the conversation probably take place? A. In a library; B. In a restaurant; C. In a drugstore. B True +short_conv_416 gaokao_audio/short_conv_416.wav 111111 How will the speakers probably deal with the TV first? A. They will replace it with a new one; B. They will have it mended; C. They will sell it. C True +short_conv_417 gaokao_audio/short_conv_417.wav 111111 What will the woman carry? A. Bottles; B. Bags; C. Boxes. B True +short_conv_418 gaokao_audio/short_conv_418.wav 111111 Where are the speakers? A. At a bag store; B. In a restaurant; C. At a hotel. C True +short_conv_419 gaokao_audio/short_conv_419.wav 111111 What was the woman probably trying to get? A. A ticket for a movie; B. A part in a play; C. A job as a model. B True +short_conv_42 gaokao_audio/short_conv_42.wav 111111 What can we know about the man? A. He always studies hard; B. He doesn’t think he was wrong; C. He regrets that he didn’t study hard. C True +short_conv_420 gaokao_audio/short_conv_420.wav 111111 Why was Alicia late this time? A. She missed the bus; B. Her grandma was sick; C. The bus was in an accident. C True +short_conv_421 gaokao_audio/short_conv_421.wav 111111 How does the woman feel about the shoes? A. They’re a bit small; B. They’re too expensive; C. She doesn’t like the color. C True +short_conv_422 gaokao_audio/short_conv_422.wav 111111 What is the relationship between the two speakers? A. Husband and wife; B. Teacher and students; C. Doctor and patient. A True +short_conv_423 gaokao_audio/short_conv_423.wav 111111 Where are the speakers? A. In a coffee shop; B. At the workplace; C. At home. A True +short_conv_424 gaokao_audio/short_conv_424.wav 111111 How much will the man finally pay for the T-shirt? A. 6 dollars; B. 10 dollars; C. 12 dollars. B True +short_conv_425 gaokao_audio/short_conv_425.wav 111111 What will the speakers do? A. Keep waiting; B. Go back home; C. Change the restaurant. C True +short_conv_426 gaokao_audio/short_conv_426.wav 111111 What will the man do? A. Return Jimmy’s dictionary; B. Go and look for Jimmy; C. Give Jimmy a phone call. A True +short_conv_427 gaokao_audio/short_conv_427.wav 111111 When did the speakers graduate from the school? A. 8 years ago; B. 10 years ago; C. 20 years ago. C True +short_conv_428 gaokao_audio/short_conv_428.wav 111111 Why didn't the man apply for the job? A. He can't start the job on time; B. He is occupied in May C. He does not like it A True +short_conv_429 gaokao_audio/short_conv_429.wav 111111 What does the man advise the woman to do? A. Go to Tibet with a professor; B. Consult a local travel agent; C. Make the arrangements herself. B True +short_conv_43 gaokao_audio/short_conv_43.wav 111111 What is the man going to do this weekend? A. Go to the picnic; B. Go to the company; C. Work in his garden. A True +short_conv_430 gaokao_audio/short_conv_430.wav 111111 What does the woman mean? A. Mason looked nice with a beard B. Mason couldn’t recognize himself C. Mason changed a lot C True +short_conv_431 gaokao_audio/short_conv_431.wav 111111 What does the woman probably do next? A. Buy an umbrella B. Cancel the picnic; C. Write a weather report B True +short_conv_432 gaokao_audio/short_conv_432.wav 111111 What will the speakers probably eat for lunch? A. Noodles B. Sandwiches; C. Pizzas A True +short_conv_433 gaokao_audio/short_conv_433.wav 111111 What does the woman think of Oliver? A. He is helpful; B. He is selfish; C. He is well-prepared. B True +short_conv_434 gaokao_audio/short_conv_434.wav 111111 Why does Mary call the man? A. To reschedule the appointment; B. To cancel the appointment; C. To confirm an appointment. C True +short_conv_435 gaokao_audio/short_conv_435.wav 111111 What are the speakers mainly talking about? A. Weather; B. Games; C. Ways to relax. A True +short_conv_436 gaokao_audio/short_conv_436.wav 111111 Where is the man now? A. At a bookstore; B. At a supermarket; C. At a restaurant. B True +short_conv_437 gaokao_audio/short_conv_437.wav 111111 Why was the woman late? A. She got up late; B. She forgot her class; C. She wanted to sleep more. A True +short_conv_438 gaokao_audio/short_conv_438.wav 111111 Where does the conversation most probably take place? A. In a library; B. In a bookstore; C. In a classroom. A True +short_conv_439 gaokao_audio/short_conv_439.wav 111111 What does the man think is wrong with the plant? A. It needs watering at present; B. It is not getting enough sunshine; C. It should be moved into a large pot. B True +short_conv_44 gaokao_audio/short_conv_44.wav 111111 How many students are there in the class? A. 46; B. 52; C. 40. B True +short_conv_440 gaokao_audio/short_conv_440.wav 111111 What is the man looking for? A. A file; B. A letter; C. A notebook. A True +short_conv_441 gaokao_audio/short_conv_441.wav 111111 When does the science class begin? A. At 8:50; B. At 10:55; C. At 11:45. B True +short_conv_442 gaokao_audio/short_conv_442.wav 111111 What day is it today? A. It's Monday; B. It's Saturday; C. It's Sunday. C True +short_conv_443 gaokao_audio/short_conv_443.wav 111111 What can we learn from the conversation? A. The man likes all kinds of music; B. The woman likes all kinds of music; C. The man isn’t interested in rock music. C True +short_conv_444 gaokao_audio/short_conv_444.wav 111111 What does the woman imply? A. They haven’t enough money; B. She likes her old house; C. They never thought of moving. A True +short_conv_445 gaokao_audio/short_conv_445.wav 111111 What can we learn from this conversation? A. People couldn’t bear the heat; B. The traffic condition has improved; C. The road here is being repaired. A True +short_conv_446 gaokao_audio/short_conv_446.wav 111111 What does the men incline? A. She came earlier; B. He has cleaned the house; C. He needn’t clean the house. A True +short_conv_447 gaokao_audio/short_conv_447.wav 111111 What can we learn from the conversation? A. John closes the door; B. Linda walks to the ATM; C. John may need some cash. C True +short_conv_448 gaokao_audio/short_conv_448.wav 111111 What does the man imply? A. He had a holiday with his family long ago; B. He wants to have a long holiday with his family; C. He wasn’t satisfied with his holiday. A True +short_conv_449 gaokao_audio/short_conv_449.wav 111111 What can we learn from the conversation? A. John has many new ideas in the paper; B. Mary isn’t satisfied with John’s paper; C. Mary should have polished the paper. A True +short_conv_45 gaokao_audio/short_conv_45.wav 111111 Where does the conversation probably take place? A. In the street; B. In the cinema; C. At the drugstore. A True +short_conv_450 gaokao_audio/short_conv_450.wav 111111 What is the men imply? A. The team performs well; B. He knows little about the team; C. The team is playing worse. C True +short_conv_451 gaokao_audio/short_conv_451.wav 111111 What's the woman's probable job? A. Experimenter; B. Shop assistant; C. Makeup artist. B True +short_conv_452 gaokao_audio/short_conv_452.wav 111111 What are the speakers talking about? A. A roommate; B. A new game; C. A new watch. B True +short_conv_453 gaokao_audio/short_conv_453.wav 111111 Where is the woman’s grandma now? A. At home; B. In a hospital; C. In a hotel. B True +short_conv_454 gaokao_audio/short_conv_454.wav 111111 What is the man? A. A secretary; B. A teacher; C. A doctor. C True +short_conv_455 gaokao_audio/short_conv_455.wav 111111 How much does the woman pay for the tickets? A. £9; B. £10; C. £11. A True +short_conv_456 gaokao_audio/short_conv_456.wav 111111 What was the weather like on John’s holiday? A. Sunny; B. Rainy; C. Cold. C True +short_conv_457 gaokao_audio/short_conv_457.wav 111111 How will the speakers probably go home? A. By taxi B. By bus; C. By subway. A True +short_conv_458 gaokao_audio/short_conv_458.wav 111111 What can we learn from the conversation? A. The train will arrive soon; B. The train is late due to the storm; C. The woman has to wait for the train. A True +short_conv_459 gaokao_audio/short_conv_459.wav 111111 What does the woman mean? A. She will choose the man; B. The man was late in asking; C. She may run for the position B True +short_conv_46 gaokao_audio/short_conv_46.wav 111111 Why does the woman work at The Indians now? A. To save up for a computer; B. To become a manager there; C. To learn about food. A True +short_conv_460 gaokao_audio/short_conv_460.wav 111111 What does the woman care most about her cell phone? A. Its design; B. Its special functions; C. Its practical use. C True +short_conv_461 gaokao_audio/short_conv_461.wav 111111 How often will the woman’s daughter take dance lesson next month? A. Three times a week; B. Twice a week; C. Once every week. A True +short_conv_462 gaokao_audio/short_conv_462.wav 111111 Where are the man and the woman? A. At a flower shop; B. At a restaurant; C. At a concert. B True +short_conv_463 gaokao_audio/short_conv_463.wav 111111 What do we know about the man’s apartment? A. It is not quiet enough; B. It is near the train station; C. It has a good view of the park. A True +short_conv_464 gaokao_audio/short_conv_464.wav 111111 Where did the man go yesterday? A. The hotel; B. The office; C. The airport. B True +short_conv_465 gaokao_audio/short_conv_465.wav 111111 What is the woman’s red jacket best for? A. The rainy days; B. The windy days; C. The warm days. C True +short_conv_466 gaokao_audio/short_conv_466.wav 111111 What would the woman probably order with A. White wine; B. Red wine; C. Beer. A True +short_conv_467 gaokao_audio/short_conv_467.wav 111111 What will the woman probably write her name with? A. A pencil; B. Her finger; C. An electronic pen. B True +short_conv_468 gaokao_audio/short_conv_468.wav 111111 What band did the woman see? A. The one with a pianist; B. The one with a dancer; C. The one with three guitarists. C True +short_conv_469 gaokao_audio/short_conv_469.wav 111111 What are the speakers mainly talking about? A. A job position; B. A sales engineer; C. An electrical company. A True +short_conv_47 gaokao_audio/short_conv_47.wav 111111 When will the Browns come? A. At 5:30; B. At 6:00; C. At 6:30. C True +short_conv_470 gaokao_audio/short_conv_470.wav 111111 Where are the speakers? A. On a bus; B. At a bus stop; C. In the man's home. A True +short_conv_471 gaokao_audio/short_conv_471.wav 111111 When is Kim's birthday party? A. On July 16th B. On July 17th C. On July30th B True +short_conv_472 gaokao_audio/short_conv_472.wav 111111 What do we know about the woman? A. She is not hungry; B. She will eat the bread; C. She doesn't like bread. B True +short_conv_473 gaokao_audio/short_conv_473.wav 111111 What do we learn from the conversation? A. Both of the speakers enjoyed the film; B. An exciting film will be on next week; C. The woman was interested in exploring space. A True +short_conv_474 gaokao_audio/short_conv_474.wav 111111 What does the woman imply? A. She’s never been to the city; B. She knows the city very well; C. She doesn’t remember much about the city. C True +short_conv_475 gaokao_audio/short_conv_475.wav 111111 What does the man mean? A. He was happy about the woman’s absence; B. He suggested the woman bring her daughter; C. He suggested the woman visit the university. B True +short_conv_476 gaokao_audio/short_conv_476.wav 111111 What does the woman imply? A. She prefers going to the dentist later in the day; B. The man will be back before his first class; C. The man might sleep late and miss his appointment. B True +short_conv_477 gaokao_audio/short_conv_477.wav 111111 Why can't the woman for this email at the moment? A. The Internet doesn’t work; B. She doesn’t have time to do it; C. The email hasn’t been ready. A True +short_conv_478 gaokao_audio/short_conv_478.wav 111111 What does the woman mean? A. She is very busy; B. She has an invitation already; C. She questions the man’s purpose. A True +short_conv_479 gaokao_audio/short_conv_479.wav 111111 What are they talking about? A. Sales strategies; B. A job opportunity; C. Tour news. B True +short_conv_48 gaokao_audio/short_conv_48.wav 111111 What does the woman think Henry’s parents should do? A. Take good care of him; B. Go camping with Henry; C. Let Henry go camping. C True +short_conv_480 gaokao_audio/short_conv_480.wav 111111 How much in our will it cost the man to send the package? A. $ 1.5; B. $ 3; C. $ 3.5. C True +short_conv_481 gaokao_audio/short_conv_481.wav 111111 What is the probable relationship between the two speakers? A. Customer and shop assistant; B. Customer and travel agent; C. Sailor and tourist. A True +short_conv_482 gaokao_audio/short_conv_482.wav 111111 Where does this conversation most probably take place? A. In a car; B. In a plane; C. On a farm. B True +short_conv_483 gaokao_audio/short_conv_483.wav 111111 What will the man most probably do tomorrow? A. Go to the party; B. Spend time with Linda; C. Celebrate his 22nd birthday* B True +short_conv_484 gaokao_audio/short_conv_484.wav 111111 Wliat does the woman mean? A. She wants a more difficult job; B. She is tired of her present job; C. Her job is too difficult for her. A True +short_conv_485 gaokao_audio/short_conv_485.wav 111111 What are the speakers mainly talking about? A. book; B. A film; C. An accident. C True +short_conv_486 gaokao_audio/short_conv_486.wav 111111 Why doesn’t the man wear his yellow shirt? A. It’s missing; B. He doesn’t like it; C. Two buttons are off it. C True +short_conv_487 gaokao_audio/short_conv_487.wav 111111 What does the woman like to eat? A. Fish; B. Beef; C. Chicken. B True +short_conv_488 gaokao_audio/short_conv_488.wav 111111 What does the boy probably want from the woman? A. Thirty more dollars; B. Twenty more dollars; C. Ten more dollars. C True +short_conv_489 gaokao_audio/short_conv_489.wav 111111 What does the man think of Bill? A. He’s thoughtful; B. He’s humorous; C. He’s careless. C True +short_conv_49 gaokao_audio/short_conv_49.wav 111111 What does the woman want the man to do? A. To get her something; B. To go for a walk with her; C. To eat cookies with her. A True +short_conv_490 gaokao_audio/short_conv_490.wav 111111 Why might the man be surprised? A. The woman was late; B. The woman arrived early; C. The woman worked overtime tonight. B True +short_conv_491 gaokao_audio/short_conv_491.wav 111111 What did the woman tell the man? A. The pencil wasn’t sharp; B. He could use her extra pen; C. She didn’t bring the pencil sharpener. A True +short_conv_492 gaokao_audio/short_conv_492.wav 111111 When did the woman learn to draw? A. In the university; B. In high school; C. In the childhood. A True +short_conv_493 gaokao_audio/short_conv_493.wav 111111 How does the woman feel about Linda and Rob's business? A. Confident; B. Discouraged; C. Worried. A True +short_conv_494 gaokao_audio/short_conv_494.wav 111111 What are the two speakers talking about? A. Where Joyce comes from; B. What Joyce ’ s hometown is like; C. Why Joyce ’s hometown is boring. B True +short_conv_495 gaokao_audio/short_conv_495.wav 111111 How much tax should the man pay per night? A. $5; B. $10; C. $15. B True +short_conv_496 gaokao_audio/short_conv_496.wav 111111 What does the woman want to do? A. Do some shopping; B. Go to the post office; C. Get her watch repaired. C True +short_conv_497 gaokao_audio/short_conv_497.wav 111111 Why does the woman telephone the man? A. To borrow his camera; B. To ask him to meet her parents; C. To invite him to her new apartment. A True +short_conv_498 gaokao_audio/short_conv_498.wav 111111 Where does the conversation probably take place? A. In a store; B. On a plane; C. In an office. B True +short_conv_499 gaokao_audio/short_conv_499.wav 111111 What was the woman dissatisfied with about the movie? A. The special effects; B. The acting; C. The length. C True +short_conv_5 gaokao_audio/short_conv_5.wav 111111 Why doesn’t the woman learn drawing? A. She’s poor at drawing; B. She’s too lazy; C. She lacks time. C True +short_conv_50 gaokao_audio/short_conv_50.wav 111111 What will the man do right now? A. Go straight to the airport; B. Spend the night in Paris; C. Pack some clothes. C True +short_conv_500 gaokao_audio/short_conv_500.wav 111111 How do the speakers feel about today’s paper? A. Shocked; B. Amused; C. Uninterested. C True +short_conv_501 gaokao_audio/short_conv_501.wav 111111 What discount will the speakers get? A. 30%; B. 50%; C. 70%. B True +short_conv_502 gaokao_audio/short_conv_502.wav 111111 What does the man expect the woman to do? A. Study in university; B. Travel to Singapore; C. Write a reference for her. C True +short_conv_503 gaokao_audio/short_conv_503.wav 111111 What is the relationship between the two speakers? A. Teacher and student; B. Husband and wife; C. Mother and son. C True +short_conv_504 gaokao_audio/short_conv_504.wav 111111 What are the speakers mainly talking about? A. Preparing for a test; B. Eating during an exam; C. Getting a medical exam. B True +short_conv_505 gaokao_audio/short_conv_505.wav 111111 When will the woman go for a holiday? A. After she gets a new job; B. When her training is over; C. She herself even doesn’t know. C True +short_conv_506 gaokao_audio/short_conv_506.wav 111111 Why does the man refuse the woman? A. He doesn’t have a car; B. He’ll be using his car; C. She is a bad driver. B True +short_conv_507 gaokao_audio/short_conv_507.wav 111111 What time is it now? A. 5:00; B. 4:45; C. 5:15. B True +short_conv_508 gaokao_audio/short_conv_508.wav 111111 Where does this conversation take place? A. In a food store; B. In a restaurant; C. At a vegetable market. B True +short_conv_509 gaokao_audio/short_conv_509.wav 111111 When is the concert going to start? A. At 7:45; B. At 7:30; C. At 7:15. A True +short_conv_51 gaokao_audio/short_conv_51.wav 111111 Where will the man stay next? A. In the garden; B. In the bathroom; C. In the living room. C True +short_conv_510 gaokao_audio/short_conv_510.wav 111111 Why can’t men do better in a computer company than women? A. They are not as careful as women; B. They are too strong; C. Their hands are too big. C True +short_conv_511 gaokao_audio/short_conv_511.wav 111111 What does the man think of the car? A. Cheap; B. Old; C. Nice. A True +short_conv_512 gaokao_audio/short_conv_512.wav 111111 Which skirt will the man buy? A. The green one; B. The brown one; C. The red one. B True +short_conv_513 gaokao_audio/short_conv_513.wav 111111 What are the speakers talking about? A. A new TV set; B. A TV program; C. A radio program. B True +short_conv_514 gaokao_audio/short_conv_514.wav 111111 What will the woman work as? A. An assistant B. A lawyer; C. A teacher. A True +short_conv_515 gaokao_audio/short_conv_515.wav 111111 What is the woman going to do? A. Play baseball; B. Watch a game; C. Do her work. B True +short_conv_516 gaokao_audio/short_conv_516.wav 111111 What will the speakers take to the picnic? A. Some drinks; B. Some fruit; C. Some desserts C True +short_conv_517 gaokao_audio/short_conv_517.wav 111111 What did the man like about the movie? A. The acting; B. The music; C. The scenery. A True +short_conv_518 gaokao_audio/short_conv_518.wav 111111 Why did the woman apologize to the man? A. She lost his cell-phone; B. She made up a lie; C. She said bad words about his parents B True +short_conv_519 gaokao_audio/short_conv_519.wav 111111 How will the woman go to her date? A. By car; B. By bus; C. By underground. C True +short_conv_52 gaokao_audio/short_conv_52.wav 111111 What does the man think of Bill? A. He’s funny; B. He causes problems; C. He shouldn’t be fired. B True +short_conv_520 gaokao_audio/short_conv_520.wav 111111 Where does the conversation probable take place? A. In a classroom; B. In a library; C. In a bookshop. C True +short_conv_521 gaokao_audio/short_conv_521.wav 111111 How much should the woman pay? A. $8; B. $10; C. $12. A True +short_conv_522 gaokao_audio/short_conv_522.wav 111111 What is the weather probably like now? A. Dry; B. Windy; C. Rainy. A True +short_conv_523 gaokao_audio/short_conv_523.wav 111111 What will the man do tonight? A. Work on his report; B. Go dancing with Jenny; C. Help Jenny with her history. A True +short_conv_524 gaokao_audio/short_conv_524.wav 111111 What does the man imply? A. Jack didn’t find the record; B. Jack didn’t go to the party; C. Jack borrowed the record from him. A True +short_conv_525 gaokao_audio/short_conv_525.wav 111111 What are the speakers mainly talking about? A. A movie; B. A swimming pool; C. A plan. C True +short_conv_526 gaokao_audio/short_conv_526.wav 111111 How will the speakers go to the Sports Complex? A. By subway; B. By bus; C. By taxi. C True +short_conv_527 gaokao_audio/short_conv_527.wav 111111 How many people are added to the lunch reservation? A. Six; B. Four; C. Two. A True +short_conv_528 gaokao_audio/short_conv_528.wav 111111 What are the speakers mainly talking about? A. A book; B. A film; C. A writer. B True +short_conv_529 gaokao_audio/short_conv_529.wav 111111 What did the man ask Justin to do? A. Borrow some magazines for him; B. Bring some magazines to him; C. Refer to some magazines to finish his design. B True +short_conv_53 gaokao_audio/short_conv_53.wav 111111 What is the man going to do now? A. Go home; B. Go to the store; C. Go to the hospital. A True +short_conv_530 gaokao_audio/short_conv_530.wav 111111 Where did the woman stay while she was in Alaska? A. She stayed in the local's house; B. She stayed in a hotel with her friends; C. She camped near the mountains. C True +short_conv_531 gaokao_audio/short_conv_531.wav 111111 Why does the girl want to buy a clock? A. She has trouble waking up; B. She wants to buy someone a gift; C. Her watch is broken. A True +short_conv_532 gaokao_audio/short_conv_532.wav 111111 What is the man going to do tonight? A. To a birthday party; B. To visit Nancy; C. To the airport. C True +short_conv_533 gaokao_audio/short_conv_533.wav 111111 How does this woman think of her interview? A. It was tough B. It was interesting C. It was successful C True +short_conv_534 gaokao_audio/short_conv_534.wav 111111 What are the speakers talking about? A. A restaurant B. A street C. A dish A True +short_conv_535 gaokao_audio/short_conv_535.wav 111111 Where does the conversation probably take place? A. In a bank B. At a ticket office C. On the train B True +short_conv_536 gaokao_audio/short_conv_536.wav 111111 What is the probable relationship between the speakers? A. Colleagues B. Brother and sister C. Teacher and student A True +short_conv_537 gaokao_audio/short_conv_537.wav 111111 What does John find difficult in learning German? A. Pronunciation B. Vocabulary C. Grammar C True +short_conv_538 gaokao_audio/short_conv_538.wav 111111 What will the speakers probably do next? A. Wait for the cat; B. Feed the cat; C. Call the cat. A True +short_conv_539 gaokao_audio/short_conv_539.wav 111111 Where are the speakers? A. In a classroom; B. In a library; C. In a bookstore. B True +short_conv_54 gaokao_audio/short_conv_54.wav 111111 What was the woman doing just now? A. Taking an exam; B. Talking to her professor; C. Giving money to the homeless. B True +short_conv_540 gaokao_audio/short_conv_540.wav 111111 What do the speakers think of Linda’s brother? A. He is quiet B. He is friendly; C. He is unpleasant. C True +short_conv_541 gaokao_audio/short_conv_541.wav 111111 What is Jack’s position? A. A manager; B. A cleaner; C. A salesperson. A True +short_conv_542 gaokao_audio/short_conv_542.wav 111111 What did the woman dislike when she was young? A. Chocolate; B. Vegetables; C. Cookies. B True +short_conv_543 gaokao_audio/short_conv_543.wav 111111 How does the woman probably feel now? A. Excited ; B. Tired ; C. Sad. B True +short_conv_544 gaokao_audio/short_conv_544.wav 111111 What is the man going to do next Saturday? A. Attend a party; B. Stay at home ; C. Visit his grandparents. B True +short_conv_545 gaokao_audio/short_conv_545.wav 111111 When is the woman’s school usually over? A. At 5:30 pm; B. At 6:00 pm ; C. At 6:30 pm. A True +short_conv_546 gaokao_audio/short_conv_546.wav 111111 How will the woman go to her piano lesson? A. On foot ; B. By bike ; C. By car . A True +short_conv_547 gaokao_audio/short_conv_547.wav 111111 Who does the man want to talk to ? A. Tammy; B. Dr.Maxwell; C. Emmy Simpson. C True +short_conv_548 gaokao_audio/short_conv_548.wav 111111 Where does the conversation probably take place? A. On a farm; B. At a fruit market; C. At customs(海关). C True +short_conv_549 gaokao_audio/short_conv_549.wav 111111 When will the man most likely get home? A. At 7:00; B. At about 7:30; C. After 8:00. B True +short_conv_55 gaokao_audio/short_conv_55.wav 111111 Where did Mike meet up with Sam? A. At a gym; B. At a restaurant; C. At a movie theater. A True +short_conv_550 gaokao_audio/short_conv_550.wav 111111 What will the man do next? A. Fill out another form; B. Correct his mistake on the form; C. Tell the woman his medical history. A True +short_conv_551 gaokao_audio/short_conv_551.wav 111111 Where is the woman going next? A. To a snack bar; B. To a movie theater; C. To her friend Simon’s house. A True +short_conv_552 gaokao_audio/short_conv_552.wav 111111 What is the man looking for? A. A book; B. His iPhone; C. A pay phone. C True +short_conv_553 gaokao_audio/short_conv_553.wav 111111 What sport does the woman like best? A. Basketball B. Volleyball C. Tennis C True +short_conv_554 gaokao_audio/short_conv_554.wav 111111 What are the speakers talking about? A. A professor; B. A report; C. An animal. B True +short_conv_555 gaokao_audio/short_conv_555.wav 111111 What will the speakers probably do tomorrow? A. Clean the garage; B. Tidy the yard; C. Do some shopping. A True +short_conv_556 gaokao_audio/short_conv_556.wav 111111 Who is using Tom’s notes now? A. Linda; B. Paul; C. Ivan. B True +short_conv_557 gaokao_audio/short_conv_557.wav 111111 For which subject does the woman feel fully prepared? A. English; B. Math; C. Physics. A True +short_conv_558 gaokao_audio/short_conv_558.wav 111111 Who will begin the lecture now? A. Prof. Brookings; B. Dr. Mildens; C. Dr. White. A True +short_conv_559 gaokao_audio/short_conv_559.wav 111111 What did the woman do for Mary last night? A. She fixed Mary’s car; B. She gave Mary a phone call; C. She let Mary sleep in her house. C True +short_conv_56 gaokao_audio/short_conv_56.wav 111111 Where is Mike now? A. At home; B. In the school office; C. In the park. C True +short_conv_560 gaokao_audio/short_conv_560.wav 111111 Where do the speakers plan to go? A. The theater; B. Their mom’s office; C. Their grandma’s house. C True +short_conv_561 gaokao_audio/short_conv_561.wav 111111 What are the speakers talking about? A. A birthday celebration; B. A fancy restaurant; C. A holiday plan. A True +short_conv_562 gaokao_audio/short_conv_562.wav 111111 What does the man suggest the woman do? A. Buy a new dress; B. Exchange the dress; C. Get the dress tailored. C True +short_conv_563 gaokao_audio/short_conv_563.wav 111111 What are the speakers mainly talking about? A. Young people lose their jobs easily; B. Young people seldom stay long in the same job; C. Young people are too quick in making decisions. B True +short_conv_564 gaokao_audio/short_conv_564.wav 111111 How does the woman feel about the zoo? A. Sad; B. Disappointed; C. Impressed. C True +short_conv_565 gaokao_audio/short_conv_565.wav 111111 What is the woman doing now? A. Making a list; B. Baking cookies; C. Shopping for groceries. A True +short_conv_566 gaokao_audio/short_conv_566.wav 111111 What happened to the woman? A. She went to sleep late; B. She got to work late; C. She woke up late. C True +short_conv_567 gaokao_audio/short_conv_567.wav 111111 Where does the man want to go? A. A railway station; B. The seaside; C. A post office. B True +short_conv_568 gaokao_audio/short_conv_568.wav 111111 What is the man they imply? A. Many students find Professor Brown’s lecture uninteresting; B. Few students understand Professor Brown’s lecture; C. Many students have dropped Professor Brown’s class. A True +short_conv_569 gaokao_audio/short_conv_569.wav 111111 What can we learn from the conversation about the woman? A. She isn’t popular with the colleagues in the sales department; B. She enjoyed working in the sales department; C. She doesn’t like her new position very much. B True +short_conv_57 gaokao_audio/short_conv_57.wav 111111 What does the man ask the woman to help with? A. His English; B. His math; C. His science. B True +short_conv_570 gaokao_audio/short_conv_570.wav 111111 what is the man probably mean? A. He is concerned about the woman’s safety; B. There is something wrong with the car; C. The woman must fasten the seat belt. C True +short_conv_571 gaokao_audio/short_conv_571.wav 111111 What can we learn from the conversation? A. The weather will not affect their plan; B. They will not do as planned in case of rain; C. They will postpone their programme if it rains. B True +short_conv_572 gaokao_audio/short_conv_572.wav 111111 What does the woman imply? A. She’s unable to finish her homework; B. She has to remove the virus; C. She’s infected with some disease. A True +short_conv_573 gaokao_audio/short_conv_573.wav 111111 What can be most probably inferred about the man? A. He didn’t get the type of room he wanted; B. He expected the room to be more expensive; C. He thought he had already made a reservation. A True +short_conv_574 gaokao_audio/short_conv_574.wav 111111 What are they mainly talking about? A. The man’s hobby; B. The man’s interview; C. The man’s job. A True +short_conv_575 gaokao_audio/short_conv_575.wav 111111 What is the men think of the movie? A. Interesting; B. Successful; C. Boring. C True +short_conv_576 gaokao_audio/short_conv_576.wav 111111 How did the men plan to go to the shopping mall at first? A. By car; B. By bus; C. On foot. C True +short_conv_577 gaokao_audio/short_conv_577.wav 111111 Where are the speakers? A. At a bag store; B. In a restaurant; C. At a hotel. C True +short_conv_578 gaokao_audio/short_conv_578.wav 111111 Why was Alicia late this time? A. She missed the bus; B. Her grandma was sick; C. The bus was in an accident. C True +short_conv_579 gaokao_audio/short_conv_579.wav 111111 What was the woman probably trying to get? A. A ticket for a movie; B. A part in a play; C. A job as a model. B True +short_conv_58 gaokao_audio/short_conv_58.wav 111111 When will the man check the computer? A. In five minutes; B. In two days; C. In two weeks. A True +short_conv_580 gaokao_audio/short_conv_580.wav 111111 How does the woman feel about the shoes? A. They’re a bit small; B. They’re too expensive; C. She doesn’t like the color. C True +short_conv_581 gaokao_audio/short_conv_581.wav 111111 What is the relationship between the two speakers? A. Husband and wife; B. Teacher and students; C. Doctor and patient. A True +short_conv_582 gaokao_audio/short_conv_582.wav 111111 What can we learn from this conversation? A. The man has already downloaded some sales data; B. They all make preparations for the meeting; C. The woman asks for high quality service. B True +short_conv_583 gaokao_audio/short_conv_583.wav 111111 What will the woman probably do? A. Lock the computer lab later; B. Buy a new lock for the computer lab; C. Show the man where the lab is. A True +short_conv_584 gaokao_audio/short_conv_584.wav 111111 What can we learn from this conversation? A. The woman is a tour guide; B. The tour guide was born in New York; C. The man is a British native speaker. B True +short_conv_585 gaokao_audio/short_conv_585.wav 111111 Where does the girl want to go? A. The History Museum; B. The Art Museum; C. The Space Museum. A True +short_conv_586 gaokao_audio/short_conv_586.wav 111111 What's the relationship between Cindy and Ron? A. Mother and son; B. Wife and husband; C. Waitress and customer. B True +short_conv_587 gaokao_audio/short_conv_587.wav 111111 Where most probably are the two speakers? A. At an airport; B. At a city Hall; C. At a railway station. C True +short_conv_588 gaokao_audio/short_conv_588.wav 111111 How does the woman suggest the man go to the city? A. By foot; B. By bus; C. By taxi. C True +short_conv_589 gaokao_audio/short_conv_589.wav 111111 What do we know about the speakers? A. They live together; B. They both like Star Wars; C. They are talking in the man’s room. C True +short_conv_59 gaokao_audio/short_conv_59.wav 111111 What can we know about the man? A. He has got the job; B. He wears long hair; C. He has just had his hair cut. B True +short_conv_590 gaokao_audio/short_conv_590.wav 111111 How might the man’s action appear to others in the U.S.? A. Very rude; B. Quite normal; C. A little old-fashioned. B True +short_conv_591 gaokao_audio/short_conv_591.wav 111111 At what time does the office open? A. 7:45; B. 8:00; C. 8:15. B True +short_conv_592 gaokao_audio/short_conv_592.wav 111111 What did the man do during his vacation? A. He stayed at home; B. He had a part-time job; C. He took some courses. C True +short_conv_593 gaokao_audio/short_conv_593.wav 111111 What does the man work as now? A. An official; B. A lawyer; C. A sales manager. C True +short_conv_594 gaokao_audio/short_conv_594.wav 111111 What does the woman ask the man to do? A. Start a fire; B. Look out of the window; C. Put his cigarette in the ashtray. C True +short_conv_595 gaokao_audio/short_conv_595.wav 111111 What does the man need now? A. Ice cream; B. Milk; C. Water. C True +short_conv_596 gaokao_audio/short_conv_596.wav 111111 What did the man do last weekend? A. He played basketball; B. He watched a game; C. He took a trip. C True +short_conv_597 gaokao_audio/short_conv_597.wav 111111 Where is probably Sue now? A. At home; B. At Bill’s home; C. At the office. C True +short_conv_598 gaokao_audio/short_conv_598.wav 111111 What does the woman want to do? A. Quit smoking; B. Change a seat; C. Buy a cake. B True +short_conv_599 gaokao_audio/short_conv_599.wav 111111 What can be inferred from the man? A. Top concern should be given to safety; B. Bicycles are not always extremely cheap; C. The price can not decide the quality of bicycles. A True +short_conv_6 gaokao_audio/short_conv_6.wav 111111 Where does the conversation probably take place? A. In a bookstore; B. In an office; C. In a storehouse. C True +short_conv_60 gaokao_audio/short_conv_60.wav 111111 Which kind of music does the man like best? A. Pop music; B. Classical music; C. Folk music. C True +short_conv_600 gaokao_audio/short_conv_600.wav 111111 What will the woman most probably do? A. Buy a new printer with less noise; B. Read a book on how to fix the printer; C. Get a repairman to check the printer. C True +short_conv_601 gaokao_audio/short_conv_601.wav 111111 What does the woman imply? A. John's speech has something to be desired; B. John has a talent for delivering public speeches; C. John is brave enough to express his viewpoints. C True +short_conv_602 gaokao_audio/short_conv_602.wav 111111 What's the woman's advice? A. Giving the paper to his tutor; B. Asking Mrs. Black for advice; C. Choosing biology as the subject. B True +short_conv_603 gaokao_audio/short_conv_603.wav 111111 What's the possible relationship between the man and the woman? A. Boss and secretary; B. Professor and student; C. Waiter and guest. B True +short_conv_604 gaokao_audio/short_conv_604.wav 111111 How does the man feel? A. Confused; B. Surprised; C. Worried. C True +short_conv_605 gaokao_audio/short_conv_605.wav 111111 How long will it take if they go to the Art Center by subway? A. 45 minutes; B. 50 minutes; C. 60 minutes. A True +short_conv_606 gaokao_audio/short_conv_606.wav 111111 What can we know from the conversation? A. Cathy doesn’t like parties; B. Cathy won’t come to the party; C. Cathy has just returned from China. B True +short_conv_607 gaokao_audio/short_conv_607.wav 111111 When does the man think the woman should book a flight? A. In two weeks’ time; B. As soon as possible; C. One day before the departing day. B True +short_conv_608 gaokao_audio/short_conv_608.wav 111111 What are the two speakers talking? A. Their trip to New Zealand; B. Their time with their families; C. Their plans for the Christmas holidays. C True +short_conv_609 gaokao_audio/short_conv_609.wav 111111 What will the woman do this afternoon? A. Go to visit Mary; B. Have afternoon tea; C. Go to catch a train. C True +short_conv_61 gaokao_audio/short_conv_61.wav 111111 Where did the woman put up the painting? A. In the living com B. In the bedroom C. In the bathroom C True +short_conv_610 gaokao_audio/short_conv_610.wav 111111 How much does the woman have to pay if she buys two pairs of shoes? A. $35 B. $56; C. $70. B True +short_conv_611 gaokao_audio/short_conv_611.wav 111111 What are the speakers mainly talking about? A. An e-mail; B. A company; C. An old workmate. C True +short_conv_612 gaokao_audio/short_conv_612.wav 111111 What was wrong with the woman? A. She nearly had an accident; B. She knocked into a taxi; C. She is sick. A True +short_conv_613 gaokao_audio/short_conv_613.wav 111111 Where could the speakers most likely be? A. In a restaurant; B. In a supermarket; C. In the man’s house. B True +short_conv_614 gaokao_audio/short_conv_614.wav 111111 When does the film finish? A. At 10:15; B. At 10:30; C. At 11:00. A True +short_conv_615 gaokao_audio/short_conv_615.wav 111111 What is the weather like during the weekend? A. Cold; B. Warm; C. Hot. B True +short_conv_616 gaokao_audio/short_conv_616.wav 111111 What does the man think of the plays by Lady Orland? A. Boring and terrible; B. Serious and positive; C. Inspiring and humorous. C True +short_conv_617 gaokao_audio/short_conv_617.wav 111111 When will the man leave for Liverpool? A. At 12:00; B. At 14:30; C. At 17:30. B True +short_conv_618 gaokao_audio/short_conv_618.wav 111111 What does the woman really mean? A. There's no problem; B. She is very busy; C. She’ll go to another place. B True +short_conv_619 gaokao_audio/short_conv_619.wav 111111 What’s the time now? A. 10:30; B. 10:10; C. 9:50. B True +short_conv_62 gaokao_audio/short_conv_62.wav 111111 What happened to the man ? A. He paid 10 dollars for a shirt; B. He got a shirt from his friend; C. He bought the shirt at a higher price. C True +short_conv_620 gaokao_audio/short_conv_620.wav 111111 When will the woman speaker come back home? A. Early in the evening; B. Late in the evening; C. Early in the afternoon. A True +short_conv_621 gaokao_audio/short_conv_621.wav 111111 What’s the possible relationship between the speakers? A. Teacher and student; B. Manager and secretary; C. Police officer and driver. C True +short_conv_622 gaokao_audio/short_conv_622.wav 111111 What does the woman think of coming back by coach? A. It’s comfortable; B. It’s expensive; C. It’s time-saving. A True +short_conv_623 gaokao_audio/short_conv_623.wav 111111 What are the speakers going to do? A. Do some cooking; B. Stop to eat; C. Go into a dining room. B True +short_conv_624 gaokao_audio/short_conv_624.wav 111111 Where does the conversation take place? A. At home; B. In the street; C. In a restaurant B True +short_conv_625 gaokao_audio/short_conv_625.wav 111111 What is the man? A. A doctor; B. A tailor; C. A waiter. C True +short_conv_626 gaokao_audio/short_conv_626.wav 111111 What is the problem? A. The woman doesn’t like orange juice; B. The man was looking for orange juice; C. The man broke the container of juice. C True +short_conv_627 gaokao_audio/short_conv_627.wav 111111 How did the woman feel about the books’ price? A. Cheap; B. Expensive; C. Have no idea. A True +short_conv_628 gaokao_audio/short_conv_628.wav 111111 How can the woman get Kate’s phone number? A. The man will get the new number for her; B. She can get the new number by calling the old one; C. Kate is still using the old one, so she can call the old one. B True +short_conv_629 gaokao_audio/short_conv_629.wav 111111 What does the man think of the woman’s hat? A. It’s very good; B. He likes the style of it; C. It doesn’t go well with her dress. C True +short_conv_63 gaokao_audio/short_conv_63.wav 111111 How does the woman feel? A. Annoyed; B. Relieved; C. Nervous. A True +short_conv_630 gaokao_audio/short_conv_630.wav 111111 What time is it now? A. 7:15 B. 6:40 C. 7:45 A True +short_conv_631 gaokao_audio/short_conv_631.wav 111111 What does the woman mean? A. She is fully enjoying herself; B. She doesn’t like the atmosphere; C. She is not familiar with the songs. A True +short_conv_632 gaokao_audio/short_conv_632.wav 111111 What does the woman imply? A. The man should give Tom more influence; B. Tom’s project doesn’t need to be revised at all; C. It’s unlikely that Tom will revise his project. C True +short_conv_633 gaokao_audio/short_conv_633.wav 111111 What do we know from the conversation? A. The woman is glad to meet Mr. Brown in person; B. The man is meeting the woman on behalf of Mr. Brown; C. The woman feels sorry that Mr. Brown is unable to come. B True +short_conv_634 gaokao_audio/short_conv_634.wav 111111 What does the man say about the experiment? A. It’s better than expected; B. It’s not satisfactory at all; C. It’s beyond expectation. B True +short_conv_635 gaokao_audio/short_conv_635.wav 111111 What does the woman think of the speech? A. Convincing; B. Unbelievable; C. Time-consuming. A True +short_conv_636 gaokao_audio/short_conv_636.wav 111111 What is the man suggest the woman do? A. Make a little progress; B. Change for another course; C. Stick to the course. C True +short_conv_637 gaokao_audio/short_conv_637.wav 111111 What are the 2 speakers probably doing? A. Taking a photo; B. Practicing riding a car; C. Hanging a picture. A True +short_conv_638 gaokao_audio/short_conv_638.wav 111111 How much will the men pay for the two shirts? A. $ 30; B. $ 45; C. $ 60. B True +short_conv_639 gaokao_audio/short_conv_639.wav 111111 What are the speakers talking about? A. Drinks to be delivered; B. Shopping list for drinks; C. Preparations for a party. C True +short_conv_64 gaokao_audio/short_conv_64.wav 111111 What might the boy do after school? A. Wait at school for his mother; B. Play on the swings with Katie; C. Go to the park with his mother. B True +short_conv_640 gaokao_audio/short_conv_640.wav 111111 Where does this conversation probably take place? A. At a hotel; B. At a bus stop; C. At a post office. A True +short_conv_641 gaokao_audio/short_conv_641.wav 111111 What was the woman doing when the earthquake happened? A. She was washing her hair; B. She was feeding the dog; C. She was cleaning the bathroom. A True +short_conv_642 gaokao_audio/short_conv_642.wav 111111 What are the speakers mainly talking about? A. Chocolate; B. Cookies; C. Milk. B True +short_conv_643 gaokao_audio/short_conv_643.wav 111111 Where does the conversation most probably take place? A. In a hotel; B. In a post office; C. In the woman’s house. A True +short_conv_644 gaokao_audio/short_conv_644.wav 111111 How much did the bank lose according to the man? A. $2,000,000; B. $4,000,000; C. $6,000,000. B True +short_conv_645 gaokao_audio/short_conv_645.wav 111111 When should the passengers check in for flight 452? A. At 3:50; B. At 4:50; C. At 5:50. A True +short_conv_646 gaokao_audio/short_conv_646.wav 111111 What are the speakers talking about? A. Homework; B. Exams; C. Books. B True +short_conv_647 gaokao_audio/short_conv_647.wav 111111 What does the woman suggest the man do? A. Put off the trip; B. Visit Sweden in the summer; C. Take some clothes to keep warm. C True +short_conv_648 gaokao_audio/short_conv_648.wav 111111 Where does the conversation most probably take place? A. In a supermarket; B. In a restaurant; C. In the man’s house. A True +short_conv_649 gaokao_audio/short_conv_649.wav 111111 What does the man want to buy? A. A jacket; B. A hat; C. A sweater. A True +short_conv_65 gaokao_audio/short_conv_65.wav 111111 What does the woman want the man to do? A. Bring her a blanket; B. Turn down the heat; C. Shut the windows. C True +short_conv_650 gaokao_audio/short_conv_650.wav 111111 What will the man do on Friday? A. Send food; B. Attend a meeting; C. Order food. B True +short_conv_651 gaokao_audio/short_conv_651.wav 111111 Why is the woman having trouble? A. The table is heavy; B. The house is far away; C. The table’s sides are hard to hold. C True +short_conv_652 gaokao_audio/short_conv_652.wav 111111 Which season is it now? A. Summer; B. Fall; C. Winter. B True +short_conv_653 gaokao_audio/short_conv_653.wav 111111 Where is the woman? A. In an office; B. In a hotel room; C. At a restaurant. B True +short_conv_654 gaokao_audio/short_conv_654.wav 111111 How old is the woman now? A. 18 years old; B. 20 years old; C. 38 years old. C True +short_conv_655 gaokao_audio/short_conv_655.wav 111111 What does the man ask the woman to do? A. Solve a problem; B. Write a report; C. Send an e-mail. B True +short_conv_656 gaokao_audio/short_conv_656.wav 111111 What are the speakers discussing'? A. Which bus to take; B. Which way to go; C. Which stop to get off. A True +short_conv_657 gaokao_audio/short_conv_657.wav 111111 Where are the speakers? A. In a clothes store; B. In a car shop; C. In a parking lot. B True +short_conv_658 gaokao_audio/short_conv_658.wav 111111 Why does the woman often eat at restaurants? A. She likes the food there; B. She doesn't like cooking; C. She's too busy to cook. C True +short_conv_659 gaokao_audio/short_conv_659.wav 111111 What time is it now? A. 12:30; B. 1:00; C. 1:30. A True +short_conv_66 gaokao_audio/short_conv_66.wav 111111 How long will the boy be at summer camp? A. One week; B. Two weeks; C. Three weeks. B True +short_conv_660 gaokao_audio/short_conv_660.wav 111111 What is the man doing? A. Reading a magazine; B. Checking his email; C. Typing a report. C True +short_conv_661 gaokao_audio/short_conv_661.wav 111111 what can we learn from the conversation A. The woman is confident in the sales of her paintings; B. The man doubts that the woman’s paintings will sell well; C. The man is concerned about critics’ comments on the show. C True +short_conv_662 gaokao_audio/short_conv_662.wav 111111 What does the woman mean? A. People should care more about their appearance; B. It’s not sensible to go after brand-name clothing; C. Styles change more quickly than necessary nowadays. B True +short_conv_663 gaokao_audio/short_conv_663.wav 111111 what does the woman mean? A. She has no spare room for a change; B. The hotel’s business is now very good; C. She’s busy with her business right now. A True +short_conv_664 gaokao_audio/short_conv_664.wav 111111 what is the woman going to do? A. She’s flying to Hong Kong; B. She’s going to buy an airplane ticket; C. She’s leaving for Hong Kong with Bill. A True +short_conv_665 gaokao_audio/short_conv_665.wav 111111 What does the man mean? A. He is worried about their trip expense; B. He suggests the woman bring her daughter; C. He suggests the woman visit the university. B True +short_conv_666 gaokao_audio/short_conv_666.wav 111111 What are the two speakers doing? A. Talking on the phone; B. Working in an office; C. Doing spelling practice. A True +short_conv_667 gaokao_audio/short_conv_667.wav 111111 What will the man most probably do? A. Persuade the member not to quit; B. Attend the next club meeting; C. Look for someone to fill the position. C True +short_conv_668 gaokao_audio/short_conv_668.wav 111111 What are the 2 speakers talking about? A. Tour news; B. A job opportunity; C. Sales strategies. B True +short_conv_669 gaokao_audio/short_conv_669.wav 111111 Where does the conversation most probably take place? A. At a hotel; B. At an airport; C. At a police station. A True +short_conv_67 gaokao_audio/short_conv_67.wav 111111 What does the man imply? A. He is stressed; B. He works too hard; C. He needs some excitement. C True +short_conv_670 gaokao_audio/short_conv_670.wav 111111 What is the probable relationship between the two speakers? A. Guide and tourist; B. Customer and shop assistant; C. Trainer and trainee. B True +short_conv_671 gaokao_audio/short_conv_671.wav 111111 What was the woman doing when the earthquake happened? A. She was washing her hair; B. She was feeding the dog; C. She was cleaning the bathroom. A True +short_conv_672 gaokao_audio/short_conv_672.wav 111111 What are the speakers mainly talking about? A. Chocolate; B. Cookies; C. Milk. B True +short_conv_673 gaokao_audio/short_conv_673.wav 111111 Where does the conversation most probably take place? A. In a hotel; B. In a post office; C. In the woman’s house. A True +short_conv_674 gaokao_audio/short_conv_674.wav 111111 When should the passengers check in for flight 452? A. At 3:50; B. At 4:50; C. At 5:50. A True +short_conv_675 gaokao_audio/short_conv_675.wav 111111 How much did the bank lose according to the man? A. $2,000,000; B. $4,000,000; C. $6,000,000. B True +short_conv_676 gaokao_audio/short_conv_676.wav 111111 What can we learn from the conversation? A. The new suit is a reminder for the man; B. The new suit doesn’t fit the man; C. The man forgets to wear his new suit. B True +short_conv_677 gaokao_audio/short_conv_677.wav 111111 What does the woman suggest the man do? A. Leave for Beijing with Jack; B. Go to the airport after work; C. Ask someone else for help. C True +short_conv_678 gaokao_audio/short_conv_678.wav 111111 What does the woman imply? A. Weather forecasts are not reliable; B. They could stick to their plan; C. They’d better change their mind. B True +short_conv_679 gaokao_audio/short_conv_679.wav 111111 What does the man mean? A. He partly agrees with the woman; B. He considers the woman competitive; C. He’s wholly been lost in a colorful life. A True +short_conv_68 gaokao_audio/short_conv_68.wav 111111 Why is the man lost? A. He took a wrong turn; B. He was told to take this way; C. He missed the freeway signs. A True +short_conv_680 gaokao_audio/short_conv_680.wav 111111 What does the man imply? A. Mary must be caught in heavy traffic; B. The woman was obviously not fond of Mary; C. The woman forgot to tell Mary to come. A True +short_conv_681 gaokao_audio/short_conv_681.wav 111111 What does the woman mean? A. She will stay for breakfast; B. She loves to grab a coffee on the way; C. She needs to eat before school. C True +short_conv_682 gaokao_audio/short_conv_682.wav 111111 What will the man probably do next? A. Carry the bags; B. Hurry to drive the car; C. Search for the bags. A True +short_conv_683 gaokao_audio/short_conv_683.wav 111111 What are the speakers probably doing? A. Reading newspapers; B. Talking about sports; C. Putting up advertisements. A True +short_conv_684 gaokao_audio/short_conv_684.wav 111111 Where does the conversation probably take place? A. In a taxi; B. On a bus; C. On a bridge. A True +short_conv_685 gaokao_audio/short_conv_685.wav 111111 What's the probable relationship between the two speakers? A. Father and daughter; B. Manager and secretary; C. Customer and shop assistant. B True +short_conv_686 gaokao_audio/short_conv_686.wav 111111 Why does the woman want to buy a heavy coat for Jimmy? A. Jimmy will go camping in the mountains; B. Winter is coming soon; C. Jimmy has caught a bad cold. A True +short_conv_687 gaokao_audio/short_conv_687.wav 111111 What does the man advise the woman to do? A. Exercise for 20 minutes in the morning; B. Read English every morning; C. Get up early. B True +short_conv_688 gaokao_audio/short_conv_688.wav 111111 When will the man check out? A. On Thursday; B. On Friday; C. On Tuesday. B True +short_conv_689 gaokao_audio/short_conv_689.wav 111111 What does the man mean? A. He can’t hear what the woman is saying; B. He is afraid to touch the spider; C. He will try to touch the spider later. B True +short_conv_69 gaokao_audio/short_conv_69.wav 111111 How much is the painting worth now? A. $2,000; B. $2 million; C. $30 million. B True +short_conv_690 gaokao_audio/short_conv_690.wav 111111 Where does the woman want to go? A. The supermarket; B. The kindergarten; C. The book store. C True +short_conv_691 gaokao_audio/short_conv_691.wav 111111 What are the speakers talking about? A. Where to play; B. When to play; C. Who to play with. A True +short_conv_692 gaokao_audio/short_conv_692.wav 111111 How did the woman feel about her presentation? A. Relaxed; B. Confident; C. Anxious. C True +short_conv_693 gaokao_audio/short_conv_693.wav 111111 What color T-shirt does the man like? A. Green and white; B. Gray and black; C. Gray and white. A True +short_conv_694 gaokao_audio/short_conv_694.wav 111111 When will the speakers meet? A. By 5:00; B. By 4:30; C. By 2:30. C True +short_conv_695 gaokao_audio/short_conv_695.wav 111111 What is the charge for breakfast at the moment? A. $2; B. $2.50; C. $3. B True +short_conv_696 gaokao_audio/short_conv_696.wav 111111 What will the woman probably do? A. To serve as a good mechanic; B. To buy a new car; C. To get her car maintained. C True +short_conv_697 gaokao_audio/short_conv_697.wav 111111 What was the man informed online? A. It would get warm today; B. The cold front would stay for long; C. The weather report was wrong. A True +short_conv_698 gaokao_audio/short_conv_698.wav 111111 What does the woman mean? A. The man should continue with his exercise; B. It is important to make warming-up exercise; C. The man should start to exercise one month later. A True +short_conv_699 gaokao_audio/short_conv_699.wav 111111 What does the woman mean? A. She doesn’t like the steak; B. She is too full to have anything more; C. She is full of energy. B True +short_conv_7 gaokao_audio/short_conv_7.wav 111111 How does the man feel about the test? A. Confident; B. Worried; C. Sleepy. A True +short_conv_70 gaokao_audio/short_conv_70.wav 111111 What does the woman want to know? A. Which items are on sale; B. Where the back of the store is; C. What the sign outside says. A True +short_conv_700 gaokao_audio/short_conv_700.wav 111111 What are they most probably talking about? A. Matches; B. Toes; C. Shoes. C True +short_conv_701 gaokao_audio/short_conv_701.wav 111111 What are they talking about? A. A soccer game; B. A swimming game; C. A Marathon running race. A True +short_conv_702 gaokao_audio/short_conv_702.wav 111111 What do we learn from the conversation? A. The man will take the flight on Sep. 16; B. The man wants to sell his ticket for Sep. 16; C. The man is likely to take the flight on Sep. 20. C True +short_conv_703 gaokao_audio/short_conv_703.wav 111111 What does the woman intend to tell the man? A. The paintings are copies with reasonable prices; B. The paintings are only sold at this fair; C. The paintings are highly priced. A True +short_conv_704 gaokao_audio/short_conv_704.wav 111111 What is the man mean? A. The lady is satisfied with her black coffee; B. The lady has to have black coffee; C. The lady has had too much black coffee. B True +short_conv_705 gaokao_audio/short_conv_705.wav 111111 Where does the conversation most probably take place? A. At an airport; B. At a bus stop; C. In a subway station. A True +short_conv_706 gaokao_audio/short_conv_706.wav 111111 What are the speakers talking about? A. Where to play; B. When to play; C. Who to play with. A True +short_conv_707 gaokao_audio/short_conv_707.wav 111111 How did the woman feel about her presentation? A. Relaxed; B. Confident; C. Anxious. C True +short_conv_708 gaokao_audio/short_conv_708.wav 111111 What color T-shirt does the man like? A. Green and white; B. Gray and black; C. Gray and white. A True +short_conv_709 gaokao_audio/short_conv_709.wav 111111 When will the speakers meet? A. By 5:00; B. By 4:30; C. By 2:30. C True +short_conv_71 gaokao_audio/short_conv_71.wav 111111 What is the conversation about? A. How to get to Greece; B. Where to go on holiday; C. Whether to go to the small village. B True +short_conv_710 gaokao_audio/short_conv_710.wav 111111 What is the charge for breakfast at the moment? A. $2; B. $2.50; C. $3. B True +short_conv_711 gaokao_audio/short_conv_711.wav 111111 What is the woman complaining about? A. The busy line; B. The wrong food; C. The late delivery. C True +short_conv_712 gaokao_audio/short_conv_712.wav 111111 What are the speakers talking about? A. The weather; B. Writing skills; C. Weekend plans. C True +short_conv_713 gaokao_audio/short_conv_713.wav 111111 What does the woman want to do? A. Attend a party; B. Call the Trumps; C. Get Michael’s number. B True +short_conv_714 gaokao_audio/short_conv_714.wav 111111 How does the woman sound? A. Relieved; B. Worried; C. Disappointed. A True +short_conv_715 gaokao_audio/short_conv_715.wav 111111 What kind of shoes will the woman probably buy? A. Dress shoes; B. Soccer shoes; C. Tennis boots. B True +short_conv_716 gaokao_audio/short_conv_716.wav 111111 Why was the woman worried? A. The lessons were long; B. The man came back late; C. The lessons were confusing. B True +short_conv_717 gaokao_audio/short_conv_717.wav 111111 When will the speakers probably meet next time? A. On Sunday; B. On Wednesday; C. On Saturday. B True +short_conv_718 gaokao_audio/short_conv_718.wav 111111 When will the second bus probably leave? A. At 10:10; B. At 10:20; C. At 10:30. B True +short_conv_719 gaokao_audio/short_conv_719.wav 111111 What are the speakers talking about? A. Building a fire; B. Building a house; C. Buying some wood. A True +short_conv_72 gaokao_audio/short_conv_72.wav 111111 What do we know about the man? A. He didn’t follow his doctor’s advice; B. He was under pressure from his wife; C. He gave up smoking. C True +short_conv_720 gaokao_audio/short_conv_720.wav 111111 How does the woman feel about the old cartoons? A. They’re exciting; B. They’re her favorites; C. They’re only for young children. C True +short_conv_721 gaokao_audio/short_conv_721.wav 111111 Why did the man change his mind probably? A. He didn’t bring enough money; B. He forgot his wallet; C. He didn’t need that much fruit. A True +short_conv_722 gaokao_audio/short_conv_722.wav 111111 What are the speakers mainly talking about? A. The role of shopping in people’s lives; B. How to promote sales; C. The importance of mass media. A True +short_conv_723 gaokao_audio/short_conv_723.wav 111111 What happened to the man just now? A. He met an old friend on the street; B. He mistook the woman for his friend; C. Lydia paid an unexpected visit to him. B True +short_conv_724 gaokao_audio/short_conv_724.wav 111111 Who is the woman? A. Mary; B. Mary’s sister; C. Mary’s mother. B True +short_conv_725 gaokao_audio/short_conv_725.wav 111111 When did the man live in London? A. Last year; B. Last month; C. When he was a child. C True +short_conv_726 gaokao_audio/short_conv_726.wav 111111 what can we know from the conversation? A. People have already been standing in line for two hours; B. The man must wait for two hours to buy the ticket; C. The man can buy a special ticket before the drama starts. C True +short_conv_727 gaokao_audio/short_conv_727.wav 111111 what does the man say about David? A. He has been to Seattle many times; B. He holds a high position in his company; C. He lived in Seattle for many years. A True +short_conv_728 gaokao_audio/short_conv_728.wav 111111 what can be learned about the woman's paper? A. It hasn’t been graded; B. The committee is discussing it; C. The woman hasn’t handed it in. A True +short_conv_729 gaokao_audio/short_conv_729.wav 111111 what does the woman suggest the man do? A. Pick up the package at the post office; B. Ask to have the package delivered to his home; C. Find out the opening hours of the post office. B True +short_conv_73 gaokao_audio/short_conv_73.wav 111111 Why does the man think the woman is lucky? A. She has finished her term paper; B. She can work on the computer; C. She has a new typewriter. B True +short_conv_730 gaokao_audio/short_conv_730.wav 111111 what kind of person is Victor according to the conversation? A. He is heroic; B. He is life-threatening; C. He is awkward. A True +short_conv_731 gaokao_audio/short_conv_731.wav 111111 what does the woman mean? A. The reaction to the comedy is varied; B. The review of the newspaper is one-sided; C. Media are prejudiced against the comedy. A True +short_conv_732 gaokao_audio/short_conv_732.wav 111111 what is the woman mean? A. Eric won’t eat vegetable without meat; B. Some meat will solve Eric’s problem; C. Eric is short of vegetable. A True +short_conv_733 gaokao_audio/short_conv_733.wav 111111 what is the man probably doing? A. Buying the insurance; B. Buying a car; C. Taking a plane. B True +short_conv_734 gaokao_audio/short_conv_734.wav 111111 what does the woman imply? A. She can’t wait for the winter to arrive; B. It’s hard to know how severe the winter will be; C. She needs a warm jacket. C True +short_conv_735 gaokao_audio/short_conv_735.wav 111111 where does this conversation most probably take place. A. At an airport; B. At a police station; C. Ata travel agency. A True +short_conv_736 gaokao_audio/short_conv_736.wav 111111 Why is the woman disappointed about the restaurant? A. The price is unacceptable; B. The waiter is unfriendly; C. The service is slow. C True +short_conv_737 gaokao_audio/short_conv_737.wav 111111 What are the speakers discussing? A. When to watch TV; B. What program to watch; C. Whether to see a film. B True +short_conv_738 gaokao_audio/short_conv_738.wav 111111 What does the woman ask the man to do? A. Move some boxes; B. Drive a car; C. Make a phone call. A True +short_conv_739 gaokao_audio/short_conv_739.wav 111111 What will the speakers do in the afternoon? A. Go mountain biking; B. Build a tree house; C. Play beach volleyball. B True +short_conv_74 gaokao_audio/short_conv_74.wav 111111 What will the man do for the woman? A. Send her to the hospital; B. Help her ask for leave; C. Get some medicine for her. B True +short_conv_740 gaokao_audio/short_conv_740.wav 111111 How will the girFs mother pay for the CD? A. In cash; B. By credit card; C. By cheque. C True +short_conv_741 gaokao_audio/short_conv_741.wav 111111 Why didn’t Johnson have supper? A. He was too tired; B. He had a stomachache; C. He was not hungry. B True +short_conv_742 gaokao_audio/short_conv_742.wav 111111 What does the woman think of her trip to India? A. It was interesting; B. It was terrible; C. It was just so-so. C True +short_conv_743 gaokao_audio/short_conv_743.wav 111111 Why is the man going shopping? A. To buy a schoolbag for the woman; B. To buy a birthday gift for his sister; C. To buy a coat for himself. B True +short_conv_744 gaokao_audio/short_conv_744.wav 111111 What kind of room does the woman want? A. A room with a shower; B. A room with a single bed; C. A room with no air-conditioner. A True +short_conv_745 gaokao_audio/short_conv_745.wav 111111 What’s the probable relationship between the speakers? A. Teacher and student; B. Manager and staff; C. Husband and wife. C True +short_conv_746 gaokao_audio/short_conv_746.wav 111111 what can we learn from the conversation? A. The woman thinks it difficult to find the uniforms; B. The woman doesn't know the location of the school; C. The man implies his uniforms are hidden in a haystack(干草垛). A True +short_conv_747 gaokao_audio/short_conv_747.wav 111111 Why are People worried about the overhead power lines? A. They can’t represent the look of the area; B. They are hidden danger in the neighborhood; C. They have historical values and should be protected. B True +short_conv_748 gaokao_audio/short_conv_748.wav 111111 What are the two speakers talking about? A. The way to buy a sweater out of stock; B. The refund policy of the store; C. The proper size of a sweater. A True +short_conv_749 gaokao_audio/short_conv_749.wav 111111 What can we learn from the conversation? A. The man's eating habit is quite different from the woman's; B. The woman has decided not to be a vegetarian; C. The woman usually avoids any kind of animal meat. A True +short_conv_75 gaokao_audio/short_conv_75.wav 111111 Where does the conversation take place? A. In a library; B. In a classroom; C. In a bookstore. A True +short_conv_750 gaokao_audio/short_conv_750.wav 111111 Where does the conversation most probably take place? A. At the airport; B. At the hospital; C. At the hotel. A True +short_conv_751 gaokao_audio/short_conv_751.wav 111111 How long did David stay abroad in all? A. 9 days; B. 11 days; C. 16 days. C True +short_conv_752 gaokao_audio/short_conv_752.wav 111111 Why did the woman get a “C” for her report? A. Because she forgot the deadline for the report; B. Because the man forgot to hand in her report; C. Because she didn’t hand in her report on time. C True +short_conv_753 gaokao_audio/short_conv_753.wav 111111 What are the speakers probably talking about? A. Buying a house; B. Finding a hotel; C. Buying a car. A True +short_conv_754 gaokao_audio/short_conv_754.wav 111111 What do we know about Peter Schmidt? A. He has lost his ticket; B. He is expecting a ticket; C. He went out to buy a ticket. B True +short_conv_755 gaokao_audio/short_conv_755.wav 111111 Where are the two speakers? A. In a cafe; B. On a plane; C. On a ship. B True +short_conv_756 gaokao_audio/short_conv_756.wav 111111 What does the man imply? A. He quite agrees with Mr. Johnson’s views; B. He has his own opinions on social welfare; C. Mr. Johnson is skillful in expressing his ideas. A True +short_conv_757 gaokao_audio/short_conv_757.wav 111111 What does the man mean? A. The elderly don’t know how to use apps; B. The elderly can help to develop smart apps; C. The app developers can’t afford to ignore the elderly. C True +short_conv_758 gaokao_audio/short_conv_758.wav 111111 Why can't the woman understand Mr. James. A. Mr. James likes boasting of his cleverness; B. The woman is not interested in what Mr. James says; C. Mr. James isn’t very straightforward in what he says. C True +short_conv_759 gaokao_audio/short_conv_759.wav 111111 What does the man want? A. A job offer; B. An excellent résumé; C. The position of system engineer. A True +short_conv_76 gaokao_audio/short_conv_76.wav 111111 How do the speakers go to work? A. By bus; B. By taxi; C. By bike. A True +short_conv_760 gaokao_audio/short_conv_760.wav 111111 How does the man feel? A. Regretful; B. Angry; C. Relieved. B True +short_conv_761 gaokao_audio/short_conv_761.wav 111111 What does the man imply? A. His wife didn’t take his sensible advice; B. He didn’t want to cut his wife’s long hair; C. His wife often complains about everything. A True +short_conv_762 gaokao_audio/short_conv_762.wav 111111 What can we learn about Patrick from the conversation? A. His roommate walks in his sleep; B. His roommate’s bed is always in a mess; C. He doesn’t like sharing a room with anyone. B True +short_conv_763 gaokao_audio/short_conv_763.wav 111111 How much will woman pay if she rented a room for three weeks? A. $50; B. $120; C. $150. C True +short_conv_764 gaokao_audio/short_conv_764.wav 111111 What can we learn from the conversation? A. The woman was fully absorbed in the movie; B. The woman couldn’t understand the movie very well; C. The movie was no better than what the woman had imagined. A True +short_conv_765 gaokao_audio/short_conv_765.wav 111111 Where does the conversation most probably take place? A. On a plane; B. On a bus; C. In a department store. A True +short_conv_766 gaokao_audio/short_conv_766.wav 111111 How might the woman feel? A. Uneasy; B. Disappointed; C. Unconcerned. B True +short_conv_767 gaokao_audio/short_conv_767.wav 111111 What seemed to be Sarah’s problem? A. She couldn’t finish the task as required; B. She failed in a job interview again; C. She always went to work late. A True +short_conv_768 gaokao_audio/short_conv_768.wav 111111 What are the speakers mainly talking about? A. Environmental protection; B. Greenhouse effect; C. Gardening skills. C True +short_conv_769 gaokao_audio/short_conv_769.wav 111111 How much more does Lucas need for the cellphone? A. $300; B. $500; C. $800. A True +short_conv_77 gaokao_audio/short_conv_77.wav 111111 What does the woman look like? A. She’s slim; B. She wears glasses; C. She has short hair. C True +short_conv_770 gaokao_audio/short_conv_770.wav 111111 What did the woman try to quit drinking? A. Tea; B. Coffee; C. Juice. B True +short_conv_771 gaokao_audio/short_conv_771.wav 111111 What’s wrong with the coat? A. It’s a different brand; B. It’s a different color; C. It’s a wrong size. B True +short_conv_772 gaokao_audio/short_conv_772.wav 111111 What is the probable relationship between the speakers? A. Boss and employee; B. Doctor and patient; C. Teacher and student. C True +short_conv_773 gaokao_audio/short_conv_773.wav 111111 Who gave the woman a new car? A. Her sister; B. Her father; C. Her grandfather. B True +short_conv_774 gaokao_audio/short_conv_774.wav 111111 What time will the movie begin? A. At 8:10; B. At 8:15; C. At 8:20. C True +short_conv_775 gaokao_audio/short_conv_775.wav 111111 How does the man find his life in the countryside? A. Fun but inconvenient; B. Fine but tiring; C. Interesting but hard. A True +short_conv_776 gaokao_audio/short_conv_776.wav 111111 What does the man mean? A. He won’t vote for the woman; B. The woman shouldn’t have asked him for his vote; C. The woman should ask his roommate to vote for her. A True +short_conv_777 gaokao_audio/short_conv_777.wav 111111 What does the woman mean? A. She doesn’t want to join a gardening club; B. She doesn’t have time to work in a garden; C. She’s never been formally invited into a club. A True +short_conv_778 gaokao_audio/short_conv_778.wav 111111 What can be inferred from the conversation? A. The woman didn’t work hard enough on her paper; B. The professor was content with the woman’s paper; C. The paper wasn’t as good as the woman had thought. C True +short_conv_779 gaokao_audio/short_conv_779.wav 111111 What does the man mean? A. He’s satisfied with his job; B. He likes working in hot summer; C. He gets more pay than expected. A True +short_conv_78 gaokao_audio/short_conv_78.wav 111111 What are the speakers talking about? A. A dog; B. A lecture; C. A professor. B True +short_conv_780 gaokao_audio/short_conv_780.wav 111111 What can be inferred about the man? A. He’s going to Philadelphia by train; B. He’s already missed his train; C. He’s familiar with the train station. C True +short_conv_781 gaokao_audio/short_conv_781.wav 111111 What does the woman mean? A. She’s already finished her report on the movie; B. She’ll be unable to see the movie with the man; C. She prefers a different type of movie to a comedy. B True +short_conv_782 gaokao_audio/short_conv_782.wav 111111 why did the man miss the football game? A. He can’t endure the loud noise from the game; B. He thought the game was disappointing; C. He doesn’t think football games make any sense. A True +short_conv_783 gaokao_audio/short_conv_783.wav 111111 What will the woman probably do next? A. Recalculate the bill; B. Refuse to pay the bill; C. Give the man a discount. A True +short_conv_784 gaokao_audio/short_conv_784.wav 111111 where does the conversation most probably take place? A. In a hotel; B. In a clinic; C. In a university. B True +short_conv_785 gaokao_audio/short_conv_785.wav 111111 What is most probably the man's occupation? A. An airhost; B. A passenger; C. A taxi driver. C True +short_conv_786 gaokao_audio/short_conv_786.wav 111111 What’s the good news? A. The man got a better position; B. The man is going to be a father; C. The man is going to get married. B True +short_conv_787 gaokao_audio/short_conv_787.wav 111111 Where does the conversation probably take place? A. At the woman’s home; B. In a cinema; C. In a shop. A True +short_conv_788 gaokao_audio/short_conv_788.wav 111111 How long has the rain lasted? A. 4 days; B. 5 days; C. 6 days. B True +short_conv_789 gaokao_audio/short_conv_789.wav 111111 What does the woman worry about? A. Their train tickets; B. Traffic jams; C. The driving habit. B True +short_conv_79 gaokao_audio/short_conv_79.wav 111111 Where are the speakers? A. In a library; B. In a garden; C. In a bookstore. C True +short_conv_790 gaokao_audio/short_conv_790.wav 111111 Who is the woman probably speaking to? A. A policeman; B. A friend; C. A shop assistant. A True +short_conv_791 gaokao_audio/short_conv_791.wav 111111 What are the speakers mainly talking about? A. A picture; B. A holiday; C. A sport. A True +short_conv_792 gaokao_audio/short_conv_792.wav 111111 What does the woman mean? A. Her sister loves villages; B. Tom makes a mistake; C. She likes her sister. B True +short_conv_793 gaokao_audio/short_conv_793.wav 111111 Where are the speakers? A. At a party; B. In a store; C. In their new house. C True +short_conv_794 gaokao_audio/short_conv_794.wav 111111 Who might Sam be? A. A baby; B. A pet; C. A toy. B True +short_conv_795 gaokao_audio/short_conv_795.wav 111111 What did the woman do last night? A. She stayed at home; B. She went to a party; C. She saw a doctor. A True +short_conv_796 gaokao_audio/short_conv_796.wav 111111 What is the woman doing? A. Reading; B. Asking for help; C. Washing hands. B True +short_conv_797 gaokao_audio/short_conv_797.wav 111111 What are the speakers mainly talking about? A. Children’s nature; B. Parents’ effect on children; C. The importance of school education. A True +short_conv_798 gaokao_audio/short_conv_798.wav 111111 What does the man suggest the woman do? A. Get a repairman; B. Put the table together; C. Do as the instructions tell. C True +short_conv_799 gaokao_audio/short_conv_799.wav 111111 When will the man make the call with the headquarters? A. At 9:30; B. At 10:30; C. At 10:40. C True +short_conv_8 gaokao_audio/short_conv_8.wav 111111 What will the man do first? A. Go to New York; B. Meet the woman; C. Visit Washington, D.C. A True +short_conv_80 gaokao_audio/short_conv_80.wav 111111 What will the man do tonight? A. Have a drink; B. Write a paper; C. Watch a film. B True +short_conv_800 gaokao_audio/short_conv_800.wav 111111 Where does the conversation probably take place? A. At a department; B. At the post office; C. At the cleaner’s. C True +short_conv_801 gaokao_audio/short_conv_801.wav 111111 What’s the good news? A. The man got a better position; B. The man is going to get married; C. The man is going to be a father. C True +short_conv_802 gaokao_audio/short_conv_802.wav 111111 How long has the rain lasted? A. 4 days; B. 5 days; C. 6 days. B True +short_conv_803 gaokao_audio/short_conv_803.wav 111111 Where does the conversation probably take place? A. At the woman’s home; B. In a cinema; C. In a shop. A True +short_conv_804 gaokao_audio/short_conv_804.wav 111111 Who is the woman probably speaking to? A. A friend; B. A policeman; C. A shop assistant. B True +short_conv_805 gaokao_audio/short_conv_805.wav 111111 What does the woman worry about? A. Their train tickets; B. The driving habit; C. Traffic jams. C True +short_conv_806 gaokao_audio/short_conv_806.wav 111111 What does the man imply? A. Papers pile up while he is on vacation; B. He has no time to go on holiday; C. Papers are too hard to understand. B True +short_conv_807 gaokao_audio/short_conv_807.wav 111111 What can we learn from the conversation? A. The man finds fault with others; B. The woman has calmed the horse; C. The man has realized his problem. C True +short_conv_808 gaokao_audio/short_conv_808.wav 111111 What can we learn from the conversation? A. Mr. Green can’t offer help to the woman; B. Italian words are hard to pronounce; C. Jack is not available at this moment. A True +short_conv_809 gaokao_audio/short_conv_809.wav 111111 How will the woman get to Tokyo? A. By bus; B. By subway; C. By plane. C True +short_conv_81 gaokao_audio/short_conv_81.wav 111111 Where does the conversation take place? A. In a restaurant; B. In a hotel; C. In supermarket. A True +short_conv_810 gaokao_audio/short_conv_810.wav 111111 How does the woman feel about the film? A. Disappointed; B. Interested; C. Frightened. A True +short_conv_811 gaokao_audio/short_conv_811.wav 111111 What does the woman mean? A. It is possible to cure toothache; B. She can stand two hours; C. It is too painful to be patient. C True +short_conv_812 gaokao_audio/short_conv_812.wav 111111 What can we learn from the conversation? A. Ben is not interested in the training experience; B. Others cherish Ben for his long term efforts; C. Ben is very eager for the scholarship. C True +short_conv_813 gaokao_audio/short_conv_813.wav 111111 How much would the woman have saved if she had waited? A. 15 dollars; B. 75 dollars; C. 60 dollars. A True +short_conv_814 gaokao_audio/short_conv_814.wav 111111 Where is the conversation taking place? A. In a zoo; B. In a museum; C. In a pet store. C True +short_conv_815 gaokao_audio/short_conv_815.wav 111111 What is the possible relationship between the speakers? A. Receptionist and guest; B. Doctor and patient; C. Waiter and diner. A True +short_conv_816 gaokao_audio/short_conv_816.wav 111111 What does Jenny decide to do first? A. Look for a job; B. Go on a trip; C. Get an assistant. B True +short_conv_817 gaokao_audio/short_conv_817.wav 111111 How will the woman get back from the railway station? A. By train; B. By car; C. By bus. C True +short_conv_818 gaokao_audio/short_conv_818.wav 111111 Why does the man talk to Dr. Simpson? A. To make an apology; B. To ask for help; C. To discuss his studies. A True +short_conv_819 gaokao_audio/short_conv_819.wav 111111 What is the weather like now? A. It’s sunny; B. It’s rainy; C. It’s cloudy. C True +short_conv_82 gaokao_audio/short_conv_82.wav 111111 How much will the man pay if he buys two T-shirts? A. 90 yuan B. 100 yuan C. 110 yuan A True +short_conv_820 gaokao_audio/short_conv_820.wav 111111 What will Lucy do at 11:30 tomorrow? A. Go out for lunch; B. See her dentist; C. Visit a friend. B True +short_conv_821 gaokao_audio/short_conv_821.wav 111111 Who is the man? A. A driver; B. A lawyer; C. A policeman. A True +short_conv_822 gaokao_audio/short_conv_822.wav 111111 Why does the man’s suit look strange? A. The color is too dark; B. He’s wearing it in the office; C. The jacket and trousers don't match. C True +short_conv_823 gaokao_audio/short_conv_823.wav 111111 What are the speakers mainly talk about? A. Patience; B. Interests; C. Challeup. B True +short_conv_824 gaokao_audio/short_conv_824.wav 111111 When will the man go to the cinema? A. On Saturday morning; B. On Saturday afternoon; C. On Saturday evening. C True +short_conv_825 gaokao_audio/short_conv_825.wav 111111 Where does this conversation mostly probably take place? A. In a kitchen; B. In a dinner-room; C. In a sitting-room. A True +short_conv_826 gaokao_audio/short_conv_826.wav 111111 What are the speakers talking about? A. An applicant; B. An experience; C. A job. A True +short_conv_827 gaokao_audio/short_conv_827.wav 111111 Why does the girl talk with the man? A. To send an invitation; B. To seek for help; C. To ask for permission. C True +short_conv_828 gaokao_audio/short_conv_828.wav 111111 What does the man want to do next? A. Stop for some coffee; B. Keep on working; C. Leave for home. B True +short_conv_829 gaokao_audio/short_conv_829.wav 111111 What was the weather like on Saturday? A. Sunny; B. Cloudy; C. Windy. A True +short_conv_83 gaokao_audio/short_conv_83.wav 111111 What’s the man doing? A. He’s preparing a lesson; B. He’s watching TV; C. He’s shouting. A True +short_conv_830 gaokao_audio/short_conv_830.wav 111111 Which part of the man’s body hurts? A. His back; B. His neck; C. His arm. A True +short_conv_831 gaokao_audio/short_conv_831.wav 111111 What does the woman ask the boy to wash? A. His hands; B. His plates; C. His clothes. A True +short_conv_832 gaokao_audio/short_conv_832.wav 111111 What will the man need to do during the holiday? A. Write essays; B. Play basketball; C. Take a vacation. A True +short_conv_833 gaokao_audio/short_conv_833.wav 111111 How many players will play the game? A. Two; B. Three; C. Four. B True +short_conv_834 gaokao_audio/short_conv_834.wav 111111 What meal are the speakers about to eat? A. Breakfast; B. Lunch; C. Dinner. C True +short_conv_835 gaokao_audio/short_conv_835.wav 111111 What color is the present sofa? A. Brown; B. White; C. Blue. B True +short_conv_836 gaokao_audio/short_conv_836.wav 111111 Why does the woman come to talk with the man? A. To take a test; B. To get a job; C. To buy things. B True +short_conv_837 gaokao_audio/short_conv_837.wav 111111 Who will pay for the dinner? A. John; B. Kate; C. Tom. C True +short_conv_838 gaokao_audio/short_conv_838.wav 111111 When did the woman’s brother start smoking? A. During high school; B. At college; C. After college. C True +short_conv_839 gaokao_audio/short_conv_839.wav 111111 What is the time now? A. 6:45; B. 6:55; C. 7:05. B True +short_conv_84 gaokao_audio/short_conv_84.wav 111111 How many pills should the man take in a day? A. 8; B. 12; C. 4. C True +short_conv_840 gaokao_audio/short_conv_840.wav 111111 Where does the conversation take place? A. In a restaurant; B. At a bookstore; C. In a supermarket. A True +short_conv_841 gaokao_audio/short_conv_841.wav 111111 What does the man mean? A. The film is terrible; B. The film can be seen online; C. The film is worth the money. A True +short_conv_842 gaokao_audio/short_conv_842.wav 111111 Where does the conversation most probably take place? A. At home; B. At a hospital; C. At a drug store. C True +short_conv_843 gaokao_audio/short_conv_843.wav 111111 How old is the woman now? A. 20 years old; B. 45 years old; C. 65 years old. B True +short_conv_844 gaokao_audio/short_conv_844.wav 111111 What is small for the woman? A. The T-shirt; B. The hat; C. The skirt. C True +short_conv_845 gaokao_audio/short_conv_845.wav 111111 What will the man do next? A. Turn off the TV; B. Study with the woman; C. Watch a movie. A True +short_conv_846 gaokao_audio/short_conv_846.wav 111111 What's the most probable relationship between the speakers? A. Electrician and owner; B. Boss and employee; C. Husband and wife C True +short_conv_847 gaokao_audio/short_conv_847.wav 111111 How does the woman probably feel? A. Embarrassed; B. Surprised; C. Grateful A True +short_conv_848 gaokao_audio/short_conv_848.wav 111111 How much will the man pay for the tickets? A. 70 dollars; B. 50 dollars C. 20 dollars. B True +short_conv_849 gaokao_audio/short_conv_849.wav 111111 What does the woman want to do tonight? A. Go to bed early; B. Prepare for a trip; C. Have dinner with the man A True +short_conv_85 gaokao_audio/short_conv_85.wav 111111 What’s the probable relationship between the two speakers? A. Teacher and student; B. Boss and worker; C. Shop assistant and customer. C True +short_conv_850 gaokao_audio/short_conv_850.wav 111111 What will the weather be probably like the next day A. Fine B. Rainy C. Windy B True +short_conv_851 gaokao_audio/short_conv_851.wav 111111 Where did the woman meet her husband again? A. In China; B. In America; C. In India. B True +short_conv_852 gaokao_audio/short_conv_852.wav 111111 What did the man do yesterday afternoon? A. He played football; B. He stayed in his room; C. He went to the cinema. B True +short_conv_853 gaokao_audio/short_conv_853.wav 111111 What are the two speakers talking about? A. Their favorite animals; B. Animals they've seen; C. Some lovely animals. A True +short_conv_854 gaokao_audio/short_conv_854.wav 111111 Why can't the woman find the car key in the room? A. It is in the car; B. She left it outside; C. Someone has taken it. C True +short_conv_855 gaokao_audio/short_conv_855.wav 111111 How many minutes earlier is the woman's watch? A. Five minutes; B. Ten minutes C. Fifteen minutes. C True +short_conv_856 gaokao_audio/short_conv_856.wav 111111 Why did the speakers get lost? A. They forgot the address; B. They ignored Google Maps; C. They got wrong instructions. C True +short_conv_857 gaokao_audio/short_conv_857.wav 111111 What does the woman advise the man to do? A. Be confident; B. Sell the company; C. Find another job. A True +short_conv_858 gaokao_audio/short_conv_858.wav 111111 What is the woman going to do now? A. Look for her keys; B. Go to work by bus; C. Clean up the room. B True +short_conv_859 gaokao_audio/short_conv_859.wav 111111 When does the conversation take place? A. At 2:45 P.m; B. At 3:00 P.m; C. At 3:15 P.m. C True +short_conv_86 gaokao_audio/short_conv_86.wav 111111 What are the speakers doing? A. Watching a movie; B. Selling movie tickets; C. Discussing a soap opera. A True +short_conv_860 gaokao_audio/short_conv_860.wav 111111 Where are probably the speakers? A. At a concert; B. In a restaurant; C. In a cinema. B True +short_conv_861 gaokao_audio/short_conv_861.wav 111111 What day is it when the conversation takes place? A. Saturday; B. Sunday; C. Monday. B True +short_conv_862 gaokao_audio/short_conv_862.wav 111111 Where is the man now? A. On his way; B. In a restaurant; C. At home. A True +short_conv_863 gaokao_audio/short_conv_863.wav 111111 What will Celia do? A. Find a player; B. Watch a game; C. Play basketball. C True +short_conv_864 gaokao_audio/short_conv_864.wav 111111 What are the speakers talking about? A. A noisy night; B. Their life in town; C. A place of living. C True +short_conv_865 gaokao_audio/short_conv_865.wav 111111 What does the man want to do? A. Take photos; B. Buy a camera; C. Help the woman. A True +short_conv_866 gaokao_audio/short_conv_866.wav 111111 Where does the conversation probably take place? A. At a hotel; B. In a ballroom; C. In a meeting room. A True +short_conv_867 gaokao_audio/short_conv_867.wav 111111 What does the woman mean? A. She asks the man to buy a new bike; B. She can’t afford to help the man; C. She doesn’t believe the man. C True +short_conv_868 gaokao_audio/short_conv_868.wav 111111 What does the woman suggest? A. Writing more essays; B. Experiencing Chinese culture; C. Borrowing some Chinese books. C True +short_conv_869 gaokao_audio/short_conv_869.wav 111111 What are the speakers mainly talking about? A. A live concert; B. A right choice; C. A business report. A True +short_conv_87 gaokao_audio/short_conv_87.wav 111111 What will the speakers do next? A. Go to the bookstore; B. Listen to some music; C. Eat in the restaurant. C True +short_conv_870 gaokao_audio/short_conv_870.wav 111111 How long has the woman been kept in the house? A. Two days; B. Three days; C. Five days. B True +short_conv_871 gaokao_audio/short_conv_871.wav 111111 What does the woman ask the boy to wash? A. His hands; B. His plates; C. His clothes. A True +short_conv_872 gaokao_audio/short_conv_872.wav 111111 What will the man need to do during the holiday? A. Write papers; B. Play basketball; C. Take a vacation. A True +short_conv_873 gaokao_audio/short_conv_873.wav 111111 How many players will play the game? A. Two; B. Three; C. Four. B True +short_conv_874 gaokao_audio/short_conv_874.wav 111111 What meal are the speakers about to eat? A. Breakfast; B. Lunch C. Dinner. C True +short_conv_875 gaokao_audio/short_conv_875.wav 111111 What color is the sofa? A. Brown; B. White; C. Blue. B True +short_conv_876 gaokao_audio/short_conv_876.wav 111111 When does the conversation take place? A. In the morning; B. In the afternoon; C. In the evening. A True +short_conv_877 gaokao_audio/short_conv_877.wav 111111 What is the man’s opinion on British food? A. Unhealthy; B. Tasteless; C. Excellent. C True +short_conv_878 gaokao_audio/short_conv_878.wav 111111 What are the speakers mainly talking about? A. The man’s hobby; B. A holiday plan C. Their childhood. A True +short_conv_879 gaokao_audio/short_conv_879.wav 111111 What is the woman trying to do? A. Hold a party for the man; B. Comfort the man; C. Apologize to the man. B True +short_conv_88 gaokao_audio/short_conv_88.wav 111111 Where does the conversation probably take place? A. In a library; B. In a classroom; C. In an office. B True +short_conv_880 gaokao_audio/short_conv_880.wav 111111 When can the woman take a vacation? A. At the end of August; B. At the end of June; C. This week. A True +short_conv_881 gaokao_audio/short_conv_881.wav 111111 What are the speakers talking about? A. Who will go to the party; B. Whether the party is formal; C. What the woman will wear to the party. C True +short_conv_882 gaokao_audio/short_conv_882.wav 111111 What does the woman mean? A. She is unhappy today; B. She is satisfied with life too; C. She is as cheerful as the man. A True +short_conv_883 gaokao_audio/short_conv_883.wav 111111 What will the man do next? A. Read a book; B. Take a picture; C. Play with a boy. B True +short_conv_884 gaokao_audio/short_conv_884.wav 111111 What did the man like when he was in college? A. Classical music; B. Rock music; C. Pop music. B True +short_conv_885 gaokao_audio/short_conv_885.wav 111111 Where are the speakers? A. On a train; B. In a taxi; C. On a bus. C True +short_conv_886 gaokao_audio/short_conv_886.wav 111111 What does the man advise the woman to do? A. Wait for the dining cart; B. Buy some sandwiches; C. Have some drinks. A True +short_conv_887 gaokao_audio/short_conv_887.wav 111111 How many children did the man take to the beach? A. Two; B. Three; C. Four. B True +short_conv_888 gaokao_audio/short_conv_888.wav 111111 Why does the woman call? A. To offer assistance; B. To cancel a meeting; C. To make an apology. A True +short_conv_889 gaokao_audio/short_conv_889.wav 111111 What is Stan's job? A. A chef; B. A teacher; C. A photographer. C True +short_conv_89 gaokao_audio/short_conv_89.wav 111111 How does the woman sound? A. Unhappy; B. Excited; C. Surprised. A True +short_conv_890 gaokao_audio/short_conv_890.wav 111111 What will the man do first? A. Work overtime; B. Walk the dog; C. Do some exercise. C True +short_conv_891 gaokao_audio/short_conv_891.wav 111111 What are the speakers mainly talking about? A. A French exam; B. An interpreter course; C. A job opportunity. C True +short_conv_892 gaokao_audio/short_conv_892.wav 111111 What is the man’s favorite season? A. Spring; B. Autumn; C. Winter. B True +short_conv_893 gaokao_audio/short_conv_893.wav 111111 Where does the conversation take place? A. In a hotel; B. In a library; C. In a museum. B True +short_conv_894 gaokao_audio/short_conv_894.wav 111111 How will the speakers tour the city? A. By walking; B. By driving a car; C. By taking the bus. C True +short_conv_895 gaokao_audio/short_conv_895.wav 111111 At what time will the woman arrive at the office tomorrow? A. 8:00; B. 8:30 C. 9:00. A True +short_conv_896 gaokao_audio/short_conv_896.wav 111111 What’s the woman’s attitude to McDonald’s? A. Supportive; B. Neutral; C. Opposed. C True +short_conv_897 gaokao_audio/short_conv_897.wav 111111 How does the woman feel? A. Satisfied; B. Discouraged; C. Excited. B True +short_conv_898 gaokao_audio/short_conv_898.wav 111111 Where are the speakers? A. At home; B. In the office; C. In the stadium. A True +short_conv_899 gaokao_audio/short_conv_899.wav 111111 Where does the woman want to go? A. Chicago; B. Atlanta; C. Denver. B True +short_conv_9 gaokao_audio/short_conv_9.wav 111111 What is the relationship between the woman and Dr. Philips? A. Hostess and gardener; B. Neighbors; C. Doctor and patient. B True +short_conv_90 gaokao_audio/short_conv_90.wav 111111 What is the probable relationship between the speakers? A. Customer and salesman; B. Interviewer and interviewee; C. Boss and secretary. B True +short_conv_900 gaokao_audio/short_conv_900.wav 111111 What are the speakers probably doing? A. Preparing for camping; B. Buying sleeping bags; C. Cleaning up the car. A True +short_conv_901 gaokao_audio/short_conv_901.wav 111111 What does the man mean about Mr. Dale? A. He’s become director of the department; B. He gets on very well with his colleague; C. He’s the focus of people’s attention. C True +short_conv_902 gaokao_audio/short_conv_902.wav 111111 What is the man doing? A. Shopping with his son; B. Buying a gift for a kid; C. Bargaining with a salesgirl. B True +short_conv_903 gaokao_audio/short_conv_903.wav 111111 How did the woman feel about the movie? A. Interesting; B. Boring; C. Instructive. B True +short_conv_904 gaokao_audio/short_conv_904.wav 111111 When will the plane arrive? A. At 3: 30pm; B. At 4:00pm; C. At 4: 30pm. C True +short_conv_905 gaokao_audio/short_conv_905.wav 111111 Where are the two speakers? A. At the airport; B. At the hotel; C. At the railway station. C True +short_conv_906 gaokao_audio/short_conv_906.wav 111111 How does the man feel about his food. A. Hot B. Salty C. Tasteless C True +short_conv_907 gaokao_audio/short_conv_907.wav 111111 How much does the woman have to pay? A. $2 B. $3 C. $4 B True +short_conv_908 gaokao_audio/short_conv_908.wav 111111 What is the relationship between the speakers? A. Colleagues; B. Waiter and customer; C. Boss and employee. A True +short_conv_909 gaokao_audio/short_conv_909.wav 111111 When does the rainy season start? A. In January; B. In February; C. In November. C True +short_conv_91 gaokao_audio/short_conv_91.wav 111111 What are the speakers mainly talking about? A. The woman's paper; B. The weekend plan; C. Outdoor activities. B True +short_conv_910 gaokao_audio/short_conv_910.wav 111111 Where are the speakers? A. In a restaurant; B. In a hospital; C. In a shop. A True +short_conv_911 gaokao_audio/short_conv_911.wav 111111 What is the weather like in the man’s hometown? A. Warm; B. Comfortable; C. Wet. B True +short_conv_912 gaokao_audio/short_conv_912.wav 111111 What does the woman want to learn next year? A. Math; B. Science; C. Law. C True +short_conv_913 gaokao_audio/short_conv_913.wav 111111 How does the man feel now? A. Cheerful; B. Unhappy; C. Afraid. B True +short_conv_914 gaokao_audio/short_conv_914.wav 111111 Who is possibly at college? A. Liza; B. Peter; C. Grace. C True +short_conv_915 gaokao_audio/short_conv_915.wav 111111 How does the woman know about the Second World War? A. She experienced it; B. She saw a film about it; C. She played a game about it. A True +short_conv_916 gaokao_audio/short_conv_916.wav 111111 What is the woman probably doing? A. Drinking water; B. Washing a brush; C. Painting a picture. C True +short_conv_917 gaokao_audio/short_conv_917.wav 111111 Why did the man leave his previous job? A. The pay wasn’t good; B. It kept him busy every day; C. There’s no room for development. C True +short_conv_918 gaokao_audio/short_conv_918.wav 111111 What is the man going to do? A. Write his paper; B. Visit Professor Green; C. Go to the cinema with the woman. B True +short_conv_919 gaokao_audio/short_conv_919.wav 111111 What does the man think of this summer? A. It will be nice; B. It will be hotter; C. It will be cool. B True +short_conv_92 gaokao_audio/short_conv_92.wav 111111 Where does this conversation probably take place? A. At a bus stop; B. On the street; C. At an information desk C True +short_conv_920 gaokao_audio/short_conv_920.wav 111111 What are the speakers mainly talking about? A. A book; B. Their children; C. Education. A True +short_conv_921 gaokao_audio/short_conv_921.wav 111111 Where will the speakers read the book together? A. At the woman’s house; B. In the library; C. At the school café. C True +short_conv_922 gaokao_audio/short_conv_922.wav 111111 What is the time now? A. 8:00 p.m; B. 7:30 p.m; C. 7:00 p.m. C True +short_conv_923 gaokao_audio/short_conv_923.wav 111111 How does the woman get the information she wants? A. From the TV; B. From the newspaper; C. From the Internet. C True +short_conv_924 gaokao_audio/short_conv_924.wav 111111 What does the man want to do now? A. Have supper; B. Set the table; C. Watch the news. C True +short_conv_925 gaokao_audio/short_conv_925.wav 111111 Where will the speakers read the book together? A. At the woman’s house; B. In the library; C. At the school café. C True +short_conv_926 gaokao_audio/short_conv_926.wav 111111 What are the speakers mainly talking about? A. A book; B. Their children; C. Education. A True +short_conv_927 gaokao_audio/short_conv_927.wav 111111 What is the time now? A. 8:00 p.m; B. 7:30 p.m; C. 7:00 p.m. C True +short_conv_928 gaokao_audio/short_conv_928.wav 111111 How does the woman get the information she wants? A. From the TV; B. From the newspaper; C. From the Internet. C True +short_conv_929 gaokao_audio/short_conv_929.wav 111111 What does the man want to do now? A. Have supper; B. Set the table; C. Watch the news. C True +short_conv_93 gaokao_audio/short_conv_93.wav 111111 Which flight will the man take? A. 10: 45; B. 12: 00; C. 14: 50. A True +short_conv_930 gaokao_audio/short_conv_930.wav 111111 What do the speakers mainly talk about? A. Have a class reunion; B. Plan a birthday gift; C. Visit a family member. C True +short_conv_931 gaokao_audio/short_conv_931.wav 111111 What is the man’s job? A. He is a model; B. He is a designer; C. He is a salesman. C True +short_conv_932 gaokao_audio/short_conv_932.wav 111111 Where is Jacob now? A. At home; B. At school; C. At a supermarket. B True +short_conv_933 gaokao_audio/short_conv_933.wav 111111 What does the man want to order? A. French fries; B. A large soft drink; C. A bacon sandwich. C True +short_conv_934 gaokao_audio/short_conv_934.wav 111111 What is the weather like row? A. Sunny; B. Cloudy; C. Rainy. B True +short_conv_935 gaokao_audio/short_conv_935.wav 111111 What is the probable relationship between the speakers? A. Friends; B. Boss and employee; C. Salesman and customer. B True +short_conv_936 gaokao_audio/short_conv_936.wav 111111 What does the man usually do on the weekend? A. Go to the movies; B. Meet up with friends; C. Read books at home. C True +short_conv_937 gaokao_audio/short_conv_937.wav 111111 What subject does the man have trouble with? A. Math; B. Science; C. English. A True +short_conv_938 gaokao_audio/short_conv_938.wav 111111 What did the woman get from her mother? A. A new CD B. A new bike; C. A birthday card. B True +short_conv_939 gaokao_audio/short_conv_939.wav 111111 When will the football program begin? A. At 7:00; B. At 8:25; C. At 9:30. C True +short_conv_94 gaokao_audio/short_conv_94.wav 111111 How much will the woman pay? A. $15; B. $20; C. $25. B True +short_conv_940 gaokao_audio/short_conv_940.wav 111111 What's the probable relationship between the speakers? A. Husband and wife; B. Doctor and patient; C. Teacher and student. B True +short_conv_941 gaokao_audio/short_conv_941.wav 111111 What does the man think Michael has been doing this week? A. Going to class; B. Resting at home; C. Looking for a job. C True +short_conv_942 gaokao_audio/short_conv_942.wav 111111 What is the woman going to do? A. Pray for good luck; B. Prepare for a debate; C. Study for the final exam. B True +short_conv_943 gaokao_audio/short_conv_943.wav 111111 What does the man think of the jacket? A. It has too many pockets; B. It's great for everyday use; C. It is suitable for outdoor activities. C True +short_conv_944 gaokao_audio/short_conv_944.wav 111111 What impressed the man? A. The fresh air; B. The heavy rain; C. The kind woman. A True +short_conv_945 gaokao_audio/short_conv_945.wav 111111 What is the man’s secret ingredient? A. The spice; B. The cheese; C. The red wine. C True +short_conv_946 gaokao_audio/short_conv_946.wav 111111 What is the man going to do after work? A. Go back home; B. Go to the dancing club; C. Go for a drink. C True +short_conv_947 gaokao_audio/short_conv_947.wav 111111 What day is it today? A. Friday; B. Saturday; C. Sunday. B True +short_conv_948 gaokao_audio/short_conv_948.wav 111111 Where does the conversation take place probably? A. In a concert; B. In a ball; C. In a CD store. B True +short_conv_949 gaokao_audio/short_conv_949.wav 111111 How does the man feel about his trip? A. Regretful; B. Meaningful; C. Happy. A True +short_conv_95 gaokao_audio/short_conv_95.wav 111111 What does the man need? A. Coffee; B. Sprite; C. Orange juice. C True +short_conv_950 gaokao_audio/short_conv_950.wav 111111 What is the woman probably doing? A. Drinking water; B. Washing a brush; C. Painting a picture. C True +short_conv_951 gaokao_audio/short_conv_951.wav 111111 How does the woman know about the Second World War? A. She experienced it; B. She saw a film about it; C. She played a game about it. A True +short_conv_952 gaokao_audio/short_conv_952.wav 111111 Why did the man leave his previous job? A. The pay wasn’t good; B. It kept him busy every day; C. There’s no room for development. C True +short_conv_953 gaokao_audio/short_conv_953.wav 111111 What does the man think of this summer? A. It will be nice; B. It will be hotter; C. It will be cool. B True +short_conv_954 gaokao_audio/short_conv_954.wav 111111 What is the man going to do? A. Write his paper; B. Visit Professor Green; C. Go to the cinema with the woman. B True +short_conv_955 gaokao_audio/short_conv_955.wav 111111 What does the woman think of the movie? A. Interesting; B. Exciting; C. Disappointing. C True +short_conv_956 gaokao_audio/short_conv_956.wav 111111 How much does the man pay for the book? A. $ 20; B. $ 12.5; C. $ 7.5. B True +short_conv_957 gaokao_audio/short_conv_957.wav 111111 When will the basketball match take place? A. On Tuesday; B. On Thursday; C. On Friday. C True +short_conv_958 gaokao_audio/short_conv_958.wav 111111 What does the woman suggest doing? A. Going by bus; B. Going by car; C. Going on foot. A True +short_conv_959 gaokao_audio/short_conv_959.wav 111111 What does the man do most weekends? A. He goes shopping; B. He watches matches; C. He visits museums. B True +short_conv_96 gaokao_audio/short_conv_96.wav 111111 What does the man mean? A. Violence sports are to blame for the school bullying; B. Violence sports serve as an escape for negative emotions; C. Violence sports should expand the fans base in the long run. B True +short_conv_960 gaokao_audio/short_conv_960.wav 111111 What does the man want to find? A. His pencils; B. His books; C. His bag. A True +short_conv_961 gaokao_audio/short_conv_961.wav 111111 Where can the woman be? A. At the library; B. At the doctor’s; C. At a bookshop. B True +short_conv_962 gaokao_audio/short_conv_962.wav 111111 Who are the speakers going to see? A. The woman’s father; B. The man’s uncle; C. The man’s father. C True +short_conv_963 gaokao_audio/short_conv_963.wav 111111 Where does the woman suggest going? A. To the cinema; B. To the bookstore; C. To the shopping mall. C True +short_conv_964 gaokao_audio/short_conv_964.wav 111111 When will the meeting start? A. At 8:15; B. At 8:45; C. At 9:00. C True +short_conv_965 gaokao_audio/short_conv_965.wav 111111 How does the man learn to be a Christmas father? A. By playing with children; B. By learning from his father C. By going to a school C True +short_conv_966 gaokao_audio/short_conv_966.wav 111111 What does the woman want to do on Wednesday? A. Do her homework; B. See a movie; C. Have football practice. B True +short_conv_967 gaokao_audio/short_conv_967.wav 111111 What does the man think of artificial intelligence? A. It will help doctors; B. It will treat patients; C. It will replace doctors. A True +short_conv_968 gaokao_audio/short_conv_968.wav 111111 Who will pick up the woman at the airport? A. The man's brother; B. The woman's father; C. The man's co—worker A True +short_conv_969 gaokao_audio/short_conv_969.wav 111111 What does the man want to have? A. Coffee; B. Orange juice; C. Soda. B True +short_conv_97 gaokao_audio/short_conv_97.wav 111111 What kinds of vocation does the man probably prefer? A. Casual; B. Extended; C. Well-planned. C True +short_conv_970 gaokao_audio/short_conv_970.wav 111111 What are the speakers mainly talking about? A. A present for Molly; B. A birthday party; C. A musician’s life. A True +short_conv_971 gaokao_audio/short_conv_971.wav 111111 What can we know about the man? A. He had just joined a new team; B. He was praised by the manager; C. He evaluated others’ performances, B True +short_conv_972 gaokao_audio/short_conv_972.wav 111111 What will the speakers do first after watching the dolphin show? A. See the elephants; B. Drink a cup of tea; C. Have a watch repaired. B True +short_conv_973 gaokao_audio/short_conv_973.wav 111111 Where does the conversation probably take place? A. At a restaurant; B. In the street; C. At home. C True +short_conv_974 gaokao_audio/short_conv_974.wav 111111 How did the man get the book? A. He received it from his friend; B. He bought it from a bookstore; C. He borrowed it from the library. C True +short_conv_975 gaokao_audio/short_conv_975.wav 111111 Why was the woman so late? A. She didn’t catch the bus; B. She took somebody to hospital; C. Something went wrong with the bus. C True +short_conv_976 gaokao_audio/short_conv_976.wav 111111 What does the man mean? A. He preferred to go to the basketball game; B. He didn’t like to go to the basketball game; C. He enjoyed watching the football game on TV. B True +short_conv_977 gaokao_audio/short_conv_977.wav 111111 How does the woman feel about Tom? A. He gets nervous very easily; B. He is not used to making a speech; C. He is extremely good at making a speech. B True +short_conv_978 gaokao_audio/short_conv_978.wav 111111 What does the woman want the man to do first? A. Fix the shelf; B. Paint the car; C. Look for his key. A True +short_conv_979 gaokao_audio/short_conv_979.wav 111111 What is the man probably doing? A. Writing a story; B. Telling a joke; C. Watching a movie. C True +short_conv_98 gaokao_audio/short_conv_98.wav 111111 What does the woman suggest the man do? A. Ask the repair store to fix the calculator; B. Borrow the tools needed to fix the calculator; C. Figure out what is wrong with the calculator. A True +short_conv_980 gaokao_audio/short_conv_980.wav 111111 When can the man eat in the restaurant? A. At 11:00 a.m; B. At 6:00 a.m; C. At 10:00 p.m. A True +short_conv_981 gaokao_audio/short_conv_981.wav 111111 What problem is the man facing? A. His room is very dirty; B. He feels a pain in the neck; C. His roommate is annoying him. C True +short_conv_982 gaokao_audio/short_conv_982.wav 111111 What will the man do on Sunday? A. See a movie; B. Do his homework; C. Go shopping. A True +short_conv_983 gaokao_audio/short_conv_983.wav 111111 How does the woman feel about the book? A. challenging B. Boring; C. Interesting. C True +short_conv_984 gaokao_audio/short_conv_984.wav 111111 What will the woman do at 3:30 p.m.? A. Meet Miss Lee; B. Attend a meeting; C. Call Roland. B True +short_conv_985 gaokao_audio/short_conv_985.wav 111111 What is the man doing? A. Searching for an app; B. Learning words; C. Playing a game. B True +short_conv_986 gaokao_audio/short_conv_986.wav 111111 What’s the probable relationship between the speakers? A. Classmates; B. Colleagues; C. Strangers. C True +short_conv_987 gaokao_audio/short_conv_987.wav 111111 What are the speakers talking about? A. A traffic accident; B. Traffic rules; C. A student’s fault. A True +short_conv_988 gaokao_audio/short_conv_988.wav 111111 What does the woman think of the food in the restaurant? A. Sweet; B. Good; C. Expensive. C True +short_conv_989 gaokao_audio/short_conv_989.wav 111111 What is the probable relationship between the speakers? A. Colleagues; B. Brother and sister; C. Teacher and student. A True +short_conv_99 gaokao_audio/short_conv_99.wav 111111 What has the man assumed about the woman? A. She has made a great fortune; B. She has the foggiest idea of business; C. She is a gifted stock operator. B True +short_conv_990 gaokao_audio/short_conv_990.wav 111111 What is the man doing? A. Eating dessert; B. Reading a book; C. Taking out the rubbish. B True +short_conv_991 gaokao_audio/short_conv_991.wav 111111 How long did Maria stay in France? A. One year; B. Two years; C. Three years. B True +short_conv_992 gaokao_audio/short_conv_992.wav 111111 Where will the woman meet the driver? A. Next to the bank; B. Beside the bus stop; C. Opposite the theater. C True +short_conv_993 gaokao_audio/short_conv_993.wav 111111 Why did the man come home late? A. He ate out with his friend; B. He studied at schoo1; C. He watched a match. C True +short_conv_994 gaokao_audio/short_conv_994.wav 111111 What did the woman probably win? A. A television; B. $64 in cash; C. A radio. A True +short_conv_995 gaokao_audio/short_conv_995.wav 111111 What is the woman complaining about? A. The bad traffic; B. Her early work schedule; C. The annoying construction. C True +short_conv_996 gaokao_audio/short_conv_996.wav 111111 Where might the  speakers be? A. In a park; B. In a classroom; C. In a gym. A True +short_conv_997 gaokao_audio/short_conv_997.wav 111111 What’s the man? A. A waiter; B. An accountant; C. A programmer. A True +short_conv_998 gaokao_audio/short_conv_998.wav 111111 What does the man want the woman to do? A. Clean up the house; B. play chess with him; C. Have a chat with him. A True +short_conv_999 gaokao_audio/short_conv_999.wav 111111 What’s the weather like tomorrow? A. Rainy; B. Windy; C. Sunny A True diff --git a/WavLLM/wavllm/test_data/sv.tsv b/WavLLM/wavllm/test_data/sv.tsv new file mode 100644 index 0000000..bdeaa8b --- /dev/null +++ b/WavLLM/wavllm/test_data/sv.tsv @@ -0,0 +1,2 @@ +id audio n_frames prompt tgt_text with_speech +0 SpeechT5/WavLLM/fairseq/examples/wavllm/test_data/audio/sv.wav 351362 Is there only one speaker in the audio clip? Yes True diff --git a/WavLLM/wavllm/tokenizer/tokenizer.model b/WavLLM/wavllm/tokenizer/tokenizer.model new file mode 100644 index 0000000000000000000000000000000000000000..22bccbcb41ec929cf0c9dbe8f41036db82e5e773 GIT binary patch literal 499723 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�@n8 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 F{{wFJg8={l literal 0 HcmV?d00001 diff --git a/YiTrans/.gitignore b/YiTrans/.gitignore new file mode 100644 index 0000000..d9722a3 --- /dev/null +++ b/YiTrans/.gitignore @@ -0,0 +1,2 @@ +**/__pycache__ + diff --git a/YiTrans/exp_scripts/finetune_ASR/finetune_hubert24_mbart24_en.sh b/YiTrans/exp_scripts/finetune_ASR/finetune_hubert24_mbart24_en.sh new file mode 100644 index 0000000..4f6a2d4 --- /dev/null +++ b/YiTrans/exp_scripts/finetune_ASR/finetune_hubert24_mbart24_en.sh @@ -0,0 +1,67 @@ +world_size=$1 +update_freq=$2 +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=8 + +EXP_NAME=train_iwslt_asr_hubert24_mbart24_norel +SAVE_DIR=${HOME}/data/iwslt/asr_v3/${EXP_NAME} + +DATA_ROOT=${HOME}/dataset/iwslt_mustc +LABEL_DIR=${DATA_ROOT}/fine-tune_en_bpe250k +SP_PATH=${LABEL_DIR}/sentence.bpe.model +retain_dict=${LABEL_DIR}/index_en_onlyMUSTC +W2V_PATH=${HOME}/dataset/iwslt_mustc/pretrain_ed_model_cfg.pt + +TRAIN_SUBSET=train_asr_MUSTC +VALID_SUBSET=dev_asr_MUSTC + + +mbart_path="/mnt/default/v-junyiao/released_exsp/mbart50.pretrained/model.pt" +hubert_path="/mnt/default/v-junyiao/speechexp/fairseq_mlst/hubert_large_librivox_released/checkpoint_last.pt" + +CODE_ROOT=${HOME}/code/SpeechT5/YiTrans + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/yitrans_iwslt22/config/finetune_asr \ + --config-name large_mustc \ + common.user_dir=$CODE_ROOT/yitrans_iwslt22 \ + distributed_training.distributed_world_size=$world_size \ + optimization.update_freq=[$update_freq] \ + \ + dataset.max_tokens=400001 \ + dataset.num_workers=0 \ + optimization.max_update=120000 \ + \ + task._name="iwslt_joint_pretraining" \ + task.data=${DATA_ROOT} \ + task.label_dir=${LABEL_DIR} \ + +task.store_labels=True \ + task.hubert_tokenizer="sentencepiece" \ + task.sp_path=${SP_PATH} \ + task.max_keep_size=400000 \ + criterion.dec_weight=0.5 \ + \ + model._name="yitrans_asr" \ + model.w2v_path=${W2V_PATH} \ + +model.reuse_text_emb=true \ + +model.share_ctc_decoder_embed=true \ + +model.retain_dict_path=${retain_dict} \ + model.freeze_finetune_updates=15000 \ + \ + +model.no_pretrained_weights=true \ + +model.use_rel_pos_enc=false \ + +model.encoder_layers=24 \ + +model.add_text_encoder=true \ + +model.share_s2t_t2t_embeddings=false \ + +model.share_enc_dec_embeddings=false \ + +model.add_adaptor=false \ + +model.load_pretrained_w2v_from=$hubert_path \ + +model.load_pretrained_mbart_from=$mbart_path \ + \ + dataset.train_subset=${TRAIN_SUBSET} \ + dataset.valid_subset=${VALID_SUBSET} \ + checkpoint.save_dir=${SAVE_DIR} \ + common.tensorboard_logdir=${SAVE_DIR} \ + hydra.run.dir=${SAVE_DIR} \ + hydra.job.name=${EXP_NAME} + diff --git a/YiTrans/exp_scripts/finetune_MT/finetune_mbart_en-de.sh b/YiTrans/exp_scripts/finetune_MT/finetune_mbart_en-de.sh new file mode 100644 index 0000000..8abce53 --- /dev/null +++ b/YiTrans/exp_scripts/finetune_MT/finetune_mbart_en-de.sh @@ -0,0 +1,75 @@ +##################################### +# Hubert ED model # +##################################### +[ $# -gt 2 ] && echo "Usage: $0 <world_size> <update_freq> [w2v_path] [mbart_path]" && exit 0 +world_size=$1 +update_freq=$2 +w2v_path=$3 +mbart_path=$4 + +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=2 +[ -z $w2v_path ] && w2v_path=${HOME}/dataset/iwslt_mustc/pretrain_ed_model_cfg.pt +[ -z $mbart_path ] && mbart_path="/mnt/default/v-junyiao/released_exsp/mbart50.pretrained/model.pt" +langs=ar_AR,cs_CZ,de_DE,en_XX,es_XX,et_EE,fi_FI,fr_XX,gu_IN,hi_IN,it_IT,ja_XX,kk_KZ,ko_KR,lt_LT,lv_LV,my_MM,ne_NP,nl_XX,ro_RO,ru_RU,si_LK,tr_TR,vi_VN,zh_CN,af_ZA,az_AZ,bn_IN,fa_IR,he_IL,hr_HR,id_ID,ka_GE,km_KH,mk_MK,ml_IN,mn_MN,mr_IN,pl_PL,ps_AF,pt_XX,sv_SE,sw_KE,ta_IN,te_IN,th_TH,tl_XX,uk_UA,ur_PK,xh_ZA,gl_ES,sl_SI + +DATA_DIR=/mnt/default/lozhou/speechdata/mt_data/en-de/com-filter-ende/bin-idx +exp_name=tune_mbart_com_filter_le-4 +SAVE_DIR="${HOME}/data/iwslt/mt_stage1_en-de/$exp_name" +[ -d $SAVE_DIR ] || mkdir -p $SAVE_DIR + +CODE_ROOT=${HOME}/code/SpeechT5/YiTrans + +python $CODE_ROOT/fairseq/fairseq_cli/hydra_train.py \ + --config-dir $CODE_ROOT/yitrans_iwslt22/config/finetune_mt \ + --config-name mt_translation \ + common.user_dir=$CODE_ROOT/yitrans_iwslt22 \ + distributed_training.distributed_world_size=${world_size} \ + optimization.update_freq=[$update_freq] \ + \ + +task.data=$DATA_DIR \ + +task.source_lang="en_XX" +task.target_lang="de_DE" \ + +task.langs=\"$langs\" \ + +task.normalize=false \ + +task.append_source_id=true \ + \ + +model.dropout=0.2 \ + +model.attention_dropout=0.1 \ + model.activation_dropout=0.1 \ + model.decoder_layerdrop=0 \ + model.layerdrop=0 \ + model.freeze_finetune_updates=0 \ + \ + model.w2v_path=$w2v_path \ + +model.no_pretrained_weights=true \ + +model.load_pretrained_mbart_from=$mbart_path \ + +model.share_enc_dec_embeddings=true \ + +model.share_s2t_t2t_embeddings=false \ + +model.use_rel_pos_enc=false \ + \ + dataset.train_subset="train" \ + dataset.valid_subset="valid" \ + dataset.num_workers=4 \ + dataset.max_tokens=2000 \ + \ + optimization.max_epoch=50 \ + optimization.clip_norm=5 \ + optimization.max_update=200000 \ + lr_scheduler.total_num_update=200000 \ + \ + checkpoint.save_interval=1 \ + checkpoint.save_interval_updates=5000 \ + checkpoint.keep_last_epochs=5 \ + checkpoint.keep_best_checkpoints=5 \ + \ + common.seed=222 \ + common.log_interval=100 \ + common.log_format="json" \ + \ + checkpoint.best_checkpoint_metric="accuracy" \ + checkpoint.maximize_best_checkpoint_metric=true \ + common.tensorboard_logdir=$SAVE_DIR \ + checkpoint.save_dir=$SAVE_DIR \ + hydra.run.dir=$SAVE_DIR \ + hydra.job.name=$exp_name + diff --git a/YiTrans/exp_scripts/finetune_ST/en-de/jtst_pt36s2_mustc.sh b/YiTrans/exp_scripts/finetune_ST/en-de/jtst_pt36s2_mustc.sh new file mode 100644 index 0000000..df763ee --- /dev/null +++ b/YiTrans/exp_scripts/finetune_ST/en-de/jtst_pt36s2_mustc.sh @@ -0,0 +1,83 @@ +world_size=$1 +update_freq=$2 +[ -z $world_size ] && world_size=8 +[ -z $update_freq ] && update_freq=4 + +DATA_DIR=/mnt/default/lozhou/speechdata/st_data/en-de/com2-ende-newmt +EXP_NAME="jt_st_mustc_large_stage2_300k_11sets" +SAVE_DIR=/mnt/default/v-ziqzhang/data/iwslt/st_en-de_v4/${EXP_NAME} +retain_dict=/mnt/default/v-junyiao/dataset/iwslt/en-de/released/analyse/index_asr_st_onlyMUSTC +W2V_PATH1=/mnt/default/v-junyiao/speechexp/train_speech_text_joint_addadaptor_bpecode_large_step1_mbartpt_400k/checkpoint_last.pt +W2V_PATH2=/mnt/default/v-junyiao/speechexp/fairseq_mlst/train_speech_text_joint_adaptor_large_step2_300k/checkpoint_last.pt +mkdir -p ${SAVE_DIR} + +FAIRSEQ_ROOT=/mnt/default/v-ziqzhang/code/fairseq_mlst + +python $FAIRSEQ_ROOT/fairseq_cli/train.py ${DATA_DIR} \ + --save-dir ${SAVE_DIR} \ + --user-dir examples/speech_text_joint_to_text \ + --task speech_text_joint_to_text \ + --config-yaml config_step1_39k.yaml \ + --train-subset "train_11set_st_addsrc" \ + --valid-subset "dev_mustc2_en_de_addsrc_st" \ + --fp16 \ + --seed 1 \ + \ + --ddp-backend no_c10d \ + --distributed-world-size ${world_size} \ + --tensorboard-logdir ${SAVE_DIR} \ + \ + --criterion guided_label_smoothed_cross_entropy_with_accuracy \ + --label-smoothing 0.3 \ + --guide-alpha 0.8 \ + --disable-text-guide-update-num 5000 \ + --attentive-cost-regularization 0.02 \ + \ + --optimizer adam \ + --clip-norm 1.0 \ + --lr 5e-05 \ + --lr-scheduler polynomial_decay --warmup-updates 5000 \ + --warmup-updates 5000 \ + --max-update 200000 \ + --total-num-update 200000 \ + --update-freq ${update_freq} \ + \ + --max-tokens 450000 \ + --max-sentences 3 \ + --max-tokens-valid 500000 \ + --max-source-positions 450000 \ + --skip-invalid-size-inputs-valid-test \ + --num-workers 0 \ + --save-interval 1 \ + --log-format json \ + --log-interval 100 \ + --best-checkpoint-metric "acc" \ + --maximize-best-checkpoint-metric \ + \ + --arch "hubert_st2t" \ + --w2v-path ${W2V_PATH1} \ + --load-step2-model-from ${W2V_PATH2} \ + --no-pretrained-weights \ + --add-decoder \ + --reuse-text-emb \ + --layerdrop 0.1 \ + --activation-dropout 0.1 \ + --decoder-layerdrop 0.1 \ + --freeze-finetune-updates 0 \ + --feature-grad-mult 1.0 \ + --retain-dict-path ${retain_dict} \ + --share-decoder-input-output-embed \ + --share-speech-text-embeddings \ + \ + --save-interval-updates 2000 \ + --keep-interval-updates 5 \ + --keep-interval-updates-pattern 10000 \ + --keep-last-epochs 5 \ + \ + 2>&1 | tee ${SAVE_DIR}/train.log + +sleep 5s + + # --lr-scheduler inverse_sqrt \ + # --load-step2-model-from ${W2V_PATH2} \ + # --no-pretrained-weights \ diff --git a/YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step1.sh b/YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step1.sh new file mode 100644 index 0000000..8b7a55a --- /dev/null +++ b/YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step1.sh @@ -0,0 +1,46 @@ +export HYDRA_FULL_ERROR=1 +YiTrans=/home/v-ziqzhang/Code/SpeechT5/YiTrans +DATA_DIR=/mnt/default/lozhou/speechdata/hubert_data +LABEL_DIR=${DATA_DIR}/layer9_k500_label +SP_PATH=${LABEL_DIR}/spm_unigram8000.model +TEXT_DATA_DIR=/mnt/default/lozhou/speechdata/text_data/v3/bin_idx_step1 +EXP_NAME=pretrain_pt36_addadaptor_bpecode_large_step1 +SAVE_DIR=${HOME}/data/speechexp/${EXP_NAME} +W2V_PATH=${HOME}/data/speechexp/hubert_large_librivox_released/checkpoint_last.pt +MBART_PATH=${HOME}/data/speechexp/mbart50.pretrained/model.pt + +python ${YiTrans}/fairseq/fairseq_cli/hydra_train.py \ + --config-dir ${YiTrans}/yitrans_iwslt22/config/pretrain \ + --config-name joint_large \ + common.user_dir=${YiTrans}/yitrans_iwslt22 \ + \ + task.data=$DATA_DIR \ + task.labels='["km"]' \ + task.label_dir=$LABEL_DIR \ + task.text_cfg.text_data=$TEXT_DATA_DIR \ + +task.hubert_tokenizer="sentencepiece" \ + +task.sp_path=${SP_PATH} \ + \ + model.label_rate=50 \ + model.encoder_layers=12 \ + +model.load_pretrained_w2v_from=${W2V_PATH} \ + +model.load_pretrained_mbart_from=${MBART_PATH} \ + \ + dataset.train_subset=\"train_LS,train_MUSTC+mono_deduped_filt_sort.en_XX.en_XX,mt8corpus_filt_slct.en_XX-de_DE\" \ + dataset.valid_subset=\"dev_MUSTC+valid.en_XX-de_DE,dev_MUSTC+valid.en_XX-ja_XX,dev_MUSTC+valid.en_XX-zh_CN,dev_MUSTC+dev4x.en_XX.en_XX\" \ + dataset.max_tokens=300000 \ + \ + distributed_training.distributed_world_size=8 \ + distributed_training.nprocs_per_node=8 \ + optimization.update_freq=[2] \ + \ + common.tensorboard_logdir=$SAVE_DIR \ + checkpoint.save_dir=$SAVE_DIR \ + hydra.run.dir=$SAVE_DIR \ + hydra.job.name=$EXP_NAME \ + checkpoint.reset_optimizer=true \ + checkpoint.reset_dataloader=true + + + + # dataset.train_subset=\"train_CV,train_EUR,train_LS,train_MUSTC,train_TEDLIUM,train_VP+mono_deduped_filt_sort.en_XX.en_XX,mt8corpus_filt_slct.en_XX-de_DE,mt8corpus_filt_slct.en_XX-ja_XX,mt8corpus_filt_slct.en_XX-zh_CN\" \ diff --git a/YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step2.sh b/YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step2.sh new file mode 100644 index 0000000..756b93a --- /dev/null +++ b/YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step2.sh @@ -0,0 +1,45 @@ +EXP_NAME=train_speech_text_joint_adaptor_large_step2_300k +SAVE_DIR=/datablob/users/v-junyiao/speechexp/fairseq_mlst/${EXP_NAME} +DATA_ROOT=/datablob/users/v-junyiao/speechdata/hubert_mlst +LABEL_DIR=${DATA_ROOT}/fine-tune_en_bpe250k_full +W2V_PATH=/mnt/default/v-junyiao/speechexp/train_speech_text_joint_addadaptor_bpecode_large_step1_mbartpt_400k/checkpoint_last_up.pt +TEXT_DATA_DIR=/datablob/users/v-junyiao/speechdata/text_data/v4/bin-idx +SP_PATH=${LABEL_DIR}/sentence.bpe.model +# export CUDA_VISIBLE_DEVICES=1 +python fairseq_cli/hydra_train.py \ + --config-dir examples/hubert/config/pretrain \ + --config-name pretrain_step2 \ + distributed_training.distributed_world_size=64 \ + distributed_training.nprocs_per_node=8 \ + \ + dataset.train_subset=\"train_COVOST,train_asr_VP,train_punc_TEDLIUM,train_asr_MUSTC,train_punc_LS,train_asr_EUR+covost2.en_XX-ja_XX,covost2.en_XX-zh_CN,covost_eurST.en_XX-de_DE,mt8corpus_domain45.en_XX-ja_XX,mt8corpus_filt_slct80_domain44.en_XX-de_DE,mt8corpus_filt_slct80_domain40.en_XX-zh_CN,train.en_XX-de_DE,train.en_XX-ja_XX,train.en_XX-zh_CN\" \ + dataset.valid_subset=\"dev_asr_MUSTC+valid.en_XX-de_DE,dev_asr_MUSTC+valid.en_XX-ja_XX,dev_asr_MUSTC+valid.en_XX-zh_CN\" \ + dataset.max_tokens=480001 \ + dataset.num_workers=0 \ + optimization.update_freq=[1] \ + optimization.max_update=300000 \ + \ + task.hubert_tokenizer="sentencepiece" \ + task.sp_path=${SP_PATH} \ + task.max_keep_size=480000 \ + +task.split_modality_batch=true \ + +task.speech_tgt_lang="en_XX" \ + +task.mbart_style_lang_id=true \ + +task.text_sampling_alpha=1.0 \ + +task.store_labels=true \ + model.freeze_finetune_updates=15000 \ + criterion.dec_weight=0.5 \ + +model.reuse_text_emb=true \ + +model.share_ctc_decoder_embed=true \ + +model.share_speech_text_embeddings=true \ + \ + task.data=${DATA_ROOT} \ + task.label_dir=${LABEL_DIR} \ + task.text_cfg.text_data=${TEXT_DATA_DIR} \ + model.w2v_path=${W2V_PATH} \ + checkpoint.save_dir=${SAVE_DIR} \ + common.tensorboard_logdir=${SAVE_DIR} \ + hydra.run.dir=${SAVE_DIR} \ + hydra.job.name=${EXP_NAME} + +sleep infinity diff --git a/YiTrans/readme.md b/YiTrans/readme.md new file mode 100644 index 0000000..ea957c4 --- /dev/null +++ b/YiTrans/readme.md @@ -0,0 +1,98 @@ +# YiTrans@IWSLT22 + +> [**YiTrans**](https://arxiv.org/abs/2206.05777) (```IWSLT 2022```): **The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task** +> Code is being merged to this repository, thanks for your attention + +## Setup +```bash +git clone https://github.com/microsoft/SpeechT5.git +git submodule update --init YiTrans/fairseq +cd YiTrans/fairseq +pip install -e . +``` + +## Data Preparation +### Speech/ASR data for pre-training +Please follow the steps of data preparation for HuBERT in [here](https://github.com/facebookresearch/fairseq/tree/main/examples/hubert#data-preparation). +### Monolingual text data for pre-training +Please follow the steps of data preparation for mBART in [here](https://github.com/facebookresearch/fairseq/tree/main/examples/mbart). We reuse the multilingual vocabulary. +After getting your subset.{idx,bin} files ready, renaming them as subset.lang.lang.{idx,bin}, e.g. +``` +mono_deduped_filt_sort.en_XX.en_XX.bin +mono_deduped_filt_sort.en_XX.en_XX.idx +``` +### Bilingual text data for pre-training +The same way of preparing monolingual data with only the difference that you should prepare for both the source language and the target languages. Renaming them as subset.src-tgt.{src,tgt}.{idx,bin}, e.g. +``` +mt8corpus_filt_slct.en_XX-de_DE.de_DE.bin +mt8corpus_filt_slct.en_XX-de_DE.de_DE.idx +mt8corpus_filt_slct.en_XX-de_DE.en_XX.bin +mt8corpus_filt_slct.en_XX-de_DE.en_XX.idx +``` + +### ST data for fine-tuning +Please follow the steps of data preparation for S2T tasks [here](https://github.com/pytorch/fairseq/blob/main/examples/speech_to_text/docs/mustc_example.md). Your tsv file should be like this: +``` +id audio n_frames tgt_text speaker src_text src_lang tgt_lang +ted_1_0 /mnt/speechdata/MUSTC/en-de/flac/ted_1_0.flac 25920 Hinter mir war gar keine Autokolonne. spk.1 There was no motorcade back there. en_XX de_DE +ted_1_1 /mnt/speechdata/MUSTC/en-de/flac/ted_1_1.flac 219359 Haben Sie schon mal vom Phantomschmerz gehört? (Lachen) Wir saßen in einem gemieteten Ford Taurus. spk.1 (Laughter) You've heard of phantom limb pain? (Laughter) en_XX de_DE +ted_1_2 /mnt/speechdata/MUSTC/en-de/flac/ted_1_2.flac 71360 Es war Zeit zum Abendessen und wir hielten Ausschau nach einem Restaurant. spk.1 It was dinnertime, and we started looking for a place to eat. en_XX de_DE +``` + + + +## Pre-train +For example of pre-training the PT36 model, please follow these steps: + +Step 0: Download the released [Hubert model](https://dl.fbaipublicfiles.com/hubert/hubert_large_ll60k.pt) and [mBART model](https://dl.fbaipublicfiles.com/fairseq/models/mbart50/mbart50.pretrained.tar.gz) model. + +Step 1: Pre-training with unlabeled speech data and monolingual/bilingual text data +```bash +bash YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step1.sh +``` + +Step 2: Pre-training with ASR dat and domain-filtered bilingual text data +```bash +bash YiTrans/exp_scripts/pretrain/pretrain_pt36_adaptor_step2.sh +``` +Other configurations like training PT48 can also be fould in ./YiTrans/exp_scripts/pretrain, you might need to modify the PATH variables in .sh files to adjust your data. + +## Fine-tune +For example of pre-training En-De ST model on MuST-C dataset, +```bash +bash YiTrans/exp_scripts/finetune_ST/en-de/jtst_pt36s2_mustc.sh +``` +Other configurations like different translation directions or datasets could be found in ./YiTrans/exp_scripts/finetune_ST, you might need to modify the PATH variables in .sh files to adjust your data. + +## Cascaded system +You can also build a cascaded ST system (ASR+MT) with our codebase. +1. ASR model: fine-tune from the cascade of [Hubert Large](https://dl.fbaipublicfiles.com/hubert/hubert_large_ll60k.pt) and [mBART model](https://dl.fbaipublicfiles.com/fairseq/models/mbart50/mbart50.pretrained.tar.gz): + ```bash + # change the mbart_path/hubert_path to your own in the *.sh + bash YiTrans/exp_scripts/finetune_ASR/finetune_hubert24_mbart24_en.sh + ``` + Check the [`.sh`](exp_scripts/finetune_ASR/finetune_hubert24_mbart24_en.sh) file for more information about the configuration. + +2. MT model: fine-tune from [mBART model](https://dl.fbaipublicfiles.com/fairseq/models/mbart50/mbart50.pretrained.tar.gz): + + ```bash + # change the mbart_path to your own in the *.sh + bash YiTrans/exp_scripts/finetune_MT/finetune_mbart_en-de.sh + ``` + Check the [`.sh`](exp_scripts/finetune_MT/finetune_mbart_en-de.sh) file for more information about the configuration. + + +## Reference + +If you find our work is useful in your research, please cite the following paper: + +```bibtex +@article{Zhang2022Yitrans, + title = {The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task}, + author = {Zhang, Ziqiang and Ao, Junyi and Zhou, Long and Liu, Shujie and Wei, Furu and Li, Jinyu}, + eprint={2206.05777}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + year={2022} +} +``` diff --git a/YiTrans/yitrans_iwslt22/__init__.py b/YiTrans/yitrans_iwslt22/__init__.py new file mode 100644 index 0000000..97327d2 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/__init__.py @@ -0,0 +1 @@ +from . import data, tasks, criterions, models diff --git a/YiTrans/yitrans_iwslt22/config/finetune_asr/large_mustc.yaml b/YiTrans/yitrans_iwslt22/config/finetune_asr/large_mustc.yaml new file mode 100644 index 0000000..ce9052e --- /dev/null +++ b/YiTrans/yitrans_iwslt22/config/finetune_asr/large_mustc.yaml @@ -0,0 +1,103 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + no_epoch_checkpoints: false + best_checkpoint_metric: dec_accuracy + restore_file: checkpoint_last.pt + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: 1 + distributed_port: -1 + nprocs_per_node: 8 + +task: + _name: iwslt_joint_pretraining + data: ??? + fine_tuning: true + label_dir: ??? + normalize: true # must be consistent with pre-training + labels: ["ltr"] + single_target: true + add_decoder: true + pad_audio: true + random_crop: false + max_keep_size: 480000 + hubert_tokenizer: "none" + sp_path: None + +dataset: + num_workers: 6 + max_tokens: 1280000 + skip_invalid_size_inputs_valid_test: true + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +criterion: + _name: ctc_ce + zero_infinity: true + dec_weight: 1.0 + +optimization: + max_update: 80000 + lr: [0.00003] + sentence_avg: true + update_freq: [1] + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-08 + weight_decay: 0.0 + +lr_scheduler: + _name: tri_stage + phase_ratio: [0.1, 0.4, 0.5] + final_lr_scale: 0.05 + +model: + _name: yitrans_asr + w2v_path: ??? + apply_mask: true + mask_prob: 0.5 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + decoder_layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + add_decoder: true + share_decoder_input_output_embed: true + + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + - criterion.wer_kenlm_model + - criterion.wer_lexicon + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/YiTrans/yitrans_iwslt22/config/finetune_mt/mt_translation.yaml b/YiTrans/yitrans_iwslt22/config/finetune_mt/mt_translation.yaml new file mode 100644 index 0000000..b0d02d4 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/config/finetune_mt/mt_translation.yaml @@ -0,0 +1,89 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + tensorboard_logdir: tblog + seed: 1337 + +checkpoint: + save_interval: 1000000 + keep_last_epochs: 5 + save_interval_updates: 10000 + keep_interval_updates_pattern: 20000 + keep_interval_updates: 5 + keep_best_checkpoints: 5 + best_checkpoint_metric: accuracy + maximize_best_checkpoint_metric: true + +distributed_training: + ddp_backend: legacy_ddp + find_unused_parameters: true + distributed_world_size: -1 + nprocs_per_node: 8 + + +criterion: + _name: "label_smoothed_cross_entropy" + label_smoothing: 0.2 + report_accuracy: true + + +task: + _name: "iwslt_translation_from_pretrained" + +dataset: + num_workers: 6 + max_tokens: 3200000 + skip_invalid_size_inputs_valid_test: true + validate_after_updates: ${model.freeze_finetune_updates} + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + train_subset: train_100 + valid_subset: dev_other + required_batch_size_multiple: 1 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.0 + +lr_scheduler: + lr: [0.0001] + _name: polynomial_decay + warmup_updates: 5000 + total_num_update: 200000 + +model: + _name: finetune_mt + w2v_path: ??? + apply_mask: true + mask_prob: 0.65 + mask_channel_prob: 0.5 + mask_channel_length: 64 + layerdrop: 0.1 + decoder_layerdrop: 0.1 + activation_dropout: 0.1 + feature_grad_mult: 0.0 + freeze_finetune_updates: 0 + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + - model.w2v_path + - dataset.train_subset + - dataset.valid_subset + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/YiTrans/yitrans_iwslt22/config/pretrain/joint_base.yaml b/YiTrans/yitrans_iwslt22/config/pretrain/joint_base.yaml new file mode 100644 index 0000000..deb7cda --- /dev/null +++ b/YiTrans/yitrans_iwslt22/config/pretrain/joint_base.yaml @@ -0,0 +1,134 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 1 + keep_last_epochs: 1 + save_interval_updates: 5000 + keep_interval_updates: -1 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 32 + distributed_port: 29671 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: iwslt_joint_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: false # must be consistent with extractor + add_decoder: false + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 512 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.0 + + +dataset: + num_workers: 6 + max_tokens: 1400000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: hubert + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.1 + +optimization: + max_update: 800000 + lr: [0.0001] + clip_norm: 10.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: hubert + label_rate: ??? + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: default + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + final_dim: 256 + encoder_layerdrop: 0.05 + decoder_layerdrop: 0.05 + dropout_input: 0.1 + dropout_features: 0.1 + dropout: 0.1 + attention_dropout: 0.1 + feature_grad_mult: 0.1 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + adaptive_input: ${model.adaptive_input} + max_source_positions: ${task.text_cfg.tokens_per_sample} + checkpoint_activations: ${model.checkpoint_activations} + no_scale_embedding: false + layernorm_embedding: false + quant_noise: + pq: ${model.quant_noise_pq} + encoder: + embed_dim: 768 + ffn_embed_dim: 3072 + layers: 6 + attention_heads: 12 + normalize_before: false + learned_pos: false + layerdrop: ${model.encoder_layerdrop} + + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/YiTrans/yitrans_iwslt22/config/pretrain/joint_large.yaml b/YiTrans/yitrans_iwslt22/config/pretrain/joint_large.yaml new file mode 100644 index 0000000..dbacae9 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/config/pretrain/joint_large.yaml @@ -0,0 +1,159 @@ +# @package _group_ + +common: + fp16: true + log_format: json + log_interval: 200 + seed: 1337 + tensorboard_logdir: tblog + +checkpoint: + save_dir: ??? + save_interval: 1 + keep_last_epochs: 10 + save_interval_updates: 10000 + keep_interval_updates: -1 + # no_epoch_checkpoints: true + +distributed_training: + ddp_backend: no_c10d + distributed_backend: 'nccl' + distributed_world_size: 32 + distributed_port: 29671 + nprocs_per_node: 8 + find_unused_parameters: true + +task: + _name: iwslt_joint_pretraining + data: ??? + label_dir: ??? + labels: ??? + label_rate: ${model.label_rate} + sample_rate: 16000 + max_sample_size: 250000 + min_sample_size: 32000 + pad_audio: false + random_crop: true + normalize: true # must be consistent with extractor + add_decoder: true + split_modality_batch: true + store_labels: true + text_cfg: + seed: ${common.seed} + text_data: ??? + data_config: config.yaml + sample_break_mode: eos + tokens_per_sample: 1024 + shorten_method: "random_crop" + text_maxtokens_ratio: 1.0 + mask_whole_words: true + +dataset: + num_workers: 4 + max_tokens: 900000 + skip_invalid_size_inputs_valid_test: true + validate_interval: ${checkpoint.save_interval} + validate_interval_updates: ${checkpoint.save_interval_updates} + required_batch_size_multiple: 1 + +criterion: + _name: joint_step1_split_batch + pred_masked_weight: 1.0 + pred_nomask_weight: 0.0 + loss_weights: [10,] + label_smoothing: 0.02 + +optimization: + max_update: 400000 + lr: [0.00003] + clip_norm: 1.0 + +optimizer: + _name: adam + adam_betas: (0.9,0.98) + adam_eps: 1e-06 + weight_decay: 0.01 + +lr_scheduler: + _name: polynomial_decay + warmup_updates: 32000 + +model: + _name: joint_ed + label_rate: ??? + encoder_layers: 24 + encoder_embed_dim: 1024 + encoder_ffn_embed_dim: 4096 + encoder_attention_heads: 16 + final_dim: 768 + skip_masked: false + skip_nomask: false + mask_prob: 0.80 + extractor_mode: layer_norm + conv_feature_layers: '[(512,10,5)] + [(512,3,2)] * 4 + [(512,2,2)] * 2' + encoder_layerdrop: 0.0 + dropout_input: 0.0 + dropout_features: 0.0 + dropout: 0.0 + attention_dropout: 0.0 + layer_norm_first: true + feature_grad_mult: 1.0 + untie_final_proj: true + activation_dropout: 0.0 + use_rel_pos_enc: true + decoder_layers: 12 + decoder_embed_dim: 1024 + decoder_ffn_embed_dim: 4096 + decoder_attention_heads: 16 + decoder_output_dim: 1024 + decoder_normalize_before: true + layernorm_embedding: true + decoder_learned_pos: true + share_decoder_input_output_embed: true + share_enc_dec_embeddings: true + max_target_positions: 1024 + activation_fn: "gelu" + adaptive_input: false + checkpoint_activations: false + quant_noise_pq: 0 + add_text_modality: true + add_text_encoder: true + add_adaptor: true + + text_transformer: + activation_fn: ${model.activation_fn} + dropout: ${model.dropout} + attention_dropout: ${model.attention_dropout} + activation_dropout: ${model.activation_dropout} + adaptive_input: ${model.adaptive_input} + max_source_positions: ${task.text_cfg.tokens_per_sample} + checkpoint_activations: ${model.checkpoint_activations} + no_scale_embedding: false + layernorm_embedding: true + quant_noise: + pq: ${model.quant_noise_pq} + encoder: + embed_dim: 1024 + ffn_embed_dim: 4096 + layers: 12 + attention_heads: 16 + normalize_before: true + learned_pos: true + layerdrop: ${model.encoder_layerdrop} + + +hydra: + job: + config: + override_dirname: + kv_sep: '-' + item_sep: '__' + exclude_keys: + - run + - task.data + - task.label_dir + run: + dir: ??? + sweep: + dir: ??? + subdir: ${hydra.job.config_name}__${hydra.job.override_dirname} diff --git a/YiTrans/yitrans_iwslt22/criterions/__init__.py b/YiTrans/yitrans_iwslt22/criterions/__init__.py new file mode 100644 index 0000000..bb26035 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/criterions/__init__.py @@ -0,0 +1,9 @@ +import importlib +import os + +for file in os.listdir(os.path.dirname(__file__)): + if file.endswith(".py") and not file.startswith("_"): + criterion_name = file[: file.find(".py")] + importlib.import_module( + "yitrans_iwslt22.criterions." + criterion_name + ) diff --git a/YiTrans/yitrans_iwslt22/criterions/ctc_ce.py b/YiTrans/yitrans_iwslt22/criterions/ctc_ce.py new file mode 100644 index 0000000..40fab26 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/criterions/ctc_ce.py @@ -0,0 +1,414 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import math +from argparse import Namespace +from dataclasses import dataclass, field +from omegaconf import II +from typing import Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass +from fairseq.data.data_utils import post_process +from fairseq.tasks import FairseqTask +from fairseq.logging.meters import safe_round + + +@dataclass +class CtcCeCriterionConfig(FairseqDataclass): + zero_infinity: bool = field( + default=False, + metadata={"help": "zero inf loss when source length <= target length"}, + ) + sentence_avg: bool = II("optimization.sentence_avg") + post_process: str = field( + default="letter", + metadata={ + "help": "how to post process predictions into words. can be letter, " + "wordpiece, BPE symbols, etc. " + "See fairseq.data.data_utils.post_process() for full list of options" + }, + ) + wer_kenlm_model: Optional[str] = field( + default=None, + metadata={ + "help": "if this is provided, use kenlm to compute wer (along with other wer_* args)" + }, + ) + wer_lexicon: Optional[str] = field( + default=None, + metadata={"help": "lexicon to use with wer_kenlm_model"}, + ) + wer_lm_weight: float = field( + default=2.0, + metadata={"help": "lm weight to use with wer_kenlm_model"}, + ) + wer_word_score: float = field( + default=-1.0, + metadata={"help": "lm word score to use with wer_kenlm_model"}, + ) + + wer_args: Optional[str] = field( + default=None, + metadata={ + "help": "DEPRECATED: tuple of (wer_kenlm_model, wer_lexicon, wer_lm_weight, wer_word_score)" + }, + ) + + dec_weight: float = field( + default=0.5, + metadata={"help": "weights for decoder CE Loss, loss will be ((1 - dec_weight) * hubert_loss + dec_weight * CE_Loss)"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.1, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + + +@register_criterion("ctc_ce", dataclass=CtcCeCriterionConfig) +class CtcCeCriterion(FairseqCriterion): + def __init__(self, cfg: CtcCeCriterionConfig, task: FairseqTask): + super().__init__(task) + self.blank_idx = ( + task.target_dictionary.index(task.blank_symbol) + if hasattr(task, "blank_symbol") + else 0 + ) + self.pad_idx = task.target_dictionary.pad() + self.eos_idx = task.target_dictionary.eos() + self.post_process = cfg.post_process + + if cfg.wer_args is not None: + ( + cfg.wer_kenlm_model, + cfg.wer_lexicon, + cfg.wer_lm_weight, + cfg.wer_word_score, + ) = eval(cfg.wer_args) + + if cfg.wer_kenlm_model is not None: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + dec_args = Namespace() + dec_args.nbest = 1 + dec_args.criterion = "ctc" + dec_args.kenlm_model = cfg.wer_kenlm_model + dec_args.lexicon = cfg.wer_lexicon + dec_args.beam = 50 + dec_args.beam_size_token = min(50, len(task.target_dictionary)) + dec_args.beam_threshold = min(50, len(task.target_dictionary)) + dec_args.lm_weight = cfg.wer_lm_weight + dec_args.word_score = cfg.wer_word_score + dec_args.unk_weight = -math.inf + dec_args.sil_weight = 0 + + self.w2l_decoder = W2lKenLMDecoder(dec_args, task.target_dictionary) + else: + self.w2l_decoder = None + + self.zero_infinity = cfg.zero_infinity + self.sentence_avg = cfg.sentence_avg + + self.dec_weight = cfg.dec_weight + self.report_accuracy = cfg.report_accuracy + self.ignore_prefix_size = cfg.ignore_prefix_size + self.eps = cfg.label_smoothing + + def forward(self, model, sample, reduce=True): + net_output = model(**sample["net_input"]) + lprobs = model.get_normalized_probs( + net_output, log_probs=True + ).contiguous() # (T, B, C) from the encoder + + if "src_lengths" in sample["net_input"]: + input_lengths = sample["net_input"]["src_lengths"] + else: + if net_output["padding_mask"] is not None: + non_padding_mask = ~net_output["padding_mask"] + input_lengths = non_padding_mask.long().sum(-1) + else: + input_lengths = lprobs.new_full( + (lprobs.size(1),), lprobs.size(0), dtype=torch.long + ) + + pad_mask = (sample["target"] != self.pad_idx) & ( + sample["target"] != self.eos_idx + ) + targets_flat = sample["target"].masked_select(pad_mask) + if "target_lengths" in sample: + target_lengths = sample["target_lengths"] + else: + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction="sum", + zero_infinity=self.zero_infinity, + ) + + ntokens = ( + sample["ntokens"] if "ntokens" in sample else target_lengths.sum().item() + ) + + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + + logging_output = {} + if "decoder_target" in sample: + if net_output["decoder_out"] is not None: + dec_sample_size = sample["target"].size(0) if self.sentence_avg else sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + else: + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + logging_output["dec_loss"] = 0 + logging_output["dec_nll_loss"] = 0 + logging_output["dec_sample_size"] = 1 + if self.report_accuracy: + logging_output["dec_n_correct"] = 0 + logging_output["total"] = 1 + + logging_output = { + "loss": utils.item(loss.data), # * sample['ntokens'], + "ntokens": ntokens, + "nsentences": sample["id"].numel(), + "sample_size": sample_size, + **logging_output, + } + + if not model.training and self.dec_weight < 1.0: + import editdistance + + with torch.no_grad(): + lprobs_t = lprobs.transpose(0, 1).float().contiguous().cpu() + + c_err = 0 + c_len = 0 + w_errs = 0 + w_len = 0 + wv_errs = 0 + for lp, t, inp_l in zip( + lprobs_t, + sample["target_label"] + if "target_label" in sample + else sample["target"], + input_lengths, + ): + lp = lp[:inp_l].unsqueeze(0) + + decoded = None + if self.w2l_decoder is not None: + decoded = self.w2l_decoder.decode(lp) + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + + p = (t != self.task.target_dictionary.pad()) & ( + t != self.task.target_dictionary.eos() + ) + targ = t[p] + targ_units = self.task.target_dictionary.string(targ) + targ_units_arr = targ.tolist() + + toks = lp.argmax(dim=-1).unique_consecutive() + pred_units_arr = toks[toks != self.blank_idx].tolist() + + c_err += editdistance.eval(pred_units_arr, targ_units_arr) + c_len += len(targ_units_arr) + + targ_words = post_process(targ_units, self.post_process).split() + + pred_units = self.task.target_dictionary.string(pred_units_arr) + pred_words_raw = post_process(pred_units, self.post_process).split() + + if decoded is not None and "words" in decoded: + pred_words = decoded["words"] + w_errs += editdistance.eval(pred_words, targ_words) + wv_errs += editdistance.eval(pred_words_raw, targ_words) + else: + dist = editdistance.eval(pred_words_raw, targ_words) + w_errs += dist + wv_errs += dist + + w_len += len(targ_words) + + logging_output["wv_errors"] = wv_errs + logging_output["w_errors"] = w_errs + logging_output["w_total"] = w_len + logging_output["c_errors"] = c_err + logging_output["c_total"] = c_len + + return loss, sample_size, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.pad_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.pad_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + c_errors = sum(log.get("c_errors", 0) for log in logging_outputs) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in logging_outputs) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in logging_outputs) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in logging_outputs) + metrics.log_scalar("_w_total", w_total) + + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + if "dec_loss" in logging_outputs[0]: + ctc_loss_sum = sum(log.get("ctc_loss", 0) for log in logging_outputs) + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "ctc_loss", ctc_loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return True diff --git a/YiTrans/yitrans_iwslt22/criterions/joint_step1_criterion.py b/YiTrans/yitrans_iwslt22/criterions/joint_step1_criterion.py new file mode 100644 index 0000000..2398de1 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/criterions/joint_step1_criterion.py @@ -0,0 +1,366 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass + +logger = logging.getLogger(__name__) +@dataclass +class JointCriterionConfig(FairseqDataclass): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + dec_weight: float = field( + default=1.0, + metadata={"help": "weights for decoder CE Loss, loss will be (hubert_loss + dec_weight * CE_Loss)"}, + ) + text_weight: float = field( + default=1.0, + metadata={"help": "weights for text ED CE Loss, loss will be (hubert_loss + dec_weight * CE_Loss + text_weight * CE_Loss)"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + + +@register_criterion("joint_step1", dataclass=JointCriterionConfig) +class JointCriterion(FairseqCriterion): + def __init__( + self, + task, + pred_masked_weight, + pred_nomask_weight, + loss_weights=None, + log_keys=None, + dec_weight=1.0, + text_weight=1.0, + report_accuracy=False, + ignore_prefix_size=0, + label_smoothing=0.0 + ): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.dec_weight = dec_weight + self.text_weight = text_weight + self.report_accuracy = report_accuracy + self.ignore_prefix_size = ignore_prefix_size + self.eps = label_smoothing + self.padding_idx = task.dictionaries[0].pad() + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + + if "speech" in sample.keys(): + text_type = [name for name in sample.keys() if name.startswith("text")] + assert len(text_type) == 1 + text_type = text_type[0] + text_sample = sample[text_type] + sample = sample["speech"] + else: + text_sample = None + + sample["modality"] = "speech" + ### 1. do hubert forward and loss computation + net_output = model(target_list=sample["target_list"], **sample["net_input"]) + loss = 0.0 + sample_size = 0 + logging_output = {} + reduction = "sum" if reduce else "none" + + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_{i}"] = loss_m.detach().item() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_{i}"] = loss_u.detach().item() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len( + self.loss_weights + ), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() + + if "decoder_target" in sample: + dec_sample_size = sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + loss = loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + + if text_sample is not None: + ### 2. do text forward and loss computation + text_sample["modality"] = "text" + text_net_output = model(**text_sample["net_input"]) + text_dec_loss, text_dec_nll_loss = self.compute_ce_loss(model, text_net_output["decoder_out"], text_sample, reduce=reduce) + text_sample_size = text_sample["ntokens"] + loss = loss + (self.text_weight * text_dec_loss * sample_size / text_sample_size) + logging_output["text_dec_loss"] = text_dec_loss.item() + logging_output["text_dec_nll_loss"] = text_dec_nll_loss.item() + logging_output["text_sample_size"] = text_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, text_net_output["decoder_out"], text_sample) + logging_output["text_dec_n_correct"] = utils.item(n_correct.data) + logging_output["text_total"] = utils.item(total.data) + + logging_output = { + "loss": loss.item() if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["id"].numel() + (text_sample["id"].numel() if text_sample is not None else 0), + "sample_size": sample_size, + **logging_output, + } + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + def compute_correct(logits): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == 0 + min = logits.argmin(-1) == 0 + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + corr_m, count_m = compute_correct(logp_m) + logging_output[f"correct_m_{i}"] = corr_m + logging_output[f"count_m_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + corr_u, count_u = compute_correct(logp_u) + logging_output[f"correct_u_{i}"] = corr_u + logging_output[f"count_u_{i}"] = count_u + + return loss, sample_size, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + if sample["modality"] == "speech": + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + else: + target = sample["target"] + + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg) + ) + else: + metrics.log_derived( + "ppl", lambda meters: utils.get_perplexity(meters["loss"].avg) + ) + + counts = {} + for lk in logging_outputs[0].keys(): + if lk.startswith("count_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in logging_outputs[0].keys(): + if lk.startswith("loss_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log[lk] for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + if "dec_loss" in logging_outputs[0]: + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + if "text_dec_loss" in logging_outputs[0]: + text_dec_loss_sum = sum(log.get("text_dec_loss", 0) for log in logging_outputs) + text_dec_nll_loss_sum = sum(log.get("text_dec_nll_loss", 0) for log in logging_outputs) + text_sample_size = sum(log.get("text_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "text_dec_loss", text_dec_loss_sum / text_sample_size / math.log(2), text_sample_size, round=3 + ) + metrics.log_scalar( + "text_dec_nll_loss", text_dec_nll_loss_sum / text_sample_size / math.log(2), text_sample_size, round=3 + ) + metrics.log_derived( + "text_dec_ppl", lambda meters: utils.get_perplexity(meters["text_dec_nll_loss"].avg) + ) + text_total = utils.item(sum(log.get("text_total", 0) for log in logging_outputs)) + if text_total > 0: + metrics.log_scalar("text_total", text_total) + text_n_correct = utils.item( + sum(log.get("text_dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("text_dec_n_correct", text_n_correct) + metrics.log_derived( + "text_dec_accuracy", + lambda meters: round( + meters["text_dec_n_correct"].sum * 100.0 / meters["text_total"].sum, 3 + ) + if meters["text_total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/YiTrans/yitrans_iwslt22/criterions/joint_step1_split_batch_criterion.py b/YiTrans/yitrans_iwslt22/criterions/joint_step1_split_batch_criterion.py new file mode 100644 index 0000000..8d603e0 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/criterions/joint_step1_split_batch_criterion.py @@ -0,0 +1,370 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import math +import re +from dataclasses import dataclass, field +from typing import List, Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.dataclass import FairseqDataclass + +logger = logging.getLogger(__name__) +@dataclass +class JointCriterionConfig(FairseqDataclass): + pred_masked_weight: float = field( + default=1.0, + metadata={"help": "weight for predictive loss for masked frames"}, + ) + pred_nomask_weight: float = field( + default=0.0, + metadata={"help": "weight for predictive loss for unmasked frames"}, + ) + loss_weights: Optional[List[float]] = field( + default=None, + metadata={"help": "weights for additional loss terms (not first one)"}, + ) + log_keys: List[str] = field( + default_factory=lambda: [], + metadata={"help": "output keys to log"}, + ) + dec_weight: float = field( + default=1.0, + metadata={"help": "weights for decoder CE Loss, loss will be (hubert_loss + dec_weight * CE_Loss)"}, + ) + text_weight: float = field( + default=1.0, + metadata={"help": "weights for text ED CE Loss, loss will be (hubert_loss + dec_weight * CE_Loss + text_weight * CE_Loss)"}, + ) + report_accuracy: bool = field( + default=True, + metadata={"help": "report decoder accuracy metric"}, + ) + ignore_prefix_size: int = field( + default=0, + metadata={"help": "Ignore first N tokens"}, + ) + label_smoothing: float = field( + default=0.0, + metadata={"help": "epsilon for label smoothing, 0 means no label smoothing"}, + ) + + +@register_criterion("joint_step1_split_batch", dataclass=JointCriterionConfig) +class JointSplitCriterion(FairseqCriterion): + def __init__( + self, + task, + pred_masked_weight, + pred_nomask_weight, + loss_weights=None, + log_keys=None, + dec_weight=1.0, + text_weight=1.0, + report_accuracy=False, + ignore_prefix_size=0, + label_smoothing=0.0 + ): + super().__init__(task) + self.pred_masked_weight = pred_masked_weight + self.pred_nomask_weight = pred_nomask_weight + self.loss_weights = loss_weights + self.log_keys = [] if log_keys is None else log_keys + self.dec_weight = dec_weight + self.text_weight = text_weight + self.report_accuracy = report_accuracy + self.ignore_prefix_size = ignore_prefix_size + self.eps = label_smoothing + self.padding_idx = task.dictionaries[0].pad() + self.text_dict = task.text_dictionary + + def forward(self, model, sample, reduce=True, log_pred=False): + """Compute the loss for the given sample. + Returns a tuple with three elements: + 1) the loss + 2) the sample size, which is used as the denominator for the gradient + 3) logging outputs to display while training + """ + text_type = [name for name in sample.keys() if name.startswith("text")] + loss = 0. + sample_size = 0 + logging_output = {} + reduction = "sum" if reduce else "none" + + if "speech" in sample.keys(): + assert len(text_type) == 0 + sample = sample["speech"] + sample["modality"] = "speech" + + ### 1. do hubert forward and loss computation + net_output = model(target_list=sample["target_list"], **sample["net_input"]) + loss_m_list = [] + logp_m_list = model.get_logits(net_output, True) + targ_m_list = model.get_targets(net_output, True) + assert self.pred_masked_weight == 0 or len(logp_m_list) > 0 + for i, (logp_m, targ_m) in enumerate(zip(logp_m_list, targ_m_list)): + loss_m = F.cross_entropy(logp_m, targ_m, reduction=reduction) + loss_m_list.append(loss_m) + logging_output[f"loss_m_{i}"] = loss_m.detach().item() / targ_m_list[0].numel() + if self.pred_masked_weight > 0: + loss += self.pred_masked_weight * sum(loss_m_list) + sample_size += targ_m_list[0].numel() + + loss_u_list = [] + logp_u_list = model.get_logits(net_output, False) + targ_u_list = model.get_targets(net_output, False) + assert self.pred_nomask_weight == 0 or len(logp_u_list) > 0 + for i, (logp_u, targ_u) in enumerate(zip(logp_u_list, targ_u_list)): + loss_u = F.cross_entropy(logp_u, targ_u, reduction=reduction) + loss_u_list.append(loss_u) + logging_output[f"loss_u_{i}"] = loss_u.detach().item() / targ_m_list[0].numel() + if self.pred_nomask_weight > 0: + loss += self.pred_nomask_weight * sum(loss_u_list) + sample_size += targ_u_list[0].numel() + + if self.loss_weights is not None: + assert hasattr(model, "get_extra_losses") + extra_losses, names = model.get_extra_losses(net_output) + if torch.is_tensor(extra_losses): + extra_losses = [extra_losses] + names = [names] + if len(self.loss_weights) == 1 and len(extra_losses) != 1: + self.loss_weights = [self.loss_weights[0]] * len(extra_losses) + assert len(extra_losses) == len(self.loss_weights), f"{len(extra_losses)}, {len(self.loss_weights)}" + for p, n, coef in zip(extra_losses, names, self.loss_weights): + if coef != 0 and p is not None: + p = coef * p.float() * sample_size + loss += p + logging_output[f"loss_{n}"] = p.item() / sample_size + + if "decoder_target" in sample: + dec_sample_size = sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + loss = loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + logging_output["hubert_sample_size"] = sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + + loss = loss / sample_size + + for lk in self.log_keys: + if lk in net_output: + logging_output[lk] = float((net_output[lk])) + + def compute_correct(logits): + if logits.numel() == 0: + return 0, 0 + else: + assert logits.dim() > 1, logits.shape + max = logits.argmax(-1) == 0 + min = logits.argmin(-1) == 0 + both = max & min + corr = max.long().sum().item() - both.long().sum().item() + count = max.numel() + return corr, count + + with torch.no_grad(): + for i, logp_m in enumerate(logp_m_list): + corr_m, count_m = compute_correct(logp_m) + logging_output[f"correct_m_{i}"] = corr_m + logging_output[f"count_m_{i}"] = count_m + + for i, logp_u in enumerate(logp_u_list): + corr_u, count_u = compute_correct(logp_u) + logging_output[f"correct_u_{i}"] = corr_u + logging_output[f"count_u_{i}"] = count_u + logging_output["speech_sample_size"] = sample_size + + else: + assert len(text_type) == 1 + text_type = text_type[0] + text_sample = sample[text_type] + text_sample["modality"] = "text" + ### 2. do text forward and loss computation + text_net_output = model(**text_sample["net_input"]) + text_dec_loss, text_dec_nll_loss = self.compute_ce_loss(model, text_net_output["decoder_out"], text_sample, reduce=reduce) + text_sample_size = text_sample["ntokens"] + loss = loss + (self.text_weight * text_dec_loss) + logging_output["text_dec_loss"] = text_dec_loss.item() + logging_output["text_dec_nll_loss"] = text_dec_nll_loss.item() + logging_output["text_sample_size"] = text_sample_size + + loss = loss / text_sample_size + sample_size = text_sample_size + sample = text_sample + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, text_net_output["decoder_out"], text_sample) + logging_output["text_dec_n_correct"] = utils.item(n_correct.data) + logging_output["text_total"] = utils.item(total.data) + + logging_output = { + "loss": loss.item() if reduce else loss, + "ntokens": sample_size, + "nsentences": sample["id"].numel(), + "sample_size": 1, + **logging_output, + } + + return loss, 1, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.padding_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.padding_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + if sample["modality"] == "speech": + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + else: + target = sample["target"] + + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training (copied from normal cross entropy).""" + loss_sum = sum(log.get("loss", 0) for log in logging_outputs) + ntokens = sum(log.get("ntokens", 0) for log in logging_outputs) + sample_size = sum(log.get("sample_size", 0) for log in logging_outputs) + speech_sample_size = sum(log.get("speech_sample_size", 0) for log in logging_outputs) + + metrics.log_scalar("loss", loss_sum / sample_size / math.log(2), sample_size, round=3) + if sample_size != ntokens: + metrics.log_scalar("nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3) + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["nll_loss"].avg)) + else: + metrics.log_derived("ppl", lambda meters: utils.get_perplexity(meters["loss"].avg)) + + counts = {} + log_keys = [] + for log in logging_outputs: + log_keys += list(log.keys()) + log_keys = set(log_keys) + + for lk in log_keys: + if lk.startswith("count_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val) + counts[lk] = val + + for lk in log_keys: + if lk.startswith("loss_") and speech_sample_size > 0: + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / speech_sample_size / math.log(2), round=3) + elif lk.startswith("correct_"): + val = sum(log.get(lk, 0) for log in logging_outputs) + metrics.log_scalar(lk, val / counts[re.sub("correct", "count", lk)]) + + if "dec_loss" in logging_outputs[0]: + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + # if "text_dec_loss" in logging_outputs[0]: + if any("text_dec_loss" in logging_output for logging_output in logging_outputs): + text_dec_loss_sum = sum(log.get("text_dec_loss", 0) for log in logging_outputs) + text_dec_nll_loss_sum = sum(log.get("text_dec_nll_loss", 0) for log in logging_outputs) + text_sample_size = sum(log.get("text_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "text_dec_loss", text_dec_loss_sum / text_sample_size / math.log(2), text_sample_size, round=3 + ) + metrics.log_scalar( + "text_dec_nll_loss", text_dec_nll_loss_sum / text_sample_size / math.log(2), text_sample_size, round=3 + ) + metrics.log_derived( + "text_dec_ppl", lambda meters: utils.get_perplexity(meters["text_dec_nll_loss"].avg) + ) + text_total = utils.item(sum(log.get("text_total", 0) for log in logging_outputs)) + if text_total > 0: + metrics.log_scalar("text_total", text_total) + text_n_correct = utils.item( + sum(log.get("text_dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("text_dec_n_correct", text_n_correct) + metrics.log_derived( + "text_dec_accuracy", + lambda meters: round( + meters["text_dec_n_correct"].sum * 100.0 / meters["text_total"].sum, 3 + ) + if meters["text_total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def aggregate_logging_outputs(logging_outputs): + """Aggregate logging outputs from data parallel training.""" + raise NotImplementedError() + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/YiTrans/yitrans_iwslt22/criterions/joint_step2_criterion.py b/YiTrans/yitrans_iwslt22/criterions/joint_step2_criterion.py new file mode 100644 index 0000000..aaafdbe --- /dev/null +++ b/YiTrans/yitrans_iwslt22/criterions/joint_step2_criterion.py @@ -0,0 +1,424 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import math +from argparse import Namespace +from dataclasses import dataclass, field +from omegaconf import II +from typing import Optional + +import torch +import torch.nn.functional as F +from fairseq import metrics, utils +from fairseq.criterions import FairseqCriterion, register_criterion +from fairseq.criterions.label_smoothed_cross_entropy import label_smoothed_nll_loss +from fairseq.data.data_utils import post_process +from fairseq.tasks import FairseqTask +from fairseq.logging.meters import safe_round + +from yitrans_iwslt22.criterions.ctc_ce import CtcCeCriterionConfig + +@dataclass +class JointStep2CriterionConfig(CtcCeCriterionConfig): + pass + + +@register_criterion("joint_step2", dataclass=JointStep2CriterionConfig) +class JointStep2Criterion(FairseqCriterion): + def __init__(self, cfg: JointStep2CriterionConfig, task: FairseqTask): + super().__init__(task) + self.blank_idx = ( + task.target_dictionary.index(task.blank_symbol) + if hasattr(task, "blank_symbol") + else 0 + ) + self.pad_idx = task.target_dictionary.pad() + self.eos_idx = task.target_dictionary.eos() + self.post_process = cfg.post_process + + if cfg.wer_args is not None: + ( + cfg.wer_kenlm_model, + cfg.wer_lexicon, + cfg.wer_lm_weight, + cfg.wer_word_score, + ) = eval(cfg.wer_args) + + if cfg.wer_kenlm_model is not None: + from examples.speech_recognition.w2l_decoder import W2lKenLMDecoder + + dec_args = Namespace() + dec_args.nbest = 1 + dec_args.criterion = "ctc" + dec_args.kenlm_model = cfg.wer_kenlm_model + dec_args.lexicon = cfg.wer_lexicon + dec_args.beam = 50 + dec_args.beam_size_token = min(50, len(task.target_dictionary)) + dec_args.beam_threshold = min(50, len(task.target_dictionary)) + dec_args.lm_weight = cfg.wer_lm_weight + dec_args.word_score = cfg.wer_word_score + dec_args.unk_weight = -math.inf + dec_args.sil_weight = 0 + + self.w2l_decoder = W2lKenLMDecoder(dec_args, task.target_dictionary) + else: + self.w2l_decoder = None + + self.zero_infinity = cfg.zero_infinity + self.sentence_avg = cfg.sentence_avg + + self.dec_weight = cfg.dec_weight + self.report_accuracy = cfg.report_accuracy + self.ignore_prefix_size = cfg.ignore_prefix_size + self.eps = cfg.label_smoothing + + def forward(self, model, sample, reduce=True): + text_type = [name for name in sample.keys() if name.startswith("text")] + logging_output = {} + if "speech" in sample.keys(): + assert len(text_type) == 0 + sample = sample["speech"] + sample["modality"] = "speech" + + net_output = model(**sample["net_input"]) + lprobs = model.get_normalized_probs( + net_output, log_probs=True + ).contiguous() # (T, B, C) from the encoder + + if "src_lengths" in sample["net_input"]: + input_lengths = sample["net_input"]["src_lengths"] + else: + if net_output["padding_mask"] is not None: + non_padding_mask = ~net_output["padding_mask"] + input_lengths = non_padding_mask.long().sum(-1) + else: + input_lengths = lprobs.new_full( + (lprobs.size(1),), lprobs.size(0), dtype=torch.long + ) + + pad_mask = (sample["target"] != self.pad_idx) & ( + sample["target"] != self.eos_idx + ) + targets_flat = sample["target"].masked_select(pad_mask) + if "target_lengths" in sample: + target_lengths = sample["target_lengths"] + else: + target_lengths = pad_mask.sum(-1) + + with torch.backends.cudnn.flags(enabled=False): + loss = F.ctc_loss( + lprobs, + targets_flat, + input_lengths, + target_lengths, + blank=self.blank_idx, + reduction="sum", + zero_infinity=self.zero_infinity, + ) + + ntokens = ( + sample["ntokens"] if "ntokens" in sample else target_lengths.sum().item() + ) + + sample_size = sample["target"].size(0) if self.sentence_avg else ntokens + + if "decoder_target" in sample: + if net_output["decoder_out"] is not None: + dec_sample_size = sample["target"].size(0) if self.sentence_avg else sample["dec_ntokens"] + dec_loss, dec_nll_loss = self.compute_ce_loss(model, net_output["decoder_out"], sample, reduce=reduce) + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + (self.dec_weight * dec_loss * sample_size / dec_sample_size) + logging_output["dec_loss"] = dec_loss.item() + logging_output["dec_nll_loss"] = dec_nll_loss.item() + logging_output["dec_sample_size"] = dec_sample_size + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, net_output["decoder_out"], sample) + logging_output["dec_n_correct"] = utils.item(n_correct.data) + logging_output["total"] = utils.item(total.data) + else: + logging_output["ctc_loss"] = loss.item() + loss = (1 - self.dec_weight) * loss + logging_output["dec_loss"] = 0 + logging_output["dec_nll_loss"] = 0 + logging_output["dec_sample_size"] = 1 + if self.report_accuracy: + logging_output["dec_n_correct"] = 0 + logging_output["total"] = 1 + loss = loss / sample_size + logging_output["speech_sample_size"] = sample_size + else: + assert len(text_type) == 1 + text_type = text_type[0] + text_sample = sample[text_type] + text_sample["modality"] = "text" + ### 2. do text forward and loss computation + text_net_output = model(**text_sample["net_input"]) + text_dec_loss, text_dec_nll_loss = self.compute_ce_loss(model, text_net_output["decoder_out"], text_sample, reduce=reduce) + text_sample_size = text_sample["target"].size(0) if self.sentence_avg else text_sample["ntokens"] + loss = text_dec_loss + logging_output["text_dec_loss"] = text_dec_loss.item() + logging_output["text_dec_nll_loss"] = text_dec_nll_loss.item() + logging_output["text_sample_size"] = text_sample_size + + loss = loss / text_sample_size + sample = text_sample + ntokens = text_sample["ntokens"] + + if self.report_accuracy: + n_correct, total = self.compute_accuracy(model, text_net_output["decoder_out"], text_sample) + logging_output["text_dec_n_correct"] = utils.item(n_correct.data) + logging_output["text_total"] = utils.item(total.data) + + logging_output = { + "loss": utils.item(loss.data), # * sample['ntokens'], + "ntokens": ntokens, + "nsentences": sample["id"].numel(), + "sample_size": 1, + **logging_output, + } + + if not model.training and self.dec_weight < 1.0 and "speech" in sample.keys(): + import editdistance + + with torch.no_grad(): + lprobs_t = lprobs.transpose(0, 1).float().contiguous().cpu() + + c_err = 0 + c_len = 0 + w_errs = 0 + w_len = 0 + wv_errs = 0 + for lp, t, inp_l in zip( + lprobs_t, + sample["target_label"] + if "target_label" in sample + else sample["target"], + input_lengths, + ): + lp = lp[:inp_l].unsqueeze(0) + + decoded = None + if self.w2l_decoder is not None: + decoded = self.w2l_decoder.decode(lp) + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + if len(decoded) < 1: + decoded = None + else: + decoded = decoded[0] + + p = (t != self.task.target_dictionary.pad()) & ( + t != self.task.target_dictionary.eos() + ) + targ = t[p] + targ_units = self.task.target_dictionary.string(targ) + targ_units_arr = targ.tolist() + + toks = lp.argmax(dim=-1).unique_consecutive() + pred_units_arr = toks[toks != self.blank_idx].tolist() + + c_err += editdistance.eval(pred_units_arr, targ_units_arr) + c_len += len(targ_units_arr) + + targ_words = post_process(targ_units, self.post_process).split() + + pred_units = self.task.target_dictionary.string(pred_units_arr) + pred_words_raw = post_process(pred_units, self.post_process).split() + + if decoded is not None and "words" in decoded: + pred_words = decoded["words"] + w_errs += editdistance.eval(pred_words, targ_words) + wv_errs += editdistance.eval(pred_words_raw, targ_words) + else: + dist = editdistance.eval(pred_words_raw, targ_words) + w_errs += dist + wv_errs += dist + + w_len += len(targ_words) + + logging_output["wv_errors"] = wv_errs + logging_output["w_errors"] = w_errs + logging_output["w_total"] = w_len + logging_output["c_errors"] = c_err + logging_output["c_total"] = c_len + + return loss, 1, logging_output + + def compute_ce_loss(self, model, net_output, sample, reduce=True): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + loss, nll_loss = label_smoothed_nll_loss( + lprobs, + target, + self.eps, + ignore_index=self.pad_idx, + reduce=reduce, + ) + return loss, nll_loss + + def compute_accuracy(self, model, net_output, sample): + lprobs, target = self.get_lprobs_and_target(model, net_output, sample) + mask = target.ne(self.pad_idx) + n_correct = torch.sum( + lprobs.argmax(1).masked_select(mask).eq(target.masked_select(mask)) + ) + total = torch.sum(mask) + return n_correct, total + + def get_lprobs_and_target(self, model, net_output, sample): + lprobs = model.get_normalized_probs(net_output, log_probs=True) + if sample["modality"] == "speech": + target = sample["decoder_target"] + if self.ignore_prefix_size > 0: + if getattr(lprobs, "batch_first", False): + lprobs = lprobs[:, self.ignore_prefix_size :, :].contiguous() + target = target[:, self.ignore_prefix_size :].contiguous() + else: + lprobs = lprobs[self.ignore_prefix_size :, :, :].contiguous() + target = target[self.ignore_prefix_size :, :].contiguous() + else: + target = sample["target"] + + return lprobs.view(-1, lprobs.size(-1)), target.view(-1) + + + @staticmethod + def reduce_metrics(logging_outputs) -> None: + """Aggregate logging outputs from data parallel training.""" + + loss_sum = utils.item(sum(log.get("loss", 0) for log in logging_outputs)) + ntokens = utils.item(sum(log.get("ntokens", 0) for log in logging_outputs)) + nsentences = utils.item( + sum(log.get("nsentences", 0) for log in logging_outputs) + ) + sample_size = utils.item( + sum(log.get("sample_size", 0) for log in logging_outputs) + ) + + metrics.log_scalar( + "loss", loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar("ntokens", ntokens) + metrics.log_scalar("nsentences", nsentences) + if sample_size != ntokens: + metrics.log_scalar( + "nll_loss", loss_sum / ntokens / math.log(2), ntokens, round=3 + ) + + c_errors = sum(log.get("c_errors", 0) for log in logging_outputs) + metrics.log_scalar("_c_errors", c_errors) + c_total = sum(log.get("c_total", 0) for log in logging_outputs) + metrics.log_scalar("_c_total", c_total) + w_errors = sum(log.get("w_errors", 0) for log in logging_outputs) + metrics.log_scalar("_w_errors", w_errors) + wv_errors = sum(log.get("wv_errors", 0) for log in logging_outputs) + metrics.log_scalar("_wv_errors", wv_errors) + w_total = sum(log.get("w_total", 0) for log in logging_outputs) + metrics.log_scalar("_w_total", w_total) + + if c_total > 0: + metrics.log_derived( + "uer", + lambda meters: safe_round( + meters["_c_errors"].sum * 100.0 / meters["_c_total"].sum, 3 + ) + if meters["_c_total"].sum > 0 + else float("nan"), + ) + if w_total > 0: + metrics.log_derived( + "wer", + lambda meters: safe_round( + meters["_w_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + metrics.log_derived( + "raw_wer", + lambda meters: safe_round( + meters["_wv_errors"].sum * 100.0 / meters["_w_total"].sum, 3 + ) + if meters["_w_total"].sum > 0 + else float("nan"), + ) + + if "dec_loss" in logging_outputs[0]: + ctc_loss_sum = sum(log.get("ctc_loss", 0) for log in logging_outputs) + dec_loss_sum = sum(log.get("dec_loss", 0) for log in logging_outputs) + dec_nll_loss_sum = sum(log.get("dec_nll_loss", 0) for log in logging_outputs) + dec_sample_size = sum(log.get("dec_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "dec_loss", dec_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_scalar( + "ctc_loss", ctc_loss_sum / sample_size / math.log(2), sample_size, round=3 + ) + metrics.log_scalar( + "dec_nll_loss", dec_nll_loss_sum / dec_sample_size / math.log(2), dec_sample_size, round=3 + ) + metrics.log_derived( + "dec_ppl", lambda meters: utils.get_perplexity(meters["dec_nll_loss"].avg) + ) + total = utils.item(sum(log.get("total", 0) for log in logging_outputs)) + if total > 0: + metrics.log_scalar("total", total) + n_correct = utils.item( + sum(log.get("dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("dec_n_correct", n_correct) + metrics.log_derived( + "dec_accuracy", + lambda meters: round( + meters["dec_n_correct"].sum * 100.0 / meters["total"].sum, 3 + ) + if meters["total"].sum > 0 + else float("nan"), + ) + + # if "text_dec_loss" in logging_outputs[0]: + if any("text_dec_loss" in logging_output for logging_output in logging_outputs): + text_dec_loss_sum = sum(log.get("text_dec_loss", 0) for log in logging_outputs) + text_dec_nll_loss_sum = sum(log.get("text_dec_nll_loss", 0) for log in logging_outputs) + text_sample_size = sum(log.get("text_sample_size", 0) for log in logging_outputs) + metrics.log_scalar( + "text_dec_loss", text_dec_loss_sum / text_sample_size / math.log(2), text_sample_size, round=3 + ) + metrics.log_scalar( + "text_dec_nll_loss", text_dec_nll_loss_sum / text_sample_size / math.log(2), text_sample_size, round=3 + ) + metrics.log_derived( + "text_dec_ppl", lambda meters: utils.get_perplexity(meters["text_dec_nll_loss"].avg) + ) + text_total = utils.item(sum(log.get("text_total", 0) for log in logging_outputs)) + if text_total > 0: + metrics.log_scalar("text_total", text_total) + text_n_correct = utils.item( + sum(log.get("text_dec_n_correct", 0) for log in logging_outputs) + ) + metrics.log_scalar("text_dec_n_correct", text_n_correct) + metrics.log_derived( + "text_dec_accuracy", + lambda meters: round( + meters["text_dec_n_correct"].sum * 100.0 / meters["text_total"].sum, 3 + ) + if meters["text_total"].sum > 0 + else float("nan"), + ) + + @staticmethod + def logging_outputs_can_be_summed() -> bool: + """ + Whether the logging outputs returned by `forward` can be summed + across workers prior to calling `reduce_metrics`. Setting this + to True will improves distributed training speed. + """ + return False diff --git a/YiTrans/yitrans_iwslt22/data/concat_dataset.py b/YiTrans/yitrans_iwslt22/data/concat_dataset.py new file mode 100644 index 0000000..9cdb523 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/data/concat_dataset.py @@ -0,0 +1,124 @@ +# modalified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/data/concat_dataset.py + +import bisect + +import numpy as np +from torch.utils.data.dataloader import default_collate + +from fairseq.data import FairseqDataset + + +class ConcatDataset(FairseqDataset): + @staticmethod + def cumsum(sequence, sample_ratios): + r, s = [], 0 + for e, ratio in zip(sequence, sample_ratios): + curr_len = int(ratio * len(e)) + r.append(curr_len + s) + s += curr_len + return r + + def __init__(self, datasets, sample_ratios=1): + super(ConcatDataset, self).__init__() + assert len(datasets) > 0, "datasets should not be an empty iterable" + self.datasets = list(datasets) + if isinstance(sample_ratios, int): + sample_ratios = [sample_ratios] * len(self.datasets) + self.sample_ratios = sample_ratios + self.cumulative_sizes = self.cumsum(self.datasets, sample_ratios) + self.real_sizes = [len(d) for d in self.datasets] + + def __len__(self): + return self.cumulative_sizes[-1] + + def __getitem__(self, idx): + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx][sample_idx] + + def _get_dataset_and_sample_index(self, idx: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + sample_idx = sample_idx % self.real_sizes[dataset_idx] + return dataset_idx, sample_idx + + def collater(self, samples, **extra_args): + # For now only supports datasets with same underlying collater implementations + if hasattr(self.datasets[0], "collater"): + return self.datasets[0].collater(samples, **extra_args) + else: + return default_collate(samples, **extra_args) + + def size(self, idx: int): + """ + Return an example's size as a float or tuple. + """ + dataset_idx, sample_idx = self._get_dataset_and_sample_index(idx) + return self.datasets[dataset_idx].size(sample_idx) + + def num_tokens(self, index: int): + return np.max(self.size(index)) + + def attr(self, attr: str, index: int): + dataset_idx = bisect.bisect_right(self.cumulative_sizes, index) + return getattr(self.datasets[dataset_idx], attr, None) + + @property + def sizes(self): + _dataset_sizes = [] + for ds, sr in zip(self.datasets, self.sample_ratios): + if isinstance(ds.sizes, np.ndarray): + _dataset_sizes.append(np.tile(ds.sizes, sr)) + else: + # Only support underlying dataset with single size array. + assert isinstance(ds.sizes, list) + _dataset_sizes.append(np.tile(ds.sizes[0], sr)) + return np.concatenate(_dataset_sizes) + + @property + def supports_prefetch(self): + return all(d.supports_prefetch for d in self.datasets) + + def ordered_indices(self): + """ + Returns indices sorted by length. So less padding is needed. + """ + if isinstance(self.sizes, np.ndarray) and len(self.sizes.shape) > 1: + # special handling for concatenating lang_pair_datasets + if getattr(self.datasets[0], "shuffle", False): + indices = np.random.permutation(len(self)).astype(np.int64) + else: + indices = np.arange(len(self), dtype=np.int64) + sizes = self.sizes + tgt_sizes = ( + sizes[:, 1] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else None + ) + src_sizes = ( + sizes[:, 0] if len(sizes.shape) > 0 and sizes.shape[1] > 1 else sizes + ) + # sort by target length, then source length + if tgt_sizes is not None: + indices = indices[np.argsort(tgt_sizes[indices], kind="mergesort")] + return indices[np.argsort(src_sizes[indices], kind="mergesort")] + else: + return np.argsort(self.sizes) + + def prefetch(self, indices): + frm = 0 + for to, ds in zip(self.cumulative_sizes, self.datasets): + real_size = len(ds) + if getattr(ds, "supports_prefetch", False): + ds.prefetch([(i - frm) % real_size for i in indices if frm <= i < to]) + frm = to + + @property + def can_reuse_epoch_itr_across_epochs(self): + return all(d.can_reuse_epoch_itr_across_epochs for d in self.datasets) + + def set_epoch(self, epoch): + super().set_epoch(epoch) + for ds in self.datasets: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) diff --git a/YiTrans/yitrans_iwslt22/data/denoising_dataset.py b/YiTrans/yitrans_iwslt22/data/denoising_dataset.py new file mode 100644 index 0000000..f498706 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/data/denoising_dataset.py @@ -0,0 +1,90 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import math + +import numpy as np +import torch + +from fairseq.data import FairseqDataset, data_utils, DenoisingDataset + + +class DenoisingDatasetLang(DenoisingDataset): + """ + A wrapper around DenoisingDataset for BART dataset. + + """ + + def __init__( + self, + dataset, + sizes, + vocab, + mask_idx, + mask_whole_words, + shuffle, + seed, + args, + eos=None, + item_transform_func=None, + tgt_lang_idx=None, + ): + super().__init__( + dataset, + sizes, + vocab, + mask_idx, + mask_whole_words, + shuffle, + seed, + args, + eos, + item_transform_func, + ) + + self.tgt_lang_idx=tgt_lang_idx + + def __getitem__(self, index): + with data_utils.numpy_seed(self.seed, self.epoch, index): + tokens = self.dataset[index] + assert tokens[-1] == self.eos + source, target = tokens, tokens.clone() + + if self.permute_sentence_ratio > 0.0: + source = self.permute_sentences(source, self.permute_sentence_ratio) + + if self.mask_ratio > 0: + source = self.add_whole_word_mask(source, self.mask_ratio) + + if self.insert_ratio > 0: + source = self.add_insertion_noise(source, self.insert_ratio) + + if self.rotate_ratio > 0.0 and np.random.random() < self.rotate_ratio: + source = self.add_rolling_noise(source) + # there can additional changes to make: + if self.item_transform_func is not None: + source, target = self.item_transform_func(source, target) + + assert (source >= 0).all() + assert (source[1:-1] >= 1).all() + assert (source <= len(self.vocab)).all() + assert source[0] == self.vocab.bos() + assert target[0] == self.vocab.bos() + assert source[-1] == self.eos + + if self.tgt_lang_idx is not None: + tgt_lang_idx = torch.LongTensor([self.tgt_lang_idx]) + source = torch.cat([source[1:], tgt_lang_idx]) + target = torch.cat([target[1:], tgt_lang_idx]) + sample = { + "id": index, + "source": source, + "target": target, + } + return sample diff --git a/YiTrans/yitrans_iwslt22/data/lang_pair_mask_dataset.py b/YiTrans/yitrans_iwslt22/data/lang_pair_mask_dataset.py new file mode 100644 index 0000000..e5617a2 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/data/lang_pair_mask_dataset.py @@ -0,0 +1,62 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/data/audio/multi_modality_dataset.py +""" + + +from typing import Optional + +import numpy as np +import torch +from fairseq.data import ( + LanguagePairDataset, +) +from fairseq.data.audio.multi_modality_dataset import LangPairMaskDataset as FairseqLangPairMaskDataset + +class LangPairMaskDataset(FairseqLangPairMaskDataset): + def __init__( + self, + dataset: LanguagePairDataset, + src_eos: int, + src_bos: Optional[int] = None, + noise_id: Optional[int] = -1, + mask_ratio: Optional[float] = 0, + mask_type: Optional[str] = "random", + ): + super.__init__( + dataset, + src_eos, + src_bos, + noise_id, + mask_ratio, + mask_type, + ) + def mask_src_tokens(self, sample): + src_item = sample["source"] + mask = None + if self.mask_type == "random": + mask = torch.rand(len(src_item)).le(self.mask_ratio) + else: + mask = torch.ones(len(src_item)) + mask[: int(len(src_item) * (1 - self.mask_ratio))] = 0 + mask = mask.eq(1) + if src_item[0] == self.src_bos: + mask[0] = False + if src_item[-1] == self.src_eos: + mask[-1] = False + mask_src_item = src_item.masked_fill(mask, self.noise_id) + smp = sample + smp["source"] = mask_src_item + return smp + + def collater(self, samples, pad_to_length=None): + return self.dataset.collater(samples, pad_to_length=pad_to_length) + diff --git a/YiTrans/yitrans_iwslt22/data/load_langpair_dataset.py b/YiTrans/yitrans_iwslt22/data/load_langpair_dataset.py new file mode 100644 index 0000000..62c5e7b --- /dev/null +++ b/YiTrans/yitrans_iwslt22/data/load_langpair_dataset.py @@ -0,0 +1,170 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/tasks/translation.py + Add custom lang_format in function load_langpair_dataset +""" + +import itertools +import logging +import os + +from fairseq.data import ( + AppendTokenDataset, + LanguagePairDataset, + PrependTokenDataset, + StripTokenDataset, + TruncateDataset, + data_utils, + indexed_dataset, +) + +from yitrans_iwslt22.data.concat_dataset import ConcatDataset + + +EVAL_BLEU_ORDER = 4 + + +logger = logging.getLogger(__name__) + + +def load_langpair_dataset( + data_path, + split, + src, + src_dict, + tgt, + tgt_dict, + combine, + dataset_impl, + upsample_primary, + left_pad_source, + left_pad_target, + max_source_positions, + max_target_positions, + prepend_bos=False, + load_alignments=False, + truncate_source=False, + append_source_id=False, + num_buckets=0, + shuffle=True, + pad_to_multiple=1, + prepend_bos_src=None, + lang_format="[{}]", +): + def split_exists(split, src, tgt, lang, data_path): + filename = os.path.join(data_path, "{}.{}-{}.{}".format(split, src, tgt, lang)) + return indexed_dataset.dataset_exists(filename, impl=dataset_impl) + + src_datasets = [] + tgt_datasets = [] + + for k in itertools.count(): + split_k = split + (str(k) if k > 0 else "") + + # infer langcode + if split_exists(split_k, src, tgt, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, src, tgt)) + elif split_exists(split_k, tgt, src, src, data_path): + prefix = os.path.join(data_path, "{}.{}-{}.".format(split_k, tgt, src)) + else: + if k > 0: + break + else: + raise FileNotFoundError( + "Dataset not found: {} ({})".format(split, data_path) + ) + + src_dataset = data_utils.load_indexed_dataset( + prefix + src, src_dict, dataset_impl + ) + if truncate_source: + src_dataset = AppendTokenDataset( + TruncateDataset( + StripTokenDataset(src_dataset, src_dict.eos()), + max_source_positions - 1, + ), + src_dict.eos(), + ) + src_datasets.append(src_dataset) + + tgt_dataset = data_utils.load_indexed_dataset( + prefix + tgt, tgt_dict, dataset_impl + ) + if tgt_dataset is not None: + tgt_datasets.append(tgt_dataset) + + logger.info( + "{} {} {}-{} {} examples".format( + data_path, split_k, src, tgt, len(src_datasets[-1]) + ) + ) + + if not combine: + break + + assert len(src_datasets) == len(tgt_datasets) or len(tgt_datasets) == 0 + + if len(src_datasets) == 1: + src_dataset = src_datasets[0] + tgt_dataset = tgt_datasets[0] if len(tgt_datasets) > 0 else None + else: + sample_ratios = [1] * len(src_datasets) + sample_ratios[0] = upsample_primary + src_dataset = ConcatDataset(src_datasets, sample_ratios) + if len(tgt_datasets) > 0: + tgt_dataset = ConcatDataset(tgt_datasets, sample_ratios) + else: + tgt_dataset = None + + if prepend_bos: + assert hasattr(src_dict, "bos_index") and hasattr(tgt_dict, "bos_index") + src_dataset = PrependTokenDataset(src_dataset, src_dict.bos()) + if tgt_dataset is not None: + tgt_dataset = PrependTokenDataset(tgt_dataset, tgt_dict.bos()) + elif prepend_bos_src is not None: + logger.info(f"prepending src bos: {prepend_bos_src}") + src_dataset = PrependTokenDataset(src_dataset, prepend_bos_src) + + eos = None + if append_source_id: + src_dataset = AppendTokenDataset( + src_dataset, src_dict.index(lang_format.format(src)) + ) + if tgt_dataset is not None: + tgt_dataset = AppendTokenDataset( + tgt_dataset, tgt_dict.index(lang_format.format(tgt)) + ) + eos = tgt_dict.index(lang_format.format(tgt)) + + align_dataset = None + if load_alignments: + align_path = os.path.join(data_path, "{}.align.{}-{}".format(split, src, tgt)) + if indexed_dataset.dataset_exists(align_path, impl=dataset_impl): + align_dataset = data_utils.load_indexed_dataset( + align_path, None, dataset_impl + ) + + tgt_dataset_sizes = tgt_dataset.sizes if tgt_dataset is not None else None + return LanguagePairDataset( + src_dataset, + src_dataset.sizes, + src_dict, + tgt_dataset, + tgt_dataset_sizes, + tgt_dict, + left_pad_source=left_pad_source, + left_pad_target=left_pad_target, + align_dataset=align_dataset, + eos=eos, + num_buckets=num_buckets, + shuffle=shuffle, + pad_to_multiple=pad_to_multiple, + ) diff --git a/YiTrans/yitrans_iwslt22/data/multimodal_corpus_dataset.py b/YiTrans/yitrans_iwslt22/data/multimodal_corpus_dataset.py new file mode 100644 index 0000000..ee02a4e --- /dev/null +++ b/YiTrans/yitrans_iwslt22/data/multimodal_corpus_dataset.py @@ -0,0 +1,346 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +from os import replace +import time +from collections import OrderedDict +from typing import Any, Dict, List, Optional + +import numpy as np +from fairseq.data import data_utils + +from fairseq.data import FairseqDataset + +logger = logging.getLogger(__name__) + + +class MultiCorpusDataset(FairseqDataset): + """ + see fairseq/fairseq/data/multi_corpus_dataset.__doc__ + + Args: + datasets: a OrderedDict of FairseqDataset instances. + distribution: a List containing the probability of getting an utterance from + corresponding dataset + seed: random seed for sampling the datsets + sort_indices: if true, will sort the ordered indices by size + batch_sample: if true, will ensure each batch is from a single dataset + """ + + def __init__( + self, + datasets: Dict[str, FairseqDataset], + max_positions: Dict, + distribution: List[float], + max_tokens_ratio: List[float], + seed: int, + sort_indices: bool = False, + check_length: bool = False, + ): + super().__init__() + assert isinstance(datasets, OrderedDict) + assert len(datasets) == len(distribution) + # assert sum(distribution) == 1 + self.datasets = datasets + self.distribution = distribution + self.max_tokens_ratio = max_tokens_ratio + self.seed = seed + self.sort_indices = sort_indices + self.max_positions = max_positions + self.check_length = check_length + + # Avoid repeated conversions to list later + self.dataset_list = list(datasets.values()) + self.total_num_instances = 0 + + # first_dataset = self.dataset_list[0] + + self.num_instances_per_dataset = [] + self.dataset_offsets = [] + for i, dataset in enumerate(self.dataset_list): + assert isinstance(dataset, FairseqDataset) + # assert type(dataset) is type(first_dataset) + self.num_instances_per_dataset.append( + 0 if self.distribution[i] == 0 else len(dataset) + ) + self.dataset_offsets.append(self.total_num_instances) + self.total_num_instances += self.num_instances_per_dataset[i] + + def ordered_indices(self): + start = time.time() + with data_utils.numpy_seed(self.seed, self.epoch): + logger.info(f"sampling new dataset with seed {self.seed} epoch {self.epoch}") + sampled_indices = {} + + # For each dataset i, sample self.distribution[i] * self.total_num_instances + for i, key in enumerate(self.datasets): + tp = time.time() + if self.distribution[i] == 0: + # skip dataset if sampling probability is 0 + continue + + if i < len(self.datasets) - 1: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.dataset_offsets[i + 1] + else: + num_instances = int(self.distribution[i] * self.total_num_instances) + high = self.total_num_instances + + logger.info(f"sampling {num_instances} from {key} dataset") + + # First, add k copies of the dataset where k = num_instances // len(dataset). + # This ensures an equal distribution of the data points as much as possible. + # For the remaining entries randomly sample them + dataset_size = len(self.datasets[key]) + num_copies = num_instances // dataset_size + dataset_indices = np.random.permutation(high - self.dataset_offsets[i])[: num_instances - num_copies * dataset_size] + if num_copies > 0: + dataset_indices = np.concatenate( + ( + np.repeat( + np.arange(high - self.dataset_offsets[i]), num_copies + ), + dataset_indices, + ) + ) + # filter by size, we should ignore it by setting check_length=False + # , as it is very time-consuming on large dadaset + if self.max_positions[key] is not None and self.check_length: + dataset_indices, ignored = self.datasets[key].filter_indices_by_size( + dataset_indices, + self.max_positions[key], + ) + if len(ignored) > 0: + logger.warning( + ( + "{:,} samples have invalid sizes and will be skipped, " + "max_positions={}, first few sample ids={}" + ).format(len(ignored), self.max_positions[key], ignored[:10]) + ) + + if self.sort_indices: + logger.info(" - sampled indices took {}s".format(time.time() - tp)) + tp = time.time() + dataset_indices = np.sort(dataset_indices) + dataset_indices = self.datasets[key].ordered_indices()[dataset_indices] + self.dataset_offsets[i] + logger.info(" - ordered_indices took {}s".format(time.time() - tp)) + else: + np.random.shuffle(dataset_indices) + + sampled_indices[key] = dataset_indices + + logger.info( + "multi_corpus_dataset ordered_indices took {}s".format( + time.time() - start + ) + ) + return sampled_indices + + def _map_index(self, index: int): + """ + If dataset A has length N and dataset B has length M + then index 1 maps to index 1 of dataset A, and index N + 1 + maps to index 1 of B. + """ + counter = 0 + for num_instances, key in zip(self.num_instances_per_dataset, self.datasets): + if index < counter + num_instances: + return index - counter, key + counter += num_instances + raise ValueError( + "Invalid index: {}, max: {}".format(index, self.total_num_instances) + ) + + def __len__(self): + """ + Length of this dataset is the sum of individual datasets + """ + return self.total_num_instances + + def __getitem__(self, index): + new_index, key = self._map_index(index) + try: + item = self.datasets[key][new_index] + item["full_id"] = index + return item + except Exception as e: + e.args = (f"Error from {key} dataset", *e.args) + raise + + def collater(self, samples): + """ + If we are doing batch sampling, then pick the right collater to use. + + Otherwise we assume all collaters are the same. + """ + if len(samples) == 0: + return None + + samples_dict = {key: [] for key in self.datasets} + for s in samples: + _, key = self._map_index(s["full_id"]) + samples_dict[key].append(s) + + batch = {} + for key in samples_dict: + if len(samples_dict[key]) == 0: + continue + batch[key] = self.datasets[key].collater(samples_dict[key]) + + return batch + + + def num_tokens(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].num_tokens(index) + + def size(self, index: int): + index, key = self._map_index(index) + return self.datasets[key].size(index) + + @property + def can_reuse_epoch_itr_across_epochs(self): + return False + + def set_epoch(self, epoch, **unused): + super().set_epoch(epoch) + logger.info(f"setting epoch of multi_corpus_dataset to {epoch}") + for ds in self.dataset_list: + if hasattr(ds, "set_epoch"): + ds.set_epoch(epoch) + self.epoch = epoch + + @property + def supports_prefetch(self): + return False + + @property + def supports_fetch_outside_dataloader(self): + return all( + self.datasets[key].supports_fetch_outside_dataloader + for key in self.datasets + ) + + + def batch_by_size( + self, + indices, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + ): + dataset_indices = indices + batches_dict = {} + for n, key in enumerate(dataset_indices): + max_tokens_ratio = self.max_tokens_ratio[n] + cur_batches = super().batch_by_size( + np.array(dataset_indices[key], dtype=np.int64), + round(max_tokens * max_tokens_ratio), + max_sentences, + required_batch_size_multiple, + ) + logger.info(f"Created {len(cur_batches)} batches for dataset {key}") + batches_dict[key] = cur_batches + + return batches_dict + + + def get_batch_sampler( + self, + indices, + num_shards, + seed, + max_tokens=None, + max_sentences=None, + required_batch_size_multiple=1, + split_modality_batch=False, + ): + + def batch_sampler(dataset, epoch): + start = time.time() + batches_dict = dataset.batch_by_size( + indices, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + ) + logger.info(f"multi_corpus_dataset, batch_by_size took {time.time() - start}s") + start = time.time() + new_batches = [] + + ### shuffle inner group size, split into speech/text batches + speech_batches, text_batches = [], [] + for name, batches in batches_dict.items(): + batches = inner_bucket_shuffle(batches, seed+epoch, num_shards*10) + batches = batches[: (len(batches) // num_shards) * num_shards] + if name.startswith("speech"): + speech_batches += batches + else: + text_batches += batches + if len(speech_batches) == 0: + logger.warning(f"Sample 0 speech batch, please ensure that no speech data loaded.") + if len(text_batches) == 0: + logger.warning(f"Sample 0 text batch, please ensure that no text data loaded.") + + ### shuffle groups + if len(speech_batches) == 0 or len(text_batches) == 0: + new_batches = speech_batches + text_batches + new_batches = shuffle_buckets(new_batches, seed=seed+epoch, inner_shuf=False) + else: + speech_batches = shuffle_buckets(speech_batches, seed=seed+epoch, inner_shuf=False) + text_batches = shuffle_buckets(text_batches, seed=seed+epoch, inner_shuf=False) + num_batch = min(len(speech_batches), len(text_batches)) + if split_modality_batch: + for i in range(0, num_batch, num_shards): + new_batches += speech_batches[i: i + num_shards] + new_batches += text_batches[i: i + num_shards] + else: + for i in range(num_batch): + new_batches.append(np.concatenate([speech_batches[i], text_batches[i]])) + + logger.info(f"multi_corpus_dataset sample {len(new_batches)} batches, took {time.time() - start}s") + return new_batches + + def inner_bucket_shuffle(batches, seed, bucket_size=10, thr=0): + """we assert batches is sorted form long to short. + shuffle samples in a buctet(e.g. 10 batches). + batches: a list of numpy array""" + num_batch = len(batches) + new_batches = [] + num_buckets = len(batches) // bucket_size + i = 0 + while i < num_batch: + if (i < bucket_size * thr or + i >= bucket_size * (num_buckets - thr) + ): + new_batches.append(batches[i]) + i += 1 + else: + group = np.concatenate(batches[i: i+bucket_size]) + with data_utils.numpy_seed(seed): + np.random.shuffle(group) + new_batches += np.array_split(group, bucket_size) + i += bucket_size + assert all([len(batch) > 0 for batch in new_batches]) + return new_batches + + def shuffle_buckets(batches, seed, inner_shuf=True): + if inner_shuf: + batches = inner_bucket_shuffle(batches, seed, num_shards*10) + batches = [batches[i: i + num_shards] for i in range(0, len(batches)-num_shards+1, num_shards)] + assert len(batches[-1]) == num_shards + new_batches = [] + with data_utils.numpy_seed(seed): + np.random.shuffle(batches) + for group in batches: + new_batches += group + return new_batches + + return batch_sampler diff --git a/YiTrans/yitrans_iwslt22/data/speech2c_dataset.py b/YiTrans/yitrans_iwslt22/data/speech2c_dataset.py new file mode 100644 index 0000000..e75d75a --- /dev/null +++ b/YiTrans/yitrans_iwslt22/data/speech2c_dataset.py @@ -0,0 +1,222 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import itertools +import logging +import os +import sys +from typing import Any, List, Optional, Union + +import numpy as np + +import torch +import torch.nn.functional as F +from fairseq.data import data_utils, Dictionary +from fairseq.data.audio.hubert_dataset import HubertDataset + +logger = logging.getLogger(__name__) + + + +class Speech2cDataset(HubertDataset): + def __init__( + self, + manifest_path: str, + sample_rate: float, + label_paths: List[str], + label_rates: Union[List[float], float], # -1 for sequence labels + pad_list: List[str], + eos_list: List[str], + label_processors: Optional[List[Any]] = None, + max_keep_sample_size: Optional[int] = None, + min_keep_sample_size: Optional[int] = None, + max_sample_size: Optional[int] = None, + shuffle: bool = True, + pad_audio: bool = False, + normalize: bool = False, + store_labels: bool = True, + random_crop: bool = False, + single_target: bool = False, + tgt_dict: Optional[Dictionary] = None, + add_decoder: bool = False, + fine_tuning: bool = False, + tokenizer = None, + tgt_lang_idx: int = None, + mbart_style_lang_id: bool = False, + retry_times: int = 5, + reduce_label_for_dec: bool = True, + ): + super().__init__( + manifest_path, + sample_rate, + label_paths, + label_rates, + pad_list, + eos_list, + label_processors, + max_keep_sample_size, + min_keep_sample_size, + max_sample_size, + shuffle, + pad_audio, + normalize, + store_labels, + random_crop, + single_target + ) + self.tgt_dict = tgt_dict + self.add_decoder = add_decoder + self.fine_tuning = fine_tuning + self.tokenizer = tokenizer + self.tgt_lang_idx = tgt_lang_idx + self.mbart_style_lang_id = mbart_style_lang_id + self.retry_times = retry_times + self.reduce_label_for_dec = reduce_label_for_dec + logger.info( + f"tgt_lang_idx={self.tgt_lang_idx}, reduce_label_for_dec={reduce_label_for_dec}, " + f"mbart_style_lang_id={mbart_style_lang_id}" + ) + + self.sizes = np.array(self.sizes) + + def get_label(self, index, label_idx): + if self.store_labels: + label = self.label_list[label_idx][index] + else: + with open(self.label_paths[label_idx]) as f: + offset_s, offset_e = self.label_offsets_list[label_idx][index] + f.seek(offset_s) + label = f.read(offset_e - offset_s) + + if self.tokenizer is not None and self.fine_tuning: + label = self.tokenizer.encode(label) + + if self.label_processors is not None: + label = self.label_processors[label_idx](label) + return label + + def collater(self, samples): + # target = max(sizes) -> random_crop not used + # target = max_sample_size -> random_crop used for long + samples = [s for s in samples if s["source"] is not None] + if len(samples) == 0: + return {} + + audios = [s["source"] for s in samples] + audio_sizes = [len(s) for s in audios] + if self.pad_audio: + audio_size = min(max(audio_sizes), self.max_sample_size) + else: + audio_size = min(min(audio_sizes), self.max_sample_size) + collated_audios, padding_mask, audio_starts = self.collater_audio( + audios, audio_size + ) + + targets_by_label = [ + [s["label_list"][i] for s in samples] for i in range(self.num_labels) + ] + targets_list, lengths_list, ntokens_list = self.collater_label( + targets_by_label, audio_size, audio_starts + ) + + if self.add_decoder: + if self.fine_tuning: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + else: + if self.tokenizer is not None: + decoder_label = [ + # Set 48 for translate int to char and avoid \n + torch.cat( + ( + torch.tensor( + self.tokenizer.sp.Encode( + "".join( + [chr(j + 48) for j in ( + targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]] + ).tolist()] + ), out_type=int + ) + ), + torch.tensor([self.tgt_dict.eos()]) + ), dim=0 + ).long() + for i in range(targets_list[0].size(0)) + ] + else: + decoder_label = [ + torch.cat((targets_list[0][i, :lengths_list[0][i]].unique_consecutive() if self.reduce_label_for_dec else targets_list[0][i, :lengths_list[0][i]], torch.tensor([self.tgt_dict.eos()])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + if self.mbart_style_lang_id: + decoder_label = [ + torch.cat((decoder_label[i], torch.tensor([self.tgt_lang_idx])), 0).long() + for i in range(targets_list[0].size(0)) + ] + + dec_ntokens = sum(x.size(0) for x in decoder_label) + decoder_target = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=False, + ) + decoder_target_lengths = torch.tensor( + [x.size(0) for x in decoder_label], dtype=torch.long + ) + prev_output_tokens = data_utils.collate_tokens( + decoder_label, + self.tgt_dict.pad(), + self.tgt_dict.eos() if not self.mbart_style_lang_id else self.tgt_lang_idx, + left_pad=False, + move_eos_to_beginning=True, + ) + + if self.tgt_lang_idx is not None and not self.mbart_style_lang_id: + assert (prev_output_tokens[:, 0] != self.tgt_dict.eos()).sum() == 0 + prev_output_tokens[:, 0] = self.tgt_lang_idx + + net_input = { + "source": collated_audios, + "padding_mask": padding_mask, + "prev_output_tokens": prev_output_tokens, + } + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + "decoder_target": decoder_target, + "decoder_target_lengths": decoder_target_lengths, + "dec_ntokens": dec_ntokens, + "lang_idx": self.tgt_lang_idx, + } + else: + net_input = {"source": collated_audios, "padding_mask": padding_mask} + batch = { + "id": torch.LongTensor([s["id"] for s in samples]), + "net_input": net_input, + } + + if self.single_target: + batch["target_lengths"] = lengths_list[0] + batch["ntokens"] = ntokens_list[0] + batch["target"] = targets_list[0] + else: + batch["target_lengths_list"] = lengths_list + batch["ntokens_list"] = ntokens_list + batch["target_list"] = targets_list + return batch + + # @property + # def sizes(self): + # return np.array(self.sizes) + diff --git a/YiTrans/yitrans_iwslt22/models/__init__.py b/YiTrans/yitrans_iwslt22/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/YiTrans/yitrans_iwslt22/models/_hubert_mt.py b/YiTrans/yitrans_iwslt22/models/_hubert_mt.py new file mode 100644 index 0000000..d997eb2 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/models/_hubert_mt.py @@ -0,0 +1,310 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +import logging +import contextlib +from argparse import Namespace +from typing import Any, Optional + +import torch +import torch.nn as nn +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, register_model +from fairseq.models.hubert.hubert import MASKING_DISTRIBUTION_CHOICES +from fairseq.tasks import FairseqTask +from omegaconf import II, MISSING + +from .hubert_asr import HubertAsrConfig +from fairseq.models.transformer import TransformerConfig +logger = logging.getLogger(__name__) + + +@dataclass +class HubertMTConfig(HubertAsrConfig): + load_pretrained_mbart_from: Optional[str] = field( + default=None, + metadata={ + "help": "model to take text encoder decoder weights from (for initialization)" + }, + ) + use_rel_pos_enc: bool = field( + default=True, + metadata={"help": "whether to use relative positional encoding"}, + ) + text_transformer_encoder_layers: int = field( + default=12, + metadata={"help": "reset text_transformer_encoder_layers"}, + ) + + +@register_model("hubert_mt", dataclass=HubertMTConfig) +class HubertMT(BaseFairseqModel): + def __init__(self, cfg: HubertMTConfig, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: HubertMTConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = HubertEncoder(cfg, task.target_dictionary) + return cls(cfg, w2v_encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + if "decoder_out" in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output["decoder_out"], log_probs, sample) + + assert "encoder_out" not in net_output + if "encoder_out" not in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output, log_probs, sample) + + + def get_logits(self, net_output): + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + @property + def encoder(self): + return self.w2v_encoder + + def reorder_encoder_out(self, encoder_out, new_order): + return self.encoder.reorder_encoder_out(encoder_out, new_order) + + @property + def decoder(self): + return self.w2v_encoder.w2v_model.decoder + + +class HubertEncoder(FairseqEncoder): + def __init__(self, cfg: HubertMTConfig, tgt_dict=None): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "decoder_layerdrop": cfg.decoder_layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + "decoder_dict_size": -1, + "add_text_modality": True, + "add_text_encoder": True, + "load_pretrained_mbart_from": None, + "load_pretrained_w2v_from": None, + "text_transformer": { + "encoder":{ + "layers": cfg.text_transformer_encoder_layers, + "layerdrop": cfg.layerdrop, + }, + 'dropout': cfg.dropout, + 'attention_dropout': cfg.attention_dropout, + 'activation_dropout': cfg.activation_dropout, + } + } + if cfg.no_pretrained_weights: + arg_overrides["use_rel_pos_enc"] = cfg.use_rel_pos_enc + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu( + cfg.w2v_path, arg_overrides + ) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + # logger.info("---------------------state.keys()-------------------------------------------") + # logger.info(state.keys()) + # logger.info("---------------------w2v_args.task-------------------------------------------") + # logger.info(w2v_args.task) + # logger.info("---------------------w2v_args.model-------------------------------------------") + # logger.info(w2v_args.model) + # logger.info("----------------------------------------------------------------") + + w2v_args.task.data = cfg.data + w2v_args.task.text_cfg.text_data = cfg.data + w2v_args.task.text_cfg.data_config = None + task = tasks.setup_task(w2v_args.task) + + if state is not None and "task_state" in state: + # This will load the stored "dictionaries" object + task.load_state_dict(state["task_state"]) + + model = task.build_model(w2v_args.model) + + + ### load mbart if specificed + if cfg.load_pretrained_mbart_from is not None and cfg.no_pretrained_weights: + logger.info("Loading mbart....") + mbart_model_state = model.load_checkpoint(cfg.load_pretrained_mbart_from) + model.text_encoder = model.load_pretrained_component_from_model( + component=model.text_encoder, state=mbart_model_state + ) + model.decoder = model.load_pretrained_component_from_model( + component=model.decoder, state=mbart_model_state + ) + + if state is not None and not cfg.no_pretrained_weights: + logger.info("Loading pre-trained models....") + model.load_state_dict(state["model"], strict=True) + + ### remove_pretraining_modules model.remove_pretraining_modules() + model.target_glu = None + model.final_proj = None + model.feature_extractor = None + model.post_extract_proj = None + model.encoder = None + + + + dropout_keys = [ n for n in w2v_args.model.text_transformer if n.find("drop") >= 0 ] + for key in dropout_keys: + logger.info(f"{key}: {w2v_args.model.text_transformer[key]}") + + super().__init__(task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.freeze_decoder_updates = cfg.freeze_decoder_updates + self.num_updates = 0 + + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, src_tokens, src_lengths, prev_output_tokens, tbc=True, **kwargs): + + # ft = self.freeze_finetune_updates <= self.num_updates + w2v_args = { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + "mask": self.apply_mask and self.training, + "prev_output_tokens": prev_output_tokens, + } + + results = self.w2v_model(**w2v_args) + return results + + def get_normalized_probs_decoder(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + return self.w2v_model.get_normalized_probs(net_output, log_probs, sample) + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + if isinstance(encoder_out["encoder_out"], list): + encoder_out["encoder_out"] = ( + [] if len(encoder_out["encoder_out"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out"]] + ) + else: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + if isinstance(encoder_out["encoder_padding_mask"], list): + encoder_out["encoder_padding_mask"] = ( + [] if len(encoder_out["encoder_padding_mask"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"]] + ) + else: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + if "decoder_out" in encoder_out and encoder_out["decoder_out"] is not None: + if isinstance(encoder_out["decoder_out"], list): + encoder_out["decoder_out"] = ( + [] if len(encoder_out["decoder_out"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["decoder_out"]] + ) + else: + encoder_out["decoder_out"] = encoder_out[ + "decoder_out" + ].index_select(0, new_order) + if "encoder_out_for_ctc" in encoder_out and encoder_out["encoder_out_for_ctc"] is not None: + if isinstance(encoder_out["encoder_out_for_ctc"], list): + encoder_out["encoder_out_for_ctc"] = ( + [] if len(encoder_out["encoder_out_for_ctc"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out_for_ctc"]] + ) + else: + encoder_out["encoder_out_for_ctc"] = encoder_out[ + "encoder_out_for_ctc" + ].index_select(1, new_order) + + return encoder_out + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + encoder_out = self.w2v_model.forward_torchscript(net_input) + if "encoder_out_for_ctc" in encoder_out: + del encoder_out['encoder_out_for_ctc'] + + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/YiTrans/yitrans_iwslt22/models/finetune_asr.py b/YiTrans/yitrans_iwslt22/models/finetune_asr.py new file mode 100644 index 0000000..a89b967 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/models/finetune_asr.py @@ -0,0 +1,460 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import contextlib +from argparse import Namespace +from typing import Any, Optional + +import torch +import torch.nn as nn +import pickle +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, register_model +from fairseq.models.hubert.hubert_asr import HubertCtcConfig +from fairseq.tasks import FairseqTask +from omegaconf import II, MISSING + +from yitrans_iwslt22.modules import MultimodalTransformerDecoder + +logger = logging.getLogger(__name__) + +@dataclass +class HubertAsrConfig(HubertCtcConfig): + # for decoder + decoder_layerdrop: float = field( + default=0.1, + metadata={"help": "probability of dropping a decoder layer in hubert"}, + ) + add_decoder: bool = field( + default=False, + metadata={"help": "whether to add decoder for CE Loss on code"}, + ) + reuse_text_emb: bool = field( + default=False, + metadata={"help": "reuse text token embeddings instead of initialize randomly"}, + ) + freeze_decoder_updates: int = field( + default=0, + metadata={"help": "dont finetune hubert for this many updates"}, + ) + share_decoder_input_output_embed: bool = field( + default=False, + metadata={"help": "share decoder input and output embeddings"}, + ) + share_enc_dec_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (text encoder, text decoder)"}, + ) + share_s2t_t2t_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (speech2text(code), text2text)"}, + ) + share_ctc_decoder_embed: bool = field( + default=False, + metadata={"help": "share ctc and decoder embedding (only when share_decoder_input_output_embed is true)"}, + ) + enc_grad_mult: float = field( + default=1.0, + metadata={"help": "reset feature grad mult in hubert to this (only for st2t)"}, + ) + retain_dict_path: Optional[str] = field( + default=None, + metadata={"help": "delete embeddings according to this path"}, + ) + load_step2_model_from: Optional[str] = field( + default=None, + metadata={ + "help": "load step2 model from" + }, + ) + load_pretrained_mbart_from: Optional[str] = field( + default=None, + metadata={ + "help": "model to take text encoder decoder weights from (for initialization)" + }, + ) + load_pretrained_w2v_from: Optional[str] = field( + default=None, + metadata={ + "help": "model to take speech encoder weights from (for initialization)" + }, + ) + use_rel_pos_enc: bool = field( + default=True, + metadata={"help": "whether to use relative positional encoding"}, + ) + encoder_layers: int = field( + default=12, + metadata={"help": "encoder_layers"}, + ) + add_text_encoder: bool = field( + default=True, + metadata={"help": "add_text_encoder"}, + ) + add_adaptor: bool = field( + default=True, + metadata={"help": "add_adaptor"}, + ) + adaptor_stride: int = field( + default=2, + metadata={"help": "adaptor stride"}, + ) + + +@register_model("yitrans_asr", dataclass=HubertAsrConfig) +class YitransASR(BaseFairseqModel): + def __init__(self, cfg: HubertAsrConfig, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + + ### in case we need load hubert_step2 model + if cfg.load_step2_model_from: + logger.info(f"Loading hubert_step2 pretrained model for finetuning: {cfg.load_step2_model_from}") + hubert_step2_states = self.w2v_encoder.w2v_model.load_checkpoint(cfg.load_step2_model_from)["model"] + if cfg.retain_dict_path is not None: + assert self.w2v_encoder.w2v_model.add_text_modality, "Mustc have text modality if retain dict path" + logger.info("Cut embedding to a smaller size according to retain dict") + with open(cfg.retain_dict_path, "rb") as fp: + overlap_idxs = pickle.load(fp) + hubert_step2_states['w2v_encoder.w2v_model.decoder.output_projection.0.weight'] = hubert_step2_states['w2v_encoder.w2v_model.decoder.output_projection.0.weight'][overlap_idxs] + hubert_step2_states["w2v_encoder.w2v_model.decoder.embed_tokens_list.0.weight"] = hubert_step2_states["w2v_encoder.w2v_model.decoder.embed_tokens_list.0.weight"][overlap_idxs] + hubert_step2_states["w2v_encoder.proj.weight"] = hubert_step2_states["w2v_encoder.proj.weight"][overlap_idxs] + try: + self.load_state_dict(hubert_step2_states, strict=True) + except Exception as e: + logger.warn(e) + self.load_state_dict(hubert_step2_states, strict=False) + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: HubertAsrConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = HubertEncoder(cfg, task.target_dictionary) + return cls(cfg, w2v_encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + if "encoder_out" not in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output, log_probs, sample) + + if "encoder_out_for_ctc" in net_output: + logits = net_output["encoder_out_for_ctc"] + else: + logits = net_output["encoder_out"] + + if isinstance(logits, list): + logits = logits[0] + + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + def get_logits(self, net_output): + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + @property + def encoder(self): + return self.w2v_encoder + + def reorder_encoder_out(self, encoder_out, new_order): + return self.encoder.reorder_encoder_out(encoder_out, new_order) + + @property + def decoder(self): + return self.w2v_encoder.w2v_model.decoder + + +class HubertEncoder(FairseqEncoder): + def __init__(self, cfg: HubertAsrConfig, tgt_dict=None): + self.apply_mask = cfg.apply_mask + logger.info(f"self.apply_mask: {self.apply_mask}") + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "decoder_layerdrop": cfg.decoder_layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + "decoder_dict_size": len(tgt_dict) if cfg.add_decoder else -1, + "share_decoder_input_output_embed": cfg.share_decoder_input_output_embed, + "load_pretrained_w2v_from": cfg.load_pretrained_w2v_from, + "load_pretrained_mbart_from": cfg.load_pretrained_mbart_from, + "adaptor_stride": cfg.adaptor_stride, + } + + if cfg.no_pretrained_weights: + arg_overrides["use_rel_pos_enc"] = cfg.use_rel_pos_enc + arg_overrides["encoder_layers"] = cfg.encoder_layers + arg_overrides["add_text_encoder"] = cfg.add_text_encoder + arg_overrides["share_enc_dec_embeddings"] = cfg.share_enc_dec_embeddings + arg_overrides["share_s2t_t2t_embeddings"] = cfg.share_s2t_t2t_embeddings + arg_overrides["add_adaptor"] = cfg.add_adaptor + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + ## in speech_text_joint_to_text, data is loaded by soundfile, which returns without normalization + if cfg.normalize != w2v_args.task.normalize: + logger.warn( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + w2v_args.task.data = cfg.data + if hasattr(w2v_args.task, "text_cfg"): + w2v_args.task.text_cfg.data_config = None + w2v_args.task.add_decoder = cfg.add_decoder + task = tasks.setup_task(w2v_args.task) + if state is not None and "task_state" in state: + # This will load the stored "dictionaries" object + task.load_state_dict(state["task_state"]) + model = task.build_model(w2v_args.model) + + ### delete the embed_tokens and output_projection of decoder + if state is not None and not cfg.no_pretrained_weights: + if cfg.retain_dict_path is not None: + assert model.add_text_modality, "Mustc have text modality if retain dict path" + logger.info("Cut embedding to a smaller size according to ratin dict") + with open(cfg.retain_dict_path, "rb") as fp: + overlap_idxs = pickle.load(fp) + state['model']['decoder.output_projection.1.weight'] = state['model']['decoder.output_projection.1.weight'][overlap_idxs] + state["model"]["decoder.embed_tokens_list.1.weight"] = state["model"]["decoder.embed_tokens_list.1.weight"][overlap_idxs] + if cfg.reuse_text_emb: + assert model.add_text_modality, "Mustc have text modality if reuse text embed" + logger.info("Loading text-text pretrained token-embedding for speech-text finetuning...") + state["model"]["decoder.embed_tokens_list.0.weight"] = state["model"]["decoder.embed_tokens_list.1.weight"] + del state["model"]["decoder.embed_tokens_list.1.weight"] + state["model"]["decoder.output_projection.0.weight"] = state["model"]["decoder.output_projection.1.weight"] + del state["model"]["decoder.output_projection.1.weight"] + try: + model.load_state_dict(state["model"], strict=True) + except Exception as e: + logger.warn(e) + model.load_state_dict(state["model"], strict=False) + else: + for pname in list(state["model"].keys()): + if pname.startswith("decoder.embed_tokens") or pname.startswith("decoder.output_projection"): + del state["model"][pname] + # set strict=False because we omit some modules + model.load_state_dict(state["model"], strict=False) + + ### in case we need load mbart embedding into asr embedding + if cfg.no_pretrained_weights and cfg.load_pretrained_mbart_from and cfg.reuse_text_emb: + logger.info("Loading mbart pretrained token-embedding for speech-text finetuning...") + mbart_dec_states = model.decoder.state_dict() + loading_states = {} + if cfg.retain_dict_path is not None: + logger.info("Cut embedding to a smaller size according to ratin dict") + with open(cfg.retain_dict_path, "rb") as fp: + overlap_idxs = pickle.load(fp) + loading_states["output_projection.0.weight"] = mbart_dec_states['output_projection.1.weight'][overlap_idxs] + loading_states["embed_tokens_list.0.weight"] = mbart_dec_states['embed_tokens_list.1.weight'][overlap_idxs] + else: + loading_states["output_projection.0.weight"] = mbart_dec_states['output_projection.1.weight'] + loading_states["embed_tokens_list.0.weight"] = mbart_dec_states['embed_tokens_list.1.weight'] + model.decoder.load_state_dict(loading_states, strict=False) + + model.remove_pretraining_modules() + + super().__init__(task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.freeze_decoder_updates = cfg.freeze_decoder_updates + self.num_updates = 0 + + if cfg.share_ctc_decoder_embed: + assert cfg.add_decoder and cfg.share_decoder_input_output_embed, "Must share decoder input and output embed before share ctc and decoder embed" + if isinstance(self.w2v_model.decoder, MultimodalTransformerDecoder): + self.proj = nn.Linear( + self.w2v_model.decoder.embed_tokens_list[0].weight.shape[1], + self.w2v_model.decoder.embed_tokens_list[0].weight.shape[0], + bias=False, + ) + self.proj.weight = self.w2v_model.decoder.embed_tokens_list[0].weight + else: + self.proj = nn.Linear( + self.w2v_model.decoder.embed_tokens.weight.shape[1], + self.w2v_model.decoder.embed_tokens.weight.shape[0], + bias=False, + ) + self.proj.weight = self.w2v_model.decoder.embed_tokens.weight + elif tgt_dict is not None: + self.proj = Linear(d, len(tgt_dict)) + elif getattr(cfg, "decoder_embed_dim", d) != d: + self.proj = Linear(d, cfg.decoder_embed_dim) + else: + self.proj = None + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, source, padding_mask, prev_output_tokens=None, tbc=True, **kwargs): + + ft = self.freeze_finetune_updates <= self.num_updates + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + "prev_output_tokens": prev_output_tokens, + "ft": ft, + } + + if self.freeze_decoder_updates <= self.num_updates: + self.w2v_model.add_decoder = True + else: + self.w2v_model.add_decoder = False + + x, padding_mask, decoder_out = self.w2v_model.extract_features(**w2v_args) + + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + if self.proj: + x = self.proj(x) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": padding_mask, # B x T + "padding_mask": padding_mask, + "decoder_out": decoder_out, + } + + def get_normalized_probs_decoder(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + return self.w2v_model.get_normalized_probs(net_output, log_probs, sample) + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + if isinstance(encoder_out["encoder_out"], list): + encoder_out["encoder_out"] = ( + [] if len(encoder_out["encoder_out"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out"]] + ) + else: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + if isinstance(encoder_out["encoder_padding_mask"], list): + encoder_out["encoder_padding_mask"] = ( + [] if len(encoder_out["encoder_padding_mask"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"]] + ) + else: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + if "decoder_out" in encoder_out and encoder_out["decoder_out"] is not None: + if isinstance(encoder_out["decoder_out"], list): + encoder_out["decoder_out"] = ( + [] if len(encoder_out["decoder_out"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["decoder_out"]] + ) + else: + encoder_out["decoder_out"] = encoder_out[ + "decoder_out" + ].index_select(0, new_order) + if "encoder_out_for_ctc" in encoder_out and encoder_out["encoder_out_for_ctc"] is not None: + if isinstance(encoder_out["encoder_out_for_ctc"], list): + encoder_out["encoder_out_for_ctc"] = ( + [] if len(encoder_out["encoder_out_for_ctc"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out_for_ctc"]] + ) + else: + encoder_out["encoder_out_for_ctc"] = encoder_out[ + "encoder_out_for_ctc" + ].index_select(1, new_order) + + return encoder_out + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + encoder_out = self.w2v_model.forward_torchscript(net_input) + + assert self.proj is not None + encoder_out['encoder_out_for_ctc'] = [self.proj(encoder_out['encoder_out'][0])] + + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/YiTrans/yitrans_iwslt22/models/finetune_mt.py b/YiTrans/yitrans_iwslt22/models/finetune_mt.py new file mode 100644 index 0000000..78259ee --- /dev/null +++ b/YiTrans/yitrans_iwslt22/models/finetune_mt.py @@ -0,0 +1,355 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import contextlib +from argparse import Namespace +from typing import Any, Optional + +import torch +import torch.nn as nn +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, register_model +from fairseq.models.hubert.hubert import MASKING_DISTRIBUTION_CHOICES +from fairseq.tasks import FairseqTask +from omegaconf import II, MISSING + +from fairseq.models.hubert.hubert_asr import HubertCtcConfig +from fairseq.models.transformer import TransformerConfig +logger = logging.getLogger(__name__) + + +@dataclass +class HubertMTConfig(HubertCtcConfig): + use_rel_pos_enc: bool = field( + default=True, + metadata={"help": "whether to use relative positional encoding"}, + ) + # for decoder + decoder_layerdrop: float = field( + default=0.1, + metadata={"help": "probability of dropping a decoder layer in hubert"}, + ) + add_decoder: bool = field( + default=False, + metadata={"help": "whether to add decoder for CE Loss on code"}, + ) + reuse_text_emb: bool = field( + default=False, + metadata={"help": "reuse text token embeddings instead of initialize randomly"}, + ) + freeze_decoder_updates: int = field( + default=0, + metadata={"help": "dont finetune hubert for this many updates"}, + ) + share_decoder_input_output_embed: bool = field( + default=False, + metadata={"help": "share decoder input and output embeddings"}, + ) + share_enc_dec_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (text encoder, text decoder)"}, + ) + share_s2t_t2t_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (speech2text(code), text2text)"}, + ) + share_ctc_decoder_embed: bool = field( + default=False, + metadata={"help": "share ctc and decoder embedding (only when share_decoder_input_output_embed is true)"}, + ) + enc_grad_mult: float = field( + default=1.0, + metadata={"help": "reset feature grad mult in hubert to this (only for st2t)"}, + ) + retain_dict_path: Optional[str] = field( + default=None, + metadata={"help": "delete embeddings according to this path"}, + ) + load_pretrained_mbart_from: Optional[str] = field( + default=None, + metadata={ + "help": "model to take text encoder decoder weights from (for initialization)" + }, + ) + text_transformer_encoder_layers: int = field( + default=12, + metadata={"help": "reset text_transformer_encoder_layers"}, + ) + +@register_model("finetune_mt", dataclass=HubertMTConfig) +class YitransMT(BaseFairseqModel): + def __init__(self, cfg: HubertMTConfig, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: HubertMTConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = HubertEncoder(cfg, task.target_dictionary) + return cls(cfg, w2v_encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + if "decoder_out" in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output["decoder_out"], log_probs, sample) + + assert "encoder_out" not in net_output + if "encoder_out" not in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output, log_probs, sample) + + + def get_logits(self, net_output): + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + @property + def encoder(self): + return self.w2v_encoder + + def reorder_encoder_out(self, encoder_out, new_order): + return self.encoder.reorder_encoder_out(encoder_out, new_order) + + @property + def decoder(self): + return self.w2v_encoder.w2v_model.decoder + + +class HubertEncoder(FairseqEncoder): + def __init__(self, cfg: HubertMTConfig, tgt_dict=None): + self.apply_mask = cfg.apply_mask + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "decoder_layerdrop": cfg.decoder_layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + "decoder_dict_size": -1, + "add_text_modality": True, + "add_text_encoder": True, + "load_pretrained_mbart_from": None, + "load_pretrained_w2v_from": None, + "text_transformer": { + "encoder":{ + "layers": cfg.text_transformer_encoder_layers, + "layerdrop": cfg.layerdrop, + }, + 'dropout': cfg.dropout, + 'attention_dropout': cfg.attention_dropout, + 'activation_dropout': cfg.activation_dropout, + } + } + if cfg.no_pretrained_weights: + arg_overrides["use_rel_pos_enc"] = cfg.use_rel_pos_enc + arg_overrides["share_enc_dec_embeddings"] = cfg.share_enc_dec_embeddings + arg_overrides["share_s2t_t2t_embeddings"] = cfg.share_s2t_t2t_embeddings + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu( + cfg.w2v_path, arg_overrides + ) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + # logger.info("---------------------state.keys()-------------------------------------------") + # logger.info(state.keys()) + # logger.info("---------------------w2v_args.task-------------------------------------------") + # logger.info(w2v_args.task) + # logger.info("---------------------w2v_args.model-------------------------------------------") + # logger.info(w2v_args.model) + # logger.info("----------------------------------------------------------------") + + w2v_args.task.data = cfg.data + w2v_args.task.text_cfg.text_data = cfg.data + w2v_args.task.text_cfg.data_config = None + task = tasks.setup_task(w2v_args.task) + + if state is not None and "task_state" in state: + # This will load the stored "dictionaries" object + task.load_state_dict(state["task_state"]) + + model = task.build_model(w2v_args.model) + + + ### load mbart if specificed + if cfg.load_pretrained_mbart_from is not None and cfg.no_pretrained_weights: + logger.info("Loading mbart....") + mbart_model_state = model.load_checkpoint(cfg.load_pretrained_mbart_from) + model.text_encoder = model.load_pretrained_component_from_model( + component=model.text_encoder, state=mbart_model_state + ) + model.decoder = model.load_pretrained_component_from_model( + component=model.decoder, state=mbart_model_state + ) + + if state is not None and not cfg.no_pretrained_weights: + logger.info("Loading pre-trained models....") + model.load_state_dict(state["model"], strict=True) + + ### remove_pretraining_modules model.remove_pretraining_modules() + model.target_glu = None + model.final_proj = None + model.feature_extractor = None + model.post_extract_proj = None + model.encoder = None + + + + dropout_keys = [ n for n in w2v_args.model.text_transformer if n.find("drop") >= 0 ] + for key in dropout_keys: + logger.info(f"{key}: {w2v_args.model.text_transformer[key]}") + + super().__init__(task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.freeze_decoder_updates = cfg.freeze_decoder_updates + self.num_updates = 0 + + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, src_tokens, src_lengths, prev_output_tokens, tbc=True, **kwargs): + + # ft = self.freeze_finetune_updates <= self.num_updates + w2v_args = { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + "mask": self.apply_mask and self.training, + "prev_output_tokens": prev_output_tokens, + } + + results = self.w2v_model(**w2v_args) + return results + + def get_normalized_probs_decoder(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + return self.w2v_model.get_normalized_probs(net_output, log_probs, sample) + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + if isinstance(encoder_out["encoder_out"], list): + encoder_out["encoder_out"] = ( + [] if len(encoder_out["encoder_out"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out"]] + ) + else: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + if isinstance(encoder_out["encoder_padding_mask"], list): + encoder_out["encoder_padding_mask"] = ( + [] if len(encoder_out["encoder_padding_mask"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"]] + ) + else: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + if "decoder_out" in encoder_out and encoder_out["decoder_out"] is not None: + if isinstance(encoder_out["decoder_out"], list): + encoder_out["decoder_out"] = ( + [] if len(encoder_out["decoder_out"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["decoder_out"]] + ) + else: + encoder_out["decoder_out"] = encoder_out[ + "decoder_out" + ].index_select(0, new_order) + if "encoder_out_for_ctc" in encoder_out and encoder_out["encoder_out_for_ctc"] is not None: + if isinstance(encoder_out["encoder_out_for_ctc"], list): + encoder_out["encoder_out_for_ctc"] = ( + [] if len(encoder_out["encoder_out_for_ctc"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out_for_ctc"]] + ) + else: + encoder_out["encoder_out_for_ctc"] = encoder_out[ + "encoder_out_for_ctc" + ].index_select(1, new_order) + + return encoder_out + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + encoder_out = self.w2v_model.forward_torchscript(net_input) + if "encoder_out_for_ctc" in encoder_out: + del encoder_out['encoder_out_for_ctc'] + + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/YiTrans/yitrans_iwslt22/models/finetune_st.py b/YiTrans/yitrans_iwslt22/models/finetune_st.py new file mode 100644 index 0000000..37e75be --- /dev/null +++ b/YiTrans/yitrans_iwslt22/models/finetune_st.py @@ -0,0 +1,434 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import contextlib +import pickle +from argparse import Namespace +from typing import Any, Optional + +import torch +import torch.nn as nn +import torch.nn.functional as F +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, register_model +from fairseq.models.hubert.hubert_asr import HubertCtcConfig, HubertAsrConfig +from fairseq.tasks import FairseqTask +from fairseq.data.data_utils import lengths_to_padding_mask +from omegaconf import II, open_dict + + +logger = logging.getLogger(__name__) + +@dataclass +class HubertSt2tCtcConfig(HubertCtcConfig): + load_speech_only: bool = II("task.load_speech_only") + ## for decoder overrides + decoder_layerdrop: float = field( + default=0.1, + metadata={"help": "probability of dropping a decoder layer in hubert"}, + ) + add_decoder: bool = field( + default=False, + metadata={"help": "whether to add decoder for CE Loss on code"}, + ) + reuse_text_emb: bool = field( + default=False, + metadata={"help": "reuse text token embeddings instead of initialize randomly"}, + ) + freeze_decoder_updates: int = field( + default=0, + metadata={"help": "dont finetune hubert for this many updates"}, + ) + # share_enc_dec_embeddings: bool = field( + # default=False, + # metadata={"help": "share embeddings of (text encoder, text decoder)"}, + # ) + share_s2t_t2t_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (speech2text(code), text2text)"}, + ) + share_ctc_decoder_embed: bool = field( + default=False, + metadata={"help": "share ctc and decoder embedding (only when share_decoder_input_output_embed is true)"}, + ) + enc_grad_mult: float = field( + default=1.0, + metadata={"help": "reset feature grad mult in hubert to this (only for st2t)"}, + ) + retain_dict_path: Optional[str] = field( + default=None, + metadata={"help": "delete embeddings according to this path"}, + ) + load_step2_model_from: Optional[str] = field( + default=None, + metadata={ + "help": "load step2 model from" + }, + ) + + # for other overrides + adaptor_stride: int = field( + default=2, + metadata={"help": "adaptor stride"}, + ) + +@register_model("hubert_st2t", dataclass=HubertSt2tCtcConfig) +class HubertST2T(BaseFairseqModel): + def __init__(self, cfg: HubertSt2tCtcConfig, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + self.num_updates = 0 + + ### in case we need load hubert_step2 model + if cfg.load_step2_model_from: + logger.info(f"Loading hubert_step2 pretrained model for finetuning: {cfg.load_step2_model_from}") + hubert_step2_states = self.w2v_encoder.w2v_model.load_checkpoint(cfg.load_step2_model_from)["model"] + if cfg.retain_dict_path is not None: + with open(cfg.retain_dict_path, "rb") as fp: + overlap_idxs = pickle.load(fp) + if hubert_step2_states['w2v_encoder.w2v_model.decoder.output_projection.0.weight'].size(0) != len(overlap_idxs): + assert self.w2v_encoder.w2v_model.add_text_modality, "Mustc have text modality if retain dict path" + logger.info("Cut embedding to a smaller size according to retain dict") + hubert_step2_states['w2v_encoder.w2v_model.decoder.output_projection.0.weight'] = hubert_step2_states['w2v_encoder.w2v_model.decoder.output_projection.0.weight'][overlap_idxs] + hubert_step2_states["w2v_encoder.w2v_model.decoder.embed_tokens_list.0.weight"] = hubert_step2_states["w2v_encoder.w2v_model.decoder.embed_tokens_list.0.weight"][overlap_idxs] + if hubert_step2_states.get("w2v_encoder.w2v_model.text_encoder.embed_tokens.weight") is not None: + hubert_step2_states["w2v_encoder.w2v_model.text_encoder.embed_tokens.weight"] = hubert_step2_states["w2v_encoder.w2v_model.text_encoder.embed_tokens.weight"][overlap_idxs] + else: + logger.info(f"cfg.load_step2_model_from matches the cut embedding dims {len(overlap_idxs)}, no cutting needs to do") + if not self.cfg.load_speech_only and hubert_step2_states.get("w2v_encoder.w2v_model.text_encoder.embed_tokens.weight", None) is None: + hubert_step2_states["w2v_encoder.w2v_model.text_encoder.embed_tokens.weight"] = hubert_step2_states["w2v_encoder.w2v_model.decoder.embed_tokens_list.0.weight"] + try: + self.load_state_dict(hubert_step2_states, strict=True) + except Exception as e: + logger.warn(e) + self.load_state_dict(hubert_step2_states, strict=False) + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: HubertSt2tCtcConfig, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = HubertEncoder(cfg, task.target_dictionary) + return cls(cfg, w2v_encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + if "encoder_out" not in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output, log_probs, sample) + + if "encoder_out_for_ctc" in net_output: + logits = net_output["encoder_out_for_ctc"] + else: + logits = net_output["encoder_out"] + + if isinstance(logits, list): + logits = logits[0] + + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + def get_logits(self, net_output): + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + @property + def encoder(self): + return self.w2v_encoder + + def reorder_encoder_out(self, encoder_out, new_order): + return self.encoder.reorder_encoder_out(encoder_out, new_order) + + @property + def decoder(self): + return self.w2v_encoder.w2v_model.decoder + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + +class HubertEncoder(FairseqEncoder): + def __init__(self, cfg: HubertAsrConfig, tgt_dict=None): + self.apply_mask = cfg.apply_mask + logger.info(f"self.apply_mask: {self.apply_mask}") + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "decoder_layerdrop": cfg.decoder_layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + "decoder_dict_size": len(tgt_dict) if cfg.add_decoder else -1, + "share_decoder_input_output_embed": cfg.share_decoder_input_output_embed, + "load_pretrained_w2v_from": cfg.load_pretrained_w2v_from, + "load_pretrained_mbart_from": None, + "adaptor_stride": cfg.adaptor_stride, + "share_speech_text_embeddings": cfg.share_speech_text_embeddings, + } + + if cfg.no_pretrained_weights: + arg_overrides["use_rel_pos_enc"] = cfg.use_rel_pos_enc + arg_overrides["encoder_layers"] = cfg.encoder_layers + arg_overrides["add_text_encoder"] = cfg.add_text_encoder + arg_overrides["share_all_embeddings"] = cfg.share_all_embeddings + arg_overrides["add_adaptor"] = cfg.add_adaptor + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + ## in speech_text_joint_to_text, data is loaded by soundfile, which returns without normalization + self.need_preprocess = w2v_args.task.normalize + logger.warn("We need normalize the input wavform from the src_tokens") + + if cfg.normalize != w2v_args.task.normalize: + logger.warn( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + if not "share_speech_text_embeddings" in w2v_args.model: + with open_dict(w2v_args.model): + w2v_args.model.share_speech_text_embedding = cfg.share_speech_text_embeddings + logger.info(f"share_speech_text_embeddings: {(getattr(w2v_args.model, 'share_speech_text_embeddings', False))}") + w2v_args.task.data = cfg.data + w2v_args.task.add_decoder = cfg.add_decoder + assert w2v_args.model._name == "hubert" + + task = tasks.setup_task(w2v_args.task) + if state is not None and "task_state" in state: + # This will load the stored "dictionaries" object + task.load_state_dict(state["task_state"]) + model = task.build_model(w2v_args.model) + + ### modify the embed_tokens and output_projection of decoder + if state is not None and not cfg.no_pretrained_weights: + model_states = self.modify_states(state['model'], cfg.retain_dict_path, cfg.reuse_text_emb) + try: + model.load_state_dict(model_states, strict=True) + except Exception as e: + logger.warn(e) + model.load_state_dict(model_states, strict=False) + + ### in case we need load mbart + if cfg.no_pretrained_weights and cfg.load_pretrained_mbart_from: + logger.info("Loading mbart ...") + mbart_state = model.load_checkpoint(cfg.load_pretrained_mbart_from) + mbart_state["model"] = self.modify_states(mbart_state["model"], cfg.retain_dict_path, cfg.reuse_text_emb, is_mbart=True) + model.text_encoder = model.load_pretrained_component_from_model( + component=model.text_encoder, state=mbart_state + ) + model.decoder = model.load_pretrained_component_from_model( + component=model.decoder, state=mbart_state + ) + + model.remove_pretraining_modules(step2=(not cfg.load_speech_only)) + # model.remove_pretraining_modules() + + super().__init__(task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.freeze_decoder_updates = cfg.freeze_decoder_updates + self.num_updates = 0 + self.enc_grad_mult = cfg.enc_grad_mult + + def modify_states(self, model_states, retain_dict_path=None, reuse_text_emb=False, is_mbart=False): + if retain_dict_path is not None: + logger.info("Cut embedding to a smaller size according to retain dict") + with open(retain_dict_path, "rb") as fp: + overlap_idxs = pickle.load(fp) + if is_mbart: + model_states["decoder.embed_tokens_list.1.weight"] = model_states["decoder.embed_tokens.weight"][overlap_idxs] + model_states["decoder.output_projection.1.weight"] = model_states["decoder.output_projection.weight"][overlap_idxs] + model_states["decoder.embed_tokens.weight"] = model_states["decoder.embed_tokens.weight"][overlap_idxs] + model_states["decoder.output_projection.weight"] = model_states["decoder.output_projection.weight"][overlap_idxs] + model_states["encoder.embed_tokens.weight"] = model_states["encoder.embed_tokens.weight"][overlap_idxs] + else: + model_states['decoder.output_projection.1.weight'] = model_states['decoder.output_projection.1.weight'][overlap_idxs] + model_states["decoder.embed_tokens_list.1.weight"] = model_states["decoder.embed_tokens_list.1.weight"][overlap_idxs] + model_states["text_encoder.embed_tokens.weight"] = model_states["text_encoder.embed_tokens.weight"][overlap_idxs] + if reuse_text_emb: + logger.info("Loading decoder.embed_tokens_list.0 <-- decoder.embed_tokens_list.1") + model_states["decoder.embed_tokens_list.0.weight"] = model_states["decoder.embed_tokens_list.1.weight"] + model_states["decoder.output_projection.0.weight"] = model_states["decoder.output_projection.1.weight"] + del model_states["decoder.embed_tokens_list.1.weight"] + del model_states["decoder.output_projection.1.weight"] + return model_states + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, src_tokens=None, src_lengths=None, src_txt_tokens=None, src_txt_lengths=None, prev_output_tokens=None, tbc=True, **kwargs): + padding_mask = lengths_to_padding_mask(src_lengths) + if self.need_preprocess: + src_tokens = torch.stack([F.layer_norm(wav, wav.shape) for wav in src_tokens]) + src_tokens[padding_mask] = 0.0 + + ft = self.freeze_finetune_updates <= self.num_updates + w2v_args = { + "source": src_tokens, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + "prev_output_tokens": prev_output_tokens, + "ft": ft, + "enc_grad_mult": self.enc_grad_mult, + } + + if self.freeze_decoder_updates <= self.num_updates: + self.w2v_model.add_decoder = True + else: + self.w2v_model.add_decoder = False + + x, padding_mask, decoder_out = self.w2v_model.extract_features(**w2v_args) + + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + if src_txt_tokens is not None: + w2v_args_text = { + "src_tokens": src_txt_tokens, + "src_lengths": src_txt_lengths, + "prev_output_tokens": prev_output_tokens, + } + + decoder_output_text = self.w2v_model(**w2v_args_text) + decoder_out = (torch.cat([decoder_out[0], decoder_output_text['decoder_out'][0]], dim=0), {"attn_cost": None}) + + return decoder_out + + def get_normalized_probs_decoder(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + return self.w2v_model.get_normalized_probs(net_output, log_probs, sample) + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + if isinstance(encoder_out["encoder_out"], list): + encoder_out["encoder_out"] = ( + [] if len(encoder_out["encoder_out"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out"]] + ) + else: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + if isinstance(encoder_out["encoder_padding_mask"], list): + encoder_out["encoder_padding_mask"] = ( + [] if len(encoder_out["encoder_padding_mask"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"]] + ) + else: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + if "decoder_out" in encoder_out and encoder_out["decoder_out"] is not None: + if isinstance(encoder_out["decoder_out"], list): + encoder_out["decoder_out"] = ( + [] if len(encoder_out["decoder_out"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["decoder_out"]] + ) + else: + encoder_out["decoder_out"] = encoder_out[ + "decoder_out" + ].index_select(0, new_order) + + return encoder_out + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + padding_mask = lengths_to_padding_mask(net_input["src_lengths"]) + src_tokens = net_input["src_tokens"] + if self.need_preprocess: + src_tokens = torch.stack([F.layer_norm(wav, wav.shape) for wav in src_tokens]) + src_tokens[padding_mask] = 0.0 + + _net_input = { + "source": src_tokens, + "padding_mask": padding_mask, + } + + encoder_out = self.w2v_model.forward_torchscript(_net_input) + + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/YiTrans/yitrans_iwslt22/models/pretrain_ed.py b/YiTrans/yitrans_iwslt22/models/pretrain_ed.py new file mode 100644 index 0000000..a07fab7 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/models/pretrain_ed.py @@ -0,0 +1,698 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import contextlib +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Tuple, Union +from collections import OrderedDict + +import copy +import torch +from omegaconf import II + +from fairseq import checkpoint_utils +from fairseq.data.dictionary import Dictionary +from fairseq.dataclass import ChoiceEnum +from fairseq.models import register_model, FairseqDecoder +from fairseq.models.transformer import ( + TransformerEncoderBase, + TransformerConfig, +) +from fairseq.models.speech_to_text import Conv1dAdaptor +from fairseq.models.transformer import Embedding +from fairseq.file_io import PathManager +from torch import Tensor +from fairseq.models.wav2vec.wav2vec2 import ConvFeatureExtractionModel +from fairseq.modules import GradMultiply + +from fairseq.models.hubert import HubertConfig, HubertModel + +from fairseq.models.wav2vec.wav2vec2 import TransformerEncoder as W2vTransformerEncoder +from yitrans_iwslt22.modules.w2v_encoder import TransformerEncoder +from yitrans_iwslt22.modules.transformer_decoder import TransformerDecoderScriptable +from yitrans_iwslt22.modules.multimodal_transformer_decoder import MultimodalTransformerDecoder +from yitrans_iwslt22.tasks.iwslt_joint_pretraining import ( + JointPretrainingConfig, + JointPretrainingTask, +) + +logger = logging.getLogger(__name__) + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +@dataclass +class JointEDConfig(HubertConfig): + use_rel_pos_enc: bool = field( + default=False, + metadata={"help": "whether to use relative positional encoding"}, + ) + + # decoder + decoder_layers: int = field( + default=6, metadata={"help": "num decoder layers in the transformer"} + ) + decoder_embed_dim: int = field( + default=768, metadata={"help": "decoder embedding dimension"} + ) + decoder_ffn_embed_dim: int = field( + default=3072, metadata={"help": "decoder embedding dimension for FFN"} + ) + decoder_attention_heads: int = field( + default=12, metadata={"help": "num decoder attention heads"} + ) + decoder_normalize_before: bool = field( + default=False, + metadata={"help": "apply layernorm before each decoder block"}, + ) + layernorm_embedding: bool = field( + default=False, + metadata={"help": "apply layernorm to embedding for decoder"}, + ) + decoder_layerdrop: float = field( + default=0.1, + metadata={"help": "probability of dropping a tarnsformer layer"}, + ) + share_decoder_input_output_embed: bool = field( + default=False, + metadata={"help": "share decoder input and output embeddings"}, + ) + share_enc_dec_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (text encoder, text decoder)"}, + ) + share_s2t_t2t_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (speech2text(code), text2text)"}, + ) + decoder_output_dim: int = field( + default=768, metadata={"help": "decoder output dimension"} + ) + max_target_positions: int = field( + default=3000, metadata={"help": "max target position"} + ) + no_scale_embedding: bool = field( + default=False, + metadata={"help": "not scale embedding"}, + ) + adaptive_input: bool = field( + default=False, + metadata={"help": "adaptive input"}, + ) + quant_noise_pq: int = field( + default=0, metadata={"help": "quant noise pq"} + ) + decoder_learned_pos: bool = field( + default=False, + metadata={"help": "decoder learnable positional embedding"}, + ) + no_token_positional_embeddings: bool = field( + default=False, + metadata={"help": "no token positional embeddings"}, + ) + add_text_modality: bool = field( + default=-False, + metadata={"help": "add text modality, mainly used in pretrainnig"}, + ) + add_text_encoder: bool = field( + default=False, + metadata={"help": "add_text_encoder"}, + ) + share_text_encoder: bool = field( + default=True, + metadata={"help": "share text encoder so that speech branch go through it"}, + ) + split_attention: bool = field( + default=False, + metadata={"help": "use shared but split encoders"}, + ) + add_adaptor: bool = field( + default=False, + metadata={"help": "add adaptor and text encoder on the top of speech encoder"}, + ) + adaptor_n_layers: int = field( + default=3, + metadata={"help": "number of layers for adaptor"}, + ) + adaptor_kernel_size: int = field( + default=3, + metadata={"help": "kernel size for adaptor"}, + ) + adaptor_stride: int = field( + default=2, + metadata={"help": "adaptor stride"}, + ) + adaptor_layernorm: bool = field( + default=False, + metadata={"help": "adaptor layernorm"}, + ) + # Finetune related + decoder_dict_size: int = field( + default=-1, + metadata={"help": "decoder dictionary dimension"}, + ) + + # text encoder related, TransformerConfig is used in bart but we only use its enconder + text_transformer: TransformerConfig = TransformerConfig() + + # other + checkpoint_activations: bool = field( + default=False, metadata={"help": "recompute activations and save memory for extra compute"} + ) + + # Load pre-train model + load_pretrained_mbart_from: Optional[str] = field( + default=None, + metadata={ + "help": "model to take text encoder decoder weights from (for initialization)" + }, + ) + load_pretrained_w2v_from: Optional[str] = field( + default=None, + metadata={ + "help": "model to take speech encoder weights from (for initialization)" + }, + ) + + # FP16 optimization + required_seq_len_multiple: int = field( + default=1, + metadata={ + "help": "pad the input to encoder such that the sequence length is divisible by multiple" + }, + ) + crop_seq_to_multiple: int = field( + default=1, + metadata={ + "help": "crop convolutional feature extractor output such that the sequence length is divisible by multiple" + }, + ) + +@register_model("joint_ed", dataclass=JointEDConfig) +class JointEDModel(HubertModel): + def __init__( + self, + cfg: JointEDConfig, + task_cfg: JointPretrainingConfig, + dictionaries: List[Dictionary], + text_dictionary: Dictionary = None, + ) -> None: + super().__init__(cfg, task_cfg, dictionaries) + logger.info(f"JointEDModel Config: {cfg}") + + self.encoder = TransformerEncoder(cfg) + + ### build speeech-text joint_pretrain net from: + ### - add_text_modality is false: no text network + ### - add_text_modality is true, add_text_encoder=False: build text embedding + ### - add_text_modality is true, add_text_encoder=True: build text embedding and encoder + assert cfg.add_text_modality + assert cfg.add_text_encoder + assert cfg.share_text_encoder + assert text_dictionary is not None + self.add_text_modality = cfg.add_text_modality + self.add_text_encoder = cfg.add_text_encoder + self.share_text_encoder = cfg.share_text_encoder + + if cfg.share_s2t_t2t_embeddings: + text_dictionary = self.cutting_dictionary(text_dictionary, cfg.decoder_dict_size) + + ### build text encoder + text_encoder_embed_tokens = self.build_embedding( + text_dictionary, cfg.text_transformer.encoder.embed_dim + ) + self.text_encoder = TransformerEncoderBase( + cfg.text_transformer, + text_dictionary, + text_encoder_embed_tokens + ) + + ### build text decoder + self.add_decoder = task_cfg.add_decoder + if self.add_decoder: + # To make sure that the decoder dict size is the same as the fine-tuning tgt_dict size or bpe code dict size + s2t_dec_dict = self.cutting_dictionary(dictionaries[0], cfg.decoder_dict_size) + if text_dictionary is None: + decoder_dict_list = [s2t_dec_dict] + else: + decoder_dict_list = [s2t_dec_dict, text_dictionary] + + decoder_embed_tokens = [ + self.build_embedding(dictionary, cfg.decoder_embed_dim) + for dictionary in decoder_dict_list + ] + + if cfg.share_enc_dec_embeddings and text_dictionary is not None: + assert cfg.share_decoder_input_output_embed, "Must share decoder input-output embed before share encoder-decoder embed" + logger.info("--------------------------------: share input-output embeddings") + decoder_embed_tokens[-1] = text_encoder_embed_tokens + + if cfg.share_s2t_t2t_embeddings: + logger.info("--------------------------------: share s2t-t2t embeddings") + assert len(s2t_dec_dict) == len(text_dictionary), "s2t embed len must be equal to t2t embed len" + decoder_embed_tokens[0] = text_encoder_embed_tokens + + if len(decoder_embed_tokens) == 1: + self.decoder = TransformerDecoderScriptable(cfg, decoder_dict_list[0], decoder_embed_tokens[0]) + else: + self.decoder = MultimodalTransformerDecoder(cfg, decoder_dict_list, decoder_embed_tokens) + + self.add_adaptor = cfg.add_adaptor + if self.add_adaptor: + assert self.add_text_encoder, "Cannot shared encoder for text and speech once add adaptor" + self.adaptor = Conv1dAdaptor( + cfg.encoder_embed_dim, + cfg.decoder_embed_dim, + n_layers=cfg.adaptor_n_layers, + kernel_size=cfg.adaptor_kernel_size, + stride=cfg.adaptor_stride, + add_layernorm=cfg.adaptor_layernorm, + ) + + if cfg.load_pretrained_w2v_from is not None: + w2v_model_state = self.load_checkpoint(cfg.load_pretrained_w2v_from) + self.feature_extractor = self.load_pretrained_component_from_model( + component=self.feature_extractor, state=w2v_model_state + ) + + self.encoder = self.load_pretrained_component_from_model( + component=self.encoder, state=w2v_model_state + ) + + self.post_extract_proj.weight = torch.nn.Parameter(w2v_model_state["model"]["post_extract_proj.weight"]) + self.post_extract_proj.bias = torch.nn.Parameter(w2v_model_state["model"]["post_extract_proj.bias"]) + + # self.final_proj.weight = torch.nn.Parameter(w2v_model_state["model"]["final_proj.weight"]) + # self.final_proj.bias = torch.nn.Parameter(w2v_model_state["model"]["final_proj.bias"]) + + self.layer_norm.weight = torch.nn.Parameter(w2v_model_state["model"]["layer_norm.weight"]) + self.layer_norm.bias = torch.nn.Parameter(w2v_model_state["model"]["layer_norm.bias"]) + + # self.label_embs_concat.data = torch.nn.Parameter(w2v_model_state["model"]["label_embs_concat"]) + self.mask_emb.data = torch.nn.Parameter(w2v_model_state["model"]["mask_emb"]) + + if cfg.load_pretrained_mbart_from is not None: + mbart_model_state = self.load_checkpoint(cfg.load_pretrained_mbart_from) + if self.add_text_modality and self.add_text_encoder: + self.text_encoder = self.load_pretrained_component_from_model( + component=self.text_encoder, state=mbart_model_state + ) + if self.add_decoder: + self.decoder = self.load_pretrained_component_from_model( + component=self.decoder, state=mbart_model_state + ) + + def cutting_dictionary(self, dictionary, dict_size): + if dictionary is None or dict_size <= 0: + return dictionary + else: + cut_dictionary = copy.deepcopy(dictionary) + if dict_size > len(cut_dictionary): + for i in range(dict_size - len(cut_dictionary)): + cut_dictionary.symbols.append(f'_{i}_') + else: + cut_dictionary.symbols = cut_dictionary.symbols[:dict_size] + return cut_dictionary + + def build_embedding(self, dictionary, embed_dim): + num_embeddings = len(dictionary) + padding_idx = dictionary.pad() + return Embedding(num_embeddings, embed_dim, padding_idx) + + @classmethod + def build_model(cls, cfg: HubertConfig, task: JointPretrainingTask): + """Build a new model instance.""" + # Change dict size for bpe code + if hasattr(task, "hubert_tokenizer") and task.hubert_tokenizer is not None and not task.fine_tuning and cfg.decoder_dict_size == -1: + cfg.decoder_dict_size = len(task.hubert_tokenizer.sp) + logger.info(f"Use acoustic pieces as code, set decoder dict size to {len(task.hubert_tokenizer.sp)}") + + text_dictionary = getattr(task, "text_dictionary", None) + model = JointEDModel(cfg, task.cfg, task.dictionaries, text_dictionary) + return model + + def get_normalized_probs( + self, + net_output: Tuple[Tensor, Optional[Dict[str, List[Optional[Tensor]]]]], + log_probs: bool, + sample: Optional[Dict[str, Tensor]] = None, + ): + # net_output['encoder_out'] is a (B, T, D) tensor + lprobs = self.get_normalized_probs_scriptable(net_output, log_probs, sample) + lprobs.batch_first = True + return lprobs + + def forward( + self, + source: torch.Tensor = None, + src_tokens: torch.Tensor = None, + src_lengths: torch.Tensor = None, + target_list: Optional[List[torch.Tensor]] = None, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = True, + features_only: bool = False, + output_layer: Optional[int] = None, + prev_output_tokens: Optional[torch.Tensor] = None, + text_modal_idx: Optional[int] = -1, + ) -> Dict[str, torch.Tensor]: + """output layer is 1-based""" + assert source is not None or src_tokens is not None + if source is not None: + ### 1. go speech cnn-encoder-decoder branch + features = self.forward_features(source) + if target_list is not None: + features, target_list = self.forward_targets(features, target_list) + + features_pen = features.float().pow(2).mean() + + features = features.transpose(1, 2) + features = self.layer_norm(features) + unmasked_features = features.clone() + + if padding_mask is not None: + padding_mask = self.forward_padding_mask(features, padding_mask) + + if self.post_extract_proj is not None: + features = self.post_extract_proj(features) + + features = self.dropout_input(features) + unmasked_features = self.dropout_features(unmasked_features) + + if mask: + x, mask_indices = self.apply_mask(features, padding_mask, target_list) + else: + x = features + mask_indices = None + + # feature: (B, T, D), float + # target: (B, T), long + # x: (B, T, D), float + # padding_mask: (B, T), bool + # mask_indices: (B, T), bool + x, _ = self.encoder( + x, + padding_mask=padding_mask, + layer=None if output_layer is None else output_layer - 1, + ) + + if features_only: + return {"x": x, "padding_mask": padding_mask, "features": features} + + def compute_pred(proj_x, target, label_embs): + # compute logits for the i-th label set + y = torch.index_select(label_embs, 0, target.long()) + negs = label_embs.unsqueeze(1).expand(-1, proj_x.size(0), -1) + if self.target_glu: + y = self.target_glu(y) + negs = self.target_glu(negs) + # proj_x: (S, D) + # y: (S, D) + # negs: (Neg, S, D) + return self.compute_nce(proj_x, y, negs) + + label_embs_list = self.label_embs_concat.split(self.num_classes, 0) + + if not self.skip_masked: + masked_indices = torch.logical_and(~padding_mask, mask_indices) + proj_x_m = self.final_proj(x[masked_indices]) + if self.untie_final_proj: + proj_x_m_list = proj_x_m.chunk(len(target_list), dim=-1) + else: + proj_x_m_list = [proj_x_m for _ in range(len(target_list))] + logit_m_list = [ + compute_pred(proj_x_m, t[masked_indices], label_embs_list[i]) + for i, (proj_x_m, t) in enumerate(zip(proj_x_m_list, target_list)) + ] + else: + logit_m_list = [None for _ in target_list] + + if not self.skip_nomask: + nomask_indices = torch.logical_and(~padding_mask, ~mask_indices) + proj_x_u = self.final_proj(x[nomask_indices]) + if self.untie_final_proj: + proj_x_u_list = proj_x_u.chunk(len(target_list), dim=-1) + else: + proj_x_u_list = [proj_x_u for _ in range(len(target_list))] + + logit_u_list = [ + compute_pred(proj_x_u, t[nomask_indices], label_embs_list[i]) + for i, (proj_x_u, t) in enumerate(zip(proj_x_u_list, target_list)) + ] + else: + logit_u_list = [None for _ in target_list] + + result = { + "logit_m_list": logit_m_list, + "logit_u_list": logit_u_list, + "padding_mask": padding_mask, + "features_pen": features_pen, + } + + x = x.transpose(0, 1) # T x B x C + # adaptor layers + if self.add_adaptor: + x, padding_mask = self.adaptor(x, padding_mask) + + # text encoder layers + if self.add_text_encoder and self.share_text_encoder: + for layer in self.text_encoder.layers: + x = layer( + x, encoder_padding_mask=padding_mask + ) + if self.text_encoder.layer_norm is not None: + x = self.text_encoder.layer_norm(x) + + # decoder layers + if self.add_decoder: + encoder_out = { + "encoder_out": [x], # T x B x C + "encoder_padding_mask": [padding_mask], # B x T + } + assert prev_output_tokens is not None + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, encoder_out=encoder_out + ) + result['decoder_out'] = decoder_out + else: + ### 2. go text encoder-decoder branch + if self.add_text_encoder: + encoder_out = self.text_encoder( + src_tokens, src_lengths=src_lengths, return_all_hiddens=False + ) + else: + encoder_padding_mask = src_tokens.eq(self.text_padding_idx) + has_pads = src_tokens.device.type == "xla" or encoder_padding_mask.any() + x = self.text_embed_scale * self.text_encoder_embed_tokens(src_tokens) + x = x + self.text_embed_positions(src_tokens) + # x = self.dropout_input(x) + if has_pads: + x = x * (1 - encoder_padding_mask.unsqueeze(-1).type_as(x)) + kwargs={"modality": "text"} if self.split_attention else {} + x, _ = self.encoder( + x, + padding_mask=encoder_padding_mask, + conv_pos=False, + **kwargs, + ) + encoder_out = { + "encoder_out": [x.transpose(0, 1)], # T x B x C + "encoder_padding_mask": [encoder_padding_mask], # B x T + "src_lengths": [src_lengths], + } + + result = {"encoder_out": encoder_out} + if features_only: + return result + assert prev_output_tokens is not None + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, encoder_out=encoder_out, modal_idx=text_modal_idx, + ) + result['decoder_out'] = decoder_out + + return result + + def forward_torchscript(self, net_input: Dict[str, Tensor]): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + res = self.forward( + mask=False, + features_only=True, + **net_input, + ) + + if "source" in net_input: + res["x"] = res["x"].transpose(0, 1) # T x B x C + + x = res["x"] # T x B x C + padding_mask = res["padding_mask"] + if self.add_adaptor: + x, padding_mask = self.adaptor(x, padding_mask) + + # text encoder layers + if self.add_text_encoder and self.share_text_encoder: + for layer in self.text_encoder.layers: + x = layer( + x, encoder_padding_mask=padding_mask + ) + + if self.text_encoder.layer_norm is not None: + x = self.text_encoder.layer_norm(x) + + res["x"] = x + res["padding_mask"] = padding_mask + + encoder_out = { + "encoder_out": [res["x"]], # T x B x C + "encoder_padding_mask": [res["padding_mask"]], # B x T + } + else: + encoder_out = res["encoder_out"] + if "encoder_states" in encoder_out: + del encoder_out["encoder_states"] + if "src_tokens" in encoder_out: + del encoder_out["src_tokens"] + if "src_tokens" in encoder_out: + del encoder_out["src_lengths"] + return encoder_out + + def extract_features( + self, + source: torch.Tensor, + padding_mask: Optional[torch.Tensor] = None, + mask: bool = False, + ret_conv: bool = False, + output_layer: Optional[int] = None, + prev_output_tokens: Optional[torch.Tensor] = None, + ft: bool = True, + enc_grad_mult: float = 1.0, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """only for speech input""" + with torch.no_grad() if not ft else contextlib.ExitStack(): + res = self.forward( + source, + padding_mask=padding_mask, + mask=mask, + features_only=True, + output_layer=output_layer, + ) + + feature = res["features"] if ret_conv else res["x"] + + res["x"] = res["x"].transpose(0, 1) # T x B x C + x = res["x"] # T x B x C + padding_mask = res["padding_mask"] + if self.add_adaptor: + x, padding_mask = self.adaptor(x, padding_mask) + + # text encoder layers + if self.add_text_encoder and self.share_text_encoder: + for layer in self.text_encoder.layers: + x = layer( + x, encoder_padding_mask=padding_mask + ) + + if self.text_encoder.layer_norm is not None: + x = self.text_encoder.layer_norm(x) + + res["x"] = x + res["padding_mask"] = padding_mask + + if self.add_decoder and prev_output_tokens is not None: + encoder_out = { + "encoder_out": [res["x"]], # T x B x C + "encoder_padding_mask": [res["padding_mask"]], # B x T + } + + if enc_grad_mult != 1.0: + encoder_out = self.mult_rst_grad(encoder_out, enc_grad_mult) + + assert prev_output_tokens is not None + decoder_out = self.decoder( + prev_output_tokens=prev_output_tokens, + encoder_out=encoder_out, + ) + else: + decoder_out = None + return feature, res["padding_mask"], decoder_out + + def mult_rst_grad(self, rst, ratio): + assert isinstance(rst, dict) # instead of EncoderOut + assert len(rst["encoder_out"]) == 1 + rst["encoder_out"][0] = GradMultiply.apply(rst["encoder_out"][0], ratio) + return rst + + + def remove_pretraining_modules(self, step2=False): + self.target_glu = None + self.final_proj = None + if self.add_text_modality: + # Delete text embeddings of text encoder + if not step2: + if self.add_text_encoder: + self.text_encoder.embed_tokens = None + if hasattr(self.text_encoder, "embed_positions"): + self.text_encoder.embed_tokens = None + if hasattr(self.text_encoder, "layernorm_embedding"): + self.text_encoder.layernorm_embedding = None + else: + self.text_encoder_embed_tokens = None + self.text_embed_positions = None + if isinstance(self.decoder, MultimodalTransformerDecoder): + # Delete text embeddings of decoder + self.decoder.embed_tokens_list = self.decoder.embed_tokens_list[:1] + self.decoder.output_projection = self.decoder.output_projection[:1] + + def load_checkpoint(self, checkpoint: str): + if not PathManager.exists(checkpoint): + raise IOError("Model file not found: {}".format(checkpoint)) + state = checkpoint_utils.load_checkpoint_to_cpu(checkpoint) + return state + + def load_pretrained_component_from_model( + self, component: Union[TransformerEncoderBase, TransformerEncoder, W2vTransformerEncoder, FairseqDecoder, ConvFeatureExtractionModel], state + ): + """ + Load a pretrained FairseqEncoder or FairseqDecoder from checkpoint into the + provided `component` object. If state_dict fails to load, there may be a + mismatch in the architecture of the corresponding `component` found in the + `checkpoint` file. + """ + if isinstance(component, (TransformerEncoderBase, TransformerEncoder, W2vTransformerEncoder)): + component_type = "encoder" + elif isinstance(component, FairseqDecoder): + component_type = "decoder" + if isinstance(component, MultimodalTransformerDecoder): + state["model"]["decoder.embed_tokens_list.1.weight"] = state["model"]["decoder.embed_tokens.weight"] + state["model"]["decoder.output_projection.1.weight"] = state["model"]["decoder.output_projection.weight"] + elif isinstance(component, ConvFeatureExtractionModel): + component_type = "feature_extractor" + else: + print(component) + raise ValueError( + "component to load must be either a FairseqEncoder or " + "FairseqDecoder. Loading other component types are not supported." + ) + component_state_dict = OrderedDict() + for key in state["model"].keys(): + if key.startswith(component_type): + # encoder.input_layers.0.0.weight --> input_layers.0.0.weight + component_subkey = key[len(component_type) + 1 :] + component_state_dict[component_subkey] = state["model"][key] + try: + logger.info(f"Load {component_type}") + component.load_state_dict(component_state_dict, strict=True) + except Exception as e: + logger.warn(e) + component.load_state_dict(component_state_dict, strict=False) + return component diff --git a/YiTrans/yitrans_iwslt22/models/pretrain_ed_step2.py b/YiTrans/yitrans_iwslt22/models/pretrain_ed_step2.py new file mode 100644 index 0000000..82820bb --- /dev/null +++ b/YiTrans/yitrans_iwslt22/models/pretrain_ed_step2.py @@ -0,0 +1,438 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +import logging +import contextlib +from argparse import Namespace +from typing import Any, Optional + +import torch +import torch.nn as nn +import pickle +from dataclasses import dataclass, field +from fairseq import checkpoint_utils, tasks, utils +from fairseq.dataclass import FairseqDataclass +from fairseq.dataclass.utils import convert_namespace_to_omegaconf +from fairseq.models import BaseFairseqModel, FairseqEncoder, register_model +from fairseq.models.hubert.hubert import MASKING_DISTRIBUTION_CHOICES +from fairseq.models.hubert.hubert_asr import HubertAsrConfig +from fairseq.tasks import FairseqTask +from omegaconf import II, MISSING + +from yitrans_iwslt22.modules.multimodal_transformer_decoder import MultimodalTransformerDecoder + +logger = logging.getLogger(__name__) + +@dataclass +class JointStep2Config(HubertAsrConfig): + ## for decoder overrides + decoder_layerdrop: float = field( + default=0.1, + metadata={"help": "probability of dropping a decoder layer in hubert"}, + ) + add_decoder: bool = field( + default=False, + metadata={"help": "whether to add decoder for CE Loss on code"}, + ) + reuse_text_emb: bool = field( + default=False, + metadata={"help": "reuse text token embeddings instead of initialize randomly"}, + ) + freeze_decoder_updates: int = field( + default=0, + metadata={"help": "dont finetune hubert for this many updates"}, + ) + # share_enc_dec_embeddings: bool = field( + # default=False, + # metadata={"help": "share embeddings of (text encoder, text decoder)"}, + # ) + share_s2t_t2t_embeddings: bool = field( + default=False, + metadata={"help": "share embeddings of (speech2text(code), text2text)"}, + ) + share_ctc_decoder_embed: bool = field( + default=False, + metadata={"help": "share ctc and decoder embedding (only when share_decoder_input_output_embed is true)"}, + ) + enc_grad_mult: float = field( + default=1.0, + metadata={"help": "reset feature grad mult in hubert to this (only for st2t)"}, + ) + retain_dict_path: Optional[str] = field( + default=None, + metadata={"help": "delete embeddings according to this path"}, + ) + load_step2_model_from: Optional[str] = field( + default=None, + metadata={ + "help": "load step2 model from" + }, + ) + + # for other overrides + adaptor_stride: int = field( + default=2, + metadata={"help": "adaptor stride"}, + ) + + # ## for reset some configs + # load_pretrained_mbart_from: Optional[str] = field( + # default=None, + # metadata={ + # "help": "model to take text encoder decoder weights from (for initialization)" + # }, + # ) + # load_pretrained_w2v_from: Optional[str] = field( + # default=None, + # metadata={ + # "help": "model to take speech encoder weights from (for initialization)" + # }, + # ) + # use_rel_pos_enc: bool = field( + # default=True, + # metadata={"help": "whether to use relative positional encoding"}, + # ) + # encoder_layers: int = field( + # default=12, + # metadata={"help": "encoder_layers"}, + # ) + # add_text_modality: bool = field( + # default=True, + # metadata={"help": "add_text_modality"}, + # ) + # add_text_encoder: bool = field( + # default=True, + # metadata={"help": "add_text_encoder"}, + # ) + # share_all_embeddings: bool = field( + # default=True, + # metadata={"help": "share text_encoder, decoder_input, decoder_output embeddings"}, + # ) + # add_adaptor: bool = field( + # default=True, + # metadata={"help": "add_adaptor"}, + # ) + + +@register_model("hubert_step2", dataclass=JointStep2Config) +class JointStep2Model(BaseFairseqModel): + def __init__(self, cfg: JointStep2Config, w2v_encoder: BaseFairseqModel): + super().__init__() + self.cfg = cfg + self.w2v_encoder = w2v_encoder + + def upgrade_state_dict_named(self, state_dict, name): + super().upgrade_state_dict_named(state_dict, name) + return state_dict + + @classmethod + def build_model(cls, cfg: JointStep2Config, task: FairseqTask): + """Build a new model instance.""" + w2v_encoder = JointED(cfg, task.target_dictionary) + return cls(cfg, w2v_encoder) + + def get_normalized_probs(self, net_output, log_probs, sample=None): + """Get normalized probabilities (or log probs) from a net's output.""" + if "encoder_out" not in net_output: + return self.w2v_encoder.get_normalized_probs_decoder(net_output, log_probs, sample) + + if "encoder_out_for_ctc" in net_output: + logits = net_output["encoder_out_for_ctc"] + else: + logits = net_output["encoder_out"] + + if isinstance(logits, list): + logits = logits[0] + + if log_probs: + return utils.log_softmax(logits.float(), dim=-1) + else: + return utils.softmax(logits.float(), dim=-1) + + def get_logits(self, net_output): + logits = net_output["encoder_out"] + padding = net_output["encoder_padding_mask"] + if padding is not None and padding.any(): + padding = padding.T + logits[padding][..., 0] = 0 + logits[padding][..., 1:] = float("-inf") + + return logits + + def forward(self, **kwargs): + x = self.w2v_encoder(**kwargs) + return x + + @property + def encoder(self): + return self.w2v_encoder + + def reorder_encoder_out(self, encoder_out, new_order): + return self.encoder.reorder_encoder_out(encoder_out, new_order) + + @property + def decoder(self): + return self.w2v_encoder.w2v_model.decoder + +class JointED(FairseqEncoder): + def __init__(self, cfg: JointStep2Config, tgt_dict=None): + self.apply_mask = cfg.apply_mask + logger.info(f"self.apply_mask: {self.apply_mask}") + + arg_overrides = { + "dropout": cfg.dropout, + "activation_dropout": cfg.activation_dropout, + "dropout_input": cfg.dropout_input, + "attention_dropout": cfg.attention_dropout, + "mask_length": cfg.mask_length, + "mask_prob": cfg.mask_prob, + "mask_selection": cfg.mask_selection, + "mask_other": cfg.mask_other, + "no_mask_overlap": cfg.no_mask_overlap, + "mask_channel_length": cfg.mask_channel_length, + "mask_channel_prob": cfg.mask_channel_prob, + "mask_channel_selection": cfg.mask_channel_selection, + "mask_channel_other": cfg.mask_channel_other, + "no_mask_channel_overlap": cfg.no_mask_channel_overlap, + "encoder_layerdrop": cfg.layerdrop, + "decoder_layerdrop": cfg.decoder_layerdrop, + "feature_grad_mult": cfg.feature_grad_mult, + "decoder_dict_size": len(tgt_dict) if cfg.add_decoder else -1, + "share_decoder_input_output_embed": cfg.share_decoder_input_output_embed, + "share_s2t_t2t_embeddings": cfg.share_s2t_t2t_embeddings, + "load_pretrained_w2v_from": None, + "load_pretrained_mbart_from": None, + "adaptor_stride": cfg.adaptor_stride, + } + + if cfg.w2v_args is None: + state = checkpoint_utils.load_checkpoint_to_cpu(cfg.w2v_path, arg_overrides) + w2v_args = state.get("cfg", None) + if w2v_args is None: + w2v_args = convert_namespace_to_omegaconf(state["args"]) + cfg.w2v_args = w2v_args + else: + state = None + w2v_args = cfg.w2v_args + if isinstance(w2v_args, Namespace): + cfg.w2v_args = w2v_args = convert_namespace_to_omegaconf(w2v_args) + + if cfg.normalize != w2v_args.task.normalize: + logger.warn( + "Fine-tuning works best when data normalization is the same. " + "Please check that --normalize is set or unset for " + "both pre-training and here" + ) + + w2v_args.task.data = cfg.data + if hasattr(w2v_args.task, "text_cfg"): + w2v_args.task.text_cfg.data_config = None + w2v_args.task.add_decoder = cfg.add_decoder + task = tasks.setup_task(w2v_args.task) + if state is not None and "task_state" in state: + # This will load the stored "dictionaries" object + task.load_state_dict(state["task_state"]) + model = task.build_model(w2v_args.model) + + ### delete the embed_tokens and output_projection of decoder + if state is not None and not cfg.no_pretrained_weights: + if cfg.retain_dict_path is not None: + assert model.add_text_modality, "Mustc have text modality if retain dict path" + logger.info("Cut embedding to a smaller size according to ratin dict") + with open(cfg.retain_dict_path, "rb") as fp: + overlap_idxs = pickle.load(fp) + state['model']['decoder.output_projection.1.weight'] = state['model']['decoder.output_projection.1.weight'][overlap_idxs] + state["model"]["decoder.embed_tokens_list.1.weight"] = state["model"]["decoder.embed_tokens_list.1.weight"][overlap_idxs] + if cfg.reuse_text_emb: + assert model.add_text_modality, "Mustc have text modality if reuse text embed" + logger.info("Loading text-text pretrained token-embedding for speech-text finetuning...") + state["model"]["decoder.embed_tokens_list.0.weight"] = state["model"]["decoder.embed_tokens_list.1.weight"] + del state["model"]["decoder.embed_tokens_list.1.weight"] + state["model"]["decoder.output_projection.0.weight"] = state["model"]["decoder.output_projection.1.weight"] + del state["model"]["decoder.output_projection.1.weight"] + try: + model.load_state_dict(state["model"], strict=True) + except Exception as e: + logger.warn(e) + model.load_state_dict(state["model"], strict=False) + else: + for pname in list(state["model"].keys()): + if pname.startswith("decoder.embed_tokens") or pname.startswith("decoder.output_projection"): + del state["model"][pname] + # set strict=False because we omit some modules + model.load_state_dict(state["model"], strict=False) + + model.remove_pretraining_modules(step2=True) + + super().__init__(task.source_dictionary) + + d = w2v_args.model.encoder_embed_dim + + self.w2v_model = model + + self.final_dropout = nn.Dropout(cfg.final_dropout) + self.freeze_finetune_updates = cfg.freeze_finetune_updates + self.freeze_decoder_updates = cfg.freeze_decoder_updates + self.num_updates = 0 + + if cfg.share_ctc_decoder_embed: + assert cfg.add_decoder and cfg.share_decoder_input_output_embed, "Must share decoder input and output embed before share ctc and decoder embed" + if isinstance(self.w2v_model.decoder, MultimodalTransformerDecoder): + self.proj = nn.Linear( + self.w2v_model.decoder.embed_tokens_list[0].weight.shape[1], + self.w2v_model.decoder.embed_tokens_list[0].weight.shape[0], + bias=False, + ) + self.proj.weight = self.w2v_model.decoder.embed_tokens_list[0].weight + else: + self.proj = nn.Linear( + self.w2v_model.decoder.embed_tokens.weight.shape[1], + self.w2v_model.decoder.embed_tokens.weight.shape[0], + bias=False, + ) + self.proj.weight = self.w2v_model.decoder.embed_tokens.weight + elif tgt_dict is not None: + self.proj = Linear(d, len(tgt_dict)) + elif getattr(cfg, "decoder_embed_dim", d) != d: + self.proj = Linear(d, cfg.decoder_embed_dim) + else: + self.proj = None + + def set_num_updates(self, num_updates): + """Set the number of parameters updates.""" + super().set_num_updates(num_updates) + self.num_updates = num_updates + + def forward(self, source=None, src_tokens=None, src_lengths=None, padding_mask=None, prev_output_tokens=None, tbc=True, **kwargs): + assert source is not None or src_tokens is not None + if source is not None: + ### 1. go speech cnn-encoder-decoder branch + ft = self.freeze_finetune_updates <= self.num_updates + w2v_args = { + "source": source, + "padding_mask": padding_mask, + "mask": self.apply_mask and self.training, + "prev_output_tokens": prev_output_tokens, + "ft": ft, + } + + if self.freeze_decoder_updates <= self.num_updates: + self.w2v_model.add_decoder = True + else: + self.w2v_model.add_decoder = False + + x, padding_mask, decoder_out = self.w2v_model.extract_features(**w2v_args) + + if tbc: + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + x = self.final_dropout(x) + + if self.proj: + x = self.proj(x) + + return { + "encoder_out": x, # T x B x C + "encoder_padding_mask": padding_mask, # B x T + "padding_mask": padding_mask, + "decoder_out": decoder_out, + } + else: + ### 2. go text encoder-decoder branch + w2v_args = { + "src_tokens": src_tokens, + "src_lengths": src_lengths, + "prev_output_tokens": prev_output_tokens, + } + + return self.w2v_model(**w2v_args) + + def get_normalized_probs_decoder(self, net_output, log_probs, sample=None): + # net_output['encoder_out'] is a (B, T, D) tensor + return self.w2v_model.get_normalized_probs(net_output, log_probs, sample) + + def reorder_encoder_out(self, encoder_out, new_order): + if encoder_out["encoder_out"] is not None: + if isinstance(encoder_out["encoder_out"], list): + encoder_out["encoder_out"] = ( + [] if len(encoder_out["encoder_out"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out"]] + ) + else: + encoder_out["encoder_out"] = encoder_out[ + "encoder_out" + ].index_select(1, new_order) + if encoder_out["encoder_padding_mask"] is not None: + if isinstance(encoder_out["encoder_padding_mask"], list): + encoder_out["encoder_padding_mask"] = ( + [] if len(encoder_out["encoder_padding_mask"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["encoder_padding_mask"]] + ) + else: + encoder_out["encoder_padding_mask"] = encoder_out[ + "encoder_padding_mask" + ].index_select(0, new_order) + if "decoder_out" in encoder_out and encoder_out["decoder_out"] is not None: + if isinstance(encoder_out["decoder_out"], list): + encoder_out["decoder_out"] = ( + [] if len(encoder_out["decoder_out"]) == 0 + else [x.index_select(0, new_order) for x in encoder_out["decoder_out"]] + ) + else: + encoder_out["decoder_out"] = encoder_out[ + "decoder_out" + ].index_select(0, new_order) + if "encoder_out_for_ctc" in encoder_out and encoder_out["encoder_out_for_ctc"] is not None: + if isinstance(encoder_out["encoder_out_for_ctc"], list): + encoder_out["encoder_out_for_ctc"] = ( + [] if len(encoder_out["encoder_out_for_ctc"]) == 0 + else [x.index_select(1, new_order) for x in encoder_out["encoder_out_for_ctc"]] + ) + else: + encoder_out["encoder_out_for_ctc"] = encoder_out[ + "encoder_out_for_ctc" + ].index_select(1, new_order) + + return encoder_out + + def forward_torchscript(self, net_input): + """A TorchScript-compatible version of forward. + + Encoders which use additional arguments may want to override + this method for TorchScript compatibility. + """ + encoder_out = self.w2v_model.forward_torchscript(net_input) + + assert self.proj is not None + encoder_out['encoder_out_for_ctc'] = [self.proj(encoder_out['encoder_out'][0])] + + return encoder_out + + def max_positions(self): + """Maximum input length supported by the encoder.""" + return None + + def upgrade_state_dict_named(self, state_dict, name): + return state_dict + + +def Embedding(num_embeddings, embedding_dim, padding_idx): + m = nn.Embedding(num_embeddings, embedding_dim, padding_idx=padding_idx) + nn.init.normal_(m.weight, mean=0, std=embedding_dim ** -0.5) + nn.init.constant_(m.weight[padding_idx], 0) + return m + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m diff --git a/YiTrans/yitrans_iwslt22/modules/__init__.py b/YiTrans/yitrans_iwslt22/modules/__init__.py new file mode 100644 index 0000000..6c611e8 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/modules/__init__.py @@ -0,0 +1,23 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +from .multihead_attention import MultiheadAttention +from .relative_pos_enc import RelativePositionalEncoding +from .transformer_decoder_layer import TransformerDecoderLayerBase +from .w2v_encoder import TransformerEncoder, TransformerSentenceEncoderLayer +from .multimodal_transformer_decoder import MultimodalTransformerDecoder + +__all__ = [ + "MultiheadAttention", + "RelativePositionalEncoding", + "TransformerDecoderLayerBase", + "TransformerEncoder", + "TransformerSentenceEncoderLayer", + "MultimodalTransformerDecoder", +] diff --git a/YiTrans/yitrans_iwslt22/modules/multihead_attention.py b/YiTrans/yitrans_iwslt22/modules/multihead_attention.py new file mode 100644 index 0000000..7b1c144 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/modules/multihead_attention.py @@ -0,0 +1,341 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +from typing import Dict, Optional, Tuple + +import torch +import torch.nn.functional as F +from fairseq import utils +from torch import Tensor + +from fairseq.modules import MultiheadAttention as FairseqMultiheadAttention + + +class MultiheadAttention(FairseqMultiheadAttention): + """Multi-headed attention. + + See "Attention Is All You Need" for more details. + """ + + def __init__( + self, + embed_dim, + num_heads, + kdim=None, + vdim=None, + dropout=0.0, + bias=True, + add_bias_kv=False, + add_zero_attn=False, + self_attention=False, + encoder_decoder_attention=False, + q_noise=0.0, + qn_block_size=8, + ): + super().__init__( + embed_dim, + num_heads, + kdim, + vdim, + dropout, + bias, + add_bias_kv, + add_zero_attn, + self_attention, + encoder_decoder_attention, + q_noise, + qn_block_size, + ) + + def forward( + self, + query, + key: Optional[Tensor], + value: Optional[Tensor], + key_padding_mask: Optional[Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + need_weights: bool = True, + static_kv: bool = False, + attn_mask: Optional[Tensor] = None, + before_softmax: bool = False, + need_head_weights: bool = False, + position_bias: Optional[Tensor] = None, + ) -> Tuple[Tensor, Optional[Tensor]]: + """Input shape: Time x Batch x Channel + + Args: + key_padding_mask (ByteTensor, optional): mask to exclude + keys that are pads, of shape `(batch, src_len)`, where + padding elements are indicated by 1s. + need_weights (bool, optional): return the attention weights, + averaged over heads (default: False). + attn_mask (ByteTensor, optional): typically used to + implement causal attention, where the mask prevents the + attention from looking forward in time (default: None). + before_softmax (bool, optional): return the raw attention + weights and values before the attention softmax. + need_head_weights (bool, optional): return the attention + weights for each head. Implies *need_weights*. Default: + return the average attention weights over all heads. + """ + if need_head_weights: + need_weights = True + + is_tpu = query.device.type == "xla" + + tgt_len, bsz, embed_dim = query.size() + src_len = tgt_len + assert embed_dim == self.embed_dim, f"query dim {embed_dim} != {self.embed_dim}" + assert list(query.size()) == [tgt_len, bsz, embed_dim] + if key is not None: + src_len, key_bsz, _ = key.size() + if not torch.jit.is_scripting(): + assert key_bsz == bsz + assert value is not None + assert src_len, bsz == value.shape[:2] + + if ( + not self.onnx_trace + and not is_tpu # don't use PyTorch version on TPUs + and incremental_state is None + and not static_kv + # A workaround for quantization to work. Otherwise JIT compilation + # treats bias in linear module as method. + and not torch.jit.is_scripting() + and position_bias is None + ): + assert key is not None and value is not None + return F.multi_head_attention_forward( + query, + key, + value, + self.embed_dim, + self.num_heads, + torch.empty([0]), + torch.cat((self.q_proj.bias, self.k_proj.bias, self.v_proj.bias)), + self.bias_k, + self.bias_v, + self.add_zero_attn, + self.dropout_module.p, + self.out_proj.weight, + self.out_proj.bias, + self.training or self.dropout_module.apply_during_inference, + key_padding_mask, + need_weights, + attn_mask, + use_separate_proj_weight=True, + q_proj_weight=self.q_proj.weight, + k_proj_weight=self.k_proj.weight, + v_proj_weight=self.v_proj.weight, + ) + + if incremental_state is not None: + saved_state = self._get_input_buffer(incremental_state) + if saved_state is not None and "prev_key" in saved_state: + # previous time steps are cached - no need to recompute + # key and value if they are static + if static_kv: + assert self.encoder_decoder_attention and not self.self_attention + key = value = None + else: + saved_state = None + + if self.self_attention: + q = self.q_proj(query) + k = self.k_proj(query) + v = self.v_proj(query) + elif self.encoder_decoder_attention: + # encoder-decoder attention + q = self.q_proj(query) + if key is None: + assert value is None + k = v = None + else: + k = self.k_proj(key) + v = self.v_proj(key) + + else: + assert key is not None and value is not None + q = self.q_proj(query) + k = self.k_proj(key) + v = self.v_proj(value) + q *= self.scaling + + if self.bias_k is not None: + assert self.bias_v is not None + k = torch.cat([k, self.bias_k.repeat(1, bsz, 1)]) + v = torch.cat([v, self.bias_v.repeat(1, bsz, 1)]) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + key_padding_mask.new_zeros(key_padding_mask.size(0), 1), + ], + dim=1, + ) + + q = ( + q.contiguous() + .view(tgt_len, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if k is not None: + k = ( + k.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + if v is not None: + v = ( + v.contiguous() + .view(-1, bsz * self.num_heads, self.head_dim) + .transpose(0, 1) + ) + + if saved_state is not None: + # saved states are stored with shape (bsz, num_heads, seq_len, head_dim) + if "prev_key" in saved_state: + _prev_key = saved_state["prev_key"] + assert _prev_key is not None + prev_key = _prev_key.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + k = prev_key + else: + assert k is not None + k = torch.cat([prev_key, k], dim=1) + src_len = k.size(1) + if "prev_value" in saved_state: + _prev_value = saved_state["prev_value"] + assert _prev_value is not None + prev_value = _prev_value.view(bsz * self.num_heads, -1, self.head_dim) + if static_kv: + v = prev_value + else: + assert v is not None + v = torch.cat([prev_value, v], dim=1) + prev_key_padding_mask: Optional[Tensor] = None + if "prev_key_padding_mask" in saved_state: + prev_key_padding_mask = saved_state["prev_key_padding_mask"] + assert k is not None and v is not None + key_padding_mask = MultiheadAttention._append_prev_key_padding_mask( + key_padding_mask=key_padding_mask, + prev_key_padding_mask=prev_key_padding_mask, + batch_size=bsz, + src_len=k.size(1), + static_kv=static_kv, + ) + + saved_state["prev_key"] = k.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_value"] = v.view(bsz, self.num_heads, -1, self.head_dim) + saved_state["prev_key_padding_mask"] = key_padding_mask + # In this branch incremental_state is never None + assert incremental_state is not None + incremental_state = self._set_input_buffer(incremental_state, saved_state) + assert k is not None + assert k.size(1) == src_len + + # This is part of a workaround to get around fork/join parallelism + # not supporting Optional types. + if key_padding_mask is not None and key_padding_mask.dim() == 0: + key_padding_mask = None + + if key_padding_mask is not None: + assert key_padding_mask.size(0) == bsz + assert key_padding_mask.size(1) == src_len + + if self.add_zero_attn: + assert v is not None + src_len += 1 + k = torch.cat([k, k.new_zeros((k.size(0), 1) + k.size()[2:])], dim=1) + v = torch.cat([v, v.new_zeros((v.size(0), 1) + v.size()[2:])], dim=1) + if attn_mask is not None: + attn_mask = torch.cat( + [attn_mask, attn_mask.new_zeros(attn_mask.size(0), 1)], dim=1 + ) + if key_padding_mask is not None: + key_padding_mask = torch.cat( + [ + key_padding_mask, + torch.zeros(key_padding_mask.size(0), 1).type_as( + key_padding_mask + ), + ], + dim=1, + ) + + attn_weights = torch.bmm(q, k.transpose(1, 2)) + attn_weights = self.apply_sparse_mask(attn_weights, tgt_len, src_len, bsz) + + if position_bias is not None: ## first order + ## position_bias: [241, 241, 64] + #print ("attn_weights: ", attn_weights.size()) # [492, 241, 241] + reshape_q = q.contiguous().view(bsz * self.num_heads, -1, self.head_dim).transpose(0,1) #[241, 492, 64] + #print ("reshape_q: ", reshape_q.size()) + B = torch.matmul(reshape_q, position_bias.transpose(-2, -1)) + #print ("B: ", B.size()) ## [241, 492, 241] + #B = B.transpose(0, 1).view(bsz, self.num_heads, position_bias.size(0), position_bias.size(1)) + B = B.transpose(0, 1).view(bsz*self.num_heads, position_bias.size(0), position_bias.size(1)) + #print ("B 2: ", B.size()) + attn_weights += B + + assert list(attn_weights.size()) == [bsz * self.num_heads, tgt_len, src_len] + + if attn_mask is not None: + attn_mask = attn_mask.unsqueeze(0) + if self.onnx_trace: + attn_mask = attn_mask.repeat(attn_weights.size(0), 1, 1) + attn_weights += attn_mask + + if key_padding_mask is not None: + # don't attend to padding symbols + attn_weights = attn_weights.view(bsz, self.num_heads, tgt_len, src_len) + if not is_tpu: + attn_weights = attn_weights.masked_fill( + key_padding_mask.unsqueeze(1).unsqueeze(2).to(torch.bool), + float("-inf"), + ) + else: + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.masked_fill(key_padding_mask, float("-inf")) + attn_weights = attn_weights.transpose(0, 2) + attn_weights = attn_weights.view(bsz * self.num_heads, tgt_len, src_len) + + if before_softmax: + return attn_weights, v + + attn_weights_float = utils.softmax( + attn_weights, dim=-1, onnx_trace=self.onnx_trace + ) + attn_weights = attn_weights_float.type_as(attn_weights) + attn_probs = self.dropout_module(attn_weights) + + assert v is not None + attn = torch.bmm(attn_probs, v) + assert list(attn.size()) == [bsz * self.num_heads, tgt_len, self.head_dim] + if self.onnx_trace and attn.size(1) == 1: + # when ONNX tracing a single decoder step (sequence length == 1) + # the transpose is a no-op copy before view, thus unnecessary + attn = attn.contiguous().view(tgt_len, bsz, embed_dim) + else: + attn = attn.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) + attn = self.out_proj(attn) + attn_weights: Optional[Tensor] = None + if need_weights: + attn_weights = attn_weights_float.view( + bsz, self.num_heads, tgt_len, src_len + ).transpose(1, 0) + if not need_head_weights: + # average attention weights over heads + attn_weights = attn_weights.mean(dim=0) + + return attn, attn_weights diff --git a/YiTrans/yitrans_iwslt22/modules/multimodal_transformer_decoder.py b/YiTrans/yitrans_iwslt22/modules/multimodal_transformer_decoder.py new file mode 100644 index 0000000..4d0b5cd --- /dev/null +++ b/YiTrans/yitrans_iwslt22/modules/multimodal_transformer_decoder.py @@ -0,0 +1,525 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/transformer/transformer_decoder.py +""" + +import math +from typing import Any, Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqIncrementalDecoder +from fairseq.models.transformer import TransformerConfig +from fairseq.models.transformer.transformer_decoder import module_name_fordropout, Linear +from fairseq.modules import ( + AdaptiveSoftmax, + BaseLayer, + FairseqDropout, + LayerDropModuleList, + LayerNorm, + PositionalEmbedding, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor + +import yitrans_iwslt22.modules.transformer_decoder_layer as transformer_layer +from yitrans_iwslt22.modules.relative_pos_enc import RelativePositionalEncoding + +class MultimodalTransformerDecoderBase(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *cfg.decoder.layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionaries (~fairseq.data.Dictionary): a list of decoding dictionaries + embed_tokens_list (torch.nn.Embedding): a list of output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg, + dictionaries, + embed_tokens_list, + no_encoder_attn=False, + output_projection=None, + use_rel_pos_enc=False, + ): + assert all([embed_tokens.padding_idx == embed_tokens_list[0].padding_idx for embed_tokens in embed_tokens_list]) + assert all([embed_tokens.embedding_dim == embed_tokens_list[0].embedding_dim for embed_tokens in embed_tokens_list]) + self.cfg = cfg + super().__init__(dictionaries) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.decoder_layerdrop = cfg.decoder.layerdrop + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens_list[0].embedding_dim + embed_dim = cfg.decoder.embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = cfg.decoder.output_dim + + self.padding_idx = embed_tokens_list[0].padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens_list = nn.ModuleList(embed_tokens_list) + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + self.max_target_positions, + embed_dim, + self.padding_idx, + learned=cfg.decoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + self.cross_self_attention = cfg.cross_self_attention + + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.layers.extend( + [ + self.build_decoder_layer(cfg, no_encoder_attn) + for _ in range(cfg.decoder.layers) + ] + ) + self.num_layers = len(self.layers) + + if cfg.decoder.normalize_before and not cfg.no_decoder_final_norm: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not cfg.tie_adaptive_weights + else None + ) + + self.adaptive_softmax = None + self.output_projection = output_projection + if self.output_projection is None: + self.build_output_projection(cfg, dictionaries, embed_tokens_list) + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.decoder.attention_heads, 24) + + def build_output_projection(self, cfg, dictionaries, embed_tokens_list): + if cfg.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = nn.ModuleList([ + AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(cfg.adaptive_softmax_cutoff, type=int), + dropout=cfg.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if cfg.tie_adaptive_weights else None, + factor=cfg.adaptive_softmax_factor, + tie_proj=cfg.tie_adaptive_proj, + ) for (dictionary, embed_tokens) in zip(dictionaries, embed_tokens_list) + ]) + elif self.share_input_output_embed: + self.output_projection = nn.ModuleList([ + nn.Linear( + self.embed_tokens_list[i].weight.shape[1], + self.embed_tokens_list[i].weight.shape[0], + bias=False, + ) for i in range(len(self.embed_tokens_list)) + ]) + for i in range(len(self.embed_tokens_list)): + self.output_projection[i].weight = self.embed_tokens_list[i].weight + else: + self.output_projection = nn.ModuleList([ + nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) for dictionary in dictionaries + ]) + for i in range(len(self.embed_tokens_list)): + nn.init.normal_( + self.output_projection[i].weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + num_base_layers = cfg.base_layers + for i in range(num_base_layers): + self.layers.insert( + ((i + 1) * cfg.decoder.layers) // (num_base_layers + 1), + BaseLayer(cfg), + ) + + def build_decoder_layer(self, cfg, no_encoder_attn=False): + layer = transformer_layer.TransformerDecoderLayerBase(cfg, no_encoder_attn, has_relative_attention_bias=self.use_rel_pos_enc) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + modal_idx=0, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + modal_idx=modal_idx, + ) + + if not features_only: + x = self.output_layer(x, modal_idx) + return x, extra + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + modal_idx=0, + ): + return self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + modal_idx=modal_idx, + ) + + """ + A scriptable subclass of this class has an extract_features method and calls + super().extract_features, but super() is not supported in torchscript. A copy of + this function is made to be used in the subclass instead. + """ + + def extract_features_scriptable( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + modal_idx=0, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs, slen = prev_output_tokens.size() + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens_list[modal_idx](prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + pos_seq = torch.arange(0, slen).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, _ = self.pos_emb(pos_seq, incremental_state) + else: + pos_k = None + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + pos_bias=pos_k, + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def output_layer(self, features, modal_idx): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection[modal_idx](features) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim])), 1 + ) + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + if f"{name}.output_projection.weight" not in state_dict: + if self.share_input_output_embed: + embed_out_key = f"{name}.embed_tokens.weight" + else: + embed_out_key = f"{name}.embed_out" + if embed_out_key in state_dict: + state_dict[f"{name}.output_projection.weight"] = state_dict[ + embed_out_key + ] + if not self.share_input_output_embed: + del state_dict[embed_out_key] + + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +class MultimodalTransformerDecoder(MultimodalTransformerDecoderBase): + def __init__( + self, + args, + dictionaries, + embed_tokens_list, + no_encoder_attn=False, + output_projection=None, + ): + + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionaries, + embed_tokens_list, + no_encoder_attn=no_encoder_attn, + output_projection=output_projection, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + ) + + def build_output_projection(self, args, dictionaries, embed_tokens_list): + super().build_output_projection( + TransformerConfig.from_namespace(args), dictionaries, embed_tokens_list + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + return super().build_decoder_layer( + TransformerConfig.from_namespace(args), no_encoder_attn=no_encoder_attn + ) + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + modal_idx=0, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + modal_idx=modal_idx, + ) + return x, None diff --git a/YiTrans/yitrans_iwslt22/modules/relative_pos_enc.py b/YiTrans/yitrans_iwslt22/modules/relative_pos_enc.py new file mode 100644 index 0000000..2a073eb --- /dev/null +++ b/YiTrans/yitrans_iwslt22/modules/relative_pos_enc.py @@ -0,0 +1,35 @@ +# -------------------------------------------------------- +# Pre-Training Transformer Decoder for End-to-End ASR Model with Unpaired Speech Data (https://arxiv.org/abs/2203.17113) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/Speech2C +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/pytorch/fairseq +# -------------------------------------------------------- + +import torch + +class RelativePositionalEncoding(torch.nn.Module): + def __init__(self, d_model, maxlen=1000, embed_v=False): + super(RelativePositionalEncoding, self).__init__() + + self.d_model = d_model + self.maxlen = maxlen + self.pe_k = torch.nn.Embedding(2*maxlen, d_model) + if embed_v: + self.pe_v = torch.nn.Embedding(2*maxlen, d_model) + self.embed_v = embed_v + + + def forward(self, pos_seq, incremental_state=None): + pos_seq[pos_seq < -self.maxlen] = -self.maxlen + pos_seq[pos_seq >= self.maxlen] = self.maxlen - 1 + pos_seq = pos_seq + self.maxlen + + if incremental_state is not None: + pos_seq = pos_seq[-1:] + + if self.embed_v: + return self.pe_k(pos_seq), self.pe_v(pos_seq) + else: + return self.pe_k(pos_seq), None diff --git a/YiTrans/yitrans_iwslt22/modules/transformer_decoder.py b/YiTrans/yitrans_iwslt22/modules/transformer_decoder.py new file mode 100644 index 0000000..29b9f30 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/modules/transformer_decoder.py @@ -0,0 +1,523 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/transformer/transformer_decoder.py +""" + +import math +from typing import Any, Dict, List, Optional + +import torch +import torch.nn as nn +from fairseq import utils +from fairseq.distributed import fsdp_wrap +from fairseq.models import FairseqIncrementalDecoder +from fairseq.models.transformer import TransformerConfig +from fairseq.modules import ( + AdaptiveSoftmax, + BaseLayer, + FairseqDropout, + LayerDropModuleList, + LayerNorm, + PositionalEmbedding, + SinusoidalPositionalEmbedding, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.quant_noise import quant_noise as apply_quant_noise_ +from torch import Tensor + +import yitrans_iwslt22.modules.transformer_decoder_layer as transformer_layer +from yitrans_iwslt22.modules.relative_pos_enc import RelativePositionalEncoding + +# rewrite name for backward compatibility in `make_generation_fast_` +def module_name_fordropout(module_name: str) -> str: + if module_name == "TransformerDecoderBase": + return "TransformerDecoder" + else: + return module_name + + +class TransformerDecoderBase(FairseqIncrementalDecoder): + """ + Transformer decoder consisting of *cfg.decoder.layers* layers. Each layer + is a :class:`TransformerDecoderLayer`. + + Args: + args (argparse.Namespace): parsed command-line arguments + dictionary (~fairseq.data.Dictionary): decoding dictionary + embed_tokens (torch.nn.Embedding): output embedding + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, + cfg, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + use_rel_pos_enc=False, + ): + self.cfg = cfg + super().__init__(dictionary) + self.register_buffer("version", torch.Tensor([3])) + self._future_mask = torch.empty(0) + + self.dropout_module = FairseqDropout( + cfg.dropout, module_name=module_name_fordropout(self.__class__.__name__) + ) + self.decoder_layerdrop = cfg.decoder.layerdrop + self.share_input_output_embed = cfg.share_decoder_input_output_embed + + input_embed_dim = embed_tokens.embedding_dim + embed_dim = cfg.decoder.embed_dim + self.embed_dim = embed_dim + self.output_embed_dim = cfg.decoder.output_dim + + self.padding_idx = embed_tokens.padding_idx + self.max_target_positions = cfg.max_target_positions + + self.embed_tokens = embed_tokens + + self.embed_scale = 1.0 if cfg.no_scale_embedding else math.sqrt(embed_dim) + + if not cfg.adaptive_input and cfg.quant_noise.pq > 0: + self.quant_noise = apply_quant_noise_( + nn.Linear(embed_dim, embed_dim, bias=False), + cfg.quant_noise.pq, + cfg.quant_noise.pq_block_size, + ) + else: + self.quant_noise = None + + self.project_in_dim = ( + Linear(input_embed_dim, embed_dim, bias=False) + if embed_dim != input_embed_dim + else None + ) + self.embed_positions = ( + PositionalEmbedding( + self.max_target_positions, + embed_dim, + self.padding_idx, + learned=cfg.decoder.learned_pos, + ) + if not cfg.no_token_positional_embeddings + else None + ) + if cfg.layernorm_embedding: + self.layernorm_embedding = LayerNorm(embed_dim, export=cfg.export) + else: + self.layernorm_embedding = None + + self.cross_self_attention = cfg.cross_self_attention + + if self.decoder_layerdrop > 0.0: + self.layers = LayerDropModuleList(p=self.decoder_layerdrop) + else: + self.layers = nn.ModuleList([]) + self.use_rel_pos_enc = use_rel_pos_enc + self.layers.extend( + [ + self.build_decoder_layer(cfg, no_encoder_attn) + for _ in range(cfg.decoder.layers) + ] + ) + self.num_layers = len(self.layers) + + if cfg.decoder.normalize_before and not cfg.no_decoder_final_norm: + self.layer_norm = LayerNorm(embed_dim, export=cfg.export) + else: + self.layer_norm = None + + self.project_out_dim = ( + Linear(embed_dim, self.output_embed_dim, bias=False) + if embed_dim != self.output_embed_dim and not cfg.tie_adaptive_weights + else None + ) + + self.adaptive_softmax = None + self.output_projection = output_projection + if self.output_projection is None: + self.build_output_projection(cfg, dictionary, embed_tokens) + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(embed_dim // cfg.decoder.attention_heads, 24) + + def build_output_projection(self, cfg, dictionary, embed_tokens): + if cfg.adaptive_softmax_cutoff is not None: + self.adaptive_softmax = AdaptiveSoftmax( + len(dictionary), + self.output_embed_dim, + utils.eval_str_list(cfg.adaptive_softmax_cutoff, type=int), + dropout=cfg.adaptive_softmax_dropout, + adaptive_inputs=embed_tokens if cfg.tie_adaptive_weights else None, + factor=cfg.adaptive_softmax_factor, + tie_proj=cfg.tie_adaptive_proj, + ) + elif self.share_input_output_embed: + self.output_projection = nn.Linear( + self.embed_tokens.weight.shape[1], + self.embed_tokens.weight.shape[0], + bias=False, + ) + self.output_projection.weight = self.embed_tokens.weight + else: + self.output_projection = nn.Linear( + self.output_embed_dim, len(dictionary), bias=False + ) + nn.init.normal_( + self.output_projection.weight, mean=0, std=self.output_embed_dim ** -0.5 + ) + num_base_layers = cfg.base_layers + for i in range(num_base_layers): + self.layers.insert( + ((i + 1) * cfg.decoder.layers) // (num_base_layers + 1), + BaseLayer(cfg), + ) + + def build_decoder_layer(self, cfg, no_encoder_attn=False): + layer = transformer_layer.TransformerDecoderLayerBase(cfg, no_encoder_attn, has_relative_attention_bias=self.use_rel_pos_enc) + checkpoint = cfg.checkpoint_activations + if checkpoint: + offload_to_cpu = cfg.offload_activations + layer = checkpoint_wrapper(layer, offload_to_cpu=offload_to_cpu) + # if we are checkpointing, enforce that FSDP always wraps the + # checkpointed layer, regardless of layer size + min_params_to_wrap = cfg.min_params_to_wrap if not checkpoint else 0 + layer = fsdp_wrap(layer, min_num_params=min_params_to_wrap) + return layer + + def forward( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + features_only: bool = False, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + src_lengths: Optional[Any] = None, + return_all_hiddens: bool = False, + ): + """ + Args: + prev_output_tokens (LongTensor): previous decoder outputs of shape + `(batch, tgt_len)`, for teacher forcing + encoder_out (optional): output from the encoder, used for + encoder-side attention, should be of size T x B x C + incremental_state (dict): dictionary used for storing state during + :ref:`Incremental decoding` + features_only (bool, optional): only return features without + applying output layer (default: False). + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + + Returns: + tuple: + - the decoder's output of shape `(batch, tgt_len, vocab)` + - a dictionary with any model-specific outputs + """ + + x, extra = self.extract_features( + prev_output_tokens, + encoder_out=encoder_out, + incremental_state=incremental_state, + full_context_alignment=full_context_alignment, + alignment_layer=alignment_layer, + alignment_heads=alignment_heads, + ) + + if not features_only: + x = self.output_layer(x) + return x, extra + + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + return self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + + """ + A scriptable subclass of this class has an extract_features method and calls + super().extract_features, but super() is not supported in torchscript. A copy of + this function is made to be used in the subclass instead. + """ + + def extract_features_scriptable( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]], + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + """ + Similar to *forward* but only return features. + + Includes several features from "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + full_context_alignment (bool, optional): don't apply + auto-regressive mask to self-attention (default: False). + alignment_layer (int, optional): return mean alignment over + heads at this layer (default: last layer). + alignment_heads (int, optional): only average alignment over + this many heads (default: all heads). + + Returns: + tuple: + - the decoder's features of shape `(batch, tgt_len, embed_dim)` + - a dictionary with any model-specific outputs + """ + bs, slen = prev_output_tokens.size() + if alignment_layer is None: + alignment_layer = self.num_layers - 1 + + enc: Optional[Tensor] = None + padding_mask: Optional[Tensor] = None + if encoder_out is not None and len(encoder_out["encoder_out"]) > 0: + enc = encoder_out["encoder_out"][0] + assert ( + enc.size()[1] == bs + ), f"Expected enc.shape == (t, {bs}, c) got {enc.shape}" + if encoder_out is not None and len(encoder_out["encoder_padding_mask"]) > 0: + padding_mask = encoder_out["encoder_padding_mask"][0] + + # embed positions + positions = None + if self.embed_positions is not None: + positions = self.embed_positions( + prev_output_tokens, incremental_state=incremental_state + ) + + if incremental_state is not None: + prev_output_tokens = prev_output_tokens[:, -1:] + if positions is not None: + positions = positions[:, -1:] + + # embed tokens and positions + x = self.embed_scale * self.embed_tokens(prev_output_tokens) + + if self.quant_noise is not None: + x = self.quant_noise(x) + + if self.project_in_dim is not None: + x = self.project_in_dim(x) + + if positions is not None: + x += positions + + if self.layernorm_embedding is not None: + x = self.layernorm_embedding(x) + + x = self.dropout_module(x) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + if self.use_rel_pos_enc: + pos_seq = torch.arange(0, slen).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, _ = self.pos_emb(pos_seq, incremental_state) + else: + pos_k = None + + self_attn_padding_mask: Optional[Tensor] = None + if self.cross_self_attention or prev_output_tokens.eq(self.padding_idx).any(): + self_attn_padding_mask = prev_output_tokens.eq(self.padding_idx) + + # decoder layers + attn: Optional[Tensor] = None + inner_states: List[Optional[Tensor]] = [x] + for idx, layer in enumerate(self.layers): + if incremental_state is None and not full_context_alignment: + self_attn_mask = self.buffered_future_mask(x) + else: + self_attn_mask = None + + x, layer_attn, _ = layer( + x, + enc, + padding_mask, + incremental_state, + self_attn_mask=self_attn_mask, + self_attn_padding_mask=self_attn_padding_mask, + need_attn=bool((idx == alignment_layer)), + need_head_weights=bool((idx == alignment_layer)), + pos_bias=pos_k, + ) + inner_states.append(x) + if layer_attn is not None and idx == alignment_layer: + attn = layer_attn.float().to(x) + + if attn is not None: + if alignment_heads is not None: + attn = attn[:alignment_heads] + + # average probabilities over heads + attn = attn.mean(dim=0) + + if self.layer_norm is not None: + x = self.layer_norm(x) + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + + if self.project_out_dim is not None: + x = self.project_out_dim(x) + + return x, {"attn": [attn], "inner_states": inner_states} + + def output_layer(self, features): + """Project features to the vocabulary size.""" + if self.adaptive_softmax is None: + # project back to size of vocabulary + return self.output_projection(features) + else: + return features + + def max_positions(self): + """Maximum output length supported by the decoder.""" + if self.embed_positions is None: + return self.max_target_positions + return min(self.max_target_positions, self.embed_positions.max_positions) + + def buffered_future_mask(self, tensor): + dim = tensor.size(0) + # self._future_mask.device != tensor.device is not working in TorchScript. This is a workaround. + if ( + self._future_mask.size(0) == 0 + or (not self._future_mask.device == tensor.device) + or self._future_mask.size(0) < dim + ): + self._future_mask = torch.triu( + utils.fill_with_neg_inf(torch.zeros([dim, dim])), 1 + ) + self._future_mask = self._future_mask.to(tensor) + return self._future_mask[:dim, :dim] + + def upgrade_state_dict_named(self, state_dict, name): + """Upgrade a (possibly old) state dict for new versions of fairseq.""" + if isinstance(self.embed_positions, SinusoidalPositionalEmbedding): + weights_key = "{}.embed_positions.weights".format(name) + if weights_key in state_dict: + del state_dict[weights_key] + state_dict[ + "{}.embed_positions._float_tensor".format(name) + ] = torch.FloatTensor(1) + + if f"{name}.output_projection.weight" not in state_dict: + if self.share_input_output_embed: + embed_out_key = f"{name}.embed_tokens.weight" + else: + embed_out_key = f"{name}.embed_out" + if embed_out_key in state_dict: + state_dict[f"{name}.output_projection.weight"] = state_dict[ + embed_out_key + ] + if not self.share_input_output_embed: + del state_dict[embed_out_key] + + for i in range(self.num_layers): + # update layer norms + layer_norm_map = { + "0": "self_attn_layer_norm", + "1": "encoder_attn_layer_norm", + "2": "final_layer_norm", + } + for old, new in layer_norm_map.items(): + for m in ("weight", "bias"): + k = "{}.layers.{}.layer_norms.{}.{}".format(name, i, old, m) + if k in state_dict: + state_dict[ + "{}.layers.{}.{}.{}".format(name, i, new, m) + ] = state_dict[k] + del state_dict[k] + + version_key = "{}.version".format(name) + if utils.item(state_dict.get(version_key, torch.Tensor([1]))[0]) <= 2: + # earlier checkpoints did not normalize after the stack of layers + self.layer_norm = None + self.normalize = False + state_dict[version_key] = torch.Tensor([1]) + + return state_dict + + +def Linear(in_features, out_features, bias=True): + m = nn.Linear(in_features, out_features, bias) + nn.init.xavier_uniform_(m.weight) + if bias: + nn.init.constant_(m.bias, 0.0) + return m + + +class TransformerDecoder(TransformerDecoderBase): + def __init__( + self, + args, + dictionary, + embed_tokens, + no_encoder_attn=False, + output_projection=None, + ): + self.args = args + super().__init__( + TransformerConfig.from_namespace(args), + dictionary, + embed_tokens, + no_encoder_attn=no_encoder_attn, + output_projection=output_projection, + use_rel_pos_enc=getattr(args, "use_rel_pos_enc", False), + ) + + def build_output_projection(self, args, dictionary, embed_tokens): + super().build_output_projection( + TransformerConfig.from_namespace(args), dictionary, embed_tokens + ) + + def build_decoder_layer(self, args, no_encoder_attn=False): + return super().build_decoder_layer( + TransformerConfig.from_namespace(args), no_encoder_attn=no_encoder_attn + ) + +class TransformerDecoderScriptable(TransformerDecoder): + def extract_features( + self, + prev_output_tokens, + encoder_out: Optional[Dict[str, List[Tensor]]] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + full_context_alignment: bool = False, + alignment_layer: Optional[int] = None, + alignment_heads: Optional[int] = None, + ): + # call scriptable method from parent class + x, _ = self.extract_features_scriptable( + prev_output_tokens, + encoder_out, + incremental_state, + full_context_alignment, + alignment_layer, + alignment_heads, + ) + return x, None diff --git a/YiTrans/yitrans_iwslt22/modules/transformer_decoder_layer.py b/YiTrans/yitrans_iwslt22/modules/transformer_decoder_layer.py new file mode 100644 index 0000000..d5397b8 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/modules/transformer_decoder_layer.py @@ -0,0 +1,219 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from https://github.com/facebookresearch/fairseq/blob/main/fairseq/modules/transformer_layer.py + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_decoder_layer.py +""" + +from typing import Dict, List, Optional + +import torch +from torch import Tensor +from fairseq.modules.transformer_layer import TransformerDecoderLayerBase as FairseqTransformerDecoderLayerBase +from fairseq.modules import LayerNorm + +from yitrans_iwslt22.modules.multihead_attention import MultiheadAttention + + +class TransformerDecoderLayerBase(FairseqTransformerDecoderLayerBase): + """Decoder layer block. + + In the original paper each operation (multi-head attention, encoder + attention or FFN) is postprocessed with: `dropout -> add residual -> + layernorm`. In the tensor2tensor code they suggest that learning is more + robust when preprocessing each layer with layernorm and postprocessing with: + `dropout -> add residual`. We default to the approach in the paper, but the + tensor2tensor approach can be enabled by setting + *cfg.decoder.normalize_before* to ``True``. + + Args: + args (argparse.Namespace): parsed command-line arguments + no_encoder_attn (bool, optional): whether to attend to encoder outputs + (default: False). + """ + + def __init__( + self, cfg, no_encoder_attn=False, add_bias_kv=False, add_zero_attn=False, has_relative_attention_bias=False + ): + super().__init__( + cfg, + no_encoder_attn, + add_bias_kv, + add_zero_attn, + ) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embed_dim // cfg.decoder.attention_heads) + + def build_self_attention( + self, embed_dim, cfg, add_bias_kv=False, add_zero_attn=False + ): + return MultiheadAttention( + embed_dim, + cfg.decoder.attention_heads, + dropout=cfg.attention_dropout, + add_bias_kv=add_bias_kv, + add_zero_attn=add_zero_attn, + self_attention=not cfg.cross_self_attention, + q_noise=self.quant_noise, + qn_block_size=self.quant_noise_block_size, + ) + + def forward( + self, + x, + encoder_out: Optional[torch.Tensor] = None, + encoder_padding_mask: Optional[torch.Tensor] = None, + incremental_state: Optional[Dict[str, Dict[str, Optional[Tensor]]]] = None, + prev_self_attn_state: Optional[List[torch.Tensor]] = None, + prev_attn_state: Optional[List[torch.Tensor]] = None, + self_attn_mask: Optional[torch.Tensor] = None, + self_attn_padding_mask: Optional[torch.Tensor] = None, + need_attn: bool = False, + need_head_weights: bool = False, + pos_bias=None, + ): + """ + Args: + x (Tensor): input to the layer of shape `(seq_len, batch, embed_dim)` + encoder_padding_mask (ByteTensor, optional): binary + ByteTensor of shape `(batch, src_len)` where padding + elements are indicated by ``1``. + need_attn (bool, optional): return attention weights + need_head_weights (bool, optional): return attention weights + for each head (default: return average over heads). + Returns: + encoded output of shape `(seq_len, batch, embed_dim)` + """ + if need_head_weights: + need_attn = True + + residual = x + if self.normalize_before: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + if prev_self_attn_state is not None: + prev_key, prev_value = prev_self_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_self_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_self_attn_state[2] + assert incremental_state is not None + self.self_attn._set_input_buffer(incremental_state, saved_state) + _self_attn_input_buffer = self.self_attn._get_input_buffer(incremental_state) + if self.cross_self_attention and not ( + incremental_state is not None + and _self_attn_input_buffer is not None + and "prev_key" in _self_attn_input_buffer + ): + if self_attn_mask is not None: + assert encoder_out is not None + self_attn_mask = torch.cat( + (x.new_zeros(x.size(0), encoder_out.size(0)), self_attn_mask), dim=1 + ) + if self_attn_padding_mask is not None: + if encoder_padding_mask is None: + assert encoder_out is not None + encoder_padding_mask = self_attn_padding_mask.new_zeros( + encoder_out.size(1), encoder_out.size(0) + ) + self_attn_padding_mask = torch.cat( + (encoder_padding_mask, self_attn_padding_mask), dim=1 + ) + assert encoder_out is not None + y = torch.cat((encoder_out, x), dim=0) + else: + y = x + + x, attn = self.self_attn( + query=x, + key=y, + value=y, + key_padding_mask=self_attn_padding_mask, + incremental_state=incremental_state, + need_weights=False, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + if self.c_attn is not None: + tgt_len, bsz = x.size(0), x.size(1) + x = x.view(tgt_len, bsz, self.nh, self.head_dim) + x = torch.einsum("tbhd,h->tbhd", x, self.c_attn) + x = x.reshape(tgt_len, bsz, self.embed_dim) + if self.attn_ln is not None: + x = self.attn_ln(x) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.self_attn_layer_norm(x) + + if self.encoder_attn is not None and encoder_out is not None: + residual = x + if self.normalize_before: + x = self.encoder_attn_layer_norm(x) + if prev_attn_state is not None: + prev_key, prev_value = prev_attn_state[:2] + saved_state: Dict[str, Optional[Tensor]] = { + "prev_key": prev_key, + "prev_value": prev_value, + } + if len(prev_attn_state) >= 3: + saved_state["prev_key_padding_mask"] = prev_attn_state[2] + assert incremental_state is not None + self.encoder_attn._set_input_buffer(incremental_state, saved_state) + + x, attn = self.encoder_attn( + query=x, + key=encoder_out, + value=encoder_out, + key_padding_mask=encoder_padding_mask, + incremental_state=incremental_state, + static_kv=True, + need_weights=need_attn or (not self.training and self.need_attn), + need_head_weights=need_head_weights, + ) + x = self.dropout_module(x) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.encoder_attn_layer_norm(x) + + residual = x + if self.normalize_before: + x = self.final_layer_norm(x) + + x = self.activation_fn(self.fc1(x)) + x = self.activation_dropout_module(x) + if self.ffn_layernorm is not None: + x = self.ffn_layernorm(x) + x = self.fc2(x) + x = self.dropout_module(x) + if self.w_resid is not None: + residual = torch.mul(self.w_resid, residual) + x = self.residual_connection(x, residual) + if not self.normalize_before: + x = self.final_layer_norm(x) + if self.onnx_trace and incremental_state is not None: + saved_state = self.self_attn._get_input_buffer(incremental_state) + assert saved_state is not None + if self_attn_padding_mask is not None: + self_attn_state = [ + saved_state["prev_key"], + saved_state["prev_value"], + saved_state["prev_key_padding_mask"], + ] + else: + self_attn_state = [saved_state["prev_key"], saved_state["prev_value"]] + return x, attn, self_attn_state + return x, attn, None + + def make_generation_fast_(self, need_attn: bool = False, **kwargs): + self.need_attn = need_attn diff --git a/YiTrans/yitrans_iwslt22/modules/w2v_encoder.py b/YiTrans/yitrans_iwslt22/modules/w2v_encoder.py new file mode 100644 index 0000000..7d59a7b --- /dev/null +++ b/YiTrans/yitrans_iwslt22/modules/w2v_encoder.py @@ -0,0 +1,283 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- + +""" + wav2vec encoder adding relitive position bias, modified from + https://github.com/microsoft/SpeechT5/blob/main/Speech2C/speech2c/models/modules/transformer_encoder.py + https://github.com/facebookresearch/fairseq/blob/main/fairseq/models/wav2vec/wav2vec2.py +""" + +import math +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from fairseq import utils +from fairseq.dataclass import ChoiceEnum +from fairseq.modules import ( + LayerNorm, + SamePad, +) +from fairseq.modules.checkpoint_activations import checkpoint_wrapper +from fairseq.modules.transformer_sentence_encoder import init_bert_params +from fairseq.utils import index_put +from fairseq.distributed import fsdp_wrap +from fairseq.models.wav2vec.utils import pad_to_multiple + +## reload multi-head attition with rel-pos-bias +from fairseq.models.wav2vec.wav2vec2 import TransformerEncoder as W2vTransformerEncoder +from yitrans_iwslt22.modules.relative_pos_enc import RelativePositionalEncoding +from yitrans_iwslt22.modules.multihead_attention import MultiheadAttention + +EXTRACTOR_MODE_CHOICES = ChoiceEnum(["default", "layer_norm"]) +MASKING_DISTRIBUTION_CHOICES = ChoiceEnum(["static", "uniform", "normal", "poisson"]) + + +class TransformerEncoder(W2vTransformerEncoder): + def __init__(self, args): + super().__init__(args) + + self.dropout = args.dropout + self.embedding_dim = args.encoder_embed_dim + self.required_seq_len_multiple = args.required_seq_len_multiple + self.use_rel_pos_enc = getattr(args, "use_rel_pos_enc", False) + + self.pos_conv = nn.Conv1d( + self.embedding_dim, + self.embedding_dim, + kernel_size=args.conv_pos, + padding=args.conv_pos // 2, + groups=args.conv_pos_groups, + ) + dropout = 0 + std = math.sqrt((4 * (1.0 - dropout)) / (args.conv_pos * self.embedding_dim)) + nn.init.normal_(self.pos_conv.weight, mean=0, std=std) + nn.init.constant_(self.pos_conv.bias, 0) + + self.pos_conv = nn.utils.weight_norm(self.pos_conv, name="weight", dim=2) + self.pos_conv = nn.Sequential(self.pos_conv, SamePad(args.conv_pos), nn.GELU()) + + layers = [] + for _ in range(args.encoder_layers): + layer = TransformerSentenceEncoderLayer( + embedding_dim=self.embedding_dim, + ffn_embedding_dim=args.encoder_ffn_embed_dim, + num_attention_heads=args.encoder_attention_heads, + dropout=self.dropout, + attention_dropout=args.attention_dropout, + activation_dropout=args.activation_dropout, + activation_fn=args.activation_fn, + layer_norm_first=args.layer_norm_first, + has_relative_attention_bias=self.use_rel_pos_enc, + ) + if args.checkpoint_activations: + layer = fsdp_wrap(layer) + layer = checkpoint_wrapper(layer) + layers.append(layer) + self.layers = nn.ModuleList(layers) + + self.layer_norm_first = args.layer_norm_first + self.layer_norm = LayerNorm(self.embedding_dim) + self.layerdrop = args.encoder_layerdrop + if self.use_rel_pos_enc: + self.pos_emb = RelativePositionalEncoding(args.encoder_embed_dim // args.encoder_attention_heads, 160) + + + self.apply(init_bert_params) + + def forward(self, x, padding_mask=None, layer=None): + x, layer_results = self.extract_features(x, padding_mask, layer) + + if self.layer_norm_first and layer is None: + x = self.layer_norm(x) + + return x, layer_results + + def extract_features(self, x, padding_mask=None, tgt_layer=None): + + if padding_mask is not None: + x = index_put(x, padding_mask, 0) + + x_conv = self.pos_conv(x.transpose(1, 2)) + x_conv = x_conv.transpose(1, 2) + x = x + x_conv + + if not self.layer_norm_first: + x = self.layer_norm(x) + + # pad to the sequence length dimension + x, pad_length = pad_to_multiple( + x, self.required_seq_len_multiple, dim=-2, value=0 + ) + if pad_length > 0 and padding_mask is None: + padding_mask = x.new_zeros((x.size(0), x.size(1)), dtype=torch.bool) + padding_mask[:, -pad_length:] = True + else: + padding_mask, _ = pad_to_multiple( + padding_mask, self.required_seq_len_multiple, dim=-1, value=True + ) + x = F.dropout(x, p=self.dropout, training=self.training) + + # B x T x C -> T x B x C + x = x.transpose(0, 1) + + if self.use_rel_pos_enc: + x_len = x.shape[0] + pos_seq = torch.arange(0, x_len).long().to(x.device) + pos_seq = pos_seq[:, None] - pos_seq[None, :] + pos_k, pos_v = self.pos_emb(pos_seq) + else: + pos_k = None + + layer_results = [] + r = None + for i, layer in enumerate(self.layers): + dropout_probability = np.random.random() + if not self.training or (dropout_probability > self.layerdrop): + x, z = layer(x, self_attn_padding_mask=padding_mask, need_weights=False, pos_bias=pos_k) + if tgt_layer is not None: + # unpad if needed + if pad_length > 0: + layer_results.append( + ( + x[:-pad_length], + z[:, :-pad_length, :-pad_length] + if z is not None + else z, + ) + ) + else: + layer_results.append((x, z)) + if i == tgt_layer: + r = x + break + + if r is not None: + x = r + + # T x B x C -> B x T x C + x = x.transpose(0, 1) + # undo paddding + if pad_length > 0: + x = x[:, :-pad_length] + + return x, layer_results + + +class TransformerSentenceEncoderLayer(nn.Module): + """ + Implements a Transformer Encoder Layer used in BERT/XLM style pre-trained + models. + """ + + def __init__( + self, + embedding_dim: float = 768, + ffn_embedding_dim: float = 3072, + num_attention_heads: float = 8, + dropout: float = 0.1, + attention_dropout: float = 0.1, + activation_dropout: float = 0.1, + activation_fn: str = "relu", + layer_norm_first: bool = False, + has_relative_attention_bias: bool = False, + ) -> None: + + super().__init__() + # Initialize parameters + self.embedding_dim = embedding_dim + self.dropout = dropout + self.activation_dropout = activation_dropout + + # Initialize blocks + self.activation_fn = utils.get_activation_fn(activation_fn) + self.self_attn = MultiheadAttention( + self.embedding_dim, + num_attention_heads, + dropout=attention_dropout, + self_attention=True, + ) + + self.dropout1 = nn.Dropout(dropout) + self.dropout2 = nn.Dropout(self.activation_dropout) + self.dropout3 = nn.Dropout(dropout) + + self.layer_norm_first = layer_norm_first + + # layer norm associated with the self attention layer + self.self_attn_layer_norm = LayerNorm(self.embedding_dim) + self.fc1 = nn.Linear(self.embedding_dim, ffn_embedding_dim) + self.fc2 = nn.Linear(ffn_embedding_dim, self.embedding_dim) + + # layer norm associated with the position wise feed-forward NN + self.final_layer_norm = LayerNorm(self.embedding_dim) + + if has_relative_attention_bias: + self.norm_k = LayerNorm(self.embedding_dim//num_attention_heads) + + def forward( + self, + x: torch.Tensor, + self_attn_mask: torch.Tensor = None, + self_attn_padding_mask: torch.Tensor = None, + need_weights: bool = False, + att_args=None, + pos_bias=None, + ): + """ + LayerNorm is applied either before or after the self-attention/ffn + modules similar to the original Transformer imlementation. + """ + residual = x + + if self.layer_norm_first: + x = self.self_attn_layer_norm(x) + if pos_bias is not None: + pos_bias = self.norm_k(pos_bias) + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + attn_mask=self_attn_mask, + position_bias=pos_bias, + ) + x = self.dropout1(x) + x = residual + x + + residual = x + x = self.final_layer_norm(x) + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + else: + x, attn = self.self_attn( + query=x, + key=x, + value=x, + key_padding_mask=self_attn_padding_mask, + position_bias=pos_bias, + ) + + x = self.dropout1(x) + x = residual + x + + x = self.self_attn_layer_norm(x) + + residual = x + x = self.activation_fn(self.fc1(x)) + x = self.dropout2(x) + x = self.fc2(x) + x = self.dropout3(x) + x = residual + x + x = self.final_layer_norm(x) + + return x, attn diff --git a/YiTrans/yitrans_iwslt22/sequence_generator.py b/YiTrans/yitrans_iwslt22/sequence_generator.py new file mode 100644 index 0000000..5f80669 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/sequence_generator.py @@ -0,0 +1,999 @@ +""" + Modified from + https://github.com/facebookresearch/fairseq/blob/main/fairseq/sequence_generator.py + +""" + +import math +from typing import Dict, List, Optional +import sys + +import torch +import torch.nn as nn +from fairseq import search, utils +from fairseq.data import data_utils +from fairseq.models import FairseqIncrementalDecoder +from torch import Tensor +from fairseq.ngram_repeat_block import NGramRepeatBlock +import numpy + + +class SequenceGenerator(nn.Module): + def __init__( + self, + models, + tgt_dict, + beam_size=1, + max_len_a=0, + max_len_b=200, + max_len=0, + min_len=1, + normalize_scores=True, + len_penalty=1.0, + unk_penalty=0.0, + temperature=1.0, + match_source_len=False, + no_repeat_ngram_size=0, + search_strategy=None, + eos=None, + bos=None, + symbols_to_strip_from_output=None, + lm_model=None, + lm_weight=1.0, + ctc_weight=0.0, + ): + """Generates translations of a given source sentence. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models, + currently support fairseq.models.TransformerModel for scripting + beam_size (int, optional): beam width (default: 1) + max_len_a/b (int, optional): generate sequences of maximum length + ax + b, where x is the source length + max_len (int, optional): the maximum length of the generated output + (not including end-of-sentence) + min_len (int, optional): the minimum length of the generated output + (not including end-of-sentence) + normalize_scores (bool, optional): normalize scores by the length + of the output (default: True) + len_penalty (float, optional): length penalty, where <1.0 favors + shorter, >1.0 favors longer sentences (default: 1.0) + unk_penalty (float, optional): unknown word penalty, where <0 + produces more unks, >0 produces fewer (default: 0.0) + temperature (float, optional): temperature, where values + >1.0 produce more uniform samples and values <1.0 produce + sharper samples (default: 1.0) + match_source_len (bool, optional): outputs should match the source + length (default: False) + """ + super().__init__() + if isinstance(models, EnsembleModel): + self.model = models + else: + self.model = EnsembleModel(models) + self.tgt_dict = tgt_dict + self.pad = tgt_dict.pad() + self.unk = tgt_dict.unk() + self.eos = tgt_dict.eos() if eos is None else eos + self.bos = self.eos if bos is None else bos + self.blank = self.tgt_dict.index("<s>") + self.symbols_to_strip_from_output = ( + symbols_to_strip_from_output.union({self.eos}) + if symbols_to_strip_from_output is not None + else {self.eos} + ) + self.vocab_size = len(tgt_dict) + self.beam_size = beam_size + # the max beam size is the dictionary size - 1, since we never select pad + self.beam_size = min(beam_size, self.vocab_size - 1) + self.max_len_a = max_len_a + self.max_len_b = max_len_b + self.min_len = min_len + self.max_len = max_len or self.model.max_decoder_positions() + + self.normalize_scores = normalize_scores + self.len_penalty = len_penalty + self.unk_penalty = unk_penalty + self.temperature = temperature + self.match_source_len = match_source_len + + if no_repeat_ngram_size > 0: + self.repeat_ngram_blocker = NGramRepeatBlock(no_repeat_ngram_size) + else: + self.repeat_ngram_blocker = None + + assert temperature > 0, "--temperature must be greater than 0" + + self.search = ( + search.BeamSearch(tgt_dict) if search_strategy is None else search_strategy + ) + # We only need to set src_lengths in LengthConstrainedBeamSearch. + # As a module attribute, setting it would break in multithread + # settings when the model is shared. + self.should_set_src_lengths = ( + hasattr(self.search, "needs_src_lengths") and self.search.needs_src_lengths + ) + + self.model.eval() + + self.lm_model = lm_model + self.lm_weight = lm_weight + self.ctc_weight = ctc_weight + if self.lm_model is not None: + self.lm_model.eval() + + def cuda(self): + self.model.cuda() + return self + + @torch.no_grad() + def forward( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + """Generate a batch of translations. + + Args: + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, prefix_tokens, bos_token=bos_token) + + # TODO(myleott): unused, deprecate after pytorch-translate migration + def generate_batched_itr(self, data_itr, beam_size=None, cuda=False, timer=None): + """Iterate over a batched dataset and yield individual translations. + Args: + cuda (bool, optional): use GPU for generation + timer (StopwatchMeter, optional): time generations + """ + for sample in data_itr: + s = utils.move_to_cuda(sample) if cuda else sample + if "net_input" not in s: + continue + input = s["net_input"] + # model.forward normally channels prev_output_tokens into the decoder + # separately, but SequenceGenerator directly calls model.encoder + encoder_input = { + k: v for k, v in input.items() if k != "prev_output_tokens" + } + if timer is not None: + timer.start() + with torch.no_grad(): + hypos = self.generate(encoder_input) + if timer is not None: + timer.stop(sum(len(h[0]["tokens"]) for h in hypos)) + for i, id in enumerate(s["id"].data): + # remove padding + src = utils.strip_pad(input["src_tokens"].data[i, :], self.pad) + ref = ( + utils.strip_pad(s["target"].data[i, :], self.pad) + if s["target"] is not None + else None + ) + yield id, src, ref, hypos[i] + + @torch.no_grad() + def generate( + self, models, sample: Dict[str, Dict[str, Tensor]], **kwargs + ) -> List[List[Dict[str, Tensor]]]: + """Generate translations. Match the api of other fairseq generators. + + Args: + models (List[~fairseq.models.FairseqModel]): ensemble of models + sample (dict): batch + prefix_tokens (torch.LongTensor, optional): force decoder to begin + with these tokens + constraints (torch.LongTensor, optional): force decoder to include + the list of constraints + bos_token (int, optional): beginning of sentence token + (default: self.eos) + """ + return self._generate(sample, **kwargs) + + def _generate( + self, + sample: Dict[str, Dict[str, Tensor]], + prefix_tokens: Optional[Tensor] = None, + constraints: Optional[Tensor] = None, + bos_token: Optional[int] = None, + ): + incremental_states = torch.jit.annotate( + List[Dict[str, Dict[str, Optional[Tensor]]]], + [ + torch.jit.annotate(Dict[str, Dict[str, Optional[Tensor]]], {}) + for i in range(self.model.models_size) + ], + ) + net_input = sample["net_input"] + + if "src_tokens" in net_input: + src_tokens = net_input["src_tokens"] + # length of the source text being the character length except EndOfSentence and pad + src_lengths = ( + (src_tokens.ne(self.eos) & src_tokens.ne(self.pad)).long().sum(dim=1) + ) + elif "source" in net_input: + src_tokens = net_input["source"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + elif "features" in net_input: + src_tokens = net_input["features"] + src_lengths = ( + net_input["padding_mask"].size(-1) - net_input["padding_mask"].sum(-1) + if net_input["padding_mask"] is not None + else torch.tensor(src_tokens.size(-1)).to(src_tokens) + ) + else: + raise Exception( + "expected src_tokens or source in net input. input keys: " + + str(net_input.keys()) + ) + + # bsz: total number of sentences in beam + # Note that src_tokens may have more than 2 dimensions (i.e. audio features) + bsz, src_len = src_tokens.size()[:2] + beam_size = self.beam_size + + if constraints is not None and not self.search.supports_constraints: + raise NotImplementedError( + "Target-side constraints were provided, but search method doesn't support them" + ) + + # Initialize constraints, when active + self.search.init_constraints(constraints, beam_size) + + max_len: int = -1 + if self.match_source_len: + max_len = src_lengths.max().item() + else: + max_len = min( + int(self.max_len_a * src_len + self.max_len_b), + self.max_len - 1, + ) + assert ( + self.min_len <= max_len + ), "min_len cannot be larger than max_len, please adjust these!" + # compute the encoder output for each beam + with torch.autograd.profiler.record_function("EnsembleModel: forward_encoder"): + encoder_outs = self.model.forward_encoder(net_input) + + dec_sos = sample["lang_idx"] if ("lang_idx" in sample and sample["lang_idx"] is not None) else (self.bos if bos_token is None else bos_token) + # placeholder of indices for bsz * beam_size to hold tokens and accumulative scores + new_order = torch.arange(bsz).view(-1, 1).repeat(1, beam_size).view(-1) + new_order = new_order.to(src_tokens.device).long() + encoder_outs = self.model.reorder_encoder_out(encoder_outs, new_order) + # ensure encoder_outs is a List. + assert encoder_outs is not None + + # initialize buffers + scores = ( + torch.zeros(bsz * beam_size, max_len + 1).to(src_tokens).float() + ) # +1 for eos; pad is never chosen for scoring + tokens = ( + torch.zeros(bsz * beam_size, max_len + 2) + .to(src_tokens) + .long() + .fill_(self.pad) + ) # +2 for eos and pad + tokens[:, 0] = dec_sos + attn: Optional[Tensor] = None + + # A list that indicates candidates that should be ignored. + # For example, suppose we're sampling and have already finalized 2/5 + # samples. Then cands_to_ignore would mark 2 positions as being ignored, + # so that we only finalize the remaining 3 samples. + cands_to_ignore = ( + torch.zeros(bsz, beam_size).to(src_tokens).eq(-1) + ) # forward and backward-compatible False mask + + # list of completed sentences + finalized = torch.jit.annotate( + List[List[Dict[str, Tensor]]], + [torch.jit.annotate(List[Dict[str, Tensor]], []) for i in range(bsz)], + ) # contains lists of dictionaries of infomation about the hypothesis being finalized at each step + + # a boolean array indicating if the sentence at the index is finished or not + finished = [False for i in range(bsz)] + num_remaining_sent = bsz # number of sentences remaining + + # number of candidate hypos per step + cand_size = 2 * beam_size # 2 x beam size in case half are EOS + + # offset arrays for converting between different indexing schemes + bbsz_offsets = ( + (torch.arange(0, bsz) * beam_size) + .unsqueeze(1) + .type_as(tokens) + .to(src_tokens.device) + ) + cand_offsets = torch.arange(0, cand_size).type_as(tokens).to(src_tokens.device) + + reorder_state: Optional[Tensor] = None + batch_idxs: Optional[Tensor] = None + + original_batch_idxs: Optional[Tensor] = None + if "id" in sample and isinstance(sample["id"], Tensor): + original_batch_idxs = sample["id"] + else: + original_batch_idxs = torch.arange(0, bsz).type_as(tokens) + + for step in range(max_len + 1): # one extra step for EOS marker + # reorder decoder internal states based on the prev choice of beams + if reorder_state is not None: + if batch_idxs is not None: + # update beam indices to take into account removed sentences + corr = batch_idxs - torch.arange(batch_idxs.numel()).type_as( + batch_idxs + ) + reorder_state.view(-1, beam_size).add_( + corr.unsqueeze(-1) * beam_size + ) + original_batch_idxs = original_batch_idxs[batch_idxs] + self.model.reorder_incremental_state(incremental_states, reorder_state) + encoder_outs = self.model.reorder_encoder_out( + encoder_outs, reorder_state + ) + with torch.autograd.profiler.record_function( + "EnsembleModel: forward_decoder" + ): + lprobs, avg_attn_scores = self.model.forward_decoder( + tokens[:, : step + 1], + encoder_outs, + incremental_states, + self.temperature, + ) + + if self.lm_model is not None: + lm_out = self.lm_model(tokens[:, : step + 1]) + probs = self.lm_model.get_normalized_probs( + lm_out, log_probs=True, sample=None + ) + probs = probs[:, -1, :] * self.lm_weight + lprobs += probs + # handle prefix tokens (possibly with different lengths) + if ( + prefix_tokens is not None + and step < prefix_tokens.size(1) + and step < max_len + ): + lprobs, tokens, scores = self._prefix_tokens( + step, lprobs, scores, tokens, prefix_tokens, beam_size + ) + elif step < self.min_len: + # minimum length constraint (does not apply if using prefix_tokens) + lprobs[:, self.eos] = -math.inf + + lprobs[lprobs != lprobs] = torch.tensor(-math.inf).to(lprobs) + + lprobs[:, self.pad] = -math.inf # never select pad + lprobs[:, self.unk] -= self.unk_penalty # apply unk penalty + lprobs[:, self.blank] = -math.inf # never select blank + if dec_sos != self.eos: + lprobs[:, dec_sos] = -math.inf # never select lang id + + # handle max length constraint + if step >= max_len: + lprobs[:, : self.eos] = -math.inf + lprobs[:, self.eos + 1 :] = -math.inf + + # Record attention scores, only support avg_attn_scores is a Tensor + if avg_attn_scores is not None: + if attn is None: + attn = torch.empty( + bsz * beam_size, avg_attn_scores.size(1), max_len + 2 + ).to(scores) + attn[:, :, step + 1].copy_(avg_attn_scores) + + scores = scores.type_as(lprobs) + eos_bbsz_idx = torch.empty(0).to( + tokens + ) # indices of hypothesis ending with eos (finished sentences) + eos_scores = torch.empty(0).to( + scores + ) # scores of hypothesis ending with eos (finished sentences) + + if self.should_set_src_lengths: + self.search.set_src_lengths(src_lengths) + + if self.repeat_ngram_blocker is not None: + lprobs = self.repeat_ngram_blocker(tokens, lprobs, bsz, beam_size, step) + + # Shape: (batch, cand_size) + cand_scores, cand_indices, cand_beams = self.search.step( + step, + lprobs.view(bsz, -1, self.vocab_size), + scores.view(bsz, beam_size, -1)[:, :, :step], + tokens[:, : step + 1], + original_batch_idxs, + ) + + # cand_bbsz_idx contains beam indices for the top candidate + # hypotheses, with a range of values: [0, bsz*beam_size), + # and dimensions: [bsz, cand_size] + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + + # finalize hypotheses that end in eos + # Shape of eos_mask: (batch size, beam size) + eos_mask = cand_indices.eq(self.eos) & cand_scores.ne(-math.inf) + eos_mask[:, :beam_size][cands_to_ignore] = torch.tensor(0).to(eos_mask) + + # only consider eos when it's among the top beam_size indices + # Now we know what beam item(s) to finish + # Shape: 1d list of absolute-numbered + eos_bbsz_idx = torch.masked_select( + cand_bbsz_idx[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents: List[int] = [] + if eos_bbsz_idx.numel() > 0: + eos_scores = torch.masked_select( + cand_scores[:, :beam_size], mask=eos_mask[:, :beam_size] + ) + + finalized_sents = self.finalize_hypos( + step, + eos_bbsz_idx, + eos_scores, + tokens, + scores, + finalized, + finished, + beam_size, + attn, + src_lengths, + max_len, + ) + num_remaining_sent -= len(finalized_sents) + + assert num_remaining_sent >= 0 + if num_remaining_sent == 0: + break + if self.search.stop_on_max_len and step >= max_len: + break + assert step < max_len, f"{step} < {max_len}" + + # Remove finalized sentences (ones for which {beam_size} + # finished hypotheses have been generated) from the batch. + if len(finalized_sents) > 0: + new_bsz = bsz - len(finalized_sents) + + # construct batch_idxs which holds indices of batches to keep for the next pass + batch_mask = torch.ones( + bsz, dtype=torch.bool, device=cand_indices.device + ) + batch_mask[finalized_sents] = False + # TODO replace `nonzero(as_tuple=False)` after TorchScript supports it + batch_idxs = torch.arange( + bsz, device=cand_indices.device + ).masked_select(batch_mask) + + # Choose the subset of the hypothesized constraints that will continue + self.search.prune_sentences(batch_idxs) + + eos_mask = eos_mask[batch_idxs] + cand_beams = cand_beams[batch_idxs] + bbsz_offsets.resize_(new_bsz, 1) + cand_bbsz_idx = cand_beams.add(bbsz_offsets) + cand_scores = cand_scores[batch_idxs] + cand_indices = cand_indices[batch_idxs] + + if prefix_tokens is not None: + prefix_tokens = prefix_tokens[batch_idxs] + src_lengths = src_lengths[batch_idxs] + cands_to_ignore = cands_to_ignore[batch_idxs] + + scores = scores.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + tokens = tokens.view(bsz, -1)[batch_idxs].view(new_bsz * beam_size, -1) + if attn is not None: + attn = attn.view(bsz, -1)[batch_idxs].view( + new_bsz * beam_size, attn.size(1), -1 + ) + bsz = new_bsz + else: + batch_idxs = None + + # Set active_mask so that values > cand_size indicate eos hypos + # and values < cand_size indicate candidate active hypos. + # After, the min values per row are the top candidate active hypos + + # Rewrite the operator since the element wise or is not supported in torchscript. + + eos_mask[:, :beam_size] = ~((~cands_to_ignore) & (~eos_mask[:, :beam_size])) + active_mask = torch.add( + eos_mask.type_as(cand_offsets) * cand_size, + cand_offsets[: eos_mask.size(1)], + ) + + # get the top beam_size active hypotheses, which are just + # the hypos with the smallest values in active_mask. + # {active_hypos} indicates which {beam_size} hypotheses + # from the list of {2 * beam_size} candidates were + # selected. Shapes: (batch size, beam size) + new_cands_to_ignore, active_hypos = torch.topk( + active_mask, k=beam_size, dim=1, largest=False + ) + + # update cands_to_ignore to ignore any finalized hypos. + cands_to_ignore = new_cands_to_ignore.ge(cand_size)[:, :beam_size] + # Make sure there is at least one active item for each sentence in the batch. + assert (~cands_to_ignore).any(dim=1).all() + + # update cands_to_ignore to ignore any finalized hypos + + # {active_bbsz_idx} denotes which beam number is continued for each new hypothesis (a beam + # can be selected more than once). + active_bbsz_idx = torch.gather(cand_bbsz_idx, dim=1, index=active_hypos) + active_scores = torch.gather(cand_scores, dim=1, index=active_hypos) + + active_bbsz_idx = active_bbsz_idx.view(-1) + active_scores = active_scores.view(-1) + + # copy tokens and scores for active hypotheses + + # Set the tokens for each beam (can select the same row more than once) + tokens[:, : step + 1] = torch.index_select( + tokens[:, : step + 1], dim=0, index=active_bbsz_idx + ) + # Select the next token for each of them + tokens.view(bsz, beam_size, -1)[:, :, step + 1] = torch.gather( + cand_indices, dim=1, index=active_hypos + ) + if step > 0: + scores[:, :step] = torch.index_select( + scores[:, :step], dim=0, index=active_bbsz_idx + ) + scores.view(bsz, beam_size, -1)[:, :, step] = torch.gather( + cand_scores, dim=1, index=active_hypos + ) + + # Update constraints based on which candidates were selected for the next beam + self.search.update_constraints(active_hypos) + + # copy attention for active hypotheses + if attn is not None: + attn[:, :, : step + 2] = torch.index_select( + attn[:, :, : step + 2], dim=0, index=active_bbsz_idx + ) + + # reorder incremental state in decoder + reorder_state = active_bbsz_idx + + # sort by score descending + for sent in range(len(finalized)): + scores = torch.tensor( + [float(elem["score"].item()) for elem in finalized[sent]] + ) + _, sorted_scores_indices = torch.sort(scores, descending=True) + finalized[sent] = [finalized[sent][ssi] for ssi in sorted_scores_indices] + finalized[sent] = torch.jit.annotate( + List[Dict[str, Tensor]], finalized[sent] + ) + return finalized + + def _prefix_tokens( + self, step: int, lprobs, scores, tokens, prefix_tokens, beam_size: int + ): + """Handle prefix tokens""" + prefix_toks = prefix_tokens[:, step].unsqueeze(-1).repeat(1, beam_size).view(-1) + prefix_lprobs = lprobs.gather(-1, prefix_toks.unsqueeze(-1)) + prefix_mask = prefix_toks.ne(self.pad) + lprobs[prefix_mask] = torch.tensor(-math.inf).to(lprobs) + lprobs[prefix_mask] = lprobs[prefix_mask].scatter( + -1, prefix_toks[prefix_mask].unsqueeze(-1), prefix_lprobs[prefix_mask] + ) + # if prefix includes eos, then we should make sure tokens and + # scores are the same across all beams + eos_mask = prefix_toks.eq(self.eos) + if eos_mask.any(): + # validate that the first beam matches the prefix + first_beam = tokens[eos_mask].view(-1, beam_size, tokens.size(-1))[ + :, 0, 1 : step + 1 + ] + eos_mask_batch_dim = eos_mask.view(-1, beam_size)[:, 0] + target_prefix = prefix_tokens[eos_mask_batch_dim][:, :step] + assert (first_beam == target_prefix).all() + + # copy tokens, scores and lprobs from the first beam to all beams + tokens = self.replicate_first_beam(tokens, eos_mask_batch_dim, beam_size) + scores = self.replicate_first_beam(scores, eos_mask_batch_dim, beam_size) + lprobs = self.replicate_first_beam(lprobs, eos_mask_batch_dim, beam_size) + return lprobs, tokens, scores + + def replicate_first_beam(self, tensor, mask, beam_size: int): + tensor = tensor.view(-1, beam_size, tensor.size(-1)) + tensor[mask] = tensor[mask][:, :1, :] + return tensor.view(-1, tensor.size(-1)) + + def finalize_hypos( + self, + step: int, + bbsz_idx, + eos_scores, + tokens, + scores, + finalized: List[List[Dict[str, Tensor]]], + finished: List[bool], + beam_size: int, + attn: Optional[Tensor], + src_lengths, + max_len: int, + ): + """Finalize hypothesis, store finalized information in `finalized`, and change `finished` accordingly. + A sentence is finalized when {beam_size} finished items have been collected for it. + + Returns number of sentences (not beam items) being finalized. + These will be removed from the batch and not processed further. + Args: + bbsz_idx (Tensor): + """ + assert bbsz_idx.numel() == eos_scores.numel() + + # clone relevant token and attention tensors. + # tokens is (batch * beam, max_len). So the index_select + # gets the newly EOS rows, then selects cols 1..{step + 2} + tokens_clone = tokens.index_select(0, bbsz_idx)[ + :, 1 : step + 2 + ] # skip the first index, which is EOS + + tokens_clone[:, step] = self.eos + attn_clone = ( + attn.index_select(0, bbsz_idx)[:, :, 1 : step + 2] + if attn is not None + else None + ) + + # compute scores per token position + pos_scores = scores.index_select(0, bbsz_idx)[:, : step + 1] + pos_scores[:, step] = eos_scores + # convert from cumulative to per-position scores + pos_scores[:, 1:] = pos_scores[:, 1:] - pos_scores[:, :-1] + + # normalize sentence-level scores + if self.normalize_scores: + eos_scores /= (step + 1) ** self.len_penalty + + # cum_unfin records which sentences in the batch are finished. + # It helps match indexing between (a) the original sentences + # in the batch and (b) the current, possibly-reduced set of + # sentences. + cum_unfin: List[int] = [] + prev = 0 + for f in finished: + if f: + prev += 1 + else: + cum_unfin.append(prev) + cum_fin_tensor = torch.tensor(cum_unfin, dtype=torch.int).to(bbsz_idx) + + unfin_idx = bbsz_idx // beam_size + sent = unfin_idx + torch.index_select(cum_fin_tensor, 0, unfin_idx) + + # Create a set of "{sent}{unfin_idx}", where + # "unfin_idx" is the index in the current (possibly reduced) + # list of sentences, and "sent" is the index in the original, + # unreduced batch + # For every finished beam item + # sentence index in the current (possibly reduced) batch + seen = (sent << 32) + unfin_idx + unique_seen: List[int] = torch.unique(seen).tolist() + + if self.match_source_len: + condition = step > torch.index_select(src_lengths, 0, unfin_idx) + eos_scores = torch.where(condition, torch.tensor(-math.inf), eos_scores) + sent_list: List[int] = sent.tolist() + for i in range(bbsz_idx.size()[0]): + # An input sentence (among those in a batch) is finished when + # beam_size hypotheses have been collected for it + if len(finalized[sent_list[i]]) < beam_size: + if attn_clone is not None: + # remove padding tokens from attn scores + hypo_attn = attn_clone[i] + else: + hypo_attn = torch.empty(0) + + finalized[sent_list[i]].append( + { + "tokens": tokens_clone[i], + "score": eos_scores[i], + "attention": hypo_attn, # src_len x tgt_len + "alignment": torch.empty(0), + "positional_scores": pos_scores[i], + } + ) + + newly_finished: List[int] = [] + for unique_s in unique_seen: + # check termination conditions for this sentence + unique_sent: int = unique_s >> 32 + unique_unfin_idx: int = unique_s - (unique_sent << 32) + + if not finished[unique_sent] and self.is_finished( + step, unique_unfin_idx, max_len, len(finalized[unique_sent]), beam_size + ): + finished[unique_sent] = True + newly_finished.append(unique_unfin_idx) + + return newly_finished + + def is_finished( + self, + step: int, + unfin_idx: int, + max_len: int, + finalized_sent_len: int, + beam_size: int, + ): + """ + Check whether decoding for a sentence is finished, which + occurs when the list of finalized sentences has reached the + beam size, or when we reach the maximum length. + """ + assert finalized_sent_len <= beam_size + if finalized_sent_len == beam_size or step == max_len: + return True + return False + + +class EnsembleModel(nn.Module): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__() + self.models_size = len(models) + # method '__len__' is not supported in ModuleList for torch script + self.single_model = models[0] + self.models = nn.ModuleList(models) + + self.has_incremental: bool = False + if all( + hasattr(m, "decoder") and isinstance(m.decoder, FairseqIncrementalDecoder) + for m in models + ): + self.has_incremental = True + + def forward(self): + pass + + def has_encoder(self): + return hasattr(self.single_model, "encoder") + + def has_incremental_states(self): + return self.has_incremental + + def max_decoder_positions(self): + return min( + [ + m.max_decoder_positions() + for m in self.models + if hasattr(m, "max_decoder_positions") + ] + + [sys.maxsize] + ) + + @torch.jit.export + def forward_encoder(self, net_input: Dict[str, Tensor]): + if not self.has_encoder(): + return None + return [model.encoder.forward_torchscript(net_input) for model in self.models] + + @torch.jit.export + def forward_decoder( + self, + tokens, + encoder_outs: List[Dict[str, List[Tensor]]], + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + temperature: float = 1.0, + ): + log_probs = [] + avg_attn: Optional[Tensor] = None + encoder_out: Optional[Dict[str, List[Tensor]]] = None + for i, model in enumerate(self.models): + if self.has_encoder(): + encoder_out = encoder_outs[i] + # decode each model + if self.has_incremental_states(): + decoder_out = model.decoder.forward( + tokens, + encoder_out=encoder_out, + incremental_state=incremental_states[i], + modal_idx=-1, + ) + else: + if hasattr(model, "decoder"): + decoder_out = model.decoder.forward(tokens, encoder_out=encoder_out) + else: + decoder_out = model.forward(tokens) + + attn: Optional[Tensor] = None + decoder_len = len(decoder_out) + if decoder_len > 1 and decoder_out[1] is not None: + if isinstance(decoder_out[1], Tensor): + attn = decoder_out[1] + else: + attn_holder = decoder_out[1]["attn"] + if isinstance(attn_holder, Tensor): + attn = attn_holder + elif attn_holder is not None: + attn = attn_holder[0] + if attn is not None: + attn = attn[:, -1, :] + + decoder_out_tuple = ( + decoder_out[0][:, -1:, :].div_(temperature), + None if decoder_len <= 1 else decoder_out[1], + ) + probs = model.get_normalized_probs( + decoder_out_tuple, log_probs=True, sample=None + ) + probs = probs[:, -1, :] + if self.models_size == 1: + return probs, attn + + log_probs.append(probs) + if attn is not None: + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + + avg_probs = torch.logsumexp(torch.stack(log_probs, dim=0), dim=0) - math.log( + self.models_size + ) + + if avg_attn is not None: + avg_attn.div_(self.models_size) + return avg_probs, avg_attn + + @torch.jit.export + def reorder_encoder_out( + self, encoder_outs: Optional[List[Dict[str, List[Tensor]]]], new_order + ): + """ + Reorder encoder output according to *new_order*. + + Args: + encoder_out: output from the ``forward()`` method + new_order (LongTensor): desired order + + Returns: + *encoder_out* rearranged according to *new_order* + """ + new_outs: List[Dict[str, List[Tensor]]] = [] + if not self.has_encoder(): + return new_outs + for i, model in enumerate(self.models): + assert encoder_outs is not None + new_outs.append( + model.encoder.reorder_encoder_out(encoder_outs[i], new_order) + ) + return new_outs + + @torch.jit.export + def reorder_incremental_state( + self, + incremental_states: List[Dict[str, Dict[str, Optional[Tensor]]]], + new_order, + ): + if not self.has_incremental_states(): + return + for i, model in enumerate(self.models): + model.decoder.reorder_incremental_state_scripting( + incremental_states[i], new_order + ) + + +class SequenceGeneratorWithAlignment(SequenceGenerator): + def __init__( + self, models, tgt_dict, left_pad_target=False, print_alignment="hard", **kwargs + ): + """Generates translations of a given source sentence. + + Produces alignments following "Jointly Learning to Align and + Translate with Transformer Models" (Garg et al., EMNLP 2019). + + Args: + left_pad_target (bool, optional): Whether or not the + hypothesis should be left padded or not when they are + teacher forced for generating alignments. + """ + super().__init__(EnsembleModelWithAlignment(models), tgt_dict, **kwargs) + self.left_pad_target = left_pad_target + + if print_alignment == "hard": + self.extract_alignment = utils.extract_hard_alignment + elif print_alignment == "soft": + self.extract_alignment = utils.extract_soft_alignment + + @torch.no_grad() + def generate(self, models, sample, **kwargs): + finalized = super()._generate(sample, **kwargs) + + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + beam_size = self.beam_size + ( + src_tokens, + src_lengths, + prev_output_tokens, + tgt_tokens, + ) = self._prepare_batch_for_alignment(sample, finalized) + if any(getattr(m, "full_context_alignment", False) for m in self.model.models): + attn = self.model.forward_align(src_tokens, src_lengths, prev_output_tokens) + else: + attn = [ + finalized[i // beam_size][i % beam_size]["attention"].transpose(1, 0) + for i in range(bsz * beam_size) + ] + + if src_tokens.device != "cpu": + src_tokens = src_tokens.to("cpu") + tgt_tokens = tgt_tokens.to("cpu") + attn = [i.to("cpu") for i in attn] + + # Process the attn matrix to extract hard alignments. + for i in range(bsz * beam_size): + alignment = self.extract_alignment( + attn[i], src_tokens[i], tgt_tokens[i], self.pad, self.eos + ) + finalized[i // beam_size][i % beam_size]["alignment"] = alignment + return finalized + + def _prepare_batch_for_alignment(self, sample, hypothesis): + src_tokens = sample["net_input"]["src_tokens"] + bsz = src_tokens.shape[0] + src_tokens = ( + src_tokens[:, None, :] + .expand(-1, self.beam_size, -1) + .contiguous() + .view(bsz * self.beam_size, -1) + ) + src_lengths = sample["net_input"]["src_lengths"] + src_lengths = ( + src_lengths[:, None] + .expand(-1, self.beam_size) + .contiguous() + .view(bsz * self.beam_size) + ) + prev_output_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=True, + ) + tgt_tokens = data_utils.collate_tokens( + [beam["tokens"] for example in hypothesis for beam in example], + self.pad, + self.eos, + self.left_pad_target, + move_eos_to_beginning=False, + ) + return src_tokens, src_lengths, prev_output_tokens, tgt_tokens + + +class EnsembleModelWithAlignment(EnsembleModel): + """A wrapper around an ensemble of models.""" + + def __init__(self, models): + super().__init__(models) + + def forward_align(self, src_tokens, src_lengths, prev_output_tokens): + avg_attn = None + for model in self.models: + decoder_out = model(src_tokens, src_lengths, prev_output_tokens) + attn = decoder_out[1]["attn"][0] + if avg_attn is None: + avg_attn = attn + else: + avg_attn.add_(attn) + if len(self.models) > 1: + avg_attn.div_(len(self.models)) + return avg_attn diff --git a/YiTrans/yitrans_iwslt22/tasks/iwslt_joint_pretraining.py b/YiTrans/yitrans_iwslt22/tasks/iwslt_joint_pretraining.py new file mode 100644 index 0000000..fbbba14 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/tasks/iwslt_joint_pretraining.py @@ -0,0 +1,726 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from + https://github.com/facebookresearch/fairseq/blob/main/fairseq/tasks/hubert_pretraining.py + https://github.com/facebookresearch/fairseq/blob/main/fairseq/tasks/denoising.py + + Pre-training task for YiTrans@IWSLT2022 + Step1: Combine Speech2C and multilingual BART + Step2: Combine ASR and multilingual MT +""" +import logging +import os +import sys +from typing import Dict, List, Optional, Tuple +from pathlib import Path + +import numpy as np +from argparse import Namespace +from collections import OrderedDict + +from dataclasses import dataclass, field +from fairseq.data import Dictionary, encoders +from fairseq.data import ( + Dictionary, + data_utils, + StripTokenDataset, + PrependTokenDataset, + AppendTokenDataset, + FairseqDataset, + iterators, + ResamplingDataset, +) +from fairseq.data.audio.speech_to_text_joint_dataset import S2TJointDataConfig +from fairseq.data.shorten_dataset import maybe_shorten_dataset +from fairseq.data.encoders.utils import get_whole_word_mask +from fairseq.dataclass.configs import FairseqDataclass +from fairseq.tasks import register_task +from fairseq.tasks.fairseq_task import FairseqTask +from fairseq.dataclass.constants import ChoiceEnum + +from fairseq.tasks.hubert_pretraining import HubertPretrainingConfig +from yitrans_iwslt22.data.load_langpair_dataset import load_langpair_dataset +from yitrans_iwslt22.data.lang_pair_mask_dataset import LangPairMaskDataset +from yitrans_iwslt22.data.speech2c_dataset import Speech2cDataset +from yitrans_iwslt22.data.denoising_dataset import DenoisingDatasetLang +from yitrans_iwslt22.data.concat_dataset import ConcatDataset +from yitrans_iwslt22.data.multimodal_corpus_dataset import MultiCorpusDataset + + +logger = logging.getLogger(__name__) +TOKENIZER_CHOICES = ChoiceEnum(["sentencepiece", "hubert_letters", "none"]) + +def _lang_token(lang: str): + return "<lang:{}>".format(lang) + +def _lang_token_index(dic: Dictionary, lang: str): + """Return language token index.""" + idx = dic.index(_lang_token(lang)) + assert idx != dic.unk_index, "cannot find language token for lang {}".format(lang) + return idx + +class LabelEncoder(object): + def __init__(self, dictionary: Dictionary) -> None: + self.dictionary = dictionary + + def __call__(self, label: str) -> List[str]: + return self.dictionary.encode_line( + label, append_eos=False, add_if_not_exist=False, + ) + +@dataclass +class TextPretrainingConfig(FairseqDataclass): + """ + Convert the legacy config of BART to the Dataclass style + """ + text_data: Optional[str] = field( + default=None, + metadata={ + "help": "if set, path to text data directory", + }, + ) + seed: Optional[int] = field( + default=1, + metadata={ + "help": "for ordered_indices in MulticorpusDataset", + }, + ) + tokens_per_sample: Optional[int] = field( + default=512, + metadata={ + "help": "max number of total tokens over all segments per sample for dataset", + }, + ) + sample_break_mode: Optional[str] = field( + default="eos", + metadata={ + "help": "mode for breaking sentence", + }, + ) + mask: Optional[float] = field( + default=0.3, + metadata={ + "help": "fraction of words/subwords that will be masked", + }, + ) + leave_unmasked_prob: float = field( + default=0.1, + metadata={"help": "probability that a masked token is unmasked"}, + ) + mask_random: Optional[float] = field( + default=0.0, + metadata={ + "help": "instead of using [MASK], use random token this often", + }, + ) + freq_weighted_replacement: bool = field( + default=False, + metadata={"help": "sample random replacement words based on word frequencies"}, + ) + mask_whole_words: bool = field( + default=False, + metadata={"help": "mask whole words; you may also want to set --bpe"}, + ) + mask_multiple_length: int = field( + default=1, + metadata={"help": "repeat the mask indices multiple times"}, + ) + mask_stdev: float = field( + default=0.0, + metadata={"help": "stdev of the mask length"}, + ) + shorten_method: Optional[str] = field( + default="none", + metadata={ + "help": "if not none, shorten sequences that exceed tokens_per_sample", + "choices": "none/truncate/random_crop" + }, + ) + shorten_data_split_list: Optional[str] = field( + default="", + metadata={ + "help": "comma_separated list of dataset splits to apply shortening to, e.g., train,valid (default: all dataset splits)", + }, + ) + ### below hypra-parameters is used in BART + insert: Optional[float] = field( + default=0.0, + metadata={ + "help": "insert this percentage of additional random tokens", + }, + ) + permute: Optional[float] = field( + default=0.0, + metadata={ + "help": "take this proportion of subwords and permute them", + }, + ) + rotate: Optional[float] = field( + default=0.0, + metadata={ + "help": "rotate this proportion of inputs", + }, + ) + poisson_lambda: Optional[float] = field( + default=3, + metadata={ + "help": "randomly shuffle sentences for this proportion of inputs", + }, + ) + permute_sentences: Optional[float] = field( + default=0.0, + metadata={ + "help": "shuffle this proportion of sentences in all inputs", + }, + ) + mask_length: Optional[str] = field( + default="span-poisson", + metadata={ + "help": "mask length to choose", + "choice": "subword/word/span-poisson" + }, + ) + replace_length: Optional[int] = field( + default=1, + metadata={ + "help": "when masking N tokens, replace with 0, 1, or N tokens (use -1 for N)", + }, + ) + shuffle_instance: Optional[bool] = field( + default=False, + metadata={"help": "shuffle instance"}, + ) + max_source_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the source sequence"}, + ) + max_target_positions: Optional[int] = field( + default=1024, + metadata={"help": "max number of tokens in the target sequence"}, + ) + bpe: Optional[str] = field( + default="sentencepiece", + metadata={ + "help": "will wrapped by the text_data_config yaml", + }, + ) + data_config: Optional[str] = field( + default=None, + metadata={ + "help": "a config yaml specify the bpe model of text data", + }, + ) + text_maxtokens_ratio: Optional[float] = field( + default=1.0, + metadata={ + "help": "for text, max_tokens = max_tokens * text_maxtokens_ratio / 320 ", + }, + ) + prepend_tgt_lang_tag: bool = field( + default=True, + metadata={"help": "prepend tgt_lang_tag to replace <eos>"}, + ) + mask_text_ratio: Optional[float] = field( + default=0.0, + metadata={ + "help": "mask_text_ratio, for paired data", + }, + ) + + +@dataclass +class JointPretrainingConfig(HubertPretrainingConfig): + store_labels: Optional[bool] = field( + default=False, + metadata={"help": "store spm labels in memory, should be true when fine-tune with bpe"}, + ) + add_decoder: bool = field( + default=False, + metadata={"help": "whether to add decoder for CE Loss on code"}, + ) + split_modality_batch: bool = field( + default=False, + metadata={"help": "whether create all samples of different modalities in a batch"}, + ) + speech_tgt_lang: str = field( + default="", + metadata={"help": "prepend <tgt-id> to prev_output_tokens to replace <eos>, only used for decoder"}, + ) + speech_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based speech resampling." + "(alpha = 1 for no resampling)" + }, + ) + text_sampling_alpha: float = field( + default=0.2, + metadata={ + "help": "Hyper-parameter alpha = 1/T for temperature-based text resampling." + "(alpha = 1 for no resampling)" + }, + ) + hubert_tokenizer: Optional[TOKENIZER_CHOICES] = field( + default="none", + metadata={"help": "which tokenizer for processing text"}, + ) + sp_path: Optional[str] = field( + default=None, + metadata={"help": "sentencepiece model path if using bpe tokenizer"}, + ) + text_cfg: TextPretrainingConfig = TextPretrainingConfig() + + +@register_task("iwslt_joint_pretraining", dataclass=JointPretrainingConfig) +class JointPretrainingTask(FairseqTask): + cfg: JointPretrainingConfig + def __init__( + self, + cfg: JointPretrainingConfig, + ) -> None: + super().__init__(cfg) + + logger.info(f"current directory is {os.getcwd()}") + logger.info(f"JointPretrainingTask Config {cfg}") + + self.cfg = cfg + self.fine_tuning = cfg.fine_tuning + self.blank_symbol = "<s>" + + self.state.add_factory("hubert_tokenizer", self.build_tokenizer) + self.state.add_factory("text_dictionary", self.load_text_dictionary) + self.state.add_factory("text_src_dictionary", self.load_text_src_dictionary) + if cfg.fine_tuning: + self.state.add_factory("target_dictionary", self.load_dictionaries) + else: + self.state.add_factory("dictionaries", self.load_dictionaries) + + if cfg.text_cfg.data_config is not None: + self.text_data_cfg = S2TJointDataConfig(Path(f"{cfg.text_cfg.text_data}/{cfg.text_cfg.data_config}")) + self.cfg.text_cfg.bpe = self.text_data_cfg.bpe_tokenizer["bpe"] + + @property + def source_dictionary(self) -> Optional[Dictionary]: + return None + + @property + def target_dictionary(self) -> Optional[Dictionary]: + return self.state.target_dictionary + + @property + def dictionaries(self) -> List[Dictionary]: + return self.state.dictionaries + + @property + def text_dictionary(self) -> Optional[Dictionary]: + return self.state.text_dictionary + + @property + def text_src_dictionary(self) -> Optional[Dictionary]: + return self.state.text_src_dictionary + + @property + def hubert_tokenizer(self): + return self.state.hubert_tokenizer + + def load_dictionaries(self): + label_dir = self.cfg.data if self.cfg.label_dir is None else self.cfg.label_dir + dictionaries = [Dictionary.load(f"{label_dir}/dict.{label}.txt") for label in self.cfg.labels] + return dictionaries[0] if self.cfg.fine_tuning else dictionaries + + def load_text_dictionary(self): + tgt_dict_path = f"{self.cfg.text_cfg.text_data}/{self.text_data_cfg.vocab_filename}" + if not os.path.isfile(tgt_dict_path): + raise FileNotFoundError(f"Dict not found: {tgt_dict_path}") + text_dictionary = Dictionary.load(tgt_dict_path) + self.mask_idx = text_dictionary.add_symbol("<mask>") + return text_dictionary + + def load_text_src_dictionary(self): + return self.load_text_dictionary() + + @classmethod + def setup_task( + cls, cfg: JointPretrainingConfig, **kwargs + ) -> "JointPretrainingTask": + return cls(cfg) + + def get_label_dir(self) -> str: + if self.cfg.label_dir is None: + return self.cfg.data + return self.cfg.label_dir + + def load_dataset(self, split: str, epoch=1, **kwargs) -> None: + """ + Create Wav dataset for audio, and Index dataset for phonemized text, + then concatenate them to by fairseq.data.multi_corpus_dataset.MultiCorpusDataset. + """ + if len(split.split("+")) == 1: + speech_splits = split.split(",") + has_text = False + else: + has_text = True + speech_splits, text_splits = split.split("+") + speech_splits = speech_splits.split(",") + speech_splits = [item for item in speech_splits if item != ''] + text_splits = text_splits.split(",") + text_splits = [item for item in text_splits if item != ''] + logging.info(f"text_splits: {text_splits}") + logging.info(f"speech_splits: {speech_splits}") + + ### 1, create a speech dataset using Speech2cDataset (modified from HubertDataset) + dicts = [self.target_dictionary] if self.cfg.fine_tuning else self.dictionaries + pad_list = [dict.pad() for dict in dicts] + eos_list = [dict.eos() for dict in dicts] + procs = [LabelEncoder(dict) for dict in dicts] + if self.cfg.speech_tgt_lang != "": + tgt_lang_idx = _lang_token_index(dicts[0], self.cfg.speech_tgt_lang) + logger.info(f"Will prepend <{tgt_lang_idx}> at the beginning of prev_output_tokens to replace <eos>") + else: + tgt_lang_idx = None + + speech_dataset = None + mono_dataset = None + paired_dataset = None + + speech_datasets = [] + for speech_split in speech_splits: + # hubert v1: pad_audio=True, random_crop=False; + paths = [f"{self.get_label_dir()}/{speech_split}.{l}" for l in self.cfg.labels] + speech_datasets.append( + Speech2cDataset( + f"{self.cfg.data}/{speech_split}.tsv", + sample_rate=self.cfg.sample_rate, + label_paths=paths, + label_rates=self.cfg.label_rate, + pad_list=pad_list, + eos_list=eos_list, + label_processors=procs, + max_keep_sample_size=self.cfg.max_keep_size, + min_keep_sample_size=self.cfg.min_sample_size, + max_sample_size=self.cfg.max_sample_size, + pad_audio=self.cfg.pad_audio, + normalize=self.cfg.normalize, + store_labels=self.cfg.store_labels, + random_crop=self.cfg.random_crop, + single_target=self.cfg.single_target, + tgt_dict=dicts[0], + add_decoder=self.cfg.add_decoder, + fine_tuning=self.cfg.fine_tuning, + tgt_lang_idx=tgt_lang_idx, + tokenizer=self.hubert_tokenizer, + ) + ) + + if len(speech_datasets) > 1: + if 'train' in speech_splits[0] and self.cfg.speech_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + speech_splits, [len(s) for s in speech_datasets], alpha=self.cfg.speech_sampling_alpha + ) + speech_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) + for d, r in zip(speech_datasets, size_ratios) + ] + speech_dataset = ConcatDataset(speech_datasets) + elif len(speech_datasets) == 1: + speech_dataset = speech_datasets[0] + + ### 2, create text mono/paired datasets + logger.info(f"split {split} has unpaired text? {has_text}") + if not has_text: + assert speech_dataset is not None + self.datasets[split] = speech_dataset + return + + text_pairs = [ item for item in text_splits if len(item.split(".")[-1].split("-")) > 1 ] + text_monos = [ item for item in text_splits if len(item.split(".")[-1].split("-")) == 1 ] + logging.info(f"text_monos: {text_monos}") + logging.info(f"text_pairs: {text_pairs}") + + ### 2.1, create text mono dataset using DenoisingDatasetLang + mono_datasets = [] + if len(text_monos) > 0: + for text_split in text_monos: + lang = text_split.split('.')[-2] ## e.g. mono_deduped_filt_sort.de_DE.de_DE + mask_whole_words = ( + get_whole_word_mask(Namespace(**self.text_data_cfg.bpe_tokenizer), self.text_dictionary) + if self.cfg.text_cfg.mask_whole_words and lang in ("en_XX", "de_DE") + else None + ) + + mono_dataset = data_utils.load_indexed_dataset( + f"{self.cfg.text_cfg.text_data}/{text_split}", + self.text_dictionary, + combine=True, + ) + mono_dataset = StripTokenDataset(mono_dataset, self.text_dictionary.eos()) + mono_dataset = maybe_shorten_dataset( + mono_dataset, + "xxxxx", + self.cfg.text_cfg.shorten_data_split_list, + self.cfg.text_cfg.shorten_method, + self.cfg.text_cfg.tokens_per_sample - 2, + self.cfg.text_cfg.seed, + ) + logger.info("loaded {} samples from: {}".format(len(mono_dataset), text_split)) + ### prepend bos and eos to dataset + mono_dataset = PrependTokenDataset(mono_dataset, self.text_dictionary.bos()) + mono_dataset = AppendTokenDataset(mono_dataset, self.text_dictionary.eos()) + mono_dataset = DenoisingDatasetLang( + mono_dataset, + mono_dataset.sizes, + self.text_dictionary, + self.mask_idx, + mask_whole_words, + shuffle=self.cfg.text_cfg.shuffle_instance, + seed=self.cfg.text_cfg.seed, + args=self.cfg.text_cfg, + tgt_lang_idx=_lang_token_index(self.text_dictionary, lang) if self.cfg.text_cfg.prepend_tgt_lang_tag else None, + ) + mono_datasets.append(mono_dataset) + + ### 2.2, create paired text datasets using load_langpair_dataset + paired_datasets = [] + if len(text_pairs) > 0: + for text_pair in text_pairs: + text_split, lp = text_pair.rsplit('.', 1) ## e.g. "mt8corpus.de_DE-en_EN" + src, tgt = lp.split("-") + paired_dataset = load_langpair_dataset( + self.cfg.text_cfg.text_data, + text_split, + src, + self.text_src_dictionary, + tgt, + self.text_dictionary, + combine=True, + dataset_impl=None, + upsample_primary=1, + left_pad_source=False, + left_pad_target=False, + max_source_positions=self.cfg.text_cfg.tokens_per_sample, + max_target_positions=self.cfg.text_cfg.tokens_per_sample, + prepend_bos=False, + load_alignments=False, + append_source_id=True if self.cfg.text_cfg.prepend_tgt_lang_tag else False, + lang_format="<lang:{}>" if self.cfg.text_cfg.prepend_tgt_lang_tag else "[{}]", + ) + if self.cfg.text_cfg.mask_text_ratio > 0: + # add mask + noise_token_id = self.text_src_dictionary.index("<mask>") + paired_dataset = LangPairMaskDataset( + paired_dataset, + src_bos=self.text_src_dictionary.bos(), + src_eos=self.text_src_dictionary.eos(), + noise_id=noise_token_id, + mask_ratio=self.cfg.text_cfg.mask_text_ratio, + ) + paired_datasets.append(paired_dataset) + + + ### 3rd, compose a MultiCorpusDataset + dataset_dict, max_positions_dict, distributions, max_tokens_ratios = self.resample_multi_modality_dataset( + speech_dataset, mono_datasets, paired_datasets, text_monos, text_pairs, epoch=epoch, + ) + self.datasets[split] = MultiCorpusDataset( + dataset_dict, + max_positions=max_positions_dict, + distribution=distributions, + max_tokens_ratio=max_tokens_ratios, + seed=self.cfg.text_cfg.seed, + sort_indices=True, + check_length=False, + ) + + def max_positions(self) -> Tuple[int, int]: + return (sys.maxsize, sys.maxsize) + + def filter_indices_by_size( + self, indices: np.array, *args, **kwargs + ) -> np.array: + return indices + + def get_batch_iterator( + self, + dataset, + max_tokens=None, + max_sentences=None, + max_positions=None, + ignore_invalid_inputs=False, + required_batch_size_multiple=1, + seed=1, + num_shards=1, + shard_id=0, + num_workers=0, + epoch=1, + data_buffer_size=0, + disable_iterator_cache=False, + skip_remainder_batch=False, + grouped_shuffling=False, + update_epoch_batch_itr=False, + ): + """ + A warpper of Faiseq.task.get_batch_iterator, only for pre-training, see + + https://github.com/facebookresearch/fairseq/blob/main/fairseq/tasks/fairseq_task.py + + Returns: + ~fairseq.iterators.EpochBatchIterator: a batched iterator over the + given dataset split + """ + if not isinstance(dataset, MultiCorpusDataset): + return super().get_batch_iterator( + dataset, + max_tokens=max_tokens, + max_sentences=max_sentences, + max_positions=max_positions, + ignore_invalid_inputs=ignore_invalid_inputs, + required_batch_size_multiple=required_batch_size_multiple, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + data_buffer_size=data_buffer_size, + disable_iterator_cache=disable_iterator_cache, + skip_remainder_batch=skip_remainder_batch, + grouped_shuffling=grouped_shuffling, + update_epoch_batch_itr=update_epoch_batch_itr, + ) + + can_reuse_epoch_itr = ( + not disable_iterator_cache + and not update_epoch_batch_itr + and self.can_reuse_epoch_itr(dataset) + ) + if can_reuse_epoch_itr and dataset in self.dataset_to_epoch_iter: + logger.debug("reusing EpochBatchIterator for epoch {}".format(epoch)) + return self.dataset_to_epoch_iter[dataset] + + assert isinstance(dataset, FairseqDataset) + + # initialize the dataset with the correct starting epoch + dataset.set_epoch(epoch) + + # get indices ordered by example size + with data_utils.numpy_seed(seed): + indices = dataset.ordered_indices() + + # create mini-batches with given size constraints + batch_sampler = dataset.get_batch_sampler( + indices, + num_shards, + seed, + max_tokens=max_tokens, + max_sentences=max_sentences, + required_batch_size_multiple=required_batch_size_multiple, + split_modality_batch=self.cfg.split_modality_batch, + ) + + # return a reusable, sharded iterator + epoch_iter = iterators.EpochBatchIterator( + dataset=dataset, + collate_fn=dataset.collater, + batch_sampler=batch_sampler, + seed=seed, + num_shards=num_shards, + shard_id=shard_id, + num_workers=num_workers, + epoch=epoch, + buffer_size=data_buffer_size, + skip_remainder_batch=skip_remainder_batch, + disable_shuffling=True, + grouped_shuffling=grouped_shuffling, + ) + + if can_reuse_epoch_itr: + self.dataset_to_epoch_iter[dataset] = epoch_iter + + return epoch_iter + + @classmethod + def _get_size_ratios(cls, ids: List[str], sizes: List[int], alpha: float = 1.0): + """Size ratios for temperature-based sampling + (https://arxiv.org/abs/1907.05019)""" + _sizes = np.array(sizes) + prob = _sizes / _sizes.sum() + smoothed_prob = prob ** alpha + smoothed_prob = smoothed_prob / smoothed_prob.sum() + size_ratio = (smoothed_prob * _sizes.sum()) / _sizes + + o_str = str({_i: f"{prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"original sampling probability: {o_str}") + p_str = str({_i: f"{smoothed_prob[i]:.3f}" for i, _i in enumerate(ids)}) + logger.info(f"balanced sampling probability: {p_str}") + sr_str = str({_id: f"{size_ratio[i]:.3f}" for i, _id in enumerate(ids)}) + logger.info(f"balanced sampling size ratio: {sr_str}") + return size_ratio.tolist() + + def resample_multi_modality_dataset(self, speech_dataset, mono_datasets, paired_datasets, mono_splits, paired_splits, epoch=1, train=True): + assert len(mono_datasets+paired_datasets) > 0, f"No text data loaded!" + + text_datasets = mono_datasets+paired_datasets + if len(text_datasets) > 1 and self.cfg.text_sampling_alpha != 1.0: + size_ratios = self._get_size_ratios( + mono_splits + paired_splits, [len(s) for s in mono_datasets + paired_datasets], alpha=self.cfg.text_sampling_alpha + ) + text_datasets = [ + ResamplingDataset( + d, size_ratio=r, seed=0, epoch=epoch, replace=(r >= 1.0) + ) + for d, r in zip(text_datasets, size_ratios) + ] + + mono_datasets = text_datasets[:len(mono_datasets)] + paired_datasets = text_datasets[len(mono_datasets):] + dataset_list = [speech_dataset] + for datasets in [mono_datasets, paired_datasets]: + if len(datasets) > 0: + dataset_list.append(ConcatDataset(datasets)) + else: + dataset_list.append(None) + + ### match speech/text datasets according to modality + dataset_dict = OrderedDict((name, d) for name, d in zip(["speech", "text_mono", "text_paired"], dataset_list) if d is not None) + max_positions_dict = OrderedDict((name, None) for name in dataset_dict.keys()) + if "text_paired" in dataset_dict: + max_positions_dict["text_paired"] = (self.cfg.text_cfg.tokens_per_sample, self.cfg.text_cfg.tokens_per_sample) + dataset_lens = np.array([len(dataset) for dataset in dataset_dict.values()]) + dataset_avg_sample_lens = np.array([ + sum([dataset.num_tokens(i) for i in np.random.randint(low=0, high=len(dataset), size=10000)]) / 10000.0 + for dataset in dataset_dict.values() + ]) + max_tokens_ratios = [1.0 / 320 / self.cfg.text_cfg.text_maxtokens_ratio] * len(dataset_dict) + + if not "speech" in dataset_dict: + distributions = [l / sum(dataset_lens) for l in dataset_lens] + else: + ## we just keep the batches of speech and non-speech the same + first_ratio = dataset_lens[0] / sum(dataset_lens) + distributions = [max_tokens_ratios[0] * dataset_avg_sample_lens[0] / l for l in dataset_avg_sample_lens] + text_total = sum(dataset_lens[1:]) + distributions = [1.2 * d * n / text_total for d, n in zip(distributions, dataset_lens)] + max_tokens_ratios[0] = 1.0 + distributions[0] = 1.0 + distributions = [first_ratio * d for d in distributions] + + logging.info(f"Number samples of datasets is {dataset_lens}") + logging.info(f"Avg sample length of datasets is {dataset_avg_sample_lens}") + logging.info(f"Sampling distributions is {distributions}") + logging.info(f"Maxtokens ratio is {max_tokens_ratios}") + return dataset_dict, max_positions_dict, distributions, max_tokens_ratios + + def build_tokenizer(self, cfg=None): + logger.info(f"tokenizer: {self.cfg.hubert_tokenizer}") + if self.cfg.hubert_tokenizer != "none": + return encoders.build_bpe(Namespace(**{"bpe": self.cfg.hubert_tokenizer, "sentencepiece_model": self.cfg.sp_path})) + else: + return None diff --git a/YiTrans/yitrans_iwslt22/tasks/iwslt_translation_from_pretrain.py b/YiTrans/yitrans_iwslt22/tasks/iwslt_translation_from_pretrain.py new file mode 100644 index 0000000..72e0d95 --- /dev/null +++ b/YiTrans/yitrans_iwslt22/tasks/iwslt_translation_from_pretrain.py @@ -0,0 +1,252 @@ +# -------------------------------------------------------- +# The YiTrans End-to-End Speech Translation System for IWSLT 2022 Offline Shared Task (https://arxiv.org/abs/2206.05777) +# Github source: https://github.com/microsoft/SpeechT5/tree/main/YiTrans +# Copyright (c) 2022 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Based on fairseq code bases +# https://github.com/facebookresearch/fairseq +# -------------------------------------------------------- +""" + Modified from + https://github.com/facebookresearch/fairseq/blob/main/fairseq/tasks/translation.py + +""" + +import torch +import logging +from dataclasses import dataclass, field +from typing import List, Optional, NamedTuple + +from fairseq import utils +from fairseq.data import LanguagePairDataset, TransformEosLangPairDataset, FairseqDataset +from fairseq.tasks import register_task +from fairseq.tasks.translation import TranslationTask, TranslationConfig + +from yitrans_iwslt22.data.concat_dataset import ConcatDataset +from yitrans_iwslt22.data.load_langpair_dataset import load_langpair_dataset + +logger = logging.getLogger(__name__) + + + +class LangPairStripDataset(FairseqDataset): + def __init__( + self, + dataset: LanguagePairDataset, + src_eos: int, + src_bos: Optional[int] = None, + noise_id: Optional[int] = -1, + mask_ratio: Optional[float] = 0, + mask_type: Optional[str] = "random", + ): + self.dataset = dataset + self.src_eos = src_eos + self.src_bos = src_bos + self.noise_id = noise_id + self.mask_ratio = mask_ratio + self.mask_type = mask_type + assert mask_type in ("random", "tail") + + @property + def src_sizes(self): + return self.dataset.src_sizes + + @property + def tgt_sizes(self): + return self.dataset.tgt_sizes + + @property + def sizes(self): + # dataset.sizes can be a dynamically computed sizes: + return self.dataset.sizes + + def get_batch_shapes(self): + return self.dataset.buckets + + def num_tokens_vec(self, indices): + return self.dataset.num_tokens_vec(indices) + + def __len__(self): + return len(self.dataset) + + def num_tokens(self, index): + return self.dataset.num_tokens(index) + + def size(self, index): + return self.dataset.size(index) + + def ordered_indices(self): + return self.dataset.ordered_indices() + + @property + def supports_prefetch(self): + return getattr(self.dataset, "supports_prefetch", False) + + def prefetch(self, indices): + return self.dataset.prefetch(indices) + + def mask_src_tokens(self, sample): + src_item = sample["source"] + mask = None + if self.mask_type == "random": + mask = torch.rand(len(src_item)).le(self.mask_ratio) + else: + mask = torch.ones(len(src_item)) + mask[: int(len(src_item) * (1 - self.mask_ratio))] = 0 + mask = mask.eq(1) + mask[-1] = False + if src_item[0] == self.src_bos: + mask[0] = False + if src_item[-2] == self.src_eos: + mask[-2] = False + no_mask = ~mask + mask_src_item = src_item[no_mask] + smp = sample + smp["source"] = mask_src_item + print(f"{len(src_item)}: {src_item}") + print(f"{len(mask_src_item)}: {mask_src_item}") + return smp + + def __getitem__(self, index): + sample = self.dataset[index] + if self.mask_ratio > 0: + sample = self.mask_src_tokens(sample) + return sample + + def collater(self, samples, pad_to_length=None): + return self.dataset.collater(samples, pad_to_length=pad_to_length) + + +@dataclass +class AddTranslationConfig(TranslationConfig): + langs: str = "" + prepend_bos: bool = False + normalize: bool = False + append_source_id: bool = False + mask_text_ratio: float = 0 + ### ShrinkingDataset related, not used + shrink_start_epoch: int = 0 + shrink_end_epoch: int = 0 + shrink_start_ratio: float = 1.0 + shrink_end_ratio: float = 1.0 + + +@register_task("iwslt_translation_from_pretrained", dataclass=AddTranslationConfig) +class TranslationFromPretrainedTask(TranslationTask): + args: AddTranslationConfig + + def __init__(self, args: AddTranslationConfig, src_dict, tgt_dict): + super().__init__(args, src_dict, tgt_dict) + self.args = args + self.langs = args.langs.split(",") + for d in [src_dict, tgt_dict]: + for l in self.langs: + d.add_symbol("[{}]".format(l)) + d.add_symbol("<mask>") + + + def load_dataset(self, split, epoch=1, combine=False, **kwargs): + """Load a given dataset split. + + Args: + split (str): name of the split (e.g., train, valid, test) + """ + paths = utils.split_paths(self.args.data) + assert len(paths) > 0 + data_path = paths[(epoch - 1) % len(paths)] + + # infer langcode + src, tgt = self.args.source_lang, self.args.target_lang + + paired_datasets = [] + for sub_split in split.split(","): + paired_dataset= load_langpair_dataset( + data_path, + sub_split, + src, + self.src_dict, + tgt, + self.tgt_dict, + combine=combine, + dataset_impl=self.args.dataset_impl, + upsample_primary=self.args.upsample_primary, + left_pad_source=self.args.left_pad_source, + left_pad_target=self.args.left_pad_target, + max_source_positions=getattr(self.args, "max_source_positions", 1024), + max_target_positions=getattr(self.args, "max_target_positions", 1024), + load_alignments=self.args.load_alignments, + prepend_bos=getattr(self.args, "prepend_bos", False), + append_source_id=getattr(self.args, "append_source_id", False), + ) + if not split.startswith("valid") and getattr(self.args, "mask_text_ratio", 0) > 0 and not sub_split.startswith("asr_"): + mask_text_ratio = getattr(self.args, "mask_text_ratio", 0) + noise_token_id = self.src_dict.index("<mask>") + logger.info(f"Masking {sub_split} at a probability: {mask_text_ratio}") + paired_dataset = LangPairStripDataset( + paired_dataset, + src_bos=self.src_dict.bos(), + src_eos=self.src_dict.eos(), + noise_id=noise_token_id, + mask_ratio=mask_text_ratio, + ) + paired_datasets.append(paired_dataset) + paired_dataset = paired_datasets[0] if len(paired_datasets) == 1 else ConcatDataset(paired_datasets, 1) + + if getattr(self.args, "append_source_id", False): + logger.info(f"Appending <lang-id> to the end of samples") + self.datasets[split] = paired_dataset + else: + logger.info(f"Replacing <eos> with <lang-id> for prev_output_tokens") + self.datasets[split] = TransformEosLangPairDataset( + paired_dataset, + src_eos=self.src_dict.eos(), + tgt_bos=self.tgt_dict.eos(), # 'prev_output_tokens' starts with eos + new_tgt_bos=self.tgt_dict.index("[{}]".format(tgt)), + ) + + def build_generator(self, models, args, **unused): + if getattr(args, "score_reference", False): + from fairseq.sequence_scorer import SequenceScorer + + return SequenceScorer( + self.target_dictionary, + eos=self.tgt_dict.index("[{}]".format(self.args.target_lang)), + ) + else: + from yitrans_iwslt22.sequence_generator import SequenceGenerator + + return SequenceGenerator( + models, + self.target_dictionary, + beam_size=getattr(args, "beam", 5), + max_len_a=getattr(args, "max_len_a", 0), + max_len_b=getattr(args, "max_len_b", 200), + min_len=getattr(args, "min_len", 1), + normalize_scores=(not getattr(args, "unnormalized", False)), + len_penalty=getattr(args, "lenpen", 1), + unk_penalty=getattr(args, "unkpen", 0), + temperature=getattr(args, "temperature", 1.0), + match_source_len=getattr(args, "match_source_len", False), + no_repeat_ngram_size=getattr(args, "no_repeat_ngram_size", 0), + eos=self.tgt_dict.index("[{}]".format(self.args.target_lang)) if getattr(self.args, "append_source_id", False) else None, + bos=None if getattr(self.args, "append_source_id", False) else self.tgt_dict.index("[{}]".format(self.args.target_lang)) + ) + + def build_dataset_for_inference(self, src_tokens, src_lengths, constraints=None): + if getattr(self.args, "append_source_id", False): + src_lang_id = self.source_dictionary.index("[{}]".format(self.args.source_lang)) + source_tokens = [] + for s_t in src_tokens: + s_t = torch.cat([s_t, s_t.new(1).fill_(src_lang_id)]) + source_tokens.append(s_t) + else: + source_tokens = src_tokens + + dataset = LanguagePairDataset( + source_tokens, + src_lengths, + self.source_dictionary, + tgt_dict=self.target_dictionary, + constraints=constraints, + ) + return dataset diff --git a/asr_train.sh b/asr_train.sh new file mode 100644 index 0000000..341c46f --- /dev/null +++ b/asr_train.sh @@ -0,0 +1,187 @@ +#!/bin/bash + +# 初始化默认值 +TRAIN_SET="train" +VALID_SET="valid" + +# 定义帮助函数 +usage() { + cat <<EOF +Usage: + $(basename "$0") [options] + +Options: + -h - This help + --dcu <number> - The number of dcu + --log <log directory> - The log file of train + --td <train dir> - The directory of (train.tsv, valid.tsv) + --res <result dir> - The directory of (xxx.pt) + --lab <label dir> - The directory of (train.txt, valid.txt) + --token <tokenizer path> - The path of BPE_TOKENIZER + --speecht5 <speecht5 path> - The path of speecht5 + --checkpoint <checkpoint path> - The path of speecht5_base.pt + --epoch - epoch of train +EOF +} + +# 主处理逻辑 +process_long_option() { + local arg="$1" + local key="${arg%%=*}" + local value="${arg#*=}" + + if [[ "$key" == "$arg" ]]; then + # 如果没有等号,则假定下一个参数是值 + value="$2" + if [[ -z "$value" || "$value" == -* ]]; then + echo "Option $key requires a value." + usage + exit 1 + fi + # 移除已处理的值 + shift + fi + + case "$key" in + --dcu) + dcu="$value" + ;; + --log) + logdir="$value" + ;; + --td) + DATA_ROOT="$value" + ;; + --res) + SAVE_DIR="$value" + ;; + --lab) + LABEL_DIR="$value" + ;; + --token) + BPE_TOKENIZER="$value" + ;; + --speecht5) + USER_DIR="$value" + ;; + --checkpoint) + PT_CHECKPOINT_PATH="$value" + ;; + --epoch) + epoch="$value" + ;; + -h) + usage + exit 0 + ;; + *) + echo "Unknown option: $key" + usage + exit 1 + ;; + esac +} + +# 解析命令行参数 +while [[ $# -gt 0 ]]; do + case "$1" in + --*) + # 处理长选项及其值 + process_long_option "$1" "$2" + # 移除已处理的选项 + shift 2 + ;; + -h) + usage + exit 0 + ;; + -*) + echo "Invalid option: $1" + usage + exit 1 + ;; + *) + break + ;; + esac +done + +# 创建日志目录 +mkdir -p "$logdir" + +# 创建保存目录 +mkdir -p "$SAVE_DIR" + +# 日志文件 +all_log="$logdir/all-${dcu}-log.log" +benchmark_log="$logdir/train-log.log" + +# 输出解析结果(仅为演示) +echo "dcu: $dcu" +echo "log: $logdir" +echo "DATA_ROOT: $DATA_ROOT" +echo "SAVE_DIR: $SAVE_DIR" +echo "LABEL_DIR: $LABEL_DIR" +echo "BPE_TOKENIZER: $BPE_TOKENIZER" +echo "USER_DIR: $USER_DIR" +echo "PT_CHECKPOINT_PATH: $PT_CHECKPOINT_PATH" +echo "epoch: $epoch" + +# 调用 fairseq-train 并传递参数 +fairseq-train "$DATA_ROOT" \ + --save-dir "$SAVE_DIR" \ + --tensorboard-logdir "$SAVE_DIR" \ + --train-subset "$TRAIN_SET" \ + --valid-subset "$VALID_SET" \ + --hubert-label-dir "$LABEL_DIR" \ + --distributed-world-size "$dcu" \ + --distributed-port 0 \ + --ddp-backend legacy_ddp \ + --user-dir "$USER_DIR" \ + --log-format json \ + --seed 1 \ + \ + --task speecht5 \ + --t5-task s2t \ + --sample-rate 16000 \ + --num-workers 0 \ + --max-tokens 1600000 \ + --update-freq 2 \ + --bpe-tokenizer "$BPE_TOKENIZER" \ + \ + --criterion speecht5 \ + --report-accuracy \ + --zero-infinity \ + --ce-weight 0.5 \ + --ctc-weight 0.5 \ + --sentence-avg \ + \ + --optimizer adam \ + --adam-betas "(0.9, 0.98)" \ + --adam-eps 1e-08 \ + --weight-decay 0.1 \ + --clip-norm 25.0 \ + --lr 0.00006 \ + --lr-scheduler tri_stage \ + --phase-ratio "[0.1, 0.4, 0.5]" \ + --final-lr-scale 0.05 \ + \ + --max-epoch "$epoch" \ + --max-update 80000 \ + --max-text-positions 600 \ + --required-batch-size-multiple 1 \ + --save-interval-updates 3000 \ + --skip-invalid-size-inputs-valid-test \ + \ + --arch t5_transformer_base_asr \ + --share-input-output-embed \ + --find-unused-parameters \ + --bert-init \ + --relative-position-embedding \ + --freeze-encoder-updates 13000 \ + \ + --keep-last-epochs 10 \ + --feature-grad-mult 1.0 \ + --best-checkpoint-metric s2t_accuracy \ + --maximize-best-checkpoint-metric \ + --finetune-from-model "$PT_CHECKPOINT_PATH" 2>&1 | tee "$all_log" \ No newline at end of file diff --git a/calc4vc.py b/calc4vc.py new file mode 100644 index 0000000..3592533 --- /dev/null +++ b/calc4vc.py @@ -0,0 +1,40 @@ +import numpy as np +import librosa +from scipy.spatial.distance import euclidean +from jiwer import wer + +def extract_mfccs(signal, sample_rate): + mfccs = librosa.feature.mfcc(y=signal, sr=sample_rate, n_mfcc=13) + return mfccs + +def calculate_mcd(original_mfccs, converted_mfccs): + distances = [euclidean(original_mfccs[:, k], converted_mfccs[:, k]) for k in range(original_mfccs.shape[1])] + mcd = np.sqrt(np.mean([d**2 for d in distances])) + return mcd + +def calculate_wer(reference_text, hypothesis_text): + return wer(reference_text, hypothesis_text) + +# 示例音频文件 +original_audio_file = 'original.wav' +converted_audio_file = 'converted.wav' + +# 加载音频 +original_signal, sample_rate = librosa.load(original_audio_file, sr=None) +converted_signal, _ = librosa.load(converted_audio_file, sr=None) + +# 提取MFCCs +original_mfccs = extract_mfccs(original_signal, sample_rate) +converted_mfccs = extract_mfccs(converted_signal, sample_rate) + +# 计算MCD +mcd = calculate_mcd(original_mfccs, converted_mfccs) +print(f"MCD: {mcd}") + +# 假设我们有参考文本和转换后的文本 +reference_text = "This is a reference text." +hypothesis_text = "This is a reference text." + +# 计算WER +wer_value = calculate_wer(reference_text, hypothesis_text) +print(f"WER: {wer_value * 100}%") \ No newline at end of file diff --git a/dict.txt b/dict.txt new file mode 100644 index 0000000..61ebbfe --- /dev/null +++ b/dict.txt @@ -0,0 +1,75 @@ +▁ 1 +e 1 +t 1 +a 1 +o 1 +n 1 +i 1 +h 1 +s 1 +r 1 +d 1 +l 1 +u 1 +c 1 +m 1 +f 1 +w 1 +g 1 +y 1 +, 1 +p 1 +b 1 +. 1 +v 1 +k 1 +" 1 +I 1 +' 1 +T 1 +A 1 +S 1 +H 1 +; 1 +x 1 +W 1 +- 1 +B 1 +? 1 +C 1 +M 1 +! 1 +q 1 +j 1 +E 1 +N 1 +P 1 +O 1 +D 1 +L 1 +G 1 +R 1 +F 1 +Y 1 +z 1 +J 1 +: 1 +K 1 +U 1 +V 1 +) 1 +( 1 +Q 1 +Z 1 +] 1 +[ 1 +X 1 +— 1 +/ 1 +æ 1 +é 1 +{ 1 +} 1 +ê 1 +œ 1 +̄ 1 diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..25729b2 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,2 @@ +FROM image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-centos7.6-dtk24.04-py310 +RUN source /opt/dtk/env.sh \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb920f3003e8037c3692f0781aa19693c9e1c36 GIT binary patch literal 70013 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 IOt4A+0lFza`v3p{ literal 0 HcmV?d00001 diff --git a/images/algorithm.png b/images/algorithm.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd2f8bef07dc5252c8c6011354d5d01da694752 GIT binary patch literal 128512 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 P==d(FC{ZhB6#V}Hi_P7U literal 0 HcmV?d00001 diff --git a/images/model_architecture.png b/images/model_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb62dd6ac646f3420ec4f7570b5a819f8649c0b GIT binary patch literal 102256 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 Q-Od06p00i_>zopr06yYCfdBvi literal 0 HcmV?d00001 diff --git a/libri_labels.py b/libri_labels.py new file mode 100644 index 0000000..277ff2d --- /dev/null +++ b/libri_labels.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +""" +Helper script to pre-compute embeddings for a flashlight (previously called wav2letter++) dataset +""" + +import argparse +import os + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("tsv") + parser.add_argument("--output-dir", required=True) + parser.add_argument("--output-name", required=True) + args = parser.parse_args() + + os.makedirs(args.output_dir, exist_ok=True) + + transcriptions = {} + + with open(args.tsv, "r") as tsv, open( + os.path.join(args.output_dir, args.output_name + ".ltr"), "w" + ) as ltr_out, open( + os.path.join(args.output_dir, args.output_name + ".wrd"), "w" + ) as wrd_out: + root = next(tsv).strip() + for line in tsv: + line = line.strip() + dir = os.path.dirname(line) + if dir not in transcriptions: + parts = dir.split(os.path.sep) + trans_path = f"{parts[-2]}-{parts[-1]}.trans.txt" + path = os.path.join(root, dir, trans_path) + assert os.path.exists(path) + texts = {} + with open(path, "r") as trans_f: + for tline in trans_f: + items = tline.strip().split() + texts[items[0]] = " ".join(items[1:]) + transcriptions[dir] = texts + part = os.path.basename(line).split(".")[0] + assert part in transcriptions[dir] + print(transcriptions[dir][part], file=wrd_out) + print( + " ".join(list(transcriptions[dir][part].replace(" ", "|"))) + " |", + file=ltr_out, + ) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/librispeech_asr_demo.py b/librispeech_asr_demo.py new file mode 100644 index 0000000..01ed586 --- /dev/null +++ b/librispeech_asr_demo.py @@ -0,0 +1,137 @@ +# coding=utf-8 +# Copyright 2021 The TensorFlow Datasets Authors and the HuggingFace Datasets Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as: python3 +"""Librispeech automatic speech recognition dataset.""" + +from __future__ import absolute_import, division, print_function + +import glob +import os + +import datasets + + +_CITATION = """\ +@inproceedings{panayotov2015librispeech, + title={Librispeech: an ASR corpus based on public domain audio books}, + author={Panayotov, Vassil and Chen, Guoguo and Povey, Daniel and Khudanpur, Sanjeev}, + booktitle={Acoustics, Speech and Signal Processing (ICASSP), 2015 IEEE International Conference on}, + pages={5206--5210}, + year={2015}, + organization={IEEE} +} +""" + +_DESCRIPTION = """\ +LibriSpeech is a corpus of approximately 1000 hours of read English speech with sampling rate of 16 kHz, +prepared by Vassil Panayotov with the assistance of Daniel Povey. The data is derived from read +audiobooks from the LibriVox project, and has been carefully segmented and aligned. + +Note that in order to limit the required storage for preparing this dataset, the audio +is stored in the .flac format and is not converted to a float32 array. To convert, the audio +file to a float32 array, please make use of the `.map()` function as follows: + + +```python +import soundfile as sf + +def map_to_array(batch): + speech_array, _ = sf.read(batch["file"]) + batch["speech"] = speech_array + return batch + +dataset = dataset.map(map_to_array, remove_columns=["file"]) +``` +""" + +_URL = "http://www.openslr.org/12" +_DL_URL = "https://s3.amazonaws.com/datasets.huggingface.co/librispeech_asr/2.1.0/" +_DL_URL = "https://s3.amazonaws.com/datasets.huggingface.co/librispeech_asr/2.1.0/" + +_DL_URLS = { + "clean": { + "dev": _DL_URL + "dev_clean.tar.gz", + } +} + + +class LibrispeechASRConfig(datasets.BuilderConfig): + """BuilderConfig for LibriSpeechASR.""" + + def __init__(self, **kwargs): + """ + Args: + data_dir: `string`, the path to the folder containing the files in the + downloaded .tar + citation: `string`, citation for the data set + url: `string`, url for information about the data set + **kwargs: keyword arguments forwarded to super. + """ + super(LibrispeechASRConfig, self).__init__(version=datasets.Version("2.1.0", ""), **kwargs) + + +class LibrispeechASR(datasets.GeneratorBasedBuilder): + """Librispeech dataset.""" + + BUILDER_CONFIGS = [ + LibrispeechASRConfig(name="clean", description="'Clean' speech."), + LibrispeechASRConfig(name="other", description="'Other', more challenging, speech."), + ] + + def _info(self): + return datasets.DatasetInfo( + description=_DESCRIPTION, + features=datasets.Features( + { + "file": datasets.Value("string"), + "audio": datasets.features.Audio(sampling_rate=16_000), + "text": datasets.Value("string"), + "speaker_id": datasets.Value("int64"), + "chapter_id": datasets.Value("int64"), + "id": datasets.Value("string"), + } + ), + supervised_keys=("speech", "text"), + homepage=_URL, + citation=_CITATION, + ) + + def _split_generators(self, dl_manager): + archive_path = dl_manager.download_and_extract(_DL_URLS[self.config.name]) + return [ + datasets.SplitGenerator(name=datasets.Split.VALIDATION, gen_kwargs={"archive_path": archive_path["dev"], "split_name": f"dev_{self.config.name}"}), + ] + + def _generate_examples(self, archive_path, split_name): + """Generate examples from a Librispeech archive_path.""" + transcripts_glob = os.path.join(archive_path, split_name, "*/*/*.txt") + for transcript_file in sorted(glob.glob(transcripts_glob)): + path = os.path.dirname(transcript_file) + with open(os.path.join(path, transcript_file)) as f: + for line in f: + line = line.strip() + key, transcript = line.split(" ", 1) + audio_file = f"{key}.flac" + speaker_id, chapter_id = [int(el) for el in key.split("-")[:2]] + example = { + "id": key, + "speaker_id": speaker_id, + "chapter_id": chapter_id, + "file": os.path.join(path, audio_file), + "audio": os.path.join(path, audio_file), + "text": transcript, + } + yield key, example diff --git a/model.properties b/model.properties new file mode 100644 index 0000000..fc102f7 --- /dev/null +++ b/model.properties @@ -0,0 +1,10 @@ +#模型编码 +modelCode=870 +# 模型名称 +modelName=speecht5_pytorch +# 模型描述 +modelDescription=speecht5是微软推出的语音模型,支持文本到语音,语音到语音,语音到文本的多个模态的推理。 +# 应用场景(多个标签以英文逗号分割) +appScenario=推理,语音识别,人声变声,语音合成,金融,通信,广媒 +# 框架类型(多个标签以英文逗号分割) +frameType=PyTorch \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8c106b1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +bitarray==2.9.2 +scikit-learn==1.5.1 +espnet==202402 +soundfile==0.12.1 +numpy==1.23.5 \ No newline at end of file diff --git a/test_asr.sh b/test_asr.sh new file mode 100644 index 0000000..18a7246 --- /dev/null +++ b/test_asr.sh @@ -0,0 +1,29 @@ +CHECKPOINT_PATH=/public/home/changhl/dataset/speecht5_base_asr.pt +DATA_ROOT=/public/home/changhl/py_project/speecht5_pytorch/valid +SUBSET=valid +BPE_TOKENIZER=/public/home/changhl/py_project/speecht5_pytorch/speecht5_asr/spm_char.model +LABEL_DIR=/public/home/changhl/py_project/speecht5_pytorch/valid +USER_DIR=/public/home/changhl/py_project/SpeechT5/SpeechT5/speecht5 +BEAM=4 +MAX_TOKENS=1600000 +CTC_WEIGHT=0.5 +LM_WEIGHT=0.5 +LM_PATH=/public/home/changhl/dataset/t5_transformer_lm.pt + +fairseq-generate ${DATA_ROOT} \ + --gen-subset ${SUBSET} \ + --bpe-tokenizer ${BPE_TOKENIZER} \ + --user-dir ${USER_DIR} \ + --task speecht5 \ + --t5-task s2t \ + --path ${CHECKPOINT_PATH} \ + --hubert-label-dir ${LABEL_DIR} \ + --ctc-weight ${CTC_WEIGHT} \ + --lm-weight ${LM_WEIGHT} \ + --lm-path ${LM_PATH} \ + --max-tokens ${MAX_TOKENS} \ + --beam ${BEAM} \ + --scoring wer \ + --max-len-a 0 \ + --max-len-b 620 \ + --sample-rate 16000 \ No newline at end of file -- GitLab

    G;o=@i=Z1O(oM{()(WV07m|8S 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
    Dsm#==2=JVe9%Q^g}CeTlTP7LK6+ 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
    ~tsS-O63SlpbwBZrA;Zr=t|RO>A`z9PQ` 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